./0000755000004100000410000000000013246301624011244 5ustar www-datawww-data./CMakeLists.txt0000644000004100000410000001643213246301623014011 0ustar www-datawww-data# # Main CMakeLists.txt for compiz # project (compiz C CXX) set (CMAKE_MODULE_PATH_ORIG ${CMAKE_MODULE_PATH}) set (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CTest) include (GNUInstallDirs) set (MEMORYCHECK_COMMAND_OPTIONS --trace-children=yes) set (MEMORYCHECK_SUPPRESSIONS_FILE ${CMAKE_SOURCE_DIR}/tests/experimental-memcheck/compiz.supp CACHE FILEPATH "" FORCE) include (Dart) # Common compiz CMake macros & functions. include (CompizCommon) # Packaging-specific CMake macros & functions. include (CompizPackage) # GSettings schema recompilation include (CompizGSettings) # Google Test and Xorg-GTest include (XorgGTest) include (cmake/base.cmake) # Check if specific function is present in library. include (CheckFunctionExists) enable_testing() # Import macro for doing coverage reporting include(EnableCoverageReport) ##################################################################### # Enable code coverage calculation with gcov/gcovr/lcov # Usage: # * Switch build type to coverage (use ccmake or cmake-gui) # * Invoke make, make test, make coverage # * Find html report in subdir coveragereport # * Find xml report feasible for jenkins in coverage.xml ##################################################################### IF(CMAKE_BUILD_TYPE MATCHES [cC][oO][vV][eE][rR][aA][gG][eE]) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage -fprofile-arcs" ) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage -fprofile-arcs" ) SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -ftest-coverage -fprofile-arcs" ) SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -ftest-coverage -fprofile-arcs" ) ENDIF(CMAKE_BUILD_TYPE MATCHES [cC][oO][vV][eE][rR][aA][gG][eE]) #set (CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRe" CACHE INTERNAL "" FORCE) #if (NOT CMAKE_BUILD_TYPE) # set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) #endif (NOT CMAKE_BUILD_TYPE) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) set (DECOR_INTERFACE_VERSION 20110504) if (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} CACHE PATH "prefix") set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") set (libdir ${CMAKE_INSTALL_FULL_LIBDIR} CACHE PATH "libdir") set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR} CACHE PATH "includedir") set (datadir ${CMAKE_INSTALL_FULL_DATAROOTDIR} CACHE PATH "datadir") else (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} ) set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin ) set (libdir ${CMAKE_INSTALL_FULL_LIBDIR} ) set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR} ) set (datadir ${CMAKE_INSTALL_FULL_DATAROOTDIR} ) endif (COMPIZ_PACKAGING_ENABLED) set (compiz_plugindir ${libdir}/compiz) set (compiz_sharedir ${datadir}/compiz/) set (compiz_metadatadir ${datadir}/compiz) set (COMPIZ_I18N_DIR ${CMAKE_SOURCE_DIR}/po) # Force re-generation of uninstall script compiz_set (_compiz_uninstall_rule_created FALSE) # Don't allow subdirectories to add schema recompile rule set_property (GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE TRUE) set_property (GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE TRUE) # Translation set (ALL_LINGUAS af ar bg bn bn_IN bs ca cs cy da de el en_GB en_US es eu et fi fr gl gu he hi hr hu id it ja ka km ko lo lt mk mr nb nl or pa pl pt pt_BR ro ru sk sl sr sv ta tr uk vi xh zh_CN zh_TW zu) set (GETTEXT_PACKAGE compiz) set (COMPIZ_REQUIRES x11 xext xdamage xcomposite xcursor x11-xcb xrandr xinerama xi ice sm libxml-2.0 libxslt glib-2.0 gio-2.0 glibmm-2.4 "libstartup-notification-1.0 >= 0.7" ) set (DECORATION_REQUIRES "xrender >= 0.9.3") compiz_pkg_check_modules (COMPIZ REQUIRED ${COMPIZ_REQUIRES}) compiz_pkg_check_modules (LIBDECORATION REQUIRED ${DECORATION_REQUIRES}) include (CompizDefaults) set (_compiz_package_string "Compiz ${VERSION}") set (_compiz_package "Compiz") compiz_configure_file (${compiz_SOURCE_DIR}/config.h.core.in ${compiz_BINARY_DIR}/generated/config.h) compiz_configure_file ( ${CMAKE_SOURCE_DIR}/compiz.pc.in ${CMAKE_BINARY_DIR}/compiz.pc COMPIZ_REQUIRES COMPIZ_CFLAGS ) install ( FILES ${CMAKE_BINARY_DIR}/compiz.pc DESTINATION ${libdir}/pkgconfig ) set (COMPIZ_INTERNAL_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/timer/include ${CMAKE_CURRENT_SOURCE_DIR}/src/string/include ${CMAKE_CURRENT_SOURCE_DIR}/src/pluginclasshandler/include ${CMAKE_CURRENT_SOURCE_DIR}/src/point/include ${CMAKE_CURRENT_SOURCE_DIR}/src/rect/include ${CMAKE_CURRENT_SOURCE_DIR}/src/servergrab/include ${CMAKE_CURRENT_SOURCE_DIR}/src/region/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/geometry/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/geometry-saver/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/extents/include ${CMAKE_CURRENT_SOURCE_DIR}/src/window/constrainment/include ${CMAKE_CURRENT_SOURCE_DIR}/src/logmessage/include) if (COMPIZ_BUILD_TESTING) include (GoogleTest) if (GOOGLE_TEST_AND_MOCK_FOUND) if (BUILD_XORG_GTEST) find_package (XorgGTest) set (COMPIZ_XORG_GTEST_DIR ${CMAKE_BINARY_DIR}/__xorg_gtest CACHE PATH "Path to Xorg GTest build dir" FORCE) set (COMPIZ_XORG_GTEST_WRAPPER ${COMPIZ_XORG_GTEST_DIR}/xorg_gtest_wrapper CACHE PATH "Path to Xorg GTest wrapper" FORCE) if (XORG_GTEST_FOUND) build_xorg_gtest_locally (${CMAKE_BINARY_DIR}/__xorg_gtest) else (XORG_GTEST_FOUND) set (BUILD_XORG_GTEST FALSE) endif (XORG_GTEST_FOUND) endif (BUILD_XORG_GTEST) else (GOOGLE_TEST_AND_MOCK_FOUND) set (COMPIZ_BUILD_TESTING OFF CACHE BOOL "" FORCE) set (BUILD_XORG_GTEST OFF CACHE BOOL "" FORCE) endif (GOOGLE_TEST_AND_MOCK_FOUND) else (COMPIZ_BUILD_TESTING) set (BUILD_XORG_GTEST OFF CACHE BOOL "" FORCE) endif (COMPIZ_BUILD_TESTING) # Add the rest of compiz add_subdirectory (cmake) add_subdirectory (include) add_subdirectory (images) add_subdirectory (libdecoration) add_subdirectory (gtk) add_subdirectory (kde) add_subdirectory (po) add_subdirectory (metadata) add_subdirectory (src) add_subdirectory (compizconfig) add_subdirectory (xslt) add_subdirectory (plugins) add_subdirectory (tests) # Leave last - the cmake_install.cmake script is guaranteed # to run in a single job, and we need to force GSettings # schema recompilation to happen after all other install # targets (there is no way to set install target dependencies) # in CMake add_subdirectory (postinst) compiz_ensure_linkage () compiz_package_generation ("Compiz") compiz_add_uninstall () compiz_add_git_dist () compiz_add_distcheck () compiz_add_release () compiz_add_release_signoff () if (COMPIZ_BUILD_TESTING) compiz_generate_testfile_target () endif (COMPIZ_BUILD_TESTING) _print_configure_results () _check_compiz_cmake_macro (${CMAKE_MODULE_PATH_ORIG}) # Enable coverage reporting for compiz compiz_generate_coverage_report() ./compizconfig/0000755000004100000410000000000013246301623013732 5ustar www-datawww-data./compizconfig/CMakeLists.txt0000644000004100000410000000264713246301623016503 0ustar www-datawww-dataset (_COMPIZCONFIG_INTERNAL ON) set (LIBCOMPIZCONFIG_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig/cmake ) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LIBCOMPIZCONFIG_CMAKE_MODULE_PATH}) set (COMPIZCONFIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig/include) set (COMPIZCONFIG_LIBRARY_DIRS ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig) if (COMPIZ_PACKAGING_ENABLED) set (libcompizconfig_prefix ${CMAKE_INSTALL_PREFIX} CACHE PATH "prefix") set (libcompizconfig_libdir ${CMAKE_INSTALL_FULL_LIBDIR} CACHE PATH "libdir") set (libcompizconfig_includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}/compizconfig CACHE PATH "includedir") set (libcompizconfig_exec_prefix ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") else (COMPIZ_PACKAGING_ENABLED) set (libcompizconfig_prefix ${CMAKE_INSTALL_PREFIX}) set (libcompizconfig_libdir ${CMAKE_INSTALL_FULL_LIBDIR}) set (libcompizconfig_includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}/compizconfig) set (libcompizconfig_exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) endif (COMPIZ_PACKAGING_ENABLED) add_subdirectory (libcompizconfig) add_subdirectory (compizconfig-python) add_subdirectory (integration) add_subdirectory (ccsm) add_subdirectory (gsettings) if (COMPIZ_BUILD_TESTING) add_subdirectory (mocks) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) add_custom_target (pyclean) ./compizconfig/mocks/0000755000004100000410000000000013246301623015046 5ustar www-datawww-data./compizconfig/mocks/CMakeLists.txt0000644000004100000410000000004313246301623017603 0ustar www-datawww-dataadd_subdirectory (libcompizconfig) ./compizconfig/mocks/libcompizconfig/0000755000004100000410000000000013246301624020225 5ustar www-datawww-data./compizconfig/mocks/libcompizconfig/CMakeLists.txt0000644000004100000410000001057613246301623022775 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/include) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/src) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../libcompizconfig/src) if (HAVE_PROTOBUF) set (LIBCOMPIZCONFIG_LIBRARIES ${LIBCOMPIZCONFIG_LIBRARIES} protobuf) endif (HAVE_PROTOBUF) add_library (compizconfig_ccs_context_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_context_mock.cpp) add_library (compizconfig_ccs_plugin_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_plugin_mock.cpp) add_library (compizconfig_ccs_setting_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_mock.cpp) add_library (compizconfig_ccs_setting_stub ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_stub.cpp) add_library (compizconfig_ccs_backend_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_backend_mock.cpp) add_library (compizconfig_ccs_text_file_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_text_file_mock.cpp) add_library (compizconfig_ccs_backend_loader_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_backend_loader_mock.cpp) add_library (compizconfig_ccs_config_file_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_config_file_mock.cpp) add_library (compizconfig_ccs_integration_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integration_mock.cpp) add_library (compizconfig_ccs_integrated_setting_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integrated_setting_mock.cpp) add_library (compizconfig_ccs_integrated_setting_storage_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integrated_setting_storage_mock.cpp) add_library (compizconfig_ccs_integrated_setting_factory_mock ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_integrated_setting_factory_mock.cpp) target_link_libraries (compizconfig_ccs_context_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_plugin_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_setting_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_setting_stub ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_backend_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_ccs_text_file_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compizconfig_ccs_config_file_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_backend_loader_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integration_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integrated_setting_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integrated_setting_factory_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) target_link_libraries (compizconfig_ccs_integrated_setting_storage_mock ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig) ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_text_file_mock.h0000644000004100000410000000441613246301623026775 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef COMPIZCONFIG_CCS_TEST_FILE_MOCK_H #define COMPIZCONFIG_CCS_TEST_FILE_MOCK_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSTextFile CCSTextFile; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; CCSTextFile * ccsMockTextFileNew (CCSObjectAllocationInterface *ai); void ccsFreeMockTextFile (CCSTextFile *); COMPIZCONFIG_END_DECLS class CCSTextFileGMockInterface { public: virtual ~CCSTextFileGMockInterface () {} virtual char * readFromStart () = 0; virtual Bool appendString (const char *) = 0; virtual void free () = 0; }; class CCSTextFileGMock : public CCSTextFileGMockInterface { public: MOCK_METHOD0 (readFromStart, char * ()); MOCK_METHOD1 (appendString, Bool (const char *)); MOCK_METHOD0 (free, void ()); public: static char * ccsTextFileReadFromStart (CCSTextFile *file) { return reinterpret_cast (ccsObjectGetPrivate (file))->readFromStart (); } static Bool ccsTextFileAppendString (CCSTextFile *file, const char *str) { return reinterpret_cast (ccsObjectGetPrivate (file))->appendString (str); } static void ccsFreeTextFile (CCSTextFile *file) { reinterpret_cast (ccsObjectGetPrivate (file))->free (); ccsFreeMockTextFile (file); } }; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_mock.h0000644000004100000410000000533613246301623030677 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATED_SETTING_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATED_SETTING_MOCK_H #include #include #include #include CCSIntegratedSetting * ccsMockIntegratedSettingNew (CCSObjectAllocationInterface *ai); void ccsMockIntegratedSettingFree (CCSIntegratedSetting *); class CCSIntegratedSettingGMockInterface { public: virtual ~CCSIntegratedSettingGMockInterface () {} virtual CCSSettingValue * readValue (CCSSettingType) = 0; virtual void writeValue (CCSSettingValue *, CCSSettingType) = 0; }; class CCSIntegratedSettingGMock : public CCSIntegratedSettingGMockInterface { public: MOCK_METHOD1 (readValue, CCSSettingValue * (CCSSettingType)); MOCK_METHOD2 (writeValue, void (CCSSettingValue *, CCSSettingType)); CCSIntegratedSettingGMock (CCSIntegratedSetting *integratedSetting) : mIntegrationSetting (integratedSetting) { } CCSIntegratedSetting * getIntegratedSetting () { return mIntegrationSetting; } public: static CCSSettingValue * ccsIntegratedSettingReadValue (CCSIntegratedSetting *integratedSetting, CCSSettingType type) { return reinterpret_cast (ccsObjectGetPrivate (integratedSetting))->readValue (type); } static void ccsIntegratedSettingWriteValue (CCSIntegratedSetting *integratedSetting, CCSSettingValue *value, CCSSettingType type) { reinterpret_cast (ccsObjectGetPrivate (integratedSetting))->writeValue (value, type); } static void ccsIntegratedSettingFree (CCSIntegratedSetting *integratedSetting) { ccsMockIntegratedSettingFree (integratedSetting); } private: CCSIntegratedSetting *mIntegrationSetting; }; extern const CCSIntegratedSettingInterface mockIntegratedSettingInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_text_file_mock.cpp0000644000004100000410000000531613246301623027330 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "compizconfig_ccs_text_file_mock.h" const CCSTextFileInterface ccsMockTextFileInterface = { CCSTextFileGMock::ccsTextFileReadFromStart, CCSTextFileGMock::ccsTextFileAppendString, CCSTextFileGMock::ccsFreeTextFile }; static void finalizeAndFreeTextFile (CCSTextFile *textFile) { CCSObjectAllocationInterface *ai = textFile->object.object_allocation; ccsObjectFinalize (textFile); (*ai->free_) (ai->allocator, textFile); } void ccsFreeMockTextFile (CCSTextFile *textFile) { CCSTextFileGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (textFile)); delete gmock; ccsObjectSetPrivate (textFile, NULL); finalizeAndFreeTextFile (textFile); } static CCSTextFileGMock * newCCSTextFileGMockInterface (CCSTextFile *textFile) { CCSTextFileGMock *gmock = new CCSTextFileGMock (); if (!gmock) { finalizeAndFreeTextFile (textFile); return NULL; } return gmock; } static CCSTextFile * allocateCCSTextFile (CCSObjectAllocationInterface *ai) { CCSTextFile *textFile = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSTextFile))); if (!textFile) return NULL; ccsObjectInit (textFile, ai); return textFile; } CCSTextFile * ccsMockTextFileNew (CCSObjectAllocationInterface *ai) { CCSTextFile *textFile = allocateCCSTextFile (ai); if (!textFile) return NULL; CCSTextFileGMock *gmock = newCCSTextFileGMockInterface (textFile); if (!gmock) return NULL; ccsObjectSetPrivate (textFile, (CCSPrivate *) gmock); ccsObjectAddInterface (textFile, (const CCSInterface *) &ccsMockTextFileInterface, GET_INTERFACE_TYPE (CCSTextFileInterface)); ccsObjectRef (textFile); return textFile; } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_storage_mock.cpp0000644000004100000410000000524413246301623032754 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integrated_setting_storage_mock.h" const CCSIntegratedSettingsStorageInterface mockIntegratedSettingsStorageInterface = { CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageAddSetting, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageEmpty, CCSIntegratedSettingsStorageGMock::ccsIntegratedSettingsStorageFree }; CCSIntegratedSettingsStorage * ccsMockIntegratedSettingsStorageNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSettingsStorage *storage = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingsStorage))); if (!storage) return NULL; CCSIntegratedSettingsStorageGMock *gmockBackend = new CCSIntegratedSettingsStorageGMock (storage); ccsObjectInit (storage, ai); ccsObjectSetPrivate (storage, (CCSPrivate *) gmockBackend); ccsObjectAddInterface (storage, reinterpret_cast (&mockIntegratedSettingsStorageInterface), GET_INTERFACE_TYPE (CCSIntegratedSettingsStorageInterface)); ccsObjectRef (storage); return storage; } void ccsMockIntegratedSettingsStorageFree (CCSIntegratedSettingsStorage *storage) { CCSIntegratedSettingsStorageGMock *gmockStorage = GET_PRIVATE (CCSIntegratedSettingsStorageGMock, storage); delete gmockStorage; ccsObjectSetPrivate (storage, NULL); ccsObjectFinalize (storage); (*storage->object.object_allocation->free_) (storage->object.object_allocation->allocator, storage); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_plugin_mock.h0000644000004100000410000001245613246301623026313 0ustar www-datawww-data#include #include #include CCSPlugin * ccsMockPluginNew (); void ccsFreeMockPlugin (CCSPlugin *); class CCSPluginGMockInterface { public: virtual ~CCSPluginGMockInterface () {}; virtual const char * getName () = 0; virtual const char * getShortDesc () = 0; virtual const char * getLongDesc () = 0; virtual const char * getHints () = 0; virtual const char * getCategory () = 0; virtual CCSStringList getLoadAfter () = 0; virtual CCSStringList getLoadBefore () = 0; virtual CCSStringList getRequiresPlugins () = 0; virtual CCSStringList getConflictPlugins () = 0; virtual CCSStringList getProvidesFeatures () = 0; virtual CCSStringList getRequiresFeatures () = 0; virtual void * getPrivatePtr () = 0; virtual void setPrivatePtr (void *) = 0; virtual CCSContext * getContext () = 0; virtual CCSSetting * findSetting (const char *name) = 0; virtual CCSSettingList getPluginSettings () = 0; virtual CCSGroupList getPluginGroups () = 0; virtual void readPluginSettings () = 0; virtual CCSStrExtensionList getPluginStrExtensions () = 0; }; class CCSPluginGMock : public CCSPluginGMockInterface { public: CCSPluginGMock (CCSPlugin *p) : mPlugin (p) { } CCSPlugin * plugin () { return mPlugin; } /* Mock implementations */ MOCK_METHOD0 (getName, const char * ()); MOCK_METHOD0 (getShortDesc, const char * ()); MOCK_METHOD0 (getLongDesc, const char * ()); MOCK_METHOD0 (getHints, const char * ()); MOCK_METHOD0 (getCategory, const char * ()); MOCK_METHOD0 (getLoadAfter, CCSStringList ()); MOCK_METHOD0 (getLoadBefore, CCSStringList ()); MOCK_METHOD0 (getRequiresPlugins, CCSStringList ()); MOCK_METHOD0 (getConflictPlugins, CCSStringList ()); MOCK_METHOD0 (getProvidesFeatures, CCSStringList ()); MOCK_METHOD0 (getRequiresFeatures, CCSStringList ()); MOCK_METHOD0 (getPrivatePtr, void * ()); MOCK_METHOD1 (setPrivatePtr, void (void *)); MOCK_METHOD0 (getContext, CCSContext * ()); MOCK_METHOD1 (findSetting, CCSSetting * (const char *)); MOCK_METHOD0 (getPluginSettings, CCSSettingList ()); MOCK_METHOD0 (getPluginGroups, CCSGroupList ()); MOCK_METHOD0 (readPluginSettings, void ()); MOCK_METHOD0 (getPluginStrExtensions, CCSStrExtensionList ()); private: CCSPlugin *mPlugin; public: /* Thunking C to C++ */ static const char * ccsPluginGetName (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getName (); } static const char * ccsPluginGetShortDesc (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getShortDesc (); } static const char * ccsPluginGetLongDesc (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getLongDesc (); } static const char * ccsPluginGetHints (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getHints (); } static const char * ccsPluginGetCategory (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getCategory (); } static CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getLoadAfter (); } static CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getLoadBefore (); } static CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getRequiresPlugins (); } static CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getConflictPlugins (); } static CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getProvidesFeatures (); } static CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getRequiresFeatures (); } static void * ccsPluginGetPrivatePtr (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPrivatePtr (); } static void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr) { ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->setPrivatePtr (ptr); } static CCSContext * ccsPluginGetContext (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getContext (); } static CCSSettingList ccsGetPluginSettings (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPluginSettings (); } static CCSGroupList ccsGetPluginGroups (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPluginGroups (); } static CCSSetting * ccsFindSetting (CCSPlugin *plugin, const char *name) { if (!plugin) return NULL; return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->findSetting (name); } static void ccsReadPluginSettings (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->readPluginSettings (); } static CCSStrExtensionList ccsGetPluginStrExtensions (CCSPlugin *plugin) { return ((CCSPluginGMock *) ccsObjectGetPrivate (plugin))->getPluginStrExtensions (); } static void ccsFreePlugin (CCSPlugin *plugin) { ccsFreeMockPlugin (plugin); } }; extern CCSPluginInterface CCSPluginGMockInterface; ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_config_file_mock.h0000644000004100000410000000570413246301623027257 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef COMPIZCONFIG_CCS_CONFIG_FILE_MOCK_H #define COMPIZCONFIG_CCS_CONFIG_FILE_MOCK_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSConfigFile CCSConfigFile; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; CCSConfigFile * ccsMockConfigFileNew (CCSObjectAllocationInterface *ai); void ccsFreeMockConfigFile (CCSConfigFile *); typedef void (*ConfigChangeCallbackProc) (unsigned int watchId, void *closure); COMPIZCONFIG_END_DECLS class CCSConfigFileGMockInterface { public: virtual ~CCSConfigFileGMockInterface () {} virtual Bool readConfigOption (ConfigOption, char **) = 0; virtual Bool writeConfigOption (ConfigOption, const char *) = 0; virtual void setConfigWatchCallback (ConfigChangeCallbackProc, void *closure) = 0; }; class CCSConfigFileGMock : public CCSConfigFileGMockInterface { public: MOCK_METHOD2 (readConfigOption, Bool (ConfigOption, char **)); MOCK_METHOD2 (writeConfigOption, Bool (ConfigOption, const char *)); MOCK_METHOD2 (setConfigWatchCallback, void (ConfigChangeCallbackProc, void *)); public: static Bool ccsConfigFileReadConfigOption (CCSConfigFile *config, ConfigOption option, char **value) { return reinterpret_cast (ccsObjectGetPrivate (config))->readConfigOption (option, value); } static Bool ccsConfigFileWriteConfigOption (CCSConfigFile *config, ConfigOption option, const char *value) { return reinterpret_cast (ccsObjectGetPrivate (config))->writeConfigOption (option, value); } static void ccsSetConfigWatchCallback (CCSConfigFile *config, ConfigChangeCallbackProc proc, void *closure) { reinterpret_cast (ccsObjectGetPrivate (config))->setConfigWatchCallback (proc, closure); } static void ccsFreeConfigFile (CCSConfigFile *config) { ccsFreeMockConfigFile (config); } }; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_factory_mock.cpp0000644000004100000410000000523013246301623032752 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integrated_setting_factory_mock.h" const CCSIntegratedSettingFactoryInterface mockIntegratedSettingFactoryInterface = { CCSIntegratedSettingFactoryGMock::ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType, CCSIntegratedSettingFactoryGMock::ccsIntegratedSettingFactoryFree }; CCSIntegratedSettingFactory * ccsMockIntegratedSettingFactoryNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSettingFactory *integratedSettingFactory = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory))); if (!integratedSettingFactory) return NULL; CCSIntegratedSettingFactoryGMock *gmockFactory = new CCSIntegratedSettingFactoryGMock (integratedSettingFactory); ccsObjectInit (integratedSettingFactory, ai); ccsObjectSetPrivate (integratedSettingFactory, (CCSPrivate *) gmockFactory); ccsObjectAddInterface (integratedSettingFactory, reinterpret_cast (&mockIntegratedSettingFactoryInterface), GET_INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface)); ccsObjectRef (integratedSettingFactory); return integratedSettingFactory; } void ccsMockIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *integratedSettingFactory) { CCSIntegratedSettingFactoryGMock *gmockFactory = GET_PRIVATE (CCSIntegratedSettingFactoryGMock, integratedSettingFactory); delete gmockFactory; ccsObjectSetPrivate (integratedSettingFactory, NULL); ccsObjectFinalize (integratedSettingFactory); (*integratedSettingFactory->object.object_allocation->free_) (integratedSettingFactory->object.object_allocation->allocator, integratedSettingFactory); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integration_mock.cpp0000644000004100000410000000500113246301623027657 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integration_mock.h" const CCSIntegrationInterface mockIntegrationBackendInterface = { CCSIntegrationGMock::ccsIntegrationGetIntegratedOptionIndex, CCSIntegrationGMock::ccsIntegrationReadOptionIntoSetting, CCSIntegrationGMock::ccsIntegrationWriteSettingIntoOption, CCSIntegrationGMock::ccsIntegrationUpdateIntegratedSettings, CCSIntegrationGMock::ccsIntegrationDisallowIntegratedWrites, CCSIntegrationGMock::ccsIntegrationAllowIntegratedWrites, CCSIntegrationGMock::ccsFreeIntegration }; CCSIntegration * ccsMockIntegrationBackendNew (CCSObjectAllocationInterface *ai) { CCSIntegration *integration = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration))); if (!integration) return NULL; CCSIntegrationGMock *gmockBackend = new CCSIntegrationGMock (integration); ccsObjectInit (integration, ai); ccsObjectSetPrivate (integration, (CCSPrivate *) gmockBackend); ccsObjectAddInterface (integration, (const CCSInterface *) &mockIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); ccsObjectRef (integration); return integration; } void ccsMockIntegrationBackendFree (CCSIntegration *integration) { CCSIntegrationGMock *gmockBackend = reinterpret_cast (ccsObjectGetPrivate (integration)); delete gmockBackend; ccsObjectSetPrivate (integration, NULL); ccsObjectFinalize (integration); (*integration->object.object_allocation->free_) (integration->object.object_allocation->allocator, integration); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_plugin_mock.cpp0000644000004100000410000000336213246301623026642 0ustar www-datawww-data#include #include #include #include "compizconfig_ccs_plugin_mock.h" CCSPluginInterface CCSPluginGMockInterface = { CCSPluginGMock::ccsPluginGetName, CCSPluginGMock::ccsPluginGetShortDesc, CCSPluginGMock::ccsPluginGetLongDesc, CCSPluginGMock::ccsPluginGetHints, CCSPluginGMock::ccsPluginGetCategory, CCSPluginGMock::ccsPluginGetLoadAfter, CCSPluginGMock::ccsPluginGetLoadBefore, CCSPluginGMock::ccsPluginGetRequiresPlugins, CCSPluginGMock::ccsPluginGetConflictPlugins, CCSPluginGMock::ccsPluginGetProvidesFeatures, CCSPluginGMock::ccsPluginGetRequiresFeatures, CCSPluginGMock::ccsPluginGetPrivatePtr, CCSPluginGMock::ccsPluginSetPrivatePtr, CCSPluginGMock::ccsPluginGetContext, CCSPluginGMock::ccsFindSetting, CCSPluginGMock::ccsGetPluginSettings, CCSPluginGMock::ccsGetPluginGroups, CCSPluginGMock::ccsReadPluginSettings, CCSPluginGMock::ccsGetPluginStrExtensions, CCSPluginGMock::ccsFreePlugin }; CCSPlugin * ccsMockPluginNew () { CCSPlugin *plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return NULL; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); CCSPluginGMock *mock = new CCSPluginGMock (plugin); ccsObjectSetPrivate (plugin, (CCSPrivate *) mock); ccsObjectAddInterface (plugin, (CCSInterface *) &CCSPluginGMockInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); ccsPluginRef (plugin); return plugin; } void ccsFreeMockPlugin (CCSPlugin *plugin) { /* Need to delete the mock correctly */ CCSPluginGMock *mock = (CCSPluginGMock *) ccsObjectGetPrivate (plugin); delete mock; ccsObjectSetPrivate (plugin, NULL); ccsObjectFinalize (plugin); free (plugin); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_stub.cpp0000644000004100000410000003002113246301623027035 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_setting_stub.h" typedef struct _Private { Bool integrated; Bool readOnly; const char *name; const char *shortDesc; const char *longDesc; const char *hints; const char *group; const char *subGroup; CCSSettingType type; CCSPlugin *parent; CCSSettingValue *value; CCSSettingValue *defaultValue; CCSSettingInfo info; } Private; static Bool ccsStubSettingGetInt (CCSSetting *setting, int *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asInt; return TRUE; } static Bool ccsStubSettingGetFloat (CCSSetting *setting, float *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asFloat; return TRUE; } static Bool ccsStubSettingGetBool (CCSSetting *setting, Bool *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asBool; return TRUE; } static Bool ccsStubSettingGetString (CCSSetting *setting, const char **data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asString; return TRUE; } static Bool ccsStubSettingGetColor (CCSSetting *setting, CCSSettingColorValue *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asColor; return TRUE; } static Bool ccsStubSettingGetMatch (CCSSetting *setting, const char **data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asMatch; return TRUE; } static Bool ccsStubSettingGetKey (CCSSetting *setting, CCSSettingKeyValue *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asKey; return TRUE; } static Bool ccsStubSettingGetButton (CCSSetting *setting, CCSSettingButtonValue *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asButton; return TRUE; } static Bool ccsStubSettingGetEdge (CCSSetting *setting, unsigned int *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asEdge; return TRUE; } static Bool ccsStubSettingGetBell (CCSSetting *setting, Bool *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asBell; return TRUE; } static Bool ccsStubSettingGetList (CCSSetting *setting, CCSSettingValueList *data) { *data = ((Private *) ccsObjectGetPrivate (setting))->value->value.asList; return TRUE; } static CCSSetStatus ccsStubSettingSetInt (CCSSetting *setting, int data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asInt = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetFloat (CCSSetting *setting, float data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asFloat = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetBool (CCSSetting *setting, Bool data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asBool = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetString (CCSSetting *setting, const char *data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asString = (char *) data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asColor = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetMatch (CCSSetting *setting, const char *data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asMatch = (char *) data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asKey = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asButton = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asEdge = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetBell (CCSSetting *setting, Bool data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asBell = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged) { ((Private *) ccsObjectGetPrivate (setting))->value->value.asList = data; return SetToNewValue; } static CCSSetStatus ccsStubSettingSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged) { Private *priv = (Private *) ccsObjectGetPrivate (setting); ccsCopyValueInto (data, priv->value, priv->type, &priv->info); return SetToNewValue; } static void ccsStubSettingResetToDefault (CCSSetting * setting, Bool processChanged) { } static Bool ccsStubSettingIsIntegrated (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->integrated; } static Bool ccsStubSettingReadOnly (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->readOnly; } static const char * ccsStubSettingGetName (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->name; } static const char * ccsStubSettingGetShortDesc (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->shortDesc; } static const char * ccsStubSettingGetLongDesc (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->longDesc; } static CCSSettingType ccsStubSettingGetType (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->type; } static CCSSettingInfo * ccsStubSettingGetInfo (CCSSetting *setting) { return &((Private *) ccsObjectGetPrivate (setting))->info; } static const char * ccsStubSettingGetGroup (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->group; } static const char * ccsStubSettingGetSubGroup (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->subGroup; } static const char * ccsStubSettingGetHints (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->hints; } static CCSSettingValue * ccsStubSettingGetDefaultValue (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->defaultValue; } static CCSSettingValue * ccsStubSettingGetValue (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->value; } static Bool ccsStubSettingIsDefault (CCSSetting *setting) { Private *priv = (Private *) ccsObjectGetPrivate (setting); return ccsCheckValueEq (priv->value, priv->type, &priv->info, priv->defaultValue, priv->type, &priv->info); } static CCSPlugin * ccsStubSettingGetParent (CCSSetting *setting) { return ((Private *) ccsObjectGetPrivate (setting))->parent; } static void * ccsStubSettingGetPrivatePtr (CCSSetting *setting) { return NULL; } static void ccsStubSettingSetPrivatePtr (CCSSetting *setting, void *ptr) { } static Bool ccsStubSettingIsReadableByBackend (CCSSetting *setting) { return TRUE; } static void ccsFreeSettingTypeStub (CCSSetting *setting) { Private *priv = (Private *) ccsObjectGetPrivate (setting); ccsFreeSettingValueWithType (priv->value, priv->type); ccsFreeSettingValueWithType (priv->defaultValue, priv->type); ccsCleanupSettingInfo (&priv->info, priv->type); ccsObjectFinalize (setting); free (setting); } static const CCSSettingInterface ccsStubSettingInterface = { ccsStubSettingGetName, ccsStubSettingGetShortDesc, ccsStubSettingGetLongDesc, ccsStubSettingGetType, ccsStubSettingGetInfo, ccsStubSettingGetGroup, ccsStubSettingGetSubGroup, ccsStubSettingGetHints, ccsStubSettingGetDefaultValue, ccsStubSettingGetValue, ccsStubSettingIsDefault, ccsStubSettingGetParent, ccsStubSettingGetPrivatePtr, ccsStubSettingSetPrivatePtr, ccsStubSettingSetInt, ccsStubSettingSetFloat, ccsStubSettingSetBool, ccsStubSettingSetString, ccsStubSettingSetColor, ccsStubSettingSetMatch, ccsStubSettingSetKey, ccsStubSettingSetButton, ccsStubSettingSetEdge, ccsStubSettingSetBell, ccsStubSettingSetList, ccsStubSettingSetValue, ccsStubSettingGetInt, ccsStubSettingGetFloat, ccsStubSettingGetBool, ccsStubSettingGetString, ccsStubSettingGetColor, ccsStubSettingGetMatch, ccsStubSettingGetKey, ccsStubSettingGetButton, ccsStubSettingGetEdge, ccsStubSettingGetBell, ccsStubSettingGetList, ccsStubSettingResetToDefault, ccsStubSettingIsIntegrated, ccsStubSettingReadOnly, ccsStubSettingIsReadableByBackend, ccsFreeSettingTypeStub }; CCSSetting * ccsSettingTypeStubNew (CCSSettingType type, Bool integrated, Bool readOnly, const char *name, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingValue *value, CCSSettingValue *defaultValue, CCSSettingInfo *info, CCSObjectAllocationInterface *ai) { Private *priv = (Private *) calloc (1, sizeof (Private)); priv->integrated = integrated; priv->readOnly = readOnly; priv->name = name; priv->shortDesc = shortDesc; priv->longDesc = longDesc; priv->hints = hints; priv->group = group; priv->subGroup = subGroup; priv->type = type; priv->value = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); priv->defaultValue = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (value) ccsCopyValueInto (value, priv->value, priv->type, info); if (defaultValue) ccsCopyValueInto (defaultValue, priv->defaultValue, priv->type, info); if (info) ccsCopyInfo (info, &priv->info, priv->type); CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); ccsObjectInit (setting, ai); ccsObjectSetPrivate (setting, (CCSPrivate *) priv); ccsObjectAddInterface (setting, (CCSInterface *) &ccsStubSettingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); return setting; } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_mock.cpp0000644000004100000410000000576413246301623027031 0ustar www-datawww-data#include #include #include #include "compizconfig_ccs_setting_mock.h" using ::testing::NiceMock; CCSSettingInterface CCSSettingGMockInterface = { CCSSettingGMock::ccsSettingGetName, CCSSettingGMock::ccsSettingGetShortDesc, CCSSettingGMock::ccsSettingGetLongDesc, CCSSettingGMock::ccsSettingGetType, CCSSettingGMock::ccsSettingGetInfo, CCSSettingGMock::ccsSettingGetGroup, CCSSettingGMock::ccsSettingGetSubGroup, CCSSettingGMock::ccsSettingGetHints, CCSSettingGMock::ccsSettingGetDefaultValue, CCSSettingGMock::ccsSettingGetValue, CCSSettingGMock::ccsSettingGetIsDefault, CCSSettingGMock::ccsSettingGetParent, CCSSettingGMock::ccsSettingGetPrivatePtr, CCSSettingGMock::ccsSettingSetPrivatePtr, CCSSettingGMock::ccsSetInt, CCSSettingGMock::ccsSetFloat, CCSSettingGMock::ccsSetBool, CCSSettingGMock::ccsSetString, CCSSettingGMock::ccsSetColor, CCSSettingGMock::ccsSetMatch, CCSSettingGMock::ccsSetKey, CCSSettingGMock::ccsSetButton, CCSSettingGMock::ccsSetEdge, CCSSettingGMock::ccsSetBell, CCSSettingGMock::ccsSetList, CCSSettingGMock::ccsSetValue, CCSSettingGMock::ccsGetInt, CCSSettingGMock::ccsGetFloat, CCSSettingGMock::ccsGetBool, CCSSettingGMock::ccsGetString, CCSSettingGMock::ccsGetColor, CCSSettingGMock::ccsGetMatch, CCSSettingGMock::ccsGetKey, CCSSettingGMock::ccsGetButton, CCSSettingGMock::ccsGetEdge, CCSSettingGMock::ccsGetBell, CCSSettingGMock::ccsGetList, CCSSettingGMock::ccsResetToDefault, CCSSettingGMock::ccsSettingIsIntegrated, CCSSettingGMock::ccsSettingIsReadOnly, CCSSettingGMock::ccsSettingIsReadableByBackend, CCSSettingGMock::ccsSettingFree }; static CCSSetting * allocateSettingObjectWithMockInterface () { CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); if (!setting) return NULL; ccsObjectInit (setting, &ccsDefaultObjectAllocator); ccsObjectAddInterface (setting, (CCSInterface *) &CCSSettingGMockInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); return setting; } CCSSetting * ccsMockSettingNew () { CCSSetting *setting = allocateSettingObjectWithMockInterface (); if (!setting) return NULL; CCSSettingGMock *mock = new CCSSettingGMock (setting); ccsObjectSetPrivate (setting, (CCSPrivate *) mock); return setting; } CCSSetting * ccsNiceMockSettingNew () { CCSSetting *setting = allocateSettingObjectWithMockInterface (); if (!setting) return NULL; NiceMock *mock = new NiceMock (setting); ccsObjectSetPrivate (setting, (CCSPrivate *) mock); return setting; } void ccsFreeMockSetting (CCSSetting *setting) { /* Need to delete the mock correctly */ CCSSettingGMock *mock = (CCSSettingGMock *) ccsObjectGetPrivate (setting); delete mock; ccsObjectSetPrivate (setting, NULL); ccsObjectFinalize (setting); free (setting); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_stub.h0000644000004100000410000000316413246301623026512 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury . * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTING_STUB #define _COMPIZCONFIG_CCS_SETTING_STUB #include CCSSetting * ccsSettingTypeStubNew (CCSSettingType type, Bool integrated, Bool readOnly, const char *name, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingValue *value, CCSSettingValue *defaultValue, CCSSettingInfo *info, CCSObjectAllocationInterface *ai); #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_mock.cpp0000644000004100000410000000463113246301623031227 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_integrated_setting_mock.h" const CCSIntegratedSettingInterface mockIntegratedSettingInterface = { CCSIntegratedSettingGMock::ccsIntegratedSettingReadValue, CCSIntegratedSettingGMock::ccsIntegratedSettingWriteValue, CCSIntegratedSettingGMock::ccsIntegratedSettingFree }; CCSIntegratedSetting * ccsMockIntegratedSettingNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSetting *integratedSetting = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting))); if (!integratedSetting) return NULL; CCSIntegratedSettingGMock *gmockBackend = new CCSIntegratedSettingGMock (integratedSetting); ccsObjectInit (integratedSetting, ai); ccsObjectSetPrivate (integratedSetting, (CCSPrivate *) gmockBackend); ccsObjectAddInterface (integratedSetting, reinterpret_cast (&mockIntegratedSettingInterface), GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectRef (integratedSetting); return integratedSetting; } void ccsMockIntegratedSettingFree (CCSIntegratedSetting *integration) { CCSIntegratedSettingGMock *gmockIntegration = GET_PRIVATE (CCSIntegratedSettingGMock, integration); delete gmockIntegration; ccsObjectSetPrivate (integration, NULL); ccsObjectFinalize (integration); (*integration->object.object_allocation->free_) (integration->object.object_allocation->allocator, integration); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_storage_mock.h0000644000004100000410000001025613246301623032420 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATED_SETTING_STORAGE_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATED_SETTING_STORAGE_MOCK_H #include #include #include #include CCSIntegratedSettingsStorage * ccsMockIntegratedSettingsStorageNew (CCSObjectAllocationInterface *ai); void ccsMockIntegratedSettingsStorageFree (CCSIntegratedSettingsStorage *); class CCSIntegratedSettingsStorageGMockInterface { public: virtual ~CCSIntegratedSettingsStorageGMockInterface () {} virtual CCSIntegratedSettingList findMatchingSettingsByPluginAndSettingName (const char *pluginName, const char *settingName) = 0; virtual void addSetting (CCSIntegratedSetting *setting) = 0; virtual CCSIntegratedSettingList findMatchingSettingsByPredicate (CCSIntegratedSettingsStorageFindPredicate pred, void *data) = 0; virtual Bool empty () = 0; }; class CCSIntegratedSettingsStorageGMock : public CCSIntegratedSettingsStorageGMockInterface { public: MOCK_METHOD2 (findMatchingSettingsByPluginAndSettingName, CCSIntegratedSettingList (const char *, const char *)); MOCK_METHOD1 (addSetting, void (CCSIntegratedSetting *)); MOCK_METHOD2 (findMatchingSettingsByPredicate, CCSIntegratedSettingList (CCSIntegratedSettingsStorageFindPredicate , void *)); MOCK_METHOD0 (empty, Bool ()); CCSIntegratedSettingsStorageGMock (CCSIntegratedSettingsStorage *integratedSetting) : mIntegrationSetting (integratedSetting) { } CCSIntegratedSettingsStorage * getIntegratedSettingsStorage () { return mIntegrationSetting; } public: static CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data) { return reinterpret_cast (ccsObjectGetPrivate (storage))->findMatchingSettingsByPredicate (pred, data); } static CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName) { return reinterpret_cast (ccsObjectGetPrivate (storage))->findMatchingSettingsByPluginAndSettingName (pluginName, settingName); } static void ccsIntegratedSettingsStorageAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting) { return reinterpret_cast (ccsObjectGetPrivate (storage))->addSetting (setting); } static Bool ccsIntegratedSettingsStorageEmpty (CCSIntegratedSettingsStorage *storage) { return reinterpret_cast (ccsObjectGetPrivate (storage))->empty (); } static void ccsIntegratedSettingsStorageFree (CCSIntegratedSettingsStorage *integratedSetting) { ccsMockIntegratedSettingsStorageFree (integratedSetting); } private: CCSIntegratedSettingsStorage *mIntegrationSetting; }; extern const CCSIntegratedSettingsStorageInterface mockIntegratedSettingsStorageInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_context_mock.h0000644000004100000410000002375213246301623026502 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_CONTEXT_MOCK_H #define _COMPIZCONFIG_CCS_CONTEXT_MOCK_H #include #include #include CCSContext * ccsMockContextNew (); void ccsFreeMockContext (CCSContext *); class CCSContextGMockInterface { public: virtual ~CCSContextGMockInterface () {}; virtual CCSPluginList getPlugins () = 0; virtual CCSPluginCategory * getCategories () = 0; virtual CCSSettingList getChangedSettings () = 0; virtual unsigned int getScreenNum () = 0; virtual Bool addChangedSetting (CCSSetting *) = 0; virtual Bool clearChangedSettings () = 0; virtual CCSSettingList stealChangedSettings () = 0; virtual void * getPrivatePtr () = 0; virtual void setPrivatePtr (void *) = 0; virtual Bool loadPlugin (char *name) = 0; virtual CCSPlugin * findPlugin (const char *name) = 0; virtual Bool pluginIsActive (const char *name) = 0; virtual CCSPluginList getActivePluginList () = 0; virtual CCSStringList getSortedPluginStringList () = 0; virtual const char * getBackend () = 0; virtual Bool setBackend (char *name) = 0; virtual void setIntegrationEnabled (Bool value) = 0; virtual void setProfile (const char *name) = 0; virtual void setPluginListAutoSort (Bool value) = 0; virtual const char * getProfile () = 0; virtual Bool getIntegrationEnabled () = 0; virtual Bool getPluginListAutoSort () = 0; virtual void processEvents (unsigned int flags) = 0; virtual void readSettings () = 0; virtual void writeSettings () = 0; virtual void writeChangedSettings () = 0; virtual Bool exportToFile (const char *fileName, Bool skipDefaults) = 0; virtual Bool importFromFile (const char *fileName, Bool overwriteNonDefaults) = 0; virtual CCSPluginConflictList canEnablePlugin (CCSPlugin *) = 0; virtual CCSPluginConflictList canDisablePlugin (CCSPlugin *) = 0; virtual void deleteProfile (char *name) = 0; virtual CCSStringList getExistingProfiles () = 0; virtual Bool checkForSettingsUpgrade () = 0; virtual void loadPlugins () = 0; }; class CCSContextGMock : public CCSContextGMockInterface { public: CCSContextGMock (CCSContext *c) : mContext (c) { } CCSContext * context () { return mContext; } MOCK_METHOD0 (getPlugins, CCSPluginList ()); MOCK_METHOD0 (getCategories, CCSPluginCategory * ()); MOCK_METHOD0 (getChangedSettings, CCSSettingList ()); MOCK_METHOD0 (getScreenNum, unsigned int ()); MOCK_METHOD1 (addChangedSetting, Bool (CCSSetting *)); MOCK_METHOD0 (clearChangedSettings, Bool ()); MOCK_METHOD0 (stealChangedSettings, CCSSettingList ()); MOCK_METHOD0 (getPrivatePtr, void * ()); MOCK_METHOD1 (setPrivatePtr, void (void *)); MOCK_METHOD1 (loadPlugin, Bool (char *)); MOCK_METHOD1 (findPlugin, CCSPlugin * (const char *)); MOCK_METHOD1 (pluginIsActive, Bool (const char *)); MOCK_METHOD0 (getActivePluginList, CCSPluginList ()); MOCK_METHOD0 (getSortedPluginStringList, CCSStringList ()); MOCK_METHOD0 (getBackend, const char * ()); MOCK_METHOD1 (setBackend, Bool (char *)); MOCK_METHOD1 (setIntegrationEnabled, void (Bool)); MOCK_METHOD1 (setProfile, void (const char *)); MOCK_METHOD1 (setPluginListAutoSort, void (Bool)); MOCK_METHOD0 (getProfile, const char * ()); MOCK_METHOD0 (getIntegrationEnabled, Bool ()); MOCK_METHOD0 (getPluginListAutoSort, Bool ()); MOCK_METHOD1 (processEvents, void (unsigned int)); MOCK_METHOD0 (readSettings, void ()); MOCK_METHOD0 (writeSettings, void ()); MOCK_METHOD0 (writeChangedSettings, void ()); MOCK_METHOD2 (exportToFile, Bool (const char *, Bool)); MOCK_METHOD2 (importFromFile, Bool (const char *, Bool)); MOCK_METHOD1 (canEnablePlugin, CCSPluginConflictList (CCSPlugin *)); MOCK_METHOD1 (canDisablePlugin, CCSPluginConflictList (CCSPlugin *)); MOCK_METHOD1 (deleteProfile, void (char *)); MOCK_METHOD0 (getExistingProfiles, CCSStringList ()); MOCK_METHOD0 (checkForSettingsUpgrade, Bool ()); MOCK_METHOD0 (loadPlugins, void ()); private: CCSContext *mContext; public: /* Thunking from C interface callbacks to the virtual functions ... */ static CCSPluginList ccsContextGetPlugins (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getPlugins (); } static CCSPluginCategory * ccsContextGetCategories (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getCategories (); } static CCSSettingList ccsContextGetChangedSettings (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getChangedSettings (); } static unsigned int ccsContextGetScreenNum (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getScreenNum (); } static Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->addChangedSetting (setting); } static Bool ccsContextClearChangedSettings (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->clearChangedSettings (); } static CCSSettingList ccsContextStealChangedSettings (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->stealChangedSettings (); } static void * ccsContextGetPrivatePtr (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getPrivatePtr (); } static void ccsContextSetPrivatePtr (CCSContext *context, void *ptr) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setPrivatePtr (ptr); } static CCSPlugin * ccsFindPlugin (CCSContext *context, const char *name) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->findPlugin ((char *) name); } static Bool ccsPluginIsActive (CCSContext *context, const char *name) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->pluginIsActive (name); } static Bool ccsSetBackend (CCSContext *context, char *name) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->setBackend (name); } static CCSPluginList ccsGetActivePluginList (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getActivePluginList (); } static CCSStringList ccsGetSortedPluginStringList (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getSortedPluginStringList (); } static const char * ccsGetBackend (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getBackend (); } static Bool ccsGetIntegrationEnabled (CCSContext *context) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getIntegrationEnabled (); } static const char * ccsGetProfile (CCSContext *context) { if (!context) return NULL; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getProfile (); } static Bool ccsGetPluginListAutoSort (CCSContext *context) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getPluginListAutoSort (); } static void ccsSetIntegrationEnabled (CCSContext *context, Bool value) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setIntegrationEnabled (value); } static void ccsSetPluginListAutoSort (CCSContext *context, Bool value) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setPluginListAutoSort (value); } static void ccsSetProfile (CCSContext *context, const char *name) { ((CCSContextGMock *) ccsObjectGetPrivate (context))->setProfile (name); } static void ccsProcessEvents (CCSContext *context, unsigned int flags) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->processEvents (flags); } static void ccsReadSettings (CCSContext *context) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->readSettings (); } static void ccsWriteSettings (CCSContext *context) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->writeSettings (); } static void ccsWriteChangedSettings (CCSContext *context) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->writeChangedSettings (); } static CCSPluginConflictList ccsCanEnablePlugin (CCSContext *context, CCSPlugin *plugin) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->canEnablePlugin (plugin); } static CCSPluginConflictList ccsCanDisablePlugin (CCSContext *context, CCSPlugin *plugin) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->canDisablePlugin (plugin); } static CCSStringList ccsGetExistingProfiles (CCSContext *context) { if (!context) return NULL; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->getExistingProfiles (); } static void ccsDeleteProfile (CCSContext *context, char *name) { if (!context) return; ((CCSContextGMock *) ccsObjectGetPrivate (context))->deleteProfile (name); } static Bool ccsCheckForSettingsUpgrade (CCSContext *context) { return ((CCSContextGMock *) ccsObjectGetPrivate (context))->checkForSettingsUpgrade (); } static Bool ccsImportFromFile (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->importFromFile (fileName, overwriteNonDefault); } static Bool ccsLoadPlugin (CCSContext *context, char *name) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->loadPlugin (name); } static Bool ccsExportToFile (CCSContext *context, const char *fileName, Bool skipDefaults) { if (!context) return FALSE; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->exportToFile (fileName, skipDefaults); } static void ccsLoadPlugins (CCSContext *context) { if (!context) return; return ((CCSContextGMock *) ccsObjectGetPrivate (context))->loadPlugins (); } static void ccsFreeContext (CCSContext *context) { if (!context) return; ccsFreeMockContext (context); } }; extern CCSContextInterface CCSContextGMockInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_config_file_mock.cpp0000644000004100000410000000556313246301623027615 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "compizconfig_ccs_config_file_mock.h" const CCSConfigFileInterface ccsMockConfigFileInterface = { CCSConfigFileGMock::ccsConfigFileReadConfigOption, CCSConfigFileGMock::ccsConfigFileWriteConfigOption, CCSConfigFileGMock::ccsSetConfigWatchCallback, CCSConfigFileGMock::ccsFreeConfigFile }; static void finalizeAndFreeConfigFile (CCSConfigFile *configFile) { CCSObjectAllocationInterface *ai = configFile->object.object_allocation; ccsObjectFinalize (configFile); (*ai->free_) (ai->allocator, configFile); } void ccsFreeMockConfigFile (CCSConfigFile *configFile) { CCSConfigFileGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (configFile)); delete gmock; ccsObjectSetPrivate (configFile, NULL); finalizeAndFreeConfigFile (configFile); } static CCSConfigFileGMock * newCCSConfigFileGMockInterface (CCSConfigFile *configFile) { CCSConfigFileGMock *gmock = new CCSConfigFileGMock (); if (!gmock) { finalizeAndFreeConfigFile (configFile); return NULL; } return gmock; } static CCSConfigFile * allocateCCSConfigFile (CCSObjectAllocationInterface *ai) { CCSConfigFile *configFile = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSConfigFile))); if (!configFile) return NULL; ccsObjectInit (configFile, ai); return configFile; } CCSConfigFile * ccsMockConfigFileNew (CCSObjectAllocationInterface *ai) { CCSConfigFile *configFile = allocateCCSConfigFile (ai); if (!configFile) return NULL; CCSConfigFileGMock *gmock = newCCSConfigFileGMockInterface (configFile); if (!gmock) return NULL; ccsObjectSetPrivate (configFile, (CCSPrivate *) gmock); ccsObjectAddInterface (configFile, (const CCSInterface *) &ccsMockConfigFileInterface, GET_INTERFACE_TYPE (CCSConfigFileInterface)); ccsObjectRef (configFile); return configFile; } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_mock.h0000644000004100000410000001171013246301623026374 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_BACKEND_MOCK_H #define _COMPIZCONFIG_CCS_BACKEND_MOCK_H #include #include #include CCSBackend * ccsMockBackendNew (); void ccsFreeMockBackend (CCSBackend *); class CCSBackendGMockInterface { public: virtual ~CCSBackendGMockInterface () {}; virtual const CCSBackendInfo * getInfo () = 0; virtual void executeEvents (unsigned int) = 0; virtual Bool init (CCSContext *context) = 0; virtual Bool fini () = 0; virtual Bool readInit (CCSContext *context) = 0; virtual void readSetting (CCSContext *context, CCSSetting *setting) = 0; virtual void readDone (CCSContext *context) = 0; virtual Bool writeInit (CCSContext *conxtext) = 0; virtual void writeSetting (CCSContext *context, CCSSetting *setting) = 0; virtual void writeDone (CCSContext *context) = 0; virtual void updateSetting (CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) = 0; virtual Bool getSettingIsIntegrated (CCSSetting *setting) = 0; virtual Bool getSettingIsReadOnly (CCSSetting *setting) = 0; virtual CCSStringList getExistingProfiles (CCSContext *context) = 0; virtual Bool deleteProfile (CCSContext *context, char *name) = 0; }; class CCSBackendGMock : public CCSBackendGMockInterface { public: CCSBackendGMock (CCSBackend *b) : mBackend (b) { } CCSBackend * backend () { return mBackend; } /* Mock implementations */ MOCK_METHOD0 (getInfo, const CCSBackendInfo * ()); MOCK_METHOD1 (executeEvents, void (unsigned int)); MOCK_METHOD1 (init, Bool (CCSContext *)); MOCK_METHOD0 (fini, Bool ()); MOCK_METHOD1 (readInit, Bool (CCSContext *)); MOCK_METHOD2 (readSetting, void (CCSContext *, CCSSetting *)); MOCK_METHOD1 (readDone, void (CCSContext *)); MOCK_METHOD1 (writeInit, Bool (CCSContext *)); MOCK_METHOD2 (writeSetting, void (CCSContext *, CCSSetting *)); MOCK_METHOD1 (writeDone, void (CCSContext *)); MOCK_METHOD3 (updateSetting, void (CCSContext *, CCSPlugin *, CCSSetting *)); MOCK_METHOD1 (getSettingIsIntegrated, Bool (CCSSetting *)); MOCK_METHOD1 (getSettingIsReadOnly, Bool (CCSSetting *)); MOCK_METHOD1 (getExistingProfiles, CCSStringList (CCSContext *)); MOCK_METHOD2 (deleteProfile, Bool (CCSContext *, char *name)); private: CCSBackend *mBackend; public: /* Thunking C to C++ */ static const CCSBackendInfo * ccsBackendGetInfo (CCSBackend *backend) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getInfo (); } static void ccsBackendExecuteEvents (CCSBackend *backend, unsigned int flags) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->executeEvents (flags); } static Bool ccsBackendInit (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->init (context); } static Bool ccsBackendFini (CCSBackend *backend) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->fini (); } static Bool ccsBackendReadInit (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->readInit (context); } static void ccsBackendReadSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->readSetting (context, setting); } static void ccsBackendReadDone (CCSBackend *backend, CCSContext *context) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->readDone (context); } static Bool ccsBackendWriteInit (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->writeInit (context); } static void ccsBackendWriteSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->writeSetting (context, setting); } static void ccsBackendWriteDone (CCSBackend *backend, CCSContext *context) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->writeDone (context); } static void ccsBackendUpdateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->updateSetting (context, plugin, setting); } static Bool ccsBackendGetSettingIsIntegrated (CCSBackend *backend, CCSSetting *setting) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getSettingIsIntegrated (setting); } static Bool ccsBackendGetSettingIsReadOnly (CCSBackend *backend, CCSSetting *setting) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getSettingIsReadOnly (setting); } static CCSStringList ccsBackendGetExistingProfiles (CCSBackend *backend, CCSContext *context) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->getExistingProfiles (context); } static Bool ccsBackendDeleteProfile (CCSBackend *backend, CCSContext *context, char *name) { return ((CCSBackendGMock *) ccsObjectGetPrivate (backend))->deleteProfile (context, name); } }; extern CCSBackendInterface CCSBackendGMockInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_loader_mock.h0000644000004100000410000000454013246301623027725 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef COMPIZCONFIG_CCS_BACKEND_LOADER_MOCK_H #define COMPIZCONFIG_CCS_BACKEND_LOADER_MOCK_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSBackend CCSBackend; typedef struct _CCSInterfaceTable CCSInterfaceTable; typedef struct _CCSBackendLoader CCSBackendLoader; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; CCSBackendLoader * ccsMockBackendLoaderNew (CCSObjectAllocationInterface *ai); void ccsFreeMockBackendLoader (CCSBackendLoader *); typedef void (*ConfigChangeCallbackProc) (unsigned int watchId, void *closure); COMPIZCONFIG_END_DECLS class CCSBackendLoaderGMockInterface { public: virtual ~CCSBackendLoaderGMockInterface () {} virtual CCSBackend * loadBackend (const CCSInterfaceTable *, CCSContext *, const char *) = 0; }; class CCSBackendLoaderGMock : public CCSBackendLoaderGMockInterface { public: MOCK_METHOD3 (loadBackend, CCSBackend * (const CCSInterfaceTable *, CCSContext *, const char *)); public: static CCSBackend * ccsBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *name) { return reinterpret_cast (ccsObjectGetPrivate (loader))->loadBackend (interfaces, context, name); } static void ccsFreeBackendLoader (CCSBackendLoader *config) { ccsFreeMockBackendLoader (config); } }; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_setting_mock.h0000644000004100000410000003136613246301623026473 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_SETTING_MOCK #define _COMPIZCONFIG_CCS_SETTING_MOCK #include #include #include using ::testing::_; using ::testing::Return; CCSSetting * ccsMockSettingNew (); CCSSetting * ccsNiceMockSettingNew (); void ccsFreeMockSetting (CCSSetting *); class CCSSettingGMockInterface { public: virtual ~CCSSettingGMockInterface () {}; virtual const char * getName () = 0; virtual const char * getShortDesc () = 0; virtual const char * getLongDesc () = 0; virtual CCSSettingType getType () = 0; virtual CCSSettingInfo * getInfo () = 0; virtual const char * getGroup () = 0; virtual const char * getSubGroup () = 0; virtual const char * getHints () = 0; virtual CCSSettingValue * getDefaultValue () = 0; virtual CCSSettingValue * getValue () = 0; virtual Bool getIsDefault () = 0; virtual CCSPlugin * getParent () = 0; virtual void * getPrivatePtr () = 0; virtual void setPrivatePtr (void *) = 0; virtual CCSSetStatus setInt (int, Bool) = 0; virtual CCSSetStatus setFloat (float, Bool) = 0; virtual CCSSetStatus setBool (Bool, Bool) = 0; virtual CCSSetStatus setString (const char *, Bool) = 0; virtual CCSSetStatus setColor (CCSSettingColorValue, Bool) = 0; virtual CCSSetStatus setMatch (const char *, Bool) = 0; virtual CCSSetStatus setKey (CCSSettingKeyValue, Bool) = 0; virtual CCSSetStatus setButton (CCSSettingButtonValue, Bool) = 0; virtual CCSSetStatus setEdge (unsigned int, Bool) = 0; virtual CCSSetStatus setBell (Bool, Bool) = 0; virtual CCSSetStatus setList (CCSSettingValueList, Bool) = 0; virtual CCSSetStatus setValue (CCSSettingValue *, Bool) = 0; virtual Bool getInt (int *) = 0; virtual Bool getFloat (float *) = 0; virtual Bool getBool (Bool *) = 0; virtual Bool getString (const char **) = 0; virtual Bool getColor (CCSSettingColorValue *) = 0; virtual Bool getMatch (const char **) = 0; virtual Bool getKey (CCSSettingKeyValue *) = 0; virtual Bool getButton (CCSSettingButtonValue *) = 0; virtual Bool getEdge (unsigned int *) = 0; virtual Bool getBell (Bool *) = 0; virtual Bool getList (CCSSettingValueList *) = 0; virtual void resetToDefault (Bool) = 0; virtual Bool isIntegrated () = 0; virtual Bool isReadOnly () = 0; virtual Bool isReadableByBackend () = 0; }; class CCSSettingGMock : public CCSSettingGMockInterface { public: /* Mock implementations */ CCSSettingGMock (CCSSetting *s) : mSetting (s) { /* Teach GMock how to handle it */ ON_CALL (*this, getType ()).WillByDefault (Return (TypeNum)); ON_CALL (*this, setInt (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setFloat (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setBool (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setString (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setMatch (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setColor (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setKey (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setButton (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setEdge (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setList (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setBell (_, _)).WillByDefault (Return (SetFailed)); ON_CALL (*this, setValue (_, _)).WillByDefault (Return (SetFailed)); } CCSSetting * setting () { return mSetting; } MOCK_METHOD0 (getName, const char * ()); MOCK_METHOD0 (getShortDesc, const char * ()); MOCK_METHOD0 (getLongDesc, const char * ()); MOCK_METHOD0 (getType, CCSSettingType ()); MOCK_METHOD0 (getInfo, CCSSettingInfo * ()); MOCK_METHOD0 (getGroup, const char * ()); MOCK_METHOD0 (getSubGroup, const char * ()); MOCK_METHOD0 (getHints, const char * ()); MOCK_METHOD0 (getDefaultValue, CCSSettingValue * ()); MOCK_METHOD0 (getValue, CCSSettingValue * ()); MOCK_METHOD0 (getIsDefault, Bool ()); MOCK_METHOD0 (getParent, CCSPlugin * ()); MOCK_METHOD0 (getPrivatePtr, void * ()); MOCK_METHOD1 (setPrivatePtr, void (void *)); MOCK_METHOD2 (setInt, CCSSetStatus (int, Bool)); MOCK_METHOD2 (setFloat, CCSSetStatus (float, Bool)); MOCK_METHOD2 (setBool, CCSSetStatus (Bool, Bool)); MOCK_METHOD2 (setString, CCSSetStatus (const char *, Bool)); MOCK_METHOD2 (setColor, CCSSetStatus (CCSSettingColorValue, Bool)); MOCK_METHOD2 (setMatch, CCSSetStatus (const char *, Bool)); MOCK_METHOD2 (setKey, CCSSetStatus (CCSSettingKeyValue, Bool)); MOCK_METHOD2 (setButton, CCSSetStatus (CCSSettingButtonValue, Bool)); MOCK_METHOD2 (setEdge, CCSSetStatus (unsigned int, Bool)); MOCK_METHOD2 (setBell, CCSSetStatus (Bool, Bool)); MOCK_METHOD2 (setList, CCSSetStatus (CCSSettingValueList, Bool)); MOCK_METHOD2 (setValue, CCSSetStatus (CCSSettingValue *, Bool)); MOCK_METHOD1 (getInt, Bool (int *)); MOCK_METHOD1 (getFloat, Bool (float *)); MOCK_METHOD1 (getBool, Bool (Bool *)); MOCK_METHOD1 (getString, Bool (const char **)); MOCK_METHOD1 (getColor, Bool (CCSSettingColorValue *)); MOCK_METHOD1 (getMatch, Bool (const char **)); MOCK_METHOD1 (getKey, Bool (CCSSettingKeyValue *)); MOCK_METHOD1 (getButton, Bool (CCSSettingButtonValue *)); MOCK_METHOD1 (getEdge, Bool (unsigned int *)); MOCK_METHOD1 (getBell, Bool (Bool *)); MOCK_METHOD1 (getList, Bool (CCSSettingValueList *)); MOCK_METHOD1 (resetToDefault, void (Bool)); MOCK_METHOD0 (isIntegrated, Bool ()); MOCK_METHOD0 (isReadOnly, Bool ()); MOCK_METHOD0 (isReadableByBackend, Bool ()); private: CCSSetting *mSetting; public: static Bool ccsGetInt (CCSSetting *setting, int *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getInt (data); } static Bool ccsGetFloat (CCSSetting *setting, float *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getFloat (data); } static Bool ccsGetBool (CCSSetting *setting, Bool *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getBool (data); } static Bool ccsGetString (CCSSetting *setting, const char **data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getString (data); } static Bool ccsGetColor (CCSSetting *setting, CCSSettingColorValue *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getColor (data); } static Bool ccsGetMatch (CCSSetting *setting, const char **data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getMatch (data); } static Bool ccsGetKey (CCSSetting *setting, CCSSettingKeyValue *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getKey (data); } static Bool ccsGetButton (CCSSetting *setting, CCSSettingButtonValue *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getButton (data); } static Bool ccsGetEdge (CCSSetting *setting, unsigned int *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getEdge (data); } static Bool ccsGetBell (CCSSetting *setting, Bool *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getBell (data); } static Bool ccsGetList (CCSSetting *setting, CCSSettingValueList *data) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getList (data); } static CCSSetStatus ccsSetInt (CCSSetting *setting, int data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setInt (data, processChanged); } static CCSSetStatus ccsSetFloat (CCSSetting *setting, float data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setFloat (data, processChanged); } static CCSSetStatus ccsSetBool (CCSSetting *setting, Bool data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setBool (data, processChanged); } static CCSSetStatus ccsSetString (CCSSetting *setting, const char *data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setString (data, processChanged); } static CCSSetStatus ccsSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setColor (data, processChanged); } static CCSSetStatus ccsSetMatch (CCSSetting *setting, const char *data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setMatch (data, processChanged); } static CCSSetStatus ccsSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setKey (data, processChanged); } static CCSSetStatus ccsSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setButton (data, processChanged); } static CCSSetStatus ccsSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setEdge (data, processChanged); } static CCSSetStatus ccsSetBell (CCSSetting *setting, Bool data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setBell (data, processChanged); } static CCSSetStatus ccsSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setList (data, processChanged); } static CCSSetStatus ccsSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setValue (data, processChanged); } static void ccsResetToDefault (CCSSetting * setting, Bool processChanged) { ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->resetToDefault (processChanged); } static Bool ccsSettingIsIntegrated (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->isIntegrated (); } static Bool ccsSettingIsReadOnly (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->isReadOnly (); } static const char * ccsSettingGetName (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getName (); } static const char * ccsSettingGetShortDesc (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getShortDesc (); } static const char * ccsSettingGetLongDesc (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getLongDesc (); } static CCSSettingType ccsSettingGetType (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getType (); } static CCSSettingInfo * ccsSettingGetInfo (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getInfo (); } static const char * ccsSettingGetGroup (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getGroup (); } static const char * ccsSettingGetSubGroup (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getSubGroup (); } static const char * ccsSettingGetHints (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getHints (); } static CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getDefaultValue (); } static CCSSettingValue *ccsSettingGetValue (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getValue (); } static Bool ccsSettingGetIsDefault (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getIsDefault (); } static CCSPlugin * ccsSettingGetParent (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getParent (); } static void * ccsSettingGetPrivatePtr (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->getPrivatePtr (); } static void ccsSettingSetPrivatePtr (CCSSetting *setting, void *ptr) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->setPrivatePtr (ptr); } static Bool ccsSettingIsReadableByBackend (CCSSetting *setting) { return ((CCSSettingGMock *) ccsObjectGetPrivate (setting))->isReadableByBackend (); } static void ccsSettingFree (CCSSetting *setting) { ccsFreeMockSetting (setting); } }; extern CCSSettingInterface CCSSettingGMockInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_loader_mock.cpp0000644000004100000410000000542513246301623030263 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "compizconfig_ccs_backend_loader_mock.h" const CCSBackendLoaderInterface ccsMockBackendLoaderInterface = { CCSBackendLoaderGMock::ccsBackendLoaderLoadBackend, CCSBackendLoaderGMock::ccsFreeBackendLoader }; static void finalizeAndFreeBackendLoader (CCSBackendLoader *loader) { CCSObjectAllocationInterface *ai = loader->object.object_allocation; ccsObjectFinalize (loader); (*ai->free_) (ai->allocator, loader); } void ccsFreeMockBackendLoader (CCSBackendLoader *loader) { CCSBackendLoaderGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (loader)); delete gmock; ccsObjectSetPrivate (loader, NULL); finalizeAndFreeBackendLoader (loader); } static CCSBackendLoaderGMock * newCCSBackendLoaderGMockInterface (CCSBackendLoader *loader) { CCSBackendLoaderGMock *gmock = new CCSBackendLoaderGMock (); if (!gmock) { finalizeAndFreeBackendLoader (loader); return NULL; } return gmock; } static CCSBackendLoader * allocateCCSBackendLoader (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = reinterpret_cast ((*ai->calloc_) (ai->allocator, 1, sizeof (CCSBackendLoader))); if (!loader) return NULL; ccsObjectInit (loader, ai); return loader; } CCSBackendLoader * ccsMockBackendLoaderNew (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = allocateCCSBackendLoader (ai); if (!loader) return NULL; CCSBackendLoaderGMock *gmock = newCCSBackendLoaderGMockInterface (loader); if (!gmock) return NULL; ccsObjectSetPrivate (loader, (CCSPrivate *) gmock); ccsObjectAddInterface (loader, (const CCSInterface *) &ccsMockBackendLoaderInterface, GET_INTERFACE_TYPE (CCSBackendLoaderInterface)); ccsObjectRef (loader); return loader; } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integrated_setting_factory_mock.h0000644000004100000410000000613613246301623032425 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATED_SETTING_FACTORY_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATED_SETTING_FACTORY_MOCK_H #include #include #include #include CCSIntegratedSettingFactory * ccsMockIntegratedSettingFactoryNew (CCSObjectAllocationInterface *ai); void ccsMockIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *); class CCSIntegratedSettingFactoryGMockInterface { public: virtual ~CCSIntegratedSettingFactoryGMockInterface () {} virtual CCSIntegratedSetting * createIntegratedSettingForCCSNameAndType (CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) = 0; }; class CCSIntegratedSettingFactoryGMock : public CCSIntegratedSettingFactoryGMockInterface { public: MOCK_METHOD4 (createIntegratedSettingForCCSNameAndType, CCSIntegratedSetting * (CCSIntegration *, const char *, const char *, CCSSettingType )); CCSIntegratedSettingFactoryGMock (CCSIntegratedSettingFactory *integratedSettingFactory) : mIntegratedSettingFactory (integratedSettingFactory) { } CCSIntegratedSettingFactory * getIntegratedSettingFactory () { return mIntegratedSettingFactory; } public: static CCSIntegratedSetting * ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { return reinterpret_cast (factory)->createIntegratedSettingForCCSNameAndType (integration, pluginName, settingName, type); } static void ccsIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *integratedSettingFactory) { ccsMockIntegratedSettingFactoryFree (integratedSettingFactory); } private: CCSIntegratedSettingFactory *mIntegratedSettingFactory; }; extern const CCSIntegratedSettingFactoryInterface mockIntegratedSettingFactoryInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_context_mock.cpp0000644000004100000410000000456413246301623027035 0ustar www-datawww-data#include #include #include #include "compizconfig_ccs_context_mock.h" CCSContextInterface CCSContextGMockInterface = { CCSContextGMock::ccsContextGetPlugins, CCSContextGMock::ccsContextGetCategories, CCSContextGMock::ccsContextGetChangedSettings, CCSContextGMock::ccsContextGetScreenNum, CCSContextGMock::ccsContextAddChangedSetting, CCSContextGMock::ccsContextClearChangedSettings, CCSContextGMock::ccsContextStealChangedSettings, CCSContextGMock::ccsContextGetPrivatePtr, CCSContextGMock::ccsContextSetPrivatePtr, CCSContextGMock::ccsLoadPlugin, CCSContextGMock::ccsFindPlugin, CCSContextGMock::ccsPluginIsActive, CCSContextGMock::ccsGetActivePluginList, CCSContextGMock::ccsGetSortedPluginStringList, CCSContextGMock::ccsSetBackend, CCSContextGMock::ccsGetBackend, CCSContextGMock::ccsSetIntegrationEnabled, CCSContextGMock::ccsSetProfile, CCSContextGMock::ccsSetPluginListAutoSort, CCSContextGMock::ccsGetProfile, CCSContextGMock::ccsGetIntegrationEnabled, CCSContextGMock::ccsGetPluginListAutoSort, CCSContextGMock::ccsProcessEvents, CCSContextGMock::ccsReadSettings, CCSContextGMock::ccsWriteSettings, CCSContextGMock::ccsWriteChangedSettings, CCSContextGMock::ccsExportToFile, CCSContextGMock::ccsImportFromFile, CCSContextGMock::ccsCanEnablePlugin, CCSContextGMock::ccsCanDisablePlugin, CCSContextGMock::ccsGetExistingProfiles, CCSContextGMock::ccsDeleteProfile, CCSContextGMock::ccsCheckForSettingsUpgrade, CCSContextGMock::ccsLoadPlugins, CCSContextGMock::ccsFreeContext }; CCSContext * ccsMockContextNew () { CCSContext *context = (CCSContext *) calloc (1, sizeof (CCSContext)); if (!context) return NULL; ccsObjectInit (context, &ccsDefaultObjectAllocator); CCSContextGMock *mock = new CCSContextGMock (context); ccsObjectSetPrivate (context, (CCSPrivate *) mock); ccsObjectAddInterface (context, (CCSInterface *) &CCSContextGMockInterface, GET_INTERFACE_TYPE (CCSContextInterface)); return context; } void ccsFreeMockContext (CCSContext *context) { /* Need to delete the mock correctly */ CCSContextGMock *mock = (CCSContextGMock *) ccsObjectGetPrivate (context); delete mock; ccsObjectSetPrivate (context, NULL); ccsObjectFinalize (context); free (context); } ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_integration_mock.h0000644000004100000410000001103713246301623027332 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_INTEGRATION_MOCK_H #define _COMPIZCONFIG_CCS_INTEGRATION_MOCK_H #include #include #include CCSIntegration * ccsMockIntegrationBackendNew (CCSObjectAllocationInterface *ai); void ccsMockIntegrationBackendFree (CCSIntegration *integration); class CCSIntegrationGMockInterface { public: virtual ~CCSIntegrationGMockInterface () {} virtual CCSIntegratedSetting * getIntegratedOptionIndex (const char *pluginName, const char *settingName) = 0; virtual Bool readOptionIntoSetting (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *) = 0; virtual void writeOptionFromSetting (CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *) = 0; virtual void updateIntegratedSettings (CCSContext *context, CCSIntegratedSettingList settingList) = 0; virtual void disallowIntegratedWrites () = 0; virtual void allowIntegratedWrites () = 0; }; class CCSIntegrationGMock : public CCSIntegrationGMockInterface { public: MOCK_METHOD2 (getIntegratedOptionIndex, CCSIntegratedSetting * (const char *, const char *)); MOCK_METHOD3 (readOptionIntoSetting, Bool (CCSContext *, CCSSetting *, CCSIntegratedSetting *)); MOCK_METHOD3 (writeOptionFromSetting, void (CCSContext *, CCSSetting *, CCSIntegratedSetting *)); MOCK_METHOD2 (updateIntegratedSettings, void (CCSContext *, CCSIntegratedSettingList)); MOCK_METHOD0 (disallowIntegratedWrites, void ()); MOCK_METHOD0 (allowIntegratedWrites, void ()); CCSIntegrationGMock (CCSIntegration *integration) : mIntegration (integration) { } CCSIntegration * getIntegrationBackend () { return mIntegration; } public: static CCSIntegratedSetting * ccsIntegrationGetIntegratedOptionIndex (CCSIntegration *integration, const char *pluginName, const char *settingName) { return reinterpret_cast (ccsObjectGetPrivate (integration))->getIntegratedOptionIndex (pluginName, settingName); } static Bool ccsIntegrationReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return reinterpret_cast (ccsObjectGetPrivate (integration))->readOptionIntoSetting (context, setting, integrated); } static void ccsIntegrationWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return reinterpret_cast (ccsObjectGetPrivate (integration))->writeOptionFromSetting (context, setting, integrated); } static void ccsIntegrationUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList settingList) { return reinterpret_cast (ccsObjectGetPrivate (integration))->updateIntegratedSettings (context, settingList); } static void ccsFreeIntegration (CCSIntegration *integration) { ccsMockIntegrationBackendFree (integration); } static void ccsIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { reinterpret_cast (ccsObjectGetPrivate (integration))->disallowIntegratedWrites (); } static void ccsIntegrationAllowIntegratedWrites (CCSIntegration *integration) { reinterpret_cast (ccsObjectGetPrivate (integration))->allowIntegratedWrites (); } private: CCSIntegration *mIntegration; }; extern const CCSIntegrationInterface mockIntegrationBackendInterface; #endif ./compizconfig/mocks/libcompizconfig/compizconfig_ccs_backend_mock.cpp0000644000004100000410000000311613246301623026730 0ustar www-datawww-data#include #include #include #include "compizconfig_ccs_backend_mock.h" CCSBackendInterface CCSBackendGMockInterface = { CCSBackendGMock::ccsBackendGetInfo, CCSBackendGMock::ccsBackendExecuteEvents, CCSBackendGMock::ccsBackendInit, CCSBackendGMock::ccsBackendFini, CCSBackendGMock::ccsBackendReadInit, CCSBackendGMock::ccsBackendReadSetting, CCSBackendGMock::ccsBackendReadDone, CCSBackendGMock::ccsBackendWriteInit, CCSBackendGMock::ccsBackendWriteSetting, CCSBackendGMock::ccsBackendWriteDone, CCSBackendGMock::ccsBackendUpdateSetting, CCSBackendGMock::ccsBackendGetSettingIsIntegrated, CCSBackendGMock::ccsBackendGetSettingIsReadOnly, CCSBackendGMock::ccsBackendGetExistingProfiles, CCSBackendGMock::ccsBackendDeleteProfile }; CCSBackend * ccsMockBackendNew () { CCSBackend *backend = (CCSBackend *) calloc (1, sizeof (CCSBackend)); if (!backend) return NULL; ccsObjectInit (backend, &ccsDefaultObjectAllocator); CCSBackendGMock *mock = new CCSBackendGMock (backend); ccsObjectSetPrivate (backend, (CCSPrivate *) mock); ccsObjectAddInterface (backend, (CCSInterface *) &CCSBackendGMockInterface, GET_INTERFACE_TYPE (CCSBackendInterface)); ccsBackendRef (backend); return backend; } void ccsFreeMockBackend (CCSBackend *backend) { /* Need to delete the mock correctly */ CCSBackendGMock *mock = (CCSBackendGMock *) ccsObjectGetPrivate (backend); delete mock; ccsObjectSetPrivate (backend, NULL); ccsObjectFinalize (backend); free (backend); } ./compizconfig/ccsm/0000755000004100000410000000000013246301624014660 5ustar www-datawww-data./compizconfig/ccsm/CMakeLists.txt0000644000004100000410000000466113246301623017426 0ustar www-datawww-datafind_package (CompizConfig REQUIRED) include (LibCompizConfigCommon) # Hack set (CMAKE_PROJECT_NAME ccsm) add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/compizconfig_wrapper.c COMMAND echo \"int main (void) { return 0\; }\" >> ${CMAKE_CURRENT_BINARY_DIR}/compizconfig_wrapper.c WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) # Get arch execute_process (COMMAND uname -p OUTPUT_VARIABLE PROC_ARCH) # Get Python Version execute_process (COMMAND python -c "import sys; print str (sys.version_info[0]) + '.' + str (sys.version_info[1])" OUTPUT_VARIABLE PY_VERSION) string (REPLACE "\n" "" PROC_ARCH ${PROC_ARCH}) string (REPLACE "\n" "" PY_VERSION ${PY_VERSION}) set (PY_BUILD_DIR lib.linux-${PROC_ARCH}-${PY_VERSION}) set (PY_SCRIPTS_DIR scripts-${PY_VERSION}) set (PY_CCSM_LIB ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Conflicts.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Constants.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/__init__.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Pages.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Settings.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Utils.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Widgets.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_BUILD_DIR}/ccm/Window.py ${CMAKE_CURRENT_BINARY_DIR}/build/${PY_SCRIPTS_DIR}/ccsm) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) add_custom_command (OUTPUT ${PY_CCSM_LIB} COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/setup.py build --build-base=${CMAKE_CURRENT_BINARY_DIR}/build --version=${VERSION} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating Python Bytecode") add_custom_target (ccsm_module ALL DEPENDS ${PY_CCSM_LIB}) set (UNINSTALL_COMMAND "python ${CMAKE_CURRENT_SOURCE_DIR}/setup.py uninstall --prefix=${CMAKE_INSTALL_PREFIX} --version=${VERSION}") compiz_add_code_to_uninstall_target (${UNINSTALL_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}) install (CODE "message (\"Installing python files\") execute_process (COMMAND cmake -DSETUP=${CMAKE_CURRENT_SOURCE_DIR}/setup.py -DPREFIX=${CMAKE_INSTALL_PREFIX} -DWDIR=${CMAKE_CURRENT_SOURCE_DIR} -DVERSION=${VERSION} -P ${compiz_SOURCE_DIR}/compizconfig/cmake/exec_setup_py_with_destdir.cmake)") ./compizconfig/ccsm/ccsm.desktop.in0000644000004100000410000000031413246301623017602 0ustar www-datawww-data[Desktop Entry] _Name=CompizConfig Settings Manager _Comment=Configure Compiz with CompizConfig Icon=ccsm Exec=ccsm Terminal=false Type=Application Categories=Settings;DesktopSettings; StartupNotify=true ./compizconfig/ccsm/INSTALL0000644000004100000410000000070213246301623015707 0ustar www-datawww-dataThis software depends on Python and PyGTK >= 2.12 sexy-python (libsexy bindings) is also used but optionnal. Of course librsvg-common is needed for a proper svg support in gtk/gdk. Run the setup.py script to install, e.g.: python setup.py install (as root, or with root rights using sudo) To install it to /usr/local (or any other prefix) use: python setup.py install --prefix=/usr/local (specify --prefix _after_ install or it won't work) ./compizconfig/ccsm/ccsm0000755000004100000410000001013413246301623015531 0ustar www-datawww-data#!/usr/bin/env python # -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Copyright (C) 2007 Quinn Storm DBUS_CCSM_SERVICE = 'org.compiz_fusion.ccsm' DBUS_CCSM_PATH = '/org/compiz_fusion/ccsm' DBUS_CCSM_INTERFACE = 'org.compiz_fusion.ccsm' # from the D-Bus specification DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER = 1 from optparse import OptionParser import pygtk pygtk.require('2.0') import gtk import sys import os def try_register_dbus (): '''Return instance of dbus control object on success, None on failure''' try: import dbus, dbus.service from dbus.mainloop.glib import DBusGMainLoop except ImportError: return # rely on a reasonably new dbus-python if dbus.version < (0, 80, 0): return class CCSMObject(dbus.service.Object): main_window = None @dbus.service.method(DBUS_CCSM_INTERFACE, in_signature='s', out_signature='') def present (self, startup_id): if startup_id: self.main_window.set_startup_id(startup_id) else: self.main_window.present() DBusGMainLoop(set_as_default=True) try: bus = dbus.SessionBus() except dbus.DBusException: return try: obj = bus.get_object(DBUS_CCSM_SERVICE, DBUS_CCSM_PATH) obj = dbus.Interface(obj, DBUS_CCSM_INTERFACE) except dbus.DBusException: # no ccsm instance running if (bus.request_name(DBUS_CCSM_SERVICE) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER): return CCSMObject(bus, DBUS_CCSM_PATH) else: return else: try: display = gtk.gdk.display_get_default() startup_id = gtk.gdk.x11_display_get_startup_notification_id(display) obj.present(startup_id or "") print('Another CCSM instance already running') sys.exit(0) except dbus.DBusException: # error on present call so pretend it doesn't exist and start up normally return dbusObj = try_register_dbus() if gtk.pygtk_version < (2,12,0): raise SystemExit("PyGtk 2.12.0 or later required") import compizconfig import ccm from ccm.Utils import GlobalUpdater from ccm.Constants import Version, ConfFile plugin = None category = None parser = OptionParser() parser.add_option("-p", "--plugin", dest = "plugin", help = "Directly jump to the page of PLUGIN", metavar = "PLUGIN") parser.add_option("-c", "--category", dest = "category", help = "Directly jump to CATEGORY", metavar = "CATEGORY") parser.add_option("-v", "--version", dest = "version", action = "store_true", help = "Version") (options, args) = parser.parse_args() if options.version: print("CCSM %s" % Version) sys.exit(0) if options.plugin: plugin = options.plugin if options.category: category = options.category context = compizconfig.Context(ccm.getDefaultScreen()) GlobalUpdater.SetContext (context) mainWin = ccm.MainWin(context, plugin, category) if dbusObj is not None: dbusObj.main_window = mainWin idle = ccm.IdleSettingsParser(context, mainWin) mainWin.show_all() # Check if we should show the first run warning dialog. if os.path.isfile(ConfFile): pass else: warning = ccm.FirstRun(mainWin) warning.show_all() gtk.main() ./compizconfig/ccsm/COPYING0000644000004100000410000004311013246301623015711 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ./compizconfig/ccsm/Makefile0000644000004100000410000000027513246301623016323 0ustar www-datawww-dataall: @python setup.py build --prefix=${PREFIX} install: all @python setup.py install --prefix=${PREFIX} uninstall: @python setup.py uninstall --prefix=${PREFIX} clean: rm -rf build/ ./compizconfig/ccsm/images/0000755000004100000410000000000013246301623016124 5ustar www-datawww-data./compizconfig/ccsm/images/modifier.png0000644000004100000410000000360013246301623020427 0ustar www-datawww-dataPNG  IHDR`0GIDATxZA G+Jj\7âνiBP7"rŷa4@sM@a(rH]jJDr^$3P+`>æ{{oȞ^?Usqe*gDkLJy?y `_~ۿ~gfR+a&ZJNma<+غXJ3l6ɓ{ON;NA|瘡kr~3KDB̭uK*8:mΦ%IO'Eѯz]$: ~&r>AT>[XN/ae{}( J)Z$<W\x%@9=D N`.%L01FH/î,k;lmc: ڟQ  (@BVzzͶ>ܒb/P\9 b$1Ck^B`3Z-hֈG{CBl.vY(1jsfiw~sIt!AM @NݕG*1(Ybyd̛Q4v# %= AQv'ė'᷅_N59uDRz.%AK!!!I<RHAѲ쒵 {!r)X<_$7jr*2M`Nc;eUV2s+)y $ ePS AVj eŃ%^F)[};\![`fIdbɯR2fr:ZÈ6>A$[F äxc@ԵBĐB0뽗|NL !kgaHC~{KO]N9+aO9ЅdNx?8 Kiw#Կķt#v"V5N'W htKd_߉[$zw+{u$5[r?w TrreM7/ɛ. >zX qÑ ('frfsOG#sG`t čs;G~TAOO7!h@(4 PQQ >K_+ J_ ƌ{VI8:תP0 \C?؉b2;O@0iq{?YH1"As!5z`e"؆>q0UUU}qI$Na H2P!SW>v9 ofpƛti* U pWW$_+aqءWvuuA'}Jh3hP-hllD?SX%Rb/3LR pJN I[ڻw`yLz7-bX%:P [q"]Nԁf;x'43mڊZ@ojޛxLpP@{.8> YwJlIBbj(w%?+U>{KS;S^k^ ~ Duu hmm<8l:FO9鴫 k- ĕ'pM[!{^aQVVnf[}I1ܻN?ȘC:q {ҐB[̷ ܼbђ/:s^,7jVDv10 Jf_.:bÇ$iI5gVT67 EG女VTo 1%!=xlo@ Ĩ8]5ڊ?6ԫq4ڊʖ< d ԁx{{{+M@@h+@"@ >lVmEe}^ g$ 0W f~g eVmEe?^8_iVTvǿ/nB[Qٝ|;b v^&mEew?a88"bq#FJQ)"+'?YLڊ moT3ЦX~dq>4ڊ|cI!☽@h+*KN2i+*{O}5 Į2@mEeZh\bμQ:.@|h ==@h+*{/ ġӷ%<R-= ׿,K }qr>z zqn[k 8=d9KJw~ P/x1MNۢs}5( _eޖ݂ L=bc9CsP=4DĨ@Lz!G(evx664ݶ  xɳ0LN1§ ' Mm]@=0og#o@dO=.ilk!+aA4(JgȇBB 3@#fOJHzDVGRj`%_`s,SB8C#k"AzOS)衒}HRC4mx"%eT sm;0& N[d&ǐdPp6.Rh&7@*J#sDFHp~ ně0 .GTM T@,g|R oHi( ⳐR=apn%OzZ g0HM2 fځ*pN*LVc @00 Ĕ-6PW 3@Ⱥ.+)(ʡC A![M6H;B,d %CpH`ںQ, odyG Ct@ ĀB*!gd]*!* 8J}0"@ l,+d8=᭪J!#4CI0M){aQ E$@SGXGLN/ 9cRȆPts0BQ0 &m:0f~s}ʅJ2 {ȅ&d"I#00q *0rbMF32e%ʖ;'Av͡3pd)@Fd =mqKT0PG™<^- G9gRB02mHW ՐH chj@zr Z$oc vFR0-) ߶:!O l(DɴoQ"qC  A°oUZ{@nQ uBz*:hJ! 2na{-dP : !j rGwPKd`FX  :p* ;d/;V 7K+PȦR1CJiv Ƃ{]Z-xp`- !{QBl0{@?:|292~  1Ԃ# 󊸎Eɡ rp0;;=àB2r@lL$PYg~S_C]Y]tk Vd$l(#a@r+d j8d3Y ` BDٔ+@Y:'?Hpbbwe 0l\DcRG҃r"T@(  `0A@QĠ*0aBw(ZU D `wz:5,G;<䭣cέD*4%Ydؑ-Mc`0UB& Pʦ-?upXx^2b >Q 6ЛT[8rT `( ڤ@\@Q dZE8yM_4X jT G5eֳ3d@ aC@(P0C& @ ` B h7I+bUH*LxC(1? D$Ж4C"H1b4>pn hmɰ=A.fՃZoBk$I\zg;e6GW<`im<^QP p)T s5$7%23ud@̑k9I`Q A Eڶ|0wc j39AA;S`C٧-6g RP(HDzd0  ־T&aPD:P1@dn 0# g}jhU, !N& @rr\4/`o0k0P4i7-g++2a 0 #j=F0IEU <zϘin2  iI TK`}ST_0(@1@8]N1  0 H`y*K B CihEmJ9T qqGHF)$(Jpú hfkjc`9n@9P:m Jr@ _h" y(;zÀp9yI3%d߁aob0* i! d|}S88,"NXJR\A  |A O@.' h|Aݠ* QF{Sܨ 83*߈@I|#aQ6,yocs>Ѯoq |80VX0k ֭kf& @]MI!ݑH g}>H lHde:? dTBeLΑ[€"OH 4~4awh@ )QbZdLkCRBWI_Acٵ\)QB A@C5~\=pĻ)B Fb %5O>{0tAXIta0@dV!QdzszU\ -b@ԃRfrpH 2KBZ- dWd/AAcg>E= r/'[sǸv%  C0 #Ο }q rXY*N\pJ+̹uW%ω zr;+(@^ QRa LSDa3dV:M5"a$du|1  (k,@ [ ,2e:} 4"p()W/(fb aC5+@ JC1%%2YY2oB vh$G(X\^% ^ż LΜ=b4yhyD\=@9(=Pf 8!8 %.U?h#b ?s&+!nEenW(W>K2P)ADB'4ǧ-qԅ;P84 aP TTPIj >Bm{m NPap..S/Ic*QX xC<'ײc!\,"֑u_zС\Yy='smM6bg!**oP3Ș;cMO8+'$ZX_du( G{!dΪPD P |Pj ;U κQ߉  IuYd`uv);bXA |OI%'LMU vErs7y)BU%&bM hdȤ$(Q$`@qb3ɀbe5` mQRxɴ0ɻ*8V$fUAna6JQfpT`MŐA0 uP}Zm @2M3BIJP$JԁjO?HRJ CD`_wPJVԁ]TU!F؁ *! .kICA; Ù!aoTSF%8aW܆M` lip7S 0 jPgz5ZjH *8] '" c @tˢK orA>$ԪTA  !p1?: j@ܲ8Gb :d' o:V$*Ziz/_K/<0B.d.hUI@(@ BP(%nVɖdkڪB/!UXBJS<a ^ O0@ EB6(2O@^k]&^BnIQ(Cê,.&QqE+4xJehdzxAzDSw?>&6mjl ƒ"HTr%ߜumm-!$|c&mގ~,(P'ʫ"&OTϙw} .)sl97.>3f%1L& ޏ%0􀗗 ֬Y?~<͞U KKKA}E;p7̹ģ8X,:T0_cիA}]jU+@ee?n|o% Ď{L[m]ݥC|so? Q" ::||ŕws{q}t:m6FV h <}c npړO:L&aੂ|)܌ B+l@B%E ÇO?Dx7O R@B/}ޯӈq*8K/-Zs=W\!jkJ|]1"-  >y3wyrAb>)8+iUȅB0JБ$҃Ղn0[`o*~)qCx.Gp;LeYV H`O=Q?uL#L(, 4ϽH/cD sТ_E{BA˗M2"9gohX<}x اgBtt߉'"Mm;J܁lLЬpOB;Im7#p\D;Padz~Tҋ^ȪN\qqII)hni GzHq,H[+=Th? m@5kWw#1k GV^VUG> Th 2a;{5#k&3? *$B|9 fygOX8upmݢʊx<7 xn>.r ķ}ڶD ~4aҒ2!Aa'~awZY 워A457۫/4-a#AꝬ(紴o 8}imOM5'ز$TvN k'٤;y2^'8;<3Q7yZ DPsn`q'R-yvUqZqҪ9:[ZZ@<0\E~X,.P gdoC_3=MlX{0L0,󴺊 `d{c‹bRwzWЉ@ѣ;04ڲmvQ#G:} d۩rucy(//of_-|a+=b7ۼ ,u6V@p ^T 3Z^%ɒBrCդ]2'9H~Q z띷.J݊h@h|C0;^S&O7n"NT3kY@rumx,OJO>~X1ě_˪Q@\CߔJJcW񚚚ر3jĈ`p`"%۝(7]"سON"S̨ٵj*}?N`%iş7kĠ?kE5lvÉoḚGAƙ)\ٰ'sK)gOF(D&" ()F@sKKbJBn{L R`*!@q ɐxLn7\ȊCN!V>G֐e<Ñr!G-K{d?qb#E deikgF 455GK==4piN:Ӫ2W-ҎTQlq[,Nai @=q׾d$_Æ(Ƞ ZZ#r>PgsKn5V vIOiju8YlCZq$r_zo"dk]6\1 k*m'$~#o_v;D9vsX7'l pvoEG>W^Ŧ/&mh7BKp|뮞s>yQ媝4[cS#xn+. }*Ȝ589`С jo @G{之.?0nD .n0>QMYP ~'KepUC'79KCqP~(J +z:: .};y;hb }WWW_u͵]IIXBJڌ;ba-NRQx 1 8{3DOO`dtf}t*gjv=?F#̾̽hx5 ^(p:q~.AG4/vCx\ r2]!2%f%,@dF ]~@i(LtV?漲ω1 $H>)TnI j"T$NƹEή1`{ ႀI*7;>P9qx7XB 30"P6lZGA2Asq"5Ygc jh7<x$iV;T Sllhd+ ç%>lsT ുPC!dmx'Z!uza4ڴi i@hӦЦMM[_aXewIENDB`./compizconfig/ccsm/images/22x22/0000755000004100000410000000000013246301623016703 5ustar www-datawww-data./compizconfig/ccsm/images/22x22/mimetypes/0000755000004100000410000000000013246301623020717 5ustar www-datawww-data./compizconfig/ccsm/images/22x22/mimetypes/audio-x-generic.png0000644000004100000410000000116113246301623024404 0ustar www-datawww-dataPNG  IHDRĴl;sBIT|d(IDAT8ҿkSQ}?ҴMMUQA[b]҈ Emwq{TԴjڦMw.Qb(j.=p-ā= e [5Z_؈oI[8tR5}d~y*,C5Sw٥/^GgsyڄEfnEXFzQbTZ?ϟ槪z-w-s=i [Q !Z{X̞Nfxh@8X+w=XK#bW"׼G._(U|zQΏ8O*k wã=!Պ0~T"a鑎਱PulaYa>+f]BQqB[ @ "@WԍD0! @ju*J߼f1zZ ;_$2+IENDB`./compizconfig/ccsm/images/22x22/categories/0000755000004100000410000000000013246301624021031 5ustar www-datawww-data./compizconfig/ccsm/images/22x22/categories/plugins-all.png0000644000004100000410000000257213246301623023773 0ustar www-datawww-dataPNG  IHDRĴl;AIDAT8U[le=3{ٙ-JoXX 66$$DE_4>GLc H)B޻v}fZ |ߜ99s~ccw00/c4E[͉׿s̳N~dO=R{,2L0>j_ZX].|{"%p~.]Cca3$ZhTء,2Q+͹ɩ\K?x}ω7e_8rjoo, g0=a v!.>}7=W1KD̵}dv;}[C}ېIJMRHDb>㉎W7!pPVX;qpA;舷A!)tÂXQ#\GK3dP HP zG3;^^\A j Xf+#4 RV BٲT%:v:ۏG"sxKxqO:+ mOC"V֪TeC4L6Gm_sg8)ȮTü⧑ iĭ;,x]fEwtgm"{=; p6wGw)n%LN=P,l@zپ]lv@0ZO ]hPN]X؁Au۴-\ ^4Bp 8 .zyۻH%OWӲ(mtulemD!VaضB19hJI N`eeߝ5@ lGwWtԺ\K(͔s[S[>әeSB:~ܻD LO7vP aA>D`@Rᮻ,~ \s/nTzT7`NNS$iI4(mBb|K_hi?);*4SIuz6A]?#7[~,mbL]rm@Mbk=h_?<mLe%7eϔ]ЈB2y:)p  7;m8dYPX;) <@\0:5B J35C>G]YE.]ǁUܰfT"K':hh{}[:A h{gZY&2Uɍ_*AzF߉6) `V[֒Ju!pRiz[c<7-DŇQ)8[έ*zckVO{p?9IENDB`./compizconfig/ccsm/images/22x22/categories/plugins-desktop.png0000644000004100000410000000124513246301623024670 0ustar www-datawww-dataPNG  IHDRĴl;sRGBbKGD pHYs B(xtIME -EbH%IDAT8픿kSQǿK/bBRC[St(vHСZ [PQPMA$H+&4֦AtSz=&gfo9jٖw{6Mom6LVx|RCM ZFOgff+PxؖeN{iE\2imOD`crAJDfg0>>tzҹ M5&i5^Ho˶}OcK)RRmzh,|;Y?f:=վA) )wu7\k@З/z>E&vw?h1ڞg2X45lqiՓ4EϞ/ғrm7xN8}ܱ2xozwxT{aq|3, lcd4-׫U bF}M k e&1ǣёK/7*GZxyOorp햲B BQ3A_?=?IENDB`./compizconfig/ccsm/images/22x22/categories/plugins-uncategorized.png0000644000004100000410000000164613246301623026067 0ustar www-datawww-dataPNG  IHDRj PLTECCCIIF¿̗$1otRNS !""(+/38:AIIKOPSV_ipt_[IDATc`Y]sc nT;m=QfMmd$8yt7D r'N4u]P_gv5ׇA(t-Boj,k a: SJUZ!kr/$:6ϙC63˫28DYZ Dģj 4E$bʊ1;=X1D,D0E C0E:R0 [1}ڃ%QDUńyXeX88`b2Hr4^ar Nl~w<2O;gW_&a6ebUguAeTL$p1ORB|/ֵS  _)7nkz\ R}|)9Øk6`.LV ҂1v%P[žuV^ 1ҭBU8=8\xȜfxpTi=@M%YQux;sRؚb+˫ŽyۇD)i5b;I܉D̓D!knGDLc׹M7mUeKֲY`s-Es!IH>zC̚l<9`\9Mޜ5Y Xa{͡z>iSHOy2f^hEꠥl {aA1m693"r%^g\h^| Y  |f&y! !!߼bv# g'WIENDB`./compizconfig/ccsm/images/22x22/categories/plugins-search.png0000644000004100000410000000166113246301623024466 0ustar www-datawww-dataPNG  IHDRĴl;sRGBbKGD pHYs B(xtIME z1IDAT8˵OkF3lّq7dwOBܺCɥ 71{) RrSaYh &%:M&$+=3=4247H5?dٲiA@h}(Ð }0 0 -3_\\^2i翞'd, H N΢O/^3===Q pRr1 }|v1b6n~H1 4$,%5^_dM%;ewEǦiRjy}毫.0)&|vjJ%? '~?m퇸f˥vy;Zjm.Vٷx0|mfZ젔d8C\VQTzm+ NFATbffjڻ#Φ(6ƛٶ2ZSSSufgg1 \__o!cplfڕJ%ʆa999---IP2c 1L PbQlnn>{+՛*!IENDB`./compizconfig/ccsm/images/22x22/categories/plugins-general.png0000644000004100000410000000206213246301623024632 0ustar www-datawww-dataPNG  IHDRj "PLTEUVSUXRVWSUVSUWSmokUWSBC@mokUWSmok۴UWS-.,UWSUWSXZVrsoUWSrrrUWSmokkmilnjlnjkmikmilnjZ\XY[Wbd`npl~~~mokoqmprnsuq}~{ԫ»ýĽ JtRNS  "$%&&&(***,-.2;<$2 "AÀ " o+ cJ}Ik OiR%w VKe*"WH ӎW p@P x Or1I=Vi/#vCVcDGM3'4=yXk`A Aj9glTIENDB`./compizconfig/ccsm/images/22x22/categories/plugins-utility.png0000644000004100000410000000226513246301623024725 0ustar www-datawww-dataPNG  IHDRj PLTEUUU@@33f+UUIIm;NbI[mFdGNjANi@Mf=IgALgGRpLUpQU{ooQ]|^eIPqRUtWWqjmZ]zhkgguuMUtdj\dOWskn||P[{ttlsrvowoq||XZxvz}}Tcqwenhm}Zebk~ylwiucp\j`omyŜȢiwq‘ɔɋ}Š{k}ѲtȻѡнƾatǫȵuxǿ]u_taxdwi{l}opssw{|ĠššáƢƢţƤǦɦɪʭ̮ͮήίͰαϱвϲϲѳϵѵѶѶѷҷӷӸӺԻ־ؿ¹ĻŻżǾǾ.tRNS !$'(*/29<>BDFKORXXYYZ^ijkoprxyz~@S,pWNWwk k8Rb`M=Èj3oE1 sĹ;W}a)ݪʲ2Ǡ;رp EHOڳxEK\8D].l V0[Y)Uo9~$[R>600$iH[6;GL? :v\A7 0(q2k3G$c# 8b IENDB`./compizconfig/ccsm/images/22x22/categories/plugins-window_management.png0000644000004100000410000000204013246301623026714 0ustar www-datawww-dataPNG  IHDRĴl;sRGBbKGD pHYs B(xtIME isIDAT8˭;lU@̼ڎYH#+P$Z !wHH"% r "BNEbR’;&׻3>$,4̽Z/GQtDs3ֳ/\;wށa''k?ݸgG멃QW)#pƱ 6p靑Rc^ t= T*M96RʽOR>[R"S $±RfVVjSfoPo8vX(c$IBVC)E "Z4B!5>J{-vw1)%Js!{bCIZ p];J)+MS{Xk֚%,;xe(*P{Ʌ1\hyGd6?߬rx@.+Ȳf @%EM!0X1 AX?xB*]|ul۶ZV$v18Vt: cAgX=1X2U,?zH̢HקV/LNNR.I :}vF̫,,-H-6g>@ ø[|>O>GC?&LnQ+DݞW*/t e9c'& C3(.UJ)p_'W|\.< xٶ:}Мh|`Y}Qn_v3}'r죶IENDB`./compizconfig/ccsm/images/22x22/categories/plugins-accessibility.png0000644000004100000410000000207113246301623026044 0ustar www-datawww-dataPNG  IHDRĴl;IDAT8TMlE}:cM1i )%ZJV)$gnHTr@U/E"BR8 nvb{|;vZN;7o}C0<6hcx2>w{)P_M&Ka} lT=unؼWL'w>}7 &`01 亞=G:ZB >6!tp87C؇#>G").T>"fqb;,^' $wqX^-/p\}B_H!.C4bZČi>VA$vu&3uoI+,,=E8.QоKŦɅj8"8䊘]B&A=ElQ,%Tmr?<+k}N<DB7w:[;%i$O31AwƛnCXDzTF0*$s"V٠fi 2$}g//T"DY _k4L$Չ605ÍUܿS(T8\فǻksNOGޞvƜy uB^ ^߃n=?K%~b?]P7ռɏg/ێd'w.Q]")+VkAĢa[5eKTeRUMKkA cb1ZXܗtq¬]CvGhW ~Ե"oy?W*ۄ mVj@{~ON?$8;udG:wye䭦h[P+[ R5}1?1fo ˍFV q 1H_IENDB`./compizconfig/ccsm/images/22x22/categories/plugins-image_loading.png0000644000004100000410000000177713246301623026010 0ustar www-datawww-dataPNG  IHDRĴl;sRGBbKGD pHYs B(xtIME 7"sIDAT8OL\Uƿw7^ XJVB ZK]T4!bb`H6q6Fc6151PꢘjBiBRtV-OxfhΛ=sܜ /׋- P3hww=VK&3V_ggxaa%-lpkUe űzh̀c۸gwu]}H&f+!ѶߌhBr0Oo왽Uǝ/z*Fi`l=_i~=׳8X,r}}l؊GHmۻ]١?2,˄뺘M՗'76dNh;՝qp"Yռʵ?P H`WVׯzcOϷ^ADfAݖ,ߎ君 \4ߣm-yNZC> O6A\!W˻>Xg^:đ@x)~$B-|NůUDPǎO9kC9::dѓ|D頻*&` 쮍ЃUHUjmt4>mW$Oz{cLWUU<LA$XMӶZ pSSSaUq6'ivyIENDB`./compizconfig/ccsm/images/22x22/categories/plugins-extras.png0000644000004100000410000000220513246301623024522 0ustar www-datawww-dataPNG  IHDRĴl;LIDAT8˕KhW{7kf2I3IPDK&Ul Bn+-).BP许(T1Fsyg&vM!=p= ĉ'mΝՁ@+#=eǐRr:={E]=y#׮"Rtx2vNC|A/n0t}p=E6ƒ?GȺ 6+tuuQUY2D J%:;:) ig昏%s酌 uO>4t'-'t*%n`:<]w-ՉZih߷Ǯ=f3  7qzy w{|&[&ư7pX냠7iTVU㜛G hB6olCIx*QeZy"PtN׹YK%V KERBoY5S"+SEC[-Fv tYv]Nܿmm4ՎHd4Il|Þ,Wd W Mh<m(nގuM%[(Prk`i<ڗTA݊ ޱ\*jIu4ZՅR!>F2_Rnc_x/^=5a*;>K'4Bh7,t ;4RN7F' CxV2qʝ|d=n+[!裈AdžzsC)cIG_$z͑;ӓgĚn`MǾ?}`K1whsKi]$%`l*ƌ̹&<2k|`kߦuB?M[0+u9>8P k -I݀{IENDB`./compizconfig/ccsm/images/22x22/apps/0000755000004100000410000000000013246301623017646 5ustar www-datawww-data./compizconfig/ccsm/images/22x22/apps/ccsm.svg0000644000004100000410000003527213246301623021325 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/22x22/apps/ccsm.png0000644000004100000410000000136113246301623021302 0ustar www-datawww-dataPNG  IHDRĴl;sRGBbKGD pHYs B(xtIME ,qIDAT8˵OAƟ.-.)1@8ikBbH`?/ijg%1F/z@c4{x ! M Z02;;|49컿ywcl~(OnjUr ^WZH9<S&BsݗS˸9uuktXq8kpQq9?𾌅gs~bZCYq^KeS|^Jb~aP !10.a,,5L{qF!`ccBQ(d t=ۘc [i4J4H'_հk"c PC(0cA̘T$\dY֑3F̣23mV$TUE" @!gB0 YA6AwoO3 R ˲<2lnn.&̏*^#KĶmb,Qj&.]h|`jOVeUR/SAEby*FR++vL:hllJRJxrkZB? ČDMlAc1 B HE[+ ,AJƧ~EPE !y%KHфO/^w -O-ZZrO;{{7!.AUH7;/wmX|%~r<#BP(F3v|[<6/H8t#S{FCB9ړ'vLH` ;66?>?0=}ܩ:sYTpnWWWoY )WΝ&&&;3s~ni Z51SrCwvq{Frț.)"vvQ/.IENDB`./compizconfig/ccsm/images/22x22/devices/input-mouse.png0000644000004100000410000000220513246301623023317 0ustar www-datawww-dataPNG  IHDRĴl;sBIT|d*赎m[+d5mǎK[l\sB:, [t=v Yŀ d7lްi|B+||w|pGWtpx|5fװ'93Hrܐ /#^pZ[KUgRiN\*9AI nL O0ظG|Ч/7mܜfa`ݒ,`h{)/wbEpWWW}U*q7rdC Xy}VkBRrPয়unݳ`q7wynuԤR`-XKalowtpF/;"֚|.e+j4Or=?Nڵz4$ƆFj9RJ1x3AC>?)$f 3ݼwD ֵYcIgi׈bRZk<Xry1Z3^*2=3ÂOȁ;`Mķ57/L Z! `E(ÐPaR:jW ڲ5&Hc Bj`c0Ơ.= |I +#^v-6i#5BJep:9Jt ֒\ Xk0 BDJ r)".CPG)!*w30rwxy<`bp'r,Ĝ[uAPJ+E2dll h,*z5''',EG|hU*2 ===}>jo?0+Wno_lHOU%# 9,4F.|r%ohhcG㔭mnYX֍n• b~c בՑ͓͑JgСΝ;/l_FC-ѱ}UkwS%Z<8w_ũSC@ju|@T߱=IENDB`./compizconfig/ccsm/images/22x22/devices/input-keyboard.png0000644000004100000410000000134613246301623023774 0ustar www-datawww-dataPNG  IHDRj qPLTEUt"+9GckMlsgNmpр{cSy}}^aresrЅqЂ}}ophq~zq·mƇqmƃoʊqrqrΉrψrrqr·rυ~~}}ź¿ݘ2OtRNS !(/124677;ABCIPW\ahl~IDATc`GaVRQQՖ@V7VVTcB1wԗBfqD¥kdeȃ&e"+ oX"Rҁ0%,.,0ڃA%?8,;0$4(,/,#8UA3+$3(VVV`aɡF 6A( &Ɏ T1c_SnQ MZtE(DIENDB`./compizconfig/ccsm/images/scalable/0000755000004100000410000000000013246301623017672 5ustar www-datawww-data./compizconfig/ccsm/images/scalable/categories/0000755000004100000410000000000013246301624022020 5ustar www-datawww-data./compizconfig/ccsm/images/scalable/categories/plugins-uncategorized.svg0000644000004100000410000003206213246301623027065 0ustar www-datawww-data image/svg+xml Patrick Niklaus Uncategorized ./compizconfig/ccsm/images/scalable/categories/plugins-search.svg0000644000004100000410000007305013246301623025471 0ustar www-datawww-data image/svg+xml Patrick Niklaus SchemeP ./compizconfig/ccsm/images/scalable/categories/plugins-desktop.svg0000644000004100000410000004327113246301623025677 0ustar www-datawww-data image/svg+xml Desktop Jakub Steiner http://jimmac.musichall.cz Desktop location. desktop storage files default location Garrett LeSage ./compizconfig/ccsm/images/scalable/categories/plugins-image_loading.svg0000644000004100000410000005647013246301623027012 0ustar www-datawww-data image/svg+xml Graphics Category Jakub Steiner graphics category pixel vector editor draw paint http://tango-project.org ./compizconfig/ccsm/images/scalable/categories/plugins-all.svg0000644000004100000410000003750513246301623025001 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Web Browser ./compizconfig/ccsm/images/scalable/categories/plugins-profiles.svg0000644000004100000410000005577513246301623026065 0ustar www-datawww-data image/svg+xml Patrick Niklaus SchemeP ./compizconfig/ccsm/images/scalable/categories/plugins-accessibility.svg0000644000004100000410000002351213246301623027051 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Accessibility accessibility assist ./compizconfig/ccsm/images/scalable/categories/plugins-general.svg0000644000004100000410000003224413246301623025641 0ustar www-datawww-data image/svg+xml System Applications Jakub Steiner http://jimmac.musichall.cz/ system applications group category admin root ./compizconfig/ccsm/images/scalable/categories/plugins-effects.svg0000644000004100000410000020477113246301623025651 0ustar www-datawww-data image/svg+xml Patrick Niklaus Visual Effects ./compizconfig/ccsm/images/scalable/categories/plugins-extras.svg0000644000004100000410000006005113246301623025527 0ustar www-datawww-data image/svg+xml Patrick Niklaus Image ./compizconfig/ccsm/images/scalable/categories/plugins-window_management.svg0000644000004100000410000005577313246301623027743 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/categories/plugins-utility.svg0000644000004100000410000005121513246301623025726 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz/ system applications group category admin root ./compizconfig/ccsm/images/scalable/apps/0000755000004100000410000000000013246301624020636 5ustar www-datawww-data./compizconfig/ccsm/images/scalable/apps/plugin-dialog.svg0000644000004100000410000002457413246301623024125 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-trailfocus.svg0000644000004100000410000006547613246301623025047 0ustar www-datawww-data image/svg+xml Patrick Niklaus Trailfocus ./compizconfig/ccsm/images/scalable/apps/plugin-crashhandler.svg0000644000004100000410000002646313246301623025323 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-clone.svg0000644000004100000410000012555513246301623023767 0ustar www-datawww-data image/svg+xml Clone Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-swap.svg0000644000004100000410000065703413246301623023643 0ustar www-datawww-data image/svg+xml eJzsvQmPY8l1LvgLzn/g4MGAGjNN3H0RjAHuRj0NrAWSbHjGeGiUuktyvamuEqqr7bF//UScLU7E jUsyk6l2q18ywEwmmbxLLCfO8p3v/N3/9tvffzl98/GPb7+sz8UJ/u7vlk9v33z++OnnJ3z39Mv3 77//7vMn/9bPfvfFqazOhfun6ZfDV/yP//T203fvPn74OX6EH178t3+2vvm3d9+c/undnz98/PDu i9PP/umXv/j1b379y9M6/dMv1y/cv/3h3ef3b90//unj+2/efvrqj58+/vuH85t3X8g1uIOubz67 /6jGL4v2y6ooulPZ/bwc3T/MH7//8M27D3+eP/5/Pz8VrpXV4J/uo//+7ndvv7vy+frx6++/ffvh 828/ffz67XffLR/ff/z03c9Py3+8+XD61Zs/u0/enP7vt+/ff/z30/z+zdf/L7ibbb+6vHv/1t3X t28+nwZ/k9Mvy+qr+ft377/59fff/vGtu+GqKP3b9Vd4xH/8zh3KHdW/9m/3X/3yW/fO799+/uwu y53Pd9TvfjEvrnM/fov/RhdanH72L797++d32OeuC/7HF/SP9nLxP89d1Tdt6V70fdf05eln03/+ 5/efPn08ffv2m3ef33769ObD24+nP7//+Mc379/6o/zv1BOnn83vvz/95ftPyYela+7sv3j3xt18 +hFe2O8+fvfdx8w3C/qmmwnfvM0euDg341DUo/+v/+f7r79+Y/7Bd9kf3n77l/durHG4uubcnrra /5BX/F9uDPA/vqyq2t31OJy+rKvyVLfluXeHPzV9R/8Zxvjtv717++8/P/3644e3NJDTp8+/f/ef b38eZoR/93ffv3/76R8/vPvsRgaPMdIw/urjN2/fu//V717ev8HR467Un/QPf3jz6c9vP7v59/H9 959xUQwFf+SmyT+8+Y+3fqqVdILf/OXthz98/Ce8vi+7vj21tR+Csqm601B2J/fLH7o/9TWfh0aI L8Z/3X9Zjtq7vv6tm2K/+fTuz+8+/Jz/r//qF5/efROmXV+dBvqBl30ezHOUJ12fu9XPn99+4Ot1 0335lZm+xflXv3dn3D58s3z81vf1d35Zuon7wc3U9x//TJ/pa/zEff37v9DV499fuWH57ad3H/wx 4df4yfDVb99/7z76xaeP3//llx/+9BF+RnLot28+/6tbkG8/fPOdEyb+n75894Fl1J++9xLIC5kL vTq5tf/m23df/+tbJ1D+8sXVA//h05uv3flPv/nj/3z79Wd3jN+9+/rN+68/uldu9L93S+ETvXH7 UL//2vfYp9P86fvv/vX0h48f35tL/e3bDx+8WHHX9ie64LfuJd2B+7fff/6EU9atr/CP/60ftqn7 EZ/YzZFPbmzwQ9/9/k/swj+9d8Lqni77j2//+PH9u+++9VfyDl+HK6O/bx/kt3j3H37zgSZJrhPo H/UO/0LfyN/+m0/+9ovqR3xiJ4lun/S34bif3X7yDuf03+JpF7cjvfvzpzd/+dd3X+fPrAf9mv/1 T+60N2b512/8+dvm2vn9vf7p3Qenn5x+/73bVP0c91rA6euP3/7l43dOVZATsKx4+/7NHz9+evOf uMo+/7e+K6erJ6AbXN/+yR01rCO5rV9++De3k3z9KbqV8KYbkPduNr25Y6K+f/PhzacTvr8fsHef P3//6Y0IzTf+H5K39AztV06qW7n95ZfQnOYPRqr/4tObb965rnaq3T9+cF9/+83pz/zWqSy+gOy7 bjOqT/M38C/w91DQo3KtLhrXWtf6YnBtdG0uFtdW1y5l4Zp/VGXjWutaV/aujeVQTuXs2lKuUK7l pdzKS+X+r/KPumpca13rq8G10bWpml1bXduqS3WpS9eq2j8a19q6d21wbawnqKd6dm2pN9cu9cVd pL+A2h21aVrXOtf6ZnBtdG1uFtdW1zZ/K/4y3bn9P7Zt51oP/kc7uDa6NrWzaws+V9c21y6+dYVr ZVfhs+pqbHguf5Suw2fvn4AvBnwO3YhtwqdvMz4Xfa7uueDv0DZ8aoPu4n7R07W+oJ++2Vf027TS /4T/U0bVD1gY1c5/B0d1wqcfVf/cysKNrR/V2nVrzaPa4bhO+HTjCm5oFz+qOLKFG9WSR7Zz49rp yE7V4sZ1wXHdcFwrHtkWx7Vz4zr6cQ2jurpRXXVUKzeuDY5r58azxzGd3HjOOKabaxc3ppUb0xpH lEZ18KM64Gj6tmDzY+lG0T3d3bixq3D8aOz8gPVmsGZsflhoCFwvA3dqhc3PyLZv3BO/2ff90I/4 nPq5X9xzde3Sb/024OIZ3KJwM9j3C07NoQU3O3p8DsM4TO45u7a4tg7bcPFPt+JKfFaj6yY/m93l taM7ix1VGlMa0cGsUVmhNa7Ozl+AjJ9blFu5uYGjRUnLsQNdjQuP2aUueLxktHANuoFacaAuPEQ1 DpDrDxyeGYfHDQ3w6NS43mSZTby4cDhwOdFAdDwEE64G1+04hX1fUz87owO4g33nbv3F3ZHv0Np1 Z2d6cpY+1L5rXK91rt+GcRyncR6XcR238TIVMJWTu5+pcfOkn4ZpnKZpcW2dtrlwIqxyk7J1c6F3 YzPO87zM67y57i1dD9VuVnVL70ZsWuZlWdblshbghFjtBEfnLnFYp3VZ13XbCjf9aydKus2pdtu8 rdvl4sbHSa/24m7jMl7my3rZwqi+4ONHeMAyboDbDW05NQso2nj8pO5w3ckG5EXVjFPcb0KuY3Wa k8DCqQ4orwbch2S+r2YTqnHGk5iacPNBAcWTvdpN9gV0q6lwrpM4ku1lRTHkt5VKt5VBdxIa1cvl srm2ura4wZ4vk2ujG/rBTYDeyRe/xzSu1Re/AzrJein8Fzb/WLfFtdm1aXPz1k2iHpxk8Wuk9TLQ 74Tu+v2adh3izuG+sfrHsrr56mbhtI5uNg5+2biZ6Tc2vyPWfsP1PeMk/wWWiz+Jm8X+4Sa6m9Vu nXh55Oa4l4VeijZu1tdeOrgV4MbA34i7LH8W/5V5nlwbvRybe3CLpvNd4MWBW0Z+i/daQeHvfHJ3 4i7LLzX/ncktvNEtv8EtQr9LerHd4ML041NOfo+6wHhxN+/uxF+WW8T+O/4xeIGIkrtFEelFZeUW vhedBQrSzd+7uxF/YV7QjoN/9IBSw8ukxisXKEtKP9H8iDj54rtrQWHuLsufwwl4//ACvw2jKmMq IyrjKaMpYykj6UdxolHEQZQhdAMIfgR1/GT0RjNyMm48ajpkMmAyXH6o3GABjlSJI7XhSPlRmsMo 6RDVZnhkcGRoZGDcsACOC4+KGxAaEj8cMw7HgMPhh6LFoahwKPwwXHAYFhyGSYZg6EAHgLtfO1+6 XjredTruuTXuwCUpP6grLahLTbh5D4BamNfHGtzlvcZWoA63uYm/oG43oa7n1ARcq15tcCveqxF2 VGlMaURpPGk0aSxlJGkcaRRpEdIA0vDh4IGOHY0cjRuNGo2ZjFhNC4sX1aIDRcMkg+R2rYuOEI0P jQ4NDQ2MDMvEK6TTASl5VaxhKAA1ERkGGgQaAhoA6X7qfOp66njq9gH7XHrc9Tdod1NnU1dTR3tt rXCLY3Nz2Wtyk1u0XrfrnFhtUI8vm8KJW68HLk76Tl5FBCeOO9Qaa9QhCyclNye+vH45uUk2uDnh dc/GyW+vjRaom65u7s/l5Ea1Of3dV/MnN7hBM7Ytp0+Lpm20b6OUs5q+gmrtoscvRr8nfX9i/Z/U y4Ftg14MBjYeWuzABrAXa5272J88gy9oj6zcsQvuMDKXqYvDjG6wo11Xg+vtDS2gBft7xP6mHu9w M2twWyu53y9oWS2oj0/U+655lbdFc6wGHoPS71Q4CivabxNqjwOORYtjQaPhx6MkWwE34gWNwwnV UW8wuv3aX6m/gAotysLbILjB4yaD2z7KZVQJvHJQo7pA6ohfsrgFeB3PbgCFTnUre2bWtgfWvmne +0a6pNcbCsDTeQF9wW1gNktBlkPHS6JFa4DsAp06PElIMrkGZvh7lVCyYmpvk5B1olJqYeuFFs/A o0pLyOkawGtIVtGi62jglSRriUZ11fXEK8o9ZUm1fkCBrDMcUVlZC68tWV2drq+KV5h/4g6DI0om IpmLOKpkQ7pR9Wqa103YzpzY7hzYDg2jioPPo4pieGYR3LqZScJ3RcE7oND1IrdgcTvhPuklrZez XsqKjGUJCypgRbwG4cqiVdUSkauiiGSlKlwXqzi7urC5qVYh21oqVZ2pT2I1K1QjmSoLvmGZ6meD nw8Lml9+LnhzrAP3eU0TgUXqqhPgSKIuupI7Xse4gt3YuN0NRKiin2fw8xbHOKxaWbODjiyNq4yq uwmRXINKK3+i0mwKJKRIPPmrF8G07K7eTVy6fJq2M2r06XZQ8nYg1z7htfuJ2rHkwVlK9wBoV5D4 8bbGxJYHiaAebZJWRVHDVovYMIlx8zIWU/L4cR0QR5VdIT27QkbUmWdU4thad4YuOUJIznqr3c9i sdwHVMwn9oKsgCY8GfEFavPBCdKiJO3ZoB/REpjRKljJsPemvWslKqps34Nbyn4n7lGdHdHU9wou m/uuOW0Pjf4SbZUa7ZaWzf8e1eURDZwZjZ0VvC/AW0B+wqNHoELrqEHp3bFvYEArakIFfUEvgVfZ L95XgEp8hQ4Dvz23wH6DHm21Ee02bwEsaMt5m+DiJybaeRXafF7+t7jToKcJjcMJDUV/lhXQ5riw s6FEy7JGuwQ9mmipDOh+wHv3t4LWDH6F1mqJ7ps6uEuNn1S9aurICa6cTv1pE3vSvL50AVSvSvah NajRd2bKyISR6RIcPDRVZKJM4ioD3N3F0yO+HvH2iL9HPT44MWRaNLjBhhmB8wHCdNDJUJuJINNg Fm+QnwM4/uQTanD8w9hPwEPPA6/DzoOuIz6a0ZaxlpGWccZRBhzkCQd5pRHW8ZXRlbGVkZVxpVE1 TsALOgFjlwj54295ABf2ABZNCeynbdnzTk5AcYwUPIloCvXsmL3qAwSeNThndm7A4GYlLyBNE5ok B15AuO4GxClBE6JTP+DMM+GinsAm+AKB5cCqw1/x0qehH9UpKGNOIy6eQRptGmscaeCBpmEeeCHT CNP40ujS2NLI0rjSqLKB8y9QnBunjpTdqTi37nfbe1TB6NQsDzOoXe9W/p2mHYaq8e+UHsHiXri9 auzKU3Vqi5Pbtfzhfg9/99VLHW7+DgqFbviGn1Tj2S9sPdnxf/jvv8ClvOh94V25jUBicxJ9uzMg V7W5gJx71917EwXkSuPiJw/ogp5PCr51kWM/XdFuPeejBRIvmNiduqkbVSIGPR7YxAxuHUgOFftk W3MwDgy6AxX3eVpu+lnuddn8oAdSd4MVpl7FVmFKolQEqROlGPESORqkKIdSSIqS9N5IbkcjbeV3 LMGtFKe4KklyluZ0yOXQPz6qf9wfRK49bASL3Qjo+nlwrQvM+C9TH9ihFyz2g+F16g== IeWg4szmgyauNXvYzIHjQ4YD5v10d3np7NDjppfZ8jSSHAe95iu7HWrTEG15sunhtod3ktuZeUJd 25b3WzJtyhVwgDu+SNyW8Xy84VPcLz5+eo46o0MOiRa5gp66ZI2gkit4LDAWbDEbZ2qAg0xpiMmJ MTxf3vcaucef4nxt4Yr/Fc93xeN7xeF7eMab5wtnSM+xP8v+3lLXcgO7s9nzBf1kv8cXV/Z/0hzO pd+Z/UZcho14HIqGgJRob2Re4BHq/lz1Qxk2/hc4Fl5T7dSGzoM2K6cSFF5vqPg7HhhcjU1Z+ReN P41/UdZ91dFx+u48OnEcrukFjoXX1MpxGkEo16LUFKrvILIm82Kv+73M4R7SkoackjR40JLqSAq1 mdTaXBhII/78Uo3OmsRVJF3FW8HmJ6CU3VTSxk4Lkbfsu/AWR4++PrI7qJH1sWDgcVM7pFBnRqnI BLFY3Xpt2asRTFexU9C7IfvVyvHBCyILnNJBcV/9WaI6UnFcGH3EqKZQuHGIfjprcmK3gW+k2XgN ZyMXwjbT3tLh7jIK8Ar3llqBOSMqKgKxon3P2/ajk+9+h74g4sZvJX6kJu8OX3FgaKPrXA/6AVgY LeN6mno450+9J0p1EKOCK/5UdLPjWUMo8SCSuOnXQnCr16gLB7g0xLWCRrlCnEsiXRjroh6uWD8r 0Zl44djKxvEV8svOHGeZ2EMrvvke3Z0d+2sx8gIVHrGqJADjHbjotL+gL3SLtNQUiLcwEK/ACyLj X8x/0VoX1VqD3soeAMCbFW1gxZ64MPyOLrG2EDxsgtcyGoGg77oC1EtAGkFtgHcM3yKdJAUATnwV pJEIUqNI/Fq90YGsYyI5r58I4toK4mYOwoYFTckqXFDiVI0DlDJzRpWrYuESBMuggsXCw1KXVxd5 Nry82Ni3gd4NMO4N/9w7OMq9kyPycCQ+DkAnh3dxkIMjuDfIubGwQfWw1lbttbYADuqN5jYpNAit 2cgIjS1atWe9AQVo8NRiKxtzR5CKHQneY1BNp2ZDaoeEIP/OEgEDzIhhGSko45rOabROSJTATNSf 9L7FnI3OZ8/I51R9MJw1nLeNzxurnyneIB8auyLMIQF9ZFAHsgFT6DaG7my6Kci2EA5kD2W3hykg R1qOv+e2iFtAhgTKAHksgw28BSnstNDWLfravaj6onVKs1e/2mZ0xrRTQuUtfwNtq5qe9fupstZ5 LbH1Di15p/X6on+nFg2yap3OG3Rg1NW6nOb3wMHIZ+cVRa+86hFVs67k0K1o5I1ovyWpmXikpjVO u5c4GlkU2Nsn6e0T9zYZAfIW9XY4nTtCe6rK8zDW5qIeP9RDVxR5NR85yEN6+pjT08cv0I5jPX3n TiqjuMLE2mXwXNRXQgruCbtNPFYjVobwC3g/hKiaKEwl3o0JzIYum/pGG7uxI2hz90oXCZRWoeC0 2dOG77f8AVD6iIkxspExa6SL2oaqwKqBUnmK9RFaCagrlNwqBZXXbJ5ULBDDz/CbgmjYRFmynZtz DsVxmymO3EShPzeGYII4wWUUrDKN6LBdVppQoAQDfZMH9p703Ky4+k2x9ReNEha8A1An1LgviHk2 BC0KGPsz4Ta0sEK1sIVGzW1UfrvSoHOJm1jNqhYFoBuJMhIARKLRHe58tAOOHJn2D8KqktNkZvxq 1ETli+3IYEPuFb5GjcWBTzexmbhSWGsqgCNbBWLcKb5VowpIaiDFufzThsEvJhBeoEJYoVLglEJA vdA/R9QOKQw6UTQ8BMPds0Rt0ftJKRzaoOJDIfEOFaGJQqMhLu61Jaczec1J4+IEdvWaldevyIXs 9S2veS2oh61iDpMhDIyBJvu3Zcu3I0sXbV6CTw/OzEX92Jm4k7ZZ2lMV19TBmAWxQ+xijFXVrLIa 1FUTrw1ef+CEG/HS55I2GmOzTRxpuOClBfHaoWxwqx/Qhl91+UuaFFnyY2IbVUnQdlBzyMtNXN+A wrJmEdmKUFQ5KNCQkCUjplClK7lmX0AMqb0DUXvNWz/5AG7qZE3drIeKdqTvqhMUMipv6ggNmLCA OS8j0LNRXMEAzgX5rNhno8GuijKcDL7UQgxZoQXUaUuDJ90MnnRhj8asuMNRkaUD+ziwiRFhzZWc szo1VyIneeK0nsB6ytVkCYbDetiHB7BxUJdQrPuH3tsi7PikPScun+D0QUMAjOdn0X4atW8IyRZ8 QIy+ZWCeQDUFhOu2W2CDYeTduWdELvmHCMHZ4ColT1HFaE5qhTQxhcJ8KtSYWk32QjqV4q5Y2RSa xRTK90QROcCWpBNCFzCcPjjCQO9+NpZSuOlWb5adYgaKvKLxZAHJCAgnTHKHthQjkxHKWIkTjd1o exda1oEGqQcNo6rBhSZOtFKBfhfTNmkxFOOZ2ng9nIuxrU7l40aGOVQcIHiuXZePDzxytJtmR8pV UZWHWc/Tp6+R3OTDx9MfP717//7Nh89vnWGSfdt1XSemCSP3GlZYSFkhhaVnLNcQqWyoMBlUH7VN 0H2ATjFqJbfKtNq0hhvbKzYTeO2lAfqaQhujNh222fyeGWKGDcJLftt+bcy2gV1erqHYQa2DMucq 1DVGXKQrJobWiGMYVakoOSxAQQEfEvDeVG8kzBgNcJoCoJIwopp/QdumRX14Yi39ghpwg5ovOToD gCtO4pxJmQXFbgXHZq8Ivpxzs1FFtVfsphlnCABOHmE7svnxNGNKvVawwFg4DaINKHkEHs+MjO8E N3398eNCA/8VDsiAEnwd9OyQLCo6dojjx2p2YC3YKGWU1G0oSyYwEK07EBkQlcHASdOig8+c60Dp pKKNF5JILa7kRikOOtTPe1ZpKcJCMRbS1ldJjUetvWCATiXkB6CBlw43O2FBGHEfnDkMwwAizVGV kAzBhVjTuukbvhpsMx5aOM4Ku50XlksLA3WnPiszbJ/GAPdnhmESQ69JDJgCgL2m8j/eB3JtOGxm v4DE4p8O2nzYkgfoq/WgbQftkm+g+9W+lQfN7Gg2nKi+FPGoaNvFwMmjUal3JfhXBMfdkWnVaVx8 4Og44f4njXdJk92KLXy01yQjwG8UrgH+kuQAaQ0jwlvOFOjYTdKzs2SY9IxTeKDzBHQEV0aPoxeF PSnSJLVA9iNphC2nRg7CARBoTl6WkX0t0uwj+F5sk6SEgoHproG8MK1KWs0ZDNz+V6Ej+PEfsEQE cI1bnNvaQADACgFucbvys3pFwp0LGiwNkuz0fp4LuPVFH8cHROoCFCuUF0+rX1gOmOOA/klzqedt BPTOdQqq9dkPJadTU4bfHktaOVEu3h+CfAbPD+e/e+ePd/1M6rEwXp/I5yOeiuDtoX1Tds3Og3Rw y+Tt0m+Wfqts0fouMWnUW90T7o4t7owFJoLOTob53bBxO6E3ozfM8BwAc/gof8/ncPqkN7fTYcbm 5I7pdzZvx/qkPJ9WW1WiDpFCwImnFUcmQgLqRfOUrYsopCOTu8O4iiD2FgXfh3EWxa6iqbXJx6kL pIadF2TnAzEOkN5AY6wnQHwBbjpAxhUw7PwAkRcg8gAE658sf2fz92zzi7VPdr5Y95IyKEmDI+sL ceJgLWnLPnXwwsmDS5Q8aBMHJWWQc11pZcoG2WvjQbxw4jc5kS41t0ppQspLQU2Xk3vAhnAF3vJn 5g6ZGOs1sjO8ZxKRjvyADBWr2X1esUeDPOs+f0ghECvrGMFqHNUy7BkQEXhGBBhRsdZQCN+I0Fes rMnMitoOzCM961+tUFoYBpLAQXKZN4iISGYlIxGii5432MBIEjhJBO8gOAtMAQYGwk4RPYklKLEU JejTpB1TvPnFzrqIbYvR+PaVoob9+6WaEi0wFr83GC3x9W+K0RJ/f8umwqBGgpgHyqkFMVgrwWpt xv+fw0ctJqiqgb8YJb5P3sqlbx0lcHWemeWYyekpSVyKcoKjPK7jNC6r0OpG7K3OFpNwcAd2Q1wh R1qPXEOSflMZOBGlYUiwmynPgDm0iEGrZFahTvmzZBTCCEjvr0nQlTseFJEmPW/xaBWDXkN4WqIw IQ69MtvBJcSZY9CrDo7C0kbO2KWc3VmjqSQIKFkIJ5cX7CTUvf0WktC95Ca/bYH52yunnpPB5iUx +Un8CiUzrQHX3ZRovjCNwMAp5v9lytnLHxB7DuW3PC6cxUutvNqqfANO/5WfYReJdhK7i8iJbQsX IAeso5zikFU8kNmlucWSrbg9XZ28XyO9O6/sAQafp3P47HI64Ea00aZbZJNJ0twOSFw3B84bg5YO NCYcHKO4XshnFwuxVt948IvHPvHYF75YT3jwgwd/QfCSBt9ob/LexaE9cz70YjLgN1REyI3H+knF yfACdW85Jb5jDWfgxPgxCvMvjG/nJPl4idmFFCZ4w5pYp9Ocp3pqKKcUEDGMNSa7s62xDSIIQdy6 XduRf6ojVBsYEr24TZk2Z9tiG/CLvNNoO2gX2wz80bP4hGme41WR2S2cbTKvZU5LhLNhq+sC7I6U yDg5I8m6kTgmWTKjUpFo5FINFjFW3PWQrh7r2/kmj/V2g3v+KdtS154c0AvB0luId+XGK64pp1dF mhXklasIRG5jLZYvYdq5q5ykwSs1EyDax4pMR2+7jg0WzrSzcAZQEycYONa8IbbES8SYaOHdKWti C7oFBAo+QXpbGr6YN1HiisZuYebEDdhmObJXctaKtVXUWpG8PYjslYGdl51aLWS3NOr05GA4+UXJ iqEmflMP704DgXkA29UF8Yx2xwEvxVMa5N9+0mEiXevggM9v/zUHVIFR5PiElR8AzdrSpPWn+RQp oUgDURq5YRVJQGohtWiMiKC3lAhaMKvWbI25oIPpSqZTMF8DMtiQe4NaU4HX26YW9YbGO6T7RNhg Zd5GUwt2aYatYYkWBJxggkeNL4S0oEUtMmwhGTG0S9qsIPW4k6HpixbR8ZyliTCRStgsCqxf4z+u 3G43ZoAdzz0AYkw8vKPwiI9SXwhU5bSvneO+W55bZ/GdBn+6oQ5X8eiBCPHCwBmuutIwCmXs6VDn gm7Kfbs7OxuzObXDeRwqA3J55gGI8uRceS6RBqExlMaLRXmcqV/419Wp6fEIpwYTFiqTC/3kr/IZ AxiHoTdxGSD3vepMPeYvfhztKZ/8XT7nqN3CECSu0FOd6vpMecH2NPf8+1PSEeZ3bz58/fH/OH14 ++njFxD/iYe9n06lvU2ooqJshYQYw5J6BH70JvLu7ImRhBPBCSZgighy78TcC7FPLSWIiP1ppSh+ oLpf0P6s/rdHlYsWaLmzgi5Y2OBpY0i0LLFanlrNxkADzVoNGgQNPGujURqt2mjNU2Oa3slwwztY LiMwpsTyI14DwzjuY8VK2Dd2Y+82LHgiL1bKjJXOhA0OXHzWuWfZ96gIQR1586L0UuCE9YtJgNhP jSHh3Nsizr3SzIwOlF9NpkQgV7sTmnUv6VBKBd+a2hVhPfMYwxXms/nAuZ4f6QMOtA== XdLSbsRvkOlBoD/JDL9k0khWUqU5SWEeJGyMkGDurxMyWkrGSZ27q2VlBEVw2KkSSBrbCLaRI2r8 SVU8uJ4FIjMWPTBgqhhYodRwKEEma1CnGw7mDyyFJD+ZquNgQGFR3GWjpAx53CXtKwNX2kDkpZsw gzIwVL46Se8GTTCXNaY2ebTlxS3uxq1pnzS0YoJQi/lAC5bF8CUxekwLX5fLX4NLfYS7cj+ewKYO V8l1nsKmzg5YeBJTxR186nAEnHsKn7rFzcEN/t/7GNVfefJ/cjz5hG54dGyzo/tXX7cPj+9z1u3V EYZjyOvzRjis22ePcUrElZj94R1ne5X0l36qfz/XLjv5t7HwbP5tmyrOO+qrnfZqp73aaa922qud 9mqnvdQBX+20Vzvt1U57tdNe7bRXO+1vwU67ZofdsuHuttOWd+/fffjGGWNvvv763Zt3Poa2e8sd eXy1z17ts1f77NU+e7XPXu2zv9IBX+2zV/vs1T57tc9e7bNX++zHb5/9PShx04Lp3qHobSh5y6Vk JRc8VxWXMPdcNLfL/EtBqSe2DuC+CuB9/3JnLcG/B16x+6SydFhzA5sZVGAGBFy1OqBhOJvsUEYD aRaqLlMewN3wxYMXL09K3yeKJOFCjEjhwzzMcRhdnYrwBGlzqxgzMhZAbjYmMiflMmI2I5yZVIoh 4nOsIz7HVW8nLWiiPI57onu4KkSZpzG5tXBzUmvarDU4uL2YqsmSNekN0vqiYnbRW7yqhIAh1G0O NZujWs3P1Vqf8Hj4gET5eW9q150J83Cz7OmVZPlczVO4XfT0es1Tus0XvclpgNu1Xf9LbvMFb9Hf Idy8xSfWr4XHbvJSRvsK3yGJJSoERaIYpZN70J7ItUSphxoi2Al8t24Loj/8vtQgT7Se4cDblysi nLJQ1LGjj2gM9q6mlBNjQ5Mw72YKzPe0AyekG3Lo1I+1r2YQ+7Pcqa4b/kemtC2fY4vn0IA8rt+L pkCHu0+lvOOAdLgXskGG3s6XI42F60pFO32kcEqZ9LBDhn3f75E4PocknvjxFWGFH9sP40WOHx/W r7b3d5MYxyaa5lNNhdEbrQRIKHECIY7S4fgLU7J0WzOSBicQGeAQgY5RGKVn6J00ReKLlcpFtnaR XGeh15hepZBkdlSZr0GHHJOSJ1dKJGBCSZ7WI9oRu1NhC2sBPVP7pPGni7SdKRT0cqXBryJXK0Tq 0ruSUu/Z9vniA6e6XH7gEg/8ERGDhPKQReT0oDeTcoo/SQelke18xVM3Xp6SbUAuttLd3OJuiDjY Sne1xL7W+QWNV7G40/tT+9R/b3WsmPDf+2R/wDz/VZnXWs9Rg2rsggosWRfBtvDKKinirKdGKrg3 +lU93SmnT9FEiSf4WpjkqNTvccGcCq4GSUrjJz8OlkUbKOyiZc9S1YRK+kVvF27EhHIFmK/calp+ +dlaKd3sC46qv0u4OapPuFF/n/D4jfpNa8eh9XIR4w12xdTHZ8eLJ99jcGe8uE6Cg/uIMfcYaKeF brMdZ5k3bDWfg3gx0dbejhcHDtqLhgc1Rsy8s8w4C1GkOIkTPxoLNnUWsdJiQRTZx3HC4wVxZUmA UqblosE2LhiWhF37u2AgJLHAuISnNRnS6p0h8CcYARx10GFPgQK1Ce8N45Ab+FDBk8mK3bhDVMBp NBFhN+yPRnll/dHISZRXhi8zeikVYXUzno9R3jCEtyO8wdS6K8rb3RnlFXoGGd2IEg+igL+say3S ysN8T5T3YqO8toqY8luP/U8xfmtZrq7Gb4WaPwiSeCoGWhG7EQRiRarSiogh4OoTvr5Vw6JforcV CvyBaRQlfttz/Hbj+G2n8VssP+GdC776xIbR29aNsK+zdsF6E91PO3p3aDvDy8ZluxJeMrrj9Xa4 5lD/aY/aTzXm+rKj9kNFU+8dtxeNpj6OgnheNDUzds/IN+zHc1kVY4J2lXeR0WcsPS6HPyjPveu6 wNaT+xC/5a+w6uiDrjo77aQJ38p9SN8aBqde0Adtc3abkKnJlftQOIfcoNAH9egrEjcRn9DuQyqV PHqVgj6oOrwmU/k48yF+q2hcf/Phyu7slKkhfCv34Uvldu6q/ZZ9rgawe/dUnuoIOewf4o4mrWBQ q0KUAaHOblgZGCK7UNVRiLTRWBOtM4Z1YkMccXfWfH2kQ9foqmn1aukpegw9J3TyLOhGR5/Pir6f S6Rqy7PmW9sDLN0zpw1SeLLSa6v0Cht9tuYK6frk5+Drj+IvZgOdIvpPwtDJz5U1MtHL8B4Csy5V d1hNdYeRqes7pqlnaRzJ41giq0yGPTTtKTI5lLXY+KrkumZmHh6VVl/I9IVGv4oojzdlk5yBaSSF JD9ccB3xRm7RZjIJW6QttbGZ61q50M4cXd3IVyjU/4HyvzFXiuzNSoppqDD1opUCU8kvLfeldcRk XElHMOo84ztZWlL1dQT2kDgTC82rUM7ZMo0LYvbCETzU7tk9sLMtY4x48AnYlWzXsbuj4AfYB+qy YTpaZJuuz5JXaKUmsTg0pBpvG1YoXr19TugAnkGt5hX9whuXkSDzRaRWiWUmaiziS8uKtQurX1gN w+oYocSqVTOSUrWQqbJ6pG+gxkE1dh/VhZIysPBUTYhoRIWnlQpQ2JU2a/3fQTlZY05uueIlELGC 4WGt5dL14lOKbtfVqdJSIDtdifQEbXv26yMiszv4B9ychaKw8HR6A5IFMnufYTcceJM+D0Szh2yK dX12i8koNo8filSTohw7fxynvFS1Z/orhYKv8LpI75Wnc+vrePrj9P7TjrgVR6fZnYbBn81oMy9z vMcUjzGreIwRpQQaQhT8kmbqiQ3h0ZuwmITGqKB8w0FIDETCLkwWh8pmlHoSKrPBMgmXlVEl5w3i Ys5BC6jcrt5hzQmqONGgn3xGTajCGuADissL15jo0RW+r8K5tQWoG2RRJ0jDIHYqw1mwi7tHR4iv xElQ9hqdXd7JNbMPG2tx+tgoua2935Lcj1HdHJSLKCFJVtr6OR1rQBXGyyovgb0sZqm8sRayAKom BI70uo3XcSRoVtxTIfOGI0sKKllHoLgCxd2b9wXGKUCJFxCMx1/dgBkvYD67I+MGjsvWUaz7ed6F YyMVVDY/A++RM1AhtlBpo7lOtR1KB9VR6aBCRXyoGoSM25AtGmRLBqUFg0hhsvWCIlAExKiIuKhz y9yloZQx0sIKJW4vom5ARzSL4OpcVNZ0fOQgZCxiQWhkbB2dZi+cuCL/hV8VK0NXGYbfZ37/ITld 5cR0FUtpG2oc0fcaR8xsuNEGHCWF7sKAGF4oEMXKBo6V2UiZTaQrTIVGiZMRaE647AdIKjLOWqJz NZUYQwVGW2yxZpSdlNPAkhqQqTcdqopSfQ1bYyMuBmqrfa5ac0PqE2uV4n0lz6Nq1KF+sVbogKiQ cVykuk+a1KcOr6Skh3kNB/Wlr7V8XWoeQbhZ//oJ7VowhgLYnRYY9tbyZqIWAwKV41JQlbdqgM2a JaoIVWqoLLgp0ppdBeeiSbyMohoa+DR1u9jwsdW76rZlEvSOSdAHdPkJqFBCaStToXNEjaKkKSX6 nhbdUqNPEUH64oE/wpNuuNK5eIrwpUurlDa93pGnt6w0dWBY1OUxJG3Pq37MsM5BvohundtVvvWk sIppcPwR55I/oZE11CuclkrXhLJQtiBUZarV5GrVaAFeuIzaJtNmbQt7K67WanrRqk2vBzSv16jN URuTwYuHkIYRf8Pug9DGp7aXC04bPDLcrOEuGJMFMUJb4hNuFS3EeAWgPF9TP1FyfSnbl7zDS7Vp oXWqPdFpTfUZAxoexe6vqAKWuS3KohFtKL9ve5B7gcX5KhWwPeYFj6gueGGKIE2UoDVGmX2cufeg dC8sZ7S0fAu1IyokovCNSkWQMCPB5aUTiQERJVRPHikpGjVT6SGmreAPZN1Lue1aW8utDw3G8Jij ttm2qxZVZRpmCQFXm8m1/qmN4K7W+NibH7EBYmNkwQaJ6tUDh8okWDZGKFXBqMbAW4mbWZQqRc9q j7IsTQhti6rdhlq3nda6zVa6tYVuIUmmsrVu42q3JRrFtuKtpFjNPCpY9xZw+vRc+9bnlLVcATfU wK1wDZUMS72wG5PaqtY92fdu6c1SPkjrussmJjs8KxS4bqk12mrT8KzAflj7iKqpZYrY5KuNsdoL h7Xtl6c3srtv29pH1nbqCkWDG9Qbaq3uYHcHy1umv1jfsgDiJVACrwILlLcr4QZqmxdEqBTdS/5g jN7O14fOVYfO1IeubYVoUyM6VImmlTOzzBijatG0imQltb46kJSOlkVV6SRjCJLUT665ZKCxe6Ts /RwaSJUsXoChDVHrk9ZlGkoHoF/Z1jy14TzkP8Kj0hZWlVYYNPVAN9OCKbgASoxF5YY0K9tH0wbT +qhxCXGIpEwbSZvGSJ3Q0kcZNxCxFFq2EOq2a2u2LVAu2TYftOlqc6sUVArm2/0mAEtPKPtnti7f 4OiD57TEOxa8WSP5jigQwAEKbzdW3sHklL+x8o6lqjuPXWfrAz1yDPSNDRwZObf87fNIJaKKcycf FVLhig/i3vFHbXPFsF7kcI95zoqs66yIoBW6ocoWK1suzQSaUDQBJ60+LmBfqUG+cvCSyJ0UayEx SypK3uAS7lC9ltrkUp18UplB0OAVBYwXOBdAt0eBsklwwg0Kvx718L7OYh+e/6gwdlIDbi+xYUE4 hwuGVArUNmr04TTcV6PpmRU7okR/jkehYk12a1gQldCGt1ahGKZkxSQoJGEhGxSinbhj7V+zwdxM 35J92KmlwPQJJe64ljyhRfIEv4luuGn6bbLF/bDCmtuUz0TZTATO8rW2By+dayy0vWKUpnc94Pks Vgy4+FBLKciP3iAUAkrB4hSkoHR5FarAaBCI0AqCVeh2dTpLU6fzapVO2MUOdnEDgmaIYTvsgBdZ 6EUCFLmkuIv8jVy/jfgmkkKjsL8BU2YUgx5kCo1RuCgiBEvd4MIjp17wJG3A+7/BZIqHXHGbEJ9m ix/ki1PG+FrB7YxxC0xJlKqH24/wgFPcIKNbxv8y3tHm/QFvtfmu5sYYVC3et/WwbdmGCwpUA5fK 2kWsoSN2P9bdU8XXPloqCWpbb9oQtVGb9UTMprn5Chz72LRdpEXu9crUGQ1u9hbtHMlYwaqjQHV3 KZZk0VQGUVWym71lZ5F1sYfKo7M41jd1qofioxVnp1U7F3rHWKzORLgH3IA8nSFaEcdmybPaSx4Q ewayNtWtdsVGA35xvKzyKydeAnOY9JCb+1FF9yKa1MH8CQ87hzvAF/vJK1OVzGOJ1Mn8LLgGbol8 hTQ7eX4Cx4E6jgONHAea0GTXkricVlUmM7OJAj84I4En5BYlV5U6+ywCcOQIzIrOzEuUK0nQknbo IWZRRRdmSJmzVcp7E/cN/AgxDUI/jZDleomZXvy25sMeXtPbU6D4LZc2NL8ZN8DbmQ== bGj+8w03NCFAaY4IUPakW0IO8aLtJQ+Ij+vaeGqKq0l++wqPD3PlanZ/765w9/EdnySPn0oq3usB Dw/GuNvtZduP8IBr3CB941nNPGC57zHf1SYCcx218bAN2YY2Nyx90rpda5PWJC3a9YEBZaFZv2EU LDDR28201TR318C3Hx6TNgnBDdoEydBpY9VS1dgaDI+PcPmUjHAqNBS8Ka/Pql08C8MPhyqI5GcA DcN1zKLTsvpcK5tOxS5Q4dS5cLxw5bCGgNBp37tzQtzdXvKA0615+JwZOsLVqarT9eZs1VkK2cka q6j5WXowPyGZnNIh8ayMZ2Q8G+08rGkeJjNwN/fCvIvnnJ1sMtEqEHapHW9TzC+VYZiiAFpE3bR4 kK7wTOWiaEWWa8omXMYplxHdUY656Z502TjhsgKTbylsoZJqWaovL2UmIvZM5SUittOSMUUHBvpz 2w98wOrpDTJvZgJEBy0TV4YoyHw5bFum5R4LJFvsnLQYoxiDIAfTFMEm7lBpAcIZ0J1iu4YAoAQA QnycsaRBFYk1gEhkJruxFV9WUrFkAiOUgjCKkdlLIneGHWldoK2rIMNaF2SMJYPLSZcqEi0oWMCk Tk0ZuWIo4SKatTkRKi2TIZowmc+LqUsCfXNCj48rSWQrBJh8AGk4j21b2QjZ875OKUmM9z5XeBAf qeKQlYeby3vuJt1LTCTyCT7uMEN5bp2lfuqac9HYjOuXOiDB2vnGzpi/VAksXYNqBIfXECHmEfkg TwJuf+QojwXqmmygrsnnQNNjj4QjLNygMGNJ0SUk3AUTFivlXGoAMxMlL3Fi1pSFUhA17bDS0F3H OdNTBEleMYCFdVoA84jS5OmIwgddV3XC4bNk+EzR6QSGaStmS7XsZBFXasTUY9nJEJ8Lyk4m+TdK uGRSBkKyACUKcHwkYsxUxlzjJtpHIckpEdOodobRpjejJUnUG6ZPE26x8KgmojmrOaeUMr5HTmyf NHWUEkZLZryRvFjhvRkYhDF7rEYYtEKTZPfES4E8y6a+C6ecOMEX7/q29EuSCdxxTa2ZKZfs2NHI dQdkuxVEmcDKlBbxyllmucWkltHI9WbkPKMcog154NCI16z0ONt62eWBX8sEr6JM8A1MVrWE9kJg T7JT95ngNpzXazat22fBBPI2TaqVtFpJ3woJXOUuP1XYWhlaBgZbdge67CANuA2aMWSzuu4hHjmg HgGrBe9z4tOM+DgbPh6lMEaBVWDbVjDUAiFf/9YYpTwDXYi2QmaMJk2wCyl2AfhnoX8W/MepdqDK yFNGaDpMurvAHXl3T6KGgYgbxoySXU+b0WiXiMVgTjDlNqDOIXV4Bkwg5TSIWA1gBxVojFlg4+wx YCCGDJiIO6h2LDpxChzIpBxKdnmSb4gqLhymHOYTDnMczBEDM1gK5ojW2f9LTOuIxI4at59M3b9Q 80+43m2oA+P3YAL4FSeD2fi9RPAlhu+j+MT63nLQw4Y9tu0CnKVS4rPkHBXJVLnWcL4Q6a9wXAaW S62I6HtH2S3p5gcuVTDNRG+/4S1TgcOO/IH+fil1jm6UMt38TU44SRaN6DQ40fyN+cwbfy8VXpmP 4YyuQ6lkyoPZH38F8r8KWF+plWWnUQ5I/3NBepc8E6RlYtUSap65s3f9vDllw0dWF6dMNKw+LEix V7DO0GOO2WQoN5zG8FdlOEwjRWkwKgBgm0TF7pXAB5VswHQ+6o3a9IO7f1TGeietfe5e5bSsgWlI KqdJDW71bcxRrRBpAUlXEVA6hklPx4kEQiov1WSi2isMf24Z8czpA5o8EEqwDJovoAVYQJnVbLGc tL5MWtNKC7DQTcpNpfjvgP4+vq1ix5U/gfq8As2YJRozNHHJDcX1ZLSaDFy9mbhUjimUI3WaSPDE DvG866BmOpPIcaAw/gjID1bhirD8c1bnOtrVdV+HhD8+bO1ZD2Tqg7xKdLLzORz+A9rtnbCSdMpK 4jlBxOivvT3uiUA6ZDFxX+/dh2V9qlt/mGC5P3gc4ofzme31CUlJeieTPCy3ZkixwHLdCzcZR3+o Gk904El4gWM95E+oc+6EOkqZj8DzFl7Pskfx+ILTHxWpOxmk7sI+wA1rMeMWLZlypcJaa1x3lK4s RuaokLJFjU1xEyC4C9hXELKYOwVnjbyBSG6doFhCCnPDyKpeN5YZ1ItgC6KkDMCSmjwrQVVgAbbs zpxZbCmehdF7j1RpBlsdZkfszZl2FagBa4nRpW5rxOptXBHXeJ0VwWKL/dpyvyPjWQxUk8GaQj4Q lL6OoqLuqn9KzMOvB7zngCX/LAUdz7yB3ps1IC+/EATO6sfaKOWO/FjoxGp8EglmFhCji41drMbm SsIc2eBH5gH6asPn9ZaJvHgTkJ6ZgE02ynMUPGIknzbGyAH+6kzrd23ItJF/jmzZTpLZDwoPCOgN e5fhYV+T4XwxZAAFm1olKC9AYlUpdL+9dJmmNAeBNQBNe+UO2DMG5FoyHsaXoK+BKAYkw8Cmb9nM zosB3gcXgc0msG6CZzgKcnkF07qjJILEQRDzEcWugcH4jILXyHLPbU4pYGfAFDn4bPZo7OOLi7SK F8n4kcCUXNqXMgqh8BAIt5mkqcevClmka+JUStxKWc7hbPwb7giBP4Ez2gN50RaQyqZpy2UKX5K2 RWsrtAXMUgzonbBqQ0p8WN+y9jsz91qZgaCT0AayoyhzEjoOktNGhTUKDCb82+tc7aJIbxzjNfFd nbwmqAsa07UR3eNorkWZxIFcnePW6TUbBElAj+xjuZEDLA7ngonn7g2zOKprS32lwCSFjYBBJSWp qM9vjO2GJNP1uU3zDSBJpL2nddcaHH7UP7GxeQFRTvBRG+9uE+ToJTJtvqstcY5zvq13NKMiAP+K IvyGBnNgWjcfkBZiNX3B/1d53vGxKqNE2AeOgZZwL+ZyQUF3QgxoiqoGxEsKk+9TX597gMds3jZr 9Lbe6m2iGLpUuBHPpvgzxZfZMWXvvqJUjfaxKWMDmMIpzOFNVFdKAqk2+F1rCRvhUx4tF5en2hQW 4toQcAmpskkEMlWJ8kVsRptusUriT1LNxtaziYks91SWbNpCxGhZ6uIMWTONVrtplWdGqLbkEShU J4jYVScthpNp1u4Up22prOYxp7lwrfdsn0z8JLryQFm+KZ8zPUthdaZHrbzrwrwuNEISi++U2XlC duoJ0F8oqdGB1/nCzM6SHV1wzWrJka7Q8xhEdye50sBydVQhODChwqwybDJCaFF2BuRsEBYHZXWo wLhmak6obhi9YfKnOMlayClsUlRMZzHC3alQCVFeGSEkAkoioFoaY2l2jHAR9MQoXPrAMAoxQeUn QWCYYJ+bcNQL2EL46jfS88hoBRMZoEfFPyXpW5A0FcMzauWlaU1CPdq8/hXgH12UZ09FClolReiV 059eBzaGkXE6kovvZhvwtLP8EESaO5aWWmLm98YdDcUYE1RA9OFVNovA639PZZWj2iq7mjjA9lNv 4+sJR7cNrt8k6IaEDD2iQ48I0ZdIKzwsTwvGW3+MH96XVU0Lq26C+oOovqqQSwuldCCUFjrpJqaT 5hbIPwKZYMo/uHc0hOo4oTLDrKiXgKbI1T7YzMjaEgJqP7cJnuLOfPw9lS/YwHqGyzcOradWR8bm gAOjQzDsS2J3XMeuu2kFURpFo6nQQX8MK6fY5VMEI2WzxkraDjIH4loWAW0xH+BjLGVBCq5Q2xd2 rAU33SYZ6zX4Tmq4arWmEOec1TrFuGWIYMv3oJVzeGWDWYYItnwxRu5BStStZKU4s+Rq+kdU5F6A iFvE/B2yWLuI8ztT75MjA5zRCqa2tw8NrAGuyAgIoW2QmMBk4gGb5rgq+AMU/THinQX2Bgpko9Ir yEHBeg6MFdy4pl7NsRkuoso1VKVAyMi08lhdDwyz/OiukGCABALskbrQ91gAblLkRMF/pgK67wZf 4Nz3AN6/j4Z0fM8+o5d56L3qNhkG+pF5bwIT/aC7dMs7emM46aUaCPHPlYDk9BdWL1dWQEghmZAw ZWI4gRR57rVaEHHWN6wbEZr0mo9fOOn3xbdj4piQhRKTuAXymDkmcesjEjfFJiQUboHAbdAgfheo 2wJrGyjNoRAdClHbIDH0FypgR65JSNBuzy5fJ6FwOHZGBoL9pxHLH9LKY3WRHdArTVmIExaupSyg OgPHCVFWHKm/2gLZLLYxKiCQLUQTlRGwpe5kjI9GeElGWMaXRtePLY9sxSNr0Q52XGVUZyFEcuNZ IRvShmXdBXWCAwk8jiGryjuTvSu5REokSqfyRlBrirwvaI9JIlXJaVRebmBxdy8YClz9M672Hi2a Shft34NJ85Twa9wqVmDSHNOUAt43kzYobYp3p4QHXrjgtyQYY+jf4Sr7e741mR1Z3wn88F2mybae MsX3ZtNP3oEr/0z/IMhvdrzkS1nt67/fLHgPAcN+rT66qf98o0A67IoWJDXSo1yEsMOnrBUVR/yx ZrflZIoZmbJ8TMTGdETGBIGNCaObO/oKnNWBBEc5OtO2ZttumhOnJ0S0O4HiM27jrg2Zhp4viHh/ esOlErOExm3/UJohSJhE41buWpG2FNEKEfFoaIFCBlm95pttekqD3VvPf6BFC7Zq0t2tP25w7UOu kP2kBmq4H7RrwLe6Pns/2jHwLfwD1dMSH3wlBbrKQFnZKJqNP+O6Lugnr8azUzIzNWGefyhiv5R8 vF5rzPhj+upcPhGvdu8VCKGj1LxQiqtr3Htdb4gvHz2Svx5TlYyiFzV137lyil7p+TxbCjLgnYzj uXH6nen853z7ofBDNoOv+cJPgSKKPpTsoe7YKy0ZehdO9IoZ6jn+gKldNhVvIE7uSQkzEX1nGDI7 TegSlJ3wTF2YSSpA61qmjBqBkXXCFCWMZgFfJwi7mmVhxxi7XsmhRt4xEWwHgR+qY++tKRLimwha JpnqwqPXNoQGHNsIbTpo8+0WXNGlBoUCvlsCBXGV+UYh3r06YEMWHvKfblzEJSRPUtSoYxc+ue2p sMDKDnrJxavYD0/D1xFWQdLyAl7ScuYJZrJQhrA6GttWYZM9m1i8S9L+aRnBlpi7LmEGKyMOuzIE C0CngzShtksf3e12fVAkrzXNQbD1HWhoRvV+u4EBKasZ0dJKmKXnkN6otKyLBmstplXi9O4BTEIr oNZrwFZL8bYfrEoUh8aMWMxJGFO57RkIrZakOhTslKq8ArZFStpBu+XwzxVTPyjea5z+K0RlcCX5 MSrPGWXWhfzHcWdZKzvAUwzr6yiSkuhNi8RLm+O+EfabyehMIZ5p61GwPR5ae9COi2Bou13fPlfh 3sZhbJV7jsTIoISKqVLftc4yy+aHxLg6QHNTrw/IEUVDNCC+wZ1URNP1oQhjAJlhyHf5HTSpr4Py 4xyU4NSaVeDYusUSXxxNanWgSdoB1kLcCLKdtxcznYkTZbtQIJsQefOOKI66KcDVAg== k1bKooVzAAwdSRyoFHxnw1F7S0wSKI8k00hikz2YsGRjgpFlVNx274S2buiojggc+KAn8UGb+jpN lBwXMsii2iGA9ObW96zeZ/VGBPdzcECHSiFi6bM5D6bcTjDBQ/WPCd2Cgo8g/EQosqHFNUIhDdBs ulA2w5bKoNhuvtpOqHdhKu6AAlhtsZ0QxM/X2jmuscMVdUxVnWzlnIi5LsQ3TRulAf7qTeuS1iYt 4yCxDfTlDT7Sp+Y7PPlBCQ0jiubGSxQnjL08mZw08bKkRmm7OSERy9YgFjLIbcgwEAWlYbf0FZxg 4QmTXfcQcRFZlrPcwl8NOEGXvq58XCigKIRSmc8EapAvXyAwcCkkVEsMKpTW2tgLvLChFouBXCxK 0kkz0SiIwlFtLhzFAiEnDgZ1C6o4gF3trV31rYiJPfBI50pwYWptXIMrFQuxSAh1ctKiOCoYQNJX M3W4srW4EtFgBQSXkomlRK4GV50KC11/e6FhSmtdkxyjaaEmZlZ8wJMlSb1rUfo33EFK/ANKFtZK vD7iNBDUPLy6QeCmFmVHYfI9LKApzfnYxf9ydJvquE0oEUMmcsnjwuICTFpILDECRWJrwEuqK2iq 8sZhGhIYMyQqQ4hdS/TaxK85xie6g6Qzhxi2liILssNGsm0s28qPfa59x56MxocKjVoRhThSOTLk 5MheiECiWIgkiaXIXo6E+l22nN8FS+ekpboiVSOoGXFhv1TRSMtoRTJlL032MiVX1q8VWKSVKXlZ kq67vRKi4gR2EmVXePJVsljJgtVjF6dyeBu1dfPQ26abs0sntEhbNyFLtEFn1G7IZqrQXlqcvPAy qULNxksjt3DBTfvKiaLVCZ/BLcHazQFvkPhwfu9WUu16fENBMbmF3bp5XSIiY3HrfUCzoOJCRn4V j4Q+abl80YoB+5F1+9rNmgsvtsktsY4XVonLaeXyRSOumEaoT+uCFO9Z2U8lbF8zHrvgSR0oLHrm fSDmB52RPANX4Plm51aYT3bS2Alyhbn+bycv+PWArwfMfZGd+NaFL+k2uZhK7LafJZaiiTcNZbFF uTca9CLXfM3++D5in5SQV+AwbJTDkMNdexBIZUAgexjIZirwSPUdgoIMEFFHSKWdUgEhjSba2Oom CyfXSFZNxeCQxsObOkaIpBVOLEK0MghRqXQyKHvEbFGikIGJxiQSMY2EVPraMHk7oEaVPAwi8OjA hBKWQWwlVJPyiJXsRxM0k5JLYBuAwaWTYpYCUmlTnjHBJQUwkoUXBeQQY4VHJiKbGFRsaQYMG0CU 6G8T+SWVn5P44+T9kKQ/mhT9NC9/n5HPmcSIt7Yp+JqBn8vCv5aLr1B/SFLxh1199n0J+LRFUDA4 SNDPJ+tfb7vi9c/iPXuVLK+S5VWyvEqWV8nyKlleJcurZPmRSxYNPvOkvuicrmy6llbbtbN6Sma2 ILwLW39XKN7CNKe0Li8EKADdo694QJ/xqHN+5KD1wsjwBTCWzakI9PTBbpOUYEkv6iQtocZnKIjF GWM+AtYTdxzlJ2j2WFgoC885k3Rgcg5CTkEDaSqBAfkPURuTlsmr9A12hVOyDTeIiMkvFW8XZvOz Iq7BpyTvDSzohNhvApZ0UpOS4f0K8fdCr0a/fYP+e5kk3qNPnn0KDXpPP4YKKWYo8m/1QQHDdxzJ QUP9LOKw40kycJDS/QSeJwtPi5XQD1z6stbhllwUKuMi2I8lSTVxyxEIqWJSMIODOoas5bJCcokd u4HOtlBcPc/P6H+GjWtkGorJbl5OYEpSZkEJh8ABEdrFGk7WoNIR/pXfy/xjwVcrjvbmx9qNsc9P LHG8KzfaNY544yMzLcuE2g1v4wa3dYMbS4ZYOqh8cCO9zKVM7LnyswCBOW7IvTPcD3+HE6BXydBz LHpmqTDrPrioINhUwrpRh0QKWPxhXBAvLUp2UMIsTVY6KoWG+aWEjh0kzxSzTBsEuVKWqVOLmFS6 Q+ZPrwJ58HHF2aW+YAhqOlRuAlC9odxSUmikOIiUlvDLWcpKSF7phVWRTrJKWShXvnpZgx1LXbmY VBvpEX8zC4k7FHUy71uTaDPylo8gSakVW/K+3jJ1umzjgkwkAUr7dLo7y47s9l8h1w+M+2HPjXfY 6+x82u7cGIkD+np5sxy7m5Q4m01MvgvR+EpDaJbzWVife2Z9ViJrjo8J9/MShcJ64oDuOAZm41+F hrwk3DVrfGA04a1OIwUczwITyrLhqxC2iiNWcYQqjU2ZiFQuAnUl7nQccLrTzfs6fj+F8TsevTy3 4tHoMb8iGBL5dPQGHr1W8S4lM69bJvnZBKKZ7KjV8asClOWu8YsxKnUYPw0kR6FjO37z08YvH//9 K49fqOHRR41QZPuarqTslUp543sMjWKU74FbZAaEi8SQkYDFNcCRKGvcbVOUrx9jcenfpLJryR16 YZ6KhcEms2bxE9yEFGP/swXWmFPmUQGnBf7RhIGUkiHjjMUBtbCQTCjYt45PUrOiXrLKXogKzyfa wBAKjBEUrjWaYwC1KAaOrobO5n0ddEw66oThbwqA+xB4oCUYOHW9crP5wmHwCbFvLdbbQcyrhME7 txArk64+IHC1cYvHJqv7RViL+iSEX61JXwmpKzZXLC7aZst/afo07PKn906offZ023V/G1fTZa4m dtDFrH6hqB1mK+/r2tnc8sPrsQs9yh7asrlDkjYU2PFzWXyczwVRCl+LlVfC5ShDvpILXuPGR2ch JN7CzpAIJqz4hjOwNnXcJAWebS5ArXtVU9r6CsWM7tSMHtVbKBa0OFdKdq5UoB7DnG9lTryG5DMs GMVUJQ4VtJZZ+hL3a8zreVQC4XiKT5wvxrliEFVBqMzssvNr1OG1gxuXP+BpDziwMtOYO9LMt7rL MUcm5Q9498NRBk5Ls+wGEzMcyFDHJra4hptkuMnAXsDY1xelPKp0wFMHsbiIlwPyIxlwGp8cN6uO VDRaJr1vN146YrCTAyILrGyyHJ+DLseQUGuEArS2XsWe71Mc+JsyfloOirA0By6nyGwUS1RVURao 1K4ILn27UINbf7MUn5BUsdj7SCIHf0RcZUdRxxBoEP92qkjkC0XlS0P1UaaqCR1JtiooiyhV8tQk Vay6mhLNUqLwxpNU+GW94PDzz0uKEnDKEcsWFdUqMQG3x1zsFVd7iWU3PbeWnxze91GhrPb1NZd+ Q0otT6g1ocKDHg+qv3hYsTlUa76P3YjzoyDKwLTZD8pqlDDXx/UPO5P4QJSMpnzSNe76QA5l6aFs NURmiIJMQcSUKCpHFZUni0L2+hflrq87IIvqdXxex+d1fB4an8C72L9AM0QVYP84aK1plpqoThp6 RiCieS0jjlebOxGnW6XpEybhKmRcrl2uAFxLLGlsbS7a//ve5573XErc7b7LyduUrRXzxGaq5YD9 w2SKHbXFtJT+YyJlaWIekcEkmPUm3zSkmhniQ003iysYRulmnU5V213bcyarlCzcKu7W/gWaeUB3 +2E5OjI8WR3by5REAppXo+Ueoww9m2cjmTZznMCr6XpJrk2hHXnkVbadmXZnLyUgPQV68EQSj65m kTzSTDos2D+SLLdr2Slphor6IeEoSSXrj8x5IX/gRAMKmbcv0K7K1r0otg9LKZYWGMBNWDwOK6Ni LmrEBDPGeiBa44HYG6QRYqlKyvQFJt6YqY95+lKaPiHpAy5DPCBuYnnt1tdu/ZvqVtWzIulAQijU WLZGdKB6UoI0pEgruZAgUT1hFQRheqKKG5bkqWYYZseMaYLCjAnTyNtDrt4JLAgzqdrSJ76czZQd rbWK9RDTWoNxojJfaKALVbLQWj2n4o5ZFF8Ze0xxQvV730lcSSPuUOnUQT0T0q0rhsHIN1ECY1tr 46GwPGej6WYCHEopE+lq6WyGvIJBvYYyORb3aqnN1NGfR776bgdbKyfjUp+My+ySOvnVwWncm4Au 7Ac7M8zTVTq0LEBrh0jxGCn7Ebp04lRZ6dIwd8uEoMx1JxgQ8SoTOOnUGE6cAIqjjnXdCsY9mWPC bZS07RhQHPHhejUyMzNfXq34Gzzg3oGYk3qG4s4rj2so73DRQphS4kHKdUjBDluyI3CycdEOU80B CxRKzY6Baacs8VRMPbVmOdoC81RBgL4top0KZSyFHLw05OCzkoMLNXjD3otCCJCC4+KYAv4JJPCA XOGvnfnamT/WzrQB34VNVkHQNIKdEWuVMTODQmU4dR2pnyhtfURqp7ZsPPylRMDLwoWxerQWGyRN KthGM1gqQVJ1hghCjk7wG4HeEPCGUuMbpm0oKS0e0BKm8w1sqdI5K3vWgP8ZzDlj0JY942TOSOes FNXDifgzm89HZy3IKbsqy3nMc75jOucMiytU59sFEGhZYcJDi0kNA+YrzIiZ3Bj6+L/OWXUyo0aT 0q1KNpTmQ6kWzjo4KS1UjWUwCr5/Uim9LVLy6cA9ziCTakUHuDB/cqGalairorA2rGMRP698fUan kJ8tyl7KrIxR0bLAJdhFbIIsd/Aa9Kv2yyK9xt3X9wc4qJllqSBzpKkrH8DUF22EnLvmIqHKx+0Z uZkz+9wJTTa/2Jf4fPA4RPEdMaRX/dkZN9VpGM6ePfmISD39NyIv94Tnnt97YC703v/dUuFR18LX +uFcOCPYsJU/+at4RieAnCnhicTL3tknlmrdVzZt+FmPnuXcHqQ5l21fh/M/eiCq2CrfDT0vNVZb qcVa6dONwniu2rHac7c/eiC8GiVZx4MhI72bI81IFWn1Gb5dl+fG3V64jGcfgcj1K9eD2Hm1f+lf yE0UPMht5bp9zLxwE8uNeXP2gXnDsf9SR8zMe7mFEkn6y6N5n/7bE3tayg+ci6J9Tj/H5QtKucdC 5qq84/9/9GV98QVW/3Uvel+RwB+mcyfAkgChWPHDh3qMtr/I8vYXUdXgRHmVaoixApurcmkrXJKs RzkPxBCJUlpqWo6olbJOyvqo10WJ381roSVHdUX5JMUT1U5ArXNSfRO1TdQ1RdP0wUkfWbQVsIiN Ma2ShJFA4EJJFI2lWOyahGEPwoAchrFBGKfNQghoSeEkhvGL0inKX8Xlk1bc8AcshNpEOqzX7ToI Cmxkhhuz5NbDD9yC1FcT0l8NOMp+fP3YhjqXaJZMyIc1mAqHvKVrCUNKcJuQJ0uYsqTukd+XC+QE 9SO+CSpgQrrhUCesxSkgWIAKSUMDDiBP1Iw/wWACBnTMdhEmnOyYQDscqIctvblUEmMKYiIRlJ8B HT4yepJQ4rbEWGAmDcXGlHDQkpQKTSlBpFEXFCY6r8r5SUB6m8wDKUq7cjVlcj7KI3E+AteVFy7/ hdOiA8yPPGUpEDMg+rx2a+C1wPhai65lf5mpkBCj+PoYd2lKX7glAJyM1jNsb5SkNFOjW6pzE2Iv IPWocfq9FOO2GD1qEleQWIJg9CgxttCQgeSq2trNjYfgx+VvGJ1P3r2jBInwemD3aA== HNSUoKeEQ6nk8gUYGldxKYcqKugQO02l1jbV2554csxoGcj0wHIPCxur8iT/qqUslN+STxLTGAaT 0xmdYHgMew1r2zSTUPnR5pisagYnzHCg8dtc/s9xvshT/Y+0viqNg+y4KHZMFDEPReIyFg6KOAJy 5IfPAO3zIRC4UjDtjnJpPH9NrTR4RrG0g6AWpW/C80ul5SulgbWpg0ltbNaoVElaF75nEUf26lRd LVwCCRD9GhTdVphhSajoZsWj22IlncLSg2zMVhA6rCHkHqBCc1D48xRBoDnowFEdCT0IgD0GQ/eh TlCoBbQwnp1FLAtZAkZXibAlcLSFR0+gyQwGI92Ti0WFclqHLA30po8Uk8OllEBpbuNWJ61KWhk1 gxMBZsg9xFVloVTLMXwKlGA3tLSgWhz1voI+IgRSWgfoCF9kUEamlUkrIOFsZbjWYSz6BR7XDphi x1PO2PhqeQ8FfhEjgSx6KIYeBaLtSxkeIaJbgwZ1O6wyNpgtVbP1OB658A7KulZomI3JfjRQFQxF AyW8babFDAwhl39flTAqF6hLqKXCfIJkkCIVQkFtSagvrNzEHNSTclArcz0o3rJCi8gL0pi53sIo pwRA6SVEwj0dOOv9QrHE0wFEaNimI576gHrzsq+TIrRSsqLQksK72oaimRHOI+oR0x+BwX/CjVP6 QXuhwh6Q+ycYqQBIKRmxx/tu+Z4LLzm5ni5Bd31yortJYMiov8+CuXoXvb+eifd9umJp0oql6oak LTaIH0X+XmBymQkpfHvFQVZsOa4mDNJx2KA2QQOyHykM4heAxzewEelLb49S1Oqo6FVaijO0Ktt4 gYBZK0XcdsRC6WONGtMwAb+YozaZFi055XaiCFpoKuiBLdiWPduh2RKjmtNmSgdYxu3A/7CBXjM+ aFMM1E6XQLEdsoo0N6xi06WODJgYR9X7QFmfYKQsNmox1s0W5SEVvCxiWBRbOF2EjbLoqDlJMLOU TZxXmFCRdXCDt2lLsgtjLp4MIRnEjGTYrcqhFZdTlIKKe3UoNTMTbQhM1WKrCrWsjIsSlGb4BeI3 m8rphggiXqRA+lYaLT3UNLZVja2qbpR1UHK3g+LGe439enVjiHV2qxJEaVcLJ16V6DBo4+iUAYcF hFIwitgkArSJjEWUWEN5ONgVQwgylpCxhaTq8sYSFpVuU4E5/Ez/3n1DfrYFqObOP+lvo8/vf1aq 5+9/1sAGgP1ZM1LeY73RxzCqv2Bi4PTCAKuF5I8zhk1WnfstNA81uw/ILGcjHZQYQmgiyJqXKLZX e/yrxUCyZnUJbOx04roHfosBowlJKaY6+KN4czFhvsMYoUEmWFyCRSUoJgG0VJBAEpabaISrWASw YARN5anEURyK06+R53HmsofHdc5spbMqrnQGmqOUlooLZeJsiThb8SxUgasD14RWM4nKn6nOSTHU hqEhNcdJKy6cRxRkBRfQu3C5yY3jpysXnkxTuKZAWjWYXK5eDabAgRcKyNXKmSUqtuQFOJEFUk9O O3tVFi6f+BXFcb1yWfUnDNnQy+JcaDRHyh1rcKXxpZZLjr+WZydXTLTtBY7FJZs7iQq3VGYaay/7 +GaNcU0O5tQUY6pOXXlu66E9tdW5avqofPODR6IoVVOWfWdLThccvvOBJNwZTZXq8+AjnjXdV9ee eyf5TZjq8WNRbBKrXvvjSEix5AC6jfx2/mQ+qN5T7+/j7w8e56GYWZsLmbW+1HUnETOT9x3v9IH7 crfPG7ec3ehxqwfe60VNGnTHF/1oY65WYWsNTK0dM7UOTNKKegAoKWFgZy0N0aTlZSVeSfHqBTpW Q8NKqllK63FhHg2ByIr3cw57PplTuuvLzu/3/RHM5m/9oFYDCLn41itqPaPMU+hHAyInqdBQzhg6 lGyAS+QztSkB1nuKP8m3TH7K4F/uI5R9KJ1cR9Bki/a2tAkIShZnonEhRq5D4S0ZIh+h9Q5W7CZy vQ5aSnxA7r9Z9V8bbLE+QOv9m5QagegBt6fAm3OEAVnMr2g7gsi/7IimhWZ6iSimW8YsMUkAI6mc rgqqqgpFYo0BrFEpAgrUuloOU1mKRCJIjCgCyKCbTQ2/Tuv3VZzMG6LHktAbKnZqmT5mHEPHAOwo 4/K0YzaubBP8dqxjEJGOBcoxk+anZHGD1tATeKMFGyKEkrwuoymBFoqf3ZkKvcuEdmv6Vu9N2d4r O8vXZgLxEKVEHyVF2+TIo/RIDM+TvpeCYCMI7NM1TjiGvyYaZ5w1HueMG4ACRJnKx2yE+WzxXfqt tQCjYuq2Xa2brsmXErHk4oze1gmBjhAe7tjTP6AMG5Gow6ZXaLRDTfwaV2fr3WyB8SWlY7LM7RJP syQ9akraqBoMlpVnF1gjKT8dNL8e5qjR+7aorQTh6W+k/QOOyZMazoUvaaESw6NrxBZYa+Sq4jQt iV21uNAHimCBCWJRCGu2ISwNYNURZ1aHQrHDzYaiVzPODicigXYdNuVLw5jlJxWtk6ioZtpW08Qf mPu/8Ik3KVNnO1mbWnEv+Ytee5iEvGtqfrr3ILwZDFf5zbZrsftNP6vdZ77EcKgqGn6S6PQ/2eid t4O259ReTJsjy9JU0QZjYKa1yFMDszC2pa2iHaArbh1ARIShVBjKahgq56bi3woyI8rAkhBG0h/l GQGxpystR3gcsyRbHmVUX8AYmdfNzCIDIVpNp3Nng7Hkuwg4tIcLhe4NnRtMdS41CpmuXUPXBrP8 nlZfaYbaCxLLPrLwNUffshpvO3tfLH60+iE2+81YxeMS2/12MOp4MCAZjS0ejcgdGWqJxNCNGLgR wzYCaCNJnmzIEYL6JOmUvYJpBF6/aCETAdnTJchlBC2fLsYneeJBJWe04cP3eIIO8TIBszOyv03g XDN72RYDwEFoToDeNwK7N6D7Z7vTCI7fJYh+OfimCHsLy+8YxVfzrCp4zmhWER2012ylVkMpVYT6 vxzA+EcGZfUWzG+ngT/KLmtgiPKdyqgHaI72yiuUOBRhl+d0W8k7VvN6H6LdS8eg5h2KxWM1Dwwv UB+hUFMFL1XvrHJnyEBAgKiKQ201rapIkqp6m1JForvDKqdUwf2Cq1V6T3quwL4TfC71GvVYnfTZ 6Anw+girK2jdla33WVltQ79VSBJr+25AzQ57D3Y68hr1YKdKsqX0sWpyoigDa8qkLe9gvUdkNcb2 CgjfFXlrog4Ww6thx7nN85pYSnCeF7lWQoCgNiGD+HeIOMTxh0JYY0IEA5Ay98JqPFHJhMLNC3se ZrSW5eeIBHvUFdQdPc8xb0LQL9YtfS9xHym1+YV1UeoxWyZ+1CK11HvYg4CSnSrWYkfazjS5epMC Zyn7qeOEJurdOgTFgfKgGAVJgnZhuT+aLheAI6XXedAIxpQKvfiJA/IDDzWF5QvOTtyMkS3XQ1ci JN6oHAOfO0AqYzBlyYmEMYxy1ozCIcJPutGEOwCUL4bmedbjsWKqj2I2U8gmPIrZTCGb8ChmM4Vs wqOYzTT+C8/FbBI7tO3eow4+QsVm+hjYtM9181FH54PC3New6+yj7j7o8BQlC6amWq7Tj7o9H3j3 RDDZrj/qfAOZJdKzHd9EQkotlLfX/SDKSg2HSIa4fp30o/RkgMtbKAODjqVLpVNzrDopr05gnQ6w BuxhYECIVKfTSEfS0dLVvZahkwJ0m/Y39jhwXCN0+sjxDIlm2K4XvHK39RFV4hbRctOUkumUgq7D hBqi2RRiO1gwJ17FUxTTKU3lvTClpNjess9tBq0VNRzcHzm1eG2mso+mGC3IWOqFpdhzxaBI3IGR dzRxfPGgW3IuFXJhtZWwk2/SKzTyrjcYL75LhhZzkQzGyRDHbFFMplEguCG5B8ty7+WdKC8ZlusA AM+Rz5PtvoElvlZvafCUuot4Om1MnlEliq9ARKoSsk+ux1hsKc+QOWEIjaQTpQOjWIuA30RP31s5 qaoeK+rCNhl5tPcUqPeQoO6ZJVVdB9bX99q62kIU/3gClcU9Zh5k3PkP+fLhNpcmxTQSIM3O5H1i ZAN2vfGs/gjdARlK3KRPYgjI4IwPj9no3FpvWhv2Z4RGcS591qx/UUmWeUVQhT2g4EWORhAHTiE+ 14KZKDWnuPG59R7C0SWghAGTfU1e/kNHoeRoQYmUTj4VeATObrdIjZ7xJQGy0fvX7ohdipN5qQNy CjXdXiH3UtAA2KznUTp89EnPmG9fnn3ygL9Xk0H94JGIQsEDfzygpJdU8JqPW/GN6V1XdGMefoP/ il3fn51AbMx8epnj0YwS4E8Au4QccQUDBbALzRg8jEfKuFkcptXDh3oMOlNlsTPVF8g0weCZXNZT JuOpjco/WHBvAm+AULtDKzq3nIezxzl4PXKLYoQVlkQM1VoQ4jsoBFuA14GH0vsT4notQ6IgItwX q5yi1UGBAoFSC4o6IKiP6zl7Kd6ximSw06D1nJNazuTMqLhiQkDtblw1IVYJVzWFm0ghDLYZqoOQ mGXScaQMRqavWg+kDhpQlFpfnY9PGU1Qra6gCM6JItgYSysoxMa69fWkc8ZtG3H8UPXIkI1Yc7Xm XktD+oAJVkM+zLGXaEDJ2bwFZsSWDNElnqYLKmArZmKszIu8cH7sgARV4t7pUY9rAdU6/6zYuUPu nCe6dIxL5blf/IEP6G9T0sMGyv165Vd8+MHU12luNTsNSV08iiPbSPLAeZ+B9iDUv0vYDkARyZL9 FnLeBo0xS1JXo9GUKkly2wR2BFFmVyhJp/ldQyhLRyUEuGqASXOLKgaAZrDafLeQiGpz3krNJ7WJ b4L94uQ30LzPkAOHaZzUwS+ELRIFHB7Vv1PlG14KXRSHoNKAyT5YkouT5GIkAxjqPSXe8wKVAusS 55bItmDY4xIkaQGSwxIkkOEeEez/MWbgGJSxQHY1xSj/UE2yzID7k6UEmbUkKylaS9FKWo8XEuxW Eq+j2BDrkR4K8fOF0GYVHp6NeibRifmP3GaGvFBGBR/dwMd22EscDJXmWjTdyv9HE9kFndApKd/X QCYdWXL92Zkphibq8UM9pjR3WaW5M0pzwa3EFsYmJdGKjd78pxmOrqE/Deem6o++qZ8/dJ/Z2+wi 0wC3rwo1oZZVAsINI+U0+7LIk6V+LOMX3LF/gPFimUBS0DGEor1BlpIWVbKBfWoTRuPEn+Z1ykLV PbqSWv1qvRdXFmbCJD4cYDdbMz2r6FXFryxxcm1e+WdrXwH/2eqFkx7JGb8XpKtdkKR2RHraDrm9 asziLbJ8XldwKHCF+5HPFc4WzhfOGM4Zzhp4xAIGxp0d8vSRgfdq0/MRDW9MxLun4k3YzDRN2T3A 5CFLyrG7sFj6qfWufghO3TkxfZxIsREzVGidtf156NrKMtE9cJQcq15xurbOH8yA6frsUu2/wOPb tVriLJV1Y9dqqX7n4HUWbH/wORu4FySJqHu8V70L92IkkuLHtQIC7M+KcxZrxnhVjA== 9ioN/tOAPRU/sAFrI6v5GRBci/4UIiXSWtzP59svEsIvNbivTn9gUo1WUQBtgAYoTKCLyuegrSkS 4enyYI9MM7gseG6eJ2HJQuZ+oJsLqfo2PT9Ky5d0/JCJT2hGULztpJAzCzrrlfOlNZx1TlUlqbLn PMgSHBwQG+wIDWBHZpCnMtjRGERyJ8p483KBCFK9h5MT9EbSpHay4GnfI12KhI53gaO6FWX/9eJJ HCr2oQcna+Jkf/A4j8msMSuzRi+zNG/vmUZUzoTC6AXcaUDlzSc1nkwsh02n1HBKzabYaBKTydtL ZC2JrTQDA4oCUXjBiBuiKsHq6pQYvzIwbI5AYI1eZs1hJ7nYSQ09LeQWyC8rRXWRzbdGiK6eCakF yyViOeJghwxcTixCsQqDXci2oRLSCZJKmNJbHy5t1c2m7jXZPQhGVulv/yw4XyDsDpImL1R8s9kC JmZkGT2f3mR4/AR2JjcQboEhaBG/HoPDFCC2Ed/8xk5FuccV91pxLAbnYnAwDrgrk5NRtg71MwIr mKU6Gwulj38phJPE/uGlEE4HDBf3s9LlSekuLRzSyyfcHXJP+6xeuTGb1xuSejWlVzhPYh4Puc8Y /xFQLhe93R2uCPSu9xT3BuHCdy/3Lz0QXOHCdt8D94P0ROgLS9YSQg4M1ElTknuTkjwJQirOSQZF 7lRRUrKFt4SUZLrBVVKS+TbDjXogm95tj9vqqPcc7nrz+zffeUkkgnj3dP8d8flgF7hOAOyFGY0N 6omkAAArbLUaj9ZgpVpesQq8koppjNaIkAWO6wVoLnGA5e1Qj5z0KlSDk89CXUyYpzZZ2hm8o7WL gxXeGXuYsSVqA+exJaGAQeU51PLknMcwzyOgZ1Qk6zY1JwI9b91SfFMWMGNvy4Bm/I3Bbvis10EQ rDkE0qT0k9HtwQ2cZXSTP5UIiYlMWFfC08yUnKHCngN4GUqakD4CT3HkP/+WruQEwcENPe12TFAC nhKV+GneksryqEhhHuy9V4Y2jHkXEViUlSFItKFbYO8UJrpThQAxkXuK3jVGweI+GgNEZee8xABY QP2gZQSsgSALEoNwGA0GijoGCFgsxoJgAUM8a0hnS7efJIyzo0FiENWas7e81YWhO0Fi1IzEGBBn OigLnutsYOK7kkk/6qj+J3HbCasdwZMrBF7UCLvoFHZBoAs3gXFJYxyHaLlaqczcobQV1gbhHggF mkOt65VzaWbEhQobAbM5EJMwkRJoZpFaUZsWw5o57WRSqgLK4eowKbzmNHFnUIGCGFdOOB+1ulTP Fa1qNmEKTb1e0FQZ0UTscWdrqOhAWQIbGRvH1aJyyjGzR76lVK/SGAULpnLzPS1f89k0OeDRee21 7QtDp3cWR8p/MEzoAQISXQgvgQl9WgQWgjchsILYQOMuYB8H6zPhxSiyCEmAfhecT+LycUx+H49f IArG7+PwUTH7iI92yVRid18BKcTOSO3xhR9PPeBwq8Htf3laMweMcnN746E9SimOM3bTvXzBKiC0 kzdgNvKwjYdNXLJMF929uQ4M7dtkh3ppK+Qbkja3cXIqNQm5U7hdwuwSYqfQuvAyD8AzveF5TpSJ F0OC4NvEHMODmeG4+klsLhgf9AafNxp80vcFIx0S5xCTpzJ2nbcDLkhfFMovz0TMAQrX6xOwXsjd IPvtgkxGNW6ykrXBNE6xwBNxbQ2ghJfpesaATcQIaRhi/kQpGJERRPwmtc3leLRig9rAkEv+uz/3 z2bfBgqblMam18rnoyHvJ0IbAbMSnBUhrcDxjJjKNiayNQxeBu2KWhYJIMvLIRtQDMSXbUhyqTsF crCsNfnUS0pvFVM0ydYUJ2wYmiYrEnYEIuFS22ifiGlE7GW29jIlmyQLXqKa9QGfkm4ii35Rvhoj nyrdPATIheWf4huMclIowWXLbE/9Pskl2tLniOAqorgCOnbMEMbbEBn0lGWsrv5Rc51rdAtbbJQk FMcOcEkhZlcwmAqhrVGNAgbw3szXxBY6dArDNa/w7TM+o0AKXK2Rgme8O7/3iD4qPuetMxrgwAMU li9DhJmF+rj3q2vIgYpDgpLuUWt6g7yjaC09KVbApK83tobmsw+BVzBKDLHXYKKgwgqpTqikrZJ8 0UodSU9MmlQcfLkjPqtEJubvPL8wJn39kbGJC5w+/xgPhWmzyJI+JlfN5XEfZ3Jbh0rsUqEQDCbg tiaHIqQbayTDpBvbUIwlVp1CQi6gg2qLaFUrjV80JoLRUzUyJVXV4JQEakj/EEXFqiprQq7aqhgL xdQuLMxElLE4A5MILhItR7BqKVYl28Vk1RuOPNzSQ0K4le2TSHgcoDj6ZwtT8XBRuDVEPSwRvSh+ IfRBqp/m6qKqLPGA4DHngl2Ugyv5t+I0b0zvBgLCQKRqE460lgAYogLp6uDbssWUJMGIenxmtqwV XVtUue4Ob30Gpb9L9pX6cxi0AI5aBKU9r7aHMIwo2ymZak35vWDIVEsGWg0ZMtXhXjLVaacxVVfS gq0bJMZSsDMkOOaCP8SCKmJUep5GVfxsRASaJgdH3hHrH4kw6ruK7R6njvr6nkuvSpxG1m1kHUex 64h1YNj1XnklqfqISHW2RKrdYe8dk9AWud4jI/wFCVR9Z8GdDra7Uxzgr0SgesTgdx+BakqhygSq dcbqjO3N2M5M6VONFAMryIynHn0FEXVIo/pv0ICvEq8cokBIqu8Ktpk2ZNtomiVdxRUIzLRqOVaZ X5UdDUqtaqoBErFqoFWttSBgA0lNQFsZUOoCbrTXMLUV7TZCqdoppSoxQQyA/pp07ynVAeH2HuqZ 5qC1yB4VmvLq6qct80sJNSG+A/ovjby1+3v/V4cHCDUWu/AK9OX+w/h3z+UZpUhj+ldLf4G+2Zqf 8g5ey8uQqaZ0qkymelSvo07ZPg/pVDVpBwxDYKP5OgVLM0unOqpMu8qmDSrZDoMHxMo3X2m3aVZ3 5Krw5PodhU2Q2tdIgShJqj9MkgopUnE3R5y1VGHqWidjKhTlfqXsp0etuNYCRypk6VJT0tSYOHU5 GA7sfMgUTnlW5wuTKuxGYFen5i5i1fWQWDXjW2XXqmeLRtdtr0jGQKs6cnViYTndtBDxhVmTU3JV EQW9sLW2OyLVSUE3EwPtQ4GizdIyK5K/llP8VYlVLfOpxEBsuoolVrWxED5RRK3qqXf5oLcIVXN0 qhGZqp7EnSYK3oQeuPBxJq3e7r+974OUXFVyJakXTMgmVv9qs8RjBbDfkasKSTJHXnLU088mVwXW Ae8jV+1uk6uCMSAy5KqZiGqGXNXXui89mwFjVyy1akv0qlHQa+QtR/psQ6taICu8xzQmMCC9FuqC BtWZyVV3fTel8WmqfLmPUMcEq4UGU9OeVEUajCYtNTAFTF6zRhXMikXBD2m8WmPWgLSb5BbPpQ6n 6cNa19xLlZRg1dZkq1j5FipVW7NNyr1V4XegWIVQIS5LtBpgIeHnpBCRifn4B6YWQ6BIp/plIFmt VQMtlKfsonSrQrQqQHyucSFwfOlMIjCNu/TCgTqaujR9KegwMpRkYJC+0q2CSaOyRKuSH7UoBF4A +6PWkm+FZPXCFx5IVntOG6jp6lijX7j66cCBEFlWNaHyJUfL2uGjYusFWR+iIwJxWWVT5Xr1CdEq aKwkBZA8k2j1xwXTJFvkOeHWK2Sr8LSA6+1gDNwf/7kvFQEiP+QLpCJAhL57jGw128G5kHauj7WX wXRzrqNzXZ2LfGW5HnMdnuvyXP6H9joceukNIWjS9bnOV+wjhO7PDsBVytXrhKsxTW3w/kr92NRv wp4TyBSPjV3tcUXTXPXYiHQV1MVuSFeziSi5VBTpYUO7CtrNvVbhDekom+ZzBDpSS7w6LTviVVDM aZyVEkrJ5ZGnDQ9CIF29JLyzxKmV0s2GZSwL2SxjO58gzrqJ1nLK4WvvMEu46m8MkmjOYu6KV7cl XbVScItYthL5Z5YkLcfDgrhhGW53JV8x15YRdjgfgLHG0j/UNxHXlqTENez5CQYk/TxOdGiZ5D2i W6VSeBBRrJaKht3TraZkq/J7tgXzPOlqTLYavKvV80hX83SrtYGzIm4KOAwToFMxfOoYQLUmmT/U rzMkdnmc+YMIMYtJkeL1qe2zh5dmAKbWDALV3vdu8JwjPAc1jcCmwNWr9nhTtY9+YqSruSSEuyIh +VgI7Pri3t64YQ5fmREp6SqToXaMBmiFWVNpUguFKUgN2yukqy9wNCZdFZiC1utlvII9WCcoDqmb m2deffRQlDMvt1JSPn2ooXuK2FI5/X6g27tCv/pSB4zpV4W+SNhTT4Y1NX1xg3/12YciAlYlUjok TFUaprsIWF/meI9WLd4RsD58qIfgNWOWZMm9eypPrQBs3GYk3N8CCQjoZKlj6/cegVzUUb6pWCQC Tx4AVZ1g7Fn745hd/oqFBzdLPJDKI6gTW4sgrrjM6jBoaraigowKlNoceV7+qAIBIBOpJF+RDWJT mSWNmWBAksYcEplDKvNGrCag+cwlU5/UmtfcMPy+01TuQdObR2UWkcDZIjQkwkrCOc/UDKNJqRnQ leZBS4ti19RAXtxoQr6UvrdrkH/7ia1/iQP2+QZHHzy3/RAHFKVXiJkGjHL6yeUfXi8dMEFhwaqa IUgUqJgodB4lnwN7KYILKPgmrFci7/UZGLMmEAQnCkAdPglWzXALx6UmFiw3IaZyQAiyhQzK0yDG cct1OXquRiJG8YYZf6WyK3dqC0thjtVbQ8ASoGFD2K9+ITPwjy1a+MJf0ESLXpY9LnjANU88AmGh C1qEFjct7HhB0yqW9SvMRG6VgnIY+xamwKht1rZEHAZ6tITc+Ij1+LmP1wP+VQ4oqaqj5qX0+iRr rm8701qTzmqfod6cN5a1EjCVlPPRjoKeHNxYtQ5HqCI3c1hDanD3GsVAUoMGLfsqsvhtaW5BlkkQ SPiEQvUOMid9TKQCziYqUVGhXImQCyshg0nxezYzNmBaGgTBYOiIQhp1Wic4qWe8cux51UKeE6bT UkItxasnovkBzq/1MrbTaAS6SDjntuG/8Fz8Wv6SRxH+Bn6Dwg4XJBUx72hwQ7b0siyuND0g1TLt TOv5Zmybo7ZSFea0Af669jgCP4XWoxbKDSJU2NPanGuQf/v57Yc44I+A5ONoGhnvGFzNBQ8J3Wli d8cchZ0+6Z0O5EX0L3Gzn8mX06bvQvbj9IrsdUp2eZv/K8QI43+w7xylptskdX0Nu6z1fR67DUfm 3zUNEvz4jQT9JPc+7e3eezwzb0ZtuNlG2yD+80ltyjXIv/389kMckOA/C9KkCAOvB+sI16YH+RB+ yAN0QuVjgubUhClhRAm5Ibu5Bc2ivmi1XvE/5nDYN52woH7HnOcx9sTmoP4hOVJ58wNi3SD+I2DJ EuXoB0aOtrVsHMzFAYq8SKk4YjIOKRlGfBzCyFEaRg7SSzZgx7ZQc8SFbIOC0rOSIg== ikpb85FreTCsF2SfN2s2GN6btlDmfTHN7gsMkQZFSsctxVfnkNhdroHBEefa7T1ciEe4QYRrfko7 eMBVHeMZjx/igLTEL8iHRMvcY/2k3LlH9Xk0n0fxeRxeSpfQEnAMq3KbmtxgqBLSRW6RdvlUi6tL PGRZp6GWoxJ/l2SBY94zJEQc9yxv5d+IFzcZHnBjabfR0t4v7I0NDlnXM+yWdVjSfWZJxws6Wc1+ FUO0lHMLebeIk/WbrFs4XLL3rM7MwoJrqwsf5V0t0fyf1cpLrkH+7ee3H+KAFAjc1wy5CYdPMg9s 7sEEJgEhrcJDEPm0Ek9JSoWpIEI1RCg7YQHKjmDOkylhmemV6ifU6GkVYBrqi1RKAFSClO1hSoqL 8qWEwiNSfGTREiSzIlSl6TUAUwcFgpXQuqi1SWuiVksDfblPPCoz7UBxDW412Llat6ttvdVASZCe 2uZ8g6MPntAm2yD+8/H2N3lAC1Qy8YYQ6iDyw7jGxRH1IQH6J4HxQ0Dh7/IQQhaCJOGsV0u8IoAc NKVGdYEIapCq+xY8nstOLUHTLvOo+/txF4y8gAR4YaAXocxH+tiQcXJ03d/6zsau9jrVgF1cH2pU m0/Xn013ktVEeQxsMzEC/8KAjRF5o3zvhYyFyFSCHep+Yg3Kd1nQna6RyNvs3Qa0o/LwFISeR4ic AKYXf6olfWshweCY/AQCd81u3Bq3D28Im/Z88auWKhT2dHqOyi8u7y3MPC5M5G5ig/CUe4ckezBL ZTWvlSpYiuYQ+3l3mPqDBOqS/yM/5SklOFYFVWlukDyFr13520vQTKRKy4JImZBGs5Oe8ITjD8l3 Nxnq+Ua9NNdcaldbWs/vtp8ubTtnoHDgP7vMZHrAF35cOSDNYssilucRy0Hb8+D2hnIwUnx7nlEs B3HPgNxBQcT3gK/ztEMHFEt59GeGfD9hSEmwspCg3g1W9iXp2hTeDvsEgsfyB+Auzqon5A/A9VoG T88fgONaBkKVEfhwV1ObuEC1lDDkQj5MFYp7nRmWtIXKFCtHrlQqrhRVLdByYssdFLQv/DpauZhR 5oVUL67Q2LBgc4Gbj0qnu4T4Ok+vuJJxoyw8HcTFjBWEfk9pgWxxAUiqC0hOQBGnQyZUDYGYIRAy CBNDZxb6aNgXlFfez0ow+RZtkjtAFapjtoWUa+EK00IyRWN+hZQ/YTJRz4Xx2YuhSbh4dh3keykY 2+FJKGtA70an/PSBcMdSIljUdqFUCC3Xl5Z8FQwCA9fkQgJLpY2p2iYmQQhUB82O6iBwFgSCBPs7 7LOdkCB0ye/4K/FB7c/0P1rgq7M/K8x8S5gK0iTsaWf4d6ydi9GfZsCjqQ9J+nvIfY8BwrEPL+eq 3xELJK76mE4gpQuwSeohPf1qsVTfAZAtlZq6PBgPrc6OlZXseXfzLWQy/1el0r+W2W/S9y/Z5P19 0j4i+CxlQpqsn0vUv8qRABmaBOyfOM/lLkh3LsP5WVV8rxPcpOj2zadpLEme86ElgesoKkNl60rR 2QgyQiCRUR224qoNDEMrqgv+xAPmhZpEAjBnp2yCia+h16uQZOCUpYkMBqnD1GFORgtIfY41hbVk u9g0ZOsMGpam0G9daJXOkBsjTAaDakRpXkzQjBotA9Jx0qtVRRcIFGesMJWsNEkqcKP5gZ3KXNKj JpMZs8gOB2GLy+XFKDFakyMd+i+qAvXEGlDLBo/UgLqnuJNcbbjetLhTnE43gbn4mFWw0VuIc+ny xRtaKd8A+zy6NItOyx3tyjtJisqLPm4d8CppTa7B079ivhwlr5Rc4tCwWfoqg5wWMDIO/9zTi+pU dmdMNSkr909lbVIeHjwQ8Zc6XbDqsdJ1SS99OUT3eYdJAZJ7InyjnHmCmQB1fXaKo8lZeYFjPZS0 0pXnth7aU1udK7cTPZ60kh7w0TSMvjg7Va1/kTwMORYl0jxxKrjvj9256Prm+dPJHONaMoh746tf f/zw20/vPnx+9+HPX35pckTsB/Drv/hPavrkt28+f3776cPPTz9b3r19//H03ee379+/+fzxC0jf 8NO5dKb3qarPreuok5td7o3Wz/fevVP17u6+RxrhkomE//k/8M//y738n+7Nfz81p1+d/uV/FKdv 8P1//p37lR71W/OeHPj0D/7N9HTxu/L9f8gc07/3AU/5G1o/lArk52cl9LaF6/6CKH85wSkUncdJ /c9vcqf79uB0j97Cn9ILrQefZ+VfuA2/wMQrTZrThCa8dLrQsj13hRMIZVf7WxnpSt1lOcWxdWPX nJ3+OJ7e+3eL+tw5HcS96z6u3DrEd0u3QAcvxhp3sfKm+4o72dn7bfm/urO7Cneepj57Y5nedbfi TN/S/e9wdmJo4HdLPk8zuPlcy/8OPofMndx9Z6w7Pux47jucZI2TFy1f6O6m3nNX+RO6xeT+35My dx3fbXuua/fdsm3PXvvlW/C5XoM7SDueq/+fuXfdsS1HzsSe4LxD/jGgFtw5i3dy/KtV0gA2zsgD DSRIMIyBdKSS2+gsGT3dEObtzS9uvCxmnsrM3XZJKp1csbmCwWAwGDdydbvLRtuNIbR1z64qGZfv SqFrAhdjH4e07FPrGRSzU8pin6yuWFxIz7WMQfRWndsxdfm6lAvluZQQCVqDDg28qSlR/93w8sbH ZVg63pK6ooh9DFdnT++Dxls6sVdH0YBXmJPj83Xl+tTA3MgcLw7HK8tT7eOXjnLrnIpPpfWpuHic JT/juqSn2mnvU0iw2rnQH9CuiyOPp3q6IxrYSrikXe0SQoR0xSsgOtxZoMpi9kzcbRQ6vAqB7BSC /93mTzy8Pvm5tadWnj1Eg+guz7nb3jgZSvd5M9q+Zmsff/PP3ShmpuW+F3evCKPpPhQ3889gbe2r z1cjyNfon0qX+MiC0Yfa98+EZqVvtjo8d+X4VHuzyxsXXBeqzufuDAhsH4VJa8dZIQEBUq7S2sUJ Gsj5zqGkwtZH0vrGBUFIUWSi8xbt+spLJXBXrbfzVxfKyz0HJy39xTNCsu0b9x9cn7pYiagEiqll 7esDC9N13jZGiZXbfQ+i5wqF6fHpufi+OCDEoV0i5/twdJy9L0fLNXQet879F259VSxK6lQWRenL OTYsny6vKchKdSwqWButyIz33aXDU1/F3KZLZHd6CVh1Zl3HDJFsvStt6KFHKobo+/KTyeiarETi ZejLV6ay09WtBfC8cyjJWr4NZWieLmWuC0PpKqk11TzlufquJLqK6cIji7lLebfR2lPX97Wo2ukM hbzE1uU3K7ALazecnjozcO+yTHvnTHcyn7qeTVnoh7bxkEpone7NCtDBmqjdcHi2hhEWVp/ETlD/ R4TLd/6kPl8Z55qjvL2PxwbaqekeeG/dha07ebL1QRorDLjmQzVVGvpM9LUZsH+ofizdLXzqmjh0 zW37Tl8XT12R9p1MX+5rCt125ei9TnIXgO4h92H2hWQt+zx1p7o9xYwPjI9xXl1Cn/qe1R1VPxgS uvz3zqsJ7T4cHSe25i6LtHWlJBOaEzZXyGfXsVEY3XmZWteCwN/VWFGFGy8XSbx9Ykb33Yr3AQ+J btKwb3sN21BfU7SD0joIPCPg63XFpvqaVydWTLmCqqqahaIoW1vBN9ehLQLQyNq+jcf2kL4QrkoS TavrhRuHjM24Y0jNVdWdXfRZ9i8v+ryPqZuxfUyBzvOzkKbaFyG2K+gM2UcyJpKGlOGtNCUKGeEO 7OZ3TEE3odYnj1qmLFsOtH6CZuga56q2geW+q1HfzYk078MxuYVKhGECDL7rABbcvmEgwPaEdeVE IPvOIvMUsLXzmLoSye2KNHldx1YFXt3Y6oqj4jy5iLPj5YpBBV/VhOgairZ7aCWnItlFP7bKqq02 XQ9JjB6s9a5SzQapfU8haMi6oG6jGuONvInTRhKaWH69vU/UY1cqocq2gX26NZLBzsisY4uFdHzA WpIB9+2vZkdj6+tTR3wpw/AVDZ+NtG7TBtpNum4ew8jeMYbWPSobcibhgE0SojGH9Dco8MHYuI5q KOCuPsAJzB5stRcxnGjvbSKmrDG6qIJcbNItquHVF2fXtk+tz55u+qT6Mb8VhmrU11MfbZ/fBrdb N2i15npL0wGgsXVeN0iMznhXtmS2wBKrrlpDBA+fGgyrS1tuAxojhSHeedAng0TqRVoXTGxHEVXu SawwsQ3bS3I2qFa6mu920dhrOk987RtDH1QMOoPgHjGqT3bIzsjKmFayetoYACKnaFmS2bLd7u2T 2od/dXVnfCIzsQ9/Mv23AZnhgO2s70FQpl0WaaDYDLFgMyycaMZMn51EX2JRG663o/nsuqjv9zxK aDNMJ3afJhsqNvLu+T+l7s00GWNXkTSZvR1Jj9gIrXOyK3sSaoDixVOZIbSxajOaSQplyJzvw7Dh VR5216Fkabxw25J5eFU3yIAAUt/h4O2U6nQoNIl9yD6KxHQ20Bz2oZDJLmwg1nQYeWJCT05dwaZp w+10d8FwYNdVZVYjBLwAFKr4iJ1kmr5M36BJCluGocPr9k2oDV4aTK2LrfcES4X8q65Pgxhq3d90 pcLL65OlNi88PlgjrpMenGwDKfKOBi+xeBHz3lHfrDL5d9XJHg4L54JKwSu4fEQ2phS8J5xR9QHM HqgBkNRdP+m98yvB+utA+uN3pxHZUBsvUQcDKFy8ifbWCIKT02auRac7JpjTvWWft6CjYkUH+nRV JNpnAsVXbEr6CIVTsD+DkeVoa+rIneieTn9Oid82Lx0jhXoBsMCoV56AoP5vUUvrNp55oKlT3ec8 d1eDx9lXRrf3YXzS6pIRtdhXXxc/stiEpAiDN0DTincBGxix0a4qcvcLtXOyBbo4F+kapkdu1Mws N6w6TFtHF3Lxao2Qqd5JiV7cQFIKXTyxsqKOeRuGGX2OvPa+GCoMqBduSqYYjB4niwozS+Y2rMsh MB4iAXsSEQCd10oDIQZJM2aMHy42ST0is+hK1nynGgY1LN1LjI0c2A/qsGGTOVxYU8hF0LW3DULH dsFv6LsARYoQl+VvOD1ZHBmuM4ckl1gXtA+CslDnXRvynAfHXiM2w84BcR8LO9oAmnKHbeYzb+JX dQYkbQNjqEThVsB2HNgGKLJfBIQJEtw1uItR1Vfihv2FqnquG2Bdn1DfRfeQgHgCViC2J53n23gm BsltU9PFU/QNNNylRGF1Zkif/b5Hkh2ec5+3F8ZayTOA0crc6GJ8XewBmC9LVnJhI65vHV75RsqU gj/qVXQOd73tCFjESIHXkR2zjZxnGWRMFDDwZmwH+ESuEizoRHS2BbEfC6IbvzuN5bPS4iK85S7s XagRUJeYRjcFA7aSiK+siSGB+GHukoGAn3rsfcshLwXKT/cXiidgj0MAUtcH+mmIfyQElNSOipmk pDesur8jvNbhlFQwRxaxzIo9jVaoxMgQycOWDd1V/OhmGc57hYWie7lrOGi/YjGe7g== rEU2MMyIwTAvJEmgE1WhgSG+wGQJwzsE567+/zB2kpHffZlc3nRNgYGIQG9fK50x7bqijfPKFZdw dQ2hvXeOlAS+uzhzDloywQm0GdrG82mB8bIldwexz5lYs31gF+0/SCbJXPStpDXaqTqjNJ7Yt2ya Xd4lZSa7wXIVRN1j/7kUlbf+VuJd0uwZCtBA/hcxyuIOYb/XUDQcHji9vJvLRCQOAjnaWNX/2wf0 bpHBPgn9Bnsxa2ohZM/7scXR+4bjYWsjCp6iaANs3J3/tJ0HVcyRAr2Bht68zuRFXGIDqVa1z/v7 0E8RUTlba90WhU+dIq9Y4UdgzvXlksvgHCn73rtpsm08nxWYCkfcsyMtYRm4IthvEL/zRYx9hGLJ VOxjutR7qVlSD1cbW1RNPCyKhSaRtoZgaUJIuQsBrHcC9rFW9H0FzsQRsLMfZjlwBrWxu9NGbgpI ooghAb046w5uaeWOtvG8V1qaBAfhZceOnRmCYJZHR+IFUUddvVHIFxFjC+X3DSC3RIFTM6Nq/7t0 icDY2yWuZ4W6hpF6leEMI3dQcqSAs8WkusMHK6C3wyUvyo7IjIP9EwbjKATc+7bN8DaezysYz14s VFxIVf3lS1JTEQEJ0XidMxQupDjpWBNiv0NDO6eRCGR1sCS72dL7Hwkv0kIIP1WVGnJ6IVcINlKK j6GJsydAa6yHVUIWH+0RqmApFpApAdW3Pcuj7QN7t6bpxkrB7sIbZ20WzCWDAqm8GjUgWzkQiw0g eNWpyM9haWPzCW4KZsM8xj5lnhvFhirlAiEXeURYfMuN4pdj1+vDJe8ZbckdVtZ0DlYKYTpdPsxG uESdBnOF7yMbvPl4NrVhXXSfG3mfFnWlUTygeyhjofW9GlHwfA0jpiJA6CnMUNWgrwhRdhWDSzGd 5GWwdnwjS8kCVi1zBhYpQbV/WuI+uqLtkyA6B5qEabku3Q8ib+jZDwdhG4ZypndD7m8W9fDCTclX o9C1OF7InUUE9tNY8hXOhqMIjPl2XQGTGCDrqlnPChcHNg5EpFbVtA16ArkPNbG6akA13BPlxEWu EJDEPgJ3P4hYgg3wT+EuZdnT93Ho+GDrImuJTdTBNya7PYhGR2AiSHCGYva8W6oC01A6DIWqAT4k 0S6Y2WRRJQsoUQiMstteMHbZZE8kRo5ZE/Ci1AClmmWh959ZcafEKkOseZITAC02eRuNDjNCkcMT QTgja1gpS6AaDK3FvDDJ9/fdGlUK6mMgLoPR+yjbpudEKFsFOngEMCWL37eArE4G6t1Jd2iAAfGh TGoKa0WWOGxtpJcApI3SGEJxEER+xdC4jUcHiqWNAEHfOTreS5QX0vG0vPv09xUnKhwRPUrrdxuk aeZIU2hgYXeIgpnMEjiCF6vGdZGwOWxPr1hRJwEp5sICYSAkhAUAOiGrEQRskAbQNYL6sXEcCtAc mzoi28BsxHCLaNNCblsTqTGLP4xsSg3DHXAF85gbCprGkB0lyjsffNQwMaJ6iNA6TmUpbbAXKNaE fO4VjDbOY8BsDLo/xcYuBVnHSZIFaMIhLPpEtqp88IfSGxlhL91696GNMXfhR01YYHdazOGMmC2t FjEmkCrpEwR/TRz9blWgFBeBkBaKugtdthFImkKkfdPv7kDmmjhmto8s+8i0ZdlY4V4nhGQqRWZE T8DuRlFINKu4c7M8keuk/tY2Ah2ZD5xEV/X/wm1JT/T3cSuH2PmZUnxwZsxF6QyFg6/5XOobKaQ+ t93IGA4gtnLKIA9PD/t3N1c91oemRMReRNzsiqYEKTCOAHmV3Qk8QEYuuuFH7MP4rL1WGrOrL0ry 8qjmA85ppa2ExJfY0mnxmTxj2o4IllFK80QrUJiX2DiPiJeLmqkXe2gRghFsU6OyC4iU7p3dYKYl m8Sz1n0c9QPYn7WZp97SVOWyj+G9hlnFOPsDQqEIRbwwTtps4OiqCisS+0EMV7e6Au+1q14Eg5NQ XZAsQRigWqVKZ2nOGHDlchohm6IvMDI1UVGRa+9k0gr3ZsxcyHhDIuvELISXIOVOQvj7MD5tyl9I 3GArqSiOSXnkcMmDKlj8YnRX3YaR2E/qmVSWGahm32TD7jbEVRFV66otXlrJ1V2fDIOONl21NbsR HJxnizsntcPhH5MhT+VotvIil1qxFleViPoUhgZTc/dhAfqf3iEv5CxRbATCGIImeyOLoStY/2JZ eeRN0Rd4G809uyLXI3YNY14xxcuQK7mklKmbYAKJTksteifsLGKJtTaqBsmOpThEsJqlyMLBe7k3 9lFsqtuK2MhGAcg6oocJDxwrRM0W2YGmN1EW0fGT4WqSU0fOWAXHUyYnbnKDQr6SVrkJSJ2qgJjY 9JVlCWcRGijfZJ6myIxvk2LfR/NeFWMMhmkULO4mEhMQGlT3QySmbwRJE2kiMF33645k4hJGnaCI CzRCXoXl2qQkcoXmJiTPC7NISOAZeivW3IbwaRHJKEloyGKPWtnA1T3VjUrZSI4K1UmOOlmPIuKn goCyikLfaPsc5jg0osNG1ntAiY5WyaKeAOk7VMhoGhk5+tZntaShdSmhEAJ/cEKjkn2D6bZkdVN1 7DaI9woGMhPdxK9lFNBmTlpUP8pn+65B1bOIH43iWXxGwz+VOkpnA7bYThmKTTXm2uUhdoEvbvhs CLygGq/rZV00KAlC6gf7vK5CZMgQlewwK5lFyAW+Qqnc++9uYxgc+EQhNbJv5CguxZqUFrhVa3br DfWaS7km5WH3ek1ydFBnNddrwi6+F2w6VHrdKjZpy9tLNqEyPcLRS80mNsLiEYVaijZv4zLDu3d4 KNvEHner24T1fnF12Vy4mdKhchMFvmvtZqqn4s3s79Wb2CLu5ZsO4n+r33TFHwo476P6tNJIiDeg iG3JYCBWfvkthQFfmQt55xwGSQHyOUsSA94lO6JLFiNJ9HVNY8CDha7Z8hjXIZFBbhcM9TWT0X3z lvZUxm1o795lUOaA8ps5mQFqstuyGRAhT/UeczqDShoQpFryGWCjON5zQqOzfJR8WPSWQki3lAZK FG85DRAZmI1LUuPiaoI1q7GN7CFKJrWDs4t4F0J4s7dLwaXe/eLvIoQFx3p2eElMOoNWh7dPEpT3 5PFiZd1cXopVQPdOPq+jevnF6QUHDl5vO7u9MDJJD61+b9c+zq+OL0SCDkMsnm9C4SLqfSfXF6Y7 VXktvi+kd3N928H3hbzBYpmdXzLawfTZ+yV2YNHO7u9tOJ83Qi6uD1+skFSYBbMZAiGgiOlih6A4 ZTNEUjxYIvgyVPKLJYItgkY7myIYNfcy2SJwX0i9zcYItASO8KzWyDaa92uQSpv4Yo9cUoI4GSRQ lyQXi0UCp3w3SZz6/bNNApcGeanVKLn4mNRklfBqj6tZ4qhIPtTFLoFgUBh+Nky20XxWViLKh3Hc KElSBuzpKuEqUK/IF4Rm9TG8HSE24iRR0eW4T0niEK4aGhGxushB7VBlKUYEWVDRjYWm6z4WPuyC liWI40z5Fta2FlzBrkfB3k5R9Np5oo+6EbBe2fpZB/RecUHotNFZLwSYhSGkAhuda3Mqg93coaIr qiS8xDZBCskRj3wWnwrKlI6k0FEC4WaUw06UeZMC0d4LVzbGMBxWnPi6YAEhYBBlS0LIpWKngyBW P/GNYrBUgesUuIzms/KSEeVCygHSi9VPxf6R/6YtQA+tYc+7MgeVu7q3Yn8+4QM8RVYEMktUkohE RNBCvCSlYCgKLTLETLFzjreLCGUpZALGXPX0w6Vh475qs2SostTXUZQgRetmHc97xYXsSVjqfd33 terslAdKs9GVzjgKISH/BQcV9OiGznimehyp+VO5AluDcrP/7STkrZsR6VjIEFhdnR2IIGeGLJFm xzlyRRSH/AJnfIPxzTF/sXhvg3mITSLJCIpIqEmiSRZkb4NG8DXH4q/J/LAcC2oDLQuhlu0UHp1S LM8jmmIZFjdrek2w1KkAX/MrCFHHqh1JegWZcjNMtgGZXaIZCDp2IocNLbmC4wFjA5HcSvfcs2Yn LbWCSno9+jdlViYLZiRWuGRfqeK8yjW5bCOtMoWDRlalLy2zniWpgjKla5hPy4AepT1Q0FjiqjyQ ManFyoxJd+D4jGyGqjlw8kmLGkxxFC4OXPQGajPdpjbmmm3RG3RcdlMbOMmjEW3VGggbWWntNoyP 6gyq6qh5URkUv5OUv6gMRAbUolWNgZiFC1ZrzdW/08SrvvBysGbVF+ywz+rCT+X4qi702OesLiDF ZRw8W4ahbOhGFZ1qhUih1ISqHDhDjU09JtkrC4JuSGhiF7MiIXx5M3LZRRd4A3oU+dLO6EZ1AOUV qJ5ESKo4IIFIMELJehysBhF3rFufLV1Dxh4o0qx9RTnwxVnqLsWWnFlG89k1gKPPNXHBoK9ikKLU jDKwMHSiZp66R0PJ7L6Iu66sygo+soZaVs20lsol42BF94ulJe2mXG+DO50USIkZMMgXDVcHLgGh 0szijUEk8I6PRQ5OFkedF6dlcvuA3rscmuPwMGZZNlAcIuoLEFk7PfWKlBGM0g7zQaIuOECFAA3O f+upUVSuYVHSCUgtxXNsQ5Q4JBoFIoj/lMAFrgIjLVnyVB8KRz4wLRJEajjMH4mUZjUj6yA+KyWd kuy6FVyQe1emOK7hhCtSitX+0bosiL6oGDfxTjIf3yVY4ZLtEkdiDkzGkOCWaUS8OV4CFPoSwwnh e0gXDrVr7XWLXFFUUD5TjKMOCcFShmOzj+O9soEQFvxtKh/SAxWdDwjywYnTXG6k0sd8jcwmlivY iVMpVfQILGOEE1Pi0u/fcQ+0t8E/1sgZIgSwCxD50Y0FIaFIiVLdhnFYKHkqWUpazkh1J70HBEj0 7MQ+hs/KBh326es5+1EQDjOnTw3SxUEWDKqh4JuhmEt3LtQe2XFysTeh7LA4qLBM2+FQKJ9pq3r0 Gr4Pjt2mNOJdiA1BB+PQlxoIqMxCRWeaEl1JiiuwVV11nG2Zh/Fe0cAhTJxliG6IBqoJEbvAsRwV DYpr00kdkw2HKE6XRlRaqWzgIAk8JdRzqWygxLMlCuyYbGhiBZWYKhs4JFEov6WyARMCgSctXSKY Y98+1CEb+yA+Kxs4dI/jUvEasgGLDoGoNmRD04nxGrKBclSUgaFi0k68SwQCBxCv0Y7KjQFT2RCj MYSpvFvuaEHhmCWgIsdiUXqmogHeIYkJN1lFYx/Fe0XDST0sMh1UcvPCY6bS8iY1Cmzh0pnMhjCY msyV2UT11xrW4vs5oPScxq8a3yCDa0iaigvOm3VFibSuHgOk/BrOtRY2QnR4iESjHnGqhodP2to4 lXgbxaeFw3FcnJJF9bIlg1xf45sNdNIpKoO7UFIxIJ3aaHViC2qNEJnLtjVCsJCeAEgPd/cOLjpW bLXtsDZLoxebMQDXRaRIh5W1AJSYV2l+jPG3QbxXOKKXCilcm1W4NIZCwV1F4zyeHQ== xK2sykMeCWNUKUOPISZcq9Uc4oZbHNKjwh6CSUoRRwvVrIYZhoornHyrVsNINd4hDQs64hztRaQ4 N2odHc6nhqmifR/GZ4UjYidH4r5x1kwCgbR7h2H7IMmHAxIoKVVfKoLBgSLdWuKLAmucGkZt+yjD ZH7C8HI2CJy+QbWAHa2kQqtGrzZdWQgU+kinQb0qbDCv79KsTJTv2yDerTiiHM3HH+TjsQ8f+EAX xR2ylTdKmALePC5pFigcVXJgrnFqBC9WvlEjT7Xr6ARlAHSlRgwjKH/lzG2LReUR3SAb/RpWGCX2 2Ej3fHqRoZlPQ7g5t3Mb2WcFho7AFb6/Kms1NN9QJayqSc/ngzznuXrZWSozSNYWQdNanXGVDoM7 2ibjiAIxr8Owv4CMI6thOkNKRVgoX6PDFsFOnTUKJQAYvVZjIfjKRyXcuD3kNq53KxjY5LjvDJGY KvXTscpdFhfsTInExsQTTCdigp5SK1wNTbd46HlqzH6ApOASj6iqApdtoe7sQmJPytYQIUdBO50w KpPdh+p64NQDr0nv0bjKqKJNkrAAEB8X0X7WAX3agnV66KdRZc+LdELH43DAp0g+FB47igIubNDB dAGVDaBQyvZKW0m4ASwOy9bBjQewq08DsiRdqLpK5hhwkviicLs5BrzRoLA/xsFIrKLeuRWN7sMZ 7BnXV2rMtMmtmpCZBpY8XVTwzndv0h0bvLpgD9ENOH2b68tESokKb684NlODng7q4s8RY1ThOq2z xgaSoxyRtlxlELpR7jHq0Mk4Rm+wfjTy2PiOJLS0qntaf4Uir3UUeJGuo1UPA1wj3o4Ox6Pqv0Nb tOKdbWCf1kMwbK/ERSIXQiLKKjpYhKiYauE+eAo4oTKoDHKMdK8XAxFLoRDoAq5sAypS+IDAcVB9 gb2OC/ZwZCgMlvLZCDKJxulkuomB52RwNAae0xT1sNNtUI8QqtBGsVCWyxfQEaLl3QKsRVNbfZww 32Aqq+GJ4DxZYrZ5IyOI+33adJwviP2Kake9eQn7JC6rmi075AjJfK7jvjHaRrtoghLNVWG3QzwC 9qnGLPdRfNrykVJ4um8ohKpsiY5OMEI1jGve4C4AlvT+Kppnpnq0omNNrYxLpbAXwR5qiN2IqdBh 1RWylauWbmG8MGZwoVIQYaSjP6kuvMcuibg+ZqjaZTLrMB4iMYV4XZilzJnCAoM0mvpRcJAhMFnK aggGFwCXt0V1LGD7QGByGgoJyxQCkydbBysCApPlajJlMwQmyxIUBhLrc6U7sKQZyQuy5OpPb2P4 rLiAEvA5Ny4AEp6QtCAknpU69i2pIqIYA5hgSEYenAPBmY8ZCMEkLDkv1+uQsCD3YAtBjhIghacX 12EBQliI78X4ScKSq4noNoZHiArSBp7vjMupyZGDS47MBz8lYqsYHjj9FoPd2UbnZoMbx6pReI8b U+hIa7IcTaFrOgLKTiT87SU5igJXdRlwt1vE7WO4cTEGO/JRcGMp0eP1HIiTmq2Auw5Ef++j+azU FL2yFjESL9ZykUOH6Dkodxqde6PjrM4uVRWq3dghwEU+PgyHwBt3SNgAjFkUA9JaCObR8dcr212A nD2B62Vs5HwDz4Fx0SGhgrkq497XdSwPMXhg43W7AIc5Yeq9CIzsHQT1LzVWcKYc5g5OzprbdVW2 dnB9mt37cRU2dnBo32qwcHAfHdUyHbtGqTWWWs18R562JFsHt9DaQWqknGEvVDgUalj0lmTp4Ci+ HpLdB/RpOwfWN0wCuiKtVuMQzBxcmuvLGDbMHGRHoh2yqEJ2HZVIYCSMHNx+YJ7qVVnB4kDuZYfF Gps4OF4SNQ2OQUMM6nwJM9gDC2edh8YmTuVQ0O9Oo5nYI9eoP1F+Ar8Rc1SyuifOF2t3RxyV8OKM yrWsoXERgFUZXHxLk7eSVCrm6boam/m4pSVyVokUuZ2ilCQqnZQdMMrPUqxXPc7EYWSYlxYlRQk3 FQVO15xQjh5qLtSRYUZLCVD7okbhPhzjjtyI7uh/LWZBVQDYNr0oXkJANNXpnlYtwgqV/9Wu+Cor uL1TS4qjF7s0iS+3aRSoHVV8UWop6XhwGWENSlChpdVcxKwY7QAe8QhZbHSd2rg0ZhnO5wSDtl+6 MQNpCVk1lLmmuy2KXrqJIkwqJqPrk73Vw9AmgKpw2Rcy5BrKFPXjoyyJbntGO9tpLs6WoJ1plCzp D0KodwVip0FBJnrubxhKuf0DglBsa1jH8oZUoH+61qa3pRN+L4IAtUE4OGS3oOFeAXI/Eh+TFiBd ShpHyTQMLxQ/09UjV7BNiNQOgGqHZrmFCCNP6mZhK6eic7ytJ8VxUNdQ6t1RxCMnnZdqu/E6mk9q i8rhRFp6VexaXDJKl3RAF9ihicxXofPZNPUOi5xKQKzPwkaI0FS+YMPbebUqV7z7cREATmtx6R+u 1tJTFLjGjDLrYTrS3PiCTFqietLAiX6m9XgFC7uvA3pLXyBySxdb4ARqTpoc4bKxOMrGECEockF9 1wyWTbPDevhymHKJrkCmEqZL9Rru1Mlci9G3hKhAinhj8JcW4SEzQ5c14XW1ynAZuOFU05HYJDeL 1JqMI+uAPiccOIBCcZ+MMw/e6S0PVP+FMsOggRfcdIDIQU6T/a3hXxySSH5cTEeVaRn5UnHmkUCk y1cyJUeDugNcCIJ6J7Pfo9yJkOPIytNtbHKyAh/g05Z8N2TCWSG7wHMdzxuyge65ejDzni4Xpl6+ ck92fi9IwTId7Ch1DP4SLtmt00HOF9KNAXrzPS5SpWtu8iTaIXAIAoN3WT3nro9RL0yv++FbDZxF pyOOawGaqvDbiD6pORApwz0YKP02zRFEddAnXiyEJKoDCk1r9IJojtwmxRFEc5AmjqMWEpojV77t kWGiObAHhctZQxRb5zbK9oLoDWjNNkWpSG+U+TTRPpq31AZlfPpMFcoKysDlNtcylY9RRA16A36H GRRB9Ab8PLtZL2S7Ot0ukqEgG/QG9pE6MY4uUUUdmiWsqSS9W92ZL1LSsRtKs7CCqA10bvcRbeP5 pNKQC5Q09SJXprTMJ1KsehJBAYRDULOmaxZxkkznYYraf8g50u3zYZylgex0OrE7lWQBgICa2Ij9 c1yWQglnKG09SUD2Xl+sMY1UJnE0ECVZ6xj2UbylKapcCJD5BlOJgvBJ/zm+k7mUk8w/rYjPdlTH DtHQvS/daoDJrtd7BblzEDDvLDRJZ13paqlBNhUSop2eZMaUCz5dF0HKNdGtBam2YXxOCnDciCLB sBaSXIWP7ACV4CMjJpFkSrPQNQC4kFPqZlyX4sbtnN63kuhzJIHSfk2vFkiOzFfESy+9FdjrmYtr lDIkL5mw6MeN+TgPVzKbH93drNrSwRcmQ6VoAmQfzRvigP6T5y08Swg+2Vd6pqu6UWYcGjeklLv0 xFsUEpZWSoXA68XpwVJGdoutVQD1nnAcU/GBU67jBmIU9F98s1ixO3bDwGmrA2y6NF2q4e59QJ/0 QuSGa+xwl1b8UgUyLuONer04An4X/DM/IuUZbhncVTdS2mSLo3y8DTcCpjgCRzh4r2Yzhfcapdft 1rgsH1mhMoTLXJDutzAtWh0IBdqQ+/ej3T6MNwQCMSvyP6UCQkbMlyt33mqxIn3co5Ynurt3uGIo ZMcNx1pejfAokn4ITWklVhablcJV3hySUC66CdkCsdhIcKKYPr2SrMaZVBVgqjnBGSQeg58+erEN 45PWg5PbzXKavvFyNb7TNqMwQs+dXZWPjMIOVFuG8ouNKuYsagsYWVXZjfp5CmfRJfK4F90+LYWz U41uho/jEzFgSpATarpZ48JL+p6LXKKmOCn1mcP01ZltPG/ZD+ge2jxHDsa9KAKKiE/FHhShIzsn jvIFXI2Ju4lgQWf7EA7SDbjX3k8nmRGW6vZN9tOxRASggH6+Tgd9k35CSzNenOOa3jzdikFBLRi7 ZL63EQhcxvNZwxLXEdPZMVhKUfgT+LM4dK7b3CUIbaDjH9g0LbnpmRl0kKWYjeT0GpUwLkyB8Y6T AnR2OeoJEHJIPF+NnzX2jLZy9I6uQbamtLyILvsWCYx6cklQN2sE7ON608aMcm18gu2kX6ZAKBzh CjqZmicukLIHtCb9PARUJznsuHUnmpF8cYE4nf1NZgF6jmgR1Jv96fn8Oh18Nkc+iL1BbYtZ5FEv wIsjnwvlKNe/ZW93M+8j+5y44IAW7rOv052tCKdAX9a8aHuqtMSVi76atqe8KS5XUssPiRocHqxj tyuOPxBQ49h4iueMU29W9IhScRxHrelZ997iufK8U2IavMh1NnUEU/dBvCEZ6BjHcGphh+VFXsfR qIpvn2QbL7mQdZTiwinLTB9VZ+qWgI2sxvExNmyC2Ew7LOtFnJo6qZP6x1eUEOrHjEughk7tCjrZ xMAVHBvAOROtl9wH8TkR8HIlF4UIq5ym4m/iNAqpjdqxJvcjIT7Zil1HzdkefCQs6pVtl1yb2pWb XYiDI1eOG0b1RVG1e1HVBO6NEJVIJ+c4unldkqZCWeelMT51RlEJ7SQaWNUZvY3nDXHAsUE6qePi uMYLCOgyTWBtNsqAIkGOJl4GlNKMMIJdTUqxcDWgWtV0xS8UGkKZtRo7XHJyBUkKVqmaG0V2qarK +DFw5moMoTQ0dV6V7/t4JtH4eUfKoqinmGlILxvM+T52xFoQZqVzPo02XfkwJz9/+0IHzDjhN9ps SMLak7xksM7Z8DSw5K2nPHoyaqRN3JHEe090zWyTkE4gpfuygWIKVFdCMgSAp6rlpL/3R2BqlZ3P 0eKGYe5FXhEQBZXoJcGR1l7S1IvQwS3ajqHdeqGbZlVC4SrLPbMTiAhEipduWUZ6KpCNr79L5/Sx E8oGE8i3DcMMKPaKgAoTOHCUtZeivQw6tMWKYRuLDjEqM+lLQEWLJA1GwhblLAJ9RKc3Qu0fNZBn IKPSSEzCaHNDsvQkLxmMhM2w0J3LU0/yLC8xNdqm7kjqvSe6qDMxC1oaztAEow9feclsNEkw4lIv +l2eaXYiT4a1iRuOuPYj7yiM/jUcaesnTf0oLaPNiiPd+/mRlzTDy4geGwxnbbrNmeXGSVyyjDZQ A/I7PYs+YRq1TdhwhLUfVVwCI6POcJStnzL1o7SMNiuOeO+HNNAl3yCLY5wGC0wjMvJY+S0w7iol 6foMXMiHo6p3arPjWPqRdxRGNBqOuPUTl36YFoFN9BOOfTw6ThTW0M1oF3vYLxOMPONOY3G8KLLc LQjzSH6n529sDNHimtrsOJZ+5B2FEY2Ko1xrP/os7xAt1sZvOPy9H9JFIs8oQgtyY+wEi6g2ibIm stz8E2Xd6DMpCFlb1iZuOOLaj7zDMDlqZTjK1k+Z+lFaRpsVR7r38yPrAhp/KmM+DSZrC7fxgodJ zvx7uUlbn0k/BO53arPjWPqRdxRGc2E4ytZPWfphWrRN3HDEez/0kTHhaZzmc4LRXA== JFn7UeYqiX6I03wm0SHWJmw4wtqPvMMwmQvDUbZ+pvk0WkabFUe89yPfRdYImI1zghGNqO+ikhNZ P+FiPuuzbOH822iz41j6kXcYJt8KMBx+68cv/TAt3vpbcbh7PzSfiaN1vg65NVhhmUN4AjkLL7JC 3ybk302ecOQU4eWpzYojrv3IOwojmTMcdeunTv0oLdombTjSvR/+5GpiRRzbmNAZSLNBZxzAxtjE ZrnERVfAN3otinKYWt3wLL3pawRMUp9leNK19aYAfY2XqrVKO550702/M0v4UH84Bj2ARiyVThW/ Daf4mYzAOEarsOMJa2/6GgODEqt4wt5b2FhMNIWNNQNPvPdGg3byGVM63Kk2xAR1LJF0poBsTnwf hz9RlOVbjwohUlxWEqZ2d1xrn/qmQTkcNnD5W59+7VNos3blhmsfp9mKcn1HmnT0BKPJyvIxqSQE 0WcW+HebBHwnFetxarPicGs/8g7DRL8ajrL1M+loo0Xb+A2Hv/cz6y76DF9YVBd9xhuOmOoL+nJh MJUij7PmGi02DHHpZVZc/Fm/HJ4GDr/24q0Xo4NbpB1DuvXyo5g9BHZE3MsCQhgrUB6WzyQ6qjeO Shw/iiHE95JKi7BjCEsv9MoESpRlNhxu7cVNvQgd2uKGYe9FP5ls3/0q+m3oCUazAAhd1UNZmUDP TlsINlypS06Vtck3LHnpS9+SmNXFczHw4JLfuS9+/iYUMj2jzY6l3PrSj52zK+tn/TSgqlOuSwIc XvXOJRu/QVhV6r4wt7vjWvvUNw3KOmXg8rc+/dqn0Gbt3A3XPs7BAdWLU0htAVJwgU5p8he/OGAG AOvKKarGZwhB8tTqjmjpT98zIIUYJkx57y8v/QlV2irfEOV7f/xVHNnq6LLTqZ7YgExvDBqbqdxF 1K+tC4AIibo1Tq3uiJb+9D0DMr0DU9v7a0t/S8RoIVwQxXt/vMaDCAVlBIt9AN6ATC/uwCIVgm0C Xeh1FQrgpSelDHOrHZFf+9P3DMj0Dkx+789P/RlV2ircEIV7f3Rhl9ziMo97hhG1dRt19aIop0HX bcx2RZch8WtP8pLBiM66jXf0NIZbt9HO5DKScO+JpTvxLdFVrhJ42YBUt+j42k3Kc6ERldNTAwF8 kzVB2nVutaGJa2f6mgKpHGLgiXtvce5NSLJGaUeT7p1JtIq9jTaijxOMrv7CWRHxWGhTqc28GosK 1maej7ZZcEzPYXpHYXQdn+FoWz9t9GO0CGyilXDs47Gp1SO3Pk2OxARkBwBVg+C2V0VKHwPkFsO0 R3mchD6lVdnxlLU3fY2BWRwAw5P33vLcm9I0tdrw1HtvfOmkxO7KFFuegRQYxvUHHBmTyDHdHEEt pvCyU1dxbnXDs/SmrylQCr4UT9p7S2tvTJO2mqiWrPp1740XsR6uvq5pi5qAQq2wtTWlQ5jf2kyH TNFoVW6IytqfvmdA2VmKmnaXbD5V7b+RRTCq5lY7onrvT33lPA/gZQPKjQ7Rxs3fBb+ijXtM2xVs 3NIq7HjC2pu+NrjDf4Qx7EDGRhzDHqZMHMPWVjuieO+PveVLvchhfc8wtpuvpv4oW9ZXU691WN+X RUOszR3L3Je+xTCzmw2PWNbW12R9Gz3Sxig2LNu4bENWo3T6QvEEyrhHtl6KvOLrAVUtYH4k3atm srW4YZh7kVcE1Pg83MDR1l7a1IvQwS3cjsHdeiG32Ct4yhUNoASSk1PkkglKTgmY0kXJKZGj1Q3P 2pu8ZkAOyxmesvdWlt6EJm3ldzz72Kb8GOO7JBHzsgG9ZMj4G8KXpGOyhLkNIPmuYpEpSZJteMLW m7xmwCp5smIBu7W3NPVmNI1WG559bFMARJb5HAAxkAZAOId8OQk8OP19BEA4D31pAGTDEJde5BUB jQCI4PBrL3MAROjQFhuGdOuF8ipVYj9TBHOCkb2A26IpfiSRSV8kxjSFLykuHdPcZsVR1n7kHYZJ yNFwhK2fKXBptGibuuGo935IfqW6CrnWSy42mmB0KCXLUWic4UGbzF/MtOdv/A59Qsfa1A1HXfuh dwaMPnpmOOLWT1z6YVpGmx3HrR/J17PHwRKj+XqDZfgydHd34e/XYz/zGhyT52/8knxrR9rEHUlc e6KXDEYCGp4GlrT1lOaehBprc0Ny64n3VinTr1MSaQaytYtqV/JRTEc6Xj11yiNRjTCZ9W7sjhue a+1NX2Og5IEGHr/3Ngf7jaap1YbH3XujxJmuYzfsxxlGzmowZcChhJBGME85GEylSJu4I4lrT/KS wcjeMyzuWntyw2w0akabDUm696TX0lMJOd2FH/WblwOKSsXGf/B9bNjhYuJPVTdtQ5Bv4lwUXJK4 tNtxXVuf+qZBk/dPEyp/69LPXRpp1s7tqPZRDgFv/DE1ZGaj2swTkM7HO71tE0dE+KixnD9TAIuc XEo3WtUdT11709cUyHXIhifuvcW5N6VparXhaffefpQePVdHuzm/ZNBLc0KFTicCYCmcok2mVE/h A4tLuzuqtUt906CWEhJc7tanW/tk0qxZvaHaR2kaXINKvk4lVxOQ7tj0XvMd6qU7zYmUqRrKad5k tNrwuK03ec2AdMHywFP33qYoy6BJW/kdzz42HXSR4j2U8+iUK6xqqU1jNUKBmN4GF4fL78b5Ulkd WZu64ahrP/KOwrjURnC0a+2nTVKltExtVhzt3g+7/5LuTpMTPGDsu0a+kyFK6MBprnsOXMD0dXG0 CRuOsPYj7zAsayGk4MhbP3kOkAgto82KI977EXeBz1O66QzVgFFoAqYNxCXKjpklJabPavND8KY2 K46w9iPvKIxLiRSH2/pxUz9Ki7aJG45474fkNt8DlBOMaCx5DVCWdA9Q4lPdc4CypA1HugcOJxjR aDja1s8UkjBatE3ecORXApQU3/F0OmGqdBhAqVC4xKyxNDziI74ZgIKkUperMMRsZizTc5neYZik rA1H2Tua8t6DnKnVguY2LJNf8TXzfAZwwFT2yLGkOD7L1SW3wg+5EjfE2vgNh1/7kXcUpoe8GEfY +gnLOmFaRpsVR7j3I9Xaiyn8MsOQvY50IJE+LFrloyoqK/pMqp/yUWlus+O4mdwTjGgzHG7rxy39 MC0Cm+jnkq3r3o+sU88fbKGbqXSdGoyyDyXzl2norsuLFl3RBniWRcf3no02G5K09iQvGYwOyg8s buvJjZ6MGmmTdyT53pOUvnK0MiGt7qPWvgqQcu9UZeQTH0zLaIRTP9qAAESDfH1kbrWicVtf8pYB Y6zlaaApe2dl6sxI0lZ+x7OP7JZKoE+H7akEKPcllaCrxIL781KyFMDc6oZn6W1JJWjl9cCzJy7y lrhgmrTVRPWaSph746RRHjV5NugJyMQGUflJO8CV01IOONkGsnnMrTY8ae1NX1OgnJRQPGnvbbFE lCZrlXc8+d4bD1qslBDmTNkASoZLculBM+9BjJ8wF8Hpw9zqhmfpTV9jYNQMl+KJe29x7Y1pslZx xxPvvakfzFXDdRr0BGRicQ2DGBpSbnAx7xWgnqyaGtZqw3OtvelrDNTbfQ1P23ubSzmNJmvldjzu 3tuPIlsiC3Lx+csOpcvfAGGtQNeu4XCxBSEU8k2ERITN2sUbrrj1qW8alM67T7jarc8292m0Te12 XPs4LZeiP/g6ihsmGNclaHCFXDw6K8p0yDMlOjRIo23ijiSuPclLBuO6BMNSt55G0cygxtpsSNK9 J5ptidu22edXmLrpEvtVp8tJfHh2zJzEkKc2K46y9iPvKIx9c8Xhtn5mF19p0TZ1w1Hv/dCcyrVD MOK0HtxgXs7OyBevsnzfCZdcyu9Wp13lVv2pzY5j6UfeURifv1EcYesnLP0wLdqmbjjqvR9KnUjR X5mCGBOMthSqc+WvbtFiSuJUlimCQTtEFzprkzYcae1H3lEY/Ws46tbP5IAZLaPNiiPf+6FxWhFe sRTRBOIEj+YZPR0zTFbxZwcRrfTcWtwwzL3IKwKqkuAxHHXtpU69CB3cwu0Y3K0XDPFvv/zVl//p N/9r+G9/9dM//5d//MMf/uX3P/HzX/zLv/72J4H8x6c/+5t/+cNvv/3b7/7t6b//8elff//bf/3d b//xV1+O0O530YVQ8k/hGzvpn+R6j3/8gqPTTg5P//3/oMf/rf/5f3fgvz/Fp//89H/8n9fTPxP8 7/+GXL0Z4cuACNKnrzAwl35mkDT+esMEyE/Uzf/+hY4088FlnG3GV2Xnk83TWfcO6YuGzjnTLbl0 zvl6+htCURPuF8aPdNMZ5oTuG7bh/oaa5ad/H9TQhWxXngdG1wA5HoWTk/ozzGe+EiM4ju7OMPq3 D4NgnVwX3ALbegXon77Qbe50VwB1F7J+foiTq8YuegsXRA0Q4Q70ediGW50WmNBErzq6/XcG7X0u tPiFMQKamYBTSPLReoMluYZ9ZozCZiYgGN8WyNankkIyFFa23OUKF6eXsrDFep3YslAiPIBOj3UB 7X0qLYKdOkv5tYWg8jLDFDt1tsGIqLzKywzbet3lBbOAMr9XJkkF5ia9UHyev6+zwKaeRWJm0N7r JjEzawQ0s0ElZobpnMysUdjcM0vMjRZ/Y4zO3swYkZiZCSoyJ+mdGXOiRWRmBu29KjUqfjrbL6+s ztMqVkl6U4EqJPGn378e+lRapkUnlJwWxGnh6MRN/d51k0ImStYelY5NE32PJdTcvy7OJ9V0VyYH 9fdP9+X/PabMtJwk6CBoApppOeicWVZUrmbGLFrisH5Pu9RpMxMQpLSt0jL3MKRlpuW4LA9L5rQx vD5JMy33RT7Jy89lC3E3r/KyaKGDYrqrkoPym+Tl57JlpkXl5edZTTMtB30DWvCd2wI3n+4U508E eL4JCBZTUEMp63cFCu4N8nKn1msm0El7HJTMdWowC7lcUxMD4qwo3Q642RJmG/4Smy7jcuthrXk/ PvxwMELu6uSgc16zc/yBuk/wb1vWcjYi53Q3JVbGvWZwHLiHLpVt0/cyjG0g7sr9f4pcf7Qphpfv GACzNnvVzN0UzY+HRf/ynf107uctq3HvB1/QhFNArGfrnwVkXH/0nGHxR5quiIucUEqCl1aOqFDP HDnY0Ndr++5pe2YKPfwL8jgwM97hxjl8ll4Ei7wYke7+Ii7A54tRt112ZuHBir1e24ZPuzUTFvUj Ih4LLjy52bEywc9CG0Q92CdXbnbuaZM47CXX9yzXBymFmbRXDcOZsNdMWX+g7uOM21T3pBNupuLK t9cMyhPzHrUkqnxcYV4SN59l205f9W0mfA9bGjOBp73ztMe+5WHsBP7c0Mvf/vTTP778yz8/CeTJ /erLAfZUn3Ccv//fl4/EWPA2yQtw0Pz76a9Kf1T5FzGTP/8j7eF/+WWET6rOf9AV5O2DQuBumhdc wm2Cfr+tHHloFgjkzHjK8/RXZT3E7cY2BSpwrwc+bq2XnOsj6k9RZlr6vy4gxEcp6w== qH99Y+1CN7oJCIVgXUL0VX30Gk/GEy70xSv6Kr5sgArlqH9JDTR1KiClSd+dSNZw3J//LV4z4l5+ McS9i59nAYEeIG21WROqJHKij6RBpdFVk3KBoIoErt5nQcBnBewvEQRut4oEwueTSNijDAEHb6ch dCU3DSH5hevymV59VR+ZN/KknNNXhbEpz1zXTgWkNOm7E8mLSAziXn4xxL2Ln6/pDN3rxnfZ7Bts 9hN/bAwfoicljbAsqRM2Fkg/vPBfsYoZYH/ctMgQD5S3gX4Npeljk5XlhBmeBlH1D2LqYAiWJLNS 31PG0oLkB2G6vCZTUvUPrirl3vR70EqM17smjdZFLoyql18AVe/h4CvycKkxYVrBJOSC2QH1UNXe kMtpu+yQRcIGWlVx6H+JFMAWs79uOmQIRMyLQNijDAc37k/Didc8HpQ0TMynGoPBfX1kPumTcFFf FSZ3vNMMaKf6Y15nYCJ5kYtB3Msvhrh38fNPpi/qpQJSTU10wPhLxKJedwGBPpsExB5lQKQIx4CK nwc0K9EOUv0rrw51TG3TMgf66lDs0xxop/pjXedgInkRkEHcyy+GuHfx84E2BusHMTuD1w1j/HXT I3ezM16L2UmyPZlJkH02k+Sv2ewUkBhv+qo+XrNlp8tRX5XV2vHKX7NlJyClSd+dSN7NTqHk5RdD 3Lv4+SfTGawfxAgVsYh1+uumR+5GqAiIPYbVaJJh9JUwDWhWpMPO01eHSp7sPOWj6W9T7tMcaKcC UprmbeIkIIO4l18Mce/i55/K6GBlITao01CU/XFTKXcbVAp57bGsFlS4xIKSPyYbVCBs0tl7uvCG tWfrWUy3Itae/DFbewIyYq7V2ptKc8UGFRpefgFUvYeDf0IbVMSBvg+oe8f466ZC7jaoCIQ9ltVm klH0RTCNZ9ahw8zTV4c2nsw8U9V5mYCOd5oB7VR/zOsMTCTvNugkGL8M4t7Fzz+VfNRL5aOalsCX bOwvkYp63eVDbSSt/K/reNRkklF0k2kazxzaGVaevjqCRJOVZxGkukwBzgGOKdBO9ce6TsFE8m6C TvLxyyDuXfz8U8ZBXVaD9NLNw/64qZS7OVoXa5SU4GQ9uajWk/w1W6MCUnXrFoOvzvZe5E+k2Yt8 7AVY+a/Z3BOQ2XPydTUjd7dEhYqXXwRh7+LjY4OfIgf9r0v3DPvjpjruVmddjE6lX40koRrHcgb9 c3Bn2HX6qkWJJrNOeGYvMkeBdbDbumSQmW386iB3NzgnOfj/n7B38XGpLP30lqEa8GWyiASkJo+p wbiEae1RMwZuCdPWOUob11TDmmlYEg1LUFkDj0mmYAopcybu8y4YokODAxY6Ssumb/TkhQP2mNZN X8Pn18wCNTYEJKaIvqqPfrZTbOvKCx8GyYMRnxaE4mc+WIQkLZubEqTPQq49pnVzk6EWP/NhxjH2 Y31VH/28H1sUqS58GCQbHz6kDeHsNxu6RQLaEkcw11Kf86LBNbRkyS+vGnwKLZld4ecNx6LaZQml lyUaZmZnU3tliob9+CDzAE7tYIR5vG3xly0+5xdG2GNbVZiMNeWZETOOoXEtfttmRuiTX1380Whj RNW1NGs0AanKMsM/Lj6/PYZVo4mnX2eXPw6NYBrN3ltiWEuEQt3YIBptik88aCHD1RgMMD8kLArN yMkLA+wxrApNQzHXzIEZx1Bo+qo+XrNCM18tL2wYJD9SmoufGWEGd1g02qyVJ0bYY1g1moy1+JkR 8+4wNJq+OpT2pNFMo9eFEYPkT2s00R+zRtNo6rV6KvYcF42mnorFVS/VaJOnMuMYGs1iJGUJzJTF uTIj2hpNztUDNdrECDOryqLRZrU8McIey6rRZKwpz4yYt4eh0Swa0GZG6NO1arSh/2+MeICZJ2bo rBSdXiewWKb6WBeVaF6RvhtFJU6GaRxK1VSivTc7U7MNrS8xLXW2oB9o4k2jt7gOg0zlCTl5Hr0+ mS8QltEDcbzpQwHpluMWfVhndag+YV54MMh9rHk38cBiFwwybcf06GNdVKEOxN6NqgonHsyuwlCF +qrZ8ZMmVH+oLjwY5CoPPlrUFg5FbeFXT+nZx0b/n27PKzln/rfkLx8pc5vxvdizYOSg29rLAuP3 vm54tCTOPP3b56PrswPP8A93+5++8HdF6EDmCsbdj7HcWgsO/UbAjmSHK5YdLmj05x3NDtfnHd5V on4DOFrVp25/lxVYav1lsjpQXgQs6s85ty5C/I8eZoN+kKEPPt8Ag/EyoBtAcX299aSBkuXNlwGQ 8IpwZH16o9/F3dftL0iJbJksAvnzuVytXlQlyxDWgXbJLZP/wlooORzSGPTTBRp5YYyXqzhmUH2G 1E7vHZhzG8h9rDtRysG15cuNayo169NbPc1MNBvCzkYksSHAPJTzAla0CjmxQLI5gdv9W55lC196 KHlhT8LFNbUsINx4lhZROQ3+Tvh9cLaOp/c2upSPq3p5eRMd8xIH813K29M0EEV5AL0msnSMYzB5 KYlXm80W8lwTX/Hdg1gWbh8Gfx/TnaID2UWqp+eRrB2OyOes7a6foUa0/dfl7Z01wcGsJUHUAzly fgDyJ2a9/hv5p1nDyTKcVIyu1Wn90YpObdZXdM+MthJGzjTex3Ab5kGjrkRNxfJ82KDPsRrxdvTn 0rPsOIOAJlFMmMD23KK5dGyzOpgHp9psHp2qs3ksimeBMdELY+7sOzBZXpwGfVCXB6WqxE4v7uMc HMRX0x3EA/8VfbiEV3ZwQx1BOZ3AgX7RTrMAq3paJlj008yBE5NPROq701gOGvCkJ0VrTS/qWp7x K2ymQ1+d6d3HumvByfA5KTYBzW/rmyfY9OpD1rTqHh3RyysjP3FI350YedJur6vueYD65jLojThl LeuF2Yi77Omu+17TK/MbCy/VqwvQF3xOkfdkO7WknMx6w0aIROBsHpMw6jdTxEyFqKRFb6lEzdpt JuxO6n04J2Wq6GWRfL3T9ZCFbpbDNFgzvqfRquKZh6v6aR6citcCY/FaOHXn52F0+uLEg5MWPmlr o3d6dx/rYKCdcDPnYUQP+Ihr554eM0sqXn66b2Xn2csr/Sk9M10nxXpSSsrA+V0zYqY+zEmauGvv TpOgfSzCKbQsMKV5evckI7PSnDeOo4oU2NyPvnuCvWoLfXKtq4bSsb28wr8Tn+3daT6OWvCN7WAe q767jH+jb9WgGhOYVNQcJlAQeC0ghIRCXEE/S1/NeB9kp4uKoyGmRc8qJ76ex3Wn6E71SRdvHSov VZZnbhpsYtSBnQfidmx3hn3UFxd1OPPrpG5PalnV4Tx0JXRm9on41wVrfnMjTnmrRMy8NdjEyBO/ T8Ts+HbufsJJ3/nxMqm+eVgnFXlUpbJk53f195lzpyGdhn6arx8P7Hx5BedbgcRF5ZxUs8Dm6TlN 46KaPx2RU+U3S/xRSb6xcXxPeE4zsvdrhgI5oWKoN0kZ4E/1QwPdxYYBTiaWXsWmXqtXjdlYCAmB sKrE7RQ9X8+W+G6S1Y98+XJynl/3sN8Ou91jc68H8Obu7r4t38RifoxdU6eGlGVfinLLjuU72qqZ a8/BNhSWFhIllaA4khVq7opT9JsvNz9yXsnf8ZwPDvYbbvh3wnKH6N3Bw/0nkSyz09vQWE09PlNr xE3hkDOxYSa7wYaZu3rRAAsgMWjzql8mdTURe4qaHWJdb0TEvuOinzz5u7//T1+WVFYyS2/aOE2f 60qcIkHvX7a/+XL3NF6+HB2Sg9tyct1e9/C+Ezw6hJhOPpAsOl0yttPZ5SHX8Gwkrkbri1Ydv6VC ZQEIVkFuXrJVnMyLfcllsS2xooObc3KHTm7aW+7c9+JMp3jUyb3SNZfU4GoiVE/TfZpJ/1i0+Sgh sA1OhetpyrMWc0zkJo952S2sOoWkDgGcUyzlrZjL97zEozd58Dp19fE1UF08ZIBq2+NP1cFWeDFf AgNpkftXsrJuWoVVNXlUW8CxwlpW4RwrOpiaB4P0YOy/4RN8JzhxCGGcTG/hlWbWow130ui2vPSm l2X1mXB5YjF7AcRiKWLYjYPd2p8TdN9z2E+O/VsBgO95Dycv4+SN6Or7gC31fvW0e/MvX85e9Vve 9/dM+KOp/4ZLsERhDtEGMOijhQv5ULiQf/Xk8HH43iX+xfc78KlOBvAfH7wJecP6MsMEsSy9t6Hy /tcDzt2viBrHDMPoUZM6k9rWMp8GHawnIp9Ta/QdSXcpoQILDtfMcUetv3UG6ZtfD9jMQXjf+qWj Ne5OmMJmKvrvN8oUNpOx4xukfYhviq7dqXP5TskJ1u7EtZW2eJiceJiccJidcJieHd8npicfpicf picdpicdpmfH98npyffpyYfpSYfpSffpyefpKYfpKYfpyYfpyYfp2fF9YnraYXraYXrqYXrqYXp2 fJ+cnnafnnaYnnqYnnqfnnaeHneddNt1Um4n7XZSbztG60rg6aBF811lHkDpoEXT47RoOmjRfNCY J1g6aNE7aZ/SouGgRuNBZZ5g4aBHwyuKNB0UaT4ozRMsHRTpA2YoH2YoH2YoHWYoHWZox/cgRRoO mjQetOYJFg6qdJ+hcpihcpihfJihfJihHd8DdGk66NJ80JsnWDro0gfNUDvMUDvMUD3MUD3M0I7v pk7TSZ3mg+o8wdJJne6cUAVYD+qUyVt05wFUD+q0Pk6d1oM6nakwE+8Aqwd1eiftU+o0H9RpOajO Eywf1Gl+RZ3WgzqdhxwOExQOM7Tje4A6rQd1OpORDjOUDjO043uQOs0HdVoOqvMEywd1us9QOcxQ OcxQPsxQPszQju8B6rQe1OlMRj3MUD3M0I7vQeo0H9RpOajOEywf1Ok+Q6b86kmdLirtpOZOem7H qF2ZhqKXNmeVX9q81RNQ3/56wKg95UNP+dRTOvWUDj3tGLWnduipnXqqp57qoacd45Ajz9I7Sc90 cLDKf47Dvh/5yFSgLKYxn+Xp5cs5jiE/H0AH030C0XeJDlGp//plKhJ470DTneaTc3+KvZgAHrzx ler4aKrrneqTz3sKSeQ71fVMdXk01c7dyTbY93z1dqd7x2dCssceP035HqKbRTvd5fgA+l7Abxbu +GjhDgfp/p5PfIpUnkJhs3w/jPA9qDML+PdcxVMM7xQkmkX8YYSbSIaTjH/PhzrFt24Yb1L+MOL3 EMos5fUu0gfQ9wIys5SXR0t5Pkj591yVUyTpFKeYpfxhhO/u9izl37PgTwGWk/s+S/nDCDeZzCcp /55pe4o83DDepPxhxO+e7SzlQsZqlBxg3/OUF1NF02IPE/SZ8nSi3CyTE/B7PuRisDyM9t0XmmV9 ITOfaD/5vyfvajFbHka7CedM/DA+ZkLbifqTb3jDeTdeXqP/Y7Vh04fQ1EO7h6bmNEW7Zy7UjbtH pl4Jr0xdxEMX4dBHuHcSz52Ueyfl0Ek+dJLvnZRzJ8OfPfi4C29O/Dow7HqlH03qHA== ZiXep+AACodpeS2LEA4TEw+TcIKFw8y8FgsPh7mJh3k4wcJhcl6N6IbT9MTDVJxg4TQ/t640THyY oHKfjQMoHybotbhkPkxQOUzGCZYPE/RadC0fJqgcJuMEy4cJejVGlE8TVA6TcYLl0wTdutKFNcVT TK/NoRNdqAfYHDnZ8d1029RPPPUTTh2FQ087xpuCm3oqp57yqad86GnHeNdyM/OuI/eO7Dvxb8ep nX20/Kkcyp/Kr55c6LsfitkDtrqKDTXEmvnf9rG7W3acLxNM8OrOPve1wPTdrwd8gC0nh6yu0L4j xwHduVKcCnq5Rs6+bodvaJb67FsdF6/0Vloj7K08E3FiDmtXLUbX8v3ArRecOfV32TTWXvwzffbU dXr4E1zUKdRkbOP5hy9kaS5tFAWcgHhle1au/TB1Y21APN/KRjiUg3M/e5uN1HUsP6iob9NoXHua TrHMFbB21oU/LLgU6u9UzXJSE5dWuton04/Rnka/tzEiS59LF4eMX/E5Xlfkl7ZG5dlfY1zX0sH6 243EA3N//LhgJt8Jqv4gmB8/Iac4h2BaLzzbqfYxWJeZjw3OA1ob6Nsqb/o8M21v0/V0SPlt2d/b 7FQuw/gkn7X/myhTibccpmEsz1WSXIROYvlJfQXP52cXpPPkKUzlJcbnrtAHs07M29sYsSKt+ryI 9K1ReA7dS3tz7extdmJPs/QJpiuau3B7Y7pKuemOcURD29ipOMeV0gvuIeTWG4uPSqKCda+Zx7a3 0X+P76p62Nugu+zeWk57k43SdSif5Ll0/1A534b0MkAqOMU9X3XaKY6M29oopSK/8rjI+NYktf5T Dm+upb3NRuhhdj7B7N2m+dQGuQvoywRT8okT11Bj4FZoNS4s2BsZlcJGs7pmVu+NrMc3ZnRvc6P2 sOQ+wW3VaDTtzRu3FQ7tla64mGK0x3RrTu0sfVc1nT7PtpjCrD/shu5gI+0NxMbS99VUmPvY2+x0 7mPZTbGh7j69qnfyZoNMV5EaW9ztnQPr72Yb9ZXe3NkQ3duwtcXvXxPmGX6j6sDYB9hgu1zR7cF6 3rLMh5fs9mBmb+BDvQuyWRgVppPM5pV2JyppHszawOhjMbvbRVsDtavekvW9zY3EbRgPMr9u4mt3 FKuo6gHpp/mQmGpLsYkXlPOsGUwERQ0r7vbOuPV3s35ENI/+2t5GLKrXFsj6+07faWYeYG/dBFkv s7Vdic+LyU0wFge3Y/fsCi84Z3lWmArL4hg0b3p/Htbexmhlmb3bQHsDsaHeWDV7k53MfSiPsbRu Im0nOe3W4Ul16HnYbCdJp2t4tjFNdpYKjNpQ3OmBacvvauyIrB5sn62FdvPaell/32g7zMgDTKsH bni7WM4GlpmNYjvJxqPm1WDB2sAsHGHgyeLZ28ym6GkO199vBB7W1gNsqv4vRSUfIseKdA4JWkdi AKmxpR2rKtTn2SBTmBlHgIezsXRrI/0pDrUd5n72Njut+3g+yXMlYVapD7Pm5om0jmQTUmtNOz7x b2+jOGir9Gejdm/DtptiuBb86283Cg+z8wDL7g3p9sJUseXIApFscFH7I87fRBCUs2xbN2rck/mm nYpenIe0NjBbS0T2ZHvtbdR+e2v57G1uZG5DeZCNdxfrz0d79uHNxp7Kjhpz2v+JjXsbxaGSe3QL 9zbS31uraG+z03qargcYfm9pcb3wRG+nIMxiV5sW95zwWJDOkm4diQhNaQqt0KDdaR7X3sbMMBHl k1l2ayOm3Rtram+yk7oP5zHW30GHKxKL8aiwzxxPdkEjQ2ac8yxqNyI3at9pt0febW2yXbVK4nsw 07YWs3fy2kLa22x0HubnAbbgQzfMXVRna9Di5GLs2Xal9uDMir2RIlF2niy2vc0cgH9tXvc2N2IP a28OHc3r+K+/WEL16RO5vGsxM7C1jxyedncynvY2RuIE382AvQ0bEorhWvCvv230Ge0P2u9mvj4s pXQtWxxTrpuXdnjav/c2RuRk1t3M7L3NZIy9NoN7m5XSMYrHaNmHslhwXrN+ZbJVc2p3py1jb6MU ToHQTfFtLeYg5muzuLdZqDT6H6RVb8z9iEZQZNeiR5lgVZC2HlWLzkPeGxl1c7p/0257mzlH/9r8 7W02Um0YE3Ptq2niB0ephX2aQpTDlGLz6oEVIu+MOM4qf04lvbsC5P2x/R+/vJIT/0CRyydS1Vqq bJ88mz4iYKrB/I043V/+Hr69RfxrNSo/o4jkw8L2+aqPdwYDN4Kdus3qTDxN15hVPZwrw3m1fOLd NSHvD+H/+OWY0f5AzctHU80fnuP3cOwtyl8rOPne4npI0cV746GfXtWHyX53RcZ7A+s/fjkn9D9S cfKJNPuHJe0dPHuzWOZc8/GdJfKwhP4HIjef1mqntPpHsv4fCcTOG/CSF31vZcOH05YfFrj3sO1V ss8my88oG/i4cnlIvv8DAZhHbSUzvz9SFPCRiOq0A8/dv7fq4WPJyI9P9XtY9irVZ3vlT7myHpXB /0jM6tPa9CAmH0nzvz8mOm/gc+/vrmP4cDr3s3v3z+HZ69UXJ3vnO4vrYWnfD8SjHub6zeHgj+SF PxLanLftJcP1gfz3JzJPn967fw7v3qL9NZPne9nhh+RkPxCme5gHPDPuI1nbj0R9p0147v4DqemP poI+bbv8HLa9Rflrtsv31sqjMqMfiV++Mm0fyX6+P5Q9b4pz7x9J8X40nfWOwb+ZYT5bBN+R2lfO YyY8/7e//ref/svvf/vTH37707/++tcMpmOa8w9f/vr/wS+Vf/mL3//xv/9fiscObBIUxzZ/9eV6 +k3/7+///csfvyynMs9nMulE5q+r8+k5Y2OuPoVnxGl+3RdRQqwiKOzrCosOC8wReHr9FbBg+OkL UojjU3fPVcsI7JPEzS7d05/sg4SXLehOSfTPKXZDo3eZ8c3jyETT3RrJC9iV+gRg6MJWmgCvrlQZ GGOTlq4GTBmDfUvatk+ovp+lr5C6muGeWguFgcnnKO97VMfK+7mbl9I2Ny/A6F17Oo7ghy+QmP/w m9//4S9/++0Pv/23n/7x9//j6T920J8hMVVLzr96+g//9Q9dMP716c/+4i9+8+3bH1/+5t/+8I9o +qun/7k3/F/6f0RFfPYVAR8aXHBVuBPxWZUqYF+YDuRWdHTOR4FNzPGXk8FF/hAIg6HoGDjG4Uop CuwbmLK8jvdrqremoc+5AJNTpNsAHsic9Fyzykigb38wdFAcw8W0pefgmhBMGSgGXvkSLtBHOn4Q BINkn1OWtqlzR4FOsa4EPHTi+xpR8XN9qerEl0vnOOZahcclORVr14JOnKxwLKCnb190Nks04GmC /077iV6Hi/XLwNqa0BSuq77FRLS9sjI8ZCU0XoI11qKEbiP9/4KL+Coig0u01ZNVeuuQaBeFsa2r AGViMDZ0DahsjK3IeIsL7U8+tIRMOGl1ZIG9Cb/LwTHUuUvl3HkWGtnyGBjj1RgYurMk8wYdehUG 574NPzEQm4D0lRMjKPgSsAGL6s3S25KIJXxpObCOrsbINrR57eaykhWDV8XdbCJaF/ZI7E2uS2Gp jLWra8KKIUYYTwQMMcv8VKwM4UxpXojt61OoSsF7Xb4lyghCSslEN6dQmYC+BRTdZQREviTr/a7t hYPEdX7dPdNtoAx2mbtypj4an7JjoO8brXClb46GYPTvLtulrsaqpnaidN+pITGouhrHxidYa+80 qCRfPFlgak06/lWEHiedAazV5V/dpaZIN6p8FTXcXKVVgi8kxUAMK32L6CP/B2pbujuSVY/DmGNg qXlbZqGPkz+IC6w1CCM6OLqUBC8EhYHhqo6B4XJVgN0kqQyM+RIdhs4K7/YFX170SoGwF9TWoggu HW43EIoh8KLv8LEkX2S40RcB5qsvK+ZXagrsK1QpSPgqolDgI68FAINqqqaMuTH8oZPpLt41Oh98 qmZX+uKEv5ENpA6LoSisxvj24FKLCpY1Gcbu3YGJJR3Awsq1A2sdCKILCtaufDKamuFUY7cDY/X2 ui6pDg5NJ8JdQRGEkJ+ODHigHodCvAQ3KQFibld45I0wmLf0bnz76r1KA4luSqheUSHvy53H1sEh ZREcMhUZGLM33tYswJxVRmPMA4GofPRVhIDUVY8icCUw1r5juKjL9/KiRVM2a7Qv5MpLvQNzSdK2 L6ggwJaiDPWCwmIEeNDRXoVVVsIgXdPOXBZgd0yULK/iQeA0gxVYqi5fYQyAbdZA3wRBdCrMPgal gD4byZyFiSMIikktRFkpcFk1UA5BO6MtlIBFTCvwQIiqpdsW2v8VdIGUVnQArjRVH3mM6tw/xWd4 bh1bKglznwUB7coMLL7qUPM15qCJnV/Mskx1WmMhCYKug4OuMQ9aGUFv61W6XE3a2ZjwCfgKBcm4 5T3b3TSuVjY5fF0KLpPDVnW+xEya5bBMgtx3V3u/mMDgJi0e1fC0ugphYOuzpW5Du4IupIZP9M5b AwO7vaMqvO8MAiQtNLaxb4KgXU7HBSOyAzM+GpxMFbAnnHGWxck+2K0d2QczzrMoBfRNaAaSoDEQ aoeBrVOjdnF0hqCrbz/hFWBSW16FM188xGEaGwLZ9Ktsudl1S0B9llKupMCkbCFPgV/vxpNxtojb nz0iC2Ie5NQUSNaZGNxFEfjnauw2WkcwoTAqBsaiSsdloyB0v99JZzX6Km07B7Wz3gG7Th3cgtO5 lRhBjvC+VcdVXokdGEKLt866rVYvN21XjLVa2yJOKchyVahtZrdkhD4uMQxj5EgAeGAOGdwXZZcu GRLZb19ea3rE+Wr/B1qPo3qVA8rZgvuNqGnf0VpMU1MGDqsnN3ViEMIrVX3fWpXb3YZQZ6xyXOB1 Ag7TdZzYmxC8KTCbcP3Dl1cF8Siyr4h3x5uqrCU1pPoQomtqPouKISYWjRR0cnnCi+vLive0xNoO QJisWYA1sx+D62RTFWC3rvn9CkP2EqgL7Dy3vpgv1tyd857VTkPgiocV8Sldjkv0jdzcEyR6yCPv FldXzdo2sJ/d1d8zPB8AXRdZGUF3s55DZZ/JMYUIWzr+oigBkxNgnxnZkyXE+QOFOAt37h1tyAh5 erP9WQQBGxsE7Ur8aic5k8nYjTaimPsmR6KSE0eWv3NdVVeivTekkmd+/+Ltit0wIdMl2za6v8dR LOc8KrClJ/owMnOvIrhAznGSLarbsPDJCWlXlJl37lbVYu+m5HXJ+30n7WTz+8HsnJZUsNGWR0XT x9tOChw3JAGsfT0EdsQjr1IAL/X1EmK5kYSidJ/ZJcFKgUtCUC4NzAIsPnOuukl2BF4EKGd1ejsL pi0C8b1LwEmMRSzYyP6tV6nCGmrsNCjwm+wxnh1LgEPWLb2yVKEz2Xhg6UQnXZGa0T3u4uhpB0ex CTpWx64aEDinFFR2QTuwIuzwTfcNT25wBzeXdJMLwbNoZK+bpG9RQhlkfo1NukowQw== /dKMcwGkhkBrdyoE6HKRlg1RODVUoiFoEpzrg62xCAEplSxAd6nAkkSbpWSEdYFSo4rsAF4cops6 MJeg0Rz2p8Q7MMLKpT5L7bqW11EsUX2W/qjRjNB0BIiDNom8dK3PCKJGfkFVuNSTkh0OzCpFjU3b zzCwwEZJB3LNJQHF+sGayBo68kFUwQVJ5xA48MIbY6BoV+KLODLetGtjo0sR5OwEbBLXEThiLGJj 6sx5s+oqz7wiiE1ZY/z2OLCh4bdoIbUqLmJji/3bl1fbvoL1FQqO1B7HdeQBlKMXwiyA3zoCjWo1 cX77n0QhAWln/EECgOqgdFul8oZKQLbjq61PAG0IEVg1BHlJZAKhJV53oFGcqd42iCQO27rg5n3Z /hPfF8ptL1m46TL7HpqNrZIO1BRCB9ZUDIGa3NV0H1aQBfw0DEvccmbDqU2Q6E4XdRM1fdVYCfGm hpivDNY56erCElcmkkHFI5NpBDuCRiVK6Jz9O2kbLjVs1FSYYr74nnx9i98jfFYt0IbhDHYVNkPj CMlVXpaGwOy1WmRyb5GVf3hY1Aa6LhaxZkfWEootODFc/eVU20VJMBZLliGMENULn+I2RXecydlL 4JVOsSnWvgyS+stkNarDPSIssTndssiukXk3d3cbwrfHsOdvOc39Vz/985Lk/tm57yf34ex3YROk NEmH+Mq2j0G/rlCEiH0tkuUuR4i9aUnv733ti/LaofPs4phy5EzMi4ApKULgS6LzAWfH2QOIti4D diYnwBE19VjDSfFKVAvAi/O5EdGdLMAcixjVtRt+hoCsBgJrCrEDxXrpwJajAkPhrSBOIRk/Qj0d L5b4V8FLdhOBScUrsyvyrWzaN47VeCi1pqTJTj2mBXl62AfaHQVD2DwPfWdRvC3o6GhLUio6RQKW tH+HpchuU0csoQJwp11KV1EjBuDMy6obimJvAFjZP/IcXBesEsFAqYAs4AA7LSrU+EjpGR5t4nhX uFiBiiDkPN4vvMtECkIJ7NJ5oDK4o3whJo0fuvkZWXF7JNhE7vpu75vMDu0zXAfi2ahi1oAfBma7 ETIim2UHUqyLgN2HEhjFNXloTY3RDk7FRERH7NnvZwEpErD3al2h5aUFBmjrL1sRHC0IAfeJKB84 L9Zhl+PUQOQwkBFg3EkXe7SEtMnay8ErUJ26yAvuB+FXllKRLvueYxgBQflUhCodFnblrOs0a/w7 oOy0SmdquAaKj6n7K3UbkITkTRLqkITSnI4W+VUG0kpmoHhlABavwKpRN4Cbk/kiG+KrjOwKVcCW 1YKrrHPTF1PQ4cZLJjcENa8geZKi8WzgfdXuRMK6CybeFj6nI4LQXRkn6q7LYq5aZVRdNpbLugmt qXC4zCOAI9Tc00m+Ve5vbFSFq9tc1MgAL76mq0zcmtdX5LnthHUA94n8UeIjKriN9+oXAQfhQ7Ph 1WJZy2aRXQBDTZNNzX536gxomsPv/OCZALhavl+SJDUbDV0je9YsvWVNHCSqrA7Vn7+cmWkS7KtS ssFtE29SHdiXQRGzXK1XNPVRbO3sktKV2ZDk8SZOh9ZixQnVMuNomTTYR5l9xVtrywpusvNUFK4G YQPyU181KOUv8Ry7La29FVfFRaSXjtPD8+Z85MpSMWE5iQ2o82bc18Lxoji5DBRa0ZYa8+zOfZWA T9col6aQG8rlBFgNgUawdgJUoGBbB629cCrr1Yw/eOtYgsqfBMeXwPHieGqt/Cd7sJJJv+PVDhNi FrwDSl9JoxgIxBVhb5qjc5FjCAAyUg3ZqfC2kmVxk1n81cAhT2AFcohuB/oJaHidV7yeMzYk6FV0 lmqBZVAy0JZ1V08yUEC4wCkNFQYgTzcBGV9DoWCbY0g/KAJOfxOYnWcAU8k3BKNz5Tx9bdmzaUph GWY/4klk0ofGie6vAhZTITSr2+pAqXAMoiYYSOMmIMXBfhAEEsEAmPfYCvZqX8Z9K0gB0stUkuNo JRNQTSV5NTo7WESeURSaValVZiCZAQQsiN3/oAhylIJVL1VBg7BIJag6sBbZdrkmuxkDy1xlcnHN sHCxFUGgPj2AQRHEIa+OPXnmOMb49Tw/X1l5uMC1VrzXt8QTR+DoxGChON1XAzdtzTYqo3AKLORD H/D+MDq8shhtzeXv9UfJUN6rPK1UxJcljgsMsL9OaIcOGpVifbeMpoO6Fldl3JIqm84ejcyJ4XRS Nq9rc6haLzo6S4QYfcGMYxKkxuBO19iFUy6iTGm7fXlrU7HFjGA/LC3bw5rltty0gXhR6IhRPx27 UxWTOB9DS5+y8qpnZM+juJhohKTMR1yb9xoKzSeNQIfasukZKsXnCLSssQ6UVBjifaUc1IyQdFWJ U4tpD23G/ifVnUTNCogrhQho1XpiUMRVKB1cKi+uhhprYhXCrelSFScloAi2mr2OO2DKJekKiiUK Al6yyApIyq9JTS5zr2mpA/BKYsFbVRUpZNW8loLqfPYcfg9c1qMUpJCkbZP8JBImTRMmWmrVgTTx AMq7jV0ERikFlq3pQkjBHIAOpJlhnmjQpjXerSnYkJBLkm58lKSK1ky2alRyWILf79ASFSpx6wYr jWP/KEMtSnuWXNMcVGhYM5x/ES/qq4CzSF80wwFtfZFxaUFDk/wxj0tTCq1Mk63LvpmBC6DsRgDK UC8rwcfrbJfh879wwL8KONQqoZno2DlFDuuKTeWKzUjMf9bRjj0OYOOMV1ktskziEPasuwOSCOhS XxffVNMIDLxkPw9W2YjVwpBk9bEdRjsV9yQnLADV+tTwTMfFfi3ZtiLsKyoBwZIkos8ZbW8RqXQD Q3XskDQEV5LMiiQRCcgbLLCaCAXWJMw/x75IQ2SkCVLnOHPRgT43IYBOETACr05dkkjArykHLL6T ZSYB03URuaJH1f4rtmuR3q6+mDmt1YG1XFLlXIbt2jiUAaAVr9S+Nq+9Irpa/Q2ANet+RLmosZso Aqp8IrBmHioqfjUFZoZDQ/5JUk2jjLQiUKT1yLQXMzDmJruUCfFlIbQ21dI3SSgyBWJqN8/VZ5xa lGgKpICtQmjBNk1u38A0k+pEtjS9Cyc+F5HXrjy0HZ9kkU3IedlDikgRFE0RmCYGKbtfdQfCHsfv 4yiCZjYlk9BxdltadhxTLYnNU9nYlIH3DfOr7KR+qnanyqYXBTdN46nn1zzn6ViQGgcBASxa2J6L VmADnHxT+eLcBYCOZozkS2EbAbrHR84f8vCylsy2aBuFsyIYAhZtKyWna0vIh7LS56xgEUaw/SpO EXAh6+tzMbVNSYXBi+BK2cJxCMPwSzx1VGnfW6vhp9G1aiEk2HhSzF/tNACswarJLRfDMPxCsIRR k5VaORpU50QYuspOskC+XMkQaES28vIRoAR/4fEaWdsQxtg0MN14EDo2yvyyakCEQJXTMGs15FVH skXizq8YpQIuWiUiJdTUVFOlpP+PdInRf13mXJfhHgKs0cfKUfev2pp3FApdQFAIFrxmFWnnO2BV uS4aGSJ7dLJd6eQcg4eL21KWxTHZf2q+4SOLedpT7cwG1Qjqtih+f7rGtpi4zFi2hKBrQI70pIut HVM9VXeKKmHFBg9LixraJO6nBRdsu5aKbAZKfIvKKnRb9c5OnVhhStcQbQxMzkE1nNywjUIS1K/r IqnhnYI3Dc67E8HTGmJgbRrRuTQdD6gFf65YVW+lbHuaugqeI+UMtDJ5GAFsWZHoFt1oJIQ1RY9g mnD2E0DoXWNh1TCnVssSu9TLM48hsEpiJ88iOh3cqlGrZkzi8m1eEVKFjF2l6cxSbNU2kKq63xRk N85CsyFk3ZZyUivkCi6YeJKaoQnXtCxsXgvKGmOKlUJdMxNhympxjVlHyAF76YzCg7rCRsmPVkjd F57sgTBPbPnS0ntRcPYSraW1KUbHZcDAwwDQq05Iww1vk+KdEGgUZkGwUQBl8ed/JCxiTLJBEjUb 1cGpXFKZpWd7AHRVPDstVqqwUVPbTZIaNZ4Et1aWVQdmThfA3auXRh+l3J5MomsgaFEdTjqap9HH wAuLTI0qGCABAsNG+GuKA6gS8lNyFZFvrkynsjvhGmxfrySIe4hD8Bw/Q7lX1XMXHexKDDreGmRg qagSylIw34E+6k5O8XgdmKSNoMe6YSidebNMS4hKgcYW+gJQWxF5gqJrRQuz6xyGIKEXFogv6aca KERIgjL8GoGTovW/8K+97EgUJRG/DcGnoLmKyiY3ME85kKysDVdUv6Fook5NXt4uL469oO2wBChc RsDUSpn24KrW5ZXVQFD73vNbYjVcal0709BkduiA9agMTBQupZ/iEXBm5BTjRoEoEtjX+VIzQIp9 QFYwoHppfc4R+tS1KtYFiYJTy2nMg8YfesvL2E0bh1EgdYJ+RkB30HDb4WVJDgfAMekAV3EfpbyL fKQiIzBJanzAhhs2TfITXRoXkbPr5OU18bOvYV2pP4idNY05kJMLCFYFN2zHKk61RtSGyQWgxRog RhITCKbhkd2qXlx4PfAMdWCOrsRfGSyBb6IgaR7r4mOfQCBnbUbiA75+0I0aGkkYaGYqTuQzqNtM QfRhKBp9oa3sB1GoTioqsd9nCSsQWLUJXcMoKKoCk4sK3BQ1lLh7+kshTYLT+BFrXrW4Bk1EQLTT 5nWZaPk/Csez24Xhhpd2jr/9cnG/AfG7KhkeEjY9Rarl5t7K1UPmI20MFOUPoJwMRVpBdQbA4hMM CgFsXvLK4t/dCRA7ODc70jjHcDs4VCeIo8WSc+N9Y7QWFHK6a+idO17tMKrchzadZEeVP1tMQcII XwWcOHADsJfTPVFLS0JjpXvEq+n0ZjFtz7bYi4LFu/EcH/6qYHYWAZYdKjQrz0QJLG/oAOagLHWq RO/diX2DwJGUVzjYt3o+MnFMncASsU4Rp9Uiw4ooAQAlHehYLrRWuEmBibM0BSHIeiuKFE3eCRhT IrUYQSqtdEpk8wJYli0BNf9lp5WiplCDVLf+oFPNJg/h5bEByD4zgFI5cpq8I2HCS5zz8EF+oFTH i4INTRMDpwNxCuFpydgBmDU5N4oOgUDuWrk0+U3ApMNohRfZnYIfjLTomsgVVTgoaRom85wMYKDW DXveDwWYbDl5las7XuVF311SkSxf1vTcVVA/xrUA8IGTePrF9s142Rm2jqIJ7ovHesSrI/QaYydB zKIycCKC45O4OADTJkCONQEoBYFFDGDJo3uZbeBtCq4ciANMagcXpBsButSjZUET323yImBN5ie7 8gRAFgsCiuqMzKoB/EEReNaoif2Gr+fuvhodWkMhOUmlQwuUo9oWIbANyUlJyRcFpFT4uo0wilHQ NARNamotGzpIcXv/1r8wCD5bvUSIgPhFocKfYIfE0qj/C6Nw+1LvD4VUearRTllPPWnAC0CrmCrC 9RsBOnNZT38TrjI2yBGWtPI9eCxJ2lqRaTdQ+OwZHW6wKsbMNclL0CFkPXWRLts/7g== FAzSNsx6aYAaapdltQAMdnZFSotwowGXryUpj/1BEUSNh1DwULEqFRKQOQ2NZ9PrkRQ6dhDEYwY4 XXoaQev7vR2TxZES2RG8rfsOLG6c3WiXxTlEYxKCrEluuTnkToEyLVg5ZWTr+EXASeqDR8bpXKMZ 2ApgSYuaGsbdZkwFbbpWDqmrNozKOG9Zaz+dYg7e6t28qToqHi2CNTaFUQiAYN7OIKNOlAUKajjZ COqlbTWaEEa4yXOuVEeg9Qpy96hQJS1VL+AuriqWlrMdET1JtT2SJeyihVlJZjH5gUCsQMdXhGn3 FH5kI6BeqkT0qIzjEIFot5TVtvR56ELP+TmMVQs3g6bYaSOTu0QCkg8yAzm6MYUaXg98aP6rajdO vJKNpTratSzVt5ekkwOCI0Ekg8qYFG2W8tfAZTyK1vkgqsnmO1geKsAO0ALcs9ItYvqNenL0lbTI tLWiEruJ/NiVqOaUwkoUtdbdIHiNYVHpuG4qkteg1qKxIp/+ZaBKXbTDwZUrAX44dzcZCpcmpeg+ ohcFN41A0br/qmAJXTheXgzUIJazcO0d7xh4y3q52jhbQuA4g3Xg43C+BowIGPIduOJVyyRz0QFT Em2EmTMVQrWcCs4aOZ7SjgAWjWVZSpmalnhvOoAz0oUApQwXjgQ1LOGqvhi4iondJC1AwFY2Kxa+ tpm2iGYoabS/i23KGUIAr6AGq4jnnYKZaRpnm+zHGVwc5xbKKCF0VodyGvQNwdRWqguA9enYv7ol yU7KtYkwgJvuThqQyonFkYCUP/k7aVtK0HSXKJClrZwhuvelRBTbWyrvWC9n8FcFS+l4teNbAIbc dPFy7ATApDnCGvT07wEtb/VO42VUC1jG5Tp6/WEHPzEkyVnzixnBwByDvm31nGgrV5JcluCjkiur OpQ0y737SXiWBWOyw/WQ0B0SrelAqfFWPSNAPpBCwWMvV4VQ26GTxFsapapunMO+r1ieN6+xIbpb qgpl2fNJAQbLlWh5HKfItgoBtHOH11XFDQPY7oXScldCoIfdposPKO7BQGP6nTCZYhyHznr2kCye FwXbFRIWcunz4eweJwmJAigbWGErhDu8LLtTONzMwFHop1OP89ROb4EkZaIIvN3KqOYg3ZqiF2+a b48MrF5VSjnGH2QIA+90olyKSWIeZ9oRDLZbPs1kAA+c3sYi2WU09XYloRwfy87GmrkkS3k+3rdI hhUIR6nv45ZSE6bXRSoCMra4rTnThFfvqaG7Ib++NsUClsLdbNm/PI4N0UVyCrMrM8ZZJMyvXeyo QR2QIOZYMTV9F6UfTMY2EVEZC1YLmiTZk0exTrGyOwBb0NO4GpsAVNJxZQSFnBZ9xXE93ElGWcGN K6oqF5ToOVQ9WVIteZDKdCBXnTpcjxTVbqLp/CYIvMxc5ZCmIEjBEDQ73bpSoKUU8CHrNGatttVy 5PKs9SBJw+xR0i4CbMqckU+/gzVvV1JVVmoWKFlBV5lPrFx269woFLhRK+oFt6/IoaDEtQIvCpaI V7JqUYidHDJIVi1Kd8Vc2tLqcEiWo1yZohYIyX2RgElrnBTnq0dlcVJlnyFwupA1+jCRldUluo9A pfoyjyBzeu9FwIUrNOhuX6cXO2nYB7ZjC2/prUvDiWhbgl4XpSGQcZ/znYIfjOtqrGQOzyjXJUkx 3f6GO28uvZROL/uh+2X12rA4cz14XYda/RTzdIWe3vpA2jXoRXNJ08Y0+kvbOrkXN/PFedxW5Pc+ hDG2iwsy0Br2xYuB9UYvJzsDUaGg8h3CNB5exh2vK85kCNb+p3T9bXHYWR+uuNXN1I7qVL02j9xX A4sGzGbid6AeNM2jECxaxCRPzjbl5rNuGxK9RAr7diMxTrplXQQuTUl0KUfS1flV8PJl+/OSQRrd 7vnWO8WR2bKLioO7RpatRd2htFLv/2Xt3VZtW5IksS/If8gXgdSwkxhxj8fuLT1ILCEhqKaLRoji VJUusPOh1U2jv9d0dzPzWGuunSUJUSR1jp+xYsYYI0aEX8zNrIg1aBx1sXKH7iq7Uj7BbtE+vEU0 aMZ6TYu1Tysak70pKU0NIlFJvac6ftMGseKUxTN86L64a8snQ+a8qSSXPwL6SkLDdsJ83SeoCS8g MgwODB/t6g/dPgDAbNksXssu79/t6/2Cm/iijTujo7Dj9cajIT5ux4fyL1ZA211yhxEQZGBC8GOd INkt8O027qEO9MdmDbiy09PwQKCW3VVQhnK/s9cAmwAs+i/W+rSZnGS4sAFl2QGYE7sS3HTPf7HL CzAcuxAr7mEyzXO+g/1NCXpN33YXFW5LPteHtc4LJGW/1AmUztbiXQTszyzuvjlLmKXcRbvNCW+f A5DbK5p8fniNBce1Mxg1DtrXJPuOMGV2rTLGHoKyGYuNEOWeApsbSiRnwojo0nPrPdvXHnSMPCFS EUZCiC6w0SPwlkUsU39f1OtXCeV4yEngiZBCeiz4xgNNaHwwDfN6VK2wyXYiox6CSQq3jc94mELi 2KtjaJc4tIGyiWmtc7XMpNO+xFbgWM7oBPBrJxCPY2oGRbju7KSxa+tTP63OdS6wEvO/Zoyapt2r CITMHGQWRGKyBPcAofAo9rIkmuCZpAv+LrMWZkRJxE4zY4fjyqnFY+uyHwNKxLoQG40z+cbV+bCO 4Oklup2xQNVey/3M7uyQhTs7Ya24GNkoM6MXwK4NMitnmHq6HiM/8qYQZ60oQ8QAALSaEZvEIx6m V9y/9Mi9UssBwLVrgFYUndYiW5DdLiApS0BkG/Uh/ud17XmIYWcq3BgEoznc1gd8krWErX8CdskB nGgpXg5C87WuZOGM/scY4M+ZDuGfX4vDQrEPJETAtzBARBDGsfmJ8cD+Lp0G89D6Qoi3sq3smusU SvC5oKdrBnXhvoGfawTffawY8NcuCTHY42Y/7cs6tXcwYbCMm6/hDghvW4PEwL5LaW30i4CNWBf7 LdXGWP5cSZd3d1+szpwHN6q4lgxuTyAbYAQMDcg/FqjJIQcSug+YHfkZ5sPK/llcRuxKWY+60AC+ jWTXE61uYQZxwMoj9HE1i/ihIqRlcnwaYKDyedMjNW0gPJhHrJmrhBcaHw291FUiZs/H9QEzsja+ I0UmcZ4rX8ffmkf11OdOlR1mIXz/pSNjZiGu+YXNrXaQEkiPMLIVrViGbmlcYgcTbTwTdnOUZF2F 2Qqv/iqfbwVM4sPJPD0Pn4KlisGbOAXy81oKY5S5VYnfwaUWRmZ0DxuR3Yh8B+QSOADd/a2N0oyP ch1dA2Q56EpIZW/GjrON+edWVSdCinRaqEOOaC8N/Qj6yaiJmFvNpTDn3aRCMuWlwGIHs+KP7zLV TGAn6Qf1JfxuCx4tW97nJtrjk0M2l9iQTvwVb2wu5ew1r1V43hVUXSd427a6BDjsALtOnkw2aHnI Z8gVvsRte6IHjU/mEUPJhKNsAzx0XwfZdSc55NxrWPp7pJPtG0Gb2ZyMQczIJTOpWONew8oH2+lA +5vhc0EDke1pYimYd3GLsJmJPOunU8wKH3KWkwLTpgvIbPkLysxWN4nGEierjPDMnkuX9slmXWqO q9OBbOdGcizaFAI33is3HOB1AyRfZHZ2qAx6dLobYypGRePkHxiAkMyiyqERDCdXCLxaY3ku2qc6 2YGmlZHpfLk//8Pzl6BJ9EO/MafkSMF4sOpkvYhMLWu68I0aF2snCn+S+f9E9WOr6+cHyNW73k1J ftP0yIQO3AzIr9jAGF4XWVtz9xn3vsp6pjP+6cNBXd/Y/NWz8zTRi1o6hAEid2szNgYXA/zyUy22 doYw6DH5hdF5DrGpy2UdNlctM0ej3y2yKOCPu48gITXW8y2WWs/jf8AMZqyRLZrWXYzDtAg04Y3A AgGphcSujYIqUDkxbIuOsvBhF917A0jLUQLxmXftc1MhCZe3QFR8T0Vtuh4usUNOS6GoSF+Sh/Nh w5uHlNwqGNjAie6s4AEY79taeNZkd8HHK8mMKrq8I84yW6zq5mN/w3f4H9yuOkzpJdi1CMeKqmwW xSURtI4RmwEclVQ58mg+SaNpYwfmufiVvAlRRwOQ4VYAEEvVpNbbEqzyRKo7BrCsKl8CMz5esuDj Yj7QjJDgOhcPhGdNp3aagYSH5494YrTN0M2Sc8pOeBxIMwMMNrxZFu7wi6rQQLD0ZOUO1pTicsZ2 ds6Siszrnk1hS2OOdzf2zbrHo6fwsGTrjX6Y62BYzX61fn/8W3Ct7gpkBElQgW4JQf/cz5ZIv+fy tDInPlDDCyP7XzJqMML3OBsstfDQZzd2dzRePipN9TuUeJCh7gSlMkCKv3/tCHpcxM31Fqf9vdU5 /yP7sB69glckgVPoCdx+GNmGXsVMbGCmqqfSJVDYBHZ8FOA4+JLOgONjMKlAjPHM5wANLAlPgLTC mG2ArAkbTm4qDlgUEatUwrDNEx1TXQyKdO3/HteidcGDFrDX3t89e6Cc0UrM243c471EKB5fo6Qq ocY4Et12/T3WECebS4voNuNZmup85XIpOkQfdmzAvBMVVJAV7uVKxLCtqBciBP3zwlu4016ZsjFe qMoTj6g/x5hvNrOhcbMdNQuVfAvGYTUV4x0CkE/wiMY2aeovNJfOcalntS9Cb2lEbe0b5cpptiRc KWIJtQGEYiXxtdFotcN9S4nelk1QCl7t77tybIhy33+JE1hJW7AZ3Zg8WucxzD5V1zZDChhDsvh+ Aj8XQy4RVh4pNoYIGzG8xIBbAEBgr/O4cgBG+UXSAK6hRn/hGpXOSbk6y0xDbclDwzdn2nCTyTEB +yaboke5Ujh+LY/7AaT3vJ4URZzaUmtaobx9XJv+CqErVwvSUf3XjI+UCzfzg02UR3y0nKz8xkJp OZLwnhCf5d9PsVwBeOWwa56pwq4Ovhf/IcLMDUhddNhfenFd+Unwxfweck2uarAf/HA0IWtsmQ0w 5OmkY3OBTH+L2eyD6LELp5o+H0leOymbPO5PSG1Hieu18CFbYVJtygZQscqwrxFpOMWBBOh6CEFH KQphu2GtoWdq1BAwoYriVbedkOQt1nOvQeCxpF7VEvKSZfl19X3aDUTLoA0gv9s07ESSnnrNmUyg 4pUh3Av5LtRfNbhc/Ur91ojdJx7B5hogKGvHk8AvKUXiieufmhSZ34V1HvKOl9IDtjQ3a8i7j5wA gco73OcPLO4UsWRztW0agwybJCw0jcXnEf/ok/sDWA/6TqjrjlMojOCN3eK9XkFGxU3z2dRoo3JI W2oaE5unGw+hbVkyausCinUJSrZDZUJIkLpK5ULhs8tlNrPEEdl2eLjn3c91q5qKrJ8OjcPHIhT/ Eb8DCMNwRCYXSyHDxcu8hIcmONmYD4FauUREC6kk7ErtT9bnNLm0qC9mHVGLmJ4J7jbzB9A+JqYA jLuZFGPSwo7+zq9bVMmvWzgsde/rlCfF+PLUEY/zFG5jUcTJMon7OiA/t6e12vuKPQ== aoVYQT3F45TsxVnDbw5cYlmc+/FStX9e2g62YDa1oSYr6L7mY/Mekl+xs6cSsv1yMjuMLVi9+ry/ 8HlhNNmGbsZJZGB7tgaYgl0kr3NuEVMuq+8RxClRT8D2Y7wGdD1zP/sdQl1IJfbS25Yc/AkO0Vgy QptpXP2MvqcHjGWIz8k2JMzWGrIrT8AcdYkY6NroRqSUwghysz4UEv6+k40naw/fRAcY8Fo9d+VO ZoiXkSAu64fAnt6vnu/rvARzN8dNMlB9010nWxfy87uWtTCDS4bjYrYg+ujSZzcjGiz7pWbUxJrh pOaT50Vb6v8AF44928DiWyRVaz5yNgy1bPgZWnhV1QYbAPqGNXZIeS2DTd4kfjNjZcsdu+saUGbx U+1ym5hTbwIM2dIXDT4Z7WwAnG23FIA3hJOavq0nT6yJ1djkpS95z42U0PHxHtxtpsTN88MmmKSU TYkAXkvH70v3efwY/YOqTIKdOJEeteZQ6tZuxYXP/aFv9eHccQazXwDHxw5I3dsnnClujG0W9ll3 xTRskwYrbxhTOOESVv5tE/kD/7kqb9JSVqKK1bRtki30oGnhsB0bTQ1lixy24NkSj2hGbDVVWSL7 rUX6apAg4DFW9oRJsXlfk2V4bIGNXmPibdpiv0qvGa7sWFT7E4uBldcfLq51RXZJC8Byq73GJj0F tH7lHRhp63n093RdQFDKJ9M6l7Io+498l3Y7FKSUb1ldYdt6fCFAntm5W9hopu/uCB/WrpS6hf2R 6PJhdRp3Njs630pc+Oj3UyrK+64rm8+QErMxCz9xgJvMxUC0Ui/YgJ/8fImst3gDx2BfISVajiph z0U721IEJPvCG3gi3ciksXlUAECWC+9jN/awM7GcyltAie5qLPRcCLves+TUVbH2fVIDoO3J25uR Y3l0ardLRMC7xlMxhaXDLg5EW12NuRNbq4tCMf5F08y2jxohUhjBfuLSL5jaI8HMGhgCpqAAiXDm +M10F9KALloC0a8WalBhVLNCV1khm1H9ieizAf+sGw87SWfm63jCJx+md1p2Tgq5dzM27p5JUO5P gGQXSjtnAeNK+j5/4Uadm7pvIg9eOTts+qOY6ZELS7r9WAdyUUgUEL+PIL0/IhB/ru+DskCgo5cT 3jhVomK64x1wKhDa1LNt4Ym3oiQiGneTI8olOkiRoNfaiBvzZtqhF+hBfPwWk4XJXv5IvdlfSwE7 QrYI9fSxioAqtkobX2FXHprKEE/k/5izJpD8URa1K8+TQBlzDUHGWO7iR5ZkH+ZpvLFp8gRFh68H dRtPtSne6BkuPIGGx7VwIop4hZ2UsYpjgtRfzt/W8Fyk+XYfXtyOLY0iopNkYaQoW3wa6jH2pjye lZ6GMKMlUfm9HenLzcGTNsmJXIWEewY5FD1Nyx1doma/IUp4FF01CYd4Apr7AEG8ntYu59r8OUAq MPl++4F6Gdi4vSea8FrnAWOzeooiWSVOEgTUx8yu7KpM5lCZ4JPfZnTLg14PVQVHk/tcxdRjzFSQ 6Kmkjse48FMfURxdBcZHjHMkdsImc7JCSY6UxNONbM1/1CVjRnSUgcaFz5Ede1WxryNd+Tks1U1/ 0zqJHl0/DlEBr/IGrxJ6FTdGiTWnEmnwx3jNo0uhE6xLRSATp8xm4+5RxGXPEFmBotZW4xeDlni5 qR9SKLiqkX+o3OObK5qgsHzw6U+tgi0mgZETeIDQQCGR5W8yVT2BAJJZHmnhmunRfBAj83tqcolL AONYg2/4IErUx8JYRJREX92L+OP5uisZ95hYY/xc4MSYLICTpOL+Ic0Baa3t5yadLx5NrhRMwqdU vRpdDJOV3EVhpqhHDYwDzUA59JoF70FdCa+BoWafKQA7qLmcBjmKekoMD2kcMOr54ZAMptmeJO43 6+Ch6UiDD5hJvlnl+Ix5uZUVs5rC++Apclh26ttJNAgKQcY+eX6G4Lw+K30lS90nj0B5I5mUr51m K0C7y7dmBrnqo0YrG2BRx8dDFxgRC5aAzv2NGazXj6kZn5vlVOBZYoJ8BAOkP1mSHJYVqmjbZ5Q8 UtP8Ao6ZbjDoHJIDfExlQJIo215W33oEbWgArrhHOSP7rUUvraNr7zuCMFzbaK5ahRXkIEVwdfv7 6MXuYL/R2mzclBwihpUheR1/c/Fc9+RjyV4fE/jUVldVDhz7euB0k+zVRA63qcZkqqGb9GRy0/zP 2f3u2QGOSo3CEtkporb46ZeYL69mOFjk641NUeaeCtZjyy0tsetxFlW7O+nftj6wpHX2lcxX7jsL /56o0yeFmo88ikd0jy8jXehy90YX1V7AeM37PdpEK1o9DLpW6PIz8TaOTrLnKpXNcq0ayfW4+eF8 SwJXixSssq3Cm40Pv1MSJzyElNhOMa7m6MyuXN3cPLmqQNBmLLxyK5c0remJhDvsbZlVXvMjYp+Z AK3ncmrmo8ArKfGn2o7c61Xre8lYW/j06Z8yl0LlIwC/sC8FgRAZ/+ZvzzkHV+dDVoLWGoxj84mw tbxciTB7JpuLU7L1ld0+7cLyPhRzsZ1LQdtUu5DVMLDi5iNIdfkL5CLsJhf9qarsgT0nwJyL4vxZ SCPRi+S6Jjiu4w7EWTX9ivvzwmIrvC3dQVEbfrnhnilZUSJDEmu7dY5KhtFhzS8iCUyIcbInACDA lV0PP3DoHNh3pH3uulukxRuUxfUdFcqTEdhpT6aSNwZH6CwsFXohjH6TmfXCvAz0gQdeK2kYSdlm KzvQeO0QYWffRaxATxExLW5fBrqCS3YH1KCbgTsGZH5T/etO98wuqewq3292Crx5SkAA36O8ejpY c9z+HLxtQ/0+XSE9OBK6eqjN7acyqpFODnqq/tGQcpTpYwKfUbuIv+dH3AjjtXsVSGM2FTcfhZjT JZK0keFTbHLZnhs53dj2djkns0lRGFpyvLJenxf/ngmsEof4B8xQTrFFqwZMny5PCuZIZ7/E5Mgh YzBrydllGGJvDEz3+YUYQevYOoQ3OT7ZA1siTvqpx+3+TYO65cfn5+g8ow8fGSENRQBhewydQn+T abDZLu5RxzjrMaQroOjEF6MfKp60bZwwshBNYLTfMZ0O0nRfPE72xJAGKXG2/AgQfmHGIwGvU/RO n1wch+EzRUfQlPVjxEFjt4Y2f2tF6PI5xLZv7RDii2P3nrUdLB402hYn+7P8UGJSdU71YzxC7010 rnXoE+E6ndXJv2jTUoZrsesCOhC2bI+MjKdBFqM/HyzQeCjHrodMJxJWOjfR8gw8wwj+4P5cBV5v tWFwRvfVOlIyxwhHdy516tQLGWvPdTOzMpWHmVMJMcRLNJMaLuNcewso9j9BWBfGPFsW8T3eTaFQ m098SF+yBiM9rlR06FAhvsXn8H55Ek/qb3luE0S8xo/TFPBpr50Egfq1he8MbZWOXV3sv6FT3qIx ic8L3E1eoDls4GFw1tSL6w+c6bTMadorhz8KXsV4YyQzrNJueqeujgGOBH5rNJPBuFW6QiLKjJ1s ptdSPsT6WeqNz+uwQcKShyRwK8pK1FjWHIBSNlXVxnkkXFwVyX1Hnh3jEm8BnQI26u3F08Xr9GH+ hjA4zAAfe/S+MGH0TVyklqtcWT4p4a3nKp2rwVZkyD35sY3ltysFqg1l1Ys/ku9h1SsdpxbGHOC5 0Gors2wPs3ROHTy/bAjf0QTHZJmqyMjGeijzgCXb3SPa75Jx46rh3cVWjSrsuhVgJ1Leq6nq7OVB /H0jet18t4vSONKUtqcf2tC3F/VgTR8U7Cxl8rXOUJ/2Y3SSShqSEvZTfK/fMFeHuaSf17mQtyII ikxbE2mn8/ppcXoPno5h/H3l0cy3WuiMsbrIP18QpiraTNbDRiXPh06+qnzXCXKwcQeJTdmFm9it wFKHjVWvcrFuWPvnZD52Mry3vWQxrlL8d0SMWlQwN+NikiMlNYwwXxVUNANZq+rJRFHhrlVAh1ZC 7IF//ygbIQqiI2BiuXciMCN8eq7WgConkc3zdlQu+lHuWPIIbkqwsoXD+zT5vK7uT3S32I+ho972 +CJPLh39zdp8A5RWUgKFnwHLObaIIsvSknnDPsM4Z5xyn/lrWwc9mOh3wLXYjY1d9mUukPtZIKCN m+Cm01UUBbl0jCsVO8ZhYeRhbeHOZPM5UnP8kjlAW6TIh1Lt6oSv2deFRKq1xEf/KQUG+Pc7tlj3 USub4lkdLwJNvYzYtT6FfEsanBbGoVa3BjmuHFoBBgFTCRp4WNJ1dwJRfMtb1N1rEpRi76aRQMBP zRTvjr+XdlRPAhRjNgiSYcN7kANhs8Jks1KD4MuMQhsBsMlJO7g81pQVh7g/Rq6DwyPF9qNDzvZ1 qAXDrF8Ys3CDfiDn9GDmxTE4P/H3j3TJz829kSVbQi3s5jaVyZn6XercJrvrTw1wtNVuPh2ey1ll +o6XP8xomfNrGUfZkwSpU7kQ68tx2kwGks1hMSdgIR6VEqwFVCkQyczk22QiCQNAEqNIYXQZHpRp 7SnX3gY4jBHF5KLSQgPwPxbpefh+p9prbUEffWZIOS1rG+bT3eRdGAQGUwGCA0Bg6n7kI/aze8P+ jjqX85pfH4EE1q542GYVJBO9XGqma0hP7gkqqBigKVfgxXEYUfat16Fl/B2TbOhEytqDTYZy+hdL 6IF6lZPN/GTtak6tDpYcH9U3VsLOq9L4a6vC/FwNoPZJnsLCM7Rq/dN5iPtB83V+vL1e9VX7ehud V8968eutyEwkuMZokQrrm8zcOutMV2KDZIMrj85HJdqV7vajPKNzAi1EpAnGNPNWTQ2IJjfynVWE Ec4MxZ9K5oZd2IXfs//SjJVJeGxAO1kqnisUWxlxPN5nGLYN+NvDngizodXk+Uu6WZLwzRyzjZi1 bCB2jK6q8auV82m0VDqFTvLnFRHlpZClkUUdeURUHoOeTQwr+NquV/nQT0Jxnj2UkBDXXjax1JRn bZRoZ/r/JwYYqIfXeBs/QsFpUQLAcy1xJeOw51LzMUq6h2uLup1GqldVl1icQAdq687m7XZ5pSTu bJ8qgg9/n7QTN2Jzt6v82FD1duksRiCHynhNiQr4yhyASOWiSqMZAR6G242HXekUuoujGVSejX6L H3xjyuO3RS64TEyxpmdGJeIcscA3jtJ/y16yLZQZPT380iSb+aMGa7tWmzo26i3iXXMbRFCHNHHA TFf+eaTlvTOy8LkAEd2yTf9lLI2TusSwG4ll7WYfraL5MAg6D/8evWiOHZWcdyMuxIblVtaum6pd Cz7v4OLzaxcjvL6vdnHHM1FjCz5khtxP5SZtDIiDB6joFgczRYbgpf7cZMzkiGspNE4S/Njj5rWD ZdWWfVBbaqRsOuEAGRoQw2JadYOjij1vsZHARq16i5MZkYbDhVqMEOxzgPbiEFP1FWfJCaNjSeAq iz1vscLGNWdGdCDFU0gpRTRl2sRS/fKQFrFBtjiuvYj9qXldFMbcfDP7sPJo7ww+vA== CbA3Zp/Jq25ChFpz2Ti+s+knhW1TX7F/UnCv2pMvIuFDFkiPaBtn23aWfTQDVj7LxcVmdxbJW69y xTZ1CnPP/oXEoA/7lXlS8O+X0IketIWU8nNBD3ALB7oM4c7i3Z5HWPHn4j49zw1n6JwBOA08+oa4 cVGfGyDPejOVbh+7UG2uXa5z1Ary/h1LVZ7ruW5CUqw48gEziYlRiaE50V+cmQlKPkwdP1U2oGLK zfS6RYtdUvB0C8+c0exed8E+TyB9S/ZouVEvNXwW4ZHtA0N7793MvdeFqtugnzJj/xruvL7mzKFk A41tCEJOyLsQK3FLpsCdIea5Eq827gRIA38Lr/eKMowxOF4Lqj38U7QPtnPpIG6JP5lZS9P2s8Gi lW9dvJoJL4aGpvCrgtODrkIj4FUS8PqSewRuWxVvTFevUDvUjANqC2SnbbbQPayphLuFNpJarMKn z2tgROYn3oBIuYzJuGWBC76Fan89gY1xu8wtFbmTgw6D40k0BzBuuHtEG+Ehyf/Lz+ViEk2e3nqP RzbXenUZpnipQ4TxEQ1SNvWaBMJDIOV6tXx8HmCtXANQ4XUk3qAO8CjUUuJe6kuYgVo9udpPRmqc wlR24IlwHEakp5/oYuP3RsDpcyv+UtegqrXVtWYfpf3lNAv63ri9z8k8/KYGsflC2NpEtrKPAuVH C+IU8V0naNL21kXxzMShnKIiZP7+eUTwVUVsfR4esP1WwzzPJYiqmoepzKtdj8/0VG3vqR576tWp VibPwlMFM7+mUO9WN3BYuxz81qiM2o6S/l1y3HZpa4pZpEf/YBOtF3flQe8hFtBDmXrWcXO5Hytl q6C02Fp8mlZQFavU61rk+XpSkZ2m1FCNVl0OkDUil/7AAIiGm3yq0yVd1q50yUmlw0Romc5952eM UOoYBbeKqPn3Q1C7jP3PVI295sG/lOK/dYnPFjakqZf8HAGiVM96ShFGtqU4zzlX75kfera47GKS 5veA3tK8Hhorh2Uw2EhIbEYGni0qTz/558jFNfZQmJFkey1f4qe65Nw5AKdVif46YpHpqd12stx5 l3zPodCrt8T5ofHysIVDAZYnjKTqq1lQeu3JImOv7Ciza/vDjFWXbemTkdSfmZH2888LTdg2LKv0 FQBP/ymJ9g5aKpuYJOlu5twISqB5n9KE+KwMup7SCX6zXx/IB9i1XTVc5APsWlacG4N0H/Ww7Uz5 IzMTzNSIm/IB8HU31M7M9vp42RWyNIEuERg1Fb5ejqAPlW12dmW2DeszMvMAN0ulPrcZ2RFiWYCB Qem3teTPMDMolnqlLpz9PdvVVcV2I1onqsqfPixUARuPp9f6vnCWO/rjzEjdrBqRZAywBOoUEsCM Z7DYDPjfUwweQOPpm3eQjbiNuBwzJhYBYOLnKWoNauH3+ABPERdoCzzZB8xM4TRwdbzWr3rJGqqq ZkOdzP8csayZX8E0lqyHSx8wMzsnPffnqWr8alFtNGNTs71tBEg0uBn5YPwcBhDKItI3Zsu2ShUW /NJGhVoU981I+YVGBkgzjqBJ9KanlgPUzm0PdIJu1K4VmWuzlSecgtDH5fxLIzOAhB39ttBv2unU xiOINd+DGosPoIAC4Mn7auGeuVmIbjMTU9LJEmhGBtNdX+3TyPRtEyMS+XXEEApr1/Z4XF2wnhH9 aGHkVjASR2rmqXsAeM6MUA+w34rI338Jzk7Prngz86DsCfzwIVCKbqTdi4eg/tqDl5uthi1TdjYA E7qN2ZqXCy5YIDWNzUb6jJ4sQa+3JdGyHrjpMCIBY4QUD1byUs6xpw9jZvY19mhECiMRZh0cAH4h vMsW5Cj8+/5wIbqCUTyYraRIA0rheY52uc7siRkZ5PdMsT5V6gHOUQH2o1eAGU2tMeyaGAGl3d5Z YbMLC2Y7kj7WzMQpd2ISn5qysJ3KpW5EqaInJNrMVK3u7JMxI72wTi5UNw5OS3VkMy88ArTqm4mY 0x70dvh9QKuG677wr9n7M4iEfWq7eEL0AJq6F0e0n8UATYFgR6rIbMxV9SC1CGMbs1+fbPx96tm8 /r4+MYEhN7aTuvupUy1cIwXJzczC0iBNiBnZ5DKCIxmjHkpTTaIEzbyS2uVsXssK4yB3iBv1CFRH c7P07FBzMyOJogbV7MzIAGNmF4aZydExA5f0ATOf+Mpk0xPN2DvWHS8krxbEyPyXFul5IOkez5rk TyNfYb90CkE+6ddO0U/BMTQjTrSVSAR7tUk4hpKCL4wiibM0pviVgllbhXTDlgcYH7JqhGgw9u/l 8G5RbfLfwq4JqMIf+DiJK93McthGQCqOybKp7S4NPTMrywdm5kJeIPMzmyfjYlYPNsgtWbqVbQG+ aU0J6QUexDa4FI9r+P2l1KgJfWknJMJ7ybl/lqqIi7Bv+x1QOd6iknZt6XwvOn2nun03q21+GDz7 foMxwJD64o7EG06IQ8lBoBLi2CBdmGTj/OBJEjCEIk8XFHLpFT5NKucrGxD8TE4yvN559C2tInCZ +HkYuig2A+Ylw4fSnUWtJRw+rjf0RptzufUZuHDEVz9ys7/pdloXaeDcCFcB/WLhyW4FupvsuOYK ryoyvA73dt0LXm+h3K8cyV0b9dIGDZpN/yl4kSsb2v3HpiTnsMmXpQM1F4cZpay5qfLjnv/gd+Bv 7IPmSuk17P1liuFpUq3EjOzmmll3tShjajuBaqpfC2zG4EFfpGDiFGIK0+zvqfgFnXkzvjzVuFn8 O9p4XFn12frbnjJmB7HIsE8KTxrSeh4LVX7wfqpwgAexyGKmxAco5HjkyW8zQCFgZ9utj4vPe3sf zwciv9xLwaTu8Sj8gclqhhnpW69sJjAzawkrIFFhzHn1SMT7ldpfRMtt4fcZufMjUK6qnC+mws1I OOSK3DMHYGJmsUnLjYP0lYBZeZoAyR7spX8gqdCQSF4EpphxFBLs6cFIWszpLOjdm/nwJcTZ56Y6 eLOFuR7Ky604C/jnTZx73rDxgWQLG+EnaRavzNRWHvdsaVrexIPHatgHZq9Af8DMDflIz/EshW5b zTkvozPQ79CoZirYroWfsDOhmzCxrUaLs671LWbTo4be3IvMyMYnu5so0599qdY7ZoM3Roqwpbra EoZliefxLCF1Vxy4nABDJNuKAg165sXCqspmKo7iVpl1JOZ+K3E7hCrZEsKwrCd4D/YFZLJ07BT7 I3qBLXF75ChAWuI0hRzXQe8J4cKzwx3HD5hJ+rfUl24Z6UKlF/cikedupDHNAvOpFBzzL2HyWlSg LgVGH6DAtVxCcJwqkt8pyPwBvQ+OPzzv5yYhVYew5epFS8kWxFPUJLHpXnsJISSD7L4We6dPthjv nO2jLMgWT7NVnaUYvE5WYomkXFGZ/MCwfhCF2WJtVmIhXe+OFEAFR0rCK1XutuCv20NSVmLJA7il gm0F+UpCX6Dut/de0qZv3C4t/ETJfr3FlC2S370pCUOPNQvBVQ6XyrB98fieLDatoNKIG+2Ci6zr VJIi4Lo2ZLIE708fnQpb61rfLevAZVMkncRY9ktl6ABVXWpdgrG6dqpjVGelGzuPlNYSbeJIwrAC smQ1OLof+Lx3EjmsG/AzRbcFIVLW+8ZOR1yV7CER2wGqbavOHkqLXlCRKejaStnVeXkGetnfKD7/ M6Ik9vRAPu4XzfnG4lwy2+AXjhfmRoSv63KCzFw4M/pxNQtUHk98+/N/vOb1/Pm/ttsziTj4syOK Rb9gJopj6HQzkPtsSjnEB726+GBGpjXd/JAKlT11y1SaVv+8sa5bV/mToB3zE4uEWo5VFgUyurHW Up31ih8cQo2c9Yo7+OD9Ply8ZOJzUC8FpgkQtQE60wvJ/mXzQrgymPD1G0NVfTDa8Z8qTAS0lbDk Lw8cCuCrX5HYQx3z1cUwvXRAWWeC3GcyeK1kWF13402XKsoSHnN1arX0JbVaa2yYdCtFXeNdFIzZ yOzrl3JJUcr67QZs+Rcss64izoyAl3c3gMydKefo+TQaCdxO1qD5uZnjy7gfubYNGrg5kN9vqExX iv+ZeRCGuOGfKHgJDOPAcu3S4QxsIq4dvBC1tJlqrlX72Qw/jH/NIvxU27HNVIc1u3jep0/F+6q4 EiTQvC9Kc095jvuJsCGM0IIyDV9Q0czsybZL5f77PkEoqfejxEeLhmCbgp77xqp4nxcm7ABoaoB5 Ke0XzNxad4peqvHIgxvC2EnpsT43ZaRcuBo4jko6K1pMwng5TuKcMrO+I3VLHrWHLsHNzSh/rqjX cKvR+foOzelcbzfw2h7ur5h/D9GKy8Va0BOISbHzaiuHip4ADtAOXRm2Q2zhYXZgJHCng35bMl7b GwD0aKuvMallNikW3l/g9W1b2aaQd9urL79gztBf/Kqm0NCwRBCjuohP57pJxvqe2ckZDWv4MSUv eDBZvaDyrPCQPgZIBs+ZrJKVfSnX2e/l8o3XO9V/QSRDLhuSkJaHUQ/jtl4v/4kdkg5rH7iz9Iy9 ZK9YAqJpXvMnTziAk++P9mdub54Xqzh0PM75BTPd+Rnz/ICZPvYMsc0wMt5FD7sZZ7TXh9EyazHp SW4GZ0eXtBWOMm5llqepLJcsMQP3zB3Oq/W+Z/ZwJiX/ENva9IMzbGTEmle7sj0qReYkyvLZPNyg gaMwI/o9ZsRvf2AAxmRTrAKe+WfYwN59mzfiLEM7610O9d6vZA4dYmJaov+2ckBn4ikbJW2OlboI 2QhuPyexAhJl+xtlfkTf1FDxcWV9xW8YIf+WB+bXHpYMyOI7RaBycnOzeU0mdsUUmw9hM/HmOmib Iqj9XjAztK07GviwihZ3N1EOL2lj7KhD/MSSZV/W9WNLTMhbIU3cOKMn8WH7uDo3dhXTqQ4YRqAR Cb2/m6UetKmGV98iOMBBtypT6ngJbFDxrAIPHkfXkemUNzHZed2TJHuKgLyLisgnwFjLNe614cET H+VKC4pPMPuZLG2x9fdHviK9SpvA4mmIZhi3KQaX+LvpBlXlfQBbdmnMh4cRyGpcIYpfzdHB5XNl gcYbpz9gbgrCB3D5xsq6KAxI2TJXrqLYkZK7ThyKCOFEX0gYmUY/Oqap1xaL62YeVYmpkIPyuWR7 PR6lmYlNVHt09aRTQCpfk3LUh0viznoV2tTS5NSnfDX8akbSsk32LPtXyd24JrMuD/8h9gJ7FFgD I9Ki/xbXMjmSyhauY0NlC89AfXvSwLG7BIl7rKhfNGvkpIUZatkdogtwFp9F5AQZobKC2KP+5zc3 1ZPjoVMhzRIzgD21dJuY0UckOzgASVlNfnYlQRHlF5yy/Qf4s1icziTPbIIh9bggriXvf7+p6Ui8 NC75eeNnw/bXFWc4XRjFQMjktwbv1LGnsTasO1qVeHSZjyM4SGcV242PIANJa2sbMa5EOsVMSKSP VHW1nidiX1LKfByFKZBr+eEUh+QJH2ogsCsVi9RkiT2iQ4R6E9kMx2b81AMKEHOYyg== a1YaWZdFbKj7+mx+M1rk+2//H157G8v45sceYBSm2nz8hpmFpaSqNPlYpYq/96QgfospKTMuRouM AN24YVSTqPFP4pMZOn+G9Lq7tzP8CF5OcHaM6IKKP8/iMt4tuWTT6yt6M0uFnnHviFO+RQ/IpsyV Gw2PVuM9xTsf8oXMCCGTkQUk57mdj5xU8IOOKLTGAEXcxKydjKvvffQraeNAevL3ktE6NXiMzhkV nKEO9UsKeFyKtWbujFtSVWxkam2K+Wkkm/8UmdJoihnmX0RaNJJ2fkYoiXl1Dkr6QefvppMp6tcm VhTkdHGvoTrZVaF24+b8RVw1mjLsU5RHZjxMj1CH1+WYOaekdbS3gGYpy98M8tTWzI+QS9oSigx5 qi3LGGAIX7aSCnVcenUPEhkjdXpm8h0Ze24hrkZS10M4i6mO6eT0tVfFNtWxBM2dFx3fWDrXVPR0 tezKQia75o0tuTBy3DbUH/yaoNKwKbs4snVkqytrLH3MOwqhnNdVroJKtZQvzc0mrfES/mRHFM2/ J99y6qrZl4+s9RaPlKmNP5xVlhOGKD7MYYEiWLL3dgiYYQaTLm6f2qVWtKKGN4k26mQQ7is5gbdg 7ygYcgZXrNPFVJ6U0Yh2aCbj21YYZjcxWXUkFZ8ZkSHfNxf2lnLLDtofjss2oiyxXmymO2IBnOJb un9coPO5iiXMtM4iktzs4jWOVpS5982s9iieTo/WqFtRPt+SUDN60Mpik8d2HOAET5UNQA7JpN49 SQ5nLQEPnOdsMZ9VpdcT6RlyNSIlNoo4zSeEDGIIumggr3CjJ2r+oC8ESWgjO6DbBJ0DixDw4dm8 pGf/6cmgW8DMeAK7UbaYvcnzuURsBV90plspzlKGfT7sV7EB6CA+zEOZiqxCmPkQ/OfBjMiHERuO iyi3ElX5SYbXzIvzn6pQ5CO0GAcdauZOPlRMF6NTi8640OxV672RaDaKEbN9dNbLyG4mM0qe9pG+ h7nfQV/u15584albiz3NLsVWfSRfbStDQuzJzWHXoux3AtEB4+G1VL01dlHgJc4laeADsLAvUtt+ GekmmvEwNPPEbgzQtaVs6XvYbaFrZ0tCfKa0xr4yzmZWpkM8yuYyEH9Gtt+qolaoy+qNI3m57wdb AyK4iQfCM8RNKVSqQqbum9i6BSHZFkyNg5K9ZiWNWdVesJJlMTWVVmD99LSR3J6q8RgTq3JYm1S5 WQJcF3tNkrEyi0a2zZa1I2A+XkZ2SU2RfkwpKpvjp7TQTHzIkGiAMWNKkVHb5Ft4yrj1iAkJfxdx q7FsETvrpQ5xoala9kgrwgapX/CgTui2WDFnfdH4TAUSyWjIqNeUBvbIFqNeqehDTropTdrMfjq9 JTVp6b+tooaxTJAZ/Z58j6uYWS4BXPbnOYfk+QRaMFJC+JT70rRd1rpGhAdW/hKhiDtEGNLkdAYW ftK0ripZCRSAokbbJFGaxBWrKQexk5exC5y2Az+tmucSepV0X/36zgkLWsbSQZco60JdCZ8VWbcP mNOdQIuGjUCi6ave1C4/x1Pof+DGtqo4xHOsppW7FJusfqUTMz6yh/Ao2SwdzwXltDCDHN2MiHmm uOlXU/CHCjzHJQw745CXkXK5Uxws9m4WIe/XSmhKXi59fk6wyTsrIKpeVeCqdVGFmHkRBUxNxk8D iGAye2LWlfkyYsFCN5RaJkYsWIVYRorLiDubINvyeJ2ZkFgTlk8XdCNjF12Vo3LZzuhc4AAdiZB5 c3weCeNSF8c+Jw1w3cKjSHlKjWDdiGXmRoxzcWfUoVt4rsIUG1CNZbNqy66iDs1ncBVEi0rj1/PK vtgpR289V633oiZ8rtiVrdy2IwGalfHYKkrgziAx5AzaVnKFi65cr5yMmmZcjHP9c+WeyPaqrN3Y Rnn4wClAaT+1svbUk2qUmK0RaDnu9plN4foyI9QDPhlZaYPkMMdlenyolmAMpmpt2eIPZTVkRFKI f58ld0loHAFDZ5J9v51uV7V2F7V9Pu5s/KI1mbwbidtSvvWySawqH/qXS7v+/NGQk0xqySCQSrFv kzIUx7/6O/tPJhwM0YKR821dMrQjNYYtFcw8Kgn7TLl4sDVPD9OsnUkwQPNdfbmopSow3O+/DxfC RlAy2jIqnBdd36F8hE+hsycJb7k1qdCMi8CydQFtxwVje/s1gIZaNkdD/vwXzE0a7qSVbU3+yg6k lhnrBQFO9oxmPu2AB84ItTUVV/Z9H4Tin4umtYGFwM1Mgtmog64JBdRaVT/DZo07zNQx3YHSiB8b wmZscK28P4Ofejjs4DSGoz71cAiYPeE1fdAMvOu5Egs2SGNFyTflj+/HxhvpCgvJP/SL5iWWHDiL zlZBVuMDPBtpIXcI9hA3RuGwLVmbMF4Ca5VanF8mABiidd8MahC4s+QwxKtDE8qP0XY5hQYrpBUx I2H7JcoK346L52+VMGiNtkCi+KPwIJ60FqSvtRyC2DZI4eEriqwYl3Yb2Fb9rjuzpsZcIxFY5ptS 4uZman+f2IdmTIQjOKU441RZoOy2Sw+SkpDiD1Y+bBQ0mFL9sHGr6AePypLszX3ueil4gF1pgZXs 94lxuSH0iGBf+M2+6JV6voAJers6hJSHd0Wk9fMYfBxdHCxPRM6/YGbIDYEkieRVch4l9fn7IDk6 4V8lvsN/YfTfmL8Mkg8G1JBW6bW4mQ8GvccDqrR8BAh2xxPH/8f3g3DuRR/ZDiwmFwqTkzuCAZa1 6V5vNuF4Wfvhzoui9tuo/JKm6mYlMP6/kGMFF7Z9ugbaYvaasIfn1kycanMrF2nr+9i8x0b8vqWB DEDyC2Zg4m0NLdSaGpFSI/WdTFQyqkTjpiz/3QCQuBpJ5f4+Az4PawgQRs9AD3we7FrMpomx9FBX aokuMZqu8FOZtKYK7iLRqw262FREUr73CfyLM5sC7V8zI9OouvO+KT0onV5UKQK9jo9KJAqzuL+f 2hGh1Yqz5BfMJI1F48CHrmb+SFvWEfmQQNlWpz3sx8iGhnHU/WEwxsHyLfXWEjBpxsq+NcduqqZ7 CMrWHR81HE0l694LvRpAJVWG6/5jKq6hgWUkEHVGoMABCCGfqSN5RH+01Kjx/mgTIDHFR+67PQES JdlFCQMYrMA63SbSQYOg3HaugH0O5XNSuGBQjLed1MEadDE+sfNPw+YtmCWSMMhd3LIf7f0OeGtv I/+CmWSkR30oU9KTl5qAq4mRIbVKQMSu3WTcVF1hMO94Ma9+d2/8CAGvshT6c22X4HIazyU6ZWUx pMafaKP/+H4Q7ItzXfyE+YnPxWyeswsGpmomMeqhg2ZpTUl51J5SUKDacsbbhxI82EGNnBB4qPff /0NvpD1M2FSB7O0xDaErjp69QKJtdgqpsddgXjg+u3YJYwl3y1/zESQIJay3CXCt7Nv75Vl85UpT P2Qa1G+QppJh8su4qdl+qbndopuF6mZb2drkY3ybwAVgKkTC10dfZ+4nTfWuISaweUu0fRmBi6QT lmSLynbuXzADVDnEJG5KeZ3nocSXOhFMVprZT363PKxPRGhxLeCqI5VWbTdodOpWvT58fJ52Ji8m 9U/3jcfBZ1MT+HwD+d1/GZirDCwnLq4+uPtMVb5YRba9J7I5bixdM4O21UiNHx+10gh53e9u7Z+R feo6vhOOZkkpdfVK9+AR+mPxQfw+rcb2IPV2u3GzDq2U6dsEfmrP4D0jguCegQQn3SYKqHHrKVHj jCU8Yg91b6pKQC3au8dzKXzMzbbWIZ3wKZleB0lWlljQHucoyyc3oy/TvZqUKjlQvbjAPp5UFEyB e7s6inumX6LKsau1cFMMkhrvLVsS40Ad8P3X+KLFcubCKHrRv/k9o61xP8uvHlSSSBEVAr/fx+UP Jksm0L+/YC4ELrAiei53kSzrlvsTzckQb6WlD0XP0MFV/J7X/Pb3ObFkYStRLf4Fc0MFFcXpD169 SPSa2K/3Qfi6N+kHPh113mOjx6S4w7pJpIwjqsVQhSBDvMNOPr4f+0O3BI7zAZZRtiQCTWeRW2GL HUAmtqYfvljoWY8n21vtgdQHV7ZUrJix6t1MCSw183mE3qXPAxDAE67Xz+/nips4Se8HoYlfMKfm DI9N4+7sJBOn1sppqhmW8J/9B80s2Qb1T3fhMjN4si72SrWX1GczqtJHuixWOI6u6mRWLSoz+BDM ZpBW1Ypg1JNOheDTJBxsOZmgwDUK1eSWBuLpVDUkligh/8QEiIoscdiHkR1eQH7EqKyIlKvbx8wp ugvBxlNVlyqRQfkRfLODYuGZYbPuetHSi/gACiuxL6FyYHzmwVjt1PwXdTmqc+1Q4+w8l+JNzUHR 2OAE+Cc77qecXGaUjngH3SnnDQzJOT+SrjsCn9AD/ZCZLPyFD/FhJsg/4UbW3lW4f6bIqD2Yhzpx LKeeSpx624pWbBXF6mx3LteujY5739w7iWxxtLuI1OCnkJuCtx3+xGcD/Wk8hA9+Y4qNDGItq4QX CnBFRw2vdrv8xHo8/JhBF6VDD+hpHgI/gglXZwh51k8nys8moNPTWG8lweelnA+aNx8jkdZn0mNw Dz/wYUdE4e0ko5GZhzjQvewDo9QjxGAxmVnwGczkZ0EhDpEHKVtf8QGm22oXw0thNEN6u6SSNfmK UZK2leRDheANuxZJqHao+ej8LlUi3Oz1doYXUciPyK+akZnQQo/ApxV368590wQo8FOoXeZ/Ly11 L8PBiE//Eh1w4txDMaBJ1tMibEAJLqowphoD66ZuJYU9uyac4veQEfmJaodzFxdSuHsfHAdgZzz8 MBLPpD49U+UHDtIOUadAQhh3cOWedtSrfBKH/wQrCpln5iZBOBQKTkq4SrnorEjox2zVR2HmSllq r75xgTP5XQRsP0AkxBDkF0+qpnIp49kXkm9ns3HkDAFnnzgpwwisn6vsVH6lPFse9yx/4u9Zf9aL MGMqApHXwea1qOQ7xa3dFRbciW3bqxo1dohZsp1qFh7biMXenQF4b+9n4S/ul9JkY5bLjjJJBbHP 49RL0m2v3G/blKocyvg+aL1/6zeH8T/jk0IjETM2v/7mDjL1rVewhBqZs9RFQW/xPiofRKHqtO0W Bf688c1P7q/sNznQS7m3KxfzCLI3z7Mk3TzoT3xvrMk3XwK2dCW/jJhG6g4jPQW0aLk4UCqnfJ4s fT7JlPh5ghjPrOGKX6KZ5+Hq84Bp0fibY/13d3EkDomOkfOQftt+jIRIX+f1U/PlrnWu2pHNDZxj J3xQuRFq5/QN/eP7Qfg0GtUgO/R4ftGBRc/9CTUaOIpEZqGByoiVKuFaU9jU47TcgHYx5jqporXB 1vjNz//UvPA1D2yfmtc5KAxdO3BTBqPGzv/x/SAf+G6M4qRiB/Lo7RfNKsmIg3xeInhkDS7ZP/1c LM0lc1IPE3Y+6qKgCAD938wgP+lxhg6pxak15hX8mOvkXEvJuAbauco8on0ha1Ydvg== S+GdD8s9AXlyl7oiPXxjdcOslvuhmWS8RdzDRnM3tWsOOABNUuklemBjEv2qj5JZ0tjgp4Qlo4Th zPHKZydjpvGmL3qYnsgiKd85vAvJq/nVu3BjOiCqH5ebDDJxs0k+Clk0EEY+9PQdJBnDHjFsoz82 rqWURmHbhxmvoir52JwwUiJBhfSW85IuQl3AjEQ5lZtxcorWXlGYDxCxsx21G6thvv7s4bk+z7VO N105x3qJMFL6zV6VoZkSZSeGwzOXhDaZjY0dUX6X+9R8bXjFtk73IZmj52fjvCeL4LwUUdWMZ2YS exSm8Zy3EY17D0sQ335XmO1DTRZU9mzlsa3poXrcN99fAjOmQmqni/9F86C4oHI4bl7U9EQY4Ub0 +zxBD/btuPmD8Pjt/li6MSJVFikNsQeNWruaKF+DrvCb/f30SO6di8V/UMF9K5wzKUdLlra+mRy2 1qcKxFcCEcRZd8m/Yqt62lUDOAHKdaJ5AF2ehDr5XQPT8lARzwcoFN2EkFqwz1JpRzl5H+AQ/AbU pf/YpPoP+i2cK7/zS6wEo31zYzxMjpgvS/RZ/IIZ+SKGO9w9yKVREtf0zSA5+pdhODqJt+7XbWbh L4ID023oGS1B5B5Ginh8inC+mXS81nLBEpzU6xfMbKBWosvoex8lxRoIcZ/nFmw3UeGf34+bP8jG 4gsy42Y53YNC6N8OE+aZ6uRgSn8ZIa7oebg4Ft5/7qee/5cHzXmwSUXCrG7UgYNA0H+uS+B85X1/ dx/fvdZ/RtCFVjBLdy60QpxJdNN4bidwxt+GeREnY2MEAN2zozszHp+H5k9uyrYZ4iVdsC28yCPd +yPqpPFk1mSrZIYeqZ8cIOj3RyoF249F6W/oNPhmBnwpJZDqr//QAiTzC2akmkZTDdRoYUMCZ7Qk Ui5MKlnL705eWrTWjUqqdlcsQlPXJVsFr8SNV3bzkPtgQPAGA0SmykZFXCs5sFF5Z5zrgPnSFgLV 1KiZ1DqRv40JkFnXnljWAxVvb0bmI7Vyf/dyDmOpkfusPZcQHxnX8WvxLfvapHhpPmlFt1plo4Rn boI+dbi8kmwe1A7Q1vMd8A56YN7xvrFketS8v10EjB1E+jtQK//FW6vu5RkG7rnUnCqMC6SC/sA2 jckiq/K0TQ1SnIeJdrs03/iXCXDdNhW4VzQy/6JfLIgRD14TKRIZL3UPSr9IqZ+mbbup8X0lGt4d nCViVSoKtYsA0PMo304sZ6xWmr0Ui/zm1+jdLHZVhi6UmHcDe/910OvhiLTd66X8tQSBjYw6yCdy 0at/cxMwT1KegsAujOTmGSli9WUGP+XUPOkYl0qnRilVC10gY/FUJqZ7Ya7YVX2U+HO2ZPoUZAi6 TpEqefWMkt5nQNrS51J69ODzF8zpaorSyM2SeUfrrOswTOKTwUb6Nip/rl+0z5b8+EVrIzUw5ZFq v7l6o6HEjUs4cvItfrk20iQxqsi1IrH0PoE/cmKfB46ZDYnCb7b7hHIH+agZj9Qk/tpX6GHmzHBU 9EeGqIhoAp6RmiDsnNih54s5NNIoodnu2wfxz3/6uz/9F//6v93/y3/z13/8N//hP/2f/9v/+A// 8T/+03/4axj/zT/9r//7Xz+Z/8u/++tf/+HXP/3jn93655f5z/W/+lP5879+/e/f/ec//afX/3v+ XPz//t3/9fqX/+71D//Hy/Sf/9z//N//+d//z+XP/2hX/k8+c99Ih9UTYru0W4nQEdaPz9a+khsG oidvFv3lX1+/8z/8yZOXr4/lz/YPdssWvW7rS9A0/wE/sov4ywjHs58ebLdlF42rw5DCgXnGa5I7 sVv+yvjE2W5RM8e9xZb79vs4WOpWpfQEZP0XzWrDSHX3aj7RYfOBHdYf3w/CLhErnpLgzWuBv2Bu 4xBeCxBYTRWlI+byannSggGS1K8ehu82j8HeiGqlu4mm8MZGiupJI1jZBdacOgDZwA1KivfpsqHj Ea3ejkDgF8yrNfZPI13ejHqRPaAeFcSV1ATbF47MzINvRZ0xZhQNPRxPMy4SZlJLyayzcpMiYUl7 LtA3m9be7yBv7fPAvLPWuMeQ+ua63aWE8m8n9tnKBZECO9DS+QVzEy+Fawp+wNx7o7YFu26qOrYX O9daVS/QCl3s7AV68B3rJVtpnxQWbA59n1e28qAc6Y33z9aEcx9P6KY3NXFstnLaLIooUIE9fh/3 p55Q34LsL4ZFv//B13ajPTuKB27s+DrI1mV3uNiynXwvdm0hX8tuesRTTCWTK+htYjljHu6RBOeE X64djw20iNsq1AlByWC78jDtLxZIW0Gbxycx0La0l1QXaPz6+z+1+cwzAeHzI5GbD5q8DfUoOKVt CJ2sGkmR4FsV+S9Ij9UskUdmD0Aj3n8t+/USguVhFxv2XHQhluEc7Pkb4t4k57UZJ5fKeNi0aw17 lZ+YF5PYsMeofzOr7nMQbwxr9e8Tyxl/+UHOGD0pXi1hSdeuPnIFAH9p/eIC8C6v39yIPrJBPZJx 5tIS6pEa93W8tzrgnkWqF+8y/fh+EO4582KidAreGN0YoNjpbliuD1z8cohAGOAV04/vx8jBT2ef tjce/oJZkkBQbi1tSYRyhSuKv98ULUkS+WZ0DWr/blGsas49r1Z1DpqNEVuIoOYt7oTthbCkD/pQ s4u0pu83wJey9B+wZn7BvLvIQJAraeviAYBa0N+Y2mpcdqCUbFk+sDgr0MXvE+DMrN8gaTF31Qsd XVsk91nD8cq3hqvRRvQQxjcyialrQ83EO0DDHzQ/Q2YN8Yq7yHkEOuj3ieWM5+CG6hjlX3/7B628 yY8H3aqml9bI1xWJdjeqMXZO8Bv5peTRIDdOc1rO+Tbol3nlhHOz93QBJ0zSHAn/+V2XPJp2/d2j 4LVknNGp4KNiamTSeZ/B1VwL7aHzl2s3ZXXuRMIMGxzy/EfI8OZqoNjnVT6KVumD3YOgMLv2HBIH gdH86+//oSfWHpaXfd/Vptm6KImyq5pL+2QXuEUW/DWi3ezKwp07aQHff+0jX9zpZDCa17fxdj2u 7geu8XPYrfk+yIf2hHrop3nignsC40ZC5e3jlwSdXrR95mQMSvSNbxQKWELvzscshRQv53BLefaR kRBOMw9KV63ZuX0UfaGjak/6cgM/tY9THWMHETv38YF3Yh/Ywo75Gu7r52UQpE71LLVNmPkhecy1 5fLx7vBlv50AZ3ZujSK1OznWVHgEgIDa+RT6YXM+6mHZQZ73EwOsRWWt+9pFTnAnX6NRH22+treJ 5Sp5BumzHSDCZ8lqU/LBtSlWlh3HD4y6t111KBrhB73rPRfXVJIhQxvyb6wTtr27sANXRKFy2jm0 fbkBvgtjRJcaqp1Yv2gGBYxyRWZMfUoS+LUd1MphFKOcmU+mhXC0W4qJBGPsR3ufQS7gsVMGquVD TzeanGxmXPKYgZcz40zmR8VQVnhZ+EF2b7ixsN0YSMD3GfyLU3u9Q54blV/BauQiJHHi75fDyw3k Z8QvYF4Ehcyo/I2Pc/AxTHJ5zCtynUXT+v7WuhPzsQ5R1AVfyDLrpZ/ObwtiItY9FM1AjvmovHCR grKpsdSbpSYu7VMsdkBT/41v+5AbgyivT0aIw5ee2rTnIipwNAyZyxUBnkAQ7WCkWLCxEaIEqRr/ HpxXV9jkaJoFbgA2RDtaceIozD7TLvFs5z7kpa9nBRtZPLylfKCRIlWc3t/AB81RgRgCWBSvmbL8 xxaC9zeb+3HRAnGMJPeAUxmaOn74g1cfZoMWSLa8S+XRGoNfcS412exvcKQfVznboc04RD/GeO63 23RR6smBkR/f38aH9rjXYcm9kzQibYsi6gRkKozkLD5Em8QOJdLNZ2iHe0VwWL1EljZTWK8M2ejx WDD6yfngAHQosnPZYokyuaSZb9kibbI7I0NUczgTX9BTeFBQ4GcHKejfdFPIqHWd5VsA7msP+f0u X5h3H8GP5zbGm6Qfs+dyGMN7Jzj//lFi78pc3OYJWkI38gjzbezvee1kuockf2Ycj2KZ2vVupPEt OgA3K7aYQ7/FBzPn1n3phwwhm49AFQm6Pvv6HJyf7H0Z5s/3TtnthXZsu3Qy1rhezG8m8JorjwLy JG1FD1fa7u0J5gC6lufDlsr6l1fw7Vv8dqOw7YE3IT9mX3yCvpS/+0CvtM1hn6Yj8RmB4AA381Dq 5yHRKhsT3bhxoc+AkRGYt0YRHYIZdyMtLLOwbxPIme3TsPGnYJCZ4zwZ6p7wvNgh9YbcJovkslNZ e2NngujzAKhu2Y+NHOD7exvPYEMvV16nBKGz0pBJC26UZfdWpuBmY5OwV/MU3VWdidxUxhVLriFb J8XTTA6soQJ8CZBgGIHG9Pzk4LS+PNjb5RrIkV05LxG02AlcyHvZnKaC97GIonHffOHqKm6adJts JuT4moy1Paxe8qU+z+KKaTaT0anc9SmmKcTCujOh/enizXob5ENO2ZS27lS1xsyN21R9CLQ2B6Lz G/PUwcf3g2D0bSjR8M1aUKgHkZ14CYwcv1KU5WUuY8BMYZk9mPw34wj37H1cqu41Jm/tP3TC+80M tEsLEPcHzPAXDDAEkcGmruqm0tr7sEnX8npV3PhUtJsptrsDahtGhiN2FJOkvE9ucM8QubN5ZEwc jmjt5rA6AEFrMotQ1fZqN5UuvsyLrchGpLzgAnq38i+aKykPpI3ZYmGFu3ixxC564Wzucmshtox8 2KsGrWo2qP8AtSgX/xlJy3lWA1TfSf8w6CB+ny1B7zeQd4by5wC1Ne8MZRDHZC0kxo03NXwRQ1Vh izDe1N0BXuL2/T5udmacxZVyVH2yRsw9gR6SUpi1swaFn1vZLAQVRINAUZ38bVSGT1vEh3duw1Nd hfEpehNdQmkpnxPpXXdGFckWPvq+bylBnAE9RU3SWXyfwU995skFnGWb3a8oGdB+MzIcPqKAM2Nh 9vGRMJeNK95xVlbN2ESVT13gtxnwqZ2roOg3/QvmPTe/JNB5mLEp/kfUaCfQKffe9hMDMGG/tU14 zZxZCC/7/Y3HbtdWla8Of2zKY6zIwr7fAmFJi929to0+yF+6GTRfLVxfGBexkfCd3RgNTmack2Dr xY3Kt+fBSycvRZD7zQQumFBnVbWSNc7MLxeEgdET/arVIOqZ3600jkZyeetLI0wIH21G5f73W3HN LsIZfZ4AUs/duuUnUzQsUb+sU0lRIIL8UsFAGgg+3v7+57ejfujXXvs1vBOP4vlzyMM5b0zlz11S DcjGdMnLuv8gaTdjRDyb1xZO7XWYsdK6kDJ4m8EfYlH0Nx77KJv5zLrIwBD9gGEblbZB0kY6eTD+ 5N83/T3yTMG3yGtXFwnjp9//qUeWbrzXkvSGlCMfyIB1Y9omJGggdWNGlfm7ND7MPLqu3bw2vzf2 x7/PIKc2izjXn5JTG8qqkq/fjIVZB6pgd+uC4ByShtXMnUGps7rzWoHUGv/+ywQ4sw== rnruTni+S67mfoTWTFurS2A90CH//qHtKqrEwTu7YXlavL/5LBYT1r12rsjTGSuShfD9Bv4QKhSJ uOH9tgKFgkd0VHKyuPGZOL2JFzRj9Rszo1q7DOk5YfX6N4xImdUbVPr598kV1IWabyGn8EvmMmh+ KL1Q5wQEneSEUx00o11s+37t4rXtIc1TXXFnjZ3gUyQlbitP/v3neSXXFcSzB9jhOeFZHzwJstvO jBWb2j9//4N9i5xFKmPvP+ds0f9Jst+GI6h0syfFHfZWKrMKybJdDXnHtSSd2nbOxwbUAxMSLoOr RcNbIyvT9vQ2XTiAfLakPNkYwL7h5zx41qOFEpqNujtg3tSg3uILMpfOGhU4AOiJfLZ0OE/iYLqo Fq0T+EzeGXZGI/jQbCe76MKD3DhsWSU0b1EnMNrw3MgncEoSp0Cw3R0Ate9GTnH07Dew873iwapT x3t6nwO3lgKfRwhzc1bZcWHf0cQSdEUKNuivWoCKTyVO78XnbTE7YkZkpJsUisz4HDyspAM95mUu vLCKNNkxp2BgBaNjwIykYGuRLtHEBr9ZcrbbAJ3rF66KX7kWZuAdDaQuYL9NCzgqGRFGLgR2TFsv 5ODDIfXAMERk41vkWrYB8DE0VR2PoWsaVp2DbsLY+sNRuzgVTLi5cy0jYWr9PpFwHU18Vmcyg+kc r9edgVPZX+WTvBCj83lV3hczX+0mofCeI7xdNMs6K0RgNjzMWrqvyH9Ym4xyqMayEvwcZkbayhqc BsNxz06EEfhQj9EvGoxSuCG2g7YNFS1tADT6WGWdO4fjNfj3oD3xDbWwx2pdGQjvBacZJTWbrpBS 1smE51hDoTGufe2QWKNMdzjpB/3060U4DgWPzIFjpB4pUay7tkvrSRlaTeRYOtLssq+EwLhzyCbp iRSQN2w6z/dXfYiPt3Wn13PoN9gCieDRO3O0bhFHmREifn4gdJ7ERX5kI2AoiFY21zj5nKAAhsB4 JysMZN58X2K/0HpiW61BIh4XrsM+KqlFmRnoL3uRD5pvKiXdfQ/dbLdnobFlrcT5dgKXzn0tBihj ctUEpsyMGVctNjxVYWxasIeyM79NDlB2w9/nmQmxcKf1qNz+pDoUfczsOhP63DvzkYXVIeL9OIfN ZI41ZJ8QP33P3f+BAaC562qbPR7tvTOjsGNGFJL9wW42iJlIZeEAiAGdWuDhS2hsVEKya/h9y3MD fMBebSzuuAF6DU5Y8L3nhvnjy68h4oBBBzcZZDuCBWEhJQaaSMw/mjwtgiHjUae8ovujaP/vzLly L+AAyNDatdl8bzxXXF1wMXzczeQVYHpmRMA7GnmMf0RDPYLKys/ejC3Kc/bVyQZCVrqI/HuwxniT XiE1AmKbaxmaGGyjd7hRYHCaAG706K8ukwpv5hs+g0bu/o+0PowU4al8rPNgCXmedPC9NNiQE/r0 WhdFK/yYiK4r+/ncdetD4z6cfe1bf9/6Jm9hBIJO1FC39qbo7ypWGC5YQE5xHwNs8ob5W/UrD5sb 7Oe50m0jJ+mniit27euRI0Q+52HnNrUHq9omj+Un+K3Sh/H+cTWkin7G2oyfvpnQnJiCKWdMNZQG 78FTmJbjNvgTAwADZu8aXBXW9b05APB/Zlx9MaR6GhudjZOQ15IYw5rBB7dir/aF8bXTc/2S19XN UeL2Hyts7bb9ka/hBFu/d8ltrhduDtbPPx5tOCN77w4cMQQ+ZEZAjdq9iHg2Q0yvCupMZQOpgwF5 xRh2XvHXTMKFKemCBnpny5694haMcMhp8E1KLcxtMAJkwPqs60ACssiMLIi11Fx28+IEIOjnoz7K d6Ox97HmSS7bzVjezOi0ogPxAfN+Foew6miYrfFqMKyshTc8FVoBlmBX8sNvsR3+xABtHgzQsGwO 0xn0uSzTZ3wSle+cup1mBk7yfmeHnUW2GNGi+jJu+c4X48RRt28jIaONWvSZgaTYZyB3dk+S1dRy +dl2prEDc8gdRSvDU50r9fZ9zdjkxtVguoxhm1yTyv6xMDM8q3q2tVFmyzMa4dvUpoprvc612lXB qc4/hb9/GufVohm7ZsxXI1WTuVmeKpDbtdZHP/njsIw0uxmXvv5GwKGbcd4/zJg9dSoMKySAMyOJ Sk40bccAk8QCrKB+wEys0NHBai2CDyHMO1Ju3hfaqTZbswW0x36W137Q3AkRm5HVMWOTKCpZFn+b zMaycTwxHpgRHxHhxUO4dvGc7JS4t1XzLHbR9KDL9NW8KUKJNrBQDyJ2SDTj/qU3JskBzvVr9WSA DnfjIo4b+gLYgJTPP49+rCqV6ERy3OskQqljz7bFRcS3yP59E0Xz3Ilnj2srxZyQH8e+ymqSCI5e O3bdCXTFh/56tpsIAqzwxzbDg79HozMOhyO+tK5rW+eTYTu9HyMLL6EQbeHUNHtgXDQR2VHmlcZ4 3qGWFWeWQL27dh17gOrZj3VRl5Ak6lC4z0/jte9PhCd30pOL8Mb+kdD2wLf4wd1Yf9kUAvaTH7Xm E3364TqsxRcD4I27JJ1SXVdkZ31IAnEEssO8L0QVdgf4aMxP69Qs9hD7DziUa7L6J/6u17UPu2o3 w7X5+moO14vOvDLpK9mj7Zsx0IgYIdZMOVvm0QnnBrrajUVGNKaHkYuuVYYmwyR8WZgkFZqTXQqh 1+lBv86mzfVdM7RYydLXwbDahfKVyJvHBRI8P3I+LOTCDmgh/LxCiyqp1pOhIIkVdvS7xszgk9zT 7ZfkuJNV8dfy2wH6KPLthEpeASYgVPbWM+Iw3gtCIp/KfP2Z3Nu54Wdmv59skImokX9/cSlZWotP 16WSPxCnk1UWHXI/PFNA5Ft2rZytJp0T3RDMwYy6uUzRgHyWsY/znQEzfhbZfWxnTnqXJfejBHZW qaRGoBHTU70wp+4fBBJZkxw7pYvncpGlzpHSmJXtlTwaqL58cmM+4TIzw4Z8bwfvs2iBcMhaA9zD BGiWVYFetBxwI9pVLamWBC48MfyVMzPMziMqzARDK7t+yryYwpsWEtDtltl++KGz5cIZvbmBOYsW 8+UJOCuEKh3jWiVY2+EjyM1rWyPae5/gWo3tZ18Fhr2KVkw0P21zFrlVraK/b/xqsqXPqgbCPzD9 us/lNhDFZlUL0MaisP0TJZKl15i9rHupEe5cADQzA/KdqL1tLHnnC/ZgD9X1TnAqx88ZpQVfj0sy /gj8VZU/gHr570EcpCfOJ777hXZD1s2NjTecAtq7xwKKIu3AjzW17h6hurfFqNqR9InsKgT4IYWn GVmbTJ7ubed+o6eVyqlV6JIjXMd+rnYngVOeq5FF2Mdtmo1HJdPDSylUvRmbmzEbc1vRIyhMuVxf kw0QWXDvSd7Ubm2Q69npDfgAQpsIWudCeATdAt+7nR6NAEIpEuwi8s/sJ1rnFomBELGRAJMsKstq 61z9hY53pexE2fyaCAZeVvAWGI2K6RlRWmCFUffVEOFTiVEXAfgXZ8ZaRGh2Mn+aMgR6C22PODsF I17+OJsvpDK6Js9yuzpKaCZZ8cjNApTDBCfkxQONFOYahSbbEYoEWIaoIg57XUwzYy9dOihvgSSR GQUGMT2Uk+2Y8S2ZfEtXU0qEY2ZM/E3WmcwcqRv/cANCZgA5RVMjMj+OhXu413tASfQfeT/R4oIB FF1I0KWJ4axcNTwD9U16dZMS4vjX56EiODE6J2odRA7mfko9hqViZ0+ul3UTKtSEHj7au/dfUJxf VcJZKaK7KpGP/Fz+wARKYYsjeyXst7paepsmsNS5lq0OZq5Ez0rz/rlQEmR9WyoBM6rgAF1kAw2v 75Ho7NFaLWp03/frLxLoyl7alQSFB8KXK0Gp58KImFn0J+jUmIcNydwEwshmdqD5AkCwL3dtQ8ll TpZJrw3PpO8AnwEkLgYYStNKAsC19wLv1s+tdFU7nfFPolaEV8R3TQTD7EeuMPSd+nX4siQ7OzOM HQJwREYgZ+cfyxQWpJL+hwoqs7HNwQOgSRSwPhY/6VFLnPYNanORftJUXui+YTvkKJfMUuDLSJKq E93C8Wv3Kem+G649PGbhb00RyX/qCp/1IgRin/Z8xFZ75GnMR+f8zq6naTo+U948VNKLHI2dd1Wu OOm1zngD5QICSi7PeEsYnGolljs6Vy+BX0ukJoi6fNTGHpZeGzHXXaBbMUa7+WEfzTiV17ajfsij Ab4AvDlAzV7ESQGkWfQxb7aljCNyvx0q12FMkqXEfphZHA7k9rEBJlmOqKTzHW4c1yJ2yrb1kcmA 5NNxkU3tW/cMKElvzTmHM0hMHzmSzPiIIkXdJ34tH5h/+zCKs40ekP8Usfdu5AAZiHvQHsauKEWa 0dZxqAFYInq5ZRcY2aPgH1B8JU/JgZynifUWZp+yTXNM4st8eVUKwaJW3lNgx7SB26fEBQdgV+tW XX4kWdkRxuNlbHJuvfIVAwzd7s1KM1xnkssWQbAhglqiGiMmsgp3Y+9WAhjNjEbiFYCOGLfpkYOt 0oxVvT0rhCh/OBg0l52S+Ga2P8C4aHj3XgBi29kuO1wsmQPINfJOn6kWad2wZ+zlzEZ87fm78WWN 99+gv7de5VHHrQoZfad4/OseJwGUUzFRl4Pa0UoZfTTzojQazEyZGTqwPt1wh0zms6nFBM2ypm6p pn3fAuPnbuoTIYPHxTCEipAZ61LbpMKH3q/Wac9MfWBcigKn62PXdqbLUQl248NzwNMkHLcdnrGe A/+AuSoep0hu7xJXPmrEtwEUjfupxnHTUyYTsEFyO71fvrTGuq/vrCMRuW2xq5UyjobIHWSVoZ/m g3Jn9M2IA5BgfQu25EbFW5DudfSwmmLl03WgIj85kG7k0ke89R1amZcOXVoe/b2YpoShHl2sHZXb pZmrFsIWfHmzt4ztR7/HNGfLtBosDK3FDawhiDRjUwsUI4L+iaxtBjSx14spqx1Aj6vWPJoKOMBU 9y6R6F16V51yN2bri/0vTYwJTpCq/ECLeNHYUDtboAkVNIbVpoLH5HlhikWFITfDMhODkgtLBb9u SBR6aZ7q4gBnMZL2UuDHn3i/dL/gDNjTOhyW3UwO/aeyu3Mb/oG/35N+1iv67XyyAOsU8SCasdKL z8ycPdn6yIvmptrb9cDY4H4t4wwCDQEeW9coWXTxa9XrILR6v+gvARXwz7uQvDpxmA5CJ2fCYbOw QdsLu9Cutgj0pzsTAj6lLs37R4gj2+TYgGhU+cFr001weyJDS3I9EyCvlOgVRM527y5qc7SR2+4t xgQKbtnuPZi1zfjefmsywwvxnjAzS1J0apvq8aTULMk0bKcPUk/n7955YwiovXCE7eC1pRexhR50 lgxR4p37G59SCdoxX9xZ8EjaW5zA/K9wcmMlPTpGlxDUJaA6PBtZRmFGhezRiFnoVtqX9fCJsc/S Hf3G7PlUE9Zi5b+Qd9jP8cGaM6XbPCcqTXGerKIpMKfEisAcgHQYNb+bc0FZHQ0Sxg== J5GhpID2NrBo0neU2aArMVSLJ/udu4JtcwZNf58iwvShu9NOPJxVYRtZIirQOIlrKxnf2fNoJ6za gKJUWrq8de/9oYtWYiMPKyDknmoe8/MT/KbhJ6xIGtvLQhbVIWAsCIL2bojOktLV8fcGtOQmR+or b+rgpBgvWQ6XOCKhDooDX4TGAx1RQFnw/AviuMBcEs61d04gJakOdnSDsmgANng5SIdojC3nzMCk 66jpNLYSb7KbWK/sQnA47wAiUsll//vCDhdA3Q03WwdRIkjpmbERlCOgipnrIgqo4TMmcjfe61Np TA3zzGs6SHfjKxwMrbqoY5M02CKNznL9Em/LKy5BPcIZAwZCGDgQjkdh+EG+A6CV+ftoPjIgFYOw QbIeRylmXNQIuVK13mOopkfIwGoKqNrkwQzjOCMUzFPPjMwALXAw2UIKaeSGXsm179FhhASO2Zbx DOHv5cSYGVDLSligGWfIVSVW0UdtrA4SVWmBZH7HdEPHvvZCPa7NGrG3CnT9fbbjbGk9mnkIy80l u9TY3XT+m3E8X1Ue7Nc8tI83VkkvMCwRQcyVAtwtD6ApLzQ2KRMdfaeVYA4YW08gX+GjZn8HiHSH 0AkO75pVAwx9Ikz62VMUVwflhV/GOhl3+xfGJ7YOv4VCeSYzZ5FzVZk3k0teUmZaBQwtBLSF8XXu zmuBfcnL2AJDfs7yMs/gp3v2l7TKeK7IMDJWNAek3I2FIHGSz83ngmNDtyGu5f5p/h+pgOdzfTxU VH4ZoVtm4z4aF6TKjsel1zQt1S18J7bVWS8w6QM2QbuysrtUeDZPRzbCmYWrN3MPPVAbF9RIdm0h erg8MrKI/1zemKVJ5c5tPrGqOlINjnVcqdX8FOVZlb9FR2LYoGvp77HBNivFfVztgn+esHYyJdi1 D3rZ8O9gTfSfVqq90fW3LwFer2WvN5GSrLb9rjuxCY5XlSOxAQ4L7dzQLKW9yBxdB3utLNWu3qHn IXm5mfGJVnHiziFetBoCyzAOekGH9VH7+8l+0Nc2Fw91kuPLVizaaueyg0NXMjM2l/C5NfpYPmB+ TbTTESscYm85UhWrxejneYonZsTMhR8oe6XmZqbpOm7mUlBUQ0pL1ZFKr4vsDHOrI7uJsXgacmBr i6CDNbfa+eyjwyu73VZmIqaTHrK1ojX9PTsMqwrtE+iLuBTlyXlyEV7h4jzBU4oPcbG89Pof9wc8 QzN2QVCJvzTzmergehqLvO7vse8PABUzdm0bKOY9RIc5oHku1O3KxQBCaVabgsDP7DyyO6hyRRTY mfnRrhFevv09KD0eMhfZwxoU2FK/hl26AmAzniywPixo2zICEMRqgVXYbTkdq+qoqeFhfcAMHAc/ XZoPuB5qdKuSB6Vk70+QqHs1Nr/yId4VYeudifkP/H1ViwarG34tm4pZOH4aWxlyddtfN373gLBe ReZRxeJnxkGcuUe7HKAd9sWp+mujLuwRjOp+w1sjwIczFwYd2qrMh5vXRN6ZSjiPDyqogKrSQ7qd Xn5ujH8KoAZVu1EJN55/z26YIj5fM4pIn6W43xLnLGjcFvHRmTFI4pyjKr55/yUSV3nMxifYlWVa j1ZFOwRQ8JCzx7rpTBak/76j4wkzKL/tacW+ufq17dW1iBL4Qs9DSMJrBWkvIsjJAQzy2vB5Lmlt RjAXj2AQGOyxGBPvZu40C+ow/iJ3GD7jso7cguXmQj78c4rBqYl6TXFDPQp01rxO6cx3r2WtE9xJ 0KtsaBN1GtCrsSvVBJ7Mjktc994eiv1hkSuRXzyMiMHvdv21SCFhR0djI+nLzE6BJk5wg9E8CnaQ x7ABRIXlFKUx7ja4Ej1vQJzWlsxdkw70skw/u6XFwroOddpHUx5hbSI2rMM++jXsSnShtiVkTVLD NvlfBjlSy0sfhEdlz03uQ4ZuWuzVYM5pF72CrvVu8KjDdtNHitdm1okMfrUw5xkFbITDttjhw4fi YDB5wTr69nN17XbEfy9j0iH0kB0zIxvgWvQ1xgD1WkbMAxhIbW/cw2wy8hH0y7/3ceOQsS4E8ClU hYXoRQwjSjEeheffn17u6O0D89razvnCzBjE6zYsYK+7kcHRD7+m+2KqtVEm0IwDrfHtL3ywUsDx Y4te9G4idMDhT0I4nhxVBS3/LWbuNrzm3aKiCQ9qaVggku1S7JvbSilkDeDn+c5IxwGmmPG8Rhnz sv5SfTP8aLd1kHDRCUp6k41UQFGNn4JfgjRxv2HR47CZZSF7ol/LpnJmsfcgQ6nvBY1P4bVLFm6e emBD0VDXqb5ndJP4ABljvczcJpvKGWYsJEZjpdyQrE3UC9K82lPymC1EFD5oxk30nNhm+cY+EZz2 e4v6LjTMYtitftYufu+9VTXokdj94bBbcmj2bBH45rcE0p1rcZs4HOLle+FFUkrjnTbF+GgKOFUq NUs8+wFGFc9L8wkhffL6KrcIJ8jhY5964I19CyG99c4yVB5PtgMsdnse0EB//X0S81XtVzXoLn/B nAnZ2kkOmK6fGAcr8RijRoM9PZ+Gh5auug16OC/GjO8TIG3SuKAiom/OukgHhTqNhE5QPdSN0l0Q xLtbOpFwX3LsWg2+sczon/53E7CJgSHHKjGiqDOUFCdXK4dRut611NUOcjg2VTowY5Wz2icuaxpZ meZ23MWi2kG0xwGQ1LTaA0sehgQg+Kt0/v3nG8ilGpLwRIxKHMC7ZRaRdFCq836dzoIQ4NtmRGt4 F8X1N6PaT/6rv6NLq+S5g7tID4nmpUwzL+zIW6HOj78VgHSlpIihdiODKlL1vE/g4pHUEZn8s24m 4x4rO2YcdJPQ2PYbvp/7syU26gjrakasnu8YJ7+dFpik7F8f7kEPJbGLZ3JJpIElYDYwXuQx//sy ROnyw4nr8SYlCjUjHn6fAL9no+0gJq5KiafXC6LgFX4V0jdRQOgWd6MgLeK3f4MDsxD+CH7WILnX tQn6HDjol3mlRsZJ2WtL5Igf/2HqD3xfzZB7h4UyeHJmLGJITaG6HQ30WwzOorHvC2UWYuiMXx99 3Y/qJO/z4hO2M4KfXUr8mbkz4Ixub8c/PKQ+LguopecWozyMq8y8hGmFRoYZD6H1pdCWINHPf68e RlbxHIChtrVnEsHx5QbyzhJG4n2YvDOc7v2oS8MQH12tMtwuiyjvT2hvx9SK7chC93feRpnE0aOP /JsZJLtfE9RzURDLQFKD5H7CfFirHvsV0S3oxkYQm3OaECSF1I8rMRdu5NlCUwgK+DqBfGYgeLVl Itmz/kTHgb84Txl+cJEc5gSKvsK3MZI7c8xCvnHJePfGbiDWIIU+QQBVDAVCvNPzkDR9sRDfrmrl UsGhN2XeSsL/bA7k2ZxViK/P80p6yC8Dc/d5bb9q0COyhhRaJdTgYKykMp9Cgfu1LLoSd9qrwABF cd13d6Z98WGKwrMGnBnaUP0rn0P7IjuHn6uk8z4IX9SSuw9meRITk5OsBFT+g2YQpRSVNAPCyE2I GBtvq6IxsYhL3I25i7m8KR/SJrjvbWJ8HlOUcaih/IIZTTcOhRAoZx5W04DXN0jP5Pao4M+si0nx +gnU+fnH8rmxmo7c5S+aD1lrCGPvkjIyNwMRd79LBhf28K5PiIU4SYGr6ETfJkBWc4vQmBX1Q/AX zE0JwHZOwoebEpOeNfv4fhAyURqTLatQHvTF6Cec7QiZgMU2QLwiQdLwWYFzJGnZvjDmYsKqrKIZ 6y1/7ML/l4fVhxISRZhYVXnsCUSVs7Y/Cn8Svv/5Fn7q3r6MzHujh0aw1zgUq7sKkfYM5HkmUstR +QyozxL8/rXTf62mfnNnwcg8Lzymg/Z+wdwfCa9bkZGcGannsclu980gHxr9FRgKICa+58kKhZ0b Z5E5g6rTBBTYhdkY3KIM4X8tp4BsPu+/RA7yIgxHj0PnF83IkfToFVFiDnw6PWpKYUSIZsaC3Mlz 5bqcvPjn9z9HyYPkcuxBPEPJA6KHuoPSqHjAsn6Lcs/H92Nw8KOES49U9y+YSXHUhbLcW0mFzpqy 9Q6LhFRMIr/5+0Osa/LafTOB/19k6/v/Z9n6KY61fkvKjthp0/zxxYwD4ePLIL8xa5D/V0L2zl4z Cd9xiP0vrX/HWmlNJ8sb8FP3r1dqJMPceJpgP4svhaET4Gbf/HjqnTyTB4znj6l3UlGPbKL5btCA i2uByW3eAs/kqYhvTYasHNZeqX53yA4wqiRqXPFsi9auJuA5s4HUQ3AfLumoKmH/yXbk2wg9Wp9j 3HKoLIZ5CboiunVzdFk9Fdn/UMWjXieLmz9RHv1AJoYlKkWKRjxDdrp6hDMdljzQG57Mj2T91kkN w0hvsUKgO3yI0pilYPLUjPkQUITvM6gpYgLlguryaLtIB8NlEbH0Exl3cxUqTxt2/vQd2hc76nQz AbSJyGGS0puAhnIiQ87K4cTyxnZAW3CyRT7DG7xJ36nWNpMg4eIoklwcihxHSnaYsX0hqPMBSlHG fucALUh57hTFI4Hy68R+qMnJXAQBoMz/Vsmi+WtiTkWYSlvAIl7cAq1V8ZajUsfuqbKYjiV5un8Y rOLTRbX/XpjN9aIBgaGv90TuPlPa4LguMr7vmpLlWRrXEmmzefjsLxi5l7kT0OEcVXIDxRpLyJcd utKiYG+xn5gqwrJ902s+n34thh0CU+Oh/QCOM8tHk4hPdCONdskrWtOb0lv0k/z04gtmOcMgoz3f JJMLhvnUi3iQRxiO4aH3NSLgMJTeJkFd1ka9TZF4ikOMcTqx9e6IRKfXqBfIwFy9Vpg6bHRsPUEe NgS85qwO4VDt3SbKr9DXJEKr/GWIF/EaALImLIBxAC8J4jMvHOA8ZBp8EJg6TJBpx0waT29H5wvD OWLGzm93B00vriQgwGA9HKA1nTlEYj3UBB8XSPDOm5YLT3iK+HCxT8xHoNlKkU6zdUFe1SQ/ayz1 GBWgylmvndI3xR9omdakBE01jOERiGg86touXQcOhHoMOFgnS/eozxpE8Knc/wq5TWwA/lafBP8R El//gtaU2e7tW8BrwyKer8gBh+7pg8HmZ83sjYzIj8DnZn5YXXrA1GDGyg/GAcp/j2vXQwJnQv0N z1e7VuyBbUgH7FFT38sMnh/GNrg22BeuA2jeh+gF8hsBKv58t05/xIUVYOqX7XWHrIAqPJwkSvP9 Jcj6DSF46tcnaERPRKzVWRJk2ObhB4O2jLnUnpQlY4cjfjrAOMCs5H50SDpRisnY2dADYT92iHqj 9qKNu+SzSMF2rqAa/XTiO0pRBQ84SIZnXEQDirnMUYqDviYLHnNfjKHow5lHmE6A9gQybCLBRi/T dOEk1glIXnAkVFYjc0Ys3hf8ygfMe/P46XNxCHrLLbklLJrmMVMTr3oiNo+VAPzmgmpfjPqIHcPl OnCsCghVLmJ9AWvA1LWj3stBmcpvQZ/Av0+FhUJcTLlO9qc3oieX2GCLXs3yVjSlCQ== JiGR5WFtmYokhj3ckh5ROskhiXxcRUqqRjqS/Kg9MjNGUFKJAqpAq76M7GVpwaPEcbOVgu/Grl0i 5k8ulL6J+mpSl7Frn0+YmzCexoUw0QC31CI6LlJdZ3mRbgOJpcwIQZQmyK9xvGy6PE3tEVZt7iLr haPrQEG6c6JzMWg1H7gn64V/BGqnh4f/A5BM0efzz0vjjuqoLaHsxiDFOkqEBp3TQUGXevVo244B Eg3mPILMP6D4Y9cWsrnTFzTjww8hMwcGyJscgHIWZhySnUiUnlchcQvirumWc+EqgDdqREeVRmY7 DaUXPa4DdEOE5DlVWEwM3R3rpj2ndK+NeviBOPhCkMBKr5zYcaN10lbt8nhhTIdHvLNuVrsEutUc vrfY9wLUtOHpBGfzyjkheXlcbqVVX+ae2htEsS51H2RV14wCbixpO6ytoLGzfma4xMaHyL7VtQR6 bhe+eaUAalO797Kz5uAewF/sRhFkL22eNi9ttLqDbbsQB4A7bjxeg970BY7dklJsiv1tAFHS6xZs AC05eUcGQHxq+7ISraFoch1wi9iX3ktSAy0QweCVs2hl5hafSJdAkgEb+7qfQhjLkyBCPloQhObX FEYQZjmfxiRa0gkkY9C+EvDY5eT2cdGpgSPBzEj9G0ubXHK9hnPt1IkaWCeqJ/j2Oye2txY4ycgO ZcT8bgXcBaXQDjkOwI0MSZkLFPJJRd/dJwGnciX3wSns4ETlIhltGThS393KzOxzxZGsDxngKQgd /MeQDTWfnmhe3ymJLWR3eYu4K4xFLp3I9ioJTO3BkLLeBxDClZhsA0fpywPdqmMmD5fMTsbDJLdv 1E0IFsN2b+FhPIO34J3CgjcewghBF+/Gh6JK3Ckdx8grj6AN20DHOltxuu+m3GNXW6+xM9aHJ5uA yrsTZuS3KyTkGl90QszoqGv8VP59ynDd0p+VRpJCGFxxE9PidWcOMCGthX2G4MY9Dk8RMV/W1rhm UTQ3jWKlgJwjhthGMpo3lS+NI1MeDsu5L+NAyNsvVjBDLO4+P09gCfrSRcWyl4L2+8DcqX/RItAM 45InI0Tvy6uf2j0z2W+btQSkqJ/6Sd5zaYD+0E11gqecwaNV3zkDb5+I54JQ3IyP4EZqzbPZFi5a pj4MA9m1JU7BHadw2Qm6MhjlFkK1b0I2n0L08LMqVeKYz+gXU4SZS9N3B/iwHQHCViEdsVG4guMm wPhRf2O/xMG3kV8+3NPQnGc1EwnnkQjEjPKqvfuH43bFGxe77DySaYWju0F9n2suUFvlksv2UI4T 44GVX94pV35P8m9GyUFJuqlA//1a0unmava8chjb4QbKbPcppEP59CpPuTxQHg02B3VOLqhR208p 7ZjcrD5fPhwPIjEDnVhscfYZ6IOUshZYKj55sMYSXOSSwQV+GS9AnnkjxMk9D931hZYMMzZW8Nij bcbd6PoILu1mHgKsvr2MfVBxkHRlx3Lg2lS1GM+jjuEmIjaXFmRS+MAVMKP8A99ANcAjkP4qOYBk hNH/btOq3KwzO3eeS/wBCUqbLBxzdEqEcRV5f11/PXWEEPlnRp3CfjTidxrdcnW5n0zZNYdjSHFb bp7vMjLnkaupbnn71wPM3MFKJbZHdPu5fR5v7rzDuzAyO3j3vpsQ45Kbh+D91CsjwCakU8Mzw9I+ QwNQSrxF+S1uLFOJ1zoEEiImFgK5p0lixlgimCd3Mw9XXzAclqU2mxkGuFw0BEeXFGR3zGIM2i91 FzBxGOH3UIcCv27xYnLj49/z22QKypQZ6yevLYyMQOA788+ztUqPdShL3wUyP9mzcPtBZoZz0qkC 48baubIhjm76hXDpexQZYwDHK/BhU+RvhfCuGzvStkYDv1mbd9r6GMAIBbiRkR2e3EUtXB8YlzS7 h9QLjXhPIF70d5pREkFsYzg7sk5fPq0tdOj1qvPSLnqU/5u9d4Gy9SoLBLm5hDwrPC4BkhCoPG4S IFXZz/+RgJDckIBUHibABBEulbp1k+rU41K3KuFiq72mZy07M2P3YmaCurR9YhtHxWl17DXa0m0j Ok4vFgo2AkK7UEdbgyMJEYghZPb32nv/5/zn1n/uo+qcyjm5Sc79zv73v5/f+1FXRF+Z/Aq7U6f4 ZRcz9EDZQiNBRRkwicyJX6rrGDnqpOYFtjWGR2BifUCrZAOSFQyaRjqZlUiUvBg2OsxDLcM6KmMS eq4pWWN8l1RezA6GZMTD0oc+8gWaK9Ep8cTHsBEpUYghkMzySb0tAFfSVKdyiJyTKQmGCHSCXpHC SAe+qKVfqXmmIiKJsTdYODEuLBrOqANN4WORSkrxBOciPZOSjjrWWHKxIgu0tOIh0uhW+G5Hycxm qMyijRiSlOdYELGImqYqVniLJVnQkSeW2BMrnEuVC10+27xwH2f+9y5V7MSKF7Vsr9RUCW3riCI4 DBtaoqqU+hU/eSqZIaIlpxfBWiAcyOLEaww7sOIDJLoAClqIV9SlsiFeBmt8Ic+XlINdZiAdCIvq pIYndlDLu4yK1fyk8p+jgDHpoIihf3EVi2ixcxh3x3VW4gR8rMAJBWVjiCDxgNjUO9szgSIqXF3K X411WuLNxcs6x2AxUMZLipONmqKi5KIj4AkhEklU3uPrajHHojOG9IsBtRWZnLxsrthdY+2Xgtye EIiBvQcGPw6p4WM+mlhpMEnxsRoBlrUpxdJQGKmA49lkBxJoXO0wZrlekhMor5ToRPEObYt4NuN5 C28ykbEUSyT2mxSLcjTK6JIT9XpYFTGmEohEkUZQRsnWVNJWyRRsxViuzJBBqhWmSgl7QlStpQM5 g7qQ+ouY/D2hh+M+XXvREHEEANWPlJbZDkBdR0HSzHBDYUbFO+hi+TGVsr450uVTB1W0ejoxXWCv VUQkgqUrsmLwCprUgeR7cZJzBUtDlioiEsswV4mwnooXqiryQC7WHgNgut22khl4Kwy3ibXSFKfD TbzpDFVs0sKWlD7CKjltRsRMLE0ZHezQrWuOwTFcW0vFKA5IgEmRAQ0rRiUloY5dipuFE/8zANZ8 qjnFIYKcYJYYDhjwSuwO/xYVa07yQmBJKyfHAbdNXlzXwnhIlbvsxazpAlBiBIqEvfLHuXYt1N2M +yvlSGFMRo5zKlsHYCeovuCQUIAmJr1Ipb6KFGrq46yK+K5UHQ4Leor3IpfuRmAs4sy4B+p/aeFm fZXWE5LxS7eRXGoOCaC7I0XQwD1E6IKTOnA6um47ytMs/UqKLqArwjhBnVAjKjChovCyeKLlSkG/ kdxp0dQD2BZye5zUstREqGm+XE5P61gr1ZHji3QgSTNcKlmpKXIoUjyCVRHTRWMFdhsFgJgjGcFR MmGVPL3L9rB5OgXnOYkSm6ECcZFPY7cDLH9aSXwxJRaghpY3ssyfl9rKjtAhAZ0V2iIlurWJXlV0 f+X5dOjYQoed1sIlctgjAH1ECtkBBydAOTKsnOTyq5UgK64FmmJ7XFbZWJtcZC+kjhsUdi2ibFsU As697IR3g54rcbSO4wVHGdE9xaTh2LYUPbkhjRAW/4tOeuxjgVX+bHSlS0cc3O1E8yBVd7WNhZhc rHynLSH1uI30vIsKoWzHXMbjYPk5AopSrXFkkp7cSY51ABY+Jm0Q5OGiLcyltFXYNm5ZrNTqorXZ pXq17AbOe+5M1kHEVIrrBvtYsDK7447MA1WULKQDVMEyTiemEnpNKt4qDctFxYOzRRpB4ZpqAmyr U0VnLn3sKDw6AakDn2lSpZIdFJaMTtJSQzLAtI8G93gKfCzsHq0KuFxWdPLsbYpv8i5Svio+73R8 nnL7ITDF6gqmBbY+Mg6xBK720QPIUdgrA50QMUFoABM0G0152K0WQosa+TkGc0pn2FrJ2Q7gOuZG wFwo3AWbkD2boKFkp5jX2K2e3pZSQTgMtYuVQNl1OzsyPoZkRT5Fe4nrRD4nnsNiVhZGyLjG4mc5 68JvjxEXsfQYgo0wheKur2MZJxyTjrOqo7wjiSiwbdQpRORdxPwrlgL9CIgZQukeiOMkgEWv48RR FYCVicEkcg+K7MZEHxUsxxqFRpdqtIqGnmk+ASWPkiOqJx0UWuJIYuVoUCHFRaykcLSkbHTE9crz HLGTY/oys584KrcOU+W74SgSWZ5XdUp2V0hb8aZ0ZHVnYDQxRJMILoxX0cRQ+7haYgFiZhtgVYzT SqioiOXOow8zjqoSxSbLK1Bj28q+GklRTKW3YxKfVFE382KQ+q4lJbLoxURlzFlppRYArnb0F2O3 FdiWxEWhXwJ1EHbLRwM+y2YA1CJeiwyhyywPbVZ+HCpjxaxR5P8LwDqaB+MxhvgtWddE0eqMVMea wHWutqfktABMlCdqQQEspkgn7rcANDqSuUpLB0kv5qNeDDqoRC/GNilsa2MUmKxLTemhCah0GkEy 53odR1BEF5mIzutMEx7rjOEIvPBhupB3icoxOgUgUIuhP1YPxdrjiXax5gPaqqj5YPxiVCwnblPI GtUpF28xTtCLddLj4WR6YHR00bEpZxKAnZVDwHmBsHR5FQ2LfBENxJiIs0RURgM4GaQ9UQNjpMyM t/EiG0OuLnTjhKAadBCOjoikdjAmRmNHL0JsGS+MjRy6yflIRFBSOj1xVhz2ifXUq+gazloeY2O+ ekuk4wB34EtJNRsDOLB19AdSlRRfTz7MbKRGYCETS4oeAEf3Ka5QidXXY8xumEyq8y5u4JgVRDqo o7dvYbgDl2XTYU98rDBeiqst+pFTBy7GPfFopfJ5ckKzlPEOiqcrEzPGGoE5FznpiBABbCWoDNVK cwxORxGlvQiOzskcDQRALm8oHt4ErEtJe187UbZAEXorSxbDlgGsvUQpcWFTAPoYFVYU0q3TEr6R FNLQbfSgYs9cWJqkW2NvWwByqVFxZJYOBFkbyU6QL2OMysChupi0WJUmdiA+MkYSPeMICkklXLAF AkbgJeAOhWPZX3G+NKKwgQG4mA3eWCPAQsIUnET84fMxriQGIzIPSUDHM3DR9m4yNZJxUlfex1zX eBi1OJNLXXvjoiSfReYh2As4e1mKH+PAFLwMSrY7GwHwFPIy9q0AoMSaGYqbYKTCW6Dj0bJ5el+W Co2VIm547ZS83msJyojeq9g2xguyowECC7m3nIoCsZSVdLVo/41I0ViJamMibDDPrQQESJQpzE9i CGOKQULA0m/MCwtgw469JiHFHBhPtyYdKgEj1xTAQodNwnQquuk3gKaWE6cj1wPgUq5idm1V9GrV SQrlsiR8DJjFgoobgjhisn9gW7J1cFbYMUmIpiUNKwBThmA0gwo/6GsJnGInH5Q/tNTxwJQ7MySD xtSg0f8JBU4v+A9tXXNRYpXbGPt1VBGIL0Mm8kpohhXnTWwbb57Y2LTLVpepECgYmBBrCokRvYWo y000x2kbbTbgEMFAk9XUiWXNUNPD3kBcJEU0MogcEOxqUaxJsgzNbhio2fN1voaiWA== M/Fl7B6CqkElgWocnY66RS94MkYwkIY0Vk4hb1sAYn0zApJvMeptY46T6PyEml8tmWtEgwVKbI5I 05LlDdXlxstquUI6SDk9dDKOQGEgyRKMIZkznAHN8ggSpgYjIbOvmph10re76HeiKfxkhiylXjI6 cUpmsL9Ktggdk3tDU0njp4mFEGuvyKJa/CzRMEwFPXARYreukEr1SYWmYmlqmIWYBFVeiIlZPbBX q4L3xiUDiYreS6BWLQtum+ozkUkSrfOc0l4ntE7OBJKhxUqetDoyelqyTJCDgqThRl8E8VuQEBtN 9ss5Bhec9hPmS461NRduo8GKS1DKFamzWuR1Kr6hY+bFuszujRRrBo8OjlbTWdrDADalnDAJKKqL qM5VyZ/BEwNBY43+nwAuK0m4JA4VAX0ZGYEuuFdPOnMEYgYv6YArzQKYfRTRAUcOqBTZqF0UDrQk amOwkiXXXJUkcwBqdhDTqVsfc9vZmBdYkx56YK/g4yXbmAoh1CZGqKes27XJKEs8HuAaJ4XCUvrZ OtpwtTAI4CpqCpkBF/OoQKUgFyGGOlcpYkSTk0ZMT2qlslslbq0+6o11jOODvCGu4A6iKyP4JltB UzHRbMpzoKUQNPg2K8kvl+U0cZE6pwTf4MhdyimSNPWVjZl2dVbGG8B1PLLiRWyjdx97FDKwlLIG qepH5o2uKaxhBn3cRZObziamIC7iXZaAKnC99zICFOMJaGICfskOB8C4hT56wUG/rOTWJIbPUGZU H3OUccQIxBnYiKIkoUGlSTnP0Bi+4F08xrKxOtpwuQQddaBi7KlOIStYraaS5XKS9jsbVfTULYvs 2kvp8zLGJOsY0gBxS4UcIh/zGWA4k4ClNgQAjZQ/kxDTLB5KJ0UFJkQ3kqlQElgFoIQLmphXLgDT HqQwVwi+8lIpLEb4FNH9V6eonYLcSBibyiaUPi97xPn7fV7OhV2+Sx9TlmSJvADKFgWdZS4rk/FA U0aWGQzBExFIx6iM0kZv+uzWQ9RmJO1SUbLI6wUh9zaDkdKpeEpWcMLEcCiVV/sRX0IVfSR9CmpW FOqBHfhYBxaJJefFAM/HiOG42gOkQiilrEHKkOV9zMGsY+5XAKZzyA6t2FIyukXemapySTlH9kdF M4KcLXHcRyNATOgWwy98rHYKhI4zTaKgGzPNseM+nGkr6SeTuzgcNCW1JyXMAICVlBBiNgo7qCI2 jcQL9p6FeUXqiDkBO0k1WNfWRLBRsZKDi4lEJN0SJA4ykrNEDAhqNqsUXNENQLAwMpBgmFOl6RgO 5VhFQ6+KwRZYM1UOcyzHq6NqSok+lhJYxg6kLDukArXCdEkEtC2hK14bKcueZVdiHEEd+KzeEYvo LTmI3hkziZlMe2BTJjFMQ0rtKdkO6nucBKO7moX/Iqs0kjxmAFxokfPJIR9fVglS4hvdMgJOoabB JSQ6SAMSXRFwSsmbtNDCoVhJaIpAL/4xKhlb61hhxyVtQ9LhJocuABbiVaiSq0aKXXdRE6XRLUWc x2vRFvfMQKZWRTnCUarFFQGXYpGRQegq85PgEhRoCzDiexBr/7T0ywnj0CYTHZhANbnC4DL69XII JQJjCYIovoGxyBQCjMamIjJ2TiKxyK4jHhTi8NY/ggNxaCKWsYOKDE3YmOgPCZqA6Nhry1qG66Lb XgzJY+OU2BrEkhkre6PPiAys5/0yMJuZMDBUZkXAWgZWireDSD+Zec9Gd0bHSVy5aTRmRucMDvio yMknOmf0vF7GlfutgFp/RaAxvJOjhxGoIlCsMDra51xm79BYu0faFjb63vjoVyBif4r5d1S940Dr uCSJnsuKasTE6gGalRCppIY9gGOqBVQTzLX2MRdz3UuiL0tTlVz3gtxTQGdpMne0mEHBRN1lHhVb cipQvvlaEuOn+NXI0vSNQFJT+izADpnzFQHXMZdEJSUJAFyJ+g7VPnPtncydivx//oTz/wnahGJi OB9dZU7pCJ5rgAMHBWZuyfFXtkGyRyXhXxDOwJUWELCBsGdw6a+AcIZhAvoGuan/C6UBRBs+Ugjj smT3aBdGnGkyBxHIEYAo3sTYElREUgFn41ImXARTwTbjhLnIzPXGS6Ay2uApBBEybSZFJDAXyOqb KnmIFJIW3UiReXReIlOtgXCMInlKlVQuxZTCT6JykhzewHJDDEfLEixAMQAs+4oLpnE58YuG8FZY 1goqSxbwBXIrYrbFMIsgcMTsitojNVOYnzplNCUhWjnKdUBAVm+guz8rxEv6O2cRpWZcaQ7UcGzj NdFdGoCUIwOBxDSD83xEOZBz0aN6SPnoxx2A7IsKIQgpj2lz8Fgc4aSOGZgGKSUpHHZwvl9hTT6n /kN7Ob4ceFjEEUCgialEfTt51usqyfQArqhsNBxNFXX+XEsaHVwsw1iJBf5Mrk72BXbfgNPCgQBg CSa7ucZSzdHqQg7U4DOpYgdWwt0A+TPhBHsSuU+ActlGoyAzleIKKTYiPrzwskqJjagVyDsFvcJi LAzuwIsHNZBQ8FV81xSB2Z4NTnhUnAmNTER6wQVODLFQ/wSvBDiFGXEnBpMSOf9pL/lnyGiLUias t2a7CRjlUAGN/kDi8gSjJXOnTpcS1qtGdA74gck8XsWajwHW/5AOFCXuh4OQbNSIIxHIQXu0YwW3 tCJjtRxE5vrAb55+cKAwkDTB4OROornTKYKmAvUJAyWnKbi4kx7Dsb+w6Oe51rPTKVynlsLcLtaH IRdwZK6cSVmaUMFPa+ZijkAAOkrd4WIOBBhBXeNOuIw+oz+9qbiDSjvxvc868LVMQSvFwKiVxfAD rggQY6YRaFAR4iyFvcxQpAPFJjmb6gxQ/ILhgYktFl9GJVwcee3xLhAv4Rz5kUkH7AUIYEpZSTuG zCUAixiUgE6lBAQuYUFGQPoN56VQEMVaUJENOM4Mwj1CUEzAj2EdVNnVeYlKxAgOcpSGPgsXgVy4 w6ESQZ5XjhbLc9FFDE2qCn475tQjIJuOXE8UU+VK3gAdh8plYV1MotZyiomWBYwFmeiwsmlA2hkS R0ytId90/xfE3aDA59wcDpn4FQYG6hAPoJM4U8YPLlWohohUyonvWEV6gDtg7bPTMecIRH+SxRsS 9poYEKkoKNkpuuhirUCleUDLyelJOWEmrKa0kLyohWKuIQY742ElwwSgMPbTAK98ynoNhmorrtQF 5UxB0TlZSjnMJJAhtpagJzSzPVqqj6NjLRWKMTqlFEZPaKqTYGL9XXLFJg7FSGQ7Om2TsRes3JqO NHipE2YyJjltg2OG4j45lwyZPtGma9gsLR0AFuxry2o47LXwg99vIzNnoh0NFoXiF2D4JnJdbPsF YHKejJZiIbm8KKThBe8BZWQBg7AKG0DuB2kHAsUrCBy9/+GMIp8EZEFYPCeWOGOjLhUtxRUKDJRq 3jAWZqWpqZOHvSLEGY6VTUV2KI4FV9BGBzUd85lamwfHGDJUWwhgNoyUSlkXUE+xFAkRcOTuZAtJ 0IP4gzw6bZWtIDJ9iOxAE8ZxJcrKfbO1ZIpHu6uh6lOK9jraQguhblJbsoaKNHQzU4ogCKHm2is+ T65QSrw6ZJfm/E11IbovQBiStiImEncuN4ZCIGLBmF2U94BcnNALrFDagoaIKXVBfiiAF7WCu2xi 0gtOgN78P2G1JIuB9gQST5CIVktiMdgzRYljTawxo1KiQ1NTYZoAZC88USl6ckcCAzYnY3VaJqR0 7NWVkv8AA6Ml64grpOy9SiUOQ1tFVgOMpuQ04TXtGdx4YAKo6jGoXckUAFFrXDAeHBAVMicQIEn2 P4wIcPw4OjeQErmUyy5uCARkg69OOYkLHVlH1piQKQDYHy1comTsBBUzbj94DHPqLCiAUaKgAeJi rEToK/HCB98ZG9MqsxugUdHMhJ5ZjvlJdL+QJeC8KSAXsNIdVssZ7gBdCFi77gjdYcA4b0FN9d8J tbEh3EFXjpuinEnabi7HBo6pMS4/3DzWQxquZ0xKcM6Lhkn1TdR20zE0XG2JRqDFud+qVEBJySZY TS5rBORoK6uTeyQosVk3D2iM80ZZIw6aIAqQ7g3OMZc7N5wdEtcQSCWl4jacMgyABelbEI/WnFLH xOgK9E0Tiy8gddpcEx3w4NaxCgncri3l5O2/inS3LTIwCh9GnsXQPZ5GZw285H1f6HJDvlEyd0Me ABATSJ9Uy26Dv0elJG1sQUp58OGQgvUlp/7RdZ2lUyxqjhvU4IMRk6OiGjLASvH0xrKOWBdQAy5L 5eItM9gAlm0tLWNxjdiUFXCOnNjwTTFlSSn5mwEa7Z+asAeN1Umt+Z4FSGUlOZ7dcoITKdjF8aNW xcpwBZl+6WhyghJXSsyuKQlP0ZVVYnwzNen46HYy0jJptGglo+PmZWQELigBJlwOLhyMYVtIysCn ltIEgfGOnM6wEIwkE/HRbQBcYg2dTF8I2TQpwQm0JAxvuDIt4YzWtqWkqzYpibYHLRbKCOjwrFIi dE5jLfeIehUtlo4FsnwpMiVgBwnyxIzdpfCjHBAKiZ15uUAOltzeTs4x8JuizgAwp3nRJnrPYMJu Evp1rFIEGceZxsA55iUotHDUCoyxWpLJs3QOshGngfWFVC5WVZYQ2JeipsGkAVWsG0QICvIY0PH0 lUQQqywWBJebHFGBpJZFRPxEOZSWEGjM3V/KTc4qLlQSr6w4yHomzy+uTPRKgtzeZJcF3zHJho/J uRU/L14uRayyBZ2ygnwQgmhFJm1op+2GDrrMrbe+HUEAT024pIq1b0uJFsQ+VawrT8H/yHxk7g2O VAjKRo+aUpO9C4FCuNBjAG8BZLgQBQ26N5DiRzIkcK+0rCBecAnF0lFWC9AE6Yge2S4OsSNcpgGs DrbiK0R2KMxcXQodislCYKGzO0zJQjADOeWeAjGPFBWwp5w7CL2creEbUFBt71x4gA44xsrEhCuY lpzyFKFXfByBl1R0oG6VzOYcFpRoPPE+JXF/hivJUwdKYlZNLZFPWA6BPAusEj+pQksci1WkS15g LFSQMdrUsRwMvIuWEGQSLqXioZouOmdYrmzcw3xZR4FVfK+YyYAqTUZ8Kzitha2SXRURNDlo2kpC QxCTU9Y8W6U6FU6SetsqBeUpH0O1bZH8EpSUU7A+JqJzlVi6gOsG7muBOWghZj4m8QL5hMKZbMw5 ACxZFalh4uFR6nBGwDZ2oIy0ZT+lfnLKrAtoUMpMGgFjPtoJQAwRfqb3CzEv/SyhFJfsZx/bGc12 prSdgW1jdQdyxa0MdD+rPYgtb2Xh25j9AYJBuxDRKm60iyatYky7wDNAOGqTo9oErnbZrF2MGyDw tQqHteTtkxxbNABORwhEh3Q2WIgYeX1A+nV0gPORRwDCyTKERCATUEoKDSCxreS4lXAPIPJt/EAr 4zCAyWhjSFpZlwFcTitD1Mo6DWCzWlmyNuZtAKPXzhS2so8DWM1WtvSkmd1WFnoAuw== 3caZt7LwA9j9VtGgTYgYIHC0CydtUkwLhh6IzVvx/gAagRIeg6XQBpZ1Rs8oa2LG2AESers03yr3 t+gIkMiga2MUi4GEmprMsaVow3q/EInpJ90rwj73k/kBDEEb89DOaLSyJO3sSyunM4AlamWfWlmt VqZsAAPXyuy1soUDWMhWdrONMR3AxLbyu62McQsD3cpot7LkA9j3Vla/VSgYIEC0yRqtQkm7/FJy 4UJUkKjojZ6e52B8jB1ASwu8CG3R2EEV7ewwLK7sjm0tq18dp2WtYikRyP/Y9HFHL2DwnuB3GZHV 0BCgpHRBYBYq4jswjQXuP5RfoOch7QZX8IEqFsQigDmcS+6BLzqlAIQdrKKPu5fwIuCSqlJqY1SU FMNYyTaGlUTIJcAU5IUWRTB6mSmlnHJpxHsEnTu46AhMy0nDMh2BwCfLdeWMx1BNhu6gNVEjD2eI Mh4DanXiR114YVStj2eosKI5dCry5IWWWHrn8rKHtXgDQn1xcQUvxBcMKnRy/MYgCaJV2miVS1pk GECtBhh4cO/RYYVKjV8I24KnT/yXfagUJ54Gb60KLC7iZUjEQFclrLnkliIPTAAGVB/dF7ESIQJL n1wH8GYGcD1bi32YOGBdx2TOYAaiJO6kldRsoFPR7AaZWx1nsi25YntsO0O2WMqOolhpK8ad0Ak7 B8VMvJxnARKGiueDkuz2lKmSHrZiiZXEbgSslWNPjVj/AspmFT7DrniRKid1rMEBjCt7UASKo7Ml 3GdZi7+t4xh2uom1ZG9yXqxjcJHwpgRgGfEDBkqQj0ad5S4vOewZwXkZKcrIBIXhmcSDMqci94Iy RQoiKqfg0jACyWxfWrmewFlYrs9iJQWt05QgW9Q5JdUWsS7W0Ctjkk6rxMkZg4so8ybQuMqnqCfe WePJE4jaIsJGauJ1KfUvvK3YMUZXWgqOgGOVY4oSVlOS/nOlZRBjuIIQpE8nV2gQTYzg01oCnODA lU4i3yhXPGJ5HaP0CmBfAtBFKzvaErUtCBqPUc3p36kp+TYDaq80P5+ys4CbCSYExQ443SG6WQCG 0ZUnAbr1GjMuIMc+4CjhG+CCuoB6EshoFeAV1/IlGiJ6UKT43Lag0wGItw1Ht6LzNrw/gEQMICet hKeVSLUStFbS104mW0lqK+0dQKZbSfpA4t/KKKCLFIM5mM6DebcUoI+cRkUnqE45m3FgeGHAbBMr zhQcptgAlqx6ikBcAiiH4cTuI21rDj/Gq8FORXhfPJmNfBbxBCgW6wtrzCXPd8NxPTkEchTSgLvV eg3b7mv71W5FA+0IYwByGYCIWlFWG3prRYXtSHMAgm1Fxq1oux3FQxFG8ldxyaIH7D7delfEYUF5 ShLFIUTKRm1CKdkqnZdssCBbcISNY+dkqVLKnBXojBhDYEnVqpDRetGHtHFW7VxYG7/WxtshMgT0 51jg1Oh9QTxRYFRK2/IlupljxAtyOJjYUtzMKRU5Mj6VJm+fSkQILB3kJbKH7SJQjEfFkvNhRBhQ qivwfPMxlAjzCQAiL+tSEk+V3rrMpV46IBUyMmmaK3Fg6iky1MJ4S07Ao/i0IdDWEgxVM+9WJPUA gGm3YWClczF7FoqMulYp/SdIdMS9gXdUlgqkxMIpAC5czOJG+UwAWBdOsq2R1gJ5QtheZP8wR6Rl AQ0D/YjT5KAecB+slXgicmVmyHSrrXhtWlFm6JRBBzyRDAZUwpXlvD4KcgQZ8eQCrowYUC2xssYm 2l2RCE7AqhagpoJYQM+03E5IM6AtS/OS6AW0kSTOWpMQHMiN5DXlqBLOAUGxpNoFXygpm+Qk8TcU pE+R4CwPS3yFSINS7tjHOoWl+J1iaJ+XsNpWFrKV3WxlTNuZ2FaGt501bmejW1nuNuZ8ABvfwvC3 CgYDRYg+caNVMBkoxLQKPP2C0QARirKy8j2W1OuawyIQGLOX9mEoQngJ2bVFgQhr2PuFPWf7TiX5 lA84wX1nfeC9aLlDrbdt4M1svcWt970dN7TikXaMMwA7tWKyVpw3AD/W7LwJ/WYJFilLphY2iFEx KjCRe/JVIh2Y7gC5H4nzgNHCJEnVZGJWWC4iEeaV8t5gDASuF9htqoiMQ88czSN+9TCvyrDVCLXG MgVFrDF62NeSpJLjfsFooZxQNOafwMffxdSXNRNFAHMFHS07ikAuUIbJIJEBRKAuUuLIMG7cxlpy 4Jp4OlWdoiliAI7i8jTyvEgHKiWxrUXdCr60khOpksqXlMs8i/Ii/QuCC1kujnLWWqpFIVfAj9ex OghwkzQtYDYlkLOirB0ElAhTiPYl2cTkmflBC0wRLRBsWskessM5OB7HxLqc6AOzaakUOWtpASGK jItzaC+rqkvxksOUy6QvDUNJ2ZfAN5wkOV2JryxiLbKkyMkhIOfF1VVKGkB5vCT4pSrFC7sqtHjZ KXmcM1TqOl8AI6oycPMzElxi2Pwba/phuEFJftElZsU9wOhZCKwmf0ESzznq18aSZVgTiFhPCzg7 lpCCGrIY7QYUmqvNJrTndCywWXOIF/KuGIMhFIZrToKZRLIDwTV2HF8jxjRoaSw7EKtY8qyIz/uY PyUgCqa6gUXAMBcCGqpVC2bcVAQKijyjSdZVMXEFCG+ULAbovjfiF11VNICSMm3JCDiLjitpLwlY OpptKXnaAcjJwuBVPkVSoC8nQmPep5hv2FXR6AJz1cT5QOmN2IGnU0ptJW0TZJvkN7GRFJIrsWM4 pFMuUyEzds0AYUWqWEF0hBcmS+qQWUnOCVa5VCPQZjKUJC+B6moO+RYwhVfWHG8EnuzmtAImVkJj U5KrSHQjIFd5dXWW26d2zKZAegnJAwGjLSRLFmcYAPFYinbqlCEci+zFJGqS5qOGPIKSnq5kr2+o 0cfZPDC8Y4Ef12RMxHRrOhbu4yyFmgRGAkrhIZMZ1fH9kgdUs40HRPmY0ZDz1GMmqUrSZWaZt3Qs QJ4y60DFT0XZHxQ6yZF8X1CBHcdGLWKUwaYt+S4kCLxCJ7tYI49M9YM47TauvJV/b+P1T0Gcd3ly cd4kHqywbZnJPUPnmlDQeEE+lhTT3Q+JT0qQd+Wxgg98IX60xMjjNEyJO0YJHnEckHmJO/bW9sTf QVMjURoxmWoBGjh+Hp1pDnAHgTnmthjUMif9VhJsJ4QaFDRWYvWkOoLhZ6PyCpqJPacxpvSsFFXp mxPndsBgKiLpmqy+Kwz2yrsMPNcHRjWggEuqogTmGg6tM6BpRDu41lIovOV1Mg4l+Tk152ZbYTCW GqD2nDKzvy2rEKrKZkMTBlUODLNMoprgArTShYDR/yuNeYvWXNZB61gCDdrqyLjVMdkLKpjTIY16 k0LAmHaQZ2cNK3Ul6B+czRx64egs2xKAmclobpOSnKLQLxuYkIPHND0yBmIzme7Ky4QlDbjaZv0y kLjybNkbQF8UqYOyLoRTlHDkfDOZy2rMID3fv8XLIEjyNdX4T7isID7ahGKaK60pZnqlbwcbx0Ap W/ed575O5lCM7YA+GihvhiLhKFM5cAtg9l9hsCnQowfoqpQsAM9oFBrAQ03C9pT4/oBOpIhSi5J0 n66WctyYSNVZITWiyNOUoZ2AVVbNKIFFQgEgnZHQK7vTYNkhyuHsaqpPKB2UdNB99HejskOSrCyO wGQp0LIR5G2Ru5FksuwpLq8jUVn5Uve8zErRgubAYluZhFQT8sZza8xi1vu6wPqLAKolxzbwQhzt 3b+VCzE/Di8loDfgcWSPS4PzA7RJaisqblayYwpn9sJMs6bgMCElLCWKEEbEikIVUh2NM81ivuq6 bJ4cyC5gUl5d9sRiqNSr4jIFhkPhBVxriVlNBd/gAlDQJsTX1oL60pkwhjL09bfWtpJoYK63ACSB yvG2rNmBbhccQ0MLdqvF2EFZbHGR4/4IyNGFzTfjEiMw5iTMdtfopLRo28LGq1Kmckgt7MUhsTRe aq9xokCT5aJOUzBZlYHsZSZKfFqLbIzpJHQscOYllDiVX4AOSgkRztq2rH7fIh7oiuB6x4+qv7gF uuSobxahqKKdzc9PcwV7FiCBcVpSKY+zTQwGZwcWc0HbFrBsb+PA9k0FMX0PEsfSlz5KQUbSWoAE W5ZN1AFVLj0F89ZkCmYgVTkSzH6AO/CFqzPcPkO2dut68B8onJTVvahOYXYXQXW+igkoqqhF17HS Z20Eq2YjSG15CnPSr9PcOhYARe0Tj9Y4gYHYww1d36iS5gXzRFhew5gxum9hGaWCLZRyGIByCTiY FQa7khRIFaX8mGtuBKjClNSPw/qqjg2mUs9EFZh2iIFSXBQV5JwaJ5VZa/TbeB1vGxrUrI/gIPP5 np7jusPQZH/CEH02WnkZx9w3J5GDcWj9Y8CXzTVPKmaEKnTcT++qqg+cBlfGVEqNLmxppPxtz35w KCSKWBWrYzDOnZxgo9c3WHQprQi0La1hHY0EeYLzGJV9Fr/+A1PNtkV0bQDvM+1cXwcyAm4pHUjb IiqPGr1ygnFfkLt/akjPQ5bIDDjHnXISCFeIZy1m+3PcVBxjMRuiZjt1ijzwTvTSAiagt5JBRbOl PGvpMn9nqk3I+V4qzhaK1WNE3oyeeiZymBBlrJLPOONjx7WBJY1p7WpOVyDmOMwMi6cGchh4JTFE HAIEOUvqSrzpkXiIu6EuJLSIL2DWK6BF8gOWltgBIADr+WWmqjR3wIE18rIZdGavqFq6s5m/IujN mBu0kloy0xeIzN0E+lQfFMBcjw8cA6h8EgDrqFGRYwSbzztWprRIAGbfH8eZ3+YYzCKO4zpfBGRB WO4Nt6xr7qD2mZs+i9dhPbg+GawC8sykXOSkEaLlQyD6aVEHCRxpEgBLJhKSBhuWm8pGCDmRrbFa 9H2iHXYxGXqiMk0gSiXSgTdFU1jJN7yW+o0AZOwMMkGlZALwWMXCCmdqwoS6FNcBQIm/MLHCqKY4 pAN8vkU3yany5/g2SBJWRU7VAma+ERMHVzqC2V1eOuEXKtF6il82VtuRRM6xLHbegYr6XCyLpXka nIAFIz5IMJUJy/VPbVFom5tqtE58BGAQKaaQLU8q25mvb4auaknNlOMlpO0zEt1S954vX0hNOAEL tiybp7G3CxatWqiI8AFK4owaohUEFpNpIeO1G0DcvyawIVoFLrGoXZMtBeuKKkzGDJJtpa4lpAhb ismlcsKrYr9z3G/4SWfj7euXhQCwgnI6nlwMUZwwBcEcfVPXUqpMmhJQYg7z1Oo1MGQSisjFLzEZ DQePpBpI2VBzJryxMpRtVinJX4xZLCgXn9LRfaKxsFikg9M01Zz7SWkpbSQSU+vWMksBanjeMkvx fSusXC9ZvrKS1Ag17jwzRyp1AjL/CWkz4UaJdt5wpiIv/BkAueKswfzxAiNGF0uT6aTd5+w9kBpQ s4kJ9pZmUURnsBoEMQpfKSlSRewLrAAOYInJrWOF3yzgq/YxuM1ngTlguTEx9Qh45w== zjG4IOUgOPsxl4rmGGIAINGo2PRslDEh49h063KnfWA9suUagCsMxtI9CTzHYFaPQ4CWGLAM5TJB YGFiFQ70DgAY5qmTxdF07qwWdxjwoEC0ZnWke433YG2uAz2Dxcf7x6R4BeIxyt8jI1KpQHo+IkUp Reaax8CqGElVK5FuILxKiniAd4Vnb5RYdhfKiHDYlwkkkEo6gkWIuReIueJIOPCmqym4qc7ddgM5 J7Om5RJaZDti2mJjJjUAYsUAChCLwSUZ2KR621i1hE6dTRma0hhszA8GQE8qNgjnExssPE8ytnW5 My9rXq2LVuQAZMdji0kDyUvLk2cKJe1iPhjrqyBPZYsYpZmNqcwqc5TCJlkuoUOLzdw5NyVYRZWI A6ySmkawXVwDD2JbvJZM0JXUPLElMRwzbFNDydCWMcyzVlL+EgZg4rVPB4bBdI7ikbGAJJycIw6N BiALCBmwoGT8PfhMwHI+NVUwypaxViLpNYGMpiDRUYydy8YLQo7tG24Ra89kPaSEAtkyeHpG3AgL Ilg2+qVnnXpJAZ6PFQ+HPO214ZZRDM47AHlIRffvSoIto+NCmpXLTbYJxziy+coi1loCU9ETURAK emNTaCYHiWddYBrRHixlifnqxVJc/1e6Ff9ES1pzAoM3Tcn3EdNPCVh7J7dXPM5BY205GCJ6cPRh cEHtkcIhS6p8JLE8a6zBGE+qzmozSKw2bAhXCVeS9BjdJwspvoHM8MJU4xJm1Zgqdj6oqEaREiBL VmBBt7qKmEVyfhtKpdvAAhA0rQgRV1ggmZPgJw/zAC6cFDowVHExw8+QBZ8FvnTQvMuQQzrUuTk6 UX9Jrh+PCREUZMJVuplMenzMlAxAFpwxPTsfqb796aYdzy8kH/2VPjAqemT4glgGgrGTufa+T9Qq htWhIrFHZeBKH1hK3VQQoCFcQAxctVIgxWqynx3o70BqWTnhPjM2onIxk0nOhVSQejNjI3r71CrG YvRMgG9WWVP65sQGrTCYa6RASlUpHlPW4g7G0BmM/ymYtqU1KIFloEB7neKUSzIKIXGPOdNiifLM LbYEXzpZgRR8U0ZHIGuiWgB8sKkcWDYmKzpI6BREdbzWpY2I3sZrXTpxBRM8S2+iiGRMMwv+LtQB 5B/QVe9BAzApla2TcujkBF4yopYEIxC6Quys9CsrEw5HmYGlXxbr8/GWYurLxwtRiYXOWlK/lWT5 a1CFshJjWMY3QUUvJVRB+KbsGJhkzAUw2+sh44E2dTweLD9DfgAqw4xdFLJp4mXVf+pSTQhWyNia RDepCcFVDm0dy9sVGBtY9wC9qIRsJVIatfVUnU3A3AEl5BYGioCcdtmWyesWwLaqTcaDUfkJ0GTQ SatE/C3g9AnvgmrsGUwVYrXwdSlfIqSs4dtTkNM6AWU3y4jnC0XVdBFYxAp3PiYktdF3GYGm5Gyw EvVcYHAKKjIUlSOkEUAWRckGK7lhICMD8bvgdin5ebRkp4GEFbpMCeR4Co6rhs4xmFGAU5TFhFeB DoOLRY8wNwurXbiDA7y0op3UMXdTAHJxMcyhbhgmaW411ZqU58mvHHNNc5RXA8glTptAdB+ULVds gNfROT+dA5dCENNJBGBUI8Kho0pXsLS+SpVMRGupyPtXwErR8iqK4+oFcq2HJhB35wB3EMRxBlvB 2XB1yBICaaO0ksw3PDIAsjK2/+51JOKFkarCkGcYSMCK3A1f6ezAyZVRlCtDWs+1d3JKCrlUJ1vI BZ2acT5ITqVAE4LnmmCnkoWCnd/6IOlR8PG7qws7AqN/iAU+R1U6QfUPB31l6u6p/Qevu3F94+al hY2ltdX59WPT1wfQNTOYhawq9Wumr7t7Y31p9b7pa2666caFhc2Vu9Y25qHta6avDS1vCP+KZMLu tI5klFPVeWdXRo3TRF8qciEARXDB9ZDQySnqh6PHRC3XEdpK/aZYlAH8dwDXAqICD39DxBe0zlTB V0drXirLiynGCfuRlcjF1OlSoU6nFN91rEUajcQ1RAuxTIB+5Pg4RDd78atl72oI1RHtcp1ElZga F2wdSpnoL6zSsDLNRBXFmkRzpZQd5NoS3oWNY96mhjpWGXdUc3QGY1Yp0CoWBlsQ0sz+U44kWqI0 nlBRCpXD1GpSuCqWYAaaYslPENKssUwEqJc9wGx0Yy8KEaixhLy3kdSx0RtshZxRE1uIC7IgaTCY Rc9ulPWogyq2taJeK3VWEV27WrjlFB7goz60qMVVA+xayolVJ9VDFy0tZCAhuwfYzQpOhYf6GNTj gOGMivFA6nAuegqRvGxjsV6MNGBNrUUlAXYp3uxYZAbDhkk5BuY6VshWkM3ESUkJoE0LLJdmRktx Drex0EQmLtdEShGIERKiLpcIBR3d+CCGjN1CNAU50nGXaAquRk63oI4+KJqS/NHNYn4f6GflpUIT 51R3bNSiW1hLmIszIh1h7Rs6Rs6kMkclrTRmHCIvTS8nCEyfHC1nnIiJsAF8sY3lwGGM1ox+pqCZ thL1EMOkmGdHYCmOw168tsDOK4VgoW2hxCAv64eFtRSbZ6UwDIyAkma7Ihl9sRYOhQJAW7qxVCaI HFhiUgEcFtvISgoN5A4IUjoeqBV9J1hoKeU3lAKqvJzfWgIIwZ0pnl+pe5hcrGGl2M0G3H+Z1+TT eYA7EMalkHqxMABFtYjh/DIOxdmLCdlKvVgAi/t6JZV8sUCRi6EwiotmhhmUYuKztUTfwWzZyyL5 sUKavUqCecStCRfasQ06lcWBbOdOjIxxqSHvWyFeRZTpC9aADXGuprImtIgaognZjKzEFTzQUm7J kU/o2h1djdCAIY7GNVdUqNNJ12KFBnNoZWQPrS/ZJKu1zvaASz+rGPyGDvFSflxzFUMTzVLgwyo6 QZyAlQqynPADgbHoL+dvQCDp+DwxDLEDNs+jb4aRA2OlAq0EdhouBUtAKamN4FJqyzvxFQ8rxF1K ACa2E+VerP+BUCUcQx192FmoBqDUWVOxHLWSNIq3nCJ2q5XJOXWdh/PA7nCWMiZKkIRQJaj0pOSc iTuRRWMc4Vi501ai7k7N4IZlecs6wy4o3lKwjZFAM0+5d6ZbGfEHTx17XBjRhQJPllLoV1nNddFp gYmFDp7j5LSnaiCDxSEPwIO3r63eGfrYCN3MzBAYpaT8h6nbj8AvWtFPd7/z1luWlkM3U9fFr2Fo 191z29zta4cW4WtjzAN/uGH6mg+sLK+Gn2bCsNaX7t3cWDwKYw/TXp/vabFw/9LyofVFnJuZvu6t qxvpN/jPxrEji/DbNWp/WJh3rC4tBKCsT97wwfnlTWr5geM3BMEQ2sEgcFSjOo9jnedxbAfmsXbv P1lc2LhpbXP1UBjaTWtbrHqa1mE8WaHpxtHOE2w8s+1TvfGtB29cPjx/UHed4tKh7BIPmBK02faZ aNX9+N2/uHTf/Rudt0iaj/ScHlo6tHF/5ylx62s7DHxUsOTG5vq9m8uLqwuLXZeEHu24IvKebZ6V 6TqZ1c2VOxY25h9c7I5a8ke2fWKra3dvLG0sbHEk0/yOYuu3Ly0PMcHGM9s+QziQXWe3vnh0c7k7 xpHm20/Cg0DYdU73zh9dvGV98f2b4U52J+g9T3XBQAMmoo8zkXYalVHqxbfn6OT4Yz7OLmzz9iyt dt2ctSOL6/Mba+ud9yU9sO2H7u61zfWFxVvX54/cv7TQmRHZYilyfmR1xLHD0uoWZKAxGbODt+bA 2sqRtaNLG10uzekYADLLW777upsXD0/fMBH2RmMeE2FvxIQ9NxH2JsLeaAt7h9fng+SyfPva0tFd Je51vnoTcW8i7m2HuNdZ8TeR9ibS3kTam0h7E2lvSJb75qXl+Y35D4YXLR60p57zHh+e7hAsRGdu boLSdhildT6r6/OHlja7c3HSfMew2m1r60fuX1teu+/YBK2dGrRWTNDaBK2NCVrrfFYnaO05h9a8 mvZqOP3vXUPoL7InJmru00ycjgaUeRSI051LH1hcPh3+TeNDodYXV9Ye7EyhwuYtD7PTyzuwxUur hxYPL60udae764tHFuc3bt7sTnizJ3ZAm7raeWbz4Ee7uTUPkk0tf2Tb5za//ND8sS1wSUOTujG/ PpQqldpv+7yOHlle6r5rC/PLC7cFSOeJpQd2wDLVebsODXHBDu3I1dLT+gajprUP/1XT4d8bwvfw /xsg9LfrNPFbd3oozbd9sh15lAyZyLtvx9F3xSfNp7Z9mgFVL8939wudP3RoaWNpK4qYzy8+sP0W ms5bdy9EOnQ3zFDrHZJW5leXVuY7qZVHhYe6d3krzDZ+1j+S729cPnL//G6R7svu9udDNy8+uMTB R50N0PlD2z65Yc4gyjEdN6qjOHNatBa3zm8ePbo0v3oTzW1c0MGCWMbu2Nzioo8fWtidZuehLs+I Y7kTVMzuRrPzKCKEzsqmccEI8+tLG/evLG50P2zjhBlOBJePB4YYkrUbGj9st+jedSoPdJ/JAzsx kc42hge28BfNJ+JGeiJb7F0+ET3SR2sLt4h8Inbcaej4mDhOiPwOjcR3yrK7uH7fIizmDhl2aQAT q/LEqtw7tee4Vblz8P7EqjyxKosMN7EqnxYRdZdalcGmPN9ZcTWxKu+QVRlpPNiVjbphKHo/sSRP LMkTS/LEkjyQTo2FgnhiSZ5YkieW5BPaikNLhw9vdk9yMC4YYTeZWzsrFHkvD6ytBnFhtfsu9T23 /fxrZ2y3uX44MEh3B8GhO9fTfGh0949uy3Bzazyz7VM7tri8vPZQ1/ktQ2qb8PvMwtryELbZ3se2 fZZD4sjTQLFGhVpMlG4TpdtE6TZRup0wKfS7SOlGxO+G+9YXF1dvCAzn4g0BmSzdt3bDg0try4sb N6wvHrphbX1+9b7OF3BctHHDEPKJSm6ikpuo5I6fE6Czun5xOfxlKE1P9sT2Y/uq88TmP7i0sjlE TsnYfsf0PWCND8LyHGf33BHHmJtJMJljdDxGR/7okcWFwDau78L4hV2letrVipnAoO121YXujIHl Rg6tPex/cJSPKQ/2zR84EgTjE5hlenCit5nobSZ6m4neZqK3WRsvvQ1raUhvw0ocVN9M9DYTvc1E bzPR20z0Ntuht9kJ3LfbnI5GQQl1N0tGEy1Uy+mYZNHY6Q0bdRXb9oTK7xB+GsdUGstLG3fOL22l Gho/jLC7s2jsymThwzqejXwKje4JGyYpNEbMOXXUU2h035HnUgqNHaKdkxRUY0U8h2V5Rp1unpCY MOq0c5J+atRo5yT91K6mneNj3h+a7E5STw0zgB16+finnprR3WuKb5G7KTuRH9gBDDnMTLqXJz62 AzN5buXMevPhw4sbG2tzi/etrg1l/Olk9dl2L4zuh/D+xa3tXdl8pPlIz+mhpUNDmBq59Ti56e3e 3By7TDG7hWAyyc4xEGXuECM5ptk51g4fPrq4AYNeXzw0lI1wXNDDboqW6IwVDnVndg== D+0Et9t9It153UM7wuzi/dltyOwOmdW4oLGh3E3HBXMdXl5bO0SetNffuzy/8MAN0wRaOzK/sLRx 7Ho1OwSbcGyYsClqve0zHmobx+Uy3QJ7NkZ3afezBLvTdW24yzPinM6JH8LRt7MdvX/+0NpDB3Yj rhtHl4JJgsKRxwaTBIXjHQe/ixMUPnT/EBHC4xrkP8lPuOsjsmxnBDRmEVnD1bAZAx5rFEKyJnmB JhzfhB2a8Ayngucb67xAQ2c/eo7lBZrwS+PGL03YpVM/hkkE+yjyS7vTDDCJYJ8+MSvARGU+iWDf 1UF4u9JRchLBPonCGxVJdtSj8CYR7BPaOaGd27Jro042JwHsE9I5UhMZcdI5CWA/sbUeFap7Mv6E Q2LyHdrQYSLZR2VXTjtVHYO9OH0DGKODcHh9fmFjfvn2taXuojw93PE4yJtG1j64urlyR1iCB4fI 8p4/su0zW127e2NpY2ELs1YegAKt3760PMQEG89s+wzfvrl+7+by4mr3FO/jIqqdkD59tOWZWdXZ Hnvv/NHFW9YX378ZtrZ7dGHPUztGWhqnclzQ+8p86KpzHpBxQOy3hkePbu1zNH64YXisN+qoQU8r /qftW4R0ne4Jl2LZMUFveW39NrmA44IxdnP44S4kv9ubrmSHbtKYpvi4Y9fH826LWme788Htmlwf M50586GTfewQIhi79Big7IVLAszdbrv8u9OLb2j5YtTx2YlToYkr33ahhs6hcuOCG04E7436RdKz 3WOjJsz2Tpy4ew4vrt+ytL7rVEOnnyaNjz15Y/7e7uswDgpNM93ZVIVzf+dwarDGMzuXimtzdeGu McImu+6UzZbTavq5cc5unZyzHTxn+rmCzm7aKRcTFHYgIPnt6/OrRw93KCQxOucdxk5a+N3Ip+1O jciJcNajLsudYETWRB9y+rYEPeduXF4+7UhhfGSdE8OWE1/NYQawQy8f/wpQUIJnPSCZwIoc3ML1 vid3xVaHcswy0y2u0xnedYR/V4Ytdz6q6/OHlja7CybSfOfQ6dr6kfvXltfuOzZBaacApRUTlDZB aeOB0jof1QlKe86htBm/v+vpGPEynW5SpnMcy3TesXLv+vyti8vzG939Tka2SucQZ3BsqnQOUf52 11fp3HUOuoeWwsXbxZzcrvI81rPd/cBOlJMb1Qs1LklNh2JJRwWt7TrX492L1ibIbHSRWXdP1gky O427MGRNo9HHZrvGQ3qI0KkRry7c/ZCNy10fu9Cp3ZqZpnMQwSQxTf8EdzYxze6L0xkCz4047VHd +c1TlIdmZA/fuJCkscyoc293B4IJDhjdKzLyKXW7n7Ohr/uoetx0CHHLWYEdqiF3Y2cr5IH751dX F5fvXlxeXBhG/dT/4LZP8q7ORuMTnWT/gztGh25eOnpkeX5hcWVxdeO2+SNjRIx2X3q3ezurEMaG vHZH5CNOXlPOtum+r7rxteuMTzil28ieynHhvcczOd29nZUnY4Mdup+sEccO3cvOnorkGCN78E4D AhiV23d4fXHxg511sYeXtorlarqpLe/Atq6urXaez/zCwubK5tZ252xW+SPbb0lefmj+2Ba0tYEv N+bXh0KY1H7b57W8tLo437ncehASF25b28qZPZtYemD7LQOdd+vQVvXmc/vZ5o4UQ+2M5LMbJq+/ HUff9ZI1n9r2ma4vovDYeZKHDi1tLD04xPziA9vP8Hc+kPcu3jcEf8KtR9f0trHWXU5eG2Ve6/D6 2kp3IoyNd0gkmV9dWpnvFLB+WuShMc16tjBxhhlVeWim2i3OMN0P2bhoPybOMCOi7p2UaRpfb5iF XecNMwSiG3Hio7a/LNPInr5xIUpj6Q6zsOvcYXYPEhjiioy8O0z3czbq7jCdxYKJO8z0xB1mB+jQ xB2mZX92SD5a2HXuMEMg8hEnr1v4wOxid5jup3JceO/xdIdZ2HXuMEOcrBHHDrvaHab7wRsXBHCq 7D/j480zxB4Oe9V2aA+HSSg8KrswhGPZZBdO2y6cvqwbY7AJp28AO/TyXZC10XRPyjbiaRuHmMlo p22UXIZ3H95cmd+YPzicUXwUNZG7Mp3hEHPa9ekM713eyk90/CTEXZj3r7PMOykruu1XaC1WT95t F2kY5LBrbtCh7tzSoZ1gl05fAq0duvZj52l39Mjiwh2bW9zfyW3fydvevQz35vrh+YXFu4czpDce GmG9cTiom8vz6wfWVo9uzK92P4P9D46w26cM9s0foJqXQ88yPbgDkWpBBgpjnFkA69L1D92/1D1n 7dGNY8OcWWo9TrLJjFeq8ykYcR2HVkPMZbS1HDNmmLl8sPNcPriDPMida0urG3Osv9gRbejdjIzm GCNM+KGd5od2Z6neITdr1Bm9E9L1TGr0nk6OZuPO+aWtuLDxwwbz60sb968sbnSvCTdOWGFXFr0b GtWNuod7Z8Hvge4zeWAnJtKZe3xgC21XPhE30hPZYu/yieiRPlpbOOfmE7HjTjvHR1Ye3gixG/1U RmU3hmWCduNeTHyGRs5n6DlYVvR0+OCMD1WYeHeMhaDSOQh34t2xg4zV+uKhoU7duFyo3WT3nXh5 7F4vj/EhuyeOM3ajIDAqu7I9Os4x2JCJZDZyktmM9vt3i6dD95mMtp/Dc1FaHi5j1khGrNhJxMok YmXMRLBdqNMoJjqNkeWEJzqNcbpJ3ZNEj7hO4/Rlu57oNEYYZ+xGEXpUdmWi05joNEZVpxGEyrsP ry3Mb2wGwXK4dHC7zAw7id6e3JkTuDPlc/nOdJ785M48x+/Mc0tPe/dGOLQLWxQf292oYVLpZlLp pg2lTyrdTIpctM1EzU4K3Zy+XLujQhXWF1fWtqqZ2qD9I196emn10OLhpdUhUkKsLx5ZnN+4eYjS v9kTO0AVJqW1I02YlNaG8UxKa58a81d3MpZdMXn/7Tj8rres+dS2T3U319ae7awEGfVq1EOwYJN6 1B2VR2NZDHB3JlUZpozeaMtKk3wqp/HKjr+udbfknN8tGeefW7pvoHhrgeJ9cP7gFlkoxsFRWe1C R+Uh5rTrHZU3cv5s1xgpOjvxTWwU/RPcWRsFHMjdZqXYgSr2O8S8TsS9tVER94a5SBOBbyLwTQS+ icA3EfhOTuAbrpzsROAbvTnteoFvt/qldXZfn4h8E5FvO0S+zgdyIvFNJL6JxDeR+EZU4tt/41u1 Ovjm1UNR8gOQB8jB29dW7wxdYHGoGQLftHjf0mr+w9TtR7gP/OnuYyuBWw6M8/r8vYtHF9amZ6aP Lq2sLIahLKy9ZkpN3xj+veehqc2p126GWd4c/nbHlJr1zqu6mlazpipM6cKXWpeFK8MXBQAfvnij fVHDl9J4B1+MsrUx0/fMh170tMJ/7jkW/vKd4cs/CaCHpt30bdPvfo+aPgSvvWtqplLWz9alNtOV 8fWsL6yfXkFwMattweDCFNMEs8bmTQnodO0I6HQ5vQCPOz2rVFkB1ASo1tDUVbNKKxuAzs1WpQVY ocNkK2gYfq2Uruj5IjTwSgO4ni0LVWLbMry/KKFTFX6uHABLNVuE5vymOszkAHZQzdZVDe/yfraq Qr/UQWkRWKhZXVoBhmF7ANpZ7+uCR9AA82RhBNYh0IcNMH76XVMNcKlnnVE1tg3rVlewWmVYoqLG KZR2tq5xtcswL6cMvawMcy+xg8qGttRBVc56XSPQzWrncQS1D2uIHVR6NsyloOki2OXgViCOtg6j LUpYxiocHlXBKoRtmTW0NGU5W7vCIjCsgSlxtDaMgF+mtZu1ykMHpZ/VVQED0ya8QtMahPWyhUZg EdbAwe6G/QiHlHYXwKWyWsBmWmA4W4Cl50sdn7fh7ByQ5w0uQk9bU/m+Tq3ve781s1rLvLw12NbW szocluasXBHOsXG9KxDOn67DLjVWy4e2BW1iWldfhWNU+GwPcATh+NThfjX2VpcunD+8c+kU6HBO nMV1wRPjNI2gB6xMS9sAhA3XobfSmrpxEsMEZ8NJMI0zmwHlfOPLAKzx4stdmEOwD7ur68Z10mE+ zlnXuHi6MrNwP3suKfSrFS55utC6CjtV4TKmq69rTX010YRRPqxulSOUcCzCbHBQCfMYXcKtKZtI CqDhiLsGPgOgIbwheA9AztdZM3m6MJ6hSl5TmqIgmLVWYMprgoUzQkcY+ywQ7/lwHV24TXMRjAcr gE2YsrzfKcfAcMsEqGpDwLDqBY/KBnRI6Dict6rGCYRlChsK43JmNjTBva7NrCpxT1w4jHBs8GSG 5a893q1w9kMrPNphp31dFbT8uqjosIQ9CXtJu6fgFtHJdHIPkTTgBsDd0L6GDTBhy6wr8HKFDkpc /3BPXRUODd1OP1uWuDQBXIfB4O0ENG/gZaYOZ5TOWkIP4UZjB4Qe4LSVRbMtbJc3Pb3qQH18qXtG ABgy3ArfGC3g6FKZojEvFe6Or4zvWQMgCJW1vrFeQNNcibczrSzQPwtkvLkLCh+zzR0L1D3MS1WN vQX6qwyNIDsHSNaJ0KQzk9P6eLoQWBiXncQD3AFvo5zbOQEr1zjiAKuUF75A6Z5XxUtzODAdN08R UuQNqoDFCau2guBArwq8aEgPCakG1qdG1BOwcs1oyoXl1bg/pQm0rOKTFxbNK0Q9AayVIQxez9YK 8QHsVakt4URvZ6vCISuADRwja6FB4WTR0Q+7ZnVdEe4LjI5lBB5mX1penkDiCP+GCVQELBCLwC1R s2VV4C2xYayOSVgFA0dMG5oWTAACorZWcEpV1jUDA8uHWNaENfVMghBcuQw81w5e7gdXNF2gCwqH BuyWtYlaEDSwVtbTKoa77lVhaRvC8cbnS2BQELWF/dJa8f0Ni88IHDBEQUsT6IkzeFXDzEtF9Kr/ HMAhAdYHiCLO2QZ0pMLQkCkNKMvUFd93VeHIVPhGIzNV2BJD9zrQI428VwDWRbg+ODJdyLkJiMGH WTPj4jQSIRuGC/wtAJ3MwTpAPD5ilrLAGduC0DpzPg6PP7AQjBxNWLsKaXnAcnXg1XkEgN+1I3wR mHx8mQ50rkQWNmCD2EG4aI42JyyztyWPAOgyHcdAWMIQuK3VtLuBxVZOOlBVzbwPohDivcJ59IYv CSMGWBjDHIIFnhHRswqzsd7SQaiBbSDuTwlnHfotmOoHqms9HdJCmK9AisLm1nRznK2YwARwVWG3 gPsqX3Lb2pZy8lVR9AADFwUIQToQsAtclOf313QKPHAK3GlgKsqCOQlXeT6fCpYDyWnAw3ijAehF tnFALGkAKhxDg8Q0AJ0veBMDr6xqYjsCB2QQ4WmlBXc4oEoMCvKbUM1ALPhxBYwD0wxkhqitqlDg CViwKEp5va8YhyJbQM8HcCWo1TGeDECjqsiO1JUAbcHMTGKfVcA4FVKysAMmcBKEOgK4ciguwMZY zxJAoFs1wxRxcwoITc3AgABkXUuRAAqQ/jQ3Da81xCKWgSzI8wWx/2EpAnsclzUcrA== kgiRcPXheuua2BydhBUD+84bW9iqjB1oJ0KjAvxBwLLysgl8XMPCIAVHoCoNn6xwCHzgegEcKEw4 UDzasHwV98pIB75VwmW5imegAZUgkxJOZsBWFfMY4RoyS+cs8bMZMFx+r+PzDA0Lg2iPgKVFUboA saUw0/ImkU6zAYT1JDYrXMNwayoebGA1LaEM4ehws3BWgOVhqnI0mCEqAYXGu6FZigvHSLBDOFsO 17UAJquSDsJVZ5yDvDsyDXXYJYV0MYxAG9yYwKQGvsAxeqhYZK1qwEm8AiiqIDcDYFPqDAzAwIYp IqEBETnD4i1QVuK9vCfegZg3V6AgGKiwq0vNwnjlabvCOTbEPaogIwVsyeihIC5CBXnKaHzeWeLz WqkUkS9gDpCaNckXcMZG43VMnQARDeKKabwOBLmATXtGBs/XvZPQgavRqme6OixzkK+tLI3mzSkA Sdh8GeeEHSvwbbgTdOyBQbJpzwrhpTxypbC9vmBxGsEijovEFoDhXXI+KtKUAIsWrpyXo2RKFrKD HFA3Dx3gZiXAdEDDygV67vgwM7UOPHJZmrp57AOQtR+NKxLIcVH7nusUgKgGaFy8BMzvaAZN1xnf hYxMdvGDTGptIUgCpFvqoCA0lOMTQDckCWWIB37WZR+SApTnrG4iNA/8U100UV8AMn+GaNIzmgyj QbrfQKlAIZ0InoJ8w1DDMhe9iBpmYHC0GVIHoPamgf3heUvoKCcUAWyLQggNE5UA9JUwQUx9gJLy aWFCdYBXIGAxkduBrM0x2BirmyQQgK72TWIJwFL47ERYPTAxiQYTHxaAgR8xTWodgDrtQaTsYT1L Y0zOA4SHrK17eIXwfqtU1ctXQF+kj8h4EPga8YNwK+G8ea/4DOGgqAPQCnsnXBAdDQstikLYJWKQ M2DOWmXgxIYFoHdedoZ5q/CqgCKqXuYO9L4lbW3kA8NgWSOUMYzhcpja173MpQ24hm5nxogGZr8o 8RhlLCtw+6T7abK3FWGQJitcigyYM81l4IIIQeUMtg2SkicSlphxlJFr1jwL2x5aKocErMHik2gC 083EAVBfFAUrRaLgEPCuq1CayIUM6EDjJmQCSXisMLZHdAnI0GpcxIaY40Ghh4uYiUQwG2uaslM/ nWICZsGqQNJLWA4btmyF18aQTAIYjdFUGKRnnWF4ijrO9LascSThJczHetdsqkhr0egTNDie9Cf8 ftpcC1PnFQ+IqWJRrSRCA+sNZKAxAFjvyrGGIKxHaOB72oICgBBy6rV/BVg0BTUE8Z4i9KJoGshw bbCTJCCDCaAkjISiNM4tA7LUTRojuG/EKGfiPFg3WCELF5JuNLxLFaJmKFxJHIohNUJTzwCMj+A0 UUkA36K82HZYdwEsliY7Cuo5lKjCwuoS+kGVCDatQaND25h0Jwo06Zb1yahnOcDCSuVKvruobySG stDIcIj+5p1TxNYjJsl1PQGNi6IkKoVgUIXCSaHewLEVpYIbXzV1DEGoCgPwbARhbUTLJsLuvvYd YoUjvVrAb0z7EKeJXYxPG+i8QfQgYCDaOmtLwMAVV7zKViXLmC9FFV6DSoTUfb5EQhvQPaNYJfwJ Ivlwz3lHCtR5s/gYyDCdNGAbUPaCW0RXHs5J4A8sHQnEhXLU2MwQjoSFp8heZonMAakn6wf0Wle2 pqMaOZBeME0XgEoxD6aAgRDTGIPhhogqVYE+GvcfFsmSIQ+sH5Vsqjc1m8YiY1JZuhi808QshLMc JB46lkF6K3HHwk7XIBmIaYxVtAJuBYpprLY4sABGtSqdbCSFeFicyIR1jUirBHLBSn0wjFWkFCx9 VHIZNF2gGiWsliO2JBCfcNENXSElNgUEk+IZwECTBIhYHoBZB1XswNmaERzqdYv+trXc16xXkczz EQCtrZyW0RL9tGDKJJ1RmhcwbEVd9a6BB/0SSptxtQBLWdrCtKoeDLSmznaA9Kqgh9fNnQW9akDz vnEGQLGqFN4vPC/h3pNetAkmFN8PJFUnGDLRIJ3OIRilAqX2jRObAeV0iwHLh7OR3YQ5BodLbxuX CWwobLlN1w41vjWqYvIriq8ryYgVr7MGDO2JRY8XH6w4YZN6kQRYfGpiQhJCAdOY2MQj6gE7Urg1 ugdNoXWLpJSE0gBYFVrs54T8jA530RQua0kdBMRKZwbAxMkBMBrXKufl+cSMI9d9gJ8PYi3LWVUR UPScgA0eLwCT7IBA9jYoyUZKg61L4mVLssTTuILQXiJB8lpEPViuikR+QxY8WllUKiDj7SJ7V4Hc iuvlSpFTwI5J3F1A5Kham0ENP6toQA5zsrXhLJsauUYgELQJcENK0m8YH60JxDdHi1Up/GU4PQ4x dbjCIr5Z4FVRU2lA10L6+YQjwq3GDg4wF2Vr75ttYReM6uk1HBg2iecjACwZOBHXGC1qSMrGrIAl CTxY3bMCSGpqVB+m1QKqplzh8mUF21joyvbsABDLkuTXtFvKgb69Mo1tRRpe1a7nCCCYKE06Lhm9 TwcLgaRtl0N4gDtghCpHdk7A8STz8UanGaIJ6R60MBe5dayW/QHbEQhJYh0rLFLzsNQihoEEX5Al rEh2VeD6K1bxo9lcxOZAeSsCF6z58KgIMsyfiZomSIpBvDXEuDpSsfs6qvOBdNAlARa2KlnJAp2L cawmgzXqmcjeHA5+4XDbw2kX2RKcIrxjrrUqy2gcQ8RLNk0mAhXopmrulF1cAIMHedHS+1GOPTAV wVUGnmsHL/eD2TQcgIGw4es8mUWFZDA4rExV0CJWwNo6NlKGk0WKuUqMgeEbGFjJOGYFiYOekt0j wBukNuz4Ifb5/mOQjGOBR4A5g7iuq2gbq0ipEi47GuuJo/Y0MJA1k1kEaRLe/8Cbi12mlFMTZB8l prFwaRz1aW0hdiWeQZCKkUGNWIX0hRY1mqV0QApxYCEYMQaJj7WIgOFAoUnvR8xeEbao+dCAGS3a JGIHRTQ0VCRriVeQOK9UJBXQaCuyw4EHkKZlCcDCS0vEIAssnopOPCAWRwocsBkyjwDSJ1tbavAF 0MQjoGXpAOvvA2fN3Je4EAHVNZ7V78J9gRHMiXIyMw86wHNsmcHTTkAfODE++Ky/T8BwThT7keVQ sLdW8i5Xkl7MAOalTsO4HbJfoL2txbQUlqNEQgoKLFWxsIYaSWQlogknMGd1wRqsWvT0wCojz0bK KmvFWmNKQe3GkM5XhfnRxQciEM3qAaxrYXxEfROAKOUi5kBtG40g4FrhW4AnFONYSfo+wKxshAqw UtQOyhCbB4KpcizwJAYarT20/iWoKuYY6MJB4G1xlcgAhTVsxwSUycDSlwwEM55Yxth7CdwddZQh qpKERi3OAvA4kTZUmHobJ8VWmcA1C1evwBZN/I3JZRVHNxZc1JJpDpEzG8yQYFCv1tvItRQCrNlJ pUIVzQKbhbSu2YjmWD8OEyCmBToVjFOTLEAqyEKU1uG4cbfekb8m3QxXFMzL1c72AAuQEp1YthJY I9IjmCW/kyAqF1aLua2uHOsxGgMQC1IRVYBaCY8JPEm0eDJFK9kUIOdCvAMV+WPQ1ShJigM9jYmW WFAYEhIodKYIUa5kIQy5dzpa4Dmn2J6BKnaSTjUfLUc2LlLQlLUIFXX0VUKwYAeRpQNDWpcudzoT 01hVCwn2ytfMuClS3IDtgtTmIIyLV284x5YJM9jGSpJlw1Vm4wl0UFaWVWWeRMZ+IpVMY+w0lhEv 9BmrXLMLsIyVbD6PLwNJTjMuyAYGzIXvnQSYxgpa2zRdMI2FsxqXxttoGitZ8uZlnGNezJGvAe4E HXzgjlTcMxKD0NhiRHQ3cMAWWBxmcUG2nTixMor5RZBMo3EMfpPjxDpecP4TLww5eGAqLKNrRjyk LuAJMvvheSZ6DUpihwQsO/lgQCD9R+OWgLNZYXtuFBi36lo3rl4Gy29pAmc3Gt9F3HK6+2GorHQF PFEKAUSLjzZNnAI4x7mqiX3gd5ZwM0QFkjH7diSchs6lRd3EfkBf2FcLjlTtkgmHXIwyrAq+faqy TfwLVkvr+3C1Sy7PEa273OFC8D88r0rdQyoCtLZWN6kKnH82tiT6A3KSlvcjrRIuvyx0TtfEOFbW cr6FBgYg3MgGsQSYFX/+RFdBY8Bax4IU9jNoI7alaB2FWoeWZdqCSNkDWCyUiQsATo9M+Bm/ACMo KnFMjbwF9Fa6qsmH4NeiaDAs4cCz8xfum6uTaaq2Vtigku6BEp9tZJhI958BM94qQTM2DMxg2sjO MG8VgOKenjN3YF0go2HGCIInAGmFMpYRvJkLEvVy9jIw1iXdzowVRZtMqZtMK5iDyDm4yeDCndC9 zHAlEmDONoevXvex2NbB1vWw4yjMluwHLIw7mNE0krAGkw/qRW+YLMQOtHif5aJDLY7zDTHDRufC TCSx0SEpii4OvMxwCRtCDigHyJ00E4jg/ijVIzr1ESoxjYXL7ohxdUSKxDRWabkK4kEAcQaF48us uONMc8tKR5JewjIpYSdj2+isl/UaJK1Am+tsBLS54HlANNSQAWcGJR1WKON6F745AljvwJfxCAKB qgvXbBsW1JEfb9Zr/xqIcQy1t+zBCzIv2cbY5z8Xj9EGQAgJBWm0a2dAEboPsBXMlqRmzcR5DP1h paySGw1Gj8KKszy6mZGnj9G0jknNALaxhNNYIwGMS2HkmrPuApisgiwpqOZwogjz4ODHNxpDYpij I0Nr0p2Ayx4ZrFjLQiyhF89TdJklSzGw2lXJQJQa3skcPKKyXNEDtrHakrI+qoSQeSyqqDco62gc Y4Nm0jGoCh3W0GQStRH9m8i2sXdM7T943Y3rG414yP0Hbwj/TtXT17xm+p7/Lgufo8C3llC4t64e bka+6ekbj3DcWxVWIdwB+ELxbyX83adotmFC28CvtlDiJoguoys94DA/zxcFHFxQVxnIU1SgavE0 FWA00BMlEPAcowDrtW52ETAma3Gyl2VAHphgVwYDOY5hNhkYtGW6mG68rDDRmpAGJkAxu/M0BIz9 pilnXaTFyV6WAXlgB9rXdw5OyiZsLuwo/aPxn7BzhGIKZ4RthEO4wmAV3a/i4gM1EtdRVsii1aqW 2xnjgED1Y0yhe9qG2+mjtwGzPAFLOrJdAnsT6VLAqcy0AMevSAEPKi2OWgIWk/ijDBg4c5A0pQMB F0QJGFOTXg+M76TqDzBYcOI4yqrWCXuT+BDA4rxkYOfRB857kuYJWJOOyIOMVcoM4DHNEraBfucY HPhZS2DlC9F/1ezmg96xEivH9AO8C0th6U1BAiSCTUkMKQArEucNsWgMJM7XG9KDCdNhSR4W8NxU Y3vhdexHB9477O3ryMxGQPZBDsDAaMiKBQnDSNvoUhOku0q8IdH9nYCBk+dlRL5JZuY8aZmBzwxM /5ycpaIWTlfVccIBLfNO+lrCjxRr2woIlCzjTgS0y+BSidK0qC0bElSmhoxA60UEaQ== gNljAtSYqmYNkJYbAqbISpy4jDDK2QQqUIZx06ISmDiBoV1YxBoEysKKliBrG3bROL4LJauoTaQp vqIIBNlxOeIlecUwS+q1eHdrW/YBcbsWhMciI7SAlwVMPlBwHz0tIgaGlRKdJ3xTH55h7g2m4SvW L+LtXRHVsXVlBp5rgsFj0Jt4crkPhi639zx3SsnmHev3za8u3bc+v7IyPz0zfcv64sLC0nxvCPnp IKN4zCXaClVUK00wWOdqljMNxCxY1hCVvqS9N2QmRCIopivQtlMUMUj14FN3QDqwIv2Jj5iPwoQm Mxy9P5xSNjjg7REXL8tayaxtHQfgY7AryCI1mRfzAVglshM4K3t2MgOpWGg7Ctt8UcjkAitQRA8M BspqzbUvIhyP1pNxzQy4CIUzXWRJC2666UaonXPX2kYskMln6NQdsTs3l4/Or24shnOwsrZ5dHH6 yPriyuZGk1vDE4ZZB7qeH1WRqx2J0xVzYQkK9lxNB0UX4owA9lxtxZkQQ6wTcIGlYbYCZW1BH6Dr stlrAvIASByP0CDqoRNuo9OybJw0GoAASaUcB5u1TdPKeu1bgYWpm+6NDNJN9wcW+Jp3rEIuikPT 4YYfWlpc3Zg26jXTM6DAADkf/VemHTiqBtIfTmhpC77B9N+b7pvSgbxOQ/wvuCLI/2cQysieDPxg WAxXavqmFbQ533TTZJNOapNgbwKtAbVa6L5Ae2HYnFkFisyePQobiKI3eN0UPv1/Rn6gmVSUnwGo aqBe2U6BtAQ6Ae413D1MQ3LL0vLi9VlGkrvmj0LmknDzQ5tbp94dhzGDejT2ZS6BqQndv2c6UKvw J1zY+7duCz9Se/pTTVvg8Et8LkCm1dT+/TiKm+c35q+fBoF/6p63nvvsMJ8r9/5Axz9DdXvK3346 RnJibz9VIzn5t5/kSE7tAE5gGKdjAEMN4/QNoOMwTvcAthzG9gzgOMPYzgEMGsaOj2H7B9A/jB0f w04NIB/Gjo9hZwcw+TP5M/kz+TP5M/kzXn92nHSOCP+w48PY8THsOGs9gvLF9g+jdQDbOYzjDGB7 hrHlAE73MDoO4PQNY6gBnI5hnMAATuFITubtp2Qkp2oAJzCSobp9XvOzZ88Z8bNnz/OO89mz96wL 9r2UP/suOGvvwNZ79p69b/8b3nbHnfi5421v2L/v7PbW0PKqm5c+9Oiv8OfRDy3dfFVr6zPOgpYf /q3P/dVj/Pmrz/3Wh6H1WWf0NN17/uUHQsvPf+Ub33qGP9/6xlc+H1ofuPz8vT1Nr/nuD/0mtPx2 WqJvQ+vf/NB3X9NovPf817z3Jz/9WKMlt37s0z/53tdkjc84/5r3/vRnn+htSa2f+OxPv/ea82XM e866/Lt/8rNfe6Z9s5752md/8rsvP4tXY+++Ax/69BMDmobGT3z6Qwf20Sj2nH3V0m8+9q3Bx+Bb j/3m0lVn76Fu3/zhz3+jZaxxzN/4/IffjB1jt185Treh469wx1t2mzrec9b+rbqljveftWfPBW/4 0OeO3y10/LkPveGCPWfse9ujf7VFt6Hjv3r0bfvOOOOld370sYFrK59nHvvonS+Ftr/Spe2v7P62 3ddsiL0YZo87nZ1nvvo7K1eHQ9nhTD779F//0t0v39vprD/ztT/6oTe88IxOd+ibX/rIuy/Dm9zh bv7W6gxjiA53/uaX7h0elwyDowbjvmef+WYv7huEU595+mtf+ve9OHUArv7qX//RR1b7cHU7Dfid X/qhd8+8tI8GtNKWlbtef9n5gylRg2Zd/fIXtnQaWzdo4dl7zzge6Twujd2//82rh8CkPHXPW2JN DjZ0395wI85dm9o8C1Z23rNgx30rOrg2OPI/gXxZahac5yGkS09DnIu30zO0yOF/uiggI5Qr6vAV k6N7q8HZYQbyVIE/8gz440FAS/wSfyHXRkupgysKfEjuDu+I7ksDXJyumYGcr9rXtpOvFDguoaND dFwK/zs0VYiP1MH249IDP5EDg12c1JHBHk7u0GAXJ3Vs9h9cPdmNiMWGwkM3vnX6xs2NtWm6xksf zEoE4Z5NX3PjobV7Fw/e+Nb64B33Hl1cf3Dx0MG3LR47SI2Oco/5WKavu31t467FhbX1Q+E0w89b ndTr7lqcX75tPvT4gdB6+poDN771Vr4Ebz+8tr5CP72mf0RhFe7eOLa8eDC9Pztr4U7duLq2Oq2r Eg/XJv7D7nNNz/hejGV0DNbjpJErPWBH1VrEx9xx8laJkgVn8LowGVA8e4u6tD1tweGdYs6zXhOQ R7Aw1QSXeXZF6bWSTLHZAAgmTvIy1tQyTSrrsm8BwH93AA647rb5ow/gNzV93U1ra8vT17x19cHF 9Y3FQ7QdEXzz0tH5e5cFfM8bwn828fdAOfYfzD2pDvb5UoXTyt5U+w82fKSsjj5SWnykwn+0In+q Dq3xR3yC/ltlXmPsUHWw4VKlrQWPquNQUvz88/jtE08HzuLp38Pv/4kZjd+Bv/wN/+Vv81/+E7b7 fXjmW5847htgXEKVw4K+RRYuUeb9B29v3zUtmxJu0vQtmx/84LFp2MfsAu0/CBse/VcP3vM6vJ6h K2oUe5hbWn2gb68PLC8dORJwRLq34cb2vIGW2JAj3XGcWHvIxOk7hxka2IXn8WXx29Vvets9t934 Wvx+5Z3L3/c/fP/anVfCX677nu/9n/7XH/r+gwb+csWdK9/333/f6nftx3avfeN3zn3nm66enMeW 89jjzd/D1GjCbwMIS+8PJ0BaqIuTIi7UxUmQF+rgZAjMQN7m1HMsOYNwPJRyEh78q4FzmV9ebPju EwMSDkOvE/FxztrQ/sUQdO8lXaaGpGvvmXbltKta/Ivb2qJ/Mban/27lX1yU5fD+xfHzJv+Dx/9z Yt2ewgFsz6hObBinfEgnP4xTNaRTO5ITHs/pGMaJDel0j6T7eLZnJB3Hs52DOf54tnkkxxnM9o/k OOPZqcH0j2cHRzJqg8nHs+MjGc3B7Pgw8vHs+Bgmg5kMZvJn8ue5+WekbtNkMOMymBEZzwgyVyMy ntEZzCjLTTs4mP6R7NR4Bo1k1AazzeM5/ki2czxdRrI94+k+ktM9pBMYyekYzwkP49QO6ZQM4+SH dMqHcQKjOt1j2IZPv/U5ui8ePz6Am+4986xzzoXPOWeduYVb5BlnnnXuBS+95LIr9+/ff+Vll+yb OvvMgQ+Exue95JIrrq3e8vZ3vft73v2ut7+les2l+84b8MCevefsu9zd+s5Dmw//6E//7M/+7E// 6MNH3/ud/vJ957R4f+454wVTl+jbV/7Fjz36737v05/7whe+8LlP/96v/9TDK7frS6Ze0PsCdBR9 48LDv/jxz3zxLx57/Ml/+Id/ePLxx/78s7/7iw8vvLEv0GHP3nMv0ndu/vh/+PzfPP4P3/xH8nH9 1j9+44m/+fx/+PHNO/VF5zban3H2ReXBhz/6yb984qlvPfNtcZ/99jPfeuqJv/zkRx9+X3VJ3n7P C/bpg//Lb3/hK1/vj0n4+le+8LFHFquLzj4jDWVq/50P//afPf7UM30+v99+5qknvvzxR96n970g +gefc8kbNz/6hcefbnVq/vbTX/vyxx6+c/8UD2fPmfvMwo9/8itPDXCB/vbTT3zhoxtvvJiHs/e8 K+54+D/+5dcH+jV/+6nHPvlj89e9+PnoMP2CC8u1X/x8q68yf575+l/89j+/9ZXY/RnnXfFd/+r3 /3bQUGg4X/3MT77nNVN7ceR+5Zf+9MnjO3p//cu/frTad+ae5+0565Jbf/Djf3O8zkP3//jY7z38 lkvO2hNW8bK3/8gfPb5VaMPjn/7Rd1x+zhnPO+PcK7/7pz735BYu9c88+fmfec9V50Hz/d/zM1/4 h62af/1L//vhmQv2YvOf3bL5t7/5F7+xCXPt2Pwf//Z3f/CWi8/q2vzpv/t//uXcpWefpt7zsQ+1 MsOt+3C7OuSZGfJEDnne4TZVR375i8frPr9NcFfvOm73jbsql3UA3ujDBIQKPvblrw3AM996soFn YHH0+x75+JefaMFioe8n/+J3G1gMMGq1+MjHWnHkU49/+Xd/5HCd4UjA15dU74sYOLYNGPjJv/38 xx45fH0DA+f4/YlvMHpH/P63f/r7v/jw++pLzuulB0w9fvezf07Eg6jHJ375X63drnqoQUabHv6p XyfSxLRp9bvKy1vD5JDy+e9871EifEL5rrhwAKkEurrv0tcQWU109QUDo/vCA2dP7SOivSXVpgci S7A1T0BP7OkWkdjpc/z4ioHRFaqKSZA5c/ZKEww5BA1liNaQKLZi13NnYzU3qTjFQIlucL63LRQE odzXWa8JKCOQ1JEMhlIOnHQ29QqFscu6bo5AgBLgwaPN2qZ5Zb32rwEGWLRFVXjDURUVLONMHZZz Viufu1hiokjM+Kmw1C5Uly8gCzN8gSy26ScsF8CvxkLJhZ2+Z6X34XrLhy3Uo4O86jct5A9bqAJV uS3fDLUpDKapHPrNkLwXsyXftJCCPhSmLh7o0djJh17VsVZ9TTW0VppgB9W5HBXTK6UGPVaAt1XP uWSglF8tqQBk1tZBJnZdN3tNQBnBwlQDDBWheD1Sr2UplXXzc8lAKdTIo83apnllvfavASyynqxU p5XaOkRKl3SZdVnC/7Egw0wFxQxKiJPSkFy9516rWa8s5m+HnNQW6ivEL+k38npVBddNr3y4hHkS WBW7pS0MqMooLUmnocrECoN1XXIpEmO1FLXgSrtQ70cKBhWUqJ2AsaiANVBzjsG6omzccGNLqjik KBpJgJXkt46FBzMw1PCuJPF2pbBYMGwL+Jw3RlBCzndJJQ+D9bzbUr4Ap4XJ+EOnqqjcdOsSHBiI gwtM2gvJwwkFQ40b05erN/zmoCRTHVYIaklUqhIcRpVBXVxdeHdAdQH1QpwRIC+oNnH8h6qCaogG xBceslCAGupXbfEmD1WJMESu+5ug5gwUHUso9rTG0ZyiMIY6BibUEpgQqHn4f2sYQ0tr+JGeoP9u GcZgne4SxjD48+ZD73/wA8fC5wObRw69OcEPHPmJ3/q/P/Xpz/zxH3/m05/6/X//E+tv4R9uefg3 v/j3T7E09cxTX/2v//GR91wHP7h/+ht/8XRD0vibj//L2/CR//kTf9fkz5/8o3/9Tnzm2G/8eeOZ b/23j//Q2/A9t/6Pv/Wlr7Ig8O1vfeP/++LH/rfvUTK2f/1/feKTn/qj8PnUf/7Ev/vx9VvSuG9e OLL5EM9n4dYTX5exD8u4o4lxjxuaoYFVCZjHnAzmCXc0j+6AkpQD2aGW0Gc9Ie0nS9prJu1QKwJI O77BBRoVKIuahfoqven3Z70LM5qBOtoOM+/HL/wLlS8qsOZFwMkainkmqj4GOBmKUxKWhTKsnDo+ IFPdipPbWmNwBz5B/906tKxwnWLLTv6z9AOLW7ZZ++Gf/z//5M+/8Bu/+HMfPjKw0Q== Az/yq196UvQhX//irz5yf2uzf/qpx5t4/O/+8J+1vPHnvtyv7Pnyz6/2NPv+T329TSv09U9+X6PZ 9/6Xtlbw+eyxrNnKpwY1e/bZT62kdj/z5OB2T3wkNnv/nw5u9uyz/3VT2v3cN4/X7ul/w82OHLe7 Z5/9wpEu3YXF+Tma7BeO3+zZZ//0/dDukSe2avf1R6DdR7ZIxxIOBS7No1s1e/bZn4d2v7B1u184 He06jO/RYeb7w60nNP88+cPQbnWL7Q37QUfw17Zq92/pHPzYFi/+6o/yudriIHx2jQ/gT331eM3+ 7ifkPD/wh8dp9tQnpLtwez8zsNnTf/C92cU89ieDmv3n5kX/Z59p3ZWn/qDZ7HnPe+jTLbfk7z7x vc/r/az/my/1tHriT35ira9Z+PzAH/599vLH//gj622twmfpkZ//jS8+HljWp7/6+V89DkKFz8oj P/Poox955PiNTsHnOcmqZrxQG9c6PC/Uw8DanPuYcK+nn3stSpQzYMOgoq7106hoNs7VgxTNkB1l 1peujP/PlQlhHr42XCutrks9YVxHhnF9XhfbD5iK9u49Y89xDUV79ux9/plnviB8zjzz+XsHNd1z xvPPPOvsc887//zzzzvvnLPPOvP57QazvWeefe75F7zoxS8Jnxe/6ILzzz37zH5jWejsrHOnXvSS C1/+iovC5xUvv/AlL5o696zeLsGYdt4LX/Kyiy555aWvevWrX3XpKy9+xcte8sLzek1qodn5L7rw FZe8avqyy6+48sorLr/s1Zde8ooLX3R+aJh39/yzz3/xyy66dPryK6+6+prwufqqKy9/9aUXQcPn Z34je19w3otedvGrLrvyqmted+1M+Fz7umuuuvIyaJhb/vacec4FF1506WX7r3ndzHUqnBitrpt5 3dXQcN8FZ5+5J3Z31vkvecUrQ7NrZ5WxLnysUbOh4fQrX/7i82Oi0D3PP+eFL7vk1Vdefe112vqi DJ/CWx0aXvHqiy+84BwZ4d4XnP/iV1x6+VWvmw1Htqzr66+vqxIavnb/ZaHD815whkz2gn0Xv/rK a2YUVKi8/obXv/6G6+vSm+uuvfqKV120b4qnjK8No3vtrPFlfcPrvyN8Xh8aOuhw+pILXyjtzjz3 RS8Pr732OltU17/+O94YPt9xw/VV6PB1V4UXv+jcM6UdDO/qa5UtQndvfOOb3vTG0GFV2Ouuvery S7N25734Fa+6gtt9R2j2pje+8fU3hHbq2qsvv/QVL+7YX9YOx/e668J00/jKvvHF+WrH8w0LUxVO z8B8X/bCc2Rdzr7gQlm/Mqxf+MT1e/XFYYd5Q3B7aT9CQ6ihivuhQneXhWmEDZbjcu6LevfXWcX7 +8Jzzozn4Oyp0GHjvGg5Ly/JTuoZZ577wgvDMc3O3+zMa0MzOH/npJO/5/lnhWMP5/nq175uZmZ2 Fs/zFdN4nvM8tWC6Dg0vnb5i/1XXXPPa19L9eCXdj+wi7aGGF73yVXjdwoW7bDrct33YLL+YgAzO f9G+l1/8ynB7p6fDBb7korb7Sxf9ghdf+PKLLr74kosvvujlL2vFB4Q4zjn/hS9+yb4LL7xw30te /MKpgF9aMdEeMKufd/7UBeEzFRDWAHyFBnjAbPh5AbQanLgXmsJn79aW9z342aLRyX8mjOtJsUEt KtdqcKLA4zCtUHizpPKxXN08g0BNamJXA49pLVe0rVVh+9hVBC5I/XdDVYhTWxcmVFZVo9MMxi4M CQJ1ujW5QMTuPFT8Nj2csgAXphrDzNqm+aROG7Me6PyA2m8NJkc1jcrvyhbHY0j1bFWacjqgRl/X RYMhdSbO1QaG1Jrc7yE8GhalrLZ6FMpPa8cmuCK8TOmi49tuGv5tPswXcl+OlRnOGeGFofA48cJh +kH4aeWcW1rDj/QE/XdLzrnQJ2mG6/n429/13vfNz8+/7+B73jXnen7Uty38ix//hY/+6q/92q/9 6r/95Ud/9Afvu8NmP1///kd+5ROf/bP/96//W/j89V9+6b/83v/xw++/Pv58w7FH/+DP/v6b0R3y mf+fvTf7bafZEsPyD/B/ICVRJMWtu0k2Ny3cF4mSKJHaF6pJNkVKJJvqJr97vw/OIEjyEj8FyEMe YvghiIMMggQxkDwE2eDkzQYCBIYdA5MFA79lJoBhBBgjExupqt6qm71x+X3Lvb+5d35X7K4+VXXq 1NnqnDp/9c/+/B/86d84kV7T8z/9X/7yr7Vek7/+v//hf7ag0Ws/+7f+/l8shxj/5T/4Wyy6Gu3w b/zdPzPwzvzVn/3df/0Qvf+T/+r//Ovl9//if/8v/wS9D379p/+rgYf2n/3D/3gSRgNo/rv/w5/r G/yrf/5n/83fvBTHHx39+//dP/kL/Lbmf/lX/9c//q//vfeoNEHi/t/8j/7eP/qnf/n//L//37/6 l3/9L/75X/zTf/Q//of/xi2hIjD58m//7f/iv/+f/8n/8ed//r/947//3/7nf/vfekrrlueqw/3N v/V3/vRP/85/8O9MO1cJoyWkL+6fnu4vU47W2+H//VEKTEMp6YQr6+RjWispTQUlfvmckTtH92Id h454qe1GLh3xft+NnDri/b4buXV+xvvnovoe9L/D6UQsTSVIIuWO1gGN+Ns8MxXgbbgZ8Eefm7gF ViZb0GeMNIYrDsatfIzdDSx/YtGEctCEtm1i34Ik7JskdPf/1qfCnJn22A7kH516CWzPmQluV8Ql ZYLLleHQ24GzJTAykjeGo18JSOnl37O9BYSqXRfD25hT3+TCRcrwwkVCayVQMo805dTwTsRYJJ5K I50bqJXy3c/qU8BFaCmQDvI6Kg25U4oEr5OiFZHEfotaPBUBHJ3WNiOArkqieDkMoPpQ6lu8qV55 Cm8MT1JieJkCFGjRCdir3Lf8W7RAlCFizdTJYACX5m0eQx1wq8G/GikFDZKkKI3CCcil47QWdCom IgAYCykqEgeSQt+YiiUidAKZMnJjoLDHIokkmUgaQSbT6MZSpfHERVFA2qSXhwGlELxqVNOYjgDD AKnT2sbiMqrtSOiKTseX26GbPB01Bc/pGJHWNjZBA7boGBqs7BY/EGTArkymHN3ET7pLLqhppCkS 2ktgWwLEwzinJJWIQ3OdiCUg3cBoKYAe2CYRBwIW/kEBYwsIc4Og7wS80R5d66rZO8pTYJ8ARSch RQymEuga/Bgg0bR0c38S+y3unTj4IqFrRgBrN5XSAVQfavaO8pROih1qgMLMApJIKH3Lv0XDXxki 1kydDAZwad5wqSDFJSM0oHwdPtSnwJqlpZt6Y6CLVALuEeggSFDqmOTfIj4SoialaUbQ4E9E2BhA 9aEGH8pTmoYdit4DBWgS/CXhk0piv0V8KEPEmqmTwQAuzduUl0hFLkga7gAxHYMgYrR1OkY8DlqE 44kIlU4pQbfipOPy9JJgNBSxlI4RBwYyHLjlxzGKjFCplOSYIJx2JQYFx8E2jEEev8pHiUgK7Cq7 caFY9DSdkD6CweGxtC0mwLoQSVrnMgmTsUgS2hl2H8cAJihK6jEWSSdSMMje+qM4LPIQT8tR0lAC pew/SkQSKTqtYJFME7ajg94gQHHyJ6lUOm6LeLCrkzRN67NlHBEG3HSpZBJjxZIfsiQdS0v8QrPb lac0+IumYpJdk0qk02IgosxFqCT2WzmnjqUpbTNgu5AwrlEDUH2o2e3KUzAt2SBSgcaSCvcUOY30 Wz6ll4aINVMngwFcmreTI/IYcg3D28bh/8CqK2QK7n6aBNSGlQxJpIBCEIcuPzKRRmYdXPB3F1Rn aEhV6kKpfykvUcgnkSBS4uAoIOdsT84dVzMxHNo3qmbi2OduiVcrpwLhvtZndeXByp2Cb2MxoCpL 0pigab08U5/Gk2KujOi6BsIgLcpoglayasACJbCHsocdiB9S2xamFMTEhypU9SFO5upTGuoDMdqt AQoEdToma3XyAOSHsp9dGizWVp0WBnUJA45KOYlrQknUSkuCLkmZyjmY8gIUQxJlpEh/6OJB0vGE RNVkgkZyBLqXUP6eIV0j/7Tim9Zl78FHp9Agckm1BDBjRa6/ZGTsGJpFBpYEgmBodhgaKDo7RnTu GBk8hqaRgRUl+rmMTC5D40xnw3k7A2OcEpLJDA1Td4+bzLjFtO8WhsyMdU+4PqvxSMo+yDpJNpn5 nOWnl4v5eDRlKxzfmvHMjyyPtbcwgpGPtHPBTZtAy58DRT8cxmoD4C9cFzP4JiW+aY4X4N/L7gfb m7skZ0uBXwhD9zkzZd5Z3n0J2BwfsH7nFl8WmfF4BCh8Nhz1pJZtjhtH3TH3bO6ec9M+FzVoCtQ9 AAJvT8P2sxHACOc2+kLTGKB5hkBYdKH9IAHBcz8wYxZri0AYf0AR6nisoCMQ4oSJpS4ApVxOwSIP NaBbPYZnulyvNxxx7ndWQCAEzvqjIsN3uWlvNOXcYbcwWEyYOfaFiAvbz7j5fGQ2OgRC/qyy6NtM oj6FwxfmPAI84xc//cQhENaflX8Y9dnpTwCtHM+CL/kFeOBkIvne14Ll2fFY7I8VBEAmAXdEpGuw ETRUveXdYUJWYBeQhELm8Bcq1gP/K/6/ytMJq6Gu17NK0WLPCfjfBAH/S6P/So6ZrfeMbw3UNXhA iZMF2l88IU966x3HdLh2JxRMQ92GEj1736RnQotsCkUhgn+ThIR48hvNGWeLqOs4PLlFVBaGMw47 nPY2t4PR1obSwmCLQnIB7FxWhcT24FN3IuqW/wOPrkgaWDBAa3ZLusim+8ZkiEZc1HSIFD5E8mce m8iqTccW/3nHZsy2TUeX+nlHB6WV2VjUkUC3JkEp7kygLaegtykC3ZoEdJdCjeRbD9VQbJqhMfnz olGvlwjmIyM3GdnKrCgtvpEtY8EVPZtyv5uiH0D/lsp3RS/AIIHiHM0D3fwHVn4bLUr6eGU0Bso2 bF8cMqOpW2wgPhVPMqJSk5DRR6050/u0/qjACKMe/gXPfbKWn1Do7/ElL7UFQKzcDlGxmTQ1FdvO 6tRFS+zAnXW73H4MDDQ1sm7UqzvrckebDD83mEsRSN3FaG4yDYsP4fSssWY1YSUU40Zgyz+w08s+ OoFESFOxYHcNjX1IhooaBbIJYiymKm4uPA6F1MzUXx4MWCjHB7BJhBkBEyYqbg4YECaRL0Q14LJA CggDrgflkzvaHs3HtsRBRohELCE6ntz+a6Y/WggOV/cXHjm8hyRNrTXywpgFlvba9BVF36+6n1Rq UT83JRdXVDkVRy/Qt0YcTKxQ/J2L/TFzsZWYlr0T2KZ2vJEbeIucsMRzM3dryPS53y0xlMtJl2fc LAyemjKmDEXTyik3kZ1xPYHvGaMZ+kyJNAqAjVBUMp6AfxBJIoHOe0j5fJuA/wsRF0+niFh6I7Ei 9MbIq0dKg+uOp4gGCJnrDTn+J/QAhhFIz7gZ05M+EulnxowQFKUFjEdGDxQ4fYb/lA== vhEfdMcL/pdhpgBxcUfY+mb8NPWdn/5K+Ola6P6NMOHNgnmdM1xjLouFSep4LHiDXjBu7n26mHKm bFZpuAKLFXE5lzuXTjIEPQsTesyYrXUqTA9ohuLLuObdLf5OBisGHKKoWvwpOxgDE/JBwzd5GNPE dqDSyIjdxyUWOwPGLwfsSA0M1GdjNGUFI9D38OHS4Jss32NFOHFCN3jsnX5IJfadZ5V+0JCmi0mR m42Uh2L7CfcD7GWOnsLL5OIETeMvb+WXv35VPgYGn0g5UuX/WNiDjY62anLcHx6/IE2ZBfkrZxXw 5MGUV+hffgNmQfxGuQQJb40mfw0Gvz69dDs66nfGtv51Nd/523f+9pvnb5HUr4K/xRzu6e/MbevX xm7KxsDnRjysPv2BGy96POdm3Xn40Nx5Jr52TLIyJlGSCItzD3EoyhQQT5dpW3xX4/gR8l757xh+ lnHn+d4QSz8pjYTZmPlR/GkC4pYZL1jNnpeeSx6u3zD/B7LOwhymEr9yIUBbyIClwW9dBJAxaAol f6OCgIokqTj9ywsCYunq6u+yYHuK7hrlJ75rur8uJveb1XS3yibIb6sv/oGHhvxB80BDfdhhEa0/ VG4XIZLmDE//8tfI8/TD1/A8/fB/PTzv1x5ekJJCCtJEOkXE5RBTMXMrlqZgCTYKBSAoOfREBIal ktSvKMYgHknC1EldoIFqDCiBBpEYzD39FUQbaEvVbVl4/awT2f48HEVNFLjxmHEDXifMGB5sdfZ7 +MQvGD5hOeg/NvXDxgSLJZAmQsYJlFtLxShYLTMB9BHwZNvnDNsPk/pl+JYoRq9RrmqR46csLywJ 0vz0nRuP3AwPJD2gVmY+Mvc3LjV17HtU9Yk/wtjfIuS67yxA3ISbjpjvPPd7yNqK7FThh5J14iYD islLKP95wrjgi3v2De3gb80vqW+p6P2W1z32h73use/Lbrjs9B/4sn/f7sbrnvzDXvdveV71h69W XrDg7Q8jboyON8V0/D9O3fIanrLHY2QsiXJ5xGssEYVB3xu6ISsh33spPbnPa/cNuv8KrBwRoRPL i0durpb+TGiIxZJUAs6TlvLgRTTIfsp4PEkk0uoTMzSQv3E0xBOADCiMABAaaEgi0Bcbg5lgFHqC 7kU1QwMV+U1jISFd8ZqSMt8QEhIw1Q15qGWfdQJdj2CKhBhUx3/LWBCnp155K6KBTNJi7T0x9w88 EbeOGRri28HBNrSRn2sT0eD/IIpS0qGGuInQDRsolUG6L1jaVmaI+zbE88dne/xcEkTinLR4gCXJ D7DS8MArLnNQ6YnZmtO/jTX/9fsZfq5FFw8nCXifOhIK4rLLPDJOwyRq9YnZsid/I8v+LVf9t3Qj wZpOWTvD8Q/f9rqcMeCP0XTO8MKIc0+4hcC6Zzw7Wcz/SG2w7/79X9NxaZxAx6XpGGLfKXjvbSwR iZEpeGJKU0v1PH5NB6bkNw5S/CMmCzqN8luSwCKGh+jQYRImKVgii0wDwkhTqaWLqn9VlPFNGP52 KUM8c78cDAR2Dv24w6UT91aPE+ZgXaZzDobi9Hrw0kXTQ/dzrj8ajHqM2tTpobtyDQM3EMRcDils 7GM6nwXwBpPxaOJwPX+thG9E7VLUPlBe3UrJkTS9aTbXHy7BpL4TDIoxSsSgAYToJQarDG6NXv7o 9GK5VNt3jfi7RvwLqz5p+rtG/F0j/q4Rf9eI/+gVnO8a8XeN+LtG/DNpxE/gKbMYz18wJbg1mszG ihJsksMKj2VSKGwFZT6J2WRJMYxFmUze8TqTUvRXE+zGOTZcdPt+edpX7963vcC/ycCQIxYNutl1 MEz/0zX4TgDbD+LqJYAmev+TS//c1ewtY8JfGDHTHie+tMcIAwOjeLk5LR/u06gaBDzlhwdY6CgT hYagW5OlmBj9HxCWWrNDhqgAosBfsHUcFjaJi8dKkbjy//DrKs8MRnNW+jShROHIMGJyeBIhn6vK cSva/0UjYacsL4NCwT1o8FImIiV94MbnrPsDQqksJvJMSHkClNwuLkGD6AXgSYRfOaBIiqASkTIY sGMYoyiDUpAqj1vpm5DzH1NyYY5EmkIVniMx8ZJmEeJstuhhaI7JUSpq9IZ8Bk3JYQmJuEQDMdgk jorMoD+0EN1Cb6EQRFwJWpDjxdLy0aeyoCpylarJUrQUhDviej1ujMrKIIgS5pGKHonJMBLSkCSS vOZgrZxzwDkUlAGMEbT0GQFRi47V5VUUv1p0FYy4lUutoREjrolE9WoHM2Wi6N47iZzT0n3XblLN S0UfPQIEMTh60EaR7sTWfCVdkI19pnxAyeQvIxJ9IE8Etm9xY3nWhERWaBLw/9xydCvaLiNmPFYo QNotbokglVa3LGDx7iLLzzmBkbcW1rcaA6j9Ysari0ZLbASTZFhDlVzUyBd1vIQaN6aQCPz4HAhM xv0DBCF/LW3OmBSHldYV1kZDlaOwKGwEzDs/GnDv45EyDhnJCrORCSwSk8alph7L3Yn/q0KdMAr/ SMn7VAkIVKJ5CPkJIXMpmewSYgknxJPHC1h5jhl1RxLEpEjPCmFD/qJGW9Eyn0qKnALCyP/004Ln OTdQOACP5HlmynI6xMmxRhKUmMxmkmDrUrQykvyYGzJ6AYEFe6F1QtyHVL6Bi+x+xwkupWxCcZ6q JMK/0TdOQTYix0aRylrIARMpcQYyhJ8A5xypQGRUy+XZxaHCGcRNgLSZ6U/MVJUpKbe6mCKOZPQb fX07ApzL3eWBgsZMFRhJORoyJX2CACnSygwQO1e2U0IuJq8ZCi1fuG8+FI7vDUd9Vl48JXo1JfF4 cevLhKjAoUU2Igq0njASvxd1WFFdCLmnUAvAlIlljVXbVIKg9RfgLdxQKUbeTMdAlU/U4RVH49G0 D14hU2RkN8Sl5iqkPN/jugA4kHDqilpDM/wEQgT9sGMgKefsGIk2DRDxP/q0A/0nCMw1Ox8B6Qge L4ARMQIcjHEEy+g7O7GHyTz3+xjNS9IsP11G7xxKOEkqLkHUPrYTZ5IsWwaje24qjjBZtAzE4N06 XNiQBS/3ZtnKjndizFYPd+kNhNUsKAaIbGesUjqsAcwJ3OgySZNYTso1uhzB9DzDJgBoyahCo1qn MBpJiK/EmsAQzL8GdzHTZYUeKjA3mkzYOT+C9pG/Ph3A/7nk34GEACb8ZMKAJhWehawDvGguxgLc 8QD9uvHir9Q5Kg8p9aGuSrE4IvOZSatT4noL6K0pMXMGVV6XfruX6rDD3/fnjQuuzxq+zLr9v5+M p+B1GNgf/Ki7mIs30KCyzTzz84DYAnysFRCB4z6gOLGN7GKS38J/5j/OpBLT/v2p0PkBEF0Wu34T b/qDfM0maAufCybtoKNHbCaNRND8+o1iZ8pNWQeIGXO9T7bvBDNyy9AvOy9gB/bBQEkHcwPE0WLn F2gS9vPDW29p+TfEBGmJCUfzHzHdMeuE8G1X9be00TM/ON7qsOkvTNFwer2FMOcmvywn+3Z0mBEY 6OaFMg9sMafk+M33BRjLr2gofwi7VBj87lcsjX/TAl25N8gUqY4Q+ktzO9tp/OhkGj/+0tMgqZTd RIbs6H3ohMEoLX/1U/rdqD8fOpmR1PCXnVCUpBMxYI6TRMqgHT4vYTzqsfWSk5kpTX8FchWN5bct Nb5zte9c7Zee0m+Qq6VpmozHvnO1bzuI37hG/p23fuet33pKEYIg4n9YDFa5HdxsOl1uPucmDXYw v+RH76Opk5ktf/Nr4bQtbsH32AKMVP3FHTPC4He/9BAm7JzpM3Nm03GkNxzHbl86GHJCXVhjDQXn 6yTpbvKswPI/sO42+/u5u9wfzZnuaDya/6iwVzRQ1FY5jWqx88XM3WCm7wt4NNjkZouZ2D6utE+7 KyjybQoHd7VgIEx3g/2BHS8Pg3APxLYsD8/axAFxP7D8DB6SCdYf9MajmbvHQRfi7908+w44gc0X 3GI+Hk1Zt4AyiARlppaN5wA/YktYMkBGCt6SZ2D9hPAPLCxu4e4yY2bak9UyHYuKKZWwZky/rxvA BFXn0kxAmHFzXSuAUGnkSZlj9WejiHYZepxYCAHRQb7uzi/mnPsajVMqtQGI6emc7Y8YNz8SuPHi JzBK9gUjK6OVryhzRuQzd6vnIoSGumTKc39Oud4nQKX7nedkWjFpCofBzFl3FwYWS2XyACoSiqSH tHXOCkNlIigq1n3NwvHDP8UvYoTmi8vFfAb6t/4GG1LaPWNmYIbCaLIYM2oTCqNwVAwFHYL3foTh GH3Q+idWy2pgO4afdzmG77th6Ia0IAkqTqVM27gpMH95u9s2hTVHpg7b8vIpHZ1IxBLmLUlsALZN sQHYtlUGsKQLa4Raix3XmDkgvAbXY8aQwAT03kgAKm1BryxfL+Et8ddt6EyHvepW+zNfbzI86AJ8 LTRLFZicAZYcZ4Tysmua3g1HvWGT5wajMXvGSi2xGlmaxq1FF2yVCgcY2jWkJ+UDiDHaCHx50mX7 S+ANBw1HDLaioJBpFo5BCfLXIVufA+DtpCjFYAS7kXKfcl335Qx+ILhbOE2r22PKqSzaPZoiFswJ o7ljtkK5AUeyYCU4+0Zti5DTFyVOf23G6VHTS4lrt8xYvKZV25C3oyYiv4jeiky9gDN1DUsSW1fl fBBm2pd4lBVXEj+CtYnceV78CIlh/UekblCXOtHohIWXmy2nyBYbO8O22NYW3dpmxvgW2zhGuNh8 VYyLX62EcmnsOpzbbCg/wP/NdNQDypi8DFFVi4/ClQSMpiNKJZiYPFL7dvitlBPyo2YR0aCNWhch +wUdgWlALtHkgHr/o24RdN85VG5Wmirk0NO5xNSwkatLq/3WkagnLObd5pnZTBY5VgiSxlSf9sYL PYasvmvNAREBAWffssQK89EUTQEHbjJ6ayXUpB9bNdfBd+YK9XpEXQf2yHw0GLG8PYpMiARHl8NB YMjWaKdGXZPi+ouGR77Hc11m3mB+RGVgNE4mo+8KY5btQ9vdadsCsvYtcYEBHk0/nQK+Vt0+SAkx hayqIkgTsceNJDjamL7rdFBtbmY/VYW5YtzAtDHiZCXud1MxbkTPDOKWH59zU079tj4B9mu+C/QY ScujTFihUcdLHydou4/bgJ5VdcqqOZBrP2JK3dlo2rf/SOLxBl9Zjw12ph2aFQqB3Dln+E95b2B1 u41at/nRBDa/w5yStNUHYj5zhecmQED/juM/cbJeYfKSz0FrEJuRRG8I+mMNUWfVp/qpShbql7ZE XGB4a7asrI4ReLtvzHBhjUTxmzw/d8AxAf2jWGoHvHUELTNIB23FzWW92bSz1u+1mCV/M1oWPZtY jQZxnm3Vs0ztwjqdqEJkte9UFmvJ+rQYNVN4rURjfQxUI5iFzPHQUwhkb5GZif7CEavYIteqFYJS IZgXW4mNCxnwXrROnIntCtAM79ju7Yj9nUMeYbSXKJs9ofMGWG49qEQxc7Y9XEy6Uw== ZjQWluwQvYrr1DdlqjbdCCzaYm2YBSV5zPxXC1jQ1T2CZvmcgesxcgtgZ7i/Fux4zLr7I3dfTP8A T2D5XbcAGjDjHxj3YuqGqpcbW3CoEbKKl45zi5dPgM4j7hsB+uu+DLqT4M7YKWoCepxId0zwrHu6 4H5Ad1OAj8Zif6Mp3mVI/r4P9j1oBZAxHv30E8OPOdhyMfUB1R4ohoxIawD6mPkROhnRUOtToAKO 3qduTgYz9kkQONDbFOal9Fmp4//pP3ELPYAboTdazLmIYxWzx49mmOEm59PAsWATsdkAPW4MSxFr NNWs2w+6EDdCUXkvmZ6FkWx25lvFej2VKLEQNnwZP7ncfwoe3h35ssx96DS2fxku5PjqZJh5n3pO K56Q31ccMRFhj76plendTO6menweP8k0nn3nOX7RS1bK1HnKS8bjuwQhlD5K7yFiL5d9jRzkDkMz ISecUVGXN5dteHi50em88F67auQO42yrODo67pUiEd/7UleN/gPoL1mqeDPJx+q89PFSiD+GQ/kJ 1xDy9dZ8GDymdxeVUnzvrvAx9t25vKUBcdo1BLaXTA+St1dPz/l2MXJr3ineLvOSO/ysvOQyQmQS LIW8i4q/2h+4vAhZlTdgepQGL3fJwjg3vs8MCsN5cZh8JDXoeNsv9cjGV+7wxHcnwgFDFoqv768c +Gv/q1Tv1z2FcOpjL98K707FMdwz/YXLm/7wB3vlXuLKXxzGO9nDvDe2HyxchN6CuaLvplJkFwfH t6e7w2yvx3zCv0bB8qAxFHsmiSiT5Ed7b5nR62m/MPae+MJ88HmRb7T2v+D4A7ns6TDm8tLZ25dc ftrzTYJH59locvJ8NEomo8Iglud7dTL4mSEViL3SqXAL0Jb0scm7GNHPjIpRBqwveX7kD4fYwjjZ nIgzeGh4c8X64e5dOZROCGBd6k/07nGyyL0GD2/7Txmqu/uCwB5PvWBCx/TBLlySJ/qOvppCPB0X PgN0WCLN236DIF92z0tR5nC/4gk+8rAXGr54RVBQE5eX6O7U4+jv4HHlUPrr8K58JjYvhspvIjDq gaoD0r0ngsfH5RBVOnk/kuDcHR1m+x8Xr2gllQEDeJeFhNQLaFQ4VQbwog6A9B9dw0ZsHD1LeAql DkI12PUncfqR/ujl26WPYGkQPfsqM4xvr0B3b64Oa6XOcb497M3zzb3eeb5NxcDq55MvD7vgm/5j +f7tZKGgSKRaDZm+fqrAUuMIX5MX7IErDVrlPsInAMsEgse72TtxhSBkl7fcIYO3hfj9aSXH88Ob eOb87gStUCox4mmweAehYIFLv+pRqZ04jncZT+LCQlAubzZ4tPBXSmOyQJwmMuCfKjES4RzTXS6X bc938u3T+WIZlbqVxPAuL/w974HP2oCPfUVGeT2eFtdptuLfnwWKQ/r6sdwlDg9KLM+HCLZ5lFUG IqJDQUajmu+ckojaDsNvFbhTzyKl+keSEfe+uKCp1tfkLH/5WjivFAenKYI86/Yrxf7kATFPgzWo Fsb00Z0Km543jh4LtfbukW4MLi8YBXtZqn56WdDV1SHkMDFikLnjlkerb9cDf4Xm1dlON50OZuMX Ooxk6wI3KI6EEQ25ZfipSQV26zV1Vlk2sz8BO/k6AMnrPHh0+ngqd/r+DPhYDLz1Ng6q805/km+9 nZaio/hOWQQw8NXofPuce8/dtutMpZy6und5M+dBCgMB1yAhi5brSqUT8Aylr4k3otwDZgdilIeh h5NqPvnqEfLE8SKptit3o097+Wbo5EkcIWTMLi9izfj78Pj8MLQ7us+32/shTPqQRHdR9k2bT8q6 TILl2/uaLFAO9kuDfIzFOL/yFqy+9L48LJ3yB2/LX4de6LvIWbI0aPN06TRw36p6q6dxovKci8G3 HJBd74tKvvc0ABu8/wWaXD4A8jnB3oK5ZPLXO+hBxZ+mA+VwaBAvFc73/QqTih76OnfD5PVLPw2I OHcE/qkUwT9FuLkqefhPQf6ZhE2KFfjPFXxxDP9qAW6paQmfVi6Vli34z7X8E4FAjbEXLeXFiab7 YlP5p4B6EQeQ1wATf6LmRaX7ovxhpWAA+1jpOa/tPo960Q/0WAFWkn+Kb4syHHEgRWXOTQ3Gjkqa uVSKOoxVcsq4C/J40DMRbE5B1pV2IVQs5pTRKE2K12IvCkRxKIfaD080EHPw7RF8dgSbJC+UF3kN MnCKEHvRrpsjslmJaPS9mK7gsTp/0yEb0BBCm0jJ6itsQdUVymnhXCtDamkIBF8II4ypdGJNO+Iz hcaWSMmUkMReVFJqEM73gfpTnFBhGYFizwXdXNBfaBnFtVQx1tR2oJ0VtpHUGSj/FJtYL+p7I2Ix Xd+m8llVmVpRnpW0zVSM6TaaiHTYwZGyXyoqlShvRThGzAxDtNqLOrJkTjMec3yqn6n0cq10gFEO RskKI7UmtFlbGXdeQbSWRWMv0LiKeg5zISpOJ0NhIUrpeaN+mePn3ut8a+Hd0Yo3Dtgdgp9+nJQn UGU7jQ45L02clr+KUCwdlHrF4gQYCIVPoMOMvaMEZgyRaWAMnRVoH1ArA1eYCtU+XQRxAY23uwGq bcLYooOqHZT7onJ39IhJZMVWg4MKIoMFGq4hoGI8HmomROzmbn3+Qqk/brxUSolHStdLMvvYqABt PJGL3pRq/ulu/uyhNdW8Z55p/qrWyh2Gkzul0+BuQmOfAlMYqoO4ygZMWBwthe57iT0oA8tCM1dM NQoC86n9lW/WA8+lLjCZDUCIxrqq3yPbLyFMrwuiHjyfRa6CJ7fMl8sra94pZiuaNwTVAprSZXFe fux736m3w5MSoDGk8kD9//DtsFLa3JRQ6BNNDVEOWJdLsvZcYqbVO6iDf1bKJLBbW3SaIkhun0gO d1mAE5o+ULQ5vR2kAstfNuhC5bD8HFG0rAgyBV1eU2PQqSkIgSWTNy/sWWlwJbSio+ZTQdo0cM4x agdYSdbWrSPb9u4jJlHEjfdTcphozBmX9zA4y75V/IOzSJ44bD9Sgb3XQ1k9xfFUeg8HTkQCuYp9 cfmzu/s9sH2CX0toWzaAXF7cBMKGAmyVSr7EKrv7WloNhM+7o7C6AdKf7FkRmBL9YOWtc5wuFRoP n7phgl4ko+r9qRJojrNo/6o+icwpFfbrwKrWj9b2iUqd5omncj/VeyVOP5ka9ZY9aIoWH5HpT8YE 4JbkKWJcRjtL3gztZC579rADLLChR1n9DHTBXOZb1f4HoLEjnsrdeNLi9gjtRcHqH/kXFAuMwf2B +Eohd2TRkyF/Ma01UvUWe5Y4yb4VxtPbIjFIF+uSo2PxAPbIrFArxBcFwuUlQzeCsmtfIoBvPr3m 09mzsPKiLZvRx2/JZPuAJU5rO1mA70gw280Mkw56hhhb7nv9niWC1DmEAIehHj93i8NnTyZ4XO10 NLAjZ4XP8+Be8Lg5iGvX4LXwSR151BeKl4YqsZ6ri8KYLZDFkefJBxhq4QrsSmJvmC/3Pr/20Wqk P/h0pfI6KPsq+as6YPDVK9EqIyg6vy9x5/vTArDZuuno+fVzHsKOqX7JZXrJky6v3FLevxpguDvC YvfWwooENNy9yDsq7d/0uMINnDgw8IEseSTIavFsrIMHeHKzNr7FN1q0MCoOn4pgn9Pnb8tg5011 9waPH14OpCbHX0DFOH/35L5Oeqy8iL5FPtWdvbu8EbJ2G4KU0IZehYfSIOJJiBg9OuUFov5UPVRE VDlzynQjIgc9pi8I0FU7WDt6jlOY2kHVnn35dvGyVYpc98O5zMXnCFCyIrFUyhO9v/u163towj+V Q9z5Ip+Ojg9UYJLLEnoa/JfTNpTXb0BKdW8A7B6lSm6ZkskCBxanFXsrnZ1x2eLbZyEO1An6slTv Ba/AszYp6QJS96Hi+7ASBuqZfyfVys4ey90o8Q7+eRxlLt6zo3K3vf+lVWRocVc+pdr7e61KZ3f/ utJp5ufQs941Hvy79xOsX3oH+mprAGI5URgnr4KYciMKI/rQn+PD6UX+6qA0AFpfOMPO1G5Fdy+Z 8lxUAg/NOdCeyL7yohE8Orvol/qTdEjtGczP7wdiYv8ObOHDuOaFbxgdsq9vsg6DyVfEcGpVD9iV /dfcV4HMAoYU2y2HPRFaPzVNu+PMIH92ZtQE6JZyozr9Fc1SS43GLW+l8wn2YvPp9LncO9lPlM7q nla66f2o5ITTxgdqJ3GYZRoqjnb2wLpI2zBTBqMozEI66pCPVKLD3O3gpgAXeYZrhxKwYPUlGYjm E7WXulZDpSUfbCo1KjDl1wp1k7/K3nkxJVhaxrS/dCo04QkYHal6q8+d/LR6w1QOq6RfB0wiuUg/ lx4+58dgC5fO89ftHNAtcc1bGlkUKK+Ng3zyOVvMZe6+Rsm7WIzNt/PcEslRic+vQiJAP+antYOv ymGlJ2CkcnxExxQPPGwuK5gN+M+zhk5O6sYEQu/ugDGw7zma27svXHk5OjwNtRVl6iiWb9+efOYO j2cXgI/dRM8Oy11fwrTRLRAEAQFKw7zCjiAqa7uVYv7lHfwT7lRKzXNqGYAQynHhdg30cnWQHeq3 hTJX/UyVIwwczlPpGegUiQuA6OOhukyAJ5+1i8PEvAl1y7fZQeFjPhnhsO+O4kBGXAvl4AE9wJVz 8E941im85m735nPNdn1bpJunjy/YdCELjnl7E0DJKqoV738DMdx8a/40Kg32a+NUgs/eocOjLPva HBrQCw0FWB0wnIP9SrGQPoCK2gXQ6vJ8mXl78uO9EFQvtyi97z4/APPD3yv36MBhnjg+negINsve UL3S6fnNPeCltTCg6aeqdvtkkNNYVLB69xcD5OmtzoFuef9WOj2KUeXXy+5LadCeRlSw8ODmBBmX QBBkTqWjOmAqLPPIt3T+kuvN0heJzilYkuk1UDXLbXjKk75+1+7FD1ENAn8NFRULgtj9zMfmB6X8 9fS8VO4OOkfLvYAmcX/6EkgS4qrcu8ul0A7TYIwQQo/04/UBAxQZ371ORqBZ0TuV8324BsXSqWdA GPaSeFxc6gCoPBmAOL6Jl/OJk0Gj4j+rpjHLyWKnOiJ7+fxFOip4ZIujo5MUOp/Bz9fCnk9laQ+A EiGES/U6tF+ihXGJPXzdyTevHi+AVlQ4x0VeOj8BqsEd0JQkU0I6On3Mt7qzgXiARR2xN5pvMGfF CVXJhnYUp0ZaURtFtCRvx402dPbvlTszeI6MsIMLBVFraI7g+cQzNJlJoEedtcF0b490cgHHQ5f2 AuJ7C1T2n3zXwF6q0qX6ZBxDX+Crr/kmNa6+PHK+zMVr9wtI9oZvaS+i0QDrLZ8K3UzgmcWnwWEU La/LMV3eL9XHwVYlv3jndc0VTVFeafoKcK/zSgCpBsGTu+Br8nrg61EH/OKCCtAfx1T5sFah3jzh PFV5ybeoSiEK+Bj1FksXKeYsdCm+F1+1s9dUaUIUkJVEVc4SV+gnVeof5MV2pdrkmA== ChK3WaMxZNl071Y6DgY7FWqwkDpUmkc8pH559w70w/cOakkfVZ6P0Kk2PNKELjb5SFOzhWEvsf1y b4cGAx17+Eo5dV1DZIHvl+RX7bqBznCzg8n+PujggzaS4orydl4apMsRoCJGApYS987lLQcvfUGw vq9hq5bH0AQ42wM9VyKWPd/lDseVgI1u+aSyQr02A2V88aKcfstzw8uD4LHwmFblGZrQkf8q8FC4 auYuoqPdzKHqJhH3fqzSGUdpoEfT41zy/r2cT1WFOQygCFf8p+HbInkzEdQzTLxnI3tCUitFowIJ NUm7kCyLK6YGWAFHZAcLlpdiJxQJyR2Uopgg1Mhmmv4i0y2wF1uVSu49Nwa6ersvoYW+vEU+pYMF 9AZdZ8LvnhimLENHnshcvcTnEzTd/EB0znbp+dn8CMw+EsUaj15DgCpLwkEy8xpsIQ1dRbmsKcUC 0xjg6HEmH/f5uDR5dxbF0VZn7nNC4H6ndHb68iWyR43sigNFZjADguc5Sme6l/u6b11ey6+B5GvU apXO/CVcyfnYdv56zH3hqp9s9MqhIM3HZLuzmOZbu8Wj0nuC3jkMLZ6BLUYffx2U9aqhIjIUaSHL F0m0CJJ119wPHuWSOyUUkALHWky2+txhdbb3GlbduS5vpt/vtTMUc9AsjMNku3r/eD8FyzQvqD4A sQngm4vK28tiCEN4fIjLSWqebvWJOZNPhSM7QPqE7wAd3AAdJj/tvgvq2ToO8ZWaoANhLHBHA/Y2 30q8LsAiP3iB8na10L69y7dvkm2EO6D1QeylP3MfDTDzyZ3G8Q2x/HZH5rIzQsgThxcz3BSGyCr4 Dtulg1G0dxh6OCsAGVCHq7E/Ejeuoixinl4d5uXFUYzw92mhl788qzHIYoeYoDRDutop9x7Ypyxz x32UouUPb6Wc5kbl1/vhDbBf2vvhB4Pmb/TN5dOHSHftRuXZFHYlMM9yUEVMFM4DgVFyWr8K6sLJ kBQThYKv6q3sPZbDD6n3QvwuFsZWX9ly9NcZc3L0XGKBgSQcktr+FCgHR9lu5vOo9DJ62MU0JQwO 0guAxJ6YgYhdFYe5PtBhxsW7PJcf+PG1unreBXpEIZVvPoY4dfZaWwxQB4y78JV7i50RsO5eEsii VxmlpufHFODENRgbEeZkr8ljOnd3FdxHqrtqf4o8OQM0849QfnriaVbe/C8U3AzPSHvEhifB7rwC SVq7pjP3N10wF7YCNJyXt6oXkBoElQVcnHiHPtYA6OA5jGuwBJ3ZfXEUr5ZId4Ll82Aa7LtgCOyh tlDuHdcAsJv92V76pvy0l36/48G4anGo6b6K0VdghH9yLCe+6zJaS+gKBwdZfEZxvh9cNyJ8jmbd MYOl5hg241mYbcdCeLz+agd92xnzzvLM9N0i5Bk2g7GizFwNEpUucYA5uGCGMBrfrSY4+5s822cH o+lIE7AL4HAiJvQJuTiS1FhUu1RHvHTXimGuZtNEyUCM0B3NJ4x6XcBy9HRvNuMjQw5FxNs2wzJQ UoRhiD1sNoKpBpGuTZIWbClFT4uN0hF4D4MVyDGeI2Y+66502Yr1ZLDLcIygwSbircHWPfZRiDR2 vUEilYiodxEZT4RX8WgxQHxRbHL2hPlYGu1sZpE7AwcsUgSvi41PxU1xj6+6EVA0WHSRg0WbMR+Z gLFLK22NnbmcjeFg0mC6EO5Yva8lkTbMptItuRFFQngSRSpYtGsnpuU4Gu7sffIpLRKMmLcgPdiQ ncKrFizWssf3I0JvNrZMJISNOP49YkXosDdBLj+ouX1huTtmzFrBEruD2eSMddoFpIceSqWew5tZ LHK4xH57U8GKAkGbwXg0G3L8Tw6QIV1JbpQ7BZugOxhsR6/c3ACkWM9CikGIcyypxBa9PzinfZH4 prgsMCB8uL5dmEgK+ImGKzuhV8Ax5rB+qeMOxtZ5vNrGyk43JUweK9to07TH20JDHTseHW/N98RO YT5UV8lCNMvlRG0Bz4Dp5HaCBzaFuszIMjFwMJ1H+uMZP+CmVttHbKayXmOhDbucwKQ7PYmY9Sws uoJVpp0WIm+TuKptrRCFg7bWGsFMiEzZd0A7ctKj4T0Nv59FNLcxmEAakz2UxmbZCPC0OSoMIq2H wfiFCLwoYMoK1lltoJ0wZIDay1qIVdSj7t4ak3ZAk9D2a9KuizKjpKGZYEK9g8xYG+f7vGCrPAG0 c7P+wgJVCIx8q4LVsBEowWL5UIOexW4Su1pMe+Y7CcCQJRa6DsIGmK38VuFZ30kB241HlvmpoMm7 XqEzzu8FLXl9S3NZCQY3ZmaWAn8Ska+b4+ZDWRGyhehMxiE8MtMpZyX61QH0Jj9+mueigoZQWo6m FqgGbVROaXIlkMV4AXKnzuwyTlUAbXAAP1GB2klsoONijYXrasFdLxdpMk3TYSpC2liXEJXYyLS2 cV5u6Da4/qt1W4V3AF1OxRrqEn6Vd/DSvDOgqGgxD17ACzTa+E208otSu7TcxT2jv/cO9TuZqfY8 /gaZ6+jasxkj8/a42gUql4bl0qtvylOAIkVhi6kvmjzbGwlLCd/wE3jRmJh9bDhJ8b6QuaoFYuNs vg8Mv4HXtqm7NLvsNlBLamurnsFVE6uhwUWR37lQfjX+xDD9NXicKH3GTy7fjon+fiuHfh6na3sf 6otYIRVL0Y/05BGlgyEfGPZZrcMWef74qJsPzS5Oc2dp4ThVO7yLVLjH+G2Zf34kXN7SY+WhXTnK H/XIg3xymvAUA1dxIbYHQ8G6USIaPKfih1eZbOykPS+UBunqZ233+ogpDYiHY+UtFTy6poeeQKx2 5AlHfdee4PHnocfLkmee0PCj5fLCB5VIrJEGfxzNvFIHw3nseBY4nIEhn06kITPXBemvt9MTNJdI VEh8gb9as6UmYH5CqjJtU/70w57LC/BEohlcqoPin4X3FOg5tQgeVz37cYESzmWwqWrsLrs7AD+r Y/DtQ0mec0Pg+azwyL9km5dENN7yo7GiTkEvYrdV8jl+P2yEDDt9eS/UTDulqY+ox6zTLv8aDd6B XrTdSp1eFAK7N7Nxw6hTYfeVLph1Wju+Sk5vdZ3CXlC38cB9MNu7PDfqlF+8ZfwH3kPPm1GnRIU4 OTTplN7dS2UHaUTJBnONPzwTlXbhynCmO5VZxns5Or827LS6yzV0nUr7BXXrO23Ez80QfMM/96hT 2GlgCb3VnbuYNzH3gc/i3NKaZvbA6kvdNn0+3arG28nqGHUKNlK3rO30hX+57V6bdJrpJG7671G1 U5cX6/Y13L4w7TQZHbR8xp0eegK8kAkKxp02k6+gF4l+l+Yq+I4fSJNOE8OAr8BWjTuNB16Ch9kJ NlOUxq+uKpPY/aIX50adEpWzq4JJp/SuN5FKnJh0+tCBhz1cu204153q3tF+gx3eGHZavUrdmqG3 th/2RIZip+XnzwqgMRzBOwHBlwshBB8sdVrrTBJfBzMCdJqc6Ttt1C9epE4fwn7dTF3eZCISeVS7 1cz1sUA0JldJ407rO4tU46GXMuz0cszW1E7Bumi7PYt8zUImnT4FiVbja2Hc6VnstVGpnHiMOgXr 0q6P6qZzbZ3T7TezTkvELfGaNu60Ed5t9zsHWdSpy6uf6+3rkWDa6a2f7czMOj0n7sInBaNOXV7Q bTl4l0vxRUMEP4bar6adfuy0GwWTTp9p4oV5C6JOIY3p5npxM/rMeC9Chp2+vt53TDvl2BP/u1Gn Li/s9px4KzdKxgiu3JA79/OrulGnPH8R3pU67cYCuk0TTB+UY6hTl5dkduZVLVfK8ItYkYCdhpY6 vTzyf72W73Og0yNe12kwwz2EpE4/0wdqp4Anw269g6cdUZRThQeyrmUQ10T54qkKOw0vy9SL8N40 lm2CTotzPXrL5Y8I6hSui78c0rFCXz8ocaXYXqZ4pmWFbPAodfEEO40ud0p7d44eajXQ6alH7RT0 gjQpqnA5FOd6krmK6BD8wR2VP8VOT24aDS16wcJ+DDkkU4EK1Szib6n5xENlpl1Ju1h+v9j3xPqT mfHbeABsmuMEa/aWB8RwPlLfarll/KFJlA8vy+L7JV3g8Yho5GIUervM4B9PiMb1SdzoLaLkxzzR 6J/RZl8XiXPPXcrsbZm47NWvzd52iFbxcy5hbPn9U4ho3e56zN5GiHbu3G/2NkHceL4i6ludfPEQ /MKTlN4vc6oacXvjORLf6rdZ/OmUuH0Pnxi9RRh7ahB3e+m82dcXxB1dLpq9bRKPu8kXs7cfxMv9 44GMsaX3z0ni5WMQMnubJl5vsjGztzmiQ3fS6lsdjXV4MnJwljD5mvGT6Tfq3ORtd5cs7L9WTDHW bZFnVzunJl/3OPLikxqZvO0HyIePs33jt4nXaTt7OH80wxglND2+wOkFekv5jv017du8J1LLHYtv 9ZyPmo89h/HTD/UtwFgxfHCNW2D+fjtY4IQLke2J9lk8dA25UgHQHVswMj0l4/KE9Oaic1+x0j5J PiBbsvRYPoy44FOiUixEesViIXoWxO23N+8Yjicm9of1vBvzIVMQcTlo5zypnC96npr6iOjR/QLu jCfAHAeH6uqf70ZHR90A2EU7ZSF1lWlqGC6/Q/mOmmFRjEA7B+PyeKeJIbRzOF2ncF1Qt/GHe9St Yac7lX7UtFNk55h0ClRbYOcwuD6GzzX+8GbRaTWcxjrt7+/vqp0i7V/pNIY6RVaShGCo/WflTqtj DYJ3/Hin8dae2imwB8mIaadI+8f0sZhurlD7fzbuNP7wZNopQO+E0nXq8uIIBtq/aadQ+++bdcqa d5q6gNfEmM4V6RQmnaZqUKfomHV6pVtTlxfGlIakAaC/JErPLK2+cbusg3ai1tdwBDEeaIrtRG5B NWitQ0izcSsLYGn7noqKh4S5LiAdTmQuMm7VHZ8jQzdkSPnnCTfWAbYhUmf4bnoLTiGAa2UMV5CS m/scHF5R9Y+pHiLiNOH1on/ggt7hSrDUwaUymhK0/Sqoic735PIep6s3TfBg3yv9w9xjGrPkLpM3 Lmj8VCLLL0IVm64yZHinl1f6J3TOibiRbTGZHaszADRY1CAQx3whOmRLXvgPIMgTom49JNRElC8m gwqVQ+I/Ej5JI0/gFUT5whrlLq+KeWmGyK42nF/TYz8/9M+1bv00Fh9aQaAnnxutIL5+ncWBPHjR pjGaH6cscUz2w9ivoMn8skEH9OnSIMsCWGgTYpfnIpJ79WG2HcoiBuTOg4p3uPfXx7zSn83OcTlA FrEBsmZaz9VbhNMxH9BzaKbpQKG7FVkP1PnBNKoYCMzZj7GewD6iS2PcPYTm1qOR5Av6R8Idcpwa 4K78fOsxY9vGu1I0bAx2JXhKnjU2nFp4Vzc1ZV00qCbYZmRfPE0wwDKYbnNiP6t9cVbqXLTk/lom WOHzbtO1mqkSQtyVMWNKr57t63R1zTKVog4oEKEF7hdzxHTMpTTBzm+iEuUolCzaJw== xpRc7QobANOKfHK2tOu61Jdov2y87yrQiVQ3XUl0yrPwAV3vPKRwJb8JF2Qq1MuicKZM12Q54T/S 0EU39JUi9zUz1HJBDbBQwS8NCR9X0HRcxKAYeZLOX5aneXllpIVZLUn8a2lJPlM8mhU6fTPmtU5Z D5jVvWAmlkSNEV0UYq4zqutb1XNVvViyWl3cFgPN+1WS2fPVtqA9faY9KvVqTngxZB11/bYk169S hcf0qfGQlNHAf9T9Yj6oXVNZqS6d9fpJOj/A6OeepWKx63j9DBQ6CWMOVlCHLIJlOjdOiQE/ezUG 9sHerklZuNdaAqYVKOsBE0ENfF/3W8OYVq/bEGODjP9xaxiDPG1tYJJfS/bDzI+/VMMVkbDLSxXu X03Z0Cra8XvN1BR0eZdMCWMBXYMnLDWHho1eU5B3ZeH+c2cru7IGz0DOLGlsyVAOmGIntpc9azgy lAFuJD/M0nicm32GehTATSdix5MxncJsLnZMQTMQY3sfDsW51WI6EIULqPbLGjihnA4EW5floVhv e71lmPkyFlDzYwHuSlN5Z2STo2NJbZCR/EUYDUl1Z4PRfNQBF2DKlh4SXQcmTg3qRZjaODVcOvZh tkE+6nZqh9WQcCsJDGq+uxUGUNcxADN73wkD+Kg7ZQAuG08S9TIP+lbh2IZDQvIFUIKNrqCnWkmX 11Ptib80Jw8KHxXd/FDM1epENXS8IaW9r1rl+hU8rj5/bYwshCowlxW3uAWyTDe4gaxcRpZ2i0eW t/jkFG1xUyPNtdyBiXcptpfZ2VnJl6DiTpWVk1MLO28Vo+KEFN0E9h4Se5csmBrpczo1U84/OY2d 3LbP7exhK/dGbC/9RejsSgsHh5n2dAp6ueUcTMjlNVotjHZ0uvXqfp8T8nQB42Fwjr4mYhJ2vj69 D8TEY3Nq6a8xYgWYp8Hl1SvTJ5nmXKdMx05uvA6cieaqtLpfZmdaZXod3J3ckF6j0aDrFFcThGd6 TdiYInAxaLpfZmdaQbje1I4CaGrKmfgKXEkdiF74mdG5y2tB6Zkrj1byrTchb9yRr8+SAZwtSbtl tLgcIUYn6AwRY6XLynIfYkcr6kyw40iX9YGed33qUaxIyUXw1O/A3W1vwt63jE4njCw+S593tTlZ XdopHngDYOv5W41Aubwbbz64aUhHPNmSVuGqBfybULy6+oGDTXcOghI0giKf768AJ7T6aPRnSQhO eDXfv4ncQ6AijrQLZycVgcCyvnnfVk8YZH1MzzQc++MAMHtx43Jod8GRWRz6GJ/xKbNfXpf+PuXo JApTP604GjBcEgGRki/UXsDTjANFzgFHu1E5mtm6OOFot5xTjmbvgYfANuVoil0JgG2BowmfsS3s fXgQvwYnWqKx5eiHdTgahIJxEM252KpwIk5HY372iuBETc366JALHslUZKwL4F5ruGRBq0Mh7Ogw aqilSIFe0laBFs/Bkm8cPnWyEPYHsEXwom7IhDBt3F4zu7+1Psg1ZbJG5/sA2Mpavfm4YOyD6dmr UzbzMHNgS7vstjNcNTWsaU2mIK3+xqq9CMXMmNN6e+zhrGdQazwkEI7T0CPrbSiCUjahw/gxS2nI 7FSDelnI7DQwm0bjtV5VGt45jT6ysvigjbUdbxaiZABsW/r985eRLDTwwVoTGrlj43NxJsWYnfMt SDEARX9itS6cLUQQITjEVmZF6uz9taUhXLCwpT95dWmY8Yd00hA+M1cD8DhYB9IQDORp7ih0Sg3D ALM3PkmEIzM3SDWoVDek2ekbMBVgpP1WfNUQmOne1nJ+J7u7wzvSdDX0Yo4xejvGJVjJ2/AKUWom jPne0nUtUoQS1eloUA4pYmlzSX5LnWCiCvcPYZ1gWoqcWEEs6WKu7h+sBJOTyLVLzbiGHnPvqPn2 MiaVYsTQNlon2hYCcyRaDM5utJnCErBtEXHhYWffiT/Z8GxgaSVtg2/xM3GTzd4VrIJvcYowHZLq t0SDMncMO45VVeUZEa10DowtC2kNxMtYLofV8S3TKe32F+VKei/3WmkfN8tGOXTWGXR6rW/dHDo8 D2g5g069vWGzHDrrDDp0Wr2FHDrrDDqTbMGVc+iClhl0Srbghjl0Jp1KGXQqt9wsh846g07NFtws h868U5hBZ5otuGIOnXUGnXb118+hs86gU/L4Nsyhs86gEz0km+fQWWfQYefIfltD8qlkFOxiZbNJ eUAGMfDN/S/rYBfHQ1KcA2aWONB2HKUHal1MZiGnmJ5s5sl/Kmn1X3s8mXt6mz7PdvCkdTEZxSk5 xZNO0C/HmWkMLvnmFuM0PE24jmN6MgIF5Ys1cTqen0XenKLDaGZoOijbnALjIS1nPuoPc2yRbjok e8+VBZ60vMZRytxSnJIzgn0trxQKYpJdW36+NDW4VwoFKSOnsQNPrwO38WvZ2qJ1OfFXgak979qb YeZ+dRQJCZPdnAWD2CS7mfmLnXt6YbKb4wMXnYsJy3stOwgGsT1wAGgxCAVRLQtHhggOTJvNYGnT iDq/Bpgun6FLcTolQucsNqJzhzy5Sy2s18Bxiimz09lxGUZiOUgy1W6+inUCIzwXW8G2h15IanXH mQZjWsch1HVDWjdJFSKm7ECdcHBi1a9aSDZNHphtFlhqvsU8vteFtURaJY/PTvc6wJ1WmiFpYuB9 R6xpEowDVVqTmmYVA395bZCiaZ4bZRcDv0oen7n73On6qXl8t+GNgSmgIjpQBnLfOTDzE3MdKCVr wAKYTb7Nahgjt4cxfbT/RhiLbYYxreNXvCJSE+r0XrPT1TVqI9j7Jgp2zT5pV97sttlyZtlPDkDY MRy0t0kHmY/vtY2NPUVTmp/Y7m5ZdzbJojrZtwbgsgdxLGijCCxW2gwjUCLb5c/arpDuZMRIvihK jWmKm+12tUWGPp5/DXTYp8YeuJxEHsAJxVfxBui1SI1deeIv8To9knoR3ucrmJmmlAyE50puizXS 4/BcHsxcNc+IcubecaCPfdS3s+Mhlvbt9TFneDJy7+iI1OV1hKfV3Dumniuz3DhzT4PFkJY8MpjF 55guxSGt4pGxzrBbySNjMST7vFcLPGk9MkdzvUcGpiTZRUE788hMTh14ZOyi1GJ7Gf/exh4Z0Td+ urVAvsnpFiKIwNTi/tUdD7oz8cnp5h4ZuOY6jwx2MrJSGprNIbjOI2OYv3+6DY8MzM6ThahlRLd9 qjnEjoPkHAuJrFWWo8vK8uzMOg9V3dGSR9FMWT7b/N6wk8yV1y5SxamhETu5SZqnjrq8qzh1zta8 N0xDyWBygW2kjy2FLujli7O8ulXvDVs+F0N5dVvIgfRiASfrRg+eOUwh2TXzW+qS68ydoLa7V/G3 ST5YyCN9+pNU8MyGGJwJuvvWVu7rs82Hc60SU7d2PpzB2SsAtu18uLUjVFfKh7OIUN1iPtzmGalO 8uEcZwtulA+H8TEsI27b+XBYzFV7zVQNg22oz4fDraSVUzUc58O5DDPi9OuyaT6cQslKDgDMiFs5 H87m1BfPF9tYqkDxZjhnPF/McUwkAGaTTqtDILoL2vhGCwjM/ERnhYyvlqMTK+tcpRvHkZD2cBxd a2F9wovgaM3ndWdlrMSvlsl1s+ZdpIaWRdH6DmAH6QS6TYi81scH+m1Yfi5aI9BZ8AVYBrQJsajO NTOrbFIxJD+/o9Bk35ejnWN2rYw+x2o1e9FwTQ0CG1bXxmHK4DZuA0ZwNtuGMhRpE25ydweC48iW tr7rBsFxrtqbKvYih7ldumLG7rYpq+gGMD+dD0vKF3NqUlsa1DAH6dowfWE1Pna3zYzUu+1lpN5t JyP1+WsrGankTngrGakAzhYyUiGUbWSkQjjbyEiF+WvOroE2zl7TLphqXxuditpHLOm3YYdfCu6D z5RNaHarubNt6DQVTivFTLN1NkyF03pHYf7at0iFs7wHfmupcI5OEjdOhcPtyuVAkm2lwmG9rHRN /WqpcC4nN5aslwqHKYbIejVVDbuChX22wo3wokR+0F8ovFle3af+JsSl0zeHUVUQ2Jf18Q/mPpZ9 4yYOZAhs7sBcc6TDPOgvGV7zcEFMYVs+wDG4Tcvqdl7IzKMWIs9EOJjepgUGpbvre7W8Okk44Dnv BXS3h0F/eLFw//VeElUHh7XBG55wKtzxHJxlSU+odH3nCd2+tjyhTr/tOWjnafhXE7YresJnnQS0 ku4/k5I4OuI+8SHLZy3aZDe/RbJbM0rgOJazzqRanIJvj8MLoGqT3fzdvetPk7yzwLNVubjXsFbu 65LdCvSlSaf0riYtSp/s9mqZYVf1JIzmKtVCrvIPSqf6XCyLym2HnhdtjpUuBewqd411qkt2y45v Lkw6TQwPcncHM7MMu/jDg1Wy2zth2ilReamZZ9h5P6O3XfMMO8ai0yqRMe2UF95Pd3Wd4hl2nudd +sYMwSGrmdb3dWsKt2sYdY/+klc/dbHoW7eU2l3usk7a7VweebSRkCYt+UXnE88ih3NeUkTljQu+ Dfl14tT6LjX7kFudBtvcn+jD5LX+VNE7umYezczU7aTzmjioY5WzvqrZyZDESnn8dlLFTO/JUWOu tlVJzsi7ZFopz6aSnMOl8+2sFnNlURfNtuKILq5vwyJyOJ40oHC70kEROcfz016IbHAPvC4w32J+ +vBw0yGJ3lGrQdkGUzoYEuKWdvXjnOOpEX82GpJSWdI43HWNbDqjEWIZqVvKpjPB2Jaz6Yy0UfNa nOtm0xlNbelWjY2z6Yxy6UzPK9fOplsp83HtbDpsmRRv8yZea+NsOiPjA6PkLWXT2UZBbyWbzkwi bzebzonXevNsOqNcOjSXrWbTWcT2bDGbbpl8+lXLPPG1sumM5Idyr8LWsumMWKvhqehG2XSaIUm5 dJh3dEvZdEa5dGI2xzaz6YzWT+vp3UY2nVEunVnVv/Wz6dY+4V0pm85BfuUWsumMcuk2x5hN7ZzV MOY4m84YY9vOpjM6RhE5/zaz6YwAuLzbzqYz2tuqd3Rb2XRGuXQWN1GYgbDJpjMCoOUw28imM8ql 09d83DybziiXTrP3t5JNZ5R+Y3ILjSk6VjMAdTccaie0fjadbkiyAbhaRqrWAMwIS8k7/pKhiqGN uHOYSGdWptI0x8hQu6jb1arUod+82plUrc5Qu9ioXp1RgTKndRPs69VZ5axh52J1u6qVjvE01Itv mxt1zKdmX4cWG5JFvKWDUnVOhyRGd1gXoXWKJ/PNbHjLmQWebKvPGg5pmcOAQdFrsEzt7SKxvfRn VLWH5Nw3nUW0HH/kxA1mWuZupWiotcvcGeS/LBe6WykeUTM1qczdJr4L52XuxKwBm0J3GzhjxDJ3 G8cnOypz53KUYbhpmTtYlcm20J3Dy2zNy9zpKdlRFOLKZe5WuBcOyIXdNYkBky9nW8uzmJ3pMovM ckUdJLRnrraQy3PmKBbDLunRg95uFmsN19xJRLPLPpFu4xD82dmyrFwPMfZZac4KYQ== QOwk19y9og9Wl1HkXzaUYW269QWdRlNimY5hqbNVE7viet/w2tFQSOffVjQUyv7fNE4dZj5uvPlg 4L11EruijTuAs2pOrVH2E4CzcW1XEcry/lunTuLqhSYt6iRuJ7FWsiygr8G/lFj7wdqcJTlP+/pg CWf5lfYaHgR2YMrMTCtNmEbutaaOUImbkUFtvVd9DPXt8pEufLZyIoNp9lNu03sVYELW9ioY3myz guHNmhcE6Pb+LbdxoWpUds0okWHVGkMQzuqJDMs1IBCcbeRzBvW3Z68Lx6K0liZW1WW/DcEGsbC/ 1zjhBbrX8jYEzzbNJ5IqsZrWuFsxsctEncdiSJxuwzUq3JnWrZZq3G0oOqUKd5tnPjqpcOeoUt7G +URypbyNt6FlhbsVK+WtWeHOoMqMpsbdSsCwEFAlewJVuFuu97qVQAsUpKIuw/p8DCh3Ninpqppj d+8oBOYoF9ZSzZH9/ABYfGPTBWCbNcy9WDnzcdXEWsXXp4ezeWLtnc60Nq+TaA/H+SVV5tzyzvJe uNWSmODNk/rgms3y2w1Ca4oo7uLGWoA53IYd3jK/coU0JikjbNUkJoQx04ywrrn7biWzHWFs6CBc 0EEwFhzXp6Nd6aAI1/3qSUymdmWHd3QPnXUSU8YfQXLWTO6vluMKhmSZxITdN+4wx7W7dOKKnlkq hi7nOa6F+/7CjEps6tEZ1n3bLM5OO0ks1nrTHFcAzPJqKo0OY5fj2hVWL/dojrF13ZPLK9mJ6LIG 1shxfbAUebqsZ0eDckgRxsJB9sCr+/c4cT417E9ag4bA89R8T0rSO00/wNy+Nvwn5wn2Iqcwra+I cvsisUZ6D7OR93XDk/7SpKbxAunl8f2prcO2Q2XSJmXudvZdXtM0PH7xFgnjtKEtc3dIvZtXnNPV 1gProskSe7TK/fsgTTslKoOLlmmnLu8+edrpmeX+9a3qsBVaWKfa1DRhd8hi+XBwV2oQfPy1N1Hm qsuHC5gn4QH0HplXnAOrX0kTZrl/9O7e9YR6NUvCe7HKhxPiGj1Zl/tXDb3dmnbqY/3JoVkSXsS0 U5cXdNvwmc6VF26OPaadenIv4bZmTdm03D36S1oGlzdQfOxPHLQMvC4mU9t29O7Xa/n+UtdOOk3Q tEwMJbqTxCTM23nO65RO2SPjnyyJzsqC17Ej/PxFFXWmfmKttmpwGvRUMgqbXK+KWdNXMXExGXpI Dkx1/qfSaqFV5kMC6q72HsV1s60q1rfxOK/MUnIQWmXqztVZfE+l1UKrTPGkVXI3yko7MDWuVs1K s6l3sExPRqCQrw8CWyFOy3J+hvVdzKMHrVLcVorSAkMyzeLM2oajOx1SMfK0nf2SNQ9sVTLslqNj tewqsMyuXssr+ZjNa6aUt3Ad7UNIX/tp/Wyk8vOttS3tdTk1gMtbOeV5CK8bUqNJdjP2a63kH4NZ gGsdWWujbmAW4KaeZZgDqL+wcyl21BliVryy0dwPUzaN03LoH5tptL7aG7l8ttOlvuzcuE44DFPZ no3cje1YD8nl+NQb+gTXvezK4C5ogCyLy/AduOx0PpXP1AxyGG1ZGb2Dce1Q76qqtxnecrZaWTZb vQ1VZHOWCmhzz8FKOVbdVe45MK8Ut6Mb0orauGZIWnenVSKgJJEtUgG1/H69VE6kKfWrtlVvHKdy 8kZpOjrLYgVgdtldOCgkkS2A2VbRcTQuuC4QmD3NO52kg1we58DsTi5XwphtPZ1VMGaRkLaULmyq HZrnAGpOrNayiJzkACr3kKyVBeg0B9BGG7fJAlQRY50DuIo/ef2Kegolr5UFqBmDRQ7gchUzM5xs UlFPyRVdKwsQEwSWOYBLWTam6Nikoh7i/GtnARpMyDBtyNxGdpIFaKCZ3BjNCupjusSDb1CUT63I 9i2L8ll54bZXlM/UC7fVonwux0zDJpfQUj1ZPkn8FkX5tPWSvlVRPgd3qW2hKJ9NDPyWivKh+pWl +QZF+bRDYg13r8iTc+J47FKDLer6WVu5Du6GclTXzz6Taxt1/cRMru3dDWVc12/FaNs16/pZV/Vb 624og7p+1hMy9sGuXtfPcJm2cjcUXtfPOszENnLYYV0/61gpjFtuVNfPUmE/20Z9MVjXz86n5NTA t67rZx3PpIm1Lqxf1087NX0htzX8loZ1/azp06g6wzp1/Yyy7rYQoaqr62e9ca3yK7dS/EPJSdxa +pFpVT/7+pXO6vpZ7zrnWWmblAfQ1RpYu66f0bhUabdBNgfTcVSYy0E9Pse5wNZV/bZUj88m+dNx PT6bun7WUKSckY3r+mmHpM/OM+aWq9f1U3aOYVU//R1E69b1s05PEf1jm9f1w2SXASrlddm0rp91 VT85Y2jTun5qqpSR6r5GVprNnI30CGPdcvW6ftZV/baw91FdPyen1ZvX9bOGotbj2zzvwbyq3+r1 +NYpzq3P5liu67d+3oN6M7PxHd2r5z1YV/Uzt19Wq+u3eVaak7p+1uq8kjG0YV0/7bj01uIa2rhh Xb/VtfF16vqZQLnlNrZe8bp+1lAc1ONbZxvqoCAas/GAOU0mMa/qt9aNOgZ1/YKWVf2WT0Ysky1M 6/qtnJW2rfLFWFU/s8z6Vev6WetMtrc2Oazr56gen4M8XCd19My8WavW41vPg7lUj2/jO60MqvpR Wotv/bp+BqdKDu5OX7Wun7VfS/bAb1rXzyjnyUCKbVjXTzdJndlucM/VWnX9rM1215bq+lmfZmIY 26iun2Yll6r6WdmVJozLsK7futGDq9X1s1YMRStp87p+VophV4Axvduo63dsWdUPWRZbqOtnfWKD tPEt1PWzPDCD2bVbqet3bFnVT3uWtH5dPzNPp9nNLevV9TMfEgzLN632u3rRV3bpnBE908UpaYcs SgabS0yJwU0mqnftgmf6zayNUURgzQLvdWmLGnqa6XxYYHGaRdUe1K7LW3CKIwGlCSgpUMzOtCjh UwYmfdZhizx/fD3KReeHp3kyddeifMc7JdQEZlPBXJ52k+E93ufgvge6gjy+19rQEzn6yAezx1/p 4GH2+iHYHn1yRLn8ESXKH+EMUTm7KhEVbtQgqlfpMNGoX3SIxmTwTlyO2SHROo+liXZ9dEvcCMMB cUvM4a68fT1aEHfhWz/xGLoJEC/dnUvi9fV+QHSuY3PiLXbvI97O/Vc8z5ejvPDMZfkFOb3lF52U X/Al96FCcD2HmZ2+8Khfu6xdpAe525fHd8/Bvve+uZfKjoHW5222qqf7w0/vzk46euHfHfe89Xh6 /7L7cV86PJBTAT2L0Cx+8YaWREx7y1fabS+xx/bBsyZnyEGkdWkAbglGIQgwobThCRce4lgJSKmO YKZggqxMHKBj8UW8Hb4GeP4iHDSdKewlHrgPHsZ8OaJSOCsQlUHvlKheXkyE3Ve6C3NXPVJ/x1/l 4FHq4omIVjoemJN4RZRvkx1U5o+IXrIh3W5St4+c94oTmn+i+luxqanSR8EEXI19T2A0PvaEqErD E+yFrzzBR3/Js1dKXcIE3FNUUtPl9YTzsaYnHPVdwFePEHf3sLJm2RM6v695Dr52wayZr5RE3ZUF PHmngpCD7pEHRTJbHDFREs6vk8s2PDxapkqZOk+Bv1ozMvT+fow4zO0XMvCJ6OdOBH0d20tP5gTh j0TRT8ge/dJfH+wB+KIWEAt3DnxfQfgzKP3M+MPwZ1j62YiLAKBlcZOZl3ufX2kimqgT+QnXEPJn d3cvgB/M09JAj5MB9QU+g+OjIPaC2SseyS+KYfUFlC+PNyfyq3pUfQW0sPe8/OKSVF68gqXzjolo 9ehAfYb3XC2GsBewZ5dXflWPAHyHDoBQew4COLsB6kX4WIAX1yT4q0vETm484Gczp8LuIGURPKuE 4BcHQNtmC4ivQJaYAly1kQKM6ZKHNNa8jEIvcwiJYPDzhkTfiIsTbT7Fouetzxj4ug3Qv3u4C98G QQeRCRF9aKiIeZN7eQMLTz+GS1HmcD/zPvXduLyVw3L8Q2WfEnOt3l/hJqxsx8pyuJGWmecSRCN4 onfUBqLMYRHEwGnqKp2qVnI+tl2q96UylWBW96RMv20qWAp5FxV/rV6nAuPOrssrkdcDE1emzuDk 1b0MQxSFAFKTU/DzJiqRffeeILuNegD89USK2m+0+0odp+sUWKsuE0N/KV4FSQYWcaEHqAhnAMqu XJUBPCMGAPY++J8TuPcBMxjHGxYMQF9JN7oPJ+mXLAvArKUJXbIHaC8Csds6QHiAex8wDXiXOazz mSAQiNjJXZmpdAJPZ3DbR+B29oslN1nhEwY71w6k3U3uRKlS+CkIdvRRSF4XuPeB4gCeFSNQUbmX vaPgn4CkMScqUWM3CeAMMqlAb4fs8gB7Nu6H6jzYcH5/Rt7HGTQNP1l+zRwqu/I4h3YW1C6uv8DP SkTlAnBXfhbGO9MKGZoVidLpIUcs8wNghIuLCJgCCTSDYzCri6DC+dHunmdOTcWDKhxUj6lBsBmF r5pKSED3gFLsKPqB9g5SNwh2JxFVNS70zBu/KF0Rfe+0BBrzQVwYIfXl8KSFAag/hyJaAEOwK286 B2VZQxBuNDceIDIVdsGz1EIs+Lz/SJ1ikh3l4pcPL1UAV8sAFrvo9gYFRG2/hu+SeEvMokfME5DN BQXd+ZCAakH4V0R5FlWeASINtcDCzv28uN+BlHrE7P19ZdbDA++h5w27yUDSXMSqz8+AhcWr4AUZ 0QlyaULxwCumLhyWhBZcfVFXQJcmpHcNKiDL1WnBugg7lX40aHwfQulTPLhQikUrNyM86e+7OMAm 9MTHuvKEMppLKN7iX8bj1t2BMT/+QoMDNLZ4y8WCaqlmgCxOHR7cKhEVhHJbBLy4Ib0jTbx3eQ75 ys7SNRLB84jE+ZfHjTqVFiLgP3l6MVmI3MJ0IXTLIFX6XloI8ZJWEcQzDiI7uVZA3FuspHi9pAjg Ba2LIQgrYhB9487HAOayBKLDbzgNdBkSjkoZYwbINAExNFkNMAYN7T+rGHvVYkxHiM2OCcHqIbLK 4NGlLFI7YCAcNlE7+Y7u4ybnMYXobOPyO0pXE6yr2vlDT3vv6MOzQlkPz/ig8LrkFDrP0vxsTXU2 uebn2KPtpXmrad584DQ/u5obdZpDDbDm50K2lqH4np8EoZZF4/4xtEMJdp5LIS6gykBVsQIK7+QZ 6QJAnD4kRP2hcN9BIjYsyfXEswB/RmWNo+ZTTkVR39AuAarDgVZ1QJpESPpZjCA9I6KAiAbLt/c1 OJrn2MntrCAL97gfsxygLqDK/cwBZiJAlUBVCDANwHfSOJZfaFWDxWtOftHA7BPUvarzZwJIWOF6 SDUXxEwErOdqRdXBX1GmLHjWiEr6WPWSgEpXMLaXgTpo9YZCpzy7B7jK2iwGkQkgqazNeliW8YsD SYg2GxHRSvAd3YOt0rwmIO+GFkgf/rynRKPhpD2NSLYYFdiLBCTV96GO1jKI2zwPlw== EdRLrJCKpbLsa2BQHNKVy8I4tZvCNRdkcALNRQSlPXnG48cAxOvoxhA18G4IyTeOINI3R5li/mY/ +1YcJs9m+XZ+eicaFYWng1eRfgO9+5FsBbdjCnm94eTVbYQwy0E0pLrXEXFdQjDpPiD+xezciqaE qkwD0zNWg67NB0BKh3VxtFDQqQYCUngk6zyf8klaj0jxTU6OUgMKfVDeaK+CaJOPdpr7ik0uyGZ0 RHRxSyZlIh5AMUlgmDn4MxOUlVewzZTdhHywt4S426CbHoaMR5CqTVZfI4/i5jN27dYI5MZVDlv3 5RdnfqRYkCFi+oZwjPb+mbjZyVDR25UxfxaSnt2QcMefRTBeE3o/isoqeYMgEt0zeBp2RmJNqoUv GpDK+yVUyVHm4wMXQXiULzS6IOHZbEj2KAp/cuxKkVTSnaISCXf0ejFm+Ut+9D6aukOurCuar5Pk zbTPVXiWbbO/n5e43mLCTufujDuabxXr9VSixPa4PusOaepYYr5Yje9QJMdHevJ4GH6rcMm7GNFf 9iwy0+r49qNbeDu/yudDU/Ile0Lepkq7/UXZ5S0Va88vaL8b+IbRRsmCzTwvlAbp6mdt9/qIKQ2I h2NsGyFd2zdrf0GDsQavb/N6Qp3+EzQ3Wx5/TQBzgQ8eRMl1fDTz6j2w0D+kumt1x5PIpDimvS1v Jb230y6+nO7WgunErFl4O0ve5AbtWbZ8VzgHVix4X+zka/TbRb4WG16VToKtNnj1dZuLzg9K4IWn i9xP2j3iJ4OfSXht18OrTDfnU9WFou5dIObG8u6UhdEDL3G2uR9SWGcu7SqwW+S/SD/02/glnppI og0MLzKuz5Api36CbfLEIytWjiGFZqti5RI44fqGioPtLIC/SM8Z5UUQf9EI9pQXYfUFvL3pNckq r6L4N7Piu/JCtykO0H7An934lT13EcJfvMf7Lq/yKoJ4LmAUOUJkTLVwJSZuI7RPayfX8OcVDrv7 HoSYvZK2cm8vmZHYN7D7Rdd6L3xEov1yFUX2ENk7qUO0XUlge1c3CGwM81vVOrxX5HuBcBx6Edth 3MNzkssqtH9dGEfeD/LN3qAB9stZ3dNSiRMtrcKnvHouJhvtBSpQqxwaQTSCJ0V32kG8ahyp+zMx b+6x1ZfH1Hu+tdgblR/7Tch226RKv7jS8fAaA/tFdm7FsamXTpIKsdyJnlWqdFWEpuVdVCb7OwC7 +wIDfO9IWabcIfcTB/+KiX9pYq8snRbYrlyVAZQWTLbm8iIWUAiM+WYuKkyOS4/FyZMJA1B4ja2Q 1IlIJM22LyR1IlKsZrZ1IakTkequ3KqQ1IlItCt1QtLqYA0/iluKU9H4TFRCkk97crjrJ8FVdN4j z04xv6N4j24N3E8BHEBoVNYBgPEXeydl1c1F+dMPMZ2fbGfn+KQq+8m4A52fTNipVLzWjjaX9/6+ mVdAjPyaXQIsKNHbChes/JwNx/azTySQJaUQJBXxuBc9g0QVEZ+9CJ0Yspvk/d6ZQx85hvld3wa+ F5+JxyiHbgZ14nsJTq1tbtkMDk2NPF0ur97XBWsE4B4HaULP2nEHnXm6kvhZn4WvS0y4h6uGQKie rtzdAQPWKlgR74+FfEXByFhXnVPrKZHG/YovxPjmwmwhoqYLoVsGFBdjtBAB3Pu3jjszgCHV5RWn bgDCihgCoZXGgDyLehDhTacR0aESYGxFf2KAMFkNzR23tbeQFmMWhBgKOYSoDJ7e3UteBy7ki27f CW2s4luINIfoaJIhSu1KXWxhp3pW1EVGRA+wQU1j2aY8qIl28AG/PodI8zOq/Unqeglpm4cOtD/D 2p9aYCFC4rT+fhuI75wg6paKFJMZ5XH1zi8yYVUGYl6YS3Yq6QL3n2GqU+uH4PFcWFQ14dEX/DYi HX3d7CBZ6VOjbsHfMFgQqQ6inaCoDqKdIJ4zJXJh8eeLwIoGRGzv8PBNPEcbvOZU1R0fJtQFMLmP a9k6qxl7cUP2lRc61WCgvMDtk/BefYjp/OLRPVlt7CjGyQVunAARpeibF2H8xSwD99CF4um7IETt vkY3IN1dwHhYBLv76lVgXwXFRt0ZCbnAVVhhj3uU79gPo96uIpKVQBchnCsC8W6yV7tEPynJaHh8 IqXcRKAuV4LK6beoLlEBOqMgph0ReyECeymCGre85VA6AKxJ4nbPUHMRtWiD6E5F+WlHN4aohUfI vlgEkYzuCofBmyxPH9/EL/LJl75fMioeWx75YPuJUs/0VfKi/v/irnQ5quMKP8F9h05VVJES5qr3 BcpONINsyxlMFRhZxOVMxtIgxtZCicGY/Miz5zu93llESFKpoILpc6aX099Zu+8FDt5d/FwPCA+G J4evPqPQ812f9SIf/+VEJMN/fP40X+c+vnohc+vd93+ND7bl8cF8Vl7zmrqNZ2u5Bv/sZXolBP5w FP3v9/XNbhT0uRMcrZzJ9X47k9dj9O/SE6nFT4v4GslBeno2eKskF69wsz/95oe43fT3kh/E//Ak XrUdLs9WfSq1lw8e/iHGC/XbR8df7/rLMOqPp9/8Od0Q1D/oixe5sCivoHR7+SWUeEew8f5JvCj4 fDJKD5rX3zmpJTl8w51+Nfnbz0cXwzvGLx8ekKk8icjG9y59Ugmd2eNLAybeCLfLn3983j2COCdC zI5vLoa3VN3eHjjPF6t3b6iDmY0Xl8ub6fzD4q4TLP1w/NCfLjAhPaNrMM4Mcac/dvvT5S+Lq6tb Jg7Y9Kbbmx0e3a0eL89Xy9ub+d0H9pBYZ0+mL04es4es9J6h9yO2D4n4DP3x5QFdj80g5azj7Ai/ z9537/DxtONZBLA+gPgajZ/Aes80e8K+/4GzC+r9rBOqF94ZJoTsuVbsuqOGtbpyhOiFsfSJhhJ+ wOA9F8KxSVdYUvdKaMOmjSN7wz0Gyd5KzaTAnEzoXsvgMkXDRW+cUJlBo1WvnC3d0d9r7dpklZHX oykyq0o1HfKq6KoPStvB5mTvhWr7n2whMu3GP3Y8gzl+DQXvv7i5mV8vLtjl3fxiSbeW4YCNeC+4 5dgVWs5pqTUbBaihF4HT0tUiMMtlh06cfhk2IunQsoNW/dKIPoQAYZRj4+vuFQQZj0nFvTfeS8Wo wYPHpyPaNLXPSeiem2YGgEMqp1gIvXDKk65Vb4FH5dDerWXB98EISUpz3gmijQXM52QcmntJHOGc ox4iGEzpenQwREtuBdGClxGNI2knUHUQTNpeK+zsZRSCNi1NrzQhpXtDCoRyoTzoyPQWk1WalM17 5YOtrGk0Ie2DaqOwsApBt2lJdslDXXkSzcwFFapwyfI8Ny7tyJpoMibAg+OWvYsMKWhQQ4WsSKmG G60dJym4QjpnZWNMtpQxjcqFEe3QF1Y2AD3qK9i0dOSQ/FxHBXHto/4idBDeGxVFgyNJnhSUR0gM JRoYRHVImUYINJJgJpBvASYTCBIN/WCfADJwE/XBjY360laGpp9MD/WTWdPIChruVEcBkihBnZY0 SI288CTC6pxXVbhpYnkpm/wUWDx3bYOkZu/UEAOywWBCg4lcW2nZcKz6yYzJFvikH8GO3qxH1q2d QkcbcEzbVBbbsNlY03KNs4UYog62PBKBYoFkIy3gSOTOUJiGad4Xi6SJwQhaVjIGI++5EogzVsCi PXJTr4MT9MmFyWEJuARaTMKgFLx1pDkJBLdBrDKhxidFLY8WD71SHjwLvTrrmKZwQV+LQaDandiG NDv85nb1bHF+e3eBTVA2+zSxDp8t5ldP5qu75a8Yw/YnRydfZgS+fXV7d52+yvkROfPi9sfF7Ogk UOJ8vvpwtZg1KdayqGBnFyXi78Rc/leYr2eBCJJl+wfs7LvuRRdyiyc747kz/eRwrgemh9DrsiNx 6XLqTixox5CLNgZMUAPVxiDXMjoZOpcUmAtLWXiSkwOGQ0gVejgIrOS0HPFDIexqSthU63DfO4qO Gm4QaFARb9IBTaNl48Ropv2AsbmlCQzpP012FNhkDGMwHwIH6AkfCgNurQLiO0zLa8TfSseS47wr tPDYoKedpuFw74DIXqbPZA5W0HrhkE+b3nhSeh4iEJEslq5TFkZZszGyUHWKLHRdJNOTzW3uyiKl h0GOczohEZw3lYMMZAz1QE9PUbHQWaxCQ24Xoo7TeGHxKQdYZHoIRmYlNJKdlVFoeG0H0xZGg6Mw smB1jiJ5wyMzJlvbrYjssg2YfhCxECLTrDQ2KBxVCpg9bqzQRbBMIzYrE8Wg0VBe8F41ODI9hCOz Um2qrQhtFPbmFVlLnTQzGhyFUcQqc1S5KxyZMdnaaoFD7kAD0RtZKR8BAiWjzKHy2ZNvwD+tEo2u kiUaoofoI3l8zF2IBRWRTA8RyaxUeaFS1m0Ule/C6DZtYbR1C6MKludokhdEMmOytd2KyC4DwUYM NhIhsSgDKyeWtSoqx3JlhnQSrdAIGy5F4jQeUUpyUyEp9ACSwsrHIE2nxzIqFqzBt2kro0LSGEmw OkeRvK6TGZOt7RIkLRu924qt0ieFOJSKWlPRo1EAU5HtZfP3fPjaxUJCcZrW0Q4To6AYcCxKM0hX OMgjOIUFomMNqJHJHM5WHlWiFzEXQQqH2Oc8IjR6KEVnJubgWEpZdtop2h7AKhyqvpDQKv0yub8J wx7KiDjC0xkinmaREolOUaYwMgLTLUymKXWtx+JNmAAcTlwSwe8TgbOo720BjirYAcf20qIiKxwA ZyQCC2hpIm44qAnmDXJ4NDgqbjyKKqzjhPVMIS1RUeohcoCpnu7Q6qtOoc1p5wjjhlQvCRPsIDOA jA2o8zOZsKU3gdr3CidOopSwDVmbHPfToN0QYt1et6J9RU8V1BsLIKVsTYBy1B4DjoWZOFE5oA1P JAdcIBUnvOl8GUsAKnkMiiKPyalKBuSWolJZ93RblF2eJnc4mimOJkNvqUTCzqnUBjiUDLgrDEKb hM1khF9rqQffSzrxYsZgrW/4g0Z9N8TfbOFvmml/FFTsW8VcA4yCR3xe44iAyq4B8C8w4bHqG7gQ HAblwmBdneNZ4YCORynQ3sISNd3jkIupVNdOIoiIi4RJdD5sMN5elA2eklFrzxsH+cXDOSoNXFHR S9FA4eQqJBgYktwJEVrFizRHZoC4dI5CVlBME8SSJDJnDkJKLVNLUe2HbtQWGnEHYVfFyOxg8MrR QYTHT0daT3cYMBjvLBXpJiif6lQViwRDCf+UetiQ7t5srFpSrZOu1uhGTQ4u4rBOY+SkLGpeI105 y91gLgrPdbFJlxlVGumSp3qyKgQVAAe0BQcuYHm6moh9KJQjzBg65RHD2BA1GosWSqcujSclposm m+4Ci9YFCj4vEJwLY7JlKvFMvevI7NPpDWlTkaXRtR0Uzs19l3Z0FEYIgi5laol2Z4eQpugq0KQT FcpWxc6u81AUdmwEKVGbYrWPjfWSchFJPT6v6+IALGNx9GnLjq+HI/G1FdS4fyQZIw== XGdjIMovT2fXjwzUlGHhpeN/f6Mow2K5i23mS4O1CxYkKa+S8xrKd3B3aErHhBmzPgCJX1B88zq6 Ms5t1S0n0ZWpkBi4srPOrruyt0oNXVlF6x24skzhYODKylm6+aSkFJxDH9qGTHlLxjsDhdI0dtCU eCddlS1zphS6jJWk7d77GB/J0C0OPZssHW2iXMuCIXTyD0lX9dFhYLubDqPUhsPIsOEwwmw6jPID h6HYGqutYWxNPVpslYPQuqmve31O8Op06VJjp8ehoukRlCI5irebCHojRSWHocwbhYJ7QTn5Zn+9 pwccSMbB1s6wM4cTllTi45PClIX3dNEQ1jtqSqheDjves7qEjceLv8Ha2cbX8huMmseHRKRrP2hx fMYnRt09z4h4ugdj+/mmq9L5TmvwDGn2q5rMni/+jtELtI9nu58l0bJ5jteL5eXr1Rb7/fJi9Tpz 2eH49ha8+d1inlcU1ijvpUD9c3gCPe+/vVqeLzYeVf2ftjxT/8tdo54ip7xv19NxelZ4fHMRnxSO RvQvQMwvF9/ezZdXi7vu8u38lwWb39zcruarxRt8A29ZvF3d3i3Y29e374mDIaX73t7x0y+6fwIT ZiNW ./compizconfig/ccsm/images/scalable/apps/plugin-wall.svg0000644000004100000410000002715313246301623023621 0ustar www-datawww-data image/svg+xml Patrick Niklaus Visual Effects ./compizconfig/ccsm/images/scalable/apps/plugin-animationjc.svg0000644000004100000410000004435613246301623025162 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-cubeaddon.svg0000644000004100000410000003412313246301623024601 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-inotify.svg0000644000004100000410000005074113246301623024342 0ustar www-datawww-data image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc ./compizconfig/ccsm/images/scalable/apps/plugin-debug.svg0000644000004100000410000004101413246301623023740 0ustar www-datawww-data image/svg+xml Patrick Niklaus SchemeP ./compizconfig/ccsm/images/scalable/apps/plugin-animationsim.svg0000644000004100000410000002602513246301623025347 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-resizeinfo.svg0000644000004100000410000004163713246301623025042 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-scalefilter.svg0000644000004100000410000007451013246301623025156 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-anaglyph.svg0000644000004100000410000060417113246301623024466 0ustar www-datawww-data image/svg+xml eJzsvQmPY8l1LvgLzn/g4MGAGjNN3H0RjAHuRj0NrAWSbHjGeGiUuktyvamuEqqr7bF//UScLU7E jUsyk6l2q18ywEwmmbxLLCfO8p3v/N3/9tvffzl98/GPb7+sz8UJ/u7vlk9v33z++OnnJ3z39Mv3 77//7vMn/9bPfvfFqazOhfun6ZfDV/yP//T203fvPn74OX6EH178t3+2vvm3d9+c/undnz98/PDu i9PP/umXv/j1b379y9M6/dMv1y/cv/3h3ef3b90//unj+2/efvrqj58+/vuH85t3X8g1uIOubz67 /6jGL4v2y6ooulPZ/bwc3T/MH7//8M27D3+eP/5/Pz8VrpXV4J/uo//+7ndvv7vy+frx6++/ffvh 828/ffz67XffLR/ff/z03c9Py3+8+XD61Zs/u0/enP7vt+/ff/z30/z+zdf/L7ibbb+6vHv/1t3X t28+nwZ/k9Mvy+qr+ft377/59fff/vGtu+GqKP3b9Vd4xH/8zh3KHdW/9m/3X/3yW/fO799+/uwu y53Pd9TvfjEvrnM/fov/RhdanH72L797++d32OeuC/7HF/SP9nLxP89d1Tdt6V70fdf05eln03/+ 5/efPn08ffv2m3ef33769ObD24+nP7//+Mc379/6o/zv1BOnn83vvz/95ftPyYela+7sv3j3xt18 +hFe2O8+fvfdx8w3C/qmmwnfvM0euDg341DUo/+v/+f7r79+Y/7Bd9kf3n77l/durHG4uubcnrra /5BX/F9uDPA/vqyq2t31OJy+rKvyVLfluXeHPzV9R/8Zxvjtv717++8/P/3644e3NJDTp8+/f/ef b38eZoR/93ffv3/76R8/vPvsRgaPMdIw/urjN2/fu//V717ev8HR467Un/QPf3jz6c9vP7v59/H9 959xUQwFf+SmyT+8+Y+3fqqVdILf/OXthz98/Ce8vi+7vj21tR+Csqm601B2J/fLH7o/9TWfh0aI L8Z/3X9Zjtq7vv6tm2K/+fTuz+8+/Jz/r//qF5/efROmXV+dBvqBl30ezHOUJ12fu9XPn99+4Ot1 0335lZm+xflXv3dn3D58s3z81vf1d35Zuon7wc3U9x//TJ/pa/zEff37v9DV499fuWH57ad3H/wx 4df4yfDVb99/7z76xaeP3//llx/+9BF+RnLot28+/6tbkG8/fPOdEyb+n75894Fl1J++9xLIC5kL vTq5tf/m23df/+tbJ1D+8sXVA//h05uv3flPv/nj/3z79Wd3jN+9+/rN+68/uldu9L93S+ETvXH7 UL//2vfYp9P86fvv/vX0h48f35tL/e3bDx+8WHHX9ie64LfuJd2B+7fff/6EU9atr/CP/60ftqn7 EZ/YzZFPbmzwQ9/9/k/swj+9d8Lqni77j2//+PH9u+++9VfyDl+HK6O/bx/kt3j3H37zgSZJrhPo H/UO/0LfyN/+m0/+9ovqR3xiJ4lun/S34bif3X7yDuf03+JpF7cjvfvzpzd/+dd3X+fPrAf9mv/1 T+60N2b512/8+dvm2vn9vf7p3Qenn5x+/73bVP0c91rA6euP3/7l43dOVZATsKx4+/7NHz9+evOf uMo+/7e+K6erJ6AbXN/+yR01rCO5rV9++De3k3z9KbqV8KYbkPduNr25Y6K+f/PhzacTvr8fsHef P3//6Y0IzTf+H5K39AztV06qW7n95ZfQnOYPRqr/4tObb965rnaq3T9+cF9/+83pz/zWqSy+gOy7 bjOqT/M38C/w91DQo3KtLhrXWtf6YnBtdG0uFtdW1y5l4Zp/VGXjWutaV/aujeVQTuXs2lKuUK7l pdzKS+X+r/KPumpca13rq8G10bWpml1bXduqS3WpS9eq2j8a19q6d21wbawnqKd6dm2pN9cu9cVd pL+A2h21aVrXOtf6ZnBtdG1uFtdW1zZ/K/4y3bn9P7Zt51oP/kc7uDa6NrWzaws+V9c21y6+dYVr ZVfhs+pqbHguf5Suw2fvn4AvBnwO3YhtwqdvMz4Xfa7uueDv0DZ8aoPu4n7R07W+oJ++2Vf027TS /4T/U0bVD1gY1c5/B0d1wqcfVf/cysKNrR/V2nVrzaPa4bhO+HTjCm5oFz+qOLKFG9WSR7Zz49rp yE7V4sZ1wXHdcFwrHtkWx7Vz4zr6cQ2jurpRXXVUKzeuDY5r58azxzGd3HjOOKabaxc3ppUb0xpH lEZ18KM64Gj6tmDzY+lG0T3d3bixq3D8aOz8gPVmsGZsflhoCFwvA3dqhc3PyLZv3BO/2ff90I/4 nPq5X9xzde3Sb/024OIZ3KJwM9j3C07NoQU3O3p8DsM4TO45u7a4tg7bcPFPt+JKfFaj6yY/m93l taM7ix1VGlMa0cGsUVmhNa7Ozl+AjJ9blFu5uYGjRUnLsQNdjQuP2aUueLxktHANuoFacaAuPEQ1 DpDrDxyeGYfHDQ3w6NS43mSZTby4cDhwOdFAdDwEE64G1+04hX1fUz87owO4g33nbv3F3ZHv0Np1 Z2d6cpY+1L5rXK91rt+GcRyncR6XcR238TIVMJWTu5+pcfOkn4ZpnKZpcW2dtrlwIqxyk7J1c6F3 YzPO87zM67y57i1dD9VuVnVL70ZsWuZlWdblshbghFjtBEfnLnFYp3VZ13XbCjf9aydKus2pdtu8 rdvl4sbHSa/24m7jMl7my3rZwqi+4ONHeMAyboDbDW05NQso2nj8pO5w3ckG5EXVjFPcb0KuY3Wa k8DCqQ4orwbch2S+r2YTqnHGk5iacPNBAcWTvdpN9gV0q6lwrpM4ku1lRTHkt5VKt5VBdxIa1cvl srm2ura4wZ4vk2ujG/rBTYDeyRe/xzSu1Re/AzrJein8Fzb/WLfFtdm1aXPz1k2iHpxk8Wuk9TLQ 74Tu+v2adh3izuG+sfrHsrr56mbhtI5uNg5+2biZ6Tc2vyPWfsP1PeMk/wWWiz+Jm8X+4Sa6m9Vu nXh55Oa4l4VeijZu1tdeOrgV4MbA34i7LH8W/5V5nlwbvRybe3CLpvNd4MWBW0Z+i/daQeHvfHJ3 4i7LLzX/ncktvNEtv8EtQr9LerHd4ML041NOfo+6wHhxN+/uxF+WW8T+O/4xeIGIkrtFEelFZeUW vhedBQrSzd+7uxF/YV7QjoN/9IBSw8ukxisXKEtKP9H8iDj54rtrQWHuLsufwwl4//ACvw2jKmMq IyrjKaMpYykj6UdxolHEQZQhdAMIfgR1/GT0RjNyMm48ajpkMmAyXH6o3GABjlSJI7XhSPlRmsMo 6RDVZnhkcGRoZGDcsACOC4+KGxAaEj8cMw7HgMPhh6LFoahwKPwwXHAYFhyGSYZg6EAHgLtfO1+6 XjredTruuTXuwCUpP6grLahLTbh5D4BamNfHGtzlvcZWoA63uYm/oG43oa7n1ARcq15tcCveqxF2 VGlMaURpPGk0aSxlJGkcaRRpEdIA0vDh4IGOHY0cjRuNGo2ZjFhNC4sX1aIDRcMkg+R2rYuOEI0P jQ4NDQ2MDMvEK6TTASl5VaxhKAA1ERkGGgQaAhoA6X7qfOp66njq9gH7XHrc9Tdod1NnU1dTR3tt rXCLY3Nz2Wtyk1u0XrfrnFhtUI8vm8KJW68HLk76Tl5FBCeOO9Qaa9QhCyclNye+vH45uUk2uDnh dc/GyW+vjRaom65u7s/l5Ea1Of3dV/MnN7hBM7Ytp0+Lpm20b6OUs5q+gmrtoscvRr8nfX9i/Z/U y4Ftg14MBjYeWuzABrAXa5272J88gy9oj6zcsQvuMDKXqYvDjG6wo11Xg+vtDS2gBft7xP6mHu9w M2twWyu53y9oWS2oj0/U+655lbdFc6wGHoPS71Q4CivabxNqjwOORYtjQaPhx6MkWwE34gWNwwnV UW8wuv3aX6m/gAotysLbILjB4yaD2z7KZVQJvHJQo7pA6ohfsrgFeB3PbgCFTnUre2bWtgfWvmne +0a6pNcbCsDTeQF9wW1gNktBlkPHS6JFa4DsAp06PElIMrkGZvh7lVCyYmpvk5B1olJqYeuFFs/A o0pLyOkawGtIVtGi62jglSRriUZ11fXEK8o9ZUm1fkCBrDMcUVlZC68tWV2drq+KV5h/4g6DI0om IpmLOKpkQ7pR9Wqa103YzpzY7hzYDg2jioPPo4pieGYR3LqZScJ3RcE7oND1IrdgcTvhPuklrZez XsqKjGUJCypgRbwG4cqiVdUSkauiiGSlKlwXqzi7urC5qVYh21oqVZ2pT2I1K1QjmSoLvmGZ6meD nw8Lml9+LnhzrAP3eU0TgUXqqhPgSKIuupI7Xse4gt3YuN0NRKiin2fw8xbHOKxaWbODjiyNq4yq uwmRXINKK3+i0mwKJKRIPPmrF8G07K7eTVy6fJq2M2r06XZQ8nYg1z7htfuJ2rHkwVlK9wBoV5D4 8bbGxJYHiaAebZJWRVHDVovYMIlx8zIWU/L4cR0QR5VdIT27QkbUmWdU4thad4YuOUJIznqr3c9i sdwHVMwn9oKsgCY8GfEFavPBCdKiJO3ZoB/REpjRKljJsPemvWslKqps34Nbyn4n7lGdHdHU9wou m/uuOW0Pjf4SbZUa7ZaWzf8e1eURDZwZjZ0VvC/AW0B+wqNHoELrqEHp3bFvYEArakIFfUEvgVfZ L95XgEp8hQ4Dvz23wH6DHm21Ee02bwEsaMt5m+DiJybaeRXafF7+t7jToKcJjcMJDUV/lhXQ5riw s6FEy7JGuwQ9mmipDOh+wHv3t4LWDH6F1mqJ7ps6uEuNn1S9aurICa6cTv1pE3vSvL50AVSvSvah NajRd2bKyISR6RIcPDRVZKJM4ioD3N3F0yO+HvH2iL9HPT44MWRaNLjBhhmB8wHCdNDJUJuJINNg Fm+QnwM4/uQTanD8w9hPwEPPA6/DzoOuIz6a0ZaxlpGWccZRBhzkCQd5pRHW8ZXRlbGVkZVxpVE1 TsALOgFjlwj54295ABf2ABZNCeynbdnzTk5AcYwUPIloCvXsmL3qAwSeNThndm7A4GYlLyBNE5ok B15AuO4GxClBE6JTP+DMM+GinsAm+AKB5cCqw1/x0qehH9UpKGNOIy6eQRptGmscaeCBpmEeeCHT CNP40ujS2NLI0rjSqLKB8y9QnBunjpTdqTi37nfbe1TB6NQsDzOoXe9W/p2mHYaq8e+UHsHiXri9 auzKU3Vqi5Pbtfzhfg9/99VLHW7+DgqFbviGn1Tj2S9sPdnxf/jvv8ClvOh94V25jUBicxJ9uzMg V7W5gJx71917EwXkSuPiJw/ogp5PCr51kWM/XdFuPeejBRIvmNiduqkbVSIGPR7YxAxuHUgOFftk W3MwDgy6AxX3eVpu+lnuddn8oAdSd4MVpl7FVmFKolQEqROlGPESORqkKIdSSIqS9N5IbkcjbeV3 LMGtFKe4KklyluZ0yOXQPz6qf9wfRK49bASL3Qjo+nlwrQvM+C9TH9ihFyz2g+F16g== IeWg4szmgyauNXvYzIHjQ4YD5v10d3np7NDjppfZ8jSSHAe95iu7HWrTEG15sunhtod3ktuZeUJd 25b3WzJtyhVwgDu+SNyW8Xy84VPcLz5+eo46o0MOiRa5gp66ZI2gkit4LDAWbDEbZ2qAg0xpiMmJ MTxf3vcaucef4nxt4Yr/Fc93xeN7xeF7eMab5wtnSM+xP8v+3lLXcgO7s9nzBf1kv8cXV/Z/0hzO pd+Z/UZcho14HIqGgJRob2Re4BHq/lz1Qxk2/hc4Fl5T7dSGzoM2K6cSFF5vqPg7HhhcjU1Z+ReN P41/UdZ91dFx+u48OnEcrukFjoXX1MpxGkEo16LUFKrvILIm82Kv+73M4R7SkoackjR40JLqSAq1 mdTaXBhII/78Uo3OmsRVJF3FW8HmJ6CU3VTSxk4Lkbfsu/AWR4++PrI7qJH1sWDgcVM7pFBnRqnI BLFY3Xpt2asRTFexU9C7IfvVyvHBCyILnNJBcV/9WaI6UnFcGH3EqKZQuHGIfjprcmK3gW+k2XgN ZyMXwjbT3tLh7jIK8Ar3llqBOSMqKgKxon3P2/ajk+9+h74g4sZvJX6kJu8OX3FgaKPrXA/6AVgY LeN6mno450+9J0p1EKOCK/5UdLPjWUMo8SCSuOnXQnCr16gLB7g0xLWCRrlCnEsiXRjroh6uWD8r 0Zl44djKxvEV8svOHGeZ2EMrvvke3Z0d+2sx8gIVHrGqJADjHbjotL+gL3SLtNQUiLcwEK/ACyLj X8x/0VoX1VqD3soeAMCbFW1gxZ64MPyOLrG2EDxsgtcyGoGg77oC1EtAGkFtgHcM3yKdJAUATnwV pJEIUqNI/Fq90YGsYyI5r58I4toK4mYOwoYFTckqXFDiVI0DlDJzRpWrYuESBMuggsXCw1KXVxd5 Nry82Ni3gd4NMO4N/9w7OMq9kyPycCQ+DkAnh3dxkIMjuDfIubGwQfWw1lbttbYADuqN5jYpNAit 2cgIjS1atWe9AQVo8NRiKxtzR5CKHQneY1BNp2ZDaoeEIP/OEgEDzIhhGSko45rOabROSJTATNSf 9L7FnI3OZ8/I51R9MJw1nLeNzxurnyneIB8auyLMIQF9ZFAHsgFT6DaG7my6Kci2EA5kD2W3hykg R1qOv+e2iFtAhgTKAHksgw28BSnstNDWLfravaj6onVKs1e/2mZ0xrRTQuUtfwNtq5qe9fupstZ5 LbH1Di15p/X6on+nFg2yap3OG3Rg1NW6nOb3wMHIZ+cVRa+86hFVs67k0K1o5I1ovyWpmXikpjVO u5c4GlkU2Nsn6e0T9zYZAfIW9XY4nTtCe6rK8zDW5qIeP9RDVxR5NR85yEN6+pjT08cv0I5jPX3n TiqjuMLE2mXwXNRXQgruCbtNPFYjVobwC3g/hKiaKEwl3o0JzIYum/pGG7uxI2hz90oXCZRWoeC0 2dOG77f8AVD6iIkxspExa6SL2oaqwKqBUnmK9RFaCagrlNwqBZXXbJ5ULBDDz/CbgmjYRFmynZtz DsVxmymO3EShPzeGYII4wWUUrDKN6LBdVppQoAQDfZMH9p703Ky4+k2x9ReNEha8A1An1LgviHk2 BC0KGPsz4Ta0sEK1sIVGzW1UfrvSoHOJm1jNqhYFoBuJMhIARKLRHe58tAOOHJn2D8KqktNkZvxq 1ETli+3IYEPuFb5GjcWBTzexmbhSWGsqgCNbBWLcKb5VowpIaiDFufzThsEvJhBeoEJYoVLglEJA vdA/R9QOKQw6UTQ8BMPds0Rt0ftJKRzaoOJDIfEOFaGJQqMhLu61Jaczec1J4+IEdvWaldevyIXs 9S2veS2oh61iDpMhDIyBJvu3Zcu3I0sXbV6CTw/OzEX92Jm4k7ZZ2lMV19TBmAWxQ+xijFXVrLIa 1FUTrw1ef+CEG/HS55I2GmOzTRxpuOClBfHaoWxwqx/Qhl91+UuaFFnyY2IbVUnQdlBzyMtNXN+A wrJmEdmKUFQ5KNCQkCUjplClK7lmX0AMqb0DUXvNWz/5AG7qZE3drIeKdqTvqhMUMipv6ggNmLCA OS8j0LNRXMEAzgX5rNhno8GuijKcDL7UQgxZoQXUaUuDJ90MnnRhj8asuMNRkaUD+ziwiRFhzZWc szo1VyIneeK0nsB6ytVkCYbDetiHB7BxUJdQrPuH3tsi7PikPScun+D0QUMAjOdn0X4atW8IyRZ8 QIy+ZWCeQDUFhOu2W2CDYeTduWdELvmHCMHZ4ColT1HFaE5qhTQxhcJ8KtSYWk32QjqV4q5Y2RSa xRTK90QROcCWpBNCFzCcPjjCQO9+NpZSuOlWb5adYgaKvKLxZAHJCAgnTHKHthQjkxHKWIkTjd1o exda1oEGqQcNo6rBhSZOtFKBfhfTNmkxFOOZ2ng9nIuxrU7l40aGOVQcIHiuXZePDzxytJtmR8pV UZWHWc/Tp6+R3OTDx9MfP717//7Nh89vnWGSfdt1XSemCSP3GlZYSFkhhaVnLNcQqWyoMBlUH7VN 0H2ATjFqJbfKtNq0hhvbKzYTeO2lAfqaQhujNh222fyeGWKGDcJLftt+bcy2gV1erqHYQa2DMucq 1DVGXKQrJobWiGMYVakoOSxAQQEfEvDeVG8kzBgNcJoCoJIwopp/QdumRX14Yi39ghpwg5ovOToD gCtO4pxJmQXFbgXHZq8Ivpxzs1FFtVfsphlnCABOHmE7svnxNGNKvVawwFg4DaINKHkEHs+MjO8E N3398eNCA/8VDsiAEnwd9OyQLCo6dojjx2p2YC3YKGWU1G0oSyYwEK07EBkQlcHASdOig8+c60Dp pKKNF5JILa7kRikOOtTPe1ZpKcJCMRbS1ldJjUetvWCATiXkB6CBlw43O2FBGHEfnDkMwwAizVGV kAzBhVjTuukbvhpsMx5aOM4Ku50XlksLA3WnPiszbJ/GAPdnhmESQ69JDJgCgL2m8j/eB3JtOGxm v4DE4p8O2nzYkgfoq/WgbQftkm+g+9W+lQfN7Gg2nKi+FPGoaNvFwMmjUal3JfhXBMfdkWnVaVx8 4Og44f4njXdJk92KLXy01yQjwG8UrgH+kuQAaQ0jwlvOFOjYTdKzs2SY9IxTeKDzBHQEV0aPoxeF PSnSJLVA9iNphC2nRg7CARBoTl6WkX0t0uwj+F5sk6SEgoHproG8MK1KWs0ZDNz+V6Ej+PEfsEQE cI1bnNvaQADACgFucbvys3pFwp0LGiwNkuz0fp4LuPVFH8cHROoCFCuUF0+rX1gOmOOA/klzqedt BPTOdQqq9dkPJadTU4bfHktaOVEu3h+CfAbPD+e/e+ePd/1M6rEwXp/I5yOeiuDtoX1Tds3Og3Rw y+Tt0m+Wfqts0fouMWnUW90T7o4t7owFJoLOTob53bBxO6E3ozfM8BwAc/gof8/ncPqkN7fTYcbm 5I7pdzZvx/qkPJ9WW1WiDpFCwImnFUcmQgLqRfOUrYsopCOTu8O4iiD2FgXfh3EWxa6iqbXJx6kL pIadF2TnAzEOkN5AY6wnQHwBbjpAxhUw7PwAkRcg8gAE658sf2fz92zzi7VPdr5Y95IyKEmDI+sL ceJgLWnLPnXwwsmDS5Q8aBMHJWWQc11pZcoG2WvjQbxw4jc5kS41t0ppQspLQU2Xk3vAhnAF3vJn 5g6ZGOs1sjO8ZxKRjvyADBWr2X1esUeDPOs+f0ghECvrGMFqHNUy7BkQEXhGBBhRsdZQCN+I0Fes rMnMitoOzCM961+tUFoYBpLAQXKZN4iISGYlIxGii5432MBIEjhJBO8gOAtMAQYGwk4RPYklKLEU JejTpB1TvPnFzrqIbYvR+PaVoob9+6WaEi0wFr83GC3x9W+K0RJ/f8umwqBGgpgHyqkFMVgrwWpt xv+fw0ctJqiqgb8YJb5P3sqlbx0lcHWemeWYyekpSVyKcoKjPK7jNC6r0OpG7K3OFpNwcAd2Q1wh R1qPXEOSflMZOBGlYUiwmynPgDm0iEGrZFahTvmzZBTCCEjvr0nQlTseFJEmPW/xaBWDXkN4WqIw IQ69MtvBJcSZY9CrDo7C0kbO2KWc3VmjqSQIKFkIJ5cX7CTUvf0WktC95Ca/bYH52yunnpPB5iUx +Un8CiUzrQHX3ZRovjCNwMAp5v9lytnLHxB7DuW3PC6cxUutvNqqfANO/5WfYReJdhK7i8iJbQsX IAeso5zikFU8kNmlucWSrbg9XZ28XyO9O6/sAQafp3P47HI64Ea00aZbZJNJ0twOSFw3B84bg5YO NCYcHKO4XshnFwuxVt948IvHPvHYF75YT3jwgwd/QfCSBt9ob/LexaE9cz70YjLgN1REyI3H+knF yfACdW85Jb5jDWfgxPgxCvMvjG/nJPl4idmFFCZ4w5pYp9Ocp3pqKKcUEDGMNSa7s62xDSIIQdy6 XduRf6ojVBsYEr24TZk2Z9tiG/CLvNNoO2gX2wz80bP4hGme41WR2S2cbTKvZU5LhLNhq+sC7I6U yDg5I8m6kTgmWTKjUpFo5FINFjFW3PWQrh7r2/kmj/V2g3v+KdtS154c0AvB0luId+XGK64pp1dF mhXklasIRG5jLZYvYdq5q5ykwSs1EyDax4pMR2+7jg0WzrSzcAZQEycYONa8IbbES8SYaOHdKWti C7oFBAo+QXpbGr6YN1HiisZuYebEDdhmObJXctaKtVXUWpG8PYjslYGdl51aLWS3NOr05GA4+UXJ iqEmflMP704DgXkA29UF8Yx2xwEvxVMa5N9+0mEiXevggM9v/zUHVIFR5PiElR8AzdrSpPWn+RQp oUgDURq5YRVJQGohtWiMiKC3lAhaMKvWbI25oIPpSqZTMF8DMtiQe4NaU4HX26YW9YbGO6T7RNhg Zd5GUwt2aYatYYkWBJxggkeNL4S0oEUtMmwhGTG0S9qsIPW4k6HpixbR8ZyliTCRStgsCqxf4z+u 3G43ZoAdzz0AYkw8vKPwiI9SXwhU5bSvneO+W55bZ/GdBn+6oQ5X8eiBCPHCwBmuutIwCmXs6VDn gm7Kfbs7OxuzObXDeRwqA3J55gGI8uRceS6RBqExlMaLRXmcqV/419Wp6fEIpwYTFiqTC/3kr/IZ AxiHoTdxGSD3vepMPeYvfhztKZ/8XT7nqN3CECSu0FOd6vpMecH2NPf8+1PSEeZ3bz58/fH/OH14 ++njFxD/iYe9n06lvU2ooqJshYQYw5J6BH70JvLu7ImRhBPBCSZgighy78TcC7FPLSWIiP1ppSh+ oLpf0P6s/rdHlYsWaLmzgi5Y2OBpY0i0LLFanlrNxkADzVoNGgQNPGujURqt2mjNU2Oa3slwwztY LiMwpsTyI14DwzjuY8VK2Dd2Y+82LHgiL1bKjJXOhA0OXHzWuWfZ96gIQR1586L0UuCE9YtJgNhP jSHh3Nsizr3SzIwOlF9NpkQgV7sTmnUv6VBKBd+a2hVhPfMYwxXms/nAuZ4f6QMOtA== XdLSbsRvkOlBoD/JDL9k0khWUqU5SWEeJGyMkGDurxMyWkrGSZ27q2VlBEVw2KkSSBrbCLaRI2r8 SVU8uJ4FIjMWPTBgqhhYodRwKEEma1CnGw7mDyyFJD+ZquNgQGFR3GWjpAx53CXtKwNX2kDkpZsw gzIwVL46Se8GTTCXNaY2ebTlxS3uxq1pnzS0YoJQi/lAC5bF8CUxekwLX5fLX4NLfYS7cj+ewKYO V8l1nsKmzg5YeBJTxR186nAEnHsKn7rFzcEN/t/7GNVfefJ/cjz5hG54dGyzo/tXX7cPj+9z1u3V EYZjyOvzRjis22ePcUrElZj94R1ne5X0l36qfz/XLjv5t7HwbP5tmyrOO+qrnfZqp73aaa922qud 9mqnvdQBX+20Vzvt1U57tdNe7bRXO+1vwU67ZofdsuHuttOWd+/fffjGGWNvvv763Zt3Poa2e8sd eXy1z17ts1f77NU+e7XPXu2zv9IBX+2zV/vs1T57tc9e7bNX++zHb5/9PShx04Lp3qHobSh5y6Vk JRc8VxWXMPdcNLfL/EtBqSe2DuC+CuB9/3JnLcG/B16x+6SydFhzA5sZVGAGBFy1OqBhOJvsUEYD aRaqLlMewN3wxYMXL09K3yeKJOFCjEjhwzzMcRhdnYrwBGlzqxgzMhZAbjYmMiflMmI2I5yZVIoh 4nOsIz7HVW8nLWiiPI57onu4KkSZpzG5tXBzUmvarDU4uL2YqsmSNekN0vqiYnbRW7yqhIAh1G0O NZujWs3P1Vqf8Hj4gET5eW9q150J83Cz7OmVZPlczVO4XfT0es1Tus0XvclpgNu1Xf9LbvMFb9Hf Idy8xSfWr4XHbvJSRvsK3yGJJSoERaIYpZN70J7ItUSphxoi2Al8t24Loj/8vtQgT7Se4cDblysi nLJQ1LGjj2gM9q6mlBNjQ5Mw72YKzPe0AyekG3Lo1I+1r2YQ+7Pcqa4b/kemtC2fY4vn0IA8rt+L pkCHu0+lvOOAdLgXskGG3s6XI42F60pFO32kcEqZ9LBDhn3f75E4PocknvjxFWGFH9sP40WOHx/W r7b3d5MYxyaa5lNNhdEbrQRIKHECIY7S4fgLU7J0WzOSBicQGeAQgY5RGKVn6J00ReKLlcpFtnaR XGeh15hepZBkdlSZr0GHHJOSJ1dKJGBCSZ7WI9oRu1NhC2sBPVP7pPGni7SdKRT0cqXBryJXK0Tq 0ruSUu/Z9vniA6e6XH7gEg/8ERGDhPKQReT0oDeTcoo/SQelke18xVM3Xp6SbUAuttLd3OJuiDjY Sne1xL7W+QWNV7G40/tT+9R/b3WsmPDf+2R/wDz/VZnXWs9Rg2rsggosWRfBtvDKKinirKdGKrg3 +lU93SmnT9FEiSf4WpjkqNTvccGcCq4GSUrjJz8OlkUbKOyiZc9S1YRK+kVvF27EhHIFmK/calp+ +dlaKd3sC46qv0u4OapPuFF/n/D4jfpNa8eh9XIR4w12xdTHZ8eLJ99jcGe8uE6Cg/uIMfcYaKeF brMdZ5k3bDWfg3gx0dbejhcHDtqLhgc1Rsy8s8w4C1GkOIkTPxoLNnUWsdJiQRTZx3HC4wVxZUmA UqblosE2LhiWhF37u2AgJLHAuISnNRnS6p0h8CcYARx10GFPgQK1Ce8N45Ab+FDBk8mK3bhDVMBp NBFhN+yPRnll/dHISZRXhi8zeikVYXUzno9R3jCEtyO8wdS6K8rb3RnlFXoGGd2IEg+igL+say3S ysN8T5T3YqO8toqY8luP/U8xfmtZrq7Gb4WaPwiSeCoGWhG7EQRiRarSiogh4OoTvr5Vw6JforcV CvyBaRQlfttz/Hbj+G2n8VssP+GdC776xIbR29aNsK+zdsF6E91PO3p3aDvDy8ZluxJeMrrj9Xa4 5lD/aY/aTzXm+rKj9kNFU+8dtxeNpj6OgnheNDUzds/IN+zHc1kVY4J2lXeR0WcsPS6HPyjPveu6 wNaT+xC/5a+w6uiDrjo77aQJ38p9SN8aBqde0Adtc3abkKnJlftQOIfcoNAH9egrEjcRn9DuQyqV PHqVgj6oOrwmU/k48yF+q2hcf/Phyu7slKkhfCv34Uvldu6q/ZZ9rgawe/dUnuoIOewf4o4mrWBQ q0KUAaHOblgZGCK7UNVRiLTRWBOtM4Z1YkMccXfWfH2kQ9foqmn1aukpegw9J3TyLOhGR5/Pir6f S6Rqy7PmW9sDLN0zpw1SeLLSa6v0Cht9tuYK6frk5+Drj+IvZgOdIvpPwtDJz5U1MtHL8B4Csy5V d1hNdYeRqes7pqlnaRzJ41giq0yGPTTtKTI5lLXY+KrkumZmHh6VVl/I9IVGv4oojzdlk5yBaSSF JD9ccB3xRm7RZjIJW6QttbGZ61q50M4cXd3IVyjU/4HyvzFXiuzNSoppqDD1opUCU8kvLfeldcRk XElHMOo84ztZWlL1dQT2kDgTC82rUM7ZMo0LYvbCETzU7tk9sLMtY4x48AnYlWzXsbuj4AfYB+qy YTpaZJuuz5JXaKUmsTg0pBpvG1YoXr19TugAnkGt5hX9whuXkSDzRaRWiWUmaiziS8uKtQurX1gN w+oYocSqVTOSUrWQqbJ6pG+gxkE1dh/VhZIysPBUTYhoRIWnlQpQ2JU2a/3fQTlZY05uueIlELGC 4WGt5dL14lOKbtfVqdJSIDtdifQEbXv26yMiszv4B9ychaKw8HR6A5IFMnufYTcceJM+D0Szh2yK dX12i8koNo8filSTohw7fxynvFS1Z/orhYKv8LpI75Wnc+vrePrj9P7TjrgVR6fZnYbBn81oMy9z vMcUjzGreIwRpQQaQhT8kmbqiQ3h0ZuwmITGqKB8w0FIDETCLkwWh8pmlHoSKrPBMgmXlVEl5w3i Ys5BC6jcrt5hzQmqONGgn3xGTajCGuADissL15jo0RW+r8K5tQWoG2RRJ0jDIHYqw1mwi7tHR4iv xElQ9hqdXd7JNbMPG2tx+tgoua2935Lcj1HdHJSLKCFJVtr6OR1rQBXGyyovgb0sZqm8sRayAKom BI70uo3XcSRoVtxTIfOGI0sKKllHoLgCxd2b9wXGKUCJFxCMx1/dgBkvYD67I+MGjsvWUaz7ed6F YyMVVDY/A++RM1AhtlBpo7lOtR1KB9VR6aBCRXyoGoSM25AtGmRLBqUFg0hhsvWCIlAExKiIuKhz y9yloZQx0sIKJW4vom5ARzSL4OpcVNZ0fOQgZCxiQWhkbB2dZi+cuCL/hV8VK0NXGYbfZ37/ITld 5cR0FUtpG2oc0fcaR8xsuNEGHCWF7sKAGF4oEMXKBo6V2UiZTaQrTIVGiZMRaE647AdIKjLOWqJz NZUYQwVGW2yxZpSdlNPAkhqQqTcdqopSfQ1bYyMuBmqrfa5ac0PqE2uV4n0lz6Nq1KF+sVbogKiQ cVykuk+a1KcOr6Skh3kNB/Wlr7V8XWoeQbhZ//oJ7VowhgLYnRYY9tbyZqIWAwKV41JQlbdqgM2a JaoIVWqoLLgp0ppdBeeiSbyMohoa+DR1u9jwsdW76rZlEvSOSdAHdPkJqFBCaStToXNEjaKkKSX6 nhbdUqNPEUH64oE/wpNuuNK5eIrwpUurlDa93pGnt6w0dWBY1OUxJG3Pq37MsM5BvohundtVvvWk sIppcPwR55I/oZE11CuclkrXhLJQtiBUZarV5GrVaAFeuIzaJtNmbQt7K67WanrRqk2vBzSv16jN URuTwYuHkIYRf8Pug9DGp7aXC04bPDLcrOEuGJMFMUJb4hNuFS3EeAWgPF9TP1FyfSnbl7zDS7Vp oXWqPdFpTfUZAxoexe6vqAKWuS3KohFtKL9ve5B7gcX5KhWwPeYFj6gueGGKIE2UoDVGmX2cufeg dC8sZ7S0fAu1IyokovCNSkWQMCPB5aUTiQERJVRPHikpGjVT6SGmreAPZN1Lue1aW8utDw3G8Jij ttm2qxZVZRpmCQFXm8m1/qmN4K7W+NibH7EBYmNkwQaJ6tUDh8okWDZGKFXBqMbAW4mbWZQqRc9q j7IsTQhti6rdhlq3nda6zVa6tYVuIUmmsrVu42q3JRrFtuKtpFjNPCpY9xZw+vRc+9bnlLVcATfU wK1wDZUMS72wG5PaqtY92fdu6c1SPkjrussmJjs8KxS4bqk12mrT8KzAflj7iKqpZYrY5KuNsdoL h7Xtl6c3srtv29pH1nbqCkWDG9Qbaq3uYHcHy1umv1jfsgDiJVACrwILlLcr4QZqmxdEqBTdS/5g jN7O14fOVYfO1IeubYVoUyM6VImmlTOzzBijatG0imQltb46kJSOlkVV6SRjCJLUT665ZKCxe6Ts /RwaSJUsXoChDVHrk9ZlGkoHoF/Z1jy14TzkP8Kj0hZWlVYYNPVAN9OCKbgASoxF5YY0K9tH0wbT +qhxCXGIpEwbSZvGSJ3Q0kcZNxCxFFq2EOq2a2u2LVAu2TYftOlqc6sUVArm2/0mAEtPKPtnti7f 4OiD57TEOxa8WSP5jigQwAEKbzdW3sHklL+x8o6lqjuPXWfrAz1yDPSNDRwZObf87fNIJaKKcycf FVLhig/i3vFHbXPFsF7kcI95zoqs66yIoBW6ocoWK1suzQSaUDQBJ60+LmBfqUG+cvCSyJ0UayEx SypK3uAS7lC9ltrkUp18UplB0OAVBYwXOBdAt0eBsklwwg0Kvx718L7OYh+e/6gwdlIDbi+xYUE4 hwuGVArUNmr04TTcV6PpmRU7okR/jkehYk12a1gQldCGt1ahGKZkxSQoJGEhGxSinbhj7V+zwdxM 35J92KmlwPQJJe64ljyhRfIEv4luuGn6bbLF/bDCmtuUz0TZTATO8rW2By+dayy0vWKUpnc94Pks Vgy4+FBLKciP3iAUAkrB4hSkoHR5FarAaBCI0AqCVeh2dTpLU6fzapVO2MUOdnEDgmaIYTvsgBdZ 6EUCFLmkuIv8jVy/jfgmkkKjsL8BU2YUgx5kCo1RuCgiBEvd4MIjp17wJG3A+7/BZIqHXHGbEJ9m ix/ki1PG+FrB7YxxC0xJlKqH24/wgFPcIKNbxv8y3tHm/QFvtfmu5sYYVC3et/WwbdmGCwpUA5fK 2kWsoSN2P9bdU8XXPloqCWpbb9oQtVGb9UTMprn5Chz72LRdpEXu9crUGQ1u9hbtHMlYwaqjQHV3 KZZk0VQGUVWym71lZ5F1sYfKo7M41jd1qofioxVnp1U7F3rHWKzORLgH3IA8nSFaEcdmybPaSx4Q ewayNtWtdsVGA35xvKzyKydeAnOY9JCb+1FF9yKa1MH8CQ87hzvAF/vJK1OVzGOJ1Mn8LLgGbol8 hTQ7eX4Cx4E6jgONHAea0GTXkricVlUmM7OJAj84I4En5BYlV5U6+ywCcOQIzIrOzEuUK0nQknbo IWZRRRdmSJmzVcp7E/cN/AgxDUI/jZDleomZXvy25sMeXtPbU6D4LZc2NL8ZN8DbmQ== bGj+8w03NCFAaY4IUPakW0IO8aLtJQ+Ij+vaeGqKq0l++wqPD3PlanZ/765w9/EdnySPn0oq3usB Dw/GuNvtZduP8IBr3CB941nNPGC57zHf1SYCcx218bAN2YY2Nyx90rpda5PWJC3a9YEBZaFZv2EU LDDR28201TR318C3Hx6TNgnBDdoEydBpY9VS1dgaDI+PcPmUjHAqNBS8Ka/Pql08C8MPhyqI5GcA DcN1zKLTsvpcK5tOxS5Q4dS5cLxw5bCGgNBp37tzQtzdXvKA0615+JwZOsLVqarT9eZs1VkK2cka q6j5WXowPyGZnNIh8ayMZ2Q8G+08rGkeJjNwN/fCvIvnnJ1sMtEqEHapHW9TzC+VYZiiAFpE3bR4 kK7wTOWiaEWWa8omXMYplxHdUY656Z502TjhsgKTbylsoZJqWaovL2UmIvZM5SUittOSMUUHBvpz 2w98wOrpDTJvZgJEBy0TV4YoyHw5bFum5R4LJFvsnLQYoxiDIAfTFMEm7lBpAcIZ0J1iu4YAoAQA QnycsaRBFYk1gEhkJruxFV9WUrFkAiOUgjCKkdlLIneGHWldoK2rIMNaF2SMJYPLSZcqEi0oWMCk Tk0ZuWIo4SKatTkRKi2TIZowmc+LqUsCfXNCj48rSWQrBJh8AGk4j21b2QjZ875OKUmM9z5XeBAf qeKQlYeby3vuJt1LTCTyCT7uMEN5bp2lfuqac9HYjOuXOiDB2vnGzpi/VAksXYNqBIfXECHmEfkg TwJuf+QojwXqmmygrsnnQNNjj4QjLNygMGNJ0SUk3AUTFivlXGoAMxMlL3Fi1pSFUhA17bDS0F3H OdNTBEleMYCFdVoA84jS5OmIwgddV3XC4bNk+EzR6QSGaStmS7XsZBFXasTUY9nJEJ8Lyk4m+TdK uGRSBkKyACUKcHwkYsxUxlzjJtpHIckpEdOodobRpjejJUnUG6ZPE26x8KgmojmrOaeUMr5HTmyf NHWUEkZLZryRvFjhvRkYhDF7rEYYtEKTZPfES4E8y6a+C6ecOMEX7/q29EuSCdxxTa2ZKZfs2NHI dQdkuxVEmcDKlBbxyllmucWkltHI9WbkPKMcog154NCI16z0ONt62eWBX8sEr6JM8A1MVrWE9kJg T7JT95ngNpzXazat22fBBPI2TaqVtFpJ3woJXOUuP1XYWhlaBgZbdge67CANuA2aMWSzuu4hHjmg HgGrBe9z4tOM+DgbPh6lMEaBVWDbVjDUAiFf/9YYpTwDXYi2QmaMJk2wCyl2AfhnoX8W/MepdqDK yFNGaDpMurvAHXl3T6KGgYgbxoySXU+b0WiXiMVgTjDlNqDOIXV4Bkwg5TSIWA1gBxVojFlg4+wx YCCGDJiIO6h2LDpxChzIpBxKdnmSb4gqLhymHOYTDnMczBEDM1gK5ojW2f9LTOuIxI4at59M3b9Q 80+43m2oA+P3YAL4FSeD2fi9RPAlhu+j+MT63nLQw4Y9tu0CnKVS4rPkHBXJVLnWcL4Q6a9wXAaW S62I6HtH2S3p5gcuVTDNRG+/4S1TgcOO/IH+fil1jm6UMt38TU44SRaN6DQ40fyN+cwbfy8VXpmP 4YyuQ6lkyoPZH38F8r8KWF+plWWnUQ5I/3NBepc8E6RlYtUSap65s3f9vDllw0dWF6dMNKw+LEix V7DO0GOO2WQoN5zG8FdlOEwjRWkwKgBgm0TF7pXAB5VswHQ+6o3a9IO7f1TGeietfe5e5bSsgWlI KqdJDW71bcxRrRBpAUlXEVA6hklPx4kEQiov1WSi2isMf24Z8czpA5o8EEqwDJovoAVYQJnVbLGc tL5MWtNKC7DQTcpNpfjvgP4+vq1ix5U/gfq8As2YJRozNHHJDcX1ZLSaDFy9mbhUjimUI3WaSPDE DvG866BmOpPIcaAw/gjID1bhirD8c1bnOtrVdV+HhD8+bO1ZD2Tqg7xKdLLzORz+A9rtnbCSdMpK 4jlBxOivvT3uiUA6ZDFxX+/dh2V9qlt/mGC5P3gc4ofzme31CUlJeieTPCy3ZkixwHLdCzcZR3+o Gk904El4gWM95E+oc+6EOkqZj8DzFl7Pskfx+ILTHxWpOxmk7sI+wA1rMeMWLZlypcJaa1x3lK4s RuaokLJFjU1xEyC4C9hXELKYOwVnjbyBSG6doFhCCnPDyKpeN5YZ1ItgC6KkDMCSmjwrQVVgAbbs zpxZbCmehdF7j1RpBlsdZkfszZl2FagBa4nRpW5rxOptXBHXeJ0VwWKL/dpyvyPjWQxUk8GaQj4Q lL6OoqLuqn9KzMOvB7zngCX/LAUdz7yB3ps1IC+/EATO6sfaKOWO/FjoxGp8EglmFhCji41drMbm SsIc2eBH5gH6asPn9ZaJvHgTkJ6ZgE02ynMUPGIknzbGyAH+6kzrd23ItJF/jmzZTpLZDwoPCOgN e5fhYV+T4XwxZAAFm1olKC9AYlUpdL+9dJmmNAeBNQBNe+UO2DMG5FoyHsaXoK+BKAYkw8Cmb9nM zosB3gcXgc0msG6CZzgKcnkF07qjJILEQRDzEcWugcH4jILXyHLPbU4pYGfAFDn4bPZo7OOLi7SK F8n4kcCUXNqXMgqh8BAIt5mkqcevClmka+JUStxKWc7hbPwb7giBP4Ez2gN50RaQyqZpy2UKX5K2 RWsrtAXMUgzonbBqQ0p8WN+y9jsz91qZgaCT0AayoyhzEjoOktNGhTUKDCb82+tc7aJIbxzjNfFd nbwmqAsa07UR3eNorkWZxIFcnePW6TUbBElAj+xjuZEDLA7ngonn7g2zOKprS32lwCSFjYBBJSWp qM9vjO2GJNP1uU3zDSBJpL2nddcaHH7UP7GxeQFRTvBRG+9uE+ToJTJtvqstcY5zvq13NKMiAP+K IvyGBnNgWjcfkBZiNX3B/1d53vGxKqNE2AeOgZZwL+ZyQUF3QgxoiqoGxEsKk+9TX597gMds3jZr 9Lbe6m2iGLpUuBHPpvgzxZfZMWXvvqJUjfaxKWMDmMIpzOFNVFdKAqk2+F1rCRvhUx4tF5en2hQW 4toQcAmpskkEMlWJ8kVsRptusUriT1LNxtaziYks91SWbNpCxGhZ6uIMWTONVrtplWdGqLbkEShU J4jYVScthpNp1u4Up22prOYxp7lwrfdsn0z8JLryQFm+KZ8zPUthdaZHrbzrwrwuNEISi++U2XlC duoJ0F8oqdGB1/nCzM6SHV1wzWrJka7Q8xhEdye50sBydVQhODChwqwybDJCaFF2BuRsEBYHZXWo wLhmak6obhi9YfKnOMlayClsUlRMZzHC3alQCVFeGSEkAkoioFoaY2l2jHAR9MQoXPrAMAoxQeUn QWCYYJ+bcNQL2EL46jfS88hoBRMZoEfFPyXpW5A0FcMzauWlaU1CPdq8/hXgH12UZ09FClolReiV 059eBzaGkXE6kovvZhvwtLP8EESaO5aWWmLm98YdDcUYE1RA9OFVNovA639PZZWj2iq7mjjA9lNv 4+sJR7cNrt8k6IaEDD2iQ48I0ZdIKzwsTwvGW3+MH96XVU0Lq26C+oOovqqQSwuldCCUFjrpJqaT 5hbIPwKZYMo/uHc0hOo4oTLDrKiXgKbI1T7YzMjaEgJqP7cJnuLOfPw9lS/YwHqGyzcOradWR8bm gAOjQzDsS2J3XMeuu2kFURpFo6nQQX8MK6fY5VMEI2WzxkraDjIH4loWAW0xH+BjLGVBCq5Q2xd2 rAU33SYZ6zX4Tmq4arWmEOec1TrFuGWIYMv3oJVzeGWDWYYItnwxRu5BStStZKU4s+Rq+kdU5F6A iFvE/B2yWLuI8ztT75MjA5zRCqa2tw8NrAGuyAgIoW2QmMBk4gGb5rgq+AMU/THinQX2Bgpko9Ir yEHBeg6MFdy4pl7NsRkuoso1VKVAyMi08lhdDwyz/OiukGCABALskbrQ91gAblLkRMF/pgK67wZf 4Nz3AN6/j4Z0fM8+o5d56L3qNhkG+pF5bwIT/aC7dMs7emM46aUaCPHPlYDk9BdWL1dWQEghmZAw ZWI4gRR57rVaEHHWN6wbEZr0mo9fOOn3xbdj4piQhRKTuAXymDkmcesjEjfFJiQUboHAbdAgfheo 2wJrGyjNoRAdClHbIDH0FypgR65JSNBuzy5fJ6FwOHZGBoL9pxHLH9LKY3WRHdArTVmIExaupSyg OgPHCVFWHKm/2gLZLLYxKiCQLUQTlRGwpe5kjI9GeElGWMaXRtePLY9sxSNr0Q52XGVUZyFEcuNZ IRvShmXdBXWCAwk8jiGryjuTvSu5REokSqfyRlBrirwvaI9JIlXJaVRebmBxdy8YClz9M672Hi2a Shft34NJ85Twa9wqVmDSHNOUAt43kzYobYp3p4QHXrjgtyQYY+jf4Sr7e741mR1Z3wn88F2mybae MsX3ZtNP3oEr/0z/IMhvdrzkS1nt67/fLHgPAcN+rT66qf98o0A67IoWJDXSo1yEsMOnrBUVR/yx ZrflZIoZmbJ8TMTGdETGBIGNCaObO/oKnNWBBEc5OtO2ZttumhOnJ0S0O4HiM27jrg2Zhp4viHh/ esOlErOExm3/UJohSJhE41buWpG2FNEKEfFoaIFCBlm95pttekqD3VvPf6BFC7Zq0t2tP25w7UOu kP2kBmq4H7RrwLe6Pns/2jHwLfwD1dMSH3wlBbrKQFnZKJqNP+O6Lugnr8azUzIzNWGefyhiv5R8 vF5rzPhj+upcPhGvdu8VCKGj1LxQiqtr3Htdb4gvHz2Svx5TlYyiFzV137lyil7p+TxbCjLgnYzj uXH6nen853z7ofBDNoOv+cJPgSKKPpTsoe7YKy0ZehdO9IoZ6jn+gKldNhVvIE7uSQkzEX1nGDI7 TegSlJ3wTF2YSSpA61qmjBqBkXXCFCWMZgFfJwi7mmVhxxi7XsmhRt4xEWwHgR+qY++tKRLimwha JpnqwqPXNoQGHNsIbTpo8+0WXNGlBoUCvlsCBXGV+UYh3r06YEMWHvKfblzEJSRPUtSoYxc+ue2p sMDKDnrJxavYD0/D1xFWQdLyAl7ScuYJZrJQhrA6GttWYZM9m1i8S9L+aRnBlpi7LmEGKyMOuzIE C0CngzShtksf3e12fVAkrzXNQbD1HWhoRvV+u4EBKasZ0dJKmKXnkN6otKyLBmstplXi9O4BTEIr oNZrwFZL8bYfrEoUh8aMWMxJGFO57RkIrZakOhTslKq8ArZFStpBu+XwzxVTPyjea5z+K0RlcCX5 MSrPGWXWhfzHcWdZKzvAUwzr6yiSkuhNi8RLm+O+EfabyehMIZ5p61GwPR5ae9COi2Bou13fPlfh 3sZhbJV7jsTIoISKqVLftc4yy+aHxLg6QHNTrw/IEUVDNCC+wZ1URNP1oQhjAJlhyHf5HTSpr4Py 4xyU4NSaVeDYusUSXxxNanWgSdoB1kLcCLKdtxcznYkTZbtQIJsQefOOKI66KcDVAg== k1bKooVzAAwdSRyoFHxnw1F7S0wSKI8k00hikz2YsGRjgpFlVNx274S2buiojggc+KAn8UGb+jpN lBwXMsii2iGA9ObW96zeZ/VGBPdzcECHSiFi6bM5D6bcTjDBQ/WPCd2Cgo8g/EQosqHFNUIhDdBs ulA2w5bKoNhuvtpOqHdhKu6AAlhtsZ0QxM/X2jmuscMVdUxVnWzlnIi5LsQ3TRulAf7qTeuS1iYt 4yCxDfTlDT7Sp+Y7PPlBCQ0jiubGSxQnjL08mZw08bKkRmm7OSERy9YgFjLIbcgwEAWlYbf0FZxg 4QmTXfcQcRFZlrPcwl8NOEGXvq58XCigKIRSmc8EapAvXyAwcCkkVEsMKpTW2tgLvLChFouBXCxK 0kkz0SiIwlFtLhzFAiEnDgZ1C6o4gF3trV31rYiJPfBI50pwYWptXIMrFQuxSAh1ctKiOCoYQNJX M3W4srW4EtFgBQSXkomlRK4GV50KC11/e6FhSmtdkxyjaaEmZlZ8wJMlSb1rUfo33EFK/ANKFtZK vD7iNBDUPLy6QeCmFmVHYfI9LKApzfnYxf9ydJvquE0oEUMmcsnjwuICTFpILDECRWJrwEuqK2iq 8sZhGhIYMyQqQ4hdS/TaxK85xie6g6Qzhxi2liILssNGsm0s28qPfa59x56MxocKjVoRhThSOTLk 5MheiECiWIgkiaXIXo6E+l22nN8FS+ekpboiVSOoGXFhv1TRSMtoRTJlL032MiVX1q8VWKSVKXlZ kq67vRKi4gR2EmVXePJVsljJgtVjF6dyeBu1dfPQ26abs0sntEhbNyFLtEFn1G7IZqrQXlqcvPAy qULNxksjt3DBTfvKiaLVCZ/BLcHazQFvkPhwfu9WUu16fENBMbmF3bp5XSIiY3HrfUCzoOJCRn4V j4Q+abl80YoB+5F1+9rNmgsvtsktsY4XVonLaeXyRSOumEaoT+uCFO9Z2U8lbF8zHrvgSR0oLHrm fSDmB52RPANX4Plm51aYT3bS2Alyhbn+bycv+PWArwfMfZGd+NaFL+k2uZhK7LafJZaiiTcNZbFF uTca9CLXfM3++D5in5SQV+AwbJTDkMNdexBIZUAgexjIZirwSPUdgoIMEFFHSKWdUgEhjSba2Oom CyfXSFZNxeCQxsObOkaIpBVOLEK0MghRqXQyKHvEbFGikIGJxiQSMY2EVPraMHk7oEaVPAwi8OjA hBKWQWwlVJPyiJXsRxM0k5JLYBuAwaWTYpYCUmlTnjHBJQUwkoUXBeQQY4VHJiKbGFRsaQYMG0CU 6G8T+SWVn5P44+T9kKQ/mhT9NC9/n5HPmcSIt7Yp+JqBn8vCv5aLr1B/SFLxh1199n0J+LRFUDA4 SNDPJ+tfb7vi9c/iPXuVLK+S5VWyvEqWV8nyKlleJcurZPmRSxYNPvOkvuicrmy6llbbtbN6Sma2 ILwLW39XKN7CNKe0Li8EKADdo694QJ/xqHN+5KD1wsjwBTCWzakI9PTBbpOUYEkv6iQtocZnKIjF GWM+AtYTdxzlJ2j2WFgoC885k3Rgcg5CTkEDaSqBAfkPURuTlsmr9A12hVOyDTeIiMkvFW8XZvOz Iq7BpyTvDSzohNhvApZ0UpOS4f0K8fdCr0a/fYP+e5kk3qNPnn0KDXpPP4YKKWYo8m/1QQHDdxzJ QUP9LOKw40kycJDS/QSeJwtPi5XQD1z6stbhllwUKuMi2I8lSTVxyxEIqWJSMIODOoas5bJCcokd u4HOtlBcPc/P6H+GjWtkGorJbl5OYEpSZkEJh8ABEdrFGk7WoNIR/pXfy/xjwVcrjvbmx9qNsc9P LHG8KzfaNY544yMzLcuE2g1v4wa3dYMbS4ZYOqh8cCO9zKVM7LnyswCBOW7IvTPcD3+HE6BXydBz LHpmqTDrPrioINhUwrpRh0QKWPxhXBAvLUp2UMIsTVY6KoWG+aWEjh0kzxSzTBsEuVKWqVOLmFS6 Q+ZPrwJ58HHF2aW+YAhqOlRuAlC9odxSUmikOIiUlvDLWcpKSF7phVWRTrJKWShXvnpZgx1LXbmY VBvpEX8zC4k7FHUy71uTaDPylo8gSakVW/K+3jJ1umzjgkwkAUr7dLo7y47s9l8h1w+M+2HPjXfY 6+x82u7cGIkD+np5sxy7m5Q4m01MvgvR+EpDaJbzWVife2Z9ViJrjo8J9/MShcJ64oDuOAZm41+F hrwk3DVrfGA04a1OIwUczwITyrLhqxC2iiNWcYQqjU2ZiFQuAnUl7nQccLrTzfs6fj+F8TsevTy3 4tHoMb8iGBL5dPQGHr1W8S4lM69bJvnZBKKZ7KjV8asClOWu8YsxKnUYPw0kR6FjO37z08YvH//9 K49fqOHRR41QZPuarqTslUp543sMjWKU74FbZAaEi8SQkYDFNcCRKGvcbVOUrx9jcenfpLJryR16 YZ6KhcEms2bxE9yEFGP/swXWmFPmUQGnBf7RhIGUkiHjjMUBtbCQTCjYt45PUrOiXrLKXogKzyfa wBAKjBEUrjWaYwC1KAaOrobO5n0ddEw66oThbwqA+xB4oCUYOHW9crP5wmHwCbFvLdbbQcyrhME7 txArk64+IHC1cYvHJqv7RViL+iSEX61JXwmpKzZXLC7aZst/afo07PKn906offZ023V/G1fTZa4m dtDFrH6hqB1mK+/r2tnc8sPrsQs9yh7asrlDkjYU2PFzWXyczwVRCl+LlVfC5ShDvpILXuPGR2ch JN7CzpAIJqz4hjOwNnXcJAWebS5ArXtVU9r6CsWM7tSMHtVbKBa0OFdKdq5UoB7DnG9lTryG5DMs GMVUJQ4VtJZZ+hL3a8zreVQC4XiKT5wvxrliEFVBqMzssvNr1OG1gxuXP+BpDziwMtOYO9LMt7rL MUcm5Q9498NRBk5Ls+wGEzMcyFDHJra4hptkuMnAXsDY1xelPKp0wFMHsbiIlwPyIxlwGp8cN6uO VDRaJr1vN146YrCTAyILrGyyHJ+DLseQUGuEArS2XsWe71Mc+JsyfloOirA0By6nyGwUS1RVURao 1K4ILn27UINbf7MUn5BUsdj7SCIHf0RcZUdRxxBoEP92qkjkC0XlS0P1UaaqCR1JtiooiyhV8tQk Vay6mhLNUqLwxpNU+GW94PDzz0uKEnDKEcsWFdUqMQG3x1zsFVd7iWU3PbeWnxze91GhrPb1NZd+ Q0otT6g1ocKDHg+qv3hYsTlUa76P3YjzoyDKwLTZD8pqlDDXx/UPO5P4QJSMpnzSNe76QA5l6aFs NURmiIJMQcSUKCpHFZUni0L2+hflrq87IIvqdXxex+d1fB4an8C72L9AM0QVYP84aK1plpqoThp6 RiCieS0jjlebOxGnW6XpEybhKmRcrl2uAFxLLGlsbS7a//ve5573XErc7b7LyduUrRXzxGaq5YD9 w2SKHbXFtJT+YyJlaWIekcEkmPUm3zSkmhniQ003iysYRulmnU5V213bcyarlCzcKu7W/gWaeUB3 +2E5OjI8WR3by5REAppXo+Ueoww9m2cjmTZznMCr6XpJrk2hHXnkVbadmXZnLyUgPQV68EQSj65m kTzSTDos2D+SLLdr2Slphor6IeEoSSXrj8x5IX/gRAMKmbcv0K7K1r0otg9LKZYWGMBNWDwOK6Ni LmrEBDPGeiBa44HYG6QRYqlKyvQFJt6YqY95+lKaPiHpAy5DPCBuYnnt1tdu/ZvqVtWzIulAQijU WLZGdKB6UoI0pEgruZAgUT1hFQRheqKKG5bkqWYYZseMaYLCjAnTyNtDrt4JLAgzqdrSJ76czZQd rbWK9RDTWoNxojJfaKALVbLQWj2n4o5ZFF8Ze0xxQvV730lcSSPuUOnUQT0T0q0rhsHIN1ECY1tr 46GwPGej6WYCHEopE+lq6WyGvIJBvYYyORb3aqnN1NGfR776bgdbKyfjUp+My+ySOvnVwWncm4Au 7Ac7M8zTVTq0LEBrh0jxGCn7Ebp04lRZ6dIwd8uEoMx1JxgQ8SoTOOnUGE6cAIqjjnXdCsY9mWPC bZS07RhQHPHhejUyMzNfXq34Gzzg3oGYk3qG4s4rj2so73DRQphS4kHKdUjBDluyI3CycdEOU80B CxRKzY6Baacs8VRMPbVmOdoC81RBgL4top0KZSyFHLw05OCzkoMLNXjD3otCCJCC4+KYAv4JJPCA XOGvnfnamT/WzrQB34VNVkHQNIKdEWuVMTODQmU4dR2pnyhtfURqp7ZsPPylRMDLwoWxerQWGyRN KthGM1gqQVJ1hghCjk7wG4HeEPCGUuMbpm0oKS0e0BKm8w1sqdI5K3vWgP8ZzDlj0JY942TOSOes FNXDifgzm89HZy3IKbsqy3nMc75jOucMiytU59sFEGhZYcJDi0kNA+YrzIiZ3Bj6+L/OWXUyo0aT 0q1KNpTmQ6kWzjo4KS1UjWUwCr5/Uim9LVLy6cA9ziCTakUHuDB/cqGalairorA2rGMRP698fUan kJ8tyl7KrIxR0bLAJdhFbIIsd/Aa9Kv2yyK9xt3X9wc4qJllqSBzpKkrH8DUF22EnLvmIqHKx+0Z uZkz+9wJTTa/2Jf4fPA4RPEdMaRX/dkZN9VpGM6ePfmISD39NyIv94Tnnt97YC703v/dUuFR18LX +uFcOCPYsJU/+at4RieAnCnhicTL3tknlmrdVzZt+FmPnuXcHqQ5l21fh/M/eiCq2CrfDT0vNVZb qcVa6dONwniu2rHac7c/eiC8GiVZx4MhI72bI81IFWn1Gb5dl+fG3V64jGcfgcj1K9eD2Hm1f+lf yE0UPMht5bp9zLxwE8uNeXP2gXnDsf9SR8zMe7mFEkn6y6N5n/7bE3tayg+ci6J9Tj/H5QtKucdC 5qq84/9/9GV98QVW/3Uvel+RwB+mcyfAkgChWPHDh3qMtr/I8vYXUdXgRHmVaoixApurcmkrXJKs RzkPxBCJUlpqWo6olbJOyvqo10WJ381roSVHdUX5JMUT1U5ArXNSfRO1TdQ1RdP0wUkfWbQVsIiN Ma2ShJFA4EJJFI2lWOyahGEPwoAchrFBGKfNQghoSeEkhvGL0inKX8Xlk1bc8AcshNpEOqzX7ToI Cmxkhhuz5NbDD9yC1FcT0l8NOMp+fP3YhjqXaJZMyIc1mAqHvKVrCUNKcJuQJ0uYsqTukd+XC+QE 9SO+CSpgQrrhUCesxSkgWIAKSUMDDiBP1Iw/wWACBnTMdhEmnOyYQDscqIctvblUEmMKYiIRlJ8B HT4yepJQ4rbEWGAmDcXGlHDQkpQKTSlBpFEXFCY6r8r5SUB6m8wDKUq7cjVlcj7KI3E+AteVFy7/ hdOiA8yPPGUpEDMg+rx2a+C1wPhai65lf5mpkBCj+PoYd2lKX7glAJyM1jNsb5SkNFOjW6pzE2Iv IPWocfq9FOO2GD1qEleQWIJg9CgxttCQgeSq2trNjYfgx+VvGJ1P3r2jBInwemD3aA== HNSUoKeEQ6nk8gUYGldxKYcqKugQO02l1jbV2554csxoGcj0wHIPCxur8iT/qqUslN+STxLTGAaT 0xmdYHgMew1r2zSTUPnR5pisagYnzHCg8dtc/s9xvshT/Y+0viqNg+y4KHZMFDEPReIyFg6KOAJy 5IfPAO3zIRC4UjDtjnJpPH9NrTR4RrG0g6AWpW/C80ul5SulgbWpg0ltbNaoVElaF75nEUf26lRd LVwCCRD9GhTdVphhSajoZsWj22IlncLSg2zMVhA6rCHkHqBCc1D48xRBoDnowFEdCT0IgD0GQ/eh TlCoBbQwnp1FLAtZAkZXibAlcLSFR0+gyQwGI92Ti0WFclqHLA30po8Uk8OllEBpbuNWJ61KWhk1 gxMBZsg9xFVloVTLMXwKlGA3tLSgWhz1voI+IgRSWgfoCF9kUEamlUkrIOFsZbjWYSz6BR7XDphi x1PO2PhqeQ8FfhEjgSx6KIYeBaLtSxkeIaJbgwZ1O6wyNpgtVbP1OB658A7KulZomI3JfjRQFQxF AyW8babFDAwhl39flTAqF6hLqKXCfIJkkCIVQkFtSagvrNzEHNSTclArcz0o3rJCi8gL0pi53sIo pwRA6SVEwj0dOOv9QrHE0wFEaNimI576gHrzsq+TIrRSsqLQksK72oaimRHOI+oR0x+BwX/CjVP6 QXuhwh6Q+ycYqQBIKRmxx/tu+Z4LLzm5ni5Bd31yortJYMiov8+CuXoXvb+eifd9umJp0oql6oak LTaIH0X+XmBymQkpfHvFQVZsOa4mDNJx2KA2QQOyHykM4heAxzewEelLb49S1Oqo6FVaijO0Ktt4 gYBZK0XcdsRC6WONGtMwAb+YozaZFi055XaiCFpoKuiBLdiWPduh2RKjmtNmSgdYxu3A/7CBXjM+ aFMM1E6XQLEdsoo0N6xi06WODJgYR9X7QFmfYKQsNmox1s0W5SEVvCxiWBRbOF2EjbLoqDlJMLOU TZxXmFCRdXCDt2lLsgtjLp4MIRnEjGTYrcqhFZdTlIKKe3UoNTMTbQhM1WKrCrWsjIsSlGb4BeI3 m8rphggiXqRA+lYaLT3UNLZVja2qbpR1UHK3g+LGe439enVjiHV2qxJEaVcLJ16V6DBo4+iUAYcF hFIwitgkArSJjEWUWEN5ONgVQwgylpCxhaTq8sYSFpVuU4E5/Ez/3n1DfrYFqObOP+lvo8/vf1aq 5+9/1sAGgP1ZM1LeY73RxzCqv2Bi4PTCAKuF5I8zhk1WnfstNA81uw/ILGcjHZQYQmgiyJqXKLZX e/yrxUCyZnUJbOx04roHfosBowlJKaY6+KN4czFhvsMYoUEmWFyCRSUoJgG0VJBAEpabaISrWASw YARN5anEURyK06+R53HmsofHdc5spbMqrnQGmqOUlooLZeJsiThb8SxUgasD14RWM4nKn6nOSTHU hqEhNcdJKy6cRxRkBRfQu3C5yY3jpysXnkxTuKZAWjWYXK5eDabAgRcKyNXKmSUqtuQFOJEFUk9O O3tVFi6f+BXFcb1yWfUnDNnQy+JcaDRHyh1rcKXxpZZLjr+WZydXTLTtBY7FJZs7iQq3VGYaay/7 +GaNcU0O5tQUY6pOXXlu66E9tdW5avqofPODR6IoVVOWfWdLThccvvOBJNwZTZXq8+AjnjXdV9ee eyf5TZjq8WNRbBKrXvvjSEix5AC6jfx2/mQ+qN5T7+/j7w8e56GYWZsLmbW+1HUnETOT9x3v9IH7 crfPG7ec3ehxqwfe60VNGnTHF/1oY65WYWsNTK0dM7UOTNKKegAoKWFgZy0N0aTlZSVeSfHqBTpW Q8NKqllK63FhHg2ByIr3cw57PplTuuvLzu/3/RHM5m/9oFYDCLn41itqPaPMU+hHAyInqdBQzhg6 lGyAS+QztSkB1nuKP8m3TH7K4F/uI5R9KJ1cR9Bki/a2tAkIShZnonEhRq5D4S0ZIh+h9Q5W7CZy vQ5aSnxA7r9Z9V8bbLE+QOv9m5QagegBt6fAm3OEAVnMr2g7gsi/7IimhWZ6iSimW8YsMUkAI6mc rgqqqgpFYo0BrFEpAgrUuloOU1mKRCJIjCgCyKCbTQ2/Tuv3VZzMG6LHktAbKnZqmT5mHEPHAOwo 4/K0YzaubBP8dqxjEJGOBcoxk+anZHGD1tATeKMFGyKEkrwuoymBFoqf3ZkKvcuEdmv6Vu9N2d4r O8vXZgLxEKVEHyVF2+TIo/RIDM+TvpeCYCMI7NM1TjiGvyYaZ5w1HueMG4ACRJnKx2yE+WzxXfqt tQCjYuq2Xa2brsmXErHk4oze1gmBjhAe7tjTP6AMG5Gow6ZXaLRDTfwaV2fr3WyB8SWlY7LM7RJP syQ9akraqBoMlpVnF1gjKT8dNL8e5qjR+7aorQTh6W+k/QOOyZMazoUvaaESw6NrxBZYa+Sq4jQt iV21uNAHimCBCWJRCGu2ISwNYNURZ1aHQrHDzYaiVzPODicigXYdNuVLw5jlJxWtk6ioZtpW08Qf mPu/8Ik3KVNnO1mbWnEv+Ytee5iEvGtqfrr3ILwZDFf5zbZrsftNP6vdZ77EcKgqGn6S6PQ/2eid t4O259ReTJsjy9JU0QZjYKa1yFMDszC2pa2iHaArbh1ARIShVBjKahgq56bi3woyI8rAkhBG0h/l GQGxpystR3gcsyRbHmVUX8AYmdfNzCIDIVpNp3Nng7Hkuwg4tIcLhe4NnRtMdS41CpmuXUPXBrP8 nlZfaYbaCxLLPrLwNUffshpvO3tfLH60+iE2+81YxeMS2/12MOp4MCAZjS0ejcgdGWqJxNCNGLgR wzYCaCNJnmzIEYL6JOmUvYJpBF6/aCETAdnTJchlBC2fLsYneeJBJWe04cP3eIIO8TIBszOyv03g XDN72RYDwEFoToDeNwK7N6D7Z7vTCI7fJYh+OfimCHsLy+8YxVfzrCp4zmhWER2012ylVkMpVYT6 vxzA+EcGZfUWzG+ngT/KLmtgiPKdyqgHaI72yiuUOBRhl+d0W8k7VvN6H6LdS8eg5h2KxWM1Dwwv UB+hUFMFL1XvrHJnyEBAgKiKQ201rapIkqp6m1JForvDKqdUwf2Cq1V6T3quwL4TfC71GvVYnfTZ 6Anw+girK2jdla33WVltQ79VSBJr+25AzQ57D3Y68hr1YKdKsqX0sWpyoigDa8qkLe9gvUdkNcb2 CgjfFXlrog4Ww6thx7nN85pYSnCeF7lWQoCgNiGD+HeIOMTxh0JYY0IEA5Ay98JqPFHJhMLNC3se ZrSW5eeIBHvUFdQdPc8xb0LQL9YtfS9xHym1+YV1UeoxWyZ+1CK11HvYg4CSnSrWYkfazjS5epMC Zyn7qeOEJurdOgTFgfKgGAVJgnZhuT+aLheAI6XXedAIxpQKvfiJA/IDDzWF5QvOTtyMkS3XQ1ci JN6oHAOfO0AqYzBlyYmEMYxy1ozCIcJPutGEOwCUL4bmedbjsWKqj2I2U8gmPIrZTCGb8ChmM4Vs wqOYzTT+C8/FbBI7tO3eow4+QsVm+hjYtM9181FH54PC3New6+yj7j7o8BQlC6amWq7Tj7o9H3j3 RDDZrj/qfAOZJdKzHd9EQkotlLfX/SDKSg2HSIa4fp30o/RkgMtbKAODjqVLpVNzrDopr05gnQ6w BuxhYECIVKfTSEfS0dLVvZahkwJ0m/Y39jhwXCN0+sjxDIlm2K4XvHK39RFV4hbRctOUkumUgq7D hBqi2RRiO1gwJ17FUxTTKU3lvTClpNjess9tBq0VNRzcHzm1eG2mso+mGC3IWOqFpdhzxaBI3IGR dzRxfPGgW3IuFXJhtZWwk2/SKzTyrjcYL75LhhZzkQzGyRDHbFFMplEguCG5B8ty7+WdKC8ZlusA AM+Rz5PtvoElvlZvafCUuot4Om1MnlEliq9ARKoSsk+ux1hsKc+QOWEIjaQTpQOjWIuA30RP31s5 qaoeK+rCNhl5tPcUqPeQoO6ZJVVdB9bX99q62kIU/3gClcU9Zh5k3PkP+fLhNpcmxTQSIM3O5H1i ZAN2vfGs/gjdARlK3KRPYgjI4IwPj9no3FpvWhv2Z4RGcS591qx/UUmWeUVQhT2g4EWORhAHTiE+ 14KZKDWnuPG59R7C0SWghAGTfU1e/kNHoeRoQYmUTj4VeATObrdIjZ7xJQGy0fvX7ohdipN5qQNy CjXdXiH3UtAA2KznUTp89EnPmG9fnn3ygL9Xk0H94JGIQsEDfzygpJdU8JqPW/GN6V1XdGMefoP/ il3fn51AbMx8epnj0YwS4E8Au4QccQUDBbALzRg8jEfKuFkcptXDh3oMOlNlsTPVF8g0weCZXNZT JuOpjco/WHBvAm+AULtDKzq3nIezxzl4PXKLYoQVlkQM1VoQ4jsoBFuA14GH0vsT4notQ6IgItwX q5yi1UGBAoFSC4o6IKiP6zl7Kd6ximSw06D1nJNazuTMqLhiQkDtblw1IVYJVzWFm0ghDLYZqoOQ mGXScaQMRqavWg+kDhpQlFpfnY9PGU1Qra6gCM6JItgYSysoxMa69fWkc8ZtG3H8UPXIkI1Yc7Xm XktD+oAJVkM+zLGXaEDJ2bwFZsSWDNElnqYLKmArZmKszIu8cH7sgARV4t7pUY9rAdU6/6zYuUPu nCe6dIxL5blf/IEP6G9T0sMGyv165Vd8+MHU12luNTsNSV08iiPbSPLAeZ+B9iDUv0vYDkARyZL9 FnLeBo0xS1JXo9GUKkly2wR2BFFmVyhJp/ldQyhLRyUEuGqASXOLKgaAZrDafLeQiGpz3krNJ7WJ b4L94uQ30LzPkAOHaZzUwS+ELRIFHB7Vv1PlG14KXRSHoNKAyT5YkouT5GIkAxjqPSXe8wKVAusS 55bItmDY4xIkaQGSwxIkkOEeEez/MWbgGJSxQHY1xSj/UE2yzID7k6UEmbUkKylaS9FKWo8XEuxW Eq+j2BDrkR4K8fOF0GYVHp6NeibRifmP3GaGvFBGBR/dwMd22EscDJXmWjTdyv9HE9kFndApKd/X QCYdWXL92Zkphibq8UM9pjR3WaW5M0pzwa3EFsYmJdGKjd78pxmOrqE/Deem6o++qZ8/dJ/Z2+wi 0wC3rwo1oZZVAsINI+U0+7LIk6V+LOMX3LF/gPFimUBS0DGEor1BlpIWVbKBfWoTRuPEn+Z1ykLV PbqSWv1qvRdXFmbCJD4cYDdbMz2r6FXFryxxcm1e+WdrXwH/2eqFkx7JGb8XpKtdkKR2RHraDrm9 asziLbJ8XldwKHCF+5HPFc4WzhfOGM4Zzhp4xAIGxp0d8vSRgfdq0/MRDW9MxLun4k3YzDRN2T3A 5CFLyrG7sFj6qfWufghO3TkxfZxIsREzVGidtf156NrKMtE9cJQcq15xurbOH8yA6frsUu2/wOPb tVriLJV1Y9dqqX7n4HUWbH/wORu4FySJqHu8V70L92IkkuLHtQIC7M+KcxZrxnhVjA== 9ioN/tOAPRU/sAFrI6v5GRBci/4UIiXSWtzP59svEsIvNbivTn9gUo1WUQBtgAYoTKCLyuegrSkS 4enyYI9MM7gseG6eJ2HJQuZ+oJsLqfo2PT9Ky5d0/JCJT2hGULztpJAzCzrrlfOlNZx1TlUlqbLn PMgSHBwQG+wIDWBHZpCnMtjRGERyJ8p483KBCFK9h5MT9EbSpHay4GnfI12KhI53gaO6FWX/9eJJ HCr2oQcna+Jkf/A4j8msMSuzRi+zNG/vmUZUzoTC6AXcaUDlzSc1nkwsh02n1HBKzabYaBKTydtL ZC2JrTQDA4oCUXjBiBuiKsHq6pQYvzIwbI5AYI1eZs1hJ7nYSQ09LeQWyC8rRXWRzbdGiK6eCakF yyViOeJghwxcTixCsQqDXci2oRLSCZJKmNJbHy5t1c2m7jXZPQhGVulv/yw4XyDsDpImL1R8s9kC JmZkGT2f3mR4/AR2JjcQboEhaBG/HoPDFCC2Ed/8xk5FuccV91pxLAbnYnAwDrgrk5NRtg71MwIr mKU6Gwulj38phJPE/uGlEE4HDBf3s9LlSekuLRzSyyfcHXJP+6xeuTGb1xuSejWlVzhPYh4Puc8Y /xFQLhe93R2uCPSu9xT3BuHCdy/3Lz0QXOHCdt8D94P0ROgLS9YSQg4M1ElTknuTkjwJQirOSQZF 7lRRUrKFt4SUZLrBVVKS+TbDjXogm95tj9vqqPcc7nrz+zffeUkkgnj3dP8d8flgF7hOAOyFGY0N 6omkAAArbLUaj9ZgpVpesQq8koppjNaIkAWO6wVoLnGA5e1Qj5z0KlSDk89CXUyYpzZZ2hm8o7WL gxXeGXuYsSVqA+exJaGAQeU51PLknMcwzyOgZ1Qk6zY1JwI9b91SfFMWMGNvy4Bm/I3Bbvis10EQ rDkE0qT0k9HtwQ2cZXSTP5UIiYlMWFfC08yUnKHCngN4GUqakD4CT3HkP/+WruQEwcENPe12TFAC nhKV+GneksryqEhhHuy9V4Y2jHkXEViUlSFItKFbYO8UJrpThQAxkXuK3jVGweI+GgNEZee8xABY QP2gZQSsgSALEoNwGA0GijoGCFgsxoJgAUM8a0hnS7efJIyzo0FiENWas7e81YWhO0Fi1IzEGBBn OigLnutsYOK7kkk/6qj+J3HbCasdwZMrBF7UCLvoFHZBoAs3gXFJYxyHaLlaqczcobQV1gbhHggF mkOt65VzaWbEhQobAbM5EJMwkRJoZpFaUZsWw5o57WRSqgLK4eowKbzmNHFnUIGCGFdOOB+1ulTP Fa1qNmEKTb1e0FQZ0UTscWdrqOhAWQIbGRvH1aJyyjGzR76lVK/SGAULpnLzPS1f89k0OeDRee21 7QtDp3cWR8p/MEzoAQISXQgvgQl9WgQWgjchsILYQOMuYB8H6zPhxSiyCEmAfhecT+LycUx+H49f IArG7+PwUTH7iI92yVRid18BKcTOSO3xhR9PPeBwq8Htf3laMweMcnN746E9SimOM3bTvXzBKiC0 kzdgNvKwjYdNXLJMF929uQ4M7dtkh3ppK+Qbkja3cXIqNQm5U7hdwuwSYqfQuvAyD8AzveF5TpSJ F0OC4NvEHMODmeG4+klsLhgf9AafNxp80vcFIx0S5xCTpzJ2nbcDLkhfFMovz0TMAQrX6xOwXsjd IPvtgkxGNW6ykrXBNE6xwBNxbQ2ghJfpesaATcQIaRhi/kQpGJERRPwmtc3leLRig9rAkEv+uz/3 z2bfBgqblMam18rnoyHvJ0IbAbMSnBUhrcDxjJjKNiayNQxeBu2KWhYJIMvLIRtQDMSXbUhyqTsF crCsNfnUS0pvFVM0ydYUJ2wYmiYrEnYEIuFS22ifiGlE7GW29jIlmyQLXqKa9QGfkm4ii35Rvhoj nyrdPATIheWf4huMclIowWXLbE/9Pskl2tLniOAqorgCOnbMEMbbEBn0lGWsrv5Rc51rdAtbbJQk FMcOcEkhZlcwmAqhrVGNAgbw3szXxBY6dArDNa/w7TM+o0AKXK2Rgme8O7/3iD4qPuetMxrgwAMU li9DhJmF+rj3q2vIgYpDgpLuUWt6g7yjaC09KVbApK83tobmsw+BVzBKDLHXYKKgwgqpTqikrZJ8 0UodSU9MmlQcfLkjPqtEJubvPL8wJn39kbGJC5w+/xgPhWmzyJI+JlfN5XEfZ3Jbh0rsUqEQDCbg tiaHIqQbayTDpBvbUIwlVp1CQi6gg2qLaFUrjV80JoLRUzUyJVXV4JQEakj/EEXFqiprQq7aqhgL xdQuLMxElLE4A5MILhItR7BqKVYl28Vk1RuOPNzSQ0K4le2TSHgcoDj6ZwtT8XBRuDVEPSwRvSh+ IfRBqp/m6qKqLPGA4DHngl2Ugyv5t+I0b0zvBgLCQKRqE460lgAYogLp6uDbssWUJMGIenxmtqwV XVtUue4Ob30Gpb9L9pX6cxi0AI5aBKU9r7aHMIwo2ymZak35vWDIVEsGWg0ZMtXhXjLVaacxVVfS gq0bJMZSsDMkOOaCP8SCKmJUep5GVfxsRASaJgdH3hHrH4kw6ruK7R6njvr6nkuvSpxG1m1kHUex 64h1YNj1XnklqfqISHW2RKrdYe8dk9AWud4jI/wFCVR9Z8GdDra7Uxzgr0SgesTgdx+BakqhygSq dcbqjO3N2M5M6VONFAMryIynHn0FEXVIo/pv0ICvEq8cokBIqu8Ktpk2ZNtomiVdxRUIzLRqOVaZ X5UdDUqtaqoBErFqoFWttSBgA0lNQFsZUOoCbrTXMLUV7TZCqdoppSoxQQyA/pp07ynVAeH2HuqZ 5qC1yB4VmvLq6qct80sJNSG+A/ovjby1+3v/V4cHCDUWu/AK9OX+w/h3z+UZpUhj+ldLf4G+2Zqf 8g5ey8uQqaZ0qkymelSvo07ZPg/pVDVpBwxDYKP5OgVLM0unOqpMu8qmDSrZDoMHxMo3X2m3aVZ3 5Krw5PodhU2Q2tdIgShJqj9MkgopUnE3R5y1VGHqWidjKhTlfqXsp0etuNYCRypk6VJT0tSYOHU5 GA7sfMgUTnlW5wuTKuxGYFen5i5i1fWQWDXjW2XXqmeLRtdtr0jGQKs6cnViYTndtBDxhVmTU3JV EQW9sLW2OyLVSUE3EwPtQ4GizdIyK5K/llP8VYlVLfOpxEBsuoolVrWxED5RRK3qqXf5oLcIVXN0 qhGZqp7EnSYK3oQeuPBxJq3e7r+974OUXFVyJakXTMgmVv9qs8RjBbDfkasKSTJHXnLU088mVwXW Ae8jV+1uk6uCMSAy5KqZiGqGXNXXui89mwFjVyy1akv0qlHQa+QtR/psQ6taICu8xzQmMCC9FuqC BtWZyVV3fTel8WmqfLmPUMcEq4UGU9OeVEUajCYtNTAFTF6zRhXMikXBD2m8WmPWgLSb5BbPpQ6n 6cNa19xLlZRg1dZkq1j5FipVW7NNyr1V4XegWIVQIS5LtBpgIeHnpBCRifn4B6YWQ6BIp/plIFmt VQMtlKfsonSrQrQqQHyucSFwfOlMIjCNu/TCgTqaujR9KegwMpRkYJC+0q2CSaOyRKuSH7UoBF4A +6PWkm+FZPXCFx5IVntOG6jp6lijX7j66cCBEFlWNaHyJUfL2uGjYusFWR+iIwJxWWVT5Xr1CdEq aKwkBZA8k2j1xwXTJFvkOeHWK2Sr8LSA6+1gDNwf/7kvFQEiP+QLpCJAhL57jGw128G5kHauj7WX wXRzrqNzXZ2LfGW5HnMdnuvyXP6H9joceukNIWjS9bnOV+wjhO7PDsBVytXrhKsxTW3w/kr92NRv wp4TyBSPjV3tcUXTXPXYiHQV1MVuSFeziSi5VBTpYUO7CtrNvVbhDekom+ZzBDpSS7w6LTviVVDM aZyVEkrJ5ZGnDQ9CIF29JLyzxKmV0s2GZSwL2SxjO58gzrqJ1nLK4WvvMEu46m8MkmjOYu6KV7cl XbVScItYthL5Z5YkLcfDgrhhGW53JV8x15YRdjgfgLHG0j/UNxHXlqTENez5CQYk/TxOdGiZ5D2i W6VSeBBRrJaKht3TraZkq/J7tgXzPOlqTLYavKvV80hX83SrtYGzIm4KOAwToFMxfOoYQLUmmT/U rzMkdnmc+YMIMYtJkeL1qe2zh5dmAKbWDALV3vdu8JwjPAc1jcCmwNWr9nhTtY9+YqSruSSEuyIh +VgI7Pri3t64YQ5fmREp6SqToXaMBmiFWVNpUguFKUgN2yukqy9wNCZdFZiC1utlvII9WCcoDqmb m2deffRQlDMvt1JSPn2ooXuK2FI5/X6g27tCv/pSB4zpV4W+SNhTT4Y1NX1xg3/12YciAlYlUjok TFUaprsIWF/meI9WLd4RsD58qIfgNWOWZMm9eypPrQBs3GYk3N8CCQjoZKlj6/cegVzUUb6pWCQC Tx4AVZ1g7Fn745hd/oqFBzdLPJDKI6gTW4sgrrjM6jBoaraigowKlNoceV7+qAIBIBOpJF+RDWJT mSWNmWBAksYcEplDKvNGrCag+cwlU5/UmtfcMPy+01TuQdObR2UWkcDZIjQkwkrCOc/UDKNJqRnQ leZBS4ti19RAXtxoQr6UvrdrkH/7ia1/iQP2+QZHHzy3/RAHFKVXiJkGjHL6yeUfXi8dMEFhwaqa IUgUqJgodB4lnwN7KYILKPgmrFci7/UZGLMmEAQnCkAdPglWzXALx6UmFiw3IaZyQAiyhQzK0yDG cct1OXquRiJG8YYZf6WyK3dqC0thjtVbQ8ASoGFD2K9+ITPwjy1a+MJf0ESLXpY9LnjANU88AmGh C1qEFjct7HhB0yqW9SvMRG6VgnIY+xamwKht1rZEHAZ6tITc+Ij1+LmP1wP+VQ4oqaqj5qX0+iRr rm8701qTzmqfod6cN5a1EjCVlPPRjoKeHNxYtQ5HqCI3c1hDanD3GsVAUoMGLfsqsvhtaW5BlkkQ SPiEQvUOMid9TKQCziYqUVGhXImQCyshg0nxezYzNmBaGgTBYOiIQhp1Wic4qWe8cux51UKeE6bT UkItxasnovkBzq/1MrbTaAS6SDjntuG/8Fz8Wv6SRxH+Bn6Dwg4XJBUx72hwQ7b0siyuND0g1TLt TOv5Zmybo7ZSFea0Af669jgCP4XWoxbKDSJU2NPanGuQf/v57Yc44I+A5ONoGhnvGFzNBQ8J3Wli d8cchZ0+6Z0O5EX0L3Gzn8mX06bvQvbj9IrsdUp2eZv/K8QI43+w7xylptskdX0Nu6z1fR67DUfm 3zUNEvz4jQT9JPc+7e3eezwzb0ZtuNlG2yD+80ltyjXIv/389kMckOA/C9KkCAOvB+sI16YH+RB+ yAN0QuVjgubUhClhRAm5Ibu5Bc2ivmi1XvE/5nDYN52woH7HnOcx9sTmoP4hOVJ58wNi3SD+I2DJ EuXoB0aOtrVsHMzFAYq8SKk4YjIOKRlGfBzCyFEaRg7SSzZgx7ZQc8SFbIOC0rOSIg== ikpb85FreTCsF2SfN2s2GN6btlDmfTHN7gsMkQZFSsctxVfnkNhdroHBEefa7T1ciEe4QYRrfko7 eMBVHeMZjx/igLTEL8iHRMvcY/2k3LlH9Xk0n0fxeRxeSpfQEnAMq3KbmtxgqBLSRW6RdvlUi6tL PGRZp6GWoxJ/l2SBY94zJEQc9yxv5d+IFzcZHnBjabfR0t4v7I0NDlnXM+yWdVjSfWZJxws6Wc1+ FUO0lHMLebeIk/WbrFs4XLL3rM7MwoJrqwsf5V0t0fyf1cpLrkH+7ee3H+KAFAjc1wy5CYdPMg9s 7sEEJgEhrcJDEPm0Ek9JSoWpIEI1RCg7YQHKjmDOkylhmemV6ifU6GkVYBrqi1RKAFSClO1hSoqL 8qWEwiNSfGTREiSzIlSl6TUAUwcFgpXQuqi1SWuiVksDfblPPCoz7UBxDW412Llat6ttvdVASZCe 2uZ8g6MPntAm2yD+8/H2N3lAC1Qy8YYQ6iDyw7jGxRH1IQH6J4HxQ0Dh7/IQQhaCJOGsV0u8IoAc NKVGdYEIapCq+xY8nstOLUHTLvOo+/txF4y8gAR4YaAXocxH+tiQcXJ03d/6zsau9jrVgF1cH2pU m0/Xn013ktVEeQxsMzEC/8KAjRF5o3zvhYyFyFSCHep+Yg3Kd1nQna6RyNvs3Qa0o/LwFISeR4ic AKYXf6olfWshweCY/AQCd81u3Bq3D28Im/Z88auWKhT2dHqOyi8u7y3MPC5M5G5ig/CUe4ckezBL ZTWvlSpYiuYQ+3l3mPqDBOqS/yM/5SklOFYFVWlukDyFr13520vQTKRKy4JImZBGs5Oe8ITjD8l3 Nxnq+Ua9NNdcaldbWs/vtp8ubTtnoHDgP7vMZHrAF35cOSDNYssilucRy0Hb8+D2hnIwUnx7nlEs B3HPgNxBQcT3gK/ztEMHFEt59GeGfD9hSEmwspCg3g1W9iXp2hTeDvsEgsfyB+Auzqon5A/A9VoG T88fgONaBkKVEfhwV1ObuEC1lDDkQj5MFYp7nRmWtIXKFCtHrlQqrhRVLdByYssdFLQv/DpauZhR 5oVUL67Q2LBgc4Gbj0qnu4T4Ok+vuJJxoyw8HcTFjBWEfk9pgWxxAUiqC0hOQBGnQyZUDYGYIRAy CBNDZxb6aNgXlFfez0ow+RZtkjtAFapjtoWUa+EK00IyRWN+hZQ/YTJRz4Xx2YuhSbh4dh3keykY 2+FJKGtA70an/PSBcMdSIljUdqFUCC3Xl5Z8FQwCA9fkQgJLpY2p2iYmQQhUB82O6iBwFgSCBPs7 7LOdkCB0ye/4K/FB7c/0P1rgq7M/K8x8S5gK0iTsaWf4d6ydi9GfZsCjqQ9J+nvIfY8BwrEPL+eq 3xELJK76mE4gpQuwSeohPf1qsVTfAZAtlZq6PBgPrc6OlZXseXfzLWQy/1el0r+W2W/S9y/Z5P19 0j4i+CxlQpqsn0vUv8qRABmaBOyfOM/lLkh3LsP5WVV8rxPcpOj2zadpLEme86ElgesoKkNl60rR 2QgyQiCRUR224qoNDEMrqgv+xAPmhZpEAjBnp2yCia+h16uQZOCUpYkMBqnD1GFORgtIfY41hbVk u9g0ZOsMGpam0G9daJXOkBsjTAaDakRpXkzQjBotA9Jx0qtVRRcIFGesMJWsNEkqcKP5gZ3KXNKj JpMZs8gOB2GLy+XFKDFakyMd+i+qAvXEGlDLBo/UgLqnuJNcbbjetLhTnE43gbn4mFWw0VuIc+ny xRtaKd8A+zy6NItOyx3tyjtJisqLPm4d8CppTa7B079ivhwlr5Rc4tCwWfoqg5wWMDIO/9zTi+pU dmdMNSkr909lbVIeHjwQ8Zc6XbDqsdJ1SS99OUT3eYdJAZJ7InyjnHmCmQB1fXaKo8lZeYFjPZS0 0pXnth7aU1udK7cTPZ60kh7w0TSMvjg7Va1/kTwMORYl0jxxKrjvj9256Prm+dPJHONaMoh746tf f/zw20/vPnx+9+HPX35pckTsB/Drv/hPavrkt28+f3776cPPTz9b3r19//H03ee379+/+fzxC0jf 8NO5dKb3qarPreuok5td7o3Wz/fevVP17u6+RxrhkomE//k/8M//y738n+7Nfz81p1+d/uV/FKdv 8P1//p37lR71W/OeHPj0D/7N9HTxu/L9f8gc07/3AU/5G1o/lArk52cl9LaF6/6CKH85wSkUncdJ /c9vcqf79uB0j97Cn9ILrQefZ+VfuA2/wMQrTZrThCa8dLrQsj13hRMIZVf7WxnpSt1lOcWxdWPX nJ3+OJ7e+3eL+tw5HcS96z6u3DrEd0u3QAcvxhp3sfKm+4o72dn7bfm/urO7Cneepj57Y5nedbfi TN/S/e9wdmJo4HdLPk8zuPlcy/8OPofMndx9Z6w7Pux47jucZI2TFy1f6O6m3nNX+RO6xeT+35My dx3fbXuua/fdsm3PXvvlW/C5XoM7SDueq/+fuXfdsS1HzsSe4LxD/jGgFtw5i3dy/KtV0gA2zsgD DSRIMIyBdKSS2+gsGT3dEObtzS9uvCxmnsrM3XZJKp1csbmCwWAwGDdydbvLRtuNIbR1z64qGZfv SqFrAhdjH4e07FPrGRSzU8pin6yuWFxIz7WMQfRWndsxdfm6lAvluZQQCVqDDg28qSlR/93w8sbH ZVg63pK6ooh9DFdnT++Dxls6sVdH0YBXmJPj83Xl+tTA3MgcLw7HK8tT7eOXjnLrnIpPpfWpuHic JT/juqSn2mnvU0iw2rnQH9CuiyOPp3q6IxrYSrikXe0SQoR0xSsgOtxZoMpi9kzcbRQ6vAqB7BSC /93mTzy8Pvm5tadWnj1Eg+guz7nb3jgZSvd5M9q+Zmsff/PP3ShmpuW+F3evCKPpPhQ3889gbe2r z1cjyNfon0qX+MiC0Yfa98+EZqVvtjo8d+X4VHuzyxsXXBeqzufuDAhsH4VJa8dZIQEBUq7S2sUJ Gsj5zqGkwtZH0vrGBUFIUWSi8xbt+spLJXBXrbfzVxfKyz0HJy39xTNCsu0b9x9cn7pYiagEiqll 7esDC9N13jZGiZXbfQ+i5wqF6fHpufi+OCDEoV0i5/twdJy9L0fLNXQet879F259VSxK6lQWRenL OTYsny6vKchKdSwqWButyIz33aXDU1/F3KZLZHd6CVh1Zl3HDJFsvStt6KFHKobo+/KTyeiarETi ZejLV6ay09WtBfC8cyjJWr4NZWieLmWuC0PpKqk11TzlufquJLqK6cIji7lLebfR2lPX97Wo2ukM hbzE1uU3K7ALazecnjozcO+yTHvnTHcyn7qeTVnoh7bxkEpone7NCtDBmqjdcHi2hhEWVp/ETlD/ R4TLd/6kPl8Z55qjvL2PxwbaqekeeG/dha07ebL1QRorDLjmQzVVGvpM9LUZsH+ofizdLXzqmjh0 zW37Tl8XT12R9p1MX+5rCt125ei9TnIXgO4h92H2hWQt+zx1p7o9xYwPjI9xXl1Cn/qe1R1VPxgS uvz3zqsJ7T4cHSe25i6LtHWlJBOaEzZXyGfXsVEY3XmZWteCwN/VWFGFGy8XSbx9Ykb33Yr3AQ+J btKwb3sN21BfU7SD0joIPCPg63XFpvqaVydWTLmCqqqahaIoW1vBN9ehLQLQyNq+jcf2kL4QrkoS TavrhRuHjM24Y0jNVdWdXfRZ9i8v+ryPqZuxfUyBzvOzkKbaFyG2K+gM2UcyJpKGlOGtNCUKGeEO 7OZ3TEE3odYnj1qmLFsOtH6CZuga56q2geW+q1HfzYk078MxuYVKhGECDL7rABbcvmEgwPaEdeVE IPvOIvMUsLXzmLoSye2KNHldx1YFXt3Y6oqj4jy5iLPj5YpBBV/VhOgairZ7aCWnItlFP7bKqq02 XQ9JjB6s9a5SzQapfU8haMi6oG6jGuONvInTRhKaWH69vU/UY1cqocq2gX26NZLBzsisY4uFdHzA WpIB9+2vZkdj6+tTR3wpw/AVDZ+NtG7TBtpNum4ew8jeMYbWPSobcibhgE0SojGH9Dco8MHYuI5q KOCuPsAJzB5stRcxnGjvbSKmrDG6qIJcbNItquHVF2fXtk+tz55u+qT6Mb8VhmrU11MfbZ/fBrdb N2i15npL0wGgsXVeN0iMznhXtmS2wBKrrlpDBA+fGgyrS1tuAxojhSHeedAng0TqRVoXTGxHEVXu SawwsQ3bS3I2qFa6mu920dhrOk987RtDH1QMOoPgHjGqT3bIzsjKmFayetoYACKnaFmS2bLd7u2T 2od/dXVnfCIzsQ9/Mv23AZnhgO2s70FQpl0WaaDYDLFgMyycaMZMn51EX2JRG663o/nsuqjv9zxK aDNMJ3afJhsqNvLu+T+l7s00GWNXkTSZvR1Jj9gIrXOyK3sSaoDixVOZIbSxajOaSQplyJzvw7Dh VR5216Fkabxw25J5eFU3yIAAUt/h4O2U6nQoNIl9yD6KxHQ20Bz2oZDJLmwg1nQYeWJCT05dwaZp w+10d8FwYNdVZVYjBLwAFKr4iJ1kmr5M36BJCluGocPr9k2oDV4aTK2LrfcES4X8q65Pgxhq3d90 pcLL65OlNi88PlgjrpMenGwDKfKOBi+xeBHz3lHfrDL5d9XJHg4L54JKwSu4fEQ2phS8J5xR9QHM HqgBkNRdP+m98yvB+utA+uN3pxHZUBsvUQcDKFy8ifbWCIKT02auRac7JpjTvWWft6CjYkUH+nRV JNpnAsVXbEr6CIVTsD+DkeVoa+rIneieTn9Oid82Lx0jhXoBsMCoV56AoP5vUUvrNp55oKlT3ec8 d1eDx9lXRrf3YXzS6pIRtdhXXxc/stiEpAiDN0DTincBGxix0a4qcvcLtXOyBbo4F+kapkdu1Mws N6w6TFtHF3Lxao2Qqd5JiV7cQFIKXTyxsqKOeRuGGX2OvPa+GCoMqBduSqYYjB4niwozS+Y2rMsh MB4iAXsSEQCd10oDIQZJM2aMHy42ST0is+hK1nynGgY1LN1LjI0c2A/qsGGTOVxYU8hF0LW3DULH dsFv6LsARYoQl+VvOD1ZHBmuM4ckl1gXtA+CslDnXRvynAfHXiM2w84BcR8LO9oAmnKHbeYzb+JX dQYkbQNjqEThVsB2HNgGKLJfBIQJEtw1uItR1Vfihv2FqnquG2Bdn1DfRfeQgHgCViC2J53n23gm BsltU9PFU/QNNNylRGF1Zkif/b5Hkh2ec5+3F8ZayTOA0crc6GJ8XewBmC9LVnJhI65vHV75RsqU gj/qVXQOd73tCFjESIHXkR2zjZxnGWRMFDDwZmwH+ESuEizoRHS2BbEfC6IbvzuN5bPS4iK85S7s XagRUJeYRjcFA7aSiK+siSGB+GHukoGAn3rsfcshLwXKT/cXiidgj0MAUtcH+mmIfyQElNSOipmk pDesur8jvNbhlFQwRxaxzIo9jVaoxMgQycOWDd1V/OhmGc57hYWie7lrOGi/YjGe7g== rEU2MMyIwTAvJEmgE1WhgSG+wGQJwzsE567+/zB2kpHffZlc3nRNgYGIQG9fK50x7bqijfPKFZdw dQ2hvXeOlAS+uzhzDloywQm0GdrG82mB8bIldwexz5lYs31gF+0/SCbJXPStpDXaqTqjNJ7Yt2ya Xd4lZSa7wXIVRN1j/7kUlbf+VuJd0uwZCtBA/hcxyuIOYb/XUDQcHji9vJvLRCQOAjnaWNX/2wf0 bpHBPgn9Bnsxa2ohZM/7scXR+4bjYWsjCp6iaANs3J3/tJ0HVcyRAr2Bht68zuRFXGIDqVa1z/v7 0E8RUTlba90WhU+dIq9Y4UdgzvXlksvgHCn73rtpsm08nxWYCkfcsyMtYRm4IthvEL/zRYx9hGLJ VOxjutR7qVlSD1cbW1RNPCyKhSaRtoZgaUJIuQsBrHcC9rFW9H0FzsQRsLMfZjlwBrWxu9NGbgpI ooghAb046w5uaeWOtvG8V1qaBAfhZceOnRmCYJZHR+IFUUddvVHIFxFjC+X3DSC3RIFTM6Nq/7t0 icDY2yWuZ4W6hpF6leEMI3dQcqSAs8WkusMHK6C3wyUvyo7IjIP9EwbjKATc+7bN8DaezysYz14s VFxIVf3lS1JTEQEJ0XidMxQupDjpWBNiv0NDO6eRCGR1sCS72dL7Hwkv0kIIP1WVGnJ6IVcINlKK j6GJsydAa6yHVUIWH+0RqmApFpApAdW3Pcuj7QN7t6bpxkrB7sIbZ20WzCWDAqm8GjUgWzkQiw0g eNWpyM9haWPzCW4KZsM8xj5lnhvFhirlAiEXeURYfMuN4pdj1+vDJe8ZbckdVtZ0DlYKYTpdPsxG uESdBnOF7yMbvPl4NrVhXXSfG3mfFnWlUTygeyhjofW9GlHwfA0jpiJA6CnMUNWgrwhRdhWDSzGd 5GWwdnwjS8kCVi1zBhYpQbV/WuI+uqLtkyA6B5qEabku3Q8ib+jZDwdhG4ZypndD7m8W9fDCTclX o9C1OF7InUUE9tNY8hXOhqMIjPl2XQGTGCDrqlnPChcHNg5EpFbVtA16ArkPNbG6akA13BPlxEWu EJDEPgJ3P4hYgg3wT+EuZdnT93Ho+GDrImuJTdTBNya7PYhGR2AiSHCGYva8W6oC01A6DIWqAT4k 0S6Y2WRRJQsoUQiMstteMHbZZE8kRo5ZE/Ci1AClmmWh959ZcafEKkOseZITAC02eRuNDjNCkcMT QTgja1gpS6AaDK3FvDDJ9/fdGlUK6mMgLoPR+yjbpudEKFsFOngEMCWL37eArE4G6t1Jd2iAAfGh TGoKa0WWOGxtpJcApI3SGEJxEER+xdC4jUcHiqWNAEHfOTreS5QX0vG0vPv09xUnKhwRPUrrdxuk aeZIU2hgYXeIgpnMEjiCF6vGdZGwOWxPr1hRJwEp5sICYSAkhAUAOiGrEQRskAbQNYL6sXEcCtAc mzoi28BsxHCLaNNCblsTqTGLP4xsSg3DHXAF85gbCprGkB0lyjsffNQwMaJ6iNA6TmUpbbAXKNaE fO4VjDbOY8BsDLo/xcYuBVnHSZIFaMIhLPpEtqp88IfSGxlhL91696GNMXfhR01YYHdazOGMmC2t FjEmkCrpEwR/TRz9blWgFBeBkBaKugtdthFImkKkfdPv7kDmmjhmto8s+8i0ZdlY4V4nhGQqRWZE T8DuRlFINKu4c7M8keuk/tY2Ah2ZD5xEV/X/wm1JT/T3cSuH2PmZUnxwZsxF6QyFg6/5XOobKaQ+ t93IGA4gtnLKIA9PD/t3N1c91oemRMReRNzsiqYEKTCOAHmV3Qk8QEYuuuFH7MP4rL1WGrOrL0ry 8qjmA85ppa2ExJfY0mnxmTxj2o4IllFK80QrUJiX2DiPiJeLmqkXe2gRghFsU6OyC4iU7p3dYKYl m8Sz1n0c9QPYn7WZp97SVOWyj+G9hlnFOPsDQqEIRbwwTtps4OiqCisS+0EMV7e6Au+1q14Eg5NQ XZAsQRigWqVKZ2nOGHDlchohm6IvMDI1UVGRa+9k0gr3ZsxcyHhDIuvELISXIOVOQvj7MD5tyl9I 3GArqSiOSXnkcMmDKlj8YnRX3YaR2E/qmVSWGahm32TD7jbEVRFV66otXlrJ1V2fDIOONl21NbsR HJxnizsntcPhH5MhT+VotvIil1qxFleViPoUhgZTc/dhAfqf3iEv5CxRbATCGIImeyOLoStY/2JZ eeRN0Rd4G809uyLXI3YNY14xxcuQK7mklKmbYAKJTksteifsLGKJtTaqBsmOpThEsJqlyMLBe7k3 9lFsqtuK2MhGAcg6oocJDxwrRM0W2YGmN1EW0fGT4WqSU0fOWAXHUyYnbnKDQr6SVrkJSJ2qgJjY 9JVlCWcRGijfZJ6myIxvk2LfR/NeFWMMhmkULO4mEhMQGlT3QySmbwRJE2kiMF33645k4hJGnaCI CzRCXoXl2qQkcoXmJiTPC7NISOAZeivW3IbwaRHJKEloyGKPWtnA1T3VjUrZSI4K1UmOOlmPIuKn goCyikLfaPsc5jg0osNG1ntAiY5WyaKeAOk7VMhoGhk5+tZntaShdSmhEAJ/cEKjkn2D6bZkdVN1 7DaI9woGMhPdxK9lFNBmTlpUP8pn+65B1bOIH43iWXxGwz+VOkpnA7bYThmKTTXm2uUhdoEvbvhs CLygGq/rZV00KAlC6gf7vK5CZMgQlewwK5lFyAW+Qqnc++9uYxgc+EQhNbJv5CguxZqUFrhVa3br DfWaS7km5WH3ek1ydFBnNddrwi6+F2w6VHrdKjZpy9tLNqEyPcLRS80mNsLiEYVaijZv4zLDu3d4 KNvEHner24T1fnF12Vy4mdKhchMFvmvtZqqn4s3s79Wb2CLu5ZsO4n+r33TFHwo476P6tNJIiDeg iG3JYCBWfvkthQFfmQt55xwGSQHyOUsSA94lO6JLFiNJ9HVNY8CDha7Z8hjXIZFBbhcM9TWT0X3z lvZUxm1o795lUOaA8ps5mQFqstuyGRAhT/UeczqDShoQpFryGWCjON5zQqOzfJR8WPSWQki3lAZK FG85DRAZmI1LUuPiaoI1q7GN7CFKJrWDs4t4F0J4s7dLwaXe/eLvIoQFx3p2eElMOoNWh7dPEpT3 5PFiZd1cXopVQPdOPq+jevnF6QUHDl5vO7u9MDJJD61+b9c+zq+OL0SCDkMsnm9C4SLqfSfXF6Y7 VXktvi+kd3N928H3hbzBYpmdXzLawfTZ+yV2YNHO7u9tOJ83Qi6uD1+skFSYBbMZAiGgiOlih6A4 ZTNEUjxYIvgyVPKLJYItgkY7myIYNfcy2SJwX0i9zcYItASO8KzWyDaa92uQSpv4Yo9cUoI4GSRQ lyQXi0UCp3w3SZz6/bNNApcGeanVKLn4mNRklfBqj6tZ4qhIPtTFLoFgUBh+Nky20XxWViLKh3Hc KElSBuzpKuEqUK/IF4Rm9TG8HSE24iRR0eW4T0niEK4aGhGxushB7VBlKUYEWVDRjYWm6z4WPuyC liWI40z5Fta2FlzBrkfB3k5R9Np5oo+6EbBe2fpZB/RecUHotNFZLwSYhSGkAhuda3Mqg93coaIr qiS8xDZBCskRj3wWnwrKlI6k0FEC4WaUw06UeZMC0d4LVzbGMBxWnPi6YAEhYBBlS0LIpWKngyBW P/GNYrBUgesUuIzms/KSEeVCygHSi9VPxf6R/6YtQA+tYc+7MgeVu7q3Yn8+4QM8RVYEMktUkohE RNBCvCSlYCgKLTLETLFzjreLCGUpZALGXPX0w6Vh475qs2SostTXUZQgRetmHc97xYXsSVjqfd33 terslAdKs9GVzjgKISH/BQcV9OiGznimehyp+VO5AluDcrP/7STkrZsR6VjIEFhdnR2IIGeGLJFm xzlyRRSH/AJnfIPxzTF/sXhvg3mITSLJCIpIqEmiSRZkb4NG8DXH4q/J/LAcC2oDLQuhlu0UHp1S LM8jmmIZFjdrek2w1KkAX/MrCFHHqh1JegWZcjNMtgGZXaIZCDp2IocNLbmC4wFjA5HcSvfcs2Yn LbWCSno9+jdlViYLZiRWuGRfqeK8yjW5bCOtMoWDRlalLy2zniWpgjKla5hPy4AepT1Q0FjiqjyQ ManFyoxJd+D4jGyGqjlw8kmLGkxxFC4OXPQGajPdpjbmmm3RG3RcdlMbOMmjEW3VGggbWWntNoyP 6gyq6qh5URkUv5OUv6gMRAbUolWNgZiFC1ZrzdW/08SrvvBysGbVF+ywz+rCT+X4qi702OesLiDF ZRw8W4ahbOhGFZ1qhUih1ISqHDhDjU09JtkrC4JuSGhiF7MiIXx5M3LZRRd4A3oU+dLO6EZ1AOUV qJ5ESKo4IIFIMELJehysBhF3rFufLV1Dxh4o0qx9RTnwxVnqLsWWnFlG89k1gKPPNXHBoK9ikKLU jDKwMHSiZp66R0PJ7L6Iu66sygo+soZaVs20lsol42BF94ulJe2mXG+DO50USIkZMMgXDVcHLgGh 0szijUEk8I6PRQ5OFkedF6dlcvuA3rscmuPwMGZZNlAcIuoLEFk7PfWKlBGM0g7zQaIuOECFAA3O f+upUVSuYVHSCUgtxXNsQ5Q4JBoFIoj/lMAFrgIjLVnyVB8KRz4wLRJEajjMH4mUZjUj6yA+KyWd kuy6FVyQe1emOK7hhCtSitX+0bosiL6oGDfxTjIf3yVY4ZLtEkdiDkzGkOCWaUS8OV4CFPoSwwnh e0gXDrVr7XWLXFFUUD5TjKMOCcFShmOzj+O9soEQFvxtKh/SAxWdDwjywYnTXG6k0sd8jcwmlivY iVMpVfQILGOEE1Pi0u/fcQ+0t8E/1sgZIgSwCxD50Y0FIaFIiVLdhnFYKHkqWUpazkh1J70HBEj0 7MQ+hs/KBh326es5+1EQDjOnTw3SxUEWDKqh4JuhmEt3LtQe2XFysTeh7LA4qLBM2+FQKJ9pq3r0 Gr4Pjt2mNOJdiA1BB+PQlxoIqMxCRWeaEl1JiiuwVV11nG2Zh/Fe0cAhTJxliG6IBqoJEbvAsRwV DYpr00kdkw2HKE6XRlRaqWzgIAk8JdRzqWygxLMlCuyYbGhiBZWYKhs4JFEov6WyARMCgSctXSKY Y98+1CEb+yA+Kxs4dI/jUvEasgGLDoGoNmRD04nxGrKBclSUgaFi0k68SwQCBxCv0Y7KjQFT2RCj MYSpvFvuaEHhmCWgIsdiUXqmogHeIYkJN1lFYx/Fe0XDST0sMh1UcvPCY6bS8iY1Cmzh0pnMhjCY msyV2UT11xrW4vs5oPScxq8a3yCDa0iaigvOm3VFibSuHgOk/BrOtRY2QnR4iESjHnGqhodP2to4 lXgbxaeFw3FcnJJF9bIlg1xf45sNdNIpKoO7UFIxIJ3aaHViC2qNEJnLtjVCsJCeAEgPd/cOLjpW bLXtsDZLoxebMQDXRaRIh5W1AJSYV2l+jPG3QbxXOKKXCilcm1W4NIZCwV1F4zyeHQ== xK2sykMeCWNUKUOPISZcq9Uc4oZbHNKjwh6CSUoRRwvVrIYZhoornHyrVsNINd4hDQs64hztRaQ4 N2odHc6nhqmifR/GZ4UjYidH4r5x1kwCgbR7h2H7IMmHAxIoKVVfKoLBgSLdWuKLAmucGkZt+yjD ZH7C8HI2CJy+QbWAHa2kQqtGrzZdWQgU+kinQb0qbDCv79KsTJTv2yDerTiiHM3HH+TjsQ8f+EAX xR2ylTdKmALePC5pFigcVXJgrnFqBC9WvlEjT7Xr6ARlAHSlRgwjKH/lzG2LReUR3SAb/RpWGCX2 2Ej3fHqRoZlPQ7g5t3Mb2WcFho7AFb6/Kms1NN9QJayqSc/ngzznuXrZWSozSNYWQdNanXGVDoM7 2ibjiAIxr8Owv4CMI6thOkNKRVgoX6PDFsFOnTUKJQAYvVZjIfjKRyXcuD3kNq53KxjY5LjvDJGY KvXTscpdFhfsTInExsQTTCdigp5SK1wNTbd46HlqzH6ApOASj6iqApdtoe7sQmJPytYQIUdBO50w KpPdh+p64NQDr0nv0bjKqKJNkrAAEB8X0X7WAX3agnV66KdRZc+LdELH43DAp0g+FB47igIubNDB dAGVDaBQyvZKW0m4ASwOy9bBjQewq08DsiRdqLpK5hhwkviicLs5BrzRoLA/xsFIrKLeuRWN7sMZ 7BnXV2rMtMmtmpCZBpY8XVTwzndv0h0bvLpgD9ENOH2b68tESokKb684NlODng7q4s8RY1ThOq2z xgaSoxyRtlxlELpR7jHq0Mk4Rm+wfjTy2PiOJLS0qntaf4Uir3UUeJGuo1UPA1wj3o4Ox6Pqv0Nb tOKdbWCf1kMwbK/ERSIXQiLKKjpYhKiYauE+eAo4oTKoDHKMdK8XAxFLoRDoAq5sAypS+IDAcVB9 gb2OC/ZwZCgMlvLZCDKJxulkuomB52RwNAae0xT1sNNtUI8QqtBGsVCWyxfQEaLl3QKsRVNbfZww 32Aqq+GJ4DxZYrZ5IyOI+33adJwviP2Kake9eQn7JC6rmi075AjJfK7jvjHaRrtoghLNVWG3QzwC 9qnGLPdRfNrykVJ4um8ohKpsiY5OMEI1jGve4C4AlvT+Kppnpnq0omNNrYxLpbAXwR5qiN2IqdBh 1RWylauWbmG8MGZwoVIQYaSjP6kuvMcuibg+ZqjaZTLrMB4iMYV4XZilzJnCAoM0mvpRcJAhMFnK aggGFwCXt0V1LGD7QGByGgoJyxQCkydbBysCApPlajJlMwQmyxIUBhLrc6U7sKQZyQuy5OpPb2P4 rLiAEvA5Ny4AEp6QtCAknpU69i2pIqIYA5hgSEYenAPBmY8ZCMEkLDkv1+uQsCD3YAtBjhIghacX 12EBQliI78X4ScKSq4noNoZHiArSBp7vjMupyZGDS47MBz8lYqsYHjj9FoPd2UbnZoMbx6pReI8b U+hIa7IcTaFrOgLKTiT87SU5igJXdRlwt1vE7WO4cTEGO/JRcGMp0eP1HIiTmq2Auw5Ef++j+azU FL2yFjESL9ZykUOH6Dkodxqde6PjrM4uVRWq3dghwEU+PgyHwBt3SNgAjFkUA9JaCObR8dcr212A nD2B62Vs5HwDz4Fx0SGhgrkq497XdSwPMXhg43W7AIc5Yeq9CIzsHQT1LzVWcKYc5g5OzprbdVW2 dnB9mt37cRU2dnBo32qwcHAfHdUyHbtGqTWWWs18R562JFsHt9DaQWqknGEvVDgUalj0lmTp4Ci+ HpLdB/RpOwfWN0wCuiKtVuMQzBxcmuvLGDbMHGRHoh2yqEJ2HZVIYCSMHNx+YJ7qVVnB4kDuZYfF Gps4OF4SNQ2OQUMM6nwJM9gDC2edh8YmTuVQ0O9Oo5nYI9eoP1F+Ar8Rc1SyuifOF2t3RxyV8OKM yrWsoXERgFUZXHxLk7eSVCrm6boam/m4pSVyVokUuZ2ilCQqnZQdMMrPUqxXPc7EYWSYlxYlRQk3 FQVO15xQjh5qLtSRYUZLCVD7okbhPhzjjtyI7uh/LWZBVQDYNr0oXkJANNXpnlYtwgqV/9Wu+Cor uL1TS4qjF7s0iS+3aRSoHVV8UWop6XhwGWENSlChpdVcxKwY7QAe8QhZbHSd2rg0ZhnO5wSDtl+6 MQNpCVk1lLmmuy2KXrqJIkwqJqPrk73Vw9AmgKpw2Rcy5BrKFPXjoyyJbntGO9tpLs6WoJ1plCzp D0KodwVip0FBJnrubxhKuf0DglBsa1jH8oZUoH+61qa3pRN+L4IAtUE4OGS3oOFeAXI/Eh+TFiBd ShpHyTQMLxQ/09UjV7BNiNQOgGqHZrmFCCNP6mZhK6eic7ytJ8VxUNdQ6t1RxCMnnZdqu/E6mk9q i8rhRFp6VexaXDJKl3RAF9ihicxXofPZNPUOi5xKQKzPwkaI0FS+YMPbebUqV7z7cREATmtx6R+u 1tJTFLjGjDLrYTrS3PiCTFqietLAiX6m9XgFC7uvA3pLXyBySxdb4ARqTpoc4bKxOMrGECEockF9 1wyWTbPDevhymHKJrkCmEqZL9Rru1Mlci9G3hKhAinhj8JcW4SEzQ5c14XW1ynAZuOFU05HYJDeL 1JqMI+uAPiccOIBCcZ+MMw/e6S0PVP+FMsOggRfcdIDIQU6T/a3hXxySSH5cTEeVaRn5UnHmkUCk y1cyJUeDugNcCIJ6J7Pfo9yJkOPIytNtbHKyAh/g05Z8N2TCWSG7wHMdzxuyge65ejDzni4Xpl6+ ck92fi9IwTId7Ch1DP4SLtmt00HOF9KNAXrzPS5SpWtu8iTaIXAIAoN3WT3nro9RL0yv++FbDZxF pyOOawGaqvDbiD6pORApwz0YKP02zRFEddAnXiyEJKoDCk1r9IJojtwmxRFEc5AmjqMWEpojV77t kWGiObAHhctZQxRb5zbK9oLoDWjNNkWpSG+U+TTRPpq31AZlfPpMFcoKysDlNtcylY9RRA16A36H GRRB9Ab8PLtZL2S7Ot0ukqEgG/QG9pE6MY4uUUUdmiWsqSS9W92ZL1LSsRtKs7CCqA10bvcRbeP5 pNKQC5Q09SJXprTMJ1KsehJBAYRDULOmaxZxkkznYYraf8g50u3zYZylgex0OrE7lWQBgICa2Ij9 c1yWQglnKG09SUD2Xl+sMY1UJnE0ECVZ6xj2UbylKapcCJD5BlOJgvBJ/zm+k7mUk8w/rYjPdlTH DtHQvS/daoDJrtd7BblzEDDvLDRJZ13paqlBNhUSop2eZMaUCz5dF0HKNdGtBam2YXxOCnDciCLB sBaSXIWP7ACV4CMjJpFkSrPQNQC4kFPqZlyX4sbtnN63kuhzJIHSfk2vFkiOzFfESy+9FdjrmYtr lDIkL5mw6MeN+TgPVzKbH93drNrSwRcmQ6VoAmQfzRvigP6T5y08Swg+2Vd6pqu6UWYcGjeklLv0 xFsUEpZWSoXA68XpwVJGdoutVQD1nnAcU/GBU67jBmIU9F98s1ixO3bDwGmrA2y6NF2q4e59QJ/0 QuSGa+xwl1b8UgUyLuONer04An4X/DM/IuUZbhncVTdS2mSLo3y8DTcCpjgCRzh4r2Yzhfcapdft 1rgsH1mhMoTLXJDutzAtWh0IBdqQ+/ej3T6MNwQCMSvyP6UCQkbMlyt33mqxIn3co5Ynurt3uGIo ZMcNx1pejfAokn4ITWklVhablcJV3hySUC66CdkCsdhIcKKYPr2SrMaZVBVgqjnBGSQeg58+erEN 45PWg5PbzXKavvFyNb7TNqMwQs+dXZWPjMIOVFuG8ouNKuYsagsYWVXZjfp5CmfRJfK4F90+LYWz U41uho/jEzFgSpATarpZ48JL+p6LXKKmOCn1mcP01ZltPG/ZD+ge2jxHDsa9KAKKiE/FHhShIzsn jvIFXI2Ju4lgQWf7EA7SDbjX3k8nmRGW6vZN9tOxRASggH6+Tgd9k35CSzNenOOa3jzdikFBLRi7 ZL63EQhcxvNZwxLXEdPZMVhKUfgT+LM4dK7b3CUIbaDjH9g0LbnpmRl0kKWYjeT0GpUwLkyB8Y6T AnR2OeoJEHJIPF+NnzX2jLZy9I6uQbamtLyILvsWCYx6cklQN2sE7ON608aMcm18gu2kX6ZAKBzh CjqZmicukLIHtCb9PARUJznsuHUnmpF8cYE4nf1NZgF6jmgR1Jv96fn8Oh18Nkc+iL1BbYtZ5FEv wIsjnwvlKNe/ZW93M+8j+5y44IAW7rOv052tCKdAX9a8aHuqtMSVi76atqe8KS5XUssPiRocHqxj tyuOPxBQ49h4iueMU29W9IhScRxHrelZ997iufK8U2IavMh1NnUEU/dBvCEZ6BjHcGphh+VFXsfR qIpvn2QbL7mQdZTiwinLTB9VZ+qWgI2sxvExNmyC2Ew7LOtFnJo6qZP6x1eUEOrHjEughk7tCjrZ xMAVHBvAOROtl9wH8TkR8HIlF4UIq5ym4m/iNAqpjdqxJvcjIT7Zil1HzdkefCQs6pVtl1yb2pWb XYiDI1eOG0b1RVG1e1HVBO6NEJVIJ+c4unldkqZCWeelMT51RlEJ7SQaWNUZvY3nDXHAsUE6qePi uMYLCOgyTWBtNsqAIkGOJl4GlNKMMIJdTUqxcDWgWtV0xS8UGkKZtRo7XHJyBUkKVqmaG0V2qarK +DFw5moMoTQ0dV6V7/t4JtH4eUfKoqinmGlILxvM+T52xFoQZqVzPo02XfkwJz9/+0IHzDjhN9ps SMLak7xksM7Z8DSw5K2nPHoyaqRN3JHEe090zWyTkE4gpfuygWIKVFdCMgSAp6rlpL/3R2BqlZ3P 0eKGYe5FXhEQBZXoJcGR1l7S1IvQwS3ajqHdeqGbZlVC4SrLPbMTiAhEipduWUZ6KpCNr79L5/Sx E8oGE8i3DcMMKPaKgAoTOHCUtZeivQw6tMWKYRuLDjEqM+lLQEWLJA1GwhblLAJ9RKc3Qu0fNZBn IKPSSEzCaHNDsvQkLxmMhM2w0J3LU0/yLC8xNdqm7kjqvSe6qDMxC1oaztAEow9feclsNEkw4lIv +l2eaXYiT4a1iRuOuPYj7yiM/jUcaesnTf0oLaPNiiPd+/mRlzTDy4geGwxnbbrNmeXGSVyyjDZQ A/I7PYs+YRq1TdhwhLUfVVwCI6POcJStnzL1o7SMNiuOeO+HNNAl3yCLY5wGC0wjMvJY+S0w7iol 6foMXMiHo6p3arPjWPqRdxRGNBqOuPUTl36YFoFN9BOOfTw6ThTW0M1oF3vYLxOMPONOY3G8KLLc LQjzSH6n529sDNHimtrsOJZ+5B2FEY2Ko1xrP/os7xAt1sZvOPy9H9JFIs8oQgtyY+wEi6g2ibIm stz8E2Xd6DMpCFlb1iZuOOLaj7zDMDlqZTjK1k+Z+lFaRpsVR7r38yPrAhp/KmM+DSZrC7fxgodJ zvx7uUlbn0k/BO53arPjWPqRdxRGc2E4ytZPWfphWrRN3HDEez/0kTHhaZzmc4LRXA== JFn7UeYqiX6I03wm0SHWJmw4wtqPvMMwmQvDUbZ+pvk0WkabFUe89yPfRdYImI1zghGNqO+ikhNZ P+FiPuuzbOH822iz41j6kXcYJt8KMBx+68cv/TAt3vpbcbh7PzSfiaN1vg65NVhhmUN4AjkLL7JC 3ybk302ecOQU4eWpzYojrv3IOwojmTMcdeunTv0oLdombTjSvR/+5GpiRRzbmNAZSLNBZxzAxtjE ZrnERVfAN3otinKYWt3wLL3pawRMUp9leNK19aYAfY2XqrVKO550702/M0v4UH84Bj2ARiyVThW/ Daf4mYzAOEarsOMJa2/6GgODEqt4wt5b2FhMNIWNNQNPvPdGg3byGVM63Kk2xAR1LJF0poBsTnwf hz9RlOVbjwohUlxWEqZ2d1xrn/qmQTkcNnD5W59+7VNos3blhmsfp9mKcn1HmnT0BKPJyvIxqSQE 0WcW+HebBHwnFetxarPicGs/8g7DRL8ajrL1M+loo0Xb+A2Hv/cz6y76DF9YVBd9xhuOmOoL+nJh MJUij7PmGi02DHHpZVZc/Fm/HJ4GDr/24q0Xo4NbpB1DuvXyo5g9BHZE3MsCQhgrUB6WzyQ6qjeO Shw/iiHE95JKi7BjCEsv9MoESpRlNhxu7cVNvQgd2uKGYe9FP5ls3/0q+m3oCUazAAhd1UNZmUDP TlsINlypS06Vtck3LHnpS9+SmNXFczHw4JLfuS9+/iYUMj2jzY6l3PrSj52zK+tn/TSgqlOuSwIc XvXOJRu/QVhV6r4wt7vjWvvUNw3KOmXg8rc+/dqn0Gbt3A3XPs7BAdWLU0htAVJwgU5p8he/OGAG AOvKKarGZwhB8tTqjmjpT98zIIUYJkx57y8v/QlV2irfEOV7f/xVHNnq6LLTqZ7YgExvDBqbqdxF 1K+tC4AIibo1Tq3uiJb+9D0DMr0DU9v7a0t/S8RoIVwQxXt/vMaDCAVlBIt9AN6ATC/uwCIVgm0C Xeh1FQrgpSelDHOrHZFf+9P3DMj0Dkx+789P/RlV2ircEIV7f3Rhl9ziMo97hhG1dRt19aIop0HX bcx2RZch8WtP8pLBiM66jXf0NIZbt9HO5DKScO+JpTvxLdFVrhJ42YBUt+j42k3Kc6ERldNTAwF8 kzVB2nVutaGJa2f6mgKpHGLgiXtvce5NSLJGaUeT7p1JtIq9jTaijxOMrv7CWRHxWGhTqc28GosK 1maej7ZZcEzPYXpHYXQdn+FoWz9t9GO0CGyilXDs47Gp1SO3Pk2OxARkBwBVg+C2V0VKHwPkFsO0 R3mchD6lVdnxlLU3fY2BWRwAw5P33vLcm9I0tdrw1HtvfOmkxO7KFFuegRQYxvUHHBmTyDHdHEEt pvCyU1dxbnXDs/SmrylQCr4UT9p7S2tvTJO2mqiWrPp1740XsR6uvq5pi5qAQq2wtTWlQ5jf2kyH TNFoVW6IytqfvmdA2VmKmnaXbD5V7b+RRTCq5lY7onrvT33lPA/gZQPKjQ7Rxs3fBb+ijXtM2xVs 3NIq7HjC2pu+NrjDf4Qx7EDGRhzDHqZMHMPWVjuieO+PveVLvchhfc8wtpuvpv4oW9ZXU691WN+X RUOszR3L3Je+xTCzmw2PWNbW12R9Gz3Sxig2LNu4bENWo3T6QvEEyrhHtl6KvOLrAVUtYH4k3atm srW4YZh7kVcE1Pg83MDR1l7a1IvQwS3cjsHdeiG32Ct4yhUNoASSk1PkkglKTgmY0kXJKZGj1Q3P 2pu8ZkAOyxmesvdWlt6EJm3ldzz72Kb8GOO7JBHzsgG9ZMj4G8KXpGOyhLkNIPmuYpEpSZJteMLW m7xmwCp5smIBu7W3NPVmNI1WG559bFMARJb5HAAxkAZAOId8OQk8OP19BEA4D31pAGTDEJde5BUB jQCI4PBrL3MAROjQFhuGdOuF8ipVYj9TBHOCkb2A26IpfiSRSV8kxjSFLykuHdPcZsVR1n7kHYZJ yNFwhK2fKXBptGibuuGo935IfqW6CrnWSy42mmB0KCXLUWic4UGbzF/MtOdv/A59Qsfa1A1HXfuh dwaMPnpmOOLWT1z6YVpGmx3HrR/J17PHwRKj+XqDZfgydHd34e/XYz/zGhyT52/8knxrR9rEHUlc e6KXDEYCGp4GlrT1lOaehBprc0Ny64n3VinTr1MSaQaytYtqV/JRTEc6Xj11yiNRjTCZ9W7sjhue a+1NX2Og5IEGHr/3Ngf7jaap1YbH3XujxJmuYzfsxxlGzmowZcChhJBGME85GEylSJu4I4lrT/KS wcjeMyzuWntyw2w0akabDUm696TX0lMJOd2FH/WblwOKSsXGf/B9bNjhYuJPVTdtQ5Bv4lwUXJK4 tNtxXVuf+qZBk/dPEyp/69LPXRpp1s7tqPZRDgFv/DE1ZGaj2swTkM7HO71tE0dE+KixnD9TAIuc XEo3WtUdT11709cUyHXIhifuvcW5N6VparXhaffefpQePVdHuzm/ZNBLc0KFTicCYCmcok2mVE/h A4tLuzuqtUt906CWEhJc7tanW/tk0qxZvaHaR2kaXINKvk4lVxOQ7tj0XvMd6qU7zYmUqRrKad5k tNrwuK03ec2AdMHywFP33qYoy6BJW/kdzz42HXSR4j2U8+iUK6xqqU1jNUKBmN4GF4fL78b5Ulkd WZu64ahrP/KOwrjURnC0a+2nTVKltExtVhzt3g+7/5LuTpMTPGDsu0a+kyFK6MBprnsOXMD0dXG0 CRuOsPYj7zAsayGk4MhbP3kOkAgto82KI977EXeBz1O66QzVgFFoAqYNxCXKjpklJabPavND8KY2 K46w9iPvKIxLiRSH2/pxUz9Ki7aJG45474fkNt8DlBOMaCx5DVCWdA9Q4lPdc4CypA1HugcOJxjR aDja1s8UkjBatE3ecORXApQU3/F0OmGqdBhAqVC4xKyxNDziI74ZgIKkUperMMRsZizTc5neYZik rA1H2Tua8t6DnKnVguY2LJNf8TXzfAZwwFT2yLGkOD7L1SW3wg+5EjfE2vgNh1/7kXcUpoe8GEfY +gnLOmFaRpsVR7j3I9Xaiyn8MsOQvY50IJE+LFrloyoqK/pMqp/yUWlus+O4mdwTjGgzHG7rxy39 MC0Cm+jnkq3r3o+sU88fbKGbqXSdGoyyDyXzl2norsuLFl3RBniWRcf3no02G5K09iQvGYwOyg8s buvJjZ6MGmmTdyT53pOUvnK0MiGt7qPWvgqQcu9UZeQTH0zLaIRTP9qAAESDfH1kbrWicVtf8pYB Y6zlaaApe2dl6sxI0lZ+x7OP7JZKoE+H7akEKPcllaCrxIL781KyFMDc6oZn6W1JJWjl9cCzJy7y lrhgmrTVRPWaSph746RRHjV5NugJyMQGUflJO8CV01IOONkGsnnMrTY8ae1NX1OgnJRQPGnvbbFE lCZrlXc8+d4bD1qslBDmTNkASoZLculBM+9BjJ8wF8Hpw9zqhmfpTV9jYNQMl+KJe29x7Y1pslZx xxPvvakfzFXDdRr0BGRicQ2DGBpSbnAx7xWgnqyaGtZqw3OtvelrDNTbfQ1P23ubSzmNJmvldjzu 3tuPIlsiC3Lx+csOpcvfAGGtQNeu4XCxBSEU8k2ERITN2sUbrrj1qW8alM67T7jarc8292m0Te12 XPs4LZeiP/g6ihsmGNclaHCFXDw6K8p0yDMlOjRIo23ijiSuPclLBuO6BMNSt55G0cygxtpsSNK9 J5ptidu22edXmLrpEvtVp8tJfHh2zJzEkKc2K46y9iPvKIx9c8Xhtn5mF19p0TZ1w1Hv/dCcyrVD MOK0HtxgXs7OyBevsnzfCZdcyu9Wp13lVv2pzY5j6UfeURifv1EcYesnLP0wLdqmbjjqvR9KnUjR X5mCGBOMthSqc+WvbtFiSuJUlimCQTtEFzprkzYcae1H3lEY/Ws46tbP5IAZLaPNiiPf+6FxWhFe sRTRBOIEj+YZPR0zTFbxZwcRrfTcWtwwzL3IKwKqkuAxHHXtpU69CB3cwu0Y3K0XDPFvv/zVl//p N/9r+G9/9dM//5d//MMf/uX3P/HzX/zLv/72J4H8x6c/+5t/+cNvv/3b7/7t6b//8elff//bf/3d b//xV1+O0O530YVQ8k/hGzvpn+R6j3/8gqPTTg5P//3/oMf/rf/5f3fgvz/Fp//89H/8n9fTPxP8 7/+GXL0Z4cuACNKnrzAwl35mkDT+esMEyE/Uzf/+hY4088FlnG3GV2Xnk83TWfcO6YuGzjnTLbl0 zvl6+htCURPuF8aPdNMZ5oTuG7bh/oaa5ad/H9TQhWxXngdG1wA5HoWTk/ozzGe+EiM4ju7OMPq3 D4NgnVwX3ALbegXon77Qbe50VwB1F7J+foiTq8YuegsXRA0Q4Q70ediGW50WmNBErzq6/XcG7X0u tPiFMQKamYBTSPLReoMluYZ9ZozCZiYgGN8WyNankkIyFFa23OUKF6eXsrDFep3YslAiPIBOj3UB 7X0qLYKdOkv5tYWg8jLDFDt1tsGIqLzKywzbet3lBbOAMr9XJkkF5ia9UHyev6+zwKaeRWJm0N7r JjEzawQ0s0ElZobpnMysUdjcM0vMjRZ/Y4zO3swYkZiZCSoyJ+mdGXOiRWRmBu29KjUqfjrbL6+s ztMqVkl6U4EqJPGn378e+lRapkUnlJwWxGnh6MRN/d51k0ImStYelY5NE32PJdTcvy7OJ9V0VyYH 9fdP9+X/PabMtJwk6CBoApppOeicWVZUrmbGLFrisH5Pu9RpMxMQpLSt0jL3MKRlpuW4LA9L5rQx vD5JMy33RT7Jy89lC3E3r/KyaKGDYrqrkoPym+Tl57JlpkXl5edZTTMtB30DWvCd2wI3n+4U508E eL4JCBZTUEMp63cFCu4N8nKn1msm0El7HJTMdWowC7lcUxMD4qwo3Q642RJmG/4Smy7jcuthrXk/ PvxwMELu6uSgc16zc/yBuk/wb1vWcjYi53Q3JVbGvWZwHLiHLpVt0/cyjG0g7sr9f4pcf7Qphpfv GACzNnvVzN0UzY+HRf/ynf107uctq3HvB1/QhFNArGfrnwVkXH/0nGHxR5quiIucUEqCl1aOqFDP HDnY0Ndr++5pe2YKPfwL8jgwM97hxjl8ll4Ei7wYke7+Ii7A54tRt112ZuHBir1e24ZPuzUTFvUj Ih4LLjy52bEywc9CG0Q92CdXbnbuaZM47CXX9yzXBymFmbRXDcOZsNdMWX+g7uOM21T3pBNupuLK t9cMyhPzHrUkqnxcYV4SN59l205f9W0mfA9bGjOBp73ztMe+5WHsBP7c0Mvf/vTTP778yz8/CeTJ /erLAfZUn3Ccv//fl4/EWPA2yQtw0Pz76a9Kf1T5FzGTP/8j7eF/+WWET6rOf9AV5O2DQuBumhdc wm2Cfr+tHHloFgjkzHjK8/RXZT3E7cY2BSpwrwc+bq2XnOsj6k9RZlr6vy4gxEcp6w== qH99Y+1CN7oJCIVgXUL0VX30Gk/GEy70xSv6Kr5sgArlqH9JDTR1KiClSd+dSNZw3J//LV4z4l5+ McS9i59nAYEeIG21WROqJHKij6RBpdFVk3KBoIoErt5nQcBnBewvEQRut4oEwueTSNijDAEHb6ch dCU3DSH5hevymV59VR+ZN/KknNNXhbEpz1zXTgWkNOm7E8mLSAziXn4xxL2Ln6/pDN3rxnfZ7Bts 9hN/bAwfoicljbAsqRM2Fkg/vPBfsYoZYH/ctMgQD5S3gX4Npeljk5XlhBmeBlH1D2LqYAiWJLNS 31PG0oLkB2G6vCZTUvUPrirl3vR70EqM17smjdZFLoyql18AVe/h4CvycKkxYVrBJOSC2QH1UNXe kMtpu+yQRcIGWlVx6H+JFMAWs79uOmQIRMyLQNijDAc37k/Didc8HpQ0TMynGoPBfX1kPumTcFFf FSZ3vNMMaKf6Y15nYCJ5kYtB3Msvhrh38fNPpi/qpQJSTU10wPhLxKJedwGBPpsExB5lQKQIx4CK nwc0K9EOUv0rrw51TG3TMgf66lDs0xxop/pjXedgInkRkEHcyy+GuHfx84E2BusHMTuD1w1j/HXT I3ezM16L2UmyPZlJkH02k+Sv2ewUkBhv+qo+XrNlp8tRX5XV2vHKX7NlJyClSd+dSN7NTqHk5RdD 3Lv4+SfTGawfxAgVsYh1+uumR+5GqAiIPYbVaJJh9JUwDWhWpMPO01eHSp7sPOWj6W9T7tMcaKcC UprmbeIkIIO4l18Mce/i55/K6GBlITao01CU/XFTKXcbVAp57bGsFlS4xIKSPyYbVCBs0tl7uvCG tWfrWUy3Itae/DFbewIyYq7V2ptKc8UGFRpefgFUvYeDf0IbVMSBvg+oe8f466ZC7jaoCIQ9ltVm klH0RTCNZ9ahw8zTV4c2nsw8U9V5mYCOd5oB7VR/zOsMTCTvNugkGL8M4t7Fzz+VfNRL5aOalsCX bOwvkYp63eVDbSSt/K/reNRkklF0k2kazxzaGVaevjqCRJOVZxGkukwBzgGOKdBO9ce6TsFE8m6C TvLxyyDuXfz8U8ZBXVaD9NLNw/64qZS7OVoXa5SU4GQ9uajWk/w1W6MCUnXrFoOvzvZe5E+k2Yt8 7AVY+a/Z3BOQ2XPydTUjd7dEhYqXXwRh7+LjY4OfIgf9r0v3DPvjpjruVmddjE6lX40koRrHcgb9 c3Bn2HX6qkWJJrNOeGYvMkeBdbDbumSQmW386iB3NzgnOfj/n7B38XGpLP30lqEa8GWyiASkJo+p wbiEae1RMwZuCdPWOUob11TDmmlYEg1LUFkDj0mmYAopcybu8y4YokODAxY6Ssumb/TkhQP2mNZN X8Pn18wCNTYEJKaIvqqPfrZTbOvKCx8GyYMRnxaE4mc+WIQkLZubEqTPQq49pnVzk6EWP/NhxjH2 Y31VH/28H1sUqS58GCQbHz6kDeHsNxu6RQLaEkcw11Kf86LBNbRkyS+vGnwKLZld4ecNx6LaZQml lyUaZmZnU3tliob9+CDzAE7tYIR5vG3xly0+5xdG2GNbVZiMNeWZETOOoXEtfttmRuiTX1380Whj RNW1NGs0AanKMsM/Lj6/PYZVo4mnX2eXPw6NYBrN3ltiWEuEQt3YIBptik88aCHD1RgMMD8kLArN yMkLA+wxrApNQzHXzIEZx1Bo+qo+XrNCM18tL2wYJD9SmoufGWEGd1g02qyVJ0bYY1g1moy1+JkR 8+4wNJq+OpT2pNFMo9eFEYPkT2s00R+zRtNo6rV6KvYcF42mnorFVS/VaJOnMuMYGs1iJGUJzJTF uTIj2hpNztUDNdrECDOryqLRZrU8McIey6rRZKwpz4yYt4eh0Swa0GZG6NO1arSh/2+MeICZJ2bo rBSdXiewWKb6WBeVaF6RvhtFJU6GaRxK1VSivTc7U7MNrS8xLXW2oB9o4k2jt7gOg0zlCTl5Hr0+ mS8QltEDcbzpQwHpluMWfVhndag+YV54MMh9rHk38cBiFwwybcf06GNdVKEOxN6NqgonHsyuwlCF +qrZ8ZMmVH+oLjwY5CoPPlrUFg5FbeFXT+nZx0b/n27PKzln/rfkLx8pc5vxvdizYOSg29rLAuP3 vm54tCTOPP3b56PrswPP8A93+5++8HdF6EDmCsbdj7HcWgsO/UbAjmSHK5YdLmj05x3NDtfnHd5V on4DOFrVp25/lxVYav1lsjpQXgQs6s85ty5C/I8eZoN+kKEPPt8Ag/EyoBtAcX299aSBkuXNlwGQ 8IpwZH16o9/F3dftL0iJbJksAvnzuVytXlQlyxDWgXbJLZP/wlooORzSGPTTBRp5YYyXqzhmUH2G 1E7vHZhzG8h9rDtRysG15cuNayo169NbPc1MNBvCzkYksSHAPJTzAla0CjmxQLI5gdv9W55lC196 KHlhT8LFNbUsINx4lhZROQ3+Tvh9cLaOp/c2upSPq3p5eRMd8xIH813K29M0EEV5AL0msnSMYzB5 KYlXm80W8lwTX/Hdg1gWbh8Gfx/TnaID2UWqp+eRrB2OyOes7a6foUa0/dfl7Z01wcGsJUHUAzly fgDyJ2a9/hv5p1nDyTKcVIyu1Wn90YpObdZXdM+MthJGzjTex3Ab5kGjrkRNxfJ82KDPsRrxdvTn 0rPsOIOAJlFMmMD23KK5dGyzOpgHp9psHp2qs3ksimeBMdELY+7sOzBZXpwGfVCXB6WqxE4v7uMc HMRX0x3EA/8VfbiEV3ZwQx1BOZ3AgX7RTrMAq3paJlj008yBE5NPROq701gOGvCkJ0VrTS/qWp7x K2ymQ1+d6d3HumvByfA5KTYBzW/rmyfY9OpD1rTqHh3RyysjP3FI350YedJur6vueYD65jLojThl LeuF2Yi77Omu+17TK/MbCy/VqwvQF3xOkfdkO7WknMx6w0aIROBsHpMw6jdTxEyFqKRFb6lEzdpt JuxO6n04J2Wq6GWRfL3T9ZCFbpbDNFgzvqfRquKZh6v6aR6citcCY/FaOHXn52F0+uLEg5MWPmlr o3d6dx/rYKCdcDPnYUQP+Ihr554eM0sqXn66b2Xn2csr/Sk9M10nxXpSSsrA+V0zYqY+zEmauGvv TpOgfSzCKbQsMKV5evckI7PSnDeOo4oU2NyPvnuCvWoLfXKtq4bSsb28wr8Tn+3daT6OWvCN7WAe q767jH+jb9WgGhOYVNQcJlAQeC0ghIRCXEE/S1/NeB9kp4uKoyGmRc8qJ76ex3Wn6E71SRdvHSov VZZnbhpsYtSBnQfidmx3hn3UFxd1OPPrpG5PalnV4Tx0JXRm9on41wVrfnMjTnmrRMy8NdjEyBO/ T8Ts+HbufsJJ3/nxMqm+eVgnFXlUpbJk53f195lzpyGdhn6arx8P7Hx5BedbgcRF5ZxUs8Dm6TlN 46KaPx2RU+U3S/xRSb6xcXxPeE4zsvdrhgI5oWKoN0kZ4E/1QwPdxYYBTiaWXsWmXqtXjdlYCAmB sKrE7RQ9X8+W+G6S1Y98+XJynl/3sN8Ou91jc68H8Obu7r4t38RifoxdU6eGlGVfinLLjuU72qqZ a8/BNhSWFhIllaA4khVq7opT9JsvNz9yXsnf8ZwPDvYbbvh3wnKH6N3Bw/0nkSyz09vQWE09PlNr xE3hkDOxYSa7wYaZu3rRAAsgMWjzql8mdTURe4qaHWJdb0TEvuOinzz5u7//T1+WVFYyS2/aOE2f 60qcIkHvX7a/+XL3NF6+HB2Sg9tyct1e9/C+Ezw6hJhOPpAsOl0yttPZ5SHX8Gwkrkbri1Ydv6VC ZQEIVkFuXrJVnMyLfcllsS2xooObc3KHTm7aW+7c9+JMp3jUyb3SNZfU4GoiVE/TfZpJ/1i0+Sgh sA1OhetpyrMWc0zkJo952S2sOoWkDgGcUyzlrZjL97zEozd58Dp19fE1UF08ZIBq2+NP1cFWeDFf AgNpkftXsrJuWoVVNXlUW8CxwlpW4RwrOpiaB4P0YOy/4RN8JzhxCGGcTG/hlWbWow130ui2vPSm l2X1mXB5YjF7AcRiKWLYjYPd2p8TdN9z2E+O/VsBgO95Dycv4+SN6Or7gC31fvW0e/MvX85e9Vve 9/dM+KOp/4ZLsERhDtEGMOijhQv5ULiQf/Xk8HH43iX+xfc78KlOBvAfH7wJecP6MsMEsSy9t6Hy /tcDzt2viBrHDMPoUZM6k9rWMp8GHawnIp9Ta/QdSXcpoQILDtfMcUetv3UG6ZtfD9jMQXjf+qWj Ne5OmMJmKvrvN8oUNpOx4xukfYhviq7dqXP5TskJ1u7EtZW2eJiceJiccJidcJieHd8npicfpicf picdpicdpmfH98npyffpyYfpSYfpSffpyefpKYfpKYfpyYfpyYfp2fF9YnraYXraYXrqYXrqYXp2 fJ+cnnafnnaYnnqYnnqfnnaeHneddNt1Um4n7XZSbztG60rg6aBF811lHkDpoEXT47RoOmjRfNCY J1g6aNE7aZ/SouGgRuNBZZ5g4aBHwyuKNB0UaT4ozRMsHRTpA2YoH2YoH2YoHWYoHWZox/cgRRoO mjQetOYJFg6qdJ+hcpihcpihfJihfJihHd8DdGk66NJ80JsnWDro0gfNUDvMUDvMUD3MUD3M0I7v pk7TSZ3mg+o8wdJJne6cUAVYD+qUyVt05wFUD+q0Pk6d1oM6nakwE+8Aqwd1eiftU+o0H9RpOajO Eywf1Gl+RZ3WgzqdhxwOExQOM7Tje4A6rQd1OpORDjOUDjO043uQOs0HdVoOqvMEywd1us9QOcxQ OcxQPsxQPszQju8B6rQe1OlMRj3MUD3M0I7vQeo0H9RpOajOEywf1Ok+Q6b86kmdLirtpOZOem7H qF2ZhqKXNmeVX9q81RNQ3/56wKg95UNP+dRTOvWUDj3tGLWnduipnXqqp57qoacd45Ajz9I7Sc90 cLDKf47Dvh/5yFSgLKYxn+Xp5cs5jiE/H0AH030C0XeJDlGp//plKhJ470DTneaTc3+KvZgAHrzx ler4aKrrneqTz3sKSeQ71fVMdXk01c7dyTbY93z1dqd7x2dCssceP035HqKbRTvd5fgA+l7Abxbu +GjhDgfp/p5PfIpUnkJhs3w/jPA9qDML+PdcxVMM7xQkmkX8YYSbSIaTjH/PhzrFt24Yb1L+MOL3 EMos5fUu0gfQ9wIys5SXR0t5Pkj591yVUyTpFKeYpfxhhO/u9izl37PgTwGWk/s+S/nDCDeZzCcp /55pe4o83DDepPxhxO+e7SzlQsZqlBxg3/OUF1NF02IPE/SZ8nSi3CyTE/B7PuRisDyM9t0XmmV9 ITOfaD/5vyfvajFbHka7CedM/DA+ZkLbifqTb3jDeTdeXqP/Y7Vh04fQ1EO7h6bmNEW7Zy7UjbtH pl4Jr0xdxEMX4dBHuHcSz52Ueyfl0Ek+dJLvnZRzJ8OfPfi4C29O/Dow7HqlH03qHA== ZiXep+AACodpeS2LEA4TEw+TcIKFw8y8FgsPh7mJh3k4wcJhcl6N6IbT9MTDVJxg4TQ/t640THyY oHKfjQMoHybotbhkPkxQOUzGCZYPE/RadC0fJqgcJuMEy4cJejVGlE8TVA6TcYLl0wTdutKFNcVT TK/NoRNdqAfYHDnZ8d1029RPPPUTTh2FQ087xpuCm3oqp57yqad86GnHeNdyM/OuI/eO7Dvxb8ep nX20/Kkcyp/Kr55c6LsfitkDtrqKDTXEmvnf9rG7W3acLxNM8OrOPve1wPTdrwd8gC0nh6yu0L4j xwHduVKcCnq5Rs6+bodvaJb67FsdF6/0Vloj7K08E3FiDmtXLUbX8v3ArRecOfV32TTWXvwzffbU dXr4E1zUKdRkbOP5hy9kaS5tFAWcgHhle1au/TB1Y21APN/KRjiUg3M/e5uN1HUsP6iob9NoXHua TrHMFbB21oU/LLgU6u9UzXJSE5dWuton04/Rnka/tzEiS59LF4eMX/E5Xlfkl7ZG5dlfY1zX0sH6 243EA3N//LhgJt8Jqv4gmB8/Iac4h2BaLzzbqfYxWJeZjw3OA1ob6Nsqb/o8M21v0/V0SPlt2d/b 7FQuw/gkn7X/myhTibccpmEsz1WSXIROYvlJfQXP52cXpPPkKUzlJcbnrtAHs07M29sYsSKt+ryI 9K1ReA7dS3tz7extdmJPs/QJpiuau3B7Y7pKuemOcURD29ipOMeV0gvuIeTWG4uPSqKCda+Zx7a3 0X+P76p62Nugu+zeWk57k43SdSif5Ll0/1A534b0MkAqOMU9X3XaKY6M29oopSK/8rjI+NYktf5T Dm+upb3NRuhhdj7B7N2m+dQGuQvoywRT8okT11Bj4FZoNS4s2BsZlcJGs7pmVu+NrMc3ZnRvc6P2 sOQ+wW3VaDTtzRu3FQ7tla64mGK0x3RrTu0sfVc1nT7PtpjCrD/shu5gI+0NxMbS99VUmPvY2+x0 7mPZTbGh7j69qnfyZoNMV5EaW9ztnQPr72Yb9ZXe3NkQ3duwtcXvXxPmGX6j6sDYB9hgu1zR7cF6 3rLMh5fs9mBmb+BDvQuyWRgVppPM5pV2JyppHszawOhjMbvbRVsDtavekvW9zY3EbRgPMr9u4mt3 FKuo6gHpp/mQmGpLsYkXlPOsGUwERQ0r7vbOuPV3s35ENI/+2t5GLKrXFsj6+07faWYeYG/dBFkv s7Vdic+LyU0wFge3Y/fsCi84Z3lWmArL4hg0b3p/Htbexmhlmb3bQHsDsaHeWDV7k53MfSiPsbRu Im0nOe3W4Ul16HnYbCdJp2t4tjFNdpYKjNpQ3OmBacvvauyIrB5sn62FdvPaell/32g7zMgDTKsH bni7WM4GlpmNYjvJxqPm1WDB2sAsHGHgyeLZ28ym6GkO199vBB7W1gNsqv4vRSUfIseKdA4JWkdi AKmxpR2rKtTn2SBTmBlHgIezsXRrI/0pDrUd5n72Njut+3g+yXMlYVapD7Pm5om0jmQTUmtNOz7x b2+jOGir9Gejdm/DtptiuBb86283Cg+z8wDL7g3p9sJUseXIApFscFH7I87fRBCUs2xbN2rck/mm nYpenIe0NjBbS0T2ZHvtbdR+e2v57G1uZG5DeZCNdxfrz0d79uHNxp7Kjhpz2v+JjXsbxaGSe3QL 9zbS31uraG+z03qargcYfm9pcb3wRG+nIMxiV5sW95zwWJDOkm4diQhNaQqt0KDdaR7X3sbMMBHl k1l2ayOm3Rtram+yk7oP5zHW30GHKxKL8aiwzxxPdkEjQ2ac8yxqNyI3at9pt0febW2yXbVK4nsw 07YWs3fy2kLa22x0HubnAbbgQzfMXVRna9Di5GLs2Xal9uDMir2RIlF2niy2vc0cgH9tXvc2N2IP a28OHc3r+K+/WEL16RO5vGsxM7C1jxyedncynvY2RuIE382AvQ0bEorhWvCvv230Ge0P2u9mvj4s pXQtWxxTrpuXdnjav/c2RuRk1t3M7L3NZIy9NoN7m5XSMYrHaNmHslhwXrN+ZbJVc2p3py1jb6MU ToHQTfFtLeYg5muzuLdZqDT6H6RVb8z9iEZQZNeiR5lgVZC2HlWLzkPeGxl1c7p/0257mzlH/9r8 7W02Um0YE3Ptq2niB0ephX2aQpTDlGLz6oEVIu+MOM4qf04lvbsC5P2x/R+/vJIT/0CRyydS1Vqq bJ88mz4iYKrB/I043V/+Hr69RfxrNSo/o4jkw8L2+aqPdwYDN4Kdus3qTDxN15hVPZwrw3m1fOLd NSHvD+H/+OWY0f5AzctHU80fnuP3cOwtyl8rOPne4npI0cV746GfXtWHyX53RcZ7A+s/fjkn9D9S cfKJNPuHJe0dPHuzWOZc8/GdJfKwhP4HIjef1mqntPpHsv4fCcTOG/CSF31vZcOH05YfFrj3sO1V ss8my88oG/i4cnlIvv8DAZhHbSUzvz9SFPCRiOq0A8/dv7fq4WPJyI9P9XtY9irVZ3vlT7myHpXB /0jM6tPa9CAmH0nzvz8mOm/gc+/vrmP4cDr3s3v3z+HZ69UXJ3vnO4vrYWnfD8SjHub6zeHgj+SF PxLanLftJcP1gfz3JzJPn967fw7v3qL9NZPne9nhh+RkPxCme5gHPDPuI1nbj0R9p0147v4DqemP poI+bbv8HLa9Rflrtsv31sqjMqMfiV++Mm0fyX6+P5Q9b4pz7x9J8X40nfWOwb+ZYT5bBN+R2lfO YyY8/7e//ref/svvf/vTH37707/++tcMpmOa8w9f/vr/wS+Vf/mL3//xv/9fiscObBIUxzZ/9eV6 +k3/7+///csfvyynMs9nMulE5q+r8+k5Y2OuPoVnxGl+3RdRQqwiKOzrCosOC8wReHr9FbBg+OkL UojjU3fPVcsI7JPEzS7d05/sg4SXLehOSfTPKXZDo3eZ8c3jyETT3RrJC9iV+gRg6MJWmgCvrlQZ GGOTlq4GTBmDfUvatk+ovp+lr5C6muGeWguFgcnnKO97VMfK+7mbl9I2Ny/A6F17Oo7ghy+QmP/w m9//4S9/++0Pv/23n/7x9//j6T920J8hMVVLzr96+g//9Q9dMP716c/+4i9+8+3bH1/+5t/+8I9o +qun/7k3/F/6f0RFfPYVAR8aXHBVuBPxWZUqYF+YDuRWdHTOR4FNzPGXk8FF/hAIg6HoGDjG4Uop CuwbmLK8jvdrqremoc+5AJNTpNsAHsic9Fyzykigb38wdFAcw8W0pefgmhBMGSgGXvkSLtBHOn4Q BINkn1OWtqlzR4FOsa4EPHTi+xpR8XN9qerEl0vnOOZahcclORVr14JOnKxwLKCnb190Nks04GmC /077iV6Hi/XLwNqa0BSuq77FRLS9sjI8ZCU0XoI11qKEbiP9/4KL+Coig0u01ZNVeuuQaBeFsa2r AGViMDZ0DahsjK3IeIsL7U8+tIRMOGl1ZIG9Cb/LwTHUuUvl3HkWGtnyGBjj1RgYurMk8wYdehUG 574NPzEQm4D0lRMjKPgSsAGL6s3S25KIJXxpObCOrsbINrR57eaykhWDV8XdbCJaF/ZI7E2uS2Gp jLWra8KKIUYYTwQMMcv8VKwM4UxpXojt61OoSsF7Xb4lyghCSslEN6dQmYC+BRTdZQREviTr/a7t hYPEdX7dPdNtoAx2mbtypj4an7JjoO8brXClb46GYPTvLtulrsaqpnaidN+pITGouhrHxidYa+80 qCRfPFlgak06/lWEHiedAazV5V/dpaZIN6p8FTXcXKVVgi8kxUAMK32L6CP/B2pbujuSVY/DmGNg qXlbZqGPkz+IC6w1CCM6OLqUBC8EhYHhqo6B4XJVgN0kqQyM+RIdhs4K7/YFX170SoGwF9TWoggu HW43EIoh8KLv8LEkX2S40RcB5qsvK+ZXagrsK1QpSPgqolDgI68FAINqqqaMuTH8oZPpLt41Oh98 qmZX+uKEv5ENpA6LoSisxvj24FKLCpY1Gcbu3YGJJR3Awsq1A2sdCKILCtaufDKamuFUY7cDY/X2 ui6pDg5NJ8JdQRGEkJ+ODHigHodCvAQ3KQFibld45I0wmLf0bnz76r1KA4luSqheUSHvy53H1sEh ZREcMhUZGLM33tYswJxVRmPMA4GofPRVhIDUVY8icCUw1r5juKjL9/KiRVM2a7Qv5MpLvQNzSdK2 L6ggwJaiDPWCwmIEeNDRXoVVVsIgXdPOXBZgd0yULK/iQeA0gxVYqi5fYQyAbdZA3wRBdCrMPgal gD4byZyFiSMIikktRFkpcFk1UA5BO6MtlIBFTCvwQIiqpdsW2v8VdIGUVnQArjRVH3mM6tw/xWd4 bh1bKglznwUB7coMLL7qUPM15qCJnV/Mskx1WmMhCYKug4OuMQ9aGUFv61W6XE3a2ZjwCfgKBcm4 5T3b3TSuVjY5fF0KLpPDVnW+xEya5bBMgtx3V3u/mMDgJi0e1fC0ugphYOuzpW5Du4IupIZP9M5b AwO7vaMqvO8MAiQtNLaxb4KgXU7HBSOyAzM+GpxMFbAnnHGWxck+2K0d2QczzrMoBfRNaAaSoDEQ aoeBrVOjdnF0hqCrbz/hFWBSW16FM188xGEaGwLZ9Ktsudl1S0B9llKupMCkbCFPgV/vxpNxtojb nz0iC2Ie5NQUSNaZGNxFEfjnauw2WkcwoTAqBsaiSsdloyB0v99JZzX6Km07B7Wz3gG7Th3cgtO5 lRhBjvC+VcdVXokdGEKLt866rVYvN21XjLVa2yJOKchyVahtZrdkhD4uMQxj5EgAeGAOGdwXZZcu GRLZb19ea3rE+Wr/B1qPo3qVA8rZgvuNqGnf0VpMU1MGDqsnN3ViEMIrVX3fWpXb3YZQZ6xyXOB1 Ag7TdZzYmxC8KTCbcP3Dl1cF8Siyr4h3x5uqrCU1pPoQomtqPouKISYWjRR0cnnCi+vLive0xNoO QJisWYA1sx+D62RTFWC3rvn9CkP2EqgL7Dy3vpgv1tyd857VTkPgiocV8Sldjkv0jdzcEyR6yCPv FldXzdo2sJ/d1d8zPB8AXRdZGUF3s55DZZ/JMYUIWzr+oigBkxNgnxnZkyXE+QOFOAt37h1tyAh5 erP9WQQBGxsE7Ur8aic5k8nYjTaimPsmR6KSE0eWv3NdVVeivTekkmd+/+Ltit0wIdMl2za6v8dR LOc8KrClJ/owMnOvIrhAznGSLarbsPDJCWlXlJl37lbVYu+m5HXJ+30n7WTz+8HsnJZUsNGWR0XT x9tOChw3JAGsfT0EdsQjr1IAL/X1EmK5kYSidJ/ZJcFKgUtCUC4NzAIsPnOuukl2BF4EKGd1ejsL pi0C8b1LwEmMRSzYyP6tV6nCGmrsNCjwm+wxnh1LgEPWLb2yVKEz2Xhg6UQnXZGa0T3u4uhpB0ex CTpWx64aEDinFFR2QTuwIuzwTfcNT25wBzeXdJMLwbNoZK+bpG9RQhlkfo1NukowQw== /dKMcwGkhkBrdyoE6HKRlg1RODVUoiFoEpzrg62xCAEplSxAd6nAkkSbpWSEdYFSo4rsAF4cops6 MJeg0Rz2p8Q7MMLKpT5L7bqW11EsUX2W/qjRjNB0BIiDNom8dK3PCKJGfkFVuNSTkh0OzCpFjU3b zzCwwEZJB3LNJQHF+sGayBo68kFUwQVJ5xA48MIbY6BoV+KLODLetGtjo0sR5OwEbBLXEThiLGJj 6sx5s+oqz7wiiE1ZY/z2OLCh4bdoIbUqLmJji/3bl1fbvoL1FQqO1B7HdeQBlKMXwiyA3zoCjWo1 cX77n0QhAWln/EECgOqgdFul8oZKQLbjq61PAG0IEVg1BHlJZAKhJV53oFGcqd42iCQO27rg5n3Z /hPfF8ptL1m46TL7HpqNrZIO1BRCB9ZUDIGa3NV0H1aQBfw0DEvccmbDqU2Q6E4XdRM1fdVYCfGm hpivDNY56erCElcmkkHFI5NpBDuCRiVK6Jz9O2kbLjVs1FSYYr74nnx9i98jfFYt0IbhDHYVNkPj CMlVXpaGwOy1WmRyb5GVf3hY1Aa6LhaxZkfWEootODFc/eVU20VJMBZLliGMENULn+I2RXecydlL 4JVOsSnWvgyS+stkNarDPSIssTndssiukXk3d3cbwrfHsOdvOc39Vz/985Lk/tm57yf34ex3YROk NEmH+Mq2j0G/rlCEiH0tkuUuR4i9aUnv733ti/LaofPs4phy5EzMi4ApKULgS6LzAWfH2QOIti4D diYnwBE19VjDSfFKVAvAi/O5EdGdLMAcixjVtRt+hoCsBgJrCrEDxXrpwJajAkPhrSBOIRk/Qj0d L5b4V8FLdhOBScUrsyvyrWzaN47VeCi1pqTJTj2mBXl62AfaHQVD2DwPfWdRvC3o6GhLUio6RQKW tH+HpchuU0csoQJwp11KV1EjBuDMy6obimJvAFjZP/IcXBesEsFAqYAs4AA7LSrU+EjpGR5t4nhX uFiBiiDkPN4vvMtECkIJ7NJ5oDK4o3whJo0fuvkZWXF7JNhE7vpu75vMDu0zXAfi2ahi1oAfBma7 ETIim2UHUqyLgN2HEhjFNXloTY3RDk7FRERH7NnvZwEpErD3al2h5aUFBmjrL1sRHC0IAfeJKB84 L9Zhl+PUQOQwkBFg3EkXe7SEtMnay8ErUJ26yAvuB+FXllKRLvueYxgBQflUhCodFnblrOs0a/w7 oOy0SmdquAaKj6n7K3UbkITkTRLqkITSnI4W+VUG0kpmoHhlABavwKpRN4Cbk/kiG+KrjOwKVcCW 1YKrrHPTF1PQ4cZLJjcENa8geZKi8WzgfdXuRMK6CybeFj6nI4LQXRkn6q7LYq5aZVRdNpbLugmt qXC4zCOAI9Tc00m+Ve5vbFSFq9tc1MgAL76mq0zcmtdX5LnthHUA94n8UeIjKriN9+oXAQfhQ7Ph 1WJZy2aRXQBDTZNNzX536gxomsPv/OCZALhavl+SJDUbDV0je9YsvWVNHCSqrA7Vn7+cmWkS7KtS ssFtE29SHdiXQRGzXK1XNPVRbO3sktKV2ZDk8SZOh9ZixQnVMuNomTTYR5l9xVtrywpusvNUFK4G YQPyU181KOUv8Ry7La29FVfFRaSXjtPD8+Z85MpSMWE5iQ2o82bc18Lxoji5DBRa0ZYa8+zOfZWA T9col6aQG8rlBFgNgUawdgJUoGBbB629cCrr1Yw/eOtYgsqfBMeXwPHieGqt/Cd7sJJJv+PVDhNi FrwDSl9JoxgIxBVhb5qjc5FjCAAyUg3ZqfC2kmVxk1n81cAhT2AFcohuB/oJaHidV7yeMzYk6FV0 lmqBZVAy0JZ1V08yUEC4wCkNFQYgTzcBGV9DoWCbY0g/KAJOfxOYnWcAU8k3BKNz5Tx9bdmzaUph GWY/4klk0ofGie6vAhZTITSr2+pAqXAMoiYYSOMmIMXBfhAEEsEAmPfYCvZqX8Z9K0gB0stUkuNo JRNQTSV5NTo7WESeURSaValVZiCZAQQsiN3/oAhylIJVL1VBg7BIJag6sBbZdrkmuxkDy1xlcnHN sHCxFUGgPj2AQRHEIa+OPXnmOMb49Tw/X1l5uMC1VrzXt8QTR+DoxGChON1XAzdtzTYqo3AKLORD H/D+MDq8shhtzeXv9UfJUN6rPK1UxJcljgsMsL9OaIcOGpVifbeMpoO6Fldl3JIqm84ejcyJ4XRS Nq9rc6haLzo6S4QYfcGMYxKkxuBO19iFUy6iTGm7fXlrU7HFjGA/LC3bw5rltty0gXhR6IhRPx27 UxWTOB9DS5+y8qpnZM+juJhohKTMR1yb9xoKzSeNQIfasukZKsXnCLSssQ6UVBjifaUc1IyQdFWJ U4tpD23G/ifVnUTNCogrhQho1XpiUMRVKB1cKi+uhhprYhXCrelSFScloAi2mr2OO2DKJekKiiUK Al6yyApIyq9JTS5zr2mpA/BKYsFbVRUpZNW8loLqfPYcfg9c1qMUpJCkbZP8JBImTRMmWmrVgTTx AMq7jV0ERikFlq3pQkjBHIAOpJlhnmjQpjXerSnYkJBLkm58lKSK1ky2alRyWILf79ASFSpx6wYr jWP/KEMtSnuWXNMcVGhYM5x/ES/qq4CzSF80wwFtfZFxaUFDk/wxj0tTCq1Mk63LvpmBC6DsRgDK UC8rwcfrbJfh879wwL8KONQqoZno2DlFDuuKTeWKzUjMf9bRjj0OYOOMV1ktskziEPasuwOSCOhS XxffVNMIDLxkPw9W2YjVwpBk9bEdRjsV9yQnLADV+tTwTMfFfi3ZtiLsKyoBwZIkos8ZbW8RqXQD Q3XskDQEV5LMiiQRCcgbLLCaCAXWJMw/x75IQ2SkCVLnOHPRgT43IYBOETACr05dkkjArykHLL6T ZSYB03URuaJH1f4rtmuR3q6+mDmt1YG1XFLlXIbt2jiUAaAVr9S+Nq+9Irpa/Q2ANet+RLmosZso Aqp8IrBmHioqfjUFZoZDQ/5JUk2jjLQiUKT1yLQXMzDmJruUCfFlIbQ21dI3SSgyBWJqN8/VZ5xa lGgKpICtQmjBNk1u38A0k+pEtjS9Cyc+F5HXrjy0HZ9kkU3IedlDikgRFE0RmCYGKbtfdQfCHsfv 4yiCZjYlk9BxdltadhxTLYnNU9nYlIH3DfOr7KR+qnanyqYXBTdN46nn1zzn6ViQGgcBASxa2J6L VmADnHxT+eLcBYCOZozkS2EbAbrHR84f8vCylsy2aBuFsyIYAhZtKyWna0vIh7LS56xgEUaw/SpO EXAh6+tzMbVNSYXBi+BK2cJxCMPwSzx1VGnfW6vhp9G1aiEk2HhSzF/tNACswarJLRfDMPxCsIRR k5VaORpU50QYuspOskC+XMkQaES28vIRoAR/4fEaWdsQxtg0MN14EDo2yvyyakCEQJXTMGs15FVH skXizq8YpQIuWiUiJdTUVFOlpP+PdInRf13mXJfhHgKs0cfKUfev2pp3FApdQFAIFrxmFWnnO2BV uS4aGSJ7dLJd6eQcg4eL21KWxTHZf2q+4SOLedpT7cwG1Qjqtih+f7rGtpi4zFi2hKBrQI70pIut HVM9VXeKKmHFBg9LixraJO6nBRdsu5aKbAZKfIvKKnRb9c5OnVhhStcQbQxMzkE1nNywjUIS1K/r IqnhnYI3Dc67E8HTGmJgbRrRuTQdD6gFf65YVW+lbHuaugqeI+UMtDJ5GAFsWZHoFt1oJIQ1RY9g mnD2E0DoXWNh1TCnVssSu9TLM48hsEpiJ88iOh3cqlGrZkzi8m1eEVKFjF2l6cxSbNU2kKq63xRk N85CsyFk3ZZyUivkCi6YeJKaoQnXtCxsXgvKGmOKlUJdMxNhympxjVlHyAF76YzCg7rCRsmPVkjd F57sgTBPbPnS0ntRcPYSraW1KUbHZcDAwwDQq05Iww1vk+KdEGgUZkGwUQBl8ed/JCxiTLJBEjUb 1cGpXFKZpWd7AHRVPDstVqqwUVPbTZIaNZ4Et1aWVQdmThfA3auXRh+l3J5MomsgaFEdTjqap9HH wAuLTI0qGCABAsNG+GuKA6gS8lNyFZFvrkynsjvhGmxfrySIe4hD8Bw/Q7lX1XMXHexKDDreGmRg qagSylIw34E+6k5O8XgdmKSNoMe6YSidebNMS4hKgcYW+gJQWxF5gqJrRQuz6xyGIKEXFogv6aca KERIgjL8GoGTovW/8K+97EgUJRG/DcGnoLmKyiY3ME85kKysDVdUv6Fook5NXt4uL469oO2wBChc RsDUSpn24KrW5ZXVQFD73vNbYjVcal0709BkduiA9agMTBQupZ/iEXBm5BTjRoEoEtjX+VIzQIp9 QFYwoHppfc4R+tS1KtYFiYJTy2nMg8YfesvL2E0bh1EgdYJ+RkB30HDb4WVJDgfAMekAV3EfpbyL fKQiIzBJanzAhhs2TfITXRoXkbPr5OU18bOvYV2pP4idNY05kJMLCFYFN2zHKk61RtSGyQWgxRog RhITCKbhkd2qXlx4PfAMdWCOrsRfGSyBb6IgaR7r4mOfQCBnbUbiA75+0I0aGkkYaGYqTuQzqNtM QfRhKBp9oa3sB1GoTioqsd9nCSsQWLUJXcMoKKoCk4sK3BQ1lLh7+kshTYLT+BFrXrW4Bk1EQLTT 5nWZaPk/Csez24Xhhpd2jr/9cnG/AfG7KhkeEjY9Rarl5t7K1UPmI20MFOUPoJwMRVpBdQbA4hMM CgFsXvLK4t/dCRA7ODc70jjHcDs4VCeIo8WSc+N9Y7QWFHK6a+idO17tMKrchzadZEeVP1tMQcII XwWcOHADsJfTPVFLS0JjpXvEq+n0ZjFtz7bYi4LFu/EcH/6qYHYWAZYdKjQrz0QJLG/oAOagLHWq RO/diX2DwJGUVzjYt3o+MnFMncASsU4Rp9Uiw4ooAQAlHehYLrRWuEmBibM0BSHIeiuKFE3eCRhT IrUYQSqtdEpk8wJYli0BNf9lp5WiplCDVLf+oFPNJg/h5bEByD4zgFI5cpq8I2HCS5zz8EF+oFTH i4INTRMDpwNxCuFpydgBmDU5N4oOgUDuWrk0+U3ApMNohRfZnYIfjLTomsgVVTgoaRom85wMYKDW DXveDwWYbDl5las7XuVF311SkSxf1vTcVVA/xrUA8IGTePrF9s142Rm2jqIJ7ovHesSrI/QaYydB zKIycCKC45O4OADTJkCONQEoBYFFDGDJo3uZbeBtCq4ciANMagcXpBsButSjZUET323yImBN5ie7 8gRAFgsCiuqMzKoB/EEReNaoif2Gr+fuvhodWkMhOUmlQwuUo9oWIbANyUlJyRcFpFT4uo0wilHQ NARNamotGzpIcXv/1r8wCD5bvUSIgPhFocKfYIfE0qj/C6Nw+1LvD4VUearRTllPPWnAC0CrmCrC 9RsBOnNZT38TrjI2yBGWtPI9eCxJ2lqRaTdQ+OwZHW6wKsbMNclL0CFkPXWRLts/7g== FAzSNsx6aYAaapdltQAMdnZFSotwowGXryUpj/1BEUSNh1DwULEqFRKQOQ2NZ9PrkRQ6dhDEYwY4 XXoaQev7vR2TxZES2RG8rfsOLG6c3WiXxTlEYxKCrEluuTnkToEyLVg5ZWTr+EXASeqDR8bpXKMZ 2ApgSYuaGsbdZkwFbbpWDqmrNozKOG9Zaz+dYg7e6t28qToqHi2CNTaFUQiAYN7OIKNOlAUKajjZ COqlbTWaEEa4yXOuVEeg9Qpy96hQJS1VL+AuriqWlrMdET1JtT2SJeyihVlJZjH5gUCsQMdXhGn3 FH5kI6BeqkT0qIzjEIFot5TVtvR56ELP+TmMVQs3g6bYaSOTu0QCkg8yAzm6MYUaXg98aP6rajdO vJKNpTratSzVt5ekkwOCI0Ekg8qYFG2W8tfAZTyK1vkgqsnmO1geKsAO0ALcs9ItYvqNenL0lbTI tLWiEruJ/NiVqOaUwkoUtdbdIHiNYVHpuG4qkteg1qKxIp/+ZaBKXbTDwZUrAX44dzcZCpcmpeg+ ohcFN41A0br/qmAJXTheXgzUIJazcO0d7xh4y3q52jhbQuA4g3Xg43C+BowIGPIduOJVyyRz0QFT Em2EmTMVQrWcCs4aOZ7SjgAWjWVZSpmalnhvOoAz0oUApQwXjgQ1LOGqvhi4iondJC1AwFY2Kxa+ tpm2iGYoabS/i23KGUIAr6AGq4jnnYKZaRpnm+zHGVwc5xbKKCF0VodyGvQNwdRWqguA9enYv7ol yU7KtYkwgJvuThqQyonFkYCUP/k7aVtK0HSXKJClrZwhuvelRBTbWyrvWC9n8FcFS+l4teNbAIbc dPFy7ATApDnCGvT07wEtb/VO42VUC1jG5Tp6/WEHPzEkyVnzixnBwByDvm31nGgrV5JcluCjkiur OpQ0y737SXiWBWOyw/WQ0B0SrelAqfFWPSNAPpBCwWMvV4VQ26GTxFsapapunMO+r1ieN6+xIbpb qgpl2fNJAQbLlWh5HKfItgoBtHOH11XFDQPY7oXScldCoIfdposPKO7BQGP6nTCZYhyHznr2kCye FwXbFRIWcunz4eweJwmJAigbWGErhDu8LLtTONzMwFHop1OP89ROb4EkZaIIvN3KqOYg3ZqiF2+a b48MrF5VSjnGH2QIA+90olyKSWIeZ9oRDLZbPs1kAA+c3sYi2WU09XYloRwfy87GmrkkS3k+3rdI hhUIR6nv45ZSE6bXRSoCMra4rTnThFfvqaG7Ib++NsUClsLdbNm/PI4N0UVyCrMrM8ZZJMyvXeyo QR2QIOZYMTV9F6UfTMY2EVEZC1YLmiTZk0exTrGyOwBb0NO4GpsAVNJxZQSFnBZ9xXE93ElGWcGN K6oqF5ToOVQ9WVIteZDKdCBXnTpcjxTVbqLp/CYIvMxc5ZCmIEjBEDQ73bpSoKUU8CHrNGatttVy 5PKs9SBJw+xR0i4CbMqckU+/gzVvV1JVVmoWKFlBV5lPrFx269woFLhRK+oFt6/IoaDEtQIvCpaI V7JqUYidHDJIVi1Kd8Vc2tLqcEiWo1yZohYIyX2RgElrnBTnq0dlcVJlnyFwupA1+jCRldUluo9A pfoyjyBzeu9FwIUrNOhuX6cXO2nYB7ZjC2/prUvDiWhbgl4XpSGQcZ/znYIfjOtqrGQOzyjXJUkx 3f6GO28uvZROL/uh+2X12rA4cz14XYda/RTzdIWe3vpA2jXoRXNJ08Y0+kvbOrkXN/PFedxW5Pc+ hDG2iwsy0Br2xYuB9UYvJzsDUaGg8h3CNB5exh2vK85kCNb+p3T9bXHYWR+uuNXN1I7qVL02j9xX A4sGzGbid6AeNM2jECxaxCRPzjbl5rNuGxK9RAr7diMxTrplXQQuTUl0KUfS1flV8PJl+/OSQRrd 7vnWO8WR2bKLioO7RpatRd2htFLv/2Xt3VZtW5IksS/If8gXgdSwkxhxj8fuLT1ILCEhqKaLRoji VJUusPOh1U2jv9d0dzPzWGuunSUJUSR1jp+xYsYYI0aEX8zNrIg1aBx1sXKH7iq7Uj7BbtE+vEU0 aMZ6TYu1Tysak70pKU0NIlFJvac6ftMGseKUxTN86L64a8snQ+a8qSSXPwL6SkLDdsJ83SeoCS8g MgwODB/t6g/dPgDAbNksXssu79/t6/2Cm/iijTujo7Dj9cajIT5ux4fyL1ZA211yhxEQZGBC8GOd INkt8O027qEO9MdmDbiy09PwQKCW3VVQhnK/s9cAmwAs+i/W+rSZnGS4sAFl2QGYE7sS3HTPf7HL CzAcuxAr7mEyzXO+g/1NCXpN33YXFW5LPteHtc4LJGW/1AmUztbiXQTszyzuvjlLmKXcRbvNCW+f A5DbK5p8fniNBce1Mxg1DtrXJPuOMGV2rTLGHoKyGYuNEOWeApsbSiRnwojo0nPrPdvXHnSMPCFS EUZCiC6w0SPwlkUsU39f1OtXCeV4yEngiZBCeiz4xgNNaHwwDfN6VK2wyXYiox6CSQq3jc94mELi 2KtjaJc4tIGyiWmtc7XMpNO+xFbgWM7oBPBrJxCPY2oGRbju7KSxa+tTP63OdS6wEvO/Zoyapt2r CITMHGQWRGKyBPcAofAo9rIkmuCZpAv+LrMWZkRJxE4zY4fjyqnFY+uyHwNKxLoQG40z+cbV+bCO 4Oklup2xQNVey/3M7uyQhTs7Ya24GNkoM6MXwK4NMitnmHq6HiM/8qYQZ60oQ8QAALSaEZvEIx6m V9y/9Mi9UssBwLVrgFYUndYiW5DdLiApS0BkG/Uh/ud17XmIYWcq3BgEoznc1gd8krWErX8CdskB nGgpXg5C87WuZOGM/scY4M+ZDuGfX4vDQrEPJETAtzBARBDGsfmJ8cD+Lp0G89D6Qoi3sq3smusU SvC5oKdrBnXhvoGfawTffawY8NcuCTHY42Y/7cs6tXcwYbCMm6/hDghvW4PEwL5LaW30i4CNWBf7 LdXGWP5cSZd3d1+szpwHN6q4lgxuTyAbYAQMDcg/FqjJIQcSug+YHfkZ5sPK/llcRuxKWY+60AC+ jWTXE61uYQZxwMoj9HE1i/ihIqRlcnwaYKDyedMjNW0gPJhHrJmrhBcaHw291FUiZs/H9QEzsja+ I0UmcZ4rX8ffmkf11OdOlR1mIXz/pSNjZiGu+YXNrXaQEkiPMLIVrViGbmlcYgcTbTwTdnOUZF2F 2Qqv/iqfbwVM4sPJPD0Pn4KlisGbOAXy81oKY5S5VYnfwaUWRmZ0DxuR3Yh8B+QSOADd/a2N0oyP ch1dA2Q56EpIZW/GjrON+edWVSdCinRaqEOOaC8N/Qj6yaiJmFvNpTDn3aRCMuWlwGIHs+KP7zLV TGAn6Qf1JfxuCx4tW97nJtrjk0M2l9iQTvwVb2wu5ew1r1V43hVUXSd427a6BDjsALtOnkw2aHnI Z8gVvsRte6IHjU/mEUPJhKNsAzx0XwfZdSc55NxrWPp7pJPtG0Gb2ZyMQczIJTOpWONew8oH2+lA +5vhc0EDke1pYimYd3GLsJmJPOunU8wKH3KWkwLTpgvIbPkLysxWN4nGEierjPDMnkuX9slmXWqO q9OBbOdGcizaFAI33is3HOB1AyRfZHZ2qAx6dLobYypGRePkHxiAkMyiyqERDCdXCLxaY3ku2qc6 2YGmlZHpfLk//8Pzl6BJ9EO/MafkSMF4sOpkvYhMLWu68I0aF2snCn+S+f9E9WOr6+cHyNW73k1J ftP0yIQO3AzIr9jAGF4XWVtz9xn3vsp6pjP+6cNBXd/Y/NWz8zTRi1o6hAEid2szNgYXA/zyUy22 doYw6DH5hdF5DrGpy2UdNlctM0ej3y2yKOCPu48gITXW8y2WWs/jf8AMZqyRLZrWXYzDtAg04Y3A AgGphcSujYIqUDkxbIuOsvBhF917A0jLUQLxmXftc1MhCZe3QFR8T0Vtuh4usUNOS6GoSF+Sh/Nh w5uHlNwqGNjAie6s4AEY79taeNZkd8HHK8mMKrq8I84yW6zq5mN/w3f4H9yuOkzpJdi1CMeKqmwW xSURtI4RmwEclVQ58mg+SaNpYwfmufiVvAlRRwOQ4VYAEEvVpNbbEqzyRKo7BrCsKl8CMz5esuDj Yj7QjJDgOhcPhGdNp3aagYSH5494YrTN0M2Sc8pOeBxIMwMMNrxZFu7wi6rQQLD0ZOUO1pTicsZ2 ds6Siszrnk1hS2OOdzf2zbrHo6fwsGTrjX6Y62BYzX61fn/8W3Ct7gpkBElQgW4JQf/cz5ZIv+fy tDInPlDDCyP7XzJqMML3OBsstfDQZzd2dzRePipN9TuUeJCh7gSlMkCKv3/tCHpcxM31Fqf9vdU5 /yP7sB69glckgVPoCdx+GNmGXsVMbGCmqqfSJVDYBHZ8FOA4+JLOgONjMKlAjPHM5wANLAlPgLTC mG2ArAkbTm4qDlgUEatUwrDNEx1TXQyKdO3/HteidcGDFrDX3t89e6Cc0UrM243c471EKB5fo6Qq ocY4Et12/T3WECebS4voNuNZmup85XIpOkQfdmzAvBMVVJAV7uVKxLCtqBciBP3zwlu4016ZsjFe qMoTj6g/x5hvNrOhcbMdNQuVfAvGYTUV4x0CkE/wiMY2aeovNJfOcalntS9Cb2lEbe0b5cpptiRc KWIJtQGEYiXxtdFotcN9S4nelk1QCl7t77tybIhy33+JE1hJW7AZ3Zg8WucxzD5V1zZDChhDsvh+ Aj8XQy4RVh4pNoYIGzG8xIBbAEBgr/O4cgBG+UXSAK6hRn/hGpXOSbk6y0xDbclDwzdn2nCTyTEB +yaboke5Ujh+LY/7AaT3vJ4URZzaUmtaobx9XJv+CqErVwvSUf3XjI+UCzfzg02UR3y0nKz8xkJp OZLwnhCf5d9PsVwBeOWwa56pwq4Ovhf/IcLMDUhddNhfenFd+Unwxfweck2uarAf/HA0IWtsmQ0w 5OmkY3OBTH+L2eyD6LELp5o+H0leOymbPO5PSG1Hieu18CFbYVJtygZQscqwrxFpOMWBBOh6CEFH KQphu2GtoWdq1BAwoYriVbedkOQt1nOvQeCxpF7VEvKSZfl19X3aDUTLoA0gv9s07ESSnnrNmUyg 4pUh3Av5LtRfNbhc/Ur91ojdJx7B5hogKGvHk8AvKUXiieufmhSZ34V1HvKOl9IDtjQ3a8i7j5wA gco73OcPLO4UsWRztW0agwybJCw0jcXnEf/ok/sDWA/6TqjrjlMojOCN3eK9XkFGxU3z2dRoo3JI W2oaE5unGw+hbVkyausCinUJSrZDZUJIkLpK5ULhs8tlNrPEEdl2eLjn3c91q5qKrJ8OjcPHIhT/ Eb8DCMNwRCYXSyHDxcu8hIcmONmYD4FauUREC6kk7ErtT9bnNLm0qC9mHVGLmJ4J7jbzB9A+JqYA jLuZFGPSwo7+zq9bVMmvWzgsde/rlCfF+PLUEY/zFG5jUcTJMon7OiA/t6e12vuKPQ== aoVYQT3F45TsxVnDbw5cYlmc+/FStX9e2g62YDa1oSYr6L7mY/Mekl+xs6cSsv1yMjuMLVi9+ry/ 8HlhNNmGbsZJZGB7tgaYgl0kr3NuEVMuq+8RxClRT8D2Y7wGdD1zP/sdQl1IJfbS25Yc/AkO0Vgy QptpXP2MvqcHjGWIz8k2JMzWGrIrT8AcdYkY6NroRqSUwghysz4UEv6+k40naw/fRAcY8Fo9d+VO ZoiXkSAu64fAnt6vnu/rvARzN8dNMlB9010nWxfy87uWtTCDS4bjYrYg+ujSZzcjGiz7pWbUxJrh pOaT50Vb6v8AF44928DiWyRVaz5yNgy1bPgZWnhV1QYbAPqGNXZIeS2DTd4kfjNjZcsdu+saUGbx U+1ym5hTbwIM2dIXDT4Z7WwAnG23FIA3hJOavq0nT6yJ1djkpS95z42U0PHxHtxtpsTN88MmmKSU TYkAXkvH70v3efwY/YOqTIKdOJEeteZQ6tZuxYXP/aFv9eHccQazXwDHxw5I3dsnnClujG0W9ll3 xTRskwYrbxhTOOESVv5tE/kD/7kqb9JSVqKK1bRtki30oGnhsB0bTQ1lixy24NkSj2hGbDVVWSL7 rUX6apAg4DFW9oRJsXlfk2V4bIGNXmPibdpiv0qvGa7sWFT7E4uBldcfLq51RXZJC8Byq73GJj0F tH7lHRhp63n093RdQFDKJ9M6l7Io+498l3Y7FKSUb1ldYdt6fCFAntm5W9hopu/uCB/WrpS6hf2R 6PJhdRp3Njs630pc+Oj3UyrK+64rm8+QErMxCz9xgJvMxUC0Ui/YgJ/8fImst3gDx2BfISVajiph z0U721IEJPvCG3gi3ciksXlUAECWC+9jN/awM7GcyltAie5qLPRcCLves+TUVbH2fVIDoO3J25uR Y3l0ardLRMC7xlMxhaXDLg5EW12NuRNbq4tCMf5F08y2jxohUhjBfuLSL5jaI8HMGhgCpqAAiXDm +M10F9KALloC0a8WalBhVLNCV1khm1H9ieizAf+sGw87SWfm63jCJx+md1p2Tgq5dzM27p5JUO5P gGQXSjtnAeNK+j5/4Uadm7pvIg9eOTts+qOY6ZELS7r9WAdyUUgUEL+PIL0/IhB/ru+DskCgo5cT 3jhVomK64x1wKhDa1LNt4Ym3oiQiGneTI8olOkiRoNfaiBvzZtqhF+hBfPwWk4XJXv5IvdlfSwE7 QrYI9fSxioAqtkobX2FXHprKEE/k/5izJpD8URa1K8+TQBlzDUHGWO7iR5ZkH+ZpvLFp8gRFh68H dRtPtSne6BkuPIGGx7VwIop4hZ2UsYpjgtRfzt/W8Fyk+XYfXtyOLY0iopNkYaQoW3wa6jH2pjye lZ6GMKMlUfm9HenLzcGTNsmJXIWEewY5FD1Nyx1doma/IUp4FF01CYd4Apr7AEG8ntYu59r8OUAq MPl++4F6Gdi4vSea8FrnAWOzeooiWSVOEgTUx8yu7KpM5lCZ4JPfZnTLg14PVQVHk/tcxdRjzFSQ 6Kmkjse48FMfURxdBcZHjHMkdsImc7JCSY6UxNONbM1/1CVjRnSUgcaFz5Ede1WxryNd+Tks1U1/ 0zqJHl0/DlEBr/IGrxJ6FTdGiTWnEmnwx3jNo0uhE6xLRSATp8xm4+5RxGXPEFmBotZW4xeDlni5 qR9SKLiqkX+o3OObK5qgsHzw6U+tgi0mgZETeIDQQCGR5W8yVT2BAJJZHmnhmunRfBAj83tqcolL AONYg2/4IErUx8JYRJREX92L+OP5uisZ95hYY/xc4MSYLICTpOL+Ic0Baa3t5yadLx5NrhRMwqdU vRpdDJOV3EVhpqhHDYwDzUA59JoF70FdCa+BoWafKQA7qLmcBjmKekoMD2kcMOr54ZAMptmeJO43 6+Ch6UiDD5hJvlnl+Ix5uZUVs5rC++Apclh26ttJNAgKQcY+eX6G4Lw+K30lS90nj0B5I5mUr51m K0C7y7dmBrnqo0YrG2BRx8dDFxgRC5aAzv2NGazXj6kZn5vlVOBZYoJ8BAOkP1mSHJYVqmjbZ5Q8 UtP8Ao6ZbjDoHJIDfExlQJIo215W33oEbWgArrhHOSP7rUUvraNr7zuCMFzbaK5ahRXkIEVwdfv7 6MXuYL/R2mzclBwihpUheR1/c/Fc9+RjyV4fE/jUVldVDhz7euB0k+zVRA63qcZkqqGb9GRy0/zP 2f3u2QGOSo3CEtkporb46ZeYL69mOFjk641NUeaeCtZjyy0tsetxFlW7O+nftj6wpHX2lcxX7jsL /56o0yeFmo88ikd0jy8jXehy90YX1V7AeM37PdpEK1o9DLpW6PIz8TaOTrLnKpXNcq0ayfW4+eF8 SwJXixSssq3Cm40Pv1MSJzyElNhOMa7m6MyuXN3cPLmqQNBmLLxyK5c0remJhDvsbZlVXvMjYp+Z AK3ncmrmo8ArKfGn2o7c61Xre8lYW/j06Z8yl0LlIwC/sC8FgRAZ/+ZvzzkHV+dDVoLWGoxj84mw tbxciTB7JpuLU7L1ld0+7cLyPhRzsZ1LQdtUu5DVMLDi5iNIdfkL5CLsJhf9qarsgT0nwJyL4vxZ SCPRi+S6Jjiu4w7EWTX9ivvzwmIrvC3dQVEbfrnhnilZUSJDEmu7dY5KhtFhzS8iCUyIcbInACDA lV0PP3DoHNh3pH3uulukxRuUxfUdFcqTEdhpT6aSNwZH6CwsFXohjH6TmfXCvAz0gQdeK2kYSdlm KzvQeO0QYWffRaxATxExLW5fBrqCS3YH1KCbgTsGZH5T/etO98wuqewq3292Crx5SkAA36O8ejpY c9z+HLxtQ/0+XSE9OBK6eqjN7acyqpFODnqq/tGQcpTpYwKfUbuIv+dH3AjjtXsVSGM2FTcfhZjT JZK0keFTbHLZnhs53dj2djkns0lRGFpyvLJenxf/ngmsEof4B8xQTrFFqwZMny5PCuZIZ7/E5Mgh YzBrydllGGJvDEz3+YUYQevYOoQ3OT7ZA1siTvqpx+3+TYO65cfn5+g8ow8fGSENRQBhewydQn+T abDZLu5RxzjrMaQroOjEF6MfKp60bZwwshBNYLTfMZ0O0nRfPE72xJAGKXG2/AgQfmHGIwGvU/RO n1wch+EzRUfQlPVjxEFjt4Y2f2tF6PI5xLZv7RDii2P3nrUdLB402hYn+7P8UGJSdU71YzxC7010 rnXoE+E6ndXJv2jTUoZrsesCOhC2bI+MjKdBFqM/HyzQeCjHrodMJxJWOjfR8gw8wwj+4P5cBV5v tWFwRvfVOlIyxwhHdy516tQLGWvPdTOzMpWHmVMJMcRLNJMaLuNcewso9j9BWBfGPFsW8T3eTaFQ m098SF+yBiM9rlR06FAhvsXn8H55Ek/qb3luE0S8xo/TFPBpr50Egfq1he8MbZWOXV3sv6FT3qIx ic8L3E1eoDls4GFw1tSL6w+c6bTMadorhz8KXsV4YyQzrNJueqeujgGOBH5rNJPBuFW6QiLKjJ1s ptdSPsT6WeqNz+uwQcKShyRwK8pK1FjWHIBSNlXVxnkkXFwVyX1Hnh3jEm8BnQI26u3F08Xr9GH+ hjA4zAAfe/S+MGH0TVyklqtcWT4p4a3nKp2rwVZkyD35sY3ltysFqg1l1Ys/ku9h1SsdpxbGHOC5 0Gors2wPs3ROHTy/bAjf0QTHZJmqyMjGeijzgCXb3SPa75Jx46rh3cVWjSrsuhVgJ1Leq6nq7OVB /H0jet18t4vSONKUtqcf2tC3F/VgTR8U7Cxl8rXOUJ/2Y3SSShqSEvZTfK/fMFeHuaSf17mQtyII ikxbE2mn8/ppcXoPno5h/H3l0cy3WuiMsbrIP18QpiraTNbDRiXPh06+qnzXCXKwcQeJTdmFm9it wFKHjVWvcrFuWPvnZD52Mry3vWQxrlL8d0SMWlQwN+NikiMlNYwwXxVUNANZq+rJRFHhrlVAh1ZC 7IF//ygbIQqiI2BiuXciMCN8eq7WgConkc3zdlQu+lHuWPIIbkqwsoXD+zT5vK7uT3S32I+ho972 +CJPLh39zdp8A5RWUgKFnwHLObaIIsvSknnDPsM4Z5xyn/lrWwc9mOh3wLXYjY1d9mUukPtZIKCN m+Cm01UUBbl0jCsVO8ZhYeRhbeHOZPM5UnP8kjlAW6TIh1Lt6oSv2deFRKq1xEf/KQUG+Pc7tlj3 USub4lkdLwJNvYzYtT6FfEsanBbGoVa3BjmuHFoBBgFTCRp4WNJ1dwJRfMtb1N1rEpRi76aRQMBP zRTvjr+XdlRPAhRjNgiSYcN7kANhs8Jks1KD4MuMQhsBsMlJO7g81pQVh7g/Rq6DwyPF9qNDzvZ1 qAXDrF8Ys3CDfiDn9GDmxTE4P/H3j3TJz829kSVbQi3s5jaVyZn6XercJrvrTw1wtNVuPh2ey1ll +o6XP8xomfNrGUfZkwSpU7kQ68tx2kwGks1hMSdgIR6VEqwFVCkQyczk22QiCQNAEqNIYXQZHpRp 7SnX3gY4jBHF5KLSQgPwPxbpefh+p9prbUEffWZIOS1rG+bT3eRdGAQGUwGCA0Bg6n7kI/aze8P+ jjqX85pfH4EE1q542GYVJBO9XGqma0hP7gkqqBigKVfgxXEYUfat16Fl/B2TbOhEytqDTYZy+hdL 6IF6lZPN/GTtak6tDpYcH9U3VsLOq9L4a6vC/FwNoPZJnsLCM7Rq/dN5iPtB83V+vL1e9VX7ehud V8968eutyEwkuMZokQrrm8zcOutMV2KDZIMrj85HJdqV7vajPKNzAi1EpAnGNPNWTQ2IJjfynVWE Ec4MxZ9K5oZd2IXfs//SjJVJeGxAO1kqnisUWxlxPN5nGLYN+NvDngizodXk+Uu6WZLwzRyzjZi1 bCB2jK6q8auV82m0VDqFTvLnFRHlpZClkUUdeURUHoOeTQwr+NquV/nQT0Jxnj2UkBDXXjax1JRn bZRoZ/r/JwYYqIfXeBs/QsFpUQLAcy1xJeOw51LzMUq6h2uLup1GqldVl1icQAdq687m7XZ5pSTu bJ8qgg9/n7QTN2Jzt6v82FD1duksRiCHynhNiQr4yhyASOWiSqMZAR6G242HXekUuoujGVSejX6L H3xjyuO3RS64TEyxpmdGJeIcscA3jtJ/y16yLZQZPT380iSb+aMGa7tWmzo26i3iXXMbRFCHNHHA TFf+eaTlvTOy8LkAEd2yTf9lLI2TusSwG4ll7WYfraL5MAg6D/8evWiOHZWcdyMuxIblVtaum6pd Cz7v4OLzaxcjvL6vdnHHM1FjCz5khtxP5SZtDIiDB6joFgczRYbgpf7cZMzkiGspNE4S/Njj5rWD ZdWWfVBbaqRsOuEAGRoQw2JadYOjij1vsZHARq16i5MZkYbDhVqMEOxzgPbiEFP1FWfJCaNjSeAq iz1vscLGNWdGdCDFU0gpRTRl2sRS/fKQFrFBtjiuvYj9qXldFMbcfDP7sPJo7ww+vA== CbA3Zp/Jq25ChFpz2Ti+s+knhW1TX7F/UnCv2pMvIuFDFkiPaBtn23aWfTQDVj7LxcVmdxbJW69y xTZ1CnPP/oXEoA/7lXlS8O+X0IketIWU8nNBD3ALB7oM4c7i3Z5HWPHn4j49zw1n6JwBOA08+oa4 cVGfGyDPejOVbh+7UG2uXa5z1Ary/h1LVZ7ruW5CUqw48gEziYlRiaE50V+cmQlKPkwdP1U2oGLK zfS6RYtdUvB0C8+c0exed8E+TyB9S/ZouVEvNXwW4ZHtA0N7793MvdeFqtugnzJj/xruvL7mzKFk A41tCEJOyLsQK3FLpsCdIea5Eq827gRIA38Lr/eKMowxOF4Lqj38U7QPtnPpIG6JP5lZS9P2s8Gi lW9dvJoJL4aGpvCrgtODrkIj4FUS8PqSewRuWxVvTFevUDvUjANqC2SnbbbQPayphLuFNpJarMKn z2tgROYn3oBIuYzJuGWBC76Fan89gY1xu8wtFbmTgw6D40k0BzBuuHtEG+Ehyf/Lz+ViEk2e3nqP RzbXenUZpnipQ4TxEQ1SNvWaBMJDIOV6tXx8HmCtXANQ4XUk3qAO8CjUUuJe6kuYgVo9udpPRmqc wlR24IlwHEakp5/oYuP3RsDpcyv+UtegqrXVtWYfpf3lNAv63ri9z8k8/KYGsflC2NpEtrKPAuVH C+IU8V0naNL21kXxzMShnKIiZP7+eUTwVUVsfR4esP1WwzzPJYiqmoepzKtdj8/0VG3vqR576tWp VibPwlMFM7+mUO9WN3BYuxz81qiM2o6S/l1y3HZpa4pZpEf/YBOtF3flQe8hFtBDmXrWcXO5Hytl q6C02Fp8mlZQFavU61rk+XpSkZ2m1FCNVl0OkDUil/7AAIiGm3yq0yVd1q50yUmlw0Romc5952eM UOoYBbeKqPn3Q1C7jP3PVI295sG/lOK/dYnPFjakqZf8HAGiVM96ShFGtqU4zzlX75kfera47GKS 5veA3tK8Hhorh2Uw2EhIbEYGni0qTz/558jFNfZQmJFkey1f4qe65Nw5AKdVif46YpHpqd12stx5 l3zPodCrt8T5ofHysIVDAZYnjKTqq1lQeu3JImOv7Ciza/vDjFWXbemTkdSfmZH2888LTdg2LKv0 FQBP/ymJ9g5aKpuYJOlu5twISqB5n9KE+KwMup7SCX6zXx/IB9i1XTVc5APsWlacG4N0H/Ww7Uz5 IzMTzNSIm/IB8HU31M7M9vp42RWyNIEuERg1Fb5ejqAPlW12dmW2DeszMvMAN0ulPrcZ2RFiWYCB Qem3teTPMDMolnqlLpz9PdvVVcV2I1onqsqfPixUARuPp9f6vnCWO/rjzEjdrBqRZAywBOoUEsCM Z7DYDPjfUwweQOPpm3eQjbiNuBwzJhYBYOLnKWoNauH3+ABPERdoCzzZB8xM4TRwdbzWr3rJGqqq ZkOdzP8csayZX8E0lqyHSx8wMzsnPffnqWr8alFtNGNTs71tBEg0uBn5YPwcBhDKItI3Zsu2ShUW /NJGhVoU981I+YVGBkgzjqBJ9KanlgPUzm0PdIJu1K4VmWuzlSecgtDH5fxLIzOAhB39ttBv2unU xiOINd+DGosPoIAC4Mn7auGeuVmIbjMTU9LJEmhGBtNdX+3TyPRtEyMS+XXEEApr1/Z4XF2wnhH9 aGHkVjASR2rmqXsAeM6MUA+w34rI338Jzk7Prngz86DsCfzwIVCKbqTdi4eg/tqDl5uthi1TdjYA E7qN2ZqXCy5YIDWNzUb6jJ4sQa+3JdGyHrjpMCIBY4QUD1byUs6xpw9jZvY19mhECiMRZh0cAH4h vMsW5Cj8+/5wIbqCUTyYraRIA0rheY52uc7siRkZ5PdMsT5V6gHOUQH2o1eAGU2tMeyaGAGl3d5Z YbMLC2Y7kj7WzMQpd2ISn5qysJ3KpW5EqaInJNrMVK3u7JMxI72wTi5UNw5OS3VkMy88ArTqm4mY 0x70dvh9QKuG677wr9n7M4iEfWq7eEL0AJq6F0e0n8UATYFgR6rIbMxV9SC1CGMbs1+fbPx96tm8 /r4+MYEhN7aTuvupUy1cIwXJzczC0iBNiBnZ5DKCIxmjHkpTTaIEzbyS2uVsXssK4yB3iBv1CFRH c7P07FBzMyOJogbV7MzIAGNmF4aZydExA5f0ATOf+Mpk0xPN2DvWHS8krxbEyPyXFul5IOkez5rk TyNfYb90CkE+6ddO0U/BMTQjTrSVSAR7tUk4hpKCL4wiibM0pviVgllbhXTDlgcYH7JqhGgw9u/l 8G5RbfLfwq4JqMIf+DiJK93McthGQCqOybKp7S4NPTMrywdm5kJeIPMzmyfjYlYPNsgtWbqVbQG+ aU0J6QUexDa4FI9r+P2l1KgJfWknJMJ7ybl/lqqIi7Bv+x1QOd6iknZt6XwvOn2nun03q21+GDz7 foMxwJD64o7EG06IQ8lBoBLi2CBdmGTj/OBJEjCEIk8XFHLpFT5NKucrGxD8TE4yvN559C2tInCZ +HkYuig2A+Ylw4fSnUWtJRw+rjf0RptzufUZuHDEVz9ys7/pdloXaeDcCFcB/WLhyW4FupvsuOYK ryoyvA73dt0LXm+h3K8cyV0b9dIGDZpN/yl4kSsb2v3HpiTnsMmXpQM1F4cZpay5qfLjnv/gd+Bv 7IPmSuk17P1liuFpUq3EjOzmmll3tShjajuBaqpfC2zG4EFfpGDiFGIK0+zvqfgFnXkzvjzVuFn8 O9p4XFn12frbnjJmB7HIsE8KTxrSeh4LVX7wfqpwgAexyGKmxAco5HjkyW8zQCFgZ9utj4vPe3sf zwciv9xLwaTu8Sj8gclqhhnpW69sJjAzawkrIFFhzHn1SMT7ldpfRMtt4fcZufMjUK6qnC+mws1I OOSK3DMHYGJmsUnLjYP0lYBZeZoAyR7spX8gqdCQSF4EpphxFBLs6cFIWszpLOjdm/nwJcTZ56Y6 eLOFuR7Ky604C/jnTZx73rDxgWQLG+EnaRavzNRWHvdsaVrexIPHatgHZq9Af8DMDflIz/EshW5b zTkvozPQ79CoZirYroWfsDOhmzCxrUaLs671LWbTo4be3IvMyMYnu5so0599qdY7ZoM3Roqwpbra EoZliefxLCF1Vxy4nABDJNuKAg165sXCqspmKo7iVpl1JOZ+K3E7hCrZEsKwrCd4D/YFZLJ07BT7 I3qBLXF75ChAWuI0hRzXQe8J4cKzwx3HD5hJ+rfUl24Z6UKlF/cikedupDHNAvOpFBzzL2HyWlSg LgVGH6DAtVxCcJwqkt8pyPwBvQ+OPzzv5yYhVYew5epFS8kWxFPUJLHpXnsJISSD7L4We6dPthjv nO2jLMgWT7NVnaUYvE5WYomkXFGZ/MCwfhCF2WJtVmIhXe+OFEAFR0rCK1XutuCv20NSVmLJA7il gm0F+UpCX6Dut/de0qZv3C4t/ETJfr3FlC2S370pCUOPNQvBVQ6XyrB98fieLDatoNKIG+2Ci6zr VJIi4Lo2ZLIE708fnQpb61rfLevAZVMkncRY9ktl6ABVXWpdgrG6dqpjVGelGzuPlNYSbeJIwrAC smQ1OLof+Lx3EjmsG/AzRbcFIVLW+8ZOR1yV7CER2wGqbavOHkqLXlCRKejaStnVeXkGetnfKD7/ M6Ik9vRAPu4XzfnG4lwy2+AXjhfmRoSv63KCzFw4M/pxNQtUHk98+/N/vOb1/Pm/ttsziTj4syOK Rb9gJopj6HQzkPtsSjnEB726+GBGpjXd/JAKlT11y1SaVv+8sa5bV/mToB3zE4uEWo5VFgUyurHW Up31ih8cQo2c9Yo7+OD9Ply8ZOJzUC8FpgkQtQE60wvJ/mXzQrgymPD1G0NVfTDa8Z8qTAS0lbDk Lw8cCuCrX5HYQx3z1cUwvXRAWWeC3GcyeK1kWF13402XKsoSHnN1arX0JbVaa2yYdCtFXeNdFIzZ yOzrl3JJUcr67QZs+Rcss64izoyAl3c3gMydKefo+TQaCdxO1qD5uZnjy7gfubYNGrg5kN9vqExX iv+ZeRCGuOGfKHgJDOPAcu3S4QxsIq4dvBC1tJlqrlX72Qw/jH/NIvxU27HNVIc1u3jep0/F+6q4 EiTQvC9Kc095jvuJsCGM0IIyDV9Q0czsybZL5f77PkEoqfejxEeLhmCbgp77xqp4nxcm7ABoaoB5 Ke0XzNxad4peqvHIgxvC2EnpsT43ZaRcuBo4jko6K1pMwng5TuKcMrO+I3VLHrWHLsHNzSh/rqjX cKvR+foOzelcbzfw2h7ur5h/D9GKy8Va0BOISbHzaiuHip4ADtAOXRm2Q2zhYXZgJHCng35bMl7b GwD0aKuvMallNikW3l/g9W1b2aaQd9urL79gztBf/Kqm0NCwRBCjuohP57pJxvqe2ckZDWv4MSUv eDBZvaDyrPCQPgZIBs+ZrJKVfSnX2e/l8o3XO9V/QSRDLhuSkJaHUQ/jtl4v/4kdkg5rH7iz9Iy9 ZK9YAqJpXvMnTziAk++P9mdub54Xqzh0PM75BTPd+Rnz/ICZPvYMsc0wMt5FD7sZZ7TXh9EyazHp SW4GZ0eXtBWOMm5llqepLJcsMQP3zB3Oq/W+Z/ZwJiX/ENva9IMzbGTEmle7sj0qReYkyvLZPNyg gaMwI/o9ZsRvf2AAxmRTrAKe+WfYwN59mzfiLEM7610O9d6vZA4dYmJaov+2ckBn4ikbJW2OlboI 2QhuPyexAhJl+xtlfkTf1FDxcWV9xW8YIf+WB+bXHpYMyOI7RaBycnOzeU0mdsUUmw9hM/HmOmib Iqj9XjAztK07GviwihZ3N1EOL2lj7KhD/MSSZV/W9WNLTMhbIU3cOKMn8WH7uDo3dhXTqQ4YRqAR Cb2/m6UetKmGV98iOMBBtypT6ngJbFDxrAIPHkfXkemUNzHZed2TJHuKgLyLisgnwFjLNe614cET H+VKC4pPMPuZLG2x9fdHviK9SpvA4mmIZhi3KQaX+LvpBlXlfQBbdmnMh4cRyGpcIYpfzdHB5XNl gcYbpz9gbgrCB3D5xsq6KAxI2TJXrqLYkZK7ThyKCOFEX0gYmUY/Oqap1xaL62YeVYmpkIPyuWR7 PR6lmYlNVHt09aRTQCpfk3LUh0viznoV2tTS5NSnfDX8akbSsk32LPtXyd24JrMuD/8h9gJ7FFgD I9Ki/xbXMjmSyhauY0NlC89AfXvSwLG7BIl7rKhfNGvkpIUZatkdogtwFp9F5AQZobKC2KP+5zc3 1ZPjoVMhzRIzgD21dJuY0UckOzgASVlNfnYlQRHlF5yy/Qf4s1icziTPbIIh9bggriXvf7+p6Ui8 NC75eeNnw/bXFWc4XRjFQMjktwbv1LGnsTasO1qVeHSZjyM4SGcV242PIANJa2sbMa5EOsVMSKSP VHW1nidiX1LKfByFKZBr+eEUh+QJH2ogsCsVi9RkiT2iQ4R6E9kMx2b81AMKEHOYyg== a1YaWZdFbKj7+mx+M1rk+2//H157G8v45sceYBSm2nz8hpmFpaSqNPlYpYq/96QgfospKTMuRouM AN24YVSTqPFP4pMZOn+G9Lq7tzP8CF5OcHaM6IKKP8/iMt4tuWTT6yt6M0uFnnHviFO+RQ/IpsyV Gw2PVuM9xTsf8oXMCCGTkQUk57mdj5xU8IOOKLTGAEXcxKydjKvvffQraeNAevL3ktE6NXiMzhkV nKEO9UsKeFyKtWbujFtSVWxkam2K+Wkkm/8UmdJoihnmX0RaNJJ2fkYoiXl1Dkr6QefvppMp6tcm VhTkdHGvoTrZVaF24+b8RVw1mjLsU5RHZjxMj1CH1+WYOaekdbS3gGYpy98M8tTWzI+QS9oSigx5 qi3LGGAIX7aSCnVcenUPEhkjdXpm8h0Ze24hrkZS10M4i6mO6eT0tVfFNtWxBM2dFx3fWDrXVPR0 tezKQia75o0tuTBy3DbUH/yaoNKwKbs4snVkqytrLH3MOwqhnNdVroJKtZQvzc0mrfES/mRHFM2/ J99y6qrZl4+s9RaPlKmNP5xVlhOGKD7MYYEiWLL3dgiYYQaTLm6f2qVWtKKGN4k26mQQ7is5gbdg 7ygYcgZXrNPFVJ6U0Yh2aCbj21YYZjcxWXUkFZ8ZkSHfNxf2lnLLDtofjss2oiyxXmymO2IBnOJb un9coPO5iiXMtM4iktzs4jWOVpS5982s9iieTo/WqFtRPt+SUDN60Mpik8d2HOAET5UNQA7JpN49 SQ5nLQEPnOdsMZ9VpdcT6RlyNSIlNoo4zSeEDGIIumggr3CjJ2r+oC8ESWgjO6DbBJ0DixDw4dm8 pGf/6cmgW8DMeAK7UbaYvcnzuURsBV90plspzlKGfT7sV7EB6CA+zEOZiqxCmPkQ/OfBjMiHERuO iyi3ElX5SYbXzIvzn6pQ5CO0GAcdauZOPlRMF6NTi8640OxV672RaDaKEbN9dNbLyG4mM0qe9pG+ h7nfQV/u15584albiz3NLsVWfSRfbStDQuzJzWHXoux3AtEB4+G1VL01dlHgJc4laeADsLAvUtt+ GekmmvEwNPPEbgzQtaVs6XvYbaFrZ0tCfKa0xr4yzmZWpkM8yuYyEH9Gtt+qolaoy+qNI3m57wdb AyK4iQfCM8RNKVSqQqbum9i6BSHZFkyNg5K9ZiWNWdVesJJlMTWVVmD99LSR3J6q8RgTq3JYm1S5 WQJcF3tNkrEyi0a2zZa1I2A+XkZ2SU2RfkwpKpvjp7TQTHzIkGiAMWNKkVHb5Ft4yrj1iAkJfxdx q7FsETvrpQ5xoala9kgrwgapX/CgTui2WDFnfdH4TAUSyWjIqNeUBvbIFqNeqehDTropTdrMfjq9 JTVp6b+tooaxTJAZ/Z58j6uYWS4BXPbnOYfk+QRaMFJC+JT70rRd1rpGhAdW/hKhiDtEGNLkdAYW ftK0ripZCRSAokbbJFGaxBWrKQexk5exC5y2Az+tmucSepV0X/36zgkLWsbSQZco60JdCZ8VWbcP mNOdQIuGjUCi6ave1C4/x1Pof+DGtqo4xHOsppW7FJusfqUTMz6yh/Ao2SwdzwXltDCDHN2MiHmm uOlXU/CHCjzHJQw745CXkXK5Uxws9m4WIe/XSmhKXi59fk6wyTsrIKpeVeCqdVGFmHkRBUxNxk8D iGAye2LWlfkyYsFCN5RaJkYsWIVYRorLiDubINvyeJ2ZkFgTlk8XdCNjF12Vo3LZzuhc4AAdiZB5 c3weCeNSF8c+Jw1w3cKjSHlKjWDdiGXmRoxzcWfUoVt4rsIUG1CNZbNqy66iDs1ncBVEi0rj1/PK vtgpR289V633oiZ8rtiVrdy2IwGalfHYKkrgziAx5AzaVnKFi65cr5yMmmZcjHP9c+WeyPaqrN3Y Rnn4wClAaT+1svbUk2qUmK0RaDnu9plN4foyI9QDPhlZaYPkMMdlenyolmAMpmpt2eIPZTVkRFKI f58ld0loHAFDZ5J9v51uV7V2F7V9Pu5s/KI1mbwbidtSvvWySawqH/qXS7v+/NGQk0xqySCQSrFv kzIUx7/6O/tPJhwM0YKR821dMrQjNYYtFcw8Kgn7TLl4sDVPD9OsnUkwQPNdfbmopSow3O+/DxfC RlAy2jIqnBdd36F8hE+hsycJb7k1qdCMi8CydQFtxwVje/s1gIZaNkdD/vwXzE0a7qSVbU3+yg6k lhnrBQFO9oxmPu2AB84ItTUVV/Z9H4Tin4umtYGFwM1Mgtmog64JBdRaVT/DZo07zNQx3YHSiB8b wmZscK28P4Ofejjs4DSGoz71cAiYPeE1fdAMvOu5Egs2SGNFyTflj+/HxhvpCgvJP/SL5iWWHDiL zlZBVuMDPBtpIXcI9hA3RuGwLVmbMF4Ca5VanF8mABiidd8MahC4s+QwxKtDE8qP0XY5hQYrpBUx I2H7JcoK346L52+VMGiNtkCi+KPwIJ60FqSvtRyC2DZI4eEriqwYl3Yb2Fb9rjuzpsZcIxFY5ptS 4uZman+f2IdmTIQjOKU441RZoOy2Sw+SkpDiD1Y+bBQ0mFL9sHGr6AePypLszX3ueil4gF1pgZXs 94lxuSH0iGBf+M2+6JV6voAJers6hJSHd0Wk9fMYfBxdHCxPRM6/YGbIDYEkieRVch4l9fn7IDk6 4V8lvsN/YfTfmL8Mkg8G1JBW6bW4mQ8GvccDqrR8BAh2xxPH/8f3g3DuRR/ZDiwmFwqTkzuCAZa1 6V5vNuF4Wfvhzoui9tuo/JKm6mYlMP6/kGMFF7Z9ugbaYvaasIfn1kycanMrF2nr+9i8x0b8vqWB DEDyC2Zg4m0NLdSaGpFSI/WdTFQyqkTjpiz/3QCQuBpJ5f4+Az4PawgQRs9AD3we7FrMpomx9FBX aokuMZqu8FOZtKYK7iLRqw262FREUr73CfyLM5sC7V8zI9OouvO+KT0onV5UKQK9jo9KJAqzuL+f 2hGh1Yqz5BfMJI1F48CHrmb+SFvWEfmQQNlWpz3sx8iGhnHU/WEwxsHyLfXWEjBpxsq+NcduqqZ7 CMrWHR81HE0l694LvRpAJVWG6/5jKq6hgWUkEHVGoMABCCGfqSN5RH+01Kjx/mgTIDHFR+67PQES JdlFCQMYrMA63SbSQYOg3HaugH0O5XNSuGBQjLed1MEadDE+sfNPw+YtmCWSMMhd3LIf7f0OeGtv I/+CmWSkR30oU9KTl5qAq4mRIbVKQMSu3WTcVF1hMO94Ma9+d2/8CAGvshT6c22X4HIazyU6ZWUx pMafaKP/+H4Q7ItzXfyE+YnPxWyeswsGpmomMeqhg2ZpTUl51J5SUKDacsbbhxI82EGNnBB4qPff /0NvpD1M2FSB7O0xDaErjp69QKJtdgqpsddgXjg+u3YJYwl3y1/zESQIJay3CXCt7Nv75Vl85UpT P2Qa1G+QppJh8su4qdl+qbndopuF6mZb2drkY3ybwAVgKkTC10dfZ+4nTfWuISaweUu0fRmBi6QT lmSLynbuXzADVDnEJG5KeZ3nocSXOhFMVprZT363PKxPRGhxLeCqI5VWbTdodOpWvT58fJ52Ji8m 9U/3jcfBZ1MT+HwD+d1/GZirDCwnLq4+uPtMVb5YRba9J7I5bixdM4O21UiNHx+10gh53e9u7Z+R feo6vhOOZkkpdfVK9+AR+mPxQfw+rcb2IPV2u3GzDq2U6dsEfmrP4D0jguCegQQn3SYKqHHrKVHj jCU8Yg91b6pKQC3au8dzKXzMzbbWIZ3wKZleB0lWlljQHucoyyc3oy/TvZqUKjlQvbjAPp5UFEyB e7s6inumX6LKsau1cFMMkhrvLVsS40Ad8P3X+KLFcubCKHrRv/k9o61xP8uvHlSSSBEVAr/fx+UP Jksm0L+/YC4ELrAiei53kSzrlvsTzckQb6WlD0XP0MFV/J7X/Pb3ObFkYStRLf4Fc0MFFcXpD169 SPSa2K/3Qfi6N+kHPh113mOjx6S4w7pJpIwjqsVQhSBDvMNOPr4f+0O3BI7zAZZRtiQCTWeRW2GL HUAmtqYfvljoWY8n21vtgdQHV7ZUrJix6t1MCSw183mE3qXPAxDAE67Xz+/nips4Se8HoYlfMKfm DI9N4+7sJBOn1sppqhmW8J/9B80s2Qb1T3fhMjN4si72SrWX1GczqtJHuixWOI6u6mRWLSoz+BDM ZpBW1Ypg1JNOheDTJBxsOZmgwDUK1eSWBuLpVDUkligh/8QEiIoscdiHkR1eQH7EqKyIlKvbx8wp ugvBxlNVlyqRQfkRfLODYuGZYbPuetHSi/gACiuxL6FyYHzmwVjt1PwXdTmqc+1Q4+w8l+JNzUHR 2OAE+Cc77qecXGaUjngH3SnnDQzJOT+SrjsCn9AD/ZCZLPyFD/FhJsg/4UbW3lW4f6bIqD2Yhzpx LKeeSpx624pWbBXF6mx3LteujY5739w7iWxxtLuI1OCnkJuCtx3+xGcD/Wk8hA9+Y4qNDGItq4QX CnBFRw2vdrv8xHo8/JhBF6VDD+hpHgI/gglXZwh51k8nys8moNPTWG8lweelnA+aNx8jkdZn0mNw Dz/wYUdE4e0ko5GZhzjQvewDo9QjxGAxmVnwGczkZ0EhDpEHKVtf8QGm22oXw0thNEN6u6SSNfmK UZK2leRDheANuxZJqHao+ej8LlUi3Oz1doYXUciPyK+akZnQQo/ApxV368590wQo8FOoXeZ/Ly11 L8PBiE//Eh1w4txDMaBJ1tMibEAJLqowphoD66ZuJYU9uyac4veQEfmJaodzFxdSuHsfHAdgZzz8 MBLPpD49U+UHDtIOUadAQhh3cOWedtSrfBKH/wQrCpln5iZBOBQKTkq4SrnorEjox2zVR2HmSllq r75xgTP5XQRsP0AkxBDkF0+qpnIp49kXkm9ns3HkDAFnnzgpwwisn6vsVH6lPFse9yx/4u9Zf9aL MGMqApHXwea1qOQ7xa3dFRbciW3bqxo1dohZsp1qFh7biMXenQF4b+9n4S/ul9JkY5bLjjJJBbHP 49RL0m2v3G/blKocyvg+aL1/6zeH8T/jk0IjETM2v/7mDjL1rVewhBqZs9RFQW/xPiofRKHqtO0W Bf688c1P7q/sNznQS7m3KxfzCLI3z7Mk3TzoT3xvrMk3XwK2dCW/jJhG6g4jPQW0aLk4UCqnfJ4s fT7JlPh5ghjPrOGKX6KZ5+Hq84Bp0fibY/13d3EkDomOkfOQftt+jIRIX+f1U/PlrnWu2pHNDZxj J3xQuRFq5/QN/eP7Qfg0GtUgO/R4ftGBRc/9CTUaOIpEZqGByoiVKuFaU9jU47TcgHYx5jqporXB 1vjNz//UvPA1D2yfmtc5KAxdO3BTBqPGzv/x/SAf+G6M4qRiB/Lo7RfNKsmIg3xeInhkDS7ZP/1c LM0lc1IPE3Y+6qKgCAD938wgP+lxhg6pxak15hX8mOvkXEvJuAbauco8on0ha1Ydvg== S+GdD8s9AXlyl7oiPXxjdcOslvuhmWS8RdzDRnM3tWsOOABNUuklemBjEv2qj5JZ0tjgp4Qlo4Th zPHKZydjpvGmL3qYnsgiKd85vAvJq/nVu3BjOiCqH5ebDDJxs0k+Clk0EEY+9PQdJBnDHjFsoz82 rqWURmHbhxmvoir52JwwUiJBhfSW85IuQl3AjEQ5lZtxcorWXlGYDxCxsx21G6thvv7s4bk+z7VO N105x3qJMFL6zV6VoZkSZSeGwzOXhDaZjY0dUX6X+9R8bXjFtk73IZmj52fjvCeL4LwUUdWMZ2YS exSm8Zy3EY17D0sQ335XmO1DTRZU9mzlsa3poXrcN99fAjOmQmqni/9F86C4oHI4bl7U9EQY4Ub0 +zxBD/btuPmD8Pjt/li6MSJVFikNsQeNWruaKF+DrvCb/f30SO6di8V/UMF9K5wzKUdLlra+mRy2 1qcKxFcCEcRZd8m/Yqt62lUDOAHKdaJ5AF2ehDr5XQPT8lARzwcoFN2EkFqwz1JpRzl5H+AQ/AbU pf/YpPoP+i2cK7/zS6wEo31zYzxMjpgvS/RZ/IIZ+SKGO9w9yKVREtf0zSA5+pdhODqJt+7XbWbh L4ID023oGS1B5B5Ginh8inC+mXS81nLBEpzU6xfMbKBWosvoex8lxRoIcZ/nFmw3UeGf34+bP8jG 4gsy42Y53YNC6N8OE+aZ6uRgSn8ZIa7oebg4Ft5/7qee/5cHzXmwSUXCrG7UgYNA0H+uS+B85X1/ dx/fvdZ/RtCFVjBLdy60QpxJdNN4bidwxt+GeREnY2MEAN2zozszHp+H5k9uyrYZ4iVdsC28yCPd +yPqpPFk1mSrZIYeqZ8cIOj3RyoF249F6W/oNPhmBnwpJZDqr//QAiTzC2akmkZTDdRoYUMCZ7Qk Ui5MKlnL705eWrTWjUqqdlcsQlPXJVsFr8SNV3bzkPtgQPAGA0SmykZFXCs5sFF5Z5zrgPnSFgLV 1KiZ1DqRv40JkFnXnljWAxVvb0bmI7Vyf/dyDmOpkfusPZcQHxnX8WvxLfvapHhpPmlFt1plo4Rn boI+dbi8kmwe1A7Q1vMd8A56YN7xvrFketS8v10EjB1E+jtQK//FW6vu5RkG7rnUnCqMC6SC/sA2 jckiq/K0TQ1SnIeJdrs03/iXCXDdNhW4VzQy/6JfLIgRD14TKRIZL3UPSr9IqZ+mbbup8X0lGt4d nCViVSoKtYsA0PMo304sZ6xWmr0Ui/zm1+jdLHZVhi6UmHcDe/910OvhiLTd66X8tQSBjYw6yCdy 0at/cxMwT1KegsAujOTmGSli9WUGP+XUPOkYl0qnRilVC10gY/FUJqZ7Ya7YVX2U+HO2ZPoUZAi6 TpEqefWMkt5nQNrS51J69ODzF8zpaorSyM2SeUfrrOswTOKTwUb6Nip/rl+0z5b8+EVrIzUw5ZFq v7l6o6HEjUs4cvItfrk20iQxqsi1IrH0PoE/cmKfB46ZDYnCb7b7hHIH+agZj9Qk/tpX6GHmzHBU 9EeGqIhoAp6RmiDsnNih54s5NNIoodnu2wfxz3/6uz/9F//6v93/y3/z13/8N//hP/2f/9v/+A// 8T/+03/4axj/zT/9r//7Xz+Z/8u/++tf/+HXP/3jn93655f5z/W/+lP5879+/e/f/ec//afX/3v+ XPz//t3/9fqX/+71D//Hy/Sf/9z//N//+d//z+XP/2hX/k8+c99Ih9UTYru0W4nQEdaPz9a+khsG oidvFv3lX1+/8z/8yZOXr4/lz/YPdssWvW7rS9A0/wE/sov4ywjHs58ebLdlF42rw5DCgXnGa5I7 sVv+yvjE2W5RM8e9xZb79vs4WOpWpfQEZP0XzWrDSHX3aj7RYfOBHdYf3w/CLhErnpLgzWuBv2Bu 4xBeCxBYTRWlI+byannSggGS1K8ehu82j8HeiGqlu4mm8MZGiupJI1jZBdacOgDZwA1KivfpsqHj Ea3ejkDgF8yrNfZPI13ejHqRPaAeFcSV1ATbF47MzINvRZ0xZhQNPRxPMy4SZlJLyayzcpMiYUl7 LtA3m9be7yBv7fPAvLPWuMeQ+ua63aWE8m8n9tnKBZECO9DS+QVzEy+Fawp+wNx7o7YFu26qOrYX O9daVS/QCl3s7AV68B3rJVtpnxQWbA59n1e28qAc6Y33z9aEcx9P6KY3NXFstnLaLIooUIE9fh/3 p55Q34LsL4ZFv//B13ajPTuKB27s+DrI1mV3uNiynXwvdm0hX8tuesRTTCWTK+htYjljHu6RBOeE X64djw20iNsq1AlByWC78jDtLxZIW0Gbxycx0La0l1QXaPz6+z+1+cwzAeHzI5GbD5q8DfUoOKVt CJ2sGkmR4FsV+S9Ij9UskUdmD0Aj3n8t+/USguVhFxv2XHQhluEc7Pkb4t4k57UZJ5fKeNi0aw17 lZ+YF5PYsMeofzOr7nMQbwxr9e8Tyxl/+UHOGD0pXi1hSdeuPnIFAH9p/eIC8C6v39yIPrJBPZJx 5tIS6pEa93W8tzrgnkWqF+8y/fh+EO4582KidAreGN0YoNjpbliuD1z8cohAGOAV04/vx8jBT2ef tjce/oJZkkBQbi1tSYRyhSuKv98ULUkS+WZ0DWr/blGsas49r1Z1DpqNEVuIoOYt7oTthbCkD/pQ s4u0pu83wJey9B+wZn7BvLvIQJAraeviAYBa0N+Y2mpcdqCUbFk+sDgr0MXvE+DMrN8gaTF31Qsd XVsk91nD8cq3hqvRRvQQxjcyialrQ83EO0DDHzQ/Q2YN8Yq7yHkEOuj3ieWM5+CG6hjlX3/7B628 yY8H3aqml9bI1xWJdjeqMXZO8Bv5peTRIDdOc1rO+Tbol3nlhHOz93QBJ0zSHAn/+V2XPJp2/d2j 4LVknNGp4KNiamTSeZ/B1VwL7aHzl2s3ZXXuRMIMGxzy/EfI8OZqoNjnVT6KVumD3YOgMLv2HBIH gdH86+//oSfWHpaXfd/Vptm6KImyq5pL+2QXuEUW/DWi3ezKwp07aQHff+0jX9zpZDCa17fxdj2u 7geu8XPYrfk+yIf2hHrop3nignsC40ZC5e3jlwSdXrR95mQMSvSNbxQKWELvzscshRQv53BLefaR kRBOMw9KV63ZuX0UfaGjak/6cgM/tY9THWMHETv38YF3Yh/Ywo75Gu7r52UQpE71LLVNmPkhecy1 5fLx7vBlv50AZ3ZujSK1OznWVHgEgIDa+RT6YXM+6mHZQZ73EwOsRWWt+9pFTnAnX6NRH22+treJ 5Sp5BumzHSDCZ8lqU/LBtSlWlh3HD4y6t111KBrhB73rPRfXVJIhQxvyb6wTtr27sANXRKFy2jm0 fbkBvgtjRJcaqp1Yv2gGBYxyRWZMfUoS+LUd1MphFKOcmU+mhXC0W4qJBGPsR3ufQS7gsVMGquVD TzeanGxmXPKYgZcz40zmR8VQVnhZ+EF2b7ixsN0YSMD3GfyLU3u9Q54blV/BauQiJHHi75fDyw3k Z8QvYF4Ehcyo/I2Pc/AxTHJ5zCtynUXT+v7WuhPzsQ5R1AVfyDLrpZ/ObwtiItY9FM1AjvmovHCR grKpsdSbpSYu7VMsdkBT/41v+5AbgyivT0aIw5ee2rTnIipwNAyZyxUBnkAQ7WCkWLCxEaIEqRr/ HpxXV9jkaJoFbgA2RDtaceIozD7TLvFs5z7kpa9nBRtZPLylfKCRIlWc3t/AB81RgRgCWBSvmbL8 xxaC9zeb+3HRAnGMJPeAUxmaOn74g1cfZoMWSLa8S+XRGoNfcS412exvcKQfVznboc04RD/GeO63 23RR6smBkR/f38aH9rjXYcm9kzQibYsi6gRkKozkLD5Em8QOJdLNZ2iHe0VwWL1EljZTWK8M2ejx WDD6yfngAHQosnPZYokyuaSZb9kibbI7I0NUczgTX9BTeFBQ4GcHKejfdFPIqHWd5VsA7msP+f0u X5h3H8GP5zbGm6Qfs+dyGMN7Jzj//lFi78pc3OYJWkI38gjzbezvee1kuockf2Ycj2KZ2vVupPEt OgA3K7aYQ7/FBzPn1n3phwwhm49AFQm6Pvv6HJyf7H0Z5s/3TtnthXZsu3Qy1rhezG8m8JorjwLy JG1FD1fa7u0J5gC6lufDlsr6l1fw7Vv8dqOw7YE3IT9mX3yCvpS/+0CvtM1hn6Yj8RmB4AA381Dq 5yHRKhsT3bhxoc+AkRGYt0YRHYIZdyMtLLOwbxPIme3TsPGnYJCZ4zwZ6p7wvNgh9YbcJovkslNZ e2NngujzAKhu2Y+NHOD7exvPYEMvV16nBKGz0pBJC26UZfdWpuBmY5OwV/MU3VWdidxUxhVLriFb J8XTTA6soQJ8CZBgGIHG9Pzk4LS+PNjb5RrIkV05LxG02AlcyHvZnKaC97GIonHffOHqKm6adJts JuT4moy1Paxe8qU+z+KKaTaT0anc9SmmKcTCujOh/enizXob5ENO2ZS27lS1xsyN21R9CLQ2B6Lz G/PUwcf3g2D0bSjR8M1aUKgHkZ14CYwcv1KU5WUuY8BMYZk9mPw34wj37H1cqu41Jm/tP3TC+80M tEsLEPcHzPAXDDAEkcGmruqm0tr7sEnX8npV3PhUtJsptrsDahtGhiN2FJOkvE9ucM8QubN5ZEwc jmjt5rA6AEFrMotQ1fZqN5UuvsyLrchGpLzgAnq38i+aKykPpI3ZYmGFu3ixxC564Wzucmshtox8 2KsGrWo2qP8AtSgX/xlJy3lWA1TfSf8w6CB+ny1B7zeQd4by5wC1Ne8MZRDHZC0kxo03NXwRQ1Vh izDe1N0BXuL2/T5udmacxZVyVH2yRsw9gR6SUpi1swaFn1vZLAQVRINAUZ38bVSGT1vEh3duw1Nd hfEpehNdQmkpnxPpXXdGFckWPvq+bylBnAE9RU3SWXyfwU995skFnGWb3a8oGdB+MzIcPqKAM2Nh 9vGRMJeNK95xVlbN2ESVT13gtxnwqZ2roOg3/QvmPTe/JNB5mLEp/kfUaCfQKffe9hMDMGG/tU14 zZxZCC/7/Y3HbtdWla8Of2zKY6zIwr7fAmFJi929to0+yF+6GTRfLVxfGBexkfCd3RgNTmack2Dr xY3Kt+fBSycvRZD7zQQumFBnVbWSNc7MLxeEgdET/arVIOqZ3600jkZyeetLI0wIH21G5f73W3HN LsIZfZ4AUs/duuUnUzQsUb+sU0lRIIL8UsFAGgg+3v7+57ejfujXXvs1vBOP4vlzyMM5b0zlz11S DcjGdMnLuv8gaTdjRDyb1xZO7XWYsdK6kDJ4m8EfYlH0Nx77KJv5zLrIwBD9gGEblbZB0kY6eTD+ 5N83/T3yTMG3yGtXFwnjp9//qUeWbrzXkvSGlCMfyIB1Y9omJGggdWNGlfm7ND7MPLqu3bw2vzf2 x7/PIKc2izjXn5JTG8qqkq/fjIVZB6pgd+uC4ByShtXMnUGps7rzWoHUGv/+ywQ4sw== rnruTni+S67mfoTWTFurS2A90CH//qHtKqrEwTu7YXlavL/5LBYT1r12rsjTGSuShfD9Bv4QKhSJ uOH9tgKFgkd0VHKyuPGZOL2JFzRj9Rszo1q7DOk5YfX6N4xImdUbVPr598kV1IWabyGn8EvmMmh+ KL1Q5wQEneSEUx00o11s+37t4rXtIc1TXXFnjZ3gUyQlbitP/v3neSXXFcSzB9jhOeFZHzwJstvO jBWb2j9//4N9i5xFKmPvP+ds0f9Jst+GI6h0syfFHfZWKrMKybJdDXnHtSSd2nbOxwbUAxMSLoOr RcNbIyvT9vQ2XTiAfLakPNkYwL7h5zx41qOFEpqNujtg3tSg3uILMpfOGhU4AOiJfLZ0OE/iYLqo Fq0T+EzeGXZGI/jQbCe76MKD3DhsWSU0b1EnMNrw3MgncEoSp0Cw3R0Ate9GTnH07Dew873iwapT x3t6nwO3lgKfRwhzc1bZcWHf0cQSdEUKNuivWoCKTyVO78XnbTE7YkZkpJsUisz4HDyspAM95mUu vLCKNNkxp2BgBaNjwIykYGuRLtHEBr9ZcrbbAJ3rF66KX7kWZuAdDaQuYL9NCzgqGRFGLgR2TFsv 5ODDIfXAMERk41vkWrYB8DE0VR2PoWsaVp2DbsLY+sNRuzgVTLi5cy0jYWr9PpFwHU18Vmcyg+kc r9edgVPZX+WTvBCj83lV3hczX+0mofCeI7xdNMs6K0RgNjzMWrqvyH9Ym4xyqMayEvwcZkbayhqc BsNxz06EEfhQj9EvGoxSuCG2g7YNFS1tADT6WGWdO4fjNfj3oD3xDbWwx2pdGQjvBacZJTWbrpBS 1smE51hDoTGufe2QWKNMdzjpB/3060U4DgWPzIFjpB4pUay7tkvrSRlaTeRYOtLssq+EwLhzyCbp iRSQN2w6z/dXfYiPt3Wn13PoN9gCieDRO3O0bhFHmREifn4gdJ7ERX5kI2AoiFY21zj5nKAAhsB4 JysMZN58X2K/0HpiW61BIh4XrsM+KqlFmRnoL3uRD5pvKiXdfQ/dbLdnobFlrcT5dgKXzn0tBihj ctUEpsyMGVctNjxVYWxasIeyM79NDlB2w9/nmQmxcKf1qNz+pDoUfczsOhP63DvzkYXVIeL9OIfN ZI41ZJ8QP33P3f+BAaC562qbPR7tvTOjsGNGFJL9wW42iJlIZeEAiAGdWuDhS2hsVEKya/h9y3MD fMBebSzuuAF6DU5Y8L3nhvnjy68h4oBBBzcZZDuCBWEhJQaaSMw/mjwtgiHjUae8ovujaP/vzLly L+AAyNDatdl8bzxXXF1wMXzczeQVYHpmRMA7GnmMf0RDPYLKys/ejC3Kc/bVyQZCVrqI/HuwxniT XiE1AmKbaxmaGGyjd7hRYHCaAG706K8ukwpv5hs+g0bu/o+0PowU4al8rPNgCXmedPC9NNiQE/r0 WhdFK/yYiK4r+/ncdetD4z6cfe1bf9/6Jm9hBIJO1FC39qbo7ypWGC5YQE5xHwNs8ob5W/UrD5sb 7Oe50m0jJ+mniit27euRI0Q+52HnNrUHq9omj+Un+K3Sh/H+cTWkin7G2oyfvpnQnJiCKWdMNZQG 78FTmJbjNvgTAwADZu8aXBXW9b05APB/Zlx9MaR6GhudjZOQ15IYw5rBB7dir/aF8bXTc/2S19XN UeL2Hyts7bb9ka/hBFu/d8ltrhduDtbPPx5tOCN77w4cMQQ+ZEZAjdq9iHg2Q0yvCupMZQOpgwF5 xRh2XvHXTMKFKemCBnpny5694haMcMhp8E1KLcxtMAJkwPqs60ACssiMLIi11Fx28+IEIOjnoz7K d6Ox97HmSS7bzVjezOi0ogPxAfN+Foew6miYrfFqMKyshTc8FVoBlmBX8sNvsR3+xABtHgzQsGwO 0xn0uSzTZ3wSle+cup1mBk7yfmeHnUW2GNGi+jJu+c4X48RRt28jIaONWvSZgaTYZyB3dk+S1dRy +dl2prEDc8gdRSvDU50r9fZ9zdjkxtVguoxhm1yTyv6xMDM8q3q2tVFmyzMa4dvUpoprvc612lXB qc4/hb9/GufVohm7ZsxXI1WTuVmeKpDbtdZHP/njsIw0uxmXvv5GwKGbcd4/zJg9dSoMKySAMyOJ Sk40bccAk8QCrKB+wEys0NHBai2CDyHMO1Ju3hfaqTZbswW0x36W137Q3AkRm5HVMWOTKCpZFn+b zMaycTwxHpgRHxHhxUO4dvGc7JS4t1XzLHbR9KDL9NW8KUKJNrBQDyJ2SDTj/qU3JskBzvVr9WSA DnfjIo4b+gLYgJTPP49+rCqV6ERy3OskQqljz7bFRcS3yP59E0Xz3Ilnj2srxZyQH8e+ymqSCI5e O3bdCXTFh/56tpsIAqzwxzbDg79HozMOhyO+tK5rW+eTYTu9HyMLL6EQbeHUNHtgXDQR2VHmlcZ4 3qGWFWeWQL27dh17gOrZj3VRl5Ak6lC4z0/jte9PhCd30pOL8Mb+kdD2wLf4wd1Yf9kUAvaTH7Xm E3364TqsxRcD4I27JJ1SXVdkZ31IAnEEssO8L0QVdgf4aMxP69Qs9hD7DziUa7L6J/6u17UPu2o3 w7X5+moO14vOvDLpK9mj7Zsx0IgYIdZMOVvm0QnnBrrajUVGNKaHkYuuVYYmwyR8WZgkFZqTXQqh 1+lBv86mzfVdM7RYydLXwbDahfKVyJvHBRI8P3I+LOTCDmgh/LxCiyqp1pOhIIkVdvS7xszgk9zT 7ZfkuJNV8dfy2wH6KPLthEpeASYgVPbWM+Iw3gtCIp/KfP2Z3Nu54Wdmv59skImokX9/cSlZWotP 16WSPxCnk1UWHXI/PFNA5Ft2rZytJp0T3RDMwYy6uUzRgHyWsY/znQEzfhbZfWxnTnqXJfejBHZW qaRGoBHTU70wp+4fBBJZkxw7pYvncpGlzpHSmJXtlTwaqL58cmM+4TIzw4Z8bwfvs2iBcMhaA9zD BGiWVYFetBxwI9pVLamWBC48MfyVMzPMziMqzARDK7t+yryYwpsWEtDtltl++KGz5cIZvbmBOYsW 8+UJOCuEKh3jWiVY2+EjyM1rWyPae5/gWo3tZ18Fhr2KVkw0P21zFrlVraK/b/xqsqXPqgbCPzD9 us/lNhDFZlUL0MaisP0TJZKl15i9rHupEe5cADQzA/KdqL1tLHnnC/ZgD9X1TnAqx88ZpQVfj0sy /gj8VZU/gHr570EcpCfOJ777hXZD1s2NjTecAtq7xwKKIu3AjzW17h6hurfFqNqR9InsKgT4IYWn GVmbTJ7ubed+o6eVyqlV6JIjXMd+rnYngVOeq5FF2Mdtmo1HJdPDSylUvRmbmzEbc1vRIyhMuVxf kw0QWXDvSd7Ubm2Q69npDfgAQpsIWudCeATdAt+7nR6NAEIpEuwi8s/sJ1rnFomBELGRAJMsKstq 61z9hY53pexE2fyaCAZeVvAWGI2K6RlRWmCFUffVEOFTiVEXAfgXZ8ZaRGh2Mn+aMgR6C22PODsF I17+OJsvpDK6Js9yuzpKaCZZ8cjNApTDBCfkxQONFOYahSbbEYoEWIaoIg57XUwzYy9dOihvgSSR GQUGMT2Uk+2Y8S2ZfEtXU0qEY2ZM/E3WmcwcqRv/cANCZgA5RVMjMj+OhXu413tASfQfeT/R4oIB FF1I0KWJ4axcNTwD9U16dZMS4vjX56EiODE6J2odRA7mfko9hqViZ0+ul3UTKtSEHj7au/dfUJxf VcJZKaK7KpGP/Fz+wARKYYsjeyXst7paepsmsNS5lq0OZq5Ez0rz/rlQEmR9WyoBM6rgAF1kAw2v 75Ho7NFaLWp03/frLxLoyl7alQSFB8KXK0Gp58KImFn0J+jUmIcNydwEwshmdqD5AkCwL3dtQ8ll TpZJrw3PpO8AnwEkLgYYStNKAsC19wLv1s+tdFU7nfFPolaEV8R3TQTD7EeuMPSd+nX4siQ7OzOM HQJwREYgZ+cfyxQWpJL+hwoqs7HNwQOgSRSwPhY/6VFLnPYNanORftJUXui+YTvkKJfMUuDLSJKq E93C8Wv3Kem+G649PGbhb00RyX/qCp/1IgRin/Z8xFZ75GnMR+f8zq6naTo+U948VNKLHI2dd1Wu OOm1zngD5QICSi7PeEsYnGolljs6Vy+BX0ukJoi6fNTGHpZeGzHXXaBbMUa7+WEfzTiV17ajfsij Ab4AvDlAzV7ESQGkWfQxb7aljCNyvx0q12FMkqXEfphZHA7k9rEBJlmOqKTzHW4c1yJ2yrb1kcmA 5NNxkU3tW/cMKElvzTmHM0hMHzmSzPiIIkXdJ34tH5h/+zCKs40ekP8Usfdu5AAZiHvQHsauKEWa 0dZxqAFYInq5ZRcY2aPgH1B8JU/JgZynifUWZp+yTXNM4st8eVUKwaJW3lNgx7SB26fEBQdgV+tW XX4kWdkRxuNlbHJuvfIVAwzd7s1KM1xnkssWQbAhglqiGiMmsgp3Y+9WAhjNjEbiFYCOGLfpkYOt 0oxVvT0rhCh/OBg0l52S+Ga2P8C4aHj3XgBi29kuO1wsmQPINfJOn6kWad2wZ+zlzEZ87fm78WWN 99+gv7de5VHHrQoZfad4/OseJwGUUzFRl4Pa0UoZfTTzojQazEyZGTqwPt1wh0zms6nFBM2ypm6p pn3fAuPnbuoTIYPHxTCEipAZ61LbpMKH3q/Wac9MfWBcigKn62PXdqbLUQl248NzwNMkHLcdnrGe A/+AuSoep0hu7xJXPmrEtwEUjfupxnHTUyYTsEFyO71fvrTGuq/vrCMRuW2xq5UyjobIHWSVoZ/m g3Jn9M2IA5BgfQu25EbFW5DudfSwmmLl03WgIj85kG7k0ke89R1amZcOXVoe/b2YpoShHl2sHZXb pZmrFsIWfHmzt4ztR7/HNGfLtBosDK3FDawhiDRjUwsUI4L+iaxtBjSx14spqx1Aj6vWPJoKOMBU 9y6R6F16V51yN2bri/0vTYwJTpCq/ECLeNHYUDtboAkVNIbVpoLH5HlhikWFITfDMhODkgtLBb9u SBR6aZ7q4gBnMZL2UuDHn3i/dL/gDNjTOhyW3UwO/aeyu3Mb/oG/35N+1iv67XyyAOsU8SCasdKL z8ycPdn6yIvmptrb9cDY4H4t4wwCDQEeW9coWXTxa9XrILR6v+gvARXwz7uQvDpxmA5CJ2fCYbOw QdsLu9Cutgj0pzsTAj6lLs37R4gj2+TYgGhU+cFr001weyJDS3I9EyCvlOgVRM527y5qc7SR2+4t xgQKbtnuPZi1zfjefmsywwvxnjAzS1J0apvq8aTULMk0bKcPUk/n7955YwiovXCE7eC1pRexhR50 lgxR4p37G59SCdoxX9xZ8EjaW5zA/K9wcmMlPTpGlxDUJaA6PBtZRmFGhezRiFnoVtqX9fCJsc/S Hf3G7PlUE9Zi5b+Qd9jP8cGaM6XbPCcqTXGerKIpMKfEisAcgHQYNb+bc0FZHQ0Sxg== J5GhpID2NrBo0neU2aArMVSLJ/udu4JtcwZNf58iwvShu9NOPJxVYRtZIirQOIlrKxnf2fNoJ6za gKJUWrq8de/9oYtWYiMPKyDknmoe8/MT/KbhJ6xIGtvLQhbVIWAsCIL2bojOktLV8fcGtOQmR+or b+rgpBgvWQ6XOCKhDooDX4TGAx1RQFnw/AviuMBcEs61d04gJakOdnSDsmgANng5SIdojC3nzMCk 66jpNLYSb7KbWK/sQnA47wAiUsll//vCDhdA3Q03WwdRIkjpmbERlCOgipnrIgqo4TMmcjfe61Np TA3zzGs6SHfjKxwMrbqoY5M02CKNznL9Em/LKy5BPcIZAwZCGDgQjkdh+EG+A6CV+ftoPjIgFYOw QbIeRylmXNQIuVK13mOopkfIwGoKqNrkwQzjOCMUzFPPjMwALXAw2UIKaeSGXsm179FhhASO2Zbx DOHv5cSYGVDLSligGWfIVSVW0UdtrA4SVWmBZH7HdEPHvvZCPa7NGrG3CnT9fbbjbGk9mnkIy80l u9TY3XT+m3E8X1Ue7Nc8tI83VkkvMCwRQcyVAtwtD6ApLzQ2KRMdfaeVYA4YW08gX+GjZn8HiHSH 0AkO75pVAwx9Ikz62VMUVwflhV/GOhl3+xfGJ7YOv4VCeSYzZ5FzVZk3k0teUmZaBQwtBLSF8XXu zmuBfcnL2AJDfs7yMs/gp3v2l7TKeK7IMDJWNAek3I2FIHGSz83ngmNDtyGu5f5p/h+pgOdzfTxU VH4ZoVtm4z4aF6TKjsel1zQt1S18J7bVWS8w6QM2QbuysrtUeDZPRzbCmYWrN3MPPVAbF9RIdm0h erg8MrKI/1zemKVJ5c5tPrGqOlINjnVcqdX8FOVZlb9FR2LYoGvp77HBNivFfVztgn+esHYyJdi1 D3rZ8O9gTfSfVqq90fW3LwFer2WvN5GSrLb9rjuxCY5XlSOxAQ4L7dzQLKW9yBxdB3utLNWu3qHn IXm5mfGJVnHiziFetBoCyzAOekGH9VH7+8l+0Nc2Fw91kuPLVizaaueyg0NXMjM2l/C5NfpYPmB+ TbTTESscYm85UhWrxejneYonZsTMhR8oe6XmZqbpOm7mUlBUQ0pL1ZFKr4vsDHOrI7uJsXgacmBr i6CDNbfa+eyjwyu73VZmIqaTHrK1ojX9PTsMqwrtE+iLuBTlyXlyEV7h4jzBU4oPcbG89Pof9wc8 QzN2QVCJvzTzmergehqLvO7vse8PABUzdm0bKOY9RIc5oHku1O3KxQBCaVabgsDP7DyyO6hyRRTY mfnRrhFevv09KD0eMhfZwxoU2FK/hl26AmAzniywPixo2zICEMRqgVXYbTkdq+qoqeFhfcAMHAc/ XZoPuB5qdKuSB6Vk70+QqHs1Nr/yId4VYeudifkP/H1ViwarG34tm4pZOH4aWxlyddtfN373gLBe ReZRxeJnxkGcuUe7HKAd9sWp+mujLuwRjOp+w1sjwIczFwYd2qrMh5vXRN6ZSjiPDyqogKrSQ7qd Xn5ujH8KoAZVu1EJN55/z26YIj5fM4pIn6W43xLnLGjcFvHRmTFI4pyjKr55/yUSV3nMxifYlWVa j1ZFOwRQ8JCzx7rpTBak/76j4wkzKL/tacW+ufq17dW1iBL4Qs9DSMJrBWkvIsjJAQzy2vB5Lmlt RjAXj2AQGOyxGBPvZu40C+ow/iJ3GD7jso7cguXmQj78c4rBqYl6TXFDPQp01rxO6cx3r2WtE9xJ 0KtsaBN1GtCrsSvVBJ7Mjktc994eiv1hkSuRXzyMiMHvdv21SCFhR0djI+nLzE6BJk5wg9E8CnaQ x7ABRIXlFKUx7ja4Ej1vQJzWlsxdkw70skw/u6XFwroOddpHUx5hbSI2rMM++jXsSnShtiVkTVLD NvlfBjlSy0sfhEdlz03uQ4ZuWuzVYM5pF72CrvVu8KjDdtNHitdm1okMfrUw5xkFbITDttjhw4fi YDB5wTr69nN17XbEfy9j0iH0kB0zIxvgWvQ1xgD1WkbMAxhIbW/cw2wy8hH0y7/3ceOQsS4E8ClU hYXoRQwjSjEeheffn17u6O0D89razvnCzBjE6zYsYK+7kcHRD7+m+2KqtVEm0IwDrfHtL3ywUsDx Y4te9G4idMDhT0I4nhxVBS3/LWbuNrzm3aKiCQ9qaVggku1S7JvbSilkDeDn+c5IxwGmmPG8Rhnz sv5SfTP8aLd1kHDRCUp6k41UQFGNn4JfgjRxv2HR47CZZSF7ol/LpnJmsfcgQ6nvBY1P4bVLFm6e emBD0VDXqb5ndJP4ABljvczcJpvKGWYsJEZjpdyQrE3UC9K82lPymC1EFD5oxk30nNhm+cY+EZz2 e4v6LjTMYtitftYufu+9VTXokdj94bBbcmj2bBH45rcE0p1rcZs4HOLle+FFUkrjnTbF+GgKOFUq NUs8+wFGFc9L8wkhffL6KrcIJ8jhY5964I19CyG99c4yVB5PtgMsdnse0EB//X0S81XtVzXoLn/B nAnZ2kkOmK6fGAcr8RijRoM9PZ+Gh5auug16OC/GjO8TIG3SuKAiom/OukgHhTqNhE5QPdSN0l0Q xLtbOpFwX3LsWg2+sczon/53E7CJgSHHKjGiqDOUFCdXK4dRut611NUOcjg2VTowY5Wz2icuaxpZ meZ23MWi2kG0xwGQ1LTaA0sehgQg+Kt0/v3nG8ilGpLwRIxKHMC7ZRaRdFCq836dzoIQ4NtmRGt4 F8X1N6PaT/6rv6NLq+S5g7tID4nmpUwzL+zIW6HOj78VgHSlpIihdiODKlL1vE/g4pHUEZn8s24m 4x4rO2YcdJPQ2PYbvp/7syU26gjrakasnu8YJ7+dFpik7F8f7kEPJbGLZ3JJpIElYDYwXuQx//sy ROnyw4nr8SYlCjUjHn6fAL9no+0gJq5KiafXC6LgFX4V0jdRQOgWd6MgLeK3f4MDsxD+CH7WILnX tQn6HDjol3mlRsZJ2WtL5Igf/2HqD3xfzZB7h4UyeHJmLGJITaG6HQ30WwzOorHvC2UWYuiMXx99 3Y/qJO/z4hO2M4KfXUr8mbkz4Ixub8c/PKQ+LguopecWozyMq8y8hGmFRoYZD6H1pdCWINHPf68e RlbxHIChtrVnEsHx5QbyzhJG4n2YvDOc7v2oS8MQH12tMtwuiyjvT2hvx9SK7chC93feRpnE0aOP /JsZJLtfE9RzURDLQFKD5H7CfFirHvsV0S3oxkYQm3OaECSF1I8rMRdu5NlCUwgK+DqBfGYgeLVl Itmz/kTHgb84Txl+cJEc5gSKvsK3MZI7c8xCvnHJePfGbiDWIIU+QQBVDAVCvNPzkDR9sRDfrmrl UsGhN2XeSsL/bA7k2ZxViK/P80p6yC8Dc/d5bb9q0COyhhRaJdTgYKykMp9Cgfu1LLoSd9qrwABF cd13d6Z98WGKwrMGnBnaUP0rn0P7IjuHn6uk8z4IX9SSuw9meRITk5OsBFT+g2YQpRSVNAPCyE2I GBtvq6IxsYhL3I25i7m8KR/SJrjvbWJ8HlOUcaih/IIZTTcOhRAoZx5W04DXN0jP5Pao4M+si0nx +gnU+fnH8rmxmo7c5S+aD1lrCGPvkjIyNwMRd79LBhf28K5PiIU4SYGr6ETfJkBWc4vQmBX1Q/AX zE0JwHZOwoebEpOeNfv4fhAyURqTLatQHvTF6Cec7QiZgMU2QLwiQdLwWYFzJGnZvjDmYsKqrKIZ 6y1/7ML/l4fVhxISRZhYVXnsCUSVs7Y/Cn8Svv/5Fn7q3r6MzHujh0aw1zgUq7sKkfYM5HkmUstR +QyozxL8/rXTf62mfnNnwcg8Lzymg/Z+wdwfCa9bkZGcGannsclu980gHxr9FRgKICa+58kKhZ0b Z5E5g6rTBBTYhdkY3KIM4X8tp4BsPu+/RA7yIgxHj0PnF83IkfToFVFiDnw6PWpKYUSIZsaC3Mlz 5bqcvPjn9z9HyYPkcuxBPEPJA6KHuoPSqHjAsn6Lcs/H92Nw8KOES49U9y+YSXHUhbLcW0mFzpqy 9Q6LhFRMIr/5+0Osa/LafTOB/19k6/v/Z9n6KY61fkvKjthp0/zxxYwD4ePLIL8xa5D/V0L2zl4z Cd9xiP0vrX/HWmlNJ8sb8FP3r1dqJMPceJpgP4svhaET4Gbf/HjqnTyTB4znj6l3UlGPbKL5btCA i2uByW3eAs/kqYhvTYasHNZeqX53yA4wqiRqXPFsi9auJuA5s4HUQ3AfLumoKmH/yXbk2wg9Wp9j 3HKoLIZ5CboiunVzdFk9Fdn/UMWjXieLmz9RHv1AJoYlKkWKRjxDdrp6hDMdljzQG57Mj2T91kkN w0hvsUKgO3yI0pilYPLUjPkQUITvM6gpYgLlguryaLtIB8NlEbH0Exl3cxUqTxt2/vQd2hc76nQz AbSJyGGS0puAhnIiQ87K4cTyxnZAW3CyRT7DG7xJ36nWNpMg4eIoklwcihxHSnaYsX0hqPMBSlHG fucALUh57hTFI4Hy68R+qMnJXAQBoMz/Vsmi+WtiTkWYSlvAIl7cAq1V8ZajUsfuqbKYjiV5un8Y rOLTRbX/XpjN9aIBgaGv90TuPlPa4LguMr7vmpLlWRrXEmmzefjsLxi5l7kT0OEcVXIDxRpLyJcd utKiYG+xn5gqwrJ902s+n34thh0CU+Oh/QCOM8tHk4hPdCONdskrWtOb0lv0k/z04gtmOcMgoz3f JJMLhvnUi3iQRxiO4aH3NSLgMJTeJkFd1ka9TZF4ikOMcTqx9e6IRKfXqBfIwFy9Vpg6bHRsPUEe NgS85qwO4VDt3SbKr9DXJEKr/GWIF/EaALImLIBxAC8J4jMvHOA8ZBp8EJg6TJBpx0waT29H5wvD OWLGzm93B00vriQgwGA9HKA1nTlEYj3UBB8XSPDOm5YLT3iK+HCxT8xHoNlKkU6zdUFe1SQ/ayz1 GBWgylmvndI3xR9omdakBE01jOERiGg86touXQcOhHoMOFgnS/eozxpE8Knc/wq5TWwA/lafBP8R El//gtaU2e7tW8BrwyKer8gBh+7pg8HmZ83sjYzIj8DnZn5YXXrA1GDGyg/GAcp/j2vXQwJnQv0N z1e7VuyBbUgH7FFT38sMnh/GNrg22BeuA2jeh+gF8hsBKv58t05/xIUVYOqX7XWHrIAqPJwkSvP9 Jcj6DSF46tcnaERPRKzVWRJk2ObhB4O2jLnUnpQlY4cjfjrAOMCs5H50SDpRisnY2dADYT92iHqj 9qKNu+SzSMF2rqAa/XTiO0pRBQ84SIZnXEQDirnMUYqDviYLHnNfjKHow5lHmE6A9gQybCLBRi/T dOEk1glIXnAkVFYjc0Ys3hf8ygfMe/P46XNxCHrLLbklLJrmMVMTr3oiNo+VAPzmgmpfjPqIHcPl OnCsCghVLmJ9AWvA1LWj3stBmcpvQZ/Av0+FhUJcTLlO9qc3oieX2GCLXs3yVjSlCQ== JiGR5WFtmYokhj3ckh5ROskhiXxcRUqqRjqS/Kg9MjNGUFKJAqpAq76M7GVpwaPEcbOVgu/Grl0i 5k8ulL6J+mpSl7Frn0+YmzCexoUw0QC31CI6LlJdZ3mRbgOJpcwIQZQmyK9xvGy6PE3tEVZt7iLr haPrQEG6c6JzMWg1H7gn64V/BGqnh4f/A5BM0efzz0vjjuqoLaHsxiDFOkqEBp3TQUGXevVo244B Eg3mPILMP6D4Y9cWsrnTFzTjww8hMwcGyJscgHIWZhySnUiUnlchcQvirumWc+EqgDdqREeVRmY7 DaUXPa4DdEOE5DlVWEwM3R3rpj2ndK+NeviBOPhCkMBKr5zYcaN10lbt8nhhTIdHvLNuVrsEutUc vrfY9wLUtOHpBGfzyjkheXlcbqVVX+ae2htEsS51H2RV14wCbixpO6ytoLGzfma4xMaHyL7VtQR6 bhe+eaUAalO797Kz5uAewF/sRhFkL22eNi9ttLqDbbsQB4A7bjxeg970BY7dklJsiv1tAFHS6xZs AC05eUcGQHxq+7ISraFoch1wi9iX3ktSAy0QweCVs2hl5hafSJdAkgEb+7qfQhjLkyBCPloQhObX FEYQZjmfxiRa0gkkY9C+EvDY5eT2cdGpgSPBzEj9G0ubXHK9hnPt1IkaWCeqJ/j2Oye2txY4ycgO ZcT8bgXcBaXQDjkOwI0MSZkLFPJJRd/dJwGnciX3wSns4ETlIhltGThS393KzOxzxZGsDxngKQgd /MeQDTWfnmhe3ymJLWR3eYu4K4xFLp3I9ioJTO3BkLLeBxDClZhsA0fpywPdqmMmD5fMTsbDJLdv 1E0IFsN2b+FhPIO34J3CgjcewghBF+/Gh6JK3Ckdx8grj6AN20DHOltxuu+m3GNXW6+xM9aHJ5uA yrsTZuS3KyTkGl90QszoqGv8VP59ynDd0p+VRpJCGFxxE9PidWcOMCGthX2G4MY9Dk8RMV/W1rhm UTQ3jWKlgJwjhthGMpo3lS+NI1MeDsu5L+NAyNsvVjBDLO4+P09gCfrSRcWyl4L2+8DcqX/RItAM 45InI0Tvy6uf2j0z2W+btQSkqJ/6Sd5zaYD+0E11gqecwaNV3zkDb5+I54JQ3IyP4EZqzbPZFi5a pj4MA9m1JU7BHadw2Qm6MhjlFkK1b0I2n0L08LMqVeKYz+gXU4SZS9N3B/iwHQHCViEdsVG4guMm wPhRf2O/xMG3kV8+3NPQnGc1EwnnkQjEjPKqvfuH43bFGxe77DySaYWju0F9n2suUFvlksv2UI4T 44GVX94pV35P8m9GyUFJuqlA//1a0unmava8chjb4QbKbPcppEP59CpPuTxQHg02B3VOLqhR208p 7ZjcrD5fPhwPIjEDnVhscfYZ6IOUshZYKj55sMYSXOSSwQV+GS9AnnkjxMk9D931hZYMMzZW8Nij bcbd6PoILu1mHgKsvr2MfVBxkHRlx3Lg2lS1GM+jjuEmIjaXFmRS+MAVMKP8A99ANcAjkP4qOYBk hNH/btOq3KwzO3eeS/wBCUqbLBxzdEqEcRV5f11/PXWEEPlnRp3CfjTidxrdcnW5n0zZNYdjSHFb bp7vMjLnkaupbnn71wPM3MFKJbZHdPu5fR5v7rzDuzAyO3j3vpsQ45Kbh+D91CsjwCakU8Mzw9I+ QwNQSrxF+S1uLFOJ1zoEEiImFgK5p0lixlgimCd3Mw9XXzAclqU2mxkGuFw0BEeXFGR3zGIM2i91 FzBxGOH3UIcCv27xYnLj49/z22QKypQZ6yevLYyMQOA788+ztUqPdShL3wUyP9mzcPtBZoZz0qkC 48baubIhjm76hXDpexQZYwDHK/BhU+RvhfCuGzvStkYDv1mbd9r6GMAIBbiRkR2e3EUtXB8YlzS7 h9QLjXhPIF70d5pREkFsYzg7sk5fPq0tdOj1qvPSLnqU/5u9d4Gy9SoLBLm5hDwrPC4BkhCoPG4S IFXZz/+RgJDckIBUHibABBEulbp1k+rU41K3KuFiq72mZy07M2P3YmaCurR9YhtHxWl17DXa0m0j Ok4vFgo2AkK7UEdbgyMJEYghZPb32nv/5/zn1n/uo+qcyjm5Sc79zv73v5/f+1FXRF+Z/Aq7U6f4 ZRcz9EDZQiNBRRkwicyJX6rrGDnqpOYFtjWGR2BifUCrZAOSFQyaRjqZlUiUvBg2OsxDLcM6KmMS eq4pWWN8l1RezA6GZMTD0oc+8gWaK9Ep8cTHsBEpUYghkMzySb0tAFfSVKdyiJyTKQmGCHSCXpHC SAe+qKVfqXmmIiKJsTdYODEuLBrOqANN4WORSkrxBOciPZOSjjrWWHKxIgu0tOIh0uhW+G5Hycxm qMyijRiSlOdYELGImqYqVniLJVnQkSeW2BMrnEuVC10+27xwH2f+9y5V7MSKF7Vsr9RUCW3riCI4 DBtaoqqU+hU/eSqZIaIlpxfBWiAcyOLEaww7sOIDJLoAClqIV9SlsiFeBmt8Ic+XlINdZiAdCIvq pIYndlDLu4yK1fyk8p+jgDHpoIihf3EVi2ixcxh3x3VW4gR8rMAJBWVjiCDxgNjUO9szgSIqXF3K X411WuLNxcs6x2AxUMZLipONmqKi5KIj4AkhEklU3uPrajHHojOG9IsBtRWZnLxsrthdY+2Xgtye EIiBvQcGPw6p4WM+mlhpMEnxsRoBlrUpxdJQGKmA49lkBxJoXO0wZrlekhMor5ToRPEObYt4NuN5 C28ykbEUSyT2mxSLcjTK6JIT9XpYFTGmEohEkUZQRsnWVNJWyRRsxViuzJBBqhWmSgl7QlStpQM5 g7qQ+ouY/D2hh+M+XXvREHEEANWPlJbZDkBdR0HSzHBDYUbFO+hi+TGVsr450uVTB1W0ejoxXWCv VUQkgqUrsmLwCprUgeR7cZJzBUtDlioiEsswV4mwnooXqiryQC7WHgNgut22khl4Kwy3ibXSFKfD TbzpDFVs0sKWlD7CKjltRsRMLE0ZHezQrWuOwTFcW0vFKA5IgEmRAQ0rRiUloY5dipuFE/8zANZ8 qjnFIYKcYJYYDhjwSuwO/xYVa07yQmBJKyfHAbdNXlzXwnhIlbvsxazpAlBiBIqEvfLHuXYt1N2M +yvlSGFMRo5zKlsHYCeovuCQUIAmJr1Ipb6KFGrq46yK+K5UHQ4Leor3IpfuRmAs4sy4B+p/aeFm fZXWE5LxS7eRXGoOCaC7I0XQwD1E6IKTOnA6um47ytMs/UqKLqArwjhBnVAjKjChovCyeKLlSkG/ kdxp0dQD2BZye5zUstREqGm+XE5P61gr1ZHji3QgSTNcKlmpKXIoUjyCVRHTRWMFdhsFgJgjGcFR MmGVPL3L9rB5OgXnOYkSm6ECcZFPY7cDLH9aSXwxJRaghpY3ssyfl9rKjtAhAZ0V2iIlurWJXlV0 f+X5dOjYQoed1sIlctgjAH1ECtkBBydAOTKsnOTyq5UgK64FmmJ7XFbZWJtcZC+kjhsUdi2ibFsU As697IR3g54rcbSO4wVHGdE9xaTh2LYUPbkhjRAW/4tOeuxjgVX+bHSlS0cc3O1E8yBVd7WNhZhc rHynLSH1uI30vIsKoWzHXMbjYPk5AopSrXFkkp7cSY51ABY+Jm0Q5OGiLcyltFXYNm5ZrNTqorXZ pXq17AbOe+5M1kHEVIrrBvtYsDK7447MA1WULKQDVMEyTiemEnpNKt4qDctFxYOzRRpB4ZpqAmyr U0VnLn3sKDw6AakDn2lSpZIdFJaMTtJSQzLAtI8G93gKfCzsHq0KuFxWdPLsbYpv8i5Svio+73R8 nnL7ITDF6gqmBbY+Mg6xBK720QPIUdgrA50QMUFoABM0G0152K0WQosa+TkGc0pn2FrJ2Q7gOuZG wFwo3AWbkD2boKFkp5jX2K2e3pZSQTgMtYuVQNl1OzsyPoZkRT5Fe4nrRD4nnsNiVhZGyLjG4mc5 68JvjxEXsfQYgo0wheKur2MZJxyTjrOqo7wjiSiwbdQpRORdxPwrlgL9CIgZQukeiOMkgEWv48RR FYCVicEkcg+K7MZEHxUsxxqFRpdqtIqGnmk+ASWPkiOqJx0UWuJIYuVoUCHFRaykcLSkbHTE9crz HLGTY/oys584KrcOU+W74SgSWZ5XdUp2V0hb8aZ0ZHVnYDQxRJMILoxX0cRQ+7haYgFiZhtgVYzT SqioiOXOow8zjqoSxSbLK1Bj28q+GklRTKW3YxKfVFE382KQ+q4lJbLoxURlzFlppRYArnb0F2O3 FdiWxEWhXwJ1EHbLRwM+y2YA1CJeiwyhyywPbVZ+HCpjxaxR5P8LwDqaB+MxhvgtWddE0eqMVMea wHWutqfktABMlCdqQQEspkgn7rcANDqSuUpLB0kv5qNeDDqoRC/GNilsa2MUmKxLTemhCah0GkEy 53odR1BEF5mIzutMEx7rjOEIvPBhupB3icoxOgUgUIuhP1YPxdrjiXax5gPaqqj5YPxiVCwnblPI GtUpF28xTtCLddLj4WR6YHR00bEpZxKAnZVDwHmBsHR5FQ2LfBENxJiIs0RURgM4GaQ9UQNjpMyM t/EiG0OuLnTjhKAadBCOjoikdjAmRmNHL0JsGS+MjRy6yflIRFBSOj1xVhz2ifXUq+gazloeY2O+ ekuk4wB34EtJNRsDOLB19AdSlRRfTz7MbKRGYCETS4oeAEf3Ka5QidXXY8xumEyq8y5u4JgVRDqo o7dvYbgDl2XTYU98rDBeiqst+pFTBy7GPfFopfJ5ckKzlPEOiqcrEzPGGoE5FznpiBABbCWoDNVK cwxORxGlvQiOzskcDQRALm8oHt4ErEtJe187UbZAEXorSxbDlgGsvUQpcWFTAPoYFVYU0q3TEr6R FNLQbfSgYs9cWJqkW2NvWwByqVFxZJYOBFkbyU6QL2OMysChupi0WJUmdiA+MkYSPeMICkklXLAF AkbgJeAOhWPZX3G+NKKwgQG4mA3eWCPAQsIUnET84fMxriQGIzIPSUDHM3DR9m4yNZJxUlfex1zX eBi1OJNLXXvjoiSfReYh2As4e1mKH+PAFLwMSrY7GwHwFPIy9q0AoMSaGYqbYKTCW6Dj0bJ5el+W Co2VIm547ZS83msJyojeq9g2xguyowECC7m3nIoCsZSVdLVo/41I0ViJamMibDDPrQQESJQpzE9i CGOKQULA0m/MCwtgw469JiHFHBhPtyYdKgEj1xTAQodNwnQquuk3gKaWE6cj1wPgUq5idm1V9GrV SQrlsiR8DJjFgoobgjhisn9gW7J1cFbYMUmIpiUNKwBThmA0gwo/6GsJnGInH5Q/tNTxwJQ7MySD xtSg0f8JBU4v+A9tXXNRYpXbGPt1VBGIL0Mm8kpohhXnTWwbb57Y2LTLVpepECgYmBBrCokRvYWo y000x2kbbTbgEMFAk9XUiWXNUNPD3kBcJEU0MogcEOxqUaxJsgzNbhio2fN1voaiWA== M/Fl7B6CqkElgWocnY66RS94MkYwkIY0Vk4hb1sAYn0zApJvMeptY46T6PyEml8tmWtEgwVKbI5I 05LlDdXlxstquUI6SDk9dDKOQGEgyRKMIZkznAHN8ggSpgYjIbOvmph10re76HeiKfxkhiylXjI6 cUpmsL9Ktggdk3tDU0njp4mFEGuvyKJa/CzRMEwFPXARYreukEr1SYWmYmlqmIWYBFVeiIlZPbBX q4L3xiUDiYreS6BWLQtum+ozkUkSrfOc0l4ntE7OBJKhxUqetDoyelqyTJCDgqThRl8E8VuQEBtN 9ss5Bhec9hPmS461NRduo8GKS1DKFamzWuR1Kr6hY+bFuszujRRrBo8OjlbTWdrDADalnDAJKKqL qM5VyZ/BEwNBY43+nwAuK0m4JA4VAX0ZGYEuuFdPOnMEYgYv6YArzQKYfRTRAUcOqBTZqF0UDrQk amOwkiXXXJUkcwBqdhDTqVsfc9vZmBdYkx56YK/g4yXbmAoh1CZGqKes27XJKEs8HuAaJ4XCUvrZ OtpwtTAI4CpqCpkBF/OoQKUgFyGGOlcpYkSTk0ZMT2qlslslbq0+6o11jOODvCGu4A6iKyP4JltB UzHRbMpzoKUQNPg2K8kvl+U0cZE6pwTf4MhdyimSNPWVjZl2dVbGG8B1PLLiRWyjdx97FDKwlLIG qepH5o2uKaxhBn3cRZObziamIC7iXZaAKnC99zICFOMJaGICfskOB8C4hT56wUG/rOTWJIbPUGZU H3OUccQIxBnYiKIkoUGlSTnP0Bi+4F08xrKxOtpwuQQddaBi7KlOIStYraaS5XKS9jsbVfTULYvs 2kvp8zLGJOsY0gBxS4UcIh/zGWA4k4ClNgQAjZQ/kxDTLB5KJ0UFJkQ3kqlQElgFoIQLmphXLgDT HqQwVwi+8lIpLEb4FNH9V6eonYLcSBibyiaUPi97xPn7fV7OhV2+Sx9TlmSJvADKFgWdZS4rk/FA U0aWGQzBExFIx6iM0kZv+uzWQ9RmJO1SUbLI6wUh9zaDkdKpeEpWcMLEcCiVV/sRX0IVfSR9CmpW FOqBHfhYBxaJJefFAM/HiOG42gOkQiilrEHKkOV9zMGsY+5XAKZzyA6t2FIyukXemapySTlH9kdF M4KcLXHcRyNATOgWwy98rHYKhI4zTaKgGzPNseM+nGkr6SeTuzgcNCW1JyXMAICVlBBiNgo7qCI2 jcQL9p6FeUXqiDkBO0k1WNfWRLBRsZKDi4lEJN0SJA4ykrNEDAhqNqsUXNENQLAwMpBgmFOl6RgO 5VhFQ6+KwRZYM1UOcyzHq6NqSok+lhJYxg6kLDukArXCdEkEtC2hK14bKcueZVdiHEEd+KzeEYvo LTmI3hkziZlMe2BTJjFMQ0rtKdkO6nucBKO7moX/Iqs0kjxmAFxokfPJIR9fVglS4hvdMgJOoabB JSQ6SAMSXRFwSsmbtNDCoVhJaIpAL/4xKhlb61hhxyVtQ9LhJocuABbiVaiSq0aKXXdRE6XRLUWc x2vRFvfMQKZWRTnCUarFFQGXYpGRQegq85PgEhRoCzDiexBr/7T0ywnj0CYTHZhANbnC4DL69XII JQJjCYIovoGxyBQCjMamIjJ2TiKxyK4jHhTi8NY/ggNxaCKWsYOKDE3YmOgPCZqA6Nhry1qG66Lb XgzJY+OU2BrEkhkre6PPiAys5/0yMJuZMDBUZkXAWgZWireDSD+Zec9Gd0bHSVy5aTRmRucMDvio yMknOmf0vF7GlfutgFp/RaAxvJOjhxGoIlCsMDra51xm79BYu0faFjb63vjoVyBif4r5d1S940Dr uCSJnsuKasTE6gGalRCppIY9gGOqBVQTzLX2MRdz3UuiL0tTlVz3gtxTQGdpMne0mEHBRN1lHhVb cipQvvlaEuOn+NXI0vSNQFJT+izADpnzFQHXMZdEJSUJAFyJ+g7VPnPtncydivx//oTz/wnahGJi OB9dZU7pCJ5rgAMHBWZuyfFXtkGyRyXhXxDOwJUWELCBsGdw6a+AcIZhAvoGuan/C6UBRBs+Ugjj smT3aBdGnGkyBxHIEYAo3sTYElREUgFn41ImXARTwTbjhLnIzPXGS6Ay2uApBBEybSZFJDAXyOqb KnmIFJIW3UiReXReIlOtgXCMInlKlVQuxZTCT6JykhzewHJDDEfLEixAMQAs+4oLpnE58YuG8FZY 1goqSxbwBXIrYrbFMIsgcMTsitojNVOYnzplNCUhWjnKdUBAVm+guz8rxEv6O2cRpWZcaQ7UcGzj NdFdGoCUIwOBxDSD83xEOZBz0aN6SPnoxx2A7IsKIQgpj2lz8Fgc4aSOGZgGKSUpHHZwvl9hTT6n /kN7Ob4ceFjEEUCgialEfTt51usqyfQArqhsNBxNFXX+XEsaHVwsw1iJBf5Mrk72BXbfgNPCgQBg CSa7ucZSzdHqQg7U4DOpYgdWwt0A+TPhBHsSuU+ActlGoyAzleIKKTYiPrzwskqJjagVyDsFvcJi LAzuwIsHNZBQ8FV81xSB2Z4NTnhUnAmNTER6wQVODLFQ/wSvBDiFGXEnBpMSOf9pL/lnyGiLUias t2a7CRjlUAGN/kDi8gSjJXOnTpcS1qtGdA74gck8XsWajwHW/5AOFCXuh4OQbNSIIxHIQXu0YwW3 tCJjtRxE5vrAb55+cKAwkDTB4OROornTKYKmAvUJAyWnKbi4kx7Dsb+w6Oe51rPTKVynlsLcLtaH IRdwZK6cSVmaUMFPa+ZijkAAOkrd4WIOBBhBXeNOuIw+oz+9qbiDSjvxvc868LVMQSvFwKiVxfAD rggQY6YRaFAR4iyFvcxQpAPFJjmb6gxQ/ILhgYktFl9GJVwcee3xLhAv4Rz5kUkH7AUIYEpZSTuG zCUAixiUgE6lBAQuYUFGQPoN56VQEMVaUJENOM4Mwj1CUEzAj2EdVNnVeYlKxAgOcpSGPgsXgVy4 w6ESQZ5XjhbLc9FFDE2qCn475tQjIJuOXE8UU+VK3gAdh8plYV1MotZyiomWBYwFmeiwsmlA2hkS R0ytId90/xfE3aDA59wcDpn4FQYG6hAPoJM4U8YPLlWohohUyonvWEV6gDtg7bPTMecIRH+SxRsS 9poYEKkoKNkpuuhirUCleUDLyelJOWEmrKa0kLyohWKuIQY742ElwwSgMPbTAK98ynoNhmorrtQF 5UxB0TlZSjnMJJAhtpagJzSzPVqqj6NjLRWKMTqlFEZPaKqTYGL9XXLFJg7FSGQ7Om2TsRes3JqO NHipE2YyJjltg2OG4j45lwyZPtGma9gsLR0AFuxry2o47LXwg99vIzNnoh0NFoXiF2D4JnJdbPsF YHKejJZiIbm8KKThBe8BZWQBg7AKG0DuB2kHAsUrCBy9/+GMIp8EZEFYPCeWOGOjLhUtxRUKDJRq 3jAWZqWpqZOHvSLEGY6VTUV2KI4FV9BGBzUd85lamwfHGDJUWwhgNoyUSlkXUE+xFAkRcOTuZAtJ 0IP4gzw6bZWtIDJ9iOxAE8ZxJcrKfbO1ZIpHu6uh6lOK9jraQguhblJbsoaKNHQzU4ogCKHm2is+ T65QSrw6ZJfm/E11IbovQBiStiImEncuN4ZCIGLBmF2U94BcnNALrFDagoaIKXVBfiiAF7WCu2xi 0gtOgN78P2G1JIuB9gQST5CIVktiMdgzRYljTawxo1KiQ1NTYZoAZC88USl6ckcCAzYnY3VaJqR0 7NWVkv8AA6Ml64grpOy9SiUOQ1tFVgOMpuQ04TXtGdx4YAKo6jGoXckUAFFrXDAeHBAVMicQIEn2 P4wIcPw4OjeQErmUyy5uCARkg69OOYkLHVlH1piQKQDYHy1comTsBBUzbj94DHPqLCiAUaKgAeJi rEToK/HCB98ZG9MqsxugUdHMhJ5ZjvlJdL+QJeC8KSAXsNIdVssZ7gBdCFi77gjdYcA4b0FN9d8J tbEh3EFXjpuinEnabi7HBo6pMS4/3DzWQxquZ0xKcM6Lhkn1TdR20zE0XG2JRqDFud+qVEBJySZY TS5rBORoK6uTeyQosVk3D2iM80ZZIw6aIAqQ7g3OMZc7N5wdEtcQSCWl4jacMgyABelbEI/WnFLH xOgK9E0Tiy8gddpcEx3w4NaxCgncri3l5O2/inS3LTIwCh9GnsXQPZ5GZw285H1f6HJDvlEyd0Me ABATSJ9Uy26Dv0elJG1sQUp58OGQgvUlp/7RdZ2lUyxqjhvU4IMRk6OiGjLASvH0xrKOWBdQAy5L 5eItM9gAlm0tLWNxjdiUFXCOnNjwTTFlSSn5mwEa7Z+asAeN1Umt+Z4FSGUlOZ7dcoITKdjF8aNW xcpwBZl+6WhyghJXSsyuKQlP0ZVVYnwzNen46HYy0jJptGglo+PmZWQELigBJlwOLhyMYVtIysCn ltIEgfGOnM6wEIwkE/HRbQBcYg2dTF8I2TQpwQm0JAxvuDIt4YzWtqWkqzYpibYHLRbKCOjwrFIi dE5jLfeIehUtlo4FsnwpMiVgBwnyxIzdpfCjHBAKiZ15uUAOltzeTs4x8JuizgAwp3nRJnrPYMJu Evp1rFIEGceZxsA55iUotHDUCoyxWpLJs3QOshGngfWFVC5WVZYQ2JeipsGkAVWsG0QICvIY0PH0 lUQQqywWBJebHFGBpJZFRPxEOZSWEGjM3V/KTc4qLlQSr6w4yHomzy+uTPRKgtzeZJcF3zHJho/J uRU/L14uRayyBZ2ygnwQgmhFJm1op+2GDrrMrbe+HUEAT024pIq1b0uJFsQ+VawrT8H/yHxk7g2O VAjKRo+aUpO9C4FCuNBjAG8BZLgQBQ26N5DiRzIkcK+0rCBecAnF0lFWC9AE6Yge2S4OsSNcpgGs DrbiK0R2KMxcXQodislCYKGzO0zJQjADOeWeAjGPFBWwp5w7CL2creEbUFBt71x4gA44xsrEhCuY lpzyFKFXfByBl1R0oG6VzOYcFpRoPPE+JXF/hivJUwdKYlZNLZFPWA6BPAusEj+pQksci1WkS15g LFSQMdrUsRwMvIuWEGQSLqXioZouOmdYrmzcw3xZR4FVfK+YyYAqTUZ8Kzitha2SXRURNDlo2kpC QxCTU9Y8W6U6FU6SetsqBeUpH0O1bZH8EpSUU7A+JqJzlVi6gOsG7muBOWghZj4m8QL5hMKZbMw5 ACxZFalh4uFR6nBGwDZ2oIy0ZT+lfnLKrAtoUMpMGgFjPtoJQAwRfqb3CzEv/SyhFJfsZx/bGc12 prSdgW1jdQdyxa0MdD+rPYgtb2Xh25j9AYJBuxDRKm60iyatYky7wDNAOGqTo9oErnbZrF2MGyDw tQqHteTtkxxbNABORwhEh3Q2WIgYeX1A+nV0gPORRwDCyTKERCATUEoKDSCxreS4lXAPIPJt/EAr 4zCAyWhjSFpZlwFcTitD1Mo6DWCzWlmyNuZtAKPXzhS2so8DWM1WtvSkmd1WFnoAuw== 3caZt7LwA9j9VtGgTYgYIHC0CydtUkwLhh6IzVvx/gAagRIeg6XQBpZ1Rs8oa2LG2AESers03yr3 t+gIkMiga2MUi4GEmprMsaVow3q/EInpJ90rwj73k/kBDEEb89DOaLSyJO3sSyunM4AlamWfWlmt VqZsAAPXyuy1soUDWMhWdrONMR3AxLbyu62McQsD3cpot7LkA9j3Vla/VSgYIEC0yRqtQkm7/FJy 4UJUkKjojZ6e52B8jB1ASwu8CG3R2EEV7ewwLK7sjm0tq18dp2WtYikRyP/Y9HFHL2DwnuB3GZHV 0BCgpHRBYBYq4jswjQXuP5RfoOch7QZX8IEqFsQigDmcS+6BLzqlAIQdrKKPu5fwIuCSqlJqY1SU FMNYyTaGlUTIJcAU5IUWRTB6mSmlnHJpxHsEnTu46AhMy0nDMh2BwCfLdeWMx1BNhu6gNVEjD2eI Mh4DanXiR114YVStj2eosKI5dCry5IWWWHrn8rKHtXgDQn1xcQUvxBcMKnRy/MYgCaJV2miVS1pk GECtBhh4cO/RYYVKjV8I24KnT/yXfagUJ54Gb60KLC7iZUjEQFclrLnkliIPTAAGVB/dF7ESIQJL n1wH8GYGcD1bi32YOGBdx2TOYAaiJO6kldRsoFPR7AaZWx1nsi25YntsO0O2WMqOolhpK8ad0Ak7 B8VMvJxnARKGiueDkuz2lKmSHrZiiZXEbgSslWNPjVj/AspmFT7DrniRKid1rMEBjCt7UASKo7Ml 3GdZi7+t4xh2uom1ZG9yXqxjcJHwpgRgGfEDBkqQj0ad5S4vOewZwXkZKcrIBIXhmcSDMqci94Iy RQoiKqfg0jACyWxfWrmewFlYrs9iJQWt05QgW9Q5JdUWsS7W0Ctjkk6rxMkZg4so8ybQuMqnqCfe WePJE4jaIsJGauJ1KfUvvK3YMUZXWgqOgGOVY4oSVlOS/nOlZRBjuIIQpE8nV2gQTYzg01oCnODA lU4i3yhXPGJ5HaP0CmBfAtBFKzvaErUtCBqPUc3p36kp+TYDaq80P5+ys4CbCSYExQ443SG6WQCG 0ZUnAbr1GjMuIMc+4CjhG+CCuoB6EshoFeAV1/IlGiJ6UKT43Lag0wGItw1Ht6LzNrw/gEQMICet hKeVSLUStFbS104mW0lqK+0dQKZbSfpA4t/KKKCLFIM5mM6DebcUoI+cRkUnqE45m3FgeGHAbBMr zhQcptgAlqx6ikBcAiiH4cTuI21rDj/Gq8FORXhfPJmNfBbxBCgW6wtrzCXPd8NxPTkEchTSgLvV eg3b7mv71W5FA+0IYwByGYCIWlFWG3prRYXtSHMAgm1Fxq1oux3FQxFG8ldxyaIH7D7delfEYUF5 ShLFIUTKRm1CKdkqnZdssCBbcISNY+dkqVLKnBXojBhDYEnVqpDRetGHtHFW7VxYG7/WxtshMgT0 51jg1Oh9QTxRYFRK2/IlupljxAtyOJjYUtzMKRU5Mj6VJm+fSkQILB3kJbKH7SJQjEfFkvNhRBhQ qivwfPMxlAjzCQAiL+tSEk+V3rrMpV46IBUyMmmaK3Fg6iky1MJ4S07Ao/i0IdDWEgxVM+9WJPUA gGm3YWClczF7FoqMulYp/SdIdMS9gXdUlgqkxMIpAC5czOJG+UwAWBdOsq2R1gJ5QtheZP8wR6Rl AQ0D/YjT5KAecB+slXgicmVmyHSrrXhtWlFm6JRBBzyRDAZUwpXlvD4KcgQZ8eQCrowYUC2xssYm 2l2RCE7AqhagpoJYQM+03E5IM6AtS/OS6AW0kSTOWpMQHMiN5DXlqBLOAUGxpNoFXygpm+Qk8TcU pE+R4CwPS3yFSINS7tjHOoWl+J1iaJ+XsNpWFrKV3WxlTNuZ2FaGt501bmejW1nuNuZ8ABvfwvC3 CgYDRYg+caNVMBkoxLQKPP2C0QARirKy8j2W1OuawyIQGLOX9mEoQngJ2bVFgQhr2PuFPWf7TiX5 lA84wX1nfeC9aLlDrbdt4M1svcWt970dN7TikXaMMwA7tWKyVpw3AD/W7LwJ/WYJFilLphY2iFEx KjCRe/JVIh2Y7gC5H4nzgNHCJEnVZGJWWC4iEeaV8t5gDASuF9htqoiMQ88czSN+9TCvyrDVCLXG MgVFrDF62NeSpJLjfsFooZxQNOafwMffxdSXNRNFAHMFHS07ikAuUIbJIJEBRKAuUuLIMG7cxlpy 4Jp4OlWdoiliAI7i8jTyvEgHKiWxrUXdCr60khOpksqXlMs8i/Ii/QuCC1kujnLWWqpFIVfAj9ex OghwkzQtYDYlkLOirB0ElAhTiPYl2cTkmflBC0wRLRBsWskessM5OB7HxLqc6AOzaakUOWtpASGK jItzaC+rqkvxksOUy6QvDUNJ2ZfAN5wkOV2JryxiLbKkyMkhIOfF1VVKGkB5vCT4pSrFC7sqtHjZ KXmcM1TqOl8AI6oycPMzElxi2Pwba/phuEFJftElZsU9wOhZCKwmf0ESzznq18aSZVgTiFhPCzg7 lpCCGrIY7QYUmqvNJrTndCywWXOIF/KuGIMhFIZrToKZRLIDwTV2HF8jxjRoaSw7EKtY8qyIz/uY PyUgCqa6gUXAMBcCGqpVC2bcVAQKijyjSdZVMXEFCG+ULAbovjfiF11VNICSMm3JCDiLjitpLwlY OpptKXnaAcjJwuBVPkVSoC8nQmPep5hv2FXR6AJz1cT5QOmN2IGnU0ptJW0TZJvkN7GRFJIrsWM4 pFMuUyEzds0AYUWqWEF0hBcmS+qQWUnOCVa5VCPQZjKUJC+B6moO+RYwhVfWHG8EnuzmtAImVkJj U5KrSHQjIFd5dXWW26d2zKZAegnJAwGjLSRLFmcYAPFYinbqlCEci+zFJGqS5qOGPIKSnq5kr2+o 0cfZPDC8Y4Ef12RMxHRrOhbu4yyFmgRGAkrhIZMZ1fH9kgdUs40HRPmY0ZDz1GMmqUrSZWaZt3Qs QJ4y60DFT0XZHxQ6yZF8X1CBHcdGLWKUwaYt+S4kCLxCJ7tYI49M9YM47TauvJV/b+P1T0Gcd3ly cd4kHqywbZnJPUPnmlDQeEE+lhTT3Q+JT0qQd+Wxgg98IX60xMjjNEyJO0YJHnEckHmJO/bW9sTf QVMjURoxmWoBGjh+Hp1pDnAHgTnmthjUMif9VhJsJ4QaFDRWYvWkOoLhZ6PyCpqJPacxpvSsFFXp mxPndsBgKiLpmqy+Kwz2yrsMPNcHRjWggEuqogTmGg6tM6BpRDu41lIovOV1Mg4l+Tk152ZbYTCW GqD2nDKzvy2rEKrKZkMTBlUODLNMoprgArTShYDR/yuNeYvWXNZB61gCDdrqyLjVMdkLKpjTIY16 k0LAmHaQZ2cNK3Ul6B+czRx64egs2xKAmclobpOSnKLQLxuYkIPHND0yBmIzme7Ky4QlDbjaZv0y kLjybNkbQF8UqYOyLoRTlHDkfDOZy2rMID3fv8XLIEjyNdX4T7isID7ahGKaK60pZnqlbwcbx0Ap W/ed575O5lCM7YA+GihvhiLhKFM5cAtg9l9hsCnQowfoqpQsAM9oFBrAQ03C9pT4/oBOpIhSi5J0 n66WctyYSNVZITWiyNOUoZ2AVVbNKIFFQgEgnZHQK7vTYNkhyuHsaqpPKB2UdNB99HejskOSrCyO wGQp0LIR5G2Ru5FksuwpLq8jUVn5Uve8zErRgubAYluZhFQT8sZza8xi1vu6wPqLAKolxzbwQhzt 3b+VCzE/Di8loDfgcWSPS4PzA7RJaisqblayYwpn9sJMs6bgMCElLCWKEEbEikIVUh2NM81ivuq6 bJ4cyC5gUl5d9sRiqNSr4jIFhkPhBVxriVlNBd/gAlDQJsTX1oL60pkwhjL09bfWtpJoYK63ACSB yvG2rNmBbhccQ0MLdqvF2EFZbHGR4/4IyNGFzTfjEiMw5iTMdtfopLRo28LGq1Kmckgt7MUhsTRe aq9xokCT5aJOUzBZlYHsZSZKfFqLbIzpJHQscOYllDiVX4AOSgkRztq2rH7fIh7oiuB6x4+qv7gF uuSobxahqKKdzc9PcwV7FiCBcVpSKY+zTQwGZwcWc0HbFrBsb+PA9k0FMX0PEsfSlz5KQUbSWoAE W5ZN1AFVLj0F89ZkCmYgVTkSzH6AO/CFqzPcPkO2dut68B8onJTVvahOYXYXQXW+igkoqqhF17HS Z20Eq2YjSG15CnPSr9PcOhYARe0Tj9Y4gYHYww1d36iS5gXzRFhew5gxum9hGaWCLZRyGIByCTiY FQa7khRIFaX8mGtuBKjClNSPw/qqjg2mUs9EFZh2iIFSXBQV5JwaJ5VZa/TbeB1vGxrUrI/gIPP5 np7jusPQZH/CEH02WnkZx9w3J5GDcWj9Y8CXzTVPKmaEKnTcT++qqg+cBlfGVEqNLmxppPxtz35w KCSKWBWrYzDOnZxgo9c3WHQprQi0La1hHY0EeYLzGJV9Fr/+A1PNtkV0bQDvM+1cXwcyAm4pHUjb IiqPGr1ygnFfkLt/akjPQ5bIDDjHnXISCFeIZy1m+3PcVBxjMRuiZjt1ijzwTvTSAiagt5JBRbOl PGvpMn9nqk3I+V4qzhaK1WNE3oyeeiZymBBlrJLPOONjx7WBJY1p7WpOVyDmOMwMi6cGchh4JTFE HAIEOUvqSrzpkXiIu6EuJLSIL2DWK6BF8gOWltgBIADr+WWmqjR3wIE18rIZdGavqFq6s5m/IujN mBu0kloy0xeIzN0E+lQfFMBcjw8cA6h8EgDrqFGRYwSbzztWprRIAGbfH8eZ3+YYzCKO4zpfBGRB WO4Nt6xr7qD2mZs+i9dhPbg+GawC8sykXOSkEaLlQyD6aVEHCRxpEgBLJhKSBhuWm8pGCDmRrbFa 9H2iHXYxGXqiMk0gSiXSgTdFU1jJN7yW+o0AZOwMMkGlZALwWMXCCmdqwoS6FNcBQIm/MLHCqKY4 pAN8vkU3yany5/g2SBJWRU7VAma+ERMHVzqC2V1eOuEXKtF6il82VtuRRM6xLHbegYr6XCyLpXka nIAFIz5IMJUJy/VPbVFom5tqtE58BGAQKaaQLU8q25mvb4auaknNlOMlpO0zEt1S954vX0hNOAEL tiybp7G3CxatWqiI8AFK4owaohUEFpNpIeO1G0DcvyawIVoFLrGoXZMtBeuKKkzGDJJtpa4lpAhb ismlcsKrYr9z3G/4SWfj7euXhQCwgnI6nlwMUZwwBcEcfVPXUqpMmhJQYg7z1Oo1MGQSisjFLzEZ DQePpBpI2VBzJryxMpRtVinJX4xZLCgXn9LRfaKxsFikg9M01Zz7SWkpbSQSU+vWMksBanjeMkvx fSusXC9ZvrKS1Ag17jwzRyp1AjL/CWkz4UaJdt5wpiIv/BkAueKswfzxAiNGF0uT6aTd5+w9kBpQ s4kJ9pZmUURnsBoEMQpfKSlSRewLrAAOYInJrWOF3yzgq/YxuM1ngTlguTEx9Qh45w== zjG4IOUgOPsxl4rmGGIAINGo2PRslDEh49h063KnfWA9suUagCsMxtI9CTzHYFaPQ4CWGLAM5TJB YGFiFQ70DgAY5qmTxdF07qwWdxjwoEC0ZnWke433YG2uAz2Dxcf7x6R4BeIxyt8jI1KpQHo+IkUp Reaax8CqGElVK5FuILxKiniAd4Vnb5RYdhfKiHDYlwkkkEo6gkWIuReIueJIOPCmqym4qc7ddgM5 J7Om5RJaZDti2mJjJjUAYsUAChCLwSUZ2KR621i1hE6dTRma0hhszA8GQE8qNgjnExssPE8ytnW5 My9rXq2LVuQAZMdji0kDyUvLk2cKJe1iPhjrqyBPZYsYpZmNqcwqc5TCJlkuoUOLzdw5NyVYRZWI A6ySmkawXVwDD2JbvJZM0JXUPLElMRwzbFNDydCWMcyzVlL+EgZg4rVPB4bBdI7ikbGAJJycIw6N BiALCBmwoGT8PfhMwHI+NVUwypaxViLpNYGMpiDRUYydy8YLQo7tG24Ra89kPaSEAtkyeHpG3AgL Ilg2+qVnnXpJAZ6PFQ+HPO214ZZRDM47AHlIRffvSoIto+NCmpXLTbYJxziy+coi1loCU9ETURAK emNTaCYHiWddYBrRHixlifnqxVJc/1e6Ff9ES1pzAoM3Tcn3EdNPCVh7J7dXPM5BY205GCJ6cPRh cEHtkcIhS6p8JLE8a6zBGE+qzmozSKw2bAhXCVeS9BjdJwspvoHM8MJU4xJm1Zgqdj6oqEaREiBL VmBBt7qKmEVyfhtKpdvAAhA0rQgRV1ggmZPgJw/zAC6cFDowVHExw8+QBZ8FvnTQvMuQQzrUuTk6 UX9Jrh+PCREUZMJVuplMenzMlAxAFpwxPTsfqb796aYdzy8kH/2VPjAqemT4glgGgrGTufa+T9Qq htWhIrFHZeBKH1hK3VQQoCFcQAxctVIgxWqynx3o70BqWTnhPjM2onIxk0nOhVSQejNjI3r71CrG YvRMgG9WWVP65sQGrTCYa6RASlUpHlPW4g7G0BmM/ymYtqU1KIFloEB7neKUSzIKIXGPOdNiifLM LbYEXzpZgRR8U0ZHIGuiWgB8sKkcWDYmKzpI6BREdbzWpY2I3sZrXTpxBRM8S2+iiGRMMwv+LtQB 5B/QVe9BAzApla2TcujkBF4yopYEIxC6Quys9CsrEw5HmYGlXxbr8/GWYurLxwtRiYXOWlK/lWT5 a1CFshJjWMY3QUUvJVRB+KbsGJhkzAUw2+sh44E2dTweLD9DfgAqw4xdFLJp4mXVf+pSTQhWyNia RDepCcFVDm0dy9sVGBtY9wC9qIRsJVIatfVUnU3A3AEl5BYGioCcdtmWyesWwLaqTcaDUfkJ0GTQ SatE/C3g9AnvgmrsGUwVYrXwdSlfIqSs4dtTkNM6AWU3y4jnC0XVdBFYxAp3PiYktdF3GYGm5Gyw EvVcYHAKKjIUlSOkEUAWRckGK7lhICMD8bvgdin5ebRkp4GEFbpMCeR4Co6rhs4xmFGAU5TFhFeB DoOLRY8wNwurXbiDA7y0op3UMXdTAHJxMcyhbhgmaW411ZqU58mvHHNNc5RXA8glTptAdB+ULVds gNfROT+dA5dCENNJBGBUI8Kho0pXsLS+SpVMRGupyPtXwErR8iqK4+oFcq2HJhB35wB3EMRxBlvB 2XB1yBICaaO0ksw3PDIAsjK2/+51JOKFkarCkGcYSMCK3A1f6ezAyZVRlCtDWs+1d3JKCrlUJ1vI BZ2acT5ITqVAE4LnmmCnkoWCnd/6IOlR8PG7qws7AqN/iAU+R1U6QfUPB31l6u6p/Qevu3F94+al hY2ltdX59WPT1wfQNTOYhawq9Wumr7t7Y31p9b7pa2666caFhc2Vu9Y25qHta6avDS1vCP+KZMLu tI5klFPVeWdXRo3TRF8qciEARXDB9ZDQySnqh6PHRC3XEdpK/aZYlAH8dwDXAqICD39DxBe0zlTB V0drXirLiynGCfuRlcjF1OlSoU6nFN91rEUajcQ1RAuxTIB+5Pg4RDd78atl72oI1RHtcp1ElZga F2wdSpnoL6zSsDLNRBXFmkRzpZQd5NoS3oWNY96mhjpWGXdUc3QGY1Yp0CoWBlsQ0sz+U44kWqI0 nlBRCpXD1GpSuCqWYAaaYslPENKssUwEqJc9wGx0Yy8KEaixhLy3kdSx0RtshZxRE1uIC7IgaTCY Rc9ulPWogyq2taJeK3VWEV27WrjlFB7goz60qMVVA+xayolVJ9VDFy0tZCAhuwfYzQpOhYf6GNTj gOGMivFA6nAuegqRvGxjsV6MNGBNrUUlAXYp3uxYZAbDhkk5BuY6VshWkM3ESUkJoE0LLJdmRktx Drex0EQmLtdEShGIERKiLpcIBR3d+CCGjN1CNAU50nGXaAquRk63oI4+KJqS/NHNYn4f6GflpUIT 51R3bNSiW1hLmIszIh1h7Rs6Rs6kMkclrTRmHCIvTS8nCEyfHC1nnIiJsAF8sY3lwGGM1ox+pqCZ thL1EMOkmGdHYCmOw168tsDOK4VgoW2hxCAv64eFtRSbZ6UwDIyAkma7Ihl9sRYOhQJAW7qxVCaI HFhiUgEcFtvISgoN5A4IUjoeqBV9J1hoKeU3lAKqvJzfWgIIwZ0pnl+pe5hcrGGl2M0G3H+Z1+TT eYA7EMalkHqxMABFtYjh/DIOxdmLCdlKvVgAi/t6JZV8sUCRi6EwiotmhhmUYuKztUTfwWzZyyL5 sUKavUqCecStCRfasQ06lcWBbOdOjIxxqSHvWyFeRZTpC9aADXGuprImtIgaognZjKzEFTzQUm7J kU/o2h1djdCAIY7GNVdUqNNJ12KFBnNoZWQPrS/ZJKu1zvaASz+rGPyGDvFSflxzFUMTzVLgwyo6 QZyAlQqynPADgbHoL+dvQCDp+DwxDLEDNs+jb4aRA2OlAq0EdhouBUtAKamN4FJqyzvxFQ8rxF1K ACa2E+VerP+BUCUcQx192FmoBqDUWVOxHLWSNIq3nCJ2q5XJOXWdh/PA7nCWMiZKkIRQJaj0pOSc iTuRRWMc4Vi501ai7k7N4IZlecs6wy4o3lKwjZFAM0+5d6ZbGfEHTx17XBjRhQJPllLoV1nNddFp gYmFDp7j5LSnaiCDxSEPwIO3r63eGfrYCN3MzBAYpaT8h6nbj8AvWtFPd7/z1luWlkM3U9fFr2Fo 191z29zta4cW4WtjzAN/uGH6mg+sLK+Gn2bCsNaX7t3cWDwKYw/TXp/vabFw/9LyofVFnJuZvu6t qxvpN/jPxrEji/DbNWp/WJh3rC4tBKCsT97wwfnlTWr5geM3BMEQ2sEgcFSjOo9jnedxbAfmsXbv P1lc2LhpbXP1UBjaTWtbrHqa1mE8WaHpxtHOE2w8s+1TvfGtB29cPjx/UHed4tKh7BIPmBK02faZ aNX9+N2/uHTf/Rudt0iaj/ScHlo6tHF/5ylx62s7DHxUsOTG5vq9m8uLqwuLXZeEHu24IvKebZ6V 6TqZ1c2VOxY25h9c7I5a8ke2fWKra3dvLG0sbHEk0/yOYuu3Ly0PMcHGM9s+QziQXWe3vnh0c7k7 xpHm20/Cg0DYdU73zh9dvGV98f2b4U52J+g9T3XBQAMmoo8zkXYalVHqxbfn6OT4Yz7OLmzz9iyt dt2ctSOL6/Mba+ud9yU9sO2H7u61zfWFxVvX54/cv7TQmRHZYilyfmR1xLHD0uoWZKAxGbODt+bA 2sqRtaNLG10uzekYADLLW777upsXD0/fMBH2RmMeE2FvxIQ9NxH2JsLeaAt7h9fng+SyfPva0tFd Je51vnoTcW8i7m2HuNdZ8TeR9ibS3kTam0h7E2lvSJb75qXl+Y35D4YXLR60p57zHh+e7hAsRGdu boLSdhildT6r6/OHlja7c3HSfMew2m1r60fuX1teu+/YBK2dGrRWTNDaBK2NCVrrfFYnaO05h9a8 mvZqOP3vXUPoL7InJmru00ycjgaUeRSI051LH1hcPh3+TeNDodYXV9Ye7EyhwuYtD7PTyzuwxUur hxYPL60udae764tHFuc3bt7sTnizJ3ZAm7raeWbz4Ee7uTUPkk0tf2Tb5za//ND8sS1wSUOTujG/ PpQqldpv+7yOHlle6r5rC/PLC7cFSOeJpQd2wDLVebsODXHBDu3I1dLT+gajprUP/1XT4d8bwvfw /xsg9LfrNPFbd3oozbd9sh15lAyZyLtvx9F3xSfNp7Z9mgFVL8939wudP3RoaWNpK4qYzy8+sP0W ms5bdy9EOnQ3zFDrHZJW5leXVuY7qZVHhYe6d3krzDZ+1j+S729cPnL//G6R7svu9udDNy8+uMTB R50N0PlD2z65Yc4gyjEdN6qjOHNatBa3zm8ePbo0v3oTzW1c0MGCWMbu2Nzioo8fWtidZuehLs+I Y7kTVMzuRrPzKCKEzsqmccEI8+tLG/evLG50P2zjhBlOBJePB4YYkrUbGj9st+jedSoPdJ/JAzsx kc42hge28BfNJ+JGeiJb7F0+ET3SR2sLt4h8Inbcaej4mDhOiPwOjcR3yrK7uH7fIizmDhl2aQAT q/LEqtw7tee4Vblz8P7EqjyxKosMN7EqnxYRdZdalcGmPN9ZcTWxKu+QVRlpPNiVjbphKHo/sSRP LMkTS/LEkjyQTo2FgnhiSZ5YkieW5BPaikNLhw9vdk9yMC4YYTeZWzsrFHkvD6ytBnFhtfsu9T23 /fxrZ2y3uX44MEh3B8GhO9fTfGh0949uy3Bzazyz7VM7tri8vPZQ1/ktQ2qb8PvMwtryELbZ3se2 fZZD4sjTQLFGhVpMlG4TpdtE6TZRup0wKfS7SOlGxO+G+9YXF1dvCAzn4g0BmSzdt3bDg0try4sb N6wvHrphbX1+9b7OF3BctHHDEPKJSm6ikpuo5I6fE6Czun5xOfxlKE1P9sT2Y/uq88TmP7i0sjlE TsnYfsf0PWCND8LyHGf33BHHmJtJMJljdDxGR/7okcWFwDau78L4hV2letrVipnAoO121YXujIHl Rg6tPex/cJSPKQ/2zR84EgTjE5hlenCit5nobSZ6m4neZqK3WRsvvQ1raUhvw0ocVN9M9DYTvc1E bzPR20z0Ntuht9kJ3LfbnI5GQQl1N0tGEy1Uy+mYZNHY6Q0bdRXb9oTK7xB+GsdUGstLG3fOL22l Gho/jLC7s2jsymThwzqejXwKje4JGyYpNEbMOXXUU2h035HnUgqNHaKdkxRUY0U8h2V5Rp1unpCY MOq0c5J+atRo5yT91K6mneNj3h+a7E5STw0zgB16+finnprR3WuKb5G7KTuRH9gBDDnMTLqXJz62 AzN5buXMevPhw4sbG2tzi/etrg1l/Olk9dl2L4zuh/D+xa3tXdl8pPlIz+mhpUNDmBq59Ti56e3e 3By7TDG7hWAyyc4xEGXuECM5ptk51g4fPrq4AYNeXzw0lI1wXNDDboqW6IwVDnVndg== D+0Et9t9It153UM7wuzi/dltyOwOmdW4oLGh3E3HBXMdXl5bO0SetNffuzy/8MAN0wRaOzK/sLRx 7Ho1OwSbcGyYsClqve0zHmobx+Uy3QJ7NkZ3afezBLvTdW24yzPinM6JH8LRt7MdvX/+0NpDB3Yj rhtHl4JJgsKRxwaTBIXjHQe/ixMUPnT/EBHC4xrkP8lPuOsjsmxnBDRmEVnD1bAZAx5rFEKyJnmB JhzfhB2a8Ayngucb67xAQ2c/eo7lBZrwS+PGL03YpVM/hkkE+yjyS7vTDDCJYJ8+MSvARGU+iWDf 1UF4u9JRchLBPonCGxVJdtSj8CYR7BPaOaGd27Jro042JwHsE9I5UhMZcdI5CWA/sbUeFap7Mv6E Q2LyHdrQYSLZR2VXTjtVHYO9OH0DGKODcHh9fmFjfvn2taXuojw93PE4yJtG1j64urlyR1iCB4fI 8p4/su0zW127e2NpY2ELs1YegAKt3760PMQEG89s+wzfvrl+7+by4mr3FO/jIqqdkD59tOWZWdXZ Hnvv/NHFW9YX378ZtrZ7dGHPUztGWhqnclzQ+8p86KpzHpBxQOy3hkePbu1zNH64YXisN+qoQU8r /qftW4R0ne4Jl2LZMUFveW39NrmA44IxdnP44S4kv9ubrmSHbtKYpvi4Y9fH826LWme788Htmlwf M50586GTfewQIhi79Big7IVLAszdbrv8u9OLb2j5YtTx2YlToYkr33ahhs6hcuOCG04E7436RdKz 3WOjJsz2Tpy4ew4vrt+ytL7rVEOnnyaNjz15Y/7e7uswDgpNM93ZVIVzf+dwarDGMzuXimtzdeGu McImu+6UzZbTavq5cc5unZyzHTxn+rmCzm7aKRcTFHYgIPnt6/OrRw93KCQxOucdxk5a+N3Ip+1O jciJcNajLsudYETWRB9y+rYEPeduXF4+7UhhfGSdE8OWE1/NYQawQy8f/wpQUIJnPSCZwIoc3ML1 vid3xVaHcswy0y2u0xnedYR/V4Ytdz6q6/OHlja7CybSfOfQ6dr6kfvXltfuOzZBaacApRUTlDZB aeOB0jof1QlKe86htBm/v+vpGPEynW5SpnMcy3TesXLv+vyti8vzG939Tka2SucQZ3BsqnQOUf52 11fp3HUOuoeWwsXbxZzcrvI81rPd/cBOlJMb1Qs1LklNh2JJRwWt7TrX492L1ibIbHSRWXdP1gky O427MGRNo9HHZrvGQ3qI0KkRry7c/ZCNy10fu9Cp3ZqZpnMQwSQxTf8EdzYxze6L0xkCz4047VHd +c1TlIdmZA/fuJCkscyoc293B4IJDhjdKzLyKXW7n7Ohr/uoetx0CHHLWYEdqiF3Y2cr5IH751dX F5fvXlxeXBhG/dT/4LZP8q7ORuMTnWT/gztGh25eOnpkeX5hcWVxdeO2+SNjRIx2X3q3ezurEMaG vHZH5CNOXlPOtum+r7rxteuMTzil28ieynHhvcczOd29nZUnY4Mdup+sEccO3cvOnorkGCN78E4D AhiV23d4fXHxg511sYeXtorlarqpLe/Atq6urXaez/zCwubK5tZ252xW+SPbb0lefmj+2Ba0tYEv N+bXh0KY1H7b57W8tLo437ncehASF25b28qZPZtYemD7LQOdd+vQVvXmc/vZ5o4UQ+2M5LMbJq+/ HUff9ZI1n9r2ma4vovDYeZKHDi1tLD04xPziA9vP8Hc+kPcu3jcEf8KtR9f0trHWXU5eG2Ve6/D6 2kp3IoyNd0gkmV9dWpnvFLB+WuShMc16tjBxhhlVeWim2i3OMN0P2bhoPybOMCOi7p2UaRpfb5iF XecNMwSiG3Hio7a/LNPInr5xIUpj6Q6zsOvcYXYPEhjiioy8O0z3czbq7jCdxYKJO8z0xB1mB+jQ xB2mZX92SD5a2HXuMEMg8hEnr1v4wOxid5jup3JceO/xdIdZ2HXuMEOcrBHHDrvaHab7wRsXBHCq 7D/j480zxB4Oe9V2aA+HSSg8KrswhGPZZBdO2y6cvqwbY7AJp28AO/TyXZC10XRPyjbiaRuHmMlo p22UXIZ3H95cmd+YPzicUXwUNZG7Mp3hEHPa9ekM713eyk90/CTEXZj3r7PMOykruu1XaC1WT95t F2kY5LBrbtCh7tzSoZ1gl05fAq0duvZj52l39Mjiwh2bW9zfyW3fydvevQz35vrh+YXFu4czpDce GmG9cTiom8vz6wfWVo9uzK92P4P9D46w26cM9s0foJqXQ88yPbgDkWpBBgpjnFkA69L1D92/1D1n 7dGNY8OcWWo9TrLJjFeq8ykYcR2HVkPMZbS1HDNmmLl8sPNcPriDPMida0urG3Osv9gRbejdjIzm GCNM+KGd5od2Z6neITdr1Bm9E9L1TGr0nk6OZuPO+aWtuLDxwwbz60sb968sbnSvCTdOWGFXFr0b GtWNuod7Z8Hvge4zeWAnJtKZe3xgC21XPhE30hPZYu/yieiRPlpbOOfmE7HjTjvHR1Ye3gixG/1U RmU3hmWCduNeTHyGRs5n6DlYVvR0+OCMD1WYeHeMhaDSOQh34t2xg4zV+uKhoU7duFyo3WT3nXh5 7F4vj/EhuyeOM3ajIDAqu7I9Os4x2JCJZDZyktmM9vt3i6dD95mMtp/Dc1FaHi5j1khGrNhJxMok YmXMRLBdqNMoJjqNkeWEJzqNcbpJ3ZNEj7hO4/Rlu57oNEYYZ+xGEXpUdmWi05joNEZVpxGEyrsP ry3Mb2wGwXK4dHC7zAw7id6e3JkTuDPlc/nOdJ785M48x+/Mc0tPe/dGOLQLWxQf292oYVLpZlLp pg2lTyrdTIpctM1EzU4K3Zy+XLujQhXWF1fWtqqZ2qD9I196emn10OLhpdUhUkKsLx5ZnN+4eYjS v9kTO0AVJqW1I02YlNaG8UxKa58a81d3MpZdMXn/7Tj8rres+dS2T3U319ae7awEGfVq1EOwYJN6 1B2VR2NZDHB3JlUZpozeaMtKk3wqp/HKjr+udbfknN8tGeefW7pvoHhrgeJ9cP7gFlkoxsFRWe1C R+Uh5rTrHZU3cv5s1xgpOjvxTWwU/RPcWRsFHMjdZqXYgSr2O8S8TsS9tVER94a5SBOBbyLwTQS+ icA3EfhOTuAbrpzsROAbvTnteoFvt/qldXZfn4h8E5FvO0S+zgdyIvFNJL6JxDeR+EZU4tt/41u1 Ovjm1UNR8gOQB8jB29dW7wxdYHGoGQLftHjf0mr+w9TtR7gP/OnuYyuBWw6M8/r8vYtHF9amZ6aP Lq2sLIahLKy9ZkpN3xj+veehqc2p126GWd4c/nbHlJr1zqu6mlazpipM6cKXWpeFK8MXBQAfvnij fVHDl9J4B1+MsrUx0/fMh170tMJ/7jkW/vKd4cs/CaCHpt30bdPvfo+aPgSvvWtqplLWz9alNtOV 8fWsL6yfXkFwMattweDCFNMEs8bmTQnodO0I6HQ5vQCPOz2rVFkB1ASo1tDUVbNKKxuAzs1WpQVY ocNkK2gYfq2Uruj5IjTwSgO4ni0LVWLbMry/KKFTFX6uHABLNVuE5vymOszkAHZQzdZVDe/yfraq Qr/UQWkRWKhZXVoBhmF7ANpZ7+uCR9AA82RhBNYh0IcNMH76XVMNcKlnnVE1tg3rVlewWmVYoqLG KZR2tq5xtcswL6cMvawMcy+xg8qGttRBVc56XSPQzWrncQS1D2uIHVR6NsyloOki2OXgViCOtg6j LUpYxiocHlXBKoRtmTW0NGU5W7vCIjCsgSlxtDaMgF+mtZu1ykMHpZ/VVQED0ya8QtMahPWyhUZg EdbAwe6G/QiHlHYXwKWyWsBmWmA4W4Cl50sdn7fh7ByQ5w0uQk9bU/m+Tq3ve781s1rLvLw12NbW szocluasXBHOsXG9KxDOn67DLjVWy4e2BW1iWldfhWNU+GwPcATh+NThfjX2VpcunD+8c+kU6HBO nMV1wRPjNI2gB6xMS9sAhA3XobfSmrpxEsMEZ8NJMI0zmwHlfOPLAKzx4stdmEOwD7ur68Z10mE+ zlnXuHi6MrNwP3suKfSrFS55utC6CjtV4TKmq69rTX010YRRPqxulSOUcCzCbHBQCfMYXcKtKZtI CqDhiLsGPgOgIbwheA9AztdZM3m6MJ6hSl5TmqIgmLVWYMprgoUzQkcY+ywQ7/lwHV24TXMRjAcr gE2YsrzfKcfAcMsEqGpDwLDqBY/KBnRI6Dict6rGCYRlChsK43JmNjTBva7NrCpxT1w4jHBs8GSG 5a893q1w9kMrPNphp31dFbT8uqjosIQ9CXtJu6fgFtHJdHIPkTTgBsDd0L6GDTBhy6wr8HKFDkpc /3BPXRUODd1OP1uWuDQBXIfB4O0ENG/gZaYOZ5TOWkIP4UZjB4Qe4LSVRbMtbJc3Pb3qQH18qXtG ABgy3ArfGC3g6FKZojEvFe6Or4zvWQMgCJW1vrFeQNNcibczrSzQPwtkvLkLCh+zzR0L1D3MS1WN vQX6qwyNIDsHSNaJ0KQzk9P6eLoQWBiXncQD3AFvo5zbOQEr1zjiAKuUF75A6Z5XxUtzODAdN08R UuQNqoDFCau2guBArwq8aEgPCakG1qdG1BOwcs1oyoXl1bg/pQm0rOKTFxbNK0Q9AayVIQxez9YK 8QHsVakt4URvZ6vCISuADRwja6FB4WTR0Q+7ZnVdEe4LjI5lBB5mX1penkDiCP+GCVQELBCLwC1R s2VV4C2xYayOSVgFA0dMG5oWTAACorZWcEpV1jUDA8uHWNaENfVMghBcuQw81w5e7gdXNF2gCwqH BuyWtYlaEDSwVtbTKoa77lVhaRvC8cbnS2BQELWF/dJa8f0Ni88IHDBEQUsT6IkzeFXDzEtF9Kr/ HMAhAdYHiCLO2QZ0pMLQkCkNKMvUFd93VeHIVPhGIzNV2BJD9zrQI428VwDWRbg+ODJdyLkJiMGH WTPj4jQSIRuGC/wtAJ3MwTpAPD5ilrLAGduC0DpzPg6PP7AQjBxNWLsKaXnAcnXg1XkEgN+1I3wR mHx8mQ50rkQWNmCD2EG4aI42JyyztyWPAOgyHcdAWMIQuK3VtLuBxVZOOlBVzbwPohDivcJ59IYv CSMGWBjDHIIFnhHRswqzsd7SQaiBbSDuTwlnHfotmOoHqms9HdJCmK9AisLm1nRznK2YwARwVWG3 gPsqX3Lb2pZy8lVR9AADFwUIQToQsAtclOf313QKPHAK3GlgKsqCOQlXeT6fCpYDyWnAw3ijAehF tnFALGkAKhxDg8Q0AJ0veBMDr6xqYjsCB2QQ4WmlBXc4oEoMCvKbUM1ALPhxBYwD0wxkhqitqlDg CViwKEp5va8YhyJbQM8HcCWo1TGeDECjqsiO1JUAbcHMTGKfVcA4FVKysAMmcBKEOgK4ciguwMZY zxJAoFs1wxRxcwoITc3AgABkXUuRAAqQ/jQ3Da81xCKWgSzI8wWx/2EpAnsclzUcrA== kgiRcPXheuua2BydhBUD+84bW9iqjB1oJ0KjAvxBwLLysgl8XMPCIAVHoCoNn6xwCHzgegEcKEw4 UDzasHwV98pIB75VwmW5imegAZUgkxJOZsBWFfMY4RoyS+cs8bMZMFx+r+PzDA0Lg2iPgKVFUboA saUw0/ImkU6zAYT1JDYrXMNwayoebGA1LaEM4ehws3BWgOVhqnI0mCEqAYXGu6FZigvHSLBDOFsO 17UAJquSDsJVZ5yDvDsyDXXYJYV0MYxAG9yYwKQGvsAxeqhYZK1qwEm8AiiqIDcDYFPqDAzAwIYp IqEBETnD4i1QVuK9vCfegZg3V6AgGKiwq0vNwnjlabvCOTbEPaogIwVsyeihIC5CBXnKaHzeWeLz WqkUkS9gDpCaNckXcMZG43VMnQARDeKKabwOBLmATXtGBs/XvZPQgavRqme6OixzkK+tLI3mzSkA Sdh8GeeEHSvwbbgTdOyBQbJpzwrhpTxypbC9vmBxGsEijovEFoDhXXI+KtKUAIsWrpyXo2RKFrKD HFA3Dx3gZiXAdEDDygV67vgwM7UOPHJZmrp57AOQtR+NKxLIcVH7nusUgKgGaFy8BMzvaAZN1xnf hYxMdvGDTGptIUgCpFvqoCA0lOMTQDckCWWIB37WZR+SApTnrG4iNA/8U100UV8AMn+GaNIzmgyj QbrfQKlAIZ0InoJ8w1DDMhe9iBpmYHC0GVIHoPamgf3heUvoKCcUAWyLQggNE5UA9JUwQUx9gJLy aWFCdYBXIGAxkduBrM0x2BirmyQQgK72TWIJwFL47ERYPTAxiQYTHxaAgR8xTWodgDrtQaTsYT1L Y0zOA4SHrK17eIXwfqtU1ctXQF+kj8h4EPga8YNwK+G8ea/4DOGgqAPQCnsnXBAdDQstikLYJWKQ M2DOWmXgxIYFoHdedoZ5q/CqgCKqXuYO9L4lbW3kA8NgWSOUMYzhcpja173MpQ24hm5nxogGZr8o 8RhlLCtw+6T7abK3FWGQJitcigyYM81l4IIIQeUMtg2SkicSlphxlJFr1jwL2x5aKocErMHik2gC 083EAVBfFAUrRaLgEPCuq1CayIUM6EDjJmQCSXisMLZHdAnI0GpcxIaY40Ghh4uYiUQwG2uaslM/ nWICZsGqQNJLWA4btmyF18aQTAIYjdFUGKRnnWF4ijrO9LascSThJczHetdsqkhr0egTNDie9Cf8 ftpcC1PnFQ+IqWJRrSRCA+sNZKAxAFjvyrGGIKxHaOB72oICgBBy6rV/BVg0BTUE8Z4i9KJoGshw bbCTJCCDCaAkjISiNM4tA7LUTRojuG/EKGfiPFg3WCELF5JuNLxLFaJmKFxJHIohNUJTzwCMj+A0 UUkA36K82HZYdwEsliY7Cuo5lKjCwuoS+kGVCDatQaND25h0Jwo06Zb1yahnOcDCSuVKvruobySG stDIcIj+5p1TxNYjJsl1PQGNi6IkKoVgUIXCSaHewLEVpYIbXzV1DEGoCgPwbARhbUTLJsLuvvYd YoUjvVrAb0z7EKeJXYxPG+i8QfQgYCDaOmtLwMAVV7zKViXLmC9FFV6DSoTUfb5EQhvQPaNYJfwJ Ivlwz3lHCtR5s/gYyDCdNGAbUPaCW0RXHs5J4A8sHQnEhXLU2MwQjoSFp8heZonMAakn6wf0Wle2 pqMaOZBeME0XgEoxD6aAgRDTGIPhhogqVYE+GvcfFsmSIQ+sH5Vsqjc1m8YiY1JZuhi808QshLMc JB46lkF6K3HHwk7XIBmIaYxVtAJuBYpprLY4sABGtSqdbCSFeFicyIR1jUirBHLBSn0wjFWkFCx9 VHIZNF2gGiWsliO2JBCfcNENXSElNgUEk+IZwECTBIhYHoBZB1XswNmaERzqdYv+trXc16xXkczz EQCtrZyW0RL9tGDKJJ1RmhcwbEVd9a6BB/0SSptxtQBLWdrCtKoeDLSmznaA9Kqgh9fNnQW9akDz vnEGQLGqFN4vPC/h3pNetAkmFN8PJFUnGDLRIJ3OIRilAqX2jRObAeV0iwHLh7OR3YQ5BodLbxuX CWwobLlN1w41vjWqYvIriq8ryYgVr7MGDO2JRY8XH6w4YZN6kQRYfGpiQhJCAdOY2MQj6gE7Urg1 ugdNoXWLpJSE0gBYFVrs54T8jA530RQua0kdBMRKZwbAxMkBMBrXKufl+cSMI9d9gJ8PYi3LWVUR UPScgA0eLwCT7IBA9jYoyUZKg61L4mVLssTTuILQXiJB8lpEPViuikR+QxY8WllUKiDj7SJ7V4Hc iuvlSpFTwI5J3F1A5Kham0ENP6toQA5zsrXhLJsauUYgELQJcENK0m8YH60JxDdHi1Up/GU4PQ4x dbjCIr5Z4FVRU2lA10L6+YQjwq3GDg4wF2Vr75ttYReM6uk1HBg2iecjACwZOBHXGC1qSMrGrIAl CTxY3bMCSGpqVB+m1QKqplzh8mUF21joyvbsABDLkuTXtFvKgb69Mo1tRRpe1a7nCCCYKE06Lhm9 TwcLgaRtl0N4gDtghCpHdk7A8STz8UanGaIJ6R60MBe5dayW/QHbEQhJYh0rLFLzsNQihoEEX5Al rEh2VeD6K1bxo9lcxOZAeSsCF6z58KgIMsyfiZomSIpBvDXEuDpSsfs6qvOBdNAlARa2KlnJAp2L cawmgzXqmcjeHA5+4XDbw2kX2RKcIrxjrrUqy2gcQ8RLNk0mAhXopmrulF1cAIMHedHS+1GOPTAV wVUGnmsHL/eD2TQcgIGw4es8mUWFZDA4rExV0CJWwNo6NlKGk0WKuUqMgeEbGFjJOGYFiYOekt0j wBukNuz4Ifb5/mOQjGOBR4A5g7iuq2gbq0ipEi47GuuJo/Y0MJA1k1kEaRLe/8Cbi12mlFMTZB8l prFwaRz1aW0hdiWeQZCKkUGNWIX0hRY1mqV0QApxYCEYMQaJj7WIgOFAoUnvR8xeEbao+dCAGS3a JGIHRTQ0VCRriVeQOK9UJBXQaCuyw4EHkKZlCcDCS0vEIAssnopOPCAWRwocsBkyjwDSJ1tbavAF 0MQjoGXpAOvvA2fN3Je4EAHVNZ7V78J9gRHMiXIyMw86wHNsmcHTTkAfODE++Ky/T8BwThT7keVQ sLdW8i5Xkl7MAOalTsO4HbJfoL2txbQUlqNEQgoKLFWxsIYaSWQlogknMGd1wRqsWvT0wCojz0bK KmvFWmNKQe3GkM5XhfnRxQciEM3qAaxrYXxEfROAKOUi5kBtG40g4FrhW4AnFONYSfo+wKxshAqw UtQOyhCbB4KpcizwJAYarT20/iWoKuYY6MJB4G1xlcgAhTVsxwSUycDSlwwEM55Yxth7CdwddZQh qpKERi3OAvA4kTZUmHobJ8VWmcA1C1evwBZN/I3JZRVHNxZc1JJpDpEzG8yQYFCv1tvItRQCrNlJ pUIVzQKbhbSu2YjmWD8OEyCmBToVjFOTLEAqyEKU1uG4cbfekb8m3QxXFMzL1c72AAuQEp1YthJY I9IjmCW/kyAqF1aLua2uHOsxGgMQC1IRVYBaCY8JPEm0eDJFK9kUIOdCvAMV+WPQ1ShJigM9jYmW WFAYEhIodKYIUa5kIQy5dzpa4Dmn2J6BKnaSTjUfLUc2LlLQlLUIFXX0VUKwYAeRpQNDWpcudzoT 01hVCwn2ytfMuClS3IDtgtTmIIyLV284x5YJM9jGSpJlw1Vm4wl0UFaWVWWeRMZ+IpVMY+w0lhEv 9BmrXLMLsIyVbD6PLwNJTjMuyAYGzIXvnQSYxgpa2zRdMI2FsxqXxttoGitZ8uZlnGNezJGvAe4E HXzgjlTcMxKD0NhiRHQ3cMAWWBxmcUG2nTixMor5RZBMo3EMfpPjxDpecP4TLww5eGAqLKNrRjyk LuAJMvvheSZ6DUpihwQsO/lgQCD9R+OWgLNZYXtuFBi36lo3rl4Gy29pAmc3Gt9F3HK6+2GorHQF PFEKAUSLjzZNnAI4x7mqiX3gd5ZwM0QFkjH7diSchs6lRd3EfkBf2FcLjlTtkgmHXIwyrAq+faqy TfwLVkvr+3C1Sy7PEa273OFC8D88r0rdQyoCtLZWN6kKnH82tiT6A3KSlvcjrRIuvyx0TtfEOFbW cr6FBgYg3MgGsQSYFX/+RFdBY8Bax4IU9jNoI7alaB2FWoeWZdqCSNkDWCyUiQsATo9M+Bm/ACMo KnFMjbwF9Fa6qsmH4NeiaDAs4cCz8xfum6uTaaq2Vtigku6BEp9tZJhI958BM94qQTM2DMxg2sjO MG8VgOKenjN3YF0go2HGCIInAGmFMpYRvJkLEvVy9jIw1iXdzowVRZtMqZtMK5iDyDm4yeDCndC9 zHAlEmDONoevXvex2NbB1vWw4yjMluwHLIw7mNE0krAGkw/qRW+YLMQOtHif5aJDLY7zDTHDRufC TCSx0SEpii4OvMxwCRtCDigHyJ00E4jg/ijVIzr1ESoxjYXL7ohxdUSKxDRWabkK4kEAcQaF48us uONMc8tKR5JewjIpYSdj2+isl/UaJK1Am+tsBLS54HlANNSQAWcGJR1WKON6F745AljvwJfxCAKB qgvXbBsW1JEfb9Zr/xqIcQy1t+zBCzIv2cbY5z8Xj9EGQAgJBWm0a2dAEboPsBXMlqRmzcR5DP1h paySGw1Gj8KKszy6mZGnj9G0jknNALaxhNNYIwGMS2HkmrPuApisgiwpqOZwogjz4ODHNxpDYpij I0Nr0p2Ayx4ZrFjLQiyhF89TdJklSzGw2lXJQJQa3skcPKKyXNEDtrHakrI+qoSQeSyqqDco62gc Y4Nm0jGoCh3W0GQStRH9m8i2sXdM7T943Y3rG414yP0Hbwj/TtXT17xm+p7/Lgufo8C3llC4t64e bka+6ekbj3DcWxVWIdwB+ELxbyX83adotmFC28CvtlDiJoguoys94DA/zxcFHFxQVxnIU1SgavE0 FWA00BMlEPAcowDrtW52ETAma3Gyl2VAHphgVwYDOY5hNhkYtGW6mG68rDDRmpAGJkAxu/M0BIz9 pilnXaTFyV6WAXlgB9rXdw5OyiZsLuwo/aPxn7BzhGIKZ4RthEO4wmAV3a/i4gM1EtdRVsii1aqW 2xnjgED1Y0yhe9qG2+mjtwGzPAFLOrJdAnsT6VLAqcy0AMevSAEPKi2OWgIWk/ijDBg4c5A0pQMB F0QJGFOTXg+M76TqDzBYcOI4yqrWCXuT+BDA4rxkYOfRB857kuYJWJOOyIOMVcoM4DHNEraBfucY HPhZS2DlC9F/1ezmg96xEivH9AO8C0th6U1BAiSCTUkMKQArEucNsWgMJM7XG9KDCdNhSR4W8NxU Y3vhdexHB9477O3ryMxGQPZBDsDAaMiKBQnDSNvoUhOku0q8IdH9nYCBk+dlRL5JZuY8aZmBzwxM /5ycpaIWTlfVccIBLfNO+lrCjxRr2woIlCzjTgS0y+BSidK0qC0bElSmhoxA60UEaQ== gNljAtSYqmYNkJYbAqbISpy4jDDK2QQqUIZx06ISmDiBoV1YxBoEysKKliBrG3bROL4LJauoTaQp vqIIBNlxOeIlecUwS+q1eHdrW/YBcbsWhMciI7SAlwVMPlBwHz0tIgaGlRKdJ3xTH55h7g2m4SvW L+LtXRHVsXVlBp5rgsFj0Jt4crkPhi639zx3SsnmHev3za8u3bc+v7IyPz0zfcv64sLC0nxvCPnp IKN4zCXaClVUK00wWOdqljMNxCxY1hCVvqS9N2QmRCIopivQtlMUMUj14FN3QDqwIv2Jj5iPwoQm Mxy9P5xSNjjg7REXL8tayaxtHQfgY7AryCI1mRfzAVglshM4K3t2MgOpWGg7Ctt8UcjkAitQRA8M BspqzbUvIhyP1pNxzQy4CIUzXWRJC2666UaonXPX2kYskMln6NQdsTs3l4/Or24shnOwsrZ5dHH6 yPriyuZGk1vDE4ZZB7qeH1WRqx2J0xVzYQkK9lxNB0UX4owA9lxtxZkQQ6wTcIGlYbYCZW1BH6Dr stlrAvIASByP0CDqoRNuo9OybJw0GoAASaUcB5u1TdPKeu1bgYWpm+6NDNJN9wcW+Jp3rEIuikPT 4YYfWlpc3Zg26jXTM6DAADkf/VemHTiqBtIfTmhpC77B9N+b7pvSgbxOQ/wvuCLI/2cQysieDPxg WAxXavqmFbQ533TTZJNOapNgbwKtAbVa6L5Ae2HYnFkFisyePQobiKI3eN0UPv1/Rn6gmVSUnwGo aqBe2U6BtAQ6Ae413D1MQ3LL0vLi9VlGkrvmj0LmknDzQ5tbp94dhzGDejT2ZS6BqQndv2c6UKvw J1zY+7duCz9Se/pTTVvg8Et8LkCm1dT+/TiKm+c35q+fBoF/6p63nvvsMJ8r9/5Axz9DdXvK3346 RnJibz9VIzn5t5/kSE7tAE5gGKdjAEMN4/QNoOMwTvcAthzG9gzgOMPYzgEMGsaOj2H7B9A/jB0f w04NIB/Gjo9hZwcw+TP5M/kz+TP5M/kzXn92nHSOCP+w48PY8THsOGs9gvLF9g+jdQDbOYzjDGB7 hrHlAE73MDoO4PQNY6gBnI5hnMAATuFITubtp2Qkp2oAJzCSobp9XvOzZ88Z8bNnz/OO89mz96wL 9r2UP/suOGvvwNZ79p69b/8b3nbHnfi5421v2L/v7PbW0PKqm5c+9Oiv8OfRDy3dfFVr6zPOgpYf /q3P/dVj/Pmrz/3Wh6H1WWf0NN17/uUHQsvPf+Ub33qGP9/6xlc+H1ofuPz8vT1Nr/nuD/0mtPx2 WqJvQ+vf/NB3X9NovPf817z3Jz/9WKMlt37s0z/53tdkjc84/5r3/vRnn+htSa2f+OxPv/ea82XM e866/Lt/8rNfe6Z9s5752md/8rsvP4tXY+++Ax/69BMDmobGT3z6Qwf20Sj2nH3V0m8+9q3Bx+Bb j/3m0lVn76Fu3/zhz3+jZaxxzN/4/IffjB1jt185Treh469wx1t2mzrec9b+rbqljveftWfPBW/4 0OeO3y10/LkPveGCPWfse9ujf7VFt6Hjv3r0bfvOOOOld370sYFrK59nHvvonS+Ftr/Spe2v7P62 3ddsiL0YZo87nZ1nvvo7K1eHQ9nhTD779F//0t0v39vprD/ztT/6oTe88IxOd+ibX/rIuy/Dm9zh bv7W6gxjiA53/uaX7h0elwyDowbjvmef+WYv7huEU595+mtf+ve9OHUArv7qX//RR1b7cHU7Dfid X/qhd8+8tI8GtNKWlbtef9n5gylRg2Zd/fIXtnQaWzdo4dl7zzge6Twujd2//82rh8CkPHXPW2JN DjZ0395wI85dm9o8C1Z23rNgx30rOrg2OPI/gXxZahac5yGkS09DnIu30zO0yOF/uiggI5Qr6vAV k6N7q8HZYQbyVIE/8gz440FAS/wSfyHXRkupgysKfEjuDu+I7ksDXJyumYGcr9rXtpOvFDguoaND dFwK/zs0VYiP1MH249IDP5EDg12c1JHBHk7u0GAXJ3Vs9h9cPdmNiMWGwkM3vnX6xs2NtWm6xksf zEoE4Z5NX3PjobV7Fw/e+Nb64B33Hl1cf3Dx0MG3LR47SI2Oco/5WKavu31t467FhbX1Q+E0w89b ndTr7lqcX75tPvT4gdB6+poDN771Vr4Ebz+8tr5CP72mf0RhFe7eOLa8eDC9Pztr4U7duLq2Oq2r Eg/XJv7D7nNNz/hejGV0DNbjpJErPWBH1VrEx9xx8laJkgVn8LowGVA8e4u6tD1tweGdYs6zXhOQ R7Aw1QSXeXZF6bWSTLHZAAgmTvIy1tQyTSrrsm8BwH93AA647rb5ow/gNzV93U1ra8vT17x19cHF 9Y3FQ7QdEXzz0tH5e5cFfM8bwn828fdAOfYfzD2pDvb5UoXTyt5U+w82fKSsjj5SWnykwn+0In+q Dq3xR3yC/ltlXmPsUHWw4VKlrQWPquNQUvz88/jtE08HzuLp38Pv/4kZjd+Bv/wN/+Vv81/+E7b7 fXjmW5847htgXEKVw4K+RRYuUeb9B29v3zUtmxJu0vQtmx/84LFp2MfsAu0/CBse/VcP3vM6vJ6h K2oUe5hbWn2gb68PLC8dORJwRLq34cb2vIGW2JAj3XGcWHvIxOk7hxka2IXn8WXx29Vvets9t934 Wvx+5Z3L3/c/fP/anVfCX677nu/9n/7XH/r+gwb+csWdK9/333/f6nftx3avfeN3zn3nm66enMeW 89jjzd/D1GjCbwMIS+8PJ0BaqIuTIi7UxUmQF+rgZAjMQN7m1HMsOYNwPJRyEh78q4FzmV9ebPju EwMSDkOvE/FxztrQ/sUQdO8lXaaGpGvvmXbltKta/Ivb2qJ/Mban/27lX1yU5fD+xfHzJv+Dx/9z Yt2ewgFsz6hObBinfEgnP4xTNaRTO5ITHs/pGMaJDel0j6T7eLZnJB3Hs52DOf54tnkkxxnM9o/k OOPZqcH0j2cHRzJqg8nHs+MjGc3B7Pgw8vHs+Bgmg5kMZvJn8ue5+WekbtNkMOMymBEZzwgyVyMy ntEZzCjLTTs4mP6R7NR4Bo1k1AazzeM5/ki2czxdRrI94+k+ktM9pBMYyekYzwkP49QO6ZQM4+SH dMqHcQKjOt1j2IZPv/U5ui8ePz6Am+4986xzzoXPOWeduYVb5BlnnnXuBS+95LIr9+/ff+Vll+yb OvvMgQ+Exue95JIrrq3e8vZ3vft73v2ut7+les2l+84b8MCevefsu9zd+s5Dmw//6E//7M/+7E// 6MNH3/ud/vJ957R4f+454wVTl+jbV/7Fjz36737v05/7whe+8LlP/96v/9TDK7frS6Ze0PsCdBR9 48LDv/jxz3zxLx57/Ml/+Id/ePLxx/78s7/7iw8vvLEv0GHP3nMv0ndu/vh/+PzfPP4P3/xH8nH9 1j9+44m/+fx/+PHNO/VF5zban3H2ReXBhz/6yb984qlvPfNtcZ/99jPfeuqJv/zkRx9+X3VJ3n7P C/bpg//Lb3/hK1/vj0n4+le+8LFHFquLzj4jDWVq/50P//afPf7UM30+v99+5qknvvzxR96n970g +gefc8kbNz/6hcefbnVq/vbTX/vyxx6+c/8UD2fPmfvMwo9/8itPDXCB/vbTT3zhoxtvvJiHs/e8 K+54+D/+5dcH+jV/+6nHPvlj89e9+PnoMP2CC8u1X/x8q68yf575+l/89j+/9ZXY/RnnXfFd/+r3 /3bQUGg4X/3MT77nNVN7ceR+5Zf+9MnjO3p//cu/frTad+ae5+0565Jbf/Djf3O8zkP3//jY7z38 lkvO2hNW8bK3/8gfPb5VaMPjn/7Rd1x+zhnPO+PcK7/7pz735BYu9c88+fmfec9V50Hz/d/zM1/4 h62af/1L//vhmQv2YvOf3bL5t7/5F7+xCXPt2Pwf//Z3f/CWi8/q2vzpv/t//uXcpWefpt7zsQ+1 MsOt+3C7OuSZGfJEDnne4TZVR375i8frPr9NcFfvOm73jbsql3UA3ujDBIQKPvblrw3AM996soFn YHH0+x75+JefaMFioe8n/+J3G1gMMGq1+MjHWnHkU49/+Xd/5HCd4UjA15dU74sYOLYNGPjJv/38 xx45fH0DA+f4/YlvMHpH/P63f/r7v/jw++pLzuulB0w9fvezf07Eg6jHJ375X63drnqoQUabHv6p XyfSxLRp9bvKy1vD5JDy+e9871EifEL5rrhwAKkEurrv0tcQWU109QUDo/vCA2dP7SOivSXVpgci S7A1T0BP7OkWkdjpc/z4ioHRFaqKSZA5c/ZKEww5BA1liNaQKLZi13NnYzU3qTjFQIlucL63LRQE odzXWa8JKCOQ1JEMhlIOnHQ29QqFscu6bo5AgBLgwaPN2qZ5Zb32rwEGWLRFVXjDURUVLONMHZZz Viufu1hiokjM+Kmw1C5Uly8gCzN8gSy26ScsF8CvxkLJhZ2+Z6X34XrLhy3Uo4O86jct5A9bqAJV uS3fDLUpDKapHPrNkLwXsyXftJCCPhSmLh7o0djJh17VsVZ9TTW0VppgB9W5HBXTK6UGPVaAt1XP uWSglF8tqQBk1tZBJnZdN3tNQBnBwlQDDBWheD1Sr2UplXXzc8lAKdTIo83apnllvfavASyynqxU p5XaOkRKl3SZdVnC/7Egw0wFxQxKiJPSkFy9516rWa8s5m+HnNQW6ivEL+k38npVBddNr3y4hHkS WBW7pS0MqMooLUmnocrECoN1XXIpEmO1FLXgSrtQ70cKBhWUqJ2AsaiANVBzjsG6omzccGNLqjik KBpJgJXkt46FBzMw1PCuJPF2pbBYMGwL+Jw3RlBCzndJJQ+D9bzbUr4Ap4XJ+EOnqqjcdOsSHBiI gwtM2gvJwwkFQ40b05erN/zmoCRTHVYIaklUqhIcRpVBXVxdeHdAdQH1QpwRIC+oNnH8h6qCaogG xBceslCAGupXbfEmD1WJMESu+5ug5gwUHUso9rTG0ZyiMIY6BibUEpgQqHn4f2sYQ0tr+JGeoP9u GcZgne4SxjD48+ZD73/wA8fC5wObRw69OcEPHPmJ3/q/P/Xpz/zxH3/m05/6/X//E+tv4R9uefg3 v/j3T7E09cxTX/2v//GR91wHP7h/+ht/8XRD0vibj//L2/CR//kTf9fkz5/8o3/9Tnzm2G/8eeOZ b/23j//Q2/A9t/6Pv/Wlr7Ig8O1vfeP/++LH/rfvUTK2f/1/feKTn/qj8PnUf/7Ev/vx9VvSuG9e OLL5EM9n4dYTX5exD8u4o4lxjxuaoYFVCZjHnAzmCXc0j+6AkpQD2aGW0Gc9Ie0nS9prJu1QKwJI O77BBRoVKIuahfoqven3Z70LM5qBOtoOM+/HL/wLlS8qsOZFwMkainkmqj4GOBmKUxKWhTKsnDo+ IFPdipPbWmNwBz5B/906tKxwnWLLTv6z9AOLW7ZZ++Gf/z//5M+/8Bu/+HMfPjKw0Q== Az/yq196UvQhX//irz5yf2uzf/qpx5t4/O/+8J+1vPHnvtyv7Pnyz6/2NPv+T329TSv09U9+X6PZ 9/6Xtlbw+eyxrNnKpwY1e/bZT62kdj/z5OB2T3wkNnv/nw5u9uyz/3VT2v3cN4/X7ul/w82OHLe7 Z5/9wpEu3YXF+Tma7BeO3+zZZ//0/dDukSe2avf1R6DdR7ZIxxIOBS7No1s1e/bZn4d2v7B1u184 He06jO/RYeb7w60nNP88+cPQbnWL7Q37QUfw17Zq92/pHPzYFi/+6o/yudriIHx2jQ/gT331eM3+ 7ifkPD/wh8dp9tQnpLtwez8zsNnTf/C92cU89ieDmv3n5kX/Z59p3ZWn/qDZ7HnPe+jTLbfk7z7x vc/r/az/my/1tHriT35ira9Z+PzAH/599vLH//gj622twmfpkZ//jS8+HljWp7/6+V89DkKFz8oj P/Poox955PiNTsHnOcmqZrxQG9c6PC/Uw8DanPuYcK+nn3stSpQzYMOgoq7106hoNs7VgxTNkB1l 1peujP/PlQlhHr42XCutrks9YVxHhnF9XhfbD5iK9u49Y89xDUV79ux9/plnviB8zjzz+XsHNd1z xvPPPOvsc887//zzzzvvnLPPOvP57QazvWeefe75F7zoxS8Jnxe/6ILzzz37zH5jWejsrHOnXvSS C1/+iovC5xUvv/AlL5o696zeLsGYdt4LX/Kyiy555aWvevWrX3XpKy9+xcte8sLzek1qodn5L7rw FZe8avqyy6+48sorLr/s1Zde8ooLX3R+aJh39/yzz3/xyy66dPryK6+6+prwufqqKy9/9aUXQcPn Z34je19w3otedvGrLrvyqmted+1M+Fz7umuuuvIyaJhb/vacec4FF1506WX7r3ndzHUqnBitrpt5 3dXQcN8FZ5+5J3Z31vkvecUrQ7NrZ5WxLnysUbOh4fQrX/7i82Oi0D3PP+eFL7vk1Vdefe112vqi DJ/CWx0aXvHqiy+84BwZ4d4XnP/iV1x6+VWvmw1Htqzr66+vqxIavnb/ZaHD815whkz2gn0Xv/rK a2YUVKi8/obXv/6G6+vSm+uuvfqKV120b4qnjK8No3vtrPFlfcPrvyN8Xh8aOuhw+pILXyjtzjz3 RS8Pr732OltU17/+O94YPt9xw/VV6PB1V4UXv+jcM6UdDO/qa5UtQndvfOOb3vTG0GFV2Ouuvery S7N25734Fa+6gtt9R2j2pje+8fU3hHbq2qsvv/QVL+7YX9YOx/e668J00/jKvvHF+WrH8w0LUxVO z8B8X/bCc2Rdzr7gQlm/Mqxf+MT1e/XFYYd5Q3B7aT9CQ6ihivuhQneXhWmEDZbjcu6LevfXWcX7 +8Jzzozn4Oyp0GHjvGg5Ly/JTuoZZ577wgvDMc3O3+zMa0MzOH/npJO/5/lnhWMP5/nq175uZmZ2 Fs/zFdN4nvM8tWC6Dg0vnb5i/1XXXPPa19L9eCXdj+wi7aGGF73yVXjdwoW7bDrct33YLL+YgAzO f9G+l1/8ynB7p6fDBb7korb7Sxf9ghdf+PKLLr74kosvvujlL2vFB4Q4zjn/hS9+yb4LL7xw30te /MKpgF9aMdEeMKufd/7UBeEzFRDWAHyFBnjAbPh5AbQanLgXmsJn79aW9z342aLRyX8mjOtJsUEt KtdqcKLA4zCtUHizpPKxXN08g0BNamJXA49pLVe0rVVh+9hVBC5I/XdDVYhTWxcmVFZVo9MMxi4M CQJ1ujW5QMTuPFT8Nj2csgAXphrDzNqm+aROG7Me6PyA2m8NJkc1jcrvyhbHY0j1bFWacjqgRl/X RYMhdSbO1QaG1Jrc7yE8GhalrLZ6FMpPa8cmuCK8TOmi49tuGv5tPswXcl+OlRnOGeGFofA48cJh +kH4aeWcW1rDj/QE/XdLzrnQJ2mG6/n429/13vfNz8+/7+B73jXnen7Uty38ix//hY/+6q/92q/9 6r/95Ud/9Afvu8NmP1///kd+5ROf/bP/96//W/j89V9+6b/83v/xw++/Pv58w7FH/+DP/v6b0R3y mf+fvTf7bafZEsPyD/B/ICVRJMWtu0k2Ny3cF4mSKJHaF6pJNkVKJJvqJr97vw/OIEjyEj8FyEMe YvghiIMMggQxkDwE2eDkzQYCBIYdA5MFA79lJoBhBBgjExupqt6qm71x+X3Lvb+5d35X7K4+VXXq 1NnqnDp/9c/+/B/86d84kV7T8z/9X/7yr7Vek7/+v//hf7ag0Ws/+7f+/l8shxj/5T/4Wyy6Gu3w b/zdPzPwzvzVn/3df/0Qvf+T/+r//Ovl9//if/8v/wS9D379p/+rgYf2n/3D/3gSRgNo/rv/w5/r G/yrf/5n/83fvBTHHx39+//dP/kL/Lbmf/lX/9c//q//vfeoNEHi/t/8j/7eP/qnf/n//L//37/6 l3/9L/75X/zTf/Q//of/xi2hIjD58m//7f/iv/+f/8n/8ed//r/947//3/7nf/vfekrrlueqw/3N v/V3/vRP/85/8O9MO1cJoyWkL+6fnu4vU47W2+H//VEKTEMp6YQr6+RjWispTQUlfvmckTtH92Id h454qe1GLh3xft+NnDri/b4buXV+xvvnovoe9L/D6UQsTSVIIuWO1gGN+Ns8MxXgbbgZ8Eefm7gF ViZb0GeMNIYrDsatfIzdDSx/YtGEctCEtm1i34Ik7JskdPf/1qfCnJn22A7kH516CWzPmQluV8Ql ZYLLleHQ24GzJTAykjeGo18JSOnl37O9BYSqXRfD25hT3+TCRcrwwkVCayVQMo805dTwTsRYJJ5K I50bqJXy3c/qU8BFaCmQDvI6Kg25U4oEr5OiFZHEfotaPBUBHJ3WNiOArkqieDkMoPpQ6lu8qV55 Cm8MT1JieJkCFGjRCdir3Lf8W7RAlCFizdTJYACX5m0eQx1wq8G/GikFDZKkKI3CCcil47QWdCom IgAYCykqEgeSQt+YiiUidAKZMnJjoLDHIokkmUgaQSbT6MZSpfHERVFA2qSXhwGlELxqVNOYjgDD AKnT2sbiMqrtSOiKTseX26GbPB01Bc/pGJHWNjZBA7boGBqs7BY/EGTArkymHN3ET7pLLqhppCkS 2ktgWwLEwzinJJWIQ3OdiCUg3cBoKYAe2CYRBwIW/kEBYwsIc4Og7wS80R5d66rZO8pTYJ8ARSch RQymEuga/Bgg0bR0c38S+y3unTj4IqFrRgBrN5XSAVQfavaO8pROih1qgMLMApJIKH3Lv0XDXxki 1kydDAZwad5wqSDFJSM0oHwdPtSnwJqlpZt6Y6CLVALuEeggSFDqmOTfIj4SoialaUbQ4E9E2BhA 9aEGH8pTmoYdit4DBWgS/CXhk0piv0V8KEPEmqmTwQAuzduUl0hFLkga7gAxHYMgYrR1OkY8DlqE 44kIlU4pQbfipOPy9JJgNBSxlI4RBwYyHLjlxzGKjFCplOSYIJx2JQYFx8E2jEEev8pHiUgK7Cq7 caFY9DSdkD6CweGxtC0mwLoQSVrnMgmTsUgS2hl2H8cAJihK6jEWSSdSMMje+qM4LPIQT8tR0lAC pew/SkQSKTqtYJFME7ajg94gQHHyJ6lUOm6LeLCrkzRN67NlHBEG3HSpZBJjxZIfsiQdS0v8QrPb lac0+IumYpJdk0qk02IgosxFqCT2WzmnjqUpbTNgu5AwrlEDUH2o2e3KUzAt2SBSgcaSCvcUOY30 Wz6ll4aINVMngwFcmreTI/IYcg3D28bh/8CqK2QK7n6aBNSGlQxJpIBCEIcuPzKRRmYdXPB3F1Rn aEhV6kKpfykvUcgnkSBS4uAoIOdsT84dVzMxHNo3qmbi2OduiVcrpwLhvtZndeXByp2Cb2MxoCpL 0pigab08U5/Gk2KujOi6BsIgLcpoglayasACJbCHsocdiB9S2xamFMTEhypU9SFO5upTGuoDMdqt AQoEdToma3XyAOSHsp9dGizWVp0WBnUJA45KOYlrQknUSkuCLkmZyjmY8gIUQxJlpEh/6OJB0vGE RNVkgkZyBLqXUP6eIV0j/7Tim9Zl78FHp9Agckm1BDBjRa6/ZGTsGJpFBpYEgmBodhgaKDo7RnTu GBk8hqaRgRUl+rmMTC5D40xnw3k7A2OcEpLJDA1Td4+bzLjFtO8WhsyMdU+4PqvxSMo+yDpJNpn5 nOWnl4v5eDRlKxzfmvHMjyyPtbcwgpGPtHPBTZtAy58DRT8cxmoD4C9cFzP4JiW+aY4X4N/L7gfb m7skZ0uBXwhD9zkzZd5Z3n0J2BwfsH7nFl8WmfF4BCh8Nhz1pJZtjhtH3TH3bO6ec9M+FzVoCtQ9 AAJvT8P2sxHACOc2+kLTGKB5hkBYdKH9IAHBcz8wYxZri0AYf0AR6nisoCMQ4oSJpS4ApVxOwSIP NaBbPYZnulyvNxxx7ndWQCAEzvqjIsN3uWlvNOXcYbcwWEyYOfaFiAvbz7j5fGQ2OgRC/qyy6NtM oj6FwxfmPAI84xc//cQhENaflX8Y9dnpTwCtHM+CL/kFeOBkIvne14Ll2fFY7I8VBEAmAXdEpGuw ETRUveXdYUJWYBeQhELm8Bcq1gP/K/6/ytMJq6Gu17NK0WLPCfjfBAH/S6P/So6ZrfeMbw3UNXhA iZMF2l88IU966x3HdLh2JxRMQ92GEj1736RnQotsCkUhgn+ThIR48hvNGWeLqOs4PLlFVBaGMw47 nPY2t4PR1obSwmCLQnIB7FxWhcT24FN3IuqW/wOPrkgaWDBAa3ZLusim+8ZkiEZc1HSIFD5E8mce m8iqTccW/3nHZsy2TUeX+nlHB6WV2VjUkUC3JkEp7kygLaegtykC3ZoEdJdCjeRbD9VQbJqhMfnz olGvlwjmIyM3GdnKrCgtvpEtY8EVPZtyv5uiH0D/lsp3RS/AIIHiHM0D3fwHVn4bLUr6eGU0Bso2 bF8cMqOpW2wgPhVPMqJSk5DRR6050/u0/qjACKMe/gXPfbKWn1Do7/ElL7UFQKzcDlGxmTQ1FdvO 6tRFS+zAnXW73H4MDDQ1sm7UqzvrckebDD83mEsRSN3FaG4yDYsP4fSssWY1YSUU40Zgyz+w08s+ OoFESFOxYHcNjX1IhooaBbIJYiymKm4uPA6F1MzUXx4MWCjHB7BJhBkBEyYqbg4YECaRL0Q14LJA CggDrgflkzvaHs3HtsRBRohELCE6ntz+a6Y/WggOV/cXHjm8hyRNrTXywpgFlvba9BVF36+6n1Rq UT83JRdXVDkVRy/Qt0YcTKxQ/J2L/TFzsZWYlr0T2KZ2vJEbeIucsMRzM3dryPS53y0xlMtJl2fc LAyemjKmDEXTyik3kZ1xPYHvGaMZ+kyJNAqAjVBUMp6AfxBJIoHOe0j5fJuA/wsRF0+niFh6I7Ei 9MbIq0dKg+uOp4gGCJnrDTn+J/QAhhFIz7gZ05M+EulnxowQFKUFjEdGDxQ4fYb/lA== vhEfdMcL/pdhpgBxcUfY+mb8NPWdn/5K+Ola6P6NMOHNgnmdM1xjLouFSep4LHiDXjBu7n26mHKm bFZpuAKLFXE5lzuXTjIEPQsTesyYrXUqTA9ohuLLuObdLf5OBisGHKKoWvwpOxgDE/JBwzd5GNPE dqDSyIjdxyUWOwPGLwfsSA0M1GdjNGUFI9D38OHS4Jss32NFOHFCN3jsnX5IJfadZ5V+0JCmi0mR m42Uh2L7CfcD7GWOnsLL5OIETeMvb+WXv35VPgYGn0g5UuX/WNiDjY62anLcHx6/IE2ZBfkrZxXw 5MGUV+hffgNmQfxGuQQJb40mfw0Gvz69dDs66nfGtv51Nd/523f+9pvnb5HUr4K/xRzu6e/MbevX xm7KxsDnRjysPv2BGy96POdm3Xn40Nx5Jr52TLIyJlGSCItzD3EoyhQQT5dpW3xX4/gR8l757xh+ lnHn+d4QSz8pjYTZmPlR/GkC4pYZL1jNnpeeSx6u3zD/B7LOwhymEr9yIUBbyIClwW9dBJAxaAol f6OCgIokqTj9ywsCYunq6u+yYHuK7hrlJ75rur8uJveb1XS3yibIb6sv/oGHhvxB80BDfdhhEa0/ VG4XIZLmDE//8tfI8/TD1/A8/fB/PTzv1x5ekJJCCtJEOkXE5RBTMXMrlqZgCTYKBSAoOfREBIal ktSvKMYgHknC1EldoIFqDCiBBpEYzD39FUQbaEvVbVl4/awT2f48HEVNFLjxmHEDXifMGB5sdfZ7 +MQvGD5hOeg/NvXDxgSLJZAmQsYJlFtLxShYLTMB9BHwZNvnDNsPk/pl+JYoRq9RrmqR46csLywJ 0vz0nRuP3AwPJD2gVmY+Mvc3LjV17HtU9Yk/wtjfIuS67yxA3ISbjpjvPPd7yNqK7FThh5J14iYD islLKP95wrjgi3v2De3gb80vqW+p6P2W1z32h73use/Lbrjs9B/4sn/f7sbrnvzDXvdveV71h69W XrDg7Q8jboyON8V0/D9O3fIanrLHY2QsiXJ5xGssEYVB3xu6ISsh33spPbnPa/cNuv8KrBwRoRPL i0durpb+TGiIxZJUAs6TlvLgRTTIfsp4PEkk0uoTMzSQv3E0xBOADCiMABAaaEgi0Bcbg5lgFHqC 7kU1QwMV+U1jISFd8ZqSMt8QEhIw1Q15qGWfdQJdj2CKhBhUx3/LWBCnp155K6KBTNJi7T0x9w88 EbeOGRri28HBNrSRn2sT0eD/IIpS0qGGuInQDRsolUG6L1jaVmaI+zbE88dne/xcEkTinLR4gCXJ D7DS8MArLnNQ6YnZmtO/jTX/9fsZfq5FFw8nCXifOhIK4rLLPDJOwyRq9YnZsid/I8v+LVf9t3Qj wZpOWTvD8Q/f9rqcMeCP0XTO8MKIc0+4hcC6Zzw7Wcz/SG2w7/79X9NxaZxAx6XpGGLfKXjvbSwR iZEpeGJKU0v1PH5NB6bkNw5S/CMmCzqN8luSwCKGh+jQYRImKVgii0wDwkhTqaWLqn9VlPFNGP52 KUM8c78cDAR2Dv24w6UT91aPE+ZgXaZzDobi9Hrw0kXTQ/dzrj8ajHqM2tTpobtyDQM3EMRcDils 7GM6nwXwBpPxaOJwPX+thG9E7VLUPlBe3UrJkTS9aTbXHy7BpL4TDIoxSsSgAYToJQarDG6NXv7o 9GK5VNt3jfi7RvwLqz5p+rtG/F0j/q4Rf9eI/+gVnO8a8XeN+LtG/DNpxE/gKbMYz18wJbg1mszG ihJsksMKj2VSKGwFZT6J2WRJMYxFmUze8TqTUvRXE+zGOTZcdPt+edpX7963vcC/ycCQIxYNutl1 MEz/0zX4TgDbD+LqJYAmev+TS//c1ewtY8JfGDHTHie+tMcIAwOjeLk5LR/u06gaBDzlhwdY6CgT hYagW5OlmBj9HxCWWrNDhqgAosBfsHUcFjaJi8dKkbjy//DrKs8MRnNW+jShROHIMGJyeBIhn6vK cSva/0UjYacsL4NCwT1o8FImIiV94MbnrPsDQqksJvJMSHkClNwuLkGD6AXgSYRfOaBIiqASkTIY sGMYoyiDUpAqj1vpm5DzH1NyYY5EmkIVniMx8ZJmEeJstuhhaI7JUSpq9IZ8Bk3JYQmJuEQDMdgk jorMoD+0EN1Cb6EQRFwJWpDjxdLy0aeyoCpylarJUrQUhDviej1ujMrKIIgS5pGKHonJMBLSkCSS vOZgrZxzwDkUlAGMEbT0GQFRi47V5VUUv1p0FYy4lUutoREjrolE9WoHM2Wi6N47iZzT0n3XblLN S0UfPQIEMTh60EaR7sTWfCVdkI19pnxAyeQvIxJ9IE8Etm9xY3nWhERWaBLw/9xydCvaLiNmPFYo QNotbokglVa3LGDx7iLLzzmBkbcW1rcaA6j9Ysari0ZLbASTZFhDlVzUyBd1vIQaN6aQCPz4HAhM xv0DBCF/LW3OmBSHldYV1kZDlaOwKGwEzDs/GnDv45EyDhnJCrORCSwSk8alph7L3Yn/q0KdMAr/ SMn7VAkIVKJ5CPkJIXMpmewSYgknxJPHC1h5jhl1RxLEpEjPCmFD/qJGW9Eyn0qKnALCyP/004Ln OTdQOACP5HlmynI6xMmxRhKUmMxmkmDrUrQykvyYGzJ6AYEFe6F1QtyHVL6Bi+x+xwkupWxCcZ6q JMK/0TdOQTYix0aRylrIARMpcQYyhJ8A5xypQGRUy+XZxaHCGcRNgLSZ6U/MVJUpKbe6mCKOZPQb fX07ApzL3eWBgsZMFRhJORoyJX2CACnSygwQO1e2U0IuJq8ZCi1fuG8+FI7vDUd9Vl48JXo1JfF4 cevLhKjAoUU2Igq0njASvxd1WFFdCLmnUAvAlIlljVXbVIKg9RfgLdxQKUbeTMdAlU/U4RVH49G0 D14hU2RkN8Sl5iqkPN/jugA4kHDqilpDM/wEQgT9sGMgKefsGIk2DRDxP/q0A/0nCMw1Ox8B6Qge L4ARMQIcjHEEy+g7O7GHyTz3+xjNS9IsP11G7xxKOEkqLkHUPrYTZ5IsWwaje24qjjBZtAzE4N06 XNiQBS/3ZtnKjndizFYPd+kNhNUsKAaIbGesUjqsAcwJ3OgySZNYTso1uhzB9DzDJgBoyahCo1qn MBpJiK/EmsAQzL8GdzHTZYUeKjA3mkzYOT+C9pG/Ph3A/7nk34GEACb8ZMKAJhWehawDvGguxgLc 8QD9uvHir9Q5Kg8p9aGuSrE4IvOZSatT4noL6K0pMXMGVV6XfruX6rDD3/fnjQuuzxq+zLr9v5+M p+B1GNgf/Ki7mIs30KCyzTzz84DYAnysFRCB4z6gOLGN7GKS38J/5j/OpBLT/v2p0PkBEF0Wu34T b/qDfM0maAufCybtoKNHbCaNRND8+o1iZ8pNWQeIGXO9T7bvBDNyy9AvOy9gB/bBQEkHcwPE0WLn F2gS9vPDW29p+TfEBGmJCUfzHzHdMeuE8G1X9be00TM/ON7qsOkvTNFwer2FMOcmvywn+3Z0mBEY 6OaFMg9sMafk+M33BRjLr2gofwi7VBj87lcsjX/TAl25N8gUqY4Q+ktzO9tp/OhkGj/+0tMgqZTd RIbs6H3ohMEoLX/1U/rdqD8fOpmR1PCXnVCUpBMxYI6TRMqgHT4vYTzqsfWSk5kpTX8FchWN5bct Nb5zte9c7Zee0m+Qq6VpmozHvnO1bzuI37hG/p23fuet33pKEYIg4n9YDFa5HdxsOl1uPucmDXYw v+RH76Opk5ktf/Nr4bQtbsH32AKMVP3FHTPC4He/9BAm7JzpM3Nm03GkNxzHbl86GHJCXVhjDQXn 6yTpbvKswPI/sO42+/u5u9wfzZnuaDya/6iwVzRQ1FY5jWqx88XM3WCm7wt4NNjkZouZ2D6utE+7 KyjybQoHd7VgIEx3g/2BHS8Pg3APxLYsD8/axAFxP7D8DB6SCdYf9MajmbvHQRfi7908+w44gc0X 3GI+Hk1Zt4AyiARlppaN5wA/YktYMkBGCt6SZ2D9hPAPLCxu4e4yY2bak9UyHYuKKZWwZky/rxvA BFXn0kxAmHFzXSuAUGnkSZlj9WejiHYZepxYCAHRQb7uzi/mnPsajVMqtQGI6emc7Y8YNz8SuPHi JzBK9gUjK6OVryhzRuQzd6vnIoSGumTKc39Oud4nQKX7nedkWjFpCofBzFl3FwYWS2XyACoSiqSH tHXOCkNlIigq1n3NwvHDP8UvYoTmi8vFfAb6t/4GG1LaPWNmYIbCaLIYM2oTCqNwVAwFHYL3foTh GH3Q+idWy2pgO4afdzmG77th6Ia0IAkqTqVM27gpMH95u9s2hTVHpg7b8vIpHZ1IxBLmLUlsALZN sQHYtlUGsKQLa4Raix3XmDkgvAbXY8aQwAT03kgAKm1BryxfL+Et8ddt6EyHvepW+zNfbzI86AJ8 LTRLFZicAZYcZ4Tysmua3g1HvWGT5wajMXvGSi2xGlmaxq1FF2yVCgcY2jWkJ+UDiDHaCHx50mX7 S+ANBw1HDLaioJBpFo5BCfLXIVufA+DtpCjFYAS7kXKfcl335Qx+ILhbOE2r22PKqSzaPZoiFswJ o7ljtkK5AUeyYCU4+0Zti5DTFyVOf23G6VHTS4lrt8xYvKZV25C3oyYiv4jeiky9gDN1DUsSW1fl fBBm2pd4lBVXEj+CtYnceV78CIlh/UekblCXOtHohIWXmy2nyBYbO8O22NYW3dpmxvgW2zhGuNh8 VYyLX62EcmnsOpzbbCg/wP/NdNQDypi8DFFVi4/ClQSMpiNKJZiYPFL7dvitlBPyo2YR0aCNWhch +wUdgWlALtHkgHr/o24RdN85VG5Wmirk0NO5xNSwkatLq/3WkagnLObd5pnZTBY5VgiSxlSf9sYL PYasvmvNAREBAWffssQK89EUTQEHbjJ6ayXUpB9bNdfBd+YK9XpEXQf2yHw0GLG8PYpMiARHl8NB YMjWaKdGXZPi+ouGR77Hc11m3mB+RGVgNE4mo+8KY5btQ9vdadsCsvYtcYEBHk0/nQK+Vt0+SAkx hayqIkgTsceNJDjamL7rdFBtbmY/VYW5YtzAtDHiZCXud1MxbkTPDOKWH59zU079tj4B9mu+C/QY ScujTFihUcdLHydou4/bgJ5VdcqqOZBrP2JK3dlo2rf/SOLxBl9Zjw12ph2aFQqB3Dln+E95b2B1 u41at/nRBDa/w5yStNUHYj5zhecmQED/juM/cbJeYfKSz0FrEJuRRG8I+mMNUWfVp/qpShbql7ZE XGB4a7asrI4ReLtvzHBhjUTxmzw/d8AxAf2jWGoHvHUELTNIB23FzWW92bSz1u+1mCV/M1oWPZtY jQZxnm3Vs0ztwjqdqEJkte9UFmvJ+rQYNVN4rURjfQxUI5iFzPHQUwhkb5GZif7CEavYIteqFYJS IZgXW4mNCxnwXrROnIntCtAM79ju7Yj9nUMeYbSXKJs9ofMGWG49qEQxc7Y9XEy6Uw== ZjQWluwQvYrr1DdlqjbdCCzaYm2YBSV5zPxXC1jQ1T2CZvmcgesxcgtgZ7i/Fux4zLr7I3dfTP8A T2D5XbcAGjDjHxj3YuqGqpcbW3CoEbKKl45zi5dPgM4j7hsB+uu+DLqT4M7YKWoCepxId0zwrHu6 4H5Ad1OAj8Zif6Mp3mVI/r4P9j1oBZAxHv30E8OPOdhyMfUB1R4ohoxIawD6mPkROhnRUOtToAKO 3qduTgYz9kkQONDbFOal9Fmp4//pP3ELPYAboTdazLmIYxWzx49mmOEm59PAsWATsdkAPW4MSxFr NNWs2w+6EDdCUXkvmZ6FkWx25lvFej2VKLEQNnwZP7ncfwoe3h35ssx96DS2fxku5PjqZJh5n3pO K56Q31ccMRFhj76plendTO6menweP8k0nn3nOX7RS1bK1HnKS8bjuwQhlD5K7yFiL5d9jRzkDkMz ISecUVGXN5dteHi50em88F67auQO42yrODo67pUiEd/7UleN/gPoL1mqeDPJx+q89PFSiD+GQ/kJ 1xDy9dZ8GDymdxeVUnzvrvAx9t25vKUBcdo1BLaXTA+St1dPz/l2MXJr3ineLvOSO/ysvOQyQmQS LIW8i4q/2h+4vAhZlTdgepQGL3fJwjg3vs8MCsN5cZh8JDXoeNsv9cjGV+7wxHcnwgFDFoqv768c +Gv/q1Tv1z2FcOpjL98K707FMdwz/YXLm/7wB3vlXuLKXxzGO9nDvDe2HyxchN6CuaLvplJkFwfH t6e7w2yvx3zCv0bB8qAxFHsmiSiT5Ed7b5nR62m/MPae+MJ88HmRb7T2v+D4A7ns6TDm8tLZ25dc ftrzTYJH59locvJ8NEomo8Iglud7dTL4mSEViL3SqXAL0Jb0scm7GNHPjIpRBqwveX7kD4fYwjjZ nIgzeGh4c8X64e5dOZROCGBd6k/07nGyyL0GD2/7Txmqu/uCwB5PvWBCx/TBLlySJ/qOvppCPB0X PgN0WCLN236DIF92z0tR5nC/4gk+8rAXGr54RVBQE5eX6O7U4+jv4HHlUPrr8K58JjYvhspvIjDq gaoD0r0ngsfH5RBVOnk/kuDcHR1m+x8Xr2gllQEDeJeFhNQLaFQ4VQbwog6A9B9dw0ZsHD1LeAql DkI12PUncfqR/ujl26WPYGkQPfsqM4xvr0B3b64Oa6XOcb497M3zzb3eeb5NxcDq55MvD7vgm/5j +f7tZKGgSKRaDZm+fqrAUuMIX5MX7IErDVrlPsInAMsEgse72TtxhSBkl7fcIYO3hfj9aSXH88Ob eOb87gStUCox4mmweAehYIFLv+pRqZ04jncZT+LCQlAubzZ4tPBXSmOyQJwmMuCfKjES4RzTXS6X bc938u3T+WIZlbqVxPAuL/w974HP2oCPfUVGeT2eFtdptuLfnwWKQ/r6sdwlDg9KLM+HCLZ5lFUG IqJDQUajmu+ckojaDsNvFbhTzyKl+keSEfe+uKCp1tfkLH/5WjivFAenKYI86/Yrxf7kATFPgzWo Fsb00Z0Km543jh4LtfbukW4MLi8YBXtZqn56WdDV1SHkMDFikLnjlkerb9cDf4Xm1dlON50OZuMX Ooxk6wI3KI6EEQ25ZfipSQV26zV1Vlk2sz8BO/k6AMnrPHh0+ngqd/r+DPhYDLz1Ng6q805/km+9 nZaio/hOWQQw8NXofPuce8/dtutMpZy6und5M+dBCgMB1yAhi5brSqUT8Aylr4k3otwDZgdilIeh h5NqPvnqEfLE8SKptit3o097+Wbo5EkcIWTMLi9izfj78Pj8MLQ7us+32/shTPqQRHdR9k2bT8q6 TILl2/uaLFAO9kuDfIzFOL/yFqy+9L48LJ3yB2/LX4de6LvIWbI0aPN06TRw36p6q6dxovKci8G3 HJBd74tKvvc0ABu8/wWaXD4A8jnB3oK5ZPLXO+hBxZ+mA+VwaBAvFc73/QqTih76OnfD5PVLPw2I OHcE/qkUwT9FuLkqefhPQf6ZhE2KFfjPFXxxDP9qAW6paQmfVi6Vli34z7X8E4FAjbEXLeXFiab7 YlP5p4B6EQeQ1wATf6LmRaX7ovxhpWAA+1jpOa/tPo960Q/0WAFWkn+Kb4syHHEgRWXOTQ3Gjkqa uVSKOoxVcsq4C/J40DMRbE5B1pV2IVQs5pTRKE2K12IvCkRxKIfaD080EHPw7RF8dgSbJC+UF3kN MnCKEHvRrpsjslmJaPS9mK7gsTp/0yEb0BBCm0jJ6itsQdUVymnhXCtDamkIBF8II4ypdGJNO+Iz hcaWSMmUkMReVFJqEM73gfpTnFBhGYFizwXdXNBfaBnFtVQx1tR2oJ0VtpHUGSj/FJtYL+p7I2Ix Xd+m8llVmVpRnpW0zVSM6TaaiHTYwZGyXyoqlShvRThGzAxDtNqLOrJkTjMec3yqn6n0cq10gFEO RskKI7UmtFlbGXdeQbSWRWMv0LiKeg5zISpOJ0NhIUrpeaN+mePn3ut8a+Hd0Yo3Dtgdgp9+nJQn UGU7jQ45L02clr+KUCwdlHrF4gQYCIVPoMOMvaMEZgyRaWAMnRVoH1ArA1eYCtU+XQRxAY23uwGq bcLYooOqHZT7onJ39IhJZMVWg4MKIoMFGq4hoGI8HmomROzmbn3+Qqk/brxUSolHStdLMvvYqABt PJGL3pRq/ulu/uyhNdW8Z55p/qrWyh2Gkzul0+BuQmOfAlMYqoO4ygZMWBwthe57iT0oA8tCM1dM NQoC86n9lW/WA8+lLjCZDUCIxrqq3yPbLyFMrwuiHjyfRa6CJ7fMl8sra94pZiuaNwTVAprSZXFe fux736m3w5MSoDGk8kD9//DtsFLa3JRQ6BNNDVEOWJdLsvZcYqbVO6iDf1bKJLBbW3SaIkhun0gO d1mAE5o+ULQ5vR2kAstfNuhC5bD8HFG0rAgyBV1eU2PQqSkIgSWTNy/sWWlwJbSio+ZTQdo0cM4x agdYSdbWrSPb9u4jJlHEjfdTcphozBmX9zA4y75V/IOzSJ44bD9Sgb3XQ1k9xfFUeg8HTkQCuYp9 cfmzu/s9sH2CX0toWzaAXF7cBMKGAmyVSr7EKrv7WloNhM+7o7C6AdKf7FkRmBL9YOWtc5wuFRoP n7phgl4ko+r9qRJojrNo/6o+icwpFfbrwKrWj9b2iUqd5omncj/VeyVOP5ka9ZY9aIoWH5HpT8YE 4JbkKWJcRjtL3gztZC579rADLLChR1n9DHTBXOZb1f4HoLEjnsrdeNLi9gjtRcHqH/kXFAuMwf2B +Eohd2TRkyF/Ma01UvUWe5Y4yb4VxtPbIjFIF+uSo2PxAPbIrFArxBcFwuUlQzeCsmtfIoBvPr3m 09mzsPKiLZvRx2/JZPuAJU5rO1mA70gw280Mkw56hhhb7nv9niWC1DmEAIehHj93i8NnTyZ4XO10 NLAjZ4XP8+Be8Lg5iGvX4LXwSR151BeKl4YqsZ6ri8KYLZDFkefJBxhq4QrsSmJvmC/3Pr/20Wqk P/h0pfI6KPsq+as6YPDVK9EqIyg6vy9x5/vTArDZuuno+fVzHsKOqX7JZXrJky6v3FLevxpguDvC YvfWwooENNy9yDsq7d/0uMINnDgw8IEseSTIavFsrIMHeHKzNr7FN1q0MCoOn4pgn9Pnb8tg5011 9waPH14OpCbHX0DFOH/35L5Oeqy8iL5FPtWdvbu8EbJ2G4KU0IZehYfSIOJJiBg9OuUFov5UPVRE VDlzynQjIgc9pi8I0FU7WDt6jlOY2kHVnn35dvGyVYpc98O5zMXnCFCyIrFUyhO9v/u163towj+V Q9z5Ip+Ojg9UYJLLEnoa/JfTNpTXb0BKdW8A7B6lSm6ZkskCBxanFXsrnZ1x2eLbZyEO1An6slTv Ba/AszYp6QJS96Hi+7ASBuqZfyfVys4ey90o8Q7+eRxlLt6zo3K3vf+lVWRocVc+pdr7e61KZ3f/ utJp5ufQs941Hvy79xOsX3oH+mprAGI5URgnr4KYciMKI/rQn+PD6UX+6qA0AFpfOMPO1G5Fdy+Z 8lxUAg/NOdCeyL7yohE8Orvol/qTdEjtGczP7wdiYv8ObOHDuOaFbxgdsq9vsg6DyVfEcGpVD9iV /dfcV4HMAoYU2y2HPRFaPzVNu+PMIH92ZtQE6JZyozr9Fc1SS43GLW+l8wn2YvPp9LncO9lPlM7q nla66f2o5ITTxgdqJ3GYZRoqjnb2wLpI2zBTBqMozEI66pCPVKLD3O3gpgAXeYZrhxKwYPUlGYjm E7WXulZDpSUfbCo1KjDl1wp1k7/K3nkxJVhaxrS/dCo04QkYHal6q8+d/LR6w1QOq6RfB0wiuUg/ lx4+58dgC5fO89ftHNAtcc1bGlkUKK+Ng3zyOVvMZe6+Rsm7WIzNt/PcEslRic+vQiJAP+antYOv ymGlJ2CkcnxExxQPPGwuK5gN+M+zhk5O6sYEQu/ugDGw7zma27svXHk5OjwNtRVl6iiWb9+efOYO j2cXgI/dRM8Oy11fwrTRLRAEAQFKw7zCjiAqa7uVYv7lHfwT7lRKzXNqGYAQynHhdg30cnWQHeq3 hTJX/UyVIwwczlPpGegUiQuA6OOhukyAJ5+1i8PEvAl1y7fZQeFjPhnhsO+O4kBGXAvl4AE9wJVz 8E941im85m735nPNdn1bpJunjy/YdCELjnl7E0DJKqoV738DMdx8a/40Kg32a+NUgs/eocOjLPva HBrQCw0FWB0wnIP9SrGQPoCK2gXQ6vJ8mXl78uO9EFQvtyi97z4/APPD3yv36MBhnjg+negINsve UL3S6fnNPeCltTCg6aeqdvtkkNNYVLB69xcD5OmtzoFuef9WOj2KUeXXy+5LadCeRlSw8ODmBBmX QBBkTqWjOmAqLPPIt3T+kuvN0heJzilYkuk1UDXLbXjKk75+1+7FD1ENAn8NFRULgtj9zMfmB6X8 9fS8VO4OOkfLvYAmcX/6EkgS4qrcu8ul0A7TYIwQQo/04/UBAxQZ371ORqBZ0TuV8324BsXSqWdA GPaSeFxc6gCoPBmAOL6Jl/OJk0Gj4j+rpjHLyWKnOiJ7+fxFOip4ZIujo5MUOp/Bz9fCnk9laQ+A EiGES/U6tF+ihXGJPXzdyTevHi+AVlQ4x0VeOj8BqsEd0JQkU0I6On3Mt7qzgXiARR2xN5pvMGfF CVXJhnYUp0ZaURtFtCRvx402dPbvlTszeI6MsIMLBVFraI7g+cQzNJlJoEedtcF0b490cgHHQ5f2 AuJ7C1T2n3zXwF6q0qX6ZBxDX+Crr/kmNa6+PHK+zMVr9wtI9oZvaS+i0QDrLZ8K3UzgmcWnwWEU La/LMV3eL9XHwVYlv3jndc0VTVFeafoKcK/zSgCpBsGTu+Br8nrg61EH/OKCCtAfx1T5sFah3jzh PFV5ybeoSiEK+Bj1FksXKeYsdCm+F1+1s9dUaUIUkJVEVc4SV+gnVeof5MV2pdrkmA== ChK3WaMxZNl071Y6DgY7FWqwkDpUmkc8pH559w70w/cOakkfVZ6P0Kk2PNKELjb5SFOzhWEvsf1y b4cGAx17+Eo5dV1DZIHvl+RX7bqBznCzg8n+PujggzaS4orydl4apMsRoCJGApYS987lLQcvfUGw vq9hq5bH0AQ42wM9VyKWPd/lDseVgI1u+aSyQr02A2V88aKcfstzw8uD4LHwmFblGZrQkf8q8FC4 auYuoqPdzKHqJhH3fqzSGUdpoEfT41zy/r2cT1WFOQygCFf8p+HbInkzEdQzTLxnI3tCUitFowIJ NUm7kCyLK6YGWAFHZAcLlpdiJxQJyR2Uopgg1Mhmmv4i0y2wF1uVSu49Nwa6ersvoYW+vEU+pYMF 9AZdZ8LvnhimLENHnshcvcTnEzTd/EB0znbp+dn8CMw+EsUaj15DgCpLwkEy8xpsIQ1dRbmsKcUC 0xjg6HEmH/f5uDR5dxbF0VZn7nNC4H6ndHb68iWyR43sigNFZjADguc5Sme6l/u6b11ey6+B5GvU apXO/CVcyfnYdv56zH3hqp9s9MqhIM3HZLuzmOZbu8Wj0nuC3jkMLZ6BLUYffx2U9aqhIjIUaSHL F0m0CJJ119wPHuWSOyUUkALHWky2+txhdbb3GlbduS5vpt/vtTMUc9AsjMNku3r/eD8FyzQvqD4A sQngm4vK28tiCEN4fIjLSWqebvWJOZNPhSM7QPqE7wAd3AAdJj/tvgvq2ToO8ZWaoANhLHBHA/Y2 30q8LsAiP3iB8na10L69y7dvkm2EO6D1QeylP3MfDTDzyZ3G8Q2x/HZH5rIzQsgThxcz3BSGyCr4 Dtulg1G0dxh6OCsAGVCHq7E/Ejeuoixinl4d5uXFUYzw92mhl788qzHIYoeYoDRDutop9x7Ypyxz x32UouUPb6Wc5kbl1/vhDbBf2vvhB4Pmb/TN5dOHSHftRuXZFHYlMM9yUEVMFM4DgVFyWr8K6sLJ kBQThYKv6q3sPZbDD6n3QvwuFsZWX9ly9NcZc3L0XGKBgSQcktr+FCgHR9lu5vOo9DJ62MU0JQwO 0guAxJ6YgYhdFYe5PtBhxsW7PJcf+PG1unreBXpEIZVvPoY4dfZaWwxQB4y78JV7i50RsO5eEsii VxmlpufHFODENRgbEeZkr8ljOnd3FdxHqrtqf4o8OQM0849QfnriaVbe/C8U3AzPSHvEhifB7rwC SVq7pjP3N10wF7YCNJyXt6oXkBoElQVcnHiHPtYA6OA5jGuwBJ3ZfXEUr5ZId4Ll82Aa7LtgCOyh tlDuHdcAsJv92V76pvy0l36/48G4anGo6b6K0VdghH9yLCe+6zJaS+gKBwdZfEZxvh9cNyJ8jmbd MYOl5hg241mYbcdCeLz+agd92xnzzvLM9N0i5Bk2g7GizFwNEpUucYA5uGCGMBrfrSY4+5s822cH o+lIE7AL4HAiJvQJuTiS1FhUu1RHvHTXimGuZtNEyUCM0B3NJ4x6XcBy9HRvNuMjQw5FxNs2wzJQ UoRhiD1sNoKpBpGuTZIWbClFT4uN0hF4D4MVyDGeI2Y+66502Yr1ZLDLcIygwSbircHWPfZRiDR2 vUEilYiodxEZT4RX8WgxQHxRbHL2hPlYGu1sZpE7AwcsUgSvi41PxU1xj6+6EVA0WHSRg0WbMR+Z gLFLK22NnbmcjeFg0mC6EO5Yva8lkTbMptItuRFFQngSRSpYtGsnpuU4Gu7sffIpLRKMmLcgPdiQ ncKrFizWssf3I0JvNrZMJISNOP49YkXosDdBLj+ouX1huTtmzFrBEruD2eSMddoFpIceSqWew5tZ LHK4xH57U8GKAkGbwXg0G3L8Tw6QIV1JbpQ7BZugOxhsR6/c3ACkWM9CikGIcyypxBa9PzinfZH4 prgsMCB8uL5dmEgK+ImGKzuhV8Ax5rB+qeMOxtZ5vNrGyk43JUweK9to07TH20JDHTseHW/N98RO YT5UV8lCNMvlRG0Bz4Dp5HaCBzaFuszIMjFwMJ1H+uMZP+CmVttHbKayXmOhDbucwKQ7PYmY9Sws uoJVpp0WIm+TuKptrRCFg7bWGsFMiEzZd0A7ctKj4T0Nv59FNLcxmEAakz2UxmbZCPC0OSoMIq2H wfiFCLwoYMoK1lltoJ0wZIDay1qIVdSj7t4ak3ZAk9D2a9KuizKjpKGZYEK9g8xYG+f7vGCrPAG0 c7P+wgJVCIx8q4LVsBEowWL5UIOexW4Su1pMe+Y7CcCQJRa6DsIGmK38VuFZ30kB241HlvmpoMm7 XqEzzu8FLXl9S3NZCQY3ZmaWAn8Ska+b4+ZDWRGyhehMxiE8MtMpZyX61QH0Jj9+mueigoZQWo6m FqgGbVROaXIlkMV4AXKnzuwyTlUAbXAAP1GB2klsoONijYXrasFdLxdpMk3TYSpC2liXEJXYyLS2 cV5u6Da4/qt1W4V3AF1OxRrqEn6Vd/DSvDOgqGgxD17ACzTa+E208otSu7TcxT2jv/cO9TuZqfY8 /gaZ6+jasxkj8/a42gUql4bl0qtvylOAIkVhi6kvmjzbGwlLCd/wE3jRmJh9bDhJ8b6QuaoFYuNs vg8Mv4HXtqm7NLvsNlBLamurnsFVE6uhwUWR37lQfjX+xDD9NXicKH3GTy7fjon+fiuHfh6na3sf 6otYIRVL0Y/05BGlgyEfGPZZrcMWef74qJsPzS5Oc2dp4ThVO7yLVLjH+G2Zf34kXN7SY+WhXTnK H/XIg3xymvAUA1dxIbYHQ8G6USIaPKfih1eZbOykPS+UBunqZ233+ogpDYiHY+UtFTy6poeeQKx2 5AlHfdee4PHnocfLkmee0PCj5fLCB5VIrJEGfxzNvFIHw3nseBY4nIEhn06kITPXBemvt9MTNJdI VEh8gb9as6UmYH5CqjJtU/70w57LC/BEohlcqoPin4X3FOg5tQgeVz37cYESzmWwqWrsLrs7AD+r Y/DtQ0mec0Pg+azwyL9km5dENN7yo7GiTkEvYrdV8jl+P2yEDDt9eS/UTDulqY+ox6zTLv8aDd6B XrTdSp1eFAK7N7Nxw6hTYfeVLph1Wju+Sk5vdZ3CXlC38cB9MNu7PDfqlF+8ZfwH3kPPm1GnRIU4 OTTplN7dS2UHaUTJBnONPzwTlXbhynCmO5VZxns5Or827LS6yzV0nUr7BXXrO23Ez80QfMM/96hT 2GlgCb3VnbuYNzH3gc/i3NKaZvbA6kvdNn0+3arG28nqGHUKNlK3rO30hX+57V6bdJrpJG7671G1 U5cX6/Y13L4w7TQZHbR8xp0eegK8kAkKxp02k6+gF4l+l+Yq+I4fSJNOE8OAr8BWjTuNB16Ch9kJ NlOUxq+uKpPY/aIX50adEpWzq4JJp/SuN5FKnJh0+tCBhz1cu204153q3tF+gx3eGHZavUrdmqG3 th/2RIZip+XnzwqgMRzBOwHBlwshBB8sdVrrTBJfBzMCdJqc6Ttt1C9epE4fwn7dTF3eZCISeVS7 1cz1sUA0JldJ407rO4tU46GXMuz0cszW1E7Bumi7PYt8zUImnT4FiVbja2Hc6VnstVGpnHiMOgXr 0q6P6qZzbZ3T7TezTkvELfGaNu60Ed5t9zsHWdSpy6uf6+3rkWDa6a2f7czMOj0n7sInBaNOXV7Q bTl4l0vxRUMEP4bar6adfuy0GwWTTp9p4oV5C6JOIY3p5npxM/rMeC9Chp2+vt53TDvl2BP/u1Gn Li/s9px4KzdKxgiu3JA79/OrulGnPH8R3pU67cYCuk0TTB+UY6hTl5dkduZVLVfK8ItYkYCdhpY6 vTzyf72W73Og0yNe12kwwz2EpE4/0wdqp4Anw269g6cdUZRThQeyrmUQ10T54qkKOw0vy9SL8N40 lm2CTotzPXrL5Y8I6hSui78c0rFCXz8ocaXYXqZ4pmWFbPAodfEEO40ud0p7d44eajXQ6alH7RT0 gjQpqnA5FOd6krmK6BD8wR2VP8VOT24aDS16wcJ+DDkkU4EK1Szib6n5xENlpl1Ju1h+v9j3xPqT mfHbeABsmuMEa/aWB8RwPlLfarll/KFJlA8vy+L7JV3g8Yho5GIUervM4B9PiMb1SdzoLaLkxzzR 6J/RZl8XiXPPXcrsbZm47NWvzd52iFbxcy5hbPn9U4ho3e56zN5GiHbu3G/2NkHceL4i6ludfPEQ /MKTlN4vc6oacXvjORLf6rdZ/OmUuH0Pnxi9RRh7ahB3e+m82dcXxB1dLpq9bRKPu8kXs7cfxMv9 44GMsaX3z0ni5WMQMnubJl5vsjGztzmiQ3fS6lsdjXV4MnJwljD5mvGT6Tfq3ORtd5cs7L9WTDHW bZFnVzunJl/3OPLikxqZvO0HyIePs33jt4nXaTt7OH80wxglND2+wOkFekv5jv017du8J1LLHYtv 9ZyPmo89h/HTD/UtwFgxfHCNW2D+fjtY4IQLke2J9lk8dA25UgHQHVswMj0l4/KE9Oaic1+x0j5J PiBbsvRYPoy44FOiUixEesViIXoWxO23N+8Yjicm9of1vBvzIVMQcTlo5zypnC96npr6iOjR/QLu jCfAHAeH6uqf70ZHR90A2EU7ZSF1lWlqGC6/Q/mOmmFRjEA7B+PyeKeJIbRzOF2ncF1Qt/GHe9St Yac7lX7UtFNk55h0ClRbYOcwuD6GzzX+8GbRaTWcxjrt7+/vqp0i7V/pNIY6RVaShGCo/WflTqtj DYJ3/Hin8dae2imwB8mIaadI+8f0sZhurlD7fzbuNP7wZNopQO+E0nXq8uIIBtq/aadQ+++bdcqa d5q6gNfEmM4V6RQmnaZqUKfomHV6pVtTlxfGlIakAaC/JErPLK2+cbusg3ai1tdwBDEeaIrtRG5B NWitQ0izcSsLYGn7noqKh4S5LiAdTmQuMm7VHZ8jQzdkSPnnCTfWAbYhUmf4bnoLTiGAa2UMV5CS m/scHF5R9Y+pHiLiNOH1on/ggt7hSrDUwaUymhK0/Sqoic735PIep6s3TfBg3yv9w9xjGrPkLpM3 Lmj8VCLLL0IVm64yZHinl1f6J3TOibiRbTGZHaszADRY1CAQx3whOmRLXvgPIMgTom49JNRElC8m gwqVQ+I/Ej5JI0/gFUT5whrlLq+KeWmGyK42nF/TYz8/9M+1bv00Fh9aQaAnnxutIL5+ncWBPHjR pjGaH6cscUz2w9ivoMn8skEH9OnSIMsCWGgTYpfnIpJ79WG2HcoiBuTOg4p3uPfXx7zSn83OcTlA FrEBsmZaz9VbhNMxH9BzaKbpQKG7FVkP1PnBNKoYCMzZj7GewD6iS2PcPYTm1qOR5Av6R8Idcpwa 4K78fOsxY9vGu1I0bAx2JXhKnjU2nFp4Vzc1ZV00qCbYZmRfPE0wwDKYbnNiP6t9cVbqXLTk/lom WOHzbtO1mqkSQtyVMWNKr57t63R1zTKVog4oEKEF7hdzxHTMpTTBzm+iEuUolCzaJw== xpRc7QobANOKfHK2tOu61Jdov2y87yrQiVQ3XUl0yrPwAV3vPKRwJb8JF2Qq1MuicKZM12Q54T/S 0EU39JUi9zUz1HJBDbBQwS8NCR9X0HRcxKAYeZLOX5aneXllpIVZLUn8a2lJPlM8mhU6fTPmtU5Z D5jVvWAmlkSNEV0UYq4zqutb1XNVvViyWl3cFgPN+1WS2fPVtqA9faY9KvVqTngxZB11/bYk169S hcf0qfGQlNHAf9T9Yj6oXVNZqS6d9fpJOj/A6OeepWKx63j9DBQ6CWMOVlCHLIJlOjdOiQE/ezUG 9sHerklZuNdaAqYVKOsBE0ENfF/3W8OYVq/bEGODjP9xaxiDPG1tYJJfS/bDzI+/VMMVkbDLSxXu X03Z0Cra8XvN1BR0eZdMCWMBXYMnLDWHho1eU5B3ZeH+c2cru7IGz0DOLGlsyVAOmGIntpc9azgy lAFuJD/M0nicm32GehTATSdix5MxncJsLnZMQTMQY3sfDsW51WI6EIULqPbLGjihnA4EW5floVhv e71lmPkyFlDzYwHuSlN5Z2STo2NJbZCR/EUYDUl1Z4PRfNQBF2DKlh4SXQcmTg3qRZjaODVcOvZh tkE+6nZqh9WQcCsJDGq+uxUGUNcxADN73wkD+Kg7ZQAuG08S9TIP+lbh2IZDQvIFUIKNrqCnWkmX 11Ptib80Jw8KHxXd/FDM1epENXS8IaW9r1rl+hU8rj5/bYwshCowlxW3uAWyTDe4gaxcRpZ2i0eW t/jkFG1xUyPNtdyBiXcptpfZ2VnJl6DiTpWVk1MLO28Vo+KEFN0E9h4Se5csmBrpczo1U84/OY2d 3LbP7exhK/dGbC/9RejsSgsHh5n2dAp6ueUcTMjlNVotjHZ0uvXqfp8T8nQB42Fwjr4mYhJ2vj69 D8TEY3Nq6a8xYgWYp8Hl1SvTJ5nmXKdMx05uvA6cieaqtLpfZmdaZXod3J3ckF6j0aDrFFcThGd6 TdiYInAxaLpfZmdaQbje1I4CaGrKmfgKXEkdiF74mdG5y2tB6Zkrj1byrTchb9yRr8+SAZwtSbtl tLgcIUYn6AwRY6XLynIfYkcr6kyw40iX9YGed33qUaxIyUXw1O/A3W1vwt63jE4njCw+S593tTlZ XdopHngDYOv5W41Aubwbbz64aUhHPNmSVuGqBfybULy6+oGDTXcOghI0giKf768AJ7T6aPRnSQhO eDXfv4ncQ6AijrQLZycVgcCyvnnfVk8YZH1MzzQc++MAMHtx43Jod8GRWRz6GJ/xKbNfXpf+PuXo JApTP604GjBcEgGRki/UXsDTjANFzgFHu1E5mtm6OOFot5xTjmbvgYfANuVoil0JgG2BowmfsS3s fXgQvwYnWqKx5eiHdTgahIJxEM252KpwIk5HY372iuBETc366JALHslUZKwL4F5ruGRBq0Mh7Ogw aqilSIFe0laBFs/Bkm8cPnWyEPYHsEXwom7IhDBt3F4zu7+1Psg1ZbJG5/sA2Mpavfm4YOyD6dmr UzbzMHNgS7vstjNcNTWsaU2mIK3+xqq9CMXMmNN6e+zhrGdQazwkEI7T0CPrbSiCUjahw/gxS2nI 7FSDelnI7DQwm0bjtV5VGt45jT6ysvigjbUdbxaiZABsW/r985eRLDTwwVoTGrlj43NxJsWYnfMt SDEARX9itS6cLUQQITjEVmZF6uz9taUhXLCwpT95dWmY8Yd00hA+M1cD8DhYB9IQDORp7ih0Sg3D ALM3PkmEIzM3SDWoVDek2ekbMBVgpP1WfNUQmOne1nJ+J7u7wzvSdDX0Yo4xejvGJVjJ2/AKUWom jPne0nUtUoQS1eloUA4pYmlzSX5LnWCiCvcPYZ1gWoqcWEEs6WKu7h+sBJOTyLVLzbiGHnPvqPn2 MiaVYsTQNlon2hYCcyRaDM5utJnCErBtEXHhYWffiT/Z8GxgaSVtg2/xM3GTzd4VrIJvcYowHZLq t0SDMncMO45VVeUZEa10DowtC2kNxMtYLofV8S3TKe32F+VKei/3WmkfN8tGOXTWGXR6rW/dHDo8 D2g5g069vWGzHDrrDDp0Wr2FHDrrDDqTbMGVc+iClhl0Srbghjl0Jp1KGXQqt9wsh846g07NFtws h868U5hBZ5otuGIOnXUGnXb118+hs86gU/L4Nsyhs86gEz0km+fQWWfQYefIfltD8qlkFOxiZbNJ eUAGMfDN/S/rYBfHQ1KcA2aWONB2HKUHal1MZiGnmJ5s5sl/Kmn1X3s8mXt6mz7PdvCkdTEZxSk5 xZNO0C/HmWkMLvnmFuM0PE24jmN6MgIF5Ys1cTqen0XenKLDaGZoOijbnALjIS1nPuoPc2yRbjok e8+VBZ60vMZRytxSnJIzgn0trxQKYpJdW36+NDW4VwoFKSOnsQNPrwO38WvZ2qJ1OfFXgak979qb YeZ+dRQJCZPdnAWD2CS7mfmLnXt6YbKb4wMXnYsJy3stOwgGsT1wAGgxCAVRLQtHhggOTJvNYGnT iDq/Bpgun6FLcTolQucsNqJzhzy5Sy2s18Bxiimz09lxGUZiOUgy1W6+inUCIzwXW8G2h15IanXH mQZjWsch1HVDWjdJFSKm7ECdcHBi1a9aSDZNHphtFlhqvsU8vteFtURaJY/PTvc6wJ1WmiFpYuB9 R6xpEowDVVqTmmYVA395bZCiaZ4bZRcDv0oen7n73On6qXl8t+GNgSmgIjpQBnLfOTDzE3MdKCVr wAKYTb7Nahgjt4cxfbT/RhiLbYYxreNXvCJSE+r0XrPT1TVqI9j7Jgp2zT5pV97sttlyZtlPDkDY MRy0t0kHmY/vtY2NPUVTmp/Y7m5ZdzbJojrZtwbgsgdxLGijCCxW2gwjUCLb5c/arpDuZMRIvihK jWmKm+12tUWGPp5/DXTYp8YeuJxEHsAJxVfxBui1SI1deeIv8To9knoR3ucrmJmmlAyE50puizXS 4/BcHsxcNc+IcubecaCPfdS3s+Mhlvbt9TFneDJy7+iI1OV1hKfV3Dumniuz3DhzT4PFkJY8MpjF 55guxSGt4pGxzrBbySNjMST7vFcLPGk9MkdzvUcGpiTZRUE788hMTh14ZOyi1GJ7Gf/exh4Z0Td+ urVAvsnpFiKIwNTi/tUdD7oz8cnp5h4ZuOY6jwx2MrJSGprNIbjOI2OYv3+6DY8MzM6ThahlRLd9 qjnEjoPkHAuJrFWWo8vK8uzMOg9V3dGSR9FMWT7b/N6wk8yV1y5SxamhETu5SZqnjrq8qzh1zta8 N0xDyWBygW2kjy2FLujli7O8ulXvDVs+F0N5dVvIgfRiASfrRg+eOUwh2TXzW+qS68ydoLa7V/G3 ST5YyCN9+pNU8MyGGJwJuvvWVu7rs82Hc60SU7d2PpzB2SsAtu18uLUjVFfKh7OIUN1iPtzmGalO 8uEcZwtulA+H8TEsI27b+XBYzFV7zVQNg22oz4fDraSVUzUc58O5DDPi9OuyaT6cQslKDgDMiFs5 H87m1BfPF9tYqkDxZjhnPF/McUwkAGaTTqtDILoL2vhGCwjM/ERnhYyvlqMTK+tcpRvHkZD2cBxd a2F9wovgaM3ndWdlrMSvlsl1s+ZdpIaWRdH6DmAH6QS6TYi81scH+m1Yfi5aI9BZ8AVYBrQJsajO NTOrbFIxJD+/o9Bk35ejnWN2rYw+x2o1e9FwTQ0CG1bXxmHK4DZuA0ZwNtuGMhRpE25ydweC48iW tr7rBsFxrtqbKvYih7ldumLG7rYpq+gGMD+dD0vKF3NqUlsa1DAH6dowfWE1Pna3zYzUu+1lpN5t JyP1+WsrGankTngrGakAzhYyUiGUbWSkQjjbyEiF+WvOroE2zl7TLphqXxuditpHLOm3YYdfCu6D z5RNaHarubNt6DQVTivFTLN1NkyF03pHYf7at0iFs7wHfmupcI5OEjdOhcPtyuVAkm2lwmG9rHRN /WqpcC4nN5aslwqHKYbIejVVDbuChX22wo3wokR+0F8ovFle3af+JsSl0zeHUVUQ2Jf18Q/mPpZ9 4yYOZAhs7sBcc6TDPOgvGV7zcEFMYVs+wDG4Tcvqdl7IzKMWIs9EOJjepgUGpbvre7W8Okk44Dnv BXS3h0F/eLFw//VeElUHh7XBG55wKtzxHJxlSU+odH3nCd2+tjyhTr/tOWjnafhXE7YresJnnQS0 ku4/k5I4OuI+8SHLZy3aZDe/RbJbM0rgOJazzqRanIJvj8MLoGqT3fzdvetPk7yzwLNVubjXsFbu 65LdCvSlSaf0riYtSp/s9mqZYVf1JIzmKtVCrvIPSqf6XCyLym2HnhdtjpUuBewqd411qkt2y45v Lkw6TQwPcncHM7MMu/jDg1Wy2zth2ilReamZZ9h5P6O3XfMMO8ai0yqRMe2UF95Pd3Wd4hl2nudd +sYMwSGrmdb3dWsKt2sYdY/+klc/dbHoW7eU2l3usk7a7VweebSRkCYt+UXnE88ih3NeUkTljQu+ Dfl14tT6LjX7kFudBtvcn+jD5LX+VNE7umYezczU7aTzmjioY5WzvqrZyZDESnn8dlLFTO/JUWOu tlVJzsi7ZFopz6aSnMOl8+2sFnNlURfNtuKILq5vwyJyOJ40oHC70kEROcfz016IbHAPvC4w32J+ +vBw0yGJ3lGrQdkGUzoYEuKWdvXjnOOpEX82GpJSWdI43HWNbDqjEWIZqVvKpjPB2Jaz6Yy0UfNa nOtm0xlNbelWjY2z6Yxy6UzPK9fOplsp83HtbDpsmRRv8yZea+NsOiPjA6PkLWXT2UZBbyWbzkwi bzebzonXevNsOqNcOjSXrWbTWcT2bDGbbpl8+lXLPPG1sumM5Idyr8LWsumMWKvhqehG2XSaIUm5 dJh3dEvZdEa5dGI2xzaz6YzWT+vp3UY2nVEunVnVv/Wz6dY+4V0pm85BfuUWsumMcuk2x5hN7ZzV MOY4m84YY9vOpjM6RhE5/zaz6YwAuLzbzqYz2tuqd3Rb2XRGuXQWN1GYgbDJpjMCoOUw28imM8ql 09d83DybziiXTrP3t5JNZ5R+Y3ILjSk6VjMAdTccaie0fjadbkiyAbhaRqrWAMwIS8k7/pKhiqGN uHOYSGdWptI0x8hQu6jb1arUod+82plUrc5Qu9ioXp1RgTKndRPs69VZ5axh52J1u6qVjvE01Itv mxt1zKdmX4cWG5JFvKWDUnVOhyRGd1gXoXWKJ/PNbHjLmQWebKvPGg5pmcOAQdFrsEzt7SKxvfRn VLWH5Nw3nUW0HH/kxA1mWuZupWiotcvcGeS/LBe6WykeUTM1qczdJr4L52XuxKwBm0J3GzhjxDJ3 G8cnOypz53KUYbhpmTtYlcm20J3Dy2zNy9zpKdlRFOLKZe5WuBcOyIXdNYkBky9nW8uzmJ3pMovM ckUdJLRnrraQy3PmKBbDLunRg95uFmsN19xJRLPLPpFu4xD82dmyrFwPMfZZac4KYQ== QOwk19y9og9Wl1HkXzaUYW269QWdRlNimY5hqbNVE7viet/w2tFQSOffVjQUyv7fNE4dZj5uvPlg 4L11EruijTuAs2pOrVH2E4CzcW1XEcry/lunTuLqhSYt6iRuJ7FWsiygr8G/lFj7wdqcJTlP+/pg CWf5lfYaHgR2YMrMTCtNmEbutaaOUImbkUFtvVd9DPXt8pEufLZyIoNp9lNu03sVYELW9ioY3myz guHNmhcE6Pb+LbdxoWpUds0okWHVGkMQzuqJDMs1IBCcbeRzBvW3Z68Lx6K0liZW1WW/DcEGsbC/ 1zjhBbrX8jYEzzbNJ5IqsZrWuFsxsctEncdiSJxuwzUq3JnWrZZq3G0oOqUKd5tnPjqpcOeoUt7G +URypbyNt6FlhbsVK+WtWeHOoMqMpsbdSsCwEFAlewJVuFuu97qVQAsUpKIuw/p8DCh3Ninpqppj d+8oBOYoF9ZSzZH9/ABYfGPTBWCbNcy9WDnzcdXEWsXXp4ezeWLtnc60Nq+TaA/H+SVV5tzyzvJe uNWSmODNk/rgms3y2w1Ca4oo7uLGWoA53IYd3jK/coU0JikjbNUkJoQx04ywrrn7biWzHWFs6CBc 0EEwFhzXp6Nd6aAI1/3qSUymdmWHd3QPnXUSU8YfQXLWTO6vluMKhmSZxITdN+4wx7W7dOKKnlkq hi7nOa6F+/7CjEps6tEZ1n3bLM5OO0ks1nrTHFcAzPJqKo0OY5fj2hVWL/dojrF13ZPLK9mJ6LIG 1shxfbAUebqsZ0eDckgRxsJB9sCr+/c4cT417E9ag4bA89R8T0rSO00/wNy+Nvwn5wn2Iqcwra+I cvsisUZ6D7OR93XDk/7SpKbxAunl8f2prcO2Q2XSJmXudvZdXtM0PH7xFgnjtKEtc3dIvZtXnNPV 1gProskSe7TK/fsgTTslKoOLlmmnLu8+edrpmeX+9a3qsBVaWKfa1DRhd8hi+XBwV2oQfPy1N1Hm qsuHC5gn4QH0HplXnAOrX0kTZrl/9O7e9YR6NUvCe7HKhxPiGj1Zl/tXDb3dmnbqY/3JoVkSXsS0 U5cXdNvwmc6VF26OPaadenIv4bZmTdm03D36S1oGlzdQfOxPHLQMvC4mU9t29O7Xa/n+UtdOOk3Q tEwMJbqTxCTM23nO65RO2SPjnyyJzsqC17Ej/PxFFXWmfmKttmpwGvRUMgqbXK+KWdNXMXExGXpI Dkx1/qfSaqFV5kMC6q72HsV1s60q1rfxOK/MUnIQWmXqztVZfE+l1UKrTPGkVXI3yko7MDWuVs1K s6l3sExPRqCQrw8CWyFOy3J+hvVdzKMHrVLcVorSAkMyzeLM2oajOx1SMfK0nf2SNQ9sVTLslqNj tewqsMyuXssr+ZjNa6aUt3Ad7UNIX/tp/Wyk8vOttS3tdTk1gMtbOeV5CK8bUqNJdjP2a63kH4NZ gGsdWWujbmAW4KaeZZgDqL+wcyl21BliVryy0dwPUzaN03LoH5tptL7aG7l8ttOlvuzcuE44DFPZ no3cje1YD8nl+NQb+gTXvezK4C5ogCyLy/AduOx0PpXP1AxyGG1ZGb2Dce1Q76qqtxnecrZaWTZb vQ1VZHOWCmhzz8FKOVbdVe45MK8Ut6Mb0orauGZIWnenVSKgJJEtUgG1/H69VE6kKfWrtlVvHKdy 8kZpOjrLYgVgdtldOCgkkS2A2VbRcTQuuC4QmD3NO52kg1we58DsTi5XwphtPZ1VMGaRkLaULmyq HZrnAGpOrNayiJzkACr3kKyVBeg0B9BGG7fJAlQRY50DuIo/ef2Kegolr5UFqBmDRQ7gchUzM5xs UlFPyRVdKwsQEwSWOYBLWTam6Nikoh7i/GtnARpMyDBtyNxGdpIFaKCZ3BjNCupjusSDb1CUT63I 9i2L8ll54bZXlM/UC7fVonwux0zDJpfQUj1ZPkn8FkX5tPWSvlVRPgd3qW2hKJ9NDPyWivKh+pWl +QZF+bRDYg13r8iTc+J47FKDLer6WVu5Du6GclTXzz6Taxt1/cRMru3dDWVc12/FaNs16/pZV/Vb 624og7p+1hMy9sGuXtfPcJm2cjcUXtfPOszENnLYYV0/61gpjFtuVNfPUmE/20Z9MVjXz86n5NTA t67rZx3PpIm1Lqxf1087NX0htzX8loZ1/azp06g6wzp1/Yyy7rYQoaqr62e9ca3yK7dS/EPJSdxa +pFpVT/7+pXO6vpZ7zrnWWmblAfQ1RpYu66f0bhUabdBNgfTcVSYy0E9Pse5wNZV/bZUj88m+dNx PT6bun7WUKSckY3r+mmHpM/OM+aWq9f1U3aOYVU//R1E69b1s05PEf1jm9f1w2SXASrlddm0rp91 VT85Y2jTun5qqpSR6r5GVprNnI30CGPdcvW6ftZV/baw91FdPyen1ZvX9bOGotbj2zzvwbyq3+r1 +NYpzq3P5liu67d+3oN6M7PxHd2r5z1YV/Uzt19Wq+u3eVaak7p+1uq8kjG0YV0/7bj01uIa2rhh Xb/VtfF16vqZQLnlNrZe8bp+1lAc1ONbZxvqoCAas/GAOU0mMa/qt9aNOgZ1/YKWVf2WT0Ysky1M 6/qtnJW2rfLFWFU/s8z6Vev6WetMtrc2Oazr56gen4M8XCd19My8WavW41vPg7lUj2/jO60MqvpR Wotv/bp+BqdKDu5OX7Wun7VfS/bAb1rXzyjnyUCKbVjXTzdJndlucM/VWnX9rM1215bq+lmfZmIY 26iun2Yll6r6WdmVJozLsK7futGDq9X1s1YMRStp87p+VophV4Axvduo63dsWdUPWRZbqOtnfWKD tPEt1PWzPDCD2bVbqet3bFnVT3uWtH5dPzNPp9nNLevV9TMfEgzLN632u3rRV3bpnBE908UpaYcs SgabS0yJwU0mqnftgmf6zayNUURgzQLvdWmLGnqa6XxYYHGaRdUe1K7LW3CKIwGlCSgpUMzOtCjh UwYmfdZhizx/fD3KReeHp3kyddeifMc7JdQEZlPBXJ52k+E93ufgvge6gjy+19rQEzn6yAezx1/p 4GH2+iHYHn1yRLn8ESXKH+EMUTm7KhEVbtQgqlfpMNGoX3SIxmTwTlyO2SHROo+liXZ9dEvcCMMB cUvM4a68fT1aEHfhWz/xGLoJEC/dnUvi9fV+QHSuY3PiLXbvI97O/Vc8z5ejvPDMZfkFOb3lF52U X/Al96FCcD2HmZ2+8Khfu6xdpAe525fHd8/Bvve+uZfKjoHW5222qqf7w0/vzk46euHfHfe89Xh6 /7L7cV86PJBTAT2L0Cx+8YaWREx7y1fabS+xx/bBsyZnyEGkdWkAbglGIQgwobThCRce4lgJSKmO YKZggqxMHKBj8UW8Hb4GeP4iHDSdKewlHrgPHsZ8OaJSOCsQlUHvlKheXkyE3Ve6C3NXPVJ/x1/l 4FHq4omIVjoemJN4RZRvkx1U5o+IXrIh3W5St4+c94oTmn+i+luxqanSR8EEXI19T2A0PvaEqErD E+yFrzzBR3/Js1dKXcIE3FNUUtPl9YTzsaYnHPVdwFePEHf3sLJm2RM6v695Dr52wayZr5RE3ZUF PHmngpCD7pEHRTJbHDFREs6vk8s2PDxapkqZOk+Bv1ozMvT+fow4zO0XMvCJ6OdOBH0d20tP5gTh j0TRT8ge/dJfH+wB+KIWEAt3DnxfQfgzKP3M+MPwZ1j62YiLAKBlcZOZl3ufX2kimqgT+QnXEPJn d3cvgB/M09JAj5MB9QU+g+OjIPaC2SseyS+KYfUFlC+PNyfyq3pUfQW0sPe8/OKSVF68gqXzjolo 9ehAfYb3XC2GsBewZ5dXflWPAHyHDoBQew4COLsB6kX4WIAX1yT4q0vETm484Gczp8LuIGURPKuE 4BcHQNtmC4ivQJaYAly1kQKM6ZKHNNa8jEIvcwiJYPDzhkTfiIsTbT7Fouetzxj4ug3Qv3u4C98G QQeRCRF9aKiIeZN7eQMLTz+GS1HmcD/zPvXduLyVw3L8Q2WfEnOt3l/hJqxsx8pyuJGWmecSRCN4 onfUBqLMYRHEwGnqKp2qVnI+tl2q96UylWBW96RMv20qWAp5FxV/rV6nAuPOrssrkdcDE1emzuDk 1b0MQxSFAFKTU/DzJiqRffeeILuNegD89USK2m+0+0odp+sUWKsuE0N/KV4FSQYWcaEHqAhnAMqu XJUBPCMGAPY++J8TuPcBMxjHGxYMQF9JN7oPJ+mXLAvArKUJXbIHaC8Csds6QHiAex8wDXiXOazz mSAQiNjJXZmpdAJPZ3DbR+B29oslN1nhEwY71w6k3U3uRKlS+CkIdvRRSF4XuPeB4gCeFSNQUbmX vaPgn4CkMScqUWM3CeAMMqlAb4fs8gB7Nu6H6jzYcH5/Rt7HGTQNP1l+zRwqu/I4h3YW1C6uv8DP SkTlAnBXfhbGO9MKGZoVidLpIUcs8wNghIuLCJgCCTSDYzCri6DC+dHunmdOTcWDKhxUj6lBsBmF r5pKSED3gFLsKPqB9g5SNwh2JxFVNS70zBu/KF0Rfe+0BBrzQVwYIfXl8KSFAag/hyJaAEOwK286 B2VZQxBuNDceIDIVdsGz1EIs+Lz/SJ1ikh3l4pcPL1UAV8sAFrvo9gYFRG2/hu+SeEvMokfME5DN BQXd+ZCAakH4V0R5FlWeASINtcDCzv28uN+BlHrE7P19ZdbDA++h5w27yUDSXMSqz8+AhcWr4AUZ 0QlyaULxwCumLhyWhBZcfVFXQJcmpHcNKiDL1WnBugg7lX40aHwfQulTPLhQikUrNyM86e+7OMAm 9MTHuvKEMppLKN7iX8bj1t2BMT/+QoMDNLZ4y8WCaqlmgCxOHR7cKhEVhHJbBLy4Ib0jTbx3eQ75 ys7SNRLB84jE+ZfHjTqVFiLgP3l6MVmI3MJ0IXTLIFX6XloI8ZJWEcQzDiI7uVZA3FuspHi9pAjg Ba2LIQgrYhB9487HAOayBKLDbzgNdBkSjkoZYwbINAExNFkNMAYN7T+rGHvVYkxHiM2OCcHqIbLK 4NGlLFI7YCAcNlE7+Y7u4ybnMYXobOPyO0pXE6yr2vlDT3vv6MOzQlkPz/ig8LrkFDrP0vxsTXU2 uebn2KPtpXmrad584DQ/u5obdZpDDbDm50K2lqH4np8EoZZF4/4xtEMJdp5LIS6gykBVsQIK7+QZ 6QJAnD4kRP2hcN9BIjYsyfXEswB/RmWNo+ZTTkVR39AuAarDgVZ1QJpESPpZjCA9I6KAiAbLt/c1 OJrn2MntrCAL97gfsxygLqDK/cwBZiJAlUBVCDANwHfSOJZfaFWDxWtOftHA7BPUvarzZwJIWOF6 SDUXxEwErOdqRdXBX1GmLHjWiEr6WPWSgEpXMLaXgTpo9YZCpzy7B7jK2iwGkQkgqazNeliW8YsD SYg2GxHRSvAd3YOt0rwmIO+GFkgf/rynRKPhpD2NSLYYFdiLBCTV96GO1jKI2zwPlw== EdRLrJCKpbLsa2BQHNKVy8I4tZvCNRdkcALNRQSlPXnG48cAxOvoxhA18G4IyTeOINI3R5li/mY/ +1YcJs9m+XZ+eicaFYWng1eRfgO9+5FsBbdjCnm94eTVbYQwy0E0pLrXEXFdQjDpPiD+xezciqaE qkwD0zNWg67NB0BKh3VxtFDQqQYCUngk6zyf8klaj0jxTU6OUgMKfVDeaK+CaJOPdpr7ik0uyGZ0 RHRxSyZlIh5AMUlgmDn4MxOUlVewzZTdhHywt4S426CbHoaMR5CqTVZfI4/i5jN27dYI5MZVDlv3 5RdnfqRYkCFi+oZwjPb+mbjZyVDR25UxfxaSnt2QcMefRTBeE3o/isoqeYMgEt0zeBp2RmJNqoUv GpDK+yVUyVHm4wMXQXiULzS6IOHZbEj2KAp/cuxKkVTSnaISCXf0ejFm+Ut+9D6aukOurCuar5Pk zbTPVXiWbbO/n5e43mLCTufujDuabxXr9VSixPa4PusOaepYYr5Yje9QJMdHevJ4GH6rcMm7GNFf 9iwy0+r49qNbeDu/yudDU/Ile0Lepkq7/UXZ5S0Va88vaL8b+IbRRsmCzTwvlAbp6mdt9/qIKQ2I h2NsGyFd2zdrf0GDsQavb/N6Qp3+EzQ3Wx5/TQBzgQ8eRMl1fDTz6j2w0D+kumt1x5PIpDimvS1v Jb230y6+nO7WgunErFl4O0ve5AbtWbZ8VzgHVix4X+zka/TbRb4WG16VToKtNnj1dZuLzg9K4IWn i9xP2j3iJ4OfSXht18OrTDfnU9WFou5dIObG8u6UhdEDL3G2uR9SWGcu7SqwW+S/SD/02/glnppI og0MLzKuz5Api36CbfLEIytWjiGFZqti5RI44fqGioPtLIC/SM8Z5UUQf9EI9pQXYfUFvL3pNckq r6L4N7Piu/JCtykO0H7An934lT13EcJfvMf7Lq/yKoJ4LmAUOUJkTLVwJSZuI7RPayfX8OcVDrv7 HoSYvZK2cm8vmZHYN7D7Rdd6L3xEov1yFUX2ENk7qUO0XUlge1c3CGwM81vVOrxX5HuBcBx6Edth 3MNzkssqtH9dGEfeD/LN3qAB9stZ3dNSiRMtrcKnvHouJhvtBSpQqxwaQTSCJ0V32kG8ahyp+zMx b+6x1ZfH1Hu+tdgblR/7Tch226RKv7jS8fAaA/tFdm7FsamXTpIKsdyJnlWqdFWEpuVdVCb7OwC7 +wIDfO9IWabcIfcTB/+KiX9pYq8snRbYrlyVAZQWTLbm8iIWUAiM+WYuKkyOS4/FyZMJA1B4ja2Q 1IlIJM22LyR1IlKsZrZ1IakTkequ3KqQ1IlItCt1QtLqYA0/iluKU9H4TFRCkk97crjrJ8FVdN4j z04xv6N4j24N3E8BHEBoVNYBgPEXeydl1c1F+dMPMZ2fbGfn+KQq+8m4A52fTNipVLzWjjaX9/6+ mVdAjPyaXQIsKNHbChes/JwNx/azTySQJaUQJBXxuBc9g0QVEZ+9CJ0Yspvk/d6ZQx85hvld3wa+ F5+JxyiHbgZ14nsJTq1tbtkMDk2NPF0ur97XBWsE4B4HaULP2nEHnXm6kvhZn4WvS0y4h6uGQKie rtzdAQPWKlgR74+FfEXByFhXnVPrKZHG/YovxPjmwmwhoqYLoVsGFBdjtBAB3Pu3jjszgCHV5RWn bgDCihgCoZXGgDyLehDhTacR0aESYGxFf2KAMFkNzR23tbeQFmMWhBgKOYSoDJ7e3UteBy7ki27f CW2s4luINIfoaJIhSu1KXWxhp3pW1EVGRA+wQU1j2aY8qIl28AG/PodI8zOq/Unqeglpm4cOtD/D 2p9aYCFC4rT+fhuI75wg6paKFJMZ5XH1zi8yYVUGYl6YS3Yq6QL3n2GqU+uH4PFcWFQ14dEX/DYi HX3d7CBZ6VOjbsHfMFgQqQ6inaCoDqKdIJ4zJXJh8eeLwIoGRGzv8PBNPEcbvOZU1R0fJtQFMLmP a9k6qxl7cUP2lRc61WCgvMDtk/BefYjp/OLRPVlt7CjGyQVunAARpeibF2H8xSwD99CF4um7IETt vkY3IN1dwHhYBLv76lVgXwXFRt0ZCbnAVVhhj3uU79gPo96uIpKVQBchnCsC8W6yV7tEPynJaHh8 IqXcRKAuV4LK6beoLlEBOqMgph0ReyECeymCGre85VA6AKxJ4nbPUHMRtWiD6E5F+WlHN4aohUfI vlgEkYzuCofBmyxPH9/EL/LJl75fMioeWx75YPuJUs/0VfKi/v/irnQ5quMKP8F9h05VVJES5qr3 BcpONINsyxlMFRhZxOVMxtIgxtZCicGY/Miz5zu93llESFKpoILpc6aX099Zu+8FDt5d/FwPCA+G J4evPqPQ812f9SIf/+VEJMN/fP40X+c+vnohc+vd93+ND7bl8cF8Vl7zmrqNZ2u5Bv/sZXolBP5w FP3v9/XNbhT0uRMcrZzJ9X47k9dj9O/SE6nFT4v4GslBeno2eKskF69wsz/95oe43fT3kh/E//Ak XrUdLs9WfSq1lw8e/iHGC/XbR8df7/rLMOqPp9/8Od0Q1D/oixe5sCivoHR7+SWUeEew8f5JvCj4 fDJKD5rX3zmpJTl8w51+Nfnbz0cXwzvGLx8ekKk8icjG9y59Ugmd2eNLAybeCLfLn3983j2COCdC zI5vLoa3VN3eHjjPF6t3b6iDmY0Xl8ub6fzD4q4TLP1w/NCfLjAhPaNrMM4Mcac/dvvT5S+Lq6tb Jg7Y9Kbbmx0e3a0eL89Xy9ub+d0H9pBYZ0+mL04es4es9J6h9yO2D4n4DP3x5QFdj80g5azj7Ai/ z9537/DxtONZBLA+gPgajZ/Aes80e8K+/4GzC+r9rBOqF94ZJoTsuVbsuqOGtbpyhOiFsfSJhhJ+ wOA9F8KxSVdYUvdKaMOmjSN7wz0Gyd5KzaTAnEzoXsvgMkXDRW+cUJlBo1WvnC3d0d9r7dpklZHX oykyq0o1HfKq6KoPStvB5mTvhWr7n2whMu3GP3Y8gzl+DQXvv7i5mV8vLtjl3fxiSbeW4YCNeC+4 5dgVWs5pqTUbBaihF4HT0tUiMMtlh06cfhk2IunQsoNW/dKIPoQAYZRj4+vuFQQZj0nFvTfeS8Wo wYPHpyPaNLXPSeiem2YGgEMqp1gIvXDKk65Vb4FH5dDerWXB98EISUpz3gmijQXM52QcmntJHOGc ox4iGEzpenQwREtuBdGClxGNI2knUHUQTNpeK+zsZRSCNi1NrzQhpXtDCoRyoTzoyPQWk1WalM17 5YOtrGk0Ie2DaqOwsApBt2lJdslDXXkSzcwFFapwyfI8Ny7tyJpoMibAg+OWvYsMKWhQQ4WsSKmG G60dJym4QjpnZWNMtpQxjcqFEe3QF1Y2AD3qK9i0dOSQ/FxHBXHto/4idBDeGxVFgyNJnhSUR0gM JRoYRHVImUYINJJgJpBvASYTCBIN/WCfADJwE/XBjY360laGpp9MD/WTWdPIChruVEcBkihBnZY0 SI288CTC6pxXVbhpYnkpm/wUWDx3bYOkZu/UEAOywWBCg4lcW2nZcKz6yYzJFvikH8GO3qxH1q2d QkcbcEzbVBbbsNlY03KNs4UYog62PBKBYoFkIy3gSOTOUJiGad4Xi6SJwQhaVjIGI++5EogzVsCi PXJTr4MT9MmFyWEJuARaTMKgFLx1pDkJBLdBrDKhxidFLY8WD71SHjwLvTrrmKZwQV+LQaDandiG NDv85nb1bHF+e3eBTVA2+zSxDp8t5ldP5qu75a8Yw/YnRydfZgS+fXV7d52+yvkROfPi9sfF7Ogk UOJ8vvpwtZg1KdayqGBnFyXi78Rc/leYr2eBCJJl+wfs7LvuRRdyiyc747kz/eRwrgemh9DrsiNx 6XLqTixox5CLNgZMUAPVxiDXMjoZOpcUmAtLWXiSkwOGQ0gVejgIrOS0HPFDIexqSthU63DfO4qO Gm4QaFARb9IBTaNl48Ropv2AsbmlCQzpP012FNhkDGMwHwIH6AkfCgNurQLiO0zLa8TfSseS47wr tPDYoKedpuFw74DIXqbPZA5W0HrhkE+b3nhSeh4iEJEslq5TFkZZszGyUHWKLHRdJNOTzW3uyiKl h0GOczohEZw3lYMMZAz1QE9PUbHQWaxCQ24Xoo7TeGHxKQdYZHoIRmYlNJKdlVFoeG0H0xZGg6Mw smB1jiJ5wyMzJlvbrYjssg2YfhCxECLTrDQ2KBxVCpg9bqzQRbBMIzYrE8Wg0VBe8F41ODI9hCOz Um2qrQhtFPbmFVlLnTQzGhyFUcQqc1S5KxyZMdnaaoFD7kAD0RtZKR8BAiWjzKHy2ZNvwD+tEo2u kiUaoofoI3l8zF2IBRWRTA8RyaxUeaFS1m0Ule/C6DZtYbR1C6MKludokhdEMmOytd2KyC4DwUYM NhIhsSgDKyeWtSoqx3JlhnQSrdAIGy5F4jQeUUpyUyEp9ACSwsrHIE2nxzIqFqzBt2kro0LSGEmw OkeRvK6TGZOt7RIkLRu924qt0ieFOJSKWlPRo1EAU5HtZfP3fPjaxUJCcZrW0Q4To6AYcCxKM0hX OMgjOIUFomMNqJHJHM5WHlWiFzEXQQqH2Oc8IjR6KEVnJubgWEpZdtop2h7AKhyqvpDQKv0yub8J wx7KiDjC0xkinmaREolOUaYwMgLTLUymKXWtx+JNmAAcTlwSwe8TgbOo720BjirYAcf20qIiKxwA ZyQCC2hpIm44qAnmDXJ4NDgqbjyKKqzjhPVMIS1RUeohcoCpnu7Q6qtOoc1p5wjjhlQvCRPsIDOA jA2o8zOZsKU3gdr3CidOopSwDVmbHPfToN0QYt1et6J9RU8V1BsLIKVsTYBy1B4DjoWZOFE5oA1P JAdcIBUnvOl8GUsAKnkMiiKPyalKBuSWolJZ93RblF2eJnc4mimOJkNvqUTCzqnUBjiUDLgrDEKb hM1khF9rqQffSzrxYsZgrW/4g0Z9N8TfbOFvmml/FFTsW8VcA4yCR3xe44iAyq4B8C8w4bHqG7gQ HAblwmBdneNZ4YCORynQ3sISNd3jkIupVNdOIoiIi4RJdD5sMN5elA2eklFrzxsH+cXDOSoNXFHR S9FA4eQqJBgYktwJEVrFizRHZoC4dI5CVlBME8SSJDJnDkJKLVNLUe2HbtQWGnEHYVfFyOxg8MrR QYTHT0daT3cYMBjvLBXpJiif6lQViwRDCf+UetiQ7t5srFpSrZOu1uhGTQ4u4rBOY+SkLGpeI105 y91gLgrPdbFJlxlVGumSp3qyKgQVAAe0BQcuYHm6moh9KJQjzBg65RHD2BA1GosWSqcujSclposm m+4Ci9YFCj4vEJwLY7JlKvFMvevI7NPpDWlTkaXRtR0Uzs19l3Z0FEYIgi5laol2Z4eQpugq0KQT FcpWxc6u81AUdmwEKVGbYrWPjfWSchFJPT6v6+IALGNx9GnLjq+HI/G1FdS4fyQZIw== XGdjIMovT2fXjwzUlGHhpeN/f6Mow2K5i23mS4O1CxYkKa+S8xrKd3B3aErHhBmzPgCJX1B88zq6 Ms5t1S0n0ZWpkBi4srPOrruyt0oNXVlF6x24skzhYODKylm6+aSkFJxDH9qGTHlLxjsDhdI0dtCU eCddlS1zphS6jJWk7d77GB/J0C0OPZssHW2iXMuCIXTyD0lX9dFhYLubDqPUhsPIsOEwwmw6jPID h6HYGqutYWxNPVpslYPQuqmve31O8Op06VJjp8ehoukRlCI5irebCHojRSWHocwbhYJ7QTn5Zn+9 pwccSMbB1s6wM4cTllTi45PClIX3dNEQ1jtqSqheDjves7qEjceLv8Ha2cbX8huMmseHRKRrP2hx fMYnRt09z4h4ugdj+/mmq9L5TmvwDGn2q5rMni/+jtELtI9nu58l0bJ5jteL5eXr1Rb7/fJi9Tpz 2eH49ha8+d1inlcU1ijvpUD9c3gCPe+/vVqeLzYeVf2ftjxT/8tdo54ip7xv19NxelZ4fHMRnxSO RvQvQMwvF9/ezZdXi7vu8u38lwWb39zcruarxRt8A29ZvF3d3i3Y29e374mDIaX73t7x0y+6fwIT ZiNW ./compizconfig/ccsm/images/scalable/apps/plugin-glib.svg0000644000004100000410000005216713246301623023602 0ustar www-datawww-data image/svg+xml Patrick Niklaus SchemeP ./compizconfig/ccsm/images/scalable/apps/plugin-animationplus.svg0000644000004100000410000001202513246301623025535 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-animationaddon.svg0000644000004100000410000002125113246301623025640 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-swapper.svg0000644000004100000410000065703413246301623024352 0ustar www-datawww-data image/svg+xml eJzsvQmPY8l1LvgLzn/g4MGAGjNN3H0RjAHuRj0NrAWSbHjGeGiUuktyvamuEqqr7bF//UScLU7E jUsyk6l2q18ywEwmmbxLLCfO8p3v/N3/9tvffzl98/GPb7+sz8UJ/u7vlk9v33z++OnnJ3z39Mv3 77//7vMn/9bPfvfFqazOhfun6ZfDV/yP//T203fvPn74OX6EH178t3+2vvm3d9+c/undnz98/PDu i9PP/umXv/j1b379y9M6/dMv1y/cv/3h3ef3b90//unj+2/efvrqj58+/vuH85t3X8g1uIOubz67 /6jGL4v2y6ooulPZ/bwc3T/MH7//8M27D3+eP/5/Pz8VrpXV4J/uo//+7ndvv7vy+frx6++/ffvh 828/ffz67XffLR/ff/z03c9Py3+8+XD61Zs/u0/enP7vt+/ff/z30/z+zdf/L7ibbb+6vHv/1t3X t28+nwZ/k9Mvy+qr+ft377/59fff/vGtu+GqKP3b9Vd4xH/8zh3KHdW/9m/3X/3yW/fO799+/uwu y53Pd9TvfjEvrnM/fov/RhdanH72L797++d32OeuC/7HF/SP9nLxP89d1Tdt6V70fdf05eln03/+ 5/efPn08ffv2m3ef33769ObD24+nP7//+Mc379/6o/zv1BOnn83vvz/95ftPyYela+7sv3j3xt18 +hFe2O8+fvfdx8w3C/qmmwnfvM0euDg341DUo/+v/+f7r79+Y/7Bd9kf3n77l/durHG4uubcnrra /5BX/F9uDPA/vqyq2t31OJy+rKvyVLfluXeHPzV9R/8Zxvjtv717++8/P/3644e3NJDTp8+/f/ef b38eZoR/93ffv3/76R8/vPvsRgaPMdIw/urjN2/fu//V717ev8HR467Un/QPf3jz6c9vP7v59/H9 959xUQwFf+SmyT+8+Y+3fqqVdILf/OXthz98/Ce8vi+7vj21tR+Csqm601B2J/fLH7o/9TWfh0aI L8Z/3X9Zjtq7vv6tm2K/+fTuz+8+/Jz/r//qF5/efROmXV+dBvqBl30ezHOUJ12fu9XPn99+4Ot1 0335lZm+xflXv3dn3D58s3z81vf1d35Zuon7wc3U9x//TJ/pa/zEff37v9DV499fuWH57ad3H/wx 4df4yfDVb99/7z76xaeP3//llx/+9BF+RnLot28+/6tbkG8/fPOdEyb+n75894Fl1J++9xLIC5kL vTq5tf/m23df/+tbJ1D+8sXVA//h05uv3flPv/nj/3z79Wd3jN+9+/rN+68/uldu9L93S+ETvXH7 UL//2vfYp9P86fvv/vX0h48f35tL/e3bDx+8WHHX9ie64LfuJd2B+7fff/6EU9atr/CP/60ftqn7 EZ/YzZFPbmzwQ9/9/k/swj+9d8Lqni77j2//+PH9u+++9VfyDl+HK6O/bx/kt3j3H37zgSZJrhPo H/UO/0LfyN/+m0/+9ovqR3xiJ4lun/S34bif3X7yDuf03+JpF7cjvfvzpzd/+dd3X+fPrAf9mv/1 T+60N2b512/8+dvm2vn9vf7p3Qenn5x+/73bVP0c91rA6euP3/7l43dOVZATsKx4+/7NHz9+evOf uMo+/7e+K6erJ6AbXN/+yR01rCO5rV9++De3k3z9KbqV8KYbkPduNr25Y6K+f/PhzacTvr8fsHef P3//6Y0IzTf+H5K39AztV06qW7n95ZfQnOYPRqr/4tObb965rnaq3T9+cF9/+83pz/zWqSy+gOy7 bjOqT/M38C/w91DQo3KtLhrXWtf6YnBtdG0uFtdW1y5l4Zp/VGXjWutaV/aujeVQTuXs2lKuUK7l pdzKS+X+r/KPumpca13rq8G10bWpml1bXduqS3WpS9eq2j8a19q6d21wbawnqKd6dm2pN9cu9cVd pL+A2h21aVrXOtf6ZnBtdG1uFtdW1zZ/K/4y3bn9P7Zt51oP/kc7uDa6NrWzaws+V9c21y6+dYVr ZVfhs+pqbHguf5Suw2fvn4AvBnwO3YhtwqdvMz4Xfa7uueDv0DZ8aoPu4n7R07W+oJ++2Vf027TS /4T/U0bVD1gY1c5/B0d1wqcfVf/cysKNrR/V2nVrzaPa4bhO+HTjCm5oFz+qOLKFG9WSR7Zz49rp yE7V4sZ1wXHdcFwrHtkWx7Vz4zr6cQ2jurpRXXVUKzeuDY5r58azxzGd3HjOOKabaxc3ppUb0xpH lEZ18KM64Gj6tmDzY+lG0T3d3bixq3D8aOz8gPVmsGZsflhoCFwvA3dqhc3PyLZv3BO/2ff90I/4 nPq5X9xzde3Sb/024OIZ3KJwM9j3C07NoQU3O3p8DsM4TO45u7a4tg7bcPFPt+JKfFaj6yY/m93l taM7ix1VGlMa0cGsUVmhNa7Ozl+AjJ9blFu5uYGjRUnLsQNdjQuP2aUueLxktHANuoFacaAuPEQ1 DpDrDxyeGYfHDQ3w6NS43mSZTby4cDhwOdFAdDwEE64G1+04hX1fUz87owO4g33nbv3F3ZHv0Np1 Z2d6cpY+1L5rXK91rt+GcRyncR6XcR238TIVMJWTu5+pcfOkn4ZpnKZpcW2dtrlwIqxyk7J1c6F3 YzPO87zM67y57i1dD9VuVnVL70ZsWuZlWdblshbghFjtBEfnLnFYp3VZ13XbCjf9aydKus2pdtu8 rdvl4sbHSa/24m7jMl7my3rZwqi+4ONHeMAyboDbDW05NQso2nj8pO5w3ckG5EXVjFPcb0KuY3Wa k8DCqQ4orwbch2S+r2YTqnHGk5iacPNBAcWTvdpN9gV0q6lwrpM4ku1lRTHkt5VKt5VBdxIa1cvl srm2ura4wZ4vk2ujG/rBTYDeyRe/xzSu1Re/AzrJein8Fzb/WLfFtdm1aXPz1k2iHpxk8Wuk9TLQ 74Tu+v2adh3izuG+sfrHsrr56mbhtI5uNg5+2biZ6Tc2vyPWfsP1PeMk/wWWiz+Jm8X+4Sa6m9Vu nXh55Oa4l4VeijZu1tdeOrgV4MbA34i7LH8W/5V5nlwbvRybe3CLpvNd4MWBW0Z+i/daQeHvfHJ3 4i7LLzX/ncktvNEtv8EtQr9LerHd4ML041NOfo+6wHhxN+/uxF+WW8T+O/4xeIGIkrtFEelFZeUW vhedBQrSzd+7uxF/YV7QjoN/9IBSw8ukxisXKEtKP9H8iDj54rtrQWHuLsufwwl4//ACvw2jKmMq IyrjKaMpYykj6UdxolHEQZQhdAMIfgR1/GT0RjNyMm48ajpkMmAyXH6o3GABjlSJI7XhSPlRmsMo 6RDVZnhkcGRoZGDcsACOC4+KGxAaEj8cMw7HgMPhh6LFoahwKPwwXHAYFhyGSYZg6EAHgLtfO1+6 XjredTruuTXuwCUpP6grLahLTbh5D4BamNfHGtzlvcZWoA63uYm/oG43oa7n1ARcq15tcCveqxF2 VGlMaURpPGk0aSxlJGkcaRRpEdIA0vDh4IGOHY0cjRuNGo2ZjFhNC4sX1aIDRcMkg+R2rYuOEI0P jQ4NDQ2MDMvEK6TTASl5VaxhKAA1ERkGGgQaAhoA6X7qfOp66njq9gH7XHrc9Tdod1NnU1dTR3tt rXCLY3Nz2Wtyk1u0XrfrnFhtUI8vm8KJW68HLk76Tl5FBCeOO9Qaa9QhCyclNye+vH45uUk2uDnh dc/GyW+vjRaom65u7s/l5Ea1Of3dV/MnN7hBM7Ytp0+Lpm20b6OUs5q+gmrtoscvRr8nfX9i/Z/U y4Ftg14MBjYeWuzABrAXa5272J88gy9oj6zcsQvuMDKXqYvDjG6wo11Xg+vtDS2gBft7xP6mHu9w M2twWyu53y9oWS2oj0/U+655lbdFc6wGHoPS71Q4CivabxNqjwOORYtjQaPhx6MkWwE34gWNwwnV UW8wuv3aX6m/gAotysLbILjB4yaD2z7KZVQJvHJQo7pA6ohfsrgFeB3PbgCFTnUre2bWtgfWvmne +0a6pNcbCsDTeQF9wW1gNktBlkPHS6JFa4DsAp06PElIMrkGZvh7lVCyYmpvk5B1olJqYeuFFs/A o0pLyOkawGtIVtGi62jglSRriUZ11fXEK8o9ZUm1fkCBrDMcUVlZC68tWV2drq+KV5h/4g6DI0om IpmLOKpkQ7pR9Wqa103YzpzY7hzYDg2jioPPo4pieGYR3LqZScJ3RcE7oND1IrdgcTvhPuklrZez XsqKjGUJCypgRbwG4cqiVdUSkauiiGSlKlwXqzi7urC5qVYh21oqVZ2pT2I1K1QjmSoLvmGZ6meD nw8Lml9+LnhzrAP3eU0TgUXqqhPgSKIuupI7Xse4gt3YuN0NRKiin2fw8xbHOKxaWbODjiyNq4yq uwmRXINKK3+i0mwKJKRIPPmrF8G07K7eTVy6fJq2M2r06XZQ8nYg1z7htfuJ2rHkwVlK9wBoV5D4 8bbGxJYHiaAebZJWRVHDVovYMIlx8zIWU/L4cR0QR5VdIT27QkbUmWdU4thad4YuOUJIznqr3c9i sdwHVMwn9oKsgCY8GfEFavPBCdKiJO3ZoB/REpjRKljJsPemvWslKqps34Nbyn4n7lGdHdHU9wou m/uuOW0Pjf4SbZUa7ZaWzf8e1eURDZwZjZ0VvC/AW0B+wqNHoELrqEHp3bFvYEArakIFfUEvgVfZ L95XgEp8hQ4Dvz23wH6DHm21Ee02bwEsaMt5m+DiJybaeRXafF7+t7jToKcJjcMJDUV/lhXQ5riw s6FEy7JGuwQ9mmipDOh+wHv3t4LWDH6F1mqJ7ps6uEuNn1S9aurICa6cTv1pE3vSvL50AVSvSvah NajRd2bKyISR6RIcPDRVZKJM4ioD3N3F0yO+HvH2iL9HPT44MWRaNLjBhhmB8wHCdNDJUJuJINNg Fm+QnwM4/uQTanD8w9hPwEPPA6/DzoOuIz6a0ZaxlpGWccZRBhzkCQd5pRHW8ZXRlbGVkZVxpVE1 TsALOgFjlwj54295ABf2ABZNCeynbdnzTk5AcYwUPIloCvXsmL3qAwSeNThndm7A4GYlLyBNE5ok B15AuO4GxClBE6JTP+DMM+GinsAm+AKB5cCqw1/x0qehH9UpKGNOIy6eQRptGmscaeCBpmEeeCHT CNP40ujS2NLI0rjSqLKB8y9QnBunjpTdqTi37nfbe1TB6NQsDzOoXe9W/p2mHYaq8e+UHsHiXri9 auzKU3Vqi5Pbtfzhfg9/99VLHW7+DgqFbviGn1Tj2S9sPdnxf/jvv8ClvOh94V25jUBicxJ9uzMg V7W5gJx71917EwXkSuPiJw/ogp5PCr51kWM/XdFuPeejBRIvmNiduqkbVSIGPR7YxAxuHUgOFftk W3MwDgy6AxX3eVpu+lnuddn8oAdSd4MVpl7FVmFKolQEqROlGPESORqkKIdSSIqS9N5IbkcjbeV3 LMGtFKe4KklyluZ0yOXQPz6qf9wfRK49bASL3Qjo+nlwrQvM+C9TH9ihFyz2g+F16g== IeWg4szmgyauNXvYzIHjQ4YD5v10d3np7NDjppfZ8jSSHAe95iu7HWrTEG15sunhtod3ktuZeUJd 25b3WzJtyhVwgDu+SNyW8Xy84VPcLz5+eo46o0MOiRa5gp66ZI2gkit4LDAWbDEbZ2qAg0xpiMmJ MTxf3vcaucef4nxt4Yr/Fc93xeN7xeF7eMab5wtnSM+xP8v+3lLXcgO7s9nzBf1kv8cXV/Z/0hzO pd+Z/UZcho14HIqGgJRob2Re4BHq/lz1Qxk2/hc4Fl5T7dSGzoM2K6cSFF5vqPg7HhhcjU1Z+ReN P41/UdZ91dFx+u48OnEcrukFjoXX1MpxGkEo16LUFKrvILIm82Kv+73M4R7SkoackjR40JLqSAq1 mdTaXBhII/78Uo3OmsRVJF3FW8HmJ6CU3VTSxk4Lkbfsu/AWR4++PrI7qJH1sWDgcVM7pFBnRqnI BLFY3Xpt2asRTFexU9C7IfvVyvHBCyILnNJBcV/9WaI6UnFcGH3EqKZQuHGIfjprcmK3gW+k2XgN ZyMXwjbT3tLh7jIK8Ar3llqBOSMqKgKxon3P2/ajk+9+h74g4sZvJX6kJu8OX3FgaKPrXA/6AVgY LeN6mno450+9J0p1EKOCK/5UdLPjWUMo8SCSuOnXQnCr16gLB7g0xLWCRrlCnEsiXRjroh6uWD8r 0Zl44djKxvEV8svOHGeZ2EMrvvke3Z0d+2sx8gIVHrGqJADjHbjotL+gL3SLtNQUiLcwEK/ACyLj X8x/0VoX1VqD3soeAMCbFW1gxZ64MPyOLrG2EDxsgtcyGoGg77oC1EtAGkFtgHcM3yKdJAUATnwV pJEIUqNI/Fq90YGsYyI5r58I4toK4mYOwoYFTckqXFDiVI0DlDJzRpWrYuESBMuggsXCw1KXVxd5 Nry82Ni3gd4NMO4N/9w7OMq9kyPycCQ+DkAnh3dxkIMjuDfIubGwQfWw1lbttbYADuqN5jYpNAit 2cgIjS1atWe9AQVo8NRiKxtzR5CKHQneY1BNp2ZDaoeEIP/OEgEDzIhhGSko45rOabROSJTATNSf 9L7FnI3OZ8/I51R9MJw1nLeNzxurnyneIB8auyLMIQF9ZFAHsgFT6DaG7my6Kci2EA5kD2W3hykg R1qOv+e2iFtAhgTKAHksgw28BSnstNDWLfravaj6onVKs1e/2mZ0xrRTQuUtfwNtq5qe9fupstZ5 LbH1Di15p/X6on+nFg2yap3OG3Rg1NW6nOb3wMHIZ+cVRa+86hFVs67k0K1o5I1ovyWpmXikpjVO u5c4GlkU2Nsn6e0T9zYZAfIW9XY4nTtCe6rK8zDW5qIeP9RDVxR5NR85yEN6+pjT08cv0I5jPX3n TiqjuMLE2mXwXNRXQgruCbtNPFYjVobwC3g/hKiaKEwl3o0JzIYum/pGG7uxI2hz90oXCZRWoeC0 2dOG77f8AVD6iIkxspExa6SL2oaqwKqBUnmK9RFaCagrlNwqBZXXbJ5ULBDDz/CbgmjYRFmynZtz DsVxmymO3EShPzeGYII4wWUUrDKN6LBdVppQoAQDfZMH9p703Ky4+k2x9ReNEha8A1An1LgviHk2 BC0KGPsz4Ta0sEK1sIVGzW1UfrvSoHOJm1jNqhYFoBuJMhIARKLRHe58tAOOHJn2D8KqktNkZvxq 1ETli+3IYEPuFb5GjcWBTzexmbhSWGsqgCNbBWLcKb5VowpIaiDFufzThsEvJhBeoEJYoVLglEJA vdA/R9QOKQw6UTQ8BMPds0Rt0ftJKRzaoOJDIfEOFaGJQqMhLu61Jaczec1J4+IEdvWaldevyIXs 9S2veS2oh61iDpMhDIyBJvu3Zcu3I0sXbV6CTw/OzEX92Jm4k7ZZ2lMV19TBmAWxQ+xijFXVrLIa 1FUTrw1ef+CEG/HS55I2GmOzTRxpuOClBfHaoWxwqx/Qhl91+UuaFFnyY2IbVUnQdlBzyMtNXN+A wrJmEdmKUFQ5KNCQkCUjplClK7lmX0AMqb0DUXvNWz/5AG7qZE3drIeKdqTvqhMUMipv6ggNmLCA OS8j0LNRXMEAzgX5rNhno8GuijKcDL7UQgxZoQXUaUuDJ90MnnRhj8asuMNRkaUD+ziwiRFhzZWc szo1VyIneeK0nsB6ytVkCYbDetiHB7BxUJdQrPuH3tsi7PikPScun+D0QUMAjOdn0X4atW8IyRZ8 QIy+ZWCeQDUFhOu2W2CDYeTduWdELvmHCMHZ4ColT1HFaE5qhTQxhcJ8KtSYWk32QjqV4q5Y2RSa xRTK90QROcCWpBNCFzCcPjjCQO9+NpZSuOlWb5adYgaKvKLxZAHJCAgnTHKHthQjkxHKWIkTjd1o exda1oEGqQcNo6rBhSZOtFKBfhfTNmkxFOOZ2ng9nIuxrU7l40aGOVQcIHiuXZePDzxytJtmR8pV UZWHWc/Tp6+R3OTDx9MfP717//7Nh89vnWGSfdt1XSemCSP3GlZYSFkhhaVnLNcQqWyoMBlUH7VN 0H2ATjFqJbfKtNq0hhvbKzYTeO2lAfqaQhujNh222fyeGWKGDcJLftt+bcy2gV1erqHYQa2DMucq 1DVGXKQrJobWiGMYVakoOSxAQQEfEvDeVG8kzBgNcJoCoJIwopp/QdumRX14Yi39ghpwg5ovOToD gCtO4pxJmQXFbgXHZq8Ivpxzs1FFtVfsphlnCABOHmE7svnxNGNKvVawwFg4DaINKHkEHs+MjO8E N3398eNCA/8VDsiAEnwd9OyQLCo6dojjx2p2YC3YKGWU1G0oSyYwEK07EBkQlcHASdOig8+c60Dp pKKNF5JILa7kRikOOtTPe1ZpKcJCMRbS1ldJjUetvWCATiXkB6CBlw43O2FBGHEfnDkMwwAizVGV kAzBhVjTuukbvhpsMx5aOM4Ku50XlksLA3WnPiszbJ/GAPdnhmESQ69JDJgCgL2m8j/eB3JtOGxm v4DE4p8O2nzYkgfoq/WgbQftkm+g+9W+lQfN7Gg2nKi+FPGoaNvFwMmjUal3JfhXBMfdkWnVaVx8 4Og44f4njXdJk92KLXy01yQjwG8UrgH+kuQAaQ0jwlvOFOjYTdKzs2SY9IxTeKDzBHQEV0aPoxeF PSnSJLVA9iNphC2nRg7CARBoTl6WkX0t0uwj+F5sk6SEgoHproG8MK1KWs0ZDNz+V6Ej+PEfsEQE cI1bnNvaQADACgFucbvys3pFwp0LGiwNkuz0fp4LuPVFH8cHROoCFCuUF0+rX1gOmOOA/klzqedt BPTOdQqq9dkPJadTU4bfHktaOVEu3h+CfAbPD+e/e+ePd/1M6rEwXp/I5yOeiuDtoX1Tds3Og3Rw y+Tt0m+Wfqts0fouMWnUW90T7o4t7owFJoLOTob53bBxO6E3ozfM8BwAc/gof8/ncPqkN7fTYcbm 5I7pdzZvx/qkPJ9WW1WiDpFCwImnFUcmQgLqRfOUrYsopCOTu8O4iiD2FgXfh3EWxa6iqbXJx6kL pIadF2TnAzEOkN5AY6wnQHwBbjpAxhUw7PwAkRcg8gAE658sf2fz92zzi7VPdr5Y95IyKEmDI+sL ceJgLWnLPnXwwsmDS5Q8aBMHJWWQc11pZcoG2WvjQbxw4jc5kS41t0ppQspLQU2Xk3vAhnAF3vJn 5g6ZGOs1sjO8ZxKRjvyADBWr2X1esUeDPOs+f0ghECvrGMFqHNUy7BkQEXhGBBhRsdZQCN+I0Fes rMnMitoOzCM961+tUFoYBpLAQXKZN4iISGYlIxGii5432MBIEjhJBO8gOAtMAQYGwk4RPYklKLEU JejTpB1TvPnFzrqIbYvR+PaVoob9+6WaEi0wFr83GC3x9W+K0RJ/f8umwqBGgpgHyqkFMVgrwWpt xv+fw0ctJqiqgb8YJb5P3sqlbx0lcHWemeWYyekpSVyKcoKjPK7jNC6r0OpG7K3OFpNwcAd2Q1wh R1qPXEOSflMZOBGlYUiwmynPgDm0iEGrZFahTvmzZBTCCEjvr0nQlTseFJEmPW/xaBWDXkN4WqIw IQ69MtvBJcSZY9CrDo7C0kbO2KWc3VmjqSQIKFkIJ5cX7CTUvf0WktC95Ca/bYH52yunnpPB5iUx +Un8CiUzrQHX3ZRovjCNwMAp5v9lytnLHxB7DuW3PC6cxUutvNqqfANO/5WfYReJdhK7i8iJbQsX IAeso5zikFU8kNmlucWSrbg9XZ28XyO9O6/sAQafp3P47HI64Ea00aZbZJNJ0twOSFw3B84bg5YO NCYcHKO4XshnFwuxVt948IvHPvHYF75YT3jwgwd/QfCSBt9ob/LexaE9cz70YjLgN1REyI3H+knF yfACdW85Jb5jDWfgxPgxCvMvjG/nJPl4idmFFCZ4w5pYp9Ocp3pqKKcUEDGMNSa7s62xDSIIQdy6 XduRf6ojVBsYEr24TZk2Z9tiG/CLvNNoO2gX2wz80bP4hGme41WR2S2cbTKvZU5LhLNhq+sC7I6U yDg5I8m6kTgmWTKjUpFo5FINFjFW3PWQrh7r2/kmj/V2g3v+KdtS154c0AvB0luId+XGK64pp1dF mhXklasIRG5jLZYvYdq5q5ykwSs1EyDax4pMR2+7jg0WzrSzcAZQEycYONa8IbbES8SYaOHdKWti C7oFBAo+QXpbGr6YN1HiisZuYebEDdhmObJXctaKtVXUWpG8PYjslYGdl51aLWS3NOr05GA4+UXJ iqEmflMP704DgXkA29UF8Yx2xwEvxVMa5N9+0mEiXevggM9v/zUHVIFR5PiElR8AzdrSpPWn+RQp oUgDURq5YRVJQGohtWiMiKC3lAhaMKvWbI25oIPpSqZTMF8DMtiQe4NaU4HX26YW9YbGO6T7RNhg Zd5GUwt2aYatYYkWBJxggkeNL4S0oEUtMmwhGTG0S9qsIPW4k6HpixbR8ZyliTCRStgsCqxf4z+u 3G43ZoAdzz0AYkw8vKPwiI9SXwhU5bSvneO+W55bZ/GdBn+6oQ5X8eiBCPHCwBmuutIwCmXs6VDn gm7Kfbs7OxuzObXDeRwqA3J55gGI8uRceS6RBqExlMaLRXmcqV/419Wp6fEIpwYTFiqTC/3kr/IZ AxiHoTdxGSD3vepMPeYvfhztKZ/8XT7nqN3CECSu0FOd6vpMecH2NPf8+1PSEeZ3bz58/fH/OH14 ++njFxD/iYe9n06lvU2ooqJshYQYw5J6BH70JvLu7ImRhBPBCSZgighy78TcC7FPLSWIiP1ppSh+ oLpf0P6s/rdHlYsWaLmzgi5Y2OBpY0i0LLFanlrNxkADzVoNGgQNPGujURqt2mjNU2Oa3slwwztY LiMwpsTyI14DwzjuY8VK2Dd2Y+82LHgiL1bKjJXOhA0OXHzWuWfZ96gIQR1586L0UuCE9YtJgNhP jSHh3Nsizr3SzIwOlF9NpkQgV7sTmnUv6VBKBd+a2hVhPfMYwxXms/nAuZ4f6QMOtA== XdLSbsRvkOlBoD/JDL9k0khWUqU5SWEeJGyMkGDurxMyWkrGSZ27q2VlBEVw2KkSSBrbCLaRI2r8 SVU8uJ4FIjMWPTBgqhhYodRwKEEma1CnGw7mDyyFJD+ZquNgQGFR3GWjpAx53CXtKwNX2kDkpZsw gzIwVL46Se8GTTCXNaY2ebTlxS3uxq1pnzS0YoJQi/lAC5bF8CUxekwLX5fLX4NLfYS7cj+ewKYO V8l1nsKmzg5YeBJTxR186nAEnHsKn7rFzcEN/t/7GNVfefJ/cjz5hG54dGyzo/tXX7cPj+9z1u3V EYZjyOvzRjis22ePcUrElZj94R1ne5X0l36qfz/XLjv5t7HwbP5tmyrOO+qrnfZqp73aaa922qud 9mqnvdQBX+20Vzvt1U57tdNe7bRXO+1vwU67ZofdsuHuttOWd+/fffjGGWNvvv763Zt3Poa2e8sd eXy1z17ts1f77NU+e7XPXu2zv9IBX+2zV/vs1T57tc9e7bNX++zHb5/9PShx04Lp3qHobSh5y6Vk JRc8VxWXMPdcNLfL/EtBqSe2DuC+CuB9/3JnLcG/B16x+6SydFhzA5sZVGAGBFy1OqBhOJvsUEYD aRaqLlMewN3wxYMXL09K3yeKJOFCjEjhwzzMcRhdnYrwBGlzqxgzMhZAbjYmMiflMmI2I5yZVIoh 4nOsIz7HVW8nLWiiPI57onu4KkSZpzG5tXBzUmvarDU4uL2YqsmSNekN0vqiYnbRW7yqhIAh1G0O NZujWs3P1Vqf8Hj4gET5eW9q150J83Cz7OmVZPlczVO4XfT0es1Tus0XvclpgNu1Xf9LbvMFb9Hf Idy8xSfWr4XHbvJSRvsK3yGJJSoERaIYpZN70J7ItUSphxoi2Al8t24Loj/8vtQgT7Se4cDblysi nLJQ1LGjj2gM9q6mlBNjQ5Mw72YKzPe0AyekG3Lo1I+1r2YQ+7Pcqa4b/kemtC2fY4vn0IA8rt+L pkCHu0+lvOOAdLgXskGG3s6XI42F60pFO32kcEqZ9LBDhn3f75E4PocknvjxFWGFH9sP40WOHx/W r7b3d5MYxyaa5lNNhdEbrQRIKHECIY7S4fgLU7J0WzOSBicQGeAQgY5RGKVn6J00ReKLlcpFtnaR XGeh15hepZBkdlSZr0GHHJOSJ1dKJGBCSZ7WI9oRu1NhC2sBPVP7pPGni7SdKRT0cqXBryJXK0Tq 0ruSUu/Z9vniA6e6XH7gEg/8ERGDhPKQReT0oDeTcoo/SQelke18xVM3Xp6SbUAuttLd3OJuiDjY Sne1xL7W+QWNV7G40/tT+9R/b3WsmPDf+2R/wDz/VZnXWs9Rg2rsggosWRfBtvDKKinirKdGKrg3 +lU93SmnT9FEiSf4WpjkqNTvccGcCq4GSUrjJz8OlkUbKOyiZc9S1YRK+kVvF27EhHIFmK/calp+ +dlaKd3sC46qv0u4OapPuFF/n/D4jfpNa8eh9XIR4w12xdTHZ8eLJ99jcGe8uE6Cg/uIMfcYaKeF brMdZ5k3bDWfg3gx0dbejhcHDtqLhgc1Rsy8s8w4C1GkOIkTPxoLNnUWsdJiQRTZx3HC4wVxZUmA UqblosE2LhiWhF37u2AgJLHAuISnNRnS6p0h8CcYARx10GFPgQK1Ce8N45Ab+FDBk8mK3bhDVMBp NBFhN+yPRnll/dHISZRXhi8zeikVYXUzno9R3jCEtyO8wdS6K8rb3RnlFXoGGd2IEg+igL+say3S ysN8T5T3YqO8toqY8luP/U8xfmtZrq7Gb4WaPwiSeCoGWhG7EQRiRarSiogh4OoTvr5Vw6JforcV CvyBaRQlfttz/Hbj+G2n8VssP+GdC776xIbR29aNsK+zdsF6E91PO3p3aDvDy8ZluxJeMrrj9Xa4 5lD/aY/aTzXm+rKj9kNFU+8dtxeNpj6OgnheNDUzds/IN+zHc1kVY4J2lXeR0WcsPS6HPyjPveu6 wNaT+xC/5a+w6uiDrjo77aQJ38p9SN8aBqde0Adtc3abkKnJlftQOIfcoNAH9egrEjcRn9DuQyqV PHqVgj6oOrwmU/k48yF+q2hcf/Phyu7slKkhfCv34Uvldu6q/ZZ9rgawe/dUnuoIOewf4o4mrWBQ q0KUAaHOblgZGCK7UNVRiLTRWBOtM4Z1YkMccXfWfH2kQ9foqmn1aukpegw9J3TyLOhGR5/Pir6f S6Rqy7PmW9sDLN0zpw1SeLLSa6v0Cht9tuYK6frk5+Drj+IvZgOdIvpPwtDJz5U1MtHL8B4Csy5V d1hNdYeRqes7pqlnaRzJ41giq0yGPTTtKTI5lLXY+KrkumZmHh6VVl/I9IVGv4oojzdlk5yBaSSF JD9ccB3xRm7RZjIJW6QttbGZ61q50M4cXd3IVyjU/4HyvzFXiuzNSoppqDD1opUCU8kvLfeldcRk XElHMOo84ztZWlL1dQT2kDgTC82rUM7ZMo0LYvbCETzU7tk9sLMtY4x48AnYlWzXsbuj4AfYB+qy YTpaZJuuz5JXaKUmsTg0pBpvG1YoXr19TugAnkGt5hX9whuXkSDzRaRWiWUmaiziS8uKtQurX1gN w+oYocSqVTOSUrWQqbJ6pG+gxkE1dh/VhZIysPBUTYhoRIWnlQpQ2JU2a/3fQTlZY05uueIlELGC 4WGt5dL14lOKbtfVqdJSIDtdifQEbXv26yMiszv4B9ychaKw8HR6A5IFMnufYTcceJM+D0Szh2yK dX12i8koNo8filSTohw7fxynvFS1Z/orhYKv8LpI75Wnc+vrePrj9P7TjrgVR6fZnYbBn81oMy9z vMcUjzGreIwRpQQaQhT8kmbqiQ3h0ZuwmITGqKB8w0FIDETCLkwWh8pmlHoSKrPBMgmXlVEl5w3i Ys5BC6jcrt5hzQmqONGgn3xGTajCGuADissL15jo0RW+r8K5tQWoG2RRJ0jDIHYqw1mwi7tHR4iv xElQ9hqdXd7JNbMPG2tx+tgoua2935Lcj1HdHJSLKCFJVtr6OR1rQBXGyyovgb0sZqm8sRayAKom BI70uo3XcSRoVtxTIfOGI0sKKllHoLgCxd2b9wXGKUCJFxCMx1/dgBkvYD67I+MGjsvWUaz7ed6F YyMVVDY/A++RM1AhtlBpo7lOtR1KB9VR6aBCRXyoGoSM25AtGmRLBqUFg0hhsvWCIlAExKiIuKhz y9yloZQx0sIKJW4vom5ARzSL4OpcVNZ0fOQgZCxiQWhkbB2dZi+cuCL/hV8VK0NXGYbfZ37/ITld 5cR0FUtpG2oc0fcaR8xsuNEGHCWF7sKAGF4oEMXKBo6V2UiZTaQrTIVGiZMRaE647AdIKjLOWqJz NZUYQwVGW2yxZpSdlNPAkhqQqTcdqopSfQ1bYyMuBmqrfa5ac0PqE2uV4n0lz6Nq1KF+sVbogKiQ cVykuk+a1KcOr6Skh3kNB/Wlr7V8XWoeQbhZ//oJ7VowhgLYnRYY9tbyZqIWAwKV41JQlbdqgM2a JaoIVWqoLLgp0ppdBeeiSbyMohoa+DR1u9jwsdW76rZlEvSOSdAHdPkJqFBCaStToXNEjaKkKSX6 nhbdUqNPEUH64oE/wpNuuNK5eIrwpUurlDa93pGnt6w0dWBY1OUxJG3Pq37MsM5BvohundtVvvWk sIppcPwR55I/oZE11CuclkrXhLJQtiBUZarV5GrVaAFeuIzaJtNmbQt7K67WanrRqk2vBzSv16jN URuTwYuHkIYRf8Pug9DGp7aXC04bPDLcrOEuGJMFMUJb4hNuFS3EeAWgPF9TP1FyfSnbl7zDS7Vp oXWqPdFpTfUZAxoexe6vqAKWuS3KohFtKL9ve5B7gcX5KhWwPeYFj6gueGGKIE2UoDVGmX2cufeg dC8sZ7S0fAu1IyokovCNSkWQMCPB5aUTiQERJVRPHikpGjVT6SGmreAPZN1Lue1aW8utDw3G8Jij ttm2qxZVZRpmCQFXm8m1/qmN4K7W+NibH7EBYmNkwQaJ6tUDh8okWDZGKFXBqMbAW4mbWZQqRc9q j7IsTQhti6rdhlq3nda6zVa6tYVuIUmmsrVu42q3JRrFtuKtpFjNPCpY9xZw+vRc+9bnlLVcATfU wK1wDZUMS72wG5PaqtY92fdu6c1SPkjrussmJjs8KxS4bqk12mrT8KzAflj7iKqpZYrY5KuNsdoL h7Xtl6c3srtv29pH1nbqCkWDG9Qbaq3uYHcHy1umv1jfsgDiJVACrwILlLcr4QZqmxdEqBTdS/5g jN7O14fOVYfO1IeubYVoUyM6VImmlTOzzBijatG0imQltb46kJSOlkVV6SRjCJLUT665ZKCxe6Ts /RwaSJUsXoChDVHrk9ZlGkoHoF/Z1jy14TzkP8Kj0hZWlVYYNPVAN9OCKbgASoxF5YY0K9tH0wbT +qhxCXGIpEwbSZvGSJ3Q0kcZNxCxFFq2EOq2a2u2LVAu2TYftOlqc6sUVArm2/0mAEtPKPtnti7f 4OiD57TEOxa8WSP5jigQwAEKbzdW3sHklL+x8o6lqjuPXWfrAz1yDPSNDRwZObf87fNIJaKKcycf FVLhig/i3vFHbXPFsF7kcI95zoqs66yIoBW6ocoWK1suzQSaUDQBJ60+LmBfqUG+cvCSyJ0UayEx SypK3uAS7lC9ltrkUp18UplB0OAVBYwXOBdAt0eBsklwwg0Kvx718L7OYh+e/6gwdlIDbi+xYUE4 hwuGVArUNmr04TTcV6PpmRU7okR/jkehYk12a1gQldCGt1ahGKZkxSQoJGEhGxSinbhj7V+zwdxM 35J92KmlwPQJJe64ljyhRfIEv4luuGn6bbLF/bDCmtuUz0TZTATO8rW2By+dayy0vWKUpnc94Pks Vgy4+FBLKciP3iAUAkrB4hSkoHR5FarAaBCI0AqCVeh2dTpLU6fzapVO2MUOdnEDgmaIYTvsgBdZ 6EUCFLmkuIv8jVy/jfgmkkKjsL8BU2YUgx5kCo1RuCgiBEvd4MIjp17wJG3A+7/BZIqHXHGbEJ9m ix/ki1PG+FrB7YxxC0xJlKqH24/wgFPcIKNbxv8y3tHm/QFvtfmu5sYYVC3et/WwbdmGCwpUA5fK 2kWsoSN2P9bdU8XXPloqCWpbb9oQtVGb9UTMprn5Chz72LRdpEXu9crUGQ1u9hbtHMlYwaqjQHV3 KZZk0VQGUVWym71lZ5F1sYfKo7M41jd1qofioxVnp1U7F3rHWKzORLgH3IA8nSFaEcdmybPaSx4Q ewayNtWtdsVGA35xvKzyKydeAnOY9JCb+1FF9yKa1MH8CQ87hzvAF/vJK1OVzGOJ1Mn8LLgGbol8 hTQ7eX4Cx4E6jgONHAea0GTXkricVlUmM7OJAj84I4En5BYlV5U6+ywCcOQIzIrOzEuUK0nQknbo IWZRRRdmSJmzVcp7E/cN/AgxDUI/jZDleomZXvy25sMeXtPbU6D4LZc2NL8ZN8DbmQ== bGj+8w03NCFAaY4IUPakW0IO8aLtJQ+Ij+vaeGqKq0l++wqPD3PlanZ/765w9/EdnySPn0oq3usB Dw/GuNvtZduP8IBr3CB941nNPGC57zHf1SYCcx218bAN2YY2Nyx90rpda5PWJC3a9YEBZaFZv2EU LDDR28201TR318C3Hx6TNgnBDdoEydBpY9VS1dgaDI+PcPmUjHAqNBS8Ka/Pql08C8MPhyqI5GcA DcN1zKLTsvpcK5tOxS5Q4dS5cLxw5bCGgNBp37tzQtzdXvKA0615+JwZOsLVqarT9eZs1VkK2cka q6j5WXowPyGZnNIh8ayMZ2Q8G+08rGkeJjNwN/fCvIvnnJ1sMtEqEHapHW9TzC+VYZiiAFpE3bR4 kK7wTOWiaEWWa8omXMYplxHdUY656Z502TjhsgKTbylsoZJqWaovL2UmIvZM5SUittOSMUUHBvpz 2w98wOrpDTJvZgJEBy0TV4YoyHw5bFum5R4LJFvsnLQYoxiDIAfTFMEm7lBpAcIZ0J1iu4YAoAQA QnycsaRBFYk1gEhkJruxFV9WUrFkAiOUgjCKkdlLIneGHWldoK2rIMNaF2SMJYPLSZcqEi0oWMCk Tk0ZuWIo4SKatTkRKi2TIZowmc+LqUsCfXNCj48rSWQrBJh8AGk4j21b2QjZ875OKUmM9z5XeBAf qeKQlYeby3vuJt1LTCTyCT7uMEN5bp2lfuqac9HYjOuXOiDB2vnGzpi/VAksXYNqBIfXECHmEfkg TwJuf+QojwXqmmygrsnnQNNjj4QjLNygMGNJ0SUk3AUTFivlXGoAMxMlL3Fi1pSFUhA17bDS0F3H OdNTBEleMYCFdVoA84jS5OmIwgddV3XC4bNk+EzR6QSGaStmS7XsZBFXasTUY9nJEJ8Lyk4m+TdK uGRSBkKyACUKcHwkYsxUxlzjJtpHIckpEdOodobRpjejJUnUG6ZPE26x8KgmojmrOaeUMr5HTmyf NHWUEkZLZryRvFjhvRkYhDF7rEYYtEKTZPfES4E8y6a+C6ecOMEX7/q29EuSCdxxTa2ZKZfs2NHI dQdkuxVEmcDKlBbxyllmucWkltHI9WbkPKMcog154NCI16z0ONt62eWBX8sEr6JM8A1MVrWE9kJg T7JT95ngNpzXazat22fBBPI2TaqVtFpJ3woJXOUuP1XYWhlaBgZbdge67CANuA2aMWSzuu4hHjmg HgGrBe9z4tOM+DgbPh6lMEaBVWDbVjDUAiFf/9YYpTwDXYi2QmaMJk2wCyl2AfhnoX8W/MepdqDK yFNGaDpMurvAHXl3T6KGgYgbxoySXU+b0WiXiMVgTjDlNqDOIXV4Bkwg5TSIWA1gBxVojFlg4+wx YCCGDJiIO6h2LDpxChzIpBxKdnmSb4gqLhymHOYTDnMczBEDM1gK5ojW2f9LTOuIxI4at59M3b9Q 80+43m2oA+P3YAL4FSeD2fi9RPAlhu+j+MT63nLQw4Y9tu0CnKVS4rPkHBXJVLnWcL4Q6a9wXAaW S62I6HtH2S3p5gcuVTDNRG+/4S1TgcOO/IH+fil1jm6UMt38TU44SRaN6DQ40fyN+cwbfy8VXpmP 4YyuQ6lkyoPZH38F8r8KWF+plWWnUQ5I/3NBepc8E6RlYtUSap65s3f9vDllw0dWF6dMNKw+LEix V7DO0GOO2WQoN5zG8FdlOEwjRWkwKgBgm0TF7pXAB5VswHQ+6o3a9IO7f1TGeietfe5e5bSsgWlI KqdJDW71bcxRrRBpAUlXEVA6hklPx4kEQiov1WSi2isMf24Z8czpA5o8EEqwDJovoAVYQJnVbLGc tL5MWtNKC7DQTcpNpfjvgP4+vq1ix5U/gfq8As2YJRozNHHJDcX1ZLSaDFy9mbhUjimUI3WaSPDE DvG866BmOpPIcaAw/gjID1bhirD8c1bnOtrVdV+HhD8+bO1ZD2Tqg7xKdLLzORz+A9rtnbCSdMpK 4jlBxOivvT3uiUA6ZDFxX+/dh2V9qlt/mGC5P3gc4ofzme31CUlJeieTPCy3ZkixwHLdCzcZR3+o Gk904El4gWM95E+oc+6EOkqZj8DzFl7Pskfx+ILTHxWpOxmk7sI+wA1rMeMWLZlypcJaa1x3lK4s RuaokLJFjU1xEyC4C9hXELKYOwVnjbyBSG6doFhCCnPDyKpeN5YZ1ItgC6KkDMCSmjwrQVVgAbbs zpxZbCmehdF7j1RpBlsdZkfszZl2FagBa4nRpW5rxOptXBHXeJ0VwWKL/dpyvyPjWQxUk8GaQj4Q lL6OoqLuqn9KzMOvB7zngCX/LAUdz7yB3ps1IC+/EATO6sfaKOWO/FjoxGp8EglmFhCji41drMbm SsIc2eBH5gH6asPn9ZaJvHgTkJ6ZgE02ynMUPGIknzbGyAH+6kzrd23ItJF/jmzZTpLZDwoPCOgN e5fhYV+T4XwxZAAFm1olKC9AYlUpdL+9dJmmNAeBNQBNe+UO2DMG5FoyHsaXoK+BKAYkw8Cmb9nM zosB3gcXgc0msG6CZzgKcnkF07qjJILEQRDzEcWugcH4jILXyHLPbU4pYGfAFDn4bPZo7OOLi7SK F8n4kcCUXNqXMgqh8BAIt5mkqcevClmka+JUStxKWc7hbPwb7giBP4Ez2gN50RaQyqZpy2UKX5K2 RWsrtAXMUgzonbBqQ0p8WN+y9jsz91qZgaCT0AayoyhzEjoOktNGhTUKDCb82+tc7aJIbxzjNfFd nbwmqAsa07UR3eNorkWZxIFcnePW6TUbBElAj+xjuZEDLA7ngonn7g2zOKprS32lwCSFjYBBJSWp qM9vjO2GJNP1uU3zDSBJpL2nddcaHH7UP7GxeQFRTvBRG+9uE+ToJTJtvqstcY5zvq13NKMiAP+K IvyGBnNgWjcfkBZiNX3B/1d53vGxKqNE2AeOgZZwL+ZyQUF3QgxoiqoGxEsKk+9TX597gMds3jZr 9Lbe6m2iGLpUuBHPpvgzxZfZMWXvvqJUjfaxKWMDmMIpzOFNVFdKAqk2+F1rCRvhUx4tF5en2hQW 4toQcAmpskkEMlWJ8kVsRptusUriT1LNxtaziYks91SWbNpCxGhZ6uIMWTONVrtplWdGqLbkEShU J4jYVScthpNp1u4Up22prOYxp7lwrfdsn0z8JLryQFm+KZ8zPUthdaZHrbzrwrwuNEISi++U2XlC duoJ0F8oqdGB1/nCzM6SHV1wzWrJka7Q8xhEdye50sBydVQhODChwqwybDJCaFF2BuRsEBYHZXWo wLhmak6obhi9YfKnOMlayClsUlRMZzHC3alQCVFeGSEkAkoioFoaY2l2jHAR9MQoXPrAMAoxQeUn QWCYYJ+bcNQL2EL46jfS88hoBRMZoEfFPyXpW5A0FcMzauWlaU1CPdq8/hXgH12UZ09FClolReiV 059eBzaGkXE6kovvZhvwtLP8EESaO5aWWmLm98YdDcUYE1RA9OFVNovA639PZZWj2iq7mjjA9lNv 4+sJR7cNrt8k6IaEDD2iQ48I0ZdIKzwsTwvGW3+MH96XVU0Lq26C+oOovqqQSwuldCCUFjrpJqaT 5hbIPwKZYMo/uHc0hOo4oTLDrKiXgKbI1T7YzMjaEgJqP7cJnuLOfPw9lS/YwHqGyzcOradWR8bm gAOjQzDsS2J3XMeuu2kFURpFo6nQQX8MK6fY5VMEI2WzxkraDjIH4loWAW0xH+BjLGVBCq5Q2xd2 rAU33SYZ6zX4Tmq4arWmEOec1TrFuGWIYMv3oJVzeGWDWYYItnwxRu5BStStZKU4s+Rq+kdU5F6A iFvE/B2yWLuI8ztT75MjA5zRCqa2tw8NrAGuyAgIoW2QmMBk4gGb5rgq+AMU/THinQX2Bgpko9Ir yEHBeg6MFdy4pl7NsRkuoso1VKVAyMi08lhdDwyz/OiukGCABALskbrQ91gAblLkRMF/pgK67wZf 4Nz3AN6/j4Z0fM8+o5d56L3qNhkG+pF5bwIT/aC7dMs7emM46aUaCPHPlYDk9BdWL1dWQEghmZAw ZWI4gRR57rVaEHHWN6wbEZr0mo9fOOn3xbdj4piQhRKTuAXymDkmcesjEjfFJiQUboHAbdAgfheo 2wJrGyjNoRAdClHbIDH0FypgR65JSNBuzy5fJ6FwOHZGBoL9pxHLH9LKY3WRHdArTVmIExaupSyg OgPHCVFWHKm/2gLZLLYxKiCQLUQTlRGwpe5kjI9GeElGWMaXRtePLY9sxSNr0Q52XGVUZyFEcuNZ IRvShmXdBXWCAwk8jiGryjuTvSu5REokSqfyRlBrirwvaI9JIlXJaVRebmBxdy8YClz9M672Hi2a Shft34NJ85Twa9wqVmDSHNOUAt43kzYobYp3p4QHXrjgtyQYY+jf4Sr7e741mR1Z3wn88F2mybae MsX3ZtNP3oEr/0z/IMhvdrzkS1nt67/fLHgPAcN+rT66qf98o0A67IoWJDXSo1yEsMOnrBUVR/yx ZrflZIoZmbJ8TMTGdETGBIGNCaObO/oKnNWBBEc5OtO2ZttumhOnJ0S0O4HiM27jrg2Zhp4viHh/ esOlErOExm3/UJohSJhE41buWpG2FNEKEfFoaIFCBlm95pttekqD3VvPf6BFC7Zq0t2tP25w7UOu kP2kBmq4H7RrwLe6Pns/2jHwLfwD1dMSH3wlBbrKQFnZKJqNP+O6Lugnr8azUzIzNWGefyhiv5R8 vF5rzPhj+upcPhGvdu8VCKGj1LxQiqtr3Htdb4gvHz2Svx5TlYyiFzV137lyil7p+TxbCjLgnYzj uXH6nen853z7ofBDNoOv+cJPgSKKPpTsoe7YKy0ZehdO9IoZ6jn+gKldNhVvIE7uSQkzEX1nGDI7 TegSlJ3wTF2YSSpA61qmjBqBkXXCFCWMZgFfJwi7mmVhxxi7XsmhRt4xEWwHgR+qY++tKRLimwha JpnqwqPXNoQGHNsIbTpo8+0WXNGlBoUCvlsCBXGV+UYh3r06YEMWHvKfblzEJSRPUtSoYxc+ue2p sMDKDnrJxavYD0/D1xFWQdLyAl7ScuYJZrJQhrA6GttWYZM9m1i8S9L+aRnBlpi7LmEGKyMOuzIE C0CngzShtksf3e12fVAkrzXNQbD1HWhoRvV+u4EBKasZ0dJKmKXnkN6otKyLBmstplXi9O4BTEIr oNZrwFZL8bYfrEoUh8aMWMxJGFO57RkIrZakOhTslKq8ArZFStpBu+XwzxVTPyjea5z+K0RlcCX5 MSrPGWXWhfzHcWdZKzvAUwzr6yiSkuhNi8RLm+O+EfabyehMIZ5p61GwPR5ae9COi2Bou13fPlfh 3sZhbJV7jsTIoISKqVLftc4yy+aHxLg6QHNTrw/IEUVDNCC+wZ1URNP1oQhjAJlhyHf5HTSpr4Py 4xyU4NSaVeDYusUSXxxNanWgSdoB1kLcCLKdtxcznYkTZbtQIJsQefOOKI66KcDVAg== k1bKooVzAAwdSRyoFHxnw1F7S0wSKI8k00hikz2YsGRjgpFlVNx274S2buiojggc+KAn8UGb+jpN lBwXMsii2iGA9ObW96zeZ/VGBPdzcECHSiFi6bM5D6bcTjDBQ/WPCd2Cgo8g/EQosqHFNUIhDdBs ulA2w5bKoNhuvtpOqHdhKu6AAlhtsZ0QxM/X2jmuscMVdUxVnWzlnIi5LsQ3TRulAf7qTeuS1iYt 4yCxDfTlDT7Sp+Y7PPlBCQ0jiubGSxQnjL08mZw08bKkRmm7OSERy9YgFjLIbcgwEAWlYbf0FZxg 4QmTXfcQcRFZlrPcwl8NOEGXvq58XCigKIRSmc8EapAvXyAwcCkkVEsMKpTW2tgLvLChFouBXCxK 0kkz0SiIwlFtLhzFAiEnDgZ1C6o4gF3trV31rYiJPfBI50pwYWptXIMrFQuxSAh1ctKiOCoYQNJX M3W4srW4EtFgBQSXkomlRK4GV50KC11/e6FhSmtdkxyjaaEmZlZ8wJMlSb1rUfo33EFK/ANKFtZK vD7iNBDUPLy6QeCmFmVHYfI9LKApzfnYxf9ydJvquE0oEUMmcsnjwuICTFpILDECRWJrwEuqK2iq 8sZhGhIYMyQqQ4hdS/TaxK85xie6g6Qzhxi2liILssNGsm0s28qPfa59x56MxocKjVoRhThSOTLk 5MheiECiWIgkiaXIXo6E+l22nN8FS+ekpboiVSOoGXFhv1TRSMtoRTJlL032MiVX1q8VWKSVKXlZ kq67vRKi4gR2EmVXePJVsljJgtVjF6dyeBu1dfPQ26abs0sntEhbNyFLtEFn1G7IZqrQXlqcvPAy qULNxksjt3DBTfvKiaLVCZ/BLcHazQFvkPhwfu9WUu16fENBMbmF3bp5XSIiY3HrfUCzoOJCRn4V j4Q+abl80YoB+5F1+9rNmgsvtsktsY4XVonLaeXyRSOumEaoT+uCFO9Z2U8lbF8zHrvgSR0oLHrm fSDmB52RPANX4Plm51aYT3bS2Alyhbn+bycv+PWArwfMfZGd+NaFL+k2uZhK7LafJZaiiTcNZbFF uTca9CLXfM3++D5in5SQV+AwbJTDkMNdexBIZUAgexjIZirwSPUdgoIMEFFHSKWdUgEhjSba2Oom CyfXSFZNxeCQxsObOkaIpBVOLEK0MghRqXQyKHvEbFGikIGJxiQSMY2EVPraMHk7oEaVPAwi8OjA hBKWQWwlVJPyiJXsRxM0k5JLYBuAwaWTYpYCUmlTnjHBJQUwkoUXBeQQY4VHJiKbGFRsaQYMG0CU 6G8T+SWVn5P44+T9kKQ/mhT9NC9/n5HPmcSIt7Yp+JqBn8vCv5aLr1B/SFLxh1199n0J+LRFUDA4 SNDPJ+tfb7vi9c/iPXuVLK+S5VWyvEqWV8nyKlleJcurZPmRSxYNPvOkvuicrmy6llbbtbN6Sma2 ILwLW39XKN7CNKe0Li8EKADdo694QJ/xqHN+5KD1wsjwBTCWzakI9PTBbpOUYEkv6iQtocZnKIjF GWM+AtYTdxzlJ2j2WFgoC885k3Rgcg5CTkEDaSqBAfkPURuTlsmr9A12hVOyDTeIiMkvFW8XZvOz Iq7BpyTvDSzohNhvApZ0UpOS4f0K8fdCr0a/fYP+e5kk3qNPnn0KDXpPP4YKKWYo8m/1QQHDdxzJ QUP9LOKw40kycJDS/QSeJwtPi5XQD1z6stbhllwUKuMi2I8lSTVxyxEIqWJSMIODOoas5bJCcokd u4HOtlBcPc/P6H+GjWtkGorJbl5OYEpSZkEJh8ABEdrFGk7WoNIR/pXfy/xjwVcrjvbmx9qNsc9P LHG8KzfaNY544yMzLcuE2g1v4wa3dYMbS4ZYOqh8cCO9zKVM7LnyswCBOW7IvTPcD3+HE6BXydBz LHpmqTDrPrioINhUwrpRh0QKWPxhXBAvLUp2UMIsTVY6KoWG+aWEjh0kzxSzTBsEuVKWqVOLmFS6 Q+ZPrwJ58HHF2aW+YAhqOlRuAlC9odxSUmikOIiUlvDLWcpKSF7phVWRTrJKWShXvnpZgx1LXbmY VBvpEX8zC4k7FHUy71uTaDPylo8gSakVW/K+3jJ1umzjgkwkAUr7dLo7y47s9l8h1w+M+2HPjXfY 6+x82u7cGIkD+np5sxy7m5Q4m01MvgvR+EpDaJbzWVife2Z9ViJrjo8J9/MShcJ64oDuOAZm41+F hrwk3DVrfGA04a1OIwUczwITyrLhqxC2iiNWcYQqjU2ZiFQuAnUl7nQccLrTzfs6fj+F8TsevTy3 4tHoMb8iGBL5dPQGHr1W8S4lM69bJvnZBKKZ7KjV8asClOWu8YsxKnUYPw0kR6FjO37z08YvH//9 K49fqOHRR41QZPuarqTslUp543sMjWKU74FbZAaEi8SQkYDFNcCRKGvcbVOUrx9jcenfpLJryR16 YZ6KhcEms2bxE9yEFGP/swXWmFPmUQGnBf7RhIGUkiHjjMUBtbCQTCjYt45PUrOiXrLKXogKzyfa wBAKjBEUrjWaYwC1KAaOrobO5n0ddEw66oThbwqA+xB4oCUYOHW9crP5wmHwCbFvLdbbQcyrhME7 txArk64+IHC1cYvHJqv7RViL+iSEX61JXwmpKzZXLC7aZst/afo07PKn906offZ023V/G1fTZa4m dtDFrH6hqB1mK+/r2tnc8sPrsQs9yh7asrlDkjYU2PFzWXyczwVRCl+LlVfC5ShDvpILXuPGR2ch JN7CzpAIJqz4hjOwNnXcJAWebS5ArXtVU9r6CsWM7tSMHtVbKBa0OFdKdq5UoB7DnG9lTryG5DMs GMVUJQ4VtJZZ+hL3a8zreVQC4XiKT5wvxrliEFVBqMzssvNr1OG1gxuXP+BpDziwMtOYO9LMt7rL MUcm5Q9498NRBk5Ls+wGEzMcyFDHJra4hptkuMnAXsDY1xelPKp0wFMHsbiIlwPyIxlwGp8cN6uO VDRaJr1vN146YrCTAyILrGyyHJ+DLseQUGuEArS2XsWe71Mc+JsyfloOirA0By6nyGwUS1RVURao 1K4ILn27UINbf7MUn5BUsdj7SCIHf0RcZUdRxxBoEP92qkjkC0XlS0P1UaaqCR1JtiooiyhV8tQk Vay6mhLNUqLwxpNU+GW94PDzz0uKEnDKEcsWFdUqMQG3x1zsFVd7iWU3PbeWnxze91GhrPb1NZd+ Q0otT6g1ocKDHg+qv3hYsTlUa76P3YjzoyDKwLTZD8pqlDDXx/UPO5P4QJSMpnzSNe76QA5l6aFs NURmiIJMQcSUKCpHFZUni0L2+hflrq87IIvqdXxex+d1fB4an8C72L9AM0QVYP84aK1plpqoThp6 RiCieS0jjlebOxGnW6XpEybhKmRcrl2uAFxLLGlsbS7a//ve5573XErc7b7LyduUrRXzxGaq5YD9 w2SKHbXFtJT+YyJlaWIekcEkmPUm3zSkmhniQ003iysYRulmnU5V213bcyarlCzcKu7W/gWaeUB3 +2E5OjI8WR3by5REAppXo+Ueoww9m2cjmTZznMCr6XpJrk2hHXnkVbadmXZnLyUgPQV68EQSj65m kTzSTDos2D+SLLdr2Slphor6IeEoSSXrj8x5IX/gRAMKmbcv0K7K1r0otg9LKZYWGMBNWDwOK6Ni LmrEBDPGeiBa44HYG6QRYqlKyvQFJt6YqY95+lKaPiHpAy5DPCBuYnnt1tdu/ZvqVtWzIulAQijU WLZGdKB6UoI0pEgruZAgUT1hFQRheqKKG5bkqWYYZseMaYLCjAnTyNtDrt4JLAgzqdrSJ76czZQd rbWK9RDTWoNxojJfaKALVbLQWj2n4o5ZFF8Ze0xxQvV730lcSSPuUOnUQT0T0q0rhsHIN1ECY1tr 46GwPGej6WYCHEopE+lq6WyGvIJBvYYyORb3aqnN1NGfR776bgdbKyfjUp+My+ySOvnVwWncm4Au 7Ac7M8zTVTq0LEBrh0jxGCn7Ebp04lRZ6dIwd8uEoMx1JxgQ8SoTOOnUGE6cAIqjjnXdCsY9mWPC bZS07RhQHPHhejUyMzNfXq34Gzzg3oGYk3qG4s4rj2so73DRQphS4kHKdUjBDluyI3CycdEOU80B CxRKzY6Baacs8VRMPbVmOdoC81RBgL4top0KZSyFHLw05OCzkoMLNXjD3otCCJCC4+KYAv4JJPCA XOGvnfnamT/WzrQB34VNVkHQNIKdEWuVMTODQmU4dR2pnyhtfURqp7ZsPPylRMDLwoWxerQWGyRN KthGM1gqQVJ1hghCjk7wG4HeEPCGUuMbpm0oKS0e0BKm8w1sqdI5K3vWgP8ZzDlj0JY942TOSOes FNXDifgzm89HZy3IKbsqy3nMc75jOucMiytU59sFEGhZYcJDi0kNA+YrzIiZ3Bj6+L/OWXUyo0aT 0q1KNpTmQ6kWzjo4KS1UjWUwCr5/Uim9LVLy6cA9ziCTakUHuDB/cqGalairorA2rGMRP698fUan kJ8tyl7KrIxR0bLAJdhFbIIsd/Aa9Kv2yyK9xt3X9wc4qJllqSBzpKkrH8DUF22EnLvmIqHKx+0Z uZkz+9wJTTa/2Jf4fPA4RPEdMaRX/dkZN9VpGM6ePfmISD39NyIv94Tnnt97YC703v/dUuFR18LX +uFcOCPYsJU/+at4RieAnCnhicTL3tknlmrdVzZt+FmPnuXcHqQ5l21fh/M/eiCq2CrfDT0vNVZb qcVa6dONwniu2rHac7c/eiC8GiVZx4MhI72bI81IFWn1Gb5dl+fG3V64jGcfgcj1K9eD2Hm1f+lf yE0UPMht5bp9zLxwE8uNeXP2gXnDsf9SR8zMe7mFEkn6y6N5n/7bE3tayg+ci6J9Tj/H5QtKucdC 5qq84/9/9GV98QVW/3Uvel+RwB+mcyfAkgChWPHDh3qMtr/I8vYXUdXgRHmVaoixApurcmkrXJKs RzkPxBCJUlpqWo6olbJOyvqo10WJ381roSVHdUX5JMUT1U5ArXNSfRO1TdQ1RdP0wUkfWbQVsIiN Ma2ShJFA4EJJFI2lWOyahGEPwoAchrFBGKfNQghoSeEkhvGL0inKX8Xlk1bc8AcshNpEOqzX7ToI Cmxkhhuz5NbDD9yC1FcT0l8NOMp+fP3YhjqXaJZMyIc1mAqHvKVrCUNKcJuQJ0uYsqTukd+XC+QE 9SO+CSpgQrrhUCesxSkgWIAKSUMDDiBP1Iw/wWACBnTMdhEmnOyYQDscqIctvblUEmMKYiIRlJ8B HT4yepJQ4rbEWGAmDcXGlHDQkpQKTSlBpFEXFCY6r8r5SUB6m8wDKUq7cjVlcj7KI3E+AteVFy7/ hdOiA8yPPGUpEDMg+rx2a+C1wPhai65lf5mpkBCj+PoYd2lKX7glAJyM1jNsb5SkNFOjW6pzE2Iv IPWocfq9FOO2GD1qEleQWIJg9CgxttCQgeSq2trNjYfgx+VvGJ1P3r2jBInwemD3aA== HNSUoKeEQ6nk8gUYGldxKYcqKugQO02l1jbV2554csxoGcj0wHIPCxur8iT/qqUslN+STxLTGAaT 0xmdYHgMew1r2zSTUPnR5pisagYnzHCg8dtc/s9xvshT/Y+0viqNg+y4KHZMFDEPReIyFg6KOAJy 5IfPAO3zIRC4UjDtjnJpPH9NrTR4RrG0g6AWpW/C80ul5SulgbWpg0ltbNaoVElaF75nEUf26lRd LVwCCRD9GhTdVphhSajoZsWj22IlncLSg2zMVhA6rCHkHqBCc1D48xRBoDnowFEdCT0IgD0GQ/eh TlCoBbQwnp1FLAtZAkZXibAlcLSFR0+gyQwGI92Ti0WFclqHLA30po8Uk8OllEBpbuNWJ61KWhk1 gxMBZsg9xFVloVTLMXwKlGA3tLSgWhz1voI+IgRSWgfoCF9kUEamlUkrIOFsZbjWYSz6BR7XDphi x1PO2PhqeQ8FfhEjgSx6KIYeBaLtSxkeIaJbgwZ1O6wyNpgtVbP1OB658A7KulZomI3JfjRQFQxF AyW8babFDAwhl39flTAqF6hLqKXCfIJkkCIVQkFtSagvrNzEHNSTclArcz0o3rJCi8gL0pi53sIo pwRA6SVEwj0dOOv9QrHE0wFEaNimI576gHrzsq+TIrRSsqLQksK72oaimRHOI+oR0x+BwX/CjVP6 QXuhwh6Q+ycYqQBIKRmxx/tu+Z4LLzm5ni5Bd31yortJYMiov8+CuXoXvb+eifd9umJp0oql6oak LTaIH0X+XmBymQkpfHvFQVZsOa4mDNJx2KA2QQOyHykM4heAxzewEelLb49S1Oqo6FVaijO0Ktt4 gYBZK0XcdsRC6WONGtMwAb+YozaZFi055XaiCFpoKuiBLdiWPduh2RKjmtNmSgdYxu3A/7CBXjM+ aFMM1E6XQLEdsoo0N6xi06WODJgYR9X7QFmfYKQsNmox1s0W5SEVvCxiWBRbOF2EjbLoqDlJMLOU TZxXmFCRdXCDt2lLsgtjLp4MIRnEjGTYrcqhFZdTlIKKe3UoNTMTbQhM1WKrCrWsjIsSlGb4BeI3 m8rphggiXqRA+lYaLT3UNLZVja2qbpR1UHK3g+LGe439enVjiHV2qxJEaVcLJ16V6DBo4+iUAYcF hFIwitgkArSJjEWUWEN5ONgVQwgylpCxhaTq8sYSFpVuU4E5/Ez/3n1DfrYFqObOP+lvo8/vf1aq 5+9/1sAGgP1ZM1LeY73RxzCqv2Bi4PTCAKuF5I8zhk1WnfstNA81uw/ILGcjHZQYQmgiyJqXKLZX e/yrxUCyZnUJbOx04roHfosBowlJKaY6+KN4czFhvsMYoUEmWFyCRSUoJgG0VJBAEpabaISrWASw YARN5anEURyK06+R53HmsofHdc5spbMqrnQGmqOUlooLZeJsiThb8SxUgasD14RWM4nKn6nOSTHU hqEhNcdJKy6cRxRkBRfQu3C5yY3jpysXnkxTuKZAWjWYXK5eDabAgRcKyNXKmSUqtuQFOJEFUk9O O3tVFi6f+BXFcb1yWfUnDNnQy+JcaDRHyh1rcKXxpZZLjr+WZydXTLTtBY7FJZs7iQq3VGYaay/7 +GaNcU0O5tQUY6pOXXlu66E9tdW5avqofPODR6IoVVOWfWdLThccvvOBJNwZTZXq8+AjnjXdV9ee eyf5TZjq8WNRbBKrXvvjSEix5AC6jfx2/mQ+qN5T7+/j7w8e56GYWZsLmbW+1HUnETOT9x3v9IH7 crfPG7ec3ehxqwfe60VNGnTHF/1oY65WYWsNTK0dM7UOTNKKegAoKWFgZy0N0aTlZSVeSfHqBTpW Q8NKqllK63FhHg2ByIr3cw57PplTuuvLzu/3/RHM5m/9oFYDCLn41itqPaPMU+hHAyInqdBQzhg6 lGyAS+QztSkB1nuKP8m3TH7K4F/uI5R9KJ1cR9Bki/a2tAkIShZnonEhRq5D4S0ZIh+h9Q5W7CZy vQ5aSnxA7r9Z9V8bbLE+QOv9m5QagegBt6fAm3OEAVnMr2g7gsi/7IimhWZ6iSimW8YsMUkAI6mc rgqqqgpFYo0BrFEpAgrUuloOU1mKRCJIjCgCyKCbTQ2/Tuv3VZzMG6LHktAbKnZqmT5mHEPHAOwo 4/K0YzaubBP8dqxjEJGOBcoxk+anZHGD1tATeKMFGyKEkrwuoymBFoqf3ZkKvcuEdmv6Vu9N2d4r O8vXZgLxEKVEHyVF2+TIo/RIDM+TvpeCYCMI7NM1TjiGvyYaZ5w1HueMG4ACRJnKx2yE+WzxXfqt tQCjYuq2Xa2brsmXErHk4oze1gmBjhAe7tjTP6AMG5Gow6ZXaLRDTfwaV2fr3WyB8SWlY7LM7RJP syQ9akraqBoMlpVnF1gjKT8dNL8e5qjR+7aorQTh6W+k/QOOyZMazoUvaaESw6NrxBZYa+Sq4jQt iV21uNAHimCBCWJRCGu2ISwNYNURZ1aHQrHDzYaiVzPODicigXYdNuVLw5jlJxWtk6ioZtpW08Qf mPu/8Ik3KVNnO1mbWnEv+Ytee5iEvGtqfrr3ILwZDFf5zbZrsftNP6vdZ77EcKgqGn6S6PQ/2eid t4O259ReTJsjy9JU0QZjYKa1yFMDszC2pa2iHaArbh1ARIShVBjKahgq56bi3woyI8rAkhBG0h/l GQGxpystR3gcsyRbHmVUX8AYmdfNzCIDIVpNp3Nng7Hkuwg4tIcLhe4NnRtMdS41CpmuXUPXBrP8 nlZfaYbaCxLLPrLwNUffshpvO3tfLH60+iE2+81YxeMS2/12MOp4MCAZjS0ejcgdGWqJxNCNGLgR wzYCaCNJnmzIEYL6JOmUvYJpBF6/aCETAdnTJchlBC2fLsYneeJBJWe04cP3eIIO8TIBszOyv03g XDN72RYDwEFoToDeNwK7N6D7Z7vTCI7fJYh+OfimCHsLy+8YxVfzrCp4zmhWER2012ylVkMpVYT6 vxzA+EcGZfUWzG+ngT/KLmtgiPKdyqgHaI72yiuUOBRhl+d0W8k7VvN6H6LdS8eg5h2KxWM1Dwwv UB+hUFMFL1XvrHJnyEBAgKiKQ201rapIkqp6m1JForvDKqdUwf2Cq1V6T3quwL4TfC71GvVYnfTZ 6Anw+girK2jdla33WVltQ79VSBJr+25AzQ57D3Y68hr1YKdKsqX0sWpyoigDa8qkLe9gvUdkNcb2 CgjfFXlrog4Ww6thx7nN85pYSnCeF7lWQoCgNiGD+HeIOMTxh0JYY0IEA5Ay98JqPFHJhMLNC3se ZrSW5eeIBHvUFdQdPc8xb0LQL9YtfS9xHym1+YV1UeoxWyZ+1CK11HvYg4CSnSrWYkfazjS5epMC Zyn7qeOEJurdOgTFgfKgGAVJgnZhuT+aLheAI6XXedAIxpQKvfiJA/IDDzWF5QvOTtyMkS3XQ1ci JN6oHAOfO0AqYzBlyYmEMYxy1ozCIcJPutGEOwCUL4bmedbjsWKqj2I2U8gmPIrZTCGb8ChmM4Vs wqOYzTT+C8/FbBI7tO3eow4+QsVm+hjYtM9181FH54PC3New6+yj7j7o8BQlC6amWq7Tj7o9H3j3 RDDZrj/qfAOZJdKzHd9EQkotlLfX/SDKSg2HSIa4fp30o/RkgMtbKAODjqVLpVNzrDopr05gnQ6w BuxhYECIVKfTSEfS0dLVvZahkwJ0m/Y39jhwXCN0+sjxDIlm2K4XvHK39RFV4hbRctOUkumUgq7D hBqi2RRiO1gwJ17FUxTTKU3lvTClpNjess9tBq0VNRzcHzm1eG2mso+mGC3IWOqFpdhzxaBI3IGR dzRxfPGgW3IuFXJhtZWwk2/SKzTyrjcYL75LhhZzkQzGyRDHbFFMplEguCG5B8ty7+WdKC8ZlusA AM+Rz5PtvoElvlZvafCUuot4Om1MnlEliq9ARKoSsk+ux1hsKc+QOWEIjaQTpQOjWIuA30RP31s5 qaoeK+rCNhl5tPcUqPeQoO6ZJVVdB9bX99q62kIU/3gClcU9Zh5k3PkP+fLhNpcmxTQSIM3O5H1i ZAN2vfGs/gjdARlK3KRPYgjI4IwPj9no3FpvWhv2Z4RGcS591qx/UUmWeUVQhT2g4EWORhAHTiE+ 14KZKDWnuPG59R7C0SWghAGTfU1e/kNHoeRoQYmUTj4VeATObrdIjZ7xJQGy0fvX7ohdipN5qQNy CjXdXiH3UtAA2KznUTp89EnPmG9fnn3ygL9Xk0H94JGIQsEDfzygpJdU8JqPW/GN6V1XdGMefoP/ il3fn51AbMx8epnj0YwS4E8Au4QccQUDBbALzRg8jEfKuFkcptXDh3oMOlNlsTPVF8g0weCZXNZT JuOpjco/WHBvAm+AULtDKzq3nIezxzl4PXKLYoQVlkQM1VoQ4jsoBFuA14GH0vsT4notQ6IgItwX q5yi1UGBAoFSC4o6IKiP6zl7Kd6ximSw06D1nJNazuTMqLhiQkDtblw1IVYJVzWFm0ghDLYZqoOQ mGXScaQMRqavWg+kDhpQlFpfnY9PGU1Qra6gCM6JItgYSysoxMa69fWkc8ZtG3H8UPXIkI1Yc7Xm XktD+oAJVkM+zLGXaEDJ2bwFZsSWDNElnqYLKmArZmKszIu8cH7sgARV4t7pUY9rAdU6/6zYuUPu nCe6dIxL5blf/IEP6G9T0sMGyv165Vd8+MHU12luNTsNSV08iiPbSPLAeZ+B9iDUv0vYDkARyZL9 FnLeBo0xS1JXo9GUKkly2wR2BFFmVyhJp/ldQyhLRyUEuGqASXOLKgaAZrDafLeQiGpz3krNJ7WJ b4L94uQ30LzPkAOHaZzUwS+ELRIFHB7Vv1PlG14KXRSHoNKAyT5YkouT5GIkAxjqPSXe8wKVAusS 55bItmDY4xIkaQGSwxIkkOEeEez/MWbgGJSxQHY1xSj/UE2yzID7k6UEmbUkKylaS9FKWo8XEuxW Eq+j2BDrkR4K8fOF0GYVHp6NeibRifmP3GaGvFBGBR/dwMd22EscDJXmWjTdyv9HE9kFndApKd/X QCYdWXL92Zkphibq8UM9pjR3WaW5M0pzwa3EFsYmJdGKjd78pxmOrqE/Deem6o++qZ8/dJ/Z2+wi 0wC3rwo1oZZVAsINI+U0+7LIk6V+LOMX3LF/gPFimUBS0DGEor1BlpIWVbKBfWoTRuPEn+Z1ykLV PbqSWv1qvRdXFmbCJD4cYDdbMz2r6FXFryxxcm1e+WdrXwH/2eqFkx7JGb8XpKtdkKR2RHraDrm9 asziLbJ8XldwKHCF+5HPFc4WzhfOGM4Zzhp4xAIGxp0d8vSRgfdq0/MRDW9MxLun4k3YzDRN2T3A 5CFLyrG7sFj6qfWufghO3TkxfZxIsREzVGidtf156NrKMtE9cJQcq15xurbOH8yA6frsUu2/wOPb tVriLJV1Y9dqqX7n4HUWbH/wORu4FySJqHu8V70L92IkkuLHtQIC7M+KcxZrxnhVjA== 9ioN/tOAPRU/sAFrI6v5GRBci/4UIiXSWtzP59svEsIvNbivTn9gUo1WUQBtgAYoTKCLyuegrSkS 4enyYI9MM7gseG6eJ2HJQuZ+oJsLqfo2PT9Ky5d0/JCJT2hGULztpJAzCzrrlfOlNZx1TlUlqbLn PMgSHBwQG+wIDWBHZpCnMtjRGERyJ8p483KBCFK9h5MT9EbSpHay4GnfI12KhI53gaO6FWX/9eJJ HCr2oQcna+Jkf/A4j8msMSuzRi+zNG/vmUZUzoTC6AXcaUDlzSc1nkwsh02n1HBKzabYaBKTydtL ZC2JrTQDA4oCUXjBiBuiKsHq6pQYvzIwbI5AYI1eZs1hJ7nYSQ09LeQWyC8rRXWRzbdGiK6eCakF yyViOeJghwxcTixCsQqDXci2oRLSCZJKmNJbHy5t1c2m7jXZPQhGVulv/yw4XyDsDpImL1R8s9kC JmZkGT2f3mR4/AR2JjcQboEhaBG/HoPDFCC2Ed/8xk5FuccV91pxLAbnYnAwDrgrk5NRtg71MwIr mKU6Gwulj38phJPE/uGlEE4HDBf3s9LlSekuLRzSyyfcHXJP+6xeuTGb1xuSejWlVzhPYh4Puc8Y /xFQLhe93R2uCPSu9xT3BuHCdy/3Lz0QXOHCdt8D94P0ROgLS9YSQg4M1ElTknuTkjwJQirOSQZF 7lRRUrKFt4SUZLrBVVKS+TbDjXogm95tj9vqqPcc7nrz+zffeUkkgnj3dP8d8flgF7hOAOyFGY0N 6omkAAArbLUaj9ZgpVpesQq8koppjNaIkAWO6wVoLnGA5e1Qj5z0KlSDk89CXUyYpzZZ2hm8o7WL gxXeGXuYsSVqA+exJaGAQeU51PLknMcwzyOgZ1Qk6zY1JwI9b91SfFMWMGNvy4Bm/I3Bbvis10EQ rDkE0qT0k9HtwQ2cZXSTP5UIiYlMWFfC08yUnKHCngN4GUqakD4CT3HkP/+WruQEwcENPe12TFAC nhKV+GneksryqEhhHuy9V4Y2jHkXEViUlSFItKFbYO8UJrpThQAxkXuK3jVGweI+GgNEZee8xABY QP2gZQSsgSALEoNwGA0GijoGCFgsxoJgAUM8a0hnS7efJIyzo0FiENWas7e81YWhO0Fi1IzEGBBn OigLnutsYOK7kkk/6qj+J3HbCasdwZMrBF7UCLvoFHZBoAs3gXFJYxyHaLlaqczcobQV1gbhHggF mkOt65VzaWbEhQobAbM5EJMwkRJoZpFaUZsWw5o57WRSqgLK4eowKbzmNHFnUIGCGFdOOB+1ulTP Fa1qNmEKTb1e0FQZ0UTscWdrqOhAWQIbGRvH1aJyyjGzR76lVK/SGAULpnLzPS1f89k0OeDRee21 7QtDp3cWR8p/MEzoAQISXQgvgQl9WgQWgjchsILYQOMuYB8H6zPhxSiyCEmAfhecT+LycUx+H49f IArG7+PwUTH7iI92yVRid18BKcTOSO3xhR9PPeBwq8Htf3laMweMcnN746E9SimOM3bTvXzBKiC0 kzdgNvKwjYdNXLJMF929uQ4M7dtkh3ppK+Qbkja3cXIqNQm5U7hdwuwSYqfQuvAyD8AzveF5TpSJ F0OC4NvEHMODmeG4+klsLhgf9AafNxp80vcFIx0S5xCTpzJ2nbcDLkhfFMovz0TMAQrX6xOwXsjd IPvtgkxGNW6ykrXBNE6xwBNxbQ2ghJfpesaATcQIaRhi/kQpGJERRPwmtc3leLRig9rAkEv+uz/3 z2bfBgqblMam18rnoyHvJ0IbAbMSnBUhrcDxjJjKNiayNQxeBu2KWhYJIMvLIRtQDMSXbUhyqTsF crCsNfnUS0pvFVM0ydYUJ2wYmiYrEnYEIuFS22ifiGlE7GW29jIlmyQLXqKa9QGfkm4ii35Rvhoj nyrdPATIheWf4huMclIowWXLbE/9Pskl2tLniOAqorgCOnbMEMbbEBn0lGWsrv5Rc51rdAtbbJQk FMcOcEkhZlcwmAqhrVGNAgbw3szXxBY6dArDNa/w7TM+o0AKXK2Rgme8O7/3iD4qPuetMxrgwAMU li9DhJmF+rj3q2vIgYpDgpLuUWt6g7yjaC09KVbApK83tobmsw+BVzBKDLHXYKKgwgqpTqikrZJ8 0UodSU9MmlQcfLkjPqtEJubvPL8wJn39kbGJC5w+/xgPhWmzyJI+JlfN5XEfZ3Jbh0rsUqEQDCbg tiaHIqQbayTDpBvbUIwlVp1CQi6gg2qLaFUrjV80JoLRUzUyJVXV4JQEakj/EEXFqiprQq7aqhgL xdQuLMxElLE4A5MILhItR7BqKVYl28Vk1RuOPNzSQ0K4le2TSHgcoDj6ZwtT8XBRuDVEPSwRvSh+ IfRBqp/m6qKqLPGA4DHngl2Ugyv5t+I0b0zvBgLCQKRqE460lgAYogLp6uDbssWUJMGIenxmtqwV XVtUue4Ob30Gpb9L9pX6cxi0AI5aBKU9r7aHMIwo2ymZak35vWDIVEsGWg0ZMtXhXjLVaacxVVfS gq0bJMZSsDMkOOaCP8SCKmJUep5GVfxsRASaJgdH3hHrH4kw6ruK7R6njvr6nkuvSpxG1m1kHUex 64h1YNj1XnklqfqISHW2RKrdYe8dk9AWud4jI/wFCVR9Z8GdDra7Uxzgr0SgesTgdx+BakqhygSq dcbqjO3N2M5M6VONFAMryIynHn0FEXVIo/pv0ICvEq8cokBIqu8Ktpk2ZNtomiVdxRUIzLRqOVaZ X5UdDUqtaqoBErFqoFWttSBgA0lNQFsZUOoCbrTXMLUV7TZCqdoppSoxQQyA/pp07ynVAeH2HuqZ 5qC1yB4VmvLq6qct80sJNSG+A/ovjby1+3v/V4cHCDUWu/AK9OX+w/h3z+UZpUhj+ldLf4G+2Zqf 8g5ey8uQqaZ0qkymelSvo07ZPg/pVDVpBwxDYKP5OgVLM0unOqpMu8qmDSrZDoMHxMo3X2m3aVZ3 5Krw5PodhU2Q2tdIgShJqj9MkgopUnE3R5y1VGHqWidjKhTlfqXsp0etuNYCRypk6VJT0tSYOHU5 GA7sfMgUTnlW5wuTKuxGYFen5i5i1fWQWDXjW2XXqmeLRtdtr0jGQKs6cnViYTndtBDxhVmTU3JV EQW9sLW2OyLVSUE3EwPtQ4GizdIyK5K/llP8VYlVLfOpxEBsuoolVrWxED5RRK3qqXf5oLcIVXN0 qhGZqp7EnSYK3oQeuPBxJq3e7r+974OUXFVyJakXTMgmVv9qs8RjBbDfkasKSTJHXnLU088mVwXW Ae8jV+1uk6uCMSAy5KqZiGqGXNXXui89mwFjVyy1akv0qlHQa+QtR/psQ6taICu8xzQmMCC9FuqC BtWZyVV3fTel8WmqfLmPUMcEq4UGU9OeVEUajCYtNTAFTF6zRhXMikXBD2m8WmPWgLSb5BbPpQ6n 6cNa19xLlZRg1dZkq1j5FipVW7NNyr1V4XegWIVQIS5LtBpgIeHnpBCRifn4B6YWQ6BIp/plIFmt VQMtlKfsonSrQrQqQHyucSFwfOlMIjCNu/TCgTqaujR9KegwMpRkYJC+0q2CSaOyRKuSH7UoBF4A +6PWkm+FZPXCFx5IVntOG6jp6lijX7j66cCBEFlWNaHyJUfL2uGjYusFWR+iIwJxWWVT5Xr1CdEq aKwkBZA8k2j1xwXTJFvkOeHWK2Sr8LSA6+1gDNwf/7kvFQEiP+QLpCJAhL57jGw128G5kHauj7WX wXRzrqNzXZ2LfGW5HnMdnuvyXP6H9joceukNIWjS9bnOV+wjhO7PDsBVytXrhKsxTW3w/kr92NRv wp4TyBSPjV3tcUXTXPXYiHQV1MVuSFeziSi5VBTpYUO7CtrNvVbhDekom+ZzBDpSS7w6LTviVVDM aZyVEkrJ5ZGnDQ9CIF29JLyzxKmV0s2GZSwL2SxjO58gzrqJ1nLK4WvvMEu46m8MkmjOYu6KV7cl XbVScItYthL5Z5YkLcfDgrhhGW53JV8x15YRdjgfgLHG0j/UNxHXlqTENez5CQYk/TxOdGiZ5D2i W6VSeBBRrJaKht3TraZkq/J7tgXzPOlqTLYavKvV80hX83SrtYGzIm4KOAwToFMxfOoYQLUmmT/U rzMkdnmc+YMIMYtJkeL1qe2zh5dmAKbWDALV3vdu8JwjPAc1jcCmwNWr9nhTtY9+YqSruSSEuyIh +VgI7Pri3t64YQ5fmREp6SqToXaMBmiFWVNpUguFKUgN2yukqy9wNCZdFZiC1utlvII9WCcoDqmb m2deffRQlDMvt1JSPn2ooXuK2FI5/X6g27tCv/pSB4zpV4W+SNhTT4Y1NX1xg3/12YciAlYlUjok TFUaprsIWF/meI9WLd4RsD58qIfgNWOWZMm9eypPrQBs3GYk3N8CCQjoZKlj6/cegVzUUb6pWCQC Tx4AVZ1g7Fn745hd/oqFBzdLPJDKI6gTW4sgrrjM6jBoaraigowKlNoceV7+qAIBIBOpJF+RDWJT mSWNmWBAksYcEplDKvNGrCag+cwlU5/UmtfcMPy+01TuQdObR2UWkcDZIjQkwkrCOc/UDKNJqRnQ leZBS4ti19RAXtxoQr6UvrdrkH/7ia1/iQP2+QZHHzy3/RAHFKVXiJkGjHL6yeUfXi8dMEFhwaqa IUgUqJgodB4lnwN7KYILKPgmrFci7/UZGLMmEAQnCkAdPglWzXALx6UmFiw3IaZyQAiyhQzK0yDG cct1OXquRiJG8YYZf6WyK3dqC0thjtVbQ8ASoGFD2K9+ITPwjy1a+MJf0ESLXpY9LnjANU88AmGh C1qEFjct7HhB0yqW9SvMRG6VgnIY+xamwKht1rZEHAZ6tITc+Ij1+LmP1wP+VQ4oqaqj5qX0+iRr rm8701qTzmqfod6cN5a1EjCVlPPRjoKeHNxYtQ5HqCI3c1hDanD3GsVAUoMGLfsqsvhtaW5BlkkQ SPiEQvUOMid9TKQCziYqUVGhXImQCyshg0nxezYzNmBaGgTBYOiIQhp1Wic4qWe8cux51UKeE6bT UkItxasnovkBzq/1MrbTaAS6SDjntuG/8Fz8Wv6SRxH+Bn6Dwg4XJBUx72hwQ7b0siyuND0g1TLt TOv5Zmybo7ZSFea0Af669jgCP4XWoxbKDSJU2NPanGuQf/v57Yc44I+A5ONoGhnvGFzNBQ8J3Wli d8cchZ0+6Z0O5EX0L3Gzn8mX06bvQvbj9IrsdUp2eZv/K8QI43+w7xylptskdX0Nu6z1fR67DUfm 3zUNEvz4jQT9JPc+7e3eezwzb0ZtuNlG2yD+80ltyjXIv/389kMckOA/C9KkCAOvB+sI16YH+RB+ yAN0QuVjgubUhClhRAm5Ibu5Bc2ivmi1XvE/5nDYN52woH7HnOcx9sTmoP4hOVJ58wNi3SD+I2DJ EuXoB0aOtrVsHMzFAYq8SKk4YjIOKRlGfBzCyFEaRg7SSzZgx7ZQc8SFbIOC0rOSIg== ikpb85FreTCsF2SfN2s2GN6btlDmfTHN7gsMkQZFSsctxVfnkNhdroHBEefa7T1ciEe4QYRrfko7 eMBVHeMZjx/igLTEL8iHRMvcY/2k3LlH9Xk0n0fxeRxeSpfQEnAMq3KbmtxgqBLSRW6RdvlUi6tL PGRZp6GWoxJ/l2SBY94zJEQc9yxv5d+IFzcZHnBjabfR0t4v7I0NDlnXM+yWdVjSfWZJxws6Wc1+ FUO0lHMLebeIk/WbrFs4XLL3rM7MwoJrqwsf5V0t0fyf1cpLrkH+7ee3H+KAFAjc1wy5CYdPMg9s 7sEEJgEhrcJDEPm0Ek9JSoWpIEI1RCg7YQHKjmDOkylhmemV6ifU6GkVYBrqi1RKAFSClO1hSoqL 8qWEwiNSfGTREiSzIlSl6TUAUwcFgpXQuqi1SWuiVksDfblPPCoz7UBxDW412Llat6ttvdVASZCe 2uZ8g6MPntAm2yD+8/H2N3lAC1Qy8YYQ6iDyw7jGxRH1IQH6J4HxQ0Dh7/IQQhaCJOGsV0u8IoAc NKVGdYEIapCq+xY8nstOLUHTLvOo+/txF4y8gAR4YaAXocxH+tiQcXJ03d/6zsau9jrVgF1cH2pU m0/Xn013ktVEeQxsMzEC/8KAjRF5o3zvhYyFyFSCHep+Yg3Kd1nQna6RyNvs3Qa0o/LwFISeR4ic AKYXf6olfWshweCY/AQCd81u3Bq3D28Im/Z88auWKhT2dHqOyi8u7y3MPC5M5G5ig/CUe4ckezBL ZTWvlSpYiuYQ+3l3mPqDBOqS/yM/5SklOFYFVWlukDyFr13520vQTKRKy4JImZBGs5Oe8ITjD8l3 Nxnq+Ua9NNdcaldbWs/vtp8ubTtnoHDgP7vMZHrAF35cOSDNYssilucRy0Hb8+D2hnIwUnx7nlEs B3HPgNxBQcT3gK/ztEMHFEt59GeGfD9hSEmwspCg3g1W9iXp2hTeDvsEgsfyB+Auzqon5A/A9VoG T88fgONaBkKVEfhwV1ObuEC1lDDkQj5MFYp7nRmWtIXKFCtHrlQqrhRVLdByYssdFLQv/DpauZhR 5oVUL67Q2LBgc4Gbj0qnu4T4Ok+vuJJxoyw8HcTFjBWEfk9pgWxxAUiqC0hOQBGnQyZUDYGYIRAy CBNDZxb6aNgXlFfez0ow+RZtkjtAFapjtoWUa+EK00IyRWN+hZQ/YTJRz4Xx2YuhSbh4dh3keykY 2+FJKGtA70an/PSBcMdSIljUdqFUCC3Xl5Z8FQwCA9fkQgJLpY2p2iYmQQhUB82O6iBwFgSCBPs7 7LOdkCB0ye/4K/FB7c/0P1rgq7M/K8x8S5gK0iTsaWf4d6ydi9GfZsCjqQ9J+nvIfY8BwrEPL+eq 3xELJK76mE4gpQuwSeohPf1qsVTfAZAtlZq6PBgPrc6OlZXseXfzLWQy/1el0r+W2W/S9y/Z5P19 0j4i+CxlQpqsn0vUv8qRABmaBOyfOM/lLkh3LsP5WVV8rxPcpOj2zadpLEme86ElgesoKkNl60rR 2QgyQiCRUR224qoNDEMrqgv+xAPmhZpEAjBnp2yCia+h16uQZOCUpYkMBqnD1GFORgtIfY41hbVk u9g0ZOsMGpam0G9daJXOkBsjTAaDakRpXkzQjBotA9Jx0qtVRRcIFGesMJWsNEkqcKP5gZ3KXNKj JpMZs8gOB2GLy+XFKDFakyMd+i+qAvXEGlDLBo/UgLqnuJNcbbjetLhTnE43gbn4mFWw0VuIc+ny xRtaKd8A+zy6NItOyx3tyjtJisqLPm4d8CppTa7B079ivhwlr5Rc4tCwWfoqg5wWMDIO/9zTi+pU dmdMNSkr909lbVIeHjwQ8Zc6XbDqsdJ1SS99OUT3eYdJAZJ7InyjnHmCmQB1fXaKo8lZeYFjPZS0 0pXnth7aU1udK7cTPZ60kh7w0TSMvjg7Va1/kTwMORYl0jxxKrjvj9256Prm+dPJHONaMoh746tf f/zw20/vPnx+9+HPX35pckTsB/Drv/hPavrkt28+f3776cPPTz9b3r19//H03ee379+/+fzxC0jf 8NO5dKb3qarPreuok5td7o3Wz/fevVP17u6+RxrhkomE//k/8M//y738n+7Nfz81p1+d/uV/FKdv 8P1//p37lR71W/OeHPj0D/7N9HTxu/L9f8gc07/3AU/5G1o/lArk52cl9LaF6/6CKH85wSkUncdJ /c9vcqf79uB0j97Cn9ILrQefZ+VfuA2/wMQrTZrThCa8dLrQsj13hRMIZVf7WxnpSt1lOcWxdWPX nJ3+OJ7e+3eL+tw5HcS96z6u3DrEd0u3QAcvxhp3sfKm+4o72dn7bfm/urO7Cneepj57Y5nedbfi TN/S/e9wdmJo4HdLPk8zuPlcy/8OPofMndx9Z6w7Pux47jucZI2TFy1f6O6m3nNX+RO6xeT+35My dx3fbXuua/fdsm3PXvvlW/C5XoM7SDueq/+fuXfdsS1HzsSe4LxD/jGgFtw5i3dy/KtV0gA2zsgD DSRIMIyBdKSS2+gsGT3dEObtzS9uvCxmnsrM3XZJKp1csbmCwWAwGDdydbvLRtuNIbR1z64qGZfv SqFrAhdjH4e07FPrGRSzU8pin6yuWFxIz7WMQfRWndsxdfm6lAvluZQQCVqDDg28qSlR/93w8sbH ZVg63pK6ooh9DFdnT++Dxls6sVdH0YBXmJPj83Xl+tTA3MgcLw7HK8tT7eOXjnLrnIpPpfWpuHic JT/juqSn2mnvU0iw2rnQH9CuiyOPp3q6IxrYSrikXe0SQoR0xSsgOtxZoMpi9kzcbRQ6vAqB7BSC /93mTzy8Pvm5tadWnj1Eg+guz7nb3jgZSvd5M9q+Zmsff/PP3ShmpuW+F3evCKPpPhQ3889gbe2r z1cjyNfon0qX+MiC0Yfa98+EZqVvtjo8d+X4VHuzyxsXXBeqzufuDAhsH4VJa8dZIQEBUq7S2sUJ Gsj5zqGkwtZH0vrGBUFIUWSi8xbt+spLJXBXrbfzVxfKyz0HJy39xTNCsu0b9x9cn7pYiagEiqll 7esDC9N13jZGiZXbfQ+i5wqF6fHpufi+OCDEoV0i5/twdJy9L0fLNXQet879F259VSxK6lQWRenL OTYsny6vKchKdSwqWButyIz33aXDU1/F3KZLZHd6CVh1Zl3HDJFsvStt6KFHKobo+/KTyeiarETi ZejLV6ay09WtBfC8cyjJWr4NZWieLmWuC0PpKqk11TzlufquJLqK6cIji7lLebfR2lPX97Wo2ukM hbzE1uU3K7ALazecnjozcO+yTHvnTHcyn7qeTVnoh7bxkEpone7NCtDBmqjdcHi2hhEWVp/ETlD/ R4TLd/6kPl8Z55qjvL2PxwbaqekeeG/dha07ebL1QRorDLjmQzVVGvpM9LUZsH+ofizdLXzqmjh0 zW37Tl8XT12R9p1MX+5rCt125ei9TnIXgO4h92H2hWQt+zx1p7o9xYwPjI9xXl1Cn/qe1R1VPxgS uvz3zqsJ7T4cHSe25i6LtHWlJBOaEzZXyGfXsVEY3XmZWteCwN/VWFGFGy8XSbx9Ykb33Yr3AQ+J btKwb3sN21BfU7SD0joIPCPg63XFpvqaVydWTLmCqqqahaIoW1vBN9ehLQLQyNq+jcf2kL4QrkoS TavrhRuHjM24Y0jNVdWdXfRZ9i8v+ryPqZuxfUyBzvOzkKbaFyG2K+gM2UcyJpKGlOGtNCUKGeEO 7OZ3TEE3odYnj1qmLFsOtH6CZuga56q2geW+q1HfzYk078MxuYVKhGECDL7rABbcvmEgwPaEdeVE IPvOIvMUsLXzmLoSye2KNHldx1YFXt3Y6oqj4jy5iLPj5YpBBV/VhOgairZ7aCWnItlFP7bKqq02 XQ9JjB6s9a5SzQapfU8haMi6oG6jGuONvInTRhKaWH69vU/UY1cqocq2gX26NZLBzsisY4uFdHzA WpIB9+2vZkdj6+tTR3wpw/AVDZ+NtG7TBtpNum4ew8jeMYbWPSobcibhgE0SojGH9Dco8MHYuI5q KOCuPsAJzB5stRcxnGjvbSKmrDG6qIJcbNItquHVF2fXtk+tz55u+qT6Mb8VhmrU11MfbZ/fBrdb N2i15npL0wGgsXVeN0iMznhXtmS2wBKrrlpDBA+fGgyrS1tuAxojhSHeedAng0TqRVoXTGxHEVXu SawwsQ3bS3I2qFa6mu920dhrOk987RtDH1QMOoPgHjGqT3bIzsjKmFayetoYACKnaFmS2bLd7u2T 2od/dXVnfCIzsQ9/Mv23AZnhgO2s70FQpl0WaaDYDLFgMyycaMZMn51EX2JRG663o/nsuqjv9zxK aDNMJ3afJhsqNvLu+T+l7s00GWNXkTSZvR1Jj9gIrXOyK3sSaoDixVOZIbSxajOaSQplyJzvw7Dh VR5216Fkabxw25J5eFU3yIAAUt/h4O2U6nQoNIl9yD6KxHQ20Bz2oZDJLmwg1nQYeWJCT05dwaZp w+10d8FwYNdVZVYjBLwAFKr4iJ1kmr5M36BJCluGocPr9k2oDV4aTK2LrfcES4X8q65Pgxhq3d90 pcLL65OlNi88PlgjrpMenGwDKfKOBi+xeBHz3lHfrDL5d9XJHg4L54JKwSu4fEQ2phS8J5xR9QHM HqgBkNRdP+m98yvB+utA+uN3pxHZUBsvUQcDKFy8ifbWCIKT02auRac7JpjTvWWft6CjYkUH+nRV JNpnAsVXbEr6CIVTsD+DkeVoa+rIneieTn9Oid82Lx0jhXoBsMCoV56AoP5vUUvrNp55oKlT3ec8 d1eDx9lXRrf3YXzS6pIRtdhXXxc/stiEpAiDN0DTincBGxix0a4qcvcLtXOyBbo4F+kapkdu1Mws N6w6TFtHF3Lxao2Qqd5JiV7cQFIKXTyxsqKOeRuGGX2OvPa+GCoMqBduSqYYjB4niwozS+Y2rMsh MB4iAXsSEQCd10oDIQZJM2aMHy42ST0is+hK1nynGgY1LN1LjI0c2A/qsGGTOVxYU8hF0LW3DULH dsFv6LsARYoQl+VvOD1ZHBmuM4ckl1gXtA+CslDnXRvynAfHXiM2w84BcR8LO9oAmnKHbeYzb+JX dQYkbQNjqEThVsB2HNgGKLJfBIQJEtw1uItR1Vfihv2FqnquG2Bdn1DfRfeQgHgCViC2J53n23gm BsltU9PFU/QNNNylRGF1Zkif/b5Hkh2ec5+3F8ZayTOA0crc6GJ8XewBmC9LVnJhI65vHV75RsqU gj/qVXQOd73tCFjESIHXkR2zjZxnGWRMFDDwZmwH+ESuEizoRHS2BbEfC6IbvzuN5bPS4iK85S7s XagRUJeYRjcFA7aSiK+siSGB+GHukoGAn3rsfcshLwXKT/cXiidgj0MAUtcH+mmIfyQElNSOipmk pDesur8jvNbhlFQwRxaxzIo9jVaoxMgQycOWDd1V/OhmGc57hYWie7lrOGi/YjGe7g== rEU2MMyIwTAvJEmgE1WhgSG+wGQJwzsE567+/zB2kpHffZlc3nRNgYGIQG9fK50x7bqijfPKFZdw dQ2hvXeOlAS+uzhzDloywQm0GdrG82mB8bIldwexz5lYs31gF+0/SCbJXPStpDXaqTqjNJ7Yt2ya Xd4lZSa7wXIVRN1j/7kUlbf+VuJd0uwZCtBA/hcxyuIOYb/XUDQcHji9vJvLRCQOAjnaWNX/2wf0 bpHBPgn9Bnsxa2ohZM/7scXR+4bjYWsjCp6iaANs3J3/tJ0HVcyRAr2Bht68zuRFXGIDqVa1z/v7 0E8RUTlba90WhU+dIq9Y4UdgzvXlksvgHCn73rtpsm08nxWYCkfcsyMtYRm4IthvEL/zRYx9hGLJ VOxjutR7qVlSD1cbW1RNPCyKhSaRtoZgaUJIuQsBrHcC9rFW9H0FzsQRsLMfZjlwBrWxu9NGbgpI ooghAb046w5uaeWOtvG8V1qaBAfhZceOnRmCYJZHR+IFUUddvVHIFxFjC+X3DSC3RIFTM6Nq/7t0 icDY2yWuZ4W6hpF6leEMI3dQcqSAs8WkusMHK6C3wyUvyo7IjIP9EwbjKATc+7bN8DaezysYz14s VFxIVf3lS1JTEQEJ0XidMxQupDjpWBNiv0NDO6eRCGR1sCS72dL7Hwkv0kIIP1WVGnJ6IVcINlKK j6GJsydAa6yHVUIWH+0RqmApFpApAdW3Pcuj7QN7t6bpxkrB7sIbZ20WzCWDAqm8GjUgWzkQiw0g eNWpyM9haWPzCW4KZsM8xj5lnhvFhirlAiEXeURYfMuN4pdj1+vDJe8ZbckdVtZ0DlYKYTpdPsxG uESdBnOF7yMbvPl4NrVhXXSfG3mfFnWlUTygeyhjofW9GlHwfA0jpiJA6CnMUNWgrwhRdhWDSzGd 5GWwdnwjS8kCVi1zBhYpQbV/WuI+uqLtkyA6B5qEabku3Q8ib+jZDwdhG4ZypndD7m8W9fDCTclX o9C1OF7InUUE9tNY8hXOhqMIjPl2XQGTGCDrqlnPChcHNg5EpFbVtA16ArkPNbG6akA13BPlxEWu EJDEPgJ3P4hYgg3wT+EuZdnT93Ho+GDrImuJTdTBNya7PYhGR2AiSHCGYva8W6oC01A6DIWqAT4k 0S6Y2WRRJQsoUQiMstteMHbZZE8kRo5ZE/Ci1AClmmWh959ZcafEKkOseZITAC02eRuNDjNCkcMT QTgja1gpS6AaDK3FvDDJ9/fdGlUK6mMgLoPR+yjbpudEKFsFOngEMCWL37eArE4G6t1Jd2iAAfGh TGoKa0WWOGxtpJcApI3SGEJxEER+xdC4jUcHiqWNAEHfOTreS5QX0vG0vPv09xUnKhwRPUrrdxuk aeZIU2hgYXeIgpnMEjiCF6vGdZGwOWxPr1hRJwEp5sICYSAkhAUAOiGrEQRskAbQNYL6sXEcCtAc mzoi28BsxHCLaNNCblsTqTGLP4xsSg3DHXAF85gbCprGkB0lyjsffNQwMaJ6iNA6TmUpbbAXKNaE fO4VjDbOY8BsDLo/xcYuBVnHSZIFaMIhLPpEtqp88IfSGxlhL91696GNMXfhR01YYHdazOGMmC2t FjEmkCrpEwR/TRz9blWgFBeBkBaKugtdthFImkKkfdPv7kDmmjhmto8s+8i0ZdlY4V4nhGQqRWZE T8DuRlFINKu4c7M8keuk/tY2Ah2ZD5xEV/X/wm1JT/T3cSuH2PmZUnxwZsxF6QyFg6/5XOobKaQ+ t93IGA4gtnLKIA9PD/t3N1c91oemRMReRNzsiqYEKTCOAHmV3Qk8QEYuuuFH7MP4rL1WGrOrL0ry 8qjmA85ppa2ExJfY0mnxmTxj2o4IllFK80QrUJiX2DiPiJeLmqkXe2gRghFsU6OyC4iU7p3dYKYl m8Sz1n0c9QPYn7WZp97SVOWyj+G9hlnFOPsDQqEIRbwwTtps4OiqCisS+0EMV7e6Au+1q14Eg5NQ XZAsQRigWqVKZ2nOGHDlchohm6IvMDI1UVGRa+9k0gr3ZsxcyHhDIuvELISXIOVOQvj7MD5tyl9I 3GArqSiOSXnkcMmDKlj8YnRX3YaR2E/qmVSWGahm32TD7jbEVRFV66otXlrJ1V2fDIOONl21NbsR HJxnizsntcPhH5MhT+VotvIil1qxFleViPoUhgZTc/dhAfqf3iEv5CxRbATCGIImeyOLoStY/2JZ eeRN0Rd4G809uyLXI3YNY14xxcuQK7mklKmbYAKJTksteifsLGKJtTaqBsmOpThEsJqlyMLBe7k3 9lFsqtuK2MhGAcg6oocJDxwrRM0W2YGmN1EW0fGT4WqSU0fOWAXHUyYnbnKDQr6SVrkJSJ2qgJjY 9JVlCWcRGijfZJ6myIxvk2LfR/NeFWMMhmkULO4mEhMQGlT3QySmbwRJE2kiMF33645k4hJGnaCI CzRCXoXl2qQkcoXmJiTPC7NISOAZeivW3IbwaRHJKEloyGKPWtnA1T3VjUrZSI4K1UmOOlmPIuKn goCyikLfaPsc5jg0osNG1ntAiY5WyaKeAOk7VMhoGhk5+tZntaShdSmhEAJ/cEKjkn2D6bZkdVN1 7DaI9woGMhPdxK9lFNBmTlpUP8pn+65B1bOIH43iWXxGwz+VOkpnA7bYThmKTTXm2uUhdoEvbvhs CLygGq/rZV00KAlC6gf7vK5CZMgQlewwK5lFyAW+Qqnc++9uYxgc+EQhNbJv5CguxZqUFrhVa3br DfWaS7km5WH3ek1ydFBnNddrwi6+F2w6VHrdKjZpy9tLNqEyPcLRS80mNsLiEYVaijZv4zLDu3d4 KNvEHner24T1fnF12Vy4mdKhchMFvmvtZqqn4s3s79Wb2CLu5ZsO4n+r33TFHwo476P6tNJIiDeg iG3JYCBWfvkthQFfmQt55xwGSQHyOUsSA94lO6JLFiNJ9HVNY8CDha7Z8hjXIZFBbhcM9TWT0X3z lvZUxm1o795lUOaA8ps5mQFqstuyGRAhT/UeczqDShoQpFryGWCjON5zQqOzfJR8WPSWQki3lAZK FG85DRAZmI1LUuPiaoI1q7GN7CFKJrWDs4t4F0J4s7dLwaXe/eLvIoQFx3p2eElMOoNWh7dPEpT3 5PFiZd1cXopVQPdOPq+jevnF6QUHDl5vO7u9MDJJD61+b9c+zq+OL0SCDkMsnm9C4SLqfSfXF6Y7 VXktvi+kd3N928H3hbzBYpmdXzLawfTZ+yV2YNHO7u9tOJ83Qi6uD1+skFSYBbMZAiGgiOlih6A4 ZTNEUjxYIvgyVPKLJYItgkY7myIYNfcy2SJwX0i9zcYItASO8KzWyDaa92uQSpv4Yo9cUoI4GSRQ lyQXi0UCp3w3SZz6/bNNApcGeanVKLn4mNRklfBqj6tZ4qhIPtTFLoFgUBh+Nky20XxWViLKh3Hc KElSBuzpKuEqUK/IF4Rm9TG8HSE24iRR0eW4T0niEK4aGhGxushB7VBlKUYEWVDRjYWm6z4WPuyC liWI40z5Fta2FlzBrkfB3k5R9Np5oo+6EbBe2fpZB/RecUHotNFZLwSYhSGkAhuda3Mqg93coaIr qiS8xDZBCskRj3wWnwrKlI6k0FEC4WaUw06UeZMC0d4LVzbGMBxWnPi6YAEhYBBlS0LIpWKngyBW P/GNYrBUgesUuIzms/KSEeVCygHSi9VPxf6R/6YtQA+tYc+7MgeVu7q3Yn8+4QM8RVYEMktUkohE RNBCvCSlYCgKLTLETLFzjreLCGUpZALGXPX0w6Vh475qs2SostTXUZQgRetmHc97xYXsSVjqfd33 terslAdKs9GVzjgKISH/BQcV9OiGznimehyp+VO5AluDcrP/7STkrZsR6VjIEFhdnR2IIGeGLJFm xzlyRRSH/AJnfIPxzTF/sXhvg3mITSLJCIpIqEmiSRZkb4NG8DXH4q/J/LAcC2oDLQuhlu0UHp1S LM8jmmIZFjdrek2w1KkAX/MrCFHHqh1JegWZcjNMtgGZXaIZCDp2IocNLbmC4wFjA5HcSvfcs2Yn LbWCSno9+jdlViYLZiRWuGRfqeK8yjW5bCOtMoWDRlalLy2zniWpgjKla5hPy4AepT1Q0FjiqjyQ ManFyoxJd+D4jGyGqjlw8kmLGkxxFC4OXPQGajPdpjbmmm3RG3RcdlMbOMmjEW3VGggbWWntNoyP 6gyq6qh5URkUv5OUv6gMRAbUolWNgZiFC1ZrzdW/08SrvvBysGbVF+ywz+rCT+X4qi702OesLiDF ZRw8W4ahbOhGFZ1qhUih1ISqHDhDjU09JtkrC4JuSGhiF7MiIXx5M3LZRRd4A3oU+dLO6EZ1AOUV qJ5ESKo4IIFIMELJehysBhF3rFufLV1Dxh4o0qx9RTnwxVnqLsWWnFlG89k1gKPPNXHBoK9ikKLU jDKwMHSiZp66R0PJ7L6Iu66sygo+soZaVs20lsol42BF94ulJe2mXG+DO50USIkZMMgXDVcHLgGh 0szijUEk8I6PRQ5OFkedF6dlcvuA3rscmuPwMGZZNlAcIuoLEFk7PfWKlBGM0g7zQaIuOECFAA3O f+upUVSuYVHSCUgtxXNsQ5Q4JBoFIoj/lMAFrgIjLVnyVB8KRz4wLRJEajjMH4mUZjUj6yA+KyWd kuy6FVyQe1emOK7hhCtSitX+0bosiL6oGDfxTjIf3yVY4ZLtEkdiDkzGkOCWaUS8OV4CFPoSwwnh e0gXDrVr7XWLXFFUUD5TjKMOCcFShmOzj+O9soEQFvxtKh/SAxWdDwjywYnTXG6k0sd8jcwmlivY iVMpVfQILGOEE1Pi0u/fcQ+0t8E/1sgZIgSwCxD50Y0FIaFIiVLdhnFYKHkqWUpazkh1J70HBEj0 7MQ+hs/KBh326es5+1EQDjOnTw3SxUEWDKqh4JuhmEt3LtQe2XFysTeh7LA4qLBM2+FQKJ9pq3r0 Gr4Pjt2mNOJdiA1BB+PQlxoIqMxCRWeaEl1JiiuwVV11nG2Zh/Fe0cAhTJxliG6IBqoJEbvAsRwV DYpr00kdkw2HKE6XRlRaqWzgIAk8JdRzqWygxLMlCuyYbGhiBZWYKhs4JFEov6WyARMCgSctXSKY Y98+1CEb+yA+Kxs4dI/jUvEasgGLDoGoNmRD04nxGrKBclSUgaFi0k68SwQCBxCv0Y7KjQFT2RCj MYSpvFvuaEHhmCWgIsdiUXqmogHeIYkJN1lFYx/Fe0XDST0sMh1UcvPCY6bS8iY1Cmzh0pnMhjCY msyV2UT11xrW4vs5oPScxq8a3yCDa0iaigvOm3VFibSuHgOk/BrOtRY2QnR4iESjHnGqhodP2to4 lXgbxaeFw3FcnJJF9bIlg1xf45sNdNIpKoO7UFIxIJ3aaHViC2qNEJnLtjVCsJCeAEgPd/cOLjpW bLXtsDZLoxebMQDXRaRIh5W1AJSYV2l+jPG3QbxXOKKXCilcm1W4NIZCwV1F4zyeHQ== xK2sykMeCWNUKUOPISZcq9Uc4oZbHNKjwh6CSUoRRwvVrIYZhoornHyrVsNINd4hDQs64hztRaQ4 N2odHc6nhqmifR/GZ4UjYidH4r5x1kwCgbR7h2H7IMmHAxIoKVVfKoLBgSLdWuKLAmucGkZt+yjD ZH7C8HI2CJy+QbWAHa2kQqtGrzZdWQgU+kinQb0qbDCv79KsTJTv2yDerTiiHM3HH+TjsQ8f+EAX xR2ylTdKmALePC5pFigcVXJgrnFqBC9WvlEjT7Xr6ARlAHSlRgwjKH/lzG2LReUR3SAb/RpWGCX2 2Ej3fHqRoZlPQ7g5t3Mb2WcFho7AFb6/Kms1NN9QJayqSc/ngzznuXrZWSozSNYWQdNanXGVDoM7 2ibjiAIxr8Owv4CMI6thOkNKRVgoX6PDFsFOnTUKJQAYvVZjIfjKRyXcuD3kNq53KxjY5LjvDJGY KvXTscpdFhfsTInExsQTTCdigp5SK1wNTbd46HlqzH6ApOASj6iqApdtoe7sQmJPytYQIUdBO50w KpPdh+p64NQDr0nv0bjKqKJNkrAAEB8X0X7WAX3agnV66KdRZc+LdELH43DAp0g+FB47igIubNDB dAGVDaBQyvZKW0m4ASwOy9bBjQewq08DsiRdqLpK5hhwkviicLs5BrzRoLA/xsFIrKLeuRWN7sMZ 7BnXV2rMtMmtmpCZBpY8XVTwzndv0h0bvLpgD9ENOH2b68tESokKb684NlODng7q4s8RY1ThOq2z xgaSoxyRtlxlELpR7jHq0Mk4Rm+wfjTy2PiOJLS0qntaf4Uir3UUeJGuo1UPA1wj3o4Ox6Pqv0Nb tOKdbWCf1kMwbK/ERSIXQiLKKjpYhKiYauE+eAo4oTKoDHKMdK8XAxFLoRDoAq5sAypS+IDAcVB9 gb2OC/ZwZCgMlvLZCDKJxulkuomB52RwNAae0xT1sNNtUI8QqtBGsVCWyxfQEaLl3QKsRVNbfZww 32Aqq+GJ4DxZYrZ5IyOI+33adJwviP2Kake9eQn7JC6rmi075AjJfK7jvjHaRrtoghLNVWG3QzwC 9qnGLPdRfNrykVJ4um8ohKpsiY5OMEI1jGve4C4AlvT+Kppnpnq0omNNrYxLpbAXwR5qiN2IqdBh 1RWylauWbmG8MGZwoVIQYaSjP6kuvMcuibg+ZqjaZTLrMB4iMYV4XZilzJnCAoM0mvpRcJAhMFnK aggGFwCXt0V1LGD7QGByGgoJyxQCkydbBysCApPlajJlMwQmyxIUBhLrc6U7sKQZyQuy5OpPb2P4 rLiAEvA5Ny4AEp6QtCAknpU69i2pIqIYA5hgSEYenAPBmY8ZCMEkLDkv1+uQsCD3YAtBjhIghacX 12EBQliI78X4ScKSq4noNoZHiArSBp7vjMupyZGDS47MBz8lYqsYHjj9FoPd2UbnZoMbx6pReI8b U+hIa7IcTaFrOgLKTiT87SU5igJXdRlwt1vE7WO4cTEGO/JRcGMp0eP1HIiTmq2Auw5Ef++j+azU FL2yFjESL9ZykUOH6Dkodxqde6PjrM4uVRWq3dghwEU+PgyHwBt3SNgAjFkUA9JaCObR8dcr212A nD2B62Vs5HwDz4Fx0SGhgrkq497XdSwPMXhg43W7AIc5Yeq9CIzsHQT1LzVWcKYc5g5OzprbdVW2 dnB9mt37cRU2dnBo32qwcHAfHdUyHbtGqTWWWs18R562JFsHt9DaQWqknGEvVDgUalj0lmTp4Ci+ HpLdB/RpOwfWN0wCuiKtVuMQzBxcmuvLGDbMHGRHoh2yqEJ2HZVIYCSMHNx+YJ7qVVnB4kDuZYfF Gps4OF4SNQ2OQUMM6nwJM9gDC2edh8YmTuVQ0O9Oo5nYI9eoP1F+Ar8Rc1SyuifOF2t3RxyV8OKM yrWsoXERgFUZXHxLk7eSVCrm6boam/m4pSVyVokUuZ2ilCQqnZQdMMrPUqxXPc7EYWSYlxYlRQk3 FQVO15xQjh5qLtSRYUZLCVD7okbhPhzjjtyI7uh/LWZBVQDYNr0oXkJANNXpnlYtwgqV/9Wu+Cor uL1TS4qjF7s0iS+3aRSoHVV8UWop6XhwGWENSlChpdVcxKwY7QAe8QhZbHSd2rg0ZhnO5wSDtl+6 MQNpCVk1lLmmuy2KXrqJIkwqJqPrk73Vw9AmgKpw2Rcy5BrKFPXjoyyJbntGO9tpLs6WoJ1plCzp D0KodwVip0FBJnrubxhKuf0DglBsa1jH8oZUoH+61qa3pRN+L4IAtUE4OGS3oOFeAXI/Eh+TFiBd ShpHyTQMLxQ/09UjV7BNiNQOgGqHZrmFCCNP6mZhK6eic7ytJ8VxUNdQ6t1RxCMnnZdqu/E6mk9q i8rhRFp6VexaXDJKl3RAF9ihicxXofPZNPUOi5xKQKzPwkaI0FS+YMPbebUqV7z7cREATmtx6R+u 1tJTFLjGjDLrYTrS3PiCTFqietLAiX6m9XgFC7uvA3pLXyBySxdb4ARqTpoc4bKxOMrGECEockF9 1wyWTbPDevhymHKJrkCmEqZL9Rru1Mlci9G3hKhAinhj8JcW4SEzQ5c14XW1ynAZuOFU05HYJDeL 1JqMI+uAPiccOIBCcZ+MMw/e6S0PVP+FMsOggRfcdIDIQU6T/a3hXxySSH5cTEeVaRn5UnHmkUCk y1cyJUeDugNcCIJ6J7Pfo9yJkOPIytNtbHKyAh/g05Z8N2TCWSG7wHMdzxuyge65ejDzni4Xpl6+ ck92fi9IwTId7Ch1DP4SLtmt00HOF9KNAXrzPS5SpWtu8iTaIXAIAoN3WT3nro9RL0yv++FbDZxF pyOOawGaqvDbiD6pORApwz0YKP02zRFEddAnXiyEJKoDCk1r9IJojtwmxRFEc5AmjqMWEpojV77t kWGiObAHhctZQxRb5zbK9oLoDWjNNkWpSG+U+TTRPpq31AZlfPpMFcoKysDlNtcylY9RRA16A36H GRRB9Ab8PLtZL2S7Ot0ukqEgG/QG9pE6MY4uUUUdmiWsqSS9W92ZL1LSsRtKs7CCqA10bvcRbeP5 pNKQC5Q09SJXprTMJ1KsehJBAYRDULOmaxZxkkznYYraf8g50u3zYZylgex0OrE7lWQBgICa2Ij9 c1yWQglnKG09SUD2Xl+sMY1UJnE0ECVZ6xj2UbylKapcCJD5BlOJgvBJ/zm+k7mUk8w/rYjPdlTH DtHQvS/daoDJrtd7BblzEDDvLDRJZ13paqlBNhUSop2eZMaUCz5dF0HKNdGtBam2YXxOCnDciCLB sBaSXIWP7ACV4CMjJpFkSrPQNQC4kFPqZlyX4sbtnN63kuhzJIHSfk2vFkiOzFfESy+9FdjrmYtr lDIkL5mw6MeN+TgPVzKbH93drNrSwRcmQ6VoAmQfzRvigP6T5y08Swg+2Vd6pqu6UWYcGjeklLv0 xFsUEpZWSoXA68XpwVJGdoutVQD1nnAcU/GBU67jBmIU9F98s1ixO3bDwGmrA2y6NF2q4e59QJ/0 QuSGa+xwl1b8UgUyLuONer04An4X/DM/IuUZbhncVTdS2mSLo3y8DTcCpjgCRzh4r2Yzhfcapdft 1rgsH1mhMoTLXJDutzAtWh0IBdqQ+/ej3T6MNwQCMSvyP6UCQkbMlyt33mqxIn3co5Ynurt3uGIo ZMcNx1pejfAokn4ITWklVhablcJV3hySUC66CdkCsdhIcKKYPr2SrMaZVBVgqjnBGSQeg58+erEN 45PWg5PbzXKavvFyNb7TNqMwQs+dXZWPjMIOVFuG8ouNKuYsagsYWVXZjfp5CmfRJfK4F90+LYWz U41uho/jEzFgSpATarpZ48JL+p6LXKKmOCn1mcP01ZltPG/ZD+ge2jxHDsa9KAKKiE/FHhShIzsn jvIFXI2Ju4lgQWf7EA7SDbjX3k8nmRGW6vZN9tOxRASggH6+Tgd9k35CSzNenOOa3jzdikFBLRi7 ZL63EQhcxvNZwxLXEdPZMVhKUfgT+LM4dK7b3CUIbaDjH9g0LbnpmRl0kKWYjeT0GpUwLkyB8Y6T AnR2OeoJEHJIPF+NnzX2jLZy9I6uQbamtLyILvsWCYx6cklQN2sE7ON608aMcm18gu2kX6ZAKBzh CjqZmicukLIHtCb9PARUJznsuHUnmpF8cYE4nf1NZgF6jmgR1Jv96fn8Oh18Nkc+iL1BbYtZ5FEv wIsjnwvlKNe/ZW93M+8j+5y44IAW7rOv052tCKdAX9a8aHuqtMSVi76atqe8KS5XUssPiRocHqxj tyuOPxBQ49h4iueMU29W9IhScRxHrelZ997iufK8U2IavMh1NnUEU/dBvCEZ6BjHcGphh+VFXsfR qIpvn2QbL7mQdZTiwinLTB9VZ+qWgI2sxvExNmyC2Ew7LOtFnJo6qZP6x1eUEOrHjEughk7tCjrZ xMAVHBvAOROtl9wH8TkR8HIlF4UIq5ym4m/iNAqpjdqxJvcjIT7Zil1HzdkefCQs6pVtl1yb2pWb XYiDI1eOG0b1RVG1e1HVBO6NEJVIJ+c4unldkqZCWeelMT51RlEJ7SQaWNUZvY3nDXHAsUE6qePi uMYLCOgyTWBtNsqAIkGOJl4GlNKMMIJdTUqxcDWgWtV0xS8UGkKZtRo7XHJyBUkKVqmaG0V2qarK +DFw5moMoTQ0dV6V7/t4JtH4eUfKoqinmGlILxvM+T52xFoQZqVzPo02XfkwJz9/+0IHzDjhN9ps SMLak7xksM7Z8DSw5K2nPHoyaqRN3JHEe090zWyTkE4gpfuygWIKVFdCMgSAp6rlpL/3R2BqlZ3P 0eKGYe5FXhEQBZXoJcGR1l7S1IvQwS3ajqHdeqGbZlVC4SrLPbMTiAhEipduWUZ6KpCNr79L5/Sx E8oGE8i3DcMMKPaKgAoTOHCUtZeivQw6tMWKYRuLDjEqM+lLQEWLJA1GwhblLAJ9RKc3Qu0fNZBn IKPSSEzCaHNDsvQkLxmMhM2w0J3LU0/yLC8xNdqm7kjqvSe6qDMxC1oaztAEow9feclsNEkw4lIv +l2eaXYiT4a1iRuOuPYj7yiM/jUcaesnTf0oLaPNiiPd+/mRlzTDy4geGwxnbbrNmeXGSVyyjDZQ A/I7PYs+YRq1TdhwhLUfVVwCI6POcJStnzL1o7SMNiuOeO+HNNAl3yCLY5wGC0wjMvJY+S0w7iol 6foMXMiHo6p3arPjWPqRdxRGNBqOuPUTl36YFoFN9BOOfTw6ThTW0M1oF3vYLxOMPONOY3G8KLLc LQjzSH6n529sDNHimtrsOJZ+5B2FEY2Ko1xrP/os7xAt1sZvOPy9H9JFIs8oQgtyY+wEi6g2ibIm stz8E2Xd6DMpCFlb1iZuOOLaj7zDMDlqZTjK1k+Z+lFaRpsVR7r38yPrAhp/KmM+DSZrC7fxgodJ zvx7uUlbn0k/BO53arPjWPqRdxRGc2E4ytZPWfphWrRN3HDEez/0kTHhaZzmc4LRXA== JFn7UeYqiX6I03wm0SHWJmw4wtqPvMMwmQvDUbZ+pvk0WkabFUe89yPfRdYImI1zghGNqO+ikhNZ P+FiPuuzbOH822iz41j6kXcYJt8KMBx+68cv/TAt3vpbcbh7PzSfiaN1vg65NVhhmUN4AjkLL7JC 3ybk302ecOQU4eWpzYojrv3IOwojmTMcdeunTv0oLdombTjSvR/+5GpiRRzbmNAZSLNBZxzAxtjE ZrnERVfAN3otinKYWt3wLL3pawRMUp9leNK19aYAfY2XqrVKO550702/M0v4UH84Bj2ARiyVThW/ Daf4mYzAOEarsOMJa2/6GgODEqt4wt5b2FhMNIWNNQNPvPdGg3byGVM63Kk2xAR1LJF0poBsTnwf hz9RlOVbjwohUlxWEqZ2d1xrn/qmQTkcNnD5W59+7VNos3blhmsfp9mKcn1HmnT0BKPJyvIxqSQE 0WcW+HebBHwnFetxarPicGs/8g7DRL8ajrL1M+loo0Xb+A2Hv/cz6y76DF9YVBd9xhuOmOoL+nJh MJUij7PmGi02DHHpZVZc/Fm/HJ4GDr/24q0Xo4NbpB1DuvXyo5g9BHZE3MsCQhgrUB6WzyQ6qjeO Shw/iiHE95JKi7BjCEsv9MoESpRlNhxu7cVNvQgd2uKGYe9FP5ls3/0q+m3oCUazAAhd1UNZmUDP TlsINlypS06Vtck3LHnpS9+SmNXFczHw4JLfuS9+/iYUMj2jzY6l3PrSj52zK+tn/TSgqlOuSwIc XvXOJRu/QVhV6r4wt7vjWvvUNw3KOmXg8rc+/dqn0Gbt3A3XPs7BAdWLU0htAVJwgU5p8he/OGAG AOvKKarGZwhB8tTqjmjpT98zIIUYJkx57y8v/QlV2irfEOV7f/xVHNnq6LLTqZ7YgExvDBqbqdxF 1K+tC4AIibo1Tq3uiJb+9D0DMr0DU9v7a0t/S8RoIVwQxXt/vMaDCAVlBIt9AN6ATC/uwCIVgm0C Xeh1FQrgpSelDHOrHZFf+9P3DMj0Dkx+789P/RlV2ircEIV7f3Rhl9ziMo97hhG1dRt19aIop0HX bcx2RZch8WtP8pLBiM66jXf0NIZbt9HO5DKScO+JpTvxLdFVrhJ42YBUt+j42k3Kc6ERldNTAwF8 kzVB2nVutaGJa2f6mgKpHGLgiXtvce5NSLJGaUeT7p1JtIq9jTaijxOMrv7CWRHxWGhTqc28GosK 1maej7ZZcEzPYXpHYXQdn+FoWz9t9GO0CGyilXDs47Gp1SO3Pk2OxARkBwBVg+C2V0VKHwPkFsO0 R3mchD6lVdnxlLU3fY2BWRwAw5P33vLcm9I0tdrw1HtvfOmkxO7KFFuegRQYxvUHHBmTyDHdHEEt pvCyU1dxbnXDs/SmrylQCr4UT9p7S2tvTJO2mqiWrPp1740XsR6uvq5pi5qAQq2wtTWlQ5jf2kyH TNFoVW6IytqfvmdA2VmKmnaXbD5V7b+RRTCq5lY7onrvT33lPA/gZQPKjQ7Rxs3fBb+ijXtM2xVs 3NIq7HjC2pu+NrjDf4Qx7EDGRhzDHqZMHMPWVjuieO+PveVLvchhfc8wtpuvpv4oW9ZXU691WN+X RUOszR3L3Je+xTCzmw2PWNbW12R9Gz3Sxig2LNu4bENWo3T6QvEEyrhHtl6KvOLrAVUtYH4k3atm srW4YZh7kVcE1Pg83MDR1l7a1IvQwS3cjsHdeiG32Ct4yhUNoASSk1PkkglKTgmY0kXJKZGj1Q3P 2pu8ZkAOyxmesvdWlt6EJm3ldzz72Kb8GOO7JBHzsgG9ZMj4G8KXpGOyhLkNIPmuYpEpSZJteMLW m7xmwCp5smIBu7W3NPVmNI1WG559bFMARJb5HAAxkAZAOId8OQk8OP19BEA4D31pAGTDEJde5BUB jQCI4PBrL3MAROjQFhuGdOuF8ipVYj9TBHOCkb2A26IpfiSRSV8kxjSFLykuHdPcZsVR1n7kHYZJ yNFwhK2fKXBptGibuuGo935IfqW6CrnWSy42mmB0KCXLUWic4UGbzF/MtOdv/A59Qsfa1A1HXfuh dwaMPnpmOOLWT1z6YVpGmx3HrR/J17PHwRKj+XqDZfgydHd34e/XYz/zGhyT52/8knxrR9rEHUlc e6KXDEYCGp4GlrT1lOaehBprc0Ny64n3VinTr1MSaQaytYtqV/JRTEc6Xj11yiNRjTCZ9W7sjhue a+1NX2Og5IEGHr/3Ngf7jaap1YbH3XujxJmuYzfsxxlGzmowZcChhJBGME85GEylSJu4I4lrT/KS wcjeMyzuWntyw2w0akabDUm696TX0lMJOd2FH/WblwOKSsXGf/B9bNjhYuJPVTdtQ5Bv4lwUXJK4 tNtxXVuf+qZBk/dPEyp/69LPXRpp1s7tqPZRDgFv/DE1ZGaj2swTkM7HO71tE0dE+KixnD9TAIuc XEo3WtUdT11709cUyHXIhifuvcW5N6VparXhaffefpQePVdHuzm/ZNBLc0KFTicCYCmcok2mVE/h A4tLuzuqtUt906CWEhJc7tanW/tk0qxZvaHaR2kaXINKvk4lVxOQ7tj0XvMd6qU7zYmUqRrKad5k tNrwuK03ec2AdMHywFP33qYoy6BJW/kdzz42HXSR4j2U8+iUK6xqqU1jNUKBmN4GF4fL78b5Ulkd WZu64ahrP/KOwrjURnC0a+2nTVKltExtVhzt3g+7/5LuTpMTPGDsu0a+kyFK6MBprnsOXMD0dXG0 CRuOsPYj7zAsayGk4MhbP3kOkAgto82KI977EXeBz1O66QzVgFFoAqYNxCXKjpklJabPavND8KY2 K46w9iPvKIxLiRSH2/pxUz9Ki7aJG45474fkNt8DlBOMaCx5DVCWdA9Q4lPdc4CypA1HugcOJxjR aDja1s8UkjBatE3ecORXApQU3/F0OmGqdBhAqVC4xKyxNDziI74ZgIKkUperMMRsZizTc5neYZik rA1H2Tua8t6DnKnVguY2LJNf8TXzfAZwwFT2yLGkOD7L1SW3wg+5EjfE2vgNh1/7kXcUpoe8GEfY +gnLOmFaRpsVR7j3I9Xaiyn8MsOQvY50IJE+LFrloyoqK/pMqp/yUWlus+O4mdwTjGgzHG7rxy39 MC0Cm+jnkq3r3o+sU88fbKGbqXSdGoyyDyXzl2norsuLFl3RBniWRcf3no02G5K09iQvGYwOyg8s buvJjZ6MGmmTdyT53pOUvnK0MiGt7qPWvgqQcu9UZeQTH0zLaIRTP9qAAESDfH1kbrWicVtf8pYB Y6zlaaApe2dl6sxI0lZ+x7OP7JZKoE+H7akEKPcllaCrxIL781KyFMDc6oZn6W1JJWjl9cCzJy7y lrhgmrTVRPWaSph746RRHjV5NugJyMQGUflJO8CV01IOONkGsnnMrTY8ae1NX1OgnJRQPGnvbbFE lCZrlXc8+d4bD1qslBDmTNkASoZLculBM+9BjJ8wF8Hpw9zqhmfpTV9jYNQMl+KJe29x7Y1pslZx xxPvvakfzFXDdRr0BGRicQ2DGBpSbnAx7xWgnqyaGtZqw3OtvelrDNTbfQ1P23ubSzmNJmvldjzu 3tuPIlsiC3Lx+csOpcvfAGGtQNeu4XCxBSEU8k2ERITN2sUbrrj1qW8alM67T7jarc8292m0Te12 XPs4LZeiP/g6ihsmGNclaHCFXDw6K8p0yDMlOjRIo23ijiSuPclLBuO6BMNSt55G0cygxtpsSNK9 J5ptidu22edXmLrpEvtVp8tJfHh2zJzEkKc2K46y9iPvKIx9c8Xhtn5mF19p0TZ1w1Hv/dCcyrVD MOK0HtxgXs7OyBevsnzfCZdcyu9Wp13lVv2pzY5j6UfeURifv1EcYesnLP0wLdqmbjjqvR9KnUjR X5mCGBOMthSqc+WvbtFiSuJUlimCQTtEFzprkzYcae1H3lEY/Ws46tbP5IAZLaPNiiPf+6FxWhFe sRTRBOIEj+YZPR0zTFbxZwcRrfTcWtwwzL3IKwKqkuAxHHXtpU69CB3cwu0Y3K0XDPFvv/zVl//p N/9r+G9/9dM//5d//MMf/uX3P/HzX/zLv/72J4H8x6c/+5t/+cNvv/3b7/7t6b//8elff//bf/3d b//xV1+O0O530YVQ8k/hGzvpn+R6j3/8gqPTTg5P//3/oMf/rf/5f3fgvz/Fp//89H/8n9fTPxP8 7/+GXL0Z4cuACNKnrzAwl35mkDT+esMEyE/Uzf/+hY4088FlnG3GV2Xnk83TWfcO6YuGzjnTLbl0 zvl6+htCURPuF8aPdNMZ5oTuG7bh/oaa5ad/H9TQhWxXngdG1wA5HoWTk/ozzGe+EiM4ju7OMPq3 D4NgnVwX3ALbegXon77Qbe50VwB1F7J+foiTq8YuegsXRA0Q4Q70ediGW50WmNBErzq6/XcG7X0u tPiFMQKamYBTSPLReoMluYZ9ZozCZiYgGN8WyNankkIyFFa23OUKF6eXsrDFep3YslAiPIBOj3UB 7X0qLYKdOkv5tYWg8jLDFDt1tsGIqLzKywzbet3lBbOAMr9XJkkF5ia9UHyev6+zwKaeRWJm0N7r JjEzawQ0s0ElZobpnMysUdjcM0vMjRZ/Y4zO3swYkZiZCSoyJ+mdGXOiRWRmBu29KjUqfjrbL6+s ztMqVkl6U4EqJPGn378e+lRapkUnlJwWxGnh6MRN/d51k0ImStYelY5NE32PJdTcvy7OJ9V0VyYH 9fdP9+X/PabMtJwk6CBoApppOeicWVZUrmbGLFrisH5Pu9RpMxMQpLSt0jL3MKRlpuW4LA9L5rQx vD5JMy33RT7Jy89lC3E3r/KyaKGDYrqrkoPym+Tl57JlpkXl5edZTTMtB30DWvCd2wI3n+4U508E eL4JCBZTUEMp63cFCu4N8nKn1msm0El7HJTMdWowC7lcUxMD4qwo3Q642RJmG/4Smy7jcuthrXk/ PvxwMELu6uSgc16zc/yBuk/wb1vWcjYi53Q3JVbGvWZwHLiHLpVt0/cyjG0g7sr9f4pcf7Qphpfv GACzNnvVzN0UzY+HRf/ynf107uctq3HvB1/QhFNArGfrnwVkXH/0nGHxR5quiIucUEqCl1aOqFDP HDnY0Ndr++5pe2YKPfwL8jgwM97hxjl8ll4Ei7wYke7+Ii7A54tRt112ZuHBir1e24ZPuzUTFvUj Ih4LLjy52bEywc9CG0Q92CdXbnbuaZM47CXX9yzXBymFmbRXDcOZsNdMWX+g7uOM21T3pBNupuLK t9cMyhPzHrUkqnxcYV4SN59l205f9W0mfA9bGjOBp73ztMe+5WHsBP7c0Mvf/vTTP778yz8/CeTJ /erLAfZUn3Ccv//fl4/EWPA2yQtw0Pz76a9Kf1T5FzGTP/8j7eF/+WWET6rOf9AV5O2DQuBumhdc wm2Cfr+tHHloFgjkzHjK8/RXZT3E7cY2BSpwrwc+bq2XnOsj6k9RZlr6vy4gxEcp6w== qH99Y+1CN7oJCIVgXUL0VX30Gk/GEy70xSv6Kr5sgArlqH9JDTR1KiClSd+dSNZw3J//LV4z4l5+ McS9i59nAYEeIG21WROqJHKij6RBpdFVk3KBoIoErt5nQcBnBewvEQRut4oEwueTSNijDAEHb6ch dCU3DSH5hevymV59VR+ZN/KknNNXhbEpz1zXTgWkNOm7E8mLSAziXn4xxL2Ln6/pDN3rxnfZ7Bts 9hN/bAwfoicljbAsqRM2Fkg/vPBfsYoZYH/ctMgQD5S3gX4Npeljk5XlhBmeBlH1D2LqYAiWJLNS 31PG0oLkB2G6vCZTUvUPrirl3vR70EqM17smjdZFLoyql18AVe/h4CvycKkxYVrBJOSC2QH1UNXe kMtpu+yQRcIGWlVx6H+JFMAWs79uOmQIRMyLQNijDAc37k/Didc8HpQ0TMynGoPBfX1kPumTcFFf FSZ3vNMMaKf6Y15nYCJ5kYtB3Msvhrh38fNPpi/qpQJSTU10wPhLxKJedwGBPpsExB5lQKQIx4CK nwc0K9EOUv0rrw51TG3TMgf66lDs0xxop/pjXedgInkRkEHcyy+GuHfx84E2BusHMTuD1w1j/HXT I3ezM16L2UmyPZlJkH02k+Sv2ewUkBhv+qo+XrNlp8tRX5XV2vHKX7NlJyClSd+dSN7NTqHk5RdD 3Lv4+SfTGawfxAgVsYh1+uumR+5GqAiIPYbVaJJh9JUwDWhWpMPO01eHSp7sPOWj6W9T7tMcaKcC UprmbeIkIIO4l18Mce/i55/K6GBlITao01CU/XFTKXcbVAp57bGsFlS4xIKSPyYbVCBs0tl7uvCG tWfrWUy3Itae/DFbewIyYq7V2ptKc8UGFRpefgFUvYeDf0IbVMSBvg+oe8f466ZC7jaoCIQ9ltVm klH0RTCNZ9ahw8zTV4c2nsw8U9V5mYCOd5oB7VR/zOsMTCTvNugkGL8M4t7Fzz+VfNRL5aOalsCX bOwvkYp63eVDbSSt/K/reNRkklF0k2kazxzaGVaevjqCRJOVZxGkukwBzgGOKdBO9ce6TsFE8m6C TvLxyyDuXfz8U8ZBXVaD9NLNw/64qZS7OVoXa5SU4GQ9uajWk/w1W6MCUnXrFoOvzvZe5E+k2Yt8 7AVY+a/Z3BOQ2XPydTUjd7dEhYqXXwRh7+LjY4OfIgf9r0v3DPvjpjruVmddjE6lX40koRrHcgb9 c3Bn2HX6qkWJJrNOeGYvMkeBdbDbumSQmW386iB3NzgnOfj/n7B38XGpLP30lqEa8GWyiASkJo+p wbiEae1RMwZuCdPWOUob11TDmmlYEg1LUFkDj0mmYAopcybu8y4YokODAxY6Ssumb/TkhQP2mNZN X8Pn18wCNTYEJKaIvqqPfrZTbOvKCx8GyYMRnxaE4mc+WIQkLZubEqTPQq49pnVzk6EWP/NhxjH2 Y31VH/28H1sUqS58GCQbHz6kDeHsNxu6RQLaEkcw11Kf86LBNbRkyS+vGnwKLZld4ecNx6LaZQml lyUaZmZnU3tliob9+CDzAE7tYIR5vG3xly0+5xdG2GNbVZiMNeWZETOOoXEtfttmRuiTX1380Whj RNW1NGs0AanKMsM/Lj6/PYZVo4mnX2eXPw6NYBrN3ltiWEuEQt3YIBptik88aCHD1RgMMD8kLArN yMkLA+wxrApNQzHXzIEZx1Bo+qo+XrNCM18tL2wYJD9SmoufGWEGd1g02qyVJ0bYY1g1moy1+JkR 8+4wNJq+OpT2pNFMo9eFEYPkT2s00R+zRtNo6rV6KvYcF42mnorFVS/VaJOnMuMYGs1iJGUJzJTF uTIj2hpNztUDNdrECDOryqLRZrU8McIey6rRZKwpz4yYt4eh0Swa0GZG6NO1arSh/2+MeICZJ2bo rBSdXiewWKb6WBeVaF6RvhtFJU6GaRxK1VSivTc7U7MNrS8xLXW2oB9o4k2jt7gOg0zlCTl5Hr0+ mS8QltEDcbzpQwHpluMWfVhndag+YV54MMh9rHk38cBiFwwybcf06GNdVKEOxN6NqgonHsyuwlCF +qrZ8ZMmVH+oLjwY5CoPPlrUFg5FbeFXT+nZx0b/n27PKzln/rfkLx8pc5vxvdizYOSg29rLAuP3 vm54tCTOPP3b56PrswPP8A93+5++8HdF6EDmCsbdj7HcWgsO/UbAjmSHK5YdLmj05x3NDtfnHd5V on4DOFrVp25/lxVYav1lsjpQXgQs6s85ty5C/I8eZoN+kKEPPt8Ag/EyoBtAcX299aSBkuXNlwGQ 8IpwZH16o9/F3dftL0iJbJksAvnzuVytXlQlyxDWgXbJLZP/wlooORzSGPTTBRp5YYyXqzhmUH2G 1E7vHZhzG8h9rDtRysG15cuNayo169NbPc1MNBvCzkYksSHAPJTzAla0CjmxQLI5gdv9W55lC196 KHlhT8LFNbUsINx4lhZROQ3+Tvh9cLaOp/c2upSPq3p5eRMd8xIH813K29M0EEV5AL0msnSMYzB5 KYlXm80W8lwTX/Hdg1gWbh8Gfx/TnaID2UWqp+eRrB2OyOes7a6foUa0/dfl7Z01wcGsJUHUAzly fgDyJ2a9/hv5p1nDyTKcVIyu1Wn90YpObdZXdM+MthJGzjTex3Ab5kGjrkRNxfJ82KDPsRrxdvTn 0rPsOIOAJlFMmMD23KK5dGyzOpgHp9psHp2qs3ksimeBMdELY+7sOzBZXpwGfVCXB6WqxE4v7uMc HMRX0x3EA/8VfbiEV3ZwQx1BOZ3AgX7RTrMAq3paJlj008yBE5NPROq701gOGvCkJ0VrTS/qWp7x K2ymQ1+d6d3HumvByfA5KTYBzW/rmyfY9OpD1rTqHh3RyysjP3FI350YedJur6vueYD65jLojThl LeuF2Yi77Omu+17TK/MbCy/VqwvQF3xOkfdkO7WknMx6w0aIROBsHpMw6jdTxEyFqKRFb6lEzdpt JuxO6n04J2Wq6GWRfL3T9ZCFbpbDNFgzvqfRquKZh6v6aR6citcCY/FaOHXn52F0+uLEg5MWPmlr o3d6dx/rYKCdcDPnYUQP+Ihr554eM0sqXn66b2Xn2csr/Sk9M10nxXpSSsrA+V0zYqY+zEmauGvv TpOgfSzCKbQsMKV5evckI7PSnDeOo4oU2NyPvnuCvWoLfXKtq4bSsb28wr8Tn+3daT6OWvCN7WAe q767jH+jb9WgGhOYVNQcJlAQeC0ghIRCXEE/S1/NeB9kp4uKoyGmRc8qJ76ex3Wn6E71SRdvHSov VZZnbhpsYtSBnQfidmx3hn3UFxd1OPPrpG5PalnV4Tx0JXRm9on41wVrfnMjTnmrRMy8NdjEyBO/ T8Ts+HbufsJJ3/nxMqm+eVgnFXlUpbJk53f195lzpyGdhn6arx8P7Hx5BedbgcRF5ZxUs8Dm6TlN 46KaPx2RU+U3S/xRSb6xcXxPeE4zsvdrhgI5oWKoN0kZ4E/1QwPdxYYBTiaWXsWmXqtXjdlYCAmB sKrE7RQ9X8+W+G6S1Y98+XJynl/3sN8Ou91jc68H8Obu7r4t38RifoxdU6eGlGVfinLLjuU72qqZ a8/BNhSWFhIllaA4khVq7opT9JsvNz9yXsnf8ZwPDvYbbvh3wnKH6N3Bw/0nkSyz09vQWE09PlNr xE3hkDOxYSa7wYaZu3rRAAsgMWjzql8mdTURe4qaHWJdb0TEvuOinzz5u7//T1+WVFYyS2/aOE2f 60qcIkHvX7a/+XL3NF6+HB2Sg9tyct1e9/C+Ezw6hJhOPpAsOl0yttPZ5SHX8Gwkrkbri1Ydv6VC ZQEIVkFuXrJVnMyLfcllsS2xooObc3KHTm7aW+7c9+JMp3jUyb3SNZfU4GoiVE/TfZpJ/1i0+Sgh sA1OhetpyrMWc0zkJo952S2sOoWkDgGcUyzlrZjL97zEozd58Dp19fE1UF08ZIBq2+NP1cFWeDFf AgNpkftXsrJuWoVVNXlUW8CxwlpW4RwrOpiaB4P0YOy/4RN8JzhxCGGcTG/hlWbWow130ui2vPSm l2X1mXB5YjF7AcRiKWLYjYPd2p8TdN9z2E+O/VsBgO95Dycv4+SN6Or7gC31fvW0e/MvX85e9Vve 9/dM+KOp/4ZLsERhDtEGMOijhQv5ULiQf/Xk8HH43iX+xfc78KlOBvAfH7wJecP6MsMEsSy9t6Hy /tcDzt2viBrHDMPoUZM6k9rWMp8GHawnIp9Ta/QdSXcpoQILDtfMcUetv3UG6ZtfD9jMQXjf+qWj Ne5OmMJmKvrvN8oUNpOx4xukfYhviq7dqXP5TskJ1u7EtZW2eJiceJiccJidcJieHd8npicfpicf picdpicdpmfH98npyffpyYfpSYfpSffpyefpKYfpKYfpyYfpyYfp2fF9YnraYXraYXrqYXrqYXp2 fJ+cnnafnnaYnnqYnnqfnnaeHneddNt1Um4n7XZSbztG60rg6aBF811lHkDpoEXT47RoOmjRfNCY J1g6aNE7aZ/SouGgRuNBZZ5g4aBHwyuKNB0UaT4ozRMsHRTpA2YoH2YoH2YoHWYoHWZox/cgRRoO mjQetOYJFg6qdJ+hcpihcpihfJihfJihHd8DdGk66NJ80JsnWDro0gfNUDvMUDvMUD3MUD3M0I7v pk7TSZ3mg+o8wdJJne6cUAVYD+qUyVt05wFUD+q0Pk6d1oM6nakwE+8Aqwd1eiftU+o0H9RpOajO Eywf1Gl+RZ3WgzqdhxwOExQOM7Tje4A6rQd1OpORDjOUDjO043uQOs0HdVoOqvMEywd1us9QOcxQ OcxQPsxQPszQju8B6rQe1OlMRj3MUD3M0I7vQeo0H9RpOajOEywf1Ok+Q6b86kmdLirtpOZOem7H qF2ZhqKXNmeVX9q81RNQ3/56wKg95UNP+dRTOvWUDj3tGLWnduipnXqqp57qoacd45Ajz9I7Sc90 cLDKf47Dvh/5yFSgLKYxn+Xp5cs5jiE/H0AH030C0XeJDlGp//plKhJ470DTneaTc3+KvZgAHrzx ler4aKrrneqTz3sKSeQ71fVMdXk01c7dyTbY93z1dqd7x2dCssceP035HqKbRTvd5fgA+l7Abxbu +GjhDgfp/p5PfIpUnkJhs3w/jPA9qDML+PdcxVMM7xQkmkX8YYSbSIaTjH/PhzrFt24Yb1L+MOL3 EMos5fUu0gfQ9wIys5SXR0t5Pkj591yVUyTpFKeYpfxhhO/u9izl37PgTwGWk/s+S/nDCDeZzCcp /55pe4o83DDepPxhxO+e7SzlQsZqlBxg3/OUF1NF02IPE/SZ8nSi3CyTE/B7PuRisDyM9t0XmmV9 ITOfaD/5vyfvajFbHka7CedM/DA+ZkLbifqTb3jDeTdeXqP/Y7Vh04fQ1EO7h6bmNEW7Zy7UjbtH pl4Jr0xdxEMX4dBHuHcSz52Ueyfl0Ek+dJLvnZRzJ8OfPfi4C29O/Dow7HqlH03qHA== ZiXep+AACodpeS2LEA4TEw+TcIKFw8y8FgsPh7mJh3k4wcJhcl6N6IbT9MTDVJxg4TQ/t640THyY oHKfjQMoHybotbhkPkxQOUzGCZYPE/RadC0fJqgcJuMEy4cJejVGlE8TVA6TcYLl0wTdutKFNcVT TK/NoRNdqAfYHDnZ8d1029RPPPUTTh2FQ087xpuCm3oqp57yqad86GnHeNdyM/OuI/eO7Dvxb8ep nX20/Kkcyp/Kr55c6LsfitkDtrqKDTXEmvnf9rG7W3acLxNM8OrOPve1wPTdrwd8gC0nh6yu0L4j xwHduVKcCnq5Rs6+bodvaJb67FsdF6/0Vloj7K08E3FiDmtXLUbX8v3ArRecOfV32TTWXvwzffbU dXr4E1zUKdRkbOP5hy9kaS5tFAWcgHhle1au/TB1Y21APN/KRjiUg3M/e5uN1HUsP6iob9NoXHua TrHMFbB21oU/LLgU6u9UzXJSE5dWuton04/Rnka/tzEiS59LF4eMX/E5Xlfkl7ZG5dlfY1zX0sH6 243EA3N//LhgJt8Jqv4gmB8/Iac4h2BaLzzbqfYxWJeZjw3OA1ob6Nsqb/o8M21v0/V0SPlt2d/b 7FQuw/gkn7X/myhTibccpmEsz1WSXIROYvlJfQXP52cXpPPkKUzlJcbnrtAHs07M29sYsSKt+ryI 9K1ReA7dS3tz7extdmJPs/QJpiuau3B7Y7pKuemOcURD29ipOMeV0gvuIeTWG4uPSqKCda+Zx7a3 0X+P76p62Nugu+zeWk57k43SdSif5Ll0/1A534b0MkAqOMU9X3XaKY6M29oopSK/8rjI+NYktf5T Dm+upb3NRuhhdj7B7N2m+dQGuQvoywRT8okT11Bj4FZoNS4s2BsZlcJGs7pmVu+NrMc3ZnRvc6P2 sOQ+wW3VaDTtzRu3FQ7tla64mGK0x3RrTu0sfVc1nT7PtpjCrD/shu5gI+0NxMbS99VUmPvY2+x0 7mPZTbGh7j69qnfyZoNMV5EaW9ztnQPr72Yb9ZXe3NkQ3duwtcXvXxPmGX6j6sDYB9hgu1zR7cF6 3rLMh5fs9mBmb+BDvQuyWRgVppPM5pV2JyppHszawOhjMbvbRVsDtavekvW9zY3EbRgPMr9u4mt3 FKuo6gHpp/mQmGpLsYkXlPOsGUwERQ0r7vbOuPV3s35ENI/+2t5GLKrXFsj6+07faWYeYG/dBFkv s7Vdic+LyU0wFge3Y/fsCi84Z3lWmArL4hg0b3p/Htbexmhlmb3bQHsDsaHeWDV7k53MfSiPsbRu Im0nOe3W4Ul16HnYbCdJp2t4tjFNdpYKjNpQ3OmBacvvauyIrB5sn62FdvPaell/32g7zMgDTKsH bni7WM4GlpmNYjvJxqPm1WDB2sAsHGHgyeLZ28ym6GkO199vBB7W1gNsqv4vRSUfIseKdA4JWkdi AKmxpR2rKtTn2SBTmBlHgIezsXRrI/0pDrUd5n72Njut+3g+yXMlYVapD7Pm5om0jmQTUmtNOz7x b2+jOGir9Gejdm/DtptiuBb86283Cg+z8wDL7g3p9sJUseXIApFscFH7I87fRBCUs2xbN2rck/mm nYpenIe0NjBbS0T2ZHvtbdR+e2v57G1uZG5DeZCNdxfrz0d79uHNxp7Kjhpz2v+JjXsbxaGSe3QL 9zbS31uraG+z03qargcYfm9pcb3wRG+nIMxiV5sW95zwWJDOkm4diQhNaQqt0KDdaR7X3sbMMBHl k1l2ayOm3Rtram+yk7oP5zHW30GHKxKL8aiwzxxPdkEjQ2ac8yxqNyI3at9pt0febW2yXbVK4nsw 07YWs3fy2kLa22x0HubnAbbgQzfMXVRna9Di5GLs2Xal9uDMir2RIlF2niy2vc0cgH9tXvc2N2IP a28OHc3r+K+/WEL16RO5vGsxM7C1jxyedncynvY2RuIE382AvQ0bEorhWvCvv230Ge0P2u9mvj4s pXQtWxxTrpuXdnjav/c2RuRk1t3M7L3NZIy9NoN7m5XSMYrHaNmHslhwXrN+ZbJVc2p3py1jb6MU ToHQTfFtLeYg5muzuLdZqDT6H6RVb8z9iEZQZNeiR5lgVZC2HlWLzkPeGxl1c7p/0257mzlH/9r8 7W02Um0YE3Ptq2niB0ephX2aQpTDlGLz6oEVIu+MOM4qf04lvbsC5P2x/R+/vJIT/0CRyydS1Vqq bJ88mz4iYKrB/I043V/+Hr69RfxrNSo/o4jkw8L2+aqPdwYDN4Kdus3qTDxN15hVPZwrw3m1fOLd NSHvD+H/+OWY0f5AzctHU80fnuP3cOwtyl8rOPne4npI0cV746GfXtWHyX53RcZ7A+s/fjkn9D9S cfKJNPuHJe0dPHuzWOZc8/GdJfKwhP4HIjef1mqntPpHsv4fCcTOG/CSF31vZcOH05YfFrj3sO1V ss8my88oG/i4cnlIvv8DAZhHbSUzvz9SFPCRiOq0A8/dv7fq4WPJyI9P9XtY9irVZ3vlT7myHpXB /0jM6tPa9CAmH0nzvz8mOm/gc+/vrmP4cDr3s3v3z+HZ69UXJ3vnO4vrYWnfD8SjHub6zeHgj+SF PxLanLftJcP1gfz3JzJPn967fw7v3qL9NZPne9nhh+RkPxCme5gHPDPuI1nbj0R9p0147v4DqemP poI+bbv8HLa9Rflrtsv31sqjMqMfiV++Mm0fyX6+P5Q9b4pz7x9J8X40nfWOwb+ZYT5bBN+R2lfO YyY8/7e//ref/svvf/vTH37707/++tcMpmOa8w9f/vr/wS+Vf/mL3//xv/9fiscObBIUxzZ/9eV6 +k3/7+///csfvyynMs9nMulE5q+r8+k5Y2OuPoVnxGl+3RdRQqwiKOzrCosOC8wReHr9FbBg+OkL UojjU3fPVcsI7JPEzS7d05/sg4SXLehOSfTPKXZDo3eZ8c3jyETT3RrJC9iV+gRg6MJWmgCvrlQZ GGOTlq4GTBmDfUvatk+ovp+lr5C6muGeWguFgcnnKO97VMfK+7mbl9I2Ny/A6F17Oo7ghy+QmP/w m9//4S9/++0Pv/23n/7x9//j6T920J8hMVVLzr96+g//9Q9dMP716c/+4i9+8+3bH1/+5t/+8I9o +qun/7k3/F/6f0RFfPYVAR8aXHBVuBPxWZUqYF+YDuRWdHTOR4FNzPGXk8FF/hAIg6HoGDjG4Uop CuwbmLK8jvdrqremoc+5AJNTpNsAHsic9Fyzykigb38wdFAcw8W0pefgmhBMGSgGXvkSLtBHOn4Q BINkn1OWtqlzR4FOsa4EPHTi+xpR8XN9qerEl0vnOOZahcclORVr14JOnKxwLKCnb190Nks04GmC /077iV6Hi/XLwNqa0BSuq77FRLS9sjI8ZCU0XoI11qKEbiP9/4KL+Coig0u01ZNVeuuQaBeFsa2r AGViMDZ0DahsjK3IeIsL7U8+tIRMOGl1ZIG9Cb/LwTHUuUvl3HkWGtnyGBjj1RgYurMk8wYdehUG 574NPzEQm4D0lRMjKPgSsAGL6s3S25KIJXxpObCOrsbINrR57eaykhWDV8XdbCJaF/ZI7E2uS2Gp jLWra8KKIUYYTwQMMcv8VKwM4UxpXojt61OoSsF7Xb4lyghCSslEN6dQmYC+BRTdZQREviTr/a7t hYPEdX7dPdNtoAx2mbtypj4an7JjoO8brXClb46GYPTvLtulrsaqpnaidN+pITGouhrHxidYa+80 qCRfPFlgak06/lWEHiedAazV5V/dpaZIN6p8FTXcXKVVgi8kxUAMK32L6CP/B2pbujuSVY/DmGNg qXlbZqGPkz+IC6w1CCM6OLqUBC8EhYHhqo6B4XJVgN0kqQyM+RIdhs4K7/YFX170SoGwF9TWoggu HW43EIoh8KLv8LEkX2S40RcB5qsvK+ZXagrsK1QpSPgqolDgI68FAINqqqaMuTH8oZPpLt41Oh98 qmZX+uKEv5ENpA6LoSisxvj24FKLCpY1Gcbu3YGJJR3Awsq1A2sdCKILCtaufDKamuFUY7cDY/X2 ui6pDg5NJ8JdQRGEkJ+ODHigHodCvAQ3KQFibld45I0wmLf0bnz76r1KA4luSqheUSHvy53H1sEh ZREcMhUZGLM33tYswJxVRmPMA4GofPRVhIDUVY8icCUw1r5juKjL9/KiRVM2a7Qv5MpLvQNzSdK2 L6ggwJaiDPWCwmIEeNDRXoVVVsIgXdPOXBZgd0yULK/iQeA0gxVYqi5fYQyAbdZA3wRBdCrMPgal gD4byZyFiSMIikktRFkpcFk1UA5BO6MtlIBFTCvwQIiqpdsW2v8VdIGUVnQArjRVH3mM6tw/xWd4 bh1bKglznwUB7coMLL7qUPM15qCJnV/Mskx1WmMhCYKug4OuMQ9aGUFv61W6XE3a2ZjwCfgKBcm4 5T3b3TSuVjY5fF0KLpPDVnW+xEya5bBMgtx3V3u/mMDgJi0e1fC0ugphYOuzpW5Du4IupIZP9M5b AwO7vaMqvO8MAiQtNLaxb4KgXU7HBSOyAzM+GpxMFbAnnHGWxck+2K0d2QczzrMoBfRNaAaSoDEQ aoeBrVOjdnF0hqCrbz/hFWBSW16FM188xGEaGwLZ9Ktsudl1S0B9llKupMCkbCFPgV/vxpNxtojb nz0iC2Ie5NQUSNaZGNxFEfjnauw2WkcwoTAqBsaiSsdloyB0v99JZzX6Km07B7Wz3gG7Th3cgtO5 lRhBjvC+VcdVXokdGEKLt866rVYvN21XjLVa2yJOKchyVahtZrdkhD4uMQxj5EgAeGAOGdwXZZcu GRLZb19ea3rE+Wr/B1qPo3qVA8rZgvuNqGnf0VpMU1MGDqsnN3ViEMIrVX3fWpXb3YZQZ6xyXOB1 Ag7TdZzYmxC8KTCbcP3Dl1cF8Siyr4h3x5uqrCU1pPoQomtqPouKISYWjRR0cnnCi+vLive0xNoO QJisWYA1sx+D62RTFWC3rvn9CkP2EqgL7Dy3vpgv1tyd857VTkPgiocV8Sldjkv0jdzcEyR6yCPv FldXzdo2sJ/d1d8zPB8AXRdZGUF3s55DZZ/JMYUIWzr+oigBkxNgnxnZkyXE+QOFOAt37h1tyAh5 erP9WQQBGxsE7Ur8aic5k8nYjTaimPsmR6KSE0eWv3NdVVeivTekkmd+/+Ltit0wIdMl2za6v8dR LOc8KrClJ/owMnOvIrhAznGSLarbsPDJCWlXlJl37lbVYu+m5HXJ+30n7WTz+8HsnJZUsNGWR0XT x9tOChw3JAGsfT0EdsQjr1IAL/X1EmK5kYSidJ/ZJcFKgUtCUC4NzAIsPnOuukl2BF4EKGd1ejsL pi0C8b1LwEmMRSzYyP6tV6nCGmrsNCjwm+wxnh1LgEPWLb2yVKEz2Xhg6UQnXZGa0T3u4uhpB0ex CTpWx64aEDinFFR2QTuwIuzwTfcNT25wBzeXdJMLwbNoZK+bpG9RQhlkfo1NukowQw== /dKMcwGkhkBrdyoE6HKRlg1RODVUoiFoEpzrg62xCAEplSxAd6nAkkSbpWSEdYFSo4rsAF4cops6 MJeg0Rz2p8Q7MMLKpT5L7bqW11EsUX2W/qjRjNB0BIiDNom8dK3PCKJGfkFVuNSTkh0OzCpFjU3b zzCwwEZJB3LNJQHF+sGayBo68kFUwQVJ5xA48MIbY6BoV+KLODLetGtjo0sR5OwEbBLXEThiLGJj 6sx5s+oqz7wiiE1ZY/z2OLCh4bdoIbUqLmJji/3bl1fbvoL1FQqO1B7HdeQBlKMXwiyA3zoCjWo1 cX77n0QhAWln/EECgOqgdFul8oZKQLbjq61PAG0IEVg1BHlJZAKhJV53oFGcqd42iCQO27rg5n3Z /hPfF8ptL1m46TL7HpqNrZIO1BRCB9ZUDIGa3NV0H1aQBfw0DEvccmbDqU2Q6E4XdRM1fdVYCfGm hpivDNY56erCElcmkkHFI5NpBDuCRiVK6Jz9O2kbLjVs1FSYYr74nnx9i98jfFYt0IbhDHYVNkPj CMlVXpaGwOy1WmRyb5GVf3hY1Aa6LhaxZkfWEootODFc/eVU20VJMBZLliGMENULn+I2RXecydlL 4JVOsSnWvgyS+stkNarDPSIssTndssiukXk3d3cbwrfHsOdvOc39Vz/985Lk/tm57yf34ex3YROk NEmH+Mq2j0G/rlCEiH0tkuUuR4i9aUnv733ti/LaofPs4phy5EzMi4ApKULgS6LzAWfH2QOIti4D diYnwBE19VjDSfFKVAvAi/O5EdGdLMAcixjVtRt+hoCsBgJrCrEDxXrpwJajAkPhrSBOIRk/Qj0d L5b4V8FLdhOBScUrsyvyrWzaN47VeCi1pqTJTj2mBXl62AfaHQVD2DwPfWdRvC3o6GhLUio6RQKW tH+HpchuU0csoQJwp11KV1EjBuDMy6obimJvAFjZP/IcXBesEsFAqYAs4AA7LSrU+EjpGR5t4nhX uFiBiiDkPN4vvMtECkIJ7NJ5oDK4o3whJo0fuvkZWXF7JNhE7vpu75vMDu0zXAfi2ahi1oAfBma7 ETIim2UHUqyLgN2HEhjFNXloTY3RDk7FRERH7NnvZwEpErD3al2h5aUFBmjrL1sRHC0IAfeJKB84 L9Zhl+PUQOQwkBFg3EkXe7SEtMnay8ErUJ26yAvuB+FXllKRLvueYxgBQflUhCodFnblrOs0a/w7 oOy0SmdquAaKj6n7K3UbkITkTRLqkITSnI4W+VUG0kpmoHhlABavwKpRN4Cbk/kiG+KrjOwKVcCW 1YKrrHPTF1PQ4cZLJjcENa8geZKi8WzgfdXuRMK6CybeFj6nI4LQXRkn6q7LYq5aZVRdNpbLugmt qXC4zCOAI9Tc00m+Ve5vbFSFq9tc1MgAL76mq0zcmtdX5LnthHUA94n8UeIjKriN9+oXAQfhQ7Ph 1WJZy2aRXQBDTZNNzX536gxomsPv/OCZALhavl+SJDUbDV0je9YsvWVNHCSqrA7Vn7+cmWkS7KtS ssFtE29SHdiXQRGzXK1XNPVRbO3sktKV2ZDk8SZOh9ZixQnVMuNomTTYR5l9xVtrywpusvNUFK4G YQPyU181KOUv8Ry7La29FVfFRaSXjtPD8+Z85MpSMWE5iQ2o82bc18Lxoji5DBRa0ZYa8+zOfZWA T9col6aQG8rlBFgNgUawdgJUoGBbB629cCrr1Yw/eOtYgsqfBMeXwPHieGqt/Cd7sJJJv+PVDhNi FrwDSl9JoxgIxBVhb5qjc5FjCAAyUg3ZqfC2kmVxk1n81cAhT2AFcohuB/oJaHidV7yeMzYk6FV0 lmqBZVAy0JZ1V08yUEC4wCkNFQYgTzcBGV9DoWCbY0g/KAJOfxOYnWcAU8k3BKNz5Tx9bdmzaUph GWY/4klk0ofGie6vAhZTITSr2+pAqXAMoiYYSOMmIMXBfhAEEsEAmPfYCvZqX8Z9K0gB0stUkuNo JRNQTSV5NTo7WESeURSaValVZiCZAQQsiN3/oAhylIJVL1VBg7BIJag6sBbZdrkmuxkDy1xlcnHN sHCxFUGgPj2AQRHEIa+OPXnmOMb49Tw/X1l5uMC1VrzXt8QTR+DoxGChON1XAzdtzTYqo3AKLORD H/D+MDq8shhtzeXv9UfJUN6rPK1UxJcljgsMsL9OaIcOGpVifbeMpoO6Fldl3JIqm84ejcyJ4XRS Nq9rc6haLzo6S4QYfcGMYxKkxuBO19iFUy6iTGm7fXlrU7HFjGA/LC3bw5rltty0gXhR6IhRPx27 UxWTOB9DS5+y8qpnZM+juJhohKTMR1yb9xoKzSeNQIfasukZKsXnCLSssQ6UVBjifaUc1IyQdFWJ U4tpD23G/ifVnUTNCogrhQho1XpiUMRVKB1cKi+uhhprYhXCrelSFScloAi2mr2OO2DKJekKiiUK Al6yyApIyq9JTS5zr2mpA/BKYsFbVRUpZNW8loLqfPYcfg9c1qMUpJCkbZP8JBImTRMmWmrVgTTx AMq7jV0ERikFlq3pQkjBHIAOpJlhnmjQpjXerSnYkJBLkm58lKSK1ky2alRyWILf79ASFSpx6wYr jWP/KEMtSnuWXNMcVGhYM5x/ES/qq4CzSF80wwFtfZFxaUFDk/wxj0tTCq1Mk63LvpmBC6DsRgDK UC8rwcfrbJfh879wwL8KONQqoZno2DlFDuuKTeWKzUjMf9bRjj0OYOOMV1ktskziEPasuwOSCOhS XxffVNMIDLxkPw9W2YjVwpBk9bEdRjsV9yQnLADV+tTwTMfFfi3ZtiLsKyoBwZIkos8ZbW8RqXQD Q3XskDQEV5LMiiQRCcgbLLCaCAXWJMw/x75IQ2SkCVLnOHPRgT43IYBOETACr05dkkjArykHLL6T ZSYB03URuaJH1f4rtmuR3q6+mDmt1YG1XFLlXIbt2jiUAaAVr9S+Nq+9Irpa/Q2ANet+RLmosZso Aqp8IrBmHioqfjUFZoZDQ/5JUk2jjLQiUKT1yLQXMzDmJruUCfFlIbQ21dI3SSgyBWJqN8/VZ5xa lGgKpICtQmjBNk1u38A0k+pEtjS9Cyc+F5HXrjy0HZ9kkU3IedlDikgRFE0RmCYGKbtfdQfCHsfv 4yiCZjYlk9BxdltadhxTLYnNU9nYlIH3DfOr7KR+qnanyqYXBTdN46nn1zzn6ViQGgcBASxa2J6L VmADnHxT+eLcBYCOZozkS2EbAbrHR84f8vCylsy2aBuFsyIYAhZtKyWna0vIh7LS56xgEUaw/SpO EXAh6+tzMbVNSYXBi+BK2cJxCMPwSzx1VGnfW6vhp9G1aiEk2HhSzF/tNACswarJLRfDMPxCsIRR k5VaORpU50QYuspOskC+XMkQaES28vIRoAR/4fEaWdsQxtg0MN14EDo2yvyyakCEQJXTMGs15FVH skXizq8YpQIuWiUiJdTUVFOlpP+PdInRf13mXJfhHgKs0cfKUfev2pp3FApdQFAIFrxmFWnnO2BV uS4aGSJ7dLJd6eQcg4eL21KWxTHZf2q+4SOLedpT7cwG1Qjqtih+f7rGtpi4zFi2hKBrQI70pIut HVM9VXeKKmHFBg9LixraJO6nBRdsu5aKbAZKfIvKKnRb9c5OnVhhStcQbQxMzkE1nNywjUIS1K/r IqnhnYI3Dc67E8HTGmJgbRrRuTQdD6gFf65YVW+lbHuaugqeI+UMtDJ5GAFsWZHoFt1oJIQ1RY9g mnD2E0DoXWNh1TCnVssSu9TLM48hsEpiJ88iOh3cqlGrZkzi8m1eEVKFjF2l6cxSbNU2kKq63xRk N85CsyFk3ZZyUivkCi6YeJKaoQnXtCxsXgvKGmOKlUJdMxNhympxjVlHyAF76YzCg7rCRsmPVkjd F57sgTBPbPnS0ntRcPYSraW1KUbHZcDAwwDQq05Iww1vk+KdEGgUZkGwUQBl8ed/JCxiTLJBEjUb 1cGpXFKZpWd7AHRVPDstVqqwUVPbTZIaNZ4Et1aWVQdmThfA3auXRh+l3J5MomsgaFEdTjqap9HH wAuLTI0qGCABAsNG+GuKA6gS8lNyFZFvrkynsjvhGmxfrySIe4hD8Bw/Q7lX1XMXHexKDDreGmRg qagSylIw34E+6k5O8XgdmKSNoMe6YSidebNMS4hKgcYW+gJQWxF5gqJrRQuz6xyGIKEXFogv6aca KERIgjL8GoGTovW/8K+97EgUJRG/DcGnoLmKyiY3ME85kKysDVdUv6Fook5NXt4uL469oO2wBChc RsDUSpn24KrW5ZXVQFD73vNbYjVcal0709BkduiA9agMTBQupZ/iEXBm5BTjRoEoEtjX+VIzQIp9 QFYwoHppfc4R+tS1KtYFiYJTy2nMg8YfesvL2E0bh1EgdYJ+RkB30HDb4WVJDgfAMekAV3EfpbyL fKQiIzBJanzAhhs2TfITXRoXkbPr5OU18bOvYV2pP4idNY05kJMLCFYFN2zHKk61RtSGyQWgxRog RhITCKbhkd2qXlx4PfAMdWCOrsRfGSyBb6IgaR7r4mOfQCBnbUbiA75+0I0aGkkYaGYqTuQzqNtM QfRhKBp9oa3sB1GoTioqsd9nCSsQWLUJXcMoKKoCk4sK3BQ1lLh7+kshTYLT+BFrXrW4Bk1EQLTT 5nWZaPk/Csez24Xhhpd2jr/9cnG/AfG7KhkeEjY9Rarl5t7K1UPmI20MFOUPoJwMRVpBdQbA4hMM CgFsXvLK4t/dCRA7ODc70jjHcDs4VCeIo8WSc+N9Y7QWFHK6a+idO17tMKrchzadZEeVP1tMQcII XwWcOHADsJfTPVFLS0JjpXvEq+n0ZjFtz7bYi4LFu/EcH/6qYHYWAZYdKjQrz0QJLG/oAOagLHWq RO/diX2DwJGUVzjYt3o+MnFMncASsU4Rp9Uiw4ooAQAlHehYLrRWuEmBibM0BSHIeiuKFE3eCRhT IrUYQSqtdEpk8wJYli0BNf9lp5WiplCDVLf+oFPNJg/h5bEByD4zgFI5cpq8I2HCS5zz8EF+oFTH i4INTRMDpwNxCuFpydgBmDU5N4oOgUDuWrk0+U3ApMNohRfZnYIfjLTomsgVVTgoaRom85wMYKDW DXveDwWYbDl5las7XuVF311SkSxf1vTcVVA/xrUA8IGTePrF9s142Rm2jqIJ7ovHesSrI/QaYydB zKIycCKC45O4OADTJkCONQEoBYFFDGDJo3uZbeBtCq4ciANMagcXpBsButSjZUET323yImBN5ie7 8gRAFgsCiuqMzKoB/EEReNaoif2Gr+fuvhodWkMhOUmlQwuUo9oWIbANyUlJyRcFpFT4uo0wilHQ NARNamotGzpIcXv/1r8wCD5bvUSIgPhFocKfYIfE0qj/C6Nw+1LvD4VUearRTllPPWnAC0CrmCrC 9RsBOnNZT38TrjI2yBGWtPI9eCxJ2lqRaTdQ+OwZHW6wKsbMNclL0CFkPXWRLts/7g== FAzSNsx6aYAaapdltQAMdnZFSotwowGXryUpj/1BEUSNh1DwULEqFRKQOQ2NZ9PrkRQ6dhDEYwY4 XXoaQev7vR2TxZES2RG8rfsOLG6c3WiXxTlEYxKCrEluuTnkToEyLVg5ZWTr+EXASeqDR8bpXKMZ 2ApgSYuaGsbdZkwFbbpWDqmrNozKOG9Zaz+dYg7e6t28qToqHi2CNTaFUQiAYN7OIKNOlAUKajjZ COqlbTWaEEa4yXOuVEeg9Qpy96hQJS1VL+AuriqWlrMdET1JtT2SJeyihVlJZjH5gUCsQMdXhGn3 FH5kI6BeqkT0qIzjEIFot5TVtvR56ELP+TmMVQs3g6bYaSOTu0QCkg8yAzm6MYUaXg98aP6rajdO vJKNpTratSzVt5ekkwOCI0Ekg8qYFG2W8tfAZTyK1vkgqsnmO1geKsAO0ALcs9ItYvqNenL0lbTI tLWiEruJ/NiVqOaUwkoUtdbdIHiNYVHpuG4qkteg1qKxIp/+ZaBKXbTDwZUrAX44dzcZCpcmpeg+ ohcFN41A0br/qmAJXTheXgzUIJazcO0d7xh4y3q52jhbQuA4g3Xg43C+BowIGPIduOJVyyRz0QFT Em2EmTMVQrWcCs4aOZ7SjgAWjWVZSpmalnhvOoAz0oUApQwXjgQ1LOGqvhi4iondJC1AwFY2Kxa+ tpm2iGYoabS/i23KGUIAr6AGq4jnnYKZaRpnm+zHGVwc5xbKKCF0VodyGvQNwdRWqguA9enYv7ol yU7KtYkwgJvuThqQyonFkYCUP/k7aVtK0HSXKJClrZwhuvelRBTbWyrvWC9n8FcFS+l4teNbAIbc dPFy7ATApDnCGvT07wEtb/VO42VUC1jG5Tp6/WEHPzEkyVnzixnBwByDvm31nGgrV5JcluCjkiur OpQ0y737SXiWBWOyw/WQ0B0SrelAqfFWPSNAPpBCwWMvV4VQ26GTxFsapapunMO+r1ieN6+xIbpb qgpl2fNJAQbLlWh5HKfItgoBtHOH11XFDQPY7oXScldCoIfdposPKO7BQGP6nTCZYhyHznr2kCye FwXbFRIWcunz4eweJwmJAigbWGErhDu8LLtTONzMwFHop1OP89ROb4EkZaIIvN3KqOYg3ZqiF2+a b48MrF5VSjnGH2QIA+90olyKSWIeZ9oRDLZbPs1kAA+c3sYi2WU09XYloRwfy87GmrkkS3k+3rdI hhUIR6nv45ZSE6bXRSoCMra4rTnThFfvqaG7Ib++NsUClsLdbNm/PI4N0UVyCrMrM8ZZJMyvXeyo QR2QIOZYMTV9F6UfTMY2EVEZC1YLmiTZk0exTrGyOwBb0NO4GpsAVNJxZQSFnBZ9xXE93ElGWcGN K6oqF5ToOVQ9WVIteZDKdCBXnTpcjxTVbqLp/CYIvMxc5ZCmIEjBEDQ73bpSoKUU8CHrNGatttVy 5PKs9SBJw+xR0i4CbMqckU+/gzVvV1JVVmoWKFlBV5lPrFx269woFLhRK+oFt6/IoaDEtQIvCpaI V7JqUYidHDJIVi1Kd8Vc2tLqcEiWo1yZohYIyX2RgElrnBTnq0dlcVJlnyFwupA1+jCRldUluo9A pfoyjyBzeu9FwIUrNOhuX6cXO2nYB7ZjC2/prUvDiWhbgl4XpSGQcZ/znYIfjOtqrGQOzyjXJUkx 3f6GO28uvZROL/uh+2X12rA4cz14XYda/RTzdIWe3vpA2jXoRXNJ08Y0+kvbOrkXN/PFedxW5Pc+ hDG2iwsy0Br2xYuB9UYvJzsDUaGg8h3CNB5exh2vK85kCNb+p3T9bXHYWR+uuNXN1I7qVL02j9xX A4sGzGbid6AeNM2jECxaxCRPzjbl5rNuGxK9RAr7diMxTrplXQQuTUl0KUfS1flV8PJl+/OSQRrd 7vnWO8WR2bKLioO7RpatRd2htFLv/2Xt3VZtW5IksS/If8gXgdSwkxhxj8fuLT1ILCEhqKaLRoji VJUusPOh1U2jv9d0dzPzWGuunSUJUSR1jp+xYsYYI0aEX8zNrIg1aBx1sXKH7iq7Uj7BbtE+vEU0 aMZ6TYu1Tysak70pKU0NIlFJvac6ftMGseKUxTN86L64a8snQ+a8qSSXPwL6SkLDdsJ83SeoCS8g MgwODB/t6g/dPgDAbNksXssu79/t6/2Cm/iijTujo7Dj9cajIT5ux4fyL1ZA211yhxEQZGBC8GOd INkt8O027qEO9MdmDbiy09PwQKCW3VVQhnK/s9cAmwAs+i/W+rSZnGS4sAFl2QGYE7sS3HTPf7HL CzAcuxAr7mEyzXO+g/1NCXpN33YXFW5LPteHtc4LJGW/1AmUztbiXQTszyzuvjlLmKXcRbvNCW+f A5DbK5p8fniNBce1Mxg1DtrXJPuOMGV2rTLGHoKyGYuNEOWeApsbSiRnwojo0nPrPdvXHnSMPCFS EUZCiC6w0SPwlkUsU39f1OtXCeV4yEngiZBCeiz4xgNNaHwwDfN6VK2wyXYiox6CSQq3jc94mELi 2KtjaJc4tIGyiWmtc7XMpNO+xFbgWM7oBPBrJxCPY2oGRbju7KSxa+tTP63OdS6wEvO/Zoyapt2r CITMHGQWRGKyBPcAofAo9rIkmuCZpAv+LrMWZkRJxE4zY4fjyqnFY+uyHwNKxLoQG40z+cbV+bCO 4Oklup2xQNVey/3M7uyQhTs7Ya24GNkoM6MXwK4NMitnmHq6HiM/8qYQZ60oQ8QAALSaEZvEIx6m V9y/9Mi9UssBwLVrgFYUndYiW5DdLiApS0BkG/Uh/ud17XmIYWcq3BgEoznc1gd8krWErX8CdskB nGgpXg5C87WuZOGM/scY4M+ZDuGfX4vDQrEPJETAtzBARBDGsfmJ8cD+Lp0G89D6Qoi3sq3smusU SvC5oKdrBnXhvoGfawTffawY8NcuCTHY42Y/7cs6tXcwYbCMm6/hDghvW4PEwL5LaW30i4CNWBf7 LdXGWP5cSZd3d1+szpwHN6q4lgxuTyAbYAQMDcg/FqjJIQcSug+YHfkZ5sPK/llcRuxKWY+60AC+ jWTXE61uYQZxwMoj9HE1i/ihIqRlcnwaYKDyedMjNW0gPJhHrJmrhBcaHw291FUiZs/H9QEzsja+ I0UmcZ4rX8ffmkf11OdOlR1mIXz/pSNjZiGu+YXNrXaQEkiPMLIVrViGbmlcYgcTbTwTdnOUZF2F 2Qqv/iqfbwVM4sPJPD0Pn4KlisGbOAXy81oKY5S5VYnfwaUWRmZ0DxuR3Yh8B+QSOADd/a2N0oyP ch1dA2Q56EpIZW/GjrON+edWVSdCinRaqEOOaC8N/Qj6yaiJmFvNpTDn3aRCMuWlwGIHs+KP7zLV TGAn6Qf1JfxuCx4tW97nJtrjk0M2l9iQTvwVb2wu5ew1r1V43hVUXSd427a6BDjsALtOnkw2aHnI Z8gVvsRte6IHjU/mEUPJhKNsAzx0XwfZdSc55NxrWPp7pJPtG0Gb2ZyMQczIJTOpWONew8oH2+lA +5vhc0EDke1pYimYd3GLsJmJPOunU8wKH3KWkwLTpgvIbPkLysxWN4nGEierjPDMnkuX9slmXWqO q9OBbOdGcizaFAI33is3HOB1AyRfZHZ2qAx6dLobYypGRePkHxiAkMyiyqERDCdXCLxaY3ku2qc6 2YGmlZHpfLk//8Pzl6BJ9EO/MafkSMF4sOpkvYhMLWu68I0aF2snCn+S+f9E9WOr6+cHyNW73k1J ftP0yIQO3AzIr9jAGF4XWVtz9xn3vsp6pjP+6cNBXd/Y/NWz8zTRi1o6hAEid2szNgYXA/zyUy22 doYw6DH5hdF5DrGpy2UdNlctM0ej3y2yKOCPu48gITXW8y2WWs/jf8AMZqyRLZrWXYzDtAg04Y3A AgGphcSujYIqUDkxbIuOsvBhF917A0jLUQLxmXftc1MhCZe3QFR8T0Vtuh4usUNOS6GoSF+Sh/Nh w5uHlNwqGNjAie6s4AEY79taeNZkd8HHK8mMKrq8I84yW6zq5mN/w3f4H9yuOkzpJdi1CMeKqmwW xSURtI4RmwEclVQ58mg+SaNpYwfmufiVvAlRRwOQ4VYAEEvVpNbbEqzyRKo7BrCsKl8CMz5esuDj Yj7QjJDgOhcPhGdNp3aagYSH5494YrTN0M2Sc8pOeBxIMwMMNrxZFu7wi6rQQLD0ZOUO1pTicsZ2 ds6Siszrnk1hS2OOdzf2zbrHo6fwsGTrjX6Y62BYzX61fn/8W3Ct7gpkBElQgW4JQf/cz5ZIv+fy tDInPlDDCyP7XzJqMML3OBsstfDQZzd2dzRePipN9TuUeJCh7gSlMkCKv3/tCHpcxM31Fqf9vdU5 /yP7sB69glckgVPoCdx+GNmGXsVMbGCmqqfSJVDYBHZ8FOA4+JLOgONjMKlAjPHM5wANLAlPgLTC mG2ArAkbTm4qDlgUEatUwrDNEx1TXQyKdO3/HteidcGDFrDX3t89e6Cc0UrM243c471EKB5fo6Qq ocY4Et12/T3WECebS4voNuNZmup85XIpOkQfdmzAvBMVVJAV7uVKxLCtqBciBP3zwlu4016ZsjFe qMoTj6g/x5hvNrOhcbMdNQuVfAvGYTUV4x0CkE/wiMY2aeovNJfOcalntS9Cb2lEbe0b5cpptiRc KWIJtQGEYiXxtdFotcN9S4nelk1QCl7t77tybIhy33+JE1hJW7AZ3Zg8WucxzD5V1zZDChhDsvh+ Aj8XQy4RVh4pNoYIGzG8xIBbAEBgr/O4cgBG+UXSAK6hRn/hGpXOSbk6y0xDbclDwzdn2nCTyTEB +yaboke5Ujh+LY/7AaT3vJ4URZzaUmtaobx9XJv+CqErVwvSUf3XjI+UCzfzg02UR3y0nKz8xkJp OZLwnhCf5d9PsVwBeOWwa56pwq4Ovhf/IcLMDUhddNhfenFd+Unwxfweck2uarAf/HA0IWtsmQ0w 5OmkY3OBTH+L2eyD6LELp5o+H0leOymbPO5PSG1Hieu18CFbYVJtygZQscqwrxFpOMWBBOh6CEFH KQphu2GtoWdq1BAwoYriVbedkOQt1nOvQeCxpF7VEvKSZfl19X3aDUTLoA0gv9s07ESSnnrNmUyg 4pUh3Av5LtRfNbhc/Ur91ojdJx7B5hogKGvHk8AvKUXiieufmhSZ34V1HvKOl9IDtjQ3a8i7j5wA gco73OcPLO4UsWRztW0agwybJCw0jcXnEf/ok/sDWA/6TqjrjlMojOCN3eK9XkFGxU3z2dRoo3JI W2oaE5unGw+hbVkyausCinUJSrZDZUJIkLpK5ULhs8tlNrPEEdl2eLjn3c91q5qKrJ8OjcPHIhT/ Eb8DCMNwRCYXSyHDxcu8hIcmONmYD4FauUREC6kk7ErtT9bnNLm0qC9mHVGLmJ4J7jbzB9A+JqYA jLuZFGPSwo7+zq9bVMmvWzgsde/rlCfF+PLUEY/zFG5jUcTJMon7OiA/t6e12vuKPQ== aoVYQT3F45TsxVnDbw5cYlmc+/FStX9e2g62YDa1oSYr6L7mY/Mekl+xs6cSsv1yMjuMLVi9+ry/ 8HlhNNmGbsZJZGB7tgaYgl0kr3NuEVMuq+8RxClRT8D2Y7wGdD1zP/sdQl1IJfbS25Yc/AkO0Vgy QptpXP2MvqcHjGWIz8k2JMzWGrIrT8AcdYkY6NroRqSUwghysz4UEv6+k40naw/fRAcY8Fo9d+VO ZoiXkSAu64fAnt6vnu/rvARzN8dNMlB9010nWxfy87uWtTCDS4bjYrYg+ujSZzcjGiz7pWbUxJrh pOaT50Vb6v8AF44928DiWyRVaz5yNgy1bPgZWnhV1QYbAPqGNXZIeS2DTd4kfjNjZcsdu+saUGbx U+1ym5hTbwIM2dIXDT4Z7WwAnG23FIA3hJOavq0nT6yJ1djkpS95z42U0PHxHtxtpsTN88MmmKSU TYkAXkvH70v3efwY/YOqTIKdOJEeteZQ6tZuxYXP/aFv9eHccQazXwDHxw5I3dsnnClujG0W9ll3 xTRskwYrbxhTOOESVv5tE/kD/7kqb9JSVqKK1bRtki30oGnhsB0bTQ1lixy24NkSj2hGbDVVWSL7 rUX6apAg4DFW9oRJsXlfk2V4bIGNXmPibdpiv0qvGa7sWFT7E4uBldcfLq51RXZJC8Byq73GJj0F tH7lHRhp63n093RdQFDKJ9M6l7Io+498l3Y7FKSUb1ldYdt6fCFAntm5W9hopu/uCB/WrpS6hf2R 6PJhdRp3Njs630pc+Oj3UyrK+64rm8+QErMxCz9xgJvMxUC0Ui/YgJ/8fImst3gDx2BfISVajiph z0U721IEJPvCG3gi3ciksXlUAECWC+9jN/awM7GcyltAie5qLPRcCLves+TUVbH2fVIDoO3J25uR Y3l0ardLRMC7xlMxhaXDLg5EW12NuRNbq4tCMf5F08y2jxohUhjBfuLSL5jaI8HMGhgCpqAAiXDm +M10F9KALloC0a8WalBhVLNCV1khm1H9ieizAf+sGw87SWfm63jCJx+md1p2Tgq5dzM27p5JUO5P gGQXSjtnAeNK+j5/4Uadm7pvIg9eOTts+qOY6ZELS7r9WAdyUUgUEL+PIL0/IhB/ru+DskCgo5cT 3jhVomK64x1wKhDa1LNt4Ym3oiQiGneTI8olOkiRoNfaiBvzZtqhF+hBfPwWk4XJXv5IvdlfSwE7 QrYI9fSxioAqtkobX2FXHprKEE/k/5izJpD8URa1K8+TQBlzDUHGWO7iR5ZkH+ZpvLFp8gRFh68H dRtPtSne6BkuPIGGx7VwIop4hZ2UsYpjgtRfzt/W8Fyk+XYfXtyOLY0iopNkYaQoW3wa6jH2pjye lZ6GMKMlUfm9HenLzcGTNsmJXIWEewY5FD1Nyx1doma/IUp4FF01CYd4Apr7AEG8ntYu59r8OUAq MPl++4F6Gdi4vSea8FrnAWOzeooiWSVOEgTUx8yu7KpM5lCZ4JPfZnTLg14PVQVHk/tcxdRjzFSQ 6Kmkjse48FMfURxdBcZHjHMkdsImc7JCSY6UxNONbM1/1CVjRnSUgcaFz5Ede1WxryNd+Tks1U1/ 0zqJHl0/DlEBr/IGrxJ6FTdGiTWnEmnwx3jNo0uhE6xLRSATp8xm4+5RxGXPEFmBotZW4xeDlni5 qR9SKLiqkX+o3OObK5qgsHzw6U+tgi0mgZETeIDQQCGR5W8yVT2BAJJZHmnhmunRfBAj83tqcolL AONYg2/4IErUx8JYRJREX92L+OP5uisZ95hYY/xc4MSYLICTpOL+Ic0Baa3t5yadLx5NrhRMwqdU vRpdDJOV3EVhpqhHDYwDzUA59JoF70FdCa+BoWafKQA7qLmcBjmKekoMD2kcMOr54ZAMptmeJO43 6+Ch6UiDD5hJvlnl+Ix5uZUVs5rC++Apclh26ttJNAgKQcY+eX6G4Lw+K30lS90nj0B5I5mUr51m K0C7y7dmBrnqo0YrG2BRx8dDFxgRC5aAzv2NGazXj6kZn5vlVOBZYoJ8BAOkP1mSHJYVqmjbZ5Q8 UtP8Ao6ZbjDoHJIDfExlQJIo215W33oEbWgArrhHOSP7rUUvraNr7zuCMFzbaK5ahRXkIEVwdfv7 6MXuYL/R2mzclBwihpUheR1/c/Fc9+RjyV4fE/jUVldVDhz7euB0k+zVRA63qcZkqqGb9GRy0/zP 2f3u2QGOSo3CEtkporb46ZeYL69mOFjk641NUeaeCtZjyy0tsetxFlW7O+nftj6wpHX2lcxX7jsL /56o0yeFmo88ikd0jy8jXehy90YX1V7AeM37PdpEK1o9DLpW6PIz8TaOTrLnKpXNcq0ayfW4+eF8 SwJXixSssq3Cm40Pv1MSJzyElNhOMa7m6MyuXN3cPLmqQNBmLLxyK5c0remJhDvsbZlVXvMjYp+Z AK3ncmrmo8ArKfGn2o7c61Xre8lYW/j06Z8yl0LlIwC/sC8FgRAZ/+ZvzzkHV+dDVoLWGoxj84mw tbxciTB7JpuLU7L1ld0+7cLyPhRzsZ1LQdtUu5DVMLDi5iNIdfkL5CLsJhf9qarsgT0nwJyL4vxZ SCPRi+S6Jjiu4w7EWTX9ivvzwmIrvC3dQVEbfrnhnilZUSJDEmu7dY5KhtFhzS8iCUyIcbInACDA lV0PP3DoHNh3pH3uulukxRuUxfUdFcqTEdhpT6aSNwZH6CwsFXohjH6TmfXCvAz0gQdeK2kYSdlm KzvQeO0QYWffRaxATxExLW5fBrqCS3YH1KCbgTsGZH5T/etO98wuqewq3292Crx5SkAA36O8ejpY c9z+HLxtQ/0+XSE9OBK6eqjN7acyqpFODnqq/tGQcpTpYwKfUbuIv+dH3AjjtXsVSGM2FTcfhZjT JZK0keFTbHLZnhs53dj2djkns0lRGFpyvLJenxf/ngmsEof4B8xQTrFFqwZMny5PCuZIZ7/E5Mgh YzBrydllGGJvDEz3+YUYQevYOoQ3OT7ZA1siTvqpx+3+TYO65cfn5+g8ow8fGSENRQBhewydQn+T abDZLu5RxzjrMaQroOjEF6MfKp60bZwwshBNYLTfMZ0O0nRfPE72xJAGKXG2/AgQfmHGIwGvU/RO n1wch+EzRUfQlPVjxEFjt4Y2f2tF6PI5xLZv7RDii2P3nrUdLB402hYn+7P8UGJSdU71YzxC7010 rnXoE+E6ndXJv2jTUoZrsesCOhC2bI+MjKdBFqM/HyzQeCjHrodMJxJWOjfR8gw8wwj+4P5cBV5v tWFwRvfVOlIyxwhHdy516tQLGWvPdTOzMpWHmVMJMcRLNJMaLuNcewso9j9BWBfGPFsW8T3eTaFQ m098SF+yBiM9rlR06FAhvsXn8H55Ek/qb3luE0S8xo/TFPBpr50Egfq1he8MbZWOXV3sv6FT3qIx ic8L3E1eoDls4GFw1tSL6w+c6bTMadorhz8KXsV4YyQzrNJueqeujgGOBH5rNJPBuFW6QiLKjJ1s ptdSPsT6WeqNz+uwQcKShyRwK8pK1FjWHIBSNlXVxnkkXFwVyX1Hnh3jEm8BnQI26u3F08Xr9GH+ hjA4zAAfe/S+MGH0TVyklqtcWT4p4a3nKp2rwVZkyD35sY3ltysFqg1l1Ys/ku9h1SsdpxbGHOC5 0Gors2wPs3ROHTy/bAjf0QTHZJmqyMjGeijzgCXb3SPa75Jx46rh3cVWjSrsuhVgJ1Leq6nq7OVB /H0jet18t4vSONKUtqcf2tC3F/VgTR8U7Cxl8rXOUJ/2Y3SSShqSEvZTfK/fMFeHuaSf17mQtyII ikxbE2mn8/ppcXoPno5h/H3l0cy3WuiMsbrIP18QpiraTNbDRiXPh06+qnzXCXKwcQeJTdmFm9it wFKHjVWvcrFuWPvnZD52Mry3vWQxrlL8d0SMWlQwN+NikiMlNYwwXxVUNANZq+rJRFHhrlVAh1ZC 7IF//ygbIQqiI2BiuXciMCN8eq7WgConkc3zdlQu+lHuWPIIbkqwsoXD+zT5vK7uT3S32I+ho972 +CJPLh39zdp8A5RWUgKFnwHLObaIIsvSknnDPsM4Z5xyn/lrWwc9mOh3wLXYjY1d9mUukPtZIKCN m+Cm01UUBbl0jCsVO8ZhYeRhbeHOZPM5UnP8kjlAW6TIh1Lt6oSv2deFRKq1xEf/KQUG+Pc7tlj3 USub4lkdLwJNvYzYtT6FfEsanBbGoVa3BjmuHFoBBgFTCRp4WNJ1dwJRfMtb1N1rEpRi76aRQMBP zRTvjr+XdlRPAhRjNgiSYcN7kANhs8Jks1KD4MuMQhsBsMlJO7g81pQVh7g/Rq6DwyPF9qNDzvZ1 qAXDrF8Ys3CDfiDn9GDmxTE4P/H3j3TJz829kSVbQi3s5jaVyZn6XercJrvrTw1wtNVuPh2ey1ll +o6XP8xomfNrGUfZkwSpU7kQ68tx2kwGks1hMSdgIR6VEqwFVCkQyczk22QiCQNAEqNIYXQZHpRp 7SnX3gY4jBHF5KLSQgPwPxbpefh+p9prbUEffWZIOS1rG+bT3eRdGAQGUwGCA0Bg6n7kI/aze8P+ jjqX85pfH4EE1q542GYVJBO9XGqma0hP7gkqqBigKVfgxXEYUfat16Fl/B2TbOhEytqDTYZy+hdL 6IF6lZPN/GTtak6tDpYcH9U3VsLOq9L4a6vC/FwNoPZJnsLCM7Rq/dN5iPtB83V+vL1e9VX7ehud V8968eutyEwkuMZokQrrm8zcOutMV2KDZIMrj85HJdqV7vajPKNzAi1EpAnGNPNWTQ2IJjfynVWE Ec4MxZ9K5oZd2IXfs//SjJVJeGxAO1kqnisUWxlxPN5nGLYN+NvDngizodXk+Uu6WZLwzRyzjZi1 bCB2jK6q8auV82m0VDqFTvLnFRHlpZClkUUdeURUHoOeTQwr+NquV/nQT0Jxnj2UkBDXXjax1JRn bZRoZ/r/JwYYqIfXeBs/QsFpUQLAcy1xJeOw51LzMUq6h2uLup1GqldVl1icQAdq687m7XZ5pSTu bJ8qgg9/n7QTN2Jzt6v82FD1duksRiCHynhNiQr4yhyASOWiSqMZAR6G242HXekUuoujGVSejX6L H3xjyuO3RS64TEyxpmdGJeIcscA3jtJ/y16yLZQZPT380iSb+aMGa7tWmzo26i3iXXMbRFCHNHHA TFf+eaTlvTOy8LkAEd2yTf9lLI2TusSwG4ll7WYfraL5MAg6D/8evWiOHZWcdyMuxIblVtaum6pd Cz7v4OLzaxcjvL6vdnHHM1FjCz5khtxP5SZtDIiDB6joFgczRYbgpf7cZMzkiGspNE4S/Njj5rWD ZdWWfVBbaqRsOuEAGRoQw2JadYOjij1vsZHARq16i5MZkYbDhVqMEOxzgPbiEFP1FWfJCaNjSeAq iz1vscLGNWdGdCDFU0gpRTRl2sRS/fKQFrFBtjiuvYj9qXldFMbcfDP7sPJo7ww+vA== CbA3Zp/Jq25ChFpz2Ti+s+knhW1TX7F/UnCv2pMvIuFDFkiPaBtn23aWfTQDVj7LxcVmdxbJW69y xTZ1CnPP/oXEoA/7lXlS8O+X0IketIWU8nNBD3ALB7oM4c7i3Z5HWPHn4j49zw1n6JwBOA08+oa4 cVGfGyDPejOVbh+7UG2uXa5z1Ary/h1LVZ7ruW5CUqw48gEziYlRiaE50V+cmQlKPkwdP1U2oGLK zfS6RYtdUvB0C8+c0exed8E+TyB9S/ZouVEvNXwW4ZHtA0N7793MvdeFqtugnzJj/xruvL7mzKFk A41tCEJOyLsQK3FLpsCdIea5Eq827gRIA38Lr/eKMowxOF4Lqj38U7QPtnPpIG6JP5lZS9P2s8Gi lW9dvJoJL4aGpvCrgtODrkIj4FUS8PqSewRuWxVvTFevUDvUjANqC2SnbbbQPayphLuFNpJarMKn z2tgROYn3oBIuYzJuGWBC76Fan89gY1xu8wtFbmTgw6D40k0BzBuuHtEG+Ehyf/Lz+ViEk2e3nqP RzbXenUZpnipQ4TxEQ1SNvWaBMJDIOV6tXx8HmCtXANQ4XUk3qAO8CjUUuJe6kuYgVo9udpPRmqc wlR24IlwHEakp5/oYuP3RsDpcyv+UtegqrXVtWYfpf3lNAv63ri9z8k8/KYGsflC2NpEtrKPAuVH C+IU8V0naNL21kXxzMShnKIiZP7+eUTwVUVsfR4esP1WwzzPJYiqmoepzKtdj8/0VG3vqR576tWp VibPwlMFM7+mUO9WN3BYuxz81qiM2o6S/l1y3HZpa4pZpEf/YBOtF3flQe8hFtBDmXrWcXO5Hytl q6C02Fp8mlZQFavU61rk+XpSkZ2m1FCNVl0OkDUil/7AAIiGm3yq0yVd1q50yUmlw0Romc5952eM UOoYBbeKqPn3Q1C7jP3PVI295sG/lOK/dYnPFjakqZf8HAGiVM96ShFGtqU4zzlX75kfera47GKS 5veA3tK8Hhorh2Uw2EhIbEYGni0qTz/558jFNfZQmJFkey1f4qe65Nw5AKdVif46YpHpqd12stx5 l3zPodCrt8T5ofHysIVDAZYnjKTqq1lQeu3JImOv7Ciza/vDjFWXbemTkdSfmZH2888LTdg2LKv0 FQBP/ymJ9g5aKpuYJOlu5twISqB5n9KE+KwMup7SCX6zXx/IB9i1XTVc5APsWlacG4N0H/Ww7Uz5 IzMTzNSIm/IB8HU31M7M9vp42RWyNIEuERg1Fb5ejqAPlW12dmW2DeszMvMAN0ulPrcZ2RFiWYCB Qem3teTPMDMolnqlLpz9PdvVVcV2I1onqsqfPixUARuPp9f6vnCWO/rjzEjdrBqRZAywBOoUEsCM Z7DYDPjfUwweQOPpm3eQjbiNuBwzJhYBYOLnKWoNauH3+ABPERdoCzzZB8xM4TRwdbzWr3rJGqqq ZkOdzP8csayZX8E0lqyHSx8wMzsnPffnqWr8alFtNGNTs71tBEg0uBn5YPwcBhDKItI3Zsu2ShUW /NJGhVoU981I+YVGBkgzjqBJ9KanlgPUzm0PdIJu1K4VmWuzlSecgtDH5fxLIzOAhB39ttBv2unU xiOINd+DGosPoIAC4Mn7auGeuVmIbjMTU9LJEmhGBtNdX+3TyPRtEyMS+XXEEApr1/Z4XF2wnhH9 aGHkVjASR2rmqXsAeM6MUA+w34rI338Jzk7Prngz86DsCfzwIVCKbqTdi4eg/tqDl5uthi1TdjYA E7qN2ZqXCy5YIDWNzUb6jJ4sQa+3JdGyHrjpMCIBY4QUD1byUs6xpw9jZvY19mhECiMRZh0cAH4h vMsW5Cj8+/5wIbqCUTyYraRIA0rheY52uc7siRkZ5PdMsT5V6gHOUQH2o1eAGU2tMeyaGAGl3d5Z YbMLC2Y7kj7WzMQpd2ISn5qysJ3KpW5EqaInJNrMVK3u7JMxI72wTi5UNw5OS3VkMy88ArTqm4mY 0x70dvh9QKuG677wr9n7M4iEfWq7eEL0AJq6F0e0n8UATYFgR6rIbMxV9SC1CGMbs1+fbPx96tm8 /r4+MYEhN7aTuvupUy1cIwXJzczC0iBNiBnZ5DKCIxmjHkpTTaIEzbyS2uVsXssK4yB3iBv1CFRH c7P07FBzMyOJogbV7MzIAGNmF4aZydExA5f0ATOf+Mpk0xPN2DvWHS8krxbEyPyXFul5IOkez5rk TyNfYb90CkE+6ddO0U/BMTQjTrSVSAR7tUk4hpKCL4wiibM0pviVgllbhXTDlgcYH7JqhGgw9u/l 8G5RbfLfwq4JqMIf+DiJK93McthGQCqOybKp7S4NPTMrywdm5kJeIPMzmyfjYlYPNsgtWbqVbQG+ aU0J6QUexDa4FI9r+P2l1KgJfWknJMJ7ybl/lqqIi7Bv+x1QOd6iknZt6XwvOn2nun03q21+GDz7 foMxwJD64o7EG06IQ8lBoBLi2CBdmGTj/OBJEjCEIk8XFHLpFT5NKucrGxD8TE4yvN559C2tInCZ +HkYuig2A+Ylw4fSnUWtJRw+rjf0RptzufUZuHDEVz9ys7/pdloXaeDcCFcB/WLhyW4FupvsuOYK ryoyvA73dt0LXm+h3K8cyV0b9dIGDZpN/yl4kSsb2v3HpiTnsMmXpQM1F4cZpay5qfLjnv/gd+Bv 7IPmSuk17P1liuFpUq3EjOzmmll3tShjajuBaqpfC2zG4EFfpGDiFGIK0+zvqfgFnXkzvjzVuFn8 O9p4XFn12frbnjJmB7HIsE8KTxrSeh4LVX7wfqpwgAexyGKmxAco5HjkyW8zQCFgZ9utj4vPe3sf zwciv9xLwaTu8Sj8gclqhhnpW69sJjAzawkrIFFhzHn1SMT7ldpfRMtt4fcZufMjUK6qnC+mws1I OOSK3DMHYGJmsUnLjYP0lYBZeZoAyR7spX8gqdCQSF4EpphxFBLs6cFIWszpLOjdm/nwJcTZ56Y6 eLOFuR7Ky604C/jnTZx73rDxgWQLG+EnaRavzNRWHvdsaVrexIPHatgHZq9Af8DMDflIz/EshW5b zTkvozPQ79CoZirYroWfsDOhmzCxrUaLs671LWbTo4be3IvMyMYnu5so0599qdY7ZoM3Roqwpbra EoZliefxLCF1Vxy4nABDJNuKAg165sXCqspmKo7iVpl1JOZ+K3E7hCrZEsKwrCd4D/YFZLJ07BT7 I3qBLXF75ChAWuI0hRzXQe8J4cKzwx3HD5hJ+rfUl24Z6UKlF/cikedupDHNAvOpFBzzL2HyWlSg LgVGH6DAtVxCcJwqkt8pyPwBvQ+OPzzv5yYhVYew5epFS8kWxFPUJLHpXnsJISSD7L4We6dPthjv nO2jLMgWT7NVnaUYvE5WYomkXFGZ/MCwfhCF2WJtVmIhXe+OFEAFR0rCK1XutuCv20NSVmLJA7il gm0F+UpCX6Dut/de0qZv3C4t/ETJfr3FlC2S370pCUOPNQvBVQ6XyrB98fieLDatoNKIG+2Ci6zr VJIi4Lo2ZLIE708fnQpb61rfLevAZVMkncRY9ktl6ABVXWpdgrG6dqpjVGelGzuPlNYSbeJIwrAC smQ1OLof+Lx3EjmsG/AzRbcFIVLW+8ZOR1yV7CER2wGqbavOHkqLXlCRKejaStnVeXkGetnfKD7/ M6Ik9vRAPu4XzfnG4lwy2+AXjhfmRoSv63KCzFw4M/pxNQtUHk98+/N/vOb1/Pm/ttsziTj4syOK Rb9gJopj6HQzkPtsSjnEB726+GBGpjXd/JAKlT11y1SaVv+8sa5bV/mToB3zE4uEWo5VFgUyurHW Up31ih8cQo2c9Yo7+OD9Ply8ZOJzUC8FpgkQtQE60wvJ/mXzQrgymPD1G0NVfTDa8Z8qTAS0lbDk Lw8cCuCrX5HYQx3z1cUwvXRAWWeC3GcyeK1kWF13402XKsoSHnN1arX0JbVaa2yYdCtFXeNdFIzZ yOzrl3JJUcr67QZs+Rcss64izoyAl3c3gMydKefo+TQaCdxO1qD5uZnjy7gfubYNGrg5kN9vqExX iv+ZeRCGuOGfKHgJDOPAcu3S4QxsIq4dvBC1tJlqrlX72Qw/jH/NIvxU27HNVIc1u3jep0/F+6q4 EiTQvC9Kc095jvuJsCGM0IIyDV9Q0czsybZL5f77PkEoqfejxEeLhmCbgp77xqp4nxcm7ABoaoB5 Ke0XzNxad4peqvHIgxvC2EnpsT43ZaRcuBo4jko6K1pMwng5TuKcMrO+I3VLHrWHLsHNzSh/rqjX cKvR+foOzelcbzfw2h7ur5h/D9GKy8Va0BOISbHzaiuHip4ADtAOXRm2Q2zhYXZgJHCng35bMl7b GwD0aKuvMallNikW3l/g9W1b2aaQd9urL79gztBf/Kqm0NCwRBCjuohP57pJxvqe2ckZDWv4MSUv eDBZvaDyrPCQPgZIBs+ZrJKVfSnX2e/l8o3XO9V/QSRDLhuSkJaHUQ/jtl4v/4kdkg5rH7iz9Iy9 ZK9YAqJpXvMnTziAk++P9mdub54Xqzh0PM75BTPd+Rnz/ICZPvYMsc0wMt5FD7sZZ7TXh9EyazHp SW4GZ0eXtBWOMm5llqepLJcsMQP3zB3Oq/W+Z/ZwJiX/ENva9IMzbGTEmle7sj0qReYkyvLZPNyg gaMwI/o9ZsRvf2AAxmRTrAKe+WfYwN59mzfiLEM7610O9d6vZA4dYmJaov+2ckBn4ikbJW2OlboI 2QhuPyexAhJl+xtlfkTf1FDxcWV9xW8YIf+WB+bXHpYMyOI7RaBycnOzeU0mdsUUmw9hM/HmOmib Iqj9XjAztK07GviwihZ3N1EOL2lj7KhD/MSSZV/W9WNLTMhbIU3cOKMn8WH7uDo3dhXTqQ4YRqAR Cb2/m6UetKmGV98iOMBBtypT6ngJbFDxrAIPHkfXkemUNzHZed2TJHuKgLyLisgnwFjLNe614cET H+VKC4pPMPuZLG2x9fdHviK9SpvA4mmIZhi3KQaX+LvpBlXlfQBbdmnMh4cRyGpcIYpfzdHB5XNl gcYbpz9gbgrCB3D5xsq6KAxI2TJXrqLYkZK7ThyKCOFEX0gYmUY/Oqap1xaL62YeVYmpkIPyuWR7 PR6lmYlNVHt09aRTQCpfk3LUh0viznoV2tTS5NSnfDX8akbSsk32LPtXyd24JrMuD/8h9gJ7FFgD I9Ki/xbXMjmSyhauY0NlC89AfXvSwLG7BIl7rKhfNGvkpIUZatkdogtwFp9F5AQZobKC2KP+5zc3 1ZPjoVMhzRIzgD21dJuY0UckOzgASVlNfnYlQRHlF5yy/Qf4s1icziTPbIIh9bggriXvf7+p6Ui8 NC75eeNnw/bXFWc4XRjFQMjktwbv1LGnsTasO1qVeHSZjyM4SGcV242PIANJa2sbMa5EOsVMSKSP VHW1nidiX1LKfByFKZBr+eEUh+QJH2ogsCsVi9RkiT2iQ4R6E9kMx2b81AMKEHOYyg== a1YaWZdFbKj7+mx+M1rk+2//H157G8v45sceYBSm2nz8hpmFpaSqNPlYpYq/96QgfospKTMuRouM AN24YVSTqPFP4pMZOn+G9Lq7tzP8CF5OcHaM6IKKP8/iMt4tuWTT6yt6M0uFnnHviFO+RQ/IpsyV Gw2PVuM9xTsf8oXMCCGTkQUk57mdj5xU8IOOKLTGAEXcxKydjKvvffQraeNAevL3ktE6NXiMzhkV nKEO9UsKeFyKtWbujFtSVWxkam2K+Wkkm/8UmdJoihnmX0RaNJJ2fkYoiXl1Dkr6QefvppMp6tcm VhTkdHGvoTrZVaF24+b8RVw1mjLsU5RHZjxMj1CH1+WYOaekdbS3gGYpy98M8tTWzI+QS9oSigx5 qi3LGGAIX7aSCnVcenUPEhkjdXpm8h0Ze24hrkZS10M4i6mO6eT0tVfFNtWxBM2dFx3fWDrXVPR0 tezKQia75o0tuTBy3DbUH/yaoNKwKbs4snVkqytrLH3MOwqhnNdVroJKtZQvzc0mrfES/mRHFM2/ J99y6qrZl4+s9RaPlKmNP5xVlhOGKD7MYYEiWLL3dgiYYQaTLm6f2qVWtKKGN4k26mQQ7is5gbdg 7ygYcgZXrNPFVJ6U0Yh2aCbj21YYZjcxWXUkFZ8ZkSHfNxf2lnLLDtofjss2oiyxXmymO2IBnOJb un9coPO5iiXMtM4iktzs4jWOVpS5982s9iieTo/WqFtRPt+SUDN60Mpik8d2HOAET5UNQA7JpN49 SQ5nLQEPnOdsMZ9VpdcT6RlyNSIlNoo4zSeEDGIIumggr3CjJ2r+oC8ESWgjO6DbBJ0DixDw4dm8 pGf/6cmgW8DMeAK7UbaYvcnzuURsBV90plspzlKGfT7sV7EB6CA+zEOZiqxCmPkQ/OfBjMiHERuO iyi3ElX5SYbXzIvzn6pQ5CO0GAcdauZOPlRMF6NTi8640OxV672RaDaKEbN9dNbLyG4mM0qe9pG+ h7nfQV/u15584albiz3NLsVWfSRfbStDQuzJzWHXoux3AtEB4+G1VL01dlHgJc4laeADsLAvUtt+ GekmmvEwNPPEbgzQtaVs6XvYbaFrZ0tCfKa0xr4yzmZWpkM8yuYyEH9Gtt+qolaoy+qNI3m57wdb AyK4iQfCM8RNKVSqQqbum9i6BSHZFkyNg5K9ZiWNWdVesJJlMTWVVmD99LSR3J6q8RgTq3JYm1S5 WQJcF3tNkrEyi0a2zZa1I2A+XkZ2SU2RfkwpKpvjp7TQTHzIkGiAMWNKkVHb5Ft4yrj1iAkJfxdx q7FsETvrpQ5xoala9kgrwgapX/CgTui2WDFnfdH4TAUSyWjIqNeUBvbIFqNeqehDTropTdrMfjq9 JTVp6b+tooaxTJAZ/Z58j6uYWS4BXPbnOYfk+QRaMFJC+JT70rRd1rpGhAdW/hKhiDtEGNLkdAYW ftK0ripZCRSAokbbJFGaxBWrKQexk5exC5y2Az+tmucSepV0X/36zgkLWsbSQZco60JdCZ8VWbcP mNOdQIuGjUCi6ave1C4/x1Pof+DGtqo4xHOsppW7FJusfqUTMz6yh/Ao2SwdzwXltDCDHN2MiHmm uOlXU/CHCjzHJQw745CXkXK5Uxws9m4WIe/XSmhKXi59fk6wyTsrIKpeVeCqdVGFmHkRBUxNxk8D iGAye2LWlfkyYsFCN5RaJkYsWIVYRorLiDubINvyeJ2ZkFgTlk8XdCNjF12Vo3LZzuhc4AAdiZB5 c3weCeNSF8c+Jw1w3cKjSHlKjWDdiGXmRoxzcWfUoVt4rsIUG1CNZbNqy66iDs1ncBVEi0rj1/PK vtgpR289V633oiZ8rtiVrdy2IwGalfHYKkrgziAx5AzaVnKFi65cr5yMmmZcjHP9c+WeyPaqrN3Y Rnn4wClAaT+1svbUk2qUmK0RaDnu9plN4foyI9QDPhlZaYPkMMdlenyolmAMpmpt2eIPZTVkRFKI f58ld0loHAFDZ5J9v51uV7V2F7V9Pu5s/KI1mbwbidtSvvWySawqH/qXS7v+/NGQk0xqySCQSrFv kzIUx7/6O/tPJhwM0YKR821dMrQjNYYtFcw8Kgn7TLl4sDVPD9OsnUkwQPNdfbmopSow3O+/DxfC RlAy2jIqnBdd36F8hE+hsycJb7k1qdCMi8CydQFtxwVje/s1gIZaNkdD/vwXzE0a7qSVbU3+yg6k lhnrBQFO9oxmPu2AB84ItTUVV/Z9H4Tin4umtYGFwM1Mgtmog64JBdRaVT/DZo07zNQx3YHSiB8b wmZscK28P4Ofejjs4DSGoz71cAiYPeE1fdAMvOu5Egs2SGNFyTflj+/HxhvpCgvJP/SL5iWWHDiL zlZBVuMDPBtpIXcI9hA3RuGwLVmbMF4Ca5VanF8mABiidd8MahC4s+QwxKtDE8qP0XY5hQYrpBUx I2H7JcoK346L52+VMGiNtkCi+KPwIJ60FqSvtRyC2DZI4eEriqwYl3Yb2Fb9rjuzpsZcIxFY5ptS 4uZman+f2IdmTIQjOKU441RZoOy2Sw+SkpDiD1Y+bBQ0mFL9sHGr6AePypLszX3ueil4gF1pgZXs 94lxuSH0iGBf+M2+6JV6voAJers6hJSHd0Wk9fMYfBxdHCxPRM6/YGbIDYEkieRVch4l9fn7IDk6 4V8lvsN/YfTfmL8Mkg8G1JBW6bW4mQ8GvccDqrR8BAh2xxPH/8f3g3DuRR/ZDiwmFwqTkzuCAZa1 6V5vNuF4Wfvhzoui9tuo/JKm6mYlMP6/kGMFF7Z9ugbaYvaasIfn1kycanMrF2nr+9i8x0b8vqWB DEDyC2Zg4m0NLdSaGpFSI/WdTFQyqkTjpiz/3QCQuBpJ5f4+Az4PawgQRs9AD3we7FrMpomx9FBX aokuMZqu8FOZtKYK7iLRqw262FREUr73CfyLM5sC7V8zI9OouvO+KT0onV5UKQK9jo9KJAqzuL+f 2hGh1Yqz5BfMJI1F48CHrmb+SFvWEfmQQNlWpz3sx8iGhnHU/WEwxsHyLfXWEjBpxsq+NcduqqZ7 CMrWHR81HE0l694LvRpAJVWG6/5jKq6hgWUkEHVGoMABCCGfqSN5RH+01Kjx/mgTIDHFR+67PQES JdlFCQMYrMA63SbSQYOg3HaugH0O5XNSuGBQjLed1MEadDE+sfNPw+YtmCWSMMhd3LIf7f0OeGtv I/+CmWSkR30oU9KTl5qAq4mRIbVKQMSu3WTcVF1hMO94Ma9+d2/8CAGvshT6c22X4HIazyU6ZWUx pMafaKP/+H4Q7ItzXfyE+YnPxWyeswsGpmomMeqhg2ZpTUl51J5SUKDacsbbhxI82EGNnBB4qPff /0NvpD1M2FSB7O0xDaErjp69QKJtdgqpsddgXjg+u3YJYwl3y1/zESQIJay3CXCt7Nv75Vl85UpT P2Qa1G+QppJh8su4qdl+qbndopuF6mZb2drkY3ybwAVgKkTC10dfZ+4nTfWuISaweUu0fRmBi6QT lmSLynbuXzADVDnEJG5KeZ3nocSXOhFMVprZT363PKxPRGhxLeCqI5VWbTdodOpWvT58fJ52Ji8m 9U/3jcfBZ1MT+HwD+d1/GZirDCwnLq4+uPtMVb5YRba9J7I5bixdM4O21UiNHx+10gh53e9u7Z+R feo6vhOOZkkpdfVK9+AR+mPxQfw+rcb2IPV2u3GzDq2U6dsEfmrP4D0jguCegQQn3SYKqHHrKVHj jCU8Yg91b6pKQC3au8dzKXzMzbbWIZ3wKZleB0lWlljQHucoyyc3oy/TvZqUKjlQvbjAPp5UFEyB e7s6inumX6LKsau1cFMMkhrvLVsS40Ad8P3X+KLFcubCKHrRv/k9o61xP8uvHlSSSBEVAr/fx+UP Jksm0L+/YC4ELrAiei53kSzrlvsTzckQb6WlD0XP0MFV/J7X/Pb3ObFkYStRLf4Fc0MFFcXpD169 SPSa2K/3Qfi6N+kHPh113mOjx6S4w7pJpIwjqsVQhSBDvMNOPr4f+0O3BI7zAZZRtiQCTWeRW2GL HUAmtqYfvljoWY8n21vtgdQHV7ZUrJix6t1MCSw183mE3qXPAxDAE67Xz+/nips4Se8HoYlfMKfm DI9N4+7sJBOn1sppqhmW8J/9B80s2Qb1T3fhMjN4si72SrWX1GczqtJHuixWOI6u6mRWLSoz+BDM ZpBW1Ypg1JNOheDTJBxsOZmgwDUK1eSWBuLpVDUkligh/8QEiIoscdiHkR1eQH7EqKyIlKvbx8wp ugvBxlNVlyqRQfkRfLODYuGZYbPuetHSi/gACiuxL6FyYHzmwVjt1PwXdTmqc+1Q4+w8l+JNzUHR 2OAE+Cc77qecXGaUjngH3SnnDQzJOT+SrjsCn9AD/ZCZLPyFD/FhJsg/4UbW3lW4f6bIqD2Yhzpx LKeeSpx624pWbBXF6mx3LteujY5739w7iWxxtLuI1OCnkJuCtx3+xGcD/Wk8hA9+Y4qNDGItq4QX CnBFRw2vdrv8xHo8/JhBF6VDD+hpHgI/gglXZwh51k8nys8moNPTWG8lweelnA+aNx8jkdZn0mNw Dz/wYUdE4e0ko5GZhzjQvewDo9QjxGAxmVnwGczkZ0EhDpEHKVtf8QGm22oXw0thNEN6u6SSNfmK UZK2leRDheANuxZJqHao+ej8LlUi3Oz1doYXUciPyK+akZnQQo/ApxV368590wQo8FOoXeZ/Ly11 L8PBiE//Eh1w4txDMaBJ1tMibEAJLqowphoD66ZuJYU9uyac4veQEfmJaodzFxdSuHsfHAdgZzz8 MBLPpD49U+UHDtIOUadAQhh3cOWedtSrfBKH/wQrCpln5iZBOBQKTkq4SrnorEjox2zVR2HmSllq r75xgTP5XQRsP0AkxBDkF0+qpnIp49kXkm9ns3HkDAFnnzgpwwisn6vsVH6lPFse9yx/4u9Zf9aL MGMqApHXwea1qOQ7xa3dFRbciW3bqxo1dohZsp1qFh7biMXenQF4b+9n4S/ul9JkY5bLjjJJBbHP 49RL0m2v3G/blKocyvg+aL1/6zeH8T/jk0IjETM2v/7mDjL1rVewhBqZs9RFQW/xPiofRKHqtO0W Bf688c1P7q/sNznQS7m3KxfzCLI3z7Mk3TzoT3xvrMk3XwK2dCW/jJhG6g4jPQW0aLk4UCqnfJ4s fT7JlPh5ghjPrOGKX6KZ5+Hq84Bp0fibY/13d3EkDomOkfOQftt+jIRIX+f1U/PlrnWu2pHNDZxj J3xQuRFq5/QN/eP7Qfg0GtUgO/R4ftGBRc/9CTUaOIpEZqGByoiVKuFaU9jU47TcgHYx5jqporXB 1vjNz//UvPA1D2yfmtc5KAxdO3BTBqPGzv/x/SAf+G6M4qRiB/Lo7RfNKsmIg3xeInhkDS7ZP/1c LM0lc1IPE3Y+6qKgCAD938wgP+lxhg6pxak15hX8mOvkXEvJuAbauco8on0ha1Ydvg== S+GdD8s9AXlyl7oiPXxjdcOslvuhmWS8RdzDRnM3tWsOOABNUuklemBjEv2qj5JZ0tjgp4Qlo4Th zPHKZydjpvGmL3qYnsgiKd85vAvJq/nVu3BjOiCqH5ebDDJxs0k+Clk0EEY+9PQdJBnDHjFsoz82 rqWURmHbhxmvoir52JwwUiJBhfSW85IuQl3AjEQ5lZtxcorWXlGYDxCxsx21G6thvv7s4bk+z7VO N105x3qJMFL6zV6VoZkSZSeGwzOXhDaZjY0dUX6X+9R8bXjFtk73IZmj52fjvCeL4LwUUdWMZ2YS exSm8Zy3EY17D0sQ335XmO1DTRZU9mzlsa3poXrcN99fAjOmQmqni/9F86C4oHI4bl7U9EQY4Ub0 +zxBD/btuPmD8Pjt/li6MSJVFikNsQeNWruaKF+DrvCb/f30SO6di8V/UMF9K5wzKUdLlra+mRy2 1qcKxFcCEcRZd8m/Yqt62lUDOAHKdaJ5AF2ehDr5XQPT8lARzwcoFN2EkFqwz1JpRzl5H+AQ/AbU pf/YpPoP+i2cK7/zS6wEo31zYzxMjpgvS/RZ/IIZ+SKGO9w9yKVREtf0zSA5+pdhODqJt+7XbWbh L4ID023oGS1B5B5Ginh8inC+mXS81nLBEpzU6xfMbKBWosvoex8lxRoIcZ/nFmw3UeGf34+bP8jG 4gsy42Y53YNC6N8OE+aZ6uRgSn8ZIa7oebg4Ft5/7qee/5cHzXmwSUXCrG7UgYNA0H+uS+B85X1/ dx/fvdZ/RtCFVjBLdy60QpxJdNN4bidwxt+GeREnY2MEAN2zozszHp+H5k9uyrYZ4iVdsC28yCPd +yPqpPFk1mSrZIYeqZ8cIOj3RyoF249F6W/oNPhmBnwpJZDqr//QAiTzC2akmkZTDdRoYUMCZ7Qk Ui5MKlnL705eWrTWjUqqdlcsQlPXJVsFr8SNV3bzkPtgQPAGA0SmykZFXCs5sFF5Z5zrgPnSFgLV 1KiZ1DqRv40JkFnXnljWAxVvb0bmI7Vyf/dyDmOpkfusPZcQHxnX8WvxLfvapHhpPmlFt1plo4Rn boI+dbi8kmwe1A7Q1vMd8A56YN7xvrFketS8v10EjB1E+jtQK//FW6vu5RkG7rnUnCqMC6SC/sA2 jckiq/K0TQ1SnIeJdrs03/iXCXDdNhW4VzQy/6JfLIgRD14TKRIZL3UPSr9IqZ+mbbup8X0lGt4d nCViVSoKtYsA0PMo304sZ6xWmr0Ui/zm1+jdLHZVhi6UmHcDe/910OvhiLTd66X8tQSBjYw6yCdy 0at/cxMwT1KegsAujOTmGSli9WUGP+XUPOkYl0qnRilVC10gY/FUJqZ7Ya7YVX2U+HO2ZPoUZAi6 TpEqefWMkt5nQNrS51J69ODzF8zpaorSyM2SeUfrrOswTOKTwUb6Nip/rl+0z5b8+EVrIzUw5ZFq v7l6o6HEjUs4cvItfrk20iQxqsi1IrH0PoE/cmKfB46ZDYnCb7b7hHIH+agZj9Qk/tpX6GHmzHBU 9EeGqIhoAp6RmiDsnNih54s5NNIoodnu2wfxz3/6uz/9F//6v93/y3/z13/8N//hP/2f/9v/+A// 8T/+03/4axj/zT/9r//7Xz+Z/8u/++tf/+HXP/3jn93655f5z/W/+lP5879+/e/f/ec//afX/3v+ XPz//t3/9fqX/+71D//Hy/Sf/9z//N//+d//z+XP/2hX/k8+c99Ih9UTYru0W4nQEdaPz9a+khsG oidvFv3lX1+/8z/8yZOXr4/lz/YPdssWvW7rS9A0/wE/sov4ywjHs58ebLdlF42rw5DCgXnGa5I7 sVv+yvjE2W5RM8e9xZb79vs4WOpWpfQEZP0XzWrDSHX3aj7RYfOBHdYf3w/CLhErnpLgzWuBv2Bu 4xBeCxBYTRWlI+byannSggGS1K8ehu82j8HeiGqlu4mm8MZGiupJI1jZBdacOgDZwA1KivfpsqHj Ea3ejkDgF8yrNfZPI13ejHqRPaAeFcSV1ATbF47MzINvRZ0xZhQNPRxPMy4SZlJLyayzcpMiYUl7 LtA3m9be7yBv7fPAvLPWuMeQ+ua63aWE8m8n9tnKBZECO9DS+QVzEy+Fawp+wNx7o7YFu26qOrYX O9daVS/QCl3s7AV68B3rJVtpnxQWbA59n1e28qAc6Y33z9aEcx9P6KY3NXFstnLaLIooUIE9fh/3 p55Q34LsL4ZFv//B13ajPTuKB27s+DrI1mV3uNiynXwvdm0hX8tuesRTTCWTK+htYjljHu6RBOeE X64djw20iNsq1AlByWC78jDtLxZIW0Gbxycx0La0l1QXaPz6+z+1+cwzAeHzI5GbD5q8DfUoOKVt CJ2sGkmR4FsV+S9Ij9UskUdmD0Aj3n8t+/USguVhFxv2XHQhluEc7Pkb4t4k57UZJ5fKeNi0aw17 lZ+YF5PYsMeofzOr7nMQbwxr9e8Tyxl/+UHOGD0pXi1hSdeuPnIFAH9p/eIC8C6v39yIPrJBPZJx 5tIS6pEa93W8tzrgnkWqF+8y/fh+EO4582KidAreGN0YoNjpbliuD1z8cohAGOAV04/vx8jBT2ef tjce/oJZkkBQbi1tSYRyhSuKv98ULUkS+WZ0DWr/blGsas49r1Z1DpqNEVuIoOYt7oTthbCkD/pQ s4u0pu83wJey9B+wZn7BvLvIQJAraeviAYBa0N+Y2mpcdqCUbFk+sDgr0MXvE+DMrN8gaTF31Qsd XVsk91nD8cq3hqvRRvQQxjcyialrQ83EO0DDHzQ/Q2YN8Yq7yHkEOuj3ieWM5+CG6hjlX3/7B628 yY8H3aqml9bI1xWJdjeqMXZO8Bv5peTRIDdOc1rO+Tbol3nlhHOz93QBJ0zSHAn/+V2XPJp2/d2j 4LVknNGp4KNiamTSeZ/B1VwL7aHzl2s3ZXXuRMIMGxzy/EfI8OZqoNjnVT6KVumD3YOgMLv2HBIH gdH86+//oSfWHpaXfd/Vptm6KImyq5pL+2QXuEUW/DWi3ezKwp07aQHff+0jX9zpZDCa17fxdj2u 7geu8XPYrfk+yIf2hHrop3nignsC40ZC5e3jlwSdXrR95mQMSvSNbxQKWELvzscshRQv53BLefaR kRBOMw9KV63ZuX0UfaGjak/6cgM/tY9THWMHETv38YF3Yh/Ywo75Gu7r52UQpE71LLVNmPkhecy1 5fLx7vBlv50AZ3ZujSK1OznWVHgEgIDa+RT6YXM+6mHZQZ73EwOsRWWt+9pFTnAnX6NRH22+treJ 5Sp5BumzHSDCZ8lqU/LBtSlWlh3HD4y6t111KBrhB73rPRfXVJIhQxvyb6wTtr27sANXRKFy2jm0 fbkBvgtjRJcaqp1Yv2gGBYxyRWZMfUoS+LUd1MphFKOcmU+mhXC0W4qJBGPsR3ufQS7gsVMGquVD TzeanGxmXPKYgZcz40zmR8VQVnhZ+EF2b7ixsN0YSMD3GfyLU3u9Q54blV/BauQiJHHi75fDyw3k Z8QvYF4Ehcyo/I2Pc/AxTHJ5zCtynUXT+v7WuhPzsQ5R1AVfyDLrpZ/ObwtiItY9FM1AjvmovHCR grKpsdSbpSYu7VMsdkBT/41v+5AbgyivT0aIw5ee2rTnIipwNAyZyxUBnkAQ7WCkWLCxEaIEqRr/ HpxXV9jkaJoFbgA2RDtaceIozD7TLvFs5z7kpa9nBRtZPLylfKCRIlWc3t/AB81RgRgCWBSvmbL8 xxaC9zeb+3HRAnGMJPeAUxmaOn74g1cfZoMWSLa8S+XRGoNfcS412exvcKQfVznboc04RD/GeO63 23RR6smBkR/f38aH9rjXYcm9kzQibYsi6gRkKozkLD5Em8QOJdLNZ2iHe0VwWL1EljZTWK8M2ejx WDD6yfngAHQosnPZYokyuaSZb9kibbI7I0NUczgTX9BTeFBQ4GcHKejfdFPIqHWd5VsA7msP+f0u X5h3H8GP5zbGm6Qfs+dyGMN7Jzj//lFi78pc3OYJWkI38gjzbezvee1kuockf2Ycj2KZ2vVupPEt OgA3K7aYQ7/FBzPn1n3phwwhm49AFQm6Pvv6HJyf7H0Z5s/3TtnthXZsu3Qy1rhezG8m8JorjwLy JG1FD1fa7u0J5gC6lufDlsr6l1fw7Vv8dqOw7YE3IT9mX3yCvpS/+0CvtM1hn6Yj8RmB4AA381Dq 5yHRKhsT3bhxoc+AkRGYt0YRHYIZdyMtLLOwbxPIme3TsPGnYJCZ4zwZ6p7wvNgh9YbcJovkslNZ e2NngujzAKhu2Y+NHOD7exvPYEMvV16nBKGz0pBJC26UZfdWpuBmY5OwV/MU3VWdidxUxhVLriFb J8XTTA6soQJ8CZBgGIHG9Pzk4LS+PNjb5RrIkV05LxG02AlcyHvZnKaC97GIonHffOHqKm6adJts JuT4moy1Paxe8qU+z+KKaTaT0anc9SmmKcTCujOh/enizXob5ENO2ZS27lS1xsyN21R9CLQ2B6Lz G/PUwcf3g2D0bSjR8M1aUKgHkZ14CYwcv1KU5WUuY8BMYZk9mPw34wj37H1cqu41Jm/tP3TC+80M tEsLEPcHzPAXDDAEkcGmruqm0tr7sEnX8npV3PhUtJsptrsDahtGhiN2FJOkvE9ucM8QubN5ZEwc jmjt5rA6AEFrMotQ1fZqN5UuvsyLrchGpLzgAnq38i+aKykPpI3ZYmGFu3ixxC564Wzucmshtox8 2KsGrWo2qP8AtSgX/xlJy3lWA1TfSf8w6CB+ny1B7zeQd4by5wC1Ne8MZRDHZC0kxo03NXwRQ1Vh izDe1N0BXuL2/T5udmacxZVyVH2yRsw9gR6SUpi1swaFn1vZLAQVRINAUZ38bVSGT1vEh3duw1Nd hfEpehNdQmkpnxPpXXdGFckWPvq+bylBnAE9RU3SWXyfwU995skFnGWb3a8oGdB+MzIcPqKAM2Nh 9vGRMJeNK95xVlbN2ESVT13gtxnwqZ2roOg3/QvmPTe/JNB5mLEp/kfUaCfQKffe9hMDMGG/tU14 zZxZCC/7/Y3HbtdWla8Of2zKY6zIwr7fAmFJi929to0+yF+6GTRfLVxfGBexkfCd3RgNTmack2Dr xY3Kt+fBSycvRZD7zQQumFBnVbWSNc7MLxeEgdET/arVIOqZ3600jkZyeetLI0wIH21G5f73W3HN LsIZfZ4AUs/duuUnUzQsUb+sU0lRIIL8UsFAGgg+3v7+57ejfujXXvs1vBOP4vlzyMM5b0zlz11S DcjGdMnLuv8gaTdjRDyb1xZO7XWYsdK6kDJ4m8EfYlH0Nx77KJv5zLrIwBD9gGEblbZB0kY6eTD+ 5N83/T3yTMG3yGtXFwnjp9//qUeWbrzXkvSGlCMfyIB1Y9omJGggdWNGlfm7ND7MPLqu3bw2vzf2 x7/PIKc2izjXn5JTG8qqkq/fjIVZB6pgd+uC4ByShtXMnUGps7rzWoHUGv/+ywQ4sw== rnruTni+S67mfoTWTFurS2A90CH//qHtKqrEwTu7YXlavL/5LBYT1r12rsjTGSuShfD9Bv4QKhSJ uOH9tgKFgkd0VHKyuPGZOL2JFzRj9Rszo1q7DOk5YfX6N4xImdUbVPr598kV1IWabyGn8EvmMmh+ KL1Q5wQEneSEUx00o11s+37t4rXtIc1TXXFnjZ3gUyQlbitP/v3neSXXFcSzB9jhOeFZHzwJstvO jBWb2j9//4N9i5xFKmPvP+ds0f9Jst+GI6h0syfFHfZWKrMKybJdDXnHtSSd2nbOxwbUAxMSLoOr RcNbIyvT9vQ2XTiAfLakPNkYwL7h5zx41qOFEpqNujtg3tSg3uILMpfOGhU4AOiJfLZ0OE/iYLqo Fq0T+EzeGXZGI/jQbCe76MKD3DhsWSU0b1EnMNrw3MgncEoSp0Cw3R0Ate9GTnH07Dew873iwapT x3t6nwO3lgKfRwhzc1bZcWHf0cQSdEUKNuivWoCKTyVO78XnbTE7YkZkpJsUisz4HDyspAM95mUu vLCKNNkxp2BgBaNjwIykYGuRLtHEBr9ZcrbbAJ3rF66KX7kWZuAdDaQuYL9NCzgqGRFGLgR2TFsv 5ODDIfXAMERk41vkWrYB8DE0VR2PoWsaVp2DbsLY+sNRuzgVTLi5cy0jYWr9PpFwHU18Vmcyg+kc r9edgVPZX+WTvBCj83lV3hczX+0mofCeI7xdNMs6K0RgNjzMWrqvyH9Ym4xyqMayEvwcZkbayhqc BsNxz06EEfhQj9EvGoxSuCG2g7YNFS1tADT6WGWdO4fjNfj3oD3xDbWwx2pdGQjvBacZJTWbrpBS 1smE51hDoTGufe2QWKNMdzjpB/3060U4DgWPzIFjpB4pUay7tkvrSRlaTeRYOtLssq+EwLhzyCbp iRSQN2w6z/dXfYiPt3Wn13PoN9gCieDRO3O0bhFHmREifn4gdJ7ERX5kI2AoiFY21zj5nKAAhsB4 JysMZN58X2K/0HpiW61BIh4XrsM+KqlFmRnoL3uRD5pvKiXdfQ/dbLdnobFlrcT5dgKXzn0tBihj ctUEpsyMGVctNjxVYWxasIeyM79NDlB2w9/nmQmxcKf1qNz+pDoUfczsOhP63DvzkYXVIeL9OIfN ZI41ZJ8QP33P3f+BAaC562qbPR7tvTOjsGNGFJL9wW42iJlIZeEAiAGdWuDhS2hsVEKya/h9y3MD fMBebSzuuAF6DU5Y8L3nhvnjy68h4oBBBzcZZDuCBWEhJQaaSMw/mjwtgiHjUae8ovujaP/vzLly L+AAyNDatdl8bzxXXF1wMXzczeQVYHpmRMA7GnmMf0RDPYLKys/ejC3Kc/bVyQZCVrqI/HuwxniT XiE1AmKbaxmaGGyjd7hRYHCaAG706K8ukwpv5hs+g0bu/o+0PowU4al8rPNgCXmedPC9NNiQE/r0 WhdFK/yYiK4r+/ncdetD4z6cfe1bf9/6Jm9hBIJO1FC39qbo7ypWGC5YQE5xHwNs8ob5W/UrD5sb 7Oe50m0jJ+mniit27euRI0Q+52HnNrUHq9omj+Un+K3Sh/H+cTWkin7G2oyfvpnQnJiCKWdMNZQG 78FTmJbjNvgTAwADZu8aXBXW9b05APB/Zlx9MaR6GhudjZOQ15IYw5rBB7dir/aF8bXTc/2S19XN UeL2Hyts7bb9ka/hBFu/d8ltrhduDtbPPx5tOCN77w4cMQQ+ZEZAjdq9iHg2Q0yvCupMZQOpgwF5 xRh2XvHXTMKFKemCBnpny5694haMcMhp8E1KLcxtMAJkwPqs60ACssiMLIi11Fx28+IEIOjnoz7K d6Ox97HmSS7bzVjezOi0ogPxAfN+Foew6miYrfFqMKyshTc8FVoBlmBX8sNvsR3+xABtHgzQsGwO 0xn0uSzTZ3wSle+cup1mBk7yfmeHnUW2GNGi+jJu+c4X48RRt28jIaONWvSZgaTYZyB3dk+S1dRy +dl2prEDc8gdRSvDU50r9fZ9zdjkxtVguoxhm1yTyv6xMDM8q3q2tVFmyzMa4dvUpoprvc612lXB qc4/hb9/GufVohm7ZsxXI1WTuVmeKpDbtdZHP/njsIw0uxmXvv5GwKGbcd4/zJg9dSoMKySAMyOJ Sk40bccAk8QCrKB+wEys0NHBai2CDyHMO1Ju3hfaqTZbswW0x36W137Q3AkRm5HVMWOTKCpZFn+b zMaycTwxHpgRHxHhxUO4dvGc7JS4t1XzLHbR9KDL9NW8KUKJNrBQDyJ2SDTj/qU3JskBzvVr9WSA DnfjIo4b+gLYgJTPP49+rCqV6ERy3OskQqljz7bFRcS3yP59E0Xz3Ilnj2srxZyQH8e+ymqSCI5e O3bdCXTFh/56tpsIAqzwxzbDg79HozMOhyO+tK5rW+eTYTu9HyMLL6EQbeHUNHtgXDQR2VHmlcZ4 3qGWFWeWQL27dh17gOrZj3VRl5Ak6lC4z0/jte9PhCd30pOL8Mb+kdD2wLf4wd1Yf9kUAvaTH7Xm E3364TqsxRcD4I27JJ1SXVdkZ31IAnEEssO8L0QVdgf4aMxP69Qs9hD7DziUa7L6J/6u17UPu2o3 w7X5+moO14vOvDLpK9mj7Zsx0IgYIdZMOVvm0QnnBrrajUVGNKaHkYuuVYYmwyR8WZgkFZqTXQqh 1+lBv86mzfVdM7RYydLXwbDahfKVyJvHBRI8P3I+LOTCDmgh/LxCiyqp1pOhIIkVdvS7xszgk9zT 7ZfkuJNV8dfy2wH6KPLthEpeASYgVPbWM+Iw3gtCIp/KfP2Z3Nu54Wdmv59skImokX9/cSlZWotP 16WSPxCnk1UWHXI/PFNA5Ft2rZytJp0T3RDMwYy6uUzRgHyWsY/znQEzfhbZfWxnTnqXJfejBHZW qaRGoBHTU70wp+4fBBJZkxw7pYvncpGlzpHSmJXtlTwaqL58cmM+4TIzw4Z8bwfvs2iBcMhaA9zD BGiWVYFetBxwI9pVLamWBC48MfyVMzPMziMqzARDK7t+yryYwpsWEtDtltl++KGz5cIZvbmBOYsW 8+UJOCuEKh3jWiVY2+EjyM1rWyPae5/gWo3tZ18Fhr2KVkw0P21zFrlVraK/b/xqsqXPqgbCPzD9 us/lNhDFZlUL0MaisP0TJZKl15i9rHupEe5cADQzA/KdqL1tLHnnC/ZgD9X1TnAqx88ZpQVfj0sy /gj8VZU/gHr570EcpCfOJ777hXZD1s2NjTecAtq7xwKKIu3AjzW17h6hurfFqNqR9InsKgT4IYWn GVmbTJ7ubed+o6eVyqlV6JIjXMd+rnYngVOeq5FF2Mdtmo1HJdPDSylUvRmbmzEbc1vRIyhMuVxf kw0QWXDvSd7Ubm2Q69npDfgAQpsIWudCeATdAt+7nR6NAEIpEuwi8s/sJ1rnFomBELGRAJMsKstq 61z9hY53pexE2fyaCAZeVvAWGI2K6RlRWmCFUffVEOFTiVEXAfgXZ8ZaRGh2Mn+aMgR6C22PODsF I17+OJsvpDK6Js9yuzpKaCZZ8cjNApTDBCfkxQONFOYahSbbEYoEWIaoIg57XUwzYy9dOihvgSSR GQUGMT2Uk+2Y8S2ZfEtXU0qEY2ZM/E3WmcwcqRv/cANCZgA5RVMjMj+OhXu413tASfQfeT/R4oIB FF1I0KWJ4axcNTwD9U16dZMS4vjX56EiODE6J2odRA7mfko9hqViZ0+ul3UTKtSEHj7au/dfUJxf VcJZKaK7KpGP/Fz+wARKYYsjeyXst7paepsmsNS5lq0OZq5Ez0rz/rlQEmR9WyoBM6rgAF1kAw2v 75Ho7NFaLWp03/frLxLoyl7alQSFB8KXK0Gp58KImFn0J+jUmIcNydwEwshmdqD5AkCwL3dtQ8ll TpZJrw3PpO8AnwEkLgYYStNKAsC19wLv1s+tdFU7nfFPolaEV8R3TQTD7EeuMPSd+nX4siQ7OzOM HQJwREYgZ+cfyxQWpJL+hwoqs7HNwQOgSRSwPhY/6VFLnPYNanORftJUXui+YTvkKJfMUuDLSJKq E93C8Wv3Kem+G649PGbhb00RyX/qCp/1IgRin/Z8xFZ75GnMR+f8zq6naTo+U948VNKLHI2dd1Wu OOm1zngD5QICSi7PeEsYnGolljs6Vy+BX0ukJoi6fNTGHpZeGzHXXaBbMUa7+WEfzTiV17ajfsij Ab4AvDlAzV7ESQGkWfQxb7aljCNyvx0q12FMkqXEfphZHA7k9rEBJlmOqKTzHW4c1yJ2yrb1kcmA 5NNxkU3tW/cMKElvzTmHM0hMHzmSzPiIIkXdJ34tH5h/+zCKs40ekP8Usfdu5AAZiHvQHsauKEWa 0dZxqAFYInq5ZRcY2aPgH1B8JU/JgZynifUWZp+yTXNM4st8eVUKwaJW3lNgx7SB26fEBQdgV+tW XX4kWdkRxuNlbHJuvfIVAwzd7s1KM1xnkssWQbAhglqiGiMmsgp3Y+9WAhjNjEbiFYCOGLfpkYOt 0oxVvT0rhCh/OBg0l52S+Ga2P8C4aHj3XgBi29kuO1wsmQPINfJOn6kWad2wZ+zlzEZ87fm78WWN 99+gv7de5VHHrQoZfad4/OseJwGUUzFRl4Pa0UoZfTTzojQazEyZGTqwPt1wh0zms6nFBM2ypm6p pn3fAuPnbuoTIYPHxTCEipAZ61LbpMKH3q/Wac9MfWBcigKn62PXdqbLUQl248NzwNMkHLcdnrGe A/+AuSoep0hu7xJXPmrEtwEUjfupxnHTUyYTsEFyO71fvrTGuq/vrCMRuW2xq5UyjobIHWSVoZ/m g3Jn9M2IA5BgfQu25EbFW5DudfSwmmLl03WgIj85kG7k0ke89R1amZcOXVoe/b2YpoShHl2sHZXb pZmrFsIWfHmzt4ztR7/HNGfLtBosDK3FDawhiDRjUwsUI4L+iaxtBjSx14spqx1Aj6vWPJoKOMBU 9y6R6F16V51yN2bri/0vTYwJTpCq/ECLeNHYUDtboAkVNIbVpoLH5HlhikWFITfDMhODkgtLBb9u SBR6aZ7q4gBnMZL2UuDHn3i/dL/gDNjTOhyW3UwO/aeyu3Mb/oG/35N+1iv67XyyAOsU8SCasdKL z8ycPdn6yIvmptrb9cDY4H4t4wwCDQEeW9coWXTxa9XrILR6v+gvARXwz7uQvDpxmA5CJ2fCYbOw QdsLu9Cutgj0pzsTAj6lLs37R4gj2+TYgGhU+cFr001weyJDS3I9EyCvlOgVRM527y5qc7SR2+4t xgQKbtnuPZi1zfjefmsywwvxnjAzS1J0apvq8aTULMk0bKcPUk/n7955YwiovXCE7eC1pRexhR50 lgxR4p37G59SCdoxX9xZ8EjaW5zA/K9wcmMlPTpGlxDUJaA6PBtZRmFGhezRiFnoVtqX9fCJsc/S Hf3G7PlUE9Zi5b+Qd9jP8cGaM6XbPCcqTXGerKIpMKfEisAcgHQYNb+bc0FZHQ0Sxg== J5GhpID2NrBo0neU2aArMVSLJ/udu4JtcwZNf58iwvShu9NOPJxVYRtZIirQOIlrKxnf2fNoJ6za gKJUWrq8de/9oYtWYiMPKyDknmoe8/MT/KbhJ6xIGtvLQhbVIWAsCIL2bojOktLV8fcGtOQmR+or b+rgpBgvWQ6XOCKhDooDX4TGAx1RQFnw/AviuMBcEs61d04gJakOdnSDsmgANng5SIdojC3nzMCk 66jpNLYSb7KbWK/sQnA47wAiUsll//vCDhdA3Q03WwdRIkjpmbERlCOgipnrIgqo4TMmcjfe61Np TA3zzGs6SHfjKxwMrbqoY5M02CKNznL9Em/LKy5BPcIZAwZCGDgQjkdh+EG+A6CV+ftoPjIgFYOw QbIeRylmXNQIuVK13mOopkfIwGoKqNrkwQzjOCMUzFPPjMwALXAw2UIKaeSGXsm179FhhASO2Zbx DOHv5cSYGVDLSligGWfIVSVW0UdtrA4SVWmBZH7HdEPHvvZCPa7NGrG3CnT9fbbjbGk9mnkIy80l u9TY3XT+m3E8X1Ue7Nc8tI83VkkvMCwRQcyVAtwtD6ApLzQ2KRMdfaeVYA4YW08gX+GjZn8HiHSH 0AkO75pVAwx9Ikz62VMUVwflhV/GOhl3+xfGJ7YOv4VCeSYzZ5FzVZk3k0teUmZaBQwtBLSF8XXu zmuBfcnL2AJDfs7yMs/gp3v2l7TKeK7IMDJWNAek3I2FIHGSz83ngmNDtyGu5f5p/h+pgOdzfTxU VH4ZoVtm4z4aF6TKjsel1zQt1S18J7bVWS8w6QM2QbuysrtUeDZPRzbCmYWrN3MPPVAbF9RIdm0h erg8MrKI/1zemKVJ5c5tPrGqOlINjnVcqdX8FOVZlb9FR2LYoGvp77HBNivFfVztgn+esHYyJdi1 D3rZ8O9gTfSfVqq90fW3LwFer2WvN5GSrLb9rjuxCY5XlSOxAQ4L7dzQLKW9yBxdB3utLNWu3qHn IXm5mfGJVnHiziFetBoCyzAOekGH9VH7+8l+0Nc2Fw91kuPLVizaaueyg0NXMjM2l/C5NfpYPmB+ TbTTESscYm85UhWrxejneYonZsTMhR8oe6XmZqbpOm7mUlBUQ0pL1ZFKr4vsDHOrI7uJsXgacmBr i6CDNbfa+eyjwyu73VZmIqaTHrK1ojX9PTsMqwrtE+iLuBTlyXlyEV7h4jzBU4oPcbG89Pof9wc8 QzN2QVCJvzTzmergehqLvO7vse8PABUzdm0bKOY9RIc5oHku1O3KxQBCaVabgsDP7DyyO6hyRRTY mfnRrhFevv09KD0eMhfZwxoU2FK/hl26AmAzniywPixo2zICEMRqgVXYbTkdq+qoqeFhfcAMHAc/ XZoPuB5qdKuSB6Vk70+QqHs1Nr/yId4VYeudifkP/H1ViwarG34tm4pZOH4aWxlyddtfN373gLBe ReZRxeJnxkGcuUe7HKAd9sWp+mujLuwRjOp+w1sjwIczFwYd2qrMh5vXRN6ZSjiPDyqogKrSQ7qd Xn5ujH8KoAZVu1EJN55/z26YIj5fM4pIn6W43xLnLGjcFvHRmTFI4pyjKr55/yUSV3nMxifYlWVa j1ZFOwRQ8JCzx7rpTBak/76j4wkzKL/tacW+ufq17dW1iBL4Qs9DSMJrBWkvIsjJAQzy2vB5Lmlt RjAXj2AQGOyxGBPvZu40C+ow/iJ3GD7jso7cguXmQj78c4rBqYl6TXFDPQp01rxO6cx3r2WtE9xJ 0KtsaBN1GtCrsSvVBJ7Mjktc994eiv1hkSuRXzyMiMHvdv21SCFhR0djI+nLzE6BJk5wg9E8CnaQ x7ABRIXlFKUx7ja4Ej1vQJzWlsxdkw70skw/u6XFwroOddpHUx5hbSI2rMM++jXsSnShtiVkTVLD NvlfBjlSy0sfhEdlz03uQ4ZuWuzVYM5pF72CrvVu8KjDdtNHitdm1okMfrUw5xkFbITDttjhw4fi YDB5wTr69nN17XbEfy9j0iH0kB0zIxvgWvQ1xgD1WkbMAxhIbW/cw2wy8hH0y7/3ceOQsS4E8ClU hYXoRQwjSjEeheffn17u6O0D89razvnCzBjE6zYsYK+7kcHRD7+m+2KqtVEm0IwDrfHtL3ywUsDx Y4te9G4idMDhT0I4nhxVBS3/LWbuNrzm3aKiCQ9qaVggku1S7JvbSilkDeDn+c5IxwGmmPG8Rhnz sv5SfTP8aLd1kHDRCUp6k41UQFGNn4JfgjRxv2HR47CZZSF7ol/LpnJmsfcgQ6nvBY1P4bVLFm6e emBD0VDXqb5ndJP4ABljvczcJpvKGWYsJEZjpdyQrE3UC9K82lPymC1EFD5oxk30nNhm+cY+EZz2 e4v6LjTMYtitftYufu+9VTXokdj94bBbcmj2bBH45rcE0p1rcZs4HOLle+FFUkrjnTbF+GgKOFUq NUs8+wFGFc9L8wkhffL6KrcIJ8jhY5964I19CyG99c4yVB5PtgMsdnse0EB//X0S81XtVzXoLn/B nAnZ2kkOmK6fGAcr8RijRoM9PZ+Gh5auug16OC/GjO8TIG3SuKAiom/OukgHhTqNhE5QPdSN0l0Q xLtbOpFwX3LsWg2+sczon/53E7CJgSHHKjGiqDOUFCdXK4dRut611NUOcjg2VTowY5Wz2icuaxpZ meZ23MWi2kG0xwGQ1LTaA0sehgQg+Kt0/v3nG8ilGpLwRIxKHMC7ZRaRdFCq836dzoIQ4NtmRGt4 F8X1N6PaT/6rv6NLq+S5g7tID4nmpUwzL+zIW6HOj78VgHSlpIihdiODKlL1vE/g4pHUEZn8s24m 4x4rO2YcdJPQ2PYbvp/7syU26gjrakasnu8YJ7+dFpik7F8f7kEPJbGLZ3JJpIElYDYwXuQx//sy ROnyw4nr8SYlCjUjHn6fAL9no+0gJq5KiafXC6LgFX4V0jdRQOgWd6MgLeK3f4MDsxD+CH7WILnX tQn6HDjol3mlRsZJ2WtL5Igf/2HqD3xfzZB7h4UyeHJmLGJITaG6HQ30WwzOorHvC2UWYuiMXx99 3Y/qJO/z4hO2M4KfXUr8mbkz4Ixub8c/PKQ+LguopecWozyMq8y8hGmFRoYZD6H1pdCWINHPf68e RlbxHIChtrVnEsHx5QbyzhJG4n2YvDOc7v2oS8MQH12tMtwuiyjvT2hvx9SK7chC93feRpnE0aOP /JsZJLtfE9RzURDLQFKD5H7CfFirHvsV0S3oxkYQm3OaECSF1I8rMRdu5NlCUwgK+DqBfGYgeLVl Itmz/kTHgb84Txl+cJEc5gSKvsK3MZI7c8xCvnHJePfGbiDWIIU+QQBVDAVCvNPzkDR9sRDfrmrl UsGhN2XeSsL/bA7k2ZxViK/P80p6yC8Dc/d5bb9q0COyhhRaJdTgYKykMp9Cgfu1LLoSd9qrwABF cd13d6Z98WGKwrMGnBnaUP0rn0P7IjuHn6uk8z4IX9SSuw9meRITk5OsBFT+g2YQpRSVNAPCyE2I GBtvq6IxsYhL3I25i7m8KR/SJrjvbWJ8HlOUcaih/IIZTTcOhRAoZx5W04DXN0jP5Pao4M+si0nx +gnU+fnH8rmxmo7c5S+aD1lrCGPvkjIyNwMRd79LBhf28K5PiIU4SYGr6ETfJkBWc4vQmBX1Q/AX zE0JwHZOwoebEpOeNfv4fhAyURqTLatQHvTF6Cec7QiZgMU2QLwiQdLwWYFzJGnZvjDmYsKqrKIZ 6y1/7ML/l4fVhxISRZhYVXnsCUSVs7Y/Cn8Svv/5Fn7q3r6MzHujh0aw1zgUq7sKkfYM5HkmUstR +QyozxL8/rXTf62mfnNnwcg8Lzymg/Z+wdwfCa9bkZGcGannsclu980gHxr9FRgKICa+58kKhZ0b Z5E5g6rTBBTYhdkY3KIM4X8tp4BsPu+/RA7yIgxHj0PnF83IkfToFVFiDnw6PWpKYUSIZsaC3Mlz 5bqcvPjn9z9HyYPkcuxBPEPJA6KHuoPSqHjAsn6Lcs/H92Nw8KOES49U9y+YSXHUhbLcW0mFzpqy 9Q6LhFRMIr/5+0Osa/LafTOB/19k6/v/Z9n6KY61fkvKjthp0/zxxYwD4ePLIL8xa5D/V0L2zl4z Cd9xiP0vrX/HWmlNJ8sb8FP3r1dqJMPceJpgP4svhaET4Gbf/HjqnTyTB4znj6l3UlGPbKL5btCA i2uByW3eAs/kqYhvTYasHNZeqX53yA4wqiRqXPFsi9auJuA5s4HUQ3AfLumoKmH/yXbk2wg9Wp9j 3HKoLIZ5CboiunVzdFk9Fdn/UMWjXieLmz9RHv1AJoYlKkWKRjxDdrp6hDMdljzQG57Mj2T91kkN w0hvsUKgO3yI0pilYPLUjPkQUITvM6gpYgLlguryaLtIB8NlEbH0Exl3cxUqTxt2/vQd2hc76nQz AbSJyGGS0puAhnIiQ87K4cTyxnZAW3CyRT7DG7xJ36nWNpMg4eIoklwcihxHSnaYsX0hqPMBSlHG fucALUh57hTFI4Hy68R+qMnJXAQBoMz/Vsmi+WtiTkWYSlvAIl7cAq1V8ZajUsfuqbKYjiV5un8Y rOLTRbX/XpjN9aIBgaGv90TuPlPa4LguMr7vmpLlWRrXEmmzefjsLxi5l7kT0OEcVXIDxRpLyJcd utKiYG+xn5gqwrJ902s+n34thh0CU+Oh/QCOM8tHk4hPdCONdskrWtOb0lv0k/z04gtmOcMgoz3f JJMLhvnUi3iQRxiO4aH3NSLgMJTeJkFd1ka9TZF4ikOMcTqx9e6IRKfXqBfIwFy9Vpg6bHRsPUEe NgS85qwO4VDt3SbKr9DXJEKr/GWIF/EaALImLIBxAC8J4jMvHOA8ZBp8EJg6TJBpx0waT29H5wvD OWLGzm93B00vriQgwGA9HKA1nTlEYj3UBB8XSPDOm5YLT3iK+HCxT8xHoNlKkU6zdUFe1SQ/ayz1 GBWgylmvndI3xR9omdakBE01jOERiGg86touXQcOhHoMOFgnS/eozxpE8Knc/wq5TWwA/lafBP8R El//gtaU2e7tW8BrwyKer8gBh+7pg8HmZ83sjYzIj8DnZn5YXXrA1GDGyg/GAcp/j2vXQwJnQv0N z1e7VuyBbUgH7FFT38sMnh/GNrg22BeuA2jeh+gF8hsBKv58t05/xIUVYOqX7XWHrIAqPJwkSvP9 Jcj6DSF46tcnaERPRKzVWRJk2ObhB4O2jLnUnpQlY4cjfjrAOMCs5H50SDpRisnY2dADYT92iHqj 9qKNu+SzSMF2rqAa/XTiO0pRBQ84SIZnXEQDirnMUYqDviYLHnNfjKHow5lHmE6A9gQybCLBRi/T dOEk1glIXnAkVFYjc0Ys3hf8ygfMe/P46XNxCHrLLbklLJrmMVMTr3oiNo+VAPzmgmpfjPqIHcPl OnCsCghVLmJ9AWvA1LWj3stBmcpvQZ/Av0+FhUJcTLlO9qc3oieX2GCLXs3yVjSlCQ== JiGR5WFtmYokhj3ckh5ROskhiXxcRUqqRjqS/Kg9MjNGUFKJAqpAq76M7GVpwaPEcbOVgu/Grl0i 5k8ulL6J+mpSl7Frn0+YmzCexoUw0QC31CI6LlJdZ3mRbgOJpcwIQZQmyK9xvGy6PE3tEVZt7iLr haPrQEG6c6JzMWg1H7gn64V/BGqnh4f/A5BM0efzz0vjjuqoLaHsxiDFOkqEBp3TQUGXevVo244B Eg3mPILMP6D4Y9cWsrnTFzTjww8hMwcGyJscgHIWZhySnUiUnlchcQvirumWc+EqgDdqREeVRmY7 DaUXPa4DdEOE5DlVWEwM3R3rpj2ndK+NeviBOPhCkMBKr5zYcaN10lbt8nhhTIdHvLNuVrsEutUc vrfY9wLUtOHpBGfzyjkheXlcbqVVX+ae2htEsS51H2RV14wCbixpO6ytoLGzfma4xMaHyL7VtQR6 bhe+eaUAalO797Kz5uAewF/sRhFkL22eNi9ttLqDbbsQB4A7bjxeg970BY7dklJsiv1tAFHS6xZs AC05eUcGQHxq+7ISraFoch1wi9iX3ktSAy0QweCVs2hl5hafSJdAkgEb+7qfQhjLkyBCPloQhObX FEYQZjmfxiRa0gkkY9C+EvDY5eT2cdGpgSPBzEj9G0ubXHK9hnPt1IkaWCeqJ/j2Oye2txY4ycgO ZcT8bgXcBaXQDjkOwI0MSZkLFPJJRd/dJwGnciX3wSns4ETlIhltGThS393KzOxzxZGsDxngKQgd /MeQDTWfnmhe3ymJLWR3eYu4K4xFLp3I9ioJTO3BkLLeBxDClZhsA0fpywPdqmMmD5fMTsbDJLdv 1E0IFsN2b+FhPIO34J3CgjcewghBF+/Gh6JK3Ckdx8grj6AN20DHOltxuu+m3GNXW6+xM9aHJ5uA yrsTZuS3KyTkGl90QszoqGv8VP59ynDd0p+VRpJCGFxxE9PidWcOMCGthX2G4MY9Dk8RMV/W1rhm UTQ3jWKlgJwjhthGMpo3lS+NI1MeDsu5L+NAyNsvVjBDLO4+P09gCfrSRcWyl4L2+8DcqX/RItAM 45InI0Tvy6uf2j0z2W+btQSkqJ/6Sd5zaYD+0E11gqecwaNV3zkDb5+I54JQ3IyP4EZqzbPZFi5a pj4MA9m1JU7BHadw2Qm6MhjlFkK1b0I2n0L08LMqVeKYz+gXU4SZS9N3B/iwHQHCViEdsVG4guMm wPhRf2O/xMG3kV8+3NPQnGc1EwnnkQjEjPKqvfuH43bFGxe77DySaYWju0F9n2suUFvlksv2UI4T 44GVX94pV35P8m9GyUFJuqlA//1a0unmava8chjb4QbKbPcppEP59CpPuTxQHg02B3VOLqhR208p 7ZjcrD5fPhwPIjEDnVhscfYZ6IOUshZYKj55sMYSXOSSwQV+GS9AnnkjxMk9D931hZYMMzZW8Nij bcbd6PoILu1mHgKsvr2MfVBxkHRlx3Lg2lS1GM+jjuEmIjaXFmRS+MAVMKP8A99ANcAjkP4qOYBk hNH/btOq3KwzO3eeS/wBCUqbLBxzdEqEcRV5f11/PXWEEPlnRp3CfjTidxrdcnW5n0zZNYdjSHFb bp7vMjLnkaupbnn71wPM3MFKJbZHdPu5fR5v7rzDuzAyO3j3vpsQ45Kbh+D91CsjwCakU8Mzw9I+ QwNQSrxF+S1uLFOJ1zoEEiImFgK5p0lixlgimCd3Mw9XXzAclqU2mxkGuFw0BEeXFGR3zGIM2i91 FzBxGOH3UIcCv27xYnLj49/z22QKypQZ6yevLYyMQOA788+ztUqPdShL3wUyP9mzcPtBZoZz0qkC 48baubIhjm76hXDpexQZYwDHK/BhU+RvhfCuGzvStkYDv1mbd9r6GMAIBbiRkR2e3EUtXB8YlzS7 h9QLjXhPIF70d5pREkFsYzg7sk5fPq0tdOj1qvPSLnqU/5u9d4Gy9SoLBLm5hDwrPC4BkhCoPG4S IFXZz/+RgJDckIBUHibABBEulbp1k+rU41K3KuFiq72mZy07M2P3YmaCurR9YhtHxWl17DXa0m0j Ok4vFgo2AkK7UEdbgyMJEYghZPb32nv/5/zn1n/uo+qcyjm5Sc79zv73v5/f+1FXRF+Z/Aq7U6f4 ZRcz9EDZQiNBRRkwicyJX6rrGDnqpOYFtjWGR2BifUCrZAOSFQyaRjqZlUiUvBg2OsxDLcM6KmMS eq4pWWN8l1RezA6GZMTD0oc+8gWaK9Ep8cTHsBEpUYghkMzySb0tAFfSVKdyiJyTKQmGCHSCXpHC SAe+qKVfqXmmIiKJsTdYODEuLBrOqANN4WORSkrxBOciPZOSjjrWWHKxIgu0tOIh0uhW+G5Hycxm qMyijRiSlOdYELGImqYqVniLJVnQkSeW2BMrnEuVC10+27xwH2f+9y5V7MSKF7Vsr9RUCW3riCI4 DBtaoqqU+hU/eSqZIaIlpxfBWiAcyOLEaww7sOIDJLoAClqIV9SlsiFeBmt8Ic+XlINdZiAdCIvq pIYndlDLu4yK1fyk8p+jgDHpoIihf3EVi2ixcxh3x3VW4gR8rMAJBWVjiCDxgNjUO9szgSIqXF3K X411WuLNxcs6x2AxUMZLipONmqKi5KIj4AkhEklU3uPrajHHojOG9IsBtRWZnLxsrthdY+2Xgtye EIiBvQcGPw6p4WM+mlhpMEnxsRoBlrUpxdJQGKmA49lkBxJoXO0wZrlekhMor5ToRPEObYt4NuN5 C28ykbEUSyT2mxSLcjTK6JIT9XpYFTGmEohEkUZQRsnWVNJWyRRsxViuzJBBqhWmSgl7QlStpQM5 g7qQ+ouY/D2hh+M+XXvREHEEANWPlJbZDkBdR0HSzHBDYUbFO+hi+TGVsr450uVTB1W0ejoxXWCv VUQkgqUrsmLwCprUgeR7cZJzBUtDlioiEsswV4mwnooXqiryQC7WHgNgut22khl4Kwy3ibXSFKfD TbzpDFVs0sKWlD7CKjltRsRMLE0ZHezQrWuOwTFcW0vFKA5IgEmRAQ0rRiUloY5dipuFE/8zANZ8 qjnFIYKcYJYYDhjwSuwO/xYVa07yQmBJKyfHAbdNXlzXwnhIlbvsxazpAlBiBIqEvfLHuXYt1N2M +yvlSGFMRo5zKlsHYCeovuCQUIAmJr1Ipb6KFGrq46yK+K5UHQ4Leor3IpfuRmAs4sy4B+p/aeFm fZXWE5LxS7eRXGoOCaC7I0XQwD1E6IKTOnA6um47ytMs/UqKLqArwjhBnVAjKjChovCyeKLlSkG/ kdxp0dQD2BZye5zUstREqGm+XE5P61gr1ZHji3QgSTNcKlmpKXIoUjyCVRHTRWMFdhsFgJgjGcFR MmGVPL3L9rB5OgXnOYkSm6ECcZFPY7cDLH9aSXwxJRaghpY3ssyfl9rKjtAhAZ0V2iIlurWJXlV0 f+X5dOjYQoed1sIlctgjAH1ECtkBBydAOTKsnOTyq5UgK64FmmJ7XFbZWJtcZC+kjhsUdi2ibFsU As697IR3g54rcbSO4wVHGdE9xaTh2LYUPbkhjRAW/4tOeuxjgVX+bHSlS0cc3O1E8yBVd7WNhZhc rHynLSH1uI30vIsKoWzHXMbjYPk5AopSrXFkkp7cSY51ABY+Jm0Q5OGiLcyltFXYNm5ZrNTqorXZ pXq17AbOe+5M1kHEVIrrBvtYsDK7447MA1WULKQDVMEyTiemEnpNKt4qDctFxYOzRRpB4ZpqAmyr U0VnLn3sKDw6AakDn2lSpZIdFJaMTtJSQzLAtI8G93gKfCzsHq0KuFxWdPLsbYpv8i5Svio+73R8 nnL7ITDF6gqmBbY+Mg6xBK720QPIUdgrA50QMUFoABM0G0152K0WQosa+TkGc0pn2FrJ2Q7gOuZG wFwo3AWbkD2boKFkp5jX2K2e3pZSQTgMtYuVQNl1OzsyPoZkRT5Fe4nrRD4nnsNiVhZGyLjG4mc5 68JvjxEXsfQYgo0wheKur2MZJxyTjrOqo7wjiSiwbdQpRORdxPwrlgL9CIgZQukeiOMkgEWv48RR FYCVicEkcg+K7MZEHxUsxxqFRpdqtIqGnmk+ASWPkiOqJx0UWuJIYuVoUCHFRaykcLSkbHTE9crz HLGTY/oys584KrcOU+W74SgSWZ5XdUp2V0hb8aZ0ZHVnYDQxRJMILoxX0cRQ+7haYgFiZhtgVYzT SqioiOXOow8zjqoSxSbLK1Bj28q+GklRTKW3YxKfVFE382KQ+q4lJbLoxURlzFlppRYArnb0F2O3 FdiWxEWhXwJ1EHbLRwM+y2YA1CJeiwyhyywPbVZ+HCpjxaxR5P8LwDqaB+MxhvgtWddE0eqMVMea wHWutqfktABMlCdqQQEspkgn7rcANDqSuUpLB0kv5qNeDDqoRC/GNilsa2MUmKxLTemhCah0GkEy 53odR1BEF5mIzutMEx7rjOEIvPBhupB3icoxOgUgUIuhP1YPxdrjiXax5gPaqqj5YPxiVCwnblPI GtUpF28xTtCLddLj4WR6YHR00bEpZxKAnZVDwHmBsHR5FQ2LfBENxJiIs0RURgM4GaQ9UQNjpMyM t/EiG0OuLnTjhKAadBCOjoikdjAmRmNHL0JsGS+MjRy6yflIRFBSOj1xVhz2ifXUq+gazloeY2O+ ekuk4wB34EtJNRsDOLB19AdSlRRfTz7MbKRGYCETS4oeAEf3Ka5QidXXY8xumEyq8y5u4JgVRDqo o7dvYbgDl2XTYU98rDBeiqst+pFTBy7GPfFopfJ5ckKzlPEOiqcrEzPGGoE5FznpiBABbCWoDNVK cwxORxGlvQiOzskcDQRALm8oHt4ErEtJe187UbZAEXorSxbDlgGsvUQpcWFTAPoYFVYU0q3TEr6R FNLQbfSgYs9cWJqkW2NvWwByqVFxZJYOBFkbyU6QL2OMysChupi0WJUmdiA+MkYSPeMICkklXLAF AkbgJeAOhWPZX3G+NKKwgQG4mA3eWCPAQsIUnET84fMxriQGIzIPSUDHM3DR9m4yNZJxUlfex1zX eBi1OJNLXXvjoiSfReYh2As4e1mKH+PAFLwMSrY7GwHwFPIy9q0AoMSaGYqbYKTCW6Dj0bJ5el+W Co2VIm547ZS83msJyojeq9g2xguyowECC7m3nIoCsZSVdLVo/41I0ViJamMibDDPrQQESJQpzE9i CGOKQULA0m/MCwtgw469JiHFHBhPtyYdKgEj1xTAQodNwnQquuk3gKaWE6cj1wPgUq5idm1V9GrV SQrlsiR8DJjFgoobgjhisn9gW7J1cFbYMUmIpiUNKwBThmA0gwo/6GsJnGInH5Q/tNTxwJQ7MySD xtSg0f8JBU4v+A9tXXNRYpXbGPt1VBGIL0Mm8kpohhXnTWwbb57Y2LTLVpepECgYmBBrCokRvYWo y000x2kbbTbgEMFAk9XUiWXNUNPD3kBcJEU0MogcEOxqUaxJsgzNbhio2fN1voaiWA== M/Fl7B6CqkElgWocnY66RS94MkYwkIY0Vk4hb1sAYn0zApJvMeptY46T6PyEml8tmWtEgwVKbI5I 05LlDdXlxstquUI6SDk9dDKOQGEgyRKMIZkznAHN8ggSpgYjIbOvmph10re76HeiKfxkhiylXjI6 cUpmsL9Ktggdk3tDU0njp4mFEGuvyKJa/CzRMEwFPXARYreukEr1SYWmYmlqmIWYBFVeiIlZPbBX q4L3xiUDiYreS6BWLQtum+ozkUkSrfOc0l4ntE7OBJKhxUqetDoyelqyTJCDgqThRl8E8VuQEBtN 9ss5Bhec9hPmS461NRduo8GKS1DKFamzWuR1Kr6hY+bFuszujRRrBo8OjlbTWdrDADalnDAJKKqL qM5VyZ/BEwNBY43+nwAuK0m4JA4VAX0ZGYEuuFdPOnMEYgYv6YArzQKYfRTRAUcOqBTZqF0UDrQk amOwkiXXXJUkcwBqdhDTqVsfc9vZmBdYkx56YK/g4yXbmAoh1CZGqKes27XJKEs8HuAaJ4XCUvrZ OtpwtTAI4CpqCpkBF/OoQKUgFyGGOlcpYkSTk0ZMT2qlslslbq0+6o11jOODvCGu4A6iKyP4JltB UzHRbMpzoKUQNPg2K8kvl+U0cZE6pwTf4MhdyimSNPWVjZl2dVbGG8B1PLLiRWyjdx97FDKwlLIG qepH5o2uKaxhBn3cRZObziamIC7iXZaAKnC99zICFOMJaGICfskOB8C4hT56wUG/rOTWJIbPUGZU H3OUccQIxBnYiKIkoUGlSTnP0Bi+4F08xrKxOtpwuQQddaBi7KlOIStYraaS5XKS9jsbVfTULYvs 2kvp8zLGJOsY0gBxS4UcIh/zGWA4k4ClNgQAjZQ/kxDTLB5KJ0UFJkQ3kqlQElgFoIQLmphXLgDT HqQwVwi+8lIpLEb4FNH9V6eonYLcSBibyiaUPi97xPn7fV7OhV2+Sx9TlmSJvADKFgWdZS4rk/FA U0aWGQzBExFIx6iM0kZv+uzWQ9RmJO1SUbLI6wUh9zaDkdKpeEpWcMLEcCiVV/sRX0IVfSR9CmpW FOqBHfhYBxaJJefFAM/HiOG42gOkQiilrEHKkOV9zMGsY+5XAKZzyA6t2FIyukXemapySTlH9kdF M4KcLXHcRyNATOgWwy98rHYKhI4zTaKgGzPNseM+nGkr6SeTuzgcNCW1JyXMAICVlBBiNgo7qCI2 jcQL9p6FeUXqiDkBO0k1WNfWRLBRsZKDi4lEJN0SJA4ykrNEDAhqNqsUXNENQLAwMpBgmFOl6RgO 5VhFQ6+KwRZYM1UOcyzHq6NqSok+lhJYxg6kLDukArXCdEkEtC2hK14bKcueZVdiHEEd+KzeEYvo LTmI3hkziZlMe2BTJjFMQ0rtKdkO6nucBKO7moX/Iqs0kjxmAFxokfPJIR9fVglS4hvdMgJOoabB JSQ6SAMSXRFwSsmbtNDCoVhJaIpAL/4xKhlb61hhxyVtQ9LhJocuABbiVaiSq0aKXXdRE6XRLUWc x2vRFvfMQKZWRTnCUarFFQGXYpGRQegq85PgEhRoCzDiexBr/7T0ywnj0CYTHZhANbnC4DL69XII JQJjCYIovoGxyBQCjMamIjJ2TiKxyK4jHhTi8NY/ggNxaCKWsYOKDE3YmOgPCZqA6Nhry1qG66Lb XgzJY+OU2BrEkhkre6PPiAys5/0yMJuZMDBUZkXAWgZWireDSD+Zec9Gd0bHSVy5aTRmRucMDvio yMknOmf0vF7GlfutgFp/RaAxvJOjhxGoIlCsMDra51xm79BYu0faFjb63vjoVyBif4r5d1S940Dr uCSJnsuKasTE6gGalRCppIY9gGOqBVQTzLX2MRdz3UuiL0tTlVz3gtxTQGdpMne0mEHBRN1lHhVb cipQvvlaEuOn+NXI0vSNQFJT+izADpnzFQHXMZdEJSUJAFyJ+g7VPnPtncydivx//oTz/wnahGJi OB9dZU7pCJ5rgAMHBWZuyfFXtkGyRyXhXxDOwJUWELCBsGdw6a+AcIZhAvoGuan/C6UBRBs+Ugjj smT3aBdGnGkyBxHIEYAo3sTYElREUgFn41ImXARTwTbjhLnIzPXGS6Ay2uApBBEybSZFJDAXyOqb KnmIFJIW3UiReXReIlOtgXCMInlKlVQuxZTCT6JykhzewHJDDEfLEixAMQAs+4oLpnE58YuG8FZY 1goqSxbwBXIrYrbFMIsgcMTsitojNVOYnzplNCUhWjnKdUBAVm+guz8rxEv6O2cRpWZcaQ7UcGzj NdFdGoCUIwOBxDSD83xEOZBz0aN6SPnoxx2A7IsKIQgpj2lz8Fgc4aSOGZgGKSUpHHZwvl9hTT6n /kN7Ob4ceFjEEUCgialEfTt51usqyfQArqhsNBxNFXX+XEsaHVwsw1iJBf5Mrk72BXbfgNPCgQBg CSa7ucZSzdHqQg7U4DOpYgdWwt0A+TPhBHsSuU+ActlGoyAzleIKKTYiPrzwskqJjagVyDsFvcJi LAzuwIsHNZBQ8FV81xSB2Z4NTnhUnAmNTER6wQVODLFQ/wSvBDiFGXEnBpMSOf9pL/lnyGiLUias t2a7CRjlUAGN/kDi8gSjJXOnTpcS1qtGdA74gck8XsWajwHW/5AOFCXuh4OQbNSIIxHIQXu0YwW3 tCJjtRxE5vrAb55+cKAwkDTB4OROornTKYKmAvUJAyWnKbi4kx7Dsb+w6Oe51rPTKVynlsLcLtaH IRdwZK6cSVmaUMFPa+ZijkAAOkrd4WIOBBhBXeNOuIw+oz+9qbiDSjvxvc868LVMQSvFwKiVxfAD rggQY6YRaFAR4iyFvcxQpAPFJjmb6gxQ/ILhgYktFl9GJVwcee3xLhAv4Rz5kUkH7AUIYEpZSTuG zCUAixiUgE6lBAQuYUFGQPoN56VQEMVaUJENOM4Mwj1CUEzAj2EdVNnVeYlKxAgOcpSGPgsXgVy4 w6ESQZ5XjhbLc9FFDE2qCn475tQjIJuOXE8UU+VK3gAdh8plYV1MotZyiomWBYwFmeiwsmlA2hkS R0ytId90/xfE3aDA59wcDpn4FQYG6hAPoJM4U8YPLlWohohUyonvWEV6gDtg7bPTMecIRH+SxRsS 9poYEKkoKNkpuuhirUCleUDLyelJOWEmrKa0kLyohWKuIQY742ElwwSgMPbTAK98ynoNhmorrtQF 5UxB0TlZSjnMJJAhtpagJzSzPVqqj6NjLRWKMTqlFEZPaKqTYGL9XXLFJg7FSGQ7Om2TsRes3JqO NHipE2YyJjltg2OG4j45lwyZPtGma9gsLR0AFuxry2o47LXwg99vIzNnoh0NFoXiF2D4JnJdbPsF YHKejJZiIbm8KKThBe8BZWQBg7AKG0DuB2kHAsUrCBy9/+GMIp8EZEFYPCeWOGOjLhUtxRUKDJRq 3jAWZqWpqZOHvSLEGY6VTUV2KI4FV9BGBzUd85lamwfHGDJUWwhgNoyUSlkXUE+xFAkRcOTuZAtJ 0IP4gzw6bZWtIDJ9iOxAE8ZxJcrKfbO1ZIpHu6uh6lOK9jraQguhblJbsoaKNHQzU4ogCKHm2is+ T65QSrw6ZJfm/E11IbovQBiStiImEncuN4ZCIGLBmF2U94BcnNALrFDagoaIKXVBfiiAF7WCu2xi 0gtOgN78P2G1JIuB9gQST5CIVktiMdgzRYljTawxo1KiQ1NTYZoAZC88USl6ckcCAzYnY3VaJqR0 7NWVkv8AA6Ml64grpOy9SiUOQ1tFVgOMpuQ04TXtGdx4YAKo6jGoXckUAFFrXDAeHBAVMicQIEn2 P4wIcPw4OjeQErmUyy5uCARkg69OOYkLHVlH1piQKQDYHy1comTsBBUzbj94DHPqLCiAUaKgAeJi rEToK/HCB98ZG9MqsxugUdHMhJ5ZjvlJdL+QJeC8KSAXsNIdVssZ7gBdCFi77gjdYcA4b0FN9d8J tbEh3EFXjpuinEnabi7HBo6pMS4/3DzWQxquZ0xKcM6Lhkn1TdR20zE0XG2JRqDFud+qVEBJySZY TS5rBORoK6uTeyQosVk3D2iM80ZZIw6aIAqQ7g3OMZc7N5wdEtcQSCWl4jacMgyABelbEI/WnFLH xOgK9E0Tiy8gddpcEx3w4NaxCgncri3l5O2/inS3LTIwCh9GnsXQPZ5GZw285H1f6HJDvlEyd0Me ABATSJ9Uy26Dv0elJG1sQUp58OGQgvUlp/7RdZ2lUyxqjhvU4IMRk6OiGjLASvH0xrKOWBdQAy5L 5eItM9gAlm0tLWNxjdiUFXCOnNjwTTFlSSn5mwEa7Z+asAeN1Umt+Z4FSGUlOZ7dcoITKdjF8aNW xcpwBZl+6WhyghJXSsyuKQlP0ZVVYnwzNen46HYy0jJptGglo+PmZWQELigBJlwOLhyMYVtIysCn ltIEgfGOnM6wEIwkE/HRbQBcYg2dTF8I2TQpwQm0JAxvuDIt4YzWtqWkqzYpibYHLRbKCOjwrFIi dE5jLfeIehUtlo4FsnwpMiVgBwnyxIzdpfCjHBAKiZ15uUAOltzeTs4x8JuizgAwp3nRJnrPYMJu Evp1rFIEGceZxsA55iUotHDUCoyxWpLJs3QOshGngfWFVC5WVZYQ2JeipsGkAVWsG0QICvIY0PH0 lUQQqywWBJebHFGBpJZFRPxEOZSWEGjM3V/KTc4qLlQSr6w4yHomzy+uTPRKgtzeZJcF3zHJho/J uRU/L14uRayyBZ2ygnwQgmhFJm1op+2GDrrMrbe+HUEAT024pIq1b0uJFsQ+VawrT8H/yHxk7g2O VAjKRo+aUpO9C4FCuNBjAG8BZLgQBQ26N5DiRzIkcK+0rCBecAnF0lFWC9AE6Yge2S4OsSNcpgGs DrbiK0R2KMxcXQodislCYKGzO0zJQjADOeWeAjGPFBWwp5w7CL2creEbUFBt71x4gA44xsrEhCuY lpzyFKFXfByBl1R0oG6VzOYcFpRoPPE+JXF/hivJUwdKYlZNLZFPWA6BPAusEj+pQksci1WkS15g LFSQMdrUsRwMvIuWEGQSLqXioZouOmdYrmzcw3xZR4FVfK+YyYAqTUZ8Kzitha2SXRURNDlo2kpC QxCTU9Y8W6U6FU6SetsqBeUpH0O1bZH8EpSUU7A+JqJzlVi6gOsG7muBOWghZj4m8QL5hMKZbMw5 ACxZFalh4uFR6nBGwDZ2oIy0ZT+lfnLKrAtoUMpMGgFjPtoJQAwRfqb3CzEv/SyhFJfsZx/bGc12 prSdgW1jdQdyxa0MdD+rPYgtb2Xh25j9AYJBuxDRKm60iyatYky7wDNAOGqTo9oErnbZrF2MGyDw tQqHteTtkxxbNABORwhEh3Q2WIgYeX1A+nV0gPORRwDCyTKERCATUEoKDSCxreS4lXAPIPJt/EAr 4zCAyWhjSFpZlwFcTitD1Mo6DWCzWlmyNuZtAKPXzhS2so8DWM1WtvSkmd1WFnoAuw== 3caZt7LwA9j9VtGgTYgYIHC0CydtUkwLhh6IzVvx/gAagRIeg6XQBpZ1Rs8oa2LG2AESers03yr3 t+gIkMiga2MUi4GEmprMsaVow3q/EInpJ90rwj73k/kBDEEb89DOaLSyJO3sSyunM4AlamWfWlmt VqZsAAPXyuy1soUDWMhWdrONMR3AxLbyu62McQsD3cpot7LkA9j3Vla/VSgYIEC0yRqtQkm7/FJy 4UJUkKjojZ6e52B8jB1ASwu8CG3R2EEV7ewwLK7sjm0tq18dp2WtYikRyP/Y9HFHL2DwnuB3GZHV 0BCgpHRBYBYq4jswjQXuP5RfoOch7QZX8IEqFsQigDmcS+6BLzqlAIQdrKKPu5fwIuCSqlJqY1SU FMNYyTaGlUTIJcAU5IUWRTB6mSmlnHJpxHsEnTu46AhMy0nDMh2BwCfLdeWMx1BNhu6gNVEjD2eI Mh4DanXiR114YVStj2eosKI5dCry5IWWWHrn8rKHtXgDQn1xcQUvxBcMKnRy/MYgCaJV2miVS1pk GECtBhh4cO/RYYVKjV8I24KnT/yXfagUJ54Gb60KLC7iZUjEQFclrLnkliIPTAAGVB/dF7ESIQJL n1wH8GYGcD1bi32YOGBdx2TOYAaiJO6kldRsoFPR7AaZWx1nsi25YntsO0O2WMqOolhpK8ad0Ak7 B8VMvJxnARKGiueDkuz2lKmSHrZiiZXEbgSslWNPjVj/AspmFT7DrniRKid1rMEBjCt7UASKo7Ml 3GdZi7+t4xh2uom1ZG9yXqxjcJHwpgRgGfEDBkqQj0ad5S4vOewZwXkZKcrIBIXhmcSDMqci94Iy RQoiKqfg0jACyWxfWrmewFlYrs9iJQWt05QgW9Q5JdUWsS7W0Ctjkk6rxMkZg4so8ybQuMqnqCfe WePJE4jaIsJGauJ1KfUvvK3YMUZXWgqOgGOVY4oSVlOS/nOlZRBjuIIQpE8nV2gQTYzg01oCnODA lU4i3yhXPGJ5HaP0CmBfAtBFKzvaErUtCBqPUc3p36kp+TYDaq80P5+ys4CbCSYExQ443SG6WQCG 0ZUnAbr1GjMuIMc+4CjhG+CCuoB6EshoFeAV1/IlGiJ6UKT43Lag0wGItw1Ht6LzNrw/gEQMICet hKeVSLUStFbS104mW0lqK+0dQKZbSfpA4t/KKKCLFIM5mM6DebcUoI+cRkUnqE45m3FgeGHAbBMr zhQcptgAlqx6ikBcAiiH4cTuI21rDj/Gq8FORXhfPJmNfBbxBCgW6wtrzCXPd8NxPTkEchTSgLvV eg3b7mv71W5FA+0IYwByGYCIWlFWG3prRYXtSHMAgm1Fxq1oux3FQxFG8ldxyaIH7D7delfEYUF5 ShLFIUTKRm1CKdkqnZdssCBbcISNY+dkqVLKnBXojBhDYEnVqpDRetGHtHFW7VxYG7/WxtshMgT0 51jg1Oh9QTxRYFRK2/IlupljxAtyOJjYUtzMKRU5Mj6VJm+fSkQILB3kJbKH7SJQjEfFkvNhRBhQ qivwfPMxlAjzCQAiL+tSEk+V3rrMpV46IBUyMmmaK3Fg6iky1MJ4S07Ao/i0IdDWEgxVM+9WJPUA gGm3YWClczF7FoqMulYp/SdIdMS9gXdUlgqkxMIpAC5czOJG+UwAWBdOsq2R1gJ5QtheZP8wR6Rl AQ0D/YjT5KAecB+slXgicmVmyHSrrXhtWlFm6JRBBzyRDAZUwpXlvD4KcgQZ8eQCrowYUC2xssYm 2l2RCE7AqhagpoJYQM+03E5IM6AtS/OS6AW0kSTOWpMQHMiN5DXlqBLOAUGxpNoFXygpm+Qk8TcU pE+R4CwPS3yFSINS7tjHOoWl+J1iaJ+XsNpWFrKV3WxlTNuZ2FaGt501bmejW1nuNuZ8ABvfwvC3 CgYDRYg+caNVMBkoxLQKPP2C0QARirKy8j2W1OuawyIQGLOX9mEoQngJ2bVFgQhr2PuFPWf7TiX5 lA84wX1nfeC9aLlDrbdt4M1svcWt970dN7TikXaMMwA7tWKyVpw3AD/W7LwJ/WYJFilLphY2iFEx KjCRe/JVIh2Y7gC5H4nzgNHCJEnVZGJWWC4iEeaV8t5gDASuF9htqoiMQ88czSN+9TCvyrDVCLXG MgVFrDF62NeSpJLjfsFooZxQNOafwMffxdSXNRNFAHMFHS07ikAuUIbJIJEBRKAuUuLIMG7cxlpy 4Jp4OlWdoiliAI7i8jTyvEgHKiWxrUXdCr60khOpksqXlMs8i/Ii/QuCC1kujnLWWqpFIVfAj9ex OghwkzQtYDYlkLOirB0ElAhTiPYl2cTkmflBC0wRLRBsWskessM5OB7HxLqc6AOzaakUOWtpASGK jItzaC+rqkvxksOUy6QvDUNJ2ZfAN5wkOV2JryxiLbKkyMkhIOfF1VVKGkB5vCT4pSrFC7sqtHjZ KXmcM1TqOl8AI6oycPMzElxi2Pwba/phuEFJftElZsU9wOhZCKwmf0ESzznq18aSZVgTiFhPCzg7 lpCCGrIY7QYUmqvNJrTndCywWXOIF/KuGIMhFIZrToKZRLIDwTV2HF8jxjRoaSw7EKtY8qyIz/uY PyUgCqa6gUXAMBcCGqpVC2bcVAQKijyjSdZVMXEFCG+ULAbovjfiF11VNICSMm3JCDiLjitpLwlY OpptKXnaAcjJwuBVPkVSoC8nQmPep5hv2FXR6AJz1cT5QOmN2IGnU0ptJW0TZJvkN7GRFJIrsWM4 pFMuUyEzds0AYUWqWEF0hBcmS+qQWUnOCVa5VCPQZjKUJC+B6moO+RYwhVfWHG8EnuzmtAImVkJj U5KrSHQjIFd5dXWW26d2zKZAegnJAwGjLSRLFmcYAPFYinbqlCEci+zFJGqS5qOGPIKSnq5kr2+o 0cfZPDC8Y4Ef12RMxHRrOhbu4yyFmgRGAkrhIZMZ1fH9kgdUs40HRPmY0ZDz1GMmqUrSZWaZt3Qs QJ4y60DFT0XZHxQ6yZF8X1CBHcdGLWKUwaYt+S4kCLxCJ7tYI49M9YM47TauvJV/b+P1T0Gcd3ly cd4kHqywbZnJPUPnmlDQeEE+lhTT3Q+JT0qQd+Wxgg98IX60xMjjNEyJO0YJHnEckHmJO/bW9sTf QVMjURoxmWoBGjh+Hp1pDnAHgTnmthjUMif9VhJsJ4QaFDRWYvWkOoLhZ6PyCpqJPacxpvSsFFXp mxPndsBgKiLpmqy+Kwz2yrsMPNcHRjWggEuqogTmGg6tM6BpRDu41lIovOV1Mg4l+Tk152ZbYTCW GqD2nDKzvy2rEKrKZkMTBlUODLNMoprgArTShYDR/yuNeYvWXNZB61gCDdrqyLjVMdkLKpjTIY16 k0LAmHaQZ2cNK3Ul6B+czRx64egs2xKAmclobpOSnKLQLxuYkIPHND0yBmIzme7Ky4QlDbjaZv0y kLjybNkbQF8UqYOyLoRTlHDkfDOZy2rMID3fv8XLIEjyNdX4T7isID7ahGKaK60pZnqlbwcbx0Ap W/ed575O5lCM7YA+GihvhiLhKFM5cAtg9l9hsCnQowfoqpQsAM9oFBrAQ03C9pT4/oBOpIhSi5J0 n66WctyYSNVZITWiyNOUoZ2AVVbNKIFFQgEgnZHQK7vTYNkhyuHsaqpPKB2UdNB99HejskOSrCyO wGQp0LIR5G2Ru5FksuwpLq8jUVn5Uve8zErRgubAYluZhFQT8sZza8xi1vu6wPqLAKolxzbwQhzt 3b+VCzE/Di8loDfgcWSPS4PzA7RJaisqblayYwpn9sJMs6bgMCElLCWKEEbEikIVUh2NM81ivuq6 bJ4cyC5gUl5d9sRiqNSr4jIFhkPhBVxriVlNBd/gAlDQJsTX1oL60pkwhjL09bfWtpJoYK63ACSB yvG2rNmBbhccQ0MLdqvF2EFZbHGR4/4IyNGFzTfjEiMw5iTMdtfopLRo28LGq1Kmckgt7MUhsTRe aq9xokCT5aJOUzBZlYHsZSZKfFqLbIzpJHQscOYllDiVX4AOSgkRztq2rH7fIh7oiuB6x4+qv7gF uuSobxahqKKdzc9PcwV7FiCBcVpSKY+zTQwGZwcWc0HbFrBsb+PA9k0FMX0PEsfSlz5KQUbSWoAE W5ZN1AFVLj0F89ZkCmYgVTkSzH6AO/CFqzPcPkO2dut68B8onJTVvahOYXYXQXW+igkoqqhF17HS Z20Eq2YjSG15CnPSr9PcOhYARe0Tj9Y4gYHYww1d36iS5gXzRFhew5gxum9hGaWCLZRyGIByCTiY FQa7khRIFaX8mGtuBKjClNSPw/qqjg2mUs9EFZh2iIFSXBQV5JwaJ5VZa/TbeB1vGxrUrI/gIPP5 np7jusPQZH/CEH02WnkZx9w3J5GDcWj9Y8CXzTVPKmaEKnTcT++qqg+cBlfGVEqNLmxppPxtz35w KCSKWBWrYzDOnZxgo9c3WHQprQi0La1hHY0EeYLzGJV9Fr/+A1PNtkV0bQDvM+1cXwcyAm4pHUjb IiqPGr1ygnFfkLt/akjPQ5bIDDjHnXISCFeIZy1m+3PcVBxjMRuiZjt1ijzwTvTSAiagt5JBRbOl PGvpMn9nqk3I+V4qzhaK1WNE3oyeeiZymBBlrJLPOONjx7WBJY1p7WpOVyDmOMwMi6cGchh4JTFE HAIEOUvqSrzpkXiIu6EuJLSIL2DWK6BF8gOWltgBIADr+WWmqjR3wIE18rIZdGavqFq6s5m/IujN mBu0kloy0xeIzN0E+lQfFMBcjw8cA6h8EgDrqFGRYwSbzztWprRIAGbfH8eZ3+YYzCKO4zpfBGRB WO4Nt6xr7qD2mZs+i9dhPbg+GawC8sykXOSkEaLlQyD6aVEHCRxpEgBLJhKSBhuWm8pGCDmRrbFa 9H2iHXYxGXqiMk0gSiXSgTdFU1jJN7yW+o0AZOwMMkGlZALwWMXCCmdqwoS6FNcBQIm/MLHCqKY4 pAN8vkU3yany5/g2SBJWRU7VAma+ERMHVzqC2V1eOuEXKtF6il82VtuRRM6xLHbegYr6XCyLpXka nIAFIz5IMJUJy/VPbVFom5tqtE58BGAQKaaQLU8q25mvb4auaknNlOMlpO0zEt1S954vX0hNOAEL tiybp7G3CxatWqiI8AFK4owaohUEFpNpIeO1G0DcvyawIVoFLrGoXZMtBeuKKkzGDJJtpa4lpAhb ismlcsKrYr9z3G/4SWfj7euXhQCwgnI6nlwMUZwwBcEcfVPXUqpMmhJQYg7z1Oo1MGQSisjFLzEZ DQePpBpI2VBzJryxMpRtVinJX4xZLCgXn9LRfaKxsFikg9M01Zz7SWkpbSQSU+vWMksBanjeMkvx fSusXC9ZvrKS1Ag17jwzRyp1AjL/CWkz4UaJdt5wpiIv/BkAueKswfzxAiNGF0uT6aTd5+w9kBpQ s4kJ9pZmUURnsBoEMQpfKSlSRewLrAAOYInJrWOF3yzgq/YxuM1ngTlguTEx9Qh45w== zjG4IOUgOPsxl4rmGGIAINGo2PRslDEh49h063KnfWA9suUagCsMxtI9CTzHYFaPQ4CWGLAM5TJB YGFiFQ70DgAY5qmTxdF07qwWdxjwoEC0ZnWke433YG2uAz2Dxcf7x6R4BeIxyt8jI1KpQHo+IkUp Reaax8CqGElVK5FuILxKiniAd4Vnb5RYdhfKiHDYlwkkkEo6gkWIuReIueJIOPCmqym4qc7ddgM5 J7Om5RJaZDti2mJjJjUAYsUAChCLwSUZ2KR621i1hE6dTRma0hhszA8GQE8qNgjnExssPE8ytnW5 My9rXq2LVuQAZMdji0kDyUvLk2cKJe1iPhjrqyBPZYsYpZmNqcwqc5TCJlkuoUOLzdw5NyVYRZWI A6ySmkawXVwDD2JbvJZM0JXUPLElMRwzbFNDydCWMcyzVlL+EgZg4rVPB4bBdI7ikbGAJJycIw6N BiALCBmwoGT8PfhMwHI+NVUwypaxViLpNYGMpiDRUYydy8YLQo7tG24Ra89kPaSEAtkyeHpG3AgL Ilg2+qVnnXpJAZ6PFQ+HPO214ZZRDM47AHlIRffvSoIto+NCmpXLTbYJxziy+coi1loCU9ETURAK emNTaCYHiWddYBrRHixlifnqxVJc/1e6Ff9ES1pzAoM3Tcn3EdNPCVh7J7dXPM5BY205GCJ6cPRh cEHtkcIhS6p8JLE8a6zBGE+qzmozSKw2bAhXCVeS9BjdJwspvoHM8MJU4xJm1Zgqdj6oqEaREiBL VmBBt7qKmEVyfhtKpdvAAhA0rQgRV1ggmZPgJw/zAC6cFDowVHExw8+QBZ8FvnTQvMuQQzrUuTk6 UX9Jrh+PCREUZMJVuplMenzMlAxAFpwxPTsfqb796aYdzy8kH/2VPjAqemT4glgGgrGTufa+T9Qq htWhIrFHZeBKH1hK3VQQoCFcQAxctVIgxWqynx3o70BqWTnhPjM2onIxk0nOhVSQejNjI3r71CrG YvRMgG9WWVP65sQGrTCYa6RASlUpHlPW4g7G0BmM/ymYtqU1KIFloEB7neKUSzIKIXGPOdNiifLM LbYEXzpZgRR8U0ZHIGuiWgB8sKkcWDYmKzpI6BREdbzWpY2I3sZrXTpxBRM8S2+iiGRMMwv+LtQB 5B/QVe9BAzApla2TcujkBF4yopYEIxC6Quys9CsrEw5HmYGlXxbr8/GWYurLxwtRiYXOWlK/lWT5 a1CFshJjWMY3QUUvJVRB+KbsGJhkzAUw2+sh44E2dTweLD9DfgAqw4xdFLJp4mXVf+pSTQhWyNia RDepCcFVDm0dy9sVGBtY9wC9qIRsJVIatfVUnU3A3AEl5BYGioCcdtmWyesWwLaqTcaDUfkJ0GTQ SatE/C3g9AnvgmrsGUwVYrXwdSlfIqSs4dtTkNM6AWU3y4jnC0XVdBFYxAp3PiYktdF3GYGm5Gyw EvVcYHAKKjIUlSOkEUAWRckGK7lhICMD8bvgdin5ebRkp4GEFbpMCeR4Co6rhs4xmFGAU5TFhFeB DoOLRY8wNwurXbiDA7y0op3UMXdTAHJxMcyhbhgmaW411ZqU58mvHHNNc5RXA8glTptAdB+ULVds gNfROT+dA5dCENNJBGBUI8Kho0pXsLS+SpVMRGupyPtXwErR8iqK4+oFcq2HJhB35wB3EMRxBlvB 2XB1yBICaaO0ksw3PDIAsjK2/+51JOKFkarCkGcYSMCK3A1f6ezAyZVRlCtDWs+1d3JKCrlUJ1vI BZ2acT5ITqVAE4LnmmCnkoWCnd/6IOlR8PG7qws7AqN/iAU+R1U6QfUPB31l6u6p/Qevu3F94+al hY2ltdX59WPT1wfQNTOYhawq9Wumr7t7Y31p9b7pa2666caFhc2Vu9Y25qHta6avDS1vCP+KZMLu tI5klFPVeWdXRo3TRF8qciEARXDB9ZDQySnqh6PHRC3XEdpK/aZYlAH8dwDXAqICD39DxBe0zlTB V0drXirLiynGCfuRlcjF1OlSoU6nFN91rEUajcQ1RAuxTIB+5Pg4RDd78atl72oI1RHtcp1ElZga F2wdSpnoL6zSsDLNRBXFmkRzpZQd5NoS3oWNY96mhjpWGXdUc3QGY1Yp0CoWBlsQ0sz+U44kWqI0 nlBRCpXD1GpSuCqWYAaaYslPENKssUwEqJc9wGx0Yy8KEaixhLy3kdSx0RtshZxRE1uIC7IgaTCY Rc9ulPWogyq2taJeK3VWEV27WrjlFB7goz60qMVVA+xayolVJ9VDFy0tZCAhuwfYzQpOhYf6GNTj gOGMivFA6nAuegqRvGxjsV6MNGBNrUUlAXYp3uxYZAbDhkk5BuY6VshWkM3ESUkJoE0LLJdmRktx Drex0EQmLtdEShGIERKiLpcIBR3d+CCGjN1CNAU50nGXaAquRk63oI4+KJqS/NHNYn4f6GflpUIT 51R3bNSiW1hLmIszIh1h7Rs6Rs6kMkclrTRmHCIvTS8nCEyfHC1nnIiJsAF8sY3lwGGM1ox+pqCZ thL1EMOkmGdHYCmOw168tsDOK4VgoW2hxCAv64eFtRSbZ6UwDIyAkma7Ihl9sRYOhQJAW7qxVCaI HFhiUgEcFtvISgoN5A4IUjoeqBV9J1hoKeU3lAKqvJzfWgIIwZ0pnl+pe5hcrGGl2M0G3H+Z1+TT eYA7EMalkHqxMABFtYjh/DIOxdmLCdlKvVgAi/t6JZV8sUCRi6EwiotmhhmUYuKztUTfwWzZyyL5 sUKavUqCecStCRfasQ06lcWBbOdOjIxxqSHvWyFeRZTpC9aADXGuprImtIgaognZjKzEFTzQUm7J kU/o2h1djdCAIY7GNVdUqNNJ12KFBnNoZWQPrS/ZJKu1zvaASz+rGPyGDvFSflxzFUMTzVLgwyo6 QZyAlQqynPADgbHoL+dvQCDp+DwxDLEDNs+jb4aRA2OlAq0EdhouBUtAKamN4FJqyzvxFQ8rxF1K ACa2E+VerP+BUCUcQx192FmoBqDUWVOxHLWSNIq3nCJ2q5XJOXWdh/PA7nCWMiZKkIRQJaj0pOSc iTuRRWMc4Vi501ai7k7N4IZlecs6wy4o3lKwjZFAM0+5d6ZbGfEHTx17XBjRhQJPllLoV1nNddFp gYmFDp7j5LSnaiCDxSEPwIO3r63eGfrYCN3MzBAYpaT8h6nbj8AvWtFPd7/z1luWlkM3U9fFr2Fo 191z29zta4cW4WtjzAN/uGH6mg+sLK+Gn2bCsNaX7t3cWDwKYw/TXp/vabFw/9LyofVFnJuZvu6t qxvpN/jPxrEji/DbNWp/WJh3rC4tBKCsT97wwfnlTWr5geM3BMEQ2sEgcFSjOo9jnedxbAfmsXbv P1lc2LhpbXP1UBjaTWtbrHqa1mE8WaHpxtHOE2w8s+1TvfGtB29cPjx/UHed4tKh7BIPmBK02faZ aNX9+N2/uHTf/Rudt0iaj/ScHlo6tHF/5ylx62s7DHxUsOTG5vq9m8uLqwuLXZeEHu24IvKebZ6V 6TqZ1c2VOxY25h9c7I5a8ke2fWKra3dvLG0sbHEk0/yOYuu3Ly0PMcHGM9s+QziQXWe3vnh0c7k7 xpHm20/Cg0DYdU73zh9dvGV98f2b4U52J+g9T3XBQAMmoo8zkXYalVHqxbfn6OT4Yz7OLmzz9iyt dt2ctSOL6/Mba+ud9yU9sO2H7u61zfWFxVvX54/cv7TQmRHZYilyfmR1xLHD0uoWZKAxGbODt+bA 2sqRtaNLG10uzekYADLLW777upsXD0/fMBH2RmMeE2FvxIQ9NxH2JsLeaAt7h9fng+SyfPva0tFd Je51vnoTcW8i7m2HuNdZ8TeR9ibS3kTam0h7E2lvSJb75qXl+Y35D4YXLR60p57zHh+e7hAsRGdu boLSdhildT6r6/OHlja7c3HSfMew2m1r60fuX1teu+/YBK2dGrRWTNDaBK2NCVrrfFYnaO05h9a8 mvZqOP3vXUPoL7InJmru00ycjgaUeRSI051LH1hcPh3+TeNDodYXV9Ye7EyhwuYtD7PTyzuwxUur hxYPL60udae764tHFuc3bt7sTnizJ3ZAm7raeWbz4Ee7uTUPkk0tf2Tb5za//ND8sS1wSUOTujG/ PpQqldpv+7yOHlle6r5rC/PLC7cFSOeJpQd2wDLVebsODXHBDu3I1dLT+gajprUP/1XT4d8bwvfw /xsg9LfrNPFbd3oozbd9sh15lAyZyLtvx9F3xSfNp7Z9mgFVL8939wudP3RoaWNpK4qYzy8+sP0W ms5bdy9EOnQ3zFDrHZJW5leXVuY7qZVHhYe6d3krzDZ+1j+S729cPnL//G6R7svu9udDNy8+uMTB R50N0PlD2z65Yc4gyjEdN6qjOHNatBa3zm8ePbo0v3oTzW1c0MGCWMbu2Nzioo8fWtidZuehLs+I Y7kTVMzuRrPzKCKEzsqmccEI8+tLG/evLG50P2zjhBlOBJePB4YYkrUbGj9st+jedSoPdJ/JAzsx kc42hge28BfNJ+JGeiJb7F0+ET3SR2sLt4h8Inbcaej4mDhOiPwOjcR3yrK7uH7fIizmDhl2aQAT q/LEqtw7tee4Vblz8P7EqjyxKosMN7EqnxYRdZdalcGmPN9ZcTWxKu+QVRlpPNiVjbphKHo/sSRP LMkTS/LEkjyQTo2FgnhiSZ5YkieW5BPaikNLhw9vdk9yMC4YYTeZWzsrFHkvD6ytBnFhtfsu9T23 /fxrZ2y3uX44MEh3B8GhO9fTfGh0949uy3Bzazyz7VM7tri8vPZQ1/ktQ2qb8PvMwtryELbZ3se2 fZZD4sjTQLFGhVpMlG4TpdtE6TZRup0wKfS7SOlGxO+G+9YXF1dvCAzn4g0BmSzdt3bDg0try4sb N6wvHrphbX1+9b7OF3BctHHDEPKJSm6ikpuo5I6fE6Czun5xOfxlKE1P9sT2Y/uq88TmP7i0sjlE TsnYfsf0PWCND8LyHGf33BHHmJtJMJljdDxGR/7okcWFwDau78L4hV2letrVipnAoO121YXujIHl Rg6tPex/cJSPKQ/2zR84EgTjE5hlenCit5nobSZ6m4neZqK3WRsvvQ1raUhvw0ocVN9M9DYTvc1E bzPR20z0Ntuht9kJ3LfbnI5GQQl1N0tGEy1Uy+mYZNHY6Q0bdRXb9oTK7xB+GsdUGstLG3fOL22l Gho/jLC7s2jsymThwzqejXwKje4JGyYpNEbMOXXUU2h035HnUgqNHaKdkxRUY0U8h2V5Rp1unpCY MOq0c5J+atRo5yT91K6mneNj3h+a7E5STw0zgB16+finnprR3WuKb5G7KTuRH9gBDDnMTLqXJz62 AzN5buXMevPhw4sbG2tzi/etrg1l/Olk9dl2L4zuh/D+xa3tXdl8pPlIz+mhpUNDmBq59Ti56e3e 3By7TDG7hWAyyc4xEGXuECM5ptk51g4fPrq4AYNeXzw0lI1wXNDDboqW6IwVDnVndg== D+0Et9t9It153UM7wuzi/dltyOwOmdW4oLGh3E3HBXMdXl5bO0SetNffuzy/8MAN0wRaOzK/sLRx 7Ho1OwSbcGyYsClqve0zHmobx+Uy3QJ7NkZ3afezBLvTdW24yzPinM6JH8LRt7MdvX/+0NpDB3Yj rhtHl4JJgsKRxwaTBIXjHQe/ixMUPnT/EBHC4xrkP8lPuOsjsmxnBDRmEVnD1bAZAx5rFEKyJnmB JhzfhB2a8Ayngucb67xAQ2c/eo7lBZrwS+PGL03YpVM/hkkE+yjyS7vTDDCJYJ8+MSvARGU+iWDf 1UF4u9JRchLBPonCGxVJdtSj8CYR7BPaOaGd27Jro042JwHsE9I5UhMZcdI5CWA/sbUeFap7Mv6E Q2LyHdrQYSLZR2VXTjtVHYO9OH0DGKODcHh9fmFjfvn2taXuojw93PE4yJtG1j64urlyR1iCB4fI 8p4/su0zW127e2NpY2ELs1YegAKt3760PMQEG89s+wzfvrl+7+by4mr3FO/jIqqdkD59tOWZWdXZ Hnvv/NHFW9YX378ZtrZ7dGHPUztGWhqnclzQ+8p86KpzHpBxQOy3hkePbu1zNH64YXisN+qoQU8r /qftW4R0ne4Jl2LZMUFveW39NrmA44IxdnP44S4kv9ubrmSHbtKYpvi4Y9fH826LWme788Htmlwf M50586GTfewQIhi79Big7IVLAszdbrv8u9OLb2j5YtTx2YlToYkr33ahhs6hcuOCG04E7436RdKz 3WOjJsz2Tpy4ew4vrt+ytL7rVEOnnyaNjz15Y/7e7uswDgpNM93ZVIVzf+dwarDGMzuXimtzdeGu McImu+6UzZbTavq5cc5unZyzHTxn+rmCzm7aKRcTFHYgIPnt6/OrRw93KCQxOucdxk5a+N3Ip+1O jciJcNajLsudYETWRB9y+rYEPeduXF4+7UhhfGSdE8OWE1/NYQawQy8f/wpQUIJnPSCZwIoc3ML1 vid3xVaHcswy0y2u0xnedYR/V4Ytdz6q6/OHlja7CybSfOfQ6dr6kfvXltfuOzZBaacApRUTlDZB aeOB0jof1QlKe86htBm/v+vpGPEynW5SpnMcy3TesXLv+vyti8vzG939Tka2SucQZ3BsqnQOUf52 11fp3HUOuoeWwsXbxZzcrvI81rPd/cBOlJMb1Qs1LklNh2JJRwWt7TrX492L1ibIbHSRWXdP1gky O427MGRNo9HHZrvGQ3qI0KkRry7c/ZCNy10fu9Cp3ZqZpnMQwSQxTf8EdzYxze6L0xkCz4047VHd +c1TlIdmZA/fuJCkscyoc293B4IJDhjdKzLyKXW7n7Ohr/uoetx0CHHLWYEdqiF3Y2cr5IH751dX F5fvXlxeXBhG/dT/4LZP8q7ORuMTnWT/gztGh25eOnpkeX5hcWVxdeO2+SNjRIx2X3q3ezurEMaG vHZH5CNOXlPOtum+r7rxteuMTzil28ieynHhvcczOd29nZUnY4Mdup+sEccO3cvOnorkGCN78E4D AhiV23d4fXHxg511sYeXtorlarqpLe/Atq6urXaez/zCwubK5tZ252xW+SPbb0lefmj+2Ba0tYEv N+bXh0KY1H7b57W8tLo437ncehASF25b28qZPZtYemD7LQOdd+vQVvXmc/vZ5o4UQ+2M5LMbJq+/ HUff9ZI1n9r2ma4vovDYeZKHDi1tLD04xPziA9vP8Hc+kPcu3jcEf8KtR9f0trHWXU5eG2Ve6/D6 2kp3IoyNd0gkmV9dWpnvFLB+WuShMc16tjBxhhlVeWim2i3OMN0P2bhoPybOMCOi7p2UaRpfb5iF XecNMwSiG3Hio7a/LNPInr5xIUpj6Q6zsOvcYXYPEhjiioy8O0z3czbq7jCdxYKJO8z0xB1mB+jQ xB2mZX92SD5a2HXuMEMg8hEnr1v4wOxid5jup3JceO/xdIdZ2HXuMEOcrBHHDrvaHab7wRsXBHCq 7D/j480zxB4Oe9V2aA+HSSg8KrswhGPZZBdO2y6cvqwbY7AJp28AO/TyXZC10XRPyjbiaRuHmMlo p22UXIZ3H95cmd+YPzicUXwUNZG7Mp3hEHPa9ekM713eyk90/CTEXZj3r7PMOykruu1XaC1WT95t F2kY5LBrbtCh7tzSoZ1gl05fAq0duvZj52l39Mjiwh2bW9zfyW3fydvevQz35vrh+YXFu4czpDce GmG9cTiom8vz6wfWVo9uzK92P4P9D46w26cM9s0foJqXQ88yPbgDkWpBBgpjnFkA69L1D92/1D1n 7dGNY8OcWWo9TrLJjFeq8ykYcR2HVkPMZbS1HDNmmLl8sPNcPriDPMida0urG3Osv9gRbejdjIzm GCNM+KGd5od2Z6neITdr1Bm9E9L1TGr0nk6OZuPO+aWtuLDxwwbz60sb968sbnSvCTdOWGFXFr0b GtWNuod7Z8Hvge4zeWAnJtKZe3xgC21XPhE30hPZYu/yieiRPlpbOOfmE7HjTjvHR1Ye3gixG/1U RmU3hmWCduNeTHyGRs5n6DlYVvR0+OCMD1WYeHeMhaDSOQh34t2xg4zV+uKhoU7duFyo3WT3nXh5 7F4vj/EhuyeOM3ajIDAqu7I9Os4x2JCJZDZyktmM9vt3i6dD95mMtp/Dc1FaHi5j1khGrNhJxMok YmXMRLBdqNMoJjqNkeWEJzqNcbpJ3ZNEj7hO4/Rlu57oNEYYZ+xGEXpUdmWi05joNEZVpxGEyrsP ry3Mb2wGwXK4dHC7zAw7id6e3JkTuDPlc/nOdJ785M48x+/Mc0tPe/dGOLQLWxQf292oYVLpZlLp pg2lTyrdTIpctM1EzU4K3Zy+XLujQhXWF1fWtqqZ2qD9I196emn10OLhpdUhUkKsLx5ZnN+4eYjS v9kTO0AVJqW1I02YlNaG8UxKa58a81d3MpZdMXn/7Tj8rres+dS2T3U319ae7awEGfVq1EOwYJN6 1B2VR2NZDHB3JlUZpozeaMtKk3wqp/HKjr+udbfknN8tGeefW7pvoHhrgeJ9cP7gFlkoxsFRWe1C R+Uh5rTrHZU3cv5s1xgpOjvxTWwU/RPcWRsFHMjdZqXYgSr2O8S8TsS9tVER94a5SBOBbyLwTQS+ icA3EfhOTuAbrpzsROAbvTnteoFvt/qldXZfn4h8E5FvO0S+zgdyIvFNJL6JxDeR+EZU4tt/41u1 Ovjm1UNR8gOQB8jB29dW7wxdYHGoGQLftHjf0mr+w9TtR7gP/OnuYyuBWw6M8/r8vYtHF9amZ6aP Lq2sLIahLKy9ZkpN3xj+veehqc2p126GWd4c/nbHlJr1zqu6mlazpipM6cKXWpeFK8MXBQAfvnij fVHDl9J4B1+MsrUx0/fMh170tMJ/7jkW/vKd4cs/CaCHpt30bdPvfo+aPgSvvWtqplLWz9alNtOV 8fWsL6yfXkFwMattweDCFNMEs8bmTQnodO0I6HQ5vQCPOz2rVFkB1ASo1tDUVbNKKxuAzs1WpQVY ocNkK2gYfq2Uruj5IjTwSgO4ni0LVWLbMry/KKFTFX6uHABLNVuE5vymOszkAHZQzdZVDe/yfraq Qr/UQWkRWKhZXVoBhmF7ANpZ7+uCR9AA82RhBNYh0IcNMH76XVMNcKlnnVE1tg3rVlewWmVYoqLG KZR2tq5xtcswL6cMvawMcy+xg8qGttRBVc56XSPQzWrncQS1D2uIHVR6NsyloOki2OXgViCOtg6j LUpYxiocHlXBKoRtmTW0NGU5W7vCIjCsgSlxtDaMgF+mtZu1ykMHpZ/VVQED0ya8QtMahPWyhUZg EdbAwe6G/QiHlHYXwKWyWsBmWmA4W4Cl50sdn7fh7ByQ5w0uQk9bU/m+Tq3ve781s1rLvLw12NbW szocluasXBHOsXG9KxDOn67DLjVWy4e2BW1iWldfhWNU+GwPcATh+NThfjX2VpcunD+8c+kU6HBO nMV1wRPjNI2gB6xMS9sAhA3XobfSmrpxEsMEZ8NJMI0zmwHlfOPLAKzx4stdmEOwD7ur68Z10mE+ zlnXuHi6MrNwP3suKfSrFS55utC6CjtV4TKmq69rTX010YRRPqxulSOUcCzCbHBQCfMYXcKtKZtI CqDhiLsGPgOgIbwheA9AztdZM3m6MJ6hSl5TmqIgmLVWYMprgoUzQkcY+ywQ7/lwHV24TXMRjAcr gE2YsrzfKcfAcMsEqGpDwLDqBY/KBnRI6Dict6rGCYRlChsK43JmNjTBva7NrCpxT1w4jHBs8GSG 5a893q1w9kMrPNphp31dFbT8uqjosIQ9CXtJu6fgFtHJdHIPkTTgBsDd0L6GDTBhy6wr8HKFDkpc /3BPXRUODd1OP1uWuDQBXIfB4O0ENG/gZaYOZ5TOWkIP4UZjB4Qe4LSVRbMtbJc3Pb3qQH18qXtG ABgy3ArfGC3g6FKZojEvFe6Or4zvWQMgCJW1vrFeQNNcibczrSzQPwtkvLkLCh+zzR0L1D3MS1WN vQX6qwyNIDsHSNaJ0KQzk9P6eLoQWBiXncQD3AFvo5zbOQEr1zjiAKuUF75A6Z5XxUtzODAdN08R UuQNqoDFCau2guBArwq8aEgPCakG1qdG1BOwcs1oyoXl1bg/pQm0rOKTFxbNK0Q9AayVIQxez9YK 8QHsVakt4URvZ6vCISuADRwja6FB4WTR0Q+7ZnVdEe4LjI5lBB5mX1penkDiCP+GCVQELBCLwC1R s2VV4C2xYayOSVgFA0dMG5oWTAACorZWcEpV1jUDA8uHWNaENfVMghBcuQw81w5e7gdXNF2gCwqH BuyWtYlaEDSwVtbTKoa77lVhaRvC8cbnS2BQELWF/dJa8f0Ni88IHDBEQUsT6IkzeFXDzEtF9Kr/ HMAhAdYHiCLO2QZ0pMLQkCkNKMvUFd93VeHIVPhGIzNV2BJD9zrQI428VwDWRbg+ODJdyLkJiMGH WTPj4jQSIRuGC/wtAJ3MwTpAPD5ilrLAGduC0DpzPg6PP7AQjBxNWLsKaXnAcnXg1XkEgN+1I3wR mHx8mQ50rkQWNmCD2EG4aI42JyyztyWPAOgyHcdAWMIQuK3VtLuBxVZOOlBVzbwPohDivcJ59IYv CSMGWBjDHIIFnhHRswqzsd7SQaiBbSDuTwlnHfotmOoHqms9HdJCmK9AisLm1nRznK2YwARwVWG3 gPsqX3Lb2pZy8lVR9AADFwUIQToQsAtclOf313QKPHAK3GlgKsqCOQlXeT6fCpYDyWnAw3ijAehF tnFALGkAKhxDg8Q0AJ0veBMDr6xqYjsCB2QQ4WmlBXc4oEoMCvKbUM1ALPhxBYwD0wxkhqitqlDg CViwKEp5va8YhyJbQM8HcCWo1TGeDECjqsiO1JUAbcHMTGKfVcA4FVKysAMmcBKEOgK4ciguwMZY zxJAoFs1wxRxcwoITc3AgABkXUuRAAqQ/jQ3Da81xCKWgSzI8wWx/2EpAnsclzUcrA== kgiRcPXheuua2BydhBUD+84bW9iqjB1oJ0KjAvxBwLLysgl8XMPCIAVHoCoNn6xwCHzgegEcKEw4 UDzasHwV98pIB75VwmW5imegAZUgkxJOZsBWFfMY4RoyS+cs8bMZMFx+r+PzDA0Lg2iPgKVFUboA saUw0/ImkU6zAYT1JDYrXMNwayoebGA1LaEM4ehws3BWgOVhqnI0mCEqAYXGu6FZigvHSLBDOFsO 17UAJquSDsJVZ5yDvDsyDXXYJYV0MYxAG9yYwKQGvsAxeqhYZK1qwEm8AiiqIDcDYFPqDAzAwIYp IqEBETnD4i1QVuK9vCfegZg3V6AgGKiwq0vNwnjlabvCOTbEPaogIwVsyeihIC5CBXnKaHzeWeLz WqkUkS9gDpCaNckXcMZG43VMnQARDeKKabwOBLmATXtGBs/XvZPQgavRqme6OixzkK+tLI3mzSkA Sdh8GeeEHSvwbbgTdOyBQbJpzwrhpTxypbC9vmBxGsEijovEFoDhXXI+KtKUAIsWrpyXo2RKFrKD HFA3Dx3gZiXAdEDDygV67vgwM7UOPHJZmrp57AOQtR+NKxLIcVH7nusUgKgGaFy8BMzvaAZN1xnf hYxMdvGDTGptIUgCpFvqoCA0lOMTQDckCWWIB37WZR+SApTnrG4iNA/8U100UV8AMn+GaNIzmgyj QbrfQKlAIZ0InoJ8w1DDMhe9iBpmYHC0GVIHoPamgf3heUvoKCcUAWyLQggNE5UA9JUwQUx9gJLy aWFCdYBXIGAxkduBrM0x2BirmyQQgK72TWIJwFL47ERYPTAxiQYTHxaAgR8xTWodgDrtQaTsYT1L Y0zOA4SHrK17eIXwfqtU1ctXQF+kj8h4EPga8YNwK+G8ea/4DOGgqAPQCnsnXBAdDQstikLYJWKQ M2DOWmXgxIYFoHdedoZ5q/CqgCKqXuYO9L4lbW3kA8NgWSOUMYzhcpja173MpQ24hm5nxogGZr8o 8RhlLCtw+6T7abK3FWGQJitcigyYM81l4IIIQeUMtg2SkicSlphxlJFr1jwL2x5aKocErMHik2gC 083EAVBfFAUrRaLgEPCuq1CayIUM6EDjJmQCSXisMLZHdAnI0GpcxIaY40Ghh4uYiUQwG2uaslM/ nWICZsGqQNJLWA4btmyF18aQTAIYjdFUGKRnnWF4ijrO9LascSThJczHetdsqkhr0egTNDie9Cf8 ftpcC1PnFQ+IqWJRrSRCA+sNZKAxAFjvyrGGIKxHaOB72oICgBBy6rV/BVg0BTUE8Z4i9KJoGshw bbCTJCCDCaAkjISiNM4tA7LUTRojuG/EKGfiPFg3WCELF5JuNLxLFaJmKFxJHIohNUJTzwCMj+A0 UUkA36K82HZYdwEsliY7Cuo5lKjCwuoS+kGVCDatQaND25h0Jwo06Zb1yahnOcDCSuVKvruobySG stDIcIj+5p1TxNYjJsl1PQGNi6IkKoVgUIXCSaHewLEVpYIbXzV1DEGoCgPwbARhbUTLJsLuvvYd YoUjvVrAb0z7EKeJXYxPG+i8QfQgYCDaOmtLwMAVV7zKViXLmC9FFV6DSoTUfb5EQhvQPaNYJfwJ Ivlwz3lHCtR5s/gYyDCdNGAbUPaCW0RXHs5J4A8sHQnEhXLU2MwQjoSFp8heZonMAakn6wf0Wle2 pqMaOZBeME0XgEoxD6aAgRDTGIPhhogqVYE+GvcfFsmSIQ+sH5Vsqjc1m8YiY1JZuhi808QshLMc JB46lkF6K3HHwk7XIBmIaYxVtAJuBYpprLY4sABGtSqdbCSFeFicyIR1jUirBHLBSn0wjFWkFCx9 VHIZNF2gGiWsliO2JBCfcNENXSElNgUEk+IZwECTBIhYHoBZB1XswNmaERzqdYv+trXc16xXkczz EQCtrZyW0RL9tGDKJJ1RmhcwbEVd9a6BB/0SSptxtQBLWdrCtKoeDLSmznaA9Kqgh9fNnQW9akDz vnEGQLGqFN4vPC/h3pNetAkmFN8PJFUnGDLRIJ3OIRilAqX2jRObAeV0iwHLh7OR3YQ5BodLbxuX CWwobLlN1w41vjWqYvIriq8ryYgVr7MGDO2JRY8XH6w4YZN6kQRYfGpiQhJCAdOY2MQj6gE7Urg1 ugdNoXWLpJSE0gBYFVrs54T8jA530RQua0kdBMRKZwbAxMkBMBrXKufl+cSMI9d9gJ8PYi3LWVUR UPScgA0eLwCT7IBA9jYoyUZKg61L4mVLssTTuILQXiJB8lpEPViuikR+QxY8WllUKiDj7SJ7V4Hc iuvlSpFTwI5J3F1A5Kham0ENP6toQA5zsrXhLJsauUYgELQJcENK0m8YH60JxDdHi1Up/GU4PQ4x dbjCIr5Z4FVRU2lA10L6+YQjwq3GDg4wF2Vr75ttYReM6uk1HBg2iecjACwZOBHXGC1qSMrGrIAl CTxY3bMCSGpqVB+m1QKqplzh8mUF21joyvbsABDLkuTXtFvKgb69Mo1tRRpe1a7nCCCYKE06Lhm9 TwcLgaRtl0N4gDtghCpHdk7A8STz8UanGaIJ6R60MBe5dayW/QHbEQhJYh0rLFLzsNQihoEEX5Al rEh2VeD6K1bxo9lcxOZAeSsCF6z58KgIMsyfiZomSIpBvDXEuDpSsfs6qvOBdNAlARa2KlnJAp2L cawmgzXqmcjeHA5+4XDbw2kX2RKcIrxjrrUqy2gcQ8RLNk0mAhXopmrulF1cAIMHedHS+1GOPTAV wVUGnmsHL/eD2TQcgIGw4es8mUWFZDA4rExV0CJWwNo6NlKGk0WKuUqMgeEbGFjJOGYFiYOekt0j wBukNuz4Ifb5/mOQjGOBR4A5g7iuq2gbq0ipEi47GuuJo/Y0MJA1k1kEaRLe/8Cbi12mlFMTZB8l prFwaRz1aW0hdiWeQZCKkUGNWIX0hRY1mqV0QApxYCEYMQaJj7WIgOFAoUnvR8xeEbao+dCAGS3a JGIHRTQ0VCRriVeQOK9UJBXQaCuyw4EHkKZlCcDCS0vEIAssnopOPCAWRwocsBkyjwDSJ1tbavAF 0MQjoGXpAOvvA2fN3Je4EAHVNZ7V78J9gRHMiXIyMw86wHNsmcHTTkAfODE++Ky/T8BwThT7keVQ sLdW8i5Xkl7MAOalTsO4HbJfoL2txbQUlqNEQgoKLFWxsIYaSWQlogknMGd1wRqsWvT0wCojz0bK KmvFWmNKQe3GkM5XhfnRxQciEM3qAaxrYXxEfROAKOUi5kBtG40g4FrhW4AnFONYSfo+wKxshAqw UtQOyhCbB4KpcizwJAYarT20/iWoKuYY6MJB4G1xlcgAhTVsxwSUycDSlwwEM55Yxth7CdwddZQh qpKERi3OAvA4kTZUmHobJ8VWmcA1C1evwBZN/I3JZRVHNxZc1JJpDpEzG8yQYFCv1tvItRQCrNlJ pUIVzQKbhbSu2YjmWD8OEyCmBToVjFOTLEAqyEKU1uG4cbfekb8m3QxXFMzL1c72AAuQEp1YthJY I9IjmCW/kyAqF1aLua2uHOsxGgMQC1IRVYBaCY8JPEm0eDJFK9kUIOdCvAMV+WPQ1ShJigM9jYmW WFAYEhIodKYIUa5kIQy5dzpa4Dmn2J6BKnaSTjUfLUc2LlLQlLUIFXX0VUKwYAeRpQNDWpcudzoT 01hVCwn2ytfMuClS3IDtgtTmIIyLV284x5YJM9jGSpJlw1Vm4wl0UFaWVWWeRMZ+IpVMY+w0lhEv 9BmrXLMLsIyVbD6PLwNJTjMuyAYGzIXvnQSYxgpa2zRdMI2FsxqXxttoGitZ8uZlnGNezJGvAe4E HXzgjlTcMxKD0NhiRHQ3cMAWWBxmcUG2nTixMor5RZBMo3EMfpPjxDpecP4TLww5eGAqLKNrRjyk LuAJMvvheSZ6DUpihwQsO/lgQCD9R+OWgLNZYXtuFBi36lo3rl4Gy29pAmc3Gt9F3HK6+2GorHQF PFEKAUSLjzZNnAI4x7mqiX3gd5ZwM0QFkjH7diSchs6lRd3EfkBf2FcLjlTtkgmHXIwyrAq+faqy TfwLVkvr+3C1Sy7PEa273OFC8D88r0rdQyoCtLZWN6kKnH82tiT6A3KSlvcjrRIuvyx0TtfEOFbW cr6FBgYg3MgGsQSYFX/+RFdBY8Bax4IU9jNoI7alaB2FWoeWZdqCSNkDWCyUiQsATo9M+Bm/ACMo KnFMjbwF9Fa6qsmH4NeiaDAs4cCz8xfum6uTaaq2Vtigku6BEp9tZJhI958BM94qQTM2DMxg2sjO MG8VgOKenjN3YF0go2HGCIInAGmFMpYRvJkLEvVy9jIw1iXdzowVRZtMqZtMK5iDyDm4yeDCndC9 zHAlEmDONoevXvex2NbB1vWw4yjMluwHLIw7mNE0krAGkw/qRW+YLMQOtHif5aJDLY7zDTHDRufC TCSx0SEpii4OvMxwCRtCDigHyJ00E4jg/ijVIzr1ESoxjYXL7ohxdUSKxDRWabkK4kEAcQaF48us uONMc8tKR5JewjIpYSdj2+isl/UaJK1Am+tsBLS54HlANNSQAWcGJR1WKON6F745AljvwJfxCAKB qgvXbBsW1JEfb9Zr/xqIcQy1t+zBCzIv2cbY5z8Xj9EGQAgJBWm0a2dAEboPsBXMlqRmzcR5DP1h paySGw1Gj8KKszy6mZGnj9G0jknNALaxhNNYIwGMS2HkmrPuApisgiwpqOZwogjz4ODHNxpDYpij I0Nr0p2Ayx4ZrFjLQiyhF89TdJklSzGw2lXJQJQa3skcPKKyXNEDtrHakrI+qoSQeSyqqDco62gc Y4Nm0jGoCh3W0GQStRH9m8i2sXdM7T943Y3rG414yP0Hbwj/TtXT17xm+p7/Lgufo8C3llC4t64e bka+6ekbj3DcWxVWIdwB+ELxbyX83adotmFC28CvtlDiJoguoys94DA/zxcFHFxQVxnIU1SgavE0 FWA00BMlEPAcowDrtW52ETAma3Gyl2VAHphgVwYDOY5hNhkYtGW6mG68rDDRmpAGJkAxu/M0BIz9 pilnXaTFyV6WAXlgB9rXdw5OyiZsLuwo/aPxn7BzhGIKZ4RthEO4wmAV3a/i4gM1EtdRVsii1aqW 2xnjgED1Y0yhe9qG2+mjtwGzPAFLOrJdAnsT6VLAqcy0AMevSAEPKi2OWgIWk/ijDBg4c5A0pQMB F0QJGFOTXg+M76TqDzBYcOI4yqrWCXuT+BDA4rxkYOfRB857kuYJWJOOyIOMVcoM4DHNEraBfucY HPhZS2DlC9F/1ezmg96xEivH9AO8C0th6U1BAiSCTUkMKQArEucNsWgMJM7XG9KDCdNhSR4W8NxU Y3vhdexHB9477O3ryMxGQPZBDsDAaMiKBQnDSNvoUhOku0q8IdH9nYCBk+dlRL5JZuY8aZmBzwxM /5ycpaIWTlfVccIBLfNO+lrCjxRr2woIlCzjTgS0y+BSidK0qC0bElSmhoxA60UEaQ== gNljAtSYqmYNkJYbAqbISpy4jDDK2QQqUIZx06ISmDiBoV1YxBoEysKKliBrG3bROL4LJauoTaQp vqIIBNlxOeIlecUwS+q1eHdrW/YBcbsWhMciI7SAlwVMPlBwHz0tIgaGlRKdJ3xTH55h7g2m4SvW L+LtXRHVsXVlBp5rgsFj0Jt4crkPhi639zx3SsnmHev3za8u3bc+v7IyPz0zfcv64sLC0nxvCPnp IKN4zCXaClVUK00wWOdqljMNxCxY1hCVvqS9N2QmRCIopivQtlMUMUj14FN3QDqwIv2Jj5iPwoQm Mxy9P5xSNjjg7REXL8tayaxtHQfgY7AryCI1mRfzAVglshM4K3t2MgOpWGg7Ctt8UcjkAitQRA8M BspqzbUvIhyP1pNxzQy4CIUzXWRJC2666UaonXPX2kYskMln6NQdsTs3l4/Or24shnOwsrZ5dHH6 yPriyuZGk1vDE4ZZB7qeH1WRqx2J0xVzYQkK9lxNB0UX4owA9lxtxZkQQ6wTcIGlYbYCZW1BH6Dr stlrAvIASByP0CDqoRNuo9OybJw0GoAASaUcB5u1TdPKeu1bgYWpm+6NDNJN9wcW+Jp3rEIuikPT 4YYfWlpc3Zg26jXTM6DAADkf/VemHTiqBtIfTmhpC77B9N+b7pvSgbxOQ/wvuCLI/2cQysieDPxg WAxXavqmFbQ533TTZJNOapNgbwKtAbVa6L5Ae2HYnFkFisyePQobiKI3eN0UPv1/Rn6gmVSUnwGo aqBe2U6BtAQ6Ae413D1MQ3LL0vLi9VlGkrvmj0LmknDzQ5tbp94dhzGDejT2ZS6BqQndv2c6UKvw J1zY+7duCz9Se/pTTVvg8Et8LkCm1dT+/TiKm+c35q+fBoF/6p63nvvsMJ8r9/5Axz9DdXvK3346 RnJibz9VIzn5t5/kSE7tAE5gGKdjAEMN4/QNoOMwTvcAthzG9gzgOMPYzgEMGsaOj2H7B9A/jB0f w04NIB/Gjo9hZwcw+TP5M/kz+TP5M/kzXn92nHSOCP+w48PY8THsOGs9gvLF9g+jdQDbOYzjDGB7 hrHlAE73MDoO4PQNY6gBnI5hnMAATuFITubtp2Qkp2oAJzCSobp9XvOzZ88Z8bNnz/OO89mz96wL 9r2UP/suOGvvwNZ79p69b/8b3nbHnfi5421v2L/v7PbW0PKqm5c+9Oiv8OfRDy3dfFVr6zPOgpYf /q3P/dVj/Pmrz/3Wh6H1WWf0NN17/uUHQsvPf+Ub33qGP9/6xlc+H1ofuPz8vT1Nr/nuD/0mtPx2 WqJvQ+vf/NB3X9NovPf817z3Jz/9WKMlt37s0z/53tdkjc84/5r3/vRnn+htSa2f+OxPv/ea82XM e866/Lt/8rNfe6Z9s5752md/8rsvP4tXY+++Ax/69BMDmobGT3z6Qwf20Sj2nH3V0m8+9q3Bx+Bb j/3m0lVn76Fu3/zhz3+jZaxxzN/4/IffjB1jt185Treh469wx1t2mzrec9b+rbqljveftWfPBW/4 0OeO3y10/LkPveGCPWfse9ujf7VFt6Hjv3r0bfvOOOOld370sYFrK59nHvvonS+Ftr/Spe2v7P62 3ddsiL0YZo87nZ1nvvo7K1eHQ9nhTD779F//0t0v39vprD/ztT/6oTe88IxOd+ibX/rIuy/Dm9zh bv7W6gxjiA53/uaX7h0elwyDowbjvmef+WYv7huEU595+mtf+ve9OHUArv7qX//RR1b7cHU7Dfid X/qhd8+8tI8GtNKWlbtef9n5gylRg2Zd/fIXtnQaWzdo4dl7zzge6Twujd2//82rh8CkPHXPW2JN DjZ0395wI85dm9o8C1Z23rNgx30rOrg2OPI/gXxZahac5yGkS09DnIu30zO0yOF/uiggI5Qr6vAV k6N7q8HZYQbyVIE/8gz440FAS/wSfyHXRkupgysKfEjuDu+I7ksDXJyumYGcr9rXtpOvFDguoaND dFwK/zs0VYiP1MH249IDP5EDg12c1JHBHk7u0GAXJ3Vs9h9cPdmNiMWGwkM3vnX6xs2NtWm6xksf zEoE4Z5NX3PjobV7Fw/e+Nb64B33Hl1cf3Dx0MG3LR47SI2Oco/5WKavu31t467FhbX1Q+E0w89b ndTr7lqcX75tPvT4gdB6+poDN771Vr4Ebz+8tr5CP72mf0RhFe7eOLa8eDC9Pztr4U7duLq2Oq2r Eg/XJv7D7nNNz/hejGV0DNbjpJErPWBH1VrEx9xx8laJkgVn8LowGVA8e4u6tD1tweGdYs6zXhOQ R7Aw1QSXeXZF6bWSTLHZAAgmTvIy1tQyTSrrsm8BwH93AA647rb5ow/gNzV93U1ra8vT17x19cHF 9Y3FQ7QdEXzz0tH5e5cFfM8bwn828fdAOfYfzD2pDvb5UoXTyt5U+w82fKSsjj5SWnykwn+0In+q Dq3xR3yC/ltlXmPsUHWw4VKlrQWPquNQUvz88/jtE08HzuLp38Pv/4kZjd+Bv/wN/+Vv81/+E7b7 fXjmW5847htgXEKVw4K+RRYuUeb9B29v3zUtmxJu0vQtmx/84LFp2MfsAu0/CBse/VcP3vM6vJ6h K2oUe5hbWn2gb68PLC8dORJwRLq34cb2vIGW2JAj3XGcWHvIxOk7hxka2IXn8WXx29Vvets9t934 Wvx+5Z3L3/c/fP/anVfCX677nu/9n/7XH/r+gwb+csWdK9/333/f6nftx3avfeN3zn3nm66enMeW 89jjzd/D1GjCbwMIS+8PJ0BaqIuTIi7UxUmQF+rgZAjMQN7m1HMsOYNwPJRyEh78q4FzmV9ebPju EwMSDkOvE/FxztrQ/sUQdO8lXaaGpGvvmXbltKta/Ivb2qJ/Mban/27lX1yU5fD+xfHzJv+Dx/9z Yt2ewgFsz6hObBinfEgnP4xTNaRTO5ITHs/pGMaJDel0j6T7eLZnJB3Hs52DOf54tnkkxxnM9o/k OOPZqcH0j2cHRzJqg8nHs+MjGc3B7Pgw8vHs+Bgmg5kMZvJn8ue5+WekbtNkMOMymBEZzwgyVyMy ntEZzCjLTTs4mP6R7NR4Bo1k1AazzeM5/ki2czxdRrI94+k+ktM9pBMYyekYzwkP49QO6ZQM4+SH dMqHcQKjOt1j2IZPv/U5ui8ePz6Am+4986xzzoXPOWeduYVb5BlnnnXuBS+95LIr9+/ff+Vll+yb OvvMgQ+Exue95JIrrq3e8vZ3vft73v2ut7+les2l+84b8MCevefsu9zd+s5Dmw//6E//7M/+7E// 6MNH3/ud/vJ957R4f+454wVTl+jbV/7Fjz36737v05/7whe+8LlP/96v/9TDK7frS6Ze0PsCdBR9 48LDv/jxz3zxLx57/Ml/+Id/ePLxx/78s7/7iw8vvLEv0GHP3nMv0ndu/vh/+PzfPP4P3/xH8nH9 1j9+44m/+fx/+PHNO/VF5zban3H2ReXBhz/6yb984qlvPfNtcZ/99jPfeuqJv/zkRx9+X3VJ3n7P C/bpg//Lb3/hK1/vj0n4+le+8LFHFquLzj4jDWVq/50P//afPf7UM30+v99+5qknvvzxR96n970g +gefc8kbNz/6hcefbnVq/vbTX/vyxx6+c/8UD2fPmfvMwo9/8itPDXCB/vbTT3zhoxtvvJiHs/e8 K+54+D/+5dcH+jV/+6nHPvlj89e9+PnoMP2CC8u1X/x8q68yf575+l/89j+/9ZXY/RnnXfFd/+r3 /3bQUGg4X/3MT77nNVN7ceR+5Zf+9MnjO3p//cu/frTad+ae5+0565Jbf/Djf3O8zkP3//jY7z38 lkvO2hNW8bK3/8gfPb5VaMPjn/7Rd1x+zhnPO+PcK7/7pz735BYu9c88+fmfec9V50Hz/d/zM1/4 h62af/1L//vhmQv2YvOf3bL5t7/5F7+xCXPt2Pwf//Z3f/CWi8/q2vzpv/t//uXcpWefpt7zsQ+1 MsOt+3C7OuSZGfJEDnne4TZVR375i8frPr9NcFfvOm73jbsql3UA3ujDBIQKPvblrw3AM996soFn YHH0+x75+JefaMFioe8n/+J3G1gMMGq1+MjHWnHkU49/+Xd/5HCd4UjA15dU74sYOLYNGPjJv/38 xx45fH0DA+f4/YlvMHpH/P63f/r7v/jw++pLzuulB0w9fvezf07Eg6jHJ375X63drnqoQUabHv6p XyfSxLRp9bvKy1vD5JDy+e9871EifEL5rrhwAKkEurrv0tcQWU109QUDo/vCA2dP7SOivSXVpgci S7A1T0BP7OkWkdjpc/z4ioHRFaqKSZA5c/ZKEww5BA1liNaQKLZi13NnYzU3qTjFQIlucL63LRQE odzXWa8JKCOQ1JEMhlIOnHQ29QqFscu6bo5AgBLgwaPN2qZ5Zb32rwEGWLRFVXjDURUVLONMHZZz Viufu1hiokjM+Kmw1C5Uly8gCzN8gSy26ScsF8CvxkLJhZ2+Z6X34XrLhy3Uo4O86jct5A9bqAJV uS3fDLUpDKapHPrNkLwXsyXftJCCPhSmLh7o0djJh17VsVZ9TTW0VppgB9W5HBXTK6UGPVaAt1XP uWSglF8tqQBk1tZBJnZdN3tNQBnBwlQDDBWheD1Sr2UplXXzc8lAKdTIo83apnllvfavASyynqxU p5XaOkRKl3SZdVnC/7Egw0wFxQxKiJPSkFy9516rWa8s5m+HnNQW6ivEL+k38npVBddNr3y4hHkS WBW7pS0MqMooLUmnocrECoN1XXIpEmO1FLXgSrtQ70cKBhWUqJ2AsaiANVBzjsG6omzccGNLqjik KBpJgJXkt46FBzMw1PCuJPF2pbBYMGwL+Jw3RlBCzndJJQ+D9bzbUr4Ap4XJ+EOnqqjcdOsSHBiI gwtM2gvJwwkFQ40b05erN/zmoCRTHVYIaklUqhIcRpVBXVxdeHdAdQH1QpwRIC+oNnH8h6qCaogG xBceslCAGupXbfEmD1WJMESu+5ug5gwUHUso9rTG0ZyiMIY6BibUEpgQqHn4f2sYQ0tr+JGeoP9u GcZgne4SxjD48+ZD73/wA8fC5wObRw69OcEPHPmJ3/q/P/Xpz/zxH3/m05/6/X//E+tv4R9uefg3 v/j3T7E09cxTX/2v//GR91wHP7h/+ht/8XRD0vibj//L2/CR//kTf9fkz5/8o3/9Tnzm2G/8eeOZ b/23j//Q2/A9t/6Pv/Wlr7Ig8O1vfeP/++LH/rfvUTK2f/1/feKTn/qj8PnUf/7Ev/vx9VvSuG9e OLL5EM9n4dYTX5exD8u4o4lxjxuaoYFVCZjHnAzmCXc0j+6AkpQD2aGW0Gc9Ie0nS9prJu1QKwJI O77BBRoVKIuahfoqven3Z70LM5qBOtoOM+/HL/wLlS8qsOZFwMkainkmqj4GOBmKUxKWhTKsnDo+ IFPdipPbWmNwBz5B/906tKxwnWLLTv6z9AOLW7ZZ++Gf/z//5M+/8Bu/+HMfPjKw0Q== Az/yq196UvQhX//irz5yf2uzf/qpx5t4/O/+8J+1vPHnvtyv7Pnyz6/2NPv+T329TSv09U9+X6PZ 9/6Xtlbw+eyxrNnKpwY1e/bZT62kdj/z5OB2T3wkNnv/nw5u9uyz/3VT2v3cN4/X7ul/w82OHLe7 Z5/9wpEu3YXF+Tma7BeO3+zZZ//0/dDukSe2avf1R6DdR7ZIxxIOBS7No1s1e/bZn4d2v7B1u184 He06jO/RYeb7w60nNP88+cPQbnWL7Q37QUfw17Zq92/pHPzYFi/+6o/yudriIHx2jQ/gT331eM3+ 7ifkPD/wh8dp9tQnpLtwez8zsNnTf/C92cU89ieDmv3n5kX/Z59p3ZWn/qDZ7HnPe+jTLbfk7z7x vc/r/az/my/1tHriT35ira9Z+PzAH/599vLH//gj622twmfpkZ//jS8+HljWp7/6+V89DkKFz8oj P/Poox955PiNTsHnOcmqZrxQG9c6PC/Uw8DanPuYcK+nn3stSpQzYMOgoq7106hoNs7VgxTNkB1l 1peujP/PlQlhHr42XCutrks9YVxHhnF9XhfbD5iK9u49Y89xDUV79ux9/plnviB8zjzz+XsHNd1z xvPPPOvsc887//zzzzvvnLPPOvP57QazvWeefe75F7zoxS8Jnxe/6ILzzz37zH5jWejsrHOnXvSS C1/+iovC5xUvv/AlL5o696zeLsGYdt4LX/Kyiy555aWvevWrX3XpKy9+xcte8sLzek1qodn5L7rw FZe8avqyy6+48sorLr/s1Zde8ooLX3R+aJh39/yzz3/xyy66dPryK6+6+prwufqqKy9/9aUXQcPn Z34je19w3otedvGrLrvyqmted+1M+Fz7umuuuvIyaJhb/vacec4FF1506WX7r3ndzHUqnBitrpt5 3dXQcN8FZ5+5J3Z31vkvecUrQ7NrZ5WxLnysUbOh4fQrX/7i82Oi0D3PP+eFL7vk1Vdefe112vqi DJ/CWx0aXvHqiy+84BwZ4d4XnP/iV1x6+VWvmw1Htqzr66+vqxIavnb/ZaHD815whkz2gn0Xv/rK a2YUVKi8/obXv/6G6+vSm+uuvfqKV120b4qnjK8No3vtrPFlfcPrvyN8Xh8aOuhw+pILXyjtzjz3 RS8Pr732OltU17/+O94YPt9xw/VV6PB1V4UXv+jcM6UdDO/qa5UtQndvfOOb3vTG0GFV2Ouuvery S7N25734Fa+6gtt9R2j2pje+8fU3hHbq2qsvv/QVL+7YX9YOx/e668J00/jKvvHF+WrH8w0LUxVO z8B8X/bCc2Rdzr7gQlm/Mqxf+MT1e/XFYYd5Q3B7aT9CQ6ihivuhQneXhWmEDZbjcu6LevfXWcX7 +8Jzzozn4Oyp0GHjvGg5Ly/JTuoZZ577wgvDMc3O3+zMa0MzOH/npJO/5/lnhWMP5/nq175uZmZ2 Fs/zFdN4nvM8tWC6Dg0vnb5i/1XXXPPa19L9eCXdj+wi7aGGF73yVXjdwoW7bDrct33YLL+YgAzO f9G+l1/8ynB7p6fDBb7korb7Sxf9ghdf+PKLLr74kosvvujlL2vFB4Q4zjn/hS9+yb4LL7xw30te /MKpgF9aMdEeMKufd/7UBeEzFRDWAHyFBnjAbPh5AbQanLgXmsJn79aW9z342aLRyX8mjOtJsUEt KtdqcKLA4zCtUHizpPKxXN08g0BNamJXA49pLVe0rVVh+9hVBC5I/XdDVYhTWxcmVFZVo9MMxi4M CQJ1ujW5QMTuPFT8Nj2csgAXphrDzNqm+aROG7Me6PyA2m8NJkc1jcrvyhbHY0j1bFWacjqgRl/X RYMhdSbO1QaG1Jrc7yE8GhalrLZ6FMpPa8cmuCK8TOmi49tuGv5tPswXcl+OlRnOGeGFofA48cJh +kH4aeWcW1rDj/QE/XdLzrnQJ2mG6/n429/13vfNz8+/7+B73jXnen7Uty38ix//hY/+6q/92q/9 6r/95Ud/9Afvu8NmP1///kd+5ROf/bP/96//W/j89V9+6b/83v/xw++/Pv58w7FH/+DP/v6b0R3y mf+fvTf7bafZEsPyD/B/ICVRJMWtu0k2Ny3cF4mSKJHaF6pJNkVKJJvqJr97vw/OIEjyEj8FyEMe YvghiIMMggQxkDwE2eDkzQYCBIYdA5MFA79lJoBhBBgjExupqt6qm71x+X3Lvb+5d35X7K4+VXXq 1NnqnDp/9c/+/B/86d84kV7T8z/9X/7yr7Vek7/+v//hf7ag0Ws/+7f+/l8shxj/5T/4Wyy6Gu3w b/zdPzPwzvzVn/3df/0Qvf+T/+r//Ovl9//if/8v/wS9D379p/+rgYf2n/3D/3gSRgNo/rv/w5/r G/yrf/5n/83fvBTHHx39+//dP/kL/Lbmf/lX/9c//q//vfeoNEHi/t/8j/7eP/qnf/n//L//37/6 l3/9L/75X/zTf/Q//of/xi2hIjD58m//7f/iv/+f/8n/8ed//r/947//3/7nf/vfekrrlueqw/3N v/V3/vRP/85/8O9MO1cJoyWkL+6fnu4vU47W2+H//VEKTEMp6YQr6+RjWispTQUlfvmckTtH92Id h454qe1GLh3xft+NnDri/b4buXV+xvvnovoe9L/D6UQsTSVIIuWO1gGN+Ns8MxXgbbgZ8Eefm7gF ViZb0GeMNIYrDsatfIzdDSx/YtGEctCEtm1i34Ik7JskdPf/1qfCnJn22A7kH516CWzPmQluV8Ql ZYLLleHQ24GzJTAykjeGo18JSOnl37O9BYSqXRfD25hT3+TCRcrwwkVCayVQMo805dTwTsRYJJ5K I50bqJXy3c/qU8BFaCmQDvI6Kg25U4oEr5OiFZHEfotaPBUBHJ3WNiOArkqieDkMoPpQ6lu8qV55 Cm8MT1JieJkCFGjRCdir3Lf8W7RAlCFizdTJYACX5m0eQx1wq8G/GikFDZKkKI3CCcil47QWdCom IgAYCykqEgeSQt+YiiUidAKZMnJjoLDHIokkmUgaQSbT6MZSpfHERVFA2qSXhwGlELxqVNOYjgDD AKnT2sbiMqrtSOiKTseX26GbPB01Bc/pGJHWNjZBA7boGBqs7BY/EGTArkymHN3ET7pLLqhppCkS 2ktgWwLEwzinJJWIQ3OdiCUg3cBoKYAe2CYRBwIW/kEBYwsIc4Og7wS80R5d66rZO8pTYJ8ARSch RQymEuga/Bgg0bR0c38S+y3unTj4IqFrRgBrN5XSAVQfavaO8pROih1qgMLMApJIKH3Lv0XDXxki 1kydDAZwad5wqSDFJSM0oHwdPtSnwJqlpZt6Y6CLVALuEeggSFDqmOTfIj4SoialaUbQ4E9E2BhA 9aEGH8pTmoYdit4DBWgS/CXhk0piv0V8KEPEmqmTwQAuzduUl0hFLkga7gAxHYMgYrR1OkY8DlqE 44kIlU4pQbfipOPy9JJgNBSxlI4RBwYyHLjlxzGKjFCplOSYIJx2JQYFx8E2jEEev8pHiUgK7Cq7 caFY9DSdkD6CweGxtC0mwLoQSVrnMgmTsUgS2hl2H8cAJihK6jEWSSdSMMje+qM4LPIQT8tR0lAC pew/SkQSKTqtYJFME7ajg94gQHHyJ6lUOm6LeLCrkzRN67NlHBEG3HSpZBJjxZIfsiQdS0v8QrPb lac0+IumYpJdk0qk02IgosxFqCT2WzmnjqUpbTNgu5AwrlEDUH2o2e3KUzAt2SBSgcaSCvcUOY30 Wz6ll4aINVMngwFcmreTI/IYcg3D28bh/8CqK2QK7n6aBNSGlQxJpIBCEIcuPzKRRmYdXPB3F1Rn aEhV6kKpfykvUcgnkSBS4uAoIOdsT84dVzMxHNo3qmbi2OduiVcrpwLhvtZndeXByp2Cb2MxoCpL 0pigab08U5/Gk2KujOi6BsIgLcpoglayasACJbCHsocdiB9S2xamFMTEhypU9SFO5upTGuoDMdqt AQoEdToma3XyAOSHsp9dGizWVp0WBnUJA45KOYlrQknUSkuCLkmZyjmY8gIUQxJlpEh/6OJB0vGE RNVkgkZyBLqXUP6eIV0j/7Tim9Zl78FHp9Agckm1BDBjRa6/ZGTsGJpFBpYEgmBodhgaKDo7RnTu GBk8hqaRgRUl+rmMTC5D40xnw3k7A2OcEpLJDA1Td4+bzLjFtO8WhsyMdU+4PqvxSMo+yDpJNpn5 nOWnl4v5eDRlKxzfmvHMjyyPtbcwgpGPtHPBTZtAy58DRT8cxmoD4C9cFzP4JiW+aY4X4N/L7gfb m7skZ0uBXwhD9zkzZd5Z3n0J2BwfsH7nFl8WmfF4BCh8Nhz1pJZtjhtH3TH3bO6ec9M+FzVoCtQ9 AAJvT8P2sxHACOc2+kLTGKB5hkBYdKH9IAHBcz8wYxZri0AYf0AR6nisoCMQ4oSJpS4ApVxOwSIP NaBbPYZnulyvNxxx7ndWQCAEzvqjIsN3uWlvNOXcYbcwWEyYOfaFiAvbz7j5fGQ2OgRC/qyy6NtM oj6FwxfmPAI84xc//cQhENaflX8Y9dnpTwCtHM+CL/kFeOBkIvne14Ll2fFY7I8VBEAmAXdEpGuw ETRUveXdYUJWYBeQhELm8Bcq1gP/K/6/ytMJq6Gu17NK0WLPCfjfBAH/S6P/So6ZrfeMbw3UNXhA iZMF2l88IU966x3HdLh2JxRMQ92GEj1736RnQotsCkUhgn+ThIR48hvNGWeLqOs4PLlFVBaGMw47 nPY2t4PR1obSwmCLQnIB7FxWhcT24FN3IuqW/wOPrkgaWDBAa3ZLusim+8ZkiEZc1HSIFD5E8mce m8iqTccW/3nHZsy2TUeX+nlHB6WV2VjUkUC3JkEp7kygLaegtykC3ZoEdJdCjeRbD9VQbJqhMfnz olGvlwjmIyM3GdnKrCgtvpEtY8EVPZtyv5uiH0D/lsp3RS/AIIHiHM0D3fwHVn4bLUr6eGU0Bso2 bF8cMqOpW2wgPhVPMqJSk5DRR6050/u0/qjACKMe/gXPfbKWn1Do7/ElL7UFQKzcDlGxmTQ1FdvO 6tRFS+zAnXW73H4MDDQ1sm7UqzvrckebDD83mEsRSN3FaG4yDYsP4fSssWY1YSUU40Zgyz+w08s+ OoFESFOxYHcNjX1IhooaBbIJYiymKm4uPA6F1MzUXx4MWCjHB7BJhBkBEyYqbg4YECaRL0Q14LJA CggDrgflkzvaHs3HtsRBRohELCE6ntz+a6Y/WggOV/cXHjm8hyRNrTXywpgFlvba9BVF36+6n1Rq UT83JRdXVDkVRy/Qt0YcTKxQ/J2L/TFzsZWYlr0T2KZ2vJEbeIucsMRzM3dryPS53y0xlMtJl2fc LAyemjKmDEXTyik3kZ1xPYHvGaMZ+kyJNAqAjVBUMp6AfxBJIoHOe0j5fJuA/wsRF0+niFh6I7Ei 9MbIq0dKg+uOp4gGCJnrDTn+J/QAhhFIz7gZ05M+EulnxowQFKUFjEdGDxQ4fYb/lA== vhEfdMcL/pdhpgBxcUfY+mb8NPWdn/5K+Ola6P6NMOHNgnmdM1xjLouFSep4LHiDXjBu7n26mHKm bFZpuAKLFXE5lzuXTjIEPQsTesyYrXUqTA9ohuLLuObdLf5OBisGHKKoWvwpOxgDE/JBwzd5GNPE dqDSyIjdxyUWOwPGLwfsSA0M1GdjNGUFI9D38OHS4Jss32NFOHFCN3jsnX5IJfadZ5V+0JCmi0mR m42Uh2L7CfcD7GWOnsLL5OIETeMvb+WXv35VPgYGn0g5UuX/WNiDjY62anLcHx6/IE2ZBfkrZxXw 5MGUV+hffgNmQfxGuQQJb40mfw0Gvz69dDs66nfGtv51Nd/523f+9pvnb5HUr4K/xRzu6e/MbevX xm7KxsDnRjysPv2BGy96POdm3Xn40Nx5Jr52TLIyJlGSCItzD3EoyhQQT5dpW3xX4/gR8l757xh+ lnHn+d4QSz8pjYTZmPlR/GkC4pYZL1jNnpeeSx6u3zD/B7LOwhymEr9yIUBbyIClwW9dBJAxaAol f6OCgIokqTj9ywsCYunq6u+yYHuK7hrlJ75rur8uJveb1XS3yibIb6sv/oGHhvxB80BDfdhhEa0/ VG4XIZLmDE//8tfI8/TD1/A8/fB/PTzv1x5ekJJCCtJEOkXE5RBTMXMrlqZgCTYKBSAoOfREBIal ktSvKMYgHknC1EldoIFqDCiBBpEYzD39FUQbaEvVbVl4/awT2f48HEVNFLjxmHEDXifMGB5sdfZ7 +MQvGD5hOeg/NvXDxgSLJZAmQsYJlFtLxShYLTMB9BHwZNvnDNsPk/pl+JYoRq9RrmqR46csLywJ 0vz0nRuP3AwPJD2gVmY+Mvc3LjV17HtU9Yk/wtjfIuS67yxA3ISbjpjvPPd7yNqK7FThh5J14iYD islLKP95wrjgi3v2De3gb80vqW+p6P2W1z32h73use/Lbrjs9B/4sn/f7sbrnvzDXvdveV71h69W XrDg7Q8jboyON8V0/D9O3fIanrLHY2QsiXJ5xGssEYVB3xu6ISsh33spPbnPa/cNuv8KrBwRoRPL i0durpb+TGiIxZJUAs6TlvLgRTTIfsp4PEkk0uoTMzSQv3E0xBOADCiMABAaaEgi0Bcbg5lgFHqC 7kU1QwMV+U1jISFd8ZqSMt8QEhIw1Q15qGWfdQJdj2CKhBhUx3/LWBCnp155K6KBTNJi7T0x9w88 EbeOGRri28HBNrSRn2sT0eD/IIpS0qGGuInQDRsolUG6L1jaVmaI+zbE88dne/xcEkTinLR4gCXJ D7DS8MArLnNQ6YnZmtO/jTX/9fsZfq5FFw8nCXifOhIK4rLLPDJOwyRq9YnZsid/I8v+LVf9t3Qj wZpOWTvD8Q/f9rqcMeCP0XTO8MKIc0+4hcC6Zzw7Wcz/SG2w7/79X9NxaZxAx6XpGGLfKXjvbSwR iZEpeGJKU0v1PH5NB6bkNw5S/CMmCzqN8luSwCKGh+jQYRImKVgii0wDwkhTqaWLqn9VlPFNGP52 KUM8c78cDAR2Dv24w6UT91aPE+ZgXaZzDobi9Hrw0kXTQ/dzrj8ajHqM2tTpobtyDQM3EMRcDils 7GM6nwXwBpPxaOJwPX+thG9E7VLUPlBe3UrJkTS9aTbXHy7BpL4TDIoxSsSgAYToJQarDG6NXv7o 9GK5VNt3jfi7RvwLqz5p+rtG/F0j/q4Rf9eI/+gVnO8a8XeN+LtG/DNpxE/gKbMYz18wJbg1mszG ihJsksMKj2VSKGwFZT6J2WRJMYxFmUze8TqTUvRXE+zGOTZcdPt+edpX7963vcC/ycCQIxYNutl1 MEz/0zX4TgDbD+LqJYAmev+TS//c1ewtY8JfGDHTHie+tMcIAwOjeLk5LR/u06gaBDzlhwdY6CgT hYagW5OlmBj9HxCWWrNDhqgAosBfsHUcFjaJi8dKkbjy//DrKs8MRnNW+jShROHIMGJyeBIhn6vK cSva/0UjYacsL4NCwT1o8FImIiV94MbnrPsDQqksJvJMSHkClNwuLkGD6AXgSYRfOaBIiqASkTIY sGMYoyiDUpAqj1vpm5DzH1NyYY5EmkIVniMx8ZJmEeJstuhhaI7JUSpq9IZ8Bk3JYQmJuEQDMdgk jorMoD+0EN1Cb6EQRFwJWpDjxdLy0aeyoCpylarJUrQUhDviej1ujMrKIIgS5pGKHonJMBLSkCSS vOZgrZxzwDkUlAGMEbT0GQFRi47V5VUUv1p0FYy4lUutoREjrolE9WoHM2Wi6N47iZzT0n3XblLN S0UfPQIEMTh60EaR7sTWfCVdkI19pnxAyeQvIxJ9IE8Etm9xY3nWhERWaBLw/9xydCvaLiNmPFYo QNotbokglVa3LGDx7iLLzzmBkbcW1rcaA6j9Ysari0ZLbASTZFhDlVzUyBd1vIQaN6aQCPz4HAhM xv0DBCF/LW3OmBSHldYV1kZDlaOwKGwEzDs/GnDv45EyDhnJCrORCSwSk8alph7L3Yn/q0KdMAr/ SMn7VAkIVKJ5CPkJIXMpmewSYgknxJPHC1h5jhl1RxLEpEjPCmFD/qJGW9Eyn0qKnALCyP/004Ln OTdQOACP5HlmynI6xMmxRhKUmMxmkmDrUrQykvyYGzJ6AYEFe6F1QtyHVL6Bi+x+xwkupWxCcZ6q JMK/0TdOQTYix0aRylrIARMpcQYyhJ8A5xypQGRUy+XZxaHCGcRNgLSZ6U/MVJUpKbe6mCKOZPQb fX07ApzL3eWBgsZMFRhJORoyJX2CACnSygwQO1e2U0IuJq8ZCi1fuG8+FI7vDUd9Vl48JXo1JfF4 cevLhKjAoUU2Igq0njASvxd1WFFdCLmnUAvAlIlljVXbVIKg9RfgLdxQKUbeTMdAlU/U4RVH49G0 D14hU2RkN8Sl5iqkPN/jugA4kHDqilpDM/wEQgT9sGMgKefsGIk2DRDxP/q0A/0nCMw1Ox8B6Qge L4ARMQIcjHEEy+g7O7GHyTz3+xjNS9IsP11G7xxKOEkqLkHUPrYTZ5IsWwaje24qjjBZtAzE4N06 XNiQBS/3ZtnKjndizFYPd+kNhNUsKAaIbGesUjqsAcwJ3OgySZNYTso1uhzB9DzDJgBoyahCo1qn MBpJiK/EmsAQzL8GdzHTZYUeKjA3mkzYOT+C9pG/Ph3A/7nk34GEACb8ZMKAJhWehawDvGguxgLc 8QD9uvHir9Q5Kg8p9aGuSrE4IvOZSatT4noL6K0pMXMGVV6XfruX6rDD3/fnjQuuzxq+zLr9v5+M p+B1GNgf/Ki7mIs30KCyzTzz84DYAnysFRCB4z6gOLGN7GKS38J/5j/OpBLT/v2p0PkBEF0Wu34T b/qDfM0maAufCybtoKNHbCaNRND8+o1iZ8pNWQeIGXO9T7bvBDNyy9AvOy9gB/bBQEkHcwPE0WLn F2gS9vPDW29p+TfEBGmJCUfzHzHdMeuE8G1X9be00TM/ON7qsOkvTNFwer2FMOcmvywn+3Z0mBEY 6OaFMg9sMafk+M33BRjLr2gofwi7VBj87lcsjX/TAl25N8gUqY4Q+ktzO9tp/OhkGj/+0tMgqZTd RIbs6H3ohMEoLX/1U/rdqD8fOpmR1PCXnVCUpBMxYI6TRMqgHT4vYTzqsfWSk5kpTX8FchWN5bct Nb5zte9c7Zee0m+Qq6VpmozHvnO1bzuI37hG/p23fuet33pKEYIg4n9YDFa5HdxsOl1uPucmDXYw v+RH76Opk5ktf/Nr4bQtbsH32AKMVP3FHTPC4He/9BAm7JzpM3Nm03GkNxzHbl86GHJCXVhjDQXn 6yTpbvKswPI/sO42+/u5u9wfzZnuaDya/6iwVzRQ1FY5jWqx88XM3WCm7wt4NNjkZouZ2D6utE+7 KyjybQoHd7VgIEx3g/2BHS8Pg3APxLYsD8/axAFxP7D8DB6SCdYf9MajmbvHQRfi7908+w44gc0X 3GI+Hk1Zt4AyiARlppaN5wA/YktYMkBGCt6SZ2D9hPAPLCxu4e4yY2bak9UyHYuKKZWwZky/rxvA BFXn0kxAmHFzXSuAUGnkSZlj9WejiHYZepxYCAHRQb7uzi/mnPsajVMqtQGI6emc7Y8YNz8SuPHi JzBK9gUjK6OVryhzRuQzd6vnIoSGumTKc39Oud4nQKX7nedkWjFpCofBzFl3FwYWS2XyACoSiqSH tHXOCkNlIigq1n3NwvHDP8UvYoTmi8vFfAb6t/4GG1LaPWNmYIbCaLIYM2oTCqNwVAwFHYL3foTh GH3Q+idWy2pgO4afdzmG77th6Ia0IAkqTqVM27gpMH95u9s2hTVHpg7b8vIpHZ1IxBLmLUlsALZN sQHYtlUGsKQLa4Raix3XmDkgvAbXY8aQwAT03kgAKm1BryxfL+Et8ddt6EyHvepW+zNfbzI86AJ8 LTRLFZicAZYcZ4Tysmua3g1HvWGT5wajMXvGSi2xGlmaxq1FF2yVCgcY2jWkJ+UDiDHaCHx50mX7 S+ANBw1HDLaioJBpFo5BCfLXIVufA+DtpCjFYAS7kXKfcl335Qx+ILhbOE2r22PKqSzaPZoiFswJ o7ljtkK5AUeyYCU4+0Zti5DTFyVOf23G6VHTS4lrt8xYvKZV25C3oyYiv4jeiky9gDN1DUsSW1fl fBBm2pd4lBVXEj+CtYnceV78CIlh/UekblCXOtHohIWXmy2nyBYbO8O22NYW3dpmxvgW2zhGuNh8 VYyLX62EcmnsOpzbbCg/wP/NdNQDypi8DFFVi4/ClQSMpiNKJZiYPFL7dvitlBPyo2YR0aCNWhch +wUdgWlALtHkgHr/o24RdN85VG5Wmirk0NO5xNSwkatLq/3WkagnLObd5pnZTBY5VgiSxlSf9sYL PYasvmvNAREBAWffssQK89EUTQEHbjJ6ayXUpB9bNdfBd+YK9XpEXQf2yHw0GLG8PYpMiARHl8NB YMjWaKdGXZPi+ouGR77Hc11m3mB+RGVgNE4mo+8KY5btQ9vdadsCsvYtcYEBHk0/nQK+Vt0+SAkx hayqIkgTsceNJDjamL7rdFBtbmY/VYW5YtzAtDHiZCXud1MxbkTPDOKWH59zU079tj4B9mu+C/QY ScujTFihUcdLHydou4/bgJ5VdcqqOZBrP2JK3dlo2rf/SOLxBl9Zjw12ph2aFQqB3Dln+E95b2B1 u41at/nRBDa/w5yStNUHYj5zhecmQED/juM/cbJeYfKSz0FrEJuRRG8I+mMNUWfVp/qpShbql7ZE XGB4a7asrI4ReLtvzHBhjUTxmzw/d8AxAf2jWGoHvHUELTNIB23FzWW92bSz1u+1mCV/M1oWPZtY jQZxnm3Vs0ztwjqdqEJkte9UFmvJ+rQYNVN4rURjfQxUI5iFzPHQUwhkb5GZif7CEavYIteqFYJS IZgXW4mNCxnwXrROnIntCtAM79ju7Yj9nUMeYbSXKJs9ofMGWG49qEQxc7Y9XEy6Uw== ZjQWluwQvYrr1DdlqjbdCCzaYm2YBSV5zPxXC1jQ1T2CZvmcgesxcgtgZ7i/Fux4zLr7I3dfTP8A T2D5XbcAGjDjHxj3YuqGqpcbW3CoEbKKl45zi5dPgM4j7hsB+uu+DLqT4M7YKWoCepxId0zwrHu6 4H5Ad1OAj8Zif6Mp3mVI/r4P9j1oBZAxHv30E8OPOdhyMfUB1R4ohoxIawD6mPkROhnRUOtToAKO 3qduTgYz9kkQONDbFOal9Fmp4//pP3ELPYAboTdazLmIYxWzx49mmOEm59PAsWATsdkAPW4MSxFr NNWs2w+6EDdCUXkvmZ6FkWx25lvFej2VKLEQNnwZP7ncfwoe3h35ssx96DS2fxku5PjqZJh5n3pO K56Q31ccMRFhj76plendTO6menweP8k0nn3nOX7RS1bK1HnKS8bjuwQhlD5K7yFiL5d9jRzkDkMz ISecUVGXN5dteHi50em88F67auQO42yrODo67pUiEd/7UleN/gPoL1mqeDPJx+q89PFSiD+GQ/kJ 1xDy9dZ8GDymdxeVUnzvrvAx9t25vKUBcdo1BLaXTA+St1dPz/l2MXJr3ineLvOSO/ysvOQyQmQS LIW8i4q/2h+4vAhZlTdgepQGL3fJwjg3vs8MCsN5cZh8JDXoeNsv9cjGV+7wxHcnwgFDFoqv768c +Gv/q1Tv1z2FcOpjL98K707FMdwz/YXLm/7wB3vlXuLKXxzGO9nDvDe2HyxchN6CuaLvplJkFwfH t6e7w2yvx3zCv0bB8qAxFHsmiSiT5Ed7b5nR62m/MPae+MJ88HmRb7T2v+D4A7ns6TDm8tLZ25dc ftrzTYJH59locvJ8NEomo8Iglud7dTL4mSEViL3SqXAL0Jb0scm7GNHPjIpRBqwveX7kD4fYwjjZ nIgzeGh4c8X64e5dOZROCGBd6k/07nGyyL0GD2/7Txmqu/uCwB5PvWBCx/TBLlySJ/qOvppCPB0X PgN0WCLN236DIF92z0tR5nC/4gk+8rAXGr54RVBQE5eX6O7U4+jv4HHlUPrr8K58JjYvhspvIjDq gaoD0r0ngsfH5RBVOnk/kuDcHR1m+x8Xr2gllQEDeJeFhNQLaFQ4VQbwog6A9B9dw0ZsHD1LeAql DkI12PUncfqR/ujl26WPYGkQPfsqM4xvr0B3b64Oa6XOcb497M3zzb3eeb5NxcDq55MvD7vgm/5j +f7tZKGgSKRaDZm+fqrAUuMIX5MX7IErDVrlPsInAMsEgse72TtxhSBkl7fcIYO3hfj9aSXH88Ob eOb87gStUCox4mmweAehYIFLv+pRqZ04jncZT+LCQlAubzZ4tPBXSmOyQJwmMuCfKjES4RzTXS6X bc938u3T+WIZlbqVxPAuL/w974HP2oCPfUVGeT2eFtdptuLfnwWKQ/r6sdwlDg9KLM+HCLZ5lFUG IqJDQUajmu+ckojaDsNvFbhTzyKl+keSEfe+uKCp1tfkLH/5WjivFAenKYI86/Yrxf7kATFPgzWo Fsb00Z0Km543jh4LtfbukW4MLi8YBXtZqn56WdDV1SHkMDFikLnjlkerb9cDf4Xm1dlON50OZuMX Ooxk6wI3KI6EEQ25ZfipSQV26zV1Vlk2sz8BO/k6AMnrPHh0+ngqd/r+DPhYDLz1Ng6q805/km+9 nZaio/hOWQQw8NXofPuce8/dtutMpZy6und5M+dBCgMB1yAhi5brSqUT8Aylr4k3otwDZgdilIeh h5NqPvnqEfLE8SKptit3o097+Wbo5EkcIWTMLi9izfj78Pj8MLQ7us+32/shTPqQRHdR9k2bT8q6 TILl2/uaLFAO9kuDfIzFOL/yFqy+9L48LJ3yB2/LX4de6LvIWbI0aPN06TRw36p6q6dxovKci8G3 HJBd74tKvvc0ABu8/wWaXD4A8jnB3oK5ZPLXO+hBxZ+mA+VwaBAvFc73/QqTih76OnfD5PVLPw2I OHcE/qkUwT9FuLkqefhPQf6ZhE2KFfjPFXxxDP9qAW6paQmfVi6Vli34z7X8E4FAjbEXLeXFiab7 YlP5p4B6EQeQ1wATf6LmRaX7ovxhpWAA+1jpOa/tPo960Q/0WAFWkn+Kb4syHHEgRWXOTQ3Gjkqa uVSKOoxVcsq4C/J40DMRbE5B1pV2IVQs5pTRKE2K12IvCkRxKIfaD080EHPw7RF8dgSbJC+UF3kN MnCKEHvRrpsjslmJaPS9mK7gsTp/0yEb0BBCm0jJ6itsQdUVymnhXCtDamkIBF8II4ypdGJNO+Iz hcaWSMmUkMReVFJqEM73gfpTnFBhGYFizwXdXNBfaBnFtVQx1tR2oJ0VtpHUGSj/FJtYL+p7I2Ix Xd+m8llVmVpRnpW0zVSM6TaaiHTYwZGyXyoqlShvRThGzAxDtNqLOrJkTjMec3yqn6n0cq10gFEO RskKI7UmtFlbGXdeQbSWRWMv0LiKeg5zISpOJ0NhIUrpeaN+mePn3ut8a+Hd0Yo3Dtgdgp9+nJQn UGU7jQ45L02clr+KUCwdlHrF4gQYCIVPoMOMvaMEZgyRaWAMnRVoH1ArA1eYCtU+XQRxAY23uwGq bcLYooOqHZT7onJ39IhJZMVWg4MKIoMFGq4hoGI8HmomROzmbn3+Qqk/brxUSolHStdLMvvYqABt PJGL3pRq/ulu/uyhNdW8Z55p/qrWyh2Gkzul0+BuQmOfAlMYqoO4ygZMWBwthe57iT0oA8tCM1dM NQoC86n9lW/WA8+lLjCZDUCIxrqq3yPbLyFMrwuiHjyfRa6CJ7fMl8sra94pZiuaNwTVAprSZXFe fux736m3w5MSoDGk8kD9//DtsFLa3JRQ6BNNDVEOWJdLsvZcYqbVO6iDf1bKJLBbW3SaIkhun0gO d1mAE5o+ULQ5vR2kAstfNuhC5bD8HFG0rAgyBV1eU2PQqSkIgSWTNy/sWWlwJbSio+ZTQdo0cM4x agdYSdbWrSPb9u4jJlHEjfdTcphozBmX9zA4y75V/IOzSJ44bD9Sgb3XQ1k9xfFUeg8HTkQCuYp9 cfmzu/s9sH2CX0toWzaAXF7cBMKGAmyVSr7EKrv7WloNhM+7o7C6AdKf7FkRmBL9YOWtc5wuFRoP n7phgl4ko+r9qRJojrNo/6o+icwpFfbrwKrWj9b2iUqd5omncj/VeyVOP5ka9ZY9aIoWH5HpT8YE 4JbkKWJcRjtL3gztZC579rADLLChR1n9DHTBXOZb1f4HoLEjnsrdeNLi9gjtRcHqH/kXFAuMwf2B +Eohd2TRkyF/Ma01UvUWe5Y4yb4VxtPbIjFIF+uSo2PxAPbIrFArxBcFwuUlQzeCsmtfIoBvPr3m 09mzsPKiLZvRx2/JZPuAJU5rO1mA70gw280Mkw56hhhb7nv9niWC1DmEAIehHj93i8NnTyZ4XO10 NLAjZ4XP8+Be8Lg5iGvX4LXwSR151BeKl4YqsZ6ri8KYLZDFkefJBxhq4QrsSmJvmC/3Pr/20Wqk P/h0pfI6KPsq+as6YPDVK9EqIyg6vy9x5/vTArDZuuno+fVzHsKOqX7JZXrJky6v3FLevxpguDvC YvfWwooENNy9yDsq7d/0uMINnDgw8IEseSTIavFsrIMHeHKzNr7FN1q0MCoOn4pgn9Pnb8tg5011 9waPH14OpCbHX0DFOH/35L5Oeqy8iL5FPtWdvbu8EbJ2G4KU0IZehYfSIOJJiBg9OuUFov5UPVRE VDlzynQjIgc9pi8I0FU7WDt6jlOY2kHVnn35dvGyVYpc98O5zMXnCFCyIrFUyhO9v/u163towj+V Q9z5Ip+Ojg9UYJLLEnoa/JfTNpTXb0BKdW8A7B6lSm6ZkskCBxanFXsrnZ1x2eLbZyEO1An6slTv Ba/AszYp6QJS96Hi+7ASBuqZfyfVys4ey90o8Q7+eRxlLt6zo3K3vf+lVWRocVc+pdr7e61KZ3f/ utJp5ufQs941Hvy79xOsX3oH+mprAGI5URgnr4KYciMKI/rQn+PD6UX+6qA0AFpfOMPO1G5Fdy+Z 8lxUAg/NOdCeyL7yohE8Orvol/qTdEjtGczP7wdiYv8ObOHDuOaFbxgdsq9vsg6DyVfEcGpVD9iV /dfcV4HMAoYU2y2HPRFaPzVNu+PMIH92ZtQE6JZyozr9Fc1SS43GLW+l8wn2YvPp9LncO9lPlM7q nla66f2o5ITTxgdqJ3GYZRoqjnb2wLpI2zBTBqMozEI66pCPVKLD3O3gpgAXeYZrhxKwYPUlGYjm E7WXulZDpSUfbCo1KjDl1wp1k7/K3nkxJVhaxrS/dCo04QkYHal6q8+d/LR6w1QOq6RfB0wiuUg/ lx4+58dgC5fO89ftHNAtcc1bGlkUKK+Ng3zyOVvMZe6+Rsm7WIzNt/PcEslRic+vQiJAP+antYOv ymGlJ2CkcnxExxQPPGwuK5gN+M+zhk5O6sYEQu/ugDGw7zma27svXHk5OjwNtRVl6iiWb9+efOYO j2cXgI/dRM8Oy11fwrTRLRAEAQFKw7zCjiAqa7uVYv7lHfwT7lRKzXNqGYAQynHhdg30cnWQHeq3 hTJX/UyVIwwczlPpGegUiQuA6OOhukyAJ5+1i8PEvAl1y7fZQeFjPhnhsO+O4kBGXAvl4AE9wJVz 8E941im85m735nPNdn1bpJunjy/YdCELjnl7E0DJKqoV738DMdx8a/40Kg32a+NUgs/eocOjLPva HBrQCw0FWB0wnIP9SrGQPoCK2gXQ6vJ8mXl78uO9EFQvtyi97z4/APPD3yv36MBhnjg+negINsve UL3S6fnNPeCltTCg6aeqdvtkkNNYVLB69xcD5OmtzoFuef9WOj2KUeXXy+5LadCeRlSw8ODmBBmX QBBkTqWjOmAqLPPIt3T+kuvN0heJzilYkuk1UDXLbXjKk75+1+7FD1ENAn8NFRULgtj9zMfmB6X8 9fS8VO4OOkfLvYAmcX/6EkgS4qrcu8ul0A7TYIwQQo/04/UBAxQZ371ORqBZ0TuV8324BsXSqWdA GPaSeFxc6gCoPBmAOL6Jl/OJk0Gj4j+rpjHLyWKnOiJ7+fxFOip4ZIujo5MUOp/Bz9fCnk9laQ+A EiGES/U6tF+ihXGJPXzdyTevHi+AVlQ4x0VeOj8BqsEd0JQkU0I6On3Mt7qzgXiARR2xN5pvMGfF CVXJhnYUp0ZaURtFtCRvx402dPbvlTszeI6MsIMLBVFraI7g+cQzNJlJoEedtcF0b490cgHHQ5f2 AuJ7C1T2n3zXwF6q0qX6ZBxDX+Crr/kmNa6+PHK+zMVr9wtI9oZvaS+i0QDrLZ8K3UzgmcWnwWEU La/LMV3eL9XHwVYlv3jndc0VTVFeafoKcK/zSgCpBsGTu+Br8nrg61EH/OKCCtAfx1T5sFah3jzh PFV5ybeoSiEK+Bj1FksXKeYsdCm+F1+1s9dUaUIUkJVEVc4SV+gnVeof5MV2pdrkmA== ChK3WaMxZNl071Y6DgY7FWqwkDpUmkc8pH559w70w/cOakkfVZ6P0Kk2PNKELjb5SFOzhWEvsf1y b4cGAx17+Eo5dV1DZIHvl+RX7bqBznCzg8n+PujggzaS4orydl4apMsRoCJGApYS987lLQcvfUGw vq9hq5bH0AQ42wM9VyKWPd/lDseVgI1u+aSyQr02A2V88aKcfstzw8uD4LHwmFblGZrQkf8q8FC4 auYuoqPdzKHqJhH3fqzSGUdpoEfT41zy/r2cT1WFOQygCFf8p+HbInkzEdQzTLxnI3tCUitFowIJ NUm7kCyLK6YGWAFHZAcLlpdiJxQJyR2Uopgg1Mhmmv4i0y2wF1uVSu49Nwa6ersvoYW+vEU+pYMF 9AZdZ8LvnhimLENHnshcvcTnEzTd/EB0znbp+dn8CMw+EsUaj15DgCpLwkEy8xpsIQ1dRbmsKcUC 0xjg6HEmH/f5uDR5dxbF0VZn7nNC4H6ndHb68iWyR43sigNFZjADguc5Sme6l/u6b11ey6+B5GvU apXO/CVcyfnYdv56zH3hqp9s9MqhIM3HZLuzmOZbu8Wj0nuC3jkMLZ6BLUYffx2U9aqhIjIUaSHL F0m0CJJ119wPHuWSOyUUkALHWky2+txhdbb3GlbduS5vpt/vtTMUc9AsjMNku3r/eD8FyzQvqD4A sQngm4vK28tiCEN4fIjLSWqebvWJOZNPhSM7QPqE7wAd3AAdJj/tvgvq2ToO8ZWaoANhLHBHA/Y2 30q8LsAiP3iB8na10L69y7dvkm2EO6D1QeylP3MfDTDzyZ3G8Q2x/HZH5rIzQsgThxcz3BSGyCr4 Dtulg1G0dxh6OCsAGVCHq7E/Ejeuoixinl4d5uXFUYzw92mhl788qzHIYoeYoDRDutop9x7Ypyxz x32UouUPb6Wc5kbl1/vhDbBf2vvhB4Pmb/TN5dOHSHftRuXZFHYlMM9yUEVMFM4DgVFyWr8K6sLJ kBQThYKv6q3sPZbDD6n3QvwuFsZWX9ly9NcZc3L0XGKBgSQcktr+FCgHR9lu5vOo9DJ62MU0JQwO 0guAxJ6YgYhdFYe5PtBhxsW7PJcf+PG1unreBXpEIZVvPoY4dfZaWwxQB4y78JV7i50RsO5eEsii VxmlpufHFODENRgbEeZkr8ljOnd3FdxHqrtqf4o8OQM0849QfnriaVbe/C8U3AzPSHvEhifB7rwC SVq7pjP3N10wF7YCNJyXt6oXkBoElQVcnHiHPtYA6OA5jGuwBJ3ZfXEUr5ZId4Ll82Aa7LtgCOyh tlDuHdcAsJv92V76pvy0l36/48G4anGo6b6K0VdghH9yLCe+6zJaS+gKBwdZfEZxvh9cNyJ8jmbd MYOl5hg241mYbcdCeLz+agd92xnzzvLM9N0i5Bk2g7GizFwNEpUucYA5uGCGMBrfrSY4+5s822cH o+lIE7AL4HAiJvQJuTiS1FhUu1RHvHTXimGuZtNEyUCM0B3NJ4x6XcBy9HRvNuMjQw5FxNs2wzJQ UoRhiD1sNoKpBpGuTZIWbClFT4uN0hF4D4MVyDGeI2Y+66502Yr1ZLDLcIygwSbircHWPfZRiDR2 vUEilYiodxEZT4RX8WgxQHxRbHL2hPlYGu1sZpE7AwcsUgSvi41PxU1xj6+6EVA0WHSRg0WbMR+Z gLFLK22NnbmcjeFg0mC6EO5Yva8lkTbMptItuRFFQngSRSpYtGsnpuU4Gu7sffIpLRKMmLcgPdiQ ncKrFizWssf3I0JvNrZMJISNOP49YkXosDdBLj+ouX1huTtmzFrBEruD2eSMddoFpIceSqWew5tZ LHK4xH57U8GKAkGbwXg0G3L8Tw6QIV1JbpQ7BZugOxhsR6/c3ACkWM9CikGIcyypxBa9PzinfZH4 prgsMCB8uL5dmEgK+ImGKzuhV8Ax5rB+qeMOxtZ5vNrGyk43JUweK9to07TH20JDHTseHW/N98RO YT5UV8lCNMvlRG0Bz4Dp5HaCBzaFuszIMjFwMJ1H+uMZP+CmVttHbKayXmOhDbucwKQ7PYmY9Sws uoJVpp0WIm+TuKptrRCFg7bWGsFMiEzZd0A7ctKj4T0Nv59FNLcxmEAakz2UxmbZCPC0OSoMIq2H wfiFCLwoYMoK1lltoJ0wZIDay1qIVdSj7t4ak3ZAk9D2a9KuizKjpKGZYEK9g8xYG+f7vGCrPAG0 c7P+wgJVCIx8q4LVsBEowWL5UIOexW4Su1pMe+Y7CcCQJRa6DsIGmK38VuFZ30kB241HlvmpoMm7 XqEzzu8FLXl9S3NZCQY3ZmaWAn8Ska+b4+ZDWRGyhehMxiE8MtMpZyX61QH0Jj9+mueigoZQWo6m FqgGbVROaXIlkMV4AXKnzuwyTlUAbXAAP1GB2klsoONijYXrasFdLxdpMk3TYSpC2liXEJXYyLS2 cV5u6Da4/qt1W4V3AF1OxRrqEn6Vd/DSvDOgqGgxD17ACzTa+E208otSu7TcxT2jv/cO9TuZqfY8 /gaZ6+jasxkj8/a42gUql4bl0qtvylOAIkVhi6kvmjzbGwlLCd/wE3jRmJh9bDhJ8b6QuaoFYuNs vg8Mv4HXtqm7NLvsNlBLamurnsFVE6uhwUWR37lQfjX+xDD9NXicKH3GTy7fjon+fiuHfh6na3sf 6otYIRVL0Y/05BGlgyEfGPZZrcMWef74qJsPzS5Oc2dp4ThVO7yLVLjH+G2Zf34kXN7SY+WhXTnK H/XIg3xymvAUA1dxIbYHQ8G6USIaPKfih1eZbOykPS+UBunqZ233+ogpDYiHY+UtFTy6poeeQKx2 5AlHfdee4PHnocfLkmee0PCj5fLCB5VIrJEGfxzNvFIHw3nseBY4nIEhn06kITPXBemvt9MTNJdI VEh8gb9as6UmYH5CqjJtU/70w57LC/BEohlcqoPin4X3FOg5tQgeVz37cYESzmWwqWrsLrs7AD+r Y/DtQ0mec0Pg+azwyL9km5dENN7yo7GiTkEvYrdV8jl+P2yEDDt9eS/UTDulqY+ox6zTLv8aDd6B XrTdSp1eFAK7N7Nxw6hTYfeVLph1Wju+Sk5vdZ3CXlC38cB9MNu7PDfqlF+8ZfwH3kPPm1GnRIU4 OTTplN7dS2UHaUTJBnONPzwTlXbhynCmO5VZxns5Or827LS6yzV0nUr7BXXrO23Ez80QfMM/96hT 2GlgCb3VnbuYNzH3gc/i3NKaZvbA6kvdNn0+3arG28nqGHUKNlK3rO30hX+57V6bdJrpJG7671G1 U5cX6/Y13L4w7TQZHbR8xp0eegK8kAkKxp02k6+gF4l+l+Yq+I4fSJNOE8OAr8BWjTuNB16Ch9kJ NlOUxq+uKpPY/aIX50adEpWzq4JJp/SuN5FKnJh0+tCBhz1cu204153q3tF+gx3eGHZavUrdmqG3 th/2RIZip+XnzwqgMRzBOwHBlwshBB8sdVrrTBJfBzMCdJqc6Ttt1C9epE4fwn7dTF3eZCISeVS7 1cz1sUA0JldJ407rO4tU46GXMuz0cszW1E7Bumi7PYt8zUImnT4FiVbja2Hc6VnstVGpnHiMOgXr 0q6P6qZzbZ3T7TezTkvELfGaNu60Ed5t9zsHWdSpy6uf6+3rkWDa6a2f7czMOj0n7sInBaNOXV7Q bTl4l0vxRUMEP4bar6adfuy0GwWTTp9p4oV5C6JOIY3p5npxM/rMeC9Chp2+vt53TDvl2BP/u1Gn Li/s9px4KzdKxgiu3JA79/OrulGnPH8R3pU67cYCuk0TTB+UY6hTl5dkduZVLVfK8ItYkYCdhpY6 vTzyf72W73Og0yNe12kwwz2EpE4/0wdqp4Anw269g6cdUZRThQeyrmUQ10T54qkKOw0vy9SL8N40 lm2CTotzPXrL5Y8I6hSui78c0rFCXz8ocaXYXqZ4pmWFbPAodfEEO40ud0p7d44eajXQ6alH7RT0 gjQpqnA5FOd6krmK6BD8wR2VP8VOT24aDS16wcJ+DDkkU4EK1Szib6n5xENlpl1Ju1h+v9j3xPqT mfHbeABsmuMEa/aWB8RwPlLfarll/KFJlA8vy+L7JV3g8Yho5GIUervM4B9PiMb1SdzoLaLkxzzR 6J/RZl8XiXPPXcrsbZm47NWvzd52iFbxcy5hbPn9U4ho3e56zN5GiHbu3G/2NkHceL4i6ludfPEQ /MKTlN4vc6oacXvjORLf6rdZ/OmUuH0Pnxi9RRh7ahB3e+m82dcXxB1dLpq9bRKPu8kXs7cfxMv9 44GMsaX3z0ni5WMQMnubJl5vsjGztzmiQ3fS6lsdjXV4MnJwljD5mvGT6Tfq3ORtd5cs7L9WTDHW bZFnVzunJl/3OPLikxqZvO0HyIePs33jt4nXaTt7OH80wxglND2+wOkFekv5jv017du8J1LLHYtv 9ZyPmo89h/HTD/UtwFgxfHCNW2D+fjtY4IQLke2J9lk8dA25UgHQHVswMj0l4/KE9Oaic1+x0j5J PiBbsvRYPoy44FOiUixEesViIXoWxO23N+8Yjicm9of1vBvzIVMQcTlo5zypnC96npr6iOjR/QLu jCfAHAeH6uqf70ZHR90A2EU7ZSF1lWlqGC6/Q/mOmmFRjEA7B+PyeKeJIbRzOF2ncF1Qt/GHe9St Yac7lX7UtFNk55h0ClRbYOcwuD6GzzX+8GbRaTWcxjrt7+/vqp0i7V/pNIY6RVaShGCo/WflTqtj DYJ3/Hin8dae2imwB8mIaadI+8f0sZhurlD7fzbuNP7wZNopQO+E0nXq8uIIBtq/aadQ+++bdcqa d5q6gNfEmM4V6RQmnaZqUKfomHV6pVtTlxfGlIakAaC/JErPLK2+cbusg3ai1tdwBDEeaIrtRG5B NWitQ0izcSsLYGn7noqKh4S5LiAdTmQuMm7VHZ8jQzdkSPnnCTfWAbYhUmf4bnoLTiGAa2UMV5CS m/scHF5R9Y+pHiLiNOH1on/ggt7hSrDUwaUymhK0/Sqoic735PIep6s3TfBg3yv9w9xjGrPkLpM3 Lmj8VCLLL0IVm64yZHinl1f6J3TOibiRbTGZHaszADRY1CAQx3whOmRLXvgPIMgTom49JNRElC8m gwqVQ+I/Ej5JI0/gFUT5whrlLq+KeWmGyK42nF/TYz8/9M+1bv00Fh9aQaAnnxutIL5+ncWBPHjR pjGaH6cscUz2w9ivoMn8skEH9OnSIMsCWGgTYpfnIpJ79WG2HcoiBuTOg4p3uPfXx7zSn83OcTlA FrEBsmZaz9VbhNMxH9BzaKbpQKG7FVkP1PnBNKoYCMzZj7GewD6iS2PcPYTm1qOR5Av6R8Idcpwa 4K78fOsxY9vGu1I0bAx2JXhKnjU2nFp4Vzc1ZV00qCbYZmRfPE0wwDKYbnNiP6t9cVbqXLTk/lom WOHzbtO1mqkSQtyVMWNKr57t63R1zTKVog4oEKEF7hdzxHTMpTTBzm+iEuUolCzaJw== xpRc7QobANOKfHK2tOu61Jdov2y87yrQiVQ3XUl0yrPwAV3vPKRwJb8JF2Qq1MuicKZM12Q54T/S 0EU39JUi9zUz1HJBDbBQwS8NCR9X0HRcxKAYeZLOX5aneXllpIVZLUn8a2lJPlM8mhU6fTPmtU5Z D5jVvWAmlkSNEV0UYq4zqutb1XNVvViyWl3cFgPN+1WS2fPVtqA9faY9KvVqTngxZB11/bYk169S hcf0qfGQlNHAf9T9Yj6oXVNZqS6d9fpJOj/A6OeepWKx63j9DBQ6CWMOVlCHLIJlOjdOiQE/ezUG 9sHerklZuNdaAqYVKOsBE0ENfF/3W8OYVq/bEGODjP9xaxiDPG1tYJJfS/bDzI+/VMMVkbDLSxXu X03Z0Cra8XvN1BR0eZdMCWMBXYMnLDWHho1eU5B3ZeH+c2cru7IGz0DOLGlsyVAOmGIntpc9azgy lAFuJD/M0nicm32GehTATSdix5MxncJsLnZMQTMQY3sfDsW51WI6EIULqPbLGjihnA4EW5floVhv e71lmPkyFlDzYwHuSlN5Z2STo2NJbZCR/EUYDUl1Z4PRfNQBF2DKlh4SXQcmTg3qRZjaODVcOvZh tkE+6nZqh9WQcCsJDGq+uxUGUNcxADN73wkD+Kg7ZQAuG08S9TIP+lbh2IZDQvIFUIKNrqCnWkmX 11Ptib80Jw8KHxXd/FDM1epENXS8IaW9r1rl+hU8rj5/bYwshCowlxW3uAWyTDe4gaxcRpZ2i0eW t/jkFG1xUyPNtdyBiXcptpfZ2VnJl6DiTpWVk1MLO28Vo+KEFN0E9h4Se5csmBrpczo1U84/OY2d 3LbP7exhK/dGbC/9RejsSgsHh5n2dAp6ueUcTMjlNVotjHZ0uvXqfp8T8nQB42Fwjr4mYhJ2vj69 D8TEY3Nq6a8xYgWYp8Hl1SvTJ5nmXKdMx05uvA6cieaqtLpfZmdaZXod3J3ckF6j0aDrFFcThGd6 TdiYInAxaLpfZmdaQbje1I4CaGrKmfgKXEkdiF74mdG5y2tB6Zkrj1byrTchb9yRr8+SAZwtSbtl tLgcIUYn6AwRY6XLynIfYkcr6kyw40iX9YGed33qUaxIyUXw1O/A3W1vwt63jE4njCw+S593tTlZ XdopHngDYOv5W41Aubwbbz64aUhHPNmSVuGqBfybULy6+oGDTXcOghI0giKf768AJ7T6aPRnSQhO eDXfv4ncQ6AijrQLZycVgcCyvnnfVk8YZH1MzzQc++MAMHtx43Jod8GRWRz6GJ/xKbNfXpf+PuXo JApTP604GjBcEgGRki/UXsDTjANFzgFHu1E5mtm6OOFot5xTjmbvgYfANuVoil0JgG2BowmfsS3s fXgQvwYnWqKx5eiHdTgahIJxEM252KpwIk5HY372iuBETc366JALHslUZKwL4F5ruGRBq0Mh7Ogw aqilSIFe0laBFs/Bkm8cPnWyEPYHsEXwom7IhDBt3F4zu7+1Psg1ZbJG5/sA2Mpavfm4YOyD6dmr UzbzMHNgS7vstjNcNTWsaU2mIK3+xqq9CMXMmNN6e+zhrGdQazwkEI7T0CPrbSiCUjahw/gxS2nI 7FSDelnI7DQwm0bjtV5VGt45jT6ysvigjbUdbxaiZABsW/r985eRLDTwwVoTGrlj43NxJsWYnfMt SDEARX9itS6cLUQQITjEVmZF6uz9taUhXLCwpT95dWmY8Yd00hA+M1cD8DhYB9IQDORp7ih0Sg3D ALM3PkmEIzM3SDWoVDek2ekbMBVgpP1WfNUQmOne1nJ+J7u7wzvSdDX0Yo4xejvGJVjJ2/AKUWom jPne0nUtUoQS1eloUA4pYmlzSX5LnWCiCvcPYZ1gWoqcWEEs6WKu7h+sBJOTyLVLzbiGHnPvqPn2 MiaVYsTQNlon2hYCcyRaDM5utJnCErBtEXHhYWffiT/Z8GxgaSVtg2/xM3GTzd4VrIJvcYowHZLq t0SDMncMO45VVeUZEa10DowtC2kNxMtYLofV8S3TKe32F+VKei/3WmkfN8tGOXTWGXR6rW/dHDo8 D2g5g069vWGzHDrrDDp0Wr2FHDrrDDqTbMGVc+iClhl0Srbghjl0Jp1KGXQqt9wsh846g07NFtws h868U5hBZ5otuGIOnXUGnXb118+hs86gU/L4Nsyhs86gEz0km+fQWWfQYefIfltD8qlkFOxiZbNJ eUAGMfDN/S/rYBfHQ1KcA2aWONB2HKUHal1MZiGnmJ5s5sl/Kmn1X3s8mXt6mz7PdvCkdTEZxSk5 xZNO0C/HmWkMLvnmFuM0PE24jmN6MgIF5Ys1cTqen0XenKLDaGZoOijbnALjIS1nPuoPc2yRbjok e8+VBZ60vMZRytxSnJIzgn0trxQKYpJdW36+NDW4VwoFKSOnsQNPrwO38WvZ2qJ1OfFXgak979qb YeZ+dRQJCZPdnAWD2CS7mfmLnXt6YbKb4wMXnYsJy3stOwgGsT1wAGgxCAVRLQtHhggOTJvNYGnT iDq/Bpgun6FLcTolQucsNqJzhzy5Sy2s18Bxiimz09lxGUZiOUgy1W6+inUCIzwXW8G2h15IanXH mQZjWsch1HVDWjdJFSKm7ECdcHBi1a9aSDZNHphtFlhqvsU8vteFtURaJY/PTvc6wJ1WmiFpYuB9 R6xpEowDVVqTmmYVA395bZCiaZ4bZRcDv0oen7n73On6qXl8t+GNgSmgIjpQBnLfOTDzE3MdKCVr wAKYTb7Nahgjt4cxfbT/RhiLbYYxreNXvCJSE+r0XrPT1TVqI9j7Jgp2zT5pV97sttlyZtlPDkDY MRy0t0kHmY/vtY2NPUVTmp/Y7m5ZdzbJojrZtwbgsgdxLGijCCxW2gwjUCLb5c/arpDuZMRIvihK jWmKm+12tUWGPp5/DXTYp8YeuJxEHsAJxVfxBui1SI1deeIv8To9knoR3ucrmJmmlAyE50puizXS 4/BcHsxcNc+IcubecaCPfdS3s+Mhlvbt9TFneDJy7+iI1OV1hKfV3Dumniuz3DhzT4PFkJY8MpjF 55guxSGt4pGxzrBbySNjMST7vFcLPGk9MkdzvUcGpiTZRUE788hMTh14ZOyi1GJ7Gf/exh4Z0Td+ urVAvsnpFiKIwNTi/tUdD7oz8cnp5h4ZuOY6jwx2MrJSGprNIbjOI2OYv3+6DY8MzM6ThahlRLd9 qjnEjoPkHAuJrFWWo8vK8uzMOg9V3dGSR9FMWT7b/N6wk8yV1y5SxamhETu5SZqnjrq8qzh1zta8 N0xDyWBygW2kjy2FLujli7O8ulXvDVs+F0N5dVvIgfRiASfrRg+eOUwh2TXzW+qS68ydoLa7V/G3 ST5YyCN9+pNU8MyGGJwJuvvWVu7rs82Hc60SU7d2PpzB2SsAtu18uLUjVFfKh7OIUN1iPtzmGalO 8uEcZwtulA+H8TEsI27b+XBYzFV7zVQNg22oz4fDraSVUzUc58O5DDPi9OuyaT6cQslKDgDMiFs5 H87m1BfPF9tYqkDxZjhnPF/McUwkAGaTTqtDILoL2vhGCwjM/ERnhYyvlqMTK+tcpRvHkZD2cBxd a2F9wovgaM3ndWdlrMSvlsl1s+ZdpIaWRdH6DmAH6QS6TYi81scH+m1Yfi5aI9BZ8AVYBrQJsajO NTOrbFIxJD+/o9Bk35ejnWN2rYw+x2o1e9FwTQ0CG1bXxmHK4DZuA0ZwNtuGMhRpE25ydweC48iW tr7rBsFxrtqbKvYih7ldumLG7rYpq+gGMD+dD0vKF3NqUlsa1DAH6dowfWE1Pna3zYzUu+1lpN5t JyP1+WsrGankTngrGakAzhYyUiGUbWSkQjjbyEiF+WvOroE2zl7TLphqXxuditpHLOm3YYdfCu6D z5RNaHarubNt6DQVTivFTLN1NkyF03pHYf7at0iFs7wHfmupcI5OEjdOhcPtyuVAkm2lwmG9rHRN /WqpcC4nN5aslwqHKYbIejVVDbuChX22wo3wokR+0F8ovFle3af+JsSl0zeHUVUQ2Jf18Q/mPpZ9 4yYOZAhs7sBcc6TDPOgvGV7zcEFMYVs+wDG4Tcvqdl7IzKMWIs9EOJjepgUGpbvre7W8Okk44Dnv BXS3h0F/eLFw//VeElUHh7XBG55wKtzxHJxlSU+odH3nCd2+tjyhTr/tOWjnafhXE7YresJnnQS0 ku4/k5I4OuI+8SHLZy3aZDe/RbJbM0rgOJazzqRanIJvj8MLoGqT3fzdvetPk7yzwLNVubjXsFbu 65LdCvSlSaf0riYtSp/s9mqZYVf1JIzmKtVCrvIPSqf6XCyLym2HnhdtjpUuBewqd411qkt2y45v Lkw6TQwPcncHM7MMu/jDg1Wy2zth2ilReamZZ9h5P6O3XfMMO8ai0yqRMe2UF95Pd3Wd4hl2nudd +sYMwSGrmdb3dWsKt2sYdY/+klc/dbHoW7eU2l3usk7a7VweebSRkCYt+UXnE88ih3NeUkTljQu+ Dfl14tT6LjX7kFudBtvcn+jD5LX+VNE7umYezczU7aTzmjioY5WzvqrZyZDESnn8dlLFTO/JUWOu tlVJzsi7ZFopz6aSnMOl8+2sFnNlURfNtuKILq5vwyJyOJ40oHC70kEROcfz016IbHAPvC4w32J+ +vBw0yGJ3lGrQdkGUzoYEuKWdvXjnOOpEX82GpJSWdI43HWNbDqjEWIZqVvKpjPB2Jaz6Yy0UfNa nOtm0xlNbelWjY2z6Yxy6UzPK9fOplsp83HtbDpsmRRv8yZea+NsOiPjA6PkLWXT2UZBbyWbzkwi bzebzonXevNsOqNcOjSXrWbTWcT2bDGbbpl8+lXLPPG1sumM5Idyr8LWsumMWKvhqehG2XSaIUm5 dJh3dEvZdEa5dGI2xzaz6YzWT+vp3UY2nVEunVnVv/Wz6dY+4V0pm85BfuUWsumMcuk2x5hN7ZzV MOY4m84YY9vOpjM6RhE5/zaz6YwAuLzbzqYz2tuqd3Rb2XRGuXQWN1GYgbDJpjMCoOUw28imM8ql 09d83DybziiXTrP3t5JNZ5R+Y3ILjSk6VjMAdTccaie0fjadbkiyAbhaRqrWAMwIS8k7/pKhiqGN uHOYSGdWptI0x8hQu6jb1arUod+82plUrc5Qu9ioXp1RgTKndRPs69VZ5axh52J1u6qVjvE01Itv mxt1zKdmX4cWG5JFvKWDUnVOhyRGd1gXoXWKJ/PNbHjLmQWebKvPGg5pmcOAQdFrsEzt7SKxvfRn VLWH5Nw3nUW0HH/kxA1mWuZupWiotcvcGeS/LBe6WykeUTM1qczdJr4L52XuxKwBm0J3GzhjxDJ3 G8cnOypz53KUYbhpmTtYlcm20J3Dy2zNy9zpKdlRFOLKZe5WuBcOyIXdNYkBky9nW8uzmJ3pMovM ckUdJLRnrraQy3PmKBbDLunRg95uFmsN19xJRLPLPpFu4xD82dmyrFwPMfZZac4KYQ== QOwk19y9og9Wl1HkXzaUYW269QWdRlNimY5hqbNVE7viet/w2tFQSOffVjQUyv7fNE4dZj5uvPlg 4L11EruijTuAs2pOrVH2E4CzcW1XEcry/lunTuLqhSYt6iRuJ7FWsiygr8G/lFj7wdqcJTlP+/pg CWf5lfYaHgR2YMrMTCtNmEbutaaOUImbkUFtvVd9DPXt8pEufLZyIoNp9lNu03sVYELW9ioY3myz guHNmhcE6Pb+LbdxoWpUds0okWHVGkMQzuqJDMs1IBCcbeRzBvW3Z68Lx6K0liZW1WW/DcEGsbC/ 1zjhBbrX8jYEzzbNJ5IqsZrWuFsxsctEncdiSJxuwzUq3JnWrZZq3G0oOqUKd5tnPjqpcOeoUt7G +URypbyNt6FlhbsVK+WtWeHOoMqMpsbdSsCwEFAlewJVuFuu97qVQAsUpKIuw/p8DCh3Ninpqppj d+8oBOYoF9ZSzZH9/ABYfGPTBWCbNcy9WDnzcdXEWsXXp4ezeWLtnc60Nq+TaA/H+SVV5tzyzvJe uNWSmODNk/rgms3y2w1Ca4oo7uLGWoA53IYd3jK/coU0JikjbNUkJoQx04ywrrn7biWzHWFs6CBc 0EEwFhzXp6Nd6aAI1/3qSUymdmWHd3QPnXUSU8YfQXLWTO6vluMKhmSZxITdN+4wx7W7dOKKnlkq hi7nOa6F+/7CjEps6tEZ1n3bLM5OO0ks1nrTHFcAzPJqKo0OY5fj2hVWL/dojrF13ZPLK9mJ6LIG 1shxfbAUebqsZ0eDckgRxsJB9sCr+/c4cT417E9ag4bA89R8T0rSO00/wNy+Nvwn5wn2Iqcwra+I cvsisUZ6D7OR93XDk/7SpKbxAunl8f2prcO2Q2XSJmXudvZdXtM0PH7xFgnjtKEtc3dIvZtXnNPV 1gProskSe7TK/fsgTTslKoOLlmmnLu8+edrpmeX+9a3qsBVaWKfa1DRhd8hi+XBwV2oQfPy1N1Hm qsuHC5gn4QH0HplXnAOrX0kTZrl/9O7e9YR6NUvCe7HKhxPiGj1Zl/tXDb3dmnbqY/3JoVkSXsS0 U5cXdNvwmc6VF26OPaadenIv4bZmTdm03D36S1oGlzdQfOxPHLQMvC4mU9t29O7Xa/n+UtdOOk3Q tEwMJbqTxCTM23nO65RO2SPjnyyJzsqC17Ej/PxFFXWmfmKttmpwGvRUMgqbXK+KWdNXMXExGXpI Dkx1/qfSaqFV5kMC6q72HsV1s60q1rfxOK/MUnIQWmXqztVZfE+l1UKrTPGkVXI3yko7MDWuVs1K s6l3sExPRqCQrw8CWyFOy3J+hvVdzKMHrVLcVorSAkMyzeLM2oajOx1SMfK0nf2SNQ9sVTLslqNj tewqsMyuXssr+ZjNa6aUt3Ad7UNIX/tp/Wyk8vOttS3tdTk1gMtbOeV5CK8bUqNJdjP2a63kH4NZ gGsdWWujbmAW4KaeZZgDqL+wcyl21BliVryy0dwPUzaN03LoH5tptL7aG7l8ttOlvuzcuE44DFPZ no3cje1YD8nl+NQb+gTXvezK4C5ogCyLy/AduOx0PpXP1AxyGG1ZGb2Dce1Q76qqtxnecrZaWTZb vQ1VZHOWCmhzz8FKOVbdVe45MK8Ut6Mb0orauGZIWnenVSKgJJEtUgG1/H69VE6kKfWrtlVvHKdy 8kZpOjrLYgVgdtldOCgkkS2A2VbRcTQuuC4QmD3NO52kg1we58DsTi5XwphtPZ1VMGaRkLaULmyq HZrnAGpOrNayiJzkACr3kKyVBeg0B9BGG7fJAlQRY50DuIo/ef2Kegolr5UFqBmDRQ7gchUzM5xs UlFPyRVdKwsQEwSWOYBLWTam6Nikoh7i/GtnARpMyDBtyNxGdpIFaKCZ3BjNCupjusSDb1CUT63I 9i2L8ll54bZXlM/UC7fVonwux0zDJpfQUj1ZPkn8FkX5tPWSvlVRPgd3qW2hKJ9NDPyWivKh+pWl +QZF+bRDYg13r8iTc+J47FKDLer6WVu5Du6GclTXzz6Taxt1/cRMru3dDWVc12/FaNs16/pZV/Vb 624og7p+1hMy9sGuXtfPcJm2cjcUXtfPOszENnLYYV0/61gpjFtuVNfPUmE/20Z9MVjXz86n5NTA t67rZx3PpIm1Lqxf1087NX0htzX8loZ1/azp06g6wzp1/Yyy7rYQoaqr62e9ca3yK7dS/EPJSdxa +pFpVT/7+pXO6vpZ7zrnWWmblAfQ1RpYu66f0bhUabdBNgfTcVSYy0E9Pse5wNZV/bZUj88m+dNx PT6bun7WUKSckY3r+mmHpM/OM+aWq9f1U3aOYVU//R1E69b1s05PEf1jm9f1w2SXASrlddm0rp91 VT85Y2jTun5qqpSR6r5GVprNnI30CGPdcvW6ftZV/baw91FdPyen1ZvX9bOGotbj2zzvwbyq3+r1 +NYpzq3P5liu67d+3oN6M7PxHd2r5z1YV/Uzt19Wq+u3eVaak7p+1uq8kjG0YV0/7bj01uIa2rhh Xb/VtfF16vqZQLnlNrZe8bp+1lAc1ONbZxvqoCAas/GAOU0mMa/qt9aNOgZ1/YKWVf2WT0Ysky1M 6/qtnJW2rfLFWFU/s8z6Vev6WetMtrc2Oazr56gen4M8XCd19My8WavW41vPg7lUj2/jO60MqvpR Wotv/bp+BqdKDu5OX7Wun7VfS/bAb1rXzyjnyUCKbVjXTzdJndlucM/VWnX9rM1215bq+lmfZmIY 26iun2Yll6r6WdmVJozLsK7futGDq9X1s1YMRStp87p+VophV4Axvduo63dsWdUPWRZbqOtnfWKD tPEt1PWzPDCD2bVbqet3bFnVT3uWtH5dPzNPp9nNLevV9TMfEgzLN632u3rRV3bpnBE908UpaYcs SgabS0yJwU0mqnftgmf6zayNUURgzQLvdWmLGnqa6XxYYHGaRdUe1K7LW3CKIwGlCSgpUMzOtCjh UwYmfdZhizx/fD3KReeHp3kyddeifMc7JdQEZlPBXJ52k+E93ufgvge6gjy+19rQEzn6yAezx1/p 4GH2+iHYHn1yRLn8ESXKH+EMUTm7KhEVbtQgqlfpMNGoX3SIxmTwTlyO2SHROo+liXZ9dEvcCMMB cUvM4a68fT1aEHfhWz/xGLoJEC/dnUvi9fV+QHSuY3PiLXbvI97O/Vc8z5ejvPDMZfkFOb3lF52U X/Al96FCcD2HmZ2+8Khfu6xdpAe525fHd8/Bvve+uZfKjoHW5222qqf7w0/vzk46euHfHfe89Xh6 /7L7cV86PJBTAT2L0Cx+8YaWREx7y1fabS+xx/bBsyZnyEGkdWkAbglGIQgwobThCRce4lgJSKmO YKZggqxMHKBj8UW8Hb4GeP4iHDSdKewlHrgPHsZ8OaJSOCsQlUHvlKheXkyE3Ve6C3NXPVJ/x1/l 4FHq4omIVjoemJN4RZRvkx1U5o+IXrIh3W5St4+c94oTmn+i+luxqanSR8EEXI19T2A0PvaEqErD E+yFrzzBR3/Js1dKXcIE3FNUUtPl9YTzsaYnHPVdwFePEHf3sLJm2RM6v695Dr52wayZr5RE3ZUF PHmngpCD7pEHRTJbHDFREs6vk8s2PDxapkqZOk+Bv1ozMvT+fow4zO0XMvCJ6OdOBH0d20tP5gTh j0TRT8ge/dJfH+wB+KIWEAt3DnxfQfgzKP3M+MPwZ1j62YiLAKBlcZOZl3ufX2kimqgT+QnXEPJn d3cvgB/M09JAj5MB9QU+g+OjIPaC2SseyS+KYfUFlC+PNyfyq3pUfQW0sPe8/OKSVF68gqXzjolo 9ehAfYb3XC2GsBewZ5dXflWPAHyHDoBQew4COLsB6kX4WIAX1yT4q0vETm484Gczp8LuIGURPKuE 4BcHQNtmC4ivQJaYAly1kQKM6ZKHNNa8jEIvcwiJYPDzhkTfiIsTbT7Fouetzxj4ug3Qv3u4C98G QQeRCRF9aKiIeZN7eQMLTz+GS1HmcD/zPvXduLyVw3L8Q2WfEnOt3l/hJqxsx8pyuJGWmecSRCN4 onfUBqLMYRHEwGnqKp2qVnI+tl2q96UylWBW96RMv20qWAp5FxV/rV6nAuPOrssrkdcDE1emzuDk 1b0MQxSFAFKTU/DzJiqRffeeILuNegD89USK2m+0+0odp+sUWKsuE0N/KV4FSQYWcaEHqAhnAMqu XJUBPCMGAPY++J8TuPcBMxjHGxYMQF9JN7oPJ+mXLAvArKUJXbIHaC8Csds6QHiAex8wDXiXOazz mSAQiNjJXZmpdAJPZ3DbR+B29oslN1nhEwY71w6k3U3uRKlS+CkIdvRRSF4XuPeB4gCeFSNQUbmX vaPgn4CkMScqUWM3CeAMMqlAb4fs8gB7Nu6H6jzYcH5/Rt7HGTQNP1l+zRwqu/I4h3YW1C6uv8DP SkTlAnBXfhbGO9MKGZoVidLpIUcs8wNghIuLCJgCCTSDYzCri6DC+dHunmdOTcWDKhxUj6lBsBmF r5pKSED3gFLsKPqB9g5SNwh2JxFVNS70zBu/KF0Rfe+0BBrzQVwYIfXl8KSFAag/hyJaAEOwK286 B2VZQxBuNDceIDIVdsGz1EIs+Lz/SJ1ikh3l4pcPL1UAV8sAFrvo9gYFRG2/hu+SeEvMokfME5DN BQXd+ZCAakH4V0R5FlWeASINtcDCzv28uN+BlHrE7P19ZdbDA++h5w27yUDSXMSqz8+AhcWr4AUZ 0QlyaULxwCumLhyWhBZcfVFXQJcmpHcNKiDL1WnBugg7lX40aHwfQulTPLhQikUrNyM86e+7OMAm 9MTHuvKEMppLKN7iX8bj1t2BMT/+QoMDNLZ4y8WCaqlmgCxOHR7cKhEVhHJbBLy4Ib0jTbx3eQ75 ys7SNRLB84jE+ZfHjTqVFiLgP3l6MVmI3MJ0IXTLIFX6XloI8ZJWEcQzDiI7uVZA3FuspHi9pAjg Ba2LIQgrYhB9487HAOayBKLDbzgNdBkSjkoZYwbINAExNFkNMAYN7T+rGHvVYkxHiM2OCcHqIbLK 4NGlLFI7YCAcNlE7+Y7u4ybnMYXobOPyO0pXE6yr2vlDT3vv6MOzQlkPz/ig8LrkFDrP0vxsTXU2 uebn2KPtpXmrad584DQ/u5obdZpDDbDm50K2lqH4np8EoZZF4/4xtEMJdp5LIS6gykBVsQIK7+QZ 6QJAnD4kRP2hcN9BIjYsyfXEswB/RmWNo+ZTTkVR39AuAarDgVZ1QJpESPpZjCA9I6KAiAbLt/c1 OJrn2MntrCAL97gfsxygLqDK/cwBZiJAlUBVCDANwHfSOJZfaFWDxWtOftHA7BPUvarzZwJIWOF6 SDUXxEwErOdqRdXBX1GmLHjWiEr6WPWSgEpXMLaXgTpo9YZCpzy7B7jK2iwGkQkgqazNeliW8YsD SYg2GxHRSvAd3YOt0rwmIO+GFkgf/rynRKPhpD2NSLYYFdiLBCTV96GO1jKI2zwPlw== EdRLrJCKpbLsa2BQHNKVy8I4tZvCNRdkcALNRQSlPXnG48cAxOvoxhA18G4IyTeOINI3R5li/mY/ +1YcJs9m+XZ+eicaFYWng1eRfgO9+5FsBbdjCnm94eTVbYQwy0E0pLrXEXFdQjDpPiD+xezciqaE qkwD0zNWg67NB0BKh3VxtFDQqQYCUngk6zyf8klaj0jxTU6OUgMKfVDeaK+CaJOPdpr7ik0uyGZ0 RHRxSyZlIh5AMUlgmDn4MxOUlVewzZTdhHywt4S426CbHoaMR5CqTVZfI4/i5jN27dYI5MZVDlv3 5RdnfqRYkCFi+oZwjPb+mbjZyVDR25UxfxaSnt2QcMefRTBeE3o/isoqeYMgEt0zeBp2RmJNqoUv GpDK+yVUyVHm4wMXQXiULzS6IOHZbEj2KAp/cuxKkVTSnaISCXf0ejFm+Ut+9D6aukOurCuar5Pk zbTPVXiWbbO/n5e43mLCTufujDuabxXr9VSixPa4PusOaepYYr5Yje9QJMdHevJ4GH6rcMm7GNFf 9iwy0+r49qNbeDu/yudDU/Ile0Lepkq7/UXZ5S0Va88vaL8b+IbRRsmCzTwvlAbp6mdt9/qIKQ2I h2NsGyFd2zdrf0GDsQavb/N6Qp3+EzQ3Wx5/TQBzgQ8eRMl1fDTz6j2w0D+kumt1x5PIpDimvS1v Jb230y6+nO7WgunErFl4O0ve5AbtWbZ8VzgHVix4X+zka/TbRb4WG16VToKtNnj1dZuLzg9K4IWn i9xP2j3iJ4OfSXht18OrTDfnU9WFou5dIObG8u6UhdEDL3G2uR9SWGcu7SqwW+S/SD/02/glnppI og0MLzKuz5Api36CbfLEIytWjiGFZqti5RI44fqGioPtLIC/SM8Z5UUQf9EI9pQXYfUFvL3pNckq r6L4N7Piu/JCtykO0H7An934lT13EcJfvMf7Lq/yKoJ4LmAUOUJkTLVwJSZuI7RPayfX8OcVDrv7 HoSYvZK2cm8vmZHYN7D7Rdd6L3xEov1yFUX2ENk7qUO0XUlge1c3CGwM81vVOrxX5HuBcBx6Edth 3MNzkssqtH9dGEfeD/LN3qAB9stZ3dNSiRMtrcKnvHouJhvtBSpQqxwaQTSCJ0V32kG8ahyp+zMx b+6x1ZfH1Hu+tdgblR/7Tch226RKv7jS8fAaA/tFdm7FsamXTpIKsdyJnlWqdFWEpuVdVCb7OwC7 +wIDfO9IWabcIfcTB/+KiX9pYq8snRbYrlyVAZQWTLbm8iIWUAiM+WYuKkyOS4/FyZMJA1B4ja2Q 1IlIJM22LyR1IlKsZrZ1IakTkequ3KqQ1IlItCt1QtLqYA0/iluKU9H4TFRCkk97crjrJ8FVdN4j z04xv6N4j24N3E8BHEBoVNYBgPEXeydl1c1F+dMPMZ2fbGfn+KQq+8m4A52fTNipVLzWjjaX9/6+ mVdAjPyaXQIsKNHbChes/JwNx/azTySQJaUQJBXxuBc9g0QVEZ+9CJ0Yspvk/d6ZQx85hvld3wa+ F5+JxyiHbgZ14nsJTq1tbtkMDk2NPF0ur97XBWsE4B4HaULP2nEHnXm6kvhZn4WvS0y4h6uGQKie rtzdAQPWKlgR74+FfEXByFhXnVPrKZHG/YovxPjmwmwhoqYLoVsGFBdjtBAB3Pu3jjszgCHV5RWn bgDCihgCoZXGgDyLehDhTacR0aESYGxFf2KAMFkNzR23tbeQFmMWhBgKOYSoDJ7e3UteBy7ki27f CW2s4luINIfoaJIhSu1KXWxhp3pW1EVGRA+wQU1j2aY8qIl28AG/PodI8zOq/Unqeglpm4cOtD/D 2p9aYCFC4rT+fhuI75wg6paKFJMZ5XH1zi8yYVUGYl6YS3Yq6QL3n2GqU+uH4PFcWFQ14dEX/DYi HX3d7CBZ6VOjbsHfMFgQqQ6inaCoDqKdIJ4zJXJh8eeLwIoGRGzv8PBNPEcbvOZU1R0fJtQFMLmP a9k6qxl7cUP2lRc61WCgvMDtk/BefYjp/OLRPVlt7CjGyQVunAARpeibF2H8xSwD99CF4um7IETt vkY3IN1dwHhYBLv76lVgXwXFRt0ZCbnAVVhhj3uU79gPo96uIpKVQBchnCsC8W6yV7tEPynJaHh8 IqXcRKAuV4LK6beoLlEBOqMgph0ReyECeymCGre85VA6AKxJ4nbPUHMRtWiD6E5F+WlHN4aohUfI vlgEkYzuCofBmyxPH9/EL/LJl75fMioeWx75YPuJUs/0VfKi/v/irnQ5quMKP8F9h05VVJES5qr3 BcpONINsyxlMFRhZxOVMxtIgxtZCicGY/Miz5zu93llESFKpoILpc6aX099Zu+8FDt5d/FwPCA+G J4evPqPQ812f9SIf/+VEJMN/fP40X+c+vnohc+vd93+ND7bl8cF8Vl7zmrqNZ2u5Bv/sZXolBP5w FP3v9/XNbhT0uRMcrZzJ9X47k9dj9O/SE6nFT4v4GslBeno2eKskF69wsz/95oe43fT3kh/E//Ak XrUdLs9WfSq1lw8e/iHGC/XbR8df7/rLMOqPp9/8Od0Q1D/oixe5sCivoHR7+SWUeEew8f5JvCj4 fDJKD5rX3zmpJTl8w51+Nfnbz0cXwzvGLx8ekKk8icjG9y59Ugmd2eNLAybeCLfLn3983j2COCdC zI5vLoa3VN3eHjjPF6t3b6iDmY0Xl8ub6fzD4q4TLP1w/NCfLjAhPaNrMM4Mcac/dvvT5S+Lq6tb Jg7Y9Kbbmx0e3a0eL89Xy9ub+d0H9pBYZ0+mL04es4es9J6h9yO2D4n4DP3x5QFdj80g5azj7Ai/ z9537/DxtONZBLA+gPgajZ/Aes80e8K+/4GzC+r9rBOqF94ZJoTsuVbsuqOGtbpyhOiFsfSJhhJ+ wOA9F8KxSVdYUvdKaMOmjSN7wz0Gyd5KzaTAnEzoXsvgMkXDRW+cUJlBo1WvnC3d0d9r7dpklZHX oykyq0o1HfKq6KoPStvB5mTvhWr7n2whMu3GP3Y8gzl+DQXvv7i5mV8vLtjl3fxiSbeW4YCNeC+4 5dgVWs5pqTUbBaihF4HT0tUiMMtlh06cfhk2IunQsoNW/dKIPoQAYZRj4+vuFQQZj0nFvTfeS8Wo wYPHpyPaNLXPSeiem2YGgEMqp1gIvXDKk65Vb4FH5dDerWXB98EISUpz3gmijQXM52QcmntJHOGc ox4iGEzpenQwREtuBdGClxGNI2knUHUQTNpeK+zsZRSCNi1NrzQhpXtDCoRyoTzoyPQWk1WalM17 5YOtrGk0Ie2DaqOwsApBt2lJdslDXXkSzcwFFapwyfI8Ny7tyJpoMibAg+OWvYsMKWhQQ4WsSKmG G60dJym4QjpnZWNMtpQxjcqFEe3QF1Y2AD3qK9i0dOSQ/FxHBXHto/4idBDeGxVFgyNJnhSUR0gM JRoYRHVImUYINJJgJpBvASYTCBIN/WCfADJwE/XBjY360laGpp9MD/WTWdPIChruVEcBkihBnZY0 SI288CTC6pxXVbhpYnkpm/wUWDx3bYOkZu/UEAOywWBCg4lcW2nZcKz6yYzJFvikH8GO3qxH1q2d QkcbcEzbVBbbsNlY03KNs4UYog62PBKBYoFkIy3gSOTOUJiGad4Xi6SJwQhaVjIGI++5EogzVsCi PXJTr4MT9MmFyWEJuARaTMKgFLx1pDkJBLdBrDKhxidFLY8WD71SHjwLvTrrmKZwQV+LQaDandiG NDv85nb1bHF+e3eBTVA2+zSxDp8t5ldP5qu75a8Yw/YnRydfZgS+fXV7d52+yvkROfPi9sfF7Ogk UOJ8vvpwtZg1KdayqGBnFyXi78Rc/leYr2eBCJJl+wfs7LvuRRdyiyc747kz/eRwrgemh9DrsiNx 6XLqTixox5CLNgZMUAPVxiDXMjoZOpcUmAtLWXiSkwOGQ0gVejgIrOS0HPFDIexqSthU63DfO4qO Gm4QaFARb9IBTaNl48Ropv2AsbmlCQzpP012FNhkDGMwHwIH6AkfCgNurQLiO0zLa8TfSseS47wr tPDYoKedpuFw74DIXqbPZA5W0HrhkE+b3nhSeh4iEJEslq5TFkZZszGyUHWKLHRdJNOTzW3uyiKl h0GOczohEZw3lYMMZAz1QE9PUbHQWaxCQ24Xoo7TeGHxKQdYZHoIRmYlNJKdlVFoeG0H0xZGg6Mw smB1jiJ5wyMzJlvbrYjssg2YfhCxECLTrDQ2KBxVCpg9bqzQRbBMIzYrE8Wg0VBe8F41ODI9hCOz Um2qrQhtFPbmFVlLnTQzGhyFUcQqc1S5KxyZMdnaaoFD7kAD0RtZKR8BAiWjzKHy2ZNvwD+tEo2u kiUaoofoI3l8zF2IBRWRTA8RyaxUeaFS1m0Ule/C6DZtYbR1C6MKludokhdEMmOytd2KyC4DwUYM NhIhsSgDKyeWtSoqx3JlhnQSrdAIGy5F4jQeUUpyUyEp9ACSwsrHIE2nxzIqFqzBt2kro0LSGEmw OkeRvK6TGZOt7RIkLRu924qt0ieFOJSKWlPRo1EAU5HtZfP3fPjaxUJCcZrW0Q4To6AYcCxKM0hX OMgjOIUFomMNqJHJHM5WHlWiFzEXQQqH2Oc8IjR6KEVnJubgWEpZdtop2h7AKhyqvpDQKv0yub8J wx7KiDjC0xkinmaREolOUaYwMgLTLUymKXWtx+JNmAAcTlwSwe8TgbOo720BjirYAcf20qIiKxwA ZyQCC2hpIm44qAnmDXJ4NDgqbjyKKqzjhPVMIS1RUeohcoCpnu7Q6qtOoc1p5wjjhlQvCRPsIDOA jA2o8zOZsKU3gdr3CidOopSwDVmbHPfToN0QYt1et6J9RU8V1BsLIKVsTYBy1B4DjoWZOFE5oA1P JAdcIBUnvOl8GUsAKnkMiiKPyalKBuSWolJZ93RblF2eJnc4mimOJkNvqUTCzqnUBjiUDLgrDEKb hM1khF9rqQffSzrxYsZgrW/4g0Z9N8TfbOFvmml/FFTsW8VcA4yCR3xe44iAyq4B8C8w4bHqG7gQ HAblwmBdneNZ4YCORynQ3sISNd3jkIupVNdOIoiIi4RJdD5sMN5elA2eklFrzxsH+cXDOSoNXFHR S9FA4eQqJBgYktwJEVrFizRHZoC4dI5CVlBME8SSJDJnDkJKLVNLUe2HbtQWGnEHYVfFyOxg8MrR QYTHT0daT3cYMBjvLBXpJiif6lQViwRDCf+UetiQ7t5srFpSrZOu1uhGTQ4u4rBOY+SkLGpeI105 y91gLgrPdbFJlxlVGumSp3qyKgQVAAe0BQcuYHm6moh9KJQjzBg65RHD2BA1GosWSqcujSclposm m+4Ci9YFCj4vEJwLY7JlKvFMvevI7NPpDWlTkaXRtR0Uzs19l3Z0FEYIgi5laol2Z4eQpugq0KQT FcpWxc6u81AUdmwEKVGbYrWPjfWSchFJPT6v6+IALGNx9GnLjq+HI/G1FdS4fyQZIw== XGdjIMovT2fXjwzUlGHhpeN/f6Mow2K5i23mS4O1CxYkKa+S8xrKd3B3aErHhBmzPgCJX1B88zq6 Ms5t1S0n0ZWpkBi4srPOrruyt0oNXVlF6x24skzhYODKylm6+aSkFJxDH9qGTHlLxjsDhdI0dtCU eCddlS1zphS6jJWk7d77GB/J0C0OPZssHW2iXMuCIXTyD0lX9dFhYLubDqPUhsPIsOEwwmw6jPID h6HYGqutYWxNPVpslYPQuqmve31O8Op06VJjp8ehoukRlCI5irebCHojRSWHocwbhYJ7QTn5Zn+9 pwccSMbB1s6wM4cTllTi45PClIX3dNEQ1jtqSqheDjves7qEjceLv8Ha2cbX8huMmseHRKRrP2hx fMYnRt09z4h4ugdj+/mmq9L5TmvwDGn2q5rMni/+jtELtI9nu58l0bJ5jteL5eXr1Rb7/fJi9Tpz 2eH49ha8+d1inlcU1ijvpUD9c3gCPe+/vVqeLzYeVf2ftjxT/8tdo54ip7xv19NxelZ4fHMRnxSO RvQvQMwvF9/ezZdXi7vu8u38lwWb39zcruarxRt8A29ZvF3d3i3Y29e374mDIaX73t7x0y+6fwIT ZiNW ./compizconfig/ccsm/images/scalable/apps/plugin-loginout.svg0000644000004100000410000005154113246301623024520 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-maximumize.svg0000644000004100000410000006710013246301623025043 0ustar www-datawww-data image/svg+xml Tile Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/ccsm.svg0000644000004100000410000003523513246301623022313 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-photowheel.svg0000644000004100000410000020612313246301623025034 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-matecompat.svg0000644000004100000410000002016613246301623025011 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-screenshot.svg0000644000004100000410000005647713246301623025052 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Photo Camera camera photo SLR ./compizconfig/ccsm/images/scalable/apps/plugin-putplus.svg0000644000004100000410000006567213246301623024406 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-mousepoll.svg0000644000004100000410000003000513246301623024667 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-video.svg0000644000004100000410000004774613246301623024002 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-switcher.svg0000644000004100000410000005374513246301623024520 0ustar www-datawww-data image/svg+xml Patrick Niklaus, Andrew Wedderburn Switcher ./compizconfig/ccsm/images/scalable/apps/plugin-cubemodel.svg0000644000004100000410000004333713246301623024623 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-firepaint.svg0000644000004100000410000002543213246301623024641 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-stars.svg0000644000004100000410000007325013246301623024015 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-imgpng.svg0000644000004100000410000006072613246301623024146 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-workarounds.svg0000644000004100000410000006575013246301623025245 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-wallpaper.svg0000644000004100000410000003272713246301623024654 0ustar www-datawww-data image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> ./compizconfig/ccsm/images/scalable/apps/plugin-toggledeco.svg0000644000004100000410000003100013246301623024760 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-mswitch.svg0000644000004100000410000007076413246301623024346 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-showdesktop.svg0000644000004100000410000003423613246301623025234 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-rotate.svg0000644000004100000410000005755113246301623024165 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-snowglobe.svg0000644000004100000410000023150513246301623024657 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-winreflect.svg0000644000004100000410000003544013246301623025022 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-fireflies.svg0000644000004100000410000022240213246301623024624 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-zoom.svg0000644000004100000410000004500313246301623023640 0ustar www-datawww-data image/svg+xml Patrick Niklaus Zoom ./compizconfig/ccsm/images/scalable/apps/plugin-flash.svg0000644000004100000410000033413613246301623023761 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-copytex.svg0000644000004100000410000012322013246301623024345 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-showmouse.svg0000644000004100000410000007005513246301623024712 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-3d.svg0000644000004100000410000013157213246301623023171 0ustar www-datawww-data image/svg+xml Patrick Niklaus Cube ./compizconfig/ccsm/images/scalable/apps/plugin-regex.svg0000644000004100000410000003004413246301623023765 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-commands.svg0000644000004100000410000007205413246301623024463 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Character Map key map character accessory ./compizconfig/ccsm/images/scalable/apps/plugin-shelf.svg0000644000004100000410000004375513246301623023771 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-grid.svg0000644000004100000410000005373513246301623023614 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-titleinfo.svg0000644000004100000410000002064713246301623024660 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-opengl.svg0000644000004100000410000004750613246301623024152 0ustar www-datawww-data image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> ./compizconfig/ccsm/images/scalable/apps/plugin-snow.svg0000644000004100000410000001734013246301623023645 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-photo.svg0000644000004100000410000020612313246301623024007 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-put.svg0000644000004100000410000005643713246301623023501 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-bicubic.svg0000644000004100000410000003507213246301623024261 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior ./compizconfig/ccsm/images/scalable/apps/plugin-animation.svg0000644000004100000410000002151613246301623024636 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-scaleaddon.svg0000644000004100000410000025204613246301623024760 0ustar www-datawww-data image/svg+xml Patrick Niklaus Scale ./compizconfig/ccsm/images/scalable/apps/plugin-bubbles.svg0000644000004100000410000023014713246301623024277 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-fadedesktop.svg0000644000004100000410000005557213246301623025161 0ustar www-datawww-data image/svg+xml Patrick Niklaus Zoom ./compizconfig/ccsm/images/scalable/apps/plugin-move.svg0000644000004100000410000005077113246301623023632 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-startup.svg0000644000004100000410000004152513246301623024363 0ustar www-datawww-data image/svg+xml Jakub Steiner dialog info http://jimmac.musichall.cz Garrett LeSage ./compizconfig/ccsm/images/scalable/apps/plugin-shift.svg0000644000004100000410000013034413246301623023774 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-winrules.svg0000644000004100000410000004451313246301623024531 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-text.svg0000644000004100000410000002064613246301623023646 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-wobbly.svg0000644000004100000410000002325413246301623024156 0ustar www-datawww-data image/svg+xml Patrick Niklaus Wobbly ./compizconfig/ccsm/images/scalable/apps/plugin-kdecompat.svg0000644000004100000410000003740013246301623024625 0ustar www-datawww-data image/svg+xml March 2006 Andreas Nilsson http://tango-project.org konversation chat irc ./compizconfig/ccsm/images/scalable/apps/plugin-group.svg0000644000004100000410000006137013246301623024015 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-sound.svg0000644000004100000410000006606213246301623024014 0ustar www-datawww-data image/svg+xml Jakub Steiner Lapo Calamandrei http://www.tango-project.org ./compizconfig/ccsm/images/scalable/apps/plugin-ghost.svg0000644000004100000410000003377613246301623024016 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-workspacenames.svg0000644000004100000410000003544713246301623025711 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-unknown.svg0000644000004100000410000006672713246301623024373 0ustar www-datawww-data image/svg+xml Patrick Niklaus SchemeP ./compizconfig/ccsm/images/scalable/apps/plugin-imgsvg.svg0000644000004100000410000001605113246301623024151 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-static.svg0000644000004100000410000015422113246301623024146 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-addhelper.svg0000644000004100000410000004712113246301623024607 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-minimize.svg0000644000004100000410000004552513246301623024506 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-core.svg0000644000004100000410000005015613246301623023611 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Preferences System preferences settings control panel tweaks system ./compizconfig/ccsm/images/scalable/apps/plugin-bench.svg0000644000004100000410000002047513246301623023741 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-staticswitcher.svg0000644000004100000410000006653013246301623025724 0ustar www-datawww-data image/svg+xml Patrick Niklaus, Andrew Wedderburn Switcher ./compizconfig/ccsm/images/scalable/apps/plugin-decor.svg0000644000004100000410000002076713246301623023762 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-dbus.svg0000644000004100000410000006045413246301623023620 0ustar www-datawww-data image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc ./compizconfig/ccsm/images/scalable/apps/plugin-gnomecompat.svg0000644000004100000410000003052513246301623025170 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-expo.svg0000644000004100000410000010547313246301623023637 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-ring.svg0000644000004100000410000010103513246301623023611 0ustar www-datawww-data image/svg+xml Patrick Niklaus, Andrew Wedderburn Switcher ./compizconfig/ccsm/images/scalable/apps/plugin-obs.svg0000644000004100000410000003271313246301623023443 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior ./compizconfig/ccsm/images/scalable/apps/plugin-opacify.svg0000644000004100000410000004441413246301623024313 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-widget.svg0000644000004100000410000005233613246301623024146 0ustar www-datawww-data image/svg+xml Patrick Niklaus Zoom 7 o C ./compizconfig/ccsm/images/scalable/apps/plugin-snap.svg0000644000004100000410000006402713246301623023624 0ustar www-datawww-data image/svg+xml Patrick Niklaus Visual Effects ./compizconfig/ccsm/images/scalable/apps/plugin-ezoom.svg0000644000004100000410000002662313246301623024014 0ustar www-datawww-data image/svg+xml Patrick Niklaus Zoom ./compizconfig/ccsm/images/scalable/apps/plugin-smartput.svg0000644000004100000410000007106013246301623024535 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-scale.svg0000644000004100000410000017223613246301623023754 0ustar www-datawww-data image/svg+xml Patrick Niklaus Scale ./compizconfig/ccsm/images/scalable/apps/plugin-trip.svg0000644000004100000410000003401213246301623023630 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-mag.svg0000644000004100000410000004125213246301623023422 0ustar www-datawww-data image/svg+xml Patrick Niklaus Zoom ./compizconfig/ccsm/images/scalable/apps/plugin-elements.svg0000644000004100000410000007253513246301623024502 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz window manager decoration behavior ./compizconfig/ccsm/images/scalable/apps/plugin-session.svg0000644000004100000410000005664613246301623024356 0ustar www-datawww-data image/svg+xml Patrick Niklaus Trailfocus ./compizconfig/ccsm/images/scalable/apps/plugin-td.svg0000644000004100000410000005775313246301623023302 0ustar www-datawww-data image/svg+xml Patrick Niklaus Cube ./compizconfig/ccsm/images/scalable/apps/plugin-annotate.svg0000644000004100000410000003327313246301623024473 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-tile.svg0000644000004100000410000004402413246301623023613 0ustar www-datawww-data image/svg+xml Tile Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-freewins.svg0000644000004100000410000004436013246301623024503 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-composite.svg0000644000004100000410000014561013246301623024663 0ustar www-datawww-data image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> ./compizconfig/ccsm/images/scalable/apps/plugin-resize.svg0000644000004100000410000005400013246301623024152 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-vpswitch.svg0000644000004100000410000007574013246301623024536 0ustar www-datawww-data image/svg+xml Patrick Niklaus Visual Effects ./compizconfig/ccsm/images/scalable/apps/plugin-screensaver.svg0000644000004100000410000004173413246301623025203 0ustar www-datawww-data image/svg+xml Lapo Calamandrei Jakub Steiner Luca Ferretti <elle.uca@libero.it> ./compizconfig/ccsm/images/scalable/apps/plugin-fade.svg0000644000004100000410000006203413246301623023556 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-place.svg0000644000004100000410000003242213246301623023741 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-mblur.svg0000644000004100000410000003304313246301623023776 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior ./compizconfig/ccsm/images/scalable/apps/plugin-wizard.svg0000644000004100000410000003150513246301623024156 0ustar www-datawww-data image/svg+xml edit find locate search Garrett LeSage Jakub Steiner, Steven Garrity ./compizconfig/ccsm/images/scalable/apps/plugin-vidcap.svg0000644000004100000410000007154313246301623024132 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz video multimedia category ./compizconfig/ccsm/images/scalable/apps/plugin-atlantis.svg0000644000004100000410000005120413246301623024473 0ustar www-datawww-data image/svg+xml Patrick Niklaus Cube ./compizconfig/ccsm/images/scalable/apps/plugin-notification.svg0000644000004100000410000002111413246301623025337 0ustar www-datawww-data image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc ./compizconfig/ccsm/images/scalable/apps/plugin-autumn.svg0000644000004100000410000006241013246301623024166 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-neg.svg0000644000004100000410000007345513246301623023441 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-stackswitch.svg0000644000004100000410000006337013246301623025212 0ustar www-datawww-data image/svg+xml Patrick Niklaus Zoom ./compizconfig/ccsm/images/scalable/apps/plugin-schemep.svg0000644000004100000410000005234413246301623024306 0ustar www-datawww-data image/svg+xml Patrick Niklaus SchemeP ./compizconfig/ccsm/images/scalable/apps/plugin-gears.svg0000644000004100000410000004115713246301623023763 0ustar www-datawww-data image/svg+xml Patrick Niklaus Cube ./compizconfig/ccsm/images/scalable/apps/plugin-compiztoolbox.svg0000644000004100000410000023372013246301623025571 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-blur.svg0000644000004100000410000003656013246301623023630 0ustar www-datawww-data image/svg+xml Jakub Steiner http://jimmac.musichall.cz Windows window manager decoration behavior ./compizconfig/ccsm/images/scalable/apps/plugin-water.svg0000644000004100000410000001445313246301623024003 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-mousegestures.svg0000644000004100000410000003175013246301623025572 0ustar www-datawww-data image/svg+xml Patrick Niklaus State image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-extrawm.svg0000644000004100000410000011214413246301623024344 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-cube.svg0000644000004100000410000003720613246301623023600 0ustar www-datawww-data image/svg+xml Patrick Niklaus ./compizconfig/ccsm/images/scalable/apps/plugin-thumbnail.svg0000644000004100000410000011403013246301623024634 0ustar www-datawww-data image/svg+xml Thumbnail Patrick Niklaus, Andrew Wedderburn ./compizconfig/ccsm/images/scalable/apps/plugin-showrepaint.svg0000644000004100000410000002670313246301623025225 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-colorfilter.svg0000644000004100000410000007364313246301623025213 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-imgjpeg.svg0000644000004100000410000006553613246301623024313 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-splash.svg0000644000004100000410000001523413246301623024151 0ustar www-datawww-data image/svg+xml Patrick Niklaus Visual Effects ./compizconfig/ccsm/images/scalable/apps/plugin-fs.svg0000644000004100000410000007740313246301623023275 0ustar www-datawww-data image/svg+xml Desktop ./compizconfig/ccsm/images/scalable/apps/plugin-fakeargb.svg0000644000004100000410000004334213246301623024422 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/scalable/apps/plugin-kde.svg0000644000004100000410000002014013246301623023412 0ustar www-datawww-data image/svg+xml ./compizconfig/ccsm/images/scalable/apps/plugin-reflex.svg0000644000004100000410000002326613246301623024150 0ustar www-datawww-data image/svg+xml Patrick Niklau Reflection ./compizconfig/ccsm/images/48x48/0000755000004100000410000000000013246301623016723 5ustar www-datawww-data./compizconfig/ccsm/images/48x48/apps/0000755000004100000410000000000013246301623017666 5ustar www-datawww-data./compizconfig/ccsm/images/48x48/apps/ccsm.png0000644000004100000410000000321613246301623021323 0ustar www-datawww-dataPNG  IHDR00WUIDATxkLg,s42ba[̶at3ۇ}LLPC)"V+xwNDʥz-Rnr)O1w@ y}9Y^hfffq:եbw(,@bE}7xA^VĆv}'niX~S1+C}dؕREEhxo5Ǜ3ghH5X9E/*p؈'sw$p [vzVf4E@rĄ| (o XrWoy*ڍt! Q;S#;xoM*+5ΎdhȉC"oW.$$H>!pB::lWamA`mSVQ5j5N Q[ ؃c #Y$p 7q"5=$hcJJM͸jd=Q\0~yQ 5[GDX*m-KiԺ:vo85"@J7J(wlOD!Bƒɀ(! zդ ^q+LǎfN;m`hn@^[{%(LZyD')'"6 A\ht ^$D$TC:}jHKʪ.j(*]ݝ;\i /)HHb ~Z?pM3mnLD`wpe8 n#n $%HpIZI$䨒CPf\r)@bY_yHTbd+PӵJz&N ǑQLK>FtϥU$3;Z*w/Y`͚5A7FEPٽMfIT]d_F͊yD$_>y:9h``#0}~먂IENDB`./compizconfig/ccsm/images/24x24/0000755000004100000410000000000013246301623016707 5ustar www-datawww-data./compizconfig/ccsm/images/24x24/apps/0000755000004100000410000000000013246301623017652 5ustar www-datawww-data./compizconfig/ccsm/images/24x24/apps/ccsm.png0000644000004100000410000000146513246301623021313 0ustar www-datawww-dataPNG  IHDRשPLTE&&&\\\))$666dddgkg!K#J$M$M"Kƫ Jinoqloprmrtorsuptvqtwqvxrxzuy{wz|x}z~{Ֆ֟ܠᮯt;tRNS "$%&2489fgIDATx}eSQ[0V@51B]gϕ;|zg^&LKQd%|AU"20ShtP 0;%;vJg ǰ;18|a}m:B#^ktVZ{xp_ u͘ڍM!T.=|{ZΚ2 vdRWLU"w^Zq6%I3QCGJjZX89隘<ҽIENDB`./compizconfig/ccsm/images/16x16/0000755000004100000410000000000013246301623016711 5ustar www-datawww-data./compizconfig/ccsm/images/16x16/apps/0000755000004100000410000000000013246301623017654 5ustar www-datawww-data./compizconfig/ccsm/images/16x16/apps/ccsm.png0000644000004100000410000000101513246301623021304 0ustar www-datawww-dataPNG  IHDR(-SPLTE J J4ertRNSIDATWUv@>)jN-$ڠbb-4&缄"hߦi:ֲE&a0 ]m6Ff3 ^ev,Y +A*R<,A YQ^ wUL|Y[mV!͡{؉Qz 9g n,S#dIENDB`./compizconfig/ccsm/images/32x32/0000755000004100000410000000000013246301623016705 5ustar www-datawww-data./compizconfig/ccsm/images/32x32/apps/0000755000004100000410000000000013246301623017650 5ustar www-datawww-data./compizconfig/ccsm/images/32x32/apps/ccsm.svg0000644000004100000410000003621013246301623021320 0ustar www-datawww-data image/svg+xml Patrick Niklaus State ./compizconfig/ccsm/images/32x32/apps/ccsm.png0000644000004100000410000000217513246301623021310 0ustar www-datawww-dataPNG  IHDR szzbKGDtIME =IDATX[lUsf;햶.w]Z) ]Tli@bT M @|74>hbw4Fތ(7 %Բbmۂ;3`[\t m}|w7|߹ʇ_F)WMRމLn敠 7GjݺҚ>􉤥5E| ᯁ YZW]F1Fc9Z`PW80߉b̩9ɥ&S ad)k 65.慟%.9DPY`"'.ÜyyN*) ;Y(N7H)E6 K_)p]t ۅ Wq:3@ʙ%%+`ޗŗl xU{36OQQ1ivٳ{'O +vQRɌ)"RI.X}?x:d'8{lx{-H2 sH7R*p}1G{ܓ6K`{_O(""Jr=8ãHiaYp̰Rfdl̳8|328ԏiF67FƧER*`׮Ѐ";32|[&(JedU~?gv.7^b` t]'\3[l:pMiLJP8:׮R{|\ou9FV6JJCv׮gr?|G4AuiRC6cGQJyRiJD"cK/xx,i!F9x=vI@^'t YY&4kJP-j(;šCS__Ob"H@M DigO,AsܲE),)ilGۆ##Ž@v#C_5lūYuuu;|y'._ߗ_u.EIj/c~чԥ*hhh0f'3BCCPJ9R˔R7 IENDB`./compizconfig/ccsm/ccm/0000755000004100000410000000000013246301624015422 5ustar www-datawww-data./compizconfig/ccsm/ccm/Utils.py0000644000004100000410000003130413246301623017074 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import os import pygtk import gtk import gtk.gdk import gobject import pango import weakref from ccm.Constants import * from cgi import escape as protect_pango_markup import operator import itertools import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext IconTheme = gtk.icon_theme_get_default() if not IconDir in IconTheme.get_search_path(): IconTheme.prepend_search_path(IconDir) def gtk_process_events (): while gtk.events_pending (): gtk.main_iteration () def getScreens(): screens = [] display = gtk.gdk.display_get_default() nScreens = display.get_n_screens() for i in range(nScreens): screens.append(i) return screens def getDefaultScreen(): display = gtk.gdk.display_get_default() return display.get_default_screen().get_number() def protect_markup_dict (dict_): return dict((k, protect_pango_markup (v)) for (k, v) in dict_.items()) class Image (gtk.Image): def __init__ (self, name = None, type = ImageNone, size = 32, useMissingImage = False): gtk.Image.__init__ (self) if not name: return if useMissingImage: self.set_from_stock (gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_LARGE_TOOLBAR) return try: if type in (ImagePlugin, ImageCategory, ImageThemed): pixbuf = None if type == ImagePlugin: name = "plugin-" + name try: pixbuf = IconTheme.load_icon (name, size, 0) except gobject.GError: pixbuf = IconTheme.load_icon ("plugin-unknown", size, 0) elif type == ImageCategory: name = "plugins-" + name try: pixbuf = IconTheme.load_icon (name, size, 0) except gobject.GError: pixbuf = IconTheme.load_icon ("plugins-unknown", size, 0) else: pixbuf = IconTheme.load_icon (name, size, 0) self.set_from_pixbuf (pixbuf) elif type == ImageStock: self.set_from_stock (name, size) except gobject.GError as e: self.set_from_stock (gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_BUTTON) class ActionImage (gtk.Alignment): map = { "keyboard" : "input-keyboard", "button" : "input-mouse", "edges" : "video-display", "bell" : "audio-x-generic" } def __init__ (self, action): gtk.Alignment.__init__ (self, 0, 0.5) self.set_padding (0, 0, 0, 10) if action in self.map: action = self.map[action] self.add (Image (name = action, type = ImageThemed, size = 22)) class SizedButton (gtk.Button): minWidth = -1 minHeight = -1 def __init__ (self, minWidth = -1, minHeight = -1): super (SizedButton, self).__init__ () self.minWidth = minWidth self.minHeight = minHeight self.connect ("size-request", self.adjust_size) def adjust_size (self, widget, requisition): width, height = requisition.width, requisition.height newWidth = max (width, self.minWidth) newHeight = max (height, self.minHeight) self.set_size_request (newWidth, newHeight) class PrettyButton (gtk.Button): __gsignals__ = { 'expose-event' : 'override', } _old_toplevel = None def __init__ (self): super (PrettyButton, self).__init__ () self.states = { "focus" : False, "pointer" : False } self.set_size_request (200, -1) self.set_relief (gtk.RELIEF_NONE) self.connect ("focus-in-event", self.update_state_in, "focus") self.connect ("focus-out-event", self.update_state_out, "focus") self.connect ("hierarchy-changed", self.hierarchy_changed) def hierarchy_changed (self, widget, old_toplevel): if old_toplevel == self._old_toplevel: return if not old_toplevel and self.state != gtk.STATE_NORMAL: self.set_state(gtk.STATE_PRELIGHT) self.set_state(gtk.STATE_NORMAL) self._old_toplevel = old_toplevel def update_state_in (self, *args): state = args[-1] self.set_state (gtk.STATE_PRELIGHT) self.states[state] = True def update_state_out (self, *args): state = args[-1] self.states[state] = False if True in self.states.values (): self.set_state (gtk.STATE_PRELIGHT) else: self.set_state (gtk.STATE_NORMAL) def do_expose_event (self, event): has_focus = self.flags () & gtk.HAS_FOCUS if has_focus: self.unset_flags (gtk.HAS_FOCUS) ret = gtk.Button.do_expose_event (self, event) if has_focus: self.set_flags (gtk.HAS_FOCUS) return ret class Label(gtk.Label): def __init__(self, value = "", wrap = 160): gtk.Label.__init__(self, value) self.props.xalign = 0 self.props.wrap_mode = pango.WRAP_WORD self.set_line_wrap(True) self.set_size_request(wrap, -1) class NotFoundBox(gtk.Alignment): def __init__(self, value=""): gtk.Alignment.__init__(self, 0.5, 0.5, 0.0, 0.0) box = gtk.HBox() self.Warning = gtk.Label() self.Markup = _("No matches found. \n\n Your filter \"%s\" does not match any items.") value = protect_pango_markup(value) self.Warning.set_markup(self.Markup % value) image = Image("face-surprise", ImageThemed, 48) box.pack_start(image, False, False, 0) box.pack_start(self.Warning, True, True, 15) self.add(box) def update(self, value): value = protect_pango_markup(value) self.Warning.set_markup(self.Markup % value) class IdleSettingsParser: def __init__(self, context, main): def FilterPlugin (p): return not p.Initialized and p.Enabled self.Context = context self.Main = main self.PluginList = [p for p in self.Context.Plugins.items() if FilterPlugin(p[1])] nCategories = len (main.MainPage.RightWidget._boxes) self.CategoryLoadIconsList = list(range(3, nCategories)) # Skip the first 3 print('Loading icons...') gobject.timeout_add (150, self.Wait) def Wait(self): if not self.PluginList: return False if len (self.CategoryLoadIconsList) == 0: # If we're done loading icons gobject.idle_add (self.ParseSettings) else: gobject.idle_add (self.LoadCategoryIcons) return False def ParseSettings(self): name, plugin = self.PluginList[0] if not plugin.Initialized: plugin.Update () self.Main.RefreshPage(plugin) self.PluginList.remove (self.PluginList[0]) gobject.timeout_add (200, self.Wait) return False def LoadCategoryIcons(self): from ccm.Widgets import PluginButton catIndex = self.CategoryLoadIconsList[0] pluginWindow = self.Main.MainPage.RightWidget categoryBox = pluginWindow._boxes[catIndex] for (pluginIndex, plugin) in \ enumerate (categoryBox.get_unfiltered_plugins()): categoryBox._buttons[pluginIndex] = PluginButton (plugin) categoryBox.rebuild_table (categoryBox._current_cols, True) pluginWindow.connect_buttons (categoryBox) self.CategoryLoadIconsList.remove (self.CategoryLoadIconsList[0]) gobject.timeout_add (150, self.Wait) return False # Updates all registered setting when they where changed through CompizConfig class Updater: def __init__ (self): self.VisibleSettings = {} self.Plugins = [] self.Block = 0 def SetContext (self, context): self.Context = context gobject.timeout_add (2000, self.Update) def Append (self, widget): reference = weakref.ref(widget) setting = widget.Setting self.VisibleSettings.setdefault((setting.Plugin.Name, setting.Name), []).append(reference) def AppendPlugin (self, plugin): self.Plugins.append (plugin) def Remove (self, widget): setting = widget.Setting l = self.VisibleSettings.get((setting.Plugin.Name, setting.Name)) if not l: return for i, ref in enumerate(list(l)): if ref() is widget: l.remove(ref) break def UpdatePlugins(self): for plugin in self.Plugins: plugin.Read() def UpdateSetting (self, setting): widgets = self.VisibleSettings.get((setting.Plugin.Name, setting.Name)) if not widgets: return for reference in widgets: widget = reference() if widget is not None: widget.Read() def Update (self): if self.Block > 0: return True if self.Context.ProcessEvents(): changed = self.Context.ChangedSettings if [s for s in changed if s.Plugin.Name == "core" and s.Name == "active_plugins"]: self.UpdatePlugins() for setting in list(changed): widgets = self.VisibleSettings.get((setting.Plugin.Name, setting.Name)) if widgets: for reference in widgets: widget = reference() if widget is not None: widget.Read() if widget.List: widget.ListWidget.Read() changed.remove(setting) self.Context.ChangedSettings = changed return True GlobalUpdater = Updater () class PluginSetting: def __init__ (self, plugin, widget, handler): self.Widget = widget self.Plugin = plugin self.Handler = handler GlobalUpdater.AppendPlugin (self) def Read (self): widget = self.Widget widget.handler_block(self.Handler) widget.set_active (self.Plugin.Enabled) widget.set_sensitive (self.Plugin.Context.AutoSort) widget.handler_unblock(self.Handler) class PureVirtualError(Exception): pass def SettingKeyFunc(value): return value.Plugin.Ranking[value.Name] def CategoryKeyFunc(category): if 'General' == category: return '' else: return category or 'zzzzzzzz' def GroupIndexKeyFunc(item): return item[1][0] FirstItemKeyFunc = operator.itemgetter(0) EnumSettingKeyFunc = operator.itemgetter(1) PluginKeyFunc = operator.attrgetter('ShortDesc') def HasOnlyType (settings, stype): return settings and not [s for s in settings if s.Type != stype] def GetSettings(group, types=None): def TypeFilter (settings, types): for setting in settings: if setting.Type in types: yield setting if types: screen = TypeFilter(iter(group.Screen.values()), types) else: screen = iter(group.Screen.values()) return screen def GetAcceleratorName(key, mods): # is everywhere except for Mac OS return gtk.accelerator_name(key, mods).replace('', '') # Support python 2.4 try: any all except NameError: def any(iterable): for element in iterable: if element: return True return False def all(iterable): for element in iterable: if not element: return False return True ./compizconfig/ccsm/ccm/Window.py0000644000004100000410000000772613246301623017256 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gtk.gdk from ccm.Pages import * from ccm.Utils import * from ccm.Constants import * from ccm.Conflicts import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext class MainWin(gtk.Window): currentCategory = None def __init__(self, Context, pluginPage=None, categoryName=None): gtk.Window.__init__(self) self.ShowingPlugin = None self.Context = Context self.connect("destroy", self.Quit) self.set_default_size(990, 580) self.set_title(_("CompizConfig Settings Manager")) # Build the panes self.MainBox = gtk.HBox() self.add(self.MainBox) self.LeftPane = gtk.VBox() self.RightPane = gtk.VBox() self.RightPane.set_border_width(5) self.MainBox.pack_start(self.LeftPane, False, False) self.MainBox.pack_start(self.RightPane, True, True) self.MainPage = MainPage(self, self.Context) self.CurrentPage = None self.SetPage(self.MainPage) self.LeftPane.set_size_request(self.LeftPane.size_request()[0], -1) self.show_all() if pluginPage in self.Context.Plugins: self.MainPage.ShowPlugin(None, self.Context.Plugins[pluginPage]) if categoryName in self.Context.Categories: self.MainPage.ToggleCategory(None, categoryName) def Quit(self, *args): gtk.main_quit() def SetPage(self, page): if page == self.CurrentPage: return if page != self.MainPage: page.connect('go-back', self.BackToMain) if self.CurrentPage: leftWidget = self.CurrentPage.LeftWidget rightWidget = self.CurrentPage.RightWidget leftWidget.hide_all() rightWidget.hide_all() self.LeftPane.remove(leftWidget) self.RightPane.remove(rightWidget) if self.CurrentPage != self.MainPage: leftWidget.destroy() rightWidget.destroy() self.LeftPane.pack_start(page.LeftWidget, True, True) self.RightPane.pack_start(page.RightWidget, True, True) self.CurrentPage = page self.show_all() def BackToMain(self, widget): self.SetPage(self.MainPage) self.MainPage.filterEntry.grab_focus() def RefreshPage(self, updatedPlugin): currentPage = self.CurrentPage if isinstance(currentPage, PluginPage) and currentPage.Plugin: for basePlugin in updatedPlugin.GetExtensionBasePlugins (): # If updatedPlugin is an extension plugin and a base plugin # is currently being displayed, then update its current page if currentPage.Plugin.Name == basePlugin.Name: if currentPage.CheckDialogs(basePlugin, self): currentPage.RefreshPage(basePlugin, self) break gtk.window_set_default_icon_name('ccsm') ./compizconfig/ccsm/ccm/Pages.py0000644000004100000410000014641613246301623017046 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gobject import gtk.gdk import compizconfig ccs = compizconfig from ccm.Constants import * from ccm.Settings import * from ccm.Conflicts import * from ccm.Utils import * from ccm.Widgets import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext CurrentUpdater = None # Generic Page # class GenericPage(gobject.GObject): __gsignals__ = {"go-back" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [])} LeftWidget = None RightWidget = None def __init__(self): gobject.GObject.__init__(self) def GoBack(self, widget): self.emit('go-back') # Plugin Page # class PluginPage(GenericPage): def __init__(self, plugin): GenericPage.__init__(self) self.Plugin = plugin self.LeftWidget = gtk.VBox(False, 10) self.LeftWidget.set_border_width(10) pluginLabel = Label() pluginLabel.set_markup(HeaderMarkup % (plugin.ShortDesc)) pluginLabel.connect("style-set", self.HeaderStyleSet) pluginImg = Image(plugin.Name, ImagePlugin, 64) filterLabel = Label() filterLabel.set_markup(HeaderMarkup % (_("Filter"))) filterLabel.connect("style-set", self.HeaderStyleSet) self.FilterEntry = ClearEntry() self.FilterEntry.connect("changed", self.FilterChanged) self.LeftWidget.pack_start(pluginImg, False, False) self.LeftWidget.pack_start(filterLabel, False, False) self.LeftWidget.pack_start(self.FilterEntry, False, False) self.LeftWidget.pack_start(pluginLabel, False, False) infoLabelCont = gtk.HBox() infoLabelCont.set_border_width(10) self.LeftWidget.pack_start(infoLabelCont, False, False) infoLabel = Label(plugin.LongDesc, 180) infoLabelCont.pack_start(infoLabel, True, True) self.NotFoundBox = None if plugin.Name != 'core': self.FilterEntry.set_tooltip_text(_("Search %s Plugin Options") % plugin.ShortDesc) enableLabel = Label() enableLabel.set_markup(HeaderMarkup % (_("Use This Plugin"))) enableLabel.connect("style-set", self.HeaderStyleSet) self.LeftWidget.pack_start(enableLabel, False, False) enableCheckCont = gtk.HBox() enableCheckCont.set_border_width(10) self.LeftWidget.pack_start(enableCheckCont, False, False) enableCheck = gtk.CheckButton() enableCheck.add(Label(_("Enable %s") % plugin.ShortDesc, 120)) enableCheck.set_tooltip_text(plugin.LongDesc) enableCheck.set_active(plugin.Enabled) enableCheck.set_sensitive(plugin.Context.AutoSort) enableCheckCont.pack_start(enableCheck, True, True) enableCheck.connect('toggled', self.EnablePlugin) else: self.FilterEntry.set_tooltip_text(_("Search Compiz Core Options")) backButton = gtk.Button(gtk.STOCK_GO_BACK) backButton.set_use_stock(True) self.LeftWidget.pack_end(backButton, False, False) backButton.connect('clicked', self.GoBack) self.RightWidget = gtk.Notebook() self.RightWidget.set_scrollable(True) self.Pages = [] sortedGroups = sorted(plugin.Groups.items(), key=GroupIndexKeyFunc) for (name, (groupIndex, group)) in sortedGroups: name = name or _("General") groupPage = GroupPage(name, group) groupPage.Wrap() if not groupPage.Empty: self.RightWidget.append_page(groupPage.Scroll, gtk.Label(name)) self.Pages.append(groupPage) self.RightWidget.connect('size-allocate', self.ResetFocus) self.Block = 0 StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def ResetFocus(self, widget, data): pos = self.FilterEntry.get_position() self.FilterEntry.grab_focus() self.FilterEntry.set_position(pos) def GetPageSpot(self, new): vpos = 0 #visible position for page in self.Pages: if page is new: break if page.Visible: vpos += 1 return vpos def ShowFilterError(self, text): if self.NotFoundBox is None: self.NotFoundBox = NotFoundBox(text) self.RightWidget.append_page(self.NotFoundBox, gtk.Label(_("Error"))) else: self.NotFoundBox.update(text) def HideFilterError(self): if self.NotFoundBox is None: return num = self.RightWidget.page_num(self.NotFoundBox) if num >= 0: self.RightWidget.remove_page(num) self.NotFoundBox.destroy() self.NotFoundBox = None self.RightWidget.set_current_page(0) def FilterChanged(self, widget): text = widget.get_text().lower() if text == "": text = None empty = True for page in self.Pages: num = self.RightWidget.page_num(page.Scroll) if page.Filter(text): empty = False if num < 0: self.RightWidget.insert_page(page.Scroll, gtk.Label(page.Name), self.GetPageSpot(page)) else: if num >= 0: self.RightWidget.remove_page(num) if empty: self.ShowFilterError(text) else: self.HideFilterError() self.RightWidget.show_all() # This seems to be necessary to ensure all gaps from hidden settings are removed on all tabs for page in self.Pages: page.Scroll.queue_resize_no_redraw() def EnablePlugin(self, widget): if self.Block > 0: return self.Block += 1 # attempt to resolve conflicts... conflicts = self.Plugin.Enabled and self.Plugin.DisableConflicts or self.Plugin.EnableConflicts conflict = PluginConflict(self.Plugin, conflicts) if conflict.Resolve(): self.Plugin.Enabled = widget.get_active() else: widget.set_active(self.Plugin.Enabled) self.Plugin.Context.Write() self.Block -= 1 GlobalUpdater.UpdatePlugins() # Checks if any edit dialog is open, and if so, makes sure a refresh # happens when it closes. def CheckDialogs(self, basePlugin, main): for groupPage in self.Pages: if isinstance(groupPage, GroupPage): for sga in groupPage.subGroupAreas: for setting in sga.MySettings: if isinstance(setting, BaseListSetting) and \ setting.EditDialog and setting.EditDialogOpen: setting.PageToBeRefreshed = (self, basePlugin, main) return False return True def RefreshPage(self, basePlugin, main): curPage = self.RightWidget.get_current_page () main.BackToMain (None) main.MainPage.ShowPlugin (None, basePlugin) main.CurrentPage.RightWidget.set_current_page (curPage) # Filter Page # class FilterPage(GenericPage): def __init__(self, context): GenericPage.__init__(self) self.Context = context self.LeftWidget = gtk.VBox(False, 10) self.LeftWidget.set_border_width(10) self.RightWidget = gtk.Notebook() self.RightChild = gtk.VBox() # Image + Label filterLabel = Label() filterLabel.set_markup(HeaderMarkup % (_("Filter"))) filterLabel.connect("style-set", self.HeaderStyleSet) filterImg = Image("search", ImageCategory, 64) self.LeftWidget.pack_start(filterImg, False, False) self.LeftWidget.pack_start(filterLabel, False, False) # Entry FIXME find a solution with std gtk self.FilterEntry = ClearEntry() self.FilterEntry.set_icon_from_icon_name(gtk.ENTRY_ICON_PRIMARY, "input-keyboard") self.FilterEntry.set_icon_tooltip_text(gtk.ENTRY_ICON_PRIMARY, _("Grab Keys")) self.FilterEntry.connect('icon-press', self.GrabKey) self.FilterEntry.set_tooltip_text(_("Enter a filter.\nClick the keyboard image to grab a key for which to search.")) self.FilterEntry.connect("changed", self.FilterChanged) self.LeftWidget.pack_start(self.FilterEntry, False, False) # Search in... filterSearchLabel = Label() filterSearchLabel.set_markup(HeaderMarkup % (_("Search in..."))) filterSearchLabel.connect("style-set", self.HeaderStyleSet) self.LeftWidget.pack_start(filterSearchLabel, False, False) # Options self.FilterNameCheck = check = gtk.CheckButton(_("Short description and name")) check.set_active(True) check.connect("toggled", self.LevelChanged, FilterName) self.LeftWidget.pack_start(check, False, False) self.FilterLongDescCheck = check = gtk.CheckButton(_("Long description")) check.set_active(True) check.connect("toggled", self.LevelChanged, FilterLongDesc) self.LeftWidget.pack_start(check, False, False) self.FilterValueCheck = check = gtk.CheckButton(_("Settings value")) check.set_active(False) check.connect("toggled", self.LevelChanged, FilterValue) self.LeftWidget.pack_start(check, False, False) # Back Button self.BackButton = gtk.Button(gtk.STOCK_GO_BACK) self.BackButton.set_use_stock(True) self.BackButton.connect('clicked', self.GoBack) self.LeftWidget.pack_end(self.BackButton, False, False) self.NotFoundBox = None # Selector self.CurrentPlugin = None self.CurrentGroup = None self.CurrentSubGroup = None self.PackedPlugins = () self.PackedGroups = () self.PackedSubGroups = () self.SelectorButtons = SelectorButtons() self.PluginBox = PluginView(context.Plugins) self.PluginBox.SelectionHandler = self.PluginChanged self.GroupBox = GroupView(_("Group")) self.GroupBox.SelectionHandler = self.GroupChanged self.SubGroupBox = GroupView(_("Subgroup")) self.SubGroupBox.SelectionHandler = self.SubGroupChanged self.PluginBox.set_size_request(250, 180) self.GroupBox.set_size_request(220, 180) self.SubGroupBox.set_size_request(220, 180) self.SelectorButtons.set_size_request(-1, 50) self.SelectorBoxes = gtk.HBox() self.SelectorBoxes.set_border_width(5) self.SelectorBoxes.set_spacing(5) scroll = gtk.ScrolledWindow() scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.add(self.PluginBox) self.SelectorBoxes.pack_start(scroll, False, False) scroll = gtk.ScrolledWindow() scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.add(self.GroupBox) self.SelectorBoxes.pack_start(scroll, False, False) scroll = gtk.ScrolledWindow() scroll.add(self.SubGroupBox) scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.SelectorBoxes.pack_start(scroll, False, False) self.RightChild.pack_start(self.SelectorButtons, False, False) self.RightChild.pack_start(self.SelectorBoxes, False, False) self.SettingsArea = gtk.ScrolledWindow() ebox = gtk.EventBox() self.SettingsBox = gtk.VBox() ebox.add(self.SettingsBox) self.SettingsBox.set_border_width(5) self.SettingsArea.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC self.SettingsArea.props.vscrollbar_policy = gtk.POLICY_ALWAYS self.SettingsArea.set_border_width(5) self.SettingsArea.add_with_viewport(ebox) self.RightChild.pack_start(self.SettingsArea, True, True) GlobalUpdater.Block += 1 # Notebook self.NotebookLabel = gtk.Label(_("Settings")) self.NotebookChild = gtk.EventBox() self.NotebookChild.add(self.RightChild) self.RightWidget.append_page(self.NotebookChild, self.NotebookLabel) box = gtk.VBox() box.set_border_width(5) progress = Popup(child=box) progress.connect("delete-event", lambda *a: True) progress.set_title(_("Loading Advanced Search")) bar = gtk.ProgressBar() box.pack_start(bar, False, False) label = gtk.Label() box.pack_start(label, False, False) progress.set_size_request(300, -1) progress.show_all() self.GroupPages = {} length = len(context.Plugins) for index, n in enumerate(context.Plugins): plugin = context.Plugins[n] bar.set_fraction((index+1)/float(length)) label.set_markup("%s" %protect_pango_markup(plugin.ShortDesc)) gtk_process_events() groups = [] sortedGroups = sorted(plugin.Groups.items(), key=GroupIndexKeyFunc) for (name, (groupIndex, group)) in sortedGroups: groups.append((name, GroupPage(name or _('General'), group))) self.GroupPages[n] = groups self.Level = FilterName | FilterLongDesc self.FilterChanged() progress.destroy() gtk_process_events() GlobalUpdater.Block -= 1 StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def Filter(self, text, level=FilterAll): text = text.lower() for plugin in self.GroupPages: groups = self.GroupPages[plugin] results = dict((n, sg) for (n, sg) in groups if sg.Filter(text, level=level)) if results: yield plugin, results def GotKey(self, widget, key, mods): new = GetAcceleratorName (key, mods) for mod in KeyModifier: if "%s_L" % mod in new: new = new.replace ("%s_L" % mod, "<%s>" % mod) if "%s_R" % mod in new: new = new.replace ("%s_R" % mod, "<%s>" % mod) widget.destroy() self.FilterValueCheck.set_active(True) self.FilterEntry.set_text(new) def GrabKey(self, widget, pos, event): if pos != gtk.ENTRY_ICON_PRIMARY: return grabber = KeyGrabber(label = _("Grab key combination")) self.LeftWidget.pack_start(grabber, False, False) grabber.hide() grabber.set_no_show_all(True) grabber.connect('changed', self.GotKey) grabber.begin_key_grab(None) def ShowFilterError(self, text): if self.NotFoundBox is None: self.NotFoundBox = NotFoundBox(text) self.NotebookChild.remove(self.RightChild) self.NotebookChild.add(self.NotFoundBox) self.NotebookLabel.set_text(_("Error")) self.NotebookChild.show_all() else: self.NotFoundBox.update(text) def HideFilterError(self): if self.NotFoundBox is None: return num = self.RightWidget.page_num(self.NotFoundBox) if num >= 0: self.RightWidget.remove_page(num) self.NotebookChild.remove(self.NotFoundBox) self.NotebookChild.add(self.RightChild) self.NotFoundBox.destroy() self.NotFoundBox = None self.NotebookLabel.set_text(_("Settings")) self.NotebookChild.show_all() def UpdatePluginBox(self): self.PluginBox.Filter(self.Results) self.UpdateGroupBox() def UpdateGroupBox(self): if self.CurrentPlugin is None: self.GroupBox.Update(()) else: self.GroupBox.Update(self.Results[self.CurrentPlugin.Name]) self.UpdateSubGroupBox() def UpdateSubGroupBox(self): if self.CurrentPlugin is not None and self.CurrentGroup in self.Results[self.CurrentPlugin.Name]: grouppage = self.Results[self.CurrentPlugin.Name][self.CurrentGroup] self.SubGroupBox.Update(sga.Name for sga in grouppage.VisibleAreas) else: self.SubGroupBox.Update(()) def UpdateSelectorButtons(self): self.SelectorButtons.clear_buttons() if self.CurrentPlugin is not None: self.SelectorButtons.add_button(self.CurrentPlugin.ShortDesc, self.PluginChanged) if self.CurrentGroup is not None: self.SelectorButtons.add_button(self.CurrentGroup or _("General"), self.GroupChanged) if self.CurrentSubGroup is not None: self.SelectorButtons.add_button(self.CurrentSubGroup or _("General"), self.SubGroupChanged) def PluginChanged(self, plugin=None, selector=False): if not selector: self.CurrentPlugin = plugin self.CurrentGroup = None self.CurrentSubGroup = None self.UpdateSelectorButtons() if not selector: self.UpdateGroupBox() else: self.GroupBox.get_selection().unselect_all() self.UpdateSubGroupBox() if self.CurrentPlugin is not None: self.PackSettingsBox(plugins=[self.CurrentPlugin]) else: self.PackSettingsBox() self.RightChild.show_all() def GroupChanged(self, group=None, selector=False): if group == 'All': self.PluginChanged(selector=True) return if not selector: self.CurrentGroup = group self.CurrentSubGroup = None self.UpdateSelectorButtons() if not selector: self.UpdateSubGroupBox() else: self.SubGroupBox.get_selection().unselect_all() if self.CurrentGroup is not None: page = self.Results[self.CurrentPlugin.Name][self.CurrentGroup] self.PackSettingsBox(groups=[page]) else: self.PackSettingsBox() self.RightChild.show_all() def SubGroupChanged(self, subGroup=None, selector=False): if subGroup == 'All': self.GroupChanged(selector=True) return if not selector: self.CurrentSubGroup = subGroup self.UpdateSelectorButtons() if self.CurrentSubGroup is not None: sgas = self.Results[self.CurrentPlugin.Name][self.CurrentGroup].VisibleAreas sga = [sga for sga in sgas if sga.Name == self.CurrentSubGroup] self.PackSettingsBox(subgroups=sga) else: self.PackSettingsBox() self.RightChild.show_all() def LevelChanged(self, widget, level): if widget.get_active(): if level & self.Level: return self.Level |= level else: if not level & self.Level: return self.Level &= ~level self.FilterChanged() def PackSettingsBox(self, plugins=None, groups=None, subgroups=None): for pluginbox in self.PackedPlugins: for child in pluginbox.get_children(): pluginbox.remove(child) pluginbox.destroy() self.PackedPlugins = () for group in self.PackedGroups: if group.Widget.get_parent(): group.Widget.get_parent().remove(group.Widget) self.PackedGroups = () for subgroup in self.PackedSubGroups: if subgroup.Widget.get_parent(): subgroup.Widget.get_parent().remove(subgroup.Widget) subgroup.Widget.destroy() self.PackedSubGroups = () if plugins is not None: self.PackedPlugins = [] self.PackedGroups = [] for plugin in plugins: box = gtk.VBox() for (pageName, page) in self.GroupPages[plugin.Name]: box.pack_start(page.Label, False, False) box.pack_start(page.Widget, False, False) self.PackedGroups.append(page) self.SettingsBox.pack_start(box, False, False) self.PackedPlugins.append(box) if groups is not None: self.PackedGroups = [] for page in groups: self.SettingsBox.pack_start(page.Widget, False, False) self.PackedGroups.append(page) if subgroups is not None: self.PackedSubGroups = [] for area in subgroups: sga = SubGroupArea('', area.SubGroup) sga.Filter(self.FilterEntry.get_text().lower()) self.SettingsBox.pack_start(sga.Widget, False, False) self.PackedSubGroups.append(sga) self.SettingsBox.show_all() def FilterChanged(self, widget=None): self.Results = dict(self.Filter(self.FilterEntry.get_text(), level=self.Level)) self.PluginBox.Filter(self.Results) self.UpdateGroupBox() self.UpdateSelectorButtons() for sga in self.PackedSubGroups: sga.Filter(self.FilterEntry.get_text().lower()) self.SettingsBox.queue_resize_no_redraw() self.RightWidget.show_all() if not self.Results: self.ShowFilterError(self.FilterEntry.get_text()) elif self.NotFoundBox: self.HideFilterError() def GoBack(self, widget): for groups in self.GroupPages.values(): for (pageName, page) in groups: page.SetContainer.destroy() self.GroupPages = None self.emit('go-back') # Profile and Backend Page # class ProfileBackendPage(object): def __init__(self, context): self.Context = context rightChild = gtk.VBox() rightChild.set_border_width(10) # Profiles profileBox = gtk.HBox() profileBox.set_spacing(5) profileAdd = gtk.Button() profileAdd.set_tooltip_text(_("Add a New Profile")) profileAdd.set_image(gtk.image_new_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_BUTTON)) self.ProfileRemoveButton = profileRemove = gtk.Button() profileRemove.set_tooltip_text(_("Remove This Profile")) profileRemove.set_image(gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_BUTTON)) self.ProfileComboBox = gtk.combo_box_new_text() self.ProfileComboBox.set_sensitive(self.Context.CurrentBackend.ProfileSupport) self.ProfileComboBox.append_text(_("Default")) active = -1 for i, name in enumerate(self.Context.Profiles): profile = self.Context.Profiles[name] self.ProfileComboBox.append_text(profile.Name) if name == self.Context.CurrentProfile.Name: active = i self.ProfileHandler = self.ProfileComboBox.connect("changed", self.ProfileChangedAddTimeout) self.ProfileComboBox.set_active(active+1) profileAdd.connect("clicked", self.AddProfile) profileRemove.connect("clicked", self.RemoveProfile) profileBox.pack_start(self.ProfileComboBox, True, True) profileBox.pack_start(profileAdd, False, False) profileBox.pack_start(profileRemove, False, False) profileLabel = Label() profileLabel.set_markup(HeaderMarkup % (_("Profile"))) profileLabel.connect("style-set", self.HeaderStyleSet) self.ProfileImportExportBox = gtk.HBox() self.ProfileImportExportBox.set_spacing(5) profileImportButton = gtk.Button(_("Import")) profileImportButton.set_tooltip_text(_("Import a CompizConfig Profile")) profileImportAsButton = gtk.Button(_("Import as...")) profileImportAsButton.set_tooltip_text(_("Import a CompizConfig Profile as a new profile")) profileExportButton = gtk.Button(_("Export")) profileExportButton.set_tooltip_text(_("Export your CompizConfig Profile")) profileResetButton = gtk.Button(_("Reset to defaults")) profileResetButton.set_tooltip_text(_("Reset your CompizConfig Profile to the global defaults")) profileResetButton.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_BUTTON)) profileImportButton.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)) profileImportAsButton.set_image(gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)) profileExportButton.set_image(gtk.image_new_from_stock(gtk.STOCK_SAVE, gtk.ICON_SIZE_BUTTON)) profileImportButton.connect("clicked", self.ImportProfile) profileImportAsButton.connect("clicked", self.ImportProfileAs) profileExportButton.connect("clicked", self.ExportProfile) profileResetButton.connect("clicked", self.ResetProfile) self.ProfileImportExportBox.pack_start(profileImportButton, False, False) self.ProfileImportExportBox.pack_start(profileImportAsButton, False, False) self.ProfileImportExportBox.pack_start(profileExportButton, False, False) self.ProfileImportExportBox.pack_start(profileResetButton, False, False) rightChild.pack_start(profileLabel, False, False, 5) rightChild.pack_start(profileBox, False, False, 5) rightChild.pack_start(self.ProfileImportExportBox, False, False, 5) # Backends backendBox = gtk.combo_box_new_text() active = 0 for i, name in enumerate(self.Context.Backends): backend = self.Context.Backends[name] backendBox.append_text(backend.ShortDesc) if name == self.Context.CurrentBackend.Name: active = i backendBox.set_active(active) backendBox.connect("changed", self.BackendChangedAddTimeout) backendLabel = Label() backendLabel.set_markup(HeaderMarkup % (_("Backend"))) backendLabel.connect("style-set", self.HeaderStyleSet) rightChild.pack_start(backendLabel, False, False, 5) rightChild.pack_start(backendBox, False, False, 5) # Integration integrationLabel = Label() integrationLabel.set_markup(HeaderMarkup % (_("Integration"))) integrationLabel.connect("style-set", self.HeaderStyleSet) self.IntegrationButton = gtk.CheckButton(_("Enable integration into the desktop environment")) self.IntegrationButton.set_active(self.Context.Integration) self.IntegrationButton.set_sensitive(self.Context.CurrentBackend.IntegrationSupport) self.IntegrationButton.connect("toggled", self.IntegrationChanged) rightChild.pack_start(integrationLabel, False, False, 5) rightChild.pack_start(self.IntegrationButton, False, False, 5) self.Widget = rightChild StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def UpdateProfiles (self, current=_("Default")): self.ProfileComboBox.handler_block (self.ProfileHandler) self.Context.Read () self.Context.UpdateProfiles () self.ProfileComboBox.get_model ().clear () set = False for index, profile in enumerate ([_("Default")] + list (self.Context.Profiles)): self.ProfileComboBox.append_text (profile) if profile == current and not set: self.ProfileComboBox.set_active (index) set = True self.ProfileRemoveButton.set_sensitive (self.ProfileComboBox.get_active() != 0) self.ProfileComboBox.handler_unblock (self.ProfileHandler) GlobalUpdater.UpdatePlugins() def IntegrationChanged(self, widget): value = widget.get_active() self.Context.Integration = value def ProfileChanged(self, widget): name = widget.get_active_text() if name == _("Default"): self.Context.ResetProfile() elif name in self.Context.Profiles: self.Context.CurrentProfile = self.Context.Profiles[name] else: self.ProfileComboBox.set_active (0) return self.ProfileRemoveButton.set_sensitive (self.ProfileComboBox.get_active() != 0) self.Context.Read() self.Context.Write() GlobalUpdater.UpdatePlugins() return False def ProfileChangedAddTimeout(self, widget): gobject.timeout_add (500, self.ProfileChanged, widget) def CreateFilter(self, chooser): filter = gtk.FileFilter() filter.add_pattern("*.profile") filter.set_name(_("Profiles (*.profile)")) chooser.add_filter(filter) filter = gtk.FileFilter() filter.add_pattern("*") filter.set_name(_("All files")) chooser.add_filter(filter) def ResetProfile(self, widget): for plugin in self.Context.Plugins.values(): settings = GetSettings(plugin) for setting in settings: setting.Reset() activePlugins = self.Context.Plugins['core'].Screen['active_plugins'].Value for plugin in self.Context.Plugins.values(): plugin.Enabled = plugin.Name in activePlugins self.Context.Write() GlobalUpdater.UpdatePlugins() def ExportProfile(self, widget): main = widget.get_toplevel() b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK) chooser = gtk.FileChooserDialog(title=_("Save file.."), parent=main, buttons=b, action=gtk.FILE_CHOOSER_ACTION_SAVE) chooser.set_current_folder(os.environ.get("HOME")) self.CreateFilter(chooser) ret = chooser.run() path = chooser.get_filename() chooser.destroy() if ret == gtk.RESPONSE_OK: dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO) dlg.set_markup(_("Do you want to skip default option values while exporting your profile?")) ret = dlg.run() dlg.destroy() if not path.endswith(".profile"): path = "%s.profile" % path self.Context.Export(path, ret == gtk.RESPONSE_YES) def ImportProfileDialog (self, main): b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) chooser = gtk.FileChooserDialog (title = _("Open file.."), parent = main, buttons = b) chooser.set_current_folder (os.environ.get ("HOME")) self.CreateFilter (chooser) ret = chooser.run () path = chooser.get_filename () chooser.destroy () if ret == gtk.RESPONSE_OK: return path return None def ProfileNameDialog (self, main): dlg = gtk.Dialog (_("Enter a profile name"), main, gtk.DIALOG_MODAL) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_ADD, gtk.RESPONSE_OK) entry = gtk.Entry () label = gtk.Label (_("Please enter a name for the new profile:")) dlg.vbox.pack_start (label, False, False, 5) dlg.vbox.pack_start (entry, False, False, 5) dlg.set_size_request (340, 120) dlg.show_all () ret = dlg.run () text = entry.get_text () dlg.destroy() if ret == gtk.RESPONSE_OK: return text return None def ImportProfile (self, widget): main = widget.get_toplevel () path = self.ImportProfileDialog (main) if path: self.Context.Import (path) GlobalUpdater.UpdatePlugins() def ImportProfileAs (self, widget): main = widget.get_toplevel () path = self.ImportProfileDialog (main) if not path: return name = self.ProfileNameDialog (main) if not name: return self.Context.CurrentProfile = ccs.Profile (self.Context, name) self.UpdateProfiles (name) self.Context.Import (path) def AddProfile (self, widget): main = widget.get_toplevel () name = self.ProfileNameDialog (main) if name: self.Context.CurrentProfile = ccs.Profile (self.Context, name) self.UpdateProfiles (name) def RemoveProfile(self, widget): name = self.ProfileComboBox.get_active_text() if name != _("Default"): self.Context.ResetProfile() self.Context.Profiles[name].Delete() self.UpdateProfiles() def BackendChanged(self, widget): shortDesc = widget.get_active_text() name = "" for backend in self.Context.Backends.values(): if backend.ShortDesc == shortDesc: name = backend.Name break if name != "": self.Context.ResetProfile() self.Context.CurrentBackend = self.Context.Backends[name] self.UpdateProfiles() else: raise Exception(_("Backend not found.")) self.ProfileComboBox.set_sensitive(self.Context.CurrentBackend.ProfileSupport) self.IntegrationButton.set_sensitive(self.Context.CurrentBackend.IntegrationSupport) GlobalUpdater.UpdatePlugins() return False def BackendChangedAddTimeout(self, widget): gobject.timeout_add (500, self.BackendChanged, widget) # Plugin List Page # class PluginListPage(object): def __init__(self, context): self.Context = context self.Block = 0 rightChild = gtk.VBox() rightChild.set_border_width(10) # Auto sort autoSort = gtk.CheckButton(_("Automatic plugin sorting")) rightChild.pack_start(autoSort, False, False, 10) # Lists listBox = gtk.HBox() listBox.set_spacing(5) self.DisabledPluginsList = ScrolledList(_("Disabled Plugins")) self.EnabledPluginsList = ScrolledList(_("Enabled Plugins")) # Left/Right buttons self.MiddleButtonBox = buttonBox = gtk.VBox() buttonBox.set_spacing(5) boxAlignment = gtk.Alignment(0.0, 0.5, 0.0, 0.0) boxAlignment.add(buttonBox) rightButton = gtk.Button() rightImage = Image(gtk.STOCK_GO_FORWARD, ImageStock, gtk.ICON_SIZE_BUTTON) rightButton.set_image(rightImage) rightButton.connect("clicked", self.EnablePlugins) leftButton = gtk.Button() leftImage = Image(gtk.STOCK_GO_BACK, ImageStock, gtk.ICON_SIZE_BUTTON) leftButton.set_image(leftImage) leftButton.connect("clicked", self.EnabledPluginsList.delete) buttonBox.pack_start(rightButton, False, False) buttonBox.pack_start(leftButton, False, False) # Up/Down buttons enabledBox = gtk.VBox() enabledBox.set_spacing(10) enabledAlignment = gtk.Alignment(0.5, 0.0, 0.0, 0.0) self.EnabledButtonBox = enabledButtonBox = gtk.HBox() enabledButtonBox.set_spacing(5) enabledAlignment.add(enabledButtonBox) upButton = gtk.Button(gtk.STOCK_GO_UP) downButton = gtk.Button(gtk.STOCK_GO_DOWN) upButton.set_use_stock(True) downButton.set_use_stock(True) upButton.connect('clicked', self.EnabledPluginsList.move_up) downButton.connect('clicked', self.EnabledPluginsList.move_down) # Add buttons addButton = gtk.Button(gtk.STOCK_ADD) addButton.set_use_stock(True) addButton.connect('clicked', self.AddPlugin) enabledButtonBox.pack_start(addButton, False, False) enabledButtonBox.pack_start(upButton, False, False) enabledButtonBox.pack_start(downButton, False, False) enabledBox.pack_start(self.EnabledPluginsList, True, True) enabledBox.pack_start(enabledAlignment, False, False) listBox.pack_start(self.DisabledPluginsList, True, True) listBox.pack_start(boxAlignment, True, False) listBox.pack_start(enabledBox, True, True) self.UpdateEnabledPluginsList() self.UpdateDisabledPluginsList() # Connect Store self.EnabledPluginsList.store.connect('row-changed', self.ListChanged) self.EnabledPluginsList.store.connect('row-deleted', self.ListChanged) self.EnabledPluginsList.store.connect('rows-reordered', self.ListChanged) rightChild.pack_start(listBox, True, True) # Auto sort autoSort.connect('toggled', self.AutoSortChanged) autoSort.set_active(self.Context.AutoSort) self.Widget = rightChild def AutoSortChanged(self, widget): if self.Block > 0: return autoSort = widget.get_active() if not autoSort: dlg = gtk.MessageDialog(type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_YES_NO) dlg.set_markup(_("Do you really want to disable automatic plugin sorting? This will also disable conflict handling. You should only do this if you know what you are doing.")) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: self.Block += 1 widget.set_active(True) self.Block -= 1 return self.Context.AutoSort = autoSort for widget in (self.EnabledPluginsList.view, self.DisabledPluginsList.view, self.MiddleButtonBox, self.EnabledButtonBox): widget.set_sensitive(not self.Context.AutoSort) GlobalUpdater.UpdatePlugins() def UpdateEnabledPluginsList(self): activePlugins = self.Context.Plugins['core'].Screen['active_plugins'].Value self.EnabledPluginsList.clear() for name in activePlugins: self.EnabledPluginsList.append(name) def UpdateDisabledPluginsList(self): activePlugins = self.Context.Plugins['core'].Screen['active_plugins'].Value self.DisabledPluginsList.clear() for plugin in sorted(self.Context.Plugins.values(), key=PluginKeyFunc): if not plugin.Name in activePlugins and plugin.Name != "core": self.DisabledPluginsList.append(plugin.Name) def AddPlugin(self, widget): dlg = gtk.Dialog(_("Add plugin")) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default() dlg.set_default_response(gtk.RESPONSE_OK) label = gtk.Label(_("Plugin name:")) label.set_tooltip_text(_("Insert plugin name")) dlg.vbox.pack_start(label) entry = gtk.Entry() entry.props.activates_default = True dlg.vbox.pack_start(entry) dlg.vbox.set_spacing(5) dlg.vbox.show_all() ret = dlg.run() dlg.destroy() if ret == gtk.RESPONSE_OK: self.EnabledPluginsList.append(entry.get_text()) def EnablePlugins(self, widget): selectedRows = self.DisabledPluginsList.select.get_selected_rows()[1] for path in selectedRows: iter = self.DisabledPluginsList.store.get_iter(path) name = self.DisabledPluginsList.store.get(iter, 0)[0] self.EnabledPluginsList.append(name) self.DisabledPluginsList.delete(widget) def ListChanged(self, *args, **kwargs): if self.Block > 0: return self.Block += 1 plugins = self.EnabledPluginsList.get_list() self.Context.Plugins['core'].Screen['active_plugins'].Value = plugins self.Context.Write() self.UpdateDisabledPluginsList() self.Block -= 1 # Preferences Page # class PreferencesPage(GenericPage): def __init__(self, context): GenericPage.__init__(self) self.Context = context self.LeftWidget = gtk.VBox(False, 10) self.LeftWidget.set_border_width(10) self.RightWidget = gtk.Notebook() # Left Pane self.DescLabel = Label() self.DescLabel.set_markup(HeaderMarkup % (_("Preferences"))) self.DescLabel.connect("style-set", self.HeaderStyleSet) self.DescImg = Image("profiles",ImageCategory, 64) self.LeftWidget.pack_start(self.DescImg, False, False) self.LeftWidget.pack_start(self.DescLabel, False, False) self.InfoLabelCont = gtk.HBox() self.InfoLabelCont.set_border_width(10) self.LeftWidget.pack_start(self.InfoLabelCont, False, False) self.InfoLabel = Label(_("Configure the backend, profile and other internal settings used by the Compiz Configuration System."), 180) self.InfoLabelCont.pack_start(self.InfoLabel, True, True) # About Button aboutLabel = Label() aboutLabel.set_markup(HeaderMarkup % (_("About"))) aboutLabel.connect("style-set", self.HeaderStyleSet) aboutButton = gtk.Button() aboutButton.set_relief(gtk.RELIEF_NONE) aboutImage = Image(gtk.STOCK_ABOUT, ImageStock, gtk.ICON_SIZE_BUTTON) aboutFrame = gtk.HBox() aboutFrame.set_spacing(5) aboutFrame.pack_start(aboutImage, False, False) aboutFrame.pack_start(Label(_("About CCSM...")), False, False) aboutButton.add(aboutFrame) aboutButton.set_tooltip_text(_("About")) aboutButton.connect('clicked', self.ShowAboutDialog) aboutBin = gtk.HBox() aboutBin.set_border_width(10) aboutBin.pack_start(aboutButton, False, False) self.LeftWidget.pack_start(aboutLabel, False, False) self.LeftWidget.pack_start(aboutBin, False, False) # Back Button backButton = gtk.Button(gtk.STOCK_GO_BACK) backButton.set_use_stock(True) backButton.connect('clicked', self.GoBack) self.LeftWidget.pack_end(backButton, False, False) # Profile & Backend Page self.ProfileBackendPage = ProfileBackendPage(context) self.RightWidget.append_page(self.ProfileBackendPage.Widget, gtk.Label(_("Profile & Backend"))) # Plugin List self.PluginListPage = PluginListPage(context) self.RightWidget.append_page(self.PluginListPage.Widget, gtk.Label(_("Plugin List"))) StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def ShowAboutDialog(self, widget): about = AboutDialog(widget.get_toplevel()) about.show_all() about.run() about.destroy() # Main Page # class MainPage(object): def __init__(self, main, context): self.Context = context self.Main = main sidebar = gtk.VBox(False, 10) sidebar.set_border_width(10) pluginWindow = PluginWindow(self.Context) pluginWindow.connect('show-plugin', self.ShowPlugin) # Filter filterLabel = Label() filterLabel.set_markup(HeaderMarkup % (_("Filter"))) filterLabel.connect("style-set", self.HeaderStyleSet) filterLabel.props.xalign = 0.1 filterEntry = ClearEntry() filterEntry.set_tooltip_text(_("Filter your Plugin list")) filterEntry.connect("changed", self.FilterChanged) self.filterEntry = filterEntry # Screens if len(getScreens()) > 1: screenBox = gtk.combo_box_new_text() for screen in getScreens(): screenBox.append_text(_("Screen %i") % screen) name = self.Context.CurrentBackend.Name screenBox.set_active(CurrentScreenNum) screenBox.connect("changed", self.ScreenChanged) screenLabel = Label() screenLabel.set_markup(HeaderMarkup % (_("Screen"))) screenLabel.connect("style-set", self.HeaderStyleSet) sidebar.pack_start(screenLabel, False, False) sidebar.pack_start(screenBox, False, False) # Categories categoryBox = gtk.VBox() categoryBox.set_border_width(5) categories = ['All'] + sorted(pluginWindow.get_categories(), key=CategoryKeyFunc) for category in categories: # name: untranslated name/interal identifier # label: translated name name = category or 'Uncategorized' label = _(name) iconName = name.lower ().replace (" ", "_") categoryToggleIcon = Image (name = iconName, type = ImageCategory, size = 22) categoryToggleLabel = Label (label) align = gtk.Alignment (0, 0.5, 1, 1) align.set_padding (0, 0, 0, 10) align.add (categoryToggleIcon) categoryToggleBox = gtk.HBox () categoryToggleBox.pack_start (align, False, False) categoryToggleBox.pack_start (categoryToggleLabel, True, True) categoryToggle = PrettyButton () categoryToggle.add(categoryToggleBox) categoryToggle.connect("clicked", self.ToggleCategory, category) categoryBox.pack_start(categoryToggle, False, False) categoryLabel = Label() categoryLabel.props.xalign = 0.1 categoryLabel.set_markup(HeaderMarkup % (_("Category"))) categoryLabel.connect("style-set", self.HeaderStyleSet) # Exit Button exitButton = gtk.Button(gtk.STOCK_CLOSE) exitButton.set_use_stock(True) exitButton.connect('clicked', self.Main.Quit) # Advanced Search searchLabel = Label() searchLabel.set_markup(HeaderMarkup % (_("Advanced Search"))) searchLabel.connect("style-set", self.HeaderStyleSet) searchImage = gtk.Image() searchImage.set_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON) searchButton = PrettyButton() searchButton.connect("clicked", self.ShowAdvancedFilter) searchButton.set_relief(gtk.RELIEF_NONE) searchFrame = gtk.HBox() searchFrame.pack_start(searchLabel, False, False) searchFrame.pack_end(searchImage, False, False) searchButton.add(searchFrame) # Preferences prefLabel = Label() prefLabel.set_markup(HeaderMarkup % (_("Preferences"))) prefLabel.connect("style-set", self.HeaderStyleSet) prefImage = gtk.Image() prefImage.set_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_BUTTON) prefButton = PrettyButton() prefButton.connect("clicked", self.ShowPreferences) prefButton.set_relief(gtk.RELIEF_NONE) prefFrame = gtk.HBox() prefFrame.pack_start(prefLabel, False, False) prefFrame.pack_end(prefImage, False, False) prefButton.add(prefFrame) # Pack widgets into sidebar sidebar.pack_start(filterLabel, False, False) sidebar.pack_start(filterEntry, False, False) sidebar.pack_start(categoryLabel, False, False) sidebar.pack_start(categoryBox, False, False) sidebar.pack_end(exitButton, False, False) sidebar.pack_end(searchButton, False, False) sidebar.pack_end(prefButton, False, False) self.LeftWidget = sidebar self.RightWidget = pluginWindow StyleBlock = 0 def HeaderStyleSet(self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): widget.modify_fg(state, widget.style.bg[gtk.STATE_SELECTED]) self.StyleBlock -= 1 def ShowPlugin(self, widget, plugin): pluginPage = PluginPage(plugin) self.Main.SetPage(pluginPage) def ShowAdvancedFilter(self, widget): filterPage = FilterPage(self.Context) self.Main.SetPage(filterPage) def ShowPreferences(self, widget): preferencesPage = PreferencesPage(self.Context) self.Main.SetPage(preferencesPage) def ToggleCategory(self, widget, category): if category == 'All': category = None else: category = category.lower() self.RightWidget.filter_boxes(category, level=FilterCategory) def FilterChanged(self, widget): text = widget.get_text().lower() self.RightWidget.filter_boxes(text) def ScreenChanged(self, widget): self.Context.Write() self.CurrentScreenNum = widget.get_active() self.Context.Read() # Page # class Page(object): def __init__(self): self.SetContainer = gtk.VBox() self.Widget = gtk.EventBox() self.Widget.add(self.SetContainer) self.Empty = True def Wrap(self): scroll = gtk.ScrolledWindow() scroll.props.hscrollbar_policy = gtk.POLICY_NEVER scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC view = gtk.Viewport() view.set_border_width(5) view.set_shadow_type(gtk.SHADOW_NONE) scroll.add(view) view.add(self.Widget) self.Scroll = scroll # Group Page # class GroupPage(Page): def __init__(self, name, group): Page.__init__(self) self.Name = name self.VisibleAreas = self.subGroupAreas = [] self.Label = gtk.Alignment(xalign=0.0, yalign=0.5) self.Label.set_padding(4, 4, 4, 4) label = gtk.Label("%s" %(protect_pango_markup(name or _('General')))) label.set_use_markup(True) self.Label.add(label) if '' in group: sga = SubGroupArea('', group[''][1]) if not sga.Empty: self.SetContainer.pack_start(sga.Widget, False, False) self.Empty = False self.subGroupAreas.append(sga) sortedSubGroups = sorted(group.items(), key=GroupIndexKeyFunc) for (subGroupName, (subGroupIndex, subGroup)) in sortedSubGroups: if not subGroupName == '': sga = SubGroupArea(subGroupName, subGroup) if not sga.Empty: self.SetContainer.pack_start(sga.Widget, False, False) self.Empty = False self.subGroupAreas.append(sga) self.Visible = not self.Empty def Filter(self, text, level=FilterAll): empty = True self.VisibleAreas = [] for area in self.subGroupAreas: if area.Filter(text, level=level): self.VisibleAreas.append(area) empty = False self.Visible = not empty self.Label.props.no_show_all = empty if empty: self.Label.hide() else: self.Label.show() return not empty ./compizconfig/ccsm/ccm/Settings.py0000644000004100000410000014044213246301623017600 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gobject import os from ccm.Constants import * from ccm.Conflicts import * from ccm.Widgets import * from ccm.Utils import * from ccm.Pages import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext NAItemText = _("N/A") class Setting(object): NoneValue = '' def __init__(self, Setting=None, Settings=None, List=False): self.Setting = Setting self.Settings = Settings # for multi-list settings self.List = List if List: self.CurrentRow = None self.Blocked = 0 self.EBox = gtk.EventBox() self.Box = gtk.HBox() self.EBox.set_visible_window(False) if Setting: self.EBox.set_sensitive(not Setting.ReadOnly) self.Box.set_spacing(5) self.EBox.add(self.Box) self.Reset = gtk.Button() if not Settings: self.MakeLabel() markup = "%s\n%s" % (self.Setting.LongDesc, self.Setting.Name) self.EBox.set_tooltip_markup(markup) self.Reset.set_tooltip_text(_("Reset setting to the default value")) self.Reset.set_image (Image (name = gtk.STOCK_CLEAR, type = ImageStock, size = gtk.ICON_SIZE_BUTTON)) self.Reset.connect('clicked', self.DoReset) self._Init() self.EBox.connect("destroy", self.OnDestroy) self.AddUpdater() def AddUpdater(self): GlobalUpdater.Append(self) def RemoveUpdater(self): GlobalUpdater.Remove(self) def OnDestroy(self, widget): self.RemoveUpdater() def GetColumn(self, num): return (str, gtk.TreeViewColumn(self.Setting.ShortDesc, gtk.CellRendererText(), text=num)) def PureVirtual (self, func): message = "Missing %(function)s function for %(name)s setting (%(class)s)" msg_dict = {'function': func, 'name': self.Setting.Name, 'class': self} value = message % msg_dict raise PureVirtualError(value) def _Init(self): self.PureVirtual('_Init') def DoReset(self, foo): self.Setting.Reset() self.Setting.Plugin.Context.Write() self.Read() def MakeLabel(self): if not self.Setting: return label = gtk.Label() desc = protect_pango_markup (self.Setting.ShortDesc) style = "%s" if self.Setting.Integrated: style = "%s" label.set_markup(style % desc) label.props.xalign = 0 label.set_size_request(160, -1) label.props.wrap_mode = pango.WRAP_WORD label.set_line_wrap(True) self.Label = label def Block(self): self.Blocked += 1 def UnBlock(self): self.Blocked -= 1 def Read(self): self.Block() self._Read() self.UnBlock() def _Read(self): self.PureVirtual('_Read') def Changed(self, *args, **kwargs): if self.Blocked <= 0: self._Changed() self.Setting.Plugin.Context.Write() def _Changed(self): self.PureVirtual('_Changed') def Get(self): if self.List: if self.CurrentRow is not None: return self.Setting.Value[self.CurrentRow] else: return self.NoneValue else: return self.Setting.Value def GetForRenderer(self): return self.Setting.Value def Set(self, value): if self.List: if self.CurrentRow is not None: vlist = self.Setting.Value vlist[self.CurrentRow] = value self.Setting.Value = vlist else: self.Setting.Value = value def Swap(self, a, b): vlist = self.Setting.Value vlist.insert(b, vlist.pop(a)) self.Setting.Value = vlist def _SetHidden(self, visible): self.EBox.props.no_show_all = not visible if visible: self.EBox.show() else: self.EBox.hide() def _Filter(self, text, level): visible = False if text is not None: if level & FilterName: visible = (text in self.Setting.Name.lower() or text in self.Setting.ShortDesc.lower()) if not visible and level & FilterLongDesc: visible = text in self.Setting.LongDesc.lower() if not visible and level & FilterValue: visible = text in str(self.Setting.Value).lower() else: visible = True return visible def Filter(self, text, level=FilterAll): visible = self._Filter(text, level=level) self._SetHidden(visible) return visible def __hash__(self): if self.Setting is not None: return hash(self.Setting) else: raise TypeError class StockSetting(Setting): def _Init(self): self.Box.pack_start(self.Label, False, False) self.Box.pack_end(self.Reset, False, False) class StringSetting(StockSetting): def _Init(self): StockSetting._Init(self) self.Entry = gtk.Entry() self.Entry.connect('activate', self.Changed) self.Entry.connect('focus-out-event', self.Changed) self.Widget = self.Entry self.Box.pack_start(self.Widget, True, True) def _Read(self): self.Entry.set_text(self.Get()) def _Changed(self): self.Set(self.Entry.get_text()) class MatchSetting(StringSetting): def _Init(self): StringSetting._Init(self) self.MatchButton = MatchButton(self.Entry) self.Box.pack_start(self.MatchButton, False, False) class FileStringSetting(StringSetting): def __init__(self, setting, List=False, isImage=False, isDirectory=False): self.isImage = isImage self.isDirectory = isDirectory StringSetting.__init__(self, setting, List=List) def _Init(self): StringSetting._Init(self) self.FileButton = FileButton(self.Setting.Plugin.Context, self.Entry, self.isDirectory, self.isImage) self.Box.pack_start(self.FileButton, False, False) class EnumSetting(StockSetting): NoneValue = 0 def _Init(self): StockSetting._Init(self) self.Combo = gtk.combo_box_new_text() if self.List: self.Info = self.Setting.Info[1][2] else: self.Info = self.Setting.Info[2] self.SortedItems = sorted(self.Info.items(), key=EnumSettingKeyFunc) for name, value in self.SortedItems: self.Combo.append_text(name) self.Combo.connect('changed', self.Changed) self.Widget = self.Combo self.Box.pack_start(self.Combo, True, True) def _CellEdited(self, cell, path, new_text): self.CurrentRow = int(path[0]) value = self.Info[new_text] self.Store[path][self.Num] = new_text self.Set(value) self.Setting.Plugin.Context.Write() def GetColumn(self, num): self.Num = num cell = gtk.CellRendererCombo() column = gtk.TreeViewColumn(self.Setting.ShortDesc, cell, text=num) model = gtk.ListStore(str) for property, value in [("model", model), ("text_column", 0), ("editable", False), ("has_entry", False)]: cell.set_property (property, value) cell.connect("edited", self._CellEdited) for item, i in self.SortedItems: model.append([item]) return (str, column) def GetForRenderer(self): return [self.SortedItems[pos][0] for pos in self.Setting.Value] def _Read(self): self.Combo.set_active(self.Get()) def _Changed(self): active = self.Combo.get_active_text() self.Set(self.Info[active]) def _Filter(self, text, level): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.Info) return visible class RestrictedStringSetting(StockSetting): NoneValue = '' def _Init(self): StockSetting._Init(self) self.Combo = gtk.combo_box_new_text() if self.List: info = self.Setting.Info[1] else: info = self.Setting.Info self.ItemsByName = info[0] self.ItemsByValue = info[1] self.SortedItems = info[2] # Use the first item in the list as the default value self.NoneValue = self.ItemsByName[self.SortedItems[0][0]] for (i, (name, value)) in enumerate(self.SortedItems): self.Combo.append_text(name) self.Combo.connect('changed', self.Changed) self.Widget = self.Combo self.Box.pack_start(self.Combo, True, True) self.OriginalValue = None self.NAItemShift = 0 def _CellEdited(self, cell, path, new_text): self.CurrentRow = int(path[0]) value = self.ItemsByName[new_text] self.Store[path][self.Num] = new_text self.Set(value) self.Setting.Plugin.Context.Write() def GetColumn(self, num): self.Num = num cell = gtk.CellRendererCombo() column = gtk.TreeViewColumn(self.Setting.ShortDesc, cell, text=num) model = gtk.ListStore(str) for property, value in [("model", model), ("text_column", 0), ("editable", False), ("has_entry", False)]: cell.set_property (property, value) cell.connect("edited", self._CellEdited) for item, i in self.SortedItems: model.append([item]) return (str, column) def GetItemText (self, val): text = self.ItemsByValue.get(val) if text is None: return NAItemText return self.SortedItems[text[1]][0] def GetForRenderer(self): return [self.GetItemText(val) for val in self.Setting.Value] def _Read(self): value = self.Get() if not self.OriginalValue: self.OriginalValue = value # if current value is not provided by any restricted string extension, # insert an N/A item at the beginning if self.OriginalValue not in self.ItemsByValue: self.NAItemShift = 1 self.Combo.insert_text(0, NAItemText) if value in self.ItemsByValue: self.Combo.set_active(self.ItemsByValue[self.Get()][1] + \ self.NAItemShift) else: self.Combo.set_active(0) def _Changed(self): active = self.Combo.get_active_text() if active == NAItemText: activeValue = self.OriginalValue else: activeValue = self.ItemsByName[active] self.Set(activeValue) def _Filter(self, text, level): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.ItemsByName) return visible class BoolSetting (StockSetting): NoneValue = False def _Init (self): StockSetting._Init(self) self.Label.set_size_request(-1, -1) self.CheckButton = gtk.CheckButton () align = gtk.Alignment(yalign=0.5) align.add(self.CheckButton) self.Box.pack_end(align, False, False) self.CheckButton.connect ('toggled', self.Changed) def _Read (self): self.CheckButton.set_active (self.Get()) def _Changed (self): self.Set(self.CheckButton.get_active ()) def CellToggled (self, cell, path): self.CurrentRow = int(path) self.Set(not cell.props.active) self.Store[path][self.Num] = self.Get() self.Setting.Plugin.Context.Write() def GetColumn (self, num): self.Num = num cell = gtk.CellRendererToggle() cell.set_property("activatable", True) cell.connect('toggled', self.CellToggled) return (bool, gtk.TreeViewColumn(self.Setting.ShortDesc, cell, active=num)) class NumberSetting(StockSetting): NoneValue = 0 def _Init(self): StockSetting._Init(self) if self.List: self.Info = info = self.Setting.Info[1] else: self.Info = info = self.Setting.Info if self.Inc is None: self.Inc = info[2] inc = self.Inc self.NoneValue = info[0] self.Adj = gtk.Adjustment(0, info[0], info[1], inc, inc*10) self.Spin = gtk.SpinButton(self.Adj) self.Spin.set_value(self.Get()) self.Spin.connect("value-changed", self.Changed) self.Widget = self.Spin self.Box.pack_end(self.Spin, False, False) def _Read(self): self.Adj.set_value(self.Get()) def _Changed(self): self.Set(self.Adj.get_value()) class IntSetting(NumberSetting): def _Init(self): self.Inc = 1 NumberSetting._Init(self) self.Spin.set_digits(0) class FloatSetting(NumberSetting): NoneValue = 0.0 def _Init(self): self.Inc = None NumberSetting._Init(self) self.Spin.set_digits(4) class ColorSetting(StockSetting): NoneValue = (0, 0, 0, 65535) # opaque black def _Init(self): StockSetting._Init(self) self.Button = gtk.ColorButton() self.Button.set_size_request (100, -1) self.Button.set_use_alpha(True) self.Button.connect('color-set', self.Changed) self.Widget = gtk.Alignment (1, 0.5) self.Widget.add (self.Button) self.Box.pack_start(self.Widget, True, True) def GetForRenderer(self): return ["#%.4x%.4x%.4x%.4x" %tuple(seq) for seq in self.Setting.Value] def GetColumn(self, num): return (str, gtk.TreeViewColumn(self.Setting.ShortDesc, CellRendererColor(), text=num)) def _Read(self): col = gtk.gdk.Color() value = self.Get() col.red, col.green, col.blue = value[:3] self.Button.set_color(col) self.Button.set_alpha(value[3]) def _Changed(self): col = self.Button.get_color() alpha = self.Button.get_alpha() self.Set([col.red, col.green, col.blue, alpha]) class BaseListSetting(Setting): def _Init(self): self.Widget = gtk.VBox() self.EditDialog = None self.EditDialogOpen = False self.PageToBeRefreshed = None self.Widgets = [] for i, setting in enumerate(self.Settings): self.Widgets.append(MakeSetting(setting, List=True)) types, cols = self.ListInfo() self.Types = types self.Store = gtk.ListStore(*types) self.View = gtk.TreeView(self.Store) self.View.set_headers_visible(True) for widget in self.Widgets: widget.Store = self.Store widget.Box.remove(widget.Reset) widget.ListWidget = self for col in cols: self.View.append_column(col) self.View.connect('row-activated', self.Activated) self.View.connect('button-press-event', self.ButtonPressEvent) self.View.connect('key-press-event', self.KeyPressEvent) self.Select = self.View.get_selection() self.Select.set_mode(gtk.SELECTION_SINGLE) self.Select.connect('changed', self.SelectionChanged) self.Widget.set_spacing(5) self.Scroll = gtk.ScrolledWindow() self.Scroll.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC self.Scroll.props.vscrollbar_policy = gtk.POLICY_NEVER self.Scroll.add(self.View) self.Widget.pack_start(self.Scroll, True, True) self.Widget.set_child_packing(self.Scroll, True, True, 0, gtk.PACK_START) buttonBox = gtk.HBox(False) buttonBox.set_spacing(5) buttonBox.set_border_width(5) self.Widget.pack_start(buttonBox, False, False) buttonTypes = ((gtk.STOCK_NEW, self.Add, None, True), (gtk.STOCK_DELETE, self.Delete, None, False), (gtk.STOCK_EDIT, self.Edit, None, False), (gtk.STOCK_GO_UP, self.Move, 'up', False), (gtk.STOCK_GO_DOWN, self.Move, 'down', False),) self.Buttons = {} for stock, callback, data, sensitive in buttonTypes: b = gtk.Button(stock) b.set_use_stock(True) buttonBox.pack_start(b, False, False) if data is not None: b.connect('clicked', callback, data) else: b.connect('clicked', callback) b.set_sensitive(sensitive) self.Buttons[stock] = b self.Popup = gtk.Menu() self.PopupItems = {} edit = gtk.ImageMenuItem(stock_id=gtk.STOCK_EDIT) edit.connect('activate', self.Edit) edit.set_sensitive(False) self.Popup.append(edit) self.PopupItems[gtk.STOCK_EDIT] = edit delete = gtk.ImageMenuItem(stock_id=gtk.STOCK_DELETE) delete.connect('activate', self.Delete) delete.set_sensitive(False) self.Popup.append(delete) self.PopupItems[gtk.STOCK_DELETE] = delete self.Popup.show_all() buttonBox.pack_end(self.Reset, False, False) self.Box.pack_start(self.Widget) def AddUpdater(self): pass def RemoveUpdater(self): if self.Settings: for widget in self.Widgets: widget.EBox.destroy() def DoReset(self, widget): for setting in self.Settings: setting.Reset() self.Settings[0].Plugin.Context.Write() self.Read() def MakeLabel(self): pass def Add(self, *args): for widget, setting in zip(self.Widgets, self.Settings): vlist = setting.Value vlist.append(widget.NoneValue) setting.Value = vlist self.Settings[0].Plugin.Context.Write() self.Read() self._Edit(len(self.Store)-1) def _Delete(self, row): for setting in self.Settings: vlist = setting.Value del vlist[row] setting.Value = vlist self.Settings[0].Plugin.Context.Write() def Delete(self, *args): model, it = self.Select.get_selected() if it is not None: path = model.get_path(it) if path is not None: row = path[0] else: return model.remove(it) self._Delete(row) def _MakeEditDialog(self): dlg = gtk.Dialog(_("Edit")) vbox = gtk.VBox(spacing=TableX) vbox.props.border_width = 6 dlg.vbox.pack_start(vbox, True, True) dlg.set_default_size(500, -1) dlg.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) dlg.set_default_response(gtk.RESPONSE_CLOSE) group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) for widget in self.Widgets: vbox.pack_start(widget.EBox, False, False) group.add_widget(widget.Label) return dlg def Edit(self, widget): model, it = self.Select.get_selected() if it: path = model.get_path(it) if path is not None: row = path[0] else: return self._Edit(row) def _Edit(self, row): if not self.EditDialog: self.EditDialog = self._MakeEditDialog() for widget in self.Widgets: widget.CurrentRow = row widget.Read() self.EditDialogOpen = True self.EditDialog.show_all() response = self.EditDialog.run() self.EditDialog.hide_all() self.EditDialogOpen = False if self.PageToBeRefreshed: self.PageToBeRefreshed[0].RefreshPage(self.PageToBeRefreshed[1], self.PageToBeRefreshed[2]) self.PageToBeRefreshed = None self.Read() def Move(self, widget, direction): model, it = self.Select.get_selected() if it is not None: path = model.get_path(it) if path is not None: row = path[0] else: return if direction == 'up': dest = row - 1 elif direction == 'down': dest = row + 1 for widget in self.Widgets: widget.Swap(row, dest) self.Settings[0].Plugin.Context.Write() order = list(range(len(model))) order.insert(dest, order.pop(row)) model.reorder(order) self.SelectionChanged(self.Select) def SelectionChanged(self, selection): model, it = selection.get_selected() for widget in (self.Buttons[gtk.STOCK_EDIT], self.Buttons[gtk.STOCK_DELETE], self.PopupItems[gtk.STOCK_EDIT], self.PopupItems[gtk.STOCK_DELETE]): widget.set_sensitive(it is not None) if it is not None: path = model.get_path(it) if path is not None: row = path[0] self.Buttons[gtk.STOCK_GO_UP].set_sensitive(row > 0) self.Buttons[gtk.STOCK_GO_DOWN].set_sensitive(row < (len(model) - 1)) else: self.Buttons[gtk.STOCK_GO_UP].set_sensitive(False) self.Buttons[gtk.STOCK_GO_DOWN].set_sensitive(False) def ButtonPressEvent(self, treeview, event): if event.button == 3: pthinfo = treeview.get_path_at_pos(int(event.x), int(event.y)) if pthinfo is not None: path, col, cellx, celly = pthinfo treeview.grab_focus() treeview.set_cursor(path, col, 0) self.Popup.popup(None, None, None, event.button, event.time) return True def KeyPressEvent(self, treeview, event): if gtk.gdk.keyval_name(event.keyval) == "Delete": model, it = treeview.get_selection().get_selected() if it is not None: path = model.get_path(it) if path is not None: row = path[0] model.remove(it) self._Delete(row) return True def ListInfo(self): types = [] cols = [] for i, widget in enumerate(self.Widgets): t, col = widget.GetColumn(i) types.append(t) cols.append(col) return types, cols def Activated(self, obj, path, col): self._Edit(path[0]) def _Read(self): self.Store.clear() # FIXME: The list types are being defined as all str # in self.Widgets (which goes to self.Store) - this # is a problem since values can be of other types, # however explicitly converting to a string seems to # work here for values in zip(*[w.GetForRenderer() for w in self.Widgets]): self.Store.append([str (x) for x in values]) def OnDestroy(self, widget): for w in self.Widgets: w.EBox.destroy() class ListSetting(BaseListSetting): def _Init(self): self.Settings = [self.Setting] BaseListSetting._Init(self) class MultiListSetting(BaseListSetting): def _Init(self): self.EBox.set_tooltip_text(_("Multi-list settings. You can double-click a row to edit the values.")) BaseListSetting._Init(self) def Filter(self, text, level=FilterAll): visible = False for setting in self.Widgets: if setting._Filter(text, level=level): visible = True self._SetHidden(visible) return visible class EnumFlagsSetting(Setting): def _Init(self): frame = gtk.Frame(self.Setting.ShortDesc) table = gtk.Table() row = col = 0 self.Checks = [] sortedItems = sorted(self.Setting.Info[1][2].items(), key=EnumSettingKeyFunc) self.minVal = sortedItems[0][1] for key, value in sortedItems: box = gtk.CheckButton(key) self.Checks.append((key, box)) table.attach(box, col, col+1, row, row+1, TableDef, TableDef, TableX, TableX) box.connect('toggled', self.Changed) col = col+1 if col >= 3: col = 0 row += 1 vbox = gtk.VBox() vbox.pack_start(self.Reset, False, False) hbox = gtk.HBox() hbox.pack_start(table, True, True) hbox.pack_start(vbox, False, False) frame.add(hbox) self.Box.pack_start(frame, True, True) def _Read(self): for key, box in self.Checks: box.set_active(False) for setVal in self.Setting.Value: self.Checks[setVal-self.minVal][1].set_active(True) def _Changed(self): values = [] for key, box in self.Checks: if box.get_active(): values.append(self.Setting.Info[1][2][key]) self.Setting.Value = values def _Filter(self, text, level=FilterAll): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.Setting.Info[1][2]) return visible class RestrictedStringFlagsSetting(Setting): def _Init(self): frame = gtk.Frame(self.Setting.ShortDesc) table = gtk.Table() row = col = 0 self.Checks = [] info = self.Setting.Info[1] self.ItemsByName = info[0] self.ItemsByValue = info[1] sortedItems = info[2] for key, value in sortedItems: box = gtk.CheckButton(key) self.Checks.append((key, box)) table.attach(box, col, col+1, row, row+1, TableDef, TableDef, TableX, TableX) box.connect('toggled', self.Changed) col = col+1 if col >= 3: col = 0 row += 1 vbox = gtk.VBox() vbox.pack_start(self.Reset, False, False) hbox = gtk.HBox() hbox.pack_start(table, True, True) hbox.pack_start(vbox, False, False) frame.add(hbox) self.Box.pack_start(frame, True, True) def _Read(self): for key, box in self.Checks: box.set_active(False) for setVal in self.Setting.Value: if setVal in self.ItemsByValue: self.Checks[self.ItemsByValue[setVal][1]][1].set_active(True) def _Changed(self): values = [] for key, box in self.Checks: if box.get_active(): values.append(self.ItemsByName[key]) self.Setting.Value = values def _Filter(self, text, level=FilterAll): visible = Setting._Filter(self, text, level=level) if text is not None and not visible and level & FilterValue: visible = any(text in s.lower() for s in self.ItemsByName) return visible class EditableActionSetting (StockSetting): def _Init (self, widget, action): StockSetting._Init(self) alignment = gtk.Alignment (0, 0.5) alignment.add (widget) self.Label.set_size_request(-1, -1) editButton = gtk.Button () editButton.add (Image (name = gtk.STOCK_EDIT, type = ImageStock, size = gtk.ICON_SIZE_BUTTON)) editButton.set_tooltip_text(_("Edit %s" % self.Setting.ShortDesc)) editButton.connect ("clicked", self.RunEditDialog) action = ActionImage (action) self.Box.pack_start (action, False, False) self.Box.reorder_child (action, 0) self.Box.pack_end (editButton, False, False) self.Box.pack_end(alignment, False, False) self.Widget = widget def RunEditDialog (self, widget): dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default() dlg.set_default_response (gtk.RESPONSE_OK) entry = gtk.Entry (max = 200) entry.set_text (self.GetDialogText ()) entry.connect ("activate", lambda *a: dlg.response (gtk.RESPONSE_OK)) alignment = gtk.Alignment (0.5, 0.5, 1, 1) alignment.set_padding (10, 10, 10, 10) alignment.add (entry) entry.set_tooltip_text(self.Setting.LongDesc) dlg.vbox.pack_start (alignment) dlg.vbox.show_all () ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return self.HandleDialogText (entry.get_text ().strip ()) def GetDialogText (self): self.PureVirtual ('GetDialogText') def HandleDialogText (self, text): self.PureVirtual ('HandleDialogText') class KeySetting (EditableActionSetting): current = "" def _Init (self): self.Button = SizedButton (minWidth = 100) self.Button.connect ("clicked", self.RunKeySelector) self.SetButtonLabel () EditableActionSetting._Init (self, self.Button, "keyboard") def DoReset (self, widget): conflict = KeyConflict (self.Setting, self.Setting.DefaultValue) if conflict.Resolve (GlobalUpdater): self.Setting.Reset () self.Setting.Plugin.Context.Write () self.Read () def ReorderKeyString (self, accel): key, mods = gtk.accelerator_parse (accel) return GetAcceleratorName (key, mods) def GetDialogText (self): return self.current def HandleDialogText (self, accel): name = self.ReorderKeyString (accel) if len (accel) != len (name): accel = protect_pango_markup (accel) ErrorDialog (self.Widget.get_toplevel (), _("\"%s\" is not a valid shortcut") % accel) return self.BindingEdited (accel) def GetLabelText (self, text): if not len (text) or text.lower() == "disabled": text = _("Disabled") return text def SetButtonLabel (self): self.Button.set_label (self.GetLabelText (self.current)) def RunKeySelector (self, widget): def ShowHideBox (button, box, dialog): if button.get_active (): box.show () else: box.hide () dialog.resize (1, 1) def HandleGrabberChanged (grabber, key, mods, label, selector): new = GetAcceleratorName (key, mods) mods = "" for mod in KeyModifier: if "%s_L" % mod in new: new = new.replace ("%s_L" % mod, "<%s>" % mod) if "%s_R" % mod in new: new = new.replace ("%s_R" % mod, "<%s>" % mod) if "<%s>" % mod in new: mods += "%s|" % mod mods.rstrip ("|") label.set_text (self.GetLabelText (new)) selector.current = mods def HandleModifierAdded (selector, modifier, label): current = label.get_text () if current == _("Disabled"): current = "<%s>" % modifier else: current = ("<%s>" % modifier) + current label.set_text (self.ReorderKeyString (current)) def HandleModifierRemoved (selector, modifier, label): current = label.get_text () if "<%s>" % modifier in current: new = current.replace ("<%s>" % modifier, "") elif "%s_L" % modifier in current: new = current.replace ("%s_L" % modifier, "") elif "%s_R" % modifier in current: new = current.replace ("%s_R" % modifier, "") label.set_text (self.GetLabelText (new)) dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ALWAYS) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.set_icon (self.Widget.get_toplevel ().get_icon ()) dlg.set_modal (True) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default () dlg.set_default_response (gtk.RESPONSE_OK) mainBox = gtk.VBox () alignment = gtk.Alignment () alignment.set_padding (10, 10, 10, 10) alignment.add (mainBox) dlg.vbox.pack_start (alignment) checkButton = gtk.CheckButton (_("Enabled")) active = len (self.current) \ and self.current.lower () not in ("disabled", "none") checkButton.set_active (active) checkButton.set_tooltip_text(self.Setting.LongDesc) mainBox.pack_start (checkButton) box = gtk.VBox () checkButton.connect ("toggled", ShowHideBox, box, dlg) mainBox.pack_start (box) currentMods = "" for mod in KeyModifier: if "<%s>" % mod in self.current: currentMods += "%s|" % mod currentMods.rstrip ("|") modifierSelector = ModifierSelector (currentMods) modifierSelector.set_tooltip_text (self.Setting.LongDesc) alignment = gtk.Alignment (0.5) alignment.add (modifierSelector) box.pack_start (alignment) key, mods = gtk.accelerator_parse (self.current) grabber = KeyGrabber (key = key, mods = mods, label = _("Grab key combination")) grabber.set_tooltip_text (self.Setting.LongDesc) box.pack_start (grabber) label = gtk.Label (self.current) label.set_tooltip_text (self.Setting.LongDesc) alignment = gtk.Alignment (0.5, 0.5) alignment.set_padding (15, 0, 0, 0) alignment.add (label) box.pack_start (alignment) modifierSelector.connect ("added", HandleModifierAdded, label) modifierSelector.connect ("removed", HandleModifierRemoved, label) grabber.connect ("changed", HandleGrabberChanged, label, modifierSelector) grabber.connect ("current-changed", HandleGrabberChanged, label, modifierSelector) dlg.vbox.show_all () ShowHideBox (checkButton, box, dlg) ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return if not checkButton.get_active (): self.BindingEdited ("Disabled") return new = label.get_text () new = self.ReorderKeyString (new) self.BindingEdited (new) def BindingEdited (self, accel): '''Binding edited callback''' # Update & save binding conflict = KeyConflict (self.Setting, accel) if conflict.Resolve (GlobalUpdater): self.current = accel self.Changed () self.SetButtonLabel () def _Read (self): self.current = self.Get() self.SetButtonLabel () def _Changed (self): self.Set(self.current) class ButtonSetting (EditableActionSetting): current = "" def _Init (self): self.Button = SizedButton (minWidth = 100) self.Button.connect ("clicked", self.RunButtonSelector) self.Button.set_tooltip_text(self.Setting.LongDesc) self.SetButtonLabel () EditableActionSetting._Init (self, self.Button, "button") def DoReset (self, widget): conflict = ButtonConflict (self.Setting, self.Setting.DefaultValue) if conflict.Resolve (GlobalUpdater): self.Setting.Reset () self.Setting.Plugin.Context.Write () self.Read () def ReorderButtonString (self, old): new = "" edges = ["%sEdge" % e for e in Edges] for s in edges + KeyModifier: if "<%s>" % s in old: new += "<%s>" % s for i in range (99, 0, -1): if "Button%d" % i in old: new += "Button%d" % i break return new def GetDialogText (self): return self.current def HandleDialogText (self, button): def ShowErrorDialog (button): button = protect_pango_markup (button) ErrorDialog (self.Widget.get_toplevel (), _("\"%s\" is not a valid button") % button) if button.lower ().strip () in ("", "disabled", "none"): self.ButtonEdited ("Disabled") return new = self.ReorderButtonString (button) if len (button) != len (new): ShowErrorDialog (button) return self.ButtonEdited (new) def SetButtonLabel (self): label = self.current if not len (self.current) or self.current.lower() == "disabled": label = _("Disabled") self.Button.set_label (label) def RunButtonSelector (self, widget): def ShowHideBox (button, box, dialog): if button.get_active (): box.show () else: box.hide () dialog.resize (1, 1) dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ALWAYS) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.set_modal (True) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default () dlg.set_default_response (gtk.RESPONSE_OK) mainBox = gtk.VBox () alignment = gtk.Alignment () alignment.set_padding (10, 10, 10, 10) alignment.add (mainBox) dlg.vbox.pack_start (alignment) checkButton = gtk.CheckButton (_("Enabled")) active = len (self.current) \ and self.current.lower () not in ("disabled", "none") checkButton.set_active (active) checkButton.set_tooltip_text (self.Setting.LongDesc) mainBox.pack_start (checkButton) box = gtk.VBox () checkButton.connect ("toggled", ShowHideBox, box, dlg) mainBox.pack_start (box) currentEdges = "" for edge in Edges: if "<%sEdge>" % edge in self.current: currentEdges += "%s|" % edge currentEdges.rstrip ("|") edgeSelector = SingleEdgeSelector (currentEdges) edgeSelector.set_tooltip_text(self.Setting.LongDesc) box.pack_start (edgeSelector) currentMods = "" for mod in KeyModifier: if "<%s>" % mod in self.current: currentMods += "%s|" % mod currentMods.rstrip ("|") modifierSelector = ModifierSelector (currentMods) modifierSelector.set_tooltip_text(self.Setting.LongDesc) box.pack_start (modifierSelector) buttonCombo = gtk.combo_box_new_text () currentButton = 1 for i in range (99, 0, -1): if "Button%d" % i in self.current: currentButton = i break maxButton = 20 for i in range (1, maxButton + 1): button = "Button%d" % i buttonCombo.append_text (button) if currentButton > maxButton: buttonCombo.append_text ("Button%d" % currentButton) buttonCombo.set_active (maxButton) else: buttonCombo.set_active (currentButton - 1) buttonCombo.set_tooltip_text(self.Setting.LongDesc) box.pack_start (buttonCombo) dlg.vbox.show_all () ShowHideBox (checkButton, box, dlg) ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return if not checkButton.get_active (): self.ButtonEdited ("Disabled") return edges = edgeSelector.current modifiers = modifierSelector.current button = buttonCombo.get_active_text () edges = edges.split ("|") if len (edges): edges = "<%sEdge>" % "Edge><".join (edges) else: edges = "" modifiers = modifiers.split ("|") if len (modifiers): modifiers = "<%s>" % "><".join (modifiers) else: modifiers = "" button = "%s%s%s" % (edges, modifiers, button) button = self.ReorderButtonString (button) self.ButtonEdited (button) def ButtonEdited (self, button): '''Button edited callback''' if button == "Button1": warning = WarningDialog (self.Widget.get_toplevel (), _("Using Button1 without modifiers can \ prevent any left click and thus break your configuration. Do you really want \ to set \"%s\" button to Button1 ?") % self.Setting.ShortDesc) response = warning.run () if response != gtk.RESPONSE_YES: return conflict = ButtonConflict (self.Setting, button) if conflict.Resolve (GlobalUpdater): self.current = button self.Changed () self.SetButtonLabel () def _Read (self): self.current = self.Get() self.SetButtonLabel () def _Changed (self): self.Set(self.current) class EdgeSetting (EditableActionSetting): current = "" def _Init (self): self.Button = SizedButton (minWidth = 100) self.Button.connect ("clicked", self.RunEdgeSelector) self.Button.set_tooltip_text(self.Setting.LongDesc) self.SetButtonLabel () EditableActionSetting._Init (self, self.Button, "edges") def DoReset (self, widget): conflict = EdgeConflict (self.Setting, self.Setting.DefaultValue) if conflict.Resolve (GlobalUpdater): self.Setting.Reset () self.Setting.Plugin.Context.Write () self.Read () def GetDialogText (self): return self.current def HandleDialogText (self, mask): edges = mask.split ("|") valid = True for edge in edges: if edge not in Edges: valid = False break if not valid: mask = protect_pango_markup (mask) ErrorDialog (self.Widget.get_toplevel (), _("\"%s\" is not a valid edge mask") % mask) return self.EdgeEdited ("|".join (edges)) def SetButtonLabel (self): label = self.current if len (self.current): edges = self.current.split ("|") edges = [_(s) for s in edges] label = ", ".join (edges) else: label = _("None") self.Button.set_label (label) def RunEdgeSelector (self, widget): dlg = gtk.Dialog (_("Edit %s") % self.Setting.ShortDesc) dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT) dlg.set_transient_for (self.Widget.get_toplevel ()) dlg.set_modal (True) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK).grab_default() dlg.set_default_response (gtk.RESPONSE_OK) selector = SingleEdgeSelector (self.current) alignment = gtk.Alignment () alignment.set_padding (10, 10, 10, 10) alignment.add (selector) selector.set_tooltip_text (self.Setting.LongDesc) dlg.vbox.pack_start (alignment) dlg.vbox.show_all () ret = dlg.run () dlg.destroy () if ret != gtk.RESPONSE_OK: return self.EdgeEdited (selector.current) def EdgeEdited (self, edge): '''Edge edited callback''' conflict = EdgeConflict (self.Setting, edge) if conflict.Resolve (GlobalUpdater): self.current = edge self.Changed () self.SetButtonLabel () def _Read (self): self.current = self.Get() self.SetButtonLabel () def _Changed (self): self.Set(self.current) self.SetButtonLabel () class BellSetting (BoolSetting): def _Init (self): BoolSetting._Init (self) bell = ActionImage ("bell") self.Box.pack_start (bell, False, False) self.Box.reorder_child (bell, 0) def MakeStringSetting (setting, List=False): if setting.Hints: if "file" in setting.Hints: if "image" in setting.Hints: return FileStringSetting (setting, isImage=True, List=List) else: return FileStringSetting (setting, List=List) elif "directory" in setting.Hints: return FileStringSetting (setting, isDirectory=True, List=List) else: return StringSetting (setting, List=List) elif (List and setting.Info[1][2]) or \ (not List and setting.Info[2]): return RestrictedStringSetting (setting, List=List) else: return StringSetting (setting, List=List) def MakeIntSetting (setting, List=False): if List: info = setting.Info[1][2] else: info = setting.Info[2] if info: return EnumSetting (setting, List=List) else: return IntSetting (setting, List=List) def MakeListSetting (setting, List=False): if List: raise TypeError ("Lists of lists are not supported") if setting.Info[0] == "Int" and setting.Info[1][2]: return EnumFlagsSetting (setting) elif setting.Info[0] == "String" and setting.Info[1][2]: return RestrictedStringFlagsSetting (setting) else: return ListSetting (setting) SettingTypeDict = { "Match": MatchSetting, "String": MakeStringSetting, "Bool": BoolSetting, "Float": FloatSetting, "Int": MakeIntSetting, "Color": ColorSetting, "List": MakeListSetting, "Key": KeySetting, "Button": ButtonSetting, "Edge": EdgeSetting, "Bell": BellSetting, } def MakeSetting(setting, List=False): if List: t = setting.Info[0] else: t = setting.Type stype = SettingTypeDict.get(t, None) if not stype: return return stype(setting, List=List) class SubGroupArea(object): def __init__(self, name, subGroup): self.MySettings = [] self.SubGroup = subGroup self.Name = name settings = sorted(GetSettings(subGroup), key=SettingKeyFunc) if not name: self.Child = self.Widget = gtk.VBox() else: self.Widget = gtk.Frame() self.Expander = gtk.Expander(name) self.Widget.add(self.Expander) self.Expander.set_expanded(False) self.Child = gtk.VBox() self.Expander.add(self.Child) self.Child.set_spacing(TableX) self.Child.set_border_width(TableX) # create a special widget for list subGroups if len(settings) > 1 and HasOnlyType(settings, 'List'): multiList = MultiListSetting(Settings=settings) multiList.Read() self.Child.pack_start(multiList.EBox, True, True) self.MySettings.append(multiList) self.Empty = False if name: self.Expander.set_expanded(True) return # exit earlier to avoid unneeded logic's self.Empty = True for setting in settings: if not (setting.Plugin.Name == 'core' and setting.Name == 'active_plugins'): setting = MakeSetting(setting) if setting is not None: setting.Read() self.Child.pack_start(setting.EBox, True, True) self.MySettings.append(setting) self.Empty = False if name and len(settings) < 4: # ahi hay magic numbers! self.Expander.set_expanded(True) def Filter(self, text, level=FilterAll): empty = True count = 0 for setting in self.MySettings: if setting.Filter(text, level=level): empty = False count += 1 if self.Name: self.Expander.set_expanded(count < 4) self.Widget.props.no_show_all = empty if empty: self.Widget.hide() else: self.Widget.show() return not empty ./compizconfig/ccsm/ccm/__init__.py0000644000004100000410000000023613246301623017533 0ustar www-datawww-datafrom ccm.Conflicts import * from ccm.Window import * from ccm.Settings import * from ccm.Constants import * from ccm.Widgets import * from ccm.Utils import * ./compizconfig/ccsm/ccm/Constants.py.in0000644000004100000410000000537713246301623020370 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gtk.gdk import os # Current Screen # CurrentScreenNum = gtk.gdk.display_get_default().get_default_screen().get_number() # Settings Table # TableDef = gtk.FILL | gtk.EXPAND TableX = 4 TableY = 2 # Action Constants # KeyModifier = ["Shift", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5", "Alt", "Meta", "Super", "Hyper", "ModeSwitch"] Edges = ["Left", "Right", "Top", "Bottom", "TopLeft", "TopRight", "BottomLeft", "BottomRight"] # Label Styles # HeaderMarkup = "%s" # Image Types # ImageNone = 0 ImagePlugin = 1 ImageCategory = 2 ImageThemed = 3 ImageStock = 4 # Filter Levels # FilterName = 1 << 0 FilterLongDesc = 1 << 1 FilterValue = 1 << 2 # Settings Only FilterCategory = 1 << 3 # Plugins Only FilterAll = FilterName | FilterLongDesc | FilterValue | FilterCategory # Paths # DataDir = "@prefix@/share" IconDir = DataDir+"/ccsm/icons" PixmapDir = DataDir+"/ccsm/images" ConfigHome = os.getenv("XDG_CONFIG_HOME") if not ConfigHome: ConfigHome = os.path.join(os.getenv("HOME"), ".config") ConfDir = os.path.join(ConfigHome, "compiz-1/compizconfig/") ConfFile = os.path.join(ConfDir, "firstrun") # Version # Version = "@version@" # Translation # import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext # Category Transaltion Table # Just to get them into gettext # CategoryTranslation = { "General": _("General"), "Accessibility": _("Accessibility"), "Desktop": _("Desktop"), "Extras": _("Extras"), "Window Management": _("Window Management"), "Effects": _("Effects"), "Image Loading": _("Image Loading"), "Utility": _("Utility"), "All": _("All"), "Uncategorized": _("Uncategorized") } ./compizconfig/ccsm/ccm/Conflicts.py0000644000004100000410000004703213246301623017725 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk from ccm.Constants import * from ccm.Utils import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext class Conflict: def __init__(self, autoResolve): self.AutoResolve = autoResolve # buttons = (text, type/icon, response_id) def Ask(self, message, buttons, custom_widgets=None): if self.AutoResolve: return gtk.RESPONSE_YES dialog = gtk.MessageDialog(flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_WARNING) for text, icon, response in buttons: button = gtk.Button(text) button.set_image(gtk.image_new_from_stock(icon, gtk.ICON_SIZE_BUTTON)) dialog.add_action_widget(button, response) if custom_widgets != None: for widget in custom_widgets: dialog.vbox.pack_start(widget, False, False) dialog.set_markup(message) dialog.show_all() answer = dialog.run() dialog.destroy() return answer class ActionConflict (Conflict): ActionTypes = set(('Bell', 'Button', 'Edge', 'Key')) def __init__ (self, setting, settings, autoResolve): def ExcludeInternal (settings): for setting in settings: if not setting.Info[0]: yield setting Conflict.__init__(self, autoResolve) self.Conflicts = [] self.Name = "" self.Setting = setting if settings is None: settings = [] self.Settings = settings # if the action is internal, include all global actions plus internal # actions from the same plugin. If it is global, include all actions. if not settings: for n in self.Setting.Plugin.Context.Plugins: plugin = self.Setting.Plugin.Context.Plugins[n] if plugin.Enabled: pluginActions = GetSettings(plugin, types=self.ActionTypes) if len(setting.Info) and setting.Info[0] and plugin is not setting.Plugin: settings.extend(ExcludeInternal(pluginActions)) else: settings.extend(pluginActions) def Resolve (self, updater = None): if len (self.Conflicts): for setting in self.Conflicts: answer = self.AskUser (self.Setting, setting) if answer == gtk.RESPONSE_YES: setting.Value = 'Disabled' if updater: updater.UpdateSetting (setting) if answer == gtk.RESPONSE_NO: return False return True def AskUser (self, setting, conflict): msg = _("The new value for the %(binding)s binding for the action %(action)s "\ "in plugin %(plugin)s conflicts with the action %(action_conflict)s of the %(plugin_conflict)s plugin.\n"\ "Do you wish to disable %(action_conflict)s in the %(plugin_conflict)s plugin?") msg_dict = {'binding': self.Name, 'action': setting.ShortDesc, 'plugin': setting.Plugin.ShortDesc, 'action_conflict': conflict.ShortDesc, 'plugin_conflict': conflict.Plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) yesButton = (_("Disable %(action_conflict)s") % msg_dict, gtk.STOCK_YES, gtk.RESPONSE_YES) noButton = (_("Don't set %(action)s") % msg_dict, gtk.STOCK_NO, gtk.RESPONSE_NO) ignoreButton = (_("Set %(action)s anyway") % msg_dict, gtk.STOCK_STOP, gtk.RESPONSE_REJECT) return self.Ask (msg, (ignoreButton, noButton, yesButton)) class KeyConflict(ActionConflict): def __init__(self, setting, newValue, settings=None, autoResolve=False, ignoreOld=False): ActionConflict.__init__(self, setting, settings, autoResolve) self.Name = _("key") if not newValue: return newValue = newValue.lower () oldValue = self.Setting.Value.lower () badValues = ["disabled", "none"] if not ignoreOld: badValues.append (oldValue) if newValue in badValues: return for s in self.Settings: if s is setting: continue if s.Type == 'Key': if s.Value.lower() == newValue: self.Conflicts.append (s) class ButtonConflict(ActionConflict): def __init__(self, setting, newValue, settings=None, autoResolve=False, ignoreOld=False): ActionConflict.__init__(self, setting, settings, autoResolve) self.Name = _("button") if not newValue: return newValue = newValue.lower () oldValue = self.Setting.Value.lower () badValues = ["disabled", "none"] if not ignoreOld: badValues.append (oldValue) if newValue in badValues: return for s in self.Settings: if s is setting: continue if s.Type == 'Button': if s.Value.lower() == newValue: self.Conflicts.append (s) class EdgeConflict(ActionConflict): def __init__(self, setting, newValue, settings=None, autoResolve=False, ignoreOld=False): ActionConflict.__init__(self, setting, settings, autoResolve) self.Name = _("edge") if not newValue: return newEdges = set(newValue.split("|")) if not ignoreOld: oldEdges = set(self.Setting.Value.split("|")) diff = newEdges - oldEdges if diff: newEdges = diff # no need to check edges that were already set else: return for s in self.Settings: if s is setting: continue elif s.Type == 'Edge': settingEdges = set(s.Value.split("|")) union = newEdges & settingEdges if union: for edge in union: self.Conflicts.append ((s, edge)) break def Resolve (self, updater = None): if len (self.Conflicts): for setting, edge in self.Conflicts: answer = self.AskUser (self.Setting, setting) if answer == gtk.RESPONSE_YES: value = setting.Value.split ("|") value.remove (edge) setting.Value = "|".join (value) if updater: updater.UpdateSetting (setting) if answer == gtk.RESPONSE_NO: return False return True # Not used for plugin dependencies (which are handled by ccs) but own feature checking e.g. image support class FeatureRequirement(Conflict): def __init__(self, context, feature, autoResolve=False): Conflict.__init__(self, autoResolve) self.Requirements = [] self.Context = context self.Feature = feature self.Found = False for plugin in context.Plugins.values(): if feature in plugin.Features: self.Found = True if not plugin.Enabled: self.Requirements.append(plugin) def Resolve(self): if len(self.Requirements) == 0 and self.Found: return True elif not self.Found: answer = self.ErrorAskUser() if answer == gtk.RESPONSE_YES: return True else: return False for plugin in self.Requirements: answer = self.AskUser(plugin) if answer == gtk.RESPONSE_YES: plugin.Enabled = True self.Context.Write() return True def ErrorAskUser(self): msg = _("You are trying to use the feature %(feature)s which is not provided by any plugin.\n"\ "Do you wish to use this feature anyway?") msg_dict = {'feature': self.Feature} msg = msg % protect_markup_dict (msg_dict) yesButton = (_("Use %(feature)s") % msg_dict, gtk.STOCK_YES, gtk.RESPONSE_YES) noButton = (_("Don't use %(feature)s") % msg_dict, gtk.STOCK_NO, gtk.RESPONSE_NO) answer = self.Ask(msg, (noButton, yesButton)) return answer def AskUser(self, plugin): msg = _("You are trying to use the feature %(feature)s which is provided by %(plugin)s.\n"\ "This plugin is currently disabled.\n"\ "Do you wish to enable %(plugin)s so the feature is available?") msg_dict = {'feature': self.Feature, 'plugin': plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) yesButton = (_("Enable %(plugin)s") % msg_dict, gtk.STOCK_YES, gtk.RESPONSE_YES) noButton = (_("Don't enable %(feature)s") % msg_dict, gtk.STOCK_NO, gtk.RESPONSE_NO) answer = self.Ask(msg, (noButton, yesButton)) return answer class PluginConflict(Conflict): def __init__(self, plugin, conflicts, autoResolve=False): Conflict.__init__(self, autoResolve) self.Conflicts = conflicts self.Plugin = plugin def Resolve(self): for conflict in self.Conflicts: if conflict[0] == 'ConflictFeature': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: disableConflicts = conflict[2][0].DisableConflicts con = PluginConflict(conflict[2][0], disableConflicts, self.AutoResolve) if con.Resolve(): conflict[2][0].Enabled = False else: return False else: return False elif conflict[0] == 'ConflictPlugin': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: disableConflicts = conflict[2][0].DisableConflicts con = PluginConflict(conflict[2][0], disableConflicts, self.AutoResolve) if con.Resolve(): conflict[2][0].Enabled = False else: return False else: return False elif conflict[0] == 'RequiresFeature': answer, choice = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: for plg in conflict[2]: if plg.ShortDesc == choice: enableConflicts = plg.EnableConflicts con = PluginConflict(plg, enableConflicts, self.AutoResolve) if con.Resolve(): plg.Enabled = True else: return False break else: return False elif conflict[0] == 'RequiresPlugin': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: enableConflicts = conflict[2][0].EnableConflicts con = PluginConflict(conflict[2][0], enableConflicts, self.AutoResolve) if con.Resolve(): conflict[2][0].Enabled = True else: return False else: return False elif conflict[0] == 'FeatureNeeded': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: for plg in conflict[2]: disableConflicts = plg.DisableConflicts con = PluginConflict(plg, disableConflicts, self.AutoResolve) if con.Resolve(): plg.Enabled = False else: return False else: return False elif conflict[0] == 'PluginNeeded': answer = self.AskUser(self.Plugin, conflict) if answer == gtk.RESPONSE_YES: for plg in conflict[2]: disableConflicts = plg.DisableConflicts con = PluginConflict(plg, disableConflicts, self.AutoResolve) if con.Resolve(): plg.Enabled = False else: return False else: return False # Only when enabling a plugin types = [] actionConflicts = [] if not self.Plugin.Enabled and not self.AutoResolve: for setting in GetSettings(self.Plugin): conflict = None if setting.Type == 'Key': conflict = KeyConflict(setting, setting.Value, ignoreOld=True) elif setting.Type == 'Button': conflict = ButtonConflict(setting, setting.Value, ignoreOld=True) elif setting.Type == 'Edge': conflict = EdgeConflict(setting, setting.Value, ignoreOld=True) # Conflicts were found if conflict and conflict.Conflicts: name = conflict.Name if name not in types: types.append(name) actionConflicts.append(conflict) if actionConflicts: answer = self.AskUser(self.Plugin, ('ConflictAction', types)) if answer == gtk.RESPONSE_YES: for conflict in actionConflicts: conflict.Resolve() return True def AskUser(self, plugin, conflict): msg = "" okMsg = "" cancelMsg = "" widgets = [] # CCSM custom conflict if conflict[0] == 'ConflictAction': msg = _("Some %(bindings)s bindings of Plugin %(plugin)s " \ "conflict with other plugins. Do you want to resolve " \ "these conflicts?") types = conflict[1] bindings = ", ".join(types[:-1]) if len(types) > 1: bindings = "%s and %s" % (bindings, types[-1]) msg_dict = {'plugin': plugin.ShortDesc, 'bindings': bindings} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Resolve conflicts") % msg_dict cancelMsg = _("Ignore conflicts") % msg_dict elif conflict[0] == 'ConflictFeature': msg = _("Plugin %(plugin_conflict)s provides feature " \ "%(feature)s which is also provided by " \ "%(plugin)s") msg_dict = {'plugin_conflict': conflict[2][0].ShortDesc, 'feature': conflict[1], 'plugin': plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable %(plugin_conflict)s") % msg_dict cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'ConflictPlugin': msg = _("Plugin %(plugin_conflict)s conflicts with " \ "%(plugin)s.") msg_dict = {'plugin_conflict': conflict[2][0].ShortDesc, 'plugin': plugin.ShortDesc} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable %(plugin_conflict)s") % msg_dict cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'RequiresFeature': pluginList = ', '.join("\"%s\"" % plugin.ShortDesc for plugin in conflict[2]) msg = _("%(plugin)s requires feature %(feature)s " \ "which is provided by the following " \ "plugins:\n%(plugin_list)s") msg_dict = {'plugin': plugin.ShortDesc, 'feature': conflict[1], 'plugin_list': pluginList} msg = msg % protect_markup_dict (msg_dict) cmb = gtk.combo_box_new_text() for plugin in conflict[2]: cmb.append_text(plugin.ShortDesc) cmb.set_active(0) widgets.append(cmb) okMsg = _("Enable these plugins") cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'RequiresPlugin': msg = _("%(plugin)s requires the plugin %(require)s.") msg_dict = {'plugin': plugin.ShortDesc, 'require': conflict[2][0].ShortDesc} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Enable %(require)s") % msg_dict cancelMsg = _("Don't enable %(plugin)s") % msg_dict elif conflict[0] == 'FeatureNeeded': pluginList = ', '.join("\"%s\"" % plugin.ShortDesc for plugin in conflict[2]) msg = _("%(plugin)s provides the feature " \ "%(feature)s which is required by the plugins " \ "%(plugin_list)s.") msg_dict = {'plugin': plugin.ShortDesc, 'feature': conflict[1], 'plugin_list': pluginList} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable these plugins") cancelMsg = _("Don't disable %(plugin)s") % msg_dict elif conflict[0] == 'PluginNeeded': pluginList = ', '.join("\"%s\"" % plugin.ShortDesc for plugin in conflict[2]) msg = _("%(plugin)s is required by the plugins " \ "%(plugin_list)s.") msg_dict = {'plugin': plugin.ShortDesc, 'plugin_list': pluginList} msg = msg % protect_markup_dict (msg_dict) okMsg = _("Disable these plugins") cancelMsg = _("Don't disable %(plugin)s") % msg_dict okButton = (okMsg, gtk.STOCK_OK, gtk.RESPONSE_YES) cancelButton = (cancelMsg, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) answer = self.Ask(msg, (cancelButton, okButton), widgets) if conflict[0] == 'RequiresFeature': choice = widgets[0].get_active_text() return answer, choice return answer e ./compizconfig/ccsm/ccm/Widgets.py0000644000004100000410000016315513246301623017414 0ustar www-datawww-data# -*- coding: UTF-8 -*- # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Authors: Quinn Storm (quinn@beryl-project.org) # Patrick Niklaus (marex@opencompositing.org) # Guillaume Seguin (guillaume@segu.in) # Christopher Williams (christopherw@verizon.net) # Copyright (C) 2007 Quinn Storm import pygtk import gtk import gtk.gdk import gobject import cairo, pangocairo from math import pi, sqrt import time import re import mimetypes mimetypes.init() from ccm.Utils import * from ccm.Constants import * from ccm.Conflicts import * import locale import gettext locale.setlocale(locale.LC_ALL, "") gettext.bindtextdomain("ccsm", DataDir + "/locale") gettext.textdomain("ccsm") _ = gettext.gettext # # Try to use gtk like coding style for consistency # class ClearEntry(gtk.Entry): def __init__(self): gtk.Entry.__init__(self) self.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, gtk.STOCK_CLEAR) self.set_icon_tooltip_text(gtk.ENTRY_ICON_SECONDARY, _("Clear")) self.connect('icon-press', self._clear_pressed) def _clear_pressed(self, widget, pos, event): if pos == gtk.ENTRY_ICON_SECONDARY: self.set_text("") # Cell Renderer for MultiList class CellRendererColor(gtk.GenericCellRenderer): __gproperties__ = { 'text': (gobject.TYPE_STRING, 'color markup text', 'The color as markup like this: #rrrrggggbbbbaaaa', '#0000000000000000', gobject.PARAM_READWRITE) } _text = '#0000000000000000' _color = [0, 0, 0, 0] _surface = None _surface_size = (-1, -1) def __init__(self): gtk.GenericCellRenderer.__init__(self) def _parse_color(self): color = gtk.gdk.color_parse(self._text[:-4]) alpha = int("0x%s" % self._text[-4:], base=16) self._color = [color.red/65535.0, color.green/65535.0, color.blue/65535.0, alpha/65535.0] def do_set_property(self, property, value): if property.name == 'text': self._text = value self._parse_color() def do_get_property(self, property): if property.name == 'text': return self._text def on_get_size(self, widget, cell_area): return (0, 0, 0, 0) # FIXME def redraw(self, width, height): # found in gtk-color-button.c CHECK_SIZE = 4 CHECK_DARK = 21845 # 65535 / 3 CHECK_LIGHT = 43690 width += 10 height += 10 self._surface_size = (width, height) self._surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) cr = cairo.Context(self._surface) x = 0 y = 0 colors = [CHECK_DARK, CHECK_LIGHT] state = 0 begin_state = 0 while y < height: while x < width: cr.rectangle(x, y, CHECK_SIZE, CHECK_SIZE) c = colors[state] / 65535.0 cr.set_source_rgb(c, c, c) cr.fill() x += CHECK_SIZE state = not state state = not begin_state begin_state = state x = 0 y += CHECK_SIZE def on_render(self, window, widget, background_area, cell_area, expose_area, flags): cr = window.cairo_create() height, width = (cell_area.height, cell_area.width) sheight, swidth = self._surface_size if height > sheight or width > swidth: self.redraw(width, height) cr.rectangle(cell_area.x, cell_area.y, width, height) cr.clip() cr.set_source_surface(self._surface, cell_area.x, cell_area.y) cr.paint() r, g, b, a = self._color cr.set_source_rgba(r, g, b, a) cr.paint() class PluginView(gtk.TreeView): def __init__(self, plugins): liststore = gtk.ListStore(str, gtk.gdk.Pixbuf, bool, object) self.model = liststore.filter_new() gtk.TreeView.__init__(self, self.model) self.SelectionHandler = None self.Plugins = set(plugins) for plugin in sorted(plugins.values(), key=PluginKeyFunc): liststore.append([plugin.ShortDesc, Image(plugin.Name, type=ImagePlugin).props.pixbuf, plugin.Enabled, plugin]) column = self.insert_column_with_attributes(0, _('Plugin'), gtk.CellRendererPixbuf(), pixbuf=1, sensitive=2) cell = gtk.CellRendererText() cell.props.wrap_width = 200 column.pack_start(cell) column.set_attributes(cell, text=0) self.model.set_visible_func(self.VisibleFunc) self.get_selection().connect('changed', self.SelectionChanged) def VisibleFunc(self, model, iter): return model[iter][3].Name in self.Plugins def Filter(self, plugins): self.Plugins = set(plugins) self.model.refilter() def SelectionChanged(self, selection): model, iter = selection.get_selected() if iter is None: return self.SelectionHandler(None) return self.SelectionHandler(model[iter][3]) class GroupView(gtk.TreeView): def __init__(self, name): self.model = gtk.ListStore(str, str) gtk.TreeView.__init__(self, self.model) self.SelectionHandler = None self.Visible = set() cell = gtk.CellRendererText() cell.props.ypad = 5 cell.props.wrap_width = 200 column = gtk.TreeViewColumn(name, cell, text=0) self.append_column(column) self.get_selection().connect('changed', self.SelectionChanged) self.hide_all() self.props.no_show_all = True def Update(self, items): self.model.clear() self.model.append([_('All'), 'All']) length = 0 for item in items: self.model.append([item or _("General"), item]) if item: # exclude "General" from count length += 1 if length: self.show_all() self.props.no_show_all = False else: self.hide_all() self.props.no_show_all = True def SelectionChanged(self, selection): model, iter = selection.get_selected() if iter is None: return None return self.SelectionHandler(model[iter][1]) # Selector Buttons # class SelectorButtons(gtk.HBox): def __init__(self): gtk.HBox.__init__(self) self.set_border_width(10) self.set_spacing(5) self.buttons = [] self.arrows = [] def clear_buttons(self): for widget in (self.arrows + self.buttons): widget.destroy() self.arrows = [] self.buttons = [] def add_button(self, label, callback): arrow = gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_NONE) button = gtk.Button(label) button.set_relief(gtk.RELIEF_NONE) button.connect('clicked', self.on_button_clicked, callback) if self.get_children(): self.pack_start(arrow, False, False) self.arrows.append(arrow) self.pack_start(button, False, False) self.buttons.append(button) self.show_all() def remove_button(self, pos): if pos > len(self.buttons)-1: return self.buttons[pos].destroy() self.buttons.remove(self.buttons[pos]) if pos > 0: self.arrows[pos-1].destroy() self.arrows.remove(self.arrows[pos-1]) def on_button_clicked(self, widget, callback): callback(selector=True) # Selector Box # class SelectorBox(gtk.ScrolledWindow): def __init__(self, backgroundColor): gtk.ScrolledWindow.__init__(self) self.viewport = gtk.Viewport() self.viewport.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(backgroundColor)) self.props.hscrollbar_policy = gtk.POLICY_NEVER self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.box = gtk.VBox() self.box.set_spacing(5) self.viewport.add(self.box) self.add(self.viewport) def close(self): self.destroy() self.viewport.destroy() for button in self.box.get_children(): button.destroy() self.box.destroy() def add_item(self, item, callback, markup="%s", image=None, info=None): button = gtk.Button() label = Label(wrap=170) text = protect_pango_markup(item) label.set_markup(markup % text or _("General")) labelBox = gtk.VBox() labelBox.set_spacing(5) labelBox.pack_start(label) if info: infoLabel = Label() infoLabel.set_markup("%s" % info) labelBox.pack_start(infoLabel) box = gtk.HBox() box.set_spacing(5) if image: box.pack_start(image, False, False) box.pack_start(labelBox) button.add(box) button.connect("clicked", callback, item) button.set_relief(gtk.RELIEF_NONE) self.box.pack_start(button, False, False) def clear_list(self): for button in self.box.get_children(): button.destroy() def set_item_list(self, list, callback): self.clear_list() for item in list: self.add_item(item) self.box.show_all() # Scrolled List # class ScrolledList(gtk.ScrolledWindow): def __init__(self, name): gtk.ScrolledWindow.__init__(self) self.props.hscrollbar_policy = gtk.POLICY_NEVER self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.store = gtk.ListStore(gobject.TYPE_STRING) self.view = gtk.TreeView(self.store) self.view.set_headers_visible(True) self.view.insert_column_with_attributes(-1, name, gtk.CellRendererText(), text=0) self.set_size_request(300, 300) self.add(self.view) self.select = self.view.get_selection() self.select.set_mode(gtk.SELECTION_SINGLE) def get_list(self): values = [] iter = self.store.get_iter_first() while iter: value = self.store.get(iter, 0)[0] if value != "": values.append(value) iter = self.store.iter_next(iter) return values def clear(self): self.store.clear() def append(self, value): iter = self.store.append() self.store.set(iter, 0, value) def set(self, pos, value): iter = self.store.get_iter(pos) self.store.set(iter, 0, value) def delete(self, b): selected_rows = self.select.get_selected_rows()[1] for path in selected_rows: iter = self.store.get_iter(path) self.store.remove(iter) def move_up(self, b): selected_rows = self.select.get_selected_rows()[1] if len(selected_rows) == 1: iter = self.store.get_iter(selected_rows[0]) prev = self.store.get_iter_first() if not self.store.get_path(prev) == self.store.get_path(iter): while prev is not None and not self.store.get_path(self.store.iter_next(prev)) == self.store.get_path(iter): prev = self.store.iter_next(prev) self.store.swap(iter, prev) def move_down(self, b): selected_rows = self.select.get_selected_rows()[1] if len(selected_rows) == 1: iter = self.store.get_iter(selected_rows[0]) next = self.store.iter_next(iter) if next is not None: self.store.swap(iter, next) # Button modifier selection widget # class ModifierSelector (gtk.DrawingArea): __gsignals__ = {"added" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING]), "removed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING])} _current = [] _base_surface = None _surface = None _x0 = 0 _y0 = 12 _width = 100 _height = 50 _font = "Sans 12 Bold" def __init__ (self, mods): '''Prepare widget''' super (ModifierSelector, self).__init__ () self._current = mods.split ("|") modifier = "%s/modifier.png" % PixmapDir self._base_surface = cairo.ImageSurface.create_from_png (modifier) self.add_events (gtk.gdk.BUTTON_PRESS_MASK) self.connect ("expose_event", self.expose) self.connect ("button_press_event", self.button_press) self.set_size_request (200, 120) x0, y0, width, height = self._x0, self._y0, self._width, self._height self._modifiers = { "Shift" : (x0, y0), "Control" : (x0, y0 + height), "Super" : (x0 + width, y0), "Alt" : (x0 + width, y0 + height) } self._names = { "Control" : "Ctrl" } def set_current (self, value): self._current = value.split ("|") self.redraw (queue = True) def get_current (self): return "|".join ([s for s in self._current if len (s) > 0]) current = property (get_current, set_current) def draw (self, cr, width, height): '''The actual drawing function''' for mod in self._modifiers: x, y = self._modifiers[mod] if mod in self._names: text = self._names[mod] else: text = mod cr.set_source_surface (self._base_surface, x, y) cr.rectangle (x, y, self._width, self._height) cr.fill_preserve () if mod in self._current: cr.set_source_rgb (0.3, 0.3, 0.3) self.write (cr, x + 23, y + 15, text) cr.set_source_rgb (0.5, 1, 0) else: cr.set_source_rgb (0, 0, 0) self.write (cr, x + 22, y + 14, text) def write (self, cr, x, y, text): cr.move_to (x, y) markup = '''%s''' % (self._font, text) pcr = pangocairo.CairoContext (cr) layout = pcr.create_layout () layout.set_markup (markup) pcr.show_layout (layout) def redraw (self, queue = False): '''Redraw internal surface''' alloc = self.get_allocation () # Prepare drawing surface width, height = alloc.width, alloc.height self._surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, width, height) cr = cairo.Context (self._surface) # Clear cr.set_operator (cairo.OPERATOR_CLEAR) cr.paint () cr.set_operator (cairo.OPERATOR_OVER) # Draw self.draw (cr, alloc.width, alloc.height) # Queue expose event if required if queue: self.queue_draw () def expose (self, widget, event): '''Expose event handler''' cr = self.window.cairo_create () if not self._surface: self.redraw () cr.set_source_surface (self._surface) cr.rectangle (event.area.x, event.area.y, event.area.width, event.area.height) cr.clip () cr.paint () return False def in_rect (self, x, y, x0, y0, x1, y1): return x >= x0 and y >= y0 and x <= x1 and y <= y1 def button_press (self, widget, event): x, y = event.x, event.y mod = "" for modifier in self._modifiers: x0, y0 = self._modifiers[modifier] if self.in_rect (x, y, x0, y0, x0 + self._width, y0 + self._height): mod = modifier break if not len (mod): return if mod in self._current: self._current.remove (mod) self.emit ("removed", mod) else: self._current.append (mod) self.emit ("added", mod) self.redraw (queue = True) # Edge selection widget # class EdgeSelector (gtk.DrawingArea): __gsignals__ = {"clicked" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT,))} _base_surface = None _surface = None _radius = 13 _cradius = 20 _coords = [] def __init__ (self): '''Prepare widget''' super (EdgeSelector, self).__init__ () background = "%s/display.png" % PixmapDir self._base_surface = cairo.ImageSurface.create_from_png (background) self.add_events (gtk.gdk.BUTTON_PRESS_MASK) self.connect ("expose_event", self.expose) self.connect ("button_press_event", self.button_press) self.set_size_request (196, 196) # Useful vars x0 = 16 y0 = 24 x1 = 181 y1 = 133 x2 = x0 + 39 y2 = y0 + 26 x3 = x1 - 39 y3 = y1 - 26 self._coords = (x0, y0, x1, y1, x2, y2, x3, y3) def draw (self, cr, width, height): '''The actual drawing function''' # Useful vars x0, y0, x1, y1, x2, y2, x3, y3 = self._coords cradius = self._cradius radius = self._radius cr.set_line_width(1.0) # Top left edge cr.new_path () cr.move_to (x0, y0 + cradius) cr.line_to (x0, y0) cr.line_to (x0 + cradius, y0) cr.arc (x0, y0, cradius, 0, pi / 2) cr.close_path () self.set_fill_color (cr, "TopLeft") cr.fill_preserve () self.set_stroke_color (cr, "TopLeft") cr.stroke () # Top right edge cr.new_path () cr.move_to (x1, y0 + cradius) cr.line_to (x1, y0) cr.line_to (x1 - cradius, y0) cr.arc_negative (x1, y0, cradius, pi, pi/2) cr.close_path () self.set_fill_color (cr, "TopRight") cr.fill_preserve () self.set_stroke_color (cr, "TopRight") cr.stroke () # Bottom left edge cr.new_path () cr.move_to (x0, y1 - cradius) cr.line_to (x0, y1) cr.line_to (x0 + cradius, y1) cr.arc_negative (x0, y1, cradius, 2 * pi, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "BottomLeft") cr.fill_preserve () self.set_stroke_color (cr, "BottomLeft") cr.stroke () # Bottom right edge cr.new_path () cr.move_to (x1, y1 - cradius) cr.line_to (x1, y1) cr.line_to (x1 - cradius, y1) cr.arc (x1, y1, cradius, pi, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "BottomRight") cr.fill_preserve () self.set_stroke_color (cr, "BottomRight") cr.stroke () # Top edge cr.new_path () cr.move_to (x2 + radius, y0) cr.line_to (x3 - radius, y0) cr.arc (x3 - radius, y0, radius, 0, pi / 2) cr.line_to (x2 + radius, y0 + radius) cr.arc (x2 + radius, y0, radius, pi / 2, pi) cr.close_path () self.set_fill_color (cr, "Top") cr.fill_preserve () self.set_stroke_color (cr, "Top") cr.stroke () # Bottom edge cr.new_path () cr.move_to (x2 + radius, y1) cr.line_to (x3 - radius, y1) cr.arc_negative (x3 - radius, y1, radius, 0, - pi / 2) cr.line_to (x2 + radius, y1 - radius) cr.arc_negative (x2 + radius, y1, radius, - pi / 2, pi) cr.close_path () self.set_fill_color (cr, "Bottom") cr.fill_preserve () self.set_stroke_color (cr, "Bottom") cr.stroke () # Left edge cr.new_path () cr.move_to (x0, y2 + radius) cr.line_to (x0, y3 - radius) cr.arc_negative (x0, y3 - radius, radius, pi / 2, 0) cr.line_to (x0 + radius, y2 + radius) cr.arc_negative (x0, y2 + radius, radius, 0, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "Left") cr.fill_preserve () self.set_stroke_color (cr, "Left") cr.stroke () # Right edge cr.new_path () cr.move_to (x1, y2 + radius) cr.line_to (x1, y3 - radius) cr.arc (x1, y3 - radius, radius, pi / 2, pi) cr.line_to (x1 - radius, y2 + radius) cr.arc (x1, y2 + radius, radius, pi, 3 * pi / 2) cr.close_path () self.set_fill_color (cr, "Right") cr.fill_preserve () self.set_stroke_color (cr, "Right") cr.stroke () def set_fill_color (self, cr, edge): '''Set painting color for edge''' cr.set_source_rgb (0.9, 0.9, 0.9) def set_stroke_color (self, cr, edge): '''Set stroke color for edge''' cr.set_source_rgb (0.45, 0.45, 0.45) def redraw (self, queue = False): '''Redraw internal surface''' alloc = self.get_allocation () # Prepare drawing surface width, height = alloc.width, alloc.height self._surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, width, height) cr = cairo.Context (self._surface) # Draw background cr.set_source_surface (self._base_surface) cr.paint () # Draw self.draw (cr, alloc.width, alloc.height) # Queue expose event if required if queue: self.queue_draw () def expose (self, widget, event): '''Expose event handler''' cr = self.window.cairo_create () if not self._surface: self.redraw () cr.set_source_surface (self._surface) cr.rectangle (event.area.x, event.area.y, event.area.width, event.area.height) cr.clip () cr.paint () return False def in_circle_quarter (self, x, y, x0, y0, x1, y1, x2, y2, radius): '''Args: x, y = point coordinates x0, y0 = center coordinates x1, y1 = circle square top left coordinates x2, y2 = circle square bottom right coordinates radius = circle radius''' if not self.in_rect (x, y, x1, y1, x2, y2): return False return self.dist (x, y, x0, y0) <= radius def dist (self, x1, y1, x2, y2): return sqrt ((x2 - x1) ** 2 + (y2 - y1) ** 2) def in_rect (self, x, y, x0, y0, x1, y1): return x >= x0 and y >= y0 and x <= x1 and y <= y1 def button_press (self, widget, event): x, y = event.x, event.y edge = "" # Useful vars x0, y0, x1, y1, x2, y2, x3, y3 = self._coords cradius = self._cradius radius = self._radius if self.in_circle_quarter (x, y, x0, y0, x0, y0, x0 + cradius, y0 + cradius, cradius): edge = "TopLeft" elif self.in_circle_quarter (x, y, x1, y0, x1 - cradius, y0, x1, y0 + cradius, cradius): edge = "TopRight" elif self.in_circle_quarter (x, y, x0, y1, x0, y1 - cradius, x0 + cradius, y1, cradius): edge = "BottomLeft" elif self.in_circle_quarter (x, y, x1, y1, x1 - cradius, y1 - cradius, x1, y1, cradius): edge = "BottomRight" elif self.in_rect (x, y, x2 + radius, y0, x3 - radius, y0 + radius) \ or self.in_circle_quarter (x, y, x2 + radius, y0, x2, y0, x2 + radius, y0 + radius, radius) \ or self.in_circle_quarter (x, y, x3 - radius, y0, x3 - radius, y0, x3, y0 + radius, radius): edge = "Top" elif self.in_rect (x, y, x2 + radius, y1 - radius, x3 - radius, y1) \ or self.in_circle_quarter (x, y, x2 + radius, y1, x2, y1 - radius, x2 + radius, y1, radius) \ or self.in_circle_quarter (x, y, x3 - radius, y1, x3 - radius, y1 - radius, x3, y1, radius): edge = "Bottom" elif self.in_rect (x, y, x0, y2 + radius, x0 + radius, y3 - radius) \ or self.in_circle_quarter (x, y, x0, y2 + radius, x0, y2, x0 + radius, y2 + radius, radius) \ or self.in_circle_quarter (x, y, x0, y3 - radius, x0, y3 - radius, x0 + radius, y3, radius): edge = "Left" elif self.in_rect (x, y, x1 - radius, y2 + radius, x1, y3 - radius) \ or self.in_circle_quarter (x, y, x1, y2 + radius, x1 - radius, y2, x1, y2 + radius, radius) \ or self.in_circle_quarter (x, y, x1, y3 - radius, x1 - radius, y3 - radius, x1, y3, radius): edge = "Right" if edge: self.emit ("clicked", edge, event) # Edge selection widget # class SingleEdgeSelector (EdgeSelector): _current = [] def __init__ (self, edge): '''Prepare widget''' EdgeSelector.__init__ (self) self._current = edge.split ("|") self.connect ('clicked', self.edge_clicked) def set_current (self, value): self._current = value.split ("|") self.redraw (queue = True) def get_current (self): return "|".join ([s for s in self._current if len (s) > 0]) current = property (get_current, set_current) def set_fill_color (self, cr, edge): '''Set painting color for edge''' if edge in self._current: cr.set_source_rgb (0.64, 1.0, 0.09) else: cr.set_source_rgb (0.80, 0.00, 0.00) def set_stroke_color (self, cr, edge): '''Set stroke color for edge''' if edge in self._current: cr.set_source_rgb (0.31, 0.60, 0.02) else: cr.set_source_rgb (0.64, 0.00, 0.00) def edge_clicked (self, widget, edge, event): if not len (edge): return if edge in self._current: self._current.remove (edge) else: self._current.append (edge) self.redraw (queue = True) # Global Edge Selector # class GlobalEdgeSelector(EdgeSelector): _settings = [] _edges = {} _text = {} _context = None def __init__ (self, context, settings=[]): EdgeSelector.__init__ (self) self._context = context self._settings = settings self.connect ("clicked", self.show_popup) if len (settings) <= 0: self.generate_setting_list () def set_fill_color (self, cr, edge): '''Set painting color for edge''' if edge in self._edges: cr.set_source_rgb (0.64, 1.0, 0.09) else: cr.set_source_rgb (0.80, 0.00, 0.00) def set_stroke_color (self, cr, edge): '''Set stroke color for edge''' if edge in self._edges: cr.set_source_rgb (0.31, 0.60, 0.02) else: cr.set_source_rgb (0.64, 0.00, 0.00) def set_settings (self, value): self._settings = value def get_settings (self): return self._settings settings = property (get_settings, set_settings) def generate_setting_list (self): self._settings = [] def filter_settings(plugin): if plugin.Enabled: settings = sorted (GetSettings(plugin), key=SettingKeyFunc) settings = [s for s in settings if s.Type == 'Edge'] return settings return [] for plugin in self._context.Plugins.values (): self._settings += filter_settings (plugin) for setting in self._settings: edges = setting.Value.split ("|") for edge in edges: self._edges[edge] = setting def set_edge_setting (self, setting, edge): if not setting: if edge in self._edges: self._edges.pop(edge) for setting in self._settings: value = setting.Value.split ("|") if edge in value: value.remove(edge) value = "|".join ([s for s in value if len (s) > 0]) setting.Value = value else: value = setting.Value.split ("|") if not edge in value: value.append (edge) value = "|".join ([s for s in value if len (s) > 0]) conflict = EdgeConflict (setting, value, settings = self._settings, autoResolve = True) if conflict.Resolve (GlobalUpdater): setting.Value = value self._edges[edge] = setting self._context.Write() self.redraw (queue = True) def show_popup (self, widget, edge, event): self._text = {} comboBox = gtk.combo_box_new_text () comboBox.append_text (_("None")) comboBox.set_active (0) i = 1 for setting in self._settings: text = "%s: %s" % (setting.Plugin.ShortDesc, setting.ShortDesc) comboBox.append_text (text) self._text[text] = setting if edge in setting.Value.split ("|"): comboBox.set_active (i) i += 1 comboBox.set_size_request (200, -1) comboBox.connect ('changed', self.combo_changed, edge) popup = Popup (self, child=comboBox, decorated=False, mouse=True, modal=False) popup.show_all() popup.connect ('focus-out-event', self.focus_out) def focus_out (self, widget, event): combo = widget.get_child () if combo.props.popup_shown: return gtk_process_events () widget.destroy () def combo_changed (self, widget, edge): text = widget.get_active_text () setting = None if text != _("None"): setting = self._text[text] self.set_edge_setting (setting, edge) popup = widget.get_parent () popup.destroy () # Popup # class Popup (gtk.Window): def __init__ (self, parent=None, text=None, child=None, decorated=True, mouse=False, modal=True): gtk.Window.__init__ (self, gtk.WINDOW_TOPLEVEL) self.set_type_hint (gtk.gdk.WINDOW_TYPE_HINT_UTILITY) self.set_position (mouse and gtk.WIN_POS_MOUSE or gtk.WIN_POS_CENTER_ALWAYS) if parent: self.set_transient_for (parent.get_toplevel ()) self.set_modal (modal) self.set_decorated (decorated) self.set_property("skip-taskbar-hint", True) if text: label = gtk.Label (text) align = gtk.Alignment () align.set_padding (20, 20, 20, 20) align.add (label) self.add (align) elif child: self.add (child) gtk_process_events () def destroy (self): gtk.Window.destroy (self) gtk_process_events () # Key Grabber # class KeyGrabber (gtk.Button): __gsignals__ = {"changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_INT, gobject.TYPE_INT]), "current-changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_INT, gobject.TYPE_INT])} key = 0 mods = 0 handler = None popup = None label = None def __init__ (self, key = 0, mods = 0, label = None): '''Prepare widget''' super (KeyGrabber, self).__init__ () self.key = key self.mods = mods self.label = label self.connect ("clicked", self.begin_key_grab) self.set_label () def begin_key_grab (self, widget): self.add_events (gtk.gdk.KEY_PRESS_MASK) self.popup = Popup (self, _("Please press the new key combination")) self.popup.show_all() self.handler = self.popup.connect ("key-press-event", self.on_key_press_event) while gtk.gdk.keyboard_grab (self.popup.window) != gtk.gdk.GRAB_SUCCESS: time.sleep (0.1) def end_key_grab (self): gtk.gdk.keyboard_ungrab (gtk.get_current_event_time ()) self.popup.disconnect (self.handler) self.popup.destroy () def on_key_press_event (self, widget, event): mods = event.state & gtk.accelerator_get_default_mod_mask () if event.keyval in (gtk.keysyms.Escape, gtk.keysyms.Return) \ and not mods: if event.keyval == gtk.keysyms.Escape: self.emit ("changed", self.key, self.mods) self.end_key_grab () self.set_label () return key = gtk.gdk.keyval_to_lower (event.keyval) if (key == gtk.keysyms.ISO_Left_Tab): key = gtk.keysyms.Tab if gtk.accelerator_valid (key, mods) \ or (key == gtk.keysyms.Tab and mods): self.set_label (key, mods) self.end_key_grab () self.key = key self.mods = mods self.emit ("changed", self.key, self.mods) return self.set_label (key, mods) def set_label (self, key = None, mods = None): if self.label: if key != None and mods != None: self.emit ("current-changed", key, mods) gtk.Button.set_label (self, self.label) return if key == None and mods == None: key = self.key mods = self.mods label = GetAcceleratorName (key, mods) if not len (label): label = _("Disabled") gtk.Button.set_label (self, label) # Match Button # class MatchButton(gtk.Button): __gsignals__ = {"changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING])} prefix = {\ _("Window Title"): 'title', _("Window Role"): 'role', _("Window Name"): 'name', _("Window Class"): 'class', _("Window Type"): 'type', _("Window ID"): 'xid', } symbols = {\ _("And"): '&', _("Or"): '|' } match = None def __init__ (self, entry = None): '''Prepare widget''' super (MatchButton, self).__init__ () self.entry = entry self.match = entry.get_text() self.add (Image (name = gtk.STOCK_ADD, type = ImageStock, size = gtk.ICON_SIZE_BUTTON)) self.connect ("clicked", self.run_edit_dialog) def set_match (self, value): self.match = value self.entry.set_text(value) self.entry.activate() def get_xprop (self, regexp, proc = "xprop"): proc = os.popen (proc) output = proc.readlines () rex = re.compile (regexp) value = "" for line in output: if rex.search (line): m = rex.match (line) value = m.groups () [-1] break return value # Regular Expressions taken from beryl-settings def grab_value (self, widget, value_widget, type_widget): value = "" prefix = self.prefix[type_widget.get_active_text()] if prefix == "type": value = self.get_xprop("^_NET_WM_WINDOW_TYPE\(ATOM\) = _NET_WM_WINDOW_TYPE_(\w+)") value = value.lower().capitalize() elif prefix == "role": value = self.get_xprop("^WM_WINDOW_ROLE\(STRING\) = \"([^\"]+)\"") elif prefix == "name": value = self.get_xprop("^WM_CLASS\(STRING\) = \"([^\"]+)\"") elif prefix == "class": value = self.get_xprop("^WM_CLASS\(STRING\) = \"([^\"]+)\", \"([^\"]+)\"") elif prefix == "title": value = self.get_xprop("^_NET_WM_NAME\(UTF8_STRING\) = ([^\n]+)") if value: list = value.split(", ") value = "" for hex in list: value += "%c" % int(hex, 16) else: value = self.get_xprop("^WM_NAME\(STRING\) = \"([^\"]+)\"") elif prefix == "id": value = self.get_xprop("^xwininfo: Window id: ([^\s]+)", "xwininfo") value_widget.set_text(value) def generate_match (self, t, value, relation, invert): match = "" text = self.match prefix = self.prefix[t] symbol = self.symbols[relation] # check if the current match needs some brackets if len(text) > 0 and text[-1] != ')' and text[0] != '(': match = "(%s)" % text else: match = text if invert: match = "%s %s !(%s=%s)" % (match, symbol, prefix, value) elif len(match) > 0: match = "%s %s %s=%s" % (match, symbol, prefix, value) else: match = "%s=%s" % (prefix, value) self.set_match (match) def _check_entry_value (self, entry, dialog): is_valid = False value = entry.get_text() if value != "": is_valid = True dialog.set_response_sensitive(gtk.RESPONSE_OK, is_valid) def run_edit_dialog (self, widget): '''Run dialog to generate a match''' self.match = self.entry.get_text () dlg = gtk.Dialog (_("Edit match")) dlg.set_position (gtk.WIN_POS_CENTER_ON_PARENT) dlg.set_transient_for (self.get_parent ().get_toplevel ()) dlg.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button (gtk.STOCK_ADD, gtk.RESPONSE_OK).grab_default () dlg.set_response_sensitive(gtk.RESPONSE_OK, False) dlg.set_default_response (gtk.RESPONSE_OK) table = gtk.Table () rows = [] # Type label = Label (_("Type")) type_chooser = gtk.combo_box_new_text () for t in self.prefix: type_chooser.append_text (t) type_chooser.set_active (0) rows.append ((label, type_chooser)) # Value label = Label (_("Value")) box = gtk.HBox () box.set_spacing (5) entry = gtk.Entry () entry.connect ('changed', self._check_entry_value, dlg) button = gtk.Button (_("Grab")) button.connect ('clicked', self.grab_value, entry, type_chooser) box.pack_start (entry, True, True) box.pack_start (button, False, False) rows.append ((label, box)) # Relation label = Label (_("Relation")) relation_chooser = gtk.combo_box_new_text () for relation in self.symbols: relation_chooser.append_text (relation) relation_chooser.set_active (0) rows.append ((label, relation_chooser)) # Invert label = Label (_("Invert")) check = gtk.CheckButton () rows.append ((label, check)) row = 0 for label, widget in rows: table.attach(label, 0, 1, row, row+1, yoptions=0, xpadding=TableX, ypadding=TableY) table.attach(widget, 1, 2, row, row+1, yoptions=0, xpadding=TableX, ypadding=TableY) row += 1 dlg.vbox.pack_start (table) dlg.vbox.set_spacing (5) dlg.show_all () response = dlg.run () dlg.hide () if response == gtk.RESPONSE_OK: t = type_chooser.get_active_text () value = entry.get_text () relation = relation_chooser.get_active_text () invert = check.get_active () self.generate_match (t, value, relation, invert) dlg.destroy () class FileButton (gtk.Button): __gsignals__ = {"changed" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_STRING])} _directory = False _context = None _image = False _path = "" def __init__ (self, context, entry, directory=False, image=False, path=""): gtk.Button.__init__ (self) self._entry = entry self._directory = directory self._context = context self._image = image self._path = path self.set_tooltip_text(_("Browse...")) self.set_image(gtk.image_new_from_stock( gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON)) self.connect('clicked', self.open_dialog) def set_path (self, value): self._path = value self._entry.set_text (value) self._entry.activate () def create_filter(self): filter = gtk.FileFilter () if self._image: filter.set_name (_("Images")) filter.add_pattern ("*.png") filter.add_pattern ("*.jpg") filter.add_pattern ("*.jpeg") filter.add_pattern ("*.svg") else: filter.add_pattern ("*") filter.set_name (_("File")) return filter def check_type (self, filename): if filename.find (".") == -1: return True ext = filename.split (".") [-1] try: mime = mimetypes.types_map [".%s" %ext] except KeyError: return True if self._image: require = FeatureRequirement (self._context, 'imagemime:' + mime) return require.Resolve () return True def update_preview (self, widget): path = widget.get_preview_filename () if path is None or os.path.isdir (path): widget.get_preview_widget ().set_from_file (None) return try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size (path, 128, 128) except gobject.GError: return widget.get_preview_widget ().set_from_pixbuf (pixbuf) def open_dialog (self, widget): b = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) if self._directory: title = _("Open directory...") else: title = _("Open file...") chooser = gtk.FileChooserDialog (title = title, buttons = b) if self._directory: chooser.set_action (gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) else: chooser.set_filter (self.create_filter ()) if self._path and os.path.exists (self._path): chooser.set_filename (self._path) else: chooser.set_current_folder (os.environ.get("HOME")) if self._image: chooser.set_use_preview_label (False) chooser.set_preview_widget (gtk.Image ()) chooser.connect ("selection-changed", self.update_preview) ret = chooser.run () filename = chooser.get_filename () chooser.destroy () if ret == gtk.RESPONSE_OK: if self._directory or self.check_type (filename): self.set_path (filename) # About Dialog # class AboutDialog (gtk.AboutDialog): def __init__ (self, parent): gtk.AboutDialog.__init__ (self) self.set_transient_for (parent) self.set_name (_("CompizConfig Settings Manager")) self.set_version (Version) self.set_comments (_("This is a settings manager for the CompizConfig configuration system.")) self.set_copyright ("Copyright \xC2\xA9 2007-2008 Patrick Niklaus/Christopher Williams/Guillaume Seguin/Quinn Storm") self.set_translator_credits (_("translator-credits")) self.set_authors (["Patrick Niklaus ", "Christopher Williams ", "Guillaume Seguin ", "Quinn Storm "]) self.set_artists (["Andrew Wedderburn ", "Patrick Niklaus ", "Gnome Icon Theme Team"]) if IconTheme.lookup_icon("ccsm", 64, 0): icon = IconTheme.load_icon("ccsm", 64, 0) self.set_logo (icon) self.set_website ("https://launchpad.net/compiz") # Error dialog # class ErrorDialog (gtk.MessageDialog): '''Display an error dialog''' def __init__ (self, parent, message): gtk.MessageDialog.__init__ (self, parent, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE) self.set_position (gtk.WIN_POS_CENTER) self.set_markup (message) self.set_title (_("An error has occured")) self.set_transient_for (parent) self.set_modal (True) self.show_all () self.connect ("response", lambda *args: self.destroy ()) # Warning dialog # class WarningDialog (gtk.MessageDialog): '''Display a warning dialog''' def __init__ (self, parent, message): gtk.MessageDialog.__init__ (self, parent, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO) self.set_position (gtk.WIN_POS_CENTER) self.set_markup (message) self.set_title (_("Warning")) self.set_transient_for (parent) self.connect_after ("response", lambda *args: self.destroy ()) # First run dialog providing a user warning. # class FirstRun (gtk.MessageDialog): '''First run dialog providing a user warning.''' def __init__(self, parent): gtk.MessageDialog.__init__ (self, parent, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK) self.set_position (gtk.WIN_POS_CENTER) title = _("CCSM is an advanced tool. Use with caution.") self.set_markup("%s" % title) message = _("This tool allows you to deeply configure Compiz's settings. Some options may be incompatible with each other. Unless used with care, it is possible to be left with an unusable desktop.") self.format_secondary_markup(message) check_button = gtk.CheckButton(label=_("Show this warning next time?")) check_button.set_active(True) self.vbox.pack_start(check_button, True, True, 2) check_button.show() check_button.connect("toggled", self.callback, "check button 1") self.set_transient_for(parent) self.set_modal(True) self.show_all() self.connect("response", lambda *args: self.destroy ()) def callback(self, widget, data=None): if widget.get_active() == True: if os.path.isfile(ConfFile): os.remove(ConfFile) else: if not os.path.exists(ConfDir): os.mkdir(ConfDir) if os.path.isdir(ConfDir): f = open(ConfFile, "w") f.close() # Plugin Button # class PluginButton (gtk.HBox): __gsignals__ = {"clicked" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []), "activated" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [])} _plugin = None def __init__ (self, plugin, useMissingImage = False): gtk.HBox.__init__(self) self._plugin = plugin image = Image (plugin.Name, ImagePlugin, 32, useMissingImage) label = Label (plugin.ShortDesc, 120) label.connect ('style-set', self.style_set) box = gtk.HBox () box.set_spacing (5) box.pack_start (image, False, False) box.pack_start (label) button = PrettyButton () button.connect ('clicked', self.show_plugin_page) button.set_tooltip_text (plugin.LongDesc) button.add (box) blacklist_plugins = ['core'] if os.getenv('XDG_CURRENT_DESKTOP') == 'Unity': blacklist_plugins.append('unityshell') if plugin.Name not in blacklist_plugins: enable = gtk.CheckButton () enable.set_tooltip_text(_("Enable %s") % plugin.ShortDesc) enable.set_active (plugin.Enabled) enable.set_sensitive (plugin.Context.AutoSort) self._toggled_handler = enable.connect ("toggled", self.enable_plugin) PluginSetting (plugin, enable, self._toggled_handler) self.pack_start (enable, False, False) self.pack_start (button, False, False) self.set_size_request (220, -1) StyleBlock = 0 def style_set (self, widget, previous): if self.StyleBlock > 0: return self.StyleBlock += 1 widget.modify_fg(gtk.STATE_NORMAL, widget.style.text[gtk.STATE_NORMAL]) self.StyleBlock -= 1 def enable_plugin (self, widget): plugin = self._plugin conflicts = plugin.Enabled and plugin.DisableConflicts or plugin.EnableConflicts conflict = PluginConflict (plugin, conflicts) if conflict.Resolve (): plugin.Enabled = widget.get_active () else: widget.handler_block(self._toggled_handler) widget.set_active (plugin.Enabled) widget.handler_unblock(self._toggled_handler) plugin.Context.Write () GlobalUpdater.UpdatePlugins() plugin.Context.UpdateExtensiblePlugins () self.emit ('activated') def show_plugin_page (self, widget): self.emit ('clicked') def filter (self, text, level=FilterAll): found = False if level & FilterName: if (text in self._plugin.Name.lower () or text in self._plugin.ShortDesc.lower ()): found = True if not found and level & FilterLongDesc: if text in self._plugin.LongDesc.lower(): found = True if not found and level & FilterCategory: if text == None \ or (text == "" and self._plugin.Category.lower() == "") \ or (text != "" and text in self._plugin.Category.lower()): found = True return found def get_plugin (self): return self._plugin # Category Box # class CategoryBox(gtk.VBox): _plugins = None _unfiltered_plugins = None _buttons = None _context = None _name = "" _tabel = None _alignment = None _current_cols = 0 _current_plugins = 0 def __init__ (self, context, name, plugins=None, categoryIndex=0): gtk.VBox.__init__ (self) self.set_spacing (5) self._context = context if plugins is not None: self._plugins = plugins else: self._plugins = [] if not plugins: for plugin in context.Plugins.values (): if plugin.Category == name: self._plugins.append (plugin) self._plugins.sort(key=PluginKeyFunc) self._name = name text = name or 'Uncategorized' # Keep unfiltered list of plugins for correct background icon loading self._unfiltered_plugins = self._plugins header = gtk.HBox () header.set_border_width (5) header.set_spacing (10) label = Label ('', -1) label.set_markup ("%s" % _(text)) icon = text.lower ().replace (" ", "_") image = Image (icon, ImageCategory) header.pack_start (image, False, False) header.pack_start (label, False, False) self._table = gtk.Table () self._table.set_border_width (10) # load icons now only for the first 3 categories dontLoadIcons = (categoryIndex >= 3); self._buttons = [] for plugin in self._plugins: button = PluginButton(plugin, dontLoadIcons) self._buttons.append(button) self._alignment = gtk.Alignment (0, 0, 1, 1) self._alignment.set_padding (0, 20, 0, 0) self._alignment.add (gtk.HSeparator ()) self.pack_start (header, False, False) self.pack_start (self._table, False, False) self.pack_start (self._alignment) def show_separator (self, show): children = self.get_children () if show: if self._alignment not in children: self.pack_start (self._alignment) else: if self._alignment in children: self.remove(self._alignment) def filter_buttons (self, text, level=FilterAll): self._plugins = [] for button in self._buttons: if button.filter (text, level=level): self._plugins.append (button.get_plugin()) return bool(self._plugins) def rebuild_table (self, ncols, force = False): if (not force and ncols == self._current_cols and len (self._plugins) == self._current_plugins): return self._current_cols = ncols self._current_plugins = len (self._plugins) children = self._table.get_children () if children: for child in children: self._table.remove(child) row = 0 col = 0 for button in self._buttons: if button.get_plugin () in self._plugins: self._table.attach (button, col, col+1, row, row+1, 0, xpadding=TableX, ypadding=TableY) col += 1 if col == ncols: col = 0 row += 1 self.show_all () def get_buttons (self): return self._buttons def get_plugins (self): return self._plugins def get_unfiltered_plugins (self): return self._unfiltered_plugins # Plugin Window # class PluginWindow(gtk.ScrolledWindow): __gsignals__ = {"show-plugin" : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, [gobject.TYPE_PYOBJECT])} _not_found_box = None _style_block = 0 _context = None _categories = None _viewport = None _boxes = None _box = None def __init__ (self, context, categories=[], plugins=[]): gtk.ScrolledWindow.__init__ (self) self._categories = {} self._boxes = [] self._context = context pool = plugins or list(self._context.Plugins.values()) if len (categories): for plugin in pool: category = plugin.Category if category in categories: if not category in self._categories: self._categories[category] = [] self._categories[category].append(plugin) else: for plugin in pool: category = plugin.Category if not category in self._categories: self._categories[category] = [] self._categories[category].append(plugin) self.props.hscrollbar_policy = gtk.POLICY_NEVER self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC self.connect ('size-allocate', self.rebuild_boxes) self._box = gtk.VBox () self._box.set_spacing (5) self._not_found_box = NotFoundBox () categories = sorted(self._categories, key=CategoryKeyFunc) for (i, category) in enumerate(categories): plugins = self._categories[category] category_box = CategoryBox(context, category, plugins, i) self.connect_buttons (category_box) self._boxes.append (category_box) self._box.pack_start (category_box, False, False) viewport = gtk.Viewport () viewport.connect("style-set", self.set_viewport_style) viewport.set_focus_vadjustment (self.get_vadjustment ()) viewport.add (self._box) self.add (viewport) def connect_buttons (self, category_box): buttons = category_box.get_buttons () for button in buttons: button.connect('clicked', self.show_plugin_page) def set_viewport_style (self, widget, previous): if self._style_block > 0: return self._style_block += 1 widget.modify_bg(gtk.STATE_NORMAL, widget.style.base[gtk.STATE_NORMAL]) self._style_block -= 1 def filter_boxes (self, text, level=FilterAll): found = False for box in self._boxes: found |= box.filter_buttons (text, level) viewport = self.get_child () child = viewport.get_child () if not found: if child is not self._not_found_box: viewport.remove (self._box) viewport.add (self._not_found_box) self._not_found_box.update (text) else: if child is self._not_found_box: viewport.remove (self._not_found_box) viewport.add (self._box) self.queue_resize() self.show_all() def rebuild_boxes (self, widget, request): ncols = request.width / 220 width = ncols * (220 + 2 * TableX) + 40 if width > request.width: ncols -= 1 pos = 0 last_box = None children = self._box.get_children () for box in self._boxes: plugins = box.get_plugins () if len (plugins) == 0: if box in children: self._box.remove(box) else: if last_box: last_box.show_separator (True) if box not in children: self._box.pack_start (box, False, False) self._box.reorder_child (box, pos) box.rebuild_table (ncols) box.show_separator (False) pos += 1 last_box = box def get_categories (self): return list(self._categories) def show_plugin_page (self, widget): plugin = widget.get_plugin () self.emit ('show-plugin', plugin) ./compizconfig/ccsm/po/0000755000004100000410000000000013246301624015276 5ustar www-datawww-data./compizconfig/ccsm/po/fi.po0000644000004100000410000003103513246301623016235 0ustar www-datawww-data# ccsm fi translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Birunthan Mohanathas . # Ilkka Tuohela , 2008. # Timo Jyrinki , 2008. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-10-24 15:43+0200\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Uusi sidoksen %(binding)s arvo lisäosan %(plugin)s toiminnossa %" "(action)s on ristiriidassa lisäosan %(plugin_conflict)s toiminnon " "%(action_conflict)s kanssa.\n" "Haluatko poistaa käytöstä toiminnon %(action_conflict)s lisäosassa " "%(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Poista %(action_conflict)s käytöstä" #, python-format msgid "Don't set %(action)s" msgstr "Älä aseta toimintoa %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Aseta %(action)s joka tapauksessa" msgid "key" msgstr "näppäin" msgid "button" msgstr "painike" msgid "edge" msgstr "reuna" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Yrität käyttää toimintoa %(feature)s, jota yksikään lisäosa ei " "tarjoa.\n" "Haluatko silti käyttää tätä toimintoa?" #, python-format msgid "Use %(feature)s" msgstr "Käytä %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Älä käytä %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Yrität käyttää toimintoa %(feature)s, jonka tarjoaa lisäosa %" "(plugin)s.\n" "Tämä lisäosa ei ole käytössä.\n" "Haluatko ottaa lisäosan %(plugin)s käyttöön, jotta voit käyttää tätä " "toimintoa?" #, python-format msgid "Enable %(plugin)s" msgstr "Ota %(plugin)s käyttöön" #, python-format msgid "Don't enable %(feature)s" msgstr "Älä ota %(feature)s käyttöön" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Jotkin %(plugin)s-liitännäisen %(bindings)s-riippuvuudet ovat " "ristiriidassa muiden liitännäisten kanssa. Haluatko selvittää nämä " "ristiriidat?" msgid "Resolve conflicts" msgstr "Selvitä ristiriidat" msgid "Ignore conflicts" msgstr "Jätä ristiriidat huomiotta" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Lisäosa %(plugin_conflict)s tarjoaa toiminnon %(feature)s, " "jonka tarjoaa myös lisäosa %(plugin)s." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Poista %(plugin_conflict)s käytöstä" #, python-format msgid "Don't enable %(plugin)s" msgstr "Älä ota %(plugin)s käyttöön" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Lisäosa %(plugin_conflict)s on ristiriidassa lisäosan %(plugin)s kanssa." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s vaatii toiminnon %(feature)s, jonka tarjoavat " "seuraavat lisäosat:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Ota nämä lisäosat käyttöön" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vaatii lisäosan %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Ota %(require)s käyttöön" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s tarjoaa %(feature)s ominaisuuden, jota seuraavat " "lisäosat tarvitsevat: %(plugin_list)s." msgid "Disable these plugins" msgstr "Poista nämä lisäosat käytöstä" #, python-format msgid "Don't disable %(plugin)s" msgstr "Älä poista lisäosaa %(plugin)s käytöstä" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "Lisäosa %(plugin)s vaativat seuraavat lisäosat:%(plugin_list)s." msgid "General" msgstr "Yleiset" msgid "Accessibility" msgstr "Esteettömyys" msgid "Desktop" msgstr "Työpöytä" msgid "Extras" msgstr "Ekstrat" msgid "Window Management" msgstr "Ikkunoiden hallinta" msgid "Effects" msgstr "Efektit" msgid "Image Loading" msgstr "Kuvien lataus" msgid "Utility" msgstr "Apuohjelmat" msgid "All" msgstr "Kaikki" msgid "Uncategorized" msgstr "Luokittelematon" msgid "N/A" msgstr "–" msgid "Reset setting to the default value" msgstr "Palauta asetukset oletusarvoihin" msgid "Edit" msgstr "Muokkaa" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Moniriviset asetukset. Muokkaa arvoja kaksoisnapsauttamalla riviä." #, python-format msgid "Edit %s" msgstr "Muokkaa %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ei ole kelvollinen pikavalinta" msgid "Disabled" msgstr "Ei käytössä" msgid "Enabled" msgstr "Käytössä" msgid "Grab key combination" msgstr "Kaappaa näppäinyhdistelmä" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ei ole kelvollinen nappi" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Ensijaisen painikkeen käyttö ilman lisävalitsimia voi estää kaikki " "ensijaisen painikkeen painallukset ja siten tehdä tietokoneen " "käyttökelvottomaksi. Haluatko varmasti liittää painikkeen \"%s\" " "ensisijaiseksi painikkeeksi?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" on kelvoton reunamaski" msgid "None" msgstr "Ei mitään" msgid "CompizConfig Settings Manager" msgstr "Compiz-asetusten hallinta" msgid "Plugin" msgstr "Lisäosa" msgid "Please press the new key combination" msgstr "Anna uusi näppäinyhdistelmä" msgid "Window Title" msgstr "Ikkunan otsikko" msgid "Window Role" msgstr "Ikkunan rooli" msgid "Window Name" msgstr "Ikkunan nimi" msgid "Window Class" msgstr "Ikkunan luokka" msgid "Window Type" msgstr "Ikkunan tyyppi" msgid "Window ID" msgstr "Ikkunan ID" msgid "And" msgstr "ja" msgid "Or" msgstr "tai" msgid "Edit match" msgstr "Muokkaa osumaa" #. Type msgid "Type" msgstr "Tyyppi" #. Value msgid "Value" msgstr "Arvo" msgid "Grab" msgstr "Tartu" #. Relation msgid "Relation" msgstr "Suhde" #. Invert msgid "Invert" msgstr "Käännä" msgid "Browse..." msgstr "Selaa..." msgid "Images" msgstr "Kuvat" msgid "File" msgstr "Tiedosto" msgid "Open directory..." msgstr "Avaa hakemisto..." msgid "Open file..." msgstr "Avaa tiedosto..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Tämä on Compiz-asetusten hallintaohjelma" msgid "translator-credits" msgstr "" "Ilkka Tuohela, 2008\n" "Timo Jyrinki, 2008\n" "\n" "http://gnome.fi/" msgid "An error has occured" msgstr "Tapahtui virhe" msgid "Warning" msgstr "Varoitus" #, python-format msgid "Enable %s" msgstr "Käytä %s" msgid "Filter" msgstr "Suodata" #, python-format msgid "Search %s Plugin Options" msgstr "Etsi lisäosavalintaa %s" msgid "Use This Plugin" msgstr "Käytä tätä lisäosaa" msgid "Search Compiz Core Options" msgstr "Etsi Compiz Core -asetuksista" msgid "Error" msgstr "Virhe" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Syötä suodatin.\n" "Napsauta kuvaa näppäimistöstä valitaksesi etsittävän näppäimen." msgid "Search in..." msgstr "Etsi kohteesta..." #. Options msgid "Short description and name" msgstr "Lyhyt kuvaus ja nimi" msgid "Long description" msgstr "Pitkä kuvaus" msgid "Settings value" msgstr "Asetusten arvo" msgid "Group" msgstr "Ryhmä" msgid "Subgroup" msgstr "Alaryhmä" #. Notebook msgid "Settings" msgstr "Asetukset" msgid "Loading Advanced Search" msgstr "Ladataan tarkennettua hakua" msgid "Add a New Profile" msgstr "Lisää uusi profiili" msgid "Remove This Profile" msgstr "Poista tämä profiili" msgid "Default" msgstr "Oletus" msgid "Profile" msgstr "Profiili" msgid "Import" msgstr "Tuo" msgid "Import a CompizConfig Profile" msgstr "Tuo Compizin asetusprofiili" msgid "Import as..." msgstr "Tuo nimellä..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Tuo Compizin asetusprofiili uutena profiilina" msgid "Export" msgstr "Vie" msgid "Export your CompizConfig Profile" msgstr "Vie Compizin asetusprofiili" msgid "Reset to defaults" msgstr "Palauta oletusasetukset" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Palauta Compizin asetusprofiilin oletusasetukset" msgid "Backend" msgstr "Taustajärjestelmä" msgid "Integration" msgstr "Integrointi" msgid "Enable integration into the desktop environment" msgstr "Ota työpöytäympäristöön sulautuminen käyttöön" msgid "Profiles (*.profile)" msgstr "Profiilit (*.profile)" msgid "All files" msgstr "Kaikki tiedostot" msgid "Save file.." msgstr "Tallenna tiedosto..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Haluatko ohittaa oletusarvoiset valinnat profiilia vietäessä?" msgid "Open file.." msgstr "Avaa tiedosto..." msgid "Enter a profile name" msgstr "Anna profiilin nimi" msgid "Please enter a name for the new profile:" msgstr "Anna uuden profiilin nimi:" msgid "Backend not found." msgstr "Taustajärjestelmää ei löytynyt." #. Auto sort msgid "Automatic plugin sorting" msgstr "Järjestä lisäosat automaattisesti" msgid "Disabled Plugins" msgstr "Poissa käytöstä olevat lisäosat" msgid "Enabled Plugins" msgstr "Käytössä olevat lisäosat" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Haluatko todella poistaa lisäosien automaattisen järjestämisen käytöstä? " "Tämä poistaa myös ristiriitojen käsittelyn käytöstä. Älä tee tätä, jos et " "tiedä varmasti mitä teet." msgid "Add plugin" msgstr "Lisää lisäosa" msgid "Plugin name:" msgstr "Lisäosan nimi:" msgid "Insert plugin name" msgstr "Anna lisäosan nimi" msgid "Preferences" msgstr "Asetukset" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Määrittele käytettävä taustajärjestelmä, profiili ja muita Compizin " "asetusjärjestelmän käyttämiä sisäisiä asetuksia." msgid "About" msgstr "Tietoja" msgid "About CCSM..." msgstr "Tietoja CCSM:sta..." msgid "Profile & Backend" msgstr "Profiili ja taustajärjestelmä" msgid "Plugin List" msgstr "Luettelo lisäosista" msgid "Filter your Plugin list" msgstr "Suodata lisäosaluetteloa" #, python-format msgid "Screen %i" msgstr "Näyttö %i" msgid "Screen" msgstr "Näyttö" msgid "Category" msgstr "Luokka" msgid "Advanced Search" msgstr "Tarkennettu haku" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ei hakutuloksia \n" "\n" "Suodattimesi %s ei vastaa mitään kohtia." msgid "Configure Compiz with CompizConfig" msgstr "Compiz-asetusten tekeminen CompizConfigilla" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Käsitellään mahdollisia ristiriitoja, odota hetki" #~ msgid "Value (%s)" #~ msgstr "Arvo (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Arvo (%(value)s) %(setting)slle" #~ msgid "Actions" #~ msgstr "Toimenpiteet" ./compizconfig/ccsm/po/tr.po0000644000004100000410000003224713246301623016272 0ustar www-datawww-data# translation of ccsm.po to # translation of ccsm-new.po to # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # Serdar Soytetir , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-10-28 12:31+0100\n" "Last-Translator: Emre KURNAZ \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(binding)s bağlayıcısı için belirlenen yeni değer (%(action)s " "davranışını sağlayan ve %(plugin)s eklentisi içersinde bulunan) %" "(action_conflict)sdavranışı ile çakışıyor (%(plugin_conflict)s " "eklentisi içerisindeki).\n" "%(action_conflict)s özelliğini (%(plugin_conflict)s eklentisi " "içerisindeki) pasifleştirmek ister misiniz?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s Eklentisini Pasifleştir" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s Özelliğini Kullanma" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s Özelliğini Herşeye Rağmen Kullan" msgid "key" msgstr "anahtar" msgid "button" msgstr "düğme" msgid "edge" msgstr "kenar" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "%(feature)s özelliğini kullanmaya çalışıyorsunuz ancak bu özellik " "hiçbir eklenti tarafından sağlanmıyor.\n" "Yine de bu özelliği etkinleştirmek ister misiniz?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s Özelliğini Kullan" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s Özelliğini Kullanma" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(feature)s özelliğini kullanmaya çalışıyorsunuz ancak bu özellik %" "(plugin)s eklentisi tarafından sağlanıyor.\n" "Bu eklenti şuanda etkin durumda değil.\n" "%(plugin)s eklentisini etkinleştirerek bu özelliği kullanmak ister " "misiniz?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s Eklentisini Etkinleştir" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s Özelliğini Etkinleştirme" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Eklentinin %(plugin)s bazı %(bindings)s bağlayıcıları diğer " "eklentilerle çakışıyor. Bu çakışmaları çözmek istiyor musunuz?" msgid "Resolve conflicts" msgstr "Çakışmaları çöz" msgid "Ignore conflicts" msgstr "Çakışmaları görmezden gel" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s eklentisi tarafından sağlanan %(feature)s " "özelliği aynı zamanda %(plugin)s eklentisi tarafından da sağlanıyor" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s Eklentisini Pasifleştir" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s Eklentisini Etkinleştirme" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s eklentisi %(plugin)s eklentisi ile " "çakışıyor." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s eklentisi %(feature)s özelliğine gereksinim " "duyuyor, bu özellik şu eklentiler tarafından sağlanıyor:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Bu eklentileri etkinleştir" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s eklentisi %(require)s eklentisine gereksinim " "duyuyor." #, python-format msgid "Enable %(require)s" msgstr "%(require)s Eklentisini Etkinleştir" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s eklentisi tarafından sağlanan %(feature)s " "özelliğine %(plugin_list)seklentileri tarafından gereksinim duyuluyor." msgid "Disable these plugins" msgstr "Bu eklentileri pasifleştir" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s Eklentisini Pasifleştir" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s eklentisine %(plugin_list)s eklentileri tarafından " "gereksinim duyuluyor." msgid "General" msgstr "Genel" msgid "Accessibility" msgstr "Erişebilirlik" msgid "Desktop" msgstr "Masaüstü" msgid "Extras" msgstr "Daha Fazlası" msgid "Window Management" msgstr "Pencere Yönetimi" msgid "Effects" msgstr "Efektler" msgid "Image Loading" msgstr "Resim Yükleme" msgid "Utility" msgstr "Araçlar" msgid "All" msgstr "Tümü" msgid "Uncategorized" msgstr "Kategorilenmemiş" msgid "N/A" msgstr "Mevcut Değil" msgid "Reset setting to the default value" msgstr "Ayarları öntanımlı değerlere döndür" msgid "Edit" msgstr "Düzenle" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Çoklu liste ayarları. Bir stıra çift tıklayarak değerleri " "düzenleyebilirsiniz." #, python-format msgid "Edit %s" msgstr "%s Ögesini Düzenle" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" geçerli bir kısayol değil" msgid "Disabled" msgstr "Pasif" msgid "Enabled" msgstr "Etkin" msgid "Grab key combination" msgstr "Tuşlara basarak kısayolu belirle" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" geçerli bir düğme değil" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Düğme1'i başka bir hızlandırıcı tuş ile kullanmanız farenizin sol düğmesi " "ile tıklama yapamayacaksınız ve tabii ki yapılandırmanız bozulacak. " "Gerçekten \"%s\" düğmesini Düğme1 olarak ayarlamak istediğnizden emin " "misiniz?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" geçerli bir gölgeleme maskesi değil" msgid "None" msgstr "Hiçbiri" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Ayar Yöneticisi" #, fuzzy msgid "Plugin" msgstr "Eklenti Listesi" msgid "Please press the new key combination" msgstr "Lütfen yeni kısayol tuşlarına basın" msgid "Window Title" msgstr "Pencere Başlığı" msgid "Window Role" msgstr "Pencere Rolü" msgid "Window Name" msgstr "Pencere Adı" msgid "Window Class" msgstr "Pencere Sınıfı" msgid "Window Type" msgstr "Pencere Tipi" msgid "Window ID" msgstr "Pencere Kimliği" msgid "And" msgstr "Ve" msgid "Or" msgstr "Veya" msgid "Edit match" msgstr "Eşleşenleri düzenle" #. Type msgid "Type" msgstr "Tip" #. Value msgid "Value" msgstr "Değer" msgid "Grab" msgstr "Yakala" #. Relation msgid "Relation" msgstr "İlişki" #. Invert msgid "Invert" msgstr "Tersine Çevir" #, fuzzy msgid "Browse..." msgstr "Bunun için gözat " msgid "Images" msgstr "Resimler" msgid "File" msgstr "Dosya" msgid "Open directory..." msgstr "Dizin aç..." msgid "Open file..." msgstr "Dosya aç..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Bu, CompizConfig yapılandırma sistemi için bir ayar yöneticisidir." msgid "translator-credits" msgstr "Serdar Soytetir (tulliana@gmail.com)" msgid "An error has occured" msgstr "Bir hata oluştu" msgid "Warning" msgstr "Uyarı" #, python-format msgid "Enable %s" msgstr "%s Ögesini Etkinleştir" msgid "Filter" msgstr "Filtrele" #, python-format msgid "Search %s Plugin Options" msgstr "%s Eklentiye Ait Seçenekleri Ara" msgid "Use This Plugin" msgstr "Bu Eklentiyi Kullan" msgid "Search Compiz Core Options" msgstr "Compiz Core Seçeneklerinde Ara" msgid "Error" msgstr "Hata" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Bir süzgeç giriniz.\n" "Arama için bir tuş kapmak için tuş takımı görüntüsüne basınız." msgid "Search in..." msgstr "Burada ara..." #. Options msgid "Short description and name" msgstr "Kısa tanımlama ve isim" msgid "Long description" msgstr "Uzun tanımlama" msgid "Settings value" msgstr "Ayar değerleri" msgid "Group" msgstr "Küme" msgid "Subgroup" msgstr "Alt küme" #. Notebook msgid "Settings" msgstr "Ayarlar" #, fuzzy msgid "Loading Advanced Search" msgstr "Gelişmiş Arama" msgid "Add a New Profile" msgstr "Yeni bir Profil Ekle" msgid "Remove This Profile" msgstr "Bu Profili Sil" msgid "Default" msgstr "Öntanımlı" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "İçeriye Aktar" msgid "Import a CompizConfig Profile" msgstr "CompizConfig Profilini İçeriye Aktar" msgid "Import as..." msgstr "İçeriye farklı aktar..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Bir CompizConfig Profilini yeni profil olarak içeriye aktar" msgid "Export" msgstr "Dışarıya Aktar" msgid "Export your CompizConfig Profile" msgstr "CompizConfig Profilini Dışarıya Aktar" msgid "Reset to defaults" msgstr "Öntanımlı ayarlara dön" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "CompizConfig Profilinini öntanımlı genel ayarlara döndür" msgid "Backend" msgstr "Arka Uç" msgid "Integration" msgstr "Bütünleşme" msgid "Enable integration into the desktop environment" msgstr "Masaüstü ortamı ile bütünleşmeyi etkinleştir" msgid "Profiles (*.profile)" msgstr "Profiller (*.profile)" msgid "All files" msgstr "Tüm dosyalar" msgid "Save file.." msgstr "Dosyayı kaydet.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Profilinizi kaydederken varsayılan değerleri atlamak ister misiniz?" msgid "Open file.." msgstr "Dosya aç.." msgid "Enter a profile name" msgstr "Bir profil adı girin" msgid "Please enter a name for the new profile:" msgstr "Lütfen yeni profil için bir isim girin:" msgid "Backend not found." msgstr "Arka Uç bulunamadı." #. Auto sort msgid "Automatic plugin sorting" msgstr "Otomatik eklenti sıralaması" msgid "Disabled Plugins" msgstr "Pasif Eklentiler" msgid "Enabled Plugins" msgstr "Etkin Eklentiler" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Otomatik eklenti sıralamasını pasifleştirmek istediğinizden emin misiniz? Bu " "aynı zamanda çakışmaların kontrol edilmesini de engelleyecektir. Bunu sadece " "ne yaptığınızı biliyorsanız yapın." msgid "Add plugin" msgstr "Eklenti Ekle" msgid "Plugin name:" msgstr "Eklenti adı:" msgid "Insert plugin name" msgstr "Eklenti adını girin" msgid "Preferences" msgstr "Tercihler" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "CompizConfig Yapılandırma Sistemi tarafından kullanılan Arka Uç, profil ve " "iç ayarları yapılandırın." msgid "About" msgstr "Hakkında" msgid "About CCSM..." msgstr "CCSM Hakkında..." msgid "Profile & Backend" msgstr "Profil & Arka Uç" msgid "Plugin List" msgstr "Eklenti Listesi" msgid "Filter your Plugin list" msgstr "Eklenti listenizi filtreleyin" #, python-format msgid "Screen %i" msgstr "Ekran %i" msgid "Screen" msgstr "Ekran" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Gelişmiş Arama" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Eşleşme bulunamadı. \n" "\n" " Filtreniz \"%s\" hiçbir öge ile eşleşmedi." msgid "Configure Compiz with CompizConfig" msgstr "Compiz'i, CompizConfig ile yapılandır" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Olası çakışmalar kontrol ediliyor, lütfen bekleyin" #~ msgid "Value (%s)" #~ msgstr "Değer (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s ayarları için değerler (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Kullanılamayan liste tipi %s %s için" #~ msgid "Actions" #~ msgstr "Davranışlar" ./compizconfig/ccsm/po/el.po0000644000004100000410000004240713246301623016244 0ustar www-datawww-data# CompizConfig Greek Translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Δημήτρης (djdoo) , 2007. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.6.0\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-04-20 02:36+0200\n" "Last-Translator: Jim Dusis \n" "Language-Team: Compiz Fusion translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Η νέα τιμή για τον %(binding)s συνδυασμό για την ενέργεια %(action)s " "στο πρόσθετο %(plugin)s συγκρούεται με την ενέργεια %" "(action_conflict)s του %(plugin_conflict)s πρόσθετου.\n" "Θέλετε να απενεργοποιήσετε το %(action_conflict)s στο %" "(plugin_conflict)s πρόσθετο?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Απενεργοποίηση %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Μην Θέσεις %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Θέσε %(action)s οπωσδήποτε" msgid "key" msgstr "πλήκτρο" msgid "button" msgstr "κουμπί" msgid "edge" msgstr "άκρη" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Προσπαθείτε να χρησιμοποιήσετε το χαρακτηριστικό %(feature)s που " "δεν παρέχεται απο κανένα πρόσθετο.\n" "Θέλετε να χρησιμοποιήσετε αυτό το χαρακτηριστικό οπωσδήποτε?" #, python-format msgid "Use %(feature)s" msgstr "Χρήση %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Μη χρήση %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Προσπαθείτε να χρησιμοποιήσετε το χαρακτηριστικό %(feature)s που " "παρέχεται απ το%(plugin)s.\n" " Το πρόσθετο αυτό είναι τώρα απενεργοποιημένο.\n" "Θέλετε να ενεργοποιήσετε το %(plugin)s ωστε το χαρακτηριστικό να " "είναι διαθέσιμο?" #, python-format msgid "Enable %(plugin)s" msgstr "Ενεργοποίηση %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Μην ενεργοποιήσεις %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Ορισμένοι %(bindings)s σύνδεσμοι του Πρόσθετου %(plugin)s " "συγκρούωνται με άλλα πρόσθετα. Θέλετε να επιλυθούν αυτές οι συγκρούσεις?" msgid "Resolve conflicts" msgstr "Επίλυση συγκρούσεων" msgid "Ignore conflicts" msgstr "Αγνόηση συγκρούσεων" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Το πρόσθετο %(plugin_conflict)s παρέχει το χαρακτηριστικό %" "(feature)s το οποίο επίσης παρέχεται απο το %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Απενεργοποίηση %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Μην ενεργοποιήσεις %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Το πρόσθετο %(plugin_conflict)s έρχεται σε σύγκρουση με το %" "(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s απαιτεί το χαρακτηριστικό %(feature)s το οποίο " "παρέχεται απο τα ακόλουθα πρόσθετα:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Ενεργοποίηση συγκεκριμένων προσθέτων" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s απαιτεί το πρόσθετο %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Ενεργοποίηση %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s παρέχει το στοιχείο %(feature)s το οποίο απαιτείται " "απο τα πρόσθετα %(plugin_list)s." msgid "Disable these plugins" msgstr "Απενεργοποίηση αυτών των πρόσθετων" #, python-format msgid "Don't disable %(plugin)s" msgstr "Μην απενεργοποιήσεις %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s απαιτείται απο τα πρόσθετα %(plugin_list)s." msgid "General" msgstr "Γενικά" msgid "Accessibility" msgstr "Προσβασιμότητα" msgid "Desktop" msgstr "Επιφάνεια Εργασίας" msgid "Extras" msgstr "Εξτρά" msgid "Window Management" msgstr "Διαχείριση Παραθύρων" msgid "Effects" msgstr "Εφέ" msgid "Image Loading" msgstr "Φόρτωση Εικόνας" msgid "Utility" msgstr "Χρήσιμες Εφαρμογές" msgid "All" msgstr "Όλα" msgid "Uncategorized" msgstr "Χωρίς Κατηγορία" msgid "N/A" msgstr "Μη Διαθέσιμο" msgid "Reset setting to the default value" msgstr "Επαναφορά της ρύθμισης στη προεπιλεγμένη τιμή" msgid "Edit" msgstr "Επεξεργασία" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Ρυθμίσεις πολλαπλών-λιστών. Κάνωντας διπλό κλικ σε μια σειρά μπορείτε να " "επεξεργαστείτε τις τιμές." #, python-format msgid "Edit %s" msgstr "Επεξεργασία %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" δεν είναι σωστή συντόμευση" msgid "Disabled" msgstr "Απενεργοποιημένο" msgid "Enabled" msgstr "Ενεργοποιημένο" msgid "Grab key combination" msgstr "Πιάσιμο συνδυασμού πλήκτρων" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" δεν είναι σωστό κουμπί" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Η χρησιμοποίηση του Κουμπιού1 χωρίς αλλαγές μπορεί να σταματήσει κάθε " "αριστερο κλικ κ επομένως να καταστρέψει την ρύθμισή σας. Θέλετε πραγματικά " "να θέσετε \"%s\" κουμπί στο Κουμπί1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" δεν είναι σωστή μάσκα άκρης" msgid "None" msgstr "Κανένα" msgid "CompizConfig Settings Manager" msgstr "Διαχειριστής Ρυθμίσεων του Compiz" msgid "Plugin" msgstr "Πρόσθετο" msgid "Please press the new key combination" msgstr "Παρακαλώ χρησιμοποιήστε τον νέο συνδυασμό πλήκτρων" msgid "Window Title" msgstr "Τίτλος Παραθύρου" msgid "Window Role" msgstr "Ρόλος Παραθύρου" msgid "Window Name" msgstr "Όνομα Παραθύρου" msgid "Window Class" msgstr "Κλάση Παραθύρου" msgid "Window Type" msgstr "Τύπος Παραθύρου" msgid "Window ID" msgstr "ID Παραθύρου" msgid "And" msgstr "Και" msgid "Or" msgstr "Ή" msgid "Edit match" msgstr "Επεξεργασία ταιριάσματος" #. Type msgid "Type" msgstr "Τύπος" #. Value msgid "Value" msgstr "Τιμή" msgid "Grab" msgstr "Αρπαγή" #. Relation msgid "Relation" msgstr "Σχέση" #. Invert msgid "Invert" msgstr "Αντίθετο" msgid "Browse..." msgstr "Περιήγηση..." msgid "Images" msgstr "Εικόνες" msgid "File" msgstr "Αρχείο" msgid "Open directory..." msgstr "Άνοιγμα διαδρομής..." msgid "Open file..." msgstr "Άνοιγμα Αρχείου..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Αυτός είναι ο διαχειριστής ρυθμίσεων του συστήματος ρύθμισης του Compiz." msgid "translator-credits" msgstr "" "Δημήτρης(djdoo) , Κώστας(diafanos) " ", Thodo Mitch(Teddy) , " "Dimman Ramone(dimmanramone) , Άρης(Arielis) " ", Μάνος(dark_banishing) " msgid "An error has occured" msgstr "Ένα σφάλμα προέκυψε" msgid "Warning" msgstr "Προσοχή" #, python-format msgid "Enable %s" msgstr "Ενεργοποίηση %s" msgid "Filter" msgstr "Φίλτρο" #, python-format msgid "Search %s Plugin Options" msgstr "Αναζήτηση %s Επιλογών Πρόσθετου" msgid "Use This Plugin" msgstr "Χρησιμοποίηση αυτου του πρόσθετου" msgid "Search Compiz Core Options" msgstr "Αναζήτηση των επιλογών του πυρήνα του Compiz" msgid "Error" msgstr "Σφάλμα" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Εισαγωγή ενός φίλτρου.\n" "Κάντε κλικ στην εικόνα του πληκτρολογίου για να επιλέξετε ένα πλήκτρο για το " "οποίο θα γίνει έρευνα." msgid "Search in..." msgstr "Αναζήτηση στο..." #. Options msgid "Short description and name" msgstr "Σύντομη περιγραφή και όνομα" msgid "Long description" msgstr "Ακριβής περιγραφή" msgid "Settings value" msgstr "Τιμή ρυθμίσεων" msgid "Group" msgstr "Ομάδα" msgid "Subgroup" msgstr "Υποομάδα" #. Notebook msgid "Settings" msgstr "Ρυθμίσεις" msgid "Loading Advanced Search" msgstr "Φόρτωση Προχωρημένης Αναζήτησης" msgid "Add a New Profile" msgstr "Προσθήκη νέου προφίλ" msgid "Remove This Profile" msgstr "Αφαίρεση προφίλ" msgid "Default" msgstr "Προεπιλεγμένο" msgid "Profile" msgstr "Προφίλ" msgid "Import" msgstr "Εισαγωγή" msgid "Import a CompizConfig Profile" msgstr "Εισαγωγή ενός Προφίλ του CompizConfig" msgid "Import as..." msgstr "Εισαγωγή ως..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Εισαγωγή ενός Προφίλ του CompizConfig ως ένα νέο προφίλ" msgid "Export" msgstr "Εξαγωγή" msgid "Export your CompizConfig Profile" msgstr "Εξαγωγή του Προσωπικού σας Προφίλ του CompizConfig" msgid "Reset to defaults" msgstr "Επαναφορά στα Προεπιλεγμένα" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" "Επαναφορά του Προσωπικού σας Προφίλ του CompizConfig στα ολικά προκαθορισμένα" msgid "Backend" msgstr "Κύρια Εφαρμογή" msgid "Integration" msgstr "Eνσωμάτωση" msgid "Enable integration into the desktop environment" msgstr "Ενεργοποίηση ενσωμάτωσης στο περιβάλλον επιφάνειας εργασίας" msgid "Profiles (*.profile)" msgstr "Προφίλ (*.profile)" msgid "All files" msgstr "Όλα τα αρχεία" msgid "Save file.." msgstr "Αποθήκευση Αρχείου.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Θέλετε να αγνοηθούν οι προεπιλεγμένες τιμές των επιλογών όταν εξάγετε το " "προφίλ σας?" msgid "Open file.." msgstr "Άνοιγμα Αρχείου.." msgid "Enter a profile name" msgstr "Εισάγετε όνομα προφίλ" msgid "Please enter a name for the new profile:" msgstr "Εισάγετε όνομα για το καινούργιο προφίλ:" msgid "Backend not found." msgstr "Κύρια Εφαρμογή δεν βρέθηκε." #. Auto sort msgid "Automatic plugin sorting" msgstr "Αυτόματη ταξινόμηση προσθέτων" msgid "Disabled Plugins" msgstr "Απενεργοποιημένα πρόσθετα" msgid "Enabled Plugins" msgstr "Ενεργοποιημένα πρόσθετα" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Θέλετε όντως να απενεργοποιήσετε την αυτόματη ταξινόμηση τον προσθέτων? Αυτό " "θα απενεργοποιήσει επίσης τον χειρισμό διενέξεων. Θα πρέπει να το κάνετε " "αυτό μόνο αν ξέρετε τι κάνετε." msgid "Add plugin" msgstr "Προσθήκη πρόσθετου" msgid "Plugin name:" msgstr "Όνομα πρόσθετου:" msgid "Insert plugin name" msgstr "Εισαγωγή ονόματος πρόσθετου" msgid "Preferences" msgstr "Ιδιότητες" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Ρύθμιση κύριας εφαρμογής, προφίλ και άλλων εσωτερικών ρυθμίσεων που " "χρησιμοποιούνται απο Σύστημα Ρύθμισης του Compiz." msgid "About" msgstr "Σχετικά" msgid "About CCSM..." msgstr "Σχετικά με το CCSM..." msgid "Profile & Backend" msgstr "Προφίλ & Κύρια Εφαρμογή" msgid "Plugin List" msgstr "Λίστα Προσθέτων" msgid "Filter your Plugin list" msgstr "Φιλτράρισμα λίστας πρόσθετων" #, python-format msgid "Screen %i" msgstr "Οθόνη %i" msgid "Screen" msgstr "Οθόνη" msgid "Category" msgstr "Κατηγορία" msgid "Advanced Search" msgstr "Προχωρημένη Αναζήτηση" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Δεν βρέθηκε ταίριασμα. \n" "\n" "Το φίλτρο σας \"%s\" δεν ταιριάζει με κανένα στοιχείο." msgid "Configure Compiz with CompizConfig" msgstr "Ρύθμιση του Compiz με το CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Υπολογισμός πιθανών διενέξεων, παρακαλώ περιμένετε" #~ msgid "Value (%s)" #~ msgstr "Τιμή (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Τιμή (%(value)s) για %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Μη έγκυρος τύπος λίστας %s για %s" #~ msgid "Actions" #~ msgstr "Ενέργειες" #~ msgid "Disable %s" #~ msgstr "Απενεργοποίηση %s" #~ msgid "Name" #~ msgstr "Όνομα" #~ msgid "Screen Edge" #~ msgstr "Άκρη Οθόνης" #~ msgid "Button %i" #~ msgstr "Κουμπί %i" #~ msgid "Edge Button" #~ msgstr "Ακριανό Κουμπί" #~ msgid "On System Bell" #~ msgstr "Στο Καμπανάκι Συστήματος" #~ msgid "Edit Action: %s" #~ msgstr "Επεξεργασία Ενέργειας: %s" #~ msgid "Screen Edges" #~ msgstr "Άκρες Οθόνης" #~ msgid "Reset To Defaults" #~ msgstr "Επαναφορά στις Προεπιλεγμένες Ρυθμίσεις" #~ msgid "PyGtk 2.10.0 or later required" #~ msgstr "PyGtk 2.10.0 ή νεότερο απαιτείται" #~ msgid "Multi-list settings" #~ msgstr "Ρυθμίσεις πολλαπλών λιστών" #~ msgid "Backend & Profile" #~ msgstr "Κύρια Εφαρμογή & Προφίλ" ./compizconfig/ccsm/po/Makevars0000644000004100000410000000345613246301623017001 0ustar www-datawww-data# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = ccsm # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --no-location # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = opencompositing.org. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = http://bugs.opencompositing.org # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = ./compizconfig/ccsm/po/pl.po0000644000004100000410000003321613246301623016255 0ustar www-datawww-data# CompizConfig polish translation. # Copyright (C) 2007 Karol Sikora # This file is distributed under the same license as the ccsm package. # Karol Sikora , 2007. # Mariusz Fik , 2007. # Maciej Warnecki , 2007. # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-04-22 22:29+0200\n" "Last-Translator: Maciej Warnecki \n" "Language-Team: pl_PL \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Nowa wartość %(binding)s skrótu dla akcji %(action)s we wtyczce %" "(plugin)sjest w konflikcie z akcją %(action_conflict)s wtyczki " "%(plugin_conflict)s.\n" "Czy chcesz wyłączyć %(action_conflict)s we wtyczce %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Wyłącz %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nie ustawiaj %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Ustaw %(action)s mimo wszystko" msgid "key" msgstr "klawisz" msgid "button" msgstr "przycisk" msgid "edge" msgstr "krawędź" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Próbujesz użyć funkcji %(feature)s, która nie jest " "udostępniana przez żadną z wtyczek. \n" "Czy chcesz jej użyć mimo to?" #, python-format msgid "Use %(feature)s" msgstr "Użyj %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nie używaj %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Próbujesz użyć funkcji %(feature)s która jest dostępna w %(plugin)" "s.\n" "Ta wtyczka jest aktualnie nieaktywna.\n" "Chcesz włączyć %(plugin)s aby ta funkcja była dostępna?" #, python-format msgid "Enable %(plugin)s" msgstr "Włącz %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nie włączaj %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Niektóre %(bindings)s skróty pluginu %(plugin)s powodują konflikt z " "innymi pluginami. Czy chcesz rozwiązać te konflikty?" msgid "Resolve conflicts" msgstr "Rozwiąż konflikty" msgid "Ignore conflicts" msgstr "Ignoruj konflikty" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Wtyczka %(plugin_conflict)s dostarcza funkcję %(feature)s, " "która jest już dostępna we wtyczce " #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Wyłącz %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nie włączaj %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Wtyczka %(plugin_conflict)s jest w konflikcie z %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s wymaga funkcji %(feature)s, która jest dostępna w " "następujących wtyczkach:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Włącz te wtyczki" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s wymaga wtyczki %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Włącz %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s dostarcza funkcję %(feature)s, która jest wymagana " "przez wtyczki %(plugin_list)s" msgid "Disable these plugins" msgstr "Wyłącz te wtyczki" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nie wyłączaj %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s jest wymagany przez wtyczki %(plugin_list)s" msgid "General" msgstr "Ogólne" msgid "Accessibility" msgstr "Dostępność" msgid "Desktop" msgstr "Pulpit" msgid "Extras" msgstr "Dodatki" msgid "Window Management" msgstr "Zarządzanie oknami" msgid "Effects" msgstr "Efekty" msgid "Image Loading" msgstr "Ładowanie obrazków" msgid "Utility" msgstr "Narzędzia" msgid "All" msgstr "Wszystkie" msgid "Uncategorized" msgstr "Bez kategorii" msgid "N/A" msgstr "Niedostępne" msgid "Reset setting to the default value" msgstr "Przywróć ustawienia domyślne" msgid "Edit" msgstr "Edycja" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Ustawienia wielu list. Możesz kliknąć podwójnie rząd by edytować wartości." #, python-format msgid "Edit %s" msgstr "Edycja %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" nie jest poprawnym skrótem" msgid "Disabled" msgstr "Wyłączone" msgid "Enabled" msgstr "Włączone" msgid "Grab key combination" msgstr "Przechwyć kombinację klawiszy" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" nie jest poprawnym przyciskiem" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Używanie Przycisku1 (LPM) bez modyfikatorów może uniemożliwić klikanie lewym " "przyciskiem myszki i może zakłócić twoją konfigurację. Czy na pewno chcesz " "przyporządkować przycisk \"%s\" do Przycisku1? " #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" nie jest ważną maską brzegów" msgid "None" msgstr "Brak" msgid "CompizConfig Settings Manager" msgstr "Menedżer ustawień CompizConfig" msgid "Plugin" msgstr "Wtyczka" msgid "Please press the new key combination" msgstr "Proszę wcisnąć nową kombinację klawiszy" msgid "Window Title" msgstr "Tytuł okna" msgid "Window Role" msgstr "Rola okna" msgid "Window Name" msgstr "Nazwa okna" msgid "Window Class" msgstr "Klasa okna" msgid "Window Type" msgstr "Typ okna" msgid "Window ID" msgstr "ID okna" msgid "And" msgstr "I" msgid "Or" msgstr "Lub" msgid "Edit match" msgstr "Edytuj układ" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Wartość " msgid "Grab" msgstr "Złap" #. Relation msgid "Relation" msgstr "Relacja" #. Invert msgid "Invert" msgstr "Odwróć" msgid "Browse..." msgstr "Przeglądaj..." msgid "Images" msgstr "Grafiki" msgid "File" msgstr "Plik" msgid "Open directory..." msgstr "Otwórz folder..." msgid "Open file..." msgstr "Otwórz plik..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "To jest menedżer ustawień dla systemu konfiguracji CompizConfig." msgid "translator-credits" msgstr "" "Tłumacze: " " Maciej Warnecki - maciekw5@gmail.com, Karol " "Sikora - elektrrrus@gmail.com, Mariusz Fik - fisiu82@gmail.com, Adam " "Kremienowski - akremen@gmail.com, Jakub Chromiak - silvervoxer@gmail.com " " Błędne " "tłumaczenie lub błędy merytoryczne prosimy zgłaszać tu: htt" "p://forum.compiz.org/showthread.php?s=bbd37bd28a4b508cb52dcc4cdabf889a&t=541" "7 " " Lub ew. na maila (maciekw5@gmail.com jest " "odpowiedni, nie wiem jak z innymi tłumaczami) " " v .01" msgid "An error has occured" msgstr "Wystąpił błąd" msgid "Warning" msgstr "Ostrzeżenie" #, python-format msgid "Enable %s" msgstr "Włącz %s" msgid "Filter" msgstr "Filtr" #, python-format msgid "Search %s Plugin Options" msgstr "Znajdź %s opcję wtyczki" msgid "Use This Plugin" msgstr "Użyj tej wtyczki" msgid "Search Compiz Core Options" msgstr "Znajdź opcję Compiz Core" msgid "Error" msgstr "Błąd" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Wprowadź filtr.\n" "Kliknij na ikonę klawiatury, by wybrać szukany klawisz" msgid "Search in..." msgstr "Szukaj w..." #. Options msgid "Short description and name" msgstr "Krótki opis i nazwa" msgid "Long description" msgstr "Pełny opis" msgid "Settings value" msgstr "Wartość ustawień" msgid "Group" msgstr "Grupa" msgid "Subgroup" msgstr "Podgrupa" #. Notebook msgid "Settings" msgstr "Ustawienia" msgid "Loading Advanced Search" msgstr "Ładuję zaawansowane szukanie" msgid "Add a New Profile" msgstr "Dodaj nowy profil" msgid "Remove This Profile" msgstr "Usuń ten profil" msgid "Default" msgstr "Ustawienia domyślne" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importuj" msgid "Import a CompizConfig Profile" msgstr "Importowanie profilu CompizConfig" msgid "Import as..." msgstr "Importuj jako..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importowanie nowego profilu CompizConfig" msgid "Export" msgstr "Eksportuj" msgid "Export your CompizConfig Profile" msgstr "Eksportuj swój profil CompizConfig" msgid "Reset to defaults" msgstr "Przywróć ustawienia domyślne" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Resetuj swój profil CompizConfig do domyślnych wartości" msgid "Backend" msgstr "Sposób zapisania" msgid "Integration" msgstr "Integracja" msgid "Enable integration into the desktop environment" msgstr "Włącz integrację ze środowiskiem pulpitu" msgid "Profiles (*.profile)" msgstr "Profile (*.profile)" msgid "All files" msgstr "Wszystkie pliki" msgid "Save file.." msgstr "Zapisz plik.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Czy chcesz ominąć domyślne wartości opcji eksportując swój profil?" msgid "Open file.." msgstr "Otwórz plik.." msgid "Enter a profile name" msgstr "Wprowadź nazwę profilu" msgid "Please enter a name for the new profile:" msgstr "Wprowadź nazwę nowego profilu: " msgid "Backend not found." msgstr "Sposób zapisania nie znaleziony." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatyczne sortowanie wtyczek" msgid "Disabled Plugins" msgstr "Wyłączone wtyczki" msgid "Enabled Plugins" msgstr "Włączone wtyczki" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Czy na pewno chcesz wyłączyć automatyczne sortowanie wtyczek? To wyłączy " "także obsługę konfliktów. Powinieneś to robić tylko jeśli wiesz co robisz." msgid "Add plugin" msgstr "Dodaj wtyczkę" msgid "Plugin name:" msgstr "Nazwa wtyczki:" msgid "Insert plugin name" msgstr "Wpisz nazwę wtyczki" msgid "Preferences" msgstr "Ustawienia" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfiguracja sposobu zapisania i profilu używanego przez system konfiguracji " "Compiz'a" msgid "About" msgstr "O..." msgid "About CCSM..." msgstr "O CCSM..." msgid "Profile & Backend" msgstr "Profile i sposób zapisania" msgid "Plugin List" msgstr "Lista wtyczek" msgid "Filter your Plugin list" msgstr "Filtr twojej listy wtyczek" #, python-format msgid "Screen %i" msgstr "Ekran %i" msgid "Screen" msgstr "Ekran" msgid "Category" msgstr "Kategoria" msgid "Advanced Search" msgstr "Zaawansowane szukanie" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nic nie znaleziono. \n" "\n" " Twój filtr \"%s\" nie pasje do żadnych wyników wyszkiwania." msgid "Configure Compiz with CompizConfig" msgstr "Konfiguruj Compiz przy pomocy Menadżera Ustawień CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Obliczanie możliwych konfliktów, proszę czekać" #~ msgid "Value (%s)" #~ msgstr "Wartość (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Wartość (%(value)s) dla %(setting)s: " #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nieprawidłowa wartość %s dla %s" #~ msgid "Actions" #~ msgstr "Akcje" #~ msgid "PyGtk 2.10.0 or later required" #~ msgstr "Wymagany jest PyGtk w wersji 2.10.0 lub wyższej" #, fuzzy #~ msgid "Multi-list settings" #~ msgstr "Lista ustawień" #~ msgid "Name" #~ msgstr "Nazwa" #~ msgid "Screen Edge" #~ msgstr "Róg ekaranu" #, fuzzy #~ msgid "On System Bell" #~ msgstr "Na powiadomienie systemu" #~ msgid "Edit Action: %s" #~ msgstr "Edytuj akcję: %s" #~ msgid "Screen Edges" #~ msgstr "Narożniki ekranu" #~ msgid "Backend & Profile" #~ msgstr "Sposób zapisania i profile" ./compizconfig/ccsm/po/gu.po0000644000004100000410000004164413246301623016261 0ustar www-datawww-data# translation of ccsm.po to Gujarati # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Krunaliben Patel , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-13 05:57+0200\n" "Last-Translator: Jigish Gohil \n" "Language-Team: gist Gujarati team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s ને િનશકૃીય કરો" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s સુયોજીત કરશો નહિં" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s ને ગમે તે રીતે સુયોજીત કરો" msgid "key" msgstr "ચાવી" msgid "button" msgstr "બટન" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "તમે %s લક્ષણ વાપરવાનો પ્રયાસ કરી રહ્યા છો કે જે %s દ્વારા પૂરું પાડવામાં " "આવેલ છે.\n" "આ પ્લગઈન વર્તમાનમાં નિષ્ક્રિય કરેલ છે.\n" "શું તમે %s સક્રિય કરવા ઈચ્છો છો કે જેથી લક્ષણ ઉપલબ્ધ બની જાય?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s વાપરો" #, fuzzy, python-format msgid "Don't use %(feature)s" msgstr "%s સુયોજીત કરશો નહિં" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "તમે %s લક્ષણ વાપરવાનો પ્રયાસ કરી રહ્યા છો કે જે %s દ્વારા પૂરું પાડવામાં " "આવેલ છે.\n" "આ પ્લગઈન વર્તમાનમાં નિષ્ક્રિય કરેલ છે.\n" "શું તમે %s સક્રિય કરવા ઈચ્છો છો કે જેથી લક્ષણ ઉપલબ્ધ બની જાય?" #, fuzzy, python-format msgid "Enable %(plugin)s" msgstr "આ પ્લગઈનો સક્રિય કરો" #, fuzzy, python-format msgid "Don't enable %(feature)s" msgstr "%s સક્રિય કરશો નહિં" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, fuzzy, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "પ્લગઈન %s%s લક્ષણ પૂરું પાડે છે કે જે %s દ્વારા પણ પૂરું પાડવામાં " "આવે છે" #, fuzzy, python-format msgid "Disable %(plugin_conflict)s" msgstr "આ પ્લગઈનો નિષ્ક્રિય કરો" #, fuzzy, python-format msgid "Don't enable %(plugin)s" msgstr "%s સક્રિય કરશો નહિં" #, fuzzy, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "પ્લગઈન %s%s સાથે તકરાય છે." #, fuzzy, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%s માટે %s લક્ષણ જરૂરી છે કે જે નીચેના પ્લગઈનો દ્વારા પૂરું પાડવામાં આવે છે:\n" "%s" msgid "Enable these plugins" msgstr "આ પ્લગઈનો સક્રિય કરો" #, fuzzy, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%s માટે %s પ્લગઈન જરૂરી છે." #, fuzzy, python-format msgid "Enable %(require)s" msgstr "%s સક્રિય કરો" #, fuzzy, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%s%s નું લક્ષણ પૂરું પાડે છે કે જે પ્લગઈનો %s દ્વારા જરૂરી છે." msgid "Disable these plugins" msgstr "આ પ્લગઈનો નિષ્ક્રિય કરો" #, fuzzy, python-format msgid "Don't disable %(plugin)s" msgstr "%s નિષ્ક્રિય કરશો નહિં" #, fuzzy, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%s એ પ્લગઈનો %s દ્વારા જરૂરી છે." msgid "General" msgstr "સામાન્ય" msgid "Accessibility" msgstr "સુલભતા" msgid "Desktop" msgstr "ડેસ્કટોપ" msgid "Extras" msgstr "વધારાનું" msgid "Window Management" msgstr "વિન્ડો વ્યવસ્થાપન" msgid "Effects" msgstr "અસરો" msgid "Image Loading" msgstr "ચિત્ર લાવવાનું" msgid "Utility" msgstr "ઉપયોગીતા" msgid "All" msgstr "બધું" msgid "Uncategorized" msgstr "બિનવર્ગીકૃત" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "સુયોજનને મૂળભૂત કિંમતમાં પુનઃસુયોજીત કરો" msgid "Edit" msgstr "ફેરફાર" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "વિવિધ-યાદી સુયોજનો. તમે કિંમતોમાં ફેરફાર કરવા માટે હરોળ પર બમણું-ક્લિક કરી શકો છો." #, python-format msgid "Edit %s" msgstr "ફેરફાર %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" એ માન્ય ટૂંકાણ નથી" #, fuzzy msgid "Disabled" msgstr "%s નિષ્ક્રિય કરો" #, fuzzy msgid "Enabled" msgstr "%s સક્રિય કરો" msgid "Grab key combination" msgstr "કી જોડાણ મેળવો" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" એ માન્ય બટન નથી" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Button1 ને સુધારકો સાથે વાપરવાનું કોઈપણ ડાબા ક્લિકને અટકાવી શકે છે અને તેથી તમારું " "રૂપરેખાંકન ભાંગી જશે. શું તમે ખરેખર \"%s\" બટનને Button1 માં સુયોજીત કરવા માંગો છો?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" એ માન્ય બાજુ માસ્ક નથી" msgid "None" msgstr "કંઈ નહિં" msgid "CompizConfig Settings Manager" msgstr "CompizConfig સુયોજનો વ્યવસ્થાપક" #, fuzzy msgid "Plugin" msgstr "પ્લગઈન યાદી" msgid "Please press the new key combination" msgstr "મહેરબાની કરીને નવું કી જોડાણ દબાવો" msgid "Window Title" msgstr "વિન્ડો શીર્ષક" msgid "Window Role" msgstr "વિન્ડો ભૂમિકા" msgid "Window Name" msgstr "વિન્ડો નામ" msgid "Window Class" msgstr "વિન્ડો વર્ગ" msgid "Window Type" msgstr "વિન્ડો પ્રકાર" msgid "Window ID" msgstr "વિન્ડો ID" msgid "And" msgstr "અને" msgid "Or" msgstr "અથવા" msgid "Edit match" msgstr "ફેરફાર જોડણી" #. Type msgid "Type" msgstr "પ્રકાર" #. Value #, fuzzy msgid "Value" msgstr "કિંમત (%s)" msgid "Grab" msgstr "મેળવો" #. Relation #, fuzzy msgid "Relation" msgstr "સંકલન" #. Invert msgid "Invert" msgstr "ઊંધુ" #, fuzzy msgid "Browse..." msgstr "માટે શોધો " msgid "Images" msgstr "ચિત્રો" msgid "File" msgstr "ફાઈલ" #, fuzzy msgid "Open directory..." msgstr "ફાઈલ ખોલો..." #, fuzzy msgid "Open file..." msgstr "ફાઈલ ખોલો..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "આ CompizConfig રૂપરેખાંકન સિસ્ટમ માટે સુયોજનો વ્યવસ્થાપક છે." msgid "translator-credits" msgstr "અંકિત પટેલ " msgid "An error has occured" msgstr "ભૂલ ઉદ્ભવી" msgid "Warning" msgstr "ચેતવણી" #, python-format msgid "Enable %s" msgstr "%s સક્રિય કરો" msgid "Filter" msgstr "ગાળક" #, python-format msgid "Search %s Plugin Options" msgstr "%s પ્લગઈન વિકલ્પો શોધો" msgid "Use This Plugin" msgstr "આ પ્લગઈન વાપરો" msgid "Search Compiz Core Options" msgstr "Compiz મૂળ વિકલ્પો શોધો" msgid "Error" msgstr "ક્ષતિ" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "માં શોધો..." #. Options msgid "Short description and name" msgstr "ટૂંકુ વર્ણન અને નામ" msgid "Long description" msgstr "લાંબુ વર્ણન" msgid "Settings value" msgstr "સુયોજનો કિંમત" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "સુયોજનો" #, fuzzy msgid "Loading Advanced Search" msgstr "અદ્યતન શોધ" msgid "Add a New Profile" msgstr "નવી રૂપરેખા ઉમેરો" msgid "Remove This Profile" msgstr "આ રૂપરેખા દૂર કરો" msgid "Default" msgstr "મૂળભૂત" msgid "Profile" msgstr "રૂપરેખા" msgid "Import" msgstr "આયાત કરો" msgid "Import a CompizConfig Profile" msgstr "CompizConfig રૂપરેખા આયાત કરો" #, fuzzy msgid "Import as..." msgstr "આયાત કરો" #, fuzzy msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig રૂપરેખા આયાત કરો" msgid "Export" msgstr "નિકાસ કરો" msgid "Export your CompizConfig Profile" msgstr "તમારી CompizConfig રૂપરેખાની નિકાસ કરો" #, fuzzy msgid "Reset to defaults" msgstr "મૂળભૂતોમાં પુનઃસુયોજીત કરો" #, fuzzy msgid "Reset your CompizConfig Profile to the global defaults" msgstr "તમારી CompizConfig રૂપરેખાની નિકાસ કરો" msgid "Backend" msgstr "પાશ્વભાગ" msgid "Integration" msgstr "સંકલન" msgid "Enable integration into the desktop environment" msgstr "ડેસ્કટોપ પર્યાવરણમાં સંકલન સક્રિય કરો" msgid "Profiles (*.profile)" msgstr "રૂપરેખાઓ (*.profile)" msgid "All files" msgstr "બધી ફાઈલો" msgid "Save file.." msgstr "ફાઈલ સંગ્રહો..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "જ્યારે તમે તમારી રૂપરેખાની નિકાસ કરી રહ્યા હોય ત્યારે શું તમે મૂળભૂત વિકલ્પ કિંમતો અવગણવા " "માંગો છો?" msgid "Open file.." msgstr "ફાઈલ ખોલો..." msgid "Enter a profile name" msgstr "રૂપરેખા નામ દાખલ કરો" msgid "Please enter a name for the new profile:" msgstr "મહેરબાની કરીને નવી રૂપરેખા માટેનું નામ દાખલ કરો:" msgid "Backend not found." msgstr "પાશ્વભાગ મળ્યું નહિં." #. Auto sort msgid "Automatic plugin sorting" msgstr "આપોઆપ પ્લગઈન ક્રમમાં ગોઠવવાનું" #, fuzzy msgid "Disabled Plugins" msgstr "આ પ્લગઈનો નિષ્ક્રિય કરો" #, fuzzy msgid "Enabled Plugins" msgstr "આ પ્લગઈનો સક્રિય કરો" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "શું તમે ખરેખર આપોઆપ પ્લગઈન ક્રમમાં ગોઠવવાનું નિષ્ક્રિય કરવા માંગો છો? આ તકરાર નિયંત્રિત " "કરવાનું પણ નિષ્ક્રિય કરશે. તમારે આવું માત્ર ત્યારે જ કરવું જોઈએ જો તમને ખબર હોય કે તમે શું કરી " "રહ્યા છો." msgid "Add plugin" msgstr "પ્લગઈન ઉમેરો" msgid "Plugin name:" msgstr "પ્લગઈન નામ:" msgid "Insert plugin name" msgstr "પ્લગઈન નામ દાખલ કરો" msgid "Preferences" msgstr "પસંદગીઓ" #, fuzzy msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Compiz રૂપરેખાંકન સિસ્ટમ દ્વારા વાપરવામાં આવતા પાશ્વભાગ અને રૂપરેખા રૂપરેખાંકિત કરો." msgid "About" msgstr "વિશે" msgid "About CCSM..." msgstr "CCSM વિશે..." msgid "Profile & Backend" msgstr "રૂપરેખા & પાશ્વભાગ" msgid "Plugin List" msgstr "પ્લગઈન યાદી" msgid "Filter your Plugin list" msgstr "તમારી પ્લગઈન યાદી ગાળો" #, python-format msgid "Screen %i" msgstr "સ્ક્રીન %i" msgid "Screen" msgstr "સ્ક્રીન" msgid "Category" msgstr "વર્ગ" msgid "Advanced Search" msgstr "અદ્યતન શોધ" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "કંઈ બંધબેસતું મળ્યું નહિં. \n" "\n" " તમારા ગાળક \"%s\" એ કોઈ જોડણી વસ્તુ શોધી નહિં." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "શક્ય તકરારો ગણી રહ્યા છીએ, મહેરબાની કરીને રાહ જુઓ" #~ msgid "Value (%s)" #~ msgstr "કિંમત (%s)" #, fuzzy #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "કિંમત (%s) એ %s માટે:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "અનિયંત્રિત યાદી પ્રકાર %s એ %s માટે" #~ msgid "Actions" #~ msgstr "ક્રિયાઓ" #~ msgid "Name" #~ msgstr "નામ" #~ msgid "Screen Edge" #~ msgstr "સ્ક્રીન બાજુ" #~ msgid "Button %i" #~ msgstr "બટન %i" #~ msgid "Edge Button" #~ msgstr "બાજુ બટન" #~ msgid "On System Bell" #~ msgstr "સિસ્ટમ ઘંટડી પર" #~ msgid "Edit Action: %s" #~ msgstr "ફેરફાર ક્રિયા: %s" #~ msgid "Screen Edges" #~ msgstr "સ્ક્રીન બાજુઓ" #~ msgid "Backend & Profile" #~ msgstr "પાશ્વભાગ & રૂપરેખા" ./compizconfig/ccsm/po/bg.po0000644000004100000410000003045013246301623016227 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-02-06 11:24+0530\n" "PO-Revision-Date: 2009-05-20 14:34+0200\n" "Last-Translator: Svetoslav Stefanov \n" "Language-Team: Svetoslav Stefanov \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Bulgarian\n" "X-Poedit-Country: BULGARIA\n" "X-Poedit-SourceCharset: utf-8\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s in plugin %(plugin)s conflicts with the action %(action_conflict)s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "Изключване на %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Да не се задава %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Задаване на %(action)s въпреки това" msgid "key" msgstr "ключ" msgid "button" msgstr "клавиш" msgid "edge" msgstr "край" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "Използване на %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Да не се използва %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by %(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "Включване на %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Да не се включва %(feature)s" #, python-format msgid "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "Разрешаване на конфликтите" msgid "Ignore conflicts" msgstr "Игнориране на конфликтите" #, python-format msgid "Plugin %(plugin_conflict)s provides feature %(feature)s which is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Изключване на %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Да не се включва %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Приставката %(plugin_conflict)s е в конфликт с %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "Включване на тези приставки" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s изисква приставката %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Включване на %(require)s" #, python-format msgid "%(plugin)s provides the feature %(feature)s which is required by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "Изключване на тези приставки" #, python-format msgid "Don't disable %(plugin)s" msgstr "Да не се изключва %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s е изискуем от приставките %(plugin_list)s." msgid "General" msgstr "Общи" msgid "Accessibility" msgstr "Достъпност" msgid "Desktop" msgstr "Работен плот" msgid "Extras" msgstr "Екстри" msgid "Window Management" msgstr "Управление на прозорци" msgid "Effects" msgstr "Ефекти" msgid "Image Loading" msgstr "Зареждане на изображение" msgid "Utility" msgstr "Инструмент" msgid "All" msgstr "Всички" msgid "Uncategorized" msgstr "Без категория" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Връщане на стойността по подразбиране" msgid "Edit" msgstr "Редактиране" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "Редактира %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" не е валидна препратка" msgid "Disabled" msgstr "Изключено" msgid "Enabled" msgstr "Включено" msgid "Grab key combination" msgstr "Прихващане на клавишна комбинация" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" не е валиден бутон" #, python-format msgid "Using Button1 without modifiers can prevent any left click and thus break your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "Без" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Settings Manager" msgid "Plugin" msgstr "Приставка" msgid "Please press the new key combination" msgstr "Моля натиснете новата клавишна комбинация" msgid "Window Title" msgstr "Заглавие на прозореца" msgid "Window Role" msgstr "Роля на прозореца" msgid "Window Name" msgstr "Име на прозореца" msgid "Window Class" msgstr "Клас на прозореца" msgid "Window Type" msgstr "Тип на прозореца" msgid "Window ID" msgstr "ID на прозореца" msgid "And" msgstr "И" msgid "Or" msgstr "Или" msgid "Edit match" msgstr "Зачитане на регистъра" #. Type msgid "Type" msgstr "Тип" #. Value msgid "Value" msgstr "Стойност" msgid "Grab" msgstr "Прихващане" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "Обръщане" msgid "Browse..." msgstr "Преглед..." msgid "Images" msgstr "Изображения" msgid "File" msgstr "Файл" msgid "Open directory..." msgstr "Отваряне на директория..." msgid "Open file..." msgstr "Отваряне на файл..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "Светослав Стефанов " msgid "An error has occured" msgstr "Възникна грешка" msgid "Warning" msgstr "Предупреждение" #, python-format msgid "Enable %s" msgstr "Включване на %s" msgid "Filter" msgstr "Филтър" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "Използване на тази приставка" msgid "Search Compiz Core Options" msgstr "" msgid "Error" msgstr "Грешка" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "Търсене в..." #. Options msgid "Short description and name" msgstr "Кратко описание и име" msgid "Long description" msgstr "Дълго описание" msgid "Settings value" msgstr "Стойност на настройките" msgid "Group" msgstr "Група" msgid "Subgroup" msgstr "Подгрупа" #. Notebook msgid "Settings" msgstr "Настройки" msgid "Loading Advanced Search" msgstr "Зареждане на разширено търсене" msgid "Add a New Profile" msgstr "Добавяне на нов профил" msgid "Remove This Profile" msgstr "Премахване на този профил" msgid "Default" msgstr "Стандартни" msgid "Profile" msgstr "Профил" msgid "Import" msgstr "Внасяне" msgid "Import a CompizConfig Profile" msgstr "Внасяне на профил на CompizConfig" msgid "Import as..." msgstr "Внасяне като..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Внасяне на профил на CompizConfig като нов " msgid "Export" msgstr "Изнасяне" msgid "Export your CompizConfig Profile" msgstr "Изнасяне на вашия профил на CompizConfig" msgid "Reset to defaults" msgstr "Върни висящите опции" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Върнете своя профил на CompizConfig към глобалните стандартни настройки" msgid "Backend" msgstr "Контрол за Dbus" msgid "Integration" msgstr "Интеграция" msgid "Enable integration into the desktop environment" msgstr "Включване на интегрирането в работната среда" msgid "Profiles (*.profile)" msgstr "Профили (*.profile)" msgid "All files" msgstr "Всички файлове" msgid "Save file.." msgstr "Запазване на файл..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Желаете ли приизнасянето на вашия профил да бъдат пропуснати стандартните стойности на настройките?" msgid "Open file.." msgstr "Отваряне на файл..." msgid "Enter a profile name" msgstr "Въведете име на профила" msgid "Please enter a name for the new profile:" msgstr "Моля въведете име за новия профил:" msgid "Backend not found." msgstr "Файлът не е намерен" #. Auto sort msgid "Automatic plugin sorting" msgstr "Автоматично сортиране на приставките" msgid "Disabled Plugins" msgstr "Изключени приставки" msgid "Enabled Plugins" msgstr "Включени приставки" msgid "Do you really want to disable automatic plugin sorting? This will also disable conflict handling. You should only do this if you know what you are doing." msgstr "" msgid "Add plugin" msgstr "Добавяне на приставка" msgid "Plugin name:" msgstr "Име на приставката:" msgid "Insert plugin name" msgstr "Въведете име на приставката" msgid "Preferences" msgstr "Предпочитания" msgid "Configure the backend, profile and other internal settings used by the Compiz Configuration System." msgstr "" msgid "About" msgstr "Относно" msgid "About CCSM..." msgstr "Относно CCSM..." msgid "Profile & Backend" msgstr "Профил по подразбиране:" msgid "Plugin List" msgstr "Списък с приставки" msgid "Filter your Plugin list" msgstr "Филтрирайте своя списък с приставки" #, python-format msgid "Screen %i" msgstr "Екран %i" msgid "Screen" msgstr "Прожекция" msgid "Category" msgstr "Категория" msgid "Advanced Search" msgstr "Разширено търсене" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Не са открити съвпадения. \n" "\n" " Филтърът ви \"%s\" не съвпада с нищо." msgid "Configure Compiz with CompizConfig" msgstr "Настройка на Compiz с помощта на CompizConfig" msgid "Computing possible conflicts, please wait" msgstr "Изчисляване на възможните конфликти, моля изчакайте" msgid "Value (%s)" msgstr "Стойност (%s)" msgid "Value (%(value)s) for %(setting)s" msgstr "Стойност (%(value)s) за %(setting)s" msgid "Unhandled list type %s for %s" msgstr "" ./compizconfig/ccsm/po/fr.po0000644000004100000410000003145613246301623016255 0ustar www-datawww-data# CompizConfig French translation # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # Sylvain Debray , 2007. # Tristan RABLAT , 2007. # Guillaume Seguin . msgid "" msgstr "" "Project-Id-Version: fr-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-03 14:27+0200\n" "Last-Translator: Florent \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "La nouvelle valeur assignée au raccourci %(binding)s pour l'action %" "(action)s dans l'extension %(plugin)s est en conflit avec " "l'action %(action_conflict)s de l'extension %(plugin_conflict)s.\n" "Voulez vous désactiver l'action %(action_conflict)s de l'extension " "%(plugin_conflict)s ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Désactiver %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ne pas définir %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Définir %(action)s malgré tout" msgid "key" msgstr "clé" msgid "button" msgstr "bouton" msgid "edge" msgstr "bordure" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Vous essayez d'utiliser la fonctionnalité %(feature)s qui n'est " "fournie par aucune extension.\n" "Voulez vous tout de même utiliser cette fonctionnalité?" #, python-format msgid "Use %(feature)s" msgstr "Utiliser %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ne pas utiliser %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Vous essayez d'activer la fonctionnalité %(feature)s qui est fournie " "par %(plugin)s. Cette extension est actuellement désactivée.\n" " Voulez vous activer %(plugin)s pour que la fonctionnalité soit " "disponible?" #, python-format msgid "Enable %(plugin)s" msgstr "Activer \"%(plugin)s\"" #, python-format msgid "Don't enable %(feature)s" msgstr "Ne pas activer %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Quelques %(bindings)s fonctions du Plugin %(plugin)s sont en conflit " "avec d'autres plugins. Voulez-vous résoudre ces conflits ?" msgid "Resolve conflicts" msgstr "Résoudre les conflits" msgid "Ignore conflicts" msgstr "Ignorer les conflits" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "L'extension %(plugin_conflict)s fournit la fonctionnalité %" "(feature)s qui est aussi fournie par %(plugin)s." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Désactiver %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ne pas activer %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "L'extension %(plugin_conflict)s est en conflit avec %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requiert la fonctionnalité %(feature)s qui est " "fournie par les extensions suivantes:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activer ces extensions" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requiert l'extension %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activer %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s fournit la fonctionnalité %(feature)s qui est " "requise par les extensions %(plugin_list)s." msgid "Disable these plugins" msgstr "Désactiver ces extensions" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ne pas désactiver %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s est requis par les extensions %(plugin_list)s." msgid "General" msgstr "Général" msgid "Accessibility" msgstr "Accessibilité" msgid "Desktop" msgstr "Bureau" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gestion des fenêtres" msgid "Effects" msgstr "Effets" msgid "Image Loading" msgstr "Chargement d'Image" msgid "Utility" msgstr "Utilitaire" msgid "All" msgstr "Tous" msgid "Uncategorized" msgstr "Sans catégorie" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "Revenir à la configuration par défaut" msgid "Edit" msgstr "Éditer" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Configuration multi-liste. Vous pouvez double-cliquer sur une ligne pour " "éditer la valeur." #, python-format msgid "Edit %s" msgstr "Éditer %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" n'est pas un raccourci valide" msgid "Disabled" msgstr "Désactivé" msgid "Enabled" msgstr "Activé" msgid "Grab key combination" msgstr "Saisir une combinaison de touches" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" n'est pas un bouton valide" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Utiliser Button1 sans modificateurs interceptera tous les clics gauches et " "risque donc de casser votre configuration. Voulez vous vraiment associer le " "bouton \"%s\" à Button1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" n'est pas un masque d'arrête valide" msgid "None" msgstr "Aucun" msgid "CompizConfig Settings Manager" msgstr "Gestionnaire de Configuration CompizConfig" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Veuillez appuyer sur la nouvelle combinaison de touches" msgid "Window Title" msgstr "Titre de la fenêtre" msgid "Window Role" msgstr "Rôle de la fenêtre" msgid "Window Name" msgstr "Nom de la fenêtre" msgid "Window Class" msgstr "Classe de la fenêtre" msgid "Window Type" msgstr "Type de fenêtre" msgid "Window ID" msgstr "ID de la fenêtre" msgid "And" msgstr "Et" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Modifier l'équivalence" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Valeur" msgid "Grab" msgstr "Saisir" #. Relation msgid "Relation" msgstr "Relation" #. Invert msgid "Invert" msgstr "Inverser" msgid "Browse..." msgstr "Parcourir..." msgid "Images" msgstr "Images" msgid "File" msgstr "Fichier" msgid "Open directory..." msgstr "Ouvrir un dossier..." msgid "Open file..." msgstr "Ouvrir un fichier..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Ceci est un gestionnaire de configuration pour le système de configuration " "CompizConfig" msgid "translator-credits" msgstr "Crédits Traducteurs" msgid "An error has occured" msgstr "Une erreur est survenue" msgid "Warning" msgstr "Attention" #, python-format msgid "Enable %s" msgstr "Activer %s" msgid "Filter" msgstr "Filtre" #, python-format msgid "Search %s Plugin Options" msgstr "Chercher les options de l'extension %s" msgid "Use This Plugin" msgstr "Utiliser cette Extension" msgid "Search Compiz Core Options" msgstr "Chercher les options du Noyau de Compiz (compiz-core)" msgid "Error" msgstr "Erreur" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Entrez un filtre.\n" "Cliquez sur l'image du clavier pour saisir une touche pour laquelle chercher." msgid "Search in..." msgstr "Chercher dans..." #. Options msgid "Short description and name" msgstr "Description courte et nom" msgid "Long description" msgstr "Description longue" msgid "Settings value" msgstr "Valeurs de réglage" msgid "Group" msgstr "Groupe" msgid "Subgroup" msgstr "Sous-groupe" #. Notebook msgid "Settings" msgstr "Réglage" msgid "Loading Advanced Search" msgstr "Chargement de la Recherche Avancée" msgid "Add a New Profile" msgstr "Ajouter un nouveau profil" msgid "Remove This Profile" msgstr "Effacer ce profil" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importer" msgid "Import a CompizConfig Profile" msgstr "Importer un profil CompizConfig" msgid "Import as..." msgstr "Importer en tant que..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importer un profil CompizConfig" msgid "Export" msgstr "Exporter" msgid "Export your CompizConfig Profile" msgstr "Exporter votre profil CompizConfig" msgid "Reset to defaults" msgstr "Revenir au défaut" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Initialiser votre profil CompizConfig avec les paramètres par défaut" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Intégration" msgid "Enable integration into the desktop environment" msgstr "Activer l'intégration avec l'environnement du bureau" msgid "Profiles (*.profile)" msgstr "Profils (*.profile)" msgid "All files" msgstr "Tous les fichiers" msgid "Save file.." msgstr "Sauvegarder..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Désirez vous ommettre les valeurs d'option par défaut en exportant votre " "profil?" msgid "Open file.." msgstr "Ouvrir un fichier..." msgid "Enter a profile name" msgstr "Entrer un nom pour le profil" msgid "Please enter a name for the new profile:" msgstr "Merci d'entrer un nom pour le nouveau profil:" msgid "Backend not found." msgstr "Backend non trouvé." #. Auto sort msgid "Automatic plugin sorting" msgstr "Tri automatique des extension" msgid "Disabled Plugins" msgstr "Extensions désactivées" msgid "Enabled Plugins" msgstr "Extensions activées" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Voulez vous vraiment désactiver le tri automatique des extensions? Cela " "désactivera également la gestion des conflits. Vous devriez seulement faire " "cela si vous êtes sûr de ce que vous faites." msgid "Add plugin" msgstr "Ajouter une extension" msgid "Plugin name:" msgstr "Nom de l'extension:" msgid "Insert plugin name" msgstr "Insérer le nom de l'extension" msgid "Preferences" msgstr "Préférences" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configurer le backend, le profil et d'autres réglages internes utilisés par " "le Système de Configuration de Compiz." msgid "About" msgstr "À propos" msgid "About CCSM..." msgstr "À propos de CCSM..." msgid "Profile & Backend" msgstr "Profil & Backend" msgid "Plugin List" msgstr "Liste des Extensions" msgid "Filter your Plugin list" msgstr "Filtrer votre liste d'extensions" #, python-format msgid "Screen %i" msgstr "Écran %i" msgid "Screen" msgstr "Écran" msgid "Category" msgstr "Catégorie" msgid "Advanced Search" msgstr "Recherche avancée" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Pas de concordance trouvée.

" "Votre filtre \"%s\" ne correspond à aucun objet." msgid "Configure Compiz with CompizConfig" msgstr "Configurer Compiz avec CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Recherche d'éventuels conflits, veuillez patienter" #~ msgid "Value (%s)" #~ msgstr "Valeur (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valeur (%(value)s) pour %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Liste de type %s non supportée pour %s" #~ msgid "Actions" #~ msgstr "Actions" ./compizconfig/ccsm/po/ca.po0000644000004100000410000003015313246301623016222 0ustar www-datawww-data# CompizConfig ca translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Gustau L. Castells (Karasu) , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz Settings Manager 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-28 16:29+0100\n" "Last-Translator: Rafa Ramírez \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" "X-Poedit-Language: Catalan\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "El nou valor per la vinculació %(binding)s per a l'acció %(action)s " "en el connector %(plugin)s entra en conflicte amb l'acció %" "(action_conflict)s del connector %(plugin_conflict)s.\n" "Vols desactivar %(action_conflict)s en el connector %" "(plugin_conflict)s ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Desactiva %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "No marquis %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Marca %(action)s de totes maneres" msgid "key" msgstr "clau" msgid "button" msgstr "botó" msgid "edge" msgstr "cantonada" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Estàs intentant usar la característica %(feature)s que és " "proporcionada per %(plugin)s.\n" "Aquest connector està desactivat.\n" "Vols activar %(plugin)s per poder usar la característica ?" #, python-format msgid "Use %(feature)s" msgstr "Emprar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "No emprar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Estàs intentant usar la característica %(feature)s que és " "proporcionada per %(plugin)s.\n" "Aquest connector està desactivat.\n" "Vols activar %(plugin)s per poder usar la característica ?" #, python-format msgid "Enable %(plugin)s" msgstr "Activa %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "No activar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "Resoldre conflictes" msgid "Ignore conflicts" msgstr "Ignorar conflictes" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "El connector %(plugin_conflict)s proporciona la característica %" "(feature)s que també és proporcionada per %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desactiva %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "No activis %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "El connector %(plugin_conflict)s entra en conflicte amb %(plugin)" "s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requereix la característica %(feature)s que es " "proporcionada pels següents connectors:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activa aquests connectors" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requereix el connector %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activa %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s proporciona la característica %(feature)s que és " "requerida per els connectors %(plugin_list)s." msgid "Disable these plugins" msgstr "Desactiva aquests connectors" #, python-format msgid "Don't disable %(plugin)s" msgstr "No desactivis %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s es requerit pels connectors %(plugin_list)s." msgid "General" msgstr "General" msgid "Accessibility" msgstr "Accessibilitat" msgid "Desktop" msgstr "Escriptori" msgid "Extras" msgstr "Extres" msgid "Window Management" msgstr "Gestió de Finestres" msgid "Effects" msgstr "Efectes" msgid "Image Loading" msgstr "Càrrega d'imatges" msgid "Utility" msgstr "Utilitats" msgid "All" msgstr "Tot" msgid "Uncategorized" msgstr "Sense classificar" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Reseteja al seu valor per defecte" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Paràmetres multillista. Pots fer un doble clic a una fila per editar els " "valors." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" no és una drecera vàlida" msgid "Disabled" msgstr "Desactivat" msgid "Enabled" msgstr "Activat" msgid "Grab key combination" msgstr "Captura combinació de tecles" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" no es un botó vàlid" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usar el Botó1 sense modificadors pot prevenir qualsevol clic esquerre i " "trencar la configuració. Estàs segur que vols posar el botó \"%s\" al Botó1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" no és una màscara de vora vàlida" msgid "None" msgstr "Cap" msgid "CompizConfig Settings Manager" msgstr "Editor de la configuració de Compiz" #, fuzzy msgid "Plugin" msgstr "Llista de Connectors" msgid "Please press the new key combination" msgstr "Pressiona la nova combinació de tecles" msgid "Window Title" msgstr "Títol de la finestra" msgid "Window Role" msgstr "Rol de la finestra" msgid "Window Name" msgstr "Nom de la finestra" msgid "Window Class" msgstr "Classe de la finestra" msgid "Window Type" msgstr "Tipus de finestra" msgid "Window ID" msgstr "ID de la finestra" msgid "And" msgstr "I" msgid "Or" msgstr "O" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "Tipus" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "" #. Relation #, fuzzy msgid "Relation" msgstr "Integració" #. Invert msgid "Invert" msgstr "Inverteix" msgid "Browse..." msgstr "Examinar..." msgid "Images" msgstr "Imatges" msgid "File" msgstr "Fitxer" msgid "Open directory..." msgstr "Obre directori..." msgid "Open file..." msgstr "Obre fitxer..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Això es un gestor dels paràmetres pel sistema de configuració del " "CompizConfig" msgid "translator-credits" msgstr "Karasu " msgid "An error has occured" msgstr "S'ha donat un error" msgid "Warning" msgstr "Alerta" #, python-format msgid "Enable %s" msgstr "Activa %s" msgid "Filter" msgstr "Filtre" #, python-format msgid "Search %s Plugin Options" msgstr "Busca opcions del connector %s" msgid "Use This Plugin" msgstr "Usa aquest connector" msgid "Search Compiz Core Options" msgstr "Cerca opcions del nucli del Compiz" msgid "Error" msgstr "Error" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "Cerca a..." #. Options msgid "Short description and name" msgstr "Descripció curta i nom" msgid "Long description" msgstr "Descripció llarga" msgid "Settings value" msgstr "Valor del paràmetre" msgid "Group" msgstr "Grup" msgid "Subgroup" msgstr "Subgrup" #. Notebook msgid "Settings" msgstr "Paràmetres" msgid "Loading Advanced Search" msgstr "Carregant cerca avançada" msgid "Add a New Profile" msgstr "Afegeix un perfil nou" msgid "Remove This Profile" msgstr "Esborra aquest perfil" msgid "Default" msgstr "Defecte" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importa un perfil CompizConfig" msgid "Import as..." msgstr "Importa com..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importa un perfil CompizConfig com un nou perfil" msgid "Export" msgstr "Exporta" msgid "Export your CompizConfig Profile" msgstr "Exporta el teu perfil CompizConfig" msgid "Reset to defaults" msgstr "Reseteja als valors per defecte" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reseteja el teu perfil CompizConfig als valors per defecte" msgid "Backend" msgstr "Rerefons" msgid "Integration" msgstr "Integració" msgid "Enable integration into the desktop environment" msgstr "Activa integració amb l'escriptori" msgid "Profiles (*.profile)" msgstr "Perfils (*.profile)" msgid "All files" msgstr "Tots els arxius" msgid "Save file.." msgstr "Guarda arxiu..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "Obre arxiu..." msgid "Enter a profile name" msgstr "Entra un nom del prefil" msgid "Please enter a name for the new profile:" msgstr "Entra el nom del nou perfil:" msgid "Backend not found." msgstr "No trobo el rerefons." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenació automàtica dels connectors" msgid "Disabled Plugins" msgstr "Connectors desactivats" msgid "Enabled Plugins" msgstr "Connectors activats" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "Afegeix connector" msgid "Plugin name:" msgstr "Nom del connector:" msgid "Insert plugin name" msgstr "Inserta el nom del connector" msgid "Preferences" msgstr "Preferències" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configura el rerefons, perfil i d'altres paràmetres interns usats pel " "Sistema de Configuració del Compiz" msgid "About" msgstr "Quant a" msgid "About CCSM..." msgstr "Quant a CCSM..." msgid "Profile & Backend" msgstr "Perfils i Rerefons" msgid "Plugin List" msgstr "Llista de Connectors" msgid "Filter your Plugin list" msgstr "Filtra la llista de connectors" #, python-format msgid "Screen %i" msgstr "Pantalla %i" msgid "Screen" msgstr "Pantalla" msgid "Category" msgstr "Categoria" msgid "Advanced Search" msgstr "Cerca avançada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "No s'han trobat coincidències. \n" "\n" " El teu filtre \"%s\" no concorda amb cap element." msgid "Configure Compiz with CompizConfig" msgstr "Configura Compiz amb CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Calculant possibles conflictes, esperi" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) per %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipus de llista %s no suportat per %s" #~ msgid "Actions" #~ msgstr "Accions" ./compizconfig/ccsm/po/as.po0000644000004100000410000002113513246301623016242 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2007-11-25 00:01+0100\n" "PO-Revision-Date: 2007-12-08 19:27+0100\n" "Last-Translator: biswajyoti mahanta \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "নতুন মূল্যৰ বাবে %(binding)s একচন ৰ কাৰণে %(action)s in প্লাগিন " "%(plugin)s একচন্ ৰ লগত দ্ন্দ %(action_conflict)s " "%(plugin_conflict)s প্লাগিন.\n" "অকামৰ কৰিব বিছাৰে নেকি %(action_conflict)s প্লাগিন " "%(plugin_conflict)s প্লাগিন?" #, python-format msgid "Disable %(action_conflict)s" msgstr "অকামৰ %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "চেট নকৰিব %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "চেট %(action)s যিকৰেই anyway" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "আপুনি এই feature ব্যবহাৰ কৰিব খুজিছে %(feature)s যি টো not " "কোনো প্লাগিনে দিয়া নাই.\n" "এতিয়াও এই feature টো ব্যবহাৰ কৰিব খোজেনেকি ?" #, python-format msgid "Use %(feature)s" msgstr "ব্যবহাৰ কৰক %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "ব্যবহাৰ নকৰিব %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "আপুনি এই feature ব্যবহাৰ কৰিব খুজিছে %(feature)s যি টো provided by " "%(plugin)s.\n" "এই প্লাগিন বৰতমানে অকায্য্ .\n" "আপুনি %(plugin)s so the feature is available?" #, python-format msgid "Enable %(plugin)s" msgstr "কায্যকৰি কৰক %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "কায্যকৰি নকৰিব %(feature)s" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" #, python-format msgid "Edit %s" msgstr "" msgid "Type" msgstr "" msgid "Value" msgstr "" msgid "Grab" msgstr "" msgid "Relation" msgstr "" msgid "Invert" msgstr "" msgid "Browse for " msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" msgid "Edit" msgstr "" #, python-format msgid "Value (%s)" msgstr "" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Actions" msgstr "" msgid "Error" msgstr "" msgid "Search in..." msgstr "" msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" ./compizconfig/ccsm/po/de.po0000644000004100000410000003234313246301623016232 0ustar www-datawww-data# CompizConfig German translation # Copyright (C) 2007 Danny Baumann # This file is distributed under the same license as the ccsm package. # Danny Baumann , 2007 # msgid "" msgstr "" "Project-Id-Version: ccsm 0.0.1\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-11-12 14:01+0100\n" "Last-Translator: Andreas Galonska \n" "Language-Team: Compiz Fusion translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" # Fehlendes Leerzeichen hinzugefügt. #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Der neue Wert für %(binding)s der Aktion %(action)s im Plugin %" "(plugin)s steht in Konflikt mit der Aktion %(action_conflict)s " "des Plugins %(plugin_conflict)s.\n" "Möchten Sie %(action_conflict)s im Plugin %(plugin_conflict)s " "deaktivieren?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s deaktivieren" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s nicht übernehmen" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s trotzdem setzen" msgid "key" msgstr "Taste" msgid "button" msgstr "Maustaste" msgid "edge" msgstr "Rand" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Sie versuchen, das Feature %(feature)s zu verwenden, welches von " "keinem Plugin zur Verfügung gestellt wird.\n" "Möchten Sie dieses Feature trotzdem verwenden?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s verwenden" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s nicht verwenden" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Sie versuchen, das von %(plugin)s zur Verfügung gestellte Feature %" "(feature)s zu verwenden.\n" "Dieses Plugin ist zur Zeit deaktiviert.\n" "Möchten Sie %(plugin)s aktivieren, so dass dieses Feature zur " "Verfügung steht?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s aktivieren" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s nicht aktivieren" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Einige %(bindings)s Tastenkombinationen des Plug-ins %(plugin)s " "kollidieren mit denen anderer Plug-ins. Möchtest du die Konflikte jetzt " "auflösen?" msgid "Resolve conflicts" msgstr "Konflikte beheben" msgid "Ignore conflicts" msgstr "Konflikte ignorieren" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugin %(plugin_conflict)s stellt das Feature %(feature)s " "bereit, welch auch von %(plugin)s bereitgestellt wird." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s deaktivieren" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s nicht aktivieren" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Plugin %(plugin_conflict)s steht in Konflikt mit dem Plugin %" "(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s benötigt das Feature %(feature)s, das von den " "folgenden Plugins bereit gestellt wird:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Diese Plugins aktivieren" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s benötigt das Plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "%(require)s aktivieren" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s stellt das Feature %(feature)s bereit, das von den " "Plugins %(plugin_list)s benötigt wird." msgid "Disable these plugins" msgstr "Diese Plugins deaktivieren" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s nicht deaktivieren" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s wird von den Plugins %(plugin_list)s benötigt." msgid "General" msgstr "Allgemein" msgid "Accessibility" msgstr "Barrierefreiheit" msgid "Desktop" msgstr "Arbeitsfläche" msgid "Extras" msgstr "Sonstiges" msgid "Window Management" msgstr "Fensterverwaltung" msgid "Effects" msgstr "Effekte" msgid "Image Loading" msgstr "Bildverarbeitung" msgid "Utility" msgstr "Werkzeuge" msgid "All" msgstr "Alle" msgid "Uncategorized" msgstr "Ohne Kategorie" msgid "N/A" msgstr "Nicht verfügbar" msgid "Reset setting to the default value" msgstr "Einstellung auf den Standardwert zurücksetzen" msgid "Edit" msgstr "Bearbeiten" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Mehrfachliste - Doppelklick auf eine Zeile zum Bearbeiten" #, python-format msgid "Edit %s" msgstr "%s bearbeiten" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ist keine gültige Tastenkombination" msgid "Disabled" msgstr "Deaktiviert" msgid "Enabled" msgstr "Aktiviert" msgid "Grab key combination" msgstr "Tastenkombination auswählen" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ist keine gültige Taste" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Die Verwendung von Maustaste 1 kann Links-Klicks verhindern und damit Ihr " "System unverwendbar machen. Möchten Sie wirklich \"%s\" zu Maustaste 1 " "zuweisen?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ist keine gültige Bildschirmecke" msgid "None" msgstr "Nichts" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Einstellungs-Manager" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Bitte drücken Sie die gewünschte Tastenkombination" msgid "Window Title" msgstr "Fenstertitel" msgid "Window Role" msgstr "Fensterfunktion" msgid "Window Name" msgstr "Fensterklassenname" msgid "Window Class" msgstr "Fensterklasse" msgid "Window Type" msgstr "Fenstertyp" msgid "Window ID" msgstr "Fenster-ID" msgid "And" msgstr "Und" msgid "Or" msgstr "Oder" msgid "Edit match" msgstr "Kriterien bearbeiten" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Wert" msgid "Grab" msgstr "Auswählen" #. Relation msgid "Relation" msgstr "Beziehung" #. Invert msgid "Invert" msgstr "Umkehren" msgid "Browse..." msgstr "Suchen..." msgid "Images" msgstr "Bilder" msgid "File" msgstr "Datei" msgid "Open directory..." msgstr "Verzeichnis auswählen" msgid "Open file..." msgstr "Datei öffnen" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Ein Einstellungs-Manager für das CompizConfig Konfigurations-System" msgid "translator-credits" msgstr "" "Danny Baumann \n" "Patrick Niklaus " msgid "An error has occured" msgstr "Ein Fehler ist aufgetreten." msgid "Warning" msgstr "Warnung" #, python-format msgid "Enable %s" msgstr "%s aktivieren" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Suche in den Einstellungen des Plugins %s" msgid "Use This Plugin" msgstr "Dieses Plugin aktivieren" msgid "Search Compiz Core Options" msgstr "Suche in den Einstellungen des Compiz-Kerns" msgid "Error" msgstr "Fehler" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Filterregel erstellen.\n" "Klicke auf die Virtuelle Tastatur, um eine Taste für die Suche zu definieren." msgid "Search in..." msgstr "Suche in..." #. Options msgid "Short description and name" msgstr "Kurzbeschreibung und Name" msgid "Long description" msgstr "Ausführlicher Beschreibung" msgid "Settings value" msgstr "Einstellungswert" msgid "Group" msgstr "Gruppe" msgid "Subgroup" msgstr "Untergruppe" #. Notebook msgid "Settings" msgstr "Einstellungen" msgid "Loading Advanced Search" msgstr "Lade erweiterte Suche" msgid "Add a New Profile" msgstr "Neues Profil hinzufügen" msgid "Remove This Profile" msgstr "Profil entfernen" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importieren" msgid "Import a CompizConfig Profile" msgstr "CompizConfig-Profil importieren" msgid "Import as..." msgstr "Import als..." msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig-Profil als neues Profil importieren" msgid "Export" msgstr "Exportieren" msgid "Export your CompizConfig Profile" msgstr "CompizConfig-Profil exportieren" msgid "Reset to defaults" msgstr "Zurücksetzen" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Aktuelles Profil auf Standardwerte zurücksetzen" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integration" msgid "Enable integration into the desktop environment" msgstr "Aktiviere Integration in die Desktopumgebung" msgid "Profiles (*.profile)" msgstr "Profile (*.profile)" msgid "All files" msgstr "Alle Dateien" msgid "Save file.." msgstr "Datei speichern" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Möchten Sie voreingestellte Werte beim Exportieren Ihres Profils ignorieren?" msgid "Open file.." msgstr "Datei öffnen" msgid "Enter a profile name" msgstr "Geben Sie einen Profilnamen ein" msgid "Please enter a name for the new profile:" msgstr "Bitte geben Sie einen Namen für das neue Profil an:" msgid "Backend not found." msgstr "Backend nicht gefunden." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatische Pluginsortierung" msgid "Disabled Plugins" msgstr "Deaktivierte Plugins" msgid "Enabled Plugins" msgstr "Aktivierte Plugins" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Soll das automatische Sortieren von Plugins wirklich abgeschaltet werden? In " "diesem Fall wird auch die automatische Konfiktlösung abgeschaltet. Sie " "sollten dies nur tun, wenn Sie sich ganz sicher sind." msgid "Add plugin" msgstr "Plugin hinzufügen" msgid "Plugin name:" msgstr "Pluginname:" msgid "Insert plugin name" msgstr "Plugin-Namen eingeben" msgid "Preferences" msgstr "Einstellungen" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Von Compiz Configuration System verwendetes Backend, Profil und andere " "interne Einstellungen konfigurieren." # Info == official German translation in GNOME msgid "About" msgstr "Info" msgid "About CCSM..." msgstr "Über CCSM..." msgid "Profile & Backend" msgstr "Profil & Backend" msgid "Plugin List" msgstr "Pluginliste" msgid "Filter your Plugin list" msgstr "Pluginliste filtern" #, python-format msgid "Screen %i" msgstr "Bildschirm %i" msgid "Screen" msgstr "Bildschirm" msgid "Category" msgstr "Kategorie" msgid "Advanced Search" msgstr "Erweiterte Suche" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Keine Übereinstimmungen gefunden. \n" "\n" " Der Filter \"%s\" stimmt mit keinem Element überein." msgid "Configure Compiz with CompizConfig" msgstr "Konfiguration von Compiz mit CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Werte mögliche Konflikte aus ... bitte warten." #~ msgid "Value (%s)" #~ msgstr "Wert (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Wert (%(value)s) für %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nicht unterstützter Listentyp %s für %s" #~ msgid "Actions" #~ msgstr "Aktionen" #~ msgid "Disable %s" #~ msgstr "%s deaktivieren" #~ msgid "Name" #~ msgstr "Name" #~ msgid "Screen Edge" #~ msgstr "Bildschirmecke" #~ msgid "Button %i" #~ msgstr "Maustaste %i" #~ msgid "Edge Button" #~ msgstr "Maustaste für Bildschirmecke" #~ msgid "On System Bell" #~ msgstr "Bei Systemglocke" #~ msgid "Edit Action: %s" #~ msgstr "Aktion %s bearbeiten" #~ msgid "Screen Edges" #~ msgstr "Bildschirmecken" #~ msgid "Reset To Defaults" #~ msgstr "Auf Standardwert zurücksetzen" ./compizconfig/ccsm/po/gl.po0000644000004100000410000003177113246301623016250 0ustar www-datawww-data# translation of ccsm.po to Galician # Translation of CCSM to gl_ES # Copyright (C) 2007 compiz-fusion # This file is distributed under the same license as the Compiz Fusion packages. # # Festor Wailon Dacoba , 2007. # Fran Diéguez (GLUG) , 2007. # Fran Diéguez , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-05-24 18:40+0200\n" "Last-Translator: Fran Diéguez Souto \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "O novo valor para o atallo %(binding)s da acción %(action)s no " "complemento %(plugin)s ten un conflito coa acción %" "(action_conflict)s do complemento %(plugin_conflict)s.\n" "Quere desactivar %(action_conflict)s no complemento %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Desactivar %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Non configuralas %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Activar %(action)s de todas formas" msgid "key" msgstr "chave" msgid "button" msgstr "botón" msgid "edge" msgstr "borde" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Esta tentando empregar a característica %(feature)s que non " "está sendo proporcionada por ningún complemento.\n" "¿Quere empregar esta funcionalidade de tódolos xeitos?" #, python-format msgid "Use %(feature)s" msgstr "Empregar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Non empregar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Esta tentando empregar a característica %(feature)s que inclúe %" "(plugin)s.\n" "Este complemento está desactivado neste intre.\n" "¿Queres habilitar %(plugin)s para que a característica este " "dispoñíbel?" #, python-format msgid "Enable %(plugin)s" msgstr "Activar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Non activar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Algúns atallos de teclado %(bindings)s do Complemento %(plugin)s " "entran en conflito con outros complementos. ¿Quere solucionar estes " "conflitos?" msgid "Resolve conflicts" msgstr "Solucionar conflictos" msgid "Ignore conflicts" msgstr "Ignorar conflitos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "O complemento %(plugin_conflict)s proporciona a funcionalidade %" "(feature)s que tamén está proporcionada por %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desactivar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Non activar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "O complemento %(plugin_conflict)s ten un conflito con %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s require a funcionalidade %(feature)s que é " "proporcionada polos seguintes complementos:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activar estes complementos" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "O complemento %(plugin)s require o complemento %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activar %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)sproporciona a funcionalidade %(feature)s que é " "requirida polos complementos %(plugin_list)s." msgid "Disable these plugins" msgstr "Desactivar os seguintes complementos" #, python-format msgid "Don't disable %(plugin)s" msgstr "Non desactivar %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s é necesario para os complementos %(plugin_list)s." msgid "General" msgstr "Xeral" msgid "Accessibility" msgstr "Accesibilidade" msgid "Desktop" msgstr "Escritorio" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Administración de xanelas" msgid "Effects" msgstr "Efectos" msgid "Image Loading" msgstr "Soporte de formatos de imaxe" msgid "Utility" msgstr "Utilidades" msgid "All" msgstr "Todas" msgid "Uncategorized" msgstr "Sen categoría" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Reiniciar configuración ao valor por defecto" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Configuracións das listas múltiples. Vostede pode facer dobre clic nunha " "fila para editar os valores." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" non é unha ligazón válida" msgid "Disabled" msgstr "Desactivado" msgid "Enabled" msgstr "Activado" msgid "Grab key combination" msgstr "Obter combinación de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" non é un botón válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Se emprega Botón1 sen modificadores pode evitar poder facer clic co botón " "esquerdo o que pode votar a perder a súa configuración. Está seguro que " "quere establecer o botón \"%s\" ao Botón1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" non é unha máscara de borde válida" msgid "None" msgstr "Ningún" msgid "CompizConfig Settings Manager" msgstr "Administrador de Configuracións CompizConfig" msgid "Plugin" msgstr "Complemento" msgid "Please press the new key combination" msgstr "Prema unha nova combinación de teclas" msgid "Window Title" msgstr "Título da xanela" msgid "Window Role" msgstr "Rol da xanela" msgid "Window Name" msgstr "Nome da xanela" msgid "Window Class" msgstr "Clase da xanela" msgid "Window Type" msgstr "Tipo de xanela" msgid "Window ID" msgstr "ID da xanela" msgid "And" msgstr "E" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Editar coincidencia" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Obter" #. Relation msgid "Relation" msgstr "Relación" #. Invert msgid "Invert" msgstr "Invertir" msgid "Browse..." msgstr "Examinar..." msgid "Images" msgstr "Imaxes" msgid "File" msgstr "Ficheiro" msgid "Open directory..." msgstr "Abrir cartafol..." msgid "Open file..." msgstr "Abrir ficheiro..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este é o administrador de opcións do sistema de configuración CompizConfig" msgid "translator-credits" msgstr "Fran Diéguez Souto , 2009" msgid "An error has occured" msgstr "Produciuse un erro" msgid "Warning" msgstr "Advertencia" #, python-format msgid "Enable %s" msgstr "Activar %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Procurar nas opcións do complemento %s" msgid "Use This Plugin" msgstr "Empregar este complemento" msgid "Search Compiz Core Options" msgstr "Procurar nas opcións do núcleo de Compiz" msgid "Error" msgstr "Erro" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Insira un filtro.\n" "Faga clic na imaxe do teclado para gardar unha tecla coa que procurar." msgid "Search in..." msgstr "Procurar en..." #. Options msgid "Short description and name" msgstr "Descrición curta e nome" msgid "Long description" msgstr "Descrición longa" msgid "Settings value" msgstr "Valor das opcións" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Subgrupo" #. Notebook msgid "Settings" msgstr "Opcións" msgid "Loading Advanced Search" msgstr "Cargando a procura avanzada" msgid "Add a New Profile" msgstr "Engadir un perfil novo" msgid "Remove This Profile" msgstr "Eliminar este perfil" msgid "Default" msgstr "Por defecto" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importa un perfil de CompizConfig" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importa un perfil de CompizConfig como un novo perfil" msgid "Export" msgstr "Exportar" msgid "Export your CompizConfig Profile" msgstr "Exporta o seu perfil CompizConfig" msgid "Reset to defaults" msgstr "Volta ás configuracións predeterminadas" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" "Reinicia o seu perfil de CompizConfig ás opcións xerais predeterminadas" msgid "Backend" msgstr "Método de almacenamento de configuración" msgid "Integration" msgstr "Integración" msgid "Enable integration into the desktop environment" msgstr "Activar integración co entorno de escritorio" msgid "Profiles (*.profile)" msgstr "Perfís (*.profile)" msgid "All files" msgstr "Tódolos ficheiros" msgid "Save file.." msgstr "Gardar ficheiro.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Quere omitir os valores das opcións por defecto ao exportar o seu perfil?" msgid "Open file.." msgstr "Abrir ficheiro.." msgid "Enter a profile name" msgstr "Insira un nome para o perfil" msgid "Please enter a name for the new profile:" msgstr "Insira un nome para o novo perfil:" msgid "Backend not found." msgstr "Non atopou o método de almacenamento de configuración." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenar os complementos automáticamente" msgid "Disabled Plugins" msgstr "Complementos desactivados" msgid "Enabled Plugins" msgstr "Complementos activados" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Quere desactivar a ordenación automática de complementos? Isto tamén " "desactiva a xestión de conflitos. So se debería facer isto se sabe ben o que " "esta a facer." msgid "Add plugin" msgstr "Engadir complemento" msgid "Plugin name:" msgstr "Nome do complemento:" msgid "Insert plugin name" msgstr "Insira un nome para o complemento" msgid "Preferences" msgstr "Preferencias" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configure o método de almacenamento de configuración, perfís e outras " "opcións internas empregadas polo sistema de configuración de Compiz" msgid "About" msgstr "Sobre" msgid "About CCSM..." msgstr "Acerca de CCSM..." msgid "Profile & Backend" msgstr "Perfil e método de almacenamento de configuración" msgid "Plugin List" msgstr "Lista de Complementos" msgid "Filter your Plugin list" msgstr "Filtra a súa lista de complementos" #, python-format msgid "Screen %i" msgstr "Pantalla %i" msgid "Screen" msgstr "Pantallla" msgid "Category" msgstr "Categoría" msgid "Advanced Search" msgstr "Procura avanzada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Non se atopou ningunha coincidencia. \n" "\n" " O seu filtro \"%s\" non devolveu ningún resultado." msgid "Configure Compiz with CompizConfig" msgstr "Configurar Compiz con CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Posibles conflictos de computación, por favor espere" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipo de lista non mantida %s para %s" #~ msgid "Actions" #~ msgstr "Accións" ./compizconfig/ccsm/po/sv.po0000644000004100000410000003167513246301623016301 0ustar www-datawww-data# Swedish translation for ccsm. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the compiz-fusion package. # Daniel Nylander , 2007. # Erik Eloff , 2007. # Sebastian Parborg , 2007. # Fredrik Karlsson , 2007. # msgid "" msgstr "" "Project-Id-Version: compiz-fusion-plugins 0.0.1\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-12-07 18:22+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Compiz Fusion Translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Det nya värdet för tangentbindningen %(binding)s för åtgärden %(action)si insticksmodulen %(plugin)s står i konflikt med åtgärden %" "(action_conflict)sför insticksmodulen %(plugin_conflict)s.\n" "Vill du inaktivera %(action_conflict)s i insticksmodulen %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Inaktivera %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ställ inte in %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Ställ in %(action)s ändå" msgid "key" msgstr "tangent" msgid "button" msgstr "knapp" msgid "edge" msgstr "kant" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Du försöker använda funktionen %(feature)s som inte " "tillhandahålls av någon insticksmodul.\n" "Vill du använda den här funktionen ändå? " # Två "Aktivera inte" måste bli förvirrande #, python-format msgid "Use %(feature)s" msgstr "Använd %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Använd inte %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Du försöker använda funktionen %(feature)s som tillhandahålls av %" "(plugin)s.\n" "Den här insticksmodulen är för närvarande inaktiverad.\n" "Vill du aktivera %(plugin)s så att funktionen blir tillgänglig?" #, python-format msgid "Enable %(plugin)s" msgstr "Aktivera %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Aktivera inte %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Några %(bindings)s bindningar för insticksmodulen %(plugin)s är i " "konflikt med andra insticksmoduler. Vill du lösa dessa konflikter? " msgid "Resolve conflicts" msgstr "Lös konflikter" msgid "Ignore conflicts" msgstr "Ignorera konflikter" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Insticksmodulen %(plugin_conflict)s tillhandahåller funktionen %" "(feature)s, som även finns i %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Inaktivera %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Aktivera inte %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Insticksmodulen %(plugin_conflict)s står i konflikt med %(plugin)" "s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s kräver funktionen %(feature)s som tillhandahålls av " "följande insticksmoduler:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Aktivera dessa insticksmoduler" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s kräver insticksmodulen %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Aktivera %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s tillhandahåller funktionen %(feature)s som krävs av " "insticksmodulerna %(plugin_list)s." msgid "Disable these plugins" msgstr "Inaktivera dessa insticksmoduler" #, python-format msgid "Don't disable %(plugin)s" msgstr "Inaktivera inte %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s krävs av insticksmodulerna %(plugin_list)s." msgid "General" msgstr "Allmänt" # This is what gnomes translation looks like... msgid "Accessibility" msgstr "Tillgänglighet" msgid "Desktop" msgstr "Skrivbord" msgid "Extras" msgstr "Extrafunktioner" msgid "Window Management" msgstr "Fönsterhantering" msgid "Effects" msgstr "Effekter" msgid "Image Loading" msgstr "Bildinläsning" msgid "Utility" msgstr "Verktyg" msgid "All" msgstr "Alla" msgid "Uncategorized" msgstr "Okategoriserade" msgid "N/A" msgstr "-" msgid "Reset setting to the default value" msgstr "Återställ inställning till standardvärde" msgid "Edit" msgstr "Redigera" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Multilist-inställningar. Du kan dubbelklicka i en rad för att ändra värdena." #, python-format msgid "Edit %s" msgstr "Redigera %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" är inte en giltig genväg" msgid "Disabled" msgstr "Inaktiverad" msgid "Enabled" msgstr "Aktiverad" msgid "Grab key combination" msgstr "Fånga tangentkombination" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" är inte en giltig knapp" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Användandet av Knapp1 utan modifierare kan förhindra vänsterklickande och på " "så sätt ha sönder din konfiguration. Vill du verkligen binda \"%s\" knappen " "till Knapp1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" är inte en giltig kantmask" msgid "None" msgstr "Inget" msgid "CompizConfig Settings Manager" msgstr "Inställningshanteraren CompizConfig" msgid "Plugin" msgstr "Insticksmodul" msgid "Please press the new key combination" msgstr "Tryck den nya tangentkombinationen" msgid "Window Title" msgstr "Fönstertitel" # Särskrivning msgid "Window Role" msgstr "Fönsterroll" # Ersatte "Fönsterhantering" med "Fönsternamn" msgid "Window Name" msgstr "Fönsternamn" msgid "Window Class" msgstr "Fönsterklass" msgid "Window Type" msgstr "Fönstertyp" msgid "Window ID" msgstr "Fönster-ID" msgid "And" msgstr "Och" msgid "Or" msgstr "Eller" msgid "Edit match" msgstr "Redigera träff" #. Type msgid "Type" msgstr "Typ" # Ersatte "Värde (%s)" med "Värde" #. Value msgid "Value" msgstr "Värde" msgid "Grab" msgstr "Fånga" #. Relation msgid "Relation" msgstr "Relation" #. Invert msgid "Invert" msgstr "Invertera" msgid "Browse..." msgstr "Bläddra efter... " msgid "Images" msgstr "Bilder" msgid "File" msgstr "Fil" msgid "Open directory..." msgstr "Öppna katalog..." msgid "Open file..." msgstr "Öppna fil..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Det här är en inställningshanterare för CompizConfig konfigurationssystem." msgid "translator-credits" msgstr "" "Daniel Nylander \n" "Sebastian Parborg" msgid "An error has occured" msgstr "Ett fel har inträffat" msgid "Warning" msgstr "Varning" #, python-format msgid "Enable %s" msgstr "Aktivera %s" msgid "Filter" msgstr "Filtrera" #, python-format msgid "Search %s Plugin Options" msgstr "Sök alternativ för insticksmodulen %s" msgid "Use This Plugin" msgstr "Använd denna insticksmodul" msgid "Search Compiz Core Options" msgstr "Sök Compiz Core-alternativ" msgid "Error" msgstr "Fel" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Skriv in ett filter.\n" "Klicka på tangentbordsbilden för att fånga en tangent att söka efter." msgid "Search in..." msgstr "Sök i..." #. Options msgid "Short description and name" msgstr "Kort beskrivning och namn" msgid "Long description" msgstr "Lång beskrivning" msgid "Settings value" msgstr "Inställningsvärde" msgid "Group" msgstr "Grupp" msgid "Subgroup" msgstr "Undergrupp" #. Notebook msgid "Settings" msgstr "Inställningar" msgid "Loading Advanced Search" msgstr "Läser in avancerad sökning" msgid "Add a New Profile" msgstr "Lägg till en ny profil" msgid "Remove This Profile" msgstr "Ta bort den här profilen" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importera" msgid "Import a CompizConfig Profile" msgstr "Importera en CompizConfig-profil" msgid "Import as..." msgstr "Importera som..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importera en CompizConfig-profil som ny profil" msgid "Export" msgstr "Exportera" msgid "Export your CompizConfig Profile" msgstr "Exportera en CompizConfig profil" msgid "Reset to defaults" msgstr "Återställ till standardvärden" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Återställ din CompizConfig profil till de globala standardvärdena" msgid "Backend" msgstr "Bakände" msgid "Integration" msgstr "Integration" msgid "Enable integration into the desktop environment" msgstr "Aktivera integration med skrivbordsmiljö" msgid "Profiles (*.profile)" msgstr "Profiler (*.profile)" msgid "All files" msgstr "Alla filer" msgid "Save file.." msgstr "Spara fil.." # Kanske duger? msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Vill du hoppa över standardvärdena på alternativ när du exporterar din " "profil?" msgid "Open file.." msgstr "Öppna fil.." msgid "Enter a profile name" msgstr "Ange ett profilnamn" msgid "Please enter a name for the new profile:" msgstr "Ange ett namn för den nya profilen:" msgid "Backend not found." msgstr "Bakände hittades inte." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatisk sortering av insticksmoduler" msgid "Disabled Plugins" msgstr "Inaktiverade insticksmoduler" msgid "Enabled Plugins" msgstr "Aktiverade insticksmoduler" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Vill du verkligen avaktivera den automatiska sorteringen av insticksmoduler? " "Detta kommer också att avaktivera konflikthantering. Du borde bara göra " "detta om du vet vad du gör." msgid "Add plugin" msgstr "Lägg till instickmodul" msgid "Plugin name:" msgstr "Insticksmodulens namn:" msgid "Insert plugin name" msgstr "Ange insticksmodulens namn" msgid "Preferences" msgstr "Inställningar" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurera bakände, profil och andra interna inställningar som används av " "Compiz konfigurationssystem." msgid "About" msgstr "Om" msgid "About CCSM..." msgstr "Om CCSM..." msgid "Profile & Backend" msgstr "Profil och bakände" msgid "Plugin List" msgstr "Plugin lista" msgid "Filter your Plugin list" msgstr "Filtrera din insticksmodullista" #, python-format msgid "Screen %i" msgstr "Skärm %i" msgid "Screen" msgstr "Skärm" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Avancerad sökning" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Inga matchingar hittades. \n" "\n" " Ditt filter \"%s\" matchar inga objekt." msgid "Configure Compiz with CompizConfig" msgstr "Konfigurera Compiz med CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Beräknar eventuella konflikter, var snäll vänta" #~ msgid "Value (%s)" #~ msgstr "Värde (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Värde (%(value)s) för %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Ohanterad listtyp %s för %s" #~ msgid "Actions" #~ msgstr "Åtgärder" ./compizconfig/ccsm/po/pt.po0000644000004100000410000003127313246301623016266 0ustar www-datawww-data# translation of ccsm.po to Portuguese (Portugal) # CompizConfig Portuguese translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # # Nicolau Gonçalves , 2007. # Joel Calado , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-01 20:20+0200\n" "Last-Translator: Nicolau Gonçalves \n" "Language-Team: Portuguese (Portugal) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "O novo valor para o atalho %(binding)s da acção %(action)s do plugin " "%(plugin)s entra em conflito com a acção %(action_conflict)s " "do plugin %(plugin_conflict)s.\n" "Deseja desactivar %(action_conflict)s do plugin %(plugin_conflict)" "s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Desactivar %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Não activar %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Definir %(action)s de qualquer maneira" msgid "key" msgstr "tecla" msgid "button" msgstr "botão" msgid "edge" msgstr "margem" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Está a tentar utilizar a acção %(feature)s que não é " "proporcionada por nenhum plugin.\n" "Deseja usar esta acção de qualquer maneira?" #, python-format msgid "Use %(feature)s" msgstr "Usar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Não usar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Está a tentar utilizar a acção %(feature)s que é proporcionada por " "%(plugin)s.\n" "Este plugin está actualmente desactivado.\n" "Deseja activar %(plugin)s de modo a permitir realizar esta acção?" #, python-format msgid "Enable %(plugin)s" msgstr "Activar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Não activar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Alguns %(bindings)s atalhos do Plugin %(plugin)s entram em conflicto " "com outros plugins. Deseja resolver estes conflictos?" msgid "Resolve conflicts" msgstr "Resolve conflictos" msgid "Ignore conflicts" msgstr "Ignorar conflictos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "O plugin %(plugin_conflict)s permite realizar a acção %(feature)s que também é activada por %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desactivar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Não activar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "O plugin %(plugin_conflict)s entra em conflito com %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s necessita da acção %(feature)s que é proporcionada " "pelos seguintes plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Activar estes plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requer o plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Activar %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s proporciona a acção %(feature)s que é requerida " "pelos plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Desactivar estes plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "Não desactivar %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s é necessária pelos plugins %(plugin_list)s." msgid "General" msgstr "Geral" msgid "Accessibility" msgstr "Acessibilidade" msgid "Desktop" msgstr "Ambiente de trabalho" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gestão de Janelas" msgid "Effects" msgstr "Efeitos" msgid "Image Loading" msgstr "Carregamento de Imagens" msgid "Utility" msgstr "Utilitários" msgid "All" msgstr "Todas" msgid "Uncategorized" msgstr "Sem categoria" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "Colocar a definição no valor por omissão" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Definições multi-lista. Pode clicar duas vezes numa linha para editar os " "valores." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" não é um atalho válido" msgid "Disabled" msgstr "Desactivado" msgid "Enabled" msgstr "Activado" msgid "Grab key combination" msgstr "Capturar combinação de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" não é um botão válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Utilizar o Botão1 sem modificadores pode impedir o uso de qualquer clique da " "tecla esquerda, impedindo assim o correcto funcionamento da sua " "configuração. De certeza que deseja definir o botão \"%s\" para o Botão1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" não é uma máscara válida para borda" msgid "None" msgstr "Nenhum" msgid "CompizConfig Settings Manager" msgstr "Sistema de Configuração do Compiz" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Por favor, pressione a nova combinação de teclas" msgid "Window Title" msgstr "Título Janela" msgid "Window Role" msgstr "Tipo de Janela" msgid "Window Name" msgstr "Nome da Janela" msgid "Window Class" msgstr "Classe Janela" msgid "Window Type" msgstr "Tipo Janela" msgid "Window ID" msgstr "ID da Janela" msgid "And" msgstr "E" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Editar correspondência" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Agarrar" #. Relation msgid "Relation" msgstr "Relação" #. Invert msgid "Invert" msgstr "Inverter" msgid "Browse..." msgstr "Procurar..." msgid "Images" msgstr "Imagens" msgid "File" msgstr "Ficheiro" msgid "Open directory..." msgstr "Abrir directório..." msgid "Open file..." msgstr "Abrir ficheiro..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este é o gestor de definições para o sistema de configuração do CompizConfig." msgid "translator-credits" msgstr "Nicolau Gonçalves" msgid "An error has occured" msgstr "Ocorreu um erro" msgid "Warning" msgstr "Aviso" #, python-format msgid "Enable %s" msgstr "Definir %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Pesquisar opções do plugin %s" msgid "Use This Plugin" msgstr "Usar este plugin" msgid "Search Compiz Core Options" msgstr "Pesquisar opções do Compiz Core" msgid "Error" msgstr "Erro" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Seleccione um filtro.\n" "Clique na imagem do teclado para selecionar uma tecla para procurar." msgid "Search in..." msgstr "Pesquisar em..." #. Options msgid "Short description and name" msgstr "Descrição resumida e nome" msgid "Long description" msgstr "Descrição completa" msgid "Settings value" msgstr "Valor da definição" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Sub-grupo" #. Notebook msgid "Settings" msgstr "Definições" msgid "Loading Advanced Search" msgstr "A Carregar Pesquisa avançada" msgid "Add a New Profile" msgstr "Adicionar um novo perfil" msgid "Remove This Profile" msgstr "Remover este perfil" msgid "Default" msgstr "Por omissão" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importar um perfil do Sistema de Configuração do Compiz" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "" "Importar um perfil do Sistema de Configuração do Compiz como um novo perfil" msgid "Export" msgstr "Exportar" msgid "Export your CompizConfig Profile" msgstr "Exportar um perfil do Sistema de Configuração do Compiz" msgid "Reset to defaults" msgstr "Restaurar para valores por omissão" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Restaurar o seu perfil CompizConfig para valores por omissão" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integração" msgid "Enable integration into the desktop environment" msgstr "Activar integração com o ambiente gráfico" msgid "Profiles (*.profile)" msgstr "Perfis (*.profile)" msgid "All files" msgstr "Todos os ficheiros" msgid "Save file.." msgstr "Guardar ficheiro.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Deseja exportar o seu perfil sem guardar os valores por omissão?" msgid "Open file.." msgstr "Abrir ficheiro.." msgid "Enter a profile name" msgstr "Introduza um nome de perfil" msgid "Please enter a name for the new profile:" msgstr "Introduza um nome para o novo perfil:" msgid "Backend not found." msgstr "Backend não foi encontrado." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenação automática dos plugins" msgid "Disabled Plugins" msgstr "Plugins Desactivados" msgid "Enabled Plugins" msgstr "Plugins Activados" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Deseja realmente desactivar a ordenação automática dos plugins? Isto também " "desactivará a gestão de conflitos. Deve fazer apenas quando sabe o que está " "a fazer." msgid "Add plugin" msgstr "Adicionar plugin" msgid "Plugin name:" msgstr "Nome do plugin:" msgid "Insert plugin name" msgstr "Inserir o nome do plugin" msgid "Preferences" msgstr "Preferências" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configurar o backend, o perfil e outras definições internas usadas pelo " "Sistema de Configuração do Compiz." msgid "About" msgstr "Acerca" msgid "About CCSM..." msgstr "Acerca do CCSM..." msgid "Profile & Backend" msgstr "Perfil e Backend" msgid "Plugin List" msgstr "Lista de Plugins" msgid "Filter your Plugin list" msgstr "Filtrar a lista de plugins" #, python-format msgid "Screen %i" msgstr "Ecrã %i" msgid "Screen" msgstr "Ecrã" msgid "Category" msgstr "Categoria" msgid "Advanced Search" msgstr "Pesquisa avançada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nenhuma ocorrência encontrada. \n" "\n" " O filtro \"%s\" não coincide com nenhum item." msgid "Configure Compiz with CompizConfig" msgstr "Configurar Compiz com CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "A verificar possíveis conflictos, por favor aguarde" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipo de lista não gerido %s para %s" #~ msgid "Actions" #~ msgstr "Acções" ./compizconfig/ccsm/po/nl.po0000644000004100000410000003233613246301623016255 0ustar www-datawww-data# Compizconfig Settings manager Dutch translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Rick - , 2007. # ./martijn - , 2007. # msgid "" msgstr "" "Project-Id-Version: 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-02-27 11:11+0100\n" "Last-Translator: Harald van Bree \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "De nieuwe waarde voor de %(binding)s binding for de actie %(action)s " "in plugin %(plugin)s conflicteert met de actie %(action_conflict)" "s van de %(plugin_conflict)s plugin.\n" "Wilt u %(action_conflict)s in plugin %(plugin_conflict)s " "uitschakelen?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Schakel %(action_conflict)s uit" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s niet instellen" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s alsnog instellen" msgid "key" msgstr "sleutel" msgid "button" msgstr "knop" msgid "edge" msgstr "rand" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Je probeert de optie %(feature)s te gebruiken dat door geen enkele " "plugin wordt geleverd.\n" "Wil je deze feature toch gebruiken?" #, python-format msgid "Use %(feature)s" msgstr "Gebruik %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s niet instellen" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Je probeert de eigenschap %(feature)s te gebruiken dat wordt geleverd " "door %(plugin)s.\n" "Deze plugin is momenteel uitgeschakeld.\n" "Wil je %(plugin)s inschakelen, zodat deze eigenschap beschikbaar is?" #, python-format msgid "Enable %(plugin)s" msgstr "Inschakelen %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s niet inschakelen" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Sommige %(bindings)s bindings van Plugin %(plugin)s conflicteren met " "andere plugins. Wil je deze conflicten oplossen?" msgid "Resolve conflicts" msgstr "Conflicten oplossen" msgid "Ignore conflicts" msgstr "Conflicten negeren" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugin %(plugin_conflict)s biedt de eigenschap %(feature)s dat " "ook wordt geleverd door %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s uitschakelen" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s niet inschakelen" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Plugin %(plugin_conflict)s conclicteert met %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s vereist de eigenschap %(feature)s dat wordt " "geleverd door de volgende plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Deze plugins inschakelen" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vereist de plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "%(require)s inschakelen" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s biedt de eigenschap %(feature)s dat verplicht is " "voor de plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Deze plugins uitschakelen" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s niet uitschakelen" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s is vereist voor de plugins %(plugin_list)s." msgid "General" msgstr "Algemeen" msgid "Accessibility" msgstr "Toegankelijkheid" msgid "Desktop" msgstr "Bureaublad" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Venster beheer" msgid "Effects" msgstr "Effecten" msgid "Image Loading" msgstr "Afbeelding wordt geladen" msgid "Utility" msgstr "Gereedschap" msgid "All" msgstr "Alle" msgid "Uncategorized" msgstr "Niet gecategoriseerd" msgid "N/A" msgstr "N.V.T" msgid "Reset setting to the default value" msgstr "Instelling naar standaard herstellen" msgid "Edit" msgstr "Wijzigen" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Keuzelijst instellingen. U kunt een rij dubbelklikken om de inhoud te " "bewerken." #, python-format msgid "Edit %s" msgstr "Wijzigen %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s \" is geen valide verwijzing" msgid "Disabled" msgstr "Uitgeschakeld" msgid "Enabled" msgstr "Ingeschakeld" msgid "Grab key combination" msgstr "vang toets combinatie af" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" is geen valide knop" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Het gebruik van enkel Button1 zonder andere aanpassingen kan leiden tot het " "niet meer werken van de linker muisknop en kan dus uw systeem onwerkbaar " "maken. Weet u zeker dat u de \"%s\" knop op de plaats van Button1 wilt?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" is geen valide rand markering" msgid "None" msgstr "Geen" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Instellingen Beheerder" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Druk op de nieuwe toetsencombinatie." msgid "Window Title" msgstr "Venster titel" msgid "Window Role" msgstr "Vester rol" msgid "Window Name" msgstr "Venster naam" msgid "Window Class" msgstr "Venster klasse" msgid "Window Type" msgstr "Venster type" msgid "Window ID" msgstr "Venster ID" msgid "And" msgstr "En" msgid "Or" msgstr "Of" # In deze context is "match" waarschijnlijk "resultaat" van een zoekopdracht. Het betekent eigenlijk "gelijke" of "overeenkomstig", maar dit past volgens mij niet hier. # --- mahler: "Mee eens" msgid "Edit match" msgstr "Wijzigen resultaat" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Waarde" msgid "Grab" msgstr "Pak" #. Relation msgid "Relation" msgstr "Relatie" #. Invert msgid "Invert" msgstr "Inverteren" # --- mahler: Het is mogelijk dat "Bladeren naar..." beter zou zijn. msgid "Browse..." msgstr "Bladeren..." msgid "Images" msgstr "Afbeeldingen" msgid "File" msgstr "Bestand" msgid "Open directory..." msgstr "Open map..." msgid "Open file..." msgstr "Open bestand..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Dit is een instellingen beheer voor het CompizConfig configuratie syteem." msgid "translator-credits" msgstr "Vertalers eerbewijs" msgid "An error has occured" msgstr "Er is een fout opgetreden" msgid "Warning" msgstr "Waarschuwing" #, python-format msgid "Enable %s" msgstr "%s inschakelen" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Zoeken in %s plugin opties" msgid "Use This Plugin" msgstr "Gebruik deze plugin" msgid "Search Compiz Core Options" msgstr "Doorzoek de Compiz Core opties" msgid "Error" msgstr "Fout" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Voer een filter in.\n" "Klik op de toetsenbord afbeelding om een toets te selecteren waarop wordt " "gezocht." msgid "Search in..." msgstr "Zoeken in..." #. Options msgid "Short description and name" msgstr "Korte beschrijving en naam" msgid "Long description" msgstr "Lange beschrijving" msgid "Settings value" msgstr "Instellingswaarde" msgid "Group" msgstr "Groep" msgid "Subgroup" msgstr "Subgroep" #. Notebook msgid "Settings" msgstr "Instellingen" # --- mahler: Het is waarschijnlijk dat dit een laadmelding is. msgid "Loading Advanced Search" msgstr "Laden geavanceerd zoeken" msgid "Add a New Profile" msgstr "Voeg nieuw profiel toe" msgid "Remove This Profile" msgstr "Verwijder dit profiel" msgid "Default" msgstr "Standaard" msgid "Profile" msgstr "Profiel" msgid "Import" msgstr "Importeren" msgid "Import a CompizConfig Profile" msgstr "Importeer een CompizConfig profiel" msgid "Import as..." msgstr "Importeer als..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importeer een CompizConfig profiel als nieuw profiel" msgid "Export" msgstr "Exporteren" msgid "Export your CompizConfig Profile" msgstr "Exporteer je CompizConfig profiel" msgid "Reset to defaults" msgstr "Standaard waarden herstellen" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "CompizConfig profiel herstellen naar standaardwaarden" msgid "Backend" msgstr "Onderliggend systeem" msgid "Integration" msgstr "Integratie" msgid "Enable integration into the desktop environment" msgstr "Intergratie met de desktop omgeving aanzetten" msgid "Profiles (*.profile)" msgstr "Profielen (*.profile)" msgid "All files" msgstr "Alle bestanden" msgid "Save file.." msgstr "Bestand opslaan.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Wil je de standaard instellingen overslaan tijdens het exporteren van je " "profiel" msgid "Open file.." msgstr "Open bestand.." msgid "Enter a profile name" msgstr "Geef een profiel naam" msgid "Please enter a name for the new profile:" msgstr "Geef een naam voor het nieuwe profiel:" msgid "Backend not found." msgstr "Onderliggend systeem niet gevonden." #. Auto sort msgid "Automatic plugin sorting" msgstr "Plugins automatisch sorteren" msgid "Disabled Plugins" msgstr "Plugins uitschakelen" msgid "Enabled Plugins" msgstr "Ingeschakelde plugins" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Weet je het zeker dat je het automatisch sorteren van plugins uit wilt " "zetten. Dit zet tevens de conflict waarschuwing uit. Doe dit alleen als je " "weet waarmee je bezig bent." msgid "Add plugin" msgstr "Plugin toevoegen" msgid "Plugin name:" msgstr "Naam plugin:" msgid "Insert plugin name" msgstr "Invoeren naam plugin" msgid "Preferences" msgstr "Voorkeuren" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configureer het onderliggend systeem, profielen en overige interne " "instellingen via het Compiz Configuratie Systeem." msgid "About" msgstr "Info" msgid "About CCSM..." msgstr "Info over CCSM..." msgid "Profile & Backend" msgstr "Profiel & onderliggend systeem" msgid "Plugin List" msgstr "Lijst plugins" msgid "Filter your Plugin list" msgstr "Filter je plugin lijst" #, python-format msgid "Screen %i" msgstr "Scherm %i" msgid "Screen" msgstr "Scherm" msgid "Category" msgstr "Categorie" msgid "Advanced Search" msgstr "Geavanceerd zoeken" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Geen overeenkomsten gevonden. \n" "\n" " Uw filter \"%s\" komt op geen enkel punt overeen." msgid "Configure Compiz with CompizConfig" msgstr "Beheer Compiz in met CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "" #~ "Bezig met berekenen van mogelijke conflicten. Een ogenblik geduld a.u.b." #~ msgid "Value (%s)" #~ msgstr "Waarde (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Waarde (%(value)s) voor %(setting)s:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Niet afgehandelde type lijst %s for %s" #~ msgid "Actions" #~ msgstr "Acties" #~ msgid "Name" #~ msgstr "Naam" #~ msgid "Screen Edge" #~ msgstr "Scherm rand" #~ msgid "Button %i" #~ msgstr "Knop %i" #~ msgid "Edge Button" #~ msgstr "Rand knop" #~ msgid "On System Bell" #~ msgstr "Bij systeem melding" #~ msgid "Edit Action: %s" #~ msgstr "Wijzig actie: %s" #~ msgid "Screen Edges" #~ msgstr "Scherm randen" #~ msgid "Reset To Defaults" #~ msgstr "Standaardwaarden herstellen" ./compizconfig/ccsm/po/mnk.po0000644000004100000410000003126713246301623016433 0ustar www-datawww-data# CompizConfig Mandingo translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Werner Landgraf # Por falta de ortografia oficial, uso essentialmente àquela de: # Carreira, António: Mandingas da Guiné Portuguesa. Bissão 1947 # mas substituo dj -> j ; j -> y . # Sonderzeichen ã,õ,ĩ,ẽ,ũ,ñ die auch nachfolgendes ŋ einschließen # Palavras que não sei, coloquei em português. # iconv -t UTF-8 *.pot > *.po ; msgfmt -cv *.po msgid "" msgstr "" "Project-Id-Version: md-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 12:33+0530\n" "PO-Revision-Date: 2007-09-24 23:00-0300\n" "Last-Translator: Werner Landgraf \n" "Language-Team: Mandingo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Dorão %(plugin)s -la kêebaarão %(action)s -la da %(binding)s a-" "ualita dorão %(plugin_conflict)s -la kêbarão %(action_conflict)s le ti.Fa i lafita dorão %(plugin_conflict)s -la kêbarão %" "(action_conflict)s dubẽna ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s dubẽna ..." #, python-format msgid "Don't set %(action)s" msgstr "Kanna %(action)s malãdi !" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s malãdi jiko-o-jiko !" #, fuzzy msgid "key" msgstr "teclado-la Botão" #, fuzzy msgid "button" msgstr "niño-la botão" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "I ka kitindila dorão %(plugin)s -lu-la kêebaarão %(feature)s " "naffala.\n" "Ñĩ dorão, a-dubẽta.\n" "Fa i lafta %(plugin)s malãdila, fo i a naffa nola?" #, fuzzy, python-format msgid "Use %(feature)s" msgstr "Kanna %(feature)s malãdi !" #, fuzzy, python-format msgid "Don't use %(feature)s" msgstr "Kanna %(feature)s malãdi !" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "I ka kitindila dorão %(plugin)s -lu-la kêebaarão %(feature)s " "naffala.\n" "Ñĩ dorão, a-dubẽta.\n" "Fa i lafta %(plugin)s malãdila, fo i a naffa nola?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s malãdi bã !" #, python-format msgid "Don't enable %(feature)s" msgstr "Kanna %(feature)s malãdi !" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Dorão %(plugin_conflict)s çãba nã kêbarão %(feature)s le mim " "çãba nã dorão %(plugin)s fanã. Ñĩ a-ualita." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s dubẽ bã !" #, python-format msgid "Don't enable %(plugin)s" msgstr "Kanna %(plugin)s malãdi ! " #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Dorão-lu %(plugin_conflict)s anĩ %(plugin)s a-ualita." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "Dorão-lu %(plugin)s çohla %(feature)s le ti, mim çãbãdi nã " "dorão-lu:\n" " %(plugin_list)s" msgid "Enable these plugins" msgstr "ñĩ dorão-lu malãdi bã !" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "Dorão-lu %(plugin)s, dorão %(require)s çohla." #, python-format msgid "Enable %(require)s" msgstr "%(require)s malãdi bã !" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "Dorão %(plugin)s , kêbarão %(feature)s çãba nã mim çohlãdi " "dorão-lu %(plugin_list)s." msgid "Disable these plugins" msgstr "dorão-lu ñĩ, dubẽ bã !" #, python-format msgid "Don't disable %(plugin)s" msgstr "Dorão-lu %(plugin)s, kanna dubẽ !" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "Dorão-lu %(plugin_list)s, dorão-lu %(plugin)s çohla." msgid "General" msgstr "Tilĩdĩo" msgid "Accessibility" msgstr "çônêa" msgid "Desktop" msgstr "bẽtãdĩo" msgid "Extras" msgstr "lãkãolu" msgid "Window Management" msgstr "mãçã-parãterolu" msgid "Effects" msgstr "kêeolu" msgid "Image Loading" msgstr "natalolu çãbala nã ..." msgid "Utility" msgstr "dorão" msgid "All" msgstr "bê" msgid "Uncategorized" msgstr "çifa-tão" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "da-tillĩdĩolu çêĩdila ..." msgid "Edit" msgstr "çaferola ..." msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Jã, i fẽ tõbonna anĩ çaferola nole" #, python-format msgid "Edit %s" msgstr " %s çafe !" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" a-mãbetêa" # msgid "Disabled" msgstr "a-dubẽta" # msgid "Enabled" msgstr "a-malãta" msgid "Grab key combination" msgstr "teclado -la butão-lu la kafo tõbõ !" #, python-format msgid "\"%s\" is not a valid button" msgstr "Mo a mã butão \"%s\" naffa nole !" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "I butão-1 naffa jã, ñĩ tanolu çãba nã nole. Fa i lafta \"%s\" naffala kõmko " "butão-1 ñãoñã ? " #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" koofo mãçotto !" msgid "None" msgstr "Hanni fẽ" msgid "CompizConfig Settings Manager" msgstr "CompizConfig compiz -la tillĩdirão leti" #, fuzzy msgid "Plugin" msgstr "dorãolu" msgid "Please press the new key combination" msgstr "teclado -la butão-lu la kafo mim a-tõbõta, diki bã !" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" #, fuzzy msgid "Window Name" msgstr "mãçã-parãterolu" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value #, fuzzy msgid "Value" msgstr "da (%s)" msgid "Grab" msgstr "" #. Relation #, fuzzy msgid "Relation" msgstr "mábôko" #. Invert msgid "Invert" msgstr "" #, fuzzy msgid "Browse..." msgstr "ñininna katuko : ... " msgid "Images" msgstr "natalolu" msgid "File" msgstr "kaito" msgid "Open directory..." msgstr "kaito-lu-la kulũo iêlela ..." msgid "Open file..." msgstr "kaito iêlela ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Ñĩ, CompizConfig mu compiz -la tillĩdirão, le ti :). " msgid "translator-credits" msgstr "kãaçorrla: Werner Landgraf " msgid "An error has occured" msgstr "tano çoto !" msgid "Warning" msgstr "I hakilto !" #, python-format msgid "Enable %s" msgstr " %s malã bã !" msgid "Filter" msgstr "tombõdão" #, python-format msgid "Search %s Plugin Options" msgstr "Dorão %s -la tõbõdãolu ñinnĩla ... " msgid "Use This Plugin" msgstr "Dorão ñĩ naffa bã !" msgid "Search Compiz Core Options" msgstr "CompizCore -la tõbõdãolu ñinnĩla ... " msgid "Error" msgstr "tano !" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "jubela ... kono : " #. Options msgid "Short description and name" msgstr "farãfãço anĩ to:" msgid "Long description" msgstr "farãfãço ba:" msgid "Settings value" msgstr "Da:" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "Dalu" #, fuzzy msgid "Loading Advanced Search" msgstr "ñinnĩarla ba ..." msgid "Add a New Profile" msgstr "Dokuo-la kêeña kotoma kefũna ..." msgid "Remove This Profile" msgstr "Dokuo-la kêeña dubẽna ..." msgid "Default" msgstr "da a-tillĩdĩ" msgid "Profile" msgstr "Dokuo-la kêeña" msgid "Import" msgstr "çãbala nã ..." msgid "Import a CompizConfig Profile" msgstr "dokuo-la kêeñão CompizConfig -ya çãbala nã ..." # msgid "Import as..." msgstr "çãbala nã kõmko ..." # msgid "Import a CompizConfig Profile as a new profile" msgstr "çãba nã dokuo-la kêeñão a-kotama CompizConfig -ya le ..." msgid "Export" msgstr "çãba jêe ..." msgid "Export your CompizConfig Profile" msgstr "çãba jê i-la dokuo-la kêeñão CompizConfig -ya le ..." # msgid "Reset to defaults" msgstr "da-lu tilĩdĩolu çêĩdila ..." # msgid "Reset your CompizConfig Profile to the global defaults" msgstr "i-la dokuo-la kêeñão CompizConfig-ña -la da-lu tilĩdĩolu çêĩdi ... " msgid "Backend" msgstr "programa kono" msgid "Integration" msgstr "mábôko" msgid "Enable integration into the desktop environment" msgstr "mábôko bẽtãdĩo kono malãdi !" msgid "Profiles (*.profile)" msgstr "dokuola kêeño-lu (*.profile)" msgid "All files" msgstr "kaitalu bê" msgid "Save file.." msgstr "kaito mabôla ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "kaito iêlela .." msgid "Enter a profile name" msgstr "dokuola kêeño tõbõ bã !" msgid "Please enter a name for the new profile:" msgstr "dokuola kêeño a-kotama -la to çafe !" msgid "Backend not found." msgstr "programma mãçotto ! :(" #. Auto sort msgid "Automatic plugin sorting" msgstr "dorão-lu ke kurĩna ..." msgid "Disabled Plugins" msgstr "dorão-lu a-dubẽta:" msgid "Enabled Plugins" msgstr "dorão-lu a-malãta:" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "dorão kafũna ..." msgid "Plugin name:" msgstr "dorão-la to:" msgid "Insert plugin name" msgstr "dorão-la to çafê !" msgid "Preferences" msgstr "tõbõkelu" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "programa, dokuola kêeño-lu, anĩ dokuo-la dalu, mim CompizConfig ka naffa le " "kono-ya, tillĩdĩdirĩla ..." msgid "About" msgstr "... dũ" msgid "About CCSM..." msgstr "CCSM dũ" msgid "Profile & Backend" msgstr "programma & dokuola kêeño kono" msgid "Plugin List" msgstr "dorãolu" msgid "Filter your Plugin list" msgstr "I i-la dorão-lu tombõ bã !" #, python-format msgid "Screen %i" msgstr "Telha %i" msgid "Screen" msgstr "Telha" msgid "Category" msgstr "çifo" msgid "Advanced Search" msgstr "ñinnĩarla ba ..." #, fuzzy, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Hanni fẽ a-ñinnĩta. \n" " \n" " Feñ kommko \"%s\" mã çotto." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "jubela fa tanolu sotto ... , batu domãdĩ !" #~ msgid "Value (%s)" #~ msgstr "da (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s -la da, (%(value)s) le ti." #~ msgid "Unhandled list type %s for %s" #~ msgstr " %s a mã naffa nole komko %s" #~ msgid "Actions" #~ msgstr "kêebaarolu" #~ msgid "Disable %s" #~ msgstr " dubẽna ... " #~ msgid "Name" #~ msgstr "To" #~ msgid "Screen Edge" #~ msgstr "tele-la koofo" #~ msgid "Button %i" #~ msgstr "niño-la Butão %i" #~ msgid "Edge Button" #~ msgstr "tele-la koofo -la butão" #~ msgid "On System Bell" #~ msgstr "Talão-la kumo -la tumo" #~ msgid "Edit Action: %s" #~ msgstr "kêebarão %s fãdi ! " #~ msgid "Screen Edges" #~ msgstr "tele-la koofo-lu" #~ msgid "Reset To Defaults" #~ msgstr "da-tillĩdĩolu çêĩdila ..." ./compizconfig/ccsm/po/bn.po0000644000004100000410000004110013246301623016230 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-01-03 02:28+0100\n" "Last-Translator: Mahdee Jameel \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s প্লাগইন এর %(action)s কাজের জন্য নতুন মান %(binding)s " "ব্যবহৃত হবে,\n" "কিন্তু এটি %(plugin_conflict)s প্লাগইন এর %(action_conflict)s এর " "সাথে সাংঘর্ষিক।\n" "আপনি কি %(plugin_conflict)s প্লাগইন এর জন্য %(action_conflict)s " "কে নিষ্ক্রীয় করতে চান?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s কে নিষ্ক্রীয় করো" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s কে বহাল করো না" #, python-format msgid "Set %(action)s anyway" msgstr "যেভাবে হোক %(action)s কে বহাল করো" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "আপনি %(feature)s ব্যব‌হার ক‌রতে চাচ্ছেন।এটির জন্য %(plugin)s " "প্রয়োজন.\n" "যা বর্তমানে নিষ্ক্রীয় আছে.\n" "আপনি কি %(plugin)s কে সক্রিয় করতে চান?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s কে সক্রিয় করো" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s কে সক্রিয় করো না" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "আপনি %(feature)s ব্যব‌হার ক‌রতে চাচ্ছেন।এটির জন্য %(plugin)s " "প্রয়োজন.\n" "যা বর্তমানে নিষ্ক্রীয় আছে.\n" "আপনি কি %(plugin)s কে সক্রিয় করতে চান?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s কে সক্রিয় করো" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s কে সক্রিয় করো না" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s প্লাগইন %(feature)s কাজ করে। %(plugin)s একই কাজ করে" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s কে নিষ্ক্রীয় করো" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s কে সক্রিয় করো না" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s এর সাথে %(plugin)s এর সংঘর্ষ হচ্ছে" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s এর জন্য %(feature)s প্রয়োজন,যা পাওয়া যাবে নিচের " "প্লাগইন থেকে:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "এই প্লাগইন গুলো সক্রিয় করো" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s এর জন্য %(require)s প্লাগইন দরকার হবে " #, python-format msgid "Enable %(require)s" msgstr "%(require)s কে সক্রিয় করো" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s প্লাগইন এর জন্য %(feature)s লাগবে, যা %" "(plugin)s দিয়ে করা হয়" msgid "Disable these plugins" msgstr "এই প্লাগইন গুলো নিষ্ক্রীয় করো" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s কে নিষ্ক্রীয় করো না" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin_list)s এর জন্য %(plugin)s দরকার হবে" msgid "General" msgstr "সাধারন" msgid "Accessibility" msgstr "প্রবেশযোগ্যতা" msgid "Desktop" msgstr "ডেস্কটপ" msgid "Extras" msgstr "অতিরিক্ত" msgid "Window Management" msgstr "উইন্ডো পরিচালনা" msgid "Effects" msgstr "প্রভাবগুলি" msgid "Image Loading" msgstr "চিত্র লোড করছে" msgid "Utility" msgstr "উপযোগিতা" msgid "All" msgstr "সব" msgid "Uncategorized" msgstr "সাজানো হয়নি" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "মূল মানে ফিরে যাও" msgid "Edit" msgstr "সম্পাদনা" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "অনেক্গুলো পছন্দ।আপনার কোন পছন্দ সম্পাদন করতে হলে ওই সারিতে ক্লিক করুন" #, python-format msgid "Edit %s" msgstr "%s কে সম্পাদনা" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" লিন্ক টি ভুল" msgid "Disabled" msgstr "নিষ্ক্রিয়" msgid "Enabled" msgstr "সক্রিয়" msgid "Grab key combination" msgstr "চাবি ঠিক করুন" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" বাটন হিসেবে গ্রহণযোগ্য নয়" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "সাথে আর কোন কী ছাড়া বাম বাটন ব্যবহার করলে আপনি আর অন্য কাজে লেফট ক্লিক ব্যবহার " "করতে পারবেন নাআপনি কি আসলেই \"%s\" হিসেবে বাম বাটন ব্যবহার করতে চান?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" কোনার মাস্ক হিসেবে গ্রহণযোগ্য নয়" msgid "None" msgstr "কোনটাই না" msgid "CompizConfig Settings Manager" msgstr "কমপিজ কনফিগ ব্যবস্থাপক" #, fuzzy msgid "Plugin" msgstr "প্লাগইন এর তালিকা" msgid "Please press the new key combination" msgstr "নতুন কীগুলো চাপুন" msgid "Window Title" msgstr "উইন্ডো শীর্ষ" msgid "Window Role" msgstr "উইন্ডোর ভূমিকা" msgid "Window Name" msgstr "উইন্ডোর নাম" msgid "Window Class" msgstr "উইন্ডোর শ্রেণী" msgid "Window Type" msgstr "উইন্ডোর ধরণ" msgid "Window ID" msgstr "উইন্ডোর ID" msgid "And" msgstr "এবং" msgid "Or" msgstr "অথবা" msgid "Edit match" msgstr "মিলগুলি সম্পাদন করা" #. Type msgid "Type" msgstr "প্রকার" #. Value msgid "Value" msgstr "মান" msgid "Grab" msgstr "ধরা" #. Relation msgid "Relation" msgstr "সম্পর্ক" #. Invert msgid "Invert" msgstr "উল্টানো" #, fuzzy msgid "Browse..." msgstr "খুজে দেখুন" msgid "Images" msgstr "ছবি" msgid "File" msgstr "ফাইল" msgid "Open directory..." msgstr "ডিরেক্টরি খুলুন" msgid "Open file..." msgstr "ফাইল খুলুন" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "এটি হলো কমপিজ এর পছন্দ ঠিক করার জায়গা" msgid "translator-credits" msgstr "অনুবাদ করেছেন" msgid "An error has occured" msgstr "একটা সমস্যা হয়েছে" msgid "Warning" msgstr "সতর্কতাবাণী" #, python-format msgid "Enable %s" msgstr "%s কে সক্রিয় করো" msgid "Filter" msgstr "ছাকা" #, python-format msgid "Search %s Plugin Options" msgstr "%s প্লাগইন এর পছন্দ খোজো" msgid "Use This Plugin" msgstr "এই প্লাগইন ব্যবহার করো" msgid "Search Compiz Core Options" msgstr "কমপিজ কোর এর পছন্দ এর মধ্যে খোজো" msgid "Error" msgstr "সমস্যা" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "এর মধ্যে খোজো" #. Options msgid "Short description and name" msgstr "সংক্ষিপ্ত নাম ও বিবরণ" msgid "Long description" msgstr "সম্পূর্ণ বিবরন" msgid "Settings value" msgstr "পছন্দের মান" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "পছন্দ" #, fuzzy msgid "Loading Advanced Search" msgstr "উন্নত অনুসন্ধান" msgid "Add a New Profile" msgstr "নতুন প্রোফাইল যোগ করুন" msgid "Remove This Profile" msgstr "এই প্রোফাইল সরিয়ে ফেলো" msgid "Default" msgstr "মূল মান" msgid "Profile" msgstr "প্রোফাইল" msgid "Import" msgstr "আমদানি" msgid "Import a CompizConfig Profile" msgstr "কমপিজ কনফিগ এর প্রোফাইল আমদানি করো" msgid "Import as..." msgstr "বিশেষভাবে আম্দানি করো" msgid "Import a CompizConfig Profile as a new profile" msgstr "কমপিজ কনফিগ এর প্রোফাইল নতুন প্রোফাইল হিসেবে আমদানি করো" msgid "Export" msgstr "রপ্তানি" msgid "Export your CompizConfig Profile" msgstr "আপনার কমপিজ কনফিগ এর প্রোফাইল রপ্তানি করুন" msgid "Reset to defaults" msgstr "মূল মানে ফেরৎ নাও" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "আপনার কমপিজ কনফিগ এর প্রোফাইল মূল মানে ফেরৎ নিন" msgid "Backend" msgstr "ব্যাকএন্ড" msgid "Integration" msgstr "মিশে যাওয়া" msgid "Enable integration into the desktop environment" msgstr "ডেস্কটপের পরিবেশের সাথে মিশে যাবে" msgid "Profiles (*.profile)" msgstr "প্রোফাইল (*.profile)" msgid "All files" msgstr "সব ফাইল" msgid "Save file.." msgstr "ফাইল সংরক্ষণ করুন" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "আপনার প্রোফাইল প্রেরণ করার সময় আপনি কি সত্যিই প্রথাস্বরূপ বিকল্পের মূল্যগুলি বাদ দিয়ে " "যেতে চান?" msgid "Open file.." msgstr "ফাইল খুলুন" msgid "Enter a profile name" msgstr "প্রোফাইলের নাম ঠিক করুন" msgid "Please enter a name for the new profile:" msgstr "নতুন প্রোফাইলের নাম ঠিক করুনঃ" msgid "Backend not found." msgstr "ব্যকএন্ড পাওয়া যায়নি" #. Auto sort msgid "Automatic plugin sorting" msgstr "স্বয়ংক্রিয় প্লাগইন সাজানো" msgid "Disabled Plugins" msgstr "নিষ্ক্রিয় প্লাগইন" msgid "Enabled Plugins" msgstr "সক্রিয় প্লাগইন" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "আপনি কি স্বয়ংক্রিয়ভাবে প্লাগইন সঞ্চয়ের বৈশিষ্ট্যটি অসমর্থ করতে চান ? এটি করা হলে " "দ্বন্দ পরিচালনার কাজটি ব্যাহত হবে. আপনি কি করতে যাচ্ছেন তা যদি আপনার জানা থাকে " "তাহলে আপনি এটা করতে পারেন." msgid "Add plugin" msgstr "প্লাগইন যোগ করুন" msgid "Plugin name:" msgstr "প্লাগইন এর নামঃ" msgid "Insert plugin name" msgstr "প্লাগইন এর নাম লিখুন" msgid "Preferences" msgstr "আনুকূল্য" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "কমপিজ কনফিগারেশন এর ব্যবহৃত প্রোফাইল,ব্যকএন্ড ও অভ্যন্তরীন পছন্দ এর মান ঠিক করুন" msgid "About" msgstr "পরিচিতি" msgid "About CCSM..." msgstr "সিসিএসএম পরিচিতি" msgid "Profile & Backend" msgstr "প্রোফাইল ও ব্যকএন্ড" msgid "Plugin List" msgstr "প্লাগইন এর তালিকা" msgid "Filter your Plugin list" msgstr "আপনার প্লাগইন তালিকা ছাকুন" #, python-format msgid "Screen %i" msgstr "পর্দার %i" msgid "Screen" msgstr "পর্দা" msgid "Category" msgstr "শ্রেণী" msgid "Advanced Search" msgstr "উন্নত অনুসন্ধান" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "এরকম কিছু পাওয়া যায়নি. \n" "\n" " আপনার ছাকুনি \"%s\" এর সাথে মিলওয়ালা কোন কিছু পাওয়া যায়নি." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "সম্ভাব্য সংঘর্ষ হিসাব করা হচ্ছে।অনুগ্রহ করে অপেক্ষা করুন" #~ msgid "Value (%s)" #~ msgstr "মান (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s এর জন্য মান (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s হলো %s এর জন্য অপরিচালিত তালিকা" #~ msgid "Actions" #~ msgstr "কাজ" ./compizconfig/ccsm/po/zh_CN.po0000644000004100000410000003001013246301623016630 0ustar www-datawww-data# translation of zh_CN-ccsm.po to Chinese # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Thruth , 2007 # msgid "" msgstr "" "Project-Id-Version: zh_CN-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-11-07 20:05+0100\n" "Last-Translator: JING Cheng \n" "Language-Team: Chinese\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(binding)s组合%(action)s动作的新值在%(plugin)s插件中与%" "(plugin_conflict)s插件中的动作%(action_conflict)s相冲突。\n" "您要禁用%(plugin_conflict)s插件中的%(action_conflict)s吗?" #, python-format msgid "Disable %(action_conflict)s" msgstr "禁用%(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "不要设置%(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "强制设置%(action)s" msgid "key" msgstr "按键" msgid "button" msgstr "按钮" msgid "edge" msgstr "边缘" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "您试图使用%(feature)s功能,而该功能被任何插件所支持。\n" "您仍然希望尝试使用此功能吗?" #, python-format msgid "Use %(feature)s" msgstr "使用%(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "不使用%(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "您试图使用%(feature)s功能,该功能由%(plugin)s插件提供。\n" "该插件目前被禁用。\n" "您仍然希望启用%(plugin)s插件以实现功能吗?" #, python-format msgid "Enable %(plugin)s" msgstr "启用插件%(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "不要启用%(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "插件%(plugin)s中的一些按键组合%(bindings)s与其它插件产生了冲突。您是否" "想要解决这些冲突?" msgid "Resolve conflicts" msgstr "解决冲突" msgid "Ignore conflicts" msgstr "忽略冲突" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s插件提供%(feature)s功能,该功能也可以由%" "(plugin)s提供" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "禁用%(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "不要启用插件%(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "插件%(plugin_conflict)s%(plugin)s冲突。" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s需要%(feature)s功能,可以由下列插件提供:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "启用这些插件" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s需要%(require)s插件。" #, python-format msgid "Enable %(require)s" msgstr "启用%(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s插件需要%(plugin)s提供的%(feature)s功能。" msgid "Disable these plugins" msgstr "禁用这些插件" #, python-format msgid "Don't disable %(plugin)s" msgstr "不要禁用%(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "插件%(plugin)s被插件%(plugin_list)s需要。" msgid "General" msgstr "常规" msgid "Accessibility" msgstr "辅助功能" msgid "Desktop" msgstr "桌面" msgid "Extras" msgstr "附加功能" msgid "Window Management" msgstr "窗口管理" msgid "Effects" msgstr "特效" msgid "Image Loading" msgstr "图像加载" msgid "Utility" msgstr "工具" msgid "All" msgstr "全部" msgid "Uncategorized" msgstr "未分类" msgid "N/A" msgstr "无" msgid "Reset setting to the default value" msgstr "重置为默认值" msgid "Edit" msgstr "编辑" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "多选列表设置。你可以双击一行对该值进行编辑。" #, python-format msgid "Edit %s" msgstr "编辑%s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\"不是一个有效的快捷键" msgid "Disabled" msgstr "已禁用" msgid "Enabled" msgstr "已启用" msgid "Grab key combination" msgstr "获取按键组合" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\"不是一个有效的按键" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "在不使用修正键的情况下使用按键1会导致所有的左键点击失灵从而中断您的配置。你真" "的想要把\"%s\"设置到按键1上吗?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "边缘蒙板\"%s\"无效" msgid "None" msgstr "无" msgid "CompizConfig Settings Manager" msgstr "CompizConfig设置管理器" msgid "Plugin" msgstr "插件" msgid "Please press the new key combination" msgstr "请按下新按键组合" msgid "Window Title" msgstr "窗口标题" msgid "Window Role" msgstr "窗口角色" msgid "Window Name" msgstr "窗口名称" msgid "Window Class" msgstr "窗口类别" msgid "Window Type" msgstr "窗口类型" msgid "Window ID" msgstr "窗口ID" msgid "And" msgstr "和" msgid "Or" msgstr "或" msgid "Edit match" msgstr "编辑匹配" #. Type msgid "Type" msgstr "类型" #. Value msgid "Value" msgstr "值" msgid "Grab" msgstr "抓取" #. Relation msgid "Relation" msgstr "关系" #. Invert msgid "Invert" msgstr "反向" msgid "Browse..." msgstr "浏览..." msgid "Images" msgstr "图像" msgid "File" msgstr "文件" msgid "Open directory..." msgstr "打开目录..." msgid "Open file..." msgstr "打开文件..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "这是一个针对CompizConfig配置系统的设置管理器" msgid "translator-credits" msgstr "译者" msgid "An error has occured" msgstr "产生了一个错误" msgid "Warning" msgstr "警告" #, python-format msgid "Enable %s" msgstr "启用%s" msgid "Filter" msgstr "关键字" #, python-format msgid "Search %s Plugin Options" msgstr "搜索%s插件选项" msgid "Use This Plugin" msgstr "使用此插件" msgid "Search Compiz Core Options" msgstr "搜索Compiz Core选项" msgid "Error" msgstr "错误" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "输入过滤条件。\n" "以按下的键盘上的键进行搜索。" msgid "Search in..." msgstr "于...中寻找" #. Options msgid "Short description and name" msgstr "简短描述和名称" msgid "Long description" msgstr "具体描述" msgid "Settings value" msgstr "设置值" msgid "Group" msgstr "组" msgid "Subgroup" msgstr "子组" #. Notebook msgid "Settings" msgstr "设置" msgid "Loading Advanced Search" msgstr "加载高级搜索" msgid "Add a New Profile" msgstr "添加新存档" msgid "Remove This Profile" msgstr "删除此存档" msgid "Default" msgstr "默认" msgid "Profile" msgstr "存档" msgid "Import" msgstr "导入" msgid "Import a CompizConfig Profile" msgstr "导入一个CompizConfig存档" msgid "Import as..." msgstr "做为…导入" msgid "Import a CompizConfig Profile as a new profile" msgstr "导入一个CompizConfig存档作为新的存档" msgid "Export" msgstr "导出" msgid "Export your CompizConfig Profile" msgstr "导出你的CompizConfig存档" msgid "Reset to defaults" msgstr "重置到默认" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "重置你的CompizConfig存档到全局默认" msgid "Backend" msgstr "后端" msgid "Integration" msgstr "整合" msgid "Enable integration into the desktop environment" msgstr "开启与桌面环境的整合" msgid "Profiles (*.profile)" msgstr "存档 (*.profile)" msgid "All files" msgstr "所有文件" msgid "Save file.." msgstr "保存文件.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "您想在导出存档时忽略默认设置吗?" msgid "Open file.." msgstr "打开文件.." msgid "Enter a profile name" msgstr "输入存档名称" msgid "Please enter a name for the new profile:" msgstr "请输入一个新存档名称:" msgid "Backend not found." msgstr "未找到后端程序。" #. Auto sort msgid "Automatic plugin sorting" msgstr "插件自动排序" msgid "Disabled Plugins" msgstr "已禁用插件" msgid "Enabled Plugins" msgstr "已启用插件" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "您真的想禁用插件自动排序吗?这将同时禁用冲突检测。如果您明确知道您将导致的结" "果,方可继续。" msgid "Add plugin" msgstr "添加插件" msgid "Plugin name:" msgstr "插件名称:" msgid "Insert plugin name" msgstr "插入插件名称" msgid "Preferences" msgstr "首选项" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "配置Conpiz配置系统使用的后端、存档以及其它内部设定。" msgid "About" msgstr "关于" msgid "About CCSM..." msgstr "关于CCSM…" msgid "Profile & Backend" msgstr "存档和后端" msgid "Plugin List" msgstr "插件列表" msgid "Filter your Plugin list" msgstr "过滤你的插件列表" #, python-format msgid "Screen %i" msgstr "屏幕%i" msgid "Screen" msgstr "屏幕" msgid "Category" msgstr "类别" msgid "Advanced Search" msgstr "高级搜索" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "未找到匹配项。 \n" "\n" "你的过滤条件\"%s\"未匹配任何条目。" msgid "Configure Compiz with CompizConfig" msgstr "使用CompizConfig对Compiz进行配置" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "正在计算可能存在的冲突,请稍候" #~ msgid "Value (%s)" #~ msgstr "值 (%s)" #, fuzzy #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "值 (%s) 于 %s:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "未处理的列表类型 %s 于 %s" #~ msgid "Actions" #~ msgstr "动作" #~ msgid "PyGtk 2.10.0 or later required" #~ msgstr "需要 PyGtk 2.10.0或更新版本" #~ msgid "Multi-list settings" #~ msgstr "多列表设置" #~ msgid "Name" #~ msgstr "名称" #~ msgid "Screen Edge" #~ msgstr "屏幕边缘" #~ msgid "On System Bell" #~ msgstr "基于系统铃声" #~ msgid "Edit Action: %s" #~ msgstr "编辑动作: %s" #~ msgid "Screen Edges" #~ msgstr "屏幕边缘" #~ msgid "Backend & Profile" #~ msgstr "后端 & 存档" ./compizconfig/ccsm/po/POTFILES.in0000644000004100000410000000022113246301623017045 0ustar www-datawww-dataccm/Conflicts.py ccm/Constants.py.in ccm/Settings.py ccm/Window.py ccm/Widgets.py ccm/Pages.py ccm/Utils.py ccm/__init__.py ccsm ccsm.desktop.in ./compizconfig/ccsm/po/hu.po0000644000004100000410000003244313246301623016257 0ustar www-datawww-data# translation of hu.po to hungarian # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Karoly Gossler , 2007. # KAMI911 , 2007-2008. msgid "" msgstr "" "Project-Id-Version: hu\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-25 09:07+0100\n" "Last-Translator: KAMI \n" "Language-Team: hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "A(z) %(binding)s összerendelés a(z) %(plugin)s bővítményben lévő, a" "(z) %(action)s művelethez rendelt új értéke összeférhetetlen a(z) %" "(plugin_conflict)s bővímény %(action_conflict)s műveletével.\n" "Le kívánja tiltani a(z) %(plugin_conflict)s bővítmény %" "(action_conflict)s műveletét?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s letiltása" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s mellőzése" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s beállítása" msgid "key" msgstr "Billentyű" msgid "button" msgstr "Gomb" msgid "edge" msgstr "Szegély" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Olyan %(feature)s funkciót kíván használatba venni, amelyet semelyik " "bővítmény nem tud kiszolgálni. Ennek ellenére engedélyezni kívánja " "ezt a funkciót?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s használata" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s mellőzése" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Olyan %(feature)s funkciót kíván használatba venni, amelyet a(z) %" "(plugin)s bővítmény szolgáltat.\n" "Ez a bővítmény jelenleg le van tiltva.\n" "Kívánja engedélyezni a(z) %(plugin)s bővítményt?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s engedélyezése" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s mellőzése" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "A(z) %(plugin)s bővítmény néhány kötése: %(bindings)s " "összeférhetetlen egyéb bővítményekkel. Meg kívánja oldani ezeket az " "összeférhetetlenségeket?" msgid "Resolve conflicts" msgstr "Összeférhetetlenség megoldása" msgid "Ignore conflicts" msgstr "Mellőzés" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "A(z) %(plugin_conflict)s bővítmény biztosítja a(z) %(feature)s " "funkciót. Ezt a funkciót a(z) %(plugin)s bővítmény is biztosítja." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s letiltása" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s mellőzése" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "A(z) %(plugin_conflict)s bővítmény összeférhetetlen a(z) %(plugin)" "s bővítménnyel." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "A(z) %(plugin)s bővítmény igényli a(z) %(feature)s funkciót. " "Ezt a funkciót az alábbi bővítmények biztosítják:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Következő bővítmények engedélyezése" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "A(z) %(plugin)s szükséges a(z) %(require)s bővítmény számára." #, python-format msgid "Enable %(require)s" msgstr "%(require)s engedélyezése" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "A(z) %(plugin)s bővítmény biztosítja a(z) %(feature)s " "funkciót. Ezt a funkciót az alábbi bővítmények igényelik:\n" "%(plugin_list)s" msgid "Disable these plugins" msgstr "Következő bővítmények tiltása" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s engedélyezése" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "A(z) %(plugin)s bővítmény szükséges a(z) %(plugin_list)s " "bővítmények számára." msgid "General" msgstr "Általános" msgid "Accessibility" msgstr "Akadálymentesítés" msgid "Desktop" msgstr "Asztal" msgid "Extras" msgstr "Extrák" msgid "Window Management" msgstr "Ablakkezelés" msgid "Effects" msgstr "Effektusok" msgid "Image Loading" msgstr "Képbetöltés" msgid "Utility" msgstr "Eszközök" msgid "All" msgstr "Összes" msgid "Uncategorized" msgstr "Nem kategorizált" msgid "N/A" msgstr "Nem elérhető" msgid "Reset setting to the default value" msgstr "Alapértelmezett beállítás visszaállítása" msgid "Edit" msgstr "Szerkesztés" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Többlistás beállítások. Kattintson duplán a sorokra az értékek " "szerkesztéséhez." #, python-format msgid "Edit %s" msgstr "%s szerkesztése" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "„%s” nem érvényes gyorsbillentyű" msgid "Disabled" msgstr "Letiltva" msgid "Enabled" msgstr "Engedélyezve" msgid "Grab key combination" msgstr "Billentyűzetkombináció megadása" #, python-format msgid "\"%s\" is not a valid button" msgstr "„%s” nem érvényes gomb" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "A Gomb 1 módosítók nélküli használata elérhetetlenné tesz minden bal gombbal " "történő műveletet, így használhatatlanok lesznek a jelenlegi beállítások. " "Biztos benne, hogy a(z) „%s” gombot a Gomb 1 gombra állítja be?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "„%s” nem érvényes maszk" msgid "None" msgstr "Nincs" msgid "CompizConfig Settings Manager" msgstr "CompizConfig beállításkezelő" msgid "Plugin" msgstr "Bővítmények" msgid "Please press the new key combination" msgstr "Nyomja le az új billentyűzetkombinációt" msgid "Window Title" msgstr "Ablakcím" msgid "Window Role" msgstr "Ablak szerep" msgid "Window Name" msgstr "Ablaknév" msgid "Window Class" msgstr "Ablakosztály" msgid "Window Type" msgstr "Ablaktípus" msgid "Window ID" msgstr "Ablak azonosító" msgid "And" msgstr "És" msgid "Or" msgstr "Vagy" msgid "Edit match" msgstr "Egyezés szerkesztése" #. Type msgid "Type" msgstr "Típus" #. Value msgid "Value" msgstr "Érték" msgid "Grab" msgstr "Megadás" #. Relation msgid "Relation" msgstr "Összefüggés" #. Invert msgid "Invert" msgstr "Megfordítás" msgid "Browse..." msgstr "Tallózás…" msgid "Images" msgstr "Képek" msgid "File" msgstr "Fájl" msgid "Open directory..." msgstr "Mappa megnyitása…" msgid "Open file..." msgstr "Fájl megnyitása…" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Beállításkezelő a Compiz rendszerhez." msgid "translator-credits" msgstr "Fordították" msgid "An error has occured" msgstr "Hiba lépett fel" msgid "Warning" msgstr "Figyelmeztetés" #, python-format msgid "Enable %s" msgstr "%s engedélyezése" msgid "Filter" msgstr "Szűrő" #, python-format msgid "Search %s Plugin Options" msgstr "%s bővítmény beállításainak keresése" msgid "Use This Plugin" msgstr "Következő bővítmény használata" msgid "Search Compiz Core Options" msgstr "Compiz beállítások keresése" msgid "Error" msgstr "Hiba" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Adja meg a keresési feltételt.\n" "Kattintson a billentyűzet képére, hogy megadhassa a keresési feltételt." msgid "Search in..." msgstr "Keresés…" #. Options msgid "Short description and name" msgstr "Rövid leírásban és névben" msgid "Long description" msgstr "Hosszú leírásban" msgid "Settings value" msgstr "Beállítások értékeiben" msgid "Group" msgstr "Csoport" msgid "Subgroup" msgstr "Alcsoport" #. Notebook msgid "Settings" msgstr "Beállítások" msgid "Loading Advanced Search" msgstr "Haladó keresés betöltése" msgid "Add a New Profile" msgstr "Új profil hozzáadása" msgid "Remove This Profile" msgstr "Profil törlése" msgid "Default" msgstr "Alapértelmezett" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importálás" msgid "Import a CompizConfig Profile" msgstr "CompizConfig profil importálása" msgid "Import as..." msgstr "Importálás másként…" msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig profil importálása új profilként" msgid "Export" msgstr "Exportálás" msgid "Export your CompizConfig Profile" msgstr "CompizConfig profil exportálása" msgid "Reset to defaults" msgstr "Alapértelmezett" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "CompizConfig profil visszaállítása az általános alapértelmezésekre" msgid "Backend" msgstr "Kiszolgáló" msgid "Integration" msgstr "Integráció" msgid "Enable integration into the desktop environment" msgstr "Integráció engedélyezése az ablakkezelő-környezetbe" msgid "Profiles (*.profile)" msgstr "Profilok (*.profile)" msgid "All files" msgstr "Összes fájl" msgid "Save file.." msgstr "Fájl mentése…" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Ki kívánja hagyni az alapértelmezett értékeket tartalmazó beállításokat a " "profil exportálása során?" msgid "Open file.." msgstr "Fájl megnyitása…" msgid "Enter a profile name" msgstr "Profil név megadása" msgid "Please enter a name for the new profile:" msgstr "Adjon meg egy nevet az új profil számára:" msgid "Backend not found." msgstr "A kiszolgáló nem található." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatikus bővítmény-sorrend" msgid "Disabled Plugins" msgstr "Tiltott bővítmények" msgid "Enabled Plugins" msgstr "Engedélyezett bővítmények" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Valóban ki kívánja kapcsolni az automatikus bővítményrendezést? Ez a " "lehetőség kikapcsolja a összeférhetetlenség-kezelést is, így ez a beállítás " "csak gyakorlott felhasználóknak ajánlható." msgid "Add plugin" msgstr "Bővítmény hozzáadása" msgid "Plugin name:" msgstr "Bővítmény neve:" msgid "Insert plugin name" msgstr "Adja meg a bővítmény nevét" msgid "Preferences" msgstr "Beállítások" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Kiszolgáló, profil és Compiz beállítórendszer egyéb belső beállításainak " "szerkesztése." msgid "About" msgstr "Névjegy" msgid "About CCSM..." msgstr "CCSM névjegye…" msgid "Profile & Backend" msgstr "Profilok és kiszolgálók" msgid "Plugin List" msgstr "Bővítmény lista" msgid "Filter your Plugin list" msgstr "Bővítménylista szűrése" #, python-format msgid "Screen %i" msgstr "%i képernyő" msgid "Screen" msgstr "Képernyő" msgid "Category" msgstr "Kategória" msgid "Advanced Search" msgstr "Haladó keresés" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nincs találat. \n" "\n" " A szűrő („%s”) nem adott találatot." msgid "Configure Compiz with CompizConfig" msgstr "Compiz beállítása a CompizCOnfig programmal" #~ msgid "Open file…" #~ msgstr "Fájl megnyitása…" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Lehetséges összeférhetetlenségek keresése. Kérem várjon." #~ msgid "Value (%s)" #~ msgstr "Érték (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s beállítás értéke: %(value)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nem kezelt listatípusok: %s a következőhöz: %s" #~ msgid "Actions" #~ msgstr "Műveletek" #~ msgid "Name" #~ msgstr "Név" ./compizconfig/ccsm/po/es.po0000644000004100000410000003203513246301623016247 0ustar www-datawww-data# Translation of CCSM to es_ES # Copyright (C) 2007 compiz-fusion # This file is distributed under the same license as the Compiz Fusion packages. # # Festor Wailon Dacoba , 2007. # # Para los traductores que usen Gobby, # por favor tener cuidado si modificais un " ya que pueden dar lugar a problemas. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-01-31 21:50+0100\n" "Last-Translator: Pablo Lopez \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" "X-Poedit-Language: Spanish\n" "X-Poedit-Country: SPAIN\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "El nuevo valor para la opción %(binding)s de la acción%(action)s en " "el plugin %(plugin)s está en conflicto con la acción %" "(action_conflict)s del plugin %(plugin_conflict)s .\n" "¿Desea deshabilitar %(action_conflict)s en el plugin %" "(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Deshabilitar %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "No aplicar %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Ignorar y Aplicar %(action)s" msgid "key" msgstr "tecla" msgid "button" msgstr "botón" msgid "edge" msgstr "borde" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Está intentando usar la característica %(feature)s que no está " "disponible en ninguno de los plugins. ¿Desea habilitar esta característica " "de todas formas?" #, python-format msgid "Use %(feature)s" msgstr "Usar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "No usar %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Está intentando usar la característica %(feature)s que está " "disponible en %(plugin)s.\n" "Este plugin actualmente está deshabilitado.\n" "¿Desea habilitar %(plugin)s para que la característica esté " "disponible?" #, python-format msgid "Enable %(plugin)s" msgstr "Habilitar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "No habilitar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Algunos de los vínculos %(bindings)s del Plugin %(plugin)s producen " "conflictos con otros plugins. ¿Desea resolverlos?" msgid "Resolve conflicts" msgstr "Resolver conflictos" msgid "Ignore conflicts" msgstr "Ignorar conflictos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "El plugin %(plugin_conflict)s proporciona la característica %" "(feature)s que también es proporcionada por %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Deshabilitar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "No habilitar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "El plugin %(plugin_conflict)s no es compatible con %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requiere %(feature)s que es proporcionado por los " "siguientes plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Habilitar estos plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requiere el plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Habilitar %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s proporciona la característica %(feature)s la cual " "es requerida por los plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Deshabilitar estos plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "No deshabilitar %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s es requerido por los siguientes plugins %(plugin_list)" "s." msgid "General" msgstr "General" msgid "Accessibility" msgstr "Accesibilidad" msgid "Desktop" msgstr "Escritorio" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Administrador de ventanas" msgid "Effects" msgstr "Efectos" msgid "Image Loading" msgstr "Compatibilidad con imágenes" msgid "Utility" msgstr "Utilidades" msgid "All" msgstr "Todo" msgid "Uncategorized" msgstr "Sin categoría" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Reestablecer opciones predeterminadas" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Opciones de la Multi-lista. Puedes hacer doble-click en un fila para editar " "los valores." #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" no es un acceso directo válido" msgid "Disabled" msgstr "Deshabilitado" msgid "Enabled" msgstr "Habilitado" # Solucionando ortografía. msgid "Grab key combination" msgstr "Escoger combinación de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" no es un botón válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usar el Botón1 sin modificadores puede prevenir cualquier click izquierdo y " "dañar tu configuración. Realmente deseas asignar \"%s\" boton al Botón1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" no es un borde de mascara válido" msgid "None" msgstr "Ninguno" msgid "CompizConfig Settings Manager" msgstr "Administrador de Opciones CompizConfig" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Por favor introduzca una nueva combinación de teclas" msgid "Window Title" msgstr "Titulo de la Ventana" msgid "Window Role" msgstr "Rol de la Ventana" msgid "Window Name" msgstr "Nombre de la Ventana" msgid "Window Class" msgstr "Clase de Ventana" msgid "Window Type" msgstr "Tipo de Ventana" msgid "Window ID" msgstr "Identificacion de la Ventana" msgid "And" msgstr "Y" msgid "Or" msgstr "O" msgid "Edit match" msgstr "Editar coincidencia" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Tomar" #. Relation msgid "Relation" msgstr "Relación" #. Invert msgid "Invert" msgstr "Inverso" msgid "Browse..." msgstr "Examinar..." msgid "Images" msgstr "Imágenes" msgid "File" msgstr "Archivo" msgid "Open directory..." msgstr "Abrir directorio..." msgid "Open file..." msgstr "Abrir archivo..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este es un administrador de opciones para el sistema de configuración " "CompizConfig" msgid "translator-credits" msgstr "" "Traducción al Español:\n" "Festor Wailon Dacoba,\n" "CarvaX,\n" "\n" "Nacho Molina correcciones y aportes.\n" "\n" "Roger Chacon Correcciones y aportes." msgid "An error has occured" msgstr "Se ha producido un error" msgid "Warning" msgstr "Atención" #, python-format msgid "Enable %s" msgstr "Habilitar %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Buscar %s opciones de plugin" msgid "Use This Plugin" msgstr "Usar este plugin" msgid "Search Compiz Core Options" msgstr "Buscar opciones Compiz Core" msgid "Error" msgstr "Error" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Escriba un filtro.Pulse en la imagen del teclado para coger la tecla por la " "que quiere buscar." msgid "Search in..." msgstr "Buscar en..." #. Options msgid "Short description and name" msgstr "Descripción corta y nombre" msgid "Long description" msgstr "Descripción larga" msgid "Settings value" msgstr "Valor de las opciones" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Sub-grupo" #. Notebook msgid "Settings" msgstr "Opciones" msgid "Loading Advanced Search" msgstr "Cargando la búsqueda avanzada" msgid "Add a New Profile" msgstr "Añadir un nuevo perfil" msgid "Remove This Profile" msgstr "Eliminar este perfil" msgid "Default" msgstr "Por defecto" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar Configuración" msgid "Import a CompizConfig Profile" msgstr "Importar un perfil de CompizConfig" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importar un perfil de CompizConfig como un nuevo perfil" msgid "Export" msgstr "Exportar Configuración" msgid "Export your CompizConfig Profile" msgstr "Exportar tu perfil de CompizConfig" msgid "Reset to defaults" msgstr "Reestablecer valores por defecto" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reiniciar tu perfil CompizConfig a las opciones globales por defecto. " msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integración" msgid "Enable integration into the desktop environment" msgstr "Habilitar integración con el entorno de escritorio" msgid "Profiles (*.profile)" msgstr "Perfiles (*.profile)" msgid "All files" msgstr "Todos los archivos" msgid "Save file.." msgstr "Guardar archivo..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "¿Desea omitir los valores predeterminados de las opciones al exportar su " "perfil?" msgid "Open file.." msgstr "Abrir archivo.." # Pequeños cambios msgid "Enter a profile name" msgstr "Introduzca un nombre del perfil" msgid "Please enter a name for the new profile:" msgstr "Por favor introduzca un nombre para el nuevo perfil:" msgid "Backend not found." msgstr "Backend no encontrado." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenar automáticamente los plugins" msgid "Disabled Plugins" msgstr "Plugins deshabilitados" msgid "Enabled Plugins" msgstr "Plugins habilitados" # Pequeño cambio msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Realmente quiere desactivar la organización automática de los plugins? Esto " "desabilitara el manejo de conflictos. Sólo deberia de hacer esto si sabe lo " "que esta haciendo." msgid "Add plugin" msgstr "Añadir plugin" msgid "Plugin name:" msgstr "Nombre del plugin:" msgid "Insert plugin name" msgstr "Insertar nombre del plugin" msgid "Preferences" msgstr "Preferencias" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configurar el backend, los perfiles y otras opciones internas usadas por el " "Sistema de Configuración de Compiz" msgid "About" msgstr "Acerca" msgid "About CCSM..." msgstr "Acerca de CCSM..." msgid "Profile & Backend" msgstr "Perfil & Backend" msgid "Plugin List" msgstr "Lista de plugins" msgid "Filter your Plugin list" msgstr "Filtrar tu lista de plugins" #, python-format msgid "Screen %i" msgstr "Pantalla %i" msgid "Screen" msgstr "Pantalla" msgid "Category" msgstr "Categoría" msgid "Advanced Search" msgstr "Búsqueda avanzada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ninguna coincidencia. \n" "\n" " Tu filtro \"%s\" no ha devuelto ningún resultado." msgid "Configure Compiz with CompizConfig" msgstr "Configurar Compiz con CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Verificando posibles conflictos, por favor espere" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Tipo de lista inusual %s para %s" #~ msgid "Actions" #~ msgstr "Acciones" ./compizconfig/ccsm/po/or.po0000644000004100000410000003552313246301623016265 0ustar www-datawww-data# Translate into Ukrainian # by # Roman Luchak , 2009. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Oriya\n" "X-Poedit-Country: India\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "ଅକ୍ଷମକର %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr " %(action)sଗୁଡିକୁ ସ୍ଥିର କରନାହିଁ" #, python-format #, python-format msgid "Set %(action)s anyway" msgstr "" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ଡିକୁ ଉପୟୋଗକର" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ଉପୟୋଗ କର ନାହିଁ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr " %(plugin)s କୁ ସକ୍ଷମକର" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s ସକ୍ଷମ କରନାହିଁ" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "ଏହି ପ୍ଲଗଇନଗୁଡିକୁ ଅକ୍ଷମକର" #, python-format msgid "Don't disable %(plugin)s" msgstr " %(plugin)s କୁ ଅକ୍ଷମକର ନାହିଁ" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "ସାଧାରଣ" msgid "Accessibility" msgstr "ପ୍ରବେଶୟୋଗ୍ଯତା" msgid "Desktop" msgstr "ଡେସ୍କଟପ" msgid "Extras" msgstr "ଅତିରିକ୍ତଗୁଡିକ" msgid "Window Management" msgstr "ଉଇଣ୍ଡୋ ପ୍ରବନ୍ଧନ" msgid "Effects" msgstr "ପ୍ରଭାବଗୁଡିକ" msgid "Image Loading" msgstr "ଚିତ୍ର ଲୋଡକରିବା" msgid "Utility" msgstr "ଉପୟୋଗୀତା" msgid "All" msgstr "ସବୁ" msgid "Uncategorized" msgstr "ଅବିଭାଜିତ" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "ଡିଫଲ୍ଟ ମୂଲ୍ଯକୁ ସେଟିଙ୍ଗକୁ ପୁନଃସ୍ଥିରକର" msgid "Edit" msgstr "ସଂପାଦନକର" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "ବହୁ-ତାଲିକା ସେଟିଙ୍ଗଗୁଡିକ । ମୂଲ୍ଯଗୁଡିକୁ ସଂପାଦନ କରିବା ପାଇଁ ଆପଣ ଗୋଟିଏ ଧାଡିରେ ଦୁଇଥର କ୍ଲିକ କରିପାରିବେ ।" #, python-format msgid "Edit %s" msgstr "ସଂପାଦନକର %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ଗୋଟିଏ ମାନ୍ଯ ସର୍ଟକଟ ନୁହେଁ" msgid "Disabled" msgstr "ଅକ୍ଷମହେଲା" msgid "Enabled" msgstr "ସକ୍ଷମହେଲା" msgid "Grab key combination" msgstr "ଟାଣିନେବା କି ସଂୟୁକ୍ତକରଣ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ଗୋଟିଏ ମାନ୍ଯ ବଟନ ନୁହେଁ" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "ପରିବର୍ତ୍ତକଗୁଡିକ ବିନା ବଟନ 1 କୁ ଉପୟୋଗ କରିବା ୟେ କୌଣସି ବାମ କ୍ଲିକକୁ ବାଧା ଦେଇପାରିବ ଏବଂ ଏମିତି " "ଆପଣଙ୍କର କନଫିଗରେସନ ଭାଙ୍ଗିୟିବ । ଆପଣ ପ୍ରକୃତରେ \"%s\" ବଟନକୁ ବଟନ1କୁ ସ୍ଥିର କରିବାକୁ ଚାହାଁନ୍ତି କି ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ଏକ ମାନ୍ଯ ଧାର ମାସ୍କ ନୁହେଁ" msgid "None" msgstr "କିଛି ନୁହେଁ" msgid "CompizConfig Settings Manager" msgstr "କମ୍ପିଜକନଫିଗ ସେଟିଙ୍ଗ ପ୍ରବନ୍ଧକ" msgid "Plugin" msgstr "" msgid "Please press the new key combination" msgstr "ଦଯାକରି ନୂଆ କି ସଂୟୁକ୍ତିକରଣକୁ ଦବାନ୍ତୁ" msgid "Window Title" msgstr "ଉଇଣ୍ଡୋ ଶୀର୍ଷକ" msgid "Window Role" msgstr "ଉଇଣ୍ଡୋ ପାତ୍ର" msgid "Window Name" msgstr "ଉଇଣ୍ଡୋ ନାମ" msgid "Window Class" msgstr "ଉଇଣ୍ଡୋ ଶ୍ରେଣୀ" msgid "Window Type" msgstr "ଉଇଣ୍ଡୋ ପ୍ରକାର" msgid "Window ID" msgstr "ଉଇଣ୍ଡୋ ID" msgid "And" msgstr "ଏବଂ" msgid "Or" msgstr "କିମ୍ବା" msgid "Edit match" msgstr "ମିଶୁଥିବାକୁ ସଂପାଦନକର" #. Type msgid "Type" msgstr "ପ୍ରକାର" #. Value msgid "Value" msgstr " ମୂଲ୍ଯ" msgid "Grab" msgstr "ଟାଣିନିଅ" #. Relation msgid "Relation" msgstr "ସମ୍ପର୍କ" #. Invert msgid "Invert" msgstr "ଓଲଟାଅ" msgid "Browse..." msgstr "" msgid "Images" msgstr "ଚିତ୍ରଗୁଡିକ" msgid "File" msgstr "ଫାଇଲ" msgid "Open directory..." msgstr "ବିବରଣୀପଞ୍ଜିକା ଖୋଲ..." msgid "Open file..." msgstr "ଫାଇଲ ଖୋଲ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "କମ୍ପିଜକନଫିଗ କନଫିଗରେସନ ସିଷ୍ଟମ ପାଇଁ ଏହା ଗୋଟିଏ ସେଟିଙ୍ଗ ପ୍ରବନ୍ଧକ ଅଟେ ।" msgid "translator-credits" msgstr "ଅନୁବାଦକ - ଶ୍ରେଯଗୁଡିକ" msgid "An error has occured" msgstr "ଗୋଟିଏ ତ୍ରୁଟି ଘଟିଛି" msgid "Warning" msgstr "ଚେତାବନୀ" #, python-format msgid "Enable %s" msgstr "%s ସକ୍ଷମକର" msgid "Filter" msgstr "ଫିଲ୍ଟର" #, python-format msgid "Search %s Plugin Options" msgstr "ପ୍ଲଗଇନ ବିକଳ୍ପଗୁଡିକୁ %s ତଦନ୍ତକର" msgid "Use This Plugin" msgstr "ଏହି ପ୍ଲଗଇନକୁ ଉପୟୋଗକର" msgid "Search Compiz Core Options" msgstr "କମ୍ପିଜ କେନ୍ଦ୍ରୀଯ ବିକଳ୍ପଗୁଡିକୁ ତଦନ୍ତକର" msgid "Error" msgstr "ତ୍ରୁଟି" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "ରେ ତଦନ୍ତକର..." #. Options msgid "Short description and name" msgstr "ବର୍ଣ୍ଣନା ଏବଂ ନାମ ଛୋଟକର" msgid "Long description" msgstr "ଲମ୍ବା ବର୍ଣ୍ଣନା" msgid "Settings value" msgstr "ସେଟିଙ୍ଗଗୁଡିକର ମୂଲ୍ଯ" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "ସେଟିଙ୍ଗଗୁଡିକ" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "ଗୋଟିଏ ନୂଆ ପ୍ରୋଫାଇଲ ୟୋଗକର" msgid "Remove This Profile" msgstr "ଏହି ପ୍ରୋଫାଇଲକୁ ହଟାଅ" msgid "Default" msgstr "ଡିଫଲ୍ଟ" msgid "Profile" msgstr "ପ୍ରୋଫାଇଲ" msgid "Import" msgstr "ଆମଦାନୀକର" msgid "Import a CompizConfig Profile" msgstr "ଗୋଟିଏ କମ୍ପିଜକନଫିଗ ପ୍ରୋଫାଇଲ ଆମଦାନୀକର" msgid "Import as..." msgstr "ପରି ଆମଦାନୀକର ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ଗୋଟିଏ କମ୍ପିଜକନଫିଗ ପ୍ରୋଫାଇଲକୁ ଏକ ନୂଆ ପ୍ରୋଫାଇଲ ପରି ଆମଦାନୀକର" msgid "Export" msgstr "ରପ୍ତାନୀକର" msgid "Export your CompizConfig Profile" msgstr "ଆପଣଙ୍କର କମ୍ପିଜକନଫିଗ ପ୍ରୋଫାଇଲକୁ ରପ୍ତାନୀ କରନ୍ତୁ" msgid "Reset to defaults" msgstr "ଡିଫଲ୍ଟଗୁଡିକୁ ପୁନଃସ୍ଥିର କର" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "ବିଶ୍ବଗତ ଡିଫଲ୍ଟକୁ ଆପଣଙ୍କର କମ୍ପିଜକନଫିଗ ପ୍ରୋଫାଇଲକୁ ପୁନଃସ୍ଥିର କରନ୍ତୁ " msgid "Backend" msgstr "ବ୍ଯାକଏଣ୍ଡ" msgid "Integration" msgstr "ଏକତ୍ରିକରଣ" msgid "Enable integration into the desktop environment" msgstr "ଡେସ୍କଟପ ପରିବେଶକୁ ଏକତ୍ରିକରଣ ସକ୍ଷମ କର" msgid "Profiles (*.profile)" msgstr "ପ୍ରେଫାଇଲଗୁଡିକ (*.ପ୍ରୋଫାଇଲ)" msgid "All files" msgstr "ସବୁ ଫାଇଲଗୁଡିକ" msgid "Save file.." msgstr "ଫାଇଲ ସଂଚଯକର" msgid "Do you want to skip default option values while exporting your profile?" msgstr "ଆପଣଙ୍କର ପ୍ରୋଫାଇଲକୁ ରପ୍ତାନୀ କରିବା ବେଳେ ଡିଫଲ୍ଟ ବିକଳ୍ପ ମୂଲ୍ଯକୁ ବାଦ ଦେବାକୁ ଚାହାଁନ୍ତି କି ?" msgid "Open file.." msgstr "ଫାଇଲ ଖୋଲ ..." msgid "Enter a profile name" msgstr "ଗୋଟିଏ ପ୍ରୋଫାଇଲ ନାମ ପ୍ରବିଷ୍ଟକର" msgid "Please enter a name for the new profile:" msgstr "ନୂଆ ପ୍ରୋଫାଇଲ ପାଇଁ ଗୋଟିଏ ନାମ ଦଯାକରି ପ୍ରବିଷ୍ଟ କରନ୍ତୁ :" msgid "Backend not found." msgstr "ବ୍ଯାକଏଣ୍ଡ ମିଳିଲା ନାହିଁ ।" #. Auto sort msgid "Automatic plugin sorting" msgstr "ସ୍ବଯଂଚାଳିତ ପ୍ଲଗଇନ ସଜାଇବା" msgid "Disabled Plugins" msgstr "ଅକ୍ଷମହୋଇଥିବା ପ୍ଲଗଇନଗୁଡିକୁ " msgid "Enabled Plugins" msgstr "ସକ୍ଷମହୋଇଥିବା ପ୍ଲଗଇନଗୁଡିକ" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "ଆପଣ ସ୍ବଯଂଚାଳିତ ପ୍ଲଗଇନ ସଜାଇବାକୁ ପ୍ରକୃତରେ ଅକ୍ଷମ କରିବାକୁ ଚାହାଁନ୍ତି କି ? ଏହା ଦ୍ବନ୍ଦ ପରିଚାଳନାକୁ " "ମଧ୍ଯ ଅକ୍ଷମ କରିଦେବ । ୟଦି ଆପଣ ଜାଣିଛନ୍ତି, କଣ ଆପଣ କରୁଛନ୍ତି ତେବେ ୟାଇ ଏହା କରିବା ଉଚିତ ।" msgid "Add plugin" msgstr "ପ୍ଲଗଇନ ୟୋଗକର" msgid "Plugin name:" msgstr "ପ୍ଲଇନ ନାମ:" msgid "Insert plugin name" msgstr "ପ୍ଲଗଇନ ନାମ ଭର୍ତ୍ତିକର" msgid "Preferences" msgstr "ପସନ୍ଦଗୁଡିକ" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "କମ୍ପିଜ କନଫିଗରେସନ ସିଷ୍ଟମ ଦ୍ବାରା ଉପୟୋଗ ହେଉଥିବା ବ୍ଯାକଏଣ୍ଡ, ପ୍ରୋଫାଇଲ ଏବଂ ଅନ୍ଯ ଅନ୍ତବର୍ତ୍ତୀ " "ସେଟିଙ୍ଗଗୁଡିକୁ କନଫିଗର କରନ୍ତୁ ।" msgid "About" msgstr "ବିଷଯରେ" msgid "About CCSM..." msgstr " CCSM ବିଷଯରେ..." msgid "Profile & Backend" msgstr "ପ୍ରୋଫାଇଲ & ବ୍ଯାକଏଣ୍ଡ" msgid "Plugin List" msgstr "ପ୍ଲଗଇନ ତାଲିକା" msgid "Filter your Plugin list" msgstr "ଆପଣଙ୍କର ପ୍ଲଗଇନ ତାଲିକାକୁ ଫିଲ୍ଟର କରନ୍ତୁ " #, python-format msgid "Screen %i" msgstr "ସ୍କ୍ରିନ %i" msgid "Screen" msgstr "ସ୍କ୍ରିନ" msgid "Category" msgstr "ବିଭାଗ" msgid "Advanced Search" msgstr "ଉନ୍ନତ ତଦନ୍ତ" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "କୌଣସି ମେଳ ମିଳିଲା ନାହିଁ \n" "\n" " ଆପଣଙ୍କର ଫିଲ୍ଟର \"%s\" କୌଣସି ସାମଗ୍ରୀ ସହିତ ମେଳ ଖାଉନି ।" msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "ସମ୍ଭାବିତ ଦ୍ବନ୍ଦଗୁଡିକୁ ଗଣନା କରୁଛି, ଦଯାକରି ଅପେକ୍ଷା କରନ୍ତୁ" #~ msgid "Value (%s)" #~ msgstr "ମୂଲ୍ଯ (%s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "ଅପରିଚାଳିତ ତାଲିକା ପ୍ରକାର %s ପାଇଁ %s" #~ msgid "Actions" #~ msgstr "କାର୍ୟ୍ଯଗୁଡିକ" ./compizconfig/ccsm/po/hr.po0000644000004100000410000002562113246301623016254 0ustar www-datawww-data# ccsm hr translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-16 13:24+0200\n" "Last-Translator: Matija Folnovic \n" "Language-Team: Matija Folnovic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "Onemoguci %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nemoj postaviti %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Postavi %(action)s" msgid "key" msgstr "kljuc" msgid "button" msgstr "gumb" msgid "edge" msgstr "rub" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Pokusavate koristiti mogucnost %(feature)s koja nije ukljucen " "u nijednom dodatku.\n" "Zelite li ipak koristi ovu mogucnost?" #, python-format msgid "Use %(feature)s" msgstr "Koristi %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nemoj koristiti %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Pokusavate koristiti mogucnost %(feature)s koja je ukljucena u " "dodatak %(plugin)s.\n" "Ovaj dodatak je iskljucen.\n" "Zelite li omoguciti %(plugin)s pa da ova mogucnost bude dostupna?" #, python-format msgid "Enable %(plugin)s" msgstr "Omoguci %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nemoj omoguciti %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Neki %(bindings)s kratice za dodatak %(plugin)s se preklapaju s " "drugim dodacima. Zelite li rijesiti ta preklapanja?" msgid "Resolve conflicts" msgstr "Rijesi preklapanja" msgid "Ignore conflicts" msgstr "Ignoriraj preklapanja" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Dodatak %(plugin_conflict)s nudi mogucnost %(feature)s koju " "nudi i dodatak %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Onemoguci %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nemoj ukljuciti %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Dodatak %(plugin_conflict)s se sukobljava s dodatkom %(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s zahtjeva mogucnost %(feature)s koju nude ovi " "dodaci:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Omoguci ove dodatke" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s trazi dodatak %(require)s" #, python-format msgid "Enable %(require)s" msgstr "Omoguci %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s nudi mogucnost %(feature)s koju traze dodaci %" "(plugin_list)s" msgid "Disable these plugins" msgstr "Onemoguci ove dodatke" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nemoj onemoguciti %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin_list)s traze dodatak %(plugin)s" msgid "General" msgstr "Opcenito" msgid "Accessibility" msgstr "Pristupacnost" msgid "Desktop" msgstr "Radna povrsina" msgid "Extras" msgstr "Dodaci" msgid "Window Management" msgstr "Upravljanje prozora" msgid "Effects" msgstr "Efekti" msgid "Image Loading" msgstr "Ucitavanje slike" msgid "Utility" msgstr "Pomocni" msgid "All" msgstr "Svi" msgid "Uncategorized" msgstr "Bez kategorije" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Vrati vrijednost na njezinu pocetnu vrijednost" msgid "Edit" msgstr "Promijeni" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Visepopisne postavke. Mozete dvostuko kliknuti na red da promijenite " "vrijednost." #, python-format msgid "Edit %s" msgstr "Promijeni %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" nije pravilna precica" msgid "Disabled" msgstr "Onemoguceno" msgid "Enabled" msgstr "Omoguceno" msgid "Grab key combination" msgstr "Uhvati kombinaciju tipki" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" nije pravilan gumb" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Koristenjem Gumb1 bez ikakvog dodatka moze sprijeciti bilokoji lijevi klik i " "to moze unistiti tvoje opcije. Zelite li zaista staviti \"%s\"gumb u Gumb1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" nije pravilna maska ruba" msgid "None" msgstr "Nista" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Upravitelj Konfiguracija" msgid "Plugin" msgstr "Dodatak" msgid "Please press the new key combination" msgstr "Molim pritisnite novu kombinaciju tipki" msgid "Window Title" msgstr "Naslov prozora" msgid "Window Role" msgstr "Uloga prozora" msgid "Window Name" msgstr "Ime prozora" msgid "Window Class" msgstr "Klasa prozora" msgid "Window Type" msgstr "Tip prozora" msgid "Window ID" msgstr "ID prozora" msgid "And" msgstr "I" msgid "Or" msgstr "Ili" msgid "Edit match" msgstr "Promjeni podudarnost" #. Type msgid "Type" msgstr "Tip" #. Value msgid "Value" msgstr "Vrijednost" msgid "Grab" msgstr "Uhvati" #. Relation msgid "Relation" msgstr "Odnos" #. Invert msgid "Invert" msgstr "Obrni" msgid "Browse..." msgstr "Pregled za" msgid "Images" msgstr "Slike" msgid "File" msgstr "Datoteka" msgid "Open directory..." msgstr "Otvori direktorij..." msgid "Open file..." msgstr "Otvori datoteku..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Ovo je upravitelj konfiguracija za CompizConfig konfiguracijski sustav" msgid "translator-credits" msgstr "O prevodiocima" msgid "An error has occured" msgstr "Dogodila se greska" msgid "Warning" msgstr "Upozorenje" #, python-format msgid "Enable %s" msgstr "Omoguci %s" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Trazi opcije dodatka %s" msgid "Use This Plugin" msgstr "Koristi ovaj dodatak" msgid "Search Compiz Core Options" msgstr "Pretrazi Opcije Compizove jezgre" msgid "Error" msgstr "Greska" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Odaberi filtar.\n" "Klikni na sliku tipkovnice da uhvatis tipku koju trazis" msgid "Search in..." msgstr "Trazi u..." #. Options msgid "Short description and name" msgstr "Kratak opis i ime" msgid "Long description" msgstr "Dugacak opis" msgid "Settings value" msgstr "Vrijednost postavke" msgid "Group" msgstr "Grupa" msgid "Subgroup" msgstr "Podgrupa" #. Notebook msgid "Settings" msgstr "Postavke" #, fuzzy msgid "Loading Advanced Search" msgstr "Ucitavam napredno pretrazivanje" msgid "Add a New Profile" msgstr "Dodaj novi profil" msgid "Remove This Profile" msgstr "Pobrisi ovaj profil" msgid "Default" msgstr "Uobicajen" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Uvesti" msgid "Import a CompizConfig Profile" msgstr "Uvezi CompizConfig profil" msgid "Import as..." msgstr "Uvezi kao..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Uvezi CompizConfig profil kao novi profil" msgid "Export" msgstr "Izvezi" msgid "Export your CompizConfig Profile" msgstr "Izvezi svoj CompizConfig profil" msgid "Reset to defaults" msgstr "Vrati na pocetno" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Vrati svoj CompizConfig profil na pocetne vrijednost" msgid "Backend" msgstr "" msgid "Integration" msgstr "Integracija" msgid "Enable integration into the desktop environment" msgstr "Omoguci integraciju u okruzje desktopa" msgid "Profiles (*.profile)" msgstr "Profil (*.profile)" msgid "All files" msgstr "Sve datoteke" msgid "Save file.." msgstr "Spremi datoteku" msgid "Do you want to skip default option values while exporting your profile?" msgstr "Zelite li preskociti pocetne postavke pri eksportiranju profila?" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "Preferences" msgstr "Postavke" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" msgid "Filter your Plugin list" msgstr "Filtiriraj tvoju listu dodataka" #, python-format msgid "Screen %i" msgstr "Zaslon %i" msgid "Screen" msgstr "Zaslon" msgid "Category" msgstr "Kategorija" msgid "Advanced Search" msgstr "Napredno pretrazivanje" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Izracunavam moguce sukobe, molim pricekajte" #~ msgid "Value (%s)" #~ msgstr "Vrijednost (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Vrijednost (%(value)s) za %(setting)s" #~ msgid "Actions" #~ msgstr "Radnje" ./compizconfig/ccsm/po/sk.po0000644000004100000410000003216013246301623016254 0ustar www-datawww-data# Slovak translation of ccsm. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # PEPINO , 2007. # Ivan Masár , 2008. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-12-14 10:57+0100\n" "Last-Translator: Brusnica P \n" "Language-Team: SLOVAK \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Nová hodnota pre %(binding)s väzby na operáciu %(action)s v zásuvnom " "module %(plugin)s je v konflikte s operáciou %(action_conflict)s zásuvného modulu %(plugin_conflict)s.\n" "Želáte si vypnúť %(action_conflict)s v zásuvnom module %" "(plugin_conflict)s plugin?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Vypnúť %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nenastavovať %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Nastaviť %(action)s napriek tomu" msgid "key" msgstr "kľúč" msgid "button" msgstr "tlačidlo" msgid "edge" msgstr "okraj" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Práve sa pokúšate použiť funkciu %(feature)s ktorú neposkytuje " "žiadny zásuvný modul.\n" "Želáte si napriek tomu zapnúť túto funkciu?" #, python-format msgid "Use %(feature)s" msgstr "Použiť %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nepoužiť %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Práve sa pokúšate použiť funkciu %(feature)s ktorú poskytuje %" "(plugin)s.\n" "Tento zásuvný modul je momentálne vypnutý.\n" "Želáte si zapnúť %(plugin)s aby bola funkcia k dispozícii?" #, python-format msgid "Enable %(plugin)s" msgstr "Zapnúť %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nezapínať %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Niektoré %(bindings)s väzby Pluginu %(plugin)s kolidujú s inými " "pluginmi. Prajete si vyriešiť tieto konflikty?" msgid "Resolve conflicts" msgstr "Vyriešiť konflikty" msgid "Ignore conflicts" msgstr "Ignorovať konflikty" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Zásuvný modul %(plugin_conflict)s poskytuje funkcionalitu %" "(feature)s, ktorú poskytuje aj %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Vypnúť %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nezapínať %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Zásuvný modul %(plugin_conflict)s je v konflikte s %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s vyžaduje funkcionalitu %(feature)s, ktorú posktujú " "nasledovné zásuvné moduly:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Zapnúť tieto zásuvné moduly" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vyžaduje zásuvný modul %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Zapnúť %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s poskytuje funkcionalitu %(feature)s, ktorú vyžaduje " "zásuvný modul %(plugin_list)s." msgid "Disable these plugins" msgstr "Vypnúť tieto zásuvné moduly" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nevypínajte %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s vyžadujú zásuvné moduly %(plugin_list)s." msgid "General" msgstr "Všeobecné" msgid "Accessibility" msgstr "Prístupnosť" msgid "Desktop" msgstr "Plocha" msgid "Extras" msgstr "Extra" msgid "Window Management" msgstr "Správa okien" msgid "Effects" msgstr "Efekty" msgid "Image Loading" msgstr "Načítavanie obrázka" msgid "Utility" msgstr "Nástroje" msgid "All" msgstr "Všetky" msgid "Uncategorized" msgstr "Nezaradené" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Vrátiť nastavenia na šatndardné hodnoty" msgid "Edit" msgstr "Upraviť" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Viac-zoznamové nastavenia. Hodnoty môžete upraviť potom ako dvakrát kliknete " "na riadok." #, python-format msgid "Edit %s" msgstr "Upraviť %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" nie je platná skratka" msgid "Disabled" msgstr "Vypnutý" msgid "Enabled" msgstr "Zapnutý" msgid "Grab key combination" msgstr "Kombinácia kláves zachytenia" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" nie je platné tlačidlo" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Použitie Tlačidla1 bez modifikátorov môže zabrániť akémukoľvek kliknutiu " "ľavým tlačidlom a tak pokaziť vašu konfiguráciu. Skutočne si želáte nastaviť " "tlačidlo \"%s\" na Talčidlo1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" nie je platná maska hrany" msgid "None" msgstr "Žiadne" msgid "CompizConfig Settings Manager" msgstr "Správca nastavení CompizConfig" msgid "Plugin" msgstr "Zásuvný modul" msgid "Please press the new key combination" msgstr "Prosím stlačte novú kombináciu kláves" msgid "Window Title" msgstr "Nadpis okna" msgid "Window Role" msgstr "Rola okna" msgid "Window Name" msgstr "Názov okna" msgid "Window Class" msgstr "Trieda okna" msgid "Window Type" msgstr "Typ okna" msgid "Window ID" msgstr "ID okna" msgid "And" msgstr "Aj" msgid "Or" msgstr "Alebo" msgid "Edit match" msgstr "Upraviť zhodu" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Hodnota" msgid "Grab" msgstr "Chytiť" #. Relation msgid "Relation" msgstr "Vzťah" #. Invert msgid "Invert" msgstr "Invertovať" msgid "Browse..." msgstr "Prechádzať..." msgid "Images" msgstr "Obrázky" msgid "File" msgstr "Súbor" msgid "Open directory..." msgstr "Otvoriť adresár..." msgid "Open file..." msgstr "Otvoriť súbor..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Toto je správca nastavení konfiguračného systému CompizConfig." msgid "translator-credits" msgstr "" "prekladatelia-zásluhy ivan masár < helix84 at centrum.sk < , 2008, " "pepino < sk.cfteam at gmail.com > , 2007" msgid "An error has occured" msgstr "Vyskytla sa chyba" msgid "Warning" msgstr "Upozornenie" #, python-format msgid "Enable %s" msgstr "Zapnúť %s" msgid "Filter" msgstr "Sito" #, python-format msgid "Search %s Plugin Options" msgstr "Hťadať %s Možnosti zásuvného modulu" msgid "Use This Plugin" msgstr "Použiť tento zásuvný modul" msgid "Search Compiz Core Options" msgstr "Hľadať Nastavenia Compiz Core" msgid "Error" msgstr "Chyba" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Zadajte filter.\n" "Kliknutím na obrázok klávesnice zachytíte kláves, ktorý sa má hľadať." msgid "Search in..." msgstr "Hľadať v..." #. Options msgid "Short description and name" msgstr "Krátky popis a názov" msgid "Long description" msgstr "Dlhý popis" msgid "Settings value" msgstr "Hodnoty nastavení" msgid "Group" msgstr "Skupina" msgid "Subgroup" msgstr "Podskupina" #. Notebook msgid "Settings" msgstr "Nastavenia" msgid "Loading Advanced Search" msgstr "Načítava sa rozšírené vyhľadávanie" msgid "Add a New Profile" msgstr "Pridať nový profil" msgid "Remove This Profile" msgstr "Odstráňiť tento profil" msgid "Default" msgstr "Štandardné" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importovať" msgid "Import a CompizConfig Profile" msgstr "Importovať CompizConfig Profil" msgid "Import as..." msgstr "Importovať ako..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importovať CompizConfig Profil ako nový profil" msgid "Export" msgstr "Exportovať" msgid "Export your CompizConfig Profile" msgstr "Exportovať váš CompizConfig Profil" msgid "Reset to defaults" msgstr "Vrátiť štandardné hodnoty" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Prestaviť vaše CompizConfig Profil na štandardné globálne hodnoty" msgid "Backend" msgstr "Na pozadí" msgid "Integration" msgstr "Integrácia" msgid "Enable integration into the desktop environment" msgstr "Zapnúť integráciu s pracovným prostredím" msgid "Profiles (*.profile)" msgstr "Profily (*.profile)" msgid "All files" msgstr "Všetky súbory" msgid "Save file.." msgstr "Uložiť súbor.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Prajete si preskočiť štandardné hodnoty volieb pri exporte profilu?" msgid "Open file.." msgstr "Otvoriť súbor.." msgid "Enter a profile name" msgstr "Zadajte názov profilu" msgid "Please enter a name for the new profile:" msgstr "Zadajte prosím názov nového profilu:" msgid "Backend not found." msgstr "Backend nebol nájdený." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatické triedenie zásuvných modulov" msgid "Disabled Plugins" msgstr "Vypnuté zásuvné moduly" msgid "Enabled Plugins" msgstr "Zapnuté zásuvné moduly" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Naozaj si želáte vypnúť automatické zoraďovanie pluginov? Taktiež vypnete " "kontrolu konfliktov. Mali by ste to urobiť, iba ak ste si istí, čo robíte." msgid "Add plugin" msgstr "Pridať zásuvný modul" msgid "Plugin name:" msgstr "Názov zásuvného modulu:" msgid "Insert plugin name" msgstr "Zadajte názov zásuvného modulu" msgid "Preferences" msgstr "Nastavenia" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurovať backend, profil a ostatné vnútorné nastavenia, ktoré používa " "Systém na konfiguráciu Compiz-u." msgid "About" msgstr "O aplikácii" msgid "About CCSM..." msgstr "O CCSM..." msgid "Profile & Backend" msgstr "Profil a backend" msgid "Plugin List" msgstr "Zoznam zásuvných modulov" msgid "Filter your Plugin list" msgstr "Filtrovať váš zoznam zásuvných modulov" #, python-format msgid "Screen %i" msgstr "Obrazovka %i" msgid "Screen" msgstr "Obrazovka" msgid "Category" msgstr "Kategória" msgid "Advanced Search" msgstr "Rozšírené vyhľadávanie" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Neboli nájdené žiadne zhody. \n" "\n" " Váš filter \"%s\" nesúhlasí so žiadnou položkou." msgid "Configure Compiz with CompizConfig" msgstr "Nastav Compiz s pomocou CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Prebieha hľadanie možných konfliktov, prosím počkajte" #~ msgid "Value (%s)" #~ msgstr "Hodnota (%s)" #, fuzzy #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Hodnota (%s) pre %s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Nezmenený zoznam typ %s pre %s" #~ msgid "Actions" #~ msgstr "Akcie" #~ msgid "Name" #~ msgstr "Meno" #~ msgid "Screen Edge" #~ msgstr "Kraj obrazovky" #~ msgid "Button %i" #~ msgstr "Tlačidlo %i" #~ msgid "Edge Button" #~ msgstr "Krajné Tlačidlo" #~ msgid "On System Bell" #~ msgstr "Na systémové upozornenie" #~ msgid "Edit Action: %s" #~ msgstr "Upravovacie Akcie: %s " #~ msgid "Screen Edges" #~ msgstr "Kraje Obrazovky" #~ msgid "Reset To Defaults" #~ msgstr "prestav na prednastavené" ./compizconfig/ccsm/po/ru.po0000644000004100000410000003644013246301623016272 0ustar www-datawww-data# translation of ccsm_new.po to Russian # Denis Rakhmangulov , 2007. # Dimitriy Ryazantcev , 2008. # Translation of CCSM to ru # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm packages. msgid "" msgstr "" "Project-Id-Version: ccsm_new\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-10 21:37+0100\n" "Last-Translator: Denis Rakhmangulov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" "X-Poedit-Language: Russian\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Новое значение для закрепления %(binding)s для действия %(action)s в " "модуле %(plugin)s конфликтует с действием %(action_conflict)s " "модуля %(plugin_conflict)s.\n" "Вы хотите отключить %(action_conflict)s в модуле %(plugin_conflict)" "s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Отключить %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Не устанавливать %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Установить %(action)s все равно" msgid "key" msgstr "ключ" msgid "button" msgstr "клавиша" msgid "edge" msgstr "край" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Вы пытаетесь использовать возможность %(feature)s, которая не " "предоставлена ни одним модулем.\n" "Вы все равно хотите использовать эту возможность?" #, python-format msgid "Use %(feature)s" msgstr "Использовать %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Не использовать %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Вы пытаетесь воспользоваться возможностью %(feature)s которую " "предоставляет %(plugin)s.\n" "Этот модуль сейчас отключен.\n" "Вы хотите включить %(plugin)s, чтобы сделать возможность доступной?" #, python-format msgid "Enable %(plugin)s" msgstr "Включить %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Не включать %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Назначения клавиш %(bindings)s модуля %(plugin)s конфликтуют с " "другими модулями. Вы хотите разрешить эти конфликты?" msgid "Resolve conflicts" msgstr "Разрешить конфликты" msgid "Ignore conflicts" msgstr "Игнорировать конфикты" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Модуль %(plugin_conflict)s предоставляет возможность %(feature)s, которая уже предоставлена %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Отключить %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Не включать %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Модуль %(plugin_conflict)s конфликтует с %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s требует возможность %(feature)s, которая " "предоставлена следующими модулями:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Включить эти модули" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s требует модуль %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Включить %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s предоставляет возможность %(feature)s, которая " "требуется модулям %(plugin_list)s." msgid "Disable these plugins" msgstr "Отключить эти модули" #, python-format msgid "Don't disable %(plugin)s" msgstr "Не отключать %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s требуется модулю %(plugin_list)s." msgid "General" msgstr "Общие" msgid "Accessibility" msgstr "Специальные возможности" msgid "Desktop" msgstr "Рабочий стол" msgid "Extras" msgstr "Дополнения" msgid "Window Management" msgstr "Управление окнами" msgid "Effects" msgstr "Эффекты" msgid "Image Loading" msgstr "Загрузка изображения" msgid "Utility" msgstr "Утилиты" msgid "All" msgstr "Все" msgid "Uncategorized" msgstr "Не категоризировано" msgid "N/A" msgstr "Не доступно" msgid "Reset setting to the default value" msgstr "Сбросить настройку на значения по умолчанию" msgid "Edit" msgstr "Изменить" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Многострочные настройки. Вы можете дважды щелкнуть строку для редактирования " "значений." #, python-format msgid "Edit %s" msgstr "Изменить %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" является неправильным сочетанием клавиш" msgid "Disabled" msgstr "Отключено" msgid "Enabled" msgstr "Включено" msgid "Grab key combination" msgstr "Считать комбинацию клавиш" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" неверная клавиша" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Использование Button1 без модификаторов может предотвратить любой левый клик " "и это испортит Вашу конфигурацию. Вы действительно хотите установить клавишу " "\"%s\" на Button1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" неверная маска края" msgid "None" msgstr "Нет" msgid "CompizConfig Settings Manager" msgstr "Менеджер настройки CompizConfig" msgid "Plugin" msgstr "Модуль" msgid "Please press the new key combination" msgstr "Пожалуйста, нажмите новую комбинацию клавиш" msgid "Window Title" msgstr "Заголовок окна" msgid "Window Role" msgstr "Роль окна" msgid "Window Name" msgstr "Имя окна" msgid "Window Class" msgstr "Класс окна" msgid "Window Type" msgstr "Тип окна" msgid "Window ID" msgstr "ID окна" msgid "And" msgstr "И" msgid "Or" msgstr "Или" msgid "Edit match" msgstr "Изменить соответствие" #. Type msgid "Type" msgstr "Тип" #. Value msgid "Value" msgstr "Значение" msgid "Grab" msgstr "Считать" #. Relation msgid "Relation" msgstr "Отношение" #. Invert msgid "Invert" msgstr "Инвертировать" msgid "Browse..." msgstr "Обзор..." msgid "Images" msgstr "Изображения" msgid "File" msgstr "Файл" msgid "Open directory..." msgstr "Открыть каталог..." msgid "Open file..." msgstr "Открыть файл..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Это менеджер настроек для системы конфигурирования CompizConfig." msgid "translator-credits" msgstr "" "Denis Rakhmangulov \n" "Дмитрий Рязанцев \n" "Александр Муравья " msgid "An error has occured" msgstr "Произошла ошибка" msgid "Warning" msgstr "Предупреждение" #, python-format msgid "Enable %s" msgstr "Включить %s" msgid "Filter" msgstr "Фильтр" #, python-format msgid "Search %s Plugin Options" msgstr "Искать %s опции модуля" msgid "Use This Plugin" msgstr "Использовать этот модуль" msgid "Search Compiz Core Options" msgstr "Искать опции Compiz Core" msgid "Error" msgstr "Ошибка" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Введите фильтр.\n" "Щелкните на иконке клавиатуры для считывания ключевого слова, по которому " "искать." msgid "Search in..." msgstr "Искать в..." #. Options msgid "Short description and name" msgstr "Кратком описании и наименовании" msgid "Long description" msgstr "Подробном описании" msgid "Settings value" msgstr "Значении настроек" msgid "Group" msgstr "Группа" msgid "Subgroup" msgstr "Подгруппа" #. Notebook msgid "Settings" msgstr "Настройки" msgid "Loading Advanced Search" msgstr "Загружается расширенный поиск" msgid "Add a New Profile" msgstr "Добавить новый профиль" msgid "Remove This Profile" msgstr "Удалить этот профиль" msgid "Default" msgstr "По умолчанию" msgid "Profile" msgstr "Профиль" msgid "Import" msgstr "Импортировать" msgid "Import a CompizConfig Profile" msgstr "Импортировать профиль CompizConfig" msgid "Import as..." msgstr "Импортировать как..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Импортировать профиль CompizConfig как новый профиль" msgid "Export" msgstr "Экспортировать" msgid "Export your CompizConfig Profile" msgstr "Экспортировать Ваш профиль CompizConfig" msgid "Reset to defaults" msgstr "Сбросить на значения по умолчанию" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Сбросить Ваш профиль CompizConfig на общие значения по умолчанию" msgid "Backend" msgstr "Формат хранения настроек" msgid "Integration" msgstr "Интеграция" msgid "Enable integration into the desktop environment" msgstr "Включить интеграцию в окружение рабочего стола" msgid "Profiles (*.profile)" msgstr "Профили (*.profile)" msgid "All files" msgstr "Все файлы" msgid "Save file.." msgstr "Сохранить файл.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Хотите ли вы пропустить значения по умолчанию, экспортируя ваш профиль?" msgid "Open file.." msgstr "Открыть файл.." msgid "Enter a profile name" msgstr "Введите наименование профиля" msgid "Please enter a name for the new profile:" msgstr "Пожалуйста введите наименование нового профиля:" msgid "Backend not found." msgstr "Формат хранения настроек не найден." #. Auto sort msgid "Automatic plugin sorting" msgstr "Автоматическая сортировка модулей" msgid "Disabled Plugins" msgstr "Отключенные модули" msgid "Enabled Plugins" msgstr "Включенные модули" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Вы действительно хотите отключить автоматическую сортировку модулей? Это " "отключит разрешение конфликтов. Вы можете это сделать только если знаете, " "что делаете." msgid "Add plugin" msgstr "Добавить модуль" msgid "Plugin name:" msgstr "Наименование модуля:" msgid "Insert plugin name" msgstr "Введите наименование модуля" msgid "Preferences" msgstr "Установки" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Конфигурировать формат хранения настроек, профиль и другие внутренние " "настройки используя систему конфигурации Compiz." msgid "About" msgstr "О программе" msgid "About CCSM..." msgstr "О CCSM..." msgid "Profile & Backend" msgstr "Профиль и формат хранения настроек" msgid "Plugin List" msgstr "Список модулей" msgid "Filter your Plugin list" msgstr "Отфильтровать Ваш список модулей" #, python-format msgid "Screen %i" msgstr "Экран %i" msgid "Screen" msgstr "Экран" msgid "Category" msgstr "Категория" msgid "Advanced Search" msgstr "Расширенный поиск" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Не найдено совпадений. \n" "\n" " Ваш фильтр \"%s\" не совпал ни с чем." msgid "Configure Compiz with CompizConfig" msgstr "Настройка Compiz с помощью CompizConfig" ./compizconfig/ccsm/po/he.po0000644000004100000410000003207713246301623016242 0ustar www-datawww-data# ccsm he translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Yotam Benshalom . # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-07 05:37+0200\n" "Last-Translator: Yotam Benshalom \n" "Language-Team: Yotam Benshalom \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "הערך החדש של הצירוף %(binding)s לפעולה %(action)s בהתקן %(plugin)" "s מתנגש עם הפעולה %(action_conflict)s בהתקן %(plugin_conflict)" "s .\n" "האם ברצונך לנטרל את %(action_conflict)s בהתקן %(plugin_conflict)" "s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "נטרל את %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "אל תקבע צירוף ל%(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "קבע צירוף ל%(action)s בכל זאת" msgid "key" msgstr "מקש" msgid "button" msgstr "כפתור" msgid "edge" msgstr "קצה מסך" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "נסית להשתמש בתכונה %(feature)s אשר אינה provided by נתמכת בידי " "שום התקן.\n" "האם ברצונך להשתמש בה בכל זאת?" #, python-format msgid "Use %(feature)s" msgstr "השתמש ב%(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "אל תשתמש ב%(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "נסית להשתמש בתכונה %(feature)s שאותה מספק ההתקן %(plugin)s.\n" "ההתקן מנוטרל כרגע.\n" "האם ברצונך להפעיל את ההתקן %(plugin)s כדי לאפשר תכונה זו?" #, python-format msgid "Enable %(plugin)s" msgstr "הפעל את %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "אל תפעיל את %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "כמה צימודי %(bindings)s של ההתקן %(plugin)s מתנגשים עם התקנים אחרים. " "האם ברצונך לפתור התנגשויות אלה?" msgid "Resolve conflicts" msgstr "פתור התנגשויות" msgid "Ignore conflicts" msgstr "התעלם מהתנגשויות" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "ההתקן %(plugin_conflict)s מספק את התכונה %(feature)s שאותה " "מספק גם %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "נטרל את %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "אל תפעיל את %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "ההתקן %(plugin_conflict)s מתנגש עם %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s זקוק לתכונה %(feature)s המצויה בהתקנים הבאים:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "הפעל התקנים אלה" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s זקוק להתקן %(require)s." #, python-format msgid "Enable %(require)s" msgstr "הפעל את %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s כולל את התכונה %(feature)s שלה זקוקים ההתקנים %" "(plugin_list)s." msgid "Disable these plugins" msgstr "נטרל התקנים אלה" #, python-format msgid "Don't disable %(plugin)s" msgstr "אל תנטרל את %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)sנחוץ להתקנים %(plugin_list)s." msgid "General" msgstr "כללי" msgid "Accessibility" msgstr "נגישות" msgid "Desktop" msgstr "שולחן עבודה" msgid "Extras" msgstr "תוספות" msgid "Window Management" msgstr "ניהול חלונות" msgid "Effects" msgstr "אפקטים" msgid "Image Loading" msgstr "טעינת תמונות" msgid "Utility" msgstr "עזרים" msgid "All" msgstr "הכל" msgid "Uncategorized" msgstr "שונות" msgid "N/A" msgstr "לא זמין" msgid "Reset setting to the default value" msgstr "חזרה לברירת המחדל" msgid "Edit" msgstr "עריכה" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "הגדרות מרובות רשימות. ניתן להקליק הקלקה כפולה על שורה כדי לערוך את הערכים." #, python-format msgid "Edit %s" msgstr "עריכת %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" אינו קיצור דרך תקין" msgid "Disabled" msgstr "מנוטרל" msgid "Enabled" msgstr "פועל" msgid "Grab key combination" msgstr "יירט צירוף מקשים" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" אינו כפתור תקין" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "שימוש בכפתור מס' 1 עלול למנוע ממך להפעיל קליק שמאלי ובכך לשבש את פעולת " "המערכת שלך. האם אתה בטוח שברצונך להצמיד את הכפתור \"%s\" לכפתור מס' 1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" אינו מסיכת קצה תקינה" msgid "None" msgstr "ללא" msgid "CompizConfig Settings Manager" msgstr "מנהל הגדרות CompizConfig" msgid "Plugin" msgstr "התקן" msgid "Please press the new key combination" msgstr "אנא לחץ על צירוף המקשים הרצוי" msgid "Window Title" msgstr "כותרת החלון" msgid "Window Role" msgstr "תפקיד החלון" msgid "Window Name" msgstr "שם החלון" msgid "Window Class" msgstr "מחלקת החלון" msgid "Window Type" msgstr "סוג החלון" msgid "Window ID" msgstr "מזהה החלון" msgid "And" msgstr "וגם" msgid "Or" msgstr "או" # אני לא בטוח כאן. למה הכוונה? msgid "Edit match" msgstr "התאמת עריכה" #. Type msgid "Type" msgstr "סוג" #. Value msgid "Value" msgstr "ערך" msgid "Grab" msgstr "יירוט" #. Relation msgid "Relation" msgstr "קשר" #. Invert msgid "Invert" msgstr "היפוך" msgid "Browse..." msgstr "עיון..." msgid "Images" msgstr "תמונות" msgid "File" msgstr "קובץ" msgid "Open directory..." msgstr "פתיחת ספריה..." msgid "Open file..." msgstr "פתיחת קובץ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "זהו מנהל הגדרות עבור מערכת בקרת התצורה של CompizConfig." msgid "translator-credits" msgstr "מתרגמים" msgid "An error has occured" msgstr "חלה שגיאה" msgid "Warning" msgstr "אזהרה" #, python-format msgid "Enable %s" msgstr "הפעל את %s" msgid "Filter" msgstr "מסנן" #, python-format msgid "Search %s Plugin Options" msgstr "חפש באפשרויות ההתקן %s " msgid "Use This Plugin" msgstr "השתמש בהתקן זה" msgid "Search Compiz Core Options" msgstr "חפש באפשרויות הליבה של קומפיז" msgid "Error" msgstr "שגיאה" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "הזן מסנן.\n" "הקלק על תמונת המקלדת כדי ליירט את הכפתור שעליו יש לבצע חיפוש." msgid "Search in..." msgstr "חפש בתוך..." #. Options msgid "Short description and name" msgstr "תיאור קצר ושם" msgid "Long description" msgstr "תיאור מפורט" msgid "Settings value" msgstr "ערך ההגדרות" msgid "Group" msgstr "קבוצה" msgid "Subgroup" msgstr "תת-קבוצה" #. Notebook msgid "Settings" msgstr "הגדרות" msgid "Loading Advanced Search" msgstr "טוען חיפוש מתקדם" msgid "Add a New Profile" msgstr "הוספת פרופיל חדש" msgid "Remove This Profile" msgstr "הסרת פרופיל זה" msgid "Default" msgstr "ברירת מחדל" msgid "Profile" msgstr "פרופיל" msgid "Import" msgstr "ייבוא" msgid "Import a CompizConfig Profile" msgstr "ייבוא פרופיל CompizConfig" msgid "Import as..." msgstr "ייבוא כ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ייבוא פרופיל CompizConfig כפרופיל חדש" msgid "Export" msgstr "ייצוא" msgid "Export your CompizConfig Profile" msgstr "ייצוא פרופיל ה-CompizConfig שלך" msgid "Reset to defaults" msgstr "חזרה לברירת המחדל" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "החזרת פרופיל ה-CompizConfig שלך לברירת המחדל הגלובלית" msgid "Backend" msgstr "תשתית" msgid "Integration" msgstr "השתלבות" msgid "Enable integration into the desktop environment" msgstr "השתלב בסביבת שולחן העבודה" msgid "Profiles (*.profile)" msgstr "פרופילים (*.profile)" msgid "All files" msgstr "כל הקבצים" msgid "Save file.." msgstr "שמירת קובץ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "האם ברצונך לדלג על אפשרויות שנקבעו לברירת המחדל בעת ייצוא הפרופיל שלך?" msgid "Open file.." msgstr "פתיחת קובץ..." msgid "Enter a profile name" msgstr "הזן שם פרופיל" msgid "Please enter a name for the new profile:" msgstr "נא להזין את שם הפרופיל החדש:" msgid "Backend not found." msgstr "תשתית לא נמצאה." #. Auto sort msgid "Automatic plugin sorting" msgstr "הסדרת התקנים אוטומטית." msgid "Disabled Plugins" msgstr "התקנים מנוטרלים" msgid "Enabled Plugins" msgstr "התקנים פועלים" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "האם ברצונך לנטרל את הסדרת ההתקנים האוטומטית? הדבר ינטרל גם את הטיפול " "בהתנגשויות. אין לעשות זאת ללא הבנת ההשלכות." msgid "Add plugin" msgstr "הוספת התקן" msgid "Plugin name:" msgstr "שם ההתקן:" msgid "Insert plugin name" msgstr "הזן שם התקן" msgid "Preferences" msgstr "העדפות" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "עריכת תצורת התשתית, הפרופיל וההגדרות הפנימיות של מערכת התצורה של קומפיז." msgid "About" msgstr "אודות" msgid "About CCSM..." msgstr "אודות CCSM..." msgid "Profile & Backend" msgstr "פרופיל ותשתית" msgid "Plugin List" msgstr "רשימת התקנים" msgid "Filter your Plugin list" msgstr "סנן את רשימת ההתקנים" #, python-format msgid "Screen %i" msgstr "מסך %i" msgid "Screen" msgstr "מסך" msgid "Category" msgstr "קבוצה" msgid "Advanced Search" msgstr "חיפוש מתקדם" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "לא נמצאו התאמות. \n" "\n" " המסנן \"%s\" אינו תואם לאף אחד מהפריטים." msgid "Configure Compiz with CompizConfig" msgstr "ערוך את תצורת קומפיז בעזרת CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "בודק התנגשויות אפשריות, נא להמתין" ./compizconfig/ccsm/po/hi.po0000644000004100000410000004120613246301623016240 0ustar www-datawww-data# translation of ccsm.po to # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2007-12-16 16:36+0530\n" "Last-Translator: Sangeeta Kumari\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(action)s क्रिया के %(binding)s बाइंडिंग के लिए नया मान %(plugin)s प्लगिन में %(action_conflict)s क्रिया के साथ विरोध में है %" "(plugin_conflict)s प्लगिन के.\n" "क्या आप %(action_conflict)s को %(plugin_conflict)s प्लगिन में " "निष्क्रिय करना चाहते हैं?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s निष्क्रिय करें" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s सेट मत करें" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s किसी तरह सेट करें" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "आप %(feature)s फीचर प्रयोग करने की कोशिश कर रहे हैं जो नहीं दिया है " "किसी प्लगिन के द्वारा.\n" "क्या आप इस फीचर को किसी तरह प्रयोग करना चाहते हैं?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s का उपयोग करें" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s का उपयोग मत करें" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "आप %(feature)s फीचर का प्रयोग करने की कोशिश कर रहे हैं जो %(plugin)s " "प्लगिन के द्वारा दिया हुआ है.\n" "यह प्लगिन अभी निष्क्रिय किया हुआ है.\n" "क्या आप %(plugin)s को सक्रिय करना चाहते हैं ताकि फीचर उपलब्ध रहे?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s सक्रिय करें" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s सक्रिय मत करें" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s प्लगिन %(feature)s फीचर देता है जो कि %" "(plugin)s के द्वारा दिया गया है." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s निष्क्रिय करें" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s सक्रिय मत करें" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s प्लगिन %(plugin)s के साथ विरोध में है." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s के लिये %(feature)s फीचर जरूरी है जो कि निम्नलिखित प्लगिन " "के द्वारा दिया हुआ है:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "इन प्लगिन को सक्रिय करें" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s के लिए %(require)s प्लगिन जरूरी है." #, python-format msgid "Enable %(require)s" msgstr "%(require)s सक्रिय करें" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s %(feature)s फीचर उपलब्ध कराता है जो कि %" "(plugin_list)s प्लगिन के द्वारा जरूरी है." msgid "Disable these plugins" msgstr "इन प्लगिन को निष्क्रिय करें" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s को मत निष्क्रिय करें" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s %(plugin_list)s प्लगिन के द्वारा जरूरी होता है." msgid "General" msgstr "सामान्य" msgid "Accessibility" msgstr "अभिगम्यता" msgid "Desktop" msgstr "डेस्कटॉप" msgid "Extras" msgstr "अतिरिक्त" msgid "Window Management" msgstr "विंडो प्रबंधन" msgid "Effects" msgstr "प्रभाव" msgid "Image Loading" msgstr "चित्र लोडिंग" msgid "Utility" msgstr "उपयोगिता" msgid "All" msgstr "सभी" msgid "Uncategorized" msgstr "अवर्गीकृत" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "मूलभूत मान में सेटिंग फिर सेट करें" msgid "Edit" msgstr "संपादन" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "मल्टी लिस्ट सेटिंग. आप एक पंक्ति पर मानों के संपादन के लिए दो बार क्लिक कर सकते हैं." #, python-format msgid "Edit %s" msgstr "%s संपादित करें" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" एक वैध शार्टकर्ट नहीं है" msgid "Disabled" msgstr "निष्क्रिय किया हुआ" msgid "Enabled" msgstr "सक्रिय किया हुआ" msgid "Grab key combination" msgstr "कुंजी युग्म पकड़ें" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" एक वैध बटन नहीं है" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "बिना रूपांतरक के बटन1 का प्रयोग किसी बायें क्लिक को रोक सकता है और इस प्रकार आपके " "विन्यास को तोड़ सकता है. क्या आप वास्तव में \"%s\" बटन को बटन1 में सेट करना चाहते हैं?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" एक वैध किनारा मास्क नहीं है" msgid "None" msgstr "कोई नहीं" msgid "CompizConfig Settings Manager" msgstr "CompizConfig जमावट प्रबंधक" #, fuzzy msgid "Plugin" msgstr "प्लगिन सूची" msgid "Please press the new key combination" msgstr "कृपया नया कुंजी युग्म दबायें" msgid "Window Title" msgstr "विंडो शीर्षक" msgid "Window Role" msgstr "विंडो भूमिका" msgid "Window Name" msgstr "विंडो नाम" msgid "Window Class" msgstr "विंडो वर्ग" msgid "Window Type" msgstr "विंडो प्रकार" msgid "Window ID" msgstr "विंडो ID" msgid "And" msgstr "और" msgid "Or" msgstr "या" msgid "Edit match" msgstr "मिलान संपादित करें" #. Type msgid "Type" msgstr "प्रकार" #. Value msgid "Value" msgstr "मान" msgid "Grab" msgstr "पकड़ें" #. Relation msgid "Relation" msgstr "संबंध" #. Invert msgid "Invert" msgstr "उलटें" #, fuzzy msgid "Browse..." msgstr "इसके लिए ब्राउज़" msgid "Images" msgstr "बिंब" msgid "File" msgstr "फाइल" msgid "Open directory..." msgstr "निर्देशिका खोलें..." msgid "Open file..." msgstr "फाइल खोलें..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "यह CompizConfig विन्यास सिस्टम के लिए सेटिंग मैनेजर है." msgid "translator-credits" msgstr "संगीता कुमारी (sangeeta09@gmail.com)" msgid "An error has occured" msgstr "एक त्रुटि आयी" msgid "Warning" msgstr "चेतावनी" #, python-format msgid "Enable %s" msgstr "%s सक्रिय करें" msgid "Filter" msgstr "फिल्टर" #, python-format msgid "Search %s Plugin Options" msgstr "%s प्लगिन विकल्प खोजें" msgid "Use This Plugin" msgstr "इस प्लगिन का उपयोग करें" msgid "Search Compiz Core Options" msgstr "कोपिंज कोर विकल्प खोजें" msgid "Error" msgstr "त्रुटि" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "इसमें खोजें..." #. Options msgid "Short description and name" msgstr "संक्षिप्त वर्णन और नाम" msgid "Long description" msgstr "लंबा वर्णन" msgid "Settings value" msgstr "जमावट मान" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "जमावट" #, fuzzy msgid "Loading Advanced Search" msgstr "उन्नत खोज" msgid "Add a New Profile" msgstr "नया प्रोफाइल जोड़ें" msgid "Remove This Profile" msgstr "इस प्रोफाइल को हटायें" msgid "Default" msgstr "मूलभूत" msgid "Profile" msgstr "प्रोफाइल" msgid "Import" msgstr "आयात" msgid "Import a CompizConfig Profile" msgstr "CompizConfig प्रोफाइल आयात करें" msgid "Import as..." msgstr "ऐसे आयात करें..." msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig प्रोफाइल को नये प्रोफाइल के रूप में आयात करें" msgid "Export" msgstr "निर्यात" msgid "Export your CompizConfig Profile" msgstr "अपने CompizConfig प्रोफाइल को निर्यात करें" msgid "Reset to defaults" msgstr "मूलभूत में फिर सेट करें" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "अपने CompizConfig प्रोफाइल को वैश्विक मूलभूत में फिर सेट करें" msgid "Backend" msgstr "बैकेंड" msgid "Integration" msgstr "संयोजन" msgid "Enable integration into the desktop environment" msgstr "डेस्कटॉप वातावरण में संयोजन सक्रिय करें" msgid "Profiles (*.profile)" msgstr "प्रोफ़ाइल (*.profile)" msgid "All files" msgstr "सभी फ़ाइलें" msgid "Save file.." msgstr "फाइल सहेजें.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "क्या आप मूलभूत विकल्प मान को अपने प्रोफाइल के निर्यात के दौरान छोड़ना चाहते हैं?" msgid "Open file.." msgstr "फाइल खोलें..." msgid "Enter a profile name" msgstr "प्रोफाइल नाम दें" msgid "Please enter a name for the new profile:" msgstr "कृपया नये प्रोफाइल के लिए एक नाम दें:" msgid "Backend not found." msgstr "बैकेंड नहीं मिला." #. Auto sort msgid "Automatic plugin sorting" msgstr "स्वचालित प्लगिन छांट" msgid "Disabled Plugins" msgstr "निष्क्रिय किया हुआ प्लगिन" msgid "Enabled Plugins" msgstr "सक्रिय प्लगिन" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "क्या आप सचमुच स्वचालित प्लगिन छांट को निष्क्रिय करना चाहते हैं? यह साथ ही विरोध नियंत्रण " "को निष्क्रिय करेगा. आप सिर्फ तभी करना चाहिए इसे जब आप जानते हों कि आप क्या कर रहे हैं." msgid "Add plugin" msgstr "प्लगिन जोड़ें" msgid "Plugin name:" msgstr "प्लगिन नाम:" msgid "Insert plugin name" msgstr "प्लगिन नाम जोड़ें" msgid "Preferences" msgstr "वरीयताएँ" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Compiz विन्यास सिस्टम के द्वारा प्रयुक्त बैकैंड, प्रोफाइल और दूसरे सेटिंग को विन्यस्त करें." msgid "About" msgstr "के बारे में" msgid "About CCSM..." msgstr "CCSM के बारे में..." msgid "Profile & Backend" msgstr "प्रोफाइल व बैकेंड" msgid "Plugin List" msgstr "प्लगिन सूची" msgid "Filter your Plugin list" msgstr "अपनी प्लगिन सूची फिल्टर करें" #, python-format msgid "Screen %i" msgstr "स्क्रीन %i" msgid "Screen" msgstr "स्क्रीन" msgid "Category" msgstr "श्रेणी" msgid "Advanced Search" msgstr "उन्नत खोज" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "कोई मेल नहीं मिला. \n" "\n" " आपका फिल्टर \"%s\" किसी मद से नहीं मेल खाता है." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "संभावित विरोध की गणना कर रहा है, कृपया प्रतीक्षा करें" #~ msgid "Value (%s)" #~ msgstr "मान (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "(%(value)s) मान %(setting)s के लिए" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s अनियंत्रित सूची प्रकार %s के लिए" #~ msgid "Actions" #~ msgstr "क्रियाएँ" ./compizconfig/ccsm/po/LINGUAS0000644000004100000410000000027413246301623016325 0ustar www-datawww-data# Set of available languages. Keep it alphabatical. One lingua per line. ar bn bn_IN ca cs de el en_GB es fi fr gl gu he hi hu id it ja ko mnk nb nl or pa pt pt_BR pl ru sk sv tr wo zh_CN ./compizconfig/ccsm/po/ccsm.pot0000644000004100000410000001721513246301623016754 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 12:33+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Edit" msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Plugin" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "Browse..." msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Filter" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Error" msgstr "" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "" #. Options msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "Preferences" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" msgid "Configure Compiz with CompizConfig" msgstr "" ./compizconfig/ccsm/po/zh_HK.po0000644000004100000410000001645413246301623016652 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2008-01-13 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Browse for " msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" msgid "Edit" msgstr "" #, python-format msgid "Value (%s)" msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Actions" msgstr "" msgid "Error" msgstr "" msgid "Search in..." msgstr "" msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" ./compizconfig/ccsm/po/da.po0000644000004100000410000001645413246301623016233 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2007-12-13 00:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Browse for " msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" msgid "Edit" msgstr "" #, python-format msgid "Value (%s)" msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Actions" msgstr "" msgid "Error" msgstr "" msgid "Search in..." msgstr "" msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" ./compizconfig/ccsm/po/pt_BR.po0000644000004100000410000003322413246301623016647 0ustar www-datawww-data# CompizConfig Brazilian Portuguese translation. # Translated from scratch by Werner Landgraf, 2007 Aug 31, # new itens 2007 Sep 12-4. Format corrected by the other authors # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Werner Landgraf # Marco Ribeiro (salsichad2) , 2007. # Marco A S Ribeiro # Emerson Ribeiro de Mello msgid "" msgstr "" "Project-Id-Version: pt_BR-ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-07-30 23:54+0200\n" "Last-Translator: Filipe Guide \n" "Language-Team: Portuguese/Brazil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "O novo valor de %(binding)s para a ação %(action)s no plugin %" "(plugin)s está em conflito com a ação %(action_conflict)s do " "plugin %(plugin_conflict)s.\n" "Você quer desabilitar %(action_conflict)s no plugin %" "(plugin_conflict)s ?" # Acho que 'Disable' fica melhor traduzido como 'Desativa' #, python-format msgid "Disable %(action_conflict)s" msgstr "Desabilita %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Não atribua um valor a %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Atribua valor a %(action)s de qualquer forma !" msgid "key" msgstr "Atalho do Teclado" msgid "button" msgstr "Atalho do Mouse" msgid "edge" msgstr "Borda" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Você está tentando usar a função %(feature)s que não é provida " "por nenhum plugin.\n" "Você quer usar essa função assim mesmo?" #, python-format msgid "Use %(feature)s" msgstr "Habilitar %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Não habilita %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Você está tentando usar a função %(feature)s que é fornecida pelo " "plugin %(plugin)s.\n" "Esse plugin está desabilitado.\n" "Deseja habilitar o plugin %(plugin)s para tornar a função disponível?" #, python-format msgid "Enable %(plugin)s" msgstr "Habilitar %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Não habilitar %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Alguns atalhos do plugin %(bindings)s %(plugin)s conflitam com os de " "outros plugins. Deseja resolver esses conflitos?" msgid "Resolve conflicts" msgstr "Resolver conflitos" msgid "Ignore conflicts" msgstr "Ignorar conflitos" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Conflito: Plugin %(plugin_conflict)s provê a função %(feature)s a qual também está sendo provida pelo plugin %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Desabilitar %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Não habilitar %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Plugin %(plugin_conflict)s está em conflito com %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requer a função %(feature)s a qual é provida pelos " "seguintes plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Habilitar estes plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requer o plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Habilita %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s provê a função %(feature)s a qual é requerida pelos " "plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Desabilita estes plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "Não desabilita %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s é requerido pelos plugins %(plugin_list)s." msgid "General" msgstr "Geral" msgid "Accessibility" msgstr "Acessibilidade" msgid "Desktop" msgstr "Área de Trabalho" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gerenciamento de Janelas" msgid "Effects" msgstr "Efeitos" msgid "Image Loading" msgstr "Carregamento de Imagem" msgid "Utility" msgstr "Utilidade" msgid "All" msgstr "Todos" msgid "Uncategorized" msgstr "Sem Categoria" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Restaurar as configurações para o valor padrão" msgid "Edit" msgstr "Editar" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Configurações multi-valor. Você pode clicar duas vezes em uma linha para " "editar seus valores" #, python-format msgid "Edit %s" msgstr "Editar %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" não é um atalho válido" msgid "Disabled" msgstr "Desabilitado" msgid "Enabled" msgstr "Habilitado" msgid "Grab key combination" msgstr "Selecionar combinação de teclas" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" não é um botão válido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usar o Botão-1 do mouse sem modificadores pode lhe impossibilitar de usar a " "função do botão esquerdo. Dessa forma, poderá haver um erro de " "configuração. Você realmente deseja atribuir o botão \"%s\" ao Botão-1 do " "mouse?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" não é um efeito de canto da tela válido" msgid "None" msgstr "Nenhum" msgid "CompizConfig Settings Manager" msgstr "Gerenciador de configurações do CompizConfig" msgid "Plugin" msgstr "Plugins" msgid "Please press the new key combination" msgstr "Por favor, pressione a nova combinação de teclas" msgid "Window Title" msgstr "Título da janela" msgid "Window Role" msgstr "Função da janela" msgid "Window Name" msgstr "Nome da janela" msgid "Window Class" msgstr "Classe da janela" msgid "Window Type" msgstr "Tipo da janela" msgid "Window ID" msgstr "ID da janela" msgid "And" msgstr "E" msgid "Or" msgstr "Ou" msgid "Edit match" msgstr "Editar resultado" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valor" msgid "Grab" msgstr "Agarrar" #. Relation msgid "Relation" msgstr "Relação" #. Invert msgid "Invert" msgstr "Inverter" msgid "Browse..." msgstr "Pesquisar..." msgid "Images" msgstr "Imagens" msgid "File" msgstr "Arquivo" msgid "Open directory..." msgstr "Abrir diretório..." msgid "Open file..." msgstr "Abrir arquivo..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Este é o Gerenciador de configurações para o sistema de configuração do " "CompizConfig" # Não é um campo destinado ao nome do tradutor e sim um campo que tem que ser traduzido. msgid "translator-credits" msgstr "créditos-tradutor" msgid "An error has occured" msgstr "Ocorreu um erro" msgid "Warning" msgstr "Aviso" #, python-format msgid "Enable %s" msgstr "Habilita %s" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Procurar pelas opções do plugin %s" msgid "Use This Plugin" msgstr "Usar este plugin" msgid "Search Compiz Core Options" msgstr "Busca por opções do Compiz Core" msgid "Error" msgstr "Erro" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Entre com um filtro.\n" "Clique na imagem do teclado para capturar uma tecla para a busca." msgid "Search in..." msgstr "Procurar em..." #. Options msgid "Short description and name" msgstr "Descrição resumida e nome" msgid "Long description" msgstr "Descrição detalhada" msgid "Settings value" msgstr "Valor de configurações" msgid "Group" msgstr "Grupo" msgid "Subgroup" msgstr "Subgrupo" #. Notebook msgid "Settings" msgstr "Configurações" msgid "Loading Advanced Search" msgstr "Carregando a Busca Avançada" msgid "Add a New Profile" msgstr "Adicionar um novo Perfil" msgid "Remove This Profile" msgstr "Apagar este Perfil" msgid "Default" msgstr "Padrão" msgid "Profile" msgstr "Perfil" msgid "Import" msgstr "Importar" msgid "Import a CompizConfig Profile" msgstr "Importar um Perfil do CompizConfig" msgid "Import as..." msgstr "Importar como..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importar um Perfil do CompizConfig como um novo perfil" msgid "Export" msgstr "Exportar" msgid "Export your CompizConfig Profile" msgstr "Exportar o seu Perfil do CompizConfig" msgid "Reset to defaults" msgstr "Restaurar para valores padrões" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Restaurar o perfil do CompizConfig com todos os valores padrões" msgid "Backend" msgstr "Programa interno" msgid "Integration" msgstr "Integração" msgid "Enable integration into the desktop environment" msgstr "Habilitar a Integração com a Área de Trabalho" msgid "Profiles (*.profile)" msgstr "Perfis (*.profile)" msgid "All files" msgstr "Todos os arquivos" msgid "Save file.." msgstr "Salvar arquivo.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Você quer pular os valores de opção padrão enquanto exporta o seu perfil?" msgid "Open file.." msgstr "Abrir arquivo.." msgid "Enter a profile name" msgstr "Entre com um nome de perfil" msgid "Please enter a name for the new profile:" msgstr "Por favor, entre com o nome para o novo perfil:" msgid "Backend not found." msgstr "Programa interno não encontrado." #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordenação automática dos plugins" msgid "Disabled Plugins" msgstr "Plugins desabilitados" msgid "Enabled Plugins" msgstr "Plugins habilitados" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Você realmente deseja desabilitar a ordenação automática dos plugins? Isso " "também irá desabilitar o tratador de conflitos. Você deveria fazer isso " "somente se você souber o que está fazendo." msgid "Add plugin" msgstr "Adicionar plugin" msgid "Plugin name:" msgstr "Nome do plugin:" msgid "Insert plugin name" msgstr "Inserir nome do plugin" msgid "Preferences" msgstr "Preferências" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configuração do programa interno, dos perfis de uso, e de outras " "configurações internas usadas pelo sistema de configuração do Compiz." msgid "About" msgstr "Sobre" msgid "About CCSM..." msgstr "Sobre o CCSM..." msgid "Profile & Backend" msgstr "Perfil & Programa Interno" msgid "Plugin List" msgstr "Lista dos Plugins" msgid "Filter your Plugin list" msgstr "Filtrar sua lista de plugins" #, python-format msgid "Screen %i" msgstr "Tela %i" msgid "Screen" msgstr "Tela" msgid "Category" msgstr "Categoria" msgid "Advanced Search" msgstr "Busca Avançada" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nenhum resultado encontrado. \n" "\n" " Seu filtro de busca \"%s\" não combina com nenhum item." msgid "Configure Compiz with CompizConfig" msgstr "Configurar o Compiz com o CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Verificando possíveis conflitos, por favor aguarde" #~ msgid "Value (%s)" #~ msgstr "Valor (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Valor (%(value)s) para %(setting)s:" #, fuzzy #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s : Tipo não tratado por %s" #~ msgid "Actions" #~ msgstr "Ações" #~ msgid "Disable %s" #~ msgstr "deshabilitar %s" #~ msgid "Name" #~ msgstr "Nome" #~ msgid "Screen Edge" #~ msgstr "Canto da Telha" #~ msgid "Button %i" #~ msgstr "Botão no. %i do Rato" #~ msgid "Edge Button" #~ msgstr "Botão atribuido ao canto da telha" #~ msgid "On System Bell" #~ msgstr "Ao tocar a Campainha" #~ msgid "Edit Action: %s" #~ msgstr "Editar Ação: %s" #~ msgid "Screen Edges" #~ msgstr "Cantos da Telha" #~ msgid "Reset To Defaults" #~ msgstr "Voltar aos valores-padrão" ./compizconfig/ccsm/po/be.po0000644000004100000410000001640013246301623016224 0ustar www-datawww-data# ccsm be translation # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.7.4\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2008-04-03 11:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" #, python-format msgid "Use %(feature)s" msgstr "" #, python-format msgid "Don't use %(feature)s" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" #, python-format msgid "Enable %(plugin)s" msgstr "" #, python-format msgid "Don't enable %(feature)s" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "" #, python-format msgid "Don't enable %(plugin)s" msgstr "" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" #, python-format msgid "Enable %(require)s" msgstr "" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "" #, python-format msgid "Don't disable %(plugin)s" msgstr "" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" msgid "General" msgstr "" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "" msgid "Extras" msgstr "" msgid "Window Management" msgstr "" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "All" msgstr "" msgid "Uncategorized" msgstr "" msgid "Reset setting to the default value" msgstr "" msgid "Edit" msgstr "" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" msgid "Computing possible conflicts, please wait" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "Category" msgstr "" msgid "Advanced Search" msgstr "" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "" msgid "Plugin" msgstr "" msgid "Please press the new key combination" msgstr "" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value msgid "Value" msgstr "" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "" #. Invert msgid "Invert" msgstr "" msgid "Browse..." msgstr "" msgid "Images" msgstr "" msgid "File" msgstr "" msgid "Open directory..." msgstr "" msgid "Open file..." msgstr "" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "" msgid "Search Compiz Core Options" msgstr "" msgid "Error" msgstr "" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "" #. Options msgid "Short description and name" msgstr "" msgid "Long description" msgstr "" msgid "Settings value" msgstr "" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "" msgid "Remove This Profile" msgstr "" msgid "Default" msgstr "" msgid "Profile" msgstr "" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" ./compizconfig/ccsm/po/ja.po0000644000004100000410000003322113246301623016230 0ustar www-datawww-data# ccsm Japanese translation. # Copyright (C) 2007 opencompositing.org # This file is distributed under the same license as the compiz-fusion package. # Masaaki KANEMOTO , 2007. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.6\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-06-06 08:56+0200\n" "Last-Translator: Chris Hsin \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s プラグインの %(action)s アクションに割り当てられた %" "(binding)s の新しい設定は、 %(plugin_conflict)s プラグインの %" "(action_conflict)s アクションと干渉します。\n" "%(plugin_conflict)s プラグインの %(action_conflict)s を無効にし" "ますか?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s を無効化" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s の設定中止" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s をとにかく設定" msgid "key" msgstr "キー" msgid "button" msgstr "ボタン" msgid "edge" msgstr "エッジ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "どのプラグインからも提供されていない %(feature)s 機能を使用しよ" "うとしています。\n" "この機能をこのまま使用しますか?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s を使用" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s の使用化中止" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s により提供されている %(feature)s 機能を使用しようと" "しています。\n" "このプラグインは現在無効の状態です。\n" "この機能を利用可能にするため %(plugin)s を有効にしますか?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s を有効化" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s の有効化中止" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "%(plugin)s プラグインの %(bindings)s 割り当てのいくつかは他のプラグイ" "ンと干渉します。これらの干渉を解決しますか?" msgid "Resolve conflicts" msgstr "干渉を解決" msgid "Ignore conflicts" msgstr "干渉を無視" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s プラグインが、%(plugin)s からも提供される " "%(feature)s 機能を提供しています。" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s を無効化" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s の有効化中止" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s プラグインが %(plugin)s と干渉します。" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s の動作には、以下のプラグインで提供される %(feature)s 機能が必要です:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "これらのプラグインを有効化" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s の動作には、 %(require)s プラグインが必要です。" #, python-format msgid "Enable %(require)s" msgstr "%(require)s を有効化" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s は、 %(plugin_list)s プラグインの動作に必要な %" "(feature)s 機能を提供します。" msgid "Disable these plugins" msgstr "これらのプラグインを無効化" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s の無効化中止" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s%(plugin_list)s プラグインの動作に必要です。" msgid "General" msgstr "一般" msgid "Accessibility" msgstr "アクセシビリティ" msgid "Desktop" msgstr "デスクトップ" msgid "Extras" msgstr "エクストラ" msgid "Window Management" msgstr "ウィンドウ・マネジメント" msgid "Effects" msgstr "エフェクト" msgid "Image Loading" msgstr "画像の読み込み" msgid "Utility" msgstr "ユーティリティ" msgid "All" msgstr "すべて" msgid "Uncategorized" msgstr "未分類" msgid "N/A" msgstr "適用不可" msgid "Reset setting to the default value" msgstr "設定をデフォルト値に戻す" msgid "Edit" msgstr "編集" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "複数リストの設定。列をダブルクリックして値を編集することができます。" #, python-format msgid "Edit %s" msgstr "%s を編集" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" は有効なショートカットではありません" msgid "Disabled" msgstr "無効" msgid "Enabled" msgstr "有効" msgid "Grab key combination" msgstr "キーの組み合わせをつかむ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" は有効なボタンではありません" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "修飾キーなしで Button1 を単独使用すると、あらゆる左クリック操作が阻害され、設" "定が破綻します。本当に \"%s\" ボタンを Button1 に割り当てますか?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" は有効なエッジマスクではありません" msgid "None" msgstr "なし" msgid "CompizConfig Settings Manager" msgstr "CompizConfig 設定マネージャ" msgid "Plugin" msgstr "プラグイン" msgid "Please press the new key combination" msgstr "新しいキーの組み合わせを入力してください" msgid "Window Title" msgstr "ウィンドウ・タイトル" msgid "Window Role" msgstr "ウィンドウ・ロール" msgid "Window Name" msgstr "ウィンドウ・ネーム" msgid "Window Class" msgstr "ウィンドウ・クラス" msgid "Window Type" msgstr "ウィンドウ・タイプ" msgid "Window ID" msgstr "ウィンドウ ID" msgid "And" msgstr "かつ" msgid "Or" msgstr "または" msgid "Edit match" msgstr "マッチ条件の編集" #. Type msgid "Type" msgstr "種類" #. Value msgid "Value" msgstr "値" msgid "Grab" msgstr "取得" #. Relation msgid "Relation" msgstr "論理演算子" #. Invert msgid "Invert" msgstr "否定" # スカイドーム画像の参照ボタンで表示 msgid "Browse..." msgstr "参照..." msgid "Images" msgstr "画像" msgid "File" msgstr "ファイル" msgid "Open directory..." msgstr "ディレクトリを開く..." msgid "Open file..." msgstr "ファイルを開く..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "これは CompizConfig 設定システム用の設定マネージャです。" msgid "translator-credits" msgstr "" "Nishio Futoshi \n" "Yohsuke Ooi \n" "TABUCHI Takaaki \n" "Masaaki Kanemoto \n" "Jiro Kawada " msgid "An error has occured" msgstr "エラーが発生しました" msgid "Warning" msgstr "警告" #, python-format msgid "Enable %s" msgstr "%s を有効にする" msgid "Filter" msgstr "フィルタ" #, python-format msgid "Search %s Plugin Options" msgstr "%s プラグインのオプションを検索" msgid "Use This Plugin" msgstr "このプラグインの使用" msgid "Search Compiz Core Options" msgstr "Compiz Core のオプションを検索" msgid "Error" msgstr "エラー" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "フィルタを入力、\n" "キーショートカット検索のためキーをつかむにはキーボード画像をクリック" msgid "Search in..." msgstr "検索対象..." #. Options msgid "Short description and name" msgstr "名前や簡単な説明" msgid "Long description" msgstr "詳細な説明" msgid "Settings value" msgstr "設定値" msgid "Group" msgstr "グループ" msgid "Subgroup" msgstr "サブグループ" #. Notebook msgid "Settings" msgstr "設定" msgid "Loading Advanced Search" msgstr "詳細検索を読み込み中" msgid "Add a New Profile" msgstr "新しいプロファイルを追加" msgid "Remove This Profile" msgstr "このプロファイルを削除" msgid "Default" msgstr "デフォルト" msgid "Profile" msgstr "プロファイル" msgid "Import" msgstr "インポート" msgid "Import a CompizConfig Profile" msgstr "CompizConfig のプロファイルをインポート" msgid "Import as..." msgstr "別名でインポート..." msgid "Import a CompizConfig Profile as a new profile" msgstr "CompizConfig のプロファイルを新しいプロファイルとしてインポート" msgid "Export" msgstr "エクスポート" msgid "Export your CompizConfig Profile" msgstr "CompizConfig のプロファイルをエクスポート" msgid "Reset to defaults" msgstr "デフォルトに戻す" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "この CompizConfig プロファイル内容全体をデフォルト値にリセット" msgid "Backend" msgstr "バックエンド" msgid "Integration" msgstr "統合" msgid "Enable integration into the desktop environment" msgstr "デスクトップ環境への統合を有効にする" msgid "Profiles (*.profile)" msgstr "プロファイル (*.profile)" msgid "All files" msgstr "すべてのファイル" msgid "Save file.." msgstr "ファイルを保存..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "プロファイルをエクスポートする際に、デフォルトのオプション値を省きますか?" msgid "Open file.." msgstr "ファイルを開く.." msgid "Enter a profile name" msgstr "プロファイル名を入力" msgid "Please enter a name for the new profile:" msgstr "新しいプロファイル名を入力してください:" msgid "Backend not found." msgstr "バックエンドが見つかりません。" #. Auto sort msgid "Automatic plugin sorting" msgstr "プラグインの自動分類" msgid "Disabled Plugins" msgstr "無効なプラグイン" msgid "Enabled Plugins" msgstr "有効なプラグイン" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "本当にプラグインの自動分類を無効にしますか?この操作で干渉の処理も無効になり" "ます。何をしようとしているか理解されていない場合は、無効にすべきではありませ" "ん。" msgid "Add plugin" msgstr "プラグインを追加" msgid "Plugin name:" msgstr "プラグインの名前:" msgid "Insert plugin name" msgstr "プラグイン名を入力" msgid "Preferences" msgstr "設定" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Compiz 制御システムによって使用されるバックエンドやプロファイル、その他内部設" "定を設定します。" msgid "About" msgstr "詳細情報" msgid "About CCSM..." msgstr "CCSM について..." msgid "Profile & Backend" msgstr "プロファイルとバックエンド" msgid "Plugin List" msgstr "プラグイン・リスト" msgid "Filter your Plugin list" msgstr "プラグインリストのフィルタ" #, python-format msgid "Screen %i" msgstr "スクリーン %i" msgid "Screen" msgstr "スクリーン" msgid "Category" msgstr "カテゴリ" msgid "Advanced Search" msgstr "詳細検索" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "何も見つかりませんでした。 \n" "フィルタ \"%s\" はどのアイテムにも一致しません。" msgid "Configure Compiz with CompizConfig" msgstr "CompizConfig で Compiz を設定します" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "干渉の可能性を計算していますのでお待ちください" ./compizconfig/ccsm/po/eu.po0000644000004100000410000003033213246301623016247 0ustar www-datawww-data# translation of ccsm.po to Euskara # Copyright (C) 2007 compiz-fusion # This file is distributed under the same license as the PACKAGE package. # # Ander Elortondo , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-09-01 11:41+0200\n" "Last-Translator: Ander Elortondo \n" "Language-Team: Euskara \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s plugineko %(action)s ekintzaren %(binding)s lotura " "balio berriak gatazka sortzen du, %(plugin_conflict)s pluginaren %" "(action_conflict)s ekintzarekin. \n" "%(plugin_conflict)s pluginaren %(action_conflict)s ekintza " "ezgaitzerik nahi?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Ezgaitu %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ez aukeratu %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Aukeratu %(action)s" msgid "key" msgstr "Tekla" msgid "button" msgstr "Botoia" msgid "edge" msgstr "Ertza" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "%(feature)s ezaugarria erabiltzekotan zaude. Hau Ez ez da " "egokia edozein pluginekin.\n" "hala ere ezaugarri hau erabili nahi duzu?" #, python-format msgid "Use %(feature)s" msgstr "Erabili %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ez erabili %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s plugineko %(feature)s ezaugarria erabili nahi " "duzu.\n" "Plugin hau orain ezgaitua dago.\n" "%(plugin)s gaitu nahi duzu, ezaugarria erabilgarri izateko?" #, python-format msgid "Enable %(plugin)s" msgstr "Gaitu %(plugin)s " #, python-format msgid "Don't enable %(feature)s" msgstr "Ez gaitu %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" " %(plugin)s plugineko hainbat laster-tekla %(bindings)s beste plugin " "batzuekoekin gatazkan daude. Gatazka hauek konpondu nahi dituzu?" msgid "Resolve conflicts" msgstr "Konpondu gatazkak" msgid "Ignore conflicts" msgstr "Ez ikusi gatazkak" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugina honek %(plugin_conflict)s beste %(plugin)s pluginak " "ere ematen duen %(feature)s ezaugarria ematen du" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Ezgaitu %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ez gaitu %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s pluginak gatazkan dago %(plugin)s " "pluginarekin." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s pluginak %(feature)s ezaugarria beharrezko du, " "ondorengo pluginek emana:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Gaitu plugin hauek" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s pluginek beste hau beharrezko dute: %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Gaitu %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s pluginak %(feature)s ezaugarria ematen du, " "ondorengo pluginek beharrezko dutena: %(plugin_list)s." msgid "Disable these plugins" msgstr "Ezgaitu plugin hauek" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ez ezgaitu %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s beharrezkoa da ondorengo plugnientzat: %(plugin_list)s." msgid "General" msgstr "Orokorra" msgid "Accessibility" msgstr "Erabilerraztasuna" msgid "Desktop" msgstr "Mahaigaina" msgid "Extras" msgstr "Extrak" msgid "Window Management" msgstr "Leiho kudeaketa" msgid "Effects" msgstr "Efektuak" msgid "Image Loading" msgstr "Irudia kargatzen" msgid "Utility" msgstr "Utilitate" msgid "All" msgstr "Denak" msgid "Uncategorized" msgstr "Kategori gabekoa" msgid "N/A" msgstr "E/E" msgid "Reset setting to the default value" msgstr "Lehenetsitako balioetan jarri ezarpenak" msgid "Edit" msgstr "Editatu" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Lerro anitzeko ezarpenak. Baloreak editatzeko klik bikoitza egin lerroan." #, python-format msgid "Edit %s" msgstr "Editatu %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\"ez da baliozko laster-tekla" msgid "Disabled" msgstr "Ezgaitua" msgid "Enabled" msgstr "Gaitua" msgid "Grab key combination" msgstr "Tekla konbinazioa grabatu" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ez da baliozko botoia" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "1botoia aldaketa gabe erabiltzeak ezkerreko edozein kliki aurrea hartu " "diezaioke eta ezarpenak hautsi. Ziur \"%s\" botoia 1botoiaz ezarri nahi " "duzula?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" eza da maskara ertz baliokoa" msgid "None" msgstr "Ezer ez" msgid "CompizConfig Settings Manager" msgstr "Compiz ezarpen kudeatzailea" msgid "Plugin" msgstr "Plugin " msgid "Please press the new key combination" msgstr "Mesedez sakatu tekla konbinaketa berria" msgid "Window Title" msgstr "Leiho Izenburua" msgid "Window Role" msgstr "Leiho-rola" msgid "Window Name" msgstr "Leiho izena" msgid "Window Class" msgstr "Leiho klase" msgid "Window Type" msgstr "Leiho mota" msgid "Window ID" msgstr "Leiho ID" msgid "And" msgstr "eta" msgid "Or" msgstr "edo" msgid "Edit match" msgstr "Editatu parekatzea" #. Type msgid "Type" msgstr "Mota" #. Value msgid "Value" msgstr "Balioa" msgid "Grab" msgstr "Eutsi" #. Relation msgid "Relation" msgstr "Relazioa" #. Invert msgid "Invert" msgstr "Alderantzikatu" msgid "Browse..." msgstr "Arakatu..." msgid "Images" msgstr "Irudiak" msgid "File" msgstr "Fitxategia" msgid "Open directory..." msgstr "Zabaldu karpeta..." msgid "Open file..." msgstr "Zabaldu fitxategia..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Hau ezarpen kudeatzailea da, Compiz sistemaren ezarpenerako." msgid "translator-credits" msgstr "Itzultzaile kredituak" msgid "An error has occured" msgstr "Errore bat eman da" msgid "Warning" msgstr "Kontuz" #, python-format msgid "Enable %s" msgstr "Gaitu %s" msgid "Filter" msgstr "Iragazki" #, python-format msgid "Search %s Plugin Options" msgstr "Bilatu %s plugin aukerak" msgid "Use This Plugin" msgstr "Plugin hau erabili" msgid "Search Compiz Core Options" msgstr "Compiz core aukerak bilatu" msgid "Error" msgstr "Errorea" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Sartu iragazkia.\n" "Click the keyboard image to grab a key for which to search." msgid "Search in..." msgstr "Bilatu..." #. Options msgid "Short description and name" msgstr "Izena eta deskribapen motza" msgid "Long description" msgstr "Deskribapen luzea" msgid "Settings value" msgstr "Ezarpen balioak" msgid "Group" msgstr "Taldea" msgid "Subgroup" msgstr "Azpitaldea" #. Notebook msgid "Settings" msgstr "Ezarpenak" msgid "Loading Advanced Search" msgstr "Bilaketa aurreratua kargatzen" msgid "Add a New Profile" msgstr "Profil berria gehitu" msgid "Remove This Profile" msgstr "Ezabatu profil hau" msgid "Default" msgstr "Lehenetsia" msgid "Profile" msgstr "Profila" msgid "Import" msgstr "Inportatu" msgid "Import a CompizConfig Profile" msgstr "Inportatu Compiz ezarpen profila" msgid "Import as..." msgstr "Inportatu honela..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Inportatu Compiz ezarpen profila, profil berrira" msgid "Export" msgstr "Esportatu" msgid "Export your CompizConfig Profile" msgstr "Esportatu zure Compiz ezarpen profila" msgid "Reset to defaults" msgstr "Ezarri lehenetsiak" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Ezarrri zure Compìz ezarpen profila, lehenetsi orokorretara" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integrazioa" msgid "Enable integration into the desktop environment" msgstr "Gaitu integrazioa mahagain ingurunean" msgid "Profiles (*.profile)" msgstr "Profilak (*.profile)" msgid "All files" msgstr "Fitxategi guztiak" msgid "Save file.." msgstr "Gorde fitxategia.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Zure porfila esportatzean salto egin nahi dituzu aukera lehenetsien balioak?" msgid "Open file.." msgstr "Ireki fitxategia.." msgid "Enter a profile name" msgstr "Sartu profile izena" msgid "Please enter a name for the new profile:" msgstr "Mesedez sartu izena profil berriari:" msgid "Backend not found." msgstr "Backend not found." #. Auto sort msgid "Automatic plugin sorting" msgstr "Pluginak automatikoki antolatu" msgid "Disabled Plugins" msgstr "Plugin ezgaituak" msgid "Enabled Plugins" msgstr "Plugin gaituak" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Ziur pluginak automatikoki ordenatzea ezgaitu nahi duzula? honek konfliktu " "kuduatzailea ere ezgaituko du. Hau egiten ari zarenarekin ziur bazaude " "bakarrik egin beharko zenuke." msgid "Add plugin" msgstr "Gehitu plugina" msgid "Plugin name:" msgstr "Plugin izena:" msgid "Insert plugin name" msgstr "Sartu plugin izena" msgid "Preferences" msgstr "Aukerak" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Backend, profil eta beste barne ezarpen batzuen konfigurazioa Copiz ezarpen " "sistema erabiliz." msgid "About" msgstr "Honi buruz" msgid "About CCSM..." msgstr "CCSMri buruz..." msgid "Profile & Backend" msgstr "Profil & Backend" msgid "Plugin List" msgstr "Plugin zerrenda" msgid "Filter your Plugin list" msgstr "Iragazi zure plugin zerrenda" #, python-format msgid "Screen %i" msgstr "%i pantaila" msgid "Screen" msgstr "Pantaila" msgid "Category" msgstr "Kategoria" msgid "Advanced Search" msgstr "Bilaketa aureratua" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" " ez du aurkitu \n" "\n" "Zure \"%s\" iragazkiak ez du elementurik aurkitu " msgid "Configure Compiz with CompizConfig" msgstr "Konfiguratu Compiz CompizConfig erabiliz" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Gatazkak ote dauden aztertzen. Mesedez itxaron" #~ msgid "Value (%s)" #~ msgstr "Balioa (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s-dako balioa (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s ezohiko lista mota %s -entzat" #~ msgid "Actions" #~ msgstr "Ekintzak" ./compizconfig/ccsm/po/ml_IN.po0000644000004100000410000003422013246301623016634 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-04-10 13:32+0200\n" "Last-Translator: Jesse P Francis \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s എന്ന പ്ലഗിനിലെ %(action)s എന്ന നടപടിയുടെ " "%(binding)s എന്ന ബൈന്‍ഡിങ്ങിന്റെ പുതിയ മൂല്യം %(plugin_conflict)s " "എന്ന പ്ലഗിനിലെ %(action_conflict)s എന്ന നടപടിയുമായി " "പൊരുത്തപ്പെടുന്നില്ല.\n" " %(plugin_conflict)s എന്ന പ്ലഗിനിലെ %(action_conflict)s എന്ന " "നടപടി അപ്രാവര്‍ത്തികമാക്കണോ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s അപ്രാവര്‍ത്തികമാക്കുക" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s സജ്ജമാക്കരുതു്" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s എന്താണെങ്കിലും സജ്ജമാക്കുക." msgid "key" msgstr "താക്കോല്‍" msgid "button" msgstr "ബട്ടണ്‍" msgid "edge" msgstr "വക്കു്" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ഒരു പ്ലഗിനും നല്‍കാത്ത %(feature)s എന്ന വിശേഷത നിങ്ങള്‍ " "ഉപയോഗിക്കാന്‍ ശ്രമിക്കുന്നു.\n" "ഈ വിശേഷത എന്താണെങ്കിലും ഉപയോഗിക്കണോ?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ഉപയോഗിക്കുക" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ഉപയോഗിക്കാതിരിക്കുക" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s എന്ന പ്ലഗിന്‍ നല്‍കുന്ന %(feature)s എന്ന വിശേഷത " "നിങ്ങള്‍ ഉപയോഗിക്കാന്‍ ശ്രമിക്കുന്നു.\n" "ഈ പ്ലഗിന്‍ ഇപ്പോള്‍ അപ്രാവര്‍ത്തികമാണു്.\n" "ഈ വിശേഷത ലഭ്യമാക്കാനായി %(plugin)s എന്ന പ്ലഗിന്‍ " "പ്രാവര്‍ത്തികമാക്കണോ?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s പ്രാവര്‍ത്തികമാക്കുക" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s പ്രാവര്‍ത്തികമാക്കരുതു്" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "%(plugin)s എന്ന പ്ലഗിനിന്റെ ചില %(bindings)s ബൈന്‍ഡിങ്ങുകള്‍ വേറെ " "പ്ലഗിനുകളുമായി പൊരുത്തപ്പെടുന്നില്ല. ഈ പൊരുത്തക്കേടുകള്‍ പരിഹരിക്കണോ?" msgid "Resolve conflicts" msgstr "പൊരുത്തക്കേടുകള്‍ പരിഹരിക്കുക" msgid "Ignore conflicts" msgstr "പൊരുത്തക്കേടുകള്‍ അവഗണിക്കുക" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s എന്ന പ്ലഗിന്‍ നല്‍കുന്ന %(feature)s എന്ന " "വിശേഷത %(plugin)s -ഉം നല്‍കുന്നു." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s അപ്രാവര്‍ത്തികമാക്കുക" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s പ്രാവര്‍ത്തികമാക്കാതിരിക്കുക" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s എന്ന പ്ലഗിന്‍ %(plugin)s എന്നതുമായി " "പൊരുത്തപ്പെടുന്നില്ല." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s എന്നതിനു് %(feature)s എന്ന വിശേഷത(കള്‍) " "ആവശ്യമുണ്ടു്, ഇനിപ്പറയുന്ന പ്ലഗിനുകള്‍ അവ നല്‍കുന്നു:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "ഈ പ്ലഗിനുകള്‍ പ്രാവര്‍ത്തികമാക്കുക" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s എന്നതിനു് %(require)s എന്ന പ്ലഗിന്‍ ആവശ്യമുണ്ടു്." #, python-format msgid "Enable %(require)s" msgstr "%(require)s പ്രാവര്‍ത്തികമാക്കുക" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s എന്നതു്‌ %(feature)s എന്ന വിശേഷത നല്‍കുന്നു, അതു് " "%(plugin_list)s എന്നീ പ്ലഗിനുകള്‍ക്കാവശ്യമുണ്ടു്." msgid "Disable these plugins" msgstr "ഈ പ്ലഗിനുകള്‍ അപ്രാവര്‍ത്തികമാക്കുക" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s എന്നതു് അപ്രാവര്‍ത്തികമാക്കാതിരിക്കുക" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin)s എന്നതു് %(plugin_list)s എന്നീ " "പ്ലഗിനുകള്‍ക്കാവശ്യമുണ്ടു്." msgid "General" msgstr "പൊതുവായതു്" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "പണിയിടം" msgid "Extras" msgstr "കൂടുതല്‍" msgid "Window Management" msgstr "ജാലക നോക്കിനടത്തല്‍" msgid "Effects" msgstr "" msgid "Image Loading" msgstr "" msgid "Utility" msgstr "" msgid "All" msgstr "എല്ലാം" msgid "Uncategorized" msgstr "വിഭാഗീകരിക്കപ്പെടാത്തവ" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "" msgid "Edit" msgstr "തിരുത്തുക" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "%s തിരുത്തുക" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ഒരു ശരിയായ കുറുക്കുവഴിയല്ല" msgid "Disabled" msgstr "" msgid "Enabled" msgstr "" msgid "Grab key combination" msgstr "" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ഒരു ശരിയായ ബട്ടണല്ല" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "ഒന്നുമില്ല" msgid "CompizConfig Settings Manager" msgstr "" msgid "Plugin" msgstr "പ്ലഗ്ഗിന്‍" msgid "Please press the new key combination" msgstr "പുതിയ കീ കോമ്പിനേഷന്‍ അമര്‍ത്തുക" msgid "Window Title" msgstr "വിന്‍ഡോ തലക്കെട്ട്" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "തരം" #. Value msgid "Value" msgstr "മൂല്യം" msgid "Grab" msgstr "" #. Relation msgid "Relation" msgstr "ബന്ധം" #. Invert msgid "Invert" msgstr "" msgid "Browse..." msgstr "തിരയുക..." msgid "Images" msgstr "ചിത്രങ്ങള്‍" msgid "File" msgstr "ഫയല്‍" msgid "Open directory..." msgstr "ഡയറെക്റ്ററി തുറക്കുക..." msgid "Open file..." msgstr "ഫയല്‍ തുറക്കുക..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "" msgid "Warning" msgstr "മുന്നറിയിപ്പ്" #, python-format msgid "Enable %s" msgstr "" msgid "Filter" msgstr "ഫില്‍ട്ടര്‍" #, python-format msgid "Search %s Plugin Options" msgstr "" msgid "Use This Plugin" msgstr "ഈ പ്ലഗ്ഗിന്‍ ഉപയോഗിക്കുക" msgid "Search Compiz Core Options" msgstr "" #, fuzzy msgid "Error" msgstr "പിഴവ്" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "" #. Options msgid "Short description and name" msgstr "ചെറു വിവരണവും പേരും" msgid "Long description" msgstr "വിവരണം" #, fuzzy msgid "Settings value" msgstr "ക്രമീകരണ മൂല്യം" msgid "Group" msgstr "കൂട്ടം" msgid "Subgroup" msgstr "ചെറുകൂട്ടം" #. Notebook msgid "Settings" msgstr "ക്രമീകരണങ്ങള്‍" msgid "Loading Advanced Search" msgstr "" msgid "Add a New Profile" msgstr "പുതിയ ഒരു പ്രൊഫൈല്‍ ചേര്‍ക്കുക" msgid "Remove This Profile" msgstr "ഈ പ്രൊഫൈല്‍ ഉപേക്ഷിക്കുക" msgid "Default" msgstr "സ്വതേ" msgid "Profile" msgstr "" msgid "Import" msgstr "ഇറക്കുമതി ചെയ്യുക" msgid "Import a CompizConfig Profile" msgstr "CompizConfig പ്രൊഫൈല്‍ ഇറക്കുമതി ചെയ്യുക" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "ഒരു പുതിയ പ്രൊഫൈല്‍ പോലെ CompizConfig പ്രൊഫൈല്‍ ഇറക്കുമതി ചെയ്യുക" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "പ്രൊഫൈലുകള്‍ (*.profile)" msgid "All files" msgstr "എല്ലാ ഫയലുകളും" msgid "Save file.." msgstr "സേവ് ചെയ്യുക.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "ഫയല്‍ ഓപ്പണ്‍ ചെയ്യുക.." msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "പ്ലഗ്ഗിന്‍ ചേര്‍ക്കുക" msgid "Plugin name:" msgstr "പ്ലഗ്ഗിന്‍ പേര്:" msgid "Insert plugin name" msgstr "" msgid "Preferences" msgstr "ക്രമീകരങ്ങള്‍" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "CCSM-നെക്കുറിച്ച്..." msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "പ്ലഗ്ഗിന്‍ പട്ടിക" msgid "Filter your Plugin list" msgstr "" #, python-format msgid "Screen %i" msgstr "" msgid "Screen" msgstr "" msgid "Category" msgstr "വിഭാഗം" msgid "Advanced Search" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" msgid "Configure Compiz with CompizConfig" msgstr "കോമ്പിസ് CompizConfig ഉപയോഗിച്ച് ക്രമീകരിക്കുക" ./compizconfig/ccsm/po/cs.po0000644000004100000410000002775613246301623016263 0ustar www-datawww-data# Czech translation of ccsm. # Copyright (C) 2007 Petr Vlašic # This file is distributed under the same license as the ccsm package. # Petr Vlašic , 2007. # msgid "" msgstr "" "Project-Id-Version: ccsm 0.6.0\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-02-11 03:46+0100\n" "Last-Translator: Tomas Hejatko \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Nová hodnota zkratky %(binding)s pro akci %(action)s v modulu %" "(plugin)s je ve sporu s akcí %(action_conflict)s v modulu %" "(plugin_conflict)s .\n" "Chcete zkázat %(action_conflict)sv modulu %(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Vypnout %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Nenastavovat %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Přesto nastavit %(action)s" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Pokoušíte se použít funkci %(feature)s, která není poskytována žádným " "modulem.\n" "Přejete si i přesto použít tuto funkci?" #, python-format msgid "Use %(feature)s" msgstr "Použít %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Nepoužívat %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Pokoušíte se použít funkci %(feature)s,která je poskytována modulem " "%(plugin)s.\n" "Tento modul je momentálně vypnut.\n" "Přejete si zapnout modul %(plugin)s aby bylo možno tuto funkci " "zpřístupnit?" #, python-format msgid "Enable %(plugin)s" msgstr "Zapnout %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Nezapínat %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Modul %(plugin_conflict)s poskytuje funkci %(feature)s, která " "je také poskytována modulem %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Vypnout %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Nezapínat %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Modul %(plugin_conflict)s je v konfliktu s modulem %(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "Modul %(plugin)s vyžaduje funkci %(feature)s, která je " "poskytována následujícími moduly:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Zapnout tyto moduly" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s vyžaduje modul %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Zapnout %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "Modul %(plugin)sposkytuje funkci %(feature)sjež je vyžadována " "moduly %(plugin_list)s" msgid "Disable these plugins" msgstr "Vypnout tyto moduly" #, python-format msgid "Don't disable %(plugin)s" msgstr "Nevypínat %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "Modul %(plugin)s je vyžadován moduly %(plugin_list)s." msgid "General" msgstr "Obecné" msgid "Accessibility" msgstr "Přístupnost" msgid "Desktop" msgstr "Pracovní plocha" msgid "Extras" msgstr "Doplňky" msgid "Window Management" msgstr "Správa oken" msgid "Effects" msgstr "Efekty" msgid "Image Loading" msgstr "Načítání obrázku" msgid "Utility" msgstr "Nástroj" msgid "All" msgstr "Vše" msgid "Uncategorized" msgstr "Nezařazeno" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Vrátit nastavení do výchozích hodnot" msgid "Edit" msgstr "Editovat" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Seznam nastavení. Poklepáním na řádek můžete editovat hodnoty." #, python-format msgid "Edit %s" msgstr "Editovat %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" není platná klávesová zkratka" msgid "Disabled" msgstr "Vypnuto" msgid "Enabled" msgstr "Zapnuto" msgid "Grab key combination" msgstr "Získat klávesovou kombinaci" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" není platné tlačítko" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Použití Tlačítka1 bez modifikátorů může zabránit jakémukoliv kliknutí levým " "tlačítkem myši a takto narušit vaši konfiguraci. Chcete opravdu nastavit \"%s" "\" na Tlačítko1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" není platná rohová maska" msgid "None" msgstr "Žádný" msgid "CompizConfig Settings Manager" msgstr "Manažer nastavení Compizu" #, fuzzy msgid "Plugin" msgstr "Seznam modulů" msgid "Please press the new key combination" msgstr "Prosím, zmáčkněte novou klávesovou kombinaci" msgid "Window Title" msgstr "Název okna" msgid "Window Role" msgstr "Úloha okna" msgid "Window Name" msgstr "Jméno okna" msgid "Window Class" msgstr "Třída okna" msgid "Window Type" msgstr "Typ okna" msgid "Window ID" msgstr "Identifikátor okna" msgid "And" msgstr "A" msgid "Or" msgstr "Nebo" msgid "Edit match" msgstr "Editovat shodu" #. Type msgid "Type" msgstr "Typ" #. Value msgid "Value" msgstr "Hodnota" msgid "Grab" msgstr "Uchopit" #. Relation msgid "Relation" msgstr "Relace" #. Invert msgid "Invert" msgstr "Invertovat" #, fuzzy msgid "Browse..." msgstr "Hledat pro" msgid "Images" msgstr "Obrázky" msgid "File" msgstr "Soubor" msgid "Open directory..." msgstr "Otevřít adresář..." msgid "Open file..." msgstr "Otevřít soubor..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Toto je manažer nastavení konfiguračního systému Compizu." msgid "translator-credits" msgstr "" "Petr Vlašic \n" "David Šmíd " msgid "An error has occured" msgstr "Vyskytla se chyba" msgid "Warning" msgstr "Upozornění" #, python-format msgid "Enable %s" msgstr "Zapnout %s" msgid "Filter" msgstr "Filtr" #, python-format msgid "Search %s Plugin Options" msgstr "Hledat nastavení modulu %s" msgid "Use This Plugin" msgstr "Použít tento modul" msgid "Search Compiz Core Options" msgstr "Hledat nastavení jádra Compizu" msgid "Error" msgstr "Chyba" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "Hledat v..." #. Options msgid "Short description and name" msgstr "Stručném popise a jméně" msgid "Long description" msgstr "Podrobném popise" msgid "Settings value" msgstr "Nastavení hodnot" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "Nastavení" #, fuzzy msgid "Loading Advanced Search" msgstr "Pokročilé vyhledávání" msgid "Add a New Profile" msgstr "Přidat nový profil" msgid "Remove This Profile" msgstr "Odstranit vybraný profil" msgid "Default" msgstr "Výchozí" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importovat" msgid "Import a CompizConfig Profile" msgstr "Importovat profil" msgid "Import as..." msgstr "Importovat jako..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importovat profil jako nový" msgid "Export" msgstr "Exportovat" msgid "Export your CompizConfig Profile" msgstr "Exportovat svůj profil" msgid "Reset to defaults" msgstr "Vrátit nastavení do výchozích hodnot" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Resetovat profil do výchozích hodnot" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integrace" msgid "Enable integration into the desktop environment" msgstr "Zapnout integraci do pracovního prostředí" msgid "Profiles (*.profile)" msgstr "Profily (*.profile)" msgid "All files" msgstr "Všechny soubory" msgid "Save file.." msgstr "Uložit soubor.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Chcete přeskočit výchozí hodnoty nastavení během exportu svého profilu?" msgid "Open file.." msgstr "Otevřít soubor.." msgid "Enter a profile name" msgstr "Zadejte jméno profilu" msgid "Please enter a name for the new profile:" msgstr "Prosím zadejte jméno pro nový profil:" msgid "Backend not found." msgstr "Backend nenalezen." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatické řazení modulů" msgid "Disabled Plugins" msgstr "Vypnuté moduly" msgid "Enabled Plugins" msgstr "Zapnuté moduly" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Opravdu chcete vypnout automatické řazení modulů? Tato akce také zapříčiní " "vypnutí vyhledávání konfliktů. Pokračujte pouze v případě, kdy opravdu víte " "co děláte." msgid "Add plugin" msgstr "Přidat modul" msgid "Plugin name:" msgstr "Jméno modulu:" msgid "Insert plugin name" msgstr "Vložte jméno modulu" msgid "Preferences" msgstr "Předvolby" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurace backendu, profilu a ostatních interních nastavení používaných " "konfiguračním systémem Compizu." msgid "About" msgstr "O programu" msgid "About CCSM..." msgstr "O programu CCSM..." msgid "Profile & Backend" msgstr "Profil a backend" msgid "Plugin List" msgstr "Seznam modulů" msgid "Filter your Plugin list" msgstr "Filtrovat·váš seznam modulů" #, python-format msgid "Screen %i" msgstr "Obrazovka %i" msgid "Screen" msgstr "Obrazovka" msgid "Category" msgstr "Kategorie" msgid "Advanced Search" msgstr "Pokročilé vyhledávání" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nenalezena žádná shoda. \n" "\n" "Váš filtr \"%s\"nevyhovuje žádné položce." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Vyhodnocuji možné konfilkty, prosím čekejte" #~ msgid "Value (%s)" #~ msgstr "Hodnota (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Hodnota (%(value)s) pro nastavení %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Neřešitelný typ listu %s pro %s" #~ msgid "Actions" #~ msgstr "Akce" ./compizconfig/ccsm/po/bn_IN.po0000644000004100000410000004134513246301623016631 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-03-15 16:15+0100\n" "Last-Translator: biswajyoti mahanta \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s প্লাগইন এর %(action)s কাজের জন্য নতুন মান %(binding)s " "ব্যবহৃত হবে,\n" "কিন্তু এটি %(plugin_conflict)s প্লাগইন এর %(action_conflict)s এর " "সাথে সাংঘর্ষিক।\n" "আপনি কি %(plugin_conflict)s প্লাগইন এর জন্য %(action_conflict)s " "কে নিষ্ক্রীয় করতে চান?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s কে নিষ্ক্রীয় করো" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s কে বহাল করো না" #, python-format msgid "Set %(action)s anyway" msgstr "যেভাবে হোক %(action)s কে বহাল করো" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "আপনি %(feature)s ব্যব‌হার ক‌রতে চাচ্ছেন।এটির জন্য %(plugin)s " "প্রয়োজন.\n" "যা বর্তমানে নিষ্ক্রীয় আছে.\n" "আপনি কি %(plugin)s কে সক্রিয় করতে চান?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s কে সক্রিয় করো" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s কে সক্রিয় করো না" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "আপনি %(feature)s ব্যব‌হার ক‌রতে চাচ্ছেন।এটির জন্য %(plugin)s " "প্রয়োজন.\n" "যা বর্তমানে নিষ্ক্রীয় আছে.\n" "আপনি কি %(plugin)s কে সক্রিয় করতে চান?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s কে সক্রিয় করো" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s কে সক্রিয় করো না" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s প্লাগইন %(feature)s কাজ করে। %(plugin)s একই কাজ করে" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s কে নিষ্ক্রীয় করো" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s কে সক্রিয় করো না" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s এর সাথে %(plugin)s এর সংঘর্ষ হচ্ছে" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s এর জন্য %(feature)s প্রয়োজন,যা পাওয়া যাবে নিচের " "প্লাগইন থেকে:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "এই প্লাগইন গুলো সক্রিয় করো" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s এর জন্য %(require)s প্লাগইন দরকার হবে " #, python-format msgid "Enable %(require)s" msgstr "%(require)s কে সক্রিয় করো" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s প্লাগইন এর জন্য %(feature)s লাগবে, যা %" "(plugin)s দিয়ে করা হয়" msgid "Disable these plugins" msgstr "এই প্লাগইন গুলো নিষ্ক্রীয় করো" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s কে নিষ্ক্রীয় করো না" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin_list)s এর জন্য %(plugin)s দরকার হবে" msgid "General" msgstr "সাধারন" msgid "Accessibility" msgstr "প্রবেশযোগ্যতা" msgid "Desktop" msgstr "ডেস্কটপ" msgid "Extras" msgstr "অতিরিক্ত" msgid "Window Management" msgstr "উইন্ডো পরিচালনা" msgid "Effects" msgstr "প্রভাবগুলি" msgid "Image Loading" msgstr "চিত্র লোড করছে" msgid "Utility" msgstr "উপযোগিতা" msgid "All" msgstr "সব" msgid "Uncategorized" msgstr "সাজানো হয়নি" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "মূল মানে ফিরে যাও" msgid "Edit" msgstr "সম্পাদনা" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "অনেক্গুলো পছন্দ।আপনার কোন পছন্দ সম্পাদন করতে হলে ওই সারিতে ক্লিক করুন" #, python-format msgid "Edit %s" msgstr "%s কে সম্পাদনা" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" লিন্ক টি ভুল" msgid "Disabled" msgstr "নিষ্ক্রিয়" msgid "Enabled" msgstr "সক্রিয়" msgid "Grab key combination" msgstr "চাবি ঠিক করুন" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" বাটন হিসেবে গ্রহণযোগ্য নয়" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "সাথে আর কোন কী ছাড়া বাম বাটন ব্যবহার করলে আপনি আর অন্য কাজে লেফট ক্লিক ব্যবহার " "করতে পারবেন নাআপনি কি আসলেই \"%s\" হিসেবে বাম বাটন ব্যবহার করতে চান?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" কোনার মাস্ক হিসেবে গ্রহণযোগ্য নয়" msgid "None" msgstr "কোনটাই না" msgid "CompizConfig Settings Manager" msgstr "কমপিজ কনফিগ ব্যবস্থাপক" #, fuzzy msgid "Plugin" msgstr "প্লাগইন এর তালিকা" msgid "Please press the new key combination" msgstr "নতুন কীগুলো চাপুন" msgid "Window Title" msgstr "উইন্ডো শীর্ষ" msgid "Window Role" msgstr "উইন্ডোর ভূমিকা" msgid "Window Name" msgstr "উইন্ডোর নাম" msgid "Window Class" msgstr "উইন্ডোর শ্রেণী" msgid "Window Type" msgstr "উইন্ডোর ধরণ" msgid "Window ID" msgstr "উইন্ডোর ID" msgid "And" msgstr "এবং" msgid "Or" msgstr "অথবা" msgid "Edit match" msgstr "মিলগুলি সম্পাদন করা" #. Type msgid "Type" msgstr "প্রকার" #. Value msgid "Value" msgstr "মান" msgid "Grab" msgstr "ধরা" #. Relation msgid "Relation" msgstr "সম্পর্ক" #. Invert msgid "Invert" msgstr "উল্টানো" #, fuzzy msgid "Browse..." msgstr "খুজে দেখুন" msgid "Images" msgstr "ছবি" msgid "File" msgstr "ফাইল" msgid "Open directory..." msgstr "ডিরেক্টরি খুলুন" msgid "Open file..." msgstr "ফাইল খুলুন" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "এটি হলো কমপিজ এর পছন্দ ঠিক করার জায়গা" msgid "translator-credits" msgstr "অনুবাদ করেছেন" msgid "An error has occured" msgstr "একটা সমস্যা হয়েছে" msgid "Warning" msgstr "সতর্কতাবাণী" #, python-format msgid "Enable %s" msgstr "%s কে সক্রিয় করো" msgid "Filter" msgstr "ছাকা" #, python-format msgid "Search %s Plugin Options" msgstr "%s প্লাগইন এর পছন্দ খোজো" msgid "Use This Plugin" msgstr "এই প্লাগইন ব্যবহার করো" msgid "Search Compiz Core Options" msgstr "কমপিজ কোর এর পছন্দ এর মধ্যে খোজো" msgid "Error" msgstr "সমস্যা" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "ফিলটার এ এন্টার করোন.\n" "পছন্দ মতন কিবর্ড এ বাটান ব্যবহার করোন" msgid "Search in..." msgstr "এর মধ্যে খোজো" #. Options msgid "Short description and name" msgstr "সংক্ষিপ্ত নাম ও বিবরণ" msgid "Long description" msgstr "সম্পূর্ণ বিবরন" msgid "Settings value" msgstr "পছন্দের মান" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "পছন্দ" #, fuzzy msgid "Loading Advanced Search" msgstr "উন্নত অনুসন্ধান" msgid "Add a New Profile" msgstr "নতুন প্রোফাইল যোগ করুন" msgid "Remove This Profile" msgstr "এই প্রোফাইল সরিয়ে ফেলো" msgid "Default" msgstr "মূল মান" msgid "Profile" msgstr "প্রোফাইল" msgid "Import" msgstr "আমদানি" msgid "Import a CompizConfig Profile" msgstr "কমপিজ কনফিগ এর প্রোফাইল আমদানি করো" msgid "Import as..." msgstr "বিশেষভাবে আম্দানি করো" msgid "Import a CompizConfig Profile as a new profile" msgstr "কমপিজ কনফিগ এর প্রোফাইল নতুন প্রোফাইল হিসেবে আমদানি করো" msgid "Export" msgstr "রপ্তানি" msgid "Export your CompizConfig Profile" msgstr "আপনার কমপিজ কনফিগ এর প্রোফাইল রপ্তানি করুন" msgid "Reset to defaults" msgstr "মূল মানে ফেরৎ নাও" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "আপনার কমপিজ কনফিগ এর প্রোফাইল মূল মানে ফেরৎ নিন" msgid "Backend" msgstr "ব্যাকএন্ড" msgid "Integration" msgstr "মিশে যাওয়া" msgid "Enable integration into the desktop environment" msgstr "ডেস্কটপের পরিবেশের সাথে মিশে যাবে" msgid "Profiles (*.profile)" msgstr "প্রোফাইল (*.profile)" msgid "All files" msgstr "সব ফাইল" msgid "Save file.." msgstr "ফাইল সংরক্ষণ করুন" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "আপনার প্রোফাইল প্রেরণ করার সময় আপনি কি সত্যিই প্রথাস্বরূপ বিকল্পের মূল্যগুলি বাদ দিয়ে " "যেতে চান?" msgid "Open file.." msgstr "ফাইল খুলুন" msgid "Enter a profile name" msgstr "প্রোফাইলের নাম ঠিক করুন" msgid "Please enter a name for the new profile:" msgstr "নতুন প্রোফাইলের নাম ঠিক করুনঃ" msgid "Backend not found." msgstr "ব্যকএন্ড পাওয়া যায়নি" #. Auto sort msgid "Automatic plugin sorting" msgstr "স্বয়ংক্রিয় প্লাগইন সাজানো" msgid "Disabled Plugins" msgstr "নিষ্ক্রিয় প্লাগইন" msgid "Enabled Plugins" msgstr "সক্রিয় প্লাগইন" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "আপনি কি স্বয়ংক্রিয়ভাবে প্লাগইন সঞ্চয়ের বৈশিষ্ট্যটি অসমর্থ করতে চান ? এটি করা হলে " "দ্বন্দ পরিচালনার কাজটি ব্যাহত হবে. আপনি কি করতে যাচ্ছেন তা যদি আপনার জানা থাকে " "তাহলে আপনি এটা করতে পারেন." msgid "Add plugin" msgstr "প্লাগইন যোগ করুন" msgid "Plugin name:" msgstr "প্লাগইন এর নামঃ" msgid "Insert plugin name" msgstr "প্লাগইন এর নাম লিখুন" msgid "Preferences" msgstr "আনুকূল্য" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "কমপিজ কনফিগারেশন এর ব্যবহৃত প্রোফাইল,ব্যকএন্ড ও অভ্যন্তরীন পছন্দ এর মান ঠিক করুন" msgid "About" msgstr "পরিচিতি" msgid "About CCSM..." msgstr "সিসিএসএম পরিচিতি" msgid "Profile & Backend" msgstr "প্রোফাইল ও ব্যকএন্ড" msgid "Plugin List" msgstr "প্লাগইন এর তালিকা" msgid "Filter your Plugin list" msgstr "আপনার প্লাগইন তালিকা ছাকুন" #, python-format msgid "Screen %i" msgstr "পর্দার %i" msgid "Screen" msgstr "পর্দা" msgid "Category" msgstr "শ্রেণী" msgid "Advanced Search" msgstr "উন্নত অনুসন্ধান" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "এরকম কিছু পাওয়া যায়নি. \n" "\n" " আপনার ছাকুনি \"%s\" এর সাথে মিলওয়ালা কোন কিছু পাওয়া যায়নি." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "সম্ভাব্য সংঘর্ষ হিসাব করা হচ্ছে।অনুগ্রহ করে অপেক্ষা করুন" #~ msgid "Value (%s)" #~ msgstr "মান (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s এর জন্য মান (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s হলো %s এর জন্য অপরিচালিত তালিকা" #~ msgid "Actions" #~ msgstr "কাজ" ./compizconfig/ccsm/po/ar.po0000644000004100000410000003217613246301623016250 0ustar www-datawww-data# translation of ccsm.po to Arabic # OsamaKhalid , 2009. # ccsm ar translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # 2007, Banxoo msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-02-06 20:36+0300\n" "Last-Translator: OsamaKhalid \n" "Language-Team: Arabic\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "القيمة الجديدة للملزم %(binding)s لتنفيذ الإجراء %(action)s في الملحق " "%(plugin)s تتداخل مع الإجراء %(action_conflict)s الذي يتبع " "للملحق %(plugin_conflict)s.\n" "أتريد تعطيل %(action_conflict)s في الملحق %(plugin_conflict)s؟" #, python-format msgid "Disable %(action_conflict)s" msgstr "عطّل %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "لا تضبط %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "حدد %(action)s على كل الأحوال" msgid "key" msgstr "مفتاح" msgid "button" msgstr "زر" msgid "edge" msgstr "حافة" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "أنت بصدد استعمال الميزة %(feature)s اللتي لم يوفّرها أي ملحق.\n" "أتريد استخدام هذه الميزة على كل حال؟" #, python-format msgid "Use %(feature)s" msgstr "استخدم %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "لا تستخدم %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "أنت بصدد استعمال الميزة %(feature)s اللتي وفّرها %(plugin)s.\n" "هذا الملحق معطّل حاليا.\n" "أتريد تمكين %(plugin)s لتصبح الميزة متوفرة؟" #, python-format msgid "Enable %(plugin)s" msgstr "مكّن %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "لا تمكّن %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "بعض تثبيتات %(bindings)s للملحقات %(plugin)s تتعارض مع ملحقات أخرى . " "أتريد حل هذا التعارض؟" msgid "Resolve conflicts" msgstr "حل التعارضات" msgid "Ignore conflicts" msgstr "تجاهل التعارضات" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "الملحق %(plugin_conflict)s يوفر الميزة %(feature)s الموفّرة " "أيضا بواسطة %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "عطّل %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "لا تمكّن %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "الملحق %(plugin_conflict)s يتداخل مع %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s توفر الميزة %(feature)s المطلوبة من الملحقات " "التالية:\n" " %(plugin_list)s" msgid "Enable these plugins" msgstr "مكّن هذه الإضافات" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s بحاجة إلى الإضافة %(require)s." #, python-format msgid "Enable %(require)s" msgstr "مكّن %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s توفر الميزة %(feature)s المطلوبة من الملحقات %" "(plugin_list)s." msgid "Disable these plugins" msgstr "عطّل هذه الإضافات" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s لا تعطّل " #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s مطلوبة للملحقات %(plugin_list)s." msgid "General" msgstr "عام" msgid "Accessibility" msgstr "الإتاحة" msgid "Desktop" msgstr "سطح المكتب" msgid "Extras" msgstr "زواىٔد" msgid "Window Management" msgstr "إدارة النوفذة" msgid "Effects" msgstr "مؤثرات" msgid "Image Loading" msgstr "تحميل الصورة" msgid "Utility" msgstr "فاىٔدة" msgid "All" msgstr "الكل" msgid "Uncategorized" msgstr "غير مصنّف" msgid "N/A" msgstr "غير متوفر" msgid "Reset setting to the default value" msgstr "أعد الضبط إلى القيمة المبدئية" msgid "Edit" msgstr "حرّر" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "إعادات اللوائح المتعددة. تستطيع النقر مزدوجا على صف لتحرير قيمه." #, python-format msgid "Edit %s" msgstr "حرّر %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ليس اختصارا صحيحا" msgid "Disabled" msgstr "معطّل" msgid "Enabled" msgstr "ممكّن" msgid "Grab key combination" msgstr "اقبض تجميعة المفاتيح" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ليس زرا صحيحا" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "استخدام الزر1 بدون مغيرات يمكن أن يحجب أي نقر أيسر وبالتالي تعطيب تشكيلاتك. " "أتريد حقا تحديد الزر \"%s\" كالزر1؟" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ليس قناع حافة صحيح" msgid "None" msgstr "لا شيء" msgid "CompizConfig Settings Manager" msgstr "مدير إعدادات CompizConfig" msgid "Plugin" msgstr "الملحق" msgid "Please press the new key combination" msgstr "من فضلك أدخل تجميعة المفاتيح الجديدة" msgid "Window Title" msgstr "عنوان النافذة" msgid "Window Role" msgstr "دور النافذة" msgid "Window Name" msgstr "اسم النافذة" msgid "Window Class" msgstr "فئة النافذة" msgid "Window Type" msgstr "نوع النافذة" msgid "Window ID" msgstr "هوية النافذة" msgid "And" msgstr "و" msgid "Or" msgstr "أو" msgid "Edit match" msgstr "حرّر المتطابقات" #. Type msgid "Type" msgstr "النوع" #. Value msgid "Value" msgstr "القيمة" msgid "Grab" msgstr "اقبض" #. Relation msgid "Relation" msgstr "العلاقة" #. Invert msgid "Invert" msgstr "اقلب" msgid "Browse..." msgstr "تصفّح.." msgid "Images" msgstr "صور" msgid "File" msgstr "ملف" msgid "Open directory..." msgstr "افتح دليلا...." msgid "Open file..." msgstr "افتح ملفا..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "هذا مدير إعدادات لنظام تشكيل CompizConfig." msgid "translator-credits" msgstr "" "أسامة خالد \n" "وآخرون" msgid "An error has occured" msgstr "حدث خطأ" msgid "Warning" msgstr "إنذار" #, python-format msgid "Enable %s" msgstr "مكّن %s" msgid "Filter" msgstr "مرشّح" #, python-format msgid "Search %s Plugin Options" msgstr "ابحث في خيارات الملحق %s" msgid "Use This Plugin" msgstr "استخدم هذه الإضافة" msgid "Search Compiz Core Options" msgstr "ابحث في خيارات نواة Compiz." msgid "Error" msgstr "خطأ" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "أدخل مرشّحا.\n" "انقر صورة لوحة المفاتيح لقبض مفتاح تبحث عنه." msgid "Search in..." msgstr "ابحث في.." #. Options msgid "Short description and name" msgstr "وصف قصير واسم" msgid "Long description" msgstr "وصف طويل" msgid "Settings value" msgstr "قيمة الإعدادات" msgid "Group" msgstr "مجموعة" msgid "Subgroup" msgstr "مجموعة فرعية" #. Notebook msgid "Settings" msgstr "إعدادات" msgid "Loading Advanced Search" msgstr "تحميل البحث المتقدم" msgid "Add a New Profile" msgstr "أضف ملفا جديدا" msgid "Remove This Profile" msgstr "أزل هذا الملف" msgid "Default" msgstr "المبدئي" msgid "Profile" msgstr "الملف" msgid "Import" msgstr "استورد" msgid "Import a CompizConfig Profile" msgstr "استورد ملف CompizConfig" msgid "Import as..." msgstr "استورد كـ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "استورد ملف CompizConfig كملف جديد" msgid "Export" msgstr "صدّر" msgid "Export your CompizConfig Profile" msgstr "صدّر تشكيل CompizConfig المستخدم " msgid "Reset to defaults" msgstr "أعد الضبط إلى المبدئيات" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "أعد ضبط ملف CompizConfig إلى المبدئيات العمومية" msgid "Backend" msgstr "الخلفية" msgid "Integration" msgstr "دمج" msgid "Enable integration into the desktop environment" msgstr "مكّن الدمج إلى بيىٔة المكتب" msgid "Profiles (*.profile)" msgstr "ملفات (*.profile)" msgid "All files" msgstr "كل الملفات" msgid "Save file.." msgstr "احفظ الملف..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "أتريد تخطي قيم الخيارات المبدئية أثناء تصدير ملفك؟" msgid "Open file.." msgstr "افتح ملفا.." msgid "Enter a profile name" msgstr "أدخل اسم ملف" msgid "Please enter a name for the new profile:" msgstr "من فضلك أدخل اسما للملف الجديد:" msgid "Backend not found." msgstr "لم توجد الخلفية." #. Auto sort msgid "Automatic plugin sorting" msgstr "ترتيب الملحقات تلقائيا" msgid "Disabled Plugins" msgstr "الإضافات المعطلة" msgid "Enabled Plugins" msgstr "الملحقات الممكنة" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "أتريد حقا تعطيل الفرز التلقائي للملحقات؟ هذا من شأنه أيضا تعطيل التعامل مع " "التعارضات. يتعين عليك فعل ذلك فقط إذا كنت تعرف ما أنت بصدد القيام به." msgid "Add plugin" msgstr "أضف ملحقا" msgid "Plugin name:" msgstr "اسم الملحق:" msgid "Insert plugin name" msgstr "أدخل اسم الملحق" msgid "Preferences" msgstr "تفضيلات" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "اضبط الخلفية والملف، والإعدادات الداخلية الأخرى المستخدمة بواسطة تظام " "إعدادات Compiz." msgid "About" msgstr "عن" msgid "About CCSM..." msgstr "عن CCSM..." msgid "Profile & Backend" msgstr "الملف والمنتهى الخلفي" msgid "Plugin List" msgstr "قائمة الملحقات" msgid "Filter your Plugin list" msgstr "رشّح قائمة ملحقاتك" #, python-format msgid "Screen %i" msgstr "الشاشة %i" msgid "Screen" msgstr "شاشة" msgid "Category" msgstr "تصنيف" msgid "Advanced Search" msgstr "بحث متقدّم" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "لا وجود لتطابق. \n" "\n" " Your filter \"%s\" لا تطابق مع ايّ من الموجودات." msgid "Configure Compiz with CompizConfig" msgstr "شكّل Compiz بواسطة CompizConfig" ./compizconfig/ccsm/po/id.po0000644000004100000410000002533113246301623016235 0ustar www-datawww-data# CompizConfig Indonesian Translation # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Andi Darmawan , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz Settings Manager 0.5.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-31 06:10+0700\n" "Last-Translator: Mahyuddin Susanto \n" "Language-Team: Indonesian Translator \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "Non-aktifkan %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Jangan atur %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Tetap atur %(action)s" msgid "key" msgstr "kunci" msgid "button" msgstr "tombol" msgid "edge" msgstr "tepi" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Anda mencoba untuk menggunakan fitur %(feature)s yang tidak " "disediakan oleh plugin.\n" "Apakah anda ingin mengaktifkan fitur ini apa adanya?" #, python-format msgid "Use %(feature)s" msgstr "Gunakan %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Jangan aktifkan %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Anda mencoba untuk menggunakan fitur %(feature)s yang disediakan " "oleh%(plugin)s.\n" "Plugin tersebut sedang tidak aktif.\n" "Apakah anda ingin mengaktifkan %(plugin)s sehingga fitur menjadi " "tersedia?" #, python-format msgid "Enable %(plugin)s" msgstr "Aktifkan %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Jangan aktifkan %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "Abaikan konflik" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "Plugin %(plugin_conflict)s menyediakan fasilitas %(feature)s yang juga disediakan oleh %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Non-aktifkan %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Jangan aktifkan %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Plugin %(plugin_conflict)s konflik dengan %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" msgid "Enable these plugins" msgstr "Aktifkan plugin-plugin ini" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s membutuhkan plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Aktifkan %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" msgid "Disable these plugins" msgstr "Non-aktifkan plugin-plugin ini" #, python-format msgid "Don't disable %(plugin)s" msgstr "Jangan non-aktifkan %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s dibutuhkan oleh plugin %(plugin_list)s." msgid "General" msgstr "Umum" msgid "Accessibility" msgstr "Aksesibilitas" msgid "Desktop" msgstr "Destop" msgid "Extras" msgstr "Ekstra" msgid "Window Management" msgstr "Manajemen Jendela" msgid "Effects" msgstr "Efek" msgid "Image Loading" msgstr "Loading Gambar" msgid "Utility" msgstr "Utilitas" msgid "All" msgstr "Semua" msgid "Uncategorized" msgstr "Tidak dikategorikan" msgid "N/A" msgstr "N/A" msgid "Reset setting to the default value" msgstr "Rest nilai pengaturan ke pengaturan default " msgid "Edit" msgstr "Ubah" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" #, python-format msgid "Edit %s" msgstr "Ubah %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" bukan tombol cepat yang valid" msgid "Disabled" msgstr "Non-aktif" msgid "Enabled" msgstr "Aktif" msgid "Grab key combination" msgstr "Ambil kombinasi tombol" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" bukan tombol yang valid" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "" msgid "None" msgstr "Tidak Ada" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Settings Manager" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Silahkan tekan kombinasi tombol yang baru" msgid "Window Title" msgstr "Judul Window" msgid "Window Role" msgstr "Aturan Window" msgid "Window Name" msgstr "Nama Window" msgid "Window Class" msgstr "Klas Window" msgid "Window Type" msgstr "Jenis Window" msgid "Window ID" msgstr "ID Window" msgid "And" msgstr "Dan" msgid "Or" msgstr "Atau" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "Tipe" #. Value msgid "Value" msgstr "Nilai" msgid "Grab" msgstr "Grab" #. Relation msgid "Relation" msgstr "Kesamaan" #. Invert msgid "Invert" msgstr "Kebalikan" msgid "Browse..." msgstr "Jelajah..." msgid "Images" msgstr "Gambar" msgid "File" msgstr "Berkas" msgid "Open directory..." msgstr "Buka direktori..." msgid "Open file..." msgstr "Buka berkas..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" msgid "translator-credits" msgstr "kredit-penerjemah" msgid "An error has occured" msgstr "Sebuah kesalahan telah terjadi" msgid "Warning" msgstr "Peringatan" #, python-format msgid "Enable %s" msgstr "Aktifkan %s" msgid "Filter" msgstr "Penyaring" #, python-format msgid "Search %s Plugin Options" msgstr "Cari Opsi Plugin %s" msgid "Use This Plugin" msgstr "Gunakan Plugin Ini" msgid "Search Compiz Core Options" msgstr "Cari Opsi Compiz Core" msgid "Error" msgstr "Kesalahan" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Masukkan penyaring.\n" "Klik pada gambar papan ketik untuk mengambil kunci untuk pencarian" msgid "Search in..." msgstr "Cari di..." #. Options msgid "Short description and name" msgstr "Deskripsi pendek dan nama" msgid "Long description" msgstr "Deskripsi panjang" msgid "Settings value" msgstr "Nilai pengaturan" msgid "Group" msgstr "Kelompok" msgid "Subgroup" msgstr "Sub kelompok" #. Notebook msgid "Settings" msgstr "Pengaturan" msgid "Loading Advanced Search" msgstr "Sedang memposes Pencarian Lanjut" msgid "Add a New Profile" msgstr "Tambah Profil Baru" msgid "Remove This Profile" msgstr "Hapus Profil Ini" msgid "Default" msgstr "Default" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Impor" msgid "Import a CompizConfig Profile" msgstr "Impor Profil CompizConfig" msgid "Import as..." msgstr "Impor sebagai.." msgid "Import a CompizConfig Profile as a new profile" msgstr "Impor OmpizConfig profil sebagai profil baru" msgid "Export" msgstr "Ekspor" msgid "Export your CompizConfig Profile" msgstr "Ekspor Profil CompizConfig anda" msgid "Reset to defaults" msgstr "Reset ke default" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reset profil CompizConfig ke default umum" msgid "Backend" msgstr "Bagian Belakang" msgid "Integration" msgstr "Integrasi" msgid "Enable integration into the desktop environment" msgstr "Aktifkan integrasi dengan lingkungan destop" msgid "Profiles (*.profile)" msgstr "Profil (*.profile)" msgid "All files" msgstr "Semua berkas" msgid "Save file.." msgstr "Simpan berkas.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Apakah anda ingin mengabaikan opsi isian default ketika mengekspor profil? " msgid "Open file.." msgstr "Buka berkas.." msgid "Enter a profile name" msgstr "Masukkan nama profil" msgid "Please enter a name for the new profile:" msgstr "Silahkan masukkan nama untuk profil baru:" msgid "Backend not found." msgstr "Bagian Belakang tidak ditemukan." #. Auto sort msgid "Automatic plugin sorting" msgstr "Pengurutan plugin otomatis" msgid "Disabled Plugins" msgstr "Plugin Non-aktif" msgid "Enabled Plugins" msgstr "Plugin Aktif" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "Tambah plugin" msgid "Plugin name:" msgstr "Nama plugin:" msgid "Insert plugin name" msgstr "Masukkan nama plugin" msgid "Preferences" msgstr "Pengaturan" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Mengatur backend, profil dan pengaturan internal lainya yang digunakan oleh " "System Pengatur Compiz" msgid "About" msgstr "Perihal" msgid "About CCSM..." msgstr "Perihal CCSM..." msgid "Profile & Backend" msgstr "Profil & Bagian Belakang" msgid "Plugin List" msgstr "Daftar Plugin" msgid "Filter your Plugin list" msgstr "Saring daftar plugin" #, python-format msgid "Screen %i" msgstr "Screen %i" msgid "Screen" msgstr "Screen" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Pencarian Lanjut" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Tidak menemukan. \n" "\n" " Penyaring anda \"%s\" tidak menemukan apapun." msgid "Configure Compiz with CompizConfig" msgstr "Atur Compiz dengan CompizConfig" #~ msgid "Value (%s)" #~ msgstr "Nilai (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Nilai (%(value)s) untuk %(setting)s" #~ msgid "Actions" #~ msgstr "Aksi" ./compizconfig/ccsm/po/en_GB.po0000644000004100000410000002746713246301623016627 0ustar www-datawww-data# ccsm GB translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # David Lodge \n". # msgid "" msgstr "" "Project-Id-Version: ccsm 0.7.2\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-05-26 15:35+0200\n" "Last-Translator: David Lodge \n" "Language-Team: gb \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Disable %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Don't set %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Set %(action)s anyway" msgid "key" msgstr "key" msgid "button" msgstr "button" msgid "edge" msgstr "edge" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" #, python-format msgid "Use %(feature)s" msgstr "Use %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Don't use %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.Do you wish to enable %(plugin)s so " "the feature is available?" #, python-format msgid "Enable %(plugin)s" msgstr "Enable %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Don't enable %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgid "Resolve conflicts" msgstr "Resolve conflicts" msgid "Ignore conflicts" msgstr "Ignore conflicts" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Disable %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Don't enable %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "Plugin %(plugin_conflict)s conflicts with %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Enable these plugins" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s requires the plugin %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Enable %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgid "Disable these plugins" msgstr "Disable these plugins" #, python-format msgid "Don't disable %(plugin)s" msgstr "Don't disable %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s is required by the plugins %(plugin_list)s." msgid "General" msgstr "General" msgid "Accessibility" msgstr "Accessibility" msgid "Desktop" msgstr "Desktop" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Window Management" msgid "Effects" msgstr "Effects" msgid "Image Loading" msgstr "Image Loading" msgid "Utility" msgstr "Utility" msgid "All" msgstr "All" msgid "Uncategorized" msgstr "Uncategorised" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Reset setting to the default value" msgid "Edit" msgstr "Edit" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Multi-list settings. You can double-click a row to edit the values." #, python-format msgid "Edit %s" msgstr "Edit %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" is not a valid shortcut" msgid "Disabled" msgstr "Disabled" msgid "Enabled" msgstr "Enabled" msgid "Grab key combination" msgstr "Grab key combination" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" is not a valid button" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" is not a valid edge mask" msgid "None" msgstr "None" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Settings Manager" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Please press the new key combination" msgid "Window Title" msgstr "Window Title" msgid "Window Role" msgstr "Window Role" msgid "Window Name" msgstr "Window Name" msgid "Window Class" msgstr "Window Class" msgid "Window Type" msgstr "Window Type" msgid "Window ID" msgstr "Window ID" msgid "And" msgstr "And" msgid "Or" msgstr "Or" msgid "Edit match" msgstr "Edit match" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Value" msgid "Grab" msgstr "Grab" #. Relation msgid "Relation" msgstr "Relation" #. Invert msgid "Invert" msgstr "Invert" msgid "Browse..." msgstr "Browse..." msgid "Images" msgstr "Images" msgid "File" msgstr "File" msgid "Open directory..." msgstr "Open directory..." msgid "Open file..." msgstr "Open file..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "This is a settings manager for the CompizConfig configuration system." msgid "translator-credits" msgstr "David Lodge , 2008" msgid "An error has occured" msgstr "An error has occured" msgid "Warning" msgstr "Warning" #, python-format msgid "Enable %s" msgstr "Enable %s" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Search %s Plugin Options" msgid "Use This Plugin" msgstr "Use This Plugin" msgid "Search Compiz Core Options" msgstr "Search Compiz Core Options" msgid "Error" msgstr "Error" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgid "Search in..." msgstr "Search in..." #. Options msgid "Short description and name" msgstr "Short description and name" msgid "Long description" msgstr "Long description" msgid "Settings value" msgstr "Settings value" msgid "Group" msgstr "Group" msgid "Subgroup" msgstr "Subgroup" #. Notebook msgid "Settings" msgstr "Settings" msgid "Loading Advanced Search" msgstr "Loading Advanced Search" msgid "Add a New Profile" msgstr "Add a New Profile" msgid "Remove This Profile" msgstr "Remove This Profile" msgid "Default" msgstr "Default" msgid "Profile" msgstr "Profile" msgid "Import" msgstr "Import" msgid "Import a CompizConfig Profile" msgstr "Import a CompizConfig Profile" msgid "Import as..." msgstr "Import as..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Import a CompizConfig Profile as a new profile" msgid "Export" msgstr "Export" msgid "Export your CompizConfig Profile" msgstr "Export your CompizConfig Profile" msgid "Reset to defaults" msgstr "Reset to defaults" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Reset your CompizConfig Profile to the global defaults" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integration" msgid "Enable integration into the desktop environment" msgstr "Enable integration into the desktop environment" msgid "Profiles (*.profile)" msgstr "Profiles (*.profile)" msgid "All files" msgstr "All files" msgid "Save file.." msgstr "Save file.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Do you want to skip default option values while exporting your profile?" msgid "Open file.." msgstr "Open file.." msgid "Enter a profile name" msgstr "Enter a profile name" msgid "Please enter a name for the new profile:" msgstr "Please enter a name for the new profile:" msgid "Backend not found." msgstr "Backend not found." #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatic plugin sorting" msgid "Disabled Plugins" msgstr "Disabled Plugins" msgid "Enabled Plugins" msgstr "Enabled Plugins" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgid "Add plugin" msgstr "Add plugin" msgid "Plugin name:" msgstr "Plugin name:" msgid "Insert plugin name" msgstr "Insert plugin name" msgid "Preferences" msgstr "Preferences" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgid "About" msgstr "About" msgid "About CCSM..." msgstr "About CCSM..." msgid "Profile & Backend" msgstr "Profile & Backend" msgid "Plugin List" msgstr "Plugin List" msgid "Filter your Plugin list" msgstr "Filter your Plugin list" #, python-format msgid "Screen %i" msgstr "Screen %i" msgid "Screen" msgstr "Screen" msgid "Category" msgstr "Category" msgid "Advanced Search" msgstr "Advanced Search" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "No matches found. \n" " Your filter \"%s\" does not match any items." msgid "Configure Compiz with CompizConfig" msgstr "Configure Compiz with CompizConfig" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Computing possible conflicts, please wait" #~ msgid "Value (%s)" #~ msgstr "Value (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Value (%(value)s) for %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Unhandled list type %s for %s" ./compizconfig/ccsm/po/ko.po0000644000004100000410000003212113246301623016245 0ustar www-datawww-data# ccsm Korean translation. # Copyright (C) 2007 compiz-fusion.org # This file is distributed under the same license as the ccsm package. # Jeong Seungwon (jeongsw) , # Hyunho Kwak (coolhex) , # Lee June Hee (bugbear5) , # Gyu Cheol Lee(supaflow), 2008 # msgid "" msgstr "" "Project-Id-Version: ccsm 0.7.4\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-08-30 18:12+0200\n" "Last-Translator: Lee June Hee \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "%(plugin)s 플러그인의 %(action)s 동작에 대한 %(binding)s 바인딩" "의 새로운 값은 %(plugin_conflict)s 플러그인의 %(action_conflict)s 동작과 충돌합니다.\n" "(plugin_conflict)s 플러그인의 %(action_conflict)s 동작을 비활성" "화시키시겠습니까?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s을(를) 사용하지 않음" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s을(를) 설정하지 않음" #, python-format msgid "Set %(action)s anyway" msgstr "무조건 %(action)s을(를) 설정" msgid "key" msgstr "키" msgid "button" msgstr "버튼" msgid "edge" msgstr "모서리" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "어떤 플러그인에서도 제공하지 않는 %(feature)s 기능을 사용하려" "고 합니다.\n" "어쨌든 이 기능을 사용하시겠습니까?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s을(를) 사용하지 않음" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s을(를) 사용하지 않음" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "%(plugin)s 플러그인에 의해 제공되는 %(feature)s 기능을 사용하려" "고 합니다.\n" "이 플러그인은 현재 비활성화되어 있습니다.\n" "%(plugin)s 플러그인을 활성화시키시겠습니까?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s 플러그인을 활성화" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s을(를) 사용하지 않음" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "%(plugin)s 플러그인의 %(bindings)s 바인딩은 다른 플러그인과 충돌합니" "다. 이 충돌을 해결하겠습니까?" msgid "Resolve conflicts" msgstr "충돌 해결" msgid "Ignore conflicts" msgstr "충돌 무시" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "%(plugin_conflict)s 플러그인은 %(feature)s 기능을 제공하며,이 " "기능은 %(plugin)s 플러그인에 의해서도 제공되고 있습니다." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s를 사용하지 않음" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s를 사용하지 않음" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "%(plugin_conflict)s 플러그인은 %(plugin)s 플러그인과 충돌합니" "다." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s는 다음 플러그인에 의해 제공되는 %(feature)s 기능이 " "필요합니다:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "이 플러그인들을 사용함" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "" "%(plugin)s 플러그인은 %(require)s 플러그인을 필요로 합니다." #, python-format msgid "Enable %(require)s" msgstr "%(require)s를 활성화" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s 플러그인은 %(plugin_list)s 플러그인에 의해 제공되는 " "%(feature)s 기능을 필요로 합니다." msgid "Disable these plugins" msgstr "이 플러그인들을 비활성화" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s 플러그인을 비활성화하지 않음" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "" "%(plugin_list)s 플러그인은 %(plugin)s 플러그인을 필요로 합니다." msgid "General" msgstr "일반" msgid "Accessibility" msgstr "접근가능 정도" msgid "Desktop" msgstr "데스크탑" msgid "Extras" msgstr "기타" msgid "Window Management" msgstr "창 관리" msgid "Effects" msgstr "효과" msgid "Image Loading" msgstr "이미지 불러오기" msgid "Utility" msgstr "유틸리티" msgid "All" msgstr "모두" msgid "Uncategorized" msgstr "분류 없음" msgid "N/A" msgstr "없음" msgid "Reset setting to the default value" msgstr "설정을 기본값으로 초기화" msgid "Edit" msgstr "수정" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "다중 목록 설정. 행을 더블 클릭하여 값을 바꿀 수 있습니다." #, python-format msgid "Edit %s" msgstr "%s 수정" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\"은(는) 유효한 단축키가 아닙니다." msgid "Disabled" msgstr "비활성화됨" msgid "Enabled" msgstr "활성화됨" msgid "Grab key combination" msgstr "키 조합" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\"은(는) 유효한 버튼이 아닙니다." #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "버튼1을 다른 키와 함께 설정하지 않으면, 왼쪽 마우스 버튼을 클릭할 수 없게 됩" "니다.정말로 \"%s\" 버튼을 버튼1로 설정하시겠습니까?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\"은(는) 유효한 가장자리가 아닙니다. " msgid "None" msgstr "없음" msgid "CompizConfig Settings Manager" msgstr "컴피즈 설정 관리자" msgid "Plugin" msgstr "플러그인 목록" msgid "Please press the new key combination" msgstr "새로운 키 조합을 누르세요." msgid "Window Title" msgstr "창 제목" msgid "Window Role" msgstr "창 역할" msgid "Window Name" msgstr "창 이름" msgid "Window Class" msgstr "창 종류" msgid "Window Type" msgstr "창 종류" msgid "Window ID" msgstr "창 ID" msgid "And" msgstr "그리고" msgid "Or" msgstr "또는" msgid "Edit match" msgstr "편집" #. Type msgid "Type" msgstr "종류" #. Value msgid "Value" msgstr "값 (%s)" msgid "Grab" msgstr "붙잡기" #. Relation msgid "Relation" msgstr "관계" #. Invert msgid "Invert" msgstr "반전" msgid "Browse..." msgstr "다음을 찾아보기: " msgid "Images" msgstr "이미지" msgid "File" msgstr "파일" msgid "Open directory..." msgstr "디렉토리 열기..." msgid "Open file..." msgstr "파일 열기..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "컴피즈 환경 설정 시스템의 설정 관리자입니다." msgid "translator-credits" msgstr "번역자" msgid "An error has occured" msgstr "에러가 발생했습니다." msgid "Warning" msgstr "경고" #, python-format msgid "Enable %s" msgstr "%s을(를) 활성화" msgid "Filter" msgstr "필터" #, python-format msgid "Search %s Plugin Options" msgstr "%s 플러그인 옵션을 검색" msgid "Use This Plugin" msgstr "이 플러그인을 사용" msgid "Search Compiz Core Options" msgstr "컴피즈 코어 옵션 검색" msgid "Error" msgstr "에러" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "필터를 입력하십시오.\n" "검색할 키를 붙잡기 위하여 키보드 그림을 클릭하십시오." msgid "Search in..." msgstr "다음에서 검색..." #. Options msgid "Short description and name" msgstr "이름과 짧은 설명" msgid "Long description" msgstr "긴 설명" msgid "Settings value" msgstr "설정 값" msgid "Group" msgstr "그룹" msgid "Subgroup" msgstr "하위 그룹" #. Notebook msgid "Settings" msgstr "설정" msgid "Loading Advanced Search" msgstr "고급 검색" msgid "Add a New Profile" msgstr "새로운 프로필 추가" msgid "Remove This Profile" msgstr "이 프로필 삭제" msgid "Default" msgstr "기본값" msgid "Profile" msgstr "프로필" msgid "Import" msgstr "가져오기" msgid "Import a CompizConfig Profile" msgstr "컴피즈 프로필 가져오기" msgid "Import as..." msgstr "다음으로 가져오기..." msgid "Import a CompizConfig Profile as a new profile" msgstr "컴피즈 프로필을 새로운 프로필로 가져오기" msgid "Export" msgstr "내보내기" msgid "Export your CompizConfig Profile" msgstr "컴피즈 프로필 내보내기" msgid "Reset to defaults" msgstr "기본값으로 초기화" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "컴피즈 프로필을 전역 기본값으로 초기화" msgid "Backend" msgstr "백엔드" msgid "Integration" msgstr "통합" msgid "Enable integration into the desktop environment" msgstr "데스크탑 환경에 통합함" msgid "Profiles (*.profile)" msgstr "프로필 (*.profile)" msgid "All files" msgstr "모든 파일" msgid "Save file.." msgstr "파일 저장.." msgid "Do you want to skip default option values while exporting your profile?" msgstr "프로필을 내보낼 때 기본 설정 값을 생략하시겠습니까?" msgid "Open file.." msgstr "파일 열기..." msgid "Enter a profile name" msgstr "프로필 이름 입력" msgid "Please enter a name for the new profile:" msgstr "새로운 프로필에 대한 이름을 입력하세요:" msgid "Backend not found." msgstr "백엔드를 찾을 수 없습니다." #. Auto sort msgid "Automatic plugin sorting" msgstr "플러그인을 자동으로 정렬함" msgid "Disabled Plugins" msgstr "비활성화된 플러그인들" msgid "Enabled Plugins" msgstr "활성화된 플러그인들" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "플러그인 자동 정렬 기능을 해제하시겠습니까? 충돌 처리 기능도 해제됩니다. 이것" "에 대해서 잘 아는 경우에만 계속하시기 바랍니다." msgid "Add plugin" msgstr "플러그인 추가" msgid "Plugin name:" msgstr "플러그인 이름:" msgid "Insert plugin name" msgstr "플러그인 이름 삽입" msgid "Preferences" msgstr "환경 설정" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "백엔드와 프로필 그리고 컴피즈 환경 설정 시스템에 의해 사용되는 다른 내부 설정" "들을변경합니다." msgid "About" msgstr "정보" msgid "About CCSM..." msgstr "CCSM 정보..." msgid "Profile & Backend" msgstr "프로필 및 백엔드" msgid "Plugin List" msgstr "플러그인 목록" msgid "Filter your Plugin list" msgstr "플러그인 목록을 필터링합니다." #, python-format msgid "Screen %i" msgstr "화면 %i" msgid "Screen" msgstr "화면" msgid "Category" msgstr "분류" msgid "Advanced Search" msgstr "고급 검색" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "일치하는 항목이 없습니다. \n" "\n" " \"%s\"은(는) 어느 항목과도 일치하지 않습니다." msgid "Configure Compiz with CompizConfig" msgstr "CompizConfig으로 Compiz 설정" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "가능한 충돌을 계산하고 있습니다. 잠시만 기다려주세요." #~ msgid "Value (%s)" #~ msgstr "값 (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s에 대한 값 (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "처리되지 않은 목록 타입 %s - %s" #~ msgid "Actions" #~ msgstr "동작" ./compizconfig/ccsm/po/it.po0000644000004100000410000003236013246301623016255 0ustar www-datawww-data# CompizConfig Italian translation # Copyright (C) 2007, 2008, 2009 The Free Software Foundation, Inc. # This file is distributed under the same license as the ccsm package. # Treviño (Marco Trevisan) , 2007 # Milo Casagrande , 2007-2009 # msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-02-17 17:52+0100\n" "Last-Translator: Milo Casagrande \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Il nuovo valore per la scorciatoia %(binding)s dell'azione %(action)s " "nel plugin %(plugin)s, va in conflitto con l'azione %" "(action_conflict)s del plugin %(plugin_conflict)s\n" "Disabilitare %(action_conflict)s nel plugin %(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Disabilita %(action_conflict)s" # (ndt) pulsante #, python-format msgid "Don't set %(action)s" msgstr "Non impostare %(action)s" # (ndt) pulsante #, python-format msgid "Set %(action)s anyway" msgstr "Imposta %(action)s comunque" msgid "key" msgstr "tasto" msgid "button" msgstr "pulsante" msgid "edge" msgstr "bordo" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Si sta cercando di usare la funzionalità %(feature)s che non è " "fornita da alcun plugin.\n" "Usare ugualmente questa funzionalità?" #, python-format msgid "Use %(feature)s" msgstr "Usare %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Non usare %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Si sta cercando di usare la funzionalità %(feature)s che è fornita da " "%(plugin)s.\n" "Questo plugin è attualmente disabilitato.\n" "Abilitare %(plugin)s per rendere la funzionalità disponibile?" #, python-format msgid "Enable %(plugin)s" msgstr "Abilita %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Non abilitare %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" "Alcuni binding %(bindings)s del plugin %(plugin)s vanno in conflitto " "con altri plugin. Risolvere questi conflitti?" msgid "Resolve conflicts" msgstr "Risolvi conflitti" msgid "Ignore conflicts" msgstr "Ignora conflitti" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Il plugin %(plugin_conflict)s fornisce la funzionalità %(feature)" "s fornita anche da %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Disabilita %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Non abilitare %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Il plugin %(plugin_conflict)s va in conflitto con %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s richiede la funzionalità %(feature)s che viene " "fornita dai seguenti plugin:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Abilita questi plugin" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s richiede il plugin %(require)s." # (NdT) opzione #, python-format msgid "Enable %(require)s" msgstr "Abilitare %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s fornisce la funzionalità %(feature)s richiesta dai " "plugin %(plugin_list)s." # (NdT) pulsante msgid "Disable these plugins" msgstr "Disabilita questi plugin" # (NdT) pulsante #, python-format msgid "Don't disable %(plugin)s" msgstr "Non disabilitare %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s è richiesto dai plugin %(plugin_list)s." msgid "General" msgstr "Generale" msgid "Accessibility" msgstr "Accessibilità" msgid "Desktop" msgstr "Desktop" msgid "Extras" msgstr "Extra" msgid "Window Management" msgstr "Gestione finestre" msgid "Effects" msgstr "Effetti" msgid "Image Loading" msgstr "Caricamento immagini" msgid "Utility" msgstr "Utilità" msgid "All" msgstr "Tutti" msgid "Uncategorized" msgstr "Senza categoria" msgid "N/A" msgstr "N/D" msgid "Reset setting to the default value" msgstr "Ripristina l'impostazione al valore predefinito" msgid "Edit" msgstr "Modifica" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Impostazioni multi elenco. Fare doppio clic su una riga per modificarne i " "valori." #, python-format msgid "Edit %s" msgstr "Modifica %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "«%s» non è una scorciatoia valida" msgid "Disabled" msgstr "Disabilitato" msgid "Enabled" msgstr "Abilitato" msgid "Grab key combination" msgstr "Ottieni combinazione tasti" #, python-format msgid "\"%s\" is not a valid button" msgstr "«%s» non è un pulsante valido" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Usare Pulsante1 senza alcun modificatore può prevenire il clic col tasto " "sinistro del mouse e rompere la configurazione. Impostare veramente «%s» per " "Pulsante1?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "«%s» non è una maschera valida" # (NdT) questo è quello che si vede nella scheda Azioni # quando non è associato nulla alla particolare azione... msgid "None" msgstr "Nessuno" msgid "CompizConfig Settings Manager" msgstr "Gestore configurazione CompizConfig" msgid "Plugin" msgstr "Plugin" msgid "Please press the new key combination" msgstr "Premere la nuova combinazione di tasti" msgid "Window Title" msgstr "Titolo finestra" msgid "Window Role" msgstr "Ruolo finestra" msgid "Window Name" msgstr "Nome finestra" msgid "Window Class" msgstr "Classe finestra" msgid "Window Type" msgstr "Tipo finestra" msgid "Window ID" msgstr "ID finestra" # (ndt) non capisco bene a cosa si riferiscano questi due... msgid "And" msgstr "E" msgid "Or" msgstr "O" msgid "Edit match" msgstr "Modifica corrispondenza" #. Type msgid "Type" msgstr "Tipo" #. Value msgid "Value" msgstr "Valore" # (ndt) da rivedere msgid "Grab" msgstr "Ottieni" #. Relation msgid "Relation" msgstr "Relazione" # (ndt) da rivedere #. Invert msgid "Invert" msgstr "Inverti" msgid "Browse..." msgstr "Esplora..." msgid "Images" msgstr "Immagini" msgid "File" msgstr "File" msgid "Open directory..." msgstr "Apri directory..." msgid "Open file..." msgstr "Apri file..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Un gestore delle impostazioni per il sistema di configurazione CompizConfig." msgid "translator-credits" msgstr "Milo Casagrande " msgid "An error has occured" msgstr "Si è verificato un errore" msgid "Warning" msgstr "Avviso" # (NdT) opzione #, python-format msgid "Enable %s" msgstr "Abilitare «%s»" msgid "Filter" msgstr "Filtro" #, python-format msgid "Search %s Plugin Options" msgstr "Cerca tra le opzioni del plugin %s" msgid "Use This Plugin" msgstr "Usa questo plugin" msgid "Search Compiz Core Options" msgstr "Cerca tra le opzioni principali di Compiz" msgid "Error" msgstr "Errore" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Inserire un filtro.\n" "Fare clic sull'immagine della tastiera per ottenere una lettera da cercare." msgid "Search in..." msgstr "Cerca in..." #. Options msgid "Short description and name" msgstr "Descrizione breve e nome" msgid "Long description" msgstr "Descrizione completa" msgid "Settings value" msgstr "Valore delle impostazioni" msgid "Group" msgstr "Gruppo" msgid "Subgroup" msgstr "Sottogruppo" #. Notebook msgid "Settings" msgstr "Impostazioni" msgid "Loading Advanced Search" msgstr "Caricamento ricerca avanzata" # (NdT) suggerimento msgid "Add a New Profile" msgstr "Aggiunge un nuovo profilo" # (NdT) suggerimento msgid "Remove This Profile" msgstr "Rimuove questo profilo" msgid "Default" msgstr "Predefinito" msgid "Profile" msgstr "Profilo" # (NdT) pulsante msgid "Import" msgstr "Importa" # (NdT) suggerimento msgid "Import a CompizConfig Profile" msgstr "Importa un profilo di CompizConfig" msgid "Import as..." msgstr "Importa come..." # (NdT) suggerimento msgid "Import a CompizConfig Profile as a new profile" msgstr "Importa un profilo di CompizConfig come un nuovo profilo" # (NdT) pulsante msgid "Export" msgstr "Esporta" # (NdT) suggerimento msgid "Export your CompizConfig Profile" msgstr "Esporta il profilo di CompizConfig selezionato" # (ndt) pulsante msgid "Reset to defaults" msgstr "Ripristina predefiniti" # (NdT) suggerimento msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Ripristina il profilo ai valori predefiniti" msgid "Backend" msgstr "Backend" msgid "Integration" msgstr "Integrazione" # (NdT) opzione msgid "Enable integration into the desktop environment" msgstr "Abilitare l'integrazione con l'ambiente grafico" msgid "Profiles (*.profile)" msgstr "Profili (*.profile)" msgid "All files" msgstr "Tutti i file" msgid "Save file.." msgstr "Salva file..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" "Tralasciare i valori predefiniti per le opzioni nell'esportare il profilo?" msgid "Open file.." msgstr "Apri file..." # (NdT) titolo finestra di dialogo msgid "Enter a profile name" msgstr "Inserimento nome profilo" # (NdT) stringa al di sopra di una casella di testo msgid "Please enter a name for the new profile:" msgstr "Inserire il nome del nuovo profilo:" msgid "Backend not found." msgstr "Backend non trovato. " # (NdT) opzione #. Auto sort msgid "Automatic plugin sorting" msgstr "Ordinamento plugin automatico" # (NdT) intestazione elenco msgid "Disabled Plugins" msgstr "Plugin disabilitati" # (NdT) intestazione elenco msgid "Enabled Plugins" msgstr "Plugin abilitati" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Disabilitare l'ordinamento automatico dei plugin? Questo disabiliterà anche " "la gestione dei conflitti. Procedere solo se si è certi di cosa si fa." # (NdT) titolo finestra di dialogo msgid "Add plugin" msgstr "Aggiungi plugin" # (NdT) stringa presente prima di una casella di # inserimento testo msgid "Plugin name:" msgstr "Nome del plugin:" # (NdT) questo è il suggerimento che compare # sulla stringa sopra... msgid "Insert plugin name" msgstr "Inserire il nome del plugin" msgid "Preferences" msgstr "Preferenze" # (NdT) descrizione di cosa si può fare... msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Configura il backend e il profilo usati dal sistema di configurazione di " "Compiz." msgid "About" msgstr "Informazioni" # (NdT) siccome CCSM sta per CompizConfig Setting Manager, # ma è stato tradotto in altro modo tralascio l'acronimo... msgid "About CCSM..." msgstr "Informazioni su..." # (NdT) non vedo perché debbano essere diverse... # Uno è un pulsante l'altro il nome di una scheda... # Il pulsante visualizza la scheda msgid "Profile & Backend" msgstr "Profilo e backend" # (NdT) titolo di una scheda msgid "Plugin List" msgstr "Elenco plugin" msgid "Filter your Plugin list" msgstr "Filtra l'elenco dei plugin" #, python-format msgid "Screen %i" msgstr "Schermo: %i" msgid "Screen" msgstr "Schermo" # (NdT) benché l'originale sia al singolare # nella UI c'è l'elenco di tutte le categorie sotto... msgid "Category" msgstr "Categorie" msgid "Advanced Search" msgstr "Ricerca avanzata" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Nessuna corrispondenza trovata. \n" "\n" " Il filtro «%s» non corrisponde ad alcuna voce." msgid "Configure Compiz with CompizConfig" msgstr "Configura Compiz attraverso CompizConfig" ./compizconfig/ccsm/po/fa.po0000644000004100000410000002626013246301623016231 0ustar www-datawww-data# Translation of ccsm.po into Persian. # Copyright (C) 2008 Compiz-Fusion Developers # This file is distributed under the same license as the Compiz-Fusion package. # Ali Tarihi , 2008. # Mohammad Ebrahim Mohammadi Panah , 2008. # msgid "" msgstr "" "Project-Id-Version: Compiz-Fusion ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2008-01-29 13:04+0100\n" "PO-Revision-Date: 2008-02-07 19:21+0100\n" "Last-Translator: Ali Tarihi \n" "Language-Team: l10n.ir\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)ها را غیرفعال کن" #, python-format msgid "Don't set %(action)s" msgstr "" #, python-format msgid "Set %(action)s anyway" msgstr "" #, python-format #, fuzzy msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "شما سعی دارید که از قابلیت %(feature)ها استفاده کنید که توسط " "هیچپلاگینی فراهم نشده است.\n" "آیا می‌خواید به هر حال از این قابلیت استفاده کنید؟" #, python-format #, fuzzy msgid "Use %(feature)s" msgstr "از %(feature)ها استفاده کن" #, python-format msgid "Don't use %(feature)s" msgstr "از %(feature)ها استفاده نکن" #, python-format #, fuzzy msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "شما دارید سعی می‌کنید که از قابلیت %(feature)ها که توسط " "%(plugin)ها ایجاد شده است.\n" "این پلاگین هم اکنون غیرفعال است.\n" "آیا می‌خواهید که %(plugin)ها فعال گردد تا قابلیت در دسترس باشد؟" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)ها را فعال کن" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)ها را فعال نکن" #, python-format #, fuzzy msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "پلاگین %(plugin_conflict)ها امکان %(feature)ها را اختیار " "می‌گذارد که به وسیله %(plugin)ها نیز در اختیار قرار می‌گیرد." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)ها را غیرفعال کن" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)ها را فعال نکن" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "پلاگین %(plugin_conflict)ها با %(plugin)ها ناسازگار است." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)ها نیاز به قابلیت %(feature)ها دارد که به وسیله این " "پلاگینها بدست می‌آید:\n" "%(plugin_list)ها" msgid "Enable these plugins" msgstr "این پلاگین ها را فعال کن" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s نیازمند پلاگین %(require)ها می‌باشد." #, python-format msgid "Enable %(require)s" msgstr "%(require)ها را فعال کن" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)ها قابلیت %(feature)ها را که مورد نیاز پلاگینهای " "%(plugin_list)ها است، فراهم می‌آورد." msgid "Disable these plugins" msgstr "این پلاگینها را غیر فعال کن" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)ها را غیر فعال کن" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)ها مورد نیاز %(plugin_list)ها می‌باشد." msgid "General" msgstr "همگانی" msgid "Accessibility" msgstr "" msgid "Desktop" msgstr "رومیزی" msgid "Extras" msgstr "" msgid "Window Management" msgstr "مدیریت پنجره" msgid "Effects" msgstr "جلوه‌ها" msgid "Image Loading" msgstr "بارگذاری تصویر" msgid "Utility" msgstr "ابزار" #, fuzzy msgid "Reset setting to the default value" msgstr "بازنشانی به مقدار پیش‌فرض" msgid "Browse for " msgstr "" msgid "Images" msgstr "تصاویر" msgid "File" msgstr "فایل" msgid "Open directory..." msgstr "بازکردن پوشه..." msgid "Open file..." msgstr "باز کردن فایل..." msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "تنظیمات چند-لیستی. شما می‌توانید با دوکلیک کردن یک سطر، مقادیر آن را ویرایش " "کنید. " msgid "Edit" msgstr "ویرایش" #, python-format msgid "Value (%s)" msgstr "مقدار (%s)" #, python-format msgid "Edit %s" msgstr "ویرایش %s" #, python-format msgid "Value (%(value)s) for %(setting)s" msgstr "مقدار (%(value)ها) برای %(setting)ها" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" یک میانبر معتبر نیست" msgid "Disabled" msgstr "غیرفعال" msgid "Enabled" msgstr "فعال" #, fuzzy msgid "Grab key combination" msgstr "گرفتن ترکیب کلیدها" msgid "Computing possible conflicts, please wait" msgstr "محاسبه ناسازگاریهای ممکن، لطفا صبر کنید" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" یک دکمه معتبر نیست" #, python-format #, fuzzy msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "استفاده از Button1 بدون تغییر دهنده می‌تواند جلوی هر کلیک چپی را بگیرد و " "بدین‌سان تنظیمات شما را خراب کند. آیا واقعا تمایل دارید که دکمه \"%s\" را به " "Button1 اختصاص دهید؟" #, python-format #, fuzzy msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" یک Mask معتبر نیست" msgid "None" msgstr "هیچ یک" #, python-format msgid "Unhandled list type %s for %s" msgstr "" msgid "CompizConfig Settings Manager" msgstr "" msgid "Filter" msgstr "فیلتر" msgid "Filter your Plugin list" msgstr "لیست پلاگین‌های خود را فیلتر نمایید" #, python-format msgid "Screen %i" msgstr "صفحه %i" msgid "Screen" msgstr "صفحه" #. Settings msgid "All" msgstr "همه" msgid "Uncategorized" msgstr "دسته‌بندی نشده" #, fuzzy msgid "Category" msgstr "دسته" msgid "Advanced Search" msgstr "جستجوی پیشرفته" msgid "Preferences" msgstr "" #, python-format msgid "Enable %s" msgstr "%s را فعال کن" msgid "Please press the new key combination" msgstr "لطفا ترکیب کلید جدید را فشار دهید" msgid "Window Title" msgstr "عنوان پنجره" msgid "Window Role" msgstr "" msgid "Window Name" msgstr "نام پنجره" msgid "Window Class" msgstr "رده پنجره" msgid "Window Type" msgstr "نوع پنجره" msgid "Window ID" msgstr "" msgid "And" msgstr "و" msgid "Or" msgstr "یا" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "نوع" #. Value msgid "Value" msgstr "مقدار" msgid "Grab" msgstr "گرفتن" #. Relation msgid "Relation" msgstr "ارتباط" #. Invert msgid "Invert" msgstr "معکوس" msgid "This is a settings manager for the CompizConfig configuration system." msgstr "این یک مدیر تنظیمات برای سیستم تنظیمات CompizConfig می‌باشد" msgid "translator-credits" msgstr "" msgid "An error has occured" msgstr "یک خطا رخ داده است." msgid "Warning" msgstr "هشدار" #, python-format msgid "Search %s Plugin Options" msgstr "جستجوی گزینه‌های پلاگین %s" msgid "Use This Plugin" msgstr "از این پلاگین استفاده کن" msgid "Search Compiz Core Options" msgstr "گزینه‌های هسته Compiz را جستجو کن" msgid "Error" msgstr "خطا" msgid "Search in..." msgstr "جستجو کن در..." msgid "Short description and name" msgstr "توضیح کوتاه و نام" msgid "Long description" msgstr "توضیح بلند" msgid "Settings value" msgstr "قرار دادن مقدار" #. Notebook msgid "Settings" msgstr "تنظیمات" #, fuzzy msgid "Add a New Profile" msgstr "اضافه کردن یک مشخصات جدید" #, fuzzy msgid "Remove This Profile" msgstr "حذف این مشخصات" msgid "Default" msgstr "پیش‌فرض" #, fuzzy msgid "Profile" msgstr "مشخصات" msgid "Import" msgstr "" msgid "Import a CompizConfig Profile" msgstr "" msgid "Import as..." msgstr "" msgid "Import a CompizConfig Profile as a new profile" msgstr "" msgid "Export" msgstr "" msgid "Export your CompizConfig Profile" msgstr "" msgid "Reset to defaults" msgstr "" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "" msgid "Backend" msgstr "" msgid "Integration" msgstr "" msgid "Enable integration into the desktop environment" msgstr "" msgid "Profiles (*.profile)" msgstr "" msgid "All files" msgstr "" msgid "Save file.." msgstr "" msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "" msgid "Enter a profile name" msgstr "" msgid "Please enter a name for the new profile:" msgstr "" msgid "Backend not found." msgstr "" #. Auto sort msgid "Automatic plugin sorting" msgstr "" msgid "Disabled Plugins" msgstr "" msgid "Enabled Plugins" msgstr "" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "" msgid "Plugin name:" msgstr "" msgid "Insert plugin name" msgstr "" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" msgid "About" msgstr "" msgid "About CCSM..." msgstr "" msgid "Profile & Backend" msgstr "" msgid "Plugin List" msgstr "" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" ./compizconfig/ccsm/po/wo.po0000644000004100000410000003041713246301623016267 0ustar www-datawww-data# Wolof translation of ccsm # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR Werner Landgraf , 2007-09-12 # Algumas palavras não tenham tradução adequada, os quais no momento # coloco em portugues, geralmente entendido no local # iconv -t UTF-8 wo.pot > wo.po ; msgfmt -cv wo.po msgid "" msgstr "" "Project-Id-Version: ccsm 20070908\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2007-09-24 23:00+0200\n" "Last-Translator: Werner Landgraf \n" "Language-Team: Wolof\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Defaay %(action)s u %(binding)s ci biir %(plugin)sdef na jöffë-" "jöffë ak %(action_conflict)s ci biir %(plugin_conflict)s.\n" "Ndax nga bögge fayal %(action_conflict)s ci biir %(plugin_conflict)" "s ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "fayal %(action_conflict)s ..." #, python-format msgid "Don't set %(action)s" msgstr "Bul ñörĩàl %(action)s !" #, python-format msgid "Set %(action)s anyway" msgstr "Ñörĩàlal %(action)s dê !" #, fuzzy msgid "key" msgstr "Botão u teclado" #, fuzzy msgid "button" msgstr "botão u jénnax" msgid "edge" msgstr "" #, fuzzy, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Da nga jêem y ñöriñ %(feature)s li %(plugin)s indil na ko.\n" "Waaye loolu dafa fayal\n" "Ndax nga böggë taxàl %(plugin)s ngir ko ñöriñ ?" #, fuzzy, python-format msgid "Use %(feature)s" msgstr "Bul ñöriñàl %(feature)s !" #, fuzzy, python-format msgid "Don't use %(feature)s" msgstr "Bul ñöriñàl %(feature)s !" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Da nga jêem y ñöriñ %(feature)s li %(plugin)s indil na ko.\n" "Waaye loolu dafa fayal\n" "Ndax nga böggë taxàl %(plugin)s ngir ko ñöriñ ?" #, python-format msgid "Enable %(plugin)s" msgstr "Ñöriñalal %(plugin)s !" #, python-format msgid "Don't enable %(feature)s" msgstr "Bul ñöriñàl %(feature)s !" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Def na jöffë-jöffë nä %(plugin_conflict)s waye %(plugin)s itam " "indil neñu %(feature)s lá." #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Fayal %(plugin_conflict)s !" #, python-format msgid "Don't enable %(plugin)s" msgstr "Bul taxal %(plugin)s !" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "%(plugin_conflict)s dafa döppu ak %(plugin)s." #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s soxla na %(feature)s li %(plugin_list)s mën nañu " "indilàl" msgid "Enable these plugins" msgstr "taxalal defaay yooyu !" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s soxla na %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Taxalal %(require)s !" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s indil na defaay %(feature)s li %(plugin_list)s soxla neñu ko." msgid "Disable these plugins" msgstr "Fayal defukaay yoñu !" #, python-format msgid "Don't disable %(plugin)s" msgstr "Bul fay %(plugin)s !" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s dafa ñöriñu i %(plugin_list)s." msgid "General" msgstr "bu yoon" msgid "Accessibility" msgstr "çônêa" msgid "Desktop" msgstr "Taabal" msgid "Extras" msgstr "Extras" msgid "Window Management" msgstr "Gerênciador de Janélas" msgid "Effects" msgstr "luxus" msgid "Image Loading" msgstr "indil natal yi ..." msgid "Utility" msgstr "defekaay" msgid "All" msgstr "löppë" msgid "Uncategorized" msgstr "ñak xät" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Ñögal ñög gu wees gi" msgid "Edit" msgstr "binde ..." msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "Fí, mön nga tann dara ci, ngir nga mbinde ko" #, python-format msgid "Edit %s" msgstr "bindal %s !" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" du doxe" # msgid "Disabled" msgstr "dafa fayàl" # msgid "Enabled" msgstr "taxàl" msgid "Grab key combination" msgstr "taanal am mbootaay y butão !" #, python-format msgid "\"%s\" is not a valid button" msgstr "Mënesul taan butão \"%s\" !" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Ñörĩ Butão-1 fi, loolu mënna indil jöffe-jöffe ndaxte tere ñörĩ ko naka yoon." "Ndax nga bögge teg \"%s\" ngir Butão-1 düggë-düggë ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr " Hamul koĩ \"%s\" !" msgid "None" msgstr "du dara" msgid "CompizConfig Settings Manager" msgstr "Tannay u CompizConfig" #, fuzzy msgid "Plugin" msgstr "defëkaay yi" msgid "Please press the new key combination" msgstr "jänal mbootaay y butão mu taanoo !" msgid "Window Title" msgstr "" msgid "Window Role" msgstr "" #, fuzzy msgid "Window Name" msgstr "Gerênciador de Janélas" msgid "Window Class" msgstr "" msgid "Window Type" msgstr "" msgid "Window ID" msgstr "" msgid "And" msgstr "" msgid "Or" msgstr "" msgid "Edit match" msgstr "" #. Type msgid "Type" msgstr "" #. Value #, fuzzy msgid "Value" msgstr "Ñög gi (%s)" msgid "Grab" msgstr "" #. Relation #, fuzzy msgid "Relation" msgstr "Integração" #. Invert msgid "Invert" msgstr "" #, fuzzy msgid "Browse..." msgstr "Wuutë ngir : ... " msgid "Images" msgstr "Natal yi" msgid "File" msgstr "Binday" msgid "Open directory..." msgstr "hubbi ndaal y bindaay ..." msgid "Open file..." msgstr "Ubbi binday.." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "Li dafa programa bu ogosu na CompizConfig bi. " msgid "translator-credits" msgstr "tekkimi: Werner Landgraf " msgid "An error has occured" msgstr "Hamna ab njuumte !" msgid "Warning" msgstr "Möy tul !" #, python-format msgid "Enable %s" msgstr "Taxalal %s !" msgid "Filter" msgstr "tannaay" #, python-format msgid "Search %s Plugin Options" msgstr "Wuut na ngir defëkaay %s -am mënnéel yi ..." msgid "Use This Plugin" msgstr "Ñöriñal defëkaay bii !" msgid "Search Compiz Core Options" msgstr "Wuut na ngir Compiz Core mënnéel yi ..." msgid "Error" msgstr "njuumte !" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "wuutë ci biir ... :" #. Options msgid "Short description and name" msgstr "Tekke tey tudde:" msgid "Long description" msgstr "Tekke bu rey:" msgid "Settings value" msgstr "Ñeg ñu tegu:" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "Ñeg ñu" #, fuzzy msgid "Loading Advanced Search" msgstr "wut wu gönnë baax ..." msgid "Add a New Profile" msgstr "Tegal xät u lüggey bu bees ..." msgid "Remove This Profile" msgstr "Fayal xät u lüggey bii ..." msgid "Default" msgstr "bu yoon" msgid "Profile" msgstr "xät u lüggey" msgid "Import" msgstr "indil ..." msgid "Import a CompizConfig Profile" msgstr "indil ab xät u lüggey ngir CompizConfig ..." # msgid "Import as..." msgstr "indil naka ..." # msgid "Import a CompizConfig Profile as a new profile" msgstr "indil ab xät u lüggey u CompizConfig ngir ñeriñ ko lêegi ... " msgid "Export" msgstr "indal ..." msgid "Export your CompizConfig Profile" msgstr "indal sa xeet u CompizConfig" # msgid "Reset to defaults" msgstr "Teg ñög-yu-jaad yi ... " # msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Teg ñög-yu-jaad yi ñöppë ngir CompizConfig -am xät u lüggey ... " msgid "Backend" msgstr "Programa ci biir" msgid "Integration" msgstr "Integração" msgid "Enable integration into the desktop environment" msgstr "defare integração ci taabal" msgid "Profiles (*.profile)" msgstr "xät i lüggey yi (*.profile)" msgid "All files" msgstr "mbinday yöpp" msgid "Save file.." msgstr "denc binday ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "" msgid "Open file.." msgstr "hubbi binday ..." msgid "Enter a profile name" msgstr "bindal tudde u lüggey -am xät ! " msgid "Please enter a name for the new profile:" msgstr "bindal ab tudde ngir xät bu bees bi, bü là nääxë" msgid "Backend not found." msgstr "hamul programa ci biir bi ... :(" #. Auto sort msgid "Automatic plugin sorting" msgstr "sèddàl defëkaay yi ..." msgid "Disabled Plugins" msgstr "defëkaay yu fay nañu:" msgid "Enabled Plugins" msgstr "defëkaay yu tann nañu:" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" msgid "Add plugin" msgstr "yookàl ab defukaay ..." msgid "Plugin name:" msgstr "tudde u defëkaay:" msgid "Insert plugin name" msgstr "bindal tudde u defekaay !" msgid "Preferences" msgstr "tanne yi" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "ogos na programa tey löpp ngir ogosu Compiz, tey xät yu lüggey i ñit ... " msgid "About" msgstr "Sobre" msgid "About CCSM..." msgstr "Sobre CCSM" msgid "Profile & Backend" msgstr "Programa ci biir & xéet u lüggey" msgid "Plugin List" msgstr "defëkaay yi" msgid "Filter your Plugin list" msgstr "tannal sa defëkaay yi !" #, python-format msgid "Screen %i" msgstr "Telha %i" msgid "Screen" msgstr "Telha" msgid "Category" msgstr "xät" msgid "Advanced Search" msgstr "wut wu gönnë baax ..." #, fuzzy, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Hamul du dara melo. \n" " \n" " Sa wuute ngir \"%s\" hamulhoon ndamm." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "gis ndax hame jöfë-jöfë ... , xaral bü là näxë !" #~ msgid "Value (%s)" #~ msgstr "Ñög gi (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Ñög gi (%(value)s) u %(setting)s:" #~ msgid "Unhandled list type %s for %s" #~ msgstr "%s u %s du xamee" #~ msgid "Actions" #~ msgstr "defaay yi" #~ msgid "Disable %s" #~ msgstr "Fay ... " #~ msgid "Name" #~ msgstr "Tudde" #~ msgid "Screen Edge" #~ msgstr "koĩ u telha" #~ msgid "Button %i" #~ msgstr "Botão %i u jénnax" #~ msgid "Edge Button" #~ msgstr "butão ngir koĩ u telha" #~ msgid "On System Bell" #~ msgstr "ao tocar a campaínha" #~ msgid "Edit Action: %s" #~ msgstr "bindal bu war na def defaay %s ! " #~ msgid "Screen Edges" #~ msgstr "ay koĩ i telha" #~ msgid "Reset To Defaults" #~ msgstr "Ñögàl ñög ñu wees yi ..." ./compizconfig/ccsm/po/nb.po0000644000004100000410000003015313246301623016236 0ustar www-datawww-data# Norwegian Bokmaal translation for CSSM. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the CCSM package. # , 2007. # # msgid "" msgstr "" "Project-Id-Version: CompizConfig Settings Manager\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-06-10 22:53+0200\n" "Last-Translator: Markus Igeland \n" "Language-Team: Norwegian Bokmaal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "Den nye verdien for snarveien %(binding)s for hendelsen %(action)s i " "tillegget %(plugin)s er i konflikt med hendelsen %(action_conflict)" "s i tillegget %(plugin_conflict)s.\n" "Vil du slå av %(action_conflict)s i tillegget %(plugin_conflict)s?" #, python-format msgid "Disable %(action_conflict)s" msgstr "Slå av %(action_conflict)s" #, python-format msgid "Don't set %(action)s" msgstr "Ikke velg %(action)s" #, python-format msgid "Set %(action)s anyway" msgstr "Velg %(action)s uansett" msgid "key" msgstr "Tast" msgid "button" msgstr "Knapp" msgid "edge" msgstr "Kant" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "Du prøver å bruke funksjonaliteten %(feature)s som ikke " "leveres av noe tillegg.\n" "Ønsker du å bruke denne funksjonaliteten uansett?" #, python-format msgid "Use %(feature)s" msgstr "Bruk %(feature)s" #, python-format msgid "Don't use %(feature)s" msgstr "Ikke bruk %(feature)s" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "Du prøver å bruke funksjonaliteten %(feature)s som leveres av " "tillegget %(plugin)s.\n" "Dette programtillegget er for tiden slått av.\n" "Vil du skru på %(plugin)s så funksjonaliteten er tilgjengelig?" #, python-format msgid "Enable %(plugin)s" msgstr "Slå på %(plugin)s" #, python-format msgid "Don't enable %(feature)s" msgstr "Ikke slå på %(feature)s" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "Løs conflikter" msgid "Ignore conflicts" msgstr "Ignorer konflikter" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "Programtillegget %(plugin_conflict)s leverer funksjonaliteten %" "(feature)s som også leveres av %(plugin)s" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "Slå av %(plugin_conflict)s" #, python-format msgid "Don't enable %(plugin)s" msgstr "Ikke skru på %(plugin)s" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "" "Programtillegget %(plugin_conflict)s er i konflikt med %(plugin)s" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s krever funksjonaliteten %(feature)s som leveres av " "de følgende programtilleggene:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "Skru på disse tilleggene" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s krever programtillegget %(require)s." #, python-format msgid "Enable %(require)s" msgstr "Skru på %(require)s" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s leverer funksjonaliteten %(feature)s som kreves av " "programtilleggene %(plugin_list)s." msgid "Disable these plugins" msgstr "Slå av disse tilleggene" #, python-format msgid "Don't disable %(plugin)s" msgstr "Ikke slå av %(plugin)s" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s kreves av programtilleggen %(plugin_list)s." msgid "General" msgstr "Generelt" msgid "Accessibility" msgstr "Tilgjengelighet" msgid "Desktop" msgstr "Skrivebord" msgid "Extras" msgstr "Ekstra" msgid "Window Management" msgstr "Vindushåndtering" msgid "Effects" msgstr "Effekter" msgid "Image Loading" msgstr "Bildelasting" msgid "Utility" msgstr "Nytte" msgid "All" msgstr "Alle" msgid "Uncategorized" msgstr "Ukategorisert" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "Tilbakestill innstillingen til standardverdien" msgid "Edit" msgstr "Rediger" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "" "Flerliste-innstillinger. Du kan dobbeltklikke på en rad for å redigere " "verdiene." #, python-format msgid "Edit %s" msgstr "Rediger %s" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" er ikke en gyldig snarvei" msgid "Disabled" msgstr "Slått av" msgid "Enabled" msgstr "Skrudd på" msgid "Grab key combination" msgstr "Hent tastekombinasjon" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" er ikke en gyldig knapp" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "Å bruke Knapp1 uten modifikator kan hindre venstreklikk og ødelegge " "konfigurasjonen din. Vil du virkelig stille inn \"%s\"-knapp til Knapp1 ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" er ikke en gyldig kantmaske" msgid "None" msgstr "Ingen" msgid "CompizConfig Settings Manager" msgstr "CompizConfig Innstillingshåndterer" msgid "Plugin" msgstr "Tillegg" msgid "Please press the new key combination" msgstr "Vennligst trykk den nye tastaturkombinasjonen" msgid "Window Title" msgstr "Vindustittel" msgid "Window Role" msgstr "Vindusrolle" msgid "Window Name" msgstr "Vindusnavn" msgid "Window Class" msgstr "Vindusklasse" msgid "Window Type" msgstr "Vindustype" msgid "Window ID" msgstr "Vindus-ID" msgid "And" msgstr "Og" msgid "Or" msgstr "Eller" msgid "Edit match" msgstr "Rediger treff" #. Type msgid "Type" msgstr "Type" #. Value msgid "Value" msgstr "Verdi" msgid "Grab" msgstr "Grip" #. Relation msgid "Relation" msgstr "Relasjon" #. Invert msgid "Invert" msgstr "Omvendt" msgid "Browse..." msgstr "Let etter..." msgid "Images" msgstr "Bilder" msgid "File" msgstr "Fil" msgid "Open directory..." msgstr "Åpne katalog..." msgid "Open file..." msgstr "Åpne fil..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "" "Dette er en innstillingshåndterer for CompizConfig-konfigurasjonssystemet" msgid "translator-credits" msgstr "oversetter-takk " msgid "An error has occured" msgstr "En feil har oppstått" msgid "Warning" msgstr "Advarsel" #, python-format msgid "Enable %s" msgstr "Skru på %s" msgid "Filter" msgstr "Filter" #, python-format msgid "Search %s Plugin Options" msgstr "Søk valg for programtillegget %s" msgid "Use This Plugin" msgstr "Bruk dette programtillegget" msgid "Search Compiz Core Options" msgstr "Søk Compiz Core-valg" msgid "Error" msgstr "Feil" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" "Skriv inn filteret.\n" "Klikk tastaturbildet for å gripe en tast å søke etter." msgid "Search in..." msgstr "Søk i..." #. Options msgid "Short description and name" msgstr "Kort beskrivelse og navn" msgid "Long description" msgstr "Lang beskrivelse" msgid "Settings value" msgstr "Verdi for innstilling" msgid "Group" msgstr "Grupper" msgid "Subgroup" msgstr "Undergruppe" #. Notebook msgid "Settings" msgstr "Innstillinger" msgid "Loading Advanced Search" msgstr "Laster avansert søk" msgid "Add a New Profile" msgstr "Legg til en ny profil" msgid "Remove This Profile" msgstr "Fjern denne profilen" msgid "Default" msgstr "Standard" msgid "Profile" msgstr "Profil" msgid "Import" msgstr "Importer" msgid "Import a CompizConfig Profile" msgstr "Importer en CompizConfig-profil" msgid "Import as..." msgstr "Importer som..." msgid "Import a CompizConfig Profile as a new profile" msgstr "Importer en CompizConfig-profil som en ny profil" msgid "Export" msgstr "Eksporter" msgid "Export your CompizConfig Profile" msgstr "Eksporter din CompizConfig-profil" msgid "Reset to defaults" msgstr "Tilbakestill til standardvalg" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "Tilbakestill din CompizConfig-profil til de globale standardvalgene" msgid "Backend" msgstr "Bakvegg" msgid "Integration" msgstr "Integrasjon" msgid "Enable integration into the desktop environment" msgstr "Aktiver integrasjon inn i skrivebordsmiljøet" msgid "Profiles (*.profile)" msgstr "Profiler (*.profile)" msgid "All files" msgstr "Alle filer" msgid "Save file.." msgstr "Lagre fil..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "Vil du hoppe over standardverdiene når du eksporterer profilen din?" msgid "Open file.." msgstr "Åpne fil..." msgid "Enter a profile name" msgstr "Skriv inn et profilnavn" msgid "Please enter a name for the new profile:" msgstr "Vennligst skriv inn et navn for den nye profilen" msgid "Backend not found." msgstr "Bakvegg ikke funnet" #. Auto sort msgid "Automatic plugin sorting" msgstr "Automatisk sortering av programtillegg" msgid "Disabled Plugins" msgstr "Avslåtte programtillegg" msgid "Enabled Plugins" msgstr "Påslåtte programtillegg" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "Vil du virkelig slå av automatisk sortering av programtillegg? Dette vil " "også slå av konflikthåndtering. Du burde bare gjøre dette om du vet hva du " "driver med." msgid "Add plugin" msgstr "Legg til programtillegg" msgid "Plugin name:" msgstr "Navn på programtillegg:" msgid "Insert plugin name" msgstr "Sett inn navnet på programtillegget" msgid "Preferences" msgstr "Preferanser" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "" "Konfigurer bakveggen, profilen og andre interne innstillinger som brukes av " "Compiz-konfigurasjonssystemet." msgid "About" msgstr "Om" msgid "About CCSM..." msgstr "Om CCSM..." msgid "Profile & Backend" msgstr "Profil og bakvegg" msgid "Plugin List" msgstr "Tilleggsliste" msgid "Filter your Plugin list" msgstr "Filter programtilleggslisten din" #, python-format msgid "Screen %i" msgstr "Skjerm %i" msgid "Screen" msgstr "Skjerm" msgid "Category" msgstr "Kategori" msgid "Advanced Search" msgstr "Avansert søk" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "Ingen treff. \n" "\n" " Filteret ditt, \"%s\", passer ikke til noen gjenstander." msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "Beregner mulige konflikter, vennligst vent" #~ msgid "Value (%s)" #~ msgstr "Verdi (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "Verdi (%(value)s) for %(setting)s" #~ msgid "Unhandled list type %s for %s" #~ msgstr "Uhåndtert listetype %s for %s" #~ msgid "Actions" #~ msgstr "Handlingen" ./compizconfig/ccsm/po/pa.po0000644000004100000410000003743013246301623016244 0ustar www-datawww-data# translation of ccsm.po to Punjabi # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # A S Alam , 2007. # Amanpreet Singh Alam , 2007. msgid "" msgstr "" "Project-Id-Version: ccsm\n" "Report-Msgid-Bugs-To: http://bugs.opencompositing.org\n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-11-11 19:50+0100\n" "Last-Translator: amandeep singh \n" "Language-Team: Punjabi/Panjabi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #, python-format msgid "" "The new value for the %(binding)s binding for the action %(action)s " "in plugin %(plugin)s conflicts with the action %(action_conflict)" "s of the %(plugin_conflict)s plugin.\n" "Do you wish to disable %(action_conflict)s in the %" "(plugin_conflict)s plugin?" msgstr "" "ਪਲੱਗਇਨ %(plugin)s ਵਿੱਚ %(action)s ਐਕਸ਼ਨ ਲਈ %(binding)s ਬਾਈਡਿੰਗ ਦਾ " "ਨਵਾਂ ਮੁੱਲ %(plugin_conflict)s ਪਲੱਗਇਨ ਦੇ %(action_conflict)s ਐਕਸ਼ਨ " "ਨਾਲ ਟਕਰਾ ਰਿਹ ਹੈ।\n" "ਕੀ ਤੁਸੀਂ %(plugin_conflict)s ਪਲੱਗਇਨ ਵਿੱਚ %(action_conflict)s ਨੂੰ ਆਯੋਗ " "ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?" #, python-format msgid "Disable %(action_conflict)s" msgstr "%(action_conflict)s ਆਯੋਗ" #, python-format msgid "Don't set %(action)s" msgstr "%(action)s ਸੈੱਟ ਕਰੋ" #, python-format msgid "Set %(action)s anyway" msgstr "%(action)s ਦੂਰ ਸੈੱਟ ਕਰੋ" msgid "key" msgstr "" msgid "button" msgstr "" msgid "edge" msgstr "" #, python-format msgid "" "You are trying to use the feature %(feature)s which is not " "provided by any plugin.\n" "Do you wish to use this feature anyway?" msgstr "" "ਤੁਸੀਂ %(feature)s ਫੀਚਰ ਵਰਤਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹੋ, ਜੋ ਕਿ ਕਿਸੇ ਪਲੱਗਇਨ ਰਾਹੀਂ " "ਨਹੀਂ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ? ਕੀ ਤੁਸੀਂ ਇਹ ਫੀਚਰ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ?" #, python-format msgid "Use %(feature)s" msgstr "%(feature)s ਵਰਤੋਂ" #, python-format msgid "Don't use %(feature)s" msgstr "%(feature)s ਨਾ ਵਰਤੋਂ" #, python-format msgid "" "You are trying to use the feature %(feature)s which is provided by " "%(plugin)s.\n" "This plugin is currently disabled.\n" "Do you wish to enable %(plugin)s so the feature is available?" msgstr "" "ਤੁਸੀਂ ਫੀਚਰ %(feature)s ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਜੋ ਕਿ %(plugin)s ਪਲੱਗਇਨ ਰਾਹੀਂ " "ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ।\n" "ਇਹ ਪਲੱਗਇਨ ਇਸ ਸਮੇਂ ਆਯੋਗ ਹੈ।\n" "ਕੀ ਤੁਸੀਂ ਫੀਚਰ ਵਰਤਣ ਲਈ %(plugin)s ਯੋਗ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹੋ?" #, python-format msgid "Enable %(plugin)s" msgstr "%(plugin)s ਯੋਗ ਕਰੋ" #, python-format msgid "Don't enable %(feature)s" msgstr "%(feature)s ਯੋਗ ਨਾ ਕਰੋ" #, python-format msgid "" "Some %(bindings)s bindings of Plugin %(plugin)s conflict with other " "plugins. Do you want to resolve these conflicts?" msgstr "" msgid "Resolve conflicts" msgstr "" msgid "Ignore conflicts" msgstr "" #, python-format msgid "" "Plugin %(plugin_conflict)s provides feature %(feature)s which " "is also provided by %(plugin)s" msgstr "" "ਪਲੱਗਇਨ %(plugin_conflict)s ਫੀਚਰ %(feature)s ਦਿੰਦੀ ਹੈ, ਜੋ ਕਿ %" "(plugin)s ਵਲੋਂ ਵੀ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ" #, python-format msgid "Disable %(plugin_conflict)s" msgstr "%(plugin_conflict)s ਆਯੋਗ ਕਰੋ" #, python-format msgid "Don't enable %(plugin)s" msgstr "%(plugin)s ਯੋਗ ਨਾ ਕਰੋ" #, python-format msgid "Plugin %(plugin_conflict)s conflicts with %(plugin)s." msgstr "ਪਲੱਗਇਨ %(plugin_conflict)s %(plugin)s ਨਾਲ ਟਕਰਾ ਰਹੀ ਹੈ।" #, python-format msgid "" "%(plugin)s requires feature %(feature)s which is provided by " "the following plugins:\n" "%(plugin_list)s" msgstr "" "%(plugin)s ਲਈ %(feature)s ਫੀਚਰ ਦੀ ਲੋੜ ਹੈ, ਜੋ ਕਿ ਅੱਗੇ ਦਿੱਤੀ ਪਲੱਗਇਨ ਵਲੋਂ " "ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ:\n" "%(plugin_list)s" msgid "Enable these plugins" msgstr "ਇਹ ਪਲੱਗਇਨ ਯੋਗ ਹੈ" #, python-format msgid "%(plugin)s requires the plugin %(require)s." msgstr "%(plugin)s ਲਈ ਪਲੱਗਇਨ %(require)s ਲੋੜੀਦੀ ਹੈ।" #, python-format msgid "Enable %(require)s" msgstr "%(require)s ਲੋੜੀਦੀ ਹੈ" #, python-format msgid "" "%(plugin)s provides the feature %(feature)s which is required " "by the plugins %(plugin_list)s." msgstr "" "%(plugin)s %(feature)s ਫੀਚਰ ਦਿੰਦੀ ਹੈ, ਜੋ ਕਿ %(plugin_list)s ਪਲੱਗਇਨ ਲਈ ਲੋੜੀਦਾ ਹੈ।" msgid "Disable these plugins" msgstr "ਇਹ ਪਲੱਗਇਨ ਆਯੋਗ ਕਰੋ" #, python-format msgid "Don't disable %(plugin)s" msgstr "%(plugin)s ਆਯੋਗ ਨਾ ਕਰੋ" #, python-format msgid "%(plugin)s is required by the plugins %(plugin_list)s." msgstr "%(plugin)s ਪਲੱਗਇਨ %(plugin_list)s ਰਾਹੀਂ ਲੋੜੀਦੀ ਹੈ।" msgid "General" msgstr "ਸਧਾਰਨ" msgid "Accessibility" msgstr "ਅਸੈੱਸੇਬਿਲਟੀ" msgid "Desktop" msgstr "ਡੈਸਕਟਾਪ" msgid "Extras" msgstr "ਐਕਸਟਰਾ" msgid "Window Management" msgstr "ਵਿੰਡੋ ਮੈਨਜੇਮੈਂਟ" msgid "Effects" msgstr "ਪਰਭਾਵ" msgid "Image Loading" msgstr "ਚਿੱਤਰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" msgid "Utility" msgstr "ਸਹੂਲਤਾਂ" msgid "All" msgstr "ਸਭ" msgid "Uncategorized" msgstr "ਅਣ-ਕੈਟਾਗਰੀ ਕੀਤੇ" msgid "N/A" msgstr "" msgid "Reset setting to the default value" msgstr "ਸੈਟਿੰਗ ਨੂੰ ਡਿਫਾਲਟ ਮੁੱਲ ਲਈ ਮੁੜ-ਸੈੱਟ ਕਰੋ" msgid "Edit" msgstr "ਸੋਧ" msgid "Multi-list settings. You can double-click a row to edit the values." msgstr "ਮਲਟੀ-ਲਿਸਟ ਸੈਟਿੰਗ ਹੈ। ਮੁੱਲ ਸੋਧਣ ਲਈ ਤੁਸੀਂ ਡਬਲ-ਕਲਿੱਕ ਕਰ ਸਕਦੇ ਹੋ।" #, python-format msgid "Edit %s" msgstr "%s ਸੋਧ" #, python-format msgid "\"%s\" is not a valid shortcut" msgstr "\"%s\" ਠੀਕ ਸ਼ਾਰਟਕੱਟ ਨਹੀਂ ਹੈ" msgid "Disabled" msgstr "ਆਯੋਗ ਹੈ" msgid "Enabled" msgstr "ਯੋਗ ਹੈ" msgid "Grab key combination" msgstr "ਸਵਿੱਚ ਸੰਯੋਗ ਲਵੋ" #, python-format msgid "\"%s\" is not a valid button" msgstr "\"%s\" ਇੱਕ ਵੈਧ ਬਟਨ ਨਹੀਂ ਹੈ" #, python-format msgid "" "Using Button1 without modifiers can prevent any left click and thus break " "your configuration. Do you really want to set \"%s\" button to Button1 ?" msgstr "" "ਬਟਨ1 ਨੂੰ ਬਿਨਾਂ ਮੋਡੀਫਾਇਰ ਦੇ ਵਰਤਣ ਨਾਲ ਕੋਈ ਵੀ ਖੱਬਾ ਕਲਿੱਕ ਰੁਕ ਸਕਦਾ ਹੈ ਅਤੇ ਤੁਹਾਡੀ ਸੰਰਚਨਾ ਖਰਾਬ " "ਹੋ ਸਕਦੀ ਹੈ। ਕੀ ਤੁਸੀਂ ਬਟਨ1 ਲਈ \"%s\" ਬਟਨ ਸੈੱਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?" #, python-format msgid "\"%s\" is not a valid edge mask" msgstr "\"%s\" ਇੱਕ ਵੈਧ ਕੋਨਾ ਮਾਸਕ ਨਹੀਂ ਹੈ" msgid "None" msgstr "ਕੋਈ ਨਹੀਂ" msgid "CompizConfig Settings Manager" msgstr "CompizConfig ਸੈਟਿੰਗ ਮੈਨੇਜਰ" #, fuzzy msgid "Plugin" msgstr "ਪਲੱਗਇਨ ਲਿਸਟ" msgid "Please press the new key combination" msgstr "ਨਵੇਂ ਸਵਿੱਚ ਸੰਯੋਗ ਲਈ ਦੱਬੋ ਜੀ" msgid "Window Title" msgstr "ਵਿੰਡੋ ਟਾਇਟਲ" msgid "Window Role" msgstr "ਵਿੰਡੋ ਰੋਲ" msgid "Window Name" msgstr "ਵਿੰਡੋ ਨਾਂ" msgid "Window Class" msgstr "ਵਿੰਡੋ ਕਲਾਸ" msgid "Window Type" msgstr "ਵਿੰਡੋ ਟਾਇਪ" msgid "Window ID" msgstr "ਵਿੰਡੋ ID" msgid "And" msgstr "ਅਤੇ" msgid "Or" msgstr "ਜਾਂ" msgid "Edit match" msgstr "ਮੇਲ ਸੋਧ" #. Type msgid "Type" msgstr "ਟਾਇਪ" #. Value msgid "Value" msgstr "ਮੁੱਲ" msgid "Grab" msgstr "ਲਵੋ" #. Relation msgid "Relation" msgstr "ਸਬੰਧ" #. Invert msgid "Invert" msgstr "ਉਲਟ" #, fuzzy msgid "Browse..." msgstr "ਝਲਕ " msgid "Images" msgstr "ਚਿੱਤਰ" msgid "File" msgstr "ਫਾਇਲ" msgid "Open directory..." msgstr "ਡਾਇਰੈਕਟਰੀ ਖੋਲ੍ਹੋ..." msgid "Open file..." msgstr "ਫਾਇਲ ਖੋਲ੍ਹੋ..." msgid "This is a settings manager for the CompizConfig configuration system." msgstr "ਇਹ CompizConfig ਸੰਰਚਨਾ ਸਿਸਟਮ ਲਈ ਇੱਕ ਸੈਟਿੰਗ ਮੈਨੇਜਰ ਹੈ।" msgid "translator-credits" msgstr "ਅਨੁਵਾਦ-ਮਾਣ" msgid "An error has occured" msgstr "ਇੱਕ ਗਲਤੀ ਆਈ ਹੈ" msgid "Warning" msgstr "ਚੇਤਾਵਨੀ" #, python-format msgid "Enable %s" msgstr "%s ਯੋਗ" msgid "Filter" msgstr "ਫਿਲਟਰ" #, python-format msgid "Search %s Plugin Options" msgstr "%s ਪਲੱਗਇਨ ਖੋਜ ਚੋਣ" msgid "Use This Plugin" msgstr "ਇਹ ਪਲੱਗਇਨ ਵਰਤੋਂ" msgid "Search Compiz Core Options" msgstr "ਕੰਪੋਜ਼ ਕੋਰ ਚੋਣ ਖੋਜ" msgid "Error" msgstr "ਗਲਤੀ" msgid "" "Enter a filter.\n" "Click the keyboard image to grab a key for which to search." msgstr "" msgid "Search in..." msgstr "ਇਸ ਵਿੱਚ ਖੋਜ..." #. Options msgid "Short description and name" msgstr "ਸੰਖੇਪ ਵੇਰਵਾ ਅਤੇ ਨਾਂ" msgid "Long description" msgstr "ਵੱਧ ਵੇਰਵਾ" msgid "Settings value" msgstr "ਸੈਟਿੰਗ ਮੁੱਲ" msgid "Group" msgstr "" msgid "Subgroup" msgstr "" #. Notebook msgid "Settings" msgstr "ਸੈਟਿੰਗ" #, fuzzy msgid "Loading Advanced Search" msgstr "ਤਕਨੀਕੀ ਖੋਜ" msgid "Add a New Profile" msgstr "ਇੱਕ ਨਵਾਂ ਪਰੋਫਾਇਲ ਸ਼ਾਮਲ" msgid "Remove This Profile" msgstr "ਇਹ ਪਰੋਫਾਇਲ ਹਟਾਓ" msgid "Default" msgstr "ਡਿਫਾਲਟ" msgid "Profile" msgstr "ਪਰੋਫਾਇਲ" msgid "Import" msgstr "ਇੰਪੋਰਟ" msgid "Import a CompizConfig Profile" msgstr "ਇੱਕ CompizConfig ਪਰੋਫਾਇਲ ਇੰਪੋਰਟ ਕਰੋ" msgid "Import as..." msgstr "ਇੰਝ ਇੰਪੋਰਟ ਕਰੋ..." msgid "Import a CompizConfig Profile as a new profile" msgstr "ਇੱਕ CompizConfig ਪਰੋਫਾਇਲ ਨਵੇਂ ਪਰੋਫਾਇਲ ਵਾਂਗ ਇੰਪੋਰਟ ਕਰੋ" msgid "Export" msgstr "ਐਕਸਪੋਰਟ" msgid "Export your CompizConfig Profile" msgstr "ਆਪਣਾ CompizConfig ਪਰੋਫਾਇਲ ਐਕਸਪੋਰਟ ਕਰੋ" msgid "Reset to defaults" msgstr "ਡਿਫਾਲਟ ਵਾਂਗ ਮੁੜ-ਸੈੱਟ ਕਰੋ" msgid "Reset your CompizConfig Profile to the global defaults" msgstr "ਆਪਣਾ CompizConfig ਪਰੋਫਾਇਲ ਗਲੋਬਲ ਡਿਫਾਲਟ ਮੁੜ-ਸੈੱਟ ਕਰੋ" msgid "Backend" msgstr "ਬੈਕਐਂਡ" msgid "Integration" msgstr "ਐਂਟੀਗਰੇਸ਼ਨ" msgid "Enable integration into the desktop environment" msgstr "ਡੈਸਕਟਾਪ ਇੰਵਾਇਰਨਮੈਂਟ ਵਿੱਚ ਐਂਟੀਗਰੇਸ਼ਨ ਯੋਗ ਕਰੋ" msgid "Profiles (*.profile)" msgstr "ਪਰੋਫਾਇਲ (*.profile)" msgid "All files" msgstr "ਸਭ ਫਾਇਲਾਂ" msgid "Save file.." msgstr "ਫਾਇਲ ਸੰਭਾਲੋ..." msgid "Do you want to skip default option values while exporting your profile?" msgstr "ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਪਰੋਫਾਇਲ ਐਕਸਪੋਰਟ ਕਰਨ ਦੌਰਾਨ ਡਿਫਾਲਟ ਚੋਣ ਮੁੱਲ ਛੱਡਣੇ ਚਾਹੁੰਦੇ ਹੋ?" msgid "Open file.." msgstr "ਫਾਇਲ ਖੋਲ੍ਹੋ..." msgid "Enter a profile name" msgstr "ਇੱਕ ਪਰੋਫਾਇਲ ਨਾਂ ਦਿਓ" msgid "Please enter a name for the new profile:" msgstr "ਨਵੇਂ ਪਰੋਫਾਇਲ ਲਈ ਇੱਕ ਨਵਾਂ ਦਿਓ ਜੀ:" msgid "Backend not found." msgstr "ਬੈਕਐਂਡ ਨਹੀਂ ਲੱਭਾ ਹੈ।" #. Auto sort msgid "Automatic plugin sorting" msgstr "ਆਟੋਮੈਟਿਕ ਪਲੱਗਇਨ ਲੜੀਬੱਧ ਕਰੋ" msgid "Disabled Plugins" msgstr "ਪਲੱਗਇਨ ਆਯੋਗ ਹੈ" msgid "Enabled Plugins" msgstr "ਪਲੱਗਇਨ ਯੋਗ ਹੈ" msgid "" "Do you really want to disable automatic plugin sorting? This will also " "disable conflict handling. You should only do this if you know what you are " "doing." msgstr "" "ਕੀ ਤੁਸੀਂ ਆਟੋਮੈਟਿਕ ਪਲੱਗਇਨ ਲੜੀਬੱਧ ਨੂੰ ਆਯੋਗ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਨਾਲ ਅਪਵਾਦ ਹੈਂਡਲਿੰਗ ਵੀ ਆਯੋਗ ਹੋ " "ਜਾਵੇਗੀ। ਤੁਹਾਨੂੰ ਇਹ ਤਾਂ ਹੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ, ਜੇ ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਕੀ ਕਰ ਰਹੇ ਹੋ।" msgid "Add plugin" msgstr "ਪਲੱਗਇਨ ਸ਼ਾਮਲ" msgid "Plugin name:" msgstr "ਪਰੋਫਾਇਲ ਨਾਂ:" msgid "Insert plugin name" msgstr "ਪਲੱਗਇਨ ਨਾਂ ਸ਼ਾਮਲ ਕਰੋ" msgid "Preferences" msgstr "ਪਸੰਦ" msgid "" "Configure the backend, profile and other internal settings used by the " "Compiz Configuration System." msgstr "ਬੈਕਐਂਡ, ਪਰੋਫਾਇਲ ਅਤੇ ਹੋਰ ਅੰਦਰੂਨੀ ਸੈਟਿੰਗ ਦੀ ਸੰਰਚਨਾ ਕੰਪਿਜ਼ ਸੰਰਚਨਾ ਸਿਸਟਮ ਰਾਹੀਂ।" msgid "About" msgstr "ਇਸ ਬਾਰੇ" msgid "About CCSM..." msgstr "CCSM ਬਾਰੇ..." msgid "Profile & Backend" msgstr "ਪਰੋਫਾਇਲ ਅਤੇ ਬੈਂਕਐਂਡ" msgid "Plugin List" msgstr "ਪਲੱਗਇਨ ਲਿਸਟ" msgid "Filter your Plugin list" msgstr "ਆਪਣੀ ਪਲੱਗਇਨ ਲਿਸਟ ਫਿਲਟਰ ਕਰੋ" #, python-format msgid "Screen %i" msgstr "%i ਸਕਰੀਨ" msgid "Screen" msgstr "ਸਕਰੀਨ" msgid "Category" msgstr "ਕੈਟਾਗਰੀ" msgid "Advanced Search" msgstr "ਤਕਨੀਕੀ ਖੋਜ" #, python-format msgid "" "No matches found. \n" "\n" " Your filter \"%s\" does not match any items." msgstr "" "ਕੋਈ ਮੇਲ ਨਹੀਂ ਲੱਭਾ।\n" "\n" "ਤੁਹਾਡਾ ਫਿਲਟਰ \"%s\" ਕਿਸੇ ਆਈਟਮ ਨਾਲ ਮਿਲਦਾ ਨਹੀਂ ਹੈ।" msgid "Configure Compiz with CompizConfig" msgstr "" #~ msgid "Computing possible conflicts, please wait" #~ msgstr "ਟਕਰਾ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ, ਉਡੀਕੋ ਜੀ" #~ msgid "Value (%s)" #~ msgstr "ਮੁੱਲ (%s)" #~ msgid "Value (%(value)s) for %(setting)s" #~ msgstr "%(setting)s ਲਈ ਮੁੱਲ (%(value)s)" #~ msgid "Unhandled list type %s for %s" #~ msgstr "ਅਣ-ਹੈਂਡਲ ਲਿਸਟ ਟਾਈਪ %s, %s ਲਈ" #~ msgid "Actions" #~ msgstr "ਐਕਸ਼ਨ" ./compizconfig/ccsm/setup.py0000755000004100000410000001661613246301623016406 0ustar www-datawww-data#!/usr/bin/env python import sys, os, glob import subprocess from stat import * from distutils.core import setup from distutils.command.install import install as _install from distutils.command.build import build as _build from distutils.command.install_data import install_data as _install_data INSTALLED_FILES = "installed_files" class build (_build): user_options = _build.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _build.initialize_options (self) def finalize_options(self): _build.finalize_options (self) class install (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): _install.run (self) icon_prefix = '%s/share/ccsm/icons/hicolor' % prefix icon_theme_cache = '%s/icon-theme.cache' % icon_prefix print ("icon_prefix ", icon_prefix) print ("icon_theme_cache ", icon_theme_cache) outputs = self.get_outputs () # Update icon cache gtk_update_icon_cache = '''gtk-update-icon-cache -f -t \ %s''' % icon_prefix root_specified = len (filter (lambda s: s.startswith ("--root"), sys.argv)) > 0 if not root_specified: print "Updating Gtk icon cache." os.system (gtk_update_icon_cache) outputs.append (icon_theme_cache) else: print '''*** Icon cache not updated. After install, run this: *** %s''' % gtk_update_icon_cache length = 0 if self.root: length += len (self.root) if self.prefix: length += len (self.prefix) if length: for counter in xrange (len (outputs)): outputs[counter] = outputs[counter][length:] data = "\n".join (outputs) try: file = open (INSTALLED_FILES, "w") except: self.warn ("Could not write installed files list %s" % \ INSTALLED_FILES) return file.write (data) file.close () class install_data (_install_data): def run (self): def chmod_data_file (file): try: os.chmod (file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) except: self.warn ("Could not chmod data file %s" % file) _install_data.run (self) map (chmod_data_file, self.get_outputs ()) class uninstall (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): try: file = open (INSTALLED_FILES, "r") except: self.warn ("Could not read installed files list %s" % \ INSTALLED_FILES) return files = file.readlines () file.close () prepend = "" if self.root: prepend += self.root if self.prefix: prepend += self.prefix if len (prepend): for counter in xrange (len (files)): files[counter] = prepend + files[counter].rstrip () for file in files: print "Uninstalling %s" % file try: os.unlink (file) except: self.warn ("Could not remove file %s" % file) ops = ("install", "build", "sdist", "uninstall", "clean") if len (sys.argv) < 2 or sys.argv[1] not in ops: print "Please specify operation : %s" % " | ".join (ops) raise SystemExit prefix = None if len (sys.argv) > 2: i = 0 for o in sys.argv: if o.startswith ("--prefix"): if o == "--prefix": if len (sys.argv) >= i: prefix = sys.argv[i + 1] sys.argv.remove (prefix) elif o.startswith ("--prefix=") and len (o[9:]): prefix = o[9:] sys.argv.remove (o) break i += 1 if not prefix and "PREFIX" in os.environ: prefix = os.environ["PREFIX"] if not prefix or not len (prefix): prefix = "/usr/local" if sys.argv[1] in ("install", "uninstall") and len (prefix): sys.argv += ["--prefix", prefix] for arg in sys.argv: if "--version" in arg: VERSION = arg.split ("=")[1] f = open (os.path.join ("ccm/Constants.py.in"), "rt") data = f.read () f.close () data = data.replace ("@prefix@", prefix) data = data.replace ("@version@", VERSION) f = open (os.path.join ("ccm/Constants.py"), "wt") f.write (data) f.close () cmd = "intltool-merge -d -u po/ ccsm.desktop.in ccsm.desktop".split(" ") proc = subprocess.Popen(cmd) proc.wait() custom_images = [] data_files = [ ("share/applications", ["ccsm.desktop"]), ] global_icon_path = "share/icons/hicolor/" local_icon_path = "share/ccsm/icons/hicolor/" for dir, subdirs, files in os.walk("images/"): if dir == "images/": for file in files: custom_images.append(dir + file) else: images = [] global_images = [] for file in files: if file.find(".svg") or file.find(".png"): file_path = "%s/%s" % (dir, file) # global image if file[:-4] == "ccsm": global_images.append(file_path) # local image else: images.append(file_path) # local if len(images) > 0: data_files.append((local_icon_path + dir[7:], images)) # global if len(global_images) > 0: data_files.append((global_icon_path + dir[7:], global_images)) data_files.append(("share/ccsm/images", custom_images)) podir = os.path.join (os.path.realpath ("."), "po") if os.path.isdir (podir): buildcmd = "msgfmt -o build/locale/%s/ccsm.mo po/%s.po" mopath = "build/locale/%s/ccsm.mo" destpath = "share/locale/%s/LC_MESSAGES" for name in os.listdir (podir): if name[-2:] == "po": name = name[:-3] if sys.argv[1] == "build" \ or (sys.argv[1] == "install" and \ not os.path.exists (mopath % name)): if not os.path.isdir ("build/locale/" + name): os.makedirs ("build/locale/" + name) os.system (buildcmd % (name, name)) data_files.append ((destpath % name, [mopath % name])) setup ( name = "ccsm", version = VERSION, description = "CompizConfig Settings Manager", author = "Patrick Niklaus", author_email = "marex@opencompositing.org", url = "https://launchpad.net/compiz", license = "GPL", data_files = data_files, packages = ["ccm"], scripts = ["ccsm"], cmdclass = {"build" : build, "uninstall" : uninstall, "install" : install, "install_data" : install_data} ) os.remove ("ccm/Constants.py") ./compizconfig/ccsm/TODO0000644000004100000410000000000013246301623015335 0ustar www-datawww-data./compizconfig/ccsm/MANIFEST.in0000644000004100000410000000030413246301623016412 0ustar www-datawww-datainclude po/* include TODO README INSTALL AUTHORS COPYING LICENSE NEWS VERSION ChangeLog include ccsm.desktop.in include ccm/Constants.py.in include Makefile MANIFEST.in recursive-include images * ./compizconfig/ccsm/LICENSE0000644000004100000410000000132313246301623015663 0ustar www-datawww-dataThis program and all files included in this package are free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ./compizconfig/cmake/0000755000004100000410000000000013246301623015012 5ustar www-datawww-data./compizconfig/cmake/exec_setup_py_with_destdir.cmake0000644000004100000410000000130713246301623023442 0ustar www-datawww-dataset (WDIR "" CACHE FORCE "Working Directory") set (PREFIX "" CACHE FORCE "Prefix") set (SETUP "" CACHE FORCE "Path to setup.py") set (VERSION "" CACHE FORCE "Version") set (EXTRAARGS "") set (BUILD_DEB $ENV{COMPIZ_DEB_BUILD}) set (INSTALL_ROOT $ENV{DESTDIR}) if (INSTALL_ROOT) set (INSTALL_ROOT_ARGS "--root=$ENV{DESTDIR}") else (INSTALL_ROOT) set (INSTALL_ROOT_ARGS "") endif (INSTALL_ROOT) cmake_policy (SET CMP0012 NEW) if (BUILD_DEB) message ("Installing Debian Format") set (EXTRAARGS "--install-layout=deb") endif (BUILD_DEB) execute_process (COMMAND python ${SETUP} install ${EXTRAARGS} --prefix=${PREFIX} --version=${VERSION} ${INSTALL_ROOT_ARGS} WORKING_DIRECTORY ${WDIR}) ./compizconfig/integration/0000755000004100000410000000000013246301623016255 5ustar www-datawww-data./compizconfig/integration/CMakeLists.txt0000644000004100000410000000006113246301623021012 0ustar www-datawww-dataadd_subdirectory (gnome) add_subdirectory (mate) ./compizconfig/integration/gnome/0000755000004100000410000000000013246301623017362 5ustar www-datawww-data./compizconfig/integration/gnome/CMakeLists.txt0000644000004100000410000000267113246301623022130 0ustar www-datawww-datainclude (FindPkgConfig) add_subdirectory (gsettings) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) compiz_pkg_check_modules (COMPIZCONFIG_GNOME_INTEGRATION ${_deps}) if (COMPIZCONFIG_GNOME_INTEGRATION_FOUND) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${COMPIZCONFIG_GNOME_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${COMPIZCONFIG_GNOME_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_gnome_integration_constants STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_constants.c) add_library (compizconfig_gnome_integration STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration.c) target_link_libraries (compizconfig_gnome_integration compizconfig_gnome_integration_constants compizconfig_gnome_integrated_setting compizconfig ${COMPIZCONFIG_GNOME_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integrated_setting.c) target_link_libraries (compizconfig_gnome_integrated_setting compizconfig_gnome_integration_constants compizconfig ${COMPIZCONFIG_GNOME_INTEGRATION_LIBRARIES}) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (COMPIZCONFIG_GNOME_INTEGRATION_FOUND) ./compizconfig/integration/gnome/include/0000755000004100000410000000000013246301623021005 5ustar www-datawww-data./compizconfig/integration/gnome/include/ccs_gnome_fwd.h0000644000004100000410000000045213246301623023754 0ustar www-datawww-data#ifndef _CCS_GNOME_INTEGRATION_FWD_H #define _CCS_GNOME_INTEGRATION_FWD_H #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGNOMEIntegratedSettingInfo CCSGNOMEIntegratedSettingInfo; typedef struct _CCSGNOMEValueChangeData CCSGNOMEValueChangeData; COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/include/ccs_gnome_integration_constants.h0000644000004100000410000002362713246301623027624 0ustar www-datawww-data#ifndef _CCS_GNOME_INTEGRATION_CONSTANTS_H #define _CCS_GNOME_INTEGRATION_CONSTANTS_H #include #include COMPIZCONFIG_BEGIN_DECLS #include #define METACITY "/apps/metacity" #define NUM_WATCHED_DIRS 3 typedef struct _CCSSettingIntegratedSettingPair CCSSettingIntegratedSettingPair; struct _CCSSettingIntegratedSettingPair { const char *compizName; const char *gnomeName; }; typedef struct _CCSGNOMEIntegratedSettingNames CCSGNOMEIntegratedSettingNames; struct _CCSGNOMEIntegratedSettingNames { CCSSettingIntegratedSettingPair CORE_AUDIBLE_BELL; CCSSettingIntegratedSettingPair CORE_CLICK_TO_FOCUS; CCSSettingIntegratedSettingPair CORE_RAISE_ON_CLICK; CCSSettingIntegratedSettingPair CORE_AUTORAISE_DELAY; CCSSettingIntegratedSettingPair CORE_AUTORAISE; CCSSettingIntegratedSettingPair THUMBNAIL_CURRENT_VIEWPORT; CCSSettingIntegratedSettingPair GNOMECOMPAT_COMMAND_TERMINAL; CCSSettingIntegratedSettingPair GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT; CCSSettingIntegratedSettingPair GNOMECOMPAT_COMMAND_SCREENSHOT; CCSSettingIntegratedSettingPair ROTATE_ROTATE_RIGHT_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_LEFT_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_12_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_11_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_10_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_9_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_8_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_7_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_6_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_5_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_4_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_3_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_2_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_1_WINDOW_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOM_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOP_KEY; CCSSettingIntegratedSettingPair PUT_PUT_RIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_LEFT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOMRIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOMLEFT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOPRIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOPLEFT_KEY; CCSSettingIntegratedSettingPair WALL_DOWN_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_UP_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_RIGHT_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_LEFT_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_RIGHT_KEY; CCSSettingIntegratedSettingPair WALL_LEFT_KEY; CCSSettingIntegratedSettingPair WALL_DOWN_KEY; CCSSettingIntegratedSettingPair WALL_UP_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_12_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_11_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_10_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_9_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_8_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_7_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_6_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_5_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_4_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_3_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_2_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_1_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_RIGHT_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_LEFT_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_12_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_11_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_10_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_9_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_8_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_7_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_6_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_5_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_4_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_3_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_2_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_1_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND11_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND10_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND9_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND8_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND7_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND6_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND5_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND4_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND3_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND2_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND1_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND0_KEY; CCSSettingIntegratedSettingPair COMMANDS_COMMAND11; CCSSettingIntegratedSettingPair COMMANDS_COMMAND10; CCSSettingIntegratedSettingPair COMMANDS_COMMAND9; CCSSettingIntegratedSettingPair COMMANDS_COMMAND8; CCSSettingIntegratedSettingPair COMMANDS_COMMAND7; CCSSettingIntegratedSettingPair COMMANDS_COMMAND6; CCSSettingIntegratedSettingPair COMMANDS_COMMAND5; CCSSettingIntegratedSettingPair COMMANDS_COMMAND4; CCSSettingIntegratedSettingPair COMMANDS_COMMAND3; CCSSettingIntegratedSettingPair COMMANDS_COMMAND2; CCSSettingIntegratedSettingPair COMMANDS_COMMAND1; CCSSettingIntegratedSettingPair COMMANDS_COMMAND0; CCSSettingIntegratedSettingPair EXTRAWM_TOGGLE_FULLSCREEN_KEY; CCSSettingIntegratedSettingPair EXTRAWM_TOGGLE_STICKY_KEY; CCSSettingIntegratedSettingPair STATICSWITCHER_PREV_KEY; CCSSettingIntegratedSettingPair STATICSWITCHER_NEXT_KEY; CCSSettingIntegratedSettingPair FADE_FULLSCREEN_VISUAL_BELL; CCSSettingIntegratedSettingPair FADE_VISUAL_BELL; CCSSettingIntegratedSettingPair NULL_RESIZE_WITH_RIGHT_BUTTON; CCSSettingIntegratedSettingPair NULL_MOUSE_BUTTON_MODIFIER; CCSSettingIntegratedSettingPair CORE_WINDOW_MENU_BUTTON; CCSSettingIntegratedSettingPair RESIZE_INITIATE_BUTTON; CCSSettingIntegratedSettingPair MOVE_INITIATE_BUTTON; CCSSettingIntegratedSettingPair CORE_WINDOW_MENU_KEY; CCSSettingIntegratedSettingPair RESIZE_INITIATE_KEY; CCSSettingIntegratedSettingPair MOVE_INITIATE_KEY; CCSSettingIntegratedSettingPair CORE_SHOW_DESKTOP_KEY; CCSSettingIntegratedSettingPair CORE_TOGGLE_WINDOW_SHADED_KEY; CCSSettingIntegratedSettingPair CORE_CLOSE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_LOWER_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_RAISE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY; CCSSettingIntegratedSettingPair CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MINIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_TOGGLE_WINDOW_MAXIMIZED_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_MAIN_MENU_KEY; CCSSettingIntegratedSettingPair GNOMECOMPAT_RUN_KEY; CCSSettingIntegratedSettingPair UNITYSHELL_SHOW_HUD; }; extern const CCSGNOMEIntegratedSettingNames ccsGNOMEIntegratedSettingNames; typedef struct _CCSGConfIntegrationCategoires CCSGConfIntegrationCategories; struct _CCSGConfIntegrationCategoires { const char *GENERAL; const char *APPS; const char *DESKTOP; const char *KEYBINDING_COMMANDS; const char *WINDOW_KEYBINDINGS; const char *GLOBAL_KEYBINDINGS; }; extern const CCSGConfIntegrationCategories ccsGConfIntegrationCategories; typedef struct _CCSGNOMEIntegratedPluginNames CCSGNOMEIntegratedPluginNames; struct _CCSGNOMEIntegratedPluginNames { const char *CORE; const char *THUMBNAIL; const char *GNOMECOMPAT; const char *ROTATE; const char *PUT; const char *WALL; const char *VPSWITCH; const char *COMMANDS; const char *EXTRAWM; const char *RESIZE; const char *MOVE; const char *STATICSWITCHER; const char *FADE; const char *UNITYSHELL; const char *SPECIAL; }; extern const CCSGNOMEIntegratedPluginNames ccsGNOMEIntegratedPluginNames; typedef struct _CCSGSettingsWrapperIntegratedSchemasQuarks { GQuark ORG_GNOME_DESKTOP_WM_PREFERENCES; GQuark ORG_GNOME_DESKTOP_WM_KEYBINDINGS; GQuark ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS; GQuark ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL; GQuark ORG_COMPIZ_INTEGRATED; } CCSGSettingsWrapperIntegratedSchemasQuarks; const CCSGSettingsWrapperIntegratedSchemasQuarks *ccsGNOMEGSettingsWrapperQuarks (); GHashTable * ccsGNOMEIntegrationPopulateCategoriesHashTables (); GHashTable * ccsGNOMEIntegrationPopulateSpecialTypesHashTables (); GHashTable * ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables (); GHashTable * ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable (); /* We only have to use the #define here because * C doesn't have a concept of "constants" setting * the array size ... */ #define CCS_GNOME_INTEGRATED_SETTINGS_LIST_SIZE 120 typedef struct _CCSGNOMEIntegratedSettingsList { const char *pluginName; const char *settingName; } CCSGNOMEIntegratedSettingsList; const CCSGNOMEIntegratedSettingsList * ccsGNOMEIntegratedSettingsList (); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/include/ccs_gnome_integration.h0000644000004100000410000000233413246301623025520 0ustar www-datawww-data#ifndef _CCS_COMPIZCONFIG_GNOME_INTEGRATION #define _CCS_COMPIZCONFIG_GNOME_INTEGRATION #include #include #include #include "ccs_gnome_integration_types.h" COMPIZCONFIG_BEGIN_DECLS struct _CCSGNOMEValueChangeData { CCSIntegration *integration; CCSIntegratedSettingsStorage *storage; CCSIntegratedSettingFactory *factory; CCSContext *context; }; /** * @brief ccsGNOMEIntegrationBackendNew * @param backend * @param context * @param factory * @param storage * @param ai * @return A new CCSIntegration * * The GNOME implementation of desktop environment integration - requires * a method to create new integrated settings, and a method to store them * as well. * * CCSGNOMEIntegration is a pure composition in most respects - it just * represents the process as to which settings should be written to * what keys and vice versa, it doesn't represent how those keys should * be written. */ CCSIntegration * ccsGNOMEIntegrationBackendNew (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/include/ccs_gnome_integrated_setting.h0000644000004100000410000000410113246301623027052 0ustar www-datawww-data#ifndef _CCS_GNOME_INTEGRATED_SETTING_H #define _CCS_GNOME_INTEGRATED_SETTING_H #include #include #include #include "ccs_gnome_integration_types.h" COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGNOMEIntegratedSettingInfoInterface CCSGNOMEIntegratedSettingInfoInterface; typedef SpecialOptionType (*CCSGNOMEIntegratedSettingInfoGetSpecialOptionType) (CCSGNOMEIntegratedSettingInfo *); typedef const char * (*CCSGNOMEIntegratedSettingInfoGetGNOMEName) (CCSGNOMEIntegratedSettingInfo *); typedef void (*CCSGNOMEIntegratedSettingInfoFree) (CCSGNOMEIntegratedSettingInfo *); struct _CCSGNOMEIntegratedSettingInfoInterface { CCSGNOMEIntegratedSettingInfoGetSpecialOptionType getSpecialOptionType; CCSGNOMEIntegratedSettingInfoGetGNOMEName getGNOMEName; CCSGNOMEIntegratedSettingInfoFree free; }; /** * @brief The _CCSGNOMEIntegratedSetting struct * * CCSGNOMEIntegratedSetting represents an integrated setting in * GNOME - it builds upon CCSSharedIntegratedSetting (which it composes * and implements) and also adds the concept of an GNOME side keyname * and option type for that keyname (as the types do not match 1-1) */ struct _CCSGNOMEIntegratedSettingInfo { CCSObject object; }; unsigned int ccsCCSGNOMEIntegratedSettingInfoInterfaceGetType (); Bool ccsGNOMEIntegrationFindSettingsMatchingPredicate (CCSIntegratedSetting *setting, void *userData); SpecialOptionType ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *); const char * ccsGNOMEIntegratedSettingInfoGetGNOMEName (CCSGNOMEIntegratedSettingInfo *); CCSGNOMEIntegratedSettingInfo * ccsGNOMEIntegratedSettingInfoNew (CCSIntegratedSettingInfo *base, SpecialOptionType type, const char *gnomeName, CCSObjectAllocationInterface *ai); void ccsFreeGNOMEIntegratedSettingInfo (CCSGNOMEIntegratedSettingInfo *); CCSREF_HDR (GNOMEIntegratedSettingInfo, CCSGNOMEIntegratedSettingInfo); CCSLIST_HDR (GNOMEIntegratedSettingInfo, CCSGNOMEIntegratedSettingInfo); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/include/ccs_gnome_integration_types.h0000644000004100000410000000043013246301623026737 0ustar www-datawww-data#ifndef _CCS_GNOME_INTEGRATION_TYPES_H #define _CCS_GNOME_INTEGRATION_TYPES_H #include COMPIZCONFIG_BEGIN_DECLS typedef enum { OptionInt, OptionBool, OptionKey, OptionString, OptionSpecial, } SpecialOptionType; COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/src/0000755000004100000410000000000013246301623020151 5ustar www-datawww-data./compizconfig/integration/gnome/src/ccs_gnome_integrated_setting.c0000644000004100000410000001250413246301623026217 0ustar www-datawww-data#include #include #include #include #include #include #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface); CCSREF_OBJ (GNOMEIntegratedSettingInfo, CCSGNOMEIntegratedSettingInfo); SpecialOptionType ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSGNOMEIntegratedSettingInfoInterface, info))->getSpecialOptionType) (info); } const char * ccsGNOMEIntegratedSettingInfoGetGNOMEName (CCSGNOMEIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSGNOMEIntegratedSettingInfoInterface, info))->getGNOMEName) (info); } /* CCSGNOMEIntegratedSettingDefaultImpl implementation */ typedef struct _CCSGNOMEIntegratedSettingInfoDefaultImplPrivate CCSGNOMEIntegratedSettingInfoDefaultImplPrivate; struct _CCSGNOMEIntegratedSettingInfoDefaultImplPrivate { SpecialOptionType type; const char *gnomeName; CCSIntegratedSettingInfo *sharedIntegratedSettingInfo; }; Bool ccsGNOMEIntegrationFindSettingsMatchingPredicate (CCSIntegratedSetting *setting, void *userData) { const char *findGnomeName = (const char *) userData; const char *gnomeNameOfSetting = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); if (strcmp (findGnomeName, gnomeNameOfSetting) == 0) return TRUE; return FALSE; } SpecialOptionType ccsGNOMEIntegratedSettingGetSpecialOptionDefault (CCSGNOMEIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return priv->type; } const char * ccsGNOMEIntegratedSettingGetGNOMENameDefault (CCSGNOMEIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return priv->gnomeName; } const char * ccsGNOMEIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoPluginName (priv->sharedIntegratedSettingInfo); } const char * ccsGNOMEIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoSettingName (priv->sharedIntegratedSettingInfo); } CCSSettingType ccsGNOMEIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoGetType (priv->sharedIntegratedSettingInfo); } void ccsGNOMESharedIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); ccsIntegratedSettingInfoUnref (priv->sharedIntegratedSettingInfo); ccsObjectFinalize (info); (*info->object.object_allocation->free_) (info->object.object_allocation->allocator, info); } static void ccsGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { ccsGNOMESharedIntegratedSettingInfoFree ((CCSIntegratedSettingInfo *) info); } CCSGNOMEIntegratedSettingInfoInterface ccsGNOMEIntegratedSettingInfoDefaultImplInterface = { ccsGNOMEIntegratedSettingGetSpecialOptionDefault, ccsGNOMEIntegratedSettingGetGNOMENameDefault, ccsGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInfoInterface ccsGNOMEIntegratedSettingInfoInterface = { ccsGNOMEIntegratedSettingInfoPluginName, ccsGNOMEIntegratedSettingInfoSettingName, ccsGNOMEIntegratedSettingInfoGetType, ccsGNOMESharedIntegratedSettingInfoFree }; void ccsFreeGNOMEIntegratedSettingInfo (CCSGNOMEIntegratedSettingInfo *info) { (*(GET_INTERFACE (CCSGNOMEIntegratedSettingInfoInterface, info))->free) (info); } CCSGNOMEIntegratedSettingInfo * ccsGNOMEIntegratedSettingInfoNew (CCSIntegratedSettingInfo *base, SpecialOptionType type, const char *gnomeName, CCSObjectAllocationInterface *ai) { CCSGNOMEIntegratedSettingInfo *info = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegratedSettingInfo)); if (!info) return NULL; CCSGNOMEIntegratedSettingInfoDefaultImplPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegratedSettingInfoDefaultImplPrivate)); if (!priv) { (*ai->free_) (ai->allocator, info); return NULL; } priv->sharedIntegratedSettingInfo = base; priv->gnomeName = gnomeName; priv->type = type; ccsObjectInit (info, ai); ccsObjectSetPrivate (info, (CCSPrivate *) priv); ccsObjectAddInterface (info, (const CCSInterface *) &ccsGNOMEIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (info, (const CCSInterface *) &ccsGNOMEIntegratedSettingInfoDefaultImplInterface, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsIntegratedSettingInfoRef ((CCSIntegratedSettingInfo *) info); return info; } ./compizconfig/integration/gnome/src/ccs_gnome_integration_constants.c0000644000004100000410000031343613246301623026763 0ustar www-datawww-data#include #include "ccs_gnome_integration_constants.h" const CCSGNOMEIntegratedSettingNames ccsGNOMEIntegratedSettingNames = { { "audible_bell", "audible_bell" }, { "click_to_focus", "focus_mode" }, { "raise_on_click", "raise_on_click" }, { "autoraise_delay", "auto_raise_delay" }, { "autoraise", "auto_raise" }, { "current_viewport", "display_all_workspaces" }, { "command_terminal", "exec" }, { "command_window_screenshot", "command_window_screenshot" }, { "command_screenshot", "command_screenshot" }, { "rotate_right_window_key", "move_to_workspace_right" }, { "rotate_left_window_key", "move_to_workspace_left" }, { "rotate_to_12_window_key", "move_to_workspace_12" }, { "rotate_to_11_window_key", "move_to_workspace_11" }, { "rotate_to_10_window_key", "move_to_workspace_10" }, { "rotate_to_9_window_key", "move_to_workspace_9" }, { "rotate_to_8_window_key", "move_to_workspace_8" }, { "rotate_to_7_window_key", "move_to_workspace_7" }, { "rotate_to_6_window_key", "move_to_workspace_6" }, { "rotate_to_5_window_key", "move_to_workspace_5" }, { "rotate_to_4_window_key", "move_to_workspace_4" }, { "rotate_to_3_window_key", "move_to_workspace_3" }, { "rotate_to_2_window_key", "move_to_workspace_2" }, { "rotate_to_1_window_key", "move_to_workspace_1" }, { "put_bottom_key", "move_to_side_s" }, { "put_top_key", "move_to_side_n" }, { "put_right_key", "move_to_side_e" }, { "put_left_key", "move_to_side_w" }, { "put_bottomright_key", "move_to_corner_se" }, { "put_bottomleft_key", "move_to_corner_sw" }, { "put_topright_key", "move_to_corner_ne" }, { "put_topleft_key", "move_to_corner_nw" }, { "down_window_key", "move_to_workspace_down" }, { "up_window_key", "move_to_workspace_up" }, { "right_window_key", "move_to_workspace_right" }, { "left_window_key", "move_to_workspace_left" }, { "right_key", "switch_to_workspace_right" }, { "left_key", "switch_to_workspace_left" }, { "down_key", "switch_to_workspace_down" }, { "up_key", "switch_to_workspace_up" }, { "switch_to_12_key", "switch_to_workspace_12" }, { "switch_to_11_key", "switch_to_workspace_11" }, { "switch_to_10_key", "switch_to_workspace_10" }, { "switch_to_9_key", "switch_to_workspace_9" }, { "switch_to_8_key", "switch_to_workspace_8" }, { "switch_to_7_key", "switch_to_workspace_7" }, { "switch_to_6_key", "switch_to_workspace_6" }, { "switch_to_5_key", "switch_to_workspace_5" }, { "switch_to_4_key", "switch_to_workspace_4" }, { "switch_to_3_key", "switch_to_workspace_3" }, { "switch_to_2_key", "switch_to_workspace_2" }, { "switch_to_1_key", "switch_to_workspace_1" }, { "rotate_right_key", "switch_to_workspace_right" }, { "rotate_left_key", "switch_to_workspace_left" }, { "rotate_to_12_key", "switch_to_workspace_12" }, { "rotate_to_11_key", "switch_to_workspace_11" }, { "rotate_to_10_key", "switch_to_workspace_10" }, { "rotate_to_9_key", "switch_to_workspace_9" }, { "rotate_to_8_key", "switch_to_workspace_8" }, { "rotate_to_7_key", "switch_to_workspace_7" }, { "rotate_to_6_key", "switch_to_workspace_6" }, { "rotate_to_5_key", "switch_to_workspace_5" }, { "rotate_to_4_key", "switch_to_workspace_4" }, { "rotate_to_3_key", "switch_to_workspace_3" }, { "rotate_to_2_key", "switch_to_workspace_2" }, { "rotate_to_1_key", "switch_to_workspace_1" }, { "run_command11_key", "run_command_12" }, { "run_command10_key", "run_command_11" }, { "run_command9_key", "run_command_10" }, { "run_command8_key", "run_command_9" }, { "run_command7_key", "run_command_8" }, { "run_command6_key", "run_command_7" }, { "run_command5_key", "run_command_6" }, { "run_command4_key", "run_command_5" }, { "run_command3_key", "run_command_4" }, { "run_command2_key", "run_command_3" }, { "run_command1_key", "run_command_2" }, { "run_command0_key", "run_command_1" }, { "command11", "command_12" }, { "command10", "command_11" }, { "command9", "command_10" }, { "command8", "command_9" }, { "command7", "command_8" }, { "command6", "command_7" }, { "command5", "command_6" }, { "command4", "command_5" }, { "command3", "command_4" }, { "command2", "command_3" }, { "command1", "command_2" }, { "command0", "command_1" }, { "toggle_fullscreen_key", "toggle_fullscreen" }, { "toggle_sticky_key", "toggle_on_all_workspaces" }, { "prev_key", "switch_windows_backward" }, { "next_key", "switch_windows" }, { "fullscreen_visual_bell", "visual_bell_type" }, { "visual_bell", "visual_bell" }, { "resize_with_right_button", "resize_with_right_button" }, { "mouse_button_modifier", "mouse_button_modifier" }, { "window_menu_button", "activate_window_menu" }, { "initiate_button", "begin_resize" }, { "initiate_button", "begin_move" }, { "window_menu_key", "activate_window_menu" }, { "initiate_key", "begin_resize" }, { "initiate_key", "begin_move" }, { "show_desktop_key", "show_desktop" }, { "toggle_window_shaded_key", "toggle_shaded" }, { "close_window_key", "close" }, { "lower_window_key", "lower" }, { "raise_window_key", "raise" }, { "maximize_window_vertically_key", "maximize_vertically" }, { "maximize_window_horizontally_key", "maximize_horizontally" }, { "unmaximize_or_minimize_window_key", "unmaximize" }, { "maximize_window_key", "maximize" }, { "minimize_window_key", "minimize" }, { "toggle_window_maximized_key", "toggle_maximized" }, { "run_command_terminal_key", "run_command_terminal" }, { "run_command_window_screenshot_key", "run_command_window_screenshot" }, { "run_command_screenshot_key", "run_command_screenshot" }, { "main_menu_key", "panel_main_menu" }, { "run_key", "panel_run_dialog" }, { "show_hud", "show_hud" } }; const CCSGConfIntegrationCategories ccsGConfIntegrationCategories = { METACITY "/general/", "/apps/panel/applets/window_list/prefs/", "/desktop/gnome/applications/terminal/", METACITY "/keybinding_commands/", METACITY "/window_keybindings/", METACITY "/global_keybindings/" }; const CCSGNOMEIntegratedPluginNames ccsGNOMEIntegratedPluginNames = { "core", "thumbnail", "gnomecompat", "rotate", "put", "wall", "vpswitch", "commands", "extrawm", "resize", "move", "staticswitcher", "fade", "unityshell", "__special" }; static gpointer ccsGNOMEIntegrationInitializeIntegratedSettingsList (gpointer data) { CCSGNOMEIntegratedSettingsList *array = (CCSGNOMEIntegratedSettingsList *) data; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; const CCSGNOMEIntegratedSettingNames *settings = &ccsGNOMEIntegratedSettingNames; array[0].pluginName = plugins->CORE; array[0].settingName = settings->CORE_AUDIBLE_BELL.compizName; array[1].pluginName = plugins->CORE; array[1].settingName = settings->CORE_CLICK_TO_FOCUS.compizName; array[2].pluginName = plugins->CORE; array[2].settingName = settings->CORE_RAISE_ON_CLICK.compizName; array[3].pluginName = plugins->CORE; array[3].settingName = settings->CORE_AUTORAISE_DELAY.compizName; array[4].pluginName = plugins->CORE; array[4].settingName = settings->CORE_AUTORAISE.compizName; array[5].pluginName = plugins->THUMBNAIL; array[5].settingName = settings->THUMBNAIL_CURRENT_VIEWPORT.compizName; array[6].pluginName = plugins->GNOMECOMPAT; array[6].settingName = settings->GNOMECOMPAT_COMMAND_TERMINAL.compizName; array[7].pluginName = plugins->GNOMECOMPAT; array[7].settingName = settings->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName; array[8].pluginName = plugins->GNOMECOMPAT; array[8].settingName = settings->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName; array[9].pluginName = plugins->ROTATE; array[9].settingName = settings->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName; array[10].pluginName = plugins->ROTATE; array[10].settingName = settings->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName; array[11].pluginName = plugins->ROTATE; array[11].settingName = settings->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName; array[12].pluginName = plugins->ROTATE; array[12].settingName = settings->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName; array[13].pluginName = plugins->ROTATE; array[13].settingName = settings->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName; array[14].pluginName = plugins->ROTATE; array[14].settingName = settings->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName; array[15].pluginName = plugins->ROTATE; array[15].settingName = settings->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName; array[16].pluginName = plugins->ROTATE; array[16].settingName = settings->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName; array[17].pluginName = plugins->ROTATE; array[17].settingName = settings->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName; array[18].pluginName = plugins->ROTATE; array[18].settingName = settings->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName; array[19].pluginName = plugins->ROTATE; array[19].settingName = settings->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName; array[20].pluginName = plugins->ROTATE; array[20].settingName = settings->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName; array[21].pluginName = plugins->ROTATE; array[21].settingName = settings->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName; array[22].pluginName = plugins->ROTATE; array[22].settingName = settings->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName; array[23].pluginName = plugins->PUT; array[23].settingName = settings->PUT_PUT_BOTTOM_KEY.compizName; array[24].pluginName = plugins->PUT; array[24].settingName = settings->PUT_PUT_TOP_KEY.compizName; array[25].pluginName = plugins->PUT; array[25].settingName = settings->PUT_PUT_RIGHT_KEY.compizName; array[26].pluginName = plugins->PUT; array[26].settingName = settings->PUT_PUT_LEFT_KEY.compizName; array[27].pluginName = plugins->PUT; array[27].settingName = settings->PUT_PUT_BOTTOMRIGHT_KEY.compizName; array[28].pluginName = plugins->PUT; array[28].settingName = settings->PUT_PUT_BOTTOMLEFT_KEY.compizName; array[29].pluginName = plugins->PUT; array[29].settingName = settings->PUT_PUT_TOPRIGHT_KEY.compizName; array[30].pluginName = plugins->PUT; array[30].settingName = settings->PUT_PUT_TOPLEFT_KEY.compizName; array[31].pluginName = plugins->WALL; array[31].settingName = settings->WALL_DOWN_WINDOW_KEY.compizName; array[32].pluginName = plugins->WALL; array[32].settingName = settings->WALL_UP_WINDOW_KEY.compizName; array[33].pluginName = plugins->WALL; array[33].settingName = settings->WALL_RIGHT_WINDOW_KEY.compizName; array[34].pluginName = plugins->WALL; array[34].settingName = settings->WALL_LEFT_WINDOW_KEY.compizName; array[35].pluginName = plugins->WALL; array[35].settingName = settings->WALL_RIGHT_KEY.compizName; array[36].pluginName = plugins->WALL; array[36].settingName = settings->WALL_LEFT_KEY.compizName; array[37].pluginName = plugins->WALL; array[37].settingName = settings->WALL_DOWN_KEY.compizName; array[38].pluginName = plugins->WALL; array[38].settingName = settings->WALL_UP_KEY.compizName; array[39].pluginName = plugins->VPSWITCH; array[39].settingName = settings->VPSWITCH_SWITCH_TO_12_KEY.compizName; array[40].pluginName = plugins->VPSWITCH; array[40].settingName = settings->VPSWITCH_SWITCH_TO_11_KEY.compizName; array[41].pluginName = plugins->VPSWITCH; array[41].settingName = settings->VPSWITCH_SWITCH_TO_10_KEY.compizName; array[42].pluginName = plugins->VPSWITCH; array[42].settingName = settings->VPSWITCH_SWITCH_TO_9_KEY.compizName; array[43].pluginName = plugins->VPSWITCH; array[43].settingName = settings->VPSWITCH_SWITCH_TO_8_KEY.compizName; array[44].pluginName = plugins->VPSWITCH; array[44].settingName = settings->VPSWITCH_SWITCH_TO_7_KEY.compizName; array[45].pluginName = plugins->VPSWITCH; array[45].settingName = settings->VPSWITCH_SWITCH_TO_6_KEY.compizName; array[46].pluginName = plugins->VPSWITCH; array[46].settingName = settings->VPSWITCH_SWITCH_TO_5_KEY.compizName; array[47].pluginName = plugins->VPSWITCH; array[47].settingName = settings->VPSWITCH_SWITCH_TO_4_KEY.compizName; array[48].pluginName = plugins->VPSWITCH; array[48].settingName = settings->VPSWITCH_SWITCH_TO_3_KEY.compizName; array[49].pluginName = plugins->VPSWITCH; array[49].settingName = settings->VPSWITCH_SWITCH_TO_2_KEY.compizName; array[50].pluginName = plugins->VPSWITCH; array[50].settingName = settings->VPSWITCH_SWITCH_TO_1_KEY.compizName; array[51].pluginName = plugins->ROTATE; array[51].settingName = settings->ROTATE_ROTATE_RIGHT_KEY.compizName; array[52].pluginName = plugins->ROTATE; array[52].settingName = settings->ROTATE_ROTATE_LEFT_KEY.compizName; array[53].pluginName = plugins->ROTATE; array[53].settingName = settings->ROTATE_ROTATE_TO_12_KEY.compizName; array[54].pluginName = plugins->ROTATE; array[54].settingName = settings->ROTATE_ROTATE_TO_11_KEY.compizName; array[55].pluginName = plugins->ROTATE; array[55].settingName = settings->ROTATE_ROTATE_TO_10_KEY.compizName; array[56].pluginName = plugins->ROTATE; array[56].settingName = settings->ROTATE_ROTATE_TO_9_KEY.compizName; array[57].pluginName = plugins->ROTATE; array[57].settingName = settings->ROTATE_ROTATE_TO_8_KEY.compizName; array[58].pluginName = plugins->ROTATE; array[58].settingName = settings->ROTATE_ROTATE_TO_7_KEY.compizName; array[59].pluginName = plugins->ROTATE; array[59].settingName = settings->ROTATE_ROTATE_TO_6_KEY.compizName; array[60].pluginName = plugins->ROTATE; array[60].settingName = settings->ROTATE_ROTATE_TO_5_KEY.compizName; array[61].pluginName = plugins->ROTATE; array[61].settingName = settings->ROTATE_ROTATE_TO_4_KEY.compizName; array[62].pluginName = plugins->ROTATE; array[62].settingName = settings->ROTATE_ROTATE_TO_3_KEY.compizName; array[63].pluginName = plugins->ROTATE; array[63].settingName = settings->ROTATE_ROTATE_TO_2_KEY.compizName; array[64].pluginName = plugins->ROTATE; array[64].settingName = settings->ROTATE_ROTATE_TO_1_KEY.compizName; array[65].pluginName = plugins->COMMANDS; array[65].settingName = settings->COMMANDS_RUN_COMMAND11_KEY.compizName; array[66].pluginName = plugins->COMMANDS; array[66].settingName = settings->COMMANDS_RUN_COMMAND10_KEY.compizName; array[67].pluginName = plugins->COMMANDS; array[67].settingName = settings->COMMANDS_RUN_COMMAND9_KEY.compizName; array[68].pluginName = plugins->COMMANDS; array[68].settingName = settings->COMMANDS_RUN_COMMAND8_KEY.compizName; array[69].pluginName = plugins->COMMANDS; array[69].settingName = settings->COMMANDS_RUN_COMMAND7_KEY.compizName; array[70].pluginName = plugins->COMMANDS; array[70].settingName = settings->COMMANDS_RUN_COMMAND6_KEY.compizName; array[71].pluginName = plugins->COMMANDS; array[71].settingName = settings->COMMANDS_RUN_COMMAND5_KEY.compizName; array[72].pluginName = plugins->COMMANDS; array[72].settingName = settings->COMMANDS_RUN_COMMAND4_KEY.compizName; array[73].pluginName = plugins->COMMANDS; array[73].settingName = settings->COMMANDS_RUN_COMMAND3_KEY.compizName; array[74].pluginName = plugins->COMMANDS; array[74].settingName = settings->COMMANDS_RUN_COMMAND2_KEY.compizName; array[75].pluginName = plugins->COMMANDS; array[75].settingName = settings->COMMANDS_RUN_COMMAND1_KEY.compizName; array[76].pluginName = plugins->COMMANDS; array[76].settingName = settings->COMMANDS_RUN_COMMAND0_KEY.compizName; array[77].pluginName = plugins->COMMANDS; array[77].settingName = settings->COMMANDS_COMMAND11.compizName; array[78].pluginName = plugins->COMMANDS; array[78].settingName = settings->COMMANDS_COMMAND10.compizName; array[79].pluginName = plugins->COMMANDS; array[79].settingName = settings->COMMANDS_COMMAND9.compizName; array[80].pluginName = plugins->COMMANDS; array[80].settingName = settings->COMMANDS_COMMAND8.compizName; array[81].pluginName = plugins->COMMANDS; array[81].settingName = settings->COMMANDS_COMMAND7.compizName; array[82].pluginName = plugins->COMMANDS; array[82].settingName = settings->COMMANDS_COMMAND6.compizName; array[83].pluginName = plugins->COMMANDS; array[83].settingName = settings->COMMANDS_COMMAND5.compizName; array[84].pluginName = plugins->COMMANDS; array[84].settingName = settings->COMMANDS_COMMAND4.compizName; array[85].pluginName = plugins->COMMANDS; array[85].settingName = settings->COMMANDS_COMMAND3.compizName; array[86].pluginName = plugins->COMMANDS; array[86].settingName = settings->COMMANDS_COMMAND2.compizName; array[87].pluginName = plugins->COMMANDS; array[87].settingName = settings->COMMANDS_COMMAND1.compizName; array[88].pluginName = plugins->COMMANDS; array[88].settingName = settings->COMMANDS_COMMAND0.compizName; array[89].pluginName = plugins->EXTRAWM; array[89].settingName = settings->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName; array[90].pluginName = plugins->EXTRAWM; array[90].settingName = settings->EXTRAWM_TOGGLE_STICKY_KEY.compizName; array[91].pluginName = plugins->STATICSWITCHER; array[91].settingName = settings->STATICSWITCHER_PREV_KEY.compizName; array[92].pluginName = plugins->STATICSWITCHER; array[92].settingName = settings->STATICSWITCHER_NEXT_KEY.compizName; array[93].pluginName = plugins->FADE; array[93].settingName = settings->FADE_FULLSCREEN_VISUAL_BELL.compizName; array[94].pluginName = plugins->FADE; array[94].settingName = settings->FADE_VISUAL_BELL.compizName; array[95].pluginName = plugins->SPECIAL; array[95].settingName = settings->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName; array[96].pluginName = plugins->SPECIAL; array[96].settingName = settings->NULL_MOUSE_BUTTON_MODIFIER.compizName; array[97].pluginName = plugins->CORE; array[97].settingName = settings->CORE_WINDOW_MENU_BUTTON.compizName; array[98].pluginName = plugins->RESIZE; array[98].settingName = settings->RESIZE_INITIATE_BUTTON.compizName; array[99].pluginName = plugins->MOVE; array[99].settingName = settings->MOVE_INITIATE_BUTTON.compizName; array[100].pluginName = plugins->CORE; array[100].settingName = settings->CORE_WINDOW_MENU_KEY.compizName; array[101].pluginName = plugins->RESIZE; array[101].settingName = settings->RESIZE_INITIATE_KEY.compizName; array[102].pluginName = plugins->MOVE; array[102].settingName = settings->MOVE_INITIATE_KEY.compizName; array[103].pluginName = plugins->CORE; array[103].settingName = settings->CORE_SHOW_DESKTOP_KEY.compizName; array[104].pluginName = plugins->CORE; array[104].settingName = settings->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName; array[105].pluginName = plugins->CORE; array[105].settingName = settings->CORE_CLOSE_WINDOW_KEY.compizName; array[106].pluginName = plugins->CORE; array[106].settingName = settings->CORE_LOWER_WINDOW_KEY.compizName; array[107].pluginName = plugins->CORE; array[107].settingName = settings->CORE_RAISE_WINDOW_KEY.compizName; array[108].pluginName = plugins->CORE; array[108].settingName = settings->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName; array[109].pluginName = plugins->CORE; array[109].settingName = settings->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName; array[110].pluginName = plugins->CORE; array[110].settingName = settings->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName; array[111].pluginName = plugins->CORE; array[111].settingName = settings->CORE_MAXIMIZE_WINDOW_KEY.compizName; array[112].pluginName = plugins->CORE; array[112].settingName = settings->CORE_MINIMIZE_WINDOW_KEY.compizName; array[113].pluginName = plugins->CORE; array[113].settingName = settings->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName; array[114].pluginName = plugins->GNOMECOMPAT; array[114].settingName = settings->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName; array[115].pluginName = plugins->GNOMECOMPAT; array[115].settingName = settings->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName; array[116].pluginName = plugins->GNOMECOMPAT; array[116].settingName = settings->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName; array[117].pluginName = plugins->GNOMECOMPAT; array[117].settingName = settings->GNOMECOMPAT_MAIN_MENU_KEY.compizName; array[118].pluginName = plugins->GNOMECOMPAT; array[118].settingName = settings->GNOMECOMPAT_RUN_KEY.compizName; array[119].pluginName = plugins->UNITYSHELL; array[119].settingName = settings->UNITYSHELL_SHOW_HUD.compizName; return NULL; } const CCSGNOMEIntegratedSettingsList * ccsGNOMEIntegratedSettingsList () { static GOnce initIntegratedSettings = G_ONCE_INIT; static CCSGNOMEIntegratedSettingsList settings[CCS_GNOME_INTEGRATED_SETTINGS_LIST_SIZE]; g_once (&initIntegratedSettings, ccsGNOMEIntegrationInitializeIntegratedSettingsList, (gpointer) settings); return settings; } gpointer ccsGNOMEGSettingsIntegrationInitializeIntegratedSchemasQuarks (gpointer data) { CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = (CCSGSettingsWrapperIntegratedSchemasQuarks *) data; static const char *org_compiz_integrated = "org.compiz.integrated"; static const char *org_gnome_desktop_wm_keybindings = "org.gnome.desktop.wm.keybindings"; static const char *org_gnome_desktop_wm_preferences = "org.gnome.desktop.wm.preferences"; static const char *org_gnome_settings_daemon_plugins_media_keys = "org.gnome.settings-daemon.plugins.media-keys"; static const char *org_gnome_desktop_default_applications_terminal = "org.gnome.desktop.default-applications.terminal"; quarks->ORG_COMPIZ_INTEGRATED = g_quark_from_string (org_compiz_integrated); quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS = g_quark_from_string (org_gnome_desktop_wm_keybindings); quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES = g_quark_from_string (org_gnome_desktop_wm_preferences); quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS = g_quark_from_string (org_gnome_settings_daemon_plugins_media_keys); quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL = g_quark_from_string (org_gnome_desktop_default_applications_terminal); return NULL; } const CCSGSettingsWrapperIntegratedSchemasQuarks * ccsGNOMEGSettingsWrapperQuarks () { static GOnce initIntegratedSchemaQuarks = G_ONCE_INIT; static CCSGSettingsWrapperIntegratedSchemasQuarks quarks; g_once (&initIntegratedSchemaQuarks, ccsGNOMEGSettingsIntegrationInitializeIntegratedSchemasQuarks, (gpointer) &quarks); return &quarks; } static void destroyHashTableInternal (void *ht) { g_hash_table_unref ((GHashTable *) ht); } GHashTable * ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsGNOMEGSettingsWrapperQuarks (); g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); return masterHashTable; } GHashTable * ccsGNOMEIntegrationPopulateCategoriesHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGConfIntegrationCategories *categories = &ccsGConfIntegrationCategories; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, (gpointer) categories->APPS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, (gpointer) categories->DESKTOP); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); return masterHashTable; } GHashTable * ccsGNOMEIntegrationPopulateSpecialTypesHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, GINT_TO_POINTER (OptionInt)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, GINT_TO_POINTER (OptionKey)); return masterHashTable; } GHashTable * ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *gnomecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *unityshellHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSGNOMEIntegratedSettingNames *names = &ccsGNOMEIntegratedSettingNames; const CCSGNOMEIntegratedPluginNames *plugins = &ccsGNOMEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->GNOMECOMPAT, gnomecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->UNITYSHELL, unityshellHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, (gpointer) names->CORE_AUDIBLE_BELL.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, (gpointer) names->CORE_CLICK_TO_FOCUS.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, (gpointer) names->CORE_RAISE_ON_CLICK.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, (gpointer) names->CORE_AUTORAISE_DELAY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, (gpointer) names->CORE_AUTORAISE.gnomeName); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.compizName, (gpointer) names->GNOMECOMPAT_COMMAND_TERMINAL.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, (gpointer) names->GNOMECOMPAT_COMMAND_WINDOW_SCREENSHOT.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.compizName, (gpointer) names->GNOMECOMPAT_COMMAND_SCREENSHOT.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOM_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, (gpointer) names->PUT_PUT_TOP_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, (gpointer) names->PUT_PUT_RIGHT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, (gpointer) names->PUT_PUT_LEFT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.gnomeName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, (gpointer) names->PUT_PUT_TOPLEFT_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, (gpointer) names->WALL_DOWN_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, (gpointer) names->WALL_UP_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, (gpointer) names->WALL_RIGHT_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, (gpointer) names->WALL_LEFT_WINDOW_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, (gpointer) names->WALL_RIGHT_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, (gpointer) names->WALL_LEFT_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, (gpointer) names->WALL_DOWN_KEY.gnomeName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, (gpointer) names->WALL_UP_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.gnomeName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.gnomeName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, (gpointer) names->COMMANDS_COMMAND11.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, (gpointer) names->COMMANDS_COMMAND10.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, (gpointer) names->COMMANDS_COMMAND9.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, (gpointer) names->COMMANDS_COMMAND8.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, (gpointer) names->COMMANDS_COMMAND7.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, (gpointer) names->COMMANDS_COMMAND6.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, (gpointer) names->COMMANDS_COMMAND5.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, (gpointer) names->COMMANDS_COMMAND4.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, (gpointer) names->COMMANDS_COMMAND3.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, (gpointer) names->COMMANDS_COMMAND2.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, (gpointer) names->COMMANDS_COMMAND1.gnomeName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, (gpointer) names->COMMANDS_COMMAND0.gnomeName); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.gnomeName); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.gnomeName); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, (gpointer) names->STATICSWITCHER_PREV_KEY.gnomeName); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, (gpointer) names->STATICSWITCHER_NEXT_KEY.gnomeName); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.gnomeName); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, (gpointer) names->FADE_VISUAL_BELL.gnomeName); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.gnomeName); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, (gpointer) names->CORE_WINDOW_MENU_BUTTON.gnomeName); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, (gpointer) names->RESIZE_INITIATE_BUTTON.gnomeName); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, (gpointer) names->MOVE_INITIATE_BUTTON.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, (gpointer) names->CORE_WINDOW_MENU_KEY.gnomeName); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, (gpointer) names->RESIZE_INITIATE_KEY.gnomeName); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, (gpointer) names->MOVE_INITIATE_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, (gpointer) names->CORE_SHOW_DESKTOP_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, (gpointer) names->CORE_CLOSE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, (gpointer) names->CORE_LOWER_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, (gpointer) names->CORE_RAISE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.gnomeName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_TERMINAL_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.compizName, (gpointer) names->GNOMECOMPAT_MAIN_MENU_KEY.gnomeName); g_hash_table_insert (gnomecompatHashTable, (gpointer) names->GNOMECOMPAT_RUN_KEY.compizName, (gpointer) names->GNOMECOMPAT_RUN_KEY.gnomeName); g_hash_table_insert (unityshellHashTable, (gpointer) names->UNITYSHELL_SHOW_HUD.compizName, (gpointer) names->UNITYSHELL_SHOW_HUD.gnomeName); return masterHashTable; } ./compizconfig/integration/gnome/src/ccs_gnome_integration.c0000644000004100000410000005574513246301623024675 0ustar www-datawww-data/** * * compizconfig gnome integration backend * * gnome-integration.c * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include #include #include #include #include #include "ccs_gnome_integration.h" #include "ccs_gnome_integration_constants.h" #include "ccs_gnome_integrated_setting.h" typedef struct _CCSGNOMEIntegrationBackendPrivate CCGNOMEIntegrationBackendPrivate; struct _CCSGNOMEIntegrationBackendPrivate { CCSBackend *backend; CCSContext *context; CCSIntegratedSettingFactory *factory; CCSIntegratedSettingsStorage *storage; Bool noWrites; }; static CCSSetting * findDisplaySettingForPlugin (CCSContext *context, const char *plugin, const char *setting) { CCSPlugin *p; CCSSetting *s; p = ccsFindPlugin (context, plugin); if (!p) return NULL; s = ccsFindSetting (p, setting); if (!s) return NULL; return s; } static void unregisterAllIntegratedOptions (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (priv->storage) ccsIntegratedSettingsStorageUnref (priv->storage); if (priv->factory) ccsIntegratedSettingFactoryUnref (priv->factory); priv->storage = NULL; priv->factory = NULL; } static void registerAllIntegratedOptions (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); unsigned int i = 0; const CCSGNOMEIntegratedSettingsList *array = ccsGNOMEIntegratedSettingsList (); for (; i < CCS_GNOME_INTEGRATED_SETTINGS_LIST_SIZE; ++i) { CCSIntegratedSetting *setting = ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (priv->factory, integration, array[i].pluginName, array[i].settingName, TypeInt); ccsIntegratedSettingsStorageAddSetting (priv->storage, setting); } } static CCSIntegratedSetting * ccsGNOMEIntegrationBackendGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); CCSIntegratedSettingList integratedSettings = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, pluginName, settingName); if (integratedSettings) { /* At the moment, we only support the first setting out of * the list. Assert the returned size is one */ g_assert (ccsIntegratedSettingListLength (integratedSettings) == 1); CCSIntegratedSetting *integratedSetting = integratedSettings->data; ccsIntegratedSettingListFree (integratedSettings, FALSE); return integratedSetting; } return NULL; } static unsigned int getGnomeMouseButtonModifier (CCSIntegratedSetting *mouseButtonModifierSetting) { unsigned int modMask = 0; CCSSettingType type = TypeString; CCSSettingValue *v = ccsIntegratedSettingReadValue (mouseButtonModifierSetting, type); if (v) { modMask = ccsStringToModifiers (v->value.asString); ccsFreeSettingValueWithType (v, type); } return modMask; } static unsigned int getButtonBindingForSetting (CCSContext *context, const char *plugin, const char *setting) { CCSSetting *s; s = findDisplaySettingForPlugin (context, plugin, setting); if (!s) return 0; if (ccsSettingGetType (s) != TypeButton) return 0; return ccsSettingGetValue (s)->value.asButton.button; } static Bool ccsGNOMEIntegrationBackendReadISAndSetSettingForType (CCSIntegratedSetting *integratedSetting, CCSSetting *setting, CCSSettingValue **v, CCSSettingType sourceType, CCSSettingType destinationType) { *v = ccsIntegratedSettingReadValue (integratedSetting, sourceType); if (*v != NULL && (*v)->value.asString) { /* Conversion to key type option necessary */ if (destinationType == TypeKey) { CCSSettingKeyValue key; memset (&key, 0, sizeof (CCSSettingKeyValue)); if (ccsStringToKeyBinding ((*v)->value.asString, &key)) { /* Since we effectively change the type of the value here * we need to free the old string value */ free ((*v)->value.asString); ccsSetKey (setting, key, TRUE); return TRUE; } else { /* We were not successful at converting strings to keybindings * but we must free the string value anyways as we present * this value to ccsSettingValueFreeWithType as a TypeKey * intentionally made empty */ free ((*v)->value.asString); return FALSE; } } return TRUE; } return FALSE; } static Bool ccsGNOMEIntegrationBackendReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { Bool ret = FALSE; CCSSettingValue *v = NULL; CCSSettingType type = TypeNum; CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (!ccsSettingIsReadableByBackend (setting)) return FALSE; switch (ccsGNOMEIntegratedSettingInfoGetSpecialOptionType ((CCSGNOMEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: { type = TypeInt; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetInt (setting, v->value.asInt, TRUE); ret = TRUE; } break; case OptionBool: { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetBool (setting, v->value.asBool, TRUE); ret = TRUE; } break; case OptionString: { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; char *str = v->value.asString; ccsSetString (setting, str, TRUE); ret = TRUE; } break; case OptionKey: { /* Some backends store keys differently so we need to let the backend know * that we really intend to read a key and let it handle the conversion */ type = TypeKey; if (ccsGNOMEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeKey, type)) ret = TRUE; } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); if (strcmp (settingName, "current_viewport") == 0) { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; Bool showAll = v->value.asBool; ccsSetBool (setting, !showAll, TRUE); ret = TRUE; } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *value = v->value.asString; if (value) { Bool fullscreen; fullscreen = strcmp (value, "fullscreen") == 0; ccsSetBool (setting, fullscreen, TRUE); ret = TRUE; } } else if (strcmp (settingName, "click_to_focus") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *focusMode = v->value.asString; if (focusMode) { Bool clickToFocus = (strcmp (focusMode, "click") == 0); ccsSetBool (setting, clickToFocus, TRUE); ret = TRUE; } } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { /* These are always stored as strings, no matter what the backend is * so the source type should be string */ type = TypeKey; if (ccsGNOMEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeString, type)) ret = TRUE; } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { gboolean resizeWithRightButton; CCSSettingButtonValue button; memset (&button, 0, sizeof (CCSSettingButtonValue)); ccsGetButton (setting, &button); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); button.buttonModMask = getGnomeMouseButtonModifier (mouseModifierSetting->data); CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); type = TypeBool; v = ccsIntegratedSettingReadValue (resizeButtonSetting->data, type); resizeWithRightButton = v->value.asBool; if (strcmp (settingName, "window_menu_button") == 0) button.button = resizeWithRightButton ? 2 : 3; else if (strcmp (pluginName, "resize") == 0) button.button = resizeWithRightButton ? 3 : 2; else button.button = 1; ccsSetButton (setting, button, TRUE); ret = TRUE; /* Free the returned lists */ ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); } } break; default: break; } if (v) ccsFreeSettingValueWithType (v, type); return ret; } static Bool setGnomeMouseButtonModifier (CCSIntegratedSetting *setting, unsigned int modMask) { char *modifiers; CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; modifiers = ccsModifiersToString (modMask); if (!modifiers) { ccsFreeSettingValueWithType (v, TypeString); return FALSE; } v->value.asString = modifiers; ccsIntegratedSettingWriteValue (setting, v, TypeString); ccsFreeSettingValueWithType (v, TypeString); return TRUE; } static void setButtonBindingForSetting (CCSContext *context, const char *plugin, const char *setting, unsigned int button, unsigned int buttonModMask) { CCSSetting *s; s = findDisplaySettingForPlugin (context, plugin, setting); if (!s) return; if (ccsSettingGetType (s) != TypeButton) return; CCSSettingButtonValue value = ccsSettingGetValue (s)->value.asButton; if ((value.button != button) || (value.buttonModMask != buttonModMask)) { value.button = button; value.buttonModMask = buttonModMask; ccsSetButton (s, value, TRUE); } } static Bool ccsGNOMEIntegrationBackendKeyValueToStringValue (CCSSettingValue *keyValue, CCSSettingValue *stringValue) { char *newValue; newValue = ccsKeyBindingToString (&keyValue->value.asKey); if (newValue) { if (strcmp (newValue, "Disabled") == 0) { /* Metacity doesn't like "Disabled", it wants "disabled" */ newValue[0] = 'd'; } stringValue->value.asString = newValue; return TRUE; } return FALSE; } static void ccsGNOMEIntegrationBackendWriteOptionFromSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { GError *err = NULL; CCSSettingType type = TypeNum; CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (priv->noWrites) return; /* Do not allow recursing back into writeIntegratedSetting */ ccsIntegrationDisallowIntegratedWrites (integration); CCSSettingType sType = ccsSettingGetType (setting); CCSSettingInfo *sInfo = ccsSettingGetInfo (setting); CCSSettingValue *vSetting = ccsSettingGetValue (setting); CCSSettingValue *v = ccsCopyValue (vSetting, sType, sInfo); if (!v) return; switch (ccsGNOMEIntegratedSettingInfoGetSpecialOptionType ((CCSGNOMEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeInt); break; case OptionBool: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeBool); break; case OptionString: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeString); break; case OptionKey: { CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (ccsGNOMEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* Really this is a lie - the writer expects a string * but it needs to know if its a key or a string */ type = TypeKey; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } if (newValue) ccsFreeSettingValueWithType (newValue, TypeString); } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (strcmp (settingName, "current_viewport") == 0) { newValue->value.asBool = !v->value.asBool; type = TypeBool; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { const char *newValueString = v->value.asBool ? "fullscreen" : "frame_flash"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "click_to_focus") == 0) { const char *newValueString = v->value.asBool ? "click" : "sloppy"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { if (ccsGNOMEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* These are actually stored as strings in the schemas */ type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { unsigned int modMask; Bool resizeWithRightButton = FALSE; if ((getButtonBindingForSetting (priv->context, "resize", "initiate_button") == 3) || (getButtonBindingForSetting (priv->context, "core", "window_menu_button") == 2)) { resizeWithRightButton = TRUE; } CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); newValue->value.asBool = resizeWithRightButton; type = TypeBool; ccsIntegratedSettingWriteValue (resizeButtonSetting->data, newValue, type); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsGNOMEIntegratedPluginNames.SPECIAL, ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); modMask = v->value.asButton.buttonModMask; if (setGnomeMouseButtonModifier (mouseModifierSetting->data, modMask)) { setButtonBindingForSetting (priv->context, "move", "initiate_button", 1, modMask); setButtonBindingForSetting (priv->context, "resize", "initiate_button", resizeWithRightButton ? 3 : 2, modMask); setButtonBindingForSetting (priv->context, "core", "window_menu_button", resizeWithRightButton ? 2 : 3, modMask); } /* We own the returned lists, so free them */ ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); } if (newValue) ccsFreeSettingValueWithType (newValue, type); } break; } if (err) { ccsError ("%s", err->message); g_error_free (err); } if (v) ccsFreeSettingValueWithType (v, sType); /* we should immediately write changed settings */ ccsWriteChangedSettings (priv->context); ccsIntegrationAllowIntegratedWrites (integration); } static void ccsGNOMEIntegrationBackendUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); Bool needInit = TRUE; CCSIntegratedSettingList iter = integratedSettings; while (iter) { CCSIntegratedSetting *integrated = iter->data; const char *settingName = ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *)integrated); const char *pluginName = ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) integrated); /* Special case for mouse button modifier etc */ if ((strcmp (settingName, "mouse_button_modifier") == 0) || (strcmp (settingName, "resize_with_right_button") == 0)) { CCSSetting *s; if (needInit) { ccsBackendReadInit (priv->backend, priv->context); needInit = FALSE; } s = findDisplaySettingForPlugin (priv->context, "core", "window_menu_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); s = findDisplaySettingForPlugin (priv->context, "move", "initiate_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); s = findDisplaySettingForPlugin (priv->context, "resize", "initiate_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); } else { CCSPlugin *plugin = NULL; plugin = ccsFindPlugin (priv->context, pluginName); if (plugin) { CCSSetting *setting; setting = ccsFindSetting (plugin, settingName); if (setting) { if (needInit) { ccsBackendReadInit (priv->backend, priv->context); needInit = FALSE; } ccsBackendReadSetting (priv->backend, priv->context, setting); } } } iter = iter->next; } } static void ccsGNOMEIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); priv->noWrites = TRUE; } static void ccsGNOMEIntegrationAllowIntegratedWrites (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); priv->noWrites = FALSE; } static void ccsGNOMEIntegrationBackendFree (CCSIntegration *integration) { CCGNOMEIntegrationBackendPrivate *priv = (CCGNOMEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); unregisterAllIntegratedOptions (integration); priv->backend = NULL; ccsObjectFinalize (integration); free (integration); } const CCSIntegrationInterface ccsGNOMEIntegrationBackendInterface = { ccsGNOMEIntegrationBackendGetIntegratedSetting, ccsGNOMEIntegrationBackendReadOptionIntoSetting, ccsGNOMEIntegrationBackendWriteOptionFromSetting, ccsGNOMEIntegrationBackendUpdateIntegratedSettings, ccsGNOMEIntegrationDisallowIntegratedWrites, ccsGNOMEIntegrationAllowIntegratedWrites, ccsGNOMEIntegrationBackendFree }; static CCGNOMEIntegrationBackendPrivate * addPrivate (CCSIntegration *backend, CCSObjectAllocationInterface *ai) { CCGNOMEIntegrationBackendPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCGNOMEIntegrationBackendPrivate)); if (!priv) { ccsObjectFinalize (backend); free (backend); } ccsObjectSetPrivate (backend, (CCSPrivate *) priv); return priv; } static CCSIntegration * ccsGNOMEIntegrationBackendNewCommon (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai) { CCSIntegration *integration = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration)); if (!integration) return NULL; ccsObjectInit (integration, ai); CCGNOMEIntegrationBackendPrivate *priv = addPrivate (integration, ai); priv->backend = backend; priv->context = context; priv->factory = factory; priv->storage = storage; priv->noWrites = FALSE; ccsObjectAddInterface (integration, (const CCSInterface *) &ccsGNOMEIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); ccsIntegrationRef (integration); return integration; } CCSIntegration * ccsGNOMEIntegrationBackendNew (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai) { return ccsGNOMEIntegrationBackendNewCommon (backend, context, factory, storage, ai); } ./compizconfig/integration/gnome/tests/0000755000004100000410000000000013246301623020524 5ustar www-datawww-data./compizconfig/integration/gnome/tests/CMakeLists.txt0000644000004100000410000000401513246301623023264 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_SOURCE_DIR}/tests/shared/glib) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../gsettings/tests) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../gsettings/mocks) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_library (compizconfig_ccs_mock_gnome_integrated_setting_composition ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_mock_gnome_integrated_setting_composition.c) target_link_libraries (compizconfig_ccs_mock_gnome_integrated_setting_composition compizconfig_ccs_integrated_setting_mock compizconfig_gnome_integrated_setting compizconfig) add_executable (compizconfig_test_ccs_gnome_integration ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_gnome_integration.cpp) target_link_libraries (compizconfig_test_ccs_gnome_integration ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_backend_mock compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_list_wrapper compizconfig_ccs_setting_value_operators compizconfig_ccs_setting_value_matcher compizconfig_ccs_integrated_setting_mock compizconfig_ccs_integrated_setting_factory_mock compizconfig_ccs_integrated_setting_storage_mock compizconfig_ccs_mock_gnome_integrated_setting_composition compizconfig_gnome_integration) compiz_discover_tests (compizconfig_test_ccs_gnome_integration COVERAGE compizconfig_gnome_integration compizconfig_gnome_integration_constants) ./compizconfig/integration/gnome/tests/compizconfig_ccs_mock_gnome_integrated_setting_composition.c0000644000004100000410000001736713246301623035011 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_mock_gnome_integrated_setting_composition.h" typedef struct _CCSMockGNOMEIntegratedSettingCompositionPrivate { CCSIntegratedSetting *integratedSetting; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo; CCSIntegratedSettingInfo *integratedSettingInfo; } CCSMockGNOMEIntegratedSettingCompositionPrivate; static CCSIntegratedSetting * allocateCCSIntegratedSetting (CCSObjectAllocationInterface *allocator) { CCSIntegratedSetting *setting = (*allocator->calloc_) (allocator->allocator, 1, sizeof (CCSIntegratedSetting)); ccsObjectInit (setting, allocator); return setting; } static CCSMockGNOMEIntegratedSettingCompositionPrivate * allocatePrivate (CCSIntegratedSetting *integratedSetting, CCSObjectAllocationInterface *allocator) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = (*allocator->calloc_) (allocator->allocator, 1, sizeof (CCSMockGNOMEIntegratedSettingCompositionPrivate)); if (!priv) { ccsObjectFinalize (integratedSetting); (*allocator->free_) (allocator->allocator, integratedSetting); return NULL; } return priv; } static SpecialOptionType ccsMockCompositionIntegratedSettingGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (priv->gnomeIntegratedSettingInfo); } static const char * ccsMockCompositionIntegratedSettingGetGNOMEName (CCSGNOMEIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsGNOMEIntegratedSettingInfoGetGNOMEName (priv->gnomeIntegratedSettingInfo); } static CCSSettingValue * ccsMockCompositionIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingReadValue (priv->integratedSetting, type); } static void ccsMockCompositionIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); ccsIntegratedSettingWriteValue (priv->integratedSetting, v, type); } static const char * ccsMockCompositionIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoPluginName (priv->integratedSettingInfo); } static const char * ccsMockCompositionIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoSettingName (priv->integratedSettingInfo); } static CCSSettingType ccsMockCompositionIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoGetType (priv->integratedSettingInfo); } static void ccsMockCompositionIntegratedSettingFree (CCSIntegratedSetting *integratedSetting) { CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockGNOMEIntegratedSettingCompositionPrivate, integratedSetting); ccsIntegratedSettingUnref (priv->integratedSetting); ccsGNOMEIntegratedSettingInfoUnref (priv->gnomeIntegratedSettingInfo); ccsObjectFinalize (integratedSetting); (*integratedSetting->object.object_allocation->free_) (integratedSetting->object.object_allocation->allocator, integratedSetting); } static void ccsMockCompositionIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { return ccsMockCompositionIntegratedSettingFree ((CCSIntegratedSetting *) info); } static void ccsMockCompositionGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { return ccsMockCompositionIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSGNOMEIntegratedSettingInfoInterface ccsMockCompositionGNOMEIntegratedSettingInfo = { ccsMockCompositionIntegratedSettingGetSpecialOptionType, ccsMockCompositionIntegratedSettingGetGNOMEName, ccsMockCompositionGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsMockCompositionIntegratedSetting = { ccsMockCompositionIntegratedSettingReadValue, ccsMockCompositionIntegratedSettingWriteValue, ccsMockCompositionIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsMockCompositionIntegratedSettingInfo = { ccsMockCompositionIntegratedSettingInfoPluginName, ccsMockCompositionIntegratedSettingInfoSettingName, ccsMockCompositionIntegratedSettingInfoGetType, ccsMockCompositionIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsMockCompositionIntegratedSettingNew (CCSIntegratedSetting *integratedSetting, CCSGNOMEIntegratedSettingInfo *gnomeInfo, CCSIntegratedSettingInfo *settingInfo, CCSObjectAllocationInterface *allocator) { CCSIntegratedSetting *composition = allocateCCSIntegratedSetting (allocator); if (!composition) return NULL; CCSMockGNOMEIntegratedSettingCompositionPrivate *priv = allocatePrivate (composition, allocator); if (!priv) return NULL; const CCSInterface *integratedSettingImpl = (const CCSInterface *) (&ccsMockCompositionIntegratedSetting); const CCSInterface *integratedSettingInfoImpl = (const CCSInterface *) (&ccsMockCompositionIntegratedSettingInfo); const CCSInterface *gnomeSettingImpl = (const CCSInterface *) (&ccsMockCompositionGNOMEIntegratedSettingInfo); priv->integratedSetting = integratedSetting; priv->gnomeIntegratedSettingInfo = gnomeInfo; priv->integratedSettingInfo = settingInfo; ccsIntegratedSettingRef (priv->integratedSetting); ccsGNOMEIntegratedSettingInfoRef (priv->gnomeIntegratedSettingInfo); ccsObjectSetPrivate (composition, (CCSPrivate *) (priv)); ccsObjectAddInterface (composition, integratedSettingImpl, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (composition, integratedSettingInfoImpl, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (composition, gnomeSettingImpl, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsObjectRef (composition); return composition; } ./compizconfig/integration/gnome/tests/compizconfig_ccs_mock_gnome_integrated_setting_composition.h0000644000004100000410000000261413246301623035003 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_MOCK_GNOME_INTEGRATED_SETTING_COMPOSITION_H #define _COMPIZCONFIG_CCS_MOCK_GNOME_INTEGRATED_SETTING_COMPOSITION_H #include #include #include COMPIZCONFIG_BEGIN_DECLS CCSIntegratedSetting * ccsMockCompositionIntegratedSettingNew (CCSIntegratedSetting *integratedSetting, CCSGNOMEIntegratedSettingInfo *gnomeInfo, CCSIntegratedSettingInfo *settingInfo, CCSObjectAllocationInterface *allocator); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/tests/compizconfig_test_ccs_gnome_integration.cpp0000644000004100000410000011265713246301623031412 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "compizconfig_ccs_mock_gnome_integrated_setting_composition.h" #include "compizconfig_ccs_setting_value_matcher.h" namespace cc = compiz::config; namespace cci = compiz::config::impl; using ::testing::Pointee; using ::testing::Eq; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; using ::testing::DoAll; using ::testing::Values; using ::testing::WithParamInterface; using ::testing::_; namespace { typedef std::tr1::tuple > IntegratedSettingWithMock; typedef boost::shared_ptr IntegratedSettingWithMockPtr; IntegratedSettingWithMockPtr createIntegratedSettingCompositionFromMock (const std::string &plugin, const std::string &setting, CCSSettingType type, SpecialOptionType gnomeType, const std::string &gnomeName, CCSObjectAllocationInterface *allocator) { CCSIntegratedSettingInfo *integratedSettingInfo = ccsSharedIntegratedSettingInfoNew (plugin.c_str (), setting.c_str (), type, allocator); /* This takes ownership of integratedSettingInfo */ CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo = ccsGNOMEIntegratedSettingInfoNew (integratedSettingInfo, gnomeType, gnomeName.c_str (), allocator); CCSIntegratedSetting *integratedSetting = ccsMockIntegratedSettingNew (allocator); CCSIntegratedSettingGMock *mockPtr = GET_PRIVATE (CCSIntegratedSettingGMock, integratedSetting) CCSIntegratedSettingGMock &mock (*mockPtr); boost::shared_ptr composition = AutoDestroy (ccsMockCompositionIntegratedSettingNew (integratedSetting, gnomeIntegratedSettingInfo, integratedSettingInfo, allocator), ccsIntegratedSettingUnref); /* We want the composition to take ownership here, so unref the * original members of the composition */ ccsGNOMEIntegratedSettingInfoUnref (gnomeIntegratedSettingInfo); ccsIntegratedSettingUnref (integratedSetting); return boost::make_shared (mock, composition); } CCSIntegratedSettingGMock & Mock (IntegratedSettingWithMock &integratedSettingWithMocks) { return std::tr1::get <0> (integratedSettingWithMocks); } CCSIntegratedSetting * Real (IntegratedSettingWithMock &integratedSettingWithMocks) { return std::tr1::get <1> (integratedSettingWithMocks).get (); } typedef std::tr1::tuple , boost::shared_ptr , CCSIntegratedSettingsStorage *, CCSIntegratedSettingFactory *, boost::shared_ptr > CCSGNOMEIntegrationWithMocks; CCSGNOMEIntegrationWithMocks createIntegrationWithMocks (CCSObjectAllocationInterface *ai) { boost::shared_ptr context (AutoDestroy (ccsMockContextNew (), ccsFreeContext)); boost::shared_ptr backend (AutoDestroy (ccsMockBackendNew (), ccsFreeMockBackend)); /* The GNOME Integration backend takes ownership of these two */ CCSIntegratedSettingsStorage *storage (ccsMockIntegratedSettingsStorageNew (ai)); CCSIntegratedSettingFactory *factory (ccsMockIntegratedSettingFactoryNew (ai)); boost::shared_ptr integration (AutoDestroy (ccsGNOMEIntegrationBackendNew (backend.get (), context.get (), factory, storage, ai), ccsIntegrationUnref)); CCSContextGMock &gmockContext = *(reinterpret_cast (ccsObjectGetPrivate (context.get ()))); CCSBackendGMock &gmockBackend = *(reinterpret_cast (ccsObjectGetPrivate (backend.get ()))); CCSIntegratedSettingsStorageGMock &gmockStorage = *(reinterpret_cast (ccsObjectGetPrivate (storage))); CCSIntegratedSettingFactoryGMock &gmockFactory = *(reinterpret_cast (ccsObjectGetPrivate (factory))); return CCSGNOMEIntegrationWithMocks (gmockContext, gmockBackend, gmockStorage, gmockFactory, context, backend, storage, factory, integration); } CCSIntegration * Real (CCSGNOMEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <8> (integrationWithMocks).get (); } CCSContextGMock & MockContext (CCSGNOMEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <0> (integrationWithMocks); } CCSIntegratedSettingsStorageGMock & MockStorage (CCSGNOMEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <2> (integrationWithMocks); } void IgnoreRegistration (CCSIntegratedSettingsStorageGMock &storage) { EXPECT_CALL (storage, empty ()).WillOnce (Return (FALSE)); } void AllowReadability (CCSSettingGMock &setting) { EXPECT_CALL (setting, isReadableByBackend ()).WillOnce (Return (TRUE)); } void ExpectWriteSettings (CCSContextGMock &context) { EXPECT_CALL (context, writeChangedSettings ()); } void SetNames (CCSSettingGMock &setting, CCSPluginGMock &plugin, const std::string &settingName, const std::string &pluginName) { EXPECT_CALL (setting, getName ()).WillOnce (Return (settingName.c_str ())); EXPECT_CALL (setting, getParent ()); EXPECT_CALL (plugin, getName ()).WillOnce (Return (pluginName.c_str ())); } void SetTypeInfo (CCSSettingGMock &setting, CCSSettingType type, CCSSettingInfo *info) { EXPECT_CALL (setting, getType ()).WillOnce (Return (type)); EXPECT_CALL (setting, getInfo ()).WillOnce (Return (info)); } CCSSettingValue * MakeSettingValue () { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->parent = NULL; v->isListChild = FALSE; v->refCount = 1; return v; } boost::shared_ptr MakeAutoDestroySettingValue (CCSSettingType type) { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->parent = NULL; v->isListChild = FALSE; v->refCount = 1; return boost::shared_ptr (v, boost::bind (ccsFreeSettingValueWithType, _1, type)); } const std::string MOCK_PLUGIN ("mock"); const std::string MOCK_SETTING ("mock"); const std::string MOCK_GNOME_NAME ("mock"); const CCSSettingType MOCK_SETTING_TYPE = TypeInt; const SpecialOptionType MOCK_GNOME_SETTING_TYPE = OptionInt; } TEST (CCSGNOMEIntegrationTest, TestConstructComposition) { IntegratedSettingWithMockPtr settingWithMock ( createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, MOCK_SETTING_TYPE, MOCK_GNOME_SETTING_TYPE, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator)); } class CCSGNOMEIntegrationTestWithMocks : public ::testing::Test { public: CCSGNOMEIntegrationTestWithMocks () : mIntegration (createIntegrationWithMocks (&ccsDefaultObjectAllocator)), mSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), mSettingMock ((*(reinterpret_cast (ccsObjectGetPrivate (mSetting.get ()))))), mIntegratedSetting (), mPlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), mPluginMock ((*(reinterpret_cast (ccsObjectGetPrivate (mPlugin.get ()))))) { ON_CALL (mSettingMock, getParent ()).WillByDefault (Return (mPlugin.get ())); } protected: CCSGNOMEIntegrationWithMocks mIntegration; boost::shared_ptr mSetting; CCSSettingGMock &mSettingMock; IntegratedSettingWithMockPtr mIntegratedSetting; boost::shared_ptr mPlugin; CCSPluginGMock &mPluginMock; }; class CCSGNOMEIntegrationTestReadIntegrated : public CCSGNOMEIntegrationTestWithMocks { public: virtual void SetUp () { IgnoreRegistration (MockStorage (mIntegration)); AllowReadability (mSettingMock); } }; class CCSGNOMEIntegrationTestWriteIntegrated : public CCSGNOMEIntegrationTestWithMocks { public: virtual void SetUp () { IgnoreRegistration (MockStorage (mIntegration)); ExpectWriteSettings (MockContext (mIntegration)); } }; TEST_F (CCSGNOMEIntegrationTestWithMocks, TestConstructGNOMEIntegration) { } TEST_F (CCSGNOMEIntegrationTestWithMocks, TestGetIntegratedSettingFromStorage) { mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); CCSIntegratedSettingList returnIntegratedSettings = ccsIntegratedSettingListAppend (NULL, Real (*mIntegratedSetting)); CCSIntegratedSettingsStorageGMock &mockStorage (MockStorage (mIntegration)); EXPECT_CALL (mockStorage, empty ()).WillOnce (Return (FALSE)); EXPECT_CALL (mockStorage, findMatchingSettingsByPluginAndSettingName (Eq (MOCK_PLUGIN), Eq (MOCK_SETTING))) .WillOnce (Return (returnIntegratedSettings)); EXPECT_EQ (Real (*mIntegratedSetting), ccsIntegrationGetIntegratedSetting (Real (mIntegration), MOCK_PLUGIN.c_str (), MOCK_SETTING.c_str ())); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInKeyOption) { CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("a"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, TypeKey, OptionKey, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); CCSSettingKeyValue keyValue; ASSERT_TRUE (ccsStringToKeyBinding (v->value.asString, &keyValue)); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeKey)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setKey (Eq (keyValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInSpecialOptionCurrentViewport) { const std::string settingName ("current_viewport"); CCSSettingValue *v = MakeSettingValue (); v->value.asBool = FALSE; mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeBool)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInSpecialOptionFullscreenVisualBell) { const std::string settingName ("fullscreen_visual_bell"); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("fullscreen"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestReadIntegrated, TestReadInSpecialOptionClickToFocus) { const std::string settingName ("click_to_focus"); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("click"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } namespace { struct IntegratedMediaKeysParam { public: IntegratedMediaKeysParam (const std::string &settingName, const std::string &integratedName, const std::string &keyValueString) : settingName (settingName), integratedName (integratedName), keyValueString (keyValueString) { EXPECT_TRUE (ccsStringToKeyBinding (keyValueString.c_str (), &keyValue)); } const std::string settingName; const std::string integratedName; const std::string keyValueString; CCSSettingKeyValue keyValue; }; } namespace { std::string RUN_COMMAND_SCREENSHOT_KEY ("run_command_screenshot_key"); std::string SCREENSHOT ("screenshot"); std::string SCREENSHOT_BINDING ("Print"); std::string RUN_COMMAND_WINDOW_SCREENSHOT_KEY ("run_command_window_screenshot_key"); std::string WINDOW_SCREENSHOT ("window_screenshot"); std::string WINDOW_SCREENSHOT_BINDING ("Print"); std::string RUN_COMMAND_TERMINAL_KEY ("run_command_terminal_key"); std::string TERMINAL ("terminal"); std::string TERMINAL_BINDING ("t"); } class CCSGNOMEIntegrationTestReadIntegratedMediaKeys : public CCSGNOMEIntegrationTestReadIntegrated, public WithParamInterface { }; TEST_P (CCSGNOMEIntegrationTestReadIntegratedMediaKeys, TestReadIntegratedMediaKey) { const std::string settingName (GetParam ().settingName); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup (GetParam ().keyValueString.c_str ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setKey (Eq (GetParam ().keyValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } INSTANTIATE_TEST_CASE_P (CCSGNOMEMediaKeys, CCSGNOMEIntegrationTestReadIntegratedMediaKeys, Values (IntegratedMediaKeysParam (RUN_COMMAND_SCREENSHOT_KEY, SCREENSHOT, SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_WINDOW_SCREENSHOT_KEY, WINDOW_SCREENSHOT, WINDOW_SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_TERMINAL_KEY, TERMINAL, TERMINAL_BINDING))); namespace { const std::string DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING (""); const std::string GNOME_MOUSE_BUTTON_MODIFIERS_STRING (""); const unsigned int DEFAULT_MOUSE_BUTTON_MODIFIERS = ccsStringToModifiers (DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); const unsigned int GNOME_MOUSE_BUTTON_MODIFIERS = ccsStringToModifiers (GNOME_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); const unsigned int LEFT_BUTTON = 1; const unsigned int MIDDLE_BUTTON = 2; const unsigned int RIGHT_BUTTON = 3; } class CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: virtual ~CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers () {} CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers () : mIntegratedSettingMBM (AutoDestroy (ccsMockIntegratedSettingNew (&ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)), mIntegratedSettingMBMMock (*(reinterpret_cast (ccsObjectGetPrivate (mIntegratedSettingMBM.get ())))), mIntegratedSettingResizeWithRB (AutoDestroy (ccsMockIntegratedSettingNew (&ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)), mIntegratedSettingResizeWithRBMock (*(reinterpret_cast (ccsObjectGetPrivate (mIntegratedSettingResizeWithRB.get ())))) { memset (&mButtonValue, 0, sizeof (CCSSettingButtonValue)); mButtonValue.button = MIDDLE_BUTTON; mButtonValue.buttonModMask = DEFAULT_MOUSE_BUTTON_MODIFIERS; mButtonValue.edgeMask = 0; } virtual void GnomeSetUp (CCSGNOMEIntegrationWithMocks &integration) { /* Create new lists as we expect the caller to free them once it * has retreived them */ CCSIntegratedSettingList integratedSettingsMBM = ccsIntegratedSettingListAppend (NULL, mIntegratedSettingMBM.get ()); CCSIntegratedSettingList integratedSettingsResizeWithRB = ccsIntegratedSettingListAppend (NULL, mIntegratedSettingResizeWithRB.get ()); EXPECT_CALL (MockStorage (integration), findMatchingSettingsByPluginAndSettingName (Eq (std::string (ccsGNOMEIntegratedPluginNames.SPECIAL)), Eq (std::string (ccsGNOMEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName)))) .WillOnce (Return (integratedSettingsMBM)); EXPECT_CALL (MockStorage (integration), findMatchingSettingsByPluginAndSettingName (Eq (std::string (ccsGNOMEIntegratedPluginNames.SPECIAL)), Eq (std::string (ccsGNOMEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName)))) .WillOnce (Return (integratedSettingsResizeWithRB)); } protected: boost::shared_ptr mIntegratedSettingMBM; CCSIntegratedSettingGMock &mIntegratedSettingMBMMock; boost::shared_ptr mIntegratedSettingResizeWithRB; CCSIntegratedSettingGMock &mIntegratedSettingResizeWithRBMock; CCSSettingButtonValue mButtonValue; }; class CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers : public CCSGNOMEIntegrationTestReadIntegrated, public CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: virtual void SetUp () { CCSSettingValue *vRB = MakeSettingValue (); CCSSettingValue *vMBM = MakeSettingValue (); vRB->value.asBool = TRUE; vMBM->value.asString = strdup (GNOME_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); CCSGNOMEIntegrationTestReadIntegrated::SetUp (); CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers::GnomeSetUp (mIntegration); EXPECT_CALL (mSettingMock, getButton (_)) .WillOnce (DoAll ( SetArgPointee <0> ( mButtonValue), Return (TRUE))); /* Get the GNOME Mouse button modifier */ EXPECT_CALL (mIntegratedSettingMBMMock, readValue (TypeString)).WillOnce (Return (vMBM)); EXPECT_CALL (mIntegratedSettingResizeWithRBMock, readValue (TypeBool)).WillOnce (Return (vRB)); } }; class CCSGNOMEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers : public CCSGNOMEIntegrationTestWriteIntegrated, public CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: CCSGNOMEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers () : corePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), corePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (corePlugin.get ())))), resizePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), resizePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (resizePlugin.get ())))), movePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), movePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (movePlugin.get ())))), resizeInitiateButtonSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), resizeInitiateButtonSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (resizeInitiateButtonSetting.get ())))), moveInitiateButtonSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), moveInitiateButtonSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (moveInitiateButtonSetting.get ())))), coreWindowMenuSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), coreWindowMenuSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (coreWindowMenuSetting.get ())))), resizeInitiateButton (MakeAutoDestroySettingValue (TypeButton)), moveInitiateButton (MakeAutoDestroySettingValue (TypeButton)), coreWindowMenuButton (MakeAutoDestroySettingValue (TypeButton)) { resizeInitiateButton->value.asButton.button = LEFT_BUTTON; resizeInitiateButton->value.asButton.buttonModMask = 0; resizeInitiateButton->value.asButton.edgeMask = 0; moveInitiateButton->value.asButton.button = LEFT_BUTTON; moveInitiateButton->value.asButton.buttonModMask = DEFAULT_MOUSE_BUTTON_MODIFIERS; moveInitiateButton->value.asButton.edgeMask = 0; coreWindowMenuButton->value.asButton.button = MIDDLE_BUTTON; coreWindowMenuButton->value.asButton.buttonModMask = 0; coreWindowMenuButton->value.asButton.edgeMask = 0; } virtual void SetUp () { CCSGNOMEIntegrationTestWriteIntegrated::SetUp (); CCSGNOMEIntegrationTestWithMocksIntegratedMouseButtonModifiers::GnomeSetUp (mIntegration); } protected: boost::shared_ptr corePlugin; CCSPluginGMock &corePluginMock; boost::shared_ptr resizePlugin; CCSPluginGMock &resizePluginMock; boost::shared_ptr movePlugin; CCSPluginGMock &movePluginMock; boost::shared_ptr resizeInitiateButtonSetting; CCSSettingGMock &resizeInitiateButtonSettingMock; boost::shared_ptr moveInitiateButtonSetting; CCSSettingGMock &moveInitiateButtonSettingMock; boost::shared_ptr coreWindowMenuSetting; CCSSettingGMock &coreWindowMenuSettingMock; boost::shared_ptr resizeInitiateButton; boost::shared_ptr moveInitiateButton; boost::shared_ptr coreWindowMenuButton; }; TEST_F (CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionMoveInitiateButton) { const std::string settingName ("initiate_button"); const std::string pluginName ("move"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = LEFT_BUTTON; newButtonValue.buttonModMask = GNOME_MOUSE_BUTTON_MODIFIERS; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionResizeInitiateButton) { const std::string settingName ("initiate_button"); const std::string pluginName ("resize"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = RIGHT_BUTTON; newButtonValue.buttonModMask = GNOME_MOUSE_BUTTON_MODIFIERS; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionWhereIntegratedOptionReturnsNull) { const std::string settingName ("initiate_button"); const std::string pluginName ("move"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = LEFT_BUTTON; /* Reading the gnome mouse button modifiers failed, so default to zero */ newButtonValue.buttonModMask = 0; /* Clear the old expectation */ ccsFreeSettingValueWithType (ccsIntegratedSettingReadValue (mIntegratedSettingMBM.get (), TypeString), TypeString); /* Now return null */ EXPECT_CALL (mIntegratedSettingMBMMock, readValue (TypeString)).WillOnce (ReturnNull ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSGNOMEIntegrationTestWriteIntegrated, TestWriteCurrentViewport) { const std::string settingName ("current_viewport"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeBool)); CCSSettingInfo info; compizValue->value.asBool = TRUE; gnomeValue->value.asBool = FALSE; mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeBool, &info)), TypeBool)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } TEST_F (CCSGNOMEIntegrationTestWriteIntegrated, TestWriteFullscreenVisualBell) { const std::string settingName ("fullscreen_visual_bell"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asBool = TRUE; gnomeValue->value.asString = strdup ("fullscreen"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } TEST_F (CCSGNOMEIntegrationTestWriteIntegrated, TestWriteClickToFocus) { const std::string settingName ("click_to_focus"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asBool = TRUE; gnomeValue->value.asString = strdup ("click"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } class CCSGNOMEIntegrationTestWriteIntegratedMediaKeys : public CCSGNOMEIntegrationTestWriteIntegrated, public WithParamInterface { }; TEST_P (CCSGNOMEIntegrationTestWriteIntegratedMediaKeys, TestWriteIntegratedMediaKey) { const std::string settingName (GetParam ().settingName); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeKey)); boost::shared_ptr gnomeValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asKey = GetParam ().keyValue; gnomeValue->value.asString = strdup (GetParam ().keyValueString.c_str ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeKey, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*gnomeValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } INSTANTIATE_TEST_CASE_P (CCSGNOMEMediaKeys, CCSGNOMEIntegrationTestWriteIntegratedMediaKeys, Values (IntegratedMediaKeysParam (RUN_COMMAND_SCREENSHOT_KEY, SCREENSHOT, SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_WINDOW_SCREENSHOT_KEY, WINDOW_SCREENSHOT, WINDOW_SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_TERMINAL_KEY, TERMINAL, TERMINAL_BINDING))); /* * TODO: Break up the function that this test covers. Its way too complicated */ TEST_F (CCSGNOMEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers, TestWriteMouseButtonModifier) { const std::string moveSettingName ("initiate_button"); const std::string movePluginName ("move"); const std::string resizeSettingName ("initiate_button"); const std::string resizePluginName ("resize"); const std::string coreSettingName ("window_menu_button"); const std::string corePluginName ("core"); const std::string settingName (moveSettingName); const std::string pluginName (movePluginName); CCSSettingInfo info; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_GNOME_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); SetTypeInfo (mSettingMock, TypeButton, &info); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (movePluginName))).WillRepeatedly (Return (movePlugin.get ())); EXPECT_CALL (movePluginMock, findSetting (Eq (moveSettingName))).WillRepeatedly (Return (moveInitiateButtonSetting.get ())); EXPECT_CALL (moveInitiateButtonSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (moveInitiateButtonSettingMock, getValue ()).WillRepeatedly (Return (moveInitiateButton.get ())); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (resizePluginName))).WillRepeatedly (Return (resizePlugin.get ())); EXPECT_CALL (resizePluginMock, findSetting (Eq (resizeSettingName))).WillRepeatedly (Return (resizeInitiateButtonSetting.get ())); EXPECT_CALL (resizeInitiateButtonSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (resizeInitiateButtonSettingMock, getValue ()).WillRepeatedly (Return (resizeInitiateButton.get ())); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (corePluginName))).WillRepeatedly (Return (corePlugin.get ())); EXPECT_CALL (corePluginMock, findSetting (Eq (coreSettingName))).WillRepeatedly (Return (coreWindowMenuSetting.get ())); EXPECT_CALL (coreWindowMenuSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (coreWindowMenuSettingMock, getValue ()).WillRepeatedly (Return (coreWindowMenuButton.get ())); boost::shared_ptr newResizeWithRBValue (MakeAutoDestroySettingValue (TypeBool)); newResizeWithRBValue->value.asBool = TRUE; EXPECT_CALL (mIntegratedSettingResizeWithRBMock, writeValue (Pointee (SettingValueMatch (*newResizeWithRBValue, TypeBool, &info)), TypeBool)); boost::shared_ptr newMBMValue (MakeAutoDestroySettingValue (TypeString)); newMBMValue->value.asString = strdup (DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (moveInitiateButton.get ())); EXPECT_CALL (mIntegratedSettingMBMMock, writeValue (Pointee (SettingValueMatch (*newMBMValue, TypeString, &info)), TypeString)); unsigned int modifiers = moveInitiateButton->value.asButton.buttonModMask; CCSSettingButtonValue newResizeInitiateButton; CCSSettingButtonValue newMoveInitiateButton; CCSSettingButtonValue newWindowMenuButton; memset (&newResizeInitiateButton, 0, sizeof (CCSSettingButtonValue)); memset (&newMoveInitiateButton, 0, sizeof (CCSSettingButtonValue)); memset (&newWindowMenuButton, 0, sizeof (CCSSettingButtonValue)); newResizeInitiateButton.button = RIGHT_BUTTON; newResizeInitiateButton.buttonModMask = modifiers; newMoveInitiateButton.button = LEFT_BUTTON; newMoveInitiateButton.buttonModMask = modifiers; newWindowMenuButton.button = MIDDLE_BUTTON; newWindowMenuButton.buttonModMask = modifiers; EXPECT_CALL (resizeInitiateButtonSettingMock, setButton (Eq (newResizeInitiateButton), IsTrue ())); /* The move button is exactly the same, so it is not updated */ EXPECT_CALL (moveInitiateButtonSettingMock, setButton (Eq (newMoveInitiateButton), IsTrue ())).Times (0); EXPECT_CALL (coreWindowMenuSettingMock, setButton (Eq (newWindowMenuButton), IsTrue ())); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } ./compizconfig/integration/gnome/gsettings/0000755000004100000410000000000013246301623021371 5ustar www-datawww-data./compizconfig/integration/gnome/gsettings/CMakeLists.txt0000644000004100000410000000704613246301623024140 0ustar www-datawww-datainclude (FindPkgConfig) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) compiz_pkg_check_modules (COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION ${_deps}) if (COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_FOUND) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/gsettings/gsettings_backend_shared ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gsettings/include ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${CMAKE_BINARY_DIR}/compizconfig/gsettings/gsettings_backend_shared ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_gnome_integration_gsettings_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gsettings_integrated_setting.c) target_link_libraries (compizconfig_gnome_integration_gsettings_integrated_setting compizconfig_gnome_integrated_setting compizconfig_gnome_integration_constants compizconfig compizconfig_gsettings_util ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integration_gsettings_setting_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gsettings_integrated_setting_factory.c) target_link_libraries (compizconfig_gnome_integration_gsettings_setting_factory compizconfig_gsettings_wrapper_factory_interface compizconfig_gnome_integration_constants compizconfig_gnome_integrated_setting compizconfig_gnome_integration_gsettings_integrated_setting compizconfig compizconfig_gsettings_util ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARIES}) add_library (compizconfig_gnome_integration_gsettings_wrapper_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_gnome_integration_gsettings_wrapper_factory.c) target_link_libraries (compizconfig_gnome_integration_gsettings_setting_factory compizconfig_gsettings_wrapper_factory_interface compizconfig ${COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_LIBRARIES}) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) if (GLIB_COMPILE_SCHEMAS) set (_integrated_gschema org.compiz.integrated) set (_integrated_gschema_file ${_integrated_gschema}.gschema.xml) set (_integrated_gschema_src ${CMAKE_CURRENT_SOURCE_DIR}/${_integrated_gschema_file}) set (_integrated_gschema_dest ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_integrated_gschema_file}) configure_file (${_integrated_gschema_src} ${_integrated_gschema_dest}) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/glib-2.0/schemas/gschemas.compiled COMMAND ${GLIB_COMPILE_SCHEMAS} --targetdir=${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ) add_custom_target (compiz_gsettings_integrated_settings_schema ALL DEPENDS ${_integrated_gschema_src}) add_gsettings_schema_to_recompilation_list (compiz_gsettings_integrated_settings_schema) compiz_install_gsettings_schema (${_integrated_gschema_dest} ${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas) endif (GLIB_COMPILE_SCHEMAS) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (COMPIZCONFIG_GNOME_GSETTINGS_INTEGRATION_FOUND) ./compizconfig/integration/gnome/gsettings/include/0000755000004100000410000000000013246301623023014 5ustar www-datawww-data././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootroot./compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_integrated_setting_factory.h./compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_integrated_settin0000644000004100000410000000252213246301623035163 0ustar www-datawww-data#ifndef _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_FACTORY_H #define _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_FACTORY_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS * @param key the old style gnome key to translate * @return new-style key. Caller should free * * This translates new style keys (eg foo-bar) to old style keys * foo_bar and special cases a few keys */ char * ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (const char *key); /** * @brief ccsGSettingsIntegratedSettingsChangeCallback * @return callback for settings change data * * This returns the default callback used for settings changes * * TODO: This API doesn't make a whole lot of sense, but we need * it if we want to inject CCSGSettingsWrapperFactory into * ccsGSettingsIntegratedSettingFactoryNew. * * The return type is GCallback to hide the details of this function * from callers */ GCallback ccsGSettingsIntegratedSettingsChangeCallback (); CCSIntegratedSettingFactory * ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory *wrapperFactory, CCSGNOMEValueChangeData *data, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootroot./compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_integrated_setting.h./compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_integrated_settin0000644000004100000410000000210713246301623035162 0ustar www-datawww-data#ifndef _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_H #define _CCS_GNOME_GSETTINGS_INTEGRATED_SETTING_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGSettingsIntegratedSettingNew * @param base * @param wrapper * @param ai * @return * * The GSettings implementation of CCSIntegratedSetting *, which will * write using a CCSGSettingsWrapper * object when the read and write * methods are called. */ CCSIntegratedSetting * ccsGSettingsIntegratedSettingNew (CCSGNOMEIntegratedSettingInfo *base, CCSGSettingsWrapper *wrapper, CCSObjectAllocationInterface *ai); /** * @brief ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings * @param key the old style gnome key to translate * @return new-style key. Caller should free * * This translates old style keys (eg foo_bar) to new style keys * foo-bar and special cases a few keys */ char * ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (const char *key); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/gsettings/include/ccs_gnome_integration_gsettings_wrapper_factory.h0000644000004100000410000000237013246301623035105 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_GNOME_INTEGRATION_GSETTINGS_WRAPPER_FACTORY_H #define _CCS_GNOME_INTEGRATION_GSETTINGS_WRAPPER_FACTORY_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include CCSGSettingsWrapperFactory * ccsGNOMEIntegrationGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai, CCSGSettingsWrapperFactory *factory, GCallback callback, CCSGNOMEValueChangeData *data); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/gnome/gsettings/org.compiz.integrated.gschema.xml0000644000004100000410000000475313246301623027746 0ustar www-datawww-data true "gnome-screenshot -w" "gnome-screenshot" ["<Control><Alt>Delete"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] ["Disabled"] "/usr/bin/gnome-system-monitor -p" "" "" "" "" "" "" "" "" "" "" "" "" ["<Alt>"] ./compizconfig/integration/gnome/gsettings/src/0000755000004100000410000000000013246301623022160 5ustar www-datawww-data./compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_wrapper_factory.c0000644000004100000410000001161113246301623034242 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gnome_integration_gsettings_wrapper_factory.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gnome_integration_gsettings_wrapper_factory.h" /* CCSGSettingsWrapperFactory implementation */ typedef struct _CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate; struct _CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate { CCSGSettingsWrapperFactory *wrapperFactory; GCallback callback; /* This is expected to stay alive during the * lifetime of this object */ CCSGNOMEValueChangeData *data; }; static void ccsGNOMEIntegrationGSettingsWrapperFree (CCSGSettingsWrapperFactory *wrapperFactory) { CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate, wrapperFactory); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); ccsObjectFinalize (wrapperFactory); (*wrapperFactory->object.object_allocation->free_) (wrapperFactory->object.object_allocation->allocator, wrapperFactory); } static void connectWrapperToChangedSignal (CCSGSettingsWrapper *wrapper, CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv) { ccsGSettingsWrapperConnectToChangedSignal (wrapper, priv->callback, priv->data); } static CCSGSettingsWrapper * ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate, factory); CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperFactoryNewGSettingsWrapper (priv->wrapperFactory, schemaName, factory->object.object_allocation); if (wrapper != NULL) connectWrapperToChangedSignal (wrapper, priv); return wrapper; } static CCSGSettingsWrapper * ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate, factory); CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (priv->wrapperFactory, schemaName, path, factory->object.object_allocation); connectWrapperToChangedSignal (wrapper, priv); return wrapper; } const CCSGSettingsWrapperFactoryInterface ccsGNOMEIntegrationGSettingsWrapperFactoryInterface = { ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper, ccsGNOMEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperWithPath, ccsGNOMEIntegrationGSettingsWrapperFree }; CCSGSettingsWrapperFactory * ccsGNOMEIntegrationGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai, CCSGSettingsWrapperFactory *factory, GCallback callback, CCSGNOMEValueChangeData *data) { CCSGSettingsWrapperFactory *wrapperFactory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapperFactory) return NULL; CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGNOMEIntegrationGSettingsWrapperFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, wrapperFactory); return NULL; } ccsGSettingsWrapperFactoryRef (factory); priv->wrapperFactory = factory; priv->callback = callback; priv->data = data; ccsObjectInit (wrapperFactory, ai); ccsObjectAddInterface (wrapperFactory, (const CCSInterface *) &ccsGNOMEIntegrationGSettingsWrapperFactoryInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapperFactory, (CCSPrivate *) priv); ccsGSettingsWrapperFactoryRef (wrapperFactory); return wrapperFactory; } ./compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_integrated_setting.c0000644000004100000410000002464613246301623034732 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include "ccs_gnome_integration_gsettings_integrated_setting.h" #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" /* CCSGSettingsIntegratedSetting implementation */ typedef struct _CCSGSettingsIntegratedSettingPrivate CCSGSettingsIntegratedSettingPrivate; struct _CCSGSettingsIntegratedSettingPrivate { CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSetting; CCSGSettingsWrapper *wrapper; }; char * ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (const char *key) { char *newKey = translateKeyForGSettings (key); if (g_strcmp0 (newKey, "run-command-screenshot") == 0) { free (newKey); newKey = strdup ("screenshot"); } else if (g_strcmp0 (newKey, "run-command-window-screenshot") == 0) { free (newKey); newKey = strdup ("window-screenshot"); } else if (g_strcmp0 (newKey, "run-command-terminal") == 0) { free (newKey); newKey = strdup ("terminal"); } return newKey; } SpecialOptionType ccsGSettingsIntegratedSettingGetSpecialOptionType (CCSGNOMEIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsGNOMEIntegratedSettingInfoGetSpecialOptionType (priv->gnomeIntegratedSetting); } const char * ccsGSettingsIntegratedSettingGetGNOMEName (CCSGNOMEIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsGNOMEIntegratedSettingInfoGetGNOMEName (priv->gnomeIntegratedSetting); } CCSSettingValue * ccsGSettingsIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); const char *gnomeKeyName = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); char *gsettingsTranslatedName = ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (gnomeKeyName); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; GVariant *variant = ccsGSettingsWrapperGetValue (priv->wrapper, gsettingsTranslatedName); if (!variant) { free (gsettingsTranslatedName); free (v); return NULL; } const GVariantType *variantType = G_VARIANT_TYPE (g_variant_get_type_string (variant)); switch (type) { case TypeInt: if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_INT32)) { ccsError ("Expected integer value"); free (v); v = NULL; break; } v->value.asInt = readIntFromVariant (variant); break; case TypeBool: if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_BOOLEAN)) { ccsError ("Expected boolean value"); free (v); v = NULL; break; } v->value.asBool = readBoolFromVariant (variant); break; case TypeString: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_STRING)) { ccsError ("Expected string value"); free (v); v = NULL; break; } const char *str = readStringFromVariant (variant); v->value.asString = strdup (str ? str : ""); break; } case TypeKey: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE ("as"))) { ccsError ("Expected array-of-string value"); free (v); v = NULL; break; } gsize len; const gchar **strv = g_variant_get_strv (variant, &len); if (strv) v->value.asString = strdup (strv[0] ? strv[0] : ""); else v->value.asString = strdup (""); g_free (strv); break; } default: g_assert_not_reached (); } g_variant_unref (variant); free (gsettingsTranslatedName); return v; } void ccsGSettingsIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); const char *gnomeKeyName = ccsGNOMEIntegratedSettingInfoGetGNOMEName ((CCSGNOMEIntegratedSettingInfo *) setting); char *gsettingsTranslatedName = ccsGSettingsIntegratedSettingsTranslateOldGNOMEKeyForGSettings (gnomeKeyName); GVariant *variant = ccsGSettingsWrapperGetValue (priv->wrapper, gsettingsTranslatedName); const GVariantType *variantType = g_variant_get_type (variant); GVariant *newVariant = NULL; if (!variant) { ccsError ("NULL encountered while reading GSettings value"); free (gsettingsTranslatedName); return; } switch (type) { case TypeInt: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_INT32)) ccsError ("Expected integer value"); else { int currentValue = readIntFromVariant (variant); if ((currentValue != v->value.asInt)) writeIntToVariant (v->value.asInt, &newVariant); } } break; case TypeBool: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_BOOLEAN)) ccsError ("Expected boolean value"); else { gboolean currentValue = readBoolFromVariant (variant); if ((currentValue != v->value.asBool)) writeBoolToVariant (v->value.asBool, &newVariant); } } break; case TypeString: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_STRING)) ccsError ("Expected string value"); else { const char *defaultValue = ""; const char *newValue = v->value.asString ? v->value.asString : defaultValue; gsize len = 0; const gchar *currentValue = g_variant_get_string (variant, &len); if (currentValue) { if (strcmp (currentValue, newValue) != 0) writeStringToVariant (newValue, &newVariant); } } } break; case TypeKey: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE ("as"))) ccsError ("Expected array-of-string value"); else { const char *defaultValue = ""; GVariantBuilder strvBuilder; g_variant_builder_init (&strvBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&strvBuilder, "s", v->value.asString ? v->value.asString : defaultValue); newVariant = g_variant_builder_end (&strvBuilder); } } break; default: g_assert_not_reached (); break; } /* g_settings_set_value consumes the reference */ if (newVariant) ccsGSettingsWrapperSetValue (priv->wrapper, gsettingsTranslatedName, newVariant); g_variant_unref (variant); free (gsettingsTranslatedName); } const char * ccsGSettingsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); } const char * ccsGSettingsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); } CCSSettingType ccsGSettingsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoGetType ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); } void ccsGSettingsIntegratedSettingFree (CCSIntegratedSetting *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); if (priv->wrapper) ccsGSettingsWrapperUnref (priv->wrapper); ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) priv->gnomeIntegratedSetting); ccsObjectFinalize (setting); (*setting->object.object_allocation->free_) (setting->object.object_allocation->allocator, setting); } void ccsGSettingsIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { return ccsGSettingsIntegratedSettingFree ((CCSIntegratedSetting *) info); } void ccsGSettingsGNOMEIntegratedSettingInfoFree (CCSGNOMEIntegratedSettingInfo *info) { return ccsGSettingsIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSGNOMEIntegratedSettingInfoInterface ccsGSettingsGNOMEIntegratedSettingInterface = { ccsGSettingsIntegratedSettingGetSpecialOptionType, ccsGSettingsIntegratedSettingGetGNOMEName, ccsGSettingsGNOMEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsGSettingsIntegratedSettingInterface = { ccsGSettingsIntegratedSettingReadValue, ccsGSettingsIntegratedSettingWriteValue, ccsGSettingsIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsGSettingsIntegratedSettingInfoInterface = { ccsGSettingsIntegratedSettingInfoPluginName, ccsGSettingsIntegratedSettingInfoSettingName, ccsGSettingsIntegratedSettingInfoGetType, ccsGSettingsIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsGSettingsIntegratedSettingNew (CCSGNOMEIntegratedSettingInfo *base, CCSGSettingsWrapper *wrapper, CCSObjectAllocationInterface *ai) { CCSIntegratedSetting *setting = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting)); if (!setting) return NULL; CCSGSettingsIntegratedSettingPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsIntegratedSettingPrivate)); if (!priv) { (*ai->free_) (ai->allocator, priv); return NULL; } priv->gnomeIntegratedSetting = base; priv->wrapper = wrapper; ccsGSettingsWrapperRef (priv->wrapper); ccsObjectInit (setting, ai); ccsObjectSetPrivate (setting, (CCSPrivate *) priv); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsGNOMEIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSGNOMEIntegratedSettingInfoInterface)); ccsIntegratedSettingRef (setting); return setting; } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootroot./compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_integrated_setting_factory.c./compizconfig/integration/gnome/gsettings/src/ccs_gnome_integration_gsettings_integrated_setting_fa0000644000004100000410000002366213246301623035154 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include #include #include "ccs_gnome_integration.h" #include "ccs_gnome_integrated_setting.h" #include "ccs_gnome_integration_constants.h" #include "ccs_gnome_integration_types.h" #include "ccs_gnome_integration_gsettings_integrated_setting.h" #include "ccs_gnome_integration_gsettings_integrated_setting_factory.h" char * ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (const char *key) { char *newKey = translateKeyForCCS (key); if (g_strcmp0 (newKey, "screenshot") == 0) { free (newKey); newKey = strdup ("run_command_screenshot"); } else if (g_strcmp0 (newKey, "window_screenshot") == 0) { free (newKey); newKey = strdup ("run_command_window_screenshot"); } else if (g_strcmp0 (newKey, "terminal") == 0) { free (newKey); newKey = strdup ("run_command_terminal"); } return newKey; } typedef struct _CCSGSettingsIntegratedSettingFactoryPrivate CCSGSettingsIntegratedSettingFactoryPrivate; struct _CCSGSettingsIntegratedSettingFactoryPrivate { CCSGSettingsWrapperFactory *wrapperFactory; GHashTable *pluginsToSettingsGSettingsWrapperQuarksHashTable; GHashTable *quarksToGSettingsWrappersHashTable; GHashTable *pluginsToSettingsSpecialTypesHashTable; GHashTable *pluginsToSettingNameGNOMENameHashTable; CCSGNOMEValueChangeData *valueChangeData; }; static void gnomeGSettingsValueChanged (GSettings *settings, gchar *key, gpointer user_data) { CCSGNOMEValueChangeData *data = (CCSGNOMEValueChangeData *) user_data; char *baseName = ccsGSettingsIntegratedSettingsTranslateNewGNOMEKeyForCCS (key); /* We don't care if integration is not enabled */ if (!ccsGetIntegrationEnabled (data->context)) return; CCSIntegratedSettingList settingList = ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (data->storage, ccsGNOMEIntegrationFindSettingsMatchingPredicate, baseName); ccsIntegrationUpdateIntegratedSettings (data->integration, data->context, settingList); g_free (baseName); } GCallback ccsGSettingsIntegratedSettingsChangeCallback () { return (GCallback) gnomeGSettingsValueChanged; } static CCSIntegratedSetting * createNewGSettingsIntegratedSetting (CCSGSettingsWrapper *wrapper, const char *gnomeName, const char *pluginName, const char *settingName, CCSSettingType type, SpecialOptionType specialOptionType, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingInfo *sharedIntegratedSettingInfo = ccsSharedIntegratedSettingInfoNew (pluginName, settingName, type, ai); if (!sharedIntegratedSettingInfo) return NULL; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSettingInfo = ccsGNOMEIntegratedSettingInfoNew (sharedIntegratedSettingInfo, specialOptionType, gnomeName, ai); if (!gnomeIntegratedSettingInfo) { ccsIntegratedSettingInfoUnref (sharedIntegratedSettingInfo); return NULL; } CCSIntegratedSetting *gsettingsIntegratedSetting = ccsGSettingsIntegratedSettingNew (gnomeIntegratedSettingInfo, wrapper, ai); if (!gsettingsIntegratedSetting) { ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) gnomeIntegratedSettingInfo); return NULL; } return gsettingsIntegratedSetting; } static void ccsGSettingsWrapperUnrefWrapper (gpointer wrapper) { ccsGSettingsWrapperUnref ((CCSGSettingsWrapper *) wrapper); } static GHashTable * initializeGSettingsWrappers (CCSGSettingsWrapperFactory *factory) { const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsGNOMEGSettingsWrapperQuarks (); GHashTable *quarksToGSettingsWrappers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, ccsGSettingsWrapperUnrefWrapper); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_COMPIZ_INTEGRATED), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_KEYBINDINGS), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_DESKTOP_WM_PREFERENCES), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_GNOME_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS), factory->object.object_allocation)); return quarksToGSettingsWrappers; } CCSIntegratedSetting * ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); GHashTable *settingsGSettingsWrapperQuarksHashTable = g_hash_table_lookup (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable, pluginName); GHashTable *settingsSpecialTypesHashTable = g_hash_table_lookup (priv->pluginsToSettingsSpecialTypesHashTable, pluginName); GHashTable *settingsSettingNameGNOMENameHashTable = g_hash_table_lookup (priv->pluginsToSettingNameGNOMENameHashTable, pluginName); if (!priv->quarksToGSettingsWrappersHashTable) priv->quarksToGSettingsWrappersHashTable = initializeGSettingsWrappers (priv->wrapperFactory); if (settingsGSettingsWrapperQuarksHashTable && settingsSpecialTypesHashTable && settingsSettingNameGNOMENameHashTable) { GQuark wrapperQuark = GPOINTER_TO_INT (g_hash_table_lookup (settingsGSettingsWrapperQuarksHashTable, settingName)); CCSGSettingsWrapper *wrapper = g_hash_table_lookup (priv->quarksToGSettingsWrappersHashTable, GINT_TO_POINTER (wrapperQuark)); SpecialOptionType specialType = (SpecialOptionType) GPOINTER_TO_INT (g_hash_table_lookup (settingsSpecialTypesHashTable, settingName)); const gchar *integratedName = g_hash_table_lookup (settingsSettingNameGNOMENameHashTable, settingName); if (wrapper == NULL) return NULL; return createNewGSettingsIntegratedSetting (wrapper, integratedName, pluginName, settingName, type, specialType, factory->object.object_allocation); } return NULL; } void ccsGSettingsIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *factory) { CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); if (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable) g_hash_table_unref (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable); if (priv->quarksToGSettingsWrappersHashTable) g_hash_table_unref (priv->quarksToGSettingsWrappersHashTable); if (priv->pluginsToSettingsSpecialTypesHashTable) g_hash_table_unref (priv->pluginsToSettingsSpecialTypesHashTable); if (priv->pluginsToSettingNameGNOMENameHashTable) g_hash_table_unref (priv->pluginsToSettingNameGNOMENameHashTable); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); ccsObjectFinalize (factory); (*factory->object.object_allocation->free_) (factory->object.object_allocation->allocator, factory); } const CCSIntegratedSettingFactoryInterface ccsGSettingsIntegratedSettingFactoryInterface = { ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType, ccsGSettingsIntegratedSettingFactoryFree }; CCSIntegratedSettingFactory * ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory *wrapperFactory, CCSGNOMEValueChangeData *valueChangeData, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingFactory *factory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory)); if (!factory) return NULL; CCSGSettingsIntegratedSettingFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsIntegratedSettingFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, factory); return NULL; } ccsGSettingsWrapperFactoryRef (wrapperFactory); priv->wrapperFactory = wrapperFactory; priv->pluginsToSettingsGSettingsWrapperQuarksHashTable = ccsGNOMEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable (); priv->pluginsToSettingsSpecialTypesHashTable = ccsGNOMEIntegrationPopulateSpecialTypesHashTables (); priv->pluginsToSettingNameGNOMENameHashTable = ccsGNOMEIntegrationPopulateSettingNameToGNOMENameHashTables (); priv->valueChangeData = valueChangeData; ccsObjectInit (factory, ai); ccsObjectSetPrivate (factory, (CCSPrivate *) priv); ccsObjectAddInterface (factory, (const CCSInterface *) &ccsGSettingsIntegratedSettingFactoryInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface)); ccsObjectRef (factory); return factory; } ./compizconfig/integration/gnome/gsettings/tests/0000755000004100000410000000000013246301623022533 5ustar www-datawww-data./compizconfig/integration/gnome/gsettings/tests/CMakeLists.txt0000644000004100000410000000307513246301623025300 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_SOURCE_DIR}/tests/shared/glib) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../gsettings/tests) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../gsettings/mocks) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../mocks/libcompizconfig) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../tests/) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../src/) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_executable (compizconfig_test_ccs_gnome_gsettings_integrated_setting ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_gnome_gsettings_integrated_setting.cpp) target_link_libraries (compizconfig_test_ccs_gnome_gsettings_integrated_setting ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_gsettings_settings_test_env compizconfig_ccs_gsettings_wrapper_mock compizconfig_gnome_integration_gsettings_integrated_setting compizconfig_gsettings_backend_interface) compiz_discover_tests (compizconfig_test_ccs_gnome_gsettings_integrated_setting COVERAGE compizconfig_gnome_integration_gsettings_integrated_setting) ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootroot./compizconfig/integration/gnome/gsettings/tests/compizconfig_test_ccs_gnome_gsettings_integrated_setting.cpp./compizconfig/integration/gnome/gsettings/tests/compizconfig_test_ccs_gnome_gsettings_integrated_se0000644000004100000410000003053013246301623035206 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::Combine; using ::testing::Return; using ::testing::IsNull; using ::testing::ValuesIn; using ::testing::Values; using ::testing::Eq; using ::testing::WithArgs; using ::testing::_; namespace compiz { namespace config { namespace integration { namespace test { const std::string KEYBINDING_ONE = "keybinding_one"; const std::string KEYBINDING_TWO = "keybinding_two"; const std::string STRING = "string"; const Bool BOOLEAN = TRUE; const int INTEGER = 2; const std::string STRING_ALT = "string_alt"; const Bool BOOLEAN_ALT = FALSE; const int INTEGER_ALT = 1; namespace variant_generators { GVariant * i (); GVariant * s (); GVariant * b (); GVariant * as (); GVariant * fromValue (CCSSettingValue *v, CCSSettingType type); } namespace value_generators { CCSSettingValue * integer (); CCSSettingValue * string (); CCSSettingValue * key (); CCSSettingValue * boolean (); } namespace expectations { void integer (CCSSettingValue *); void string (CCSSettingValue *); void boolean (CCSSettingValue *); void key (CCSSettingValue *); void integerVariant (GVariant *, int); void stringVariant (GVariant *, const std::string &); void booleanVariant (GVariant *, bool); void keyVariant (GVariant *, const std::string &); } typedef GVariant * (*VariantGenerator) (); typedef CCSSettingValue * (*ValueGenerator) (); typedef void (*Expectation) (CCSSettingValue *); struct GSettingsIntegratedSettingInfo { VariantGenerator variantGenerator; ValueGenerator valueGenerator; Expectation expectation; CCSSettingType settingType; CCSSettingType returnType; }; namespace impl { namespace ccit = compiz::config::integration::test; namespace vg = compiz::config::integration::test::variant_generators; namespace cvg = compiz::config::integration::test::value_generators; namespace ex = compiz::config::integration::test::expectations; ccit::GSettingsIntegratedSettingInfo settingsInfo[] = { { vg::i, cvg::integer, ex::integer, TypeInt, TypeInt }, { vg::b, cvg::boolean, ex::boolean, TypeBool, TypeBool }, { vg::s, cvg::string, ex::string, TypeString, TypeString }, { vg::as, cvg::key, ex::key, TypeKey, TypeString } }; } } } } } MATCHER_P (VariantEqual, lhs, "Variants Equal") { return g_variant_equal (lhs, arg); } namespace { std::map & ccsTypeToSpecialType () { static std::map types; static bool initialized = false; if (!initialized) { types[TypeInt] = OptionInt; types[TypeBool] = OptionBool; types[TypeString] = OptionString; types[TypeKey] = OptionKey; } return types; } } namespace ccit = compiz::config::integration::test; namespace cciti = compiz::config::integration::test::impl; namespace ccvg = compiz::config::integration::test::variant_generators; namespace ccvalg = compiz::config::integration::test::value_generators; namespace ccex = compiz::config::integration::test::expectations; typedef std::tr1::tuple CCSGSettingsIntegratedSettingTestInfo; class CCSGSettingsIntegratedSettingTest : public ::testing::TestWithParam { public: virtual void SetUp (); virtual void TearDown (); protected: CompizGLibGSliceOffEnv env; boost::shared_ptr mWrapper; CCSGSettingsWrapperGMock *mWrapperMock; }; GVariant * ccvg::fromValue (CCSSettingValue *v, CCSSettingType type) { switch (type) { case TypeInt: return g_variant_new ("i", v->value.asInt); break; case TypeBool: return g_variant_new ("b", v->value.asBool); break; case TypeString: return g_variant_new ("s", v->value.asString); break; case TypeKey: { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); /* Represented internally as strings */ std::string kb (v->value.asString); if (kb == "Disabled") kb[0] = 'd'; g_variant_builder_add (&builder, "s", kb.c_str ()); return g_variant_builder_end (&builder); } default: break; } return NULL; } GVariant * ccvg::as () { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", ccit::KEYBINDING_ONE.c_str ()); g_variant_builder_add (&builder, "s", ccit::KEYBINDING_TWO.c_str ()); return g_variant_builder_end (&builder); } GVariant * ccvg::i () { return g_variant_new ("i", ccit::INTEGER); } GVariant * ccvg::b () { return g_variant_new ("b", ccit::BOOLEAN); } GVariant * ccvg::s () { return g_variant_new ("s", ccit::STRING.c_str ()); } namespace { CCSSettingValue * createSettingValue () { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; return v; } } CCSSettingValue * ccvalg::integer () { CCSSettingValue *v = createSettingValue (); v->value.asInt = ccit::INTEGER_ALT; return v; } CCSSettingValue * ccvalg::string () { CCSSettingValue *v = createSettingValue (); v->value.asString = strdup (ccit::STRING_ALT.c_str ()); return v; } CCSSettingValue * ccvalg::key () { CCSSettingValue *v = createSettingValue (); v->value.asString = strdup (ccit::KEYBINDING_TWO.c_str ()); return v; } CCSSettingValue * ccvalg::boolean () { CCSSettingValue *v = createSettingValue (); v->value.asBool = ccit::BOOLEAN_ALT; return v; } void ccex::boolean (CCSSettingValue *v) { EXPECT_EQ (v->value.asBool, ccit::BOOLEAN); } void ccex::integer (CCSSettingValue *v) { EXPECT_EQ (v->value.asInt, ccit::INTEGER); } void ccex::string (CCSSettingValue *v) { EXPECT_EQ (v->value.asString, ccit::STRING); } void ccex::key (CCSSettingValue *v) { EXPECT_EQ (v->value.asString, ccit::KEYBINDING_ONE); } void ccex::integerVariant (GVariant *v , int i) { EXPECT_EQ (g_variant_get_int32 (v), i); } void ccex::stringVariant (GVariant *v, const std::string &s) { gsize len; EXPECT_EQ (g_variant_get_string (v, &len), s); } void ccex::booleanVariant (GVariant *v, bool b) { EXPECT_EQ (g_variant_get_boolean (v), b); } void ccex::keyVariant (GVariant *v, const std::string &s) { gsize len; const gchar * const *strv = g_variant_get_strv (v, &len); EXPECT_EQ (strv[0], s); } void CCSGSettingsIntegratedSettingTest::SetUp () { env.SetUpEnv (); mWrapper.reset (ccsMockGSettingsWrapperNew (), boost::bind (ccsMockGSettingsWrapperFree, _1)); mWrapperMock = reinterpret_cast ( ccsObjectGetPrivate (mWrapper.get ())); } void CCSGSettingsIntegratedSettingTest::TearDown () { mWrapper.reset (); mWrapperMock = NULL; env.TearDownEnv (); } TEST_P (CCSGSettingsIntegratedSettingTest, MatchedTypesReturnValueMismatchedTypesReturnNull) { const std::string keyName ("mock"); const ccit::GSettingsIntegratedSettingInfo &integratedSettingInfo = std::tr1::get <1> (GetParam ()); const CCSSettingType createSettingType = std::tr1::get <0> (GetParam ()); /* The GSettings Integrated setting takes ownership of these */ CCSIntegratedSettingInfo *integratedSetting = ccsSharedIntegratedSettingInfoNew (keyName.c_str (), keyName.c_str (), integratedSettingInfo.settingType, &ccsDefaultObjectAllocator); SpecialOptionType specialType = ccsTypeToSpecialType ()[integratedSettingInfo.settingType]; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSetting = ccsGNOMEIntegratedSettingInfoNew (integratedSetting, specialType, keyName.c_str (), &ccsDefaultObjectAllocator); boost::shared_ptr gsettingsIntegrated (AutoDestroy (ccsGSettingsIntegratedSettingNew (gnomeIntegratedSetting, mWrapper.get (), &ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)); GVariant *variant = (*integratedSettingInfo.variantGenerator) (); EXPECT_CALL (*mWrapperMock, getValue (Eq (keyName))).WillOnce (Return (variant)); CCSSettingValue *value = ccsIntegratedSettingReadValue (gsettingsIntegrated.get (), createSettingType); if (createSettingType == integratedSettingInfo.settingType) (*integratedSettingInfo.expectation) (value); else EXPECT_THAT (value, IsNull ()); if (value) ccsFreeSettingValueWithType (value, integratedSettingInfo.returnType); } ACTION (FreeVariant) { g_variant_unref (arg0); } TEST_P (CCSGSettingsIntegratedSettingTest, MatchedTypesReturnValueMismatchedTypesResetOrWrite) { const std::string keyName ("mock"); const ccit::GSettingsIntegratedSettingInfo &integratedSettingInfo = std::tr1::get <1> (GetParam ()); const CCSSettingType createSettingType = std::tr1::get <0> (GetParam ()); CCSIntegratedSettingInfo *integratedSetting = ccsSharedIntegratedSettingInfoNew (keyName.c_str (), keyName.c_str (), integratedSettingInfo.settingType, &ccsDefaultObjectAllocator); SpecialOptionType specialType = ccsTypeToSpecialType ()[integratedSettingInfo.settingType]; CCSGNOMEIntegratedSettingInfo *gnomeIntegratedSetting = ccsGNOMEIntegratedSettingInfoNew (integratedSetting, specialType, keyName.c_str (), &ccsDefaultObjectAllocator); boost::shared_ptr gsettingsIntegrated (AutoDestroy (ccsGSettingsIntegratedSettingNew (gnomeIntegratedSetting, mWrapper.get (), &ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)); boost::shared_ptr value ((*integratedSettingInfo.valueGenerator) (), boost::bind (ccsFreeSettingValueWithType, _1, integratedSettingInfo.returnType)); boost::shared_ptr variant = AutoDestroy (g_variant_ref ((*integratedSettingInfo.variantGenerator) ()), g_variant_unref); boost::shared_ptr newVariant = AutoDestroy (ccvg::fromValue (value.get (), integratedSettingInfo.settingType), g_variant_unref); EXPECT_CALL (*mWrapperMock, getValue (Eq (keyName))).WillOnce (Return (variant.get ())); if (createSettingType == integratedSettingInfo.settingType) EXPECT_CALL (*mWrapperMock, setValue (Eq (keyName), VariantEqual (newVariant.get ()))) .WillOnce (WithArgs <1> (FreeVariant ())); else EXPECT_CALL (*mWrapperMock, resetKey (Eq (keyName))); ccsIntegratedSettingWriteValue (gsettingsIntegrated.get (), value.get (), createSettingType); } INSTANTIATE_TEST_CASE_P (CCSGSettingsIntegratedSettingTestMismatchedValues, CCSGSettingsIntegratedSettingTest, Combine (Values (TypeInt, TypeString, TypeBool, TypeKey), ValuesIn (cciti::settingsInfo))); ./compizconfig/integration/mate/0000755000004100000410000000000013246301623017203 5ustar www-datawww-data./compizconfig/integration/mate/CMakeLists.txt0000644000004100000410000000264613246301623021753 0ustar www-datawww-datainclude (FindPkgConfig) add_subdirectory (gsettings) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) compiz_pkg_check_modules (COMPIZCONFIG_MATE_INTEGRATION ${_deps}) if (COMPIZCONFIG_MATE_INTEGRATION_FOUND) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/mate/include ${COMPIZCONFIG_MATE_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${COMPIZCONFIG_MATE_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_mate_integration_constants STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_mate_integration_constants.c) add_library (compizconfig_mate_integration STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_mate_integration.c) target_link_libraries (compizconfig_mate_integration compizconfig_mate_integration_constants compizconfig_mate_integrated_setting compizconfig ${COMPIZCONFIG_MATE_INTEGRATION_LIBRARIES}) add_library (compizconfig_mate_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_mate_integrated_setting.c) target_link_libraries (compizconfig_mate_integrated_setting compizconfig_mate_integration_constants compizconfig ${COMPIZCONFIG_MATE_INTEGRATION_LIBRARIES}) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (COMPIZCONFIG_MATE_INTEGRATION_FOUND) ./compizconfig/integration/mate/include/0000755000004100000410000000000013246301623020626 5ustar www-datawww-data./compizconfig/integration/mate/include/ccs_mate_integration.h0000644000004100000410000000232313246301623025160 0ustar www-datawww-data#ifndef _CCS_COMPIZCONFIG_MATE_INTEGRATION #define _CCS_COMPIZCONFIG_MATE_INTEGRATION #include #include #include #include "ccs_mate_integration_types.h" COMPIZCONFIG_BEGIN_DECLS struct _CCSMATEValueChangeData { CCSIntegration *integration; CCSIntegratedSettingsStorage *storage; CCSIntegratedSettingFactory *factory; CCSContext *context; }; /** * @brief ccsMATEIntegrationBackendNew * @param backend * @param context * @param factory * @param storage * @param ai * @return A new CCSIntegration * * The MATE implementation of desktop environment integration - requires * a method to create new integrated settings, and a method to store them * as well. * * CCSMATEIntegration is a pure composition in most respects - it just * represents the process as to which settings should be written to * what keys and vice versa, it doesn't represent how those keys should * be written. */ CCSIntegration * ccsMATEIntegrationBackendNew (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/include/ccs_mate_integrated_setting.h0000644000004100000410000000403113246301623026516 0ustar www-datawww-data#ifndef _CCS_MATE_INTEGRATED_SETTING_H #define _CCS_MATE_INTEGRATED_SETTING_H #include #include #include #include "ccs_mate_integration_types.h" COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSMATEIntegratedSettingInfoInterface CCSMATEIntegratedSettingInfoInterface; typedef SpecialOptionType (*CCSMATEIntegratedSettingInfoGetSpecialOptionType) (CCSMATEIntegratedSettingInfo *); typedef const char * (*CCSMATEIntegratedSettingInfoGetMATEName) (CCSMATEIntegratedSettingInfo *); typedef void (*CCSMATEIntegratedSettingInfoFree) (CCSMATEIntegratedSettingInfo *); struct _CCSMATEIntegratedSettingInfoInterface { CCSMATEIntegratedSettingInfoGetSpecialOptionType getSpecialOptionType; CCSMATEIntegratedSettingInfoGetMATEName getMATEName; CCSMATEIntegratedSettingInfoFree free; }; /** * @brief The _CCSMATEIntegratedSetting struct * * CCSMATEIntegratedSetting represents an integrated setting in * MATE - it builds upon CCSSharedIntegratedSetting (which it composes * and implements) and also adds the concept of an MATE side keyname * and option type for that keyname (as the types do not match 1-1) */ struct _CCSMATEIntegratedSettingInfo { CCSObject object; }; unsigned int ccsCCSMATEIntegratedSettingInfoInterfaceGetType (); Bool ccsMATEIntegrationFindSettingsMatchingPredicate (CCSIntegratedSetting *setting, void *userData); SpecialOptionType ccsMATEIntegratedSettingInfoGetSpecialOptionType (CCSMATEIntegratedSettingInfo *); const char * ccsMATEIntegratedSettingInfoGetMATEName (CCSMATEIntegratedSettingInfo *); CCSMATEIntegratedSettingInfo * ccsMATEIntegratedSettingInfoNew (CCSIntegratedSettingInfo *base, SpecialOptionType type, const char *mateName, CCSObjectAllocationInterface *ai); void ccsFreeMATEIntegratedSettingInfo (CCSMATEIntegratedSettingInfo *); CCSREF_HDR (MATEIntegratedSettingInfo, CCSMATEIntegratedSettingInfo); CCSLIST_HDR (MATEIntegratedSettingInfo, CCSMATEIntegratedSettingInfo); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/include/ccs_mate_fwd.h0000644000004100000410000000044413246301623023417 0ustar www-datawww-data#ifndef _CCS_MATE_INTEGRATION_FWD_H #define _CCS_MATE_INTEGRATION_FWD_H #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSMATEIntegratedSettingInfo CCSMATEIntegratedSettingInfo; typedef struct _CCSMATEValueChangeData CCSMATEValueChangeData; COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/include/ccs_mate_integration_types.h0000644000004100000410000000042613246301623026406 0ustar www-datawww-data#ifndef _CCS_MATE_INTEGRATION_TYPES_H #define _CCS_MATE_INTEGRATION_TYPES_H #include COMPIZCONFIG_BEGIN_DECLS typedef enum { OptionInt, OptionBool, OptionKey, OptionString, OptionSpecial, } SpecialOptionType; COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/include/ccs_mate_integration_constants.h0000644000004100000410000002351713246301623027264 0ustar www-datawww-data#ifndef _CCS_MATE_INTEGRATION_CONSTANTS_H #define _CCS_MATE_INTEGRATION_CONSTANTS_H #include #include COMPIZCONFIG_BEGIN_DECLS #include #define METACITY "/apps/metacity" #define NUM_WATCHED_DIRS 3 typedef struct _CCSSettingIntegratedSettingPair CCSSettingIntegratedSettingPair; struct _CCSSettingIntegratedSettingPair { const char *compizName; const char *mateName; }; typedef struct _CCSMATEIntegratedSettingNames CCSMATEIntegratedSettingNames; struct _CCSMATEIntegratedSettingNames { CCSSettingIntegratedSettingPair CORE_AUDIBLE_BELL; CCSSettingIntegratedSettingPair CORE_CLICK_TO_FOCUS; CCSSettingIntegratedSettingPair CORE_RAISE_ON_CLICK; CCSSettingIntegratedSettingPair CORE_AUTORAISE_DELAY; CCSSettingIntegratedSettingPair CORE_AUTORAISE; CCSSettingIntegratedSettingPair THUMBNAIL_CURRENT_VIEWPORT; CCSSettingIntegratedSettingPair MATECOMPAT_COMMAND_TERMINAL; CCSSettingIntegratedSettingPair MATECOMPAT_COMMAND_WINDOW_SCREENSHOT; CCSSettingIntegratedSettingPair MATECOMPAT_COMMAND_SCREENSHOT; CCSSettingIntegratedSettingPair ROTATE_ROTATE_RIGHT_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_LEFT_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_12_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_11_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_10_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_9_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_8_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_7_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_6_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_5_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_4_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_3_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_2_WINDOW_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_1_WINDOW_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOM_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOP_KEY; CCSSettingIntegratedSettingPair PUT_PUT_RIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_LEFT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOMRIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_BOTTOMLEFT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOPRIGHT_KEY; CCSSettingIntegratedSettingPair PUT_PUT_TOPLEFT_KEY; CCSSettingIntegratedSettingPair WALL_DOWN_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_UP_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_RIGHT_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_LEFT_WINDOW_KEY; CCSSettingIntegratedSettingPair WALL_RIGHT_KEY; CCSSettingIntegratedSettingPair WALL_LEFT_KEY; CCSSettingIntegratedSettingPair WALL_DOWN_KEY; CCSSettingIntegratedSettingPair WALL_UP_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_12_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_11_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_10_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_9_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_8_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_7_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_6_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_5_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_4_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_3_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_2_KEY; CCSSettingIntegratedSettingPair VPSWITCH_SWITCH_TO_1_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_RIGHT_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_LEFT_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_12_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_11_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_10_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_9_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_8_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_7_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_6_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_5_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_4_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_3_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_2_KEY; CCSSettingIntegratedSettingPair ROTATE_ROTATE_TO_1_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND11_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND10_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND9_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND8_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND7_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND6_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND5_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND4_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND3_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND2_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND1_KEY; CCSSettingIntegratedSettingPair COMMANDS_RUN_COMMAND0_KEY; CCSSettingIntegratedSettingPair COMMANDS_COMMAND11; CCSSettingIntegratedSettingPair COMMANDS_COMMAND10; CCSSettingIntegratedSettingPair COMMANDS_COMMAND9; CCSSettingIntegratedSettingPair COMMANDS_COMMAND8; CCSSettingIntegratedSettingPair COMMANDS_COMMAND7; CCSSettingIntegratedSettingPair COMMANDS_COMMAND6; CCSSettingIntegratedSettingPair COMMANDS_COMMAND5; CCSSettingIntegratedSettingPair COMMANDS_COMMAND4; CCSSettingIntegratedSettingPair COMMANDS_COMMAND3; CCSSettingIntegratedSettingPair COMMANDS_COMMAND2; CCSSettingIntegratedSettingPair COMMANDS_COMMAND1; CCSSettingIntegratedSettingPair COMMANDS_COMMAND0; CCSSettingIntegratedSettingPair EXTRAWM_TOGGLE_FULLSCREEN_KEY; CCSSettingIntegratedSettingPair EXTRAWM_TOGGLE_STICKY_KEY; CCSSettingIntegratedSettingPair STATICSWITCHER_PREV_KEY; CCSSettingIntegratedSettingPair STATICSWITCHER_NEXT_KEY; CCSSettingIntegratedSettingPair FADE_FULLSCREEN_VISUAL_BELL; CCSSettingIntegratedSettingPair FADE_VISUAL_BELL; CCSSettingIntegratedSettingPair NULL_RESIZE_WITH_RIGHT_BUTTON; CCSSettingIntegratedSettingPair NULL_MOUSE_BUTTON_MODIFIER; CCSSettingIntegratedSettingPair CORE_WINDOW_MENU_BUTTON; CCSSettingIntegratedSettingPair RESIZE_INITIATE_BUTTON; CCSSettingIntegratedSettingPair MOVE_INITIATE_BUTTON; CCSSettingIntegratedSettingPair CORE_WINDOW_MENU_KEY; CCSSettingIntegratedSettingPair RESIZE_INITIATE_KEY; CCSSettingIntegratedSettingPair MOVE_INITIATE_KEY; CCSSettingIntegratedSettingPair CORE_SHOW_DESKTOP_KEY; CCSSettingIntegratedSettingPair CORE_TOGGLE_WINDOW_SHADED_KEY; CCSSettingIntegratedSettingPair CORE_CLOSE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_LOWER_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_RAISE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY; CCSSettingIntegratedSettingPair CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MAXIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_MINIMIZE_WINDOW_KEY; CCSSettingIntegratedSettingPair CORE_TOGGLE_WINDOW_MAXIMIZED_KEY; CCSSettingIntegratedSettingPair MATECOMPAT_RUN_COMMAND_TERMINAL_KEY; CCSSettingIntegratedSettingPair MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY; CCSSettingIntegratedSettingPair MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY; CCSSettingIntegratedSettingPair MATECOMPAT_MAIN_MENU_KEY; CCSSettingIntegratedSettingPair MATECOMPAT_RUN_KEY; }; extern const CCSMATEIntegratedSettingNames ccsMATEIntegratedSettingNames; typedef struct _CCSGConfIntegrationCategoires CCSGConfIntegrationCategories; struct _CCSGConfIntegrationCategoires { const char *GENERAL; const char *APPS; const char *DESKTOP; const char *KEYBINDING_COMMANDS; const char *WINDOW_KEYBINDINGS; const char *GLOBAL_KEYBINDINGS; }; extern const CCSGConfIntegrationCategories ccsGConfIntegrationCategories; typedef struct _CCSMATEIntegratedPluginNames CCSMATEIntegratedPluginNames; struct _CCSMATEIntegratedPluginNames { const char *CORE; const char *THUMBNAIL; const char *MATECOMPAT; const char *ROTATE; const char *PUT; const char *WALL; const char *VPSWITCH; const char *COMMANDS; const char *EXTRAWM; const char *RESIZE; const char *MOVE; const char *STATICSWITCHER; const char *FADE; const char *SPECIAL; }; extern const CCSMATEIntegratedPluginNames ccsMATEIntegratedPluginNames; extern const char* watchedGConfMateDirectories[]; typedef struct _CCSGSettingsWrapperIntegratedSchemasQuarks { GQuark ORG_MATE_DESKTOP_WM_PREFERENCES; GQuark ORG_MATE_DESKTOP_WM_KEYBINDINGS; GQuark ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS; GQuark ORG_MATE_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL; GQuark ORG_COMPIZ_INTEGRATED; } CCSGSettingsWrapperIntegratedSchemasQuarks; const CCSGSettingsWrapperIntegratedSchemasQuarks *ccsMATEGSettingsWrapperQuarks (); GHashTable * ccsMATEIntegrationPopulateCategoriesHashTables (); GHashTable * ccsMATEIntegrationPopulateSpecialTypesHashTables (); GHashTable * ccsMATEIntegrationPopulateSettingNameToMATENameHashTables (); GHashTable * ccsMATEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable (); /* We only have to use the #define here because * C doesn't have a concept of "constants" setting * the array size ... */ #define CCS_MATE_INTEGRATED_SETTINGS_LIST_SIZE 120 typedef struct _CCSMATEIntegratedSettingsList { const char *pluginName; const char *settingName; } CCSMATEIntegratedSettingsList; const CCSMATEIntegratedSettingsList * ccsMATEIntegratedSettingsList (); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/src/0000755000004100000410000000000013246301623017772 5ustar www-datawww-data./compizconfig/integration/mate/src/ccs_mate_integration.c0000644000004100000410000005563313246301623024333 0ustar www-datawww-data/** * * compizconfig mate integration backend * * mate-integration.c * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include #include #include #include #include #include "ccs_mate_integration.h" #include "ccs_mate_integration_constants.h" #include "ccs_mate_integrated_setting.h" typedef struct _CCSMATEIntegrationBackendPrivate CCMATEIntegrationBackendPrivate; struct _CCSMATEIntegrationBackendPrivate { CCSBackend *backend; CCSContext *context; CCSIntegratedSettingFactory *factory; CCSIntegratedSettingsStorage *storage; Bool noWrites; }; static CCSSetting * findDisplaySettingForPlugin (CCSContext *context, const char *plugin, const char *setting) { CCSPlugin *p; CCSSetting *s; p = ccsFindPlugin (context, plugin); if (!p) return NULL; s = ccsFindSetting (p, setting); if (!s) return NULL; return s; } static void unregisterAllIntegratedOptions (CCSIntegration *integration) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (priv->storage) ccsIntegratedSettingsStorageUnref (priv->storage); if (priv->factory) ccsIntegratedSettingFactoryUnref (priv->factory); priv->storage = NULL; priv->factory = NULL; } static void registerAllIntegratedOptions (CCSIntegration *integration) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); unsigned int i = 0; const CCSMATEIntegratedSettingsList *array = ccsMATEIntegratedSettingsList (); for (; i < CCS_MATE_INTEGRATED_SETTINGS_LIST_SIZE; ++i) { CCSIntegratedSetting *setting = ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (priv->factory, integration, array[i].pluginName, array[i].settingName, TypeInt); ccsIntegratedSettingsStorageAddSetting (priv->storage, setting); } } static CCSIntegratedSetting * ccsMATEIntegrationBackendGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); CCSIntegratedSettingList integratedSettings = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, pluginName, settingName); if (integratedSettings) { /* At the moment, we only support the first setting out of * the list. Assert the returned size is one */ g_assert (ccsIntegratedSettingListLength (integratedSettings) == 1); CCSIntegratedSetting *integratedSetting = integratedSettings->data; ccsIntegratedSettingListFree (integratedSettings, FALSE); return integratedSetting; } return NULL; } static unsigned int getMateMouseButtonModifier (CCSIntegratedSetting *mouseButtonModifierSetting) { unsigned int modMask = 0; CCSSettingType type = TypeString; CCSSettingValue *v = ccsIntegratedSettingReadValue (mouseButtonModifierSetting, type); if (v) { modMask = ccsStringToModifiers (v->value.asString); ccsFreeSettingValueWithType (v, type); } return modMask; } static unsigned int getButtonBindingForSetting (CCSContext *context, const char *plugin, const char *setting) { CCSSetting *s; s = findDisplaySettingForPlugin (context, plugin, setting); if (!s) return 0; if (ccsSettingGetType (s) != TypeButton) return 0; return ccsSettingGetValue (s)->value.asButton.button; } static Bool ccsMATEIntegrationBackendReadISAndSetSettingForType (CCSIntegratedSetting *integratedSetting, CCSSetting *setting, CCSSettingValue **v, CCSSettingType sourceType, CCSSettingType destinationType) { *v = ccsIntegratedSettingReadValue (integratedSetting, sourceType); if (*v != NULL && (*v)->value.asString) { /* Conversion to key type option necessary */ if (destinationType == TypeKey) { CCSSettingKeyValue key; memset (&key, 0, sizeof (CCSSettingKeyValue)); if (ccsStringToKeyBinding ((*v)->value.asString, &key)) { /* Since we effectively change the type of the value here * we need to free the old string value */ free ((*v)->value.asString); ccsSetKey (setting, key, TRUE); return TRUE; } else { /* We were not successful at converting strings to keybindings * but we must free the string value anyways as we present * this value to ccsSettingValueFreeWithType as a TypeKey * intentionally made empty */ free ((*v)->value.asString); return FALSE; } } return TRUE; } return FALSE; } static Bool ccsMATEIntegrationBackendReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { Bool ret = FALSE; CCSSettingValue *v = NULL; CCSSettingType type = TypeNum; CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (!ccsSettingIsReadableByBackend (setting)) return FALSE; switch (ccsMATEIntegratedSettingInfoGetSpecialOptionType ((CCSMATEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: { type = TypeInt; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetInt (setting, v->value.asInt, TRUE); ret = TRUE; } break; case OptionBool: { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; ccsSetBool (setting, v->value.asBool, TRUE); ret = TRUE; } break; case OptionString: { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; char *str = v->value.asString; ccsSetString (setting, str, TRUE); ret = TRUE; } break; case OptionKey: { /* Some backends store keys differently so we need to let the backend know * that we really intend to read a key and let it handle the conversion */ type = TypeKey; if (ccsMATEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeKey, type)) ret = TRUE; } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); if (strcmp (settingName, "current_viewport") == 0) { type = TypeBool; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; Bool showAll = v->value.asBool; ccsSetBool (setting, !showAll, TRUE); ret = TRUE; } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *value = v->value.asString; if (value) { Bool fullscreen; fullscreen = strcmp (value, "fullscreen") == 0; ccsSetBool (setting, fullscreen, TRUE); ret = TRUE; } } else if (strcmp (settingName, "click_to_focus") == 0) { type = TypeString; v = ccsIntegratedSettingReadValue (integratedSetting, type); if (!v) break; const char *focusMode = v->value.asString; if (focusMode) { Bool clickToFocus = (strcmp (focusMode, "click") == 0); ccsSetBool (setting, clickToFocus, TRUE); ret = TRUE; } } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { /* These are always stored as strings, no matter what the backend is * so the source type should be string */ type = TypeKey; if (ccsMATEIntegrationBackendReadISAndSetSettingForType (integratedSetting, setting, &v, TypeString, type)) ret = TRUE; } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { gboolean resizeWithRightButton; CCSSettingButtonValue button; memset (&button, 0, sizeof (CCSSettingButtonValue)); ccsGetButton (setting, &button); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsMATEIntegratedPluginNames.SPECIAL, ccsMATEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); button.buttonModMask = getMateMouseButtonModifier (mouseModifierSetting->data); CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsMATEIntegratedPluginNames.SPECIAL, ccsMATEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); type = TypeBool; v = ccsIntegratedSettingReadValue (resizeButtonSetting->data, type); resizeWithRightButton = v->value.asBool; if (strcmp (settingName, "window_menu_button") == 0) button.button = resizeWithRightButton ? 2 : 3; else if (strcmp (pluginName, "resize") == 0) button.button = resizeWithRightButton ? 3 : 2; else button.button = 1; ccsSetButton (setting, button, TRUE); ret = TRUE; /* Free the returned lists */ ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); } } break; default: break; } if (v) ccsFreeSettingValueWithType (v, type); return ret; } static Bool setMateMouseButtonModifier (CCSIntegratedSetting *setting, unsigned int modMask) { char *modifiers; CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; modifiers = ccsModifiersToString (modMask); if (!modifiers) { ccsFreeSettingValueWithType (v, TypeString); return FALSE; } v->value.asString = modifiers; ccsIntegratedSettingWriteValue (setting, v, TypeString); ccsFreeSettingValueWithType (v, TypeString); return TRUE; } static void setButtonBindingForSetting (CCSContext *context, const char *plugin, const char *setting, unsigned int button, unsigned int buttonModMask) { CCSSetting *s; s = findDisplaySettingForPlugin (context, plugin, setting); if (!s) return; if (ccsSettingGetType (s) != TypeButton) return; CCSSettingButtonValue value = ccsSettingGetValue (s)->value.asButton; if ((value.button != button) || (value.buttonModMask != buttonModMask)) { value.button = button; value.buttonModMask = buttonModMask; ccsSetButton (s, value, TRUE); } } static Bool ccsMATEIntegrationBackendKeyValueToStringValue (CCSSettingValue *keyValue, CCSSettingValue *stringValue) { char *newValue; newValue = ccsKeyBindingToString (&keyValue->value.asKey); if (newValue) { if (strcmp (newValue, "Disabled") == 0) { /* Metacity doesn't like "Disabled", it wants "disabled" */ newValue[0] = 'd'; } stringValue->value.asString = newValue; return TRUE; } return FALSE; } static void ccsMATEIntegrationBackendWriteOptionFromSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { GError *err = NULL; CCSSettingType type = TypeNum; CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); if (ccsIntegratedSettingsStorageEmpty (priv->storage)) registerAllIntegratedOptions (integration); if (priv->noWrites) return; /* Do not allow recursing back into writeIntegratedSetting */ ccsIntegrationDisallowIntegratedWrites (integration); CCSSettingType sType = ccsSettingGetType (setting); CCSSettingInfo *sInfo = ccsSettingGetInfo (setting); CCSSettingValue *vSetting = ccsSettingGetValue (setting); CCSSettingValue *v = ccsCopyValue (vSetting, sType, sInfo); if (!v) return; switch (ccsMATEIntegratedSettingInfoGetSpecialOptionType ((CCSMATEIntegratedSettingInfo *) integratedSetting)) { case OptionInt: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeInt); break; case OptionBool: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeBool); break; case OptionString: ccsIntegratedSettingWriteValue (integratedSetting, v, TypeString); break; case OptionKey: { CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (ccsMATEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* Really this is a lie - the writer expects a string * but it needs to know if its a key or a string */ type = TypeKey; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } if (newValue) ccsFreeSettingValueWithType (newValue, TypeString); } break; case OptionSpecial: { const char *settingName = ccsSettingGetName (setting); const char *pluginName = ccsPluginGetName (ccsSettingGetParent (setting)); CCSSettingValue *newValue = calloc (1, sizeof (CCSSettingValue)); newValue->isListChild = FALSE; newValue->parent = NULL; newValue->refCount = 1; if (strcmp (settingName, "current_viewport") == 0) { newValue->value.asBool = !v->value.asBool; type = TypeBool; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "fullscreen_visual_bell") == 0) { const char *newValueString = v->value.asBool ? "fullscreen" : "frame_flash"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if (strcmp (settingName, "click_to_focus") == 0) { const char *newValueString = v->value.asBool ? "click" : "sloppy"; newValue->value.asString = strdup (newValueString); type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } else if ((strcmp (settingName, "run_command_screenshot_key") == 0 || strcmp (settingName, "run_command_window_screenshot_key") == 0 || strcmp (settingName, "run_command_terminal_key") == 0)) { if (ccsMATEIntegrationBackendKeyValueToStringValue (v, newValue)) { /* These are actually stored as strings in the schemas */ type = TypeString; ccsIntegratedSettingWriteValue (integratedSetting, newValue, type); } } else if (((strcmp (settingName, "initiate_button") == 0) && ((strcmp (pluginName, "move") == 0) || (strcmp (pluginName, "resize") == 0))) || ((strcmp (settingName, "window_menu_button") == 0) && (strcmp (pluginName, "core") == 0))) { unsigned int modMask; Bool resizeWithRightButton = FALSE; if ((getButtonBindingForSetting (priv->context, "resize", "initiate_button") == 3) || (getButtonBindingForSetting (priv->context, "core", "window_menu_button") == 2)) { resizeWithRightButton = TRUE; } CCSIntegratedSettingList resizeButtonSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsMATEIntegratedPluginNames.SPECIAL, ccsMATEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName); newValue->value.asBool = resizeWithRightButton; type = TypeBool; ccsIntegratedSettingWriteValue (resizeButtonSetting->data, newValue, type); CCSIntegratedSettingList mouseModifierSetting = ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (priv->storage, ccsMATEIntegratedPluginNames.SPECIAL, ccsMATEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName); modMask = v->value.asButton.buttonModMask; if (setMateMouseButtonModifier (mouseModifierSetting->data, modMask)) { setButtonBindingForSetting (priv->context, "move", "initiate_button", 1, modMask); setButtonBindingForSetting (priv->context, "resize", "initiate_button", resizeWithRightButton ? 3 : 2, modMask); setButtonBindingForSetting (priv->context, "core", "window_menu_button", resizeWithRightButton ? 2 : 3, modMask); } /* We own the returned lists, so free them */ ccsIntegratedSettingListFree (resizeButtonSetting, FALSE); ccsIntegratedSettingListFree (mouseModifierSetting, FALSE); } if (newValue) ccsFreeSettingValueWithType (newValue, type); } break; } if (err) { ccsError ("%s", err->message); g_error_free (err); } if (v) ccsFreeSettingValueWithType (v, sType); /* we should immediately write changed settings */ ccsWriteChangedSettings (priv->context); ccsIntegrationAllowIntegratedWrites (integration); } static void ccsMATEIntegrationBackendUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); Bool needInit = TRUE; CCSIntegratedSettingList iter = integratedSettings; while (iter) { CCSIntegratedSetting *integrated = iter->data; const char *settingName = ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *)integrated); const char *pluginName = ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) integrated); /* Special case for mouse button modifier etc */ if ((strcmp (settingName, "mouse_button_modifier") == 0) || (strcmp (settingName, "resize_with_right_button") == 0)) { CCSSetting *s; if (needInit) { ccsBackendReadInit (priv->backend, priv->context); needInit = FALSE; } s = findDisplaySettingForPlugin (priv->context, "core", "window_menu_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); s = findDisplaySettingForPlugin (priv->context, "move", "initiate_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); s = findDisplaySettingForPlugin (priv->context, "resize", "initiate_button"); if (s) ccsBackendReadSetting (priv->backend, priv->context, s); } else { CCSPlugin *plugin = NULL; plugin = ccsFindPlugin (priv->context, pluginName); if (plugin) { CCSSetting *setting; setting = ccsFindSetting (plugin, settingName); if (setting) { if (needInit) { ccsBackendReadInit (priv->backend, priv->context); needInit = FALSE; } ccsBackendReadSetting (priv->backend, priv->context, setting); } } } iter = iter->next; } } static void ccsMATEIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); priv->noWrites = TRUE; } static void ccsMATEIntegrationAllowIntegratedWrites (CCSIntegration *integration) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); priv->noWrites = FALSE; } static void ccsMATEIntegrationBackendFree (CCSIntegration *integration) { CCMATEIntegrationBackendPrivate *priv = (CCMATEIntegrationBackendPrivate *) ccsObjectGetPrivate (integration); unregisterAllIntegratedOptions (integration); priv->backend = NULL; ccsObjectFinalize (integration); free (integration); } const CCSIntegrationInterface ccsMATEIntegrationBackendInterface = { ccsMATEIntegrationBackendGetIntegratedSetting, ccsMATEIntegrationBackendReadOptionIntoSetting, ccsMATEIntegrationBackendWriteOptionFromSetting, ccsMATEIntegrationBackendUpdateIntegratedSettings, ccsMATEIntegrationDisallowIntegratedWrites, ccsMATEIntegrationAllowIntegratedWrites, ccsMATEIntegrationBackendFree }; static CCMATEIntegrationBackendPrivate * addPrivate (CCSIntegration *backend, CCSObjectAllocationInterface *ai) { CCMATEIntegrationBackendPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCMATEIntegrationBackendPrivate)); if (!priv) { ccsObjectFinalize (backend); free (backend); } ccsObjectSetPrivate (backend, (CCSPrivate *) priv); return priv; } static CCSIntegration * ccsMATEIntegrationBackendNewCommon (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai) { CCSIntegration *integration = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration)); if (!integration) return NULL; ccsObjectInit (integration, ai); CCMATEIntegrationBackendPrivate *priv = addPrivate (integration, ai); priv->backend = backend; priv->context = context; priv->factory = factory; priv->storage = storage; priv->noWrites = FALSE; ccsObjectAddInterface (integration, (const CCSInterface *) &ccsMATEIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); ccsIntegrationRef (integration); return integration; } CCSIntegration * ccsMATEIntegrationBackendNew (CCSBackend *backend, CCSContext *context, CCSIntegratedSettingFactory *factory, CCSIntegratedSettingsStorage *storage, CCSObjectAllocationInterface *ai) { return ccsMATEIntegrationBackendNewCommon (backend, context, factory, storage, ai); } ./compizconfig/integration/mate/src/ccs_mate_integration_constants.c0000644000004100000410000031021313246301623026413 0ustar www-datawww-data#include #include "ccs_mate_integration_constants.h" const char * watchedGConfMateDirectories[] = { METACITY, "/desktop/mate/applications/terminal", "/apps/panel/applets/window_list/prefs" }; const CCSMATEIntegratedSettingNames ccsMATEIntegratedSettingNames = { { "audible_bell", "audible_bell" }, { "click_to_focus", "focus_mode" }, { "raise_on_click", "raise_on_click" }, { "autoraise_delay", "auto_raise_delay" }, { "autoraise", "auto_raise" }, { "current_viewport", "display_all_workspaces" }, { "command_terminal", "exec" }, { "command_window_screenshot", "command_window_screenshot" }, { "command_screenshot", "command_screenshot" }, { "rotate_right_window_key", "move_to_workspace_right" }, { "rotate_left_window_key", "move_to_workspace_left" }, { "rotate_to_12_window_key", "move_to_workspace_12" }, { "rotate_to_11_window_key", "move_to_workspace_11" }, { "rotate_to_10_window_key", "move_to_workspace_10" }, { "rotate_to_9_window_key", "move_to_workspace_9" }, { "rotate_to_8_window_key", "move_to_workspace_8" }, { "rotate_to_7_window_key", "move_to_workspace_7" }, { "rotate_to_6_window_key", "move_to_workspace_6" }, { "rotate_to_5_window_key", "move_to_workspace_5" }, { "rotate_to_4_window_key", "move_to_workspace_4" }, { "rotate_to_3_window_key", "move_to_workspace_3" }, { "rotate_to_2_window_key", "move_to_workspace_2" }, { "rotate_to_1_window_key", "move_to_workspace_1" }, { "put_bottom_key", "move_to_side_s" }, { "put_top_key", "move_to_side_n" }, { "put_right_key", "move_to_side_e" }, { "put_left_key", "move_to_side_w" }, { "put_bottomright_key", "move_to_corner_se" }, { "put_bottomleft_key", "move_to_corner_sw" }, { "put_topright_key", "move_to_corner_ne" }, { "put_topleft_key", "move_to_corner_nw" }, { "down_window_key", "move_to_workspace_down" }, { "up_window_key", "move_to_workspace_up" }, { "right_window_key", "move_to_workspace_right" }, { "left_window_key", "move_to_workspace_left" }, { "right_key", "switch_to_workspace_right" }, { "left_key", "switch_to_workspace_left" }, { "down_key", "switch_to_workspace_down" }, { "up_key", "switch_to_workspace_up" }, { "switch_to_12_key", "switch_to_workspace_12" }, { "switch_to_11_key", "switch_to_workspace_11" }, { "switch_to_10_key", "switch_to_workspace_10" }, { "switch_to_9_key", "switch_to_workspace_9" }, { "switch_to_8_key", "switch_to_workspace_8" }, { "switch_to_7_key", "switch_to_workspace_7" }, { "switch_to_6_key", "switch_to_workspace_6" }, { "switch_to_5_key", "switch_to_workspace_5" }, { "switch_to_4_key", "switch_to_workspace_4" }, { "switch_to_3_key", "switch_to_workspace_3" }, { "switch_to_2_key", "switch_to_workspace_2" }, { "switch_to_1_key", "switch_to_workspace_1" }, { "rotate_right_key", "switch_to_workspace_right" }, { "rotate_left_key", "switch_to_workspace_left" }, { "rotate_to_12_key", "switch_to_workspace_12" }, { "rotate_to_11_key", "switch_to_workspace_11" }, { "rotate_to_10_key", "switch_to_workspace_10" }, { "rotate_to_9_key", "switch_to_workspace_9" }, { "rotate_to_8_key", "switch_to_workspace_8" }, { "rotate_to_7_key", "switch_to_workspace_7" }, { "rotate_to_6_key", "switch_to_workspace_6" }, { "rotate_to_5_key", "switch_to_workspace_5" }, { "rotate_to_4_key", "switch_to_workspace_4" }, { "rotate_to_3_key", "switch_to_workspace_3" }, { "rotate_to_2_key", "switch_to_workspace_2" }, { "rotate_to_1_key", "switch_to_workspace_1" }, { "run_command11_key", "run_command_12" }, { "run_command10_key", "run_command_11" }, { "run_command9_key", "run_command_10" }, { "run_command8_key", "run_command_9" }, { "run_command7_key", "run_command_8" }, { "run_command6_key", "run_command_7" }, { "run_command5_key", "run_command_6" }, { "run_command4_key", "run_command_5" }, { "run_command3_key", "run_command_4" }, { "run_command2_key", "run_command_3" }, { "run_command1_key", "run_command_2" }, { "run_command0_key", "run_command_1" }, { "command11", "command_12" }, { "command10", "command_11" }, { "command9", "command_10" }, { "command8", "command_9" }, { "command7", "command_8" }, { "command6", "command_7" }, { "command5", "command_6" }, { "command4", "command_5" }, { "command3", "command_4" }, { "command2", "command_3" }, { "command1", "command_2" }, { "command0", "command_1" }, { "toggle_fullscreen_key", "toggle_fullscreen" }, { "toggle_sticky_key", "toggle_on_all_workspaces" }, { "prev_key", "switch_windows_backward" }, { "next_key", "switch_windows" }, { "fullscreen_visual_bell", "visual_bell_type" }, { "visual_bell", "visual_bell" }, { "resize_with_right_button", "resize_with_right_button" }, { "mouse_button_modifier", "mouse_button_modifier" }, { "window_menu_button", "activate_window_menu" }, { "initiate_button", "begin_resize" }, { "initiate_button", "begin_move" }, { "window_menu_key", "activate_window_menu" }, { "initiate_key", "begin_resize" }, { "initiate_key", "begin_move" }, { "show_desktop_key", "show_desktop" }, { "toggle_window_shaded_key", "toggle_shaded" }, { "close_window_key", "close" }, { "lower_window_key", "lower" }, { "raise_window_key", "raise" }, { "maximize_window_vertically_key", "maximize_vertically" }, { "maximize_window_horizontally_key", "maximize_horizontally" }, { "unmaximize_or_minimize_window_key", "unmaximize" }, { "maximize_window_key", "maximize" }, { "minimize_window_key", "minimize" }, { "toggle_window_maximized_key", "toggle_maximized" }, { "run_command_terminal_key", "run_command_terminal" }, { "run_command_window_screenshot_key", "run_command_window_screenshot" }, { "run_command_screenshot_key", "run_command_screenshot" }, { "main_menu_key", "panel_main_menu" }, { "run_key", "panel_run_dialog" } }; const CCSGConfIntegrationCategories ccsGConfIntegrationCategories = { METACITY "/general/", "/apps/panel/applets/window_list/prefs/", "/desktop/mate/applications/terminal/", METACITY "/keybinding_commands/", METACITY "/window_keybindings/", METACITY "/global_keybindings/" }; const CCSMATEIntegratedPluginNames ccsMATEIntegratedPluginNames = { "core", "thumbnail", "matecompat", "rotate", "put", "wall", "vpswitch", "commands", "extrawm", "resize", "move", "staticswitcher", "fade", "__special" }; static gpointer ccsMATEIntegrationInitializeIntegratedSettingsList (gpointer data) { CCSMATEIntegratedSettingsList *array = (CCSMATEIntegratedSettingsList *) data; const CCSMATEIntegratedPluginNames *plugins = &ccsMATEIntegratedPluginNames; const CCSMATEIntegratedSettingNames *settings = &ccsMATEIntegratedSettingNames; array[0].pluginName = plugins->CORE; array[0].settingName = settings->CORE_AUDIBLE_BELL.compizName; array[1].pluginName = plugins->CORE; array[1].settingName = settings->CORE_CLICK_TO_FOCUS.compizName; array[2].pluginName = plugins->CORE; array[2].settingName = settings->CORE_RAISE_ON_CLICK.compizName; array[3].pluginName = plugins->CORE; array[3].settingName = settings->CORE_AUTORAISE_DELAY.compizName; array[4].pluginName = plugins->CORE; array[4].settingName = settings->CORE_AUTORAISE.compizName; array[5].pluginName = plugins->THUMBNAIL; array[5].settingName = settings->THUMBNAIL_CURRENT_VIEWPORT.compizName; array[6].pluginName = plugins->MATECOMPAT; array[6].settingName = settings->MATECOMPAT_COMMAND_TERMINAL.compizName; array[7].pluginName = plugins->MATECOMPAT; array[7].settingName = settings->MATECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName; array[8].pluginName = plugins->MATECOMPAT; array[8].settingName = settings->MATECOMPAT_COMMAND_SCREENSHOT.compizName; array[9].pluginName = plugins->ROTATE; array[9].settingName = settings->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName; array[10].pluginName = plugins->ROTATE; array[10].settingName = settings->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName; array[11].pluginName = plugins->ROTATE; array[11].settingName = settings->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName; array[12].pluginName = plugins->ROTATE; array[12].settingName = settings->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName; array[13].pluginName = plugins->ROTATE; array[13].settingName = settings->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName; array[14].pluginName = plugins->ROTATE; array[14].settingName = settings->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName; array[15].pluginName = plugins->ROTATE; array[15].settingName = settings->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName; array[16].pluginName = plugins->ROTATE; array[16].settingName = settings->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName; array[17].pluginName = plugins->ROTATE; array[17].settingName = settings->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName; array[18].pluginName = plugins->ROTATE; array[18].settingName = settings->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName; array[19].pluginName = plugins->ROTATE; array[19].settingName = settings->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName; array[20].pluginName = plugins->ROTATE; array[20].settingName = settings->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName; array[21].pluginName = plugins->ROTATE; array[21].settingName = settings->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName; array[22].pluginName = plugins->ROTATE; array[22].settingName = settings->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName; array[23].pluginName = plugins->PUT; array[23].settingName = settings->PUT_PUT_BOTTOM_KEY.compizName; array[24].pluginName = plugins->PUT; array[24].settingName = settings->PUT_PUT_TOP_KEY.compizName; array[25].pluginName = plugins->PUT; array[25].settingName = settings->PUT_PUT_RIGHT_KEY.compizName; array[26].pluginName = plugins->PUT; array[26].settingName = settings->PUT_PUT_LEFT_KEY.compizName; array[27].pluginName = plugins->PUT; array[27].settingName = settings->PUT_PUT_BOTTOMRIGHT_KEY.compizName; array[28].pluginName = plugins->PUT; array[28].settingName = settings->PUT_PUT_BOTTOMLEFT_KEY.compizName; array[29].pluginName = plugins->PUT; array[29].settingName = settings->PUT_PUT_TOPRIGHT_KEY.compizName; array[30].pluginName = plugins->PUT; array[30].settingName = settings->PUT_PUT_TOPLEFT_KEY.compizName; array[31].pluginName = plugins->WALL; array[31].settingName = settings->WALL_DOWN_WINDOW_KEY.compizName; array[32].pluginName = plugins->WALL; array[32].settingName = settings->WALL_UP_WINDOW_KEY.compizName; array[33].pluginName = plugins->WALL; array[33].settingName = settings->WALL_RIGHT_WINDOW_KEY.compizName; array[34].pluginName = plugins->WALL; array[34].settingName = settings->WALL_LEFT_WINDOW_KEY.compizName; array[35].pluginName = plugins->WALL; array[35].settingName = settings->WALL_RIGHT_KEY.compizName; array[36].pluginName = plugins->WALL; array[36].settingName = settings->WALL_LEFT_KEY.compizName; array[37].pluginName = plugins->WALL; array[37].settingName = settings->WALL_DOWN_KEY.compizName; array[38].pluginName = plugins->WALL; array[38].settingName = settings->WALL_UP_KEY.compizName; array[39].pluginName = plugins->VPSWITCH; array[39].settingName = settings->VPSWITCH_SWITCH_TO_12_KEY.compizName; array[40].pluginName = plugins->VPSWITCH; array[40].settingName = settings->VPSWITCH_SWITCH_TO_11_KEY.compizName; array[41].pluginName = plugins->VPSWITCH; array[41].settingName = settings->VPSWITCH_SWITCH_TO_10_KEY.compizName; array[42].pluginName = plugins->VPSWITCH; array[42].settingName = settings->VPSWITCH_SWITCH_TO_9_KEY.compizName; array[43].pluginName = plugins->VPSWITCH; array[43].settingName = settings->VPSWITCH_SWITCH_TO_8_KEY.compizName; array[44].pluginName = plugins->VPSWITCH; array[44].settingName = settings->VPSWITCH_SWITCH_TO_7_KEY.compizName; array[45].pluginName = plugins->VPSWITCH; array[45].settingName = settings->VPSWITCH_SWITCH_TO_6_KEY.compizName; array[46].pluginName = plugins->VPSWITCH; array[46].settingName = settings->VPSWITCH_SWITCH_TO_5_KEY.compizName; array[47].pluginName = plugins->VPSWITCH; array[47].settingName = settings->VPSWITCH_SWITCH_TO_4_KEY.compizName; array[48].pluginName = plugins->VPSWITCH; array[48].settingName = settings->VPSWITCH_SWITCH_TO_3_KEY.compizName; array[49].pluginName = plugins->VPSWITCH; array[49].settingName = settings->VPSWITCH_SWITCH_TO_2_KEY.compizName; array[50].pluginName = plugins->VPSWITCH; array[50].settingName = settings->VPSWITCH_SWITCH_TO_1_KEY.compizName; array[51].pluginName = plugins->ROTATE; array[51].settingName = settings->ROTATE_ROTATE_RIGHT_KEY.compizName; array[52].pluginName = plugins->ROTATE; array[52].settingName = settings->ROTATE_ROTATE_LEFT_KEY.compizName; array[53].pluginName = plugins->ROTATE; array[53].settingName = settings->ROTATE_ROTATE_TO_12_KEY.compizName; array[54].pluginName = plugins->ROTATE; array[54].settingName = settings->ROTATE_ROTATE_TO_11_KEY.compizName; array[55].pluginName = plugins->ROTATE; array[55].settingName = settings->ROTATE_ROTATE_TO_10_KEY.compizName; array[56].pluginName = plugins->ROTATE; array[56].settingName = settings->ROTATE_ROTATE_TO_9_KEY.compizName; array[57].pluginName = plugins->ROTATE; array[57].settingName = settings->ROTATE_ROTATE_TO_8_KEY.compizName; array[58].pluginName = plugins->ROTATE; array[58].settingName = settings->ROTATE_ROTATE_TO_7_KEY.compizName; array[59].pluginName = plugins->ROTATE; array[59].settingName = settings->ROTATE_ROTATE_TO_6_KEY.compizName; array[60].pluginName = plugins->ROTATE; array[60].settingName = settings->ROTATE_ROTATE_TO_5_KEY.compizName; array[61].pluginName = plugins->ROTATE; array[61].settingName = settings->ROTATE_ROTATE_TO_4_KEY.compizName; array[62].pluginName = plugins->ROTATE; array[62].settingName = settings->ROTATE_ROTATE_TO_3_KEY.compizName; array[63].pluginName = plugins->ROTATE; array[63].settingName = settings->ROTATE_ROTATE_TO_2_KEY.compizName; array[64].pluginName = plugins->ROTATE; array[64].settingName = settings->ROTATE_ROTATE_TO_1_KEY.compizName; array[65].pluginName = plugins->COMMANDS; array[65].settingName = settings->COMMANDS_RUN_COMMAND11_KEY.compizName; array[66].pluginName = plugins->COMMANDS; array[66].settingName = settings->COMMANDS_RUN_COMMAND10_KEY.compizName; array[67].pluginName = plugins->COMMANDS; array[67].settingName = settings->COMMANDS_RUN_COMMAND9_KEY.compizName; array[68].pluginName = plugins->COMMANDS; array[68].settingName = settings->COMMANDS_RUN_COMMAND8_KEY.compizName; array[69].pluginName = plugins->COMMANDS; array[69].settingName = settings->COMMANDS_RUN_COMMAND7_KEY.compizName; array[70].pluginName = plugins->COMMANDS; array[70].settingName = settings->COMMANDS_RUN_COMMAND6_KEY.compizName; array[71].pluginName = plugins->COMMANDS; array[71].settingName = settings->COMMANDS_RUN_COMMAND5_KEY.compizName; array[72].pluginName = plugins->COMMANDS; array[72].settingName = settings->COMMANDS_RUN_COMMAND4_KEY.compizName; array[73].pluginName = plugins->COMMANDS; array[73].settingName = settings->COMMANDS_RUN_COMMAND3_KEY.compizName; array[74].pluginName = plugins->COMMANDS; array[74].settingName = settings->COMMANDS_RUN_COMMAND2_KEY.compizName; array[75].pluginName = plugins->COMMANDS; array[75].settingName = settings->COMMANDS_RUN_COMMAND1_KEY.compizName; array[76].pluginName = plugins->COMMANDS; array[76].settingName = settings->COMMANDS_RUN_COMMAND0_KEY.compizName; array[77].pluginName = plugins->COMMANDS; array[77].settingName = settings->COMMANDS_COMMAND11.compizName; array[78].pluginName = plugins->COMMANDS; array[78].settingName = settings->COMMANDS_COMMAND10.compizName; array[79].pluginName = plugins->COMMANDS; array[79].settingName = settings->COMMANDS_COMMAND9.compizName; array[80].pluginName = plugins->COMMANDS; array[80].settingName = settings->COMMANDS_COMMAND8.compizName; array[81].pluginName = plugins->COMMANDS; array[81].settingName = settings->COMMANDS_COMMAND7.compizName; array[82].pluginName = plugins->COMMANDS; array[82].settingName = settings->COMMANDS_COMMAND6.compizName; array[83].pluginName = plugins->COMMANDS; array[83].settingName = settings->COMMANDS_COMMAND5.compizName; array[84].pluginName = plugins->COMMANDS; array[84].settingName = settings->COMMANDS_COMMAND4.compizName; array[85].pluginName = plugins->COMMANDS; array[85].settingName = settings->COMMANDS_COMMAND3.compizName; array[86].pluginName = plugins->COMMANDS; array[86].settingName = settings->COMMANDS_COMMAND2.compizName; array[87].pluginName = plugins->COMMANDS; array[87].settingName = settings->COMMANDS_COMMAND1.compizName; array[88].pluginName = plugins->COMMANDS; array[88].settingName = settings->COMMANDS_COMMAND0.compizName; array[89].pluginName = plugins->EXTRAWM; array[89].settingName = settings->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName; array[90].pluginName = plugins->EXTRAWM; array[90].settingName = settings->EXTRAWM_TOGGLE_STICKY_KEY.compizName; array[91].pluginName = plugins->STATICSWITCHER; array[91].settingName = settings->STATICSWITCHER_PREV_KEY.compizName; array[92].pluginName = plugins->STATICSWITCHER; array[92].settingName = settings->STATICSWITCHER_NEXT_KEY.compizName; array[93].pluginName = plugins->FADE; array[93].settingName = settings->FADE_FULLSCREEN_VISUAL_BELL.compizName; array[94].pluginName = plugins->FADE; array[94].settingName = settings->FADE_VISUAL_BELL.compizName; array[95].pluginName = plugins->SPECIAL; array[95].settingName = settings->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName; array[96].pluginName = plugins->SPECIAL; array[96].settingName = settings->NULL_MOUSE_BUTTON_MODIFIER.compizName; array[97].pluginName = plugins->CORE; array[97].settingName = settings->CORE_WINDOW_MENU_BUTTON.compizName; array[98].pluginName = plugins->RESIZE; array[98].settingName = settings->RESIZE_INITIATE_BUTTON.compizName; array[99].pluginName = plugins->MOVE; array[99].settingName = settings->MOVE_INITIATE_BUTTON.compizName; array[100].pluginName = plugins->CORE; array[100].settingName = settings->CORE_WINDOW_MENU_KEY.compizName; array[101].pluginName = plugins->RESIZE; array[101].settingName = settings->RESIZE_INITIATE_KEY.compizName; array[102].pluginName = plugins->MOVE; array[102].settingName = settings->MOVE_INITIATE_KEY.compizName; array[103].pluginName = plugins->CORE; array[103].settingName = settings->CORE_SHOW_DESKTOP_KEY.compizName; array[104].pluginName = plugins->CORE; array[104].settingName = settings->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName; array[105].pluginName = plugins->CORE; array[105].settingName = settings->CORE_CLOSE_WINDOW_KEY.compizName; array[106].pluginName = plugins->CORE; array[106].settingName = settings->CORE_LOWER_WINDOW_KEY.compizName; array[107].pluginName = plugins->CORE; array[107].settingName = settings->CORE_RAISE_WINDOW_KEY.compizName; array[108].pluginName = plugins->CORE; array[108].settingName = settings->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName; array[109].pluginName = plugins->CORE; array[109].settingName = settings->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName; array[110].pluginName = plugins->CORE; array[110].settingName = settings->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName; array[111].pluginName = plugins->CORE; array[111].settingName = settings->CORE_MAXIMIZE_WINDOW_KEY.compizName; array[112].pluginName = plugins->CORE; array[112].settingName = settings->CORE_MINIMIZE_WINDOW_KEY.compizName; array[113].pluginName = plugins->CORE; array[113].settingName = settings->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName; array[114].pluginName = plugins->MATECOMPAT; array[114].settingName = settings->MATECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName; array[115].pluginName = plugins->MATECOMPAT; array[115].settingName = settings->MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName; array[116].pluginName = plugins->MATECOMPAT; array[116].settingName = settings->MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName; array[117].pluginName = plugins->MATECOMPAT; array[117].settingName = settings->MATECOMPAT_MAIN_MENU_KEY.compizName; array[118].pluginName = plugins->MATECOMPAT; array[118].settingName = settings->MATECOMPAT_RUN_KEY.compizName; return NULL; } const CCSMATEIntegratedSettingsList * ccsMATEIntegratedSettingsList () { static GOnce initIntegratedSettings = G_ONCE_INIT; static CCSMATEIntegratedSettingsList settings[CCS_MATE_INTEGRATED_SETTINGS_LIST_SIZE]; g_once (&initIntegratedSettings, ccsMATEIntegrationInitializeIntegratedSettingsList, (gpointer) settings); return settings; } gpointer ccsMATEGSettingsIntegrationInitializeIntegratedSchemasQuarks (gpointer data) { CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = (CCSGSettingsWrapperIntegratedSchemasQuarks *) data; static const char *org_compiz_integrated = "org.compiz.integrated"; static const char *org_mate_desktop_wm_keybindings = "org.mate.Marco.global-keybindings"; static const char *org_mate_desktop_wm_preferences = "org.mate.Marco.general"; static const char *org_mate_settings_daemon_plugins_media_keys = "org.mate.SettingsDaemon.plugins.media-keys"; static const char *org_mate_desktop_default_applications_terminal = "org.mate.applications-terminal"; quarks->ORG_COMPIZ_INTEGRATED = g_quark_from_string (org_compiz_integrated); quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS = g_quark_from_string (org_mate_desktop_wm_keybindings); quarks->ORG_MATE_DESKTOP_WM_PREFERENCES = g_quark_from_string (org_mate_desktop_wm_preferences); quarks->ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS = g_quark_from_string (org_mate_settings_daemon_plugins_media_keys); quarks->ORG_MATE_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL = g_quark_from_string (org_mate_desktop_default_applications_terminal); return NULL; } const CCSGSettingsWrapperIntegratedSchemasQuarks * ccsMATEGSettingsWrapperQuarks () { static GOnce initIntegratedSchemaQuarks = G_ONCE_INIT; static CCSGSettingsWrapperIntegratedSchemasQuarks quarks; g_once (&initIntegratedSchemaQuarks, ccsMATEGSettingsIntegrationInitializeIntegratedSchemasQuarks, (gpointer) &quarks); return &quarks; } static void destroyHashTableInternal (void *ht) { g_hash_table_unref ((GHashTable *) ht); } GHashTable * ccsMATEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *matecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSMATEIntegratedSettingNames *names = &ccsMATEIntegratedSettingNames; const CCSMATEIntegratedPluginNames *plugins = &ccsMATEIntegratedPluginNames; const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsMATEGSettingsWrapperQuarks (); g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MATECOMPAT, matecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_TERMINAL.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_SCREENSHOT.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_MAIN_MENU_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_KEY.compizName, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS)); return masterHashTable; } GHashTable * ccsMATEIntegrationPopulateCategoriesHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *matecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSMATEIntegratedSettingNames *names = &ccsMATEIntegratedSettingNames; const CCSGConfIntegrationCategories *categories = &ccsGConfIntegrationCategories; const CCSMATEIntegratedPluginNames *plugins = &ccsMATEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MATECOMPAT, matecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, (gpointer) categories->APPS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_TERMINAL.compizName, (gpointer) categories->DESKTOP); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_SCREENSHOT.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, (gpointer) categories->KEYBINDING_COMMANDS); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, (gpointer) categories->GENERAL); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, (gpointer) categories->WINDOW_KEYBINDINGS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_MAIN_MENU_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_KEY.compizName, (gpointer) categories->GLOBAL_KEYBINDINGS); return masterHashTable; } GHashTable * ccsMATEIntegrationPopulateSpecialTypesHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *matecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSMATEIntegratedSettingNames *names = &ccsMATEIntegratedSettingNames; const CCSMATEIntegratedPluginNames *plugins = &ccsMATEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MATECOMPAT, matecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, GINT_TO_POINTER (OptionInt)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_TERMINAL.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_SCREENSHOT.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, GINT_TO_POINTER (OptionString)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, GINT_TO_POINTER (OptionBool)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, GINT_TO_POINTER (OptionSpecial)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_MAIN_MENU_KEY.compizName, GINT_TO_POINTER (OptionKey)); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_KEY.compizName, GINT_TO_POINTER (OptionKey)); return masterHashTable; } GHashTable * ccsMATEIntegrationPopulateSettingNameToMATENameHashTables () { GHashTable *masterHashTable = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroyHashTableInternal); GHashTable *coreHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *thumbnailHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *matecompatHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *rotateHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *putHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *wallHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *vpswitchHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *commandsHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *extrawmHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *resizeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *moveHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *staticswitcherHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *fadeHashTable = g_hash_table_new (g_str_hash, g_str_equal); GHashTable *specialHashTable = g_hash_table_new (g_str_hash, g_str_equal); const CCSMATEIntegratedSettingNames *names = &ccsMATEIntegratedSettingNames; const CCSMATEIntegratedPluginNames *plugins = &ccsMATEIntegratedPluginNames; g_hash_table_insert (masterHashTable, (gpointer) plugins->CORE, coreHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->THUMBNAIL, thumbnailHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MATECOMPAT, matecompatHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->ROTATE, rotateHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->PUT, putHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->WALL, wallHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->VPSWITCH, vpswitchHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->COMMANDS, commandsHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->EXTRAWM, extrawmHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->STATICSWITCHER, staticswitcherHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->FADE, fadeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->RESIZE, resizeHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->MOVE, moveHashTable); g_hash_table_insert (masterHashTable, (gpointer) plugins->SPECIAL, specialHashTable); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUDIBLE_BELL.compizName, (gpointer) names->CORE_AUDIBLE_BELL.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLICK_TO_FOCUS.compizName, (gpointer) names->CORE_CLICK_TO_FOCUS.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_ON_CLICK.compizName, (gpointer) names->CORE_RAISE_ON_CLICK.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE_DELAY.compizName, (gpointer) names->CORE_AUTORAISE_DELAY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_AUTORAISE.compizName, (gpointer) names->CORE_AUTORAISE.mateName); g_hash_table_insert (thumbnailHashTable, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.compizName, (gpointer) names->THUMBNAIL_CURRENT_VIEWPORT.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_TERMINAL.compizName, (gpointer) names->MATECOMPAT_COMMAND_TERMINAL.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_WINDOW_SCREENSHOT.compizName, (gpointer) names->MATECOMPAT_COMMAND_WINDOW_SCREENSHOT.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_COMMAND_SCREENSHOT.compizName, (gpointer) names->MATECOMPAT_COMMAND_SCREENSHOT.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_RIGHT_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_LEFT_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_12_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_11_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_10_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_9_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_8_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_7_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_6_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_5_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_4_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_3_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_2_WINDOW_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_1_WINDOW_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOM_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOM_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOP_KEY.compizName, (gpointer) names->PUT_PUT_TOP_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_RIGHT_KEY.compizName, (gpointer) names->PUT_PUT_RIGHT_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_LEFT_KEY.compizName, (gpointer) names->PUT_PUT_LEFT_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOMRIGHT_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.compizName, (gpointer) names->PUT_PUT_BOTTOMLEFT_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.compizName, (gpointer) names->PUT_PUT_TOPRIGHT_KEY.mateName); g_hash_table_insert (putHashTable, (gpointer) names->PUT_PUT_TOPLEFT_KEY.compizName, (gpointer) names->PUT_PUT_TOPLEFT_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_WINDOW_KEY.compizName, (gpointer) names->WALL_DOWN_WINDOW_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_WINDOW_KEY.compizName, (gpointer) names->WALL_UP_WINDOW_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_WINDOW_KEY.compizName, (gpointer) names->WALL_RIGHT_WINDOW_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_WINDOW_KEY.compizName, (gpointer) names->WALL_LEFT_WINDOW_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_RIGHT_KEY.compizName, (gpointer) names->WALL_RIGHT_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_LEFT_KEY.compizName, (gpointer) names->WALL_LEFT_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_DOWN_KEY.compizName, (gpointer) names->WALL_DOWN_KEY.mateName); g_hash_table_insert (wallHashTable, (gpointer) names->WALL_UP_KEY.compizName, (gpointer) names->WALL_UP_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_12_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_11_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_10_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_9_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_8_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_7_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_6_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_5_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_4_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_3_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_2_KEY.mateName); g_hash_table_insert (vpswitchHashTable, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.compizName, (gpointer) names->VPSWITCH_SWITCH_TO_1_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.compizName, (gpointer) names->ROTATE_ROTATE_RIGHT_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.compizName, (gpointer) names->ROTATE_ROTATE_LEFT_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_12_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_11_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_10_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_9_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_8_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_7_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_6_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_5_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_4_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_3_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_2_KEY.mateName); g_hash_table_insert (rotateHashTable, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.compizName, (gpointer) names->ROTATE_ROTATE_TO_1_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND11_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND10_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND9_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND8_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND7_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND6_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND5_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND4_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND3_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND2_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND1_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.compizName, (gpointer) names->COMMANDS_RUN_COMMAND0_KEY.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND11.compizName, (gpointer) names->COMMANDS_COMMAND11.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND10.compizName, (gpointer) names->COMMANDS_COMMAND10.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND9.compizName, (gpointer) names->COMMANDS_COMMAND9.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND8.compizName, (gpointer) names->COMMANDS_COMMAND8.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND7.compizName, (gpointer) names->COMMANDS_COMMAND7.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND6.compizName, (gpointer) names->COMMANDS_COMMAND6.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND5.compizName, (gpointer) names->COMMANDS_COMMAND5.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND4.compizName, (gpointer) names->COMMANDS_COMMAND4.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND3.compizName, (gpointer) names->COMMANDS_COMMAND3.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND2.compizName, (gpointer) names->COMMANDS_COMMAND2.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND1.compizName, (gpointer) names->COMMANDS_COMMAND1.mateName); g_hash_table_insert (commandsHashTable, (gpointer) names->COMMANDS_COMMAND0.compizName, (gpointer) names->COMMANDS_COMMAND0.mateName); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.compizName, (gpointer) names->EXTRAWM_TOGGLE_FULLSCREEN_KEY.mateName); g_hash_table_insert (extrawmHashTable, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.compizName, (gpointer) names->EXTRAWM_TOGGLE_STICKY_KEY.mateName); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_PREV_KEY.compizName, (gpointer) names->STATICSWITCHER_PREV_KEY.mateName); g_hash_table_insert (staticswitcherHashTable, (gpointer) names->STATICSWITCHER_NEXT_KEY.compizName, (gpointer) names->STATICSWITCHER_NEXT_KEY.mateName); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.compizName, (gpointer) names->FADE_FULLSCREEN_VISUAL_BELL.mateName); g_hash_table_insert (fadeHashTable, (gpointer) names->FADE_VISUAL_BELL.compizName, (gpointer) names->FADE_VISUAL_BELL.mateName); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.compizName, (gpointer) names->NULL_RESIZE_WITH_RIGHT_BUTTON.mateName); g_hash_table_insert (specialHashTable, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.compizName, (gpointer) names->NULL_MOUSE_BUTTON_MODIFIER.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_BUTTON.compizName, (gpointer) names->CORE_WINDOW_MENU_BUTTON.mateName); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_BUTTON.compizName, (gpointer) names->RESIZE_INITIATE_BUTTON.mateName); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_BUTTON.compizName, (gpointer) names->MOVE_INITIATE_BUTTON.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_WINDOW_MENU_KEY.compizName, (gpointer) names->CORE_WINDOW_MENU_KEY.mateName); g_hash_table_insert (resizeHashTable, (gpointer) names->RESIZE_INITIATE_KEY.compizName, (gpointer) names->RESIZE_INITIATE_KEY.mateName); g_hash_table_insert (moveHashTable, (gpointer) names->MOVE_INITIATE_KEY.compizName, (gpointer) names->MOVE_INITIATE_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_SHOW_DESKTOP_KEY.compizName, (gpointer) names->CORE_SHOW_DESKTOP_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.compizName, (gpointer) names->CORE_TOGGLE_WINDOW_SHADED_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_CLOSE_WINDOW_KEY.compizName, (gpointer) names->CORE_CLOSE_WINDOW_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_LOWER_WINDOW_KEY.compizName, (gpointer) names->CORE_LOWER_WINDOW_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_RAISE_WINDOW_KEY.compizName, (gpointer) names->CORE_RAISE_WINDOW_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_VERTICALLY_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_HORIZONTALLY_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_UNMAXIMIZE_OR_MINIMIZE_WINDOW_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_MAXIMIZE_WINDOW_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.compizName, (gpointer) names->CORE_MINIMIZE_WINDOW_KEY.mateName); g_hash_table_insert (coreHashTable, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.compizName, (gpointer) names->CORE_TOGGLE_WINDOW_MAXIMIZED_KEY.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_TERMINAL_KEY.compizName, (gpointer) names->MATECOMPAT_RUN_COMMAND_TERMINAL_KEY.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.compizName, (gpointer) names->MATECOMPAT_RUN_COMMAND_WINDOW_SCREENSHOT_KEY.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.compizName, (gpointer) names->MATECOMPAT_RUN_COMMAND_SCREENSHOT_KEY.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_MAIN_MENU_KEY.compizName, (gpointer) names->MATECOMPAT_MAIN_MENU_KEY.mateName); g_hash_table_insert (matecompatHashTable, (gpointer) names->MATECOMPAT_RUN_KEY.compizName, (gpointer) names->MATECOMPAT_RUN_KEY.mateName); return masterHashTable; } ./compizconfig/integration/mate/src/ccs_mate_integrated_setting.c0000644000004100000410000001236713246301623025670 0ustar www-datawww-data#include #include #include #include #include #include #include "ccs_mate_integrated_setting.h" #include "ccs_mate_integration_constants.h" INTERFACE_TYPE (CCSMATEIntegratedSettingInfoInterface); CCSREF_OBJ (MATEIntegratedSettingInfo, CCSMATEIntegratedSettingInfo); SpecialOptionType ccsMATEIntegratedSettingInfoGetSpecialOptionType (CCSMATEIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSMATEIntegratedSettingInfoInterface, info))->getSpecialOptionType) (info); } const char * ccsMATEIntegratedSettingInfoGetMATEName (CCSMATEIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSMATEIntegratedSettingInfoInterface, info))->getMATEName) (info); } /* CCSMATEIntegratedSettingDefaultImpl implementation */ typedef struct _CCSMATEIntegratedSettingInfoDefaultImplPrivate CCSMATEIntegratedSettingInfoDefaultImplPrivate; struct _CCSMATEIntegratedSettingInfoDefaultImplPrivate { SpecialOptionType type; const char *mateName; CCSIntegratedSettingInfo *sharedIntegratedSettingInfo; }; Bool ccsMATEIntegrationFindSettingsMatchingPredicate (CCSIntegratedSetting *setting, void *userData) { const char *findMateName = (const char *) userData; const char *mateNameOfSetting = ccsMATEIntegratedSettingInfoGetMATEName ((CCSMATEIntegratedSettingInfo *) setting); if (strcmp (findMateName, mateNameOfSetting) == 0) return TRUE; return FALSE; } SpecialOptionType ccsMATEIntegratedSettingGetSpecialOptionDefault (CCSMATEIntegratedSettingInfo *info) { CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSMATEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return priv->type; } const char * ccsMATEIntegratedSettingGetMATENameDefault (CCSMATEIntegratedSettingInfo *info) { CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSMATEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return priv->mateName; } const char * ccsMATEIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *info) { CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSMATEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoPluginName (priv->sharedIntegratedSettingInfo); } const char * ccsMATEIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *info) { CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSMATEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoSettingName (priv->sharedIntegratedSettingInfo); } CCSSettingType ccsMATEIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *info) { CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSMATEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); return ccsIntegratedSettingInfoGetType (priv->sharedIntegratedSettingInfo); } void ccsMATESharedIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (CCSMATEIntegratedSettingInfoDefaultImplPrivate *) ccsObjectGetPrivate (info); ccsIntegratedSettingInfoUnref (priv->sharedIntegratedSettingInfo); ccsObjectFinalize (info); (*info->object.object_allocation->free_) (info->object.object_allocation->allocator, info); } static void ccsMATEIntegratedSettingInfoFree (CCSMATEIntegratedSettingInfo *info) { ccsMATESharedIntegratedSettingInfoFree ((CCSIntegratedSettingInfo *) info); } CCSMATEIntegratedSettingInfoInterface ccsMATEIntegratedSettingInfoDefaultImplInterface = { ccsMATEIntegratedSettingGetSpecialOptionDefault, ccsMATEIntegratedSettingGetMATENameDefault, ccsMATEIntegratedSettingInfoFree }; const CCSIntegratedSettingInfoInterface ccsMATEIntegratedSettingInfoInterface = { ccsMATEIntegratedSettingInfoPluginName, ccsMATEIntegratedSettingInfoSettingName, ccsMATEIntegratedSettingInfoGetType, ccsMATESharedIntegratedSettingInfoFree }; void ccsFreeMATEIntegratedSettingInfo (CCSMATEIntegratedSettingInfo *info) { (*(GET_INTERFACE (CCSMATEIntegratedSettingInfoInterface, info))->free) (info); } CCSMATEIntegratedSettingInfo * ccsMATEIntegratedSettingInfoNew (CCSIntegratedSettingInfo *base, SpecialOptionType type, const char *mateName, CCSObjectAllocationInterface *ai) { CCSMATEIntegratedSettingInfo *info = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSMATEIntegratedSettingInfo)); if (!info) return NULL; CCSMATEIntegratedSettingInfoDefaultImplPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSMATEIntegratedSettingInfoDefaultImplPrivate)); if (!priv) { (*ai->free_) (ai->allocator, info); return NULL; } priv->sharedIntegratedSettingInfo = base; priv->mateName = mateName; priv->type = type; ccsObjectInit (info, ai); ccsObjectSetPrivate (info, (CCSPrivate *) priv); ccsObjectAddInterface (info, (const CCSInterface *) &ccsMATEIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (info, (const CCSInterface *) &ccsMATEIntegratedSettingInfoDefaultImplInterface, GET_INTERFACE_TYPE (CCSMATEIntegratedSettingInfoInterface)); ccsIntegratedSettingInfoRef ((CCSIntegratedSettingInfo *) info); return info; } ./compizconfig/integration/mate/tests/0000755000004100000410000000000013246301623020345 5ustar www-datawww-data./compizconfig/integration/mate/tests/compizconfig_test_ccs_mate_integration.cpp0000644000004100000410000011247513246301623031052 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "compizconfig_ccs_mock_mate_integrated_setting_composition.h" #include "compizconfig_ccs_setting_value_matcher.h" namespace cc = compiz::config; namespace cci = compiz::config::impl; using ::testing::Pointee; using ::testing::Eq; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; using ::testing::DoAll; using ::testing::Values; using ::testing::WithParamInterface; using ::testing::_; namespace { typedef std::tr1::tuple > IntegratedSettingWithMock; typedef boost::shared_ptr IntegratedSettingWithMockPtr; IntegratedSettingWithMockPtr createIntegratedSettingCompositionFromMock (const std::string &plugin, const std::string &setting, CCSSettingType type, SpecialOptionType mateType, const std::string &mateName, CCSObjectAllocationInterface *allocator) { CCSIntegratedSettingInfo *integratedSettingInfo = ccsSharedIntegratedSettingInfoNew (plugin.c_str (), setting.c_str (), type, allocator); /* This takes ownership of integratedSettingInfo */ CCSMATEIntegratedSettingInfo *mateIntegratedSettingInfo = ccsMATEIntegratedSettingInfoNew (integratedSettingInfo, mateType, mateName.c_str (), allocator); CCSIntegratedSetting *integratedSetting = ccsMockIntegratedSettingNew (allocator); CCSIntegratedSettingGMock *mockPtr = GET_PRIVATE (CCSIntegratedSettingGMock, integratedSetting) CCSIntegratedSettingGMock &mock (*mockPtr); boost::shared_ptr composition = AutoDestroy (ccsMockCompositionIntegratedSettingNew (integratedSetting, mateIntegratedSettingInfo, integratedSettingInfo, allocator), ccsIntegratedSettingUnref); /* We want the composition to take ownership here, so unref the * original members of the composition */ ccsMATEIntegratedSettingInfoUnref (mateIntegratedSettingInfo); ccsIntegratedSettingUnref (integratedSetting); return boost::make_shared (mock, composition); } CCSIntegratedSettingGMock & Mock (IntegratedSettingWithMock &integratedSettingWithMocks) { return std::tr1::get <0> (integratedSettingWithMocks); } CCSIntegratedSetting * Real (IntegratedSettingWithMock &integratedSettingWithMocks) { return std::tr1::get <1> (integratedSettingWithMocks).get (); } typedef std::tr1::tuple , boost::shared_ptr , CCSIntegratedSettingsStorage *, CCSIntegratedSettingFactory *, boost::shared_ptr > CCSMATEIntegrationWithMocks; CCSMATEIntegrationWithMocks createIntegrationWithMocks (CCSObjectAllocationInterface *ai) { boost::shared_ptr context (AutoDestroy (ccsMockContextNew (), ccsFreeContext)); boost::shared_ptr backend (AutoDestroy (ccsMockBackendNew (), ccsFreeMockBackend)); /* The MATE Integration backend takes ownership of these two */ CCSIntegratedSettingsStorage *storage (ccsMockIntegratedSettingsStorageNew (ai)); CCSIntegratedSettingFactory *factory (ccsMockIntegratedSettingFactoryNew (ai)); boost::shared_ptr integration (AutoDestroy (ccsMATEIntegrationBackendNew (backend.get (), context.get (), factory, storage, ai), ccsIntegrationUnref)); CCSContextGMock &gmockContext = *(reinterpret_cast (ccsObjectGetPrivate (context.get ()))); CCSBackendGMock &gmockBackend = *(reinterpret_cast (ccsObjectGetPrivate (backend.get ()))); CCSIntegratedSettingsStorageGMock &gmockStorage = *(reinterpret_cast (ccsObjectGetPrivate (storage))); CCSIntegratedSettingFactoryGMock &gmockFactory = *(reinterpret_cast (ccsObjectGetPrivate (factory))); return CCSMATEIntegrationWithMocks (gmockContext, gmockBackend, gmockStorage, gmockFactory, context, backend, storage, factory, integration); } CCSIntegration * Real (CCSMATEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <8> (integrationWithMocks).get (); } CCSContextGMock & MockContext (CCSMATEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <0> (integrationWithMocks); } CCSIntegratedSettingsStorageGMock & MockStorage (CCSMATEIntegrationWithMocks &integrationWithMocks) { return std::tr1::get <2> (integrationWithMocks); } void IgnoreRegistration (CCSIntegratedSettingsStorageGMock &storage) { EXPECT_CALL (storage, empty ()).WillOnce (Return (FALSE)); } void AllowReadability (CCSSettingGMock &setting) { EXPECT_CALL (setting, isReadableByBackend ()).WillOnce (Return (TRUE)); } void ExpectWriteSettings (CCSContextGMock &context) { EXPECT_CALL (context, writeChangedSettings ()); } void SetNames (CCSSettingGMock &setting, CCSPluginGMock &plugin, const std::string &settingName, const std::string &pluginName) { EXPECT_CALL (setting, getName ()).WillOnce (Return (settingName.c_str ())); EXPECT_CALL (setting, getParent ()); EXPECT_CALL (plugin, getName ()).WillOnce (Return (pluginName.c_str ())); } void SetTypeInfo (CCSSettingGMock &setting, CCSSettingType type, CCSSettingInfo *info) { EXPECT_CALL (setting, getType ()).WillOnce (Return (type)); EXPECT_CALL (setting, getInfo ()).WillOnce (Return (info)); } CCSSettingValue * MakeSettingValue () { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->parent = NULL; v->isListChild = FALSE; v->refCount = 1; return v; } boost::shared_ptr MakeAutoDestroySettingValue (CCSSettingType type) { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->parent = NULL; v->isListChild = FALSE; v->refCount = 1; return boost::shared_ptr (v, boost::bind (ccsFreeSettingValueWithType, _1, type)); } const std::string MOCK_PLUGIN ("mock"); const std::string MOCK_SETTING ("mock"); const std::string MOCK_MATE_NAME ("mock"); const CCSSettingType MOCK_SETTING_TYPE = TypeInt; const SpecialOptionType MOCK_MATE_SETTING_TYPE = OptionInt; } TEST (CCSMATEIntegrationTest, TestConstructComposition) { IntegratedSettingWithMockPtr settingWithMock ( createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, MOCK_SETTING_TYPE, MOCK_MATE_SETTING_TYPE, MOCK_MATE_NAME, &ccsDefaultObjectAllocator)); } class CCSMATEIntegrationTestWithMocks : public ::testing::Test { public: CCSMATEIntegrationTestWithMocks () : mIntegration (createIntegrationWithMocks (&ccsDefaultObjectAllocator)), mSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), mSettingMock ((*(reinterpret_cast (ccsObjectGetPrivate (mSetting.get ()))))), mIntegratedSetting (), mPlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), mPluginMock ((*(reinterpret_cast (ccsObjectGetPrivate (mPlugin.get ()))))) { ON_CALL (mSettingMock, getParent ()).WillByDefault (Return (mPlugin.get ())); } protected: CCSMATEIntegrationWithMocks mIntegration; boost::shared_ptr mSetting; CCSSettingGMock &mSettingMock; IntegratedSettingWithMockPtr mIntegratedSetting; boost::shared_ptr mPlugin; CCSPluginGMock &mPluginMock; }; class CCSMATEIntegrationTestReadIntegrated : public CCSMATEIntegrationTestWithMocks { public: virtual void SetUp () { IgnoreRegistration (MockStorage (mIntegration)); AllowReadability (mSettingMock); } }; class CCSMATEIntegrationTestWriteIntegrated : public CCSMATEIntegrationTestWithMocks { public: virtual void SetUp () { IgnoreRegistration (MockStorage (mIntegration)); ExpectWriteSettings (MockContext (mIntegration)); } }; TEST_F (CCSMATEIntegrationTestWithMocks, TestConstructMATEIntegration) { } TEST_F (CCSMATEIntegrationTestWithMocks, TestGetIntegratedSettingFromStorage) { mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); CCSIntegratedSettingList returnIntegratedSettings = ccsIntegratedSettingListAppend (NULL, Real (*mIntegratedSetting)); CCSIntegratedSettingsStorageGMock &mockStorage (MockStorage (mIntegration)); EXPECT_CALL (mockStorage, empty ()).WillOnce (Return (FALSE)); EXPECT_CALL (mockStorage, findMatchingSettingsByPluginAndSettingName (Eq (MOCK_PLUGIN), Eq (MOCK_SETTING))) .WillOnce (Return (returnIntegratedSettings)); EXPECT_EQ (Real (*mIntegratedSetting), ccsIntegrationGetIntegratedSetting (Real (mIntegration), MOCK_PLUGIN.c_str (), MOCK_SETTING.c_str ())); } TEST_F (CCSMATEIntegrationTestReadIntegrated, TestReadInKeyOption) { CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("a"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, MOCK_SETTING, TypeKey, OptionKey, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); CCSSettingKeyValue keyValue; ASSERT_TRUE (ccsStringToKeyBinding (v->value.asString, &keyValue)); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeKey)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setKey (Eq (keyValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSMATEIntegrationTestReadIntegrated, TestReadInSpecialOptionCurrentViewport) { const std::string settingName ("current_viewport"); CCSSettingValue *v = MakeSettingValue (); v->value.asBool = FALSE; mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeBool)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSMATEIntegrationTestReadIntegrated, TestReadInSpecialOptionFullscreenVisualBell) { const std::string settingName ("fullscreen_visual_bell"); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("fullscreen"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSMATEIntegrationTestReadIntegrated, TestReadInSpecialOptionClickToFocus) { const std::string settingName ("click_to_focus"); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup ("click"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setBool (IsTrue (), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } namespace { struct IntegratedMediaKeysParam { public: IntegratedMediaKeysParam (const std::string &settingName, const std::string &integratedName, const std::string &keyValueString) : settingName (settingName), integratedName (integratedName), keyValueString (keyValueString) { EXPECT_TRUE (ccsStringToKeyBinding (keyValueString.c_str (), &keyValue)); } const std::string settingName; const std::string integratedName; const std::string keyValueString; CCSSettingKeyValue keyValue; }; } namespace { std::string RUN_COMMAND_SCREENSHOT_KEY ("run_command_screenshot_key"); std::string SCREENSHOT ("screenshot"); std::string SCREENSHOT_BINDING ("Print"); std::string RUN_COMMAND_WINDOW_SCREENSHOT_KEY ("run_command_window_screenshot_key"); std::string WINDOW_SCREENSHOT ("window_screenshot"); std::string WINDOW_SCREENSHOT_BINDING ("Print"); std::string RUN_COMMAND_TERMINAL_KEY ("run_command_terminal_key"); std::string TERMINAL ("terminal"); std::string TERMINAL_BINDING ("t"); } class CCSMATEIntegrationTestReadIntegratedMediaKeys : public CCSMATEIntegrationTestReadIntegrated, public WithParamInterface { }; TEST_P (CCSMATEIntegrationTestReadIntegratedMediaKeys, TestReadIntegratedMediaKey) { const std::string settingName (GetParam ().settingName); CCSSettingValue *v = MakeSettingValue (); v->value.asString = strdup (GetParam ().keyValueString.c_str ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); EXPECT_CALL (Mock (*mIntegratedSetting), readValue (TypeString)).WillOnce (Return (v)); EXPECT_CALL (mSettingMock, setKey (Eq (GetParam ().keyValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } INSTANTIATE_TEST_CASE_P (CCSMATEMediaKeys, CCSMATEIntegrationTestReadIntegratedMediaKeys, Values (IntegratedMediaKeysParam (RUN_COMMAND_SCREENSHOT_KEY, SCREENSHOT, SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_WINDOW_SCREENSHOT_KEY, WINDOW_SCREENSHOT, WINDOW_SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_TERMINAL_KEY, TERMINAL, TERMINAL_BINDING))); namespace { const std::string DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING (""); const std::string MATE_MOUSE_BUTTON_MODIFIERS_STRING (""); const unsigned int DEFAULT_MOUSE_BUTTON_MODIFIERS = ccsStringToModifiers (DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); const unsigned int MATE_MOUSE_BUTTON_MODIFIERS = ccsStringToModifiers (MATE_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); const unsigned int LEFT_BUTTON = 1; const unsigned int MIDDLE_BUTTON = 2; const unsigned int RIGHT_BUTTON = 3; } class CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: virtual ~CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers () {} CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers () : mIntegratedSettingMBM (AutoDestroy (ccsMockIntegratedSettingNew (&ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)), mIntegratedSettingMBMMock (*(reinterpret_cast (ccsObjectGetPrivate (mIntegratedSettingMBM.get ())))), mIntegratedSettingResizeWithRB (AutoDestroy (ccsMockIntegratedSettingNew (&ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)), mIntegratedSettingResizeWithRBMock (*(reinterpret_cast (ccsObjectGetPrivate (mIntegratedSettingResizeWithRB.get ())))) { memset (&mButtonValue, 0, sizeof (CCSSettingButtonValue)); mButtonValue.button = MIDDLE_BUTTON; mButtonValue.buttonModMask = DEFAULT_MOUSE_BUTTON_MODIFIERS; mButtonValue.edgeMask = 0; } virtual void MateSetUp (CCSMATEIntegrationWithMocks &integration) { /* Create new lists as we expect the caller to free them once it * has retreived them */ CCSIntegratedSettingList integratedSettingsMBM = ccsIntegratedSettingListAppend (NULL, mIntegratedSettingMBM.get ()); CCSIntegratedSettingList integratedSettingsResizeWithRB = ccsIntegratedSettingListAppend (NULL, mIntegratedSettingResizeWithRB.get ()); EXPECT_CALL (MockStorage (integration), findMatchingSettingsByPluginAndSettingName (Eq (std::string (ccsMATEIntegratedPluginNames.SPECIAL)), Eq (std::string (ccsMATEIntegratedSettingNames.NULL_MOUSE_BUTTON_MODIFIER.compizName)))) .WillOnce (Return (integratedSettingsMBM)); EXPECT_CALL (MockStorage (integration), findMatchingSettingsByPluginAndSettingName (Eq (std::string (ccsMATEIntegratedPluginNames.SPECIAL)), Eq (std::string (ccsMATEIntegratedSettingNames.NULL_RESIZE_WITH_RIGHT_BUTTON.compizName)))) .WillOnce (Return (integratedSettingsResizeWithRB)); } protected: boost::shared_ptr mIntegratedSettingMBM; CCSIntegratedSettingGMock &mIntegratedSettingMBMMock; boost::shared_ptr mIntegratedSettingResizeWithRB; CCSIntegratedSettingGMock &mIntegratedSettingResizeWithRBMock; CCSSettingButtonValue mButtonValue; }; class CCSMATEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers : public CCSMATEIntegrationTestReadIntegrated, public CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: virtual void SetUp () { CCSSettingValue *vRB = MakeSettingValue (); CCSSettingValue *vMBM = MakeSettingValue (); vRB->value.asBool = TRUE; vMBM->value.asString = strdup (MATE_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); CCSMATEIntegrationTestReadIntegrated::SetUp (); CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers::MateSetUp (mIntegration); EXPECT_CALL (mSettingMock, getButton (_)) .WillOnce (DoAll ( SetArgPointee <0> ( mButtonValue), Return (TRUE))); /* Get the MATE Mouse button modifier */ EXPECT_CALL (mIntegratedSettingMBMMock, readValue (TypeString)).WillOnce (Return (vMBM)); EXPECT_CALL (mIntegratedSettingResizeWithRBMock, readValue (TypeBool)).WillOnce (Return (vRB)); } }; class CCSMATEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers : public CCSMATEIntegrationTestWriteIntegrated, public CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers { public: CCSMATEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers () : corePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), corePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (corePlugin.get ())))), resizePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), resizePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (resizePlugin.get ())))), movePlugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), movePluginMock (*(reinterpret_cast (ccsObjectGetPrivate (movePlugin.get ())))), resizeInitiateButtonSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), resizeInitiateButtonSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (resizeInitiateButtonSetting.get ())))), moveInitiateButtonSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), moveInitiateButtonSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (moveInitiateButtonSetting.get ())))), coreWindowMenuSetting (AutoDestroy (ccsMockSettingNew (), ccsSettingUnref)), coreWindowMenuSettingMock (*(reinterpret_cast (ccsObjectGetPrivate (coreWindowMenuSetting.get ())))), resizeInitiateButton (MakeAutoDestroySettingValue (TypeButton)), moveInitiateButton (MakeAutoDestroySettingValue (TypeButton)), coreWindowMenuButton (MakeAutoDestroySettingValue (TypeButton)) { resizeInitiateButton->value.asButton.button = LEFT_BUTTON; resizeInitiateButton->value.asButton.buttonModMask = 0; resizeInitiateButton->value.asButton.edgeMask = 0; moveInitiateButton->value.asButton.button = LEFT_BUTTON; moveInitiateButton->value.asButton.buttonModMask = DEFAULT_MOUSE_BUTTON_MODIFIERS; moveInitiateButton->value.asButton.edgeMask = 0; coreWindowMenuButton->value.asButton.button = MIDDLE_BUTTON; coreWindowMenuButton->value.asButton.buttonModMask = 0; coreWindowMenuButton->value.asButton.edgeMask = 0; } virtual void SetUp () { CCSMATEIntegrationTestWriteIntegrated::SetUp (); CCSMATEIntegrationTestWithMocksIntegratedMouseButtonModifiers::MateSetUp (mIntegration); } protected: boost::shared_ptr corePlugin; CCSPluginGMock &corePluginMock; boost::shared_ptr resizePlugin; CCSPluginGMock &resizePluginMock; boost::shared_ptr movePlugin; CCSPluginGMock &movePluginMock; boost::shared_ptr resizeInitiateButtonSetting; CCSSettingGMock &resizeInitiateButtonSettingMock; boost::shared_ptr moveInitiateButtonSetting; CCSSettingGMock &moveInitiateButtonSettingMock; boost::shared_ptr coreWindowMenuSetting; CCSSettingGMock &coreWindowMenuSettingMock; boost::shared_ptr resizeInitiateButton; boost::shared_ptr moveInitiateButton; boost::shared_ptr coreWindowMenuButton; }; TEST_F (CCSMATEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionMoveInitiateButton) { const std::string settingName ("initiate_button"); const std::string pluginName ("move"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = LEFT_BUTTON; newButtonValue.buttonModMask = MATE_MOUSE_BUTTON_MODIFIERS; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSMATEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionResizeInitiateButton) { const std::string settingName ("initiate_button"); const std::string pluginName ("resize"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = RIGHT_BUTTON; newButtonValue.buttonModMask = MATE_MOUSE_BUTTON_MODIFIERS; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSMATEIntegrationTestWithMocksReadIntegratedMouseButtonModifiers, TestReadInSpecialOptionWhereIntegratedOptionReturnsNull) { const std::string settingName ("initiate_button"); const std::string pluginName ("move"); CCSSettingButtonValue newButtonValue = mButtonValue; newButtonValue.button = LEFT_BUTTON; /* Reading the mate mouse button modifiers failed, so default to zero */ newButtonValue.buttonModMask = 0; /* Clear the old expectation */ ccsFreeSettingValueWithType (ccsIntegratedSettingReadValue (mIntegratedSettingMBM.get (), TypeString), TypeString); /* Now return null */ EXPECT_CALL (mIntegratedSettingMBMMock, readValue (TypeString)).WillOnce (ReturnNull ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); /* Set the new mouse button modifier */ EXPECT_CALL (mSettingMock, setButton (Eq (newButtonValue), IsTrue ())); EXPECT_THAT (ccsIntegrationReadOptionIntoSetting (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)), IsTrue ()); } TEST_F (CCSMATEIntegrationTestWriteIntegrated, TestWriteCurrentViewport) { const std::string settingName ("current_viewport"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr mateValue (MakeAutoDestroySettingValue (TypeBool)); CCSSettingInfo info; compizValue->value.asBool = TRUE; mateValue->value.asBool = FALSE; mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*mateValue, TypeBool, &info)), TypeBool)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } TEST_F (CCSMATEIntegrationTestWriteIntegrated, TestWriteFullscreenVisualBell) { const std::string settingName ("fullscreen_visual_bell"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr mateValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asBool = TRUE; mateValue->value.asString = strdup ("fullscreen"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*mateValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } TEST_F (CCSMATEIntegrationTestWriteIntegrated, TestWriteClickToFocus) { const std::string settingName ("click_to_focus"); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeBool)); boost::shared_ptr mateValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asBool = TRUE; mateValue->value.asString = strdup ("click"); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeBool, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*mateValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } class CCSMATEIntegrationTestWriteIntegratedMediaKeys : public CCSMATEIntegrationTestWriteIntegrated, public WithParamInterface { }; TEST_P (CCSMATEIntegrationTestWriteIntegratedMediaKeys, TestWriteIntegratedMediaKey) { const std::string settingName (GetParam ().settingName); boost::shared_ptr compizValue (MakeAutoDestroySettingValue (TypeKey)); boost::shared_ptr mateValue (MakeAutoDestroySettingValue (TypeString)); CCSSettingInfo info; compizValue->value.asKey = GetParam ().keyValue; mateValue->value.asString = strdup (GetParam ().keyValueString.c_str ()); mIntegratedSetting = createIntegratedSettingCompositionFromMock (MOCK_PLUGIN, settingName, TypeString, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, MOCK_PLUGIN); SetTypeInfo (mSettingMock, TypeKey, &info); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (compizValue.get ())); EXPECT_CALL (Mock (*mIntegratedSetting), writeValue (Pointee (SettingValueMatch (*mateValue, TypeString, &info)), TypeString)); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } INSTANTIATE_TEST_CASE_P (CCSMATEMediaKeys, CCSMATEIntegrationTestWriteIntegratedMediaKeys, Values (IntegratedMediaKeysParam (RUN_COMMAND_SCREENSHOT_KEY, SCREENSHOT, SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_WINDOW_SCREENSHOT_KEY, WINDOW_SCREENSHOT, WINDOW_SCREENSHOT_BINDING), IntegratedMediaKeysParam (RUN_COMMAND_TERMINAL_KEY, TERMINAL, TERMINAL_BINDING))); /* * TODO: Break up the function that this test covers. Its way too complicated */ TEST_F (CCSMATEIntegrationTestWithMocksWriteIntegratedMouseButtonModifiers, TestWriteMouseButtonModifier) { const std::string moveSettingName ("initiate_button"); const std::string movePluginName ("move"); const std::string resizeSettingName ("initiate_button"); const std::string resizePluginName ("resize"); const std::string coreSettingName ("window_menu_button"); const std::string corePluginName ("core"); const std::string settingName (moveSettingName); const std::string pluginName (movePluginName); CCSSettingInfo info; mIntegratedSetting = createIntegratedSettingCompositionFromMock (pluginName, settingName, TypeBool, OptionSpecial, MOCK_MATE_NAME, &ccsDefaultObjectAllocator); SetNames (mSettingMock, mPluginMock, settingName, pluginName); SetTypeInfo (mSettingMock, TypeButton, &info); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (movePluginName))).WillRepeatedly (Return (movePlugin.get ())); EXPECT_CALL (movePluginMock, findSetting (Eq (moveSettingName))).WillRepeatedly (Return (moveInitiateButtonSetting.get ())); EXPECT_CALL (moveInitiateButtonSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (moveInitiateButtonSettingMock, getValue ()).WillRepeatedly (Return (moveInitiateButton.get ())); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (resizePluginName))).WillRepeatedly (Return (resizePlugin.get ())); EXPECT_CALL (resizePluginMock, findSetting (Eq (resizeSettingName))).WillRepeatedly (Return (resizeInitiateButtonSetting.get ())); EXPECT_CALL (resizeInitiateButtonSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (resizeInitiateButtonSettingMock, getValue ()).WillRepeatedly (Return (resizeInitiateButton.get ())); EXPECT_CALL (MockContext (mIntegration), findPlugin (Eq (corePluginName))).WillRepeatedly (Return (corePlugin.get ())); EXPECT_CALL (corePluginMock, findSetting (Eq (coreSettingName))).WillRepeatedly (Return (coreWindowMenuSetting.get ())); EXPECT_CALL (coreWindowMenuSettingMock, getType ()).WillRepeatedly (Return (TypeButton)); EXPECT_CALL (coreWindowMenuSettingMock, getValue ()).WillRepeatedly (Return (coreWindowMenuButton.get ())); boost::shared_ptr newResizeWithRBValue (MakeAutoDestroySettingValue (TypeBool)); newResizeWithRBValue->value.asBool = TRUE; EXPECT_CALL (mIntegratedSettingResizeWithRBMock, writeValue (Pointee (SettingValueMatch (*newResizeWithRBValue, TypeBool, &info)), TypeBool)); boost::shared_ptr newMBMValue (MakeAutoDestroySettingValue (TypeString)); newMBMValue->value.asString = strdup (DEFAULT_MOUSE_BUTTON_MODIFIERS_STRING.c_str ()); EXPECT_CALL (mSettingMock, getValue ()).WillOnce (Return (moveInitiateButton.get ())); EXPECT_CALL (mIntegratedSettingMBMMock, writeValue (Pointee (SettingValueMatch (*newMBMValue, TypeString, &info)), TypeString)); unsigned int modifiers = moveInitiateButton->value.asButton.buttonModMask; CCSSettingButtonValue newResizeInitiateButton; CCSSettingButtonValue newMoveInitiateButton; CCSSettingButtonValue newWindowMenuButton; memset (&newResizeInitiateButton, 0, sizeof (CCSSettingButtonValue)); memset (&newMoveInitiateButton, 0, sizeof (CCSSettingButtonValue)); memset (&newWindowMenuButton, 0, sizeof (CCSSettingButtonValue)); newResizeInitiateButton.button = RIGHT_BUTTON; newResizeInitiateButton.buttonModMask = modifiers; newMoveInitiateButton.button = LEFT_BUTTON; newMoveInitiateButton.buttonModMask = modifiers; newWindowMenuButton.button = MIDDLE_BUTTON; newWindowMenuButton.buttonModMask = modifiers; EXPECT_CALL (resizeInitiateButtonSettingMock, setButton (Eq (newResizeInitiateButton), IsTrue ())); /* The move button is exactly the same, so it is not updated */ EXPECT_CALL (moveInitiateButtonSettingMock, setButton (Eq (newMoveInitiateButton), IsTrue ())).Times (0); EXPECT_CALL (coreWindowMenuSettingMock, setButton (Eq (newWindowMenuButton), IsTrue ())); ccsIntegrationWriteSettingIntoOption (Real (mIntegration), NULL, mSetting.get (), Real (*mIntegratedSetting)); } ./compizconfig/integration/mate/tests/CMakeLists.txt0000644000004100000410000000400113246301623023100 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_SOURCE_DIR}/tests/shared/glib) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../gsettings/tests) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../gsettings/mocks) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_library (compizconfig_ccs_mock_mate_integrated_setting_composition ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_mock_mate_integrated_setting_composition.c) target_link_libraries (compizconfig_ccs_mock_mate_integrated_setting_composition compizconfig_ccs_integrated_setting_mock compizconfig_mate_integrated_setting compizconfig) add_executable (compizconfig_test_ccs_mate_integration ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_mate_integration.cpp) target_link_libraries (compizconfig_test_ccs_mate_integration ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_backend_mock compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_list_wrapper compizconfig_ccs_setting_value_operators compizconfig_ccs_setting_value_matcher compizconfig_ccs_integrated_setting_mock compizconfig_ccs_integrated_setting_factory_mock compizconfig_ccs_integrated_setting_storage_mock compizconfig_ccs_mock_mate_integrated_setting_composition compizconfig_mate_integration) compiz_discover_tests (compizconfig_test_ccs_mate_integration COVERAGE compizconfig_mate_integration compizconfig_mate_integration_constants) ./compizconfig/integration/mate/tests/compizconfig_ccs_mock_mate_integrated_setting_composition.c0000644000004100000410000001730313246301623034441 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_mock_mate_integrated_setting_composition.h" typedef struct _CCSMockMATEIntegratedSettingCompositionPrivate { CCSIntegratedSetting *integratedSetting; CCSMATEIntegratedSettingInfo *mateIntegratedSettingInfo; CCSIntegratedSettingInfo *integratedSettingInfo; } CCSMockMATEIntegratedSettingCompositionPrivate; static CCSIntegratedSetting * allocateCCSIntegratedSetting (CCSObjectAllocationInterface *allocator) { CCSIntegratedSetting *setting = (*allocator->calloc_) (allocator->allocator, 1, sizeof (CCSIntegratedSetting)); ccsObjectInit (setting, allocator); return setting; } static CCSMockMATEIntegratedSettingCompositionPrivate * allocatePrivate (CCSIntegratedSetting *integratedSetting, CCSObjectAllocationInterface *allocator) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = (*allocator->calloc_) (allocator->allocator, 1, sizeof (CCSMockMATEIntegratedSettingCompositionPrivate)); if (!priv) { ccsObjectFinalize (integratedSetting); (*allocator->free_) (allocator->allocator, integratedSetting); return NULL; } return priv; } static SpecialOptionType ccsMockCompositionIntegratedSettingGetSpecialOptionType (CCSMATEIntegratedSettingInfo *setting) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); return ccsMATEIntegratedSettingInfoGetSpecialOptionType (priv->mateIntegratedSettingInfo); } static const char * ccsMockCompositionIntegratedSettingGetMATEName (CCSMATEIntegratedSettingInfo *setting) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); return ccsMATEIntegratedSettingInfoGetMATEName (priv->mateIntegratedSettingInfo); } static CCSSettingValue * ccsMockCompositionIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingReadValue (priv->integratedSetting, type); } static void ccsMockCompositionIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); ccsIntegratedSettingWriteValue (priv->integratedSetting, v, type); } static const char * ccsMockCompositionIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoPluginName (priv->integratedSettingInfo); } static const char * ccsMockCompositionIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoSettingName (priv->integratedSettingInfo); } static CCSSettingType ccsMockCompositionIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, setting); return ccsIntegratedSettingInfoGetType (priv->integratedSettingInfo); } static void ccsMockCompositionIntegratedSettingFree (CCSIntegratedSetting *integratedSetting) { CCSMockMATEIntegratedSettingCompositionPrivate *priv = GET_PRIVATE (CCSMockMATEIntegratedSettingCompositionPrivate, integratedSetting); ccsIntegratedSettingUnref (priv->integratedSetting); ccsMATEIntegratedSettingInfoUnref (priv->mateIntegratedSettingInfo); ccsObjectFinalize (integratedSetting); (*integratedSetting->object.object_allocation->free_) (integratedSetting->object.object_allocation->allocator, integratedSetting); } static void ccsMockCompositionIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { return ccsMockCompositionIntegratedSettingFree ((CCSIntegratedSetting *) info); } static void ccsMockCompositionMATEIntegratedSettingInfoFree (CCSMATEIntegratedSettingInfo *info) { return ccsMockCompositionIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSMATEIntegratedSettingInfoInterface ccsMockCompositionMATEIntegratedSettingInfo = { ccsMockCompositionIntegratedSettingGetSpecialOptionType, ccsMockCompositionIntegratedSettingGetMATEName, ccsMockCompositionMATEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsMockCompositionIntegratedSetting = { ccsMockCompositionIntegratedSettingReadValue, ccsMockCompositionIntegratedSettingWriteValue, ccsMockCompositionIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsMockCompositionIntegratedSettingInfo = { ccsMockCompositionIntegratedSettingInfoPluginName, ccsMockCompositionIntegratedSettingInfoSettingName, ccsMockCompositionIntegratedSettingInfoGetType, ccsMockCompositionIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsMockCompositionIntegratedSettingNew (CCSIntegratedSetting *integratedSetting, CCSMATEIntegratedSettingInfo *mateInfo, CCSIntegratedSettingInfo *settingInfo, CCSObjectAllocationInterface *allocator) { CCSIntegratedSetting *composition = allocateCCSIntegratedSetting (allocator); if (!composition) return NULL; CCSMockMATEIntegratedSettingCompositionPrivate *priv = allocatePrivate (composition, allocator); if (!priv) return NULL; const CCSInterface *integratedSettingImpl = (const CCSInterface *) (&ccsMockCompositionIntegratedSetting); const CCSInterface *integratedSettingInfoImpl = (const CCSInterface *) (&ccsMockCompositionIntegratedSettingInfo); const CCSInterface *mateSettingImpl = (const CCSInterface *) (&ccsMockCompositionMATEIntegratedSettingInfo); priv->integratedSetting = integratedSetting; priv->mateIntegratedSettingInfo = mateInfo; priv->integratedSettingInfo = settingInfo; ccsIntegratedSettingRef (priv->integratedSetting); ccsMATEIntegratedSettingInfoRef (priv->mateIntegratedSettingInfo); ccsObjectSetPrivate (composition, (CCSPrivate *) (priv)); ccsObjectAddInterface (composition, integratedSettingImpl, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (composition, integratedSettingInfoImpl, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (composition, mateSettingImpl, GET_INTERFACE_TYPE (CCSMATEIntegratedSettingInfoInterface)); ccsObjectRef (composition); return composition; } ./compizconfig/integration/mate/tests/compizconfig_ccs_mock_mate_integrated_setting_composition.h0000644000004100000410000000260713246301623034447 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_MOCK_MATE_INTEGRATED_SETTING_COMPOSITION_H #define _COMPIZCONFIG_CCS_MOCK_MATE_INTEGRATED_SETTING_COMPOSITION_H #include #include #include COMPIZCONFIG_BEGIN_DECLS CCSIntegratedSetting * ccsMockCompositionIntegratedSettingNew (CCSIntegratedSetting *integratedSetting, CCSMATEIntegratedSettingInfo *mateInfo, CCSIntegratedSettingInfo *settingInfo, CCSObjectAllocationInterface *allocator); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/gsettings/0000755000004100000410000000000013246301623021212 5ustar www-datawww-data./compizconfig/integration/mate/gsettings/CMakeLists.txt0000644000004100000410000000471213246301623023756 0ustar www-datawww-datainclude (FindPkgConfig) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) compiz_pkg_check_modules (COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION ${_deps}) if (COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_FOUND) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include ${CMAKE_SOURCE_DIR}/compizconfig/gsettings/gsettings_backend_shared ${CMAKE_SOURCE_DIR}/compizconfig/integration/mate/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/mate/gsettings/include ${COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_INCLUDE_DIRS}) link_directories (${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig ${CMAKE_BINARY_DIR}/compizconfig/gsettings/gsettings_backend_shared ${CMAKE_BINARY_DIR}/compizconfig/integration/mate ${COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_LIBRARY_DIRS}) add_library (compizconfig_mate_integration_gsettings_integrated_setting STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_mate_integration_gsettings_integrated_setting.c) target_link_libraries (compizconfig_mate_integration_gsettings_integrated_setting compizconfig_mate_integrated_setting compizconfig_mate_integration_constants compizconfig compizconfig_gsettings_util ${COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_LIBRARIES}) add_library (compizconfig_mate_integration_gsettings_setting_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_mate_integration_gsettings_integrated_setting_factory.c) target_link_libraries (compizconfig_mate_integration_gsettings_setting_factory compizconfig_gsettings_wrapper_factory_interface compizconfig_mate_integration_constants compizconfig_mate_integrated_setting compizconfig_mate_integration_gsettings_integrated_setting compizconfig compizconfig_gsettings_util ${COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_LIBRARIES}) add_library (compizconfig_mate_integration_gsettings_wrapper_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/ccs_mate_integration_gsettings_wrapper_factory.c) target_link_libraries (compizconfig_mate_integration_gsettings_setting_factory compizconfig_gsettings_wrapper_factory_interface compizconfig ${COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_LIBRARIES}) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (COMPIZCONFIG_MATE_GSETTINGS_INTEGRATION_FOUND) ./compizconfig/integration/mate/gsettings/include/0000755000004100000410000000000013246301623022635 5ustar www-datawww-data././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootroot./compizconfig/integration/mate/gsettings/include/ccs_mate_integration_gsettings_integrated_setting.h./compizconfig/integration/mate/gsettings/include/ccs_mate_integration_gsettings_integrated_setting.0000644000004100000410000000210013246301623035042 0ustar www-datawww-data#ifndef _CCS_MATE_GSETTINGS_INTEGRATED_SETTING_H #define _CCS_MATE_GSETTINGS_INTEGRATED_SETTING_H #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGSettingsIntegratedSettingNew * @param base * @param wrapper * @param ai * @return * * The GSettings implementation of CCSIntegratedSetting *, which will * write using a CCSGSettingsWrapper * object when the read and write * methods are called. */ CCSIntegratedSetting * ccsGSettingsIntegratedSettingNew (CCSMATEIntegratedSettingInfo *base, CCSGSettingsWrapper *wrapper, CCSObjectAllocationInterface *ai); /** * @brief ccsGSettingsIntegratedSettingsTranslateOldMATEKeyForGSettings * @param key the old style mate key to translate * @return new-style key. Caller should free * * This translates old style keys (eg foo_bar) to new style keys * foo-bar and special cases a few keys */ char * ccsGSettingsIntegratedSettingsTranslateOldMATEKeyForGSettings (const char *key); COMPIZCONFIG_END_DECLS #endif ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootroot./compizconfig/integration/mate/gsettings/include/ccs_mate_integration_gsettings_integrated_setting_factory.h./compizconfig/integration/mate/gsettings/include/ccs_mate_integration_gsettings_integrated_setting_0000644000004100000410000000251313246301623035133 0ustar www-datawww-data#ifndef _CCS_MATE_GSETTINGS_INTEGRATED_SETTING_FACTORY_H #define _CCS_MATE_GSETTINGS_INTEGRATED_SETTING_FACTORY_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS /** * @brief ccsGSettingsIntegratedSettingsTranslateNewMATEKeyForCCS * @param key the old style mate key to translate * @return new-style key. Caller should free * * This translates new style keys (eg foo-bar) to old style keys * foo_bar and special cases a few keys */ char * ccsGSettingsIntegratedSettingsTranslateNewMATEKeyForCCS (const char *key); /** * @brief ccsGSettingsIntegratedSettingsChangeCallback * @return callback for settings change data * * This returns the default callback used for settings changes * * TODO: This API doesn't make a whole lot of sense, but we need * it if we want to inject CCSGSettingsWrapperFactory into * ccsGSettingsIntegratedSettingFactoryNew. * * The return type is GCallback to hide the details of this function * from callers */ GCallback ccsGSettingsIntegratedSettingsChangeCallback (); CCSIntegratedSettingFactory * ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory *wrapperFactory, CCSMATEValueChangeData *data, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/gsettings/include/ccs_mate_integration_gsettings_wrapper_factory.h0000644000004100000410000000236313246301623034551 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_MATE_INTEGRATION_GSETTINGS_WRAPPER_FACTORY_H #define _CCS_MATE_INTEGRATION_GSETTINGS_WRAPPER_FACTORY_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include CCSGSettingsWrapperFactory * ccsMATEIntegrationGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai, CCSGSettingsWrapperFactory *factory, GCallback callback, CCSMATEValueChangeData *data); COMPIZCONFIG_END_DECLS #endif ./compizconfig/integration/mate/gsettings/src/0000755000004100000410000000000013246301623022001 5ustar www-datawww-data././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootroot./compizconfig/integration/mate/gsettings/src/ccs_mate_integration_gsettings_integrated_setting_factory.c./compizconfig/integration/mate/gsettings/src/ccs_mate_integration_gsettings_integrated_setting_fact0000644000004100000410000002360613246301623035143 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include #include #include "ccs_mate_integration.h" #include "ccs_mate_integrated_setting.h" #include "ccs_mate_integration_constants.h" #include "ccs_mate_integration_types.h" #include "ccs_mate_integration_gsettings_integrated_setting.h" #include "ccs_mate_integration_gsettings_integrated_setting_factory.h" char * ccsGSettingsIntegratedSettingsTranslateNewMATEKeyForCCS (const char *key) { char *newKey = translateKeyForCCS (key); if (g_strcmp0 (newKey, "screenshot") == 0) { free (newKey); newKey = strdup ("run_command_screenshot"); } else if (g_strcmp0 (newKey, "window_screenshot") == 0) { free (newKey); newKey = strdup ("run_command_window_screenshot"); } else if (g_strcmp0 (newKey, "terminal") == 0) { free (newKey); newKey = strdup ("run_command_terminal"); } return newKey; } typedef struct _CCSGSettingsIntegratedSettingFactoryPrivate CCSGSettingsIntegratedSettingFactoryPrivate; struct _CCSGSettingsIntegratedSettingFactoryPrivate { CCSGSettingsWrapperFactory *wrapperFactory; GHashTable *pluginsToSettingsGSettingsWrapperQuarksHashTable; GHashTable *quarksToGSettingsWrappersHashTable; GHashTable *pluginsToSettingsSpecialTypesHashTable; GHashTable *pluginsToSettingNameMATENameHashTable; CCSMATEValueChangeData *valueChangeData; }; static void mateGSettingsValueChanged (GSettings *settings, gchar *key, gpointer user_data) { CCSMATEValueChangeData *data = (CCSMATEValueChangeData *) user_data; char *baseName = ccsGSettingsIntegratedSettingsTranslateNewMATEKeyForCCS (key); /* We don't care if integration is not enabled */ if (!ccsGetIntegrationEnabled (data->context)) return; CCSIntegratedSettingList settingList = ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (data->storage, ccsMATEIntegrationFindSettingsMatchingPredicate, baseName); ccsIntegrationUpdateIntegratedSettings (data->integration, data->context, settingList); g_free (baseName); } GCallback ccsGSettingsIntegratedSettingsChangeCallback () { return (GCallback) mateGSettingsValueChanged; } static CCSIntegratedSetting * createNewGSettingsIntegratedSetting (CCSGSettingsWrapper *wrapper, const char *mateName, const char *pluginName, const char *settingName, CCSSettingType type, SpecialOptionType specialOptionType, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingInfo *sharedIntegratedSettingInfo = ccsSharedIntegratedSettingInfoNew (pluginName, settingName, type, ai); if (!sharedIntegratedSettingInfo) return NULL; CCSMATEIntegratedSettingInfo *mateIntegratedSettingInfo = ccsMATEIntegratedSettingInfoNew (sharedIntegratedSettingInfo, specialOptionType, mateName, ai); if (!mateIntegratedSettingInfo) { ccsIntegratedSettingInfoUnref (sharedIntegratedSettingInfo); return NULL; } CCSIntegratedSetting *gsettingsIntegratedSetting = ccsGSettingsIntegratedSettingNew (mateIntegratedSettingInfo, wrapper, ai); if (!gsettingsIntegratedSetting) { ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) mateIntegratedSettingInfo); return NULL; } return gsettingsIntegratedSetting; } static void ccsGSettingsWrapperUnrefWrapper (gpointer wrapper) { ccsGSettingsWrapperUnref ((CCSGSettingsWrapper *) wrapper); } static GHashTable * initializeGSettingsWrappers (CCSGSettingsWrapperFactory *factory) { const CCSGSettingsWrapperIntegratedSchemasQuarks *quarks = ccsMATEGSettingsWrapperQuarks (); GHashTable *quarksToGSettingsWrappers = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, ccsGSettingsWrapperUnrefWrapper); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_COMPIZ_INTEGRATED), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_COMPIZ_INTEGRATED), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_MATE_DESKTOP_WM_KEYBINDINGS), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_MATE_DESKTOP_WM_PREFERENCES), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_MATE_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_MATE_DESKTOP_DEFAULT_APPLICATIONS_TERMINAL), factory->object.object_allocation)); g_hash_table_insert (quarksToGSettingsWrappers, GINT_TO_POINTER (quarks->ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS), ccsGSettingsWrapperFactoryNewGSettingsWrapper (factory, g_quark_to_string (quarks->ORG_MATE_SETTINGS_DAEMON_PLUGINS_MEDIA_KEYS), factory->object.object_allocation)); return quarksToGSettingsWrappers; } CCSIntegratedSetting * ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); GHashTable *settingsGSettingsWrapperQuarksHashTable = g_hash_table_lookup (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable, pluginName); GHashTable *settingsSpecialTypesHashTable = g_hash_table_lookup (priv->pluginsToSettingsSpecialTypesHashTable, pluginName); GHashTable *settingsSettingNameMATENameHashTable = g_hash_table_lookup (priv->pluginsToSettingNameMATENameHashTable, pluginName); if (!priv->quarksToGSettingsWrappersHashTable) priv->quarksToGSettingsWrappersHashTable = initializeGSettingsWrappers (priv->wrapperFactory); if (settingsGSettingsWrapperQuarksHashTable && settingsSpecialTypesHashTable && settingsSettingNameMATENameHashTable) { GQuark wrapperQuark = GPOINTER_TO_INT (g_hash_table_lookup (settingsGSettingsWrapperQuarksHashTable, settingName)); CCSGSettingsWrapper *wrapper = g_hash_table_lookup (priv->quarksToGSettingsWrappersHashTable, GINT_TO_POINTER (wrapperQuark)); SpecialOptionType specialType = (SpecialOptionType) GPOINTER_TO_INT (g_hash_table_lookup (settingsSpecialTypesHashTable, settingName)); const gchar *integratedName = g_hash_table_lookup (settingsSettingNameMATENameHashTable, settingName); if (wrapper == NULL) return NULL; return createNewGSettingsIntegratedSetting (wrapper, integratedName, pluginName, settingName, type, specialType, factory->object.object_allocation); } return NULL; } void ccsGSettingsIntegratedSettingFactoryFree (CCSIntegratedSettingFactory *factory) { CCSGSettingsIntegratedSettingFactoryPrivate *priv = (CCSGSettingsIntegratedSettingFactoryPrivate *) ccsObjectGetPrivate (factory); if (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable) g_hash_table_unref (priv->pluginsToSettingsGSettingsWrapperQuarksHashTable); if (priv->quarksToGSettingsWrappersHashTable) g_hash_table_unref (priv->quarksToGSettingsWrappersHashTable); if (priv->pluginsToSettingsSpecialTypesHashTable) g_hash_table_unref (priv->pluginsToSettingsSpecialTypesHashTable); if (priv->pluginsToSettingNameMATENameHashTable) g_hash_table_unref (priv->pluginsToSettingNameMATENameHashTable); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); ccsObjectFinalize (factory); (*factory->object.object_allocation->free_) (factory->object.object_allocation->allocator, factory); } const CCSIntegratedSettingFactoryInterface ccsGSettingsIntegratedSettingFactoryInterface = { ccsGSettingsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType, ccsGSettingsIntegratedSettingFactoryFree }; CCSIntegratedSettingFactory * ccsGSettingsIntegratedSettingFactoryNew (CCSGSettingsWrapperFactory *wrapperFactory, CCSMATEValueChangeData *valueChangeData, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingFactory *factory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingFactory)); if (!factory) return NULL; CCSGSettingsIntegratedSettingFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsIntegratedSettingFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, factory); return NULL; } ccsGSettingsWrapperFactoryRef (wrapperFactory); priv->wrapperFactory = wrapperFactory; priv->pluginsToSettingsGSettingsWrapperQuarksHashTable = ccsMATEGSettingsIntegrationPopulateSettingNameToIntegratedSchemasQuarksHashTable (); priv->pluginsToSettingsSpecialTypesHashTable = ccsMATEIntegrationPopulateSpecialTypesHashTables (); priv->pluginsToSettingNameMATENameHashTable = ccsMATEIntegrationPopulateSettingNameToMATENameHashTables (); priv->valueChangeData = valueChangeData; ccsObjectInit (factory, ai); ccsObjectSetPrivate (factory, (CCSPrivate *) priv); ccsObjectAddInterface (factory, (const CCSInterface *) &ccsGSettingsIntegratedSettingFactoryInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface)); ccsObjectRef (factory); return factory; } ./compizconfig/integration/mate/gsettings/src/ccs_mate_integration_gsettings_wrapper_factory.c0000644000004100000410000001156013246301623033707 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_mate_integration_gsettings_wrapper_factory.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_mate_integration_gsettings_wrapper_factory.h" /* CCSGSettingsWrapperFactory implementation */ typedef struct _CCSMATEIntegrationGSettingsWrapperFactoryPrivate CCSMATEIntegrationGSettingsWrapperFactoryPrivate; struct _CCSMATEIntegrationGSettingsWrapperFactoryPrivate { CCSGSettingsWrapperFactory *wrapperFactory; GCallback callback; /* This is expected to stay alive during the * lifetime of this object */ CCSMATEValueChangeData *data; }; static void ccsMATEIntegrationGSettingsWrapperFree (CCSGSettingsWrapperFactory *wrapperFactory) { CCSMATEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSMATEIntegrationGSettingsWrapperFactoryPrivate, wrapperFactory); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); ccsObjectFinalize (wrapperFactory); (*wrapperFactory->object.object_allocation->free_) (wrapperFactory->object.object_allocation->allocator, wrapperFactory); } static void connectWrapperToChangedSignal (CCSGSettingsWrapper *wrapper, CCSMATEIntegrationGSettingsWrapperFactoryPrivate *priv) { ccsGSettingsWrapperConnectToChangedSignal (wrapper, priv->callback, priv->data); } static CCSGSettingsWrapper * ccsMATEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { CCSMATEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSMATEIntegrationGSettingsWrapperFactoryPrivate, factory); CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperFactoryNewGSettingsWrapper (priv->wrapperFactory, schemaName, factory->object.object_allocation); if (wrapper != NULL) connectWrapperToChangedSignal (wrapper, priv); return wrapper; } static CCSGSettingsWrapper * ccsMATEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { CCSMATEIntegrationGSettingsWrapperFactoryPrivate *priv = GET_PRIVATE (CCSMATEIntegrationGSettingsWrapperFactoryPrivate, factory); CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (priv->wrapperFactory, schemaName, path, factory->object.object_allocation); connectWrapperToChangedSignal (wrapper, priv); return wrapper; } const CCSGSettingsWrapperFactoryInterface ccsMATEIntegrationGSettingsWrapperFactoryInterface = { ccsMATEIntegrationGSettingsWrapperFactoryNewGSettingsWrapper, ccsMATEIntegrationGSettingsWrapperFactoryNewGSettingsWrapperWithPath, ccsMATEIntegrationGSettingsWrapperFree }; CCSGSettingsWrapperFactory * ccsMATEIntegrationGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai, CCSGSettingsWrapperFactory *factory, GCallback callback, CCSMATEValueChangeData *data) { CCSGSettingsWrapperFactory *wrapperFactory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapperFactory) return NULL; CCSMATEIntegrationGSettingsWrapperFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSMATEIntegrationGSettingsWrapperFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, wrapperFactory); return NULL; } ccsGSettingsWrapperFactoryRef (factory); priv->wrapperFactory = factory; priv->callback = callback; priv->data = data; ccsObjectInit (wrapperFactory, ai); ccsObjectAddInterface (wrapperFactory, (const CCSInterface *) &ccsMATEIntegrationGSettingsWrapperFactoryInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapperFactory, (CCSPrivate *) priv); ccsGSettingsWrapperFactoryRef (wrapperFactory); return wrapperFactory; } ./compizconfig/integration/mate/gsettings/src/ccs_mate_integration_gsettings_integrated_setting.c0000644000004100000410000002457613246301623034376 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include "ccs_mate_integration_gsettings_integrated_setting.h" #include "ccs_mate_integrated_setting.h" #include "ccs_mate_integration_constants.h" /* CCSGSettingsIntegratedSetting implementation */ typedef struct _CCSGSettingsIntegratedSettingPrivate CCSGSettingsIntegratedSettingPrivate; struct _CCSGSettingsIntegratedSettingPrivate { CCSMATEIntegratedSettingInfo *mateIntegratedSetting; CCSGSettingsWrapper *wrapper; }; char * ccsGSettingsIntegratedSettingsTranslateOldMATEKeyForGSettings (const char *key) { char *newKey = translateKeyForGSettings (key); if (g_strcmp0 (newKey, "run-command-screenshot") == 0) { free (newKey); newKey = strdup ("screenshot"); } else if (g_strcmp0 (newKey, "run-command-window-screenshot") == 0) { free (newKey); newKey = strdup ("window-screenshot"); } else if (g_strcmp0 (newKey, "run-command-terminal") == 0) { free (newKey); newKey = strdup ("terminal"); } return newKey; } SpecialOptionType ccsGSettingsIntegratedSettingGetSpecialOptionType (CCSMATEIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsMATEIntegratedSettingInfoGetSpecialOptionType (priv->mateIntegratedSetting); } const char * ccsGSettingsIntegratedSettingGetMATEName (CCSMATEIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsMATEIntegratedSettingInfoGetMATEName (priv->mateIntegratedSetting); } CCSSettingValue * ccsGSettingsIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); CCSSettingValue *v = calloc (1, sizeof (CCSSettingValue)); const char *mateKeyName = ccsMATEIntegratedSettingInfoGetMATEName ((CCSMATEIntegratedSettingInfo *) setting); char *gsettingsTranslatedName = ccsGSettingsIntegratedSettingsTranslateOldMATEKeyForGSettings (mateKeyName); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; GVariant *variant = ccsGSettingsWrapperGetValue (priv->wrapper, gsettingsTranslatedName); if (!variant) { free (gsettingsTranslatedName); free (v); return NULL; } const GVariantType *variantType = G_VARIANT_TYPE (g_variant_get_type_string (variant)); switch (type) { case TypeInt: if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_INT32)) { ccsError ("Expected integer value"); free (v); v = NULL; break; } v->value.asInt = readIntFromVariant (variant); break; case TypeBool: if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_BOOLEAN)) { ccsError ("Expected boolean value"); free (v); v = NULL; break; } v->value.asBool = readBoolFromVariant (variant); break; case TypeString: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_STRING)) { ccsError ("Expected string value"); free (v); v = NULL; break; } const char *str = readStringFromVariant (variant); v->value.asString = strdup (str ? str : ""); break; } case TypeKey: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE ("as"))) { ccsError ("Expected array-of-string value"); free (v); v = NULL; break; } gsize len; const gchar **strv = g_variant_get_strv (variant, &len); if (strv) v->value.asString = strdup (strv[0] ? strv[0] : ""); else v->value.asString = strdup (""); g_free (strv); break; } default: g_assert_not_reached (); } g_variant_unref (variant); free (gsettingsTranslatedName); return v; } void ccsGSettingsIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *v, CCSSettingType type) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); const char *mateKeyName = ccsMATEIntegratedSettingInfoGetMATEName ((CCSMATEIntegratedSettingInfo *) setting); char *gsettingsTranslatedName = ccsGSettingsIntegratedSettingsTranslateOldMATEKeyForGSettings (mateKeyName); GVariant *variant = ccsGSettingsWrapperGetValue (priv->wrapper, gsettingsTranslatedName); const GVariantType *variantType = g_variant_get_type (variant); GVariant *newVariant = NULL; if (!variant) { ccsError ("NULL encountered while reading GSettings value"); free (gsettingsTranslatedName); return; } switch (type) { case TypeInt: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_INT32)) ccsError ("Expected integer value"); else { int currentValue = readIntFromVariant (variant); if ((currentValue != v->value.asInt)) writeIntToVariant (v->value.asInt, &newVariant); } } break; case TypeBool: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_BOOLEAN)) ccsError ("Expected boolean value"); else { gboolean currentValue = readBoolFromVariant (variant); if ((currentValue != v->value.asBool)) writeBoolToVariant (v->value.asBool, &newVariant); } } break; case TypeString: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE_STRING)) ccsError ("Expected string value"); else { const char *defaultValue = ""; const char *newValue = v->value.asString ? v->value.asString : defaultValue; gsize len = 0; const gchar *currentValue = g_variant_get_string (variant, &len); if (currentValue) { if (strcmp (currentValue, newValue) != 0) writeStringToVariant (newValue, &newVariant); } } } break; case TypeKey: { if (!g_variant_type_equal (variantType, G_VARIANT_TYPE ("as"))) ccsError ("Expected array-of-string value"); else { const char *defaultValue = ""; GVariantBuilder strvBuilder; g_variant_builder_init (&strvBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&strvBuilder, "s", v->value.asString ? v->value.asString : defaultValue); newVariant = g_variant_builder_end (&strvBuilder); } } break; default: g_assert_not_reached (); break; } /* g_settings_set_value consumes the reference */ if (newVariant) ccsGSettingsWrapperSetValue (priv->wrapper, gsettingsTranslatedName, newVariant); g_variant_unref (variant); free (gsettingsTranslatedName); } const char * ccsGSettingsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) priv->mateIntegratedSetting); } const char * ccsGSettingsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *) priv->mateIntegratedSetting); } CCSSettingType ccsGSettingsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); return ccsIntegratedSettingInfoGetType ((CCSIntegratedSettingInfo *) priv->mateIntegratedSetting); } void ccsGSettingsIntegratedSettingFree (CCSIntegratedSetting *setting) { CCSGSettingsIntegratedSettingPrivate *priv = (CCSGSettingsIntegratedSettingPrivate *) ccsObjectGetPrivate (setting); if (priv->wrapper) ccsGSettingsWrapperUnref (priv->wrapper); ccsIntegratedSettingInfoUnref ((CCSIntegratedSettingInfo *) priv->mateIntegratedSetting); ccsObjectFinalize (setting); (*setting->object.object_allocation->free_) (setting->object.object_allocation->allocator, setting); } void ccsGSettingsIntegratedSettingInfoFree (CCSIntegratedSettingInfo *info) { return ccsGSettingsIntegratedSettingFree ((CCSIntegratedSetting *) info); } void ccsGSettingsMATEIntegratedSettingInfoFree (CCSMATEIntegratedSettingInfo *info) { return ccsGSettingsIntegratedSettingFree ((CCSIntegratedSetting *) info); } const CCSMATEIntegratedSettingInfoInterface ccsGSettingsMATEIntegratedSettingInterface = { ccsGSettingsIntegratedSettingGetSpecialOptionType, ccsGSettingsIntegratedSettingGetMATEName, ccsGSettingsMATEIntegratedSettingInfoFree }; const CCSIntegratedSettingInterface ccsGSettingsIntegratedSettingInterface = { ccsGSettingsIntegratedSettingReadValue, ccsGSettingsIntegratedSettingWriteValue, ccsGSettingsIntegratedSettingFree }; const CCSIntegratedSettingInfoInterface ccsGSettingsIntegratedSettingInfoInterface = { ccsGSettingsIntegratedSettingInfoPluginName, ccsGSettingsIntegratedSettingInfoSettingName, ccsGSettingsIntegratedSettingInfoGetType, ccsGSettingsIntegratedSettingInfoFree }; CCSIntegratedSetting * ccsGSettingsIntegratedSettingNew (CCSMATEIntegratedSettingInfo *base, CCSGSettingsWrapper *wrapper, CCSObjectAllocationInterface *ai) { CCSIntegratedSetting *setting = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting)); if (!setting) return NULL; CCSGSettingsIntegratedSettingPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsIntegratedSettingPrivate)); if (!priv) { (*ai->free_) (ai->allocator, priv); return NULL; } priv->mateIntegratedSetting = base; priv->wrapper = wrapper; ccsGSettingsWrapperRef (priv->wrapper); ccsObjectInit (setting, ai); ccsObjectSetPrivate (setting, (CCSPrivate *) priv); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsObjectAddInterface (setting, (const CCSInterface *) &ccsGSettingsMATEIntegratedSettingInterface, GET_INTERFACE_TYPE (CCSMATEIntegratedSettingInfoInterface)); ccsIntegratedSettingRef (setting); return setting; } ./compizconfig/integration/mate/gsettings/tests/0000755000004100000410000000000013246301623022354 5ustar www-datawww-data./compizconfig/integration/mate/gsettings/tests/CMakeLists.txt0000644000004100000410000000306713246301623025122 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_SOURCE_DIR}/tests/shared/glib) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../gsettings/tests) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../../../gsettings/mocks) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../mocks/libcompizconfig) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../tests/) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../src/) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_executable (compizconfig_test_ccs_mate_gsettings_integrated_setting ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_mate_gsettings_integrated_setting.cpp) target_link_libraries (compizconfig_test_ccs_mate_gsettings_integrated_setting ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_gsettings_settings_test_env compizconfig_ccs_gsettings_wrapper_mock compizconfig_mate_integration_gsettings_integrated_setting compizconfig_gsettings_backend_interface) compiz_discover_tests (compizconfig_test_ccs_mate_gsettings_integrated_setting COVERAGE compizconfig_mate_integration_gsettings_integrated_setting) ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootroot./compizconfig/integration/mate/gsettings/tests/compizconfig_test_ccs_mate_gsettings_integrated_setting.cpp./compizconfig/integration/mate/gsettings/tests/compizconfig_test_ccs_mate_gsettings_integrated_sett0000644000004100000410000003051613246301623035224 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::Combine; using ::testing::Return; using ::testing::IsNull; using ::testing::ValuesIn; using ::testing::Values; using ::testing::Eq; using ::testing::WithArgs; using ::testing::_; namespace compiz { namespace config { namespace integration { namespace test { const std::string KEYBINDING_ONE = "keybinding_one"; const std::string KEYBINDING_TWO = "keybinding_two"; const std::string STRING = "string"; const Bool BOOLEAN = TRUE; const int INTEGER = 2; const std::string STRING_ALT = "string_alt"; const Bool BOOLEAN_ALT = FALSE; const int INTEGER_ALT = 1; namespace variant_generators { GVariant * i (); GVariant * s (); GVariant * b (); GVariant * as (); GVariant * fromValue (CCSSettingValue *v, CCSSettingType type); } namespace value_generators { CCSSettingValue * integer (); CCSSettingValue * string (); CCSSettingValue * key (); CCSSettingValue * boolean (); } namespace expectations { void integer (CCSSettingValue *); void string (CCSSettingValue *); void boolean (CCSSettingValue *); void key (CCSSettingValue *); void integerVariant (GVariant *, int); void stringVariant (GVariant *, const std::string &); void booleanVariant (GVariant *, bool); void keyVariant (GVariant *, const std::string &); } typedef GVariant * (*VariantGenerator) (); typedef CCSSettingValue * (*ValueGenerator) (); typedef void (*Expectation) (CCSSettingValue *); struct GSettingsIntegratedSettingInfo { VariantGenerator variantGenerator; ValueGenerator valueGenerator; Expectation expectation; CCSSettingType settingType; CCSSettingType returnType; }; namespace impl { namespace ccit = compiz::config::integration::test; namespace vg = compiz::config::integration::test::variant_generators; namespace cvg = compiz::config::integration::test::value_generators; namespace ex = compiz::config::integration::test::expectations; ccit::GSettingsIntegratedSettingInfo settingsInfo[] = { { vg::i, cvg::integer, ex::integer, TypeInt, TypeInt }, { vg::b, cvg::boolean, ex::boolean, TypeBool, TypeBool }, { vg::s, cvg::string, ex::string, TypeString, TypeString }, { vg::as, cvg::key, ex::key, TypeKey, TypeString } }; } } } } } MATCHER_P (VariantEqual, lhs, "Variants Equal") { return g_variant_equal (lhs, arg); } namespace { std::map & ccsTypeToSpecialType () { static std::map types; static bool initialized = false; if (!initialized) { types[TypeInt] = OptionInt; types[TypeBool] = OptionBool; types[TypeString] = OptionString; types[TypeKey] = OptionKey; } return types; } } namespace ccit = compiz::config::integration::test; namespace cciti = compiz::config::integration::test::impl; namespace ccvg = compiz::config::integration::test::variant_generators; namespace ccvalg = compiz::config::integration::test::value_generators; namespace ccex = compiz::config::integration::test::expectations; typedef std::tr1::tuple CCSGSettingsIntegratedSettingTestInfo; class CCSGSettingsIntegratedSettingTest : public ::testing::TestWithParam { public: virtual void SetUp (); virtual void TearDown (); protected: CompizGLibGSliceOffEnv env; boost::shared_ptr mWrapper; CCSGSettingsWrapperGMock *mWrapperMock; }; GVariant * ccvg::fromValue (CCSSettingValue *v, CCSSettingType type) { switch (type) { case TypeInt: return g_variant_new ("i", v->value.asInt); break; case TypeBool: return g_variant_new ("b", v->value.asBool); break; case TypeString: return g_variant_new ("s", v->value.asString); break; case TypeKey: { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); /* Represented internally as strings */ std::string kb (v->value.asString); if (kb == "Disabled") kb[0] = 'd'; g_variant_builder_add (&builder, "s", kb.c_str ()); return g_variant_builder_end (&builder); } default: break; } return NULL; } GVariant * ccvg::as () { GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", ccit::KEYBINDING_ONE.c_str ()); g_variant_builder_add (&builder, "s", ccit::KEYBINDING_TWO.c_str ()); return g_variant_builder_end (&builder); } GVariant * ccvg::i () { return g_variant_new ("i", ccit::INTEGER); } GVariant * ccvg::b () { return g_variant_new ("b", ccit::BOOLEAN); } GVariant * ccvg::s () { return g_variant_new ("s", ccit::STRING.c_str ()); } namespace { CCSSettingValue * createSettingValue () { CCSSettingValue *v = reinterpret_cast (calloc (1, sizeof (CCSSettingValue))); v->isListChild = FALSE; v->parent = NULL; v->refCount = 1; return v; } } CCSSettingValue * ccvalg::integer () { CCSSettingValue *v = createSettingValue (); v->value.asInt = ccit::INTEGER_ALT; return v; } CCSSettingValue * ccvalg::string () { CCSSettingValue *v = createSettingValue (); v->value.asString = strdup (ccit::STRING_ALT.c_str ()); return v; } CCSSettingValue * ccvalg::key () { CCSSettingValue *v = createSettingValue (); v->value.asString = strdup (ccit::KEYBINDING_TWO.c_str ()); return v; } CCSSettingValue * ccvalg::boolean () { CCSSettingValue *v = createSettingValue (); v->value.asBool = ccit::BOOLEAN_ALT; return v; } void ccex::boolean (CCSSettingValue *v) { EXPECT_EQ (v->value.asBool, ccit::BOOLEAN); } void ccex::integer (CCSSettingValue *v) { EXPECT_EQ (v->value.asInt, ccit::INTEGER); } void ccex::string (CCSSettingValue *v) { EXPECT_EQ (v->value.asString, ccit::STRING); } void ccex::key (CCSSettingValue *v) { EXPECT_EQ (v->value.asString, ccit::KEYBINDING_ONE); } void ccex::integerVariant (GVariant *v , int i) { EXPECT_EQ (g_variant_get_int32 (v), i); } void ccex::stringVariant (GVariant *v, const std::string &s) { gsize len; EXPECT_EQ (g_variant_get_string (v, &len), s); } void ccex::booleanVariant (GVariant *v, bool b) { EXPECT_EQ (g_variant_get_boolean (v), b); } void ccex::keyVariant (GVariant *v, const std::string &s) { gsize len; const gchar * const *strv = g_variant_get_strv (v, &len); EXPECT_EQ (strv[0], s); } void CCSGSettingsIntegratedSettingTest::SetUp () { env.SetUpEnv (); mWrapper.reset (ccsMockGSettingsWrapperNew (), boost::bind (ccsMockGSettingsWrapperFree, _1)); mWrapperMock = reinterpret_cast ( ccsObjectGetPrivate (mWrapper.get ())); } void CCSGSettingsIntegratedSettingTest::TearDown () { mWrapper.reset (); mWrapperMock = NULL; env.TearDownEnv (); } TEST_P (CCSGSettingsIntegratedSettingTest, MatchedTypesReturnValueMismatchedTypesReturnNull) { const std::string keyName ("mock"); const ccit::GSettingsIntegratedSettingInfo &integratedSettingInfo = std::tr1::get <1> (GetParam ()); const CCSSettingType createSettingType = std::tr1::get <0> (GetParam ()); /* The GSettings Integrated setting takes ownership of these */ CCSIntegratedSettingInfo *integratedSetting = ccsSharedIntegratedSettingInfoNew (keyName.c_str (), keyName.c_str (), integratedSettingInfo.settingType, &ccsDefaultObjectAllocator); SpecialOptionType specialType = ccsTypeToSpecialType ()[integratedSettingInfo.settingType]; CCSMATEIntegratedSettingInfo *mateIntegratedSetting = ccsMATEIntegratedSettingInfoNew (integratedSetting, specialType, keyName.c_str (), &ccsDefaultObjectAllocator); boost::shared_ptr gsettingsIntegrated (AutoDestroy (ccsGSettingsIntegratedSettingNew (mateIntegratedSetting, mWrapper.get (), &ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)); GVariant *variant = (*integratedSettingInfo.variantGenerator) (); EXPECT_CALL (*mWrapperMock, getValue (Eq (keyName))).WillOnce (Return (variant)); CCSSettingValue *value = ccsIntegratedSettingReadValue (gsettingsIntegrated.get (), createSettingType); if (createSettingType == integratedSettingInfo.settingType) (*integratedSettingInfo.expectation) (value); else EXPECT_THAT (value, IsNull ()); if (value) ccsFreeSettingValueWithType (value, integratedSettingInfo.returnType); } ACTION (FreeVariant) { g_variant_unref (arg0); } TEST_P (CCSGSettingsIntegratedSettingTest, MatchedTypesReturnValueMismatchedTypesResetOrWrite) { const std::string keyName ("mock"); const ccit::GSettingsIntegratedSettingInfo &integratedSettingInfo = std::tr1::get <1> (GetParam ()); const CCSSettingType createSettingType = std::tr1::get <0> (GetParam ()); CCSIntegratedSettingInfo *integratedSetting = ccsSharedIntegratedSettingInfoNew (keyName.c_str (), keyName.c_str (), integratedSettingInfo.settingType, &ccsDefaultObjectAllocator); SpecialOptionType specialType = ccsTypeToSpecialType ()[integratedSettingInfo.settingType]; CCSMATEIntegratedSettingInfo *mateIntegratedSetting = ccsMATEIntegratedSettingInfoNew (integratedSetting, specialType, keyName.c_str (), &ccsDefaultObjectAllocator); boost::shared_ptr gsettingsIntegrated (AutoDestroy (ccsGSettingsIntegratedSettingNew (mateIntegratedSetting, mWrapper.get (), &ccsDefaultObjectAllocator), ccsIntegratedSettingUnref)); boost::shared_ptr value ((*integratedSettingInfo.valueGenerator) (), boost::bind (ccsFreeSettingValueWithType, _1, integratedSettingInfo.returnType)); boost::shared_ptr variant = AutoDestroy (g_variant_ref ((*integratedSettingInfo.variantGenerator) ()), g_variant_unref); boost::shared_ptr newVariant = AutoDestroy (ccvg::fromValue (value.get (), integratedSettingInfo.settingType), g_variant_unref); EXPECT_CALL (*mWrapperMock, getValue (Eq (keyName))).WillOnce (Return (variant.get ())); if (createSettingType == integratedSettingInfo.settingType) EXPECT_CALL (*mWrapperMock, setValue (Eq (keyName), VariantEqual (newVariant.get ()))) .WillOnce (WithArgs <1> (FreeVariant ())); else EXPECT_CALL (*mWrapperMock, resetKey (Eq (keyName))); ccsIntegratedSettingWriteValue (gsettingsIntegrated.get (), value.get (), createSettingType); } INSTANTIATE_TEST_CASE_P (CCSGSettingsIntegratedSettingTestMismatchedValues, CCSGSettingsIntegratedSettingTest, Combine (Values (TypeInt, TypeString, TypeBool, TypeKey), ValuesIn (cciti::settingsInfo))); ./compizconfig/libcompizconfig/0000755000004100000410000000000013246301624017111 5ustar www-datawww-data./compizconfig/libcompizconfig/CMakeLists.txt0000644000004100000410000000730313246301623021653 0ustar www-datawww-dataproject (libcompizconfig) set (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CompizDefaults) include (CompizCommon) include (CompizPackage) include (CheckLibraryExists) include (CheckIncludeFile) set (CMAKE_MODULE_PATH_ORIG ${CMAKE_MODULE_PATH}) set (LIBCOMPIZCONFIG_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LIBCOMPIZCONFIG_CMAKE_MODULE_PATH}) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set (ALL_LINGUAS af ar bg bn bn_IN bs ca cs cy da de el en_GB en_US es eu et fi fr gl gu he hi hr hu id it ja ka km ko lo lt mk mr nb nl or pa pl pt pt_BR ro ru sk sl sr sv ta tr uk vi xh zh_CN zh_TW zu) set (GETTEXT_PACKAGE libcompizconfig) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" ) include_directories ( "include" ) set (COMPIZ_SYSCONFDIR "/etc" CACHE PATH "/etc") option (USE_PROTOBUF "Use Google Protocol Buffers library for faster XML loading" ON ) set (PROTOC_ERROR_MESSAGE "\nWARNING: You need to install Protocol Buffers to get faster program startup.\n" "Sources are available at http://code.google.com/p/protobuf/downloads/list\n" "Package names for Ubuntu/Debian: libprotobuf0, libprotobuf-dev, protobuf-compiler\n" "Package names for other distributions: protobuf, protobuf-devel\n" "Disabling protobuf.\n" ) set (LIBCOMPIZCONFIG_PROTOBUF protobuf) if (USE_PROTOBUF) find_program (HAVE_PROTOC protoc) if (HAVE_PROTOC) if (USE_PROTOBUF) pkg_check_modules (PROTOBUF protobuf) if (PROTOBUF_FOUND) else () message (${PROTOC_ERROR_MESSAGE}) set (USE_PROTOBUF false ) endif (PROTOBUF_FOUND) endif (USE_PROTOBUF) else () message (${PROTOC_ERROR_MESSAGE}) set (USE_PROTOBUF false ) endif (HAVE_PROTOC) endif (USE_PROTOBUF) if (USE_PROTOBUF) set (HAVE_PROTOBUF TRUE) endif (USE_PROTOBUF) check_include_file ("sys/inotify.h" HAVE_INOTIFY) set (INOTIFY_WARNING_MESSAGE "NOTE\n ======\n Inotify header files not found. While this library might work \n without them, user experience is degraded as settings won't be\n applied instantly. We strongly suggest installing the inotify\n header files.\n") if (HAVE_INOTIFY) else () message (${INOTIFY_WARNING_MESSAGE}) endif (HAVE_INOTIFY) set (COMPIZCONFIG_LIBDIR ${libdir}) set (LIBCOMPIZCONFIG_REQUIRES x11 libxml-2.0 libxslt ) if (HAVE_PROTOBUF) set (LIBCOMPIZCONFIG_REQUIRES ${LIBCOMPIZCONFIG_REQUIRES} protobuf) endif () compiz_pkg_check_modules (LIBCOMPIZCONFIG REQUIRED ${LIBCOMPIZCONFIG_REQUIRES}) list (APPEND LIBCOMPIZCONFIG_LIBRARIES ${COMPIZ_LIBRARIES}) list (APPEND LIBCOMPIZCONFIG_LIBRARY_DIRS ${COMPIZ_LIBRARY_DIRS}) list (APPEND LIBCOMPIZCONFIG_INCLUDE_DIRS ${COMPIZ_INCLUDE_DIRS}) compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig.pc ) compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/libcompizconfig_internal.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig_internal.pc ) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/libcompizconfig.pc DESTINATION ${libdir}/pkgconfig ) add_subdirectory (config) add_subdirectory (backend) add_subdirectory (src) add_subdirectory (include) add_subdirectory (cmake) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) ./compizconfig/libcompizconfig/INSTALL0000644000004100000410000000052013246301623020136 0ustar www-datawww-datalibcompizconfig uses out-of-tree builds with cmake, in order to generate the Makefiles for compiz use: $ mkdir build $ cd build $ cmake .. After that, standard build procedures apply: $ make # make install In order to build other backends, you will need to install the compizconfig cmake set # make findcompizconfig_install ./compizconfig/libcompizconfig/README0000644000004100000410000000000013246301623017756 0ustar www-datawww-data./compizconfig/libcompizconfig/include/0000755000004100000410000000000013246301623020533 5ustar www-datawww-data./compizconfig/libcompizconfig/include/CMakeLists.txt0000644000004100000410000000034213246301623023272 0ustar www-datawww-dataset (_headers ccs-backend.h ccs-defs.h ccs-fwd.h ccs-list.h ccs-object.h ccs-string.h ccs-setting-types.h ccs.h ) install ( FILES ${_headers} DESTINATION ${libcompizconfig_includedir} ) ./compizconfig/libcompizconfig/include/ccs-object.h0000644000004100000410000001552413246301623022727 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: Sam Spilsbury */ #ifndef _CCS_OBJECT_H #define _CCS_OBJECT_H #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSInterface CCSInterface; /* Dummy typedef */ typedef struct _CCSPrivate CCSPrivate; /* Dummy typedef */ typedef void * (*reallocObjectProc) (void *, void *, size_t); typedef void * (*mallocObjectProc) (void *, size_t); typedef void * (*callocObjectProc) (void *, size_t, size_t); typedef void (*freeObjectProc) (void *, void *); /** * An interface which specifies how objects should be allocated * * The purpose of this interface is to provide wrappers around * the standard realloc, malloc, calloc and free functions. * * ccsObjectInit takes this allocation interface as a means of * being able to test what happens when an allocation fails. * * Any other objects which implement CCSObject should also take * this interface and pass it to ccsObjectInit. They should also * use this interface as a means to allocate their own data so * that tests for those objects can test allocation failures */ struct _CCSObjectAllocationInterface { reallocObjectProc realloc_; mallocObjectProc malloc_; callocObjectProc calloc_; freeObjectProc free_; void *allocator; }; extern CCSObjectAllocationInterface ccsDefaultObjectAllocator; /** * * CCSObject - a generic C based object * * CCSObject is a generic C based object system for compizconfig. * Any structure that wishes to behave in an object oriented way * should have a CCSObject as its first and only member, and with * the name "object". (The macros that use CCSObject require this * in order to use it safely). * * CCSObject only provides two facilites to clients - implementation * of interfaces (which are just structs of function pointers) and * private data storage. * * They can also be refcounted, however, this is only ever done safely * if the object implements a virtual destructor method in its interface * so that the macro CCSREF_OBJ knows what to destroy first. * * CCSObjects must be initialized before they are used. This can be * done by calling ccsObjectInit and passing in the allocated memory * block containing the object and a CCSObjectAllocationInterface * which * ccsObjectInit will store in the object and use for all future * allocations. * * Objects can implement interfaces by storing a struct of function pointers * pertaining to that interface associated with that interface's unique type * id generated at runtime. Eg * * ccsObjectAddInterface (object, (const CCSInterface *) &interface, * GET_INTERFACE_TYPE (Interface)); * * Then you can retreive that interface and access its methods as follows: * * GET_INTERFACE (Interface, object)->method * * Objects also have one pointer available for private storage. It is * recommended that all nonvirtual data lives in such storage. Add * a private using: * * ccsObjectSetPrivate (object, (CCSPrivate *) priv); * * Setting a private member does NOT free the existing private member if * it is set. It is the object's responsibility to do this if it wishes * to set a new private member, or set the existing one to NULL. * * To finalize an object and free all related data, use ccsObjectFinalize * * ccsObjectFinalize (object); * * This will free all private data, interface arrays and other data * using the provided CCSObjectAllocationInterface on ccsObjectInit. */ struct _CCSObject { CCSPrivate *priv; /* Private pointer for object storage */ const CCSInterface **interfaces; /* An array of interfaces that this object implements */ int *interface_types; /* An array of interface types */ unsigned int n_interfaces; unsigned int n_allocated_interfaces; CCSObjectAllocationInterface *object_allocation; unsigned int refcnt; /* Reference count of this object */ }; Bool ccsObjectInit_ (CCSObject *object, CCSObjectAllocationInterface *interface); #define ccsObjectInit(o, interface) (ccsObjectInit_) (&(o)->object, interface) Bool ccsObjectAddInterface_ (CCSObject *object, const CCSInterface *interface, int interface_type); #define ccsObjectAddInterface(o, interface, type) (ccsObjectAddInterface_) (&(o)->object, interface, type); Bool ccsObjectRemoveInterface_ (CCSObject *object, int interface_type); #define ccsObjectRemoveInterface(o, interface_type) (ccsObjectRemoveInterface_) (&(o)->object, interface_type); const CCSInterface * ccsObjectGetInterface_ (CCSObject *object, int interface_type); #define ccsObjectGetInterface(o, interface_type) (ccsObjectGetInterface_) (&(o)->object, interface_type) #define ccsObjectRef(o) \ do { ++((o)->object).refcnt; } while (FALSE) #define ccsObjectUnref(o, freeFunc) \ do \ { \ --((o)->object).refcnt; \ if (!((o)->object).refcnt) \ freeFunc (o); \ } while (FALSE) CCSPrivate * ccsObjectGetPrivate_ (CCSObject *object); #define ccsObjectGetPrivate(o) (ccsObjectGetPrivate_) (&(o)->object) void ccsObjectSetPrivate_ (CCSObject *object, CCSPrivate *priv); #define ccsObjectSetPrivate(o, priv) (ccsObjectSetPrivate_) (&(o)->object, priv) void ccsObjectFinalize_ (CCSObject *object); #define ccsObjectFinalize(o) (ccsObjectFinalize_) (&(o)->object) /** * Internal method to allocate a type. * * @brief ccsAllocateType * @return a new type */ unsigned int ccsAllocateType (); #define GET_INTERFACE_TYPE(Interface) \ ccs##Interface##GetType () /** * Used to define a new interface type - you should do this if any CCSObject * is to implement this interface */ #define INTERFACE_TYPE(Interface) \ unsigned int ccs##Interface##GetType () \ { \ static unsigned int type_id = 0; \ if (!type_id) \ type_id = ccsAllocateType (); \ \ return type_id; \ } #define GET_INTERFACE(CType, o) (CType *) ccsObjectGetInterface (o, GET_INTERFACE_TYPE(CType)) #define CCSREF_OBJ(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ccsObjectRef (d); \ } \ \ void ccs##type##Unref (dtype *d) \ { \ ccsObjectUnref (d, ccsFree##type); \ } \ COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs-defs.h0000644000004100000410000000440313246301623022374 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_DEFS_H #define _CCS_DEFS_H #include /* for NULL */ #ifdef __cplusplus # define COMPIZCONFIG_BEGIN_DECLS extern "C" { # define COMPIZCONFIG_END_DECLS } #else # define COMPIZCONFIG_BEGIN_DECLS # define COMPIZCONFIG_END_DECLS #endif COMPIZCONFIG_BEGIN_DECLS #ifndef Bool #define Bool int #endif #ifndef TRUE #define TRUE ~0 #endif #ifndef FALSE #define FALSE 0 #endif /** * reference counting * * ccsSettingRef * References the settings object so it can be kept in a list and * unreferenced later with freeObj (mixed with objects that need * to be freed and need not be freed) * * ccsSettingUnref * Unreferences the settings object, when the reference count reaches * zero, the object is freed * */ #define CCSREF_HDR(type,dtype) \ void ccs##type##Ref (dtype *); \ void ccs##type##Unref (dtype *); #define CCSREF_OBJ(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ccsObjectRef (d); \ } \ \ void ccs##type##Unref (dtype *d) \ { \ ccsObjectUnref (d, ccsFree##type); \ } \ #define CCSREF(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ++d->refCount; \ } \ void ccs##type##Unref (dtype *d) \ { \ --d->refCount; \ if (d->refCount == 0) \ ccsFree##type (d); \ } \ #define GET_PRIVATE(Private, obj) \ (Private *) ccsObjectGetPrivate (obj); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs-backend.h0000644000004100000410000005035713246301623023053 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CCS_BACKEND_H #define CCS_BACKEND_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSIntegratedSettingInfoInterface CCSIntegratedSettingInfoInterface; typedef const char * (*CCSIntegratedSettingInfoPluginName) (CCSIntegratedSettingInfo *); typedef const char * (*CCSIntegratedSettingInfoSettingName) (CCSIntegratedSettingInfo *); typedef CCSSettingType (*CCSIntegratedSettingInfoGetType) (CCSIntegratedSettingInfo *); typedef void (*CCSIntegratedSettingInfoFree) (CCSIntegratedSettingInfo *); struct _CCSIntegratedSettingInfoInterface { CCSIntegratedSettingInfoPluginName pluginName; CCSIntegratedSettingInfoSettingName settingName; CCSIntegratedSettingInfoGetType getType; CCSIntegratedSettingInfoFree free; }; /** * @brief The _CCSIntegratedSettingInfo struct * * This interface represents some basic information about a DE * integrated setting, it cannot be operated upon itself */ struct _CCSIntegratedSettingInfo { CCSObject object; }; typedef struct _CCSIntegratedSettingInterface CCSIntegratedSettingInterface; typedef CCSSettingValue * (*CCSIntegratedSettingReadValue) (CCSIntegratedSetting *, CCSSettingType); typedef void (*CCSIntegratedSettingWriteValue) (CCSIntegratedSetting *, CCSSettingValue *, CCSSettingType); typedef void (*CCSIntegratedSettingFree) (CCSIntegratedSetting *); struct _CCSIntegratedSettingInterface { CCSIntegratedSettingReadValue readValue; CCSIntegratedSettingWriteValue writeValue; CCSIntegratedSettingFree free; }; const char * ccsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *); const char * ccsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *); CCSSettingType ccsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *); void ccsFreeIntegratedSettingInfo (CCSIntegratedSettingInfo *); CCSREF_HDR (IntegratedSettingInfo, CCSIntegratedSettingInfo); CCSLIST_HDR (IntegratedSettingInfo, CCSIntegratedSettingInfo); unsigned int ccsCCSIntegratedSettingInfoInterfaceGetType (); /** * @brief The _CCSIntegratedSetting struct * * A CCSIntegratedSetting represents an desktop environment setting which * we are "integrated" with - its functionality is more or less a subset * of CCSSetting, values can be written and read from it but not much else. */ struct _CCSIntegratedSetting { CCSObject object; }; CCSSettingValue * ccsIntegratedSettingReadValue(CCSIntegratedSetting *, CCSSettingType); void ccsIntegratedSettingWriteValue (CCSIntegratedSetting *, CCSSettingValue *, CCSSettingType); void ccsFreeIntegratedSetting (CCSIntegratedSetting *); CCSREF_HDR (IntegratedSetting, CCSIntegratedSetting); CCSLIST_HDR (IntegratedSetting, CCSIntegratedSetting); unsigned int ccsCCSIntegratedSettingInterfaceGetType (); /** * @brief ccsSharedIntegratedInfoSettingNew * @param pluginName Plugin name of the integrated setting * @param settingName Compiz name of the integrated setting * @param type A CCSSettingType * @param ai A CCSObjectAllocationInterface * * @return a new CCSIntegratedSettingInfo * * ccsSharedIntegratedSettingInfoNew () returns the most fundamental * implementation of a CCSIntegratedSettingInfo *, which is basic * information about it, the plugin name, setting name, and type. */ CCSIntegratedSettingInfo * ccsSharedIntegratedSettingInfoNew (const char *pluginName, const char *settingName, CCSSettingType type, CCSObjectAllocationInterface *ai); typedef struct _CCSIntegratedSettingsStorageInterface CCSIntegratedSettingsStorageInterface; /** * A predicate definition to find a CCSIntegratedSetting in a * CCSIntegratedSettingStorage object. Returns true if the user * predicate matches. The void * is some user-specified data */ typedef Bool (*CCSIntegratedSettingsStorageFindPredicate) (CCSIntegratedSetting *, void *); typedef CCSIntegratedSettingList (*CCSIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName) (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName); typedef void (*CCSIntegratedSettingsStorageAddSetting) (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting); typedef CCSIntegratedSettingList (*CCSIntegratedSettingsStorageFindMatchingSettingsByPredicate) (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data); typedef Bool (*CCSIntegratedSettingsStorageEmpty) (CCSIntegratedSettingsStorage *storage); typedef void (*CCSIntegratedSettingsStorageFree) (CCSIntegratedSettingsStorage *storage); struct _CCSIntegratedSettingsStorageInterface { CCSIntegratedSettingsStorageFindMatchingSettingsByPredicate findMatchingSettingsByPredicate; CCSIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName findMatchingSettingsByPluginAndSettingName; CCSIntegratedSettingsStorageAddSetting addSetting; CCSIntegratedSettingsStorageEmpty empty; CCSIntegratedSettingsStorageFree free; }; /** * @brief The _CCSIntegratedSettingsStorage struct * * CCSIntegratedSettingsStorage represents a list of currently active integrated * DE settings. Access is restricted such that settings can only be added and * the list can only be searched by predicates. */ struct _CCSIntegratedSettingsStorage { CCSObject object; }; CCSREF_HDR (IntegratedSettingsStorage, CCSIntegratedSettingsStorage); /** * @brief ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate * @param storage * @param pred * @param data * @return a CCSIntegratedSettingList of CCSIntegratedSetting objects * matching CCSIntegratedSettingsStorageFindPredicate */ CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data); /** * @brief ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName * @param storage * @param pluginName * @param settingName * @return a CCSIntegratedSettingList of CCSIntegratedSetting objects * with the specified plugin and setting names. */ CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName); void ccsIntegratedSettingsStorageAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting); Bool ccsIntegratedSettingsStorageEmpty (CCSIntegratedSettingsStorage *storage); void ccsFreeIntegratedSettingsStorage (CCSIntegratedSettingsStorage *storage); unsigned int ccsCCSIntegratedSettingsStorageInterfaceGetType (); CCSIntegratedSettingsStorage * ccsIntegratedSettingsStorageDefaultImplNew (CCSObjectAllocationInterface *ai); typedef struct _CCSIntegratedSettingFactoryInterface CCSIntegratedSettingFactoryInterface; typedef CCSIntegratedSetting * (*CCSIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType) (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type); typedef void (*CCSIntegratedSettingFactoryFree) (CCSIntegratedSettingFactory *); struct _CCSIntegratedSettingFactoryInterface { CCSIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType createIntegratedSettingForCCSSettingNameAndType; CCSIntegratedSettingFactoryFree free; }; /** * @brief The _CCSIntegratedSettingFactory struct * * CCSIntegratedSettingFactory is an interface for creating a CCSIntegratedSetting * for a particular integration backend when appropriate. It doesn't make sense to load * such information on startup until we need it as we might never write to these settings * and loading them is an expensive process. In addition, we need to allow a place * for testing code to prevent CCSIntegratedSetting objects from pulling * in dependencies that they shouldn't. */ struct _CCSIntegratedSettingFactory { CCSObject object; }; CCSREF_HDR (IntegratedSettingFactory, CCSIntegratedSettingFactory); unsigned int ccsCCSIntegratedSettingFactoryInterfaceGetType (); CCSIntegratedSetting * ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type); void ccsFreeIntegratedSettingFactory (CCSIntegratedSettingFactory *factory); typedef struct _CCSIntegrationInterface CCSIntegrationInterface; typedef CCSIntegratedSetting * (*CCSIntegrationGetIntegratedSetting) (CCSIntegration *integration, const char *pluginName, const char *settingName); typedef Bool (*CCSIntegrationReadOptionIntoSetting) (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); typedef void (*CCSIntegrationWriteSettingIntoOption) (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); typedef void (*CCSIntegrationUpdateIntegratedSettings) (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings); typedef void (*CCSIntegrationDisallowIntegratedWrites) (CCSIntegration *integration); typedef void (*CCSIntegrationAllowIntegratedWrites) (CCSIntegration *integration); typedef void (*CCSFreeIntegrationBackend) (CCSIntegration *integration); struct _CCSIntegrationInterface { CCSIntegrationGetIntegratedSetting getIntegratedSetting; CCSIntegrationReadOptionIntoSetting readOptionIntoSetting; CCSIntegrationWriteSettingIntoOption writeSettingIntoOption; CCSIntegrationUpdateIntegratedSettings updateIntegratedSettings; CCSIntegrationDisallowIntegratedWrites disallowIntegratedWrites; CCSIntegrationAllowIntegratedWrites allowIntegratedWrites; CCSFreeIntegrationBackend freeIntegrationBackend; }; /** * @brief The _CCSIntegration struct * * An object that represents integration with a desktop environment. Generally * these objects store a list of hardcoded settings that can be retrieved using * ccsIntegrationGetIntegratedOptionIndex and then written to and read * from using the readOptionIntoSetting and writeOptionIntoSetting. */ struct _CCSIntegration { CCSObject object; }; CCSREF_HDR (Integration, CCSIntegration) unsigned int ccsCCSIntegrationInterfaceGetType (); CCSIntegratedSetting * ccsIntegrationGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName); Bool ccsIntegrationReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); void ccsIntegrationWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting); void ccsIntegrationUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings); void ccsIntegrationDisallowIntegratedWrites (CCSIntegration *integration); void ccsIntegrationAllowIntegratedWrites (CCSIntegration *integration); void ccsFreeIntegration (CCSIntegration *integration); CCSIntegration * ccsNullIntegrationBackendNew (CCSObjectAllocationInterface *ai); /** * @brief CCSBackend * * This object represents CCSBackend directly in memory. It does * not represent the details that come with a loaded backend. * * Backends are capable of reading, writing and updating settings * from intergrated locations. Clients should check if these functions * are supported first as the function pointers are permitted to be NULL. */ struct _CCSBackend { CCSObject object; }; struct _CCSBackendInfo { const char *name; /* name of the backend */ const char *shortDesc; /* backend's short description */ const char *longDesc; /* backend's long description */ Bool integrationSupport; /* does the backend support DE integration? */ Bool profileSupport; /* does the backend support profiles? */ unsigned int refCount; /* reference count */ }; typedef void (*CCSBackendExecuteEventsFunc) (CCSBackend *backend, unsigned int flags); typedef Bool (*CCSBackendInitFunc) (CCSBackend *, CCSContext * context); typedef Bool (*CCSBackendFiniFunc) (CCSBackend *); typedef Bool (*CCSBackendReadInitFunc) (CCSBackend *, CCSContext * context); typedef void (*CCSBackendReadSettingFunc) (CCSBackend *, CCSContext * context, CCSSetting * setting); typedef void (*CCSBackendReadDoneFunc) (CCSBackend *backend, CCSContext * context); typedef Bool (*CCSBackendWriteInitFunc) (CCSBackend *backend, CCSContext * context); typedef void (*CCSBackendWriteSettingFunc) (CCSBackend *, CCSContext * context, CCSSetting * setting); typedef void (*CCSBackendWriteDoneFunc) (CCSBackend *, CCSContext * context); typedef void (*CCSBackendUpdateFunc) (CCSBackend *, CCSContext *, CCSPlugin *, CCSSetting *); typedef Bool (*CCSBackendGetSettingIsIntegratedFunc) (CCSBackend *, CCSSetting * setting); typedef Bool (*CCSBackendGetSettingIsReadOnlyFunc) (CCSBackend *, CCSSetting * setting); typedef CCSStringList (*CCSBackendGetExistingProfilesFunc) (CCSBackend *, CCSContext * context); typedef Bool (*CCSBackendDeleteProfileFunc) (CCSBackend *, CCSContext * context, char * name); typedef void (*CCSBackendSetIntegration) (CCSBackend *, CCSIntegration *); typedef const CCSBackendInfo * (*CCSBackendGetInfoFunc) (CCSBackend *); struct _CCSBackendInterface { CCSBackendGetInfoFunc backendGetInfo; /* something like a event loop call for the backend, so it can check for file changes no need for reload settings signals anymore */ CCSBackendExecuteEventsFunc executeEvents; CCSBackendInitFunc backendInit; CCSBackendFiniFunc backendFini; CCSBackendReadInitFunc readInit; CCSBackendReadSettingFunc readSetting; CCSBackendReadDoneFunc readDone; CCSBackendWriteInitFunc writeInit; CCSBackendWriteSettingFunc writeSetting; CCSBackendWriteDoneFunc writeDone; CCSBackendUpdateFunc updateSetting; CCSBackendGetSettingIsIntegratedFunc getSettingIsIntegrated; CCSBackendGetSettingIsReadOnlyFunc getSettingIsReadOnly; CCSBackendGetExistingProfilesFunc getExistingProfiles; CCSBackendDeleteProfileFunc deleteProfile; CCSBackendSetIntegration setIntegration; }; unsigned int ccsCCSBackendInterfaceGetType (); /** * @brief ccsBackendGetInfo * @param backend a CCSBackend * * @return a const CCSBackendInfo * for this backend * * This function returns some basic info about this backend, what its * name is, what it suppoirts etc */ const CCSBackendInfo * ccsBackendGetInfo (CCSBackend *backend); /** * @brief ccsBackendExecuteEvents * @param backend a CCSBackend * * @param flags ProcessEventsGlibMainLoopMask or 0 * * something like a event loop call for the backend, * so it can check for file changes */ void ccsBackendExecuteEvents (CCSBackend *backend, unsigned int flags); /** * @brief ccsBackendInit * @param backend * @param context * @return * * Initializes a backend for a context */ Bool ccsBackendInit (CCSBackend *backend, CCSContext *context); /** * @brief ccsBackendFini * @param backend * @param context * @return * * Cleans up the backend */ Bool ccsBackendFini (CCSBackend *backend); Bool ccsBackendReadInit (CCSBackend *backend, CCSContext *context); void ccsBackendReadSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting); void ccsBackendReadDone (CCSBackend *backend, CCSContext *context); Bool ccsBackendWriteInit (CCSBackend *backend, CCSContext *context); void ccsBackendWriteSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting); void ccsBackendWriteDone (CCSBackend *backend, CCSContext *context); /** * @brief ccsBackendUpdateSetting * @param backend The backend on which the update should be processed * @param context The context on which the backend resides. * @param plugin The plugin for the setting * @param setting The setting itself. * * This causes the specified setting to be re-read from the configuration * database and re-written to any integrated keys. It should genrally * be called by calback functions which know that the value * has changed. */ void ccsBackendUpdateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting); Bool ccsBackendGetSettingIsIntegrated (CCSBackend *backend, CCSSetting *setting); Bool ccsBackendGetSettingIsReadOnly (CCSBackend *backend, CCSSetting *setting); /** * @brief ccsBackendGetExistingProfiles * @param backend * @param context * @return a CCSStringist of available profiles for this backend */ CCSStringList ccsBackendGetExistingProfiles (CCSBackend *backend, CCSContext *context); Bool ccsBackendDeleteProfile (CCSBackend *backend, CCSContext *context, char *name); void ccsBackendSetIntegration (CCSBackend *backend, CCSIntegration *integration); void ccsFreeBackend (CCSBackend *backend); typedef struct _CCSDynamicBackendInterface CCSDynamicBackendInterface; /** * @brief The _CCSDynamicBackend struct * * This object represents a CCSBackend loaded in memory as a dlopen * object. It implements the CCSBackend interface and provides an * interface of its own for managing the dynamic backend and checking * its capabilities. * * All function pointers are fully implemented and are safe to call */ struct _CCSDynamicBackend { CCSObject object; }; typedef const char * (*CCSDynamicBackendGetBackendName) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsRead) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsWrite) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsProfiles) (CCSDynamicBackend *); typedef Bool (*CCSDynamicBackendSupportsIntegration) (CCSDynamicBackend *); typedef CCSBackend * (*CCSDynamicBackendGetRawBackend) (CCSDynamicBackend *); struct _CCSDynamicBackendInterface { CCSDynamicBackendGetBackendName getBackendName; CCSDynamicBackendSupportsRead supportsRead; CCSDynamicBackendSupportsWrite supportsWrite; CCSDynamicBackendSupportsProfiles supportsProfiles; CCSDynamicBackendSupportsIntegration supportsIntegration; CCSDynamicBackendGetRawBackend getRawBackend; }; const char * ccsDynamicBackendGetBackendName (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsRead (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsWrite (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsProfiles (CCSDynamicBackend *); Bool ccsDynamicBackendSupportsIntegration (CCSDynamicBackend *); CCSBackend * ccsDynamicBackendGetRawBackend (CCSDynamicBackend *); unsigned int ccsCCSDynamicBackendInterfaceGetType (); void ccsFreeDynamicBackend (CCSDynamicBackend *); /** * @brief ccsBackendNewWithDynamicInterface * @param context * @param interface * @param dlhand * @return * * Creates a new CCSBackend for a CCSBackendInterface and dlopen handle * dlhand */ CCSBackend * ccsBackendNewWithDynamicInterface (CCSContext *context, const CCSBackendInterface *interface); CCSBackendInterface* getBackendInfo (void); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs-list.h0000644000004100000410000000651113246301623022430 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_LIST_H #define _CCS_LIST_H #include COMPIZCONFIG_BEGIN_DECLS /** * list functions: * for each list there is a set of functions, explained using String as example * * ccsStringListAppend (list, item) * Adds an item at the end of the list. Returns the new list. * * ccsStringListPrepend (list, item) * Adds an item at the beginning of the list. Returns the new list. * * ccsStringListInsert (list, item, position) * Adds an item at a given position. Position is 0-based. If position is * larger than the amount of items in the list, the item is inserted at the * end of the list. Returns the new list. * * ccsStringListInsertBefore (list, sibling, item) * Inserts item before sibling into the list. If sibling is no list member, * item is inserted at the end. Returns the new list. * * ccsStringListLength (list) * Returns the amount of items in list. * * ccsStringListFind (list, item) * Finds and returns an item matching . If nothing is found, returns NULL. * * ccsStringListGetItem (list, index) * Returns the list item at position . If index is larger than the * amount of items in the list, returns NULL. * * ccsStringListRemove (list, item, freeObj) * Removes item from the list. If freeObj is TRUE, also frees the data item. * Returns the new list. * * ccsStringListFree (list, freeObj) * Frees the complete list. If freeObj is TRUE, also frees the data items. * Returns the new list (NULL). */ #define CCSLIST_HDR(type,dtype) \ typedef struct _CCS##type##List * CCS##type##List;\ struct _CCS##type##List \ { \ dtype * data; \ CCS##type##List next; \ }; \ CCS##type##List ccs##type##ListAppend (CCS##type##List list, dtype *data); \ CCS##type##List ccs##type##ListPrepend (CCS##type##List list, dtype *data); \ CCS##type##List ccs##type##ListInsert (CCS##type##List list, dtype *data, int position); \ CCS##type##List ccs##type##ListInsertBefore (CCS##type##List list, CCS##type##List sibling, dtype *data); \ unsigned int ccs##type##ListLength (CCS##type##List list); \ CCS##type##List ccs##type##ListFind (CCS##type##List list, dtype *data); \ CCS##type##List ccs##type##ListGetItem (CCS##type##List list, unsigned int index); \ CCS##type##List ccs##type##ListRemove (CCS##type##List list, dtype *data, Bool freeObj); \ CCS##type##List ccs##type##ListFree (CCS##type##List list, Bool freeObj); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs-string.h0000644000004100000410000000247713246301623022772 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_STRING_H #define _CCS_STRING_H /* Doesn't seem to make sense to have this header * dependency, but we can only declare a typed list * once */ #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSString CCSString; struct _CCSString { char *value; unsigned int refCount; }; void ccsFreeString (CCSString *str); CCSLIST_HDR (String, CCSString); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs.h0000644000004100000410000012571413246301623021466 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CSS_H #define _CSS_H #include /* for NULL */ #include #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS #ifndef CCS_LOG_DOMAIN #define CCS_LOG_DOMAIN NULL #endif #ifdef __GNUC__ #define ccsDebug(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogDebug, fmt, ##args) #define ccsInfo(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogInfo, fmt, ##args) #define ccsWarning(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogWarning, fmt, ##args) #define ccsError(fmt, args...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogError, fmt, ##args) #elif __STDC_VERSION__ >= 199901L #define ccsDebug(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogDebug, fmt, __VA_ARGS__) #define ccsInfo(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogInfo, fmt, __VA_ARGS__) #define ccsWarning(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogWarning, fmt, __VA_ARGS__) #define ccsError(fmt, ...) \ ccsLog (CCS_LOG_DOMAIN, ccsLogError, fmt, __VA_ARGS__) #endif typedef enum { ccsLogDebug, ccsLogInfo, ccsLogWarning, ccsLogError, _ccsLogLevels } CCSLogLevel; #define CCSLOGLEVEL_NAMES {"Debug", "Info", "Warning", "Error"} void ccsLog (const char *domain, CCSLogLevel level, const char *fmt, ...); typedef struct _CCSGroup CCSGroup; typedef struct _CCSSubGroup CCSSubGroup; typedef struct _CCSPluginCategory CCSPluginCategory; typedef struct _CCSPluginConflict CCSPluginConflict; typedef struct _CCSIntDesc CCSIntDesc; typedef struct _CCSStrRestriction CCSStrRestriction; typedef struct _CCSStrExtension CCSStrExtension; CCSLIST_HDR (Plugin, CCSPlugin) CCSLIST_HDR (Setting, CCSSetting) CCSLIST_HDR (Group, CCSGroup) CCSLIST_HDR (SubGroup, CCSSubGroup) CCSLIST_HDR (SettingValue, CCSSettingValue) CCSLIST_HDR (PluginConflict, CCSPluginConflict) CCSLIST_HDR (BackendInfo, CCSBackendInfo) CCSLIST_HDR (IntDesc, CCSIntDesc) CCSLIST_HDR (StrRestriction, CCSStrRestriction) CCSLIST_HDR (StrExtension, CCSStrExtension) CCSREF_HDR (Plugin, CCSPlugin) CCSREF_HDR (Setting, CCSSetting) CCSREF_HDR (String, CCSString) CCSREF_HDR (Backend, CCSBackend) CCSREF_HDR (DynamicBackend, CCSDynamicBackend) CCSREF_HDR (Group, CCSGroup) CCSREF_HDR (SubGroup, CCSSubGroup) CCSREF_HDR (SettingValue, CCSSettingValue) CCSREF_HDR (PluginConflict, CCSPluginConflict) CCSREF_HDR (BackendInfo, CCSBackendInfo) CCSREF_HDR (IntDesc, CCSIntDesc) CCSREF_HDR (StrRestriction, CCSStrRestriction) CCSREF_HDR (StrExtension, CCSStrExtension) typedef struct _CCSContextInterface CCSContextInterface; typedef struct _CCSPluginInterface CCSPluginInterface; typedef struct _CCSSettingInterface CCSSettingInterface; struct _CCSInterfaceTable { const CCSContextInterface *contextInterface; const CCSPluginInterface *pluginInterface; const CCSSettingInterface *settingInterface; const CCSBackendInterface *dynamicBackendWrapperInterface; const CCSDynamicBackendInterface *dynamicBackendInterface; }; extern const CCSInterfaceTable ccsDefaultInterfaceTable; /* CCSContext interface */ typedef CCSPluginList (*CCSContextGetPluginsProc) (CCSContext *context); typedef CCSPluginCategory * (*CCSContextGetCategories) (CCSContext *context); typedef CCSSettingList (*CCSContextGetChangedSettings) (CCSContext *context); typedef unsigned int (*CCSContextGetScreenNum) (CCSContext *context); typedef Bool (*CCSContextAddChangedSetting) (CCSContext *context, CCSSetting *setting); typedef Bool (*CCSContextClearChangedSettings) (CCSContext *context); typedef CCSSettingList (*CCSContextStealChangedSettings) (CCSContext *context); typedef void * (*CCSContextGetPrivatePtr) (CCSContext *context); typedef void (*CCSContextSetPrivatePtr) (CCSContext *context, void *ptr); typedef Bool (*CCSContextLoadPlugin) (CCSContext *context, char *name); typedef CCSPlugin * (*CCSContextFindPlugin) (CCSContext *context, const char *name); typedef Bool (*CCSContextPluginIsActive) (CCSContext *context, const char *name); typedef CCSPluginList (*CCSContextGetActivePluginList) (CCSContext *context); typedef CCSStringList (*CCSContextGetSortedPluginStringList) (CCSContext *context); typedef Bool (*CCSContextSetBackend) (CCSContext *context, char *name); typedef const char * (*CCSContextGetBackend) (CCSContext *context); typedef void (*CCSContextSetIntegrationEnabled) (CCSContext *context, Bool value); typedef void (*CCSContextSetProfile) (CCSContext *context, const char *name); typedef void (*CCSContextSetPluginListAutoSort) (CCSContext *context, Bool value); typedef const char * (*CCSContextGetProfile) (CCSContext *context); typedef Bool (*CCSContextGetIntegrationEnabled) (CCSContext *context); typedef Bool (*CCSContextGetPluginListAutoSort) (CCSContext *context); typedef void (*CCSContextProcessEvents) (CCSContext *context, unsigned int flags); typedef void (*CCSContextReadSettings) (CCSContext *context); typedef void (*CCSContextWriteSettings) (CCSContext *context); typedef void (*CCSContextWriteChangedSettings) (CCSContext *context); typedef Bool (*CCSContextExportToFile) (CCSContext *context, const char *fileName, Bool skipDefaults); typedef Bool (*CCSContextImportFromFile) (CCSContext *context, const char *fileName, Bool overwriteNonDefault); typedef CCSPluginConflictList (*CCSContextCanEnablePlugin) (CCSContext *context, CCSPlugin *plugin); typedef CCSPluginConflictList (*CCSContextCanDisablePlugin) (CCSContext *context, CCSPlugin *plugin); typedef CCSStringList (*CCSContextGetExistingProfiles) (CCSContext *context); typedef void (*CCSContextDeleteProfile) (CCSContext *context, char *name); typedef Bool (*CCSContextCheckForSettingsUpgrade) (CCSContext *context); typedef void (*CCSContextLoadPlugins) (CCSContext *context); typedef void (*CCSContextDestructor) (CCSContext *context); struct _CCSContextInterface { CCSContextGetPluginsProc contextGetPlugins; CCSContextGetCategories contextGetCategories; CCSContextGetChangedSettings contextGetChangedSettings; CCSContextGetScreenNum contextGetScreenNum; CCSContextAddChangedSetting contextAddChangedSetting; CCSContextClearChangedSettings contextClearChangedSettings; CCSContextStealChangedSettings contextStealChangedSettings; CCSContextGetPrivatePtr contextGetPrivatePtr; CCSContextSetPrivatePtr contextSetPrivatePtr; CCSContextLoadPlugin contextLoadPlugin; CCSContextFindPlugin contextFindPlugin; CCSContextPluginIsActive contextPluginIsActive; CCSContextGetActivePluginList contextGetActivePluginList; CCSContextGetSortedPluginStringList contextGetSortedPluginStringList; CCSContextSetBackend contextSetBackend; CCSContextGetBackend contextGetBackend; CCSContextSetIntegrationEnabled contextSetIntegrationEnabled; CCSContextSetProfile contextSetProfile; CCSContextSetPluginListAutoSort contextSetPluginListAutoSort; CCSContextGetProfile contextGetProfile; CCSContextGetIntegrationEnabled contextGetIntegrationEnabled; CCSContextGetPluginListAutoSort contextGetPluginListAutoSort; CCSContextProcessEvents contextProcessEvents; CCSContextReadSettings contextReadSettings; CCSContextWriteSettings contextWriteSettings; CCSContextWriteChangedSettings contextWriteChangedSettings; CCSContextExportToFile contextExportToFile; CCSContextImportFromFile contextImportFromFile; CCSContextCanEnablePlugin contextCanEnablePlugin; CCSContextCanDisablePlugin contextCanDisablePlugin; CCSContextGetExistingProfiles contextGetExistingProfiles; CCSContextDeleteProfile contextDeleteProfile; CCSContextCheckForSettingsUpgrade contextCheckForSettingsUpgrade; CCSContextLoadPlugins contextLoadPlugins; CCSContextDestructor contextDestructor; }; unsigned int ccsCCSContextInterfaceGetType (); /* CCSContext accessor functions */ CCSPluginList ccsContextGetPlugins (CCSContext *); CCSPluginCategory * ccsContextGetCategories (CCSContext *); CCSSettingList ccsContextGetChangedSettings (CCSContext *); unsigned int ccsContextGetScreenNum (CCSContext *); Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting); Bool ccsContextClearChangedSettings (CCSContext *context); CCSSettingList ccsContextStealChangedSettings (CCSContext *context); void * ccsContextGetPrivatePtr (CCSContext *context); void ccsContextSetPrivatePtr (CCSContext *context, void *ptr); /* only for bindings */ void * ccsContextGetPluginsBindable (CCSContext *context); void * ccsContextStealChangedSettingsBindable (CCSContext *context); void * ccsContextGetChangedSettingsBindable (CCSContext *context); struct _CCSContext { CCSObject object; }; /* CCSPluginInterface */ typedef const char * (*CCSPluginGetName) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetShortDesc) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetLongDesc) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetHints) (CCSPlugin *plugin); typedef const char * (*CCSPluginGetCategory) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetLoadAfter) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetLoadBefore) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetRequiresPlugins) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetConflictPlugins) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetProvidesFeatures) (CCSPlugin *plugin); typedef CCSStringList (*CCSPluginGetRequiresFeatures) (CCSPlugin *plugin); typedef void * (*CCSPluginGetPrivatePtr) (CCSPlugin *plugin); typedef void (*CCSPluginSetPrivatePtr) (CCSPlugin *plugin, void *); typedef CCSContext * (*CCSPluginGetContext) (CCSPlugin *plugin); typedef CCSSetting * (*CCSPluginFindSetting) (CCSPlugin *plugin, const char *name); typedef CCSSettingList (*CCSPluginGetPluginSettings) (CCSPlugin *plugin); typedef CCSGroupList (*CCSPluginGetPluginGroups) (CCSPlugin *plugin); typedef void (*CCSPluginReadPluginSettings) (CCSPlugin *plugin); typedef CCSStrExtensionList (*CCSPluginGetPluginStrExtensions) (CCSPlugin *plugin); typedef void (*CCSPluginDestructor) (CCSPlugin *plugin); unsigned int ccsCCSPluginInterfaceGetType (); struct _CCSPluginInterface { CCSPluginGetName pluginGetName; CCSPluginGetShortDesc pluginGetShortDesc; CCSPluginGetLongDesc pluginGetLongDesc; CCSPluginGetHints pluginGetHints; CCSPluginGetCategory pluginGetCategory; CCSPluginGetLoadAfter pluginGetLoadAfter; CCSPluginGetLoadBefore pluginGetLoadBefore; CCSPluginGetRequiresPlugins pluginGetRequiresPlugins; CCSPluginGetConflictPlugins pluginGetConflictPlugins; CCSPluginGetProvidesFeatures pluginGetProvidesFeatures; CCSPluginGetRequiresFeatures pluginGetRequiresFeatures; CCSPluginGetPrivatePtr pluginGetPrivatePtr; CCSPluginSetPrivatePtr pluginSetPrivatePtr; CCSPluginGetContext pluginGetContext; CCSPluginFindSetting pluginFindSetting; CCSPluginGetPluginSettings pluginGetPluginSettings; CCSPluginGetPluginGroups pluginGetPluginGroups; CCSPluginReadPluginSettings pluginReadPluginSettings; CCSPluginGetPluginStrExtensions pluginGetPluginStrExtensions; CCSPluginDestructor pluginDestructor; }; /* CCSPlugin accessor functions */ const char * ccsPluginGetName (CCSPlugin *plugin); const char * ccsPluginGetShortDesc (CCSPlugin *plugin); const char * ccsPluginGetLongDesc (CCSPlugin *plugin); const char * ccsPluginGetHints (CCSPlugin *plugin); const char * ccsPluginGetCategory (CCSPlugin *plugin); CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin); CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin); CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin); CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin); CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin); CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin); void * ccsPluginGetPrivatePtr (CCSPlugin *plugin); void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr); CCSContext * ccsPluginGetContext (CCSPlugin *plugin); void * ccsPluginGetProvidesFeaturesBindable (CCSPlugin *plugin); struct _CCSPlugin { CCSObject object; }; struct _CCSSubGroup { char *name; /* sub group name in current locale */ CCSSettingList settings; /* list of settings in this sub group */ unsigned int refCount; /* reference count */ }; struct _CCSGroup { char *name; /* group name in current locale */ CCSSubGroupList subGroups; /* list of sub groups in this group */ unsigned int refCount; /* reference count */ }; typedef enum _CCSPluginConflictType { /* produced on plugin activation */ ConflictRequiresPlugin, ConflictRequiresFeature, ConflictFeature, ConflictPlugin, /* produced on plugin deactivation */ ConflictFeatureNeeded, ConflictPluginNeeded, ConflictPluginError, } CCSPluginConflictType; struct _CCSPluginConflict { char * value; /* item (plugin / feature) name that caused the conflict */ CCSPluginConflictType type; /* type of the conflict */ CCSPluginList plugins; /* list of conflicting plugins */ unsigned int refCount; /* reference count */ }; union _CCSSettingInfo; struct _CCSIntDesc { int value; /* value the description is assigned to */ char *name; /* description */ unsigned int refCount; /* reference count */ }; struct _CCSStrRestriction { char *value; /* value the restriction is assigned to */ char *name; /* description */ unsigned int refCount; /* reference count */ }; struct _CCSStrExtension { char *basePlugin; /* plugin this extension extends */ CCSStringList baseSettings; /* list of settings this extension extends */ CCSStrRestrictionList restriction; /* list of added restriction items */ unsigned int refCount; /* reference count */ }; typedef struct _CCSSettingIntInfo { int min; /* minimum value for this setting */ int max; /* maximum value */ CCSIntDescList desc; /* list of item descriptions */ } CCSSettingIntInfo; typedef struct _CCSSettingFloatInfo { float min; /* minimum value for this setting */ float max; /* maximum value */ float precision; /* precision (allowed increment) */ } CCSSettingFloatInfo; typedef struct _CCSSettingStringInfo { CCSStrRestrictionList restriction; /* list of restriction items */ int sortStartsAt; /* the restriction index to start sorting at (defaults to -1 for no sorting) */ Bool extensible; /* whether extension is allowed for this setting */ } CCSSettingStringInfo; typedef struct _CCSSettingListInfo { CCSSettingType listType; /* type of setting this list contains */ union _CCSSettingInfo *listInfo; /* list of settings */ } CCSSettingListInfo; typedef struct _CCSSettingActionInfo { Bool internal; /* is this binding global or plugin internal*/ } CCSSettingActionInfo; typedef union _CCSSettingInfo { CCSSettingIntInfo forInt; CCSSettingFloatInfo forFloat; CCSSettingStringInfo forString; CCSSettingListInfo forList; CCSSettingActionInfo forAction; } CCSSettingInfo; typedef struct _CCSSettingColorValueColor { unsigned short red; unsigned short green; unsigned short blue; unsigned short alpha; } CCSSettingColorValueColor; typedef struct _CCSSettingColorValueArray { unsigned short array[4]; } CCSSettingColorValueArray; typedef union _CCSSettingColorValue { CCSSettingColorValueColor color; CCSSettingColorValueArray array; } CCSSettingColorValue; typedef struct _CCSSettingKeyValue { int keysym; unsigned int keyModMask; } CCSSettingKeyValue; typedef struct _CCSSettingButtonValue { int button; unsigned int buttonModMask; unsigned int edgeMask; } CCSSettingButtonValue; typedef union _CCSSettingValueUnion { Bool asBool; int asInt; float asFloat; char * asString; char * asMatch; CCSSettingColorValue asColor; CCSSettingValueList asList; CCSSettingKeyValue asKey; CCSSettingButtonValue asButton; unsigned int asEdge; Bool asBell; } CCSSettingValueUnion; struct _CCSSettingValue { CCSSettingValueUnion value; CCSSetting * parent; Bool isListChild; unsigned int refCount; /* reference count */ }; /* Interface for CCSSetting */ const char * ccsSettingGetName (CCSSetting *setting); const char * ccsSettingGetShortDesc (CCSSetting *setting); const char * ccsSettingGetLongDesc (CCSSetting *setting); CCSSettingType ccsSettingGetType (CCSSetting *setting); CCSSettingInfo * ccsSettingGetInfo (CCSSetting *setting); const char * ccsSettingGetGroup (CCSSetting *setting); const char * ccsSettingGetSubGroup (CCSSetting *setting); const char * ccsSettingGetHints (CCSSetting *setting); CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *setting); CCSSettingValue *ccsSettingGetValue (CCSSetting *setting); Bool ccsSettingGetIsDefault (CCSSetting *setting); CCSPlugin * ccsSettingGetParent (CCSSetting *setting); void * ccsSettingGetPrivatePtr (CCSSetting *setting); void ccsSettingSetPrivatePtr (CCSSetting *setting, void *ptr); /* Setting getters. Returns TRUE if the setting value was successfully copied into , FALSE otherwise. */ Bool ccsGetInt (CCSSetting *setting, int *data); Bool ccsGetFloat (CCSSetting *setting, float *data); Bool ccsGetBool (CCSSetting *setting, Bool *data); Bool ccsGetString (CCSSetting *setting, const char **data); Bool ccsGetColor (CCSSetting *setting, CCSSettingColorValue *data); Bool ccsGetMatch (CCSSetting *setting, const char **data); Bool ccsGetKey (CCSSetting *setting, CCSSettingKeyValue *data); Bool ccsGetButton (CCSSetting *setting, CCSSettingButtonValue *data); Bool ccsGetEdge (CCSSetting *setting, unsigned int *data); Bool ccsGetBell (CCSSetting *setting, Bool *data); Bool ccsGetList (CCSSetting *setting, CCSSettingValueList *data); typedef enum _CCSSetStatus { SetFailed = -1, SetToDefault = 1, SetIsDefault = 2, SetToSameValue = 3, SetToNewValue = 4 } CCSSetStatus; /* Setting setters. Set to value . Return TRUE if new value matches data. If the new value doesn't match the old value, the setting is added to the context's changedSettings list. */ CCSSetStatus ccsSetInt (CCSSetting *setting, int data, Bool processChanged); CCSSetStatus ccsSetFloat (CCSSetting *setting, float data, Bool processChanged); CCSSetStatus ccsSetBool (CCSSetting *setting, Bool data, Bool processChanged); CCSSetStatus ccsSetString (CCSSetting *setting, const char *data, Bool processChanged); CCSSetStatus ccsSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged); CCSSetStatus ccsSetMatch (CCSSetting *setting, const char *data, Bool processChanged); CCSSetStatus ccsSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged); CCSSetStatus ccsSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged); CCSSetStatus ccsSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged); CCSSetStatus ccsSetBell (CCSSetting *setting, Bool data, Bool processChanged); CCSSetStatus ccsSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged); CCSSetStatus ccsSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged); /* Reset all settings to defaults. Settings that were non-default previously are added to the changedSettings list of the context. */ void ccsResetToDefault (CCSSetting * setting, Bool processChanged); /* Checks if a given setting is integrated in the desktop environment. */ Bool ccsSettingIsIntegrated (CCSSetting *setting); /* Checks if a given setting is read-only. */ Bool ccsSettingIsReadOnly (CCSSetting *setting); /* Checks if a setting is readable by backends */ Bool ccsSettingIsReadableByBackend (CCSSetting *setting); typedef const char * (*CCSSettingGetName) (CCSSetting *); typedef const char * (*CCSSettingGetShortDesc) (CCSSetting *); typedef const char * (*CCSSettingGetLongDesc) (CCSSetting *); typedef CCSSettingType (*CCSSettingGetType) (CCSSetting *); typedef CCSSettingInfo * (*CCSSettingGetInfo) (CCSSetting *); typedef const char * (*CCSSettingGetGroup) (CCSSetting *); typedef const char * (*CCSSettingGetSubGroup) (CCSSetting *); typedef const char * (*CCSSettingGetHints) (CCSSetting *); typedef CCSSettingValue * (*CCSSettingGetDefaultValue) (CCSSetting *setting); typedef CCSSettingValue * (*CCSSettingGetValue) (CCSSetting *setting); typedef Bool (*CCSSettingGetIsDefault) (CCSSetting *); typedef CCSPlugin * (*CCSSettingGetParent) (CCSSetting *); typedef void * (*CCSSettingGetPrivatePtr) (CCSSetting *); typedef void (*CCSSettingSetPrivatePtr) (CCSSetting *, void *); typedef CCSSetStatus (*CCSSettingSetInt) (CCSSetting *setting, int data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetFloat) (CCSSetting *setting, float data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetBool) (CCSSetting *setting, Bool data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetString) (CCSSetting *setting, const char * data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetColor) (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetMatch) (CCSSetting *setting, const char * data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetKey) (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetButton) (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetEdge) (CCSSetting *setting, unsigned int data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetBell) (CCSSetting *setting, Bool data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetList) (CCSSetting *setting, CCSSettingValueList data, Bool processChanged); typedef CCSSetStatus (*CCSSettingSetValue) (CCSSetting *setting, CCSSettingValue *data, Bool processChanged); typedef Bool (*CCSSettingGetInt) (CCSSetting *setting, int *data); typedef Bool (*CCSSettingGetFloat) (CCSSetting *setting, float *data); typedef Bool (*CCSSettingGetBool) (CCSSetting *setting, Bool *data); typedef Bool (*CCSSettingGetString) (CCSSetting *setting, const char **data); typedef Bool (*CCSSettingGetColor) (CCSSetting *setting, CCSSettingColorValue *data); typedef Bool (*CCSSettingGetMatch) (CCSSetting *setting, const char **data); typedef Bool (*CCSSettingGetKey) (CCSSetting *setting, CCSSettingKeyValue *data); typedef Bool (*CCSSettingGetButton) (CCSSetting *setting, CCSSettingButtonValue *data); typedef Bool (*CCSSettingGetEdge) (CCSSetting *setting, unsigned int *data); typedef Bool (*CCSSettingGetBell) (CCSSetting *setting, Bool *data); typedef Bool (*CCSSettingGetList) (CCSSetting *setting, CCSSettingValueList *data); typedef void (*CCSSettingResetToDefault) (CCSSetting *setting, Bool processChanged); typedef Bool (*CCSSettingIsIntegrated) (CCSSetting *setting); typedef Bool (*CCSSettingIsReadOnly) (CCSSetting *setting); typedef Bool (*CCSSettingIsReadableByBackend) (CCSSetting *setting); typedef void (*CCSSettingDestructor) (CCSSetting *setting); unsigned int ccsCCSSettingInterfaceGetType (); struct _CCSSettingInterface { CCSSettingGetName settingGetName; CCSSettingGetShortDesc settingGetShortDesc; CCSSettingGetLongDesc settingGetLongDesc; CCSSettingGetType settingGetType; CCSSettingGetInfo settingGetInfo; CCSSettingGetGroup settingGetGroup; CCSSettingGetSubGroup settingGetSubGroup; CCSSettingGetHints settingGetHints; CCSSettingGetDefaultValue settingGetDefaultValue; CCSSettingGetValue settingGetValue; CCSSettingGetIsDefault settingGetIsDefault; CCSSettingGetParent settingGetParent; CCSSettingGetPrivatePtr settingGetPrivatePtr; CCSSettingSetPrivatePtr settingSetPrivatePtr; CCSSettingSetInt settingSetInt; CCSSettingSetFloat settingSetFloat; CCSSettingSetBool settingSetBool; CCSSettingSetString settingSetString; CCSSettingSetColor settingSetColor; CCSSettingSetMatch settingSetMatch; CCSSettingSetKey settingSetKey; CCSSettingSetButton settingSetButton; CCSSettingSetEdge settingSetEdge; CCSSettingSetBell settingSetBell; CCSSettingSetList settingSetList; CCSSettingSetValue settingSetValue; CCSSettingGetInt settingGetInt; CCSSettingGetFloat settingGetFloat; CCSSettingGetBool settingGetBool; CCSSettingGetString settingGetString; CCSSettingGetColor settingGetColor; CCSSettingGetMatch settingGetMatch; CCSSettingGetKey settingGetKey; CCSSettingGetButton settingGetButton; CCSSettingGetEdge settingGetEdge; CCSSettingGetBell settingGetBell; CCSSettingGetList settingGetList; CCSSettingResetToDefault settingResetToDefault; CCSSettingIsIntegrated settingIsIntegrated; CCSSettingIsReadOnly settingIsReadOnly; CCSSettingIsReadableByBackend settingIsReadableByBackend; CCSSettingDestructor settingDestructor; }; struct _CCSSetting { CCSObject object; }; typedef void (*CCSSettingDefaultValueInitializerFunc) (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data); typedef void (*CCSSettingInfoInitializerFunc) (CCSSettingType type, CCSSettingInfo *info, void *data); CCSSetting * ccsSettingDefaultImplNew (CCSPlugin *plugin, const char *name, CCSSettingType type, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingDefaultValueInitializerFunc valueInit, void *valueInitData, CCSSettingInfoInitializerFunc infoInit, void *infoInitData, CCSObjectAllocationInterface *ai, const CCSInterfaceTable *interfaces); struct _CCSPluginCategory { const char *name; /* plugin category name */ const char *shortDesc; /* plugin category short description */ const char *longDesc; /* plugin category long description */ CCSStringList plugins; /* list of plugins in this category */ unsigned int refCount; /* reference count */ }; /* set basic metadata to TRUE and no additional metadata informations will be parsed */ void ccsSetBasicMetadata (Bool value); /* Creates a new context for the given screen. All plugin settings are automatically enumerated. */ CCSContext* ccsContextNew (unsigned int screenNum, const CCSInterfaceTable *); /* Function pointers for the input/export functions. Usually you * should just provide ccsImportFromFile and ccsExportToFile * * TODO: Using this as a crutch to isolate testing is not great * we should really replace it with a real separate class in future * but that is a lot of work and not really worth it for our purposes */ typedef CCSStringList (*CCSScanForProfilesProc) (const char *directory); /* Creates a new context without auto-enumerating any plugin or setting. Behaves otherwise exactly like ccsContextNew. */ CCSContext* ccsEmptyContextNew (unsigned int screenNum, CCSContextImportFromFile importFromFile, CCSScanForProfilesProc scanForProfiles, CCSBackendLoader *loader, CCSConfigFile *config, const CCSInterfaceTable *); /* Destroys the allocated context. */ void ccsContextDestroy (CCSContext * context); /* Load the plugin and setting metadata for a given plugin. Returns TRUE on success, FALSE otherwise. */ Bool ccsLoadPlugin (CCSContext *context, char *name); /* Searches for a plugin identified by its name in the context. Returns the plugin struct if it could be found, NULL otherwise. */ CCSPlugin* ccsFindPlugin (CCSContext *context, const char *name); /* Searches for a setting in a plugin. Returns the setting struct if the search was successful (setting with name found), NULL otherwise. */ CCSSetting* ccsFindSetting (CCSPlugin *plugin, const char *name); /* Returns TRUE if the named plugin is in the context and marked as currently active in Compiz, FALSE otherwise. */ Bool ccsPluginIsActive(CCSContext *context, const char *name); void ccsFreeContext (CCSContext *context); void ccsFreePlugin (CCSPlugin *plugin); void ccsFreeSetting (CCSSetting *setting); void ccsFreeGroup (CCSGroup *group); void ccsFreeSubGroup (CCSSubGroup *subGroup); void ccsCleanupSettingInfo (CCSSettingInfo *info, CCSSettingType type); void ccsFreeSettingValue (CCSSettingValue *value); void ccsFreeSettingValueWithType (CCSSettingValue *v, CCSSettingType type); void ccsFreePluginConflict (CCSPluginConflict *value); void ccsFreeBackendInfo (CCSBackendInfo *value); void ccsFreeIntDesc (CCSIntDesc *value); void ccsFreeStrRestriction (CCSStrRestriction *restriction); void ccsFreeStrExtension (CCSStrExtension *extension); /* Compares two setting values. Returns TRUE if values match, FALSE otherwise. */ Bool ccsIsEqualColor (CCSSettingColorValue c1, CCSSettingColorValue c2); Bool ccsIsEqualKey (CCSSettingKeyValue c1, CCSSettingKeyValue c2); Bool ccsIsEqualButton (CCSSettingButtonValue c1, CCSSettingButtonValue c2); /* Compares lists */ Bool ccsCompareLists (CCSSettingValueList l1, CCSSettingValueList l2, CCSSettingListInfo info); /* Retrieves a list of settings in a plugin */ CCSSettingList ccsGetPluginSettings (CCSPlugin *plugin); /* Retrieves a list of setting groups in a plugin */ CCSGroupList ccsGetPluginGroups (CCSPlugin *plugin); /* Converts a string list into a list of string settings. Return value needs to be freed by the caller. */ CCSSettingValueList ccsGetValueListFromStringList (CCSStringList list, CCSSetting *parent); /* Converts a string setting value list into a string list. Return value needs to be freed by the caller. */ CCSStringList ccsGetStringListFromValueList (CCSSettingValueList list); /* Converts a string list into a string array. If the return value is not NULL, the item count is copied into . Return value needs to be freed by the caller. */ char** ccsGetStringArrayFromList (CCSStringList list, int *num); /* Converts a string array with items into a string list. Return value needs to be freed by the caller. */ CCSStringList ccsGetListFromStringArray (char **array, int num); /* Converts a setting value list into an array of the setting item data type. Behaves similar to ccsGetStringArrayFromList. */ char** ccsGetStringArrayFromValueList (CCSSettingValueList list, int *num); char** ccsGetMatchArrayFromValueList (CCSSettingValueList list, int *num); int* ccsGetIntArrayFromValueList (CCSSettingValueList list, int *num); float* ccsGetFloatArrayFromValueList (CCSSettingValueList list, int *num); Bool * ccsGetBoolArrayFromValueList (CCSSettingValueList list, int *num); CCSSettingColorValue* ccsGetColorArrayFromValueList (CCSSettingValueList list, int *num); /* Deep copies value lists */ CCSSettingValueList ccsCopyList (CCSSettingValueList l1, CCSSetting * setting); /* Deep copy setting value */ CCSSettingValue * ccsCopyValue (const CCSSettingValue *orig, CCSSettingType type, CCSSettingInfo *info); Bool ccsCopyValueInto (const CCSSettingValue *from, CCSSettingValue *to, CCSSettingType type, CCSSettingInfo *info); /* Deep copy setting info */ void ccsCopyInfo (const CCSSettingInfo *from, CCSSettingInfo *to, CCSSettingType type); /* Converts an array of data items to a setting value list. Behaves similar to ccsGetListFromStringArray */ CCSSettingValueList ccsGetValueListFromStringArray (const char **array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromMatchArray (const char **array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromIntArray (int *array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromFloatArray (float *array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromBoolArray (Bool *array, int num, CCSSetting *parent); CCSSettingValueList ccsGetValueListFromColorArray (CCSSettingColorValue *array, int num, CCSSetting *parent); /* Retrieves a list of plugins marked as active in Compiz for this context */ CCSPluginList ccsGetActivePluginList (CCSContext *context); /* Retrieves a list of plugin names which are active in Compiz for a given context, sorted as needed according to load after/before/etc. rules */ CCSStringList ccsGetSortedPluginStringList (CCSContext *context); /* Switches the backend for a context. Returns TRUE on successful switch, FALSE otherwise. */ Bool ccsSetBackend (CCSContext *context, char *name); /* Retrieves the name of the backend active for the context. */ const char * ccsGetBackend (CCSContext *context); /* Enable/disable DE integration for a context. */ void ccsSetIntegrationEnabled (CCSContext *context, Bool value); /* Sets the profile for a context. */ void ccsSetProfile (CCSContext *context, const char *name); /* Set plugin list autosort for a context. */ void ccsSetPluginListAutoSort (CCSContext *context, Bool value); /* Retrieve current profile of the context. */ const char * ccsGetProfile (CCSContext *context); /* Retrieves current DE integration status for a context */ Bool ccsGetIntegrationEnabled (CCSContext *context); /* Retrieves the autosort setting for a context. */ Bool ccsGetPluginListAutoSort (CCSContext *context); /* Changes the plugin activeness status in compiz. If plugin list autosort is enabled, automatically writes a new sorted plugin list to the active_plugins setting. If autosort is disabled, it's up to the caller to do that. */ Bool ccsPluginSetActive (CCSPlugin *plugin, Bool value); /* functions parsing/creating an action string - the returned strings must be free'd after usage! */ char * ccsModifiersToString (unsigned int modMask); char * ccsEdgesToString (unsigned int edge); char * ccsEdgesToModString (unsigned int edge); char * ccsKeyBindingToString (CCSSettingKeyValue *key); char * ccsButtonBindingToString (CCSSettingButtonValue *button); char * ccsColorToString (CCSSettingColorValue *color); unsigned int ccsStringToModifiers (const char *binding); unsigned int ccsStringToEdges (const char *edge); unsigned int ccsModStringToEdges (const char *edge); Bool ccsStringToKeyBinding (const char *binding, CCSSettingKeyValue *key); Bool ccsStringToButtonBinding (const char *binding, CCSSettingButtonValue *button); Bool ccsStringToColor (const char *value, CCSSettingColorValue *color); /* flag values for ccsProcessEvents */ #define ProcessEventsNoGlibMainLoopMask (1 << 0) void ccsProcessEvents (CCSContext *context, unsigned int flags); /* Read all setting values from disk */ void ccsReadSettings (CCSContext *context); /* Read setting values for a given plugin */ void ccsReadPluginSettings (CCSPlugin *plugin); /* Write all settings to disk */ void ccsWriteSettings (CCSContext *context); /* Write changed settings to disk */ void ccsWriteChangedSettings (CCSContext *context); /* Exports a profile to a file. If skipDefaults is TRUE, only exports non-default settings. Returns TRUE on successful export, FALSE otherwise. */ Bool ccsExportToFile (CCSContext *context, const char *fileName, Bool skipDefaults); /* Imports a profile from a file. If overwriteNonDefault is TRUE, also overwrites settings that were non-default before. Returns TRUE on success, FALSE otherwise. */ Bool ccsImportFromFile (CCSContext *context, const char *fileName, Bool overwriteNonDefault); /* File watch stuff */ typedef void (*FileWatchCallbackProc) (unsigned int watchId, void *closure); unsigned int ccsAddFileWatch (const char *fileName, Bool enable, FileWatchCallbackProc callback, void *closure); void ccsRemoveFileWatch (unsigned int watchId); void ccsDisableFileWatch (unsigned int watchId); void ccsEnableFileWatch (unsigned int watchId); /* INI file stuff * FIXME: This should not be part of the * public API */ typedef struct _dictionary_ { /** Number of entries in dictionary */ int n; /** Storage size */ int size; /** List of string values */ char **val; /** List of string keys */ char **key ; /** List of hash values for keys */ unsigned *hash; } IniDictionary; IniDictionary* ccsIniNew (void); IniDictionary* ccsIniOpen (const char *fileName); void ccsIniClose (IniDictionary *dictionary); void ccsIniSave (IniDictionary *dictionary, const char *fileName); Bool ccsCreateDirFor (const char *fileName); Bool ccsIniParseString (char *str, char **value); Bool ccsIniGetString (IniDictionary *dictionary, const char *section, const char *entry, char **value); Bool ccsIniParseInt (const char *str, int *value); Bool ccsIniGetInt (IniDictionary *dictionary, const char *section, const char *entry, int *value); Bool ccsIniParseFloat (const char *str, float *value); Bool ccsIniGetFloat (IniDictionary *dictionary, const char *section, const char *entry, float *value); Bool ccsIniParseBool (const char *str, Bool *value); Bool ccsIniGetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool *value); Bool ccsIniParseColor (const char *str, CCSSettingColorValue *value); Bool ccsIniGetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue *value); Bool ccsIniParseKey (const char *str, CCSSettingKeyValue *value); Bool ccsIniGetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue *value); Bool ccsIniParseButton (const char *str, CCSSettingButtonValue *value); Bool ccsIniGetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue *value); Bool ccsIniParseEdge (const char *str, unsigned int *value); Bool ccsIniGetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int *value); Bool ccsIniGetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool *value); Bool ccsIniParseList (const char *str, CCSSettingValueList *value, CCSSetting *parent); Bool ccsIniGetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList *value, CCSSetting *parent); void ccsIniSetString (IniDictionary *dictionary, const char *section, const char *entry, const char *value); void ccsIniSetInt (IniDictionary *dictionary, const char *section, const char *entry, int value); void ccsIniSetFloat (IniDictionary *dictionary, const char *section, const char *entry, float value); void ccsIniSetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool value); void ccsIniSetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue value); void ccsIniSetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue value); void ccsIniSetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue value); void ccsIniSetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int value); void ccsIniSetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool value); void ccsIniSetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList value, CCSSettingType listType); void ccsIniRemoveEntry (IniDictionary *dictionary, const char *section, const char *entry); /* Checks if a plugin can be enabled. Returns a list of conflicts that would occur when loading the plugin. A return value of NULL means that the plugin can be enabled without problems. */ CCSPluginConflictList ccsCanEnablePlugin (CCSContext *context, CCSPlugin *plugin); /* Checks if a plugin can be disabled. The meaning of the return value is the same as for ccsCanEnablePlugin */ CCSPluginConflictList ccsCanDisablePlugin (CCSContext *context, CCSPlugin *plugin); /* Enumerates the available profiles for the current backend. */ CCSStringList ccsGetExistingProfiles (CCSContext * context); /* Deletes the profile with the given name. */ void ccsDeleteProfile (CCSContext *context, char *name); /* Copies backend info out from backend */ CCSBackendInfo * ccsCopyBackendInfoFromBackend (CCSBackend *backend, const CCSBackendInterface *backendInterface); /* Enumerates the available backends. */ CCSBackendInfoList ccsGetExistingBackends (CCSContext *); CCSStrExtensionList ccsGetPluginStrExtensions (CCSPlugin *plugin); Bool ccsCheckValueEq (const CCSSettingValue *rhs, CCSSettingType rhsType, CCSSettingInfo *rhsInfo, const CCSSettingValue *lhs, CCSSettingType lhsType, CCSSettingInfo *lhsInfo); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs-setting-types.h0000644000004100000410000000257013246301623024275 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _COMPIZCONFIG_CCS_SETTING_TYPES #define _COMPIZCONFIG_CCS_SETTING_TYPES #include COMPIZCONFIG_BEGIN_DECLS typedef enum _CCSSettingType { /* This needs to be in the same order as CompOptionType for consistency */ TypeBool, TypeInt, TypeFloat, TypeString, TypeColor, TypeAction, TypeKey, TypeButton, TypeEdge, TypeBell, TypeMatch, TypeList, TypeNum } CCSSettingType; COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/include/ccs-fwd.h0000644000004100000410000000426513246301623022241 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #ifndef _CSS_FWD_H #define _CSS_FWD_H COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSObject CCSObject; typedef struct _CCSObjectAllocationInterface CCSObjectAllocationInterface; typedef struct _CCSSetting CCSSetting; typedef struct _CCSPlugin CCSPlugin; typedef struct _CCSContext CCSContext; typedef struct _CCSBackend CCSBackend; typedef struct _CCSBackendInfo CCSBackendInfo; typedef struct _CCSBackendInterface CCSBackendInterface; typedef struct _CCSBackendLoader CCSBackendLoader; typedef struct _CCSDynamicBackend CCSDynamicBackend; typedef struct _CCSConfigFile CCSConfigFile; typedef struct _CCSIntegration CCSIntegration; typedef struct _CCSSettingValue CCSSettingValue; typedef struct _CCSIntegratedSettingInfo CCSIntegratedSettingInfo; typedef struct _CCSIntegratedSetting CCSIntegratedSetting; typedef struct _CCSIntegratedSettingFactory CCSIntegratedSettingFactory; typedef struct _CCSIntegratedSettingsStorage CCSIntegratedSettingsStorage; typedef struct _CCSInterfaceTable CCSInterfaceTable; typedef CCSBackendInterface * (*BackendGetInfoProc) (void); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/COPYING0000644000004100000410000004312213246301623020145 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ./compizconfig/libcompizconfig/src/0000755000004100000410000000000013246301623017677 5ustar www-datawww-data./compizconfig/libcompizconfig/src/ccs-config-private.h0000644000004100000410000000232113246301623023531 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMPIZCONFIG_CCS_CONFIG_PRIVATE_H #define COMPIZCONFIG_CCS_CONFIG_PRIVATE_H #include COMPIZCONFIG_BEGIN_DECLS char * getSectionName (void); typedef enum { OptionProfile, OptionBackend, OptionIntegration, OptionAutoSort } ConfigOption; COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/CMakeLists.txt0000644000004100000410000000510313246301623022436 0ustar www-datawww-datainclude_directories ( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBCOMPIZCONFIG_INCLUDE_DIRS} ) set (LIBCOMPIZCONFIG_FILES bindings.c ccs-private.h compiz.cpp config.c filewatch.c ini.c iniparser.c iniparser.h lists.c main.c log.c ccs_config_file.c ccs_config_file_interface.c ccs_backend_loader.c ccs_backend_loader_interface.c ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${COMPIZ_PLUGINDIR}\\\" -DIMAGEDIR=\\\"${COMPIZ_IMAGEDIR}\\\" -DMETADATADIR=\\\"${COMPIZ_METADATADIR}\\\" -DSYSCONFDIR=\\\"${COMPIZ_SYSCONFDIR}\\\" -DDATADIR=\\\"${COMPIZ_DATADIR}\\\" -DLIBDIR=\\\"${COMPIZ_LIBDIR}\\\" ) if (HAVE_PROTOBUF) add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/compizconfig.pb.cc COMMAND ${HAVE_PROTOC} ARGS --cpp_out=${CMAKE_CURRENT_BINARY_DIR} compizconfig.proto WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) set (LIBCOMPIZCONFIG_FILES ${LIBCOMPIZCONFIG_FILES} ${CMAKE_CURRENT_BINARY_DIR}/compizconfig.pb.cc ) set (LIBCOMPIZCONFIG_LIBRARIES ${LIBCOMPIZCONFIG_LIBRARIES} protobuf) add_definitions ( -DUSE_PROTOBUF ) endif (HAVE_PROTOBUF) if (HAVE_INOTIFY) add_definitions ( -DHAVE_SYS_INOTIFY_H ) endif (HAVE_INOTIFY) add_library ( ccs_text_file_interface STATIC ccs_text_file_interface.c ) add_library ( ccs_text_file STATIC ccs_text_file.c ) target_link_libraries ( ccs_text_file ccs_text_file_interface ) add_library ( ccs_settings_upgrade_internal STATIC ccs_settings_upgrade_internal.c ) add_library ( compizconfig SHARED ${LIBCOMPIZCONFIG_FILES} ) set_target_properties (compizconfig PROPERTIES VERSION 0.0.0 SOVERSION 0 ) link_directories ( ${LIBCOMPIZCONFIG_LINK_DIRS} ) target_link_libraries ( compizconfig ${LIBCOMPIZCONFIG_LIBRARIES} m pthread dl ccs_settings_upgrade_internal ccs_text_file ) # # Tell CMake that targets using compizconfig should NOT re-import the # libraries that compizconfig depends on (contains). # set_target_properties (compizconfig PROPERTIES LINK_INTERFACE_LIBRARIES "" ) set (COMPIZCONFIG_LIBS "") foreach (_val ${LIBCOMPIZCONFIG_LDFLAGS}) set (COMPIZCONFIG_LIBS "${COMPIZCONFIG_LIBS}${_val} ") endforeach (_val ${LIBCOMPIZCONFIG_LDFLAGS}) set (COMPIZCONFIG_CFLAGS "") foreach (_val ${LIBCOMPIZCONFIG_CFLAGS}) set (COMPIZCONFIG_CFLAGS "${COMPIZCONFIG_CFLAGS}${_val} ") endforeach (_val ${LIBCOMPIZCONFIG_CFLAGS}) install ( TARGETS compizconfig DESTINATION ${libcompizconfig_libdir} ) ./compizconfig/libcompizconfig/src/compizconfig.proto0000644000004100000410000000664113246301623023462 0ustar www-datawww-datapackage metadata; option optimize_for = SPEED; message PluginInfo { required sint32 pb_abi_version = 1; required string locale = 2; required uint64 time = 3; // modification time of source .xml file // true if container is missing options and extensions, and only includes // plugin info required bool brief_metadata = 4; // true if container is missing extensions, string restrictions, and // short/long descriptions for the plugin and its options required bool basic_metadata = 5; required string name = 6; optional string short_desc = 7; optional string long_desc = 8; optional string category = 9; repeated string feature = 10; message Dependencies { repeated string after_plugin = 1; repeated string before_plugin = 2; repeated string require_plugin = 3; repeated string require_feature = 4; repeated string conflict_plugin = 5; repeated string conflict_feature = 6; } optional Dependencies deps = 11; } message PluginBrief { required PluginInfo info = 1; } message Plugin { required PluginInfo info = 1; message Option { enum Type // This needs to be in the same order as CCSSettingType. { BOOL = 0; INT = 1; FLOAT = 2; STRING = 3; COLOR = 4; ACTION = 5; KEY = 6; BUTTON = 7; EDGE = 8; BELL = 9; MATCH = 10; LIST = 11; } required string name = 1; required Type type = 2; optional Type list_type = 3; optional string short_desc = 4; optional string long_desc = 5; optional sint32 group_id = 6 [default = -1]; optional sint32 subgroup_id = 7 [default = -1]; optional bool read_only = 8; optional bool extensible = 9; optional sint32 sort_start = 10 [default = -1]; message ColorValue { optional string red = 1 [default = '0x0000']; optional string green = 2 [default = '0x0000']; optional string blue = 3 [default = '0x0000']; optional string alpha = 4 [default = '0xffff']; } message GenericValue { optional bool bool_value = 1; // for bool and bell types optional sint32 int_value = 2; optional float float_value = 3; optional ColorValue color_value = 4; optional uint32 edge_value = 5; // for all types other than bool/int/float/color/edge/bell optional string string_value = 6; } repeated GenericValue default_value = 11; // for int optional sint32 int_min = 12; optional sint32 int_max = 13; message IntDescription { required sint32 value = 1; required string name = 2; } repeated IntDescription int_desc = 14; // for float optional float float_min = 15; optional float float_max = 16; optional float precision = 17; message StringRestriction { required string value = 1; required string name = 2; } repeated StringRestriction str_restriction = 18; optional string hints = 19; optional bool passive_grab = 20; optional bool internal = 21; optional bool nodelay = 22; } message Extension { required string base_plugin = 1; repeated string base_option = 2; repeated Option.StringRestriction str_restriction = 3; } message Screen { repeated Option option = 1; repeated string group_desc = 2; repeated string subgroup_desc = 3; } optional Screen screen = 2; repeated Extension extension = 3; } ./compizconfig/libcompizconfig/src/ccs_settings_upgrade_internal.h0000644000004100000410000000276113246301623026151 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTINGS_UPGRADE_INTERNAL_H #define _COMPIZCONFIG_CCS_SETTINGS_UPGRADE_INTERNAL_H #include #include COMPIZCONFIG_BEGIN_DECLS Bool ccsUpgradeGetDomainNumAndProfile (const char *name, char **domain, unsigned int *num, char **profile); int ccsUpgradeNameFilter (const char *name); void ccsUpgradeClearValues (CCSSettingList clearSettings); void ccsUpgradeAddValues (CCSSettingList addSettings); void ccsUpgradeReplaceValues (CCSSettingList replaceFromValueSettings, CCSSettingList replaceToValueSettings); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/ccs_backend_loader.h0000644000004100000410000000226013246301623023615 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_backend_loader.h * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_BACKEND_LOADER_H #define CCS_BACKEND_LOADER_H #include #include #include "ccs_backend_loader_interface.h" COMPIZCONFIG_BEGIN_DECLS CCSBackendLoader * ccsSharedLibBackendLoaderNew (CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/ccs_backend_loader.c0000644000004100000410000001364313246301623023617 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_backend_loader.c * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #include typedef struct _CCSShraedLibBackendLoaderPrivate CCSShraedLibBackendLoaderPrivate; struct _CCSShraedLibBackendLoaderPrivate { }; static void * openBackend (const char *backend) { const char *home = getenv ("HOME"); const char *override_backend = getenv ("LIBCOMPIZCONFIG_BACKEND_PATH"); void *dlhand = NULL; char *dlname = NULL; char *err = NULL; if (override_backend && strlen (override_backend)) { if (asprintf (&dlname, "%s/lib%s.so", override_backend, backend) == -1) dlname = NULL; dlerror (); dlhand = dlopen (dlname, RTLD_NOW | RTLD_NODELETE | RTLD_LOCAL); err = dlerror (); } if (!dlhand && home && strlen (home)) { if (dlname) free (dlname); if (asprintf (&dlname, "%s/.compizconfig/backends/lib%s.so", home, backend) == -1) dlname = NULL; dlerror (); dlhand = dlopen (dlname, RTLD_NOW | RTLD_NODELETE | RTLD_LOCAL); err = dlerror (); } if (!dlhand) { if (dlname) free (dlname); if (asprintf (&dlname, "%s/compizconfig/backends/lib%s.so", LIBDIR, backend) == -1) dlname = NULL; dlhand = dlopen (dlname, RTLD_NOW | RTLD_NODELETE | RTLD_LOCAL); err = dlerror (); } free (dlname); if (err) { ccsError ("dlopen: %s", err); } return dlhand; } static CCSDynamicBackend * ccsDynamicBackendWrapLoadedBackend (const CCSInterfaceTable *interfaces, CCSBackend *backend, void *dlhand) { CCSDynamicBackend *dynamicBackend = calloc (1, sizeof (CCSDynamicBackend)); CCSDynamicBackendPrivate *dbPrivate = NULL; if (!dynamicBackend) return NULL; ccsObjectInit (dynamicBackend, &ccsDefaultObjectAllocator); ccsDynamicBackendRef (dynamicBackend); dbPrivate = calloc (1, sizeof (CCSDynamicBackendPrivate)); if (!dbPrivate) { ccsDynamicBackendUnref (dynamicBackend); return NULL; } dbPrivate->dlhand = dlhand; dbPrivate->backend = backend; ccsObjectSetPrivate (dynamicBackend, (CCSPrivate *) dbPrivate); ccsObjectAddInterface (dynamicBackend, (CCSInterface *) interfaces->dynamicBackendWrapperInterface, GET_INTERFACE_TYPE (CCSBackendInterface)); ccsObjectAddInterface (dynamicBackend, (CCSInterface *) interfaces->dynamicBackendInterface, GET_INTERFACE_TYPE (CCSDynamicBackendInterface)); return dynamicBackend; } static CCSBackend * ccsSharedLibBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *name) { CCSBackendInterface *vt; void *dlhand = openBackend (name); if (!dlhand) return NULL; BackendGetInfoProc getInfo = dlsym (dlhand, "getBackendInfo"); if (!getInfo) { dlclose (dlhand); return NULL; } vt = getInfo (); if (!vt) { dlclose (dlhand); return NULL; } CCSBackend *backend = ccsBackendNewWithDynamicInterface (context, vt); if (!backend) { dlclose (dlhand); return NULL; } CCSDynamicBackend *backendWrapper = ccsDynamicBackendWrapLoadedBackend (interfaces, backend, dlhand); if (!backendWrapper) { dlclose (dlhand); ccsBackendUnref (backend); return NULL; } return (CCSBackend *) backendWrapper; } static void freeAndFinalizeLoader (CCSBackendLoader *loader, CCSObjectAllocationInterface *ai) { ccsObjectFinalize (loader); (*ai->free_) (ai->allocator, loader); } static void ccsSharedLibBackendLoaderFree (CCSBackendLoader *loader) { freeAndFinalizeLoader (loader, loader->object.object_allocation); } const CCSBackendLoaderInterface ccsSharedLibBackendLoaderInterface = { ccsSharedLibBackendLoaderLoadBackend, ccsSharedLibBackendLoaderFree }; static CCSBackendLoader * allocateLoader (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSBackendLoader)); if (!loader) return NULL; ccsObjectInit (loader, ai); return loader; } static CCSShraedLibBackendLoaderPrivate * allocatePrivate (CCSBackendLoader *loader, CCSObjectAllocationInterface *ai) { CCSShraedLibBackendLoaderPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSShraedLibBackendLoaderPrivate)); if (!priv) { freeAndFinalizeLoader (loader, ai); return NULL; } return priv; } CCSBackendLoader * ccsSharedLibBackendLoaderNew (CCSObjectAllocationInterface *ai) { CCSBackendLoader *loader = allocateLoader (ai); if (!loader) return NULL; CCSShraedLibBackendLoaderPrivate *priv = allocatePrivate (loader, ai); if (!priv) return NULL; ccsObjectSetPrivate (loader, (CCSPrivate *) (priv)); ccsObjectAddInterface (loader, (const CCSInterface *) &ccsSharedLibBackendLoaderInterface, GET_INTERFACE_TYPE (CCSBackendLoaderInterface)); ccsObjectRef (loader); return loader; } ./compizconfig/libcompizconfig/src/log.c0000644000004100000410000000437113246301623020631 0ustar www-datawww-data/* * Logging, Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * Author: Daniel van Vugt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include "ccs.h" /* * Only Info level or higher messages will be output by default. To see Debug * messages too, you must use: env CCS_LOG_LEVEL=Debug ... */ static CCSLogLevel minLevel = _ccsLogLevels; void ccsLog (const char *domain, CCSLogLevel level, const char *fmt, ...) { static const char * const levelName[_ccsLogLevels] = CCSLOGLEVEL_NAMES; if (minLevel == _ccsLogLevels) { const char *env = getenv ("CCS_LOG_LEVEL"); minLevel = ccsLogInfo; if (env != NULL) { int i = 0; while (i < _ccsLogLevels && strcmp (levelName[i], env)) ++i; if (i < _ccsLogLevels) minLevel = (CCSLogLevel)i; } } if (level >= minLevel && level < _ccsLogLevels) { FILE *file = (level >= ccsLogWarning) ? stderr : stdout; va_list va; va_start (va, fmt); /* I'm not a huge fan of this log format, but it matches compiz */ fprintf (file, "compizconfig%s%s%s%s: ", domain != NULL ? " (" : " ", domain != NULL ? domain : "", domain != NULL ? ") - " : "- ", levelName[level]); vfprintf (file, fmt, va); if (fmt[strlen(fmt)-1] != '\n') fprintf (file, "\n"); va_end (va); } } ./compizconfig/libcompizconfig/src/ccs_backend_loader_interface.h0000644000004100000410000000350213246301623025635 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_backend_loader_interface.h * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_BACKEND_LOADER_INTERFACE_H #define CCS_BACKEND_LOADER_INTERFACE_H #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSBackendLoaderInterface CCSBackendLoaderInterface; typedef CCSBackend * (*CCSLoadBackend) (CCSBackendLoader *, const CCSInterfaceTable *interfaces, CCSContext *, const char *); typedef void (*CCSFreeBackendLoader) (CCSBackendLoader *); struct _CCSBackendLoaderInterface { CCSLoadBackend loadBackend; CCSFreeBackendLoader free; }; struct _CCSBackendLoader { CCSObject object; }; CCSREF_HDR (BackendLoader, CCSBackendLoader); CCSBackend * ccsBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *); void ccsFreeBackendLoader (CCSBackendLoader *); unsigned int ccsCCSBackendLoaderInterfaceGetType (); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/ccs_text_file_interface.c0000644000004100000410000000276613246301623024711 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_text_file_interface.c * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include INTERFACE_TYPE (CCSTextFileInterface); CCSREF_OBJ (TextFile, CCSTextFile); char * ccsTextFileReadFromStart (CCSTextFile *file) { return (*(GET_INTERFACE (CCSTextFileInterface, file))->readFromStart) (file); } Bool ccsTextFileAppendString (CCSTextFile *file, const char *str) { return (*(GET_INTERFACE (CCSTextFileInterface, file))->appendString) (file, str); } void ccsFreeTextFile (CCSTextFile *file) { return (*(GET_INTERFACE (CCSTextFileInterface, file))->free) (file); } ./compizconfig/libcompizconfig/src/config.c0000644000004100000410000000346113246301623021314 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE #include #include #include #include #include "ccs-config-private.h" char * getSectionName (void) { const char *profile; char *section; profile = getenv ("COMPIZ_CONFIG_PROFILE"); if (profile) { if (strlen (profile)) { if (asprintf (§ion, "general_%s", profile) == -1) section = NULL; } else { section = strdup ("general"); } return section; } profile = getenv ("GNOME_DESKTOP_SESSION_ID"); if (profile && strlen (profile)) return strdup ("gnome_session"); profile = getenv ("KDE_SESSION_VERSION"); if (profile && strlen (profile) && strcasecmp (profile, "4") == 0) return strdup ("kde4_session"); profile = getenv ("KDE_FULL_SESSION"); if (profile && strlen (profile) && strcasecmp (profile, "true") == 0) return strdup ("kde_session"); return strdup ("general"); } ./compizconfig/libcompizconfig/src/ccs_text_file.h0000644000004100000410000000251413246301623022665 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_text_file.h * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_TEXT_FILE_H #define CCS_TEXT_FILE_H #include #include #include "ccs_text_file_interface.h" COMPIZCONFIG_BEGIN_DECLS typedef enum _CCSTextFileOpenMode { ReadOnly = 1, ReadWrite = 2, ReadWriteCreate = 3 } CCSTextFileOpenMode; CCSTextFile * ccsUnixTextFileNew (const char *path, CCSTextFileOpenMode openMode, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/ccs_settings_upgrade_internal.c0000644000004100000410000002305413246301623026142 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include "ccs_settings_upgrade_internal.h" #include #include #include #include #include typedef Bool (*CCSProcessTokenizedUpgradeFileFunc) (const char *name, int length, const char *tokenOne, const char *tokenTwo, const char *tokenThree, int foundNumber, void *userData); static Bool isUpgrade (const char *name, int length, const char *tokenOne, const char *tokenTwo, const char *tokenThree, int foundNumber, void *userData) { static const char *upgrade = "upgrade"; static const unsigned int upgrade_str_len = 7; return strncmp (tokenThree, upgrade, upgrade_str_len) == 0; } typedef struct _FillDomainNumAndProfileData { char **domain; char **profile; unsigned int *num; } FillDomainNumAndProfileData; static int fillDomainNumAndProfile (const char *name, int length, const char *tokenOne, const char *tokenTwo, const char *tokenThree, int foundNumber, void *userData) { FillDomainNumAndProfileData *data = (FillDomainNumAndProfileData *) userData; *data->domain = strndup (name, length - (strlen (tokenOne) + 1)); /* profile.n.upgrade */ *data->profile = strndup (tokenOne, strlen (tokenOne) - (strlen (tokenTwo) + 1)); *data->num = foundNumber; return 1; } static Bool ccsDetokenizeUpgradeDomainAndExecuteUserFunc (const char *name, CCSProcessTokenizedUpgradeFileFunc func, void *userData) { int length = strlen (name); const char *tok = name; Bool success = FALSE; /* Keep removing domains and other bits * until we hit a number that we can parse */ while (tok) { long int numTmp = 0; char *nexttok = strchr (tok, '.'); char *nextnexttok = NULL; char *bit = NULL; if (!nexttok) return FALSE; ++nexttok; nextnexttok = strchr (nexttok, '.'); if (!nextnexttok) return FALSE; ++nextnexttok; bit = strndup (nexttok, strlen (nexttok) - (strlen (nextnexttok) + 1)); if (sscanf (bit, "%ld", &numTmp) == 1) { if ((*func) (name, length, tok, nexttok, nextnexttok, numTmp, userData)) success = TRUE; } tok = nexttok; free (bit); if (success) return TRUE; } return FALSE; } Bool ccsUpgradeGetDomainNumAndProfile (const char *name, char **domain, unsigned int *num, char **profile) { FillDomainNumAndProfileData data = { domain, profile, num }; return ccsDetokenizeUpgradeDomainAndExecuteUserFunc (name, fillDomainNumAndProfile, (void *) &data); } int ccsUpgradeNameFilter (const char *name) { Bool result = FALSE; int length = strlen (name); if (length < 7) return 0; result = ccsDetokenizeUpgradeDomainAndExecuteUserFunc (name, isUpgrade, NULL); if (result) return 1; return 0; } void ccsUpgradeClearValues (CCSSettingList clearSettings) { CCSSettingList sl = clearSettings; while (sl) { CCSSetting *tempSetting = (CCSSetting *) sl->data; CCSSetting *setting; CCSPlugin *plugin = ccsSettingGetParent (tempSetting); const char *name = ccsSettingGetName (tempSetting); setting = ccsFindSetting (plugin, name); if (setting) { CCSSettingInfo *tempInfo = ccsSettingGetInfo (tempSetting); CCSSettingType tType = ccsSettingGetType (tempSetting); CCSSettingType sType = ccsSettingGetType (setting); CCSSettingInfo *info = ccsSettingGetInfo (setting); if (sType != tType) { ccsWarning ("Attempted to upgrade setting %s with wrong type", name); sl = sl->next; continue; } if (sType != TypeList) { if (ccsCheckValueEq (ccsSettingGetValue (setting), sType, info, ccsSettingGetValue (tempSetting), tType, tempInfo)) { ccsDebug ("Resetting %s to default", name); ccsResetToDefault (setting, TRUE); } else { ccsDebug ("Skipping processing of %s", name); } } else { unsigned int count = 0; /* Try and remove any specified items from the list */ CCSSettingValueList l = ccsSettingGetValue (tempSetting)->value.asList; CCSSettingValueList nl = ccsCopyList (ccsSettingGetValue (setting)->value.asList, setting); CCSSettingInfo *info = ccsSettingGetInfo (setting); while (l) { CCSSettingValueList olv = nl; while (olv) { CCSSettingValue *lv = (CCSSettingValue *) l->data; CCSSettingValue *olvv = (CCSSettingValue *) olv->data; /* Break if we found a matching value, so that we can * remove it from the list */ if (ccsCheckValueEq (lv, info->forList.listType, info, olvv, info->forList.listType, info)) break; olv = olv->next; } /* We found a matching value, remove it */ if (olv) { ++count; nl = ccsSettingValueListRemove (nl, olv->data, TRUE); } l = l->next; } ccsDebug ("Removed %i items from %s", count, name); ccsSetList (setting, nl, TRUE); ccsSettingValueListFree (nl, TRUE); } } sl = sl->next; } } void ccsUpgradeAddValues (CCSSettingList addSettings) { CCSSettingList sl = addSettings; while (sl) { CCSSetting *tempSetting = (CCSSetting *) sl->data; CCSSetting *setting; CCSPlugin *plugin = ccsSettingGetParent (tempSetting); const char *name = ccsSettingGetName (tempSetting); setting = ccsFindSetting (plugin, name); if (setting) { const CCSSettingType tempSettingType = ccsSettingGetType (tempSetting); const CCSSettingType actualSettingType = ccsSettingGetType (setting); if (tempSettingType != actualSettingType) { ccsWarning ("Attempted to upgrade setting %s with wrong type", name); sl = sl->next; continue; } ccsDebug ("Overriding value %s", name); if (tempSettingType != TypeList) ccsSetValue (setting, ccsSettingGetValue (tempSetting), TRUE); else { unsigned int count = 0; /* Try and apppend any new items to the list */ CCSSettingValueList l = ccsSettingGetValue (tempSetting)->value.asList; CCSSettingValueList nl = ccsCopyList (ccsSettingGetValue (setting)->value.asList, setting); CCSSettingInfo *info = ccsSettingGetInfo (setting); while (l) { CCSSettingValueList olv = nl; while (olv) { CCSSettingValue *lv = (CCSSettingValue *) l->data; CCSSettingValue *olvv = (CCSSettingValue *) olv->data; /* Break if we find the same value, as it was in the list * already */ if (ccsCheckValueEq (lv, info->forList.listType, info, olvv, info->forList.listType, info)) break; olv = olv->next; } /* If olv is NULL then the value was not in the original * list and we should append the value to nl */ if (!olv) { ++count; /* Before we do that, make sure that the setting parent * is set to the real setting, so that it behaves * correctly later on */ l->data->parent = setting; nl = ccsSettingValueListAppend (nl, l->data); } l = l->next; } ccsDebug ("Appending %i items to %s", count, name); ccsSetList (setting, nl, TRUE); } } else { ccsDebug ("Value %s not found!", name); } sl = sl->next; } } void ccsUpgradeReplaceValues (CCSSettingList replaceFromValueSettings, CCSSettingList replaceToValueSettings) { CCSSettingList sl = replaceFromValueSettings; while (sl) { CCSSetting *tempSetting = (CCSSetting *) sl->data; CCSSetting *setting; CCSPlugin *plugin = ccsSettingGetParent (tempSetting); const char *name = ccsSettingGetName (tempSetting); setting = ccsFindSetting (plugin, name); if (setting) { CCSSettingValue *value = ccsSettingGetValue (setting); CCSSettingType realType = ccsSettingGetType (setting); CCSSettingInfo *realInfo = ccsSettingGetInfo (setting); CCSSettingValue *tempValue = ccsSettingGetValue (tempSetting); CCSSettingType tempType = ccsSettingGetType (tempSetting); CCSSettingInfo *tempInfo = ccsSettingGetInfo (tempSetting); if (ccsCheckValueEq (value, realType, realInfo, tempValue, tempType, tempInfo)) { CCSSettingList rl = replaceToValueSettings; while (rl) { CCSSetting *rsetting = (CCSSetting *) rl->data; const char *replaceToSettingName = ccsSettingGetName (rsetting); if (strcmp (replaceToSettingName, name) == 0) { ccsDebug ("Matched and replaced %s", name); ccsSetValue (setting, ccsSettingGetValue (rsetting), TRUE); break; } rl = rl->next; } } else { ccsDebug ("Skipping processing of %s", name); } } sl = sl->next; } } ./compizconfig/libcompizconfig/src/ccs_config_file.c0000644000004100000410000001752613246301623023152 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_config_file.c * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #define SETTINGPATH "compiz-1/compizconfig" typedef struct _CCSIniConfigFilePrivate CCSIniConfigFilePrivate; struct _CCSIniConfigFilePrivate { int configWatch; }; static char* getConfigFileName (void) { char *configDir = NULL; char *fileName = NULL; configDir = getenv ("XDG_CONFIG_HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/%s/config", configDir, SETTINGPATH) == -1) fileName = NULL; return fileName; } configDir = getenv ("HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/.config/%s/config", configDir, SETTINGPATH) == -1) fileName = NULL; return fileName; } return NULL; } static IniDictionary* getConfigFile (void) { char *fileName; IniDictionary *iniFile; fileName = getConfigFileName(); if (!fileName) return NULL; iniFile = ccsIniOpen (fileName); free (fileName); return iniFile; } static Bool ccsReadGlobalConfig (ConfigOption option, char **value) { IniDictionary *iniFile; char *entry = NULL; char *section; Bool ret; FILE *fp; /* check if the global config file exists - if it doesn't, exit to avoid it being created by ccsIniOpen */ fp = fopen (SYSCONFDIR "/compizconfig/config", "r"); if (!fp) return FALSE; fclose (fp); iniFile = ccsIniOpen (SYSCONFDIR "/compizconfig/config"); if (!iniFile) return FALSE; switch (option) { case OptionProfile: entry = "profile"; break; case OptionBackend: entry = "backend"; break; case OptionIntegration: entry = "integration"; break; case OptionAutoSort: entry = "plugin_list_autosort"; break; default: break; } if (!entry) { ccsIniClose (iniFile); return FALSE; } *value = NULL; section = getSectionName(); ret = ccsIniGetString (iniFile, section, entry, value); free (section); ccsIniClose (iniFile); return ret; } static Bool ccsIniConfigFileReadConfigOption (CCSConfigFile *config, ConfigOption option, char **value) { IniDictionary *iniFile; char *entry = NULL; char *section; Bool ret; iniFile = getConfigFile(); if (!iniFile) return ccsReadGlobalConfig (option, value); switch (option) { case OptionProfile: entry = "profile"; break; case OptionBackend: entry = "backend"; break; case OptionIntegration: entry = "integration"; break; case OptionAutoSort: entry = "plugin_list_autosort"; break; default: break; } if (!entry) { ccsIniClose (iniFile); return FALSE; } *value = NULL; section = getSectionName(); ret = ccsIniGetString (iniFile, section, entry, value); free (section); ccsIniClose (iniFile); if (!ret) ret = ccsReadGlobalConfig (option, value); return ret; } static Bool ccsIniConfigFileWriteConfigOption (CCSConfigFile *config, ConfigOption option, const char *value) { CCSIniConfigFilePrivate *priv = GET_PRIVATE (CCSIniConfigFilePrivate, config); IniDictionary *iniFile; char *entry = NULL; char *section = NULL; char *fileName = NULL; char *curVal = NULL; Bool changed = TRUE; ccsDisableFileWatch (priv->configWatch); /* don't change config if nothing changed */ if (ccsIniConfigFileReadConfigOption (config, option, &curVal)) { changed = (strcmp (value, curVal) != 0); if (curVal) free (curVal); } if (!changed) { ccsEnableFileWatch (priv->configWatch); return TRUE; } iniFile = getConfigFile(); if (!iniFile) { ccsEnableFileWatch (priv->configWatch); return FALSE; } switch (option) { case OptionProfile: entry = "profile"; break; case OptionBackend: entry = "backend"; break; case OptionIntegration: entry = "integration"; break; case OptionAutoSort: entry = "plugin_list_autosort"; break; default: break; } if (!entry) { ccsIniClose (iniFile); ccsEnableFileWatch (priv->configWatch); return FALSE; } section = getSectionName(); ccsIniSetString (iniFile, section, entry, value); free (section); fileName = getConfigFileName(); if (!fileName) { ccsIniClose (iniFile); ccsEnableFileWatch (priv->configWatch); return FALSE; } ccsIniSave (iniFile, fileName); ccsIniClose (iniFile); free (fileName); ccsEnableFileWatch (priv->configWatch); return TRUE; } static void ccsSetIniConfigWatchCallback (CCSConfigFile *config, ConfigChangeCallbackProc callback, void *data) { CCSIniConfigFilePrivate *priv = GET_PRIVATE (CCSIniConfigFilePrivate, config); char *fileName; fileName = getConfigFileName(); if (!fileName) return; priv->configWatch = ccsAddFileWatch (fileName, TRUE, (FileWatchCallbackProc) callback, data); free (fileName); return; } static void freeAndFinalizeConfigFile (CCSConfigFile *config, CCSObjectAllocationInterface *ai) { CCSIniConfigFilePrivate *priv = GET_PRIVATE (CCSIniConfigFilePrivate, config); if (priv) { if (priv->configWatch) ccsRemoveFileWatch (priv->configWatch); } ccsObjectFinalize (config); (*ai->free_) (ai->allocator, config); } static void ccsIniConfigFileFree (CCSConfigFile *config) { freeAndFinalizeConfigFile (config, config->object.object_allocation); } const CCSConfigFileInterface ccsIniConfigFileInterface = { ccsIniConfigFileReadConfigOption, ccsIniConfigFileWriteConfigOption, ccsSetIniConfigWatchCallback, ccsIniConfigFileFree }; static CCSConfigFile * allocateConfigFile (CCSObjectAllocationInterface *ai) { CCSConfigFile *loader = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSConfigFile)); if (!loader) return NULL; ccsObjectInit (loader, ai); return loader; } static CCSIniConfigFilePrivate * allocatePrivate (CCSConfigFile *config, CCSObjectAllocationInterface *ai) { CCSIniConfigFilePrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIniConfigFilePrivate)); if (!priv) { freeAndFinalizeConfigFile (config, ai); return NULL; } return priv; } CCSConfigFile * ccsInternalConfigFileNew (CCSObjectAllocationInterface *ai) { CCSConfigFile *loader = allocateConfigFile (ai); if (!loader) return NULL; CCSIniConfigFilePrivate *priv = allocatePrivate (loader, ai); if (!priv) return NULL; priv->configWatch = -1; ccsObjectSetPrivate (loader, (CCSPrivate *) (priv)); ccsObjectAddInterface (loader, (const CCSInterface *) &ccsIniConfigFileInterface, GET_INTERFACE_TYPE (CCSConfigFileInterface)); ccsObjectRef (loader); return loader; } ./compizconfig/libcompizconfig/src/ccs-private.h0000644000004100000410000001341213246301623022271 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CCS_PRIVATE_H #define CSS_PRIVATE_H #include COMPIZCONFIG_BEGIN_DECLS #include #include extern Bool basicMetadata; typedef struct _CCSContextPrivate { /* Some helper function pointers that can be replaced * in a test scenario */ CCSContextImportFromFile importFromFile; CCSScanForProfilesProc scanForProfiles; CCSBackendLoader *backendLoader; CCSDynamicBackend *backend; CCSPluginList plugins; /* list of plugins settings were loaded for */ CCSPluginCategory *categories; /* list of plugin categories */ void *privatePtr; /* private pointer that can be used by the caller */ char *profile; Bool deIntegration; Bool pluginListAutoSort; CCSConfigFile *configFile; CCSSettingList changedSettings; /* list of settings changed since last settings write */ unsigned int screenNum; /* screen number this context is assigned to */ const CCSInterfaceTable *object_interfaces; } CCSContextPrivate; typedef struct _CCSPluginPrivate { char *name; /* plugin name */ char *shortDesc; /* plugin short description */ char *longDesc; /* plugin long description */ char *hints; /* currently unused */ char *category; /* plugin category name */ CCSStringList loadAfter; /* list of plugin names this plugin needs to be loaded after */ CCSStringList loadBefore; /* list of plugin names this plugin needs to be loaded before */ CCSStringList requiresPlugin; /* list of plugin names this plugin requires */ CCSStringList conflictPlugin; /* list of plugin names this plugin conflicts with */ CCSStringList conflictFeature; /* list of feature names this plugin conflicts with */ CCSStringList providesFeature; /* list of feature names this plugin provides */ CCSStringList requiresFeature; /* list of feature names this plugin requires */ void *privatePtr; /* private pointer that can be used by the caller */ CCSContext *context; /* context this plugin belongs to */ CCSSettingList settings; CCSGroupList groups; Bool loaded; Bool active; char * xmlFile; char * xmlPath; #ifdef USE_PROTOBUF char * pbFilePath; #endif CCSStrExtensionList stringExtensions; } CCSPluginPrivate; typedef struct _CCSSettingPrivate { char *name; /* setting name */ char *shortDesc; /* setting short description in current locale */ char *longDesc; /* setting long description in current locale */ CCSSettingType type; /* setting type */ CCSSettingInfo info; /* information assigned to this setting, valid if the setting is an int, float, string or list setting */ char *group; /* group name in current locale */ char *subGroup; /* sub group name in current locale */ char *hints; /* hints in current locale */ CCSSettingValue defaultValue; /* default value of this setting */ CCSSettingValue *value; /* actual value of this setting */ Bool isDefault; /* does the actual value match the default value? */ CCSPlugin *parent; /* plugin this setting belongs to */ void *privatePtr; /* private pointer for usage by the caller */ } CCSSettingPrivate; typedef struct _CCSDynamicBackendPrivate { void *dlhand; CCSBackend *backend; } CCSDynamicBackendPrivate; typedef struct _CCSSettingsUpgrade { char *profile; char *file; char *domain; unsigned int num; CCSSettingList changedSettings; CCSSettingList addValueSettings; CCSSettingList clearValueSettings; CCSSettingList replaceFromValueSettings; CCSSettingList replaceToValueSettings; } CCSSettingsUpgrade; Bool ccsCheckForSettingsUpgrade (CCSContext *context); void ccsLoadPlugins (CCSContext * context); void ccsLoadPluginSettings (CCSPlugin * plugin); void collateGroups (CCSPluginPrivate * p); Bool ccsLoadPluginDefault (CCSContext *context, char *name); void ccsLoadPluginsDefault (CCSContext *context); void ccsCheckFileWatches (void); void ccsAddKeybindingMaskToString (char **bindingString, unsigned int matchBindingMask, unsigned int *addedBindingMask, unsigned int addBindingMask, const char *addBindingString); void ccsAddStringToKeybindingMask (unsigned int *bindingMask, const char *bindingString, unsigned int addBindingMask, const char *addBindingString); extern const CCSContextInterface ccsDefaultContextInterface; COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/filewatch.c0000644000004100000410000001141713246301623022015 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "../config.h" #endif #define _GNU_SOURCE #include #include #include #include #include #if HAVE_SYS_INOTIFY_H #include #endif #include #include #include "ccs-private.h" typedef struct _FilewatchData { char *fileName; int watchDesc; unsigned int watchId; FileWatchCallbackProc callback; void *closure; } FilewatchData; static FilewatchData *fwData = NULL; static int fwDataSize = 0; static int inotifyFd = 0; static inline int findDataIndexById (unsigned int watchId) { int i, index = -1; for (i = 0; i < fwDataSize; ++i) if (fwData[i].watchId == watchId) { index = i; break; } return index; } void ccsCheckFileWatches (void) { #if HAVE_SYS_INOTIFY_H char buf[256 * (sizeof (struct inotify_event) + 16)]; struct inotify_event *event; int len, i = 0, j; if (!inotifyFd) return; len = read (inotifyFd, buf, sizeof (buf)); if (len < 0) return; while (i < len) { event = (struct inotify_event *) & buf[i]; for (j = 0; j < fwDataSize; ++j) if ((fwData[j].watchDesc == event->wd) && fwData[j].callback) (*fwData[j].callback) (fwData[j].watchId, fwData[j].closure); i += sizeof (*event) + event->len; } #endif } unsigned int ccsAddFileWatch (const char *fileName, Bool enable, FileWatchCallbackProc callback, void *closure) { unsigned int i, maxWatchId = 0; #if HAVE_SYS_INOTIFY_H if (!inotifyFd) { inotifyFd = inotify_init (); fcntl (inotifyFd, F_SETFL, O_NONBLOCK); } #endif fwData = realloc (fwData, (fwDataSize + 1) * sizeof (FilewatchData)); if (!fwData) { fwDataSize = 0; return 0; } fwData[fwDataSize].fileName = strdup (fileName); #if HAVE_SYS_INOTIFY_H if (enable) fwData[fwDataSize].watchDesc = inotify_add_watch (inotifyFd, fileName, IN_MODIFY | IN_MOVE | IN_MOVE_SELF | IN_DELETE_SELF | IN_CREATE | IN_DELETE); else #endif fwData[fwDataSize].watchDesc = 0; fwData[fwDataSize].callback = callback; fwData[fwDataSize].closure = closure; /* determine current highest ID */ for (i = 0; i < fwDataSize; ++i) if (fwData[i].watchId > maxWatchId) maxWatchId = fwData[i].watchId; fwData[fwDataSize].watchId = maxWatchId + 1; ++fwDataSize; return (maxWatchId + 1); } void ccsRemoveFileWatch (unsigned int watchId) { int selectedIndex, i; selectedIndex = findDataIndexById (watchId); /* not found */ if (selectedIndex < 0) return; /* clear entry */ free (fwData[selectedIndex].fileName); #if HAVE_SYS_INOTIFY_H if (fwData[selectedIndex].watchDesc) inotify_rm_watch (inotifyFd, fwData[selectedIndex].watchDesc); #endif /* shrink array */ for (i = selectedIndex; i < (fwDataSize - 1); ++i) fwData[i] = fwData[i+1]; --fwDataSize; if (fwDataSize > 0) { fwData = realloc (fwData, fwDataSize * sizeof (FilewatchData)); if (!fwData) fwDataSize = 0; } else { free (fwData); fwData = NULL; } if (!fwDataSize) { if (inotifyFd) close (inotifyFd); inotifyFd = 0; } } void ccsDisableFileWatch (unsigned int watchId) { int index; index = findDataIndexById (watchId); if (index < 0) return; #if HAVE_SYS_INOTIFY_H if (fwData[index].watchDesc) { inotify_rm_watch (inotifyFd, fwData[index].watchDesc); fwData[index].watchDesc = 0; } #endif } void ccsEnableFileWatch (unsigned int watchId) { int index; index = findDataIndexById (watchId); if (index < 0) return; #if HAVE_SYS_INOTIFY_H if (!fwData[index].watchDesc) fwData[index].watchDesc = inotify_add_watch (inotifyFd, fwData[index].fileName, IN_MODIFY | IN_MOVE | IN_MOVE_SELF | IN_DELETE_SELF | IN_CREATE | IN_DELETE); #endif } ./compizconfig/libcompizconfig/src/ini.c0000644000004100000410000004155213246301623020631 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE #include #include #include #include #include #include "iniparser.h" /** * Creates the parent directory for @fileName, recursively creating a directory * tree if necessary. * * @param fileName: The absolute path to the desired file * @return: True if the parent directory of the file now exists **/ Bool ccsCreateDirFor (const char *fileName) { char *path, *delim; Bool success; delim = strrchr (fileName, '/'); if (!delim) return FALSE; /* Input string is not a valid absolue path! */ path = malloc (delim - fileName + 1); if (!path) return FALSE; strncpy (path, fileName, delim - fileName); path[delim - fileName] = '\0'; success = !mkdir (path, 0700); /* Mkdir returns 0 on success */ success |= (errno == EEXIST); if (!success && (errno == ENOENT)) /* ENOENT means we must recursively */ { /* create the parent's parent */ if (ccsCreateDirFor (path)) success = !mkdir (path, 0700); } free (path); return success; } IniDictionary * ccsIniOpen (const char * fileName) { FILE *file; if (!ccsCreateDirFor(fileName)) return NULL; /* create file if it doesn't exist or is desired */ file = fopen (fileName, "a+"); if (file) fclose (file); return iniparser_new ((char*) fileName); } IniDictionary* ccsIniNew (void) { return dictionary_new (0); } void ccsIniClose (IniDictionary *dictionary) { iniparser_free (dictionary); } void ccsIniSave (IniDictionary *dictionary, const char *fileName) { if (!ccsCreateDirFor (fileName)) return; iniparser_dump_ini (dictionary, fileName); } static char* getIniString (IniDictionary *dictionary, const char *section, const char *entry) { char *sectionName; char *retValue; if (asprintf (§ionName, "%s:%s", section, entry) == -1) return NULL; retValue = iniparser_getstring (dictionary, sectionName, NULL); free (sectionName); return retValue; } static void setIniString (IniDictionary *dictionary, const char *section, const char *entry, const char *value) { char *sectionName; if (asprintf (§ionName, "%s:%s", section, entry) == -1) return; if (!iniparser_find_entry (dictionary, (char*) section)) iniparser_add_entry (dictionary, (char*) section, NULL, NULL); iniparser_setstr (dictionary, sectionName, (char*) value); free (sectionName); } Bool ccsIniParseString (char *str, char **value) { *value = strdup (str); return TRUE; } Bool ccsIniGetString (IniDictionary *dictionary, const char *section, const char *entry, char **value) { char *retValue; retValue = getIniString (dictionary, section, entry); if (retValue) { ccsIniParseString (retValue, value); return TRUE; } else return FALSE; } Bool ccsIniParseInt (const char *str, int *value) { *value = strtoul (str, NULL, 10); return TRUE; } Bool ccsIniGetInt (IniDictionary *dictionary, const char *section, const char *entry, int *value) { char *retValue; retValue = getIniString (dictionary, section, entry); if (retValue) { ccsIniParseInt (retValue, value); return TRUE; } else return FALSE; } Bool ccsIniParseFloat (const char *str, float *value) { if (str) { *value = (float) strtod (str, NULL); return TRUE; } else return FALSE; } Bool ccsIniGetFloat (IniDictionary *dictionary, const char *section, const char *entry, float *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseFloat (retValue, value); } Bool ccsIniParseBool (const char *str, Bool *value) { if (str) { if ((str[0] == 't') || (str[0] == 'T') || (str[0] == 'y') || (str[0] == 'Y') || (str[0] == '1')) { *value = TRUE; } else *value = FALSE; return TRUE; } else return FALSE; } Bool ccsIniGetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseBool (retValue, value); } Bool ccsIniParseColor (const char *str, CCSSettingColorValue *value) { if (str && ccsStringToColor (str, value)) return TRUE; else return FALSE; } Bool ccsIniGetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseColor (retValue, value); } Bool ccsIniParseKey (const char *str, CCSSettingKeyValue *value) { if (str) return ccsStringToKeyBinding (str, value); return FALSE; } Bool ccsIniGetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseKey (retValue, value); } Bool ccsIniParseButton (const char *str, CCSSettingButtonValue *value) { if (str) return ccsStringToButtonBinding (str, value); else return FALSE; } Bool ccsIniGetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseButton (retValue, value); } Bool ccsIniParseEdge (const char *str, unsigned int *value) { if (str) { *value = ccsStringToEdges (str); return TRUE; } else return FALSE; } Bool ccsIniGetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int *value) { char *retValue = getIniString (dictionary, section, entry); return ccsIniParseEdge (retValue, value); } Bool ccsIniGetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool *value) { return ccsIniGetBool (dictionary, section, entry, value); } static Bool isEmptyString (char *value) { int len, i = 0; len = strlen (value); for (i = 0; i < len; ++i) { if (!isblank (value[i])) return FALSE; } return TRUE; } Bool ccsIniParseList (const char *str, CCSSettingValueList *value, CCSSetting *parent) { CCSSettingValueList list = NULL; char *valueString, *valueStart; char *token; int nItems = 1, i = 0, len; valueString = strdup (str); valueStart = valueString; /* remove trailing semicolon that we added to be able to differentiate between an empty list and a list with one empty item */ len = strlen (valueString); if (valueString[len - 1] == ';') valueString[len - 1] = 0; token = strchr (valueString, ';'); while (token) { token = strchr (token + 1, ';'); ++nItems; } token = strsep (&valueString, ";"); switch (ccsSettingGetInfo (parent)->forList.listType) { case TypeString: case TypeMatch: { char **array = malloc (nItems * sizeof (char*)); if (!array) break; while (token) { array[i++] = strdup (token); token = strsep (&valueString, ";"); } list = ccsGetValueListFromStringArray ((const char **) array, nItems, parent); for (i = 0; i < nItems; ++i) free (array[i]); free (array); } break; case TypeColor: { CCSSettingColorValue *array; array = malloc (nItems * sizeof (CCSSettingColorValue)); if (!array) break; while (token) { memset (&array[i], 0, sizeof (CCSSettingColorValue)); ccsStringToColor (token, &array[i]); token = strsep (&valueString, ";"); ++i; } list = ccsGetValueListFromColorArray (array, nItems, parent); free (array); } break; case TypeBool: { Bool *array = malloc (nItems * sizeof (Bool)); Bool isTrue; if (!array) break; while (token) { isTrue = (token[0] == 'y' || token[0] == 'Y' || token[0] == '1' || token[0] == 't' || token[0] == 'T'); array[i++] = isTrue; token = strsep (&valueString, ";"); } list = ccsGetValueListFromBoolArray (array, nItems, parent); free (array); } break; case TypeInt: { int *array = malloc (nItems * sizeof (int)); if (!array) break; while (token) { array[i++] = strtoul (token, NULL, 10); token = strsep (&valueString, ";"); } list = ccsGetValueListFromIntArray (array, nItems, parent); free (array); } break; case TypeFloat: { float *array = malloc (nItems * sizeof (float)); if (!array) break; while (token) { array[i++] = strtod (token, NULL); token = strsep (&valueString, ";"); } list = ccsGetValueListFromFloatArray (array, nItems, parent); free (array); } break; case TypeKey: { CCSSettingValue *val = NULL; list = NULL; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; val->refCount = 1; if (ccsStringToKeyBinding (token, &val->value.asKey)) list = ccsSettingValueListAppend (list, val); else free (val); token = strsep (&valueString, ";"); } } break; case TypeButton: { CCSSettingValue *val = NULL; list = NULL; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; val->refCount = 1; if (ccsStringToButtonBinding (token, &val->value.asButton)) list = ccsSettingValueListAppend (list, val); else free (val); token = strsep (&valueString, ";"); } } break; case TypeEdge: { CCSSettingValue *val = NULL; list = NULL; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; val->refCount = 1; val->value.asEdge = ccsStringToEdges (token); list = ccsSettingValueListAppend (list, val); token = strsep (&valueString, ";"); } } break; case TypeBell: { CCSSettingValue *val = NULL; list = NULL; Bool isTrue; while (token) { val = malloc (sizeof (CCSSettingValue)); if (!val) break; isTrue = (token[0] == 'y' || token[0] == 'Y' || token[0] == '1' || token[0] == 't' || token[0] == 'T'); val->value.asBell = isTrue; val->refCount = 1; list = ccsSettingValueListAppend (list, val); token = strsep (&valueString, ";"); } } break; default: break; } *value = list; free (valueStart); return TRUE; } Bool ccsIniGetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList *value, CCSSetting *parent) { char *valString = getIniString (dictionary, section, entry); if (!valString) return FALSE; if (isEmptyString (valString)) { *value = NULL; return TRUE; } return ccsIniParseList (valString, value, parent); } void ccsIniSetString (IniDictionary * dictionary, const char * section, const char * entry, const char * value) { setIniString (dictionary, section, entry, value); } void ccsIniSetInt (IniDictionary *dictionary, const char *section, const char *entry, int value) { char *string = NULL; if (asprintf (&string, "%i", value) == -1) string = NULL; if (string) { setIniString (dictionary, section, entry, string); free (string); } } void ccsIniSetFloat (IniDictionary *dictionary, const char *section, const char *entry, float value) { char *string = NULL; if (asprintf (&string, "%f", value) == -1) string = NULL; if (string) { setIniString (dictionary, section, entry, string); free (string); } } void ccsIniSetBool (IniDictionary *dictionary, const char *section, const char *entry, Bool value) { setIniString (dictionary, section, entry, value ? "true" : "false"); } void ccsIniSetColor (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingColorValue value) { char *string; string = ccsColorToString (&value); if (string) { setIniString (dictionary, section, entry, string); free (string); } } void ccsIniSetKey (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingKeyValue value) { char *str; str = ccsKeyBindingToString (&value); if (str) { setIniString (dictionary, section, entry, str); free (str); } } void ccsIniSetButton (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingButtonValue value) { char *str; str = ccsButtonBindingToString (&value); if (str) { setIniString (dictionary, section, entry, str); free (str); } } void ccsIniSetEdge (IniDictionary *dictionary, const char *section, const char *entry, unsigned int value) { char *str; str = ccsEdgesToString (value); if (str) { setIniString (dictionary, section, entry, str); free (str); } } void ccsIniSetBell (IniDictionary *dictionary, const char *section, const char *entry, Bool value) { ccsIniSetBool (dictionary, section, entry, value); } void ccsIniSetList (IniDictionary *dictionary, const char *section, const char *entry, CCSSettingValueList value, CCSSettingType listType) { char *stringBuffer, *valueString; char valueBuffer[100]; unsigned int bufferSize = 1024, fill; stringBuffer = calloc (1, bufferSize); if (!stringBuffer) return; while (value) { switch (listType) { case TypeString: valueString = value->data->value.asString; break; case TypeMatch: valueString = value->data->value.asMatch; break; case TypeInt: snprintf (valueBuffer, 100, "%d", value->data->value.asInt); valueString = valueBuffer; break; case TypeBool: strncpy (valueBuffer, (value->data->value.asBool) ? "true" : "false", 100); valueString = valueBuffer; break; case TypeFloat: snprintf (valueBuffer, 100, "%f", value->data->value.asFloat); valueString = valueBuffer; break; case TypeColor: valueString = ccsColorToString (&value->data->value.asColor); break; case TypeKey: valueString = ccsKeyBindingToString (&value->data->value.asKey); break; case TypeButton: valueString = ccsButtonBindingToString (&value->data->value.asButton); break; case TypeEdge: valueString = ccsEdgesToString (value->data->value.asEdge); break; case TypeBell: strncpy (valueBuffer, (value->data->value.asBell) ? "true" : "false", 100); valueString = valueBuffer; break; default: valueString = NULL; break; } if (!valueString) return; fill = strlen (stringBuffer); /* the + 1 is the semicolon we're going to add */ if ((fill + strlen (valueString) + 1) >= bufferSize) { /* buffer is too small, make it larger */ bufferSize *= 2; stringBuffer = realloc (stringBuffer, bufferSize); if (!stringBuffer) return; /* properly NULL terminate it */ stringBuffer[fill] = 0; } /* we made sure that the buffer is large enough before, so there is no need for strncat */ strcat (stringBuffer, valueString); strcat (stringBuffer, ";"); if (listType == TypeColor || listType == TypeKey || listType == TypeButton || listType == TypeEdge) { free (valueString); } value = value->next; } setIniString (dictionary, section, entry, stringBuffer); free (stringBuffer); } void ccsIniRemoveEntry (IniDictionary * dictionary, const char * section, const char * entry) { char *sectionName; if (asprintf (§ionName, "%s:%s", section, entry) == -1) return; iniparser_unset (dictionary, sectionName); free (sectionName); } ./compizconfig/libcompizconfig/src/main.c0000644000004100000410000046277413246301623021013 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "../config.h" #endif #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include "ccs-private.h" #include "iniparser.h" #include "ccs_settings_upgrade_internal.h" #include "ccs_text_file_interface.h" #include "ccs_text_file.h" #include "ccs_backend_loader_interface.h" #include "ccs_backend_loader.h" #include "ccs_config_file_interface.h" #include "ccs_config_file.h" static void * wrapRealloc (void *o, void *a , size_t b) { return realloc (a, b); } static void * wrapMalloc (void *o, size_t a) { return malloc (a); } static void * wrapCalloc (void *o, size_t a, size_t b) { return calloc (a, b); } static void wrapFree (void *o, void *a) { free (a); } CCSObjectAllocationInterface ccsDefaultObjectAllocator = { wrapRealloc, wrapMalloc, wrapCalloc, wrapFree, NULL }; /* CCSObject stuff */ Bool ccsObjectInit_(CCSObject *object, CCSObjectAllocationInterface *object_allocation) { object->priv = NULL; object->n_interfaces = 0; object->n_allocated_interfaces = 0; object->interfaces = NULL; object->interface_types = NULL; object->object_allocation = object_allocation; object->refcnt = 0; return TRUE; } Bool ccsObjectAddInterface_(CCSObject *object, const CCSInterface *interface, int interface_type) { ++object->n_interfaces; if (object->n_allocated_interfaces < object->n_interfaces) { unsigned int old_allocated_interfaces = object->n_allocated_interfaces; object->n_allocated_interfaces = object->n_interfaces; CCSInterface **ifaces = (*object->object_allocation->realloc_) (object->object_allocation->allocator, object->interfaces, object->n_allocated_interfaces * sizeof (CCSInterface *)); int *iface_types = (*object->object_allocation->realloc_) (object->object_allocation->allocator, object->interface_types, object->n_allocated_interfaces * sizeof (int)); if (!ifaces || !iface_types) { if (ifaces) (*object->object_allocation->free_) (object->object_allocation->allocator, ifaces); if (iface_types) (*object->object_allocation->free_) (object->object_allocation->allocator, iface_types); --object->n_interfaces; object->n_allocated_interfaces = old_allocated_interfaces; return FALSE; } else { object->interfaces = (const CCSInterface **) ifaces; object->interface_types = iface_types; } } object->interfaces[object->n_interfaces - 1] = interface; object->interface_types[object->n_interfaces - 1] = interface_type; return TRUE; } Bool ccsObjectRemoveInterface_(CCSObject *object, int interface_type) { unsigned int i = 0; if (!object->n_interfaces) return FALSE; const CCSInterface **o = object->interfaces; int *type = object->interface_types; for (; i < object->n_interfaces; ++i, ++o, ++type) { if (object->interface_types[i] == interface_type) break; } if (i >= object->n_interfaces) return FALSE; /* Now clear this section and move everything back */ object->interfaces[i] = NULL; ++i; const CCSInterface **oLast = o; int *typeLast = type; ++o; ++type; memmove ((void *) oLast, (void *)o, (object->n_interfaces - i) * sizeof (CCSInterface *)); memmove ((void *) typeLast, (void *) type, (object->n_interfaces - i) * sizeof (int)); --object->n_interfaces; if (!object->n_interfaces) { free (object->interfaces); free (object->interface_types); object->interfaces = NULL; object->interface_types = NULL; object->n_allocated_interfaces = 0; } return TRUE; } const CCSInterface * ccsObjectGetInterface_(CCSObject *object, int interface_type) { unsigned int i = 0; for (; i < object->n_interfaces; ++i) { if (object->interface_types[i] == interface_type) return object->interfaces[i]; } ccsError ("Unable to find interface type %i on %p\n" "This is either a programmer error or more than one static library \n" "defining this interface has been linked in\n" "Unable to continue, please file a bug about this\n", interface_type, object); abort (); return NULL; } CCSPrivate * ccsObjectGetPrivate_(CCSObject *object) { return object->priv; } void ccsObjectSetPrivate_(CCSObject *object, CCSPrivate *priv) { object->priv = priv; } void ccsObjectFinalize_(CCSObject *object) { if (object->priv) { (*object->object_allocation->free_) (object->object_allocation->allocator, object->priv); object->priv = NULL; } if (object->interfaces) { (*object->object_allocation->free_) (object->object_allocation->allocator, object->interfaces); object->interfaces = NULL; } if (object->interface_types) { (*object->object_allocation->free_) (object->object_allocation->allocator, object->interface_types); object->interface_types = NULL; } object->n_interfaces = 0; } unsigned int ccsAllocateType () { static unsigned int start = 0; ++start; return start; } INTERFACE_TYPE (CCSContextInterface) INTERFACE_TYPE (CCSPluginInterface) INTERFACE_TYPE (CCSSettingInterface) INTERFACE_TYPE (CCSBackendInterface); INTERFACE_TYPE (CCSDynamicBackendInterface); INTERFACE_TYPE (CCSIntegrationInterface); INTERFACE_TYPE (CCSIntegratedSettingInfoInterface); INTERFACE_TYPE (CCSIntegratedSettingInterface); INTERFACE_TYPE (CCSIntegratedSettingsStorageInterface); INTERFACE_TYPE (CCSIntegratedSettingFactoryInterface); Bool basicMetadata = FALSE; void ccsSetBasicMetadata (Bool value) { basicMetadata = value; } static void initGeneralOptions (CCSContext * context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); char *val = NULL; if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionBackend, &val)) { ccsSetBackend (context, val); if (val) free (val); } else ccsSetBackend (context, "ini"); if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionProfile, &val)) { ccsSetProfile (context, val); if (val) free (val); } else ccsSetProfile (context, ""); if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionIntegration, &val)) { ccsSetIntegrationEnabled (context, !strcasecmp (val, "true")); if (val) free (val); } else ccsSetIntegrationEnabled (context, TRUE); if (ccsConfigFileReadConfigOption (cPrivate->configFile, OptionAutoSort, &val)) { ccsSetPluginListAutoSort (context, !strcasecmp (val, "true")); if (val) free (val); } else ccsSetPluginListAutoSort (context, TRUE); } static void configChangeNotify (unsigned int watchId, void *closure) { CCSContext *context = (CCSContext *) closure; initGeneralOptions (context); ccsReadSettings (context); } CCSContext * ccsEmptyContextNew (unsigned int screenNum, CCSContextImportFromFile importFromFile, CCSScanForProfilesProc scanForProfiles, CCSBackendLoader *loader, CCSConfigFile *config, const CCSInterfaceTable *object_interfaces) { CCSContext *context; context = calloc (1, sizeof (CCSContext)); if (!context) return NULL; ccsObjectInit (context, &ccsDefaultObjectAllocator); CCSContextPrivate *ccsPrivate = calloc (1, sizeof (CCSContextPrivate)); if (!ccsPrivate) { free (context); return NULL; } ccsObjectSetPrivate (context, (CCSPrivate *) ccsPrivate); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->importFromFile = importFromFile; cPrivate->scanForProfiles = scanForProfiles; cPrivate->object_interfaces = object_interfaces; cPrivate->screenNum = screenNum; cPrivate->backendLoader = loader; cPrivate->configFile = config; ccsObjectAddInterface (context, (CCSInterface *) object_interfaces->contextInterface, GET_INTERFACE_TYPE (CCSContextInterface)); initGeneralOptions (context); ccsSetConfigWatchCallback (cPrivate->configFile, configChangeNotify, context); if (cPrivate->backend) ccsInfo ("Backend : %s", ccsDynamicBackendGetBackendName (cPrivate->backend)); ccsInfo ("Integration : %s", cPrivate->deIntegration ? "true" : "false"); ccsInfo ("Profile : %s", (cPrivate->profile && strlen (cPrivate->profile)) ? cPrivate->profile : "default"); return context; } static void * ccsContextGetPrivatePtrDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->privatePtr; } static void ccsContextSetPrivatePtrDefault (CCSContext *context, void *ptr) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->privatePtr = ptr; } static CCSPluginList ccsContextGetPluginsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->plugins; } static CCSPluginCategory * ccsContextGetCategoriesDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->categories; } static CCSSettingList ccsContextGetChangedSettingsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->changedSettings; } static unsigned int ccsContextGetScreenNumDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->screenNum; } static Bool ccsContextAddChangedSettingDefault (CCSContext *context, CCSSetting *setting) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->changedSettings = ccsSettingListAppend (cPrivate->changedSettings, setting); return TRUE; } static Bool ccsContextClearChangedSettingsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); cPrivate->changedSettings = ccsSettingListFree (cPrivate->changedSettings, FALSE); return TRUE; } static CCSSettingList ccsContextStealChangedSettingsDefault (CCSContext *context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSSettingList l = cPrivate->changedSettings; cPrivate->changedSettings = NULL; return l; } CCSPluginList ccsContextGetPlugins (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetPlugins) (context); } CCSPluginCategory * ccsContextGetCategories (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetCategories) (context); } CCSSettingList ccsContextGetChangedSettings (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetChangedSettings) (context); } unsigned int ccsContextGetScreenNum (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetScreenNum) (context); } Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextAddChangedSetting) (context, setting); } Bool ccsContextClearChangedSettings (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextClearChangedSettings) (context); } CCSSettingList ccsContextStealChangedSettings (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextStealChangedSettings) (context); } void * ccsContextGetPrivatePtr (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetPrivatePtr) (context); } void ccsContextSetPrivatePtr (CCSContext *context, void *ptr) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetPrivatePtr) (context, ptr); } void * ccsContextGetPluginsBindable (CCSContext *context) { return (void *) ccsContextGetPlugins (context); } void * ccsContextStealChangedSettingsBindable (CCSContext *context) { return (void *) ccsContextStealChangedSettings (context); } void * ccsContextGetChangedSettingsBindable (CCSContext *context) { return (void *) ccsContextGetChangedSettings (context); } static void ccsSetActivePluginList (CCSContext * context, CCSStringList list) { CCSPluginList l; CCSPlugin *plugin; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); for (l = cPrivate->plugins; l; l = l->next) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, l->data); pPrivate->active = FALSE; } for (; list; list = list->next) { plugin = ccsFindPlugin (context, ((CCSString *)list->data)->value); if (plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->active = TRUE; } } /* core plugin is always active */ plugin = ccsFindPlugin (context, "core"); if (plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->active = TRUE; } } static int profileNameFilter (const struct dirent *item) { int len = strlen (item->d_name); const char *lastEight = item->d_name + (len - 8); const char *lastFour = item->d_name + (len - 4); if (strcmp (lastFour, ".ini") == 0) return 1; if (strcmp (lastEight, item->d_name) == 0) return 1; return 0; } static CCSStringList scanDirectoryForProfiles (const char *directory) { struct dirent **nameList; int num = scandir (directory, &nameList, profileNameFilter, alphasort); if (num == -1) ccsError ("error occurred during scandir: %s", strerror (errno)); else if (num == 0) return NULL; else if (num > 0) { CCSStringList list = NULL; int i = 0; for (; i < num; ++i) { CCSString *string = calloc (1, sizeof (CCSString)); ccsStringRef (string); string->value = strdup (nameList[i]->d_name); list = ccsStringListAppend (list, string); free (nameList[i]); } free (nameList); return list; } return NULL; } CCSContext * ccsContextNew (unsigned int screenNum, const CCSInterfaceTable *iface) { CCSPlugin *p; CCSBackendLoader *loader = ccsSharedLibBackendLoaderNew (&ccsDefaultObjectAllocator); if (!loader) return NULL; CCSConfigFile *config = ccsInternalConfigFileNew (&ccsDefaultObjectAllocator); CCSContext *context = ccsEmptyContextNew (screenNum, ccsImportFromFile, scanDirectoryForProfiles, loader, config, iface); if (!context) return NULL; ccsLoadPlugins (context); /* Do settings upgrades */ ccsCheckForSettingsUpgrade (context); p = ccsFindPlugin (context, "core"); if (p) { CCSSetting *s; ccsLoadPluginSettings (p); /* initialize plugin->active values */ s = ccsFindSetting (p, "active_plugins"); if (s) { CCSStringList list; CCSSettingValueList vl; ccsGetList (s, &vl); list = ccsGetStringListFromValueList (vl); ccsSetActivePluginList (context, list); ccsStringListFree (list, TRUE); } } return context; } CCSPlugin * ccsFindPluginDefault (CCSContext * context, const char *name) { if (!name) name = ""; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSPluginList l = cPrivate->plugins; while (l) { if (!strcmp (ccsPluginGetName (l->data), name)) return l->data; l = l->next; } return NULL; } CCSPlugin * ccsFindPlugin (CCSContext *context, const char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextFindPlugin) (context, name); } CCSSetting * ccsFindSettingDefault (CCSPlugin * plugin, const char *name) { if (!plugin) return NULL; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!name) name = ""; if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); CCSSettingList l = pPrivate->settings; while (l) { if (!strcmp (ccsSettingGetName (l->data), name)) return l->data; l = l->next; } return NULL; } CCSSetting * ccsFindSetting (CCSPlugin *plugin, const char *name) { if (!plugin) return NULL; return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginFindSetting) (plugin, name); } Bool ccsPluginIsActiveDefault (CCSContext * context, const char *name) { CCSPlugin *plugin; plugin = ccsFindPlugin (context, name); if (!plugin) return FALSE; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->active; } Bool ccsPluginIsActive (CCSContext *context, const char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextPluginIsActive) (context, name); } static void subGroupAdd (CCSSetting * setting, CCSGroup * group) { CCSSubGroupList l = group->subGroups; CCSSubGroup *subGroup; while (l) { if (!strcmp (l->data->name, ccsSettingGetSubGroup (setting))) { l->data->settings = ccsSettingListAppend (l->data->settings, setting); return; } l = l->next; } subGroup = calloc (1, sizeof (CCSSubGroup)); subGroup->refCount = 1; if (subGroup) { group->subGroups = ccsSubGroupListAppend (group->subGroups, subGroup); subGroup->name = strdup (ccsSettingGetSubGroup (setting)); subGroup->settings = ccsSettingListAppend (subGroup->settings, setting); } } static void groupAdd (CCSSetting * setting, CCSPluginPrivate * p) { CCSGroupList l = p->groups; CCSGroup *group; while (l) { if (!strcmp (l->data->name, ccsSettingGetGroup (setting))) { subGroupAdd (setting, l->data); return; } l = l->next; } group = calloc (1, sizeof (CCSGroup)); if (group) { group->refCount = 1; p->groups = ccsGroupListAppend (p->groups, group); group->name = strdup (ccsSettingGetGroup (setting)); subGroupAdd (setting, group); } } void collateGroups (CCSPluginPrivate * p) { CCSSettingList l = p->settings; while (l) { groupAdd (l->data, p); l = l->next; } } void ccsFreeContext (CCSContext *c) { if (!c) return; (*(GET_INTERFACE (CCSContextInterface, c))->contextDestructor) (c); } static void ccsFreeContextDefault (CCSContext * c) { if (!c) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, c); if (cPrivate->profile) free (cPrivate->profile); if (cPrivate->changedSettings) cPrivate->changedSettings = ccsSettingListFree (cPrivate->changedSettings, FALSE); if (cPrivate->backendLoader) ccsBackendLoaderUnref (cPrivate->backendLoader); if (cPrivate->configFile) ccsConfigFileUnref (cPrivate->configFile); ccsPluginListFree (cPrivate->plugins, TRUE); ccsObjectFinalize (c); free (c); } void ccsFreePlugin (CCSPlugin *p) { if (!p) return; (*(GET_INTERFACE (CCSPluginInterface, p))->pluginDestructor) (p); } static void ccsFreePluginDefault (CCSPlugin * p) { if (!p) return; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, p); free (pPrivate->name); free (pPrivate->shortDesc); free (pPrivate->longDesc); free (pPrivate->hints); free (pPrivate->category); ccsStringListFree (pPrivate->loadAfter, TRUE); ccsStringListFree (pPrivate->loadBefore, TRUE); ccsStringListFree (pPrivate->requiresPlugin, TRUE); ccsStringListFree (pPrivate->conflictPlugin, TRUE); ccsStringListFree (pPrivate->conflictFeature, TRUE); ccsStringListFree (pPrivate->providesFeature, TRUE); ccsStringListFree (pPrivate->requiresFeature, TRUE); ccsSettingListFree (pPrivate->settings, TRUE); ccsGroupListFree (pPrivate->groups, TRUE); ccsStrExtensionListFree (pPrivate->stringExtensions, TRUE); if (pPrivate->xmlFile) free (pPrivate->xmlFile); if (pPrivate->xmlPath) free (pPrivate->xmlPath); #ifdef USE_PROTOBUF if (pPrivate->pbFilePath) free (pPrivate->pbFilePath); #endif ccsObjectFinalize (p); free (p); } void ccsCleanupSettingInfo (CCSSettingInfo *info, CCSSettingType type) { switch (type) { case TypeInt: ccsIntDescListFree (info->forInt.desc, TRUE); break; case TypeString: ccsStrRestrictionListFree (info->forString.restriction, TRUE); break; case TypeList: if (info->forList.listType == TypeInt) ccsIntDescListFree (info->forList.listInfo-> forInt.desc, TRUE); free (info->forList.listInfo); break; default: break; } } static void ccsFreeSettingDefault (CCSSetting *s) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, s); free (sPrivate->name); free (sPrivate->shortDesc); free (sPrivate->longDesc); free (sPrivate->group); free (sPrivate->subGroup); free (sPrivate->hints); if (&sPrivate->defaultValue != sPrivate->value) { ccsFreeSettingValue (sPrivate->value); } ccsCleanupSettingInfo (&sPrivate->info, sPrivate->type); ccsFreeSettingValue (&sPrivate->defaultValue); ccsObjectFinalize (s); free (s); } void ccsFreeSetting (CCSSetting * s) { if (!s) return; (*(GET_INTERFACE (CCSSettingInterface, s))->settingDestructor) (s); } void ccsFreeGroup (CCSGroup * g) { if (!g) return; free (g->name); ccsSubGroupListFree (g->subGroups, TRUE); free (g); } void ccsFreeSubGroup (CCSSubGroup * s) { if (!s) return; free (s->name); ccsSettingListFree (s->settings, FALSE); free (s); } static void ccsFreeSettingValueCommon (CCSSettingValue *v, CCSSettingType type) { switch (type) { case TypeString: free (v->value.asString); break; case TypeMatch: free (v->value.asMatch); break; case TypeList: if (!v->isListChild) ccsSettingValueListFree (v->value.asList, TRUE); break; default: break; } } void ccsFreeSettingValue (CCSSettingValue * v) { if (!v) return; if (!v->parent) { ccsError ("cannot free value without parent - use ccsFreeSettingValueWithType and specify type instead"); return; } CCSSettingType type = ccsSettingGetType (v->parent); if (v->isListChild) type = ccsSettingGetInfo (v->parent)->forList.listType; ccsFreeSettingValueCommon (v, type); /* List children cannot be a default value */ if (v->isListChild || v != ccsSettingGetDefaultValue (v->parent)) free (v); } void ccsFreeSettingValueWithType (CCSSettingValue *v, CCSSettingType type) { ccsFreeSettingValueCommon (v, type); free (v); } void ccsFreePluginConflict (CCSPluginConflict * c) { if (!c) return; free (c->value); ccsPluginListFree (c->plugins, FALSE); free (c); } CCSBackendInfo * ccsCopyBackendInfoFromBackend (CCSBackend *backend, const CCSBackendInterface *interface) { const CCSBackendInfo *backendInfo = (*interface->backendGetInfo) (backend); if (!backendInfo) return NULL; CCSBackendInfo *info = calloc (1, sizeof (CCSBackendInfo)); if (!info) return NULL; memcpy (info, backendInfo, sizeof (CCSBackendInfo)); /* This is an abuse here - * in order to minimize code duplication ccsGetBackendInfo returns * const static data, but when we're dealing with the copies we're * dealing with heap allocated memory, since you can't access the * const data in the case that the libraries are not open. * Thus the cast. */ info->name = (const char *) strdup (backendInfo->name); info->shortDesc = (const char *) strdup (backendInfo->shortDesc); info->longDesc = (const char *) strdup (backendInfo->longDesc); return info; } void ccsFreeBackendInfo (CCSBackendInfo *b) { if (b->name) free ((char *) b->name); if (b->shortDesc) free ((char *) b->shortDesc); if (b->longDesc) free ((char *) b->longDesc); free (b); } void ccsFreeIntDesc (CCSIntDesc * i) { if (!i) return; if (i->name) free (i->name); free (i); } void ccsFreeStrRestriction (CCSStrRestriction * r) { if (!r) return; if (r->name) free (r->name); if (r->value) free (r->value); free (r); } void ccsFreeStrExtension (CCSStrExtension *e) { if (!e) return; if (e->basePlugin) free (e->basePlugin); ccsStringListFree (e->baseSettings, TRUE); ccsStrRestrictionListFree (e->restriction, TRUE); free (e); } void ccsFreeString (CCSString *str) { if (str->value) free (str->value); free (str); } CCSREF (String, CCSString) CCSREF (Group, CCSGroup) CCSREF (SubGroup, CCSSubGroup) CCSREF (SettingValue, CCSSettingValue) CCSREF (PluginConflict, CCSPluginConflict) CCSREF (BackendInfo, CCSBackendInfo) CCSREF (IntDesc, CCSIntDesc) CCSREF (StrRestriction, CCSStrRestriction) CCSREF (StrExtension, CCSStrExtension) CCSREF_OBJ (Plugin, CCSPlugin) CCSREF_OBJ (Setting, CCSSetting) CCSREF_OBJ (Backend, CCSBackend) CCSREF_OBJ (DynamicBackend, CCSDynamicBackend) CCSREF_OBJ (Integration, CCSIntegration) CCSREF_OBJ (IntegratedSetting, CCSIntegratedSetting); CCSREF_OBJ (IntegratedSettingInfo, CCSIntegratedSettingInfo); CCSREF_OBJ (IntegratedSettingFactory, CCSIntegratedSettingFactory); CCSREF_OBJ (IntegratedSettingsStorage, CCSIntegratedSettingsStorage); void ccsFreeBackend (CCSBackend *backend) { ccsObjectFinalize (backend); free (backend); } void ccsFreeDynamicBackend (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); ccsBackendFini (dbPrivate->backend); ccsBackendUnref (dbPrivate->backend); if (dbPrivate->dlhand) dlclose (dbPrivate->dlhand); ccsObjectFinalize (backend); free (backend); } CCSBackend * ccsBackendNewWithDynamicInterface (CCSContext *context, const CCSBackendInterface *interface) { CCSBackend *backend = calloc (1, sizeof (CCSBackend)); ccsObjectInit (backend, &ccsDefaultObjectAllocator); ccsBackendRef (backend); ccsObjectAddInterface (backend, (CCSInterface *) interface, GET_INTERFACE_TYPE (CCSBackendInterface)); return backend; } Bool ccsSetBackendDefault (CCSContext * context, char *name) { Bool fallbackMode = FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (cPrivate->backend) { /* no action needed if the backend is the same */ if (strcmp (ccsDynamicBackendGetBackendName (cPrivate->backend), name) == 0) return TRUE; ccsDynamicBackendUnref (cPrivate->backend); cPrivate->backend = NULL; } CCSBackend *backend = ccsBackendLoaderLoadBackend (cPrivate->backendLoader, cPrivate->object_interfaces, context, name); if (!backend) { ccsWarning ("unable to open backend %s, falling back to ini", name); backend = ccsBackendLoaderLoadBackend (cPrivate->backendLoader, cPrivate->object_interfaces, context, "ini"); if (!backend) { ccsError ("failed to open any backends, aborting"); abort (); } fallbackMode = TRUE; } cPrivate->backend = (CCSDynamicBackend *) backend; CCSBackendInitFunc backendInit = (GET_INTERFACE (CCSBackendInterface, cPrivate->backend))->backendInit; if (backendInit) (*backendInit) ((CCSBackend *) cPrivate->backend, context); if (!fallbackMode) ccsConfigFileWriteConfigOption (cPrivate->configFile, OptionBackend, name); return TRUE; } Bool ccsSetBackend (CCSContext *context, char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextSetBackend) (context, name); } CCSIntegratedSetting * ccsIntegrationGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { return (*(GET_INTERFACE (CCSIntegrationInterface, integration))->getIntegratedSetting) (integration, pluginName, settingName); } Bool ccsIntegrationReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { return (*(GET_INTERFACE (CCSIntegrationInterface, integration))->readOptionIntoSetting) (integration, context, setting, integratedSetting); } void ccsIntegrationWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integratedSetting) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->writeSettingIntoOption) (integration, context, setting, integratedSetting); } void ccsIntegrationUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList integratedSettings) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->updateIntegratedSettings) (integration, context, integratedSettings); } void ccsIntegrationDisallowIntegratedWrites (CCSIntegration *integration) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->disallowIntegratedWrites) (integration); } void ccsIntegrationAllowIntegratedWrites (CCSIntegration *integration) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->allowIntegratedWrites) (integration); } void ccsFreeIntegration (CCSIntegration *integration) { (*(GET_INTERFACE (CCSIntegrationInterface, integration))->freeIntegrationBackend) (integration); } static CCSIntegratedSetting * ccsNullIntegrationBackendGetIntegratedSetting (CCSIntegration *integration, const char *pluginName, const char *settingName) { return NULL; } static Bool ccsNullIntegrationBackendReadOptionIntoSetting (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { return FALSE; } static void ccsNullIntegrationBackendWriteSettingIntoOption (CCSIntegration *integration, CCSContext *context, CCSSetting *setting, CCSIntegratedSetting *integrated) { } static void ccsNullIntegrationBackendUpdateIntegratedSettings (CCSIntegration *integration, CCSContext *context, CCSIntegratedSettingList settings) { } void ccsNullIntegrationBackendFree (CCSIntegration *integration) { ccsObjectFinalize (integration); (*integration->object.object_allocation->free_) (integration->object.object_allocation->allocator, integration); } const CCSIntegrationInterface ccsNullIntegrationBackendInterface = { ccsNullIntegrationBackendGetIntegratedSetting, ccsNullIntegrationBackendReadOptionIntoSetting, ccsNullIntegrationBackendWriteSettingIntoOption, ccsNullIntegrationBackendUpdateIntegratedSettings, ccsNullIntegrationBackendFree }; CCSIntegration * ccsNullIntegrationBackendNew (CCSObjectAllocationInterface *ai) { CCSIntegration *integration = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegration)); if (!integration) return NULL; ccsObjectInit (integration, ai); ccsObjectAddInterface (integration, (const CCSInterface *) &ccsNullIntegrationBackendInterface, GET_INTERFACE_TYPE (CCSIntegrationInterface)); return integration; } const CCSBackendInfo * ccsBackendGetInfo (CCSBackend *backend) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->backendGetInfo) (backend); } static Bool ccsDynamicBackendSupportsIntegrationDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend)->integrationSupport; } const char * ccsDynamicBackendGetBackendName (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->getBackendName) (backend); } Bool ccsDynamicBackendSupportsRead (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsRead) (backend); } Bool ccsDynamicBackendSupportsWrite (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsWrite) (backend); } Bool ccsDynamicBackendSupportsProfiles (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsProfiles) (backend); } Bool ccsDynamicBackendSupportsIntegration (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->supportsIntegration) (backend); } CCSBackend * ccsDynamicBackendGetRawBackend (CCSDynamicBackend *backend) { return (*(GET_INTERFACE (CCSDynamicBackendInterface, backend))->getRawBackend) (backend); } Bool ccsBackendHasExecuteEvents (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->executeEvents != NULL; } void ccsBackendExecuteEvents (CCSBackend *backend, unsigned int flags) { (*(GET_INTERFACE (CCSBackendInterface, backend))->executeEvents) (backend, flags); } Bool ccsBackendInit (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->backendInit) (backend, context); } Bool ccsBackendFini (CCSBackend *backend) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->backendFini) (backend); } static Bool ccsBackendHasReadInit (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->readInit != NULL; } Bool ccsBackendReadInit (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->readInit) (backend, context); } static Bool ccsBackendHasReadSetting (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->readSetting != NULL; } void ccsBackendReadSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { (*(GET_INTERFACE (CCSBackendInterface, backend))->readSetting) (backend, context, setting); } static Bool ccsBackendHasReadDone (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->readDone != NULL; } void ccsBackendReadDone (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->readDone) (backend, context); } static Bool ccsBackendHasWriteInit (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->writeInit != NULL; } Bool ccsBackendWriteInit (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->writeInit) (backend, context); } static Bool ccsBackendHasWriteSetting (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->writeSetting != NULL; } void ccsBackendWriteSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { (*(GET_INTERFACE (CCSBackendInterface, backend))->writeSetting) (backend, context, setting); } static Bool ccsBackendHasWriteDone (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->writeDone != NULL; } void ccsBackendWriteDone (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->writeDone) (backend, context); } static Bool ccsBackendHasUpdateSetting (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->updateSetting != NULL; } void ccsBackendUpdateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->updateSetting) (backend, context, plugin, setting); } static Bool ccsBackendHasGetSettingIsIntegrated (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsIntegrated != NULL; } Bool ccsBackendGetSettingIsIntegrated (CCSBackend *backend, CCSSetting *setting) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsIntegrated) (backend, setting); } static Bool ccsBackendHasGetSettingIsReadOnly (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsReadOnly != NULL; } Bool ccsBackendGetSettingIsReadOnly (CCSBackend *backend, CCSSetting *setting) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->getSettingIsReadOnly) (backend, setting); } static Bool ccsBackendHasGetExistingProfiles (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->getExistingProfiles != NULL; } CCSStringList ccsBackendGetExistingProfiles (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->getExistingProfiles) (backend, context); } static Bool ccsBackendHasDeleteProfile (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->deleteProfile != NULL; } Bool ccsBackendDeleteProfile (CCSBackend *backend, CCSContext *context, char *name) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->deleteProfile) (backend, context, name); } static Bool ccsBackendHasSetIntegration (CCSBackend *backend) { return (GET_INTERFACE (CCSBackendInterface, backend))->setIntegration != NULL; } void ccsBackendSetIntegration (CCSBackend *backend, CCSIntegration *integration) { return (*(GET_INTERFACE (CCSBackendInterface, backend))->setIntegration) (backend, integration); } static const char * ccsDynamicBackendGetBackendNameDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend)->name; } static Bool ccsDynamicBackendSupportsReadDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendHasReadSetting (dbPrivate->backend); } static Bool ccsDynamicBackendSupportsWriteDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendHasWriteSetting (dbPrivate->backend); } static Bool ccsDynamicBackendSupportsProfilesDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend)->profileSupport; } static CCSBackend * ccsDynamicBackendGetRawBackendDefault (CCSDynamicBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return dbPrivate->backend; } static const CCSBackendInfo * ccsDynamicBackendGetInfoWrapper (CCSBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendGetInfo (dbPrivate->backend); } static Bool ccsDynamicBackendInitWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendInit (dbPrivate->backend, context); } static Bool ccsDynamicBackendFiniWrapper (CCSBackend *backend) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); return ccsBackendFini (dbPrivate->backend); } static void ccsDynamicBackendExecuteEventsWrapper (CCSBackend *backend, unsigned int flags) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasExecuteEvents (dbPrivate->backend)) ccsBackendExecuteEvents (dbPrivate->backend, flags); } static Bool ccsDynamicBackendReadInitWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasReadInit (dbPrivate->backend)) return ccsBackendReadInit (dbPrivate->backend, context); return TRUE; } static void ccsDynamicBackendReadSettingWrapper (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasReadSetting (dbPrivate->backend)) ccsBackendReadSetting (dbPrivate->backend, context, setting); } static void ccsDynamicBackendReadDoneWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasReadDone (dbPrivate->backend)) ccsBackendReadDone (dbPrivate->backend, context); } static Bool ccsDynamicBackendWriteInitWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasWriteInit (dbPrivate->backend)) return ccsBackendWriteInit (dbPrivate->backend, context); return TRUE; } static void ccsDynamicBackendWriteSettingWrapper (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasWriteSetting (dbPrivate->backend)) ccsBackendWriteSetting (dbPrivate->backend, context, setting); } static void ccsDynamicBackendWriteDoneWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasWriteDone (dbPrivate->backend)) ccsBackendWriteDone (dbPrivate->backend, context); } static void ccsDynamicBackendUpdateSettingWrapper (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasUpdateSetting (dbPrivate->backend)) ccsBackendUpdateSetting (dbPrivate->backend, context, plugin, setting); } static Bool ccsDynamicBackendGetSettingIsIntegratedWrapper (CCSBackend *backend, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasGetSettingIsIntegrated (dbPrivate->backend) && ccsDynamicBackendSupportsIntegration ((CCSDynamicBackend *) backend)) return ccsBackendGetSettingIsIntegrated (dbPrivate->backend, setting); return FALSE; } static Bool ccsDynamicBackendGetSettingIsReadOnlyWrapper (CCSBackend *backend, CCSSetting *setting) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasGetSettingIsReadOnly (dbPrivate->backend)) return ccsBackendGetSettingIsReadOnly (dbPrivate->backend, setting); return FALSE; } static CCSStringList ccsDynamicBackendGetExistingProfilesWrapper (CCSBackend *backend, CCSContext *context) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasGetExistingProfiles (dbPrivate->backend) && ccsDynamicBackendSupportsProfiles ((CCSDynamicBackend *) backend)) return ccsBackendGetExistingProfiles (dbPrivate->backend, context); static CCSStringList sl = NULL; return sl; } static Bool ccsDynamicBackendDeleteProfileWrapper (CCSBackend *backend, CCSContext *context, char *profile) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasDeleteProfile (dbPrivate->backend) && ccsDynamicBackendSupportsProfiles ((CCSDynamicBackend *) backend)) return ccsBackendDeleteProfile (dbPrivate->backend, context, profile); return FALSE; } static void ccsDynamicBackendSetIntegrationWrapper (CCSBackend *backend, CCSIntegration *integration) { CCSDynamicBackendPrivate *dbPrivate = GET_PRIVATE (CCSDynamicBackendPrivate, backend); if (ccsBackendHasSetIntegration (backend) && ccsDynamicBackendSupportsIntegration ((CCSDynamicBackend *) backend)) return ccsBackendSetIntegration (dbPrivate->backend, integration); } Bool ccsCompareLists (CCSSettingValueList l1, CCSSettingValueList l2, CCSSettingListInfo info) { while (l1 && l2) { switch (info.listType) { case TypeInt: if (l1->data->value.asInt != l2->data->value.asInt) return FALSE; break; case TypeBool: { Bool bothTrue = (l1->data->value.asBool && l2->data->value.asBool); Bool bothFalse = (!l1->data->value.asBool && !l2->data->value.asBool); /* Use the boolean operators as TRUE/FALSE can be redefined */ if (!bothTrue && !bothFalse) return FALSE; } break; case TypeFloat: if (l1->data->value.asFloat != l2->data->value.asFloat) return FALSE; break; case TypeString: if (strcmp (l1->data->value.asString, l2->data->value.asString)) return FALSE; break; case TypeMatch: if (strcmp (l1->data->value.asMatch, l2->data->value.asMatch)) return FALSE; break; case TypeKey: if (!ccsIsEqualKey (l1->data->value.asKey, l2->data->value.asKey)) return FALSE; break; case TypeButton: if (!ccsIsEqualButton (l1->data->value.asButton, l2->data->value.asButton)) return FALSE; break; case TypeEdge: if (l1->data->value.asEdge != l2->data->value.asEdge) return FALSE; break; case TypeBell: if (l1->data->value.asBell != l2->data->value.asBell) return FALSE; break; case TypeColor: if (!ccsIsEqualColor (l1->data->value.asColor, l2->data->value.asColor)) return FALSE; break; default: return FALSE; break; } l1 = l1->next; l2 = l2->next; } if ((!l1 && l2) || (l1 && !l2)) return FALSE; return TRUE; } void ccsCopyInfo (const CCSSettingInfo *from, CCSSettingInfo *to, CCSSettingType type) { memcpy (to, from, sizeof (CCSSettingInfo)); switch (type) { case TypeInt: { CCSIntDescList idl = from->forInt.desc; to->forInt = from->forInt; to->forInt.desc = NULL; while (idl) { CCSIntDesc *id = malloc (sizeof (CCSIntDesc)); if (!idl->data) { free (id); idl = idl->next; continue; } memcpy (id, idl->data, sizeof (CCSIntDesc)); id->name = strdup (idl->data->name); id->refCount = 1; to->forInt.desc = ccsIntDescListAppend (to->forInt.desc, id); idl = idl->next; } break; } case TypeFloat: to->forFloat = from->forFloat; break; case TypeString: { CCSStrRestrictionList srl = from->forString.restriction; to->forString = from->forString; to->forString.restriction = NULL; while (srl) { CCSStrRestriction *sr = malloc (sizeof (CCSStrRestriction)); if (!srl->data) { srl = srl->next; free (sr); continue; } memcpy (sr, srl->data, sizeof (CCSStrRestriction)); sr->name = strdup (srl->data->name); sr->value = strdup (srl->data->value); sr->refCount = 1; to->forString.restriction = ccsStrRestrictionListAppend (to->forString.restriction, sr); srl = srl->next; } break; } case TypeList: { if (from->forList.listInfo) { to->forList.listInfo = calloc (1, sizeof (CCSSettingInfo)); ccsCopyInfo (from->forList.listInfo, to->forList.listInfo, from->forList.listType); } break; } case TypeAction: to->forAction.internal = from->forAction.internal; break; default: break; } } static void copyValue (CCSSettingValue * from, CCSSettingValue * to) { memcpy (to, from, sizeof (CCSSettingValue)); CCSSettingType type = ccsSettingGetType (from->parent); if (from->isListChild) type = ccsSettingGetInfo (from->parent)->forList.listType; switch (type) { case TypeString: to->value.asString = strdup (from->value.asString); break; case TypeMatch: to->value.asMatch = strdup (from->value.asMatch); break; case TypeList: to->value.asList = NULL; CCSSettingValueList l = from->value.asList; while (l) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) break; copyValue (l->data, value); value->refCount = 1; to->value.asList = ccsSettingValueListAppend (to->value.asList, value); l = l->next; } break; default: break; } } /* TODO: CCSSetting is not meant to be copyable ... remove */ static void copySetting (CCSSetting *from, CCSSetting *to) { /* Allocate a new private ptr for the new setting */ CCSSettingPrivate *ccsPrivate = calloc (1, sizeof (CCSSettingPrivate)); ccsObjectSetPrivate (to, (CCSPrivate *) ccsPrivate); unsigned int i = 0; /* copy interfaces */ for (; i < from->object.n_interfaces; ++i) ccsObjectAddInterface (to, from->object.interfaces[i], from->object.interface_types[i]); CCSSettingPrivate *fromPrivate = (CCSSettingPrivate *) ccsObjectGetPrivate (from); CCSSettingPrivate *toPrivate = (CCSSettingPrivate *) ccsObjectGetPrivate (to); /* copy from fromPrivate to toPrivate for now, and replace all * fields that should be replaced */ memcpy (toPrivate, fromPrivate, sizeof (CCSSettingPrivate)); if (fromPrivate->name) toPrivate->name = strdup (fromPrivate->name); if (fromPrivate->shortDesc) toPrivate->shortDesc = strdup (fromPrivate->shortDesc); if (fromPrivate->longDesc) toPrivate->longDesc = strdup (fromPrivate->longDesc); if (fromPrivate->group) toPrivate->group = strdup (fromPrivate->group); if (fromPrivate->subGroup) toPrivate->subGroup = strdup (fromPrivate->subGroup); if (fromPrivate->hints) toPrivate->hints = strdup (fromPrivate->hints); if (fromPrivate->value) { toPrivate->value = malloc (sizeof (CCSSettingValue)); if (!fromPrivate->value) return; copyValue (fromPrivate->value, toPrivate->value); toPrivate->value->refCount = 1; toPrivate->value->parent = to; } copyValue (&fromPrivate->defaultValue, &toPrivate->defaultValue); ccsCopyInfo (&fromPrivate->info, &toPrivate->info, fromPrivate->type); toPrivate->defaultValue.parent = to; toPrivate->privatePtr = NULL; ccsSettingRef (to); } static void copyFromDefault (CCSSetting * setting) { CCSSettingValue *value; CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (sPrivate->value != &sPrivate->defaultValue) ccsFreeSettingValue (sPrivate->value); value = calloc (1, sizeof (CCSSettingValue)); if (!value) { sPrivate->value = &sPrivate->defaultValue; sPrivate->isDefault = TRUE; return; } value->refCount = 1; copyValue (&sPrivate->defaultValue, value); sPrivate->value = value; sPrivate->isDefault = FALSE; } void ccsSettingResetToDefaultDefault (CCSSetting * setting, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->value != &sPrivate->defaultValue) { ccsFreeSettingValue (sPrivate->value); if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); } sPrivate->value = &sPrivate->defaultValue; sPrivate->isDefault = TRUE; } Bool ccsCheckValueEq (const CCSSettingValue *rhs, CCSSettingType rhsType, CCSSettingInfo *rhsInfo, const CCSSettingValue *lhs, CCSSettingType lhsType, CCSSettingInfo *lhsInfo) { CCSSettingType type; if (rhsType != lhsType) { ccsWarning ("Attempted to check equality between mismatched types!"); return FALSE; } if (rhs->isListChild) type = rhsInfo->forList.listType; else type = rhsType; switch (type) { case TypeInt: return lhs->value.asInt == rhs->value.asInt; case TypeBool: return lhs->value.asBool == rhs->value.asBool; case TypeFloat: return lhs->value.asFloat == rhs->value.asFloat; case TypeMatch: return strcmp (lhs->value.asMatch, rhs->value.asMatch) == 0; case TypeString: return strcmp (lhs->value.asString, rhs->value.asString) == 0; case TypeColor: return ccsIsEqualColor (lhs->value.asColor, rhs->value.asColor); case TypeKey: return ccsIsEqualKey (lhs->value.asKey, rhs->value.asKey); case TypeButton: return ccsIsEqualButton (lhs->value.asButton, rhs->value.asButton); case TypeEdge: return lhs->value.asEdge == rhs->value.asEdge; case TypeBell: return lhs->value.asBell == rhs->value.asBell; case TypeAction: ccsWarning ("Actions are not comparable!"); return FALSE; case TypeList: { return ccsCompareLists (lhs->value.asList, rhs->value.asList, lhsInfo->forList); } default: break; } ccsWarning ("Failed to check equality for value with type %i", lhsType); return FALSE; } /* FIXME: That's a lot of code for the sake of type switching ... * maybe we need to switch to C++ here and use templates ... */ CCSSetStatus ccsSettingSetIntDefault (CCSSetting * setting, int data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeInt) return SetFailed; if (sPrivate->isDefault && (sPrivate->defaultValue.value.asInt == data)) return SetIsDefault; if (!sPrivate->isDefault && (sPrivate->defaultValue.value.asInt == data)) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (sPrivate->value->value.asInt == data) return SetToSameValue; if ((data < sPrivate->info.forInt.min) || (data > sPrivate->info.forInt.max)) return SetFailed; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asInt = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetFloatDefault (CCSSetting * setting, float data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeFloat) return SetFailed; if (sPrivate->isDefault && (sPrivate->defaultValue.value.asFloat == data)) return SetIsDefault; if (!sPrivate->isDefault && (sPrivate->defaultValue.value.asFloat == data)) { ccsResetToDefault (setting, processChanged); return SetToDefault; } /* allow the values to differ a tiny bit because of possible rounding / precision issues */ if (fabs (sPrivate->value->value.asFloat - data) < 1e-5) return SetToSameValue; if ((data < sPrivate->info.forFloat.min) || (data > sPrivate->info.forFloat.max)) return SetFailed; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asFloat = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetBoolDefault (CCSSetting * setting, Bool data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeBool) return SetFailed; if (sPrivate->isDefault && ((sPrivate->defaultValue.value.asBool && data) || (!sPrivate->defaultValue.value.asBool && !data))) return SetIsDefault; if (!sPrivate->isDefault && ((sPrivate->defaultValue.value.asBool && data) || (!sPrivate->defaultValue.value.asBool && !data))) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if ((sPrivate->value->value.asBool && data) || (!sPrivate->value->value.asBool && !data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asBool = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetStringDefault (CCSSetting * setting, const char *data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeString) return SetFailed; if (!data) return SetFailed; Bool isDefault = strcmp (sPrivate->defaultValue.value.asString, data) == 0; if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (!strcmp (sPrivate->value->value.asString, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); free (sPrivate->value->value.asString); sPrivate->value->value.asString = strdup (data); if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetColorDefault (CCSSetting * setting, CCSSettingColorValue data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeColor) return SetFailed; CCSSettingColorValue defValue = sPrivate->defaultValue.value.asColor; Bool isDefault = ccsIsEqualColor (defValue, data); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (ccsIsEqualColor (sPrivate->value->value.asColor, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asColor = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetMatchDefault (CCSSetting * setting, const char *data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeMatch) return SetFailed; if (!data) return SetFailed; Bool isDefault = strcmp (sPrivate->defaultValue.value.asMatch, data) == 0; if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (!strcmp (sPrivate->value->value.asMatch, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); free (sPrivate->value->value.asMatch); sPrivate->value->value.asMatch = strdup (data); if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetKeyDefault (CCSSetting * setting, CCSSettingKeyValue data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeKey) return SetFailed; CCSSettingKeyValue defValue = sPrivate->defaultValue.value.asKey; Bool isDefault = ccsIsEqualKey (data, defValue); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (ccsIsEqualKey (sPrivate->value->value.asKey, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asKey.keysym = data.keysym; sPrivate->value->value.asKey.keyModMask = data.keyModMask; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetButtonDefault (CCSSetting * setting, CCSSettingButtonValue data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeButton) return SetFailed; CCSSettingButtonValue defValue = sPrivate->defaultValue.value.asButton; Bool isDefault = ccsIsEqualButton (data, defValue); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (ccsIsEqualButton (sPrivate->value->value.asButton, data)) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asButton.button = data.button; sPrivate->value->value.asButton.buttonModMask = data.buttonModMask; sPrivate->value->value.asButton.edgeMask = data.edgeMask; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetEdgeDefault (CCSSetting * setting, unsigned int data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeEdge) return SetFailed; Bool isDefault = (data == sPrivate->defaultValue.value.asEdge); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (sPrivate->value->value.asEdge == data) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asEdge = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetBellDefault (CCSSetting * setting, Bool data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (ccsSettingGetType (setting) != TypeBell) return SetFailed; Bool isDefault = (data == sPrivate->defaultValue.value.asBool); if (sPrivate->isDefault && isDefault) return SetIsDefault; if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } if (sPrivate->value->value.asBell == data) return SetToSameValue; if (sPrivate->isDefault) copyFromDefault (setting); sPrivate->value->value.asBell = data; if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } Bool ccsCopyValueInto (const CCSSettingValue *from, CCSSettingValue *to, CCSSettingType type, CCSSettingInfo *info) { to->parent = from->parent; to->isListChild = from->isListChild; CCSSettingType vType = to->isListChild ? info->forList.listType : type; switch (vType) { case TypeInt: to->value.asInt = from->value.asInt; break; case TypeBool: to->value.asBool = from->value.asBool; break; case TypeFloat: to->value.asFloat = from->value.asFloat; break; case TypeString: to->value.asString = strdup (from->value.asString); break; case TypeMatch: to->value.asMatch = strdup (from->value.asMatch); break; case TypeKey: memcpy (&to->value.asKey, &from->value.asKey, sizeof (CCSSettingKeyValue)); break; case TypeButton: memcpy (&to->value.asButton, &from->value.asButton, sizeof (CCSSettingButtonValue)); break; case TypeEdge: to->value.asEdge = from->value.asEdge; break; case TypeBell: to->value.asBell = from->value.asBell; break; case TypeColor: memcpy (&to->value.asColor, &from->value.asColor, sizeof (CCSSettingColorValue)); break; case TypeList: assert (from->parent != NULL); to->value.asList = ccsCopyList (from->value.asList, from->parent); break; default: ccsError ("unexpected setting type in ccsCopyValueInto"); return FALSE; break; } return TRUE; } CCSSettingValue * ccsCopyValue (const CCSSettingValue *orig, CCSSettingType type, CCSSettingInfo *info) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return NULL; value->refCount = 1; if (!ccsCopyValueInto (orig, value, type, info)) { free (value); return NULL; } return value; } CCSSettingValueList ccsCopyList (CCSSettingValueList l1, CCSSetting * setting) { CCSSettingInfo *info = ccsSettingGetInfo (setting); CCSSettingType type = ccsSettingGetType (setting); CCSSettingValueList l2 = NULL; while (l1) { CCSSettingValue *value = ccsCopyValue (l1->data, type, info); /* FIXME If l2 != NULL, we leak l2 */ if (!value) return l2; l2 = ccsSettingValueListAppend (l2, value); l1 = l1->next; } return l2; } CCSSetStatus ccsSettingSetListDefault (CCSSetting * setting, CCSSettingValueList data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (ccsSettingGetType (setting) != TypeList) return SetFailed; Bool isDefault = ccsCompareLists (sPrivate->defaultValue.value.asList, data, sPrivate->info.forList); /* Don't need to worry about default values * when processChanged is off since use of that * API wants direct access to ths list for * temporary storage */ if (!processChanged) { if (sPrivate->isDefault && isDefault) { return SetIsDefault; } if (!sPrivate->isDefault && isDefault) { ccsResetToDefault (setting, processChanged); return SetToDefault; } } if (ccsCompareLists (sPrivate->value->value.asList, data, sPrivate->info.forList)) { return SetToSameValue; } if (sPrivate->isDefault) copyFromDefault (setting); ccsSettingValueListFree (sPrivate->value->value.asList, TRUE); sPrivate->value->value.asList = ccsCopyList (data, setting); if ((strcmp (sPrivate->name, "active_plugins") == 0) && (strcmp (ccsPluginGetName (sPrivate->parent), "core") == 0) && processChanged) { CCSStringList list; list = ccsGetStringListFromValueList (sPrivate->value->value.asList); ccsSetActivePluginList (ccsPluginGetContext (sPrivate->parent), list); ccsStringListFree (list, TRUE); } if (processChanged) ccsContextAddChangedSetting (ccsPluginGetContext (sPrivate->parent), setting); return SetToNewValue; } CCSSetStatus ccsSettingSetValueDefault (CCSSetting * setting, CCSSettingValue * data, Bool processChanged) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); switch (sPrivate->type) { case TypeInt: return ccsSetInt (setting, data->value.asInt, processChanged); break; case TypeFloat: return ccsSetFloat (setting, data->value.asFloat, processChanged); break; case TypeBool: return ccsSetBool (setting, data->value.asBool, processChanged); break; case TypeColor: return ccsSetColor (setting, data->value.asColor, processChanged); break; case TypeString: return ccsSetString (setting, data->value.asString, processChanged); break; case TypeMatch: return ccsSetMatch (setting, data->value.asMatch, processChanged); break; case TypeKey: return ccsSetKey (setting, data->value.asKey, processChanged); break; case TypeButton: return ccsSetButton (setting, data->value.asButton, processChanged); break; case TypeEdge: return ccsSetEdge (setting, data->value.asEdge, processChanged); break; case TypeBell: return ccsSetBell (setting, data->value.asBell, processChanged); break; case TypeList: return ccsSetList (setting, data->value.asList, processChanged); default: break; } return SetFailed; } Bool ccsSettingGetIntDefault (CCSSetting * setting, int *data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); if (sPrivate->type != TypeInt) return FALSE; *data = sPrivate->value->value.asInt; return TRUE; } Bool ccsSettingGetFloatDefault (CCSSetting * setting, float *data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeFloat) return FALSE; *data = sPrivate->value->value.asFloat; return TRUE; } Bool ccsSettingGetBoolDefault (CCSSetting * setting, Bool * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeBool) return FALSE; *data = sPrivate->value->value.asBool; return TRUE; } Bool ccsSettingGetStringDefault (CCSSetting * setting, const char **data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeString) return FALSE; *data = sPrivate->value->value.asString; return TRUE; } Bool ccsSettingGetColorDefault (CCSSetting * setting, CCSSettingColorValue * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeColor) return TRUE; *data = sPrivate->value->value.asColor; return TRUE; } Bool ccsSettingGetMatchDefault (CCSSetting * setting, const char **data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeMatch) return FALSE; *data = sPrivate->value->value.asMatch; return TRUE; } Bool ccsSettingGetKeyDefault (CCSSetting * setting, CCSSettingKeyValue * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeKey) return FALSE; *data = sPrivate->value->value.asKey; return TRUE; } Bool ccsSettingGetButtonDefault (CCSSetting * setting, CCSSettingButtonValue * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeButton) return FALSE; *data = sPrivate->value->value.asButton; return TRUE; } Bool ccsSettingGetEdgeDefault (CCSSetting * setting, unsigned int * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeEdge) return FALSE; *data = sPrivate->value->value.asEdge; return TRUE; } Bool ccsSettingGetBellDefault (CCSSetting * setting, Bool * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeBell) return FALSE; *data = sPrivate->value->value.asBell; return TRUE; } Bool ccsSettingGetListDefault (CCSSetting * setting, CCSSettingValueList * data) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) if (sPrivate->type != TypeList) return FALSE; *data = sPrivate->value->value.asList; return TRUE; } Bool ccsGetInt (CCSSetting *setting, int *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetInt) (setting, data); } Bool ccsGetFloat (CCSSetting *setting, float *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetFloat) (setting, data); } Bool ccsGetBool (CCSSetting *setting, Bool *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetBool) (setting, data); } Bool ccsGetString (CCSSetting *setting, const char **data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetString) (setting, data); } Bool ccsGetColor (CCSSetting *setting, CCSSettingColorValue *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetColor) (setting, data); } Bool ccsGetMatch (CCSSetting *setting, const char **data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetMatch) (setting, data); } Bool ccsGetKey (CCSSetting *setting, CCSSettingKeyValue *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetKey) (setting, data); } Bool ccsGetButton (CCSSetting *setting, CCSSettingButtonValue *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetButton) (setting, data); } Bool ccsGetEdge (CCSSetting *setting, unsigned int *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetEdge) (setting, data); } Bool ccsGetBell (CCSSetting *setting, Bool *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetBell) (setting, data); } Bool ccsGetList (CCSSetting *setting, CCSSettingValueList *data) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetList) (setting, data); } CCSSetStatus ccsSetInt (CCSSetting *setting, int data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetInt) (setting, data, processChanged); } CCSSetStatus ccsSetFloat (CCSSetting *setting, float data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetFloat) (setting, data, processChanged); } CCSSetStatus ccsSetBool (CCSSetting *setting, Bool data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetBool) (setting, data, processChanged); } CCSSetStatus ccsSetString (CCSSetting *setting, const char *data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetString) (setting, data, processChanged); } CCSSetStatus ccsSetColor (CCSSetting *setting, CCSSettingColorValue data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetColor) (setting, data, processChanged); } CCSSetStatus ccsSetMatch (CCSSetting *setting, const char *data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetMatch) (setting, data, processChanged); } CCSSetStatus ccsSetKey (CCSSetting *setting, CCSSettingKeyValue data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetKey) (setting, data, processChanged); } CCSSetStatus ccsSetButton (CCSSetting *setting, CCSSettingButtonValue data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetButton) (setting, data, processChanged); } CCSSetStatus ccsSetEdge (CCSSetting *setting, unsigned int data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetEdge) (setting, data, processChanged); } CCSSetStatus ccsSetBell (CCSSetting *setting, Bool data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetBell) (setting, data, processChanged); } CCSSetStatus ccsSetList (CCSSetting *setting, CCSSettingValueList data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetList) (setting, data, processChanged); } CCSSetStatus ccsSetValue (CCSSetting *setting, CCSSettingValue *data, Bool processChanged) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetValue) (setting, data, processChanged); } void ccsResetToDefault (CCSSetting * setting, Bool processChanged) { (*(GET_INTERFACE (CCSSettingInterface, setting))->settingResetToDefault) (setting, processChanged); } Bool ccsSettingIsIntegrated (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingIsIntegrated) (setting); } Bool ccsSettingIsReadOnly (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingIsReadOnly) (setting); } Bool ccsSettingIsReadableByBackend (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingIsReadableByBackend) (setting); } void ccsContextDestroy (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (cPrivate->backend) { ccsDynamicBackendUnref (cPrivate->backend); cPrivate->backend = NULL; } ccsFreeContext (context); } CCSPluginList ccsGetActivePluginListDefault (CCSContext * context) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSPluginList rv = NULL; CCSPluginList l = cPrivate->plugins; while (l) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, l->data); if (pPrivate->active && strcmp (ccsPluginGetName (l->data), "ccp")) { rv = ccsPluginListAppend (rv, l->data); } l = l->next; } return rv; } CCSPluginList ccsGetActivePluginList (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetActivePluginList) (context); } static CCSPlugin * findPluginInList (CCSPluginList list, char *name) { if (!name || !strlen (name)) return NULL; while (list) { if (!strcmp (ccsPluginGetName (list->data), name)) return list->data; list = list->next; } return NULL; } typedef struct _PluginSortHelper { CCSPlugin *plugin; CCSPluginList after; } PluginSortHelper; static int PluginCompare (const void *_a, const void *_b) { const PluginSortHelper *a = _a; const PluginSortHelper *b = _b; return strcmp (ccsPluginGetName (a->plugin), ccsPluginGetName (b->plugin)); } CCSStringList ccsGetSortedPluginStringListDefault (CCSContext * context) { CCSPluginList ap = ccsGetActivePluginList (context); CCSPluginList list; CCSPlugin *p = NULL; CCSString *strCore = calloc (1, sizeof (CCSString)); strCore->value = strdup ("core"); strCore->refCount = 1; CCSStringList rv = ccsStringListAppend (NULL, strCore); PluginSortHelper *ph = NULL; p = findPluginInList (ap, "core"); if (p) ap = ccsPluginListRemove (ap, p, FALSE); int len = ccsPluginListLength (ap); if (len == 0) { ccsStringListFree (rv, TRUE); return NULL; } int i, j; /* TODO: conflict handling */ PluginSortHelper *plugins = calloc (1, len * sizeof (PluginSortHelper)); if (!plugins) { ccsStringListFree (rv, TRUE); return NULL; } for (i = 0, list = ap; i < len; i++, list = list->next) { plugins[i].plugin = list->data; plugins[i].after = NULL; } /* Sort alphabetically first, to get a stable order. */ qsort (plugins, len, sizeof (PluginSortHelper), PluginCompare); for (i = 0; i < len; ++i) { CCSStringList l = ccsPluginGetLoadAfter (plugins[i].plugin); while (l) { p = findPluginInList (ap, ((CCSString *)l->data)->value); if (p && !ccsPluginListFind (plugins[i].after, p)) plugins[i].after = ccsPluginListAppend (plugins[i].after, p); l = l->next; } l = ccsPluginGetRequiresPlugins (plugins[i].plugin); while (l) { Bool found = FALSE; p = findPluginInList (ap, ((CCSString *)l->data)->value); CCSStringList l2 = ccsPluginGetLoadBefore (plugins[i].plugin); while (l2) { if (strcmp (((CCSString *)l2->data)->value, ((CCSString *)l->data)->value) == 0) found = TRUE; l2 = l2->next; } if (p && !ccsPluginListFind (plugins[i].after, p) && !found) plugins[i].after = ccsPluginListAppend (plugins[i].after, p); l = l->next; } l = ccsPluginGetLoadBefore (plugins[i].plugin); while (l) { p = findPluginInList (ap, ((CCSString *)l->data)->value); if (p) { ph = NULL; for (j = 0; j < len; ++j) if (p == plugins[j].plugin) ph = &plugins[j]; if (ph && !ccsPluginListFind (ph->after, plugins[i].plugin)) ph->after = ccsPluginListAppend (ph->after, plugins[i].plugin); } l = l->next; } } ccsPluginListFree (ap, FALSE); Bool error = FALSE; int removed = 0; Bool found; while (!error && removed < len) { found = FALSE; for (i = 0; i < len; ++i) { CCSString *strPluginName; if (!plugins[i].plugin) continue; if (plugins[i].after) continue; /* This is a special case to ensure that bench is the last plugin */ if (len - removed > 1 && strcmp (ccsPluginGetName (plugins[i].plugin), "bench") == 0) continue; found = TRUE; ++removed; p = plugins[i].plugin; plugins[i].plugin = NULL; for (j = 0; j < len; ++j) plugins[j].after = ccsPluginListRemove (plugins[j].after, p, FALSE); strPluginName = calloc (1, sizeof (CCSString)); strPluginName->value = strdup (ccsPluginGetName (p)); strPluginName->refCount = 1; rv = ccsStringListAppend (rv, strPluginName); } if (!found) error = TRUE; } if (error) { ccsError ("Unable to generate sorted plugin list"); for (i = 0; i < len; ++i) { ccsPluginListFree (plugins[i].after, FALSE); } ccsStringListFree (rv, TRUE); rv = NULL; } free (plugins); return rv; } CCSStringList ccsGetSortedPluginStringList (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetSortedPluginStringList) (context); } const char * ccsGetBackendDefault (CCSContext * context) { if (!context) return NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return NULL; return ccsDynamicBackendGetBackendName (cPrivate->backend); } const char * ccsGetBackend (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetBackend) (context); } Bool ccsGetIntegrationEnabledDefault (CCSContext * context) { if (!context) return FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->deIntegration; } Bool ccsGetIntegrationEnabled (CCSContext *context) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetIntegrationEnabled) (context); } const char * ccsGetProfileDefault (CCSContext * context) { if (!context) return NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->profile; } const char * ccsGetProfile (CCSContext *context) { if (!context) return NULL; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetProfile) (context); } Bool ccsGetPluginListAutoSortDefault (CCSContext * context) { if (!context) return FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); return cPrivate->pluginListAutoSort; } Bool ccsGetPluginListAutoSort (CCSContext *context) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetPluginListAutoSort) (context); } void ccsSetIntegrationEnabledDefault (CCSContext * context, Bool value) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* no action required if nothing changed */ if ((!cPrivate->deIntegration && !value) || (cPrivate->deIntegration && value)) return; cPrivate->deIntegration = value; ccsConfigFileWriteConfigOption (cPrivate->configFile, OptionIntegration, (value) ? "true" : "false"); } void ccsSetIntegrationEnabled (CCSContext *context, Bool value) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetIntegrationEnabled) (context, value); } static void ccsWriteAutoSortedPluginList (CCSContext *context) { CCSStringList list; CCSPlugin *p; list = ccsGetSortedPluginStringList (context); p = ccsFindPlugin (context, "core"); if (p) { CCSSetting *s; s = ccsFindSetting (p, "active_plugins"); if (s) { CCSSettingValueList vl; vl = ccsGetValueListFromStringList (list, s); ccsSetList (s, vl, TRUE); ccsSettingValueListFree (vl, TRUE); ccsWriteChangedSettings (context); } } ccsStringListFree (list, TRUE); } void ccsSetPluginListAutoSortDefault (CCSContext * context, Bool value) { CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* no action required if nothing changed */ if ((!cPrivate->pluginListAutoSort && !value) || (cPrivate->pluginListAutoSort && value)) return; cPrivate->pluginListAutoSort = value; ccsConfigFileWriteConfigOption (cPrivate->configFile,OptionAutoSort, (value) ? "true" : "false"); if (value) ccsWriteAutoSortedPluginList (context); } void ccsSetPluginListAutoSort (CCSContext *context, Bool value) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetPluginListAutoSort) (context, value); } void ccsSetProfileDefault (CCSContext * context, const char *name) { const char *globalProfileDir = SYSCONFDIR "/compizconfig"; CCSStringList availableInBackend = NULL; CCSStringList availableInSysconfDir = NULL; if (!name) name = ""; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* no action required if profile stays the same */ if (cPrivate->profile && (strcmp (cPrivate->profile, name) == 0)) return; /* Check what profiles are available before changing it so that we * know what the backends need to know */ if (cPrivate->backend && cPrivate->scanForProfiles) { availableInSysconfDir = (*cPrivate->scanForProfiles) (globalProfileDir); availableInBackend = ccsBackendGetExistingProfiles ((CCSBackend *) cPrivate->backend, context); } if (cPrivate->profile) free (cPrivate->profile); cPrivate->profile = strdup (name); /* We may need to force-import this profile. Have a look * in SYSCONFDIR/compizconfig/ for profiles with this name * and see if the backend knows about it. If the backend * doesn't know about it, then we'll need to force import * it if available */ char *importProfileName = NULL; if (availableInSysconfDir) { CCSStringList sysconfProfile = availableInSysconfDir; while (sysconfProfile) { char *sysconfProfileFullCopy; char *sysconfProfileFull = sysconfProfileFullCopy = strdup (sysconfProfile->data->value); char *sysconfProfileBasename = basename (sysconfProfileFullCopy); char *sysconfProfileBase = NULL; /* No preceeding path */ if (!strlen (sysconfProfileBasename)) sysconfProfileBasename = sysconfProfileFullCopy; if (strstr (sysconfProfileBasename, ".ini")) sysconfProfileBase = strndup (sysconfProfileBasename, strlen (sysconfProfileBasename) - 4); else if (strstr (sysconfProfileBasename, ".profile")) sysconfProfileBase = strndup (sysconfProfileBasename, strlen (sysconfProfileBasename) - 8); else sysconfProfileBase = strdup (sysconfProfileBasename); /* We found this profile in SYSCONFDIR. We will need to import * it if it is not also available in the backend */ if (strcmp (sysconfProfileBase, cPrivate->profile) == 0) { importProfileName = strdup (sysconfProfileBasename); CCSStringList backendProfile = availableInBackend; while (backendProfile) { if (strcmp (sysconfProfileBase, backendProfile->data->value) == 0) { free (importProfileName); importProfileName = NULL; break; } backendProfile = backendProfile->next; } free (sysconfProfileFull); free (sysconfProfileBase); break; } free (sysconfProfileFull); free (sysconfProfileBase); sysconfProfile = sysconfProfile->next; } if (importProfileName) { /* Add path */ size_t importProfilePathLength = strlen (importProfileName) + strlen (globalProfileDir) + 2; char *importProfilePath = calloc (1, sizeof (char) * importProfilePathLength); snprintf (importProfilePath, importProfilePathLength, "%s/%s", globalProfileDir, importProfileName); (*cPrivate->importFromFile) (context, importProfilePath, TRUE); free (importProfilePath); free (importProfileName); } } if (availableInSysconfDir) ccsStringListFree (availableInSysconfDir, TRUE); if (availableInBackend) ccsStringListFree (availableInBackend, TRUE); ccsConfigFileWriteConfigOption (cPrivate->configFile, OptionProfile, cPrivate->profile); } void ccsSetProfile (CCSContext *context, const char *name) { (*(GET_INTERFACE (CCSContextInterface, context))->contextSetProfile) (context, name); } void ccsProcessEventsDefault (CCSContext * context, unsigned int flags) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); ccsCheckFileWatches (); if (cPrivate->backend) ccsBackendExecuteEvents ((CCSBackend *) cPrivate->backend, flags); } void ccsProcessEvents (CCSContext *context, unsigned int flags) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextProcessEvents) (context, flags); } void ccsReadSettingsDefault (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsRead (cPrivate->backend)) return; if (!ccsBackendReadInit ((CCSBackend *) cPrivate->backend, context)) return; CCSPluginList pl = cPrivate->plugins; while (pl) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, pl->data); CCSSettingList sl = pPrivate->settings; while (sl) { ccsBackendReadSetting ((CCSBackend *) cPrivate->backend, context, sl->data); sl = sl->next; } pl = pl->next; } ccsBackendReadDone ((CCSBackend *) cPrivate->backend, context); } void ccsReadSettings (CCSContext *context) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextReadSettings) (context); } void ccsReadPluginSettingsDefault (CCSPlugin * plugin) { if (!plugin || !ccsPluginGetContext (plugin)) return; CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsRead (cPrivate->backend)) return; if (!ccsBackendReadInit ((CCSBackend *) cPrivate->backend, ccsPluginGetContext (plugin))) return; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); CCSSettingList sl = pPrivate->settings; while (sl) { ccsBackendReadSetting ((CCSBackend *) cPrivate->backend, ccsPluginGetContext (plugin), sl->data); sl = sl->next; } ccsBackendReadDone ((CCSBackend *) cPrivate->backend, ccsPluginGetContext (plugin)); } void ccsReadPluginSettings (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginReadPluginSettings) (plugin); } void ccsWriteSettingsDefault (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsWrite (cPrivate->backend)) return; if (!ccsBackendWriteInit ((CCSBackend *) cPrivate->backend, context)) return; CCSPluginList pl = cPrivate->plugins; while (pl) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, pl->data); CCSSettingList sl = pPrivate->settings; while (sl) { ccsBackendWriteSetting ((CCSBackend *) cPrivate->backend, context, sl->data); sl = sl->next; } pl = pl->next; } ccsBackendWriteDone ((CCSBackend *) cPrivate->backend, context); cPrivate->changedSettings = ccsSettingListFree (cPrivate->changedSettings, FALSE); } void ccsWriteSettings (CCSContext *context) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextWriteSettings) (context); } void ccsWriteChangedSettingsDefault (CCSContext * context) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsWrite (cPrivate->backend)) return; if (!ccsBackendWriteInit ((CCSBackend *) cPrivate->backend, context)) return; /* We must immediately steal the changed settings list * if we recurse into this function */ CCSSettingList changedSettings = ccsContextStealChangedSettings (context); if (ccsSettingListLength (changedSettings)) { CCSSettingList l = changedSettings; while (l) { ccsBackendWriteSetting ((CCSBackend *) cPrivate->backend, context, l->data); l = l->next; } } ccsBackendWriteDone ((CCSBackend *) cPrivate->backend,context); ccsSettingListFree (changedSettings, FALSE); } void ccsWriteChangedSettings (CCSContext *context) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextWriteChangedSettings) (context); } Bool ccsIsEqualColor (CCSSettingColorValue c1, CCSSettingColorValue c2) { if (c1.color.red == c2.color.red && c1.color.green == c2.color.green && c1.color.blue == c2.color.blue && c1.color.alpha == c2.color.alpha) { return TRUE; } return FALSE; } Bool ccsIsEqualKey (CCSSettingKeyValue c1, CCSSettingKeyValue c2) { if (c1.keysym == c2.keysym && c1.keyModMask == c2.keyModMask) return TRUE; return FALSE; } Bool ccsIsEqualButton (CCSSettingButtonValue c1, CCSSettingButtonValue c2) { if (c1.button == c2.button && c1.buttonModMask == c2.buttonModMask && c1.edgeMask == c2.edgeMask) return TRUE; return FALSE; } Bool ccsPluginSetActive (CCSPlugin * plugin, Bool value) { if (!plugin) return FALSE; CCSContext *context = ccsPluginGetContext (plugin); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); pPrivate->active = value; if (cPrivate->pluginListAutoSort) ccsWriteAutoSortedPluginList (ccsPluginGetContext (plugin)); return TRUE; } CCSPluginConflictList ccsCanEnablePluginDefault (CCSContext * context, CCSPlugin * plugin) { CCSPluginConflictList list = NULL; CCSPluginList pl, pl2; CCSStringList sl; /* look if the plugin to be loaded requires a plugin not present */ sl = ccsPluginGetRequiresPlugins (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); while (sl) { if (!ccsFindPlugin (context, ((CCSString *)sl->data)->value)) { CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictPluginError; conflict->plugins = NULL; list = ccsPluginConflictListAppend (list, conflict); } } else if (!ccsPluginIsActive (context, ((CCSString *)sl->data)->value)) { /* we've not seen a matching plugin */ CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictRequiresPlugin; conflict->plugins = ccsPluginListAppend (conflict->plugins, ccsFindPlugin (context, ((CCSString *)sl->data)->value)); list = ccsPluginConflictListAppend (list, conflict); } } sl = sl->next; } /* look if the new plugin wants a non-present feature */ sl = ccsPluginGetRequiresFeatures (plugin); while (sl) { pl = cPrivate->plugins; pl2 = NULL; while (pl) { CCSStringList featureList = ccsPluginGetProvidesFeatures (pl->data); while (featureList) { if (strcmp (((CCSString *) sl->data)->value, ((CCSString *)featureList->data)->value) == 0) { pl2 = ccsPluginListAppend (pl2, pl->data); break; } featureList = featureList->next; } pl = pl->next; } pl = pl2; while (pl) { if (ccsPluginIsActive (context, ccsPluginGetName (pl->data))) { ccsPluginListFree (pl2, FALSE); break; } pl = pl->next; } if (!pl) { /* no plugin provides that feature */ CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictRequiresFeature; conflict->plugins = pl2; list = ccsPluginConflictListAppend (list, conflict); } } sl = sl->next; } /* look if another plugin provides the same feature */ sl = ccsPluginGetProvidesFeatures (plugin); while (sl) { pl = cPrivate->plugins; CCSPluginConflict *conflict = NULL; while (pl) { if (ccsPluginIsActive (context, ccsPluginGetName (pl->data))) { CCSStringList featureList = ccsPluginGetProvidesFeatures (pl->data); while (featureList) { if (strcmp (((CCSString *)sl->data)->value, ((CCSString *)featureList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictFeature; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); } featureList = featureList->next; } } pl = pl->next; } if (conflict) list = ccsPluginConflictListAppend (list, conflict); sl = sl->next; } /* look if another plugin provides a conflicting feature*/ sl = ccsPluginGetProvidesFeatures (plugin); while (sl) { pl = cPrivate->plugins; CCSPluginConflict *conflict = NULL; while (pl) { if (ccsPluginIsActive (context, ccsPluginGetName (pl->data))) { CCSStringList featureList = ccsPluginGetProvidesFeatures (pl->data); while (featureList) { if (strcmp (((CCSString *)sl->data)->value, ((CCSString *)featureList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictFeature; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); } featureList = featureList->next; } } pl = pl->next; } if (conflict) list = ccsPluginConflictListAppend (list, conflict); sl = sl->next; } /* look if the plugin to be loaded conflict with a loaded plugin */ sl = ccsPluginGetConflictPlugins (plugin); while (sl) { if (ccsPluginIsActive (context, ((CCSString *)sl->data)->value)) { CCSPluginConflict *conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictPlugin; conflict->plugins = ccsPluginListAppend (conflict->plugins, ccsFindPlugin (context, ((CCSString *)sl->data)->value)); list = ccsPluginConflictListAppend (list, conflict); } } sl = sl->next; } return list; } CCSPluginConflictList ccsCanEnablePlugin (CCSContext *context, CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextCanEnablePlugin) (context, plugin); } CCSPluginConflictList ccsCanDisablePluginDefault (CCSContext * context, CCSPlugin * plugin) { CCSPluginConflictList list = NULL; CCSPluginConflict *conflict = NULL; CCSPluginList pl; CCSStringList sl; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); /* look if the plugin to be unloaded is required by another plugin */ pl = cPrivate->plugins; for (; pl; pl = pl->next) { CCSStringList pluginList; if (pl->data == plugin) continue; if (!ccsPluginIsActive (context, ccsPluginGetName (pl->data))) continue; pluginList = ccsPluginGetRequiresPlugins (pl->data); while (pluginList) { if (strcmp (ccsPluginGetName (plugin), ((CCSString *)pluginList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); conflict->refCount = 1; if (conflict) { conflict->value = strdup (ccsPluginGetName (plugin)); conflict->type = ConflictPluginNeeded; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); break; } pluginList = pluginList->next; } } if (conflict) { list = ccsPluginConflictListAppend (list, conflict); conflict = NULL; } /* look if a feature provided is required by another plugin */ sl = ccsPluginGetProvidesFeatures (plugin); while (sl) { pl = cPrivate->plugins; for (; pl; pl = pl->next) { CCSStringList pluginList; if (pl->data == plugin) continue; if (!ccsPluginIsActive (context, ccsPluginGetName (pl->data))) continue; pluginList = ccsPluginGetRequiresFeatures (pl->data); while (pluginList) { if (strcmp (((CCSString *)sl->data)->value, ((CCSString *)pluginList->data)->value) == 0) { if (!conflict) { conflict = calloc (1, sizeof (CCSPluginConflict)); if (conflict) { conflict->refCount = 1; conflict->value = strdup (((CCSString *)sl->data)->value); conflict->type = ConflictFeatureNeeded; } } if (conflict) conflict->plugins = ccsPluginListAppend (conflict->plugins, pl->data); } pluginList = pluginList->next; } } if (conflict) list = ccsPluginConflictListAppend (list, conflict); conflict = NULL; sl = sl->next; } return list; } CCSPluginConflictList ccsCanDisablePlugin (CCSContext *context, CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextCanDisablePlugin) (context, plugin); } CCSStringList ccsGetExistingProfilesDefault (CCSContext * context) { if (!context) return NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return NULL; if (ccsDynamicBackendSupportsProfiles (cPrivate->backend)) return ccsBackendGetExistingProfiles ((CCSBackend *) cPrivate->backend, context); return NULL; } CCSStringList ccsGetExistingProfiles (CCSContext *context) { if (!context) return NULL; return (*(GET_INTERFACE (CCSContextInterface, context))->contextGetExistingProfiles) (context); } void ccsDeleteProfileDefault (CCSContext * context, char *name) { if (!context) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return; if (!ccsDynamicBackendSupportsProfiles (cPrivate->backend)) return; /* never ever delete default profile */ if (!name || !strlen (name)) return; /* if the current profile should be deleted, switch to default profile first */ if (strcmp (cPrivate->profile, name) == 0) ccsSetProfile (context, ""); ccsBackendDeleteProfile ((CCSBackend *) cPrivate->backend, context, name); } void ccsDeleteProfile (CCSContext *context, char *name) { if (!context) return; (*(GET_INTERFACE (CCSContextInterface, context))->contextDeleteProfile) (context, name); } static void addBackendInfo (CCSBackendInfoList * bl, char *file) { void *dlhand = NULL; char *err = NULL; Bool found = FALSE; dlerror (); dlhand = dlopen (file, RTLD_LAZY | RTLD_LOCAL); err = dlerror (); if (err || !dlhand) return; BackendGetInfoProc getInfo = dlsym (dlhand, "getBackendInfo"); if (!getInfo) { dlclose (dlhand); return; } CCSBackendInterface *vt = getInfo (); if (!vt) { dlclose (dlhand); return; } CCSBackendInfo *info = ccsCopyBackendInfoFromBackend (NULL, vt); if (!info) { dlclose (dlhand); return; } CCSBackendInfoList l = *bl; while (l) { if (!strcmp (l->data->name, info->name)) { found = TRUE; break; } l = l->next; } if (found) { dlclose (dlhand); return; } *bl = ccsBackendInfoListAppend (*bl, info); dlclose (dlhand); } static int backendNameFilter (const struct dirent *name) { int length = strlen (name->d_name); if (length < 7) return 0; if (strncmp (name->d_name, "lib", 3) || strncmp (name->d_name + length - 3, ".so", 3)) return 0; return 1; } static void getBackendInfoFromDir (CCSBackendInfoList * bl, char *path, const char *currentBackend) { struct dirent **nameList; int nFile, i; if (!path) return; nFile = scandir (path, &nameList, backendNameFilter, NULL); if (nFile <= 0) return; for (i = 0; i < nFile; ++i) { if (strncmp (currentBackend, &(nameList[i]->d_name[3]), strlen (currentBackend)) == 0) continue; char file[1024]; sprintf (file, "%s/%s", path, nameList[i]->d_name); addBackendInfo (bl, file); free (nameList[i]); } free (nameList); } CCSBackendInfoList ccsGetExistingBackends (CCSContext *context) { CCSBackendInfoList rv = NULL; const char *home = getenv ("HOME"); const char *overrideBackend = getenv ("LIBCOMPIZCONFIG_BACKEND_PATH"); char *backenddir; const char *currentBackend = ccsGetBackend (context); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); const CCSBackendInterface *currentBackendInterface = GET_INTERFACE (CCSBackendInterface, cPrivate->backend); rv = ccsBackendInfoListAppend (rv, ccsCopyBackendInfoFromBackend ((CCSBackend *) cPrivate->backend, currentBackendInterface)); if (overrideBackend && strlen (overrideBackend)) { if (asprintf (&backenddir, "%s", overrideBackend) == -1) backenddir = NULL; if (backenddir) { getBackendInfoFromDir (&rv, backenddir, currentBackend); free (backenddir); } } else { if (home && strlen (home)) { if (asprintf (&backenddir, "%s/.compizconfig/backends", home) == -1) backenddir = NULL; if (backenddir) { getBackendInfoFromDir (&rv, backenddir, currentBackend); free (backenddir); } } if (asprintf (&backenddir, "%s/compizconfig/backends", LIBDIR) == -1) backenddir = NULL; if (backenddir) { getBackendInfoFromDir (&rv, backenddir, currentBackend); free (backenddir); } } return rv; } Bool ccsExportToFileDefault (CCSContext *context, const char *fileName, Bool skipDefaults) { IniDictionary *exportFile; CCSPluginList p; CCSSettingList s; CCSPlugin *plugin; CCSSetting *setting; char *keyName; exportFile = ccsIniNew (); if (!exportFile) return FALSE; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); for (p = cPrivate->plugins; p; p = p->next) { plugin = p->data; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); for (s = pPrivate->settings; s; s = s->next) { setting = s->data; if (skipDefaults && ccsSettingGetIsDefault (setting)) continue; if (asprintf (&keyName, "s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) return FALSE; switch (ccsSettingGetType (setting)) { case TypeBool: ccsIniSetBool (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asBool); break; case TypeInt: ccsIniSetInt (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asInt); break; case TypeFloat: ccsIniSetFloat (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asFloat); break; case TypeString: ccsIniSetString (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asString); break; case TypeKey: ccsIniSetKey (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asKey); break; case TypeButton: ccsIniSetButton (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asButton); break; case TypeEdge: ccsIniSetEdge (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asEdge); break; case TypeBell: ccsIniSetBell (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asBell); break; case TypeColor: ccsIniSetColor (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asColor); break; case TypeMatch: ccsIniSetString (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asMatch); break; case TypeList: ccsIniSetList (exportFile, ccsPluginGetName (plugin), keyName, ccsSettingGetValue (setting)->value.asList, ccsSettingGetInfo (setting)->forList.listType); break; default: break; } free (keyName); } } ccsIniSave (exportFile, fileName); ccsIniClose (exportFile); return TRUE; } Bool ccsExportToFile (CCSContext *context, const char *fileName, Bool skipDefaults) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextExportToFile) (context, fileName, skipDefaults); } /* + with a value will attempt to append or overwrite that value if there is no - * - with a value will attempt to clear any value set to that to the default * if there is no + * - with a value and + with a value will replace one with the other * - without a value and + with a value will ensure that + overwrites the setting */ static Bool ccsProcessSettingPlus (IniDictionary *dict, CCSContext *context, CCSSettingsUpgrade *upgrade, CCSSetting *setting) { char *keyName = NULL; char *sectionName = strdup (ccsPluginGetName (ccsSettingGetParent (setting))); char *iniValue = NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (asprintf (&keyName, "+s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) { free (sectionName); return FALSE; } if (ccsIniGetString (dict, sectionName, keyName, &iniValue)) { CCSSetting *newSetting = malloc (sizeof (CCSSetting)); if (!newSetting) { free (sectionName); free (keyName); free (iniValue); return FALSE; } ccsObjectInit (newSetting, &ccsDefaultObjectAllocator); copySetting (setting, newSetting); switch (ccsSettingGetType (newSetting)) { case TypeInt: { int value; ccsIniParseInt (iniValue, &value); ccsSetInt (newSetting, value, FALSE); break; } case TypeBool: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBool (newSetting, value, FALSE); break; } case TypeFloat: { float value; ccsIniParseFloat (iniValue, &value); ccsSetFloat (newSetting, value, FALSE); break; } case TypeString: { char *value; ccsIniParseString (iniValue, &value); ccsSetString (newSetting, value, FALSE); free (value); break; } case TypeColor: { CCSSettingColorValue value; ccsIniParseColor (iniValue, &value); ccsSetColor (newSetting, value, FALSE); break; } case TypeKey: { CCSSettingKeyValue value; ccsIniParseKey (iniValue, &value); ccsSetKey (newSetting, value, FALSE); break; } case TypeButton: { CCSSettingButtonValue value; ccsIniParseButton (iniValue, &value); ccsSetButton (newSetting, value, FALSE); break; } case TypeEdge: { unsigned int value; ccsIniParseEdge (iniValue, &value); ccsSetEdge (newSetting, value, FALSE); break; } case TypeBell: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBell (newSetting, value, FALSE); break; } case TypeMatch: { char *value; ccsIniParseString (iniValue, &value); ccsSetMatch (newSetting, value, FALSE); free (value); break; } case TypeList: { CCSSettingValueList value; ccsIniParseList (iniValue, &value, newSetting); ccsSetList (newSetting, value, FALSE); ccsSettingValueListFree (value, TRUE); break; } case TypeAction: default: { free (newSetting); free (sectionName); free (keyName); free (iniValue); return FALSE; } } CCSSettingList listIter = upgrade->clearValueSettings; while (listIter) { CCSSetting *s = (CCSSetting *) listIter->data; if (strcmp (ccsSettingGetName (s), ccsSettingGetName (newSetting)) == 0) { upgrade->replaceToValueSettings = ccsSettingListAppend (upgrade->replaceToValueSettings, (void *) newSetting); upgrade->replaceFromValueSettings = ccsSettingListAppend (upgrade->replaceFromValueSettings, (void *) s); upgrade->clearValueSettings = ccsSettingListRemove (upgrade->clearValueSettings, (void *) s, FALSE); break; } listIter = listIter->next; } if (!listIter) upgrade->addValueSettings = ccsSettingListAppend (upgrade->addValueSettings, (void *) newSetting); free (keyName); free (sectionName); free (iniValue); return TRUE; } free (keyName); free (sectionName); free (iniValue); return FALSE; } static Bool ccsProcessSettingMinus (IniDictionary *dict, CCSContext *context, CCSSettingsUpgrade *upgrade, CCSSetting *setting) { char *keyName = NULL; char *sectionName = strdup (ccsPluginGetName (ccsSettingGetParent (setting))); char *iniValue = NULL; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (asprintf (&keyName, "-s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) { free (sectionName); return FALSE; } if (ccsIniGetString (dict, sectionName, keyName, &iniValue)) { CCSSetting *newSetting = malloc (sizeof (CCSSetting)); if (!newSetting) { free (sectionName); free (keyName); free (iniValue); return FALSE; } ccsObjectInit (newSetting, &ccsDefaultObjectAllocator); copySetting (setting, newSetting); switch (ccsSettingGetType (newSetting)) { case TypeInt: { int value; ccsIniParseInt (iniValue, &value); ccsSetInt (newSetting, value, FALSE); break; } case TypeBool: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBool (newSetting, value, FALSE); break; } case TypeFloat: { float value; ccsIniParseFloat (iniValue, &value); ccsSetFloat (newSetting, value, FALSE); break; } case TypeString: { char *value; ccsIniParseString (iniValue, &value); ccsSetString (newSetting, value, FALSE); free (value); break; } case TypeColor: { CCSSettingColorValue value; ccsIniParseColor (iniValue, &value); ccsSetColor (newSetting, value, FALSE); break; } case TypeKey: { CCSSettingKeyValue value; ccsIniParseKey (iniValue, &value); ccsSetKey (newSetting, value, FALSE); break; } case TypeButton: { CCSSettingButtonValue value; ccsIniParseButton (iniValue, &value); ccsSetButton (newSetting, value, FALSE); break; } case TypeEdge: { unsigned int value; ccsIniParseEdge (iniValue, &value); ccsSetEdge (newSetting, value, FALSE); break; } case TypeBell: { Bool value; ccsIniParseBool (iniValue, &value); ccsSetBell (newSetting, value, FALSE); break; } case TypeMatch: { char *value; ccsIniParseString (iniValue, &value); ccsSetMatch (newSetting, value, FALSE); free (value); break; } case TypeList: { CCSSettingValueList value; ccsIniParseList (iniValue, &value, newSetting); ccsSetList (newSetting, value, FALSE); ccsSettingValueListFree (value, TRUE); break; } case TypeAction: default: { free (newSetting); free (sectionName); free (keyName); free (iniValue); return FALSE; } } CCSSettingList listIter = upgrade->addValueSettings; while (listIter) { CCSSetting *s = (CCSSetting *) listIter->data; if (strcmp (ccsSettingGetName (s), ccsSettingGetName (newSetting)) == 0) { upgrade->replaceFromValueSettings = ccsSettingListAppend (upgrade->replaceFromValueSettings, (void *) newSetting); upgrade->replaceToValueSettings = ccsSettingListAppend (upgrade->replaceToValueSettings, (void *) s); upgrade->addValueSettings = ccsSettingListRemove (upgrade->addValueSettings, (void *) s, FALSE); break; } listIter = listIter->next; } if (!listIter) upgrade->clearValueSettings = ccsSettingListAppend (upgrade->clearValueSettings, (void *) newSetting); free (keyName); free (sectionName); free (iniValue); return TRUE; } free (keyName); free (sectionName); free (iniValue); return FALSE; } void ccsCollectSettingsToUpgrade (CCSContext *context, IniDictionary *dict, CCSSettingsUpgrade *upgrade) { CCSPluginList pl = ccsContextGetPlugins (context); while (pl) { CCSPlugin *plugin = (CCSPlugin *) pl->data; CCSSettingList sl = ccsGetPluginSettings (plugin); while (sl) { CCSSetting *setting = sl->data; ccsProcessSettingMinus (dict, context, upgrade, setting); ccsProcessSettingPlus (dict, context, upgrade, setting); sl = sl->next; } pl = pl->next; } } Bool ccsProcessUpgrade (CCSContext *context, CCSSettingsUpgrade *upgrade) { IniDictionary *dict = ccsIniOpen (upgrade->file); ccsSetProfile (context, upgrade->profile); ccsCollectSettingsToUpgrade (context, dict, upgrade); ccsUpgradeClearValues (upgrade->clearValueSettings); ccsUpgradeAddValues (upgrade->addValueSettings); ccsUpgradeReplaceValues (upgrade->replaceFromValueSettings, upgrade->replaceToValueSettings); upgrade->clearValueSettings = ccsSettingListFree (upgrade->clearValueSettings, TRUE); upgrade->addValueSettings = ccsSettingListFree (upgrade->addValueSettings, TRUE); upgrade->replaceFromValueSettings = ccsSettingListFree (upgrade->replaceFromValueSettings, TRUE); upgrade->replaceToValueSettings = ccsSettingListFree (upgrade->replaceToValueSettings, TRUE); ccsIniClose (dict); return TRUE; } static int upgradeNameFilter (const struct dirent *name) { return ccsUpgradeNameFilter (name->d_name); } void ccsFreeUpgrade (CCSSettingsUpgrade *upgrade) { if (upgrade->profile) free (upgrade->profile); if (upgrade->domain) free (upgrade->domain); if (upgrade->file) free (upgrade->file); free (upgrade); } /* * Process a filename into the properties * for a settings upgrade * eg * * org.freedesktop.compiz.Default.01.upgrade * * gives us: * domain: org.freedesktop.compiz * number: 1 * profile: Default * */ CCSSettingsUpgrade * ccsSettingsUpgradeNew (const char *path, const char *name) { CCSSettingsUpgrade *upgrade = calloc (1, sizeof (CCSSettingsUpgrade)); char *upgradeName = strdup (name); unsigned int fnlen = strlen (path) + strlen (name) + 1; upgrade->file = calloc (fnlen + 1, sizeof (char)); sprintf (upgrade->file, "%s/%s", path, name); upgradeName = strdup (name); if (!ccsUpgradeGetDomainNumAndProfile (upgradeName, &upgrade->domain, &upgrade->num, &upgrade->profile)) { ccsFreeUpgrade (upgrade); upgrade = NULL; } free (upgradeName); return upgrade; } static CCSTextFile * ccsUnixOpenDoneSettingsUpgradeFile (const char *path) { return ccsUnixTextFileNew (path, ReadWriteCreate, &ccsDefaultObjectAllocator); } static CCSTextFile * ccsGetDoneSettingsUpgradeFile (const char *home) { char *dupath = NULL; CCSTextFile *completedUpgrades = NULL; if (asprintf (&dupath, "%s/.config/compiz-1/compizconfig/done_upgrades", home) == -1) return NULL; completedUpgrades = ccsUnixOpenDoneSettingsUpgradeFile (dupath); free (dupath); return completedUpgrades; } static char * ccsReadCompletedUpgradesIntoString (CCSTextFile *completedUpgrades) { return ccsTextFileReadFromStart (completedUpgrades); } static unsigned int ccsGetUpgradeFilesForProcessing (const char *upgradePath, struct dirent ***passedNameList) { struct dirent **nameList = NULL; unsigned int nFile = scandir (upgradePath, &nameList, upgradeNameFilter, alphasort); if (!nFile) return 0; *passedNameList = nameList; return nFile; } static Bool ccsShouldSkipUpgrade (const char *upgrade, const char *skipBuffer) { char *matched = strstr (skipBuffer, upgrade); if (matched != NULL) { ccsDebug ("Skipping upgrade %s", upgrade); return TRUE; } return FALSE; } static void ccsProcessUpgradeOnce (CCSContext *context, CCSSettingsUpgrade *upgrade, const char *upgradeName, CCSTextFile *completedUpgrades) { ccsDebug ("Processing upgrade %s\n profile: %s\n number: %i\n domain: %s", upgradeName, upgrade->profile, upgrade->num, upgrade->domain); ccsProcessUpgrade (context, upgrade); ccsWriteChangedSettings (context); ccsWriteAutoSortedPluginList (context); ccsDebug ("Completed upgrade %s", upgradeName); ccsTextFileAppendString (completedUpgrades, upgradeName); ccsFreeUpgrade (upgrade); } static const char * CCS_UPGRADE_PATH = DATADIR "/compizconfig/upgrades"; static void ccsApplyUnappliedUpgrades (CCSContext *context, struct dirent **nameList, unsigned int nFile, const char *completedUpradesContents, CCSTextFile *completedUpgrades) { int i = 0; const char *path = CCS_UPGRADE_PATH; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); char *previousProfile = strdup(cPrivate->profile); for (i = 0; i < nFile; ++i) { CCSSettingsUpgrade *upgrade = NULL; const char *upgradeName = nameList[i]->d_name; if (ccsShouldSkipUpgrade (upgradeName, completedUpradesContents)) continue; upgrade = ccsSettingsUpgradeNew (path, upgradeName); ccsProcessUpgradeOnce (context, upgrade, upgradeName, completedUpgrades); free (nameList[i]); } if (strcmp (cPrivate->profile, previousProfile)) { ccsSetProfile (context, previousProfile); } free (previousProfile); } Bool ccsCheckForSettingsUpgradeDefault (CCSContext *context) { struct dirent **nameList = NULL; int nFile; const char *path = CCS_UPGRADE_PATH; CCSTextFile *completedUpgrades; char *cuBuffer = NULL; const char *home = getenv ("HOME"); if (!home) return FALSE; completedUpgrades = ccsGetDoneSettingsUpgradeFile (home); if (!completedUpgrades) return FALSE; cuBuffer = ccsReadCompletedUpgradesIntoString (completedUpgrades); if (!cuBuffer) { ccsTextFileUnref (completedUpgrades); ccsWarning ("Error opening done_upgrades"); return FALSE; } nFile = ccsGetUpgradeFilesForProcessing (path, &nameList); if (!nFile || !nameList) { free (cuBuffer); ccsTextFileUnref (completedUpgrades); return FALSE; } ccsApplyUnappliedUpgrades (context, nameList, nFile, cuBuffer, completedUpgrades); ccsTextFileUnref (completedUpgrades); free (cuBuffer); if (nameList != NULL) free (nameList); return TRUE; } Bool ccsImportFromFileDefault (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { IniDictionary *importFile; CCSPluginList p; CCSSettingList s; CCSPlugin *plugin; CCSSetting *setting; char *keyName; FILE *fp; /* check if the file exists first */ fp = fopen (fileName, "r"); if (!fp) return FALSE; fclose (fp); importFile = iniparser_new ((char *) fileName); if (!importFile) return FALSE; ccsLoadPlugins (context); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); for (p = cPrivate->plugins; p; p = p->next) { plugin = p->data; CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); for (s = pPrivate->settings; s; s = s->next) { setting = s->data; if (!ccsSettingGetIsDefault (setting) && !overwriteNonDefault) continue; if (asprintf (&keyName, "s%d_%s", cPrivate->screenNum, ccsSettingGetName (setting)) == -1) return FALSE; switch (ccsSettingGetType (setting)) { case TypeBool: { Bool value; if (ccsIniGetBool (importFile, ccsPluginGetName (plugin), keyName, &value)) { ccsSetBool (setting, value, TRUE); } } break; case TypeInt: { int value; if (ccsIniGetInt (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetInt (setting, value, TRUE); } break; case TypeFloat: { float value; if (ccsIniGetFloat (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetFloat (setting, value, TRUE); } break; case TypeString: { char *value; if (ccsIniGetString (importFile, ccsPluginGetName (plugin), keyName, &value)) { ccsSetString (setting, value, TRUE); free (value); } } break; case TypeKey: { CCSSettingKeyValue value; if (ccsIniGetKey (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetKey (setting, value, TRUE); } break; case TypeButton: { CCSSettingButtonValue value; if (ccsIniGetButton (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetButton (setting, value, TRUE); } break; case TypeEdge: { unsigned int value; if (ccsIniGetEdge (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetEdge (setting, value, TRUE); } break; case TypeBell: { Bool value; if (ccsIniGetBell (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetBell (setting, value, TRUE); } break; case TypeColor: { CCSSettingColorValue value; if (ccsIniGetColor (importFile, ccsPluginGetName (plugin), keyName, &value)) ccsSetColor (setting, value, TRUE); } break; case TypeMatch: { char *value; if (ccsIniGetString (importFile, ccsPluginGetName (plugin), keyName, &value)) { ccsSetMatch (setting, value, TRUE); free (value); } } break; case TypeList: { CCSSettingValueList value; if (ccsIniGetList (importFile, ccsPluginGetName (plugin), keyName, &value, setting)) { ccsSetList (setting, value, TRUE); ccsSettingValueListFree (value, TRUE); } } break; default: break; } free (keyName); } } /* We might be doing this from within compiz so make sure * to write out the new values */ ccsWriteChangedSettings (context); ccsIniClose (importFile); return TRUE; } Bool ccsCheckForSettingsUpgrade (CCSContext *context) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextCheckForSettingsUpgrade) (context); } Bool ccsImportFromFile (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { if (!context) return FALSE; return (*(GET_INTERFACE (CCSContextInterface, context))->contextImportFromFile) (context, fileName, overwriteNonDefault); } const char * ccsPluginGetNameDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->name; } const char * ccsPluginGetShortDescDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->shortDesc; } const char * ccsPluginGetLongDescDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->longDesc; } const char * ccsPluginGetHintsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->hints; } const char * ccsPluginGetCategoryDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->category; } CCSStringList ccsPluginGetLoadAfterDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->loadAfter; } CCSStringList ccsPluginGetLoadBeforeDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->loadBefore; } CCSStringList ccsPluginGetRequiresPluginsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->requiresPlugin; } CCSStringList ccsPluginGetConflictPluginsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->conflictPlugin; } CCSStringList ccsPluginGetProvidesFeaturesDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->providesFeature; } void * ccsPluginGetProvidesFeaturesBindable (CCSPlugin *plugin) { return (void *) ccsPluginGetProvidesFeatures (plugin); } CCSStringList ccsPluginGetRequiresFeaturesDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->requiresFeature; } void * ccsPluginGetPrivatePtrDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->privatePtr; } void ccsPluginSetPrivatePtrDefault (CCSPlugin *plugin, void *ptr) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->privatePtr = ptr; } CCSContext * ccsPluginGetContextDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); return pPrivate->context; } /* CCSPlugin accessor functions */ const char * ccsPluginGetName (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetName) (plugin); } const char * ccsPluginGetShortDesc (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetShortDesc) (plugin); } const char * ccsPluginGetLongDesc (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetLongDesc) (plugin); } const char * ccsPluginGetHints (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetHints) (plugin); } const char * ccsPluginGetCategory (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetCategory) (plugin); } CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetLoadAfter) (plugin); } CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetLoadBefore) (plugin); } CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetRequiresPlugins) (plugin); } CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetConflictPlugins) (plugin); } CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetProvidesFeatures) (plugin); } CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetRequiresFeatures) (plugin); } void * ccsPluginGetPrivatePtr (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPrivatePtr) (plugin); } void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr) { (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginSetPrivatePtr) (plugin, ptr); } CCSContext * ccsPluginGetContext (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetContext) (plugin); } CCSSettingList ccsGetPluginSettingsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); return pPrivate->settings; } CCSSettingList ccsGetPluginSettings (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPluginSettings) (plugin); } CCSGroupList ccsGetPluginGroupsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); return pPrivate->groups; } CCSGroupList ccsGetPluginGroups (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPluginGroups) (plugin); } const char * ccsSettingGetName (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetName) (setting); } const char * ccsSettingGetShortDesc (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetShortDesc) (setting); } const char * ccsSettingGetLongDesc (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetLongDesc) (setting); } CCSSettingType ccsSettingGetType (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetType) (setting); } CCSSettingInfo * ccsSettingGetInfo (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetInfo) (setting); } const char * ccsSettingGetGroup (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetGroup) (setting); } const char * ccsSettingGetSubGroup (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetSubGroup) (setting); } const char * ccsSettingGetHints (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetHints) (setting); } CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetDefaultValue) (setting); } CCSSettingValue *ccsSettingGetValue (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetValue) (setting); } Bool ccsSettingGetIsDefault (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetIsDefault) (setting); } CCSPlugin * ccsSettingGetParent (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetParent) (setting); } void * ccsSettingGetPrivatePtr (CCSSetting *setting) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingGetPrivatePtr) (setting); } void ccsSettingSetPrivatePtr (CCSSetting *setting, void *ptr) { return (*(GET_INTERFACE (CCSSettingInterface, setting))->settingSetPrivatePtr) (setting, ptr); } Bool ccsSettingGetIsIntegratedDefault (CCSSetting *setting) { if (!setting) return FALSE; CCSPlugin *plugin = ccsSettingGetParent (setting); CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return FALSE; if (ccsDynamicBackendSupportsIntegration (cPrivate->backend)) return ccsBackendGetSettingIsIntegrated ((CCSBackend *) cPrivate->backend, setting); return FALSE; } Bool ccsSettingGetIsReadOnlyDefault (CCSSetting *setting) { if (!setting) return FALSE; CCSPlugin *plugin = ccsSettingGetParent (setting); CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return FALSE; return ccsBackendGetSettingIsReadOnly ((CCSBackend *) cPrivate->backend, setting); } Bool ccsSettingGetIsReadableByBackendDefault (CCSSetting *setting) { static const CCSSettingType readableSettingTypes[] = { TypeBool, TypeInt, TypeFloat, TypeString, TypeColor, TypeKey, TypeButton, TypeEdge, TypeBell, TypeMatch, TypeList }; static const unsigned int readableSettingTypesNum = sizeof (readableSettingTypes) / sizeof (readableSettingTypes[0]); int i = 0; Bool isReadableType = FALSE; CCSSettingType type; CCSPlugin *plugin = ccsSettingGetParent (setting); CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!cPrivate->backend) return FALSE; type = ccsSettingGetType (setting); /* It is impossible for certain settings to have a schema, * such as actions and read only settings, so in that case * just return FALSE since compizconfig doesn't expect us * to read them anyways */ for (i = 0; i < readableSettingTypesNum; ++i) { if (readableSettingTypes[i] == type) { isReadableType = TRUE; break; } } if (isReadableType && !ccsSettingIsReadOnly (setting)) { return TRUE; } return FALSE; } /* Interface for CCSSetting */ const char * ccsSettingGetNameDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->name; } const char * ccsSettingGetShortDescDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->shortDesc; } const char * ccsSettingGetLongDescDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->longDesc; } CCSSettingType ccsSettingGetTypeDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->type; } CCSSettingInfo * ccsSettingGetInfoDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return &sPrivate->info; } const char * ccsSettingGetGroupDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->group; } const char * ccsSettingGetSubGroupDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->subGroup; } const char * ccsSettingGetHintsDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->hints; } CCSSettingValue * ccsSettingGetDefaultValueDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return &sPrivate->defaultValue; } CCSSettingValue * ccsSettingGetValueDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->value; } Bool ccsSettingGetIsDefaultDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->isDefault; } CCSPlugin * ccsSettingGetParentDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->parent; } void * ccsSettingGetPrivatePtrDefault (CCSSetting *setting) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); return sPrivate->privatePtr; } void ccsSettingSetPrivatePtrDefault (CCSSetting *setting, void *ptr) { CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting); sPrivate->privatePtr = ptr; } CCSStrExtensionList ccsGetPluginStrExtensionsDefault (CCSPlugin *plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (!pPrivate->loaded) ccsLoadPluginSettings (plugin); return pPrivate->stringExtensions; } CCSStrExtensionList ccsGetPluginStrExtensions (CCSPlugin *plugin) { return (*(GET_INTERFACE (CCSPluginInterface, plugin))->pluginGetPluginStrExtensions) (plugin); } CCSSettingValue * ccsIntegratedSettingReadValue (CCSIntegratedSetting *setting, CCSSettingType type) { return (*(GET_INTERFACE (CCSIntegratedSettingInterface, setting))->readValue) (setting, type); } void ccsIntegratedSettingWriteValue (CCSIntegratedSetting *setting, CCSSettingValue *value, CCSSettingType type) { (*(GET_INTERFACE (CCSIntegratedSettingInterface, setting))->writeValue) (setting, value, type); } const char * ccsIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->pluginName) (info); } const char * ccsIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->settingName) (info); } CCSSettingType ccsIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *info) { return (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->getType) (info); } void ccsFreeIntegratedSettingInfo (CCSIntegratedSettingInfo *info) { (*(GET_INTERFACE (CCSIntegratedSettingInfoInterface, info))->free) (info); } void ccsFreeIntegratedSetting (CCSIntegratedSetting *setting) { (*(GET_INTERFACE (CCSIntegratedSettingInterface, setting))->free) (setting); } CCSSetting * ccsSettingDefaultImplNew (CCSPlugin *plugin, const char *name, CCSSettingType type, const char *shortDesc, const char *longDesc, const char *hints, const char *group, const char *subGroup, CCSSettingDefaultValueInitializerFunc valueInit, void *valueInitData, CCSSettingInfoInitializerFunc infoInit, void *infoInitData, CCSObjectAllocationInterface *ai, const CCSInterfaceTable *interfaces) { CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); if (!setting) return NULL; ccsObjectInit (setting, ai); CCSSettingPrivate *sPrivate = (CCSSettingPrivate *) (*ai->calloc_) (ai->allocator, 1, sizeof (CCSSettingPrivate)); if (!sPrivate) { free (setting); return NULL; } ccsObjectSetPrivate (setting, (CCSPrivate *) sPrivate); ccsObjectAddInterface (setting, (CCSInterface *) interfaces->settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); sPrivate->parent = plugin; sPrivate->isDefault = TRUE; sPrivate->name = strdup (name); sPrivate->shortDesc = strdup (shortDesc); sPrivate->longDesc = strdup (longDesc); sPrivate->group = strdup (group); sPrivate->hints = strdup (hints); sPrivate->subGroup = strdup (subGroup); sPrivate->type = type; sPrivate->value = &sPrivate->defaultValue; sPrivate->defaultValue.parent = setting; (*infoInit) (type, &sPrivate->info, infoInitData); (*valueInit) (type, &sPrivate->info, &sPrivate->defaultValue, valueInitData); return setting; } /* CCSSharedIntegratedSettingInfo implementation */ typedef struct _CCSSharedIntegratedSettingInfoPrivate CCSSharedIntegratedSettingInfoPrivate; struct _CCSSharedIntegratedSettingInfoPrivate { const char *pluginName; const char *settingName; CCSSettingType type; }; static const char * ccsSharedIntegratedSettingInfoSettingName (CCSIntegratedSettingInfo *setting) { CCSSharedIntegratedSettingInfoPrivate *priv = (CCSSharedIntegratedSettingInfoPrivate *) ccsObjectGetPrivate (setting); return priv->settingName; } static const char * ccsSharedIntegratedSettingInfoPluginName (CCSIntegratedSettingInfo *setting) { CCSSharedIntegratedSettingInfoPrivate *priv = (CCSSharedIntegratedSettingInfoPrivate *) ccsObjectGetPrivate (setting); return priv->pluginName; } static CCSSettingType ccsSharedIntegratedSettingInfoGetType (CCSIntegratedSettingInfo *setting) { CCSSharedIntegratedSettingInfoPrivate *priv = (CCSSharedIntegratedSettingInfoPrivate *) ccsObjectGetPrivate (setting); return priv->type; } static void ccsSharedIntegratedSettingInfoFree (CCSIntegratedSettingInfo *setting) { ccsObjectFinalize (setting); (*setting->object.object_allocation->free_) (setting->object.object_allocation->allocator, setting); } const CCSIntegratedSettingInfoInterface ccsSharedIntegratedSettingInfoInterface = { ccsSharedIntegratedSettingInfoPluginName, ccsSharedIntegratedSettingInfoSettingName, ccsSharedIntegratedSettingInfoGetType, ccsSharedIntegratedSettingInfoFree }; CCSIntegratedSettingInfo * ccsSharedIntegratedSettingInfoNew (const char *pluginName, const char *settingName, CCSSettingType type, CCSObjectAllocationInterface *ai) { CCSIntegratedSettingInfo *info = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSetting)); if (!info) return NULL; CCSSharedIntegratedSettingInfoPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSSharedIntegratedSettingInfoPrivate)); if (!priv) { (*ai->free_) (ai->allocator, info); return NULL; } priv->pluginName = pluginName; priv->settingName = settingName; priv->type = type; ccsObjectInit (info, ai); ccsObjectSetPrivate (info, (CCSPrivate *) priv); ccsObjectAddInterface (info, (const CCSInterface *) &ccsSharedIntegratedSettingInfoInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingInfoInterface)); ccsIntegratedSettingInfoRef (info); return info; } CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data) { return (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->findMatchingSettingsByPredicate) (storage, pred, data); } CCSIntegratedSettingList ccsIntegratedSettingsStorageFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName) { return (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->findMatchingSettingsByPluginAndSettingName) (storage, pluginName, settingName); } void ccsIntegratedSettingsStorageAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting) { (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->addSetting) (storage, setting); } Bool ccsIntegratedSettingsStorageEmpty (CCSIntegratedSettingsStorage *storage) { return (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->empty) (storage); } void ccsFreeIntegratedSettingsStorage (CCSIntegratedSettingsStorage *storage) { (*(GET_INTERFACE (CCSIntegratedSettingsStorageInterface, storage))->free) (storage); } /* CCSIntegratedSettingsStorageDefault implementation */ typedef struct _CCSIntegratedSettingsStorageDefaultPrivate CCSIntegratedSettingsStorageDefaultPrivate; struct _CCSIntegratedSettingsStorageDefaultPrivate { CCSIntegratedSettingList settingList; }; typedef struct _CCSIntegratedSettingsStorageFindByNamesData { const char *pluginName; const char *settingName; } CCSIntegratedSettingsStorageFindByNamesData; static Bool ccsIntegratedSettingsStorageFindByNamesPredicate (CCSIntegratedSetting *setting, void *data) { CCSIntegratedSettingsStorageFindByNamesData *findNamesData = (CCSIntegratedSettingsStorageFindByNamesData *) data; const char *sPluginName = ccsIntegratedSettingInfoPluginName ((CCSIntegratedSettingInfo *) setting); const char *sSettingName = ccsIntegratedSettingInfoSettingName ((CCSIntegratedSettingInfo *) setting); if (strcmp (sPluginName, findNamesData->pluginName) == 0 && strcmp (sSettingName, findNamesData->settingName) == 0) { return TRUE; } return FALSE; } CCSIntegratedSettingList ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPredicate (CCSIntegratedSettingsStorage *storage, CCSIntegratedSettingsStorageFindPredicate pred, void *data) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); CCSIntegratedSettingList returnList = NULL; CCSIntegratedSettingList iter = priv->settingList; while (iter) { if (iter->data != NULL && pred (iter->data, data)) returnList = ccsIntegratedSettingListAppend (returnList, iter->data); iter = iter->next; } return returnList; } CCSIntegratedSettingList ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPluginAndSettingName (CCSIntegratedSettingsStorage *storage, const char *pluginName, const char *settingName) { CCSIntegratedSettingsStorageFindByNamesData data = { pluginName, settingName }; return ccsIntegratedSettingsStorageFindMatchingSettingsByPredicate (storage, ccsIntegratedSettingsStorageFindByNamesPredicate, (void *) &data); } void ccsIntegratedSettingsStorageDefaultAddSetting (CCSIntegratedSettingsStorage *storage, CCSIntegratedSetting *setting) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); priv->settingList = ccsIntegratedSettingListAppend (priv->settingList, setting); } Bool ccsIntegratedSettingsStorageDefaultEmpty (CCSIntegratedSettingsStorage *storage) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); return priv->settingList == NULL; } void ccsIntegratedSettingsStorageDefaultImplFree (CCSIntegratedSettingsStorage *storage) { CCSIntegratedSettingsStorageDefaultPrivate *priv = (CCSIntegratedSettingsStorageDefaultPrivate *) ccsObjectGetPrivate (storage); if (priv->settingList) ccsIntegratedSettingListFree (priv->settingList, TRUE); ccsObjectFinalize (storage); (*storage->object.object_allocation->free_) (storage->object.object_allocation->allocator, storage); } const CCSIntegratedSettingsStorageInterface ccsIntegratedSettingsStorageDefaultImplInterface = { ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPredicate, ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPluginAndSettingName, ccsIntegratedSettingsStorageDefaultAddSetting, ccsIntegratedSettingsStorageDefaultEmpty, ccsIntegratedSettingsStorageDefaultImplFree }; CCSIntegratedSettingsStorage * ccsIntegratedSettingsStorageDefaultImplNew (CCSObjectAllocationInterface *ai) { CCSIntegratedSettingsStorage *storage = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingsStorage)); if (!storage) return NULL; CCSIntegratedSettingsStorageDefaultPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSIntegratedSettingsStorageDefaultPrivate)); if (!priv) { (*ai->free_) (ai->allocator, storage); return NULL; } ccsObjectInit (storage, ai); ccsObjectSetPrivate (storage, (CCSPrivate *) priv); ccsObjectAddInterface (storage, (const CCSInterface *) &ccsIntegratedSettingsStorageDefaultImplInterface, GET_INTERFACE_TYPE (CCSIntegratedSettingsStorageInterface)); ccsIntegratedSettingsStorageRef (storage); return storage; } CCSIntegratedSetting * ccsIntegratedSettingFactoryCreateIntegratedSettingForCCSSettingNameAndType (CCSIntegratedSettingFactory *factory, CCSIntegration *integration, const char *pluginName, const char *settingName, CCSSettingType type) { return (*(GET_INTERFACE (CCSIntegratedSettingFactoryInterface, factory))->createIntegratedSettingForCCSSettingNameAndType) (factory, integration, pluginName, settingName, type); } void ccsFreeIntegratedSettingFactory (CCSIntegratedSettingFactory *factory) { (*(GET_INTERFACE (CCSIntegratedSettingFactoryInterface, factory))->free) (factory); } static const CCSPluginInterface ccsDefaultPluginInterface = { ccsPluginGetNameDefault, ccsPluginGetShortDescDefault, ccsPluginGetLongDescDefault, ccsPluginGetHintsDefault, ccsPluginGetCategoryDefault, ccsPluginGetLoadAfterDefault, ccsPluginGetLoadBeforeDefault, ccsPluginGetRequiresPluginsDefault, ccsPluginGetConflictPluginsDefault, ccsPluginGetProvidesFeaturesDefault, ccsPluginGetRequiresFeaturesDefault, ccsPluginGetPrivatePtrDefault, ccsPluginSetPrivatePtrDefault, ccsPluginGetContextDefault, ccsFindSettingDefault, ccsGetPluginSettingsDefault, ccsGetPluginGroupsDefault, ccsReadPluginSettingsDefault, ccsGetPluginStrExtensionsDefault, ccsFreePluginDefault }; const CCSContextInterface ccsDefaultContextInterface = { ccsContextGetPluginsDefault, ccsContextGetCategoriesDefault, ccsContextGetChangedSettingsDefault, ccsContextGetScreenNumDefault, ccsContextAddChangedSettingDefault, ccsContextClearChangedSettingsDefault, ccsContextStealChangedSettingsDefault, ccsContextGetPrivatePtrDefault, ccsContextSetPrivatePtrDefault, ccsLoadPluginDefault, ccsFindPluginDefault, ccsPluginIsActiveDefault, ccsGetActivePluginListDefault, ccsGetSortedPluginStringListDefault, ccsSetBackendDefault, ccsGetBackendDefault, ccsSetIntegrationEnabledDefault, ccsSetProfileDefault, ccsSetPluginListAutoSortDefault, ccsGetProfileDefault, ccsGetIntegrationEnabledDefault, ccsGetPluginListAutoSortDefault, ccsProcessEventsDefault, ccsReadSettingsDefault, ccsWriteSettingsDefault, ccsWriteChangedSettingsDefault, ccsExportToFileDefault, ccsImportFromFileDefault, ccsCanEnablePluginDefault, ccsCanDisablePluginDefault, ccsGetExistingProfilesDefault, ccsDeleteProfileDefault, ccsCheckForSettingsUpgradeDefault, ccsLoadPluginsDefault, ccsFreeContextDefault }; static const CCSSettingInterface ccsDefaultSettingInterface = { ccsSettingGetNameDefault, ccsSettingGetShortDescDefault, ccsSettingGetLongDescDefault, ccsSettingGetTypeDefault, ccsSettingGetInfoDefault, ccsSettingGetGroupDefault, ccsSettingGetSubGroupDefault, ccsSettingGetHintsDefault, ccsSettingGetDefaultValueDefault, ccsSettingGetValueDefault, ccsSettingGetIsDefaultDefault, ccsSettingGetParentDefault, ccsSettingGetPrivatePtrDefault, ccsSettingSetPrivatePtrDefault, ccsSettingSetIntDefault, ccsSettingSetFloatDefault, ccsSettingSetBoolDefault, ccsSettingSetStringDefault, ccsSettingSetColorDefault, ccsSettingSetMatchDefault, ccsSettingSetKeyDefault, ccsSettingSetButtonDefault, ccsSettingSetEdgeDefault, ccsSettingSetBellDefault, ccsSettingSetListDefault, ccsSettingSetValueDefault, ccsSettingGetIntDefault, ccsSettingGetFloatDefault, ccsSettingGetBoolDefault, ccsSettingGetStringDefault, ccsSettingGetColorDefault, ccsSettingGetMatchDefault, ccsSettingGetKeyDefault, ccsSettingGetButtonDefault, ccsSettingGetEdgeDefault, ccsSettingGetBellDefault, ccsSettingGetListDefault, ccsSettingResetToDefaultDefault, ccsSettingGetIsIntegratedDefault, ccsSettingGetIsReadOnlyDefault, ccsSettingGetIsReadableByBackendDefault, ccsFreeSettingDefault }; const CCSBackendInterface ccsDynamicBackendInterfaceWrapper = { ccsDynamicBackendGetInfoWrapper, ccsDynamicBackendExecuteEventsWrapper, ccsDynamicBackendInitWrapper, ccsDynamicBackendFiniWrapper, ccsDynamicBackendReadInitWrapper, ccsDynamicBackendReadSettingWrapper, ccsDynamicBackendReadDoneWrapper, ccsDynamicBackendWriteInitWrapper, ccsDynamicBackendWriteSettingWrapper, ccsDynamicBackendWriteDoneWrapper, ccsDynamicBackendUpdateSettingWrapper, ccsDynamicBackendGetSettingIsIntegratedWrapper, ccsDynamicBackendGetSettingIsReadOnlyWrapper, ccsDynamicBackendGetExistingProfilesWrapper, ccsDynamicBackendDeleteProfileWrapper, ccsDynamicBackendSetIntegrationWrapper }; const CCSDynamicBackendInterface ccsDefaultDynamicBackendInterface = { ccsDynamicBackendGetBackendNameDefault, ccsDynamicBackendSupportsReadDefault, ccsDynamicBackendSupportsWriteDefault, ccsDynamicBackendSupportsIntegrationDefault, ccsDynamicBackendSupportsProfilesDefault, ccsDynamicBackendGetRawBackendDefault }; const CCSInterfaceTable ccsDefaultInterfaceTable = { &ccsDefaultContextInterface, &ccsDefaultPluginInterface, &ccsDefaultSettingInterface, &ccsDynamicBackendInterfaceWrapper, &ccsDefaultDynamicBackendInterface }; ./compizconfig/libcompizconfig/src/lists.c0000644000004100000410000002657713246301623021222 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE #include #include #include #include #include "ccs-private.h" typedef void (*freeFunc) (void *ptr); #define CCSLIST(type,dtype,ocomp,compfunc) \ \ CCS##type##List ccs##type##ListAppend (CCS##type##List list, dtype *data) \ { \ CCS##type##List l = list; \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ ne->data = data; \ ne->next = NULL; \ if (!list) \ return ne; \ while (l->next) l = l->next; \ l->next = ne; \ return list; \ } \ \ CCS##type##List ccs##type##ListPrepend (CCS##type##List list, dtype *data) \ { \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ ne->data = data; \ ne->next = list; \ return ne; \ } \ \ CCS##type##List ccs##type##ListInsert (CCS##type##List list, dtype *data, int position) \ { \ CCS##type##List l = list; \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ ne->data = data; \ ne->next = list; \ if (!list || !position) \ return ne; \ --position; \ while (l->next && position) \ { \ l = l->next; \ --position; \ } \ ne->next = l->next; \ l->next = ne; \ return list; \ } \ \ CCS##type##List ccs##type##ListInsertBefore (CCS##type##List list, CCS##type##List sibling, dtype *data) \ { \ CCS##type##List l = list; \ CCS##type##List ne = malloc(sizeof(struct _CCS##type##List)); \ if (!ne) \ return list; \ while (l && (l != sibling)) l = l->next; \ ne->data = data; \ ne->next = l; \ return ne; \ } \ \ unsigned int ccs##type##ListLength (CCS##type##List list) \ { \ unsigned int count = 0; \ CCS##type##List l = list; \ while (l) \ { \ l = l->next; \ ++count; \ } \ return count; \ } \ \ CCS##type##List ccs##type##ListFind (CCS##type##List list, dtype *data) \ { \ CCS##type##List l = list; \ while (l) \ { \ if (!data && !l->data) break; \ if ((ocomp)?(compfunc):(memcmp(l->data, data, sizeof(dtype)) == 0)) break; \ l = l->next; \ } \ return l; \ } \ \ CCS##type##List ccs##type##ListGetItem (CCS##type##List list, unsigned int index) \ { \ CCS##type##List l = list; \ while (l && index) \ { \ l = l->next; \ --index; \ } \ return l; \ } \ \ CCS##type##List ccs##type##ListRemove (CCS##type##List list, dtype *data, Bool freeObj) \ { \ CCS##type##List l = list; \ CCS##type##List prev = NULL; \ Bool found = FALSE; \ if (!data) \ return list; \ while (l) \ { \ if (!l->data) continue; \ if ((ocomp)?(compfunc):(memcmp(l->data, data, sizeof(dtype)) == 0)) \ { \ found = TRUE; \ break; \ } \ prev = l; \ l = l->next; \ } \ if (!found) \ return list; \ if (l) \ { \ if (prev) prev->next = l->next; \ else list = l->next; \ if (freeObj) \ ccs##type##Unref (l->data); \ free (l); \ } \ return list; \ } \ \ CCS##type##List ccs##type##ListFree (CCS##type##List list, Bool freeObj) \ { \ CCS##type##List l = list; \ CCS##type##List le = NULL; \ while (l) \ { \ le = l; \ l = l->next; \ if (freeObj) \ ccs##type##Unref (le->data); \ free(le); \ } \ return NULL; \ } CCSLIST (Plugin, CCSPlugin, FALSE, 0) CCSLIST (Setting, CCSSetting, FALSE, 0) CCSLIST (String, CCSString, TRUE, strcmp (((CCSString *)data)->value, ((CCSString *)l->data)->value) == 0) CCSLIST (Group, CCSGroup, FALSE, 0) CCSLIST (SubGroup, CCSSubGroup, FALSE, 0) CCSLIST (SettingValue, CCSSettingValue, FALSE, 0) CCSLIST (PluginConflict, CCSPluginConflict, FALSE, 0) CCSLIST (BackendInfo, CCSBackendInfo, FALSE, 0) CCSLIST (IntDesc, CCSIntDesc, FALSE, 0) CCSLIST (StrRestriction, CCSStrRestriction, FALSE, 0) CCSLIST (StrExtension, CCSStrExtension, FALSE, 0) CCSLIST (IntegratedSetting, CCSIntegratedSetting, FALSE, 0) CCSSettingValueList ccsGetValueListFromStringList (CCSStringList list, CCSSetting *parent) { CCSSettingValueList rv = NULL; while (list) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return rv; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asString = strdup (((CCSString *)list->data)->value); rv = ccsSettingValueListAppend (rv, value); list = list->next; } return rv; } CCSStringList ccsGetStringListFromValueList (CCSSettingValueList list) { CCSStringList rv = NULL; while (list) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (list->data->value.asString); str->refCount = 1; rv = ccsStringListAppend (rv, str); list = list->next; } return rv; } char ** ccsGetStringArrayFromList (CCSStringList list, int *num) { char ** rv = NULL; int length = ccsStringListLength (list); int i; if (length) { rv = calloc (length, sizeof (char *)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) { rv[i] = strdup (((CCSString *)list->data)->value); } *num = length; return rv; } CCSStringList ccsGetListFromStringArray (char ** array, int num) { CCSStringList rv = NULL; int i; for (i = 0; i < num; ++i) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (array[i]); str->refCount = 1; rv = ccsStringListAppend (rv, str); } return rv; } char ** ccsGetStringArrayFromValueList (CCSSettingValueList list, int *num) { char ** rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (char *)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = strdup (list->data->value.asString); *num = length; return rv; } char ** ccsGetMatchArrayFromValueList (CCSSettingValueList list, int *num) { char ** rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (char *)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = strdup (list->data->value.asMatch); *num = length; return rv; } int * ccsGetIntArrayFromValueList (CCSSettingValueList list, int *num) { int * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (int)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = list->data->value.asInt; *num = length; return rv; } float * ccsGetFloatArrayFromValueList (CCSSettingValueList list, int *num) { float * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (float)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = list->data->value.asFloat; *num = length; return rv; } Bool * ccsGetBoolArrayFromValueList (CCSSettingValueList list, int *num) { Bool * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (Bool)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) rv[i] = list->data->value.asBool; *num = length; return rv; } CCSSettingColorValue * ccsGetColorArrayFromValueList (CCSSettingValueList list, int *num) { CCSSettingColorValue * rv = NULL; int length = ccsSettingValueListLength (list); int i; if (length) { rv = calloc (length, sizeof (CCSSettingColorValue)); if (!rv) return NULL; } for (i = 0; i < length; i++, list = list->next) memcpy (&rv[i], &list->data->value.asColor, sizeof (CCSSettingColorValue)); *num = length; return rv; } CCSSettingValueList ccsGetValueListFromStringArray (const char ** array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asString = strdup (array[i]); l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromMatchArray (const char ** array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asMatch = strdup (array[i]); l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromIntArray (int * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asInt = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromFloatArray (float * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asFloat = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromBoolArray (Bool * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asBool = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } CCSSettingValueList ccsGetValueListFromColorArray (CCSSettingColorValue * array, int num, CCSSetting *parent) { CCSSettingValueList l = NULL; int i; for (i = 0; i < num; ++i) { CCSSettingValue *value = calloc (1, sizeof (CCSSettingValue)); if (!value) return l; value->refCount = 1; value->isListChild = TRUE; value->parent = parent; value->value.asColor = array[i]; l = ccsSettingValueListAppend (l, value); } return l; } ./compizconfig/libcompizconfig/src/ccs-modifier-list-inl.h0000644000004100000410000000265113246301623024151 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CCS_MODIFIER_LIST_INL_H #define _CCS_MODIFIER_LIST_INL_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #define CompAltMask (1 << 16) #define CompMetaMask (1 << 17) #define CompSuperMask (1 << 18) #define CompHyperMask (1 << 19) #define CompModeSwitchMask (1 << 20) #define CompNumLockMask (1 << 21) #define CompScrollLockMask (1 << 22) struct _Modifier { char *name; int modifier; }; extern struct _Modifier modifierList[]; unsigned int ccsInternalUtilNumModifiers (); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/ccs_backend_loader_interface.c0000644000004100000410000000303413246301623025630 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_backend_loader_interface.c * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include INTERFACE_TYPE (CCSBackendLoaderInterface); CCSREF_OBJ (BackendLoader, CCSBackendLoader); CCSBackend * ccsBackendLoaderLoadBackend (CCSBackendLoader *loader, const CCSInterfaceTable *interfaces, CCSContext *context, const char *name) { return (*(GET_INTERFACE (CCSBackendLoaderInterface, loader))->loadBackend) (loader, interfaces, context, name); } void ccsFreeBackendLoader (CCSBackendLoader *file) { return (*(GET_INTERFACE (CCSBackendLoaderInterface, file))->free) (file); } ./compizconfig/libcompizconfig/src/ccs_config_file.h0000644000004100000410000000224613246301623023150 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_config_file.h * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_CONFIG_FILE_H #define CCS_CONFIG_FILE_H #include #include #include "ccs_config_file_interface.h" COMPIZCONFIG_BEGIN_DECLS CCSConfigFile * ccsInternalConfigFileNew (CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/compiz.cpp0000644000004100000410000022527413246301623021720 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #ifdef USE_PROTOBUF #include "compizconfig.pb.h" #include #endif #ifdef HAVE_CONFIG_H # include "../config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ccs-private.h" #include namespace { class SetNumericLocale { public: SetNumericLocale() : locale_set(false) { char* current_locale = ::setlocale (LC_NUMERIC, NULL); // If current_locale is NULL, the method failed to get the current locale. // We can't store a null locale inside the std::string, so we have a bool // to let us know that we have a valid old locale. if (current_locale) { locale_set = true; old_locale = current_locale; } // The reason we store the old_locale in a std::string is to make a real // copy of it. The char* that is returned from setlocale is being freed // when we call the next setlocale (to "C"). ::setlocale (LC_NUMERIC, "C"); } ~SetNumericLocale() { if (locale_set) { ::setlocale (LC_NUMERIC, old_locale.c_str ()); } } private: bool locale_set; std::string old_locale; }; } extern int xmlLoadExtDtdDefaultValue; static const char * getLocale () { char *lang = getenv ("LC_ALL"); if (!lang || !strlen (lang)) lang = getenv ("LC_MESSAGES"); if (!lang || !strlen (lang)) lang = getenv ("LANG"); return lang ? lang : ""; } #ifdef USE_PROTOBUF Bool usingProtobuf = TRUE; #define PB_ABI_VERSION 20090314 typedef metadata::PluginInfo PluginInfoMetadata; typedef metadata::PluginBrief PluginBriefMetadata; typedef metadata::Plugin PluginMetadata; typedef PluginInfoMetadata::Dependencies DependenciesMetadata; typedef PluginMetadata::Screen ScreenMetadata; typedef PluginMetadata::Option OptionMetadata; typedef PluginMetadata::Extension ExtensionMetadata; typedef OptionMetadata::GenericValue GenericValueMetadata; typedef google::protobuf::RepeatedPtrField< std::string > StringList; PluginBriefMetadata persistentPluginBriefPB; PluginMetadata persistentPluginPB; // Made global so that it gets reused, // for better performance (to avoid // mem alloc/free for each plugin) std::string metadataCacheDir = ""; std::string curLocale = std::string (getLocale ()); std::string shortLocale = curLocale.find ('.') == std::string::npos ? curLocale : curLocale.substr (0, curLocale.find ('.')); #endif static void ccsAddRestrictionToStringInfo (CCSSettingStringInfo *forString, const char *name, const char *value) { CCSStrRestriction *restriction; restriction = (CCSStrRestriction *) calloc (1, sizeof (CCSStrRestriction)); if (restriction) { restriction->refCount = 1; restriction->name = strdup (name); restriction->value = strdup (value); forString->restriction = ccsStrRestrictionListAppend (forString->restriction, restriction); } } static void ccsAddRestrictionToStringExtension (CCSStrExtension *extension, const char *name, const char *value) { CCSStrRestriction *restriction; restriction = (CCSStrRestriction *) calloc (1, sizeof (CCSStrRestriction)); if (restriction) { restriction->refCount = 1; restriction->name = strdup (name); restriction->value = strdup (value); extension->restriction = ccsStrRestrictionListAppend (extension->restriction, restriction); } } #ifdef USE_PROTOBUF static void initBoolValuePB (CCSSettingValue * v, const GenericValueMetadata & value) { v->value.asBool = FALSE; if (value.has_bool_value ()) { v->value.asBool = value.bool_value (); } } static void initIntValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asInt = (i->forInt.min + i->forInt.max) / 2; if (value.has_int_value ()) { int val = value.int_value (); if (val >= i->forInt.min && val <= i->forInt.max) v->value.asInt = val; } } static void initFloatValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asFloat = (i->forFloat.min + i->forFloat.max) / 2; if (value.has_float_value ()) { float val = value.float_value (); if (val >= i->forFloat.min && val <= i->forFloat.max) v->value.asFloat = val; } } static void initStringValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { free (v->value.asString); if (value.has_string_value ()) v->value.asString = strdup (value.string_value ().c_str ()); else v->value.asString = strdup (""); } static void initColorValuePB (CCSSettingValue * v, const GenericValueMetadata & value) { memset (&v->value.asColor, 0, sizeof (v->value.asColor)); v->value.asColor.color.alpha = 0xffff; if (!value.has_color_value ()) return; const OptionMetadata::ColorValue &val = value.color_value (); if (val.has_red ()) { int color = strtol ((char *) val.red ().c_str (), NULL, 0); v->value.asColor.color.red = MAX (0, MIN (0xffff, color)); } if (val.has_green ()) { int color = strtol ((char *) val.green ().c_str (), NULL, 0); v->value.asColor.color.green = MAX (0, MIN (0xffff, color)); } if (val.has_blue ()) { int color = strtol ((char *) val.blue ().c_str (), NULL, 0); v->value.asColor.color.blue = MAX (0, MIN (0xffff, color)); } if (val.has_alpha ()) { int color = strtol ((char *) val.alpha ().c_str (), NULL, 0); v->value.asColor.color.alpha = MAX (0, MIN (0xffff, color)); } } static void initMatchValuePB (CCSSettingValue * v, const GenericValueMetadata & value) { free (v->value.asMatch); if (value.has_string_value ()) v->value.asMatch = strdup (value.string_value ().c_str ()); else v->value.asMatch = strdup (""); } static void initKeyValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { memset (&v->value.asKey, 0, sizeof (v->value.asKey)); if (value.has_string_value ()) { std::string const& value_string = value.string_value(); if (value_string != "disabled") { ccsStringToKeyBinding(value_string.c_str(), &v->value.asKey); } } } static void initButtonValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { memset (&v->value.asButton, 0, sizeof (v->value.asButton)); if (value.has_string_value ()) { const char * val = value.string_value ().c_str (); if (strcasecmp (val, "disabled")) { ccsStringToButtonBinding (val, &v->value.asButton); } } } static void initEdgeValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asEdge = 0; if (value.has_edge_value ()) v->value.asEdge = value.edge_value (); } static void initBellValuePB (CCSSettingValue * v, CCSSettingInfo * i, const GenericValueMetadata & value) { v->value.asBell = FALSE; if (value.has_bool_value ()) v->value.asBell = value.bool_value (); } static void initListValuePB (CCSSettingValue * v, CCSSettingInfo * i, const OptionMetadata & option) { int num; num = option.default_value_size (); if (num) { for (int j = 0; j < num; ++j) { CCSSettingValue *val; val = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (!val) continue; val->refCount = 1; val->parent = v->parent; val->isListChild = TRUE; switch (i->forList.listType) { case TypeBool: initBoolValuePB (val, option.default_value (j)); break; case TypeInt: initIntValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeFloat: initFloatValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeString: initStringValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeColor: initColorValuePB (val, option.default_value (j)); break; case TypeKey: initKeyValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeButton: initButtonValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeEdge: initEdgeValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeBell: initBellValuePB (val, i->forList.listInfo, option.default_value (j)); break; case TypeMatch: initMatchValuePB (val, option.default_value (j)); default: break; } v->value.asList = ccsSettingValueListAppend (v->value.asList, val); } } } static void initIntInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forInt.min = std::numeric_limits ::min (); i->forInt.max = std::numeric_limits ::max (); i->forInt.desc = NULL; if (option.has_int_min ()) i->forInt.min = option.int_min (); if (option.has_int_max ()) i->forInt.max = option.int_max (); if (!basicMetadata) { int j, num = option.int_desc_size (); for (j = 0; j < num; ++j) { const OptionMetadata::IntDescription & intDescMetadata = option.int_desc (j); int val = intDescMetadata.value (); if (val >= i->forInt.min && val <= i->forInt.max) { CCSIntDesc *intDesc; intDesc = (CCSIntDesc *) calloc (1, sizeof (CCSIntDesc)); if (intDesc) { intDesc->refCount = 1; intDesc->name = strdup (intDescMetadata.name ().c_str ()); intDesc->value = val; i->forInt.desc = ccsIntDescListAppend (i->forInt.desc, intDesc); } } } } } static void initFloatInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forFloat.min = std::numeric_limits ::min (); i->forFloat.max = std::numeric_limits ::max (); i->forFloat.precision = 0.1f; if (option.has_float_min ()) i->forFloat.min = option.float_min (); if (option.has_float_max ()) i->forFloat.max = option.float_max (); if (option.precision ()) i->forFloat.precision = option.precision (); } static void initStringInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forString.restriction = NULL; i->forString.sortStartsAt = -1; i->forString.extensible = FALSE; if (!basicMetadata) { if (option.has_extensible () && option.extensible ()) i->forString.extensible = TRUE; if (option.has_sort_start ()) i->forString.sortStartsAt = option.sort_start (); int j, num = option.str_restriction_size (); for (j = 0; j < num; ++j) { const OptionMetadata::StringRestriction & restrictionMetadata = option.str_restriction (j); const char *value = restrictionMetadata.value ().c_str (); const char *name = restrictionMetadata.name ().c_str (); ccsAddRestrictionToStringInfo (&i->forString, value, name); } } } static void initListInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { CCSSettingInfo *info; i->forList.listType = TypeBool; i->forList.listInfo = NULL; if (option.has_list_type ()) { i->forList.listType = (CCSSettingType) option.list_type (); } switch (i->forList.listType) { case TypeInt: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initIntInfoPB (info, option); i->forList.listInfo = info; } break; case TypeFloat: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initFloatInfoPB (info, option); i->forList.listInfo = info; } break; case TypeString: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initStringInfoPB (info, option); i->forList.listInfo = info; } break; default: break; } } static void initActionInfoPB (CCSSettingInfo * i, const OptionMetadata & option) { i->forAction.internal = FALSE; if (option.has_internal () && option.internal ()) i->forAction.internal = TRUE; } static void ccsSettingInfoPBInitializer (CCSSettingType type, CCSSettingInfo *info, void *data) { const OptionMetadata &option (*((const OptionMetadata *) data)); switch (type) { case TypeInt: initIntInfoPB (info, option); break; case TypeFloat: initFloatInfoPB (info, option); break; case TypeString: initStringInfoPB (info, option); break; case TypeList: initListInfoPB (info, option); break; case TypeKey: case TypeButton: case TypeEdge: case TypeBell: initActionInfoPB (info, option); break; case TypeAction: // do nothing and fall through default: break; } } static void ccsSettingDefaultValuePBInitializer (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data) { const OptionMetadata &option (*((const OptionMetadata *) data)); switch (type) { case TypeInt: initIntValuePB (value, info, option.default_value (0)); break; case TypeBool: initBoolValuePB (value, option.default_value (0)); break; case TypeFloat: initFloatValuePB (value, info, option.default_value (0)); break; case TypeString: initStringValuePB (value, info, option.default_value (0)); break; case TypeColor: initColorValuePB (value, option.default_value (0)); break; case TypeKey: initKeyValuePB (value, info, option.default_value (0)); break; case TypeButton: initButtonValuePB (value, info, option.default_value (0)); break; case TypeEdge: initEdgeValuePB (value, info, option.default_value (0)); break; case TypeBell: initBellValuePB (value, info, option.default_value (0)); break; case TypeMatch: initMatchValuePB (value, option.default_value (0)); break; case TypeList: initListValuePB (value, info, option); break; case TypeAction: // do nothing and fall through default: break; } } static void ccsSettingDefaultValueEmptyInitializer (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data) { /* if we have no set defaults, we have at least to set the string defaults to empty strings */ switch (type) { case TypeString: value->value.asString = strdup (""); break; case TypeMatch: value->value.asMatch = strdup (""); break; default: break; } } static void addOptionForPluginPB (CCSPlugin * plugin, const char * name, const StringList & groups, const StringList & subgroups, const OptionMetadata & option) { if (ccsFindSetting (plugin, name)) { ccsError ("Option \"%s\" already defined", name); return; } const char *shortDesc = name; const char *longDesc = ""; const char *group = ""; const char *hints = ""; const char *subGroup = ""; CCSSettingType type = (CCSSettingType) option.type (); if (!basicMetadata) { shortDesc = option.has_short_desc () ? option.short_desc ().c_str () : name; longDesc = option.has_long_desc () ? option.long_desc ().c_str () : name; hints = option.has_hints () ? option.hints ().c_str () : name; group = option.group_id () >= 0 ? groups.Get (option.group_id ()).c_str () : ""; subGroup = option.subgroup_id () >= 0 ? subgroups.Get (option.subgroup_id ()).c_str () : ""; } CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); CCSSetting *setting = ccsSettingDefaultImplNew (plugin, name, type, shortDesc, longDesc, hints, group, subGroup, option.default_value_size () > 0 ? ccsSettingDefaultValuePBInitializer : ccsSettingDefaultValueEmptyInitializer, (void *) &option, ccsSettingInfoPBInitializer, (void *) &option, plugin->object.object_allocation, cPrivate->object_interfaces); pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting); } static void addOptionFromPB (CCSPlugin * plugin, const StringList & groups, const StringList & subgroups, const OptionMetadata & option) { const char *name; name = option.name ().c_str (); Bool readonly = option.has_read_only () && option.read_only (); if (!strlen (name) || readonly) return; addOptionForPluginPB (plugin, name, groups, subgroups, option); } static void initOptionsFromPB (CCSPlugin * plugin, const PluginMetadata & pluginPB) { if (pluginPB.has_screen ()) { const ScreenMetadata &screenPB = pluginPB.screen (); // Screen options int i, numOpt = screenPB.option_size (); for (i = 0; i < numOpt; ++i) addOptionFromPB (plugin, screenPB.group_desc (), screenPB.subgroup_desc (), screenPB.option (i)); } } static void addStringsFromPB (CCSStringList * list, const StringList & strings) { StringList::const_iterator it; for (it = strings.begin (); it != strings.end (); ++it) { const char *value = (*it).c_str (); if (strlen (value)) { CCSString *str = (CCSString *) calloc (1, sizeof (CCSString)); str->value = strdup (value); str->refCount = 1; *list = ccsStringListAppend (*list, str); } } } static void addStringExtensionFromPB (CCSPlugin * plugin, const ExtensionMetadata & extensionPB) { CCSStrExtension *extension; extension = (CCSStrExtension *) calloc (1, sizeof (CCSStrExtension)); if (!extension) return; extension->refCount = 1; extension->restriction = NULL; extension->basePlugin = strdup (extensionPB.base_plugin ().c_str ()); addStringsFromPB (&extension->baseSettings, extensionPB.base_option ()); int numRestrictions = extensionPB.str_restriction_size (); if (!numRestrictions) { free (extension); return; } for (int j = 0; j < numRestrictions; ++j) { const OptionMetadata::StringRestriction & restrictionPB = extensionPB.str_restriction (j); const char *value = restrictionPB.value ().c_str (); const char *name = restrictionPB.name ().c_str (); ccsAddRestrictionToStringExtension (extension, name, value); } CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->stringExtensions = ccsStrExtensionListAppend (pPrivate->stringExtensions, extension); } static void initStringExtensionsFromPB (CCSPlugin * plugin, const PluginMetadata & pluginPB) { int numExtensions; numExtensions = pluginPB.extension_size (); for (int i = 0; i < numExtensions; ++i) addStringExtensionFromPB (plugin, pluginPB.extension (i)); } static void initRulesFromPB (CCSPlugin * plugin, const PluginInfoMetadata & pluginInfoPB) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin) addStringsFromPB (&pPrivate->providesFeature, pluginInfoPB.feature ()); if (!pluginInfoPB.has_deps ()) return; const DependenciesMetadata & deps = pluginInfoPB.deps (); addStringsFromPB (&pPrivate->loadAfter, deps.after_plugin ()); addStringsFromPB (&pPrivate->loadBefore, deps.before_plugin ()); addStringsFromPB (&pPrivate->requiresPlugin, deps.require_plugin ()); addStringsFromPB (&pPrivate->requiresFeature, deps.require_feature ()); addStringsFromPB (&pPrivate->conflictPlugin, deps.conflict_plugin ()); addStringsFromPB (&pPrivate->conflictFeature, deps.conflict_feature ()); } static void addPluginFromPB (CCSContext * context, const PluginInfoMetadata & pluginInfoPB, char *file, char *xmlFile) { const char *name; CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); name = pluginInfoPB.name ().c_str (); if (!strlen (name)) return; if (ccsFindPlugin (context, name)) return; if (!strcmp (name, "ini") || !strcmp (name, "ccp") || !strcmp (name, "kconfig")) return; plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return; } pPrivate->loaded = FALSE; ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->pbFilePath = strdup (file); if (xmlFile) { pPrivate->xmlFile = strdup (xmlFile); if (asprintf (&pPrivate->xmlPath, "/compiz/plugin[@name = '%s']", name) == -1) pPrivate->xmlPath = NULL; } pPrivate->context = context; pPrivate->name = strdup (name); if (!basicMetadata) { pPrivate->shortDesc = strdup (pluginInfoPB.has_short_desc () ? pluginInfoPB.short_desc ().c_str () : name); pPrivate->longDesc = strdup (pluginInfoPB.has_long_desc () ? pluginInfoPB.long_desc ().c_str () : name); pPrivate->category = strdup (pluginInfoPB.has_category () ? pluginInfoPB.category ().c_str () : ""); } else { pPrivate->shortDesc = strdup (name); pPrivate->longDesc = strdup (name); pPrivate->category = strdup (""); } initRulesFromPB (plugin, pluginInfoPB); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); } static void addCoreSettingsFromPB (CCSContext * context, const PluginInfoMetadata & pluginInfoPB, char *file, char *xmlFile) { CCSPlugin *plugin; CCSPluginPrivate *pPrivate; if (ccsFindPlugin (context, "core")) return; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); plugin = (CCSPlugin*) calloc (1, sizeof (CCSPlugin)); if (!plugin) return; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->pbFilePath = strdup (file); if (xmlFile) { pPrivate->xmlFile = strdup (xmlFile); pPrivate->xmlPath = strdup ("/compiz/core"); } pPrivate->context = context; pPrivate->name = strdup ("core"); pPrivate->category = strdup ("General"); if (!basicMetadata) { pPrivate->shortDesc = strdup (pluginInfoPB.has_short_desc () ? pluginInfoPB.short_desc ().c_str () : "General Options"); pPrivate->longDesc = strdup (pluginInfoPB.has_long_desc () ? pluginInfoPB.long_desc ().c_str () : "General Compiz Options"); } else { pPrivate->shortDesc = strdup ("General Options"); pPrivate->longDesc = strdup ("General Compiz Options"); } initRulesFromPB (plugin, pluginInfoPB); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); } #endif static int pluginNameFilter (const struct dirent *name) { int length = strlen (name->d_name); if (length < 7) return 0; if (strncmp (name->d_name, "lib", 3) || strncmp (name->d_name + length - 3, ".so", 3)) return 0; return 1; } static int pluginXMLFilter (const struct dirent *name) { int length = strlen (name->d_name); if (length < 5) return 0; if (strncmp (name->d_name + length - 4, ".xml", 4)) return 0; return 1; } /* XML parsing */ static CCSSettingType getOptionType (const char *name) { static struct _TypeMap { const char *name; CCSSettingType type; } map[] = { { "bool", TypeBool }, { "int", TypeInt }, { "float", TypeFloat }, { "string", TypeString }, { "color", TypeColor }, { "action", TypeAction }, { "key", TypeKey }, { "button", TypeButton }, { "edge", TypeEdge }, { "bell", TypeBell }, { "match", TypeMatch }, { "list", TypeList } }; for (unsigned i = 0; i < sizeof (map) / sizeof (map[0]); ++i) if (strcasecmp (name, map[i].name) == 0) return map[i].type; return TypeNum; } static char * getStringFromXPath (xmlDoc * doc, xmlNode * base, const char *path) { xmlXPathObjectPtr xpathObj; xmlXPathContextPtr xpathCtx; char *rv = NULL; xpathCtx = xmlXPathNewContext (doc); if (!xpathCtx) return NULL; if (base) xpathCtx->node = base; xpathObj = xmlXPathEvalExpression (BAD_CAST path, xpathCtx); if (!xpathObj) { xmlXPathFreeContext (xpathCtx); return NULL; } xpathObj = xmlXPathConvertString (xpathObj); if (xpathObj->type == XPATH_STRING && xpathObj->stringval && strlen ((char *) xpathObj->stringval)) { rv = strdup ((char *) xpathObj->stringval); } xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return rv; } static xmlNode ** getNodesFromXPath (xmlDoc * doc, xmlNode * base, const char *path, int *num) { xmlXPathObjectPtr xpathObj; xmlXPathContextPtr xpathCtx; xmlNode **rv = NULL; int size; *num = 0; xpathCtx = xmlXPathNewContext (doc); if (!xpathCtx) return NULL; if (base) xpathCtx->node = base; xpathObj = xmlXPathEvalExpression (BAD_CAST path, xpathCtx); if (!xpathObj) { xmlXPathFreeContext (xpathCtx); return NULL; } size = (xpathObj->nodesetval) ? xpathObj->nodesetval->nodeNr : 0; if (!size) { xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return NULL; } rv = (xmlNode **) malloc (size * sizeof (xmlNode *)); if (!rv) { xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return NULL; } *num = size; for (int i = 0; i < size; ++i) rv[i] = xpathObj->nodesetval->nodeTab[i]; xmlXPathFreeObject (xpathObj); xmlXPathFreeContext (xpathCtx); return rv; } static Bool nodeExists (xmlNode * node, const char *path) { xmlNode **nodes = NULL; int num; nodes = getNodesFromXPath (node->doc, node, path, &num); if (num) { free (nodes); return TRUE; } return FALSE; } static char * stringFromNodeDef (xmlNode * node, const char *path, const char *def) { char *val; char *rv = NULL; val = getStringFromXPath (node->doc, node, path); if (val) { rv = strdup (val); free (val); } else if (def) rv = strdup (def); return rv; } static char * stringFromNodeDefTrans (xmlNode * node, const char *path, const char *def) { const char *lang = getLocale (); char newPath[1024]; char *rv = NULL; if (!lang || !strlen (lang)) return stringFromNodeDef (node, path, def); snprintf (newPath, 1023, "%s[lang('%s')]", path, lang); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; snprintf (newPath, 1023, "%s[lang(substring-before('%s','.'))]", path, lang); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; snprintf (newPath, 1023, "%s[lang(substring-before('%s','_'))]", path, lang); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; snprintf (newPath, 1023, "%s[lang('C')]", path); rv = stringFromNodeDef (node, newPath, NULL); if (rv) return rv; return stringFromNodeDef (node, path, def); } static void initBoolValue (CCSSettingValue * v, xmlNode * node, void * valuePBv) { char *value; v->value.asBool = FALSE; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { if (strcasecmp ((char *) value, "true") == 0) { v->value.asBool = TRUE; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_bool_value (TRUE); #endif } free (value); } } static void initIntValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; v->value.asInt = (i->forInt.min + i->forInt.max) / 2; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { int val = strtol ((char *) value, NULL, 0); if (val >= i->forInt.min && val <= i->forInt.max) { v->value.asInt = val; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_int_value (val); #endif } free (value); } } static void initFloatValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; SetNumericLocale numeric_locale; v->value.asFloat = (i->forFloat.min + i->forFloat.max) / 2; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { float val = strtod ((char *) value, NULL); if (val >= i->forFloat.min && val <= i->forFloat.max) { v->value.asFloat = val; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_float_value (val); #endif } free (value); } } static void initStringValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { free (v->value.asString); v->value.asString = strdup (value); #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif free (value); } else v->value.asString = strdup (""); } static void initColorValue (CCSSettingValue * v, xmlNode * node, void * valuePBv) { char *value; memset (&v->value.asColor, 0, sizeof (v->value.asColor)); v->value.asColor.color.alpha = 0xffff; #ifdef USE_PROTOBUF OptionMetadata::ColorValue *colorPB = NULL; if (valuePBv) colorPB = ((GenericValueMetadata *) valuePBv)->mutable_color_value (); #endif value = getStringFromXPath (node->doc, node, "red/child::text()"); if (value) { int color = strtol ((char *) value, NULL, 0); v->value.asColor.color.red = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_red (value); #endif free (value); } value = getStringFromXPath (node->doc, node, "green/child::text()"); if (value) { int color = strtol ((char *) value, NULL, 0); v->value.asColor.color.green = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_green (value); #endif free (value); } value = getStringFromXPath (node->doc, node, "blue/child::text()"); if (value) { int color = strtol ((char *) value, NULL, 0); v->value.asColor.color.blue = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_blue (value); #endif free (value); } value = getStringFromXPath (node->doc, node, "alpha/child::text()"); if (value) { int color = strtol (value, NULL, 0); v->value.asColor.color.alpha = MAX (0, MIN (0xffff, color)); #ifdef USE_PROTOBUF if (colorPB) colorPB->set_alpha (value); #endif free (value); } } static void initMatchValue (CCSSettingValue * v, xmlNode * node, void * valuePBv) { char *value; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { free (v->value.asMatch); v->value.asMatch = strdup (value); #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif free (value); } else v->value.asMatch = strdup (""); } static void initKeyValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; memset (&v->value.asKey, 0, sizeof (v->value.asKey)); value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif if (strcasecmp (value, "disabled")) { ccsStringToKeyBinding (value, &v->value.asKey); } free (value); } } static void initButtonValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; memset (&v->value.asButton, 0, sizeof (v->value.asButton)); value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_string_value (value); #endif if (strcasecmp (value, "disabled")) { ccsStringToButtonBinding (value, &v->value.asButton); } free (value); } } static void initEdgeValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { xmlNode **nodes; char *value; int k, num; v->value.asEdge = 0; static const char *edge[] = { "Left", "Right", "Top", "Bottom", "TopLeft", "TopRight", "BottomLeft", "BottomRight" }; nodes = getNodesFromXPath (node->doc, node, "edge", &num); for (k = 0; k < num; ++k) { value = getStringFromXPath (node->doc, nodes[k], "@name"); if (value) { for (unsigned j = 0; j < sizeof (edge) / sizeof (edge[0]); ++j) { if (strcasecmp ((char *) value, edge[j]) == 0) v->value.asEdge |= (1 << j); } free (value); } } if (num) free (nodes); #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_edge_value (v->value.asEdge); #endif } static void initBellValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * valuePBv) { char *value; v->value.asBell = FALSE; value = getStringFromXPath (node->doc, node, "child::text()"); if (value) { if (!strcasecmp (value, "true")) { v->value.asBell = TRUE; #ifdef USE_PROTOBUF if (valuePBv) ((GenericValueMetadata *) valuePBv)->set_bool_value (TRUE); #endif } free (value); } } static void initListValue (CCSSettingValue * v, CCSSettingInfo * i, xmlNode * node, void * optionPBv) { xmlNode **nodes; int num; nodes = getNodesFromXPath (node->doc, node, "value", &num); if (num) { for (int j = 0; j < num; ++j) { void *valuePBv = NULL; #ifdef USE_PROTOBUF if (optionPBv) valuePBv = ((OptionMetadata *) optionPBv)->add_default_value (); #endif CCSSettingValue *val; val = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (!val) continue; val->refCount = 1; val->parent = v->parent; val->isListChild = TRUE; switch (i->forList.listType) { case TypeBool: initBoolValue (val, nodes[j], valuePBv); break; case TypeInt: initIntValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeFloat: initFloatValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeString: initStringValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeColor: initColorValue (val, nodes[j], valuePBv); break; case TypeKey: initKeyValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeButton: initButtonValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeEdge: initEdgeValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeBell: initBellValue (val, i->forList.listInfo, nodes[j], valuePBv); break; case TypeMatch: initMatchValue (val, nodes[j], valuePBv); default: break; } v->value.asList = ccsSettingValueListAppend (v->value.asList, val); } free (nodes); } } static void initIntInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; int num; i->forInt.min = std::numeric_limits ::min (); i->forInt.max = std::numeric_limits ::max (); i->forInt.desc = NULL; value = getStringFromXPath (node->doc, node, "min/child::text()"); if (value) { int val = strtol (value, NULL, 0); i->forInt.min = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_int_min (val); #endif } value = getStringFromXPath (node->doc, node, "max/child::text()"); if (value) { int val = strtol (value, NULL, 0); i->forInt.max = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_int_max (val); #endif } if (!basicMetadata) { xmlNode **nodes; nodes = getNodesFromXPath (node->doc, node, "desc", &num); if (num) { char *name; for (int j = 0; j < num; ++j) { value = getStringFromXPath (node->doc, nodes[j], "value/child::text()"); if (value) { int val = strtol (value, NULL, 0); free (value); if (val >= i->forInt.min && val <= i->forInt.max) { name = stringFromNodeDefTrans (nodes[j], "name/child::text()", NULL); if (name) { CCSIntDesc *intDesc; intDesc = (CCSIntDesc *) calloc (1, sizeof (CCSIntDesc)); if (intDesc) { intDesc->refCount = 1; intDesc->name = strdup (name); intDesc->value = val; i->forInt.desc = ccsIntDescListAppend (i->forInt.desc, intDesc); #ifdef USE_PROTOBUF if (optionPBv) { OptionMetadata::IntDescription *intDescPB = ((OptionMetadata *) optionPBv)-> add_int_desc (); intDescPB->set_value (val); intDescPB->set_name (name); } #endif } free (name); } } } } free (nodes); } } } static void initFloatInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; SetNumericLocale numeric_locale; i->forFloat.min = std::numeric_limits ::min (); i->forFloat.max = std::numeric_limits ::max (); i->forFloat.precision = 0.1f; value = getStringFromXPath (node->doc, node, "min/child::text()"); if (value) { float val = strtod (value, NULL); i->forFloat.min = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_float_min (val); #endif } value = getStringFromXPath (node->doc, node, "max/child::text()"); if (value) { float val = strtod (value, NULL); i->forFloat.max = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_float_max (val); #endif } value = getStringFromXPath (node->doc, node, "precision/child::text()"); if (value) { float val = strtod (value, NULL); i->forFloat.precision = val; free (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_precision (val); #endif } } static void initStringInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { int num; i->forString.restriction = NULL; i->forString.sortStartsAt = -1; i->forString.extensible = FALSE; if (!basicMetadata) { if (nodeExists (node, "extensible")) { i->forString.extensible = TRUE; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_extensible (TRUE); #endif } xmlNode **nodes; nodes = getNodesFromXPath (node->doc, node, "sort", &num); if (num) { char *value; int val = 0; /* Start sorting at 0 unless otherwise specified. */ value = getStringFromXPath (node->doc, nodes[0], "@start"); if (value) { /* Custom starting value specified. */ val = strtol (value, NULL, 0); if (val < 0) val = 0; free (value); } i->forString.sortStartsAt = val; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_sort_start (val); #endif free (nodes); } nodes = getNodesFromXPath (node->doc, node, "restriction", &num); if (num) { char *name, *value; for (int j = 0; j < num; ++j) { #ifdef USE_PROTOBUF OptionMetadata::StringRestriction * strRestrictionPB = NULL; if (optionPBv) strRestrictionPB = ((OptionMetadata *) optionPBv)->add_str_restriction (); #endif value = getStringFromXPath (node->doc, nodes[j], "value/child::text()"); if (value) { name = stringFromNodeDefTrans (nodes[j], "name/child::text()", NULL); if (name) { ccsAddRestrictionToStringInfo (&i->forString, name, value); #ifdef USE_PROTOBUF if (strRestrictionPB) { strRestrictionPB->set_value (value); strRestrictionPB->set_name (name); } #endif free (name); } free (value); } } free (nodes); } } } static void initListInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; CCSSettingInfo *info; i->forList.listType = TypeBool; i->forList.listInfo = NULL; value = getStringFromXPath (node->doc, node, "type/child::text()"); if (!value) return; i->forList.listType = getOptionType (value); #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_list_type ((OptionMetadata::Type) i->forList.listType); #endif free (value); switch (i->forList.listType) { case TypeInt: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initIntInfo (info, node, optionPBv); i->forList.listInfo = info; } break; case TypeFloat: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initFloatInfo (info, node, optionPBv); i->forList.listInfo = info; } break; case TypeString: { info = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); if (info) initStringInfo (info, node, optionPBv); i->forList.listInfo = info; } break; default: break; } } static void initActionInfo (CCSSettingInfo * i, xmlNode * node, void * optionPBv) { char *value; i->forAction.internal = FALSE; value = getStringFromXPath (node->doc, node, "internal/child::text()"); if (value) { if (strcasecmp (value, "true") == 0) { i->forAction.internal = TRUE; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_internal (TRUE); #endif } free (value); return; } if (nodeExists (node, "internal")) { i->forAction.internal = TRUE; #ifdef USE_PROTOBUF if (optionPBv) ((OptionMetadata *) optionPBv)->set_internal (TRUE); #endif } } #ifdef USE_PROTOBUF static void checkAddGroupSubgroup (OptionMetadata *optPB, StringList *descList, char *name, Bool isGroup) { // Check if group has the same name as the last group in the groups list int len = descList->size (); if (len > 0 && strcmp (name, descList->Get (len - 1).c_str ()) == 0) { if (isGroup) optPB->set_group_id (len - 1); else optPB->set_subgroup_id (len - 1); } else { // Add new group to the list descList->Add ()->assign (name); if (isGroup) optPB->set_group_id (len); else optPB->set_subgroup_id (len); } } static Bool createProtoBufCacheDir () { if (metadataCacheDir.length () > 0) { // Cache dir must have been created already, since otherwise it would // be "". So we can return here. return TRUE; } char *cacheBaseDir = NULL; char *cacheHome = getenv ("XDG_CACHE_HOME"); if (cacheHome && strlen (cacheHome)) { if (asprintf (&cacheBaseDir, "%s", cacheHome) == -1) cacheBaseDir = NULL; } else { char *home = getenv ("HOME"); if (home && strlen (home)) { if (asprintf (&cacheBaseDir, "%s/.cache", home) == -1) cacheBaseDir = NULL; } } if (cacheBaseDir) { metadataCacheDir = cacheBaseDir; if (metadataCacheDir[metadataCacheDir.length () - 1] != '/') metadataCacheDir += "/"; metadataCacheDir += "compizconfig-1"; std::string metadataCacheFileDummy = metadataCacheDir + "/dummy"; // Create cache dir Bool success = ccsCreateDirFor (metadataCacheFileDummy.c_str ()); if (!success) ccsError ("Error creating directory \"%s\"", metadataCacheDir.c_str ()); free (cacheBaseDir); if (success) return TRUE; // metadataCacheDir will be used later in this case metadataCacheDir = ""; // invalidate metadataCacheDir } usingProtobuf = FALSE; // Disable protobuf if cache dir cannot be created return FALSE; } #endif static void addOptionForPlugin (CCSPlugin * plugin, char * name, char * type, Bool isReadonly, xmlNode * node, void * groupListPBv, void * subgroupListPBv, void * optionPBv) { xmlNode **nodes; int num = 0; CCSSetting *setting; if (ccsFindSetting (plugin, name)) { ccsError ("Option \"%s\" already defined", name); return; } if (getOptionType (type) == TypeNum) return; CCSContext *context = ccsPluginGetContext (plugin); CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); setting = (CCSSetting *) calloc (1, sizeof (CCSSetting)); if (!setting) return; ccsObjectInit (setting, &ccsDefaultObjectAllocator); CCSSettingPrivate *ccsPrivate = (CCSSettingPrivate *) calloc (1, sizeof (CCSSettingPrivate)); if (!ccsPrivate) { free (setting); return; } ccsObjectSetPrivate (setting, (CCSPrivate *) ccsPrivate); ccsObjectAddInterface (setting, (CCSInterface *) cPrivate->object_interfaces->settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); ccsSettingRef (setting); CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting) sPrivate->parent = plugin; sPrivate->isDefault = TRUE; sPrivate->name = strdup (name); if (!basicMetadata) { sPrivate->shortDesc = stringFromNodeDefTrans (node, "short/child::text()", name); sPrivate->longDesc = stringFromNodeDefTrans (node, "long/child::text()", ""); sPrivate->hints = stringFromNodeDef (node, "hints/child::text()", ""); sPrivate->group = stringFromNodeDefTrans (node, "ancestor::group/short/child::text()", ""); sPrivate->subGroup = stringFromNodeDefTrans (node, "ancestor::subgroup/short/child::text()", ""); } else { sPrivate->shortDesc = strdup (name); sPrivate->longDesc = strdup (""); sPrivate->hints = strdup (""); sPrivate->group = strdup (""); sPrivate->subGroup = strdup (""); } sPrivate->type = getOptionType (type); #ifdef USE_PROTOBUF OptionMetadata *optPB = NULL; if (optionPBv) { optPB = (OptionMetadata *) optionPBv; optPB->set_name (name); optPB->set_type ((OptionMetadata::Type) sPrivate->type); if (isReadonly) optPB->set_read_only (isReadonly); optPB->set_short_desc (sPrivate->shortDesc); optPB->set_long_desc (sPrivate->longDesc); if (strlen (sPrivate->hints) > 0) optPB->set_hints (sPrivate->hints); if (groupListPBv && strlen (sPrivate->group) > 0) checkAddGroupSubgroup (optPB, (StringList *) groupListPBv, sPrivate->group, TRUE); if (subgroupListPBv && strlen (sPrivate->subGroup) > 0) checkAddGroupSubgroup (optPB, (StringList *) subgroupListPBv, sPrivate->subGroup, FALSE); } #endif sPrivate->value = &sPrivate->defaultValue; sPrivate->defaultValue.parent = setting; switch (sPrivate->type) { case TypeInt: initIntInfo (&sPrivate->info, node, optionPBv); break; case TypeFloat: initFloatInfo (&sPrivate->info, node, optionPBv); break; case TypeString: initStringInfo (&sPrivate->info, node, optionPBv); break; case TypeList: initListInfo (&sPrivate->info, node, optionPBv); break; case TypeKey: case TypeButton: case TypeEdge: case TypeBell: initActionInfo (&sPrivate->info, node, optionPBv); break; default: break; } nodes = getNodesFromXPath (node->doc, node, "default", &num); if (num) { void * valuePBv = NULL; #ifdef USE_PROTOBUF if (optPB && sPrivate->type != TypeList) valuePBv = optPB->add_default_value (); #endif switch (sPrivate->type) { case TypeInt: initIntValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeBool: initBoolValue (&sPrivate->defaultValue, nodes[0], valuePBv); break; case TypeFloat: initFloatValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeString: initStringValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeColor: initColorValue (&sPrivate->defaultValue, nodes[0], valuePBv); break; case TypeKey: initKeyValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeButton: initButtonValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeEdge: initEdgeValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeBell: initBellValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], valuePBv); break; case TypeMatch: initMatchValue (&sPrivate->defaultValue, nodes[0], valuePBv); break; case TypeList: initListValue (&sPrivate->defaultValue, &sPrivate->info, nodes[0], optionPBv); break; default: break; } } else { /* if we have no set defaults, we have at least to set the string defaults to empty strings */ switch (sPrivate->type) { case TypeString: sPrivate->defaultValue.value.asString = strdup (""); break; case TypeMatch: sPrivate->defaultValue.value.asMatch = strdup (""); break; default: break; } } if (nodes) free (nodes); if (isReadonly) { // Will come here only when protobuf is enabled ccsFreeSetting (setting); return; } // printSetting (setting); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting); } static void addOptionFromXMLNode (CCSPlugin * plugin, xmlNode * node, void * groupListPBv, void * subgroupListPBv, void * optionPBv) { char *name; char *type; char *readonly; Bool isReadonly; if (!node) return; name = getStringFromXPath (node->doc, node, "@name"); type = getStringFromXPath (node->doc, node, "@type"); readonly = getStringFromXPath (node->doc, node, "@read_only"); isReadonly = readonly && !strcmp (readonly, "true"); // If optionPBv is non-NULL, we still want to get the option info to write // to .pb file, so we don't return immediately in that case. if (!name || !strlen (name) || !type || !strlen (type) || (!optionPBv && isReadonly)) { if (name) free (name); if (type) free (type); if (readonly) free (readonly); return; } addOptionForPlugin (plugin, name, type, isReadonly, node, groupListPBv, subgroupListPBv, optionPBv); free (name); free (type); if (readonly) free (readonly); } static void initScreenFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginPBv) { xmlNode **nodes; xmlNode **optNodes; int num; void *groupListPBv = NULL; void *subgroupListPBv = NULL; nodes = getNodesFromXPath (node->doc, node, "options", &num); if (!num) return; #ifdef USE_PROTOBUF ScreenMetadata *screenPB = NULL; if (pluginPBv) { PluginMetadata *pluginPB = (PluginMetadata *) pluginPBv; screenPB = pluginPB->mutable_screen (); groupListPBv = screenPB->mutable_group_desc (); subgroupListPBv = screenPB->mutable_subgroup_desc (); } #endif optNodes = getNodesFromXPath (node->doc, nodes[0], "option | group/subgroup/option | group/option | subgroup/option", &num); if (num) { for (int i = 0; i < num; ++i) { void *optionPBv = NULL; #ifdef USE_PROTOBUF if (screenPB) optionPBv = screenPB->add_option (); #endif addOptionFromXMLNode (plugin, optNodes[i], groupListPBv, subgroupListPBv, optionPBv); } free (optNodes); } free (nodes); } static inline void initOptionsFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginPBv) { // For all optiond initScreenFromRootNode (plugin, node, pluginPBv); } static void addStringsFromPath (CCSStringList * list, const char * path, xmlNode * node, void * stringListPBv) { xmlNode **nodes; int num; nodes = getNodesFromXPath (node->doc, node, path, &num); if (num) { for (int i = 0; i < num; ++i) { char *value = stringFromNodeDef (nodes[i], "child::text()", NULL); if (value && strlen (value)) { CCSString *str = (CCSString *) calloc (1, sizeof (CCSString)); str->value = value; str->refCount = 1; *list = ccsStringListAppend (*list, str); #ifdef USE_PROTOBUF if (stringListPBv) ((StringList *) stringListPBv)->Add ()->assign (value); #endif } if (value && !strlen (value)) free (value); } free (nodes); } } static void addStringExtensionFromXMLNode (CCSPlugin * plugin, xmlNode * node, void * extensionPBv) { xmlNode **nodes; int num; CCSStrExtension *extension; char *name; char *value; void * stringListPBv = NULL; extension = (CCSStrExtension *) calloc (1, sizeof (CCSStrExtension)); if (!extension) return; extension->refCount = 1; extension->restriction = NULL; extension->basePlugin = getStringFromXPath (node->doc, node, "@base_plugin"); if (!extension->basePlugin) extension->basePlugin = strdup (""); #ifdef USE_PROTOBUF ExtensionMetadata * extensionPB = NULL; if (extensionPBv) { extensionPB = (ExtensionMetadata *) extensionPBv; extensionPB->set_base_plugin (extension->basePlugin); stringListPBv = extensionPB->mutable_base_option (); } #endif addStringsFromPath (&extension->baseSettings, "base_option", node, stringListPBv); nodes = getNodesFromXPath (node->doc, node, "restriction", &num); if (!num) { free (extension); return; } for (int j = 0; j < num; ++j) { value = getStringFromXPath (node->doc, nodes[j], "value/child::text()"); if (value) { name = stringFromNodeDefTrans (nodes[j], "name/child::text()", NULL); if (name) { ccsAddRestrictionToStringExtension (extension, name, value); #ifdef USE_PROTOBUF if (extensionPB) { OptionMetadata::StringRestriction *strRestrictionPB = extensionPB->add_str_restriction (); strRestrictionPB->set_value (value); strRestrictionPB->set_name (name); } #endif free (name); } free (value); } } free (nodes); CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); pPrivate->stringExtensions = ccsStrExtensionListAppend (pPrivate->stringExtensions, extension); } static void initStringExtensionsFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginPBv) { xmlNode **nodes; int num; nodes = getNodesFromXPath (node->doc, node, "/compiz/*/extension", &num); for (int i = 0; i < num; ++i) { void *extensionPBv = NULL; #ifdef USE_PROTOBUF if (pluginPBv) { PluginMetadata *pluginPB = (PluginMetadata *) pluginPBv; extensionPBv = pluginPB->add_extension (); } #endif addStringExtensionFromXMLNode (plugin, nodes[i], extensionPBv); } free (nodes); } static void initRulesFromRootNode (CCSPlugin * plugin, xmlNode * node, void * pluginInfoPBv) { void *featureListPBv = NULL; void *pluginAfterListPBv = NULL; void *pluginBeforeListPBv = NULL; void *requirePluginListPBv = NULL; void *requireFeatureListPBv = NULL; void *conflictPluginListPBv = NULL; void *conflictFeatureListPBv = NULL; #ifdef USE_PROTOBUF if (pluginInfoPBv) { PluginInfoMetadata *pluginInfoPB = (PluginInfoMetadata *) pluginInfoPBv; featureListPBv = pluginInfoPB->mutable_feature (); DependenciesMetadata *deps = pluginInfoPB->mutable_deps (); pluginAfterListPBv = deps->mutable_after_plugin (); pluginBeforeListPBv = deps->mutable_before_plugin (); requirePluginListPBv = deps->mutable_require_plugin (); requireFeatureListPBv = deps->mutable_require_feature (); conflictPluginListPBv = deps->mutable_conflict_plugin (); conflictFeatureListPBv = deps->mutable_conflict_feature (); } #endif CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); addStringsFromPath (&pPrivate->providesFeature, "feature", node, featureListPBv); addStringsFromPath (&pPrivate->loadAfter, "deps/relation[@type = 'after']/plugin", node, pluginAfterListPBv); addStringsFromPath (&pPrivate->loadBefore, "deps/relation[@type = 'before']/plugin", node, pluginBeforeListPBv); addStringsFromPath (&pPrivate->requiresPlugin, "deps/requirement/plugin", node, requirePluginListPBv); addStringsFromPath (&pPrivate->requiresFeature, "deps/requirement/feature", node, requireFeatureListPBv); addStringsFromPath (&pPrivate->conflictPlugin, "deps/conflict/plugin", node, conflictPluginListPBv); addStringsFromPath (&pPrivate->conflictFeature, "deps/conflict/feature", node, conflictFeatureListPBv); } #ifdef USE_PROTOBUF static void fillBasicInfoIntoPB (CCSPlugin *plugin, PluginInfoMetadata *pluginInfoPB) { if (!pluginInfoPB) return; pluginInfoPB->set_name (ccsPluginGetName (plugin)); pluginInfoPB->set_short_desc (ccsPluginGetShortDesc (plugin)); pluginInfoPB->set_long_desc (ccsPluginGetLongDesc (plugin)); pluginInfoPB->set_category (ccsPluginGetCategory (plugin)); } #endif /* Returns TRUE on success. */ static Bool addPluginFromXMLNode (CCSContext * context, xmlNode * node, char * file, void * pluginInfoPBv) { char *name; CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!node) return FALSE; name = getStringFromXPath (node->doc, node, "@name"); if (!name || !strlen (name)) { if (name) free (name); return FALSE; } if (!strcmp (name, "ini") || !strcmp (name, "ccp") || !strcmp (name, "kconfig")) { free (name); return FALSE; } if (ccsFindPlugin (context, name)) { free (name); return FALSE; } plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return FALSE; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return FALSE; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->xmlFile = strdup (file); if (asprintf (&pPrivate->xmlPath, "/compiz/plugin[@name = '%s']", name) == -1) pPrivate->xmlPath = NULL; pPrivate->context = context; pPrivate->name = strdup (name); if (!basicMetadata) { pPrivate->shortDesc = stringFromNodeDefTrans (node, "short/child::text()", name); pPrivate->longDesc = stringFromNodeDefTrans (node, "long/child::text()", name); pPrivate->category = stringFromNodeDef (node, "category/child::text()", ""); } else { pPrivate->shortDesc = strdup (name); pPrivate->longDesc = strdup (name); pPrivate->category = strdup (""); } #ifdef USE_PROTOBUF fillBasicInfoIntoPB (plugin, (PluginInfoMetadata *) pluginInfoPBv); #endif initRulesFromRootNode (plugin, node, pluginInfoPBv); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); free (name); return TRUE; } /* Returns TRUE on success. */ static Bool addCoreSettingsFromXMLNode (CCSContext * context, xmlNode * node, char *file, void * pluginInfoPBv) { CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (!node) return FALSE; if (ccsFindPlugin (context, "core")) return FALSE; plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return FALSE; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return FALSE; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); if (file) pPrivate->xmlFile = strdup (file); pPrivate->xmlPath = strdup ("/compiz/plugin[@name='core']"); pPrivate->context = context; pPrivate->name = strdup ("core"); pPrivate->category = strdup ("General"); if (!basicMetadata) { pPrivate->shortDesc = stringFromNodeDefTrans (node, "short/child::text()", "General Options"); pPrivate->longDesc = stringFromNodeDefTrans (node, "long/child::text()", "General Compiz Options"); } else { pPrivate->shortDesc = strdup ("General Options"); pPrivate->longDesc = strdup ("General Compiz Options"); } #ifdef USE_PROTOBUF fillBasicInfoIntoPB (plugin, (PluginInfoMetadata *) pluginInfoPBv); #endif initRulesFromRootNode (plugin, node, pluginInfoPBv); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); return TRUE; } /* End of XML parsing */ #ifdef USE_PROTOBUF // Either pluginMinMetadata or pluginMetadata should be non-NULL static Bool loadPluginMetadataFromProtoBuf (char *pbPath, PluginBriefMetadata *pluginMinMetadata, PluginMetadata *pluginMetadata) { Bool success = FALSE; FILE *pbFile = fopen (pbPath, "rb"); if (pbFile) { google::protobuf::io::FileInputStream inputStream (fileno (pbFile)); if ((pluginMinMetadata && pluginMinMetadata->ParseFromZeroCopyStream (&inputStream)) || (pluginMetadata && pluginMetadata->ParseFromZeroCopyStream (&inputStream))) success = TRUE; inputStream.Close (); fclose (pbFile); } return success; } // Returns TRUE if successfully loads .pb file and .pb is up to date. static Bool checkAndLoadProtoBuf (char *pbPath, struct stat *pbStat, struct stat *xmlStat, PluginBriefMetadata *pluginBriefPB) { const PluginInfoMetadata &pluginInfoPB = pluginBriefPB->info (); if (pbStat->st_mtime < xmlStat->st_mtime || // is .pb older than .xml? !loadPluginMetadataFromProtoBuf (pbPath, pluginBriefPB, NULL) || (!basicMetadata && pluginBriefPB->info ().basic_metadata ()) || pluginInfoPB.pb_abi_version () != PB_ABI_VERSION || pluginInfoPB.time () != (unsigned long)xmlStat->st_mtime || // xml modification time mismatch? (pluginInfoPB.locale () != "NONE" && pluginInfoPB.locale () != shortLocale)) { // .pb needs update return FALSE; } return TRUE; } // Write .pb data to .pb file static void writePBFile (char *pbFilePath, PluginMetadata *pluginPB, PluginBriefMetadata *pluginBriefPB, struct stat *xmlStat) { if (!createProtoBufCacheDir ()) return; PluginInfoMetadata *pluginInfoPB; if (pluginPB) { pluginInfoPB = pluginPB->mutable_info (); pluginInfoPB->set_brief_metadata (FALSE); } else { pluginInfoPB = pluginBriefPB->mutable_info (); pluginInfoPB->set_pb_abi_version (PB_ABI_VERSION); pluginInfoPB->set_locale (shortLocale); pluginInfoPB->set_time ((unsigned long)xmlStat->st_mtime); pluginInfoPB->set_brief_metadata (TRUE); } pluginInfoPB->set_basic_metadata (basicMetadata); FILE *pbFile = fopen (pbFilePath, "wb"); if (pbFile) { google::protobuf::io::FileOutputStream outputStream (fileno (pbFile)); if (pluginPB) pluginPB->SerializeToZeroCopyStream (&outputStream); else pluginBriefPB->SerializeToZeroCopyStream (&outputStream); outputStream.Close (); fclose (pbFile); } } #endif /* Returns TRUE on success. */ static Bool loadPluginFromXML (CCSContext * context, xmlDoc * doc, char *filename, void * pluginInfoPBv) { xmlNode **nodes; int num; Bool success = FALSE; nodes = getNodesFromXPath (doc, NULL, "/compiz/plugin[@name='core']", &num); if (num) { success = addCoreSettingsFromXMLNode (context, nodes[0], filename, pluginInfoPBv); free (nodes); return success; } nodes = getNodesFromXPath (doc, NULL, "/compiz/plugin", &num); if (num) { success = addPluginFromXMLNode (context, nodes[0], filename, pluginInfoPBv); free (nodes); } return success; } #ifdef USE_PROTOBUF static void updatePBFilePath (CCSContext * context, char *name, char *pbFilePath) { CCSPlugin *plugin = ccsFindPlugin (context, name); if (plugin) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (pPrivate->pbFilePath) free (pPrivate->pbFilePath); pPrivate->pbFilePath = strdup (pbFilePath); } } #endif static void loadPluginFromXMLFile (CCSContext * context, char *xmlName, char *xmlDirPath) { char *xmlFilePath = NULL; void *pluginInfoPBv = NULL; if (asprintf (&xmlFilePath, "%s/%s", xmlDirPath, xmlName) == -1) xmlFilePath = NULL; if (!xmlFilePath) { ccsError ("Can't allocate memory"); return; } #ifdef USE_PROTOBUF char *name = NULL; char *pbFilePath = NULL; struct stat xmlStat; Bool removePB = FALSE; if (usingProtobuf) { if (stat (xmlFilePath, &xmlStat)) { free (xmlFilePath); return; } // Check if the corresponding .pb exists in cache Bool error = TRUE; struct stat pbStat; name = strndup (xmlName, strlen (xmlName) - 4); if (!name) { ccsError ("Can't allocate memory"); free (xmlFilePath); return; } if (createProtoBufCacheDir () && metadataCacheDir.length () > 0) { if (asprintf (&pbFilePath, "%s/%s.pb", metadataCacheDir.c_str (), name) == -1) pbFilePath = NULL; if (!pbFilePath) { ccsError ("Can't allocate memory"); free (xmlFilePath); free (name); return; } error = stat (pbFilePath, &pbStat); } if (!error) { if (checkAndLoadProtoBuf (pbFilePath, &pbStat, &xmlStat, &persistentPluginBriefPB)) { // Found and loaded .pb if (!strcmp (name, "core")) addCoreSettingsFromPB (context, persistentPluginBriefPB.info (), pbFilePath, xmlFilePath); else addPluginFromPB (context, persistentPluginBriefPB.info (), pbFilePath, xmlFilePath); updatePBFilePath (context, name, pbFilePath); free (xmlFilePath); free (pbFilePath); free (name); return; } else { removePB = TRUE; } } persistentPluginBriefPB.Clear (); pluginInfoPBv = persistentPluginBriefPB.mutable_info (); } #endif // Load from .xml int fd = open (xmlFilePath, O_RDONLY); #ifdef USE_PROTOBUF Bool xmlLoaded = FALSE; #endif if (-1 == fd) { ccsError ("error %d opening %s: %s", errno, xmlFilePath, strerror(errno)); } else { xmlDoc *doc = xmlReadFd (fd, xmlFilePath, NULL, 0); if (!doc) { ccsError ("error parsing %s", xmlFilePath); } else { #ifdef USE_PROTOBUF xmlLoaded = #endif loadPluginFromXML (context, doc, xmlFilePath, pluginInfoPBv); xmlFreeDoc (doc); } close (fd); } free (xmlFilePath); #ifdef USE_PROTOBUF if (usingProtobuf && xmlLoaded) { if (removePB) remove (pbFilePath); // Attempt to remove .pb writePBFile (pbFilePath, NULL, &persistentPluginBriefPB, &xmlStat); updatePBFilePath (context, name, pbFilePath); } if (pbFilePath) free (pbFilePath); if (name) free (name); #endif } static void loadPluginsFromXMLFiles (CCSContext * context, char *path) { struct dirent **nameList; int nFile; if (!path) return; #if defined(HAVE_SCANDIR_POSIX) // POSIX (2008) defines the comparison function like this: #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const dirent **, const dirent **))(d)); #else #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const void*,const void*))(d)); #endif nFile = scandir (path, &nameList, pluginXMLFilter, NULL); if (nFile <= 0) return; for (int i = 0; i < nFile; ++i) { loadPluginFromXMLFile (context, nameList[i]->d_name, path); free (nameList[i]); } free (nameList); } static void addPluginNamed (CCSContext * context, char *name) { CCSPlugin *plugin; CCSPluginPrivate *pPrivate; CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context); if (ccsFindPlugin (context, name)) return; if (!strcmp (name, "ini") || !strcmp (name, "ccp") || !strcmp (name, "kconfig")) return; plugin = (CCSPlugin *) calloc (1, sizeof (CCSPlugin)); if (!plugin) return; ccsObjectInit (plugin, &ccsDefaultObjectAllocator); ccsPluginRef (plugin); pPrivate = (CCSPluginPrivate *) calloc (1, sizeof (CCSPluginPrivate)); if (!pPrivate) { free (plugin); return; } ccsObjectSetPrivate (plugin, (CCSPrivate *) pPrivate); ccsObjectAddInterface (plugin, (CCSInterface *) cPrivate->object_interfaces->pluginInterface, GET_INTERFACE_TYPE (CCSPluginInterface)); pPrivate->context = context; pPrivate->name = strdup (name); if (!pPrivate->shortDesc) pPrivate->shortDesc = strdup (name); if (!pPrivate->longDesc) pPrivate->longDesc = strdup (name); if (!pPrivate->category) pPrivate->category = strdup (""); pPrivate->loaded = TRUE; collateGroups (pPrivate); cPrivate->plugins = ccsPluginListAppend (cPrivate->plugins, plugin); } static void loadPluginsFromName (CCSContext * context, char *path) { struct dirent **nameList; int nFile; if (!path) return; nFile = scandir (path, &nameList, pluginNameFilter, NULL); if (nFile <= 0) return; for (int i = 0; i < nFile; ++i) { char name[1024]; sscanf (nameList[i]->d_name, "lib%s", name); if (strlen (name) > 3) name[strlen (name) - 3] = 0; free (nameList[i]); addPluginNamed (context, name); } free (nameList); } #ifdef USE_PROTOBUF static inline void initPBLoading () { // Update usingProtobuf with the COMPIZ_NO_PROTOBUF environment variable char *compizNoProtobuf = getenv ("COMPIZ_NO_PROTOBUF"); usingProtobuf = !(compizNoProtobuf && (strcasecmp (compizNoProtobuf, "1") == 0 || strcasecmp (compizNoProtobuf, "yes") == 0 || strcasecmp (compizNoProtobuf, "true") == 0)); if (usingProtobuf) { // Verify that the version of the library that we linked against is // compatible with the version of the headers we compiled against. GOOGLE_PROTOBUF_VERIFY_VERSION; } } #endif Bool ccsLoadPluginDefault (CCSContext * context, char *name) { #ifdef USE_PROTOBUF initPBLoading (); #endif char *xmlDirPath = NULL; char *xmlName = NULL; if (asprintf (&xmlName, "%s.xml", name) == -1) xmlName = NULL; if (xmlName) { char *home = getenv ("HOME"); if (home && strlen (home)) { if (asprintf (&xmlDirPath, "%s/.compiz-1/metadata", home) == -1) xmlDirPath = NULL; if (xmlDirPath) { loadPluginFromXMLFile (context, xmlName, xmlDirPath); free (xmlDirPath); } } loadPluginFromXMLFile (context, xmlName, (char *) METADATADIR); free (xmlName); } return (ccsFindPlugin (context, name) != NULL); } Bool ccsLoadPlugin (CCSContext *context, char *name) { return (*(GET_INTERFACE (CCSContextInterface, context))->contextLoadPlugin) (context, name); } void ccsLoadPluginsDefault (CCSContext * context) { ccsDebug ("Adding plugins"); #ifdef USE_PROTOBUF initPBLoading (); #endif char *home = getenv ("HOME"); char *overload_metadata = getenv ("COMPIZ_METADATA_PATH"); if (overload_metadata && strlen (overload_metadata)) { char *overloadmetaplugins = NULL; if (asprintf (&overloadmetaplugins, "%s", overload_metadata) == -1) overloadmetaplugins = NULL; if (overloadmetaplugins) { loadPluginsFromXMLFiles (context, overloadmetaplugins); free (overloadmetaplugins); } } if (home && strlen (home)) { char *homeplugins = NULL; if (asprintf (&homeplugins, "%s/.compiz-1/metadata", home) == -1) homeplugins = NULL; if (homeplugins) { loadPluginsFromXMLFiles (context, homeplugins); free (homeplugins); } } loadPluginsFromXMLFiles (context, (char *)METADATADIR); if (home && strlen (home)) { char *homeplugins = NULL; if (asprintf (&homeplugins, "%s/.compiz-1/plugins", home) == -1) homeplugins = NULL; if (homeplugins) { loadPluginsFromName (context, homeplugins); free (homeplugins); } } loadPluginsFromName (context, (char *)PLUGINDIR); } void ccsLoadPlugins (CCSContext *context) { (*(GET_INTERFACE (CCSContextInterface, context))->contextLoadPlugins) (context); } static void loadOptionsStringExtensionsFromXML (CCSPlugin * plugin, void * pluginPBv, struct stat *xmlStat) { CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); int fd = open (pPrivate->xmlFile, O_RDONLY); if (-1 == fd) { ccsError ("error %d opening %s: %s", errno, pPrivate->xmlFile, strerror(errno)); return; } if (-1 == fstat (fd, xmlStat)) { ccsError ("error %d statting %s: %s", errno, pPrivate->xmlFile, strerror(errno)); close (fd); return; } xmlDoc *doc = xmlReadFd (fd, pPrivate->xmlFile, NULL, 0); if (!doc) { ccsError ("error parsing %s", pPrivate->xmlFile); } else { int num = 0; xmlNode **nodes = getNodesFromXPath (doc, NULL, pPrivate->xmlPath, &num); if (num) { initOptionsFromRootNode (plugin, nodes[0], pluginPBv); if (!basicMetadata) initStringExtensionsFromRootNode (plugin, nodes[0], pluginPBv); free (nodes); } xmlFreeDoc (doc); } close (fd); } void ccsLoadPluginSettings (CCSPlugin * plugin) { Bool ignoreXML = FALSE; void *pluginPBToWrite = NULL; #ifdef USE_PROTOBUF Bool loadedAtLeastBriefPB = FALSE; initPBLoading (); #endif CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin); if (pPrivate->loaded) return; pPrivate->loaded = TRUE; ccsDebug ("Initializing %s options...", pPrivate->name); #ifdef USE_PROTOBUF if (usingProtobuf && pPrivate->pbFilePath) { loadedAtLeastBriefPB = loadPluginMetadataFromProtoBuf (pPrivate->pbFilePath, NULL, &persistentPluginPB); if (loadedAtLeastBriefPB) { if (!persistentPluginPB.info ().brief_metadata () && (basicMetadata || !persistentPluginPB.info ().basic_metadata ())) { initOptionsFromPB (plugin, persistentPluginPB); if (!basicMetadata) initStringExtensionsFromPB (plugin, persistentPluginPB); ignoreXML = TRUE; } else pluginPBToWrite = &persistentPluginPB; } else pluginPBToWrite = &persistentPluginPB; } #endif struct stat xmlStat; // Load from .xml if (!ignoreXML && pPrivate->xmlFile) loadOptionsStringExtensionsFromXML (plugin, pluginPBToWrite, &xmlStat); #ifdef USE_PROTOBUF if (pluginPBToWrite && pPrivate->pbFilePath && loadedAtLeastBriefPB) writePBFile (pPrivate->pbFilePath, (PluginMetadata *) pluginPBToWrite, NULL, &xmlStat); #endif ccsDebug ("done"); collateGroups (pPrivate); ccsReadPluginSettings (plugin); } ./compizconfig/libcompizconfig/src/iniparser.c0000644000004100000410000005410413246301623022043 0ustar www-datawww-data/* Modified for libcompizconfig usage, by Sam Spilsbury (smspillaz@gmail.com) Based upon libiniparser, by Nicolas Devillard Hacked into 1 file (m-iniparser) by Freek/2005 Original terms following: -- - Copyright (c) 2000 by Nicolas Devillard (ndevilla AT free DOT fr). Written by Nicolas Devillard. Not derived from licensed software. Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. This notice may not be removed or altered. */ #include #include #include #include #include #include #include #include #include #include "iniparser.h" #ifdef __cplusplus extern "C" { #endif /* lock INI file access against concurrent access */ static FileLock* ini_file_lock (const char *fileName, Bool exclusive) { int fd; FileLock *lock; struct flock lockinfo; if (exclusive) fd = open (fileName, O_WRONLY | O_CREAT | O_TRUNC, 0666); else fd = open (fileName, O_RDONLY | O_CREAT, 0666); if (fd < 0) return NULL; lock = malloc (sizeof (FileLock)); if (!lock) return NULL; lock->fd = fd; memset (&lockinfo, 0, sizeof (struct flock)); if (exclusive) lockinfo.l_type = F_WRLCK; else lockinfo.l_type = F_RDLCK; lockinfo.l_pid = getpid(); fcntl (fd, F_SETLKW, &lockinfo); return lock; } static void ini_file_unlock (FileLock *lock) { struct flock lockinfo; memset (&lockinfo, 0, sizeof (struct flock)); lockinfo.l_type = F_UNLCK; lockinfo.l_pid = getpid(); fcntl (lock ->fd, F_SETLKW, &lockinfo); close (lock ->fd); free (lock ); } /* strlib.c following */ #define ASCIILINESZ 1024 /*-------------------------------------------------------------------------*/ /** @brief Convert a string to lowercase. @param s String to convert. @return ptr to statically allocated string. This function returns a pointer to a statically allocated string containing a lowercased version of the input string. Do not free or modify the returned string! Since the returned string is statically allocated, it will be modified at each function call (not re-entrant). */ /*--------------------------------------------------------------------------*/ static char* strlwc (char * s) { static char l[ASCIILINESZ+1]; int i; if (!s) return NULL; memset (l, 0, ASCIILINESZ + 1); i = 0; while (i < ASCIILINESZ && s[i]) { l[i] = (char) tolower ((int) s[i]); ++i; } l[ASCIILINESZ] = (char) 0; return l; } /*-------------------------------------------------------------------------*/ /** @brief Skip blanks until the first non-blank character. @param s String to parse. @return Pointer to char inside given string. This function returns a pointer to the first non-blank character in the given string. */ /*--------------------------------------------------------------------------*/ static char* strskp (char * s) { char * skip = s; if (!s) return NULL; while (isspace ((int) *skip) && *skip) ++skip; return skip; } /*-------------------------------------------------------------------------*/ /** @brief Remove blanks at the end of a string. @param s String to parse. @return ptr to statically allocated string. This function returns a pointer to a statically allocated string, which is identical to the input string, except that all blank characters at the end of the string have been removed. Do not free or modify the returned string! Since the returned string is statically allocated, it will be modified at each function call (not re-entrant). */ /*--------------------------------------------------------------------------*/ static char* strcrop (char * s) { static char l[ASCIILINESZ+1]; char *last; if (!s) return NULL; memset (l, 0, ASCIILINESZ + 1); strcpy (l, s); last = l + strlen (l); while (last > l) { if (!isspace ((int) * (last - 1))) break; --last; } *last = (char) 0; return l; } /* dictionary.c.c following */ /** Maximum value size for integers and doubles. */ #define MAXVALSZ 1024 /** Minimal allocated number of entries in a dictionary */ #define DICTMINSZ 128 /** Invalid key token */ #define DICT_INVALID_KEY ((char*)-1) /* Doubles the allocated size associated to a pointer 'size' is the current allocated size. */ static void* mem_double (void * ptr, int size) { void *newptr; newptr = calloc (2 * size, 1); if (!newptr) return NULL; memcpy (newptr, ptr, size); free (ptr); return newptr; } /*--------------------------------------------------------------------------- Function codes ---------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/ /** @brief Compute the hash key for a string. @param key Character string to use for key. @return 1 unsigned int on at least 32 bits. This hash function has been taken from an Article in Dr Dobbs Journal. This is normally a collision-free function, distributing keys evenly. The key is stored anyway in the struct so that collision can be avoided by comparing the key itself in last resort. */ /*--------------------------------------------------------------------------*/ static unsigned dictionary_hash (char * key) { int len; unsigned hash; int i; len = strlen (key); for (hash = 0, i = 0; i < len; ++i) { hash += (unsigned) key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash; } /*-------------------------------------------------------------------------*/ /** @brief Create a new dictionary object. @param size Optional initial size of the dictionary. @return 1 newly allocated dictionary objet. This function allocates a new dictionary object of given size and returns it. If you do not know in advance (roughly) the number of entries in the dictionary, give size=0. */ /*--------------------------------------------------------------------------*/ dictionary* dictionary_new (int size) { dictionary *d; /* If no size was specified, allocate space for DICTMINSZ */ if (size < DICTMINSZ) size = DICTMINSZ; d = (dictionary *) calloc (1, sizeof (dictionary)); if (!d) return NULL; d->size = size; d->val = (char **) calloc (size, sizeof (char*)); if (!d->val) { free (d); return NULL; } d->key = (char **) calloc (size, sizeof (char*)); if (!d->key) { free (d->val); free (d); return NULL; } d->hash = (unsigned int *) calloc (size, sizeof (unsigned)); if (!d->hash) { free (d->key); free (d->val); free (d); return NULL; } return d; } /*-------------------------------------------------------------------------*/ /** @brief Delete a dictionary object @param d dictionary object to deallocate. @return void Deallocate a dictionary object and all memory associated to it. */ /*--------------------------------------------------------------------------*/ static void dictionary_del (dictionary * d) { int i; if (!d) return; for (i = 0; i < d->size; ++i) { if (d->key[i]) free (d->key[i]); if (d->val[i]) free (d->val[i]); } free (d->val); free (d->key); free (d->hash); free (d); return; } /*-------------------------------------------------------------------------*/ /** @brief Get a value from a dictionary. @param d dictionary object to search. @param key Key to look for in the dictionary. @param def Default value to return if key not found. @return 1 pointer to internally allocated character string. This function locates a key in a dictionary and returns a pointer to its value, or the passed 'def' pointer if no such key can be found in dictionary. The returned character pointer points to data internal to the dictionary object, you should not try to free it or modify it. */ /*--------------------------------------------------------------------------*/ static char* dictionary_get (dictionary * d, char * key, char * def) { unsigned hash; int i; hash = dictionary_hash (key); for (i = 0; i < d->size; ++i) { if (!d->key) continue; /* Compare hash */ if (hash == d->hash[i]) { /* Compare string, to avoid hash collisions */ if (!strcmp (key, d->key[i])) { return d->val[i]; } } } return def; } /*-------------------------------------------------------------------------*/ /** @brief Set a value in a dictionary. @param d dictionary object to modify. @param key Key to modify or add. @param val Value to add. @return void If the given key is found in the dictionary, the associated value is replaced by the provided one. If the key cannot be found in the dictionary, it is added to it. It is Ok to provide a NULL value for val, but NULL values for the dictionary or the key are considered as errors: the function will return immediately in such a case. Notice that if you dictionary_set a variable to NULL, a call to dictionary_get will return a NULL value: the variable will be found, and its value (NULL) is returned. In other words, setting the variable content to NULL is equivalent to deleting the variable from the dictionary. It is not possible (in this implementation) to have a key in the dictionary without value. */ /*--------------------------------------------------------------------------*/ static void dictionary_set (dictionary * d, char * key, char * val) { int i; unsigned hash; if (!d || !key) return; /* Compute hash for this key */ hash = dictionary_hash (key); /* Find if value is already in blackboard */ if (d->n > 0) { for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; if (hash == d->hash[i]) { /* Same hash value */ if (!strcmp (key, d->key[i])) { /* Same key */ /* Found a value: modify and return */ if (d->val[i]) free (d->val[i]); d->val[i] = val ? strdup (val) : NULL; /* Value has been modified: return */ return; } } } } /* Add a new value */ /* See if dictionary needs to grow */ if (d->n == d->size) { /* Reached maximum size: reallocate blackboard */ d->val = (char **) mem_double (d->val, d->size * sizeof (char*)); d->key = (char **) mem_double (d->key, d->size * sizeof (char*)); d->hash = (unsigned int *) mem_double (d->hash, d->size * sizeof (unsigned)); /* Double size */ d->size *= 2; } /* Insert key in the first empty slot */ for (i = 0; i < d->size; ++i) { if (!d->key[i]) { /* Add key here */ break; } } /* Copy key */ d->key[i] = strdup (key); d->val[i] = val ? strdup (val) : NULL; d->hash[i] = hash; ++d->n; } /*-------------------------------------------------------------------------*/ /** @brief Delete a key in a dictionary @param d dictionary object to modify. @param key Key to remove. @return void This function deletes a key in a dictionary. Nothing is done if the key cannot be found. */ /*--------------------------------------------------------------------------*/ static void dictionary_unset (dictionary * d, char * key) { unsigned hash; int i; hash = dictionary_hash (key); for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; /* Compare hash */ if (hash == d->hash[i]) { /* Compare string, to avoid hash collisions */ if (!strcmp (key, d->key[i])) { /* Found key */ break; } } } if (i >= d->size) /* Key not found */ return; free (d->key[i]); d->key[i] = NULL; if (d->val[i]) { free (d->val[i]); d->val[i] = NULL; } d->hash[i] = 0; --d->n; } /* iniparser.c.c following */ #define ASCIILINESZ 1024 #define INI_INVALID_KEY ((char*)-1) /* Private: add an entry to the dictionary */ void iniparser_add_entry (dictionary * d, char * sec, char * key, char * val) { char longkey[2*ASCIILINESZ+1]; /* Make a key as section:keyword */ if (key) sprintf (longkey, "%s:%s", sec, key); else strcpy (longkey, sec); /* Add (key,val) to dictionary */ dictionary_set (d, longkey, val); } /*-------------------------------------------------------------------------*/ /** @brief Get number of sections in a dictionary @param d Dictionary to examine @return int Number of sections found in dictionary This function returns the number of sections found in a dictionary. The test to recognize sections is done on the string stored in the dictionary: a section name is given as "section" whereas a key is stored as "section:key", thus the test looks for entries that do not contain a colon. This clearly fails in the case a section name contains a colon, but this should simply be avoided. This function returns -1 in case of error. */ /*--------------------------------------------------------------------------*/ int iniparser_getnsec (dictionary * d) { int i; int nsec; if (!d) return -1; nsec = 0; for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; if (!strchr (d->key[i], ':')) ++nsec; } return nsec; } /*-------------------------------------------------------------------------*/ /** @brief Get name for section n in a dictionary. @param d Dictionary to examine @param n Section number (from 0 to nsec-1). @return Pointer to char string This function locates the n-th section in a dictionary and returns its name as a pointer to a string statically allocated inside the dictionary. Do not free or modify the returned string! This function returns NULL in case of error. */ /*--------------------------------------------------------------------------*/ char* iniparser_getsecname (dictionary * d, int n) { int i; int foundsec; if (!d || n < 0) return NULL; foundsec = 0; for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; if (!strchr (d->key[i], ':')) { ++foundsec; if (foundsec > n) break; } } if (foundsec <= n) return NULL; return d->key[i]; } /*-------------------------------------------------------------------------*/ /** @brief Save a dictionary to a loadable ini file @param d Dictionary to dump @param f Opened file pointer to dump to @return void This function dumps a given dictionary into a loadable ini file. It is Ok to specify @c stderr or @c stdout as output files. */ /*--------------------------------------------------------------------------*/ void iniparser_dump_ini (dictionary * d, const char * file_name) { int i, j; char keym[ASCIILINESZ+1]; int nsec; char * secname; int seclen; FILE * f; FileLock *lock; if (!d) return; lock = ini_file_lock (file_name, TRUE); if (!lock) return; f = fdopen (lock->fd, "w"); if (!f) { ini_file_unlock (lock); return; } nsec = iniparser_getnsec (d); if (nsec < 1) { /* No section in file: dump all keys as they are */ for (i = 0; i < d->size; ++i) { if (!d->key[i]) continue; fprintf (f, "%s = %s\n", d->key[i], d->val[i]); } fflush (f); fclose (f); ini_file_unlock (lock); return; } for (i = 0; i < nsec; ++i) { secname = iniparser_getsecname (d, i); seclen = (int) strlen (secname); fprintf (f, "[%s]\n", secname); sprintf (keym, "%s:", secname); for (j = 0; j < d->size; ++j) { if (!d->key[j]) continue; if (!strncmp (d->key[j], keym, seclen + 1)) { fprintf (f, "%s = %s\n", d->key[j] + seclen + 1, d->val[j] ? d->val[j] : ""); } } fprintf (f, "\n"); } fflush (f); fclose (f); ini_file_unlock (lock ); } /*-------------------------------------------------------------------------*/ /** @brief Get the string associated to a key @param d Dictionary to search @param key Key string to look for @param def Default value to return if key not found. @return pointer to statically allocated character string This function queries a dictionary for a key. A key as read from an ini file is given as "section:key". If the key cannot be found, the pointer passed as 'def' is returned. The returned char pointer is pointing to a string allocated in the dictionary, do not free or modify it. */ /*--------------------------------------------------------------------------*/ char* iniparser_getstring (dictionary * d, char * key, char * def) { char * lc_key; char * sval; if (!d || !key) return def; lc_key = strdup (strlwc (key)); sval = dictionary_get (d, lc_key, def); free (lc_key); return sval; } /*-------------------------------------------------------------------------*/ /** @brief Finds out if a given entry exists in a dictionary @param ini Dictionary to search @param entry Name of the entry to look for @return integer 1 if entry exists, 0 otherwise Finds out if a given entry exists in the dictionary. Since sections are stored as keys with NULL associated values, this is the only way of querying for the presence of sections in a dictionary. */ /*--------------------------------------------------------------------------*/ int iniparser_find_entry (dictionary *ini, char *entry) { int found = 0; if (iniparser_getstring (ini, entry, INI_INVALID_KEY) != INI_INVALID_KEY) { found = 1; } return found; } /*-------------------------------------------------------------------------*/ /** @brief Set an entry in a dictionary. @param ini Dictionary to modify. @param entry Entry to modify (entry name) @param val New value to associate to the entry. @return int 0 if Ok, -1 otherwise. If the given entry can be found in the dictionary, it is modified to contain the provided value. If it cannot be found, -1 is returned. It is Ok to set val to NULL. */ /*--------------------------------------------------------------------------*/ int iniparser_setstr (dictionary * ini, char * entry, char * val) { dictionary_set (ini, strlwc (entry), val); return 0; } /*-------------------------------------------------------------------------*/ /** @brief Delete an entry in a dictionary @param ini Dictionary to modify @param entry Entry to delete (entry name) @return void If the given entry can be found, it is deleted from the dictionary. */ /*--------------------------------------------------------------------------*/ void iniparser_unset (dictionary * ini, char * entry) { dictionary_unset (ini, strlwc (entry)); } /*-------------------------------------------------------------------------*/ /** @brief Parse an ini file and return an allocated dictionary object @param ininame Name of the ini file to read. @return Pointer to newly allocated dictionary This is the parser for ini files. This function is called, providing the name of the file to be read. It returns a dictionary object that should not be accessed directly, but through accessor functions instead. The returned dictionary must be freed using iniparser_free(). */ /*--------------------------------------------------------------------------*/ dictionary* iniparser_new (char *ininame) { dictionary * d; char lin[ASCIILINESZ+1]; char sec[ASCIILINESZ+1]; char key[ASCIILINESZ+1]; char val[ASCIILINESZ+1]; char * where; FILE * ini; int lineno; FileLock * lock; lock = ini_file_lock (ininame, FALSE); if (!lock) ccsWarning ("unable to lock file %s, reads may conflict", ininame); ini = fopen (ininame, "r"); if (!ini) { if (lock) ini_file_unlock (lock ); return NULL; } sec[0] = 0; /* * Initialize a new dictionary entry */ d = dictionary_new (0); lineno = 0; while (fgets (lin, ASCIILINESZ, ini) != NULL) { ++lineno; where = strskp (lin); /* Skip leading spaces */ if (*where == ';' || *where == '#' || *where == 0) continue; /* Comment lines */ else { val[0] = '\0'; if (sscanf (where, "[%[^]]", sec) == 1) { /* Valid section name */ strcpy (sec, strlwc (sec)); iniparser_add_entry (d, sec, NULL, NULL); } else if (sscanf (where, "%[^=] = \"%[^\"]\"", key, val) == 2 || sscanf (where, "%[^=] = '%[^\']'", key, val) == 2 || sscanf (where, "%[^=] = %[^\n]", key, val) >= 1) { strcpy (key, strlwc (strcrop (key))); /* * sscanf cannot handle "" or '' as empty value, * this is done here */ if (!strcmp (val, "\"\"") || !strcmp (val, "''")) { val[0] = (char) 0; } else { strcpy (val, strcrop (val)); } iniparser_add_entry (d, sec, key, val); } } } fclose (ini); if (lock) ini_file_unlock (lock ); return d; } /*-------------------------------------------------------------------------*/ /** @brief Free all memory associated to an ini dictionary @param d Dictionary to free @return void Free all memory associated to an ini dictionary. It is mandatory to call this function before the dictionary object gets out of the current context. */ /*--------------------------------------------------------------------------*/ void iniparser_free (dictionary * d) { dictionary_del (d); } #ifdef __cplusplus } #endif ./compizconfig/libcompizconfig/src/iniparser.h0000644000004100000410000000332713246301623022051 0ustar www-datawww-data/* Based upon libiniparser, by Nicolas Devillard Hacked into 1 file (m-iniparser) by Freek/2005 Original terms following: -- - Copyright (c) 2000 by Nicolas Devillard (ndevilla AT free DOT fr). Written by Nicolas Devillard. Not derived from licensed software. Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. This notice may not be removed or altered. */ #ifndef _INIPARSER_H_ #define _INIPARSER_H_ #include #include #include #include #include #include typedef IniDictionary dictionary; typedef struct _FileLock { int fd; } FileLock; /* generated by genproto */ dictionary * iniparser_new(char *ininame); dictionary * dictionary_new(int size); void iniparser_free(dictionary * d); int iniparser_getnsec(dictionary * d); char * iniparser_getsecname(dictionary * d, int n); void iniparser_dump_ini(dictionary * d, const char * file_name); char * iniparser_getstring(dictionary * d, char * key, char * def); void iniparser_add_entry(dictionary * d, char * sec, char * key, char * val); int iniparser_find_entry(dictionary * ini, char * entry); int iniparser_setstr(dictionary * ini, char * entry, char * val); void iniparser_unset(dictionary * ini, char * entry); #endif ./compizconfig/libcompizconfig/src/ccs_text_file.c0000644000004100000410000001165013246301623022661 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_text_file.c * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include typedef struct _CCSUnixTextFilePrivate CCSUnixTextFilePrivate; struct _CCSUnixTextFilePrivate { FILE *unixFile; }; static void freeAndFinalizeCCSTextFile (CCSTextFile *file, CCSObjectAllocationInterface *ai) { ccsObjectFinalize (file); (*ai->free_) (ai->allocator, file); } static char * ccsUnixTextFileReadFromStart (CCSTextFile *textFile) { CCSUnixTextFilePrivate *priv = GET_PRIVATE (CCSUnixTextFilePrivate, textFile); FILE *completedUpgrades = priv->unixFile; char *cuBuffer; unsigned int cuSize; size_t cuReadSize; fseek (completedUpgrades, 0, SEEK_END); cuSize = ftell (completedUpgrades); rewind (completedUpgrades); cuBuffer = calloc (cuSize + 1, sizeof (char)); if (!cuBuffer) return NULL; cuReadSize = fread (cuBuffer, 1, cuSize, completedUpgrades); /* ccsWarning ("Couldn't read completed upgrades file!"); */ if (cuReadSize != cuSize) { free (cuBuffer); return NULL; } cuBuffer[cuSize] = '\0'; return cuBuffer; } static Bool ccsUnixTextFileAppendString (CCSTextFile *textFile, const char *str) { CCSUnixTextFilePrivate *priv = GET_PRIVATE (CCSUnixTextFilePrivate, textFile); FILE *completedUpgrades = priv->unixFile; fprintf (completedUpgrades, "%s\n", str); return TRUE; } static void ccsUnixFreeTextFile (CCSTextFile *textFile) { CCSUnixTextFilePrivate *priv = GET_PRIVATE (CCSUnixTextFilePrivate, textFile); fclose (priv->unixFile); priv->unixFile = NULL; freeAndFinalizeCCSTextFile (textFile, textFile->object.object_allocation); } CCSTextFileInterface ccsUnixTextFileInterface = { ccsUnixTextFileReadFromStart, ccsUnixTextFileAppendString, ccsUnixFreeTextFile }; const char * CCS_UNIX_TEXT_FILE_OPEN_MODE_READONLY = "r"; const char * CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITE = "r+"; const char * CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITECREATE = "a+"; static FILE * openUnixFile (CCSTextFile *textFile, CCSObjectAllocationInterface *ai, const char *path, const char *openMode) { FILE *file = fopen (path, openMode); if (!file) { ccsObjectFinalize (textFile); (*ai->free_) (ai->allocator, textFile); return NULL; } return file; } static CCSUnixTextFilePrivate * allocateCCSUnixTextFilePrivate (CCSTextFile *file, CCSObjectAllocationInterface *ai) { CCSUnixTextFilePrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSUnixTextFilePrivate)); if (!priv) { freeAndFinalizeCCSTextFile (file, ai); return NULL; } return priv; } static CCSTextFile * allocateCCSTextFile (CCSObjectAllocationInterface *ai) { CCSTextFile *textFile = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSTextFile)); if (!textFile) return NULL; ccsObjectInit (textFile, ai); return textFile; } CCSTextFile * ccsUnixTextFileNew (const char *path, CCSTextFileOpenMode openMode, CCSObjectAllocationInterface *ai) { const char *fopenMode = NULL; switch (openMode) { case ReadOnly: fopenMode = CCS_UNIX_TEXT_FILE_OPEN_MODE_READONLY; break; case ReadWrite: fopenMode = CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITE; break; case ReadWriteCreate: fopenMode = CCS_UNIX_TEXT_FILE_OPEN_MODE_READWRITECREATE; break; } CCSTextFile *textFile = allocateCCSTextFile (ai); if (!textFile) return NULL; CCSUnixTextFilePrivate *priv = allocateCCSUnixTextFilePrivate (textFile, ai); if (!priv) return NULL; ccsObjectSetPrivate (textFile, (CCSPrivate *) priv); FILE *unixFile = openUnixFile (textFile, ai, path, fopenMode); if (!unixFile) return NULL; priv->unixFile = unixFile; ccsObjectAddInterface (textFile, (const CCSInterface *) &ccsUnixTextFileInterface, GET_INTERFACE_TYPE (CCSTextFileInterface)); ccsObjectRef (textFile); return textFile; } ./compizconfig/libcompizconfig/src/ccs_config_file_interface.h0000644000004100000410000000440513246301623025167 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_config_file_interface.h * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_CONFIG_FILE_INTERFACE_H #define CCS_CONFIG_FILE_INTERFACE_H #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSConfigFile CCSConfigFile; typedef struct _CCSConfigFileInterface CCSConfigFileInterface; typedef void (*ConfigChangeCallbackProc) (unsigned int watchId, void *closure); typedef Bool (*CCSReadConfigOption) (CCSConfigFile *, ConfigOption, char **value); typedef Bool (*CCSWriteConfigOption) (CCSConfigFile *, ConfigOption, const char *value); typedef void (*CCSSetConfigWatchCallback) (CCSConfigFile *, ConfigChangeCallbackProc, void *closure); typedef void (*CCSFreeConfigFile) (CCSConfigFile *file); struct _CCSConfigFileInterface { CCSReadConfigOption readConfigOption; CCSWriteConfigOption writeConfigOption; CCSSetConfigWatchCallback setConfigWatchCallback; CCSFreeConfigFile free; }; struct _CCSConfigFile { CCSObject object; }; CCSREF_HDR (ConfigFile, CCSConfigFile); Bool ccsConfigFileReadConfigOption (CCSConfigFile *, ConfigOption, char **value); Bool ccsConfigFileWriteConfigOption (CCSConfigFile *, ConfigOption, const char *); void ccsSetConfigWatchCallback (CCSConfigFile *, ConfigChangeCallbackProc, void *); void ccsFreeConfigFile (CCSConfigFile *); unsigned int ccsCCSConfigFileInterfaceGetType (); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/src/ccs_config_file_interface.c0000644000004100000410000000351613246301623025164 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_config_file_interface.c * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include INTERFACE_TYPE (CCSConfigFileInterface); CCSREF_OBJ (ConfigFile, CCSConfigFile); Bool ccsConfigFileReadConfigOption (CCSConfigFile *config, ConfigOption opt, char **value) { return (*(GET_INTERFACE (CCSConfigFileInterface, config))->readConfigOption) (config, opt, value); } Bool ccsConfigFileWriteConfigOption (CCSConfigFile *config, ConfigOption opt, const char *value) { return (*(GET_INTERFACE (CCSConfigFileInterface, config))->writeConfigOption) (config, opt, value); } void ccsSetConfigWatchCallback (CCSConfigFile *config, ConfigChangeCallbackProc callback, void *closure) { (*(GET_INTERFACE (CCSConfigFileInterface, config))->setConfigWatchCallback) (config, callback, closure); } void ccsFreeConfigFile (CCSConfigFile *config) { return (*(GET_INTERFACE (CCSConfigFileInterface, config))->free) (config); } ./compizconfig/libcompizconfig/src/bindings.c0000644000004100000410000002224613246301623021646 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Based on Compiz option.c * Copyright © 2005 Novell, Inc. * Author: David Reveman */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #define SCREEN_EDGE_LEFT (1 << 0) #define SCREEN_EDGE_RIGHT (1 << 1) #define SCREEN_EDGE_TOP (1 << 2) #define SCREEN_EDGE_BOTTOM (1 << 3) #define SCREEN_EDGE_TOPLEFT (1 << 4) #define SCREEN_EDGE_TOPRIGHT (1 << 5) #define SCREEN_EDGE_BOTTOMLEFT (1 << 6) #define SCREEN_EDGE_BOTTOMRIGHT (1 << 7) struct _Modifier modifierList[] = { { "", ShiftMask }, { "", ControlMask }, { "", ControlMask }, { "", Mod1Mask }, { "", Mod2Mask }, { "", Mod3Mask }, { "", Mod4Mask }, { "", Mod5Mask }, { "", CompAltMask }, { "", CompMetaMask }, { "", CompSuperMask }, { "", CompHyperMask }, { "", CompModeSwitchMask }, }; struct _Edge { char *name; char *modName; int modifier; } edgeList[] = { { "Left", "", SCREEN_EDGE_LEFT }, { "Right", "", SCREEN_EDGE_RIGHT }, { "Top", "", SCREEN_EDGE_TOP }, { "Bottom", "", SCREEN_EDGE_BOTTOM }, { "TopLeft", "", SCREEN_EDGE_TOPLEFT }, { "TopRight", "", SCREEN_EDGE_TOPRIGHT }, { "BottomLeft", "", SCREEN_EDGE_BOTTOMLEFT }, { "BottomRight", "", SCREEN_EDGE_BOTTOMRIGHT } }; #define N_EDGES (sizeof (edgeList) / sizeof (edgeList[0])) unsigned int ccsInternalUtilNumModifiers () { return sizeof (modifierList) / sizeof (struct _Modifier); } static char * stringAppend (char *s, const char *a) { char *r; int len; if (!a) return s; len = strlen (a); if (s) len += strlen (s); r = malloc (len + 1); if (r) { if (s) { sprintf (r, "%s%s", s, a); free (s); } else { sprintf (r, "%s", a); } s = r; } return s; } void ccsAddKeybindingMaskToString (char **bindingString, unsigned int matchBindingMask, unsigned int *addedBindingMask, unsigned int addBindingMask, const char *addBindingString) { if (addBindingMask & matchBindingMask && !(*addedBindingMask & addBindingMask)) { *bindingString = stringAppend (*bindingString, addBindingString); *addedBindingMask |= addBindingMask; } } void ccsAddStringToKeybindingMask (unsigned int *bindingMask, const char *bindingString, unsigned int addBindingMask, const char *addBindingString) { if (strcasestr (bindingString, addBindingString)) { *bindingMask |= addBindingMask; } } char * ccsModifiersToString (unsigned int modMask) { char *binding = NULL; unsigned int addedBindings = 0; int i; for (i = 0; i < ccsInternalUtilNumModifiers (); ++i) { ccsAddKeybindingMaskToString (&binding, modMask, &addedBindings, modifierList[i].modifier, modifierList[i].name); } return binding; } char * ccsEdgesToModString (unsigned int edgeMask) { char *binding = NULL; int i; for (i = 0; i < N_EDGES; ++i) { if (edgeMask & edgeList[i].modifier) binding = stringAppend (binding, edgeList[i].modName); } return binding; } char * ccsEdgesToString (unsigned int edgeMask) { char *binding = NULL; int i; for (i = 0; i < N_EDGES; ++i) { if (edgeMask & edgeList[i].modifier) { if (binding) binding = stringAppend (binding, "|"); binding = stringAppend (binding, edgeList[i].name); } } if (!binding) return strdup (""); return binding; } char * ccsKeyBindingToString (CCSSettingKeyValue *key) { char *binding; binding = ccsModifiersToString (key->keyModMask); if (key->keysym != NoSymbol) { char *keyname; keyname = XKeysymToString (key->keysym); if (keyname) { binding = stringAppend (binding, keyname); } } if (!binding) return strdup ("Disabled"); return binding; } char * ccsButtonBindingToString (CCSSettingButtonValue *button) { char *binding; char *edges; edges = ccsEdgesToModString (button->edgeMask); binding = stringAppend (edges, ccsModifiersToString (button->buttonModMask)); if (button->button) { char buttonStr[256]; snprintf (buttonStr, 256, "Button%d", button->button); binding = stringAppend (binding, buttonStr); } if (!binding) return strdup ("Disabled"); return binding; } unsigned int ccsStringToModifiers (const char *binding) { unsigned int mods = 0; int i; for (i = 0; i < ccsInternalUtilNumModifiers (); ++i) { ccsAddStringToKeybindingMask (&mods, binding, modifierList[i].modifier, modifierList[i].name); } return mods; } unsigned int ccsStringToEdges (const char *binding) { unsigned int edgeMask = 0; const char *needle; int i; for (i = 0; i < N_EDGES; ++i) { int edgeLen = strlen (edgeList[i].name); /* Look for all occurrences of edgeList[i].name in binding */ needle = binding; while ((needle = strstr (needle, edgeList[i].name)) != NULL) { if (needle != binding && isalnum (*(needle - 1))) { needle += edgeLen; continue; } needle += edgeLen; if (*needle && isalnum (*needle)) continue; edgeMask |= 1 << i; } } return edgeMask; } unsigned int ccsModStringToEdges (const char *binding) { unsigned int mods = 0; int i; for (i = 0; i < N_EDGES; ++i) { if (strcasestr (binding, edgeList[i].modName)) mods |= edgeList[i].modifier; } return mods; } Bool ccsStringToKeyBinding (const char *binding, CCSSettingKeyValue *value) { char *ptr; unsigned int mods; KeySym keysym; if (!binding || !strlen(binding) || strncasecmp (binding, "Disabled", strlen ("Disabled")) == 0) { value->keysym = 0; value->keyModMask = 0; return TRUE; } mods = ccsStringToModifiers (binding); ptr = strrchr (binding, '>'); if (ptr) binding = ptr + 1; while (*binding && !isalnum (*binding)) ++binding; if (!*binding) { if (mods) { value->keysym = 0; value->keyModMask = mods; return TRUE; } return FALSE; } keysym = XStringToKeysym (binding); if (keysym != NoSymbol) { value->keysym = keysym; value->keyModMask = mods; return TRUE; } return FALSE; } Bool ccsStringToButtonBinding (const char *binding, CCSSettingButtonValue *value) { char *ptr; unsigned int mods; unsigned int edges; if (!binding || !strlen(binding) || strncmp (binding, "Disabled", strlen ("Disabled")) == 0) { value->button = 0; value->buttonModMask = 0; value->edgeMask = 0; return TRUE; } mods = ccsStringToModifiers (binding); edges = ccsModStringToEdges (binding); ptr = strrchr (binding, '>'); if (ptr) binding = ptr + 1; while (*binding && !isalnum (*binding)) ++binding; if (strncmp (binding, "Button", strlen ("Button")) == 0) { int buttonNum; if (sscanf (binding + strlen ("Button"), "%d", &buttonNum) == 1) { value->button = buttonNum; value->buttonModMask = mods; value->edgeMask = edges; return TRUE; } } return FALSE; } Bool ccsStringToColor (const char *value, CCSSettingColorValue *color) { int c[4]; if (sscanf (value, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { color->color.red = c[0] << 8 | c[0]; color->color.green = c[1] << 8 | c[1]; color->color.blue = c[2] << 8 | c[2]; color->color.alpha = c[3] << 8 | c[3]; return TRUE; } return FALSE; } char * ccsColorToString (CCSSettingColorValue *color) { char tmp[256]; snprintf (tmp, 256, "#%.2x%.2x%.2x%.2x", color->color.red >> 8, color->color.green >> 8, color->color.blue >> 8, color->color.alpha >> 8); return strdup (tmp); } ./compizconfig/libcompizconfig/src/ccs_text_file_interface.h0000644000004100000410000000346013246301623024706 0ustar www-datawww-data/* * Compiz configuration system library * * ccs_text_file_interface.h * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef CCS_TEXT_FILE_INTERFACE_H #define CCS_TEXT_FILE_INTERFACE_H #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSTextFile CCSTextFile; typedef struct _CCSTextFileInterface CCSTextFileInterface; typedef char * (*CCSReadTextFileFromStart) (CCSTextFile *file); typedef Bool (*CCSAppendStringToTextFile) (CCSTextFile *file, const char *str); typedef void (*CCSFreeTextFile) (CCSTextFile *file); struct _CCSTextFileInterface { CCSReadTextFileFromStart readFromStart; CCSAppendStringToTextFile appendString; CCSFreeTextFile free; }; struct _CCSTextFile { CCSObject object; }; CCSREF_HDR (TextFile, CCSTextFile); char * ccsTextFileReadFromStart (CCSTextFile *); Bool ccsTextFileAppendString (CCSTextFile *, const char *); void ccsFreeTextFile (CCSTextFile *); unsigned int ccsCCSTextFileInterfaceGetType (); COMPIZCONFIG_END_DECLS #endif ./compizconfig/libcompizconfig/config.h.in0000644000004100000410000000022613246301623021133 0ustar www-datawww-data#define PACKAGE_STRING "@_libcompizconfig_package_string@" #define PACKAGE "@_libcompizconfig_package@" #define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" ./compizconfig/libcompizconfig/config/0000755000004100000410000000000013246301623020355 5ustar www-datawww-data./compizconfig/libcompizconfig/config/CMakeLists.txt0000644000004100000410000000076513246301623023125 0ustar www-datawww-dataset (_config_file config) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config_test ${CMAKE_CURRENT_BINARY_DIR}/compiz-1/compizconfig/config) compiz_opt_install_file (${CMAKE_CURRENT_SOURCE_DIR}/${_config_file} ${COMPIZ_SYSCONFDIR}/compizconfig/${_config_file}) add_custom_target ( config_install ${CMAKE_COMMAND} -E make_directory ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/config/${_config_file} ${COMPIZ_SYSCONFDIR}/compizconfig/${_config_file} ) ./compizconfig/libcompizconfig/config/config0000644000004100000410000000045113246301623021545 0ustar www-datawww-data[kde4_session] backend = kconfig4 integration = true plugin_list_autosort = true [kde_session] backend = kconfig integration = true plugin_list_autosort = true [gnome_session] backend = gconf integration = true plugin_list_autosort = true [general] backend = ini plugin_list_autosort = true ./compizconfig/libcompizconfig/config/config_test0000644000004100000410000000006413246301623022604 0ustar www-datawww-data[general] backend = ini plugin_list_autosort = true ./compizconfig/libcompizconfig/cmake/0000755000004100000410000000000013246301623020170 5ustar www-datawww-data./compizconfig/libcompizconfig/cmake/LibCompizConfigCommon.cmake0000644000004100000410000000725513246301623025372 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizCommon) include (CompizPackage) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) macro (_get_backend_parameters _prefix) set (_current_var _foo) set (_supported_var PKGDEPS LDFLAGSADD CFLAGSADD LIBRARIES LIBDIRS INCDIRS) foreach (_val ${_supported_var}) set (${_prefix}_${_val}) endforeach (_val) foreach (_val ${ARGN}) set (_found FALSE) foreach (_find ${_supported_var}) if ("${_find}" STREQUAL "${_val}") set (_found TRUE) endif ("${_find}" STREQUAL "${_val}") endforeach (_find) if (_found) set (_current_var ${_prefix}_${_val}) else (_found) list (APPEND ${_current_var} ${_val}) endif (_found) endforeach (_val) endmacro (_get_backend_parameters) # check pkgconfig dependencies macro (_check_backend_pkg_deps _prefix) set (${_prefix}_HAS_PKG_DEPS TRUE) foreach (_val ${ARGN}) string (REGEX REPLACE "[<>=\\.]" "_" _name ${_val}) string (TOUPPER ${_name} _name) compiz_pkg_check_modules (_${_name} ${_val}) if (_${_name}_FOUND) list (APPEND ${_prefix}_PKG_LIBDIRS "${_${_name}_LIBRARY_DIRS}") list (APPEND ${_prefix}_PKG_LIBRARIES "${_${_name}_LIBRARIES}") list (APPEND ${_prefix}_PKG_INCDIRS "${_${_name}_INCLUDE_DIRS}") else () set (${_prefix}_HAS_PKG_DEPS FALSE) compiz_set (COMPIZCONFIG_${_prefix}_MISSING_DEPS "${COMPIZCONFIG_${_prefix}_MISSING_DEPS} ${_val}") set(__pkg_config_checked__${_name} 0 CACHE INTERNAL "" FORCE) endif () endforeach () endmacro () function (compizconfig_backend bname) string (TOUPPER ${bname} _BACKEND) project (compizconfig_${_BACKEND}) _get_backend_parameters (compizconfig_${_BACKEND} ${ARGN}) _check_backend_pkg_deps (compizconfig_${_BACKEND} ${compizconfig_${_BACKEND}_PKGDEPS}) include_directories ( ${CMAKE_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${BACKEND_INCLUDE_DIRS} ${compizconfig_${_BACKEND}_LOCAL_INCDIRS} ${compizconfig_${_BACKEND}_PKG_INCDIRS} ${compizconfig_${_BACKEND}_INCDIRS} ${COMPIZCONFIG_INCLUDE_DIRS} ) link_directories ( ${compizconfig_${_BACKEND}_PKG_LIBDIRS} ${COMPIZCONFIG_LIBRARY_DIRS} ) set (BACKEND_LIBS "") foreach (_val ${BACKEND_LDFLAGS}) set (BACKEND_LIBS "${BACKEND_LIBS}${_val} ") endforeach (_val ${BACKEND_LDFLAGS}) set (BACKEND_CFLAGS "") foreach (_val ${LIBBACKEND_CFLAGS}) set (BACKEND_CFLAGS "${BACKEND_CFLAGS}${_val} ") endforeach (_val ${LIBBACKEND_CFLAGS}) file (GLOB _h_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h") file (GLOB _cpp_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") file (GLOB _c_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c") add_library ( ${bname} SHARED ${_cpp_files} ${_h_files} ${_c_files}) target_link_libraries ( ${bname} compizconfig ${compizconfig_${_BACKEND}_LOCAL_LIBRARIES} ${compizconfig_${_BACKEND}_PKG_LIBRARIES} ${compizconfig_${_BACKEND}_LIBRARIES} ) if (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${bname} PROPERTIES INSTALL_RPATH "${libcompizconfig_libdir}" COMPILE_FLAGS "${${_BACKEND}_CFLAGSADD}" LINK_FLAGS "${${_BACKEND}_LDFLAGSADD}" ) else (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${bname} PROPERTIES COMPILE_FLAGS "${${_BACKEND}_CFLAGSADD}" LINK_FLAGS "${${_BACKEND}_LDFLAGSADD}" ) endif () install ( TARGETS ${bname} DESTINATION ${libcompizconfig_libdir}/compizconfig/backends ) endfunction (compizconfig_backend bname) ./compizconfig/libcompizconfig/cmake/CMakeLists.txt0000644000004100000410000000021213246301623022723 0ustar www-datawww-dataset (_files LibCompizConfigCommon.cmake ) install ( FILES ${_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/cmake ) ./compizconfig/libcompizconfig/cmake/FindCompizConfig.cmake0000644000004100000410000000647013246301623024371 0ustar www-datawww-data################################################################################ # # FindCompizConfig # # This module finds LibCompizConfig (https://launchpad.net/compiz). It uses FindPkgConfig to # locate CompizConfig and adds the CompizConfig CMake module path to the CMake # module path. It also loads the LibCompizConfigDefaults that sets all variables # to compile Compiz modules. # # This module sets the following variables: # COMPIZCONFIG_FOUND ... set to true if compiz and its CompizDefaults macro # is found # # Variables set by the FindPkgConfig macro for compiz # COMPIZCONFIG_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') # COMPIZCONFIG_LDFLAGS ... all required linker flags # COMPIZCONFIG_LDFLAGS_OTHER ... all other linker flags # COMPIZCONFIG_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') # COMPIZCONFIG_CFLAGS ... all required cflags # COMPIZCONFIG_CFLAGS_OTHER ... the other compiler flags # COMPIZCONFIG_VERSION ... version of the module # COMPIZCONFIG_PREFIX ... prefix-directory of the module # COMPIZCONFIG_INCLUDEDIR ... include-dir of the module # COMPIZCONFIG_LIBDIR ... lib-dir of the module # # If the _COMPIZCONFIG_INTERNAL variable is set to true, then this module will do # nothing. This is required for the Compiz core package build system. # # Author: Dennis Kasprzyk # ################################################################################ if (NOT _COMPIZCONFIG_INTERNAL) if (CompizConfig_FIND_REQUIRED) set (_req REQUIRED) endif () # look for pkg-config find_package (PkgConfig ${_req}) if (PKG_CONFIG_FOUND) # do we need to look for a specified version? set (_comp_ver) if (CompizConfig_FIND_VERSION) if (CompizConfig_FIND_VERSION_EXACT) set (_comp_ver "=${CompizConfig_FIND_VERSION}") else () set (_comp_ver ">=${CompizConfig_FIND_VERSION}") endif () endif () # add install prefix to pkgconfig search path if needed string (REGEX REPLACE "([\\+\\(\\)\\^\\\$\\.\\-\\*\\?\\|])" "\\\\\\1" PKGCONFIG_REGEX ${CMAKE_INSTALL_PREFIX}) set (PKGCONFIG_REGEX ".*${PKGCONFIG_REGEX}/lib/pkgconfig:${PKGCONFIG_REGEX}/share/pkgconfig.*") if (NOT "$ENV{PKG_CONFIG_PATH}" MATCHES "${PKGCONFIG_REGEX}") if ("" STREQUAL "$ENV{PKG_CONFIG_PATH}") set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig") else () set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif () endif () # look for compiz pkg_check_modules (COMPIZCONFIG ${_req} "libcompizconfig") # is the LibCompizConfigCommon module installed? find_path(_compiz_def_macro LibCompizConfigCommon.cmake ${COMPIZCONFIG_PREFIX}/share/compiz/cmake) if (COMPIZCONFIG_FOUND AND _compiz_def_macro) # everything found. Set module path and include defaults module set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZCONFIG_PREFIX}/share/compiz/cmake) include (LibCompizConfigCommon) else () set (COMPIZCONFIG_FOUND 0) endif () if (Compiz_FIND_REQUIRED AND NOT COMPIZCONFIG_FOUND) message (FATAL_ERROR "Unable to find CompizConfig ${_comp_ver}") endif () endif () endif () ./compizconfig/libcompizconfig/LICENSE.gpl0000644000004100000410000004310313246301623020677 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ./compizconfig/libcompizconfig/LICENSE.lgpl0000644000004100000410000006350413246301623021062 0ustar www-datawww-data GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ./compizconfig/libcompizconfig/libcompizconfig_internal.pc.in0000644000004100000410000000056513246301623025121 0ustar www-datawww-dataprefix=@CMAKE_CURRENT_BINARY_DIR@/src/ exec_prefix=@CMAKE_CURRENT_BINARY_DIR@/src/ libdir=@CMAKE_CURRENT_BINARY_DIR@/src/ includedir=@CMAKE_CURRENT_SOURCE_DIR@/include Name: libcompizconfig_internal Description: Compiz configuration system (internal) Version: @VERSION@ Libs: -L@CMAKE_CURRENT_BINARY_DIR@/src/ -lcompizconfig Cflags: -I@CMAKE_CURRENT_SOURCE_DIR@/include ./compizconfig/libcompizconfig/tests/0000755000004100000410000000000013246301624020253 5ustar www-datawww-data./compizconfig/libcompizconfig/tests/CMakeLists.txt0000644000004100000410000001377613246301623023030 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS}) include_directories (${CMAKE_SOURCE_DIR}/include) include_directories (${CMAKE_SOURCE_DIR}/tests/shared) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../../mocks/libcompizconfig) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories (${CMAKE_SOURCE_DIR}/compizconfig/tests) link_directories (${CMAKE_INSTALL_PREFIX}/lib) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../mocks/libcompizconfig) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../tests/) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../src/) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_definitions (-DSYSCONFDIR=\\\"${COMPIZ_SYSCONFDIR}\\\") add_executable (compizconfig_test_ccs_object ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_object.cpp) add_executable (compizconfig_test_ccs_context ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_context.cpp) add_executable (compizconfig_test_ccs_plugin ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_plugin.cpp) add_executable (compizconfig_test_ccs_setting ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_setting.cpp) add_executable (compizconfig_test_ccs_backend ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_backend.cpp) add_executable (compizconfig_test_ccs_text_file ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_text_file.cpp) add_executable (compizconfig_test_ccs_mock_backend_conformance ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_mock_backend_conformance.cpp) add_executable (compizconfig_test_ccs_util ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_util.cpp) add_executable (compizconfig_test_ccs_upgrade_internal ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_ccs_settings_upgrade_internal.cpp) if (HAVE_PROTOBUF) set (LIBCOMPIZCONFIG_LIBRARIES ${LIBCOMPIZCONFIG_LIBRARIES} protobuf) endif (HAVE_PROTOBUF) target_link_libraries (compizconfig_test_ccs_object ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig) target_link_libraries (compizconfig_test_ccs_context ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_config_file_mock compizconfig_ccs_backend_loader_mock compizconfig_ccs_backend_mock) target_link_libraries (compizconfig_test_ccs_plugin ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock) target_link_libraries (compizconfig_test_ccs_backend ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_backend_mock) target_link_libraries (compizconfig_test_ccs_mock_backend_conformance ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_backend_mock compizconfig_ccs_backend_conformance_test compizconfig_ccs_item_in_list_matcher compizconfig_ccs_list_equality compizconfig_ccs_list_wrapper compizconfig_ccs_setting_value_operators compizconfig_ccs_test_value_combinations) target_link_libraries (compizconfig_test_ccs_setting ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_list_wrapper) target_link_libraries (compizconfig_test_ccs_text_file ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${LIBCOMPIZCONFIG_LIBRARIES} ccs_text_file_interface compizconfig_ccs_text_file_mock compizconfig) target_link_libraries (compizconfig_test_ccs_upgrade_internal ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ccs_settings_upgrade_internal compizconfig compizconfig_ccs_context_mock compizconfig_ccs_plugin_mock compizconfig_ccs_setting_mock compizconfig_ccs_item_in_list_matcher compizconfig_ccs_setting_value_matcher ) target_link_libraries (compizconfig_test_ccs_util ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} compizconfig ) compiz_discover_tests (compizconfig_test_ccs_object COVERAGE compizconfig) compiz_discover_tests (compizconfig_test_ccs_context COVERAGE compizconfig_ccs_context_mock) compiz_discover_tests (compizconfig_test_ccs_plugin COVERAGE compizconfig_ccs_plugin_mock) compiz_discover_tests (compizconfig_test_ccs_setting COVERAGE compizconfig_ccs_setting_mock) compiz_discover_tests (compizconfig_test_ccs_mock_backend_conformance COVERAGE compizconfig_ccs_backend_mock) compiz_discover_tests (compizconfig_test_ccs_text_file COVERAGE ccs_text_file_interface compizconfig_ccs_text_file_mock) compiz_discover_tests (compizconfig_test_ccs_upgrade_internal COVERAGE ccs_settings_upgrade_internal) compiz_discover_tests (compizconfig_test_ccs_util COVERAGE compizconfig) ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_context.cpp0000644000004100000410000002654413246301623027113 0ustar www-datawww-data#include #include #include #include #include #include "ccs_backend_loader_interface.h" #include "ccs_backend_loader.h" #include "ccs_config_file_interface.h" #include "ccs_config_file.h" #include "ccs-backend.h" #include "ccs-private.h" #include "compizconfig_ccs_config_file_mock.h" #include "compizconfig_ccs_backend_loader_mock.h" #include "compizconfig_ccs_backend_mock.h" #include "compizconfig_ccs_context_mock.h" using ::testing::_; using ::testing::AtLeast; using ::testing::SetArgPointee; using ::testing::Return; using ::testing::DoAll; using ::testing::Eq; class CCSContextTest : public ::testing::Test { }; TEST_F(CCSContextTest, TestMock) { CCSContext *context = ccsMockContextNew (); CCSContextGMock *mock = (CCSContextGMock *) ccsObjectGetPrivate (context); EXPECT_CALL (*mock, getPlugins ()); EXPECT_CALL (*mock, getCategories ()); EXPECT_CALL (*mock, getChangedSettings ()); EXPECT_CALL (*mock, getScreenNum ()); EXPECT_CALL (*mock, addChangedSetting (_)); EXPECT_CALL (*mock, clearChangedSettings ()); EXPECT_CALL (*mock, stealChangedSettings ()); EXPECT_CALL (*mock, getPrivatePtr ()); EXPECT_CALL (*mock, setPrivatePtr (_)); EXPECT_CALL (*mock, loadPlugin (_)); EXPECT_CALL (*mock, findPlugin (_)); EXPECT_CALL (*mock, pluginIsActive (_)); EXPECT_CALL (*mock, getActivePluginList ()); EXPECT_CALL (*mock, getSortedPluginStringList ()); EXPECT_CALL (*mock, setBackend (_)); EXPECT_CALL (*mock, getBackend ()); EXPECT_CALL (*mock, setIntegrationEnabled (_)); EXPECT_CALL (*mock, setProfile (_)); EXPECT_CALL (*mock, setPluginListAutoSort (_)); EXPECT_CALL (*mock, getIntegrationEnabled ()); EXPECT_CALL (*mock, getProfile ()); EXPECT_CALL (*mock, getPluginListAutoSort ()); EXPECT_CALL (*mock, processEvents (_)); EXPECT_CALL (*mock, readSettings ()); EXPECT_CALL (*mock, writeSettings ()); EXPECT_CALL (*mock, writeChangedSettings ()); EXPECT_CALL (*mock, exportToFile (_, _)); EXPECT_CALL (*mock, importFromFile (_, _)); EXPECT_CALL (*mock, canEnablePlugin (_)); EXPECT_CALL (*mock, canDisablePlugin (_)); EXPECT_CALL (*mock, getExistingProfiles ()); EXPECT_CALL (*mock, deleteProfile (_)); char *foo = strdup ("foo"); char *bar = strdup ("bar"); ccsContextGetPlugins (context); ccsContextGetCategories (context); ccsContextGetChangedSettings (context); ccsContextGetScreenNum (context); ccsContextAddChangedSetting (context, NULL); ccsContextClearChangedSettings (context); ccsContextStealChangedSettings (context); ccsContextGetPrivatePtr (context); ccsContextSetPrivatePtr (context, NULL); ccsLoadPlugin (context, foo); ccsFindPlugin (context, foo); ccsPluginIsActive (context, foo); ccsGetActivePluginList (context); ccsGetSortedPluginStringList (context); ccsSetBackend (context, bar); ccsGetBackend (context); ccsSetIntegrationEnabled (context, TRUE); ccsSetProfile (context, foo); ccsSetPluginListAutoSort (context, TRUE); ccsGetIntegrationEnabled (context); ccsGetProfile (context); ccsGetPluginListAutoSort (context); ccsProcessEvents (context, 0); ccsReadSettings (context); ccsWriteSettings (context); ccsWriteChangedSettings (context); ccsExportToFile (context, bar, TRUE); ccsImportFromFile (context, foo, FALSE); ccsCanEnablePlugin (context, NULL); ccsCanDisablePlugin (context, NULL); ccsGetExistingProfiles (context); ccsDeleteProfile (context, foo); free (foo); free (bar); ccsFreeContext (context); } const CCSInterfaceTable ccsMockInterfaceTable = { &ccsDefaultContextInterface, NULL, NULL, NULL, NULL }; class CCSContextTestWithMockedBackendProfile : public ::testing::Test { public: CCSContextTestWithMockedBackendProfile () : loader (ccsMockBackendLoaderNew (&ccsDefaultObjectAllocator)), config (ccsMockConfigFileNew (&ccsDefaultObjectAllocator)), backend (AutoDestroy (ccsMockBackendNew (), ccsFreeMockBackend)), mockLoader (reinterpret_cast (ccsObjectGetPrivate (loader))), mockConfig (reinterpret_cast (ccsObjectGetPrivate (config))), mockBackend (reinterpret_cast (ccsObjectGetPrivate (backend.get ()))), mockBackendStr ("mock"), availableProfileStr ("available"), unavailableProfileStr ("unavailable") { inst = this; /* Insert a stub dynamic backend interface into the mock backend */ CCSDynamicBackendInterface backendIface = { CCSContextTestWithMockedBackendProfile::GetMockBackendName, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportRead, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportWrite, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportProfiles, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportIntegration, CCSContextTestWithMockedBackendProfile::GetMockBackendSupportRaw }; stubDynamicBackend = backendIface; ccsObjectAddInterface (backend.get (), (const CCSInterface *) &stubDynamicBackend, GET_INTERFACE_TYPE (CCSDynamicBackendInterface)); char *mockBackendCopy = strdup (mockBackendStr.c_str ()); EXPECT_CALL (*mockConfig, readConfigOption (_, _)).Times (AtLeast (0)); EXPECT_CALL (*mockConfig, writeConfigOption (_, _)).Times (AtLeast (0)); EXPECT_CALL (*mockConfig, setConfigWatchCallback (_, _)).Times (AtLeast (0)); EXPECT_CALL (*mockLoader, loadBackend (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (*mockBackend, init (_)).Times (AtLeast (0)); EXPECT_CALL (*mockBackend, getExistingProfiles (_)).Times (AtLeast (0)); ON_CALL (*mockConfig, readConfigOption (OptionBackend, _)) .WillByDefault (DoAll (SetArgPointee <1> (mockBackendCopy), Return (1))); ON_CALL (*mockLoader, loadBackend (_, _, Eq (mockBackendStr))) .WillByDefault (Return (backend.get ())); /* We are using ccsFreeContext instead of ccsContextDestroy as that does not * free the backend as well */ context = AutoDestroy (ccsEmptyContextNew (0, CCSContextTestWithMockedBackendProfile::ImportProfile, CCSContextTestWithMockedBackendProfile::AvailableProfiles, loader, config, &ccsMockInterfaceTable), ccsFreeContext); } ~CCSContextTestWithMockedBackendProfile () { inst = NULL; } protected: void AddAvailableSysconfProfile (const std::string &profile) { availableProfiles.push_back (profile); } void ExistingProfile (const std::string &profile) { CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); string->value = strdup (profile.c_str ()); ccsStringRef (string); CCSStringList existing (ccsStringListAppend (NULL, string)); ON_CALL (*mockBackend, getExistingProfiles (_)).WillByDefault (Return (existing)); } private: static CCSStringList AvailableProfiles (const char *directory) { CCSStringList list = NULL; for (std::vector ::iterator it = inst->availableProfiles.begin (); it != inst->availableProfiles.end (); ++it) { CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); ccsStringRef (string); string->value = strdup (it->c_str ()); list = ccsStringListAppend (list, string); } return list; } static Bool ImportProfile (CCSContext *context, const char *fileName, Bool overwriteNonDefault) { return inst->ImportProfileVerify (context, fileName, overwriteNonDefault); } static const char * GetMockBackendName (CCSDynamicBackend *backend) { return inst->mockBackendStr.c_str (); } static Bool GetMockBackendSupportRead (CCSDynamicBackend *backend) { return TRUE; } static Bool GetMockBackendSupportWrite (CCSDynamicBackend *backend) { return TRUE; } static Bool GetMockBackendSupportIntegration (CCSDynamicBackend *backend) { return FALSE; } static Bool GetMockBackendSupportProfiles (CCSDynamicBackend *backend) { return TRUE; } static CCSBackend * GetMockBackendSupportRaw (CCSDynamicBackend *backend) { return inst->backend.get (); } protected: MOCK_METHOD3 (ImportProfileVerify, Bool (CCSContext *, const char*, Bool)); CCSBackendLoader *loader; CCSConfigFile *config; /* This is not managed by the context */ boost::shared_ptr backend; CCSBackendLoaderGMock *mockLoader; CCSConfigFileGMock *mockConfig; CCSBackendGMock *mockBackend; const std::string mockBackendStr; const std::string availableProfileStr; const std::string unavailableProfileStr; CCSDynamicBackendInterface stubDynamicBackend; boost::shared_ptr context; private: std::vector availableProfiles; protected: static CCSContextTestWithMockedBackendProfile *inst; }; CCSContextTestWithMockedBackendProfile * CCSContextTestWithMockedBackendProfile::inst = NULL; TEST_F (CCSContextTestWithMockedBackendProfile, TestSetup) { } /* We should always import any new profiles that we encounter which are not * available from the backend. The reason for this being that we don't want to * just load the profile and end up with an empty config */ TEST_F (CCSContextTestWithMockedBackendProfile, ImportProfileIfNotAvailableInBackend) { const std::string sysconfProfile (std::string (SYSCONFDIR) + "/compizconfig/" + unavailableProfileStr); ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (sysconfProfile); EXPECT_CALL (*this, ImportProfileVerify (_, Eq (sysconfProfile), _)) .WillOnce (Return (TRUE)); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } TEST_F (CCSContextTestWithMockedBackendProfile, ImportProfileDotIni) { const std::string sysconfProfile (std::string (SYSCONFDIR) + "/compizconfig/" + unavailableProfileStr + ".ini"); ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (sysconfProfile); EXPECT_CALL (*this, ImportProfileVerify (_, Eq (sysconfProfile), _)) .WillOnce (Return (TRUE)); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } TEST_F (CCSContextTestWithMockedBackendProfile, ImportProfileDotProfile) { const std::string sysconfProfile (std::string (SYSCONFDIR) + "/compizconfig/" + unavailableProfileStr + ".profile"); ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (sysconfProfile); EXPECT_CALL (*this, ImportProfileVerify (_, Eq (sysconfProfile), _)) .WillOnce (Return (TRUE)); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } /* Not when available in both */ TEST_F (CCSContextTestWithMockedBackendProfile, NoImportProfileIfAvailableInBackend) { ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (availableProfileStr); EXPECT_CALL (*this, ImportProfileVerify (_, _, _)).Times (0); ccsSetProfile (context.get (), availableProfileStr.c_str ()); } /* Not when ther selected profile isn't in sysconfdir */ TEST_F (CCSContextTestWithMockedBackendProfile, NoImportProfileIfNotInDir) { ExistingProfile (availableProfileStr); AddAvailableSysconfProfile (availableProfileStr); EXPECT_CALL (*this, ImportProfileVerify (_, _, _)).Times (0); ccsSetProfile (context.get (), unavailableProfileStr.c_str ()); } ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_settings_upgrade_internal.cpp0000644000004100000410000007060413246301623032666 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include "compizconfig_ccs_context_mock.h" #include "compizconfig_ccs_plugin_mock.h" #include "compizconfig_ccs_setting_mock.h" #include "ccs_settings_upgrade_internal.h" #include "gtest_shared_characterwrapper.h" #include "gtest_shared_autodestroy.h" #include "gtest_unspecified_bool_type_matcher.h" #include "compizconfig_ccs_list_equality.h" #include "compizconfig_ccs_item_in_list_matcher.h" #include "compizconfig_ccs_list_wrapper.h" #include "compizconfig_ccs_setting_value_operators.h" #include "compizconfig_ccs_setting_value_matcher.h" using ::testing::IsNull; using ::testing::Eq; using ::testing::Return; using ::testing::AtLeast; using ::testing::_; using ::testing::AllOf; using ::testing::Not; using ::testing::Matcher; using ::testing::MakeMatcher; using ::testing::MatcherInterface; using ::testing::Pointee; using ::testing::PrintToString; namespace cc = compiz::config; namespace cci = compiz::config::impl; class CCSSettingsUpgradeInternalTest : public ::testing::Test { }; namespace { static const std::string CCS_SETTINGS_UPGRADE_TEST_CORRECT_FILENAME = "org.compiz.general.1.upgrade"; static const std::string CCS_SETTINGS_UPGRADE_TEST_INCORRECT_FILENAME = "1.upgra"; static const std::string CCS_SETTINGS_UPGRADE_TEST_VERY_INCORRECT_FILENAME = "1"; static const std::string CCS_SETTINGS_UPGRADE_TEST_CORRECT_DOMAIN = "org.compiz"; static const std::string CCS_SETTINGS_UPGRADE_TEST_CORRECT_PROFILE = "general"; static const unsigned int CCS_SETTINGS_UPGRADE_TEST_CORRECT_NUM = 1; } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndSetValues) { char *profileName = NULL; char *domainName = NULL; unsigned int num; EXPECT_THAT (ccsUpgradeGetDomainNumAndProfile (CCS_SETTINGS_UPGRADE_TEST_CORRECT_FILENAME.c_str (), &domainName, &num, &profileName), IsTrue ()); CharacterWrapper profileNameC (profileName); CharacterWrapper domainNameC (domainName); EXPECT_EQ (CCS_SETTINGS_UPGRADE_TEST_CORRECT_PROFILE, profileName); EXPECT_EQ (CCS_SETTINGS_UPGRADE_TEST_CORRECT_DOMAIN, domainName); EXPECT_EQ (num, CCS_SETTINGS_UPGRADE_TEST_CORRECT_NUM); } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndSetValuesReturnsFalseIfInvalid) { char *profileName = NULL; char *domainName = NULL; unsigned int num; EXPECT_THAT (ccsUpgradeGetDomainNumAndProfile (CCS_SETTINGS_UPGRADE_TEST_INCORRECT_FILENAME.c_str (), &domainName, &num, &profileName), IsFalse ()); EXPECT_THAT (profileName, IsNull ()); EXPECT_THAT (domainName, IsNull ()); EXPECT_THAT (ccsUpgradeGetDomainNumAndProfile (CCS_SETTINGS_UPGRADE_TEST_VERY_INCORRECT_FILENAME.c_str (), &domainName, &num, &profileName), IsFalse ()); EXPECT_THAT (profileName, IsNull ()); EXPECT_THAT (domainName, IsNull ()); } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndReturnTrueForUpgradeFileName) { EXPECT_THAT (ccsUpgradeNameFilter (CCS_SETTINGS_UPGRADE_TEST_CORRECT_FILENAME.c_str ()), IsTrue ()); } TEST (CCSSettingsUpgradeInternalTest, TestDetokenizeAndReturnFalseForNoUpgradeFileName) { EXPECT_THAT (ccsUpgradeNameFilter (CCS_SETTINGS_UPGRADE_TEST_INCORRECT_FILENAME.c_str ()), IsFalse ()); EXPECT_THAT (ccsUpgradeNameFilter (CCS_SETTINGS_UPGRADE_TEST_VERY_INCORRECT_FILENAME.c_str ()), IsFalse ()); } namespace { const std::string CCS_SETTINGS_UPGRADE_TEST_MOCK_PLUGIN_NAME = "mock"; const std::string CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE = "setting_one"; const std::string CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_TWO = "setting_two"; typedef std::tr1::tuple , CCSSettingGMock *> MockedSetting; inline CCSSetting * Real (MockedSetting &ms) { return (std::tr1::get <0> (ms)).get (); } inline CCSSettingGMock & Mock (MockedSetting &ms) { return *(std::tr1::get <1> (ms)); } } class CCSSettingsUpgradeTestWithMockContext : public ::testing::Test { public: typedef enum _AddMode { DoNotAddSettingToPlugin, AddSettingToPlugin } AddMode; virtual void SetUp () { context = AutoDestroy (ccsMockContextNew (), ccsFreeMockContext); plugin = AutoDestroy (ccsMockPluginNew (), ccsFreeMockPlugin); ON_CALL (MockPlugin (), getName ()) .WillByDefault ( Return ( CCS_SETTINGS_UPGRADE_TEST_MOCK_PLUGIN_NAME.c_str ())); ON_CALL (MockPlugin (), getContext ()) .WillByDefault ( Return ( context.get ())); } CCSPluginGMock & MockPlugin () { return *(reinterpret_cast (ccsObjectGetPrivate (plugin.get ()))); } CCSContextGMock & MockContext () { return *(reinterpret_cast (ccsObjectGetPrivate (context.get ()))); } void InitializeValueCommon (CCSSettingValue &value, CCSSetting *setting) { value.parent = setting; value.refCount = 1; } void InitializeValueForSetting (CCSSettingValue &value, CCSSetting *setting) { InitializeValueCommon (value, setting); value.isListChild = FALSE; } MockedSetting SpawnSetting (const std::string &name, CCSSettingType type, AddMode addMode = AddSettingToPlugin) { boost::shared_ptr setting (ccsMockSettingNew (), ccsSettingUnref); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting.get ())); ON_CALL (*gmockSetting, getName ()) .WillByDefault ( Return ( name.c_str ())); ON_CALL (*gmockSetting, getType ()) .WillByDefault ( Return ( type)); ON_CALL (*gmockSetting, getParent ()) .WillByDefault ( Return ( plugin.get ())); if (addMode == AddSettingToPlugin) { ON_CALL (MockPlugin (), findSetting (Eq (name.c_str ()))) .WillByDefault ( Return ( setting.get ())); } return MockedSetting (setting, gmockSetting); } private: boost::shared_ptr context; boost::shared_ptr plugin; }; namespace { typedef boost::shared_ptr > CCSSettingListWrapperPtr; CCSSettingListWrapperPtr constructSettingListWrapper (CCSSettingList list, cci::ListStorageType storageType) { return boost::make_shared > (list, ccsSettingListFree, ccsSettingListAppend, ccsSettingListRemove, storageType); } } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestNoClearValuesSettingNotFound) { MockedSetting settingOne (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))); EXPECT_CALL (Mock (settingOne), getParent ()); EXPECT_CALL (Mock (settingOne), getName ()); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (settingOne)), cci::Shallow)); ccsUpgradeClearValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestClearValuesInListNonListType) { MockedSetting resetSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToReset (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue valueToReset; CCSSettingValue valueResetIdentifier; InitializeValueForSetting (valueToReset, Real (settingToReset)); InitializeValueForSetting (valueResetIdentifier, Real (resetSettingIdentifier)); valueToReset.value.asInt = 7; valueResetIdentifier.value.asInt = 7; CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (resetSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToReset))); EXPECT_CALL (Mock (resetSettingIdentifier), getParent ()); EXPECT_CALL (Mock (resetSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToReset), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (resetSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToReset), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getValue ()).WillOnce (Return (&valueResetIdentifier)); EXPECT_CALL (Mock (settingToReset), getValue ()).WillOnce (Return (&valueToReset)); EXPECT_CALL (Mock (settingToReset), resetToDefault (IsTrue ())); ccsUpgradeClearValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestClearValuesInListNonListTypeNotMatched) { MockedSetting resetSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToReset (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue valueToReset; CCSSettingValue valueResetIdentifier; InitializeValueForSetting (valueToReset, Real (settingToReset)); InitializeValueForSetting (valueResetIdentifier, Real (resetSettingIdentifier)); valueToReset.value.asInt = 2; valueResetIdentifier.value.asInt = 7; CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (resetSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToReset))); EXPECT_CALL (Mock (resetSettingIdentifier), getParent ()); EXPECT_CALL (Mock (resetSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToReset), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (resetSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToReset), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getValue ()).WillOnce (Return (&valueResetIdentifier)); EXPECT_CALL (Mock (settingToReset), getValue ()).WillOnce (Return (&valueToReset)); ccsUpgradeClearValues (*list); } /* This actually copies the value, but its harmless */ MATCHER_P (CheckValueParent, expectedParent, std::string ("Value parent is ") + PrintToString (expectedParent)) { return arg.parent == expectedParent; } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestNoAddValuesSettingNotFound) { MockedSetting settingOne (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))); EXPECT_CALL (Mock (settingOne), getParent ()); EXPECT_CALL (Mock (settingOne), getName ()); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (settingOne)), cci::Shallow)); ccsUpgradeAddValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestAddValuesInListNonListType) { MockedSetting addSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToBeChanged (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue valueToReset; CCSSettingValue valueResetIdentifier; InitializeValueForSetting (valueToReset, Real (settingToBeChanged)); InitializeValueForSetting (valueResetIdentifier, Real (addSettingIdentifier)); valueToReset.value.asInt = 7; valueResetIdentifier.value.asInt = 7; CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (addSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToBeChanged))); EXPECT_CALL (Mock (addSettingIdentifier), getParent ()); EXPECT_CALL (Mock (addSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToBeChanged), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (addSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToBeChanged), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (addSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (addSettingIdentifier), getValue ()).WillOnce (Return (&valueResetIdentifier)); EXPECT_CALL (Mock (settingToBeChanged), setValue (Pointee (SettingValueMatch (valueResetIdentifier, TypeInt, &info)), IsTrue ())); ccsUpgradeAddValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestNoReplaceValuesSettingNotFound) { MockedSetting fromSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting toSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))); EXPECT_CALL (Mock (fromSettingIdentifier), getParent ()); EXPECT_CALL (Mock (fromSettingIdentifier), getName ()); CCSSettingListWrapperPtr replaceFromValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (fromSettingIdentifier)), cci::Shallow)); CCSSettingListWrapperPtr replaceToValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (toSettingIdentifier)), cci::Shallow)); ccsUpgradeReplaceValues (*replaceFromValueSettings, *replaceToValueSettings); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestReplaceValuesInListNonListType) { MockedSetting fromSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting toSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToBeChanged (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue settingToBeChangedValue; CCSSettingValue fromSettingIdentifierValue; CCSSettingValue toSettingIdentifierValue; InitializeValueForSetting (settingToBeChangedValue, Real (settingToBeChanged)); InitializeValueForSetting (fromSettingIdentifierValue, Real (fromSettingIdentifier)); InitializeValueForSetting (toSettingIdentifierValue, Real (toSettingIdentifier)); settingToBeChangedValue.value.asInt = 7; fromSettingIdentifierValue.value.asInt = 7; toSettingIdentifierValue.value.asInt = 8; CCSSettingListWrapperPtr replaceFromValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (fromSettingIdentifier)), cci::Shallow)); CCSSettingListWrapperPtr replaceToValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (toSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToBeChanged))); EXPECT_CALL (Mock (fromSettingIdentifier), getParent ()); EXPECT_CALL (Mock (fromSettingIdentifier), getName ()); EXPECT_CALL (Mock (toSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToBeChanged), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (fromSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToBeChanged), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (fromSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (toSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (settingToBeChanged), getValue ()).WillOnce (Return (&settingToBeChangedValue)); EXPECT_CALL (Mock (fromSettingIdentifier), getValue ()).WillOnce (Return (&fromSettingIdentifierValue)); EXPECT_CALL (Mock (toSettingIdentifier), getValue ()).WillOnce (Return (&toSettingIdentifierValue)); EXPECT_CALL (Mock (settingToBeChanged), setValue (Pointee (SettingValueMatch (toSettingIdentifierValue, TypeInt, &info)), IsTrue ())); ccsUpgradeReplaceValues (*replaceFromValueSettings, *replaceToValueSettings); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestReplaceValuesInListNonListTypeNoMatch) { MockedSetting fromSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting toSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt, DoNotAddSettingToPlugin)); MockedSetting settingToBeChanged (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeInt)); CCSSettingValue settingToBeChangedValue; CCSSettingValue fromSettingIdentifierValue; CCSSettingValue toSettingIdentifierValue; InitializeValueForSetting (settingToBeChangedValue, Real (settingToBeChanged)); InitializeValueForSetting (fromSettingIdentifierValue, Real (fromSettingIdentifier)); InitializeValueForSetting (toSettingIdentifierValue, Real (toSettingIdentifier)); settingToBeChangedValue.value.asInt = 6; fromSettingIdentifierValue.value.asInt = 7; toSettingIdentifierValue.value.asInt = 8; CCSSettingListWrapperPtr replaceFromValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (fromSettingIdentifier)), cci::Shallow)); CCSSettingListWrapperPtr replaceToValueSettings (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (toSettingIdentifier)), cci::Shallow)); EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToBeChanged))); EXPECT_CALL (Mock (fromSettingIdentifier), getParent ()); EXPECT_CALL (Mock (fromSettingIdentifier), getName ()); CCSSettingInfo info; info.forInt.max = 0; info.forInt.min = 10; /* ccsCheckValueEq needs to know the type and info about this type */ EXPECT_CALL (Mock (settingToBeChanged), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (fromSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToBeChanged), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (fromSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (toSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (settingToBeChanged), getValue ()).WillOnce (Return (&settingToBeChangedValue)); EXPECT_CALL (Mock (fromSettingIdentifier), getValue ()).WillOnce (Return (&fromSettingIdentifierValue)); ccsUpgradeReplaceValues (*replaceFromValueSettings, *replaceToValueSettings); } namespace { boost::shared_ptr newOwnedCCSStringFromStaticCharArray (const char *cStr) { CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); boost::shared_ptr str (string, ccsStringUnref); str->value = strdup (cStr); ccsStringRef (str.get ()); return str; } void ccsSettingValueListDeepFree (CCSSettingValueList list) { ccsSettingValueListFree (list, TRUE); } typedef boost::shared_ptr > CCSStringListWrapperPtr; CCSStringListWrapperPtr constructStrListWrapper (CCSStringList list, cci::ListStorageType storageType) { return boost::make_shared > (list, ccsStringListFree, ccsStringListAppend, ccsStringListRemove, storageType); } } /* TODO: These tests need to be cleaned up. There are multiple asserts per-test here */ TEST_F (CCSSettingsUpgradeTestWithMockContext, TestAddValuesInListAppendsValuesToListFromList) { const std::string valueOne ("value_one"); const std::string valueThree ("value_three"); MockedSetting appendSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList, DoNotAddSettingToPlugin)); MockedSetting settingToAppendValuesTo (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList)); boost::shared_ptr stringToAppendOne (newOwnedCCSStringFromStaticCharArray (valueOne.c_str ())); boost::shared_ptr stringInBothLists (newOwnedCCSStringFromStaticCharArray (valueThree.c_str ())); CCSStringListWrapperPtr settingsStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringInBothLists.get ()), cci::Shallow)); boost::shared_ptr <_CCSSettingValueList> settingStrValueList (AutoDestroy (ccsGetValueListFromStringList (*settingsStrList, Real (settingToAppendValuesTo)), ccsSettingValueListDeepFree)); CCSStringListWrapperPtr appendStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringInBothLists.get ()), cci::Shallow)); appendStrList->append (stringToAppendOne.get ()); boost::shared_ptr <_CCSSettingValueList> appendStrValueList (AutoDestroy (ccsGetValueListFromStringList (*appendStrList, Real (appendSettingIdentifier)), ccsSettingValueListDeepFree)); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (appendSettingIdentifier)), cci::Shallow)); CCSSettingValue valueToHaveSubValuesAdded; CCSSettingValue valueSubValuesAddIdentifiers; InitializeValueForSetting (valueToHaveSubValuesAdded, Real (settingToAppendValuesTo)); InitializeValueForSetting (valueSubValuesAddIdentifiers, Real (appendSettingIdentifier)); valueToHaveSubValuesAdded.value.asList = settingStrValueList.get (); valueSubValuesAddIdentifiers.value.asList = appendStrValueList.get (); CCSSettingInfo info; info.forList.listType = TypeString; EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToAppendValuesTo))); EXPECT_CALL (Mock (appendSettingIdentifier), getParent ()); EXPECT_CALL (Mock (appendSettingIdentifier), getName ()); EXPECT_CALL (Mock (appendSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToAppendValuesTo), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (appendSettingIdentifier), getValue ()).WillOnce (Return (&valueSubValuesAddIdentifiers)); EXPECT_CALL (Mock (settingToAppendValuesTo), getValue ()).WillOnce (Return (&valueToHaveSubValuesAdded)); EXPECT_CALL (Mock (settingToAppendValuesTo), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (appendSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); const CCSSettingValue &appendedStringInListValue = *appendStrValueList->next->data; EXPECT_CALL (Mock (settingToAppendValuesTo), setList ( IsSettingValueInSettingValueCCSList ( AllOf (SettingValueMatch (appendedStringInListValue, TypeString, &info), CheckValueParent (Real (settingToAppendValuesTo)))), IsTrue ())); ccsUpgradeAddValues (*list); } TEST_F (CCSSettingsUpgradeTestWithMockContext, TestClearValuesInListRemovesValuesFromList) { const std::string valueOne ("value_one"); const std::string valueThree ("value_three"); MockedSetting resetSettingIdentifier (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList, DoNotAddSettingToPlugin)); MockedSetting settingToRemoveValuesFrom (SpawnSetting (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE, TypeList)); boost::shared_ptr stringForRemovalOne (newOwnedCCSStringFromStaticCharArray (valueOne.c_str ())); boost::shared_ptr stringNotRemoved (newOwnedCCSStringFromStaticCharArray (valueThree.c_str ())); CCSStringListWrapperPtr settingsStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringForRemovalOne.get ()), cci::Shallow)); settingsStrList->append (stringNotRemoved.get ()); boost::shared_ptr <_CCSSettingValueList> settingStrValueList (AutoDestroy (ccsGetValueListFromStringList (*settingsStrList, Real (settingToRemoveValuesFrom)), ccsSettingValueListDeepFree)); CCSStringListWrapperPtr removeStrList (constructStrListWrapper (ccsStringListAppend (NULL, stringForRemovalOne.get ()), cci::Shallow)); boost::shared_ptr <_CCSSettingValueList> removeStrValueList (AutoDestroy (ccsGetValueListFromStringList (*removeStrList, Real (resetSettingIdentifier)), ccsSettingValueListDeepFree)); CCSSettingListWrapperPtr list (constructSettingListWrapper (ccsSettingListAppend (NULL, Real (resetSettingIdentifier)), cci::Shallow)); CCSSettingValue valueToHaveSubValuesRemoved; CCSSettingValue valueSubValuesResetIdentifiers; InitializeValueForSetting (valueToHaveSubValuesRemoved, Real (settingToRemoveValuesFrom)); InitializeValueForSetting (valueSubValuesResetIdentifiers, Real (resetSettingIdentifier)); valueToHaveSubValuesRemoved.value.asList = settingStrValueList.get (); valueSubValuesResetIdentifiers.value.asList = removeStrValueList.get (); CCSSettingInfo info; info.forList.listType = TypeString; EXPECT_CALL (MockPlugin (), findSetting (Eq (CCS_SETTINGS_UPGRADE_TEST_MOCK_SETTING_NAME_ONE))) .WillOnce (Return (Real (settingToRemoveValuesFrom))); EXPECT_CALL (Mock (resetSettingIdentifier), getParent ()); EXPECT_CALL (Mock (resetSettingIdentifier), getName ()); EXPECT_CALL (Mock (resetSettingIdentifier), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (settingToRemoveValuesFrom), getType ()).Times (AtLeast (1)); EXPECT_CALL (Mock (resetSettingIdentifier), getValue ()).WillOnce (Return (&valueSubValuesResetIdentifiers)); EXPECT_CALL (Mock (settingToRemoveValuesFrom), getValue ()).WillOnce (Return (&valueToHaveSubValuesRemoved)); EXPECT_CALL (Mock (settingToRemoveValuesFrom), getInfo ()).WillRepeatedly (Return (&info)); EXPECT_CALL (Mock (resetSettingIdentifier), getInfo ()).WillRepeatedly (Return (&info)); const CCSSettingValue &removedStringInListValue = *removeStrValueList->data; EXPECT_CALL (Mock (settingToRemoveValuesFrom), setList ( Not ( IsSettingValueInSettingValueCCSList ( SettingValueMatch (removedStringInListValue, TypeString, &info))), IsTrue ())); ccsUpgradeClearValues (*list); } ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_mock_backend_conformance.cpp0000644000004100000410000005322713246301623032377 0ustar www-datawww-data#include #include #include #include #include #include "compizconfig_ccs_backend_mock.h" using ::testing::_; using ::testing::Return; using ::testing::Invoke; using ::testing::WithArgs; using ::testing::Combine; using ::testing::ValuesIn; using ::testing::Values; using ::testing::AtLeast; namespace { std::string keynameFromPluginKey (const std::string &plugin, const std::string &key) { return plugin + "/" + key; } } template class ValueForKeyRetreival { public: T GetValueForKey (const std::string &key, const std::map &map) { std::map ::const_iterator it = map.find (key); if (it != map.end ()) return boost::get (it->second); else throw std::exception (); } }; namespace { void doNothingWithCCSSetting (CCSSetting *) {}; const CCSBackendInfo mockBackendInfo = { "mock", "Mock Backend", "Mock Backend for libccs", TRUE, TRUE }; } class MockCCSSettingsTestEnvironment : public CCSSettingsConceptTestEnvironmentInterface { public: virtual void SetUp () { } virtual void TearDown () { } void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mValues[keynameFromPluginKey (plugin, key)] = value; } virtual Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) { return compizconfig::test::boolToBool ( ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues)); } virtual int ReadIntegerAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual float ReadFloatAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual const char * ReadStringAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) { return ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues); } virtual Bool ReadBellAtKey (const std::string &plugin, const std::string &key) { return compizconfig::test::boolToBool ( ValueForKeyRetreival ().GetValueForKey ( keynameFromPluginKey (plugin, key), mValues)); } virtual CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { cci::SettingValueListWrapper::Ptr lw (ValueForKeyRetreival > ().GetValueForKey (keynameFromPluginKey (plugin, key), mValues)); return ccsCopyList (*lw, lw->setting ().get ()); } private: std::map mValues; }; class MockCCSBackendConceptTestEnvironment : public CCSBackendConceptTestEnvironmentInterface { private: virtual void SetUp () { mMockCCSSettingTestEnvironment.SetUp (); } virtual void TearDown () { mMockCCSSettingTestEnvironment.SetUp (); } public: CCSBackend * BackendSetUp (CCSContext *context, CCSContextGMock *gmockContext) { mContext = context; mBackend = ccsMockBackendNew (); mBackendGMock = (CCSBackendGMock *) ccsObjectGetPrivate (mBackend); ON_CALL (*mBackendGMock, readSetting (_, _)) .WillByDefault ( WithArgs<1> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::ReadValueIntoSetting))); ON_CALL (*mBackendGMock, updateSetting (_, _, _)) .WillByDefault ( WithArgs<2> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::ReadValueIntoSetting))); ON_CALL (*mBackendGMock, writeSetting (_, _)) .WillByDefault ( WithArgs<1> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::WriteValueToMap))); ON_CALL (*mBackendGMock, deleteProfile (_, _)) .WillByDefault ( WithArgs <1> ( Invoke ( this, &MockCCSBackendConceptTestEnvironment::DeleteProfile))); return mBackend; } const CCSBackendInfo * GetInfo () { EXPECT_CALL (*mBackendGMock, getInfo ()).WillOnce (Return (&mockBackendInfo)); return &mockBackendInfo; } void BackendTearDown (CCSBackend *backend) { ccsFreeMockBackend (backend); } void AddProfile (const std::string &profile) { mProfiles.push_back (profile); } void SetGetExistingProfilesExpectation (CCSContext *context, CCSContextGMock *gmockContext) { CCSStringList stringList = NULL; CCSString *defaultProfile = reinterpret_cast (calloc (1, sizeof (CCSString))); CCSString *currentProfile = reinterpret_cast (calloc (1, sizeof (CCSString))); EXPECT_CALL (*gmockContext, getProfile ()); defaultProfile->value = strdup ("Default"); currentProfile->value = strdup (ccsGetProfile (context)); ccsStringRef (defaultProfile); ccsStringRef (currentProfile); stringList = ccsStringListAppend (stringList, defaultProfile); stringList = ccsStringListAppend (stringList, currentProfile); for (std::vector ::iterator it = mProfiles.begin (); it != mProfiles.end (); ++it) { if (*it == defaultProfile->value || *it == currentProfile->value) continue; CCSString *string = reinterpret_cast (calloc (1, sizeof (CCSString))); string->value = strdup ((*it).c_str ()); ccsStringRef (string); stringList = ccsStringListAppend (stringList, string); } EXPECT_CALL (*mBackendGMock, getExistingProfiles (context)).WillOnce (Return (stringList)); } void SetDeleteProfileExpectation (const std::string &profileForDeletion, CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, deleteProfile (context, Eq (profileForDeletion))); } void SetReadInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, readInit (context)).WillOnce (Return (TRUE)); } void SetReadDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, readDone (context)); } void SetWriteInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, writeInit (context)).WillOnce (Return (TRUE)); } void SetWriteDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*mBackendGMock, writeDone (context)); } void PreWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*mBackendGMock, writeSetting (_, _)); EXPECT_CALL (*gmockPlugin, getName ()); EXPECT_CALL (*gmockSetting, getName ()); EXPECT_CALL (*gmockSetting, getParent ()); testing::Cardinality cardinality; if (type == TypeList) cardinality = ::testing::AtLeast (1); else cardinality = ::testing::AtMost (1); EXPECT_CALL (*gmockSetting, getType ()).Times (cardinality); } void PostWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { } void PreRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*mBackendGMock, readSetting (_, _)); EXPECT_CALL (*gmockPlugin, getName ()); EXPECT_CALL (*gmockSetting, getName ()); EXPECT_CALL (*gmockSetting, getParent ()); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); } else { EXPECT_CALL (*gmockSetting, getType ()); } } void PostRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { } void PreUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*mBackendGMock, updateSetting (_, _, _)); EXPECT_CALL (*gmockPlugin, getName ()); EXPECT_CALL (*gmockSetting, getName ()); EXPECT_CALL (*gmockSetting, getParent ()); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); } else { EXPECT_CALL (*gmockSetting, getType ()); } } void PostUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { } bool UpdateSettingAtKey (const std::string &plugin, const std::string &setting) { CCSPlugin *cplugin = ccsFindPlugin (mContext, plugin.c_str ()); if (!cplugin) return false; CCSSetting *csetting = ccsFindSetting (cplugin, setting.c_str ()); if (!csetting) return false; ccsBackendUpdateSetting (mBackend, mContext, cplugin, csetting); return true; } void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteBoolAtKey (plugin, key, value); } void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteIntegerAtKey (plugin, key, value); } void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteFloatAtKey (plugin, key, value); } void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteMatchAtKey (plugin, key, value);; } void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteStringAtKey (plugin, key, value); } void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteColorAtKey (plugin, key, value); } void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteKeyAtKey (plugin, key, value); } void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteButtonAtKey (plugin, key, value); } void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteEdgeAtKey (plugin, key, value); } void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteBellAtKey (plugin, key, value); } void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mMockCCSSettingTestEnvironment.WriteListAtKey (plugin, key, value); } virtual Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadBoolAtKey (plugin, key); } virtual int ReadIntegerAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadIntegerAtKey (plugin, key); } virtual float ReadFloatAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadFloatAtKey (plugin, key);; } virtual const char * ReadStringAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadStringAtKey (plugin, key); } virtual CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadColorAtKey (plugin, key); } virtual CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadKeyAtKey (plugin, key); } virtual CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadButtonAtKey (plugin, key); } virtual unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadEdgeAtKey (plugin, key); } virtual const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadMatchAtKey (plugin, key); } virtual Bool ReadBellAtKey (const std::string &plugin, const std::string &key) { return mMockCCSSettingTestEnvironment.ReadBellAtKey (plugin, key); } virtual CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { return mMockCCSSettingTestEnvironment.ReadListAtKey (plugin, key, setting); } protected: bool DeleteProfile (const std::string &profileToDelete) { std::vector ::iterator it = std::find (mProfiles.begin (), mProfiles.end (), profileToDelete); if (it != mProfiles.end ()) { mProfiles.erase (it); return true; } else { return false; } } private: void ReadValueIntoSetting (CCSSetting *setting) { std::string plugin (ccsPluginGetName (ccsSettingGetParent (setting))); std::string key (ccsSettingGetName (setting)); switch (ccsSettingGetType (setting)) { case TypeBool: ccsSetBool (setting, ReadBoolAtKey (plugin, key), FALSE); break; case TypeInt: ccsSetInt (setting, ReadIntegerAtKey (plugin, key), FALSE); break; case TypeFloat: ccsSetFloat (setting, ReadFloatAtKey (plugin, key), FALSE); break; case TypeString: ccsSetString (setting, ReadStringAtKey (plugin, key), FALSE); break; case TypeMatch: ccsSetMatch (setting, ReadMatchAtKey (plugin, key), FALSE); break; case TypeColor: ccsSetColor (setting, ReadColorAtKey (plugin, key), FALSE); break; case TypeKey: ccsSetKey (setting, ReadKeyAtKey (plugin, key), FALSE); break; case TypeButton: ccsSetButton (setting, ReadButtonAtKey (plugin, key), FALSE); break; case TypeEdge: ccsSetEdge (setting, ReadEdgeAtKey (plugin, key), FALSE); break; case TypeBell: ccsSetBell (setting, ReadBellAtKey (plugin, key), FALSE); break; case TypeList: ccsSetList (setting, cci::SettingValueListWrapper (ReadListAtKey (plugin, key, setting), cci::Deep, ccsSettingGetInfo (setting)->forList.listType, boost::shared_ptr (setting, boost::bind (doNothingWithCCSSetting, _1))), FALSE); break; default: throw std::exception (); } } void WriteValueToMap (CCSSetting *setting) { std::string plugin (ccsPluginGetName (ccsSettingGetParent (setting))); std::string key (ccsSettingGetName (setting)); Bool vBool; int vInt; float vFloat; const char *vString; CCSSettingColorValue vColor; CCSSettingKeyValue vKey; CCSSettingButtonValue vButton; unsigned int vEdge; CCSSettingValueList vList; switch (ccsSettingGetType (setting)) { case TypeBool: ccsGetBool (setting, &vBool); WriteBoolAtKey (plugin, key, VariantTypes (vBool ? true : false)); break; case TypeInt: ccsGetInt (setting, &vInt); WriteIntegerAtKey (plugin, key, VariantTypes (vInt)); break; case TypeFloat: ccsGetFloat (setting, &vFloat); WriteFloatAtKey (plugin, key, VariantTypes (vFloat)); break; case TypeString: ccsGetString (setting, &vString); WriteStringAtKey (plugin, key, VariantTypes (static_cast (vString))); break; case TypeMatch: ccsGetMatch (setting, &vString); WriteStringAtKey (plugin, key, VariantTypes (static_cast (vString))); break; case TypeColor: ccsGetColor (setting, &vColor); WriteColorAtKey (plugin, key, VariantTypes (vColor)); break; case TypeKey: ccsGetKey (setting, &vKey); WriteKeyAtKey (plugin, key, VariantTypes (vKey)); break; case TypeButton: ccsGetButton (setting, &vButton); WriteButtonAtKey (plugin, key, VariantTypes (vButton)); break; case TypeEdge: ccsGetEdge (setting, &vEdge); WriteEdgeAtKey (plugin, key, VariantTypes (vEdge)); break; case TypeBell: ccsGetBell (setting, &vBool); WriteBellAtKey (plugin, key, VariantTypes (vBool ? true : false)); break; case TypeList: { CCSSettingValueList listCopy = NULL; ccsGetList (setting, &vList); listCopy = ccsCopyList (vList, setting); WriteListAtKey (plugin, key, VariantTypes (boost::make_shared (listCopy, cci::Deep, ccsSettingGetInfo (setting)->forList.listType, boost::shared_ptr (setting, boost::bind (doNothingWithCCSSetting, _1))))); break; } default: throw std::exception (); } } private: MockCCSSettingsTestEnvironment mMockCCSSettingTestEnvironment; CCSBackend *mBackend; CCSBackendGMock *mBackendGMock; CCSContext *mContext; std::vector mProfiles; }; INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestReadWrite, compizconfig::test::GenerateTestingParametersForBackendInterface ()); INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestInfo, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestInitFiniFuncs, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (MockCCSBackendConcept, CCSBackendConformanceTestProfileHandling, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_setting.cpp0000644000004100000410000013461113246301623027077 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd * Copyright (C) 2012 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include "compizconfig_ccs_setting_mock.h" #include "compizconfig_ccs_plugin_mock.h" #include "compizconfig_ccs_list_wrapper.h" namespace cci = compiz::config::impl; namespace cc = compiz::config; using ::testing::_; using ::testing::Return; using ::testing::InSequence; using ::testing::WithArgs; using ::testing::WithParamInterface; using ::testing::Invoke; using ::testing::ReturnNull; using ::testing::Values; using ::testing::Combine; TEST(CCSSettingTest, TestMock) { CCSSetting *setting = ccsMockSettingNew (); CCSSettingGMock *mock = (CCSSettingGMock *) ccsObjectGetPrivate (setting); EXPECT_CALL (*mock, getName ()); EXPECT_CALL (*mock, getShortDesc ()); EXPECT_CALL (*mock, getLongDesc ()); EXPECT_CALL (*mock, getType ()); EXPECT_CALL (*mock, getInfo ()); EXPECT_CALL (*mock, getGroup ()); EXPECT_CALL (*mock, getSubGroup ()); EXPECT_CALL (*mock, getHints ()); EXPECT_CALL (*mock, getDefaultValue ()); EXPECT_CALL (*mock, getValue ()); EXPECT_CALL (*mock, getIsDefault ()); EXPECT_CALL (*mock, getParent ()); EXPECT_CALL (*mock, getPrivatePtr ()); EXPECT_CALL (*mock, setPrivatePtr (_)); EXPECT_CALL (*mock, setInt (_, _)); EXPECT_CALL (*mock, setFloat (_, _)); EXPECT_CALL (*mock, setBool (_, _)); EXPECT_CALL (*mock, setString (_, _)); EXPECT_CALL (*mock, setColor (_, _)); EXPECT_CALL (*mock, setMatch (_, _)); EXPECT_CALL (*mock, setKey (_, _)); EXPECT_CALL (*mock, setButton (_, _)); EXPECT_CALL (*mock, setEdge (_, _)); EXPECT_CALL (*mock, setBell (_, _)); EXPECT_CALL (*mock, setList (_, _)); EXPECT_CALL (*mock, setValue (_, _)); EXPECT_CALL (*mock, getInt (_)); EXPECT_CALL (*mock, getFloat (_)); EXPECT_CALL (*mock, getBool (_)); EXPECT_CALL (*mock, getString (_)); EXPECT_CALL (*mock, getColor (_)); EXPECT_CALL (*mock, getMatch (_)); EXPECT_CALL (*mock, getKey (_)); EXPECT_CALL (*mock, getButton (_)); EXPECT_CALL (*mock, getEdge (_)); EXPECT_CALL (*mock, getBell (_)); EXPECT_CALL (*mock, getList (_)); EXPECT_CALL (*mock, resetToDefault (_)); EXPECT_CALL (*mock, isIntegrated ()); EXPECT_CALL (*mock, isReadOnly ()); EXPECT_CALL (*mock, isReadableByBackend ()); CCSSettingColorValue cv; CCSSettingKeyValue kv; CCSSettingButtonValue bv; CCSSettingValueList lv = NULL; ccsSettingGetName (setting); ccsSettingGetShortDesc (setting); ccsSettingGetLongDesc (setting); ccsSettingGetType (setting); ccsSettingGetInfo (setting); ccsSettingGetGroup (setting); ccsSettingGetSubGroup (setting); ccsSettingGetHints (setting); ccsSettingGetDefaultValue (setting); ccsSettingGetValue (setting); ccsSettingGetIsDefault (setting); ccsSettingGetParent (setting); ccsSettingGetPrivatePtr (setting); ccsSettingSetPrivatePtr (setting, NULL); ccsSetInt (setting, 1, FALSE); ccsSetFloat (setting, 1.0, FALSE); ccsSetBool (setting, TRUE, FALSE); ccsSetString (setting, "foo", FALSE); ccsSetColor (setting, cv, FALSE); ccsSetMatch (setting, "bar", FALSE); ccsSetKey (setting, kv, FALSE); ccsSetButton (setting, bv, FALSE); ccsSetEdge (setting, 1, FALSE); ccsSetBell (setting, TRUE, FALSE); ccsSetList (setting, lv, FALSE); ccsSetValue (setting, NULL, FALSE); ccsGetInt (setting, NULL); ccsGetFloat (setting, NULL); ccsGetBool (setting, NULL); ccsGetString (setting, NULL); ccsGetColor (setting, NULL); ccsGetMatch (setting, NULL); ccsGetKey (setting, NULL); ccsGetButton (setting, NULL); ccsGetEdge (setting, NULL); ccsGetBell (setting, NULL); ccsGetList (setting, NULL); ccsResetToDefault (setting, FALSE); ccsSettingIsIntegrated (setting); ccsSettingIsReadOnly (setting); ccsSettingIsReadableByBackend (setting); ccsSettingUnref (setting); } namespace { typedef boost::shared_ptr CCSSettingInfoPtr; typedef boost::shared_ptr CCSSettingValuePtr; typedef boost::shared_ptr CCSSettingPtr; class MockInitFuncs { public: MOCK_METHOD3 (initInfo, void (CCSSettingType, CCSSettingInfo *, void *)); MOCK_METHOD4 (initDefaultValue, void (CCSSettingType, CCSSettingInfo *, CCSSettingValue *, void *)); static void wrapInitInfo (CCSSettingType type, CCSSettingInfo *info, void *data) { MockInitFuncs &funcs (*(reinterpret_cast (data))); funcs.initInfo (type, info, data); } static void wrapInitValue (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value, void *data) { MockInitFuncs &funcs (*(reinterpret_cast (data))); funcs.initDefaultValue (type, info, value, data); } }; const std::string SETTING_NAME = "setting_name"; const std::string SETTING_SHORT_DESC = "Short Description"; const std::string SETTING_LONG_DESC = "Long Description"; const std::string SETTING_GROUP = "Group"; const std::string SETTING_SUBGROUP = "Sub Group"; const std::string SETTING_HINTS = "Hints"; const CCSSettingType SETTING_TYPE = TypeInt; class CCSSettingDefaultImplTest : public ::testing::Test { public: CCSSettingDefaultImplTest () : plugin (AutoDestroy (ccsMockPluginNew (), ccsPluginUnref)), gmockPlugin (reinterpret_cast (ccsObjectGetPrivate (plugin.get ()))) { } virtual void SetUpSetting (MockInitFuncs &funcs) { void *vFuncs = reinterpret_cast (&funcs); /* Info must be initialized before the value */ InSequence s; EXPECT_CALL (funcs, initInfo (GetSettingType (), _, vFuncs)); EXPECT_CALL (funcs, initDefaultValue (GetSettingType (), _, _, vFuncs)); setting = AutoDestroy (ccsSettingDefaultImplNew (plugin.get (), SETTING_NAME.c_str (), GetSettingType (), SETTING_SHORT_DESC.c_str (), SETTING_LONG_DESC.c_str (), SETTING_HINTS.c_str (), SETTING_GROUP.c_str (), SETTING_SUBGROUP.c_str (), MockInitFuncs::wrapInitValue, vFuncs, MockInitFuncs::wrapInitInfo, vFuncs, &ccsDefaultObjectAllocator, &ccsDefaultInterfaceTable), ccsSettingUnref); } virtual void SetUp () { MockInitFuncs funcs; SetUpSetting (funcs); } virtual CCSSettingType GetSettingType () { return SETTING_TYPE; } boost::shared_ptr plugin; CCSPluginGMock *gmockPlugin; boost::shared_ptr setting; }; } TEST_F (CCSSettingDefaultImplTest, Construction) { EXPECT_EQ (SETTING_TYPE, ccsSettingGetType (setting.get ())); EXPECT_EQ (SETTING_NAME, ccsSettingGetName (setting.get ())); EXPECT_EQ (SETTING_SHORT_DESC, ccsSettingGetShortDesc (setting.get ())); EXPECT_EQ (SETTING_LONG_DESC, ccsSettingGetLongDesc (setting.get ())); EXPECT_EQ (SETTING_GROUP, ccsSettingGetGroup (setting.get ())); EXPECT_EQ (SETTING_SUBGROUP, ccsSettingGetSubGroup (setting.get ())); EXPECT_EQ (SETTING_HINTS, ccsSettingGetHints (setting.get ())); /* Pointer Equality */ EXPECT_EQ (ccsSettingGetDefaultValue (setting.get ()), ccsSettingGetValue (setting.get ())); /* Actual Equality */ EXPECT_TRUE (ccsCheckValueEq (ccsSettingGetDefaultValue (setting.get ()), ccsSettingGetType (setting.get ()), ccsSettingGetInfo (setting.get ()), ccsSettingGetValue (setting.get ()), ccsSettingGetType (setting.get ()), ccsSettingGetInfo (setting.get ()))); EXPECT_EQ (ccsSettingGetParent (setting.get ()), plugin.get ()); } namespace { /* Testing values */ const int INTEGER_MIN = std::numeric_limits ::min () + 1; const int INTEGER_MAX = std::numeric_limits ::max () - 1; const int INTEGER_VALUE = 5; const int INTEGER_DEFAULT_VALUE = 2; const float FLOAT_MIN = std::numeric_limits ::min () + 1.0f; const float FLOAT_MAX = std::numeric_limits ::max () - 1.0f; const float FLOAT_VALUE = 5.0; const float FLOAT_DEFAULT_VALUE = 2.0; const char *STRING_VALUE = "string_nondefault_value"; const char *STRING_DEFAULT_VALUE = "string"; const char *MATCH_VALUE = "match_nondefault_value"; const char *MATCH_DEFAULT_VALUE = "match"; const Bool BOOL_VALUE = TRUE; const Bool BOOL_DEFAULT_VALUE = FALSE; CCSSettingColorValue getColorValue (unsigned short r, unsigned short g, unsigned short b, unsigned short a) { CCSSettingColorValue value; value.color.red = r; value.color.green = g; value.color.blue = b; value.color.alpha = a; return value; } CCSSettingKeyValue getKeyValue (int keysym, unsigned int modMask) { CCSSettingKeyValue value; value.keysym = keysym; value.keyModMask = modMask; return value; } CCSSettingButtonValue getButtonValue (int button, unsigned int modMask, unsigned int edgeMask) { CCSSettingButtonValue value; value.button = button; value.buttonModMask = modMask; value.edgeMask = edgeMask; return value; } const int VALUE_KEYSYM = XStringToKeysym ("a"); const int VALUE_DEFAULT_KEYSYM = XStringToKeysym ("1"); const unsigned int VALUE_MODMASK = ShiftMask | ControlMask; const unsigned int VALUE_DEFAULT_MODMASK = ControlMask; const int VALUE_BUTTON = 1; const int VALUE_DEFAULT_BUTTON = 3; const unsigned int VALUE_EDGEMASK = 1 | 2; const unsigned int VALUE_DEFAULT_EDGEMASK = 2 | 3; const CCSSettingColorValue COLOR_VALUE = getColorValue (255, 255, 255, 255); const CCSSettingColorValue COLOR_DEFAULT_VALUE = getColorValue (0, 0, 0, 0); const CCSSettingKeyValue KEY_VALUE = getKeyValue (VALUE_KEYSYM, VALUE_MODMASK); const CCSSettingKeyValue KEY_DEFAULT_VALUE = getKeyValue (VALUE_DEFAULT_KEYSYM, VALUE_DEFAULT_MODMASK); const CCSSettingButtonValue BUTTON_VALUE = getButtonValue (VALUE_BUTTON, VALUE_MODMASK, VALUE_EDGEMASK); const CCSSettingButtonValue BUTTON_DEFAULT_VALUE = getButtonValue (VALUE_DEFAULT_BUTTON, VALUE_DEFAULT_MODMASK, VALUE_DEFAULT_EDGEMASK); const unsigned int EDGE_VALUE = 1; const unsigned int EDGE_DEFAULT_VALUE = 2; const Bool BELL_VALUE = BOOL_VALUE; const Bool BELL_DEFAULT_VALUE = BOOL_DEFAULT_VALUE; /* Test CCSSettingInfo */ CCSSettingInfo * NewCCSSettingInfo () { return reinterpret_cast (calloc (1, sizeof (CCSSettingInfo))); } void FreeAndCleanupInfo (CCSSettingInfo *info, CCSSettingType type) { ccsCleanupSettingInfo (info, type); free (info); } CCSSettingInfoPtr AutoDestroyInfo (CCSSettingInfo *info, CCSSettingType type) { return CCSSettingInfoPtr (info, boost::bind (FreeAndCleanupInfo, info, type)); } CCSSettingInfo * getGenericInfo (CCSSettingType type) { return NewCCSSettingInfo (); } CCSSettingInfo * getIntInfo () { CCSSettingInfo *info (getGenericInfo (TypeInt)); info->forInt.max = INTEGER_MAX; info->forInt.min = INTEGER_MIN; return info; } CCSSettingInfo * getFloatInfo () { CCSSettingInfo *info (getGenericInfo (TypeFloat)); info->forFloat.max = FLOAT_MAX; info->forFloat.min = FLOAT_MIN; return info; } CCSSettingInfo * getStringInfo () { CCSSettingInfo *info (getGenericInfo (TypeString)); info->forString.restriction = NULL; info->forString.sortStartsAt = 1; info->forString.extensible = FALSE; return info; } CCSSettingInfo * getActionInfo (CCSSettingType actionType) { EXPECT_TRUE ((actionType == TypeAction || actionType == TypeKey || actionType == TypeButton || actionType == TypeEdge || actionType == TypeBell)); CCSSettingInfo *info (getGenericInfo (actionType)); info->forAction.internal = FALSE; return info; } CCSSettingInfoPtr getListInfo (CCSSettingType type, CCSSettingInfo *childrenInfo) { CCSSettingInfo *info = getGenericInfo (TypeList); info->forList.listType = type; info->forList.listInfo = childrenInfo; return AutoDestroyInfo (info, TypeList); } /* Used to copy different raw values */ template class CopyRawValueBase { public: CopyRawValueBase (const SettingValueType &value) : mValue (value) { } protected: const SettingValueType &mValue; }; template class CopyRawValue : public CopyRawValueBase { public: typedef SettingValueType ReturnType; typedef CopyRawValueBase Parent; CopyRawValue (const SettingValueType &value) : CopyRawValueBase (value) { } SettingValueType operator () () { return Parent::mValue; } }; template <> class CopyRawValue : public CopyRawValueBase { public: typedef const char * ReturnType; typedef CopyRawValueBase Parent; CopyRawValue (const char * value) : CopyRawValueBase (ptr), ptr (value) { } ReturnType operator () () { /* Passing an illegal value is okay */ if (Parent::mValue) return strdup (Parent::mValue); else return NULL; } private: // mValue is a reference so it needs a persistent variable to point at const char *ptr; }; template <> class CopyRawValue : public CopyRawValueBase { public: typedef CCSSettingValueList ReturnType; typedef CopyRawValueBase Parent; CopyRawValue (const cci::SettingValueListWrapper::Ptr &value) : CopyRawValueBase (value) { } ReturnType operator () () { if (Parent::mValue) return ccsCopyList (*Parent::mValue, Parent::mValue->setting ().get ()); else return NULL; } }; CCSSettingValue * NewCCSSettingValue () { CCSSettingValue *value = reinterpret_cast ( calloc (1, sizeof (CCSSettingValue))); value->refCount = 1; return value; } template CCSSettingValue * RawValueToCCSValue (const SettingValueType &value) { typedef typename CopyRawValue ::ReturnType UnionType; CCSSettingValue *settingValue = NewCCSSettingValue (); UnionType *unionMember = reinterpret_cast (&settingValue->value); *unionMember = (CopyRawValue (value)) (); return settingValue; } class ContainedValueGenerator { private: const CCSSettingValuePtr & InitValue (const CCSSettingValuePtr &value, CCSSettingType type, const CCSSettingInfoPtr &info) { const CCSSettingPtr &setting (GetSetting (type, info)); value->parent = setting.get (); mValues.push_back (value); return mValues.back (); } public: template const CCSSettingValuePtr & SpawnValue (const SettingValueType &rawValue, CCSSettingType type, const CCSSettingInfoPtr &info) { CCSSettingValuePtr value (AutoDestroy (RawValueToCCSValue (rawValue), ccsSettingValueUnref)); return InitValue (value, type, info); } const CCSSettingPtr & GetSetting (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mSetting) SetupMockSetting (type, info); return mSetting; } private: void SetupMockSetting (CCSSettingType type, const CCSSettingInfoPtr &info) { mSetting = AutoDestroy (ccsMockSettingNew (), ccsSettingUnref); CCSSettingGMock *settingMock = reinterpret_cast ( ccsObjectGetPrivate (mSetting.get ())); EXPECT_CALL (*settingMock, getType ()) .WillRepeatedly (Return (type)); EXPECT_CALL (*settingMock, getInfo ()) .WillRepeatedly (Return (info.get ())); EXPECT_CALL (*settingMock, getDefaultValue ()) .WillRepeatedly (ReturnNull ()); } /* This must always be before the value * as the values hold a weak reference to * it */ CCSSettingPtr mSetting; std::vector mValues; }; template class ValueContainer { public: virtual ~ValueContainer () {} typedef boost::shared_ptr Ptr; virtual const SettingValueType & getRawValue (CCSSettingType type, const CCSSettingInfoPtr &info) = 0; virtual const CCSSettingValuePtr & getContainedValue (CCSSettingType type, const CCSSettingInfoPtr &info) = 0; }; class NormalValueContainerBase { protected: ContainedValueGenerator mGenerator; CCSSettingValuePtr mValue; }; template class NormalValueContainer : public NormalValueContainerBase, public ValueContainer { public: NormalValueContainer (const SettingValueType &value) : mRawValue (value) { } const SettingValueType & getRawValue (CCSSettingType type, const CCSSettingInfoPtr &info) { return mRawValue; } const CCSSettingValuePtr & getContainedValue (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mValue) mValue = mGenerator.SpawnValue (mRawValue, type, info); return mValue; } private: const SettingValueType &mRawValue; }; template typename NormalValueContainer ::Ptr ContainNormal (const SettingValueType &value) { return boost::make_shared > (value); } class ListValueContainerBase : public ValueContainer { public: virtual ~ListValueContainerBase () {} protected: const CCSSettingValuePtr & getContainedValue (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mContainedWrapper) { const cci::SettingValueListWrapper::Ptr &wrapper (SetupWrapper (type, info)); mContainedWrapper = mContainedValueGenerator.SpawnValue (wrapper, type, info); } return mContainedWrapper; } const CCSSettingValueList & getRawValue (CCSSettingType type, const CCSSettingInfoPtr &info) { const cci::SettingValueListWrapper::Ptr &wrapper (SetupWrapper (type, info)); return *wrapper; } cci::SettingValueListWrapper::Ptr mWrapper; /* ccsFreeSettingValue has an implicit * dependency on mWrapper (CCSSettingValue -> CCSSetting -> * CCSSettingInfo -> cci::SettingValueListWrapper), these should * be kept after mWrapper here */ ContainedValueGenerator mContainedValueGenerator; CCSSettingValuePtr mContainedWrapper; private: virtual const cci::SettingValueListWrapper::Ptr & SetupWrapper (CCSSettingType type, const CCSSettingInfoPtr &info) = 0; }; class ListValueContainerFromChildValueBase : public ListValueContainerBase { private: virtual const cci::SettingValueListWrapper::Ptr & SetupWrapper (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mWrapper) { const CCSSettingPtr &setting (mContainedValueGenerator.GetSetting (type, info)); CCSSettingValue *value = GetValueForListWrapper (); value->parent = setting.get (); value->isListChild = TRUE; mWrapper.reset (new cci::SettingValueListWrapper (NULL, cci::Deep, type, setting)); mWrapper->append (value); } return mWrapper; } virtual CCSSettingValue * GetValueForListWrapper () = 0; }; class ListValueContainerFromList : public ListValueContainerBase { public: ListValueContainerFromList (CCSSettingValueList rawValueList) : mRawValueList (rawValueList) { } private: const cci::SettingValueListWrapper::Ptr & SetupWrapper (CCSSettingType type, const CCSSettingInfoPtr &info) { if (!mWrapper) { const CCSSettingPtr &setting (mContainedValueGenerator.GetSetting (type, info)); mWrapper.reset (new cci::SettingValueListWrapper (ccsCopyList (mRawValueList, setting.get ()), cci::Deep, type, setting)); } return mWrapper; } CCSSettingValueList mRawValueList; }; template class ChildValueListValueContainer : public ListValueContainerFromChildValueBase { public: ChildValueListValueContainer (const SettingValueType &value) : mRawChildValue (value) { } virtual ~ChildValueListValueContainer () {} private: CCSSettingValue * GetValueForListWrapper () { return RawValueToCCSValue (mRawChildValue); } const SettingValueType &mRawChildValue; }; template typename ValueContainer ::Ptr ContainList (const SettingValueType &value) { return boost::make_shared > (value); } typename ValueContainer ::Ptr ContainPrexistingList (const CCSSettingValueList &value) { return boost::make_shared (value); } template struct SettingMutators { typedef CCSSetStatus (*SetFunction) (CCSSetting *setting, SettingValueType data, Bool); typedef Bool (*GetFunction) (CCSSetting *setting, SettingValueType *); }; typedef enum _SetMethod { ThroughRaw, ThroughValue } SetMethod; template CCSSetStatus performRawSet (const SettingValueType &rawValue, const CCSSettingPtr &setting, typename SettingMutators::SetFunction setFunction) { return (*setFunction) (setting.get (), rawValue, FALSE); } template class RawValueContainmentPacker { public: RawValueContainmentPacker (const SettingValueType &value) : mValue (value) { } typename ValueContainer ::Ptr operator () () { return ContainNormal (mValue); } private: const SettingValueType &mValue; }; template <> class RawValueContainmentPacker { public: RawValueContainmentPacker (const CCSSettingValueList &value) : mValue (value) { } typename ValueContainer ::Ptr operator () () { return ContainPrexistingList (mValue); } private: const CCSSettingValueList &mValue; }; template typename ValueContainer ::Ptr ContainRawValue (const SettingValueType &value) { return RawValueContainmentPacker (value) (); } template CCSSetStatus performValueSet (const SettingValueType &rawValue, const CCSSettingInfoPtr &info, CCSSettingType type, const CCSSettingPtr &setting) { typename ValueContainer ::Ptr container (ContainRawValue (rawValue)); const CCSSettingValuePtr &value (container->getContainedValue (type, info)); return ccsSetValue (setting.get (), value.get (), FALSE); } template CCSSetStatus performSet (const SettingValueType &rawValue, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type, typename SettingMutators::SetFunction setFunction, SetMethod method) { /* XXX: * This is really bad design because it effectively involves runtime * switching on types. Unfortunately, there doesn't seem to be a better * way to do this that's not hugely verbose - injecting the method * as a class or a function would mean that we'd have to expose * template parameters to areas where we can't do that because we * want the tests to run once for ccsSetValue and once for * ccsSet* . If we did that, we'd have to either write the tests * twice, or write the INSTANTIATE_TEST_CASE_P sections twice and * both are 200+ lines of copy-and-paste as opposed to this type-switch * here */ switch (method) { case ThroughRaw: return performRawSet (rawValue, setting, setFunction); break; case ThroughValue: return performValueSet (rawValue, info, type, setting); break; default: throw std::runtime_error ("called perfomSet with unknown SetMethod"); } throw std::runtime_error ("Unreachable"); } class SetParam { public: typedef boost::shared_ptr Ptr; typedef boost::function SetUpSettingFunc; virtual ~SetParam () {}; virtual void SetUpSetting (const SetUpSettingFunc &func) = 0; virtual void TearDownSetting () = 0; virtual CCSSettingType GetSettingType () = 0; virtual void SetUpParam (const CCSSettingPtr &) = 0; virtual CCSSetStatus setWithInvalidType (SetMethod) = 0; virtual CCSSetStatus setToFailValue (SetMethod) = 0; virtual CCSSetStatus setToNonDefaultValue (SetMethod) = 0; virtual CCSSetStatus setToDefaultValue (SetMethod) = 0; }; void stubInitInfo (CCSSettingType type, CCSSettingInfo *dst, void *data) { CCSSettingInfo *src = reinterpret_cast (data); ccsCopyInfo (src, dst, type); } void stubInitDefaultValue (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *dest, void *data) { CCSSettingValue *src = reinterpret_cast (data); CCSSetting *oldDestParent = src->parent; /* Change the parent to this setting that's being initialized * as that needs to go into the setting's default value as * the parent entry */ src->parent = dest->parent; ccsCopyValueInto (src, dest, type, info); /* Restore the old parent */ src->parent = oldDestParent; } class StubInitFuncs : public MockInitFuncs { public: StubInitFuncs (CCSSettingInfo *info, CCSSettingValue *value) : MockInitFuncs (), mInfo (info), mValue (value) { ON_CALL (*this, initInfo (_, _, _)) .WillByDefault (WithArgs <0, 1> ( Invoke (this, &StubInitFuncs::initInfo))); ON_CALL (*this, initDefaultValue (_, _, _, _)) .WillByDefault (WithArgs <0, 1, 2> ( Invoke (this, &StubInitFuncs::initializeValue))); } void initInfo (CCSSettingType type, CCSSettingInfo *info) { stubInitInfo (type, info, reinterpret_cast (mInfo)); } void initializeValue (CCSSettingType type, CCSSettingInfo *info, CCSSettingValue *value) { stubInitDefaultValue (type, info, value, reinterpret_cast (mValue)); } CCSSettingInfo *mInfo; CCSSettingValue *mValue; }; class InternalSetParam : public SetParam { protected: InternalSetParam (const CCSSettingInfoPtr &info, CCSSettingType type) : mInfo (info), mType (type) { } virtual void TearDownSetting () { } void InitDefaultsForSetting (const SetUpSettingFunc &func) { StubInitFuncs stubInitializers (mInfo.get (), mValue.get ()); func (stubInitializers); } void TakeReferenceToCreatedSetting (const CCSSettingPtr &setting) { mSetting = setting; } const CCSSettingInterface * RedirectSettingInterface () { const CCSSettingInterface *settingInterface = GET_INTERFACE (CCSSettingInterface, mSetting.get ()); CCSSettingInterface *tmpSettingInterface = new CCSSettingInterface; *tmpSettingInterface = *settingInterface; tmpSettingInterface->settingGetType = InternalSetParam::returnIncorrectSettingType; ccsObjectRemoveInterface (mSetting.get (), GET_INTERFACE_TYPE (CCSSettingInterface)); ccsObjectAddInterface (mSetting.get (), (const CCSInterface *) tmpSettingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); return settingInterface; } void RestoreSettingInterface (const CCSSettingInterface *settingInterface) { /* Restore the old interface */ const CCSSettingInterface *oldSettingInterface = GET_INTERFACE (CCSSettingInterface, mSetting.get ()); ccsObjectRemoveInterface (mSetting.get (), GET_INTERFACE_TYPE (CCSSettingInterface)); delete oldSettingInterface; ccsObjectAddInterface (mSetting.get (), (const CCSInterface *) settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface)); } virtual CCSSetStatus setToFailValue (SetMethod method) { return SetFailed; } virtual CCSSettingType GetSettingType () { return mType; } protected: CCSSettingInfoPtr mInfo; CCSSettingValuePtr mValue; CCSSettingType mType; CCSSettingPtr mSetting; CCSSettingInterface tmpSettingInterface; private: static const CCSSettingType incorrectSettingType = TypeNum; static CCSSettingType returnIncorrectSettingType (CCSSetting *setting) { return incorrectSettingType; } }; template class SetParamContainerStorage { protected: typedef typename ValueContainer ::Ptr ValueContainerPtr; SetParamContainerStorage (const ValueContainerPtr &defaultValue, const ValueContainerPtr &nonDefaultValue) : mDefault (defaultValue), mNonDefault (nonDefaultValue) { } ValueContainerPtr mDefault; ValueContainerPtr mNonDefault; }; template class TypedSetParam : /* Do not change the order of inheritance here, DefaultImplSetParamTemplatedBase * must be destroyed after DefaultImplSetParamBase as DefaultImplSetParamBase * has indirect weak references to variables in DefaultImplSetParamTemplatedBase */ private SetParamContainerStorage , public InternalSetParam { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef typename SettingMutators ::GetFunction GetFunction; typedef typename ValueContainer ::Ptr ValueContainerPtr; typedef SetParamContainerStorage TemplateParent; TypedSetParam (const ValueContainerPtr &defaultValue, CCSSettingType type, SetFunction setFunction, GetFunction getFunction, const CCSSettingInfoPtr &info, const ValueContainerPtr &nonDefaultValue) : SetParamContainerStorage (defaultValue, nonDefaultValue), InternalSetParam (info, type), mSetFunction (setFunction), mGetFunction (getFunction) { } virtual void SetUpSetting (const SetUpSettingFunc &func) { /* Do delayed setup here */ mValue = TemplateParent::mDefault->getContainedValue (mType, mInfo); mNonDefaultValue = TemplateParent::mNonDefault->getRawValue (mType, mInfo); InitDefaultsForSetting (func); } virtual void SetUpParam (const CCSSettingPtr &setting) { ASSERT_TRUE ((*mGetFunction) (setting.get (), &mDefaultValue)); TakeReferenceToCreatedSetting (setting); } virtual CCSSetStatus setWithInvalidType (SetMethod method) { /* Temporarily redirect the setting interface to * our own with an overloaded settingGetType function */ const CCSSettingInterface *iface = RedirectSettingInterface (); CCSSetStatus ret = performSet (mNonDefaultValue, mSetting, mInfo, mType, mSetFunction, method); RestoreSettingInterface (iface); return ret; } virtual CCSSetStatus setToNonDefaultValue (SetMethod method) { return performSet (mNonDefaultValue, mSetting, mInfo, mType, mSetFunction, method); } virtual CCSSetStatus setToDefaultValue (SetMethod method) { return performSet (mDefaultValue, mSetting, mInfo, mType, mSetFunction, method); } private: SettingValueType mDefaultValue; SettingValueType mNonDefaultValue; protected: SetFunction mSetFunction; GetFunction mGetFunction; }; class SetWithDisallowedValueBase { protected: SetWithDisallowedValueBase (const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : mSetting (setting), mInfo (info), mType (type) { } CCSSettingPtr mSetting; CCSSettingInfoPtr mInfo; CCSSettingType mType; }; template class SetWithDisallowedValueTemplatedBase : public SetWithDisallowedValueBase { protected: typedef typename SettingMutators ::SetFunction SetFunction; SetWithDisallowedValueTemplatedBase (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueBase (setting, info, type), mSetFunction (setFunction) { } SetFunction mSetFunction; }; template class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return SetFailed; } }; template <> class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef SetWithDisallowedValueTemplatedBase Parent; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return performSet (Parent::mInfo->forInt.min - 1, Parent::mSetting, Parent::mInfo, Parent::mType, Parent::mSetFunction, method); } }; template <> class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef SetWithDisallowedValueTemplatedBase Parent; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return performSet (Parent::mInfo->forFloat.min - 1.0f, Parent::mSetting, Parent::mInfo, Parent::mType, Parent::mSetFunction, method); } }; template <> class SetWithDisallowedValue : public SetWithDisallowedValueTemplatedBase { public: typedef typename SettingMutators ::SetFunction SetFunction; typedef SetWithDisallowedValueTemplatedBase Parent; SetWithDisallowedValue (SetFunction setFunction, const CCSSettingPtr &setting, const CCSSettingInfoPtr &info, CCSSettingType type) : SetWithDisallowedValueTemplatedBase (setFunction, setting, info, type) { } CCSSetStatus operator () (SetMethod method) { return performSet (NULL, Parent::mSetting, Parent::mInfo, Parent::mType, Parent::mSetFunction, method); } }; template class SetFailureParam : public TypedSetParam { public: typedef TypedSetParam Parent; typedef typename TypedSetParam ::SetFunction SetFunction; typedef typename TypedSetParam ::GetFunction GetFunction; typedef typename TypedSetParam ::ValueContainerPtr ValueContainerPtr; SetFailureParam (const ValueContainerPtr &defaultValue, CCSSettingType type, SetFunction setFunction, GetFunction getFunction, const CCSSettingInfoPtr &info, const ValueContainerPtr &nonDefault) : TypedSetParam (defaultValue, type, setFunction, getFunction, info, nonDefault) { } virtual ~SetFailureParam () {} virtual CCSSetStatus setToFailValue (SetMethod method) { typedef TypedSetParam Parent; return SetWithDisallowedValue (Parent::mSetFunction, Parent::mSetting, Parent::mInfo, Parent::mType) (method); } }; template SetParam::Ptr SParam (const typename ValueContainer ::Ptr &defaultValue, CCSSettingType type, typename SettingMutators::SetFunction setFunc, typename SettingMutators::GetFunction getFunc, const CCSSettingInfoPtr &settingInfo, const typename ValueContainer ::Ptr &changeTo) { return boost::make_shared > (defaultValue, type, setFunc, getFunc, settingInfo, changeTo); } template SetParam::Ptr FailSParam (const typename ValueContainer ::Ptr &defaultValue, CCSSettingType type, typename SettingMutators::SetFunction setFunc, typename SettingMutators::GetFunction getFunc, const CCSSettingInfoPtr &settingInfo, const typename ValueContainer ::Ptr &changeTo) { return boost::make_shared > (defaultValue, type, setFunc, getFunc, settingInfo, changeTo); } typedef std::tr1::tuple SettingDefaultImplSetParamType; class SettingDefaultImplSet : public CCSSettingDefaultImplTest, public WithParamInterface { public: SettingDefaultImplSet () : setHarness (std::tr1::get <0> (GetParam ())), setMethod (std::tr1::get <1> (GetParam ())) { } virtual void SetUp () { setHarness->SetUpSetting (boost::bind (&CCSSettingDefaultImplTest::SetUpSetting, this, _1)); setHarness->SetUpParam (setting); } virtual void TearDown () { setHarness->TearDownSetting (); } CCSSettingType GetSettingType () { return setHarness->GetSettingType (); } protected: SetParam::Ptr setHarness; SetMethod setMethod; }; class SettingDefaulImplSetFailure : public SettingDefaultImplSet { }; } /* Tests */ TEST_P (SettingDefaultImplSet, Construction) { } TEST_P (SettingDefaultImplSet, WithInvalidType) { EXPECT_EQ (SetFailed, setHarness->setWithInvalidType (setMethod)); } TEST_P (SettingDefaultImplSet, ToNewValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); } TEST_P (SettingDefaultImplSet, ToSameValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); EXPECT_EQ (SetToSameValue, setHarness->setToNonDefaultValue (setMethod)); } TEST_P (SettingDefaultImplSet, ToDefaultValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); EXPECT_EQ (SetToDefault, setHarness->setToDefaultValue (setMethod)); } TEST_P (SettingDefaultImplSet, IsDefaultValue) { EXPECT_EQ (SetToNewValue, setHarness->setToNonDefaultValue (setMethod)); EXPECT_EQ (SetToDefault, setHarness->setToDefaultValue (setMethod)); EXPECT_EQ (SetIsDefault, setHarness->setToDefaultValue (setMethod)); } TEST_P (SettingDefaulImplSetFailure, ToFailValue) { EXPECT_EQ (SetFailed, setHarness->setToFailValue (setMethod)); } #define VALUE_TEST INSTANTIATE_TEST_CASE_P VALUE_TEST (SetSemantics, SettingDefaulImplSetFailure, Combine ( Values (FailSParam (ContainNormal (INTEGER_DEFAULT_VALUE), TypeInt, ccsSetInt, ccsGetInt, AutoDestroyInfo (getIntInfo (), TypeInt), ContainNormal (INTEGER_VALUE)), FailSParam (ContainNormal (FLOAT_DEFAULT_VALUE), TypeFloat, ccsSetFloat, ccsGetFloat, AutoDestroyInfo (getFloatInfo (), TypeFloat), ContainNormal (FLOAT_VALUE)), FailSParam (ContainNormal (STRING_DEFAULT_VALUE), TypeString, ccsSetString, ccsGetString, AutoDestroyInfo (getGenericInfo (TypeString), TypeMatch), ContainNormal (STRING_VALUE)), FailSParam (ContainNormal (MATCH_DEFAULT_VALUE), TypeMatch, ccsSetMatch, ccsGetMatch, AutoDestroyInfo (getGenericInfo (TypeMatch), TypeMatch), ContainNormal (MATCH_VALUE))), Values (ThroughRaw, ThroughValue))); VALUE_TEST (SetSemantics, SettingDefaultImplSet, Combine ( Values (SParam (ContainNormal (INTEGER_DEFAULT_VALUE), TypeInt, ccsSetInt, ccsGetInt, AutoDestroyInfo (getIntInfo (), TypeInt), ContainNormal (INTEGER_VALUE)), SParam (ContainNormal (FLOAT_DEFAULT_VALUE), TypeFloat, ccsSetFloat, ccsGetFloat, AutoDestroyInfo (getFloatInfo (), TypeFloat), ContainNormal (FLOAT_VALUE)), SParam (ContainNormal (BOOL_DEFAULT_VALUE), TypeBool, ccsSetBool, ccsGetBool, AutoDestroyInfo (getGenericInfo (TypeBool), TypeBool), ContainNormal (BOOL_VALUE)), SParam (ContainNormal (STRING_DEFAULT_VALUE), TypeString, ccsSetString, ccsGetString, AutoDestroyInfo (getStringInfo (), TypeBool), ContainNormal (STRING_VALUE)), SParam (ContainNormal (MATCH_DEFAULT_VALUE), TypeMatch, ccsSetMatch, ccsGetMatch, AutoDestroyInfo (getGenericInfo (TypeMatch), TypeMatch), ContainNormal (MATCH_VALUE)), SParam (ContainNormal (COLOR_DEFAULT_VALUE), TypeColor, ccsSetColor, ccsGetColor, AutoDestroyInfo (getGenericInfo (TypeColor), TypeColor), ContainNormal (COLOR_VALUE)), SParam (ContainNormal (KEY_DEFAULT_VALUE), TypeKey, ccsSetKey, ccsGetKey, AutoDestroyInfo (getActionInfo (TypeKey), TypeKey), ContainNormal (KEY_VALUE)), SParam (ContainNormal (BUTTON_DEFAULT_VALUE), TypeButton, ccsSetButton, ccsGetButton, AutoDestroyInfo (getActionInfo (TypeButton), TypeButton), ContainNormal (BUTTON_VALUE)), SParam (ContainNormal (EDGE_DEFAULT_VALUE), TypeEdge, ccsSetEdge, ccsGetEdge, AutoDestroyInfo (getActionInfo (TypeEdge), TypeEdge), ContainNormal (EDGE_VALUE)), SParam (ContainNormal (BELL_DEFAULT_VALUE), TypeBell, ccsSetBell, ccsGetBell, AutoDestroyInfo (getGenericInfo (TypeBell), TypeBell), ContainNormal (BELL_VALUE)), SParam (ContainList (INTEGER_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeInt, getIntInfo ()), ContainList (INTEGER_VALUE)), SParam (ContainList (FLOAT_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeFloat, getFloatInfo ()), ContainList (FLOAT_VALUE)), SParam (ContainList (BOOL_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeBool, getGenericInfo (TypeBool)), ContainList (BOOL_VALUE)), SParam (ContainList (STRING_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeString, getGenericInfo (TypeMatch)), ContainList (STRING_VALUE)), SParam (ContainList (MATCH_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeMatch, getGenericInfo (TypeMatch)), ContainList (MATCH_VALUE)), SParam (ContainList (COLOR_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeColor, getGenericInfo (TypeColor)), ContainList (COLOR_VALUE)), SParam (ContainList (KEY_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeKey, getActionInfo (TypeKey)), ContainList (KEY_VALUE)), SParam (ContainList (BUTTON_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeButton, getActionInfo (TypeButton)), ContainList (BUTTON_VALUE)), SParam (ContainList (EDGE_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeEdge, getIntInfo ()), ContainList (EDGE_VALUE)), SParam (ContainList (BELL_DEFAULT_VALUE), TypeList, ccsSetList, ccsGetList, getListInfo (TypeBell, getActionInfo (TypeBell)), ContainList (BELL_VALUE))), Values (ThroughRaw, ThroughValue))); ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_object.cpp0000644000004100000410000002317013246301623026665 0ustar www-datawww-data#include #include #include #include #include #include #include using ::testing::_; using ::testing::Return; using ::testing::StrictMock; using ::testing::Invoke; class GoogleMockDummy; class CCSObjectTest : public ::testing::Test { }; struct TestingObjectWrapper { CCSObject object; }; typedef void (*dummyFunc) (GoogleMockDummy *); struct DummyInterface { dummyFunc dummy; }; struct Dummy2Interface { dummyFunc dummy; }; class GoogleMockDummyInterface { public: virtual ~GoogleMockDummyInterface () {}; virtual void dummyFunc () = 0; virtual void freeTestingObjectWrapper (TestingObjectWrapper *) = 0; }; class GoogleMockDummy : public GoogleMockDummyInterface { public: MOCK_METHOD0 (dummyFunc, void ()); MOCK_METHOD1 (freeTestingObjectWrapper, void (TestingObjectWrapper *)); public: static void thunkDummyFunc (GoogleMockDummy *mock); }; void GoogleMockDummy::thunkDummyFunc (GoogleMockDummy *mock) { mock->dummyFunc (); } const struct DummyInterface SomeDummyInterface = { GoogleMockDummy::thunkDummyFunc }; #define CCS_INTERFACE_TYPE_DUMMY GET_INTERFACE_TYPE (DummyInterface) #define CCS_INTERFACE_TYPE_DUMMY2 GET_INTERFACE_TYPE (Dummy2Interface) INTERFACE_TYPE (DummyInterface) INTERFACE_TYPE (Dummy2Interface) TEST(CCSObjectTest, TestTypeAllocation) { unsigned int i = CCS_INTERFACE_TYPE_DUMMY; unsigned int j = CCS_INTERFACE_TYPE_DUMMY; unsigned int k = CCS_INTERFACE_TYPE_DUMMY2; EXPECT_EQ (i, 1); EXPECT_EQ (j ,1); EXPECT_EQ (k, 2); } TEST(CCSObjectTest, InterfaceAdd) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectFinalize (to); free (to); } TEST(CCSObjectTest, GetInterface) { TestingObjectWrapper *to = reinterpret_cast (calloc (1, sizeof (TestingObjectWrapper))); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, reinterpret_cast (&SomeDummyInterface), CCS_INTERFACE_TYPE_DUMMY); DummyInterface *interface = GET_INTERFACE (DummyInterface, to); EXPECT_EQ (interface, &SomeDummyInterface); ccsObjectRemoveInterface (to, CCS_INTERFACE_TYPE_DUMMY); free (to); } TEST(CCSObjectDeathTest, GetInterface) { TestingObjectWrapper *to = reinterpret_cast (calloc (1, sizeof (TestingObjectWrapper))); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, reinterpret_cast (&SomeDummyInterface), CCS_INTERFACE_TYPE_DUMMY); Dummy2Interface *i = NULL; ASSERT_DEATH ({ i = GET_INTERFACE (Dummy2Interface, to); }, "Unable to find interface type*"); EXPECT_EQ (NULL, i); // Avoid warnings/errors about i being unused. ccsObjectRemoveInterface (to, CCS_INTERFACE_TYPE_DUMMY); free (to); } TEST(CCSObjectTest, InterfaceRemove) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectRemoveInterface (to, 1); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, InterfaceFetchCall) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); const DummyInterface *myDummyInterface = (const DummyInterface *) ccsObjectGetInterface (to, 1); GoogleMockDummy mockDummy; EXPECT_CALL (mockDummy, dummyFunc ()); (*myDummyInterface->dummy) (&mockDummy); ccsObjectRemoveInterface (to, 1); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, SetPrivateGetPrivate) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); int i = 1; ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectSetPrivate (to, (CCSPrivate *) &i); CCSPrivate *p = ccsObjectGetPrivate (to); EXPECT_EQ (&i, (int *) p); EXPECT_EQ (i, (*((int *) p))); free (to); } void ccsFreeTestingObjectWrapper (TestingObjectWrapper *wrapper) { GoogleMockDummy *dummy = reinterpret_cast (reinterpret_cast (ccsObjectGetPrivate (wrapper))); dummy->freeTestingObjectWrapper (wrapper); } #define CCSREF_OBJ(type,dtype) \ void ccs##type##Ref (dtype *d) \ { \ ccsObjectRef (d); \ } \ \ void ccs##type##Unref (dtype *d) \ { \ ccsObjectUnref (d, ccsFree##type); \ } \ CCSREF_HDR(TestingObjectWrapper, TestingObjectWrapper); CCSREF_OBJ(TestingObjectWrapper, TestingObjectWrapper); TEST(CCSObjectTest, TestRefUnrefFreesObject) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); GoogleMockDummy dummy; ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectSetPrivate (to, reinterpret_cast (&dummy)); ccsTestingObjectWrapperRef (to); EXPECT_CALL (dummy, freeTestingObjectWrapper (to)); ccsTestingObjectWrapperUnref (to); free (to); } TEST(CCSObjectTest, TestFinalizeFreesEverything) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); int *i = (int *) malloc (sizeof (int)); *i = 1; ccsObjectSetPrivate (to, (CCSPrivate *) i); CCSPrivate *p = ccsObjectGetPrivate (to); EXPECT_EQ (i, (int *) p); EXPECT_EQ (*i, (*((int *) p))); ccsObjectFinalize (to); EXPECT_EQ (NULL, ((CCSObject *) to)->priv); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, TestReallocFailures) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); StrictMock objectAllocationGMock; FailingObjectReallocation fakeFailingAllocator (1); CCSObjectAllocationInterface failingAllocatorGMock = failingAllocator; failingAllocatorGMock.allocator = static_cast (&objectAllocationGMock); ccsObjectInit (to, &failingAllocatorGMock); EXPECT_CALL (objectAllocationGMock, realloc_ (_, _)) .WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectReallocation::realloc_)) .WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectReallocation::realloc_)); EXPECT_CALL (objectAllocationGMock, free_ (_)) .WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectReallocation::free_)); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } TEST(CCSObjectTest, TestAllocatedMemoryOnRemove) { TestingObjectWrapper *to = (TestingObjectWrapper *) calloc (1, sizeof (TestingObjectWrapper)); ccsObjectInit (to, &ccsDefaultObjectAllocator); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectAddInterface (to, (const CCSInterface *) &SomeDummyInterface, 2); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 2); EXPECT_EQ (*((CCSObject *) to)->interface_types, 1); ccsObjectRemoveInterface (to, 1); EXPECT_EQ (*((CCSObject *) to)->interfaces, (const CCSInterface *) (&SomeDummyInterface)); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 1); EXPECT_EQ (((CCSObject *) to)->n_allocated_interfaces, 2); EXPECT_EQ (*((CCSObject *) to)->interface_types, 2); ccsObjectRemoveInterface (to, 2); EXPECT_EQ (NULL, ((CCSObject *) to)->interfaces); EXPECT_EQ (((CCSObject *) to)->n_interfaces, 0); EXPECT_EQ (((CCSObject *) to)->n_allocated_interfaces, 0); EXPECT_EQ (NULL, ((CCSObject *) to)->interface_types); free (to); } ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_text_file.cpp0000644000004100000410000000275413246301623027407 0ustar www-datawww-data#include #include #include #include #include #include #include "ccs_text_file_interface.h" #include "compizconfig_ccs_text_file_mock.h" #include #include using ::testing::_; using ::testing::Return; using ::testing::Eq; class CCSTextFileTest : public ::testing::Test { }; namespace { const std::string CCS_TEXT_FILE_TESTING_CONTENTS; const std::string CCS_TEXT_FILE_APPEND_CONTENTS; } MATCHER(BoolTrue, "Boolean True") { if (arg) return true; else return false; } TEST(CCSTextFileTest, TestMock) { boost::shared_ptr textFile (AutoDestroy (ccsMockTextFileNew (&ccsDefaultObjectAllocator), ccsTextFileUnref)); CCSTextFileGMock *mock = reinterpret_cast (ccsObjectGetPrivate (textFile)); CharacterWrapper temporaryFileContents (strdup (CCS_TEXT_FILE_TESTING_CONTENTS.c_str ())); char *temporaryFileContentsC = temporaryFileContents; EXPECT_CALL (*mock, readFromStart ()).WillOnce (Return (temporaryFileContentsC)); EXPECT_CALL (*mock, appendString (Eq (CCS_TEXT_FILE_APPEND_CONTENTS))).WillOnce (Return (TRUE)); EXPECT_CALL (*mock, free ()); EXPECT_THAT (ccsTextFileReadFromStart (textFile.get ()), Eq (CCS_TEXT_FILE_TESTING_CONTENTS)); EXPECT_THAT (ccsTextFileAppendString (textFile.get (), CCS_TEXT_FILE_APPEND_CONTENTS.c_str ()), BoolTrue ()); } ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_util.cpp0000644000004100000410000002306713246301623026401 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2007 Dennis Kasprzyk * Copyright (C) 2007 Danny Baumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include using ::testing::WithParamInterface; namespace { const std::string firstBindingString = ""; const std::string secondBindingString = ""; const unsigned int firstBindingMask = (1 << 0); const unsigned int secondBindingMask = (1 << 1); } TEST (CCSUtilTest, TestAddKeybindingMaskToStringInitial) { char *bindingStringChar = NULL; unsigned int addedBindingMask = 0; ccsAddKeybindingMaskToString (&bindingStringChar, firstBindingMask, &addedBindingMask, firstBindingMask, firstBindingString.c_str ()); CharacterWrapper bindingString (bindingStringChar); EXPECT_EQ (firstBindingString, bindingStringChar); EXPECT_EQ (addedBindingMask, firstBindingMask); } TEST (CCSUtilTest, TestAddKeybindingMaskToStringNoDuplicates) { char *bindingStringChar = NULL; unsigned int addedBindingMask = 0; ccsAddKeybindingMaskToString (&bindingStringChar, firstBindingMask, &addedBindingMask, firstBindingMask, firstBindingString.c_str ()); ccsAddKeybindingMaskToString (&bindingStringChar, firstBindingMask, &addedBindingMask, firstBindingMask, secondBindingString.c_str ()); CharacterWrapper bindingString (bindingStringChar); EXPECT_EQ (firstBindingString, bindingStringChar); EXPECT_EQ (addedBindingMask, firstBindingMask); } TEST (CCSUtilTest, TestAddStringToKeybindingMask) { unsigned int bindingMask = 0; ccsAddStringToKeybindingMask (&bindingMask, firstBindingString.c_str (), firstBindingMask, firstBindingString.c_str ()); EXPECT_EQ (bindingMask, firstBindingMask); } namespace { class ModifierParam { public: ModifierParam (const char *modifierString, unsigned int modifierMask, bool match) : mModifierString (modifierString), mModifierMask (modifierMask), mMatch (match) { } ModifierParam (const ModifierParam ¶m) : mModifierString (param.mModifierString), mModifierMask (param.mModifierMask), mMatch (param.mMatch) { } friend void swap (ModifierParam &lhs, ModifierParam &rhs) { using std::swap; swap (lhs.mMatch, rhs.mMatch); swap (lhs.mModifierMask, rhs.mModifierMask); swap (lhs.mModifierString, rhs.mModifierString); } ModifierParam & operator= (const ModifierParam &other) { ModifierParam to (other); swap (*this, to); return *this; } std::string mModifierString; unsigned int mModifierMask; bool mMatch; }; ::testing::internal::ParamGenerator GenerateModifierParams () { std::vector params; params.reserve (ccsInternalUtilNumModifiers () * ccsInternalUtilNumModifiers ()); for (unsigned int i = 0; i < ccsInternalUtilNumModifiers (); ++i) { if (modifierList[i].name == std::string ("")) continue; for (unsigned int j = 0; j < ccsInternalUtilNumModifiers (); ++j) { const bool modifierMatch = modifierList[i].modifier == modifierList[j].modifier; params.push_back (ModifierParam (modifierList[i].name, modifierList[j].modifier, modifierMatch)); } } return ::testing::ValuesIn (params); } bool CheckModifierListSanity () { return (modifierList[0].modifier != modifierList[1].modifier) && (std::string (modifierList[0].name) != std::string (modifierList[1].name)); } const char *modifierSanityMsg = "This test requires the name and modifier " \ "value in modifierList[0] and " \ "modifierList[1] to be different " \ "to work correctly"; } class CCSUtilModifiersTest : public ::testing::Test, public WithParamInterface { }; TEST_P (CCSUtilModifiersTest, TestModifiersToString) { CharacterWrapper modifierString (ccsModifiersToString (GetParam ().mModifierMask)); char *modifierStringChar = modifierString; /* Force "" to test as "" as "" * should never be reachable */ const std::string expectedModifierString (GetParam ().mModifierString != std::string ("") ? GetParam ().mModifierString : ""); if (GetParam ().mMatch) EXPECT_EQ (expectedModifierString, modifierStringChar); else EXPECT_NE (expectedModifierString, modifierStringChar); } TEST_P (CCSUtilModifiersTest, TestStringToModifiers) { unsigned int modifierMask (ccsStringToModifiers (GetParam ().mModifierString.c_str ())); if (GetParam ().mMatch) EXPECT_EQ (GetParam ().mModifierMask, modifierMask); else EXPECT_NE (GetParam ().mModifierMask, modifierMask); } INSTANTIATE_TEST_CASE_P (CCSRealModifiers, CCSUtilModifiersTest, GenerateModifierParams ()); TEST (CCSUtilModifierTest, TestMultiModifierToString) { ASSERT_TRUE (CheckModifierListSanity ()) << modifierSanityMsg; const unsigned int modifierMask = modifierList[0].modifier | modifierList[1].modifier; const std::string expectedModifierString = std::string (modifierList[0].name) + std::string (modifierList[1].name); CharacterWrapper modifierString (ccsModifiersToString (modifierMask)); const char *modifierStringChar = modifierString; EXPECT_EQ (expectedModifierString, modifierStringChar); } TEST (CCSUtilModifierTest, TestMultiStringToModifier) { ASSERT_TRUE (CheckModifierListSanity ()) << modifierSanityMsg; const unsigned int expectedModifierMask = modifierList[0].modifier | modifierList[1].modifier; const std::string modifierString = std::string (modifierList[0].name) + std::string (modifierList[1].name); unsigned int modifierMask = (ccsStringToModifiers (modifierString.c_str ())); EXPECT_EQ (expectedModifierMask, modifierMask); } namespace { static const std::string emptyProfileName (""); static const std::string globalTestProfileName ("test"); static const std::string globalGeneralProfileSection ("general"); static const std::string globalGeneralProfileSectionUnderscore ("general_"); static const std::string globalTestGeneralProfileSection (globalGeneralProfileSectionUnderscore + globalTestProfileName); static const std::string globalGNOMEProfileSection ("gnome_session"); static const std::string globalKDE4ProfileSection ("kde4_session"); static const std::string globalKDE3ProfileSection ("kde_session"); static const std::string four ("4"); static const std::string trueStr ("true"); const char * getConstCharFromCharacterWrapper (const CharacterWrapper &wrap) { return wrap; } } std::ostream & operator<< (std::ostream &os, const CharacterWrapper &wrap) { return os << getConstCharFromCharacterWrapper (wrap); } bool operator== (const std::string &str, const CharacterWrapper &wrap) { return str == getConstCharFromCharacterWrapper (wrap); } class CCSUtilProfileSelection : public ::testing::Test { public: CCSUtilProfileSelection () : ccsEnv ("COMPIZ_CONFIG_PROFILE", NULL), gnomeEnv ("GNOME_DESKTOP_SESSION_ID", NULL), kde4Env ("KDE_SESSION_VERSION", NULL), kdeEnv ("KDE_FULL_SESSION", NULL) { } private: TmpEnv ccsEnv; TmpEnv gnomeEnv; TmpEnv kde4Env; TmpEnv kdeEnv; }; TEST_F (CCSUtilProfileSelection, OverrideWithName) { TmpEnv env ("COMPIZ_CONFIG_PROFILE", globalTestProfileName.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalTestGeneralProfileSection, sName); } TEST_F (CCSUtilProfileSelection, OverrideWithNoName) { TmpEnv env ("COMPIZ_CONFIG_PROFILE", emptyProfileName.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalGeneralProfileSection, sName); } TEST_F (CCSUtilProfileSelection, NoOverrideInGNOME) { TmpEnv env ("GNOME_DESKTOP_SESSION_ID", globalTestProfileName.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalGNOMEProfileSection, sName); } TEST_F (CCSUtilProfileSelection, NoOverrideInKDE4) { TmpEnv env ("KDE_SESSION_VERSION", four.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalKDE4ProfileSection, sName); } TEST_F (CCSUtilProfileSelection, NoOverrideInKDE3) { TmpEnv env ("KDE_FULL_SESSION", trueStr.c_str ()); CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalKDE3ProfileSection, sName); } TEST_F (CCSUtilProfileSelection, Fallback) { CharacterWrapper sName (getSectionName ()); EXPECT_EQ (globalGeneralProfileSection, sName); } ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_plugin.cpp0000644000004100000410000000351113246301623026712 0ustar www-datawww-data#include #include #include #include "compizconfig_ccs_plugin_mock.h" using ::testing::_; using ::testing::Return; class CCSPluginTest : public ::testing::Test { }; TEST(CCSPluginTest, TestMock) { CCSPlugin *plugin = ccsMockPluginNew (); CCSPluginGMock *mock = (CCSPluginGMock *) ccsObjectGetPrivate (plugin); EXPECT_CALL (*mock, getName ()); EXPECT_CALL (*mock, getShortDesc ()); EXPECT_CALL (*mock, getLongDesc ()); EXPECT_CALL (*mock, getHints ()); EXPECT_CALL (*mock, getCategory ()); EXPECT_CALL (*mock, getLoadAfter ()); EXPECT_CALL (*mock, getLoadBefore ()); EXPECT_CALL (*mock, getRequiresPlugins ()); EXPECT_CALL (*mock, getConflictPlugins ()); EXPECT_CALL (*mock, getProvidesFeatures ()); EXPECT_CALL (*mock, getRequiresFeatures ()); EXPECT_CALL (*mock, getPrivatePtr ()); EXPECT_CALL (*mock, setPrivatePtr (_)); EXPECT_CALL (*mock, getContext ()); EXPECT_CALL (*mock, findSetting (_)); EXPECT_CALL (*mock, getPluginGroups ()); EXPECT_CALL (*mock, readPluginSettings ()); EXPECT_CALL (*mock, getPluginStrExtensions ()); ccsPluginGetName (plugin); ccsPluginGetShortDesc (plugin); ccsPluginGetLongDesc (plugin); ccsPluginGetHints (plugin); ccsPluginGetCategory (plugin); ccsPluginGetLoadAfter (plugin); ccsPluginGetLoadBefore (plugin); ccsPluginGetRequiresPlugins (plugin); ccsPluginGetConflictPlugins (plugin); ccsPluginGetProvidesFeatures (plugin); ccsPluginGetRequiresFeatures (plugin); ccsPluginGetPrivatePtr (plugin); ccsPluginSetPrivatePtr (plugin, NULL); ccsPluginGetContext (plugin); ccsFindSetting (plugin, "foo"); ccsGetPluginGroups (plugin); ccsReadPluginSettings (plugin); ccsGetPluginStrExtensions (plugin); ccsPluginUnref (plugin); } ./compizconfig/libcompizconfig/tests/compizconfig_test_ccs_backend.cpp0000644000004100000410000000317213246301623027006 0ustar www-datawww-data#include #include #include #include "compizconfig_ccs_backend_mock.h" using ::testing::_; using ::testing::ReturnNull; class CCSBackendTest : public ::testing::Test { }; TEST(CCSBackendTest, TestMock) { CCSBackend *backend = ccsMockBackendNew (); CCSBackendGMock *mock = (CCSBackendGMock *) ccsObjectGetPrivate (backend); EXPECT_CALL (*mock, getInfo ()); EXPECT_CALL (*mock, executeEvents (_)); EXPECT_CALL (*mock, init (_)); EXPECT_CALL (*mock, fini ()); EXPECT_CALL (*mock, readInit (_)); EXPECT_CALL (*mock, readSetting (_,_)); EXPECT_CALL (*mock, readDone (_)); EXPECT_CALL (*mock, writeInit (_)); EXPECT_CALL (*mock, writeSetting (_, _)); EXPECT_CALL (*mock, writeDone (_)); EXPECT_CALL (*mock, getSettingIsIntegrated (_)); EXPECT_CALL (*mock, getSettingIsReadOnly (_)); EXPECT_CALL (*mock, getExistingProfiles (_)).WillRepeatedly (ReturnNull ()); EXPECT_CALL (*mock, deleteProfile (_, _)); ccsBackendGetInfo (backend); ccsBackendExecuteEvents (backend, 0); ccsBackendInit (backend, NULL); ccsBackendFini (backend); ccsBackendReadInit (backend, NULL); ccsBackendReadSetting (backend, NULL, NULL); ccsBackendReadDone (backend, NULL); ccsBackendWriteInit (backend, NULL); ccsBackendWriteSetting (backend, NULL, NULL); ccsBackendWriteDone (backend, NULL); ccsBackendGetSettingIsIntegrated (backend, NULL); ccsBackendGetSettingIsReadOnly (backend, NULL); ccsBackendGetExistingProfiles (backend, NULL); ccsBackendDeleteProfile (backend, NULL, NULL); ccsFreeMockBackend (backend); } ./compizconfig/libcompizconfig/TODO0000644000004100000410000000033113246301623017575 0ustar www-datawww-data - write a simple ini file implementation to read/write general options without glib (maybe for inport/export of setting too) - python bindings (and beryl-settings then) - port ini, gconf backend - settings plugin ./compizconfig/libcompizconfig/backend/0000755000004100000410000000000013246301623020477 5ustar www-datawww-data./compizconfig/libcompizconfig/backend/CMakeLists.txt0000644000004100000410000000052213246301623023236 0ustar www-datawww-dataset (CMAKE_MODULE_PATH_ORIG ${CMAKE_MODULE_PATH}) set (LIBCOMPIZCONFIG_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LIBCOMPIZCONFIGZ_CMAKE_MODULE_PATH}) # Sorry for the kittens include (${CMAKE_CURRENT_SOURCE_DIR}/../cmake/LibCompizConfigCommon.cmake) compizconfig_backend (ini) ./compizconfig/libcompizconfig/backend/src/0000755000004100000410000000000013246301623021266 5ustar www-datawww-data./compizconfig/libcompizconfig/backend/src/ini.c0000644000004100000410000003575013246301623022223 0ustar www-datawww-data/** * * INI libccs backend * * ini.c * * Copyright (c) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEFAULTPROF "Default" #define SETTINGPATH "compiz-1/compizconfig" typedef struct _IniPrivData { CCSContext *context; char * lastProfile; IniDictionary * iniFile; unsigned int iniWatchId; } IniPrivData; /* forward declaration */ static void setProfile (IniPrivData *data, char *profile); static char* getIniFileName (char *profile) { char *configDir = NULL; char *fileName = NULL; configDir = getenv ("XDG_CONFIG_HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/%s/%s.ini", configDir, SETTINGPATH, profile) == -1) return NULL; return fileName; } configDir = getenv ("HOME"); if (configDir && strlen (configDir)) { if (asprintf (&fileName, "%s/.config/%s/%s.ini", configDir, SETTINGPATH, profile) == -1) return NULL; return fileName; } return NULL; } static void processFileEvent (unsigned int watchId, void *closure) { IniPrivData *data = (IniPrivData *) closure; char *fileName; /* our ini file has been modified, reload it */ if (data->iniFile) ccsIniClose (data->iniFile); fileName = getIniFileName (data->lastProfile); if (!fileName) return; data->iniFile = ccsIniOpen (fileName); ccsReadSettings (data->context); free (fileName); } static void setProfile (IniPrivData *data, char *profile) { char *fileName; struct stat fileStat; if (data->iniFile) ccsIniClose (data->iniFile); if (data->iniWatchId) ccsRemoveFileWatch (data->iniWatchId); data->iniFile = NULL; data->iniWatchId = 0; /* first we need to find the file name */ fileName = getIniFileName (profile); if (!fileName) return; /* if the file does not exist, we have to create it */ if (stat (fileName, &fileStat) == -1) { if (errno == ENOENT) { FILE *file; file = fopen (fileName, "w"); if (!file) { free (fileName); return; } fclose (file); } else { free (fileName); return; } } data->iniWatchId = ccsAddFileWatch (fileName, TRUE, processFileEvent, data); /* load the data from the file */ data->iniFile = ccsIniOpen (fileName); free (fileName); } static Bool initBackend (CCSBackend *backend, CCSContext * context) { IniPrivData *newData; newData = calloc (1, sizeof (IniPrivData)); /* initialize the newly allocated part */ newData->context = context; ccsObjectSetPrivate (backend, (CCSPrivate *) newData); return TRUE; } static Bool finiBackend (CCSBackend * backend) { IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return FALSE; if (data->iniFile) ccsIniClose (data->iniFile); if (data->iniWatchId) ccsRemoveFileWatch (data->iniWatchId); if (data->lastProfile) free (data->lastProfile); free (data); ccsObjectSetPrivate (backend, NULL); return TRUE; } static Bool readInit (CCSBackend *backend, CCSContext * context) { const char *currentProfileCCS; char *currentProfile; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return FALSE; currentProfileCCS = ccsGetProfile (context); if (!currentProfileCCS || !strlen (currentProfileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (currentProfileCCS); if (!data->lastProfile || (strcmp (data->lastProfile, currentProfile) != 0)) setProfile (data, currentProfile); if (data->lastProfile) free (data->lastProfile); data->lastProfile = currentProfile; return (data->iniFile != NULL); } static void readSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { Bool status = FALSE; char *keyName; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; if (asprintf (&keyName, "s%d_%s", ccsContextGetScreenNum (context), ccsSettingGetName (setting)) == -1) return; switch (ccsSettingGetType (setting)) { case TypeString: { char *value; if (ccsIniGetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetString (setting, value, TRUE); free (value); status = TRUE; } } break; case TypeMatch: { char *value; if (ccsIniGetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetMatch (setting, value, TRUE); free (value); status = TRUE; } } break; case TypeInt: { int value; if (ccsIniGetInt (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetInt (setting, value, TRUE); status = TRUE; } } break; case TypeBool: { Bool value; if (ccsIniGetBool (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetBool (setting, (value != 0), TRUE); status = TRUE; } } break; case TypeFloat: { float value; if (ccsIniGetFloat (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value)) { ccsSetFloat (setting, value, TRUE); status = TRUE; } } break; case TypeColor: { CCSSettingColorValue color; if (ccsIniGetColor (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &color)) { ccsSetColor (setting, color, TRUE); status = TRUE; } } break; case TypeKey: { CCSSettingKeyValue key; if (ccsIniGetKey (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &key)) { ccsSetKey (setting, key, TRUE); status = TRUE; } } break; case TypeButton: { CCSSettingButtonValue button; if (ccsIniGetButton (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &button)) { ccsSetButton (setting, button, TRUE); status = TRUE; } } break; case TypeEdge: { unsigned int edges; if (ccsIniGetEdge (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &edges)) { ccsSetEdge (setting, edges, TRUE); status = TRUE; } } break; case TypeBell: { Bool bell; if (ccsIniGetBell (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &bell)) { ccsSetBell (setting, bell, TRUE); status = TRUE; } } break; case TypeList: { CCSSettingValueList value; if (ccsIniGetList (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, &value, setting)) { ccsSetList (setting, value, TRUE); ccsSettingValueListFree (value, TRUE); status = TRUE; } } break; default: break; } if (!status) { /* reset setting to default if it could not be read */ ccsResetToDefault (setting, TRUE); } if (keyName) free (keyName); } static void readDone (CCSBackend *backend, CCSContext * context) { } static Bool writeInit (CCSBackend *backend, CCSContext * context) { const char *currentProfileCCS; char *currentProfile; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return FALSE; currentProfileCCS = ccsGetProfile (context); if (!currentProfileCCS || !strlen (currentProfileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (currentProfileCCS); if (!data->lastProfile || (strcmp (data->lastProfile, currentProfile) != 0)) setProfile (data, currentProfile); if (data->lastProfile) free (data->lastProfile); ccsDisableFileWatch (data->iniWatchId); data->lastProfile = currentProfile; return (data->iniFile != NULL); } static void writeSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { char *keyName; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; if (asprintf (&keyName, "s%d_%s", ccsContextGetScreenNum (context), ccsSettingGetName (setting)) == -1) return; if (ccsSettingGetIsDefault (setting)) { ccsIniRemoveEntry (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName); free (keyName); return; } switch (ccsSettingGetType (setting)) { case TypeString: { char *value; if (ccsGetString (setting, (const char **) &value)) ccsIniSetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeMatch: { char *value; if (ccsGetMatch (setting, (const char **) &value)) ccsIniSetString (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeInt: { int value; if (ccsGetInt (setting, &value)) ccsIniSetInt (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeFloat: { float value; if (ccsGetFloat (setting, &value)) ccsIniSetFloat (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeBool: { Bool value; if (ccsGetBool (setting, &value)) ccsIniSetBool (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeColor: { CCSSettingColorValue value; if (ccsGetColor (setting, &value)) ccsIniSetColor (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeKey: { CCSSettingKeyValue value; if (ccsGetKey (setting, &value)) ccsIniSetKey (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeButton: { CCSSettingButtonValue value; if (ccsGetButton (setting, &value)) ccsIniSetButton (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeEdge: { unsigned int value; if (ccsGetEdge (setting, &value)) ccsIniSetEdge (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeBell: { Bool value; if (ccsGetBell (setting, &value)) ccsIniSetBell (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value); } break; case TypeList: { CCSSettingValueList value; if (ccsGetList (setting, &value)) ccsIniSetList (data->iniFile, ccsPluginGetName (ccsSettingGetParent (setting)), keyName, value, ccsSettingGetInfo (setting)->forList.listType); } break; default: break; } if (keyName) free (keyName); } static void writeDone (CCSBackend *backend, CCSContext * context) { /* export the data to ensure the changes are on disk */ char *fileName; const char *currentProfileCCS; char *currentProfile; IniPrivData *data; data = (IniPrivData *) ccsObjectGetPrivate (backend); if (!data) return; currentProfileCCS = ccsGetProfile (context); if (!currentProfileCCS || !strlen (currentProfileCCS)) currentProfile = strdup (DEFAULTPROF); else currentProfile = strdup (currentProfileCCS); fileName = getIniFileName (currentProfile); free (currentProfile); ccsIniSave (data->iniFile, fileName); ccsEnableFileWatch (data->iniWatchId); free (fileName); } static void updateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { if (readInit (backend, context)) { readSetting (backend, context, setting); readDone (backend, context); } } static Bool getSettingIsReadOnly (CCSBackend *backend, CCSSetting * setting) { /* FIXME */ return FALSE; } static int profileNameFilter (const struct dirent *name) { int length = strlen (name->d_name); if (strncmp (name->d_name + length - 6, ".ini++", 6)) return 0; return 1; } static CCSStringList scanConfigDir (char * filePath) { CCSStringList ret = NULL; struct dirent **nameList; char *pos; int nFile, i; nFile = scandir (filePath, &nameList, profileNameFilter, NULL); if (nFile <= 0) return NULL; for (i = 0; i < nFile; ++i) { pos = strrchr (nameList[i]->d_name, '.'); if (pos) { CCSString *pString = malloc (sizeof (CCSString)); *pos = 0; pString->value = strdup (nameList[i]->d_name); pString->refCount = 1; if (strcmp (nameList[i]->d_name, DEFAULTPROF) != 0) ret = ccsStringListAppend (ret, pString); } free (nameList[i]); } free (nameList); return ret; } static CCSStringList getExistingProfiles (CCSBackend *backend, CCSContext * context) { CCSStringList ret = NULL; char *filePath = NULL; char *homeDir = NULL; char *configDir = NULL; configDir = getenv ("XDG_CONFIG_HOME"); if (configDir && strlen (configDir)) { if (asprintf (&filePath, "%s/%s", configDir, SETTINGPATH) == -1) return NULL; ret = scanConfigDir(filePath); free(filePath); if (ret) return ret; } homeDir = getenv ("HOME"); if (!homeDir) return NULL; if (asprintf (&filePath, "%s/.config/%s", homeDir, SETTINGPATH) == -1) filePath = NULL; if (!filePath) return NULL; ret = scanConfigDir(filePath); free(filePath); return ret; } static Bool deleteProfile (CCSBackend *backend, CCSContext * context, char * profile) { char *fileName; fileName = getIniFileName (profile); if (!fileName) return FALSE; remove (fileName); free (fileName); return TRUE; } const CCSBackendInfo iniBackendInfo = { "ini", "Flat-file Configuration Backend", "Flat file Configuration Backend for libccs", FALSE, TRUE, 1 }; static const CCSBackendInfo * getInfo (CCSBackend *backend) { return &iniBackendInfo; } static CCSBackendInterface iniVTable = { getInfo, NULL, initBackend, finiBackend, readInit, readSetting, readDone, writeInit, writeSetting, writeDone, updateSetting, NULL, getSettingIsReadOnly, getExistingProfiles, deleteProfile }; CCSBackendInterface * getBackendInfo (void) { return &iniVTable; } ./compizconfig/libcompizconfig/libcompizconfig.pc.in0000644000004100000410000000051713246301623023222 0ustar www-datawww-dataprefix=@libcompizconfig_prefix@ exec_prefix=@libcompizconfig_exec_prefix@ libdir=@libcompizconfig_libdir@ includedir=@libcompizconfig_includedir@ Name: libcompizconfig Description: Compiz configuration system Version: @VERSION@ Requires: compiz Libs: -L@libcompizconfig_libdir@ -lcompizconfig Cflags: -I@libcompizconfig_includedir@ ./compizconfig/compizconfig-python/0000755000004100000410000000000013246301624017741 5ustar www-datawww-data./compizconfig/compizconfig-python/CMakeLists.txt0000644000004100000410000001330013246301623022475 0ustar www-datawww-data# Hack set (CMAKE_PROJECT_NAME compizconfig-python) # Get arch execute_process (COMMAND uname -p OUTPUT_VARIABLE PROC_ARCH) # Get Python Version execute_process (COMMAND python -c "import sys; print str (sys.version_info[0]) + '.' + str (sys.version_info[1])" OUTPUT_VARIABLE PY_VERSION) include (FindPkgConfig) pkg_check_modules (PYTHON python-2.7) # This is a workaround for a broken FindPythonLibs always finding the # wrong library version because PYTHON_LIBRARY is in the cache and # can't be overwritten string (REGEX REPLACE "^([0-9]+\\.[0-9]+).*" "\\1" PYTHON_CURRENT_VERSION ${PY_VERSION}) string (REPLACE "." "" PYTHON_CURRENT_VERSION_NO_DOTS ${PYTHON_CURRENT_VERSION}) find_library (PYTHON_LIBRARY_LOCAL NAMES python${PYTHON_CURRENT_VERSION_NO_DOTS} python${PYTHON_CURRENT_VERSION} PATH_SUFFIXES python${PYTHON_CURRENT_VERSION}/config) set (COMPIZCONFIG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include) string (REPLACE "\n" "" PROC_ARCH ${PROC_ARCH}) string (REPLACE "\n" "" PY_VERSION ${PY_VERSION}) set (PY_BUILD_DIR lib.linux-${PROC_ARCH}-${PY_VERSION}) set (PY_SCRIPTS_DIR scripts-${PY_VERSION}) set (PY_COMPIZCONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/compizconfig.c) set (PY_COMPIZCONFIG_PYREX ${CMAKE_CURRENT_SOURCE_DIR}/src/compizconfig.pyx) find_program(PYREXC_BIN pyrexc) if(NOT PYREXC_BIN) message(FATAL_ERROR "Can not build because pyrexc binary not found.") endif() add_custom_command (OUTPUT ${PY_COMPIZCONFIG_SRC} COMMAND ${PYREXC_BIN} -o ${PY_COMPIZCONFIG_SRC} ${PY_COMPIZCONFIG_PYREX} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${PY_COMPIZCONFIG_PYREX}) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/compizconfig-python.pc.in ${CMAKE_CURRENT_BINARY_DIR}/compizconfig-python.pc) include_directories (${PYTHON_INCLUDE_DIRS} ${COMPIZCONFIG_INCLUDE_DIRS}) # pyrex generates code that does type-punning, this trips # up -Werror set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-strict-aliasing") # We need to remove the "lib" set (CMAKE_SHARED_LIBRARY_PREFIX "") # We must build the python module using CMake instead of distutils. # # The only way in which the python module can be built using distutils # is by using add_custom_command to "generate" it into existence. # Unfortunately this has drawbacks. Namely, it is not possible for # add_custom_command to depend on library targets. Because of that, there's # no way that we can guarantee that libcompizconfig.so will be linked # before compizconfig.so (which is required). The best that we can do # there is to use add_custom_target, and make that target depend on the # file, add_library (compizconfig_python_module SHARED ${PY_COMPIZCONFIG_SRC}) set_target_properties (compizconfig_python_module PROPERTIES OUTPUT_NAME compizconfig) target_link_libraries (compizconfig_python_module ${PYTHON_LIBRARY_LOCAL} compizconfig) set (UNINSTALL_COMMAND "python ${CMAKE_CURRENT_SOURCE_DIR}/setup.py uninstall --prefix=${CMAKE_INSTALL_PREFIX} --version=${VERSION}") compiz_add_code_to_uninstall_target (${UNINSTALL_COMMAND} ${CMAKE_CURRENT_BINARY_DIR}) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/compizconfig-python.pc DESTINATION ${libdir}/pkgconfig) # This is probably not very portable, but we can't install using distutils # as we cannot build with it safely if ($ENV{COMPIZ_DEB_BUILD}) set (INSTALL_LAYOUT_DIR dist-packages) else ($ENV{COMPIZ_DEB_BUILD}) set (INSTALL_LAYOUT_DIR site-packages) endif ($ENV{COMPIZ_DEB_BUILD}) set (PYTHON_MODULE_DIR ${CMAKE_INSTALL_PREFIX}/lib/python${PY_VERSION}/${INSTALL_LAYOUT_DIR}) install (TARGETS compizconfig_python_module DESTINATION ${PYTHON_MODULE_DIR}) install (CODE "message (\"Installing python files\") execute_process (COMMAND cmake -DSETUP=${CMAKE_CURRENT_SOURCE_DIR}/setup.py -DPREFIX=${CMAKE_INSTALL_PREFIX} -DWDIR=${CMAKE_CURRENT_BINARY_DIR} -DVERSION=${VERSION} -P ${compiz_SOURCE_DIR}/compizconfig/cmake/exec_setup_py_with_destdir.cmake)") if (COMPIZ_BUILD_TESTING) find_program (BASH_EXECUTABLE bash) find_program (PYTHON_EXECUTABLE python) mark_as_advanced (FORCE PYTHON_EXECUTABLE) file (GLOB PYTHON_TESTS "tests/test_*.py") if (PYTHON_EXECUTABLE AND BASH_EXECUTABLE) set (MOCK_XML_SRC ${CMAKE_CURRENT_SOURCE_DIR}/tests/mock.xml) set (MOCK_XML_FILE ${CMAKE_CURRENT_BINARY_DIR}/mock.xml) add_custom_command (OUTPUT ${MOCK_XML_FILE} COMMAND cp ${MOCK_XML_SRC} ${MOCK_XML_FILE} COMMENT "Copying mock.xml file into testing directory" DEPENDS ${MOCK_XML_SRC}) add_custom_target (compizconfig_python_test_mock_xml_file ALL DEPENDS ${MOCK_XML_FILE}) # For testing purposes we need the ini backend add_dependencies (compizconfig_python_module ini compizconfig_python_test_mock_xml_file) foreach (PYTHON_TEST_FILE ${PYTHON_TESTS}) get_filename_component (PYTHON_TEST ${PYTHON_TEST_FILE} NAME_WE) message (STATUS "Adding test " ${PYTHON_TEST}) add_test (NAME CompizConfigPython.${PYTHON_TEST} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMAND ${BASH_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/util/run_with_ld_library_path.sh ${CMAKE_BINARY_DIR}/compizconfig/libcompizconfig/src ${PYTHON_EXECUTABLE} ${PYTHON_TEST_FILE}) endforeach (PYTHON_TEST_FILE) endif (PYTHON_EXECUTABLE AND BASH_EXECUTABLE) endif (COMPIZ_BUILD_TESTING) ./compizconfig/compizconfig-python/INSTALL0000644000004100000410000000221413246301623020770 0ustar www-datawww-dataInstallation Instructions ************************* Copyright (C) 2010 Sam Spilsbury. This file is free documentation under the GNU GFDL; I hereby give unlimited permission to copy, distribute and modify it. Basic Installation ================== CompizConfig Python Bindings use the distutils buildsystem to translate, build and install the bindings. See the Distutils documentation for more information on how to use the specifics of the buildsystem. At the moment, you probably just want to issue something like: # python setup.py install Command Line Arguments ====================== If you want to install to a particular prefix (eg /opt) then you would use the '--prefix' switch: # python setup.py install --prefix=/opt Environment Variables ===================== CompizConfig Python Bindings might require some environment variables if you installed LibCompizConfig to a non-standard location. Currently, only PKG_CONFIG_PATH is supported, and this is used to find the pkgconfig file to determine the libcompizconfig install location for linking # PKG_CONFIG_PATH=/opt/lib/pkgconfig python setup.py install ./compizconfig/compizconfig-python/README0000644000004100000410000000000013246301623020606 0ustar www-datawww-data./compizconfig/compizconfig-python/COPYING0000644000004100000410000004311013246301623020772 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ./compizconfig/compizconfig-python/src/0000755000004100000410000000000013246301623020527 5ustar www-datawww-data./compizconfig/compizconfig-python/src/compizconfig.pyx0000644000004100000410000012454113246301623023767 0ustar www-datawww-data''' This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Authors: Quinn Storm (quinn@beryl-project.org) Patrick Niklaus (marex@opencompositing.org) Guillaume Seguin (guillaume@segu.in) Copyright (C) 2007 Quinn Storm ''' import operator StringSettingKeyFunc = operator.itemgetter (1) ctypedef unsigned int Bool cdef struct CCSInterfaceTable: void *contextInterface cdef extern CCSInterfaceTable ccsDefaultInterfaceTable cdef enum CCSSettingType: TypeBool TypeInt TypeFloat TypeString TypeColor TypeAction TypeKey TypeButton TypeEdge TypeBell TypeMatch TypeList TypeNum cdef enum CCSPluginConflictType: # produced on plugin activation ConflictRequiresPlugin, ConflictRequiresFeature, ConflictFeature, ConflictPlugin, # produced on plugin deactivation ConflictFeatureNeeded, ConflictPluginNeeded, ConflictPluginError SettingTypeString = [ "Bool", "Int", "Float", "String", "Color", "Action", "Key", "Button", "Edge", "Bell", "Match", "List", "Invalid" ] ConflictTypeString = [ "RequiresPlugin", #A "RequiresFeature", #A "ConflictFeature", #A "ConflictPlugin", #A "FeatureNeeded", #D "PluginNeeded", #D "PluginError" ] cdef struct CCSList: void * data CCSList * next ctypedef CCSList CCSSettingList ctypedef CCSList CCSPluginList ctypedef CCSList CCSStringList ctypedef CCSList CCSGroupList ctypedef CCSList CCSSubGroupList ctypedef CCSList CCSPluginConflictList ctypedef CCSList CCSSettingValueList ctypedef CCSList CCSBackendInfoList ctypedef CCSList CCSIntDescList ctypedef CCSList CCSStrRestrictionList ctypedef CCSList CCSStrExtensionList cdef struct CCSBackendInfo: char * name char * shortDesc char * longDesc Bool integrationSupport Bool profileSupport unsigned int refCount cdef struct CCSSettingKeyValue: int keysym unsigned int keyModMask cdef struct CCSSettingButtonValue: int button unsigned int buttonModMask int edgeMask cdef struct CCSSettingColorValueColor: unsigned short red unsigned short green unsigned short blue unsigned short alpha cdef union CCSSettingColorValue: CCSSettingColorValueColor color unsigned short array[4] cdef union CCSSettingValueUnion: Bool asBool int asInt float asFloat char * asString char * asMatch CCSSettingColorValue asColor CCSSettingValueList * asList CCSSettingKeyValue asKey CCSSettingButtonValue asButton unsigned int asEdge Bool asBell cdef struct CCSIntDesc: int value char * name unsigned int refCount cdef struct CCSStrRestriction: char * value char * name unsigned int refCount cdef struct CCSSettingIntInfo: int min int max CCSIntDescList * desc cdef struct CCSSettingFloatInfo: float min float max float precision cdef struct CCSSettingStringInfo: CCSStrRestrictionList * restriction int sortStartsAt Bool extensible cdef struct CCSSettingListInfo: CCSSettingType listType void * listInfo # actually CCSSettingInfo *, works around pyrex cdef struct CCSSettingActionInfo: Bool internal cdef union CCSSettingInfo: CCSSettingIntInfo forInt CCSSettingFloatInfo forFloat CCSSettingStringInfo forString CCSSettingListInfo forList CCSSettingActionInfo forAction cdef struct CCSSettingValue: CCSSettingValueUnion value void * parent Bool isListChild unsigned int refCount cdef struct CCSGroup: char * name CCSSubGroupList * subGroups unsigned int refCount cdef struct CCSSubGroup: char * name CCSSettingList * settings unsigned int refCount cdef struct CCSPluginCategory: char * name char * shortDesc char * longDesc CCSStringList * plugins cdef struct CCSContext cdef struct CCSPlugin cdef struct CCSSetting cdef struct CCSStrExtension: char * basePlugin CCSSettingList * baseSettings CCSStrRestrictionList * restriction unsigned int refCount cdef struct CCSPlugin: void * ccsPrivate unsigned int refCount cdef struct CCSPluginConflict: char * value CCSPluginConflictType type CCSPluginList * plugins unsigned int refCount cdef struct CCSString: char * value unsigned int refCount '''Context functions''' cdef extern void ccsSetBasicMetadata (Bool value) cdef extern CCSContext * ccsContextNew (unsigned int screenNum, CCSInterfaceTable *) cdef extern CCSContext * ccsEmptyContextNew (unsigned int screenNum, CCSInterfaceTable *) cdef extern void ccsContextDestroy (CCSContext * context) cdef extern CCSPluginList ccsContextGetPlugins (CCSContext *context) cdef extern CCSPluginCategory * ccsContextGetCategories (CCSContext *context) cdef extern CCSSettingList ccsContextGetChangedSettings (CCSContext *context) cdef extern unsigned int ccsContextGetScreenNum (CCSContext *context) cdef extern Bool ccsContextAddChangedSetting (CCSContext *context, CCSSetting *setting) cdef extern Bool ccsContextClearChangedSettings (CCSContext *context) cdef extern CCSSettingList ccsContextStealChangedSettings (CCSContext *context) cdef extern void * ccsContextGetPrivatePtr (CCSContext *context) cdef extern void ccsContextSetPrivatePtr (CCSContext *context, void *) cdef extern void * ccsContextGetPluginsBindable (CCSContext *context) cdef extern void * ccsContextStealChangedSettingsBindable (CCSContext *context) cdef extern void * ccsContextGetChangedSettingsBindable (CCSContext *context) '''Plugin functions''' cdef extern Bool ccsLoadPlugin (CCSContext * context, char * name) cdef extern CCSPlugin * ccsFindPlugin (CCSContext * context, char * name) cdef extern CCSSetting * ccsFindSetting (CCSPlugin * plugin, char * name) cdef extern CCSSettingList * ccsGetPluginSettings (CCSPlugin * plugin) cdef extern CCSGroupList * ccsGetPluginGroups (CCSPlugin * plugin) cdef extern char * ccsPluginGetName (CCSPlugin *plugin) cdef extern char * ccsPluginGetShortDesc (CCSPlugin *plugin) cdef extern char * ccsPluginGetLongDesc (CCSPlugin *plugin) cdef extern char * ccsPluginGetHints (CCSPlugin *plugin) cdef extern char * ccsPluginGetCategory (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetLoadAfter (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetLoadBefore (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetRequiresPlugins (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetConflictPlugins (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetProvidesFeatures (CCSPlugin *plugin) cdef extern CCSStringList ccsPluginGetRequiresFeatures (CCSPlugin *plugin) cdef extern void * ccsPluginGetProvidesFeaturesBindable (CCSPlugin *plugin) cdef extern void * ccsPluginGetPrivatePtr (CCSPlugin *plugin) cdef extern void ccsPluginSetPrivatePtr (CCSPlugin *plugin, void *ptr) cdef extern CCSContext * ccsPluginGetContext (CCSPlugin *plugin) '''Action => String''' cdef extern char * ccsModifiersToString (unsigned int modMask) cdef extern char * ccsEdgesToString (unsigned int edge) cdef extern char * ccsEdgesToModString (unsigned int edge) cdef extern char * ccsKeyBindingToString (CCSSettingKeyValue *key) cdef extern char * ccsButtonBindingToString (CCSSettingButtonValue *button) '''String utils''' cdef extern from 'string.h': ctypedef int size_t cdef extern char * strdup (char * s) cdef extern void memset (void * s, int c, size_t n) cdef extern void free (void * f) cdef extern void * malloc (size_t s) '''String => Action''' cdef extern unsigned int ccsStringToModifiers (char *binding) cdef extern unsigned int ccsStringToEdges (char *edge) cdef extern unsigned int ccsModStringToEdges (char *edge) cdef extern Bool ccsStringToKeyBinding (char * binding, CCSSettingKeyValue * key) cdef extern Bool ccsStringToButtonBinding (char * binding, CCSSettingButtonValue * button) '''General settings handling''' cdef extern Bool ccsSetValue (CCSSetting * setting, CCSSettingValue * value, Bool processChanged) cdef extern void ccsFreeSettingValue (CCSSettingValue * value) cdef extern CCSSettingValueList * ccsSettingValueListAppend ( CCSSettingValueList * l, CCSSettingValue * v) cdef extern CCSSettingList *ccsSettingListFree (CCSSettingList * list, Bool freeObj) '''Profiles''' cdef extern CCSStringList * ccsGetExistingProfiles (CCSContext * context) cdef extern void ccsDeleteProfile (CCSContext * context, char * name) cdef extern void ccsSetProfile (CCSContext * context, char * name) cdef extern char* ccsGetProfile (CCSContext * context) '''Backends''' cdef extern CCSBackendInfoList * ccsGetExistingBackends (CCSContext *) cdef extern void ccsBackendInfoListFree (CCSBackendInfoList *, Bool freeObj) cdef extern Bool ccsSetBackend (CCSContext * context, char * name) cdef extern char* ccsGetBackend (CCSContext * context) '''Sorting''' cdef extern void ccsSetPluginListAutoSort (CCSContext *context, Bool value) cdef extern Bool ccsGetPluginListAutoSort (CCSContext *context) '''Integration''' cdef extern void ccsSetIntegrationEnabled (CCSContext * context, Bool value) cdef extern Bool ccsGetIntegrationEnabled (CCSContext * context) '''IO handling''' cdef extern void ccsReadSettings (CCSContext * c) cdef extern void ccsWriteSettings (CCSContext * c) cdef extern void ccsWriteChangedSettings (CCSContext * c) cdef extern void ccsResetToDefault (CCSSetting * s, Bool processChanged) '''Event loop''' ProcessEventsNoGlibMainLoopMask = (1 << 0) cdef extern void ccsProcessEvents (CCSContext * context, unsigned int flags) '''Import/export''' cdef extern Bool ccsExportToFile (CCSContext * context, char * fileName, Bool skipDefaults) cdef extern Bool ccsImportFromFile (CCSContext * context, char * fileName, Bool overwrite) '''Misc. Plugin/Setting utils''' cdef extern Bool ccsSettingIsReadOnly (CCSSetting * setting) cdef extern Bool ccsSettingIsIntegrated (CCSSetting * setting) cdef extern char * ccsSettingGetName (CCSSetting *) cdef extern char * ccsSettingGetShortDesc (CCSSetting *) cdef extern char * ccsSettingGetLongDesc (CCSSetting *) cdef extern CCSSettingType ccsSettingGetType (CCSSetting *) cdef extern CCSSettingInfo * ccsSettingGetInfo (CCSSetting *) cdef extern char * ccsSettingGetGroup (CCSSetting *) cdef extern char * ccsSettingGetSubGroup (CCSSetting *) cdef extern char * ccsSettingGetHints (CCSSetting *) cdef extern CCSSettingValue * ccsSettingGetDefaultValue (CCSSetting *) cdef extern CCSSettingValue *ccsSettingGetValue (CCSSetting *) cdef extern Bool ccsSettingGetIsDefault (CCSSetting *) cdef extern CCSPlugin * ccsSettingGetParent (CCSSetting *) cdef extern void * ccsSettingGetPrivatePtr (CCSSetting *) cdef extern void ccsSettingSetPrivatePtr (CCSSetting *, void *) cdef extern void ccsPluginConflictListFree (CCSPluginConflictList * l, Bool freeObj) cdef extern CCSPluginConflictList * ccsCanEnablePlugin (CCSContext * c, CCSPlugin * p) cdef extern CCSPluginConflictList * ccsCanDisablePlugin (CCSContext * c, CCSPlugin * p) cdef extern Bool ccsPluginSetActive (CCSPlugin * p, Bool v) cdef extern Bool ccsPluginIsActive (CCSContext * c, char * n) cdef extern CCSStrExtensionList * ccsGetPluginStrExtensions (CCSPlugin * plugin) cdef class Context cdef class Plugin cdef class Setting cdef CCSSettingType GetType (CCSSettingValue * value): if value.isListChild: return ccsSettingGetInfo (( value.parent)).forList.listType else: return ccsSettingGetType (( value.parent)) cdef object StringListToList (CCSList * stringList): cdef CCSString * string list = [] while stringList: string = stringList.data; item = string.value list.append (item) stringList = stringList.next return list cdef CCSSettingList * ListToSettingList (object list): if len (list) <= 0: return NULL cdef CCSSettingList * listStart cdef CCSSettingList * settingList cdef CCSSettingList * prev cdef Setting setting listStart = malloc (sizeof (CCSSettingList)) setting = list[0] listStart.data = setting.ccsSetting listStart.next = NULL prev = listStart for l in list[1:]: settingList = malloc (sizeof (CCSSettingList)) setting = l settingList.data = setting.ccsSetting settingList.next = NULL prev.next = settingList prev = settingList return listStart cdef object SettingListToList (Context context, CCSList * settingList): cdef CCSSetting * ccsSetting list = [] while settingList: ccsSetting = settingList.data setting = None plugin = context.Plugins[ccsPluginGetName (ccsSettingGetParent (ccsSetting))] setting = plugin.Screen[ccsSettingGetName (ccsSetting)] list.append (setting) settingList = settingList.next return list cdef object IntDescListToDict (CCSIntDescList * intDescList): cdef CCSIntDesc * desc dict = {} while intDescList: desc = intDescList.data dict[desc.name] = desc.value intDescList = intDescList.next return dict cdef object StrRestrictionListToDict (CCSStrRestrictionList * restrictionList, object initialDict): cdef CCSStrRestriction * restriction dict = initialDict listOfAddedItems = [] while restrictionList: restriction = restrictionList.data dict[restriction.name] = restriction.value listOfAddedItems.append ((restriction.name, restriction.value)) restrictionList = restrictionList.next return (dict, listOfAddedItems) cdef CCSSettingValue * EncodeValue (object data, CCSSetting * setting, Bool isListChild): cdef CCSSettingValue * bv cdef CCSSettingType t cdef CCSList * l bv = malloc (sizeof (CCSSettingValue)) memset (bv, 0, sizeof (CCSSettingValue)) bv.isListChild = isListChild bv.parent = setting if isListChild: t = ccsSettingGetInfo (setting).forList.listType else: t = ccsSettingGetType (setting) if t == TypeString: bv.value.asString = strdup (data) elif t == TypeMatch: bv.value.asMatch = strdup (data) elif t == TypeInt: bv.value.asInt = data elif t == TypeFloat: bv.value.asFloat = data elif t == TypeBool: if data: bv.value.asBool = 1 else: bv.value.asBool = 0 elif t == TypeColor: bv.value.asColor.color.red = data[0] bv.value.asColor.color.green = data[1] bv.value.asColor.color.blue = data[2] bv.value.asColor.color.alpha = data[3] elif t == TypeKey: ccsStringToKeyBinding (data, &bv.value.asKey) elif t == TypeButton: ccsStringToButtonBinding (data, &bv.value.asButton) elif t == TypeEdge: bv.value.asEdge = ccsStringToEdges (data) elif t == TypeBell: if (data): bv.value.asBell = 1 else: bv.value.asBell = 0 elif t == TypeList: l = NULL for item in data: l = ccsSettingValueListAppend (l, EncodeValue (item, setting, 1)) bv.value.asList = l return bv cdef object DecodeValue (CCSSettingValue * value): cdef CCSSettingType t cdef char * s cdef CCSList * l cdef object cs cdef object ks cdef object bs cdef object es cdef object eb t = GetType (value) if t == TypeString: return value.value.asString elif t == TypeMatch: return value.value.asMatch elif t == TypeBool: if value.value.asBool: return True return False elif t == TypeInt: return value.value.asInt elif t == TypeFloat: return value.value.asFloat elif t == TypeColor: return [value.value.asColor.color.red, value.value.asColor.color.green, value.value.asColor.color.blue, value.value.asColor.color.alpha] elif t == TypeKey: s = ccsKeyBindingToString (&value.value.asKey) if s != NULL: ks = s free (s) else: ks = "None" return ks elif t == TypeButton: s = ccsButtonBindingToString (&value.value.asButton) if s != NULL: bs = s free (s) else: bs = "None" if bs == "Button0": bs = "None" return bs elif t == TypeEdge: s = ccsEdgesToString (value.value.asEdge) if s != NULL: es = s free (s) else: es = "None" return es elif t == TypeBell: bb = False if value.value.asBell: bb = True return bb elif t == TypeList: lret = [] l = value.value.asList while l != NULL: lret.append (DecodeValue ( l.data)) l = l.next return lret return "Unhandled" cdef class Setting: """A python representation of a CCSSetting. You should not construct this object directly. Use plugin.Screen['settingname'] instead """ cdef CCSSetting * ccsSetting cdef object info cdef Plugin plugin cdef object extendedStrRestrictions cdef object baseStrRestrictions def __cinit__ (self, Plugin plugin, name): cdef CCSSettingType t cdef CCSSettingInfo * i self.ccsSetting = ccsFindSetting (plugin.ccsPlugin, name) self.plugin = plugin self.extendedStrRestrictions = None self.baseStrRestrictions = None info = () t = ccsSettingGetType (self.ccsSetting) i = ccsSettingGetInfo (self.ccsSetting) if t == TypeList: t = ccsSettingGetInfo (self.ccsSetting).forList.listType i = ccsSettingGetInfo (self.ccsSetting).forList.listInfo if t == TypeInt: desc = IntDescListToDict (i.forInt.desc) info = (i.forInt.min, i.forInt.max, desc) elif t == TypeFloat: info = (i.forFloat.min, i.forFloat.max, i.forFloat.precision) elif t == TypeString: # info is filled later in Plugin.SortSingleStringSetting info = ({}, {}, []) self.baseStrRestrictions = [] self.extendedStrRestrictions = {} elif t in (TypeKey, TypeButton, TypeEdge, TypeBell): info = (bool (i.forAction.internal),) if ccsSettingGetType (self.ccsSetting) == TypeList: info = (SettingTypeString[t], info) self.info = info def Reset (self): ccsResetToDefault (self.ccsSetting, 1) property Plugin: def __get__ (self): return self.plugin property Name: def __get__ (self): return ccsSettingGetName (self.ccsSetting) property ShortDesc: def __get__ (self): return ccsSettingGetShortDesc (self.ccsSetting) property LongDesc: def __get__ (self): return ccsSettingGetLongDesc (self.ccsSetting) property Group: def __get__ (self): return ccsSettingGetGroup (self.ccsSetting) property SubGroup: def __get__ (self): return ccsSettingGetSubGroup (self.ccsSetting) property Type: def __get__ (self): return SettingTypeString[ccsSettingGetType (self.ccsSetting)] property Info: def __get__ (self): return self.info property Hints: def __get__ (self): if not ccsSettingGetHints (self.ccsSetting): return [] else: return str (ccsSettingGetHints (self.ccsSetting)).split (";")[:-1] property IsDefault: def __get__ (self): if ccsSettingGetIsDefault (self.ccsSetting): return True return False property DefaultValue: def __get__ (self): return DecodeValue (ccsSettingGetDefaultValue (self.ccsSetting)) property Value: def __get__ (self): return DecodeValue (ccsSettingGetValue (self.ccsSetting)) def __set__ (self, value): cdef CCSSettingValue * sv sv = EncodeValue (value, self.ccsSetting, 0) ccsSetValue (self.ccsSetting, sv, 1) ccsFreeSettingValue (sv) property Integrated: def __get__ (self): return bool (ccsSettingIsIntegrated (self.ccsSetting)) property ReadOnly: def __get__ (self): return bool (ccsSettingIsReadOnly (self.ccsSetting)) cdef class SSGroup: cdef object screen def __cinit__ (self, screen): self.screen = screen property Screen: def __get__ (self): return self.screen def __set__ (self, value): self.screen = value cdef class Plugin: """A python representation of a CCSPlugin. You should not construct this object directly. Use context.Plugins['pluginname'] instead """ cdef CCSPlugin * ccsPlugin cdef Context context cdef object screen cdef object groups cdef object loaded cdef object ranking cdef object hasExtendedString def __cinit__ (self, Context context, name): self.ccsPlugin = ccsFindPlugin (context.ccsContext, name) self.context = context self.screen = {} self.groups = {} self.loaded = False self.ranking = {} self.hasExtendedString = False def Update (self): cdef CCSList * setlist cdef CCSList * glist cdef CCSList * sglist cdef CCSSetting * sett cdef CCSGroup * gr cdef CCSSubGroup * sgr cdef CCSSettingType t cdef CCSSettingInfo * i groupIndex = 0 glist = ccsGetPluginGroups (self.ccsPlugin) while glist != NULL: gr = glist.data self.groups[gr.name] = (groupIndex, {}) subGroupIndex = 0 sglist = gr.subGroups while sglist != NULL: sgr = sglist.data self.groups[gr.name][1][sgr.name] = (subGroupIndex, SSGroup ({})) subGroupIndex = subGroupIndex + 1 sglist = sglist.next groupIndex = groupIndex + 1 glist = glist.next setlist = ccsGetPluginSettings (self.ccsPlugin) self.hasExtendedString = False rank = 0 while setlist != NULL: sett = setlist.data subgroup = self.groups[ccsSettingGetGroup (sett)][1][ccsSettingGetSubGroup (sett)][1] setting = Setting (self, ccsSettingGetName (sett)) self.screen[ccsSettingGetName (sett)] = setting subgroup.Screen[ccsSettingGetName (sett)] = setting t = ccsSettingGetType (sett) i = ccsSettingGetInfo (sett) if t == TypeList: t = i.forList.listType i = i.forList.listInfo if t == TypeString and i.forString.extensible: self.hasExtendedString = True if not self.ranking.has_key (ccsSettingGetName (sett)): self.ranking[ccsSettingGetName (sett)] = rank rank = rank + 1 setlist = setlist.next self.loaded = True self.ApplyStringExtensions (True, self.Enabled) self.SortStringSettings () def SortStringSettings (self): for name, setting in self.Screen.items (): self.SortSingleStringSetting (setting) def SortSingleStringSetting (self, Setting setting): cdef CCSSettingType t cdef CCSSettingInfo * i t = ccsSettingGetType (setting.ccsSetting) i = ccsSettingGetInfo (setting.ccsSetting) if t == TypeList: t = i.forList.listType i = i.forList.listInfo if t != TypeString: return (itemsByName, listOfAddedItems) = \ StrRestrictionListToDict (i.forString.restriction, setting.extendedStrRestrictions) # Let base string restrictions be the ones given in the option metadata # in the base plugin plus the ones found in the extensions in the same # plugin. setting.baseStrRestrictions = \ listOfAddedItems + setting.baseStrRestrictions if i.forString.sortStartsAt < 0: # don't sort sortedItems = itemsByName.items () elif i.forString.sortStartsAt == 0: # Sort all items by value sortedItems = sorted (itemsByName.items (), key=StringSettingKeyFunc) else: # Sort first sortStartsAt many items by value and # the remaining ones by name itemsNotSorted = \ setting.baseStrRestrictions[:i.forString.sortStartsAt] itemsNotSortedSet = set (itemsNotSorted) allItemsSet = set (itemsByName.items ()) itemsSortedByName = sorted (list (allItemsSet - itemsNotSortedSet), key=operator.itemgetter (0)) sortedItems = itemsNotSorted + itemsSortedByName itemsByValue = {} for (index, (name, value)) in enumerate (sortedItems): itemsByValue[value] = (name, index) # Insert itemsByName and sortedItems into setting.info if ccsSettingGetType (setting.ccsSetting) == TypeList: setting.info = (setting.info[0], (itemsByName, itemsByValue, sortedItems)) else: setting.info = (itemsByName, itemsByValue, sortedItems) def ApplyStringExtensions (self, sortBaseSetting, extendOthersToo): cdef CCSStrExtensionList * extList cdef CCSStrExtension * ext cdef CCSString * baseSettingName cdef char * baseSettingNameValue cdef CCSStringList * baseSettingList cdef CCSSettingType t cdef CCSSettingInfo * i cdef CCSStrRestrictionList * restrictionList cdef CCSStrRestriction * restriction cdef Plugin basePlugin cdef Setting setting extList = ccsGetPluginStrExtensions (self.ccsPlugin) while extList: ext = extList.data # If not extending others and extension base is not self, skip if (not (extendOthersToo or ext.basePlugin == self.Name)) or \ ext.basePlugin not in self.context.Plugins: extList = extList.next continue basePlugin = self.context.Plugins[ext.basePlugin] baseSettingList = ext.baseSettings while baseSettingList: baseSettingName = baseSettingList.data baseSettingNameValue = baseSettingName.value settings = [basePlugin.Screen[baseSettingNameValue]] for settingItem in settings: setting = settingItem t = ccsSettingGetType (setting.ccsSetting) i = ccsSettingGetInfo (setting.ccsSetting) if t == TypeList: t = i.forList.listType i = i.forList.listInfo if not (t == TypeString and i.forString.extensible): return restrictionList = ext.restriction # Add each item in restriction list to the setting while restrictionList != NULL: restriction = restrictionList.data setting.extendedStrRestrictions[restriction.name] = \ restriction.value if ext.basePlugin == self.Name: setting.baseStrRestrictions.append ((restriction.name, restriction.value)) restrictionList = restrictionList.next if sortBaseSetting: basePlugin.SortSingleStringSetting (setting) baseSettingList = baseSettingList.next extList = extList.next def GetExtensionBasePlugins (self): cdef CCSStrExtensionList * extList cdef CCSStrExtension * ext basePlugins = set ([]) extList = ccsGetPluginStrExtensions (self.ccsPlugin) while extList: ext = extList.data basePlugins.add (self.context.Plugins[ext.basePlugin]) extList = extList.next return list (basePlugins) property Context: def __get__ (self): return self.context property Groups: def __get__ (self): if not self.loaded: self.Update () return self.groups property Screen: def __get__ (self): if not self.loaded: self.Update () return self.screen property Ranking: def __get__ (self): if not self.loaded: self.Update () return self.ranking property Name: def __get__ (self): return ccsPluginGetName (self.ccsPlugin) property ShortDesc: def __get__ (self): return ccsPluginGetShortDesc (self.ccsPlugin) property LongDesc: def __get__ (self): return ccsPluginGetLongDesc (self.ccsPlugin) property Category: def __get__ (self): return ccsPluginGetCategory (self.ccsPlugin) property Features: def __get__ (self): features = StringListToList ( ccsPluginGetProvidesFeaturesBindable (self.ccsPlugin)) return features property Initialized: def __get__ (self): return bool (self.loaded) property Enabled: def __get__ (self): return bool (ccsPluginIsActive (self.context.ccsContext, ccsPluginGetName (self.ccsPlugin))) def __set__ (self, val): if val: if len (self.EnableConflicts): return ccsPluginSetActive (self.ccsPlugin, True) else: if len (self.DisableConflicts): return ccsPluginSetActive (self.ccsPlugin, False) property EnableConflicts: def __get__ (self): cdef CCSPluginConflictList * pl, * pls cdef CCSPluginConflict * pc cdef CCSPluginList * ppl cdef CCSPlugin * plg if self.Enabled: return [] ret = [] pl = ccsCanEnablePlugin (self.context.ccsContext, self.ccsPlugin) pls = pl while pls != NULL: pc = pls.data rpl = [] ppl = pc.plugins while ppl != NULL: plg = ppl.data rpl.append (self.context.Plugins[ccsPluginGetName (plg)]) ppl = ppl.next ret.append ((ConflictTypeString[pc.type], pc.value, rpl)) pls = pls.next if pl != NULL: ccsPluginConflictListFree (pl, True) return ret property DisableConflicts: def __get__ (self): cdef CCSPluginConflictList * pl, * pls cdef CCSPluginConflict * pc cdef CCSPluginList * ppl cdef CCSPlugin * plg if not self.Enabled: return [] ret = [] pl = ccsCanDisablePlugin (self.context.ccsContext, self.ccsPlugin) pls = pl while pls != NULL: pc = pls.data rpl = [] ppl = pc.plugins while ppl != NULL: plg = ppl.data rpl.append (self.context.Plugins[ccsPluginGetName (plg)]) ppl = ppl.next ret.append ((ConflictTypeString[pc.type], pc.value, rpl)) pls = pls.next if pl != NULL: ccsPluginConflictListFree (pl, True) return ret cdef class Profile: cdef Context context cdef char * name def __cinit__ (self, Context context, name): self.context = context self.name = strdup (name) def __dealloc__ (self): free (self.name) def Delete (self): ccsDeleteProfile (self.context.ccsContext, self.name) property Name: def __get__ (self): return self.name cdef class Backend: cdef Context context cdef char * name cdef char * shortDesc cdef char * longDesc cdef Bool profileSupport cdef Bool integrationSupport def __cinit__ (self, Context context, info): self.context = context self.name = strdup (info[0]) self.shortDesc = strdup (info[1]) self.longDesc = strdup (info[2]) self.profileSupport = bool (info[3]) self.integrationSupport = bool (info[4]) def __dealloc__ (self): free (self.name) free (self.shortDesc) free (self.longDesc) property Name: def __get__ (self): return self.name property ShortDesc: def __get__ (self): return self.shortDesc property LongDesc: def __get__ (self): return self.longDesc property IntegrationSupport: def __get__ (self): return self.integrationSupport property ProfileSupport: def __get__ (self): return self.profileSupport cdef class Context: """A python representation of a CCSContext. This is the main entry-point into the compizconfig module. Typical usage: >>> context = Context() >>> plugin = context.Plugins['core'] >>> setting = plugin.Screen['number_of_desktops'] >>> print setting.Value 1 """ cdef CCSContext * ccsContext cdef object plugins cdef object categories cdef object profiles cdef object currentProfile cdef object backends cdef object currentBackend cdef Bool integration def __cinit__ (self, screenNum = 0, plugins = [], basic_metadata = False): cdef CCSPlugin * pl cdef CCSList * pll if basic_metadata: ccsSetBasicMetadata (True) self.plugins = {} if not len (plugins): self.ccsContext = ccsContextNew (screenNum, &ccsDefaultInterfaceTable) else: self.ccsContext = ccsEmptyContextNew (screenNum, &ccsDefaultInterfaceTable) for plugin in plugins: self.LoadPlugin (plugin) ccsReadSettings (self.ccsContext) pll = ccsContextGetPluginsBindable (self.ccsContext) self.categories = {} while pll != NULL: pl = pll.data self.plugins[ccsPluginGetName (pl)] = Plugin (self, ccsPluginGetName (pl)) if ccsPluginGetCategory (pl) == NULL: cat = '' else: cat = ccsPluginGetCategory (pl) if not self.categories.has_key (cat): self.categories[cat] = [] self.categories[cat].append (self.plugins[ccsPluginGetName (pl)]) pll = pll.next self.integration = ccsGetIntegrationEnabled (self.ccsContext) self.UpdateProfiles () def UpdateExtensiblePlugins (self): cdef Plugin plugin # Reset all extensible plugins for name, pluginItem in self.plugins.items (): plugin = pluginItem if plugin.hasExtendedString: plugin.Update () # Apply restricted string extensions for name, pluginItem in self.plugins.items (): plugin = pluginItem if plugin.Enabled: plugin.ApplyStringExtensions (False, True) # Sort restricted string settings for name, pluginItem in self.plugins.items (): plugin = pluginItem if plugin.Enabled and plugin.hasExtendedString: plugin.SortStringSettings () def __dealloc__ (self): ccsContextDestroy (self.ccsContext) def LoadPlugin (self, plugin): return ccsLoadPlugin (self.ccsContext, plugin) # Returns the settings that should be updated def ProcessEvents (self, flags = 0): ccsProcessEvents (self.ccsContext, flags) if len (self.ChangedSettings): self.Read () return True return False def Write (self, onlyChanged = True): if onlyChanged: ccsWriteChangedSettings (self.ccsContext) else: ccsWriteSettings (self.ccsContext) def Read (self): ccsReadSettings (self.ccsContext) def UpdateProfiles (self): self.profiles = {} self.currentProfile = Profile (self, ccsGetProfile (self.ccsContext)) cdef CCSStringList * profileList cdef CCSString * profileNameString cdef char * profileName profileList = ccsGetExistingProfiles (self.ccsContext) while profileList != NULL: profileNameString = profileList.data profileName = profileNameString.value self.profiles[profileName] = Profile (self, profileName) profileList = profileList.next self.backends = {} cdef CCSBackendInfoList * backendList cdef CCSBackendInfoList * origBackendList cdef CCSBackendInfo * backendInfo origBackendList = backendList = ccsGetExistingBackends (self.ccsContext) while backendList != NULL: backendInfo = backendList.data info = (backendInfo.name, backendInfo.shortDesc, backendInfo.longDesc, backendInfo.profileSupport, backendInfo.integrationSupport) self.backends[backendInfo.name] = Backend (self, info) backendList = backendList.next ccsBackendInfoListFree (origBackendList, True) self.currentBackend = self.backends[ccsGetBackend (self.ccsContext)] def ResetProfile (self): self.currentProfile = Profile (self, "") ccsSetProfile (self.ccsContext, "") ccsReadSettings (self.ccsContext) def Import (self, path, autoSave = True): ret = bool (ccsImportFromFile (self.ccsContext, path, True)) if autoSave: ccsWriteSettings (self.ccsContext) return ret def Export (self, path, skipDefaults = False): return bool (ccsExportToFile (self.ccsContext, path, skipDefaults)) property Plugins: def __get__ (self): return self.plugins property Categories: def __get__ (self): return self.categories property CurrentProfile: def __get__ (self): return self.currentProfile def __set__ (self, profile): self.currentProfile = profile ccsSetProfile (self.ccsContext, profile.Name) ccsReadSettings (self.ccsContext) property Profiles: def __get__ (self): return self.profiles property CurrentBackend: def __get__ (self): return self.currentBackend def __set__ (self, backend): self.currentBackend = backend ccsSetBackend (self.ccsContext, backend.Name) ccsReadSettings (self.ccsContext) property Backends: def __get__ (self): return self.backends property ChangedSettings: def __get__ (self): return SettingListToList (self, ccsContextGetChangedSettingsBindable (self.ccsContext)) def __set__ (self, value): cdef CCSSettingList * settingList cdef CCSSettingList * l cdef CCSSetting * setting ccsContextClearChangedSettings (self.ccsContext) if value != None and len (value) != 0: settingList = ListToSettingList (value) l = settingList while l: setting = l.data ccsContextAddChangedSetting (self.ccsContext, setting) l = l.next ccsSettingListFree (settingList, False) property AutoSort: def __get__ (self): return bool (ccsGetPluginListAutoSort (self.ccsContext)) def __set__ (self, value): ccsSetPluginListAutoSort (self.ccsContext, bool (value)) property Integration: def __get__ (self): return bool (self.integration) def __set__ (self, value): self.integration = value ccsSetIntegrationEnabled (self.ccsContext, value) ccsReadSettings (self.ccsContext) ./compizconfig/compizconfig-python/Makefile0000644000004100000410000000027513246301623021404 0ustar www-datawww-dataall: @python setup.py build --prefix=${PREFIX} install: all @python setup.py install --prefix=${PREFIX} uninstall: @python setup.py uninstall --prefix=${PREFIX} clean: rm -rf build/ ./compizconfig/compizconfig-python/tests/0000755000004100000410000000000013246301624021103 5ustar www-datawww-data./compizconfig/compizconfig-python/tests/mock.xml0000644000004100000410000000100013246301623022544 0ustar www-datawww-data Mock Mock plugin Mocks mocking A Mock Group A Mock Subgroup ./compizconfig/compizconfig-python/tests/compiz_config_test.py0000644000004100000410000000131413246301623025340 0ustar www-datawww-dataimport os import sys import subprocess arch = subprocess.Popen (["uname", "-p"], stdout=subprocess.PIPE).communicate ()[0][:-1] os.environ["G_SLICE"] = "always-malloc" os.environ["COMPIZ_METADATA_PATH"] = "compizconfig/compizconfig-python/" os.environ["COMPIZ_CONFIG_PROFILE"] = "" os.environ["XDG_CONFIG_HOME"] = "compizconfig/libcompizconfig/config" os.environ["LIBCOMPIZCONFIG_BACKEND_PATH"] = "compizconfig/libcompizconfig/backend/" os.environ["XDG_DATA_DIRS"] = "generated/" sys.path.insert (0, "compizconfig/compizconfig-python") import unittest import compizconfig class CompizConfigTest (unittest.TestCase): ccs = compizconfig def setUp (self): self.context = compizconfig.Context () ./compizconfig/compizconfig-python/tests/__init__.py0000644000004100000410000000042413246301623023213 0ustar www-datawww-dataimport unittest import compizconfig import os def load_tests (loader, tests, pattern): tests = loader.discover (os.getcwd (), pattern='test_*.py') return tests if __name__ == "__main__": loader = unittest.defaultTestLoader unittest.main (testLoader=loader) ./compizconfig/compizconfig-python/tests/test_plugin.py0000644000004100000410000000116313246301623024012 0ustar www-datawww-dataimport compiz_config_test import unittest class CompizConfigTestPlugin (compiz_config_test.CompizConfigTest): def runTest (self): plugin = self.ccs.Plugin (self.context, "mock") plugin.Update () self.assertEqual (plugin.Context, self.context) self.assertTrue ("A Mock Group" in plugin.Groups) self.assertTrue (plugin.Screen is not None) self.assertEqual (plugin.Name, "mock") self.assertEqual (plugin.ShortDesc, "Mock") self.assertEqual (plugin.LongDesc, "Mock plugin") self.assertEqual (plugin.Category, "Mocks") self.assertEqual (plugin.Features, ["mocking"]) if __name__ == '__main__': unittest.main() ./compizconfig/compizconfig-python/tests/test_profile.py0000644000004100000410000000116213246301623024153 0ustar www-datawww-dataimport compiz_config_test import unittest class CompizConfigProfileTest (compiz_config_test.CompizConfigTest): def runTest (self): profile = self.ccs.Profile (self.context, "compizconfig") self.assertEqual (profile.Name, "compizconfig", 'wrong profile name') profile1 = self.ccs.Profile (self.context, "compizconfig2") self.assertEqual (profile1.Name, "compizconfig2", 'wrong profile name') profile2 = self.ccs.Profile (self.context, "compizconfig3") self.assertEqual (profile2.Name, "compizconfig3", 'wrong profile name') if __name__ == '__main__': unittest.main() ./compizconfig/compizconfig-python/tests/test_setting.py0000644000004100000410000000151413246301623024171 0ustar www-datawww-dataimport compiz_config_test import unittest class CompizConfigTestSetting (compiz_config_test.CompizConfigTest): def runTest (self): plugin = self.context.Plugins["mock"] setting = self.ccs.Setting (plugin, "mock") self.assertEqual (setting.Plugin, plugin) self.assertEqual (setting.Name, "mock") self.assertEqual (setting.ShortDesc, "Mock Setting") self.assertEqual (setting.LongDesc, "A Mock Setting") self.assertEqual (setting.Group, "A Mock Group") self.assertEqual (setting.SubGroup, "A Mock Subgroup") self.assertEqual (setting.Type, "String") self.assertEqual (setting.Hints, []) self.assertEqual (setting.DefaultValue, "Mock Value") self.assertEqual (setting.Value, "Mock Value") self.assertEqual (setting.Integrated, False) self.assertEqual (setting.ReadOnly, False) if __name__ == '__main__': unittest.main() ./compizconfig/compizconfig-python/tests/test_backend.py0000644000004100000410000000105413246301623024102 0ustar www-datawww-dataimport compiz_config_test import unittest class CompizConfigTestBackend (compiz_config_test.CompizConfigTest): def runTest (self): info = ["ini", "Ini Backend", "Flat File Backend", True, False] backend = self.ccs.Backend (self.context, info) self.assertEqual (backend.Name, "ini") self.assertEqual (backend.ShortDesc, "Ini Backend") self.assertEqual (backend.LongDesc, "Flat File Backend") self.assertEqual (backend.IntegrationSupport, False) self.assertEqual (backend.ProfileSupport, True) if __name__ == '__main__': unittest.main() ./compizconfig/compizconfig-python/setup.py0000644000004100000410000001125613246301623021457 0ustar www-datawww-data# -*- coding: utf-8 -*- from distutils.core import setup, Command from distutils.command.build import build as _build from distutils.command.install import install as _install from distutils.command.install_data import install_data as _install_data from distutils.command.sdist import sdist as _sdist import os import subprocess import sys import unittest pkg_config_environ = os.environ pkg_config_environ["PKG_CONFIG_PATH"] = os.getcwd () + "/../libcompizconfig:" + os.environ.get ("PKG_CONFIG_PATH", '') pkgconfig_libs = subprocess.Popen (["pkg-config", "--libs", "libcompizconfig_internal"], stdout=subprocess.PIPE, env=pkg_config_environ, stderr=open(os.devnull, 'w')).communicate ()[0] if len (pkgconfig_libs) is 0: print ("CompizConfig Python [ERROR]: No libcompizconfig_internal.pc found in the pkg-config search path") print ("Ensure that libcompizonfig is installed or libcompizconfig.pc is in your $PKG_CONFIG_PATH") exit (1); libs = pkgconfig_libs[2:].split (" ")[0] INSTALLED_FILES = "installed_files" for arg in sys.argv: if "--version" in arg: VERSION = arg.split ("=")[1] class build (_build): user_options = _build.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _build.initialize_options (self) def finalize_options(self): _build.finalize_options (self) class install (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): _install.run (self) outputs = self.get_outputs () length = 0 if self.root: length += len (self.root) if self.prefix: length += len (self.prefix) if length: for counter in xrange (len (outputs)): outputs[counter] = outputs[counter][length:] data = "\n".join (outputs) try: file = open (INSTALLED_FILES, "w") except: self.warn ("Could not write installed files list %s" % \ INSTALLED_FILES) return file.write (data) file.close () class install_data (_install_data): def run (self): def chmod_data_file (file): try: os.chmod (file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) except: self.warn ("Could not chmod data file %s" % file) _install_data.run (self) map (chmod_data_file, self.get_outputs ()) class uninstall (_install): user_options = _install.user_options[:] user_options.extend ([('version=', None, "Version of the package")]) def initialize_options(self): self.version = None _install.initialize_options (self) def finalize_options(self): _install.finalize_options (self) def run (self): try: file = open (INSTALLED_FILES, "r") except: self.warn ("Could not read installed files list %s" % \ INSTALLED_FILES) return files = file.readlines () file.close () prepend = "" if self.root: prepend += self.root if self.prefix: prepend += self.prefix if len (prepend): for counter in xrange (len (files)): files[counter] = prepend + files[counter].rstrip () for file in files: print ("Uninstalling %s" % file) try: os.unlink (file) except: self.warn ("Could not remove file %s" % file) class test (Command): description = "run tests" user_options = [] def initialize_options (self): self.cwd = None def finalize_options (self): self.cwd = os.getcwd () def run (self): assert os.getcwd () == self.cwd, 'Must be in package root: %s' % self.cwd loader = unittest.TestLoader () tests = loader.discover (os.getcwd (), pattern='test*') result = unittest.TestResult () unittest.TextTestRunner (verbosity=2).run (tests) setup ( name = "compizconfig-python", version = VERSION, description = "CompizConfig Python", url = "https://launchpad.net/compiz", license = "GPL", maintainer = "Guillaume Seguin", maintainer_email = "guillaume@segu.in", cmdclass = {"uninstall" : uninstall, "install" : install, "install_data" : install_data, "build" : build, "test" : test} ) ./compizconfig/compizconfig-python/TODO0000644000004100000410000000000013246301623020416 0ustar www-datawww-data./compizconfig/compizconfig-python/MANIFEST.in0000644000004100000410000000013713246301623021477 0ustar www-datawww-datainclude TODO README INSTALL AUTHORS COPYING NEWS VERSION ChangeLog include Makefile MANIFEST.in./compizconfig/compizconfig-python/compizconfig-python.pc.in0000644000004100000410000000047613246301623024706 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ pyexecdir=@pyexecdir@ Name: compizconfig-python Version: @VERSION@ Description: Compiz configuration system bindings Requires: @CCS_REQUIRES@ Libs: @CCS_LIBS@ -L@libdir@ -lcompizconfig Cflags: @CCS_CFLAGS@ -I@includedir@/compizconfig ./compizconfig/tests/0000755000004100000410000000000013246301623015074 5ustar www-datawww-data./compizconfig/tests/compizconfig_ccs_settings_test_fixture.h0000644000004100000410000001000113246301623025301 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTINGS_TEST_FIXTURE_H #define _COMPIZCONFIG_CCS_SETTINGS_TEST_FIXTURE_H #include #include #include "compizconfig_ccs_variant_types.h" typedef enum _CCSSettingType CCSSettingType; typedef struct _CCSSetting CCSSetting; namespace compizconfig { namespace test { Bool boolToBool (bool v); } } class CCSSettingsConceptTestEnvironmentInterface { public: virtual ~CCSSettingsConceptTestEnvironmentInterface () {} virtual void SetUp () = 0; virtual void TearDown () = 0; virtual void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) = 0; virtual Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) = 0; virtual int ReadIntegerAtKey (const std::string &plugin, const std::string &key) = 0; virtual float ReadFloatAtKey (const std::string &plugin, const std::string &key) = 0; virtual const char * ReadStringAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) = 0; virtual unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) = 0; virtual const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) = 0; virtual Bool ReadBellAtKey (const std::string &plugin, const std::string &key) = 0; virtual CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) = 0; }; #endif ./compizconfig/tests/CMakeLists.txt0000644000004100000410000000537513246301623017646 0ustar www-datawww-datainclude_directories (${CMAKE_CURRENT_SOURCE_DIR}/../libcompizconfig/include ${CMAKE_CURRENT_SOURCE_DIR}/../mocks/libcompizconfig ${CMAKE_SOURCE_DIR}/tests/shared ${CMAKE_CURRENT_SOURCE_DIR}) add_library (compizconfig_ccs_item_in_list_matcher STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_item_in_list_matcher.cpp) target_link_libraries (compizconfig_ccs_item_in_list_matcher ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_list_equality STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_list_equality.cpp) target_link_libraries (compizconfig_ccs_list_equality ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_list_wrapper STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_list_wrapper.cpp) target_link_libraries (compizconfig_ccs_list_wrapper ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_setting_value_operators STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_value_operators.cpp) target_link_libraries (compizconfig_ccs_setting_value_operators ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_setting_value_matcher STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_setting_value_matcher.cpp) target_link_libraries (compizconfig_ccs_setting_value_matcher ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig compizconfig_ccs_setting_value_operators) add_library (compizconfig_ccs_test_value_combinations STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_test_value_combiners.cpp) target_link_libraries (compizconfig_ccs_test_value_combinations ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig) add_library (compizconfig_ccs_backend_conformance_test STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_backend_concept_test.cpp) target_link_libraries (compizconfig_ccs_backend_conformance_test ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} compizconfig compizconfig_ccs_test_value_combinations compizconfig_ccs_setting_value_operators compizconfig_ccs_list_equality compizconfig_ccs_item_in_list_matcher compizconfig_ccs_setting_stub) ./compizconfig/tests/compizconfig_ccs_list_equality.h0000644000004100000410000000351613246301623023541 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_LIST_EQUALITY_H #define _COMPIZCONFIG_CCS_LIST_EQUALITY_H #include #include #include #include using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Matcher; typedef struct _CCSSettingValueList * CCSSettingValueList; typedef struct _CCSSettingListInfo CCSSettingListInfo; class PrivateListEqualityMatcher; class ListEqualityMatcher : public MatcherInterface { public: ListEqualityMatcher (CCSSettingListInfo *info, CCSSettingValueList cmp); virtual bool MatchAndExplain (CCSSettingValueList x, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; virtual void DescribeNegationTo (std::ostream *os) const; private: std::auto_ptr priv; }; Matcher ListEqual (CCSSettingListInfo *info, CCSSettingValueList cmp); #endif ./compizconfig/tests/compizconfig_ccs_setting_value_matcher.cpp0000644000004100000410000000403713246301623025557 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "compizconfig_ccs_setting_value_matcher.h" #include "compizconfig_ccs_setting_value_operators.h" namespace cct = compiz::config::test; CCSSettingValueMatcher::CCSSettingValueMatcher (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info) : mMatch (match), mType (type), mInfo (info) { } bool CCSSettingValueMatcher::MatchAndExplain (CCSSettingValue x, MatchResultListener *listener) const { if (ccsCheckValueEq (&x, mType, mInfo, &mMatch, mType, mInfo)) return true; return false; } void CCSSettingValueMatcher::DescribeTo (std::ostream *os) const { *os << "Value Matches "; cct::DescribeSettingValueTo (*os, mType, mMatch); } void CCSSettingValueMatcher::DescribeNegationTo (std::ostream *os) const { *os << "Value does not Match "; cct::DescribeSettingValueTo (*os, mType, mMatch); } Matcher SettingValueMatch (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info) { return MakeMatcher (new CCSSettingValueMatcher (match, type, info)); } ./compizconfig/tests/compizconfig_ccs_mocked_allocator.h0000644000004100000410000000611113246301623024145 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_MOCKED_ALLOCATION_H #define _COMPIZCONFIG_CCS_MOCKED_ALLOCATION_H #include #include class AllocationInterface { public: virtual ~AllocationInterface() {} virtual void * realloc_ (void *, size_t) = 0; virtual void * malloc_ (size_t) = 0; virtual void * calloc_ (size_t, size_t) = 0; virtual void free_ (void *) = 0; public: static void * wrapRealloc (void *o, void *a , size_t b) { AllocationInterface *ao = static_cast (o); return ao->realloc_ (a, b); } static void * wrapMalloc (void *o, size_t a) { AllocationInterface *ao = static_cast (o); return ao->malloc_ (a); } static void * wrapCalloc (void *o, size_t a, size_t b) { AllocationInterface *ao = static_cast (o); return ao->calloc_ (a, b); } static void wrapFree (void *o, void *a) { AllocationInterface *ao = static_cast (o); ao->free_ (a); } }; class ObjectAllocationGMock : public AllocationInterface { public: MOCK_METHOD2 (realloc_, void * (void *, size_t)); MOCK_METHOD1 (malloc_, void * (size_t)); MOCK_METHOD2 (calloc_, void * (size_t, size_t)); MOCK_METHOD1 (free_, void (void *)); }; class FailingObjectReallocation : public AllocationInterface { public: FailingObjectReallocation (unsigned int sc) : successCount (sc) { } void * realloc_ (void *a, size_t b) { unsigned int c = successCount--; if (c) return realloc (a, b); else return NULL; } void * malloc_ (size_t a) { return malloc (a); } void * calloc_ (size_t n, size_t a) { return calloc (n, a); } void free_ (void *a) { free (a); } private: unsigned int successCount; }; class FailingObjectAllocation : public AllocationInterface { public: void * realloc_ (void *a, size_t b) { return NULL; } void * malloc_ (size_t a) { return NULL; } void * calloc_ (size_t n, size_t a) { return NULL; } void free_ (void *a) { } }; CCSObjectAllocationInterface failingAllocator = { AllocationInterface::wrapRealloc, AllocationInterface::wrapMalloc, AllocationInterface::wrapCalloc, AllocationInterface::wrapFree, NULL }; #endif ./compizconfig/tests/compizconfig_ccs_item_in_list_matcher.h0000644000004100000410000000523713246301623025035 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_ITEM_IN_LIST_MATCHER_H #define _COMPIZCONFIG_CCS_ITEM_IN_LIST_MATCHER_H #include #include #include using ::testing::Matcher; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::MakeMatcher; template class ItemInCCSListMatcher : public ::testing::MatcherInterface { public: ItemInCCSListMatcher (const Matcher &matcher) : mMatcher (matcher) { } virtual ~ItemInCCSListMatcher() {} virtual bool MatchAndExplain (L list, MatchResultListener *listener) const { L iter = list; while (iter) { const I &i = *(reinterpret_cast (iter->data)); if (mMatcher.MatchAndExplain (i, listener)) return true; iter = iter->next; } return false; } virtual void DescribeTo (std::ostream *os) const { *os << "found in list ("; mMatcher.DescribeTo (os); *os << ")"; } virtual void DescribeNegationTo (std::ostream *os) const { *os << "not found in list ("; mMatcher.DescribeNegationTo (os); *os << ")"; } private: Matcher mMatcher; }; template Matcher IsItemInCCSList (const Matcher &matcher) { return MakeMatcher (new ItemInCCSListMatcher (matcher)); } typedef struct _CCSString CCSString; typedef struct _CCSStringList * CCSStringList; typedef struct _CCSSettingValue CCSSettingValue; typedef struct _CCSSettingValueList * CCSSettingValueList; /* A workaround for templates inside of macros not * expanding correctly */ Matcher IsStringItemInStringCCSList (const Matcher &matcher); Matcher IsSettingValueInSettingValueCCSList (const Matcher &matcher); #endif ./compizconfig/tests/compizconfig_ccs_setting_value_operators.h0000644000004100000410000000505013246301623025613 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTING_VALUE_OPERATORS_H #define _COMPIZCONFIG_CCS_SETTING_VALUE_OPERATORS_H #include #include typedef struct _CCSSettingValueList * CCSSettingValueList; typedef union _CCSSettingColorValue CCSSettingColorValue; typedef struct _CCSSettingKeyValue CCSSettingKeyValue; typedef struct _CCSSettingButtonValue CCSSettingButtonValue; typedef struct _CCSString CCSString; bool operator== (const CCSSettingColorValue &lhs, const CCSSettingColorValue &rhs); std::ostream & operator<< (std::ostream &os, const CCSSettingColorValue &v); bool operator== (const CCSSettingKeyValue &lhs, const CCSSettingKeyValue &rhs); std::ostream & operator<< (std::ostream &os, const CCSSettingKeyValue &v); bool operator== (const CCSSettingButtonValue &lhs, const CCSSettingButtonValue &rhs); std::ostream & operator<< (std::ostream &os, const CCSSettingButtonValue &v); bool operator== (const CCSString &lhs, const std::string &rhs); bool operator== (const std::string &lhs, const CCSString &rhs); bool operator== (const std::string &rhs, CCSString *lhs); std::ostream & operator<< (std::ostream &os, CCSString &string); namespace compiz { namespace config { namespace test { std::ostream & DescribeSettingValueTo (std::ostream &os, CCSSettingType type, const CCSSettingValue &value); std::ostream & DescribeSettingListTo (std::ostream &os, CCSSettingType type, CCSSettingValueList list); } } } std::ostream & operator<< (std::ostream &os, const CCSSettingValue &v); std::ostream & operator<< (std::ostream &os, CCSSettingValueList l); #endif ./compizconfig/tests/compizconfig_backend_concept_test.cpp0000644000004100000410000003444313246301623024520 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include using ::testing::NiceMock; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; using ::testing::DoAll; using ::testing::AtLeast; using ::testing::Eq; namespace cct = compizconfig::test; Bool cct::boolToBool (bool v) { return v ? TRUE : FALSE; } cci::SettingValueListWrapper::Ptr cct::CCSListConstructionExpectationsSetter (const cct::ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType) { CCSSettingInfo listInfo; listInfo.forList.listType = type; listInfo.forList.listInfo = (CCSSettingInfo *) calloc (1, sizeof (CCSSettingInfo)); boost::function f (boost::bind (ccsSettingUnref, _1)); boost::shared_ptr stubSetting (ccsSettingTypeStubNew (TypeList, TRUE, TRUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &listInfo, &ccsDefaultObjectAllocator), f); ccsCleanupSettingInfo (&listInfo, TypeList); return boost::make_shared (c (stubSetting.get ()), storageType, type, stubSetting); } CCSSettingGMock * cct::getSettingGMockFromSetting (const boost::shared_ptr &setting) { return reinterpret_cast (ccsObjectGetPrivate (setting.get ())); } void cct::SetIntWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getInt (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadIntegerAtKey (plugin, key), boost::get (value)); } void cct::SetBoolWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getBool (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boolToBool (boost::get (value))), Return (TRUE))); write (); bool v (boost::get (value)); if (v) EXPECT_THAT (env->ReadBoolAtKey (plugin, key), IsTrue ()); else EXPECT_THAT (env->ReadBoolAtKey (plugin, key), IsFalse ()); } void cct::SetFloatWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getFloat (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadFloatAtKey (plugin, key), boost::get (value)); } void cct::SetStringWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getString (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( const_cast (boost::get (value))), Return (TRUE))); write (); EXPECT_EQ (std::string (env->ReadStringAtKey (plugin, key)), std::string (boost::get (value))); } void cct::SetColorWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getColor (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadColorAtKey (plugin, key), boost::get (value)); } void cct::SetKeyWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getKey (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadKeyAtKey (plugin, key), boost::get (value)); } void cct::SetButtonWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getButton (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadButtonAtKey (plugin, key), boost::get (value)); } void cct::SetEdgeWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getEdge (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boost::get (value)), Return (TRUE))); write (); EXPECT_EQ (env->ReadEdgeAtKey (plugin, key), boost::get (value)); } void cct::SetBellWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getBell (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( boolToBool (boost::get (value))), Return (TRUE))); write (); bool v (boost::get (value)); if (v) EXPECT_THAT (env->ReadBellAtKey (plugin, key), IsTrue ()); else EXPECT_THAT (env->ReadBellAtKey (plugin, key), IsFalse ()); } void cct::SetMatchWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); EXPECT_CALL (*gmock, getMatch (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( const_cast ( boost::get ( value))), Return (TRUE))); write (); EXPECT_EQ (std::string (env->ReadMatchAtKey (plugin, key)), std::string (boost::get (value))); } void cct::SetListWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env) { CCSSettingGMock *gmock (getSettingGMockFromSetting (setting)); CCSSettingValueList list = *(boost::get > (value)); EXPECT_CALL (*gmock, getInfo ()); CCSSettingInfo *info = ccsSettingGetInfo (setting.get ()); info->forList.listType = (boost::get > (value))->type (); EXPECT_CALL (*gmock, getInfo ()).Times (AtLeast (1)); EXPECT_CALL (*gmock, getList (_)).WillRepeatedly (DoAll ( SetArgPointee <0> ( list), Return (TRUE))); write (); EXPECT_THAT (cci::SettingValueListWrapper (env->ReadListAtKey (plugin, key, setting.get ()), cci::Deep, info->forList.listType, setting), ListEqual (&info->forList, list)); } void cct::SetIntReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setInt (boost::get (value), _)); } void cct::SetBoolReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { bool v (boost::get (value)); if (v) EXPECT_CALL (*gmock, setBool (IsTrue (), _)); else EXPECT_CALL (*gmock, setBool (IsFalse (), _)); } void cct::SetBellReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { bool v (boost::get (value)); if (v) EXPECT_CALL (*gmock, setBell (IsTrue (), _)); else EXPECT_CALL (*gmock, setBell (IsFalse (), _)); } void cct::SetFloatReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setFloat (boost::get (value), _)); } void cct::SetStringReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setString (Eq (std::string (boost::get (value))), _)); } void cct::SetMatchReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setMatch (Eq (std::string (boost::get (value))), _)); } void cct::SetColorReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setColor (boost::get (value), _)); } void cct::SetKeyReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setKey (boost::get (value), _)); } void cct::SetButtonReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setButton (boost::get (value), _)); } void cct::SetEdgeReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { EXPECT_CALL (*gmock, setEdge (boost::get (value), _)); } void cct::SetListReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value) { static CCSSettingInfo globalListInfo; globalListInfo.forList.listType = (boost::get > (value))->type (); globalListInfo.forList.listInfo = NULL; ON_CALL (*gmock, getInfo ()).WillByDefault (Return (&globalListInfo)); EXPECT_CALL (*gmock, setList ( ListEqual ( &globalListInfo.forList, *(boost::get > (value))), _)); } ./compizconfig/tests/compizconfig_ccs_list_equality.cpp0000644000004100000410000000364413246301623024076 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include using ::testing::MakeMatcher; class PrivateListEqualityMatcher { public: PrivateListEqualityMatcher (CCSSettingListInfo *info, CCSSettingValueList cmp) : mInfo (info), mCmp (cmp) { } CCSSettingListInfo *mInfo; CCSSettingValueList mCmp; }; ListEqualityMatcher::ListEqualityMatcher (CCSSettingListInfo *info, CCSSettingValueList cmp) : priv (new PrivateListEqualityMatcher (info, cmp)) { } bool ListEqualityMatcher::MatchAndExplain (CCSSettingValueList x, MatchResultListener *listener) const { return ccsCompareLists (x, priv->mCmp, *priv->mInfo); } void ListEqualityMatcher::DescribeTo (std::ostream *os) const { *os << "lists are equal"; } void ListEqualityMatcher::DescribeNegationTo (std::ostream *os) const { *os << "lists are not equal"; } Matcher ListEqual (CCSSettingListInfo *info, CCSSettingValueList cmp) { return MakeMatcher (new ListEqualityMatcher (info, cmp)); } ./compizconfig/tests/compizconfig_backend_concept_test.h0000644000004100000410000011362713246301623024167 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST #define _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST #ifdef __clang__ #include #if BOOST_VERSION < 104700 #error "Boost 1.47 or later is required (http://clang.llvm.org/compatibility.html#deleted-special-func)" #endif /* Work around a bug in clang which marks functions used by * uninstantiated templates as unused */ #define COMPIZ_TEMPLATE_EXPECTATION_CHECK COMPIZ_TEMPLATE_EXPECTATION_CHECK #else #define COMPIZ_TEMPLATE_EXPECTATION_CHECK #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gtest_shared_characterwrapper.h" #include "gtest_unspecified_bool_type_matcher.h" #include "compizconfig_test_value_combiners.h" #include "compizconfig_ccs_setting_value_operators.h" #include "compizconfig_ccs_item_in_list_matcher.h" #include "compizconfig_ccs_list_equality.h" #include "compizconfig_ccs_list_wrapper.h" #include "compizconfig_ccs_variant_types.h" #include "compizconfig_backend_concept_test_internal.h" #include "compizconfig_backend_concept_test_environment_interface.h" namespace cci = compiz::config::impl; namespace cc = compiz::config; class CCSBackendConceptTestEnvironmentFactoryInterface { public: typedef boost::shared_ptr Ptr; virtual ~CCSBackendConceptTestEnvironmentFactoryInterface () {} virtual CCSBackendConceptTestEnvironmentInterface::Ptr ConstructTestEnv () = 0; }; template class CCSBackendConceptTestEnvironmentFactory : public CCSBackendConceptTestEnvironmentFactoryInterface { public: CCSBackendConceptTestEnvironmentInterface::Ptr ConstructTestEnv () { return boost::make_shared (); } }; namespace compizconfig { namespace test { typedef boost::function WriteFunc; typedef boost::function ConstructorFunc; cci::SettingValueListWrapper::Ptr CCSListConstructionExpectationsSetter (const ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType); CCSSettingGMock * getSettingGMockFromSetting (const boost::shared_ptr &setting); void SetIntWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetBoolWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetFloatWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetStringWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetColorWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetKeyWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetButtonWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetEdgeWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetBellWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetMatchWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetListWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const CCSBackendConceptTestEnvironmentInterface::Ptr &env); void SetIntReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBoolReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBellReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetFloatReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetStringReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetMatchReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetColorReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetKeyReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetButtonReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetEdgeReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetListReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); } } using ::testing::AtLeast; using ::testing::DoAll; using ::testing::Eq; using ::testing::IsNull; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::NiceMock; using ::testing::NotNull; using ::testing::Return; using ::testing::ReturnNull; using ::testing::SetArgPointee; namespace cci = compiz::config::impl; namespace cc = compiz::config; typedef boost::variant VariantTypes; class CCSBackendConceptTestParamInterface { public: virtual ~CCSBackendConceptTestParamInterface () {} typedef boost::shared_ptr Ptr; typedef void (CCSBackendConceptTestEnvironmentInterface::*NativeWriteMethod) (const std::string &plugin, const std::string &keyname, const VariantTypes &value); typedef boost::function SetReadExpectation; typedef boost::function &, const compizconfig::test::WriteFunc &, const CCSBackendConceptTestEnvironmentInterface::Ptr &)> SetWriteExpectation; virtual void BackendTearDown (CCSBackend *) = 0; virtual CCSBackendConceptTestEnvironmentInterface::Ptr testEnv () = 0; virtual VariantTypes & value () = 0; virtual void nativeWrite (const CCSBackendConceptTestEnvironmentInterface::Ptr &iface, const std::string &plugin, const std::string &keyname, const VariantTypes &value) = 0; virtual CCSSettingType & type () = 0; virtual std::string & keyname () = 0; virtual SetWriteExpectation & setWriteExpectationAndWrite () = 0; virtual SetReadExpectation & setReadExpectation () = 0; virtual std::string & what () = 0; }; template class CCSBackendConceptTestParam : public CCSBackendConceptTestParamInterface { public: virtual ~CCSBackendConceptTestParam () {} typedef boost::shared_ptr > Ptr; CCSBackendConceptTestParam (CCSBackendConceptTestEnvironmentFactoryInterface *testEnvFactory, const VariantTypes &value, const NativeWriteMethod &write, const CCSSettingType &type, const std::string &keyname, const SetReadExpectation &setReadExpectation, const SetWriteExpectation &setWriteExpectation, const std::string &what) : mTestEnvFactory (testEnvFactory), mTestEnv (), mValue (value), mNativeWrite (write), mType (type), mKeyname (keyname), mSetReadExpectation (setReadExpectation), mSetWriteExpectation (setWriteExpectation), mWhat (what) { } void BackendTearDown (CCSBackend *b) { if (mTestEnv) mTestEnv->BackendTearDown (b); mTestEnv.reset (); } CCSBackendConceptTestEnvironmentInterface::Ptr testEnv () { if (!mTestEnv) mTestEnv = mTestEnvFactory->ConstructTestEnv (); return mTestEnv; } VariantTypes & value () { return mValue; } void nativeWrite (const CCSBackendConceptTestEnvironmentInterface::Ptr & iface, const std::string &plugin, const std::string &keyname, const VariantTypes &value) { return ((iface.get ())->*mNativeWrite) (plugin, keyname, value); } CCSSettingType & type () { return mType; } std::string & keyname () { return mKeyname; } CCSBackendConceptTestParamInterface::SetReadExpectation & setReadExpectation () { return mSetReadExpectation; } CCSBackendConceptTestParamInterface::SetWriteExpectation & setWriteExpectationAndWrite () { return mSetWriteExpectation; } std::string & what () { return mWhat; } private: CCSBackendConceptTestEnvironmentFactoryInterface *mTestEnvFactory; CCSBackendConceptTestEnvironmentInterface::Ptr mTestEnv; VariantTypes mValue; NativeWriteMethod mNativeWrite; CCSSettingType mType; std::string mKeyname; SetReadExpectation mSetReadExpectation; SetWriteExpectation mSetWriteExpectation; std::string mWhat; }; class CCSBackendConformanceSpawnObjectsTestFixtureBase { protected: CCSBackendConformanceSpawnObjectsTestFixtureBase () : profileName ("mock") { } virtual ~CCSBackendConformanceSpawnObjectsTestFixtureBase () { } /* Having the returned context, setting and plugin * as out params is awkward, but GTest doesn't let * you use ASSERT_* unless the function returns void */ void SpawnContext (boost::shared_ptr &context) { context.reset (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)); } void SpawnPlugin (const std::string &name, const boost::shared_ptr &context, boost::shared_ptr &plugin) { plugin.reset (ccsMockPluginNew (), boost::bind (ccsFreeMockPlugin, _1)); CCSPluginGMock *gmockPlugin = (CCSPluginGMock *) ccsObjectGetPrivate (plugin.get ()); ASSERT_FALSE (name.empty ()); ASSERT_THAT (context.get (), NotNull ()); ON_CALL (*gmockPlugin, getName ()).WillByDefault (Return ((char *) name.c_str ())); ON_CALL (*gmockPlugin, getContext ()).WillByDefault (Return (context.get ())); } void SpawnSetting (const std::string &name, CCSSettingType type, const boost::shared_ptr &plugin, boost::shared_ptr &setting) { setting.reset (ccsMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); mSpawnedSettingInfo.push_back (CCSSettingInfo ()); CCSSettingGMock *gmockSetting = (CCSSettingGMock *) ccsObjectGetPrivate (setting.get ()); ASSERT_FALSE (name.empty ()); ASSERT_NE (type, TypeNum); ASSERT_THAT (plugin.get (), NotNull ()); ON_CALL (*gmockSetting, getName ()).WillByDefault (Return ((char *) name.c_str ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (type)); ON_CALL (*gmockSetting, getParent ()).WillByDefault (Return (plugin.get ())); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&(mSpawnedSettingInfo.back ()))); } void SetupContext () { SpawnContext (context); gmockContext = (CCSContextGMock *) ccsObjectGetPrivate (context.get ()); ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (profileName.c_str ())); } CCSBackend * GetBackend () { return mBackend; } boost::shared_ptr context; CCSContextGMock *gmockContext; CCSBackend *mBackend; private: std::vector mSpawnedSettingInfo; std::string profileName; }; class CCSBackendConformanceTestParameterizedByBackendFixture : public CCSBackendConformanceSpawnObjectsTestFixtureBase, public ::testing::TestWithParam { public: CCSBackendConformanceTestParameterizedByBackendFixture () : mTestEnv (GetParam ()->ConstructTestEnv ()) { } virtual void SetUp () { SetupContext (); mBackend = mTestEnv->BackendSetUp (context.get (), gmockContext); } virtual void TearDown () { if (mTestEnv) mTestEnv->BackendTearDown (mBackend); mTestEnv.reset (); } protected: CCSBackendConceptTestEnvironmentInterface::Ptr mTestEnv; }; class CCSBackendConformanceTestParameterized : public CCSBackendConformanceSpawnObjectsTestFixtureBase, public ::testing::TestWithParam { public: virtual ~CCSBackendConformanceTestParameterized () {} virtual void SetUp () { SetupContext (); mBackend = GetParam ()->testEnv ()->BackendSetUp (context.get (), gmockContext); } virtual void TearDown () { CCSBackendConformanceTestParameterized::GetParam ()->BackendTearDown (mBackend); } }; namespace compizconfig { namespace test { namespace list_populators = impl::populators::list; typedef boost::function ConstructorFunc; cci::SettingValueListWrapper::Ptr CCSListConstructionExpectationsSetter (const ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType); template ::testing::internal::ParamGenerator GenerateTestingParametersForBackendInterface () { static CCSBackendConceptTestEnvironmentFactory interfaceFactory; static CCSBackendConceptTestEnvironmentFactoryInterface *backendEnvFactory = &interfaceFactory; typedef CCSBackendConceptTestParam ConceptParam; static typename CCSBackendConceptTestParamInterface::Ptr testParam[] = { boost::make_shared (backendEnvFactory, VariantTypes (1), &CCSBackendConceptTestEnvironmentInterface::WriteIntegerAtKey, TypeInt, "integer_setting", boost::bind (SetIntReadExpectation, _1, _2), boost::bind (SetIntWriteExpectation, _1, _2, _3, _4, _5, _6), "TestInt"), boost::make_shared (backendEnvFactory, VariantTypes (true), &CCSBackendConceptTestEnvironmentInterface::WriteBoolAtKey, TypeBool, "boolean_setting", boost::bind (SetBoolReadExpectation, _1, _2), boost::bind (SetBoolWriteExpectation, _1, _2, _3, _4, _5, _6), "TestBool"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast (3.0)), &CCSBackendConceptTestEnvironmentInterface::WriteFloatAtKey, TypeFloat, "float_setting", boost::bind (SetFloatReadExpectation, _1, _2), boost::bind (SetFloatWriteExpectation, _1, _2, _3, _4, _5, _6), "TestFloat"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast ("foo")), &CCSBackendConceptTestEnvironmentInterface::WriteStringAtKey, TypeString, "string_setting", boost::bind (SetStringReadExpectation, _1, _2), boost::bind (SetStringWriteExpectation, _1, _2, _3, _4, _5, _6), "TestString"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast ("foo=bar")), &CCSBackendConceptTestEnvironmentInterface::WriteMatchAtKey, TypeMatch, "match_setting", boost::bind (SetMatchReadExpectation, _1, _2), boost::bind (SetMatchWriteExpectation, _1, _2, _3, _4, _5, _6), "TestMatch"), boost::make_shared (backendEnvFactory, VariantTypes (true), &CCSBackendConceptTestEnvironmentInterface::WriteBellAtKey, TypeBell, "bell_setting", boost::bind (SetBellReadExpectation, _1, _2), boost::bind (SetBellWriteExpectation, _1, _2, _3, _4, _5, _6), "TestBell"), boost::make_shared (backendEnvFactory, VariantTypes (impl::getColorValueList ()[0]), &CCSBackendConceptTestEnvironmentInterface::WriteColorAtKey, TypeColor, "color_setting", boost::bind (SetColorReadExpectation, _1, _2), boost::bind (SetColorWriteExpectation, _1, _2, _3, _4, _5, _6), "TestColor"), boost::make_shared (backendEnvFactory, VariantTypes (impl::keyValue), &CCSBackendConceptTestEnvironmentInterface::WriteKeyAtKey, TypeKey, "key_setting", boost::bind (SetKeyReadExpectation, _1, _2), boost::bind (SetKeyWriteExpectation, _1, _2, _3, _4, _5, _6), "TestKey"), boost::make_shared (backendEnvFactory, VariantTypes (impl::buttonValue), &CCSBackendConceptTestEnvironmentInterface::WriteButtonAtKey, TypeButton, "button_setting", boost::bind (SetButtonReadExpectation, _1, _2), boost::bind (SetButtonWriteExpectation, _1, _2, _3, _4, _5, _6), "TestButton"), boost::make_shared (backendEnvFactory, VariantTypes (static_cast (1)), &CCSBackendConceptTestEnvironmentInterface::WriteEdgeAtKey, TypeEdge, "edge_setting", boost::bind (SetEdgeReadExpectation, _1, _2), boost::bind (SetEdgeWriteExpectation, _1, _2, _3, _4, _5, _6), "TestEdge"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::integer, _1), TypeInt, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "int_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListInt"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::doubleprecision, _1), TypeFloat, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "float_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListFloat"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::boolean, _1), TypeBool, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "bool_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListBool"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::string, _1), TypeString, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "string_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListString"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::match, _1), TypeMatch, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "match_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListMatch"), boost::make_shared (backendEnvFactory, VariantTypes (CCSListConstructionExpectationsSetter (boost::bind (list_populators::color, _1), TypeColor, cci::Deep)), &CCSBackendConceptTestEnvironmentInterface::WriteListAtKey, TypeList, "color_list_setting", boost::bind (SetListReadExpectation, _1, _2), boost::bind (SetListWriteExpectation, _1, _2, _3, _4, _5, _6), "TestListColor") }; return ::testing::ValuesIn (testParam); } template ::testing::internal::ParamGenerator GenerateTestingEnvFactoryBackendInterface () { boost::shared_ptr f (boost::make_shared > ()); return ::testing::Values (f); } } } class CCSBackendConformanceTestReadWrite : public CCSBackendConformanceTestParameterized { public: virtual ~CCSBackendConformanceTestReadWrite () {} virtual void SetUp () { CCSBackendConformanceTestParameterized::SetUp (); pluginName = "mock"; settingName = GetParam ()->keyname (); VALUE = GetParam ()->value (); CCSBackendConformanceTestParameterized::SpawnPlugin (pluginName, context, plugin); CCSBackendConformanceTestParameterized::SpawnSetting (settingName, GetParam ()->type (), plugin, setting); gmockPlugin = (CCSPluginGMock *) ccsObjectGetPrivate (plugin.get ()); gmockSetting = (CCSSettingGMock *) ccsObjectGetPrivate (setting.get ()); } virtual void TearDown () { CCSBackendConformanceTestParameterized::TearDown (); } protected: std::string pluginName; std::string settingName; VariantTypes VALUE; boost::shared_ptr plugin; boost::shared_ptr setting; CCSPluginGMock *gmockPlugin; CCSSettingGMock *gmockSetting; }; TEST_P (CCSBackendConformanceTestReadWrite, TestReadValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "Read"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreRead (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->nativeWrite (CCSBackendConformanceTestParameterized::GetParam ()->testEnv (), pluginName, settingName, VALUE); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostRead (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setReadExpectation () (gmockSetting, VALUE); ccsBackendReadSetting (CCSBackendConformanceTestParameterized::GetBackend (), context.get (), setting.get ()); } TEST_P (CCSBackendConformanceTestReadWrite, TestUpdateMockedValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "UpdateMocked"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->nativeWrite (CCSBackendConformanceTestParameterized::GetParam ()->testEnv (), pluginName, settingName, VALUE); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setReadExpectation () (gmockSetting, VALUE); ccsBackendUpdateSetting (CCSBackendConformanceTestParameterized::GetBackend (), context.get (), plugin.get (), setting.get ()); } TEST_P (CCSBackendConformanceTestReadWrite, TestUpdateKeyedValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "UpdateKeyed"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->nativeWrite (CCSBackendConformanceTestParameterized::GetParam ()->testEnv (), pluginName, settingName, VALUE); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostUpdate (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setReadExpectation () (gmockSetting, VALUE); EXPECT_CALL (*gmockContext, findPlugin (_)).WillOnce (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, findSetting (_)).WillOnce (Return (setting.get ())); EXPECT_TRUE (CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->UpdateSettingAtKey (pluginName, settingName)); } TEST_P (CCSBackendConformanceTestReadWrite, TestWriteValue) { SCOPED_TRACE (CCSBackendConformanceTestParameterized::GetParam ()->what () + "Write"); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PreWrite (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); CCSBackendConformanceTestParameterized::GetParam ()->setWriteExpectationAndWrite () (pluginName, settingName, VALUE, setting, boost::bind (ccsBackendWriteSetting, CCSBackendConformanceTestParameterized::GetBackend (), context.get (), setting.get ()), GetParam ()->testEnv ()); CCSBackendConformanceTestParameterized::GetParam ()->testEnv ()->PostWrite (gmockContext, gmockPlugin, gmockSetting, GetParam ()->type ()); } class CCSBackendConformanceTestInfo : public CCSBackendConformanceTestParameterizedByBackendFixture { }; TEST_P (CCSBackendConformanceTestInfo, TestGetInfo) { const CCSBackendInfo *knownBackendInfo = mTestEnv->GetInfo (); const CCSBackendInfo *retreivedBackendInfo = ccsBackendGetInfo (GetBackend ()); EXPECT_THAT (retreivedBackendInfo->name, Eq (knownBackendInfo->name)); EXPECT_THAT (retreivedBackendInfo->shortDesc, Eq (knownBackendInfo->shortDesc)); EXPECT_THAT (retreivedBackendInfo->longDesc, Eq (knownBackendInfo->longDesc)); if (knownBackendInfo->profileSupport) EXPECT_TRUE (retreivedBackendInfo->profileSupport); else EXPECT_FALSE (retreivedBackendInfo->profileSupport); if (knownBackendInfo->integrationSupport) EXPECT_TRUE (retreivedBackendInfo->integrationSupport); else EXPECT_FALSE (retreivedBackendInfo->integrationSupport); } class CCSBackendConformanceTestInitFiniFuncs : public CCSBackendConformanceTestParameterizedByBackendFixture { }; TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestReadInit) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->readInit) { mTestEnv->SetReadInitExpectation (context.get (), gmockContext); ccsBackendReadInit (backend, context.get ()); } } TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestReadDone) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->readDone) { mTestEnv->SetReadDoneExpectation (context.get (), gmockContext); ccsBackendReadDone (backend, context.get ()); } } TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestWriteInit) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->writeInit) { mTestEnv->SetWriteInitExpectation (context.get (), gmockContext); ccsBackendWriteInit (backend, context.get ()); } } TEST_P (CCSBackendConformanceTestInitFiniFuncs, TestWriteDone) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->writeDone) { mTestEnv->SetWriteDoneExpectation (context.get (), gmockContext); ccsBackendWriteDone (backend, context.get ()); } } class CCSBackendConformanceTestProfileHandling : public CCSBackendConformanceTestParameterizedByBackendFixture { public: static const std::string PROFILE_MOCK; static const std::string PROFILE_DEFAULT; static const std::string PROFILE_FOO; static const std::string PROFILE_BAR; static const std::string PROFILE_BAZ; }; const std::string CCSBackendConformanceTestProfileHandling::PROFILE_MOCK ("mock"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_DEFAULT ("Default"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_FOO ("foo"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_BAR ("bar"); const std::string CCSBackendConformanceTestProfileHandling::PROFILE_BAZ ("baz"); TEST_P (CCSBackendConformanceTestProfileHandling, TestGetExistingProfiles) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 4); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Current profile should also be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_MOCK))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_BAR))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } TEST_P (CCSBackendConformanceTestProfileHandling, TestDeleteNonCurrentProfile) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); CharacterWrapper PROFILE_BAR_CHAR (strdup (PROFILE_BAR.c_str ())); mTestEnv->SetDeleteProfileExpectation (PROFILE_BAR, context.get (), gmockContext); EXPECT_TRUE (ccsBackendDeleteProfile (backend, context.get (), PROFILE_BAR_CHAR)); /* Check to make sure that the profile is no longer there */ mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 3); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Current profile should also be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_MOCK))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); /* PROFILE_BAR was deleted */ EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAR)))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } TEST_P (CCSBackendConformanceTestProfileHandling, TestDeleteNonExistantCurrentProfile) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); CharacterWrapper PROFILE_BAZ_CHAR (strdup (PROFILE_BAZ.c_str ())); mTestEnv->SetDeleteProfileExpectation (PROFILE_BAZ, context.get (), gmockContext); EXPECT_FALSE (ccsBackendDeleteProfile (backend, context.get (), PROFILE_BAZ_CHAR)); /* Check to make sure that the profile is no longer there */ mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 4); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Current profile should also be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_MOCK))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_BAR))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } TEST_P (CCSBackendConformanceTestProfileHandling, TestDeleteCurrentProfile) { CCSBackend *backend = GetBackend (); CCSBackendInterface *backendInterface = GET_INTERFACE (CCSBackendInterface, backend); if (backendInterface->getExistingProfiles) { mTestEnv->AddProfile (PROFILE_FOO); mTestEnv->AddProfile (PROFILE_BAR); CharacterWrapper PROFILE_BAR_CHAR (strdup (PROFILE_BAR.c_str ())); /* Make sure that backends know what profile is being deleted */ ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (PROFILE_BAR.c_str ())); mTestEnv->SetDeleteProfileExpectation (PROFILE_BAR, context.get (), gmockContext); /* Before deleting the profile, getProfile can no longer refer to it */ ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (PROFILE_FOO.c_str ())); EXPECT_TRUE (ccsBackendDeleteProfile (backend, context.get (), PROFILE_BAR_CHAR)); /* Check to make sure that the profile is no longer there */ mTestEnv->SetGetExistingProfilesExpectation (context.get (), gmockContext); boost::shared_ptr <_CCSStringList> existingProfiles (ccsBackendGetExistingProfiles (backend, context.get ()), boost::bind (ccsStringListFree, _1, TRUE)); ASSERT_EQ (ccsStringListLength (existingProfiles.get ()), 2); /* Default profile must always be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_DEFAULT))); /* Old current profile shouldn't be there */ EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAR)))); /* New current profile should be there */ EXPECT_THAT (existingProfiles.get (), IsStringItemInStringCCSList (Eq (PROFILE_FOO))); EXPECT_THAT (existingProfiles.get (), Not (IsStringItemInStringCCSList (Eq (PROFILE_BAZ)))); } } #endif ./compizconfig/tests/compizconfig_ccs_variant_types.h0000644000004100000410000000244313246301623023537 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_VARIANT_TYPES_H #define _COMPIZCONFIG_CCS_VARIANT_TYPES_H #include #include #include "compizconfig_ccs_list_wrapper.h" typedef boost::variant VariantTypes; #endif ./compizconfig/tests/compizconfig_test_value_combiners.h0000644000004100000410000000362013246301623024231 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_TEST_VALUE_COMBINERS_H #define _COMPIZCONFIG_TEST_VALUE_COMBINERS_H #include #include #include namespace compizconfig { namespace test { namespace impl { extern Bool boolValues[]; extern int intValues[]; extern float floatValues[]; extern const char * stringValues[]; extern const char * matchValues[]; extern CCSSettingKeyValue keyValue; extern CCSSettingButtonValue buttonValue; extern const unsigned int NUM_COLOR_VALUES; CCSSettingColorValue * getColorValueList (); namespace populators { namespace list { CCSSettingValueList boolean (CCSSetting *setting); CCSSettingValueList integer (CCSSetting *setting); CCSSettingValueList doubleprecision (CCSSetting *setting); CCSSettingValueList string (CCSSetting *setting); CCSSettingValueList match (CCSSetting *setting); CCSSettingValueList color (CCSSetting *setting); } } } } } #endif ./compizconfig/tests/compizconfig_backend_concept_test_environment_interface.h0000644000004100000410000000632513246301623030627 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_ENVIRONMENT_INTERFACE_H #define _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_ENVIRONMENT_INTERFACE_H #include #include #include "compizconfig_ccs_settings_test_fixture.h" typedef struct _CCSContext CCSContext; typedef struct _CCSBackendInfo CCSBackendInfo; class CCSContextGMock; class CCSPluginGMock; class CCSSettingGMock; class CCSBackendConceptTestEnvironmentInterface : public CCSSettingsConceptTestEnvironmentInterface { public: typedef boost::shared_ptr Ptr; virtual ~CCSBackendConceptTestEnvironmentInterface () {}; virtual CCSBackend * BackendSetUp (CCSContext *context, CCSContextGMock *gmockContext) = 0; virtual void BackendTearDown (CCSBackend *) = 0; virtual void AddProfile (const std::string &profile) = 0; virtual void SetGetExistingProfilesExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetDeleteProfileExpectation (const std::string &, CCSContext *, CCSContextGMock *) = 0; virtual void SetReadInitExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetReadDoneExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetWriteInitExpectation (CCSContext *, CCSContextGMock *) = 0; virtual void SetWriteDoneExpectation (CCSContext *, CCSContextGMock *) = 0; virtual const CCSBackendInfo * GetInfo () = 0; virtual void PreWrite (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PostWrite (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PreRead (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PostRead (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PreUpdate (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual void PostUpdate (CCSContextGMock *, CCSPluginGMock *, CCSSettingGMock *, CCSSettingType) = 0; virtual bool UpdateSettingAtKey (const std::string &plugin, const std::string &setting) = 0; }; #endif ./compizconfig/tests/compizconfig_ccs_setting_value_matcher.h0000644000004100000410000000365013246301623025224 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_SETTING_VALUE_MATCHER_H #define _COMPIZCONFIG_CCS_SETTING_VALUE_MATCHER_H #include #include #include #include using ::testing::MatcherInterface; using ::testing::Matcher; using ::testing::MatchResultListener; typedef struct _CCSSettingValue CCSSettingValue; typedef union _CCSSettingInfo CCSSettingInfo; class CCSSettingValueMatcher : public ::testing::MatcherInterface { public: CCSSettingValueMatcher (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info); virtual bool MatchAndExplain (CCSSettingValue x, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; virtual void DescribeNegationTo (std::ostream *os) const; private: const CCSSettingValue &mMatch; CCSSettingType mType; CCSSettingInfo *mInfo; }; Matcher SettingValueMatch (const CCSSettingValue &match, CCSSettingType type, CCSSettingInfo *info); #endif ./compizconfig/tests/compizconfig_test_value_combiners.cpp0000644000004100000410000001015213246301623024562 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include namespace compizconfig { namespace test { namespace impl { Bool boolValues[] = { TRUE, FALSE, TRUE }; int intValues[] = { 1, 2, 3 }; float floatValues[] = { 1.0, 2.0, 3.0 }; const char * stringValues[] = { "foo", "grill", "bar" }; const char * matchValues[] = { "type=foo", "class=bar", "xid=42" }; const unsigned int NUM_COLOR_VALUES = 3; CCSSettingKeyValue keyValue = { XK_A, (1 << 0)}; CCSSettingButtonValue buttonValue = { 1, (1 << 0), (1 << 1) }; CCSSettingColorValue * getColorValueList (); } } } namespace cctesti = compizconfig::test::impl; namespace cclistpopulatorsi = compizconfig::test::impl::populators::list; CCSSettingColorValue * cctesti::getColorValueList () { static const unsigned short max = std::numeric_limits ::max (); static const unsigned short maxD2 = max / 2; static const unsigned short maxD4 = max / 4; static const unsigned short maxD8 = max / 8; static bool colorValueListInitialized = false; static CCSSettingColorValue colorValues[NUM_COLOR_VALUES]; if (!colorValueListInitialized) { colorValues[0].color.red = maxD2; colorValues[0].color.blue = maxD4; colorValues[0].color.green = maxD8; colorValues[0].color.alpha = max; colorValues[1].color.red = maxD8; colorValues[1].color.blue = maxD4; colorValues[1].color.green = maxD2; colorValues[1].color.alpha = max; colorValues[1].color.red = max; colorValues[1].color.blue = maxD4; colorValues[1].color.green = maxD2; colorValues[1].color.alpha = maxD8; for (unsigned int i = 0; i < NUM_COLOR_VALUES; ++i) { CharacterWrapper s (ccsColorToString (&colorValues[i])); ccsStringToColor (s, &colorValues[i]); } colorValueListInitialized = true; } return colorValues; } CCSSettingValueList cclistpopulatorsi::boolean (CCSSetting *setting) { return ccsGetValueListFromBoolArray (cctesti::boolValues, sizeof (cctesti::boolValues) / sizeof (cctesti::boolValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::integer (CCSSetting *setting) { return ccsGetValueListFromIntArray (cctesti::intValues, sizeof (cctesti::intValues) / sizeof (cctesti::intValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::doubleprecision (CCSSetting *setting) { return ccsGetValueListFromFloatArray (cctesti::floatValues, sizeof (cctesti::floatValues) / sizeof (cctesti::floatValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::string (CCSSetting *setting) { return ccsGetValueListFromStringArray (cctesti::stringValues, sizeof (cctesti::stringValues) / sizeof (cctesti::stringValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::match (CCSSetting *setting) { return ccsGetValueListFromMatchArray (cctesti::matchValues, sizeof (cctesti::matchValues) / sizeof (cctesti::matchValues[0]), setting); } CCSSettingValueList cclistpopulatorsi::color (CCSSetting *setting) { return ccsGetValueListFromColorArray (cctesti::getColorValueList (), cctesti::NUM_COLOR_VALUES, setting); } ./compizconfig/tests/compizconfig_ccs_list_wrapper.h0000644000004100000410000001057713246301623023371 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_LIST_WRAPPER_H #define _COMPIZCONFIG_CCS_LIST_WRAPPER_H #include #include #include #include typedef struct _CCSSettingValueList * CCSSettingValueList; typedef struct _CCSSetting CCSSetting; typedef union _CCSSettingInfo CCSSettingInfo; typedef struct _CCSSettingValue CCSSettingValue; namespace compiz { namespace config { template class ListWrapper : boost::noncopyable { public: virtual ~ListWrapper () {} virtual ListWrapper & append (const DataType &) = 0; virtual ListWrapper & remove (const DataType &) = 0; virtual operator const ListType & () const = 0; virtual operator ListType & () = 0; }; namespace impl { namespace cc = compiz::config; namespace cci = compiz::config::impl; typedef enum _ListStorageType { Shallow = 0, Deep = 1 } ListStorageType; template class ListWrapper : public cc::ListWrapper { public: typedef ListType (*ListTypeFreeFunc) (ListType, Bool); typedef ListType (*ListTypeAppendFunc) (ListType, DataType); typedef ListType (*ListTypeRemoveFunc) (ListType, DataType, Bool); ListWrapper (const ListType &list, ListTypeFreeFunc freeFunc, ListTypeAppendFunc appendFunc, ListTypeRemoveFunc removeFunc, ListStorageType storageType) : mList (list), mFree (freeFunc), mAppend (appendFunc), mRemove (removeFunc), mStorageType (storageType) { }; cc::ListWrapper & append (DataType const &data) { mList = (*mAppend) (mList, data); return *this; } cc::ListWrapper & remove (DataType const &data) { Bool freeObj = (mStorageType == Deep); mList = (*mRemove) (mList, data, freeObj); return *this; } operator const ListType & () const { return mList; } operator ListType & () { return mList; } ~ListWrapper () { Bool freeObj = (mStorageType == Deep); (*mFree) (mList, freeObj); } private: ListType mList; ListTypeFreeFunc mFree; ListTypeAppendFunc mAppend; ListTypeRemoveFunc mRemove; ListStorageType mStorageType; }; class PrivateSettingValueListWrapper; class SettingValueListWrapper : public compiz::config::ListWrapper { public: typedef boost::shared_ptr Ptr; typedef compiz::config::ListWrapper InternalWrapper; typedef compiz::config::impl::ListWrapper InternalWrapperImpl; SettingValueListWrapper (CCSSettingValueList list, ListStorageType storageType, CCSSettingType type, const boost::shared_ptr &settingReference); CCSSettingType type (); InternalWrapper & append (CCSSettingValue * const &value); InternalWrapper & remove (CCSSettingValue * const &value); operator const CCSSettingValueList & () const; operator CCSSettingValueList & (); const boost::shared_ptr & setting (); private: boost::shared_ptr priv; }; } } } #endif ./compizconfig/tests/compizconfig_ccs_item_in_list_matcher.cpp0000644000004100000410000000241613246301623025364 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include Matcher IsStringItemInStringCCSList (const Matcher &matcher) { return IsItemInCCSList (matcher); } Matcher IsSettingValueInSettingValueCCSList (const Matcher &matcher) { return IsItemInCCSList (matcher); } ./compizconfig/tests/compizconfig_backend_concept_test_internal.h0000644000004100000410000002143713246301623026060 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_INTERNAL_H #define _COMPIZCONFIG_CCS_BACKEND_CONCEPT_TEST_INTERNAL_H #include #include #include #include #include #include #include #include "gtest_shared_characterwrapper.h" #include "compizconfig_test_value_combiners.h" #include "compizconfig_ccs_setting_value_operators.h" #include "compizconfig_ccs_item_in_list_matcher.h" #include "compizconfig_ccs_list_equality.h" #include "compizconfig_ccs_list_wrapper.h" #include "compizconfig_ccs_variant_types.h" #include "compizconfig_ccs_settings_test_fixture.h" namespace cci = compiz::config::impl; namespace cc = compiz::config; class CCSBackendConceptTestEnvironmentInterface; class CCSSettingGMock; namespace compizconfig { namespace test { typedef boost::function WriteFunc; typedef boost::function ConstructorFunc; cci::SettingValueListWrapper::Ptr CCSListConstructionExpectationsSetter (const ConstructorFunc &c, CCSSettingType type, cci::ListStorageType storageType); Bool boolToBool (bool v); CCSSettingGMock * getSettingGMockFromSetting (const boost::shared_ptr &setting); void SetIntWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetBoolWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetFloatWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetStringWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetColorWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetKeyWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetButtonWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetEdgeWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetBellWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetMatchWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetListWriteExpectation (const std::string &plugin, const std::string &key, const VariantTypes &value, const boost::shared_ptr &setting, const WriteFunc &write, const boost::shared_ptr &env); void SetIntReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBoolReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetBellReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetFloatReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetStringReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetMatchReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetColorReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetKeyReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetButtonReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetEdgeReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); void SetListReadExpectation (CCSSettingGMock *gmock, const VariantTypes &value); } } #endif ./compizconfig/tests/compizconfig_ccs_setting_value_operators.cpp0000644000004100000410000001204713246301623026152 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include namespace cct = compiz::config::test; bool operator== (const CCSSettingColorValue &lhs, const CCSSettingColorValue &rhs) { if (ccsIsEqualColor (lhs, rhs)) return true; return false; } std::ostream & operator<< (std::ostream &os, const CCSSettingColorValue &v) { return os << "Red: " << std::hex << v.color.red << "Blue: " << std::hex << v.color.blue << "Green: " << v.color.green << "Alpha: " << v.color.alpha << std::dec << std::endl; } bool operator== (const CCSSettingKeyValue &lhs, const CCSSettingKeyValue &rhs) { if (ccsIsEqualKey (lhs, rhs)) return true; return false; } std::ostream & operator<< (std::ostream &os, const CCSSettingKeyValue &v) { return os << "Keysym: " << v.keysym << " KeyModMask " << std::hex << v.keyModMask << std::dec << std::endl; } bool operator== (const CCSSettingButtonValue &lhs, const CCSSettingButtonValue &rhs) { if (ccsIsEqualButton (lhs, rhs)) return true; return false; } std::ostream & operator<< (std::ostream &os, const CCSSettingButtonValue &v) { return os << "Button " << v.button << "Button Key Mask: " << std::hex << v.buttonModMask << "Edge Mask: " << v.edgeMask << std::dec << std::endl; } bool operator== (const CCSString &lhs, const std::string &rhs) { if (rhs == lhs.value) return true; return false; } bool operator== (const std::string &lhs, const CCSString &rhs) { return rhs == lhs; } bool operator== (const std::string &rhs, CCSString *lhs) { return *lhs == rhs; } std::ostream & operator<< (std::ostream &os, CCSString &string) { os << string.value << std::endl; return os; } std::ostream & cct::DescribeSettingValueTo (std::ostream &os, CCSSettingType type, const CCSSettingValue &value) { switch (type) { case TypeBool: return os << value.value.asBool; break; case TypeInt: return os << value.value.asInt; break; case TypeFloat: return os << value.value.asFloat; break; case TypeString: return os << value.value.asString; break; case TypeColor: return os << value.value.asColor; break; case TypeAction: return os << "An action value"; break; case TypeKey: return os << value.value.asKey; break; case TypeButton: return os << value.value.asButton; break; case TypeEdge: return os << value.value.asEdge; break; case TypeBell: return os << value.value.asBell; break; case TypeMatch: return os << value.value.asMatch; break; case TypeList: return os << value.value.asList; break; default: return os << "No available descriptor, type not known"; break; } return os; } std::ostream & cct::DescribeSettingListTo (std::ostream &os, CCSSettingType type, CCSSettingValueList list) { unsigned int count = 0; while (list) { os << "Item " << count << " "; cct::DescribeSettingValueTo (os, type, *list->data); list = list->next; ++count; } return os; } std::ostream & operator<< (std::ostream &os, const CCSSettingValue &v) { os << "Possible values in CCSSetting :" << std::endl; const unsigned int finalType = static_cast (TypeNum); for (unsigned int i = 0; i < finalType; ++i) { /* We cannot print list values as there's no guarantee * this is actually a list */ if (static_cast (i) == TypeList) os << "A list value" << std::endl; else cct::DescribeSettingValueTo (os, static_cast (i), v) << std::endl; } return os; } std::ostream & operator<< (std::ostream &os, CCSSettingValueList l) { os << "Possible list values :" << std::endl; const unsigned int finalType = static_cast (TypeNum); for (unsigned int i = 0; i < finalType; ++i) { /* We cannot print list values as there's no guarantee * this is actually a list */ if (static_cast (i) == TypeList) os << "A list value" << std::endl; else cct::DescribeSettingListTo (os, static_cast (i), l) << std::endl; } return os; } ./compizconfig/tests/compizconfig_ccs_list_wrapper.cpp0000644000004100000410000000573513246301623023724 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include namespace cci = compiz::config::impl; namespace cc = compiz::config; namespace compiz { namespace config { namespace impl { class PrivateSettingValueListWrapper { public: PrivateSettingValueListWrapper (CCSSettingValueList list, cci::ListStorageType storageType, CCSSettingType type, const boost::shared_ptr &settingReference) : mType (type), mSettingReference (settingReference), mListWrapper (list, ccsSettingValueListFree, ccsSettingValueListAppend, ccsSettingValueListRemove, storageType) { } CCSSettingType mType; boost::shared_ptr mSettingReference; SettingValueListWrapper::InternalWrapperImpl mListWrapper; }; } } } cci::SettingValueListWrapper::SettingValueListWrapper (CCSSettingValueList list, cci::ListStorageType storageType, CCSSettingType type, const boost::shared_ptr &settingReference) : priv (new cci::PrivateSettingValueListWrapper (list, storageType, type, settingReference)) { } CCSSettingType cci::SettingValueListWrapper::type () { return priv->mType; } cci::SettingValueListWrapper::InternalWrapper & cci::SettingValueListWrapper::append (CCSSettingValue * const &value) { return priv->mListWrapper.append (value); } cci::SettingValueListWrapper::InternalWrapper & cci::SettingValueListWrapper::remove (CCSSettingValue * const &value) { return priv->mListWrapper.remove (value); } cci::SettingValueListWrapper::operator const CCSSettingValueList & () const { return priv->mListWrapper; } cci::SettingValueListWrapper::operator CCSSettingValueList & () { return priv->mListWrapper; } const boost::shared_ptr & cci::SettingValueListWrapper::setting () { return priv->mSettingReference; } ./compizconfig/gsettings/0000755000004100000410000000000013246301624015742 5ustar www-datawww-data./compizconfig/gsettings/CMakeLists.txt0000644000004100000410000000370113246301623020502 0ustar www-datawww-dataproject (compizconfig-backend-gsettings) find_package (CompizConfig REQUIRED) include (LibCompizConfigCommon) include (CompizGSettings) set (_deps glib-2.0>=2.20.0 gio-2.0>=2.25.0) if (COMPIZ_BUILD_TESTING) add_subdirectory (mocks) endif (COMPIZ_BUILD_TESTING) add_subdirectory (gsettings_backend_shared) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/gsettings_backend_shared ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gsettings/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include) set (COMPIZCONFIG_GSETTINGS_BACKEND_LIBRARIES compizconfig_gsettings_backend) compizconfig_backend (gsettings PKGDEPS ${_deps} LIBRARIES ${COMPIZCONFIG_GSETTINGS_BACKEND_LIBRARIES}) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) if (GLIB_COMPILE_SCHEMAS) set (_top_gschema org.compiz) set (_top_gschema_file ${_top_gschema}.gschema.xml) set (_top_gschema_src ${CMAKE_CURRENT_SOURCE_DIR}/${_top_gschema_file}) set (_top_gschema_dest ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_top_gschema_file}) set (_top_gschema_inst ${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/) configure_file (${_top_gschema_src} ${_top_gschema_dest}) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/glib-2.0/schemas/gschemas.compiled COMMAND ${GLIB_COMPILE_SCHEMAS} --targetdir=${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ${CMAKE_BINARY_DIR}/glib-2.0/schemas/ ) add_custom_command (OUTPUT ${_top_gschema_dest} COMMAND cp -r ${_top_gschema_src} ${_top_gschema_dest} DEPENDS ${_top_gschema_src} VERBATIM) add_custom_target (compiz_gsettings_schema DEPENDS ${_top_gschema_dest}) add_gsettings_schema_to_recompilation_list (compiz_gsettings_schema) compiz_install_gsettings_schema (${_top_gschema_dest} ${_top_gschema_inst}) endif (GLIB_COMPILE_SCHEMAS) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) ./compizconfig/gsettings/mocks/0000755000004100000410000000000013246301623017055 5ustar www-datawww-data./compizconfig/gsettings/mocks/CMakeLists.txt0000644000004100000410000000174213246301623021621 0ustar www-datawww-datapkg_check_modules (GLIB glib-2.0) if (GLIB_FOUND) include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/include ${CMAKE_CURRENT_SOURCE_DIR}/../gsettings_backend_shared ${GLIB_INCLUDE_DIRS}) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") add_library (compizconfig_ccs_gsettings_wrapper_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_mock.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_mock.h) add_library (compizconfig_ccs_gsettings_wrapper_factory_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory_mock.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory_mock.h) add_library (compizconfig_ccs_gsettings_backend_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend_mock.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend_mock.h) endif (GLIB_FOUND) ./compizconfig/gsettings/mocks/ccs_gsettings_wrapper_factory_mock.h0000644000004100000410000000607213246301623026372 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory_mock.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_FACTORY_MOCK #define _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_FACTORY_MOCK #include #include #include CCSGSettingsWrapperFactory * ccsMockGSettingsWrapperFactoryNew (); void ccsMockGSettingsWrapperFactoryFree (CCSGSettingsWrapperFactory *); class CCSGSettingsWrapperFactoryMockInterface { public: virtual ~CCSGSettingsWrapperFactoryMockInterface () {} virtual CCSGSettingsWrapper * newGSettingsWrapper (const gchar *schema, CCSObjectAllocationInterface *ai) = 0; virtual CCSGSettingsWrapper * newGSettingsWrapperWithPath (const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai) = 0; }; class CCSGSettingsWrapperFactoryGMock : public CCSGSettingsWrapperFactoryMockInterface { public: CCSGSettingsWrapperFactoryGMock (CCSGSettingsWrapperFactory *wrapper) : mWrapper (wrapper) { } MOCK_METHOD2 (newGSettingsWrapper, CCSGSettingsWrapper * (const gchar *schema, CCSObjectAllocationInterface *ai)); MOCK_METHOD3 (newGSettingsWrapperWithPath, CCSGSettingsWrapper * (const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai)); private: CCSGSettingsWrapperFactory *mWrapper; public: static CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, CCSObjectAllocationInterface *ai) { return reinterpret_cast (ccsObjectGetPrivate (wrapperFactory))->newGSettingsWrapper (schema, ai); } static CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai) { return reinterpret_cast (ccsObjectGetPrivate (wrapperFactory))->newGSettingsWrapperWithPath (schema, path, ai); } static void ccsFreeGSettingsWrapperFactory (CCSGSettingsWrapperFactory *wrapperFactory) { ccsMockGSettingsWrapperFactoryFree (wrapperFactory); } }; #endif ./compizconfig/gsettings/mocks/ccs_gsettings_wrapper_mock.cpp0000644000004100000410000000312113246301623025166 0ustar www-datawww-data#include const CCSGSettingsWrapperInterface mockInterface = { CCSGSettingsWrapperGMock::ccsGSettingsWrapperSetValue, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetValue, CCSGSettingsWrapperGMock::ccsGSettingsWrapperResetKey, CCSGSettingsWrapperGMock::ccsGSettingsWrapperListKeys, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetGSettings, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetSchemaName, CCSGSettingsWrapperGMock::ccsGSettingsWrapperGetPath, CCSGSettingsWrapperGMock::ccsGSettingsWrapperConnectToChangedSignal, CCSGSettingsWrapperGMock::ccsFreeGSettingsWrapper }; CCSGSettingsWrapper * ccsMockGSettingsWrapperNew () { CCSGSettingsWrapper *wrapper = (CCSGSettingsWrapper *) calloc (1, sizeof (CCSGSettingsWrapper)); if (!wrapper) return NULL; CCSGSettingsWrapperGMock *gmockWrapper = new CCSGSettingsWrapperGMock (wrapper); if (!gmockWrapper) { free (wrapper); return NULL; } ccsObjectInit (wrapper, &ccsDefaultObjectAllocator); ccsObjectAddInterface (wrapper, (const CCSInterface *) &mockInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperInterface)); ccsObjectSetPrivate (wrapper, (CCSPrivate *) gmockWrapper); ccsGSettingsWrapperRef (wrapper); return wrapper; } void ccsMockGSettingsWrapperFree (CCSGSettingsWrapper *wrapper) { CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper)); delete gmockWrapper; ccsObjectSetPrivate (wrapper, NULL); ccsObjectFinalize (wrapper); free (wrapper); } ./compizconfig/gsettings/mocks/ccs_gsettings_wrapper_factory_mock.cpp0000644000004100000410000000264313246301623026725 0ustar www-datawww-data#include #include const CCSGSettingsWrapperFactoryInterface mockInterface = { CCSGSettingsWrapperFactoryGMock::ccsGSettingsWrapperFactoryNewGSettingsWrapper, CCSGSettingsWrapperFactoryGMock::ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath, CCSGSettingsWrapperFactoryGMock::ccsFreeGSettingsWrapperFactory }; CCSGSettingsWrapperFactory * ccsMockGSettingsWrapperFactoryNew () { CCSGSettingsWrapperFactory *wrapper = (CCSGSettingsWrapperFactory *) calloc (1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapper) return NULL; CCSGSettingsWrapperFactoryGMock *gmockWrapper = new CCSGSettingsWrapperFactoryGMock (wrapper); if (!gmockWrapper) { free (wrapper); return NULL; } ccsObjectInit (wrapper, &ccsDefaultObjectAllocator); ccsObjectAddInterface (wrapper, (const CCSInterface *) &mockInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapper, (CCSPrivate *) gmockWrapper); ccsGSettingsWrapperFactoryRef (wrapper); return wrapper; } void ccsMockGSettingsWrapperFactoryFree (CCSGSettingsWrapperFactory *wrapper) { CCSGSettingsWrapperFactoryGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper)); delete gmockWrapper; ccsObjectSetPrivate (wrapper, NULL); ccsObjectFinalize (wrapper); free (wrapper); } ./compizconfig/gsettings/mocks/ccs_gsettings_wrapper_mock.h0000644000004100000410000000641613246301623024645 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_MOCK #define _COMPIZCONFIG_CCS_GSETTINGS_WRAPPER_MOCK #include #include #include CCSGSettingsWrapper * ccsMockGSettingsWrapperNew (); void ccsMockGSettingsWrapperFree (CCSGSettingsWrapper *); class CCSGSettingsWrapperMockInterface { public: virtual ~CCSGSettingsWrapperMockInterface () {} virtual void setValue (const char *, GVariant *) = 0; virtual GVariant * getValue (const char *) = 0; virtual void resetKey (const char *) = 0; virtual char ** listKeys () = 0; virtual GSettings * getGSettings () = 0; virtual const char * getSchemaName () = 0; virtual const char * getPath () = 0; virtual void connectToChangedSignal (GCallback, gpointer) = 0; }; class CCSGSettingsWrapperGMock : public CCSGSettingsWrapperMockInterface { public: CCSGSettingsWrapperGMock (CCSGSettingsWrapper *wrapper) : mWrapper (wrapper) { } MOCK_METHOD2 (setValue, void (const char *, GVariant *)); MOCK_METHOD1 (getValue, GVariant * (const char *)); MOCK_METHOD1 (resetKey, void (const char *)); MOCK_METHOD0 (listKeys, char ** ()); MOCK_METHOD0 (getGSettings, GSettings * ()); MOCK_METHOD0 (getSchemaName, const char * ()); MOCK_METHOD0 (getPath, const char * ()); MOCK_METHOD2 (connectToChangedSignal, void (GCallback, gpointer)); private: CCSGSettingsWrapper *mWrapper; public: static void ccsGSettingsWrapperSetValue (CCSGSettingsWrapper *wrapper, const char *key, GVariant *value) { reinterpret_cast (ccsObjectGetPrivate (wrapper))->setValue (key, value); } static GVariant * ccsGSettingsWrapperGetValue (CCSGSettingsWrapper *wrapper, const char *key) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getValue (key); } static void ccsGSettingsWrapperResetKey (CCSGSettingsWrapper *wrapper, const char *key) { reinterpret_cast (ccsObjectGetPrivate (wrapper))->resetKey (key); } static char ** ccsGSettingsWrapperListKeys (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->listKeys (); } static GSettings * ccsGSettingsWrapperGetGSettings (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getGSettings (); } static const char * ccsGSettingsWrapperGetSchemaName (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getSchemaName (); } static const char * ccsGSettingsWrapperGetPath (CCSGSettingsWrapper *wrapper) { return reinterpret_cast (ccsObjectGetPrivate (wrapper))->getPath (); } static void ccsGSettingsWrapperConnectToChangedSignal (CCSGSettingsWrapper *wrapper, GCallback callback, gpointer data) { reinterpret_cast (ccsObjectGetPrivate (wrapper))->connectToChangedSignal (callback, data); } static void ccsFreeGSettingsWrapper (CCSGSettingsWrapper *wrapper) { ccsMockGSettingsWrapperFree (wrapper); } }; #endif ./compizconfig/gsettings/mocks/ccs_gsettings_backend_mock.h0000644000004100000410000001525713246301623024557 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_MOCK #define _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_MOCK #include #include #include #include "ccs_gsettings_backend_interface.h" using ::testing::_; using ::testing::Return; CCSBackend * ccsGSettingsBackendGMockNew (); void ccsGSettingsBackendGMockFree (CCSBackend *backend); class CCSGSettingsBackendGMockInterface { public: virtual ~CCSGSettingsBackendGMockInterface () {} virtual CCSContext * getContext () = 0; virtual void connectToChangedSignal (CCSGSettingsWrapper *) = 0; virtual CCSGSettingsWrapper * getSettingsObjectForPluginWithPath (const char * plugin, const char * path, CCSContext * context) = 0; virtual const char * getCurrentProfile () = 0; virtual GVariant * getExistingProfiles () = 0; virtual void setExistingProfiles (GVariant *) = 0; virtual void setCurrentProfile (const gchar *) = 0; virtual GVariant * getPluginsWithSetKeys () = 0; virtual void clearPluginsWithSetKeys () = 0; virtual void unsetAllChangedPluginKeysInProfile (CCSContext *, GVariant *, const char *) = 0; virtual gboolean updateProfile (CCSContext *) = 0; virtual void updateCurrentProfileName (const char *) = 0; virtual gboolean addProfile (const char *) = 0; virtual CCSIntegratedSetting * getIntegratedSetting (CCSSetting *) = 0; virtual Bool readIntegratedOption (CCSSetting *, CCSIntegratedSetting *) = 0; virtual void writeIntegratedOption (CCSSetting *, CCSIntegratedSetting *) = 0; }; class CCSGSettingsBackendGMock : public CCSGSettingsBackendGMockInterface { public: CCSGSettingsBackendGMock (CCSBackend *backend) : mBackend (backend) { } MOCK_METHOD0 (getContext, CCSContext * ()); MOCK_METHOD1 (connectToChangedSignal, void (CCSGSettingsWrapper *)); MOCK_METHOD3 (getSettingsObjectForPluginWithPath, CCSGSettingsWrapper * (const char * plugin, const char * path, CCSContext * context)); MOCK_METHOD0 (getCurrentProfile, const char * ()); MOCK_METHOD0 (getExistingProfiles, GVariant * ()); MOCK_METHOD1 (setExistingProfiles, void (GVariant *)); MOCK_METHOD1 (setCurrentProfile, void (const gchar *)); MOCK_METHOD0 (getPluginsWithSetKeys, GVariant * ()); MOCK_METHOD0 (clearPluginsWithSetKeys, void ()); MOCK_METHOD3 (unsetAllChangedPluginKeysInProfile, void (CCSContext *, GVariant *, const char *)); MOCK_METHOD1 (updateProfile, gboolean (CCSContext *)); MOCK_METHOD1 (updateCurrentProfileName, void (const char *)); MOCK_METHOD1 (addProfile, gboolean (const char *)); MOCK_METHOD1 (getIntegratedSetting, CCSIntegratedSetting * (CCSSetting *)); MOCK_METHOD2 (readIntegratedOption, Bool (CCSSetting *, CCSIntegratedSetting *)); MOCK_METHOD2 (writeIntegratedOption, void (CCSSetting *, CCSIntegratedSetting *)); CCSBackend * getBackend () { return mBackend; } private: CCSBackend *mBackend; public: static CCSContext * ccsGSettingsBackendGetContext (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getContext (); } static void ccsGSettingsBackendConnectToValueChangedSignal (CCSBackend *backend, CCSGSettingsWrapper *object) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->connectToChangedSignal(object); } static CCSGSettingsWrapper * ccsGSettingsBackendGetSettingsObjectForPluginWithPath (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getSettingsObjectForPluginWithPath (plugin, path, context); } static const char * ccsGSettingsBackendGetCurrentProfile (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getCurrentProfile (); } static GVariant * ccsGSettingsBackendGetExistingProfiles (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getExistingProfiles (); } static void ccsGSettingsBackendSetExistingProfiles (CCSBackend *backend, GVariant *value) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->setExistingProfiles (value); } static void ccsGSettingsBackendSetCurrentProfile (CCSBackend *backend, const gchar *value) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->setCurrentProfile (value); } static GVariant * ccsGSettingsBackendGetPluginsWithSetKeys (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getPluginsWithSetKeys (); } static void ccsGSettingsBackendClearPluginsWithSetKeys (CCSBackend *backend) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->clearPluginsWithSetKeys (); } static void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (CCSBackend *backend, CCSContext *context, GVariant *pluginKeys, const char *profile) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->unsetAllChangedPluginKeysInProfile (context, pluginKeys, profile); } static gboolean ccsGSettingsBackendUpdateProfile (CCSBackend *backend, CCSContext *context) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->updateProfile (context); } static void ccsGSettingsBackendUpdateCurrentProfileName (CCSBackend *backend, const char *profile) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->updateCurrentProfileName (profile); } static gboolean ccsGSettingsBackendAddProfile (CCSBackend *backend, const char *profile) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->addProfile (profile); } static CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedSetting (CCSBackend *backend, CCSSetting *setting) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->getIntegratedSetting (setting); } static Bool ccsGSettingsBackendReadIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { return (reinterpret_cast (ccsObjectGetPrivate (backend)))->readIntegratedOption (setting, integrated); } static void ccsGSettingsBackendWriteIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { (reinterpret_cast (ccsObjectGetPrivate (backend)))->writeIntegratedOption (setting, integrated); } }; #endif ./compizconfig/gsettings/mocks/ccs_gsettings_backend_mock.cpp0000644000004100000410000000424413246301623025104 0ustar www-datawww-data#include #include #include #include "ccs_gsettings_backend_mock.h" CCSGSettingsBackendInterface ccsGSettingsBackendGMockInterface = { CCSGSettingsBackendGMock::ccsGSettingsBackendGetContext, CCSGSettingsBackendGMock::ccsGSettingsBackendConnectToValueChangedSignal, CCSGSettingsBackendGMock::ccsGSettingsBackendGetSettingsObjectForPluginWithPath, CCSGSettingsBackendGMock::ccsGSettingsBackendGetCurrentProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendGetExistingProfiles, CCSGSettingsBackendGMock::ccsGSettingsBackendSetExistingProfiles, CCSGSettingsBackendGMock::ccsGSettingsBackendSetCurrentProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendGetPluginsWithSetKeys, CCSGSettingsBackendGMock::ccsGSettingsBackendClearPluginsWithSetKeys, CCSGSettingsBackendGMock::ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendUpdateProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendUpdateCurrentProfileName, CCSGSettingsBackendGMock::ccsGSettingsBackendAddProfile, CCSGSettingsBackendGMock::ccsGSettingsBackendGetIntegratedSetting, CCSGSettingsBackendGMock::ccsGSettingsBackendReadIntegratedOption, CCSGSettingsBackendGMock::ccsGSettingsBackendWriteIntegratedOption }; CCSBackend * ccsGSettingsBackendGMockNew () { CCSBackend *backend = (CCSBackend *) calloc (1, sizeof (CCSBackend)); if (!backend) return NULL; CCSGSettingsBackendGMock *gmock = new CCSGSettingsBackendGMock (backend); if (!gmock) { free (backend); return NULL; } ccsObjectInit (backend, &ccsDefaultObjectAllocator); ccsObjectAddInterface (backend, (const CCSInterface *) &ccsGSettingsBackendGMockInterface, GET_INTERFACE_TYPE (CCSGSettingsBackendInterface)); ccsObjectSetPrivate (backend, reinterpret_cast (gmock)); return backend; } void ccsGSettingsBackendGMockFree (CCSBackend *backend) { CCSGSettingsBackendGMock *mock = reinterpret_cast (ccsObjectGetPrivate (backend)); delete mock; ccsObjectSetPrivate (backend, NULL); ccsObjectFinalize (backend); free (backend); } ./compizconfig/gsettings/INSTALL0000644000004100000410000002243213246301623016775 0ustar www-datawww-dataInstallation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ./compizconfig/gsettings/README0000644000004100000410000000000013246301623016607 0ustar www-datawww-data./compizconfig/gsettings/COPYING0000644000004100000410000004312213246301623016776 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ./compizconfig/gsettings/src/0000755000004100000410000000000013246301623016530 5ustar www-datawww-data./compizconfig/gsettings/src/gsettings.h0000644000004100000410000000233213246301623020710 0ustar www-datawww-data/** * * GSettings libccs backend * * gsettings.h * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _COMPIZCONFIG_BACKEND_GSETTINGS_GSETTINGS_H #define _COMPIZCONFIG_BACKEND_GSETTINGS_GSETTINGS_H #include #include #include #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #endif ./compizconfig/gsettings/src/gsettings.c0000644000004100000410000003320713246301623020710 0ustar www-datawww-data/** * * GSettings libccs backend * * gsettings.c * * Copyright (c) 2011 Canonical Ltd * * Based on the original compizconfig-backend-gconf * * Copyright (c) 2007 Danny Baumann * * Parts of this code are taken from libberylsettings * gconf backend, written by: * * Copyright (c) 2006 Robert Carr * Copyright (c) 2007 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #define CCS_LOG_DOMAIN "gsettings" #include "gsettings.h" #include "gsettings_shared.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_backend.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gnome_integration_gsettings_wrapper_factory.h" #include "ccs_gnome_integration_gsettings_integrated_setting_factory.h" #include "ccs_gnome_integration.h" GVariant * getVariantForCCSSetting (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *settings = getSettingsObjectForCCSSetting (backend, setting); if (!settings) return NULL; char *cleanSettingName = getNameForCCSSetting (setting); gchar *pathName = makeSettingPath (ccsGSettingsBackendGetCurrentProfile (backend), setting); GVariant *gsettingsValue = getVariantAtKey (settings, cleanSettingName, pathName, ccsSettingGetType (setting)); free (cleanSettingName); g_free (pathName); return gsettingsValue; } static Bool readIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { return ccsGSettingsBackendReadIntegratedOption (backend, setting, integrated); } Bool readOption (CCSBackend *backend, CCSSetting * setting) { Bool ret = FALSE; GVariant *gsettingsValue = NULL; /* It is impossible for certain settings to have a schema, * such as actions and read only settings, so in that case * just return FALSE since compizconfig doesn't expect us * to read them anyways */ if (!ccsSettingIsReadableByBackend (setting)) return FALSE; gsettingsValue = getVariantForCCSSetting (backend, setting); if (!gsettingsValue) return FALSE; switch (ccsSettingGetType (setting)) { case TypeString: { const char *value; value = readStringFromVariant (gsettingsValue); if (value) { ccsSetString (setting, value, TRUE); ret = TRUE; } } break; case TypeMatch: { const char * value; value = readStringFromVariant (gsettingsValue); if (value) { ccsSetMatch (setting, value, TRUE); ret = TRUE; } } break; case TypeInt: { int value; value = readIntFromVariant (gsettingsValue); ccsSetInt (setting, value, TRUE); ret = TRUE; } break; case TypeBool: { Bool value; value = readBoolFromVariant (gsettingsValue); ccsSetBool (setting, value, TRUE); ret = TRUE; } break; case TypeFloat: { float value; value = readFloatFromVariant (gsettingsValue); ccsSetFloat (setting, value, TRUE); ret = TRUE; } break; case TypeColor: { Bool success = FALSE; CCSSettingColorValue color = readColorFromVariant (gsettingsValue, &success); if (success) { ccsSetColor (setting, color, TRUE); ret = TRUE; } } break; case TypeKey: { Bool success = FALSE; CCSSettingKeyValue key = readKeyFromVariant (gsettingsValue, &success); if (success) { ccsSetKey (setting, key, TRUE); ret = TRUE; } } break; case TypeButton: { Bool success = FALSE; CCSSettingButtonValue button = readButtonFromVariant (gsettingsValue, &success); if (success) { ccsSetButton (setting, button, TRUE); ret = TRUE; } } break; case TypeEdge: { unsigned int edges = readEdgeFromVariant (gsettingsValue); ccsSetEdge (setting, edges, TRUE); ret = TRUE; } break; case TypeBell: { Bool value; value = readBoolFromVariant (gsettingsValue); ccsSetBell (setting, value, TRUE); ret = TRUE; } break; case TypeList: { CCSSettingValueList list = readListValue (gsettingsValue, setting, &ccsDefaultObjectAllocator); if (list) { CCSSettingValueList iter = list; while (iter) { ((CCSSettingValue *) iter->data)->parent = setting; iter = iter->next; } ccsSetList (setting, list, TRUE); ccsSettingValueListFree (list, TRUE); ret = TRUE; } } break; default: ccsWarning ("Attempt to read unsupported setting type %d!", ccsSettingGetType (setting)); break; } g_variant_unref (gsettingsValue); return ret; } static void writeIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { ccsGSettingsBackendWriteIntegratedOption (backend, setting, integrated); } void writeOption (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *settings = getSettingsObjectForCCSSetting (backend, setting); char *cleanSettingName = translateKeyForGSettings (ccsSettingGetName (setting)); GVariant *gsettingsValue = NULL; Bool success = FALSE; switch (ccsSettingGetType (setting)) { case TypeString: { const char *value; if (ccsGetString (setting, &value)) { success = writeStringToVariant (value, &gsettingsValue); } } break; case TypeMatch: { const char *value; if (ccsGetMatch (setting, &value)) { success = writeStringToVariant (value, &gsettingsValue); } } break; case TypeFloat: { float value; if (ccsGetFloat (setting, &value)) { success = writeFloatToVariant (value, &gsettingsValue); } } break; case TypeInt: { int value; if (ccsGetInt (setting, &value)) { success = writeIntToVariant (value, &gsettingsValue); } } break; case TypeBool: { Bool value; if (ccsGetBool (setting, &value)) { success = writeBoolToVariant (value, &gsettingsValue); } } break; case TypeColor: { CCSSettingColorValue value; if (!ccsGetColor (setting, &value)) break; success = writeColorToVariant (value, &gsettingsValue); } break; case TypeKey: { CCSSettingKeyValue key; if (!ccsGetKey (setting, &key)) break; success = writeKeyToVariant (key, &gsettingsValue); } break; case TypeButton: { CCSSettingButtonValue button; if (!ccsGetButton (setting, &button)) break; success = writeButtonToVariant (button, &gsettingsValue); } break; case TypeEdge: { unsigned int edges; if (!ccsGetEdge (setting, &edges)) break; success = writeEdgeToVariant (edges, &gsettingsValue); } break; case TypeBell: { Bool value; if (ccsGetBell (setting, &value)) { success = writeBoolToVariant (value, &gsettingsValue); } } break; case TypeList: { CCSSettingValueList list = NULL; if (!ccsGetList (setting, &list)) return; success = writeListValue (list, ccsSettingGetInfo (setting)->forList.listType, &gsettingsValue); } break; default: ccsWarning ("Attempt to write unsupported setting type %d", ccsSettingGetType (setting)); break; } if (success && gsettingsValue) { /* g_settings_set_value will consume the reference * so there is no need to unref value here */ writeVariantToKey (settings, cleanSettingName, gsettingsValue); } free (cleanSettingName); } Bool readInit (CCSBackend *backend, CCSContext * context) { return ccsGSettingsBackendUpdateProfile (backend, context); } void readSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { Bool status; CCSIntegratedSetting *integrated = ccsGSettingsBackendGetIntegratedSetting (backend, setting); if (ccsGetIntegrationEnabled (context) && integrated) { status = readIntegratedOption (backend, setting, integrated); } else status = readOption (backend, setting); if (!status) ccsResetToDefault (setting, TRUE); } Bool writeInit (CCSBackend *backend, CCSContext * context) { return ccsGSettingsBackendUpdateProfile (backend, context); } void writeSetting (CCSBackend *backend, CCSContext *context, CCSSetting *setting) { CCSIntegratedSetting *integrated = ccsGSettingsBackendGetIntegratedSetting (backend, setting); if (ccsGetIntegrationEnabled (context) && integrated) { writeIntegratedOption (backend, setting, integrated); } else if (ccsSettingGetIsDefault (setting)) { resetOptionToDefault (backend, setting); } else writeOption (backend, setting); } static void updateSetting (CCSBackend *backend, CCSContext *context, CCSPlugin *plugin, CCSSetting *setting) { Bool status; CCSIntegratedSetting *integrated = ccsGSettingsBackendGetIntegratedSetting (backend, setting); if (ccsGetIntegrationEnabled (context) && integrated) { status = readIntegratedOption (backend, setting, integrated); } else status = readOption (backend, setting); if (!status) ccsResetToDefault (setting, TRUE); if (ccsGetIntegrationEnabled (context) && integrated) { ccsBackendWriteInit (backend, context); ccsGSettingsBackendWriteIntegratedOption (backend, setting, integrated); } } static void processEvents (CCSBackend *backend, unsigned int flags) { if (!(flags & ProcessEventsNoGlibMainLoopMask)) { while (g_main_context_pending(NULL)) g_main_context_iteration(NULL, FALSE); } } static char * getCurrentProfileName (CCSGSettingsWrapper *compizconfigSettings) { GVariant *value; char *ret = NULL; value = ccsGSettingsWrapperGetValue (compizconfigSettings, "current-profile"); if (value) ret = strdup (g_variant_get_string (value, NULL)); else ret = strdup (DEFAULTPROF); g_variant_unref (value); return ret; } static Bool initBackend (CCSBackend *backend, CCSContext * context) { g_type_init (); CCSGSettingsWrapper *compizconfigSettings = ccsGSettingsWrapperNewForSchema (COMPIZCONFIG_SCHEMA_ID, backend->object.object_allocation); char *currentProfile = getCurrentProfileName (compizconfigSettings); char *currentProfilePath = makeCompizProfilePath (currentProfile); CCSGSettingsWrapper *currentProfileSettings = ccsGSettingsWrapperNewForSchemaWithPath (PROFILE_SCHEMA_ID, currentProfilePath, backend->object.object_allocation); CCSGNOMEValueChangeData *valueChangeData = calloc (1, sizeof (CCSGNOMEValueChangeData)); CCSGSettingsWrapperFactory *wrapperFactory = ccsGSettingsWrapperFactoryDefaultImplNew (backend->object.object_allocation); CCSGSettingsWrapperFactory *gnomeWrapperFactory = ccsGNOMEIntegrationGSettingsWrapperFactoryDefaultImplNew (backend->object.object_allocation, wrapperFactory, ccsGSettingsIntegratedSettingsChangeCallback (), valueChangeData); CCSIntegratedSettingsStorage *storage = ccsIntegratedSettingsStorageDefaultImplNew (backend->object.object_allocation); valueChangeData->storage = storage; valueChangeData->context = context; CCSIntegratedSettingFactory *factory = ccsGSettingsIntegratedSettingFactoryNew (gnomeWrapperFactory, valueChangeData, backend->object.object_allocation); valueChangeData->factory = factory; CCSIntegration *integration = ccsGNOMEIntegrationBackendNew (backend, context, factory, storage, backend->object.object_allocation); valueChangeData->integration = integration; g_free (currentProfilePath); /* Drop our reference to the wrapper factory */ ccsGSettingsWrapperFactoryUnref (gnomeWrapperFactory); return ccsGSettingsBackendAttachNewToBackend (backend, context, compizconfigSettings, currentProfileSettings, wrapperFactory, integration, valueChangeData, currentProfile); } static Bool finiBackend (CCSBackend *backend) { ccsGSettingsBackendDetachFromBackend (backend); return TRUE; } static Bool getSettingIsIntegrated (CCSBackend *backend, CCSSetting * setting) { if (!ccsGetIntegrationEnabled (ccsPluginGetContext (ccsSettingGetParent (setting)))) return FALSE; if (!ccsGSettingsBackendGetIntegratedSetting (backend, setting)) return FALSE; return TRUE; } static Bool getSettingIsReadOnly (CCSBackend *backend, CCSSetting * setting) { /* FIXME */ return FALSE; } static const CCSBackendInfo * getInfo (CCSBackend *backend) { return &gsettingsBackendInfo; } static Bool ccsGSettingsWrapDeleteProfile (CCSBackend *backend, CCSContext *context, char *profile) { return deleteProfile (backend, context, profile); } static CCSBackendInterface gsettingsVTable = { getInfo, processEvents, initBackend, finiBackend, readInit, readSetting, 0, writeInit, writeSetting, 0, updateSetting, getSettingIsIntegrated, getSettingIsReadOnly, ccsGSettingsGetExistingProfiles, ccsGSettingsWrapDeleteProfile, ccsGSettingsSetIntegration }; CCSBackendInterface * getBackendInfo (void) { return &gsettingsVTable; } ./compizconfig/gsettings/org.compiz.gschema.xml0000644000004100000410000000145413246301623022164 0ustar www-datawww-data 'Default' Current Profile Describes the current profile ['Default'] Existing Profiles Profiles available for the GSettings backend to use [] Plugins with set keys Plugins which have set keys ./compizconfig/gsettings/tests/0000755000004100000410000000000013246301624017104 5ustar www-datawww-data./compizconfig/gsettings/tests/CMakeLists.txt0000644000004100000410000000753113246301623021651 0ustar www-datawww-datainclude (FindPkgConfig) include (CompizGSettings) include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../mocks ${CMAKE_CURRENT_SOURCE_DIR}/../testenvironments ${CMAKE_CURRENT_SOURCE_DIR}/../src ${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/src ${CMAKE_CURRENT_SOURCE_DIR}/../../libcompizconfig/tests ${CMAKE_CURRENT_SOURCE_DIR}/../../mocks/libcompizconfig ${CMAKE_CURRENT_SOURCE_DIR}/../../tests ${CMAKE_SOURCE_DIR}/tests/shared ${CMAKE_SOURCE_DIR}/tests/shared/glib) pkg_check_modules (COMPIZCONFIG_TEST_GSETTINGS gio-2.0 glib-2.0) if (COMPIZCONFIG_TEST_GSETTINGS_FOUND) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") link_directories (${CMAKE_CURRENT_BINARY_DIR}/../../libcompizconfig/tests) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../testenvironments) link_directories (${CMAKE_CURRENT_BINARY_DIR}/../mocks) add_library (compizconfig_gsettings_settings_test_env STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig_ccs_gsettings_settings_env_test.cpp) add_executable (compizconfig_test_gsettings ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_wrapper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_tests.h) add_executable (compizconfig_test_gsettings_conformance ${CMAKE_CURRENT_SOURCE_DIR}/test_gsettings_conformance.cpp) target_link_libraries (compizconfig_test_gsettings compizconfig_gsettings_backend compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_context_mock compizconfig_ccs_integration_mock compizconfig_ccs_gsettings_backend_mock compizconfig_ccs_gsettings_wrapper_mock compizconfig_ccs_gsettings_wrapper_factory_mock compizconfig_ccs_test_value_combinations ${COMPIZCONFIG_TEST_GSETTINGS_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY}) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/gsettings-mock-schemas-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/gsettings-mock-schemas-config.h) add_custom_command (OUTPUT ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.mock.gschema.xml COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/org.compiz.mock.gschema.xml ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.mock.gschema.xml DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/org.compiz.mock.gschema.xml VERBATIM) add_custom_target (compiz_gsettings_mock_schema ALL DEPENDS ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.mock.gschema.xml) add_gsettings_schema_to_recompilation_list (compiz_gsettings_mock_schema) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/backend-conformance-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/backend-conformance-config.h) target_link_libraries (compizconfig_test_gsettings_conformance compizconfig_gsettings_settings_test_env compizconfig_gsettings_backend compizconfig_ccs_setting_mock compizconfig_ccs_plugin_mock compizconfig_ccs_context_mock compizconfig_ccs_item_in_list_matcher compizconfig_ccs_list_equality compizconfig_ccs_list_wrapper compizconfig_ccs_backend_conformance_test compizconfig_ccs_setting_value_operators compizconfig_ccs_test_value_combinations compizconfig_ccs_integration_mock compizconfig ${COMPIZCONFIG_TEST_GSETTINGS_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compizconfig_test_gsettings COVERAGE compizconfig_gsettings_backend) compiz_discover_tests (compizconfig_test_gsettings_conformance COVERAGE compizconfig_gsettings_backend gsettings) endif (COMPIZCONFIG_TEST_GSETTINGS_FOUND) ./compizconfig/gsettings/tests/test_gsettings_wrapper.cpp0000644000004100000410000002016713246301623024423 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include #include #include #include "test_gsettings_tests.h" using ::testing::NotNull; using ::testing::IsNull; using ::testing::Eq; using ::testing::_; class CCSGSettingsWrapperTest : public CCSGSettingsTestWithMemoryBackend { public: CCSGSettingsWrapperTest () : mockSchema ("org.compiz.mock"), mockPath ("/org/compiz/mock/mock/") { } virtual CCSObjectAllocationInterface * GetAllocator () = 0; virtual void SetUp () { CCSGSettingsTestWithMemoryBackend::SetUp (); } virtual void TearDown () { CCSGSettingsTestWithMemoryBackend::TearDown (); } protected: std::string mockSchema; std::string mockPath; boost::shared_ptr wrapper; GSettings *settings; }; class CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest : public CCSGSettingsWrapperTest { protected: CCSObjectAllocationInterface * GetAllocator () { return &ccsDefaultObjectAllocator; } }; class CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest : public CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest { public: virtual void SetUp () { CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest::SetUp (); wrapper.reset (ccsGSettingsWrapperNewForSchemaWithPath (mockSchema.c_str (), mockPath.c_str (), GetAllocator ()), boost::bind (ccsFreeGSettingsWrapper, _1)); ASSERT_THAT (wrapper.get (), NotNull ()); settings = ccsGSettingsWrapperGetGSettings (wrapper.get ()); ASSERT_THAT (settings, NotNull ()); } }; TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstructionWithBadSchemaReturnsNull) { const std::string badSchema ("org.compiz.invalid"); EXPECT_THAT (ccsGSettingsWrapperNewForSchemaWithPath (badSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), IsNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstructionWithPathForNonrelocableSchemaNull) { const std::string badSchema ("org.compiz"); EXPECT_THAT (ccsGSettingsWrapperNewForSchemaWithPath (badSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), IsNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstruction) { const std::string nonrelocatableSchema ("org.compiz"); boost::shared_ptr wrapper (ccsGSettingsWrapperNewForSchema (nonrelocatableSchema.c_str (), &ccsDefaultObjectAllocator), boost::bind (ccsFreeGSettingsWrapper, _1)); EXPECT_THAT (wrapper.get (), NotNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestWrapperConstructionWithPath) { boost::shared_ptr wrapper (ccsGSettingsWrapperNewForSchemaWithPath (mockSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), boost::bind (ccsFreeGSettingsWrapper, _1)); EXPECT_THAT (wrapper.get (), NotNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorTest, TestGetGSettingsWrapper) { boost::shared_ptr wrapper (ccsGSettingsWrapperNewForSchemaWithPath (mockSchema.c_str (), mockPath.c_str (), &ccsDefaultObjectAllocator), boost::bind (ccsFreeGSettingsWrapper, _1)); ASSERT_THAT (wrapper.get (), NotNull ()); EXPECT_THAT (ccsGSettingsWrapperGetGSettings (wrapper.get ()), NotNull ()); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestSetValueOnWrapper) { const unsigned int VALUE = 2; const std::string KEY ("integer-setting"); boost::shared_ptr variant (g_variant_new ("i", VALUE, NULL), boost::bind (g_variant_unref, _1)); ccsGSettingsWrapperSetValue (wrapper.get (), KEY.c_str (), variant.get ()); boost::shared_ptr value (g_settings_get_value (settings, KEY.c_str ()), boost::bind (g_variant_unref, _1)); int v = g_variant_get_int32 (value.get ()); EXPECT_EQ (VALUE, v); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestGetValueOnWrapper) { const double VALUE = 3.0; const std::string KEY ("float-setting"); boost::shared_ptr variant (g_variant_new ("d", VALUE, NULL), boost::bind (g_variant_unref, _1)); g_settings_set_value (settings, KEY.c_str (), variant.get ()); boost::shared_ptr value (ccsGSettingsWrapperGetValue (wrapper.get (), KEY.c_str ()), boost::bind (g_variant_unref, _1)); double v = (double) g_variant_get_double (value.get ()); EXPECT_EQ (VALUE, v); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestResetKeyOnWrapper) { const char * DEFAULT = ""; const char * VALUE = "foo"; const std::string KEY ("string-setting"); GVariant *variant = g_variant_new ("s", VALUE); ccsGSettingsWrapperSetValue (wrapper.get (), KEY.c_str (), variant); boost::shared_ptr value (g_settings_get_value (settings, KEY.c_str ()), boost::bind (g_variant_unref, _1)); gsize length; std::string v (g_variant_get_string (value.get (), &length)); ASSERT_EQ (strlen (VALUE), length); ASSERT_THAT (v, Eq (VALUE)); ccsGSettingsWrapperResetKey (wrapper.get (), KEY.c_str ()); value.reset (g_settings_get_value (settings, KEY.c_str ()), boost::bind (g_variant_unref, _1)); v = std::string (g_variant_get_string (value.get (), &length)); ASSERT_EQ (strlen (DEFAULT), length); ASSERT_THAT (v, Eq (DEFAULT)); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestListKeysOnWrapper) { const char * EXPECTED_KEYS[] = { "bell-setting", "bool-list-setting", "boolean-setting", "button-setting", "color-list-setting", "color-setting", "edge-setting", "float-list-setting", "float-setting", "int-list-setting", "integer-setting", "key-setting", "match-list-setting", "match-setting", "string-list-setting", "string-setting" }; boost::shared_ptr keys (ccsGSettingsWrapperListKeys (wrapper.get ()), boost::bind (g_strfreev, _1)); ASSERT_EQ (g_strv_length (keys.get ()), sizeof (EXPECTED_KEYS) / sizeof (EXPECTED_KEYS[0])); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestGetSchemaName) { EXPECT_THAT (ccsGSettingsWrapperGetSchemaName (wrapper.get ()), Eq (mockSchema)); } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestGetPath) { EXPECT_THAT (ccsGSettingsWrapperGetPath (wrapper.get ()), Eq (mockPath)); } namespace signal_test { class VerificationInterface { public: virtual ~VerificationInterface () {} virtual void Verify (GSettings *settings, gchar *keyname) = 0; }; class VerificationMock : public VerificationInterface { public: MOCK_METHOD2 (Verify, void (GSettings *settings, gchar *keyname)); }; void dummyChangedSignal (GSettings *s, gchar *keyName, gpointer user_data) { VerificationInterface *verifier = reinterpret_cast (user_data); verifier->Verify (s, keyName); } } TEST_F (CCSGSettingsWrapperWithMemoryBackendEnvGoodAllocatorAutoInitTest, TestConnectToChangedSignal) { std::string keyname ("int-setting"); signal_test::VerificationMock mv; /* We're not able to verify the keyname * at the moment, need a person who knows * GSignal better than I do to figure this * one out */ EXPECT_CALL (mv, Verify (settings, _)); ccsGSettingsWrapperConnectToChangedSignal (wrapper.get (), (GCallback) signal_test::dummyChangedSignal, (gpointer) static_cast (&mv)); g_signal_emit_by_name (G_OBJECT (settings), "changed", settings, keyname.c_str (), NULL); } ./compizconfig/gsettings/tests/compizconfig_ccs_gsettings_settings_env_test.cpp0000644000004100000410000002432613246301623031053 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include "test_gsettings_tests.h" #include #include #include "compizconfig_ccs_gsettings_settings_env_test.h" #include "backend-conformance-config.h" #include "gsettings-mock-schemas-config.h" namespace cci = compiz::config::impl; namespace cct = compizconfig::test; class PrivateCCSGSettingsStorageEnv { public: PrivateCCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName); CCSGSettingsWrapper *mSettings; std::string profileName; }; void CCSGSettingsStorageEnv::WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeBoolToVariant (cct::boolToBool (boost::get (value)), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeIntToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeFloatToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeStringToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeColorToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeKeyToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeButtonToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeEdgeToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeStringToVariant (boost::get (value), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; if (writeBoolToVariant (cct::boolToBool (boost::get (value)), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } void CCSGSettingsStorageEnv::WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { GVariant *variant = NULL; const cci::SettingValueListWrapper::Ptr &lw (boost::get (value)); if (writeListValue (*lw, lw->type (), &variant)) writeVariantToKey (priv->mSettings, CharacterWrapper (translateKeyForGSettings (key.c_str ())), variant); else throw std::exception (); } Bool CCSGSettingsStorageEnv::ReadBoolAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeBool)); return readBoolFromVariant (variant.get ()); } int CCSGSettingsStorageEnv::ReadIntegerAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeInt)); return readIntFromVariant (variant.get ()); } float CCSGSettingsStorageEnv::ReadFloatAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeFloat)); return readFloatFromVariant (variant.get ()); } const char * CCSGSettingsStorageEnv::ReadStringAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeString)); return readStringFromVariant (variant.get ()); } CCSSettingColorValue CCSGSettingsStorageEnv::ReadColorAtKey (const std::string &plugin, const std::string &key) { Bool success = FALSE; GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeColor)); CCSSettingColorValue value = readColorFromVariant (variant.get (), &success); EXPECT_TRUE (success); return value; } CCSSettingKeyValue CCSGSettingsStorageEnv::ReadKeyAtKey (const std::string &plugin, const std::string &key) { Bool success = FALSE; GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeKey)); CCSSettingKeyValue value = readKeyFromVariant (variant.get (), &success); EXPECT_TRUE (success); return value; } CCSSettingButtonValue CCSGSettingsStorageEnv::ReadButtonAtKey (const std::string &plugin, const std::string &key) { Bool success = FALSE; GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeButton)); CCSSettingButtonValue value = readButtonFromVariant (variant.get (), &success); EXPECT_TRUE (success); return value; } unsigned int CCSGSettingsStorageEnv::ReadEdgeAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeEdge)); return readEdgeFromVariant (variant.get ()); } const char * CCSGSettingsStorageEnv::ReadMatchAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeMatch)); return readStringFromVariant (variant.get ()); } Bool CCSGSettingsStorageEnv::ReadBellAtKey (const std::string &plugin, const std::string &key) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeBell)); return readBoolFromVariant (variant.get ()); } CCSSettingValueList CCSGSettingsStorageEnv::ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { GVariantShared variant (ReadVariantAtKeyToShared (plugin, key, TypeList)); return readListValue (variant.get (), setting, &ccsDefaultObjectAllocator); } GVariantShared CCSGSettingsStorageEnv::ReadVariantAtKeyToShared (const std::string &plugin, const std::string &key, CCSSettingType type) { CharacterWrapper translatedKey (translateKeyForGSettings (key.c_str ())); CharacterWrapper pluginPath (makeCompizPluginPath (priv->profileName.c_str (), plugin.c_str ())); GVariant *rawVariant = getVariantAtKey (priv->mSettings, translatedKey, pluginPath, type); GVariantShared shared (AutoDestroy (rawVariant, g_variant_unref)); return shared; } PrivateCCSGSettingsStorageEnv::PrivateCCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName) : mSettings (settings), profileName (profileName) { } CCSGSettingsStorageEnv::CCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName) : priv (new PrivateCCSGSettingsStorageEnv (settings, profileName)) { } ./compizconfig/gsettings/tests/test_gsettings_tests.h0000644000004100000410000000650713246301623023554 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_TEST_GSETTINGS_TESTS_H #define _COMPIZCONFIG_TEST_GSETTINGS_TESTS_H #include #include #include #include #include #include using ::testing::TestWithParam; class CCSGSettingsTeardownSetupInterface { public: virtual ~CCSGSettingsTeardownSetupInterface () {} virtual void SetUp () = 0; virtual void TearDown () = 0; }; class CCSGSettingsTestingEnv { public: virtual ~CCSGSettingsTestingEnv () {} virtual void SetUpEnv () { gsliceEnv.SetUpEnv (); g_type_init (); } virtual void TearDownEnv () { gsliceEnv.TearDownEnv (); } private: CompizGLibGSliceOffEnv gsliceEnv; }; class CCSGSettingsMemoryBackendTestingEnv : public CCSGSettingsTestingEnv { public: virtual ~CCSGSettingsMemoryBackendTestingEnv () {} virtual void SetUpEnv () { CCSGSettingsTestingEnv::SetUpEnv (); gsettingsEnv.SetUpEnv (MOCK_PATH); } virtual void TearDownEnv () { gsettingsEnv.TearDownEnv (); CCSGSettingsTestingEnv::TearDownEnv (); } private: CompizGLibGSettingsMemoryBackendTestingEnv gsettingsEnv; }; class CCSGSettingsTestCommon : public ::testing::Test { public: virtual void SetUp () { env.SetUpEnv (); } virtual void TearDown () { env.TearDownEnv (); } private: CompizGLibGSliceOffEnv env; }; class CCSGSettingsTest : public CCSGSettingsTestCommon, public ::testing::WithParamInterface { public: CCSGSettingsTest () : mFuncs (GetParam ()) { } virtual void SetUp () { CCSGSettingsTestCommon::SetUp (); mFuncs->SetUp (); } virtual void TearDown () { CCSGSettingsTestCommon::TearDown (); mFuncs->TearDown (); } private: CCSGSettingsTeardownSetupInterface *mFuncs; }; class CCSGSettingsTestIndependent : public CCSGSettingsTestCommon { public: virtual void SetUp () { CCSGSettingsTestCommon::SetUp (); g_type_init (); } virtual void TearDown () { CCSGSettingsTestCommon::TearDown (); } }; class CCSGSettingsTestWithMemoryBackend : public CCSGSettingsTestIndependent { public: virtual void SetUp () { CCSGSettingsTestIndependent::SetUp (); env.SetUpEnv (MOCK_PATH); } virtual void TearDown () { env.TearDownEnv (); } private: CompizGLibGSettingsMemoryBackendTestingEnv env; }; #endif ./compizconfig/gsettings/tests/org.compiz.mock.gschema.xml0000644000004100000410000000263513246301623024260 0ustar www-datawww-data 0 false 0.0 "" "" false "" "" "" "" [0] [0.0] [true] [""] [""] [""] ./compizconfig/gsettings/tests/gsettings-mock-schemas-config.h.in0000644000004100000410000000050313246301623025501 0ustar www-datawww-data#ifndef _COMPIZCONFIG_GSETTINGS_MOCK_SCHEMAS_CONFIG_H #define _COMPIZCONFIG_GSETTINGS_MOCK_SCHEMAS_CONFIG_H #define MOCK_SCHEMA_PATH "@CMAKE_BINARY_DIR@/generated/glib-2.0/schemas" #include namespace { const std::string MOCK_SCHEMA ("org.compiz.mock"); const std::string MOCK_PATH (MOCK_SCHEMA_PATH); } #endif ./compizconfig/gsettings/tests/gsettings_settings_test_fixture.h0000644000004100000410000000207513246301623026014 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_GSETTINGS_SETTINGS_TEST_FIXTURE_H #define _COMPIZCONFIG_GSETTINGS_SETTINGS_TEST_FIXTURE_H #include #include #endif ./compizconfig/gsettings/tests/test_gsettings_conformance.cpp0000644000004100000410000003420613246301623025234 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include "backend-conformance-config.h" #include "gsettings-mock-schemas-config.h" #include #include #include #include #include #include #include "gtest_shared_autodestroy.h" #include "test_gsettings_tests.h" #include "compizconfig_ccs_gsettings_settings_env_test.h" #include "compizconfig_ccs_integration_mock.h" using ::testing::AtLeast; using ::testing::Pointee; using ::testing::ReturnNull; namespace cci = compiz::config::impl; class CCSGSettingsBackendEnv : public CCSBackendConceptTestEnvironmentInterface, public CCSGSettingsMemoryBackendTestingEnv { private: virtual void SetUp () { } virtual void TearDown () { } public: CCSGSettingsBackendEnv () : mLoader (AutoDestroy (ccsSharedLibBackendLoaderNew (&ccsDefaultObjectAllocator), ccsBackendLoaderUnref)), pluginToMatch ("mock") { } /* A wrapper to prevent signals from being added */ static void connectToSignalWrapper (CCSBackend *backend, CCSGSettingsWrapper *wrapper) { }; const CCSBackendInfo * GetInfo () { return &gsettingsBackendInfo; } CCSBackend * BackendSetUp (CCSContext *context, CCSContextGMock *gmockContext) { CCSGSettingsBackendInterface *overloadedInterface = NULL; SetUpEnv (); g_setenv ("LIBCOMPIZCONFIG_BACKEND_PATH", BACKEND_BINARY_PATH, true); mContext = context; std::string path ("gsettings"); mBackend = reinterpret_cast (ccsBackendLoaderLoadBackend (mLoader.get (), &ccsDefaultInterfaceTable, mContext, path.c_str ())); EXPECT_TRUE (mBackend); mGSettingsBackend = ccsDynamicBackendGetRawBackend (mBackend); CCSBackendInitFunc backendInit = (GET_INTERFACE (CCSBackendInterface, mBackend))->backendInit; if (backendInit) (*backendInit) ((CCSBackend *) mBackend, mContext); /* Set the new integration, drop our reference on it */ CCSIntegration *integration = ccsMockIntegrationBackendNew (&ccsDefaultObjectAllocator); CCSIntegrationGMock *gmockIntegration = reinterpret_cast (ccsObjectGetPrivate (integration)); EXPECT_CALL (*gmockIntegration, getIntegratedOptionIndex (_, _)).WillRepeatedly (ReturnNull ()); ccsBackendSetIntegration ((CCSBackend *) mBackend, integration); ccsIntegrationUnref (integration); overloadedInterface = GET_INTERFACE (CCSGSettingsBackendInterface, mGSettingsBackend); overloadedInterface->gsettingsBackendConnectToChangedSignal = CCSGSettingsBackendEnv::connectToSignalWrapper; mSettings = ccsGSettingsGetSettingsObjectForPluginWithPath (mGSettingsBackend, "mock", CharacterWrapper (makeCompizPluginPath (profileName.c_str (), "mock")), mContext); mStorage.reset (new CCSGSettingsStorageEnv (mSettings, profileName)); ON_CALL (*gmockContext, getProfile ()).WillByDefault (Return (profileName.c_str ())); return (CCSBackend *) mBackend; } void BackendTearDown (CCSBackend *) { GVariantBuilder noProfilesBuilder; g_variant_builder_init (&noProfilesBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&noProfilesBuilder, "s", "Default"); GVariant *noProfiles = g_variant_builder_end (&noProfilesBuilder); GVariantBuilder pluginKeysBuilder; g_variant_builder_init (&pluginKeysBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&pluginKeysBuilder, "s", "mock"); GVariant *pluginKeys = g_variant_builder_end (&pluginKeysBuilder); ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (mGSettingsBackend, mContext, pluginKeys, ccsGSettingsBackendGetCurrentProfile ( mGSettingsBackend)); ccsGSettingsBackendClearPluginsWithSetKeys (mGSettingsBackend); ccsGSettingsBackendSetExistingProfiles (mGSettingsBackend, noProfiles); ccsGSettingsBackendSetCurrentProfile (mGSettingsBackend, "Default"); ccsFreeDynamicBackend (mBackend); mStorage.reset (); g_variant_unref (pluginKeys); TearDownEnv (); g_unsetenv ("LIBCOMPIZCONFIG_BACKEND_PATH"); } void AddProfile (const std::string &profile) { ccsGSettingsBackendAddProfile (mGSettingsBackend, profile.c_str ()); } void SetGetExistingProfilesExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).Times (AtLeast (1)); } void SetDeleteProfileExpectation (const std::string &profileToDelete, CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).Times (AtLeast (1)); } void SetReadInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (profileName.c_str ())); } void SetReadDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { } void SetWriteInitExpectation (CCSContext *context, CCSContextGMock *gmockContext) { EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (profileName.c_str ())); } void SetWriteDoneExpectation (CCSContext *context, CCSContextGMock *gmockContext) { } void PreWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*gmockContext, getIntegrationEnabled ()).WillRepeatedly (Return (FALSE)); EXPECT_CALL (*gmockPlugin, getContext ()).Times (AtLeast (1)); EXPECT_CALL (*gmockPlugin, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getParent ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getIsDefault ()).WillRepeatedly (Return (FALSE)); if (type == TypeList) EXPECT_CALL (*gmockSetting, getDefaultValue ()).WillRepeatedly (ReturnNull ()); } void PostWrite (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) {} void PreRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*gmockContext, getIntegrationEnabled ()).WillOnce (Return (FALSE)); EXPECT_CALL (*gmockPlugin, getContext ()).Times (AtLeast (1)); EXPECT_CALL (*gmockPlugin, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getParent ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, isReadableByBackend ()).WillRepeatedly (Return (TRUE)); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getDefaultValue ()).WillRepeatedly (ReturnNull ()); } } void PostRead (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) {} void PreUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) { EXPECT_CALL (*gmockContext, getIntegrationEnabled ()).WillOnce (Return (FALSE)); EXPECT_CALL (*gmockPlugin, getContext ()).Times (AtLeast (1)); EXPECT_CALL (*gmockPlugin, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getType ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getName ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getParent ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, isReadableByBackend ()).WillRepeatedly (Return (TRUE)); if (type == TypeList) { EXPECT_CALL (*gmockSetting, getInfo ()).Times (AtLeast (1)); EXPECT_CALL (*gmockSetting, getDefaultValue ()).WillRepeatedly (ReturnNull ()); } EXPECT_CALL (*gmockContext, getProfile ()); } void PostUpdate (CCSContextGMock *gmockContext, CCSPluginGMock *gmockPlugin, CCSSettingGMock *gmockSetting, CCSSettingType type) {} bool UpdateSettingAtKey (const std::string &plugin, const std::string &setting) { CharacterWrapper keyName (translateKeyForGSettings (setting.c_str ())); if (updateSettingWithGSettingsKeyName (reinterpret_cast (mGSettingsBackend), mSettings, keyName, ccsBackendUpdateSetting)) return true; return false; } void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteBoolAtKey (plugin, key, value); } void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteIntegerAtKey (plugin, key, value); } void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteFloatAtKey (plugin, key, value); } void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteStringAtKey (plugin, key, value); } void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteColorAtKey (plugin, key, value); } void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteKeyAtKey (plugin, key, value); } void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteButtonAtKey (plugin, key, value); } void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteEdgeAtKey (plugin, key, value); } void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteMatchAtKey (plugin, key, value); } void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteBellAtKey (plugin, key, value); } void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value) { mStorage->WriteListAtKey (plugin, key, value); } Bool ReadBoolAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadBoolAtKey (plugin, key); } int ReadIntegerAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadIntegerAtKey (plugin, key); } float ReadFloatAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadFloatAtKey (plugin, key); } const char * ReadStringAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadStringAtKey (plugin, key); } CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadColorAtKey (plugin, key); } CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadKeyAtKey (plugin, key); } CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadButtonAtKey (plugin, key); } unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadEdgeAtKey (plugin, key); } const char * ReadMatchAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadMatchAtKey (plugin, key); } Bool ReadBellAtKey (const std::string &plugin, const std::string &key) { return mStorage->ReadBellAtKey (plugin, key); } CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting) { return mStorage->ReadListAtKey (plugin, key, setting); } private: boost::shared_ptr mLoader; CCSGSettingsWrapper *mSettings; boost::shared_ptr mStorage; CCSContext *mContext; CCSDynamicBackend *mBackend; CCSBackend *mGSettingsBackend; std::string pluginToMatch; static const std::string profileName; }; const std::string CCSGSettingsBackendEnv::profileName = "mock"; INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestReadWrite, compizconfig::test::GenerateTestingParametersForBackendInterface ()); INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestInfo, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestInitFiniFuncs, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendConcept, CCSBackendConformanceTestProfileHandling, compizconfig::test::GenerateTestingEnvFactoryBackendInterface ()); ./compizconfig/gsettings/tests/test_gsettings.cpp0000644000004100000410000000104613246301623022656 0ustar www-datawww-data#include "test_gsettings_tests.h" using ::testing::Values; class CCSGSettingsTestWithMocks : public CCSGSettingsTeardownSetupInterface { public: void SetUp () {} void TearDown () {} }; class CCSGSettingsTestWithSystem : public CCSGSettingsTeardownSetupInterface { public: void SetUp () {} void TearDown () {} }; namespace { CCSGSettingsTestWithMocks withMocks; CCSGSettingsTestWithSystem withSystem; } INSTANTIATE_TEST_CASE_P(CompizConfigGSettingsTestWithMocks, CCSGSettingsTest, Values (&withMocks, &withSystem)); ./compizconfig/gsettings/tests/test_gsettings_tests.cpp0000644000004100000410000022742513246301623024113 0ustar www-datawww-data#include #include #include #include #include #include #include "gtest_shared_autodestroy.h" #include "gtest_unspecified_bool_type_matcher.h" #include "test_gsettings_tests.h" #include "gsettings.h" #include "ccs_gsettings_backend.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_backend_mock.h" #include "compizconfig_ccs_context_mock.h" #include "compizconfig_ccs_plugin_mock.h" #include "compizconfig_ccs_setting_mock.h" #include "compizconfig_ccs_integration_mock.h" #include "ccs_gsettings_wrapper_mock.h" #include "ccs_gsettings_wrapper_factory_mock.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gnome_integration.h" #include "gtest_shared_characterwrapper.h" #include "compizconfig_test_value_combiners.h" #include "compizconfig_ccs_mocked_allocator.h" #include "gsettings_shared.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_wrapper_mock.h" using ::testing::Values; using ::testing::ValuesIn; using ::testing::Return; using ::testing::ReturnNull; using ::testing::Invoke; using ::testing::WithArgs; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::AllOf; using ::testing::Not; using ::testing::NotNull; using ::testing::Matcher; using ::testing::Eq; using ::testing::NiceMock; using ::testing::StrictMock; using ::testing::IsNull; class GVariantSubtypeMatcher : public ::testing::MatcherInterface { public: GVariantSubtypeMatcher (const std::string &type) : mType (type) { } virtual ~GVariantSubtypeMatcher () {} virtual bool MatchAndExplain (GVariant *x, MatchResultListener *listener) const { return g_variant_type_is_subtype_of (G_VARIANT_TYPE (mType.c_str ()), g_variant_get_type (x)); } virtual void DescribeTo (std::ostream *os) const { *os << "is subtype of " << mType; } private: std::string mType; }; template class GVariantHasValueInArrayMatcher : public ::testing::MatcherInterface { public: GVariantHasValueInArrayMatcher (const std::string &type, const T &t, const boost::function &eq) : mType (type), mT (t), mEq (eq) { } virtual ~GVariantHasValueInArrayMatcher () {} virtual bool MatchAndExplain (GVariant *x, MatchResultListener *listener) const { GVariantIter iter; T match; bool found = false; g_variant_iter_init (&iter, x); while (g_variant_iter_loop (&iter, mType.c_str (), &match)) { if (mEq (match, mT)) found = true; } return found; } virtual void DescribeTo (std::ostream *os) const { *os << "contains " << mT; } private: std::string mType; T mT; boost::function mEq; }; template inline Matcher GVariantHasValueInArray (const std::string &type, const T &t, const boost::function &eq) { return MakeMatcher (new GVariantHasValueInArrayMatcher (type, t, eq)); } inline Matcher IsVariantSubtypeOf (const std::string &type) { return MakeMatcher (new GVariantSubtypeMatcher (type)); } TEST_P(CCSGSettingsTest, TestTestFixtures) { } TEST_F(CCSGSettingsTestIndependent, TestTest) { } namespace { bool streq (const char * const &s1, const char * const &s2) { return g_str_equal (s1, s2); } } class CCSGSettingsTestProfiles : public CCSGSettingsTestIndependent { public: static const std::string newProfileName; static const std::string existingProfileName; }; const std::string CCSGSettingsTestProfiles::existingProfileName ("ExistingProfile"); const std::string CCSGSettingsTestProfiles::newProfileName ("NewProfile"); TEST_F(CCSGSettingsTestProfiles, TestAddProfile) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", existingProfileName.c_str ()); GVariant *existingProfiles = g_variant_builder_end (&builder); EXPECT_CALL (*gmock, getExistingProfiles ()).WillOnce (Return (existingProfiles)); EXPECT_CALL (*gmock, setExistingProfiles (AllOf (IsVariantSubtypeOf ("as"), GVariantHasValueInArray ("s", newProfileName.c_str (), boost::bind (streq, _1, _2))))) .WillOnce (WithArgs <0> (Invoke (g_variant_unref))); ccsGSettingsBackendAddProfileDefault (backend.get (), newProfileName.c_str ()); } TEST_F(CCSGSettingsTestProfiles, TestUpdateCurrentProfileNameAppendNew) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); EXPECT_CALL (*gmock, addProfile (Eq (newProfileName))); EXPECT_CALL (*gmock, setCurrentProfile (Eq (newProfileName))); ccsGSettingsBackendUpdateCurrentProfileNameDefault (backend.get (), newProfileName.c_str ()); } TEST_F(CCSGSettingsTestProfiles, TestUpdateCurrentProfileNameExisting) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); EXPECT_CALL (*gmock, addProfile (Eq (existingProfileName))); EXPECT_CALL (*gmock, setCurrentProfile (Eq (existingProfileName))); ccsGSettingsBackendUpdateCurrentProfileNameDefault (backend.get (), existingProfileName.c_str ()); } TEST_F(CCSGSettingsTestProfiles, TestDeleteProfileExistingProfile) { boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); boost::shared_ptr context (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)); CCSGSettingsBackendGMock *mockBackend = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); std::string currentProfile ("foo"); std::string otherProfile ("other"); GVariant *existingProfiles = NULL; GVariantBuilder existingProfilesBuilder; g_variant_builder_init (&existingProfilesBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&existingProfilesBuilder, "s", currentProfile.c_str ()); g_variant_builder_add (&existingProfilesBuilder, "s", otherProfile.c_str ()); existingProfiles = g_variant_builder_end (&existingProfilesBuilder); EXPECT_CALL (*mockBackend, getPluginsWithSetKeys ()).WillOnce (ReturnNull ()); EXPECT_CALL (*mockBackend, unsetAllChangedPluginKeysInProfile (context.get (), NULL, Eq (currentProfile))); EXPECT_CALL (*mockBackend, clearPluginsWithSetKeys ()); EXPECT_CALL (*mockBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*mockBackend, getExistingProfiles ()).WillOnce (Return (existingProfiles)); EXPECT_CALL (*mockBackend, setExistingProfiles (AllOf (IsVariantSubtypeOf ("as"), Not (GVariantHasValueInArray ("s", currentProfile.c_str (), boost::bind (streq, _1, _2))), GVariantHasValueInArray ("s", otherProfile.c_str (), boost::bind (streq, _1, _2))))) .WillOnce (WithArgs <0> (Invoke (g_variant_unref))); EXPECT_CALL (*mockBackend, updateProfile (context.get ())); deleteProfile (backend.get (), context.get (), currentProfile.c_str ()); } TEST_F(CCSGSettingsTestIndependent, TestWriteVariantToKeyReturnsFalseForNullWrapper) { CCSGSettingsWrapper *wrapper = NULL; boost::shared_ptr v (AutoDestroy (g_variant_new_int32 (1), g_variant_unref)); EXPECT_THAT (writeVariantToKey (wrapper, "foo", v.get ()), IsFalse ()); } TEST_F(CCSGSettingsTestIndependent, TestGetSchemaNameForPlugin) { const gchar *plugin = "foo"; gchar *schemaName = getSchemaNameForPlugin (plugin); std::string schemaNameStr (schemaName); size_t pos = schemaNameStr.find (PLUGIN_SCHEMA_ID_PREFIX, 0); EXPECT_EQ (pos, 0); g_free (schemaName); } TEST_F(CCSGSettingsTestIndependent, TestTruncateKeyForGSettingsOver) { const unsigned int OVER_KEY_SIZE = MAX_GSETTINGS_KEY_SIZE + 1; std::string keyname; for (unsigned int i = 0; i <= OVER_KEY_SIZE - 1; ++i) keyname.push_back ('a'); ASSERT_EQ (keyname.size (), OVER_KEY_SIZE); gchar *truncated = truncateKeyForGSettings (keyname.c_str ()); EXPECT_EQ (std::string (truncated).size (), MAX_GSETTINGS_KEY_SIZE); g_free (truncated); } TEST_F(CCSGSettingsTestIndependent, TestTruncateKeyForGSettingsUnder) { const unsigned int UNDER_KEY_SIZE = MAX_GSETTINGS_KEY_SIZE - 1; std::string keyname; for (unsigned int i = 0; i <= UNDER_KEY_SIZE - 1; ++i) keyname.push_back ('a'); ASSERT_EQ (keyname.size (), UNDER_KEY_SIZE); gchar *truncated = truncateKeyForGSettings (keyname.c_str ()); EXPECT_EQ (std::string (truncated).size (), UNDER_KEY_SIZE); g_free (truncated); } TEST_F(CCSGSettingsTestIndependent, TestTranslateUnderscoresToDashesForGSettings) { std::string keyname ("plugin_option"); gchar *translated = translateUnderscoresToDashesForGSettings (keyname.c_str ()); std::string translatedKeyname (translated); EXPECT_EQ (translatedKeyname, std::string ("plugin-option")); g_free (translated); } TEST_F(CCSGSettingsTestIndependent, TestTranslateUpperToLowerForGSettings) { gchar keyname[] = "PLUGIN-OPTION"; translateToLowercaseForGSettings (keyname); EXPECT_EQ (std::string (keyname), "plugin-option"); } TEST_F(CCSGSettingsTestIndependent, TestTranslateKeyForGSettingsNoTrunc) { std::string keyname ("FoO_BaR"); std::string expected ("foo-bar"); CharacterWrapper translated (translateKeyForGSettings (keyname.c_str ())); EXPECT_EQ (std::string (translated), expected); } TEST_F(CCSGSettingsTestIndependent, TestTranslateKeyForGSettingsTrunc) { const unsigned int OVER_KEY_SIZE = MAX_GSETTINGS_KEY_SIZE + 1; std::string keyname; for (unsigned int i = 0; i <= OVER_KEY_SIZE - 1; ++i) keyname.push_back ('a'); ASSERT_EQ (keyname.size (), OVER_KEY_SIZE); CharacterWrapper translated (translateKeyForGSettings (keyname.c_str ())); std::string stringOfTranslated (translated); EXPECT_EQ (stringOfTranslated.size (), MAX_GSETTINGS_KEY_SIZE); } TEST_F(CCSGSettingsTestIndependent, TestTranslateKeyForCCS) { std::string keyname ("plugin-option"); gchar *translated = translateKeyForCCS (keyname.c_str ()); EXPECT_EQ (std::string (translated), "plugin_option"); free (translated); } struct CCSTypeIsVariantType { CCSSettingType settingType; bool isVariantType; }; class CCSGSettingsTestVariantTypeFixture : public ::testing::TestWithParam , public CCSGSettingsTestingEnv { public: virtual void SetUp () { CCSGSettingsTestingEnv::SetUpEnv (); mType = GetParam (); } virtual void TearDown () { CCSGSettingsTestingEnv::TearDownEnv (); } protected: CCSTypeIsVariantType mType; }; TEST_P(CCSGSettingsTestVariantTypeFixture, TestVariantType) { EXPECT_EQ (mType.isVariantType, compizconfigTypeHasVariantType (mType.settingType)); } namespace { CCSTypeIsVariantType type[TypeNum + 1] = { { TypeBool, true }, { TypeInt, true }, { TypeFloat, true }, { TypeString, true }, { TypeColor, true }, { TypeAction, false }, /* Cannot read raw actions */ { TypeKey, false }, /* No actions in lists */ { TypeButton, false }, /* No actions in lists */ { TypeEdge, false }, /* No actions in lists */ { TypeBell, false }, /* No actions in lists */ { TypeMatch, true }, { TypeList, false }, /* No lists in lists */ { TypeNum, false } }; } INSTANTIATE_TEST_CASE_P (CCSGSettingsTestVariantTypeInstantiation, CCSGSettingsTestVariantTypeFixture, ValuesIn (type)); TEST_F(CCSGSettingsTestIndependent, TestDecomposeGSettingsPath) { std::string compiz_gsettings_path (PROFILE_PATH_PREFIX); std::string fake_option_path ("PROFILENAME/plugins/PLUGINNAME"); compiz_gsettings_path += fake_option_path; char *pluginName; unsigned int screenNum; ASSERT_TRUE (decomposeGSettingsPath (compiz_gsettings_path.c_str (), &pluginName, &screenNum)); EXPECT_EQ (std::string (pluginName), "PLUGINNAME"); EXPECT_EQ (screenNum, 0); g_free (pluginName); } TEST_F(CCSGSettingsTestIndependent, TestDecomposeGSettingsPathBadPathname) { std::string compiz_gsettings_path ("org/this/path/is/wrong/"); std::string fake_option_path ("PROFILENAME/plugins/PLUGINNAME"); compiz_gsettings_path += fake_option_path; CharacterWrapper pluginName (strdup ("aaa")); char *pluginNameC = pluginName; unsigned int screenNum = 1; EXPECT_FALSE (decomposeGSettingsPath (compiz_gsettings_path.c_str (), &pluginNameC, &screenNum)); EXPECT_EQ (std::string (pluginNameC), "aaa"); EXPECT_EQ (screenNum, 1); } TEST_F(CCSGSettingsTestIndependent, TestMakeCompizProfilePath) { gchar *a = makeCompizProfilePath ("alpha"); ASSERT_TRUE (a != NULL); EXPECT_EQ (std::string (a), "/org/compiz/profiles/alpha/"); g_free (a); gchar *b = makeCompizProfilePath ("beta/"); ASSERT_TRUE (b != NULL); EXPECT_EQ (std::string (b), "/org/compiz/profiles/beta/"); g_free (b); gchar *c = makeCompizProfilePath ("/gamma"); ASSERT_TRUE (c != NULL); EXPECT_EQ (std::string (c), "/org/compiz/profiles/gamma/"); g_free (c); gchar *d = makeCompizProfilePath ("/delta"); ASSERT_TRUE (d != NULL); EXPECT_EQ (std::string (d), "/org/compiz/profiles/delta/"); g_free (d); } TEST_F(CCSGSettingsTestIndependent, TestMakeCompizPluginPath) { gchar *x = makeCompizPluginPath ("one", "two"); ASSERT_TRUE (x != NULL); EXPECT_EQ (std::string (x), "/org/compiz/profiles/one/plugins/two/"); g_free (x); gchar *y = makeCompizPluginPath ("/three", "four/"); ASSERT_TRUE (y != NULL); EXPECT_EQ (std::string (y), "/org/compiz/profiles/three/plugins/four/"); g_free (y); } namespace GVariantSubtypeWrappers { typedef gboolean (*IsSubtype) (GVariant *v); gboolean boolean (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_BOOLEAN, g_variant_get_type (v)); } gboolean bell (GVariant *v) { return boolean (v); } gboolean string (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_STRING, g_variant_get_type (v)); } gboolean match (GVariant *v) { return string (v); } gboolean color (GVariant *v) { return string (v); } gboolean key (GVariant *v) { return string (v); } gboolean button (GVariant *v) { return string (v); } gboolean edge (GVariant *v) { return string (v); } gboolean integer (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_INT32, g_variant_get_type (v)); } gboolean doubleprecision (GVariant *v) { return g_variant_type_is_subtype_of (G_VARIANT_TYPE_DOUBLE, g_variant_get_type (v)); } gboolean list (GVariant *v) { return g_variant_type_is_array (g_variant_get_type (v)); } gboolean unknown (GVariant *) { return FALSE; } } struct ArrayVariantInfo { GVariantSubtypeWrappers::IsSubtype func; CCSSettingType ccsType; const char *vType; }; namespace { const char *vBoolean = "b"; const char *vString = "s"; const char *vInt = "i"; const char *vDouble = "d"; const char *vArray = "as"; const char *vUnknown = ""; ArrayVariantInfo arrayVariantInfo[] = { { &GVariantSubtypeWrappers::boolean, TypeBool, vBoolean }, { &GVariantSubtypeWrappers::bell, TypeBell, vBoolean }, { &GVariantSubtypeWrappers::string, TypeString, vString }, { &GVariantSubtypeWrappers::match, TypeMatch, vString }, { &GVariantSubtypeWrappers::color, TypeColor, vString }, { &GVariantSubtypeWrappers::key, TypeKey, vString }, { &GVariantSubtypeWrappers::button, TypeButton, vString }, { &GVariantSubtypeWrappers::edge, TypeEdge, vString }, { &GVariantSubtypeWrappers::integer, TypeInt, vInt }, { &GVariantSubtypeWrappers::doubleprecision, TypeFloat, vDouble }, { &GVariantSubtypeWrappers::list, TypeList, vArray }, { &GVariantSubtypeWrappers::unknown, TypeNum, vUnknown } }; } class CCSGSettingsTestArrayVariantSubTypeFixture : public ::testing::TestWithParam , public CCSGSettingsTestingEnv { public: virtual void SetUp () { CCSGSettingsTestingEnv::SetUpEnv (); mAVInfo = GetParam (); } virtual void TearDown () { CCSGSettingsTestingEnv::TearDownEnv (); g_variant_unref (v); } protected: ArrayVariantInfo mAVInfo; GVariant *v; }; TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeBool) { v = g_variant_new (vBoolean, TRUE); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeString) { v = g_variant_new (vString, "foo"); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeInt) { v = g_variant_new (vInt, 1); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeDouble) { v = g_variant_new (vDouble, 2.0); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } TEST_P(CCSGSettingsTestArrayVariantSubTypeFixture, TestArrayVariantValidForCCSTypeArray) { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE (vArray)); g_variant_builder_add (&vb, "s", "foo"); g_variant_builder_add (&vb, "s", "bar"); v = g_variant_builder_end (&vb); EXPECT_EQ ((*mAVInfo.func) (v), variantIsValidForCCSType (v, mAVInfo.ccsType)); } INSTANTIATE_TEST_CASE_P (CCSGSettingsTestArrayVariantSubTypeInstantiation, CCSGSettingsTestArrayVariantSubTypeFixture, ValuesIn (arrayVariantInfo)); class CCSGSettingsTestPluginsWithSetKeysGVariantSetup : public CCSGSettingsTestIndependent { public: virtual void SetUp () { CCSGSettingsTestIndependent::SetUp (); GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&builder, "s", "foo"); g_variant_builder_add (&builder, "s", "bar"); writtenPlugins = g_variant_builder_end (&builder); newWrittenPlugins = NULL; newWrittenPluginsSize = 0; } virtual void TearDown () { g_variant_unref (writtenPlugins); g_strfreev (newWrittenPlugins); CCSGSettingsTestIndependent::TearDown (); } protected: GVariantBuilder *builder; GVariant *writtenPlugins; char **newWrittenPlugins; gsize newWrittenPluginsSize; }; TEST_F(CCSGSettingsTestPluginsWithSetKeysGVariantSetup, TestAppendToPluginsWithSetKeysListNewItem) { EXPECT_TRUE (appendToPluginsWithSetKeysList ("plugin", writtenPlugins, &newWrittenPlugins, &newWrittenPluginsSize)); EXPECT_EQ (newWrittenPluginsSize, 3); EXPECT_EQ (std::string (newWrittenPlugins[0]), std::string ("foo")); EXPECT_EQ (std::string (newWrittenPlugins[1]), std::string ("bar")); EXPECT_EQ (std::string (newWrittenPlugins[2]), std::string ("plugin")); } TEST_F(CCSGSettingsTestPluginsWithSetKeysGVariantSetup, TestAppendToPluginsWithSetKeysListExistingItem) { EXPECT_FALSE (appendToPluginsWithSetKeysList ("foo", writtenPlugins, &newWrittenPlugins, &newWrittenPluginsSize)); EXPECT_EQ (newWrittenPluginsSize, 2); EXPECT_EQ (std::string (newWrittenPlugins[0]), std::string ("foo")); EXPECT_EQ (std::string (newWrittenPlugins[1]), std::string ("bar")); } class CCSGSettingsTestGSettingsWrapperWithSchemaName : public CCSGSettingsTestIndependent { public: typedef std::tr1::tuple , CCSGSettingsWrapperGMock *> WrapperMock; CCSGSettingsTestGSettingsWrapperWithSchemaName () : objectSchemaGList (NULL) { CCSGSettingsTestIndependent::SetUp (); } ~CCSGSettingsTestGSettingsWrapperWithSchemaName () { g_list_free (objectSchemaGList); CCSGSettingsTestIndependent::TearDown (); } WrapperMock AddObject () { boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); objectSchemaGList = g_list_append (objectSchemaGList, wrapper.get ()); objectSchemaList.push_back (wrapper); return WrapperMock (wrapper, gmockWrapper); } static const std::string VALUE_FOO; static const std::string VALUE_BAR; static const std::string VALUE_BAZ; protected: GList *objectSchemaGList; std::vector > objectSchemaList; }; const std::string CCSGSettingsTestGSettingsWrapperWithSchemaName::VALUE_FOO = "foo"; const std::string CCSGSettingsTestGSettingsWrapperWithSchemaName::VALUE_BAR = "bar"; const std::string CCSGSettingsTestGSettingsWrapperWithSchemaName::VALUE_BAZ = "baz"; TEST_F(CCSGSettingsTestGSettingsWrapperWithSchemaName, TestFindExistingObjectWithSchema) { WrapperMock wr1 (AddObject ()); WrapperMock wr2 (AddObject ()); EXPECT_CALL (*(std::tr1::get <1> (wr1)), getSchemaName ()).WillRepeatedly (Return (VALUE_BAR.c_str ())); EXPECT_CALL (*(std::tr1::get <1> (wr2)), getSchemaName ()).WillRepeatedly (Return (VALUE_FOO.c_str ())); EXPECT_EQ (findCCSGSettingsWrapperBySchemaName (VALUE_FOO.c_str (), objectSchemaGList), (std::tr1::get <0> (wr2)).get ()); } TEST_F(CCSGSettingsTestGSettingsWrapperWithSchemaName, TestNoFindNonexistingObjectWithSchema) { WrapperMock wr1 (AddObject ()); WrapperMock wr2 (AddObject ()); EXPECT_CALL (*(std::tr1::get <1> (wr1)), getSchemaName ()).WillRepeatedly (Return (VALUE_BAR.c_str ())); EXPECT_CALL (*(std::tr1::get <1> (wr2)), getSchemaName ()).WillRepeatedly (Return (VALUE_BAZ.c_str ())); EXPECT_THAT (findCCSGSettingsWrapperBySchemaName (VALUE_FOO.c_str (), objectSchemaGList), IsNull ()); } class CCSGSettingsTestFindSettingLossy : public CCSGSettingsTestIndependent { public: virtual void SetUp () { CCSGSettingsTestIndependent::SetUp (); settingList = NULL; } virtual void TearDown () { ccsSettingListFree (settingList, TRUE); settingList = NULL; CCSGSettingsTestIndependent::TearDown (); } CCSSetting * AddMockSettingWithNameAndType (char *name, CCSSettingType type) { CCSSetting *mockSetting = ccsMockSettingNew (); settingList = ccsSettingListAppend (settingList, mockSetting); CCSSettingGMock *gmock = reinterpret_cast (ccsObjectGetPrivate (mockSetting)); ON_CALL (*gmock, getName ()).WillByDefault (Return (name)); ON_CALL (*gmock, getType ()).WillByDefault (Return (type)); return mockSetting; } void ExpectNameCallOnSetting (CCSSetting *setting) { CCSSettingGMock *gs = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gs, getName ()); } void ExpectTypeCallOnSetting (CCSSetting *setting) { CCSSettingGMock *gs = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gs, getType ()); } protected: CCSSettingList settingList; }; TEST_F(CCSGSettingsTestFindSettingLossy, TestFilterAvailableSettingsByType) { char *name1 = strdup ("foo_bar_baz"); char *name2 = strdup ("foo_bar-baz"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeBool); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); CCSSettingList filteredList = filterAllSettingsMatchingType (TypeInt, settingList); /* Needs to be expressed in terms of a boolean expression */ ASSERT_THAT (filteredList, NotNull ()); EXPECT_EQ (ccsSettingListLength (filteredList), 1); EXPECT_EQ (filteredList->data, s1); EXPECT_NE (filteredList->data, s2); EXPECT_EQ (NULL, filteredList->next); free (name2); free (name1); ccsSettingListFree (filteredList, FALSE); } TEST_F(CCSGSettingsTestFindSettingLossy, TestFilterAvailableSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_fred"); char *name3 = strdup ("foo-bar"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); CCSSettingList filteredList = filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase ("foo-bar-baz", settingList); ASSERT_THAT (filteredList, NotNull ()); ASSERT_EQ (ccsSettingListLength (filteredList), 2); EXPECT_EQ (filteredList->data, s1); EXPECT_NE (filteredList->data, s3); ASSERT_THAT (filteredList->next, NotNull ()); EXPECT_EQ (filteredList->next->data, s2); EXPECT_NE (filteredList->data, s3); EXPECT_EQ (NULL, filteredList->next->next); free (name1); free (name2); free (name3); ccsSettingListFree (filteredList, FALSE); } TEST_F(CCSGSettingsTestFindSettingLossy, TestAttemptToFindCCSSettingFromLossyNameSuccess) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_bob-fred"); char *name3 = strdup ("foo-bar"); char *name4 = strdup ("FOO_bar_baz_bob-fred"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); CCSSetting *s4 = AddMockSettingWithNameAndType (name4, TypeString); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); ExpectTypeCallOnSetting (s3); ExpectTypeCallOnSetting (s4); CCSSetting *found = attemptToFindCCSSettingFromLossyName (settingList, "foo-bar-baz-bob-fred", TypeInt); EXPECT_EQ (found, s2); EXPECT_NE (found, s1); EXPECT_NE (found, s3); EXPECT_NE (found, s4); free (name1); free (name2); free (name3); free (name4); } TEST_F(CCSGSettingsTestFindSettingLossy, TestAttemptToFindCCSSettingFromLossyNameFailTooMany) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_bob-fred"); char *name3 = strdup ("FOO_BAR_baz_bob-fred"); char *name4 = strdup ("foo-bar"); char *name5 = strdup ("FOO_bar_baz_bob-fred"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); CCSSetting *s4 = AddMockSettingWithNameAndType (name4, TypeInt); CCSSetting *s5 = AddMockSettingWithNameAndType (name5, TypeString); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); ExpectNameCallOnSetting (s4); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); ExpectTypeCallOnSetting (s3); ExpectTypeCallOnSetting (s4); ExpectTypeCallOnSetting (s5); CCSSetting *found = attemptToFindCCSSettingFromLossyName (settingList, "foo-bar-baz-bob-fred", TypeInt); ASSERT_FALSE (found); EXPECT_NE (found, s1); EXPECT_NE (found, s2); EXPECT_NE (found, s3); EXPECT_NE (found, s4); EXPECT_NE (found, s5); free (name1); free (name2); free (name3); free (name4); free (name5); } TEST_F(CCSGSettingsTestFindSettingLossy, TestAttemptToFindCCSSettingFromLossyNameFailNoMatches) { char *name1 = strdup ("foo_bar_baz_bob"); char *name2 = strdup ("FOO_bar_baz_bob-richard"); char *name3 = strdup ("foo-bar"); char *name4 = strdup ("FOO_bar_baz_bob-richard"); CCSSetting *s1 = AddMockSettingWithNameAndType (name1, TypeInt); CCSSetting *s2 = AddMockSettingWithNameAndType (name2, TypeInt); CCSSetting *s3 = AddMockSettingWithNameAndType (name3, TypeInt); CCSSetting *s4 = AddMockSettingWithNameAndType (name4, TypeString); ExpectNameCallOnSetting (s1); ExpectNameCallOnSetting (s2); ExpectNameCallOnSetting (s3); ExpectTypeCallOnSetting (s1); ExpectTypeCallOnSetting (s2); ExpectTypeCallOnSetting (s3); ExpectTypeCallOnSetting (s4); CCSSetting *found = attemptToFindCCSSettingFromLossyName (settingList, "foo-bar-baz-bob-fred", TypeInt); ASSERT_FALSE (found); EXPECT_NE (found, s1); EXPECT_NE (found, s2); EXPECT_NE (found, s3); EXPECT_NE (found, s4); free (name1); free (name2); free (name3); free (name4); } namespace { class GListContainerEqualityInterface { public: virtual ~GListContainerEqualityInterface () {} virtual bool operator== (GList *) const = 0; bool operator!= (GList *l) const { return !(*this == l); } }; class GListContainerEqualityBase : public GListContainerEqualityInterface { public: typedef boost::function PopulateFunc; GListContainerEqualityBase (const PopulateFunc &populateGList) { g_setenv ("G_SLICE", "always-malloc", 1); mList = populateGList (); g_unsetenv ("G_SLICE"); } GListContainerEqualityBase (const GListContainerEqualityBase &other) { g_setenv ("G_SLICE", "always-malloc", 1); mList = g_list_copy (other.mList); g_unsetenv ("G_SLICE"); } GListContainerEqualityBase & operator= (GListContainerEqualityBase &other) { if (this == &other) return *this; GListContainerEqualityBase tmp (other); tmp.swap (*this); return *this; } void swap (GListContainerEqualityBase &other) { std::swap (this->mList, other.mList); } bool operator== (GList *other) const { unsigned int numInternal = g_list_length (mList); unsigned int numOther = g_list_length (other); if (numInternal != numOther) return false; GList *iterOther = other; GList *iterInternal = mList; for (unsigned int i = 0; i < numInternal; ++i) { if (static_cast (GPOINTER_TO_INT (iterOther->data)) != static_cast (GPOINTER_TO_INT (iterInternal->data))) return false; iterOther = g_list_next (iterOther); iterInternal = g_list_next (iterInternal); } return true; } ~GListContainerEqualityBase () { g_list_free (mList); } private: GList *mList; }; GList * populateBoolCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeBool))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeBell))); return ret; } GList * populateStringCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeString))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeColor))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeKey))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeButton))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeEdge))); ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeMatch))); return ret; } GList * populateIntCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeInt))); return ret; } GList * populateDoubleCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeFloat))); return ret; } GList * populateArrayCCSTypes () { GList *ret = NULL; ret = g_list_append (ret, GINT_TO_POINTER (static_cast (TypeList))); return ret; } struct GListContainerVariantTypeWrapper { const gchar *variantType; GListContainerEqualityBase listOfCCSTypes; }; GListContainerVariantTypeWrapper variantTypeToListOfCCSTypes[] = { { "b", GListContainerEqualityBase (boost::bind (populateBoolCCSTypes)) }, { "s", GListContainerEqualityBase (boost::bind (populateStringCCSTypes)) }, { "i", GListContainerEqualityBase (boost::bind (populateIntCCSTypes)) }, { "d", GListContainerEqualityBase (boost::bind (populateDoubleCCSTypes)) }, { "a", GListContainerEqualityBase (boost::bind (populateArrayCCSTypes)) } }; } class CCSGSettingsTestVariantTypeToCCSTypeListFixture : public ::testing::TestWithParam , public CCSGSettingsTestingEnv { public: CCSGSettingsTestVariantTypeToCCSTypeListFixture () : mListContainer (GetParam ()) { } virtual void SetUp () { CCSGSettingsTestingEnv::SetUpEnv (); } virtual void TearDown () { CCSGSettingsTestingEnv::TearDownEnv (); } protected: GListContainerVariantTypeWrapper mListContainer; }; TEST_P(CCSGSettingsTestVariantTypeToCCSTypeListFixture, TestVariantTypesInListTemplate) { GList *potentialTypeList = variantTypeToPossibleSettingType (mListContainer.variantType); EXPECT_EQ (mListContainer.listOfCCSTypes, potentialTypeList); g_list_free (potentialTypeList); } INSTANTIATE_TEST_CASE_P(CCSGSettingsTestVariantTypeToCCSTypeListInstantiation, CCSGSettingsTestVariantTypeToCCSTypeListFixture, ValuesIn (variantTypeToListOfCCSTypes)); TEST_F(CCSGSettingsTestIndependent, TestGetNameForCCSSetting) { CCSSetting *setting = ccsMockSettingNew (); CCSSettingGMock *gmock = (CCSSettingGMock *) ccsObjectGetPrivate (setting); char *rawSettingName = strdup ("FoO_BaR"); char *properSettingName = translateKeyForGSettings (rawSettingName); EXPECT_CALL (*gmock, getName ()).WillOnce (Return (rawSettingName)); char *translatedSettingName = getNameForCCSSetting (setting); EXPECT_EQ (std::string (translatedSettingName), std::string (properSettingName)); EXPECT_NE (std::string (translatedSettingName), std::string (rawSettingName)); free (translatedSettingName); free (properSettingName); free (rawSettingName); ccsSettingUnref (setting); } TEST_F(CCSGSettingsTestIndependent, TestReadVariantIsValidNULL) { EXPECT_FALSE (checkReadVariantIsValid (NULL, TypeNum, "foo/bar", "key")); } TEST_F(CCSGSettingsTestIndependent, TestReadVariantIsValidTypeBad) { GVariant *v = g_variant_new ("i", 1); EXPECT_FALSE (checkReadVariantIsValid (v, TypeString, "foo/bar", "key")); g_variant_unref (v); } TEST_F(CCSGSettingsTestIndependent, TestReadVariantIsValidTypeGood) { GVariant *v = g_variant_new ("i", 1); EXPECT_TRUE (checkReadVariantIsValid (v, TypeInt, "foo/bar", "key")); g_variant_unref (v); } typedef CCSSettingValueList (*ReadValueListOfDataTypeFunc) (GVariantIter *, guint nItems, CCSSetting *setting); class ReadListValueTypeTestParam { public: typedef boost::function ReadValueListFunc; typedef boost::function GVariantPopulator; typedef boost::function CCSSettingValueListPopulator; ReadListValueTypeTestParam (const ReadValueListFunc &readFunc, const GVariantPopulator &variantPopulator, const CCSSettingValueListPopulator &listPopulator, const CCSSettingType &type) : mReadFunc (readFunc), mVariantPopulator (variantPopulator), mListPopulator (listPopulator), mType (type) { } CCSSettingValueList read (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator) const { return mReadFunc (iter, nItems, setting, allocator); } boost::shared_ptr populateVariant () const { return boost::shared_ptr (mVariantPopulator (), boost::bind (g_variant_unref, _1)); } boost::shared_ptr <_CCSSettingValueList> populateList (CCSSetting *setting) const { return boost::shared_ptr <_CCSSettingValueList> (mListPopulator (setting), boost::bind (ccsSettingValueListFree, _1, TRUE)); } CCSSettingType type () const { return mType; } private: ReadValueListFunc mReadFunc; GVariantPopulator mVariantPopulator; CCSSettingValueListPopulator mListPopulator; CCSSettingType mType; }; namespace compizconfig { namespace test { namespace impl { namespace populators { namespace variant { GVariant * boolean () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("ab")); g_variant_builder_add (&vb, "b", boolValues[0]); g_variant_builder_add (&vb, "b", boolValues[1]); g_variant_builder_add (&vb, "b", boolValues[2]); return g_variant_builder_end (&vb); } GVariant * integer () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("ai")); g_variant_builder_add (&vb, "i", intValues[0]); g_variant_builder_add (&vb, "i", intValues[1]); g_variant_builder_add (&vb, "i", intValues[2]); return g_variant_builder_end (&vb); } GVariant * doubleprecision () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("ad")); g_variant_builder_add (&vb, "d", floatValues[0]); g_variant_builder_add (&vb, "d", floatValues[1]); g_variant_builder_add (&vb, "d", floatValues[2]); return g_variant_builder_end (&vb); } GVariant * string () { GVariantBuilder vb; g_variant_builder_init (&vb, G_VARIANT_TYPE ("as")); g_variant_builder_add (&vb, "s", stringValues[0]); g_variant_builder_add (&vb, "s", stringValues[1]); g_variant_builder_add (&vb, "s", stringValues[2]); return g_variant_builder_end (&vb); } GVariant * color () { GVariantBuilder vb; CharacterWrapper s1 (ccsColorToString (&(getColorValueList ()[0]))); CharacterWrapper s2 (ccsColorToString (&(getColorValueList ()[1]))); CharacterWrapper s3 (ccsColorToString (&(getColorValueList ()[2]))); char * c1 = s1; char * c2 = s2; char * c3 = s3; g_variant_builder_init (&vb, G_VARIANT_TYPE ("as")); g_variant_builder_add (&vb, "s", c1); g_variant_builder_add (&vb, "s", c2); g_variant_builder_add (&vb, "s", c3); return g_variant_builder_end (&vb); } } } } } } class CCSGSettingsTestReadListValueTypes : public ::testing::TestWithParam { }; TEST_P(CCSGSettingsTestReadListValueTypes, TestListValueGoodAllocation) { boost::shared_ptr variant = GetParam ().populateVariant (); boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); CCSSettingInfo info; info.forList.listType = GetParam ().type (); boost::shared_ptr <_CCSSettingValueList> valueList (GetParam ().populateList (mockSetting.get ())); GVariantIter iter; g_variant_iter_init (&iter, variant.get ()); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&info)); ON_CALL (*gmockSetting, getDefaultValue ()).WillByDefault (ReturnNull ()); boost::shared_ptr <_CCSSettingValueList> readValueList (GetParam ().read (&iter, 3, mockSetting.get (), &ccsDefaultObjectAllocator), boost::bind (ccsSettingValueListFree, _1, TRUE)); EXPECT_TRUE (ccsCompareLists (valueList.get (), readValueList.get (), info.forList)); } TEST_P(CCSGSettingsTestReadListValueTypes, TestListValueThroughListValueDispatch) { boost::shared_ptr variant = GetParam ().populateVariant (); boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); CCSSettingInfo info; info.forList.listType = GetParam ().type (); boost::shared_ptr <_CCSSettingValueList> valueList (GetParam ().populateList (mockSetting.get ())); GVariantIter iter; g_variant_iter_init (&iter, variant.get ()); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&info)); ON_CALL (*gmockSetting, getDefaultValue ()).WillByDefault (ReturnNull ()); boost::shared_ptr <_CCSSettingValueList> readValueList (readListValue (variant.get (), mockSetting.get (), &ccsDefaultObjectAllocator), boost::bind (ccsSettingValueListFree, _1, TRUE)); EXPECT_TRUE (ccsCompareLists (valueList.get (), readValueList.get (), info.forList)); } TEST_P(CCSGSettingsTestReadListValueTypes, TestListValueBadAllocation) { boost::shared_ptr variant = GetParam ().populateVariant (); boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); StrictMock objectAllocationGMock; FailingObjectAllocation fakeFailingAllocator; CCSObjectAllocationInterface failingAllocatorGMock = failingAllocator; failingAllocatorGMock.allocator = reinterpret_cast (&objectAllocationGMock); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); GVariantIter iter; g_variant_iter_init (&iter, variant.get ()); EXPECT_CALL (objectAllocationGMock, calloc_ (_, _)).WillOnce (Invoke (&fakeFailingAllocator, &FailingObjectAllocation::calloc_)); boost::shared_ptr <_CCSSettingValueList> readValueList (GetParam ().read (&iter, 3, mockSetting.get (), &failingAllocatorGMock)); EXPECT_THAT (readValueList.get (), IsNull ()); } namespace variant_populators = compizconfig::test::impl::populators::variant; namespace list_populators = compizconfig::test::impl::populators::list; ReadListValueTypeTestParam readListValueTypeTestParam[] = { ReadListValueTypeTestParam (boost::bind (readBoolListValue, _1, _2, _3, _4), boost::bind (variant_populators::boolean), boost::bind (list_populators::boolean, _1), TypeBool), ReadListValueTypeTestParam (boost::bind (readIntListValue, _1, _2, _3, _4), boost::bind (variant_populators::integer), boost::bind (list_populators::integer, _1), TypeInt), ReadListValueTypeTestParam (boost::bind (readFloatListValue, _1, _2, _3, _4), boost::bind (variant_populators::doubleprecision), boost::bind (list_populators::doubleprecision, _1), TypeFloat), ReadListValueTypeTestParam (boost::bind (readStringListValue, _1, _2, _3, _4), boost::bind (variant_populators::string), boost::bind (list_populators::string, _1), TypeString), ReadListValueTypeTestParam (boost::bind (readColorListValue, _1, _2, _3, _4), boost::bind (variant_populators::color), boost::bind (list_populators::color, _1), TypeColor) }; INSTANTIATE_TEST_CASE_P (TestGSettingsReadListValueParameterized, CCSGSettingsTestReadListValueTypes, ::testing::ValuesIn (readListValueTypeTestParam)); class CCSGSettingsBackendReadListValueBadTypesTest : public ::testing::TestWithParam { }; TEST_P (CCSGSettingsBackendReadListValueBadTypesTest, TestGSettingsReadListValueFailsOnNonVariantTypes) { GVariant *variant = NULL; boost::shared_ptr mockSetting (ccsNiceMockSettingNew (), boost::bind (ccsFreeMockSetting, _1)); NiceMock *gmockSetting = reinterpret_cast *> (ccsObjectGetPrivate (mockSetting.get ())); ON_CALL (*gmockSetting, getType ()).WillByDefault (Return (TypeList)); CCSSettingInfo info; info.forList.listType = GetParam (); ON_CALL (*gmockSetting, getInfo ()).WillByDefault (Return (&info)); EXPECT_THAT (readListValue (variant, mockSetting.get (), &ccsDefaultObjectAllocator), IsNull ()); } CCSSettingType readListValueNonVariantTypes[] = { TypeAction, TypeKey, TypeButton, TypeEdge, TypeBell, TypeList, TypeNum }; INSTANTIATE_TEST_CASE_P (CCSGSettingsBackendReadListValueBadTypesTestParameterized, CCSGSettingsBackendReadListValueBadTypesTest, ::testing::ValuesIn (readListValueNonVariantTypes)); TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplCurrentProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (currentProfile.c_str ())); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplDifferentProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); std::string otherProfile ("other"); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (otherProfile.c_str ())); EXPECT_CALL (*gmockGSettingsBackend, updateCurrentProfileName (Eq (otherProfile))); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplNullProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); std::string otherProfile ("other"); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockGSettingsBackend, updateCurrentProfileName (Eq (std::string (DEFAULTPROF)))); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUpdateProfileDefaultImplEmptyStringProfile) { boost::shared_ptr context (ccsMockContextNew (), boost::bind (&ccsFreeMockContext, _1)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (&ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockGSettingsBackend = reinterpret_cast (ccsObjectGetPrivate (backend)); CCSContextGMock *gmockContext = reinterpret_cast (ccsObjectGetPrivate (context)); std::string currentProfile ("mock"); std::string otherProfile (""); EXPECT_CALL (*gmockGSettingsBackend, getCurrentProfile ()).WillOnce (Return (currentProfile.c_str ())); EXPECT_CALL (*gmockContext, getProfile ()).WillOnce (Return (otherProfile.c_str ())); EXPECT_CALL (*gmockGSettingsBackend, updateCurrentProfileName (Eq (std::string (DEFAULTPROF)))); ccsGSettingsBackendUpdateProfileDefault (backend.get (), context.get ()); } class CCSGSettingsUpdateHandlersTest : public CCSGSettingsTestIndependent { public: CCSGSettingsUpdateHandlersTest () : gsettingsBackend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)), gmockBackend (reinterpret_cast (ccsObjectGetPrivate (gsettingsBackend.get ()))), wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)), gmockWrapper (reinterpret_cast (ccsObjectGetPrivate (wrapper.get ()))), context (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)), gmockContext (reinterpret_cast (ccsObjectGetPrivate (context.get ()))), plugin (NULL), setting (NULL), uncleanKeyName (NULL) { } ~CCSGSettingsUpdateHandlersTest () { if (plugin) ccsPluginUnref (plugin); if (setting) ccsSettingUnref (setting); if (uncleanKeyName) free (uncleanKeyName); } void SetPathAndKeyname (const std::string &setPath, const std::string &setKeyName) { path = setPath; keyName = setKeyName; } protected: boost::shared_ptr gsettingsBackend; CCSGSettingsBackendGMock *gmockBackend; boost::shared_ptr wrapper; CCSGSettingsWrapperGMock *gmockWrapper; boost::shared_ptr context; CCSContextGMock *gmockContext; std::string path; std::string keyName; CCSPlugin *plugin; CCSSetting *setting; char *uncleanKeyName; }; TEST_F (CCSGSettingsUpdateHandlersTest, TestBadPath) { SetPathAndKeyname ("/wrong", "foo"); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_THAT (plugin, IsNull ()); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, IsNull ()); } TEST_F (CCSGSettingsUpdateHandlersTest, TestNoPluginFound) { SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", "foo-bar"); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (ReturnNull ()); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_THAT (plugin, IsNull ()); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, IsNull ()); } TEST_F (CCSGSettingsUpdateHandlersTest, TestNoSettingFound) { CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (ReturnNull ()); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestSettingNotFoundAndNoTypeMatches) { GVariant *value = g_variant_new_int16 (2); CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (Return (value)); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestSettingNotFoundAndNoSettingMatches) { GVariant *value = g_variant_new_int32 (2); CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); boost::shared_ptr mockSetting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (mockSetting)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); /* Maybe we should fix ccsSettingGetName to return * const char * instead of char * */ CharacterWrapper settingNameInList (strdup ("fbrarr")); char *settingNameInListC = settingNameInList; CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); boost::shared_ptr <_CCSSettingList> settingList (ccsSettingListAppend (NULL, mockSetting.get ()), boost::bind (ccsSettingListFree, _1, FALSE)); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (Return (value)); EXPECT_CALL (*gmockPlugin, getPluginSettings ()).WillOnce (Return (settingList.get ())); EXPECT_CALL (*gmockSetting, getType ()).WillRepeatedly (Return (TypeInt)); EXPECT_CALL (*gmockSetting, getName ()).WillRepeatedly (Return (settingNameInListC)); EXPECT_FALSE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, IsNull ()); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestSettingMatches) { CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); CCSSetting *mockSetting = ccsMockSettingNew (); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (Return (mockSetting)); EXPECT_TRUE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, mockSetting); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestFoundSetting) { GVariant *value = g_variant_new_int32 (2); CCSPlugin *mockPlugin = ccsMockPluginNew (); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (mockPlugin)); CCSSetting *mockSetting = ccsMockSettingNew (); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (mockSetting)); std::string gKeyName ("foo-bar"); SetPathAndKeyname ("/org/compiz/profiles/baz/plugins/bar", gKeyName.c_str ()); /* Maybe we should fix ccsSettingGetName to return * const char * instead of char * */ CharacterWrapper settingNameInList (strdup ("foo_bar")); char *settingNameInListC = settingNameInList; CharacterWrapper translated (translateKeyForCCS (gKeyName.c_str ())); boost::shared_ptr <_CCSSettingList> settingList (ccsSettingListAppend (NULL, mockSetting), boost::bind (ccsSettingListFree, _1, FALSE)); EXPECT_CALL (*gmockContext, findPlugin (Eq (std::string ("bar")))).WillOnce (Return (mockPlugin)); EXPECT_CALL (*gmockPlugin, findSetting (Eq (std::string (translated)))).WillOnce (ReturnNull ()); EXPECT_CALL (*gmockWrapper, getValue (Eq (std::string (gKeyName.c_str ())))).WillOnce (Return (value)); EXPECT_CALL (*gmockPlugin, getPluginSettings ()).WillOnce (Return (settingList.get ())); EXPECT_CALL (*gmockSetting, getType ()).WillRepeatedly (Return (TypeInt)); EXPECT_CALL (*gmockSetting, getName ()).WillRepeatedly (Return (settingNameInListC)); EXPECT_TRUE (findSettingAndPluginToUpdateFromPath (wrapper.get (), path.c_str (), keyName.c_str (), context.get (), &plugin, &setting, &uncleanKeyName)); EXPECT_EQ (plugin, mockPlugin); EXPECT_THAT (setting, mockSetting); EXPECT_THAT (uncleanKeyName, Eq (std::string (translated))); } TEST_F (CCSGSettingsUpdateHandlersTest, TestUnfindableSettingToUpdateSetttingsWithGSettingsKeyName) { SetPathAndKeyname ("/wrong", "bad-key"); EXPECT_CALL (*gmockBackend, getContext ()).WillOnce (Return (context.get ())); EXPECT_CALL (*gmockWrapper, getPath ()).WillOnce (Return (path.c_str ())); EXPECT_FALSE (updateSettingWithGSettingsKeyName (gsettingsBackend.get (), wrapper.get (), keyName.c_str (), NULL)); } TEST_F (CCSGSettingsTestIndependent, TestGetVariantAtKeySuccess) { CCSSettingType TYPE = TypeInt; const std::string KEY ("good-key"); const std::string PATH ("/org/compiz/mock/plugins/mock"); boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); boost::shared_ptr value (g_variant_ref_sink (g_variant_new_int32 (2)), boost::bind (g_variant_unref, _1)); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); EXPECT_CALL (*gmockWrapper, getValue (Eq (KEY))).WillOnce (Return (value.get ())); EXPECT_EQ (getVariantAtKey (wrapper.get (), KEY.c_str (), PATH.c_str (), TYPE), value.get ()); } TEST_F (CCSGSettingsTestIndependent, TestGetVariantAtKeyFailure) { CCSSettingType TYPE = TypeString; const std::string KEY ("good-key"); const std::string PATH ("/org/compiz/mock/plugins/mock"); boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); GVariant *value = g_variant_new_int32 (2); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); EXPECT_CALL (*gmockWrapper, getValue (Eq (KEY))).WillOnce (Return (value)); EXPECT_THAT (getVariantAtKey (wrapper.get (), KEY.c_str (), PATH.c_str (), TYPE), IsNull ()); } TEST_F (CCSGSettingsTestIndependent, TestMakeSettingPath) { CharacterWrapper PLUGIN (strdup ("mock")); char *PLUGIN_STR = PLUGIN; std::string PROFILE ("mock"); std::string EXPECTED_PATH ("/org/compiz/profiles/mock/plugins/mock/"); boost::shared_ptr plugin (ccsMockPluginNew (), boost::bind (ccsPluginUnref, _1)); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (plugin)); boost::shared_ptr setting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gmockSetting, getParent ()).WillOnce (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, getName ()).WillOnce (Return (PLUGIN_STR)); CharacterWrapper path (makeSettingPath (PROFILE.c_str (), setting.get ())); std::string pathString (path); EXPECT_EQ (pathString, EXPECTED_PATH); } TEST_F (CCSGSettingsTestIndependent, TestFindSettingsObject) { CharacterWrapper PLUGIN (strdup ("mock")); char *PLUGIN_STR = PLUGIN; std::string PROFILE ("mock"); std::string EXPECTED_PATH ("/org/compiz/profiles/mock/plugins/mock/"); boost::shared_ptr plugin (ccsMockPluginNew (), boost::bind (ccsPluginUnref, _1)); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (plugin)); boost::shared_ptr setting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting)); EXPECT_CALL (*gmockSetting, getParent ()).WillOnce (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, getName ()).WillOnce (Return (PLUGIN_STR)); CharacterWrapper path (makeSettingPath (PROFILE.c_str (), setting.get ())); std::string pathString (path); EXPECT_EQ (pathString, EXPECTED_PATH); } TEST_F (CCSGSettingsTestIndependent, TestResetOptionToDefault) { CharacterWrapper SETTING_NAME (strdup ("Mock_setting")); char *SETTING_NAME_STR = SETTING_NAME; CharacterWrapper TRANSLATED_SETTING_NAME (translateKeyForGSettings (SETTING_NAME)); CharacterWrapper PLUGIN (strdup ("mock")); char *PLUGIN_STR = PLUGIN; std::string PROFILE ("mock"); boost::shared_ptr wrapper (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapper = reinterpret_cast (ccsObjectGetPrivate (wrapper.get ())); boost::shared_ptr plugin (ccsMockPluginNew (), boost::bind (ccsPluginUnref, _1)); CCSPluginGMock *gmockPlugin = reinterpret_cast (ccsObjectGetPrivate (plugin)); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockBackend = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); boost::shared_ptr setting (ccsMockSettingNew (), boost::bind (ccsSettingUnref, _1)); CCSSettingGMock *gmockSetting = reinterpret_cast (ccsObjectGetPrivate (setting.get ())); EXPECT_CALL (*gmockSetting, getName ()).WillRepeatedly (Return (SETTING_NAME_STR)); EXPECT_CALL (*gmockSetting, getParent ()).WillRepeatedly (Return (plugin.get ())); EXPECT_CALL (*gmockPlugin, getName ()).WillRepeatedly (Return (PLUGIN_STR)); EXPECT_CALL (*gmockPlugin, getContext ()).WillRepeatedly (ReturnNull ()); EXPECT_CALL (*gmockBackend, getCurrentProfile ()).WillRepeatedly (Return (PROFILE.c_str ())); EXPECT_CALL (*gmockBackend, getSettingsObjectForPluginWithPath (Eq (std::string (PLUGIN)), _, IsNull ())).WillOnce (Return (wrapper.get ())); EXPECT_CALL (*gmockWrapper, resetKey (Eq (std::string (TRANSLATED_SETTING_NAME)))); resetOptionToDefault (backend.get (), setting.get ()); } TEST_F (CCSGSettingsTestIndependent, TestUnsetAllChangedPluginKeysInProfileDefaultImpl) { std::string PLUGIN_FOO ("foo"); std::string PLUGIN_BAR ("bar"); std::string KEY_EXAMPLE_ONE ("example-one"); std::string KEY_EXAMPLE_TWO ("example-two"); std::string KEY_EXAMPLE_THREE ("example-three"); boost::shared_ptr backend (ccsGSettingsBackendGMockNew (), boost::bind (ccsGSettingsBackendGMockFree, _1)); CCSGSettingsBackendGMock *gmockBackend = reinterpret_cast (ccsObjectGetPrivate (backend.get ())); boost::shared_ptr context (ccsMockContextNew (), boost::bind (ccsFreeMockContext, _1)); const unsigned short NUM_KEYS = 3; gchar ** fooKeys = (gchar **) calloc (1, sizeof (char *) * (NUM_KEYS + 1)); fooKeys[0] = g_strdup (KEY_EXAMPLE_ONE.c_str ()); fooKeys[1] = g_strdup (KEY_EXAMPLE_TWO.c_str ()); fooKeys[2] = g_strdup (KEY_EXAMPLE_THREE.c_str ()); fooKeys[3] = NULL; gchar ** barKeys = (gchar **) calloc (1, sizeof (char *) * (NUM_KEYS + 1)); barKeys[0] = g_strdup (KEY_EXAMPLE_ONE.c_str ()); barKeys[1] = g_strdup (KEY_EXAMPLE_TWO.c_str ()); barKeys[2] = g_strdup (KEY_EXAMPLE_THREE.c_str ()); barKeys[3] = NULL; GVariantBuilder pluginsWithChangedKeysBuilder; g_variant_builder_init (&pluginsWithChangedKeysBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&pluginsWithChangedKeysBuilder, "s", PLUGIN_FOO.c_str ()); g_variant_builder_add (&pluginsWithChangedKeysBuilder, "s", PLUGIN_BAR.c_str ()); boost::shared_ptr pluginsWithChangedKeys (g_variant_ref_sink (g_variant_builder_end (&pluginsWithChangedKeysBuilder)), boost::bind (g_variant_unref, _1)); boost::shared_ptr wrapperForFoo (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapperForFoo = reinterpret_cast (ccsObjectGetPrivate (wrapperForFoo.get ())); boost::shared_ptr wrapperForBar (ccsMockGSettingsWrapperNew (), boost::bind (ccsGSettingsWrapperUnref, _1)); CCSGSettingsWrapperGMock *gmockWrapperForBar = reinterpret_cast (ccsObjectGetPrivate (wrapperForBar.get ())); /* Get the settings wrapper */ EXPECT_CALL (*gmockBackend, getSettingsObjectForPluginWithPath (Eq (PLUGIN_FOO), _, context.get ())).WillOnce (Return (wrapperForFoo.get ())); /* List the keys */ EXPECT_CALL (*gmockWrapperForFoo, listKeys ()).WillOnce (Return (fooKeys)); /* Unset all the keys */ EXPECT_CALL (*gmockWrapperForFoo, resetKey (Eq (KEY_EXAMPLE_ONE))); EXPECT_CALL (*gmockWrapperForFoo, resetKey (Eq (KEY_EXAMPLE_TWO))); EXPECT_CALL (*gmockWrapperForFoo, resetKey (Eq (KEY_EXAMPLE_THREE))); /* Get the settings wrapper */ EXPECT_CALL (*gmockBackend, getSettingsObjectForPluginWithPath (Eq (PLUGIN_BAR), _, context.get ())).WillOnce (Return (wrapperForBar.get ())); /* List the keys */ EXPECT_CALL (*gmockWrapperForBar, listKeys ()).WillOnce (Return (barKeys)); /* Unset all the keys */ EXPECT_CALL (*gmockWrapperForBar, resetKey (Eq (KEY_EXAMPLE_ONE))); EXPECT_CALL (*gmockWrapperForBar, resetKey (Eq (KEY_EXAMPLE_TWO))); EXPECT_CALL (*gmockWrapperForBar, resetKey (Eq (KEY_EXAMPLE_THREE))); ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault (backend.get (), context.get (), pluginsWithChangedKeys.get (), "mock"); } namespace { const CCSBackendInfo stubBackendInfo = { "stub", "stub", "stub", FALSE, FALSE }; const CCSBackendInfo * stubBackendGetInfo (CCSBackend *backend) { return &stubBackendInfo; } Bool stubBackendInit (CCSBackend *backend, CCSContext *context) { return TRUE; } Bool stubBackendFini (CCSBackend *backend) { return TRUE; } CCSBackendInterface stubBackendInterface = { stubBackendGetInfo, NULL, stubBackendInit, stubBackendFini, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; } namespace { const std::string MOCK_PLUGIN_NAME ("mock"); const std::string MOCK_SCHEMA_NAME ("org.compiz.mock"); const std::string MOCK_PROFILE_NAME ("mock"); const std::string MOCK_GSCHEMA_PATH ("/org/compiz/profiles/mock/plugins/mock"); const std::string PLUGINS_WITH_SET_KEYS ("plugins-with-set-keys"); boost::shared_ptr GetEmptyPluginsWithSetKeys () { GVariantBuilder pluginsWithChangedKeysBuilder; g_variant_builder_init (&pluginsWithChangedKeysBuilder, G_VARIANT_TYPE ("as")); return AutoDestroy (g_variant_ref_sink (g_variant_builder_end (&pluginsWithChangedKeysBuilder)), g_variant_unref); } } class CCSGSettingsTestCCSGSettingsBackend : public CCSGSettingsTestIndependent { public: CCSGSettingsTestCCSGSettingsBackend () : mockContext (AutoDestroy (ccsMockContextNew (), ccsFreeMockContext)), stubBackend (AutoDestroy (ccsBackendNewWithDynamicInterface (mockContext.get (), &stubBackendInterface), ccsBackendUnref)), mockCompizconfigSettings (ccsMockGSettingsWrapperNew ()), mockCurrentProfileSettings (ccsMockGSettingsWrapperNew ()), mockWrapperFactory (ccsMockGSettingsWrapperFactoryNew ()), mockIntegration (ccsMockIntegrationBackendNew (&ccsDefaultObjectAllocator)), valueChangeData (reinterpret_cast (calloc (1, sizeof (CCSGNOMEValueChangeData)))), currentProfile (strdup (MOCK_PROFILE_NAME.c_str ())), mockMockPluginWrapper (ccsMockGSettingsWrapperNew ()), gmockWrapperFactory (reinterpret_cast (ccsObjectGetPrivate (mockWrapperFactory))), gmockWrapper (reinterpret_cast (ccsObjectGetPrivate (mockMockPluginWrapper))), gmockCurrentProfileSettings (reinterpret_cast (ccsObjectGetPrivate (mockCurrentProfileSettings))) { valueChangeData->integration = mockIntegration; valueChangeData->factory = NULL; valueChangeData->storage = NULL; valueChangeData->context = mockContext.get (); if (!ccsGSettingsBackendAttachNewToBackend (stubBackend.get (), mockContext.get (), mockCompizconfigSettings, mockCurrentProfileSettings, mockWrapperFactory, mockIntegration, valueChangeData, currentProfile)) throw std::runtime_error ("Failed to attach GSettings backend"); } virtual void TearDown () { ccsGSettingsBackendDetachFromBackend (stubBackend.get ()); CCSGSettingsTestIndependent::TearDown (); } boost::shared_ptr mockContext; boost::shared_ptr stubBackend; CCSGSettingsWrapper *mockCompizconfigSettings; CCSGSettingsWrapper *mockCurrentProfileSettings; CCSGSettingsWrapperFactory *mockWrapperFactory; CCSIntegration *mockIntegration; CCSGNOMEValueChangeData *valueChangeData; char *currentProfile; CCSGSettingsWrapper *mockMockPluginWrapper; CCSGSettingsWrapperFactoryGMock *gmockWrapperFactory; CCSGSettingsWrapperGMock *gmockWrapper; CCSGSettingsWrapperGMock *gmockCurrentProfileSettings; }; TEST_F (CCSGSettingsTestCCSGSettingsBackend, TestWriteOutSetKeysOnGetSettingsObject) { /* Should create a new wrapper for this "plugin" */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (Eq (MOCK_SCHEMA_NAME), Eq (MOCK_GSCHEMA_PATH), _)).WillOnce (Return (mockMockPluginWrapper)); EXPECT_CALL (*gmockWrapper, connectToChangedSignal (_, stubBackend.get ())); boost::shared_ptr pluginsWithSetKeysVariantEmpty (GetEmptyPluginsWithSetKeys ()); /* Should now get the value of plugins-with-set-keys from * mockCurrentProfileSettings */ EXPECT_CALL (*gmockCurrentProfileSettings, getValue (Eq (PLUGINS_WITH_SET_KEYS))) .WillOnce (Return (g_variant_ref (pluginsWithSetKeysVariantEmpty.get ()))); /* Should acknowledge that we wrote to this schema */ EXPECT_CALL (*gmockCurrentProfileSettings, setValue (Eq (PLUGINS_WITH_SET_KEYS), GVariantHasValueInArray ("s", MOCK_PLUGIN_NAME.c_str (), boost::bind (streq, _1, _2)))) .WillOnce (WithArgs <1> (Invoke (g_variant_unref)));; CCSGSettingsWrapper *wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); EXPECT_EQ (wrapper, mockMockPluginWrapper); } TEST_F (CCSGSettingsTestCCSGSettingsBackend, TestNoWriteOutSetKeysOnGetSettingsObjectIfAlreadyWritten) { /* Should create a new wrapper for this "plugin" */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (Eq (MOCK_SCHEMA_NAME), Eq (MOCK_GSCHEMA_PATH), _)).WillOnce (Return (mockMockPluginWrapper)); EXPECT_CALL (*gmockWrapper, connectToChangedSignal (_, stubBackend.get ())); GVariantBuilder pluginsWithChangedKeysBuilder; g_variant_builder_init (&pluginsWithChangedKeysBuilder, G_VARIANT_TYPE ("as")); g_variant_builder_add (&pluginsWithChangedKeysBuilder, "s", MOCK_PLUGIN_NAME.c_str ()); boost::shared_ptr pluginsWithSetKeysVariantNonEmpty (AutoDestroy (g_variant_ref_sink (g_variant_builder_end (&pluginsWithChangedKeysBuilder)), g_variant_unref)); /* Should now get the value of plugins-with-set-keys from * mockCurrentProfileSettings */ EXPECT_CALL (*gmockCurrentProfileSettings, getValue (Eq (PLUGINS_WITH_SET_KEYS))) .WillOnce (Return (g_variant_ref (pluginsWithSetKeysVariantNonEmpty.get ()))); /* No acknowledgement */ EXPECT_CALL (*gmockCurrentProfileSettings, setValue (_, _)).Times (0); CCSGSettingsWrapper *wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); EXPECT_EQ (wrapper, mockMockPluginWrapper); } TEST_F (CCSGSettingsTestCCSGSettingsBackend, TestReturnExistingWrapper) { /* Should create a new wrapper for this "plugin" */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (Eq (MOCK_SCHEMA_NAME), Eq (MOCK_GSCHEMA_PATH), _)).WillOnce (Return (mockMockPluginWrapper)); EXPECT_CALL (*gmockWrapper, connectToChangedSignal (_, stubBackend.get ())); boost::shared_ptr pluginsWithSetKeysVariantEmpty (GetEmptyPluginsWithSetKeys ()); /* Should now get the value of plugins-with-set-keys from * mockCurrentProfileSettings */ EXPECT_CALL (*gmockCurrentProfileSettings, getValue (Eq (PLUGINS_WITH_SET_KEYS))) .WillOnce (Return (g_variant_ref (pluginsWithSetKeysVariantEmpty.get ()))); /* Should acknowledge that we wrote to this schema */ EXPECT_CALL (*gmockCurrentProfileSettings, setValue (Eq (PLUGINS_WITH_SET_KEYS), _)) .WillOnce (WithArgs <1> (Invoke (g_variant_unref))); CCSGSettingsWrapper *wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); EXPECT_CALL (*gmockWrapper, getSchemaName ()).WillOnce (Return (MOCK_SCHEMA_NAME.c_str ())); /* Shouldn't be called again */ EXPECT_CALL (*gmockWrapperFactory, newGSettingsWrapperWithPath (_, _, _)).Times (0); wrapper = ccsGSettingsGetSettingsObjectForPluginWithPath (stubBackend.get (), MOCK_PLUGIN_NAME.c_str (), MOCK_GSCHEMA_PATH.c_str (), mockContext.get ()); /* It should return the cached one */ EXPECT_EQ (mockMockPluginWrapper, wrapper); } ./compizconfig/gsettings/tests/compizconfig_ccs_gsettings_settings_env_test.h0000644000004100000410000001016613246301623030515 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZCONFIG_CCS_GSETTINGS_SETTINGS_ENV_TEST_H #define _COMPIZCONFIG_CCS_GSETTINGS_SETTINGS_ENV_TEST_H #include #include #include "compizconfig_ccs_settings_test_fixture.h" typedef boost::shared_ptr GVariantShared; typedef struct _CCSSetting CCSSetting; typedef struct _CCSGSettingsWrapper CCSGSettingsWrapper; typedef enum _CCSSettingType CCSSettingType; class PrivateCCSGSettingsStorageEnv; class CCSGSettingsStorageEnv : public CCSSettingsConceptTestEnvironmentInterface { public: virtual ~CCSGSettingsStorageEnv () {} virtual void SetUp () {} virtual void TearDown () {} CCSGSettingsStorageEnv (CCSGSettingsWrapper *settings, const std::string &profileName); void WriteBoolAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteIntegerAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteFloatAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteStringAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteColorAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteKeyAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteButtonAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteEdgeAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteMatchAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteBellAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); void WriteListAtKey (const std::string &plugin, const std::string &key, const VariantTypes &value); Bool ReadBoolAtKey (const std::string &plugin, const std::string &key); int ReadIntegerAtKey (const std::string &plugin, const std::string &key); float ReadFloatAtKey (const std::string &plugin, const std::string &key); const char * ReadStringAtKey (const std::string &plugin, const std::string &key); CCSSettingColorValue ReadColorAtKey (const std::string &plugin, const std::string &key); CCSSettingKeyValue ReadKeyAtKey (const std::string &plugin, const std::string &key); CCSSettingButtonValue ReadButtonAtKey (const std::string &plugin, const std::string &key); unsigned int ReadEdgeAtKey (const std::string &plugin, const std::string &key); const char * ReadMatchAtKey (const std::string &plugin, const std::string &key); Bool ReadBellAtKey (const std::string &plugin, const std::string &key); CCSSettingValueList ReadListAtKey (const std::string &plugin, const std::string &key, CCSSetting *setting); private: GVariantShared ReadVariantAtKeyToShared (const std::string &plugin, const std::string &key, CCSSettingType type); std::auto_ptr priv; }; #endif ./compizconfig/gsettings/tests/backend-conformance-config.h.in0000644000004100000410000000011013246301623024773 0ustar www-datawww-data#define BACKEND_BINARY_PATH "@CMAKE_BINARY_DIR@/compizconfig/gsettings" ./compizconfig/gsettings/gsettings_backend_shared/0000755000004100000410000000000013246301623022745 5ustar www-datawww-data./compizconfig/gsettings/gsettings_backend_shared/CMakeLists.txt0000644000004100000410000000572713246301623025520 0ustar www-datawww-datainclude (FindPkgConfig) compiz_pkg_check_modules (GSETTINGS_UTIL ${_deps}) if (GSETTINGS_UTIL_FOUND) set (GSETTINGS_UTIL_LIB_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/include ${CMAKE_SOURCE_DIR}/compizconfig/integration/gnome/gsettings/include ${compiz_SOURCE_DIR}/compizconfig/libcompizconfig/include ${GSETTINGS_UTIL_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories (${GSETTINGS_UTIL_LIB_INCLUDES}) link_directories (${GSETTINGS_UTIL_LIBRARY_DIRS} ${compiz_BINARY_DIR}/compizconfig/libcompizconfig ${compiz_BINARY_DIR}/compizconfig/integration/gnome ${CMAKE_BINARY_DIR}/compizconfig/integration/gnome/gsettings) add_library (compizconfig_gsettings_backend_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend_interface.c) add_library (compizconfig_gsettings_wrapper_factory_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory_interface.c) add_library (compizconfig_gsettings_wrapper_factory STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_wrapper_factory.c) add_library (compizconfig_gsettings_wrapper_interface STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_interface.c) add_library (compizconfig_gsettings_wrapper STATIC ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_interface_wrapper.c) target_link_libraries (compizconfig_gsettings_wrapper compizconfig ${GSETTINGS_UTIL_LIBRARIES}) add_library (compizconfig_gsettings_util STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gsettings_constants.c ${CMAKE_CURRENT_SOURCE_DIR}/gsettings_util.c) target_link_libraries (compizconfig_gsettings_util compizconfig_gsettings_backend_interface compizconfig_gsettings_wrapper_interface compizconfig ${GSETTINGS_UTIL_LIBRARIES}) add_library (compizconfig_gsettings_backend SHARED ${CMAKE_CURRENT_SOURCE_DIR}/ccs_gsettings_backend.c) set (GSETTINGS_BACKEND_SHARED_ADDITIONAL_LIBRARIES compizconfig_gsettings_backend_interface compizconfig_gsettings_util compizconfig_gsettings_wrapper compizconfig_gnome_integration compizconfig_gnome_integration_gsettings_integrated_setting compizconfig_gnome_integration_gsettings_setting_factory compizconfig_gnome_integration_gsettings_wrapper_factory compizconfig_gsettings_wrapper_factory_interface compizconfig_gsettings_wrapper_factory compizconfig) target_link_libraries (compizconfig_gsettings_backend ${GSETTINGS_BACKEND_SHARED_ADDITIONAL_LIBRARIES} ${GSETTINGS_UTIL_LIBRARIES}) install (TARGETS compizconfig_gsettings_backend DESTINATION ${libdir}) endif (GSETTINGS_UTIL_FOUND) ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory.c0000644000004100000410000000620013246301623031235 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" /* CCSGSettingsWrapperFactory implementation */ typedef struct _CCSGSettingsWrapperFactoryPrivate CCSGSettingsWrapperFactoryPrivate; struct _CCSGSettingsWrapperFactoryPrivate { }; static void ccsGSettingsWrapperDefaultImplFree (CCSGSettingsWrapperFactory *wrapperFactory) { ccsObjectFinalize (wrapperFactory); (*wrapperFactory->object.object_allocation->free_) (wrapperFactory->object.object_allocation->allocator, wrapperFactory); } static CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperDefault (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperNewForSchema (schemaName, ai); return wrapper; } CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPathDefault (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = ccsGSettingsWrapperNewForSchemaWithPath (schemaName, path, ai); return wrapper; } const CCSGSettingsWrapperFactoryInterface ccsGSettingsWrapperFactoryInterface = { ccsGSettingsWrapperFactoryNewGSettingsWrapperDefault, ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPathDefault, ccsGSettingsWrapperDefaultImplFree }; CCSGSettingsWrapperFactory * ccsGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai) { CCSGSettingsWrapperFactory *wrapperFactory = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactory)); if (!wrapperFactory) return NULL; CCSGSettingsWrapperFactoryPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapperFactoryPrivate)); if (!priv) { (*ai->free_) (ai->allocator, wrapperFactory); return NULL; } ccsObjectInit (wrapperFactory, ai); ccsObjectAddInterface (wrapperFactory, (const CCSInterface *) &ccsGSettingsWrapperFactoryInterface, GET_INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface)); ccsObjectSetPrivate (wrapperFactory, (CCSPrivate *) priv); ccsGSettingsWrapperFactoryRef (wrapperFactory); return wrapperFactory; } ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface_wrapper.c0000644000004100000410000002270213246301623031533 0ustar www-datawww-data#include #include #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gsettings_interface.h" typedef struct _CCSGSettingsWrapperPrivate CCSGSettingsWrapperPrivate; struct _CCSGSettingsWrapperPrivate { GSettings *settings; char *schema; char *path; }; #define GSETTINGS_WRAPPER_PRIVATE(w) \ CCSGSettingsWrapperPrivate *gswPrivate = (CCSGSettingsWrapperPrivate *) ccsObjectGetPrivate (w); static Bool keyIsValid (GSettings *settings, const char *key) { GSettingsSchema *schema; Bool valid = FALSE; if (!settings) return valid; g_object_get (settings, "settings-schema", &schema, NULL); if (schema) { valid = g_settings_schema_has_key (schema, key); g_settings_schema_unref (schema); } return valid; } static GVariant * ccsGSettingsWrapperGetValueDefault (CCSGSettingsWrapper *wrapper, const char *key) { GSETTINGS_WRAPPER_PRIVATE (wrapper); if (keyIsValid (gswPrivate->settings, key)) return g_settings_get_value (gswPrivate->settings, key); else return NULL; } static void ccsGSettingsWrapperSetValueDefault (CCSGSettingsWrapper *wrapper, const char *key, GVariant *variant) { GSETTINGS_WRAPPER_PRIVATE (wrapper); if (keyIsValid (gswPrivate->settings, key)) g_settings_set_value (gswPrivate->settings, key, variant); } static void ccsGSettingsWrapperResetKeyDefault (CCSGSettingsWrapper *wrapper, const char *key) { GSETTINGS_WRAPPER_PRIVATE (wrapper); if (keyIsValid (gswPrivate->settings, key)) g_settings_reset (gswPrivate->settings, key); } static char ** ccsGSettingsWrapperListKeysDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return g_settings_list_keys (gswPrivate->settings); } static GSettings * ccsGSettingsWrapperGetGSettingsDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return gswPrivate->settings; } static const char * ccsGSettingsWrapperGetSchemaNameDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return gswPrivate->schema; } static const char * ccsGSettingsWrapperGetPathDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); return gswPrivate->path; } void ccsGSettingsWrapperConnectToChangedSignalDefault (CCSGSettingsWrapper *wrapper, GCallback callback, gpointer data) { GSETTINGS_WRAPPER_PRIVATE (wrapper); g_signal_connect (gswPrivate->settings, "changed", callback, data); } static void ccsFreeGSettingsWrapperDefault (CCSGSettingsWrapper *wrapper) { GSETTINGS_WRAPPER_PRIVATE (wrapper); if (gswPrivate->settings) g_object_unref (gswPrivate->settings); if (gswPrivate->path) (*wrapper->object.object_allocation->free_) (wrapper->object.object_allocation->allocator, gswPrivate->path); if (gswPrivate->schema) (*wrapper->object.object_allocation->free_) (wrapper->object.object_allocation->allocator, gswPrivate->schema); ccsObjectFinalize (wrapper); (*wrapper->object.object_allocation->free_) (wrapper->object.object_allocation->allocator, wrapper); } const CCSGSettingsWrapperInterface interface = { ccsGSettingsWrapperSetValueDefault, ccsGSettingsWrapperGetValueDefault, ccsGSettingsWrapperResetKeyDefault, ccsGSettingsWrapperListKeysDefault, ccsGSettingsWrapperGetGSettingsDefault, ccsGSettingsWrapperGetSchemaNameDefault, ccsGSettingsWrapperGetPathDefault, ccsGSettingsWrapperConnectToChangedSignalDefault, ccsFreeGSettingsWrapperDefault }; static CCSGSettingsWrapperPrivate * allocatePrivateWrapper (CCSObjectAllocationInterface *ai, CCSGSettingsWrapper *wrapper) { CCSGSettingsWrapperPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapper)); if (!priv) { (*ai->free_) (ai->allocator, wrapper); return NULL; } return priv; } static CCSGSettingsWrapper * allocateWrapper (CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsWrapper)); if (!wrapper) return NULL; return wrapper; } static void freeWrapperAndPriv (CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { (*ai->free_) (ai->allocator, priv); (*ai->free_) (ai->allocator, wrapper); } static gpointer listAllRelocatableSchemas (gpointer data) { return (gpointer) g_settings_list_relocatable_schemas (); } static inline const gchar * const * listAllRelocatableSchemasOnce () { static GOnce get_settings_once = G_ONCE_INIT; g_once (&get_settings_once, listAllRelocatableSchemas, NULL); return (const gchar * const *) get_settings_once.retval; } static gpointer listAllSchemas (gpointer data) { return (gpointer) g_settings_list_schemas (); } static inline const gchar * const * listAllSchemasOnce () { static GOnce get_settings_once = G_ONCE_INIT; g_once (&get_settings_once, listAllSchemas, NULL); return (const gchar * const *) get_settings_once.retval; } typedef void * GSettingsConstructorFuncUserData; typedef GSettings * (*GSettingsConstructorFunc) (const gchar *, GSettingsConstructorFuncUserData); static inline GSettings * ccsGSettingsNewNoPath (const gchar *schema, GSettingsConstructorFuncUserData data) { (void) data; return g_settings_new (schema); } static inline GSettings * ccsGSettingsNewWithPathFromUserData (const gchar *schema, GSettingsConstructorFuncUserData data) { return g_settings_new_with_path (schema, (const gchar *) data); } static inline GSettings * ccsGSettingsNewGSettingsFuncNoAbort (const gchar *schema, const gchar * const *schemas, GSettingsConstructorFunc func, GSettingsConstructorFuncUserData data) { guint i = 0; for (; schemas[i]; ++i) if (g_strcmp0 (schema, schemas[i]) == 0) return (*func) (schema, data); return NULL; } static inline GSettings * ccsGSettingsNewGSettingsWithPathNoAbort (const gchar *schema, const gchar *path) { const gchar * const *schemas = listAllRelocatableSchemasOnce (); return ccsGSettingsNewGSettingsFuncNoAbort (schema, schemas, ccsGSettingsNewWithPathFromUserData, (GSettingsConstructorFuncUserData) path); } static inline GSettings * ccsGSettingsNewGSettingsNoAbort (const gchar *schema) { const gchar * const *schemas = listAllSchemasOnce (); return ccsGSettingsNewGSettingsFuncNoAbort (schema, schemas, ccsGSettingsNewNoPath, NULL); } static GSettings * newGSettingsWithPath (const char *schema, const char *path, CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { GSettings *settings = ccsGSettingsNewGSettingsWithPathNoAbort (schema, path); if (!settings) { freeWrapperAndPriv (wrapper, priv, ai); return NULL; } return settings; } static GSettings * newGSettings (const char *schema, CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { GSettings *settings = ccsGSettingsNewGSettingsNoAbort (schema); if (!settings) { freeWrapperAndPriv (wrapper, priv, ai); return NULL; } return settings; } static Bool allocateWrapperData (CCSObjectAllocationInterface *ai, CCSGSettingsWrapper **wrapper, CCSGSettingsWrapperPrivate **priv) { *wrapper = allocateWrapper (ai); if (!*wrapper) return FALSE; *priv = allocatePrivateWrapper (ai, *wrapper); if (!*priv) return FALSE; return TRUE; } static void initCCSGSettingsWrapperObject (CCSGSettingsWrapper *wrapper, CCSGSettingsWrapperPrivate *priv, CCSObjectAllocationInterface *ai) { ccsObjectInit (wrapper, ai); ccsObjectAddInterface (wrapper, (const CCSInterface *) &interface, GET_INTERFACE_TYPE (CCSGSettingsWrapperInterface)); ccsObjectSetPrivate (wrapper, (CCSPrivate *) priv); ccsGSettingsWrapperRef (wrapper); } CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchemaWithPath (const char *schema, const char *path, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = NULL; CCSGSettingsWrapperPrivate *priv = NULL; GSettings *settings = NULL; if (!allocateWrapperData (ai, &wrapper, &priv)) return NULL; settings = newGSettingsWithPath (schema, path, wrapper, priv, ai); if (!settings) return NULL; priv->schema = g_strdup (schema); priv->path = g_strdup (path); priv->settings = settings; initCCSGSettingsWrapperObject (wrapper, priv, ai); return wrapper; } CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchema (const char *schema, CCSObjectAllocationInterface *ai) { CCSGSettingsWrapper *wrapper = NULL; CCSGSettingsWrapperPrivate *priv = NULL; GSettings *settings = NULL; if (!allocateWrapperData (ai, &wrapper, &priv)) return NULL; settings = newGSettings (schema, wrapper, priv, ai); if (!settings) return NULL; priv->schema = g_strdup (schema); priv->settings = settings; GValue pathValue = G_VALUE_INIT; g_value_init (&pathValue, G_TYPE_STRING); g_object_get_property (G_OBJECT (priv->settings), "path", &pathValue); priv->path = g_value_dup_string (&pathValue); g_value_unset (&pathValue); initCCSGSettingsWrapperObject (wrapper, priv, ai); return wrapper; } ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_interface.h0000644000004100000410000001311513246301623031445 0ustar www-datawww-data#ifndef _COMPIZCONFIG_GSETTINGS_BACKEND_INTERFACE_H #define _COMPIZCONFIG_GSETTINGS_BACKEND_INTERFACE_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGSettingsBackendInterface CCSGSettingsBackendInterface; typedef CCSContext * (*CCSGSettingsBackendGetContext) (CCSBackend *); typedef void (*CCSGSettingsBackendConnectToChangedSignal) (CCSBackend *, CCSGSettingsWrapper *); typedef CCSGSettingsWrapper * (*CCSGSettingsBackendGetSettingsObjectForPluginWithPath) (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context); typedef const char * (*CCSGSettingsBackendGetCurrentProfile) (CCSBackend *backend); typedef GVariant * (*CCSGSettingsBackendGetExistingProfiles) (CCSBackend *backend); typedef void (*CCSGSettingsBackendSetExistingProfiles) (CCSBackend *backend, GVariant *value); typedef void (*CCSGSettingsBackendSetCurrentProfile) (CCSBackend *backend, const gchar *value); typedef GVariant * (*CCSGSettingsBackendGetPluginsWithSetKeys) (CCSBackend *backend); typedef void (*CCSGSettingsBackendClearPluginsWithSetKeys) (CCSBackend *backend); typedef void (*CCSGSettingsBackendUnsetAllChangedPluginKeysInProfile) (CCSBackend *backend, CCSContext *, GVariant *, const char *); typedef gboolean (*CCSGSettingsBackendUpdateProfile) (CCSBackend *, CCSContext *); typedef void (*CCSGSettingsBackendUpdateCurrentProfileName) (CCSBackend *backend, const char *profile); typedef gboolean (*CCSGSettingsBackendAddProfile) (CCSBackend *backend, const char *profile); typedef CCSIntegratedSetting * (*CCSGSettingsBackendGetIntegratedSetting) (CCSBackend *backend, CCSSetting *setting); typedef Bool (*CCSGSettingsBackendReadIntegratedOption) (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *); typedef void (*CCSGSettingsBackendWriteIntegratedOption) (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *); /** * @brief The _CCSGSettingsBackendInterface struct * * This interface represents a loaded CCSGSettingsBackend and some of the * special operations that go with it. It is mainly an interface that * exists for testing purposes - there are some operations which we * want to mock out or replace since they can't be done in testing mode. * * CCSGSettingsBackendInterface isn't an interface that is implemented * by any objects itself - it is attached to an existing CCSBackend * at runtime, and the CCSBackend is passed to any utility functions in * the GSettings backend. */ struct _CCSGSettingsBackendInterface { CCSGSettingsBackendGetContext gsettingsBackendGetContext; CCSGSettingsBackendConnectToChangedSignal gsettingsBackendConnectToChangedSignal; CCSGSettingsBackendGetSettingsObjectForPluginWithPath gsettingsBackendGetSettingsObjectForPluginWithPath; CCSGSettingsBackendGetCurrentProfile gsettingsBackendGetCurrentProfile; CCSGSettingsBackendGetExistingProfiles gsettingsBackendGetExistingProfiles; CCSGSettingsBackendSetExistingProfiles gsettingsBackendSetExistingProfiles; CCSGSettingsBackendSetCurrentProfile gsettingsBackendSetCurrentProfile; CCSGSettingsBackendGetPluginsWithSetKeys gsettingsBackendGetPluginsWithSetKeys; CCSGSettingsBackendClearPluginsWithSetKeys gsettingsBackendClearPluginsWithSetKeys; CCSGSettingsBackendUnsetAllChangedPluginKeysInProfile gsettingsBackendUnsetAllChangedPluginKeysInProfile; CCSGSettingsBackendUpdateProfile gsettingsBackendUpdateProfile; CCSGSettingsBackendUpdateCurrentProfileName gsettingsBackendUpdateCurrentProfileName; CCSGSettingsBackendAddProfile gsettingsBackendAddProfile; CCSGSettingsBackendGetIntegratedSetting gsettingsBackendGetIntegratedSetting; CCSGSettingsBackendReadIntegratedOption gsettingsBackendReadIntegratedOption; CCSGSettingsBackendWriteIntegratedOption gsettingsBackendWriteIntegratedOption; }; unsigned int ccsCCSGSettingsBackendInterfaceGetType (); gboolean ccsGSettingsBackendUpdateProfile (CCSBackend *backend, CCSContext *context); void ccsGSettingsBackendUpdateCurrentProfileName (CCSBackend *backend, const char *profile); CCSContext * ccsGSettingsBackendGetContext (CCSBackend *backend); void ccsGSettingsBackendConnectToChangedSignal (CCSBackend *backend, CCSGSettingsWrapper *object); CCSGSettingsWrapper * ccsGSettingsGetSettingsObjectForPluginWithPath (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context); const char * ccsGSettingsBackendGetCurrentProfile (CCSBackend *backend); GVariant * ccsGSettingsBackendGetExistingProfiles (CCSBackend *backend); void ccsGSettingsBackendSetExistingProfiles (CCSBackend *backend, GVariant *value); void ccsGSettingsBackendSetCurrentProfile (CCSBackend *backend, const gchar *value); GVariant * ccsGSettingsBackendGetPluginsWithSetKeys (CCSBackend *backend); void ccsGSettingsBackendClearPluginsWithSetKeys (CCSBackend *backend); void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (CCSBackend *backend, CCSContext *context, GVariant *pluginKeys, const char *profile); void ccsGSettingsBackendAddProfile (CCSBackend *backend, const char *profile); CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedSetting (CCSBackend *backend, CCSSetting *setting); Bool ccsGSettingsBackendReadIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated); void ccsGSettingsBackendWriteIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated); COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory_interface.h0000644000004100000410000000525313246301623033271 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory_interface.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_GSETTINGS_WRAPPER_FACTORY_INTERFACE_H #define _CCS_GSETTINGS_WRAPPER_FACTORY_INTERFACE_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include typedef struct _CCSGSettingsWrapperFactoryInterface CCSGSettingsWrapperFactoryInterface; typedef CCSGSettingsWrapper * (*CCSGSettingsWrapperFactoryNewGSettingsWrapper) (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, CCSObjectAllocationInterface *ai); typedef CCSGSettingsWrapper * (*CCSGSettingsWrapperFactoryNewGSettingsWrapperWithPath) (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, const gchar *path, CCSObjectAllocationInterface *ai); typedef void (*CCSGSettingsWrapperFactoryFree) (CCSGSettingsWrapperFactory *wrapperFactory); struct _CCSGSettingsWrapperFactoryInterface { CCSGSettingsWrapperFactoryNewGSettingsWrapper newGSettingsWrapper; CCSGSettingsWrapperFactoryNewGSettingsWrapperWithPath newGSettingsWrapperWithPath; CCSGSettingsWrapperFactoryFree free; }; /** * @brief The _CCSGSettingsWrapperFactory struct * * Will create new CCSGSettingsIntegratedSetting objects on demand */ struct _CCSGSettingsWrapperFactory { CCSObject object; }; unsigned int ccsCCSGSettingsWrapperFactoryInterfaceGetType (); CCSREF_HDR (GSettingsWrapperFactory, CCSGSettingsWrapperFactory); CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *wrapperFactory, const gchar *schema, CCSObjectAllocationInterface *ai); CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/gsettings_shared.h0000644000004100000410000000121013246301623026445 0ustar www-datawww-data#ifndef _COMPIZCONFIG_GSETTINGS_SHARED_H #define _COMPIZCONFIG_GSETTINGS_SHARED_H #include G_BEGIN_DECLS #include #include #include #include #include #include #include "gsettings_util.h" extern const char * const PLUGIN_SCHEMA_ID_PREFIX; extern const char * const COMPIZCONFIG_SCHEMA_ID; extern const char * const COMPIZCONFIG_PATH; extern const char * const PROFILE_SCHEMA_ID; extern const char * const PROFILE_PATH_PREFIX; extern const char * const DEFAULTPROF; extern const unsigned int MAX_GSETTINGS_KEY_SIZE; extern const unsigned int BUFSIZE; G_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_interface.c0000644000004100000410000000741313246301623031444 0ustar www-datawww-data#include #include "ccs_gsettings_backend_interface.h" INTERFACE_TYPE (CCSGSettingsBackendInterface); CCSContext * ccsGSettingsBackendGetContext (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetContext) (backend); } void ccsGSettingsBackendConnectToChangedSignal (CCSBackend *backend, CCSGSettingsWrapper *object) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendConnectToChangedSignal) (backend, object); } CCSGSettingsWrapper * ccsGSettingsGetSettingsObjectForPluginWithPath (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetSettingsObjectForPluginWithPath) (backend, plugin, path, context); } const char * ccsGSettingsBackendGetCurrentProfile (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetCurrentProfile) (backend); } GVariant * ccsGSettingsBackendGetExistingProfiles (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetExistingProfiles) (backend); } void ccsGSettingsBackendSetExistingProfiles (CCSBackend *backend, GVariant *value) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendSetExistingProfiles) (backend, value); } void ccsGSettingsBackendSetCurrentProfile (CCSBackend *backend, const gchar *value) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendSetCurrentProfile) (backend, value); } GVariant * ccsGSettingsBackendGetPluginsWithSetKeys (CCSBackend *backend) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetPluginsWithSetKeys) (backend); } void ccsGSettingsBackendClearPluginsWithSetKeys (CCSBackend *backend) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendClearPluginsWithSetKeys) (backend); } void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (CCSBackend *backend, CCSContext *context, GVariant *pluginKeys, const char *profile) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendUnsetAllChangedPluginKeysInProfile) (backend, context, pluginKeys, profile); } gboolean ccsGSettingsBackendUpdateProfile (CCSBackend *backend, CCSContext *context) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendUpdateProfile) (backend, context); } void ccsGSettingsBackendUpdateCurrentProfileName (CCSBackend *backend, const char *profile) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendUpdateCurrentProfileName) (backend, profile); } void ccsGSettingsBackendAddProfile (CCSBackend *backend, const char *profile) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendAddProfile) (backend, profile); } CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedSetting (CCSBackend *backend, CCSSetting *setting) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendGetIntegratedSetting) (backend, setting); } Bool ccsGSettingsBackendReadIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { return (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendReadIntegratedOption) (backend, setting, integrated); } void ccsGSettingsBackendWriteIntegratedOption (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { (*(GET_INTERFACE (CCSGSettingsBackendInterface, backend))->gsettingsBackendWriteIntegratedOption) (backend, setting, integrated); } ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory_interface.c0000644000004100000410000000344513246301623033265 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory_interface.c * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #include #include "ccs_gsettings_wrapper_factory_interface.h" INTERFACE_TYPE (CCSGSettingsWrapperFactoryInterface); CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapper (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, CCSObjectAllocationInterface *ai) { return (*(GET_INTERFACE (CCSGSettingsWrapperFactoryInterface, factory))->newGSettingsWrapper) (factory, schemaName, ai); } CCSGSettingsWrapper * ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (CCSGSettingsWrapperFactory *factory, const gchar *schemaName, const gchar *path, CCSObjectAllocationInterface *ai) { return (*(GET_INTERFACE (CCSGSettingsWrapperFactoryInterface, factory))->newGSettingsWrapperWithPath) (factory, schemaName, path, ai); } void ccsFreeGSettingsWrapperFactory (CCSGSettingsWrapperFactory *factory) { return (*(GET_INTERFACE (CCSGSettingsWrapperFactoryInterface, factory))->free) (factory); } CCSREF_OBJ (GSettingsWrapperFactory, CCSGSettingsWrapperFactory) ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend_fwd.h0000644000004100000410000000055713246301623030273 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_FWD_H #define _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_FWD_H #include COMPIZCONFIG_BEGIN_DECLS typedef struct _CCSGSettingsWrapper CCSGSettingsWrapper; typedef struct _CCSGSettingsBackend CCSGSettingsBackend; typedef struct _CCSGSettingsWrapperFactory CCSGSettingsWrapperFactory; COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/gsettings_util.h0000644000004100000410000001324413246301623026166 0ustar www-datawww-data#ifndef _COMPIZ_GSETTINGS_UTIL_H #define _COMPIZ_GSETTINGS_UTIL_H #include #include COMPIZCONFIG_BEGIN_DECLS #include #include #include /* some forward declarations */ void ccsGSettingsValueChanged (GSettings *settings, gchar *keyname, gpointer user_data); void ccsGSettingsWriteIntegratedOption (CCSBackend *backend, CCSContext *context, CCSSetting *setting, int index); CCSStringList ccsGSettingsGetExistingProfiles (CCSBackend *backend, CCSContext *context); void ccsGSettingsSetIntegration (CCSBackend *backend, CCSIntegration *integration); typedef struct _CCSGSettingsBackendPrivate CCSGSettingsBackendPrivate; extern const CCSBackendInfo gsettingsBackendInfo; gchar * getSchemaNameForPlugin (const char *plugin); char * truncateKeyForGSettings (const char *gsettingName); char * translateUnderscoresToDashesForGSettings (const char *truncated); void translateToLowercaseForGSettings (char *name); gchar * translateKeyForGSettings (const char *gsettingName); gchar * translateKeyForCCS (const char *gsettingName); gboolean compizconfigTypeHasVariantType (CCSSettingType t); gboolean decomposeGSettingsPath (const char *path, char **pluginName, unsigned int *screenNum); gboolean variantIsValidForCCSType (GVariant *gsettingsValue, CCSSettingType settingType); Bool appendToPluginsWithSetKeysList (const gchar *plugin, GVariant *writtenPlugins, char ***newWrittenPlugins, gsize *newWrittenPluginsSize); CCSGSettingsWrapper * findCCSGSettingsWrapperBySchemaName (const gchar *schemaName, GList *iter); CCSSettingList filterAllSettingsMatchingType (CCSSettingType type, CCSSettingList settingList); CCSSettingList filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase (const gchar *keyName, CCSSettingList sList); CCSSetting * attemptToFindCCSSettingFromLossyName (CCSSettingList settingList, const gchar *lossyName, CCSSettingType type); Bool findSettingAndPluginToUpdateFromPath (CCSGSettingsWrapper *settings, const char *path, const gchar *keyName, CCSContext *context, CCSPlugin **plugin, CCSSetting **setting, char **uncleanKeyName); Bool updateSettingWithGSettingsKeyName (CCSBackend *backend, CCSGSettingsWrapper *settings, const gchar *keyName, CCSBackendUpdateFunc updateSetting); GList * variantTypeToPossibleSettingType (const gchar *vt); gchar * makeCompizProfilePath (const gchar *profilename); gchar * makeCompizPluginPath (const gchar *profileName, const gchar *pluginName); gchar * getNameForCCSSetting (CCSSetting *setting); Bool checkReadVariantIsValid (GVariant *gsettingsValue, CCSSettingType type, const gchar *pathName, const gchar *key); GVariant * getVariantAtKey (CCSGSettingsWrapper *settings, const char *key, const char *pathName, CCSSettingType type); const char * readStringFromVariant (GVariant *gsettingsValue); int readIntFromVariant (GVariant *gsettingsValue); Bool readBoolFromVariant (GVariant *gsettingsValue); float readFloatFromVariant (GVariant *gsettingsValue); CCSSettingColorValue readColorFromVariant (GVariant *gsettingsValue, Bool *success); CCSSettingKeyValue readKeyFromVariant (GVariant *gsettingsValue, Bool *success); CCSSettingButtonValue readButtonFromVariant (GVariant *gsettingsValue, Bool *success); unsigned int readEdgeFromVariant (GVariant *gsettingsValue); CCSSettingValueList readListValue (GVariant *gsettingsValue, CCSSetting *setting, CCSObjectAllocationInterface *allocator); Bool writeListValue (CCSSettingValueList list, CCSSettingType listType, GVariant **gsettingsValue); Bool writeStringToVariant (const char *value, GVariant **variant); Bool writeFloatToVariant (float value, GVariant **variant); Bool writeIntToVariant (int value, GVariant **variant); Bool writeBoolToVariant (Bool value, GVariant **variant); Bool writeColorToVariant (CCSSettingColorValue value, GVariant **variant); Bool writeKeyToVariant (CCSSettingKeyValue key, GVariant **variant); Bool writeButtonToVariant (CCSSettingButtonValue button, GVariant **variant); Bool writeEdgeToVariant (unsigned int edges, GVariant **variant); Bool writeVariantToKey (CCSGSettingsWrapper *settings, const char *key, GVariant *value); typedef int (*ComparisonPredicate) (const void *s1, const void *s2); int voidcmp0 (const void *v1, const void *v2); gboolean deleteProfile (CCSBackend *backend, CCSContext *context, const char *profile); gboolean appendStringToVariantIfUnique (GVariant **variant, const char *string); gboolean removeItemFromVariant (GVariant **variant, const char *string); CCSSettingValueList readBoolListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readIntListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readFloatListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readStringListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); CCSSettingValueList readColorListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *allocator); gchar * makeSettingPath (const char *currentProfile, CCSSetting *setting); CCSGSettingsWrapper * getSettingsObjectForCCSSetting (CCSBackend *backend, CCSSetting *setting); void resetOptionToDefault (CCSBackend *backend, CCSSetting * setting); COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface.h0000644000004100000410000000547113246301623030004 0ustar www-datawww-data#ifndef _CCS_GSETTINGS_INTERFACE_H #define _CCS_GSETTINGS_INTERFACE_H #include COMPIZCONFIG_BEGIN_DECLS #include #include #include #include typedef struct _CCSGSettingsWrapperInterface CCSGSettingsWrapperInterface; typedef void (*CCSGSettingsWrapperSetValue) (CCSGSettingsWrapper *, const char *, GVariant *); typedef GVariant * (*CCSGSettingsWrapperGetValue) (CCSGSettingsWrapper *, const char *); typedef void (*CCSGSettingsWrapperResetKey) (CCSGSettingsWrapper *, const char *); typedef char ** (*CCSGSettingsWrapperListKeys) (CCSGSettingsWrapper *); typedef GSettings * (*CCSGSettingsWrapperGetGSettings) (CCSGSettingsWrapper *); typedef const char * (*CCSGSettingsWrapperGetSchemaName) (CCSGSettingsWrapper *); typedef const char * (*CCSGSettingsWrapperGetPath) (CCSGSettingsWrapper *); typedef void (*CCSGSettingsWrapperConnectToChangedSignal) (CCSGSettingsWrapper *, GCallback, gpointer); typedef void (*CCSGSettingsWrapperFree) (CCSGSettingsWrapper *); struct _CCSGSettingsWrapperInterface { CCSGSettingsWrapperSetValue gsettingsWrapperSetValue; CCSGSettingsWrapperGetValue gsettingsWrapperGetValue; CCSGSettingsWrapperResetKey gsettingsWrapperResetKey; CCSGSettingsWrapperListKeys gsettingsWrapperListKeys; CCSGSettingsWrapperGetGSettings gsettingsWrapperGetGSettings; CCSGSettingsWrapperGetSchemaName gsettingsWrapperGetSchemaName; CCSGSettingsWrapperGetPath gsettingsWrapperGetPath; CCSGSettingsWrapperConnectToChangedSignal gsettingsWrapperConnectToChangedSignal; CCSGSettingsWrapperFree gsettingsWrapperFree; }; /** * @brief The _CCSGSettingsWrapper struct * * A wrapper around GSettings. * * This wrapper exists for testing purposes and presents the subset * of interface that we wish to use from GSettings anways. It does not * have any of the typed functions and it is the programmer's responsibility * to supply a GVariant to setValue and getValue that is valid. */ struct _CCSGSettingsWrapper { CCSObject object; }; void ccsGSettingsWrapperSetValue (CCSGSettingsWrapper *, const char *, GVariant *); GVariant * ccsGSettingsWrapperGetValue (CCSGSettingsWrapper *, const char *); void ccsGSettingsWrapperResetKey (CCSGSettingsWrapper *, const char *); char **ccsGSettingsWrapperListKeys (CCSGSettingsWrapper *); GSettings * ccsGSettingsWrapperGetGSettings (CCSGSettingsWrapper *); const char * ccsGSettingsWrapperGetSchemaName (CCSGSettingsWrapper *); const char * ccsGSettingsWrapperGetPath (CCSGSettingsWrapper *); void ccsGSettingsWrapperConnectToChangedSignal (CCSGSettingsWrapper *, GCallback, gpointer); void ccsFreeGSettingsWrapper (CCSGSettingsWrapper *wrapper); unsigned int ccsCCSGSettingsWrapperInterfaceGetType (); CCSREF_HDR (GSettingsWrapper, CCSGSettingsWrapper); COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface_wrapper.h0000644000004100000410000000075413246301623031543 0ustar www-datawww-data#ifndef _CCS_GSETTINGS_INTERFACE_WRAPPER_H #define _CCS_GSETTINGS_INTERFACE_WRAPPER_H #include #include #include COMPIZCONFIG_BEGIN_DECLS CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchemaWithPath (const char *schema, const char *path, CCSObjectAllocationInterface *ai); CCSGSettingsWrapper * ccsGSettingsWrapperNewForSchema (const char *schema, CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend.h0000644000004100000410000000266713246301623027437 0ustar www-datawww-data#ifndef _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_H #define _COMPIZCONFIG_CCS_GSETTINGS_BACKEND_H #include #include #include #include #include COMPIZCONFIG_BEGIN_DECLS Bool ccsGSettingsBackendAttachNewToBackend (CCSBackend *backend, CCSContext *context, CCSGSettingsWrapper *compizconfigSettings, CCSGSettingsWrapper *currentProfileSettings, CCSGSettingsWrapperFactory *wrapperFactory, CCSIntegration *integration, CCSGNOMEValueChangeData *valueChangeData, char *currentProfile); void ccsGSettingsBackendDetachFromBackend (CCSBackend *backend); /* Default implementations, should be moved */ void ccsGSettingsBackendUpdateCurrentProfileNameDefault (CCSBackend *backend, const char *profile); gboolean ccsGSettingsBackendUpdateProfileDefault (CCSBackend *backend, CCSContext *context); void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault (CCSBackend *backend, CCSContext *context, GVariant *pluginsWithChangedKeys, const char * profile); gboolean ccsGSettingsBackendAddProfileDefault (CCSBackend *backend, const char *profile); void ccsGSettingsSetIntegration (CCSBackend *backend, CCSIntegration *integration); COMPIZCONFIG_END_DECLS #endif ./compizconfig/gsettings/gsettings_backend_shared/gsettings_constants.c0000644000004100000410000000072013246301623027213 0ustar www-datawww-data#include "gsettings_shared.h" const unsigned int BUFSIZE = 512; const char * const COMPIZCONFIG_SCHEMA_ID = "org.compiz"; const char * const COMPIZCONFIG_PATH = "/org/compiz/"; const char * const PLUGIN_SCHEMA_ID_PREFIX = "org.compiz."; const char * const PROFILE_SCHEMA_ID = "org.compiz.profile"; const char * const PROFILE_PATH_PREFIX = "/org/compiz/profiles/"; const char * const DEFAULTPROF = "Default"; const unsigned int MAX_GSETTINGS_KEY_SIZE = 1024; ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_backend.c0000644000004100000410000003432413246301623027425 0ustar www-datawww-data#include #include #include #include #include "ccs_gsettings_backend.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" #include "ccs_gsettings_wrapper_factory_interface.h" #include "ccs_gnome_integration.h" #include "ccs_gnome_integration_gsettings_integrated_setting_factory.h" #include "gsettings_shared.h" struct _CCSGSettingsBackendPrivate { GList *settingsList; CCSGSettingsWrapper *compizconfigSettings; CCSGSettingsWrapper *currentProfileSettings; CCSGSettingsWrapperFactory *wrapperFactory; char *currentProfile; CCSContext *context; CCSIntegration *integration; CCSGNOMEValueChangeData *valueChangeData; }; static void ccsGSettingsWrapperDestroyNotify (gpointer o) { ccsGSettingsWrapperUnref ((CCSGSettingsWrapper *) o); } void ccsGSettingsSetIntegration (CCSBackend *backend, CCSIntegration *integration) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); if (priv->integration) ccsIntegrationUnref (priv->integration); priv->integration = integration; ccsIntegrationRef (integration); } CCSStringList ccsGSettingsGetExistingProfiles (CCSBackend *backend, CCSContext *context) { GVariant *value; char *profile; GVariantIter iter; CCSStringList ret = NULL; CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsGSettingsBackendUpdateProfile (backend, context); value = ccsGSettingsWrapperGetValue (priv->compizconfigSettings, "existing-profiles"); g_variant_iter_init (&iter, value); while (g_variant_iter_loop (&iter, "s", &profile)) { CCSString *str = calloc (1, sizeof (CCSString)); str->value = strdup (profile); ccsStringRef (str); ret = ccsStringListAppend (ret, str); } g_variant_unref (value); return ret; } void ccsGSettingsValueChanged (GSettings *settings, gchar *keyName, gpointer user_data) { CCSBackend *backend = (CCSBackend *)user_data; GValue schemaNameValue = G_VALUE_INIT; CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); CCSBackendInterface *backendInterface = (CCSBackendInterface *) GET_INTERFACE (CCSBackendInterface, backend); g_value_init (&schemaNameValue, G_TYPE_STRING); g_object_get_property (G_OBJECT (settings), "schema-id", &schemaNameValue); const char *schemaName = g_value_get_string (&schemaNameValue); CCSGSettingsWrapper *wrapper = findCCSGSettingsWrapperBySchemaName (schemaName, priv->settingsList); g_value_unset (&schemaNameValue); if (wrapper) updateSettingWithGSettingsKeyName (backend, wrapper, keyName, backendInterface->updateSetting); } static CCSGSettingsWrapper * ccsGSettingsBackendGetSettingsObjectForPluginWithPathDefault (CCSBackend *backend, const char *plugin, const char *path, CCSContext *context) { CCSGSettingsWrapper *settingsObj = NULL; gchar *schemaName = getSchemaNameForPlugin (plugin); GVariant *writtenPlugins; gsize newWrittenPluginsSize; gchar **newWrittenPlugins; CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); settingsObj = findCCSGSettingsWrapperBySchemaName (schemaName, priv->settingsList); if (settingsObj) { g_free (schemaName); return settingsObj; } /* No existing settings object found for this schema, create one */ settingsObj = ccsGSettingsWrapperFactoryNewGSettingsWrapperWithPath (priv->wrapperFactory, schemaName, path, &ccsDefaultObjectAllocator); /* Couldn't allocate one */ if (!settingsObj) return NULL; ccsGSettingsBackendConnectToChangedSignal (backend, settingsObj); priv->settingsList = g_list_append (priv->settingsList, (void *) settingsObj); /* Also write the plugin name to the list of modified plugins so * that when we delete the profile the keys for that profile are also * unset FIXME: This could be a little more efficient, like we could * store keys that have changed from their defaults ... though * gsettings doesn't seem to give you a way to get all of the schemas */ writtenPlugins = ccsGSettingsWrapperGetValue (priv->currentProfileSettings, "plugins-with-set-keys"); if (appendToPluginsWithSetKeysList (plugin, writtenPlugins, &newWrittenPlugins, &newWrittenPluginsSize)) { GVariant *newWrittenPluginsVariant = g_variant_new_strv ((const gchar * const *) newWrittenPlugins, newWrittenPluginsSize); ccsGSettingsWrapperSetValue (priv->currentProfileSettings, "plugins-with-set-keys", newWrittenPluginsVariant); } g_variant_unref (writtenPlugins); g_free (schemaName); g_strfreev (newWrittenPlugins); return settingsObj; } gboolean ccsGSettingsBackendAddProfileDefault (CCSBackend *backend, const char *profile) { GVariant *profiles; gboolean ret = FALSE; profiles = ccsGSettingsBackendGetExistingProfiles (backend); if (appendStringToVariantIfUnique (&profiles, profile)) { ret = TRUE; ccsGSettingsBackendSetExistingProfiles (backend, profiles); } else g_variant_unref (profiles); return ret; } void ccsGSettingsBackendUpdateCurrentProfileNameDefault (CCSBackend *backend, const char *profile) { ccsGSettingsBackendAddProfile (backend, profile); ccsGSettingsBackendSetCurrentProfile (backend, profile); } gboolean ccsGSettingsBackendUpdateProfileDefault (CCSBackend *backend, CCSContext *context) { const char *currentProfile = ccsGSettingsBackendGetCurrentProfile (backend); const char *ccsProfile = ccsGetProfile (context); char *profile = NULL; if (!ccsProfile) profile = strdup (DEFAULTPROF); else profile = strdup (ccsProfile); if (!strlen (profile)) { free (profile); profile = strdup (DEFAULTPROF); } if (g_strcmp0 (profile, currentProfile)) ccsGSettingsBackendUpdateCurrentProfileName (backend, profile); free (profile); return TRUE; } void ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault (CCSBackend *backend, CCSContext *context, GVariant *pluginsWithChangedKeys, const char * profile) { GVariantIter iter; char *plugin; g_variant_iter_init (&iter, pluginsWithChangedKeys); while (g_variant_iter_loop (&iter, "s", &plugin)) { CCSGSettingsWrapper *settings; gchar *pathName = makeCompizPluginPath (profile, plugin); settings = ccsGSettingsGetSettingsObjectForPluginWithPath (backend, plugin, pathName, context); g_free (pathName); /* The GSettings documentation says not to use this API * because we should know our own schema ... though really * we don't because we autogenerate schemas ... */ if (settings) { char **keys = ccsGSettingsWrapperListKeys (settings); char **key_ptr; /* Unset all the keys */ for (key_ptr = keys; *key_ptr; ++key_ptr) ccsGSettingsWrapperResetKey (settings, *key_ptr); g_strfreev (keys); } } } static CCSContext * ccsGSettingsBackendGetContextDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return priv->context; } static void ccsGSettingsBackendConnectToValueChangedSignalDefault (CCSBackend *backend, CCSGSettingsWrapper *wrapper) { ccsGSettingsWrapperConnectToChangedSignal (wrapper, (GCallback) ccsGSettingsValueChanged, (gpointer) backend); } static const char * ccsGSettingsBackendGetCurrentProfileDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return priv->currentProfile; } static GVariant * ccsGSettingsBackendGetExistingProfilesDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsGSettingsWrapperGetValue (priv->compizconfigSettings, "existing-profiles"); } static void ccsGSettingsBackendSetExistingProfilesDefault (CCSBackend *backend, GVariant *value) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsGSettingsWrapperSetValue (priv->compizconfigSettings, "existing-profiles", value); } static void ccsGSettingsBackendSetCurrentProfileDefault (CCSBackend *backend, const gchar *value) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); gchar *profilePath = makeCompizProfilePath (value); /* Change the current profile and current profile settings */ if (priv->currentProfile) free (priv->currentProfile); if (priv->currentProfileSettings) ccsGSettingsWrapperUnref (priv->currentProfileSettings); g_list_free_full (priv->settingsList, ccsGSettingsWrapperDestroyNotify); priv->settingsList = NULL; priv->currentProfile = strdup (value); priv->currentProfileSettings = ccsGSettingsWrapperNewForSchemaWithPath (PROFILE_SCHEMA_ID, profilePath, backend->object.object_allocation); GVariant *currentProfileVariant = g_variant_new ("s", value, NULL); ccsGSettingsWrapperSetValue (priv->compizconfigSettings, "current-profile", currentProfileVariant); g_free (profilePath); } GVariant * ccsGSettingsBackendGetPluginsWithSetKeysDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsGSettingsWrapperGetValue (priv->currentProfileSettings, "plugins-with-set-keys"); } void ccsGSettingsBackendClearPluginsWithSetKeysDefault (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsGSettingsWrapperResetKey (priv->currentProfileSettings, "plugins-with-set-keys"); } CCSIntegratedSetting * ccsGSettingsBackendGetIntegratedOptionIndexDefault (CCSBackend *backend, CCSSetting *setting) { CCSPlugin *plugin = ccsSettingGetParent (setting); const char *pluginName = ccsPluginGetName (plugin); const char *settingName = ccsSettingGetName (setting); CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsIntegrationGetIntegratedSetting (priv->integration, pluginName, settingName); } Bool ccsGSettingsBackendReadIntegratedOptionDefault (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); return ccsIntegrationReadOptionIntoSetting (priv->integration, priv->context, setting, integrated); } void ccsGSettingsBackendWriteIntegratedOptionDefault (CCSBackend *backend, CCSSetting *setting, CCSIntegratedSetting *integrated) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); ccsIntegrationWriteSettingIntoOption (priv->integration, priv->context, setting, integrated); } static CCSGSettingsBackendInterface gsettingsAdditionalDefaultInterface = { ccsGSettingsBackendGetContextDefault, ccsGSettingsBackendConnectToValueChangedSignalDefault, ccsGSettingsBackendGetSettingsObjectForPluginWithPathDefault, ccsGSettingsBackendGetCurrentProfileDefault, ccsGSettingsBackendGetExistingProfilesDefault, ccsGSettingsBackendSetExistingProfilesDefault, ccsGSettingsBackendSetCurrentProfileDefault, ccsGSettingsBackendGetPluginsWithSetKeysDefault, ccsGSettingsBackendClearPluginsWithSetKeysDefault, ccsGSettingsBackendUnsetAllChangedPluginKeysInProfileDefault, ccsGSettingsBackendUpdateProfileDefault, ccsGSettingsBackendUpdateCurrentProfileNameDefault, ccsGSettingsBackendAddProfileDefault, ccsGSettingsBackendGetIntegratedOptionIndexDefault, ccsGSettingsBackendReadIntegratedOptionDefault, ccsGSettingsBackendWriteIntegratedOptionDefault }; static CCSGSettingsBackendPrivate * addPrivateToBackend (CCSBackend *backend, CCSObjectAllocationInterface *ai) { CCSGSettingsBackendPrivate *priv = (*ai->calloc_) (ai->allocator, 1, sizeof (CCSGSettingsBackendPrivate)); if (!priv) { ccsObjectRemoveInterface (backend, GET_INTERFACE_TYPE (CCSGSettingsBackendInterface)); return NULL; } ccsObjectSetPrivate (backend, (CCSPrivate *) priv); return priv; } void ccsGSettingsBackendDetachFromBackend (CCSBackend *backend) { CCSGSettingsBackendPrivate *priv = (CCSGSettingsBackendPrivate *) ccsObjectGetPrivate (backend); if (priv->currentProfile) { free (priv->currentProfile); priv->currentProfile = NULL; } g_list_free_full (priv->settingsList, ccsGSettingsWrapperDestroyNotify); priv->settingsList = NULL; if (priv->currentProfileSettings) { ccsGSettingsWrapperUnref (priv->currentProfileSettings); priv->currentProfileSettings = NULL; } ccsGSettingsWrapperUnref (priv->compizconfigSettings); priv->compizconfigSettings = NULL; ccsIntegrationUnref (priv->integration); ccsGSettingsWrapperFactoryUnref (priv->wrapperFactory); free (priv->valueChangeData); free (priv); ccsObjectSetPrivate (backend, NULL); } Bool ccsGSettingsBackendAttachNewToBackend (CCSBackend *backend, CCSContext *context, CCSGSettingsWrapper *compizconfigSettings, CCSGSettingsWrapper *currentProfileSettings, CCSGSettingsWrapperFactory *wrapperFactory, CCSIntegration *integration, CCSGNOMEValueChangeData *valueChangeData, char *currentProfile) { ccsObjectAddInterface (backend, (CCSInterface *) &gsettingsAdditionalDefaultInterface, GET_INTERFACE_TYPE (CCSGSettingsBackendInterface)); CCSGSettingsBackendPrivate *priv = addPrivateToBackend (backend, backend->object.object_allocation); priv->compizconfigSettings = compizconfigSettings; priv->currentProfile = currentProfile; priv->currentProfileSettings = currentProfileSettings; priv->context = context; priv->valueChangeData = valueChangeData; priv->integration = integration; priv->wrapperFactory = wrapperFactory; return TRUE; } ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_interface.c0000644000004100000410000000372613246301623030000 0ustar www-datawww-data#include #include "ccs_gsettings_interface.h" INTERFACE_TYPE (CCSGSettingsWrapperInterface); CCSREF_OBJ (GSettingsWrapper, CCSGSettingsWrapper); void ccsGSettingsWrapperSetValue (CCSGSettingsWrapper *wrapper, const char *key, GVariant *value) { (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperSetValue) (wrapper, key, value); } GVariant * ccsGSettingsWrapperGetValue (CCSGSettingsWrapper *wrapper, const char *key) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetValue) (wrapper, key); } void ccsGSettingsWrapperResetKey (CCSGSettingsWrapper *wrapper, const char *key) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperResetKey) (wrapper, key); } char ** ccsGSettingsWrapperListKeys (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperListKeys) (wrapper); } GSettings * ccsGSettingsWrapperGetGSettings (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetGSettings) (wrapper); } const char * ccsGSettingsWrapperGetSchemaName (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetSchemaName) (wrapper); } const char * ccsGSettingsWrapperGetPath (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperGetPath) (wrapper); } void ccsGSettingsWrapperConnectToChangedSignal (CCSGSettingsWrapper *wrapper, GCallback callback, gpointer data) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperConnectToChangedSignal) (wrapper, callback, data); } void ccsFreeGSettingsWrapper (CCSGSettingsWrapper *wrapper) { return (*(GET_INTERFACE (CCSGSettingsWrapperInterface, wrapper))->gsettingsWrapperFree) (wrapper); } ./compizconfig/gsettings/gsettings_backend_shared/gsettings_util.c0000644000004100000410000006511013246301623026160 0ustar www-datawww-data#define CCS_LOG_DOMAIN "gsettings" #include #include #include #include "gsettings_shared.h" #include "ccs_gsettings_backend.h" #include "ccs_gsettings_backend_interface.h" #include "ccs_gsettings_interface.h" #include "ccs_gsettings_interface_wrapper.h" const CCSBackendInfo gsettingsBackendInfo = { "gsettings", "GSettings Configuration Backend", "GSettings Configuration Backend for libccs", TRUE, TRUE, 1 }; GList * variantTypeToPossibleSettingType (const gchar *vt) { struct _variantTypeCCSType { char variantType; CCSSettingType ccsType; }; static const struct _variantTypeCCSType vCCSType[] = { { 'b', TypeBool }, { 'i', TypeInt }, { 'd', TypeFloat }, { 's', TypeString }, { 's', TypeColor }, { 's', TypeKey }, { 's', TypeButton }, { 's', TypeEdge }, { 'b', TypeBell }, { 's', TypeMatch }, { 'a', TypeList } }; GList *possibleTypesList = NULL; unsigned int i = 0; for (; i < (sizeof (vCCSType) / sizeof (vCCSType[0])); ++i) { if (vt[0] == vCCSType[i].variantType) possibleTypesList = g_list_append (possibleTypesList, GINT_TO_POINTER ((gint) vCCSType[i].ccsType)); } return possibleTypesList; } CCSGSettingsWrapper * findCCSGSettingsWrapperBySchemaName (const gchar *schemaName, GList *iter) { while (iter) { CCSGSettingsWrapper *obj = iter->data; const gchar *name = ccsGSettingsWrapperGetSchemaName (obj); if (g_strcmp0 (name, schemaName) != 0) obj = NULL; if (obj) return obj; else iter = g_list_next (iter); } return NULL; } gchar * getSchemaNameForPlugin (const char *plugin) { gchar *schemaName = NULL; schemaName = g_strconcat (PLUGIN_SCHEMA_ID_PREFIX, plugin, NULL); return schemaName; } char * truncateKeyForGSettings (const char *gsettingName) { /* Truncate */ gchar *truncated = g_strndup (gsettingName, MAX_GSETTINGS_KEY_SIZE); return truncated; } char * translateUnderscoresToDashesForGSettings (const char *truncated) { gchar *clean = NULL; gchar **delimited = NULL; /* Replace underscores with dashes */ delimited = g_strsplit (truncated, "_", 0); clean = g_strjoinv ("-", delimited); g_strfreev (delimited); return clean; } void translateToLowercaseForGSettings (char *name) { unsigned int i; /* Everything must be lowercase */ for (i = 0; i < strlen (name); ++i) name[i] = g_ascii_tolower (name[i]); } char * translateKeyForGSettings (const char *gsettingName) { char *truncated = truncateKeyForGSettings (gsettingName); char *translated = translateUnderscoresToDashesForGSettings (truncated); translateToLowercaseForGSettings (translated); if (strlen (gsettingName) > MAX_GSETTINGS_KEY_SIZE) ccsWarning ("Key name %s is not valid in GSettings, it was changed to %s, this may cause problems!", gsettingName, translated); g_free (truncated); return translated; } gchar * translateKeyForCCS (const char *gsettingName) { gchar *clean = NULL; gchar **delimited = NULL; /* Replace dashes with underscores */ delimited = g_strsplit (gsettingName, "-", 0); clean = g_strjoinv ("_", delimited); g_strfreev (delimited); return clean; } gboolean compizconfigTypeHasVariantType (CCSSettingType type) { gint i = 0; static const unsigned int nVariantTypes = 6; static const CCSSettingType variantTypes[] = { TypeString, TypeMatch, TypeColor, TypeBool, TypeInt, TypeFloat }; for (; i < nVariantTypes; ++i) { if (variantTypes[i] == type) return TRUE; } return FALSE; } gboolean decomposeGSettingsPath (const char *pathInput, char **pluginName, unsigned int *screenNum) { const char *path = pathInput; const int prefixLen = strlen (PROFILE_PATH_PREFIX); char pluginBuf[1024]; if (strncmp (path, PROFILE_PATH_PREFIX, prefixLen)) return FALSE; path += prefixLen; *pluginName = NULL; *screenNum = 0; /* Can't overflow, limit is 1023 chars */ if (sscanf (path, "%*[^/]/plugins/%1023[^/]", pluginBuf) == 1) { pluginBuf[1023] = '\0'; *pluginName = g_strdup (pluginBuf); return TRUE; } return FALSE; } gboolean variantIsValidForCCSType (GVariant *gsettingsValue, CCSSettingType settingType) { gboolean valid = FALSE; switch (settingType) { case TypeString: case TypeMatch: case TypeColor: case TypeKey: case TypeButton: case TypeEdge: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_STRING, g_variant_get_type (gsettingsValue))); break; case TypeInt: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_INT32, g_variant_get_type (gsettingsValue))); break; case TypeBool: case TypeBell: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_BOOLEAN, g_variant_get_type (gsettingsValue))); break; case TypeFloat: valid = (g_variant_type_is_subtype_of (G_VARIANT_TYPE_DOUBLE, g_variant_get_type (gsettingsValue))); break; case TypeList: valid = (g_variant_type_is_array (g_variant_get_type (gsettingsValue))); break; default: break; } return valid; } Bool updateSettingWithGSettingsKeyName (CCSBackend *backend, CCSGSettingsWrapper *settings, const gchar *keyName, CCSBackendUpdateFunc updateSetting) { CCSContext *context = ccsGSettingsBackendGetContext (backend); char *uncleanKeyName = NULL; char *pathOrig; CCSPlugin *plugin; CCSSetting *setting; Bool ret = TRUE; pathOrig = strdup (ccsGSettingsWrapperGetPath (settings)); if (findSettingAndPluginToUpdateFromPath (settings, pathOrig, keyName, context, &plugin, &setting, &uncleanKeyName)) (*updateSetting) (backend, context, plugin, setting); else { /* We hit a situation where either the key stored in GSettings couldn't be * matched at all to a key in the xml file, or where there were multiple matches. * Unfortunately, there isn't much we can do about this, other than try * and warn the user and bail out. It just means that if the key was updated * externally we won't know about the change until the next reload of settings */ ccsWarning ("Unable to find setting %s, for path %s", uncleanKeyName, pathOrig); ret = FALSE; } free (pathOrig); if (uncleanKeyName) g_free (uncleanKeyName); return ret; } Bool appendToPluginsWithSetKeysList (const gchar *plugin, GVariant *writtenPlugins, char ***newWrittenPlugins, gsize *newWrittenPluginsSize) { gsize writtenPluginsLen = 0; Bool found = FALSE; char *plug; GVariantIter iter; g_variant_iter_init (&iter, writtenPlugins); *newWrittenPluginsSize = g_variant_iter_n_children (&iter); while (g_variant_iter_loop (&iter, "s", &plug)) { if (!found) found = (g_strcmp0 (plug, plugin) == 0); } if (!found) ++(*newWrittenPluginsSize); *newWrittenPlugins = g_variant_dup_strv (writtenPlugins, &writtenPluginsLen); if (*newWrittenPluginsSize > writtenPluginsLen) { *newWrittenPlugins = g_realloc (*newWrittenPlugins, (*newWrittenPluginsSize + 1) * sizeof (gchar *)); /* Next item becomes plugin */ (*newWrittenPlugins)[writtenPluginsLen] = g_strdup (plugin); /* Last item becomes NULL */ (*newWrittenPlugins)[*newWrittenPluginsSize] = NULL; } return !found; } CCSSettingList filterAllSettingsMatchingType (CCSSettingType type, CCSSettingList settingList) { CCSSettingList filteredList = NULL; CCSSettingList iter = settingList; while (iter) { CCSSetting *s = (CCSSetting *) iter->data; if (ccsSettingGetType (s) == type) filteredList = ccsSettingListAppend (filteredList, s); iter = iter->next; } return filteredList; } CCSSettingList filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase (const gchar *keyName, CCSSettingList settingList) { CCSSettingList filteredList = NULL; CCSSettingList iter = settingList; while (iter) { CCSSetting *s = (CCSSetting *) iter->data; const char *name = ccsSettingGetName (s); char *underscores_as_dashes = translateUnderscoresToDashesForGSettings (name); if (g_ascii_strncasecmp (underscores_as_dashes, keyName, strlen (keyName)) == 0) filteredList = ccsSettingListAppend (filteredList, s); g_free (underscores_as_dashes); iter = iter->next; } return filteredList; } CCSSetting * attemptToFindCCSSettingFromLossyName (CCSSettingList settingList, const gchar *lossyName, CCSSettingType type) { CCSSettingList ofThatType = filterAllSettingsMatchingType (type, settingList); CCSSettingList lossyMatchingName = filterAllSettingsMatchingPartOfStringIgnoringDashesUnderscoresAndCase (lossyName, ofThatType); CCSSetting *found = NULL; if (ccsSettingListLength (lossyMatchingName) == 1) found = lossyMatchingName->data; ccsSettingListFree (ofThatType, FALSE); ccsSettingListFree (lossyMatchingName, FALSE); return found; } Bool findSettingAndPluginToUpdateFromPath (CCSGSettingsWrapper *settings, const char *path, const gchar *keyName, CCSContext *context, CCSPlugin **plugin, CCSSetting **setting, char **uncleanKeyName) { char *pluginName; unsigned int screenNum; if (!decomposeGSettingsPath (path, &pluginName, &screenNum)) return FALSE; *plugin = ccsFindPlugin (context, pluginName); if (*plugin) { *uncleanKeyName = translateKeyForCCS (keyName); *setting = ccsFindSetting (*plugin, *uncleanKeyName); if (!*setting) { /* Couldn't find setting straight off the bat, * try and find the best match */ GVariant *value = ccsGSettingsWrapperGetValue (settings, keyName); if (value) { GList *possibleSettingTypes = variantTypeToPossibleSettingType (g_variant_get_type_string (value)); GList *iter = possibleSettingTypes; while (iter) { *setting = attemptToFindCCSSettingFromLossyName (ccsGetPluginSettings (*plugin), keyName, (CCSSettingType) GPOINTER_TO_INT (iter->data)); if (*setting) break; iter = iter->next; } g_list_free (possibleSettingTypes); g_variant_unref (value); } } } g_free (pluginName); if (!*plugin || !*setting) return FALSE; return TRUE; } gchar * makeCompizProfilePath (const gchar *profilename) { return g_build_path ("/", PROFILE_PATH_PREFIX, profilename, "/", NULL); } gchar * makeCompizPluginPath (const gchar *profileName, const gchar *pluginName) { return g_build_path ("/", PROFILE_PATH_PREFIX, profileName, "plugins", pluginName, "/", NULL); } gchar * getNameForCCSSetting (CCSSetting *setting) { return translateKeyForGSettings (ccsSettingGetName (setting)); } Bool checkReadVariantIsValid (GVariant *gsettingsValue, CCSSettingType type, const gchar *pathName, const gchar *key) { /* first check if the key is set */ if (!gsettingsValue) { ccsWarning ("There is no key '%s' at the path %s. " "Settings from this path won't be read. Default value will be used." "Ensure this setting is available or the setting backend is properly configured.", key, pathName); return FALSE; } if (!variantIsValidForCCSType (gsettingsValue, type)) { ccsWarning ("There is an unsupported value for key '%s' at path %s. " "Settings from this path won't be read. Default value will be used. " "Ensure this setting is available or the setting backend is properly configured.", key, pathName); return FALSE; } return TRUE; } GVariant * getVariantAtKey (CCSGSettingsWrapper *settings, const char *key, const char *pathName, CCSSettingType type) { GVariant *gsettingsValue = ccsGSettingsWrapperGetValue (settings, key); if (!checkReadVariantIsValid (gsettingsValue, type, pathName, key)) { if (gsettingsValue) g_variant_unref (gsettingsValue); return NULL; } return gsettingsValue; } CCSSettingValueList readBoolListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; Bool *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (Bool)); Bool *arrayCounter = array; gboolean value; if (!array) return NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_loop (iter, "b", &value)) *arrayCounter++ = value ? TRUE : FALSE; list = ccsGetValueListFromBoolArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readIntListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; int *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (int)); int *arrayCounter = array; gint value; if (!array) return NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_loop (iter, "i", &value)) *arrayCounter++ = value; list = ccsGetValueListFromIntArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readFloatListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; float *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (float)); float *arrayCounter = array; gdouble value; if (!array) return NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_loop (iter, "d", &value)) *arrayCounter++ = value; list = ccsGetValueListFromFloatArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readStringListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; gchar **array = (*ai->calloc_) (ai->allocator, 1, (nItems + 1) * sizeof (gchar *)); gchar **arrayCounter = array; gchar *value; if (!array) return NULL; array[nItems] = NULL; /* Reads each item from the variant into arrayCounter */ while (g_variant_iter_next (iter, "s", &value)) *arrayCounter++ = value; list = ccsGetValueListFromStringArray ((const gchar **) array, nItems, setting); g_strfreev (array); return list; } CCSSettingValueList readColorListValue (GVariantIter *iter, guint nItems, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingValueList list = NULL; char *colorValue; CCSSettingColorValue *array = (*ai->calloc_) (ai->allocator, 1, nItems * sizeof (CCSSettingColorValue)); unsigned int i = 0; if (!array) return NULL; while (g_variant_iter_loop (iter, "s", &colorValue)) { ccsStringToColor (colorValue, &array[i]); ++i; } list = ccsGetValueListFromColorArray (array, nItems, setting); free (array); return list; } CCSSettingValueList readListValue (GVariant *gsettingsValue, CCSSetting *setting, CCSObjectAllocationInterface *ai) { CCSSettingType listType = ccsSettingGetInfo (setting)->forList.listType; gboolean hasVariantType; unsigned int nItems; CCSSettingValueList list = NULL; GVariantIter iter; hasVariantType = compizconfigTypeHasVariantType (listType); if (!hasVariantType) return NULL; g_variant_iter_init (&iter, gsettingsValue); nItems = g_variant_iter_n_children (&iter); switch (listType) { case TypeBool: list = readBoolListValue (&iter, nItems, setting, ai); break; case TypeInt: list = readIntListValue (&iter, nItems, setting, ai); break; case TypeFloat: list = readFloatListValue (&iter, nItems, setting, ai); break; case TypeString: case TypeMatch: list = readStringListValue (&iter, nItems, setting, ai); break; case TypeColor: list = readColorListValue (&iter, nItems, setting, ai); break; default: break; } return list; } const char * readStringFromVariant (GVariant *gsettingsValue) { return g_variant_get_string (gsettingsValue, NULL); } int readIntFromVariant (GVariant *gsettingsValue) { return g_variant_get_int32 (gsettingsValue); } Bool readBoolFromVariant (GVariant *gsettingsValue) { return g_variant_get_boolean (gsettingsValue) ? TRUE : FALSE; } float readFloatFromVariant (GVariant *gsettingsValue) { return (float) g_variant_get_double (gsettingsValue); } CCSSettingColorValue readColorFromVariant (GVariant *gsettingsValue, Bool *success) { const char *value; CCSSettingColorValue color; value = g_variant_get_string (gsettingsValue, NULL); if (value) *success = ccsStringToColor (value, &color); else *success = FALSE; return color; } CCSSettingKeyValue readKeyFromVariant (GVariant *gsettingsValue, Bool *success) { const char *value; CCSSettingKeyValue key; value = g_variant_get_string (gsettingsValue, NULL); if (value) *success = ccsStringToKeyBinding (value, &key); else *success = FALSE; return key; } CCSSettingButtonValue readButtonFromVariant (GVariant *gsettingsValue, Bool *success) { const char *value; CCSSettingButtonValue button; value = g_variant_get_string (gsettingsValue, NULL); if (value) *success = ccsStringToButtonBinding (value, &button); else *success = FALSE; return button; } unsigned int readEdgeFromVariant (GVariant *gsettingsValue) { const char *value; value = g_variant_get_string (gsettingsValue, NULL); if (value) return ccsStringToEdges (value); return 0; } GVariant * writeBoolListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("ab")); while (list) { g_variant_builder_add (builder, "b", list->data->value.asBool); list = list->next; } value = g_variant_new ("ab", builder); g_variant_builder_unref (builder); return value; } GVariant * writeIntListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("ai")); while (list) { g_variant_builder_add (builder, "i", list->data->value.asInt); list = list->next; } value = g_variant_new ("ai", builder); g_variant_builder_unref (builder); return value; } GVariant * writeFloatListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("ad")); while (list) { g_variant_builder_add (builder, "d", (gdouble) list->data->value.asFloat); list = list->next; } value = g_variant_new ("ad", builder); g_variant_builder_unref (builder); return value; } GVariant * writeStringListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); while (list) { g_variant_builder_add (builder, "s", list->data->value.asString); list = list->next; } value = g_variant_new ("as", builder); g_variant_builder_unref (builder); return value; } GVariant * writeMatchListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); while (list) { g_variant_builder_add (builder, "s", list->data->value.asMatch); list = list->next; } value = g_variant_new ("as", builder); g_variant_builder_unref (builder); return value; } GVariant * writeColorListValue (CCSSettingValueList list) { GVariant *value = NULL; GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); char *item; while (list) { item = ccsColorToString (&list->data->value.asColor); g_variant_builder_add (builder, "s", item); g_free (item); list = list->next; } value = g_variant_new ("as", builder); g_variant_builder_unref (builder); return value; } Bool writeListValue (CCSSettingValueList list, CCSSettingType listType, GVariant **gsettingsValue) { GVariant *value = NULL; switch (listType) { case TypeBool: value = writeBoolListValue (list); break; case TypeInt: value = writeIntListValue (list); break; case TypeFloat: value = writeFloatListValue (list); break; case TypeString: value = writeStringListValue (list); break; case TypeMatch: value = writeMatchListValue (list); break; case TypeColor: value = writeColorListValue (list); break; default: ccsWarning ("Attempt to write unsupported list type %d!", listType); return FALSE; break; } *gsettingsValue = value; return TRUE; } Bool writeStringToVariant (const char *value, GVariant **variant) { *variant = g_variant_new_string (value); return TRUE; } Bool writeFloatToVariant (float value, GVariant **variant) { *variant = g_variant_new_double ((double) value); return TRUE; } Bool writeIntToVariant (int value, GVariant **variant) { *variant = g_variant_new_int32 (value); return TRUE; } Bool writeBoolToVariant (Bool value, GVariant **variant) { *variant = g_variant_new_boolean (value); return TRUE; } Bool writeColorToVariant (CCSSettingColorValue value, GVariant **variant) { char *colString; colString = ccsColorToString (&value); if (!colString) return FALSE; *variant = g_variant_new_string (colString); free (colString); return TRUE; } Bool writeKeyToVariant (CCSSettingKeyValue key, GVariant **variant) { char *keyString; keyString = ccsKeyBindingToString (&key); if (!keyString) return FALSE; *variant = g_variant_new_string (keyString); free (keyString); return TRUE; } Bool writeButtonToVariant (CCSSettingButtonValue button, GVariant **variant) { char *buttonString; buttonString = ccsButtonBindingToString (&button); if (!buttonString) return FALSE; *variant = g_variant_new_string (buttonString); free (buttonString); return TRUE; } Bool writeEdgeToVariant (unsigned int edges, GVariant **variant) { char *edgeString; edgeString = ccsEdgesToString (edges); if (!edgeString) return FALSE; *variant = g_variant_new_string (edgeString); free (edgeString); return TRUE; } Bool writeVariantToKey (CCSGSettingsWrapper *settings, const char *key, GVariant *value) { if (settings) { ccsGSettingsWrapperSetValue (settings, key, value); return TRUE; } else { ccsWarning ("attempted to write without a schema"); return FALSE; } } typedef void (*VariantItemCheckAndInsertFunc) (GVariantBuilder *, const char *item, void *userData); typedef struct _FindItemInVariantData { gboolean found; const char *item; } FindItemInVariantData; typedef struct _InsertIfNotEqualData { gboolean skipped; const char *item; } InsertIfNotEqualData; static void insertIfNotEqual (GVariantBuilder *builder, const char *item, void *userData) { InsertIfNotEqualData *data = (InsertIfNotEqualData *) userData; if (g_strcmp0 (item, data->item)) g_variant_builder_add (builder, "s", item); else data->skipped = TRUE; } static void findItemForVariantData (GVariantBuilder *builder, const char *item, void *userData) { FindItemInVariantData *data = (FindItemInVariantData *) userData; if (!data->found) data->found = g_str_equal (data->item, item); g_variant_builder_add (builder, "s", item); } static void rebuildVariant (GVariantBuilder *builder, GVariant *originalVariant, VariantItemCheckAndInsertFunc checkAndInsert, void *userData) { GVariantIter iter; char *str; g_variant_iter_init (&iter, originalVariant); while (g_variant_iter_loop (&iter, "s", &str)) { (*checkAndInsert) (builder, str, userData); } } gboolean appendStringToVariantIfUnique (GVariant **variant, const char *string) { GVariantBuilder newVariantBuilder; FindItemInVariantData findItemData; memset (&findItemData, 0, sizeof (FindItemInVariantData)); g_variant_builder_init (&newVariantBuilder, G_VARIANT_TYPE ("as")); findItemData.item = string; rebuildVariant (&newVariantBuilder, *variant, findItemForVariantData, &findItemData); if (!findItemData.found) g_variant_builder_add (&newVariantBuilder, "s", string); g_variant_unref (*variant); *variant = g_variant_builder_end (&newVariantBuilder); return !findItemData.found; } gboolean removeItemFromVariant (GVariant **variant, const char *string) { GVariantBuilder newVariantBuilder; InsertIfNotEqualData data = { FALSE, string }; g_variant_builder_init (&newVariantBuilder, G_VARIANT_TYPE ("as")); rebuildVariant (&newVariantBuilder, *variant, insertIfNotEqual, (void *) &data); g_variant_unref (*variant); *variant = g_variant_builder_end (&newVariantBuilder); return data.skipped; } void resetOptionToDefault (CCSBackend *backend, CCSSetting * setting) { CCSGSettingsWrapper *settings = getSettingsObjectForCCSSetting (backend, setting); char *cleanSettingName = translateKeyForGSettings (ccsSettingGetName (setting)); ccsGSettingsWrapperResetKey (settings, cleanSettingName); free (cleanSettingName); } gchar * makeSettingPath (const char *currentProfile, CCSSetting *setting) { return makeCompizPluginPath (currentProfile, ccsPluginGetName (ccsSettingGetParent (setting))); } CCSGSettingsWrapper * getSettingsObjectForCCSSetting (CCSBackend *backend, CCSSetting *setting) { CCSGSettingsWrapper *ret = NULL; gchar *pathName = makeSettingPath (ccsGSettingsBackendGetCurrentProfile (backend), setting); ret = ccsGSettingsGetSettingsObjectForPluginWithPath (backend, ccsPluginGetName (ccsSettingGetParent (setting)), pathName, ccsPluginGetContext (ccsSettingGetParent (setting))); g_free (pathName); return ret; } gboolean deleteProfile (CCSBackend *backend, CCSContext *context, const char *profile) { GVariant *plugins; GVariant *profiles; const char *currentProfile = ccsGSettingsBackendGetCurrentProfile (backend); gboolean ret = FALSE; plugins = ccsGSettingsBackendGetPluginsWithSetKeys (backend); profiles = ccsGSettingsBackendGetExistingProfiles (backend); ccsGSettingsBackendUnsetAllChangedPluginKeysInProfile (backend, context, plugins, currentProfile); ccsGSettingsBackendClearPluginsWithSetKeys (backend); ret = removeItemFromVariant (&profiles, profile); /* Remove the profile from existing-profiles */ ccsGSettingsBackendSetExistingProfiles (backend, profiles); ccsGSettingsBackendUpdateProfile (backend, context); /* Since we do not call g_settings_set_value on * plugins, we must also unref the variant */ g_variant_unref (plugins); return ret; } ./compizconfig/gsettings/gsettings_backend_shared/ccs_gsettings_wrapper_factory.h0000644000004100000410000000200613246301623031242 0ustar www-datawww-data/** * * GSettings libcompizconfig backend * * ccs_gsettings_wrapper_factory.h * * Copyright (c) 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authored By: * Sam Spilsbury * **/ #ifndef _CCS_GSETTINGS_WRAPPER_FACTORY_H #define _CCS_GSETTINGS_WRAPPER_FACTORY_H #include COMPIZCONFIG_BEGIN_DECLS #include #include CCSGSettingsWrapperFactory * ccsGSettingsWrapperFactoryDefaultImplNew (CCSObjectAllocationInterface *ai); COMPIZCONFIG_END_DECLS #endif ./config.h.core.in0000644000004100000410000000020413246301623014211 0ustar www-datawww-data#define PACKAGE_STRING "@_compiz_package_string@" #define PACKAGE "@_compiz_package@" #define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" ./NEWS0000644000004100000410000022755113246301623011756 0ustar www-datawww-dataRelease 0.9.12.1 (2015-02-03 Stephen M. Webb ) ======================================================================== 1101630 - animation plugin: initialized mPrevAnimSelectionRow 1199316 - cube plugin: fix clipping - libdecoration.pc: fix formatting 1410436 - Add a '/' to the path of std::string(home) + '/' HOME_PLUGINDIR 1404054 - Fix crash with titlebar-uses-system-font enabled 269904 - Use the GL_EXT_x11_sync_object OpenGL extension to synchronize updates with X11 to avoid unrefreshed parts of the screen on Nvidia hardware 1101413 - PrivateScreen unit tests: added additional assertions to verify the tests are run in an expected state 1101554 - dodge plugin: avoid potential null pointer dereferences 1101608 - libcompizconfig: reorder stat() and open() calls to eliminate a race condition 959282 - added support for multi-arch installations 1395105 - added support for multi-arch installations 1101585 - switcher plugin: renamed a local variable so it does not hide a function parameter. 1392715 - libdecoration/CMakeLists.txt: use correct variable for link directories 1394135 - gtk-window-decorator: support Metacity 3.14 Release 0.9.12.0 (2014-11-04 Stephen M. Webb ) ======================================================================== 1101630 - animation plugin: initialized mPrevAnimSelectionRow 1227449 - opengl plugin: freed shaders and uniforms 957600 - window_decorator: renamed a local to unhide a parameter 1086165 - removed inappropriate executable permissions from some source and data files 1362005 - Forced non-opaque pointer in the ezoom plugin. 873384 - upstreamed distro-patch for #873384 place plugin: correct min and default placement modes in configuration 1075995 - filtered debian/ from upstream dist tarball 1125442 - CompScreen: Save focused window id before changing viewport. 1286562 - remove 'extern "C"' hack 1356981 - gtk-window-decorator: removed/replaced deprecated functions. 1353675 - _NET_WM_FULLSCREEN_MONITORS not handled correctly. 1356981 - Re-enabled metacity theme support - gtk-window-decorator: removed gconf - gtk-window-decorator: port to GTK+ 3. - po/POTFILES.in: remove gtk/window-decorator/gwd.schemas.in - Calculated correct button position in cairo theme. 1333277 - Remove the need to check the viewport we are painting the maximized window in while in Expo mode and only scale maximized windows that are not being dragged. 1330198 - Add more button ungrab keymasks, so unfocused Gtk window scrolling will work when NumLock is off and CapsLock is on and any combination thereof. Release 0.9.11 (2014-6-10 Chris Townsend ) ============================================================================= Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.11) 1019139 - [regression] Horizontally resizing a vertically maximized terminal is now very slow, unresponsive. 1019923 - Stuck in scale mode, can't get out without killing compiz 1027868 - Changing "Composite > Detect Refresh Rate" is ignored initially 1031710 - Multi-Monitor. Workspace switcher on monitor 2 is drawn under launcher 1055166 - compiz crashed with SIGSEGV in memmove() from drisw_update_tex_buffer() from dri_set_tex_buffer2() from operator() from compiz::opengl::bindTexImageGLX() from ... from unity::UnityWindow::DrawWindowDecoration 1063617 - 1:0.9.8+bzr3319-0ubuntu1 regression: keeps setting gsettings keys to wrong values 1087090 - [raring][regression] Window management - Maximized windows aren't fullscreen in the workspace switcher 1092323 - Window management - Switching to windows placed on two work spaces causes the workspace to switch 1092323 - Window management - Switching to windows placed on two work spaces causes the workspace to switch 1104236 - [regression] Unity show desktop fade out makes them invisible in spread. 1171342 - mouse scroll wheel not working in gedit & System Monitor 1171878 - Adding/Removing an external monitor causes maximized windows to move to another workspace 1176898 - Grid: Snap animation uses wrong window 1184159 - [saucy] scrolling with a touchpad is jerky with bindings set in compiz for Desktop-based Viewport Switching 1191853 - gtk-window-decorator crashed with SIGSEGV in wnck_window_get_actions() 1192028 - Compiz refresh rate resets to 50 Hz automatically w/ Nvidia proprietary driver 1200829 - Regression: Enabling typical bindings in "Desktop-based Viewport Switching" breaks scrollwheel scrolling in some windows with a usb mouse on a laptop 1204307 - Regression: The size of all windows grows by the size of the decoration each time Compiz gets restarted 1217286 - Regression r3751: Restarting Compiz changes size and position of windows 1228352 - [regression] Alt-Tab for all viewports will not switch viewports when selecting a window on another viewport 1228507 - Cannot move certain windows via the top half of the titlebar in Ubuntu 13.10 1236899 - [regression] Ctrl+Alt+KP_0 should minimize a window 1238111 - Compiz causes Motif window shrunk 1240957 - Scrolling behaviour and window focus has changed and is inconsistent 1244754 - [regression] compiz freezes when dragging a window to the top bar after being semi-maximized 1251777 - [regression] Semi-maximizing and then restoring the window does not return it to it's original place using Ctrl-Super-Left/Right 1277487 - Create Unity Settings Daemon so can remain on old GNOME Settings Daemon version 1280377 - Resizing vertically a window in normal mode doesn't vertically maximize it correctly 1280616 - When launcher is in autohide mode the launcher icons are not clickable 1281370 - Unity should use "Normal" resize mode by default 1282304 - Bottom-edge window placement doesn't take decoration height into consideration 1282305 - Repeatedly undecorating and redecorating a window shrinks it vertically 1287472 - compiz unnecessarily shrinks new windows 1288953 - fix kde4-window-decorator build 1289820 - 'Move to Another Workspace' causes window to disappear 1292220 - ccsm crashed with UnboundLocalError in AskUser(): local variable 'msg_dict' referenced before assignment 1294341 - Some of the input fields are blank in CompizConfig Settings Manager 1303068 - Regression: rev 3847 No focus on Desktop possible if a window is open 1303462 - [Regression] Window titlebars placed behind panel 1304531 - Removing an external monitor will move a maximized window to the current workspace 1304877 - Functions assigned to extra mouse buttons in compiz do not work anymore. 1305586 - Lock screen is unusable when some windows have a keyboard/mouse grab 1308112 - Scale should not select a window when clicking on an empty area 1311303 - Compiz mouse functions mapped to horizontal scrolling buttons do not work 1311788 - compiz lower window:Button5 stops working 1327478 - E: /var/cache/apt/archives/compiz-plugins_1%3a0.9.11+14.10.20140606-0ubuntu1_amd64.deb: trying to overwrite '/usr/share/compiz/cube/images/freedesktop.png', which is also in package compiz-core 1:0.9.11+14.04.20140423-0ubuntu1 347390 - Compiz can't resize a window vertically AND horizontally with keyboard. 727904 - Launcher, Window management - Switching between spreads when dragging a file over the Launcher is broken 890747 - Keyboard shortcut - Ctrl Alt Del doesn't do what most people typing it would expect 992697 - Window management - 'Ctrl-Alt-Numpad 4' and 'Ctrl-Alt-Numpad 6' window placement shortcuts are broken Release 0.9.10.0 (2013-7-21 Sam Spilsbury ) ================================================================ Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.10.0) 1053895 - Screen sometimes does not redraw upon exiting fullscreen when "Unredirect Fullscreen Windows" is enabled 1056409 - compiz crashed with SIGSEGV in DecorWindow::moveNotify() [decor.cpp:2791] 1067246 - Duplicate files: include/core/logmessage.h == src/logmessage/include/core/logmessage.h 1090713 - expo's rectangular glow outline has wrong size in multi-monitor setup 1101026 - PluginClassHandler::get implicity causes plugins to be loaded 1101454 - Coverity RESOURCE_LEAK - CID 12500 1101569 - Coverity RESOURCE_LEAK - CID 12499 1115344 - Grid + Maximizing (button) + snapping by mouse to Grid position changes cursor position relative to window 1119608 - Closing windows sometimes shows black areas using Nvidia 313.x drivers 1124133 - Threads not found on CI 1127866 - Compiz hangs in glXBindTexImageEXT in VirtualBox 1130160 - Add copytex to default/unity profiles 1130679 - [2013/02/20] compiz/unity don't run, just loading cpp 1131106 - Expo key stops working once Expo is terminated by clicking on a draggable window (only if unityshell is *not* enabled) 1131864 - After Upgrade to Boost 1.53 Build Fails 1138517 - Latest compiz update breaks Java Swing decorations 1140505 - [regression-r3623] Wallpaper bleeds through on top right when a window is opened maximized 1158161 - [regression] Unmaximized windows can't be closed, minimized, moved 1159054 - High CPU usage when using any addon which desaturates windows 1159234 - xiphos crashed with SIGSEGV in sword::VerseKey::copyFrom() 1162598 - Compiz crashes with SIGSEGV if GLVertexBuffer::render is used where a program is set indirectly and not explicitly 1163611 - undefined symbol in libgsettings.so and libini.so 1165343 - Windows are placed with titlebar obscured by Unity menubar. 1165343 - Windows are placed with titlebar obscured by Unity menubar. 1167983 - Cleanup TestPlaceScreenSizeChange 1168475 - make uninstall doesn't remove all files 1169170 - Some xorg-gtest tests can fail randomly due to a 3000ms timeout 1169172 - gtk-window-decorator does not load settings from gconf correctly 1169620 - Compiz crashes when a plugin fails to load 1170013 - Make it easy to run the compiz autopilot acceptance tests 1171314 - Window stacking order messed up for dialogs/overlays 1171364 - cmake .. -DCMAKE_BUILD_TYPE=Coverage && make && make test && make coverage fails 1172601 - Building test-suite fails with latest Boost version 1173799 - ${libcompizconfig_libdir} can sometimes be empty, leading to an FTBFS 1174495 - Window Managers instability with r600 radeon and high monitor resolutions 1178514 - xorg-gtest tests always fail when two test runs are run on the same machine in parallel 1178581 - Put plugin: Move window to previous monitor feature missing 1181461 - Grid plugin fails to load in trunk 1185719 - (v. 2.10.24) Manual partitioning mode displays no GUI elements making it impossible to proceed 1186560 - Vertical maximise widens windows 1187468 - GWDMockSettingsTest.TestMock broken on upgrade to saucy 1188900 - Provide acceptance tests for the decor and place plugins 1188900 - Provide acceptance tests for the decor and place plugins 1189368 - DC++ 0.822 crash in short time 1189369 - A crash is possible when a window gets its texture for the first time 1193596 - [regression r3729] Plugin classes not destructed properly on unload 1195522 - Fix disabled acceptance tests for the decor plugin and run them by default 438580 - Workspace switcher is incorrectly aligned on second monitor, viewports are partially offscreen 749084 - Regression: D-Bus Plugin's introspection stuff needs rewrite for 0.9.x as methods don't show up in dbus-tool (list method, plugin-metadata and introspection are broken) 763148 - Adding/Removing an external monitor causes open windows to move to another workspace 776435 - Window maximizes and semi-maximizes on the wrong workspace 892012 - Window management - When a semi-maximised a window is maximised and then restored, the window position jumps and window size changes so the the window title bar is sometimes hidden underneath the top bar Release 0.9.9.0 (2013-01-24 Daniel van Vugt ) ============================================================================ Highlights * Lots and lots of bug fixes. See the full list below. * Restored support for several features lost in the GL|ES port of 0.9.8: Plugins: cubeaddon, firepaint, showmouse, thumbnail, wallpaper, wizard Features: expo animations, text rendering, screenshot selection * Several multi-monitor fixes. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.9.0) 201681 - Window management - Cursor position changes relative to window while dragging windows 689792 - Window Management - Implement maximize and semi-maximise transitions 751605 - Multi-monitor - Windows maximize on the wrong monitor 754508 - Modal dialogs don't appear on the same workspace/monitor as their parent window 781931 - New windows are moved to front but don't take focus 839602 - Grid overlay effect does not disappear when it should 868423 - Launcher - Workspace switcher should not be in the Launcher by default 874146 - Multimonitor: New windows open on the wrong monitor, Place Plugin settings silently ignored 875311 - Expo animations "Fade + Zoom" & "Vortex" result in a black screen 878516 - Window management - Restoring a grid-placed window by dragging the title bar downwards does not restore the original window width 925867 - [regression] Window resize granularity is lost when restored after using Grid 928807 - Multi-monitor - Maximized windows cast shadows on adjacent monitors and workspaces 936840 - key now known as which breaks keyboard shortcuts 950160 - Unity blocks other programs from binding globally to Super+* (* = any key) 1002246 - Window management - When a monitor is disconnected, the windows do not move to the remaining monitor and the Launcher pips do not update 1007944 - XFCE + Compiz : icons in the titlebar have a black background instead of transparent 1009999 - Shift Switcher: Window title display settings partially ignored 1012330 - [needs-packaging] Wishlist: Missing plug-In: Wizard 1020823 - [regression][GLES] cubeaddon plugin does not build any more 1020825 - [regression] thumbnail plugin does not build any more 1020830 - [regression][GLES] wallpaper plugin does not build any more 1026920 - Incorrect detection of shader support on fglrx 1028809 - [regression][GLES] obs opacity no longer applies to all window decorations 1033877 - Member variables that are not initialized in the constructors reported by cppcheck 1033879 - Memory leak in decorator reported by cppcheck 1037164 - Clicking on semi-maximized windows in a different workspace fails to switch to the correct workspace 1042132 - [GLES] Regression: Text background rendering broken - black rectangle instead of rectangle with rounded edges and transparency is drawn 1047788 - [GLES] Regression: Screenshot selection rectangle is now solid instead of being transparent 1048267 - [regression-r3320][GLES]: showmouse plugin does not work anymore at all 1048272 - [regression][GLES]: Cube plugin: Transparency for top and bottom faces broken 1048505 - [regression-r3320] firepaint doesn't paint any fire any more 1048840 - compiz crashed with SIGSEGV in DodgeAnim::applyDodgeTransform() 1048855 - [grid] Gedit, Nautilus will not snap/semi-maximize with the mouse 1050776 - kde4-window-decorator crashes when starting up with oxygen theme 1051595 - findcompiz_install doesn't work 1051802 - "Unredirect Fullscreen Windows" can cause significant tearing on fullscreen windows (especially playing video) 1053280 - Button1 Actions are triggered regardless of whether or not they are actually active 1056615 - CompizConfigPython.test_* fail with SEGFAULT 1057955 - Removed schema keys still used in keybindings and automated tests 1058149 - compiz fails to build with GNU gold linker 1058577 - CCSGNOMEMediaKeys/CCSGNOMEIntegrationTestWriteIntegratedMediaKeys. TestWriteIntegratedMediaKey/* fail in jenkins 1058638 - GrabGrabHandlerTest.TestNoTrackOnExpoGrab fails when run independently 1059549 - [regression] [quantal] Workspace overview (expo) doesn't always display the active workspace colored 1060171 - gtk-window-decorator crashed with SIGSEGV in g_hash_table_lookup_node() from g_hash_table_remove_internal() from event_filter_func() from gdk_event_apply_filters() 1060327 - compiz crashed with SIGSEGV in compiz::opengl::bindTexImageGLX() from TfpTexture::bindTexImage() 1060708 - Redundant check for libcompizconfig_internal in compizconfig gsettings tests 1060804 - Compiz can't build with clang 1063690 - Unredirect fullscreen windows should be the default for optimal performance 1064791 - Redundant writes to plugins-with-set-keys 1065814 - compiz crashes with SIGSEGV in ccsGNOMEIntegrationInitializeIntegratedSettingsList [ccs_gnome_integration_constants.c:170] 1065815 - compiz crashes with SIGSEGV in startup: ./bin/compiz (core) - Fatal: Private index value "15CompositeScreen_index_5" already stored in screen. 1066187 - Enhanced Desktop Zoom: Specific Zoom Factor ignored 1066793 - std::vector > is duplicated in 63 plugins 1066795 - WrapableInterface is duplicated in 38 plugins 1066796 - WrapableInterface is duplicated in 56 plugins 1066798 - WrapableInterface is duplicated in 31 plugins 1066799 - WrapableInterface is duplicated in 26 plugins 1066803 - std::vector > is duplicated in 6 plugins 1066804 - WrapableInterface is duplicated in 37 plugins 1066805 - WrapableInterface is duplicated in 15 plugins 1066823 - Editors like gedit and others will not recognize *.xml.in files as xml, so if opened there is no syntax highlighting making those files harder to read. 1067218 - std::vector > is duplicated in 2 plugins 1067219 - std::vector > is duplicated in 2 plugins 1067234 - Duplicate file: include/core/point.h == src/point/include/core/point.h 1067534 - "Show desktop" plug-in actually works with Unity when ensured that it is loaded after unityshell 1067577 - Compiz (grid) fails to build due to explicit instantiation 1067598 - Unity fails to build due to explicit instantiation of templates in compiz. 1067812 - Gedit, blocked window at the corners with compiz grid plugin 1067964 - CCSGSettingsBackendConcept tests fail in continuous-integration due to incorrect linking 1068173 - [Multimonitor] [Grid] plug-in: The window snapping does not follow the preview, but uses the display the mousepointer is on when the mousebutton gets released 1068503 - scaleaddon: Draw Window Highlight is a solid white rectangle. No transparency. 1068518 - resize: Resize rectangle flickers between light and dark 1070211 - Compiz fails to build in Arch Linux 1070233 - Resizeinfo Plug-in: Gradient color 2 and 3 settings are ignored and no background gradient is rendered 1070297 - Resizeinfo Plug-in: No possibility to change the color and transparency of the rounded background outline 1070411 - Can not find target to add properties to: compizconfig_gnome_gsettings_integrated_setting 1070817 - make test fails in CompizConfigPython.test_* (OTHER_FAULT) 1071238 - Test failures: ExpoAnimationOffsetTest/ExpoWallOffsetTestAnima- tions.TestAnimationValues/21 (from ExpoAnimationOffsetTest_ExpoWallOffsetTestAnimations) 1071689 - Grid: Window management - resize preview does not show when moving a window from the semi-maximised state to the maximised state in a single action 1071791 - Maximized windows are moving between workspaces all by themselves 1075048 - lp:compiz r3447 FTBFS: compizconfig_test_ccs_object.cpp:123:9: error: expression result unused [-Werror,-Wunused-value] GET_INTERFACE (Dummy2Interface, to); 1075451 - gtk-window-decorator crash when pressing Alt+Space to activate actionmenu on windows without decorations (e.g. google-chrome) 1075584 - Workspacenames Plug-in: Wishlist: No default values for workspacenames, should be changed 1075600 - Workspacenames Plug-in: Wishlist: Default Appearance values not ideal 1076876 - 100_expo_layout.patch does not apply totally cleanly 1077787 - CompizConfigPython tests not using ini backend 1077823 - gtk-window-decorator: decorator.c : a small typo error 1077866 - untest fails to link with binutils-gold 1078244 - FTBFS with GLES enabled in plugins/opengl/src/screen.cpp 1078330 - It is possible to write to a plugin in compizconfig that has no associated gsettings schema 1080555 - Tests 1-4 fail with SEGFAULT: CompizConfigPython.test_* (SEGFAULT)... 1081425 - [regression] Window decorations ignore brightness/opacity changes in expo 1082152 - compiz 0.9.8.6 fails to build from source in KDE4-window-decorator with latest KDE 4.10 beta 1082265 - KDE Appmenu doesn't work with compiz decorators 1082633 - CMake Warning in src/tests/CMakeLists.txt:16 This command specifies the relative path 1083027 - cmake suggests (kind of) expo is disabled but it still builds correctly. 1084096 - When building with xorg-gtest, cmake fails to find xorg-gtest sources 1084162 - unity build fails if compiz is installed outside /usr 1084401 - Unredirected fullscreen windows freeze and stay on top when wall sliding (Ctrl+Alt+Left/Right) 1085581 - Windows open below panel and launcher, grid does not work at all, window animations missing, and general plugin chaos if built on raring (cmake >= 2.8.10) 1085590 - GLib warning - source still attached to context, but ref_count == 0 on shutdown 1085591 - --replace race condition: Another window manager is already running on screen 1085687 - CCSObjectDeathTest.GetInterface fails 1086337 - HTML5 video in Firefox continues to tear 1086704 - Build uses pyrexc without checking that it exists 1086779 - EGL/GLES compiz builds do a eglWaitGL (synchronous wait) on every frame, likely to slow things down 1086789 - Build warning "multiple rules generate gtk/gnome/compiz.desktop. build will not be correct; continuing anyway" 1087193 - Windows don't respond to input (mouse clicks) if XShape is disabled or unavailable 1088414 - On ARM lp:compiz defaults to GL instead of GLES and FTBFS unless you -DBUILD_GLES=ON 1088419 - compiz fails to configure on arm with -DCOMPIZ_BUILD_TESTING=ON [package 'gl' not found] 1088996 - FTBFS after python2.7 upgrade - missing pyconfig.h 1089246 - Add support for blacklisting some drivers from using unredirected fullscreen windows 1089250 - [clang] lp:compiz r3523 FTBFS: unused function 'ListValueToSettingValueList' [-Werror,-Wunused-function] 1089251 - [clang] Multiple segfaults in test: SetSemantics 1089811 - [Regression] Minimizing a window creates an input-insensitive area if you have unityshell loaded 1089863 - KWD: Appmenu always pops up at top-left corner of the screen 1090845 - ccp can fail to compile, as CompizPlugin is not included 1091103 - Default blacklist string shouldn't contain double escape 1092651 - CCSM segfaults if no settings found 1093757 - Using grid-resize prevents windows from maximizing correctly 1095001 - [regression] compiz spends 31% of its CPU time in regexec() 1095906 - Building compiz with clang++ on raring fails to build libgtest 1095915 - opengl plugin FTBFS with clang 1096455 - Compiz reports incorrect _NET_DESKTOP_GEOMETRY until first viewport switch 1096780 - Plugin names are not sorted (they're shown in directory order) when cmake is run 1097126 - resize leaks memory in multiple locations calling resize::CompScreenImpl::findWindow() -> operator new() 1097179 - compiz_test_resize_logic: Multiple errors: Conditional jump or move depends on uninitialised value(s) 1097644 - Several leaks in new GLProgram from compileProgram() from GLScreen::getProgram() from GLWindowAutoProgram::getProgram() 1097649 - Several leaks in g_settings_new() [g_object_new()] from ccsGSettingsNewNoPath() [ccs_gsettings_interface_wrapper.c:184] 1097657 - PrivateGLScreen::projection is leaked 1097661 - Several leaks in ccsIntegratedSettingListAppend() ... from ccsGNOMEIntegrationBackendGetIntegratedSetting() from readSetting (gsettings.c:375) 1097664 - GLShaderCache::priv [PrivateShaderCache] is leaked 1098148 - Compiz 0.9.8 trunk FTBFS on ARM due to an unused variable 1098758 - Thumbnail Window Previews: Flickering of background/glow and window title text 1098877 - Showmouse plugin: Possible values of the particle life setting can destroy the plugin's functionality 1100172 - Workspacenames plugin: Requires text plugin to work 1100539 - Several memory leaks in ccsIntegratedSettingListAppend() from ccsIntegratedSettingsStorageDefaultFindMatchingSettingsByPredi- cate() from ccsIntegratedSettingsStorageDefaultFindMatchingSett- ingsByPluginAndSettingName() 1100564 - Several memory leaks in strdup() from ccsGSettingsIntegratedSett- ingReadValue() from ccsGNOMEIntegrationBackendReadISAndSetSett- ingForType() from ccsGNOMEIntegrationBackendReadOptionIntoSett- ing() 1101430 - Coverity MISSING_BREAK - CID 12468 1101465 - Coverity MISSING_BREAK - CID 12467 1101557 - Coverity MISSING_BREAK - CID 12465 1101558 - Coverity MISSING_BREAK - CID 12466 1102822 - Several memory leaks in g_signal_new() ... from ccsGSettingsWrapperNewForSchema() [ccs_gsettings_interface_wrapper.c:184] from initBackend() [gsettings.c:468] 1102829 - Several memory leaks in google::protobuf::DescriptorPool::InternalAddGeneratedFile() from google::protobuf::protobuf_AddDesc_*() Release 0.9.8.4 (2012-09-27 Daniel van Vugt ) ============================================================================ Highlights * Fixed a few crashes affecting a lot of people. Especially users of VMs and LLVMpipe. * Significant improvements to "Unredirect Fullscreen Windows" mode, which is particularly useful for fullscreen gaming performance. - Flickering is mostly fixed. - Multi-monitor unredirect is dramatically faster than previous versions. - Fixed automatic redirect/unredirect entry/exit bugs. To try it out, enable: CCSM > Composite > Unredirect Fullscreen Windows. The option is not enabled by default yet because there are some issues with driver stability, particularly with nouveau and intel. * Major gsettings/compizconfig bug fixes and refactoring with lots more test cases. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.8.4) 92599 - Incorrect (low/stuttering) refresh rate with NVIDIA driver (regressed in compiz 0.9.8 series) 927168 - compiz crashed with SIGSEGV in memmove() from drisw_update_tex_buffer() from dri_set_tex_buffer2() from drisw_bind_tex_image() from __glXBindTexImageEXT() from TfpTexture::enable() from enableFragmentOperationsAndDrawGeometry() 944653 - compiz crashed on startup with SIGSEGV in strstr() from GLScreen::GLScreen() 1004336 - _itoa_word() from window.cpp:1989: Use of uninitialised value of size 8 1030891 - Compiz r3275 breaks VirtualBox Guest Additions: black screen or just wallpaper 1035261 - Port compiz to gsettings and consequently remove unity-2d 1037142 - Week33 - Grid highlight window appears while switching between workspaces 1037411 - [regression][DRI] SubBuffer rendering is much slower in compiz 0.9.8.0 than it was in 0.9.7 1039406 - Benchmark default placement overlaps (damages) Unity launcher and panel, resulting in artificially low benchmark results 1041535 - compiz crashed with SIGSEGV in __strcasestr_ia32() from ccsStringToModifiers(binding=NULL) 1042041 - 1:0.9.8+bzr3319-0ubuntu1 regression: keeps setting gsettings keys to wrong values 1042537 - ccsm crashed with SIGSEGV in ccsContextNew 1042552 - Paint List is often full of 1x1 offscreen windows from gtk-window-decorator 1045127 - Close from spread is unreliable 1046664 - Unredirected fullscreen windows flicker briefly when another window (like a menu) opens above them 1046701 - Random test failures in CCSGSettingsBackendConcept 1047168 - scale mode is not visible if a fullscreen window is unredirected 1048551 - multiple GObject warnings if gtk-window-decorator is started without org.gnome.mutter being installed 1048964 - cmake fails on python 2.6 as sys.version_info does not contain major_version or minor_version 1049100 - Build failure if COMPIZ_DISABLE_PLUGIN_RESIZE=ON 1049169 - [valgrind] Up to 520,000 bytes lost when runningi CCSGSettingsBackendConceptTest 1050704 - Unity 6.6: panel shadow is always on top of the active window 1050749 - Unredirecting a fullscreen window on a secondary monitor causes that monitor to flicker 1050752 - opacify plugin toggling by default doesn't work 1050757 - opacify plugin: opacity isn't reset after switching window 1050796 - Double shortcuts conflict with gnome-control-center ones 1051286 - [performance] glXSwapIntervalEXT called every frame, which is very slow on Nvidia. 1051885 - Unredirect Fullscreen Windows makes multi-monitor rendering much slower 1052838 - compiz.fix_927168 broke ARM building 1053902 - Maximized window gets unredirected when it's not fullscreen 1054724 - [fglrx] compiz crashed with SIGSEGV in glXDestroyContext() [/usr/lib/fglrx/libGL.so.1] from GLScreen::~GLScreen() 1050610 - gtk-window-decorator leaking window handles. Window operations become sluggish after a few days of usage 1056645 - ARM build broken with 'swapInterval' is not a member of 'GL' 1057263 - gtk-window-decorator leaks large numbers of pixmaps and pixmap memory 1057421 - FTBFS with -DCOMPIZ_BUILD_TESTING=OFF if libgtest-dev is not installed Release 0.9.8.2 (2012-09-10 Daniel van Vugt ) ============================================================================ Highlights * gtk-window-decorator has been fully ported from GConf to GSettings. * Gamers rejoice! CCSM > Composite > "Unredirect Fullscreen Windows" now works more reliably, with a few bugs remaining. If you turn it on then fullscreen windows like games will get direct rendering access and won't be slowed by Compiz (or Unity) any more. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.8.2) 956986 - compiz crashed with SIGSEGV when imgsvg is loaded, in getCompPluginVTable20090315_imgsvg() from dlloaderLoadPlugin() from CompPlugin::load() 974242 - Compiz is moving windows against my will 976032 - Place plugin problem with panel in fullscreen and gnome classic 980663 - Compiz won't start if "unredirect fullscreen windows" is enabled 1014986 - [performance] compiz is wasting CPU responding to repaint requests for offscreen windows 1024214 - Tests can disappear from make test when CMake regenerates CTestTestfile.cmake 1040081 - [regression] Week 34: Ctrl+Alt+T shortcut (open terminal) fails to work 1040455 - Setting the UnMinimize animation is ignored (default animation still used) 1041047 - Unredirect Fullscreen Windows stay on top (unredirected) even when they're not on top any more (or the output is transformed) 1041066 - Unredirect Fullscreen Windows sometimes fails to unredirect fullscreen windows at all 1041310 - compiz 0.9.8.0 rev3321 fails to build on kde4-window-decorator 1042095 - AUTHORS is out of date in compiz-0.9.8.0. Needs to be updated from the bzr log. 1043143 - Unresolved symbols in plugins are not detected at build time, instead cause cryptic crashes in COMPIZ_PLUGIN_20090315() 1045191 - compiz crashed with SIGABRT in assert from boost::shared_ptr::operator-> from ResizeLogic::enableOrDisableVerticalMaximization() from ResizeLogic::handleMotionEvent() 1045235 - Compiz crashed with SIGFPE in addQuads() [plugins/opengl/src/paint.cpp:839] 1045652 - UnMinimize should be spelled "Unminimize" 1045665 - CMake Error at cmake/EnableCoverageReport.cmake:69 (SET_TARGET_PROPERTIES): set_target_properties Can not find target to add properties to: compizconfig_ccs_settings_upgrade_internal 1046184 - __pyx_f_12compizconfing_ListToStringList defined but not used 1046190 - Migration to gsettings doesn't migrate compiz/unity configurable keys to g-c-c and those keys doesn't work 1046199 - Changing a key to org.compiz.integrated schema doesn't impact the current profile 1046212 - show-hud integration does not work 1046661 - Unredirect Fullscreen Windows stay on top (unredirected) even when an RGBA window is stacked above it Release 0.9.8.0 (2012-08-23 Daniel van Vugt ) ============================================================================ Major New Features * Single source tree: All plugins/libraries are in lp:compiz now * OpenGL|ES support (e.g. for ARM platforms) * GSettings support, as a backend for storing compizconfig * Buffer swapping on every frame: allowing compiz to take advantage of driver features such as page flipping and triple/quad buffering. This results in noticeably higher physical frame rates, and smoother graphics. Disabled Features In order to complete support for OpenGL|ES, some plugins were not (yet) ported and have been disabled for now. Those are: animationaddon, bicubic, blur, colorfilter, cubeaddon, gears, group, loginout, reflex, thumbnail, stackswitch, wallpaper, trip. However, those are only 13 out of 84 plugins. We welcome patches to revive the disabled plugins. Bugs Fixed (https://launchpad.net/compiz/+milestone/0.9.8.0) 201342 - Tearing on secondary monitors even when "Sync To VBlank" is turned on. 454218 - Loss of window border (white flash) when using compiz resize plugin, option=normal 755842 - Non-maximized windows which sit on the border of a workspace move when called 770283 - [fglrx] Title bar does not update on non-maximized windows 803296 - [regression] Compiz Resize plugin: When "Default Resize Mode" = Normal, resizing is extremely slow and CPU intensive 862430 - window flicker for a short time after switching workspaces 886605 - Desktop, Launcher and menu bar still visible when screen locked 892012 - Window management - When a semi-maximised a window is maximised and then restored, the window position jumps and window size changes so the the window title bar is sometimes hidden underneath the top bar 901097 - Add option to use glXSwapBuffers on every frame, not just full-screen redraws. 904205 - Desktop wall: Bindings for next/previous don't wrap to the next row 929989 - compiz (decor) - Warn: failed to bind pixmap to texture 930783 - mouse poll is jerky at the default setting of 40ms 932520 - Some windows on start up don't show full window 933776 - [regression] scale/spread: "Initiate Window Picker for All Windows" does not show all windows. It shows only windows from curent workspace. 946388 - Some apps (like Remmina) can't full-screen under Compiz (or Unity) 955035 - Super-W shows vanishing windows the first time you hit it. Windows fly off the screen instead of spreading. 960652 - Switcher remains open after super+tab has been used. 963794 - gtk-window-decorator crashed with SIGFPE in _decor_blend_horz_border_picture() 972519 - Compiz-core fails to compile with gcc-4.7 - 'cc1plus: all warnings being treated as errors' 976467 - [regression] Compiz 0.9.7.6: Menus often have no shadows at all 978900 - Menu shadow clipping flickers while switching menubar items/indicators 980026 - Compiz should not move windows to workspace 0,0 when restarted 981703 - regression / unable to interact with window-titlebar (window decoration) after minimizing/unminimizing gnome-terminal 987639 - [0.9.8 r3110 regression] Windows lose decorations during "scale" (window spread) 987647 - Mouse pointer doesn't change when dragging windows in expo 988684 - [regression] Starting a second instance of compiz (without --replace) causes the existing instance to shut down (gracefully) 989545 - [regression] compiz --replace fails to start 990690 - Get libcompizconfig under test 993608 - CMake Error at FindCompiz.cmake:84 (include): include could not find load file: CompizDefaults 994841 - 'make test' fails lots of test cases if you don't have Xvfb installed 996901 - regression / gtk-window-decorator crashes / doesn't start properly -> rev3131 is culprit 999019 - [regression] Bug 994841 ('make test' fails lots of test cases) regressed in lp:compiz-core r3133 1002602 - [nvidia] [0.9.8 r3110 regression] With bug fix 862430 unfocussed windows are displayed white 1002606 - [0.9.8 r3110 regression] 2nd un-maxed window often opens overlapping adjacent workspace 1002715 - [regression] Misspelled plugins are silently ignored 1002721 - [regression] compiz fails to load plugins from LD_LIBRARY_PATH 1004251 - Animations aren't smooth when sync to vblank is enabled 1004335 - wall.cpp:588: Conditional jump or move depends on uninitialised value(s) 1004338 - screen.cpp:4364,4372: Conditional jump or move depends on uninitialised value(s) 1004848 - CompizConfigPython.test_plugin test fails when opengl isn't enabled 1005008 - Can't disable building ccp plugin 1005009 - Can't disable building grid plugin 1005176 - libcompizconfig headers still don't install in the right place 1005177 - Compizconfig-python still doesn't respect DESTDIR when not exported 1005569 - [callgrind] compiz spends ~25% of its time constructing/destructing strings in PrivateScreen::handleActionEvent 1006335 - [callgrind] compiz spends ~7% of its time inserting into and destructing the events list in PrivateScreen::processEvents() 1007299 - Compiz frame rate decreases if application frame rates are too high (unthrottled) 1007754 - gtk-window-decorator crashed with SIGSEGV in meta_get_decoration_geometry 1008020 - New windows can be stacked above panels if they are created just after an override redirect window is created 1009320 - Benchmark key is not consumed by compiz. It gets passed to the underlying window. 1009338 - composite refresh rate falls back to 50Hz, which is wrong in most cases 1012205 - [needs-packaging] Wishlist: Missing plug-In: Stackswitch (Stack Window Switcher) 1012956 - Unintended shadows are rendered for the Unity Launcher and Panel 1014461 - decor fails to start any window decorator by default (option "command" is blank upstream) 1015151 - [BNR] Compiz crash in movementWindowOnScreen (caused by fix 755842) 1015422 - compiz is wasting memory leaving a shell running: /bin/sh -c /usr/bin/compiz-decorator 1015593 - crash in gtk-windows-decorator meta_get_button_position 1015898 - No decorator is started if compiz is run without any path prefix 1016366 - Potential cases where textures can become invalid where plugins need the image for animations 1016367 - Potential race condition where X commands haven't finished processing when we bind a texture and generate mipmaps 1018302 - [regression] main.cpp:222,225: Conditional jump or move depends on uninitialised value(s) 1018602 - [gsettings] Invalid write of size 4 in readOption 1018730 - [gsettings] Lots of warnings about key names >31 characters, which also causes CCSM crashes. 1018916 - ccsm and compizconfig python files don't get installed 1019337 - gtk-window-decorator crashes with BadWindow (invalid Window parameter), from XGetWindowProperty() from get_frame_type() 1021104 - Severe damage artefacts and flickering when using LLVMpipe 1021139 - make ExperimentalMemCheck; fails CompTimerTestCallback.TimerOrder 1023738 - make -j3 randomly fails with sed: -e expression #1, char 6: unterminated `s' command 1023742 - make -j2 randomly fails with /bin/sh: 1: _intltool_update-NOTFOUND: not found 1024179 - make install in unity fails to install org.compiz.unity*.gschema.xml 1029383 - Make fails with: /bin/sh: 1: cannot open g': No such file (when attempting to build Unity) 1030473 - Error-reports cppcheck (http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page) 1033085 - Typo in "Commands" plugin description: "bundings" -> "bindings" 1033531 - Single click inside the Workspace Switcher should always return to a workspace 1036490 - [regression] compiz crashed with SIGSEGV in g_main_context_iteration() from ... from CcpScreen::timeout() 1036542 - [regression] Clicking launcher icons in expo mode now exits expo mode 1036739 - Window management - decouple window minimise and restore/maximise animation timings 1037710 - Tearing at top of laptop screen 1039482 - imgsvg build failure on quantal 1039834 - paralell builds can fail on resize_logic 1039843 - make fails if librsvg-2.0 < 2.36.2 Release 0.9.7.6 (2012-04-06 Sam Spilsbury ) ======================================================================== Bugs fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.6) 968985 - Memory leak in dlloaderListPlugins 969102 - priv->invisible is not updated when the window is mapped 919139 - window management, multi-monitor - In multi-monitor environment, windows should spread on the monitor in which they reside 931883 - Improve performace of the shadow clipping code 969101 - DecorWindow::computeShadowRegion called way too much Use gtest_add_tests for more detailed testing output Release 0.9.7.4 (2012-04-02 Daniel van Vugt ) ============================================================================ Bugs fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.4) 833729 - compiz crashed with SIGSEGV in CompositeScreen::compositingActive() 888704 - Window management - Closing one window sends others to the background 953089 - Unity 5.6: key bindings (such as Super) don't work on empty workspace or on slow/loaded systems 953839 - [regression] Invisible resize border is now only 1px wide 957572 - Coverity REVERSE_INULL - CID 10888 960831 - Unity dash opens and immediately closes if you tap Super+A quickly 962085 - [0.9.7.2] gtk-window-decorator receives BadWindow errors 963093 - Unity 5.8: Flickering and corruption on Unity UI elements 963264 - We are using 1 bad hack for compiz hanging on startup 963465 - Unity 5.8: Can't login to Unity since upgrade to 5.8 963470 - [regression] Unity 5.8+Compiz 0.9.7.2: Pressing Super+Tab or Super+W works, but unity does not respond to when Super is released. 963633 - Unity 5.8: Login to blank screen (all black or just wallpaper) 964248 - Tests do not build when libgtest-dev is installed but libgtest isn't Fixes REMOVED for stability reasons: 682788 - Global menu is not ergonomical on large screens 806255 - Unity/compiz intercepts Super and Alt keypresses from grabbed windows like VMs. 931245 - Finish the implementation of the locally integrated menubars Release 0.9.7.2 (2012-03-19 Daniel van Vugt ) ============================================================================ Bugs fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.2) 806255 - Unity/compiz intercepts keystrokes from grabbed windows. 808007 - compiz crashed with signal 5 in Glib::exception_handlers_invoke() 682788 - Global menu is not ergonomical on large screens 931245 - Finish the implementation of the locally integrated menubars 938417 - lp:compiz-core fails parallel builds (make -jN) 943194 - [regression] Pressing alt doesn't show the menu title bar in top panel 943612 - Alt+Right arrow key trigger a kind of Alt + Tab 943851 - [unity 5.6] Pressing Alts steals focus from current widget, cannot compose characters with AltGr 944979 - Quicklist are not showing if right-clicking a launcher icon in Expo mode if triggered by Super + S 945373 - Regression: ALT + Drag doesn't behave how it should 945816 - [regression] Changing the HUD shortcut disables all Alt-based combinations 946118 - screen.cpp:3281: virtual bool CompScreenImpl::addAction(CompAction*): Assertion `priv->initialized' failed. 953089 - Unity 5.6: key bindings (such as Super) don't work on empty workspace or on slow/loaded systems Release 0.9.7.0 ( 2012-03-02 smspillaz ) ======================================================================= Release version 0.9.7.0 Bugs Fixed (https://launchpad.net/compiz-core/+milestone/0.9.7.0) 92599 - Incorrect (low/stuttering) refresh rate with NVIDIA driver 254561 - Benchmark window slows the system and degrades graphics resources 684731 - Windows that hide themselves when closed don't appear in any "this workspace" switcher 690239 - hang in g_spawn_sync and select() 694169 - word misspelled - bunding 716521 - sometimes, restored window placed too high. 720679 - Compiz clears the root window in the installer session 724093 - unity-window-decorator: When switching between windows, Orca does not speak the title of the focused window. 732997 - Cannot open a window that starts iconified 737125 - Minimize animation flickr when for maximized apps 740258 - Pixmap memory leak in gtk-window-decorator 748840 - Windows should not automatically be focused when opened if the focus is on another application 755841 - [sandybridge] Graphics tearing when playing video 758398 - Bitcoin top-level window unmapped 763005 - Compiz's "Sync to Vblank" makes display stutter/slow with fglrx 764330 - [regression] Moving windows lags behind the mouse by 1-2 seconds; appear to freeze when dragging. 764673 - Launcher - Spread should not affect the state of window 780505 - Untranslated strings in gtk-window-decorator 790565 - Clicking on a tweet/message link sometimes does not work 795065 - scrolling on top of a close animation switches viewports 796594 - Window behaviour - pressing the 'restore' window indicator on a semi-maximised window should return it to the restored state 798868 - unity video tearing when moving windows in oneiric with nvidia-current 812711 - dialogs really slow to be displayed since the compiz update 837252 - It is possible to stack windows relative to windows that are destroyed 841727 - Should keep list of windows last sent to server and last recv from server 845719 - compiz and X can disagree on the stacking order 847967 - A minimized window 'remains' behind on the desktop if /apps/compiz-1/plugins/unityshell/screen0/options/ show_minimized_windows is set to true 853734 - maximized windows fail to update their input extents when undecorated 854725 - resizing bugs with xterm 856015 - crash on closing a window 857201 - Java application windows cut-off/truncated/not displayed properly 857487 - compiz crashed with SIGSEGV in CompScreen::insertServerWindow() 857738 - compiz crashed with SIGABRT in raise() 858625 - Applications which create multiple windows that are transients of each other can be given invalid stack positions 858629 - Windows move to 0,0 on compiz restarts 859431 - Crash when selecting Evolution in alt-tab 860286 - invisible window when a window is mapped but not yet drawn on by the process mapping it 860304 - race condition in configureXWindow causes unpredicatable window geometry changes 860306 - windows that are decorated while resizing can cause incorrect resize results 860309 - Moving a window while it is being resized by core caused unpredictable movement 860397 - Windows which are marked transients of docks should be treated like docks 861341 - can't maximize windows on second monitor and Qt windows displayed in wrong place 861909 - compiz crashed with SIGSEGV in PrivateWindow::configureFrame() 862719 - closing a window gives focus to last minimized window 863328 - Launcher - If a spread contains minimised windows, when the spread exits, the minimised windows momentarily appear on the desktop before disappearing 864478 - Window shading is broken 865696 - Windows from other workspaces missing decorations in window spread 865863 - Opening mumble can cause it to be stacked above the dash if you open the dash at the same time 866752 - Sometimes configure events are missed and windows move slow as a result 869759 - screen edge trigger does not work until manually restarting unity 869919 - Click-dragging a window that's stacked above a fullscreen window will cause it to go underneath the fullscreen window 871801 - window management, alt-tab - After using 'show desktop' to minimise all windows, opening any new window also incorrectly restores all the minimised windows 873344 - compiz.desktop is not installed where GNOME2 libraries are not available 873364 - Drop GNOME2 Support 873379 - Disable lighting by default 873384 - Use smart placement by default 873389 - Compiz should read DESKTOP_AUTOSTART_ID when being started by the session manager 874004 - When a window is minimized on another workspace it doesn't appear in the spread 874854 - Add hooks for the workarounds plugin to change variables prior to and after GLXContext init to work around bugs in broken drivers 876575 - Moving windows between workspaces causes them to "jitter" / jump around 877920 - Some windows and all decorations become translucent when the "Resize Info" plugin activates. 878934 - Menu selection is wrong in Java apps 880707 - [regression] Compiz: Visible tearing is worse in 11.10 than 11.04, even when "Sync To VBlank" is enabled, but only when Unity is active. 882527 - Allow the scale plugin to be triggered over all viewports 882531 - Allow plugins to selectively track damage in real time 885440 - Add unit tests for CompOption 886935 - Invalid read on GLWindow::glDrawGeometry 886978 - compiz crashes with SIGSEGV in PrivateWindow::configure 890947 - Unity sends initial GDK_CONFIGURE event with position as (0,0) 891744 - Dragging windows stutter during and after grid animation 893995 - POTFILES is breaking the build 893998 - Fix warnings in CompTimer 894639 - Hook up Xig tests to compiz' CTest system 896591 - Plugins that get initialized before screen initialization is done can not have their actions added 896762 - Switching viewports with ctrl-alt-(left/right/up/down) does not give the highest window on the target viewport focus 897045 - compiz spins in CompTimeoutSource::callback, stops responding and starves other timers if CompTimer::setTimes(0). 908042 - Test timer-callbacks suffers from a race condition 911530 - Fix uninitialized read in paintBackground 913823 - Remove unecessary hacks from core in order to work around broken drivers on startup 915186 - make install: Files missing from include/compiz/core 915950 - Tests required for window placement in dead areas for multimonitor 917210 - compiz+unity3d generates > 50 wakeups a second on idle system 917571 - compiz-core (currently version 0.9.5) is actually newer than the existing releases versioned 0.9.6 918554 - Some plugins no longer build due to undefined DEG2RAD 918762 - Compiz crashes with SIGSEGV in PrivateWindow::configure 919920 - lp:compiz-core (r2930) does not build 919922 - compiz-core ABI is broken / out of sync 919940 - 'make install' no longer installs 'bin/compiz' (seriously) 919948 - 'make install' installs redundant static libraries (now part of core) 919970 - compiz-core contains duplicate conflicting class definitions 920847 - point.h and rect.h being installed to the wrong place 921406 - lp:compiz-core r2961 fails to build with glib 2.30 (seems to require 2.31) 921451 - compiz::X11::PendingConfigureEvent::dump(): Conditional jump or move depends on uninitialised value(s) / Use of uninitialised value of size 8 922450 - 'make install' installs unwanted files libcompiz_place_constrain_to_workarea.a, libcompiz_place_screen_size_change.a 923572 - Merge (overwrite?) lp:compiz-*-plugin back into lp:compiz-plugins-{main,extra} 923583 - lp:compiz-core r2968 fails to build 923662 - [regression] lp:compiz-core r2968 broke direct rendering 923683 - [regression] window movement is erratic and buggy (briefly on startup) 924691 - [regression] XSynchronize is always enabled (shouldn't be, and wasn't in oneiric) 924736 - [gtk-window-decorator] Semi-maximized windows have no shadow or frame 925293 - Plugins can't tell the difference between a modifier key-tap, and a modifier key-release (after being used to modify other keys) 925979 - [regression] compiz fails to pass through + events to apps if a plugin is bound to just 928044 - [regression] lp:compiz-plugins-main r16 fails to build with lp:compiz-core r2982 928173 - [regression] Window resizing jitters/flashing is worse in lp:compiz-core than oneiric 928655 - [regression] Vsync is lost (constant graphics tearing) after plugins render effects 929443 - lp:ubuntu/libcompizconfig (r59) fails to build with the latest lp:compiz-core (r2990) 929446 - lp:compiz-plugins-main (r18) fails to build with the latest lp:compiz-core (r2990) 929449 - lp:compiz-plugins-extra (r9) fails to build with the latest lp:compiz-core (r2990) 930071 - gtk-window-decorator can crash in active_window_changed upon demaximizing a window 930412 - [regression] no core keybindings work any more 931283 - compiz crashed with SIGSEGV on shutdown 931473 - Menus don't fully appear 931500 - post 0.9.7 snapshot: FTBFS on armel 931927 - [regression] Customized shortcuts don't work in compiz 1:0.9.7.0~bzr2995-0ubuntu1 931958 - 0.9.7: impossible to click on keyring dialog since the upgrade 932087 - Initialize the _NET_WM_STATE_FOCUSED 933226 - compiz-core r3001 (and 3002) ftbfs 934058 - [regression] Launcher, top panel and keyboard un-responsive after using any Super-x shortcut 936487 - compiz crashed with SIGSEGV in XDefineCursor() 936675 - Windows can end up stacked at the very top of the stack if no other windows and nautilus on the desktop are not open 936774 - Maximized windows do not get shadows at all 936778 - Quickly demaximized windows can receive maximized window decorations if they were initially maximized 936781 - No draggable border if mutter isn't installed 938478 - Unresolved symbols in plugins cause compiz to exit (looks like a crash) 940066 - decor_match_pixmap (decoration.c:423): Conditional jump or move depends on uninitialised value(s) 940115 - Memory leak at DecorWindow::updateSwitcher() (decor.cpp:2258) 940139 - [callgrind] compiz spends about 51% of its CPU time in CompRegion construction/destruction 942890 - "Svg" and "Png" should be "SVG and "PNG" Added Unit Tests Switched to Google Test for Unit Tests Added Xig Integration Tests Release 0.9.5.92.1 ( 2011-08-20 Sam Spilsbury ) ============================================================================== Release (0.9.5.92.1) Fix failure to build from source due to merge failure on the last release Release 0.9.5.92 ( 2011-08-20 Sam Spilsbury ) ============================================================================ Development Release (0.9.5.92) Added GSettings schema generation Revised libdecoration interface Fixed crashes on shutdown Don't unredirect overlay windows until they have been shaped Release 0.9.5.0 ( 2011-07-14 Sam Spilsbury ) =========================================================================== Development Release (0.9.5.0) Added new CMake commands to simplify releases Added unit tests Fixed a number of reparenting and stacking bugs Changed decoration interface. Now decorators can specify multiple decorations for a single window allowing compiz to cache decorations as needed Release 0.9.4 (2010-02-24 Sam Spilsbury ) ======================================================================== Development Release. Main loop implementation now replaced by the GLib main loop, use custom event sources and event dispatch synchronisation. Allows better integration with plugins that require tight timing with GLib timers Moved image and data generation into buildsystem extensions, and installation of such data into namespaced areas on the filesystem so plugins can't overwrite other plugin's data Intelligently clip window shadows in decor Fixed a number of 2D decoration issues Fixed a number of reparenting, stacking and focus issues Support different frame types in gtk-window-decorator Release 0.9.2.1 (2010-11-06 Sam Spilsbury ) ======================================================================== Bugfix release. Release 0.9.2 (2010-10-24 Sam Spilsbury ) ============================================================== Development release. Made minimization functions wrappable Decorators now get shadow settings from window properties on the root window and not through gconf, kconfig or dbus Allow resizing from the center of the window Clean up gtk-window-decorator Fixed a number of reparenting bugs Release 0.9.0 (2010-07-03 Sam Spilsbury ) ============================================================== Development release. Rewritten core in C++. Rewritten plugin APIs. Rewritten buildsystem in CMake, supports option code autogeneration, plugin build dependency handling, amongst other things. Smart wrappable functions, enables saving on otherwise useless CPU cycles. Reparenting window decorations. Support for tiled textures and screen sizes larger than max_texture_size through the use of the copytex plugin. Composite and OpenGL based rendering dropped from core, split into the opengl and composite plugins, which represent a step towards pluggable rendering backends. Ability to run in non composited mode added to gtk-window-decorator and kde4-window-decorator. kde-window-decorator dropped. Added KDE plugin to integrate with the QT main loop and create a KApplication for KCrash support on KDE. dbus plugin now uses screen number to identify compiz instance. Dropped multi-screen mode, launch compiz on individual screens instead. Shape drawing mode added to annotate plugin. Fixed screen updates issue in annotate plugin. Added serialization interface, which allows plugins to save/restore activity states between plugin and compiz reloads. Serialization info is stored in X11 window properties and is automatically dropped by the X Server when the window is destroyed. Added compiztoolbox library plugin used by switchers and screenshot, which provide a simple interface for accessing XDG and drawing thumbnails. Release 0.8.6 (2010-03-28 Danny Baumann ) ============================================================== Maintenance release. Various focus and window placement fixes. Fixed handling of windows that have a (server-drawn) border. Fixed handling of window icons that have a colour depth of 1 bit. Added KDE 4.4 support to KDE4 window decorator. Release 0.8.4 (2009-10-14 Erkin Bahceci ) ============================================================= Maintenance release. Fixed many crashes (including doPoll/eventLoop ones). Various memory leak fixes. Fixed lost window issues with windows that are visible on all workspaces. Fixed lost window issue when reducing the number of workspaces. Fixed placing of dialogs (e.g. PolicyKit) behind currently focused window. Fixed placing of new windows behind fullscreen window. Fixed and improved screen resolution change handling (Compiz now remembers original window size and position). Lowering a window now activates the topmost window when click-to-focus is on. Fixed wobbly title bar hiding and bouncing near panel edges. Screenshot plugin now saves to the correct desktop directory by default. Fixed inconsistent icon sizes in switcher plugin. Improved constraining of window size and position in move, resize, and wobbly. Ported KDE4 window decorator to KDE 4.3. Added support for _NET_REQUEST_FRAME_EXTENTS and _NET_SUPPORT_FULL_PLACEMENT EWMH hints. Release 0.8.2 (2009-03-01 Danny Baumann ) ============================================================== Maintenance release. Fixed issue in strut handling that could lead to struts being ignored for certain monitor configurations. Fixed window position constraining logic. Fixed kconfig xslt files missing from 0.8.0 tarball. Release 0.8.0 (2009-02-20 Danny Baumann ) ============================================================== Fourth stable release of compiz. New plugin "commands" that handles the bindings for arbitrary commands that previously were handled in core. In addition to the previously present key bindings button and edge bindings were added as well. New plugin "gnomecompat" which handles bindings that are exclusively used in the Gnome desktop environment and removed the corresponding bindings from core. This change fixes main menu and run dialog bindings for KDE users as those previously were conflicting between compiz and KDE. Gnome users upgrading should make sure to enable this plugin. Added support for _NET_WM_FULLSCREEN_MONITORS EWMH hint. Added support for reading the icon hint from the WM_HINTS property if _NET_WM_ICON is not available. Update Gnome support for Gnome 2.24. Added options to scale plugin that allow "toggle type" behaviour for key and button bindings. Several memory leak fixes. Adjusted gtk-window-decorator for newer libmetacity-private versions. Fixed gtk-window-decorator display for RTL languages. Adjusted kde4-window-decorator for KDE 4.2 API. Large number of minor bug fixes, especially in resize handling and stacking code. Translation updates Release 0.7.8 (2008-09-17 Danny Baumann ) ============================================================== Development release. New plugin "obs" that handles opacity, brightness and saturation bindings and matches. Put unresponsive window greyout, including options to configure it, to fade plugin. Add "constant fade time" fade mode to fade plugin. Removed opacity bindings and matches from core. Users that entered opacity matches should enable the obs plugin and enter the matches there. Enhanced timer infrastructure to allow synchronization of execution of multiple timer callbacks. Added matching for window's alpha channel (match type rgba=[0|1]). Reflect new Metacity "spacer" button type in gtk-window-decorator. Various bugfixes. Translation updates. Release 0.7.6 (2008-05-29 Dennis Kasprzyk ) ========================================================================= Development release. Rewrite of place plugin, which significantly improves multi-output behaviour. Configurable multi-output behaviour in place. Removed plane plugin. Former plane plugin users are encouraged to use the wall plugin of Compiz Fusion. Removed cube wallpaper painting. Users are encouraged to use the Compiz Fusion wallpaper plugin instead. Place plugin viewport placement viewport numbers are now 1-based. Panel and desktop selection mode in switcher plugin. Improved painting behaviour when using overlapping outputs. Gtk-window-decorator now emits accessibility events when switching. Gtk-window-decorator behaviour when using Metacity themes has been improved to match Metacity better. KDE4-window-decorator has been adapted to current KDE4 API. Various bugfixes. Release 0.7.4 (2008-03-04 Dennis Kasprzyk ) ========================================================================= Development release. Configurable handling of overlapping output devices. Enhanced focus stealing prevention with configurable amount of focus stealing prevention. Added configurable, optional delay for edge actions to prevent accidential invocation. Generalized vertex system to improve plugin compatibility. Optimized gaussian blur shaders to support more hardware. Improved unredirection of fullscreen windows. Several bugfixes. Translation updates. Release 0.7.2 (2008-03-06 Dennis Kasprzyk ) ========================================================================= Development release. Several bugfixes Translation support in gtk-window-decorator. Updated translations. Added wrapable session functions to core. This allows to provide a full session save/restore in a plugin. Release 0.7.0 (2008-02-07 Dennis Kasprzyk ) ========================================================================= Development release. A core plugin has been added that allows handling certain core APIs, such as querying the ABI version, similarly to plugin APIs, allowing sharing more code. Added a simple object system, which generalize the privates mechanism and the plugin system. It allows to share more code between display, screen and window objects. It also makes it possible to properly introduce new object types without changing the plugin interface or breaking the API. Multi-display support. Various fixes in ICCCM compliance, window stacking and focus handling. Validity checking of ConfigureRequest events. Fixes to transient children placement in place plugin. Hooks have been added to the cube plugin which allow better control of viewport drawing. Middle and right click actions have been made configurable in gtk-window-decorator. Gtk-window-decorator now optionally allows mouse wheel title bar actions, such as shading. A KDE4 port of the kde-window-decorator has been added. Frequent crashes of kde-window-decorator for some people have been fixed. Release 0.5.4 (2007-08-20 David Reveman ) ============================================================ Development release. XCB is now required. Major improvements to option system that makes configuration backend integration much less complex. Kconfig plugin that provides proper KDE configuration support. Kcfg files are generated from the meta-data and they can be used to generate C++ source code that will provide an API for applications to access all compiz configuration data used by the kconfig plugin. Release 0.5.2 (2007-08-03 David Reveman ) ============================================================ Development release. Better support for multiple X-screens. XML-based meta-data system for handling of various kinds for meta-data like plugin descriptions, default option values, etc. Major improvements to option initialization based on the new meta-data system. Logging framework. Support for configurable button layout in metacity themes has been added to gtk-window-decorator. Glib plugin that allows plugins that use the glib main loop to integrate properly with the compiz main loop without waking up periodically to check for pending events. Plugin plugins that make it possible to adjust and extend the behavior of existing plugins through new plugins. More dynamic handling of output devices, which allows the output device configuration used when rendering to be changed between frames. Transparency support in cube plugin. Introspection support in dbus plugin. Release 0.5.0 (2007-04-02 David Reveman ) ============================================================ Development release. Remove stencil buffer requirement. Focus stealing prevention support. Blur plugin that provide support for blurring windows and contents behind translucent windows. Fragment attribute interface that allow plugins to perform more advanced fragment shading effects and integrate properly with other plugins. Extensible window matching interface and new option type that provide advanced window selection functionality. Plugin that provide a composited video interface for efficient video playback. FUSE plugin that maps compiz options to a file-system and allow efficient manipulation of options by reading and writing files. Better occlusion detection and more efficient rendering. Flat file configuration backend. Release 0.3.6 (2006-12-31 David Reveman ) ============================================================ Development release. Add support for unredirect of fullscreen windows when using the composite overlay window and make usage of the composite overlay window for output default. Add file notification API. Add inotify plugin that implements file notification API. A "GetPlugins" method has been added to dbus plugin and it can be used to retrieve a list of available plugins. A 'GetPluginMetadata' method has been added to dbus plugin and it returns metadata for available plugins. Add support for switching between windows without having the thumbnail window show up. Switcher thumbnails now include decorations and shadows. Basic drag and drop support has been added to scale plugin. It's now possible to initiate scale plugin for specific window groups. Window menu icon support has been added to gtk window decorator. Improved support for metacity themes. Add KDE window decorator with support for shadows and opacity has been added. Release 0.3.4 (2006-11-21 David Reveman ) ============================================================ Development release. Edge button, which can be used to require a button press for edge actions to be triggered. Basic compiz event support. Zoom plugin now works without "largedesktop" feature. Cube plugin now handles desktop width less than 4 times the screen better. Support for multiple desktops (workspaces). Handling of _NET_DESKTOP_GEOMETRY client messages has been fixed. Much better multi-head support. Annotate plugin has been added. Clone plugin which can be used to clone outputs in a convenient way has been added. Currently more of a prototype as we need randr++ and input transformation in the server to do this properly. Shadow color option has been added. initiate_all option has been added to scale plugin. Zoom factor option has been added to zoom plugin. Support for new metacity theme version and support for metacity versions < 2.15.21. Event window placement when using some metacity themes has been fixed. Fix a number of issues related to minimizing windows with transients. Release 0.3.2 (2006-10-20 David Reveman ) ============================================================ Development release. snap_inverted option has been added to wobbly plugin. Configuration support has been added to dbus plugin. Add 'command' option has been added to decoration plugin, which can be used to automatically launch a decorator when one isn't already running. Opacity support for metacity themes. A raise_window option has been added. Decorations on maximized windows are now rendered correctly when using metacity themes. An ignore_hints_when_maximized option, which makes compiz ignore size increment and aspect hints for maximized windows has been added and made default. Better default option values for rotate plugin. and much more... Release 0.2.0 (2006-10-02 David Reveman ) ============================================================ First official release of compiz. ./RELEASING0000644000004100000410000000524713246301623012507 0ustar www-datawww-dataHere are the steps to follow to create a new compiz release: 1) Ensure that there are no local, uncommitted modifications. It's probably good enough if "git diff HEAD" doesn't output anything and your "master" and "origin" branches are at the current revision. 2) Verify that the code passes "make distcheck" Running "make distcheck" should result in no warnings or errors and end with a message of the form: ============================================== compiz-X.Y.Z archives ready for distribution: compiz-X.Y.Z.tar.gz ============================================== (But the tar file isn't actually ready yet, as we still have some more steps to follow). 3) Fill out an entry in the NEWS file Shift through the logs since the last release. This is most easily done with a comand such as: git log --stat compiz-X.Y.Z.. where X.Y.Z is the previous release version. Summarize major changes briefly in a style similar to other entries in NEWS. 4) Increment version number in configure.ac: Increment to the micro version number to the next larger (even) number. 5) Commit the changes to NEWS and configure.ac It's especially important to mention the new version number in your commit log. 6) Run "make release-publish" which will perform the following steps for you: * Check that the version number ends with an even micro component * Check that no release exists with the current version * Verify that make distcheck completes successfully * Generate the final tar file * Generate an sha1sum file * Sign the sha1sum using your GPG setup (asks for your GPG password) * scp the three files to appear on http://xorg.freedesktop.org/archive/individual/app * Place local copies of the three files in the releases directory * Tag the entire source tree with a tag of the form compiz-X.Y.Z, and sign the tag with your GPG key (asks for your GPG password, and you may need to set GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL to match your public-key's setting or this fails.) * Provide some text for the release announcement (see below). If for some reason you lost this message, "make release-publish-message" prints it for you. 7) Increment compiz_version_micro to the next larger (odd) number in configure, commit, and push. 8) Push the newly created tag out to the central tree with a command something like: git push compiz-X.Y.Z 9) Send a message to compiz@list.freedesktop.org to announce the new release using the text provided from "make release-publish", adding the excerpt from NEWS, your signature, followed by tacking on the detailed changelog-ish thing that gets mailed out when you push the tag (but not the diffstat thing). ./INSTALL0000644000004100000410000000120613246301623012273 0ustar www-datawww-datacompiz uses libstartup-notification which is available at ftp://ftp.gnome.org/pub/GNOME/sources/startup-notification/ compiz uses out-of-tree builds with cmake, in order to generate the Makefiles for compiz use: $ mkdir build $ cd build $ cmake .. If you have multiple versions of Python installed, you will need to specify the version like this: $ cmake .. \ -DPYTHON_INCLUDE_DIR=/usr/include/python2.7 \ -DPYTHON_LIBRARY=/usr/lib/libpython2.7.so After that, standard build procedures apply: $ make # make install In order to build other plugins, you will need to install the compiz cmake set # make findcompiz_install ./compiz.pc.in0000644000004100000410000000037113246301623013476 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz Description: OpenGL compositing manager Version: @VERSION@ Requires: @COMPIZ_REQUIRES@ Libs: -L${libdir} Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz ./COPYING.GPL0000644000004100000410000004311013246301623012716 0ustar www-datawww-data GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ./README0000644000004100000410000000046713246301623012132 0ustar www-datawww-datacompiz - OpenGL window and compositing manager Compiz is an OpenGL compositing manager that use GLX_EXT_texture_from_pixmap for binding redirected top-level windows to texture objects. It has a flexible plug-in system and it is designed to run well on most graphics hardware. David Reveman davidr@novell.com ./plugins/0000755000004100000410000000000013246301624012725 5ustar www-datawww-data./plugins/dbus/0000755000004100000410000000000013246301624013662 5ustar www-datawww-data./plugins/dbus/CMakeLists.txt0000644000004100000410000000172413246301623016425 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) compiz_plugin (dbus PKGDEPS dbus-1 libxml-2.0) #AC_ARG_ENABLE(dbus, # [ --disable-dbus Disable dbus plugin], # [use_dbus=$enableval], [use_dbus=yes]) #if test "x$use_dbus" = "xyes"; then # PKG_CHECK_MODULES(DBUS, dbus-1 libxml-2.0, [use_dbus=yes], [use_dbus=no]) #fi #AM_CONDITIONAL(DBUS_PLUGIN, test "x$use_dbus" = "xyes") #if test "$use_dbus" = yes; then # AC_DEFINE(USE_DBUS, 1, [Build dbus plugin]) #fi #AC_ARG_ENABLE(dbus-glib, # [ --disable-dbus-glib Disable dbus-glib support], # [use_dbus_glib=$enableval], [use_dbus_glib=yes]) #if test "x$use_dbus_glib" = "xyes"; then # PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1, [use_dbus_glib=yes], [use_dbus_glib=no]) #fi #if test "$use_dbus" = yes; then # AC_DEFINE(USE_DBUS_GLIB, 1, [Build dbus glib support]) #fi ./plugins/dbus/src/0000755000004100000410000000000013246301624014451 5ustar www-datawww-data./plugins/dbus/src/dbus.cpp0000644000004100000410000013113413246301623016114 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * * Ported to Compiz 0.9 by: * Copyright (C) 2009 Sam Spilsbury * Copyright (C) 2013 Sami Jaktholm (introspection) */ #include "dbus.h" COMPIZ_PLUGIN_20090315 (dbus, DbusPluginVTable); CompOption::Vector emptyList; const char* IntrospectionResponse::finishAndGetXml () { xmlTextWriterEndDocument (xmlWriter); return reinterpret_cast (xmlBuf->content); } void IntrospectionResponse::startInterface () { xmlTextWriterStartElement (xmlWriter, BAD_CAST "interface"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST COMPIZ_DBUS_SERVICE_NAME); } void IntrospectionResponse::endInterface () { xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addArgument (const char *type, const char *direction) { xmlTextWriterStartElement (xmlWriter, BAD_CAST "arg"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "type", BAD_CAST type); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "direction", BAD_CAST direction); xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addMethod (const char *name, int nArgs, ...) { va_list var_args; const char *type, *direction; xmlTextWriterStartElement (xmlWriter, BAD_CAST "method"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST name); va_start (var_args, nArgs); while (nArgs) { type = va_arg (var_args, const char *); direction = va_arg (var_args, const char *); addArgument (type, direction); --nArgs; } va_end (var_args); xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addSignal (const char *name, int nArgs, ...) { va_list var_args; const char *type; xmlTextWriterStartElement (xmlWriter, BAD_CAST "signal"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST name); va_start (var_args, nArgs); while (nArgs) { type = va_arg (var_args, const char *); addArgument (type, "out"); --nArgs; } va_end (var_args); xmlTextWriterEndElement (xmlWriter); } void IntrospectionResponse::addNode (const char *name) { xmlTextWriterStartElement (xmlWriter, BAD_CAST "node"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST name); xmlTextWriterEndElement (xmlWriter); } IntrospectionResponse::IntrospectionResponse () { xmlBuf = xmlBufferCreate (); xmlWriter = xmlNewTextWriterMemory (xmlBuf, 0); /* Add introspection node. */ xmlTextWriterStartElement (xmlWriter, BAD_CAST "node"); xmlTextWriterStartElement (xmlWriter, BAD_CAST "interface"); xmlTextWriterWriteAttribute (xmlWriter, BAD_CAST "name", BAD_CAST "org.freedesktop.DBus.Introspectable"); addMethod ("Introspect", 1, "s", "out"); xmlTextWriterEndElement (xmlWriter); } IntrospectionResponse::~IntrospectionResponse () { if (xmlWriter) xmlFreeTextWriter (xmlWriter); if (xmlBuf) xmlBufferFree (xmlBuf); } #ifdef __cplusplus /* A simple wrapper for dbus to Compiz 0.9 */ extern "C" { #endif static DBusHandlerResult dbusHandleMessage (DBusConnection *, DBusMessage *, void *); DBusHandlerResult dbusHandleMessage (DBusConnection *c, DBusMessage *m, void *v) { DBUS_SCREEN (screen); return ds->handleMessage (c, m, v); } static DBusObjectPathVTable dbusMessagesVTable = { NULL, dbusHandleMessage, /* handler function */ NULL, NULL, NULL, NULL }; #ifdef __cplusplus } #endif CompOption::Vector & DbusScreen::getOptionsFromPath (const std::vector& path) { CompPlugin *p; p = CompPlugin::find (path[0].c_str ()); if (!p) { return emptyList; } if (p->vTable->getOptions ().empty ()) return emptyList; return p->vTable->getOptions (); } bool DbusScreen::sendIntrospectResponse (DBusConnection *connection, DBusMessage *message, IntrospectionResponse &response) { DBusMessage *reply = dbus_message_new_method_return (message); if (!reply) return false; DBusMessageIter args; dbus_message_iter_init_append (reply, &args); const char* responseXml = response.finishAndGetXml (); if (!dbus_message_iter_append_basic (&args, DBUS_TYPE_STRING, &responseXml)) return false; if (!dbus_connection_send (connection, reply, NULL)) return false; dbus_connection_flush (connection); dbus_message_unref (reply); return true; } /* introspection handlers */ bool DbusScreen::handleRootIntrospectMessage (DBusConnection *connection, DBusMessage *message) { IntrospectionResponse response; response.startInterface (); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_PLUGIN_METADATA_MEMBER_NAME, 7, "s", "in", "s", "out", "s", "out", "s", "out", "b", "out", "as", "out", "as", "out"); #endif response.addSignal (COMPIZ_DBUS_PLUGINS_CHANGED_SIGNAL_NAME, 0); response.endInterface (); const CompPlugin::List &plugins = CompPlugin::getPlugins (); if (plugins.empty ()) return false; foreach (CompPlugin* p, plugins) { if (p->vTable) response.addNode (p->vTable->name ().c_str()); } return sendIntrospectResponse (connection, message, response); } /* MULTIDPYERROR: only works with one or less displays present */ bool DbusScreen::handlePluginIntrospectMessage (DBusConnection *connection, DBusMessage *message) { char screenName[256]; IntrospectionResponse response; snprintf (screenName, 256, "screen%d", screen->screenNum ()); response.addNode (screenName); return sendIntrospectResponse (connection, message, response); } bool DbusScreen::handleScreenIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path) { IntrospectionResponse response; response.startInterface (); response.addMethod (COMPIZ_DBUS_LIST_MEMBER_NAME, 1, "as", "out"); response.endInterface (); CompOption::Vector &options = getOptionsFromPath (path); if (!options.empty ()) { foreach (CompOption &option, options) { response.addNode (option.name ().c_str()); } } return sendIntrospectResponse (connection, message, response); } bool DbusScreen::handleOptionIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path) { #if GET_PLUGIN_METADATA_ENABLED bool metadataHandled = false; #endif bool isList = false; char type[3]; IntrospectionResponse response; CompOption::Type restrictionType; CompOption::Vector &options = getOptionsFromPath (path); CompOption *option = CompOption::findOption (options, path[2]); response.startInterface (); if (option) { restrictionType = option->type (); if (restrictionType == CompOption::TypeList) { restrictionType = option->value ().listType (); isList = true; } switch (restrictionType) { case CompOption::TypeInt: if (isList) strcpy (type, "ai"); else strcpy (type, "i"); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 6, "s", "out", "s", "out", "b", "out", "s", "out", "i", "out", "i", "out"); metadataHandled = true; #endif break; case CompOption::TypeFloat: if (isList) strcpy (type, "ad"); else strcpy (type, "d"); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 7, "s", "out", "s", "out", "b", "out", "s", "out", "d", "out", "d", "out", "d", "out"); metadataHandled = true; #endif break; case CompOption::TypeString: if (isList) strcpy (type, "as"); else strcpy (type, "s"); #if GET_PLUGIN_METADATA_ENABLED response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 5, "s", "out", "s", "out", "b", "out", "s", "out", "as", "out"); metadataHandled = true; #endif break; case CompOption::TypeBool: case CompOption::TypeBell: if (isList) strcpy (type, "ab"); else strcpy (type, "b"); break; case CompOption::TypeColor: case CompOption::TypeKey: case CompOption::TypeButton: case CompOption::TypeEdge: case CompOption::TypeMatch: if (isList) strcpy (type, "as"); else strcpy (type, "s"); break; default: break; } response.addMethod (COMPIZ_DBUS_GET_MEMBER_NAME, 1, type, "out"); response.addMethod (COMPIZ_DBUS_SET_MEMBER_NAME, 1, type, "in"); response.addSignal (COMPIZ_DBUS_CHANGED_SIGNAL_NAME, 1, type, "out"); #if GET_PLUGIN_METADATA_ENABLED if (!metadataHandled) response.addMethod (COMPIZ_DBUS_GET_METADATA_MEMBER_NAME, 4, "s", "out", "s", "out", "b", "out", "s", "out"); #endif } response.endInterface (); return sendIntrospectResponse (connection, message, response); } /* * Activate can be used to trigger any existing action. Arguments * should be a pair of { string, bool|int32|double|string }. * * Example (rotate to face 1): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/rotate/allscreens/rotate_to \ * org.freedesktop.compiz.activate \ * string:'root' \ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'` \ * string:'face' int32:1 * * * You can also call the terminate function * * Example unfold and refold cube: * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/cube/allscreens/unfold \ * org.freedesktop.compiz.activate \ * string:'root' \ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'` * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/cube/allscreens/unfold \ * org.freedesktop.compiz.deactivate \ * string:'root' \ * int32:`xwininfo -root | grep id: | awk '{ print $4 }'` * */ bool DbusScreen::handleActionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path, bool activate) { CompOption::Vector &options = getOptionsFromPath (path); if (options.empty ()) return false; foreach (CompOption& option, options) { if (option.name () == path[2]) { CompOption::Vector argument; DBusMessageIter iter; CompAction *action = &option.value ().action (); if (option.type () != CompOption::TypeAction && option.type () != CompOption::TypeKey && option.type () != CompOption::TypeButton && option.type () != CompOption::TypeEdge && option.type () != CompOption::TypeBell) return false; if (activate) { if (!action->initiate ()) return false; } else { if (!action->terminate ()) return false; } if (dbus_message_iter_init (message, &iter)) { CompOption::Value value; CompOption::Type type; char *name; do { name = NULL; type = CompOption::TypeUnset; while (!name) { switch (dbus_message_iter_get_arg_type (&iter)) { case DBUS_TYPE_STRING: dbus_message_iter_get_basic (&iter, &name); default: break; } if (!dbus_message_iter_next (&iter)) break; } while (type == CompOption::TypeUnset) { switch (dbus_message_iter_get_arg_type (&iter)) { case DBUS_TYPE_BOOLEAN: { bool tmp; type = CompOption::TypeBool; dbus_message_iter_get_basic (&iter, &tmp); value.set (tmp ? true : false); } break; case DBUS_TYPE_INT32: { int tmp; type = CompOption::TypeInt; dbus_message_iter_get_basic (&iter, &tmp); value.set (tmp); } break; case DBUS_TYPE_DOUBLE: { double tmp; type = CompOption::TypeFloat; dbus_message_iter_get_basic (&iter, &tmp); value.set ((float) tmp); } break; case DBUS_TYPE_STRING: { char *s; dbus_message_iter_get_basic (&iter, &s); /* XXX: use match option type if name is "match" */ if (name && strcmp (name, "match") == 0) { type = CompOption::TypeMatch; value.set (CompMatch (CompString (s))); } else { type = CompOption::TypeString; value.set (CompString (s)); } } default: break; } if (!dbus_message_iter_next (&iter)) break; } if (name && type != CompOption::TypeUnset) { CompOption arg (name, type); arg.set (value); argument.push_back (arg); } } while (dbus_message_iter_has_next (&iter)); } if (activate) action->initiate () (action, 0, argument); else action->terminate () (action, 0, argument); if (!dbus_message_get_no_reply (message)) { DBusMessage *reply; reply = dbus_message_new_method_return (message); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); } return true; } } return false; } bool DbusScreen::tryGetValueWithType (DBusMessageIter *iter, int type, void *value) { if (dbus_message_iter_get_arg_type (iter) == type) { dbus_message_iter_get_basic (iter, value); return true; } return false; } bool DbusScreen::getOptionValue (DBusMessageIter *iter, CompOption::Type type, CompOption::Value &value) { bool success; switch (type) { case CompOption::TypeBool: { bool b; success = tryGetValueWithType (iter, DBUS_TYPE_BOOLEAN, &b); if (success) value.set (b ? true : false); } break; case CompOption::TypeInt: { int i; success = tryGetValueWithType (iter, DBUS_TYPE_INT32, &i); if (success) value.set (i); } break; case CompOption::TypeFloat: { double d; success = tryGetValueWithType (iter, DBUS_TYPE_DOUBLE, &d); if (success) value.set ((float) d); } break; case CompOption::TypeString: { char *s; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) value.set (CompString (s)); } break; case CompOption::TypeColor: { char *s; unsigned short c[4]; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success &= CompOption::stringToColor (CompString (s), c); if (success) value.set (c); } break; case CompOption::TypeKey: { char *s; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success = action.keyFromString (CompString (s)); if (success) value.set (action); } break; case CompOption::TypeButton: { char *s; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success = action.buttonFromString (CompString (s)); if (success) value.set (action); } break; case CompOption::TypeEdge: { char *s; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) success = action.edgeMaskFromString (CompString (s)); if (success) value.set (action); } break; case CompOption::TypeBell: { bool bell; CompAction action; success = tryGetValueWithType (iter, DBUS_TYPE_BOOLEAN, &bell); if (success) { action.setBell (bell ? true : false); value.set (action); } } break; case CompOption::TypeMatch: { char *s; success = tryGetValueWithType (iter, DBUS_TYPE_STRING, &s); if (success) value.set (CompMatch (s)); } break; default: success = false; break; } return success; } /* * 'Set' can be used to change any existing option. Argument * should be the new value for the option. * * Example (will set command0 option to firefox): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/command0 \ * org.freedesktop.compiz.set \ * string:'firefox' * * List and action options can be changed using more than one * argument. * * Example (will set active_plugins option to * [dbus,decoration,place]): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/active_plugins \ * org.freedesktop.compiz.set \ * array:string:'dbus','decoration','place' * * Example (will set run_command0 option to trigger on key * binding Return and not trigger on any button * bindings, screen edges or bell notifications): * * dbus-send --type=method_call --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/run_command0 \ * org.freedesktop.compiz.set \ * string:'Return' \ * string:'Disabled' \ * boolean:'false' \ * string:'' \ * int32:'0' */ bool DbusScreen::handleSetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector &options = getOptionsFromPath (path); foreach (CompOption& option, options) { if (option.name () == path[2]) { DBusMessageIter iter, aiter; CompOption::Value value, tmpValue; bool status = false; if (option.type () == CompOption::TypeList) { if (dbus_message_iter_init (message, &iter) && dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY) { dbus_message_iter_recurse (&iter, &aiter); do { if (getOptionValue (&aiter, option.value ().listType (), tmpValue)) { option.value ().list ().push_back (tmpValue); } } while (dbus_message_iter_next (&aiter)); status = true; } } else if (dbus_message_iter_init (message, &iter)) { status = getOptionValue (&iter, option.type (), value); } if (status) { screen->setOptionForPlugin (path[0].c_str (), option.name ().c_str (), value); if (!dbus_message_get_no_reply (message)) { DBusMessage *reply; reply = dbus_message_new_method_return (message); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); } } return status; } } return false; } void DbusScreen::appendSimpleOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value) { switch (type) { case CompOption::TypeBool: { bool b = value.b () ? true : false; dbus_message_append_args (message, DBUS_TYPE_BOOLEAN, &b, DBUS_TYPE_INVALID); } break; case CompOption::TypeInt: { int i = value.i (); dbus_message_append_args (message, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID); } break; case CompOption::TypeFloat: { double d = value.f (); dbus_message_append_args (message, DBUS_TYPE_DOUBLE, &d, DBUS_TYPE_INVALID); } break; case CompOption::TypeString: { CompString string = value.s (); const char *s = string.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeColor: { CompString color = CompOption::colorToString (value.c ()); const char *s = color.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeKey: { CompString key = value.action ().keyToString (); const char *s = key.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeButton: { CompString button = value.action ().buttonToString (); const char *s = button.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeEdge: { CompString edge = value.action ().edgeMaskToString (); const char *s = edge.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } break; case CompOption::TypeBell: { bool bell = value.action ().bell () ? true : false; dbus_message_append_args (message, DBUS_TYPE_BOOLEAN, &bell, DBUS_TYPE_INVALID); } break; case CompOption::TypeMatch: { CompString match = value.match ().toString (); const char *s = match.c_str (); dbus_message_append_args (message, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } default: break; } } void DbusScreen::appendListOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value) { DBusMessageIter iter; DBusMessageIter listIter; char sig[2]; switch (value.listType ()) { case CompOption::TypeInt: sig[0] = DBUS_TYPE_INT32; break; case CompOption::TypeFloat: sig[0] = DBUS_TYPE_DOUBLE; break; case CompOption::TypeBool: case CompOption::TypeBell: sig[0] = DBUS_TYPE_BOOLEAN; break; default: sig[0] = DBUS_TYPE_STRING; break; } sig[1] = '\0'; dbus_message_iter_init_append (message, &iter); if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, sig, &listIter)) return; foreach (CompOption::Value& val, value.list ()) { switch (value.listType ()) { case CompOption::TypeInt: { int i = val.i (); dbus_message_iter_append_basic (&listIter, sig[0], &i); } break; case CompOption::TypeFloat: { float f = val.f (); dbus_message_iter_append_basic (&listIter, sig[0], &f); } break; case CompOption::TypeBool: { bool b = val.b () ? true : false; dbus_message_iter_append_basic (&listIter, sig[0], &b); } break; case CompOption::TypeString: { CompString string = val.s (); const char *s = string.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeKey: { CompString key = val.action ().keyToString (); const char *s = key.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeButton: { CompString button = val.action ().buttonToString (); const char *s = button.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeEdge: { CompString edge = val.action ().edgeMaskToString (); const char *s = edge.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeBell: { bool bell = val.action ().bell () ? true : false; dbus_message_iter_append_basic (&listIter, sig[0], &bell); } break; case CompOption::TypeMatch: { CompString match = val.match ().toString (); const char *s = match.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; case CompOption::TypeColor: { CompString color = CompOption::colorToString (val.c ()); const char *s = color.c_str (); dbus_message_iter_append_basic (&listIter, sig[0], &s); } break; default: break; } } dbus_message_iter_close_container (&iter, &listIter); } void DbusScreen::appendOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value) { if (type == CompOption::TypeList) appendListOptionValue (message, type, value); else appendSimpleOptionValue (message, type, value); } /* * 'Get' can be used to retrieve the value of any existing option. * * Example (will retrieve the current value of command0 option): * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/command0 \ * org.freedesktop.compiz.get */ bool DbusScreen::handleGetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector &options = getOptionsFromPath (path); DBusMessage *reply = NULL; foreach (CompOption& option, options) { if (option.name () == path[2]) { reply = dbus_message_new_method_return (message); appendOptionValue (reply, option.type (), option.value ()); break; } } if (!reply) reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "No such option"); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } /* * 'List' can be used to retrieve a list of available options. * * Example: * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens \ * org.freedesktop.compiz.list */ bool DbusScreen::handleListMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector &options = getOptionsFromPath (path); DBusMessage *reply; reply = dbus_message_new_method_return (message); foreach (CompOption& option, options) { CompString name = option.name (); const char *s = name.c_str (); dbus_message_append_args (reply, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID); } dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } /* * 'GetMetadata' can be used to retrieve metadata for an option. * * Example: * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz/core/allscreens/run_command0 \ * org.freedesktop.compiz.getMetadata */ #if GETMETADATA_ENABLED bool DbusScreen::handleGetMetadataMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path) { CompOption::Vector options; DBusMessage *reply = NULL; CompMetadata *m; options = getOptionsFromPath (path, &m); foreach (CompOption *option, options) { if (strcmp (option->name ().c_str (), path[2]) == 0) { /* TODO: Write xmlTextWriter for getting long screen option descriptions */ CompOption::Type restrictionType = option->type (); const char *type; char *shortDesc = NULL; char *longDesc = NULL; const char *blankStr = ""; reply = dbus_message_new_method_return (message); type = optionTypeToString (option->type); if (m) { if (object->type == COMP_OBJECT_TYPE_SCREEN) { shortDesc = compGetShortScreenOptionDescription (m, option); longDesc = compGetLongScreenOptionDescription (m, option); } else { shortDesc = compGetShortDisplayOptionDescription (m, option); longDesc = compGetLongDisplayOptionDescription (m, option); } } if (shortDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &shortDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); if (longDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &longDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); dbus_message_append_args (reply, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID); if (shortDesc) free (shortDesc); if (longDesc) free (longDesc); if (restrictionType == CompOptionTypeList) { type = optionTypeToString (option->value.list.type); restrictionType = option->value.list.type; dbus_message_append_args (reply, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID); } switch (restrictionType) { case CompOptionTypeInt: dbus_message_append_args (reply, DBUS_TYPE_INT32, &option->rest.i.min, DBUS_TYPE_INT32, &option->rest.i.max, DBUS_TYPE_INVALID); break; case CompOptionTypeFloat: { double min, max, precision; min = option->rest.f.min; max = option->rest.f.max; precision = option->rest.f.precision; dbus_message_append_args (reply, DBUS_TYPE_DOUBLE, &min, DBUS_TYPE_DOUBLE, &max, DBUS_TYPE_DOUBLE, &precision, DBUS_TYPE_INVALID); } break; default: break; } break; } option++; } if (!reply) reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "No such option"); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } #endif /* * 'GetPluginMetadata' can be used to retrieve metadata for a plugin. * * Example: * * dbus-send --print-reply --type=method_call \ * --dest=org.freedesktop.compiz \ * /org/freedesktop/compiz \ * org.freedesktop.compiz.getPluginMetadata \ * string:'png' */ /* TODO: This and xmlTextWriter to get short and long descs */ #if GET_PLUGIN_METADATA_ENABLED bool DbusScreen::handleGetPluginMetadataMessage (DBusConnection *connection, DBusMessage *message) { DBusMessage *reply; DBusMessageIter iter; char *name; CompPlugin *p, *loadedPlugin = NULL; if (!dbus_message_iter_init (message, &iter)) return false; if (!tryGetValueWithType (&iter, DBUS_TYPE_STRING, &name)) return false; p = findActivePlugin (name); if (!p) p = loadedPlugin = loadPlugin (name); if (p) { bool initializedPlugin = true; char *shortDesc = NULL; char *longDesc = NULL; const char *blankStr = ""; reply = dbus_message_new_method_return (message); if (loadedPlugin) { if (!(*p->vTable->init) (p)) initializedPlugin = false; } if (initializedPlugin && p->vTable->getMetadata) { CompMetadata *m; m = (*p->vTable->getMetadata) (p); if (m) { shortDesc = compGetShortPluginDescription (m); longDesc = compGetLongPluginDescription (m); } } dbus_message_append_args (reply, DBUS_TYPE_STRING, &p->vTable->name, DBUS_TYPE_INVALID); if (shortDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &shortDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); if (longDesc) dbus_message_append_args (reply, DBUS_TYPE_STRING, &longDesc, DBUS_TYPE_INVALID); else dbus_message_append_args (reply, DBUS_TYPE_STRING, &blankStr, DBUS_TYPE_INVALID); dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &initializedPlugin, DBUS_TYPE_INVALID); if (shortDesc) free (shortDesc); if (longDesc) free (longDesc); if (loadedPlugin && initializedPlugin) (*p->vTable->fini) (p); } else { char *str; str = malloc (strlen (name) + 256); if (!str) return false; sprintf (str, "Plugin '%s' could not be loaded", name); reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, str); free (str); } if (loadedPlugin) unloadPlugin (loadedPlugin); dbus_connection_send (connection, reply, NULL); dbus_connection_flush (connection); dbus_message_unref (reply); return true; } #endif DBusHandlerResult DbusScreen::handleMessage (DBusConnection *connection, DBusMessage *message, void *userData) { bool status = false; std::vector path; if (!getPathDecomposed (dbus_message_get_path (message), path)) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* root messages */ if (path.empty ()) { if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { if (handleRootIntrospectMessage (connection, message)) return DBUS_HANDLER_RESULT_HANDLED; } #if GET_PLUGIN_METADATA_ENABLED else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_GET_PLUGIN_METADATA_MEMBER_NAME)) { if (handleGetPluginMetadataMessage (connection, message)) return DBUS_HANDLER_RESULT_HANDLED; } #endif return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /* plugin message */ else if (path.size () == 1) { if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { if (handlePluginIntrospectMessage (connection, message)) return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /* screen message */ else if (path.size () == 2) { if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { if (handleScreenIntrospectMessage (connection, message, path)) return DBUS_HANDLER_RESULT_HANDLED; } if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_LIST_MEMBER_NAME)) { if (handleListMessage (connection, message, path)) return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /* option message */ if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { status = handleOptionIntrospectMessage (connection, message, path); } if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_ACTIVATE_MEMBER_NAME)) { status = handleActionMessage (connection, message, path, true); } else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME)) { status = handleActionMessage (connection, message, path, false); } else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_SET_MEMBER_NAME)) { status = handleSetOptionMessage (connection, message, path); } else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_GET_MEMBER_NAME)) { status = handleGetOptionMessage (connection, message, path); } #if GETMETADATA_ENABLED else if (dbus_message_is_method_call (message, COMPIZ_DBUS_INTERFACE, COMPIZ_DBUS_GET_METADATA_MEMBER_NAME)) { status = handleGetMetadataMessage (connection, message, path); } #endif if (status) return DBUS_HANDLER_RESULT_HANDLED; return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } bool DbusScreen::processMessages (short int data) { DBusDispatchStatus status; do { dbus_connection_read_write_dispatch (connection, 0); status = dbus_connection_get_dispatch_status (connection); } while (status == DBUS_DISPATCH_DATA_REMAINS); return true; } void DbusScreen::sendChangeSignalForOption (CompOption *o, const CompString &plugin) { DBusMessage *signal; char path[256]; CompOption::Value v; if (!o) return; snprintf (path, 256, "%s/%s/%s/%s", COMPIZ_DBUS_ROOT_PATH, plugin.c_str (), "options", o->name ().c_str ()); signal = dbus_message_new_signal (path, COMPIZ_DBUS_SERVICE_NAME, COMPIZ_DBUS_CHANGED_SIGNAL_NAME); appendOptionValue (signal, o->type (), o->value ()); dbus_connection_send (connection, signal, NULL); dbus_connection_flush (connection); dbus_message_unref (signal); } bool DbusScreen::getPathDecomposed (const char *data, std::vector &path) { CompString full (data); size_t lastPos = 0, pos; path.clear (); while ((pos = full.find ('/', lastPos)) != CompString::npos) { CompString part = full.substr (lastPos, pos - lastPos); /* If we just have "/", then strip it, but don't push back * an empty string at the start */ if (part.empty ()) { lastPos = pos + 1; continue; } path.push_back (part); lastPos = pos + 1; } /* Remaining part because there was no "/" at the end of path */ path.push_back (full.substr (lastPos, pos - lastPos).c_str ()); if (path.size () < 3) return false; /* strip leading org.freedesktop.compiz */ path.erase (path.begin (), path.begin () + 3); return true; } /* dbus registration */ bool DbusScreen::registerOptions (DBusConnection *connection, char *screenPath) { std::vector path; char objectPath[256]; if (!getPathDecomposed (screenPath, path)) return false; CompOption::Vector &options = getOptionsFromPath (path); if (options.empty ()) { return false; } foreach (CompOption& option, options) { snprintf (objectPath, 256, "%s/%s", screenPath, option.name ().c_str ()); dbus_connection_register_object_path (connection, objectPath, &dbusMessagesVTable, 0); } return true; } bool DbusScreen::unregisterOptions (DBusConnection *connection, char *screenPath) { char objectPath[256]; std::vector path; getPathDecomposed (screenPath, path); CompOption::Vector &options = getOptionsFromPath (path); if (options.empty ()) return false; foreach (CompOption& option, options) { snprintf (objectPath, 256, "%s/%s", screenPath, option.name ().c_str ()); dbus_connection_unregister_object_path (connection, objectPath); } return true; } void DbusScreen::registerPluginForScreen (DBusConnection *connection, const char *pluginName) { char objectPath[256]; /* register plugin/screen path */ snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, pluginName, screen->screenNum ()); dbus_connection_register_object_path (connection, objectPath, &dbusMessagesVTable, screen->dpy ()); } void DbusScreen::registerPluginsForScreen (DBusConnection *connection) { CompPlugin::List pl = CompPlugin::getPlugins (); char path[256]; foreach (CompPlugin *p, pl) { const char *plugin = p->vTable->name ().c_str (); snprintf (path, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, plugin, screen->screenNum ()); registerPluginForScreen (connection, plugin); registerOptions (connection, path); } } void DbusScreen::unregisterPluginForScreen (DBusConnection *connection, const char *pluginName) { char objectPath[256]; snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, pluginName, screen->screenNum ()); unregisterOptions (connection, objectPath); dbus_connection_unregister_object_path (connection, objectPath); } void DbusScreen::unregisterPluginsForScreen (DBusConnection *connection) { CompPlugin::List pl = CompPlugin::getPlugins (); foreach (CompPlugin *p, pl) { const char *plugin = p->vTable->name ().c_str (); unregisterPluginForScreen (connection, plugin); } } bool DbusScreen::initPluginForScreen (CompPlugin *p) { char objectPath[256]; snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, p->vTable->name ().c_str (), screen->screenNum ()); registerOptions (connection, objectPath); screen->initPluginForScreen (p); return true; } bool DbusScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { bool status = screen->setOptionForPlugin (plugin, name, value); if (status) { CompPlugin *p; p = CompPlugin::find (plugin); if (p && p->vTable) { CompOption::Vector &options = p->vTable->getOptions (); sendChangeSignalForOption (CompOption::findOption (options, name), p->vTable->name ()); if (p->vTable->name () == "core" && strcmp (name, "active_plugins") == 0) { unregisterPluginsForScreen (connection); registerPluginsForScreen (connection); } } } return status; } void DbusScreen::sendPluginsChangedSignal (const char *name) { DBusMessage *signal; signal = dbus_message_new_signal (COMPIZ_DBUS_ROOT_PATH, COMPIZ_DBUS_SERVICE_NAME, COMPIZ_DBUS_PLUGINS_CHANGED_SIGNAL_NAME); dbus_connection_send (connection, signal, NULL); dbus_connection_flush (connection); dbus_message_unref (signal); } /* We might have to hook initScreen here instead of the screen ctor */ DbusScreen::DbusScreen (CompScreen *screen) : PluginClassHandler (screen) { DBusError error; dbus_bool_t status; int fd, ret, mask; char *home; char objectPath[256]; FdWatchCallBack fdCb; FileWatchCallBack fileCb; dbus_error_init (&error); connection = dbus_bus_get (DBUS_BUS_SESSION, &error); if (dbus_error_is_set (&error)) { compLogMessage ("dbus", CompLogLevelError, "dbus_bus_get error: %s", error.message); dbus_error_free (&error); setFailed (); } ret = dbus_bus_request_name (connection, COMPIZ_DBUS_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &error); if (dbus_error_is_set (&error)) { compLogMessage ("dbus", CompLogLevelError, "dbus_bus_request_name error: %s", error.message); /* dbus_connection_unref (dc->connection); */ dbus_error_free (&error); setFailed (); } dbus_error_free (&error); if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { compLogMessage ("dbus", CompLogLevelError, "dbus_bus_request_name reply is not primary owner"); /* dbus_connection_unref (dc->connection); */ setFailed (); } status = dbus_connection_get_unix_fd (connection, &fd); if (!status) { compLogMessage ("dbus", CompLogLevelError, "dbus_connection_get_unix_fd failed"); /* dbus_connection_unref (dc->connection); */ setFailed (); } fdCb = boost::bind (&DbusScreen::processMessages, this, _1); watchFdHandle = screen->addWatchFd (fd, POLLIN | POLLPRI | POLLHUP | POLLERR, fdCb); mask = NOTIFY_CREATE_MASK | NOTIFY_DELETE_MASK | NOTIFY_MOVE_MASK; fileCb = boost::bind (&DbusScreen::sendPluginsChangedSignal, this, _1); fileWatch[DBUS_FILE_WATCH_CURRENT] = screen->addFileWatch (".", mask, fileCb); fileWatch[DBUS_FILE_WATCH_PLUGIN] = screen->addFileWatch (PLUGINDIR, mask, fileCb); fileWatch[DBUS_FILE_WATCH_HOME] = 0; home = getenv ("HOME"); if (home) { CompString pluginDir (home); pluginDir += "/"; pluginDir += HOME_PLUGINDIR; fileWatch[DBUS_FILE_WATCH_HOME] = screen->addFileWatch (pluginDir.c_str (), mask, fileCb); } ScreenInterface::setHandler (screen); /* register the objects */ dbus_connection_register_object_path (connection, COMPIZ_DBUS_ROOT_PATH, &dbusMessagesVTable, 0); snprintf (objectPath, 256, "%s/%s/screen%d", COMPIZ_DBUS_ROOT_PATH, "core", screen->screenNum ()); registerPluginForScreen (connection, "core"); registerPluginsForScreen (connection); registerOptions (connection, objectPath); } DbusScreen::~DbusScreen () { for (int i = 0; i < DBUS_FILE_WATCH_NUM; i++) screen->removeFileWatch (fileWatch[i]); screen->removeWatchFd (watchFdHandle); /* can't unref the connection returned by dbus_bus_get as it's shared and we can't know if it's closed or not. dbus_connection_unref (connection); */ dbus_bus_release_name (connection, COMPIZ_DBUS_SERVICE_NAME, NULL); unregisterPluginForScreen (connection, "core"); unregisterPluginsForScreen (connection); } bool DbusPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/dbus/src/dbus.h0000644000004100000410000001446013246301623015563 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * * Ported to Compiz 0.9 by: * Copyright (C) 2009 Sam Spilsbury */ #include #include #include #include #include #define DBUS_API_SUBJECT_TO_CHANGE #include #include #define COMPIZ_DBUS_SERVICE_NAME "org.freedesktop.compiz" #define COMPIZ_DBUS_INTERFACE "org.freedesktop.compiz" #define COMPIZ_DBUS_ROOT_PATH "/org/freedesktop/compiz" #define COMPIZ_DBUS_ACTIVATE_MEMBER_NAME "activate" #define COMPIZ_DBUS_DEACTIVATE_MEMBER_NAME "deactivate" #define COMPIZ_DBUS_SET_MEMBER_NAME "set" #define COMPIZ_DBUS_GET_MEMBER_NAME "get" #define COMPIZ_DBUS_GET_METADATA_MEMBER_NAME "getMetadata" #define COMPIZ_DBUS_LIST_MEMBER_NAME "list" #define COMPIZ_DBUS_GET_PLUGIN_METADATA_MEMBER_NAME "getPluginMetadata" #define COMPIZ_DBUS_CHANGED_SIGNAL_NAME "changed" #define COMPIZ_DBUS_PLUGINS_CHANGED_SIGNAL_NAME "pluginsChanged" #define DBUS_FILE_WATCH_CURRENT 0 #define DBUS_FILE_WATCH_PLUGIN 1 #define DBUS_FILE_WATCH_HOME 2 #define DBUS_FILE_WATCH_NUM 3 class IntrospectionResponse { public: IntrospectionResponse (); ~IntrospectionResponse (); void addArgument (const char *type, const char *direction); void addMethod (const char *name, int nArgs, ...); void addSignal (const char *name, int nArgs, ...); void addNode (const char *name); void startInterface (); void endInterface (); const char* finishAndGetXml (); private: xmlBufferPtr xmlBuf; xmlTextWriterPtr xmlWriter; }; class DbusScreen : public PluginClassHandler , public ScreenInterface { public: DbusScreen (CompScreen *); ~DbusScreen (); CompFileWatchHandle fileWatch[DBUS_FILE_WATCH_NUM]; DBusConnection *connection; CompWatchFdHandle watchFdHandle; bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); bool initPluginForScreen (CompPlugin *p); CompOption::Vector & getOptionsFromPath (const std::vector& path); static bool sendIntrospectResponse (DBusConnection *connection, DBusMessage *message, IntrospectionResponse &response); bool handleRootIntrospectMessage (DBusConnection *connection, DBusMessage *message); bool handlePluginIntrospectMessage (DBusConnection *connection, DBusMessage *message); bool handleScreenIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path); bool handleOptionIntrospectMessage (DBusConnection *connection, DBusMessage *message, std::vector& path); bool handleActionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path, bool activate); bool tryGetValueWithType (DBusMessageIter *iter, int type, void *value); bool getOptionValue (DBusMessageIter *iter, CompOption::Type type, CompOption::Value &value); bool handleSetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path); void appendSimpleOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value); void appendListOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value); void appendOptionValue (DBusMessage *message, CompOption::Type type, CompOption::Value &value); bool handleGetOptionMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path); bool handleListMessage (DBusConnection *connection, DBusMessage *message, const std::vector& path); DBusHandlerResult handleMessage (DBusConnection *connection, DBusMessage *message, void *userData); bool processMessages (short int); void sendChangeSignalForOption (CompOption *o, const CompString &plugin); bool getPathDecomposed (const char *data, std::vector &path); bool registerOptions (DBusConnection *connection, char *screenPath); bool unregisterOptions (DBusConnection *connection, char *screenPath); void registerPluginForScreen (DBusConnection *connection, const char *pluginName); void registerPluginsForScreen (DBusConnection *connection); void unregisterPluginForScreen (DBusConnection *connection, const char *pluginName); void unregisterPluginsForScreen (DBusConnection *connection); void sendPluginsChangedSignal (const char *name); }; class DbusPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #define DBUS_SCREEN(s) \ DbusScreen *ds = DbusScreen::get (s) ./plugins/dbus/dbus.xml.in0000644000004100000410000000051413246301623015745 0ustar www-datawww-data <_short>D-Bus <_long>D-Bus Control Backend Utility composite opengl decor ./plugins/grid/0000755000004100000410000000000013246301623013651 5ustar www-datawww-data./plugins/grid/CMakeLists.txt0000644000004100000410000000043513246301623016413 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include_directories (src/grabhandler/include) link_directories (${CMAKE_CURRENT_BINARY_DIR}/src/grabhandler) compiz_plugin (grid PLUGINDEPS composite opengl LIBRARIES compiz_grid_grabhandler) add_subdirectory (src/grabhandler) ./plugins/grid/src/0000755000004100000410000000000013246301623014440 5ustar www-datawww-data./plugins/grid/src/grabhandler/0000755000004100000410000000000013246301623016711 5ustar www-datawww-data./plugins/grid/src/grabhandler/CMakeLists.txt0000644000004100000410000000106613246301623021454 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/grabhandler.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/grabhandler.cpp ) ADD_LIBRARY( compiz_grid_grabhandler STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) ./plugins/grid/src/grabhandler/include/0000755000004100000410000000000013246301623020334 5ustar www-datawww-data./plugins/grid/src/grabhandler/include/grabhandler.h0000644000004100000410000000317213246301623022761 0ustar www-datawww-data/* * Compiz Fusion Grid plugin, GrabHandler class * * Copyright (c) 2011 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GRID_GRABHANDLER_H #define _COMPIZ_GRID_GRABHANDLER_H #include #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) #define CompWindowGrabExternalAppMask (1 << 4) namespace compiz { namespace grid { namespace window { typedef boost::function GrabActiveFunc; class GrabWindowHandler { public: GrabWindowHandler (unsigned int mask, const GrabActiveFunc &grabActive); ~GrabWindowHandler (); bool track (); bool resetResize (); private: unsigned int mMask; GrabActiveFunc mGrabActive; }; } } } #endif ./plugins/grid/src/grabhandler/src/0000755000004100000410000000000013246301623017500 5ustar www-datawww-data./plugins/grid/src/grabhandler/src/grabhandler.cpp0000644000004100000410000000275613246301623022467 0ustar www-datawww-data/* * Compiz Fusion Grid plugin * * Copyright (c) 2008 Stephen Kennedy * Copyright (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. */ #include "grabhandler.h" compiz::grid::window::GrabWindowHandler::GrabWindowHandler (unsigned int mask, const GrabActiveFunc &grabActive) : mMask (mask), mGrabActive (grabActive) { } compiz::grid::window::GrabWindowHandler::~GrabWindowHandler () { } bool compiz::grid::window::GrabWindowHandler::track () { if (mGrabActive ("expo")) return false; return ((mMask & (CompWindowGrabMoveMask | CompWindowGrabButtonMask)) && !(mMask & CompWindowGrabResizeMask)); } bool compiz::grid::window::GrabWindowHandler::resetResize () { return (mMask & CompWindowGrabResizeMask); } ./plugins/grid/src/grabhandler/tests/0000755000004100000410000000000013246301624020054 5ustar www-datawww-data./plugins/grid/src/grabhandler/tests/CMakeLists.txt0000644000004100000410000000063113246301623022613 0ustar www-datawww-dataadd_executable (compiz_test_grid_grabhandler ${CMAKE_CURRENT_SOURCE_DIR}/test-grid-grab-handler.cpp) target_link_libraries (compiz_test_grid_grabhandler compiz_grid_grabhandler ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_grid_grabhandler COVERAGE compiz_grid_grabhandler) ./plugins/grid/src/grabhandler/tests/test-grid-grab-handler.cpp0000644000004100000410000000522113246301623025005 0ustar www-datawww-data/* * Compiz Fusion Grid plugin, GrabHandler class * * Copyright (c) 2011 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. * * Authored By: * Sam Spilsbury */ #include #include #include #include /* FIXME: Not entirely portable, but we can't * include window.h without pulling in bunch of * static initalizers */ #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) #define CompWindowGrabExternalAppMask (1 << 4) using testing::Eq; using testing::Return; namespace { bool returnFalse () { return false; } class MockGrabExist { public: MOCK_METHOD1 (grabExist, bool (const char *)); }; } TEST(GridGrabHandlerTest, TestMoveHandler) { compiz::grid::window::GrabWindowHandler moveHandler (CompWindowGrabMoveMask | CompWindowGrabButtonMask, boost::bind (returnFalse)); EXPECT_TRUE (moveHandler.track ()); EXPECT_FALSE (moveHandler.resetResize ()); } TEST(GridGrabHandlerTest, TestResizeHandler) { compiz::grid::window::GrabWindowHandler resizeHandler (CompWindowGrabButtonMask | CompWindowGrabResizeMask, boost::bind (returnFalse)); EXPECT_FALSE (resizeHandler.track ()); EXPECT_TRUE (resizeHandler.resetResize ()); } TEST(GridGrabHandlerTest, TestNoTrackOnExpoGrab) { const std::string expoPlugin ("expo"); MockGrabExist mge; compiz::grid::window::GrabActiveFunc grabExist (boost::bind (&MockGrabExist::grabExist, &mge, _1)); compiz::grid::window::GrabWindowHandler moveHandler (CompWindowGrabMoveMask | CompWindowGrabButtonMask, grabExist); EXPECT_CALL (mge, grabExist (Eq (expoPlugin))).WillOnce (Return (true)); EXPECT_FALSE (moveHandler.track ()); } ./plugins/grid/src/grid.h0000644000004100000410000001325113246301623015540 0ustar www-datawww-data/* * Compiz Fusion Grid plugin * * Copyright (c) 2008 Stephen Kennedy * Copyright (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. */ #include #include #include #include #include #include "grid_options.h" namespace GridWindowType { static const unsigned int GridUnknown = (1 << 0); static const unsigned int GridBottomLeft = (1 << 1); static const unsigned int GridBottom = (1 << 2); static const unsigned int GridBottomRight = (1 << 3); static const unsigned int GridLeft = (1 << 4); static const unsigned int GridCenter = (1 << 5); static const unsigned int GridRight = (1 << 6); static const unsigned int GridTopLeft = (1 << 7); static const unsigned int GridTop = (1 << 8); static const unsigned int GridTopRight = (1 << 9); static const unsigned int GridMaximize = (1 << 10); }; typedef unsigned int GridType; class GridProps { public: GridProps (): gravityRight (0), gravityDown (0), numCellsX (0), numCellsY (0) {} GridProps (int r, int d, int x, int y): gravityRight (r), gravityDown (d), numCellsX (x), numCellsY (y) { } int gravityRight; int gravityDown; int numCellsX; int numCellsY; }; enum Edges { NoEdge = 0, BottomLeft, Bottom, BottomRight, Left, Right, TopLeft, Top, TopRight }; class Animation { public: Animation (); GLfloat progress; CompRect fromRect; CompRect targetRect; CompRect currentRect; GLfloat opacity; Window window; int duration; bool complete; bool fadingOut; }; class GridScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler , public GridOptions { public: GridScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *glScreen; CompRect workarea; CompRect currentRect; CompRect desiredSlot; CompRect lastSlot; CompRect desiredRect; CompRect lastWorkarea; CompRect currentWorkarea; GridProps props; Edges edge; Edges lastEdge; Edges lastResizeEdge; CompOption::Vector o; bool centerCheck; CompWindow *mGrabWindow; bool animating; bool mSwitchingVp; void getPaintRectangle (CompRect&); void setCurrentRect (Animation&); bool initiateCommon (CompAction *, CompAction::State , CompOption::Vector &, unsigned int , bool , bool ); void glPaintRectangle (const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void preparePaint (int msSinceLastPaint); void donePaint (); std::vector animations; int edgeToGridType (); unsigned int typeToMask (int); void handleEvent (XEvent *event); void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options); bool restoreWindow (CompAction *, CompAction::State , CompOption::Vector &); void snapbackOptionChanged (CompOption *option, Options num); CompRect slotToRect (CompWindow *w, const CompRect& slot); CompRect constrainSize (CompWindow *w, const CompRect& slot); }; class GridWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: GridWindow (CompWindow *); ~GridWindow (); CompWindow *window; GLWindow *gWindow; GridScreen *gScreen; bool isGridResized; bool isGridHorzMaximized; bool isGridVertMaximized; unsigned int grabMask; int pointerBufDx; int pointerBufDy; int resizeCount; CompRect currentSize; CompRect originalSize; GridType lastTarget; unsigned int sizeHintsFlags; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); void moveNotify (int, int, bool); void stateChangeNotify (unsigned int); void validateResizeRequest (unsigned int &valueMask, XWindowChanges *xwc, unsigned int source); }; #define GRID_WINDOW(w) \ GridWindow *gw = GridWindow::get (w) class GridPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; COMPIZ_PLUGIN_20090315 (grid, GridPluginVTable); ./plugins/grid/src/grid.cpp0000755000004100000410000012160513246301623016101 0ustar www-datawww-data/* * Compiz Fusion Grid plugin * * Copyright (c) 2008 Stephen Kennedy * Copyright (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Description: * * Plugin to act like winsplit revolution (http://www.winsplit-revolution.com/) * use NUMPAD_KEY to move and tile your windows. * * Press the tiling keys several times to cycle through some tiling options. */ #include #include #include #include "grid.h" #include "grabhandler.h" using namespace GridWindowType; namespace cgw = compiz::grid::window; static std::map gridProps; static int const CURVE_ANIMATION = 35; void GridScreen::handleCompizEvent(const char *plugin, const char *event, CompOption::Vector& o) { if (strcmp(event, "start_viewport_switch") == 0) mSwitchingVp = true; else if (strcmp(event, "end_viewport_switch") == 0) mSwitchingVp = false; screen->handleCompizEvent(plugin, event, o); } CompRect GridScreen::slotToRect (CompWindow *w, const CompRect& slot) { return CompRect (slot.x () + w->border ().left, slot.y () + w->border ().top, slot.width () - (w->border ().left + w->border ().right), slot.height () - (w->border ().top + w->border ().bottom)); } CompRect GridScreen::constrainSize (CompWindow *w, const CompRect& slot) { int cw, ch; CompRect result = slotToRect (w, slot); if (w->constrainNewWindowSize (result.width (), result.height (), &cw, &ch)) { /* constrained size may put window offscreen, adjust for that case */ int dx = result.x () + cw - workarea.right () + w->border ().right; int dy = result.y () + ch - workarea.bottom () + w->border ().bottom; if (dx > 0) result.setX (result.x () - dx); if (dy > 0) result.setY (result.y () - dy); result.setWidth (cw); result.setHeight (ch); } return result; } void GridScreen::getPaintRectangle (CompRect &cRect) { if (typeToMask (edgeToGridType ()) != GridUnknown && optionGetDrawIndicator ()) cRect = desiredSlot; else cRect.setGeometry (0, 0, 0, 0); } int applyProgress (int a, int b, float progress) { return a < b ? b - (ABS (a - b) * progress) : b + (ABS (a - b) * progress); } void GridScreen::setCurrentRect (Animation &anim) { anim.currentRect.setLeft (applyProgress (anim.targetRect.x1 (), anim.fromRect.x1 (), anim.progress)); anim.currentRect.setRight (applyProgress (anim.targetRect.x2 (), anim.fromRect.x2 (), anim.progress)); anim.currentRect.setTop (applyProgress (anim.targetRect.y1 (), anim.fromRect.y1 (), anim.progress)); anim.currentRect.setBottom (applyProgress (anim.targetRect.y2 (), anim.fromRect.y2 (), anim.progress)); } bool GridScreen::initiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &option, unsigned int where, bool resize, bool key) { CompWindow *cw = 0; Window xid = CompOption::getIntOptionNamed (option, "window"); cw = screen->findWindow (xid); if (cw) { XWindowChanges xwc; bool maximizeH = where & (GridBottom | GridTop | GridMaximize); bool maximizeV = where & (GridLeft | GridRight | GridMaximize); bool horzMaximizedGridPosition = where & (GridTop | GridBottom); bool vertMaximizedGridPosition = where & (GridLeft | GridRight); bool anyMaximizedGridPosition = horzMaximizedGridPosition || vertMaximizedGridPosition || where & GridMaximize; if (!(cw->actions () & CompWindowActionResizeMask) || (maximizeH && !(cw->actions () & CompWindowActionMaximizeHorzMask)) || (maximizeV && !(cw->actions () & CompWindowActionMaximizeVertMask)) || where & GridUnknown) return false; GRID_WINDOW (cw); if (gw->lastTarget & ~(where)) gw->resizeCount = 0; else if (!key) return false; props = gridProps[where]; /* get current available area */ if (cw == mGrabWindow) workarea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (pointerX, pointerY)); else { workarea = screen->getWorkareaForOutput (cw->outputDevice ()); if (props.numCellsX == 1) centerCheck = true; /* Do not overwrite the original size if we already have been gridded or * have been grid-maximized */ if (!gw->isGridResized && !gw->isGridHorzMaximized && !gw->isGridVertMaximized && !(cw->state () & MAXIMIZE_STATE)) /* Store size not including borders when using a keybinding */ gw->originalSize = slotToRect(cw, cw->serverBorderRect ()); } if ((cw->state () & MAXIMIZE_STATE) && resize) // maximized state interferes with us, clear it cw->maximize (0); if ((where & GridMaximize) && resize) { cw->maximize (MAXIMIZE_STATE); /* Core can handle fully maximized windows so we don't * have to worry about them. Don't mark the window as a * gridded one. */ gw->isGridResized = false; gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; for (unsigned int i = 0; i < animations.size (); ++i) animations.at (i).fadingOut = true; return true; } /* Convention: * xxxSlot include decorations (it's the screen area occupied) * xxxRect are undecorated (it's the constrained position of the contents) */ /* slice and dice to get desired slot - including decorations */ desiredSlot.setY (workarea.y () + props.gravityDown * (workarea.height () / props.numCellsY)); desiredSlot.setHeight (workarea.height () / (float)props.numCellsY + 0.5); desiredSlot.setX (workarea.x () + props.gravityRight * (workarea.width () / props.numCellsX)); desiredSlot.setWidth (workarea.width () / (float)props.numCellsX + 0.5); if (!optionGetCycleSizes ()) { /* Adjust for constraints and decorations */ if (!anyMaximizedGridPosition) desiredRect = constrainSize (cw, desiredSlot); else desiredRect = slotToRect (cw, desiredSlot); } else /* (optionGetCycleSizes ()) */ { /* Adjust for constraints and decorations */ if (where & ~GridMaximize) desiredRect = constrainSize (cw, desiredSlot); else desiredRect = slotToRect (cw, desiredSlot); } /* Get current rect not including decorations */ currentRect.setGeometry (cw->serverX (), cw->serverY (), cw->serverWidth (), cw->serverHeight ()); /* We do not want to allow cycling through sizes, * unless the user explicitely specified that in CCSM */ if (gw->lastTarget == where && gw->isGridResized && !optionGetCycleSizes ()) return false; /* !(Grid Left/Right/Top/Bottom) are only valid here, * if cycling through sizes is disabled also */ if ((where & ~(GridMaximize) || ((!horzMaximizedGridPosition || !vertMaximizedGridPosition) && !optionGetCycleSizes ())) && gw->lastTarget & where) { /* TODO: * instead of just using what was here * decide on how to deal with rounding/truncating/off by one, * might be helpful in cases like using a windowed virtual machine * with a relatively prime number for width, * examples 631, 797, 1021, 1279, 1439, 1913, 2039, 2557, 3833, ... NextPrime[{N}, -1] */ int slotWidth12 = workarea.width () / 8; int slotWidth17 = (workarea.width () / 6); int slotWidth25 = workarea.width () / 4; int slotWidth33 = (workarea.width () / 3) + cw->border ().left; int slotWidth50 = (workarea.width () / 2); int slotWidth66 = workarea.width () - slotWidth33; int slotWidth75 = workarea.width () - slotWidth25; int slotWidth100 = workarea.width (); int slotWidth37 = slotWidth75 / 2; if (props.numCellsX == 2) /* keys (1, 4, 7, 3, 6, 9) */ { if ((currentRect.width () == desiredRect.width () && currentRect.x () == desiredRect.x ()) || (gw->resizeCount < 1) || (gw->resizeCount > 6)) { gw->resizeCount = 2; } /* tricky, have to allow for window constraints when * computing what the 33% and 66% offsets would be */ switch (gw->resizeCount) { case 1: desiredSlot.setWidth (slotWidth50); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth50); ++gw->resizeCount; break; case 2: desiredSlot.setWidth (slotWidth33); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth66); ++gw->resizeCount; break; case 3: desiredSlot.setWidth (slotWidth25); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth75); ++gw->resizeCount; break; case 4: desiredSlot.setWidth (slotWidth100); desiredSlot.setX (workarea.x ()); ++gw->resizeCount; break; case 5: desiredSlot.setWidth (slotWidth75); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth25); ++gw->resizeCount; break; case 6: desiredSlot.setWidth (slotWidth66); desiredSlot.setX (workarea.x () + props.gravityRight * slotWidth33); ++gw->resizeCount; break; default: break; } } else /* keys (2, 5, 8) */ { if ((currentRect.width () == desiredRect.width () && currentRect.x () == desiredRect.x ()) || (gw->resizeCount < 1) || (gw->resizeCount > 6)) { gw->resizeCount = 2; } switch (gw->resizeCount) { case 1: desiredSlot.setWidth (slotWidth100); desiredSlot.setX (workarea.x ()); ++gw->resizeCount; break; case 2: desiredSlot.setWidth (slotWidth75); desiredSlot.setX (workarea.x () + slotWidth12); ++gw->resizeCount; break; case 3: desiredSlot.setWidth (slotWidth66); desiredSlot.setX (workarea.x () + slotWidth17); ++gw->resizeCount; break; case 4: desiredSlot.setWidth ((slotWidth50)); desiredSlot.setX (workarea.x () + slotWidth25); ++gw->resizeCount; break; case 5: desiredSlot.setWidth (slotWidth33 - (cw->border ().left + cw->border ().right)); desiredSlot.setX (workarea.x () + slotWidth33); ++gw->resizeCount; break; case 6: desiredSlot.setWidth ((slotWidth25)); desiredSlot.setX (workarea.x () + slotWidth37); ++gw->resizeCount; break; default: break; } } if (gw->resizeCount > 6) { gw->resizeCount = 1; } desiredRect = constrainSize (cw, desiredSlot); } xwc.x = desiredRect.x (); xwc.y = desiredRect.y (); xwc.width = desiredRect.width (); xwc.height = desiredRect.height (); /* Store a copy of xwc since configureXWindow changes it's values */ XWindowChanges wc = xwc; if (cw->mapNum ()) cw->sendSyncRequest (); /* TODO: animate move+resize */ if (resize) { unsigned int valueMask = CWX | CWY | CWWidth | CWHeight; gw->lastTarget = where; gw->currentSize = CompRect (wc.x, wc.y, wc.width, wc.height); CompWindowExtents lastBorder = gw->window->border (); gw->sizeHintsFlags = 0; if (!optionGetCycleSizes ()) { /* Special cases for left/right and top/bottom gridded windows, where we * actually vertically respective horizontally semi-maximize the window */ if (horzMaximizedGridPosition || vertMaximizedGridPosition) { /* First restore the window to its original size */ XWindowChanges rwc; rwc.x = gw->originalSize.x (); rwc.y = gw->originalSize.y (); rwc.width = gw->originalSize.width (); rwc.height = gw->originalSize.height (); cw->configureXWindow (CWX | CWY | CWWidth | CWHeight, &rwc); /* GridLeft || GridRight */ if (vertMaximizedGridPosition) { gw->isGridVertMaximized = true; gw->isGridHorzMaximized = false; gw->isGridResized = false; /* Semi-maximize the window vertically */ cw->maximize (CompWindowStateMaximizedVertMask); } /* GridTop || GridBottom */ else /* (horzMaximizedGridPosition) */ { gw->isGridHorzMaximized = true; gw->isGridVertMaximized = false; gw->isGridResized = false; /* Semi-maximize the window horizontally */ cw->maximize (CompWindowStateMaximizedHorzMask); } /* Be evil */ if (cw->sizeHints ().flags & PResizeInc) { gw->sizeHintsFlags |= PResizeInc; gw->window->sizeHints ().flags &= ~(PResizeInc); } } else /* GridCorners || GridCenter */ { gw->isGridResized = true; gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; } } else /* if (optionGetCycleSizes ()) */ { gw->isGridResized = true; gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; } int dw = (lastBorder.left + lastBorder.right) - (gw->window->border ().left + gw->window->border ().right); int dh = (lastBorder.top + lastBorder.bottom) - (gw->window->border ().top + gw->window->border ().bottom); xwc.width += dw; xwc.height += dh; /* Make window the size that we want */ cw->configureXWindow (valueMask, &xwc); for (unsigned int i = 0; i < animations.size (); ++i) animations.at (i).fadingOut = true; } /* This centers a window if it could not be resized to the desired * width. Without this, it can look buggy when desired width is * beyond the minimum or maximum width of the window. */ if (centerCheck) { if (cw->serverBorderRect ().width () > desiredSlot.width () || cw->serverBorderRect ().width () < desiredSlot.width ()) { wc.x = (workarea.width () >> 1) - ((cw->serverBorderRect ().width () >> 1) - cw->border ().left); cw->configureXWindow (CWX, &wc); } centerCheck = false; } } return true; } void GridScreen::glPaintRectangle (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output) { CompRect rect; GLMatrix sTransform (transform); std::vector::iterator iter; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[12]; GLushort colorData[4]; unsigned short *color, *fillColor, *outlineColor; unsigned short averageFillColor[4], averageOutlineColor[4]; GLboolean isBlendingEnabled; bool blend = !optionGetDisableBlend (); const float MaxUShortFloat = std::numeric_limits ::max (); getPaintRectangle (rect); for (unsigned int i = 0; i < animations.size (); ++i) setCurrentRect (animations.at (i)); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (blend) { glGetBooleanv (GL_BLEND, &isBlendingEnabled); glEnable (GL_BLEND); } fillColor = optionGetFillColor (); outlineColor = optionGetOutlineColor (); if (optionGetUseDesktopAverageColor ()) { const unsigned short *averageColor = screen->averageColor (); if (averageColor) { memcpy (averageFillColor, averageColor, 4 * sizeof (unsigned short)); averageFillColor[3] = MaxUShortFloat * 0.6; fillColor = averageFillColor; // Generate a lighter color based on border to create more contrast unsigned int averageColorLevel = (averageColor[0] + averageColor[1] + averageColor[2]) / 3; unsigned short *oc = averageOutlineColor; float colorMultiplier; if (averageColorLevel > MaxUShortFloat * 0.3) colorMultiplier = 0.7; // make it darker else colorMultiplier = 2.0; // make it lighter oc[3] = averageColor[3]; oc[0] = MIN(MaxUShortFloat, ((float) averageColor[0]) * colorMultiplier) * oc[3] / MaxUShortFloat; oc[1] = MIN(MaxUShortFloat, ((float) averageColor[1]) * colorMultiplier) * oc[3] / MaxUShortFloat; oc[2] = MIN(MaxUShortFloat, ((float) averageColor[2]) * colorMultiplier) * oc[3] / MaxUShortFloat; outlineColor = averageOutlineColor; } } for (iter = animations.begin (); iter != animations.end () && animating; ++iter) { Animation& anim = *iter; float curve = powf (CURVE_ANIMATION, -anim.progress); float alpha = blend ? (fillColor[3] / MaxUShortFloat) * anim.opacity : 0.85; color = fillColor; colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; if (optionGetDrawStretchedWindow ()) colorData[3] *= (1.0 - curve); vertexData[0] = anim.currentRect.x1 (); vertexData[1] = anim.currentRect.y1 (); vertexData[2] = 0.0f; vertexData[3] = anim.currentRect.x1 (); vertexData[4] = anim.currentRect.y2 (); vertexData[5] = 0.0f; vertexData[6] = anim.currentRect.x2 (); vertexData[7] = anim.currentRect.y1 (); vertexData[8] = 0.0f; vertexData[9] = anim.currentRect.x2 (); vertexData[10] = anim.currentRect.y2 (); vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* Set outline rect smaller to avoid damage issues */ anim.currentRect.setGeometry (anim.currentRect.x () + 1, anim.currentRect.y () + 1, anim.currentRect.width () - 2, anim.currentRect.height () - 2); /* draw outline */ alpha = blend ? (outlineColor[3] / MaxUShortFloat) * anim.opacity : 1; color = outlineColor; colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; if (optionGetDrawStretchedWindow ()) colorData[3] *= (1.0 - curve); vertexData[0] = anim.currentRect.x1 (); vertexData[1] = anim.currentRect.y1 (); vertexData[3] = anim.currentRect.x1 (); vertexData[4] = anim.currentRect.y2 (); vertexData[6] = anim.currentRect.x2 (); vertexData[7] = anim.currentRect.y2 (); vertexData[9] = anim.currentRect.x2 (); vertexData[10] = anim.currentRect.y1 (); glLineWidth (2.0); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); } if (!animating) { /* draw filled rectangle */ float alpha = blend ? fillColor[3] / MaxUShortFloat : 0.85; color = fillColor; colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = rect.x1 (); vertexData[1] = rect.y1 (); vertexData[2] = 0.0f; vertexData[3] = rect.x1 (); vertexData[4] = rect.y2 (); vertexData[5] = 0.0f; vertexData[6] = rect.x2 (); vertexData[7] = rect.y1 (); vertexData[8] = 0.0f; vertexData[9] = rect.x2 (); vertexData[10] = rect.y2 (); vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* Set outline rect smaller to avoid damage issues */ rect.setGeometry (rect.x () + 1, rect.y () + 1, rect.width () - 2, rect.height () - 2); /* draw outline */ alpha = outlineColor[3] / MaxUShortFloat; color = outlineColor; colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = rect.x1 (); vertexData[1] = rect.y1 (); vertexData[3] = rect.x1 (); vertexData[4] = rect.y2 (); vertexData[6] = rect.x2 (); vertexData[7] = rect.y2 (); vertexData[9] = rect.x2 (); vertexData[10] = rect.y1 (); glLineWidth (2.0); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); } if (blend) { if (!isBlendingEnabled) glDisable (GL_BLEND); } } bool GridScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = glScreen->glPaintOutput (attrib, matrix, region, output, mask); glPaintRectangle (attrib, matrix, output); return status; } namespace { class GridTypeMask { public: GridTypeMask (unsigned int m, int t): mask (m), type (t) { } unsigned int mask; int type; }; } unsigned int GridScreen::typeToMask (int t) { std::vector type; type.push_back (GridTypeMask (GridWindowType::GridUnknown, 0)); type.push_back (GridTypeMask (GridWindowType::GridBottomLeft, 1)); type.push_back (GridTypeMask (GridWindowType::GridBottom, 2)); type.push_back (GridTypeMask (GridWindowType::GridBottomRight, 3)); type.push_back (GridTypeMask (GridWindowType::GridLeft, 4)); type.push_back (GridTypeMask (GridWindowType::GridCenter, 5)); type.push_back (GridTypeMask (GridWindowType::GridRight, 6)); type.push_back (GridTypeMask (GridWindowType::GridTopLeft, 7)); type.push_back (GridTypeMask (GridWindowType::GridTop, 8)); type.push_back (GridTypeMask (GridWindowType::GridTopRight, 9)); type.push_back (GridTypeMask (GridWindowType::GridMaximize, 10)); for (unsigned int i = 0; i < type.size (); ++i) { GridTypeMask &tm = type[i]; if (tm.type == t) return tm.mask; } return GridWindowType::GridUnknown; } int GridScreen::edgeToGridType () { int ret; switch (edge) { case Left: ret = optionGetLeftEdgeAction (); break; case Right: ret = optionGetRightEdgeAction (); break; case Top: ret = optionGetTopEdgeAction (); break; case Bottom: ret = optionGetBottomEdgeAction (); break; case TopLeft: ret = optionGetTopLeftCornerAction (); break; case TopRight: ret = optionGetTopRightCornerAction (); break; case BottomLeft: ret = optionGetBottomLeftCornerAction (); break; case BottomRight: ret = optionGetBottomRightCornerAction (); break; case NoEdge: default: ret = -1; break; } return ret; } void GridScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type != MotionNotify || !mGrabWindow) return; /* Detect when cursor enters another output */ currentWorkarea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (pointerX, pointerY)); if (lastWorkarea != currentWorkarea) { lastWorkarea = currentWorkarea; if (cScreen) cScreen->damageRegion (desiredSlot); initiateCommon (0, 0, o, typeToMask (edgeToGridType ()), false, false); if (cScreen) cScreen->damageRegion (desiredSlot); } CompOutput out = screen->outputDevs ().at ( screen->outputDeviceForPoint (CompPoint (pointerX, pointerY))); /* Detect corners first */ /* Bottom Left */ if (pointerY > (out.y () + out.height () - optionGetBottomEdgeThreshold ()) && pointerX < (out.x () + optionGetLeftEdgeThreshold ())) edge = BottomLeft; /* Bottom Right */ else if (pointerY > (out.y () + out.height () - optionGetBottomEdgeThreshold ()) && pointerX > (out.x () + out.width () - optionGetRightEdgeThreshold ())) edge = BottomRight; /* Top Left */ else if (pointerY < (out.y () + optionGetTopEdgeThreshold ()) && pointerX < (out.x () + optionGetLeftEdgeThreshold ())) edge = TopLeft; /* Top Right */ else if (pointerY < (out.y () + optionGetTopEdgeThreshold ()) && pointerX > (out.x () + out.width () - optionGetRightEdgeThreshold ())) edge = TopRight; /* Left */ else if (pointerX < (out.x () + optionGetLeftEdgeThreshold ())) edge = Left; /* Right */ else if (pointerX > (out.x () + out.width () - optionGetRightEdgeThreshold ())) edge = Right; /* Top */ else if (pointerY < (out.y () + optionGetTopEdgeThreshold ())) edge = Top; /* Bottom */ else if (pointerY > (out.y () + out.height () - optionGetBottomEdgeThreshold ())) edge = Bottom; /* No Edge */ else edge = NoEdge; /* Detect edge region change */ CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (o, "window")); if (lastEdge != edge) { bool check = false; unsigned int target = typeToMask (edgeToGridType ()); lastSlot = desiredSlot; if (edge == NoEdge || target == GridUnknown) desiredSlot.setGeometry (0, 0, 0, 0); if (cScreen) cScreen->damageRegion (desiredSlot); check = initiateCommon (NULL, 0, o, target, false, false); if (cScreen) cScreen->damageRegion (desiredSlot); if (lastSlot != desiredSlot) { if (!animations.empty ()) /* Begin fading previous animation instance */ animations.at (animations.size () - 1).fadingOut = true; if (edge != NoEdge && check) { if (w) { animations.push_back (Animation ()); int current = animations.size () - 1; animations.at (current).fromRect = w->serverBorderRect (); animations.at (current).currentRect = w->serverBorderRect (); animations.at (current).duration = optionGetAnimationDuration (); animations.at (current).progress = 0.0f; animations.at (current).targetRect = desiredSlot; animations.at (current).window = w->id(); if (lastEdge == NoEdge || !animating) { /* Cursor has entered edge region from non-edge region */ animating = true; glScreen->glPaintOutputSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } } } } lastEdge = edge; } if (w) { GRID_WINDOW (w); int snapoffThreshold = optionGetSnapoffThreshold (); /* we just care about snapping of grid-resized windows */ if ((gw->pointerBufDx > snapoffThreshold || gw->pointerBufDy > snapoffThreshold || gw->pointerBufDx < -snapoffThreshold || gw->pointerBufDy < -snapoffThreshold) && gw->isGridResized) restoreWindow (0, 0, o); } } void GridWindow::validateResizeRequest (unsigned int &xwcm, XWindowChanges *xwc, unsigned int source) { window->validateResizeRequest (xwcm, xwc, source); /* Don't allow non-pagers to change * the size of the window, the user * specified this size */ if (isGridHorzMaximized || isGridVertMaximized) if (source != ClientTypePager) xwcm = 0; } void GridWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { static cgw::GrabActiveFunc grabActive (boost::bind (&CompScreen::grabExist, screen, _1)); cgw::GrabWindowHandler gwHandler (mask, grabActive); if (gwHandler.track ()) { gScreen->o[0].value ().set ((int) window->id ()); screen->handleEventSetEnabled (gScreen, true); gScreen->mGrabWindow = window; pointerBufDx = pointerBufDy = 0; grabMask = mask; if (!isGridResized && !isGridHorzMaximized && !isGridVertMaximized) /* Store size not including borders when grabbing with cursor */ originalSize = gScreen->slotToRect (window, window->serverBorderRect ()); } else if (gwHandler.resetResize ()) { isGridResized = false; resizeCount = 0; } window->grabNotify (x, y, state, mask); } void GridWindow::ungrabNotify () { if (window == gScreen->mGrabWindow) { gScreen->initiateCommon (NULL, 0, gScreen->o, gScreen->typeToMask (gScreen->edgeToGridType ()), true, gScreen->edge != gScreen->lastResizeEdge); screen->handleEventSetEnabled (gScreen, false); grabMask = 0; gScreen->mGrabWindow = NULL; gScreen->o[0].value ().set (0); gScreen->cScreen->damageRegion (gScreen->desiredSlot); } gScreen->lastResizeEdge = gScreen->edge; gScreen->edge = NoEdge; window->ungrabNotify (); } void GridWindow::moveNotify (int dx, int dy, bool immediate) { window->moveNotify (dx, dy, immediate); if (isGridResized && !isGridHorzMaximized && !isGridVertMaximized && !GridScreen::get (screen)->mSwitchingVp) { if (window->grabbed () && screen->grabExist ("expo")) { /* Window is being dragged in expo. * Restore the original geometry right * away to avoid any confusion. */ gScreen->restoreWindow (0, 0, gScreen->o); return; } if (window->grabbed () && (grabMask & CompWindowGrabMoveMask)) { pointerBufDx += dx; pointerBufDy += dy; } /* Do not allow the window to be moved while it * is resized */ dx = currentSize.x () - window->geometry ().x (); dy = currentSize.y () - window->geometry ().y (); window->move (dx, dy); } } void GridWindow::stateChangeNotify (unsigned int lastState) { if (lastState & MAXIMIZE_STATE && !(window->state () & MAXIMIZE_STATE)) { lastTarget = GridUnknown; if (isGridHorzMaximized) { window->saveMask () |= CWY | CWHeight; window->saveWc ().y = originalSize.y (); window->saveWc ().height = originalSize.height (); } else if (isGridVertMaximized) { window->saveMask () |= CWX | CWWidth; window->saveWc ().x = originalSize.x () - window->border ().left; window->saveWc ().width = originalSize.width () + window->border ().left + window->border ().right; } if ((isGridHorzMaximized && (lastState & MAXIMIZE_STATE) == CompWindowStateMaximizedHorzMask) || (isGridVertMaximized && (lastState & MAXIMIZE_STATE) == CompWindowStateMaximizedVertMask)) gScreen->restoreWindow(0, 0, gScreen->o); } else if (!(lastState & MAXIMIZE_STATE) && window->state () & MAXIMIZE_STATE) { /* Unset grid resize state */ isGridResized = false; resizeCount = 0; if ((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) lastTarget = GridMaximize; if (window->grabbed ()) originalSize = gScreen->slotToRect (window, window->serverBorderRect ()); } window->stateChangeNotify (lastState); } bool GridScreen::restoreWindow (CompAction *action, CompAction::State state, CompOption::Vector &option) { XWindowChanges xwc; int xwcm = 0; CompWindow *cw = screen->findWindow (screen->activeWindow ()); if (!cw) return false; GRID_WINDOW (cw); /* We have nothing to do here */ if (!gw->isGridResized && !gw->isGridVertMaximized && !gw->isGridHorzMaximized) return false; else if (!gw->isGridResized && gw->isGridHorzMaximized && !gw->isGridVertMaximized) { /* Window has been horizontally maximized by grid. We only need * to restore Y and height - core handles X and width. */ if (gw->sizeHintsFlags) gw->window->sizeHints ().flags |= gw->sizeHintsFlags; xwcm |= CWY | CWHeight; } else if (!gw->isGridResized && !gw->isGridHorzMaximized && gw->isGridVertMaximized) { /* Window has been vertically maximized by grid. We only need * to restore X and width - core handles Y and height. */ if (gw->sizeHintsFlags) gw->window->sizeHints ().flags |= gw->sizeHintsFlags; xwcm |= CWX | CWWidth; } else if (gw->isGridResized && !gw->isGridHorzMaximized && !gw->isGridVertMaximized) /* Window is just gridded (center, corners). * We need to handle everything. */ xwcm |= CWX | CWY | CWWidth | CWHeight; else { /* This should never happen. But if it does, just bail out * gracefully. */ assert (gw->isGridResized && (gw->isGridHorzMaximized || gw->isGridVertMaximized)); return false; } if (cw == mGrabWindow) { /* The windows x-center is different in this case. */ if (optionGetSnapbackWindows ()) xwc.x = pointerX - (gw->originalSize.width () / 2); else /* the user does not want the original size back */ xwc.x = pointerX - gw->currentSize.width () / 2; xwc.y = pointerY + cw->border ().top / 2; } else if (cw->grabbed () && screen->grabExist ("expo")) { /* We're restoring a window inside expo by dragging. This is a bit * tricky. Pointer location is absolute to the screen, not relative * to expo viewport. So we can't use pointer location to calculate * the position of the restore window. * * The best solution is to resize it in place. */ xwcm = CWWidth | CWHeight; } else { xwc.x = gw->originalSize.x (); xwc.y = gw->originalSize.y (); } /* We just need the original size, if * this option is enabled or we are not grabbed */ if (optionGetSnapbackWindows () || !(cw == mGrabWindow)) { xwc.width = gw->originalSize.width (); xwc.height = gw->originalSize.height (); } else { /* the current size is also our new size */ xwc.width = gw->currentSize.width (); xwc.height = gw->currentSize.height (); } if (cw->mapNum() && xwcm) cw->sendSyncRequest(); /* Mark window as not gridded before configuring. If the current geometry * is the same as restored geometry, moveNotify blocks the restoration * movement and the pointer will detach from the window (LP: #1115344). */ gw->isGridHorzMaximized = false; gw->isGridVertMaximized = false; gw->isGridResized = false; cw->configureXWindow (xwcm, &xwc); gw->currentSize = CompRect (); gw->pointerBufDx = 0; gw->pointerBufDy = 0; if (cw->state () & MAXIMIZE_STATE) cw->maximize(0); gw->resizeCount = 0; gw->lastTarget = GridUnknown; return true; } void GridScreen::preparePaint (int msSinceLastPaint) { std::vector::iterator iter; for (iter = animations.begin (); iter != animations.end (); ++iter) { Animation& anim = *iter; GLfloat msSinceLastPaintFloat = static_cast(msSinceLastPaint); GLfloat animDurationFloat = static_cast(anim.duration); GLfloat progress_delta = 1.0f; if (animDurationFloat > 0.0f) progress_delta = msSinceLastPaintFloat / animDurationFloat; if (anim.fadingOut) { anim.opacity -= progress_delta; } else { if (anim.opacity < 1.0f) anim.opacity = anim.progress * anim.progress; else anim.opacity = 1.0f; } if (anim.opacity < 0) { anim.opacity = 0.0f; anim.fadingOut = false; anim.complete = true; } anim.progress = std::min(anim.progress + progress_delta, 1.0); } if (optionGetDrawStretchedWindow () && !optionGetDisableBlend ()) { CompWindow *cw = screen->findWindow (CompOption::getIntOptionNamed (o, "window")); if (!cw) cw = screen->findWindow (screen->activeWindow ()); if (cw) { GRID_WINDOW (cw); gw->gWindow->glPaintSetEnabled (gw, true); } } cScreen->preparePaint (msSinceLastPaint); } void GridScreen::donePaint () { std::vector::iterator iter; for (iter = animations.begin (); iter != animations.end ();) { Animation& anim = *iter; if (anim.complete) iter = animations.erase(iter); else ++iter; } if (animations.empty ()) { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); if (edge == NoEdge) glScreen->glPaintOutputSetEnabled (this, false); animations.clear (); animating = false; } if (optionGetDrawStretchedWindow ()) { CompWindow *cw = screen->findWindow (CompOption::getIntOptionNamed (o, "window")); if (!cw) cw = screen->findWindow (screen->activeWindow ()); if (cw) { GRID_WINDOW (cw); gw->gWindow->glPaintSetEnabled (gw, false); } } cScreen->damageScreen (); cScreen->donePaint (); } Animation::Animation () { progress = 0.0f; fromRect = CompRect (0, 0, 0, 0); targetRect = CompRect (0, 0, 0, 0); currentRect = CompRect (0, 0, 0, 0); opacity = 0.0f; duration = 0; complete = false; fadingOut = false; window = 0; } GridScreen::GridScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), glScreen (GLScreen::get (screen)), props (), centerCheck (false), mGrabWindow (NULL), animating (false), mSwitchingVp (false) { o.push_back (CompOption ("window", CompOption::TypeInt)); ScreenInterface::setHandler (screen, false); screen->handleCompizEventSetEnabled (this, true); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (glScreen, false); edge = lastEdge = lastResizeEdge = NoEdge; currentWorkarea = lastWorkarea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (pointerX, pointerY)); gridProps[GridUnknown] = GridProps (0,1, 1,1); gridProps[GridBottomLeft] = GridProps (0,1, 2,2); gridProps[GridBottom] = GridProps (0,1, 1,2); gridProps[GridBottomRight] = GridProps (1,1, 2,2); gridProps[GridLeft] = GridProps (0,0, 2,1); gridProps[GridCenter] = GridProps (0,0, 1,1); gridProps[GridRight] = GridProps (1,0, 2,1); gridProps[GridTopLeft] = GridProps (0,0, 2,2); gridProps[GridTop] = GridProps (0,0, 1,2); gridProps[GridTopRight] = GridProps (1,0, 2,2); gridProps[GridMaximize] = GridProps (0,0, 1,1); animations.clear (); #define GRIDSET(opt,where,resize,key) \ optionSet##opt##Initiate (boost::bind (&GridScreen::initiateCommon, this, \ _1, _2, _3, where, resize, key)) GRIDSET (PutCenterKey, GridWindowType::GridCenter, true, true); GRIDSET (PutLeftKey, GridWindowType::GridLeft, true, true); GRIDSET (PutRightKey, GridWindowType::GridRight, true, true); GRIDSET (PutTopKey, GridWindowType::GridTop, true, true); GRIDSET (PutBottomKey, GridWindowType::GridBottom, true, true); GRIDSET (PutTopleftKey, GridWindowType::GridTopLeft, true, true); GRIDSET (PutToprightKey, GridWindowType::GridTopRight, true, true); GRIDSET (PutBottomleftKey, GridWindowType::GridBottomLeft, true, true); GRIDSET (PutBottomrightKey, GridWindowType::GridBottomRight, true, true); GRIDSET (PutMaximizeKey, GridWindowType::GridMaximize, true, true); GRIDSET (RightMaximize, GridWindowType::GridRight, true, true); GRIDSET (LeftMaximize, GridWindowType::GridLeft, true, true); #undef GRIDSET optionSetPutRestoreKeyInitiate (boost::bind (&GridScreen:: restoreWindow, this, _1, _2, _3)); } GridWindow::GridWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get(window)), gScreen (GridScreen::get (screen)), isGridResized (false), isGridHorzMaximized (false), isGridVertMaximized (false), grabMask (0), pointerBufDx (0), pointerBufDy (0), resizeCount (0), lastTarget (GridUnknown), sizeHintsFlags (0) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow, false); } GridWindow::~GridWindow () { if (gScreen->mGrabWindow == window) gScreen->mGrabWindow = NULL; CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (gScreen->o, "window")); if (w == window) gScreen->o[0].value ().set (0); } bool GridWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& matrix, const CompRegion& region, const unsigned int mask) { bool status = gWindow->glPaint (attrib, matrix, region, mask); std::vector::iterator iter; for (iter = gScreen->animations.begin (); iter != gScreen->animations.end () && gScreen->animating; ++iter) { Animation& anim = *iter; if (anim.progress < 1.0f && anim.window == window->id()) { GLWindowPaintAttrib wAttrib(attrib); GLMatrix wTransform (matrix); unsigned int wMask(mask); float curve = powf (CURVE_ANIMATION, -anim.progress); wAttrib.opacity *= curve; wMask |= PAINT_WINDOW_TRANSFORMED_MASK; wMask |= PAINT_WINDOW_TRANSLUCENT_MASK; wMask |= PAINT_WINDOW_BLEND_MASK; float scaleX = (anim.currentRect.x2 () - anim.currentRect.x1 ()) / (float) window->borderRect ().width (); float scaleY = (anim.currentRect.y2 () - anim.currentRect.y1 ()) / (float) window->borderRect ().height (); float translateX = (anim.currentRect.x1 () - window->x ()) + window->border ().left * scaleX; float translateY = (anim.currentRect.y1 () - window->y ()) + window->border ().top * scaleY; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (scaleX, scaleY, 1.0f); wTransform.translate (translateX / scaleX - window->x (), translateY / scaleY - window->y (), 0.0f); gWindow->glPaint (wAttrib, wTransform, region, wMask); } } return status; } /* Initial plugin init function called. Checks to see if we are ABI * compatible with core, otherwise unload */ bool GridPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/grid/grid.xml.in0000644000004100000410000003701513246301623015733 0ustar www-datawww-data <_short>Grid <_long>Warp and resize windows to fit an imaginary grid Window Management opengl wobbly composite opengl decor <_short>Bindings <_short>Corners / Edges <_short>Resize Actions <_short>Grid Snapback Thresholds <_short>Grid Snapoff Threshold <_short>Appearance ./plugins/stackswitch/0000755000004100000410000000000013246301624015254 5ustar www-datawww-data./plugins/stackswitch/CMakeLists.txt0000644000004100000410000000016513246301623020015 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (stackswitch PLUGINDEPS opengl composite text) ./plugins/stackswitch/stackswitch.xml.in0000644000004100000410000001505613246301623020740 0ustar www-datawww-data <_short>Stack Window Switcher <_long>Stack Window Switcher Window Management opengl composite opengl text decor <_short>Key bindings <_short>Behavior <_short>Window title display ./plugins/stackswitch/src/0000755000004100000410000000000013246301624016043 5ustar www-datawww-data./plugins/stackswitch/src/stackswitch.h0000644000004100000410000001076513246301623020553 0ustar www-datawww-data/* * * Compiz stackswitch switcher plugin * * stackswitch.h * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include "stackswitch_options.h" typedef enum { StackswitchStateNone = 0, StackswitchStateOut, StackswitchStateSwitching, StackswitchStateIn } StackswitchState; typedef enum { StackswitchTypeNormal = 0, StackswitchTypeGroup, StackswitchTypeAll } StackswitchType; typedef struct _StackswitchSlot { int x, y; /* thumb center coordinates */ float scale; /* size scale (fit to maximal thumb size) */ } StackswitchSlot; typedef struct _StackswitchDrawSlot { CompWindow *w; StackswitchSlot **slot; } StackswitchDrawSlot; class StackswitchScreen: public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public StackswitchOptions { public: StackswitchScreen (CompScreen *); ~StackswitchScreen (); public: CompositeScreen *cScreen; GLScreen *gScreen; public: void handleEvent (XEvent *); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); public: void renderWindowTitle (); void drawWindowTitle (GLMatrix &transform, CompWindow *w); bool layoutThumbs (); void addWindowToList (CompWindow *w); bool updateWindowList (); bool createWindowList (); void switchToWindow (bool toNext); int countWindows (); int adjustStackswitchRotation (float chunk); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, StackswitchType type); void windowRemove (Window id); public: CompText mText; CompScreen::GrabHandle mGrabIndex; StackswitchState mState; StackswitchType mType; bool mMoreAdjust; bool mRotateAdjust; bool mPaintingSwitcher; GLfloat mRVelocity; GLfloat mRotation; /* only used for sorting */ CompWindow **mWindows; StackswitchDrawSlot *mDrawSlots; int mWindowsSize; int mNWindows; Window mClientLeader; Window mSelectedWindow; CompMatch mMatch; CompMatch mCurrentMatch; }; class StackswitchWindow: public PluginClassHandler , public CompositeWindowInterface, public GLWindowInterface { public: StackswitchWindow (CompWindow *); ~StackswitchWindow (); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool, const CompRect &); public: int adjustVelocity (); bool isStackswitchable (); public: StackswitchSlot *mSlot; GLfloat mXVelocity; GLfloat mYVelocity; GLfloat mScaleVelocity; GLfloat mRotVelocity; GLfloat mTx; GLfloat mTy; GLfloat mScale; GLfloat mRotation; bool mAdjust; }; #define STACKSWITCH_WINDOW(w) \ StackswitchWindow *sw = StackswitchWindow::get (w); #define STACKSWITCH_SCREEN(s) \ StackswitchScreen *ss = StackswitchScreen::get (s); class StackswitchPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/stackswitch/src/stackswitch.cpp0000644000004100000410000007533313246301623021110 0ustar www-datawww-data/* * * Compiz stackswitch switcher plugin * * stackswitch.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "stackswitch.h" COMPIZ_PLUGIN_20090315 (stackswitch, StackswitchPluginVTable) bool textAvailable; bool StackswitchWindow::isStackswitchable () { STACKSWITCH_SCREEN (screen); if (window->overrideRedirect () || window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; if (!window->mapNum () || !window->isViewable ()) { if (ss->optionGetMinimized ()) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else return false; } if (ss->mType == StackswitchTypeNormal) { if (!window->mapNum () || !window->isViewable ()) { if (window->serverX () + window->width () <= 0 || window->serverY () + window->height () <= 0 || window->serverX () >= screen->width () || window->serverY () >= screen->height ()) return false; } else if (!window->focus ()) return false; } else if (ss->mType == StackswitchTypeGroup && ss->mClientLeader != window->clientLeader () && ss->mClientLeader != window->id ()) return false; if (window->state () & CompWindowStateSkipTaskbarMask || !ss->mCurrentMatch.evaluate (window)) return false; return true; } void StackswitchScreen::renderWindowTitle () { if (!textAvailable || !optionGetWindowTitle ()) return; CompText::Attrib tA; CompRect oe = screen->getCurrentOutputExtents (); /* 75% of the output device as maximum width */ tA.maxWidth = oe.width () * 3 / 4; tA.maxHeight = 100; tA.family = "Sans"; tA.size = optionGetTitleFontSize (); tA.color[0] = optionGetTitleFontColorRed (); tA.color[1] = optionGetTitleFontColorGreen (); tA.color[2] = optionGetTitleFontColorBlue (); tA.color[3] = optionGetTitleFontColorAlpha (); tA.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetTitleFontBold ()) tA.flags |= CompText::StyleBold; tA.bgHMargin = 15; tA.bgVMargin = 15; tA.bgColor[0] = optionGetTitleBackColorRed (); tA.bgColor[1] = optionGetTitleBackColorGreen (); tA.bgColor[2] = optionGetTitleBackColorBlue (); tA.bgColor[3] = optionGetTitleBackColorAlpha (); bool showViewport = (mType == StackswitchTypeAll); mText.renderWindowTitle (mSelectedWindow, showViewport, tA); } void StackswitchScreen::drawWindowTitle (GLMatrix &transform, CompWindow *w) { if (!textAvailable || !optionGetWindowTitle ()) return; GLint oldBlendSrc, oldBlendDst; GLMatrix wTransform (transform); float y; GLTexture *icon; STACKSWITCH_WINDOW (w); CompRect oe = screen->getCurrentOutputExtents (); float width = mText.getWidth (); float height = mText.getHeight (); float x = oe.centerX (); float tx = x - width / 2; switch (optionGetTitleTextPlacement ()) { case StackswitchOptions::TitleTextPlacementOnThumbnail: { GLVector v (w->x () + (w->width () / 2.0), w->y () + (w->width () / 2.0), 0.0f, 1.0f); GLMatrix pm (gScreen->projectionMatrix ()); wTransform.scale (1.0, 1.0, 1.0 / screen->height ()); wTransform.translate (sw->mTx, sw->mTy, 0.0f); wTransform.rotate (-mRotation, 1.0, 0.0, 0.0); wTransform.scale (sw->mScale, sw->mScale, 1.0); wTransform.translate (+w->border ().left, 0.0 - (w->height () + w->border ().bottom), 0.0f); wTransform.translate (-w->x (), -w->y (), 0.0f); GLMatrix mvp = pm * wTransform; v = mvp * v; v.homogenize (); x = (v[GLVector::x] + 1.0) * oe.width () * 0.5; y = (v[GLVector::y] - 1.0) * oe.height () * -0.5; x += oe.x1 (); y += oe.y1 (); tx = MAX (oe.x1 (), x - (width / 2.0)); if (tx + width > oe.x2 ()) tx = oe.x2 () - width; } break; case StackswitchOptions::TitleTextPlacementCenteredOnScreen: y = oe.centerY () + height / 2; break; case StackswitchOptions::TitleTextPlacementAbove: case StackswitchOptions::TitleTextPlacementBelow: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTitleTextPlacement () == StackswitchOptions::TitleTextPlacementAbove) y = oe.y1 () + workArea.y () + height; else y = oe.y1 () + workArea.y2 () - 96; } break; default: return; break; } tx = floor (tx); y = floor (y); glGetIntegerv (GL_BLEND_SRC, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST, &oldBlendDst); GLboolean wasBlend = glIsEnabled (GL_BLEND); if (!wasBlend) glEnable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f (1.0, 1.0, 1.0, 1.0); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); icon = sw->gWindow->getIcon (512, 512); if (!icon) icon = gScreen->defaultIcon (); if (icon && (icon->name ())) { float ix = floor (x - (icon->width () / 2.0)); icon->enable (GLTexture::Good); GLTexture::Matrix m = icon->matrix (); glColor4f (0.0, 0.0, 0.0, 0.1); for (int off = 0; off < 6; ++off) { glBegin (GL_QUADS); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m ,0)); glVertex2f (ix - off, y - off); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix - off, y + icon->height () + off); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix + icon->width () + off, y + icon->height () + off); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, 0)); glVertex2f (ix + icon->width () + off, y - off); glEnd (); } glColor4f (1.0, 1.0, 1.0, 1.0); glBegin (GL_QUADS); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m ,0)); glVertex2f (ix, y); glTexCoord2f (COMP_TEX_COORD_X (m, 0), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix, y + icon->height ()); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, icon->height ())); glVertex2f (ix + icon->width (), y + icon->height ()); glTexCoord2f (COMP_TEX_COORD_X (m, icon->width ()), COMP_TEX_COORD_Y (m, 0)); glVertex2f (ix + icon->width (), y); glEnd (); icon->disable (); } mText.draw (x - mText.getWidth () / 2, y, 1.0); glPopMatrix (); glColor4usv (defaultColor); if (!wasBlend) glDisable (GL_BLEND); glBlendFunc (oldBlendSrc, oldBlendDst); } bool StackswitchWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; STACKSWITCH_SCREEN (screen); if (ss->mState != StackswitchStateNone) { bool scaled = false; float rotation; if (window->mapNum ()) { if (!gWindow->textures ().size ()) gWindow->bind (); } if (mAdjust || mSlot) { scaled = (mAdjust && ss->mState != StackswitchStateSwitching) || (mSlot && ss->mPaintingSwitcher); mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } else if (ss->mState != StackswitchStateIn && ss->optionGetDarkenBack ()) { GLWindowPaintAttrib sAttrib (attrib); /* modify brightness of the other windows */ sAttrib.brightness = sAttrib.brightness / 2; } status = gWindow->glPaint (attrib, transform, region, mask); if (ss->optionGetInactiveRotate ()) rotation = MIN (mRotation, ss->mRotation); else rotation = ss->mRotation; if (scaled && gWindow->textures ().size ()) { GLFragment::Attrib fragment (gWindow->lastPaintAttrib ()); GLMatrix wTransform (transform); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; if (mSlot && window->id () != ss->mSelectedWindow) fragment.setOpacity ((float)fragment.getOpacity () * ss->optionGetInactiveOpacity () / 100); if (window->alpha () || fragment.getOpacity () != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.scale (1.0, 1.0, 1.0 / screen->height ()); wTransform.translate (mTx, mTy, 0.0f); wTransform.rotate (-rotation, 1.0, 0.0, 0.0); wTransform.scale (mScale, mScale, 1.0); wTransform.translate (+window->border ().left, 0.0 -(window->height () + window->border ().bottom), 0.0f); wTransform.translate (-window->x (), -window->y (), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); gWindow->glDraw (wTransform, fragment, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); glPopMatrix (); } if (scaled && !gWindow->textures ().size ()) { GLTexture *icon = gWindow->getIcon (512, 512); if (!icon) icon = ss->gScreen->defaultIcon (); if (icon && (icon->name ())) { CompRegion iconReg (0, 0, icon->width (), icon->height ()); float scale = MIN (window->width () / icon->width (), window->height () / icon->height ()); scale *= mScale; mask |= PAINT_WINDOW_BLEND_MASK; /* if we paint the icon for a minimized window, we need to force the usage of a good texture filter */ if (!gWindow->textures ().size ()) mask |= PAINT_WINDOW_TRANSFORMED_MASK; GLTexture::Matrix matrix = icon->matrix (); GLTexture::MatrixList matl; matl.push_back (matrix); gWindow->geometry ().reset (); gWindow->glAddGeometry (matl, iconReg, CompRegion::infinite ()); if (gWindow->geometry ().vCount) { GLFragment::Attrib fragment (attrib); GLMatrix wTransform (transform); if (!gWindow->textures ().size ()) fragment.setOpacity (gWindow->paintAttrib ().opacity); wTransform.scale (1.0, 1.0, 1.0 / screen->height ()); wTransform.translate (mTx, mTy, 0.0f); wTransform.rotate (-rotation, 1.0, 0.0, 0.0); wTransform.scale (scale, scale, 1.0); wTransform.translate (0.0, -icon->height (), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); gWindow->glDrawTexture (icon, fragment, mask); glPopMatrix (); } } } } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } int compareWindows (const void *elem1, const void *elem2) { CompWindow *w1 = *((CompWindow **) elem1); CompWindow *w2 = *((CompWindow **) elem2); if (w1->mapNum () && !w2->mapNum ()) return -1; if (w2->mapNum () && !w1->mapNum ()) return 1; return w2->activeNum () - w1->activeNum (); } int compareStackswitchWindowDepth (const void *elem1, const void *elem2) { StackswitchSlot *a1 = *(((StackswitchDrawSlot *) elem1)->slot); StackswitchSlot *a2 = *(((StackswitchDrawSlot *) elem2)->slot); if (a1->y < a2->y) return -1; else if (a1->y > a2->y) return 1; else { CompWindow *a1 = (((StackswitchDrawSlot *) elem1)->w); CompWindow *a2 = (((StackswitchDrawSlot *) elem2)->w); STACKSWITCH_SCREEN (screen); if (a1->id () == ss->mSelectedWindow) return 1; else if (a2->id () == ss->mSelectedWindow) return -1; else return 0; } } bool StackswitchScreen::layoutThumbs () { CompWindow *w; int index; int ww, wh; float xScale, yScale; float swi = 0.0; int col = 0, row = 0; int c, cindex, ci, gap, hasActive = 0; bool exit; if ((mState == StackswitchStateNone) || (mState == StackswitchStateIn)) return false; CompRect oe = screen->getCurrentOutputExtents (); for (index = 0; index < mNWindows; ++index) { w = mWindows[index]; ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; swi += ((float) ww / (float) wh) * (oe.width () / (float) oe.height ()); } int cols = ceil (sqrtf (swi)); swi = 0.0; for (index = 0; index < mNWindows; ++index) { w = mWindows[index]; ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; swi += (float)ww / (float)wh; if (swi > cols) { ++row; swi = (float)ww / (float)wh; col = 0; } ++col; } int rows = row + 1; oe.setHeight (oe.width () / cols); float rh = ((float) oe.height () * 0.8) / rows; for (index = 0; index < mNWindows; ++index) { w = mWindows[index]; STACKSWITCH_WINDOW (w); if (!sw->mSlot) sw->mSlot = (StackswitchSlot *) malloc (sizeof (StackswitchSlot)); if (!sw->mSlot) return false; mDrawSlots[index].w = w; mDrawSlots[index].slot = &sw->mSlot; } index = 0; for (int r = 0; r < rows && index < mNWindows; ++r) { c = 0; swi = 0.0; cindex = index; exit = false; while (index < mNWindows && !exit) { w = mWindows[index]; STACKSWITCH_WINDOW (w); sw->mSlot->x = oe.x1 () + swi; sw->mSlot->y = oe.y2 () - (rh * r) - (oe.height () * 0.1); ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; if (ww > oe.width ()) xScale = oe.width () / (float) ww; else xScale = 1.0f; if (wh > oe.height ()) yScale = oe.height () / (float) wh; else yScale = 1.0f; sw->mSlot->scale = MIN (xScale, yScale); if (swi + (ww * sw->mSlot->scale) > oe.width () && cindex != index) { exit = true; continue; } if (w->id () == mSelectedWindow) hasActive = 1; swi += ww * sw->mSlot->scale; ++c; ++index; } gap = oe.width () - swi; gap /= c + 1; index = cindex; ci = 1; while (ci <= c) { w = mWindows[index]; STACKSWITCH_WINDOW (w); sw->mSlot->x += ci * gap; if (hasActive == 0) sw->mSlot->y += sqrt(2 * oe.height () * oe.height ()) - rh; ++ci; ++index; } if (hasActive == 1) ++hasActive; } /* sort the draw list so that the windows with the * lowest Y value (the windows being farest away) * are drawn first */ qsort (mDrawSlots, mNWindows, sizeof (StackswitchDrawSlot), compareStackswitchWindowDepth); return true; } void StackswitchScreen::addWindowToList (CompWindow *w) { if (mWindowsSize <= mNWindows) { mWindows = (CompWindow **) realloc (mWindows, sizeof (CompWindow *) * (mNWindows + 32)); if (!mWindows) return; mDrawSlots = (StackswitchDrawSlot *) realloc (mDrawSlots, sizeof (StackswitchDrawSlot) * (mNWindows + 32)); if (!mDrawSlots) { free (mDrawSlots); return; } mWindowsSize = mNWindows + 32; } mWindows[++mNWindows] = w; } bool StackswitchScreen::updateWindowList () { qsort (mWindows, mNWindows, sizeof (CompWindow *), compareWindows); return layoutThumbs (); } bool StackswitchScreen::createWindowList () { mNWindows = 0; foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); if (sw->isStackswitchable ()) { STACKSWITCH_WINDOW (w); addWindowToList (w); sw->mAdjust = true; } } return updateWindowList (); } void StackswitchScreen::switchToWindow (bool toNext) { CompWindow *w; if (!mGrabIndex) return; for (int cur = 0; cur < mNWindows; ++cur) { if (mWindows[cur]->id () == mSelectedWindow) break; } if (cur == mNWindows) return; if (toNext) w = mWindows[(cur + 1) % mNWindows]; else w = mWindows[(cur + mNWindows - 1) % mNWindows]; if (w) { Window old = mSelectedWindow; mSelectedWindow = w->id (); if (old != w->id ()) { mRotateAdjust = true; mMoreAdjust = true; foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); sw->mAdjust = true; } cScreen->damageScreen (); renderWindowTitle (); } } } int StackswitchScreen::countWindows () { CompWindow *w; int count = 0; foreach (w, screen->windows ()) { if (StackswitchWindow::get (w)->isStackswitchable ()) ++count; } return count; } int StackswitchScreen::adjustStackswitchRotation (float chunk) { float rot; if (mState != StackswitchStateNone && mState != StackswitchStateIn) rot = optionGetTilt (); else rot = 0.0; float dx = rot - mRotation; float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mRVelocity = (amount * mRVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mRVelocity) < 0.2f) { mRVelocity = 0.0f; mRotation = rot; return false; } mRotation += mRVelocity * chunk; return true; } int StackswitchWindow::adjustVelocity () { float x1, y1, scale, rot; STACKSWITCH_SCREEN (screen); if (mSlot) { scale = mSlot->scale; x1 = mSlot->x; y1 = mSlot->y; } else { scale = 1.0f; x1 = window->x () - window->border ().left; y1 = window->y () + window->height () + window->border ().bottom; } if (window->id () == ss->mSelectedWindow) rot = ss->mRotation; else rot = 0.0; float dx = x1 - mTx; float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mXVelocity = (amount * mXVelocity + adjust) / (amount + 1.0f); float dy = y1 - mTy; adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mYVelocity = (amount * mYVelocity + adjust) / (amount + 1.0f); float ds = scale - mScale; adjust = ds * 0.1f; amount = fabs (ds) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mScaleVelocity = (amount * mScaleVelocity + adjust) / (amount + 1.0f); float dr = rot - mRotation; adjust = dr * 0.15f; amount = fabs (dr) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mRotVelocity = (amount * mRotVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (mYVelocity) < 0.2f && fabs (ds) < 0.001f && fabs (mScaleVelocity) < 0.002f && fabs (dr) < 0.1f && fabs (mRotVelocity) < 0.2f) { mXVelocity = mYVelocity = mScaleVelocity = 0.0f; mTx = x1; mTy = y1; mRotation = rot; mScale = scale; return 0; } return 1; } bool StackswitchScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform (transform); if (mState != StackswitchStateNone || mRotation != 0.0) { mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK; mask |= PAINT_SCREEN_CLEAR_MASK; sTransform.translate (0.0, -0.5, -DEFAULT_Z_CAMERA); sTransform.rotate (-mRotation, 1.0, 0.0, 0.0); sTransform.translate (0.0, 0.5, DEFAULT_Z_CAMERA); } bool status = gScreen->glPaintOutput (attrib, sTransform, region, output, mask); if (mState != StackswitchStateNone && ((unsigned int) output->id () == (unsigned int) ~0 || screen->outputDevs ().at (screen->currentOutputDev ().id ()) == *output)) { CompWindow *aw = NULL; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (sTransform.getMatrix ()); mPaintingSwitcher = true; for (int i = 0; i < mNWindows; ++i) { if (mDrawSlots[i].slot && *(mDrawSlots[i].slot)) { CompWindow *w = mDrawSlots[i].w; if (w->id () == mSelectedWindow) aw = w; STACKSWITCH_WINDOW (w); sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, CompRegion::infinite (), 0); } } GLMatrix tTransform (transform); tTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glLoadMatrixf (tTransform.getMatrix ()); if (mText.getWidth () && (mState != StackswitchStateIn) && aw) drawWindowTitle (sTransform, aw); mPaintingSwitcher = false; glPopMatrix (); } return status; } void StackswitchScreen::preparePaint (int msSinceLastPaint) { if (mState != StackswitchStateNone && (mMoreAdjust || mRotateAdjust)) { CompWindow *w; float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; layoutThumbs (); while (steps--) { mRotateAdjust = adjustStackswitchRotation (chunk); mMoreAdjust = false; foreach (w, screen->windows ()) { STACKSWITCH_WINDOW (w); if (sw->mAdjust) { sw->mAdjust = sw->adjustVelocity (); mMoreAdjust |= sw->mAdjust; sw->mTx += sw->mXVelocity * chunk; sw->mTy += sw->mYVelocity * chunk; sw->mScale += sw->mScaleVelocity * chunk; sw->mRotation += sw->mRotVelocity * chunk; } else if (sw->mSlot) { sw->mScale = sw->mSlot->scale; sw->mTx = sw->mSlot->x; sw->mTy = sw->mSlot->y; if (w->id () == mSelectedWindow) sw->mRotation = mRotation; else sw->mRotation = 0.0; } } if (!mMoreAdjust && !mRotateAdjust) break; } } cScreen->preparePaint (msSinceLastPaint); } void StackswitchScreen::donePaint () { if (mState != StackswitchStateNone) { if (mMoreAdjust) cScreen->damageScreen (); else { if (mRotateAdjust) cScreen->damageScreen (); if (mState == StackswitchStateIn) mState = StackswitchStateNone; else if (mState == StackswitchStateOut) mState = StackswitchStateSwitching; } } cScreen->donePaint (); } bool StackswitchScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; } if (mState != StackswitchStateNone) { CompWindow *w; foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); if (sw->mSlot) { free (sw->mSlot); sw->mSlot = NULL; sw->mAdjust = true; } } mMoreAdjust = true; mState = StackswitchStateIn; cScreen->damageScreen (); if (!(state & CompAction::StateCancel) && mSelectedWindow) { w = screen->findWindow (mSelectedWindow); if (w) screen->sendWindowActivationRequest (w->id ()); } } if (action) action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton | CompAction::StateTermEdge)); return false; } bool StackswitchScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (screen->otherGrabExist ("stackswitch", 0)) return false; mCurrentMatch = optionGetWindowMatch (); CompMatch match = CompOption::getMatchOptionNamed (options, "match", CompMatch ()); mMatch = match; int count = countWindows (); if (count < 1) return false; if (!mGrabIndex) mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "stackswitch"); if (mGrabIndex) { mState = StackswitchStateOut; if (!createWindowList ()) return false; mSelectedWindow = mWindows[0]->id (); renderWindowTitle (); foreach (CompWindow *w, screen->windows ()) { STACKSWITCH_WINDOW (w); sw->mTx = w->x () - w->border ().left; sw->mTy = w->y () + w->height () + w->border ().bottom; } mMoreAdjust = true; cScreen->damageScreen (); } return true; } bool StackswitchScreen::doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, StackswitchType type) { bool ret = true; if ((mState == StackswitchStateNone) || (mState == StackswitchStateIn)) { if (mType == StackswitchTypeGroup) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { mType = StackswitchTypeGroup; mClientLeader = (w->clientLeader ()) ? w->clientLeader () : w->id (); ret = initiate (action, state, options); } } else { mType = type; ret = initiate (action, state, options); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } if (ret) switchToWindow (nextWindow); return ret; } void StackswitchScreen::windowRemove (Window id) { CompWindow *w; w = screen->findWindow (id); if (w) { bool inList = false; int i = 0; STACKSWITCH_WINDOW (w); if (mState == StackswitchStateNone || sw->isStackswitchable ()) return; Window selected = mSelectedWindow; while (i < mNWindows) { if (w->id () == mWindows[i]->id ()) { inList = true; if (w->id () == selected) { if (i < (mNWindows - 1)) selected = mWindows[i + 1]->id (); else selected = mWindows[0]->id (); mSelectedWindow = selected; } --mNWindows; for (int j = i; j < mNWindows; ++j) mWindows[j] = mWindows[j + 1]; } else ++i; } if (!inList) return; if (mNWindows == 0) { CompOption::Vector o; terminate (NULL, 0, o); return; } if (!mGrabIndex) return; if (updateWindowList ()) { mMoreAdjust = true; mState = StackswitchStateOut; cScreen->damageScreen (); } } } void StackswitchScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w && mGrabIndex && (w->id () == mSelectedWindow)) { renderWindowTitle (); cScreen->damageScreen (); } } break; case UnmapNotify: windowRemove (event->xunmap.window); break; case DestroyNotify: windowRemove (event->xdestroywindow.window); break; default: break; } } bool StackswitchWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; STACKSWITCH_SCREEN (screen); if (initial) { if (ss->mGrabIndex && isStackswitchable ()) { ss->addWindowToList (window); if (ss->updateWindowList ()) { mAdjust = true; ss->mMoreAdjust = true; ss->mState = StackswitchStateOut; ss->cScreen->damageScreen (); } } } else if (ss->mState == StackswitchStateSwitching && mSlot) { ss->cScreen->damageScreen (); status = true; } status |= cWindow->damageRect (initial, rect); return status; } StackswitchScreen::StackswitchScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mGrabIndex (0), mState (StackswitchStateNone), mMoreAdjust (false), mRotateAdjust (false), mPaintingSwitcher (false), mRVelocity (0.0f), mWindows (NULL), mDrawSlots (NULL), mWindowsSize (0), mNWindows (0), mClientLeader (None), mSelectedWindow (None) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); #define STACKTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&StackswitchScreen::func, \ this, _1, _2, _3)); #define STACKSWITCHBIND(opt, func, next, type) \ optionSet##opt##Initiate (boost::bind (&StackswitchScreen::func, \ this, _1, _2, _3, \ next, type)); STACKSWITCHBIND (NextKey, doSwitch, true, StackswitchTypeNormal); STACKSWITCHBIND (PrevKey, doSwitch, false, StackswitchTypeNormal); STACKSWITCHBIND (NextAllKey, doSwitch, true, StackswitchTypeAll); STACKSWITCHBIND (PrevAllKey, doSwitch, false, StackswitchTypeAll); STACKSWITCHBIND (NextGroupKey, doSwitch, true, StackswitchTypeGroup); STACKSWITCHBIND (PrevGroupKey, doSwitch, false, StackswitchTypeGroup); STACKTERMBIND (NextKey, terminate); STACKTERMBIND (PrevKey, terminate); STACKTERMBIND (NextAllKey, terminate); STACKTERMBIND (PrevAllKey, terminate); STACKTERMBIND (NextGroupKey, terminate); STACKTERMBIND (PrevGroupKey, terminate); STACKSWITCHBIND (NextButton, doSwitch, true, StackswitchTypeNormal); STACKSWITCHBIND (PrevButton, doSwitch, false, StackswitchTypeNormal); STACKSWITCHBIND (NextAllButton, doSwitch, true, StackswitchTypeAll); STACKSWITCHBIND (PrevAllButton, doSwitch, false, StackswitchTypeAll); STACKSWITCHBIND (NextGroupButton, doSwitch, true, StackswitchTypeGroup); STACKSWITCHBIND (PrevGroupButton, doSwitch, false, StackswitchTypeGroup); STACKTERMBIND (NextButton, terminate); STACKTERMBIND (PrevButton, terminate); STACKTERMBIND (NextAllButton, terminate); STACKTERMBIND (PrevAllButton, terminate); STACKTERMBIND (NextGroupButton, terminate); STACKTERMBIND (PrevGroupButton, terminate); } StackswitchScreen::~StackswitchScreen () { if (mWindows) free (mWindows); if (mDrawSlots) free (mDrawSlots); } StackswitchWindow::StackswitchWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mSlot (NULL), mXVelocity (0.0f), mYVelocity (0.0f), mScaleVelocity (0.0f), mRotVelocity (0.0f), mTx (0.0f), mTy (0.0f), mScale (1.0f), mRotation (0.0f), mAdjust (false) { CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); } StackswitchWindow::~StackswitchWindow () { if (mSlot) free (mSlot); } bool StackswitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("stackswitch", CompLogLevelWarn, "No compatible text plugin"\ " loaded"); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/fade/0000755000004100000410000000000013246301624013624 5ustar www-datawww-data./plugins/fade/CMakeLists.txt0000644000004100000410000000014713246301623016365 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(fade PLUGINDEPS composite opengl)./plugins/fade/src/0000755000004100000410000000000013246301624014413 5ustar www-datawww-data./plugins/fade/src/fade.cpp0000644000004100000410000002263213246301623016022 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "fade.h" #include COMPIZ_PLUGIN_20090315 (fade, FadePluginVTable); bool FadeScreen::bell (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (optionGetFullscreenVisualBell () && CompOption::getBoolOptionNamed (options, "fullscreen", false)) { foreach (CompWindow *w, screen->windows ()) { if (w->destroyed () || !w->isViewable ()) continue; FadeWindow::get (w)->dim (false); } cScreen->damageScreen (); } else { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) FadeWindow::get (w)->dim (true); } return true; } void FadeScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type == PropertyNotify && event->xproperty.atom == Atoms::winState) { CompWindow *w = screen->findWindow (event->xproperty.window); if (w && w->isViewable ()) { if (w->state () & CompWindowStateDisplayModalMask) FadeWindow::get (w)->addDisplayModal (); else FadeWindow::get (w)->removeDisplayModal (); } } } void FadeScreen::preparePaint (int msSinceLastPaint) { int steps = MAX (12, (msSinceLastPaint * OPAQUE) / fadeTime); unsigned int mode = optionGetFadeMode (); foreach (CompWindow *w, screen->windows ()) FadeWindow::get (w)->paintStep (mode, msSinceLastPaint, steps); cScreen->preparePaint (msSinceLastPaint); } void FadeWindow::dim (bool damage) { if (!cWindow->damaged ()) return; brightness = cWindow->brightness () / 2; if (damage) cWindow->addDamage (); } void FadeWindow::addDisplayModal () { if (!(window->state () & CompWindowStateDisplayModalMask) || dModal) return; dModal = true; ++fScreen->displayModals; if (fScreen->displayModals == 1) fScreen->cScreen->damageScreen (); } void FadeWindow::removeDisplayModal () { if (!dModal) return; dModal = false; --fScreen->displayModals; if (fScreen->displayModals == 0) fScreen->cScreen->damageScreen (); } void FadeWindow::paintStep (unsigned int mode, int msSinceLastPaint, int step) { if (mode == FadeOptions::FadeModeConstantSpeed) { steps = step; fadeTime = 0; } else if (mode == FadeOptions::FadeModeConstantTime) { if (fadeTime) { steps = 1; fadeTime -= msSinceLastPaint; if (fadeTime < 0) fadeTime = 0; } else steps = 0; } } void FadeWindow::windowNotify (CompWindowNotify n) { window->windowNotify (n); if (n == CompWindowNotifyAliveChanged) cWindow->addDamage (); } bool FadeWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (!GL::canDoSlightlySaturated) saturation = attrib.saturation; if (window->alive () && opacity == attrib.opacity && brightness == attrib.brightness && saturation == attrib.saturation && !fScreen->displayModals) return gWindow->glPaint (attrib, transform, region, mask); GLWindowPaintAttrib fAttrib (attrib); int mode = fScreen->optionGetFadeMode (); if (!window->alive () && fScreen->optionGetDimUnresponsive ()) { GLuint value = fScreen->optionGetUnresponsiveBrightness (); if (value != 100) fAttrib.brightness = fAttrib.brightness * value / 100; value = fScreen->optionGetUnresponsiveSaturation (); if (value != 100 && GL::canDoSlightlySaturated) fAttrib.saturation = fAttrib.saturation * value / 100; } else if (fScreen->displayModals && !dModal) { fAttrib.brightness = 0xa8a8; fAttrib.saturation = 0; } if (mode == FadeOptions::FadeModeConstantTime && (fAttrib.opacity != targetOpacity || fAttrib.brightness != targetBrightness || fAttrib.saturation != targetSaturation)) { fadeTime = fScreen->optionGetFadeTime (); steps = 1; opacityDiff = fAttrib.opacity - opacity; brightnessDiff = fAttrib.brightness - brightness; saturationDiff = fAttrib.saturation - saturation; targetOpacity = fAttrib.opacity; targetBrightness = fAttrib.brightness; targetSaturation = fAttrib.saturation; } if (steps) { GLint newOpacity = OPAQUE; GLint newBrightness = BRIGHT; GLint newSaturation = COLOR; if (mode == FadeOptions::FadeModeConstantSpeed) { newOpacity = opacity; if (fAttrib.opacity > opacity) newOpacity = MIN (opacity + steps, fAttrib.opacity); else if (fAttrib.opacity < opacity) newOpacity = MAX (opacity - steps, fAttrib.opacity); newBrightness = brightness; if (fAttrib.brightness > brightness) newBrightness = MIN (brightness + (steps / 12), fAttrib.brightness); else if (fAttrib.brightness < brightness) newBrightness = MAX (brightness - (steps / 12), fAttrib.brightness); newSaturation = saturation; if (fAttrib.saturation > saturation) newSaturation = MIN (saturation + (steps / 6), fAttrib.saturation); else if (fAttrib.saturation < saturation) newSaturation = MAX (saturation - (steps / 6), fAttrib.saturation); } else if (mode == FadeOptions::FadeModeConstantTime) { int totalFadeTime = fScreen->optionGetFadeTime (); if (totalFadeTime == 0) totalFadeTime = fadeTime; newOpacity = fAttrib.opacity - (opacityDiff * fadeTime / totalFadeTime); newBrightness = fAttrib.brightness - (brightnessDiff * fadeTime / totalFadeTime); newSaturation = fAttrib.saturation - (saturationDiff * fadeTime / totalFadeTime); } steps = 0; if (newOpacity > 0) { opacity = newOpacity; brightness = newBrightness; saturation = newSaturation; if (newOpacity != fAttrib.opacity || newBrightness != fAttrib.brightness || newSaturation != fAttrib.saturation) cWindow->addDamage (); } else opacity = 0; } fAttrib.opacity = opacity; fAttrib.brightness = brightness; fAttrib.saturation = saturation; return gWindow->glPaint (fAttrib, transform, region, mask); } FadeScreen::FadeScreen (CompScreen *s) : PluginClassHandler (s), displayModals (0), cScreen (CompositeScreen::get (s)) { fadeTime = 1000.0f / optionGetFadeSpeed (); optionSetVisualBellInitiate (boost::bind (&FadeScreen::bell, this, _1, _2, _3)); ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); } bool FadeScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = FadeOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case FadeOptions::FadeSpeed: fadeTime = 1000.0f / optionGetFadeSpeed (); break; case FadeOptions::WindowMatch: cScreen->damageScreen (); break; case FadeOptions::DimUnresponsive: foreach (CompWindow *w, screen->windows ()) w->windowNotifySetEnabled (FadeWindow::get (w), optionGetDimUnresponsive ()); break; default: break; } return rv; } FadeWindow::FadeWindow (CompWindow *w) : PluginClassHandler (w), fScreen (FadeScreen::get (screen)), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), opacity (cWindow->opacity ()), brightness (cWindow->brightness ()), saturation (cWindow->saturation ()), targetOpacity (opacity), targetBrightness (brightness), targetSaturation (saturation), dModal (false), steps (0), fadeTime (0), opacityDiff (0), brightnessDiff (0), saturationDiff (0) { if (window->isViewable ()) addDisplayModal (); WindowInterface::setHandler (window, false); GLWindowInterface::setHandler (gWindow); if (fScreen->optionGetDimUnresponsive ()) window->windowNotifySetEnabled (this, true); } FadeWindow::~FadeWindow () { removeDisplayModal (); } bool FadePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/fade/src/fade.h0000644000004100000410000000572513246301623015473 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include "fade_options.h" #include class FadeScreen : public ScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public FadeOptions { public: FadeScreen (CompScreen *s); bool setOption (const CompString &, CompOption::Value &); bool bell (CompAction *, CompAction::State state, CompOption::Vector &); void handleEvent (XEvent *); void preparePaint (int); int displayModals; int fadeTime; CompositeScreen *cScreen; }; class FadeWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: FadeWindow (CompWindow *w); ~FadeWindow (); void windowNotify (CompWindowNotify); void paintStep (unsigned int , int , int ); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void addDisplayModal (); void removeDisplayModal (); void dim (bool); private: FadeScreen *fScreen; CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; GLushort opacity; GLushort brightness; GLushort saturation; GLushort targetOpacity; GLushort targetBrightness; GLushort targetSaturation; bool dModal; int steps; int fadeTime; int opacityDiff; int brightnessDiff; int saturationDiff; }; class FadePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/fade/fade.xml.in0000644000004100000410000000500113246301623015645 0ustar www-datawww-data <_short>Fading Windows <_long>Fade in windows when mapped and fade out windows when unmapped Effects opengl decor staticswitcher cube scale ./plugins/workspacenames/0000755000004100000410000000000013246301624015747 5ustar www-datawww-data./plugins/workspacenames/CMakeLists.txt0000644000004100000410000000017013246301623020504 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (workspacenames PLUGINDEPS composite opengl text) ./plugins/workspacenames/src/0000755000004100000410000000000013246301624016536 5ustar www-datawww-data./plugins/workspacenames/src/workspacenames.cpp0000644000004100000410000001523613246301623022272 0ustar www-datawww-data/* * * Compiz workspace name display plugin * * workspacenames.cpp * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "workspacenames.h" CompString WSNamesScreen::getCurrentWSName () { CompString ret; CompOption::Value::Vector vpNumbers = optionGetViewports (); CompOption::Value::Vector names = optionGetNames (); int currentVp = screen->vp ().y () * screen->vpSize ().width () + screen->vp ().x () + 1; int listSize = MIN (vpNumbers.size (), names.size ()); for (int i = 0; i < listSize; ++i) { if (vpNumbers[i].i () == currentVp) return names[i].s (); } return ret; } void WSNamesScreen::renderNameText () { CompText::Attrib attrib; textData.clear (); CompString name = getCurrentWSName (); if (name.empty ()) return; /* 75% of the output device as maximum width */ attrib.maxWidth = screen->getCurrentOutputExtents ().width () * 3 / 4; attrib.maxHeight = 100; attrib.family = "Sans"; attrib.size = optionGetTextFontSize (); attrib.color[0] = optionGetFontColorRed (); attrib.color[1] = optionGetFontColorGreen (); attrib.color[2] = optionGetFontColorBlue (); attrib.color[3] = optionGetFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetBoldText ()) attrib.flags |= CompText::StyleBold; attrib.bgHMargin = 15; attrib.bgVMargin = 15; attrib.bgColor[0] = optionGetBackColorRed (); attrib.bgColor[1] = optionGetBackColorGreen (); attrib.bgColor[2] = optionGetBackColorBlue (); attrib.bgColor[3] = optionGetBackColorAlpha (); textData.renderText (name, attrib); } CompPoint WSNamesScreen::getTextPlacementPosition () { CompRect oe = screen->getCurrentOutputExtents (); float x = oe.centerX () - textData.getWidth () / 2; float y = 0; unsigned short verticalOffset = optionGetVerticalOffset (); switch (optionGetTextPlacement ()) { case WorkspacenamesOptions::TextPlacementCenteredOnScreen: y = oe.centerY () + textData.getHeight () / 2; break; case WorkspacenamesOptions::TextPlacementTopOfScreenMinusOffset: case WorkspacenamesOptions::TextPlacementBottomOfScreenPlusOffset: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTextPlacement () == WorkspacenamesOptions::TextPlacementTopOfScreenMinusOffset) y = oe.y1 () + workArea.y () + verticalOffset + textData.getHeight (); else /* TextPlacementBottomOfScreenPlusOffset */ y = oe.y1 () + workArea.y () + workArea.height () - verticalOffset; } break; default: return CompPoint (floor (x), oe.centerY () - textData.getHeight () / 2); break; } return CompPoint (floor (x), floor (y)); } void WSNamesScreen::damageTextArea () { const CompPoint pos (getTextPlacementPosition ()); /* The placement position is from the lower corner, so we * need to move it back up by height */ CompRect area (pos.x (), pos.y () - textData.getHeight (), textData.getWidth (), textData.getHeight ()); cScreen->damageRegion (area); } void WSNamesScreen::drawText (const GLMatrix &matrix) { GLfloat alpha = 0.0f; /* assign y (for the lower corner!) according to the setting */ const CompPoint p = getTextPlacementPosition (); if (timer) alpha = timer / (optionGetFadeTime () * 1000.0f); else if (timeoutHandle.active ()) alpha = 1.0f; textData.draw (matrix, p.x (), p.y (), alpha); } bool WSNamesScreen::shouldDrawText () { return textData.getWidth () && textData.getHeight (); } bool WSNamesScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (shouldDrawText ()) { GLMatrix sTransform (transform); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); drawText (sTransform); } return status; } void WSNamesScreen::preparePaint (int msSinceLastPaint) { if (timer) { timer -= msSinceLastPaint; timer = MAX (timer, 0); } cScreen->preparePaint (msSinceLastPaint); } void WSNamesScreen::donePaint () { /* Only damage when the */ if (shouldDrawText ()) damageTextArea (); cScreen->donePaint (); /* Clear text data if done with fadeout */ if (!timer && !timeoutHandle.active ()) textData.clear (); } bool WSNamesScreen::hideTimeout () { timer = optionGetFadeTime () * 1000; /* Clear immediately if there is no fadeout */ if (!timer) textData.clear (); damageTextArea (); timeoutHandle.stop (); return false; } void WSNamesScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type != PropertyNotify) return; if (event->xproperty.atom == Atoms::desktopViewport) { int timeout = optionGetDisplayTime () * 1000; timer = 0; if (timeoutHandle.active ()) timeoutHandle.stop (); renderNameText (); timeoutHandle.start (timeout, timeout + 200); damageTextArea (); } } WSNamesScreen::WSNamesScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), timer (0) { ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); timeoutHandle.start (boost::bind (&WSNamesScreen::hideTimeout, this), 0, 0); } WSNamesScreen::~WSNamesScreen () { } bool WorkspacenamesPluginVTable::init () { if (!CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) compLogMessage ("workspacenames", CompLogLevelWarn, "No compatible text plugin loaded"); if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/workspacenames/src/workspacenames.h0000644000004100000410000000407113246301623021732 0ustar www-datawww-data/* * * Compiz workspace name display plugin * * workspacenames.h * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include #include "workspacenames_options.h" class WSNamesScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public WorkspacenamesOptions { public: WSNamesScreen (CompScreen *screen); ~WSNamesScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompText textData; CompTimer timeoutHandle; int timer; CompString getCurrentWSName (); void renderNameText (); void drawText (const GLMatrix &); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void preparePaint (int ms); void donePaint (); bool hideTimeout (); void handleEvent (XEvent *); CompPoint getTextPlacementPosition (); void damageTextArea (); private: bool shouldDrawText (); }; class WorkspacenamesPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; COMPIZ_PLUGIN_20090315 (workspacenames, WorkspacenamesPluginVTable); ./plugins/workspacenames/workspacenames.xml.in0000644000004100000410000000741213246301623022123 0ustar www-datawww-data <_short>Workspace Naming <_long>Assign names to viewports and display them upon viewport switches Window Management opengl composite text opengl text <_short>Names <_short>Workspace Names <_short>Appearance <_short>Text Display <_short>Colors ./plugins/thumbnail/0000755000004100000410000000000013246301624014710 5ustar www-datawww-data./plugins/thumbnail/CMakeLists.txt0000644000004100000410000000017513246301623017452 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (thumbnail PLUGINDEPS composite opengl text mousepoll) ./plugins/thumbnail/src/0000755000004100000410000000000013246301624015477 5ustar www-datawww-data./plugins/thumbnail/src/thumbnail.h0000644000004100000410000001017513246301623017636 0ustar www-datawww-data/* * * Compiz thumbnail plugin * * thumbnail.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * Based on thumbnail.c: * Copyright : (C) 2007 Stjepan Glavina * E-mail : stjepang@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* TODO: * - Make Thumbnail it's own class with methods * - Make a Thumbnail container class - this is where the window / glow texture is drawn * - Set KDE Thumbnail property * - Set Compiz Thumbnail property (for plugins like peek) */ #include #include #include #include #include #include #include #include "thumbnail_options.h" #define THUMB_SCREEN(s) \ ThumbScreen *ts = ThumbScreen::get (s) #define THUMB_WINDOW(w) \ ThumbWindow *tw = ThumbWindow::get (w) bool textPluginLoaded; typedef struct _Thumbnail { int x; int y; int width; int height; float scale; float opacity; int offset; CompWindow *win; CompWindow *dock; CompText *text; bool textValid; } Thumbnail; class ThumbScreen: public PluginClassHandler , public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface, public ThumbnailOptions { public: ThumbScreen (CompScreen *sceen); ~ThumbScreen (); void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void freeThumbText (Thumbnail *t); void renderThumbText (Thumbnail *t, bool freeThumb); void damageThumbRegion (Thumbnail *t); void thumbUpdateThumbnail (); bool thumbShowThumbnail (); bool checkPosition (CompWindow *w); void positionUpdate (const CompPoint &pos); void paintTexture (const GLMatrix &transform, GLushort *color, int wx, int wy, int width, int height, int off); void thumbPaintThumb (Thumbnail *t, const GLMatrix *transform); GLScreen *gScreen; CompositeScreen *cScreen; CompWindow *dock; CompWindow *pointedWin; bool showingThumb; Thumbnail thumb; Thumbnail oldThumb; bool painted; CompTimer displayTimeout; GLTexture::List glowTexture; GLTexture::List windowTexture; int x; int y; MousePoller poller; }; class ThumbWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: ThumbWindow (CompWindow *window); ~ThumbWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask); void resizeNotify (int dx, int dy, int dwidth, int dheight); bool damageRect (bool initial, const CompRect &rect); }; class ThumbPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/thumbnail/src/thumbnail.cpp0000644000004100000410000007120013246301623020165 0ustar www-datawww-data/* * * Compiz thumbnail plugin * * thumbnail.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * Based on thumbnail.c: * Copyright : (C) 2007 Stjepan Glavina * E-mail : stjepang@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "thumbnail.h" #include "thumbnail_tex.h" COMPIZ_PLUGIN_20090315 (thumbnail, ThumbPluginVTable); void ThumbScreen::freeThumbText (Thumbnail *t) { if (!t->text) return; delete t->text; t->text = NULL; } void ThumbScreen::renderThumbText (Thumbnail *t, bool freeThumb) { if (!textPluginLoaded) return; if (freeThumb || !t->text) { freeThumbText (t); t->text = new CompText (); } CompText::Attrib tA; tA.maxWidth = t->width; tA.maxHeight = 100; // text background tA.bgHMargin = 4; tA.bgVMargin = 4; tA.bgColor[0] = optionGetFontBackgroundColorRed (); tA.bgColor[1] = optionGetFontBackgroundColorGreen (); tA.bgColor[2] = optionGetFontBackgroundColorBlue (); tA.bgColor[3] = optionGetFontBackgroundColorAlpha (); tA.size = optionGetFontSize (); tA.color[0] = optionGetFontColorRed (); tA.color[1] = optionGetFontColorGreen (); tA.color[2] = optionGetFontColorBlue (); tA.color[3] = optionGetFontColorAlpha (); tA.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetFontBold ()) tA.flags |= CompText::StyleBold; tA.family = "Sans"; t->textValid = t->text->renderWindowTitle (t->win->id (), false, tA); } void ThumbScreen::damageThumbRegion (Thumbnail *t) { int x = t->x - t->offset; int y = t->y - t->offset; int width = t->width + t->offset * 2; int height = t->height + t->offset * 2; CompRect rect (x, y, width, height); if (t->text) rect.setHeight (rect.height () + t->text->getHeight () + optionGetTextDistance ()); CompRegion region (rect); cScreen->damageRegion (region); } #define GET_DISTANCE(a,b) \ (sqrt((((a)[0] - (b)[0]) * ((a)[0] - (b)[0])) + \ (((a)[1] - (b)[1]) * ((a)[1] - (b)[1])))) void ThumbScreen::thumbUpdateThumbnail () { if (thumb.win == pointedWin || (thumb.opacity && oldThumb.opacity)) return; if (thumb.win) damageThumbRegion (&thumb); freeThumbText (&oldThumb); ThumbWindow *tw; if (oldThumb.win) { tw = ThumbWindow::get (oldThumb.win); /* Disable painting on the old thumb */ tw->cWindow->damageRectSetEnabled (tw, false); tw->gWindow->glPaintSetEnabled (tw, false); tw->window->resizeNotifySetEnabled (tw, false); } oldThumb = thumb; thumb.text = NULL; thumb.win = pointedWin; thumb.dock = dock; if (!thumb.win || !dock) { thumb.win = NULL; thumb.dock = NULL; return; } CompWindow *w = thumb.win; tw = ThumbWindow::get (w); tw->cWindow->damageRectSetEnabled (tw, true); tw->gWindow->glPaintSetEnabled (tw, true); tw->window->resizeNotifySetEnabled (tw, true); float maxSize = optionGetThumbSize (); double scale = 1.0; int winWidth = w->width () + w->border ().left + w->border ().right; int winHeight = w->height () + w->border ().top + w->border ().bottom; /* do we need to scale the window down? */ if (winWidth > maxSize || winHeight > maxSize) { if (winWidth >= winHeight) scale = maxSize / winWidth; else scale = maxSize / winHeight; } thumb.width = winWidth * scale; thumb.height = winHeight * scale; thumb.scale = scale; if (optionGetTitleEnabled ()) renderThumbText (&thumb, false); else freeThumbText (&thumb); int igMidPoint[2], tMidPoint[2]; igMidPoint[0] = w->iconGeometry ().centerX (); igMidPoint[1] = w->iconGeometry ().centerY (); int off = optionGetBorder (); int oDev = screen->outputDeviceForPoint (igMidPoint[0], igMidPoint[1]); CompRect oGeom; if (screen->outputDevs ().size () == 1 || (unsigned int) oDev > screen->outputDevs ().size ()) oGeom.setGeometry (0, 0, screen->width (), screen->height ()); else oGeom = screen->outputDevs ()[oDev]; int tHeight = thumb.height; int tWidth = thumb.width; if (thumb.text) tHeight += thumb.text->getHeight () + optionGetTextDistance (); int halfTWidth = tWidth / 2; int halfTHeight = tHeight / 2; int tPos[2], tmpPos[2]; // failsave position tPos[0] = igMidPoint[0] - halfTWidth; if (w->iconGeometry ().y () - tHeight >= 0) tPos[1] = w->iconGeometry ().y () - tHeight; else tPos[1] = w->iconGeometry ().y () + w->iconGeometry ().height (); // above tmpPos[0] = igMidPoint[0] - halfTWidth; if (tmpPos[0] - off < oGeom.x1 ()) tmpPos[0] = oGeom.x1 () + off; if (tmpPos[0] + off + tWidth > oGeom.x2 ()) { if (tWidth + (2 * off) <= oGeom.width ()) tmpPos[0] = oGeom.x2 () - tWidth - off; else tmpPos[0] = oGeom.x1 () + off; } tMidPoint[0] = tmpPos[0] + halfTWidth; int dockX = dock->x () - dock->border ().left; int dockY = dock->y () - dock->border ().top; int dockWidth = dock->width () + dock->border ().left + dock->border ().right; int dockHeight = dock->height () + dock->border ().top + dock->border ().bottom; tmpPos[1] = dockY - tHeight - off; tMidPoint[1] = tmpPos[1] + halfTHeight; float distance = 1000000; if (tmpPos[1] > oGeom.y1 ()) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; distance = GET_DISTANCE (igMidPoint, tMidPoint); } // below tmpPos[1] = dockY + dockHeight + off; tMidPoint[1] = tmpPos[1] + halfTHeight; if (tmpPos[1] + tHeight + off < oGeom.y2 () && GET_DISTANCE (igMidPoint, tMidPoint) < distance) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; distance = GET_DISTANCE (igMidPoint, tMidPoint); } // left tmpPos[1] = igMidPoint[1] - halfTHeight; if (tmpPos[1] - off < oGeom.y1 ()) tmpPos[1] = oGeom.y1 () + off; if (tmpPos[1] + off + tHeight > oGeom.y2 ()) { if (tHeight + (2 * off) <= oGeom.height ()) tmpPos[1] = oGeom.y2 () - tHeight - off; else tmpPos[1] = oGeom.y1 () + off; } tMidPoint[1] = tmpPos[1] + halfTHeight; tmpPos[0] = dockX - tWidth - off; tMidPoint[0] = tmpPos[0] + halfTWidth; if (tmpPos[0] > oGeom.x1 () && GET_DISTANCE (igMidPoint, tMidPoint) < distance) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; distance = GET_DISTANCE (igMidPoint, tMidPoint); } // right tmpPos[0] = dockX + dockWidth + off; tMidPoint[0] = tmpPos[0] + halfTWidth; if (tmpPos[0] + tWidth + off < oGeom.x2 () && GET_DISTANCE (igMidPoint, tMidPoint) < distance) { tPos[0] = tmpPos[0]; tPos[1] = tmpPos[1]; } thumb.x = tPos[0]; thumb.y = tPos[1]; thumb.offset = off; thumb.opacity = 0.0; damageThumbRegion (&thumb); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); } bool ThumbScreen::thumbShowThumbnail () { showingThumb = true; thumbUpdateThumbnail (); damageThumbRegion (&thumb); return false; } bool ThumbScreen::checkPosition (CompWindow *w) { if (optionGetCurrentViewport ()) if (w->serverX () >= screen->width () || w->serverX () + w->serverWidth () <= 0 || w->serverY () >= screen->height () || w->serverY () + w->serverHeight () <= 0) return false; return true; } void ThumbScreen::positionUpdate (const CompPoint &p) { CompWindow *found = NULL; foreach (CompWindow *cw, screen->windows ()) { THUMB_WINDOW (cw); if (cw->destroyed () || cw->iconGeometry ().isEmpty () || !cw->isMapped () || cw->state () & CompWindowStateSkipTaskbarMask || cw->state () & CompWindowStateSkipPagerMask || !cw->managed () || !tw->cWindow->pixmap ()) continue; if (cw->iconGeometry ().contains (p) && checkPosition (cw)) { found = cw; break; } } if (found) { int showDelay = optionGetShowDelay (); if (!showingThumb && !(thumb.opacity != 0.0 && thumb.win == found)) { if (displayTimeout.active ()) { if (pointedWin != found) { displayTimeout.stop (); displayTimeout.start (boost::bind (&ThumbScreen::thumbShowThumbnail, this), showDelay, showDelay + 500); } } else { displayTimeout.stop (); displayTimeout.start (boost::bind (&ThumbScreen::thumbShowThumbnail, this), showDelay, showDelay + 500); } } pointedWin = found; thumbUpdateThumbnail (); } else { if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } } void ThumbWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { THUMB_SCREEN (screen); ts->thumbUpdateThumbnail (); window->resizeNotify (dx, dy, dwidth, dheight); } void ThumbScreen::handleEvent (XEvent *event) { screen->handleEvent (event); CompWindow *w; switch (event->type) { case PropertyNotify: if (event->xproperty.atom == Atoms::wmName) { w = screen->findWindow (event->xproperty.window); if (w && thumb.win == w && optionGetTitleEnabled ()) renderThumbText (&thumb, true); } break; case ButtonPress: { if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; } break; case EnterNotify: w = screen->findWindow (event->xcrossing.window); if (w) { if (w->wmType () & CompWindowTypeDockMask) { if (dock != w) { dock = w; if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; } if (!poller.active ()) poller.start (); } else { dock = NULL; if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; if (poller.active ()) poller.stop (); } } break; case LeaveNotify: w = screen->findWindow (event->xcrossing.window); if (w && (w->wmType () & CompWindowTypeDockMask)) { dock = NULL; if (displayTimeout.active ()) displayTimeout.stop (); pointedWin = NULL; showingThumb = false; cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); if (poller.active ()) poller.stop (); } break; default: break; } } void ThumbScreen::paintTexture (const GLMatrix &transform, GLushort *color, int wx, int wy, int width, int height, int off) { GLfloat textureData[8]; GLfloat vertexData[12]; GLfloat wxPlusWidth = wx + width; GLfloat wyPlusHeight = wy + height; GLfloat wxPlusWPlusOff = wxPlusWidth + off; GLfloat wyPlusHPlusOff = wyPlusHeight + off; GLfloat wxMinusOff = wx - off; GLfloat wyMinusOff = wy - off; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; vertexData[0] = wx; vertexData[1] = wy; vertexData[2] = 0; vertexData[3] = wx; vertexData[4] = wyPlusHeight; vertexData[5] = 0; vertexData[6] = wxPlusWidth; vertexData[7] = wy; vertexData[8] = 0; vertexData[9] = wxPlusWidth; vertexData[10] = wyPlusHeight; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 1, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 0; textureData[1] = 0; textureData[2] = 0; textureData[3] = 1; textureData[4] = 1; textureData[5] = 0; textureData[6] = 1; textureData[7] = 1; vertexData[0] = wxMinusOff; vertexData[1] = wyMinusOff; vertexData[2] = 0; vertexData[3] = wxMinusOff; vertexData[4] = wy; vertexData[5] = 0; vertexData[6] = wx; vertexData[7] = wyMinusOff; vertexData[8] = 0; vertexData[9] = wx; vertexData[10] = wy; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 0; textureData[2] = 1; textureData[3] = 1; textureData[4] = 0; textureData[5] = 0; textureData[6] = 0; textureData[7] = 1; vertexData[0] = wxPlusWidth; vertexData[1] = wyMinusOff; vertexData[2] = 0; vertexData[3] = wxPlusWidth; vertexData[4] = wy; vertexData[5] = 0; vertexData[6] = wxPlusWPlusOff; vertexData[7] = wyMinusOff; vertexData[8] = 0; vertexData[9] = wxPlusWPlusOff; vertexData[10] = wy; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 0; textureData[1] = 1; textureData[2] = 0; textureData[3] = 0; textureData[4] = 1; textureData[5] = 1; textureData[6] = 1; textureData[7] = 0; vertexData[0] = wxMinusOff; vertexData[1] = wyPlusHeight; vertexData[2] = 0; vertexData[3] = wxMinusOff; vertexData[4] = wyPlusHPlusOff; vertexData[5] = 0; vertexData[6] = wx; vertexData[7] = wyPlusHeight; vertexData[8] = 0; vertexData[9] = wx; vertexData[10] = wyPlusHPlusOff; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; textureData[2] = 1; textureData[3] = 0; textureData[4] = 0; textureData[5] = 1; textureData[6] = 0; textureData[7] = 0; vertexData[0] = wxPlusWidth; vertexData[1] = wyPlusHeight; vertexData[2] = 0; vertexData[3] = wxPlusWidth; vertexData[4] = wyPlusHPlusOff; vertexData[5] = 0; vertexData[6] = wxPlusWPlusOff; vertexData[7] = wyPlusHeight; vertexData[8] = 0; vertexData[9] = wxPlusWPlusOff; vertexData[10] = wyPlusHPlusOff; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 0; textureData[2] = 1; textureData[3] = 1; textureData[4] = 1; textureData[5] = 0; textureData[6] = 1; textureData[7] = 1; vertexData[0] = wx; vertexData[1] = wyMinusOff; vertexData[2] = 0; vertexData[3] = wx; vertexData[4] = wy; vertexData[5] = 0; vertexData[6] = wxPlusWidth; vertexData[7] = wyMinusOff; vertexData[8] = 0; vertexData[9] = wxPlusWidth; vertexData[10] = wy; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; textureData[2] = 1; textureData[3] = 0; textureData[4] = 1; textureData[5] = 1; textureData[6] = 1; textureData[7] = 0; vertexData[0] = wx; vertexData[1] = wyPlusHeight; vertexData[2] = 0; vertexData[3] = wx; vertexData[4] = wyPlusHPlusOff; vertexData[5] = 0; vertexData[6] = wxPlusWidth; vertexData[7] = wyPlusHeight; vertexData[8] = 0; vertexData[9] = wxPlusWidth; vertexData[10] = wyPlusHPlusOff; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 0; textureData[1] = 1; textureData[2] = 0; textureData[3] = 1; textureData[4] = 1; textureData[5] = 1; textureData[6] = 1; textureData[7] = 1; vertexData[0] = wxMinusOff; vertexData[1] = wy; vertexData[2] = 0; vertexData[3] = wxMinusOff; vertexData[4] = wyPlusHeight; vertexData[5] = 0; vertexData[6] = wx; vertexData[7] = wy; vertexData[8] = 0; vertexData[9] = wx; vertexData[10] = wyPlusHeight; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = 1; textureData[1] = 1; textureData[2] = 1; textureData[3] = 1; textureData[4] = 0; textureData[5] = 1; textureData[6] = 0; textureData[7] = 1; vertexData[0] = wxPlusWidth; vertexData[1] = wy; vertexData[2] = 0; vertexData[3] = wxPlusWidth; vertexData[4] = wyPlusHeight; vertexData[5] = 0; vertexData[6] = wxPlusWPlusOff; vertexData[7] = wy; vertexData[8] = 0; vertexData[9] = wxPlusWPlusOff; vertexData[10] = wyPlusHeight; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addColors (1, color); streamingBuffer->end (); streamingBuffer->render (transform); } void ThumbScreen::thumbPaintThumb (Thumbnail *t, const GLMatrix *transform) { CompWindow *w = t->win; if (!w) return; GLWindow *gWindow = GLWindow::get (w); GLushort color[4]; int wx = t->x; int wy = t->y; GLWindowPaintAttrib sAttrib; unsigned int mask = PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK; sAttrib = gWindow->paintAttrib (); /* Wrap drawWindowGeometry to make sure the general drawWindowGeometry function is used */ unsigned int addWindowGeometryIndex = gWindow->glAddGeometryGetCurrentIndex (); if (!gWindow->textures ().empty ()) { GLMatrix wTransform (*transform); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* just enable blending if it is currently disabled */ if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); int off = t->offset; float backheight = t->height; // background/glow height float width = t->width; if (optionGetWindowLike ()) { color[0] = 1; color[1] = 1; color[2] = 1; color[3] = t->opacity * 65535; foreach (GLTexture *tex, windowTexture) { tex->enable (GLTexture::Good); paintTexture (*transform, color, wx, wy, width, backheight, off); tex->disable (); } } else { color[0] = optionGetThumbColorRed (); color[1] = optionGetThumbColorGreen (); color[2] = optionGetThumbColorBlue (); color[3] = optionGetThumbColorAlpha () * t->opacity; foreach (GLTexture *tex, glowTexture) { tex->enable (GLTexture::Good); paintTexture (*transform, color, wx, wy, width, backheight, off); tex->disable (); } } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); /* we disable blending only, if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); if (t->text) { float ox = 0.0f; float height = backheight + t->text->getHeight () + optionGetTextDistance (); if (t->text->getWidth () < width) ox = (width - t->text->getWidth ()) / 2.0; t->text->draw (*transform, wx + ox, wy + height, t->opacity); } gScreen->setTexEnvMode (GL_REPLACE); sAttrib.opacity *= t->opacity; sAttrib.yScale = t->scale; sAttrib.xScale = t->scale; sAttrib.xTranslate = wx - w->x () + w->border ().left * sAttrib.xScale; sAttrib.yTranslate = wy - w->y () + w->border ().top * sAttrib.yScale; GLenum filter = gScreen->textureFilter (); /* we just need to change the texture filter, if * thumbnail mipmapping is enabled */ if (optionGetMipmap ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); wTransform.translate (w->x (), w->y (), 0.0f); wTransform.scale (sAttrib.xScale, sAttrib.yScale, 1.0f); wTransform.translate (sAttrib.xTranslate / sAttrib.xScale - w->x (), sAttrib.yTranslate / sAttrib.yScale - w->y (), 0.0f); /* XXX: replacing the addWindowGeometry function like this is very ugly but necessary until the vertex stage has been made fully pluggable. */ gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); gWindow->glDraw (wTransform, sAttrib, CompRegion::infinite (), mask); gScreen->setTextureFilter (filter); } gWindow->glAddGeometrySetCurrentIndex (addWindowGeometryIndex); } /* From here onwards */ void ThumbScreen::preparePaint (int ms) { float val = ms; val /= 1000; val /= optionGetFadeSpeed (); /*if (screen->otherGrabExist ("")) // shouldn't there be a s->grabs.empty () or something? { dock = NULL; if (displayTimeout.active ()) { displayTimeout.stop (); } pointedWin = 0; showingThumb = false; }*/ if (showingThumb && thumb.win == pointedWin) thumb.opacity = MIN (1.0, thumb.opacity + val); if (!showingThumb || thumb.win != pointedWin) { thumb.opacity = MAX (0.0, thumb.opacity - val); if (thumb.opacity == 0.0) thumb.win = NULL; } if (oldThumb.opacity > 0.0f) { oldThumb.opacity = MAX (0.0, oldThumb.opacity - val); if (oldThumb.opacity == 0.0) { damageThumbRegion (&oldThumb); freeThumbText (&oldThumb); oldThumb.win = NULL; } } if (oldThumb.win == NULL && thumb.win == NULL) { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } cScreen->preparePaint (ms); } void ThumbScreen::donePaint () { std::vector damageThumbs; if (thumb.opacity) damageThumbs.push_back (&thumb); if (oldThumb.opacity) damageThumbs.push_back (&oldThumb); if (!damageThumbs.empty ()) { foreach (Thumbnail *t, damageThumbs) damageThumbRegion (t); } else { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } cScreen->donePaint (); } bool ThumbScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { unsigned int newMask = mask; painted = false; x = screen->vp ().x (); y = screen->vp ().y (); if ((oldThumb.opacity > 0.0 && oldThumb.win) || (thumb.opacity > 0.0 && thumb.win)) newMask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; bool status = gScreen->glPaintOutput (attrib, transform, region, output, newMask); if (optionGetAlwaysOnTop () && !painted) { if (oldThumb.opacity > 0.0 && oldThumb.win) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); thumbPaintThumb (&oldThumb, &sTransform); } if (thumb.opacity > 0.0 && thumb.win) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); thumbPaintThumb (&thumb, &sTransform); } } return status; } void ThumbScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); if (optionGetAlwaysOnTop () && x == screen->vp ().x () && y == screen->vp ().y ()) { painted = true; if (oldThumb.opacity && oldThumb.win) { GLMatrix sTransform = transform; gScreen->glApplyTransform (attrib, output, &sTransform); sTransform.toScreenSpace(output, -attrib.zTranslate); thumbPaintThumb (&oldThumb, &sTransform); } if (thumb.opacity && thumb.win) { GLMatrix sTransform = transform; gScreen->glApplyTransform (attrib, output, &sTransform); sTransform.toScreenSpace(output, -attrib.zTranslate); thumbPaintThumb (&thumb, &sTransform); } } } bool ThumbWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { THUMB_SCREEN (screen); bool status = gWindow->glPaint (attrib, transform, region, mask); if (!ts->optionGetAlwaysOnTop () && ts->x == screen->vp ().x () && ts->y == screen->vp ().y ()) { GLMatrix sTransform = transform; if (ts->oldThumb.opacity && ts->oldThumb.win && ts->oldThumb.dock == window) ts->thumbPaintThumb (&ts->oldThumb, &sTransform); if (ts->thumb.opacity && ts->thumb.win && ts->thumb.dock == window) ts->thumbPaintThumb (&ts->thumb, &sTransform); } return status; } bool ThumbWindow::damageRect (bool initial, const CompRect &rect) { THUMB_SCREEN (screen); if (ts->thumb.win == window && ts->thumb.opacity) ts->damageThumbRegion (&ts->thumb); if (ts->oldThumb.win == window && ts->oldThumb.opacity) ts->damageThumbRegion (&ts->oldThumb); return cWindow->damageRect (initial, rect); } ThumbScreen::ThumbScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)), dock (NULL), pointedWin (NULL), showingThumb (false), painted (false), glowTexture (GLTexture::imageDataToTexture (glowTex, CompSize (32, 32), GL_RGBA, GL_UNSIGNED_BYTE)), windowTexture (GLTexture::imageDataToTexture (windowTex, CompSize (32, 32), GL_RGBA, GL_UNSIGNED_BYTE)), x (0), y (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); thumb.win = NULL; oldThumb.win = NULL; thumb.text = NULL; oldThumb.text = NULL; thumb.opacity = 0.0f; oldThumb.opacity = 0.0f; poller.setCallback (boost::bind (&ThumbScreen::positionUpdate, this, _1)); } ThumbScreen::~ThumbScreen () { poller.stop (); displayTimeout.stop (); freeThumbText (&thumb); freeThumbText (&oldThumb); } ThumbWindow::ThumbWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } ThumbWindow::~ThumbWindow () { THUMB_SCREEN (screen); if (ts->thumb.win == window) { ts->damageThumbRegion (&ts->thumb); ts->thumb.win = NULL; ts->thumb.opacity = 0; } if (ts->oldThumb.win == window) { ts->damageThumbRegion (&ts->oldThumb); ts->oldThumb.win = NULL; ts->oldThumb.opacity = 0; } if (ts->pointedWin == window) ts->pointedWin = NULL; } bool ThumbPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textPluginLoaded = true; else textPluginLoaded = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } ./plugins/thumbnail/src/thumbnail_tex.h0000644000004100000410000005607613246301623020530 0ustar www-datawww-data#ifndef _THUMBNAIL_TEX_H #define _THUMBNAIL_TEX_H static char glowTex[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\4\377\377\377\5\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377" "\13\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377" "\23\377\377\377\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377" "\377\377\7\377\377\377\11\377\377\377\12\377\377\377\15\377\377\377\17\377" "\377\377\21\377\377\377\23\377\377\377\25\377\377\377\27\376\376\376\31\377" "\377\377\33\377\377\377\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\15\377\377\377\17\377\377\377\22\377" "\377\377\25\377\377\377\30\377\377\377\33\377\377\377\36\377\377\377!\377" "\377\377#\377\377\377%\377\377\377'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\2\377\377\377\2\377\377\377\4\377\377\377\5\377\377\377\7\377" "\377\377\11\377\377\377\14\377\377\377\17\377\377\377\22\377\377\377\26\376" "\376\376\31\376\376\376\35\377\377\377!\377\377\377%\377\377\377)\377\377" "\377,\377\377\377/\376\376\3762\377\377\3774\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377\377\377\10" "\377\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\376\376\376" "\31\377\377\377\36\377\377\377\"\377\377\377'\377\377\377,\377\377\3771\376" "\376\3765\376\376\376:\377\377\377=\377\377\377A\377\377\377D\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377\377" "\377\10\377\377\377\13\377\377\377\16\377\377\377\22\377\377\377\27\377\377" "\377\34\377\377\377!\377\377\377'\377\377\377-\377\377\3773\377\377\3779" "\377\377\377?\377\377\377D\377\377\377I\377\377\377M\377\377\377Q\377\377" "\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377" "\5\377\377\377\10\377\377\377\13\377\377\377\17\377\377\377\23\377\377\377" "\30\377\377\377\36\377\377\377$\377\377\377+\376\376\3762\377\377\3779\377" "\377\377@\377\377\377G\377\377\377N\377\377\377T\377\377\377Z\377\377\377" "_\377\377\377c\376\376\376g\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\3\377\377\377\5\377\377\377\10\377\377\377\13\377\377\377\17\377\377\377" "\23\376\376\376\31\377\377\377\37\377\377\377'\377\377\377.\377\377\3776" "\377\377\377?\377\377\377G\377\377\377P\377\377\377X\377\377\377_\377\377" "\377f\377\377\377l\377\377\377r\377\377\377w\377\377\377{\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\7\377\377\377\12\377\377\377\16" "\377\377\377\23\376\376\376\31\377\377\377\40\377\377\377'\377\377\3770\377" "\377\3779\377\377\377C\377\377\377L\377\377\377V\377\377\377_\377\377\377" "h\377\377\377q\377\377\377x\377\377\377\177\377\377\377\205\377\377\377\212" "\377\377\377\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\3\377\377\377\4\377\377\377\6\377" "\377\377\11\377\377\377\15\377\377\377\22\377\377\377\30\377\377\377\37\377" "\377\377(\377\377\3771\377\377\377;\377\377\377E\377\377\377P\376\376\376" "[\377\377\377f\377\377\377p\377\377\377z\377\377\377\202\377\377\377\212" "\377\377\377\221\377\377\377\227\377\377\377\235\377\377\377\241\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\14\377\377\377" "\21\377\377\377\27\377\377\377\36\377\377\377'\377\377\3770\377\377\377;" "\377\377\377F\377\377\377R\377\377\377^\376\376\376j\377\377\377v\377\377" "\377\200\377\377\377\213\377\377\377\224\377\377\377\234\377\377\377\243" "\377\377\377\251\377\377\377\256\377\377\377\262\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\3\377\377" "\377\5\377\377\377\7\377\377\377\13\377\377\377\17\377\377\377\25\377\377" "\377\34\377\377\377$\377\377\377.\377\377\3779\377\377\377E\377\377\377R" "\377\377\377_\377\377\377l\376\376\376y\377\377\377\205\377\377\377\221\377" "\377\377\233\377\377\377\244\377\377\377\255\377\377\377\264\376\376\376" "\271\377\377\377\276\377\377\377\302\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377\6\377" "\377\377\11\377\377\377\15\377\377\377\22\376\376\376\31\377\377\377!\377" "\377\377+\377\377\3776\377\377\377C\377\377\377P\377\377\377^\377\377\377" "l\377\377\377z\377\377\377\210\377\377\377\224\377\377\377\240\377\377\377" "\253\377\377\377\264\377\377\377\274\377\377\377\302\376\376\376\310\377" "\377\377\314\377\377\377\320\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\3\377\377\377\4\377\377\377\7\377\377" "\377\13\377\377\377\20\377\377\377\26\377\377\377\36\377\377\377'\376\376" "\3762\377\377\377?\377\377\377L\376\376\376[\376\376\376j\376\376\376y\377" "\377\377\210\377\377\377\226\377\377\377\243\377\377\377\256\376\376\376" "\271\377\377\377\301\377\377\377\311\376\376\376\317\376\376\376\324\377" "\377\377\330\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\11\377\377" "\377\15\377\377\377\22\377\377\377\32\377\377\377#\377\377\377-\376\376\376" ":\377\377\377G\377\377\377V\377\377\377f\377\377\377v\377\377\377\205\377" "\377\377\224\377\377\377\243\377\377\377\257\376\376\376\273\377\377\377" "\305\377\377\377\315\376\376\376\324\377\377\377\332\377\377\377\336\377" "\377\377\342\377\377\377\345\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\4\377\377\377\7\377\377\377\12\377\377" "\377\17\377\377\377\25\377\377\377\36\377\377\377(\377\377\3773\377\377\377" "A\377\377\377P\377\377\377`\377\377\377p\377\377\377\201\377\377\377\221" "\377\377\377\240\377\377\377\256\376\376\376\273\377\377\377\306\376\376" "\376\317\377\377\377\327\377\377\377\336\377\377\377\343\377\377\377\347" "\376\376\376\352\377\377\377\354\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\14" "\377\377\377\21\377\377\377\30\377\377\377!\377\377\377,\377\377\3779\377" "\377\377H\377\377\377X\377\377\377h\377\377\377z\377\377\377\213\377\377" "\377\233\377\377\377\253\377\377\377\270\377\377\377\305\376\376\376\317" "\377\377\377\330\377\377\377\337\377\377\377\345\376\376\376\351\377\377" "\377\355\377\377\377\360\376\376\376\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\11\377" "\377\377\15\377\377\377\23\377\377\377\33\377\377\377%\377\377\3771\377\377" "\377?\377\377\377N\377\377\377_\377\377\377q\377\377\377\203\377\377\377" "\224\377\377\377\245\377\377\377\264\377\377\377\301\377\377\377\315\377" "\377\377\327\377\377\377\337\377\377\377\346\376\376\376\353\377\377\377" "\357\376\376\376\362\377\377\377\364\377\377\377\366\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377\6\377" "\377\377\12\377\377\377\17\377\377\377\26\377\377\377\36\377\377\377)\377" "\377\3776\377\377\377D\377\377\377U\377\377\377f\377\377\377x\377\377\377" "\213\377\377\377\234\377\377\377\255\377\377\377\274\377\377\377\311\376" "\376\376\324\377\377\377\336\377\377\377\345\376\376\376\353\377\377\377" "\360\377\377\377\363\377\377\377\366\377\377\377\367\377\377\377\371\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\2\377\377\377\4\377" "\377\377\7\377\377\377\13\377\377\377\20\377\377\377\30\377\377\377!\377" "\377\377,\376\376\376:\377\377\377I\377\377\377Z\377\377\377l\377\377\377" "\177\377\377\377\221\377\377\377\243\377\377\377\264\377\377\377\302\376" "\376\376\317\377\377\377\332\377\377\377\343\376\376\376\352\377\377\377" "\357\377\377\377\363\377\377\377\366\377\377\377\370\377\377\377\372\377" "\377\377\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\3" "\377\377\377\5\377\377\377\10\377\377\377\14\377\377\377\22\377\377\377\32" "\377\377\377#\377\377\377/\377\377\377>\377\377\377N\377\377\377_\377\377" "\377r\377\377\377\205\377\377\377\230\377\377\377\251\376\376\376\271\376" "\376\376\310\376\376\376\324\377\377\377\336\377\377\377\347\377\377\377" "\355\376\376\376\362\377\377\377\365\377\377\377\370\377\377\377\372\377" "\377\377\373\377\377\377\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\15\377\377\377" "\23\377\377\377\33\377\377\377&\376\376\3762\377\377\377A\377\377\377R\376" "\376\376d\377\377\377w\377\377\377\212\377\377\377\235\377\377\377\256\377" "\377\377\276\377\377\377\314\377\377\377\330\377\377\377\342\376\376\376" "\352\377\377\377\360\377\377\377\364\377\377\377\367\377\377\377\371\377" "\377\377\373\377\377\377\374\377\377\377\375\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\11\377\377" "\377\16\377\377\377\24\376\376\376\35\377\377\377(\376\376\3765\377\377\377" "D\377\377\377U\376\376\376g\377\377\377{\377\377\377\216\377\377\377\241" "\377\377\377\262\377\377\377\302\377\377\377\320\377\377\377\333\377\377" "\377\345\377\377\377\354\376\376\376\362\377\377\377\366\377\377\377\370" "\377\377\377\372\377\377\377\374\377\377\377\374\377\377\377\375" }; static char windowTex[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1" "\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\5\0\0\0\6\0\0\0\6" "\0\0\0\6\0\0\0\7\0\0\0\7\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6" "\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0\11\0\0\0\12\0\0\0\13\0\0\0\13\0\0\0\14\0" "\0\0\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0" "\0\0\3\0\0\0\4\0\0\0\5\0\0\0\7\0\0\0\10\0\0\0\12\0\0\0\13\0\0\0\14\0\0\0" "\16\0\0\0\17\0\0\0\20\0\0\0\21\0\0\0\21\0\0\0\22\0\0\0\22\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\7\0\0\0\11" "\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\21\0\0\0\23\0\0\0\24\0\0\0\26\0\0\0\30" "\0\0\0\31\0\0\0\32\0\0\0\33\0\0\0\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\2\0\0\0\3\0\0\0\4\0\0\0\6\0\0\0\10\0\0\0\12\0\0\0\15\0\0\0\20\0\0\0\22" "\0\0\0\25\0\0\0\30\0\0\0\33\0\0\0\35\0\0\0\37\0\0\0!\0\0\0#\0\0\0$\0\0\0" "%\0\0\0&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\11" "\0\0\0\14\0\0\0\17\0\0\0\23\0\0\0\26\0\0\0\32\0\0\0\36\0\0\0\"\0\0\0%\0\0" "\0(\0\0\0+\0\0\0.\0\0\0""0\0\0\0""1\0\0\0""2\0\0\0""3\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\12\0\0\0\15\0\0\0\21\0\0\0\25\0\0\0\32" "\0\0\0\36\0\0\0#\0\0\0(\0\0\0-\0\0\0""1\0\0\0""5\0\0\0""9\0\0\0<\0\0\0>\0" "\0\0@\0\0\0B\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\12\0\0\0" "\16\0\0\0\22\0\0\0\27\0\0\0\34\0\0\0\"\0\0\0(\0\0\0/\0\0\0""5\0\0\0;\0\0" "\0@\0\0\0E\0\0\0I\0\0\0M\0\0\0P\0\0\0R\0\0\0T\0\0\0V\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0" "\0\5\0\0\0\7\0\0\0\12\0\0\0\16\0\0\0\22\0\0\0\30\0\0\0\36\0\0\0%\0\0\0,\0" "\0\0""4\0\0\0<\0\0\0C\0\0\0J\0\0\0Q\0\0\0V\0\0\0[\0\0\0`\0\0\0c\0\0\0f\0" "\0\0h\0\0\0i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\6\0\0\0\11\0\0\0\15\0\0\0\22\0\0\0\30" "\0\0\0\36\0\0\0&\0\0\0/\0\0\0""8\0\0\0A\0\0\0J\0\0\0S\0\0\0[\0\0\0b\0\0\0" "i\0\0\0\231\0\0\0\354\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0" "\0\5\0\0\0\10\0\0\0\14\0\0\0\21\0\0\0\27\0\0\0\36\0\0\0&\0\0\0/\0\0\0""9" "\0\0\0D\0\0\0O\0\0\0Y\0\0\0c\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\361" "\361\361\353\361\361\361\353\361\361\361\353\361\361\361\353\361\361\361" "\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\3\0\0\0\4\0\0\0\7\0\0\0\12\0\0\0\17\0\0\0\25\0\0\0\34\0\0\0$\0\0\0.\0" "\0\0""9\0\0\0E\0\0\0Q\0\0\0]\0\0\0\234\0\0\0\377\0\0\0\377\361\361\361\353" "\361\361\361\353\361\361\361\353\361\361\361\353\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\10\0\0\0\15\0\0\0" "\22\0\0\0\31\0\0\0\"\0\0\0,\0\0\0""7\0\0\0C\0\0\0Q\0\0\0^\0\0\0\377\0\0\0" "\377\361\361\361\353\361\361\361\353\361\361\361\353\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\12\0\0\0\17\0\0\0\26\0\0\0\36\0\0\0'\0" "\0\0""3\0\0\0@\0\0\0N\0\0\0]\0\0\0\377\0\0\0\377\361\361\361\353\361\361" "\361\353\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3" "\0\0\0\5\0\0\0\10\0\0\0\14\0\0\0\22\0\0\0\31\0\0\0\"\0\0\0-\0\0\0:\0\0\0" "I\0\0\0X\0\0\0w\0\0\0\377\361\361\361\353\361\361\361\353\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\6" "\0\0\0\11\0\0\0\16\0\0\0\24\0\0\0\35\0\0\0'\0\0\0""3\0\0\0A\0\0\0Q\0\0\0" "b\0\0\0\377\361\361\361\353\361\361\361\353\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7" "\0\0\0\13\0\0\0\20\0\0\0\27\0\0\0\40\0\0\0+\0\0\0""9\0\0\0H\0\0\0Y\0\0\0" "\225\0\0\0\377\361\361\361\353\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\3\0\0\0\5\0\0" "\0\10\0\0\0\14\0\0\0\22\0\0\0\31\0\0\0#\0\0\0""0\0\0\0>\0\0\0N\0\0\0`\0\0" "\0\377\361\361\361\353\361\361\361\353\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\3\0\0" "\0\5\0\0\0\10\0\0\0\15\0\0\0\23\0\0\0\34\0\0\0&\0\0\0""3\0\0\0B\0\0\0T\0" "\0\0f\0\0\0\377\361\361\361\353\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0" "\0\3\0\0\0\6\0\0\0\11\0\0\0\16\0\0\0\25\0\0\0\36\0\0\0)\0\0\0""7\0\0\0F\0" "\0\0X\0\0\0k\0\0\0\377\361\361\361\353\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\2\0\0\0\3\0\0\0\6\0\0\0\12\0\0\0\17\0\0\0\26\0\0\0\37\0\0\0+\0\0\0""9" "\0\0\0J\0\0\0\\\0\0\0o\0\0\0\377\361\361\361\353\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\6\0\0\0\12\0\0\0\20\0\0\0\27\0\0\0!\0\0\0" "-\0\0\0<\0\0\0L\0\0\0_\0\0\0s\0\0\0\377\361\361\361\353\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341" "\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341" "\341\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\13\0\0\0\20\0\0\0\30\0\0\0\"\0" "\0\0.\0\0\0=\0\0\0O\0\0\0b\0\0\0v\0\0\0\377\361\361\361\353\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\13\0\0\0\21\0\0\0\31\0\0\0" "#\0\0\0""0\0\0\0?\0\0\0P\0\0\0c\0\0\0x\0\0\0\377\361\361\361\353\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\13\0\0\0\21\0\0\0" "\31\0\0\0#\0\0\0""0\0\0\0@\0\0\0Q\0\0\0e\0\0\0y\0\0\0\377\361\361\361\353" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341" "\341\326\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" "\341\341\341\326\341\341\341\326\341\341\341\326\341\341\341\326" }; #endif ./plugins/thumbnail/thumbnail.xml.in0000644000004100000410000001160313246301623020022 0ustar www-datawww-data <_short>Thumbnail Window Previews <_long>Live window thumbnails at the dock, launcher or taskbar Extras opengl mousepoll text decor opengl mousepoll <_short>General <_short>Dock / Launcher / Taskbar <_short>Window Title Text ./plugins/matecompat/0000755000004100000410000000000013246301623015056 5ustar www-datawww-data./plugins/matecompat/CMakeLists.txt0000644000004100000410000000015513246301623017617 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(matecompat PLUGINDEPS composite opengl)./plugins/matecompat/src/0000755000004100000410000000000013246301623015645 5ustar www-datawww-data./plugins/matecompat/src/matecompat.h0000644000004100000410000000346613246301623020161 0ustar www-datawww-data/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include #include #include "matecompat_options.h" class MateCompatScreen : public PluginClassHandler, public MatecompatOptions { public: MateCompatScreen (CompScreen *s); void panelAction (CompOption::Vector& options, Atom action); Atom panelActionAtom; Atom panelMainMenuAtom; Atom panelRunDialogAtom; }; #define MATE_SCREEN(s) \ MateCompatScreen *gs = MateCompatScreen::get (s) class MateCompatPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/matecompat/src/matecompat.cpp0000644000004100000410000001003413246301623020501 0ustar www-datawww-data/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "matecompat.h" COMPIZ_PLUGIN_20090315 (matecompat, MateCompatPluginVTable); static bool runCommand (CompAction *action, CompAction::State state, CompOption::Vector& options, CompOption *commandOption) { Window xid; xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return false; screen->runCommand (commandOption->value ().s ()); return true; } void MateCompatScreen::panelAction (CompOption::Vector& options, Atom actionAtom) { Window xid; XEvent event; Time time; xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return; time = CompOption::getIntOptionNamed (options, "time", CurrentTime); /* we need to ungrab the keyboard here, otherwise the panel main menu won't popup as it wants to grab the keyboard itself */ XUngrabKeyboard (screen->dpy (), time); event.type = ClientMessage; event.xclient.window = screen->root (); event.xclient.message_type = panelActionAtom; event.xclient.format = 32; event.xclient.data.l[0] = actionAtom; event.xclient.data.l[1] = time; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), screen->root (), false, StructureNotifyMask, &event); } static bool showMainMenu (CompAction *action, CompAction::State state, CompOption::Vector& options) { MATE_SCREEN (screen); gs->panelAction (options, gs->panelMainMenuAtom); return true; } static bool showRunDialog (CompAction *action, CompAction::State state, CompOption::Vector& options) { MATE_SCREEN (screen); gs->panelAction (options, gs->panelRunDialogAtom); return true; } MateCompatScreen::MateCompatScreen (CompScreen *s) : PluginClassHandler (s) { panelActionAtom = XInternAtom (screen->dpy (), "_MATE_PANEL_ACTION", false); panelMainMenuAtom = XInternAtom (screen->dpy (), "_MATE_PANEL_ACTION_MAIN_MENU", false); panelRunDialogAtom = XInternAtom (screen->dpy (), "_MATE_PANEL_ACTION_RUN_DIALOG", false); #define COMMAND_BIND(opt) \ boost::bind (runCommand, _1, _2, _3, &mOptions[opt]) optionSetMainMenuKeyInitiate (showMainMenu); optionSetRunKeyInitiate (showRunDialog); optionSetRunCommandScreenshotKeyInitiate (COMMAND_BIND (MatecompatOptions::CommandScreenshot)); optionSetRunCommandWindowScreenshotKeyInitiate (COMMAND_BIND (MatecompatOptions::CommandWindowScreenshot)); optionSetRunCommandTerminalKeyInitiate (COMMAND_BIND (MatecompatOptions::CommandTerminal)); } bool MateCompatPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/matecompat/matecompat.xml.in0000644000004100000410000000400113246301623020332 0ustar www-datawww-data <_short>MATE Compatibility <_long>Options that keep Compiz compatible with the MATE desktop environment General wmkeybindings composite opengl decor <_short>Commands <_short>Run terminal command ./plugins/CMakeLists.txt0000644000004100000410000000177213246301623015473 0ustar www-datawww-dataset (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CompizDefaults) include (CompizCommon) set (COMPIZ_FOUND "true") add_definitions ( -DHAVE_CONFIG_H) include_directories (${COMPIZ_INTERNAL_INCLUDES}) # temporarily disable plugins that aren't ported yet set (COMPIZ_DISABLE_PLUGIN_BICUBIC ON) set (COMPIZ_DISABLE_PLUGIN_GROUP ON) set (COMPIZ_DISABLE_PLUGIN_LOGINOUT ON) set (COMPIZ_DISABLE_PLUGIN_REFLEX ON) set (COMPIZ_DISABLE_PLUGIN_STACKSWITCH ON) set (COMPIZ_DISABLE_PLUGIN_TRIP ON) # disable plugins which won't work on ES2 builds if (BUILD_GLES) set (COMPIZ_DISABLE_PLUGIN_FREEWINS ON) set (COMPIZ_DISABLE_PLUGIN_GEARS ON) set (COMPIZ_DISABLE_PLUGIN_TD ON) set (COMPIZ_DISABLE_PLUGIN_MBLUR ON) set (COMPIZ_DISABLE_PLUGIN_BENCH ON) set (COMPIZ_DISABLE_PLUGIN_WIDGET ON) set (COMPIZ_DISABLE_PLUGIN_THUMBNAIL ON) endif (BUILD_GLES) compiz_add_plugins_in_folder (${CMAKE_CURRENT_SOURCE_DIR}) ./plugins/imgpng/0000755000004100000410000000000013246301624014206 5ustar www-datawww-data./plugins/imgpng/CMakeLists.txt0000644000004100000410000000013413246301623016743 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(imgpng PKGDEPS libpng)./plugins/imgpng/src/0000755000004100000410000000000013246301624014775 5ustar www-datawww-data./plugins/imgpng/src/imgpng.cpp0000644000004100000410000002010313246301623016755 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "imgpng.h" #include "core/abiversion.h" #include #include #include #include #include COMPIZ_PLUGIN_20090315 (imgpng, PngPluginVTable) const unsigned short PNG_SIG_SIZE = 8; PngScreen::PngScreen (CompScreen *screen) : PluginClassHandler (screen) { ScreenInterface::setHandler (screen, true); screen->updateDefaultIcon (); } PngScreen::~PngScreen () { screen->updateDefaultIcon (); } static void premultiplyData (png_structp png, png_row_infop row_info, png_bytep data) { for (unsigned int i = 0; i < row_info->rowbytes; i += 4) { unsigned char *base = &data[i]; unsigned char blue = base[0]; unsigned char green = base[1]; unsigned char red = base[2]; unsigned char alpha = base[3]; int p; red = (unsigned) red * (unsigned) alpha / 255; green = (unsigned) green * (unsigned) alpha / 255; blue = (unsigned) blue * (unsigned) alpha / 255; p = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); memcpy (base, &p, sizeof (int)); } } bool PngScreen::readPngData (png_struct *png, png_info *info, void *&data, CompSize &size) { png_uint_32 pngWidth, pngHeight; int depth, colorType, interlace; unsigned int pixelSize; png_byte **rowPointers; char *d; png_read_info (png, info); png_get_IHDR (png, info, &pngWidth, &pngHeight, &depth, &colorType, &interlace, NULL, NULL); size.setWidth (pngWidth); size.setHeight (pngHeight); /* convert palette/gray image to rgb */ if (colorType == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb (png); /* expand gray bit depth if needed */ if (colorType == PNG_COLOR_TYPE_GRAY && depth < 8) png_set_expand_gray_1_2_4_to_8 (png); /* transform transparency to alpha */ if (png_get_valid (png, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha (png); if (depth == 16) png_set_strip_16 (png); if (depth < 8) png_set_packing (png); /* convert grayscale to RGB */ if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb (png); if (interlace != PNG_INTERLACE_NONE) png_set_interlace_handling (png); png_set_bgr (png); png_set_filler (png, 0xff, PNG_FILLER_AFTER); png_set_read_user_transform_fn (png, premultiplyData); png_read_update_info (png, info); pixelSize = 4; d = (char *) malloc (pngWidth * pngHeight * pixelSize); if (!d) return false; data = d; rowPointers = new png_byte *[pngHeight]; if (!rowPointers) { free (d); return false; } for (unsigned int i = 0; i < pngHeight; ++i) rowPointers[i] = (png_byte *) (d + i * pngWidth * pixelSize); png_read_image (png, rowPointers); png_read_end (png, info); delete [] rowPointers; return true; } static void stdioReadFunc (png_structp png, png_bytep data, png_size_t size) { std::ifstream *file = (std::ifstream *) png_get_io_ptr (png); file->read ((char *) data, size); if (file->fail ()) png_error (png, "Read Error"); } bool PngScreen::readPng (std::ifstream &file, CompSize &size, void *&data) { unsigned char png_sig[PNG_SIG_SIZE]; file.read ((char *) png_sig, PNG_SIG_SIZE); if (file.fail () || png_sig_cmp (png_sig, 0, PNG_SIG_SIZE)) return false; png_struct *png = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png) return false; png_info *info = png_create_info_struct (png); if (!info) { png_destroy_read_struct (&png, NULL, NULL); return false; } png_set_read_fn (png, &file, stdioReadFunc); png_set_sig_bytes (png, PNG_SIG_SIZE); bool status = readPngData (png, info, data, size); png_destroy_read_struct (&png, &info, NULL); return status; } static void stdioWriteFunc (png_structp png, png_bytep data, png_size_t size) { std::ofstream *file = (std::ofstream *) png_get_io_ptr (png); file->write ((char *) data, size); if (file->bad ()) png_error (png, "Write Error"); } bool PngScreen::writePng (unsigned char *buffer, std::ostream &file, CompSize &size, int stride) { int height = size.height (); png_byte **rows = new png_byte *[height]; if (!rows) return false; for (int i = 0; i < height; ++i) rows[height - i - 1] = buffer + i * stride; png_struct *png = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png) { delete [] rows; return false; } png_info *info = png_create_info_struct (png); if (!info) { png_destroy_write_struct (&png, NULL); delete [] rows; return false; } if (setjmp (png_jmpbuf (png))) { png_destroy_write_struct (&png, NULL); delete [] rows; return false; } png_set_write_fn (png, &file, stdioWriteFunc, NULL); png_set_IHDR (png, info, size.width (), size.height (), 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_color_16 white; white.red = 0xff; white.blue = 0xff; white.green = 0xff; png_set_bKGD (png, info, &white); png_write_info (png, info); png_write_image (png, rows); png_write_end (png, info); png_destroy_write_struct (&png, &info); delete [] rows; return true; } CompString PngScreen::fileNameWithExtension (CompString &path) { unsigned int len = path.length (); if (len > 4 && path.substr (len - 4, 4) == ".png") return path; return path + ".png"; } bool PngScreen::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { std::ofstream file; CompString fileName = fileNameWithExtension (path); bool status = false; if (format == "png") { file.open (fileName.c_str ()); if (file.is_open ()) { status = writePng ((unsigned char *) data, file, size, stride); file.close (); } if (status) return true; } status = screen->imageToFile (path, format, size, stride, data); if (!status) { file.open (fileName.c_str ()); if (file.is_open ()) { status = writePng ((unsigned char *) data, file, size, stride); file.close (); } } return status; } bool PngScreen::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { std::ifstream file; CompString fileName = fileNameWithExtension (name); bool status = false; file.open (fileName.c_str ()); if (file.is_open ()) { status = readPng (file, size, data); file.close (); } if (status) { stride = size.width () * 4; return true; } return screen->fileToImage (name, size, stride, data); } bool PngPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/imgpng/src/imgpng.h0000644000004100000410000000446213246301623016434 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef COMPIZ_IMGPGN_H #define COMPIZ_IMGPGN_H #include #include #include #include #include extern const unsigned short PNG_SIG_SIZE; class PngScreen : public ScreenInterface, public PluginClassHandler { public: PngScreen (CompScreen *screen); ~PngScreen (); bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); bool imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data); private: CompString fileNameWithExtension (CompString &path); bool readPngData (png_struct *png, png_info *info, void *&data, CompSize &size); bool readPng (std::ifstream &file, CompSize &size, void *&data); bool writePng (unsigned char *buffer, std::ostream &file, CompSize &size, int stride); }; class PngPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #endif ./plugins/imgpng/imgpng.xml.in0000644000004100000410000000062613246301623016621 0ustar www-datawww-data <_short>PNG <_long>PNG image loader Image Loading imageext:png imagemime:image/png composite opengl decor ./plugins/animation/0000755000004100000410000000000013246301623014703 5ustar www-datawww-data./plugins/animation/CMakeLists.txt0000644000004100000410000000015613246301623017445 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (animation PLUGINDEPS composite opengl) ./plugins/animation/include/0000755000004100000410000000000013246301623016326 5ustar www-datawww-data./plugins/animation/include/animation/0000755000004100000410000000000013246301624020306 5ustar www-datawww-data./plugins/animation/include/animation/multi.h0000644000004100000410000002200513246301623021607 0ustar www-datawww-data#ifndef ANIMATION_MULTI_H #define ANIMATION_MULTI_H #include "animation.h" #include #include /// Special class, allows multiple copies of an animation to happen /// at any one time. Create your "single copy" animation class first /// and then create a new animation which derives from this template /// class. Each function of your animation will be called since this /// class overloads everything in Animation. You will have /// access to which number effect is happening. (I think) template class MultiAnim : public Animation { public: static inline int getCurrAnimNumber (AnimWindow *aw) { MultiPersistentData *pd = static_cast (aw->persistentData["multi"]); if (!pd) { pd = new MultiPersistentData (); aw->persistentData["multi"] = pd; } if (!pd) return 0; return pd->num; } static inline void setCurrAnimNumber (AnimWindow *aw, int what) { MultiPersistentData *pd = static_cast (aw->persistentData["multi"]); if (!pd) pd = new MultiPersistentData (); if (!pd) return; pd->num = what; } public: MultiAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation (w, curWindowEvent, duration, info, icon), currentAnim (0) { for (unsigned int i = 0; i < num; ++i) animList.push_back (new SingleAnim (w, curWindowEvent, duration, info, icon)); mGlPaintAttribs.resize (num); mGlPaintTransforms.resize (num); } virtual ~MultiAnim () {} public: /// Overload everything /// Needed since virtual method calls can't be done in the constructor. void init () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->init (); } } /// To be called during post-animation clean up. void cleanUp (bool closing, bool destructing) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->cleanUp (closing, destructing); delete a; } animList.clear (); } /// Returns true if frame should be skipped (e.g. due to /// higher timestep values). In that case no drawing is /// needed for that window in current frame. bool shouldSkipFrame (int msSinceLastPaintActual) { int count = 0; bool skip = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; skip |= a->shouldSkipFrame (msSinceLastPaintActual); } return skip; } /// Advances the animation time by the given time amount. /// Returns true if more animation time is left. bool advanceTime (int msSinceLastPaint) { int count = 0; bool advance = false; advance |= Animation::advanceTime (msSinceLastPaint); foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; advance |= a->advanceTime (msSinceLastPaint); } return advance; } /// Computes new animation state based on remaining time. void step () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->step (); } } void updateAttrib (GLWindowPaintAttrib &attrib) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); mGlPaintAttribs[count] = attrib; a->updateAttrib (mGlPaintAttribs[count]); ++count; } } void updateTransform (GLMatrix &transform) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); GLMatrix mat (transform); a->updateTransform (mat); mGlPaintTransforms.at (count) = mat; ++count; } } void prePaintWindow () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->prePaintWindow (); } } void postPaintWindow (const GLMatrix &transform) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->postPaintWindow (transform); } } bool postPaintWindowUsed () { int count = 0; bool used = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; used |= a->postPaintWindowUsed (); } return used; } /// Returns true if the animation is still in progress. bool prePreparePaint (int msSinceLastPaint) { int count = 0; bool inProgress = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; inProgress |= a->prePreparePaint (msSinceLastPaint); } return inProgress; } void postPreparePaint () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->postPreparePaint (); } } /// Updates the bounding box of damaged region. Should be implemented for /// any animation that doesn't update the whole screen. // NB!! void updateBB (CompOutput &out) { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->updateBB (out); } } bool updateBBUsed () { int count = 0; bool used = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; used |= a->updateBBUsed (); } return used; } /// Should return true for effects that make use of a region /// instead of just a bounding box for damaged area-> bool stepRegionUsed () { int count = 0; bool used = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; used |= a->stepRegionUsed (); } return used; } bool shouldDamageWindowOnStart () { int count = 0; bool should = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; should |= a->shouldDamageWindowOnStart (); } return should; } bool shouldDamageWindowOnEnd () { int count = 0; bool should = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; should |= a->shouldDamageWindowOnStart (); } return should; } /// Should return false if the animation should be stopped on move bool moveUpdate (int dx, int dy) { int count = 0; bool update = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; update |= a->moveUpdate (dx, dy); } return update; } /// Should return false if the animation should be stopped on resize bool resizeUpdate (int dx, int dy, int dwidth, int dheight) { int count = 0; bool update = false; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; update |= a->resizeUpdate (dx, dy, dwidth, dheight); } return update; } void adjustPointerIconSize () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->adjustPointerIconSize (); } } void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { setCurrAnimNumber (mAWindow, currentAnim); animList.at (currentAnim)->addGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } void drawGeometry () { setCurrAnimNumber (mAWindow, currentAnim); animList.at (currentAnim)->drawGeometry (); } bool paintWindowUsed () { int count = 0; foreach (SingleAnim *a, animList) { setCurrAnimNumber (mAWindow, count); ++count; a->paintWindowUsed (); } /* Always return true because we need to take over painting */ return true; } bool paintWindow (GLWindow *gWindow, const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { int count = 0; bool status = false; for (currentAnim = 0; currentAnim < animList.size (); currentAnim++) { GLWindowPaintAttrib wAttrib (mGlPaintAttribs.at (currentAnim)); GLMatrix wTransform (mGlPaintTransforms.at (currentAnim)); setCurrAnimNumber (mAWindow, count); ++count; if (animList.at (currentAnim)->paintWindowUsed ()) status |= animList.at (currentAnim)->paintWindow (gWindow, wAttrib, wTransform, region, mask); else { unsigned int index = gWindow->glPaintGetCurrentIndex (); status |= gWindow->glPaint (wAttrib, wTransform, region, mask); gWindow->glPaintSetCurrentIndex (index); } } return status; } private: std::vector mGlPaintAttribs; std::vector mGlPaintTransforms; std::vector animList; unsigned int currentAnim; }; #endif ./plugins/animation/include/animation/point3d.h0000644000004100000410000000424513246301623022043 0ustar www-datawww-data#ifndef ANIMATION_POINT_H #define ANIMATION_POINT_H #include "animation.h" class Point { public: Point () : mX (0), mY (0) {} Point (float x, float y) : mX (x), mY (y) {} inline float x () const { return mX; } inline float y () const { return mY; } inline void setX (float x) { mX = x; } inline void setY (float y) { mY = y; } void set (float x, float y) { mX = x; mY = y; } inline void add (const Point &p) { mX += p.x (); mY += p.y (); } Point &operator= (const Point &p); bool operator== (const Point &p) const; bool operator!= (const Point &p) const; private: float mX, mY; }; typedef Point Vector; class Point3d { public: Point3d () : mX (0), mY (0), mZ (0) {} Point3d (float x, float y, float z) : mX (x), mY (y), mZ (z) {} inline float x () const { return mX; } inline float y () const { return mY; } inline float z () const { return mZ; } inline void setX (float x) { mX = x; } inline void setY (float y) { mY = y; } inline void setZ (float z) { mZ = z; } inline void set (float x, float y, float z) { mX = x; mY = y; mZ = z; } inline void add (const Point3d &p) { mX += p.x (); mY += p.y (); mZ += p.z (); } inline void add (float x, float y, float z) { mX += x; mY += y; mZ += z; } Point3d &operator= (const Point3d &p); bool operator== (const Point3d &p) const; bool operator!= (const Point3d &p) const; private: float mX, mY, mZ; }; typedef Point3d Vector3d; /* XXX: change this to CompRect */ typedef struct { float x1, x2, y1, y2; } Boxf; inline Point & Point::operator= (const Point &p) { mX = p.x (); mY = p.y (); return *this; } inline bool Point::operator== (const Point &p) const { return (mX == p.x () && mY == p.y ()); } inline bool Point::operator!= (const Point &p) const { return !(*this == p); } inline Point3d & Point3d::operator= (const Point3d &p) { mX = p.x (); mY = p.y (); mZ = p.z (); return *this; } inline bool Point3d::operator== (const Point3d &p) const { return (mX == p.x () && mY == p.y () && mZ == p.z ()); } inline bool Point3d::operator!= (const Point3d &p) const { return !(*this == p); } #endif ./plugins/animation/include/animation/window.h0000644000004100000410000000457113246301623021774 0ustar www-datawww-data#ifndef ANIMATION_WINDOW_H #define ANIMATION_WINDOW_H #include "animation.h" extern template class PluginClassHandler; class AnimWindow : public PluginClassHandler { friend class PrivateAnimScreen; friend class PrivateAnimWindow; friend class AnimScreen; friend class Animation; public: AnimWindow (CompWindow *); ~AnimWindow (); BoxPtr BB (); CompRegion &stepRegion (); void resetStepRegionWithBB (); void expandBBWithWindow (); void expandBBWithScreen (); void expandBBWithBox (Box &source); void expandBBWithPoint (float fx, float fy); void expandBBWithPoint2DTransform (GLVector &coords, GLMatrix &transformMat); bool expandBBWithPoints3DTransform (CompOutput &output, GLMatrix &transform, const float *points, GridAnim::GridModel::GridObject *objects, unsigned int nPoints); inline bool savedRectsValid () { return mSavedRectsValid; } inline const CompRect & saveWinRect () { return mSavedWinRect; } inline const CompRect & savedInRect () { return mSavedInRect; } inline const CompRect & savedOutRect () { return mSavedOutRect; } inline CompWindowExtents & savedOutExtents () { return mSavedOutExtents; } Animation *curAnimation (); void createFocusAnimation (AnimEffect effect, int duration = 0); void postAnimationCleanUp (); // TODO: Group persistent data for a plugin and allow a plugin to only // delete its own data. void deletePersistentData (const char *name); /// A "string -> persistent data" map for animations that require such data, /// like some focus animations. PersistentDataMap persistentData; CompWindow *mWindow; ///< Window being animated. // TODO move to private: private: PrivateAnimWindow *priv; bool mSavedRectsValid; CompRect mSavedWinRect; ///< Saved window contents geometry CompRect mSavedInRect; ///< Saved window input geometry CompRect mSavedOutRect; ///< Saved window output geometry CompWindowExtents mSavedOutExtents; ///< Saved window output extents CompOption::Value &pluginOptVal (ExtensionPluginInfo *pluginInfo, unsigned int optionId, Animation *anim); }; #endif ./plugins/animation/include/animation/persistent.h0000644000004100000410000000046013246301623022656 0ustar www-datawww-data#ifndef ANIMATION_PERSISTENT_H #define ANIMATION_PERSISTENT_H #include "animation.h" class PersistentData { }; typedef std::map PersistentDataMap; class MultiPersistentData : public PersistentData { public: MultiPersistentData () : num (0) {} int num; }; #endif ./plugins/animation/include/animation/zoom.h0000644000004100000410000000444013246301623021444 0ustar www-datawww-data#ifndef ANIMATION_ZOOM_H #define ANIMATION_ZOOM_H #include "animation.h" class ZoomAnim : public FadeAnim, virtual public TransformAnim { public: ZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); public: void step () { TransformAnim::step (); } void adjustDuration (); float getFadeProgress (); bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } void applyTransform (); protected: float getActualProgress (); Point getCenter (); virtual float getSpringiness (); virtual bool isZoomFromCenter (); virtual bool zoomToIcon () { return true; } virtual bool hasExtraTransform () { return false; } virtual void applyExtraTransform (float progress) {} virtual bool shouldAvoidParallelogramLook () { return false; } virtual bool scaleAroundIcon (); virtual bool neverSpringy () { return false; } void getZoomProgress (float *moveProgress, float *scaleProgress, bool neverSpringy); bool requiresTransformedWindow () const { return true; } static const float kDurationFactor; static const float kSpringyDurationFactor; static const float kNonspringyDurationFactor; private: void getCenterScaleFull (Point *pCurCenter, Point *pCurScale, Point *pWinCenter, Point *pIconCenter, float *pMoveProgress); void getCenterScale (Point *pCurCenter, Point *pCurScale); }; class GridZoomAnim : public GridTransformAnim, public ZoomAnim { public: GridZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init () { GridTransformAnim::init (); } void step () { ZoomAnim::step (); } void updateTransform (GLMatrix &wTransform) { GridTransformAnim::updateTransform (wTransform); } void updateBB (CompOutput &output) { GridTransformAnim::updateBB (output); } bool updateBBUsed () { return true; } bool neverSpringy () { return true; } float getSpringiness () { return 0; } bool scaleAroundIcon () { return false; } void adjustDuration (); bool requiresTransformedWindow () const { return true; } }; #endif ./plugins/animation/include/animation/partialwindow.h0000644000004100000410000000121613246301623023342 0ustar www-datawww-data#ifndef ANIMATION_PARTIALWINDOW_H #define ANIMATION_PARTIALWINDOW_H #include "animation.h" class PartialWindowAnim : virtual public Animation { public: PartialWindowAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight); protected: bool mUseDrawRegion; CompRegion mDrawRegion; }; #endif ./plugins/animation/include/animation/grid.h0000644000004100000410000000564213246301623021412 0ustar www-datawww-data#ifndef ANIMATION_GRID_H #define ANIMATION_GRID_H #include "animation.h" class GridAnim : virtual public Animation { public: class GridModel { friend class GridAnim; public: GridModel (CompWindow *w, WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight); ~GridModel (); void move (float tx, float ty); class GridObject { friend class GridAnim; friend class GridZoomAnim; friend class GridTransformAnim; public: GridObject (); void setGridPosition (Point &gridPosition); inline Point3d &position () { return mPosition; } inline Point &gridPosition () { return mGridPosition; } inline Point &offsetTexCoordForQuadBefore () { return mOffsetTexCoordForQuadBefore; } inline Point &offsetTexCoordForQuadAfter () { return mOffsetTexCoordForQuadAfter; } private: Point3d mPosition; ///< Position on screen Point mGridPosition; ///< Position on window in [0,1] range Point mOffsetTexCoordForQuadBefore; Point mOffsetTexCoordForQuadAfter; ///< Texture x, y coordinates will be offset by given amounts ///< for quads that fall after and before this object in x and y directions. ///< Currently only y offset can be used. }; inline GridObject *objects () { return mObjects; } inline unsigned int numObjects () { return mNumObjects; } inline Point &scale () { return mScale; } private: GridObject *mObjects; // TODO: convert to vector unsigned int mNumObjects; Point mScale; Point mScaleOrigin; void initObjects (WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight); }; protected: GridModel *mModel; int mGridWidth; ///< Number of cells along grid width int mGridHeight; ///< Number of cells along grid height /// true if effect needs Q texture coordinates. /// Q texture coordinates are used to avoid jagged-looking quads /// ( http://www.r3.nu/~cass/qcoord/ ) bool mUseQTexCoord; virtual bool using3D () { return false; } virtual bool requiresTransformedWindow () const { return true; } virtual void initGrid (); ///< Initializes grid width/height. ///< Default grid size is 2x2. ///< Override for custom grid size. public: GridAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~GridAnim (); void init (); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight); }; #endif ./plugins/animation/include/animation/animeffect.h0000644000004100000410000001736613246301623022574 0ustar www-datawww-data#ifndef ANIMATION_ANIMEFFECT_H #define ANIMATION_ANIMEFFECT_H #include "animation.h" typedef Animation *(*CreateAnimFunc) (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); class AnimEffectUsedFor { public: static AnimEffectUsedFor all(); static AnimEffectUsedFor none(); AnimEffectUsedFor& exclude(AnimEvent event); AnimEffectUsedFor& include(AnimEvent event); bool open; bool close; bool minimize; bool shade; bool unminimize; bool focus; }; /// Animation info class that holds the name, the list of supported events, and /// the creator function for a subclass of Animation. /// A pointer to this class is used as an identifier for each implemented /// animation. class AnimEffectInfo { public: AnimEffectInfo (const char *name, AnimEffectUsedFor usedFor, CreateAnimFunc create, bool isRestackAnim = false); ~AnimEffectInfo () {} bool matchesEffectName (const CompString &animName); bool matchesPluginName (const CompString &pluginName); const char *name; ///< Name of the animation effect, e.g. "animationpack:Implode". /// To be set to true for the window event animation list(s) that /// the new animation (value) should be added to /// (0: open, 1: close, 2: minimize, 3: shade, 4: unminimize, 5: focus) bool usedForEvents[AnimEventNum]; /// Creates an instance of the Animation subclass and returns it as an /// Animation instance. CreateAnimFunc create; /// Is it a complex focus animation? (i.e. restacking-related, /// like FocusFade/Dodge) bool isRestackAnim; }; template Animation *createAnimation (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) { return new T (w, curWindowEvent, duration, info, icon); } /** The base class for all animations. A n*imations should derive from the closest animation class to override as few methods as possible. Also, an animation method should call ancestors' methods instead of duplicating their code. */ class Animation { protected: CompWindow *mWindow; AnimWindow *mAWindow; float mTotalTime; float mRemainingTime; float mTimestep; ///< to store anim. timestep at anim. start float mTimeElapsedWithinTimeStep; int mTimeSinceLastPaint; ///< in milliseconds int mOverrideProgressDir; ///< 0: default dir, 1: forward, 2: backward GLWindowPaintAttrib mCurPaintAttrib; GLushort mStoredOpacity; WindowEvent mCurWindowEvent; bool mInitialized; ///< whether the animation is initialized (in preparePaint) AnimEffect mInfo; ///< information about the animation class CompRect mIcon; int mDecorTopHeight; int mDecorBottomHeight; CompOption::Value &optVal (unsigned int optionId); inline bool optValB (unsigned int optionId) { return optVal (optionId).b (); } inline int optValI (unsigned int optionId) { return optVal (optionId).i (); } inline float optValF (unsigned int optionId) { return optVal (optionId).f (); } inline CompString optValS (unsigned int optionId) { return optVal (optionId).s (); } inline unsigned short *optValC (unsigned int optionId) { return optVal (optionId).c (); } public: Animation (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); virtual ~Animation (); inline AnimEffect info () { return mInfo; } // Overridable animation methods. /// Needed since virtual method calls can't be done in the constructor. virtual void init () {} /// To be called during post-animation clean up. virtual void cleanUp (bool closing, bool destructing) {} /// Returns true if frame should be skipped (e.g. due to /// higher timestep values). In that case no drawing is /// needed for that window in current frame. virtual bool shouldSkipFrame (int msSinceLastPaintActual); /// Advances the animation time by the given time amount. /// Returns true if more animation time is left. virtual bool advanceTime (int msSinceLastPaint); /// Computes new animation state based on remaining time. virtual void step () {} virtual void updateAttrib (GLWindowPaintAttrib &) {} virtual void updateTransform (GLMatrix &) {} virtual void prePaintWindow () {} virtual void postPaintWindow (const GLMatrix &) {} virtual bool postPaintWindowUsed () { return false; } /// Returns true if the animation is still in progress. virtual bool prePreparePaint (int msSinceLastPaint) { return false; } virtual void postPreparePaint () {} /// Updates the bounding box of damaged region. Should be implemented for /// any animation that doesn't update the whole screen. virtual void updateBB (CompOutput &) {} virtual bool updateBBUsed () { return false; } /// Should return true for effects that make use of a region /// instead of just a bounding box for damaged area. virtual bool stepRegionUsed () { return false; } virtual bool shouldDamageWindowOnStart (); virtual bool shouldDamageWindowOnEnd (); /// Should return false if the animation should be stopped on move virtual bool moveUpdate (int dx, int dy) { return true; } /// Should return false if the animation should be stopped on resize virtual bool resizeUpdate (int dx, int dy, int dwidth, int dheight) { return true; } virtual void adjustPointerIconSize () {} virtual void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight); virtual void drawGeometry (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); virtual bool paintWindowUsed () { return false; } virtual bool paintWindow (GLWindow *gWindow, const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { return gWindow->glPaint (attrib, transform, region, mask); } virtual bool requiresTransformedWindow () const { return true; } /// Gets info about the (extension) plugin that implements this animation. /// Should be overriden by a base animation class in every extension plugin. virtual ExtensionPluginInfo *getExtensionPluginInfo (); void drawTexture (GLTexture *texture, const GLWindowPaintAttrib &attrib, unsigned int mask); // Utility methods void reverse (); inline bool inProgress () { return (mRemainingTime > 0); } inline WindowEvent curWindowEvent () { return mCurWindowEvent; } inline float totalTime () { return mTotalTime; } inline float remainingTime () { return mRemainingTime; } float progressLinear (); float progressEaseInEaseOut (); float progressDecelerateCustom (float progress, float minx, float maxx); float progressDecelerate (float progress); AnimDirection getActualAnimDirection (AnimDirection dir, bool openDir); void perspectiveDistortAndResetZ (GLMatrix &transform); static void prepareTransform (CompOutput &output, GLMatrix &resultTransform, GLMatrix &transform); void setInitialized () { mInitialized = true; } inline bool initialized () { return mInitialized; } inline void setCurPaintAttrib (const GLWindowPaintAttrib &newAttrib) { mCurPaintAttrib = newAttrib; } }; #endif ./plugins/animation/include/animation/screen.h0000644000004100000410000000222313246301623021734 0ustar www-datawww-data#ifndef ANIMATION_SCREEN_H #define ANIMATION_SCREEN_H #include "animation.h" class AnimScreen; extern template class PluginClassHandler; class AnimScreen : public PluginClassHandler, public CompOption::Class { friend class ExtensionPluginAnimation; friend class PrivateAnimScreen; friend class PrivateAnimWindow; public: AnimScreen (CompScreen *); ~AnimScreen (); void addExtension (ExtensionPluginInfo *extensionPluginInfo); void removeExtension (ExtensionPluginInfo *extensionPluginInfo); bool getMousePointerXY (short *x, short *y); CompOption::Vector &getOptions (); bool setOption (const CompString &name, CompOption::Value &value); CompOutput &output (); AnimEffect getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration); void enableCustomPaintList (bool enabled); bool isRestackAnimPossible (); bool isAnimEffectPossible (AnimEffect theEffect); bool otherPluginsActive (); bool initiateFocusAnim (AnimWindow *aw); private: PrivateAnimScreen *priv; }; #endif ./plugins/animation/include/animation/transform.h0000644000004100000410000000163713246301623022500 0ustar www-datawww-data#ifndef ANIMATION_TRANSFORM_H #define ANIMATION_TRANSFORM_H #include "animation.h" class TransformAnim : virtual public Animation { public: TransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void step (); void updateTransform (GLMatrix &wTransform); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } protected: GLMatrix mTransform; float mTransformStartProgress; float mTransformProgress; void perspectiveDistortAndResetZ (GLMatrix &transform); void applyPerspectiveSkew (CompOutput &output, GLMatrix &transform, Point ¢er); virtual void adjustDuration () {} virtual void applyTransform () {} virtual Point getCenter (); virtual bool requiresTransformedWindow () const { return true; } }; #endif ./plugins/animation/include/animation/fade.h0000644000004100000410000000107513246301623021360 0ustar www-datawww-data#ifndef ANIMATION_FADE_H #define ANIMATION_FADE_H #include "animation.h" class FadeAnim : virtual public Animation { public: FadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); public: void updateBB (CompOutput &output); bool updateBBUsed () { return true; } void updateAttrib (GLWindowPaintAttrib &wAttrib); virtual bool requiresTransformedWindow () const { return false; } virtual float getFadeProgress () { return progressLinear (); } }; #endif ./plugins/animation/include/animation/extensionplugin.h0000644000004100000410000000464413246301623023721 0ustar www-datawww-data#ifndef ANIMATION_EXTENSIONPLUGIN_H #define ANIMATION_EXTENSIONPLUGIN_H #include "animation.h" class ExtensionPluginInfo { public: ExtensionPluginInfo (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex); virtual ~ExtensionPluginInfo () {} CompString name; unsigned int nEffects; AnimEffect *effects; /// Plugin options to be used in "effect options" strings. CompOption::Vector *effectOptions; /// Index of first effect option. unsigned int firstEffectOptionIndex; // More general and/or non-window functions (including functions that access // persistent animation data) to be overriden /// To be run at the beginning of glPaintOutput. virtual void prePaintOutput (CompOutput *output) {} /// To be run at the beginning of preparePaint. virtual void prePreparePaintGeneral () {} /// To be run at the end of preparePaint. virtual void postPreparePaintGeneral () {} /// To be run when a CompWindowNotifyRestack is handled. virtual void handleRestackNotify (AnimWindow *aw) {} /// To be run at the beginning of initiateOpenAnim. virtual void preInitiateOpenAnim (AnimWindow *aw) {} /// To be run at the beginning of initiateCloseAnim. virtual void preInitiateCloseAnim (AnimWindow *aw) {} /// To be run at the beginning of initiateMinimizeAnim. virtual void preInitiateMinimizeAnim (AnimWindow *aw) {} /// To be run at the beginning of initiateUnminimizeAnim. virtual void preInitiateUnminimizeAnim (AnimWindow *aw) {} /// Initializes plugin's persistent animation data for a window (if any). virtual void initPersistentData (AnimWindow *aw) {} /// Destroys plugin's persistent animation data for a window (if any). virtual void destroyPersistentData (AnimWindow *aw) {} /// To be run at the end of updateEventEffects. virtual void postUpdateEventEffects (AnimEvent e, bool forRandom) {} /// To be run after the startup countdown ends. virtual void postStartupCountdown () {} virtual bool paintShouldSkipWindow (CompWindow *w) { return false; } virtual void cleanUpAnimation (bool closing, bool destructing) {} virtual void processAllRestacks () {} }; #endif ./plugins/animation/include/animation/animation.h0000644000004100000410000000307513246301623022442 0ustar www-datawww-data#ifndef _ANIMATION_H #define _ANIMATION_H #define ANIMATION_ABI 20091205 #include #include typedef enum { WindowEventOpen = 0, WindowEventClose, WindowEventMinimize, WindowEventUnminimize, WindowEventShade, WindowEventUnshade, WindowEventFocus, WindowEventNum, WindowEventNone } WindowEvent; typedef enum { AnimEventOpen = 0, AnimEventClose, AnimEventMinimize, AnimEventUnminimize, AnimEventShade, AnimEventFocus, AnimEventNum } AnimEvent; typedef enum { AnimDirectionDown = 0, AnimDirectionUp, AnimDirectionLeft, AnimDirectionRight, AnimDirectionRandom, AnimDirectionAuto } AnimDirection; extern const unsigned short LAST_ANIM_DIRECTION; class PrivateAnimScreen; class PrivateAnimWindow; class Animation; class AnimWindow; class AnimEffectInfo; typedef AnimEffectInfo * AnimEffect; #define RAND_FLOAT() ((float)rand() / RAND_MAX) #define sigmoid(fx) (1.0f/(1.0f+exp(-5.0f*2*((fx)-0.5)))) #define sigmoid2(fx, s) (1.0f/(1.0f+exp(-(s)*2*((fx)-0.5)))) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) #include "extensionplugin.h" #include "animeffect.h" #include "point3d.h" #include "persistent.h" #include "grid.h" #include "screen.h" #include "window.h" #include "transform.h" #include "fade.h" #include "partialwindow.h" #include "gridtransform.h" #include "zoom.h" #include "multi.h" // ratio of perceived length of animation compared to real duration // to make it appear to have the same speed with other animation effects #endif ./plugins/animation/include/animation/gridtransform.h0000644000004100000410000000121513246301623023336 0ustar www-datawww-data#ifndef ANIMATION_GRIDTRANSFORM_H #define ANIMATION_GRIDTRANSFORM_H #include "animation.h" class GridTransformAnim : public GridAnim, virtual public TransformAnim { public: GridTransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void updateTransform (GLMatrix &wTransform); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool requiresTransformedWindow () const { return true; } protected: bool mUsingTransform; ///< whether transform matrix is used (default: true) }; #endif ./plugins/animation/include/.directory0000644000004100000410000000006713246301623020336 0ustar www-datawww-data[Dolphin] ShowPreview=true Timestamp=2010,8,12,5,55,57 ./plugins/animation/docs/0000755000004100000410000000000013246301623015633 5ustar www-datawww-data./plugins/animation/docs/animation-class-hierarchy.odg0000644000004100000410000004166013246301623023373 0ustar www-datawww-dataPKD:.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKD: content.xml\Ɏ6S樅V`t 榒h[(md*/<S.ۤڲݩ>Ti!b_de|F0l0׏7o2"MJZ 3U|Sf* P@:2)UXQl>RެjQ \j kR֮:( UD4'3>M^Ua0<{Qلع4-9FߕqMKaxxvx$ax# !FhtT7"FDub6*:5\4僵8 3Sq 0Y l)2d6JZe/R=[phΟ] m 6^ct پ  bKGK +/L_.zboX\!cQ Bs ]bq9fb<̣ T.5AF+7SWeP㰻\%Dk&12wmhejA:/?rF$ 4<e40+Y 3$9!%W3-5Oe׵]Xd$LE—7 _A.s.ātos$ZHҒIZϚ:X9mni,)xb -v(:_ϯStl* KrK7$wP7AmTEC)Ltaq%K2D&cȻdȚ!]2dO֭wɐ3C]N;d YO2>42'k9jvN' S'm m&f稭'mRAR tlz>a ˔ACYG=KW_:E(XKk5O :9,Z +Z= i1=ؾ^zH+<_8)D͖+'uǴǢ "V]>9FK,,`jc'< ,<Ha(. (NH=e}jTvqlVqV D|%. r#Gw)(0>_YI07Q ?[ܕ*6R)@oC7LN&6Ar\Vhk6mo!aX|]drڐ Jav MՉ:ՕtyV\& \E:r\IkfȔbSH琩;hlMB_XN.0N'Rtdk$ nK" xb(;`{O Ůx.2Afx6ׄ0 Gw Ränn\I6D@H7 v-i}.k0ٔU^c5g9jO\b$У'm>QCBF [bĎ*?S߉0H8EKa =suayUCE呂jjSiKv|}waVuu6U)Z!0(o8vJ4MR>rHRHz,d={(UZ_o4(gzEviRPhm|EspODD.ׇG4};3JV**8."]lAʣ)cesj\-c\Ɖ#PKFUG_ dLPKD: styles.xmlZ]r6~)8̤o$;j9NOuS'HPB \_O@RDT"ǎL?`~ɨ ,(p,!r~w徿隥),aq\zBn)(bfs!A,G3XZifKR6T] oPe%E+ka[;h=TYzʆ*oR,+${Pݕh=1tknḑ+JNTbQײhItpD\da9ػ=0+n8*͐\ L;еl bFg5[U &v %>*DbnGcDqur~P.؝:jq+W ^ /| eH:<*QJf#O)'*}umȽ) 7*ׁ{sv_fND3 b$ 慊/smCSTҪ8"8]rTHֲHӼ-\(VJJDT" fFbJ(X|5 YAq͇RIJ(Le,SEJN'Xʨ~ڈ.)76@[Y!߬F\u`m)u'akO/3 1K^%)3;QL97Pn- 9.Wr-rDR|PI!5|Y%p 1+sa//Eyp| \Ws{Nkugm[j絀 5fS*cjNrܵ;J(`V1^~#N3n! OVhiǩIBUq(8ubӌr8: 4M8?%Ux hW|1WXYXͰt34;U|6QM\d;=~*%d\ p ;~݂ JPTnI=LsyFpk@8* u$GV&aSkBt&0k(2UvqDG4u= vHZgq<3fnt |Okڇ>>0JT7+4'QQ8YRxhr:tOV^,t"a$J=.6~M`^9ZubỶ:̡uIUS}>QE[hZGmvZG6U&25UWM'6Fb7qOvSeIqp=xj /9+ y-OT{{ϬbdHHWs`"YZwiEh ="QEJZ߷ÀR0noӡ]V9΅ߥ }=,oPK**.PKD:NgIYPPmeta.xml 2009-01-23T23:06:112009-07-13T03:38:56PT10H09M08S58OpenOffice.org/3.0$Unix OpenOffice.org_project/300m15$Build-9379PKD:Thumbnails/thumbnail.pngmuT[h]Dڸ,!;%Np <@pF>3wjժujUծ{>aj*rXTXWA^x xxx n4.|y_a20| |S++ oṟ9/oNtDI!:>ͭd$.@" &Cgy"U ԅi" 6|!9I#Jd\yG4l#P8! 9*=,P@+}!N.oO~Ҝʹ p ?,7$ wFIq3J b}= `Ձ1C #Np|DX(qk@lyOy5ZZ {@L o3RBP >;A2|5CG|sҧgDwPp׊vgD/cжW=h4ΉǝR5}'芜Mf,%7nxa:bd5d7t mj@$ &kO4$ٓ&-8%y"gd:IiV|zHD\3[}j"y2 M(^1\  [BFU+:q}!QH*4{z'Vs&'+vu!~pr2N!} h-_v3PS82حXEQ.NaI}2:DK ೤] Ր++2iVWu%5jYfEƕSG`}>_y-O#UFA=KСFlW&70O;i |թq/uY+`rZI{M7[^ *NUQ>!zl8o2xtcz9KV|+).29 W'Eۖ=1T藄k1ܗ_ ?U8q(Cltru10SA0\if\VN$v`΄z%Rڳ CN9/|X,? h|}VwZ@>HFWjR;}wø(WCECw&685t[SD#!%@og Hfu]M_p=UidM)=/:6~R]]\\u΋ǐH{F5JO^[F5EjĞnhMDЀ+$?\-7?Fm%y"sʽYQVkQXZw1ERQ *l=$?S9jUkz#%Uct^E 8\<%YȒ.׺^I "$]8e E5`hN}ѵVݣ ?E98NxЬV%WUV\~`d9jT@GŴ;S+q0 p3]Q)ŭԝELJpP_uQr*-(R=hiӴ5m@V3X0WV'sjƐ6Y75_ramr MY{$ m68]FWƓ#`^|"v|ሚTUÛީW]9DkUvSoii~yƴM2߃ggF7/Ā̞[ s #O]XsKCd<>@@v/'>klXo"[D4a}tᖈ8wʷm2"B̗9b흣>GX'?eГInzߢsyj:!?R=qZ[|lc|O,Edkp{;KUwZsj=7k8HɢH[cmHV?b@kr2Z1 3{ea?%!$`Wc0)27O ΁cvOETIz@k0MZmC_@1`?,u5'l{6C) 9[j|gӽ>@/M"|J%bcʱ].*=:rj?Y:vœЊ#W,bcFsP{%>ધ|@l6Mh}S:Gb&|T#h>$`Nn,ModDE ܎LWHٴWo5eR4*6Pl>^tgM !QVFOm |ciiBr6/w{Ao#[_SMq[0FUI7+,i+? ԏ4ajhލe@xrjJ|SO߬jL(`![ƋKk!E9qlL~ҥ`R/՗?:(U20ϤR2 4* W" -HSP ;W05RztCO=O z@,݆웩T ѳ[WƶW!v_#S,%dbr:bN [ yz)Y0i7*oΎ]')>0?S _oQZoZo3қ`< ]ɅfRpDDOR ڄ;f0ޖt|O1 /1/}sX"YiA+ O_{Ng_ aìϕҐ6c'UX:/m֕{crė] C%M0Iͫ`1 ya-obzη"]eP447mENHӴM9AK{♜yGh=D&u*rYW`mcqu-Φu=u [,^g P U}m]6l9Ob3/*J/mFzԴ1$gLͿh OڈZD ^M!ˢ ˸R,ztVwYyKYiT0Exr*\KZNXw=E~}Qpp=\e%R. 3FV<әԡ˭a\ 󏗧82>!vNܘ_r!($_րUEQ+TKGҭʕYt6A5WxƚbYKPw$u:s^J|m'eݺep`j|!Fv7T鷃sHKzzO.E`\ KuYѼ1Ac:(p|W{6M=uYy"oD9:̍%Hk y+ΧRTɜU t7VҶ"J2/RgѪ/Al2Е _+ěekI!-3:lA:Z./'`/)|(jo󗫿'U["2ݙP^DvE+zn`^_ ו>ƽp3e*rs|.4|1Lݛ)&CCbN=:j ÷rDvH;c`i{nT{g@p+; ڧ'7Dgx m87/TdSި]6a4T\XM,<vxËFUGy~ W8x:1RcSx#]~X-EP5ܴtcEu::Ն-vFor ȩX2ⴥ}6)y<.uJakɏ ]O^ɺ?7!C?;,HxJ!rjh\9Z"7}Y!jK=,VLf' c#@}=r!M{S򤋳뿿8aH+yJټSDNG- j:<21O?^\=u;IdxcO/@;fs[jeUBc`*d; -%`w` %)wL-k 7v4^%--X>Kw>G Ur^uK՗L3kѵg{ x;5g1=;,9Mh,j7'ҵdw gSg{Nu5[3:!AĜx&5 /L h`M:RSA{_`vQh0pyT> C-DȾ.mAJ >Q=) hŽ<3.PɠQ\Ij&HdJM)ӶhZ[sq1Z3%!jkY@s jo[S^z! !R~m[ZH=C3UKF߻1eWl (Mc[:[sQ qAg j]9o?6^1kmjwF>ٴb~30V7|X^Z%)8EENp5zLۆ3؍$21a5RSj=~Io!ࡊ [h yae`|goлg=wTV0}tohċ*]p-K:bdl >#`YL+u5I0wىt23Ӱ5d->He XT o|~l3kU%qMf?c!̜j~m˕=M<+{5i-#A"V&c1~X9*SS؋*;N:dvj]7sAoKMǥCfC0ͥ԰F3\eX.~ŭiޟowt=?p/iYB֋młSBB7m 9Nm Ki=5BŹiLz'&1fz_`-ZI|u}d~? qf[m2FE6y%'U`;2~k K&v]QdžATMR'I*PK_eFv}?dsgK8ws^=!dڣ<mL&"L5`d-;Y!UzpbWW }2:c`t\˧{V]T [Ǔ3/>9晌F@len㲒G8{C#GӁozw]FnhGq%) 4 {?4YO72n u|wfӥ #X:4`YTqG y|^i>sӛ_tcAJǟMۯ8Sy!f:<%ewߪ<ڑ=>B}K3QFxF@o]"cbR<4Ab&9}S7 \v~%$b}S51[M^R[H[;Lse⥫# >avqKwi]=]2 (]{]~X7:2]5l&@0,H_ HQ0r5*ч?7r`8dF+SqI$? v0zG uY{w  4fqϯkTJeZt.pRR:6lY ԋzD B|) h=gǴ+-K<M`ޘ^7cAI~:jJ'N4ws&uPQPK21 !PKD:'Configurations2/accelerator/current.xmlPKPKD:Configurations2/progressbar/PKD:Configurations2/floater/PKD:Configurations2/popupmenu/PKD:Configurations2/menubar/PKD:Configurations2/toolbar/PKD:Configurations2/images/Bitmaps/PKD:Configurations2/statusbar/PKD: settings.xmlZS"9~šQW-D=En-43J2"&aXt̐A;_b BR`1| וssi4*Kec7H* *l`|aO^O`TҨVgpŤzpvvVoKRCe.Fg6D>(իUha^UeLYQ.bhG[N0f֙Wg-ʥ?G9l؁GC~蝥QRyCx@ٌRdZL1/shL9QG6vmq&鑹{D§ -jӦ,}"H EumanX>= DŽc3:fL4 NҺ-FLѕtJ/S}Fç!nMe)xEKA>qZp-k(}D{ CqĻ5΃inqXnG')ܐ$BV'vˡ_xK o)ޥ1Pxg)r|G崡/I!Cb|sj5al@*>ZHV9ޜm&\ˢ_SVZ)OpCl2:H2 )vR/É+-H=hu DƸ!˛-u4F܆?$8\'Fպ ,,. ם:'|s*&lFR9:c)00࣓yopyqW!aonI΀ℽ>֡-yuDPKg*U!PKD:META-INF/manifest.xmlMn0">q˪Z'I?ynH[;^{ks$ tʷ|/uXYpC<(}.Fjv`jVZEzTZ/+!0J>l`|ʽkV5a+ar%ck.C2i;srivEa][ڐ > ݻN)-%(RD[$P)~$g;dk =|l!do,lbȣ)8+5y325䟯rPKXpIePKD:.++mimetypePKD:FUG_ dL Qcontent.xmlPKD:**. styles.xmlPKD:NgIYPPVmeta.xmlPKD:21 !Thumbnails/thumbnail.pngPKD:'C7Configurations2/accelerator/current.xmlPKD:7Configurations2/progressbar/PKD:7Configurations2/floater/PKD: 8Configurations2/popupmenu/PKD:B8Configurations2/menubar/PKD:x8Configurations2/toolbar/PKD:8Configurations2/images/Bitmaps/PKD:8Configurations2/statusbar/PKD:g*U! #9settings.xmlPKD:XpIe >META-INF/manifest.xmlPK?./plugins/animation/src/0000755000004100000410000000000013246301624015473 5ustar www-datawww-data./plugins/animation/src/extensionplugin.cpp0000644000004100000410000005533113246301623021440 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * extensionplugin.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" ExtensionPluginAnimation::ExtensionPluginAnimation (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex), mAWinWasRestackedJustNow (false), mRestackAnimCount (0) { } ExtensionPluginAnimation::~ExtensionPluginAnimation () { } void ExtensionPluginAnimation::postPreparePaintGeneral () { if (mAWinWasRestackedJustNow) mAWinWasRestackedJustNow = false; } void ExtensionPluginAnimation::cleanUpParentChildChainItem (AnimWindow *aw) { PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *restackData = static_cast (itData->second); if (restackData->mWinThisIsPaintedBefore && !restackData->mWinThisIsPaintedBefore->destroyed ()) { RestackPersistentData *dataOther = static_cast (AnimWindow::get (restackData->mWinThisIsPaintedBefore)-> persistentData["restack"]); if (dataOther) dataOther->mWinToBePaintedBeforeThis = 0; } restackData->mWinThisIsPaintedBefore = 0; restackData->mMoreToBePaintedPrev = 0; restackData->mMoreToBePaintedNext = 0; } itData = aw->persistentData.find ("dodge"); if (itData != aw->persistentData.end ()) // if found { DodgePersistentData *dodgeData = static_cast (itData->second); dodgeData->isDodgeSubject = false; dodgeData->skipPostPrepareScreen = false; } } bool ExtensionPluginAnimation::paintShouldSkipWindow (CompWindow *w) { AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *data = static_cast (itData->second); // Increment (glPaint) visit count ++data->mVisitCount; // If the window is (to be) painted somewhere other than in its // original stacking order, we don't need to paint it now. if (aw->curAnimation ()->info ()->isRestackAnim && dynamic_cast (aw->curAnimation ())->paintedElsewhere ()) return true; } return false; } /// Returns whether this window is relevant for fade focus. bool ExtensionPluginAnimation::relevantForRestackAnim (CompWindow *w) { unsigned int wmType = w->wmType (); if (!((wmType & // these two are to be used as "host" windows // to host the painting of windows being focused // at a stacking order lower than them (CompWindowTypeDockMask | CompWindowTypeSplashMask)) || wmType == CompWindowTypeNormalMask || wmType == CompWindowTypeDialogMask || wmType == CompWindowTypeUtilMask || wmType == CompWindowTypeUnknownMask)) { return false; } return !w->destroyed (); } void ExtensionPluginAnimation::prePreparePaintGeneral () { if (!mAWinWasRestackedJustNow) return; bool focusAnimInitiated = false; AnimScreen *as = AnimScreen::get (::screen); // Go in reverse order so that restack chains are handled properly for (CompWindowVector::reverse_iterator rit = mLastClientList.rbegin (); rit != mLastClientList.rend (); ++rit) { CompWindow *w = (*rit); AnimWindow *aw = AnimWindow::get (w); RestackPersistentData *data = static_cast (aw->persistentData["restack"]); if (!data) continue; RestackInfo *restackInfo = data->restackInfo (); if (!restackInfo) continue; data->mIsSecondary = false; if (as->otherPluginsActive () || // Don't initiate focus anim for current dodgers aw->curAnimation () || // Don't initiate focus anim for windows being passed thru data->mWinPassingThrough || // Don't animate with stale restack info !restackInfoStillGood (restackInfo)) { data->resetRestackInfo (true); continue; } // Find the first window at a higher stacking order than w CompWindow *nw; for (nw = w->next; nw; nw = nw->next) if (relevantForRestackAnim (nw)) break; // If w is being lowered, there has to be a window // at a higher stacking position than w (like a panel) // which this w's copy can be painted before. // Otherwise the animation will only show w fading in // rather than 2 copies of it cross-fading. if (!restackInfo->raised && !nw) { // Free unnecessary restackInfo data->resetRestackInfo (true); continue; } // Check if above window is focus-fading/dodging too. // (like a dialog of an app. window) // If so, focus-fade/dodge this together with the one above // (link to it) if (nw) { RestackPersistentData *dataNext = static_cast (AnimWindow::get (nw)->persistentData["restack"]); if (dataNext && dataNext->restackInfo () && wontCreateCircularChain (w, nw)) { // Link the two dataNext->mMoreToBePaintedPrev = w; data->mMoreToBePaintedNext = nw; // so far, bottommost on chain data->mMoreToBePaintedPrev = 0; } } else { // Reset chain connections as this is not (yet) on a chain data->mMoreToBePaintedNext = 0; data->mMoreToBePaintedPrev = 0; } } // Now initiate focus animations (after the restack chains are formed // right above) for (CompWindowVector::reverse_iterator rit = mLastClientList.rbegin (); rit != mLastClientList.rend (); ++rit) { CompWindow *w = (*rit); AnimWindow *aw = AnimWindow::get (w); RestackPersistentData *data = static_cast (aw->persistentData["restack"]); if (!data) continue; RestackInfo *restackInfo = data->restackInfo (); if (restackInfo) { if (as->initiateFocusAnim (aw)) focusAnimInitiated = true; else data->resetRestackInfo (true); } } if (!focusAnimInitiated) resetStackingInfo (); if (!focusAnimInitiated || as->otherPluginsActive () || !as->isAnimEffectPossible (AnimEffectDodge)) // Only dodge stuff below return; // Calculate dodge amounts foreach (CompWindow *w, mLastClientList) { AnimWindow *aw = AnimWindow::get (w); Animation *curAnim = aw->curAnimation (); if (!curAnim || curAnim->info () != AnimEffectDodge) continue; // Only process subjects with a dodge chain DodgePersistentData *dodgeData = static_cast (aw->persistentData["dodge"]); if (!dodgeData || !dodgeData->dodgeChainStart || !dodgeData->isDodgeSubject) continue; dynamic_cast (curAnim)->calculateDodgeAmounts (); } // TODO consider removing this loop and skipPostPrepareScreen for (CompWindowVector::reverse_iterator rit = mLastClientList.rbegin (); rit != mLastClientList.rend (); ++rit) { CompWindow *w = (*rit); AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("dodge"); if (itData == aw->persistentData.end ()) // if not found continue; DodgePersistentData *data = static_cast (itData->second); if (!data->isDodgeSubject) continue; bool dodgersAreOnlySubjects = true; CompWindow *dw; DodgePersistentData *dataDodger; for (dw = data->dodgeChainStart; dw; dw = dataDodger->dodgeChainNext) { dataDodger = static_cast (AnimWindow::get (dw)->persistentData["dodge"]); if (!dataDodger) break; if (!dataDodger->isDodgeSubject) dodgersAreOnlySubjects = false; } if (dodgersAreOnlySubjects) data->skipPostPrepareScreen = true; } } void ExtensionPluginAnimation::handleRestackNotify (AnimWindow *aw) { const CompWindowVector &clients = ::screen->clientList (); // Only handle restack notifies when the window is (or was) on the client // list (i.e. not for menus, combos, etc.). if (find (clients.begin (), clients.end (), aw->mWindow) == clients.end () && find (mLastClientList.begin (), mLastClientList.end (), aw->mWindow) == mLastClientList.end ()) return; bool winOpenedClosed = false; unsigned int n = clients.size (); if (n != mLastClientList.size ()) winOpenedClosed = true; // if restacking occurred and not window open/close if (!winOpenedClosed) { RestackPersistentData *data = static_cast (aw->persistentData["restack"]); data->mConfigureNotified = true; // Find which window is restacked // e.g. here 8507730 was raised: // 54526074 8507730 48234499 14680072 6291497 // 54526074 48234499 14680072 8507730 6291497 // compare first changed win. of row 1 with last // changed win. of row 2, and vica versa // the matching one is the restacked one CompWindow *wRestacked = 0; CompWindow *wStart = 0; CompWindow *wEnd = 0; CompWindow *wOldAbove = 0; CompWindow *wChangeStart = 0; CompWindow *wChangeEnd = 0; bool raised = false; int changeStart = -1; int changeEnd = -1; for (unsigned int i = 0; i < n; ++i) { CompWindow *wi = clients[i]; // skip if minimized (prevents flashing problem) if (!wi || wi->destroyed ()) continue; // TODO find another filter criteria for Group plugin // because some apps like gedit sets its open dialog // to skip taskbar too, which shouldn't be ignored here. /* // skip if (tabbed and) hidden by Group plugin // unless it's a dock/panel if (!(wi->wmType () & CompWindowTypeDockMask) && (wi->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask))) continue; */ if (wi != mLastClientList[i]) { if (changeStart < 0) { changeStart = (int)i; wChangeStart = wi; // make use of already found w } else { changeEnd = (int)i; wChangeEnd = wi; } } else if (changeStart >= 0) // found some change earlier break; } // if restacking occurred if (changeStart >= 0 && changeEnd >= 0) { // if we have only 2 windows changed, // choose the one clicked on bool preferRaised = false; bool onlyTwo = false; if (wChangeEnd && clients[(unsigned)changeEnd] == mLastClientList[(unsigned)changeStart] && clients[(unsigned)changeStart] == mLastClientList[(unsigned)changeEnd]) { // Check if the window coming on top was // mConfigureNotified (clicked on) RestackPersistentData *data = static_cast (AnimWindow::get (wChangeEnd)-> persistentData["restack"]); if (data->mConfigureNotified) preferRaised = true; onlyTwo = true; } // Clear all mConfigureNotified's foreach (CompWindow *w2, CompositeScreen::get (::screen)->getWindowPaintList ()) { RestackPersistentData *data = static_cast (AnimWindow::get (w2)->persistentData["restack"]); data->mConfigureNotified = false; } if (preferRaised || (!onlyTwo && clients[(unsigned)changeEnd] == mLastClientList[(unsigned)changeStart])) { // raised raised = true; wRestacked = wChangeEnd; wStart = wChangeStart; wEnd = wRestacked; wOldAbove = wStart; } else if ((unsigned int)changeEnd < n - 1 && clients[(unsigned)changeStart] == mLastClientList[(unsigned)changeEnd]) // lowered // We don't animate lowering if there is no // window above this window, since this window needs // to be drawn on such a "host" in animPaintWindow // (at least for now). { wRestacked = wChangeStart; wStart = wRestacked; wEnd = wChangeEnd; wOldAbove = mLastClientList[(unsigned)(changeEnd + 1)]; } for (; wOldAbove; wOldAbove = wOldAbove->next) if (!wOldAbove->destroyed ()) break; } if (wRestacked && wStart && wEnd && wOldAbove) { AnimWindow *awRestacked = AnimWindow::get (wRestacked); RestackPersistentData *data = static_cast (awRestacked->persistentData["restack"]); { data->setRestackInfo (wRestacked, wStart, wEnd, wOldAbove, raised); mAWinWasRestackedJustNow = true; } } } updateLastClientList (); } void ExtensionPluginAnimation::updateLastClientList () { mLastClientList = ::screen->clientList (); } /// Returns true if linking wCur to wNext would not result /// in a circular chain being formed. bool ExtensionPluginAnimation::wontCreateCircularChain (CompWindow *wCur, CompWindow *wNext) { RestackPersistentData *dataNext = 0; while (wNext) { if (wNext == wCur) // would form circular chain return false; dataNext = static_cast (AnimWindow::get (wNext)->persistentData["restack"]); if (!dataNext) return false; wNext = dataNext->mMoreToBePaintedNext; } return true; } void ExtensionPluginAnimation::postUpdateEventEffects (AnimEvent e, bool forRandom) { AnimScreen *as = AnimScreen::get (::screen); // If a restacking anim. is (now) possible if (e == AnimEventFocus) { if (as->isRestackAnimPossible ()) { // Update the stored window list so that we have an up-to-date list, // since that list wasn't updated while a restacking animation // was not possible. updateLastClientList (); foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); // Allocate persistent restack data if it doesn't already exist if (aw->persistentData.find ("restack") != aw->persistentData.end ()) continue; aw->persistentData["restack"] = new RestackPersistentData (); } } if (as->isAnimEffectPossible (AnimEffectDodge)) { foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); // Allocate persistent dodge data if it doesn't already exist if (aw->persistentData.find ("dodge") != aw->persistentData.end ()) continue; aw->persistentData["dodge"] = new DodgePersistentData (); } } } } void ExtensionPluginAnimation::initPersistentData (AnimWindow *aw) { AnimScreen *as = AnimScreen::get (::screen); // TODO: Optimize (via caching isRestackAnimPossible, isAnimEffectPossible) // Only allocate restack data when restack animation is possible if (as->isRestackAnimPossible () && // doesn't exist yet aw->persistentData.find ("restack") == aw->persistentData.end ()) aw->persistentData["restack"] = new RestackPersistentData (); if (as->isAnimEffectPossible (AnimEffectDodge) && // doesn't exist yet aw->persistentData.find ("dodge") == aw->persistentData.end ()) aw->persistentData["dodge"] = new DodgePersistentData (); if (aw->persistentData.find ("multi") == aw->persistentData.end ()) aw->persistentData["multi"] = new MultiPersistentData (); } void ExtensionPluginAnimation::destroyPersistentData (AnimWindow *aw) { aw->deletePersistentData ("restack"); aw->deletePersistentData ("dodge"); } void ExtensionPluginAnimation::incrementCurRestackAnimCount () { ++mRestackAnimCount; // Enable custom paint list when there is now a restack anim happening if (mRestackAnimCount == 1) AnimScreen::get (::screen)->enableCustomPaintList (true); } void ExtensionPluginAnimation::decrementCurRestackAnimCount () { --mRestackAnimCount; // Disable custom paint list when there is no more a restack anim happening if (mRestackAnimCount == 0) AnimScreen::get (::screen)->enableCustomPaintList (false); } bool ExtensionPluginAnimation::restackInfoStillGood (RestackInfo *restackInfo) { bool wStartGood = false; bool wEndGood = false; bool wOldAboveGood = false; bool wRestackedGood = false; foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); if (aw->mWindow->destroyed ()) continue; if (restackInfo->wStart == w) wStartGood = true; if (restackInfo->wEnd == w) wEndGood = true; if (restackInfo->wRestacked == w) wRestackedGood = true; if (restackInfo->wOldAbove == w) wOldAboveGood = true; } return (wStartGood && wEndGood && wOldAboveGood && wRestackedGood); } /// Resets stacking related info. void ExtensionPluginAnimation::resetStackingInfo () { foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *data = static_cast (itData->second); data->mConfigureNotified = false; if (data->restackInfo ()) data->resetRestackInfo (); } } } void ExtensionPluginAnimation::postStartupCountdown () { updateLastClientList (); } void ExtensionPluginAnimation::preInitiateOpenAnim (AnimWindow *aw) { // Only do when the window is on the client list // (i.e. not for menus, combos, etc.). if (find (::screen->clientList ().begin (), ::screen->clientList ().end (), aw->mWindow) != ::screen->clientList ().end ()) { resetStackingInfo (); updateLastClientList (); } } void ExtensionPluginAnimation::preInitiateCloseAnim (AnimWindow *aw) { preInitiateOpenAnim (aw); } void ExtensionPluginAnimation::preInitiateMinimizeAnim (AnimWindow *aw) { preInitiateOpenAnim (aw); } void ExtensionPluginAnimation::preInitiateUnminimizeAnim (AnimWindow *aw) { preInitiateOpenAnim (aw); } void ExtensionPluginAnimation::cleanUpAnimation (bool closing, bool destructing) { if (closing || destructing) updateLastClientList (); } /// Go to the bottommost window in this "focus chain" /// This chain is used to handle some cases: e.g when Find dialog /// of an app is open, both windows should be faded when the Find /// dialog is raised. CompWindow * ExtensionPluginAnimation::getBottommostInExtendedFocusChain (CompWindow *wStartPoint) { if (!wStartPoint) return 0; RestackPersistentData *data = static_cast (AnimWindow::get (wStartPoint)->persistentData["restack"]); CompWindow *wBottommost = data->mWinToBePaintedBeforeThis; if (!wBottommost || wBottommost->destroyed ()) return wStartPoint; RestackPersistentData *dataBottommost = static_cast (AnimWindow::get (wBottommost)->persistentData["restack"]); CompWindow *wPrev = dataBottommost->mMoreToBePaintedPrev; while (wPrev) { wBottommost = wPrev; RestackPersistentData *dataPrev = static_cast (AnimWindow::get (wPrev)->persistentData["restack"]); wPrev = dataPrev->mMoreToBePaintedPrev; } return wBottommost; } /// Finds the bottommost subject in restack chain, /// simpler version of getBottommostInExtendedFocusChain. CompWindow * ExtensionPluginAnimation::getBottommostInRestackChain (CompWindow *wStartPoint) { CompWindow *wBottommost = wStartPoint; RestackPersistentData *dataCur; for (CompWindow *wCur = wStartPoint; wCur; wCur = dataCur->mMoreToBePaintedPrev) { wBottommost = wCur; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } return wBottommost; } void ExtensionPluginAnimation::resetMarks () { foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ()) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); data->mWalkerOverNewCopy = false; data->mVisitCount = 0; } } void ExtensionPluginAnimation::prePaintWindowsBackToFront () { resetMarks (); } CompWindow * ExtensionPluginAnimation::walkFirst () { resetMarks (); CompWindow *w = getBottommostInExtendedFocusChain (*CompositeScreen::get (::screen)->getWindowPaintList ().begin ()); if (w) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); ++data->mVisitCount; } return w; } bool ExtensionPluginAnimation::markNewCopy (CompWindow *w) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); // if window is in a focus chain if (data->mWinThisIsPaintedBefore || data->mMoreToBePaintedPrev) { data->mWalkerOverNewCopy = true; return true; } return false; } CompWindow * ExtensionPluginAnimation::walkNext (CompWindow *w) { RestackPersistentData *data = static_cast (AnimWindow::get (w)->persistentData["restack"]); CompWindow *wRet = 0; if (!data->mWalkerOverNewCopy) { // Within a chain? (not the 1st or 2nd window) if (data->mMoreToBePaintedNext) wRet = data->mMoreToBePaintedNext; else if (data->mWinThisIsPaintedBefore) // 2nd one in chain? wRet = data->mWinThisIsPaintedBefore; } else data->mWalkerOverNewCopy = false; if (!wRet && w->next && markNewCopy (w->next)) wRet = w->next; else if (!wRet) wRet = getBottommostInExtendedFocusChain (w->next); if (wRet) { RestackPersistentData *dataRet = static_cast (AnimWindow::get (wRet)->persistentData["restack"]); // Prevent cycles, which cause freezes if (dataRet->mVisitCount > 1) // each window is visited at most twice return 0; ++dataRet->mVisitCount; } return wRet; } const CompWindowList & ExtensionPluginAnimation::getWindowPaintList () { mWindowList.clear (); for (CompWindow *w = walkFirst (); w; w = walkNext (w)) mWindowList.push_back (w); return mWindowList; } ./plugins/animation/src/restack.cpp0000644000004100000410000002620713246301623017641 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * restack.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Restack ========================= RestackAnim::RestackAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon) { mRestackData = static_cast (AnimWindow::get (w)->persistentData["restack"]); } void RestackAnim::cleanUp (bool closing, bool destructing) { if (mRestackData->restackInfo ()) mRestackData->resetRestackInfo (); bool thereIsUnfinishedChainElem = false; // Look for still playing windows in parent-child chain CompWindow *wCur = mRestackData->mMoreToBePaintedNext; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); if (awCur->curAnimation () && awCur->curAnimation ()->remainingTime () > 0) { thereIsUnfinishedChainElem = true; break; } RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedNext; } if (!thereIsUnfinishedChainElem) { wCur = mRestackData->mMoreToBePaintedPrev; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); if (awCur->curAnimation () && awCur->curAnimation ()->remainingTime () > 0) { thereIsUnfinishedChainElem = true; break; } RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedPrev; } } if (closing || destructing || !thereIsUnfinishedChainElem) { // Finish off all windows in parent-child chain CompWindow *wCur = mRestackData->mMoreToBePaintedNext; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedNext; static_cast (getExtensionPluginInfo ())->cleanUpParentChildChainItem (awCur); } wCur = mWindow; while (wCur) { AnimWindow *awCur = AnimWindow::get (wCur); RestackPersistentData *dataCur = static_cast (awCur->persistentData["restack"]); wCur = dataCur->mMoreToBePaintedPrev; static_cast (getExtensionPluginInfo ())->cleanUpParentChildChainItem (awCur); } } ExtensionPluginAnimation *extPlugin = static_cast (getExtensionPluginInfo ()); extPlugin->decrementCurRestackAnimCount (); } bool RestackAnim::initiateRestackAnim (int duration) { CompWindow *wStart = 0; CompWindow *wEnd = 0; CompWindow *wOldAbove = 0; if (!mRestackData) return false; ExtensionPluginAnimation *extPlugin = static_cast (getExtensionPluginInfo ()); extPlugin->incrementCurRestackAnimCount (); // If a focus chain (application with open dialog, etc.) is the subject, // in compiz++, their order changes during restack (which wasn't the case // in compiz 0.8. e.g: (subject chain: a b, dodger: x) (a: secondary) // a b x // b x a // x a b if (mRestackData->mIsSecondary) { if (!mRestackData->mMoreToBePaintedNext) return false; AnimWindow *awAbove = AnimWindow::get (mRestackData->mMoreToBePaintedNext); RestackPersistentData *dataAbove = static_cast (awAbove->persistentData["restack"]); mTotalTime = awAbove->curAnimation ()->totalTime (); mRemainingTime = mTotalTime; if (dataAbove && dataAbove->mWinThisIsPaintedBefore) { // Host this subject instead, on the above subject's host mRestackData->getHostedOnWin (mWindow, dataAbove->mWinThisIsPaintedBefore); } // do basic secondary subject initialization postInitiateRestackAnim (0, 0, 0, 0, false); return true; // We're done here } RestackInfo *restackInfo = mRestackData->restackInfo (); bool raised = true; if (restackInfo) { wStart = restackInfo->wStart; wEnd = restackInfo->wEnd; wOldAbove = restackInfo->wOldAbove; raised = restackInfo->raised; } // Find union region of all windows that will be // faded through by w. If the region is empty, don't // run focus fade effect. CompRegion fadeRegion; int numSelectedCandidates = 0; CompRegion subjectsRegion (unionRestackChain (mWindow)); // Compute subject win. region // wCand: Dodge or Focus fade candidate window for (CompWindow *wCand = wStart; wCand && wCand != wEnd->next; wCand = wCand->next) { RestackPersistentData *dataCand = static_cast (AnimWindow::get (wCand)->persistentData["restack"]); if (!extPlugin->relevantForRestackAnim (wCand)) continue; // Skip windows that have been restacked if (wCand != wEnd && dataCand->restackInfo ()) continue; if (wCand->minimized ()) continue; if (!CompositeWindow::get (wCand)->pixmap ()) continue; if (onSameRestackChain (mWindow, wCand)) continue; // Compute intersection of this (wCand) with subject CompRegion candidateWinRegion (wCand->borderRect ()); CompRegion candidateAndSubjectIntersection (candidateWinRegion.intersected (subjectsRegion)); fadeRegion += candidateAndSubjectIntersection; if (!candidateAndSubjectIntersection.isEmpty ()) processCandidate (wCand, mWindow, candidateAndSubjectIntersection, numSelectedCandidates); } if (fadeRegion.isEmpty ()) // empty intersection -> won't be drawn return false; if (wOldAbove) // Store this window in the next window // so that this is drawn before that, i.e. in its old place mRestackData->getHostedOnWin (mWindow, wOldAbove); postInitiateRestackAnim (numSelectedCandidates, duration, wStart, wEnd, raised); // Handle other subjects down the chain if there are any if (mRestackData->mMoreToBePaintedPrev) { RestackPersistentData *dataCur; for (CompWindow *wCur = mRestackData->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; dataCur->mIsSecondary = true; } } return true; } bool RestackAnim::onSameRestackChain (CompWindow *wSubject, CompWindow *wOther) { RestackPersistentData *dataCur; for (CompWindow *wCur = wSubject; wCur; wCur = dataCur->mMoreToBePaintedNext) { if (wOther == wCur) return true; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } RestackPersistentData *dataSubj = static_cast (AnimWindow::get (wSubject)-> persistentData["restack"]); for (CompWindow *wCur = dataSubj->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { if (wOther == wCur) return true; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } return false; } bool RestackAnim::overNewCopy () { bool lowering = (mRestackData->restackInfo () && !mRestackData->restackInfo ()->raised); // Reverse behavior if lowering (i.e. not raising) return ((!lowering && mRestackData->mVisitCount == 2) || (lowering && mRestackData->mVisitCount == 1)); } CompRegion RestackAnim::unionRestackChain (CompWindow *w) { CompRegion unionRegion; RestackPersistentData *dataCur; for (CompWindow *wCur = w; wCur; wCur = dataCur->mMoreToBePaintedNext) { unionRegion += wCur->borderRect (); dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } RestackPersistentData *dataSubj = static_cast (AnimWindow::get (w)-> persistentData["restack"]); for (CompWindow *wCur = dataSubj->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { unionRegion += wCur->borderRect (); dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } return unionRegion; } RestackInfo::RestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised) : wRestacked (wRestacked), wStart (wStart), wEnd (wEnd), wOldAbove (wOldAbove), raised (raised) { } RestackPersistentData::RestackPersistentData () : PersistentData (), mRestackInfo (0), mWinToBePaintedBeforeThis (0), mWinThisIsPaintedBefore (0), mMoreToBePaintedPrev (0), mMoreToBePaintedNext (0), mConfigureNotified (false), mWinPassingThrough (0), mWalkerOverNewCopy (false), mVisitCount (0), mIsSecondary (false) { } RestackPersistentData::~RestackPersistentData () { if (mRestackInfo) delete mRestackInfo; } void RestackPersistentData::resetRestackInfo (bool alsoResetChain) { delete mRestackInfo; mRestackInfo = 0; if (alsoResetChain) { // Reset chain connections as this is not on a chain mMoreToBePaintedNext = 0; mMoreToBePaintedPrev = 0; } } void RestackPersistentData::setRestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised) { if (mRestackInfo) delete mRestackInfo; mRestackInfo = new RestackInfo (wRestacked, wStart, wEnd, wOldAbove, raised); } /// Make this window be hosted on (i.e. drawn before) the given window. void RestackPersistentData::getHostedOnWin (CompWindow *wGuest, CompWindow *wHost) { RestackPersistentData *dataHost = static_cast (AnimWindow::get (wHost)->persistentData["restack"]); dataHost->mWinToBePaintedBeforeThis = wGuest; mWinThisIsPaintedBefore = wHost; } ./plugins/animation/src/magiclamp.cpp0000644000004100000410000003362713246301623020143 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * magiclamp.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Magic Lamp ========================= void MagicLampAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampGridRes); } void MagicLampWavyAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); } MagicLampAnim::MagicLampAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), GridAnim::GridAnim (w, curWindowEvent, duration, info, icon), mTopLeftCornerObject (0), mBottomLeftCornerObject (0) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : w->outputRect ()); mTargetTop = ((outRect.y () + outRect.height () / 2) > (icon.y () + icon.height () / 2)); mUseQTexCoord = true; } MagicLampWavyAnim::MagicLampWavyAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), MagicLampAnim::MagicLampAnim (w, curWindowEvent, duration, info, icon) { unsigned int maxWaves = (unsigned) optValI (AnimationOptions::MagicLampWavyMaxWaves); float waveAmpMin = optValF (AnimationOptions::MagicLampWavyAmpMin); float waveAmpMax = optValF (AnimationOptions::MagicLampWavyAmpMax); float distance; if (waveAmpMax < waveAmpMin) waveAmpMax = waveAmpMin; // Initialize waves CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : w->outputRect ()); if (mTargetTop) distance = outRect.y () + outRect.height () - mIcon.y (); else distance = mIcon.y () - outRect.y (); mNumWaves = 1 + (float)maxWaves * distance / ::screen->height (); mWaves = new WaveParam[mNumWaves]; // Compute wave parameters int ampDirection = (RAND_FLOAT () < 0.5 ? 1 : -1); float minHalfWidth = 0.22f; float maxHalfWidth = 0.38f; for (unsigned int i = 0; i < mNumWaves; ++i) { mWaves[i].amp = ampDirection * (waveAmpMax - waveAmpMin) * rand () / RAND_MAX + ampDirection * waveAmpMin; mWaves[i].halfWidth = RAND_FLOAT () * (maxHalfWidth - minHalfWidth) + minHalfWidth; // avoid offset at top and bottom part by added waves float availPos = 1 - 2 * mWaves[i].halfWidth; float posInAvailSegment = 0; if (i > 0) posInAvailSegment = (availPos / mNumWaves) * RAND_FLOAT (); mWaves[i].pos = (posInAvailSegment + i * availPos / mNumWaves + mWaves[i].halfWidth); // switch wave direction ampDirection *= -1; } } MagicLampWavyAnim::~MagicLampWavyAnim () { delete[] mWaves; } /// Makes sure the window gets fully damaged with /// effects that possibly have models that don't cover /// the whole window (like in MagicLampAnim with menus). MagicLampAnim::~MagicLampAnim () { if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade) mAWindow->expandBBWithWindow (); } bool MagicLampWavyAnim::hasMovingEnd () { return optValB (AnimationOptions::MagicLampWavyMovingEnd); } bool MagicLampAnim::hasMovingEnd () { return optValB (AnimationOptions::MagicLampMovingEnd); } /// Applies waves (at each step of the animation). void MagicLampWavyAnim::filterTargetX (float &targetX, float x) { for (unsigned int i = 0; i < mNumWaves; ++i) { float cosx = ((x - mWaves[i].pos) / mWaves[i].halfWidth); if (cosx < -1 || cosx > 1) continue; targetX += (mWaves[i].amp * mModel->scale ().x () * (cos (cosx * M_PI) + 1) / 2); } } void MagicLampAnim::step () { if ((curWindowEvent () == WindowEventOpen || curWindowEvent () == WindowEventClose) && hasMovingEnd ()) { short x, y; // Update icon position AnimScreen::get (::screen)->getMousePointerXY (&x, &y); mIcon.setX (x); mIcon.setY (y); } float forwardProgress = progressLinear (); float iconCloseEndY; float iconFarEndY; float winFarEndY; float winVisibleCloseEndY; CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); float iconShadowLeft = ((float)(outRect.x () - inRect.x ())) * mIcon.width () / mWindow->width (); float iconShadowRight = ((float)(outRect.x2 () - inRect.x2 ())) * mIcon.width () / mWindow->width (); float sigmoid0 = sigmoid (0); float sigmoid1 = sigmoid (1); float winw = outRect.width (); float winh = outRect.height (); if (mTargetTop) { iconFarEndY = mIcon.y (); iconCloseEndY = mIcon.y () + mIcon.height (); winFarEndY = outRect.y () + winh; winVisibleCloseEndY = outRect.y (); if (winVisibleCloseEndY < iconCloseEndY) winVisibleCloseEndY = iconCloseEndY; } else { iconFarEndY = mIcon.y () + mIcon.height (); iconCloseEndY = mIcon.y (); winFarEndY = outRect.y (); winVisibleCloseEndY = outRect.y () + winh; if (winVisibleCloseEndY > iconCloseEndY) winVisibleCloseEndY = iconCloseEndY; } float preShapePhaseEnd = 0.22f; float preShapeProgress = 0; float postStretchProgress = 0; float stretchProgress = 0; float stretchPhaseEnd = preShapePhaseEnd + (1 - preShapePhaseEnd) * (iconCloseEndY - winVisibleCloseEndY) / ((iconCloseEndY - winFarEndY) + (iconCloseEndY - winVisibleCloseEndY)); if (stretchPhaseEnd < preShapePhaseEnd + 0.1) stretchPhaseEnd = preShapePhaseEnd + 0.1; if (forwardProgress < preShapePhaseEnd) { preShapeProgress = forwardProgress / preShapePhaseEnd; // Slow down "shaping" toward the end preShapeProgress = 1 - progressDecelerate (1 - preShapeProgress); } if (forwardProgress < preShapePhaseEnd) stretchProgress = forwardProgress / stretchPhaseEnd; else { if (forwardProgress < stretchPhaseEnd) stretchProgress = forwardProgress / stretchPhaseEnd; else postStretchProgress = (forwardProgress - stretchPhaseEnd) / (1 - stretchPhaseEnd); } // The other objects are squeezed into a horizontal line behind the icon int topmostMovingObjectIdx = -1; int bottommostMovingObjectIdx = -1; unsigned int n = mModel->numObjects (); float fx = 0.0f; GridModel::GridObject *object = mModel->objects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); float objGridX = object->gridPosition ().x (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); float origY = (mWindow->y () + (winh * objGridY - outExtents.top) * mModel->scale ().y ()); float iconY = (mIcon.y () + mIcon.height () * objGridY); float stretchedPos; if (mTargetTop) stretchedPos = objGridY * origY + (1 - objGridY) * iconY; else stretchedPos = (1 - objGridY) * origY + objGridY * iconY; // Compute current y position if (forwardProgress < preShapePhaseEnd) objPos.setY ((1 - stretchProgress) * origY + stretchProgress * stretchedPos); else { if (forwardProgress < stretchPhaseEnd) objPos.setY ((1 - stretchProgress) * origY + stretchProgress * stretchedPos); else objPos.setY ((1 - postStretchProgress) * stretchedPos + postStretchProgress * (stretchedPos + (iconCloseEndY - winFarEndY))); } if (mTargetTop) { // pick the first one that is below icon's bottom (close) edge if (objPos.y () > iconCloseEndY && topmostMovingObjectIdx < 0) topmostMovingObjectIdx = (int)i; if (objPos.y () < iconFarEndY) objPos.setY (iconFarEndY); } else { // pick the first one that is below icon's top (close) edge if (objPos.y () > iconCloseEndY && bottommostMovingObjectIdx < 0) bottommostMovingObjectIdx = (int)i; if (objPos.y () > iconFarEndY) objPos.setY (iconFarEndY); } fx = ((iconCloseEndY - objPos.y ()) / (iconCloseEndY - winFarEndY)); } else // object is at the right side { // Set y position to the y position of the object at the left // on the same row (previous object) objPos.setY ((object - 1)->position ().y ()); } float origX = (mWindow->x () + (winw * objGridX - outExtents.left) * mModel->scale ().x ()); float iconX = (mIcon.x () - iconShadowLeft) + (mIcon.width () + iconShadowLeft + iconShadowRight) * objGridX; // Compute "target shape" x position float fy = ((sigmoid (fx) - sigmoid0) / (sigmoid1 - sigmoid0)); float targetX = fy * (origX - iconX) + iconX; filterTargetX (targetX, fx); // Compute current x position if (forwardProgress < preShapePhaseEnd) objPos.setX ((1 - preShapeProgress) * origX + preShapeProgress * targetX); else objPos.setX (targetX); // No need to set objPos.z () to 0, since they won't be used // due to modelAnimIs3D being false for magic lamp. } if (stepRegionUsed ()) { // Pick objects that will act as the corners of rectangles subtracted // from this step's damaged region const float topCornerRowRatio = (mTargetTop ? 0.55 : 0.35);// 0.46 0.42; // rectangle corner row ratio const float bottomCornerRowRatio = (mTargetTop ? 0.65 : 0.42);// 0.46 0.42; // rectangle corner row ratio if (topmostMovingObjectIdx < 0) topmostMovingObjectIdx = 0; if (bottommostMovingObjectIdx < 0) bottommostMovingObjectIdx = (int)n - 2; int nRows = (bottommostMovingObjectIdx - topmostMovingObjectIdx) / 2; int firstMovingRow = topmostMovingObjectIdx / 2; mTopLeftCornerObject = &mModel->objects () [(int)(firstMovingRow + topCornerRowRatio * nRows) * 2]; mBottomLeftCornerObject = &mModel->objects () [(int)(firstMovingRow + bottomCornerRowRatio * nRows) * 2]; } } void MagicLampAnim::updateBB (CompOutput &output) { // Just consider the corner objects GridModel::GridObject *objects = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i) { Point3d &objPos = objects[i].position (); mAWindow->expandBBWithPoint (objPos.x () + 0.5, objPos.y () + 0.5); // skip to the last row after considering the first row // (each row has 2 objects) if (i == 1) i = n - 3; } // Subtract a rectangle from each bounding box corner left empty by // the animation mAWindow->resetStepRegionWithBB (); BoxPtr BB = mAWindow->BB (); CompRegion ®ion = mAWindow->stepRegion (); // Left side if (objects[0].position ().x () > objects[n-2].position ().x ()) { // Top-left corner is empty // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = mTopLeftCornerObject->position (); region -= CompRect (BB->x1, BB->y1, objPos.x () - BB->x1, objPos.y () - BB->y1); } else // Bottom-left corner is empty { // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = mBottomLeftCornerObject->position (); region -= CompRect (BB->x1, objPos.y (), objPos.x () - BB->x1, BB->y2); } // Right side if (objects[1].position ().x () < objects[n-1].position ().x ()) { // Top-right corner is empty // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = (mTopLeftCornerObject + 1)->position (); region -= CompRect (objPos.x (), BB->y1, BB->x2, objPos.y () - BB->y1); } else // Bottom-right corner is empty { // Position of grid object to pick as the corner of the subtracted rect. Point3d &objPos = (mBottomLeftCornerObject + 1)->position (); region -= CompRect (objPos.x (), objPos.y (), BB->x2, BB->y2); } } void MagicLampWavyAnim::updateBB (CompOutput &output) { GridAnim::updateBB (output); } void MagicLampAnim::adjustPointerIconSize () { mIcon.setWidth (MAX (4, optValI (AnimationOptions::MagicLampOpenStartWidth))); // Adjust position so that the icon is centered at the original position. mIcon.setX (mIcon.x () - mIcon.width () / 2); } void MagicLampWavyAnim::adjustPointerIconSize () { mIcon.setWidth (MAX (4, optValI (AnimationOptions::MagicLampWavyOpenStartWidth))); // Adjust position so that the icon is centered at the original position. mIcon.setX (mIcon.x () - mIcon.width () / 2); } ./plugins/animation/src/glide.cpp0000644000004100000410000001163713246301623017272 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * glide.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Glide ========================= GlideAnim::GlideAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), ZoomAnim::ZoomAnim (w, curWindowEvent, duration, info, icon), glideModRotAngle (0.0f) { } Glide2Anim::Glide2Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GlideAnim::GlideAnim (w, curWindowEvent, duration, info, icon) { } void GlideAnim::getParams (float *finalDistFac, float *finalRotAng, float *thickness) { *finalDistFac = optValF (AnimationOptions::Glide1AwayPosition); *finalRotAng = optValF (AnimationOptions::Glide1AwayAngle); } void Glide2Anim::getParams (float *finalDistFac, float *finalRotAng, float *thickness) { *finalDistFac = optValF (AnimationOptions::Glide2AwayPosition); *finalRotAng = optValF (AnimationOptions::Glide2AwayAngle); } float GlideAnim::getProgress () { float forwardProgress = progressLinear (); return progressDecelerate (forwardProgress); } float GlideAnim::getFadeProgress () { if (zoomToIcon ()) return ZoomAnim::getFadeProgress (); return getProgress (); } void GlideAnim::applyTransform () { if (zoomToIcon ()) ZoomAnim::applyTransform (); float finalDistFac; float finalRotAng; float thickness; getParams (&finalDistFac, &finalRotAng, &thickness); float forwardProgress; if (zoomToIcon ()) getZoomProgress (&forwardProgress, 0, true); else forwardProgress = getProgress (); float finalz = finalDistFac * 0.8 * DEFAULT_Z_CAMERA * ::screen->width (); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); GLVector rotAxis (1, 0, 0, 1); GLVector rotAxisOffset (outRect.x () + outRect.width () / 2.0f, outRect.y () + outRect.height () / 2.0f, 0, 1); GLVector translation (0, 0, finalz * forwardProgress, 1); float rotAngle = finalRotAng * forwardProgress; glideModRotAngle = fmodf (rotAngle + 720, 360.0f); // put back to window position mTransform.translate (rotAxisOffset); perspectiveDistortAndResetZ (mTransform); // animation movement mTransform.translate (translation); // animation rotation mTransform.rotate (rotAngle, rotAxis); mTransform.scale (1.0f, 1.0f, 1.0f); // place window rotation axis at origin mTransform.translate (-rotAxisOffset); } void GlideAnim::adjustDuration () { if (zoomToIcon ()) { mTotalTime *= kDurationFactor; mRemainingTime = mTotalTime; } } void GlideAnim::prePaintWindow () { if (90 < glideModRotAngle && glideModRotAngle < 270) glCullFace (GL_FRONT); } void GlideAnim::postPaintWindow (const GLMatrix &transform) { if (90 < glideModRotAngle && glideModRotAngle < 270) glCullFace (GL_BACK); } bool GlideAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::Glide1ZoomToTaskbar)); } bool Glide2Anim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::Glide2ZoomToTaskbar)); } ./plugins/animation/src/fade.cpp0000644000004100000410000000346713246301623017107 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * fade.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Fade ========================= FadeAnim::FadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon) { } void FadeAnim::updateAttrib (GLWindowPaintAttrib &attrib) { attrib.opacity = (GLushort) (mStoredOpacity * (1 - getFadeProgress ())); } void FadeAnim::updateBB (CompOutput &output) { mAWindow->expandBBWithWindow (); } ./plugins/animation/src/zoomside.cpp0000644000004100000410000003072413246301623020035 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * zoomside.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Zoom and Sidekick ========================= const float ZoomAnim::kDurationFactor = 1.33; const float ZoomAnim::kSpringyDurationFactor = 1.82; const float ZoomAnim::kNonspringyDurationFactor = 1.67; ZoomAnim::ZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (isZoomFromCenter ()) { mIcon.setX (outRect.x () + outRect.width () / 2 - mIcon.width () / 2); mIcon.setY (outRect.y () + outRect.height () / 2 - mIcon.height () / 2); } } SidekickAnim::SidekickAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), ZoomAnim::ZoomAnim (w, curWindowEvent, duration, info, icon) { // determine number of rotations randomly in [0.9, 1.1] range mNumRotations = optValF (AnimationOptions::SidekickNumRotations) * (1.0f + 0.2f * rand () / RAND_MAX - 0.1f); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float winCenterX = outRect.x () + outRect.width () / 2.0; float iconCenterX = mIcon.x () + mIcon.width () / 2.0; // if window is to the right of icon, rotate clockwise instead // to make rotation look more pleasant if (winCenterX > iconCenterX) mNumRotations *= -1; } float ZoomAnim::getSpringiness () { return 2 * optValF (AnimationOptions::ZoomSpringiness); } float SidekickAnim::getSpringiness () { return 1.6 * optValF (AnimationOptions::SidekickSpringiness); } bool ZoomAnim::isZoomFromCenter () { return (optValI (AnimationOptions::ZoomFromCenter) == AnimationOptions::ZoomFromCenterOn || ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValI (AnimationOptions::ZoomFromCenter) == AnimationOptions::ZoomFromCenterMinimizeUnminimizeOnly) || ((mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) && optValI (AnimationOptions::ZoomFromCenter) == AnimationOptions::ZoomFromCenterOpenCloseOnly)); } bool SidekickAnim::isZoomFromCenter () { return (optValI (AnimationOptions::SidekickZoomFromCenter) == AnimationOptions::ZoomFromCenterOn || ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValI (AnimationOptions::SidekickZoomFromCenter) == AnimationOptions::SidekickZoomFromCenterMinimizeUnminimizeOnly) || ((mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) && optValI (AnimationOptions::SidekickZoomFromCenter) == AnimationOptions::SidekickZoomFromCenterOpenCloseOnly)); } void ZoomAnim::adjustDuration () { // allow extra time for spring damping / deceleration if ((mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) && getSpringiness () > 1e-4) mTotalTime *= kSpringyDurationFactor; else if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) mTotalTime *= kNonspringyDurationFactor; else mTotalTime *= kDurationFactor; mRemainingTime = mTotalTime; } void ZoomAnim::getZoomProgress (float *pMoveProgress, float *pScaleProgress, bool neverSpringy) { float forwardProgress = 1 - mRemainingTime / (mTotalTime - mTimestep); forwardProgress = MIN (forwardProgress, 1); forwardProgress = MAX (forwardProgress, 0); float x = forwardProgress; bool backwards = false; int animProgressDir = 1; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) animProgressDir = 2; if (mOverrideProgressDir != 0) animProgressDir = mOverrideProgressDir; if ((animProgressDir == 1 && (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen)) || (animProgressDir == 2 && (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventClose))) backwards = true; if (backwards) x = 1 - x; float dampBase = (pow (1-pow (x,1.2)*0.5,10)-pow (0.5,10))/(1-pow (0.5,10)); float nonSpringyProgress = 1 - pow (progressDecelerateCustom (1 - x, .5f, .8f), 1.7f); float damping = pow (dampBase, 0.5); float damping2 = ((pow (1-(pow (x,0.7)*0.5),10)-pow (0.5,10))/(1-pow (0.5,10))) * 0.7 + 0.3; float springiness = 0; // springy only when appearing if ((mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) && !neverSpringy) springiness = getSpringiness (); float springyMoveProgress = cos (2*M_PI*pow (x,1)*1.25) * damping * damping2; float scaleProgress; float moveProgress; if (springiness > 1e-4f) { if (x > 0.2) springyMoveProgress *= springiness; else { // interpolate between (springyMoveProgress * springiness) // and springyMoveProgress for smooth transition at 0.2 // (where it crosses y=0) float progressUpto02 = x / 0.2f; springyMoveProgress = (1 - progressUpto02) * springyMoveProgress + progressUpto02 * springyMoveProgress * springiness; } moveProgress = 1 - springyMoveProgress; } else moveProgress = nonSpringyProgress; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) moveProgress = 1 - moveProgress; if (backwards) moveProgress = 1 - moveProgress; float scProgress = nonSpringyProgress; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) scProgress = 1 - scProgress; if (backwards) scProgress = 1 - scProgress; scaleProgress = pow (scProgress, 1.25); if (pMoveProgress) *pMoveProgress = moveProgress; if (pScaleProgress) *pScaleProgress = scaleProgress; } float ZoomAnim::getFadeProgress () { float fadeProgress; getZoomProgress (0, &fadeProgress, false); return fadeProgress; } void ZoomAnim::getCenterScaleFull (Point *pCurCenter, Point *pCurScale, Point *pWinCenter, Point *pIconCenter, float *pMoveProgress) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); Point winCenter ((outRect.x () + outRect.width () / 2.0), (outRect.y () + outRect.height () / 2.0)); Point iconCenter (mIcon.x () + mIcon.width () / 2.0, mIcon.y () + mIcon.height () / 2.0); Point winSize (outRect.width (), outRect.height ()); winSize.setX (winSize.x () == 0 ? 1 : winSize.x ()); winSize.setY (winSize.y () == 0 ? 1 : winSize.y ()); float scaleProgress; float moveProgress; getZoomProgress (&moveProgress, &scaleProgress, neverSpringy ()); Point curCenter ((1 - moveProgress) * winCenter.x () + moveProgress * iconCenter.x (), (1 - moveProgress) * winCenter.y () + moveProgress * iconCenter.y ()); Point curScale (((1 - scaleProgress) * winSize.x () + scaleProgress * mIcon.width ()) / winSize.x (), ((1 - scaleProgress) * winSize.y () + scaleProgress * mIcon.height ()) / winSize.y ()); // Copy calculated variables if (pCurCenter) *pCurCenter = curCenter; if (pCurScale) *pCurScale = curScale; if (pWinCenter) *pWinCenter = winCenter; if (pIconCenter) *pIconCenter = iconCenter; if (pMoveProgress) *pMoveProgress = moveProgress; } void ZoomAnim::applyTransform () { if (!zoomToIcon ()) return; Point curCenter; Point curScale; Point winCenter; Point iconCenter; float moveProgress; getCenterScaleFull (&curCenter, &curScale, &winCenter, &iconCenter, &moveProgress); if (scaleAroundIcon ()) { mTransform.translate (iconCenter.x (), iconCenter.y (), 0); mTransform.scale (curScale.x (), curScale.y (), curScale.y ()); mTransform.translate (-iconCenter.x (), -iconCenter.y (), 0); if (hasExtraTransform ()) { mTransform.translate (winCenter.x (), winCenter.y (), 0); applyExtraTransform (moveProgress); mTransform.translate (-winCenter.x (), -winCenter.y (), 0); } } else { mTransform.translate (winCenter.x (), winCenter.y (), 0); float tx, ty; if (shouldAvoidParallelogramLook ()) { // avoid parallelogram look float maxScale = MAX (curScale.x (), curScale.y ()); mTransform.scale (maxScale, maxScale, maxScale); tx = (curCenter.x () - winCenter.x ()) / maxScale; ty = (curCenter.y () - winCenter.y ()) / maxScale; } else { mTransform.scale (curScale.x (), curScale.y (), curScale.y ()); tx = (curCenter.x () - winCenter.x ()) / curScale.x (); ty = (curCenter.y () - winCenter.y ()) / curScale.y (); } mTransform.translate (tx, ty, 0); applyExtraTransform (moveProgress); mTransform.translate (-winCenter.x (), -winCenter.y (), 0); } } void SidekickAnim::applyExtraTransform (float progress) { mTransform.rotate (progress * 360 * mNumRotations, 0.0f, 0.0f, 1.0f); } bool ZoomAnim::scaleAroundIcon () { return (getSpringiness () == 0.0f && (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose)); } void ZoomAnim::getCenterScale (Point *pCurCenter, Point *pCurScale) { getCenterScaleFull (pCurCenter, pCurScale, NULL, NULL, NULL); } float ZoomAnim::getActualProgress () { float forwardProgress = 0; if (zoomToIcon ()) getZoomProgress (&forwardProgress, 0, true); else forwardProgress = progressLinear (); return forwardProgress; } Point ZoomAnim::getCenter () { Point center; if (zoomToIcon ()) getCenterScale (¢er, 0); else { float forwardProgress = progressLinear (); CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); center.setX (inRect.x () + inRect.width () / 2.0); if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { float origCenterY = (inRect.y () + inRect.height () / 2.0); center.setY ((1 - forwardProgress) * origCenterY + forwardProgress * (inRect.y () + mDecorTopHeight)); } else // i.e. (un)minimizing without zooming center.setY (inRect.y () + inRect.height () / 2.0); } return center; } GridZoomAnim::GridZoomAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon), ZoomAnim::ZoomAnim (w, curWindowEvent, duration, info, icon) { } void GridZoomAnim::adjustDuration () { if (zoomToIcon ()) { mTotalTime *= ZoomAnim::kDurationFactor; mRemainingTime = mTotalTime; } } ./plugins/animation/src/private.h0000644000004100000410000006073613246301623017331 0ustar www-datawww-data#include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include "animation_options.h" typedef std::vector CompWindowVector; typedef std::vector ExtensionPluginVector; typedef std::vector AnimEffectVector; class RestackInfo { public: RestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised); CompWindow *wRestacked; CompWindow *wStart; CompWindow *wEnd; CompWindow *wOldAbove; bool raised; }; class IdValuePair { public: IdValuePair () : pluginInfo (0), optionId (-1), value () {} bool matchesPluginOption (ExtensionPluginInfo *pluginInfo, int optionId) const; const ExtensionPluginInfo *pluginInfo; int optionId; CompOption::Value value; }; typedef std::vector IdValuePairVector; class OptionSet { public: OptionSet () {} IdValuePairVector pairs; }; typedef std::vector OptionSetVector; class OptionSets { public: OptionSets () {} OptionSetVector sets; }; class EffectSet { public: EffectSet () {} AnimEffectVector effects; }; extern AnimEffect AnimEffectNone; extern AnimEffect AnimEffectRandom; extern AnimEffect AnimEffectCurvedFold; extern AnimEffect AnimEffectDodge; extern AnimEffect AnimEffectDream; extern AnimEffect AnimEffectFade; extern AnimEffect AnimEffectFocusFade; extern AnimEffect AnimEffectGlide1; extern AnimEffect AnimEffectGlide2; extern AnimEffect AnimEffectHorizontalFolds; extern AnimEffect AnimEffectMagicLamp; extern AnimEffect AnimEffectMagicLampWavy; extern AnimEffect AnimEffectRollUp; extern AnimEffect AnimEffectSidekick; extern AnimEffect AnimEffectWave; extern AnimEffect AnimEffectZoom; extern const unsigned short NUM_EFFECTS; extern int customOptionOptionIds[AnimEventNum]; typedef struct _PluginEventInfo { const char *pluginName; const char *activateEventName; } PluginEventInfo; typedef enum { WatchedPluginSwitcher = 0, WatchedPluginRing, WatchedPluginShift, WatchedPluginScale, WatchedPluginGroup, WatchedPluginFadedesktop, WatchedScreenPluginNum } WatchedScreenPlugin; typedef enum { WatchedPluginKDECompat, WatchedWindowPluginNum } WatchedWindowPlugin; // This must have the value of the first "effect setting" above // in PrivateAnimScreenOptions #define NUM_NONEFFECT_OPTIONS AnimationOptions::CurvedFoldAmpMult class ExtensionPluginAnimation : public ExtensionPluginInfo { public: ExtensionPluginAnimation (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex); virtual ~ExtensionPluginAnimation (); // Overriden methods from ExtensionPluginInfo void postPreparePaintGeneral (); void prePreparePaintGeneral (); void handleRestackNotify (AnimWindow *aw); // Always reset stacking related info when a window is opened, closed, // minimized, or unminimized. void preInitiateOpenAnim (AnimWindow *aw); void preInitiateCloseAnim (AnimWindow *aw); void preInitiateMinimizeAnim (AnimWindow *aw); void preInitiateUnminimizeAnim (AnimWindow *aw); void initPersistentData (AnimWindow *aw); void destroyPersistentData (AnimWindow *aw); void postUpdateEventEffects (AnimEvent e, bool forRandom); void cleanUpAnimation (bool closing, bool destructing); void postStartupCountdown (); // Other methods void handleSingleRestack (AnimWindow *aw); void prePaintWindowsBackToFront (); bool paintShouldSkipWindow (CompWindow *w); const CompWindowList & getWindowPaintList (); void resetStackingInfo (); static CompWindow *getBottommostInExtendedFocusChain (CompWindow *wStartPoint); static CompWindow *getBottommostInRestackChain (CompWindow *wStartPoint); void resetMarks (); bool markNewCopy (CompWindow *w); CompWindow * walkFirst (); CompWindow * walkNext (CompWindow *w); void incrementCurRestackAnimCount (); void decrementCurRestackAnimCount (); bool wontCreateCircularChain (CompWindow *wCur, CompWindow *wNext); static void cleanUpParentChildChainItem (AnimWindow *aw); static bool relevantForRestackAnim (CompWindow *w); /// Is restackInfo still good? static bool restackInfoStillGood (RestackInfo *restackInfo); void updateLastClientList (); /// A window was restacked this paint round. bool mAWinWasRestackedJustNow; private: CompWindowVector mLastClientList; ///< Last known stacking order CompWindowVector mPrevClientList; ///< The stacking order before mLastClientList int mRestackAnimCount; ///< Count of how many windows are currently involved in ///< animations that require walker (dodge & focus fade). std::vector mRestackedWindows; CompWindowList mWindowList; }; class PrivateAnimScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public AnimationOptions { friend class PrivateAnimWindow; friend class AnimWindow; public: CompositeScreen *cScreen; GLScreen *gScreen; AnimScreen *aScreen; private: struct timeval mLastRedrawTime; bool mLastRedrawTimeFresh; bool mPluginActive[WatchedScreenPluginNum]; int mSwitcherPostWait; int mStartCountdown; ///< To mark windows as "created" if they were opened before compiz ///< was started and to prevent already opened windows from doing ///< open animation. Window mLastActiveWindow; ///< Last known active window bool mAnimInProgress; ///< Is an animation currently being played? bool mStartingNewPaintRound; ///< Is a new round of glPaints starting? bool mPrePaintWindowsBackToFrontEnabled; EffectSet mRandomEffects[AnimEventNum]; OptionSets mEventOptionSets[AnimEventNum]; // Effect extension plugins ExtensionPluginVector mExtensionPlugins; // Possible effects for each event AnimEffectVector mEventEffectsAllowed[AnimEventNum]; // List of chosen effects for each event EffectSet mEventEffects[AnimEventNum]; CompOutput *mOutput; Window mActiveWindow; CompMatch mNeverAnimateMatch; const CompWindowList *mLockedPaintList; unsigned int mLockedPaintListCnt; unsigned int mGetWindowPaintListEnableCnt; void updateEventEffects (AnimEvent e, bool forRandom, bool callPost = true); void updateAllEventEffects (); void updateOptionSets (AnimEvent e); void updateOptionSet (OptionSet *os, const char *optNamesValuesOrig); void activateEvent (bool activating); bool isWinVisible (CompWindow *w); AnimEvent getCorrespondingAnimEvent (AnimationOptions::Options optionId); void eventMatchesChanged (CompOption *opt, AnimationOptions::Options num); void eventOptionsChanged (CompOption *opt, AnimationOptions::Options num); void eventEffectsChanged (CompOption *opt, AnimationOptions::Options num); void eventRandomEffectsChanged (CompOption *opt, AnimationOptions::Options num); CompRect getIcon (CompWindow *w, bool alwaysUseMouse); void updateAnimStillInProgress (); bool isAnimEffectInList (AnimEffect theEffect, EffectSet &effectList); bool isAnimEffectPossibleForEvent (AnimEffect theEffect, AnimEvent event); public: PrivateAnimScreen (CompScreen *s, AnimScreen *); ~PrivateAnimScreen (); // In order to prevent other plugins from modifying // the paint lists as we use it we need to lock the // list const CompWindowList & pushLockedPaintList (); void popLockedPaintList (); void pushPaintList (); void popPaintList (); // Utility methods void initiateOpenAnim (PrivateAnimWindow *aw); void initiateCloseAnim (PrivateAnimWindow *aw); void initiateMinimizeAnim (PrivateAnimWindow *aw); void initiateUnminimizeAnim (PrivateAnimWindow *aw); void initiateShadeAnim (PrivateAnimWindow *aw); void initiateUnshadeAnim (PrivateAnimWindow *aw); bool initiateFocusAnim (PrivateAnimWindow *aw); /// Is a restacking animation currently possible? bool isRestackAnimPossible (); void initAnimationList (); bool isAnimEffectPossible (AnimEffect theEffect); inline CompOutput &output () { return *mOutput; } AnimEffect getActualEffect (AnimEffect effect, AnimEvent animEvent); bool shouldIgnoreWindowForAnim (CompWindow *w, bool checkPixmap); OptionSet *getOptionSetForSelectedRow (PrivateAnimWindow *aw, Animation *anim); void addExtension (ExtensionPluginInfo *extensionPluginInfo, bool shouldInitPersistentData); void removeExtension (ExtensionPluginInfo *extensionPluginInfo); AnimEffect getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration); bool otherPluginsActive (); void enablePrePaintWindowsBackToFront (bool enabled); void prePaintWindowsBackToFront (); // CompositeScreenInterface methods void preparePaint (int); void donePaint (); const CompWindowList & getWindowPaintList (); // GLScreenInterface methods bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); // ScreenInterface methods void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options); }; class PrivateAnimWindow : public WindowInterface, public GLWindowInterface { friend class PrivateAnimScreen; friend class AnimWindow; public: PrivateAnimWindow (CompWindow *, AnimWindow *aw); ~PrivateAnimWindow (); void createFocusAnimation (AnimEffect effect, int duration); inline void setShaded (bool shaded) { mNowShaded = shaded; } inline Animation *curAnimation () { return mCurAnimation; } inline PrivateAnimScreen *paScreen () { return mPAScreen; } inline AnimWindow *aWindow () { return mAWindow; } inline Box &BB () { return mBB; } inline int curAnimSelectionRow () { return mCurAnimSelectionRow; } void damageThisAndLastStepRegion (); void postAnimationCleanUp (); void copyResetStepRegion (); GLWindow *gWindow; private: CompWindow *mWindow; AnimWindow *mAWindow; PrivateAnimScreen *mPAScreen; unsigned int mState; unsigned int mNewState; Animation *mCurAnimation; bool mUnshadePending; bool mEventNotOpenClose; bool mNowShaded; bool mGrabbed; int mUnmapCnt; int mDestroyCnt; bool mIgnoreDamage; bool mFinishingAnim; int mCurAnimSelectionRow; int mPrevAnimSelectionRow; ///< For the case when one event interrupts another Box mBB; ///< Bounding box of area to be damaged CompRegion mStepRegion; ///< Region to damage this step CompRegion mLastStepRegion; ///< Region damaged last step bool mPluginActive[WatchedWindowPluginNum]; // Utility methods unsigned int getState (); void updateSelectionRow (unsigned int i); void postAnimationCleanUpPrev (bool closing, bool clearMatchingRow); void postAnimationCleanUpCustom (bool closing, bool destructing, bool clearMatchingRow); void reverseAnimation (); void enablePainting (bool enabling); void notifyAnimation (bool activation); // WindowInterface methods void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); void windowNotify (CompWindowNotify n); void grabNotify (int x, int y, unsigned int state, unsigned int mask); void ungrabNotify (); // GLWindowInterface methods bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void glAddGeometry (const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int = MAXSHORT, unsigned int = MAXSHORT); void glDrawTexture (GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int ); //void glDrawGeometry (); }; class RollUpAnim : public GridAnim { public: RollUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: static const float kDurationFactor; void initGrid (); void step (); }; class MagicLampAnim : public GridAnim { public: MagicLampAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); virtual ~MagicLampAnim (); protected: bool mTargetTop; GridModel::GridObject *mTopLeftCornerObject; GridModel::GridObject *mBottomLeftCornerObject; void initGrid (); void step (); void updateBB (CompOutput &output); inline bool stepRegionUsed () { return true; } void adjustPointerIconSize (); virtual bool hasMovingEnd (); virtual void filterTargetX (float &targetX, float x) { } }; class MagicLampWavyAnim : public MagicLampAnim { public: MagicLampWavyAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~MagicLampWavyAnim (); protected: struct WaveParam { float halfWidth; float amp; float pos; }; unsigned int mNumWaves; WaveParam *mWaves; void initGrid (); void updateBB (CompOutput &output); inline bool stepRegionUsed () { return false; } void adjustPointerIconSize (); bool hasMovingEnd (); void filterTargetX (float &targetX, float x); }; class SidekickAnim : public ZoomAnim { public: SidekickAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: float mNumRotations; float getSpringiness (); bool isZoomFromCenter (); inline bool hasExtraTransform () { return true; } void applyExtraTransform (float progress); inline bool shouldAvoidParallelogramLook () { return true; } bool requiresTransformedWindow () const { return true; } }; class WaveAnim : public GridTransformAnim { public: WaveAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void adjustDuration (); void initGrid (); inline bool using3D () { return true; } void step (); bool requiresTransformedWindow () const { return true; } static const float kMinDuration; }; class GlideAnim : public ZoomAnim { public: GlideAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void prePaintWindow (); inline bool postPaintWindowUsed () { return true; } void postPaintWindow (const GLMatrix &); void adjustDuration (); bool zoomToIcon (); void applyTransform (); float getFadeProgress (); bool requiresTransformedWindow () const { return true; } float getProgress (); virtual void getParams (float *finalDistFac, float *finalRotAng, float *thickness); float glideModRotAngle; ///< The angle of rotation, modulo 360. }; class Glide2Anim : public GlideAnim { public: Glide2Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: bool zoomToIcon (); void getParams (float *finalDistFac, float *finalRotAng, float *thickness); }; class RestackPersistentData; class RestackAnim : virtual public Animation { public: RestackAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void cleanUp (bool closing, bool destructing); bool initiateRestackAnim (int duration); inline bool moveUpdate (int dx, int dy) { return false; } static bool onSameRestackChain (CompWindow *wSubject, CompWindow *wOther); /// Find union of restack chain (group) static CompRegion unionRestackChain (CompWindow *w); virtual bool paintedElsewhere () { return false; } protected: // Overridable methods virtual void processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates) {} virtual void postInitiateRestackAnim (int numSelectedCandidates, int duration, CompWindow *wStart, CompWindow *wEnd, bool raised) {} // Other methods bool overNewCopy (); ///< Is glPaint on the copy at the new position? RestackPersistentData *mRestackData; }; class RestackPersistentData : public PersistentData { friend class ExtensionPluginAnimation; friend class RestackAnim; friend class FocusFadeAnim; friend class DodgeAnim; public: RestackPersistentData (); ~RestackPersistentData (); protected: inline RestackInfo *restackInfo () { return mRestackInfo; } void resetRestackInfo (bool alsoResetChain = false); void setRestackInfo (CompWindow *wRestacked, CompWindow *wStart, CompWindow *wEnd, CompWindow *wOldAbove, bool raised); void getHostedOnWin (CompWindow *wGuest, CompWindow *wHost); RestackInfo *mRestackInfo; ///< restack info if window was restacked this paint round CompWindow *mWinToBePaintedBeforeThis; ///< Window which should be painted before this CompWindow *mWinThisIsPaintedBefore; ///< the inverse relation of mWinToBePaintedBeforeThis CompWindow *mMoreToBePaintedPrev; CompWindow *mMoreToBePaintedNext; ///< doubly linked list for windows underneath that ///< raise together with this one bool mConfigureNotified; ///< was mConfigureNotified before restack check CompWindow *mWinPassingThrough; ///< win. passing through this one during focus effect bool mWalkerOverNewCopy; ///< whether walker is on the copy at the new pos. int mVisitCount; ///< how many times walker/glPaint has visited this window bool mIsSecondary; ///< whether this is one of the secondary (non-topmost) in its restack chain }; class FocusFadeAnim : public RestackAnim, public FadeAnim { public: FocusFadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void updateAttrib (GLWindowPaintAttrib &attrib); void cleanUp (bool closing, bool destructing); protected: void processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates); GLushort computeOpacity (GLushort opacityInt); }; typedef enum { DodgeDirectionUp = 0, DodgeDirectionRight, DodgeDirectionDown, DodgeDirectionLeft, DodgeDirectionXY, // movement possibly in both X and Y (for subjects) DodgeDirectionNone } DodgeDirection; class DodgePersistentData; class DodgeAnim : public RestackAnim, public TransformAnim { public: DodgeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void cleanUp (bool closing, bool destructing); static int getDodgeAmount (CompRect &rect, CompWindow *dw, DodgeDirection dir); void step (); void updateTransform (GLMatrix &wTransform); bool shouldDamageWindowOnStart (); void updateBB (CompOutput &output); void postPreparePaint (); void calculateDodgeAmounts (); bool moveUpdate (int dx, int dy); protected: void processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates); void postInitiateRestackAnim (int numSelectedCandidates, int duration, CompWindow *wStart, CompWindow *wEnd, bool raised); bool paintedElsewhere (); void applyDodgeTransform (); float dodgeProgress (); void updateDodgerDodgeAmount (); DodgePersistentData *mDodgeData; CompWindow *mDodgeSubjectWin;///< The window being dodged float mDodgeMaxAmountX; ///< max # pixels it should dodge ///< (neg. value dodges leftward) float mDodgeMaxAmountY; ///< max # pixels it should dodge ///< (neg. value dodges upward) DodgeDirection mDodgeDirection; int mDodgeMode; }; class DodgePersistentData : public PersistentData { friend class ExtensionPluginAnimation; friend class DodgeAnim; public: DodgePersistentData (); private: int dodgeOrder; ///< dodge order (used temporarily) // TODO mov the below members into DodgeAnim bool isDodgeSubject; ///< true if this window is the cause of dodging bool skipPostPrepareScreen; CompWindow *dodgeChainStart;///< for the subject window CompWindow *dodgeChainPrev; ///< for dodging windows CompWindow *dodgeChainNext; ///< for dodging windows }; class DreamAnim : public GridZoomAnim { public: DreamAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void init (); void initGrid (); void step (); void adjustDuration (); float getFadeProgress (); bool zoomToIcon (); bool requiresTransformedWindow () const { return true; } static const float kDurationFactor; }; class FoldAnim : public GridZoomAnim { public: FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: inline bool using3D () { return true; } float getFadeProgress (); void updateWindowAttrib (GLWindowPaintAttrib &attrib); bool requiresTransformedWindow () const { return true; } }; class CurvedFoldAnim : public FoldAnim { public: CurvedFoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void initGrid (); void step (); void updateBB (CompOutput &output); bool zoomToIcon (); float getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToCenter, float curveMaxAmp); bool requiresTransformedWindow () const { return true; } }; class HorizontalFoldsAnim : public FoldAnim { public: HorizontalFoldsAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void initGrid (); void step (); bool zoomToIcon (); float getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToFoldCenter, float foldMaxAmp); bool requiresTransformedWindow () const { return true; } }; ./plugins/animation/src/options.cpp0000644000004100000410000002201213246301623017666 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * options.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ================= Option Related Functions ================= AnimEvent win2AnimEventMap[WindowEventNum] = { AnimEventOpen, AnimEventClose, AnimEventMinimize, AnimEventUnminimize, AnimEventShade, AnimEventShade, AnimEventFocus }; AnimEvent PrivateAnimScreen::getCorrespondingAnimEvent (AnimationOptions::Options optionId) { switch (optionId) { case AnimationOptions::OpenOptions: case AnimationOptions::OpenEffects: case AnimationOptions::OpenRandomEffects: return AnimEventOpen; case AnimationOptions::CloseEffects: case AnimationOptions::CloseRandomEffects: case AnimationOptions::CloseOptions: return AnimEventClose; case AnimationOptions::MinimizeOptions: case AnimationOptions::MinimizeEffects: case AnimationOptions::MinimizeRandomEffects: return AnimEventMinimize; case AnimationOptions::UnminimizeOptions: case AnimationOptions::UnminimizeEffects: case AnimationOptions::UnminimizeRandomEffects: return AnimEventUnminimize; case AnimationOptions::FocusOptions: case AnimationOptions::FocusEffects: return AnimEventFocus; case AnimationOptions::ShadeOptions: case AnimationOptions::ShadeEffects: case AnimationOptions::ShadeRandomEffects: return AnimEventShade; default: return AnimEventNum; } } bool IdValuePair::matchesPluginOption (ExtensionPluginInfo *testPluginInfo, int testOptionId) const { return (pluginInfo == testPluginInfo && optionId == testOptionId); } CompOption::Value & AnimWindow::pluginOptVal (ExtensionPluginInfo *pluginInfo, unsigned int optionId, Animation *anim) { PrivateAnimWindow *aw = priv; PrivateAnimScreen *as = aw->paScreen (); // Handle -1 case, used in Dodge for non-matching (stable) dodgers if (aw->curAnimSelectionRow () < 0) return (*pluginInfo->effectOptions)[optionId].value (); OptionSet *os = as->getOptionSetForSelectedRow (aw, anim); IdValuePairVector::iterator it = find_if (os->pairs.begin (), os->pairs.end (), boost::bind (&IdValuePair::matchesPluginOption, _1, pluginInfo, optionId)); return (it == os->pairs.end () ? (*pluginInfo->effectOptions)[optionId].value () : (*it).value); } OptionSet * PrivateAnimScreen::getOptionSetForSelectedRow (PrivateAnimWindow *aw, Animation *anim) { const AnimEvent event = win2AnimEventMap[anim->curWindowEvent ()]; OptionSets &eventOptionSets = mEventOptionSets[event]; OptionSet *setSelectedForRow = &eventOptionSets.sets[(unsigned int) aw->curAnimSelectionRow ()]; return setSelectedForRow; } void PrivateAnimScreen::updateOptionSet (OptionSet *os, const char *optNamesValuesOrig) { unsigned int len = strlen (optNamesValuesOrig); char *optNamesValues = (char *)calloc (len + 1, 1); // Find the first substring with no spaces in it sscanf (optNamesValuesOrig, " %s ", optNamesValues); if (!strlen (optNamesValues)) { free (optNamesValues); return; } // Backup original, since strtok is destructive strcpy (optNamesValues, optNamesValuesOrig); char *nameTrimmed = (char *)calloc (len + 1, 1); char *valueStr = 0; const char *betweenPairs = ","; const char *betweenOptVal = "="; // Count number of pairs char *pairToken = (char *)optNamesValuesOrig; // TODO do with CompString unsigned int nPairs = 1; while ((pairToken = strchr (pairToken, betweenPairs[0]))) { ++pairToken; // skip delimiter ++nPairs; } os->pairs.clear (); os->pairs.reserve (nPairs); // Tokenize pairs char *name = strtok (optNamesValues, betweenOptVal); int errorNo = -1; unsigned int i; for (i = 0; name && i < nPairs; ++i) { errorNo = 0; if (strchr (name, betweenPairs[0])) // handle "a, b=4" case { errorNo = 1; break; } sscanf (name, " %s ", nameTrimmed); if (!strlen (nameTrimmed)) { errorNo = 2; break; } valueStr = strtok (0, betweenPairs); if (!valueStr) { errorNo = 3; break; } // TODO: Fix: Convert to "pluginname:option_name" format // Warning: Assumes that option names in different extension plugins // will be different. bool matched = false; const ExtensionPluginInfo *chosenExtensionPlugin = NULL; CompOption *o = 0; int optId = -1; unsigned int nOptions; foreach (ExtensionPluginInfo *extensionPlugin, mExtensionPlugins) { nOptions = extensionPlugin->effectOptions->size (); for (optId = (int)extensionPlugin->firstEffectOptionIndex; optId < (int)nOptions; ++optId) { o = &(*extensionPlugin->effectOptions)[(unsigned)optId]; if (strcasecmp (nameTrimmed, o->name ().c_str ()) == 0) { matched = true; chosenExtensionPlugin = extensionPlugin; break; } } if (matched) break; } if (!matched) { errorNo = 4; break; } CompOption::Value v; os->pairs.push_back (IdValuePair ()); IdValuePair *pair = &os->pairs[i]; pair->pluginInfo = chosenExtensionPlugin; pair->optionId = optId; int valueRead = -1; switch (o->type ()) { case CompOption::TypeBool: int vb; valueRead = sscanf (valueStr, " %d ", &vb); if (valueRead) pair->value.set ((bool)vb); break; case CompOption::TypeInt: { int vi; valueRead = sscanf (valueStr, " %d ", &vi); if (valueRead > 0) { if (o->rest ().inRange (vi)) { v.set (vi); pair->value = v; } else errorNo = 7; } break; } case CompOption::TypeFloat: { float vf; valueRead = sscanf (valueStr, " %f ", &vf); if (valueRead > 0) { if (o->rest ().inRange (vf)) { v.set (vf); pair->value = v; } else errorNo = 7; } break; } case CompOption::TypeString: { v.set (CompString (valueStr)); valueRead = 1; break; } case CompOption::TypeColor: { unsigned short vc[4]; valueRead = sscanf (valueStr, " #%2hx%2hx%2hx%2hx ", &vc[0], &vc[1], &vc[2], &vc[3]); if (valueRead == 4) { CompOption::Value *pairVal = &pair->value; for (int j = 0; j < 4; ++j) vc[j] = vc[j] << 8 | vc[j]; pairVal->set (vc); } else errorNo = 6; break; } default: break; } if (valueRead == 0) errorNo = 6; if (errorNo > 0) break; // If valueRead is -1 here, then it must be a // non-(int/float/string) option, which is not supported yet. // Such an option doesn't currently exist anyway. errorNo = -1; name = strtok (0, betweenOptVal); } if (i < nPairs) { switch (errorNo) { case -1: case 2: compLogMessage ("animation", CompLogLevelError, "Option name missing in \"%s\"", optNamesValuesOrig); break; case 1: case 3: compLogMessage ("animation", CompLogLevelError, "Option value missing in \"%s\"", optNamesValuesOrig); break; case 4: //compLogMessage ("animation", CompLogLevelError, // "Unknown option \"%s\" in \"%s\"", // nameTrimmed, optNamesValuesOrig); break; case 6: compLogMessage ("animation", CompLogLevelError, "Invalid value \"%s\" in \"%s\"", valueStr, optNamesValuesOrig); break; case 7: compLogMessage ("animation", CompLogLevelError, "Value \"%s\" out of range in \"%s\"", valueStr, optNamesValuesOrig); break; default: break; } os->pairs.clear (); } free (optNamesValues); free (nameTrimmed); } void PrivateAnimScreen::updateOptionSets (AnimEvent e) { OptionSets *oss = &mEventOptionSets[e]; CompOption::Value::Vector *listVal = &getOptions ()[(unsigned) customOptionOptionIds[e]].value ().list (); unsigned int n = listVal->size (); oss->sets.clear (); oss->sets.reserve (n); for (unsigned int i = 0; i < n; ++i) { oss->sets.push_back (OptionSet ()); updateOptionSet (&oss->sets[i], (*listVal)[i].s ().c_str ()); } } ./plugins/animation/src/horizontalfold.cpp0000644000004100000410000001326713246301623021245 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * horizontalfold.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Horizontal Folds ========================= HorizontalFoldsAnim::HorizontalFoldsAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FoldAnim::FoldAnim (w, curWindowEvent, duration, info, icon) { } void HorizontalFoldsAnim::initGrid () { mGridWidth = 2; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) mGridHeight = 3 + 2 * optValI (AnimationOptions::HorizontalFoldsNumFolds); else mGridHeight = 1 + 2 * optValI (AnimationOptions::HorizontalFoldsNumFolds); } float HorizontalFoldsAnim::getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToFoldCenter, float foldMaxAmp) { return -(sinForProg * foldMaxAmp * mModel->scale ().x () * 2 * (0.5 - relDistToFoldCenter)); } void HorizontalFoldsAnim::step () { GridZoomAnim::step (); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->inputRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float winHeight = 0; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) winHeight = winRect.height (); else winHeight = inRect.height (); int nHalfFolds = 2.0 * optValI (AnimationOptions::HorizontalFoldsNumFolds); float foldMaxAmp = 0.3 * pow ((winHeight / nHalfFolds) / ::screen->height (), 0.3) * optValF (AnimationOptions::HorizontalFoldsAmpMult); float forwardProgress = getActualProgress (); float sinForProg = sin (forwardProgress * M_PI / 2); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); int rowNo = (int)i / mGridWidth; float origy = (wy + (oheight * objGridY - outExtents.top) * mModel->scale ().y ()); if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { // Execute shade mode if (objGridY == 0) { objPos.setY (oy); objPos.setZ (0); } else if (objGridY == 1) { objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight + mDecorBottomHeight)); objPos.setZ (0); } else { float relDistToFoldCenter = (rowNo % 2 == 1 ? 0.5 : 0); objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToFoldCenter, foldMaxAmp)); } } else // Execute normal mode { float relDistToFoldCenter = (rowNo % 2 == 0 ? 0.5 : 0); objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (inRect.y () + inRect.height () / 2.0)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToFoldCenter, foldMaxAmp)); } } else // object is at the right side { // Set y/z position to the y/z position of the object at the left // on the same row (previous object) Point3d &leftObjPos = (object - 1)->position (); objPos.setY (leftObjPos.y ()); objPos.setZ (leftObjPos.z ()); } float origx = (wx + (owidth * object->gridPosition ().x () - outExtents.left) * mModel->scale ().x ()); objPos.setX (origx); } } bool HorizontalFoldsAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::HorizontalFoldsZoomToTaskbar)); } ./plugins/animation/src/rollup.cpp0000644000004100000410000001016413246301623017515 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * rollup.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Roll Up ========================= const float RollUpAnim::kDurationFactor = 1.67; RollUpAnim::RollUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), GridAnim::GridAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } void RollUpAnim::initGrid () { mGridWidth = 2; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) mGridHeight = 4; else mGridHeight = 2; } void RollUpAnim::step () { float forwardProgress = progressEaseInEaseOut (); bool fixedInterior = optValB (AnimationOptions::RollupFixedInterior); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); int ox = outRect.x (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { // Executing shade mode Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); if (objGridY == 0) objPos.setY (oy); else if (objGridY == 1) objPos.setY ( (1 - forwardProgress) * (oy + oheight * objGridY) + forwardProgress * (oy + mDecorTopHeight + mDecorBottomHeight)); else { // find position in window contents // (window contents correspond to 0.0-1.0 range) float relPosInWinContents = (objGridY * oheight - mDecorTopHeight) / mWindow->height (); if (relPosInWinContents > forwardProgress) { objPos.setY ( (1 - forwardProgress) * (oy + oheight * objGridY) + forwardProgress * (oy + mDecorTopHeight)); if (fixedInterior) object->offsetTexCoordForQuadBefore (). setY (-forwardProgress * mWindow->height ()); } else { objPos.setY (oy + mDecorTopHeight); if (!fixedInterior) object->offsetTexCoordForQuadAfter (). setY ((forwardProgress - relPosInWinContents) * mWindow->height ()); } } } else // object is at the right side { // Set y position to the y position of the object at the left // on the same row (previous object) objPos.setY ((object - 1)->position ().y ()); // Also copy offset texture y coordinates object->offsetTexCoordForQuadBefore (). setY ((object - 1)->offsetTexCoordForQuadBefore ().y ()); object->offsetTexCoordForQuadAfter (). setY ((object - 1)->offsetTexCoordForQuadAfter ().y ()); } float origx = ox + owidth * object->gridPosition ().x (); objPos.setX (origx); } } ./plugins/animation/src/transform.cpp0000644000004100000410000001022713246301623020213 0ustar www-datawww-data/* * Animation plugin for compiz * * transform.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" TransformAnim::TransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mTransformStartProgress (0.0f), mTransformProgress (0.0f) { } void TransformAnim::init () { adjustDuration (); } void TransformAnim::updateBB (CompOutput &output) { GLMatrix wTransform; prepareTransform (output, wTransform, mTransform); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float corners[4*3] = { static_cast (outRect.x ()), static_cast (outRect.y ()), 0, static_cast (outRect.x () + outRect.width ()), static_cast (outRect.y ()), 0, static_cast (outRect.x ()), static_cast (outRect.y () + outRect.height ()), 0, static_cast (outRect.x () + outRect.width ()), static_cast (outRect.y () + outRect.height ()), 0 }; mAWindow->expandBBWithPoints3DTransform (output, wTransform, corners, 0, 4); } void TransformAnim::step () { mTransform.reset (); applyTransform (); } void TransformAnim::updateTransform (GLMatrix &wTransform) { wTransform *= mTransform; } /// Scales z by 0 and does perspective distortion so that it /// looks the same wherever on the screen. void TransformAnim::perspectiveDistortAndResetZ (GLMatrix &transform) { float v = -1.0 / ::screen->width (); /* This does transform = M * transform, where M is 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, v, 0, 0, 0, 1 */ transform[8] = v * transform[12]; transform[9] = v * transform[13]; transform[10] = v * transform[14]; transform[11] = v * transform[15]; } void TransformAnim::applyPerspectiveSkew (CompOutput &output, GLMatrix &transform, Point ¢er) { GLfloat skewx = -(((center.x () - output.region ()->extents.x1) - output.width () / 2) * 1.15); GLfloat skewy = -(((center.y () - output.region ()->extents.y1) - output.height () / 2) * 1.15); /* transform = M * transform, where M is the skew matrix {1,0,0,0, 0,1,0,0, skewx,skewy,1,0, 0,0,0,1}; */ transform[8] = skewx * transform[0] + skewy * transform[4] + transform[8]; transform[9] = skewx * transform[1] + skewy * transform[5] + transform[9]; transform[10] = skewx * transform[2] + skewy * transform[6] + transform[10]; transform[11] = skewx * transform[3] + skewy * transform[7] + transform[11]; } Point TransformAnim::getCenter () { CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); Point center (inRect.x () + inRect.width () / 2, inRect.y () + inRect.height () / 2); return center; } ./plugins/animation/src/wave.cpp0000644000004100000410000001022013246301623017133 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * wave.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float WaveAnim::kMinDuration = 400; // ===================== Effect: Wave ========================= WaveAnim::WaveAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon) { } void WaveAnim::adjustDuration () { if (mTotalTime < kMinDuration) { mTotalTime = kMinDuration; mRemainingTime = mTotalTime; } } void WaveAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option } void WaveAnim::step () { float forwardProgress = 1 - progressLinear (); if (mCurWindowEvent == WindowEventClose) forwardProgress = 1 - forwardProgress; CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float waveHalfWidth = (oheight * mModel->scale ().y () * optValF (AnimationOptions::WaveWidth) / 2); float waveAmp = (pow ((float)oheight / ::screen->height (), 0.4) * 0.04 * optValF (AnimationOptions::WaveAmpMult)); float wavePosition = oy - waveHalfWidth + forwardProgress * (oheight * mModel->scale ().y () + 2 * waveHalfWidth); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float origy = wy + mModel->scale ().y () * (oheight * object->gridPosition ().y () - outExtents.top); objPos.setY (origy); float distFromWaveCenter = fabs (objPos.y () - wavePosition); if (distFromWaveCenter < waveHalfWidth) objPos. setZ (waveAmp * (cos (distFromWaveCenter * M_PI / waveHalfWidth) + 1) / 2); else objPos.setZ (0); } else // object is at the right side { // Set y/z position to the y/z position of the object at the left // on the same row (previous object) Point3d &leftObjPos = (object - 1)->position (); objPos.setY (leftObjPos.y ()); objPos.setZ (leftObjPos.z ()); } float origx = wx + mModel->scale ().x () * (owidth * object->gridPosition ().x () - outExtents.left); objPos.setX (origx); } } ./plugins/animation/src/dodge.cpp0000644000004100000410000006134613246301623017272 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * dodge.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Dodge ========================= void DodgeAnim::applyDodgeTransform () { if (mDodgeData->isDodgeSubject && mDodgeDirection == DodgeDirectionNone) return; float amountX = 0.0f; float amountY = 0.0f; if (mDodgeMaxAmountX != 0) amountX = sin (M_PI * mTransformProgress) * mDodgeMaxAmountX; if (mDodgeMaxAmountY != 0) amountY = sin (M_PI * mTransformProgress) * mDodgeMaxAmountY; mTransform.translate (amountX, amountY, 0.0f); } bool DodgeAnim::moveUpdate (int dx, int dy) { if (mDodgeData->isDodgeSubject && mDodgeDirection == DodgeDirectionXY) { mDodgeDirection = DodgeDirectionNone; mDodgeMaxAmountX = 0; mDodgeMaxAmountY = 0; } CompWindow *wBottommost = ExtensionPluginAnimation::getBottommostInRestackChain (mWindow); // Update dodge amount for the dodgers of all subjects // in the restack chain RestackPersistentData *dataCur; for (CompWindow *wCur = wBottommost; wCur; wCur = dataCur->mMoreToBePaintedNext) { AnimWindow *awCur = AnimWindow::get (wCur); dataCur = static_cast (awCur->persistentData["restack"]); if (!dataCur) break; Animation *curAnim = awCur->curAnimation (); if (!curAnim || curAnim->info () != AnimEffectDodge) continue; DodgePersistentData *dodgeDataDodger; // Update dodge amount for each dodger for (CompWindow *dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; if (animDodger->mDodgeSubjectWin && animDodger->mTransformProgress <= 0.5f) animDodger->updateDodgerDodgeAmount (); } } return false; } /// Should only be called for non-subjects. void DodgeAnim::updateDodgerDodgeAmount () { // Find the box to be dodged, it can contain multiple windows // when there are dialog/utility windows of subject windows // (stacked in the mMoreToBePaintedNext chain). // Then this would be a bounding box of the subject windows // intersecting with dodger. CompRect subjectRect (unionRestackChain (mDodgeSubjectWin).boundingRect ()); // Update dodge amount if subject window(s) moved during dodge float newDodgeAmount = getDodgeAmount (subjectRect, mWindow, mDodgeDirection); // Only update if amount got larger if (((mDodgeDirection == DodgeDirectionDown && newDodgeAmount > 0) || (mDodgeDirection == DodgeDirectionUp && newDodgeAmount < 0)) && abs (newDodgeAmount) > abs (mDodgeMaxAmountY)) mDodgeMaxAmountY = newDodgeAmount; else if (((mDodgeDirection == DodgeDirectionRight && newDodgeAmount > 0) || (mDodgeDirection == DodgeDirectionLeft && newDodgeAmount < 0)) && abs (newDodgeAmount) > abs (mDodgeMaxAmountX)) mDodgeMaxAmountX = newDodgeAmount; } float DodgeAnim::dodgeProgress () { float forwardProgress = progressLinear (); forwardProgress = 1 - forwardProgress; return forwardProgress; } void DodgeAnim::step () { TransformAnim::step (); mTransformProgress = 0; float forwardProgress = dodgeProgress (); if (forwardProgress > mTransformStartProgress) { // Compute transform progress and normalize mTransformProgress = (forwardProgress - mTransformStartProgress) / (1 - mTransformStartProgress); } mTransform.reset (); applyDodgeTransform (); } void DodgeAnim::updateTransform (GLMatrix &wTransform) { TransformAnim::updateTransform (wTransform); } void DodgeAnim::postPreparePaint () { // Only dodge subjects (with dodger chains) should be processed here if (!mDodgeData || !mDodgeData->isDodgeSubject || !mDodgeData->dodgeChainStart || !mRestackData || !mRestackData->restackInfo () || mDodgeData->skipPostPrepareScreen) return; // Find the bottommost subject in restack chain CompWindow *wBottommost = mWindow; RestackPersistentData *dataCur; for (CompWindow *wCur = mRestackData->mMoreToBePaintedPrev; wCur; wCur = dataCur->mMoreToBePaintedPrev) { wBottommost = wCur; dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); if (!dataCur) break; } AnimWindow *awBottommost = AnimWindow::get (wBottommost); RestackPersistentData *restackDataBottommost = static_cast (awBottommost->persistentData["restack"]); // Find the first dodging window that hasn't yet // reached 50% progress yet. The subject window should be // painted right behind that one (or right in front of it // if subject is being lowered). RestackPersistentData *restackDataDodger = NULL; DodgePersistentData *dodgeDataDodger = NULL; CompWindow *dw; for (dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); restackDataDodger = static_cast (adw->persistentData["restack"]); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; if (!(animDodger->mTransformProgress > 0.5f)) break; } RestackInfo *bottommostRestackInfo = restackDataBottommost->restackInfo (); if (!bottommostRestackInfo) return; if (bottommostRestackInfo->raised && // if mWindow's host should change dw != restackDataBottommost->mWinThisIsPaintedBefore) { if (restackDataBottommost->mWinThisIsPaintedBefore) { // Clear old host RestackPersistentData *dataOldHost = static_cast (AnimWindow::get (restackDataBottommost-> mWinThisIsPaintedBefore)-> persistentData["restack"]); dataOldHost->mWinToBePaintedBeforeThis = 0; } // if a dodger win. is still at <0.5 progress if (dw && restackDataDodger) // Put subject right behind new host restackDataDodger->mWinToBePaintedBeforeThis = wBottommost; // otherwise all dodger win.s have passed 0.5 progress CompWindow *wCur = wBottommost; while (wCur) { RestackPersistentData *dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); // dw can be null, which is ok dataCur->mWinThisIsPaintedBefore = dw; wCur = dataCur->mMoreToBePaintedNext; } } else if (!bottommostRestackInfo->raised) { // Put the subject right in front of dw. // But we need to find the (dodger) window above dw // (since we need to put the subject *behind* a window). CompWindow *wDodgeChainAbove = 0; // if a dodger win. is still at <0.5 progress if (dw && dodgeDataDodger) { if (dodgeDataDodger->dodgeChainPrev) wDodgeChainAbove = dodgeDataDodger->dodgeChainPrev; else // Use the wOldAbove of topmost subject wDodgeChainAbove = mRestackData->restackInfo ()->wOldAbove; if (!wDodgeChainAbove) compLogMessage ("animation", CompLogLevelError, "%s: error at line %d", __FILE__, __LINE__); else if (restackDataBottommost->mWinThisIsPaintedBefore != wDodgeChainAbove) // w's host is changing { RestackPersistentData *dataNewHost = static_cast (AnimWindow::get (wDodgeChainAbove)-> persistentData["restack"]); // Put subject right behind new host dataNewHost->mWinToBePaintedBeforeThis = wBottommost; } } if (restackDataBottommost->mWinThisIsPaintedBefore && restackDataBottommost->mWinThisIsPaintedBefore != wDodgeChainAbove) { // Clear old host RestackPersistentData *dataOldHost = static_cast (AnimWindow::get (restackDataBottommost-> mWinThisIsPaintedBefore)-> persistentData["restack"]); dataOldHost->mWinToBePaintedBeforeThis = 0; } // otherwise all dodger win.s have passed 0.5 progress CompWindow *wCur = wBottommost; while (wCur) { RestackPersistentData *dataCur = static_cast (AnimWindow::get (wCur)->persistentData["restack"]); // wDodgeChainAbove can be null, which is ok dataCur->mWinThisIsPaintedBefore = wDodgeChainAbove; wCur = dataCur->mMoreToBePaintedNext; } } } bool DodgeAnim::shouldDamageWindowOnStart () { // for dodging windows only, when subject is fixed return !(mDodgeMode == AnimationOptions::DodgeModeFixedClickedWindow && mDodgeData->isDodgeSubject); } void DodgeAnim::updateBB (CompOutput &output) { TransformAnim::updateBB (output); } DodgeAnim::DodgeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), RestackAnim::RestackAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), mDodgeData (static_cast (AnimWindow::get (w)->persistentData["dodge"])), mDodgeSubjectWin (0), mDodgeMaxAmountX (0), mDodgeMaxAmountY (0), mDodgeDirection (DodgeDirectionNone), mDodgeMode (optValI (AnimationOptions::DodgeMode)) { } void DodgeAnim::cleanUp (bool closing, bool destructing) { // Remove this window from its subject's dodger chain if (mDodgeSubjectWin) { CompWindow *w = mDodgeSubjectWin; AnimWindow *aw = AnimWindow::get (w); Animation *curAnim = aw->curAnimation (); DodgePersistentData *dodgeData = static_cast (aw->persistentData["dodge"]); if (curAnim && curAnim->info () == AnimEffectDodge && // Only process subjects with a dodge chain dodgeData && dodgeData->dodgeChainStart && dodgeData->isDodgeSubject) { // Go through each dodger, checking if this is that one // dw: Dodger window DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = dodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); if (dw == mWindow) { // Remove mWindow from the chain CompWindow *dwNext = dodgeDataDodger->dodgeChainNext; if (dwNext) { AnimWindow *adwNext = AnimWindow::get (dwNext); DodgePersistentData *dodgeDataDodgerNext = static_cast (adwNext->persistentData["dodge"]); dodgeDataDodgerNext->dodgeChainPrev = dodgeDataDodger->dodgeChainPrev; } CompWindow *dwPrev = dodgeDataDodger->dodgeChainPrev; if (dwPrev) { AnimWindow *adwPrev = AnimWindow::get (dwPrev); DodgePersistentData *dodgeDataDodgerPrev = static_cast (adwPrev->persistentData["dodge"]); dodgeDataDodgerPrev->dodgeChainNext = dodgeDataDodger->dodgeChainNext; } if (dodgeData->dodgeChainStart == mWindow) dodgeData->dodgeChainStart = dodgeDataDodger->dodgeChainNext; dodgeDataDodger->dodgeChainPrev = 0; dodgeDataDodger->dodgeChainNext = 0; } } } } else { DodgePersistentData *dodgeData = static_cast (mAWindow->persistentData["dodge"]); if (dodgeData && dodgeData->isDodgeSubject) { // Update this window's dodgers so that they no longer point // to this window as their subject DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = dodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); if (!adw) break; dodgeDataDodger = static_cast (adw->persistentData["dodge"]); Animation *curAnim = adw->curAnimation (); if (curAnim && curAnim->info () == AnimEffectDodge) { DodgeAnim *animDodger = dynamic_cast (curAnim); if (!animDodger) continue; if (animDodger->mDodgeSubjectWin == mWindow) animDodger->mDodgeSubjectWin = NULL; } } } } // Reset dodge parameters //if (!(restackData->mMoreToBePaintedPrev || // restackData->mMoreToBePaintedNext)) //{ mDodgeData->isDodgeSubject = false; mDodgeData->skipPostPrepareScreen = false; //} RestackAnim::cleanUp (closing, destructing); } int DodgeAnim::getDodgeAmount (CompRect &rect, CompWindow *dw, DodgeDirection dir) { CompRect dRect (dw->borderRect ().x () + (dw->outputRect ().x () - dw->borderRect ().x ()) / 2, dw->borderRect ().y () + (dw->outputRect ().y () - dw->borderRect ().y ()) / 2, (dw->borderRect ().width () + dw->outputRect ().width ()) / 2, (dw->borderRect ().height () + dw->outputRect ().height ()) / 2); int amount = 0; switch (dir) { case DodgeDirectionUp: amount = (rect.y () - (dRect.y () + dRect.height ())); break; case DodgeDirectionDown: amount = (rect.y () + rect.height () - dRect.y ()); break; case DodgeDirectionLeft: amount = (rect.x () - (dRect.x () + dRect.width ())); break; case DodgeDirectionRight: amount = (rect.x () + rect.width () - dRect.x ()); break; default: break; } return amount; } void DodgeAnim::processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates) { AnimWindow *aCandidateWin = AnimWindow::get (candidateWin); AnimScreen *as = AnimScreen::get (::screen); if ((!aCandidateWin->curAnimation () || aCandidateWin->curAnimation ()->info () == AnimEffectDodge) && candidateWin != subjectWin) // don't let the subject dodge itself { // Mark this window for dodge bool nonMatching = false; if (as->getMatchingAnimSelection (candidateWin, AnimEventFocus, 0) != AnimEffectDodge) nonMatching = true; ++numSelectedCandidates; DodgePersistentData *data = static_cast (aCandidateWin->persistentData["dodge"]); data->dodgeOrder = numSelectedCandidates; if (nonMatching) // Use neg. values for non-matching windows data->dodgeOrder *= -1; } } void DodgeAnim::postInitiateRestackAnim (int numSelectedCandidates, int duration, CompWindow *wStart, CompWindow *wEnd, bool raised) { DodgePersistentData *dataSubject = mDodgeData; if (!dataSubject) return; dataSubject->isDodgeSubject = true; dataSubject->dodgeChainStart = 0; if (mRestackData && mRestackData->mIsSecondary) return; // We're done here float maxTransformTotalProgress = 0; float dodgeMaxStartProgress = numSelectedCandidates * optValF (AnimationOptions::DodgeGapRatio) * duration / 1000.0f; CompWindow *wDodgeChainLastVisited = 0; // dw: Dodger window(s) for (CompWindow *dw = wStart; dw && dw != wEnd->next; dw = dw->next) { AnimWindow *adw = AnimWindow::get (dw); DodgePersistentData *dataDodger = static_cast (adw->persistentData["dodge"]); // Skip non-dodgers if (dataDodger->dodgeOrder == 0) continue; // Initiate dodge for this window bool stationaryDodger = false; if (dataDodger->dodgeOrder < 0) { dataDodger->dodgeOrder *= -1; // Make it positive again stationaryDodger = true; } if (!adw->curAnimation ()) { // Create dodge animation for dodger adw->createFocusAnimation (AnimEffectDodge); ExtensionPluginAnimation *extPlugin = static_cast (getExtensionPluginInfo ()); extPlugin->incrementCurRestackAnimCount (); } DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; animDodger->mDodgeSubjectWin = mWindow; if (mDodgeMode == AnimationOptions::DodgeModeFixedClickedWindow) { // Slight change in dodge movement start // to reflect stacking order of dodger windows if (raised) animDodger->mTransformStartProgress = dodgeMaxStartProgress * (dataDodger->dodgeOrder - 1) / numSelectedCandidates; else animDodger->mTransformStartProgress = dodgeMaxStartProgress * (1 - (float)dataDodger->dodgeOrder / numSelectedCandidates); } float transformTotalProgress = 1 + animDodger->mTransformStartProgress; if (maxTransformTotalProgress < transformTotalProgress) maxTransformTotalProgress = transformTotalProgress; // normalize animDodger->mTransformStartProgress /= transformTotalProgress; if (stationaryDodger) { animDodger->mTransformStartProgress = 0; transformTotalProgress = 0; } animDodger->mTotalTime = transformTotalProgress * duration; animDodger->mRemainingTime = animDodger->mTotalTime; // Put window on dodge chain // if dodge chain was started before if (wDodgeChainLastVisited) { DodgePersistentData *dataDodgeChainLastVisited = static_cast (AnimWindow::get (wDodgeChainLastVisited)-> persistentData["dodge"]); if (raised) dataDodgeChainLastVisited->dodgeChainNext = dw; else dataDodgeChainLastVisited->dodgeChainPrev = dw; } else if (raised) // mark chain start dataSubject->dodgeChainStart = dw; if (raised) { dataDodger->dodgeChainPrev = wDodgeChainLastVisited; dataDodger->dodgeChainNext = 0; } else { dataDodger->dodgeChainPrev = 0; dataDodger->dodgeChainNext = wDodgeChainLastVisited; } wDodgeChainLastVisited = dw; // Reset back to 0 for the next dodge calculation dataDodger->dodgeOrder = 0; } // if subject is being lowered, // point chain-start to the topmost doding window if (!raised) dataSubject->dodgeChainStart = wDodgeChainLastVisited; mTotalTime = maxTransformTotalProgress * duration; mRemainingTime = mTotalTime; } void DodgeAnim::calculateDodgeAmounts () { // holds whether each side of the subject is covered by dodgers or not bool coveredSides[4] = {false, false, false, false}; // maximum distance between a dodger window and the subject in X and Y axes int maxDistX = 0; int maxDistXActual = 0; int maxDistY = 0; int maxDistYActual = 0; CompRect subjectRect (unionRestackChain (mWindow).boundingRect ()); // Go through each dodger, calculating its dodge amount. // dw: Dodger window DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; // Find direction (left, right, up, down) that minimizes dodge amount int dodgeAmount[4]; for (int i = 0; i < 4; ++i) dodgeAmount[i] = DodgeAnim::getDodgeAmount (subjectRect, dw, (DodgeDirection)i); int amountMinActual = dodgeAmount[0]; int amountMinAbs = abs (amountMinActual); int iMin = 0; for (int i = 1; i < 4; ++i) { int absAmount = abs (dodgeAmount[i]); if (amountMinAbs > absAmount) { amountMinAbs = absAmount; amountMinActual = dodgeAmount[i]; iMin = i; } } if (iMin == DodgeDirectionUp || iMin == DodgeDirectionDown) { animDodger->mDodgeMaxAmountX = 0; animDodger->mDodgeMaxAmountY = dodgeAmount[iMin]; if (mDodgeMode == AnimationOptions::DodgeModeAllMoving && maxDistY < amountMinAbs) { maxDistY = amountMinAbs; maxDistYActual = amountMinActual; } } else { animDodger->mDodgeMaxAmountX = dodgeAmount[iMin]; animDodger->mDodgeMaxAmountY = 0; if (mDodgeMode == AnimationOptions::DodgeModeAllMoving && maxDistX < amountMinAbs) { maxDistX = amountMinAbs; maxDistXActual = amountMinActual; } } animDodger->mDodgeDirection = (DodgeDirection)iMin; coveredSides[iMin] = true; } if (mDodgeMode == AnimationOptions::DodgeModeFixedClickedWindow) { // Subject doesn't move mDodgeMaxAmountX = 0; mDodgeMaxAmountY = 0; mDodgeDirection = DodgeDirectionNone; } else { // Subject should dodge in an axis if only one side is // covered by a dodger. bool subjectDodgesInX = (coveredSides[DodgeDirectionLeft] ^ coveredSides[DodgeDirectionRight]); bool subjectDodgesInY = (coveredSides[DodgeDirectionUp] ^ coveredSides[DodgeDirectionDown]); float dodgeAmountX = subjectDodgesInX ? -maxDistXActual / 2 : 0; float dodgeAmountY = subjectDodgesInY ? -maxDistYActual / 2 : 0; DodgeDirection dodgeDirection; if (!subjectDodgesInX && !subjectDodgesInY) dodgeDirection = DodgeDirectionNone; else dodgeDirection = DodgeDirectionXY; CompWindow *wBottommost = ExtensionPluginAnimation::getBottommostInRestackChain (mWindow); float offsetX = 0; float offsetY = 0; float offsetIncrementX = (dodgeAmountX == 0 ? 0 : 100 * dodgeAmountX / fabs (dodgeAmountX)); float offsetIncrementY = (dodgeAmountY == 0 ? 0 : 100 * dodgeAmountY / fabs (dodgeAmountY)); // Set dodge amount and direction for all subjects // in the restack chain RestackPersistentData *dataCur; for (CompWindow *wCur = wBottommost; wCur; wCur = dataCur->mMoreToBePaintedNext, offsetX += offsetIncrementX, offsetY += offsetIncrementY) { AnimWindow *awCur = AnimWindow::get (wCur); dataCur = static_cast (awCur->persistentData["restack"]); if (!dataCur) break; Animation *curAnim = awCur->curAnimation (); if (!curAnim || curAnim->info () != AnimEffectDodge) continue; DodgeAnim *dodgeAnim = dynamic_cast (curAnim); if (!dodgeAnim) continue; dodgeAnim->mDodgeMaxAmountX = dodgeAmountX + offsetX; dodgeAnim->mDodgeMaxAmountY = dodgeAmountY + offsetY; dodgeAnim->mDodgeDirection = dodgeDirection; dodgeAnim->mTransformStartProgress = 0; } if (dodgeDirection == DodgeDirectionXY) { // Go through each dodger, adjusting its dodge amount if the // subject(s) is dodging in that axis (X or Y). // dw: Dodger window DodgePersistentData *dodgeDataDodger; for (CompWindow *dw = mDodgeData->dodgeChainStart; dw; dw = dodgeDataDodger->dodgeChainNext) { AnimWindow *adw = AnimWindow::get (dw); dodgeDataDodger = static_cast (adw->persistentData["dodge"]); DodgeAnim *animDodger = dynamic_cast (adw->curAnimation ()); if (!animDodger) continue; // if both dodge in X axis if (subjectDodgesInX && animDodger->mDodgeMaxAmountX != 0) { if (animDodger->mDodgeMaxAmountX * (animDodger->mDodgeMaxAmountX + dodgeAmountX) < 0) // If the sign is going to change, just reset instead animDodger->mDodgeMaxAmountX = 0; else animDodger->mDodgeMaxAmountX += dodgeAmountX; } // if both dodge in Y axis if (subjectDodgesInY && animDodger->mDodgeMaxAmountY != 0) { if (animDodger->mDodgeMaxAmountY * (animDodger->mDodgeMaxAmountY + dodgeAmountY) < 0) { // If the sign is going to change, just reset instead animDodger->mDodgeMaxAmountY = 0; } else animDodger->mDodgeMaxAmountY += dodgeAmountY; } } } } } bool DodgeAnim::paintedElsewhere () { bool elsewhere = mRestackData && mRestackData->mWinThisIsPaintedBefore && // has to be currently hosted mDodgeData && mDodgeData->isDodgeSubject && overNewCopy (); return elsewhere; } DodgePersistentData::DodgePersistentData () : dodgeOrder (0), isDodgeSubject (false), skipPostPrepareScreen (false), dodgeChainStart (0), dodgeChainPrev (0), dodgeChainNext (0) { } ./plugins/animation/src/dream.cpp0000644000004100000410000001017413246301623017271 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * dream.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float DreamAnim::kDurationFactor = 1.67; // ===================== Effect: Dream ========================= DreamAnim::DreamAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridZoomAnim::GridZoomAnim (w, curWindowEvent, duration, info, icon) { } void DreamAnim::init () { GridZoomAnim::init (); if (!zoomToIcon ()) mUsingTransform = false; } void DreamAnim::adjustDuration () { if (zoomToIcon ()) mTotalTime *= ZoomAnim::kDurationFactor; else mTotalTime *= kDurationFactor; mRemainingTime = mTotalTime; } void DreamAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option } void DreamAnim::step () { GridZoomAnim::step (); float forwardProgress = getActualProgress (); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float waveAmpMax = MIN (oheight, owidth) * 0.125f; float waveWidth = 10.0f; float waveSpeed = 7.0f; GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); Point &objGridPos = object->gridPosition (); if (i % 2 == 0) // object is at the left side { float origy = (wy + (oheight * objGridPos.y () - outExtents.top) * mModel->scale ().y ()); objPos.setY (origy); } else // object is at the right side { // Set y position to the y position of the object at the left // on the same row (previous object) objPos.setY ((object - 1)->position ().y ()); } float origx = (wx + (owidth * objGridPos.x () - outExtents.left) * mModel->scale ().x ()); objPos.setX ( origx + forwardProgress * waveAmpMax * mModel->scale ().x () * sin (objGridPos.y () * M_PI * waveWidth + waveSpeed * forwardProgress)); } } float DreamAnim::getFadeProgress () { if (zoomToIcon ()) return ZoomAnim::getFadeProgress (); return progressLinear (); } bool DreamAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::DreamZoomToTaskbar)); } ./plugins/animation/src/animation.cpp0000644000004100000410000023341113246301623020161 0ustar www-datawww-data/** * Animation plugin for compiz/beryl * * animation.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Airplane added by : Carlo Palma * E-mail : carlopalma@salug.it * Based on code originally written by Mark J. Kilgard * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Fold and Skewer added by : Tomasz Kolodziejski * E-mail : tkolodziejski@gmail.com * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to GLES by : Travis Watkins * (C) 2011 Linaro Limited * E-mail : travis.watkins@linaro.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ /* * TODO: * * - Custom bounding box update function for Airplane * * - Auto direction option: Close in opposite direction of opening * - Proper side surface normals for lighting * - decoration shadows * - shadow quad generation * - shadow texture coords (from clip tex. matrices) * - draw shadows * - fade in shadows * * - Voronoi tessellation * - Brick tessellation * - Triangle tessellation * - Hexagonal tessellation * * Effects: * - Circular action for tornado type fx * - Tornado 3D (especially for minimize) * - Helix 3D (hor. strips descend while they rotate and fade in) * - Glass breaking 3D * - Gaussian distr. points (for gradually increasing polygon size * starting from center or near mouse pointer) * - Drawing cracks * - Gradual cracking * * - fix slowness during transparent cube with <100 opacity * - fix occasional wrong side color in some windows * - fix on top windows and panels * (These two only matter for viewing during Rotate Cube. * All windows should be painted with depth test on * like 3d-plugin does) * - play better with rotate (fix cube face drawn on top of polygons * after 45 deg. rotation) * */ #include #include #include #include #include #include "private.h" using namespace compiz::core; class AnimPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (animation, AnimPluginVTable); static const unsigned short FAKE_ICON_SIZE = 4; const unsigned short LAST_ANIM_DIRECTION = 5; const unsigned short NUM_EFFECTS = 16; const char *eventNames[AnimEventNum] = {"Open", "Close", "Minimize", "Unminimize", "Shade", "Focus"}; int chosenEffectOptionIds[AnimEventNum] = { AnimationOptions::OpenEffects, AnimationOptions::CloseEffects, AnimationOptions::MinimizeEffects, AnimationOptions::UnminimizeEffects, AnimationOptions::ShadeEffects, AnimationOptions::FocusEffects, }; int randomEffectOptionIds[AnimEventNum] = { AnimationOptions::OpenRandomEffects, AnimationOptions::CloseRandomEffects, AnimationOptions::MinimizeRandomEffects, AnimationOptions::UnminimizeRandomEffects, AnimationOptions::ShadeRandomEffects, -1 }; int customOptionOptionIds[AnimEventNum] = { AnimationOptions::OpenOptions, AnimationOptions::CloseOptions, AnimationOptions::MinimizeOptions, AnimationOptions::UnminimizeOptions, AnimationOptions::ShadeOptions, AnimationOptions::FocusOptions }; int matchOptionIds[AnimEventNum] = { AnimationOptions::OpenMatches, AnimationOptions::CloseMatches, AnimationOptions::MinimizeMatches, AnimationOptions::UnminimizeMatches, AnimationOptions::ShadeMatches, AnimationOptions::FocusMatches }; int durationOptionIds[AnimEventNum] = { AnimationOptions::OpenDurations, AnimationOptions::CloseDurations, AnimationOptions::MinimizeDurations, AnimationOptions::UnminimizeDurations, AnimationOptions::ShadeDurations, AnimationOptions::FocusDurations }; // Bind each effect in the list of chosen effects for every event, to the // corresponding animation effect (i.e. effect with that name) if it is // provided by a plugin, otherwise set it to None. void PrivateAnimScreen::updateEventEffects (AnimEvent e, bool forRandom, bool callPost) { CompOption::Value::Vector *listVal; EffectSet *effectSet; if (forRandom) { listVal = &getOptions ()[(unsigned)randomEffectOptionIds[e]].value (). list (); effectSet = &mRandomEffects[e]; } else { listVal = &getOptions ()[(unsigned)chosenEffectOptionIds[e]].value (). list (); effectSet = &mEventEffects[e]; } unsigned int n = listVal->size (); effectSet->effects.clear (); effectSet->effects.reserve (n); AnimEffectVector &eventEffectsAllowed = mEventEffectsAllowed[e]; for (unsigned int r = 0; r < n; ++r) // for each row { const CompString &animName = (*listVal)[r].s (); // Find the animation effect with matching name AnimEffectVector::iterator it = find_if (eventEffectsAllowed.begin (), eventEffectsAllowed.end (), boost::bind (&AnimEffectInfo::matchesEffectName, _1, animName)); effectSet->effects.push_back (it == eventEffectsAllowed.end () ? AnimEffectNone : *it); } if (callPost) { foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->postUpdateEventEffects (e, forRandom); } } void PrivateAnimScreen::updateAllEventEffects () { // for each anim event for (int e = 0; e < AnimEventNum; ++e) updateEventEffects ((AnimEvent)e, false); // for each anim event except focus for (int e = 0; e < AnimEventNum - 1; ++e) updateEventEffects ((AnimEvent)e, true); } bool PrivateAnimScreen::isAnimEffectInList (AnimEffect theEffect, EffectSet &effectList) { for (unsigned int i = 0; i < effectList.effects.size (); ++i) if (effectList.effects[i] == theEffect) return true; return false; } bool PrivateAnimScreen::isAnimEffectPossibleForEvent (AnimEffect theEffect, AnimEvent event) { // Check all rows to see if the effect is chosen there unsigned int nRows = mEventEffects[event].effects.size (); for (unsigned int i = 0; i < nRows; ++i) { AnimEffect chosenEffect = mEventEffects[event].effects[i]; // if chosen directly if (chosenEffect == theEffect) return true; // if chosen in random pool if (mRandomEffects[event].effects.size () && chosenEffect == AnimEffectRandom && isAnimEffectInList (theEffect, mRandomEffects[event])) return true; } return false; } bool PrivateAnimScreen::isAnimEffectPossible (AnimEffect theEffect) { for (int e = 0; e < AnimEventNum; ++e) if (isAnimEffectPossibleForEvent (theEffect, (AnimEvent)e)) return true; return false; } bool PrivateAnimScreen::isRestackAnimPossible () { // Check all rows to see if the chosen effect is a restack animation unsigned int nRows = mEventEffects[AnimEventFocus].effects.size (); for (unsigned int i = 0; i < nRows; ++i) { AnimEffect chosenEffect = mEventEffects[(unsigned)AnimEventFocus]. effects[i]; if (chosenEffect->isRestackAnim) return true; } return false; } bool AnimScreen::isRestackAnimPossible () { return priv->isRestackAnimPossible (); } // Extension functions void AnimScreen::addExtension (ExtensionPluginInfo *extensionPluginInfo) { priv->addExtension (extensionPluginInfo, true); } void PrivateAnimScreen::addExtension (ExtensionPluginInfo *extensionPluginInfo, bool shouldInitPersistentData) { mExtensionPlugins.push_back (extensionPluginInfo); unsigned int nPluginEffects = extensionPluginInfo->nEffects; bool eventEffectsNeedUpdate[AnimEventNum] = {false, false, false, false, false}; // Put this plugin's effects into mEventEffects and // mEventEffectsAllowed for (unsigned int j = 0; j < nPluginEffects; ++j) { const AnimEffect effect = extensionPluginInfo->effects[j]; // Update allowed effects for each event for (int e = 0; e < AnimEventNum; ++e) { if (effect->usedForEvents[e]) { mEventEffectsAllowed[e].push_back (effect); eventEffectsNeedUpdate[e] = true; } } } for (int e = 0; e < AnimEventNum; ++e) { if (eventEffectsNeedUpdate[e]) { updateEventEffects ((AnimEvent)e, false, false); if (e != AnimEventFocus) updateEventEffects ((AnimEvent)e, true, false); } } if (shouldInitPersistentData) { const CompWindowList &pl = pushLockedPaintList (); AnimWindow *aw; // Initialize persistent window data for the extension plugin foreach (CompWindow *w, pl) { aw = AnimWindow::get (w); extensionPluginInfo->initPersistentData (aw); } popLockedPaintList (); } } void AnimScreen::removeExtension (ExtensionPluginInfo *extensionPluginInfo) { priv->removeExtension (extensionPluginInfo); } void PrivateAnimScreen::removeExtension (ExtensionPluginInfo *extensionPluginInfo) { // Stop all ongoing animations const CompWindowList &pl = pushLockedPaintList (); PrivateAnimWindow *aw; foreach (CompWindow *w, pl) { aw = AnimWindow::get (w)->priv; if (aw->curAnimation ()) aw->postAnimationCleanUp (); } popLockedPaintList (); // Find the matching plugin and delete it ExtensionPluginVector::iterator it = find (mExtensionPlugins.begin (), mExtensionPlugins.end (), extensionPluginInfo); if (it == mExtensionPlugins.end ()) return; // couldn't find that extension plugin mExtensionPlugins.erase (it); if (extensionPluginInfo->nEffects == 0) return; // no animation effects -> we're done here // Also delete the "allowed effect" entries for that plugin for (int e = 0; e < AnimEventNum; ++e) { AnimEffectVector &eventEffectsAllowed = mEventEffectsAllowed[e]; // Find the first animation effect with matching name AnimEffectVector::iterator itBeginEffect = find_if (eventEffectsAllowed.begin (), eventEffectsAllowed.end (), boost::bind (&AnimEffectInfo::matchesPluginName, _1, extensionPluginInfo->name)); if (itBeginEffect == eventEffectsAllowed.end ()) continue; // plugin didn't provide any effects for this event // Find the first animation effect with non-matching name, // starting with itBeginEffect AnimEffectVector::iterator itEndEffect = find_if (itBeginEffect, eventEffectsAllowed.end (), boost::bind (&AnimEffectInfo::matchesPluginName, _1, extensionPluginInfo->name) == false); eventEffectsAllowed.erase (itBeginEffect, itEndEffect); // Update event effects to complete removal updateEventEffects ((AnimEvent)e, false); if (e != AnimEventFocus) updateEventEffects ((AnimEvent)e, true); } const CompWindowList &cpl = pushLockedPaintList (); // Destroy persistent window data for the extension plugin foreach (CompWindow *w, cpl) { AnimWindow *aw = AnimWindow::get (w); extensionPluginInfo->destroyPersistentData (aw); } popLockedPaintList (); } ExtensionPluginInfo::ExtensionPluginInfo (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : name (name), nEffects (nEffects), effects (effects), effectOptions (effectOptions), firstEffectOptionIndex (firstEffectOptionIndex) { } // End of extension functions Animation::Animation (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : mWindow (w), mAWindow (AnimWindow::get (w)), mTotalTime (duration), mRemainingTime (duration), mTimeElapsedWithinTimeStep (0), mOverrideProgressDir (0), mCurPaintAttrib (GLWindow::defaultPaintAttrib), mStoredOpacity (CompositeWindow::get (w)->opacity ()), mCurWindowEvent (curWindowEvent), mInitialized (false), // store window opacity mInfo (info), mIcon (icon) { if (curWindowEvent == WindowEventShade || curWindowEvent == WindowEventUnshade) { mDecorTopHeight = w->output ().top; mDecorBottomHeight = w->output ().bottom; } PrivateAnimScreen *as = mAWindow->priv->paScreen (); mTimestep = as->optionGetTimeStep (); } Animation::~Animation () {} CompOption::Value & Animation::optVal (unsigned int optionId) { return mAWindow->pluginOptVal (getExtensionPluginInfo (), optionId, this); } /// Play the animation effect backwards from where it left off. void Animation::reverse () { mRemainingTime = mTotalTime - mRemainingTime; // avoid window remains if (mRemainingTime <= 0) mRemainingTime = 1; switch (mCurWindowEvent) // the old event { case WindowEventOpen: mCurWindowEvent = WindowEventClose; break; case WindowEventClose: mCurWindowEvent = WindowEventOpen; break; case WindowEventMinimize: mCurWindowEvent = WindowEventUnminimize; break; case WindowEventUnminimize: mCurWindowEvent = WindowEventMinimize; break; case WindowEventShade: mCurWindowEvent = WindowEventUnshade; break; case WindowEventUnshade: mCurWindowEvent = WindowEventShade; break; default: break; } // 1: forward, 2: backward (3 - progressDir is opposite direction) int progressDir = 1; switch (mCurWindowEvent) // the new event { case WindowEventClose: case WindowEventMinimize: case WindowEventShade: progressDir = 2; break; default: break; } if (mOverrideProgressDir == 0) mOverrideProgressDir = progressDir; else if (mOverrideProgressDir == 3 - progressDir) mOverrideProgressDir = 0; // disable override } PartialWindowAnim::PartialWindowAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mUseDrawRegion (false), mDrawRegion () { } void PrivateAnimWindow::updateSelectionRow (unsigned int r) { mPrevAnimSelectionRow = mCurAnimSelectionRow; mCurAnimSelectionRow = (int)r; } // Assumes events in the metadata are in // [Open, Close, Minimize, Unminimize, Shade, Focus] order // and effects among those are in alphabetical order // but with "(Event) None" first and "(Event) Random" last. AnimEffect PrivateAnimScreen::getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration) { PrivateAnimWindow *aw = AnimWindow::get (w)->priv; EffectSet *eventEffects = &mEventEffects[e]; CompOption::Value &valMatch = getOptions ()[(unsigned)matchOptionIds[e]].value (); CompOption::Value &valDuration = getOptions ()[(unsigned)durationOptionIds[e]].value (); CompOption::Value &valCustomOptions = getOptions ()[(unsigned)customOptionOptionIds[e]].value (); unsigned int nRows = valMatch.list ().size (); if (nRows != eventEffects->effects.size () || nRows != valDuration.list ().size () || nRows != valCustomOptions.list ().size ()) { compLogMessage ("animation", CompLogLevelError, "Animation settings mismatch in \"Animation " "Selection\" list for %s event.", eventNames[e]); return AnimEffectNone; } // Find the first row that matches this window for this event for (unsigned int i = 0; i < nRows; ++i) { if (!valMatch.list ()[i].match ().evaluate (w)) continue; aw->updateSelectionRow (i); if (duration) *duration = valDuration.list ()[i].i (); AnimEffect effect = eventEffects->effects[i]; return (effect ? effect : AnimEffectNone); } return AnimEffectNone; } AnimEffect PrivateAnimScreen::getActualEffect (AnimEffect effect, AnimEvent animEvent) { bool allRandom = optionGetAllRandom (); AnimEffectVector *randomEffects = &mRandomEffects[animEvent].effects; unsigned int nRandomEffects = randomEffects->size (); if ((effect == AnimEffectRandom) || allRandom) { unsigned int nFirstRandomEffect = 0; if (nRandomEffects == 0) // no random animation selected, assume "all" { randomEffects = &mEventEffectsAllowed[animEvent]; // exclude None and Random nFirstRandomEffect = 2; nRandomEffects = randomEffects->size () - 2; } unsigned int index = nFirstRandomEffect + (unsigned int)(nRandomEffects * (double)rand () / RAND_MAX); return (*randomEffects)[index]; } else return effect; } /// Converts animation direction (up, down, left, right, random, auto) /// to an actual direction (up, down, left, or right). AnimDirection Animation::getActualAnimDirection (AnimDirection dir, bool openDir) { if (dir == AnimDirectionRandom) dir = (AnimDirection)(rand () % 4); else if (dir == AnimDirectionAuto) { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); // away from icon int centerX = outRect.centerX (); int centerY = outRect.centerY (); float relDiffX = ((float)centerX - mIcon.x ()) / outRect.width (); float relDiffY = ((float)centerY - mIcon.y ()) / outRect.height (); if (openDir) { if (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) // min/unmin. should always result in +/- y direction dir = (mIcon.y () < (int)::screen->height () - mIcon.y ()) ? AnimDirectionDown : AnimDirectionUp; else if (fabs (relDiffY) > fabs (relDiffX)) dir = relDiffY > 0 ? AnimDirectionDown : AnimDirectionUp; else dir = relDiffX > 0 ? AnimDirectionRight : AnimDirectionLeft; } else { if (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) // min/unmin. should always result in +/- y direction dir = (mIcon.y () < (int)::screen->height () - mIcon.y ()) ? AnimDirectionUp : AnimDirectionDown; else if (fabs (relDiffY) > fabs (relDiffX)) dir = relDiffY > 0 ? AnimDirectionUp : AnimDirectionDown; else dir = relDiffX > 0 ? AnimDirectionLeft : AnimDirectionRight; } } return dir; } float Animation::progressLinear () { float forwardProgress = 1 - mRemainingTime / (mTotalTime - mTimestep); forwardProgress = MIN (forwardProgress, 1); forwardProgress = MAX (forwardProgress, 0); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade || mCurWindowEvent == WindowEventFocus) forwardProgress = 1 - forwardProgress; return forwardProgress; } float Animation::progressEaseInEaseOut () { float forwardProgress = 1 - mRemainingTime / (mTotalTime - mTimestep); forwardProgress = MIN (forwardProgress, 1); forwardProgress = MAX (forwardProgress, 0); // Apply sigmoid and normalize forwardProgress = (sigmoid (forwardProgress) - sigmoid (0)) / (sigmoid (1) - sigmoid (0)); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade || mCurWindowEvent == WindowEventFocus) forwardProgress = 1 - forwardProgress; return forwardProgress; } /// Gives some acceleration (when closing a window) /// or deceleration (when opening a window). /// Applies a sigmoid with slope s, /// where minx and maxx are the /// starting and ending points on the sigmoid. float Animation::progressDecelerateCustom (float progress, float minx, float maxx) { float x = 1 - progress; float s = 8; return 1 - ((sigmoid2 (minx + (x * (maxx - minx)), s) - sigmoid2 (minx, s)) / (sigmoid2 (maxx, s) - sigmoid2 (minx, s))); } float Animation::progressDecelerate (float progress) { return progressDecelerateCustom (progress, 0.5, 0.75); } BoxPtr AnimWindow::BB () { return &priv->mBB; } CompRegion & AnimWindow::stepRegion () { return priv->mStepRegion; } void PrivateAnimWindow::copyResetStepRegion () { mLastStepRegion = mStepRegion; // Reset bounding box for current step mBB.x1 = mBB.y1 = MAXSHORT; mBB.x2 = mBB.y2 = MINSHORT; } void AnimWindow::expandBBWithBox (Box &source) { Box &target = priv->BB (); if (source.x1 < target.x1) target.x1 = source.x1; if (source.x2 > target.x2) target.x2 = source.x2; if (source.y1 < target.y1) target.y1 = source.y1; if (source.y2 > target.y2) target.y2 = source.y2; } void AnimWindow::expandBBWithPoint (float fx, float fy) { Box &target = priv->BB (); short x = MAX (MIN (fx, MAXSHORT - 1), MINSHORT); short y = MAX (MIN (fy, MAXSHORT - 1), MINSHORT); if (target.x1 == MAXSHORT) { target.x1 = x; target.y1 = y; target.x2 = x + 1; target.y2 = y + 1; return; } if (x < target.x1) target.x1 = x; else if (x > target.x2) target.x2 = x; if (y < target.y1) target.y1 = y; else if (y > target.y2) target.y2 = y; } /// This will work for zoom-like 2D transforms, /// but not for glide-like 3D transforms. void AnimWindow::expandBBWithPoint2DTransform (GLVector &coords, GLMatrix &transformMat) { GLVector coordsTransformed = transformMat * coords; expandBBWithPoint (coordsTransformed[GLVector::x], coordsTransformed[GLVector::y]); } static bool project (float objx, float objy, float objz, const float modelview[16], const float projection[16], const GLint viewport[4], float *winx, float *winy, float *winz) { unsigned int i; float in[4]; float out[4]; in[0] = objx; in[1] = objy; in[2] = objz; in[3] = 1.0; for (i = 0; i < 4; ++i) { out[i] = in[0] * modelview[i] + in[1] * modelview[4 + i] + in[2] * modelview[8 + i] + in[3] * modelview[12 + i]; } for (i = 0; i < 4; ++i) { in[i] = out[0] * projection[i] + out[1] * projection[4 + i] + out[2] * projection[8 + i] + out[3] * projection[12 + i]; } if (in[3] == 0.0) return false; in[0] /= in[3]; in[1] /= in[3]; in[2] /= in[3]; /* Map x, y and z to range 0-1 */ in[0] = in[0] * 0.5 + 0.5; in[1] = in[1] * 0.5 + 0.5; in[2] = in[2] * 0.5 + 0.5; /* Map x,y to viewport */ in[0] = in[0] * viewport[2] + viewport[0]; in[1] = in[1] * viewport[3] + viewport[1]; *winx = in[0]; *winy = in[1]; *winz = in[2]; return true; } /// Either points or objects should be non-0. bool AnimWindow::expandBBWithPoints3DTransform (CompOutput &output, GLMatrix &transform, const float *points, GridAnim::GridModel::GridObject *objects, unsigned int nPoints) { GLfloat x, y, z; GLint viewport[4] = {output.region ()->extents.x1, output.region ()->extents.y1, output.width (), output.height ()}; const float *projection = GLScreen::get (::screen)->projectionMatrix ()->getMatrix (); if (points) // use points { for (; nPoints; --nPoints, points += 3) { if (!project (points[0], points[1], points[2], transform.getMatrix (), projection, viewport, &x, &y, &z)) return false; expandBBWithPoint (x + 0.5, (::screen->height () - y) + 0.5); } } else // use grid model objects { GridAnim::GridModel::GridObject *object = objects; for (; nPoints; --nPoints, ++object) { if (!project (object->position ().x (), object->position ().y (), object->position ().z (), transform.getMatrix (), projection, viewport, &x, &y, &z)) return false; expandBBWithPoint (x + 0.5, (::screen->height () - y) + 0.5); } } return true; } void AnimWindow::expandBBWithWindow () { CompRect outRect (savedRectsValid () ? savedOutRect () : mWindow->outputRect ()); Box windowBox = { static_cast (outRect.x ()), static_cast (outRect.x () + outRect.width ()), static_cast (outRect.y ()), static_cast (outRect.y () + outRect.height ()) }; expandBBWithBox (windowBox); } void AnimWindow::expandBBWithScreen () { Box screenBox = {0, static_cast (::screen->width ()), 0, static_cast (::screen->height ())}; expandBBWithBox (screenBox); } void Animation::prepareTransform (CompOutput &output, GLMatrix &resultTransform, GLMatrix &transform) { GLMatrix sTransform; sTransform.toScreenSpace (&output, -DEFAULT_Z_CAMERA); resultTransform = sTransform * transform; } void AnimWindow::resetStepRegionWithBB () { // Have a 1 pixel margin to prevent occasional 1 pixel line artifact CompRegion region (priv->mBB.x1 - 1, priv->mBB.y1 - 1, priv->mBB.x2 - priv->mBB.x1 + 2, priv->mBB.y2 - priv->mBB.y1 + 2); priv->mStepRegion = region; } /// Damage the union of window's bounding box /// before and after animStepFunc does its job. void PrivateAnimWindow::damageThisAndLastStepRegion () { // Find union of the regions for this step and last step CompRegion totalRegionToDamage (mStepRegion + mLastStepRegion); mPAScreen->cScreen->damageRegion (totalRegionToDamage); } CompOutput & AnimScreen::output () { return priv->output (); } bool AnimScreen::getMousePointerXY (short *x, short *y) { Window w1, w2; int xp, yp, xj, yj; unsigned int m; if (XQueryPointer (::screen->dpy (), ::screen->root (), &w1, &w2, &xj, &yj, &xp, &yp, &m)) { *x = xp; *y = yp; return true; } return false; } unsigned int PrivateAnimWindow::getState () { Atom actual; int format; unsigned long n, left; unsigned char *data; unsigned int retval = WithdrawnState; int result = XGetWindowProperty (::screen->dpy (), mWindow->id (), Atoms::wmState, 0L, 1L, false, Atoms::wmState, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&retval, data, sizeof (int)); XFree ((void *)data); } return retval; } CompOption::Vector & AnimScreen::getOptions () { return priv->getOptions (); } bool AnimScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } void PrivateAnimScreen::eventMatchesChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); foreach (CompOption::Value &val, opt->value ().list ()) val.match ().update (); } void PrivateAnimScreen::eventOptionsChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); updateOptionSets (getCorrespondingAnimEvent (num)); } void PrivateAnimScreen::eventEffectsChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); updateEventEffects (getCorrespondingAnimEvent (num), false); } void PrivateAnimScreen::eventRandomEffectsChanged (CompOption *opt, AnimationOptions::Options num) { if (mExtensionPlugins.empty ()) initAnimationList (); updateEventEffects (getCorrespondingAnimEvent (num), true); } void PrivateAnimWindow::postAnimationCleanUpCustom (bool closing, bool destructing, bool clearMatchingRow) { bool shouldDamageWindow = false; notifyAnimation (false); if (mCurAnimation && mCurAnimation->shouldDamageWindowOnEnd ()) shouldDamageWindow = true; enablePainting (false); if (shouldDamageWindow) mAWindow->expandBBWithWindow (); if (shouldDamageWindow || (mCurAnimation && !mCurAnimation->stepRegionUsed () && mAWindow->BB ()->x1 != MAXSHORT)) // BB intialized mAWindow->resetStepRegionWithBB (); damageThisAndLastStepRegion (); if (mCurAnimation) { mCurAnimation->cleanUp (closing, destructing); delete mCurAnimation; mCurAnimation = 0; } mBB.x1 = mBB.y1 = MAXSHORT; mBB.x2 = mBB.y2 = MINSHORT; mState = mNewState; if (clearMatchingRow) mCurAnimSelectionRow = -1; mFinishingAnim = true; if (!destructing) { mIgnoreDamage = true; while (mUnmapCnt > 0) { mWindow->unmap (); --mUnmapCnt; } if (mUnmapCnt < 0) mUnmapCnt = 0; mIgnoreDamage = false; } while (mDestroyCnt) { mWindow->destroy (); --mDestroyCnt; } mFinishingAnim = false; foreach (ExtensionPluginInfo *extPlugin, mPAScreen->mExtensionPlugins) extPlugin->cleanUpAnimation (closing, destructing); } void AnimWindow::postAnimationCleanUp () { priv->postAnimationCleanUp (); } void PrivateAnimWindow::postAnimationCleanUp () { if (mCurAnimation->curWindowEvent () == WindowEventClose) postAnimationCleanUpCustom (true, false, true); else postAnimationCleanUpCustom (false, false, true); } void PrivateAnimWindow::postAnimationCleanUpPrev (bool closing, bool clearMatchingRow) { int curAnimSelectionRow = mCurAnimSelectionRow; // Use previous event's anim selection row mCurAnimSelectionRow = mPrevAnimSelectionRow; postAnimationCleanUpCustom (closing, false, clearMatchingRow); // Restore current event's anim selection row mCurAnimSelectionRow = curAnimSelectionRow; } void PrivateAnimScreen::activateEvent (bool activating) { if (activating) { if (mAnimInProgress) return; } else // Animations have finished for all windows // (Keep preparePaint enabled) aScreen->enableCustomPaintList (false); cScreen->donePaintSetEnabled (this, activating); gScreen->glPaintOutputSetEnabled (this, activating); mAnimInProgress = activating; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) ::screen->root ()); o[1].value ().set (activating); ::screen->handleCompizEvent ("animation", "activate", o); } void PrivateAnimWindow::notifyAnimation (bool activation) { if (!mCurAnimation) return; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("window", CompOption::TypeInt)); o.push_back (CompOption ("type", CompOption::TypeString)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) ::screen->root ()); o[1].value ().set ((int) mWindow->id ()); switch (mCurAnimation->curWindowEvent ()) { case WindowEventOpen: o[2].value ().set ("open"); break; case WindowEventClose: o[2].value ().set ("close"); break; case WindowEventMinimize: o[2].value ().set ("minimize"); break; case WindowEventUnminimize: o[2].value ().set ("unminimize"); break; case WindowEventShade: o[2].value ().set ("shade"); break; case WindowEventUnshade: o[2].value ().set ("unshade"); break; case WindowEventFocus: o[2].value ().set ("focus"); break; case WindowEventNum: case WindowEventNone: default: o[2].value ().set ("none"); break; } o[3].value ().set (activation); screen->handleCompizEvent ("animation", "window_animation", o); } bool PrivateAnimScreen::otherPluginsActive () { for (int i = 0; i < WatchedScreenPluginNum; ++i) if (mPluginActive[i]) return true; return false; } bool Animation::shouldSkipFrame (int msSinceLastPaintActual) { mTimeElapsedWithinTimeStep += msSinceLastPaintActual; if (mTimeElapsedWithinTimeStep < mTimestep) // if timestep not yet completed return true; mTimeElapsedWithinTimeStep = fmod (mTimeElapsedWithinTimeStep, mTimestep); return false; } bool Animation::advanceTime (int msSinceLastPaint) { mRemainingTime -= msSinceLastPaint; mRemainingTime = MAX (mRemainingTime, 0); // avoid sub-zero values mTimeSinceLastPaint = msSinceLastPaint; return (mRemainingTime > 0); } void PrivateAnimScreen::preparePaint (int msSinceLastPaint) { // Check and update "switcher post wait" counter if (mSwitcherPostWait > 0) { ++mSwitcherPostWait; if (mSwitcherPostWait > 5) // wait over { mSwitcherPostWait = 0; // Reset stacking related info since it will // cause problems because of the restacking // just done by Switcher. ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); extPlugin->resetStackingInfo (); } } foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->prePreparePaintGeneral (); if (mAnimInProgress) { int msSinceLastPaintActual; const CompWindowList &pl = pushLockedPaintList (); CompWindowList windowsFinishedAnimations; struct timeval curTime; gettimeofday (&curTime, 0); if (mLastRedrawTimeFresh) { msSinceLastPaintActual = timer::timeval_diff (&curTime, &mLastRedrawTime); // handle clock rollback if (msSinceLastPaintActual < 0) msSinceLastPaintActual = 0; } else msSinceLastPaintActual = 20; // assume 20 ms passed mLastRedrawTime = curTime; // Store current time for next time mLastRedrawTimeFresh = true; CompWindow *w; AnimWindow *animWin; PrivateAnimWindow *aw; Animation *curAnim; /* Paint list includes destroyed windows */ for (CompWindowList::const_reverse_iterator rit = pl.rbegin (); rit != pl.rend (); ++rit) { w = (*rit); animWin = AnimWindow::get (w); aw = animWin->priv; curAnim = aw->curAnimation (); if (curAnim) { if (!curAnim->initialized ()) curAnim->init (); curAnim->prePreparePaint (msSinceLastPaint); /* TODO optimize grid model by reusing one GridModel if (aw->com.mModel && (aw->com.mModel->winWidth != outRect.width () || aw->com.mModel->winHeight != outRect.height ())) { // mModel needs update // re-create mModel if (!animEnsureModel (w)) { // Abort this window's animation postAnimationCleanUp (w); continue; } }*/ bool animShouldSkipFrame = (curAnim->shouldSkipFrame (msSinceLastPaintActual) && // Skip only if we're not on the first animation frame curAnim->initialized ()); // Skip only if we're not on the last animation frame animShouldSkipFrame &= curAnim->advanceTime (msSinceLastPaint); if (!animShouldSkipFrame) { if (curAnim->updateBBUsed ()) { aw->copyResetStepRegion (); if (!curAnim->initialized () && curAnim->shouldDamageWindowOnStart ()) aw->aWindow ()->expandBBWithWindow (); } if (!curAnim->initialized ()) curAnim->setInitialized (); curAnim->step (); if (curAnim->updateBBUsed ()) { foreach (CompOutput &output, ::screen->outputDevs ()) curAnim->updateBB (output); if (!curAnim->stepRegionUsed () && aw->BB ().x1 != MAXSHORT) // BB initialized { // BB is used instead of step region, // so reset step region here with BB. animWin->resetStepRegionWithBB (); } if (!(cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK)) aw->damageThisAndLastStepRegion (); } } bool finished = (curAnim->remainingTime () <= 0); if (finished) // Animation is done windowsFinishedAnimations.push_back (w); } } foreach (CompWindow *w, pl) { PrivateAnimWindow *aw = AnimWindow::get (w)->priv; if (aw->curAnimation ()) aw->curAnimation ()->postPreparePaint (); } popLockedPaintList (); } foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->postPreparePaintGeneral (); cScreen->preparePaint (msSinceLastPaint); if (mStartCountdown) { --mStartCountdown; if (!mStartCountdown) { foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->postStartupCountdown (); } } } void PrivateAnimScreen::donePaint () { assert (mAnimInProgress); const CompWindowList &pl = pushLockedPaintList (); CompWindowList windowsFinishedAnimations; bool animStillInProgress = false; CompWindow *w; AnimWindow *animWin; PrivateAnimWindow *aw; Animation *curAnim; /* Paint list includes destroyed windows */ for (CompWindowList::const_reverse_iterator rit = pl.rbegin (); rit != pl.rend (); ++rit) { w = (*rit); animWin = AnimWindow::get (w); aw = animWin->priv; curAnim = aw->curAnimation (); if (curAnim) { bool finished = (curAnim->remainingTime () <= 0); if (finished) // Animation is done windowsFinishedAnimations.push_back (w); else animStillInProgress = true; } } popLockedPaintList (); foreach (CompWindow *w, windowsFinishedAnimations) { AnimWindow *aw = AnimWindow::get (w); aw->priv->notifyAnimation (false); aw->priv->postAnimationCleanUp (); } if (!animStillInProgress) { activateEvent (false); mLastRedrawTimeFresh = false; // Reset stacking related info after all animations are done. ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); extPlugin->resetStackingInfo (); } cScreen->damagePending (); cScreen->donePaint (); } void PrivateAnimWindow::enablePainting (bool enabling) { gWindow->glPaintSetEnabled (this, enabling); gWindow->glAddGeometrySetEnabled (this, enabling); //gWindow->glDrawGeometrySetEnabled (this, enabling); gWindow->glDrawTextureSetEnabled (this, enabling); } void PrivateAnimWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { // if window is being animated if (mCurAnimation) { if (mCurAnimation->initialized ()) mCurAnimation->addGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } else { gWindow->glAddGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } } bool Animation::shouldDamageWindowOnStart () { return (mCurWindowEvent == WindowEventClose || mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventShade); } bool Animation::shouldDamageWindowOnEnd () { return (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade); } void Animation::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { mAWindow->priv->gWindow->glAddGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } void PartialWindowAnim::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (mUseDrawRegion) { CompRegion awRegion (region.intersected (mDrawRegion)); Animation::addGeometry (matrix, awRegion, clip, maxGridWidth, maxGridHeight); } else { Animation::addGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } } void PrivateAnimWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { if (mCurAnimation) mCurAnimation->setCurPaintAttrib (attrib); if (mCurAnimation) { if (mCurAnimation->initialized ()) mCurAnimation->drawGeometry (texture, transform, attrib, mask); } else gWindow->glDrawTexture (texture, transform, attrib, mask); } #if 0 // Not ported yet void PrivateAnimWindow::glDrawGeometry () { } #endif void Animation::drawTexture (GLTexture *texture, const GLWindowPaintAttrib &attrib, unsigned int mask) { mCurPaintAttrib = attrib; } void Animation::drawGeometry (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { GLWindow::get (mAWindow->mWindow)->glDrawTexture (texture, transform, attrib, mask); } bool PrivateAnimWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; // Is this the first glPaint call this round // without the mask PAINT_WINDOW_OCCLUSION_DETECTION_MASK? if (mPAScreen->mStartingNewPaintRound && !(mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) { mPAScreen->mStartingNewPaintRound = false; // Back-to-front painting of windows is starting now. if (mPAScreen->mPrePaintWindowsBackToFrontEnabled) mPAScreen->prePaintWindowsBackToFront (); } assert (mCurAnimation); foreach (ExtensionPluginInfo *extPlugin, mPAScreen->mExtensionPlugins) { if (extPlugin->paintShouldSkipWindow (mWindow)) return false; } if (mCurAnimation->curWindowEvent () == WindowEventFocus && mPAScreen->otherPluginsActive ()) { postAnimationCleanUp (); return gWindow->glPaint (attrib, transform, region, mask); } GLWindowPaintAttrib wAttrib = attrib; GLMatrix wTransform (transform.getMatrix ()); /* TODO check if this is still necessary if (mCurAnimation->addCustomGeometryFunc) { // Use slightly smaller brightness to force core // to handle indexCount = 0; // TODO check if this is still necessary if (mCurAnimation->requiresTransformedWindow ()) mask |= PAINT_WINDOW_TRANSFORMED_MASK; wAttrib.xScale = 1.0f; wAttrib.yScale = 1.0f; mCurAnimation->updateAttrib (wAttrib); mCurAnimation->updateTransform (wTransform); mCurAnimation->prePaintWindow (); if (mCurAnimation->paintWindowUsed ()) status = mCurAnimation->paintWindow (gWindow, wAttrib, wTransform, region, mask); else status = gWindow->glPaint (wAttrib, wTransform, region, mask); if (mCurAnimation->postPaintWindowUsed ()) mCurAnimation->postPaintWindow (wTransform); return status; } const CompWindowList & PrivateAnimScreen::pushLockedPaintList () { if (!mLockedPaintListCnt) { const CompWindowList &pl = cScreen->getWindowPaintList (); mLockedPaintList = &pl; if (!mGetWindowPaintListEnableCnt) { ++mGetWindowPaintListEnableCnt; cScreen->getWindowPaintListSetEnabled (this, true); } } ++mLockedPaintListCnt; return *mLockedPaintList; } void PrivateAnimScreen::popLockedPaintList () { --mLockedPaintListCnt; if (!mLockedPaintListCnt) { mLockedPaintList = NULL; --mGetWindowPaintListEnableCnt; if (!mGetWindowPaintListEnableCnt) cScreen->getWindowPaintListSetEnabled (this, false); } } /// This is enabled only during restack animations. /// or when we need to lock it const CompWindowList & PrivateAnimScreen::getWindowPaintList () { if (mLockedPaintList) return *mLockedPaintList; ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); return extPlugin->getWindowPaintList (); } /// This is enabled only during restack animations. void PrivateAnimScreen::prePaintWindowsBackToFront () { assert (mAnimInProgress); ExtensionPluginAnimation *extPlugin = static_cast (mExtensionPlugins[0]); extPlugin->prePaintWindowsBackToFront (); } void PrivateAnimScreen::enablePrePaintWindowsBackToFront (bool enabled) { mPrePaintWindowsBackToFrontEnabled = enabled; } void PrivateAnimScreen::pushPaintList () { if (!mGetWindowPaintListEnableCnt) cScreen->getWindowPaintListSetEnabled (this, true); ++mGetWindowPaintListEnableCnt; } void PrivateAnimScreen::popPaintList () { --mGetWindowPaintListEnableCnt; if (!mGetWindowPaintListEnableCnt) cScreen->getWindowPaintListSetEnabled (this, false); } void AnimScreen::enableCustomPaintList (bool enabled) { enabled ? priv->pushPaintList () : priv->popPaintList (); priv->enablePrePaintWindowsBackToFront (enabled); } static const PluginEventInfo watchedScreenPlugins[] = { {"switcher", "activate"}, {"ring", "activate"}, {"shift", "activate"}, {"scale", "activate"}, {"group", "tabChangeActivate"}, {"fadedesktop", "activate"} }; static const PluginEventInfo watchedWindowPlugins[] = { {"kdecompat", "slide"}, }; void PrivateAnimScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options) { ::screen->handleCompizEvent (pluginName, eventName, options); for (int i = 0; i < WatchedScreenPluginNum; ++i) { if (strcmp (pluginName, watchedScreenPlugins[i].pluginName) == 0) { if (strcmp (eventName, watchedScreenPlugins[i].activateEventName) == 0) { mPluginActive[i] = CompOption::getBoolOptionNamed (options, "active", false); if (!mPluginActive[i] && (i == WatchedPluginSwitcher || i == WatchedPluginRing || i == WatchedPluginShift || i == WatchedPluginScale)) mSwitcherPostWait = 1; } break; } } for (int i = 0; i < WatchedWindowPluginNum; ++i) { if (strcmp (pluginName, watchedWindowPlugins[i].pluginName) == 0) { if (strcmp (eventName, watchedWindowPlugins[i].activateEventName) == 0) { Window xid = CompOption::getIntOptionNamed (options, "window", 0); CompWindow *w = screen->findWindow (xid); if (w) { AnimWindow *aw = AnimWindow::get (w); PrivateAnimWindow *pw = aw->priv; pw->mPluginActive[i] = CompOption::getBoolOptionNamed ( options, "active", false); } } break; } } } /// Returns true for windows that don't have a pixmap or certain properties, /// like the dimming layer of gksudo and x-session-manager. inline bool PrivateAnimScreen::shouldIgnoreWindowForAnim (CompWindow *w, bool checkPixmap) { AnimWindow *aw = AnimWindow::get (w); for (int i = 0; i < WatchedWindowPluginNum; ++i) if (aw->priv->mPluginActive[i]) return true; return ((checkPixmap && !CompositeWindow::get (w)->pixmap ()) || mNeverAnimateMatch.evaluate (w)); } void PrivateAnimWindow::reverseAnimation () { mCurAnimation->reverse (); // Inflict the pending unmaps while (mUnmapCnt > 0) { mWindow->unmap (); --mUnmapCnt; } if (mUnmapCnt < 0) mUnmapCnt = 0; } void PrivateAnimScreen::initiateCloseAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateCloseAnim (aw->mAWindow); if (shouldIgnoreWindowForAnim (w, true)) return; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventClose, &duration); aw->mState = NormalState; aw->mNewState = WithdrawnState; if (chosenEffect != AnimEffectNone) { bool startingNew = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent == WindowEventOpen) { startingNew = false; aw->reverseAnimation (); } /* TODO check if necessary else if (aw->com.curWindowEvent == WindowEventClose) { if (aw->com.animOverrideProgressDir == 2) { aw->com.animRemainingTime = tmpSteps; startingNew = false; } }*/ else aw->postAnimationCleanUpPrev (true, false); } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventClose); // handle empty random effect list if (effectToBePlayed) { if (effectToBePlayed == AnimEffectNone) { aw->mState = aw->mNewState; return; } aw->mCurAnimation = effectToBePlayed->create (w, WindowEventClose, duration, effectToBePlayed, getIcon (w, true)); aw->mCurAnimation->adjustPointerIconSize (); aw->enablePainting (true); } } activateEvent (true); aw->notifyAnimation (true); // Increment 3 times to make sure close animation works // (e.g. for popup menus). for (int i = 0; i < 3; ++i) { ++aw->mUnmapCnt; w->incrementUnmapReference (); } cScreen->damagePending (); } /* TODO check if necessary else if (AnimEffectNone != getMatchingAnimSelection (w, AnimEventOpen, &duration)) { // stop the current animation and prevent it from rewinding if (aw->com.animRemainingTime > 0 && aw->com.curWindowEvent != WindowEventOpen) { aw->com.animRemainingTime = 0; } if ((aw->com.curWindowEvent != WindowEventNone) && (aw->com.curWindowEvent != WindowEventClose)) { postAnimationCleanUp (w); } // set some properties to make sure this window will use the // correct open effect the next time it's "opened" activateEvent (w->screen, true); aw->com.curWindowEvent = WindowEventClose; ++aw->mUnmapCnt; w->incrementUnmapRefCnt (); damagePendingOnScreen (w->screen); }*/ else aw->mState = aw->mNewState; // Make sure non-animated closing windows get a damage. if (!aw->curAnimation ()) aw->mAWindow->expandBBWithWindow (); } CompRect PrivateAnimScreen::getIcon (CompWindow *w, bool alwaysUseMouse) { CompRect icon; if (!alwaysUseMouse) icon = w->iconGeometry (); if (alwaysUseMouse || (icon.x () == 0 && icon.y () == 0 && icon.width () == 0 && icon.height () == 0)) // that is, couldn't get icon from window { // Minimize to mouse pointer if there is no // window list or if the window skips taskbar short x, y; if (!aScreen->getMousePointerXY (&x, &y)) { // Use screen center if can't get mouse coords x = ::screen->width () / 2; y = ::screen->height () / 2; } icon.setX (x); icon.setY (y); icon.setWidth (FAKE_ICON_SIZE); icon.setHeight (FAKE_ICON_SIZE); } return icon; } void PrivateAnimScreen::initiateMinimizeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; if (aw->mWindow->destroyed ()) return; // Store window geometry for use during animation. aw->mAWindow->mSavedInRect = w->inputRect (); aw->mAWindow->mSavedOutRect = w->outputRect (); aw->mAWindow->mSavedOutExtents = w->output (); aw->mAWindow->mSavedWinRect = w->geometry (); aw->mAWindow->mSavedRectsValid = true; aw->mNewState = IconicState; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateMinimizeAnim (aw->mAWindow); int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventMinimize, &duration); if (chosenEffect != AnimEffectNone) { bool startingNew = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventUnminimize) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventMinimize); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) { aw->mState = aw->mNewState; return; } aw->mCurAnimation = effectToBePlayed->create (w, WindowEventMinimize, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } else aw->mState = aw->mNewState; } void PrivateAnimScreen::initiateShadeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventShade, &duration); aw->setShaded (true); if (chosenEffect != AnimEffectNone) { bool startingNew = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventUnshade) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventShade); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) return; aw->mCurAnimation = effectToBePlayed->create (w, WindowEventShade, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } activateEvent (true); aw->notifyAnimation (true); ++aw->mUnmapCnt; w->incrementUnmapReference (); cScreen->damagePending (); } } void PrivateAnimScreen::initiateOpenAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; int duration = 200; AnimEffect chosenEffect; aw->mNewState = NormalState; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateOpenAnim (aw->mAWindow); WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (!shouldIgnoreWindowForAnim (w, false) && (AnimEffectNone != (chosenEffect = getMatchingAnimSelection (w, AnimEventOpen, &duration)) || // reversing case curWindowEvent == WindowEventClose)) { bool startingNew = true; bool playEffect = true; if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventClose) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventOpen); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) playEffect = false; if (playEffect) { aw->mCurAnimation = effectToBePlayed->create (w, WindowEventOpen, duration, effectToBePlayed, getIcon (w, true)); aw->mCurAnimation->adjustPointerIconSize (); aw->enablePainting (true); } } if (playEffect) { activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } } } void PrivateAnimScreen::initiateUnminimizeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; if (aw->mWindow->destroyed ()) return; aw->mAWindow->mSavedRectsValid = false; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventUnminimize, &duration); aw->mNewState = NormalState; if (chosenEffect != AnimEffectNone && !mPluginActive[3]) // fadedesktop { bool startingNew = true; bool playEffect = true; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->preInitiateUnminimizeAnim (aw->mAWindow); // TODO Refactor the rest? (almost the same in other initiateX methods) WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventMinimize) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventUnminimize); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) playEffect = false; if (playEffect) { aw->mCurAnimation = effectToBePlayed->create (w, WindowEventUnminimize, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } } if (playEffect) { activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } } } void PrivateAnimScreen::initiateUnshadeAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; aw->mAWindow->mSavedRectsValid = false; aw->setShaded (false); aw->mNewState = NormalState; int duration = 200; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventShade, &duration); if (chosenEffect != AnimEffectNone) { bool startingNew = true; bool playEffect = true; WindowEvent curWindowEvent = WindowEventNone; if (aw->curAnimation ()) curWindowEvent = aw->curAnimation ()->curWindowEvent (); if (curWindowEvent != WindowEventNone) { if (curWindowEvent != WindowEventShade) aw->postAnimationCleanUpPrev (false, false); else { startingNew = false; aw->reverseAnimation (); } } if (startingNew) { AnimEffect effectToBePlayed = getActualEffect (chosenEffect, AnimEventShade); // handle empty random effect list if (effectToBePlayed == AnimEffectNone) playEffect = false; if (playEffect) { aw->mCurAnimation = effectToBePlayed->create (w, WindowEventUnshade, duration, effectToBePlayed, getIcon (w, false)); aw->enablePainting (true); } } if (playEffect) { activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); } } } bool PrivateAnimScreen::initiateFocusAnim (PrivateAnimWindow *aw) { CompWindow *w = aw->mWindow; int duration = 200; if (aw->curAnimation () || otherPluginsActive () || // Check the "switcher post-wait" counter that effectively prevents // focus animation to be initiated when the zoom option value is low // in Switcher. mSwitcherPostWait) return false; AnimEffect chosenEffect = getMatchingAnimSelection (w, AnimEventFocus, &duration); if (chosenEffect != AnimEffectNone) { aw->createFocusAnimation (chosenEffect, duration); if (chosenEffect->isRestackAnim && !(dynamic_cast (aw->mCurAnimation)-> initiateRestackAnim (duration))) { aw->postAnimationCleanUp (); return false; } activateEvent (true); aw->notifyAnimation (true); cScreen->damagePending (); return true; } return false; } void PrivateAnimWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (mUnshadePending) { mUnshadePending = false; mPAScreen->initiateUnshadeAnim (this); } else if (mCurAnimation && mCurAnimation->inProgress () && // Don't let transient window open anim be interrupted with a resize notify !(mCurAnimation->curWindowEvent () == WindowEventOpen && (mWindow->wmType () & (CompWindowTypeDropdownMenuMask | CompWindowTypePopupMenuMask | CompWindowTypeMenuMask | CompWindowTypeTooltipMask | CompWindowTypeNotificationMask | CompWindowTypeComboMask | CompWindowTypeDndMask))) && // Ignore resize with dx=0, dy=0, dwidth=0, dheight=0 !(dx == 0 && dy == 0 && dwidth == 0 && dheight == 0) && !mCurAnimation->resizeUpdate (dx, dy, dwidth, dheight)) { postAnimationCleanUp (); mPAScreen->updateAnimStillInProgress (); } mWindow->resizeNotify (dx, dy, dwidth, dheight); } void PrivateAnimScreen::updateAnimStillInProgress () { bool animStillInProgress = false; const CompWindowList &pl = pushLockedPaintList (); foreach (CompWindow *w, pl) { PrivateAnimWindow *aw = AnimWindow::get (w)->priv; if (aw->curAnimation () && aw->curAnimation ()->inProgress ()) { animStillInProgress = true; break; } else aw->notifyAnimation (false); } popLockedPaintList (); if (!animStillInProgress) activateEvent (false); } void PrivateAnimWindow::moveNotify (int dx, int dy, bool immediate) { if (mCurAnimation && mCurAnimation->inProgress () && (mGrabbed || !mCurAnimation->moveUpdate (dx, dy))) { // Stop the animation postAnimationCleanUp (); mPAScreen->updateAnimStillInProgress (); } mWindow->moveNotify (dx, dy, immediate); } void PrivateAnimWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { mGrabbed = true; mWindow->grabNotify (x, y, state, mask); } void PrivateAnimWindow::ungrabNotify () { mGrabbed = false; mWindow->ungrabNotify (); } bool PrivateAnimScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { assert (mAnimInProgress); mStartingNewPaintRound = true; foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins) extPlugin->prePaintOutput (output); mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; mOutput = output; return gScreen->glPaintOutput (attrib, matrix, region, output, mask); } AnimEffectUsedFor AnimEffectUsedFor::all () { AnimEffectUsedFor usedFor; usedFor.open = usedFor.close = usedFor.minimize = usedFor.shade = usedFor.unminimize = usedFor.focus = true; return usedFor; } AnimEffectUsedFor AnimEffectUsedFor::none () { AnimEffectUsedFor usedFor; usedFor.open = usedFor.close = usedFor.minimize = usedFor.shade = usedFor.unminimize = usedFor.focus = false; return usedFor; } AnimEffectUsedFor& AnimEffectUsedFor::exclude (AnimEvent event) { switch (event) { case AnimEventOpen: open = false; break; case AnimEventClose: close = false; break; case AnimEventMinimize: minimize = false; break; case AnimEventUnminimize: unminimize = false; break; case AnimEventShade: shade = false; break; case AnimEventFocus: focus = false; break; default: break; } return *this; } AnimEffectUsedFor& AnimEffectUsedFor::include (AnimEvent event) { switch (event) { case AnimEventOpen: open = true; break; case AnimEventClose: close = true; break; case AnimEventMinimize: minimize = true; break; case AnimEventUnminimize: unminimize = true; break; case AnimEventShade: shade = true; break; case AnimEventFocus: focus = true; break; default: break; } return *this; } AnimEffectInfo::AnimEffectInfo (const char *name, AnimEffectUsedFor usedFor, CreateAnimFunc create, bool isRestackAnim) : name (name), create (create), isRestackAnim (isRestackAnim) { usedForEvents[AnimEventOpen] = usedFor.open; usedForEvents[AnimEventClose] = usedFor.close; usedForEvents[AnimEventMinimize] = usedFor.minimize; usedForEvents[AnimEventUnminimize] = usedFor.unminimize; usedForEvents[AnimEventShade] = usedFor.shade; usedForEvents[AnimEventFocus] = usedFor.focus; } bool AnimEffectInfo::matchesEffectName (const CompString &animName) { return (0 == strcasecmp (animName.c_str (), name)); } bool AnimEffectInfo::matchesPluginName (const CompString &pluginName) { return (0 == strncmp (pluginName.c_str (), name, pluginName.length ())); } AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimation animExtensionPluginInfo (CompString ("animation"), NUM_EFFECTS, animEffects, 0, NUM_NONEFFECT_OPTIONS); ExtensionPluginInfo * Animation::getExtensionPluginInfo () { return &animExtensionPluginInfo; } AnimEffect AnimEffectNone; AnimEffect AnimEffectRandom; AnimEffect AnimEffectCurvedFold; AnimEffect AnimEffectDodge; AnimEffect AnimEffectDream; AnimEffect AnimEffectFade; AnimEffect AnimEffectFocusFade; AnimEffect AnimEffectGlide1; AnimEffect AnimEffectGlide2; AnimEffect AnimEffectHorizontalFolds; AnimEffect AnimEffectMagicLamp; AnimEffect AnimEffectMagicLampWavy; AnimEffect AnimEffectRollUp; AnimEffect AnimEffectSidekick; AnimEffect AnimEffectWave; AnimEffect AnimEffectZoom; PrivateAnimScreen::PrivateAnimScreen (CompScreen *s, AnimScreen *as) : cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), aScreen (as), mLastRedrawTimeFresh (false), mSwitcherPostWait (0), mStartCountdown (20), // start the countdown mLastActiveWindow (0), mAnimInProgress (false), mStartingNewPaintRound (false), mPrePaintWindowsBackToFrontEnabled (false), mOutput (0), mLockedPaintList (NULL), mLockedPaintListCnt (0), mGetWindowPaintListEnableCnt (0) { for (int i = 0; i < WatchedScreenPluginNum; ++i) mPluginActive[i] = false; // Never animate screen-dimming layer of logout window and gksu. mNeverAnimateMatch |= "title=gksu"; mNeverAnimateMatch |= "title=x-session-manager"; mNeverAnimateMatch |= "title=gnome-session"; mNeverAnimateMatch.update (); // Set-up option notifiers #define MATCHES_BIND \ boost::bind (&PrivateAnimScreen::eventMatchesChanged, this, _1, _2) #define OPTIONS_BIND \ boost::bind (&PrivateAnimScreen::eventOptionsChanged, this, _1, _2) #define EFFECTS_BIND \ boost::bind (&PrivateAnimScreen::eventEffectsChanged, this, _1, _2) #define RANDOM_EFFECTS_BIND \ boost::bind (&PrivateAnimScreen::eventRandomEffectsChanged, this, _1, _2) optionSetOpenMatchesNotify (MATCHES_BIND); optionSetCloseMatchesNotify (MATCHES_BIND); optionSetMinimizeMatchesNotify (MATCHES_BIND); optionSetUnminimizeMatchesNotify (MATCHES_BIND); optionSetFocusMatchesNotify (MATCHES_BIND); optionSetShadeMatchesNotify (MATCHES_BIND); optionSetOpenOptionsNotify (OPTIONS_BIND); optionSetCloseOptionsNotify (OPTIONS_BIND); optionSetMinimizeOptionsNotify (OPTIONS_BIND); optionSetUnminimizeOptionsNotify (OPTIONS_BIND); optionSetFocusOptionsNotify (OPTIONS_BIND); optionSetShadeOptionsNotify (OPTIONS_BIND); optionSetOpenEffectsNotify (EFFECTS_BIND); optionSetCloseEffectsNotify (EFFECTS_BIND); optionSetMinimizeEffectsNotify (EFFECTS_BIND); optionSetUnminimizeEffectsNotify (EFFECTS_BIND); optionSetFocusEffectsNotify (EFFECTS_BIND); optionSetShadeEffectsNotify (EFFECTS_BIND); optionSetOpenRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetCloseRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetMinimizeRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetUnminimizeRandomEffectsNotify (RANDOM_EFFECTS_BIND); optionSetShadeRandomEffectsNotify (RANDOM_EFFECTS_BIND); ScreenInterface::setHandler (::screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } PrivateAnimScreen::~PrivateAnimScreen () { if (mAnimInProgress) activateEvent (false); for (int i = 0; i < NUM_EFFECTS; ++i) delete animEffects[i]; } void PrivateAnimScreen::initAnimationList () { int i = 0; animEffects[i++] = AnimEffectNone = new AnimEffectInfo ("animation:None", AnimEffectUsedFor::all(), 0); animEffects[i++] = AnimEffectRandom = new AnimEffectInfo ("animation:Random", AnimEffectUsedFor::all().exclude(AnimEventFocus), 0); animEffects[i++] = AnimEffectCurvedFold = new AnimEffectInfo ("animation:Curved Fold", AnimEffectUsedFor::all().exclude(AnimEventFocus), &createAnimation); animEffects[i++] = AnimEffectDodge = new AnimEffectInfo ("animation:Dodge", AnimEffectUsedFor::none().include(AnimEventFocus), &createAnimation, true); animEffects[i++] = AnimEffectDream = new AnimEffectInfo ("animation:Dream", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectFade = new AnimEffectInfo ("animation:Fade", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectFocusFade = new AnimEffectInfo ("animation:Focus Fade", AnimEffectUsedFor::none().include(AnimEventFocus), &createAnimation, true); animEffects[i++] = AnimEffectGlide1 = new AnimEffectInfo ("animation:Glide 1", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectGlide2 = new AnimEffectInfo ("animation:Glide 2", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectHorizontalFolds = new AnimEffectInfo ("animation:Horizontal Folds", AnimEffectUsedFor::all().exclude(AnimEventFocus), &createAnimation); animEffects[i++] = AnimEffectMagicLamp = new AnimEffectInfo ("animation:Magic Lamp", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectMagicLampWavy = new AnimEffectInfo ("animation:Magic Lamp Wavy", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectRollUp = new AnimEffectInfo ("animation:Roll Up", AnimEffectUsedFor::none().include(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectSidekick = new AnimEffectInfo ("animation:Sidekick", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectWave = new AnimEffectInfo ("animation:Wave", AnimEffectUsedFor::all().exclude(AnimEventShade), &createAnimation); animEffects[i++] = AnimEffectZoom = new AnimEffectInfo ("animation:Zoom", AnimEffectUsedFor::all().exclude(AnimEventFocus).exclude(AnimEventShade), &createAnimation); animExtensionPluginInfo.effectOptions = &getOptions (); // Extends itself with the basic set of animation effects. addExtension (&animExtensionPluginInfo, false); for (int e = 0; e < AnimEventNum; ++e) // for each anim event updateOptionSets ((AnimEvent)e); updateAllEventEffects (); cScreen->preparePaintSetEnabled (this, true); } PrivateAnimWindow::PrivateAnimWindow (CompWindow *w, AnimWindow *aw) : gWindow (GLWindow::get (w)), mWindow (w), mAWindow (aw), mPAScreen (AnimScreen::get (::screen)->priv), mCurAnimation (0), mUnshadePending (false), mEventNotOpenClose (false), mNowShaded (false), mGrabbed (false), mUnmapCnt (0), mDestroyCnt (0), mIgnoreDamage (false), mFinishingAnim (false), mCurAnimSelectionRow (-1), mPrevAnimSelectionRow (-1) { mBB.x1 = mBB.y1 = MAXSHORT; mBB.x2 = mBB.y2 = MINSHORT; for (int i = 0; i < WatchedWindowPluginNum; ++i) mPluginActive[i] = false; if (w->minimized ()) mState = mNewState = IconicState; else if (w->shaded ()) { mState = mNewState = NormalState; mNowShaded = true; } else mState = mNewState = getState (); WindowInterface::setHandler (mWindow, true); GLWindowInterface::setHandler (gWindow, false); } PrivateAnimWindow::~PrivateAnimWindow () { notifyAnimation (false); postAnimationCleanUpCustom (false, true, true); } void PrivateAnimWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyEnterShowDesktopMode: case CompWindowNotifyMinimize: mPAScreen->initiateMinimizeAnim (this); mEventNotOpenClose = true; break; case CompWindowNotifyLeaveShowDesktopMode: case CompWindowNotifyUnminimize: mPAScreen->initiateUnminimizeAnim (this); mEventNotOpenClose = true; break; case CompWindowNotifyShade: mPAScreen->initiateShadeAnim (this); mEventNotOpenClose = true; break; case CompWindowNotifyUnshade: if (mNowShaded && mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventShade) mPAScreen->initiateUnshadeAnim (this); // reverse the shade anim break; case CompWindowNotifyClose: if (!(mCurAnimation && (mCurAnimation->curWindowEvent () == WindowEventClose || mCurAnimation->curWindowEvent () == WindowEventUnminimize))) mPAScreen->initiateCloseAnim (this); break; case CompWindowNotifyShow: case CompWindowNotifyBeforeMap: // Prevent dialog disappearing when a dialog is reopened during // its close animation. if (mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventClose) { mPAScreen->initiateOpenAnim (this); mEventNotOpenClose = false; } break; case CompWindowNotifyMap: if (mNowShaded) mUnshadePending = true; else if (!mUnshadePending && !mEventNotOpenClose && !mPAScreen->mStartCountdown && !(mCurAnimation && (mCurAnimation->curWindowEvent () == WindowEventUnminimize || mCurAnimation->curWindowEvent () == WindowEventOpen))) mPAScreen->initiateOpenAnim (this); mEventNotOpenClose = false; break; case CompWindowNotifyBeforeUnmap: if (mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventMinimize) { ++mUnmapCnt; mWindow->incrementUnmapReference (); } break; case CompWindowNotifyBeforeDestroy: if (!mFinishingAnim) { if (mPAScreen->shouldIgnoreWindowForAnim (mWindow, true) || /* Don't increment the destroy reference count unless * the window is already animated */ !mCurAnimation) break; ++mDestroyCnt; mWindow->incrementDestroyReference (); } break; case CompWindowNotifyUnreparent: if (!mFinishingAnim && mPAScreen->shouldIgnoreWindowForAnim (mWindow, false)) break; break; case CompWindowNotifyFocusChange: if (!mPAScreen->mLastActiveWindow || mPAScreen->mLastActiveWindow != mWindow->id ()) { mPAScreen->mLastActiveWindow = mWindow->id (); if (mPAScreen->mStartCountdown) // Don't animate at startup break; int duration = 200; AnimEffect chosenEffect = mPAScreen->getMatchingAnimSelection (mWindow, AnimEventFocus, &duration); if (chosenEffect && chosenEffect != AnimEffectNone && !chosenEffect->isRestackAnim) mPAScreen->initiateFocusAnim (this); } break; case CompWindowNotifyRestack: { // Prevent menu disappearing when a menu is reopened during // its close animation. In that case a restack notify is thrown // for menus. if (mCurAnimation && mCurAnimation->curWindowEvent () == WindowEventClose) { mPAScreen->initiateOpenAnim (this); mEventNotOpenClose = false; break; } // Handle CompWindowNotifyRestack only when necessary. if (!mPAScreen->isRestackAnimPossible () || mPAScreen->mStartCountdown) // Don't animate at startup break; foreach (ExtensionPluginInfo *extPlugin, mPAScreen->mExtensionPlugins) extPlugin->handleRestackNotify (mAWindow); break; } default: break; } mWindow->windowNotify (n); } Animation * AnimWindow::curAnimation () { return priv->curAnimation (); } AnimEffect AnimScreen::getMatchingAnimSelection (CompWindow *w, AnimEvent e, int *duration) { return priv->getMatchingAnimSelection (w, e, duration); } bool AnimScreen::otherPluginsActive () { return priv->otherPluginsActive (); } bool AnimScreen::isAnimEffectPossible (AnimEffect theEffect) { return priv->isAnimEffectPossible (theEffect); } bool AnimScreen::initiateFocusAnim (AnimWindow *aw) { return priv->initiateFocusAnim (aw->priv); } /// If duration is 0, it should be set to a positive value later. void AnimWindow::createFocusAnimation (AnimEffect effect, int duration) { priv->createFocusAnimation (effect, duration); } void AnimWindow::deletePersistentData (const char *name) { PersistentDataMap::iterator itData = persistentData.find (name); if (itData != persistentData.end ()) // if found { delete itData->second; persistentData.erase (itData); } } void PrivateAnimWindow::createFocusAnimation (AnimEffect effect, int duration) { mCurAnimation = effect->create (mWindow, WindowEventFocus, duration, effect, CompRect ()); enablePainting (true); } template class PluginClassHandler; AnimScreen::AnimScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateAnimScreen (s, this)) { priv->initAnimationList (); } AnimScreen::~AnimScreen () { delete priv; } template class PluginClassHandler; AnimWindow::AnimWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), priv (new PrivateAnimWindow (w, this)), mSavedRectsValid (false) { foreach (ExtensionPluginInfo *extPlugin, priv->mPAScreen->mExtensionPlugins) extPlugin->initPersistentData (this); } AnimWindow::~AnimWindow () { delete priv; // Destroy each persistent data object PersistentDataMap::iterator itData = persistentData.begin (); for (; itData != persistentData.end (); ++itData) delete itData->second; persistentData.clear (); } bool AnimPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) { CompPrivate p; p.uval = ANIMATION_ABI; ::screen->storeValue ("animation_ABI", p); return true; } return false; } void AnimPluginVTable::fini () { ::screen->eraseValue ("animation_ABI"); } ./plugins/animation/src/curvedfold.cpp0000644000004100000410000001575613246301623020351 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * curvedfold.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Curved Fold ========================= FoldAnim::FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridZoomAnim::GridZoomAnim (w, curWindowEvent, duration, info, icon) { } float FoldAnim::getFadeProgress () { // if shade/unshade, don't do anything if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) return 0; if (zoomToIcon ()) return ZoomAnim::getFadeProgress (); return progressLinear (); } CurvedFoldAnim::CurvedFoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FoldAnim::FoldAnim (w, curWindowEvent, duration, info, icon) { } void CurvedFoldAnim::initGrid () { mGridWidth = 2; mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option } float CurvedFoldAnim::getObjectZ (GridAnim::GridModel *mModel, float forwardProgress, float sinForProg, float relDistToCenter, float curveMaxAmp) { return -(sinForProg * (1 - pow (pow (2 * relDistToCenter, 1.3), 2)) * curveMaxAmp * mModel->scale ().x ()); } void CurvedFoldAnim::step () { GridZoomAnim::step (); float forwardProgress = getActualProgress (); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int wheight = winRect.height (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float curveMaxAmp = (0.4 * pow ((float)oheight / ::screen->height (), 0.4) * optValF (AnimationOptions::CurvedFoldAmpMult)); float sinForProg = sin (forwardProgress * M_PI / 2); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { Point3d &objPos = object->position (); if (i % 2 == 0) // object is at the left side { float objGridY = object->gridPosition ().y (); float origy = (wy + (oheight * objGridY - outExtents.top) * mModel->scale ().y ()); if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { // Execute shade mode // find position in window contents // (window contents correspond to 0.0-1.0 range) float relPosInWinContents = (objGridY * oheight - mDecorTopHeight) / wheight; float relDistToCenter = fabs (relPosInWinContents - 0.5); if (objGridY == 0) { objPos.setY (oy); objPos.setZ (0); } else if (objGridY == 1) { objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight + mDecorBottomHeight)); objPos.setZ (0); } else { objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (oy + mDecorTopHeight)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToCenter, curveMaxAmp)); } } else { // Execute normal mode // find position within window borders // (border contents correspond to 0.0-1.0 range) float relPosInWinBorders = (objGridY * oheight - (inRect.y () - oy)) / inRect.height (); float relDistToCenter = fabs (relPosInWinBorders - 0.5); // prevent top & bottom shadows from extending too much if (relDistToCenter > 0.5) relDistToCenter = 0.5; objPos.setY ( (1 - forwardProgress) * origy + forwardProgress * (inRect.y () + inRect.height () / 2.0)); objPos.setZ ( getObjectZ (mModel, forwardProgress, sinForProg, relDistToCenter, curveMaxAmp)); } } else // object is at the right side { // Set y/z position to the y/z position of the object at the left // on the same row (previous object) Point3d &leftObjPos = (object - 1)->position (); objPos.setY (leftObjPos.y ()); objPos.setZ (leftObjPos.z ()); } float origx = (wx + (owidth * object->gridPosition ().x () - outExtents.left) * mModel->scale ().x ()); objPos.setX (origx); } } void CurvedFoldAnim::updateBB (CompOutput &output) { if (optValF (AnimationOptions::CurvedFoldAmpMult) < 0) // if outward { GridZoomAnim::updateBB (output); // goes through all objects return; } // Just consider the corner objects GridModel::GridObject *objects = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i) { Point3d &pos = objects[i].position (); GLVector coords (pos.x (), pos.y (), 0, 1); mAWindow->expandBBWithPoint2DTransform (coords, mTransform); if (i == 1) { // skip to the last row after considering the first row // (each row has 2 objects) i = n - 3; } } } bool CurvedFoldAnim::zoomToIcon () { return ((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && optValB (AnimationOptions::CurvedFoldZoomToTaskbar)); } ./plugins/animation/src/focusfade.cpp0000644000004100000410000001043213246301623020135 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * focusfade.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Focus Fade ========================= FocusFadeAnim::FocusFadeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), RestackAnim::RestackAnim (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon) { } /// Compute the cross-fade opacity to make the effect look good with every /// window opacity value. GLushort FocusFadeAnim::computeOpacity (GLushort opacityInt) { float progress = 1 - progressLinear (); float opacity = opacityInt / (float)OPAQUE; float multiplier; bool newCopy = overNewCopy (); // flip opacity behavior for the other side of the cross-fade if (newCopy) progress = 1 - progress; if (mWindow->alpha () || (newCopy && opacity >= 0.91f)) multiplier = progressDecelerate (progress); else if (opacity > 0.94f) multiplier = progressDecelerateCustom (progress, 0.55, 1.32); else if (opacity >= 0.91f && opacity < 0.94f) multiplier = progressDecelerateCustom (progress, 0.62, 0.92); else if (opacity >= 0.89f && opacity < 0.91f) multiplier = progressDecelerate (progress); else if (opacity >= 0.84f && opacity < 0.89f) multiplier = progressDecelerateCustom (progress, 0.64, 0.80); else if (opacity >= 0.79f && opacity < 0.84f) multiplier = progressDecelerateCustom (progress, 0.67, 0.77); else if (opacity >= 0.54f && opacity < 0.79f) multiplier = progressDecelerateCustom (progress, 0.61, 0.69); else multiplier = progress; multiplier = 1 - multiplier; float finalOpacity = opacity * multiplier; finalOpacity = MIN (finalOpacity, 1); finalOpacity = MAX (finalOpacity, 0); return (GLushort)(finalOpacity * OPAQUE); } void FocusFadeAnim::updateAttrib (GLWindowPaintAttrib &attrib) { attrib.opacity = computeOpacity (attrib.opacity); } void FocusFadeAnim::processCandidate (CompWindow *candidateWin, CompWindow *subjectWin, CompRegion &candidateAndSubjectIntersection, int &numSelectedCandidates) { AnimWindow *aCandidateWin = AnimWindow::get (candidateWin); RestackPersistentData *data = static_cast (aCandidateWin->persistentData["restack"]); data->mWinPassingThrough = subjectWin; } void FocusFadeAnim::cleanUp (bool closing, bool destructing) { // Clear winPassingThrough of each window // that this one was passing through // during focus effect. foreach (CompWindow *w, ::screen->windows ()) { AnimWindow *aw = AnimWindow::get (w); PersistentDataMap::iterator itData = aw->persistentData.find ("restack"); if (itData != aw->persistentData.end ()) // if found { RestackPersistentData *data = static_cast (itData->second); if (data->mWinPassingThrough == mWindow) data->mWinPassingThrough = 0; } } RestackAnim::cleanUp (closing, destructing); } ./plugins/animation/src/grid.cpp0000644000004100000410000003037213246301623017130 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * grid.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Ported to GLVertexBuffer by: Daniel van Vugt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Dodge ========================= GridAnim::GridModel::GridObject::GridObject () : mPosition (0, 0, 0), mGridPosition (0, 0), mOffsetTexCoordForQuadBefore (0, 0), mOffsetTexCoordForQuadAfter (0, 0) { } void GridAnim::GridModel::GridObject::setGridPosition (Point &gridPosition) { mGridPosition = gridPosition; } GridAnim::GridModel::GridModel (CompWindow *w, WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight) : mScale (1.0f, 1.0f), mScaleOrigin (0, 0) { mNumObjects = (unsigned)(gridWidth * gridHeight); mObjects = new GridObject[mNumObjects]; initObjects (curWindowEvent, height, gridWidth, gridHeight, decorTopHeight, decorBottomHeight); } GridAnim::GridModel::~GridModel () { delete[] mObjects; } void GridAnim::GridModel::initObjects (WindowEvent curWindowEvent, int height, int gridWidth, int gridHeight, int decorTopHeight, int decorBottomHeight) { int gridX, gridY; int nGridCellsY; // number of grid cells in x direction int nGridCellsX = gridWidth - 1; if (curWindowEvent == WindowEventShade || curWindowEvent == WindowEventUnshade) { // Number of grid cells in y direction. // One allocated for top, one for bottom. nGridCellsY = gridHeight - 3; float winContentsHeight = height - decorTopHeight - decorBottomHeight; //Top for (gridX = 0; gridX < gridWidth; ++gridX) { Point gridPos ((float)gridX / nGridCellsX, 0); mObjects[gridX].setGridPosition (gridPos); } float inWinY, gridPosY; // Window contents for (gridY = 1; gridY < gridHeight - 1; ++gridY) { inWinY = (gridY - 1) * winContentsHeight / nGridCellsY + decorTopHeight; gridPosY = inWinY / height; for (gridX = 0; gridX < gridWidth; ++gridX) { Point gridPos ((float)gridX / nGridCellsX, gridPosY); mObjects[gridY * gridWidth + gridX].setGridPosition (gridPos); } } // Bottom (gridY is gridHeight-1 now) for (gridX = 0; gridX < gridWidth; ++gridX) { Point gridPos ((float)gridX / nGridCellsX, 1); mObjects[gridY * gridWidth + gridX].setGridPosition (gridPos); } } else { int objIndex = 0; // number of grid cells in y direction nGridCellsY = gridHeight - 1; for (gridY = 0; gridY < gridHeight; ++gridY) { for (gridX = 0; gridX < gridWidth; ++gridX) { // TODO Optimize Point gridPos ((float)gridX / nGridCellsX, (float)gridY / nGridCellsY); mObjects[objIndex].setGridPosition (gridPos); ++objIndex; } } } } void GridAnim::GridModel::move (float tx, float ty) { GridObject *object = mObjects; for (unsigned int i = 0; i < mNumObjects; ++i, ++object) { object->mPosition.add (Point3d (tx, ty, 0)); } } void GridAnim::updateBB (CompOutput &output) { GridModel::GridObject *object = mModel->mObjects; for (unsigned int i = 0; i < mModel->mNumObjects; ++i, ++object) { mAWindow->expandBBWithPoint (object->position ().x () + 0.5, object->position ().y () + 0.5); } } void GridAnim::initGrid () { mGridWidth = 2; mGridHeight = 2; } GridAnim::GridAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mModel (NULL), mGridWidth (0), mGridHeight (0), mUseQTexCoord (false) { } void GridAnim::init () { initGrid (); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); mModel = new GridModel (mWindow, mCurWindowEvent, outRect.height (), mGridWidth, mGridHeight, mDecorTopHeight, mDecorBottomHeight); } GridAnim::~GridAnim () { if (mModel) delete mModel; } void GridAnim::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (region.isEmpty ()) // nothing to do return; GLfloat *v, *vMax; bool notUsing3dCoords = !using3D (); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); // window output (contents + decorations + shadows) coordinates and size int ox = outRect.x (); int oy = outRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); // to be used if event is shade/unshade float winContentsY = oy + outExtents.top; float winContentsHeight = oheight - outExtents.top - outExtents.bottom; GLWindow *gWindow = GLWindow::get (mWindow); GLVertexBuffer *vertexBuffer = gWindow->vertexBuffer (); int vSize = vertexBuffer->getVertexStride (); // Indentation kept to provide a clean diff with the old code, for now... { int y1 = outRect.y1 (); int x2 = outRect.x2 (); int y2 = outRect.y2 (); float gridW = (float)owidth / (mGridWidth - 1); float gridH; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { if (y1 < winContentsY) // if at top part gridH = mDecorTopHeight; else if (y2 > winContentsY + winContentsHeight) // if at bottom gridH = mDecorBottomHeight; else // in window contents (only in Y coords) { float winContentsHeight = oheight - (mDecorTopHeight + mDecorBottomHeight); gridH = winContentsHeight / (mGridHeight - 3); } } else gridH = (float)oheight / (mGridHeight - 1); int oldCount = vertexBuffer->countVertices (); gWindow->glAddGeometry (matrix, region, clip, gridW, gridH); int newCount = vertexBuffer->countVertices (); v = vertexBuffer->getVertices () + (oldCount * vSize); vMax = vertexBuffer->getVertices () + (newCount * vSize); float x, y, topiyFloat; // For each vertex for (; v < vMax; v += vSize) { x = v[0]; y = v[1]; if (y > y2) y = y2; if (mCurWindowEvent == WindowEventShade || mCurWindowEvent == WindowEventUnshade) { if (y1 < winContentsY) // if at top part { topiyFloat = (y - oy) / mDecorTopHeight; topiyFloat = MIN (topiyFloat, 0.999); // avoid 1.0 } else if (y2 > winContentsY + winContentsHeight) // if at bottom topiyFloat = (mGridHeight - 2) + (mDecorBottomHeight ? (y - winContentsY - winContentsHeight) / mDecorBottomHeight : 0); else // in window contents (only in Y coords) topiyFloat = (mGridHeight - 3) * (y - winContentsY) / winContentsHeight + 1; } else topiyFloat = (mGridHeight - 1) * (y - oy) / oheight; // topiy should be at most (mGridHeight - 2) int topiy = (int)(topiyFloat + 1e-4); if (topiy == mGridHeight - 1) --topiy; int bottomiy = topiy + 1; float iny = topiyFloat - topiy; float inyRest = 1 - iny; // End of calculations for y // Indentation kept to provide a clean diff with the old code... { if (x > x2) x = x2; // find containing grid cell (leftix rightix) x (topiy bottomiy) float leftixFloat = (mGridWidth - 1) * (x - ox) / owidth; int leftix = (int)(leftixFloat + 1e-4); if (leftix == mGridWidth - 1) --leftix; int rightix = leftix + 1; // GridModel::GridObjects that are at top, bottom, left, right corners of quad GridModel::GridObject *objToTopLeft = &(mModel->mObjects[topiy * mGridWidth + leftix]); GridModel::GridObject *objToTopRight = &(mModel->mObjects[topiy * mGridWidth + rightix]); GridModel::GridObject *objToBottomLeft = &(mModel->mObjects[bottomiy * mGridWidth + leftix]); GridModel::GridObject *objToBottomRight = &(mModel->mObjects[bottomiy * mGridWidth + rightix]); Point3d &objToTopLeftPos = objToTopLeft->mPosition; Point3d &objToTopRightPos = objToTopRight->mPosition; Point3d &objToBottomLeftPos = objToBottomLeft->mPosition; Point3d &objToBottomRightPos = objToBottomRight->mPosition; // find position in cell by taking remainder of flooring float inx = leftixFloat - leftix; float inxRest = 1 - inx; // Interpolate to find deformed coordinates float hor1x = (inxRest * objToTopLeftPos.x () + inx * objToTopRightPos.x ()); float hor1y = (inxRest * objToTopLeftPos.y () + inx * objToTopRightPos.y ()); float hor1z = (notUsing3dCoords ? 0 : inxRest * objToTopLeftPos.z () + inx * objToTopRightPos.z ()); float hor2x = (inxRest * objToBottomLeftPos.x () + inx * objToBottomRightPos.x ()); float hor2y = (inxRest * objToBottomLeftPos.y () + inx * objToBottomRightPos.y ()); float hor2z = (notUsing3dCoords ? 0 : inxRest * objToBottomLeftPos.z () + inx * objToBottomRightPos.z ()); float deformedX = inyRest * hor1x + iny * hor2x; float deformedY = inyRest * hor1y + iny * hor2y; float deformedZ = inyRest * hor1z + iny * hor2z; v[0] = deformedX; v[1] = deformedY; v[2] = deformedZ; } } } } GridTransformAnim::GridTransformAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridAnim::GridAnim (w, curWindowEvent, duration, info, icon), mUsingTransform (true) { } void GridTransformAnim::init () { GridAnim::init (); TransformAnim::init (); } void GridTransformAnim::updateBB (CompOutput &output) { if (using3D ()) { GLMatrix wTransform; // center for perspective correction Point center = getCenter (); GLMatrix fullTransform (mTransform.getMatrix ()); applyPerspectiveSkew (output, fullTransform, center); prepareTransform (output, wTransform, fullTransform); mAWindow->expandBBWithPoints3DTransform (output, wTransform, 0, mModel->objects (), mModel->numObjects ()); } else { GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; ++i, ++object) { GLVector coords (object->mPosition.x (), object->mPosition.y (), 0, 1); mAWindow->expandBBWithPoint2DTransform (coords, mTransform); } } } void GridTransformAnim::updateTransform (GLMatrix &wTransform) { if (!mUsingTransform) return; TransformAnim::updateTransform (wTransform); if (using3D ()) { // center for perspective correction Point center = getCenter (); GLMatrix skewTransform; applyPerspectiveSkew (AnimScreen::get (::screen)->output (), skewTransform, center); wTransform *= skewTransform; } } ./plugins/animation/compiz-animation.pc.in0000644000004100000410000000041513246301623021112 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-animation Description: Animation plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lanimation Cflags: @COMPIZ_CFLAGS@ ./plugins/animation/animation.xml.in0000644000004100000410000006370513246301623020024 0ustar www-datawww-data <_short>Animations <_long>Use various animations as window effects windowanimations Effects opengl regex decor composite opengl regex fade <_short>Open Animation <_short>Animation Selection <_short>Random Effects <_short>Close Animation <_short>Animation Selection <_short>Random Effects <_short>Minimize Animation <_short>Animation Selection <_short>Random Effects <_short>Unminimize Animation <_short>Animation Selection <_short>Random Effects <_short>Shade Animation <_short>Animation Selection <_short>Random Effects <_short>Focus Animation <_short>Animation Selection <_short>Effect Settings <_short>Curved Fold <_short>Dodge <_short>Dream <_short>Glide 1 <_short>Glide 2 <_short>Horizontal Folds <_short>Magic Lamp <_short>Magic Lamp Wavy <_short>Roll Up <_short>Sidekick <_short>Wave <_short>Zoom open_effects close_effects minimize_effects unminimize_effects shade_effects animation:None <_name>None animation:Random <_name>Random open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects unminimize_effects unminimize_random_effects shade_effects shade_random_effects animation:Curved Fold <_name>Curved Fold animation:Horizontal Folds <_name>Horizontal Folds shade_effects shade_random_effects animation:Roll Up <_name>Roll Up open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects unminimize_effects unminimize_random_effects animation:Dream <_name>Dream animation:Fade <_name>Fade animation:Glide 1 <_name>Glide 1 animation:Glide 2 <_name>Glide 2 animation:Magic Lamp <_name>Magic Lamp animation:Magic Lamp Wavy <_name>Magic Lamp Wavy animation:Sidekick <_name>Sidekick animation:Zoom <_name>Zoom open_effects open_random_effects close_effects close_random_effects animation:Wave <_name>Wave focus_effects animation:None <_name>None animation:Dodge <_name>Dodge animation:Focus Fade <_name>Fade animation:Wave <_name>Wave ./plugins/screenshot/0000755000004100000410000000000013246301624015102 5ustar www-datawww-data./plugins/screenshot/CMakeLists.txt0000644000004100000410000000017413246301623017643 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(screenshot PLUGINDEPS composite opengl compiztoolbox) ./plugins/screenshot/src/0000755000004100000410000000000013246301624015671 5ustar www-datawww-data./plugins/screenshot/src/screenshot.cpp0000644000004100000410000003305313246301623020555 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include "screenshot.h" #include #if defined(HAVE_SCANDIR_POSIX) // POSIX (2008) defines the comparison function like this: #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const dirent **, const dirent **))(d)); #else #define scandir(a,b,c,d) scandir((a), (b), (c), (int(*)(const void*,const void*))(d)); #endif COMPIZ_PLUGIN_20090315 (screenshot, ShotPluginVTable) bool ShotScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (xid != ::screen->root () || ::screen->otherGrabExist ("screenshot", NULL)) return false; if (!mGrabIndex) { mGrabIndex = ::screen->pushGrab (None, "screenshot"); screen->handleEventSetEnabled (this, true); } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); /* Start selection screenshot rectangle */ mX1 = mX2 = pointerX; mY1 = mY2 = pointerY; mGrab = true; gScreen->glPaintOutputSetEnabled (this, true); return true; } bool ShotScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (xid && xid != ::screen->root ()) return false; if (mGrabIndex) { /* Enable screen capture */ cScreen->paintSetEnabled (this, true); ::screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; ::screen->handleEventSetEnabled (this, false); if (state & CompAction::StateCancel) mGrab = false; if (mX1 != mX2 && mY1 != mY2) { int x1 = MIN (mX1, mX2) - 1; int y1 = MIN (mY1, mY2) - 1; int x2 = MAX (mX1, mX2) + 1; int y2 = MAX (mY1, mY2) + 1; cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); } } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } static int shotFilter (const struct dirent *d) { int number; if (sscanf (d->d_name, "screenshot%d.png", &number)) { int nDigits = 0; for (; number > 0; number /= 10) ++nDigits; /* Make sure there are no trailing characters in the name */ if ((int) strlen (d->d_name) == 14 + nDigits) return 1; } return 0; } static int shotSort (const void *_a, const void *_b) { struct dirent **a = (struct dirent **) _a; struct dirent **b = (struct dirent **) _b; int al = strlen ((*a)->d_name); int bl = strlen ((*b)->d_name); if (al == bl) return strcoll ((*a)->d_name, (*b)->d_name); else return al - bl; } void ShotScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { if (mGrab) { if (!mGrabIndex) { /* Taking screenshot, enable full paint on * this frame */ outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } } cScreen->paint (outputs, mask); } namespace { bool paintSelectionRectangleFill (const CompRect &rect, unsigned short *fillColor, GLVertexBuffer *streamingBuffer, const GLMatrix &transform) { GLfloat vertexData[12]; GLushort colorData[4]; int x1 = rect.x1 (); int y1 = rect.y1 (); int x2 = rect.x2 (); int y2 = rect.y2 (); const float MaxUShortFloat = std::numeric_limits ::max (); /* draw filled rectangle */ float alpha = fillColor[3] / MaxUShortFloat; colorData[0] = alpha * fillColor[0]; colorData[1] = alpha * fillColor[1]; colorData[2] = alpha * fillColor[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x1; vertexData[4] = y2; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y1; vertexData[8] = 0.0f; vertexData[9] = x2; vertexData[10] = y2; vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); if (streamingBuffer->end ()) { glEnable (GL_BLEND); streamingBuffer->render (transform); glDisable (GL_BLEND); return true; } return false; } bool paintSelectionRectangleOutline (const CompRect &rect, unsigned short *outlineColor, GLVertexBuffer *streamingBuffer, const GLMatrix &transform) { GLfloat vertexData[12]; GLushort colorData[4]; int x1 = rect.x1 (); int y1 = rect.y1 (); int x2 = rect.x2 (); int y2 = rect.y2 (); const float MaxUShortFloat = std::numeric_limits ::max (); /* draw outline */ float alpha = outlineColor[3] / MaxUShortFloat; colorData[0] = alpha * outlineColor[0]; colorData[1] = alpha * outlineColor[1]; colorData[2] = alpha * outlineColor[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x1; vertexData[4] = y2; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y2; vertexData[8] = 0.0f; vertexData[9] = x2; vertexData[10] = y1; vertexData[11] = 0.0f; streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); if (streamingBuffer->end ()) { glEnable (GL_BLEND); glLineWidth (2.0); streamingBuffer->render (transform); glDisable (GL_BLEND); return true; } return false; } void ensureDirectoryForImage (CompString &directory) { /* If dir is empty, use user's desktop directory instead */ if (directory.length () == 0) directory = getXDGUserDir (XDGUserDirDesktop); } int getImageNumberFromDirectory (const CompString &directory) { struct dirent **namelist; int n = scandir (directory.c_str (), &namelist, shotFilter, shotSort); if (n >= 0) { int number = 0; if (n > 0) sscanf (namelist[n - 1]->d_name, "screenshot%d.png", &number); ++number; if (n) free (namelist); return number; } else { perror ("scandir"); return 0; } } CompString getImageAbsolutePath (const CompString &directory, int number) { std::stringstream ss; ss << directory << "/screenshot" << number << ".png"; return ss.str (); } bool saveBuffer (const boost::scoped_array &buffer, int w, int h, const CompString &path) { CompSize imageSize (w, h); if (!::screen->writeImageToFile (const_cast (path), "png", imageSize, buffer.get ())) { compLogMessage ("screenshot", CompLogLevelError, "failed to write screenshot image"); return false; } return true; } bool launchApplicationAndTakeScreenshot (const CompString &app, const CompString &directory) { if (app.length () > 0) { ::screen->runCommand (app + " " + directory); return true; } return false; } bool readFromGPUBufferToCPUBuffer (const CompRect &rect, boost::scoped_array &buffer) { int x1 = rect.x1 (); int y1 = rect.y1 (); int x2 = rect.x2 (); int y2 = rect.y2 (); int w = x2 - x1; int h = y2 - y1; if (w && h) { size_t size = w * h * 4; buffer.reset (new GLubyte[size]); if (buffer.get ()) { GLint drawBinding = 0; GLint readBinding = 0; /* Bind the currently bound draw framebuffer to * the read framebuffer and read from it */ if (GL::fboEnabled) { glGetIntegerv (GL::DRAW_FRAMEBUFFER_BINDING, &drawBinding); glGetIntegerv (GL::READ_FRAMEBUFFER_BINDING, &readBinding); (GL::bindFramebuffer) (GL::READ_FRAMEBUFFER, drawBinding); } glGetError (); glReadPixels (x1, ::screen->height () - y2, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *) buffer.get ()); if (GL::fboEnabled) (GL::bindFramebuffer) (GL::READ_FRAMEBUFFER, readBinding); if (glGetError () != GL_NO_ERROR) return false; return true; } } return false; } /* We need to take directory by copy because * it may be modified later */ bool saveScreenshot (CompRect rect, CompString directory, const CompString &alternativeApplication) { ensureDirectoryForImage (directory); int number = getImageNumberFromDirectory (directory); CompString path = getImageAbsolutePath (directory, number); boost::scoped_array buffer; bool success = readFromGPUBufferToCPUBuffer (rect, buffer); if (success) { success = saveBuffer (buffer, rect.width (), rect.height (), path); } else { compLogMessage ("screenshot", CompLogLevelWarn, "glReadPixels failed"); } if (!success) success = launchApplicationAndTakeScreenshot (alternativeApplication, directory); return success; } } bool ShotScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, matrix, region, output, mask); if (status && mGrab) { /* We just want to draw the screenshot selection box if * we are grabbed, the size has changed and the CCSM * option to draw it is enabled. */ CompRect selectionRect (std::min (mX1, mX2), std::min (mY1, mY2), std::abs (mX2 - mX1), std::abs (mY2 - mY1)); if (mGrabIndex && selectionSizeChanged && optionGetDrawSelectionIndicator ()) { GLMatrix transform (matrix); GLVertexBuffer *streamingBuffer (GLVertexBuffer::streamingBuffer ()); transform.toScreenSpace (output, -DEFAULT_Z_CAMERA); paintSelectionRectangleFill (selectionRect, optionGetSelectionFillColor (), streamingBuffer, transform); paintSelectionRectangleOutline (selectionRect, optionGetSelectionOutlineColor (), streamingBuffer, transform); /* we finished painting the selection box, * reset selectionSizeChanged now */ selectionSizeChanged = false; } else if (!mGrabIndex) { /* Taking a screenshot */ saveScreenshot (selectionRect, optionGetDirectory (), optionGetLaunchApp ()); cScreen->paintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } } return status; } void ShotScreen::handleMotionEvent (int xRoot, int yRoot) { /* update screenshot rectangle size */ if (mGrabIndex && (mX2 != xRoot || mY2 != yRoot)) { /* the size has changed now */ selectionSizeChanged = true; int x1 = MIN (mX1, mX2) - 1; int y1 = MIN (mY1, mY2) - 1; int x2 = MAX (mX1, mX2) + 1; int y2 = MAX (mY1, mY2) + 1; cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); mX2 = xRoot; mY2 = yRoot; x1 = MIN (mX1, mX2) - 1; y1 = MIN (mY1, mY2) - 1; x2 = MAX (mX1, mX2) + 1; y2 = MAX (mY1, mY2) + 1; cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); } } void ShotScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: if (event->xmotion.root == screen->root ()) handleMotionEvent (pointerX, pointerY); break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == screen->root ()) handleMotionEvent (pointerX, pointerY); break; default: break; } ::screen->handleEvent (event); } ShotScreen::ShotScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mGrabIndex (0), mGrab (false), selectionSizeChanged (false) { optionSetInitiateButtonInitiate (boost::bind (&ShotScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&ShotScreen::terminate, this, _1, _2, _3)); ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } bool ShotPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("compiztoolbox", COMPIZ_COMPIZTOOLBOX_ABI)) return true; return false; } ./plugins/screenshot/src/screenshot.h0000644000004100000410000000503213246301623020216 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "screenshot_options.h" #include #include #include #include #include class ShotScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public ScreenshotOptions { public: ShotScreen (CompScreen *screen); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector &options); void handleMotionEvent (int xRoot, int yRoot); void handleEvent (XEvent *event); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask); void paint (CompOutput::ptrList &outputs, unsigned int mask); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle mGrabIndex; bool mGrab; bool selectionSizeChanged; int mX1, mY1, mX2, mY2; }; class ShotPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/screenshot/screenshot.xml.in0000644000004100000410000000401013246301623020400 0ustar www-datawww-data <_short>Screenshot <_long>Easily capture parts of your screen and save them as .png image Extras opengl compiztoolbox imageext:png decor ./plugins/switcher/0000755000004100000410000000000013246301624014555 5ustar www-datawww-data./plugins/switcher/CMakeLists.txt0000644000004100000410000000017113246301623017313 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(switcher PLUGINDEPS composite opengl compiztoolbox)./plugins/switcher/switcher.xml.in0000644000004100000410000001527113246301623017541 0ustar www-datawww-data <_short>Application Switcher <_long>Application Switcher Window Management opengl compiztoolbox <_short>Bindings <_short>Background ./plugins/switcher/src/0000755000004100000410000000000013246301624015344 5ustar www-datawww-data./plugins/switcher/src/switcher.cpp0000644000004100000410000007153513246301623017712 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author(s): * - David Reveman * - Auboyneau Vincent (size multiplier for A11Y) */ #include "switcher.h" COMPIZ_PLUGIN_20090315 (switcher, SwitchPluginVTable) const unsigned short WIDTH = 212; const unsigned short HEIGHT = 192; const unsigned short SPACE = 10; const unsigned short BOX_WIDTH = 3; #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} void SwitchScreen::updateWindowList (int count) { int x, y; if (count > 1) { count -= (count + 1) & 1; if (count < 3) count = 3; } pos = ((count >> 1) - (int)windows.size ()) * modifiedWidth; move = 0; selectedWindow = windows.front (); x = screen->currentOutputDev ().x1 () + screen->currentOutputDev ().width () / 2; y = screen->currentOutputDev ().y1 () + screen->currentOutputDev ().height () / 2; if (popupWindow) { CompWindow *w = screen->findWindow (popupWindow); XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = 0; valueMask |= (CWX | CWY | CWWidth | CWHeight); xwc.x = x - WINDOW_WIDTH (count) / 2; xwc.y = y - WINDOW_HEIGHT / 2; xwc.width = WINDOW_WIDTH (count); xwc.height = WINDOW_HEIGHT; if (w) w->configureXWindow (valueMask, &xwc); else XConfigureWindow (screen->dpy (), popupWindow, valueMask, &xwc); } } void SwitchScreen::createWindowList (int count) { windows.clear (); foreach (CompWindow *w, screen->windows ()) { SWITCH_WINDOW (w); if (sw->isSwitchWin ()) { windows.push_back (w); sw->cWindow->damageRectSetEnabled (sw, true); } } windows.sort (BaseSwitchScreen::compareWindows); if (windows.size () == 2) { windows.push_back (windows.front ()); windows.push_back ((*++windows.begin ())); } updateWindowList (count); } bool SwitchWindow::damageRect (bool initial, const CompRect &rect) { return BaseSwitchWindow::damageRect (initial, rect); } BaseSwitchWindow::IconMode SwitchWindow::getIconMode () { if (sScreen->optionGetIconOnly ()) return ShowIconOnly; if (!sScreen->optionGetIcon ()) return HideIcon; return ShowIcon; } void SwitchScreen::getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption) { minimizedOption = optionGetMinimized (); matchOption = &optionGetWindowMatch (); } bool SwitchScreen::getMipmap () { return optionGetMipmap (); } void SwitchScreen::switchToWindow (bool toNext) { CompWindow *w = BaseSwitchScreen::switchToWindow (toNext, optionGetAutoRotate (), optionGetFocusOnSwitch ()); if (w) { if (!zoomedWindow) zoomedWindow = selectedWindow; } } void SwitchScreen::handleSelectionChange (bool toNext, int nextIdx) { if (toNext) move -= modifiedWidth; else move += modifiedWidth; moreAdjust = true; } int SwitchScreen::countWindows () { int count = 0; foreach (CompWindow *w, screen->windows ()) if (SwitchWindow::get (w)->isSwitchWin ()) { count++; if (count == 5) break; } if (count == 5 && screen->width () <= WINDOW_WIDTH (5)) count = 3; return count; } void SwitchScreen::handleEvent (XEvent *event) { BaseSwitchScreen::handleEvent (event); } void SwitchScreen::initiate (SwitchWindowSelection selection, bool showPopup) { int count; if (screen->otherGrabExist ("switcher", NULL)) return; this->selection = selection; selectedWindow = NULL; count = countWindows (); if (count < 1) return; if (!popupWindow && showPopup) { Display *dpy = screen->dpy (); XSizeHints xsh; XWMHints xwmh; XClassHint xch; Atom state[4]; int nState = 0; XSetWindowAttributes attr; Visual *visual; visual = findArgbVisual (dpy, screen->screenNum ()); if (!visual) return; if (count > 1) { count -= (count + 1) & 1; if (count < 3) count = 3; } xsh.flags = PSize | PPosition | PWinGravity; xsh.width = WINDOW_WIDTH (count); xsh.height = WINDOW_HEIGHT; xsh.win_gravity = StaticGravity; xwmh.flags = InputHint; xwmh.input = 0; xch.res_name = (char *)"compiz"; xch.res_class = (char *)"switcher-window"; attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, screen->root (), visual, AllocNone); attr.override_redirect = true; popupWindow = XCreateWindow (dpy, screen->root (), screen->width () / 2 - xsh.width / 2, screen->height () / 2 - xsh.height / 2, (unsigned) xsh.width, (unsigned) xsh.height, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect, &attr); XSetWMProperties (dpy, popupWindow, NULL, NULL, programArgv, programArgc, &xsh, &xwmh, &xch); state[nState++] = Atoms::winStateAbove; state[nState++] = Atoms::winStateSticky; state[nState++] = Atoms::winStateSkipTaskbar; state[nState++] = Atoms::winStateSkipPager; XChangeProperty (dpy, popupWindow, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nState); XChangeProperty (dpy, popupWindow, Atoms::winType, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winTypeUtil, 1); screen->setWindowProp (popupWindow, Atoms::winDesktop, 0xffffffff); updateBackground (optionGetUseBackgroundColor (), optionGetBackgroundColor ()); setSelectedWindowHint (false); } if (!grabIndex) grabIndex = screen->pushGrab (screen->invisibleCursor (), "switcher"); if (grabIndex) { if (!switching) { lastActiveNum = screen->activeNum (); createWindowList (count); sTranslate = zoom; if (popupWindow && showPopup) { XMapWindow (screen->dpy (), popupWindow); setSelectedWindowHint (optionGetFocusOnSwitch ()); } lastActiveWindow = screen->activeWindow (); activateEvent (true); } cScreen->damageScreen (); switching = true; moreAdjust = true; screen->handleEventSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); foreach (CompWindow *w, screen->windows ()) { SWITCH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, true); } } } static bool switchTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (action) action->setState (action->state () & (unsigned)~(CompAction::StateTermKey | CompAction::StateTermButton)); if (xid && xid != screen->root ()) return false; SWITCH_SCREEN (screen); if (ss->grabIndex) { if (ss->popupWindow) { XUnmapWindow (screen->dpy (), ss->popupWindow); } ss->switching = false; if (state & CompAction::StateCancel) { ss->selectedWindow = NULL; ss->zoomedWindow = NULL; if (screen->activeWindow () != ss->lastActiveWindow) { CompWindow *w = screen->findWindow (ss->lastActiveWindow); if (w) w->moveInputFocusTo (); } } if (state && ss->selectedWindow && !ss->selectedWindow->destroyed ()) screen->sendWindowActivationRequest (ss->selectedWindow->id ()); screen->removeGrab (ss->grabIndex, 0); ss->grabIndex = NULL; if (!ss->popupWindow) screen->handleEventSetEnabled (ss, false); if (!ss->zooming) { ss->selectedWindow = NULL; ss->zoomedWindow = NULL; ss->activateEvent (false); } else { ss->moreAdjust = true; } ss->selectedWindow = NULL; ss->setSelectedWindowHint (false); ss->lastActiveNum = 0; ss->cScreen->damageScreen (); } return false; } static bool switchInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options, SwitchWindowSelection selection, bool showPopup, bool nextWindow) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (xid != screen->root ()) return false; SWITCH_SCREEN (screen); if (!ss->switching) { ss->initiate (selection, showPopup); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } ss->switchToWindow (nextWindow); return false; } void SwitchScreen::windowRemove (CompWindow *w) { if (w) { int count; CompWindow *selected; CompWindow *old; int allWindowsWidth; SWITCH_WINDOW (w); if (!sw->isSwitchWin (true)) return; sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); old = selected = selectedWindow; CompWindowList::iterator it = std::find (windows.begin (), windows.end (), w); if (it == windows.end ()) return; if (w == selected) { CompWindowList::iterator newSelected = it; if (w == windows.back ()) newSelected = windows.begin (); else ++newSelected; selected = *newSelected; } windows.erase (it); count = windows.size (); if (count == 2) { if (windows.front () == windows.back ()) { windows.pop_back (); count = 1; } else { windows.push_back (windows.front ()); windows.push_back (*++windows.begin ()); } } else if (count == 0) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); switchTerminate (NULL, 0, o); return; } if (!grabIndex) return; updateWindowList (count); allWindowsWidth = windows.size () * modifiedWidth; foreach (CompWindow *win, windows) { selectedWindow = win; if (selectedWindow == selected) break; pos -= modifiedWidth; if (pos < -allWindowsWidth) pos += allWindowsWidth; } if (popupWindow) { CompWindow *popup; popup = screen->findWindow (popupWindow); if (popup) CompositeWindow::get (popup)->addDamage (); setSelectedWindowHint (optionGetFocusOnSwitch ()); } if (old != selectedWindow) { zoomedWindow = selectedWindow; CompositeWindow::get (selectedWindow)->addDamage (); CompositeWindow::get (w)->addDamage (); if (old && !old->destroyed ()) CompositeWindow::get (old)->addDamage (); } } } bool SwitchScreen::adjustVelocity () { float dx, adjust, amount; dx = move; adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mVelocity = (amount * mVelocity + adjust) / (amount + 1.0f); if (zooming) { float dt, ds; if (switching) dt = zoom - translate; else dt = 0.0f - translate; adjust = dt * 0.15f; amount = fabs (dt) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; tVelocity = (amount * tVelocity + adjust) / (amount + 1.0f); if (selectedWindow == zoomedWindow) ds = zoom - sTranslate; else ds = 0.0f - sTranslate; adjust = ds * 0.5f; amount = fabs (ds) * 5.0f; if (amount < 1.0f) amount = 1.0f; else if (amount > 6.0f) amount = 6.0f; sVelocity = (amount * sVelocity + adjust) / (amount + 1.0f); if (selectedWindow == zoomedWindow) { if (fabs (dx) < 0.1f && fabs (mVelocity) < 0.2f && fabs (dt) < 0.001f && fabs (tVelocity) < 0.001f && fabs (ds) < 0.001f && fabs (sVelocity) < 0.001f) { mVelocity = tVelocity = sVelocity = 0.0f; return false; } } } else { if (fabs (dx) < 0.1f && fabs (mVelocity) < 0.2f) { mVelocity = 0.0f; return false; } } return true; } void SwitchScreen::preparePaint (int msSinceLastPaint) { if (moreAdjust) { int steps, m; float amount, chunk; int allWindowsWidth; allWindowsWidth = windows.size () * modifiedWidth; amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { moreAdjust = adjustVelocity (); if (!moreAdjust) { pos += move; move = 0; if (zooming) { if (switching) { translate = zoom; sTranslate = zoom; } else { translate = 0.0f; sTranslate = zoom; selectedWindow = NULL; zoomedWindow = NULL; if (grabIndex) { screen->removeGrab (grabIndex, 0); grabIndex = 0; } activateEvent (false); } } break; } m = mVelocity * chunk; if (!m) { if (mVelocity) m = (move > 0) ? 1 : -1; } move -= m; pos += m; if (pos < -allWindowsWidth) pos += allWindowsWidth; else if (pos > 0) pos -= allWindowsWidth; translate += tVelocity * chunk; sTranslate += sVelocity * chunk; if (selectedWindow != zoomedWindow) { if (sTranslate < 0.01f) zoomedWindow = selectedWindow; } } } cScreen->preparePaint (msSinceLastPaint); } bool SwitchScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; zoomMask = ZOOMED_WINDOW_MASK | NORMAL_WINDOW_MASK; if (grabIndex || (zooming && translate > 0.001f)) { GLMatrix sTransform (transform); CompWindow *zoomed; CompWindow *switcher; Window zoomedAbove = None; if (zooming) { mask &= (unsigned)~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_CLEAR_MASK; sTransform.translate (0.0f, 0.0f, -translate); zoomMask = NORMAL_WINDOW_MASK; } if (optionGetBringToFront ()) { CompWindow *frontWindow = ::screen->clientList ().back (); zoomed = zoomedWindow; if (zoomed && !zoomed->destroyed () && zoomed != frontWindow) { CompWindow *w; for (w = zoomed->prev; w && w->id () <= 1; w = w->prev) ; zoomedAbove = (w) ? w->id () : None; screen->unhookWindow (zoomed); screen->insertWindow (zoomed, frontWindow->id ()); } else { zoomed = NULL; } } else { zoomed = NULL; } ignoreSwitcher = true; status = gScreen->glPaintOutput (sAttrib, sTransform, region, output, mask); if (zooming) { float zTranslate; mask &= (unsigned)~PAINT_SCREEN_CLEAR_MASK; mask |= PAINT_SCREEN_NO_BACKGROUND_MASK; zoomMask = ZOOMED_WINDOW_MASK; zTranslate = MIN (sTranslate, translate); sTransform.translate (0.0f, 0.0f, zTranslate); status = gScreen->glPaintOutput (sAttrib, sTransform, region, output, mask); } if (zoomed) { screen->unhookWindow (zoomed); screen->insertWindow (zoomed, zoomedAbove); } ignoreSwitcher = false; switcher = screen->findWindow (popupWindow); if (switcher) { SWITCH_WINDOW (switcher); sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (!switcher->destroyed () && switcher->isViewable () && sw->cWindow->damaged ()) { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, CompRegion::infinite (), 0); } } } else { status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } return status; } void SwitchScreen::donePaint () { if ((grabIndex || zooming) && moreAdjust) { if (zooming) { cScreen->damageScreen (); } else { CompWindow *w; w = screen->findWindow (popupWindow); if (w) CompositeWindow::get (w)->addDamage (); } } else if (!grabIndex && !(zooming && translate > 0.001f) && !moreAdjust) { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); foreach (CompWindow *w, screen->windows ()) { SWITCH_WINDOW (w); sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); } } cScreen->donePaint (); } void SwitchWindow::paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y) { BaseSwitchWindow::paintThumb (attrib, transform, mask, x, y, sScreen->modifiedWidth - (SPACE << 1), sScreen->modifiedHeight - (SPACE << 1), sScreen->modifiedWidth - (sScreen->modifiedWidth >> 2), sScreen->modifiedHeight - (sScreen->modifiedHeight >> 2)); } void SwitchWindow::updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon) { const unsigned short SWITCHER_ICON_SIZE = 48; sAttrib.xScale = (float) SWITCHER_ICON_SIZE / icon->width (); sAttrib.yScale = (float) SWITCHER_ICON_SIZE / icon->height (); if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; wx = x + sScreen->modifiedWidth - icon->width () * sAttrib.xScale - SPACE; wy = y + sScreen->modifiedWidth - icon->height () * sAttrib.yScale - SPACE; } void SwitchWindow::updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon) { float iw, ih; iw = width - SPACE; ih = height - SPACE; sAttrib.xScale = iw / icon->width (); sAttrib.yScale = ih / icon->height (); if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; width = icon->width () * sAttrib.xScale; height = icon->height () * sAttrib.yScale; wx = x + SPACE + (sScreen->modifiedWidth - (SPACE << 1) - width) / 2; wy = y + SPACE + (sScreen->modifiedHeight - (SPACE << 1) - height) / 2; } void SwitchWindow::updateIconPos (int &wx, int &wy, int x, int y, float width, float height) { wx = x + SPACE + (sScreen->modifiedWidth - (SPACE << 1) - width) / 2; wy = y + SPACE + (sScreen->modifiedHeight - (SPACE << 1) - height) / 2; } /* Only for the popup window */ bool SwitchWindow::managed () const { return true; } bool SwitchWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix wTransform (transform); int zoomType = NORMAL_WINDOW_MASK; bool status; if (window->id () == sScreen->popupWindow) { int x, y, x1, x2, cx; unsigned short color[4]; const CompWindow::Geometry &g = window->geometry (); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK || sScreen->ignoreSwitcher) return false; status = gWindow->glPaint (attrib, transform, region, mask); if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK) && region.isEmpty ()) return true; x1 = g.x () + SPACE; x2 = g.x () + g.width () - SPACE; x = x1 + sScreen->pos; y = g.y () + SPACE; glEnable (GL_SCISSOR_TEST); glScissor (x1, 0, x2 - x1, screen->height ()); foreach (CompWindow *w, sScreen->windows) { if (x + sScreen->modifiedWidth > x1) { SwitchWindow::get (w)->paintThumb (gWindow->lastPaintAttrib (), transform, mask, x, y); } x += sScreen->modifiedWidth; } foreach (CompWindow *w, sScreen->windows) { if (x > x2) break; SwitchWindow::get (w)->paintThumb (gWindow->lastPaintAttrib (), transform, mask, x, y); x += sScreen->modifiedWidth; } glDisable (GL_SCISSOR_TEST); cx = g.x () + (g.width () >> 1); wTransform.translate (cx, y, 0.0f); glEnable (GL_BLEND); for (int i = 0; i < 4; i++) { color[i] = (unsigned int)sScreen->fgColor[i] * gWindow->lastPaintAttrib ().opacity / 0xffff; } streamingBuffer->begin (GL_TRIANGLES); streamingBuffer->addColors (1, color); streamingBuffer->addVertices (24, sScreen->_boxVertices); streamingBuffer->end (); streamingBuffer->render (wTransform, attrib); glDisable (GL_BLEND); } else if (window == sScreen->selectedWindow) { if (sScreen->optionGetBringToFront () && sScreen->selectedWindow == sScreen->zoomedWindow) zoomType = ZOOMED_WINDOW_MASK; if (!(sScreen->zoomMask & zoomType)) return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ? false : true; status = gWindow->glPaint (attrib, transform, region, mask); } else if (sScreen->switching) { GLWindowPaintAttrib sAttrib (attrib); GLuint value; value = (GLuint) sScreen->optionGetSaturation (); if (value != 100) sAttrib.saturation = sAttrib.saturation * value / 100; value = (GLuint) sScreen->optionGetBrightness (); if (value != 100) sAttrib.brightness = sAttrib.brightness * value / 100; if (window->wmType () & (unsigned)~(CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { value = (GLuint) sScreen->optionGetOpacity (); if (value != 100) sAttrib.opacity = sAttrib.opacity * value / 100; } if (sScreen->optionGetBringToFront () && window == sScreen->zoomedWindow) zoomType = ZOOMED_WINDOW_MASK; if (!(sScreen->zoomMask & zoomType)) return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ? false : true; status = gWindow->glPaint (sAttrib, transform, region, mask); } else { if (!(sScreen->zoomMask & zoomType)) return (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) ? false : true; status = gWindow->glPaint (attrib, transform, region, mask); } return status; } void SwitchScreen::setZoom () { if (optionGetZoom () < 0.05f) { zooming = false; zoom = 0.0f; } else { zooming = true; zoom = optionGetZoom () / 30.0f; } } void SwitchScreen::setSizeMultiplier () { sizeMultiplier = optionGetSizeMultiplier (); modifiedWidth = static_cast (WIDTH * sizeMultiplier); modifiedHeight = static_cast (HEIGHT * sizeMultiplier); float width = (WIDTH >> 1) * sizeMultiplier; float height = HEIGHT * sizeMultiplier; float box_width = BOX_WIDTH * sizeMultiplier; float boxVertices[72] = { -width, box_width, 0.0f, width, box_width, 0.0f, -width, 0.0f, 0.0f, -width, 0.0f, 0.0f, width, box_width, 0.0f, width, 0.0f, 0.0f, -width, height - box_width, 0.0f, -width + box_width, height - box_width, 0.0f, -width, box_width, 0.0f, -width, box_width, 0.0f, -width + box_width, height - box_width, 0.0f, -width + box_width, box_width, 0.0f, width - box_width, height - box_width, 0.0f, width, height - box_width, 0.0f, width - box_width, box_width, 0.0f, width - box_width, box_width, 0.0f, width, height - box_width, 0.0f, width, box_width, 0.0f, -width, height, 0.0f, width, height, 0.0f, -width, height - box_width, 0.0f, -width, height - box_width, 0.0f, width, height, 0.0f, width, height - box_width, 0.0f, }; std::copy (boxVertices, boxVertices + 72, _boxVertices); } SwitchScreen::SwitchScreen (CompScreen *screen) : BaseSwitchScreen (screen), PluginClassHandler (screen), lastActiveWindow (None), zoomedWindow (NULL), switching (false), zoomMask (~0), mVelocity (0.0), tVelocity (0.0), sVelocity (0.0), pos (0), move (0), translate (0.0), sTranslate (0.0), sizeMultiplier (1), modifiedWidth (WIDTH), modifiedHeight (HEIGHT) { zoom = optionGetZoom () / 30.0f; zooming = (optionGetZoom () > 0.05f); optionSetZoomNotify (boost::bind (&SwitchScreen::setZoom, this)); setSizeMultiplier (); optionSetSizeMultiplierNotify (boost::bind (&SwitchScreen::setSizeMultiplier, this)); auto bgUpdater = [=] (...){ this->updateBackground (this->optionGetUseBackgroundColor (), this->optionGetBackgroundColor ());}; optionSetUseBackgroundColorNotify (bgUpdater); optionSetBackgroundColorNotify (bgUpdater); #define SWITCHBIND(a,b,c) boost::bind (switchInitiateCommon, _1, _2, _3, a, b, c) optionSetNextButtonInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextButtonTerminate (switchTerminate); optionSetNextKeyInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextKeyTerminate (switchTerminate); optionSetPrevButtonInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevButtonTerminate (switchTerminate); optionSetPrevKeyInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevKeyTerminate (switchTerminate); optionSetNextAllButtonInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllButtonTerminate (switchTerminate); optionSetNextAllKeyInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllKeyTerminate (switchTerminate); optionSetPrevAllButtonInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllButtonTerminate (switchTerminate); optionSetPrevAllKeyInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllKeyTerminate (switchTerminate); optionSetNextNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupButtonTerminate (switchTerminate); optionSetNextNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupKeyTerminate (switchTerminate); optionSetPrevNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupButtonTerminate (switchTerminate); optionSetPrevNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupKeyTerminate (switchTerminate); optionSetNextPanelButtonInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelButtonTerminate (switchTerminate); optionSetNextPanelKeyInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelKeyTerminate (switchTerminate); optionSetPrevPanelButtonInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelButtonTerminate (switchTerminate); optionSetPrevPanelKeyInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelKeyTerminate (switchTerminate); #undef SWITCHBIND ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } SwitchScreen::~SwitchScreen () { if (popupWindow) XDestroyWindow (screen->dpy (), popupWindow); } SwitchWindow::SwitchWindow (CompWindow *window) : BaseSwitchWindow (dynamic_cast (SwitchScreen::get (screen)), window), PluginClassHandler (window), sScreen (SwitchScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, false); CompositeWindowInterface::setHandler (cWindow, false); if (window->id () == sScreen->popupWindow) WindowInterface::setHandler (window, true); else WindowInterface::setHandler (window, false); if (sScreen->popupWindow && sScreen->popupWindow == window->id ()) gWindow->glPaintSetEnabled (this, true); } bool SwitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("compiztoolbox", COMPIZ_COMPIZTOOLBOX_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/switcher/src/switcher.h0000644000004100000410000001174213246301623017351 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author(s): * - David Reveman * - Auboyneau Vincent (size multiplier for A11Y) */ #include #include #include #include #include #include #include #include #include #include "switcher_options.h" #define ZOOMED_WINDOW_MASK (1 << 0) #define NORMAL_WINDOW_MASK (1 << 1) class SwitchScreen : public BaseSwitchScreen, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public SwitcherOptions { public: SwitchScreen (CompScreen *screen); ~SwitchScreen (); void setZoom (); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void updateWindowList (int count); void createWindowList (int count); void getMinimizedAndMatch (bool &minimizedOption, CompMatch *&match); bool getMipmap (); void switchToWindow (bool toNext); void handleSelectionChange (bool toNext, int nextIdx); int countWindows (); void handleEvent (XEvent *event); void initiate (SwitchWindowSelection selection, bool showPopup); void windowRemove (CompWindow *w); bool adjustVelocity (); Window lastActiveWindow; CompWindow *zoomedWindow; float zoom; bool switching; bool zooming; int zoomMask; GLfloat mVelocity; GLfloat tVelocity; GLfloat sVelocity; int pos; int move; float translate; float sTranslate; void setSizeMultiplier (); float sizeMultiplier; int modifiedWidth; int modifiedHeight; float _boxVertices[72]; }; class SwitchWindow : public BaseSwitchWindow, public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: SwitchWindow (CompWindow *window); bool managed () const; bool damageRect (bool initial, const CompRect &rect); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y); void updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon); void updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon); void updateIconPos (int &wx, int &wy, int x, int y, float width, float height); IconMode getIconMode (); SwitchScreen *sScreen; }; #define MwmHintsDecorations (1L << 1) typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; } MwmHints; extern const unsigned short WIDTH; extern const unsigned short HEIGHT; extern const unsigned short SPACE; extern const unsigned short BOX_WIDTH; #define WINDOW_WIDTH(count) (static_cast(WIDTH * sizeMultiplier) * (count) + (SPACE << 1)) #define WINDOW_HEIGHT (static_cast(HEIGHT * sizeMultiplier) + (SPACE << 1)) #define SWITCH_SCREEN(s) \ SwitchScreen *ss = SwitchScreen::get (s) #define SWITCH_WINDOW(w) \ SwitchWindow *sw = SwitchWindow::get (w) class SwitchPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/showrepaint/0000755000004100000410000000000013246301624015270 5ustar www-datawww-data./plugins/showrepaint/CMakeLists.txt0000644000004100000410000000016013246301623020024 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (showrepaint PLUGINDEPS composite opengl) ./plugins/showrepaint/src/0000755000004100000410000000000013246301624016057 5ustar www-datawww-data./plugins/showrepaint/src/showrepaint.h0000644000004100000410000000352413246301623020576 0ustar www-datawww-data/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "showrepaint_options.h" class ShowrepaintScreen : public GLScreenInterface, public PluginClassHandler , public ShowrepaintOptions { public: ShowrepaintScreen (CompScreen *); ~ShowrepaintScreen (); private: bool active; CompRegion tmpRegion; // GLScreenInterface method bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); CompositeScreen *cScreen; GLScreen *gScreen; }; class ShowrepaintPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/showrepaint/src/showrepaint.cpp0000644000004100000410000000777113246301623021141 0ustar www-datawww-data/* * * Compiz show repainted regions plugin * * showrepainted.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "showrepaint.h" COMPIZ_PLUGIN_20090315 (showrepaint, ShowrepaintPluginVTable); bool ShowrepaintScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; GLMatrix sTransform; // initially identity matrix unsigned short color[4]; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); tmpRegion = region.intersected (*output); if (tmpRegion.isEmpty ()) return status; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); color[3] = optionGetIntensity () * 0xffff / 100; color[0] = (rand () & 7) * color[3] / 8; color[1] = (rand () & 7) * color[3] / 8; color[2] = (rand () & 7) * color[3] / 8; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); std::vector vertices; /* for each rectangle, use two triangles to display it */ foreach (const CompRect &box, tmpRegion.rects ()) { //first triangle vertices.push_back (box.x1 ()); vertices.push_back (box.y1 ()); vertices.push_back (0.0f); vertices.push_back (box.x1 ()); vertices.push_back (box.y2 ()); vertices.push_back (0.0f); vertices.push_back (box.x2 ()); vertices.push_back (box.y2 ()); vertices.push_back (0.0f); //second triangle vertices.push_back (box.x2 ()); vertices.push_back (box.y2 ()); vertices.push_back (0.0f); vertices.push_back (box.x2 ()); vertices.push_back (box.y1 ()); vertices.push_back (0.0f); vertices.push_back (box.x1 ()); vertices.push_back (box.y1 ()); vertices.push_back (0.0f); } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); stream->begin (GL_TRIANGLES); stream->color4f ((float)color[0] / 65535.0f, (float)color[1] / 65535.0f, (float)color[2] / 65535.0f, (float)color[3] / 65535.0f); stream->addVertices (vertices.size () / 3, &vertices[0]); if (stream->end ()) stream->render (sTransform); stream->colorDefault (); /* only disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); return status; } bool ShowrepaintScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { active = !active; gScreen->glPaintOutputSetEnabled (this, active); if (!active) { // Turning off show-repaint mode, so request the screen to be repainted cScreen->damageScreen (); } return true; } ShowrepaintScreen::ShowrepaintScreen (CompScreen *screen) : PluginClassHandler (screen), ShowrepaintOptions (), active (false), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)) { GLScreenInterface::setHandler (gScreen, false); optionSetToggleKeyInitiate (boost::bind (&ShowrepaintScreen::toggle, \ this, _1, _2, _3)); } ShowrepaintScreen::~ShowrepaintScreen () { // Request the screen to be repainted on exit cScreen->damageScreen (); } bool ShowrepaintPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/showrepaint/showrepaint.xml.in0000644000004100000410000000127313246301623020764 0ustar www-datawww-data <_short>Show Repaint <_long>Show repainted regions in different colors Utility opengl ./plugins/trip/0000755000004100000410000000000013246301624013703 5ustar www-datawww-data./plugins/trip/CMakeLists.txt0000644000004100000410000000015113246301623016437 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (trip PLUGINDEPS composite opengl) ./plugins/trip/src/0000755000004100000410000000000013246301624014472 5ustar www-datawww-data./plugins/trip/src/trip.h0000644000004100000410000000673213246301623015630 0ustar www-datawww-data/* * * Compiz trip plugin * * trip.h * * Copyright : (C) 2010 by Scott Moreau * E-mail : oreaus@gmail.com * * Based off the mag plugin by : * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "trip_options.h" #define TRIP_SCREEN(s) \ TripScreen *ts = TripScreen::get (s) class Ripple; class TripScreen : public PluginClassHandler , public TripOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: TripScreen (CompScreen *screen); ~TripScreen (); CompositeScreen *cScreen; GLScreen *gScreen; std::vector ripples; GLuint texture; GLenum target; GLuint program; bool quiet; unsigned int intensity; bool checkStateTimeout (); void preparePaint (int ms); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); void cleanup (); bool loadFragmentProgram (); void optionChanged (CompOption *opt, Options num); void positionUpdate (const CompPoint &pos); int adjustZoom (float chunk, Ripple &r); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool takeHit (CompAction *action, CompAction::State state, CompOption::Vector options); bool untensify (CompAction *action, CompAction::State state, CompOption::Vector options); bool intensify (CompAction *action, CompAction::State state, CompOption::Vector options); bool soberUp (CompAction *action, CompAction::State state, CompOption::Vector options); void populateRippleSet (); }; class Ripple { public: Ripple (); ~Ripple (); TripScreen *dScreen; int radius; int rMod; CompPoint coord; int duration; int timer; int width; int height; GLfloat zVelocity; GLfloat zTarget; GLfloat zoom; bool adjust; CompRect damageRect; void paint (); void spawnRandom (); }; class TripPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; static const char *rippleFpString = "!!ARBfp1.0" "PARAM p0 = program.env[0];" "PARAM p1 = program.env[1];" "PARAM p2 = program.env[2];" "TEMP t0, t1, t2, t3;" "SUB t1, p0.xyww, fragment.texcoord[0];" "DP3 t2, t1, t1;" "RSQ t2, t2.x;" "SUB t0, t2, p0;" "RCP t3, t2.x;" "MAD t3, t3, p1.z, p2.z;" "COS t3, t3.x;" "MUL t3, t3, p1.w;" "MUL t1, t2, t1;" "MAD t1, t1, t3, fragment.texcoord[0];" "CMP t1, t0.z, fragment.texcoord[0], t1;" "MAD t1, t1, p1, p2;" "TEX result.color, t1, texture[0], %s;" "END"; ./plugins/trip/src/trip.cpp0000644000004100000410000003162513246301623016162 0ustar www-datawww-data/* * * Compiz trip plugin * * trip.cpp * * Copyright : (C) 2010 by Scott Moreau * E-mail : oreaus@gmail.com * * Based off the mag plugin by : * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "trip.h" COMPIZ_PLUGIN_20090315 (trip, TripPluginVTable); void TripScreen::cleanup () { if (program) { GL::deletePrograms (1, &program); program = 0; } } bool TripScreen::loadFragmentProgram () { char buffer[1024]; GLsizei bufSize; GLint errorPos; if (!GL::fragmentProgram) return false; if (target == GL_TEXTURE_2D) sprintf (buffer, rippleFpString, "2D"); else sprintf (buffer, rippleFpString, "RECT"); /* clear errors */ glGetError (); if (!program) GL::genPrograms (1, &program); bufSize = (GLsizei) strlen (buffer); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, program); GL::programString (GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, bufSize, buffer); glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos); if (glGetError () != GL_NO_ERROR || errorPos != -1) { compLogMessage ("trip", CompLogLevelError, "failed to load fragment program"); GL::deletePrograms (1, &program); program = 0; return false; } GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, 0); return true; } void TripScreen::optionChanged (CompOption *opt, Options num) { cleanup (); loadFragmentProgram (); quiet = true; cScreen->damageScreen (); } int TripScreen::adjustZoom (float chunk, Ripple &r) { float dx, adjust, amount; float change; dx = r.zTarget - r.zoom; adjust = dx * 0.15f; amount = fabs(dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; r.zVelocity = (amount * r.zVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.002f && fabs (r.zVelocity) < 0.004f) { r.zVelocity = 0.0f; r.zoom = r.zTarget; return false; } change = r.zVelocity * chunk; if (!change) { if (r.zVelocity) change = (dx > 0) ? 0.01 : -0.01; } r.zoom += change; return true; } void TripScreen::preparePaint (int time) { /* Be careful not to allow too much intensity. * Otherwise, we might have a bad trip ;-) */ if (intensity > 70) intensity = 70; for (unsigned int i = 0; i < ripples.size (); i++) { int steps; float amount, chunk; amount = time * 0.35f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { ripples.at (i).adjust = adjustZoom (chunk, ripples.at (i)); if (ripples.at (i).adjust) break; } TRIP_SCREEN (screen); /* Compute a 0.0 - 1.0 representation of the animation timeline */ float progress = (float) (ripples.at (i).duration - ripples.at (i).timer) / (float) ripples.at (i).duration; if (progress <= 0.5f) { ripples.at (i).timer -= (ts->quiet ? (time * 2) : (time / 4)); ripples.at (i).zTarget = (MIN (10.0, (progress * 2) * 10.0)) + 1.0; } else { ripples.at (i).timer -= (ts->quiet ? (time * 3) : (time / 5)); ripples.at (i).zTarget = (MIN (10.0, (2.0 - (progress * 2)) * 10.0)) + 1.0; } if (ts->quiet) { intensity *= 0.8; if (ripples.at (i).timer > 8000) ripples.at (i).timer *= 0.8; } ripples.at (i).zTarget *= (intensity * 0.01); ripples.at (i).radius += ripples.at (i).rMod; } cScreen->preparePaint (time); cScreen->damageScreen (); } void TripScreen::donePaint () { glEnable (target); glBindTexture (target, texture); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glBindTexture (target, 0); glDisable (target); for (unsigned int i = 0; i < ripples.size (); i++) { ripples.at (i).width = 0; ripples.at (i).height = 0; if (ripples.at (i).zoom <= 1.0) { if (!quiet) ripples.at (i). spawnRandom (); else ripples.erase (ripples.begin () + i); } } if (ripples.empty ()) { ripples.clear (); cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } cScreen->damageScreen (); cScreen->donePaint (); } void Ripple::paint () { TRIP_SCREEN (screen); float pw, ph; float fZoom, base; int x1, x2, y1, y2; float vc[4]; int size; width = height = 0; base = 0.5 + (0.0015 * radius); fZoom = (zoom * base) + 1.0 - base; size = radius + 1; x1 = MAX (0.0, coord.x () - size); x2 = MIN (screen->width (), coord.x () + size); y1 = MAX (0.0, coord.y () - size); y2 = MIN (screen->height (), coord.y () + size); glEnable (ts->target); glBindTexture (ts->target, ts->texture); if (width != 2 * size || height != 2 * size) { glCopyTexImage2D(ts->target, 0, GL_RGB, x1, screen->height () - y2, size * 2, size * 2, 0); width = height = 2 * size; } else glCopyTexSubImage2D (ts->target, 0, 0, 0, x1, screen->height () - y2, x2 - x1, y2 - y1); if (ts->target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glColor4usv (defaultColor); glEnable (GL_FRAGMENT_PROGRAM_ARB); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, ts->program); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 0, coord.x (), screen->height () - coord.y (), 1.0 / radius, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 1, pw, ph, M_PI / radius, (fZoom - 1.0) * fZoom); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 2, -x1 * pw, -(screen->height () - y2) * ph, -M_PI / 2.0, 0.0); x1 = MAX (0.0, coord.x () - radius); x2 = MIN (screen->width (), coord.x () + radius); y1 = MAX (0.0, coord.y () - radius); y2 = MIN (screen->height (), coord.y () + radius); vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; y1 = screen->height () - y1; y2 = screen->height () - y2; glBegin (GL_QUADS); glTexCoord2f (x1, y1); glVertex2f (vc[0], vc[2]); glTexCoord2f (x1, y2); glVertex2f (vc[0], vc[3]); glTexCoord2f (x2, y2); glVertex2f (vc[1], vc[3]); glTexCoord2f (x2, y1); glVertex2f (vc[1], vc[2]); glEnd (); glDisable (GL_FRAGMENT_PROGRAM_ARB); glColor4usv (defaultColor); glPopMatrix(); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glBindTexture (ts->target, 0); glDisable (ts->target); } bool TripScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (ripples.empty ()) return status; /* Temporarily set the viewport to fullscreen */ glViewport (0, 0, screen->width (), screen->height ()); for (unsigned int i = 0; i < ripples.size (); i++) ripples.at (i).paint (); gScreen->setDefaultViewport (); return status; } void Ripple::spawnRandom () { TRIP_SCREEN (screen); ts->cleanup (); ts->loadFragmentProgram (); radius = MAX (100, (rand () % ts->optionGetMaxRadius ())); zoom = 1.0f; rMod = (rand () % 3); coord.setX (rand () % screen->width ()); coord.setY (rand () % screen->height ()); width = 0; height = 0; int x, y, w, h; x = MAX (0.0, coord.x () - radius); y = MAX (0.0, coord.y () - radius); w = MIN (screen->width (), coord.x () + radius) - x; h = MIN (screen->height (), coord.y () + radius) - y; damageRect.setGeometry (x, y, w, h); zTarget = MAX (1.0, MIN (10.0, (rand () % 10))); duration = MAX(3000, (rand () % (ts->optionGetMaxDuration () * 1000))); timer = duration; adjust = true; } void TripScreen::populateRippleSet () { ripples.clear (); intensity = 30; for (int i = 0; i < optionGetMaxRipples (); i++) { ripples.push_back (Ripple ()); ripples.at (i). spawnRandom (); } } bool TripScreen::takeHit (CompAction *action, CompAction::State state, CompOption::Vector options) { intensity += 5; if (quiet) populateRippleSet (); quiet = false; /* Trip mode starting */ cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool TripScreen::untensify (CompAction *action, CompAction::State state, CompOption::Vector options) { intensity -= 5; if (intensity < 15) quiet = true; return true; } bool TripScreen::intensify (CompAction *action, CompAction::State state, CompOption::Vector options) { intensity += 2; cScreen->damageScreen (); if (quiet) populateRippleSet (); quiet = false; /* Trip mode starting */ cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool TripScreen::soberUp (CompAction *action, CompAction::State state, CompOption::Vector options) { /* Time to end ripples quickly */ quiet = true; intensity -= 5; cScreen->damageScreen (); return true; } TripScreen::TripScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), program (0), quiet (false), intensity (25) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); glGenTextures (1, &texture); if (GL::textureNonPowerOfTwo) target = GL_TEXTURE_2D; else target = GL_TEXTURE_RECTANGLE_ARB; glEnable (target); /* Bind the texture */ glBindTexture (target, texture); /* Load the parameters */ glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glBindTexture (target, 0); glDisable (target); optionSetMaxRadiusNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetMaxRipplesNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetMaxDurationNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetZoomFactorNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetSpeedNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetTimestepNotify (boost::bind (&TripScreen::optionChanged, this, _1, _2)); optionSetTakeHitInitiate (boost::bind (&TripScreen::takeHit, this, _1, _2, _3)); optionSetDecreaseIntensityInitiate (boost::bind (&TripScreen::untensify, this, _1, _2, _3)); optionSetIncreaseIntensityInitiate (boost::bind (&TripScreen::intensify, this, _1, _2, _3)); optionSetSoberKeyInitiate (boost::bind (&TripScreen::soberUp, this, _1, _2, _3)); optionSetSoberButtonInitiate (boost::bind (&TripScreen::soberUp, this, _1, _2, _3)); populateRippleSet (); if (!GL::fragmentProgram || !loadFragmentProgram ()) compLogMessage ("trip", CompLogLevelWarn, "GL_ARB_fragment_program not supported. " "This plugin will not work."); } TripScreen::~TripScreen () { cScreen->damageScreen (); glDeleteTextures (1, &target); ripples.clear (); } Ripple::Ripple () : dScreen (TripScreen::get (screen)) radius (0), rMod (0), duration (0), timer (0), width (0), height (0), adjust (false) { } Ripple::~Ripple () { } bool TripPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/trip/trip.xml.in0000644000004100000410000000575713246301623016025 0ustar www-datawww-data <_short>Trip <_long>Trips out desktops Effects composite opengl cube decor opengl <_short>Bindings <_short>General <_short>Effect Settings <_short>Internal Settings ./plugins/snap/0000755000004100000410000000000013246301624013666 5ustar www-datawww-data./plugins/snap/CMakeLists.txt0000644000004100000410000000011513246301623016422 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (snap) ./plugins/snap/snap.xml.in0000644000004100000410000000462613246301623015765 0ustar www-datawww-data <_short>Snapping Windows <_long>Enables windows edges resistance Window Management edgeresistance opengl composite decor <_short>Bindings <_short>Behaviour ./plugins/snap/src/0000755000004100000410000000000013246301624014455 5ustar www-datawww-data./plugins/snap/src/snap.h0000644000004100000410000001042313246301623015566 0ustar www-datawww-data/* * Compiz snap plugin * Author : Guillaume "iXce" Seguin * Email : ixce@beryl-project.org * * Ported to compiz by : Patrick "marex" Niklaus * Email : marex@beryl-project.org * * Ported to C++ by : Travis Watkins * Email : amaranth@ubuntu.com * * Copyright (C) 2009 Guillaume Seguin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "snap_options.h" /* * The window we should snap too if snapping to windows */ #define SNAP_WINDOW_TYPE (CompWindowTypeNormalMask | \ CompWindowTypeToolbarMask | \ CompWindowTypeMenuMask | \ CompWindowTypeUtilMask) #define VerticalSnap (1L << 0) #define HorizontalSnap (1L << 1) #define MoveGrab (1L << 0) #define ResizeGrab (1L << 1) typedef enum { LeftEdge = 0, RightEdge, TopEdge, BottomEdge } EdgeType; /* Custom Edge struct * Position, start, end meanings are specific to type : * - LeftEdge/RightEdge : position : x, start/end : y1/y2 * - TopEdge/BottomEdge : position : y, start/end : x1/x2 * id/passed are used during visibility detection when adding edges * snapped is straight forward */ typedef struct { int position; int start; int end; EdgeType type; bool screenEdge; Window id; bool passed; bool snapped; } Edge; class SnapScreen : public ScreenInterface, public PluginClassHandler , public SnapOptions { public: bool snapping; SnapScreen (CompScreen *s); void handleEvent (XEvent *event); bool enableSnapping (CompAction *action, CompAction::State state, CompOption::Vector &options); bool disableSnapping (CompAction *action, CompAction::State state, CompOption::Vector &options); void optionChanged (CompOption *opt, SnapOptions::Options num); private: // used to allow moving windows without snapping int avoidSnapMask; }; class SnapWindow : public WindowInterface, public PluginClassHandler { public: SnapWindow (CompWindow *window); ~SnapWindow (); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); void grabNotify (int x, int y, unsigned int state, unsigned int mask); void stateChangeNotify (unsigned int lastState); void ungrabNotify (); private: CompWindow *window; // linked lists std::list edges; // bitfield int snapDirection; // dx/dy/dw/dh when a window is resisting to user int m_dx; int m_dy; int m_dwidth; int m_dheight; // internals CompWindow::Geometry snapGeometry; int grabbed; // internal, avoids infinite notify loops bool skipNotify; void move (int dx, int dy, bool sync); void resize (int dx, int dy, int dwidth, int dheight); void addEdge (Window id, int position, int start, int end, EdgeType type, bool screenEdge); void addRegionEdges (Edge *parent, CompRegion region); void updateWindowsEdges (); void updateScreenEdges (); void updateEdges (); void moveCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection); void moveCheckEdges (int snapDirection); void resizeCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection); void resizeCheckEdges (int dx, int dy, int dwidth, int dheight); }; #define SNAP_SCREEN(s) \ SnapScreen *ss = SnapScreen::get (s) #define SNAP_WINDOW(w) \ SnapWindow *sw = SnapWindow::get (w) class SnapPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/snap/src/snap.cpp0000644000004100000410000004571113246301623016131 0ustar www-datawww-data/* * Compiz snap plugin * Author : Guillaume "iXce" Seguin * Email : ixce@beryl-project.org * * Ported to compiz by : Patrick "marex" Niklaus * Email : marex@beryl-project.org * * Ported to C++ by : Travis Watkins * Email : amaranth@ubuntu.com * * Copyright (C) 2009 Guillaume Seguin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * TODO * - Apply Edge Resistance to resize */ #include #include #include #include "snap.h" COMPIZ_PLUGIN_20090315 (snap, SnapPluginVTable); // helper functions /* * Wrapper functions to avoid infinite notify loops */ void SnapWindow::move (int dx, int dy, bool sync) { skipNotify = true; window->move (dx, dy, true); /* warp the pointer in the case of * snap release */ skipNotify = false; } void SnapWindow::resize (int dx, int dy, int dwidth, int dheight) { const CompWindow::Geometry &geometry = window->serverGeometry (); skipNotify = true; window->resize (geometry.x () + dx, geometry.y () + dy, geometry.width () + dwidth, geometry.height () + dheight, geometry.border ()); skipNotify = false; } void SnapWindow::addEdge (Window id, int position, int start, int end, EdgeType type, bool screenEdge) { Edge edge; edge.position = position; edge.start = start; edge.end = end; edge.type = type; edge.screenEdge = screenEdge; edge.snapped = false; edge.passed = false; edge.id = id; edges.push_back (edge); } /* * Add an edge for each rectangle of the region */ void SnapWindow::addRegionEdges (Edge *parent, CompRegion region) { int position, start, end; foreach (const CompRect &r, region.rects ()) { switch (parent->type) { case LeftEdge: case RightEdge: position = r.x1 (); start = r.y1 (); end = r.y2 (); break; case TopEdge: case BottomEdge: default: position = r.y1 (); start = r.x1 (); end = r.x2 (); } addEdge (parent->id, position, start, end, parent->type, parent->screenEdge); edges.back ().passed = parent->passed; } } /* Checks if a window is considered a snap window. If it's * not visible, returns false. If it's a panel and we're * snapping to screen edges, it's considered a snap-window. */ #define UNLIKELY(x) __builtin_expect(!!(x),0) static inline bool isSnapWindow (CompWindow *w) { SNAP_SCREEN (screen); if (UNLIKELY(!w)) return false; if (!w->isViewable ()) return false; if ((w->type () & SNAP_WINDOW_TYPE) && (ss->optionGetEdgesCategoriesMask () & EdgesCategoriesWindowEdgesMask)) return true; if (w->struts () && (ss->optionGetEdgesCategoriesMask () & EdgesCategoriesScreenEdgesMask)) return true; return false; } // Edges update functions ------------------------------------------------------ /* * Detect visible windows edges */ void SnapWindow::updateWindowsEdges () { CompRegion edgeRegion, resultRegion; CompRect input; bool remove = false; // First add all the windows foreach (CompWindow *w, screen->windows ()) { // Just check that we're not trying to snap to current window, // that the window is not invisible and of a valid type if (w == window || !isSnapWindow (w)) { continue; } input = w->serverBorderRect (); addEdge (w->id (), input.top (), input.left (), input.right (), TopEdge, false); addEdge (w->id (), input.bottom (), input.left (), input.right (), BottomEdge, false); addEdge (w->id (), input.left (), input.top (), input.bottom (), LeftEdge, false); addEdge (w->id (), input.right (), input.top (), input.bottom (), RightEdge, false); } // Now strip invisible edges // Loop through all the windows stack, and through all the edges // If an edge has been passed, check if it's in the region window, // if the edge is fully under the window, drop it, or if it's only // partly covered, cut it/split it in one/two smaller visible edges foreach (CompWindow *w, screen->windows ()) { if (w == window || !isSnapWindow (w)) continue; // can't use foreach here because we need the iterator for erase() for (std::list::iterator it = edges.begin (); it != edges.end (); ) { Edge *e = &*it; CompRect rect; if (!e->passed) { if (e->id == w->id ()) e->passed = true; ++it; continue; } switch (e->type) { case LeftEdge: case RightEdge: rect.setGeometry (e->position, e->start, 1, e->end - e->start); break; case TopEdge: case BottomEdge: default: rect.setGeometry (e->start, e->position, e->end - e->start, 1); } // If the edge is in the window region, remove it, // if it's partly in the region, split it edgeRegion = CompRegion (rect); resultRegion = edgeRegion - w->region (); if (resultRegion.isEmpty ()) { remove = true; } else if (edgeRegion != resultRegion) { addRegionEdges (e, resultRegion); remove = true; } if (remove) { it = edges.erase (it); remove = false; } else { ++it; } } } } /* * Loop on outputDevs and add the extents as edges * Note that left side is a right edge, right side a left edge, * top side a bottom edge and bottom side a top edge, * since they will be snapped as the right/left/bottom/top edge of a window */ void SnapWindow::updateScreenEdges () { CompRegion edgeRegion, resultRegion; bool remove = false; foreach (CompOutput output, screen->outputDevs ()) { const CompRect& area = output.workArea (); addEdge (0, area.top (), area.left (), area.right () - 1, BottomEdge, true); addEdge (0, area.bottom (), area.left (), area.right () - 1, TopEdge, true); addEdge (0, area.left (), area.top (), area.bottom () - 1, RightEdge, true); addEdge (0, area.right (), area.top (), area.bottom () - 1, LeftEdge, true); } // Drop screen edges parts that are under struts, basically apply the // same strategy than for windows edges visibility foreach (CompWindow *w, screen->windows ()) { if (w == window || !w->struts ()) continue; for (std::list::iterator it = edges.begin (); it != edges.end ();) { Edge *e = &*it; CompRect rect; if (!e->screenEdge) { ++it; continue; } switch (e->type) { case LeftEdge: case RightEdge: rect.setGeometry (e->position, e->start, 1, e->end - e->start); break; case TopEdge: case BottomEdge: default: rect.setGeometry (e->start, e->position, e->end - e->start, 1); } edgeRegion = CompRegion (rect); resultRegion = edgeRegion - w->region (); if (resultRegion.isEmpty ()) { remove = true; } else if (edgeRegion != resultRegion) { addRegionEdges (e, resultRegion); remove = true; } if (remove) { it = edges.erase (it); remove = false; } else { ++it; } } } } /* * Clean edges and fill it again with appropriate edges */ void SnapWindow::updateEdges () { SNAP_SCREEN (screen); edges.clear (); updateWindowsEdges (); if (ss->optionGetEdgesCategoriesMask () & EdgesCategoriesScreenEdgesMask) updateScreenEdges (); } // Edges checking functions (move) --------------------------------------------- /* * Find nearest edge in the direction set by "type", * w is the grabbed window, position/start/end are the window edges coordinates * before : if true the window has to be before the edge (top/left being origin) * snapDirection : just an helper, related to type */ void SnapWindow::moveCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection) { SNAP_SCREEN (screen); Edge *edge = &edges.front (); int dist, min = 65535; foreach (Edge ¤t, edges) { // Skip wrong type or outbound edges if (current.type != type || current.end < start || current.start > end) continue; // Compute distance dist = before ? position - current.position : current.position - position; // Update minimum distance if needed if (dist < min && dist >= 0) { min = dist; edge = ¤t; } // 0-dist edge, just break if (dist == 0) break; // Unsnap edges that aren't snapped anymore if (current.snapped && dist > ss->optionGetResistanceDistance ()) current.snapped = false; } // We found a 0-dist edge, or we have a snapping candidate if (min == 0 || (min <= ss->optionGetAttractionDistance () && ss->optionGetSnapTypeMask () & SnapTypeEdgeAttractionMask)) { // Update snapping data if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask) { snapGeometry = window->serverGeometry (); this->snapDirection |= snapDirection; } // Attract the window if needed, moving it of the correct dist if (min != 0 && !edge->snapped) { edge->snapped = true; switch (type) { case LeftEdge: move (min, 0, false); break; case RightEdge: move (-min, 0, false); break; case TopEdge: move (0, min, false); break; case BottomEdge: move (0, -min, false); break; default: break; } } } } /* * Call the previous function for each of the 4 sides of the window */ void SnapWindow::moveCheckEdges (int snapDirection) { CompRect input (window->serverBorderRect ()); moveCheckNearestEdge (input.left (), input.top (), input.bottom (), true, RightEdge, HorizontalSnap & snapDirection); moveCheckNearestEdge (input.right (), input.top (), input.bottom (), false, LeftEdge, HorizontalSnap & snapDirection); moveCheckNearestEdge (input.top (), input.left (), input.right (), true, BottomEdge, VerticalSnap & snapDirection); moveCheckNearestEdge (input.bottom (), input.left (), input.right (), false, TopEdge, VerticalSnap & snapDirection); } // Edges checking functions (resize) ------------------------------------------- /* * Similar function for Snap on Resize */ void SnapWindow::resizeCheckNearestEdge (int position, int start, int end, bool before, EdgeType type, int snapDirection) { SNAP_SCREEN (screen); Edge *edge = &edges.front (); int dist, min = 65535; foreach (Edge ¤t, edges) { // Skip wrong type or outbound edges if (current.type != type || current.end < start || current.start > end) continue; // Compute distance dist = before ? position - current.position : current.position - position; // Update minimum distance if needed if (dist < min && dist >= 0) { min = dist; edge = ¤t; } // 0-dist edge, just break if (dist == 0) break; // Unsnap edges that aren't snapped anymore if (current.snapped && dist > ss->optionGetResistanceDistance ()) current.snapped = false; } // We found a 0-dist edge, or we have a snapping candidate if (min == 0 || (min <= ss->optionGetAttractionDistance () && ss->optionGetSnapTypeMask () & SnapTypeEdgeAttractionMask)) { // Update snapping data if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask) { snapGeometry = window->serverGeometry (); this->snapDirection |= snapDirection; } // FIXME : this needs resize-specific code. // Attract the window if needed, moving it of the correct dist if (min != 0 && !edge->snapped) { edge->snapped = true; switch (type) { case LeftEdge: resize (min, 0, 0, 0); break; case RightEdge: resize (-min, 0, 0, 0); break; case TopEdge: resize (0, min, 0, 0); break; case BottomEdge: resize (0, -min, 0, 0); break; default: break; } } } } /* * Call the previous function for each of the 4 sides of the window */ void SnapWindow::resizeCheckEdges (int dx, int dy, int dwidth, int dheight) { CompRect input (window->serverBorderRect ()); resizeCheckNearestEdge (input.left (), input.top (), input.bottom (), true, RightEdge, HorizontalSnap); resizeCheckNearestEdge (input.right (), input.top (), input.bottom (), false, LeftEdge, HorizontalSnap); resizeCheckNearestEdge (input.top (), input.left (), input.right (), true, BottomEdge, VerticalSnap); resizeCheckNearestEdge (input.bottom (), input.left (), input.right (), false, TopEdge, VerticalSnap); } // Check if avoidSnap is matched, and enable/disable snap consequently void SnapScreen::handleEvent (XEvent *event) { if (event->type == screen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; unsigned int mods = 0xffffffff; if (avoidSnapMask) mods = avoidSnapMask; if ((stateEvent->mods & mods) == mods) snapping = false; else snapping = true; } } screen->handleEvent (event); } // Events notifications -------------------------------------------------------- void SnapWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { SNAP_SCREEN (screen); window->resizeNotify (dx, dy, dwidth, dheight); // avoid-infinite-notify-loop mode/not grabbed if (skipNotify || !(grabbed & ResizeGrab)) return; // we have to avoid snapping but there's still some buffered moving if (!ss->snapping && (m_dx || m_dy || m_dwidth || m_dheight)) { resize (m_dx, m_dy, m_dwidth, m_dheight); m_dx = m_dy = m_dwidth = m_dheight = 0; return; } // avoiding snap, nothing buffered if (!ss->snapping) return; // If we don't already snap vertically and horizontally, // check edges status if (snapDirection != (VerticalSnap | HorizontalSnap)) resizeCheckEdges (dx, dy, dwidth, dheight); } void SnapWindow::stateChangeNotify (unsigned int lastState) { if (window->state () & CompWindowStateMaximizedHorzMask) { snapGeometry.setWidth (0); snapGeometry.setX (0); snapDirection &= VerticalSnap; } if (window->state () & CompWindowStateMaximizedVertMask) { snapGeometry.setHeight (0); snapGeometry.setY (0); snapDirection &= HorizontalSnap; } window->stateChangeNotify (lastState); } void SnapWindow::moveNotify (int dx, int dy, bool immediate) { unsigned int allowedSnapDirection = VerticalSnap | HorizontalSnap; SNAP_SCREEN (screen); window->moveNotify (dx, dy, immediate); // avoid-infinite-notify-loop mode/not grabbed if (skipNotify || !(grabbed & MoveGrab)) return; // we have to avoid snapping but there's still some buffered moving if (!ss->snapping && (m_dx || m_dy)) { move (m_dx, m_dy, false); m_dx = m_dy = 0; return; } dx = window->serverGeometry ().x () - snapGeometry.x (); dy = window->serverGeometry ().y () - snapGeometry.y (); // don't snap maximized windows if (window->state () & CompWindowStateMaximizedHorzMask) { allowedSnapDirection &= ~(VerticalSnap); dx = 0; } if (window->state () & CompWindowStateMaximizedVertMask) { allowedSnapDirection &= ~(HorizontalSnap); dy = 0; } // avoiding snap, nothing buffered if (!ss->snapping) return; // apply edge resistance if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask) { // If there's horizontal snapping, add dx to current buffered // dx and resist (move by -dx) or release the window and move // by buffered dx - dx if (!snapGeometry.isEmpty () && snapDirection & HorizontalSnap) { m_dx += dx; if (m_dx < ss->optionGetResistanceDistance () && m_dx > -ss->optionGetResistanceDistance ()) { move (-dx, 0, false); } else { move (m_dx - dx, 0, true); m_dx = 0; snapDirection &= VerticalSnap; } } // Same for vertical snapping and dy if (!snapGeometry.isEmpty () && snapDirection & VerticalSnap) { m_dy += dy; if (m_dy < ss->optionGetResistanceDistance () && m_dy > -ss->optionGetResistanceDistance ()) { move (0, -dy, false); } else { move (0, m_dy - dy, true); m_dy = 0; snapDirection &= HorizontalSnap; } } // If we are no longer snapping in any direction, reset snapped if (!snapGeometry.isEmpty () && !snapDirection) snapGeometry = CompWindow::Geometry (); } // If we don't already snap vertically and horizontally, // check edges status if (snapDirection != (VerticalSnap | HorizontalSnap)) moveCheckEdges (allowedSnapDirection); } /* * Initiate snap, get edges */ void SnapWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { grabbed = (mask & CompWindowGrabResizeMask) ? ResizeGrab : MoveGrab; updateEdges (); window->grabNotify (x, y, state, mask); } /* * Clean edges data, reset dx/dy to avoid buggy moves * when snap will be triggered again. */ void SnapWindow::ungrabNotify () { edges.clear (); snapGeometry = CompWindow::Geometry (); snapDirection = 0; grabbed = 0; m_dx = m_dy = m_dwidth = m_dheight = 0; window->ungrabNotify (); } // Internal stuff -------------------------------------------------------------- void SnapScreen::optionChanged (CompOption *opt, SnapOptions::Options num) { switch (num) { case SnapOptions::AvoidSnap: { unsigned int mask = optionGetAvoidSnapMask (); avoidSnapMask = 0; if (mask & AvoidSnapShiftMask) avoidSnapMask |= ShiftMask; if (mask & AvoidSnapAltMask) avoidSnapMask |= CompAltMask; if (mask & AvoidSnapControlMask) avoidSnapMask |= ControlMask; if (mask & AvoidSnapMetaMask) avoidSnapMask |= CompMetaMask; } default: break; } } SnapScreen::SnapScreen (CompScreen *screen) : PluginClassHandler (screen), SnapOptions (), snapping (true), avoidSnapMask (0) { ScreenInterface::setHandler (screen); #define setNotify(func) \ optionSet##func##Notify (boost::bind (&SnapScreen::optionChanged, this, _1, _2)) setNotify (AvoidSnap); } SnapWindow::SnapWindow (CompWindow *window) : PluginClassHandler (window), window (window), snapDirection (0), m_dx (0), m_dy (0), m_dwidth (0), m_dheight (0), snapGeometry (0, 0, 0, 0, 0), grabbed (0), skipNotify (false) { WindowInterface::setHandler (window); } SnapWindow::~SnapWindow () { } bool SnapPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/opacify/0000755000004100000410000000000013246301623014356 5ustar www-datawww-data./plugins/opacify/CMakeLists.txt0000644000004100000410000000015413246301623017116 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (opacify PLUGINDEPS composite opengl) ./plugins/opacify/src/0000755000004100000410000000000013246301623015145 5ustar www-datawww-data./plugins/opacify/src/opacify.h0000644000004100000410000000530413246301623016752 0ustar www-datawww-data/** * Compiz Opacify * * opacify.h * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * Ported to Compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * Opacify increases opacity on targeted windows and reduces it on * blocking windows, making whatever window you are targeting easily * visible. * */ #include #include #include #include "opacify_options.h" /* Size of the Window array storing passive windows. */ extern const unsigned short MAX_WINDOWS; class OpacifyScreen : public PluginClassHandler , public OpacifyOptions, public ScreenInterface { public: OpacifyScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; bool isToggle; CompTimer timeoutHandle; CompWindow *newActive; Window active; std::vector passive; CompRegion intersect; unsigned short int passiveNum; bool justMoved; void handleEvent (XEvent *); void resetWindowOpacity (Window id); void resetScreenOpacity (); void clearPassive (); int passiveWindows (CompRegion fRegion); bool handleTimeout (); bool checkDelay (); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); void optionChanged (CompOption *option, OpacifyOptions::Options num); bool checkStateTimeout (); }; class OpacifyWindow : public PluginClassHandler , public GLWindowInterface { public: OpacifyWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool opacified; int opacity; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void setOpacity (int fOpacity); void dim (); void handleEnter (); }; class OpacifyPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/opacify/src/opacify.cpp0000644000004100000410000002421013246301623017302 0ustar www-datawww-data/** * Compiz Opacify * * opacify.cpp * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * Ported to Compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * Opacify increases opacity on targeted windows and reduces it on * blocking windows, making whatever window you are targeting easily * visible. * */ #include "opacify.h" COMPIZ_PLUGIN_20090315 (opacify, OpacifyPluginVTable); const unsigned short MAX_WINDOWS = 64; void setFunctions (bool enabled) { OpacifyScreen *os = OpacifyScreen::get (screen); screen->handleEventSetEnabled (os, os->isToggle); foreach (CompWindow *w, screen->windows ()) { OpacifyWindow *ow = OpacifyWindow::get (w); ow->gWindow->glPaintSetEnabled (ow, enabled); } } /* Core opacify functions. These do the real work. ---------------------*/ /* Sets the real opacity and damages the window if actual opacity and * requested opacity differs. */ void OpacifyWindow::setOpacity (int fOpacity) { if (!opacified || (gWindow->paintAttrib ().opacity != opacity)) cWindow->addDamage (); opacified = true; opacity = fOpacity; } /* Resets the Window to the original opacity if it still exists. */ void OpacifyScreen::resetWindowOpacity (Window id) { CompWindow *w = screen->findWindow (id); if (!w) return; OpacifyWindow *ow = OpacifyWindow::get (w); ow->opacified = false; ow->cWindow->addDamage (); } /* Resets all the windows on the screen to the original opacity * if necessary. Then reset active. */ void OpacifyScreen::resetScreenOpacity () { if (active) { clearPassive(); resetWindowOpacity(active); active = 0; } } /* Resets the opacity of windows on the passive list. */ void OpacifyScreen::clearPassive () { CompWindow *win; int activeOpacity = optionGetActiveOpacity (); GLushort targetOpacity = OPAQUE * activeOpacity / 100; foreach (Window xid, passive) { win = screen->findWindow (xid); if (!win) continue; OpacifyWindow *ow = OpacifyWindow::get (win); ow->setOpacity (std::max (targetOpacity, ow->gWindow->paintAttrib ().opacity)); resetWindowOpacity (xid); } passive.clear (); } /* Dim an (inactive) window. Place it on the passive list and * update passiveNum. Then change the opacity. */ void OpacifyWindow::dim () { OpacifyScreen *os = OpacifyScreen::get (screen); os->passive.push_back (window->id ()); setOpacity (MIN (OPAQUE * os->optionGetPassiveOpacity () / 100, gWindow->paintAttrib ().opacity)); } /* Walk through all windows, skip until we've passed the active * window, skip if it's invisible, hidden or minimized, skip if * it's not a window type we're looking for. * Dim it if it intersects. * * Returns number of changed windows. */ int OpacifyScreen::passiveWindows (CompRegion fRegion) { bool flag = false; int i = 0; /* Clear the list first to prevent memleaks */ clearPassive (); foreach (CompWindow *w, screen->windows ()) { if (w->id () == active) { flag = true; continue; } if (!flag || !optionGetWindowMatch ().evaluate (w) || !w->isViewable () || w->minimized ()) continue; intersect = w->region ().intersected (fRegion); if (!intersect.isEmpty ()) { OpacifyWindow::get (w)->dim (); ++i; } } return i; } /* Check if we switched active window, reset the old passive windows * if we did. If we have an active window and switched: reset that too. * If we have a window (w is true), update the active id and * passive list. justMoved is to make sure we recalculate opacity after * moving. We can't reset before moving because if we're using a delay * and the window being moved is not the active but overlapping, it will * be reset, which would conflict with move's opacity change. */ void OpacifyWindow::handleEnter () { OpacifyScreen *os = OpacifyScreen::get (screen); if (screen->otherGrabExist (NULL)) { if (!screen->otherGrabExist ("move", NULL)) { os->justMoved = true; return; } os->resetScreenOpacity (); return; } if (!window || os->active != window->id () || os->justMoved) { os->justMoved = false; os->resetWindowOpacity (os->active); os->active = 0; } if (!window) return; if (window->id () != os->active && !window->shaded () && os->optionGetWindowMatch ().evaluate (window)) { os->active = window->id (); int num = os->passiveWindows (window->region ()); if (num || os->optionGetOnlyIfBlock ()) setOpacity (MAX (OPAQUE * os->optionGetActiveOpacity () / 100, gWindow->paintAttrib ().opacity)); } } /* Timeout-time! Unset the timeout handler, make sure we're on the same * screen, handle the event. */ bool OpacifyScreen::handleTimeout () { if (newActive) OpacifyWindow::get (newActive)->handleEnter (); return false; } /* Checks whether we should delay or not. * Returns true if immediate execution. */ bool OpacifyScreen::checkDelay () { if (optionGetFocusInstant () && newActive && newActive->id () == screen->activeWindow ()) return true; if (!optionGetTimeout ()) return true; if (!newActive || newActive->id () == screen->root () || newActive->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; if (optionGetNoDelayChange () && !passive.empty ()) return true; return false; } bool OpacifyWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (opacified) { GLWindowPaintAttrib wAttrib = attrib; wAttrib.opacity = opacity; return gWindow->glPaint (wAttrib, transform, region, mask); } else return gWindow->glPaint (attrib, transform, region, mask); return false; } /* Takes the inital event. * If we were configured, recalculate the opacify-windows if * it was our window. * If a window was entered: call upon handle_timeout after od->timeout * micro seconds, or directly if od->timeout is 0 (no delay). * */ void OpacifyScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (!isToggle) return; switch (event->type) { case EnterNotify: Window id; id = event->xcrossing.window; newActive = screen->findTopLevelWindow (id); if (timeoutHandle.active ()) timeoutHandle.stop (); if (checkDelay ()) handleTimeout (); else timeoutHandle.start (); break; case FocusIn: resetScreenOpacity(); break; case ConfigureNotify: if (active != event->xconfigure.window) break; clearPassive (); if (active) { CompWindow *w = screen->findWindow (active); if (w) passiveWindows (w->region ()); } break; default: break; } } /* Toggle opacify on/off. We are in Display-context, make sure we handle all * screens. */ bool OpacifyScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { isToggle = !isToggle; if (!isToggle && optionGetToggleReset ()) resetScreenOpacity(); setFunctions (isToggle); return true; } /* Configuration, initialization, boring stuff. ----------------------- */ /** This is called when an option changes. The only option we are looking for * here is 'init_toggle' so when that changes, we adjust our internal values * appropriately */ void OpacifyScreen::optionChanged (CompOption *option, OpacifyOptions::Options num) { switch (num) { case OpacifyOptions::InitToggle: isToggle = option->value ().b (); setFunctions (isToggle); resetScreenOpacity(); break; case OpacifyOptions::Timeout: timeoutHandle.setTimes (optionGetTimeout (), optionGetTimeout () * 1.2); break; default: break; } } /** Constructor for OpacifyWindow. This is called whenever a new window * is created and we set our custom variables to it and also register to * paint this window */ OpacifyWindow::OpacifyWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), opacified (false), opacity (100) { GLWindowInterface::setHandler (gWindow, false); gWindow->glPaintSetEnabled (this, true); } /** Constructor for OpacifyScreen. This is called whenever a new screen * is created and we set our custom variables to it and also register to * handle X.org events when they come through */ OpacifyScreen::OpacifyScreen (CompScreen *screen) : PluginClassHandler (screen), isToggle (optionGetInitToggle ()), newActive (NULL), active (screen->activeWindow ()), intersect (CompRegion::empty ()), justMoved (false) { ScreenInterface::setHandler (screen, false); timeoutHandle.setTimes (optionGetTimeout (), optionGetTimeout () * 1.2); timeoutHandle.setCallback (boost::bind (&OpacifyScreen::handleTimeout, this)); optionSetToggleKeyInitiate (boost::bind (&OpacifyScreen::toggle, this, _1, _2, _3)); optionSetInitToggleNotify (boost::bind (&OpacifyScreen::optionChanged, this, _1, _2)); optionSetTimeoutNotify (boost::bind (&OpacifyScreen::optionChanged, this, _1, _2)); setFunctions (isToggle); } bool OpacifyPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/opacify/opacify.xml.in0000644000004100000410000001014013246301623017133 0ustar www-datawww-data <_short>Opacify <_long>Make windows easily visible by hovering the mouse over them Accessibility opengl composite opengl fade decor <_short>Bindings <_short>Misc. Options <_short>Misc. Options <_short>Opacity Levels ./plugins/gnomecompat/0000755000004100000410000000000013246301624015236 5ustar www-datawww-data./plugins/gnomecompat/CMakeLists.txt0000644000004100000410000000015613246301623017777 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(gnomecompat PLUGINDEPS composite opengl)./plugins/gnomecompat/gnomecompat.xml.in0000644000004100000410000000417113246301623020700 0ustar www-datawww-data <_short>Gnome Compatibility <_long>Options that keep Compiz compatible to the Gnome desktop environment General wmkeybindings composite opengl decor unityshell <_short>Commands <_short>Run terminal command ./plugins/gnomecompat/src/0000755000004100000410000000000013246301624016025 5ustar www-datawww-data./plugins/gnomecompat/src/gnomecompat.h0000644000004100000410000000350013246301623020504 0ustar www-datawww-data/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include #include #include "gnomecompat_options.h" class GnomeCompatScreen : public PluginClassHandler, public GnomecompatOptions { public: GnomeCompatScreen (CompScreen *s); void panelAction (CompOption::Vector& options, Atom action); Atom panelActionAtom; Atom panelMainMenuAtom; Atom panelRunDialogAtom; }; #define GNOME_SCREEN(s) \ GnomeCompatScreen *gs = GnomeCompatScreen::get (s) class GnomeCompatPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/gnomecompat/src/gnomecompat.cpp0000644000004100000410000001005413246301623021041 0ustar www-datawww-data/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "gnomecompat.h" COMPIZ_PLUGIN_20090315 (gnomecompat, GnomeCompatPluginVTable); static bool runCommand (CompAction *action, CompAction::State state, CompOption::Vector& options, CompOption *commandOption) { Window xid; xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return false; screen->runCommand (commandOption->value ().s ()); return true; } void GnomeCompatScreen::panelAction (CompOption::Vector& options, Atom actionAtom) { Window xid; XEvent event; Time time; xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return; time = CompOption::getIntOptionNamed (options, "time", CurrentTime); /* we need to ungrab the keyboard here, otherwise the panel main menu won't popup as it wants to grab the keyboard itself */ XUngrabKeyboard (screen->dpy (), time); event.type = ClientMessage; event.xclient.window = screen->root (); event.xclient.message_type = panelActionAtom; event.xclient.format = 32; event.xclient.data.l[0] = actionAtom; event.xclient.data.l[1] = time; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), screen->root (), false, StructureNotifyMask, &event); } static bool showMainMenu (CompAction *action, CompAction::State state, CompOption::Vector& options) { GNOME_SCREEN (screen); gs->panelAction (options, gs->panelMainMenuAtom); return true; } static bool showRunDialog (CompAction *action, CompAction::State state, CompOption::Vector& options) { GNOME_SCREEN (screen); gs->panelAction (options, gs->panelRunDialogAtom); return true; } GnomeCompatScreen::GnomeCompatScreen (CompScreen *s) : PluginClassHandler (s) { panelActionAtom = XInternAtom (screen->dpy (), "_GNOME_PANEL_ACTION", false); panelMainMenuAtom = XInternAtom (screen->dpy (), "_GNOME_PANEL_ACTION_MAIN_MENU", false); panelRunDialogAtom = XInternAtom (screen->dpy (), "_GNOME_PANEL_ACTION_RUN_DIALOG", false); #define COMMAND_BIND(opt) \ boost::bind (runCommand, _1, _2, _3, &mOptions[opt]) optionSetMainMenuKeyInitiate (showMainMenu); optionSetRunKeyInitiate (showRunDialog); optionSetRunCommandScreenshotKeyInitiate (COMMAND_BIND (GnomecompatOptions::CommandScreenshot)); optionSetRunCommandWindowScreenshotKeyInitiate (COMMAND_BIND (GnomecompatOptions::CommandWindowScreenshot)); optionSetRunCommandTerminalKeyInitiate (COMMAND_BIND (GnomecompatOptions::CommandTerminal)); } bool GnomeCompatPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/workarounds/0000755000004100000410000000000013246301624015303 5ustar www-datawww-data./plugins/workarounds/CMakeLists.txt0000644000004100000410000000016013246301623020037 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (workarounds PLUGINDEPS composite opengl) ./plugins/workarounds/workarounds.xml.in0000644000004100000410000001172513246301623021015 0ustar www-datawww-data Utility <_short>Workarounds <_long>Metacity-like workarounds. composite opengl decor animation opengl <_short>Window stickyness ./plugins/workarounds/src/0000755000004100000410000000000013246301624016072 5ustar www-datawww-data./plugins/workarounds/src/workarounds.cpp0000644000004100000410000006774513246301623021176 0ustar www-datawww-data/* * Copyright (C) 2007 Andrew Riedi * * Sticky window handling and OpenGL fixes: * Copyright (c) 2007 Dennis Kasprzyk * * Ported to Compiz 0.9: * Copyright (c) 2008 Sam Spilsbury * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * This plug-in for Metacity-like workarounds. */ #include "workarounds.h" bool haveOpenGL; COMPIZ_PLUGIN_20090315 (workarounds, WorkaroundsPluginVTable); /* * WorkaroundsWindow::clearInputShape * */ void WorkaroundsWindow::clearInputShape (HideInfo *hideInfo) { XRectangle *rects; int count = 0, ordering; Window xid = hideInfo->shapeWindow; rects = XShapeGetRectangles (screen->dpy (), xid, ShapeInput, &count, &ordering); if (count == 0) return; /* check if the returned shape exactly matches the window shape - * if that is true, the window currently has no set input shape */ if ((count == 1) && (rects[0].x == -window->serverGeometry ().border ()) && (rects[0].y == -window->serverGeometry ().border ()) && (rects[0].width == (window->serverGeometry ().width () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverGeometry ().height () + window->serverGeometry ().border ()))) { count = 0; } if (hideInfo->inputRects) XFree (hideInfo->inputRects); hideInfo->inputRects = rects; hideInfo->nInputRects = count; hideInfo->inputRectOrdering = ordering; XShapeSelectInput (screen->dpy (), xid, NoEventMask); XShapeCombineRectangles (screen->dpy (), xid, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); XShapeSelectInput (screen->dpy (), xid, ShapeNotifyMask); } /* * GroupWindow::restoreInputShape * */ void WorkaroundsWindow::restoreInputShape (HideInfo *info) { Window xid = info->shapeWindow; if (info->nInputRects) { XShapeCombineRectangles (screen->dpy (), xid, ShapeInput, 0, 0, info->inputRects, info->nInputRects, ShapeSet, info->inputRectOrdering); } else { XShapeCombineMask (screen->dpy (), xid, ShapeInput, 0, 0, None, ShapeSet); } if (info->inputRects) XFree (info->inputRects); XShapeSelectInput (screen->dpy (), xid, info->shapeMask); } /* * groupSetWindowVisibility * */ void WorkaroundsWindow::setVisibility (bool visible) { if (!visible && !windowHideInfo) { HideInfo *info; windowHideInfo = info = new HideInfo (); if (!windowHideInfo) return; info->inputRects = NULL; info->nInputRects = 0; info->shapeMask = XShapeInputSelected (screen->dpy (), window->id ()); /* We are a reparenting window manager now, which means that we either * shape the frame window, or if it does not exist, shape the window **/ if (window->frame ()) info->shapeWindow = window->frame (); else info->shapeWindow = window->id (); clearInputShape (info); info->skipState = window->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask); } else if (visible && windowHideInfo) { HideInfo *info = windowHideInfo; restoreInputShape (info); XShapeSelectInput (screen->dpy (), window->id (), info->shapeMask); delete info; windowHideInfo = NULL; } cWindow->addDamage (); gWindow->glPaintSetEnabled (this, !visible); } bool WorkaroundsWindow::isGroupTransient (Window clientLeader) { if (!clientLeader) return false; if (window->transientFor () == None || window->transientFor () == screen->root ()) { if (window->type () & (CompWindowTypeUtilMask | CompWindowTypeToolbarMask | CompWindowTypeMenuMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { if (window->clientLeader () == clientLeader) return true; } } return false; } void WorkaroundsWindow::minimize () { if (!window->managed ()) return; if (!isMinimized) { WORKAROUNDS_SCREEN (screen); unsigned long data[2]; int state = IconicState; CompOption::Vector propTemplate = ws->inputDisabledAtom.getReadTemplate (); CompOption::Value enabled = CompOption::Value (true); screen->handleCompizEventSetEnabled (ws, true); window->windowNotify (CompWindowNotifyMinimize); window->changeState (window->state () | CompWindowStateHiddenMask); foreach (CompWindow *w, screen->windows ()) { if (w->transientFor () == window->id () || WorkaroundsWindow::get (w)->isGroupTransient (window->clientLeader ())) w->unminimize (); } window->windowNotify (CompWindowNotifyHide); setVisibility (false); /* HACK ATTACK */ data[0] = state; data[1] = None; XChangeProperty (screen->dpy (), window->id (), Atoms::wmState, Atoms::wmState, 32, PropModeReplace, (unsigned char *) data, 2); propTemplate.at (0).set (enabled); ws->inputDisabledAtom.updateProperty (window->id (), propTemplate, XA_CARDINAL); isMinimized = true; } } void WorkaroundsWindow::unminimize () { if (isMinimized) { WORKAROUNDS_SCREEN (screen); unsigned long data[2]; int state = NormalState; CompOption::Vector propTemplate = ws->inputDisabledAtom.getReadTemplate (); CompOption::Value enabled = CompOption::Value (false); window->windowNotify (CompWindowNotifyUnminimize); window->changeState (window->state () & ~CompWindowStateHiddenMask); isMinimized = false; window->windowNotify (CompWindowNotifyShow); setVisibility (true); if (!ws->skipTransients) { foreach (CompWindow *w, screen->windows ()) { if (w->transientFor () == window->id () || WorkaroundsWindow::get (w)->isGroupTransient (window->clientLeader ())) w->unminimize (); } } /* HACK ATTACK */ data[0] = state; data[1] = None; XChangeProperty (screen->dpy (), window->id (), Atoms::wmState, Atoms::wmState, 32, PropModeReplace, (unsigned char *) data, 2); propTemplate.at (0).set (enabled); ws->inputDisabledAtom.updateProperty (window->id (), propTemplate, XA_CARDINAL); } } bool WorkaroundsWindow::minimized () const { return isMinimized; } bool WorkaroundsWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (isMinimized) { WORKAROUNDS_SCREEN (screen); bool doMask = true; foreach (CompWindow *w, ws->minimizingWindows) { if (w->id () == window->id ()) doMask = false; break; } if (doMask) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } return gWindow->glPaint (attrib, transform, region, mask); } bool WorkaroundsWindow::damageRect (bool initial, const CompRect &rect) { if (initial) cWindow->addDamage (true); cWindow->damageRectSetEnabled (this, false); return cWindow->damageRect (initial, rect); } void WorkaroundsScreen::checkFunctions (bool checkWindow, bool checkScreen) { if (haveOpenGL && optionGetForceGlxSync () && checkScreen) { gScreen->glPaintOutputSetEnabled (this, true); } else if (haveOpenGL && checkScreen) { gScreen->glPaintOutputSetEnabled (this, false); } if (haveOpenGL && optionGetForceSwapBuffers () && checkScreen) { cScreen->preparePaintSetEnabled (this, true); } else if (haveOpenGL && checkScreen) { cScreen->preparePaintSetEnabled (this, false); } if ((optionGetLegacyFullscreen () || optionGetFirefoxMenuFix () || optionGetOooMenuFix () || optionGetNotificationDaemonFix () || optionGetJavaFix () || optionGetQtFix () || optionGetConvertUrgency () ) && checkScreen) { screen->handleEventSetEnabled (this, true); } else if (checkScreen) { screen->handleEventSetEnabled (this, false); } if (checkWindow) { bool legacyFullscreen = optionGetLegacyFullscreen (); bool keepMinimized = optionGetKeepMinimizedWindows (); foreach (CompWindow *w, screen->windows ()) { WORKAROUNDS_WINDOW (w); bool m = ww->window->minimized (); ww->window->getAllowedActionsSetEnabled (ww, legacyFullscreen); ww->window->resizeNotifySetEnabled (ww, legacyFullscreen); if (m) ww->window->unminimize (); ww->window->minimizeSetEnabled (ww, keepMinimized); ww->window->unminimizeSetEnabled (ww, keepMinimized); ww->window->minimizedSetEnabled (ww, keepMinimized); if (m) ww->window->minimize (); } } } void WorkaroundsScreen::addToFullscreenList (CompWindow *w) { mfwList.push_back (w->id ()); } void WorkaroundsScreen::removeFromFullscreenList (CompWindow *w) { mfwList.remove (w->id ()); } #ifndef USE_GLES static void workaroundsProgramEnvParameter4f (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { WorkaroundsScreen *ws; GLdouble data[4]; ws = WorkaroundsScreen::get (screen); data[0] = x; data[1] = y; data[2] = z; data[3] = w; (*ws->programEnvParameter4dv) (target, index, data); } #endif void WorkaroundsScreen::updateParameterFix () { #ifndef USE_GLES if (!GL::programEnvParameter4f || !programEnvParameter4dv) return; if (optionGetAiglxFragmentFix ()) GL::programEnvParameter4f = workaroundsProgramEnvParameter4f; else GL::programEnvParameter4f = origProgramEnvParameter4f; #endif } void WorkaroundsScreen::updateVideoSyncFix () { #ifndef USE_GLES if ((!GL::getVideoSync || origGetVideoSync) || (!GL::waitVideoSync || origWaitVideoSync)) return; if (optionGetNoWaitForVideoSync ()) { GL::getVideoSync = NULL; GL::waitVideoSync = NULL; } else { GL::getVideoSync = origGetVideoSync; GL::waitVideoSync = origWaitVideoSync; } #endif } void WorkaroundsScreen::preparePaint (int ms) { if (optionGetForceSwapBuffers ()) cScreen->damageScreen (); // Massive CPU usage here cScreen->preparePaint (ms); } bool WorkaroundsScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { #ifndef USE_GLES if (optionGetForceGlxSync ()) glXWaitX (); #endif return gScreen->glPaintOutput (attrib, transform, region, output, mask); } CompString WorkaroundsWindow::getRoleAtom () { Atom type; unsigned long nItems; unsigned long bytesAfter; unsigned char *str = NULL; int format, result; CompString retval; WORKAROUNDS_SCREEN (screen); result = XGetWindowProperty (screen->dpy (), window->id (), ws->roleAtom, 0, LONG_MAX, FALSE, XA_STRING, &type, &format, &nItems, &bytesAfter, (unsigned char **) &str); if (result != Success) return ""; if (type != XA_STRING) { XFree (str); return ""; } retval = CompString ((const char *) str); return retval; } void WorkaroundsWindow::removeSticky () { if (window->state () & CompWindowStateStickyMask && madeSticky) window->changeState (window->state () & ~CompWindowStateStickyMask); madeSticky = FALSE; } void WorkaroundsWindow::updateSticky () { Bool makeSticky = FALSE; WORKAROUNDS_SCREEN (screen); if (ws->optionGetStickyAlldesktops () && window->desktop () == 0xffffffff && ws->optionGetAlldesktopStickyMatch ().evaluate (window)) makeSticky = TRUE; if (makeSticky) { if (!(window->state () & CompWindowStateStickyMask)) { madeSticky = TRUE; window->changeState ( window->state () | CompWindowStateStickyMask); } } else removeSticky (); } void WorkaroundsWindow::updateUrgencyState () { Bool urgent; XWMHints *xwmh; xwmh = XGetWMHints (screen->dpy (), window->id ()); if (!xwmh) { XFree (xwmh); return; } urgent = (xwmh->flags & XUrgencyHint); XFree (xwmh); if (urgent) { madeDemandAttention = TRUE; window->changeState (window->state () | CompWindowStateDemandsAttentionMask); } else if (madeDemandAttention) { madeDemandAttention = FALSE; window->changeState (window->state () & ~CompWindowStateDemandsAttentionMask); } } /* Use this function to forcibly refresh java window properties when they * have been unmarked as transient. This is just a copy of * PrivateScreen::setWindowState. I would use CompWindow::changeState, but * it checks whether oldstate==newstate */ void WorkaroundsScreen::setWindowState (unsigned int state, Window id) { int i = 0; Atom data[32]; i = compiz::window::fillStateData (state, data); XChangeProperty (screen->dpy (), id, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); } void WorkaroundsWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { window->getAllowedActions (setActions, clearActions); if (isFullscreen) setActions |= CompWindowActionFullscreenMask; } void WorkaroundsWindow::fixupFullscreen () { Bool isFullSize; BoxPtr box; WORKAROUNDS_SCREEN (screen); if (!ws->optionGetLegacyFullscreen ()) return; if (window->wmType () & CompWindowTypeDesktopMask) { /* desktop windows are implicitly fullscreen */ isFullSize = FALSE; } else { /* get output region for window */ int output = screen->outputDeviceForGeometry (window->geometry ()); box = &screen->outputDevs ().at (output).region ()->extents; /* does the size match the output rectangle? */ isFullSize = (window->serverX () == box->x1) && (window->serverY () == box->y1) && (window->serverWidth () == (box->x2 - box->x1)) && (window->serverHeight () == (box->y2 - box->y1)); /* if not, check if it matches the whole screen */ if (!isFullSize) { if ((window->serverX () == 0) && (window->serverY () == 0) && (window->serverWidth () == screen->width ()) && (window->serverHeight () == screen->height ())) { isFullSize = TRUE; } } } isFullscreen = isFullSize; if (isFullSize && !(window->state () & CompWindowStateFullscreenMask)) { unsigned int state = window->state () & ~CompWindowStateFullscreenMask; if (isFullSize) state |= CompWindowStateFullscreenMask; madeFullscreen = isFullSize; if (state != window->state ()) { window->changeState (state); window->updateAttributes (CompStackingUpdateModeNormal); /* keep track of windows that we interact with */ ws->addToFullscreenList (window); } } else if (!isFullSize && !ws->mfwList.empty () && (window->state () & CompWindowStateFullscreenMask)) { /* did we set the flag? */ foreach (Window mfw, ws->mfwList) { if (mfw == window->id ()) { unsigned int state = window->state () & ~CompWindowStateFullscreenMask; if (isFullSize) state |= CompWindowStateFullscreenMask; madeFullscreen = isFullSize; if (state != window->state ()) { window->changeState (state); window->updateAttributes (CompStackingUpdateModeNormal); } ws->removeFromFullscreenList (window); break; } } } } void WorkaroundsWindow::updateFixedWindow (unsigned int newWmType) { if (newWmType != window->wmType ()) { adjustedWinType = TRUE; oldWmType = window->wmType (); window->recalcType (); window->recalcActions (); screen->matchPropertyChanged (window); window->wmType () = newWmType; } } unsigned int WorkaroundsWindow::getFixedWindowType () { unsigned int newWmType; XClassHint classHint; CompString resName; WORKAROUNDS_SCREEN (screen); newWmType = window->wmType (); if (!XGetClassHint (screen->dpy (), window->id (), &classHint)) return newWmType; if (classHint.res_name) { resName = CompString (classHint.res_name); XFree (classHint.res_name); } if (classHint.res_class) { XFree (classHint.res_class); } /* FIXME: Is this the best way to detect a notification type window? */ if (ws->optionGetNotificationDaemonFix ()) { if (newWmType == CompWindowTypeNormalMask && window->overrideRedirect () && !resName.empty () && resName.compare("notification-daemon") == 0) { newWmType = CompWindowTypeNotificationMask; return newWmType; } } if (ws->optionGetFirefoxMenuFix ()) { if (newWmType == CompWindowTypeNormalMask && window->overrideRedirect () && !resName.empty ()) { if ((resName.compare ( "gecko") == 0) || (resName.compare ( "popup") == 0)) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } } } if (ws->optionGetOooMenuFix ()) { if (newWmType == CompWindowTypeNormalMask && window->overrideRedirect () && !resName.empty ()) { if (resName.compare ( "VCLSalFrame") == 0) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } } } /* FIXME: Basic hack to get Java windows working correctly. */ if (ws->optionGetJavaFix () && !resName.empty ()) { if ((resName.compare ( "sun-awt-X11-XMenuWindow") == 0) || (resName.compare ( "sun-awt-X11-XWindowPeer") == 0)) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } else if (resName.compare ( "sun-awt-X11-XDialogPeer") == 0) { newWmType = CompWindowTypeDialogMask; return newWmType; } else if (resName.compare ( "sun-awt-X11-XFramePeer") == 0) { newWmType = CompWindowTypeNormalMask; return newWmType; } } if (ws->optionGetQtFix ()) { CompString windowRole; /* fix tooltips */ windowRole = getRoleAtom (); if (!windowRole.empty ()) { if ((windowRole.compare ("toolTipTip") == 0) || (windowRole.compare ("qtooltip_label") == 0)) { newWmType = CompWindowTypeTooltipMask; return newWmType; } } /* fix Qt transients - FIXME: is there a better way to detect them? */ if (resName.empty () && window->overrideRedirect () && (window->windowClass () == InputOutput) && (newWmType == CompWindowTypeUnknownMask)) { newWmType = CompWindowTypeDropdownMenuMask; return newWmType; } } return newWmType; } void WorkaroundsScreen::optionChanged (CompOption *opt, WorkaroundsOptions::Options num) { checkFunctions (true, true); foreach (CompWindow *w, screen->windows ()) WorkaroundsWindow::get (w)->updateSticky (); #ifndef USE_GLES if (haveOpenGL) { updateParameterFix (); updateVideoSyncFix (); if (optionGetFglrxXglFix ()) GL::copySubBuffer = NULL; else GL::copySubBuffer = origCopySubBuffer; } #endif if (optionGetKeepMinimizedWindows ()) { foreach (CompWindow *window, screen->windows ()) { WORKAROUNDS_WINDOW (window); bool m = window->minimized (); if (m) window->unminimize (); window->minimizeSetEnabled (ww, true); window->unminimizeSetEnabled (ww, true); window->minimizedSetEnabled (ww, true); if (m) window->minimize (); } } else { foreach (CompWindow *window, screen->windows ()) { WORKAROUNDS_WINDOW (window); bool m = window->minimized (); if (m) window->unminimize (); window->minimizeSetEnabled (ww, false); window->unminimizeSetEnabled (ww, false); window->minimizedSetEnabled (ww, false); if (m) { ww->isMinimized = false; window->minimize (); } } } } void WorkaroundsScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &o) { if (strncmp (pluginName, "animation", 9) == 0 && strncmp (eventName, "window_animation", 16) == 0) { if (CompOption::getStringOptionNamed (o, "type", "") == "minimize") { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed ( o, "window", 0)); if (w) { if (CompOption::getBoolOptionNamed (o, "active", false)) minimizingWindows.push_back (w); else minimizingWindows.remove (w); } } } if (!CompOption::getBoolOptionNamed (o, "active", false) && minimizingWindows.empty ()) screen->handleCompizEventSetEnabled (this, false); screen->handleCompizEvent (pluginName, eventName, o); } void WorkaroundsScreen::handleEvent (XEvent *event) { CompWindow *w; switch (event->type) { case ConfigureRequest: w = screen->findWindow (event->xconfigurerequest.window); if (w) { WORKAROUNDS_WINDOW (w); if (ww->madeFullscreen) w->changeState (w->state () &= ~CompWindowStateFullscreenMask); } break; case MapRequest: w = screen->findWindow (event->xmaprequest.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateSticky (); ww->updateFixedWindow (ww->getFixedWindowType ()); ww->fixupFullscreen (); } break; case MapNotify: w = screen->findWindow (event->xmap.window); if (w && w->overrideRedirect ()) { WORKAROUNDS_WINDOW (w); ww->updateFixedWindow (ww->getFixedWindowType ()); } break; case DestroyNotify: w = screen->findWindow (event->xdestroywindow.window); if (w) removeFromFullscreenList (w); break; } screen->handleEvent (event); switch (event->type) { case ConfigureRequest: w = screen->findWindow (event->xconfigurerequest.window); if (w) { WORKAROUNDS_WINDOW (w); if (ww->madeFullscreen) w->state () |= CompWindowStateFullscreenMask; } break; case ClientMessage: if (event->xclient.message_type == Atoms::winDesktop) { w = screen->findWindow (event->xclient.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateSticky (); } } break; case PropertyNotify: if ((event->xproperty.atom == XA_WM_CLASS) || (event->xproperty.atom == Atoms::winType)) { w = screen->findWindow (event->xproperty.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateFixedWindow (ww->getFixedWindowType ()); } } else if (event->xproperty.atom == XA_WM_HINTS) { if (optionGetConvertUrgency ()) { w = screen->findWindow (event->xproperty.window); if (w) { WORKAROUNDS_WINDOW (w); ww->updateUrgencyState (); } } } else if (event->xproperty.atom == Atoms::clientList) { if (optionGetJavaTaskbarFix ()) { foreach (CompWindow *w, screen->windows ()) { if (w->managed ()) setWindowState (w->state (), w->id ()); } } } break; default: break; } } void WorkaroundsWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (window->isViewable ()) fixupFullscreen (); window->resizeNotify (dx, dy, dwidth, dheight); } WorkaroundsScreen::WorkaroundsScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), roleAtom (XInternAtom (screen->dpy (), "WM_WINDOW_ROLE", 0)), skipTransients (false) { CompOption::Vector propTemplate; ScreenInterface::setHandler (screen, false); if (haveOpenGL) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } propTemplate.push_back (CompOption ("enabled", CompOption::TypeBool)); inputDisabledAtom = PropertyWriter ("COMPIZ_NET_WM_INPUT_DISABLED", propTemplate); optionSetStickyAlldesktopsNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetAlldesktopStickyMatchNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetAiglxFragmentFixNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetFglrxXglFixNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetForceSwapBuffersNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetNoWaitForVideoSyncNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); optionSetKeepMinimizedWindowsNotify (boost::bind ( &WorkaroundsScreen::optionChanged, this, _1, _2)); #ifndef USE_GLES if (haveOpenGL) { origProgramEnvParameter4f = GL::programEnvParameter4f; programEnvParameter4dv = (GLProgramParameter4dvProc) gScreen->getProcAddress ("glProgramEnvParameter4dvARB"); origCopySubBuffer = GL::copySubBuffer; origGetVideoSync = GL::getVideoSync; origWaitVideoSync = GL::waitVideoSync; updateParameterFix (); updateVideoSyncFix (); } if (optionGetFglrxXglFix () && haveOpenGL) GL::copySubBuffer = NULL; #endif checkFunctions (false, true); } WorkaroundsScreen::~WorkaroundsScreen () { #ifndef USE_GLES if (haveOpenGL) { GL::copySubBuffer = origCopySubBuffer; GL::getVideoSync = origGetVideoSync; GL::waitVideoSync = origWaitVideoSync; } #endif } WorkaroundsWindow::WorkaroundsWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), adjustedWinType (false), madeSticky (false), madeFullscreen (false), isFullscreen (false), madeDemandAttention (false), isMinimized (window->minimized ()), oldWmType (window->wmType ()), windowHideInfo (NULL) { WindowInterface::setHandler (window, false); GLWindowInterface::setHandler (gWindow, false); WORKAROUNDS_SCREEN (screen); if (ws->optionGetInitialDamageCompleteRedraw ()) CompositeWindowInterface::setHandler (cWindow); if (ws->optionGetLegacyFullscreen ()) { window->getAllowedActionsSetEnabled (this, false); window->resizeNotifySetEnabled (this, false); } if (ws->optionGetKeepMinimizedWindows ()) { window->minimizeSetEnabled (this, true); window->unminimizeSetEnabled (this, true); window->minimizedSetEnabled (this, true); } } WorkaroundsWindow::~WorkaroundsWindow () { WORKAROUNDS_SCREEN (screen); /* It is not safe to loop the whole window list at this point * to _also_ unminimize transient windows because this could * be the plugin tear-down stage and other WorkaroundWindow * structures could be destroyed. * * It is ok to skip transients in this case, since it is likely * that we will be unminimizing every single window as * WorkaroundsWindow is destroyed (in the case that the window * itself has been destroyed while the plugin is enabled, this * is not much of a problem since the transient windows go with * the destroyed window in this case) * * FIXME: We need a ::fini stage before we do this! */ ws->skipTransients = true; if (isMinimized) { unminimize (); window->minimizeSetEnabled (this, false); window->unminimizeSetEnabled (this, false); window->minimizedSetEnabled (this, false); window->minimize (); } if (!window->destroyed ()) { if (adjustedWinType) { window->wmType () = oldWmType; window->recalcType (); window->recalcActions (); } if (window->state () & CompWindowStateStickyMask && madeSticky) { window->state () &= ~CompWindowStateStickyMask; } } ws->skipTransients = false; } bool WorkaroundsPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) haveOpenGL = true; else haveOpenGL = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/workarounds/src/workarounds.h0000644000004100000410000001125613246301623020625 0ustar www-datawww-data/* * Copyright (C) 2007 Andrew Riedi * * Sticky window handling and OpenGL fixes: * Copyright (c) 2007 Dennis Kasprzyk * * Ported to Compiz 0.9: * Copyright (c) 2008 Sam Spilsbury * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * This plug-in for Metacity-like workarounds. */ #include #include #include #include #include #include #include #include #include #include "workarounds_options.h" extern bool haveOpenGL; #ifndef USE_GLES typedef void (*GLProgramParameter4dvProc) (GLenum target, GLuint index, const GLdouble *data); #endif class WorkaroundsScreen : public PluginClassHandler , public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface, public WorkaroundsOptions { public: WorkaroundsScreen (CompScreen *); ~WorkaroundsScreen (); CompositeScreen *cScreen; GLScreen *gScreen; Atom roleAtom; std::list mfwList; CompWindowList minimizingWindows; bool skipTransients; PropertyWriter inputDisabledAtom; #ifndef USE_GLES GL::GLProgramParameter4fProc origProgramEnvParameter4f; GLProgramParameter4dvProc programEnvParameter4dv; GL::GLXGetVideoSyncProc origGetVideoSync; GL::GLXWaitVideoSyncProc origWaitVideoSync; GL::GLXCopySubBufferProc origCopySubBuffer; #endif void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &o); void addToFullscreenList (CompWindow *w); void removeFromFullscreenList (CompWindow *w); void updateParameterFix (); void updateVideoSyncFix (); void optionChanged (CompOption *opt, WorkaroundsOptions::Options num); void checkFunctions (bool window, bool screen); void setWindowState (unsigned int state, Window id); }; #define WORKAROUNDS_SCREEN(s) \ WorkaroundsScreen *ws = WorkaroundsScreen::get (s) class WorkaroundsWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: typedef struct _HideInfo { Window shapeWindow; unsigned long skipState; unsigned long shapeMask; XRectangle *inputRects; int nInputRects; int inputRectOrdering; } HideInfo; public: WorkaroundsWindow (CompWindow *); ~WorkaroundsWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool adjustedWinType; bool madeSticky; bool madeFullscreen; bool isFullscreen; bool madeDemandAttention; bool isMinimized; unsigned int oldWmType; HideInfo *windowHideInfo; bool isGroupTransient (Window); void resizeNotify (int, int, int, int); void getAllowedActions (unsigned int &, unsigned int &); void minimize (); void unminimize (); bool minimized () const; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void setVisibility (bool); void restoreInputShape (HideInfo *); void clearInputShape (HideInfo *); void removeSticky (); CompString getRoleAtom (); void updateSticky (); void updateUrgencyState (); void fixupFullscreen (); void updateFixedWindow (unsigned int newWmType); unsigned int getFixedWindowType (); bool damageRect (bool initial, const CompRect &rect); }; #define WORKAROUNDS_WINDOW(w) \ WorkaroundsWindow *ww = WorkaroundsWindow::get (w) class WorkaroundsPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/imgsvg/0000755000004100000410000000000013246301624014221 5ustar www-datawww-data./plugins/imgsvg/CMakeLists.txt0000644000004100000410000000072513246301623016764 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) pkg_check_modules (RSVG librsvg-2.0>=2.36.2) if (RSVG_FOUND) compiz_set (HAVE_RSVG_2_36_2 1) endif (RSVG_FOUND) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/imgsvg-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/imgsvg-config.h) include_directories (${CMAKE_CURRENT_BINARY_DIR}/src) compiz_plugin(imgsvg PLUGINDEPS composite opengl PKGDEPS cairo>=1.0 cairo-xlib librsvg-2.0>=2.14.0 LIBRARIES decoration) ./plugins/imgsvg/imgsvg.xml.in0000644000004100000410000000112313246301623016640 0ustar www-datawww-data <_short>SVG <_long>SVG image loader Image Loading imageext:svg imagemime:image/svg+xml composite opengl decor ./plugins/imgsvg/src/0000755000004100000410000000000013246301624015010 5ustar www-datawww-data./plugins/imgsvg/src/imgsvg-config.h.in0000644000004100000410000000003613246301623020323 0ustar www-datawww-data#cmakedefine HAVE_RSVG_2_36_2 ./plugins/imgsvg/src/imgsvg.cpp0000644000004100000410000003507413246301623017020 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "imgsvg.h" #include COMPIZ_PLUGIN_20090315 (imgsvg, SvgPluginVTable) static bool svgSet (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findWindow (xid); if (w) { decor_point_t p[2]; CompString data; SVG_WINDOW (w); memset (p, 0, sizeof (p)); p[0].gravity = CompOption::getIntOptionNamed (options, "gravity0", GRAVITY_NORTH | GRAVITY_WEST); p[0].x = CompOption::getIntOptionNamed (options, "x0"); p[0].y = CompOption::getIntOptionNamed (options, "y0"); p[1].gravity = CompOption::getIntOptionNamed (options, "gravity1", GRAVITY_SOUTH | GRAVITY_EAST); p[1].x = CompOption::getIntOptionNamed (options, "x1"); p[1].y = CompOption::getIntOptionNamed (options, "y1"); data = CompOption::getStringOptionNamed (options, "data"); sw->setSvg (data, p); } return false; } SvgScreen::SvgScreen (CompScreen *screen) : PluginClassHandler (screen) { optionSetSetInitiate (svgSet); ScreenInterface::setHandler (screen, true); } SvgScreen::~SvgScreen () { } bool SvgScreen::fileToImage (CompString &path, CompSize &size, int &stride, void *&data) { CompString fileName = path; bool status = false; int len = fileName.length (); if (len < 4 || fileName.substr (len - 4, 4) != ".svg") fileName += ".svg"; status = readSvgToImage (fileName.c_str (), size, data); if (status) { stride = size.width () * 4; return true; } status = screen->fileToImage (path, size, stride, data); return status; } void SvgScreen::handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) { screen->handleCompizEvent (plugin, event, options); if (strcmp (plugin, "zoom") == 0) { int output = CompOption::getIntOptionNamed (options, "output"); if (output == 0) { if (strcmp (event, "in") == 0) { zoom.setGeometry (CompOption::getIntOptionNamed (options, "x1"), CompOption::getIntOptionNamed (options, "y1"), CompOption::getIntOptionNamed (options, "x2"), CompOption::getIntOptionNamed (options, "y2")); } else if (strcmp (event, "out") == 0) zoom.setGeometry (0, 0, 0, 0); } } } bool SvgScreen::readSvgToImage (const char *file, CompSize &size, void *&data) { cairo_surface_t *surface; std::ifstream svgFile; GError *error = NULL; RsvgHandle *svgHandle; RsvgDimensionData svgDimension; svgFile.open (file); if (!svgFile.is_open ()) return false; svgFile.close (); svgHandle = rsvg_handle_new_from_file (file, &error); if (!svgHandle) return false; rsvg_handle_get_dimensions (svgHandle, &svgDimension); size.setWidth (svgDimension.width); size.setHeight (svgDimension.height); data = malloc (svgDimension.width * svgDimension.height * 4); if (!data) { rsvg_handle_free (svgHandle); return false; } surface = cairo_image_surface_create_for_data ((unsigned char *) data, CAIRO_FORMAT_ARGB32, svgDimension.width, svgDimension.height, svgDimension.width * 4); if (surface) { cairo_t *cr; cr = cairo_create (surface); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); rsvg_handle_render_cairo (svgHandle, cr); cairo_destroy (cr); cairo_surface_destroy (surface); } rsvg_handle_free (svgHandle); return true; } SvgWindow::SvgWindow (CompWindow *window) : PluginClassHandler (window), source (NULL), context (NULL), sScreen (SvgScreen::get (screen)), gScreen (GLScreen::get (screen)), window (window), gWindow (GLWindow::get (window)) { if (gWindow) GLWindowInterface::setHandler (gWindow, false); } SvgWindow::~SvgWindow () { if (source) { rsvg_handle_free (source->svg); delete source; } if (context) { finiTexture (context->texture[0]); delete context; } } bool SvgWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status = gWindow->glDraw (transform, attrib, region, mask); if (!status) return status; const CompRegion ® = (mask & PAINT_WINDOW_TRANSFORMED_MASK) ? CompRegion::infinite () : region; if (context && reg.numRects ()) { GLTexture::MatrixList matrix (1); CompRect rect = context->box.boundingRect (); int x1 = MIN (rect.x1 (), sScreen->zoom.x1 ()); int y1 = MIN (rect.y1 (), sScreen->zoom.y1 ()); int x2 = MAX (rect.x2 (), sScreen->zoom.x2 ()); int y2 = MAX (rect.y2 (), sScreen->zoom.y2 ()); rect.setGeometry (x1, y1, x2 - x1, y2 - y1); for (unsigned int i = 0; i < context->texture[0].textures.size (); ++i) { matrix[0] = context->texture[0].matrices[i]; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (matrix, context->box, reg); gWindow->vertexBuffer ()->end (); if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) mask |= PAINT_WINDOW_BLEND_MASK; gWindow->glDrawTexture (context->texture[0].textures[i], transform, attrib, mask); if (rect.width () > 0 && rect.height () > 0) { rect.setGeometry (rect.x1 () - 1, rect.y1 () - 1, rect.width () + 1, rect.height () + 1); float xScale = screen->width () / (float) (sScreen->zoom.width ()); float yScale = screen->height () / (float) (sScreen->zoom.height ()); float dx = rect.width (); float dy = rect.height (); float width = dx * xScale + 0.5f; float height = dy * yScale + 0.5f; if (rect != context->rect || width != context->size.width () || height != context->size.height ()) { context->rect = rect; context->size.setWidth (width); context->size.setHeight (height); dx = context->box.boundingRect ().width (); dy = context->box.boundingRect ().height (); float x1 = (rect.x1 () - context->box.boundingRect ().x ()) / dx; float y1 = (rect.y1 () - context->box.boundingRect ().y ()) / dy; float x2 = (rect.x2 () - context->box.boundingRect ().x ()) / dx; float y2 = (rect.y2 () - context->box.boundingRect ().y ()) / dy; finiTexture (context->texture[1]); if (initTexture (context->source, context->texture[1], context->size)) { renderSvg (context->source, context->texture[1], context->size, x1, y1, x2, y2); updateSvgMatrix (); } } GLTexture::Filter saveFilter; CompRegion r (rect); for (unsigned int j = 0; j < context->texture[1].textures.size (); ++j) { matrix[0] = context->texture[1].matrices[j]; saveFilter = gScreen->filter (SCREEN_TRANS_FILTER); gScreen->setFilter (SCREEN_TRANS_FILTER, GLTexture::Good); gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (matrix, r, reg); gWindow->vertexBuffer ()->end (); gWindow->glDrawTexture (context->texture[1].textures[j], transform, attrib, mask); gScreen->setFilter (SCREEN_TRANS_FILTER, saveFilter); } } else if (context->texture[1].size.width ()) { finiTexture (context->texture[1]); initTexture (source, context->texture[1], CompSize ()); memset (&context->rect, 0, sizeof (BoxRec)); context->size.setWidth (0); context->size.setHeight (0); } } } return status; } void SvgWindow::moveNotify (int dx, int dy, bool immediate) { if (context) { context->box.translate (dx, dy); updateSvgMatrix (); } window->moveNotify (dx, dy, immediate); } void SvgWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (source) updateSvgContext (); window->resizeNotify (dx, dy, dwidth, dheight); } void SvgWindow::updateSvgMatrix () { GLTexture::Matrix *m; unsigned int i; CompRect rect = context->box.boundingRect (); SvgTexture *texture = &context->texture[0]; if (texture->matrices.size () != texture->textures.size ()) texture->matrices.resize (texture->textures.size ()); for (i = 0; i < texture->textures.size (); ++i) { m = &texture->matrices[i]; *m = texture->textures[i]->matrix (); m->xx *= (float) texture->size.width () / rect.width (); m->yy *= (float) texture->size.height () / rect.height (); m->x0 -= (rect.x () * m->xx); m->y0 -= (rect.y () * m->yy); } texture = &context->texture[1]; if (texture->matrices.size () != texture->textures.size ()) texture->matrices.resize (texture->textures.size ()); for (i = 0; i < texture->textures.size (); ++i) { m = &texture->matrices[i]; *m = texture->textures[i]->matrix (); m->xx *= (float) texture->size.width () / context->rect.width (); m->yy *= (float) texture->size.height () / context->rect.height (); m->x0 -= (context->rect.x () * m->xx); m->y0 -= (context->rect.y () * m->yy); } } void SvgWindow::updateSvgContext () { if (context) { finiTexture (context->texture[0]); finiTexture (context->texture[1]); } else { context = new SvgContext; if (!context) return; } int x1, y1, x2, y2; CompSize wSize; initTexture (source, context->texture[1], context->size); context->source = source; wSize.setWidth (window->geometry ().width ()); wSize.setHeight (window->geometry ().height ()); decor_apply_gravity (source->p1.gravity, source->p1.x, source->p1.y, wSize.width (), wSize.height (), &x1, &y1); decor_apply_gravity (source->p2.gravity, source->p2.x, source->p2.y, wSize.width (), wSize.height (), &x2, &y2); x1 = MAX (x1, 0); y1 = MAX (y1, 0); x2 = MIN (x2, wSize.width ()); y2 = MIN (y2, wSize.height ()); if (!initTexture (source, context->texture[0], wSize)) { delete context; context = NULL; } else { renderSvg (source, context->texture[0], wSize, 0.0f, 0.0f, 1.0f, 1.0f); initTexture (source, context->texture[1], CompSize ()); context->box += CompRect (x1, y1, x2 - x1, y2 - y1); context->box.translate (window->geometry ().x (), window->geometry ().y ()); updateSvgMatrix (); } } void SvgWindow::renderSvg (SvgSource *source, SvgTexture &texture, CompSize size, float x1, float y1, float x2, float y2) { float w = x2 - x1; float h = y2 - y1; cairo_save (texture.cr); cairo_set_operator (texture.cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba (texture.cr, 1.0, 1.0, 1.0, 0.0); cairo_paint (texture.cr); cairo_set_operator (texture.cr, CAIRO_OPERATOR_OVER); cairo_scale (texture.cr, 1.0 / w, 1.0 / h); cairo_scale (texture.cr, (double) size.width () / source->dimension.width, (double) size.height () / source->dimension.height); cairo_translate (texture.cr, -x1 * source->dimension.width, -y1 * source->dimension.height); rsvg_handle_render_cairo (source->svg, texture.cr); cairo_restore (texture.cr); } bool SvgWindow::initTexture (SvgSource *source, SvgTexture &texture, CompSize size) { Display *dpy = screen->dpy (); texture.size = size; texture.pixmap = None; texture.cr = NULL; if (size.width () && size.height ()) { cairo_surface_t *surface; XWindowAttributes attr; XGetWindowAttributes (dpy, window->id (), &attr); texture.pixmap = XCreatePixmap (dpy, screen->root (), size.width (), size.height (), attr.depth); texture.textures = GLTexture::bindPixmapToTexture (texture.pixmap, size.width (), size.height (), attr.depth); if (texture.textures.empty ()) { compLogMessage ("svg", CompLogLevelInfo, "Couldn't bind pixmap 0x%x to texture", (int) texture.pixmap); XFreePixmap (dpy, texture.pixmap); return false; } surface = cairo_xlib_surface_create (dpy, texture.pixmap, attr.visual, size.width (), size.height ()); texture.cr = cairo_create (surface); cairo_surface_destroy (surface); } return true; } void SvgWindow::finiTexture (SvgTexture &texture) { if (texture.cr) cairo_destroy (texture.cr); if (texture.pixmap) XFreePixmap (screen->dpy (), texture.pixmap); } void SvgWindow::setSvg (CompString &data, decor_point_t p[2]) { if (!gWindow) return; GError *error = NULL; RsvgHandle *svg = rsvg_handle_new_from_data ((guint8 *) data.c_str (), data.length (), &error); if (source) { rsvg_handle_free (source->svg); source->svg = svg; } else { source = new SvgSource; if (source) source->svg = svg; } if (source && source->svg) { source->p1 = p[0]; source->p2 = p[1]; source->svg = svg; gWindow->glDrawSetEnabled (this, true); rsvg_handle_get_dimensions (svg, &source->dimension); updateSvgContext (); } else { if (svg) rsvg_handle_free (svg); if (source) { delete source; source = NULL; } if (context) { finiTexture (context->texture[0]); delete context; context = NULL; } gWindow->glDrawSetEnabled (this, false); } } bool SvgPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { rsvg_init (); return true; } return false; } void SvgPluginVTable::fini () { rsvg_term (); } ./plugins/imgsvg/src/imgsvg.h0000644000004100000410000000770313246301623016463 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "imgsvg_options.h" #include #include #include #include #include #include #include #include #include #ifndef HAVE_RSVG_2_36_2 #include #endif #include #include #include #include #define SVG_SCREEN(s) SvgScreen *ss = SvgScreen::get (s) #define SVG_WINDOW(w) SvgWindow *sw = SvgWindow::get (w) class SvgScreen : public ScreenInterface, public PluginClassHandler, public ImgsvgOptions { public: SvgScreen (CompScreen *screen); ~SvgScreen (); bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options); CompRect zoom; private: bool readSvgToImage (const char *file, CompSize &size, void *&data); }; class SvgWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: SvgWindow (CompWindow *window); ~SvgWindow (); bool glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask); void moveNotify (int dx, int dy, bool immediate); void resizeNotify (int dx, int dy, int dwidth, int dheight); void setSvg (CompString &data, decor_point_t p[2]); private: typedef struct { decor_point_t p1; decor_point_t p2; RsvgHandle *svg; RsvgDimensionData dimension; } SvgSource; typedef struct { GLTexture::List textures; GLTexture::MatrixList matrices; cairo_t *cr; Pixmap pixmap; CompSize size; } SvgTexture; typedef struct { SvgSource *source; CompRegion box; SvgTexture texture[2]; CompRect rect; CompSize size; } SvgContext; SvgSource *source; SvgContext *context; SvgScreen *sScreen; GLScreen *gScreen; CompWindow *window; GLWindow *gWindow; void updateSvgMatrix (); void updateSvgContext (); void renderSvg (SvgSource *source, SvgTexture &texture, CompSize size, float x1, float y1, float x2, float y2); bool initTexture (SvgSource *source, SvgTexture &texture, CompSize size); void finiTexture (SvgTexture &texture); }; class SvgPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; ./plugins/simple-animations/0000755000004100000410000000000013246301623016355 5ustar www-datawww-data./plugins/simple-animations/CMakeLists.txt0000644000004100000410000000017213246301623021115 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (animationsim PLUGINDEPS composite opengl animation) ./plugins/simple-animations/src/0000755000004100000410000000000013246301624017145 5ustar www-datawww-data./plugins/simple-animations/src/flyin.cpp0000644000004100000410000000453213246301623020775 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "animationsim.h" // ===================== Effect: Flyin ========================= void FlyInAnim::applyTransform () { GLMatrix *transform = &mTransform; float offsetX = 0, offsetY = 0; float xTrans, yTrans; float forwardProgress; ANIMSIM_SCREEN (screen); int direction = ass->optionGetFlyinDirection (); float distance = ass->optionGetFlyinDistance (); switch (direction) { case 0: offsetX = 0; offsetY = distance; break; case 1: offsetX = distance; offsetY = 0; break; case 2: offsetX = 0; offsetY = -distance; break; case 3: offsetX = -distance; offsetY = 0; break; case 4: offsetX = ass->optionGetFlyinDirectionX (); offsetY = ass->optionGetFlyinDirectionY (); break; } forwardProgress = progressLinear (); xTrans = -(forwardProgress * offsetX); yTrans = -(forwardProgress * offsetY); Point3d translation = Point3d (xTrans, yTrans, 0); // animation movement transform->translate (translation.x (), translation.y (), translation.z ()); } ./plugins/simple-animations/src/animationsim.h0000644000004100000410000002423013246301623022006 0ustar www-datawww-data#include #include #include #include #include #include #include #include "animationsim_options.h" extern AnimEffect AnimEffectFlyIn; extern AnimEffect AnimEffectBounce; extern AnimEffect AnimEffectRotateIn; extern AnimEffect AnimEffectSheet; extern AnimEffect AnimEffectExpand; extern AnimEffect AnimEffectExpandPW; extern AnimEffect AnimEffectFan; // TODO Update this for each added animation effect! (total: 8) #define NUM_EFFECTS 8 // This must have the value of the first "effect setting" above // in AnimAddonScreenOptions #define NUM_NONEFFECT_OPTIONS AnimationsimOptions::FlyinDirection #define WIN_X(w) ((w)->x () - (w)->input ().left) #define WIN_Y(w) ((w)->y () - (w)->input ().top) #define WIN_W(w) ((w)->width () + (w)->input ().left + (w)->input ().right) #define WIN_H(w) ((w)->height () + (w)->input ().top + (w)->input ().bottom) class ExtensionPluginAnimSim : public ExtensionPluginInfo { public: ExtensionPluginAnimSim (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex) {} ~ExtensionPluginAnimSim () {} const CompOutput *output () { return mOutput; } private: const CompOutput *mOutput; }; /// Base class for all polygon- and particle-based animations class BaseSimAnim : virtual public Animation { public: BaseSimAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~BaseSimAnim () {} protected: /// Gets info about the extension plugin that implements this animation. ExtensionPluginInfo *getExtensionPluginInfo (); CompositeScreen *mCScreen; GLScreen *mGScreen; }; class AnimSimScreen : public PluginClassHandler , public AnimationsimOptions { public: AnimSimScreen (CompScreen *); ~AnimSimScreen (); protected: void initAnimationList (); CompOutput &mOutput; }; class AnimSimWindow : public PluginClassHandler { public: AnimSimWindow (CompWindow *); ~AnimSimWindow (); protected: CompWindow *mWindow; ///< Window being animated. AnimWindow *aWindow; }; /* typedef struct _WaveParam { float halfWidth; float amp; float pos; } WaveParam; */ #define ANIMSIM_SCREEN(s) \ AnimSimScreen *ass = AnimSimScreen::get (s); #define ANIMSIM_WINDOW(w) \ AnimSimWindow *asw = AnimSimWindow::get (w); class FlyInAnim : public FadeAnim, virtual public BaseSimAnim, virtual public TransformAnim { public: FlyInAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon) {} protected: void step () { TransformAnim::step (); } bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } void applyTransform (); bool requiresTransformedWindow () const { return true; } float getFadeProgress () { return progressDecelerate (progressLinear ()); } }; class RotateInAnim: public TransformAnim, virtual public BaseSimAnim { public: RotateInAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) {} protected: void step () { TransformAnim::step (); } bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } void applyTransform (); void prePaintWindow (); void postPaintWindow (); inline float getProgress () { return progressDecelerate (progressLinear ()); } }; class ExpandAnim: public TransformAnim, virtual public BaseSimAnim { public: ExpandAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) {} protected: inline float getProgress () { return progressDecelerate (progressLinear ()); } void applyTransform (); bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } }; class ExpandPWAnim: public TransformAnim, virtual public BaseSimAnim { public: ExpandPWAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) { } protected: inline float getProgress () { return progressDecelerate (progressLinear ()); } void applyTransform (); bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } }; class BounceAnim: public FadeAnim, virtual public TransformAnim, virtual public BaseSimAnim { public: BounceAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon) { ANIMSIM_SCREEN (screen); bounceCount = ass->optionGetBounceNumber (); nBounce = 1; targetScale = ass->optionGetBounceMinSize (); currentScale = ass->optionGetBounceMaxSize (); bounceNeg = false; currBounceProgress = 0.0f; lastProgressMax = 0.0f; } protected: void step () { TransformAnim::step (); } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } bool updateBBUsed () { return true; } bool requiresTransformedWindow () const { return true; } void applyTransform (); float getProgress (); float getFadeProgress () { return progressDecelerate (progressLinear ()); } int bounceCount; int nBounce; float targetScale; float currentScale; bool bounceNeg; float currBounceProgress; float lastProgressMax; }; class SheetAnim : public GridAnim, virtual public BaseSimAnim { public: SheetAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); class WaveParam { public: float halfWidth; float amp; float pos; }; protected: void initGrid () { mGridWidth = 30; mGridHeight = 30; } void step (); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool stepRegionUsed () { return true; } int sheetsWaveCount; std::vector sheetsWaves; }; class PulseSingleAnim : public TransformAnim, virtual public FadeAnim, virtual public BaseSimAnim { public: PulseSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) {} void step () { TransformAnim::step (); } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } bool updateBBUsed () { return true; } float getProgress () { return progressLinear (); } float getFadeProgress (); void applyTransform (); protected: bool requiresTransformedWindow () const { return true; } }; class PulseAnim : public MultiAnim { public: PulseAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : MultiAnim ::MultiAnim (w, curWindowEvent, duration, info, icon) {} }; class FanSingleAnim : public TransformAnim, virtual public FadeAnim, virtual public BaseSimAnim { public: FanSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), FadeAnim::FadeAnim (w, curWindowEvent, duration, info, icon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) {} void step () { TransformAnim::step (); } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } bool updateBBUsed () { return true; } float getProgress () { return progressLinear (); } float getFadeProgress (); void applyTransform (); protected: bool requiresTransformedWindow () const { return true; } }; class FanAnim : public MultiAnim { public: FanAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : MultiAnim ::MultiAnim (w, curWindowEvent, duration, info, icon) {} }; class AnimSimPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/simple-animations/src/fan.cpp0000644000004100000410000000242413246301623020416 0ustar www-datawww-data#include "animationsim.h" float FanSingleAnim::getFadeProgress () { return getProgress (); }; void FanSingleAnim::applyTransform () { /* Starting angle is as a percentage of whichever fan number we are * closest to the center */ ANIMSIM_SCREEN (screen); int num = MultiAnim ::getCurrAnimNumber (mAWindow); if (num > 2) num += 1; float div = (ass->optionGetFanAngle () * 2) / 6; float startAng = -(ass->optionGetFanAngle ()) + (div * num); float currAng = getProgress () * startAng; float offset = (1 - getProgress ()) * (WIN_H (mWindow) / 2); if (num > 3) num += 1; if (num > 3) { mTransform.translate (WIN_X (mWindow) + WIN_W (mWindow) - offset, WIN_Y (mWindow) + WIN_H (mWindow), 0.0f); mTransform.rotate (currAng, 0.0f, 0.0f, 1.0f); mTransform.translate (-(WIN_X (mWindow) + WIN_W (mWindow) - offset), -(WIN_Y (mWindow) + WIN_H (mWindow)), 0.0f); } else { mTransform.translate (WIN_X (mWindow) + offset, WIN_Y (mWindow) + WIN_H (mWindow), 0.0f); mTransform.rotate (currAng, 0.0f, 0.0f, 1.0f); mTransform.translate (-(WIN_X (mWindow) + offset), -(WIN_Y (mWindow) + WIN_H (mWindow)), 0.0f); } } ./plugins/simple-animations/src/expand.cpp0000644000004100000410000000422213246301623021127 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "animationsim.h" // ===================== Effect: Expand ========================= void ExpandAnim::applyTransform () { GLMatrix *transform = &mTransform; float defaultXScale = 0.3f; float forwardProgress; float expandProgress; const float expandPhaseEnd = 0.5f; forwardProgress = getProgress (); if ((1 - forwardProgress) < expandPhaseEnd) expandProgress = (1 - forwardProgress) / expandPhaseEnd; else expandProgress = 1.0f; // animation movement transform->translate (WIN_X (mWindow) + WIN_W (mWindow) / 2.0f, WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f, 0.0f); transform->scale (defaultXScale + (1.0f - defaultXScale) * expandProgress, (1 - forwardProgress), 0.0f); transform->translate (-(WIN_X (mWindow) + WIN_W (mWindow) / 2.0f), -(WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f), 0.0f); } ./plugins/simple-animations/src/bounce.cpp0000644000004100000410000000452113246301623021125 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "animationsim.h" // ===================== Effect: Bounce ========================= float BounceAnim::getProgress () { return progressLinear (); } void BounceAnim::applyTransform () { float scale = 1.0f - (targetScale * (currBounceProgress) + currentScale * (1.0f - currBounceProgress)); float forwardProgress = getProgress ();; float forwardProgressInc = 1.0f / bounceCount; /* last bounce, enure we are going for 0.0 */ currBounceProgress = (((1 - forwardProgress) - lastProgressMax) / forwardProgressInc); if (currBounceProgress > 1.0f) { currentScale = targetScale; targetScale = -targetScale + targetScale / 2.0f; lastProgressMax = 1.0f - forwardProgress; currBounceProgress = 0.0f; nBounce++; } GLMatrix *transform = &mTransform; transform->translate (WIN_X (mWindow) + WIN_W (mWindow) / 2.0f, WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f, 0.0f); transform->scale (scale, scale, 1.0f); transform->translate (-(WIN_X (mWindow) + WIN_W (mWindow) / 2.0f), -(WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f), 0.0f); } ./plugins/simple-animations/src/rotatein.cpp0000644000004100000410000001245013246301623021477 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "animationsim.h" // ===================== Effect: RotateIn ========================= void RotateInAnim::applyTransform () { ANIMSIM_SCREEN (screen); GLMatrix *transform = &mTransform; float xRot, yRot; float angleX = 0, angleY = 0; float originX = 0, originY = 0; float forwardProgress; int direction = ass->optionGetRotateinDirection (); switch (direction) { case 1: angleX = 0; angleY = -ass->optionGetRotateinAngle (); originX = WIN_X (mWindow); originY = WIN_Y (mWindow) + WIN_H (mWindow); break; case 2: angleX = ass->optionGetRotateinAngle (); angleY = 0; originX = WIN_X (mWindow); originY = WIN_Y (mWindow); break; case 3: angleX = 0; angleY = ass->optionGetRotateinAngle (); originX = WIN_X (mWindow); originY = WIN_Y (mWindow); break; case 4: angleX = -ass->optionGetRotateinAngle (); angleY = 0; originX = WIN_X (mWindow) + WIN_W (mWindow); originY = WIN_Y (mWindow); break; } forwardProgress = getProgress (); xRot = (forwardProgress * angleX); yRot = (forwardProgress * angleY); transform->translate (WIN_X (mWindow) + WIN_W (mWindow) / 2.0f, WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f, 0.0f); perspectiveDistortAndResetZ (*transform); transform->translate (-(WIN_X (mWindow) + WIN_W (mWindow) / 2.0f), -(WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f), 0.0f); // animation movement transform->translate (originX, originY, 0.0f); transform->rotate (yRot, 1.0f, 0.0f, 0.0f); transform->rotate (xRot, 0.0f, 1.0f, 0.0f); transform->translate (-originX, -originY, 0.0f); } void RotateInAnim::prePaintWindow () { float forwardProgress = getProgress (); float xRot, yRot; float angleX = 0, angleY = 0; Bool xInvert = FALSE, yInvert = FALSE; int currentCull, invertCull; glGetIntegerv (GL_CULL_FACE_MODE, ¤tCull); invertCull = (currentCull == GL_BACK) ? GL_FRONT : GL_BACK; ANIMSIM_SCREEN (screen); int direction = ass->optionGetRotateinDirection (); switch (direction) { case 1: angleX = 0; angleY = -ass->optionGetRotateinAngle (); break; case 2: angleX = ass->optionGetRotateinAngle (); angleY = 0; break; case 3: angleX = 0; angleY = ass->optionGetRotateinAngle (); break; case 4: angleX = -ass->optionGetRotateinAngle (); angleY = 0; break; } /* FIXME: This could be fancy vectorial normal direction calculation */ xRot = fabs(fmodf(forwardProgress * angleX, 360.0f)); yRot = fabs(fmodf(forwardProgress * angleY, 360.0f)); if (xRot > 270.0f) xInvert = TRUE; if (yRot > 270.0f) yInvert = TRUE; if ((xInvert || yInvert) && !(xInvert && yInvert)) glCullFace (invertCull); } void RotateInAnim::postPaintWindow () { float forwardProgress = getProgress (); float xRot, yRot; float angleX = 0, angleY = 0; Bool xInvert = FALSE, yInvert = FALSE; int currentCull, invertCull; glGetIntegerv (GL_CULL_FACE_MODE, ¤tCull); invertCull = (currentCull == GL_BACK) ? GL_FRONT : GL_BACK; ANIMSIM_SCREEN (screen); int direction = ass->optionGetRotateinDirection (); switch (direction) { case 1: angleX = 0; angleY = -ass->optionGetRotateinAngle (); break; case 2: angleX = ass->optionGetRotateinAngle (); angleY = 0; break; case 3: angleX = 0; angleY = ass->optionGetRotateinAngle (); break; case 4: angleX = -ass->optionGetRotateinAngle (); angleY = 0; break; } /* FIXME: This could be fancy vectorial normal direction calculation */ xRot = fabs(fmodf(forwardProgress * angleX, 360.0f)); yRot = fabs(fmodf(forwardProgress * angleY, 360.0f)); if (xRot > 270.0f) xInvert = TRUE; if (yRot > 270.0f) yInvert = TRUE; /* We have to assume that invertCull will be * the actual inversion of our previous cull */ if ((xInvert || yInvert) && !(xInvert && yInvert)) glCullFace (invertCull); } ./plugins/simple-animations/src/pulse.cpp0000644000004100000410000000220613246301623021000 0ustar www-datawww-data#include "animationsim.h" /* Keep the "principal" window at 100% opacity, only fade out * the window that is "pulsing" away */ float PulseSingleAnim::getFadeProgress () { int num = MultiAnim ::getCurrAnimNumber (mAWindow); if (num == 1) return 1 - getProgress (); else return 0.0f; }; void PulseSingleAnim::applyTransform () { float scale = 1.0f + (1- getProgress ()); /* Add a bit of a "kick" for open, close, * minimize, unminimize, etc anims */ switch (mCurWindowEvent) { case WindowEventOpen: case WindowEventClose: case WindowEventMinimize: case WindowEventUnminimize: scale -= 0.2f; default: break; } if (MultiAnim ::getCurrAnimNumber (mAWindow) == 0) if (scale > 1.0f) scale = 1.0f; GLMatrix *transform = &mTransform; transform->translate (WIN_X (mWindow) + WIN_W (mWindow) / 2.0f, WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f, 0.0f); transform->scale (scale, scale, 1.0f); transform->translate (-(WIN_X (mWindow) + WIN_W (mWindow) / 2.0f), -(WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f), 0.0f); }./plugins/simple-animations/src/expand-piecewise.cpp0000644000004100000410000000743013246301623023106 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "animationsim.h" #define DELTA 0.0001f // ===================== Effect: ExpandPW ========================= void ExpandPWAnim::applyTransform () { ANIMSIM_SCREEN (screen); GLMatrix *transform = &mTransform; float forwardProgress = 1.0f - getProgress (); float initialXScale = ass->optionGetExpandpwInitialHoriz () / (float) mWindow->width (); float initialYScale = ass->optionGetExpandpwInitialVert () / (float) mWindow->height (); // animation movement transform->translate (WIN_X (mWindow) + WIN_W (mWindow) / 2.0f, WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f, 0.0f); float xScale; float yScale; float switchPointP; float switchPointN; float delay = ass->optionGetExpandpwDelay (); if (ass->optionGetExpandpwHorizFirst ()) { switchPointP = mWindow->width () / (float) (mWindow->width () + mWindow->height ()) + mWindow->height () / (float) (mWindow->width () + mWindow->height ()) * delay; switchPointN = mWindow->width () / (float) (mWindow->width () + mWindow->height ()) - mWindow->width () / (float) (mWindow->width () + mWindow->height ()) * delay; if(switchPointP >= 1.0f) switchPointP = 1.0f - DELTA; if(switchPointN <= 0.0f) switchPointN = 0.0f + DELTA; xScale = initialXScale + (1.0f - initialXScale) * (forwardProgress < switchPointN ? 1.0f - (switchPointN - forwardProgress)/switchPointN : 1.0f); yScale = initialYScale + (1.0f - initialYScale) * (forwardProgress > switchPointP ? (forwardProgress - switchPointP)/(1.0f-switchPointP) : 0.0f); } else { switchPointP = mWindow->height () / (float) (mWindow->width () + mWindow->height ()) + mWindow->width () / (float) (mWindow->width () + mWindow->height ()) * delay; switchPointN = mWindow->height () / (float) (mWindow->width () + mWindow->height ()) - mWindow->height () / (float) (mWindow->width () + mWindow->height ()) * delay; if(switchPointP >= 1.0f) switchPointP = 1.0f - DELTA; if(switchPointN <= 0.0f) switchPointN = 0.0f + DELTA; xScale = initialXScale + (1.0f - initialXScale) * (forwardProgress > switchPointP ? (forwardProgress - switchPointP)/(1.0f-switchPointP) : 0.0f); yScale = initialYScale + (1.0f - initialYScale) * (forwardProgress < switchPointN ? 1.0f - (switchPointN - forwardProgress)/switchPointN : 1.0f); } transform->scale (xScale, yScale, 0.0f); transform->translate (-(WIN_X (mWindow) + WIN_W (mWindow) / 2.0f), -(WIN_Y (mWindow) + WIN_H (mWindow) / 2.0f), 0.0f); } ./plugins/simple-animations/src/animationsim.cpp0000644000004100000410000001136513246301623022346 0ustar www-datawww-data/** * Example Animation extension plugin for compiz * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "animationsim.h" COMPIZ_PLUGIN_20090315 (animationsim, AnimSimPluginVTable); AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimSim animSimExtPluginInfo (CompString ("animationsim"), NUM_EFFECTS, animEffects, NULL, NUM_NONEFFECT_OPTIONS); ExtensionPluginInfo * BaseSimAnim::getExtensionPluginInfo () { return &animSimExtPluginInfo; } BaseSimAnim::BaseSimAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mCScreen (CompositeScreen::get (::screen)), mGScreen (GLScreen::get (::screen)) { } AnimEffect AnimEffectFlyIn; AnimEffect AnimEffectRotateIn; AnimEffect AnimEffectExpand; AnimEffect AnimEffectExpandPW; AnimEffect AnimEffectBounce; AnimEffect AnimEffectSheet; AnimEffect AnimEffectPulse; AnimEffect AnimEffectFan; void AnimSimScreen::initAnimationList () { int i = 0; AnimEffectUsedFor usedFor = AnimEffectUsedFor::all() .exclude(AnimEventFocus) .exclude(AnimEventShade); AnimEffectUsedFor openUsedFor = AnimEffectUsedFor::all() .exclude(AnimEventFocus) .exclude(AnimEventShade) .exclude(AnimEventMinimize) .exclude(AnimEventUnminimize); animEffects[i++] = AnimEffectFlyIn = new AnimEffectInfo ("animationsim:Fly In", usedFor, &createAnimation); animEffects[i++] = AnimEffectRotateIn = new AnimEffectInfo ("animationsim:Rotate In", usedFor, &createAnimation); animEffects[i++] = AnimEffectExpand = new AnimEffectInfo ("animationsim:Expand", usedFor, &createAnimation); animEffects[i++] = AnimEffectExpandPW = new AnimEffectInfo ("animationsim:Expand Piecewise", usedFor, &createAnimation); animEffects[i++] = AnimEffectBounce = new AnimEffectInfo ("animationsim:Bounce", openUsedFor, &createAnimation); animEffects[i++] = AnimEffectSheet = new AnimEffectInfo ("animationsim:Sheet", openUsedFor, &createAnimation); animEffects[i++] = AnimEffectPulse = new AnimEffectInfo ("animationsim:Pulse", openUsedFor, &createAnimation); animEffects[i++] = AnimEffectFan = new AnimEffectInfo ("animationsim:Fan", openUsedFor, &createAnimation); animSimExtPluginInfo.effectOptions = &getOptions (); AnimScreen *as = AnimScreen::get (::screen); // Extends animation plugin with this set of animation effects. as->addExtension (&animSimExtPluginInfo); } AnimSimScreen::AnimSimScreen (CompScreen *s) : //cScreen (CompositeScreen::get (s)), //gScreen (GLScreen::get (s)), //aScreen (as), PluginClassHandler (s), mOutput (s->fullscreenOutput ()) { initAnimationList (); } AnimSimScreen::~AnimSimScreen () { AnimScreen *as = AnimScreen::get (::screen); as->removeExtension (&animSimExtPluginInfo); for (int i = 0; i < NUM_EFFECTS; i++) { delete animEffects[i]; animEffects[i] = NULL; } } AnimSimWindow::AnimSimWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), aWindow (AnimWindow::get (w)) { } AnimSimWindow::~AnimSimWindow () { Animation *curAnim = aWindow->curAnimation (); if (!curAnim) return; // We need to interrupt and clean up the animation currently being played // by animationsim for this window (if any) if (curAnim->remainingTime () > 0 && curAnim->getExtensionPluginInfo ()->name == CompString ("animationsim")) { aWindow->postAnimationCleanUp (); } } bool AnimSimPluginVTable::init () { if (!CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) | !CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) | !CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) | !CompPlugin::checkPluginABI ("animation", ANIMATION_ABI)) return false; return true; } ./plugins/simple-animations/src/sheet.cpp0000644000004100000410000001626513246301623020772 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "animationsim.h" SheetAnim::SheetAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &minIcon) : Animation::Animation (w, curWindowEvent, duration, info, minIcon), BaseSimAnim::BaseSimAnim (w, curWindowEvent, duration, info, minIcon), GridAnim::GridAnim (w, curWindowEvent, duration, info, minIcon) { int maxWaves; float waveAmpMin, waveAmpMax; CompWindow *parent = 0; CompRect icon = minIcon; foreach (parent, screen->windows ()) { if (parent->transientFor () == w->id () && parent->id () != w->id ()) break; } if (parent) { icon.setX (WIN_X (parent) + WIN_W (parent) / 2.0f); icon.setY (WIN_Y (parent)); icon.setWidth (WIN_W (w)); } else { icon.setX (screen->width () / 2.0f); icon.setY (0.0f);; icon.setWidth (WIN_W (w)); } maxWaves = 0; waveAmpMin = 0.0f; waveAmpMax = 0.0f; if (maxWaves == 0) { sheetsWaveCount = 0; } else { // Initialize waves float distance = WIN_Y(w) + WIN_H(w) - icon.y (); sheetsWaveCount = 1 + (float)maxWaves *distance; if (sheetsWaves.empty ()) { sheetsWaves.resize (sheetsWaveCount); } // Compute wave parameters int ampDirection = (RAND_FLOAT() < 0.5 ? 1 : -1); float minHalfWidth = 0.22f; float maxHalfWidth = 0.38f; for (unsigned int i = 0; i < sheetsWaves.size (); i++) { sheetsWaves[i].amp = ampDirection * (waveAmpMax - waveAmpMin) * rand() / RAND_MAX + ampDirection * waveAmpMin; sheetsWaves[i].halfWidth = RAND_FLOAT() * (maxHalfWidth - minHalfWidth) + minHalfWidth; // avoid offset at top and bottom part by added waves float availPos = 1 - 2 * sheetsWaves[i].halfWidth; float posInAvailSegment = 0; if (i > 0) posInAvailSegment = (availPos / sheetsWaveCount) * rand() / RAND_MAX; sheetsWaves[i].pos = (posInAvailSegment + i * availPos / sheetsWaveCount + sheetsWaves[i].halfWidth); // switch wave direction ampDirection *= -1; } } } void SheetAnim::updateBB (CompOutput &output) { // TODO: Just consider the corner objects CompositeScreen::get (screen)->damageScreen (); // XXX: *COUGH!!!!* } void SheetAnim::step () { GridModel *model = mModel; CompRect &icon = mIcon; CompWindow *parent = 0; foreach (parent, screen->windows ()) { if (parent->transientFor () == mWindow->id () && parent->id () != mWindow->id ()) break; } if (parent) { icon.setX (WIN_X (parent) + WIN_W (parent) / 2.0f); icon.setY (WIN_Y (parent)); icon.setWidth (WIN_W (mWindow)); } else { icon.setX (screen->width () / 2.0f); icon.setY (0.0f);; icon.setWidth (WIN_W (mWindow)); } float forwardProgress = progressLinear (); if (sheetsWaveCount > 0 && sheetsWaves.empty ()) return; float iconCloseEndY; float iconFarEndY; float winFarEndY; float winVisibleCloseEndY; float winw = WIN_W(mWindow); float winh = WIN_H(mWindow); iconFarEndY = icon.y (); iconCloseEndY = icon.y () + icon.height (); winFarEndY = WIN_Y(mWindow) + winh; winVisibleCloseEndY = WIN_Y(mWindow); if (winVisibleCloseEndY < iconCloseEndY) winVisibleCloseEndY = iconCloseEndY; float preShapePhaseEnd = 0.22f; float preShapeProgress = 0; float postStretchProgress = 0; float stretchProgress = 0; float stretchPhaseEnd = preShapePhaseEnd + (1 - preShapePhaseEnd) * (iconCloseEndY - winVisibleCloseEndY) / ((iconCloseEndY - winFarEndY) + (iconCloseEndY - winVisibleCloseEndY)); if (stretchPhaseEnd < preShapePhaseEnd + 0.1) stretchPhaseEnd = preShapePhaseEnd + 0.1; if (forwardProgress < preShapePhaseEnd) { preShapeProgress = forwardProgress / preShapePhaseEnd; // Slow down "shaping" toward the end preShapeProgress = 1 - progressDecelerate (1 - preShapeProgress); } if (forwardProgress < preShapePhaseEnd) { stretchProgress = forwardProgress / stretchPhaseEnd; } else { if (forwardProgress < stretchPhaseEnd) { stretchProgress = forwardProgress / stretchPhaseEnd; } else { postStretchProgress = (forwardProgress - stretchPhaseEnd) / (1 - stretchPhaseEnd); } } GridModel::GridObject *object = mModel->objects (); unsigned int i; for (i = 0; i < mModel->numObjects (); i++, object++) { float origx = mWindow->x () + (winw * object->gridPosition ().x () - mWindow->output ().left) * model->scale ().x (); float origy = mWindow->y () + (winh * object->gridPosition ().y () - mWindow->output ().top) * model->scale ().y (); float icony = icon.y () + icon.height (); float stretchedPos; Point3d &objPos = object->position (); stretchedPos = object->gridPosition ().y () * origy + (1 - object->gridPosition ().y ()) * icony; // Compute current y position if (forwardProgress < preShapePhaseEnd) { objPos.setY ((1 - stretchProgress) * origy + stretchProgress * stretchedPos); } else { if (forwardProgress < stretchPhaseEnd) { objPos.setY ((1 - stretchProgress) * origy + stretchProgress * stretchedPos); } else { objPos.setY ((1 - postStretchProgress) * stretchedPos + postStretchProgress * (stretchedPos + (iconCloseEndY - winFarEndY))); } } // Compute "target shape" x position float yProgress = (iconCloseEndY - object->position ().y () ) / (iconCloseEndY - winFarEndY); float targetx = yProgress * (origx - icon.x ()) + icon.x () + icon.width () * (object->gridPosition ().x () - 0.5); // Compute current x position if (forwardProgress < preShapePhaseEnd) objPos.setX ((1 - preShapeProgress) * origx + preShapeProgress * targetx); else objPos.setX (targetx); if (object->position ().y () < iconFarEndY) objPos.setY (iconFarEndY); // No need to set object->position.z to 0, since they won't be used // due to modelAnimIs3D being FALSE for magic lamp. } } ./plugins/simple-animations/animationsim.xml.in0000644000004100000410000001426213246301623022201 0ustar www-datawww-data <_short>Simple Animations <_long>Animations that are simple on the eye Effects animation animation <_short>Effect Settings <_short>Fly In <_short>Rotate In <_short>Bounce <_short>Sheet <_short>Fan <_short>Expand Piecewise open_effects open_random_effects close_effects close_random_effects animationsim:Fly In <_name>Fly In animationsim:Bounce <_name>Bounce animationsim:Rotate In <_name>Rotate In animationsim:Sheet <_name>Sheet animationsim:Expand <_name>Expand animationsim:Expand Piecewise <_name>Expand Piecewise animationsim:Pulse <_name>Pulse animationsim:Fan <_name>Fan ./plugins/addhelper/0000755000004100000410000000000013246301623014654 5ustar www-datawww-data./plugins/addhelper/CMakeLists.txt0000644000004100000410000000015613246301623017416 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (addhelper PLUGINDEPS composite opengl) ./plugins/addhelper/addhelper.xml.in0000644000004100000410000000376213246301623017743 0ustar www-datawww-data <_short>Dim Inactive <_long>Make it slightly easier to concentrate by dimming all but the active window. Accessibility opengl composite opengl fade decor <_short>Bindings <_short>Misc. Options ./plugins/addhelper/src/0000755000004100000410000000000013246301623015443 5ustar www-datawww-data./plugins/addhelper/src/addhelper.h0000644000004100000410000000455313246301623017553 0ustar www-datawww-data/** * Compiz ADD Helper. Makes it easier to concentrate. * * addhelper.h * * Copyright (c) 2007 Kristian Lyngstøl * Ported and highly modified by Patrick Niklaus * Ported to compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This plugin provides a toggle-feature that dims all but the active * window. This makes it easier for people with lousy concentration * to focus. Like me. * * Please note any major changes to the code in this header with who you * are and what you did. * */ #include #include #include #include "addhelper_options.h" class AddScreen : public PluginClassHandler , public ScreenInterface, public AddhelperOptions { public: AddScreen (CompScreen *screen); CompositeScreen *cScreen; GLushort opacity; GLushort brightness; GLushort saturation; bool isToggle; void handleEvent (XEvent *event); void walkWindows (); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); void optionChanged (CompOption *options, AddhelperOptions::Options num); }; class AddWindow : public PluginClassHandler , public GLWindowInterface { public: AddWindow (CompWindow *window); ~AddWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool dim; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); }; class AddPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #define ADD_SCREEN(s) \ AddScreen *as = AddScreen::get (s) #define ADD_WINDOW(w) \ AddWindow *aw = AddWindow::get (w) ./plugins/addhelper/src/addhelper.cpp0000644000004100000410000001440513246301623020103 0ustar www-datawww-data/** * Compiz ADD Helper. Makes it easier to concentrate. * * addhelper.cpp * * Copyright (c) 2007 Kristian Lyngstøl * Ported and highly modified by Patrick Niklaus * Ported to compiz 0.9 by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This plugin provides a toggle-feature that dims all but the active * window. This makes it easier for people with lousy concentration * to focus. Like me. * * Please note any major changes to the code in this header with who you * are and what you did. * */ #include "addhelper.h" COMPIZ_PLUGIN_20090315 (addhelper, AddPluginVTable); /* Walk through all windows of the screen and adjust them if they * are not the active window. If reset is true, this will reset * the windows, including the active. Otherwise, it will dim * and reset the active. */ void AddScreen::walkWindows () { foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); if (!aw->dim) aw->cWindow->addDamage (); aw->dim = false; if (!isToggle) continue; if (w->id () == screen->activeWindow ()) continue; if (w->invisible () || w->destroyed () || !w->isMapped () || w->minimized ()) continue; if (!optionGetWindowTypes ().evaluate (w)) continue; aw->cWindow->addDamage (); aw->dim = true; } } /* Checks if the window is dimmed and, if so, paints it with the modified * paint attributes. */ bool AddWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { ADD_SCREEN (screen); if (dim) { /* copy the paint attribute */ GLWindowPaintAttrib wAttrib = attrib; /* applies the lowest value */ wAttrib.opacity = (MIN (attrib.opacity, as->opacity)); wAttrib.brightness = (MIN (attrib.brightness, as->brightness)); wAttrib.saturation = (MIN (attrib.saturation, as->saturation)); /* continue painting with the modified attribute */ return gWindow->glPaint (wAttrib, transform, region, mask); } else { /* the window is not dimmed, so it's painted normal */ return gWindow->glPaint (attrib, transform, region, mask); } } /* Takes the inital event. * This checks for focus change and acts on it. */ void AddScreen::handleEvent (XEvent *event) { Window active = screen->activeWindow (); screen->handleEvent (event); if (active != screen->activeWindow () && isToggle) walkWindows (); } /* Configuration, initialization, boring stuff. ----------------------- */ /* Takes the action and toggles us. */ bool AddScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { isToggle = !isToggle; if (isToggle) { walkWindows (); foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, true); } screen->handleEventSetEnabled (this, true); } else { foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, false); aw->cWindow->addDamage (); } screen->handleEventSetEnabled (this, false); } return true; } void AddScreen::optionChanged (CompOption *options, AddhelperOptions::Options num) { switch (num) { case AddhelperOptions::Brightness: brightness = (optionGetBrightness () * 0xffff) / 100; break; case AddhelperOptions::Saturation: saturation = (optionGetSaturation () * 0xffff) / 100; break; case AddhelperOptions::Opacity: opacity = (optionGetOpacity () * 0xffff) / 100; break; case AddhelperOptions::Ononinit: // <- Turn AddHelper on on initiation isToggle = optionGetOnoninit (); if (isToggle) { walkWindows (); foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, true); } screen->handleEventSetEnabled (this, true); } else { foreach (CompWindow *w, screen->windows ()) { ADD_WINDOW (w); aw->gWindow->glPaintSetEnabled (aw, false); } screen->handleEventSetEnabled (this, false); } break; default: break; } } AddWindow::AddWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), dim (false) { ADD_SCREEN (screen); GLWindowInterface::setHandler (gWindow, false); if (as->isToggle) { if (window->id () != screen->activeWindow () && !window->overrideRedirect ()) dim = true; gWindow->glPaintSetEnabled (this, true); } } AddWindow::~AddWindow () { if (dim) cWindow->addDamage (); } AddScreen::AddScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), opacity ((optionGetOpacity () * 0xffff) / 100), brightness ((optionGetBrightness () * 0xffff) / 100), saturation ((optionGetSaturation () * 0xffff) / 100), isToggle (optionGetOnoninit ()) { ScreenInterface::setHandler (screen, false); optionSetToggleKeyInitiate (boost::bind (&AddScreen::toggle, this, _1, _2, _3)); optionSetBrightnessNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); optionSetSaturationNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); optionSetOpacityNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); optionSetOnoninitNotify (boost::bind (&AddScreen::optionChanged, this, _1, _2)); } bool AddPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/wobbly/0000755000004100000410000000000013246301624014223 5ustar www-datawww-data./plugins/wobbly/CMakeLists.txt0000644000004100000410000000015213246301623016760 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(wobbly PLUGINDEPS composite opengl) ./plugins/wobbly/wobbly.xml.in0000644000004100000410000000701613246301623016653 0ustar www-datawww-data <_short>Wobbly Windows <_long>Use spring model for wobbly window effect Effects edgeresistance opengl decor composite opengl fade cube scale ./plugins/wobbly/src/0000755000004100000410000000000013246301624015012 5ustar www-datawww-data./plugins/wobbly/src/wobbly.cpp0000644000004100000410000013470613246301623017026 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Ported to GLVertexBuffer by Daniel van Vugt * Spring model implemented by Kristian Hogsberg. */ #include "wobbly.h" COMPIZ_PLUGIN_20090315 (wobbly, WobblyPluginVTable) const float MASS = 15.0f; const unsigned short EDGE_DISTANCE = 25; const unsigned short EDGE_VELOCITY = 13; void WobblyWindow::findNextWestEdge (Object *object) { int start = -65535; int end = 65535; int v1 = -65535; int v2 = 65535; int x = object->position.x + window->output ().left - window->border ().left; int output = ::screen->outputDeviceForPoint (x, object->position.y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.x1 (); if (x >= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->left.y - window->output ().top; e = p->struts ()->left.y + p->struts ()->left.height + window->output ().bottom; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().y () - p->border ().top - window->output ().top; e = p->geometry ().y () + p->height () + p->border ().bottom + window->output ().bottom; } else continue; if (s > object->position.y) { if (s < end) end = s; } else if (e < object->position.y) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->left.x + p->struts ()->left.width; else v = p->geometry ().x () + p->width () + p->border ().right; if (v <= x) { if (v > v1) v1 = v; } else if (v < v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 - window->output ().left + window->border ().left; v2 = v2 - window->output ().left + window->border ().left; if (v1 != (int) object->vertEdge.next) object->vertEdge.snapped = false; object->vertEdge.start = start; object->vertEdge.end = end; object->vertEdge.next = v1; object->vertEdge.prev = v2; object->vertEdge.attract = v1 + EDGE_DISTANCE; object->vertEdge.velocity = EDGE_VELOCITY; } void WobblyWindow::findNextEastEdge (Object *object) { int start = -65535; int end = 65535; int v1 = 65535; int v2 = -65535; int x = object->position.x - window->output ().right + window->border ().right; int output = ::screen->outputDeviceForPoint (x, object->position.y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.x2 (); if (x <= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->right.y - window->output ().top; e = p->struts ()->right.y + p->struts ()->right.height + window->output ().bottom; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().y () - p->border ().top - window->output ().top; e = p->geometry ().y () + p->height () + p->border ().bottom + window->output ().bottom; } else continue; if (s > object->position.y) { if (s < end) end = s; } else if (e < object->position.y) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->right.x; else v = p->geometry ().x () - p->border ().left; if (v >= x) { if (v < v1) v1 = v; } else if (v > v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 + window->output ().right - window->border ().right; v2 = v2 + window->output ().right - window->border ().right; if (v1 != (int) object->vertEdge.next) object->vertEdge.snapped = false; object->vertEdge.start = start; object->vertEdge.end = end; object->vertEdge.next = v1; object->vertEdge.prev = v2; object->vertEdge.attract = v1 - EDGE_DISTANCE; object->vertEdge.velocity = EDGE_VELOCITY; } void WobblyWindow::findNextNorthEdge (Object *object) { int start = -65535; int end = 65535; int v1 = -65535; int v2 = 65535; int y = object->position.y + window->output ().top - window->border ().top; int output = ::screen->outputDeviceForPoint (object->position.x, y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.y1 (); if (y >= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->top.x - window->output ().left; e = p->struts ()->top.x + p->struts ()->top.width + window->output ().right; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().x () - p->border ().left - window->output ().left; e = p->geometry ().x () + p->width () + p->border ().right + window->output ().right; } else continue; if (s > object->position.x) { if (s < end) end = s; } else if (e < object->position.x) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->top.y + p->struts ()->top.height; else v = p->geometry ().y () + p->height () + p->border ().bottom; if (v <= y) { if (v > v1) v1 = v; } else if (v < v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 - window->output ().top + window->border ().top; v2 = v2 - window->output ().top + window->border ().top; if (v1 != (int) object->horzEdge.next) object->horzEdge.snapped = false; object->horzEdge.start = start; object->horzEdge.end = end; object->horzEdge.next = v1; object->horzEdge.prev = v2; object->horzEdge.attract = v1 + EDGE_DISTANCE; object->horzEdge.velocity = EDGE_VELOCITY; } void WobblyWindow::findNextSouthEdge (Object *object) { int start = -65535; int end = 65535; int v1 = 65535; int v2 = -65535; int y = object->position.y - window->output ().bottom + window->border ().bottom; int output = ::screen->outputDeviceForPoint (object->position.x, y); const CompRect &workArea = ::screen->outputDevs ()[(unsigned) output].workArea (); int workAreaEdge = workArea.y2 (); if (y <= workAreaEdge) { int v, s, e; v1 = workAreaEdge; foreach (CompWindow *p, ::screen->windows ()) { if (window == p) continue; if (p->mapNum () && p->struts ()) { s = p->struts ()->bottom.x - window->output ().left; e = p->struts ()->bottom.x + p->struts ()->bottom.width + window->output ().right; } else if (!p->invisible () && (p->type () & SNAP_WINDOW_TYPE)) { s = p->geometry ().x () - p->border ().left - window->output ().left; e = p->geometry ().x () + p->width () + p->border ().right + window->output ().right; } else continue; if (s > object->position.x) { if (s < end) end = s; } else if (e < object->position.x) { if (e > start) start = e; } else { if (s > start) start = s; if (e < end) end = e; if (p->mapNum () && p->struts ()) v = p->struts ()->bottom.y; else v = p->geometry ().y () - p->border ().top; if (v >= y) { if (v < v1) v1 = v; } else if (v > v2) v2 = v; } } } else v2 = workAreaEdge; v1 = v1 + window->output ().bottom - window->border ().bottom; v2 = v2 + window->output ().bottom - window->border ().bottom; if (v1 != (int) object->horzEdge.next) object->horzEdge.snapped = false; object->horzEdge.start = start; object->horzEdge.end = end; object->horzEdge.next = v1; object->horzEdge.prev = v2; object->horzEdge.attract = v1 - EDGE_DISTANCE; object->horzEdge.velocity = EDGE_VELOCITY; } void Object::init (float positionX, float positionY, float velocityX, float velocityY) { force.x = 0; force.y = 0; position.x = positionX; position.y = positionY; velocity.x = velocityX; velocity.y = velocityY; theta = 0; immobile = false; edgeMask = 0; vertEdge.snapped = false; horzEdge.snapped = false; vertEdge.next = 0.0f; horzEdge.next = 0.0f; } void Spring::init (Object *newA, Object *newB, float newOffsetX, float newOffsetY) { a = newA; b = newB; offset.x = newOffsetX; offset.y = newOffsetY; } void Model::calcBounds () { topLeft.x = MAXSHORT; topLeft.y = MAXSHORT; bottomRight.x = MINSHORT; bottomRight.y = MINSHORT; Object *object = objects; for (int i = 0; i < numObjects; ++i, ++object) { if (topLeft.x > object->position.x) topLeft.x = object->position.x; else if (bottomRight.x < object->position.x) bottomRight.x = object->position.x; if (topLeft.y > object->position.y) topLeft.y = object->position.y; else if (bottomRight.y < object->position.y) bottomRight.y = object->position.y; } } void Model::addSpring (Object *a, Object *b, float offsetX, float offsetY) { Spring *spring; spring = &springs[numSprings]; ++numSprings; spring->init (a, b, offsetX, offsetY); } void Model::setMiddleAnchor (int x, int y, int width, int height) { float gx = ((GRID_WIDTH - 1) / 2 * width) / (float) (GRID_WIDTH - 1); float gy = ((GRID_HEIGHT - 1) / 2 * height) / (float) (GRID_HEIGHT - 1); if (anchorObject) anchorObject->immobile = false; anchorObject = &objects[GRID_WIDTH * ((GRID_HEIGHT - 1) / 2) + (GRID_WIDTH - 1) / 2]; anchorObject->position.x = x + gx; anchorObject->position.y = y + gy; anchorObject->immobile = true; } void Model::setTopAnchor (int x, int y, int width) { float gx = ((GRID_WIDTH - 1) / 2 * width) / (float) (GRID_WIDTH - 1); if (anchorObject) anchorObject->immobile = false; anchorObject = &objects[(GRID_WIDTH - 1) / 2]; anchorObject->position.x = x + gx; anchorObject->position.y = y; anchorObject->immobile = true; } void Model::addEdgeAnchors (int x, int y, int width, int height) { Object *o; o = &objects[0]; o->position.x = x; o->position.y = y; o->immobile = true; o = &objects[GRID_WIDTH - 1]; o->position.x = x + width; o->position.y = y; o->immobile = true; o = &objects[GRID_WIDTH * (GRID_HEIGHT - 1)]; o->position.x = x; o->position.y = y + height; o->immobile = true; o = &objects[numObjects - 1]; o->position.x = x + width; o->position.y = y + height; o->immobile = true; if (!anchorObject) anchorObject = &objects[0]; } void Model::removeEdgeAnchors (int x, int y, int width, int height) { Object *o; o = &objects[0]; o->position.x = x; o->position.y = y; if (o != anchorObject) o->immobile = false; o = &objects[GRID_WIDTH - 1]; o->position.x = x + width; o->position.y = y; if (o != anchorObject) o->immobile = false; o = &objects[GRID_WIDTH * (GRID_HEIGHT - 1)]; o->position.x = x; o->position.y = y + height; if (o != anchorObject) o->immobile = false; o = &objects[numObjects - 1]; o->position.x = x + width; o->position.y = y + height; if (o != anchorObject) o->immobile = false; } void Model::adjustObjectPosition (Object *object, int x, int y, int width, int height) { Object *o; int i = 0; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++i) { o = &objects[i]; if (o == object) { o->position.x = x + (gridX * width) / (GRID_WIDTH - 1); o->position.y = y + (gridY * height) / (GRID_HEIGHT - 1); return; } } } } void Model::initObjects (int x, int y, int width, int height) { float gw = GRID_WIDTH - 1; float gh = GRID_HEIGHT - 1; Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { object->init (x + (gridX * width) / gw, y + (gridY * height) / gh, 0, 0); } } setMiddleAnchor (x, y, width, height); } void WobblyWindow::updateModelSnapping () { unsigned int gridMask, mask; unsigned int edgeMask = model->edgeMask; if (model->snapCnt[North]) edgeMask &= ~SouthEdgeMask; else if (model->snapCnt[South]) edgeMask &= ~NorthEdgeMask; if (model->snapCnt[West]) edgeMask &= ~EastEdgeMask; else if (model->snapCnt[East]) edgeMask &= ~WestEdgeMask; Object *object = model->objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { if (gridY == 0) gridMask = edgeMask & NorthEdgeMask; else if (gridY == GRID_HEIGHT - 1) gridMask = edgeMask & SouthEdgeMask; else gridMask = 0; for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { mask = gridMask; if (gridX == 0) mask |= edgeMask & WestEdgeMask; else if (gridX == GRID_WIDTH - 1) mask |= edgeMask & EastEdgeMask; if (mask != object->edgeMask) { object->edgeMask = mask; if (mask & WestEdgeMask) { if (!object->vertEdge.snapped) findNextWestEdge (object); } else if (mask & EastEdgeMask) { if (!object->vertEdge.snapped) findNextEastEdge (object); } else object->vertEdge.snapped = false; if (mask & NorthEdgeMask) { if (!object->horzEdge.snapped) findNextNorthEdge (object); } else if (mask & SouthEdgeMask) { if (!object->horzEdge.snapped) findNextSouthEdge (object); } else object->horzEdge.snapped = false; } } } } void Model::reduceEdgeEscapeVelocity () { Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { if (object->vertEdge.snapped) object->vertEdge.velocity *= drand48 () * 0.25f; if (object->horzEdge.snapped) object->horzEdge.velocity *= drand48 () * 0.25f; } } } bool Model::disableSnapping () { bool snapped = false; Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { if (object->vertEdge.snapped || object->horzEdge.snapped) snapped = true; object->vertEdge.snapped = false; object->horzEdge.snapped = false; object->edgeMask = 0; } } memset (snapCnt, 0, sizeof (snapCnt)); return snapped; } void Model::adjustObjectsForShiver (int x, int y, int width, int height) { float vX, vY; float scale; float w = width; float h = height; Object *object = objects; for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++object) { if (!object->immobile) { vX = object->position.x - (x + w / 2); vY = object->position.y - (y + h / 2); vX /= w; vY /= h; scale = ((float) rand () * 7.5f) / RAND_MAX; object->velocity.x += vX * scale; object->velocity.y += vY * scale; } } } } void Model::initSprings (int x, int y, int width, int height) { int i = 0; numSprings = 0; float hpad = ((float) width) / (GRID_WIDTH - 1); float vpad = ((float) height) / (GRID_HEIGHT - 1); for (int gridY = 0; gridY < GRID_HEIGHT; ++gridY) { for (int gridX = 0; gridX < GRID_WIDTH; ++gridX, ++i) { if (gridX > 0) addSpring (&objects[i - 1], &objects[i], hpad, 0); if (gridY > 0) addSpring (&objects[i - GRID_WIDTH], &objects[i], 0, vpad); } } } void Model::move (float tx, float ty) { Object *object = objects; for (int i = 0; i < numObjects; ++i, ++object) { object->position.x += tx; object->position.y += ty; } } Model::Model (int x, int y, int width, int height, unsigned int edgeMask) : numObjects (GRID_WIDTH * GRID_HEIGHT), numSprings (0), anchorObject (0), steps (0), edgeMask (edgeMask) { objects = new Object [numObjects]; memset (snapCnt, 0, sizeof (snapCnt)); initObjects (x, y, width, height); initSprings (x, y, width, height); calcBounds (); } void Object::applyForce (float fx, float fy) { force.x += fx; force.y += fy; } void Spring::exertForces (float k) { Vector da, db; Vector &aPos = a->position; Vector &bPos = b->position; da.x = 0.5f * (bPos.x - aPos.x - offset.x); da.y = 0.5f * (bPos.y - aPos.y - offset.y); db.x = 0.5f * (aPos.x - bPos.x + offset.x); db.y = 0.5f * (aPos.y - bPos.y + offset.y); a->applyForce (k * da.x, k * da.y); b->applyForce (k * db.x, k * db.y); } bool WobblyWindow::objectReleaseWestEastEdge (Object *object, Direction dir) { if (fabs (object->velocity.x) > object->vertEdge.velocity) { object->position.x += object->velocity.x * 2.0f; --model->snapCnt[dir]; object->vertEdge.snapped = false; object->edgeMask = 0; updateModelSnapping (); return true; } object->velocity.x = 0.0f; return false; } bool WobblyWindow::objectReleaseNorthSouthEdge (Object *object, Direction dir) { if (fabs (object->velocity.y) > object->horzEdge.velocity) { object->position.y += object->velocity.y * 2.0f; --model->snapCnt[dir]; object->horzEdge.snapped = false; object->edgeMask = 0; updateModelSnapping (); return true; } object->velocity.y = 0.0f; return false; } float WobblyWindow::modelStepObject (Object *object, float friction, float *force) { object->theta += 0.05f; if (object->immobile) { object->velocity.x = 0.0f; object->velocity.y = 0.0f; object->force.x = 0.0f; object->force.y = 0.0f; *force = 0.0f; return 0.0f; } else { object->force.x -= friction * object->velocity.x; object->force.y -= friction * object->velocity.y; object->velocity.x += object->force.x / MASS; object->velocity.y += object->force.y / MASS; if (object->edgeMask) { if (object->edgeMask & WestEdgeMask) { if (object->position.y < object->vertEdge.start || object->position.y > object->vertEdge.end) findNextWestEdge (object); if (!object->vertEdge.snapped || objectReleaseWestEastEdge (object, West)) { object->position.x += object->velocity.x; if (object->velocity.x < 0.0f && object->position.x < object->vertEdge.attract) { if (object->position.x < object->vertEdge.next) { object->vertEdge.snapped = true; object->position.x = object->vertEdge.next; object->velocity.x = 0.0f; ++model->snapCnt[West]; updateModelSnapping (); } else { object->velocity.x -= object->vertEdge.attract - object->position.x; } } if (object->position.x > object->vertEdge.prev) findNextWestEdge (object); } } else if (object->edgeMask & EastEdgeMask) { if (object->position.y < object->vertEdge.start || object->position.y > object->vertEdge.end) findNextEastEdge (object); if (!object->vertEdge.snapped || objectReleaseWestEastEdge (object, East)) { object->position.x += object->velocity.x; if (object->velocity.x > 0.0f && object->position.x > object->vertEdge.attract) { if (object->position.x > object->vertEdge.next) { object->vertEdge.snapped = true; object->position.x = object->vertEdge.next; object->velocity.x = 0.0f; ++model->snapCnt[East]; updateModelSnapping (); } else { object->velocity.x = object->position.x - object->vertEdge.attract; } } if (object->position.x < object->vertEdge.prev) findNextEastEdge (object); } } else object->position.x += object->velocity.x; if (object->edgeMask & NorthEdgeMask) { if (object->position.x < object->horzEdge.start || object->position.x > object->horzEdge.end) findNextNorthEdge (object); if (!object->horzEdge.snapped || objectReleaseNorthSouthEdge (object, North)) { object->position.y += object->velocity.y; if (object->velocity.y < 0.0f && object->position.y < object->horzEdge.attract) { if (object->position.y < object->horzEdge.next) { object->horzEdge.snapped = true; object->position.y = object->horzEdge.next; object->velocity.y = 0.0f; ++model->snapCnt[North]; updateModelSnapping (); } else { object->velocity.y -= object->horzEdge.attract - object->position.y; } } if (object->position.y > object->horzEdge.prev) findNextNorthEdge (object); } } else if (object->edgeMask & SouthEdgeMask) { if (object->position.x < object->horzEdge.start || object->position.x > object->horzEdge.end) findNextSouthEdge (object); if (!object->horzEdge.snapped || objectReleaseNorthSouthEdge (object, South)) { object->position.y += object->velocity.y; if (object->velocity.y > 0.0f && object->position.y > object->horzEdge.attract) { if (object->position.y > object->horzEdge.next) { object->horzEdge.snapped = true; object->position.y = object->horzEdge.next; object->velocity.y = 0.0f; ++model->snapCnt[South]; updateModelSnapping (); } else { object->velocity.y = object->position.y - object->horzEdge.attract; } } if (object->position.y < object->horzEdge.prev) findNextSouthEdge (object); } } else object->position.y += object->velocity.y; } else { object->position.x += object->velocity.x; object->position.y += object->velocity.y; } *force = fabs (object->force.x) + fabs (object->force.y); object->force.x = 0.0f; object->force.y = 0.0f; return fabs (object->velocity.x) + fabs (object->velocity.y); } } unsigned int WobblyWindow::modelStep (float friction, float k, float time) { unsigned int wobbly = 0; float velocitySum = 0.0f; float force, forceSum = 0.0f; model->steps += time / 15.0f; int steps = floor (model->steps); model->steps -= steps; if (!steps) return WobblyInitialMask; for (int j = 0; j < steps; ++j) { for (int i = 0; i < model->numSprings; ++i) model->springs[i].exertForces (k); for (int i = 0; i < model->numObjects; ++i) { velocitySum += modelStepObject (&model->objects[i], friction, &force); forceSum += force; } } model->calcBounds (); if (velocitySum > 0.5f) wobbly |= WobblyVelocityMask; if (forceSum > 20.0f) wobbly |= WobblyForceMask; return wobbly; } void Model::bezierPatchEvaluate (float u, float v, float *patchX, float *patchY) { float coeffsU[4], coeffsV[4]; coeffsU[0] = (1 - u) * (1 - u) * (1 - u); coeffsU[1] = 3 * u * (1 - u) * (1 - u); coeffsU[2] = 3 * u * u * (1 - u); coeffsU[3] = u * u * u; coeffsV[0] = (1 - v) * (1 - v) * (1 - v); coeffsV[1] = 3 * v * (1 - v) * (1 - v); coeffsV[2] = 3 * v * v * (1 - v); coeffsV[3] = v * v * v; float x = 0.0f; float y = 0.0f; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { x += coeffsU[i] * coeffsV[j] * objects[j * GRID_WIDTH + i].position.x; y += coeffsU[i] * coeffsV[j] * objects[j * GRID_WIDTH + i].position.y; } } *patchX = x; *patchY = y; } bool WobblyWindow::ensureModel () { if (!model) { unsigned int edgeMask = 0; CompRect outRect (window->outputRect ()); if (window->type () & CompWindowTypeNormalMask) edgeMask = WestEdgeMask | EastEdgeMask | NorthEdgeMask | SouthEdgeMask; try { model = new Model (outRect.x (), outRect.y (), outRect.width (), outRect.height (), edgeMask); } catch (std::bad_alloc &) { return false; } } return true; } float Object::distanceToPoint (float x, float y) { float dx = position.x - x; float dy = position.y - y; return sqrt (dx * dx + dy * dy); } Object * Model::findNearestObject (float x, float y) { Object *object = &objects[0]; float distance, minDistance = 0.0; for (int i = 0; i < numObjects; ++i) { distance = objects[i].distanceToPoint (x, y); if (i == 0 || distance < minDistance) { minDistance = distance; object = &objects[i]; } } return object; } bool WobblyWindow::isWobblyWin () { if (model) return true; /* avoid tiny windows */ if (window->width () == 1 && window->height () == 1) return false; const CompWindow::Geometry &geom = window->geometry (); /* avoid fullscreen windows */ if (geom.x () <= 0 && geom.y () <= 0 && geom.x () + window->width () >= ::screen->width () && geom.y () + window->height () >= ::screen->height ()) return false; return true; } void WobblyScreen::preparePaint (int msSinceLastPaint) { if (wobblingWindowsMask & (WobblyInitialMask | WobblyVelocityMask)) { Point topLeft, bottomRight; float friction, springK; Model *model; friction = optionGetFriction (); springK = optionGetSpringK (); wobblingWindowsMask = false; foreach (CompWindow *w, ::screen->windows ()) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->wobblingMask) { if (ww->wobblingMask & (WobblyInitialMask | WobblyVelocityMask)) { model = ww->model; topLeft = model->topLeft; bottomRight = model->bottomRight; ww->wobblingMask = ww->modelStep (friction, springK, (ww->wobblingMask & (unsigned) WobblyVelocityMask) ? msSinceLastPaint : cScreen->redrawTime ()); if ((ww->state & MAXIMIZE_STATE) && ww->grabbed) ww->wobblingMask |= WobblyForceMask; if (ww->wobblingMask) { /* snapped to more than one edge, we have to reduce edge escape velocity until only one edge is snapped */ if (ww->wobblingMask == WobblyForceMask && !ww->grabbed) { ww->model->reduceEdgeEscapeVelocity (); ww->wobblingMask |= WobblyInitialMask; } if (!ww->grabbed && constraintBox) { float topmostYPos = MAXSHORT; float bottommostYPos = MINSHORT; for (int i = 0; i < GRID_WIDTH; ++i) { int modelY = model->objects[i].position.y; /* find the bottommost top-row object */ bottommostYPos = MAX (modelY, bottommostYPos); /* find the topmost top-row object */ topmostYPos = MIN (modelY, topmostYPos); } int decorTop = bottommostYPos + w->output ().top - w->border ().top; int decorTitleBottom = topmostYPos + w->output ().top; if (constraintBox->y () > decorTop) { /* constrain to work area box top edge */ model->move (0, constraintBox->y () - decorTop); model->calcBounds (); } else if (constraintBox->y2 () < decorTitleBottom) { /* constrain to work area box bottom edge */ model->move (0, constraintBox->y2 () - decorTitleBottom); model->calcBounds (); } } } else { ww->model = 0; if (w->geometry ().x () == w->serverX () && w->geometry ().y () == w->serverY ()) { w->move (model->topLeft.x + w->output ().left - w->geometry ().x (), model->topLeft.y + w->output ().top - w->geometry ().y (), true); } ww->model = model; } if (!(cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK)) { CompositeWindow *cw = CompositeWindow::get (w); if (ww->wobblingMask) { Point topLeft2 = ww->model->topLeft; Point bottomRight2 = ww->model->bottomRight; // Find the bounding box of the two rectangles if (topLeft.x > topLeft2.x) topLeft.x = topLeft2.x; if (topLeft.y > topLeft2.y) topLeft.y = topLeft2.y; if (bottomRight.x < bottomRight2.x) bottomRight.x = bottomRight2.x; if (bottomRight.y < bottomRight2.y) bottomRight.y = bottomRight2.y; } else cw->addDamage (); int wx = w->geometry ().x (); int wy = w->geometry ().y (); int borderWidth = w->geometry ().border (); // Damage a box that's 1-pixel larger on each side // to prevent artifacts topLeft.x -= 1; topLeft.y -= 1; bottomRight.x += 1; bottomRight.y += 1; topLeft.x -= wx + borderWidth; topLeft.y -= wy + borderWidth; bottomRight.x += 0.5f - (wx + borderWidth); bottomRight.y += 0.5f - (wy + borderWidth); cw->addDamageRect (CompRect (topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y)); } } if (!ww->wobblingMask) // Wobbling just finished for this window ww->enableWobbling (false); wobblingWindowsMask |= ww->wobblingMask; } } } cScreen->preparePaint (msSinceLastPaint); } void WobblyScreen::donePaint () { if (wobblingWindowsMask & (WobblyVelocityMask | WobblyInitialMask)) cScreen->damagePending (); if (!wobblingWindowsMask) { // Wobbling has finished for all windows cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); constraintBox = NULL; } cScreen->donePaint (); } void WobblyWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { CompRect outRect (window->outputRect ()); int wx = outRect.x (); int wy = outRect.y (); int width = outRect.width (); int height = outRect.height (); int gridW = width / wScreen->optionGetGridResolution (); if (gridW < wScreen->optionGetMinGridSize ()) gridW = wScreen->optionGetMinGridSize (); int gridH = height / wScreen->optionGetGridResolution (); if (gridH < wScreen->optionGetMinGridSize ()) gridH = wScreen->optionGetMinGridSize (); if (gridW > (int) maxGridWidth) gridW = (int) maxGridWidth; if (gridH > (int) maxGridHeight) gridH = (int) maxGridHeight; GLVertexBuffer *vb = gWindow->vertexBuffer (); int oldCount = vb->countVertices (); gWindow->glAddGeometry (matrix, region, clip, gridW, gridH); int newCount = vb->countVertices (); int stride = vb->getVertexStride (); GLfloat *v = vb->getVertices () + oldCount * stride; GLfloat *vMax = vb->getVertices () + newCount * stride; for (; v < vMax; v += stride) { float deformedX, deformedY; GLfloat normalizedX = (v[0] - wx) / width; GLfloat normalizedY = (v[1] - wy) / height; model->bezierPatchEvaluate (normalizedX, normalizedY, &deformedX, &deformedY); v[0] = deformedX; v[1] = deformedY; } } bool WobblyWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (wobblingMask) mask |= PAINT_WINDOW_TRANSFORMED_MASK; return gWindow->glPaint (attrib, transform, region, mask); } bool WobblyScreen::enableSnapping () { foreach (CompWindow *w, ::screen->windows ()) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->grabbed && ww->model) ww->updateModelSnapping (); } snapping = true; return false; } bool WobblyScreen::disableSnapping () { if (!snapping) return false; foreach (CompWindow *w, ::screen->windows ()) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->grabbed && ww->model && ww->model->disableSnapping ()) startWobbling (ww); } snapping = false; return false; } bool WobblyScreen::shiver (CompOption::Vector &options) { Window xid = (Window) CompOption::getIntOptionNamed (options, "window"); CompWindow *w = ::screen->findWindow (xid); if (w) { WobblyWindow *ww = WobblyWindow::get (w); if (ww->isWobblyWin () && ww->ensureModel ()) { CompRect outRect (w->serverOutputRect ()); ww->model->setMiddleAnchor (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); ww->model->adjustObjectsForShiver (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); startWobbling (ww); } } return false; } void WobblyWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyMap: if (model && isWobblyWin ()) initiateMapEffect (); break; default: break; } window->windowNotify (n); } void WobblyScreen::handleEvent (XEvent *event) { Window activeWindow = ::screen->activeWindow (); CompWindow *w; if (event->type == ::screen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; CompAction *action; unsigned int mods = 0xffffffff; action = &optionGetSnapKey (); bool inverted = optionGetSnapInverted (); if (action->type () & CompAction::BindingTypeKey) mods = action->key ().modifiers (); if ((stateEvent->mods & mods) == mods) { if (inverted) disableSnapping (); else enableSnapping (); } else { if (inverted) enableSnapping (); else disableSnapping (); } } } ::screen->handleEvent (event); switch (event->type) { case MotionNotify: if (event->xmotion.root == ::screen->root () && grabWindow && moveWindow && optionGetMaximizeEffect ()) { WobblyWindow *ww = WobblyWindow::get (grabWindow); if (ww && (ww->state & MAXIMIZE_STATE)) { if (ww->model && ww->grabbed) { int dx, dy; if (ww->state & CompWindowStateMaximizedHorzMask) dx = pointerX - lastPointerX; else dx = 0; if (ww->state & CompWindowStateMaximizedVertMask) dy = pointerY - lastPointerY; else dy = 0; ww->model->anchorObject->position.x += dx; ww->model->anchorObject->position.y += dy; startWobbling (ww); } } } break; default: break; } if (::screen->activeWindow () != activeWindow) { w = screen->findWindow (::screen->activeWindow ()); if (!w) return; WobblyWindow *ww = WobblyWindow::get (w); if (ww->isWobblyWin ()) { int focusEffect = optionGetFocusEffect (); if ((focusEffect != WobblyOptions::FocusEffectNone) && optionGetFocusWindowMatch ().evaluate (w) && ww->ensureModel ()) { switch (focusEffect) { case WobblyOptions::FocusEffectShiver: { CompRect outRect (w->serverOutputRect ()); ww->model->adjustObjectsForShiver (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } break; default: break; } startWobbling (ww); } } } } void WobblyWindow::enableWobbling (bool enabling) { gWindow->glPaintSetEnabled (this, enabling); gWindow->glAddGeometrySetEnabled (this, enabling); cWindow->damageRectSetEnabled (this, enabling); } void WobblyScreen::startWobbling (WobblyWindow *ww) { if (!ww->wobblingMask) ww->enableWobbling (true); if (!wobblingWindowsMask) { cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); } ww->wobblingMask |= WobblyInitialMask; wobblingWindowsMask |= ww->wobblingMask; cScreen->damagePending (); } bool WobblyWindow::damageRect (bool initial, const CompRect &rect) { if (!initial) if (wobblingMask == WobblyForceMask) { int x1 = model->topLeft.x; int y1 = model->topLeft.y; int x2 = model->bottomRight.x + 0.5f; int y2 = model->bottomRight.y + 0.5f; wScreen->cScreen->damageRegion (CompRegion (x1, y1, x2 - x1, y2 - y1)); return true; } return cWindow->damageRect (initial, rect); } void WobblyWindow::initiateMapEffect () { int mapEffect = wScreen->optionGetMapEffect (); if ((mapEffect != WobblyOptions::MapEffectNone) && wScreen->optionGetMapWindowMatch ().evaluate (window) && ensureModel ()) { CompRect outRect (window->outputRect ()); model->initObjects (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); model->initSprings (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); switch (mapEffect) { case WobblyOptions::MapEffectShiver: model->adjustObjectsForShiver (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); break; default: break; } wScreen->startWobbling (this); } } void WobblyWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { CompRect outRect (window->outputRect ()); if (wScreen->optionGetMaximizeEffect () && isWobblyWin () && /* prevent wobbling when shading maximized windows - assuming that the height difference shaded - non-shaded will hardly be -1 and a lack of wobbly animation in that corner case is tolerable */ (dheight != -1) && ((window->state () | state) & MAXIMIZE_STATE)) { state &= (unsigned)~MAXIMIZE_STATE; state |= window->state () & MAXIMIZE_STATE; if (ensureModel ()) { if (window->state () & MAXIMIZE_STATE) { if (!grabbed && model->anchorObject) { model->anchorObject->immobile = false; model->anchorObject = NULL; } model->addEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } else { model->removeEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); model->setMiddleAnchor (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } model->initSprings (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); wScreen->startWobbling (this); } } else if (model) { if (wobblingMask && !(state & MAXIMIZE_STATE)) model->setTopAnchor (outRect.x (), outRect.y (), outRect.width ()); else model->initObjects (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); model->initSprings (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } /* update grab */ if (model && grabbed) { if (model->anchorObject) model->anchorObject->immobile = false; model->anchorObject = model->findNearestObject (pointerX, pointerY); model->anchorObject->immobile = true; model->adjustObjectPosition (model->anchorObject, outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } window->resizeNotify (dx, dy, dwidth, dheight); } void WobblyWindow::moveNotify (int dx, int dy, bool immediate) { if (model) { if (grabbed && !immediate) { if (state & MAXIMIZE_STATE) { Object *object = model->objects; for (int i = 0; i < model->numObjects; ++i, ++object) { if (object->immobile) { object->position.x += dx; object->position.y += dy; } } } else { model->anchorObject->position.x += dx; model->anchorObject->position.y += dy; } wScreen->startWobbling (this); } else model->move (dx, dy); } window->moveNotify (dx, dy, immediate); } void WobblyWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { if (!wScreen->grabWindow) { wScreen->grabMask = mask; wScreen->grabWindow = window; } wScreen->moveWindow = false; if (mask & (CompWindowGrabButtonMask) && mask & (CompWindowGrabMoveMask) && wScreen->optionGetMoveWindowMatch ().evaluate (window) && isWobblyWin ()) { wScreen->moveWindow = true; if (ensureModel ()) { Spring *s; if (wScreen->optionGetMaximizeEffect ()) { CompRect outRect (window->outputRect ()); if (window->state () & MAXIMIZE_STATE) model->addEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); else { model->removeEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); if (model->anchorObject) model->anchorObject->immobile = false; } } else if (model->anchorObject) model->anchorObject->immobile = false; model->anchorObject = model->findNearestObject (x, y); model->anchorObject->immobile = true; grabbed = true; /* Update isConstrained and work area box at grab time */ wScreen->yConstrained = false; if (mask & CompWindowGrabExternalAppMask) { CompPlugin *pMove; pMove = CompPlugin::find ("move"); if (pMove) { CompOption::Vector &moveOptions = pMove->vTable->getOptions (); wScreen->yConstrained = CompOption::getBoolOptionNamed (moveOptions, "constrain_y", true); } } if (wScreen->yConstrained) { int output = ::screen->outputDeviceForGeometry (window->serverGeometry ()); wScreen->constraintBox = &::screen->outputDevs ()[output].workArea (); } if (mask & CompWindowGrabMoveMask) { model->disableSnapping (); if (wScreen->snapping) updateModelSnapping (); } if (wScreen->optionGetGrabWindowMatch ().evaluate (window)) { for (int i = 0; i < model->numSprings; ++i) { s = &model->springs[i]; if (s->a == model->anchorObject) { s->b->velocity.x -= s->offset.x * 0.05f; s->b->velocity.y -= s->offset.y * 0.05f; } else if (s->b == model->anchorObject) { s->a->velocity.x += s->offset.x * 0.05f; s->a->velocity.y += s->offset.y * 0.05f; } } wScreen->startWobbling (this); } } } window->grabNotify (x, y, state, mask); } void WobblyWindow::ungrabNotify () { if (window == wScreen->grabWindow) { wScreen->grabMask = 0; wScreen->grabWindow = NULL; wScreen->constraintBox = NULL; } if (grabbed) { if (model) { if (model->anchorObject) model->anchorObject->immobile = false; model->anchorObject = NULL; if (wScreen->optionGetMaximizeEffect () && (state & MAXIMIZE_STATE)) { CompRect outRect (window->outputRect ()); model->addEdgeAnchors (outRect.x (), outRect.y (), outRect.width (), outRect.height ()); } wScreen->startWobbling (this); } grabbed = false; } window->ungrabNotify (); } bool WobblyScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (wobblingWindowsMask) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void WobblyScreen::snapKeyChanged (CompOption *opt) { // ignore the key CompAction::KeyBinding newKeyBinding (0, opt->value ().action ().key ().modifiers ()); opt->value ().action ().setKey (newKeyBinding); } void WobblyScreen::snapInvertedChanged (CompOption *opt) { // ignore the key if (opt->value ().b ()) enableSnapping (); else disableSnapping (); } WobblyScreen::WobblyScreen (CompScreen *s) : PluginClassHandler (s), cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), wobblingWindowsMask (0), grabMask (0), grabWindow (NULL), moveWindow (false), snapping (false), yConstrained (false), constraintBox (NULL) { optionSetSnapKeyInitiate (boost::bind (&WobblyScreen::enableSnapping, this)); optionSetSnapKeyTerminate (boost::bind (&WobblyScreen::disableSnapping, this)); optionSetShiverInitiate (boost::bind (&WobblyScreen::shiver, this, _3)); optionSetSnapKeyNotify (boost::bind (&WobblyScreen::snapKeyChanged, _1)); optionSetSnapInvertedNotify (boost::bind (&WobblyScreen::snapInvertedChanged, this, _1)); ScreenInterface::setHandler (::screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } WobblyWindow::WobblyWindow (CompWindow *w) : PluginClassHandler (w), wScreen (WobblyScreen::get (::screen)), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), model (0), wobblingMask (0), grabbed (false), state (w->state ()) { if (((w->mapNum () && wScreen->optionGetMaximizeEffect ()) || wScreen->optionGetMapEffect () != WobblyOptions::MapEffectNone) && isWobblyWin ()) ensureModel (); WindowInterface::setHandler (window); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } WobblyWindow::~WobblyWindow () { if (wScreen->grabWindow == window) { wScreen->grabWindow = NULL; wScreen->grabMask = 0; } if (model) delete model; } Model::~Model () { delete[] objects; } bool WobblyPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/wobbly/src/wobbly.h0000644000004100000410000002261513246301623016466 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ /* * Spring model implemented by Kristian Hogsberg. */ #include #include #include #include #include #include "wobbly_options.h" #define SNAP_WINDOW_TYPE (CompWindowTypeNormalMask | \ CompWindowTypeToolbarMask | \ CompWindowTypeMenuMask | \ CompWindowTypeUtilMask) const unsigned short GRID_WIDTH = 4; const unsigned short GRID_HEIGHT = 4; const unsigned short MODEL_MAX_SPRINGS = (GRID_WIDTH * GRID_HEIGHT * 2); extern const float MASS; #define NorthEdgeMask (1L << 0) #define SouthEdgeMask (1L << 1) #define WestEdgeMask (1L << 2) #define EastEdgeMask (1L << 3) extern const unsigned short EDGE_DISTANCE; extern const unsigned short EDGE_VELOCITY; typedef enum { North = 0, South, West, East } Direction; #define WobblyInitialMask (1L << 0) #define WobblyForceMask (1L << 1) #define WobblyVelocityMask (1L << 2) class WobblyWindow; typedef struct _xy_pair { float x, y; } Point, Vector; typedef struct _Edge { float next, prev; float start; float end; float attract; float velocity; bool snapped; } Edge; class Object { public: Vector force; Point position; Vector velocity; float theta; bool immobile; unsigned int edgeMask; Edge vertEdge; Edge horzEdge; void init (float positionX, float positionY, float velocityX, float velocityY); void applyForce (float fx, float fy); float distanceToPoint (float x, float y); }; class Spring { public: Object *a; Object *b; Vector offset; void init (Object *newA, Object *newB, float newOffsetX, float newOffsetY); void exertForces (float k); }; class Model { public: Model (int x, int y, int width, int height, unsigned int edgeMask); ~Model (); void calcBounds (); void addSpring (Object *a, Object *b, float offsetX, float offsetY); void setMiddleAnchor (int x, int y, int width, int height); void setTopAnchor (int x, int y, int width); void addEdgeAnchors (int x, int y, int width, int height); void removeEdgeAnchors (int x, int y, int width, int height); void adjustObjectPosition (Object *object, int x, int y, int width, int height); void initObjects (int x, int y, int width, int height); void initSprings (int x, int y, int width, int height); void reduceEdgeEscapeVelocity (); bool disableSnapping (); void adjustObjectsForShiver (int x, int y, int width, int height); void move (float tx, float ty); void bezierPatchEvaluate (float u, float v, float *patchX, float *patchY); Object * findNearestObject (float x, float y); Object *objects; int numObjects; Spring springs[MODEL_MAX_SPRINGS]; int numSprings; Object *anchorObject; float steps; Point topLeft; Point bottomRight; unsigned int edgeMask; unsigned int snapCnt[4]; }; class WobblyScreen : public PluginClassHandler, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public WobblyOptions { public: WobblyScreen (CompScreen *s); bool enableSnapping (); bool disableSnapping (); bool shiver (CompOption::Vector &options); /// Start given window's wobbling void startWobbling (WobblyWindow *ww); // ScreenInterface methods void handleEvent (XEvent *event); // CompositeScreenInterface methods void preparePaint (int); void donePaint (); // GLScreenInterface methods bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); static void snapKeyChanged (CompOption *opt); void snapInvertedChanged (CompOption *opt); CompositeScreen *cScreen; GLScreen *gScreen; unsigned int wobblingWindowsMask; unsigned int grabMask; CompWindow *grabWindow; bool moveWindow; bool snapping; bool yConstrained; const CompRect *constraintBox; }; class WobblyWindow : public PluginClassHandler, public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: WobblyWindow (CompWindow *); ~WobblyWindow (); void findNextWestEdge (Object *object); void findNextEastEdge (Object *object); void findNextNorthEdge (Object *object); void findNextSouthEdge (Object *object); void updateModelSnapping (); bool objectReleaseWestEastEdge (Object *object, Direction dir); bool objectReleaseNorthSouthEdge (Object *object, Direction dir); float modelStepObject (Object *object, float friction, float *force); unsigned int modelStep (float friction, float k, float time); bool ensureModel (); bool isWobblyWin (); void enableWobbling (bool enabling); void initiateMapEffect (); // WindowInterface methods void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); void grabNotify (int x, int y, unsigned int state, unsigned int mask); void ungrabNotify (); void windowNotify (CompWindowNotify n); // CompositeWindowInterface methods bool damageRect (bool, const CompRect &); // GLWindowInterface methods bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void glAddGeometry (const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int = MAXSHORT, unsigned int = MAXSHORT); WobblyScreen *wScreen; CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; Model *model; unsigned int wobblingMask; bool grabbed; bool velocity; unsigned int state; }; class WobblyPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; /* TODO rm #define WIN_X(w) ((w)->attrib.x - (w)->output.left) #define WIN_Y(w) ((w)->attrib.y - (w)->output.top) #define WIN_W(w) ((w)->width + (w)->output.left + (w)->output.right) #define WIN_H(w) ((w)->height + (w)->output.top + (w)->output.bottom) #define WOBBLY_SCREEN_OPTION_FRICTION 0 #define WOBBLY_SCREEN_OPTION_SPRING_K 1 #define WOBBLY_SCREEN_OPTION_GRID_RESOLUTION 2 #define WOBBLY_SCREEN_OPTION_MIN_GRID_SIZE 3 #define WOBBLY_SCREEN_OPTION_MAP_EFFECT 4 #define WOBBLY_SCREEN_OPTION_FOCUS_EFFECT 5 #define WOBBLY_SCREEN_OPTION_MAP_WINDOW_MATCH 6 #define WOBBLY_SCREEN_OPTION_FOCUS_WINDOW_MATCH 7 #define WOBBLY_SCREEN_OPTION_GRAB_WINDOW_MATCH 8 #define WOBBLY_SCREEN_OPTION_MOVE_WINDOW_MATCH 9 #define WOBBLY_SCREEN_OPTION_MAXIMIZE_EFFECT 10 #define WOBBLY_SCREEN_OPTION_NUM 11 static CompMetadata wobblyMetadata; static int displayPrivateIndex; #define WOBBLY_DISPLAY_OPTION_SNAP_KEY 0 #define WOBBLY_DISPLAY_OPTION_SNAP_INVERTED 1 #define WOBBLY_DISPLAY_OPTION_SHIVER 2 #define WOBBLY_DISPLAY_OPTION_NUM 3 #define WOBBLY_EFFECT_NONE 0 #define WOBBLY_EFFECT_SHIVER 1 #define WOBBLY_EFFECT_LAST WOBBLY_EFFECT_SHIVER #define GET_WOBBLY_DISPLAY(d) \ ((WobblyDisplay *) (d)->base.privates[displayPrivateIndex].ptr) #define WOBBLY_DISPLAY(d) \ WobblyDisplay *wd = GET_WOBBLY_DISPLAY (d) #define GET_WOBBLY_SCREEN(s, wd) \ ((WobblyScreen *) (s)->base.privates[(wd)->screenPrivateIndex].ptr) #define WOBBLY_SCREEN(s) \ WobblyScreen *ws = GET_WOBBLY_SCREEN (s, GET_WOBBLY_DISPLAY (s->display)) #define GET_WOBBLY_WINDOW(w, ws) \ ((WobblyWindow *) (w)->base.privates[(ws)->windowPrivateIndex].ptr) #define WOBBLY_WINDOW(w) \ WobblyWindow *ww = GET_WOBBLY_WINDOW (w, \ GET_WOBBLY_SCREEN (w->screen, \ GET_WOBBLY_DISPLAY (w->screen->display))) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) */ ./plugins/crashhandler/0000755000004100000410000000000013246301623015362 5ustar www-datawww-data./plugins/crashhandler/CMakeLists.txt0000644000004100000410000000012513246301623020120 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (crashhandler) ./plugins/crashhandler/src/0000755000004100000410000000000013246301623016151 5ustar www-datawww-data./plugins/crashhandler/src/crashhandler.cpp0000644000004100000410000000646213246301623021323 0ustar www-datawww-data/* * * Compiz crash handler plugin * * crashhandler.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include "crashhandler.h" COMPIZ_PLUGIN_20090315 (crashhandler, CrashPluginVTable) static void crash_handler (int sig) { #ifndef PR_SET_PTRACER #define PR_SET_PTRACER 0x59616d61 #endif prctl (PR_SET_PTRACER, getpid (), 0, 0, 0); if (sig == SIGSEGV || sig == SIGFPE || sig == SIGILL || sig == SIGABRT) { CrashScreen *cs = CrashScreen::get (screen); static int count = 0; if (++count > 1 || !cs) exit (1); // backtrace char cmd[1024]; snprintf (cmd, 1024, "echo -e \"set prompt\nthread apply all bt full\n" "echo \\\\\\n\necho \\\\\\n\nbt\nquit\" > /tmp/gdb.tmp;" "gdb -q %s %i < /tmp/gdb.tmp | " "grep -v \"No symbol table\" | " "tee %s/compiz_crash-%i.out; rm -f /tmp/gdb.tmp; " "echo \"\n[CRASH_HANDLER]: " "\\\"%s/compiz_crash-%i.out\\\" created!\n\"", programName, getpid (), cs->optionGetDirectory ().c_str (), getpid (), cs->optionGetDirectory ().c_str (), getpid () ); int ret = system (cmd); if (cs->optionGetStartWm ()) { if (fork () == 0) { setsid (); putenv (const_cast (screen->displayString ())); execl ("/bin/sh", "/bin/sh", "-c", cs->optionGetWmCmd ().c_str (), NULL); exit (0); } } exit (ret ? ret : 1); } } void CrashScreen::optionChanged (CompOption *opt, CrashhandlerOptions::Options num) { switch (num) { case CrashhandlerOptions::Enabled: if (optionGetEnabled ()) { // enable crash handler signal (SIGSEGV, crash_handler); signal (SIGFPE, crash_handler); signal (SIGILL, crash_handler); signal (SIGABRT, crash_handler); } else { // disable crash handler signal (SIGSEGV, SIG_DFL); signal (SIGFPE, SIG_DFL); signal (SIGILL, SIG_DFL); signal (SIGABRT, SIG_DFL); } break; default: break; } } CrashScreen::CrashScreen (CompScreen *screen) : PluginClassHandler (screen), CrashhandlerOptions () { if (optionGetEnabled ()) { // segmentation fault signal (SIGSEGV, crash_handler); // floating point exception signal (SIGFPE, crash_handler); // illegal instruction signal (SIGILL, crash_handler); // abort signal (SIGABRT, crash_handler); } optionSetEnabledNotify ( boost::bind (&CrashScreen::optionChanged, this, _1, _2)); } CrashScreen::~CrashScreen () { signal (SIGSEGV, SIG_DFL); signal (SIGFPE, SIG_DFL); signal (SIGILL, SIG_DFL); signal (SIGABRT, SIG_DFL); } bool CrashPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/crashhandler/src/crashhandler.h0000644000004100000410000000222013246301623020754 0ustar www-datawww-data/* * * Compiz crash handler plugin * * crashhandler.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include "crashhandler_options.h" #include class CrashScreen : public PluginClassHandler, public CrashhandlerOptions { public: CrashScreen (CompScreen *screen); ~CrashScreen (); void optionChanged (CompOption *opt, CrashhandlerOptions::Options num); }; class CrashPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/crashhandler/crashhandler.xml.in0000644000004100000410000000211713246301623021150 0ustar www-datawww-data <_short>Crash handler <_long>Compiz crash handler plugin Utility <_short>Main ./plugins/group/0000755000004100000410000000000013246301623014060 5ustar www-datawww-data./plugins/group/CMakeLists.txt0000644000004100000410000000023213246301623016615 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (group PLUGINDEPS opengl composite text mousepoll PKGDEPS cairo cairo-xlib-xrender) ./plugins/group/src/0000755000004100000410000000000013246301624014650 5ustar www-datawww-data./plugins/group/src/init.cpp0000644000004100000410000004352513246301623016327 0ustar www-datawww-data/** * * Compiz group plugin * * init.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" COMPIZ_PLUGIN_20090315 (group, GroupPluginVTable); /* If this is false, then there is no point in trying to render text * since it will fail */ bool gTextAvailable; /* * GroupScreen::optionChanged * * An option was just changed. Since we aren't constantly re-rendering * things like glow, the tab bar, the font, etc, we need to re-render * applicable things */ void GroupScreen::optionChanged (CompOption *opt, Options num) { GroupSelection *group; switch (num) { case GroupOptions::TabBaseColor: case GroupOptions::TabHighlightColor: case GroupOptions::TabBorderColor: case GroupOptions::TabStyle: case GroupOptions::BorderRadius: case GroupOptions::BorderWidth: foreach (group, mGroups) if (group->mTabBar) group->mTabBar->mBgLayer->render (); break; case GroupOptions::TabbarFontSize: case GroupOptions::TabbarFontColor: foreach (group, mGroups) if (group->mTabBar) { group->mTabBar->mTextLayer = TextLayer::rebuild (group->mTabBar->mTextLayer); if (group->mTabBar->mTextLayer) group->mTabBar->mTextLayer->render (); } break; case GroupOptions::ThumbSize: case GroupOptions::ThumbSpace: foreach (group, mGroups) if (group->mTabBar) { CompRect box = group->mTabBar->mRegion.boundingRect (); group->mTabBar->recalcTabBarPos ( (box.x1 () + box.x2 ()) / 2, box.x1 (), box.x2 ()); } break; case GroupOptions::Glow: case GroupOptions::GlowSize: { /* We have new output extents, so update them * and damage them */ foreach (CompWindow *w, screen->windows ()) { GROUP_WINDOW (w); GLTexture::Matrix tMat = mGlowTexture.at (0)->matrix (); gw->computeGlowQuads (&tMat); if (gw->mGlowQuads) { gw->cWindow->damageOutputExtents (); gw->window->updateWindowOutputExtents (); gw->cWindow->damageOutputExtents (); } } break; } case GroupOptions::GlowType: { int glowType; GlowTextureProperties *glowProperty; /* Since we have a new glow texture, we have to rebind * it and recalculate it */ glowType = optionGetGlowType (); glowProperty = &mGlowTextureProperties[glowType]; mGlowTexture = GLTexture::imageDataToTexture ( glowProperty->textureData, CompSize (glowProperty->textureSize, glowProperty->textureSize), GL_RGBA, GL_UNSIGNED_BYTE); if (optionGetGlow () && !mGroups.empty ()) { foreach (CompWindow *w, screen->windows ()) { GLTexture::Matrix tMat = mGlowTexture.at (0)->matrix (); GroupWindow::get (w)->computeGlowQuads (&tMat); } cScreen->damageScreen (); } break; } case GroupOptions::MoveAll: case GroupOptions::ResizeAll: case GroupOptions::MinimizeAll: case GroupOptions::ShadeAll: case GroupOptions::MaximizeUnmaximizeAll: case GroupOptions::RaiseAll: foreach (GroupSelection *group, mGroups) foreach (CompWindow *w, group->mWindows) GroupWindow::get (w)->checkFunctions (); break; default: break; } } /* * GroupScreen::applyInitialActions * * timer callback for stuff that needs to be called after all * screens and windows are initialized * */ bool GroupScreen::applyInitialActions () { CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); /* we need to do it from top to buttom of the stack to avoid problems with a reload of Compiz and tabbed static groups. (topTab will always be above the other windows in the group) */ while (rit != screen->windows ().rend ()) { CompWindow *w = *rit; GROUP_WINDOW (w); /* Otherwise, add this window to a group on it's own if we are * auto-tabbing */ if (optionGetAutotabCreate () && gw->isGroupWindow ()) { if (!gw->mGroup && (gw->mWindowState == GroupWindow::WindowNormal)) { GroupSelection *g; mTmpSel.clear (); mTmpSel.select (w); g = mTmpSel.toGroup (); if (g) g->tabGroup (w); } } ++rit; } return false; } /* * GroupScreen::checkFunctions * * Checks to enable and disable interfaced functions in GroupScreen * if we do or don't need them. Keeping them enabled costs CPU usage * so do this only when needed * */ #define HANDLE_EVENT (1 << 0) #define GL_PAINT_OUTPUT (1 << 1) #define GL_PAINT_TRANSFORMED_OUTPUT (1 << 2) #define PREPARE_PAINT (1 << 3) #define DONE_PAINT (1 << 4) void GroupScreen::checkFunctions () { unsigned long functionsMask = 0; /* We need to enable our output paint hook if we are * -> Painting a selection rect * -> Painting a dragged tab * -> We have some groups AND * -> There is a "stretched window" OR * -> We are doing the tab change animation OR * -> We are doing the tabbing/untabbing animation OR * -> We are painting the tab bar * (Since we need to enable the * PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK which * allows for matrix transformation of windows) */ if (mGrabState == GroupScreen::ScreenGrabSelect || mGrabState == GroupScreen::ScreenGrabTabDrag) functionsMask |= (GL_PAINT_OUTPUT | GL_PAINT_TRANSFORMED_OUTPUT); else if (!mGroups.empty ()) { foreach (GroupSelection *group, mGroups) { if ((group->mTabbingState != GroupSelection::NoTabbing) || (group->mTabBar && (group->mTabBar->mChangeState == GroupTabBar::NoTabChange || group->mTabBar->mState != PaintOff)) || group->mResizeInfo) { functionsMask |= (GL_PAINT_OUTPUT | GL_PAINT_TRANSFORMED_OUTPUT); break; } } } /* We need to enable preparePaint if: * -> There is an animation going on * -> There is a tab bar with slots visible and a dragged slot * (since this creates forces on the other slots) * * enabling preparePaint implicitly enabled donePaint * */ foreach (GroupSelection *group, mGroups) { if ((group->mTabbingState != GroupSelection::NoTabbing) || (group->mTabBar && (group->mTabBar->mChangeState != GroupTabBar::NoTabChange || (group->mTabBar->mState == PaintFadeIn || group->mTabBar->mState == PaintFadeOut) || (group->mTabBar->mTextLayer && (group->mTabBar->mTextLayer->mState == PaintFadeIn || group->mTabBar->mTextLayer->mState == PaintFadeOut)) || (group->mTabBar->mBgLayer && group->mTabBar->mBgLayer->mBgAnimation) || (group->mTabBar->mSlots.size () && mDraggedSlot)))) { functionsMask |= (PREPARE_PAINT | DONE_PAINT); break; } } cScreen->preparePaintSetEnabled (this, functionsMask & PREPARE_PAINT); cScreen->donePaintSetEnabled (this, functionsMask & DONE_PAINT); gScreen->glPaintOutputSetEnabled (this, functionsMask & GL_PAINT_OUTPUT); gScreen->glPaintTransformedOutputSetEnabled (this, functionsMask & GL_PAINT_TRANSFORMED_OUTPUT); } /* * GroupScreen::GroupScreen * * Constructor for GroupScreen. Set up atoms, glow texture, queues, etc * */ GroupScreen::GroupScreen (CompScreen *s) : PluginClassHandler (s), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mIgnoreMode (false), mGlowTextureProperties ((GlowTextureProperties *) glowTextureProperties), mLastRestackedGroup (NULL), mResizeNotifyAtom (XInternAtom (screen->dpy (), "_COMPIZ_RESIZE_NOTIFY", 0)), mPendingMoves (NULL), mPendingGrabs (NULL), mPendingUngrabs (NULL), mQueued (false), mGrabState (ScreenGrabNone), mGrabIndex (0), mLastHoveredGroup (NULL), mDraggedSlot (NULL), mDragged (false), mPrevX (0), mPrevY (0), mLastGrabbedWindow (None) { ScreenInterface::setHandler (screen); GLScreenInterface::setHandler (gScreen, false); CompositeScreenInterface::setHandler (cScreen); int glowType = optionGetGlowType (); boost::function oSetCb = boost::bind (&GroupScreen::optionChanged, this, _1, _2); /* one-shot timeout for stuff that needs to be initialized after all screens and windows are initialized */ mInitialActionsTimeoutHandle.start (boost::bind ( &GroupScreen::applyInitialActions, this), 0, 0); mDequeueTimeoutHandle.setCallback (boost::bind ( &GroupScreen::dequeueTimer, this)); mDequeueTimeoutHandle.setTimes (0, 0); /* Bind the glow texture now */ mGlowTexture = GLTexture::imageDataToTexture (mGlowTextureProperties[glowType].textureData, CompSize (mGlowTextureProperties[glowType].textureSize, mGlowTextureProperties[glowType].textureSize), GL_RGBA, GL_UNSIGNED_BYTE); /* Set option callback code */ optionSetTabHighlightColorNotify (oSetCb); optionSetTabBaseColorNotify (oSetCb); optionSetTabBorderColorNotify (oSetCb); optionSetTabbarFontSizeNotify (oSetCb); optionSetTabbarFontColorNotify (oSetCb); optionSetGlowNotify (oSetCb); optionSetGlowTypeNotify (oSetCb); optionSetGlowSizeNotify (oSetCb); optionSetTabStyleNotify (oSetCb); optionSetThumbSizeNotify (oSetCb); optionSetThumbSpaceNotify (oSetCb); optionSetBorderWidthNotify (oSetCb); optionSetBorderRadiusNotify (oSetCb); optionSetSelectButtonInitiate (boost::bind (&GroupScreen::select, this, _1, _2, _3)); optionSetSelectButtonTerminate (boost::bind (&GroupScreen::selectTerminate, this, _1, _2, _3)); optionSetSelectSingleKeyInitiate (boost::bind (&GroupScreen::selectSingle, this, _1, _2, _3)); optionSetGroupKeyInitiate (boost::bind (&GroupScreen::groupWindows, this, _1, _2, _3)); optionSetUngroupKeyInitiate (boost::bind (&GroupScreen::ungroupWindows, this, _1, _2, _3)); optionSetTabmodeKeyInitiate (boost::bind (&GroupScreen::initTab, this, _1, _2, _3)); optionSetChangeTabLeftKeyInitiate (boost::bind (&GroupScreen::changeTabLeft, this, _1, _2, _3)); optionSetChangeTabRightKeyInitiate (boost::bind (&GroupScreen::changeTabRight, this, _1, _2, _3)); optionSetRemoveKeyInitiate (boost::bind (&GroupScreen::removeWindow, this, _1, _2, _3)); optionSetCloseKeyInitiate (boost::bind (&GroupScreen::closeWindows, this, _1, _2, _3)); optionSetIgnoreKeyInitiate (boost::bind (&GroupScreen::setIgnore, this, _1, _2, _3)); optionSetIgnoreKeyTerminate (boost::bind (&GroupScreen::unsetIgnore, this, _1, _2, _3)); optionSetChangeColorKeyInitiate (boost::bind (&GroupScreen::changeColor, this, _1, _2, _3)); } /* * GroupScreen::~GroupScreen * * Screen properties tear-down, delete all the groups, destroy IPWs * etc * */ GroupScreen::~GroupScreen () { if (mGroups.size ()) { GroupSelection *group; GroupSelection::List::reverse_iterator rit = mGroups.rbegin (); while (rit != mGroups.rend ()) { group = *rit; group->mWindows.clear (); group->mWindowIds.clear (); if (group->mTabBar) { std::list ::reverse_iterator rit = group->mTabBar->mSlots.rbegin (); /* We need to delete the slots first since otherwise * the tab bar will automatically try to change to * the next slot after the one that was deleted, but * it can't since we have already deleted all of our * window structures */ while (rit != group->mTabBar->mSlots.rend ()) { GroupTabBarSlot *slot = *rit; delete slot; --rit; } group->mTabBar->mSlots.clear (); delete group->mTabBar; } delete group; ++rit; } } mTmpSel.clear (); if (mGrabIndex) grabScreen (ScreenGrabNone); if (mDragHoverTimeoutHandle.active ()) mDragHoverTimeoutHandle.stop (); if (mShowDelayTimeoutHandle.active ()) mShowDelayTimeoutHandle.stop (); if (mDequeueTimeoutHandle.active ()) mDequeueTimeoutHandle.stop (); if (mInitialActionsTimeoutHandle.active ()) mInitialActionsTimeoutHandle.stop (); } /* * GroupWindow::checkFunctions * * Function to check if we need to enable any of our wrapped * functions. * */ #define GL_PAINT (1 << 0) #define GL_DRAW (1 << 1) #define DAMAGE_RECT (1 << 2) #define GET_OUTPUT_EXTENTS (1 << 3) #define MOVE_NOTIFY (1 << 4) #define RESIZE_NOTIFY (1 << 5) #define GRAB_NOTIFY (1 << 6) #define WINDOW_NOTIFY (1 << 7) #define STATECHANGE_NOTIFY (1 << 8) #define ACTIVATE_NOTIFY (1 << 9) void GroupWindow::checkFunctions () { unsigned long functionsMask = 0; GROUP_SCREEN (screen); /* For glPaint, the window must either be: * -> In an animation (eg rotating, tabbing, etc) * -> Having its tab bar shown * -> "Selected" (but not yet grouped) * -> Being Stretched * -> Have a hide info struct (since we need to hide the window) */ if (checkRotating () || checkTabbing () || checkShowTabBar () || !mResizeGeometry.isEmpty () || mWindowHideInfo || mInSelection) functionsMask |= GL_PAINT; /* For glDraw, the window must be: * -> Window must be in a group * -> Window must have glow quads */ if (mGroup && (mGroup->mWindows.size () > 1) && mGlowQuads) functionsMask |= (GL_DRAW | GET_OUTPUT_EXTENTS); /* For damageRect, the window must be: * -> Non empty resize rectangle (we need to update the resize * rect region of this window) * -> Have a slot (we need to damage the slot area) * Strictly speaking, we also use damageRect to check for initial * damages (for when a window was first painted on screen), but * since we don't start checking functions until after that happens * we dont need to worry about this case here) */ if (mSlot || !mResizeGeometry.isEmpty ()) functionsMask |= DAMAGE_RECT; /* For the various notification functions, the window * needs to be in a group, but we should disable them * if the options say we don't need to handle that particular * funciton */ if (mGroup) { /* Even if we are not resizing all windows we still need * to recalc the tab bar position anyways, so do that */ if (gs->optionGetResizeAll () || (mGroup->mTabBar && IS_TOP_TAB (window, mGroup))) functionsMask |= RESIZE_NOTIFY; if (mGlowQuads || gs->optionGetMoveAll () || (mGroup->mTabBar && IS_TOP_TAB (window, mGroup))) functionsMask |= MOVE_NOTIFY; if (gs->optionGetMaximizeUnmaximizeAll ()) functionsMask |= STATECHANGE_NOTIFY; if (gs->optionGetRaiseAll ()) functionsMask |= ACTIVATE_NOTIFY; functionsMask |= WINDOW_NOTIFY; } gWindow->glPaintSetEnabled (this, functionsMask & GL_PAINT); gWindow->glDrawSetEnabled (this, functionsMask & GL_DRAW); cWindow->damageRectSetEnabled (this, functionsMask & DAMAGE_RECT); window->getOutputExtentsSetEnabled (this, functionsMask & GET_OUTPUT_EXTENTS); window->resizeNotifySetEnabled (this, functionsMask & RESIZE_NOTIFY); window->moveNotifySetEnabled (this, functionsMask & MOVE_NOTIFY); window->stateChangeNotifySetEnabled (this, functionsMask & STATECHANGE_NOTIFY); window->activateSetEnabled (this, functionsMask & ACTIVATE_NOTIFY); window->windowNotifySetEnabled (this, functionsMask & WINDOW_NOTIFY); } /* * GroupWindow::GroupWindow * * Constructor for GroupWindow, set up the hide info, animation state * resize geometry, glow quads etc * */ GroupWindow::GroupWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), mGroup (NULL), mInSelection (false), mSlot (NULL), mNeedsPosSync (false), mGlowQuads (NULL), mWindowHideInfo (NULL), mResizeGeometry (CompRect (0, 0, 0, 0)), mAnimateState (0), mTx (0.0f), mTy (0.0f), mXVelocity (0.0f), mYVelocity (0.0f) { GLTexture::Matrix mat; GROUP_SCREEN (screen); mat = gs->mGlowTexture.front ()->matrix (); WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, true); GLWindowInterface::setHandler (gWindow, false); window->grabNotifySetEnabled (this, true); window->ungrabNotifySetEnabled (this, true); mOrgPos = CompPoint (0, 0); mMainTabOffset = CompPoint (0, 0); mDestination = CompPoint (0, 0); if (w->minimized ()) mWindowState = WindowMinimized; else if (w->shaded ()) mWindowState = WindowShaded; else mWindowState = WindowNormal; computeGlowQuads (&mat); } /* * GroupWindow::~GroupWindow * * Tear down for when we don't need group data on a window anymore * */ GroupWindow::~GroupWindow () { if (mWindowHideInfo) setWindowVisibility (true); if (mGlowQuads) delete[] mGlowQuads; } bool GroupPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) gTextAvailable = true; else gTextAvailable = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } ./plugins/group/src/queues.cpp0000644000004100000410000001072013246301623016662 0ustar www-datawww-data/** * * Compiz group plugin * * queues.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * functions enqueuing pending notifies * */ /* forward declaration */ void GroupWindow::enqueueMoveNotify (int dx, int dy, bool immediate, bool sync) { GroupWindow::PendingMoves *move; GROUP_SCREEN (screen); move = new GroupWindow::PendingMoves; if (!move) return; move->w = window; move->dx = dx; move->dy = dy; move->immediate = immediate; move->sync = sync; move->next = NULL; if (gs->mPendingMoves) { GroupWindow::PendingMoves *temp; for (temp = gs->mPendingMoves; temp->next; temp = temp->next); temp->next = move; } else gs->mPendingMoves = move; if (!gs->mDequeueTimeoutHandle.active ()) { gs->mDequeueTimeoutHandle.start (); } } void GroupScreen::dequeueSyncs (GroupWindow::PendingSyncs *syncs) { GroupWindow::PendingSyncs *sync; while (syncs) { sync = syncs; syncs = sync->next; GROUP_WINDOW (sync->w); if (gw->mNeedsPosSync) { gw->mNeedsPosSync = false; } delete sync; } } void GroupScreen::dequeueMoveNotifies () { GroupWindow::PendingMoves *move; GroupWindow::PendingSyncs *syncs = NULL, *sync; mQueued = true; while (mPendingMoves) { move = mPendingMoves; mPendingMoves = move->next; move->w->move (move->dx, move->dy, move->immediate); if (move->sync) { sync = new GroupWindow::PendingSyncs; if (sync) { GROUP_WINDOW (move->w); gw->mNeedsPosSync = true; sync->w = move->w; sync->next = syncs; syncs = sync; } } delete move; } if (syncs) { dequeueSyncs (syncs); } mQueued = false; } void GroupWindow::enqueueGrabNotify (int x, int y, unsigned int state, unsigned int mask) { GroupWindow::PendingGrabs *grab; GROUP_SCREEN (screen); grab = new GroupWindow::PendingGrabs; if (!grab) return; grab->w = window; grab->x = x; grab->y = y; grab->state = state; grab->mask = mask; grab->next = NULL; if (gs->mPendingGrabs) { GroupWindow::PendingGrabs *temp; for (temp = gs->mPendingGrabs; temp->next; temp = temp->next); temp->next = grab; } else gs->mPendingGrabs = grab; if (!gs->mDequeueTimeoutHandle.active ()) { gs->mDequeueTimeoutHandle.start (); } } void GroupScreen::dequeueGrabNotifies () { GroupWindow::PendingGrabs *grab; mQueued = true; while (mPendingGrabs) { grab = mPendingGrabs; mPendingGrabs = mPendingGrabs->next; grab->w->grabNotify (grab->x, grab->y, grab->state, grab->mask); delete grab; } mQueued = false; } void GroupWindow::enqueueUngrabNotify () { GroupWindow::PendingUngrabs *ungrab; GROUP_SCREEN (screen); ungrab = new GroupWindow::PendingUngrabs; if (!ungrab) return; ungrab->w = window; ungrab->next = NULL; if (gs->mPendingUngrabs) { GroupWindow::PendingUngrabs *temp; for (temp = gs->mPendingUngrabs; temp->next; temp = temp->next); temp->next = ungrab; } else gs->mPendingUngrabs = ungrab; if (!gs->mDequeueTimeoutHandle.active ()) { gs->mDequeueTimeoutHandle.start (); } } void GroupScreen::dequeueUngrabNotifies () { GroupWindow::PendingUngrabs *ungrab; mQueued = true; while (mPendingUngrabs) { ungrab = mPendingUngrabs; mPendingUngrabs = mPendingUngrabs->next; ungrab->w->ungrabNotify (); delete ungrab; } mQueued = false; } bool GroupScreen::dequeueTimer () { dequeueMoveNotifies (); dequeueGrabNotifies (); dequeueUngrabNotifies (); return false; } ./plugins/group/src/tabbar.h0000644000004100000410000001220713246301623016255 0ustar www-datawww-data/** * * Compiz group plugin * * tabbar.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef GROUP_TABBAR_H #define GROUP_TABBAR_H #include "group.h" /* Mask values for groupTabSetVisibility */ #define SHOW_BAR_INSTANTLY_MASK (1 << 0) #define PERMANENT (1 << 1) /* Mask values for tabbing animation */ #define IS_ANIMATED (1 << 0) #define FINISHED_ANIMATION (1 << 1) #define CONSTRAINED_X (1 << 2) #define CONSTRAINED_Y (1 << 3) #define DONT_CONSTRAIN (1 << 4) #define IS_UNGROUPING (1 << 5) class GroupTabBar; /* * GroupTabBarSlot */ class GroupTabBarSlot : public GLLayer { public: class List : public std::list , public GLLayer { public: List (const CompSize &size, GroupSelection *g) : GLLayer::GLLayer (size, g) {}; void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, const CompRegion &clipRegion, int mask); }; public: virtual ~GroupTabBarSlot (); void getDrawOffset (int &hoffset, int &voffset); void setTargetOpacity (int); void paint (const GLWindowPaintAttrib &sa, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); public: GroupTabBarSlot *mPrev; GroupTabBarSlot *mNext; CompRegion mRegion; CompWindow *mWindow; GroupTabBar *mTabBar; /* For DnD animations */ int mSpringX; int mSpeed; float mMsSinceLastMove; int mOpacity; private: GroupTabBarSlot (CompWindow *, GroupTabBar *); friend class GroupTabBar; }; /* * GroupTabBar */ class GroupTabBar { public: typedef enum { NoTabChange = 0, TabChangeOldOut, TabChangeNewIn } TabChangeState; /* * Rotation direction for change tab animation */ typedef enum { RotateUncertain = 0, RotateLeft, RotateRight } ChangeAnimationDirection; public: GroupTabBar (GroupSelection *, CompWindow *); ~GroupTabBar (); public: /* Input Prevention */ void createInputPreventionWindow (); void destroyInputPreventionWindow (); /* Drawing */ void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, CompRegion clipRegion); void damageRegion (); /* Animation */ bool handleTabBarFade (int msSinceLastPaint); bool handleTextFade (int msSinceLastPaint); /* Region and position management */ void moveTabBarRegion (int dx, int dy, bool syncIPW); void resizeTabBarRegion (CompRect &box, bool syncIPW); void recalcTabBarPos (int middleX, int minX1, int maxX2); /* Slot management */ void insertTabBarSlotBefore (GroupTabBarSlot *slot, GroupTabBarSlot *nextSlot); void insertTabBarSlotAfter (GroupTabBarSlot *slot, GroupTabBarSlot *prevSlot); void insertTabBarSlot (GroupTabBarSlot *slot); void unhookTabBarSlot (GroupTabBarSlot *slot, bool temporary); void deleteTabBarSlot (GroupTabBarSlot *slot); void createSlot (CompWindow *w); bool applyForces (GroupTabBarSlot *); void applySpeeds (int msSinceLastRepaint); public: GroupTabBarSlot::List mSlots; GroupSelection *mGroup; GroupTabBarSlot* mTopTab; GroupTabBarSlot* mPrevTopTab; /* needed for untabbing animation */ CompWindow *mLastTopTab; /* Those two are only for the change-tab animation, when the tab was changed again during animation. Another animation should be started again, switching for this window. */ GroupTabBar::ChangeAnimationDirection mNextDirection; GroupTabBarSlot *mNextTopTab; /* check focus stealing prevention after changing tabs */ bool mCheckFocusAfterTabChange; int mChangeAnimationTime; int mChangeAnimationDirection; GroupTabBar::TabChangeState mChangeState; GroupTabBarSlot *mHoveredSlot; GroupTabBarSlot *mTextSlot; TextLayer *mTextLayer; BackgroundLayer *mBgLayer; SelectionLayer *mSelectionLayer; PaintState mState; int mAnimationTime; CompRegion mRegion; int mOldWidth; CompTimer mTimeoutHandle; /* For DnD animations */ int mLeftSpringX, mRightSpringX; int mLeftSpeed, mRightSpeed; float mLeftMsSinceLastMove, mRightMsSinceLastMove; Window mInputPrevention; bool mIpwMapped; }; #endif ./plugins/group/src/cairo.cpp0000644000004100000410000006023713246301623016460 0ustar www-datawww-data/** * * Compiz group plugin * * cairo.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * SelectionLayer::rebuild * * This function takes an existing SelectionLayer (CairoLayer), * saves it's properties into a buffer, deletes it and re-creates * it with those properties. This is generally less error-prone * than only deleting the bits of the layer we need (since there is * a lot of sensitive cairo code in there) * */ SelectionLayer* SelectionLayer::rebuild (SelectionLayer *layer, CompSize size) { int timeBuf = layer->mAnimationTime; PaintState stateBuf = layer->mState; GroupSelection *gBuf = layer->mGroup; delete layer; layer = SelectionLayer::create (size, gBuf); if (!layer) return NULL; layer->mAnimationTime = timeBuf; layer->mState = stateBuf; return layer; } /* * BackgroundLayer::rebuild * * This function takes an existing BackgroundLayer (CairoLayer), * saves it's properties into a buffer, deletes it and re-creates * it with those properties. This is generally less error-prone * than only deleting the bits of the layer we need (since there is * a lot of sensitive cairo code in there) * */ BackgroundLayer* BackgroundLayer::rebuild (BackgroundLayer *layer, CompSize size) { int timeBuf = layer->mAnimationTime; PaintState stateBuf = layer->mState; GroupSelection *gBuf = layer->mGroup; delete layer; layer = BackgroundLayer::create (size, gBuf); if (!layer) return NULL; layer->mAnimationTime = timeBuf; layer->mState = stateBuf; return layer; } /* * CairoLayer::clear * * This function clears any drawing on a cairo layer * */ void CairoLayer::clear () { cairo_t *cr = mCairo; cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); } /* * CairoLayer::~CairoLayer () * */ CairoLayer::~CairoLayer () { if (mCairo) cairo_destroy (mCairo); if (mSurface) cairo_surface_destroy (mSurface); if (mBuffer) delete[] mBuffer; } /* * CairoLayer::CairoLayer * * Constructor for CairoLayer, * * Since there is no ability to return a NULL object, we have * to set a validity state and continue to construct the * layer based on the success of cairo object construction * */ CairoLayer::CairoLayer (const CompSize &size, GroupSelection *g) : TextureLayer::TextureLayer (size, g), mBuffer (NULL), mSurface (NULL), mCairo (NULL), mFailed (true) { unsigned int bufSize = 4 * width () * height (); mAnimationTime = 0; mState = PaintOff; mBuffer = new unsigned char[bufSize]; if (mBuffer) { mSurface = cairo_image_surface_create_for_data (mBuffer, CAIRO_FORMAT_ARGB32, width (), height (), 4 * width ()); if (cairo_surface_status (mSurface) == CAIRO_STATUS_SUCCESS) { mCairo = cairo_create (mSurface); if (cairo_status (mCairo) == CAIRO_STATUS_SUCCESS) { clear (); mFailed = false; } else { compLogMessage ("group", CompLogLevelError, "Failed to create cairo layer context."); cairo_surface_destroy (mSurface); delete[] mBuffer; } } else { compLogMessage ("group", CompLogLevelError, "Failed to create cairo layer surface"); delete[] mBuffer; } } else { compLogMessage ("group", CompLogLevelError, "Failed to allocate cairo layer buffer."); } } BackgroundLayer::BackgroundLayer (const CompSize &size, GroupSelection *g) : CairoLayer::CairoLayer (size, g), mBgAnimationTime (0), mBgAnimation (BackgroundLayer::AnimationNone) { } /* * BackgroundLayer::create * * Factory method for BackgroundLayer. Automatically checks * for failure to create cairo objects * */ BackgroundLayer* BackgroundLayer::create (CompSize size, GroupSelection *g) { BackgroundLayer *layer; layer = new BackgroundLayer (size, g); if (!layer || layer->mFailed) return NULL; return layer; } /* * SelectionLayer::create * * Factory method for SelectionLayer. Automatically checks * for failure to create cairo objects * */ SelectionLayer* SelectionLayer::create (CompSize size, GroupSelection *g) { SelectionLayer *layer; layer = new SelectionLayer (size, g); if (!layer || layer->mFailed) return NULL; return layer; } /* * SelectionLayer::render * * Renders the group color highlight behind the active tab using cairo * */ void SelectionLayer::render () { cairo_t *cr; if (!HAS_TOP_WIN (mGroup) || !mCairo) return; cr = mCairo; /* fill */ cairo_set_line_width (cr, 2); cairo_set_source_rgba (cr, (mGroup->mColor[0] / 65535.0f), (mGroup->mColor[1] / 65535.0f), (mGroup->mColor[2] / 65535.0f), (mGroup->mColor[3] / (65535.0f * 2))); cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width (), height ()); cairo_fill_preserve (cr); /* outline */ cairo_set_source_rgba (cr, (mGroup->mColor[0] / 65535.0f), (mGroup->mColor[1] / 65535.0f), (mGroup->mColor[2] / 65535.0f), (mGroup->mColor[3] / 65535.0f)); cairo_stroke (cr); mTexture = GLTexture::imageBufferToTexture ((char*) mBuffer, (CompSize &) *this); } /* * BackgroundLayer::render * * Render the background to the tab bar, also render the tab bar animation * */ void BackgroundLayer::render () { cairo_t *cr; int twidth, theight, radius; int borderWidth; float r, g, b, a; double x0, y0, x1, y1; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup) || !mCairo) return; /* Dimensions are the tab bar's region */ twidth = mGroup->mTabBar->mRegion.boundingRect ().width (); theight = mGroup->mTabBar->mRegion.boundingRect ().height (); radius = gs->optionGetBorderRadius (); /* Do not draw more than the tab bar width */ if (twidth > width ()) twidth = width (); /* Border radius should not exceed * half of the tab bar height */ if (radius > twidth / 2) radius = twidth / 2; cr = mCairo; /* Clear the layer */ clear (); /* Draw the border around the tab bar */ borderWidth = gs->optionGetBorderWidth (); cairo_set_line_width (cr, borderWidth); cairo_save (cr); /* Move to the center of where we want to draw the line */ x0 = borderWidth / 2.0f; y0 = borderWidth / 2.0f; /* The center of where we want to draw the opposite line */ x1 = twidth - borderWidth / 2.0f; y1 = theight - borderWidth / 2.0f; cairo_move_to (cr, x0 + radius, y0); /* Arc the top right corner */ cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); /* Arc the bottom right corner */ cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); /* Arc the bottom left corner */ cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); /* Arc the top left corner */ cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); cairo_close_path (cr); /* There are 5 different tab styles here: * Simple: draws a simple filled rect * Gradient: left to right gradient between base and highlight * Glass: left to right gradient, stopping at 60% and drawing a shadow * Metal: base -> highlight -> base gradient * Murrina: draws an arc between the two corners blending base and highlight */ switch (gs->optionGetTabStyle ()) { case GroupOptions::TabStyleSimple: { /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); cairo_fill_preserve (cr); break; } case GroupOptions::TabStyleGradient: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, twidth, theight); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case GroupOptions::TabStyleGlass: { cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip (cr); /* ===== HIGHLIGHT ===== */ /* make draw the shape for the highlight and create a pattern for it */ cairo_rectangle (cr, 0, 0, twidth, theight / 2); pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.6f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== SHADOW ===== */ /* make draw the shape for the show and create a pattern for it */ cairo_rectangle (cr, 0, theight / 2, twidth, theight); pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.5f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); /* draw shape again for the outline */ cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } case GroupOptions::TabStyleMetal: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* base color #1 */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.55f, r, g, b, a); /* base color #2 */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case GroupOptions::TabStyleMurrina: { double ratio, transX; cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip_preserve (cr); /* ==== TOP ==== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = (y1 - y0) / 2; /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== BOTTOM ===== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = (y1 - y0) / 2; ratio = (double)twidth / (double)theight; transX = twidth - (twidth * ratio); cairo_move_to (cr, x1, y1); cairo_line_to (cr, x1, y0); if (twidth < theight) { cairo_translate (cr, transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc (cr, x1 - radius, y0, radius, 0.0, M_PI * 0.5); if (twidth < theight) { cairo_scale (cr, 1.0 / ratio, 1.0); cairo_translate (cr, -transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc_negative (cr, x0 + radius, y1, radius, M_PI * 1.5, M_PI); cairo_close_path (cr); /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_restore (cr); /* draw shape again for the outline */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = gs->optionGetBorderRadius (); cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } default: break; } /* outline */ r = gs->optionGetTabBorderColorRed () / 65535.0f; g = gs->optionGetTabBorderColorGreen () / 65535.0f; b = gs->optionGetTabBorderColorBlue () / 65535.0f; a = gs->optionGetTabBorderColorAlpha () / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); /* If there is an animation running, stroke preserved * so that we can paint directly on top (and blend!) * the new animation with the existing tab bar. * Otherwise just stroke normally, this is less expensive */ if (mBgAnimation != AnimationNone) cairo_stroke_preserve (cr); else cairo_stroke (cr); /* There are two animations here: * Pulse: Highlight tab bar in and out (used for tab hover) * Reflex: Paint a diagonal gradient moving from right to left * on the tab bar when it appears */ switch (mBgAnimation) { case AnimationPulse: { double animationProgress; double alpha; /* Progress here is measured in the current time */ animationProgress = mBgAnimationTime / (gs->optionGetPulseTime () * 1000.0); /* The highlight pulsates in and out, so the alpha here should run * on a sine wave */ alpha = sin ((2 * PI * animationProgress) - 1.55)*0.5 + 0.5; /* If the alpha of the animation is < 0, don't bother painting */ if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); /* Paint highlight over the tab bar */ cairo_set_operator (cr, CAIRO_OPERATOR_XOR); cairo_rectangle (cr, 0.0, 0.0, twidth, theight); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, alpha); cairo_fill (cr); cairo_restore (cr); break; } case AnimationReflex: { double animationProgress; double reflexWidth; double posX, alpha; cairo_pattern_t *pattern; /* Progress is measured in current time */ animationProgress = mBgAnimationTime / (gs->optionGetReflexTime () * 1000.0); /* Position here is the tab bar width plus the reflection width * 2 */ reflexWidth = (mGroup->mTabBar->mSlots.size () / 2.0) * 30; posX = (twidth + reflexWidth * 2.0) * animationProgress; alpha = sin (PI * animationProgress) * 0.55; if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); pattern = cairo_pattern_create_linear (posX - reflexWidth, 0.0, posX, theight); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, 1.0, 1.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgba (pattern, 0.5f, 1.0, 1.0, 1.0, alpha); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, 1.0, 1.0, 1.0, 0.0); cairo_rectangle (cr, 0.0, 0.0, twidth, theight); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_restore (cr); cairo_pattern_destroy (pattern); break; } case AnimationNone: default: break; } /* draw inner outline */ cairo_move_to (cr, x0 + radius + 1.0, y0 + 1.0); cairo_arc (cr, x1 - radius - 1.0, y0 + radius + 1.0, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius - 1.0, y1 - radius - 1.0, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius + 1.0, y1 - radius - 1.0, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius + 1.0, y0 + radius + 1.0, radius, M_PI, M_PI * 1.5); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.3); cairo_stroke(cr); cairo_restore (cr); mTexture = GLTexture::imageBufferToTexture ((char*) mBuffer, (CompSize &) *this); } /* * TextLayer::create * * Factory method of text layer. Returns nothing * if the text is not valid * */ TextLayer * TextLayer::create (CompSize &size, GroupSelection *group) { TextLayer *layer = new TextLayer (size, group); if (!layer) return NULL; return layer; } /* * TextLayer::rebuild * * Take a text layer, save it's properties into a buffer * and re-create it with those properties * */ TextLayer * TextLayer::rebuild (TextLayer *layer) { /* general cleanup func ... for now */ if (layer) { if (layer->mPixmap) XFreePixmap (screen->dpy (), layer->mPixmap); PaintState pStateBuf = layer->mState; int aTimeBuf = layer->mAnimationTime; CompSize sBuf = (CompSize ) *layer; GroupSelection *gBuf = layer->mGroup; delete layer; layer = new TextLayer (sBuf, gBuf); if (!layer) return NULL; layer->mState = pStateBuf; layer->mAnimationTime = aTimeBuf; } return layer; } /* * TextLayer::render * * Renders some text without a background, without automatically * binding the text pixmap to a texture (since we need to bind it later) * */ void TextLayer::render () { int twidth, theight; Pixmap pixmap = None; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup)) return; /* Maximum text width is the tab bar width */ twidth = mGroup->mTabBar->mRegion.boundingRect ().width (); theight = mGroup->mTabBar->mRegion.boundingRect ().height (); if (mGroup->mTabBar->mTextSlot && mGroup->mTabBar->mTextSlot->mWindow && gTextAvailable) { CompText::Attrib textAttrib; textAttrib.family = "Sans"; textAttrib.size = gs->optionGetTabbarFontSize (); /* Bold text, ellipsize if there is not enough room and do not * automatically bind pixmap to texture */ textAttrib.flags = CompText::StyleBold | CompText::Ellipsized | CompText::NoAutoBinding; textAttrib.color[0] = gs->optionGetTabbarFontColorRed (); textAttrib.color[1] = gs->optionGetTabbarFontColorGreen (); textAttrib.color[2] = gs->optionGetTabbarFontColorBlue (); textAttrib.color[3] = gs->optionGetTabbarFontColorAlpha (); textAttrib.maxWidth = twidth; textAttrib.maxHeight = theight; /* Render title of the top window */ if (gs->mText.renderWindowTitle ( mGroup->mTabBar->mTextSlot->mWindow->id (), false, textAttrib)) { pixmap = gs->mText.getPixmap (); twidth = gs->mText.getWidth (); theight = gs->mText.getHeight (); } } if (!pixmap) { /* getting the pixmap failed, so create an empty one */ pixmap = XCreatePixmap (screen->dpy (), screen->root (), twidth, theight, 32); if (pixmap) { XGCValues gcv; GC gc; gcv.foreground = 0x00000000; gcv.plane_mask = 0xffffffff; gc = XCreateGC (screen->dpy (), pixmap, GCForeground, &gcv); XFillRectangle (screen->dpy (), pixmap, gc, 0, 0, twidth, theight); XFreeGC (screen->dpy (), gc); } } setWidth (twidth); setHeight (theight); if (pixmap) { mTexture.clear (); mPixmap = pixmap; /* Text layer's texture is bound here, this can be re used * in TextureLayer::paint */ mTexture = GLTexture::bindPixmapToTexture (mPixmap, width (), height (), 32); } } ./plugins/group/src/group.h0000644000004100000410000003553213246301623016164 0ustar www-datawww-data/** * * Compiz group plugin * * group.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Some terminology used in this plugin: * * 1. The "top tab" means the currently selected visible tab in the * group. All other windows in the tabbed group are invisible. * * 2. There are two animations, "Tabbing/Untabbing" and the "Change" * animation. The "Tabbing/Untabbing" one is probably the most complex. * This is where we center windows to some central top tab and then * animate them to appear to be morphing into this window. We also * do a similar animation when animating out (which is why we need * to save their relevant distance from the main window initially). * There is also the "change" animation, which is where we switch * between a number of top tabs * * 3. The glow around windows is actually in fact a small texture which * is strectched according to some gloq quads and then painted. * * 4. Each "layer" here is a GUI object which is painted on screen * (such as the tab bar, the text, the selection highlight, etc) * **/ #ifndef _GROUP_H #define _GROUP_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class GroupSelection; class GroupWindow; class GroupScreen; #include "layers.h" #include "tabbar.h" #include "glow.h" #include "group_options.h" /* * Used to check if we can use the text plugin * */ extern bool gTextAvailable; /* * Constants * */ extern const double PI; /* * Helpers * */ #define WIN_X(w) (w->x ()) #define WIN_Y(w) (w->y ()) #define WIN_WIDTH(w) (w->width ()) #define WIN_HEIGHT(w) (w->height ()) #define WIN_CENTER_X(w) (WIN_X (w) + (WIN_WIDTH (w) / 2)) #define WIN_CENTER_Y(w) (WIN_Y (w) + (WIN_HEIGHT (w) / 2)) /* definitions used for glow painting */ #define WIN_REAL_X(w) (w->x () - w->border ().left) #define WIN_REAL_Y(w) (w->y () - w->border ().top) #define WIN_REAL_WIDTH(w) (w->width () + 2 * w->geometry ().border () + \ w->border ().left + w->border ().right) #define WIN_REAL_HEIGHT(w) (w->height () + 2 * w->geometry ().border () + \ w->border ().top + w->border ().bottom) #define TOP_TAB(g) ((g)->mTabBar->mTopTab->mWindow) #define PREV_TOP_TAB(g) ((g)->mTabBar->mPrevTopTab->mWindow) #define NEXT_TOP_TAB(g) ((g)->mTabBar->mNextTopTab->mWindow) #define HAS_TOP_WIN(group) (((group)->mTabBar && (group)->mTabBar->mTopTab) && ((group)->mTabBar->mTopTab->mWindow)) #define HAS_PREV_TOP_WIN(group) (((group)->mTabBar->mPrevTopTab) && \ ((group)->mTabBar->mPrevTopTab->mWindow)) #define IS_TOP_TAB(w, group) (HAS_TOP_WIN (group) && \ ((TOP_TAB (group)->id ()) == (w)->id ())) #define IS_PREV_TOP_TAB(w, group) (HAS_PREV_TOP_WIN (group) && \ ((PREV_TOP_TAB (group)->id ()) == (w)->id ())) /* * Selection */ class Selection : public CompWindowList { public: Selection () : mPainted (false), mVpX (0), mVpY (0), mX1 (0), mY1 (0), mX2 (0), mY2 (0) {}; void checkWindow (CompWindow *w); void deselect (CompWindow *w); void deselect (GroupSelection *group); void select (CompWindow *w); void select (GroupSelection *g); void selectRegion (); GroupSelection * toGroup (); void damage (int, int); void paint (const GLScreenPaintAttrib sa, const GLMatrix transform, CompOutput *output, bool transformed); /* For selection */ bool mPainted; int mVpX, mVpY; int mX1, mY1, mX2, mY2; }; /* * GroupSelection */ class GroupSelection { public: class ResizeInfo { public: CompWindow *mResizedWindow; CompRect mOrigGeometry; }; public: /* * Ungrouping states */ typedef enum { UngroupNone = 0, UngroupAll, UngroupSingle } UngroupState; typedef enum { NoTabbing = 0, Tabbing, Untabbing } TabbingState; public: typedef std::list List; GroupSelection (); ~GroupSelection (); public: void tabGroup (CompWindow *main); void untabGroup (); void raiseWindows (CompWindow *top); void minimizeWindows (CompWindow *top, bool minimize); void shadeWindows (CompWindow *top, bool shade); void moveWindows (CompWindow *top, int dx, int dy, bool immediate, bool viewportChange = false); void prepareResizeWindows (CompRect &resizeRect); void resizeWindows (CompWindow *top); void maximizeWindows (CompWindow *top); void changeColor (); void applyConstraining (CompRegion constrainRegion, Window constrainedWindow, int dx, int dy); bool tabBarTimeout (); bool showDelayTimeout (); void tabSetVisibility (bool visible, unsigned int mask); void handleHoverDetection (const CompPoint &); bool handleAnimation (); void finishTabbing (); bool drawTabAnimation (int msSinceLastPaint); void startTabbingAnimation (bool tab); void fini (); public: CompScreen *mScreen; CompWindowList mWindows; MousePoller mPoller; GroupTabBar *mTabBar; GroupSelection::TabbingState mTabbingState; UngroupState mUngroupState; Window mGrabWindow; unsigned int mGrabMask; GLushort mColor[4]; ResizeInfo *mResizeInfo; /* It's easier to keep track of these things, serialize them * and rebuild what the group would have looked like later */ std::list mWindowIds; Window mTopId; }; /* * GroupWindow structure */ class GroupWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: /* * Window states */ typedef enum { WindowNormal = 0, WindowMinimized, WindowShaded } State; class HideInfo { public: Window mShapeWindow; unsigned long mSkipState; unsigned long mShapeMask; XRectangle *mInputRects; int mNInputRects; int mInputRectOrdering; }; /* * Structs for pending callbacks */ class PendingMoves { public: CompWindow *w; int dx; int dy; bool immediate; bool sync; GroupWindow::PendingMoves *next; }; class PendingGrabs { public: CompWindow *w; int x; int y; unsigned int state; unsigned int mask; PendingGrabs *next; }; class PendingUngrabs { public: CompWindow *w; PendingUngrabs *next; }; class PendingSyncs { public: CompWindow *w; PendingSyncs *next; }; public: GroupWindow (CompWindow *); ~GroupWindow (); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: void moveNotify (int, int, bool); void resizeNotify (int, int, int, int); void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); void windowNotify (CompWindowNotify n); void stateChangeNotify (unsigned int); void activate (); void getOutputExtents (CompWindowExtents &); bool glDraw (const GLMatrix &, GLFragment::Attrib &, const CompRegion &, unsigned int); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool, const CompRect &); public: /* glow.cpp */ bool checkTabbing (); bool checkRotating (); bool checkShowTabBar (); void paintGlow (GLFragment::Attrib &attrib, const CompRegion &paintRegion, unsigned int mask); void computeGlowQuads (GLTexture::Matrix *matrix); /* paint.cpp */ void getStretchRectangle (CompRect &box, float &xScaleRet, float &yScaleRet); /* queues.cpp */ void enqueueMoveNotify (int dx, int dy, bool immediate, bool sync); void enqueueGrabNotify (int x, int y, unsigned int state, unsigned int mask); void enqueueUngrabNotify (); /* selection.cpp */ bool windowInRegion (CompRegion src, float precision); /* group.cpp */ bool isGroupWindow (); bool dragHoverTimeout (); unsigned int updateResizeRectangle (CompRect masterGeometry, bool damage); void deleteGroupWindow (); void removeWindowFromGroup (); void addWindowToGroup (GroupSelection *group); /* tab.cpp */ CompRegion getClippingRegion (); void clearWindowInputShape (GroupWindow::HideInfo *hideInfo); void setWindowVisibility (bool visible); int adjustTabVelocity (); bool constrainMovement (CompRegion constrainRegion, int dx, int dy, int &new_dx, int &new_dy); /* init.cpp */ void checkFunctions (); public: GroupSelection *mGroup; bool mInSelection; /* For the tab bar */ GroupTabBarSlot *mSlot; bool mNeedsPosSync; GlowQuad *mGlowQuads; GroupWindow::State mWindowState; GroupWindow::HideInfo *mWindowHideInfo; CompRect mResizeGeometry; /* For tab animation */ int mAnimateState; CompPoint mMainTabOffset; CompPoint mDestination; CompPoint mOrgPos; float mTx,mTy; float mXVelocity, mYVelocity; }; /* * GroupScreen structure */ class GroupScreen : public PluginClassHandler , public GroupOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: /* * Screengrab states */ typedef enum { ScreenGrabNone = 0, ScreenGrabSelect, ScreenGrabTabDrag } GrabState; public: GroupScreen (CompScreen *); ~GroupScreen (); public: CompositeScreen *cScreen; GLScreen *gScreen; public: void handleEvent (XEvent *); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); CompMatch::Expression * matchInitExp (const CompString &str); void matchExpHandlerChanged (); public: void checkFunctions (); void optionChanged (CompOption *opt, Options num); bool applyInitialActions (); /* cairo.cpp */ void damagePaintRectangle (const CompRect &box); /* queues.cpp */ void dequeueSyncs (GroupWindow::PendingSyncs *); void dequeueMoveNotifies (); void dequeueGrabNotifies (); void dequeueUngrabNotifies (); bool dequeueTimer (); /* selection.cpp */ bool selectSingle (CompAction *action, CompAction::State state, CompOption::Vector options); bool select (CompAction *action, CompAction::State state, CompOption::Vector options); bool selectTerminate (CompAction *action, CompAction::State state, CompOption::Vector options); /* group.cpp */ void grabScreen (GroupScreen::GrabState newState); bool groupWindows (CompAction *action, CompAction::State state, CompOption::Vector options); bool ungroupWindows (CompAction *action, CompAction::State state, CompOption::Vector options); bool removeWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool closeWindows (CompAction *action, CompAction::State state, CompOption::Vector options); bool changeColor (CompAction *action, CompAction::State state, CompOption::Vector options); bool setIgnore (CompAction *action, CompAction::State state, CompOption::Vector options); bool unsetIgnore (CompAction *action, CompAction::State state, CompOption::Vector options); void handleButtonPressEvent (XEvent *event); void handleButtonReleaseEvent (XEvent *event); void handleMotionEvent (int xRoot, int yRoot); /* tab.cpp */ bool getCurrentMousePosition (int &x, int &y); void tabChangeActivateEvent (bool activating); void updateTabBars (Window enteredWin); CompRegion getConstrainRegion (); bool changeTab (GroupTabBarSlot *topTab, GroupTabBar::ChangeAnimationDirection direction); void recalcSlotPos (GroupTabBarSlot *slot, int slotPos); bool initTab (CompAction *aciton, CompAction::State state, CompOption::Vector options); bool changeTabLeft (CompAction *action, CompAction::State state, CompOption::Vector options); bool changeTabRight (CompAction *action, CompAction::State state, CompOption::Vector options); void switchTopTabInput (GroupSelection *group, bool enable); public: bool mIgnoreMode; GlowTextureProperties *mGlowTextureProperties; GroupSelection *mLastRestackedGroup; Atom mResizeNotifyAtom; CompText mText; GroupWindow::PendingMoves *mPendingMoves; GroupWindow::PendingGrabs *mPendingGrabs; GroupWindow::PendingUngrabs *mPendingUngrabs; CompTimer mDequeueTimeoutHandle; GroupSelection::List mGroups; Selection mTmpSel; bool mQueued; GroupScreen::GrabState mGrabState; CompScreen::GrabHandle mGrabIndex; GroupSelection *mLastHoveredGroup; CompTimer mShowDelayTimeoutHandle; /* For d&d */ GroupTabBarSlot *mDraggedSlot; CompTimer mDragHoverTimeoutHandle; bool mDragged; int mPrevX, mPrevY; /* Buffer for mouse coordinates */ CompTimer mInitialActionsTimeoutHandle; GLTexture::List mGlowTexture; Window mLastGrabbedWindow; }; #define GROUP_SCREEN(s) \ GroupScreen *gs = GroupScreen::get (s); #define GROUP_WINDOW(w) \ GroupWindow *gw = GroupWindow::get (w); class GroupPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; /* * Pre-Definitions * */ #endif ./plugins/group/src/paint.cpp0000644000004100000410000010660513246301623016476 0ustar www-datawww-data/** * * Compiz group plugin * * paint.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * GroupTabBarSlot::setTargetOpacity * * Convenience function to set the target opacity for the tab bar */ void GroupTabBarSlot::setTargetOpacity (int tOpacity) { mOpacity = tOpacity; } /* * TextureLayer::setPaintWindow * * Convenience function to set the window we are painting on top of * for a texture for the tab bar */ void TextureLayer::setPaintWindow (CompWindow *w) { mPaintWindow = w; } /* * GroupTabBarSlot::List::paint * * Paint all tabs in a list * */ void GroupTabBarSlot::List::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, const CompRegion &clipRegion, int mask) { GROUP_SCREEN (screen); foreach (GroupTabBarSlot *slot, *this) { if (slot != gs->mDraggedSlot || !gs->mDragged) { slot->setTargetOpacity (attrib.opacity); slot->paint (attrib, transform, clipRegion, clipRegion, mask); } } } /* * GroupTabBarSlot::paint - taken from switcher and modified for tab bar * * We need to scale down the window to a small thumbnail, skip the * geometry modification stage (so we don't get wobbly uglyness) * and paint it directly to the screen for a second time. * * Also fade in and out. * */ void GroupTabBarSlot::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, const CompRegion &clipRegion, int mask) { CompWindow *w = mWindow; unsigned int oldGlAddGeometryIndex; GLWindowPaintAttrib wAttrib (GLWindow::get (mWindow)->paintAttrib ()); int tw, th; GROUP_WINDOW (w); GROUP_SCREEN (screen); tw = mRegion.boundingRect ().width (); th = mRegion.boundingRect ().height (); /* Wrap glDrawGeometry to make sure the general glDrawGeometry function is used */ oldGlAddGeometryIndex = gw->gWindow->glAddGeometryGetCurrentIndex (); gw->gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); /* animate fade */ if (mTabBar->mState == PaintFadeIn) { wAttrib.opacity -= wAttrib.opacity * mTabBar->mAnimationTime / (gs->optionGetFadeTime () * 1000); } else if (mTabBar->mState == PaintFadeOut) { wAttrib.opacity = wAttrib.opacity * mTabBar->mAnimationTime / (gs->optionGetFadeTime () * 1000); } wAttrib.opacity = wAttrib.opacity * mOpacity / OPAQUE; if (w->mapNum ()) { GLFragment::Attrib fragment (wAttrib); GLMatrix wTransform (transform); int width, height; int vx, vy; unsigned int oldGlDrawIndex; width = w->width () + w->output ().left + w->output ().right; height = w->height () + w->output ().top + w->output ().bottom; if (width > tw) wAttrib.xScale = (float) tw / width; else wAttrib.xScale = 1.0f; if (height > th) wAttrib.yScale = (float) tw / height; else wAttrib.yScale = 1.0f; if (wAttrib.xScale < wAttrib.yScale) wAttrib.yScale = wAttrib.xScale; else wAttrib.xScale = wAttrib.yScale; /* FIXME: do some more work on the highlight on hover feature // Highlight on hover if (group && group->mTabBar && group->mTabBar->hoveredSlot == slot) { wAttrib.saturation = 0; wAttrib.brightness /= 1.25f; }*/ getDrawOffset (vx, vy); wAttrib.xTranslate = (mRegion.boundingRect ().x1 () + mRegion.boundingRect ().x2 ()) / 2 + vx; wAttrib.yTranslate = mRegion.boundingRect ().y1 () + vy; /* Translate matrix to the first point in the drawn region * and then scale (scales to the top right corner) to our * desired size */ wTransform.translate (wAttrib.xTranslate, wAttrib.yTranslate, 0.0f); wTransform.scale (wAttrib.xScale, wAttrib.yScale, 1.0f); wTransform.translate (-(WIN_X (w) + WIN_WIDTH (w) / 2), -(WIN_Y (w) - w->output ().top), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); /* Skip to the end of glDraw, so we don't end up with wobbly * and all that (we also loaded with a simple matrix, so we * miss the one in glPaint) */ oldGlDrawIndex = gw->gWindow->glDrawGetCurrentIndex (); gw->gWindow->glDraw (wTransform, fragment, clipRegion, mask | PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK); gw->gWindow->glDrawSetCurrentIndex (oldGlDrawIndex); glPopMatrix (); } gw->gWindow->glAddGeometrySetCurrentIndex (oldGlAddGeometryIndex); } /* * TextureLayer::paint * * Paint some texture on with a window's geometry. This involves * putting the texture in the right place, adding it's geometry to the * window geometry (so it can be modified by wobbly and friends), * adding it, setting the texture layer opacity and then painting it * with the window geometry * */ void TextureLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { GroupWindow *gwTopTab = GroupWindow::get (mPaintWindow); const CompRect &box = paintRegion.boundingRect (); /* Handle tiled textures */ foreach (GLTexture *tex, mTexture) { GLTexture::Matrix matrix = tex->matrix (); GLTexture::MatrixList matl; CompRegion reg; int x1 = box.x1 (); int y1 = box.y1 (); int x2 = box.x2 (); int y2 = box.y2 (); /* remove the old x1 and y1 so we have a relative value */ x2 -= x1; y2 -= y1; x1 = (x1 - mPaintWindow->x ()) / attrib.xScale + mPaintWindow->x (); y1 = (y1 - mPaintWindow->y ()) / attrib.yScale + mPaintWindow->y (); /* now add the new x1 and y1 so we have a absolute value again, also we don't want to stretch the texture... */ if (x2 * attrib.xScale < width ()) x2 += x1; else x2 = x1 + width (); if (y2 * attrib.yScale < height ()) y2 += y1; else y2 = y1 + height (); /* Set the x-position to our x1 minus the scale factor */ matrix.x0 -= x1 * matrix.xx; matrix.y0 -= y1 * matrix.yy; matl.push_back (matrix); reg = CompRegion (x1, y1, x2 - x1, y2 - y1); /* Reset current window geometry and re-add it with this * new geometry for the tab bar */ gwTopTab->gWindow->geometry ().reset (); gwTopTab->gWindow->glAddGeometry (matl, reg, clipRegion); if (gwTopTab->gWindow->geometry ().vertices) { GLFragment::Attrib fragment (attrib); GLMatrix wTransform (transform); /* Translate to where we want to paint, and scale * (via a 3x3 matrix) */ wTransform.translate (WIN_X (mPaintWindow), WIN_Y (mPaintWindow), 0.0f); wTransform.scale (attrib.xScale, attrib.yScale, 1.0f); wTransform.translate ( attrib.xTranslate / attrib.xScale - WIN_X (mPaintWindow), attrib.yTranslate / attrib.yScale - WIN_Y (mPaintWindow), 0.0f); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); fragment.setOpacity (attrib.opacity); gwTopTab->glDrawTexture (tex, fragment, mask | PAINT_WINDOW_BLEND_MASK | PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_TRANSLUCENT_MASK); glPopMatrix (); } } } /* * BackgroundLayer::paint * * Paint the backgroud layer. It might need to be scaled a bit * if it is expanding */ void BackgroundLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { int newWidth; GLWindowPaintAttrib wAttrib (attrib); CompRect box = paintRegion.boundingRect (); /* handle the repaint of the background */ newWidth = mGroup->mTabBar->mRegion.boundingRect ().width (); if (newWidth > width ()) newWidth = width (); /* if the region expanded and we haven't re-rended ,just scale * the tab bar up slightly */ wAttrib.xScale = (double) (mGroup->mTabBar->mRegion.boundingRect ().width () / (double) newWidth); /* FIXME: maybe move this over to groupResizeTabBarRegion - * the only problem is that we would have 2 redraws if * here is an animation */ if (newWidth != mGroup->mTabBar->mOldWidth || mGroup->mTabBar->mBgLayer->mBgAnimation) render (); mGroup->mTabBar->mOldWidth = newWidth; box = mGroup->mTabBar->mRegion.boundingRect (); TextureLayer::paint (wAttrib, transform, box, clipRegion, mask); } /* * SelectionLayer::paint * * Paint the selection background behind the selection tab. This is * just a regular texture to paint that normally * */ void SelectionLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { TextureLayer::paint (attrib, transform, mGroup->mTabBar->mTopTab->mRegion, clipRegion, mask); } /* * TextLayer::paint * * Paint the text layer on top of the selection layer, * * We need to adjust the region here and paint faded in or out (then * just paint like a normal texture here) */ void TextLayer::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) { /* add a slight buffer around the clipping region * to account for the text */ CompRect box; int alpha = OPAQUE; GLWindowPaintAttrib wAttrib (attrib); GROUP_SCREEN (screen); int x1 = mGroup->mTabBar->mRegion.boundingRect ().x1 () + 5; int x2 = mGroup->mTabBar->mRegion.boundingRect ().x1 () + width () + 5; int y1 = mGroup->mTabBar->mRegion.boundingRect ().y2 () - height () - 5; int y2 = mGroup->mTabBar->mRegion.boundingRect ().y2 () - 5; if (x2 > mGroup->mTabBar->mRegion.boundingRect ().x2 ()) x2 = mGroup->mTabBar->mRegion.boundingRect ().x2 (); box = CompRect (x1, y1, x2 - x1, y2 - y1); /* recalculate the alpha again for text fade... */ if (mState == PaintFadeIn) alpha -= alpha * mAnimationTime / (gs->optionGetFadeTextTime () * 1000); else if (mState == PaintFadeOut) alpha = alpha * mAnimationTime / (gs->optionGetFadeTextTime () * 1000); wAttrib.opacity = alpha * ((float) wAttrib.opacity / OPAQUE); TextureLayer::paint (wAttrib, transform, box, clipRegion, mask); } /* * GroupTabBar::paint * * Paint the tab bar. This involves determining the window we want to * paint with geometry (the top tab usually, unless animating). All * of the other layers have paint functions, so add those to a list * and batch-paint them * */ void GroupTabBar::paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, CompRegion clipRegion) { CompWindow *topTab; std::vector paintList; CompRect box; GROUP_SCREEN (screen); if (HAS_TOP_WIN (mGroup)) topTab = TOP_TAB (mGroup); else topTab = PREV_TOP_TAB (mGroup); /* Set the windows we want to paint with */ mBgLayer->setPaintWindow (topTab); mSelectionLayer->setPaintWindow (topTab); /* Paint background, then selection, then slots and then * if we can, the text */ paintList.push_back (mBgLayer); paintList.push_back (mSelectionLayer); paintList.push_back (&mSlots); if (mTextLayer && (mTextLayer->mState != PaintOff)) { mTextLayer->setPaintWindow (topTab); paintList.push_back (mTextLayer); } /* On each layer, set up texture filtering, fade in and out and * paint the layer */ foreach (GLLayer *layer, paintList) { GLWindowPaintAttrib wAttrib (attrib); GLenum oldTextureFilter; int alpha = OPAQUE; wAttrib.xScale = 1.0f; wAttrib.yScale = 1.0f; oldTextureFilter = gs->gScreen->textureFilter (); if (gs->optionGetMipmaps ()) gs->gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); if (mState == PaintFadeIn) alpha -= alpha * mAnimationTime / (gs->optionGetFadeTime () * 1000); else if (mState == PaintFadeOut) alpha = alpha * mAnimationTime / (gs->optionGetFadeTime () * 1000); wAttrib.opacity = alpha * ((float) wAttrib.opacity / OPAQUE); layer->paint (wAttrib, transform, clipRegion, clipRegion, mask); gs->gScreen->setTextureFilter (oldTextureFilter); } } /* * Selection::paint * * Paint the selection outline here, basically just draw a basic outline * shape with opengl and paint with the right transformation matrix * */ void Selection::paint (const GLScreenPaintAttrib sa, const GLMatrix transform, CompOutput *output, bool transformed) { GROUP_SCREEN (screen); int x1, x2, y1, y2; x1 = MIN (mX1, mX2); y1 = MIN (mY1, mY2); x2 = MAX (mX1, mX2); y2 = MAX (mY1, mY2); if (gs->mGrabState == GroupScreen::ScreenGrabSelect) { GLMatrix sTransform (transform); if (transformed) { gs->gScreen->glApplyTransform (sa, output, &sTransform); sTransform.toScreenSpace (output, -sa.zTranslate); } else sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (sTransform.getMatrix ()); glDisableClientState (GL_TEXTURE_COORD_ARRAY); glEnable (GL_BLEND); glColor4usv (gs->optionGetFillColor ()); glRecti (x1, y2, x2, y1); glColor4usv (gs->optionGetLineColor ()); glBegin (GL_LINE_LOOP); glVertex2i (x1, y1); glVertex2i (x2, y1); glVertex2i (x2, y2); glVertex2i (x1, y2); glEnd (); glColor4usv (defaultColor); glDisable (GL_BLEND); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glPopMatrix (); } } /* * GroupScreen::preparePaint * * Called before ::glPaint, this tells us how long it has been * since the last screen paint cycle, so we can handle animation. * * Go through the groups, handle the switch, tabbing, and fade * animations * */ void GroupScreen::preparePaint (int msSinceLastPaint) { GroupSelection *group; GroupSelection::List::iterator it = mGroups.begin (); bool keepPainting = false; cScreen->preparePaint (msSinceLastPaint); while (it != mGroups.end ()) { group = *it; GroupTabBar *bar = group->mTabBar; if (bar) { keepPainting |= bar->applyForces ((mDragged) ? mDraggedSlot : NULL); bar->applySpeeds (msSinceLastPaint); if (bar->mState == PaintFadeIn || bar->mState == PaintFadeOut) keepPainting |= bar->handleTabBarFade (msSinceLastPaint); if (bar->mTextLayer) keepPainting |= bar->handleTextFade (msSinceLastPaint); if (bar->mBgLayer && bar->mBgLayer->mBgAnimation) keepPainting |= bar->mBgLayer->handleAnimation (msSinceLastPaint); } if (group->mTabBar && group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { /* Only change to the new tab once the animation is done */ group->mTabBar->mChangeAnimationTime -= msSinceLastPaint; if (group->mTabBar->mChangeAnimationTime <= 0) keepPainting |= group->handleAnimation (); else keepPainting = true; } /* groupDrawTabAnimation may delete the group, so better save the pointer to the next chain element */ ++it; if (group->mTabbingState != GroupSelection::NoTabbing) keepPainting |= group->drawTabAnimation (msSinceLastPaint); } /* We just need to disable preparePaint here directly, since * checkFunctions will enable it again if there are groups with * animations or groups with tab bars with a dragged slot */ if (!keepPainting) cScreen->preparePaintSetEnabled (this, false); /* Always enable donePaint here (since there might be some * damage or whatever) */ cScreen->donePaintSetEnabled (this, true); } /* * GroupScreen::glPaintOutput * * The base output-paint function. Here we just need to paint the * selection layer and the dragged slot on top of everything else * */ bool GroupScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GroupSelection *group; bool status; /* Keep track of viewports */ mTmpSel.mPainted = false; mTmpSel.mVpX = screen->vp ().x (); mTmpSel.mVpY = screen->vp ().y (); /* Allow us to paint windows transformed */ foreach (group, mGroups) { if (group->mResizeInfo || (group->mTabBar && (group->mTabBar->mChangeState != GroupTabBar::NoTabChange || group->mTabBar->mState != PaintOff)) || group->mTabbingState != GroupSelection::NoTabbing) { mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; break; } } status = gScreen->glPaintOutput (attrib, transform, region, output, mask); /* Just double check that we haven't painted our dragged tab * and selection rect on a transformed screen */ if (status && !mTmpSel.mPainted) { if ((mGrabState == ScreenGrabTabDrag) && mDraggedSlot) { GLMatrix wTransform (transform); GLWindow *gWindow = GLWindow::get (mDraggedSlot->mWindow); PaintState state; wTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); /* prevent tab bar drawing.. */ state = mDraggedSlot->mTabBar->mState; mDraggedSlot->mTabBar->mState = PaintOff; mDraggedSlot->setTargetOpacity (OPAQUE); mDraggedSlot->paint (gWindow->paintAttrib (), wTransform, region, region, 0); mDraggedSlot->mTabBar->mState = state; glPopMatrix (); } else if (mGrabState == ScreenGrabSelect) { mTmpSel.paint (attrib, transform, output, false); } } return status; } /* * GroupScreen::glPaintTransformedOutput * * This gets called if the screen is transformed, since there are * are different conditions here, we want to ensure that our * tab drag animation is still painted correctly * */ void GroupScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); /* If we are on the same viewport here, then we are OK to paint */ if ((mTmpSel.mVpX == screen->vp ().x ()) && (mTmpSel.mVpY == screen->vp ().y ())) { mTmpSel.mPainted = true; if ((mGrabState == ScreenGrabTabDrag) && mDraggedSlot && mDragged) { PaintState state; GLMatrix wTransform (transform); GLWindow *gWindow = GLWindow::get (mDraggedSlot->mWindow); gScreen->glApplyTransform (attrib, output, &wTransform); wTransform.toScreenSpace (output, -attrib.zTranslate); glPushMatrix (); glLoadMatrixf (wTransform.getMatrix ()); /* prevent tab bar drawing.. */ state = mDraggedSlot->mTabBar->mState; mDraggedSlot->mTabBar->mState = PaintOff; mDraggedSlot->setTargetOpacity (OPAQUE); mDraggedSlot->paint (gWindow->paintAttrib (), wTransform, region, region, 0); mDraggedSlot->mTabBar->mState = state; glPopMatrix (); } else if (mGrabState == ScreenGrabSelect) { mTmpSel.paint (attrib, transform, output, true); } } } /* * GroupScreen::donePaint * * Damage everything that needs to be damaged (usually the screen * for animations [FIXME] or tab bar / text regions if they are * currently animating * */ void GroupScreen::donePaint () { GroupSelection *group; bool damaged = false; cScreen->donePaint (); foreach (group, mGroups) { /* Animations are a special case, damage the whole screen */ if (group->mTabbingState != GroupSelection::NoTabbing) { cScreen->damageScreen (); damaged = true; } else if (group->mTabBar && group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { cScreen->damageScreen (); damaged = true; } else if (group->mTabBar) { bool needDamage = false; if ((group->mTabBar->mState == PaintFadeIn) || (group->mTabBar->mState == PaintFadeOut)) { needDamage = true; } if (group->mTabBar->mTextLayer) { if ((group->mTabBar->mTextLayer->mState == PaintFadeIn) || (group->mTabBar->mTextLayer->mState == PaintFadeOut)) { needDamage = true; } } if (group->mTabBar->mBgLayer && group->mTabBar->mBgLayer->mBgAnimation) needDamage = true; if (mDraggedSlot) needDamage = true; /* If we needed damage, then damage the whole tab bar * region */ if (needDamage) group->mTabBar->damageRegion (); damaged |= needDamage; } } /* If nothing needed damaging we can disable donePaint for now: * it will come back again when we call preparePaint anyways */ if (!damaged) cScreen->donePaintSetEnabled (this, false); } /* * GroupWindow::glDraw * * Our matrix is initialized here, so we can paint the glow here * (since we are free to paint with geometry) * */ bool GroupWindow::glDraw (const GLMatrix &transform, GLFragment::Attrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status; CompRegion paintRegion (region); /* Don't bother if we don't need to paint glow */ if (mGroup && (mGroup->mWindows.size () > 1) && mGlowQuads) { if (mask & PAINT_WINDOW_TRANSFORMED_MASK) paintRegion = CompRegion (CompRegion::infinite ()); if (paintRegion.numRects ()) { /* reset geometry and paint */ gWindow->geometry ().reset (); paintGlow (attrib, paintRegion, mask); } } status = gWindow->glDraw (transform, attrib, region, mask); return status; } /* * GroupWindow::getStretchRectangle * * Return how much to scale on the X and Y axis for some box * provided compared to the window geometry */ void GroupWindow::getStretchRectangle (CompRect &box, float &xScaleRet, float &yScaleRet) { int x1, x2, y1, y2; int width, height; float xScale, yScale; x1 = mResizeGeometry.x () - window->border ().left; y1 = mResizeGeometry.y () - window->border ().top; x2 = mResizeGeometry.x () + mResizeGeometry.width () + window->serverGeometry ().border () * 2 + window->border ().right; if (window->shaded ()) { y2 = mResizeGeometry.y () + window->height () + window->border ().bottom; } else { y2 = mResizeGeometry.y () + mResizeGeometry.height () + window->serverGeometry ().border () * 2 + window->border ().bottom; } width = window->width () + window->border ().left + window->border ().right; height = window->height () + window->border ().top + window->border ().bottom; xScale = (width) ? (x2 - x1) / (float) width : 1.0f; yScale = (height) ? (y2 - y1) / (float) height : 1.0f; x1 = x1 - (window->output ().left - window->border ().left) * xScale; y1 = y1 - (window->output ().top - window->border ().top) * yScale; x2 = x2 + window->output ().right * xScale; y2 = y2 + window->output ().bottom * yScale; box = CompRect (x1, y1, x2 - x1, y2 - y1); xScaleRet = xScale; yScaleRet = yScale; } /* * GroupScreen::damagePaintRectangle * * Damage some region, with 1px padding */ void GroupScreen::damagePaintRectangle (const CompRect &box) { CompRegion reg (box); reg.translate (-1, -1); reg.shrink (1, 1); cScreen->damageRegion (reg); } /* * GroupWindow::checkTabbing * * Check if this window should be tabbing * */ bool GroupWindow::checkTabbing () { /* Do the tabbing animation if we are currently in an animated * state and the following check fails * -> We have a tab bar AND * -> This is the top tab for the window AND * -> We are in a tabbing state * * In essence, we want to animate all windows in this group * in the tabbing animation, except where the current window * is the "prinicpal" window (ignoring a situation where * we are ungrouping a single window, in which case we animate * all windows) */ if (!mGroup || !mGroup->mTabBar) return false; return (mAnimateState & (IS_ANIMATED | FINISHED_ANIMATION)) && !(mGroup->mTabBar && IS_TOP_TAB (window, mGroup) && (mGroup->mTabbingState == GroupSelection::Tabbing)); } /* * GroupWindow::checkRotating * * Check if this window should be rotating * */ bool GroupWindow::checkRotating () { /* Rotate the window if we are changing tabs, and if the window * passes the following safety checks: * -> It has a top tab (and associated window) AND * -> It has a previous top tab (the window that we are * switching from) AND * Either * -> It is a top tab (and associated window) or OR * -> It is a previous top tab (and associated window) OR * * In essense, we can only do the rotate animation if there is * a window we are switching to or from (since the animation * has a "from" stage and a "to" stage) */ if (!mGroup) return false; return (mGroup->mTabBar && mGroup->mTabBar->mChangeState != GroupTabBar::NoTabChange) && HAS_TOP_WIN (mGroup) && HAS_PREV_TOP_WIN (mGroup) && (IS_TOP_TAB (window , mGroup) || IS_PREV_TOP_TAB (window, mGroup)); } /* * GroupWindow::checkShowTabBar * * Check if this window should show it's tab bar * */ bool GroupWindow::checkShowTabBar () { /* Show the tab bar if it exists, and is set to be painted and * the following checks pass: * Either: * -> This window is the top tab for the group AND * Either: * -> We aren't changing tabs OR * -> We are changing to this tab * OR: * -> This window is the previous top tab AND * -> We are changing away from this window * * The tab bar should be visible during the rotate animation. * All other times it should be invisible, except when hovering * over it * */ if (!mGroup) return false; return mGroup->mTabBar && (mGroup->mTabBar->mState != PaintOff) && (((IS_TOP_TAB (window, mGroup)) && ((mGroup->mTabBar->mChangeState == GroupTabBar::NoTabChange) || (mGroup->mTabBar->mChangeState == GroupTabBar::TabChangeNewIn))) || (IS_PREV_TOP_TAB (window, mGroup) && (mGroup->mTabBar->mChangeState == GroupTabBar::TabChangeOldOut))); } inline void perspectiveDistortAndResetZ (GLMatrix &transform) { float v = -1.0 / screen->width (); /* This does transform = M * transform, where M is 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, v, 0, 0, 0, 1 */ transform[8] = v * transform[12]; transform[9] = v * transform[13]; transform[10] = v * transform[14]; transform[11] = v * transform[15]; } /* * GroupWindow::glPaint * * This is different to GLDraw, since we can still modify the compiz * matrix. * * In this function, we handle painting of the tabbing/untabbing * stretched windows for resize and rotation of windows when switching * tabs * */ bool GroupWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; bool doRotate = checkRotating (); bool doTabbing = checkTabbing (); bool showTabbar = checkShowTabBar (); CompWindow *w = window; GROUP_SCREEN (screen); /* If this window is hidden, then don't draw it on screen */ if (mWindowHideInfo) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; /* If the window is being: * -> Selected * -> Group Resized * -> Rotated * -> Tabbed * -> Has a tab bar */ if (mInSelection || !mResizeGeometry.isEmpty () || doRotate || doTabbing || showTabbar) { GLWindowPaintAttrib wAttrib (attrib); GLMatrix wTransform (transform); float animProgress = 0.0f; int drawnPosX = 0, drawnPosY = 0; /* If it's selected, show that by changing it's paint * attributes (such as brightness, opacity, saturation */ if (mInSelection) { wAttrib.opacity = OPAQUE * gs->optionGetSelectOpacity () / 100; wAttrib.saturation = COLOR * gs->optionGetSelectSaturation () / 100; wAttrib.brightness = BRIGHT * gs->optionGetSelectBrightness () / 100; } if (doTabbing) { /* fade the window out */ float progress; int distanceX, distanceY; float origDistance, distance; /* If we are finished the animation, draw in the destination * not at the translation speed */ if (mAnimateState & FINISHED_ANIMATION) { drawnPosX = mDestination.x (); drawnPosY = mDestination.y (); } else { /* Add new translation points to drawn position */ drawnPosX = mOrgPos.x () + mTx; drawnPosY = mOrgPos.y () + mTy; } /* Determine progress as distance towards the destination */ distanceX = drawnPosX - mDestination.x (); distanceY = drawnPosY - mDestination.y (); distance = sqrt (pow (distanceX, 2) + pow (distanceY, 2)); distanceX = (mOrgPos.x () - mDestination.x ()); distanceY = (mOrgPos.y () - mDestination.y ()); origDistance = sqrt (pow (distanceX, 2) + pow (distanceY, 2)); /* Avoid div0 */ if (!distanceX && !distanceY) progress = 1.0f; else /* Fading progress is 1 - the distance on the ratio * of current difference to original distance */ progress = 1.0f - (distance / origDistance); animProgress = progress; /* If we are tabbing the group, invert that (since we are * fading out here) */ progress = MAX (progress, 0.0f); if (mGroup->mTabbingState == GroupSelection::Tabbing) progress = 1.0f - progress; /* Paint with a progressional opacity */ wAttrib.opacity = (float)wAttrib.opacity * progress; } if (doRotate) { /* Determine animation progress for rotation, here, * "2" is the maximum point, so at "1" the window switching * should have reached a half-way point, and we will no * longer paint that window and instead paint the new * incoming window */ float timeLeft = mGroup->mTabBar->mChangeAnimationTime; int animTime = gs->optionGetChangeAnimationTime () * 500; if (mGroup->mTabBar->mChangeState == GroupTabBar::TabChangeOldOut) timeLeft += animTime; /* 0 at the beginning, 1 at the end */ animProgress = 1 - (timeLeft / (2 * animTime)); } /* Determine resize geometry scale (window stretch on group * resize) */ if (!mResizeGeometry.isEmpty ()) { int xOrigin, yOrigin; float xScale, yScale; CompRect box; /* Get the scale amount for the resize box */ getStretchRectangle (box, xScale, yScale); xOrigin = window->x () - w->border ().left; yOrigin = window->y () - w->border ().top; wTransform.translate (xOrigin, yOrigin, 0.0f); wTransform.scale (xScale, yScale, 1.0f); wTransform.translate ((mResizeGeometry.x () - window->x ()) / xScale - xOrigin, (mResizeGeometry.y () - window->y ()) / yScale - yOrigin, 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; } else if (doRotate || doTabbing) { float animWidth, animHeight; float animScaleX, animScaleY; CompWindow *morphBase, *morphTarget; /* morphBase and morphTarget here are for both animations, * since during the course of the animation, they scale * the window to the size of the new relevant window * the user will see. * * In the tabbing animation, the windows morph into the * size of the top tab of the window group, or if untabbing * then they morph from the size of the top tab, and morph * to their original size. * * In the rotate animation, the outgoing window morphs into * the same size as the incoming window */ if (doTabbing) { if (mGroup->mTabbingState == GroupSelection::Tabbing) { morphBase = w; morphTarget = TOP_TAB (mGroup); } else { morphTarget = w; if (HAS_TOP_WIN (mGroup)) morphBase = TOP_TAB (mGroup); else morphBase = mGroup->mTabBar->mLastTopTab; } } else /* doRotate */ { morphBase = PREV_TOP_TAB (mGroup); morphTarget = TOP_TAB (mGroup); } /* Morph progressively based on the animation progress */ animWidth = (1 - animProgress) * WIN_REAL_WIDTH (morphBase) + animProgress * WIN_REAL_WIDTH (morphTarget); animHeight = (1 - animProgress) * WIN_REAL_HEIGHT (morphBase) + animProgress * WIN_REAL_HEIGHT (morphTarget); /* Don't allow absurdly small values or div0 */ animWidth = MAX (1.0f, animWidth); animHeight = MAX (1.0f, animHeight); animScaleX = animWidth / WIN_REAL_WIDTH (w); animScaleY = animHeight / WIN_REAL_HEIGHT (w); /* If we are rotating, we need to scale on z by 1 / z */ if (doRotate) wTransform.scale (1.0f, 1.0f, 1.0f / screen->width ()); /* Translate to the window center so we can paint windows * translated and rotated */ wTransform.translate (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) / 2.0f, WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) / 2.0f, 0.0f); /* Rotate the window based on the animation progress in the * rotating case. If this is the top window, then invert * the rotation start point. If the change direction * is left, then invert the rotating direction */ if (doRotate) { float rotateAngle = animProgress * 180.0f; if (IS_TOP_TAB (w, mGroup)) rotateAngle += 180.0f; if (mGroup->mTabBar->mChangeAnimationDirection < 0) rotateAngle *= -1.0f; perspectiveDistortAndResetZ (wTransform); wTransform.rotate (rotateAngle, 0.0f, 1.0f, 0.0f); } /* Draw the window translated depending on position */ if (doTabbing) wTransform.translate (drawnPosX - WIN_X (w), drawnPosY - WIN_Y (w), 0.0f); /* Since we are still centered, we can scale directly to * our morphing targets */ wTransform.scale (animScaleX, animScaleY, 1.0f); /* Recorrect translation matrix for next plugin */ wTransform.translate (-(WIN_REAL_X (w) + WIN_REAL_WIDTH (w) / 2.0f), -(WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) / 2.0f), 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; } status = gWindow->glPaint (wAttrib, wTransform, region, mask); if (showTabbar) { /* Paint the tab bar (only gets the geometry it got from * glPaint so far, so it doesn't wobbly or anything strange * like that, though maybe FIXME this should be changed) * * Disable our glPaint function here to avoid recursive * calls within GroupTabBar::paint, since we need to paint * this window geometry a few more times */ gWindow->glPaintSetEnabled (this, false); mGroup->mTabBar->paint (wAttrib, wTransform, mask, region); gWindow->glPaintSetEnabled (this, true); } } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } ./plugins/group/src/layers.h0000644000004100000410000001150613246301623016322 0ustar www-datawww-data/** * * Compiz group plugin * * layers.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _GROUP_LAYERS_H #define _GROUP_LAYERS_H #include "group.h" typedef enum { PaintOff = 0, PaintFadeIn, PaintFadeOut, PaintOn, PaintPermanentOn } PaintState; class Layer : public CompSize { public: Layer (const CompSize &size, GroupSelection *g) : CompSize::CompSize (size), mGroup (g), mState (PaintOff), mAnimationTime (0) {}; virtual ~Layer () {} virtual void damage () {}; GroupSelection *mGroup; PaintState mState; int mAnimationTime; }; class GLLayer : public Layer { public: GLLayer (const CompSize &size, GroupSelection *g) : Layer::Layer (size, g) {} public: virtual ~GLLayer () {} virtual void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) = 0; }; class TextureLayer : public GLLayer { public: TextureLayer (const CompSize &size, GroupSelection *g) : GLLayer::GLLayer (size, g), mPaintWindow (NULL) {} public: void setPaintWindow (CompWindow *); virtual void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); public: GLTexture::List mTexture; CompWindow *mPaintWindow; /* the window we are going to * paint with geometry */ }; class CairoLayer : public TextureLayer { public: virtual ~CairoLayer (); public: void clear (); virtual void render () = 0; virtual void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask) = 0; public: /* used if layer is used for cairo drawing */ unsigned char *mBuffer; cairo_surface_t *mSurface; cairo_t *mCairo; bool mFailed; protected: CairoLayer (const CompSize &size, GroupSelection *group); }; class BackgroundLayer : public CairoLayer { public: typedef enum { AnimationNone = 0, AnimationPulse, AnimationReflex } AnimationType; public: virtual ~BackgroundLayer () {} static BackgroundLayer * create (CompSize, GroupSelection *); static BackgroundLayer * rebuild (BackgroundLayer *, CompSize); void render (); void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); bool handleAnimation (int msSinceLastPaint); public: /* For animations */ int mBgAnimationTime; AnimationType mBgAnimation; private: BackgroundLayer (const CompSize &size, GroupSelection *group); }; class SelectionLayer : public CairoLayer { public: virtual ~SelectionLayer () {} static SelectionLayer * create (CompSize, GroupSelection *); static SelectionLayer * rebuild (SelectionLayer *, CompSize); void render (); void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); private: SelectionLayer (const CompSize &size, GroupSelection *group) : CairoLayer::CairoLayer (size, group) {} }; class TextLayer : public TextureLayer { public: virtual ~TextLayer () {} static TextLayer * create (CompSize &, GroupSelection *); static TextLayer * rebuild (TextLayer *); void paint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion &paintRegion, const CompRegion &clipRegion, int mask); void render (); private: TextLayer (const CompSize &size, GroupSelection *g) : TextureLayer::TextureLayer (size, g), mPixmap (None) {} public: /* used if layer is used for text drawing */ Pixmap mPixmap; }; #endif ./plugins/group/src/group_glow.h0000644000004100000410000007107413246301623017215 0ustar www-datawww-data#ifndef _GROUP_GLOWTEX_H #define _GROUP_GLOWTEX_H /** * * Compiz group plugin * * group_glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ /* * glowTex */ static char glowTexRect[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\14" "\377\377\377\14\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377" "\35\377\377\377\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377\27\377\377" "\377\27\377\377\377\35\377\377\377#\377\377\377'\377\377\377'\377\377\377" "+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377" "\377+\377\377\377+\377\377\377+\377\377\3771\377\377\3771\377\377\3771\377" "\377\3771\377\377\3771\377\377\3771\377\377\3771\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377" "\27\377\377\377\35\377\377\377#\377\377\377+\377\377\3771\377\377\3776\377" "\377\377<\377\377\377>\377\377\377C\377\377\377I\377\377\377I\377\377\377" "I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377" "\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377" "\377\377L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\22\377\377\377\27\377\377\377#\377\377\377+\377\377\3776\377\377" "\377C\377\377\377L\377\377\377U\377\377\377]\377\377\377`\377\377\377d\377" "\377\377h\377\377\377k\377\377\377k\377\377\377k\377\377\377k\377\377\377" "k\377\377\377k\377\377\377k\377\377\377p\377\377\377p\377\377\377p\377\377" "\377p\377\377\377p\377\377\377p\377\377\377p\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\14\377\377\377\22\314\314\314\35\377\377\377'\377" "\377\3771\377\377\377>\357\357\357P\377\377\377]\363\363\363k\365\365\365" "v\365\365\365|\377\377\377\202\367\367\367\210\367\367\367\214\367\367\367" "\216\367\367\367\221\367\367\367\221\367\367\367\221\367\367\367\221\367" "\367\367\221\367\367\367\221\367\367\367\224\367\367\367\224\367\367\367" "\224\367\367\367\224\367\367\367\224\367\367\367\224\367\367\367\224\0\0" "\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\27\377" "\377\377'\377\377\3776\377\377\377I\377\377\377Y\377\377\377k\376\376\376" "y\377\377\377\210\377\377\377\224\377\377\377\235\377\377\377\245\377\377" "\377\253\377\377\377\255\377\377\377\262\377\377\377\262\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\266\377\377\377\266\377\377\377\266\377\377\377\266\377\377\377\266" "\377\377\377\266\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\27\377\377\377#\377\377\3771\377\377\377I\377\377\377]\377" "\377\377r\377\377\377\205\377\377\377\231\377\377\377\247\377\377\377\263" "\377\377\377\275\377\377\377\304\377\377\377\310\377\377\377\313\377\377" "\377\316\377\377\377\320\377\377\377\320\377\377\377\320\377\377\377\320" "\377\377\377\320\377\377\377\320\377\377\377\322\377\377\377\322\377\377" "\377\322\377\377\377\322\377\377\377\322\377\377\377\322\377\377\377\322" "\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\35\377\377" "\377+\377\377\377>\377\377\377Y\377\377\377r\377\377\377\210\376\376\376" "\237\377\377\377\262\377\377\377\302\377\377\377\313\377\377\377\324\377" "\377\377\332\376\376\376\336\377\377\377\341\377\377\377\342\377\377\377" "\344\377\377\377\344\377\377\377\344\377\377\377\344\377\377\377\344\377" "\377\377\344\377\377\377\345\377\377\377\345\377\377\377\345\377\377\377" "\345\377\377\377\345\377\377\377\345\377\377\377\345\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377#\377\377\3776\377\377\377P\377" "\377\377k\377\377\377\205\376\376\376\237\372\372\372\266\377\377\377\307" "\373\373\373\325\373\373\373\337\374\374\374\345\374\374\374\352\374\374" "\374\355\374\374\374\357\374\374\374\360\374\374\374\361\374\374\374\361" "\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374" "\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362" "\374\374\374\362\374\374\374\362\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\377+\377\377\377C\377\377\377]\377\377\377|\377\377\377" "\231\377\377\377\263\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\22\324\324\324#\377\377\3771\377\377\377L\363\363" "\363k\377\377\377\210\377\377\377\247\377\377\377\302\377\377\377\325\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377" "\377#\377\377\377<\377\377\377U\377\377\377v\377\377\377\226\377\377\377" "\263\377\377\377\315\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377'\377\377\377>\377\377\377]\377" "\377\377|\370\370\370\237\377\377\377\275\373\373\373\325\377\377\377\345" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\27\377" "\377\377+\377\377\377C\377\377\377`\377\377\377\202\377\377\377\247\377\377" "\377\304\377\377\377\332\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\27\377\377\377+\377\377\377C\377\377\377" "d\377\377\377\210\377\377\377\253\377\377\377\310\376\376\376\336\374\374" "\374\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\377+\377\377\377I\377\377\377h\377\377\377\214\377\377\377\260" "\377\377\377\313\374\374\374\342\374\374\374\357\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\342\342\3421\377\377\377I\377" "\377\377k\377\377\377\216\377\377\377\262\377\377\377\316\374\374\374\344" "\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377k\377\377\377\221\377\377" "\377\263\377\377\377\320\377\377\377\344\377\377\377\361\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377k\377\377\377\221\377\377\377\263\377\377\377\320\377\377" "\377\344\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\364\364\364p\377\377\377\221" "\372\372\372\266\377\377\377\320\374\374\374\345\377\377\377\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373\373\322" "\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\377\377" "\377\221\377\377\377\266\373\373\373\322\377\377\377\345\377\377\377\362" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377" "\377\3771\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373" "\373\322\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377" "p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345\374\374" "\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266" "\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377" "\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345" "\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377" "\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377" "\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224" "\377\377\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322" "\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", }; static char glowTexRing [4097]= { "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\201\202\202\1\205\205\205\2\206" "\206\206\4\210\210\210\6\211\211\211\10\212\212\212\13\213\213\213\14\213" "\213\213\15\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\204" "\203\203\0\206\206\206\1\207\207\207\3\210\211\211\10\213\213\213\16\216" "\216\216\25\220\220\220\33\222\223\222\40\224\224\224%\225\226\225(\227\227" "\227*\227\227\227+\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\202\203\203\0\206\206" "\205\3\211\211\211\10\214\214\214\22\220\220\220\34\225\225\225&\230\231" "\230.\234\234\2347\237\237\237=\242\242\242C\244\244\244G\245\245\246J\246" "\246\246L\247\247\247M\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\205\205\204\0\207\207\207\3\213\213\213\14\217" "\217\217\27\224\224\224$\232\232\2310\236\236\236:\244\244\244E\247\250\250" "M\254\253\254V\257\256\257\\\261\261\261b\264\264\264g\265\265\265j\266\266" "\266l\267\267\267m\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\205\205\205\1\212\212\212\12\217\217\217\30\225\225\225'\233\234" "\2335\242\242\242B\250\250\250O\255\255\255Z\263\263\263d\267\267\267m\273" "\273\273u\276\276\276|\301\301\301\203\304\304\304\207\305\305\305\213\307" "\307\307\215\307\307\307\217\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\205\205\205" "\1\211\211\211\7\215\215\216\24\225\225\225&\234\234\2345\243\243\243F\253" "\252\252S\261\261\261a\267\270\267n\275\275\275y\303\303\303\204\307\307" "\307\216\314\313\313\226\317\317\317\235\322\322\322\244\324\324\324\251" "\326\326\326\254\330\330\330\257\330\330\330\260\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\205" "\205\205\1\211\211\211\13\221\221\221\35\230\230\230.\241\241\241A\251\251" "\251P\261\260\261a\270\270\270p\277\277\277~\306\306\305\213\313\313\313" "\226\321\321\321\242\325\325\325\253\332\332\332\264\336\336\336\273\341" "\341\341\302\344\344\344\310\346\345\345\313\347\347\347\316\347\347\350" "\317\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\205\204\204\0\207\207\207\4\215\215\215\22\224\224\224%\236\236\236:\246" "\246\246K\260\260\260_\270\267\270o\300\300\300\200\310\310\310\217\317\317" "\317\236\326\326\326\254\334\334\334\267\342\342\342\304\346\346\346\315" "\353\353\353\327\357\357\357\336\362\362\362\345\365\365\365\352\367\367" "\366\355\370\367\367\357\367\370\367\360\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\206\205\205\0\210\207\210\4\215\215\215\24\227\226\226" ")\237\237\237=\252\251\252R\262\262\262d\274\274\274x\305\305\305\211\315" "\315\315\232\325\325\325\252\334\334\334\271\344\343\343\310\351\352\351" "\323\360\360\360\340\364\364\364\351\371\371\371\361\372\372\372\364\372" "\372\373\364\372\371\371\362\371\371\371\357\371\370\370\355\370\370\370" "\354\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\205\205\205\0\210\210\210\5" "\217\217\217\27\230\230\230.\243\243\243D\255\255\255X\267\267\267n\300\300" "\300\200\313\313\313\226\323\323\323\247\334\334\334\271\344\345\344\311" "\354\354\354\331\363\363\363\347\370\370\370\361\372\373\373\364\372\372" "\372\361\366\367\367\350\364\364\364\340\361\361\361\331\357\357\357\323" "\355\355\355\316\354\354\354\313\353\353\354\312\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\204\204\204\0\210\210\207\4\217\217\217\27\230\230\230-\243\243\243D\256" "\256\256[\271\271\271p\303\303\304\206\315\315\315\231\330\330\327\257\340" "\340\340\301\352\352\352\324\362\362\362\343\370\370\370\361\372\372\372" "\363\370\370\370\354\364\364\363\340\360\360\360\325\353\354\354\312\351" "\351\351\302\346\346\345\272\343\343\343\264\342\342\342\260\341\340\341" "\255\340\340\340\254\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\207\207\207\3\215\215\215\24" "\230\230\230-\243\243\243D\257\257\257\\\272\272\272t\305\305\305\212\320" "\320\320\240\332\332\332\263\345\345\345\312\356\356\356\334\367\367\367" "\356\372\372\372\364\370\370\370\354\362\362\362\334\355\355\355\317\350" "\350\350\301\344\344\344\266\337\340\337\252\335\334\335\242\331\331\331" "\231\327\327\327\223\325\325\325\217\324\324\324\213\323\323\323\212\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\205\205\205\1\214\214\214\21\226\226\226(\242\242\242C\256\256\256" "[\272\272\272t\306\306\306\213\321\321\321\241\334\334\334\271\346\346\346" "\315\362\362\362\343\371\371\371\361\371\371\371\360\364\364\364\341\356" "\356\356\320\350\350\350\300\343\342\342\262\335\335\335\243\331\331\331" "\227\324\324\324\213\321\321\321\202\316\315\316z\313\313\313s\312\312\312" "n\310\310\310k\310\310\310i\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\205\205\205\1\211\211\211\12\224\224\224$\237\237" "\237<\254\254\254X\270\270\270o\304\305\304\211\321\321\321\241\334\334\334" "\270\350\350\350\320\362\362\362\345\372\372\373\364\370\370\370\355\361" "\361\361\332\352\352\353\307\344\344\343\265\335\335\335\244\330\330\330" "\225\322\322\322\206\315\316\315z\311\311\311m\305\305\305d\302\302\302Z" "\300\300\277T\276\275\276O\274\274\274K\274\274\274I\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\211\211\211\6\220\220\220" "\34\235\235\2358\251\251\251Q\267\267\266m\303\303\303\206\320\320\320\240" "\334\334\334\270\350\350\350\320\364\364\364\350\372\373\372\365\366\366" "\366\347\357\357\357\323\347\347\347\276\340\340\340\253\331\331\331\230" "\322\322\322\206\315\315\314w\306\307\307g\302\302\302Z\275\275\275L\271" "\272\271C\266\266\266:\264\264\2632\262\262\262,\260\260\260)\260\260\260" "'\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\204\204\204\1\215" "\215\215\22\227\230\230,\245\245\245J\262\262\262c\300\300\300\177\314\314" "\314\230\332\332\331\263\346\346\346\314\362\362\362\344\372\372\372\364" "\367\367\367\352\356\356\356\321\347\346\346\275\336\336\336\247\327\327" "\327\223\320\320\320\177\311\311\311m\303\303\303]\275\274\275L\270\270\270" ">\263\263\2630\257\257\257&\254\254\254\34\252\252\252\25\250\250\250\20" "\250\247\250\14\250\247\250\12\377\377\377\0\377\377\377\0\377\377\377\0" "\204\204\204\0\211\211\211\11\224\224\224$\240\240\240?\257\257\257]\274" "\274\274w\312\312\312\224\327\327\327\256\344\344\344\311\362\361\362\343" "\372\373\372\364\366\366\367\347\356\357\356\321\344\344\344\267\335\335" "\335\242\324\324\324\213\314\314\314v\305\305\305b\276\276\276O\270\270\270" ">\261\261\261,\255\254\255\36\251\251\251\20\246\246\246\7\243\243\243\2" "\241\241\241\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\207\206\207\3\216\215\216\25\233\233\2333\247\247" "\250N\267\267\267m\303\304\304\207\323\323\323\245\337\340\337\277\355\355" "\355\333\371\371\371\361\371\370\371\355\357\357\357\324\347\347\346\275" "\335\335\335\242\325\325\325\215\313\314\313u\304\304\304_\274\274\274K\265" "\265\2656\257\257\257$\251\252\251\22\246\246\246\7\245\244\244\1\243\243" "\243\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\202\203\202\0\212\212\212\12\224\224\224%" "\242\242\242C\260\260\260_\277\277\277~\314\314\314\230\334\334\333\267\351" "\351\351\322\366\366\366\355\372\372\372\361\362\362\362\332\350\347\347" "\277\336\336\336\247\324\324\324\214\314\314\314u\303\303\303\\\272\272\273" "F\263\263\2630\254\254\254\33\247\247\247\12\243\243\243\1\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\206\205\205\2\216\216" "\216\25\232\232\2322\252\251\251Q\267\267\267m\307\307\307\215\324\324\324" "\250\344\344\343\307\361\361\361\342\372\372\372\364\365\365\365\343\353" "\353\353\310\340\340\340\254\327\327\327\224\314\314\315w\304\304\304`\273" "\272\273F\263\263\263/\253\253\253\31\247\247\247\7\244\244\244\1\242\242" "\242\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\203\202\202\0" "\210\210\210\7\223\223\223!\240\240\240?\260\260\260^\276\275\276{\316\315" "\316\233\333\333\333\267\353\353\353\326\367\367\370\357\370\370\370\356" "\357\357\357\322\344\344\344\267\332\331\331\232\320\320\320\201\305\305" "\305c\274\274\274L\263\263\2631\254\253\254\31\246\246\246\6\243\243\243" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\206\206\206\1\214\214\214\17\230\230\230-\247\246\246K\266\266" "\266k\304\304\304\210\325\324\324\251\342\342\342\305\362\362\362\345\372" "\372\372\364\363\363\363\337\351\351\351\302\336\336\336\246\323\323\323" "\210\311\311\311n\276\276\276P\266\266\2658\254\254\254\34\247\247\247\7" "\243\243\243\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\206\207\207\2\217\217\217\30\235\235\235" "7\254\254\254V\273\273\273v\312\312\312\223\332\332\332\264\350\350\350\321" "\367\370\370\360\371\371\370\356\356\356\356\321\343\343\343\264\331\331" "\331\227\315\315\315y\304\304\304^\270\270\270@\257\257\257&\247\247\247" "\13\244\244\244\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\210\210\210\6\223\223" "\223#\242\242\242B\261\261\261a\301\301\301\201\317\317\317\237\340\340\340" "\300\356\356\356\335\372\372\372\365\365\365\365\343\351\351\351\304\336" "\336\336\245\323\323\323\210\307\307\307i\275\276\276N\262\262\262.\252\252" "\252\24\244\243\244\1\242\242\242\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\202\202\202\0\212" "\212\212\13\226\226\227*\246\246\246J\265\265\265i\305\305\305\212\324\324" "\324\247\345\345\345\312\363\363\363\346\372\372\372\363\361\361\361\331" "\345\345\345\271\332\332\332\232\316\316\316}\303\303\303]\271\271\271A\255" "\255\255\40\247\247\247\10\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\203\203\203\1\214\214\214\21\232\232\2322\252\251\252R\271\271\271r\311" "\311\312\222\330\330\331\261\351\351\351\323\367\367\367\357\370\370\370" "\354\355\355\355\316\341\341\341\256\325\325\325\217\312\312\312p\276\276" "\276P\264\264\2643\251\251\251\22\245\245\245\2\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\205\205\205\2\217\217\217\26\235\235\2359\255\255" "\255X\274\274\274x\315\315\315\231\334\334\334\270\355\355\355\332\372\371" "\372\363\365\365\365\344\352\352\352\306\336\336\336\245\322\322\322\206" "\306\307\307g\273\273\273F\260\260\260)\246\246\246\12\242\242\243\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\207\207\207\4\221\221\220\33" "\240\240\237>\257\257\257^\277\277\277~\320\320\320\240\337\337\337\276\360" "\360\360\341\372\372\372\364\363\363\363\335\347\347\347\276\333\333\333" "\236\317\317\317}\303\304\304^\267\267\267=\255\255\255\40\244\244\244\4" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\211\210\210" "\5\222\222\222\40\242\242\242B\262\262\262b\302\301\302\203\322\322\322\244" "\341\341\341\303\363\363\363\346\372\372\372\363\360\360\360\327\345\345" "\345\271\330\330\330\227\314\315\315w\301\301\301X\265\265\2657\253\253\253" "\31\242\242\242\1\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\210\211\210\10\224\223\223#\243\243\243E\263\263\263e\303\303\303" "\206\324\323\324\250\343\343\343\307\365\364\364\351\372\372\372\362\357" "\357\357\323\344\344\343\264\327\327\327\223\313\313\313r\277\277\277S\263" "\263\2631\252\252\252\23\241\241\241\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\211\211\211\11\225\224\224%\244\244\244G\264" "\264\264g\304\304\304\210\325\325\325\252\345\344\344\311\366\366\366\353" "\372\372\372\361\356\356\356\320\342\342\343\261\326\326\326\220\312\312" "\312p\276\276\276P\262\262\262-\251\251\251\17\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\211\211\211\11\225\225" "\225&\244\245\244H\265\265\265i\305\305\305\211\325\326\325\253\345\345\345" "\312\366\366\366\354\371\371\371\360\355\355\355\317\342\342\342\260\325" "\325\325\217\312\311\312n\276\276\276N\262\262\262,\250\250\250\16\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" }; #endif ./plugins/group/src/glow.cpp0000644000004100000410000004117413246301623016332 0ustar www-datawww-data/** * * Compiz group plugin * * glow.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" #include "group_glow.h" const unsigned short GLOWQUAD_TOPLEFT = 0; const unsigned short GLOWQUAD_TOPRIGHT = 1; const unsigned short GLOWQUAD_BOTTOMLEFT = 2; const unsigned short GLOWQUAD_BOTTOMRIGHT = 3; const unsigned short GLOWQUAD_TOP = 4; const unsigned short GLOWQUAD_BOTTOM = 5; const unsigned short GLOWQUAD_LEFT = 6; const unsigned short GLOWQUAD_RIGHT = 7; const unsigned short NUM_GLOWQUADS = 8; const GlowTextureProperties glowTextureProperties[2] = { /* GlowTextureRectangular */ {glowTexRect, 32, 21}, /* GlowTextureRing */ {glowTexRing, 32, 16} }; /* * GroupWindow::getOutputExtents * * Wrappable function, return the extents of how much we expect to be painting * on the window including the glow (since the glow goes outside the default * clip region, so we need to let core know that the clip region needs to be * /slightly/ larger * */ void GroupWindow::getOutputExtents (CompWindowExtents &output) { GROUP_SCREEN (screen); window->getOutputExtents (output); /* Only bother if this window would have glow */ if (mGroup && mGroup->mWindows.size () > 1) { int glowSize = gs->optionGetGlowSize (); int glowType = gs->optionGetGlowType (); int glowTextureSize = gs->mGlowTextureProperties[glowType].textureSize; int glowOffset = gs->mGlowTextureProperties[glowType].glowOffset; glowSize = glowSize * (glowTextureSize - glowOffset) / glowTextureSize; /* glowSize is the size of the glow outside the window decoration * (w->border), while w->output includes the size of w->border * this is why we have to add w->input here */ output.left = MAX (output.left, glowSize + window->border ().left); output.right = MAX (output.right, glowSize + window->border ().right); output.top = MAX (output.top, glowSize + window->border ().top); output.bottom = MAX (output.bottom, glowSize + window->border ().bottom); } } /* * GroupWindow::paintGlow * * Takes our glow texture, stretches the appropriate positions in the glow texture, * adds those geometries (so plugins like wobby and deform this texture correctly) * and then draws the glow texture with this geometry (plugins like wobbly and friends * will automatically deform the texture based on our set geometry) */ void GroupWindow::paintGlow (GLFragment::Attrib &attrib, const CompRegion &paintRegion, unsigned int mask) { CompRegion reg; int i; GROUP_SCREEN (screen); /* There are 8 glow parts of the glow texture which we wish to paint * separately with different transformations */ for (i = 0; i < NUM_GLOWQUADS; i++) { /* Using precalculated quads here */ reg = CompRegion (mGlowQuads[i].mBox); if (reg.boundingRect ().x1 () < reg.boundingRect ().x2 () && reg.boundingRect ().y1 () < reg.boundingRect ().y2 ()) { GLTexture::MatrixList matl; reg = CompRegion (reg.boundingRect ().x1 (), reg.boundingRect ().y1 (), reg.boundingRect ().width (), reg.boundingRect ().height ()); matl.push_back (mGlowQuads[i].mMatrix); gWindow->glAddGeometry (matl, reg, paintRegion); } } /* If the geometry add succeeded */ if (gWindow->geometry ().vertices) { GLFragment::Attrib fAttrib (attrib); GLushort average; GLushort color[3] = {mGroup->mColor[0], mGroup->mColor[1], mGroup->mColor[2]}; /* Apply brightness to color. */ color[0] *= (float)attrib.getBrightness () / BRIGHT; color[1] *= (float)attrib.getBrightness () / BRIGHT; color[2] *= (float)attrib.getBrightness () / BRIGHT; /* Apply saturation to color. */ average = (color[0] + color[1] + color[2]) / 3; color[0] = average + (color[0] - average) * attrib.getSaturation () / COLOR; color[1] = average + (color[1] - average) * attrib.getSaturation () / COLOR; color[2] = average + (color[2] - average) * attrib.getSaturation () / COLOR; fAttrib.setOpacity (OPAQUE); fAttrib.setSaturation (COLOR); fAttrib.setBrightness (BRIGHT); gs->gScreen->setTexEnvMode (GL_MODULATE); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4us (color[0], color[1], color[2], attrib.getOpacity ()); /* we use PAINT_WINDOW_TRANSFORMED_MASK here to force the usage of a good texture filter */ foreach (GLTexture *tex, gs->mGlowTexture) { gWindow->glDrawTexture (tex, fAttrib, mask | PAINT_WINDOW_BLEND_MASK | PAINT_WINDOW_TRANSLUCENT_MASK | PAINT_WINDOW_TRANSFORMED_MASK); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); gs->gScreen->setTexEnvMode (GL_REPLACE); glColor4usv (defaultColor); } } /* * GroupWindow::computeGlowQuads * * This function computures the matrix transformation required for each * part of the glow texture which we wish to stretch to some rectangular * dimensions * * There are eight quads different parts of the texture which we wish to * paint here, the 4 sides and four corners, eg: * * ------------------ * | 1 | 4 | 6 | * ------------- ------------------ * | 1 | 4 | 6 | | | | | * ------------- | | | | * | 2 | n | 7 | -> | 2 | n | 7 | * ------------- | | | | * | 3 | 5 | 8 | | | | | * ------------- ------------------ * | 3 | 5 | 8 | * ------------------ * * In this example here, 2, 4, 5 and 7 are stretched, and the matrices for * each quad rect adjusted accordingly for it's size compared to the original * texture size. * * When we are adjusting the matrices here, the initial size of each corner has * a size of of "1.0f", so according to 2x2 matrix rules, * the scale factor is the inverse of the size of the glow (which explains * while you will see here that matrix->xx is (1 / glowSize) * where glowSize is the size the user specifies they want their glow to extend. * (likewise, matrix->yy is adjusted similarly for corners and for top/bottom) * * matrix->x0 and matrix->y0 here are set to be the top left edge of the rect * adjusted by the matrix scale factor (matrix->xx and matrix->yy) * */ void GroupWindow::computeGlowQuads (GLTexture::Matrix *matrix) { CompRect *box; int x1, x2, y1, y2; GLTexture::Matrix *quadMatrix; int glowSize, glowOffset; int glowType; CompWindow *w = window; GROUP_SCREEN (screen); /* Passing NULL to this function frees the glow quads * (so the window is not painted with glow) */ if (gs->optionGetGlow () && matrix) { if (!mGlowQuads) mGlowQuads = new GlowQuad[NUM_GLOWQUADS]; if (!mGlowQuads) return; } else { if (mGlowQuads) { delete[] mGlowQuads; mGlowQuads = NULL; } return; } glowSize = gs->optionGetGlowSize (); glowType = gs->optionGetGlowType (); glowOffset = (glowSize * gs->mGlowTextureProperties[glowType].glowOffset / gs->mGlowTextureProperties[glowType].textureSize) + 1; /* Top left corner */ box = &mGlowQuads[GLOWQUAD_TOPLEFT].mBox; mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix; /* Set the desired rect dimensions * for the part of the glow we are painting */ x1 = WIN_REAL_X (w) - glowSize + glowOffset; y1 = WIN_REAL_Y (w) - glowSize + glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling both parts of the texture in a positive direction * here (left to right top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the x and y dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 1.0f / glowSize; quadMatrix->yy = 1.0f / (glowSize); quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); x2 = MIN (WIN_REAL_X (w) + glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); y2 = MIN (WIN_REAL_Y (w) + glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top right corner */ box = &mGlowQuads[GLOWQUAD_TOPRIGHT].mBox; mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix; /* Set the desired rect dimensions * for the part of the glow we are painting */ x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y1 = WIN_REAL_Y (w) - glowSize + glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the y part of the texture in a positive direction * and the x part in a negative direction here * (right to left top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the y dimension and forwards on x by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - x1 * xx */ quadMatrix->xx = -1.0f / glowSize; quadMatrix->yy = 1.0f / glowSize; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); y2 = MIN (WIN_REAL_Y (w) + glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom left corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mBox; mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix; x1 = WIN_REAL_X (w) - glowSize + glowOffset; y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; x2 = WIN_REAL_X (w) + glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the x part of the texture in a positive direction * and the y part in a negative direction here * (left to right bottom to top) * * The base position (x0 and y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - y1 * yy */ quadMatrix->xx = 1.0f / glowSize; quadMatrix->yy = -1.0f / glowSize; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0f - (y1 * quadMatrix->yy); y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); x2 = MIN (WIN_REAL_X (w) + glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom right corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mBox; mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix; x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the both parts of the texture in a negative direction * (right to left bottom to top) * * The base position (x0 and y0) here requires us to move forwards * on both dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -1.0f / glowSize; quadMatrix->yy = -1.0f / glowSize; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset, WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2)); y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset, WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2)); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top edge */ box = &mGlowQuads[GLOWQUAD_TOP].mBox; mGlowQuads[GLOWQUAD_TOP].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOP].mMatrix; x1 = WIN_REAL_X (w) + glowOffset; y1 = WIN_REAL_Y (w) - glowSize + glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y2 = WIN_REAL_Y (w) + glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a positive direciton * * The base position (y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = 1.0f / glowSize; quadMatrix->x0 = 1.0; quadMatrix->y0 = -(y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom edge */ box = &mGlowQuads[GLOWQUAD_BOTTOM].mBox; mGlowQuads[GLOWQUAD_BOTTOM].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOM].mMatrix; x1 = WIN_REAL_X (w) + glowOffset; y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a negative direciton * * The base position (y0) here requires us to move forwards * on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = -1.0f / glowSize; quadMatrix->x0 = 1.0; quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Left edge */ box = &mGlowQuads[GLOWQUAD_LEFT].mBox; mGlowQuads[GLOWQUAD_LEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_LEFT].mMatrix; x1 = WIN_REAL_X (w) - glowSize + glowOffset; y1 = WIN_REAL_Y (w) + glowOffset; x2 = WIN_REAL_X (w) + glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a positive direciton * * The base position (x0) here requires us to move backwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 1.0f / glowSize; quadMatrix->yy = 0.0f; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Right edge */ box = &mGlowQuads[GLOWQUAD_RIGHT].mBox; mGlowQuads[GLOWQUAD_RIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_RIGHT].mMatrix; x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset; y1 = WIN_REAL_Y (w) + glowOffset; x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset; y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a negative direciton * * The base position (x0) here requires us to move forwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -1.0f / glowSize; quadMatrix->yy = 0.0f; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); } ./plugins/group/src/group.cpp0000644000004100000410000015664513246301623016530 0ustar www-datawww-data/** * * Compiz group plugin * * group.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" const double PI = 3.14159265359f; /* * GroupExp class * * A custom subclass of CompMatch::Expression which we can create * on matchInitExp to evaluate whether or not a window is actually * grouped. * */ class GroupExp : public CompMatch::Expression { public: GroupExp (const CompString &str); bool evaluate (const CompWindow *w) const; bool value; }; /* * GroupExp::GroupExp * * Internal value here is the "1" or "0" of group= * (eg we pass str.substr (6) to get that). Compare whether * the window is actually in a group against this value when * evaluating the match * */ GroupExp::GroupExp (const CompString &str) : value (strtol (str.c_str (), NULL, 0)) { } /* * GroupExp::evaluate * * Compare if we wanted a window to be grouped and whether or not * the window is actually in fact grouped */ bool GroupExp::evaluate (const CompWindow *w) const { GROUP_WINDOW (w); return ((value && gw->mGroup) || (!value && !gw->mGroup)); } /* * GroupScreen::matchInitExp * * Every time a match option is initialized, this wrapped function gets * called so that we can create an expression if we need to. * * Note here that core parses each match string and tokenizes them * based on spaces, so we only need to worry about matching * "group=" and nothing else. * */ CompMatch::Expression * GroupScreen::matchInitExp (const CompString &str) { /* Create a new match object */ if (str.find ("group=") == 0) return new GroupExp (str.substr (6)); return screen->matchInitExp (str); } /* * GroupScreen::matchExpHandlerChanged * * This gets called whenever some plugin needs to check all windows * again to see if they still match, so go ahead and update match * properties for windows if they are relevant here */ void GroupScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); foreach (CompWindow *w, screen->windows ()) { if (GroupWindow::get (w)->mGroup) screen->matchPropertyChanged (w); } } /* * GroupWindow::isGroupWindow * * Simple set of condensed checks on the window to check if it * makes sense to handle this window with the group plugin * */ bool GroupWindow::isGroupWindow () { GROUP_SCREEN (screen); if (window->overrideRedirect ()) return false; if (window->type () & CompWindowTypeDesktopMask) return false; if (window->invisible ()) return false; if (!gs->optionGetWindowMatch ().evaluate (window)) return false; return true; } /* * GroupWindow::dragHoverTimeout * * Description: * Activates a window after a certain time a slot has been dragged over it. * */ bool GroupWindow::dragHoverTimeout () { GROUP_SCREEN (screen); if (gs->optionGetBarAnimations () && mGroup->mTabBar && mGroup->mTabBar->mBgLayer) { BackgroundLayer *bg = mGroup->mTabBar->mBgLayer; bg->mBgAnimation = BackgroundLayer::AnimationPulse; bg->mBgAnimationTime = gs->optionGetPulseTime () * 1000; } window->activate (); return false; } /* * GroupWindow::updateResizeRectangle * * Updates the new resize rect of grouped windows of a group * which is currently being resized. This checks the difference * of the "master geometry" and the original geometry of the grabbed * window of the group and applies it to this window. Obviously, * we can't do anything like resize past boundaries so constrain the * window size if this happens. * Also set the relevant configure masks */ unsigned int GroupWindow::updateResizeRectangle (CompRect masterGeometry, bool damage) { CompRect newGeometry; CompRect &origGeometry = mGroup->mResizeInfo->mOrigGeometry; unsigned int mask = 0; int newWidth, newHeight; int widthDiff, heightDiff; if (mResizeGeometry.isEmpty () || !mGroup->mResizeInfo) return 0; /* New geometry //position// is the difference between the master geometry * and the original geometry */ newGeometry.setX (WIN_X (window) + (masterGeometry.x () - mGroup->mResizeInfo->mOrigGeometry.x ())); newGeometry.setY (WIN_Y (window) + (masterGeometry.y () - mGroup->mResizeInfo->mOrigGeometry.y ())); /* New geometry //size// is the difference in sizes between the master and original * geometry, plus the size of this window (obviously check for negative values) */ widthDiff = masterGeometry.width () - origGeometry.width (); newGeometry.setWidth (MAX (1, WIN_WIDTH (window) + widthDiff)); heightDiff = masterGeometry.height () - origGeometry.height (); newGeometry.setHeight (MAX (1, WIN_HEIGHT (window) + heightDiff)); if (window->constrainNewWindowSize (newGeometry.width (), newGeometry.height (), &newWidth, &newHeight)) { newGeometry.setSize (CompSize (newWidth, newHeight)); } if (damage) { if (mResizeGeometry != newGeometry) { cWindow->addDamage (); } } /* Set appropriate XConfigure masks */ if (newGeometry.x () != mResizeGeometry.x ()) { mResizeGeometry.setX (newGeometry.x ()); mask |= CWX; } if (newGeometry.y () != mResizeGeometry.y ()) { mResizeGeometry.setY (newGeometry.y ()); mask |= CWY; } if (newGeometry.width () != mResizeGeometry.width ()) { mResizeGeometry.setWidth (newGeometry.width ()); mask |= CWWidth; } if (newGeometry.height () != mResizeGeometry.height ()) { mResizeGeometry.setHeight (newGeometry.height ()); mask |= CWHeight; } return mask; } /* * GroupScreen::grabScreen * * Convenience function to grab the screen with different grab * masks, etc * */ void GroupScreen::grabScreen (GroupScreen::GrabState newState) { if ((mGrabState != newState) && mGrabIndex) { screen->removeGrab (mGrabIndex, NULL); mGrabIndex = 0; } if (newState == ScreenGrabSelect) { mGrabIndex = screen->pushGrab (None, "group"); } else if (newState == ScreenGrabTabDrag) { mGrabIndex = screen->pushGrab (None, "group-drag"); } mGrabState = newState; checkFunctions (); } /* * GroupSelection::raiseWindows * * Raises all windows in a group * * Creates a list of all windows that need to be raised * and then raises them all in one go (restacks them below the top * window). * * Doesn't appear to work with 0.9, perhaps because of the changes * in the restacking code * */ void GroupSelection::raiseWindows (CompWindow *top) { CompWindowList stack; CompWindowList::iterator it; if (mWindows.size () == 1) return; stack.resize (mWindows.size () - 1); it = stack.begin (); foreach (CompWindow *w, screen->windows ()) { GROUP_WINDOW (w); if ((w->id () != top->id ()) && (gw->mGroup == this)) { (*it) = w; ++it; } } foreach (CompWindow *cw, stack) cw->restackBelow (top); } /* * GroupSelection::minimizeWindows * * Minimizes all windows in a group. Don't minimize the principal * window twice, obviously * */ void GroupSelection::minimizeWindows (CompWindow *top, bool minimize) { foreach (CompWindow *w, mWindows) { if (w->id () == top->id ()) continue; if (minimize) w->minimize (); else w->unminimize (); } } /* * GroupSelection::shadeWindows * * Shade all windows in a group * * After shading we need to update the window attributes * */ void GroupSelection::shadeWindows (CompWindow *top, bool shade) { unsigned int state; foreach (CompWindow *w, mWindows) { if (w->id () == top->id ()) continue; if (shade) state = w->state () | CompWindowStateShadedMask; else state = w->state () & ~CompWindowStateShadedMask; w->changeState (state); w->updateAttributes (CompStackingUpdateModeNone); } } /* * GroupSelection::moveWindows * * Move all windows in a group * * This does not move all windows straight away, rather it enqueues a * a w->move () into the window structure itself, to be batch-dequeued * at before the next handleEvent () call. This is because calling * wrapped functions half way through the wrap chain is just going * to be problematic for us. * * Also if a window is maximized and there was a viewport change, * move the window backwards. Otherwise ignore viewport changes. */ void GroupSelection::moveWindows (CompWindow *top, int dx, int dy, bool immediate, bool viewportChange) { foreach (CompWindow *cw, mWindows) { if (!cw) continue; if (cw->id () == top->id ()) continue; GROUP_WINDOW (cw); if (cw->state () & MAXIMIZE_STATE) { if (viewportChange) gw->enqueueMoveNotify (-dx, -dy, immediate, true); } else if (!viewportChange) { gw->mNeedsPosSync = true; gw->enqueueMoveNotify (dx, dy, immediate, true); } } } /* * GroupSelection::prepareResizeWindows * * Description: Sets the resize geometry of this group * and makes windows appear "stretched". * * Use it for animation or something. Currently used to * paint windows as stretched while the primary window * is resizing (eg through rectangle, outline or stretch mode) * */ void GroupSelection::prepareResizeWindows (CompRect &rect) { foreach (CompWindow *cw, mWindows) { GroupWindow *gcw; gcw = GroupWindow::get (cw); if (!gcw->mResizeGeometry.isEmpty ()) { if (gcw->updateResizeRectangle (rect, true)) { gcw->cWindow->addDamage (); } } } } /* * GroupSelection::resizeWindows * * Description: Configures windows according to set resize geometry * in prepareResizeWindows * */ void GroupSelection::resizeWindows (CompWindow *top) { CompRect rect; GROUP_SCREEN (screen); gs->dequeueMoveNotifies (); if (mResizeInfo) { rect = CompRect (WIN_X (top), WIN_Y (top), WIN_WIDTH (top), WIN_HEIGHT (top)); } foreach (CompWindow *cw, mWindows) { if (!cw) continue; if (cw->id () != top->id ()) { GROUP_WINDOW (cw); GroupWindow *gwtt = GroupWindow::get (top); if (!gw->mResizeGeometry.isEmpty ()) { unsigned int mask; gw->mResizeGeometry = CompRect (WIN_X (cw), WIN_Y (cw), WIN_WIDTH (cw), WIN_HEIGHT (cw)); mask = gw->updateResizeRectangle (rect, false); if (mask) { XWindowChanges xwc; xwc.x = gw->mResizeGeometry.x (); xwc.y = gw->mResizeGeometry.y (); xwc.width = gw->mResizeGeometry.width (); xwc.height = gw->mResizeGeometry.height (); if (top->mapNum () && (mask & (CWWidth | CWHeight))) top->sendSyncRequest (); cw->configureXWindow (mask, &xwc); } else { gwtt->mResizeGeometry = CompRect (0, 0, 0, 0); } } if (GroupWindow::get (top)->mNeedsPosSync) { gwtt->mNeedsPosSync = false; } gwtt->enqueueUngrabNotify (); } } if (mResizeInfo) { delete mResizeInfo; mResizeInfo = NULL; } mGrabWindow = None; mGrabMask = 0; } /* * GroupSelection::maximizeWindows * * Maximizes every window in a group, simply changing it's state * */ void GroupSelection::maximizeWindows (CompWindow *top) { foreach (CompWindow *cw, mWindows) { if (!cw) continue; if (cw->id () == top->id ()) continue; cw->maximize (top->state () & MAXIMIZE_STATE); } } /* * GroupWindow::deleteGroupWindow () * * Finitializes any remaining group related bits on a window * structure after we have detached from a group. * */ void GroupWindow::deleteGroupWindow () { GroupSelection *group; GROUP_SCREEN (screen); if (!mGroup) return; group = mGroup; /* If this is the dragged slot in the group, unhook it * from the tab bar. Otherwise get rid of it */ if (group->mTabBar && mSlot) { if (gs->mDraggedSlot && gs->mDragged && gs->mDraggedSlot->mWindow->id () == window->id ()) { group->mTabBar->unhookTabBarSlot (mSlot, false); } else group->mTabBar->deleteTabBarSlot (mSlot); } /* If the group has any windows left ... */ if (group->mWindows.size ()) { /* If the group has more than one window left, and, if * after removing the window, there is only one window left, * then there makes no sense to paint glow on the "group" * with just one window left, (the window *is* grouped, but * for the purposes of what the user can see, the window is just * like any other window, and when we add it to another group, * it will just re-use some of the structures we have already */ if (group->mWindows.size () > 1) { group->mWindows.remove (window); group->mWindowIds.remove (window->id ()); if (group->mWindows.size () == 1) { /* Glow was removed from this window, too. * Since there is only one window left here, * it is safe to use front () */ GROUP_WINDOW (group->mWindows.front ()); gw->cWindow->damageOutputExtents (); gw->window->updateWindowOutputExtents (); if (gs->optionGetAutoUngroup ()) { if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { /* a change animation is pending: this most likely means that a window must be moved back onscreen, so we do that here */ GroupWindow *glw = GroupWindow::get (group->mWindows.front ()); glw->setWindowVisibility (true); } if (!gs->optionGetAutotabCreate ()) group->fini (); } } } else { group->mWindows.clear (); group->mWindowIds.clear (); group->fini (); } mGroup = NULL; screen->matchPropertyChanged (window); cWindow->damageOutputExtents (); window->updateWindowOutputExtents (); gs->writeSerializedData (); } } /* * GroupWindow::removeWindowFromGroup * * Takes a window out of a group, there might be a tab bar, so this * is really just a wrapper function to handle the untabbing of * the single window //first// before going ahead and getting rid * of the window from the group. * */ void GroupWindow::removeWindowFromGroup () { GROUP_SCREEN (screen); if (!mGroup) return; if (mGroup->mTabBar && !(mAnimateState & IS_UNGROUPING) && (mGroup->mWindows.size () > 1)) { GroupSelection *group = mGroup; /* if the group is tabbed, setup untabbing animation. The window will be deleted from the group at the end of the untabbing. */ if (HAS_TOP_WIN (group)) { CompWindow *tw = TOP_TAB (group); int oldX = mOrgPos.x (); int oldY = mOrgPos.y (); /* The "original position" of the window for the purposes * of the untabbing animation is centered to the top tab */ mOrgPos = CompPoint (WIN_CENTER_X (tw) - (WIN_WIDTH (window) / 2), WIN_CENTER_Y (tw) - (WIN_HEIGHT (window) / 2)); /* Destination is here is the "original" position of the window * relative to how far away it was from the main tab */ mDestination = mOrgPos + mMainTabOffset; /* The new "main tab offset" is now the original position */ mMainTabOffset = CompPoint (oldX, oldY); /* Kick off the animation */ if (mTx || mTy) { mTx -= (mOrgPos.x () - oldX); mTy -= (mOrgPos.y () - oldY); } mAnimateState = IS_ANIMATED; mXVelocity = mYVelocity = 0.0f; } /* Although when there is no top-tab, it will never really animate anything, if we don't start the animation, the window will never get removed. */ group->startTabbingAnimation (false); setWindowVisibility (true); group->mUngroupState = GroupSelection::UngroupSingle; mAnimateState |= IS_UNGROUPING; } else { /* no tab bar - delete immediately */ deleteGroupWindow (); if (gs->optionGetAutotabCreate () && isGroupWindow ()) { GroupSelection *g; gs->mTmpSel.clear (); gs->mTmpSel.select (window); g = gs->mTmpSel.toGroup (); if (g) g->tabGroup (window); } } checkFunctions (); } GroupSelection::~GroupSelection () { } /* * GroupSelection::fini * * This is //essentially// like a destructor, although it handles * setting up the untabbing animation before the group is freed. * * We cannot put this code in the destructor, since there is no way * to prevent the object from being freed if we need to do things * like trigger animations */ void GroupSelection::fini () { GROUP_SCREEN (screen); if (mWindows.size ()) { if (mTabBar) { /* set up untabbing animation and delete the group at the end of the animation */ untabGroup (); mUngroupState = UngroupAll; return; } /* For every window in the group, we need to do a few * tear down related things (faster than calling * removeWindowFromGroup on every single one) * which includes damaging the current glow region * (output extents), updating the X11 window property * reflect that this window is now gone from the group * and creating new autotabbed groups from the windows * when they are removed */ foreach (CompWindow *cw, mWindows) { GROUP_WINDOW (cw); CompositeWindow::get (cw)->damageOutputExtents (); gw->mGroup = NULL; screen->matchPropertyChanged (cw); cw->updateWindowOutputExtents (); gs->writeSerializedData (); if (gs->optionGetAutotabCreate () && gw->isGroupWindow ()) { GroupSelection *g; gs->mTmpSel.clear (); gs->mTmpSel.select (cw); g = gs->mTmpSel.toGroup (); if (g) g->tabGroup (cw); } gw->checkFunctions (); } mWindows.clear (); } else if (mTabBar) { delete mTabBar; mTabBar = NULL; mTopId = None; } /* Pop this group from the groups list */ gs->mGroups.remove (this); /* Make sure there are no dangling pointers to this in GroupScreen */ if (this == gs->mLastHoveredGroup) gs->mLastHoveredGroup = NULL; if (this == gs->mLastRestackedGroup) gs->mLastRestackedGroup = NULL; /* This is slightly evil, but necessary, since it is not possible * to make the destructor private (since the object would be * non-instantiatable). Also, we don't use the class at all * after this, so we can let it's memory go, really */ delete this; } void GroupSelection::changeColor () { GROUP_SCREEN (screen); /* Generate new color */ float factor = ((float)RAND_MAX + 1) / 0xffff; mColor[0] = (int)(rand () / factor); mColor[1] = (int)(rand () / factor); mColor[2] = (int)(rand () / factor); mColor[3] = 0xffff; /* Re-render the selection layer, if it is there */ if (mTabBar && mTabBar->mSelectionLayer) { const CompRect &bRect = mTabBar->mTopTab->mRegion.boundingRect (); CompSize size (bRect.width (), bRect.height ()); SelectionLayer *sl = mTabBar->mSelectionLayer; SelectionLayer::rebuild (sl, size); if (mTabBar->mSelectionLayer) mTabBar->mSelectionLayer->render (); gs->cScreen->damageScreen (); } } /* * GroupSelection::GroupSelection * * Constructor for GroupSelection. Creates an empty group, sets up * the color and determines a new ID number. * */ GroupSelection::GroupSelection () : mScreen (screen), mTabBar (NULL), mTabbingState (NoTabbing), mUngroupState (UngroupNone), mGrabWindow (None), mGrabMask (0), mResizeInfo (NULL), mTopId (None) { boost::function cb = boost::bind (&GroupSelection::handleHoverDetection, this, _1); mPoller.setCallback (cb); /* glow color */ changeColor (); } /* * GroupWindow::addWindowToGroup * * Adds a window to a group. * * Note that if NULL is passed, a new group is created. "initialIdent" * is there for restoring from window properties, otherwise you can just * pass 0. * */ void GroupWindow::addWindowToGroup (GroupSelection *group) { GROUP_SCREEN (screen); if (mGroup) return; if (group) { /* If a group was specified, just add this window to it */ CompWindow *topTab = NULL; mGroup = group; group->mWindows.push_back (window); group->mWindowIds.push_back (window->id ()); /* Update glow regions and X11 property */ checkFunctions (); window->updateWindowOutputExtents (); cWindow->damageOutputExtents (); gs->writeSerializedData (); /* If we have more than one window in this group just recently, * then update the first window too, */ if (group->mWindows.size () == 2) { /* first window in the group got its glow, too */ GroupWindow::get (group->mWindows.front ())->checkFunctions (); group->mWindows.front ()->updateWindowOutputExtents (); CompositeWindow::get (group->mWindows.front ())->damageOutputExtents (); } /* If there is a tab bar for this group, then we need to set up * the tabbing animation */ if (group->mTabBar) { /* If a window is being dragged out of a group, then * that group will have no top-tab, so we need to get * the last known top-tab for that group and untab it */ if (HAS_TOP_WIN (group)) topTab = TOP_TAB (group); else if (HAS_PREV_TOP_WIN (group)) { topTab = PREV_TOP_TAB (group); group->mTabBar->mTopTab = group->mTabBar->mPrevTopTab; group->mTopId = group->mTabBar->mTopTab->mWindow->id (); group->mTabBar->mPrevTopTab = NULL; } if (topTab) { if (!mSlot) group->mTabBar->createSlot (window); /* Set up the tabbing animation */ mDestination = CompPoint (WIN_CENTER_X (topTab) - (WIN_WIDTH (window) / 2), WIN_CENTER_Y (topTab) - (WIN_HEIGHT (window) / 2)); mMainTabOffset = CompPoint (WIN_X (window), WIN_Y (window)) - mDestination; mOrgPos = CompPoint (WIN_X (window), WIN_Y (window)); mXVelocity = mYVelocity = 0.0f; mAnimateState = IS_ANIMATED; group->startTabbingAnimation (true); cWindow->addDamage (); } } screen->matchPropertyChanged (window); } gs->writeSerializedData (); checkFunctions (); } /* * GroupScreen::groupWindows * * Triggerable action to group windows, just adds all the * windows in the current selection to a group, or creates a new * one and adds them to that. * */ bool GroupScreen::groupWindows (CompAction *action, CompAction::State state, CompOption::Vector options) { mTmpSel.toGroup (); return false; } /* * GroupScreen::ungroupWindows * * Actions to ungroup the windows * */ bool GroupScreen::ungroupWindows (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); /* Find the group of the selected window, kill it */ if (gw->mGroup) gw->mGroup->fini (); } return false; } /* * GroupScreen::removeWindow * * Triggerable action to remove a single window from a group * */ bool GroupScreen::removeWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); if (gw->mGroup) gw->removeWindowFromGroup (); } return false; } /* * GroupScreen::closeWindows * * Action to close all windows in a group * */ bool GroupScreen::closeWindows (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); if (gw->mGroup) { foreach (CompWindow *cw, gw->mGroup->mWindows) cw->close (screen->getCurrentTime ()); } } return false; } /* * GroupScreen::changeColor * * Action to change the color of a group * */ bool GroupScreen::changeColor (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) { GROUP_WINDOW (w); if (gw->mGroup) gw->mGroup->changeColor (); } return false; } /* * GroupScreen::setIgnore * * Triggerable action to make this group not behave like a group * for a short amount of time * */ bool GroupScreen::setIgnore (CompAction *action, CompAction::State state, CompOption::Vector options) { mIgnoreMode = true; if (state & CompAction::StateInitKey) action->setState (state | CompAction::StateTermKey); return false; } /* * GroupScreen::unsetIgnore * * Triggerable action to make this group behave like a group * */ bool GroupScreen::unsetIgnore (CompAction *action, CompAction::State state, CompOption::Vector options) { mIgnoreMode = false; action->setState (state & ~CompAction::StateTermKey); return false; } /* * GroupScreen::handleButtonPressEvent * * Generally delegated from GroupScreen::handleEvent, * do things like handling clicks on tab thumbnails, * scrolling on the tab bar etc * */ void GroupScreen::handleButtonPressEvent (XEvent *event) { GroupSelection *group; int xRoot, yRoot, button; xRoot = event->xbutton.x_root; yRoot = event->xbutton.y_root; button = event->xbutton.button; foreach (group, mGroups) { if (!group->mTabBar) continue; /* if we didn't click on a tab bar, we don't care*/ if (group->mTabBar->mInputPrevention != event->xbutton.window) continue; switch (button) { /* Left mouse button on the tab bar, did we click on a slot? */ case Button1: { GroupTabBarSlot *slot; foreach (slot, group->mTabBar->mSlots) { if (slot->mRegion.contains (CompPoint (xRoot, yRoot))) { /* Set the draggedSlot to this one, * don't select the tab yet, we are supposed to * do that in ::handleButtonReleaseEvent */ mDraggedSlot = slot; /* The slot isn't dragged yet */ mDragged = false; mPrevX = xRoot; mPrevY = yRoot; if (!screen->otherGrabExist ("group", "group-drag", NULL)) grabScreen (ScreenGrabTabDrag); } } } break; /* Scroll up or down on the bar */ case Button4: case Button5: { CompWindow *topTab = NULL; GroupWindow *gw; /* If a tab animation is already in progress, * mTopTab will not be set to the top tab we have * already switched to, instead it will be the new * mTopTab when the animation finishes. Obviously, we * don't want to just trigger the same animation again * for another scroll, so set the "topTab" in this case * to the next one after the animation finishes (so we * change to the one before or after that one) */ if (group->mTabBar->mNextTopTab) topTab = NEXT_TOP_TAB (group); else if (group->mTabBar->mTopTab) { /* If there are no tabbing animations, topTab is never NULL. */ topTab = TOP_TAB (group); } if (!topTab) return; gw = GroupWindow::get (topTab); /* Change tab left */ if (button == Button4) { GroupTabBarSlot *prev = gw->mSlot->mPrev; if (prev) changeTab (prev, GroupTabBar::RotateLeft); else changeTab (gw->mGroup->mTabBar->mSlots.back (), GroupTabBar::RotateLeft); } /* Change tab right */ else { GroupTabBarSlot *next = gw->mSlot->mNext; if (next) changeTab (next, GroupTabBar::RotateRight); else changeTab (gw->mGroup->mTabBar->mSlots.front (), GroupTabBar::RotateRight); } break; } } break; } } /* * GroupScreen::handleButtonReleaseEvent * * Delegated from ::handleEvent, this handles any button release * event on the tab bar, so we need to "deposit" dragged slots * as well as changing tabs * */ void GroupScreen::handleButtonReleaseEvent (XEvent *event) { GroupSelection *group; int vx, vy; CompRegion newRegion; bool inserted = false; bool wasInTabBar = false; if (event->xbutton.button != 1) return; /* If there is no dragged slot, return * Note that this doesn't necessarily mean that * we are not //dragging// a slot (since a slot gets picked * as mDraggedSlot as soon as it is clicked, not dragged */ if (!mDraggedSlot) return; /* If we were not dragged, then we were simply just selecting * this tab! Just change to this tab */ if (!mDragged) { changeTab (mDraggedSlot, GroupTabBar::RotateUncertain); mDraggedSlot = NULL; if (mGrabState == ScreenGrabTabDrag) grabScreen (ScreenGrabNone); return; } GROUP_WINDOW (mDraggedSlot->mWindow); newRegion = mDraggedSlot->mRegion; /* newRegion is the region which we are dragging the tab into, * which has draw offset corrections applied */ mDraggedSlot->getDrawOffset (vx, vy); newRegion.translate (vx, vy); foreach (group, mGroups) { bool inTabBar; CompRegion clip, buf; GroupTabBarSlot *slot; if (!group->mTabBar || !HAS_TOP_WIN (group)) continue; /* create clipping region */ clip = GroupWindow::get (TOP_TAB (group))->getClippingRegion (); /* if our tab region doesn't intersect the tabbar at all, * then we aren't in the tab bar, so just check the next group */ buf = newRegion.intersected (group->mTabBar->mRegion); buf = buf.subtracted (clip); inTabBar = !buf.isEmpty (); if (!inTabBar) continue; /* wasInTabBar has a higher scope than here - if it is false * then the window is removed from the parent group */ wasInTabBar = true; foreach (slot, group->mTabBar->mSlots) { GroupTabBarSlot *tmpDraggedSlot; GroupSelection *tmpGroup; CompRegion slotRegion; CompRect rect; bool inSlot; if (slot == mDraggedSlot) continue; /* Construct a rectangle of "acceptable drop area" * for the tab, which is usually in the spring-created space * between the two tabs which we want to drop this one * * It should be this one : * * |-------------------------------| * | |-------| | | |-------|| * | | TAB | | REGION | | TAB || * | |-------| | | |-------|| * |-------------------------------| * ^ * |---------| * | DRAGGED | * |---------| * */ /* If there is a slot to the left, then set the leftmost * point of the insertion region at the rightmost point * of the left slot */ if (slot->mPrev && slot->mPrev != mDraggedSlot) { rect.setX (slot->mPrev->mRegion.boundingRect ().x2 ()); } /* Otherwise if the dragged slot is the previous slot to * this one, then set the leftmost insertion point to * the previous slot to the dragged one (this is so that * the leftmost point isn't set to the rightmost point * on the dragged slot, which obviously results in a * zero-width region) */ else if (slot->mPrev && slot->mPrev == mDraggedSlot && mDraggedSlot->mPrev) { rect.setX (mDraggedSlot->mPrev->mRegion.boundingRect ().x2 ()); } /* Otherwise, this is the left edge of the tab bar, so set * the leftmost point to the leftmost point of the tab bar * region */ else rect.setX (group->mTabBar->mRegion.boundingRect ().x1 ()); /* The Y point of the insertion region is obviously the top * of the tab bar */ rect.setY (slot->mRegion.boundingRect ().y1 ()); /* If there is a slot to the right of this one, and it isn't * the dragged slot, set the width of the region to the * leftmost point of the right slot (minus the x point * of the rect to get a relative width) */ if (slot->mNext && slot->mNext != mDraggedSlot) { const CompRect &r = slot->mNext->mRegion.boundingRect (); rect.setWidth (r.x1 () - rect.x ()); } /* Otherwise, if the slot to the right of this one is the * dragged slot, then check the same thing on the slot * to the right of this one */ else if (slot->mNext && slot->mNext == mDraggedSlot && mDraggedSlot->mNext) { const CompRegion &r = mDraggedSlot->mNext->mRegion; rect.setWidth (r.boundingRect ().x1 () - rect.x ()); } /* Otherwise, this is the rightmost edge of the tab bar, so * set the width to the edge of the tab bar minus the * x-point of insertion region */ else { const CompRect &r = group->mTabBar->mRegion.boundingRect (); rect.setWidth (r.x2 ()); // FIXME: wrong ? } rect.setY (slot->mRegion.boundingRect ().y1 ()); // FIXME: redundant? rect.setHeight (slot->mRegion.boundingRect ().height ()); slotRegion = CompRegion (rect); /* We are ok to insert this slot into the tab bar at this * position if the slot region (newRegion) intersects the * calculated insertion region (slotRegion) */ inSlot = slotRegion.intersects (newRegion); /* If we failed that, try the next slot, and so on */ if (!inSlot) continue; tmpDraggedSlot = mDraggedSlot; /* The window is now in a new group */ if (group != gw->mGroup) { CompWindow *w = mDraggedSlot->mWindow; GroupWindow *gdw = GroupWindow::get (w); GroupSelection *tmpGroup = gw->mGroup; int oldPosX = WIN_CENTER_X (w); int oldPosY = WIN_CENTER_Y (w); /* if the dragged window is not the top tab, move it onscreen */ if (tmpGroup->mTabBar->mTopTab && !IS_TOP_TAB (w, tmpGroup)) { CompWindow *tw = TOP_TAB (tmpGroup); oldPosX = WIN_CENTER_X (tw) + gw->mMainTabOffset.x (); oldPosY = WIN_CENTER_Y (tw) + gw->mMainTabOffset.y (); GroupWindow::get (w)->setWindowVisibility (true); } /* Change the group. */ gdw->deleteGroupWindow (); gdw->addWindowToGroup (group); /* we saved the original center position in oldPosX/Y before - now we should apply that to the new main tab offset */ if (HAS_TOP_WIN (group)) { CompWindow *tw = TOP_TAB (group); gw->mMainTabOffset.setX (oldPosX - WIN_CENTER_X (tw)); gw->mMainTabOffset.setY (oldPosY - WIN_CENTER_Y (tw)); } } else group->mTabBar->unhookTabBarSlot (mDraggedSlot, true); /* reset dragged state */ mDraggedSlot = NULL; mDragged = false; inserted = true; /* Insert the slot before or after depending on the position */ if ((tmpDraggedSlot->mRegion.boundingRect ().x1 () + tmpDraggedSlot->mRegion.boundingRect ().x2 () + (2 * vx)) / 2 > (slot->mRegion.boundingRect ().x1 () + slot->mRegion.boundingRect ().x2 ()) / 2) { group->mTabBar->insertTabBarSlotAfter (tmpDraggedSlot, slot); } else group->mTabBar->insertTabBarSlotBefore (tmpDraggedSlot, slot); group->mTabBar->damageRegion (); /* Hide tab-bars. */ foreach (tmpGroup, mGroups) { if (group == tmpGroup) tmpGroup->tabSetVisibility (true, 0); else tmpGroup->tabSetVisibility (false, PERMANENT); } break; } if (inserted) break; } /* If there was no successful inseration, then remove the * dragged slot from it's original group */ if (!inserted) { CompWindow *draggedSlotWindow = mDraggedSlot->mWindow; GroupWindow *gdsw = GroupWindow::get (draggedSlotWindow); GroupSelection *tmpGroup; foreach (tmpGroup, mGroups) tmpGroup->tabSetVisibility (false, PERMANENT); mDraggedSlot = NULL; mDragged = false; if (optionGetDndUngroupWindow () && !wasInTabBar) { gdsw->removeWindowFromGroup (); } else if (gw->mGroup && gw->mGroup->mTabBar->mTopTab) { gw->mGroup->mTabBar->recalcTabBarPos ( (gw->mGroup->mTabBar->mRegion.boundingRect ().x1 () + gw->mGroup->mTabBar->mRegion.boundingRect ().x2 ()) / 2, gw->mGroup->mTabBar->mRegion.boundingRect ().x1 (), gw->mGroup->mTabBar->mRegion.boundingRect ().x2 ()); } /* to remove the painted slot */ cScreen->damageScreen (); } if (mGrabState == ScreenGrabTabDrag) grabScreen (ScreenGrabNone); if (mDragHoverTimeoutHandle.active ()) { mDragHoverTimeoutHandle.stop (); } } /* * GroupScreen::handleMotionEvent * * When dragging tabs, make sure that we are damaging the screen region around the tab. * Also, if we have "dragged" a "non-dragged" tab enough (>5px) then mark it as "dragged" * and make it's parent tab bar always visible * */ /* the radius to determine if it was a click or a drag */ static const unsigned short RADIUS = 5; void GroupScreen::handleMotionEvent (int xRoot, int yRoot) { /* We are dragging a tab here */ if (mGrabState == ScreenGrabTabDrag) { int dx, dy; CompRegion &draggedRegion = mDraggedSlot->mRegion; dx = xRoot - mPrevX; dy = yRoot - mPrevY; /* Don't want to start dragging the slot unless we have moved * the mouse more than 5px. Don't need to do this calculation * either if we have already set mDragged */ if (mDragged || abs (dx) > RADIUS || abs (dy) > RADIUS) { CompRegion cReg; int vx, vy; int x1, x2, y1, y2; mPrevX = xRoot; mPrevY = yRoot; /* mDragged is not marked, start dragging the slot */ if (!mDragged) { GroupSelection *group; GROUP_WINDOW (mDraggedSlot->mWindow); mDragged = true; foreach (group, mGroups) group->tabSetVisibility (true, PERMANENT); const CompRect &box = gw->mGroup->mTabBar->mRegion.boundingRect (); gw->mGroup->mTabBar->recalcTabBarPos ( (box.x1 () + box.x2 ()) / 2, box.x1 (), box.x2 ()); checkFunctions (); } /* Damage slot region */ mDraggedSlot->getDrawOffset (vx, vy); x1 = draggedRegion.boundingRect ().x1 () + vx; y1 = draggedRegion.boundingRect ().y1 () + vy; x2 = draggedRegion.boundingRect ().x2 () + vx; y2 = draggedRegion.boundingRect ().y2 () + vy; cReg = CompRegion (x1, y1, x2 - x1, y2 - y1); cScreen->damageRegion (cReg); /* Move the slot, adjust the spring */ mDraggedSlot->mRegion.translate (dx, dy); mDraggedSlot->mSpringX = (mDraggedSlot->mRegion.boundingRect ().x1 () + mDraggedSlot->mRegion.boundingRect ().x2 ()) / 2; x1 = draggedRegion.boundingRect ().x1 () + vx; y1 = draggedRegion.boundingRect ().y1 () + vy; x2 = draggedRegion.boundingRect ().x2 () + vx; y2 = draggedRegion.boundingRect ().y2 () + vy; cReg = CompRegion (x1, y1, x2 - x1, y2 - y1); cScreen->damageRegion (cReg); } } else if (mGrabState == ScreenGrabSelect) { mTmpSel.damage (xRoot, yRoot); } } /* * GroupWindow::windowNotify * * Function called on window events - on these events do * certain grouped actions, such as Shade/Unshade, * Minimize/Unminimize etc * */ void GroupWindow::windowNotify (CompWindowNotify n) { GROUP_SCREEN (screen); bool visible = false; if (!mGroup) return window->windowNotify (n); switch (n) { /* Minimize or shade all windows if this window has just * been minimized or shaded */ case CompWindowNotifyShade: mWindowState = GroupWindow::WindowShaded; visible = false; if (mGroup && gs->optionGetShadeAll ()) mGroup->shadeWindows (window, true); break; case CompWindowNotifyMinimize: mWindowState = GroupWindow::WindowMinimized; visible = false; if (mGroup && gs->optionGetMinimizeAll ()) mGroup->minimizeWindows (window, true); break; /* Unminimize/Unshade */ case CompWindowNotifyUnminimize: if (gs->optionGetMinimizeAll ()) mGroup->minimizeWindows (window, false); visible = true; break; case CompWindowNotifyUnshade: if (gs->optionGetShadeAll ()) mGroup->shadeWindows (window, false); visible = true; break; case CompWindowNotifyClose: /* The window was closed. In this case delete the, if * the group is not already ungrouping, then delete * this window from the group */ /* close event */ if (!(mAnimateState & IS_UNGROUPING)) { /* mGroup is going to be set to NULL here, so better * just return early */ deleteGroupWindow (); gs->cScreen->damageScreen (); return window->windowNotify (n); } break; case CompWindowNotifyRestack: /* If there are other windows in this group, then raise * all the windows (but ignore if this group was just * restacked then) */ if (mGroup && !mGroup->mTabBar && (mGroup != gs->mLastRestackedGroup)) { if (gs->optionGetRaiseAll ()) mGroup->raiseWindows (window); } if (window->managed () && !window->overrideRedirect ()) gs->mLastRestackedGroup = mGroup; return window->windowNotify (n); break; default: return window->windowNotify (n); break; } if (visible) mWindowState = WindowNormal; else { /* Since the group is not visible, we can do some * tear-down, for now */ if (mGroup->mTabBar && IS_TOP_TAB (window, mGroup)) { /* on unmap of the top tab, hide the tab bar and the input prevention window */ mGroup->tabSetVisibility (false, PERMANENT); } } return window->windowNotify (n); } /* * GroupScreen::handleEvent * * Wrappable function to handle X11 Events. * * Handle group minimize, unmap, close etc. * */ void GroupScreen::handleEvent (XEvent *event) { CompWindow *w; switch (event->type) { case MotionNotify: handleMotionEvent (pointerX, pointerY); break; case ButtonPress: handleButtonPressEvent (event); break; case ButtonRelease: handleButtonReleaseEvent (event); break; case MapNotify: w = screen->findWindow (event->xmap.window); if (w) { foreach (CompWindow *cw, screen->windows ()) { if (w->id () == cw->frame ()) { /* Should not unmap frame window here */ //if (gw->mWindowHideInfo) //XUnmapWindow (screen->dpy (), cw->frame ()); } } } break; case ClientMessage: /* New active window */ if (event->xclient.message_type == Atoms::winActive) { w = screen->findWindow (event->xclient.window); if (w) { GROUP_WINDOW (w); /* If this window is not the top tab, then change * the top tab to this one */ if (gw->mGroup && gw->mGroup->mTabBar && !IS_TOP_TAB (w, gw->mGroup)) { GroupTabBar *bar = gw->mGroup->mTabBar; bar->mCheckFocusAfterTabChange = true; changeTab (gw->mSlot, GroupTabBar::RotateUncertain); } } } /* The window has a new resize geometry. Note that this isn't * a configureNotify as such, since for some resize modes * (stretch, outline, etc) we don't send them until the window * has been ungrabbed. However, we still need to know the * current resize geometry of the window, so the resize plugin * will tell us this */ else if (event->xclient.message_type == mResizeNotifyAtom) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (!w) break; foreach (GroupSelection *group, mGroups) { /* Don't bother handling this window if the group isn't * being resized or if this is the currently primary * window */ if (!(group->mResizeInfo && w == group->mResizeInfo->mResizedWindow)) continue; if (group) { CompRect rect (event->xclient.data.l[0], event->xclient.data.l[1], event->xclient.data.l[2], event->xclient.data.l[3]); group->prepareResizeWindows (rect); } } } break; default: /* Shape Notify events can mess up our cleared input shape, * so just handle them and save/clear the shape again */ if (event->type == screen->shapeEvent () + ShapeNotify) { XShapeEvent *se = (XShapeEvent *) event; if (se->kind == ShapeInput) { CompWindow *w; w = screen->findWindow (se->window); if (w) { GROUP_WINDOW (w); if (gw->mWindowHideInfo) gw->clearWindowInputShape (gw->mWindowHideInfo); } } } break; } screen->handleEvent (event); switch (event->type) { /* Window got a new name, update the tab bar text */ case PropertyNotify: if (event->xproperty.atom == Atoms::wmName) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) { GROUP_WINDOW (w); if (gw->mGroup && gw->mGroup->mTabBar && gw->mGroup->mTabBar->mTextSlot && gw->mGroup->mTabBar->mTextSlot->mWindow == w) { /* make sure we are using the updated name */ TextLayer *l = gw->mGroup->mTabBar->mTextLayer; gw->mGroup->mTabBar->mTextLayer = TextLayer::rebuild (l); if (gw->mGroup->mTabBar->mTextLayer) gw->mGroup->mTabBar->mTextLayer->render (); gw->mGroup->mTabBar->damageRegion (); } } } break; case EnterNotify: { CompWindow *w; w = screen->findWindow (event->xcrossing.window); /* Whenever we enter a new window, we must update the screen * to only show relevant tab bars */ updateTabBars (event->xcrossing.window); if (w) { GROUP_WINDOW (w); if (mShowDelayTimeoutHandle.active ()) mShowDelayTimeoutHandle.stop (); if (gw->mGroup) { /* If we are dragging a slot over this window, then * set a timer to raise the window after a certain * amount of time */ if (mDraggedSlot && mDragged && IS_TOP_TAB (w, gw->mGroup)) { int hoverTime; hoverTime = optionGetDragHoverTime () * 1000; if (mDragHoverTimeoutHandle.active ()) mDragHoverTimeoutHandle.stop (); if (hoverTime > 0) { mDragHoverTimeoutHandle.setCallback ( boost::bind ( &GroupWindow::dragHoverTimeout, gw)); mDragHoverTimeoutHandle.setTimes (hoverTime, hoverTime * 1.2); mDragHoverTimeoutHandle.start (); } } } } } break; case ConfigureNotify: { CompWindow *w; w = screen->findWindow (event->xconfigure.window); if (w) { GROUP_WINDOW (w); /* Window with tab bar restacked, restack the IPW */ if (gw->mGroup && gw->mGroup->mTabBar && IS_TOP_TAB (w, gw->mGroup) && gw->mGroup->mTabBar->mInputPrevention && gw->mGroup->mTabBar->mIpwMapped) { XWindowChanges xwc; xwc.stack_mode = Above; xwc.sibling = w->id (); XConfigureWindow (screen->dpy (), gw->mGroup->mTabBar->mInputPrevention, CWSibling | CWStackMode, &xwc); } } } break; default: break; } } /* * GroupWindow::resizeNotify * * Description: We get resizeNotify once the window is actually * configured (note the difference between the COMPIZ_RESIZE_NOTIFY) * ClientMessage above. * * If this window had a resize geometry, set it to zero-size. If * the window had glow quads, we need to recalculate them. We also * need to recalculate the tab bar position. * * Note that we don't handle grouped resize here, since that would * mean that we have to handle queuing (since the function is wrapped). * Instead we handle that in ConfigureNotify in * GroupScreen::handleEvent above. * */ void GroupWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { GROUP_SCREEN (screen); if (!mResizeGeometry.isEmpty ()) { mResizeGeometry = CompRect (0, 0, 0, 0); } window->resizeNotify (dx, dy, dwidth, dheight); if (mGlowQuads) { /* FIXME: we need to find a more multitexture friendly way * of doing this */ GLTexture::Matrix tMat = gs->mGlowTexture.at (0)->matrix (); computeGlowQuads (&tMat); } /* If this was the top tab, then re-center the tab bar */ if (mGroup && mGroup->mTabBar && IS_TOP_TAB (window, mGroup)) { if (mGroup->mTabBar->mState != PaintOff) { mGroup->mTabBar->recalcTabBarPos (pointerX, WIN_X (window), WIN_X (window) + WIN_WIDTH (window)); } } } /* * GroupWindow::moveNotify * * We need to recalculate the glow quads here (since the position * changed, and they are contained in the quads). We also need to * update the tab bar positon and move windows in the group (queued). * */ void GroupWindow::moveNotify (int dx, int dy, bool immediate) { bool viewportChange; GROUP_SCREEN (screen); window->moveNotify (dx, dy, immediate); /* mGlowQuads contains positional info, so we need to recalc that */ if (mGlowQuads) { /* FIXME: we need to find a more multitexture friendly way * of doing this */ GLTexture::Matrix tMat = gs->mGlowTexture.at (0)->matrix (); computeGlowQuads (&tMat); } /* Don't bother if the window is not grouped */ if (!mGroup || gs->mQueued) return; /* FIXME: we need a reliable, 100% safe way to detect window moves caused by viewport changes here */ viewportChange = ((dx && !(dx % screen->width ())) || (dy && !(dy % screen->height ()))); /* If the viewport changes and the tab bar is tabbing or untabbing * then add the viewport change distance to the animation (since * we are overriding where the window is painted) */ if (viewportChange && (mAnimateState & IS_ANIMATED)) { mDestination += CompPoint (dx, dy); } /* If we are moving a window with a tab bar, then make the tab * bar springy and move it too */ if (mGroup->mTabBar && IS_TOP_TAB (window, mGroup)) { GroupTabBarSlot *slot; GroupTabBar *bar = mGroup->mTabBar; bar->mRightSpringX += dx; bar->mLeftSpringX += dx; bar->moveTabBarRegion (dx, dy, true); foreach (slot, bar->mSlots) { slot->mRegion.translate (dx, dy); slot->mSpringX += dx; } } /* Don't bother moving all group windows if we are not moving all * ignoring group actions, or if we are currently in a tabbing * animation or if the grabbed window isn't this one (can be caused * by moveNotifies when moving other group windows) * or if we aren't grabbed this window for a move */ if (!gs->optionGetMoveAll () || gs->mIgnoreMode || (mGroup->mTabbingState != GroupSelection::NoTabbing) || (mGroup->mGrabWindow != window->id ()) || !(mGroup->mGrabMask & CompWindowGrabMoveMask)) { return; } mGroup->moveWindows (window, dx, dy, immediate, viewportChange); } /* * GroupWindow::grabNotify * * Description: when the window is grabbed, it might be grabbed * for a resize, in which case we need to set up the resize-all bits * (including resize geometry) */ void GroupWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { GROUP_SCREEN (screen); gs->mLastGrabbedWindow = window->id (); if (mGroup && !gs->mIgnoreMode && !gs->mQueued) { bool doResizeAll; doResizeAll = gs->optionGetResizeAll () && (mask & CompWindowGrabResizeMask); /* Make the tab bar invisible for now */ if (mGroup->mTabBar) mGroup->tabSetVisibility (false, 0); foreach (CompWindow *cw, mGroup->mWindows) { if (!cw) continue; if (cw->id () != window->id ()) { GroupWindow *gcw = GroupWindow::get (cw); /* Enqueue a grabNotify (since this function is * wrapped) */ gcw->enqueueGrabNotify (x, y, state, mask); if (doResizeAll && !(cw->state () & MAXIMIZE_STATE)) { if (gcw->mResizeGeometry.isEmpty ()) { gcw->mResizeGeometry = CompRect (WIN_X (cw), WIN_Y (cw), WIN_WIDTH (cw), WIN_HEIGHT (cw)); gcw->checkFunctions (); } } } } /* Set up a new master resize info with this window as the * master window and the current geometry as the master geometry */ if (doResizeAll) { if (!mGroup->mResizeInfo) mGroup->mResizeInfo = new GroupSelection::ResizeInfo; if (mGroup->mResizeInfo) { mGroup->mResizeInfo->mResizedWindow = window; mGroup->mResizeInfo->mOrigGeometry = CompRect (WIN_X (window), WIN_Y (window), WIN_WIDTH (window), WIN_HEIGHT (window)); } } mGroup->mGrabWindow = window->id (); mGroup->mGrabMask = mask; } gs->checkFunctions (); window->grabNotify (x, y, state, mask); } /* * GroupWindow::ungrabNotify * * When the window is ungrabbed, resize them according to our set * resizeGeometry (handled in mGroup->resizeWindows) */ void GroupWindow::ungrabNotify () { GROUP_SCREEN (screen); gs->mLastGrabbedWindow = None; if (mGroup && !gs->mIgnoreMode && !gs->mQueued) { mGroup->resizeWindows (window); // should really include the size info here } gs->checkFunctions (); window->ungrabNotify (); } /* * GroupWindow::damageRect * * A request was made to damage everything in this window. * * If this window just appeared (initial) then add it to an autotabbed * group if we are doing that. Or it might be the case that the window * was just unshaded or unminimzied (initial as well) so apply * those actions to the group too * * Otherwise, damage the stretch rectangle for the window, damage * the slot (since the group was just updated) */ bool GroupWindow::damageRect (bool initial, const CompRect &rect) { bool status; GROUP_SCREEN (screen); status = cWindow->damageRect (initial, rect); /* Window just appeared */ if (initial) { if ((gs->optionGetAutotabWindows ().size () || gs->optionGetAutotabCreate ()) && !mGroup && mWindowState == WindowNormal) { GroupSelection *g = NULL; /* First check if this window should be added to an * existing group */ foreach (CompOption::Value &v, gs->optionGetAutotabWindows ()) { if (v.match ().evaluate (window)) { bool foundGroup = false; foreach (GroupSelection *lg, gs->mGroups) { foreach (CompWindow *w, lg->mWindows) { if (v.match ().evaluate (w)) { foundGroup = true; g = lg; break; } } if (foundGroup) break; } if (foundGroup) break; } } if (!g) { gs->mTmpSel.clear (); gs->mTmpSel.select (window); g = gs->mTmpSel.toGroup (); } else { addWindowToGroup (g); } /* If 'g' is NULL here then a new group will be created * so better use mGroup here instead */ if (g) g->tabGroup (window); } checkFunctions (); // we don't need damageRect after this } /* Damage resize rectangle */ if (!mResizeGeometry.isEmpty ()) { CompRect box; float dummy = 1; getStretchRectangle (box, dummy, dummy); gs->damagePaintRectangle (box); } /* Damage slot */ if (mSlot) { int vx, vy; CompRegion reg; mSlot->getDrawOffset (vx, vy); if (vx || vy) { reg = reg.united (mSlot->mRegion); reg.translate (vx, vy); } else reg = mSlot->mRegion; gs->cScreen->damageRegion (reg); } return status; } /* * GroupWindow::stateChangeNotify * * A change to the window state was detected (could be maximization) * so if it was, then apply that to the group (if applicable) */ void GroupWindow::stateChangeNotify (unsigned int lastState) { GROUP_SCREEN (screen); if (mGroup && !gs->mIgnoreMode) { if (((lastState & MAXIMIZE_STATE) != (window->state () & MAXIMIZE_STATE)) && gs->optionGetMaximizeUnmaximizeAll ()) { mGroup->maximizeWindows (window); } } window->stateChangeNotify (lastState); } /* * GroupWindow::activate * * Window got activated, change the tab to the new active window */ void GroupWindow::activate () { GROUP_SCREEN (screen); if (mGroup && mGroup->mTabBar && !IS_TOP_TAB (window, mGroup)) gs->changeTab (mSlot, GroupTabBar::RotateUncertain); window->activate (); } ./plugins/group/src/selection.cpp0000644000004100000410000002236513246301623017350 0ustar www-datawww-data/** * * Compiz group plugin * * selection.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * GroupWindow::windowInRegion * * Determine if a prescribed region intersects a window and determine * if the region intersects an adequate percentage of that window * (specified by precision) intersects the window * */ bool GroupWindow::windowInRegion (CompRegion src, float precision) { int area = 0; CompRegion buf; /* Intersecting region */ buf = window->region ().intersected (src); /* buf area */ for (int i = 0; i < buf.numRects (); i++) { CompRect box = buf.rects ().at (i); area += (box.width ()) * (box.height ()); /* width * height */ } if (area >= WIN_WIDTH (window) * WIN_HEIGHT (window) * precision) { src = window->region ().subtracted (src); return true; } return false; } /* * groupFindGroupInWindows * * Inline utility function, returns true if a group is in a list * of windows * */ static inline bool groupFindGroupInWindows (GroupSelection *group, CompWindowList &windows) { foreach (CompWindow *cw, windows) { GROUP_WINDOW (cw); if (gw->mGroup == group) return true; } return false; } /* * groupFindWindowsInRegion * * Utility function, finds all the windows in a region and returns * a list of them. * */ static CompWindowList * groupFindWindowsInRegion (CompRegion reg) { GROUP_SCREEN (screen); float precision = gs->optionGetSelectPrecision () / 100.0f; CompWindowList *ret; CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); ret = new CompWindowList (); if (!ret) return NULL; /* Go back-to-front with selection */ while (rit != screen->windows ().rend ()) { CompWindow *w = *rit; GROUP_WINDOW (w); /* If the window is groupable and in our region */ if (gw->isGroupWindow () && gw->windowInRegion (reg, precision)) { /* Don't bother if this window has a group and there are * windows from this group in the selection (all windows * from the group get added to the selection automatically) */ if (gw->mGroup && groupFindGroupInWindows (gw->mGroup, *ret)) { ++rit; continue; } ret->push_back (w); } ++rit; } return ret; } /* * Selection::deselect (CompWindow variant) * * Remove a window from selection * */ void Selection::deselect (CompWindow *w) { if (size ()) { GroupWindow::get (w)->checkFunctions (); CompositeWindow::get (w)->addDamage (); remove (w); } GroupWindow::get (w)->mInSelection = false; } /* * Selection::deselect (GroupSelection variant) * * Deselect all windows in a group, but don't just call * deselect on all windows in the group since that is slow, instead * compare lists and pop matching windows */ void Selection::deselect (GroupSelection *group) { /* unselect group */ CompWindowList copy = (CompWindowList) *this; CompWindowList::iterator it = begin (); int nsize = size () - group->mWindows.size (); unsigned int num = MAX (0, nsize); /* Faster than doing groupDeleteSelectionWindow for each window in this group. */ resize (num); foreach (CompWindow *cw, copy) { GROUP_WINDOW (cw); if (gw->mGroup == group) { gw->mInSelection = false; gw->checkFunctions (); gw->cWindow->addDamage (); continue; } (*it) = cw; ++it; } } /* * Selection::select * * Add a CompWindow to this selection (animate its fade too) * */ void Selection::select (CompWindow *w) { GROUP_WINDOW (w); /* filter out windows we don't want to be groupable */ if (!gw->isGroupWindow ()) return; push_back (w); gw->mInSelection = true; gw->checkFunctions (); gw->cWindow->addDamage (); } /* * Selection::select * * Add a group to this selection (select every window in the group) * */ void Selection::select (GroupSelection *g) { foreach (CompWindow *cw, g->mWindows) select (cw); } /* * Selection::selectRegion * * Selects all windows in the mouse selection region * */ void Selection::selectRegion () { GROUP_SCREEN (screen); CompRegion reg; CompRect rect; CompWindowList *ws; int x = MIN (mX1, mX2) - 2; int y = MIN (mY1, mY2) - 2; int width = MAX (mX1, mX2) - MIN (mX1, mX2) + 4; int height = MAX (mY1, mY2) - MIN (mY1, mY2) + 4; rect = CompRect (x, y, width, height); reg = CompRegion::empty ().united (rect); gs->cScreen->damageRegion (reg); ws = groupFindWindowsInRegion (reg); if (ws->size ()) { /* (un)select windows */ foreach (CompWindow *w, *ws) checkWindow (w); if (gs->optionGetAutoGroup ()) { toGroup (); } } delete ws; } /* * Selection::toGroup * * Create a new group from this selection. Also "unselect" all of these * windows since they are grouped now! * */ GroupSelection * Selection::toGroup () { if (!empty ()) { CompWindowList::iterator it = begin (); CompWindow *cw; GroupSelection *group = NULL; bool tabbed = false; /* Try to find existing groups in this selection and * add windows to that rather than going and creating new * groups */ foreach (cw, *this) { GROUP_WINDOW (cw); if (gw->mGroup) { if (!tabbed || group->mTabBar) group = gw->mGroup; if (group->mTabBar) tabbed = true; } } if (!group) { /* create new group */ group = new GroupSelection (); if (!group) return NULL; GroupScreen::get (screen)->mGroups.push_front (group); } for (; it != end (); ++it) { cw = *it; GROUP_WINDOW (cw); if (gw->mGroup && (group != gw->mGroup)) gw->deleteGroupWindow (); gw->addWindowToGroup (group); gw->cWindow->addDamage (); gw->mInSelection = false; } /* exit selection */ clear (); return group; } return NULL; } /* * Selection::checkWindow * * Select or deselect a window or group if this window has one. * */ void Selection::checkWindow (CompWindow *w) { GROUP_WINDOW (w); if (gw->mInSelection) { if (gw->mGroup) { deselect (gw->mGroup); } else { /* unselect single window */ deselect (w); } } else { if (gw->mGroup) { /* select group */ select (gw->mGroup); } else { /* select single window */ select (w); } } } /* * GroupScreen::selectSingle * * Action to select a single window * */ bool GroupScreen::selectSingle (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (w) mTmpSel.checkWindow (w); return true; } /* * GroupScreen::select * * Action to initiate the dragging of the selection rect * */ bool GroupScreen::select (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabState == ScreenGrabNone) { grabScreen (ScreenGrabSelect); if (state & CompAction::StateInitButton) { action->setState (state | CompAction::StateTermButton); } mTmpSel.mX1 = mTmpSel.mX2 = pointerX; mTmpSel.mY1 = mTmpSel.mY2 = pointerY; } return true; } /* * GroupSelection::selectTerminate * * Action to terminate selection rect and select all windows in that * rect. * */ bool GroupScreen::selectTerminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabState == ScreenGrabSelect) { grabScreen (ScreenGrabNone); if (mTmpSel.mX1 != mTmpSel.mX2 && mTmpSel.mY1 != mTmpSel.mY2) { mTmpSel.selectRegion (); } } action->setState (action->state () & ~(CompAction::StateTermButton | CompAction::StateTermKey)); return false; } /* * Selection::damage * * Damage the selection rect * */ void Selection::damage (int xRoot, int yRoot) { GROUP_SCREEN (screen); CompRegion reg = CompRegion (MIN (mX1, mX2) - 5, MIN (mY1, mY2) - 5, MAX (mX1, mX2) - MIN (mX1, mX2) + 10, MAX (mY1, mY2) - MIN (mY1, mY2) + 10); gs->cScreen->damageRegion (reg); mX2 = xRoot; mY2 = yRoot; reg = CompRegion (MIN (mX1, mX2) - 5, MIN (mY1, mY2) - 5, MAX (mX1, mX2) - MIN (mX1, mX2) + 10, MAX (mY1, mY2) - MIN (mY1, mY2) + 10); gs->cScreen->damageRegion (reg); } ./plugins/group/src/tab.cpp0000644000004100000410000024702013246301623016126 0ustar www-datawww-data/** * * Compiz group plugin * * tab.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "group.h" /* * getCurrentMousePosition * * Description: * Return the current function of the pointer at the given screen. * The position is queried trough XQueryPointer directly from the xserver. * * TODO: Depricate this function and use mousepoll directly * */ bool GroupScreen::getCurrentMousePosition (int &x, int &y) { MousePoller poller; CompPoint pos = poller.getCurrentPosition (); x = pos.x (); y = pos.y (); return (x != 0 && y != 0); } /* * GroupWindow::getClippingRegion * * Description: * This function returns a clipping region which is used to clip * several events involving window stack such as hover detection * in the tab bar or Drag'n'Drop. It creates the clipping region * with getting the region of every window above the given window * and then adds this region to the clipping region using * CompRegion::united (). w->region won't work since it doesn't include * the window decoration. * */ CompRegion GroupWindow::getClippingRegion () { CompWindow *cw; CompRegion clip; for (cw = window->next; cw; cw = cw->next) { /* Ignore small invidible windows or hidden ones in our clipping * region */ if (!cw->invisible () && !(cw->state () & CompWindowStateHiddenMask)) { CompRect rect; CompRegion buf; rect = CompRect (WIN_REAL_X (cw), WIN_REAL_Y (cw), WIN_REAL_WIDTH (cw), WIN_REAL_HEIGHT (cw)); buf = buf.united (rect); clip = buf.united (clip); } } return clip; } /* * GroupWindow::clearWindowInputShape * * We are not painting this window, so we don't want to interact with * it using X11. We can use XShape to read the input shape rects and * save the. We then combine the shape rects with NULL, so that the * window has no input shape (so it cannot recieve input, all clicks * fall through). * */ void GroupWindow::clearWindowInputShape (GroupWindow::HideInfo *hideInfo) { XRectangle *rects; int count = 0, ordering; /* Get the shape rects */ rects = XShapeGetRectangles (screen->dpy (), window->id (), ShapeInput, &count, &ordering); if (count == 0) return; /* check if the returned shape exactly matches the window shape - * if that is true, the window currently has no set input shape * (so the shape will be the default rectangular shape) */ if ((count == 1) && (rects[0].x == -window->serverGeometry ().border ()) && (rects[0].y == -window->serverGeometry ().border ()) && (rects[0].width == (window->serverWidth () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverHeight () + window->serverGeometry ().border ()))) { count = 0; } /* if this window already has saved input rects in the plugin, get * rid of them. now */ if (hideInfo->mInputRects) XFree (hideInfo->mInputRects); /* Save input shape */ hideInfo->mInputRects = rects; hideInfo->mNInputRects = count; hideInfo->mInputRectOrdering = ordering; /* Don't get XShape events (we are currently registered for them, * if we get them then we will recursively clear the input shape */ XShapeSelectInput (screen->dpy (), hideInfo->mShapeWindow, NoEventMask); /* In ShapeInput, combine NULL with the input shape */ XShapeCombineRectangles (screen->dpy (), hideInfo->mShapeWindow, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); /* Get XShape events again */ XShapeSelectInput (screen->dpy (), hideInfo->mShapeWindow, ShapeNotify); } /* * GroupWindow::setWindowVisibility * * Set the window to be painted or not (visible) and clear and restore * the input shape as necessary. Set the window to skip the taskbar * and pager as necessary. * */ void GroupWindow::setWindowVisibility (bool visible) { if (!visible && !mWindowHideInfo) { GroupWindow::HideInfo *info; /* Allocate a hide info structure */ mWindowHideInfo = info = new GroupWindow::HideInfo; if (!mWindowHideInfo) return; /* ensure the input rects are NULL and get the shape mask */ info->mInputRects = NULL; info->mNInputRects = 0; info->mShapeMask = XShapeInputSelected (screen->dpy (), window->id ()); /* We are a reparenting window manager now, * which means that we either shape the frame window, * or if it does not exist, shape the window */ if (window->frame ()) { info->mShapeWindow = window->frame (); } else info->mShapeWindow = window->id (); clearWindowInputShape (info); /* Do not allow the window to be displated on the taskbar or * pager */ info->mSkipState = window->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask); window->changeState (window->state () | CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask); } else if (visible && mWindowHideInfo) { GroupWindow::HideInfo *info = mWindowHideInfo; /* If there are saved input rects, restore them */ if (info->mNInputRects) { XShapeCombineRectangles (screen->dpy (), info->mShapeWindow, ShapeInput, 0, 0, info->mInputRects, info->mNInputRects, ShapeSet, info->mInputRectOrdering); } /* Otherwise combine with a null mask (automatically restores * single rect input shape) */ else { XShapeCombineMask (screen->dpy (), info->mShapeWindow, ShapeInput, 0, 0, None, ShapeSet); } if (info->mInputRects) XFree (info->mInputRects); /* Recieve shape events again */ XShapeSelectInput (screen->dpy (), info->mShapeWindow, info->mShapeMask); /* Put the window back on the taskbar and pager */ window->changeState ((window->state () & ~(CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask)) | info->mSkipState); delete info; mWindowHideInfo = NULL; } } /* * GroupSelection::tabBarTimeout * * Description: * This function is called when the time expired (== timeout). * We use this to realize a delay with the bar hiding after tab change. * handleAnimation sets up a timer after the animation has finished. * This function itself basically just sets the tab bar to a PaintOff status * through calling groupSetTabBarVisibility. * The PERMANENT mask allows you to force hiding even of * PaintPermanentOn tab bars. * */ bool GroupSelection::tabBarTimeout () { tabSetVisibility (false, PERMANENT); return false; /* This will free the timer. */ } /* * GroupSelection::showDelayTimeout * * Show the tab bar at the mouse position after a timeout * */ bool GroupSelection::showDelayTimeout () { int mouseX, mouseY; CompWindow *topTab; GROUP_SCREEN (screen); /* If this isn't the top window of the group, then don't bother * to show the tab bar (it really shouldn't be shown in this case * but it could be a corner case where the window shape is restored * and we hover over it */ if (!HAS_TOP_WIN (this)) { gs->mShowDelayTimeoutHandle.stop (); return false; /* This will free the timer. */ } topTab = TOP_TAB (this); GROUP_WINDOW (topTab); gs->getCurrentMousePosition (mouseX, mouseY); /* Recalc tab bar pos based on mouse pos */ mTabBar->recalcTabBarPos (mouseX, WIN_REAL_X (topTab), WIN_REAL_X (topTab) + WIN_REAL_WIDTH (topTab)); tabSetVisibility (true, 0); gw->checkFunctions (); gs->checkFunctions (); gs->mShowDelayTimeoutHandle.stop (); return false; /* This will free the timer. */ } /* * GroupSelection::tabSetVisibility * * Description: * This function is used to set the visibility of the tab bar. * The "visibility" is indicated through the PaintState, which * can be PaintOn, PaintOff, PaintFadeIn, PaintFadeOut * and PaintPermantOn. * Currently the mask paramater is mostely used for the PERMANENT mask. * This mask affects how the visible parameter is handled, for example if * visibule is set to true and the mask to PERMANENT state it will set * PaintPermanentOn state for the tab bar. When visibile is false, mask 0 * and the current state of the tab bar is PaintPermanentOn it won't do * anything because its not strong enough to disable a * Permanent-State, for those you need the mask. * * Determine the cases where we want to show the tab bar. Set up the * render and the animation. * */ void GroupSelection::tabSetVisibility (bool visible, unsigned int mask) { GroupTabBar *bar; CompWindow *topTab; PaintState oldState; GROUP_SCREEN (screen); /* Don't bother if this isn't the top window or there is no tab bar */ if (!mWindows.size () || !mTabBar || !HAS_TOP_WIN (this)) return; bar = mTabBar; topTab = TOP_TAB (this); oldState = bar->mState; /* Start polling the mouse inside the tab bar */ if (visible) mPoller.start (); else mPoller.stop (); /* hide tab bars for invisible top windows */ if ((topTab->state () & CompWindowStateHiddenMask) || topTab->invisible ()) { bar->mState = PaintOff; gs->switchTopTabInput (this, true); } /* Make the tab bar painted permanently in the case that we specify * a permanent mask */ else if (visible && bar->mState != PaintPermanentOn && (mask & PERMANENT)) { bar->mState = PaintPermanentOn; gs->switchTopTabInput (this, false); } /* If there is no longer an need to paint permanently, then just * paint this normally */ else if (visible && bar->mState == PaintPermanentOn && !(mask & PERMANENT)) { bar->mState = PaintOn; } /* If we're visible and need to fade in or out, re-render the tab * bar animations */ else if (visible && (bar->mState == PaintOff || bar->mState == PaintFadeOut)) { /* Set up the tab bar animations */ if (gs->optionGetBarAnimations () && bar->mBgLayer) { bar->mBgLayer->mBgAnimation = BackgroundLayer::AnimationReflex; bar->mBgLayer->mBgAnimationTime = gs->optionGetReflexTime () * 1000.0; } bar->mState = PaintFadeIn; gs->switchTopTabInput (this, false); } /* Otherwise if we're not visible, and haven't used the PERMANENT * strength mask for permenancy, then fade out */ else if (!visible && (bar->mState != PaintPermanentOn || (mask & PERMANENT)) && (bar->mState == PaintOn || bar->mState == PaintPermanentOn || bar->mState == PaintFadeIn)) { bar->mState = PaintFadeOut; gs->switchTopTabInput (this, true); } /* If we're fading in or out set up the animation and damage */ if (bar->mState == PaintFadeIn || bar->mState == PaintFadeOut) bar->mAnimationTime = (gs->optionGetFadeTime () * 1000) - bar->mAnimationTime; if (bar->mState != oldState) bar->damageRegion (); } /* * GroupTabBarSlot::getDrawOffset () * * Description: * Its used when the draggedSlot is dragged to another viewport. * It calculates a correct offset to the real slot position. * */ void GroupTabBarSlot::getDrawOffset (int &hoffset, int &voffset) { CompWindow *w, *topTab; int x, y, vx, vy; CompPoint vp; CompWindow::Geometry winGeometry; if (!mWindow) return; w = mWindow; GROUP_WINDOW (w); GROUP_SCREEN (screen); /* If this isn't the dragged slot, don't bother */ if (this != gs->mDraggedSlot || !gw->mGroup) { hoffset = 0; voffset = 0; return; } /* Figure out the top tab */ if (HAS_TOP_WIN (gw->mGroup)) topTab = TOP_TAB (gw->mGroup); else if (HAS_PREV_TOP_WIN (gw->mGroup)) topTab = PREV_TOP_TAB (gw->mGroup); else { hoffset = 0; voffset = 0; return; } x = WIN_CENTER_X (topTab) - WIN_WIDTH (w) / 2; y = WIN_CENTER_Y (topTab) - WIN_HEIGHT (w) / 2; /* Determine the viewport offset */ winGeometry = CompWindow::Geometry (x, y, w->serverWidth (), w->serverHeight (), w->serverGeometry ().border ()); screen->viewportForGeometry (winGeometry, vp); vx = vp.x (); vy = vp.y (); /* the offset is the distance from the left edge of the initial viewport */ hoffset = ((screen->vp ().x () - vx) % screen->vpSize ().width ()) * screen->width (); voffset = ((screen->vp ().y () - vy) % screen->vpSize ().height ()) * screen->height (); } /* * GroupSelection::handleHoverDetection * * Description: * This function is called on the mousepoll update to handle whether a * new tab has been hovered on the bar (and then it updates the text * accordingly) */ void GroupSelection::handleHoverDetection (const CompPoint &p) { GroupTabBar *bar = mTabBar; CompWindow *topTab = TOP_TAB (this); bool inLastSlot; GROUP_SCREEN (screen); if ((bar->mState != PaintOff) && !HAS_TOP_WIN (this)) return; /* then check if the mouse is in the last hovered slot -- this saves a lot of CPU usage */ inLastSlot = bar->mHoveredSlot && bar->mHoveredSlot->mRegion.contains (p); if (!inLastSlot) { CompRegion clip; GroupTabBarSlot *slot; bar->mHoveredSlot = NULL; clip = GroupWindow::get (topTab)->getClippingRegion (); foreach (slot, bar->mSlots) { /* We need to clip the slot region with the clip region first. This is needed to respect the window stack, so if a window covers a port of that slot, this part won't be used for in-slot-detection. */ CompRegion reg = slot->mRegion.subtracted (clip); if (reg.contains (p)) { bar->mHoveredSlot = slot; break; } } if (bar->mTextLayer) { /* trigger a FadeOut of the text */ if ((bar->mHoveredSlot != bar->mTextSlot) && (bar->mTextLayer->mState == PaintFadeIn || bar->mTextLayer->mState == PaintOn)) { bar->mTextLayer->mAnimationTime = (gs->optionGetFadeTextTime () * 1000) - bar->mTextLayer->mAnimationTime; bar->mTextLayer->mState = PaintFadeOut; } /* or trigger a FadeIn of the text */ else if ((bar->mTextLayer->mState == PaintFadeOut || bar->mTextLayer->mState == PaintOff) && bar->mHoveredSlot == bar->mTextSlot && bar->mHoveredSlot) { bar->mTextLayer->mAnimationTime = (gs->optionGetFadeTextTime () * 1000) - bar->mTextLayer->mAnimationTime; bar->mTextLayer->mState = PaintFadeIn; } bar->damageRegion (); GroupWindow::get (topTab)->checkFunctions (); } gs->checkFunctions (); } return; } /* * GroupTabBar::handleTabBarFade * * Description: * This function is called from preparePaint * to handle the tab bar fade. It checks the animationTime and updates it, * so we can calculate the alpha of the tab bar in the painting code with it. * * Returns true if there is animation still remaining * */ bool GroupTabBar::handleTabBarFade (int msSinceLastPaint) { mAnimationTime -= msSinceLastPaint; if (mAnimationTime > 0) return true; else mAnimationTime = 0; /* Fade finished */ if (mAnimationTime == 0) { if (mState == PaintFadeIn) { mState = PaintOn; } else if (mState == PaintFadeOut) { mState = PaintOff; if (mTextLayer) { /* Tab-bar is no longer painted, clean up text animation variables. */ mTextLayer->mAnimationTime = 0; mTextLayer->mState = PaintOff; mTextSlot = mHoveredSlot = NULL; mTextLayer = TextLayer::rebuild (mTextLayer); if (mTextLayer) mTextLayer->render (); } } } return false; } /* * GroupTabBar::handleTextFade * * Description: * This function is called from groupPreparePaintScreen * to handle the text fade. It checks the animationTime and updates it, * so we can calculate the alpha of the text in the painting code with it. * * Returns true if there is still animation remaining * */ bool GroupTabBar::handleTextFade (int msSinceLastPaint) { TextLayer *textLayer = mTextLayer; bool continuePainting = false; /* Fade in progress... */ if ((textLayer->mState == PaintFadeIn || textLayer->mState == PaintFadeOut) && textLayer->mAnimationTime > 0) { textLayer->mAnimationTime -= msSinceLastPaint; if (textLayer->mAnimationTime < 0) textLayer->mAnimationTime = 0; /* Fade has finished. */ if (textLayer->mAnimationTime == 0) { if (textLayer->mState == PaintFadeIn) textLayer->mState = PaintOn; else if (textLayer->mState == PaintFadeOut) textLayer->mState = PaintOff; } else continuePainting = true; } if (textLayer->mState == PaintOff && mHoveredSlot && mHoveredSlot != mTextSlot) { /* Start text animation for the new hovered slot. */ mTextSlot = mHoveredSlot; textLayer->mState = PaintFadeIn; textLayer->mAnimationTime = (GroupScreen::get (screen)->optionGetFadeTextTime () * 1000); mTextLayer = textLayer = TextLayer::rebuild (textLayer); if (textLayer) mTextLayer->render (); continuePainting = true; } else if (textLayer->mState == PaintOff && mTextSlot) { /* Clean Up. */ mTextSlot = NULL; mTextLayer = textLayer = TextLayer::rebuild (textLayer); if (textLayer) mTextLayer->render (); } return continuePainting; } /* * BackgroundLayer::handleAnimation * * Description: Handles the different animations for the tab bar defined in * BackgroundLayer::AnimationType. Basically that means this function updates * tabBar->animation->time as well as checking if the animation is already * finished. * * Returns true if more animation needed * */ bool BackgroundLayer::handleAnimation (int msSinceLastPaint) { mBgAnimationTime -= msSinceLastPaint; if (mBgAnimationTime <= 0) { mBgAnimationTime = 0; mBgAnimation = AnimationNone; render (); return false; } return true; } /* * tabChangeActivateEvent * * Description: Creates a compiz event to let other plugins know about * the starting and ending point of the tab changing animation */ void GroupScreen::tabChangeActivateEvent (bool activating) { CompOption::Vector o; CompOption opt ("root", CompOption::TypeInt); opt.value ().set ((int) screen->root ()); o.push_back (opt); CompOption opt2 ("active", CompOption::TypeBool); opt2.value ().set (activating); o.push_back (opt2); screen->handleCompizEvent ("group", "tabChangeActivate", o); } /* * GroupSelection::handleAnimation * * Description: * This function handles the change animation. It's called * from handleChanges. Don't let the changeState * confuse you, PaintFadeIn equals with the start of the * rotate animation and PaintFadeOut is the end of these * animation. * * This gets called when a window has finished rotating to 90 degrees to * the viewer (so it is just invisible). Handle setting up the tab * state and focussing the new windows and such. * */ bool GroupSelection::handleAnimation () { bool newAnim = false; GROUP_SCREEN (screen); /* This was an outgoing tab */ if (mTabBar->mChangeState == GroupTabBar::TabChangeOldOut) { CompWindow *top = TOP_TAB (this); bool activate; /* recalc here is needed (for y value)! */ mTabBar->recalcTabBarPos ( mTabBar->mRegion.boundingRect ().centerX (), WIN_REAL_X (top), WIN_REAL_X (top) + WIN_REAL_WIDTH (top)); /* Add time progress to the animation again. Don't * have a negative value */ mTabBar->mChangeAnimationTime += gs->optionGetChangeAnimationTime () * 500; if (mTabBar->mChangeAnimationTime <= 0) mTabBar->mChangeAnimationTime = 0; /* We need to put the new tab in */ mTabBar->mChangeState = GroupTabBar::TabChangeNewIn; /* Activate the new tab which just rotated in */ activate = !mTabBar->mCheckFocusAfterTabChange; if (!activate) { /* CompFocusResult focus; focus = allowWindowFocus (top, NO_FOCUS_MASK, s->x, s->y, 0); activate = focus == CompFocusAllowed; */ } /* Activate the top tab */ if (activate) top->activate (); mTabBar->mCheckFocusAfterTabChange = false; newAnim = true; } /* This was an incoming tab (animation reversed) */ if (mTabBar->mChangeState == GroupTabBar::TabChangeNewIn && mTabBar->mChangeAnimationTime <= 0) { int oldChangeAnimationTime = mTabBar->mChangeAnimationTime; gs->tabChangeActivateEvent (false); /* Set the previous top tab visibility to false since we can't * see it yet! */ if (mTabBar->mPrevTopTab) GroupWindow::get (PREV_TOP_TAB (this))->setWindowVisibility (false); /* Now the new previous top tab is the current one */ GroupWindow::get (PREV_TOP_TAB (this))->checkFunctions (); GroupWindow::get (TOP_TAB (this))->checkFunctions (); mTabBar->mPrevTopTab = mTabBar->mTopTab; mTabBar->mChangeState = GroupTabBar::NoTabChange; /* If we were heading towards a new top tab, then change * this next one to the new one we want to change to */ if (mTabBar->mNextTopTab) { GroupTabBarSlot *next = mTabBar->mNextTopTab; mTabBar->mNextTopTab = NULL; gs->changeTab (next, mTabBar->mNextDirection); if (mTabBar->mChangeState == GroupTabBar::TabChangeOldOut) { /* If a new animation was started. */ mTabBar->mChangeAnimationTime += oldChangeAnimationTime; } } /* Don't use a negative value */ if (mTabBar->mChangeAnimationTime <= 0) { mTabBar->mChangeAnimationTime = 0; } /* If we can't show the tab bar immediately, then show it now * and set the fade out timeout */ else if (gs->optionGetVisibilityTime () != 0.0f && mTabBar->mChangeState == GroupTabBar::NoTabChange) { tabSetVisibility (true, PERMANENT | SHOW_BAR_INSTANTLY_MASK); if (mTabBar->mTimeoutHandle.active ()) mTabBar->mTimeoutHandle.stop (); mTabBar->mTimeoutHandle.setTimes (gs->optionGetVisibilityTime () * 1000, gs->optionGetVisibilityTime () * 1200); mTabBar->mTimeoutHandle.setCallback ( boost::bind (&GroupSelection::tabBarTimeout, this)); mTabBar->mTimeoutHandle.start (); } newAnim = true; } gs->checkFunctions (); return newAnim; } /* * GroupWindow::adjustTabVelocity * * adjust velocity for each animation step (adapted from the scale plugin) */ int GroupWindow::adjustTabVelocity () { float dx, dy, adjust, amount; float x1, y1; x1 = mDestination.x (); y1 = mDestination.y (); /* dx is how much movement we currently have remaining * in this case finalPos - (orgPos + mTx) */ dx = x1 - (mOrgPos.x () + mTx); /* multiply this distance (gets smaller every time) * by 0.15 to get our adjust amount */ adjust = dx * 0.15f; /* get the absolute value of the distance * and multiply by 1.5 to get our velcoty adjust amount */ amount = fabs (dx) * 1.5f; /* Ensure that we are not too fast or slow */ if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; /* velocity is scaled down slightly and adjusted by 1/10th of the * distance remaining */ mXVelocity = (amount * mXVelocity + adjust) / (amount + 1.0f); /* dy is how much movement we currently have remaining * in this case finalPos - (orgPos + mTx) */ dy = y1 - (mOrgPos.y () + mTy); /* multiply this distance (gets smaller every time) * by 0.15 to get our adjust amount */ adjust = dy * 0.15f; /* get the absolute value of the distance * and multiply by 1.5 to get our velcoty adjust amount */ amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; /* Ensure that we are not too fast or slow */ mYVelocity = (amount * mYVelocity + adjust) / (amount + 1.0f); /* If the distance is particularly short and we are travelling slowly, * then just round-down to zero and lock window in place */ if (fabs (dx) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (mYVelocity) < 0.2f) { mXVelocity = mYVelocity = 0.0f; mTx = x1 - window->serverX (); mTy = y1 - window->serverY (); return 0; } return 1; } /* * GroupSelection::finishTabbing * * Cleans up the tab bar related things - called from * donePaint after the tabbing animation. In the case of * tabbing, then set appropriate window visibilities * and move windows to just behind the tab bar. Otherwise * if we are untabbing then we can get rid of the tab bar, and * if ungrouping, get rid of the whole group * */ void GroupSelection::finishTabbing () { GROUP_SCREEN (screen); /* Complete untabbing (but not ungrouping) * case, delete the tab bar */ if (mTabbingState == Untabbing && mUngroupState != UngroupSingle) { delete mTabBar; mTabBar = NULL; mTopId = None; } /* We are finished tabbing now */ mTabbingState = NoTabbing; gs->tabChangeActivateEvent (false); if (mTabBar) { /* tabbing case - hide all non-toptab windows */ GroupTabBarSlot *slot; foreach (slot, mTabBar->mSlots) { CompWindow *w = slot->mWindow; if (!w) continue; GROUP_WINDOW (w); /* Don't hide this window if we are ungrouping or if * this is the top tab */ if (slot == mTabBar->mTopTab || (gw->mAnimateState & IS_UNGROUPING)) continue; gw->setWindowVisibility (false); } /* The last top tab (for change animation purposes) is now * this current top tab */ mTabBar->mPrevTopTab = mTabBar->mTopTab; } /* Move all windows to their animation target position */ for (CompWindowList::iterator it = mWindows.begin (); it != mWindows.end (); ++it) { CompWindow *w = *it; GROUP_WINDOW (w); /* move window to target position */ gs->mQueued = true; w->move (gw->mDestination.x () - WIN_X (w), gw->mDestination.y () - WIN_Y (w), true); gs->mQueued = false; if (mUngroupState == UngroupSingle && (gw->mAnimateState & IS_UNGROUPING)) { /* Possibility of stack breakage here, stop here */ gw->removeWindowFromGroup (); it = mWindows.end (); } gw->mAnimateState = 0; gw->mTx = gw->mTy = gw->mXVelocity = gw->mYVelocity = 0.0f; gw->checkFunctions (); } gs->checkFunctions (); /* Kill the group if we just ungrouped the whole thing */ if (mUngroupState == UngroupAll) fini (); else mUngroupState = UngroupNone; } /* * GroupSelection::drawTabAnimation * * Description: * This function is called from GroupScreen::preparePaint, to move * all the animated windows, with the required animation step. * The function goes through all grouped animated windows, calculates * the required step using adjustTabVelocity, moves the window, * and then checks if the animation is finished for that window. * */ bool GroupSelection::drawTabAnimation (int msSinceLastPaint) { int steps; float amount, chunk; bool doTabbing; GROUP_SCREEN (screen); /* a higher amount here means that more steps are calculated in the velocity, * but also that the velocity is a higher scale up factor, so the animation * happens quicker */ amount = msSinceLastPaint * 0.05f * gs->optionGetTabbingSpeed (); /* more steps means that the velocity is recalculated more times, which increases the chance * for "overshoot" */ steps = amount / (0.5f * gs->optionGetTabbingTimestep ()); if (!steps) steps = 1; chunk = amount / (float)steps; /* Do this for each calculated animation step */ while (steps--) { doTabbing = false; foreach (CompWindow *cw, mWindows) { if (!cw) continue; GROUP_WINDOW (cw); if (!(gw->mAnimateState & IS_ANIMATED)) continue; /* adjustTabVelocity will adjust the speed of the window * movement. At the end of the animation it will return 0, * so that means that this window has finished animating */ if (!gw->adjustTabVelocity ()) { gw->mAnimateState |= FINISHED_ANIMATION; gw->mAnimateState &= ~IS_ANIMATED; } /* Move translation amount to the window */ gw->mTx += gw->mXVelocity * chunk; gw->mTy += gw->mYVelocity * chunk; /* Keep doing the tabbing animation if this window is * still animated */ doTabbing |= (gw->mAnimateState & IS_ANIMATED); } if (!doTabbing) { /* tabbing animation finished */ finishTabbing (); break; } } return doTabbing; } /* * GroupScreen::updateTabBars * * Description: * This function is responsible for showing / unshowing the tab-bars, * when the title-bars / tab-bars are hovered. * The function is called whenever a new window is entered, * checks if the entered window is a window frame (and if the title * bar part of that frame was hovered) or if it was the input * prevention window of a tab bar, and sets tab-bar visibility * according to that. * */ void GroupScreen::updateTabBars (Window enteredWin) { CompWindow *w = NULL; GroupSelection *hoveredGroup = NULL; /* do nothing if the screen is grabbed, as the frame might be drawn transformed */ if (!screen->otherGrabExist ("group", "group-drag", NULL)) { /* first check if the entered window is a frame */ foreach (w, screen->windows ()) { if (w->frame () == enteredWin) break; } } if (w) { /* is the window the entered frame belongs to inside a tabbed group? if no, it's not interesting for us */ GROUP_WINDOW (w); if (gw->mGroup && gw->mGroup->mTabBar) { int mouseX, mouseY; /* it is grouped and tabbed, so now we have to check if we hovered the title bar or the frame */ if (getCurrentMousePosition (mouseX, mouseY)) { CompRect rect; CompRegion reg; /* titlebar of the window */ rect = CompRect (WIN_X (w) - w->border ().left, WIN_Y (w) - w->border ().top, WIN_WIDTH (w) + w->border ().right, WIN_Y (w) - (WIN_Y (w) - w->border ().top)); reg = reg.united (rect); /* this is a hovered group if the mouse is inside the * titlebar region */ if (reg.contains (CompPoint (mouseX, mouseY))) { hoveredGroup = gw->mGroup; } } } } /* if we didn't hover a title bar, check if we hovered a tab bar (means: input prevention window) */ if (!hoveredGroup) { GroupSelection *group; foreach (group, mGroups) { if (group->mTabBar && group->mTabBar->mInputPrevention == enteredWin) { /* only accept it if the IPW is mapped */ if (group->mTabBar->mIpwMapped) { hoveredGroup = group; break; } } } } /* if we found a hovered tab bar different than the last one (or left a tab bar), hide the old one */ if (mLastHoveredGroup && (hoveredGroup != mLastHoveredGroup)) mLastHoveredGroup->tabSetVisibility (false, 0); /* if we entered a tab bar (or title bar), show the tab bar */ if (hoveredGroup && HAS_TOP_WIN (hoveredGroup) && !TOP_TAB (hoveredGroup)->grabbed ()) { GroupTabBar *bar = hoveredGroup->mTabBar; /* If the tab bar isn't painting or is fading out, set up * the show delay time and make the tab bar appear (don't * delay on fade out though) */ if (bar && ((bar->mState == PaintOff) || (bar->mState == PaintFadeOut))) { int showDelayTime = optionGetTabbarShowDelay () * 1000; /* Show the tab-bar after a delay, only if the tab-bar wasn't fading out. */ if (showDelayTime > 0 && (bar->mState == PaintOff)) { if (mShowDelayTimeoutHandle.active ()) mShowDelayTimeoutHandle.stop (); mShowDelayTimeoutHandle.setTimes (showDelayTime, showDelayTime * 1.2); mShowDelayTimeoutHandle.setCallback ( boost::bind (&GroupSelection::showDelayTimeout, hoveredGroup)); mShowDelayTimeoutHandle.start (); } else hoveredGroup->showDelayTimeout (); } } else checkFunctions (); mLastHoveredGroup = hoveredGroup; } /* * GroupScreen::getConstrainRegion * * Description: Get the region on screen where windows are allowed to * move to during the untabbing animation * */ CompRegion GroupScreen::getConstrainRegion () { CompRegion region; CompRect r; /* Get the region for each united output device. We cannot just * use screen->width () * screen->height () since that doesn't * account for weird multihead configs, where there are gaps * or different screen sizes and the like. */ for (unsigned int i = 0;i < screen->outputDevs ().size (); i++) region = CompRegion (screen->outputDevs ()[i]).united (region); foreach (CompWindow *w, screen->windows ()) { if (!w->mapNum ()) continue; /* Don't place windows underneath any panels */ if (w->struts ()) { r = CompRect (w->struts ()->top.x, w->struts ()->top.y, w->struts ()->top.width, w->struts ()->top.height); region = region.subtracted (r); r = CompRect (w->struts ()->bottom.x, w->struts ()->bottom.y, w->struts ()->bottom.width, w->struts ()->bottom.height); region = region.subtracted (r); r = CompRect (w->struts ()->left.x, w->struts ()->left.y, w->struts ()->left.width, w->struts ()->left.height); region = region.subtracted (r); r = CompRect (w->struts ()->right.x, w->struts ()->right.y, w->struts ()->right.width, w->struts ()->right.height); region = region.subtracted (r); } } return region; } /* * GroupWindow::constrainMovement * */ bool GroupWindow::constrainMovement (CompRegion constrainRegion, int dx, int dy, int &new_dx, int &new_dy) { int status, xStatus; int origDx = dx, origDy = dy; int x, y, width, height; CompWindow *w = window; if (!mGroup) return false; if (!dx && !dy) return false; x = mOrgPos.x () - w->border ().left + dx; y = mOrgPos.y ()- w->border ().top + dy; width = WIN_REAL_WIDTH (w); height = WIN_REAL_HEIGHT (w); /* Check if, with the movement, the constrainRegion does not * contain the window rect */ status = constrainRegion.contains (CompRect (x, y, width, height)); /* Adjust dx */ xStatus = status; while (dx && (xStatus != RectangleIn)) { /* check if, with dy taken out (so the rect will only be * outside the region by some x amount) if the rect is still * outside the reigon */ xStatus = constrainRegion.contains (CompRect (x, y - dy, width, height)); /* If it is, then move it slightly left or right based * on which direction it was moving on */ if (xStatus != RectangleIn) dx += (dx < 0) ? 1 : -1; /* new x value is based on our new dx value */ x = mOrgPos.x () - w->border ().left + dx; } /* Adjust dx */ while (dy && (status != RectangleIn)) { /* check if, with dy taken out (so the rect will only be * outside the region by some x amount) if the rect is still * outside the reigon */ status = constrainRegion.contains (CompRect (x, y, width, height)); /* If it is, then move it slightly left or right based * on which direction it was moving on */ if (status != RectangleIn) dy += (dy < 0) ? 1 : -1; /* new x value is based on our new dx value */ y = mOrgPos.y () - w->border ().top + dy; } new_dx = dx; new_dy = dy; /* return changed */ return ((dx != origDx) || (dy != origDy)); } /* * GroupSelection::groupApplyConstraining * */ void GroupSelection::applyConstraining (CompRegion constrainRegion, Window constrainedWindow, int dx, int dy) { if (!dx && !dy) return; foreach (CompWindow *w, mWindows) { GROUP_WINDOW (w); /* ignore certain windows: we don't want to apply the constraining results on the constrained window itself, nor do we want to change the target position of unamimated windows and of windows which already are constrained */ if (w->id () == constrainedWindow) continue; /* Do not bother if we are not animated or not constraining */ if (!(gw->mAnimateState & IS_ANIMATED)) continue; if (gw->mAnimateState & DONT_CONSTRAIN) continue; if (!(gw->mAnimateState & CONSTRAINED_X)) { int dummy; gw->mAnimateState |= IS_ANIMATED; /* applying the constraining result of another window might move the window offscreen, too, so check if this is not the case */ if (gw->constrainMovement (constrainRegion, dx, 0, dx, dummy)) gw->mAnimateState |= CONSTRAINED_X; gw->mDestination.setX (gw->mDestination.x () + dx); } if (!(gw->mAnimateState & CONSTRAINED_Y)) { int dummy; gw->mAnimateState |= IS_ANIMATED; /* analog to X case */ if (gw->constrainMovement (constrainRegion, 0, dy, dummy, dy)) gw->mAnimateState |= CONSTRAINED_Y; gw->mDestination.setY (gw->mDestination.y () + dy); } } } /* * GroupSelection::startTabbingAnimation * * Set up the tabbing animation, which will eventually set up * the tab structures too. "tab" here indicates whether we are * tabbing or untabbing (and takes appropriate action) * */ void GroupSelection::startTabbingAnimation (bool tab) { GROUP_SCREEN (screen); if ((mTabbingState != NoTabbing)) return; mTabbingState = (tab) ? Tabbing : Untabbing; gs->tabChangeActivateEvent (true); if (!tab) { /* we need to set up the X/Y constraining on untabbing */ CompRegion constrainRegion = gs->getConstrainRegion (); bool constrainedWindows = true; /* reset all flags */ foreach (CompWindow *cw, mWindows) { GROUP_WINDOW (cw); gw->mAnimateState &= ~(CONSTRAINED_X | CONSTRAINED_Y | DONT_CONSTRAIN); } /* as we apply the constraining in a flat loop, we may need to run multiple times through this loop until all constraining dependencies are met */ while (constrainedWindows) { constrainedWindows = false; /* loop through all windows and try to constrain their animation path (going from gw->mOrgPos to gw->mDestination) to the active screen area */ foreach (CompWindow *w, mWindows) { int dx, dy;\ int constrainStatus; GroupWindow *gw = GroupWindow::get (w); CompRect statusRect (gw->mOrgPos.x () - w->border ().left, gw->mOrgPos.y () - w->border ().top, WIN_REAL_WIDTH (w), WIN_REAL_HEIGHT (w)); /* ignore windows which aren't animated and/or already are at the edge of the screen area */ if (!(gw->mAnimateState & IS_ANIMATED)) continue; if (gw->mAnimateState & DONT_CONSTRAIN) continue; /* is the original position inside the screen area? */ constrainStatus = constrainRegion.contains (statusRect); /* constrain the movement */ if (gw->constrainMovement (constrainRegion, gw->mDestination.x () - gw->mOrgPos.x (), gw->mDestination.y () - gw->mOrgPos.y (), dx, dy)) { /* handle the case where the window is outside the screen area on its whole animation path */ if (constrainStatus != RectangleIn && !dx && !dy) { gw->mAnimateState |= DONT_CONSTRAIN; gw->mAnimateState |= CONSTRAINED_X | CONSTRAINED_Y; /* use the original position as last resort */ gw->mDestination = gw->mMainTabOffset; } else { /* if we found a valid target position, apply the change also to other windows to retain the distance between the windows */ gw->mGroup->applyConstraining (constrainRegion, w->id (), dx - gw->mDestination.x () + gw->mOrgPos.x (), dy - gw->mDestination.y () + gw->mOrgPos.y ()); /* if we hit constraints, adjust the mask and the target position accordingly */ if (dx != (gw->mDestination.x () - gw->mOrgPos.x ())) { gw->mAnimateState |= CONSTRAINED_X; gw->mDestination.setX (gw->mOrgPos.x () + dx); } if (dy != (gw->mDestination.y () - gw->mOrgPos.y ())) { gw->mAnimateState |= CONSTRAINED_Y; gw->mDestination.setY (gw->mOrgPos.y () + dy); } constrainedWindows = true; } } gw->checkFunctions (); } } } else { foreach (CompWindow *w, mWindows) { GROUP_WINDOW (w); gw->checkFunctions (); } } gs->checkFunctions (); } /* * GroupSelection::tabGroup * * Set up the tab bar structures in this group, render layers * and set up the original positions and destinations in the tabbing * animation * */ void GroupSelection::tabGroup (CompWindow *main) { GroupTabBarSlot *slot; CompSize layerSize; int space, thumbSize; GROUP_WINDOW (main); GROUP_SCREEN (screen); if (mTabBar) return; /* Since we are clearing the input shape of the window, we need * access to the XShape extension. If we don't have it, it is * not safe to continue doing so, so just abort here */ if (!screen->XShape ()) { compLogMessage ("group", CompLogLevelError, "No X shape extension! Tabbing disabled."); return; } mTabBar = new GroupTabBar (this, main); if (!mTabBar) return; /* We are not tabbing in yet (this is necessary so we can * "change" to our top tab) */ mTabbingState = NoTabbing; /* Slot is initialized after GroupTabBar is created */ gs->changeTab (gw->mSlot, GroupTabBar::RotateUncertain); /* Set up tab bar dimensions */ mTabBar->recalcTabBarPos (WIN_CENTER_X (main), WIN_X (main), WIN_X (main) + WIN_WIDTH (main)); layerSize = CompSize (mTabBar->mRegion.boundingRect ().width (), mTabBar->mRegion.boundingRect ().height ()); /* set up the text layer */ mTabBar->mTextLayer = TextLayer::create (layerSize, this); if (mTabBar->mTextLayer) { TextLayer *layer; layer = mTabBar->mTextLayer; layer->mState = PaintFadeIn; layer->mAnimationTime = gs->optionGetFadeTextTime () * 1000; layer->render (); } /* we need a buffer for DnD here */ space = gs->optionGetThumbSpace (); thumbSize = gs->optionGetThumbSize (); layerSize = CompSize (layerSize.width () + space + thumbSize, layerSize.height ()); /* create background layer */ mTabBar->mBgLayer = BackgroundLayer::create (layerSize, this); if (mTabBar->mBgLayer) { mTabBar->mBgLayer->mState = PaintOn; mTabBar->mBgLayer->mAnimationTime = 0; mTabBar->mBgLayer->render (); } layerSize = CompSize (mTabBar->mTopTab->mRegion.boundingRect ().width (), mTabBar->mTopTab->mRegion.boundingRect ().height ()); /* create selection layer */ mTabBar->mSelectionLayer = SelectionLayer::create (layerSize, this); if (mTabBar->mSelectionLayer) { CompSize size = CompSize (mTabBar->mTopTab->mRegion.boundingRect ().width (), mTabBar->mTopTab->mRegion.boundingRect ().height ()); mTabBar->mSelectionLayer->mState = PaintOn; mTabBar->mSelectionLayer->mAnimationTime = 0; mTabBar->mSelectionLayer = SelectionLayer::rebuild (mTabBar->mSelectionLayer, size); if (mTabBar->mSelectionLayer) mTabBar->mSelectionLayer->render (); } if (!HAS_TOP_WIN (this)) return; /* for each of the windows in the tabbed group, we need to set up * the tabbing animation original positions, tab offsets and * destinations (as well as initial translation) for each of * the windows */ foreach (slot, mTabBar->mSlots) { CompWindow *cw = slot->mWindow; GROUP_WINDOW (cw); /* In the case where we are still animating out or have finished * the animation but not yet moved the windows, move the windows * to their old target position */ if (gw->mAnimateState & (IS_ANIMATED | FINISHED_ANIMATION)) cw->move (gw->mDestination.x () - WIN_X (cw), gw->mDestination.y () - WIN_Y (cw), true); /* new target position is centered to the main window */ gw->mDestination = CompPoint (WIN_CENTER_X (main) - (WIN_WIDTH (cw) / 2), WIN_CENTER_Y (main) - (WIN_HEIGHT (cw) / 2)); /* This is required for determining how much we want to animate * back out again once we are untabbing */ gw->mMainTabOffset = CompPoint (WIN_X (cw), WIN_Y (cw)) - gw->mDestination; /* Initial translation is negative the window position minus * the last original position */ if (gw->mTx || gw->mTy) { gw->mTx -= (WIN_X (cw) - gw->mOrgPos.x ()); gw->mTy -= (WIN_Y (cw) - gw->mOrgPos.y ()); } /* Now the original position is the current position */ gw->mOrgPos = CompPoint (WIN_X (cw), WIN_Y (cw)); gw->mAnimateState = IS_ANIMATED; gw->mXVelocity = gw->mYVelocity = 0.0f; } /* Start the animation */ startTabbingAnimation (true); } /* * GroupSelection::untabGroup * * Set up the group untabbing. If we are in the middle of a change * animation, then use the last top tab for this group as the window * where other windows will base the animation. (If the animation is * complete, then mPrevTopTab is going to be the same as mTopTab * anyways, so using it is always safe). */ void GroupSelection::untabGroup () { int oldX, oldY; CompWindow *prevTopTab; GroupTabBarSlot *slot; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (this)) return; /* Sometimes mPrevTopTab might not be set, so use mTopTab instead */ if (mTabBar->mPrevTopTab) prevTopTab = PREV_TOP_TAB (this); else { /* If prevTopTab isn't set, we have no choice but using topTab. It happens when there is still animation, which means the tab wasn't changed anyway. */ prevTopTab = TOP_TAB (this); } /* Save the top tab into mLastTopTab - we will be using this one * to base our animation off of (since we are now setting mTopTab * to NULL). */ mTabBar->mLastTopTab = TOP_TAB (this); mTabBar->mTopTab = NULL; mTabBar->mChangeState = GroupTabBar::NoTabChange; foreach (slot, mTabBar->mSlots) { CompWindow *cw = slot->mWindow; GROUP_WINDOW (cw); /* If there is currently an animation happening and windows * haven't been moved yet, move them into their destination * positions */ if (gw->mAnimateState & (IS_ANIMATED | FINISHED_ANIMATION)) { gs->mQueued = true; cw->move(gw->mDestination.x () - WIN_X (cw), gw->mDestination.y () - WIN_Y (cw), true); gs->mQueued = false; } /* All windows are now visible */ gw->setWindowVisibility (true); /* save the old original position - we might need it if constraining fails */ oldX = gw->mOrgPos.x (); oldY = gw->mOrgPos.y (); /* The original position or animation starting point here is * centered to the top tab which we are animating *out* of */ gw->mOrgPos = CompPoint (WIN_CENTER_X (prevTopTab) - WIN_WIDTH (cw) / 2, WIN_CENTER_Y (prevTopTab) - WIN_HEIGHT (cw) / 2); /* Destination is whatever the original position is plus the * offsets we saved when tabbing */ gw->mDestination = gw->mOrgPos + gw->mMainTabOffset; /* Set initial translation to the old new centered position * minus the old "original position" */ if (gw->mTx || gw->mTy) { gw->mTx -= (gw->mOrgPos.x () - oldX); gw->mTy -= (gw->mOrgPos.y () - oldY); } /* now the offset is just our old orig pos */ gw->mMainTabOffset = CompPoint (oldX, oldY); gw->mAnimateState = IS_ANIMATED; gw->mXVelocity = gw->mYVelocity = 0.0f; } /* set up the animation */ mTabbingState = NoTabbing; startTabbingAnimation (false); gs->cScreen->damageScreen (); } /* * GroupScreen::changeTab * * Change the tab to a new topTab by some direction. Passing * DirectionUncertain will cause this function to calculate the most * appropriate direction for this tab * */ bool GroupScreen::changeTab (GroupTabBarSlot *topTab, GroupTabBar::ChangeAnimationDirection direction) { CompWindow *w, *oldTopTab; GroupSelection *group; if (!topTab) return true; w = topTab->mWindow; GROUP_WINDOW (w); group = gw->mGroup; /* Don't change if we are still constructing the tab bar */ if (!group || !group->mTabBar || group->mTabbingState != GroupSelection::NoTabbing) return true; /* Don't change if we are not currently changing and the requested * top tab is the requested top tab. We will still change back * in the case we are in the middle of a change animation and we * want to change back */ if (group->mTabBar->mChangeState == GroupTabBar::NoTabChange && group->mTabBar->mTopTab == topTab) return true; /* If the tab we are currently changing to is the requested top * tab, then don't bother starting the animation again */ if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange && group->mTabBar->mNextTopTab == topTab) return true; /* We need this for movement and damage purposes */ oldTopTab = group->mTabBar->mTopTab ? group->mTabBar->mTopTab->mWindow : NULL; /* If we are currently changing, set the next direction so that * the animation will start again there */ if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange) group->mTabBar->mNextDirection = direction; /* Set left or right respectively */ else if (direction == GroupTabBar::RotateLeft) group->mTabBar->mChangeAnimationDirection = 1; else if (direction == GroupTabBar::RotateRight) group->mTabBar->mChangeAnimationDirection = -1; /* The requested change direction is RotateUncertain, so work * out the best way to rotate */ else { int distanceOld = 0, distanceNew = 0; GroupTabBarSlot::List::iterator it = group->mTabBar->mSlots.begin (); /* Count from left to the current top tab */ if (group->mTabBar->mTopTab) for (; (*it) && ((*it) != group->mTabBar->mTopTab); ++it, distanceOld++); /* Count from left to the requested top tab */ for (it = group->mTabBar->mSlots.begin (); (*it) && ((*it) != topTab); ++it, distanceNew++); if (distanceNew < distanceOld) group->mTabBar->mChangeAnimationDirection = 1; /*left */ else group->mTabBar->mChangeAnimationDirection = -1; /* right */ /* check if the opposite direction is shorter */ if (abs (distanceNew - distanceOld) > ((int) group->mTabBar->mSlots.size () / 2)) group->mTabBar->mChangeAnimationDirection *= -1; } /* If we are currently in the middle of an animation, we need to * handle this case */ if (group->mTabBar->mChangeState != GroupTabBar::NoTabChange) { /* If we need to go back to the last top tab, then rotate * backwards */ if (group->mTabBar->mPrevTopTab == topTab) { /* Reverse animation. */ GroupTabBarSlot *tmp = group->mTabBar->mTopTab; bool changeOldOut = (group->mTabBar->mChangeState == GroupTabBar::TabChangeOldOut); group->mTabBar->mTopTab = group->mTabBar->mPrevTopTab; group->mTopId = group->mTabBar->mTopTab->mWindow->id (); group->mTabBar->mPrevTopTab = tmp; group->mTabBar->mChangeAnimationDirection *= -1; group->mTabBar->mChangeAnimationTime = optionGetChangeAnimationTime () * 500 - group->mTabBar->mChangeAnimationTime; group->mTabBar->mChangeState = changeOldOut ? GroupTabBar::TabChangeNewIn : GroupTabBar::TabChangeOldOut; group->mTabBar->mNextTopTab = NULL; } /* Otherwise the next one we want to go to is this one * (rotate past a few tabs first) */ else group->mTabBar->mNextTopTab = topTab; } /* Otherwise we need to set up the change animation and the tab bar */ else { group->mTabBar->mTopTab = topTab; group->mTopId = topTab->mWindow->id (); CompSize size (group->mTabBar->mTopTab->mRegion.boundingRect ().width (), group->mTabBar->mTopTab->mRegion.boundingRect ().height ()); /* Rebuild layers and render */ group->mTabBar->mTextLayer = TextLayer::rebuild (group->mTabBar->mTextLayer); if (group->mTabBar->mTextLayer) group->mTabBar->mTextLayer->render (); group->mTabBar->mSelectionLayer = SelectionLayer::rebuild (group->mTabBar->mSelectionLayer, size); if (group->mTabBar->mSelectionLayer) group->mTabBar->mSelectionLayer->render (); if (oldTopTab) CompositeWindow::get (oldTopTab)->addDamage (); CompositeWindow::get (w)->addDamage (); } /* If we are not changing to another top tab */ if (topTab != group->mTabBar->mNextTopTab) { /* Make this window visible */ gw->setWindowVisibility (true); /* Center windows around the old top tab */ if (oldTopTab) { int dx, dy; dx = WIN_CENTER_X (oldTopTab) - WIN_CENTER_X (w); dy = WIN_CENTER_Y (oldTopTab) - WIN_CENTER_Y (w); mQueued = true; w->move (dx, dy, false); mQueued = false; } /* If there is a previous window, change in the new tab */ if (HAS_PREV_TOP_WIN (group)) { /* we use only the half time here - the second half will be PaintFadeOut */ group->mTabBar->mChangeAnimationTime = optionGetChangeAnimationTime () * 500; tabChangeActivateEvent (true); group->mTabBar->mChangeState = GroupTabBar::TabChangeOldOut; } /* Otherwise activate the window */ else { bool activate; /* No window to do animation with. */ if (HAS_TOP_WIN (group)) group->mTabBar->mPrevTopTab = group->mTabBar->mTopTab; else group->mTabBar->mPrevTopTab = NULL; activate = !group->mTabBar->mCheckFocusAfterTabChange; if (!activate) { /* CompFocusResult focus; focus = allowWindowFocus (w, NO_FOCUS_MASK, s->x, s->y, 0); activate = focus == CompFocusAllowed; */ } if (activate) w->activate (); group->mTabBar->mCheckFocusAfterTabChange = false; } } if (group->mTabBar->mPrevTopTab) { CompWindow *pw = group->mTabBar->mPrevTopTab->mWindow; GroupWindow::get (pw)->checkFunctions (); } if (group->mTabBar->mTopTab) { CompWindow *tw = group->mTabBar->mTopTab->mWindow; GroupWindow::get (tw)->checkFunctions (); } GroupScreen::get (screen)->checkFunctions (); return true; } /* * GroupScreen::recalcSlotPos * * Recalculate the slot region. */ void GroupScreen::recalcSlotPos (GroupTabBarSlot *slot, int slotPos) { GroupSelection *group; CompRect box; int space, thumbSize; GROUP_WINDOW (slot->mWindow); group = gw->mGroup; if (!HAS_TOP_WIN (group) || !group->mTabBar) return; space = optionGetThumbSpace (); thumbSize = optionGetThumbSize (); slot->mRegion = CompRegion::empty (); /* Padding between slots, account for this */ box.setX (space + ((thumbSize + space) * slotPos)); box.setY (space); box.setWidth (thumbSize); box.setHeight (thumbSize); slot->mRegion = CompRegion (box); } /* * GroupSelection::recalcTabBarPos * * Recalculate the tab bar region (size and position) given a maximum * size and a central position * */ void GroupTabBar::recalcTabBarPos (int middleX, int minX1, int maxX2) { GroupTabBarSlot *slot; CompWindow *topTab; bool isDraggedSlotGroup = false; int space, barWidth; int thumbSize; int tabsWidth = 0, tabsHeight = 0; int currentSlot; CompRect box; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup)) return; topTab = TOP_TAB (mGroup); space = gs->optionGetThumbSpace (); /* calculate the space which the tabs need * Note that we aren't going to get any size * if we haven't calculated slot regions yet */ foreach (slot, mSlots) { if (slot == gs->mDraggedSlot && gs->mDragged) { /* if this is a dragged slot group, then we will be * calculating the space this slot would have taken * through the spring values */ isDraggedSlotGroup = true; continue; } /* Add the slot region to our current tabs width */ tabsWidth += (slot->mRegion.boundingRect ().width ()); if ((slot->mRegion.boundingRect ().height ()) > tabsHeight) tabsHeight = slot->mRegion.boundingRect ().height (); } /* just a little work-a-round for first call FIXME: remove this! */ thumbSize = gs->optionGetThumbSize (); if (mSlots.size () && tabsWidth <= 0) { /* first call */ tabsWidth = thumbSize * mSlots.size (); if (mSlots.size () && tabsHeight < thumbSize) { /* we need to do the standard height too */ tabsHeight = thumbSize; } /* Get rid of an extra space on this group */ if (isDraggedSlotGroup) tabsWidth -= thumbSize; } barWidth = space * (mSlots.size () + 1) + tabsWidth; if (isDraggedSlotGroup) { /* 1 tab is missing, so we have 1 less border */ barWidth -= space; } /* If the maximum width is less than the bar width, set the x * position of the bar to the centered average of the maximum width * and the bar width */ if (maxX2 - minX1 < barWidth) box.setX ((maxX2 + minX1) / 2 - barWidth / 2); /* If the middle point minus half the calculated bar width is less * than the minimum x1 point, constrain to the x1 point */ else if (middleX - barWidth / 2 < minX1) box.setX (minX1); /* if the middle point plus half the bar width is more than the * maximum x point, then adjust the x point accordingly */ else if (middleX + barWidth / 2 > maxX2) box.setX (maxX2 - barWidth); /* Otherwise the x point should be set to the middle point minus * the bar width (no constraining) */ else box.setX (middleX - barWidth / 2); /* Y position is always the y position of the top tab */ box.setY (WIN_Y (topTab)); /* Width is the calculated bar width */ box.setWidth (barWidth); /* Height is twice the padding plus the tabs height */ box.setHeight (space * 2 + tabsHeight); /* Resize the reigon of the tab bar based on the calcuated box */ resizeTabBarRegion (box, true); /* recalc every slot region */ currentSlot = 0; foreach (slot, mSlots) { /* We calculate the dragged slot region later so don't * recalculate it now */ if (slot == gs->mDraggedSlot && gs->mDragged) continue; /* Recalculate individual slot position */ gs->recalcSlotPos (slot, currentSlot); /* Reposition slot */ slot->mRegion.translate (mRegion.boundingRect ().x1 (), mRegion.boundingRect ().y1 ()); /* Set spring area to the center of the slot */ slot->mSpringX = (slot->mRegion.boundingRect ().centerX ()); slot->mSpeed = 0; slot->mMsSinceLastMove = 0; currentSlot++; } /* Left and right spring points are the left and right parts * of the bar */ mLeftSpringX = box.x (); mRightSpringX = box.x () + box.width (); mRightSpeed = 0; mLeftSpeed = 0; mRightMsSinceLastMove = 0; mLeftMsSinceLastMove = 0; } /* * GroupTabBar::damageRegion * * Damage the tab bar region */ void GroupTabBar::damageRegion () { CompRegion reg (mRegion); int x1 = reg.boundingRect ().x1 (); int x2 = reg.boundingRect ().x2 (); int y1 = reg.boundingRect ().y1 (); int y2 = reg.boundingRect ().y2 (); /* we use 15 pixels as damage buffer here, as there is a 10 pixel wide border around the selected slot which also needs to be damaged properly - however the best way would be if slot->mRegion was sized including the border */ static const unsigned short DAMAGE_BUFFER = 20; /* If there is a front slot in this bar, then we need to damage * areas just outside where the slot might be sitting */ if (mSlots.size ()) { const CompRect &bnd = mSlots.front ()->mRegion.boundingRect (); x1 = MIN (x1, bnd.x1 ()); y1 = MIN (y1, bnd.y1 ()); x2 = MAX (x2, bnd.x2 ()); y2 = MAX (y2, bnd.y2 ()); } x1 -= DAMAGE_BUFFER; y1 -= DAMAGE_BUFFER; x2 += DAMAGE_BUFFER; y2 += DAMAGE_BUFFER; reg = CompRegion (x1, y1, x2 - x1, y2 - y1); GroupScreen::get (screen)->cScreen->damageRegion (reg); } /* * GroupTabBar::moveTabBarRegion * * Move the reigon of the tab bar (which moves the drawn texture * and tabs). syncIPW is whether or not to move the X11 input prevention * window - usually false if we are just animating the tab bar around * */ void GroupTabBar::moveTabBarRegion (int dx, int dy, bool syncIPW) { damageRegion (); mRegion.translate (dx, dy); if (syncIPW) XMoveWindow (screen->dpy (), mInputPrevention, mLeftSpringX, mRegion.boundingRect ().y1 ()); damageRegion (); } /* * GroupTabBar::resizeTabBarRegion * * Resize the region that the tab bar covers by some CompRect. * syncIPW is whether or not to XConfigure the input prevention * window (don't use this unless the tab bar position is being set * like that permanently). * */ void GroupTabBar::resizeTabBarRegion (CompRect &box, bool syncIPW) { int oldWidth; GROUP_SCREEN (screen); damageRegion (); oldWidth = mRegion.boundingRect ().width (); /* If the old width is not the same as the new one and we are * syncing the IPW, rebuild the background layer */ if (mBgLayer && oldWidth != box.width () && syncIPW) { mBgLayer = BackgroundLayer::rebuild (mBgLayer, CompSize (box.width () + gs->optionGetThumbSpace () + gs->optionGetThumbSize (), box.height ())); if (mBgLayer) mBgLayer->render (); /* invalidate old width */ mOldWidth = 0; } mRegion = CompRegion (box); /* Configure the IPW */ if (syncIPW) { XWindowChanges xwc; xwc.x = box.x (); xwc.y = box.y (); xwc.width = box.width (); xwc.height = box.height (); if (!mIpwMapped) XMapWindow (screen->dpy (), mInputPrevention); XMoveResizeWindow (screen->dpy (), mInputPrevention, xwc.x, xwc.y, xwc.width, xwc.height); if (!mIpwMapped) XUnmapWindow (screen->dpy (), mInputPrevention); } damageRegion (); } /* * GroupTabBar::insertTabBarSlotBefore * * Insert a tab bar slot before some other slot and relink stack * */ void GroupTabBar::insertTabBarSlotBefore (GroupTabBarSlot *slot, GroupTabBarSlot *nextSlot) { GroupTabBarSlot *prev = nextSlot->mPrev; GroupTabBarSlot::List::iterator pos = std::find (mSlots.begin (), mSlots.end (), nextSlot); mSlots.insert (pos, slot); slot->mTabBar = this; if (prev) { slot->mPrev = prev; prev->mNext = slot; } else { slot->mPrev = NULL; } slot->mNext = nextSlot; nextSlot->mPrev = slot; /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got wider now, so it will put it in the average between them, which is (bar->mRegion.boundingRect ().centerX ()) anyway. */ recalcTabBarPos (mRegion.boundingRect ().centerX (), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupSelection::insertTabBarSlotAfter * * Insert a tab bar slot after some previous slot and relink the * stack * */ void GroupTabBar::insertTabBarSlotAfter (GroupTabBarSlot *slot, GroupTabBarSlot *prevSlot) { GroupTabBarSlot *next = prevSlot->mNext; GroupTabBarSlot::List::iterator pos = std::find (mSlots.begin (), mSlots.end (), next); mSlots.insert (pos, slot); slot->mTabBar = this; if (next) { slot->mNext = next; next->mPrev = slot; } else { slot->mNext = NULL; } slot->mPrev = prevSlot; prevSlot->mNext = slot; /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got wider now, so it will put it in the average between them, which is (bar->mRegion.boundingRect ().x1 () + bar->mRegion.boundingRect ().x2 ()) / 2 anyway. */ recalcTabBarPos (mRegion.boundingRect ().centerX (), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupSelection::insertTabBarSlot * * Insert a tab bar slot into the tab bar. This inserts it directly * into the end of the tab bar * */ void GroupTabBar::insertTabBarSlot (GroupTabBarSlot *slot) { if (mSlots.size ()) { mSlots.back ()->mNext = slot; slot->mPrev = mSlots.back (); slot->mNext = NULL; } else { slot->mPrev = NULL; slot->mNext = NULL; } mSlots.push_back (slot); slot->mTabBar = this; /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got wider now, so it will put it in the average between them, which is (bar->mRegion.boundingRect ().x1 () + bar->mRegion.boundingRect ().x2 ()) / 2 anyway. */ recalcTabBarPos ((mRegion.boundingRect ().centerX ()), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupTabBar::unhookTabBarSlot * * Take out a tab bar slot from the tab bar and make it a dragged * slot. If temporary is false, then remove this window from the * group * */ void GroupTabBar::unhookTabBarSlot (GroupTabBarSlot *slot, bool temporary) { GroupTabBarSlot *tempSlot = NULL; /* query for next and previous in linked list */ GroupTabBarSlot *prev = slot->mPrev; GroupTabBarSlot *next = slot->mNext; CompWindow *w = slot->mWindow; GroupSelection *group = mGroup; GROUP_SCREEN (screen); /* check if slot is not already unhooked */ foreach (tempSlot, mSlots) if (tempSlot == slot) break; if (!tempSlot) return; /* relink stack */ if (prev) prev->mNext = next; if (next) next->mPrev = prev; /* This slot's previous and next slots are now NULL */ slot->mPrev = NULL; slot->mNext = NULL; slot->mTabBar = NULL; mSlots.remove (slot); /* If it isn't temporary. Change to another tab */ if (!temporary) { /* If this was the previous top tab, set that to null */ if (IS_PREV_TOP_TAB (w, group)) group->mTabBar->mPrevTopTab = NULL; if (IS_TOP_TAB (w, group)) { group->mTabBar->mTopTab = NULL; group->mTopId = None; /* Change to the next tab first, otherwise the previous one */ if (next) gs->changeTab (next, RotateRight); else if (prev) gs->changeTab (prev, RotateLeft); if (gs->optionGetUntabOnClose ()) group->untabGroup (); } } /* set slot points to NULL so we don't use them again */ if (slot == mHoveredSlot) mHoveredSlot = NULL; if (slot == mTextSlot) { mTextSlot = NULL; /* Fade out text */ if (mTextLayer) { if (mTextLayer->mState == PaintFadeIn || mTextLayer->mState == PaintOn) { mTextLayer->mAnimationTime = (gs->optionGetFadeTextTime () * 1000) - mTextLayer->mAnimationTime; mTextLayer->mState = PaintFadeOut; } } } /* Moving bar->mRegion.boundingRect ().x1 () / x2 as minX1 / maxX2 will work, because the tab-bar got thiner now, so (bar->mRegion.boundingRect ().x1 () + bar->mRegion.boundingRect ().x2 ()) / 2 Won't cause the new x1 / x2 to be outside the original region. */ recalcTabBarPos (mRegion.boundingRect ().centerX (), mRegion.boundingRect ().x1 (), mRegion.boundingRect ().x2 ()); } /* * GroupSelection::deleteTabBarSlot * * Destroys a tab bar slot structure * */ void GroupTabBar::deleteTabBarSlot (GroupTabBarSlot *slot) { CompWindow *w = slot->mWindow; GROUP_WINDOW (w); GROUP_SCREEN (screen); /* It can't be part of any tab bar */ unhookTabBarSlot (slot, false); /* New region is just a blank region */ slot->mRegion = CompRegion (); /* If this is the dragged slot, set the pointers for that to * null, and remove grabs */ if (slot == gs->mDraggedSlot) { gs->mDraggedSlot = NULL; gs->mDragged = false; if (gs->mGrabState == GroupScreen::ScreenGrabTabDrag) gs->grabScreen (GroupScreen::ScreenGrabNone); } /* This window now has no slot */ gw->mSlot = NULL; gs->writeSerializedData (); delete slot; } GroupTabBarSlot::GroupTabBarSlot (CompWindow *w, GroupTabBar *bar) : GLLayer (CompSize (0,0), bar->mGroup), // FIXME: make this the size? mWindow (w), mTabBar (bar) { } /* * GroupTabBar::groupCreateSlot * * Factory function to create a new tab bar slot for some window * (automatically inserts it into the tab bar) * */ void GroupTabBar::createSlot (CompWindow *w) { GroupTabBarSlot *slot; GROUP_WINDOW (w); GROUP_SCREEN (screen); slot = new GroupTabBarSlot (w, this); if (!slot) return; insertTabBarSlot (slot); gw->mSlot = slot; gs->writeSerializedData (); } #define SPRING_K GroupScreen::get (screen)->optionGetDragSpringK() #define FRICTION GroupScreen::get (screen)->optionGetDragFriction() #define SIZE GroupScreen::get (screen)->optionGetThumbSize() #define BORDER GroupScreen::get (screen)->optionGetBorderRadius() #define Y_START_MOVE GroupScreen::get (screen)->optionGetDragYDistance() #define SPEED_LIMIT GroupScreen::get (screen)->optionGetDragSpeedLimit() /* * groupSpringForce * */ static inline int groupSpringForce (CompScreen *s, int centerX, int springX) { /* Each slot has a spring attached to it, starting at springX, and ending at the center of the slot (centerX). The spring will cause the slot to move, using the well-known physical formula F = k * dl... */ return -SPRING_K * (centerX - springX); } /* * groupDraggedSlotForce * */ static int groupDraggedSlotForce (CompScreen *s, int distanceX, int distanceY) { /* The dragged slot will make the slot move, to get DnD animations (slots will make room for the newly inserted slot). As the dragged slot is closer to the slot, it will put more force on the slot, causing it to make room for the dragged slot... But if the dragged slot gets too close to the slot, they are going to be reordered soon, so the force will get lower. If the dragged slot is in the other side of the slot, it will have to make force in the opposite direction. So we the needed funtion is an odd function that goes up at first, and down after that. Sinus is a function like that... :) The maximum is got when x = (x1 + x2) / 2, in this case: x = SIZE + BORDER. Because of that, for x = SIZE + BORDER, we get a force of SPRING_K * (SIZE + BORDER) / 2. That equals to the force we get from the the spring. This way, the slot won't move when its distance from the dragged slot is SIZE + BORDER (which is the default distance between slots). */ /* The maximum value */ float a = SPRING_K * (SIZE + BORDER) / 2; /* This will make distanceX == 2 * (SIZE + BORDER) to get 0, and distanceX == (SIZE + BORDER) to get the maximum. */ float b = PI / (2 * SIZE + 2 * BORDER); /* If there is some distance between the slots in the y axis, the slot should get less force... For this, we change max to a lower value, using a simple linear function. */ if (distanceY < Y_START_MOVE) a *= 1.0f - (float)distanceY / Y_START_MOVE; else a = 0; if (abs (distanceX) < 2 * (SIZE + BORDER)) return a * sin (b * distanceX); else return 0; } /* * groupApplyFriction * */ static inline void groupApplyFriction (CompScreen *s, int *speed) { if (abs (*speed) < FRICTION) *speed = 0; else if (*speed > 0) *speed -= FRICTION; else if (*speed < 0) *speed += FRICTION; } /* * groupApplySpeedLimit * */ static inline void groupApplySpeedLimit (CompScreen *s, int *speed) { if (*speed > SPEED_LIMIT) *speed = SPEED_LIMIT; else if (*speed < -SPEED_LIMIT) *speed = -SPEED_LIMIT; } /* * GroupTabBar::applyForces * * Apply forces to slots, move them around accordingly * */ bool GroupTabBar::applyForces (GroupTabBarSlot *draggedSlot) { GroupTabBarSlot *slot, *slot2; int centerX, centerY; int draggedCenterX, draggedCenterY; bool forces = false; /* Calculate the dragged slot center to calculate forces on the * other tabs */ if (draggedSlot) { int vx, vy; draggedSlot->getDrawOffset (vx, vy); draggedCenterX = draggedSlot->mRegion.boundingRect ().centerX () + vx; draggedCenterY = draggedSlot->mRegion.boundingRect ().centerY () + vy; } else { draggedCenterX = 0; draggedCenterY = 0; } /* mLeft/RightSpeed describe the stretching of the tab bar * during animations. This is basically just adding the new * adding the spring factor times the distance between the * anchor point and spring point */ mLeftSpeed += groupSpringForce(screen, mRegion.boundingRect ().x1 (), mLeftSpringX); mRightSpeed += groupSpringForce(screen, mRegion.boundingRect ().x2 (), mRightSpringX); /* Apply forces on the tab bar for this dragged slot */ if (draggedSlot) { int leftForce, rightForce; /* Forces here are basically the center point of tab minus the * dragged center point and the center y point of the tab bar * minus the dragged y center */ leftForce = groupDraggedSlotForce(screen, mRegion.boundingRect ().x1 () - SIZE / 2 - draggedCenterX, abs ((mRegion.boundingRect ().centerY ()) / 2 - draggedCenterY)); rightForce = groupDraggedSlotForce (screen, mRegion.boundingRect ().x2 () + SIZE / 2 - draggedCenterX, abs ((mRegion.boundingRect ().centerY ()) / 2 - draggedCenterY)); if (leftForce < 0) mLeftSpeed += leftForce; if (rightForce > 0) mRightSpeed += rightForce; } /* Now apply the spring force on each slot */ foreach (slot, mSlots) { centerX = slot->mRegion.boundingRect ().centerX (); centerY = slot->mRegion.boundingRect ().centerY (); /* Slot gets faster or slower for difference in calculated center * X and precalculated spring x */ slot->mSpeed += groupSpringForce (screen, centerX, slot->mSpringX); /* Apply dragged slot force on the other slots */ if (draggedSlot && draggedSlot != slot) { int draggedSlotForce; draggedSlotForce = groupDraggedSlotForce(screen, centerX - draggedCenterX, abs (centerY - draggedCenterY)); slot->mSpeed += draggedSlotForce; slot2 = NULL; /* If applying a negative force, the other slot to apply * force on is the left slot, otherwise the right one. * Then recursively calculate slot positions until we have * reached a NULL point on the tab bar (too far left or * right) */ if (draggedSlotForce < 0) { slot2 = slot->mPrev; mLeftSpeed += draggedSlotForce; } else if (draggedSlotForce > 0) { slot2 = slot->mNext; mRightSpeed += draggedSlotForce; } while (slot2) { if (slot2 != draggedSlot) slot2->mSpeed += draggedSlotForce; slot2 = (draggedSlotForce < 0) ? slot2->mPrev : slot2->mNext; } } } /* Apply frictions and speed limits to the tab motions */ foreach (slot, mSlots) { groupApplyFriction (screen, &slot->mSpeed); groupApplySpeedLimit (screen, &slot->mSpeed); forces |= (slot->mSpeed != 0); } /* Apply frictions and speed limits to the left and right sides */ groupApplyFriction (screen, &mLeftSpeed); groupApplySpeedLimit (screen, &mLeftSpeed); groupApplyFriction (screen, &mRightSpeed); groupApplySpeedLimit (screen, &mRightSpeed); forces |= (mLeftSpeed != 0 || mRightSpeed != 0); return forces; } /* * GroupTabBar::applySpeeds * */ void GroupTabBar::applySpeeds (int msSinceLastRepaint) { GroupTabBarSlot *slot; int move; CompRect box = mRegion.boundingRect (); bool updateTabBar = false; /* For animation purposes we need to know how many ms there have * been since the last movement */ mLeftMsSinceLastMove += msSinceLastRepaint; mRightMsSinceLastMove += msSinceLastRepaint; /* Left - x position of the region is just the calculated * speed times how many ms there have been since the last move * (/1000) */ move = mLeftSpeed * mLeftMsSinceLastMove / 1000; if (move) { box.setX (box.x () + move); box.setWidth (box.width () - move); mLeftMsSinceLastMove = 0; updateTabBar = true; } /* Otherwise if the left speed is zero and the region point is * still not the same as the left spring point, it might be * friction preventing us from getting to the position, so temp * overcome this */ else if (mLeftSpeed == 0 && mRegion.boundingRect ().x1 () != mLeftSpringX && (SPRING_K * abs (mRegion.boundingRect ().x1 () - mLeftSpringX) < FRICTION)) { /* Friction is preventing from the left border to get to its original position. */ box.setX (box.x () + mLeftSpringX - mRegion.boundingRect ().x1 ()); box.setWidth (box.width () - mLeftSpringX - mRegion.boundingRect ().x1 ()); mLeftMsSinceLastMove = 0; updateTabBar = true; } else if (mLeftSpeed == 0) mLeftMsSinceLastMove = 0; /* Right */ move = mRightSpeed * mRightMsSinceLastMove / 1000; if (move) { box.setWidth (box.width () + move); mRightMsSinceLastMove = 0; updateTabBar = true; } else if (mRightSpeed == 0 && mRegion.boundingRect ().x2 () != mRightSpringX && (SPRING_K * abs (mRegion.boundingRect ().x2 () - mRightSpringX) < FRICTION)) { /* Friction is preventing from the right border to get to its original position. */ box.setWidth (box.width () + mLeftSpringX - mRegion.boundingRect ().x1 ()); mLeftMsSinceLastMove = 0; updateTabBar = true; } else if (mRightSpeed == 0) mRightMsSinceLastMove = 0; /* If we need to update the bar, then resize the actual region */ if (updateTabBar) resizeTabBarRegion (box, false); /* Apply movement to slots */ foreach (slot, mSlots) { int slotCenter; /* Move slots by precalculated speeds */ slot->mMsSinceLastMove += msSinceLastRepaint; move = slot->mSpeed * slot->mMsSinceLastMove / 1000; slotCenter = slot->mRegion.boundingRect ().centerX (); if (move) { slot->mRegion.translate (move, 0); slot->mMsSinceLastMove = 0; } else if (slot->mSpeed == 0 && slotCenter != slot->mSpringX && SPRING_K * abs (slotCenter - slot->mSpringX) < FRICTION) { /* Friction is preventing from the slot to get to its original position. */ slot->mRegion.translate (slot->mSpringX - slotCenter, 0); slot->mMsSinceLastMove = 0; } else if (slot->mSpeed == 0) slot->mMsSinceLastMove = 0; } } /* * GroupTabBar::GroupTabBar * * Constructor for the tab bar - initialize it based on a parent group * and a top tab. Make sure that X windows are created and create * slots for this tab bar * */ GroupTabBar::GroupTabBar (GroupSelection *group, CompWindow *topTab) : mSlots (CompSize (0,0), group), mGroup (group), mTopTab (NULL), mPrevTopTab (NULL), mLastTopTab (NULL), mNextTopTab (NULL), mCheckFocusAfterTabChange (false), mChangeAnimationTime (0), mChangeAnimationDirection (0), mChangeState (NoTabChange), mHoveredSlot (NULL), mTextSlot (NULL), mTextLayer (NULL), mBgLayer (NULL), mSelectionLayer (NULL), mState (PaintOff), mAnimationTime (0), mOldWidth (0), mLeftSpringX (0), mRightSpringX (0), mLeftSpeed (0), mRightSpeed (0), mLeftMsSinceLastMove (0), mRightMsSinceLastMove (0), mInputPrevention (None), mIpwMapped (false) { mGroup->mTabBar = this; /* only need to do this because * GroupTabBar::createSlot checks * for mTabBar */ mGroup->mTopId = topTab->id (); mSlots.clear (); foreach (CompWindow *cw, mGroup->mWindows) createSlot (cw); createInputPreventionWindow (); mTopTab = GroupWindow::get (topTab)->mSlot; group->mTopId = topTab->id (); recalcTabBarPos (WIN_CENTER_X (topTab), WIN_X (topTab), WIN_X (topTab) + WIN_WIDTH (topTab)); } /* * GroupTabBar::~GroupTabBar * * Destructor for GroupTabBar, kill the cairo layers and kill the * input prevention window * */ GroupTabBar::~GroupTabBar () { while (mSlots.size ()) deleteTabBarSlot (mSlots.front ()); if (mTextLayer->mPixmap) XFreePixmap (screen->dpy (), mTextLayer->mPixmap); delete mTextLayer; delete mBgLayer; delete mSelectionLayer; mGroup->mTabBar->destroyInputPreventionWindow (); if (mTimeoutHandle.active ()) mTimeoutHandle.stop (); } /* * GroupScreen::initTab * * Action to tab the windows in a group * */ bool GroupScreen::initTab (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w; bool allowUntab = true; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); if (!w) return true; GROUP_WINDOW (w); /* If the windows are selected, we can skip the "group" phase * and go straight on to tabbing */ if (gw->mInSelection) { groupWindows (action, state, options); /* If the window was selected, we don't want to untab the group, because the user probably wanted to tab the selected windows. */ allowUntab = false; } if (!gw->mGroup) return true; /* Tab the group if there is no tab bar */ if (!gw->mGroup->mTabBar) gw->mGroup->tabGroup (w); else if (allowUntab) gw->mGroup->untabGroup (); cScreen->damageScreen (); return true; } /* * GroupScreen::changeTabLeft * * Action to change the top tab of the group to the tab to the left * of the top tab * */ bool GroupScreen::changeTabLeft (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w, *topTab; xid = CompOption::getIntOptionNamed (options, "window", 0); w = topTab = screen->findWindow (xid); if (!w) return true; GROUP_WINDOW (w); if (!gw->mSlot || !gw->mGroup || !gw->mGroup->mTabBar || !gw->mGroup->mTabBar->mTopTab) return true; if (gw->mGroup->mTabBar->mNextTopTab) topTab = NEXT_TOP_TAB (gw->mGroup); else if (gw->mGroup->mTabBar->mTopTab) { /* If there are no tabbing animations, topTab is never NULL. */ topTab = TOP_TAB (gw->mGroup); } gw = GroupWindow::get (topTab); if (gw->mSlot->mPrev) return changeTab (gw->mSlot->mPrev, GroupTabBar::RotateLeft); else return changeTab (gw->mGroup->mTabBar->mSlots.back (), GroupTabBar::RotateLeft); } /* * changeTabRight * */ bool GroupScreen::changeTabRight (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid; CompWindow *w, *topTab; xid = CompOption::getIntOptionNamed (options, "window", 0); w = topTab = screen->findWindow (xid); if (!w) return true; GROUP_WINDOW (w); if (!gw->mSlot || !gw->mGroup || !gw->mGroup->mTabBar) return true; if (gw->mGroup->mTabBar->mNextTopTab) topTab = NEXT_TOP_TAB (gw->mGroup); else if (gw->mGroup->mTabBar->mTopTab) { /* If there are no tabbing animations, topTab is never NULL. */ topTab = TOP_TAB (gw->mGroup); } gw = GroupWindow::get (topTab); if (gw->mSlot->mNext) return changeTab (gw->mSlot->mNext, GroupTabBar::RotateRight); else return changeTab (gw->mGroup->mTabBar->mSlots.front (), GroupTabBar::RotateRight); } /* * switchTopTabInput * * If the IPW is created, then map it accordingly * */ void GroupScreen::switchTopTabInput (GroupSelection *group, bool enable) { if (!group->mTabBar || !HAS_TOP_WIN (group)) return; if (!group->mTabBar->mInputPrevention) group->mTabBar->createInputPreventionWindow (); if (!enable) { XMapWindow (screen->dpy (), group->mTabBar->mInputPrevention); } else { XUnmapWindow (screen->dpy (), group->mTabBar->mInputPrevention); } group->mTabBar->mIpwMapped = !enable; } /* * GroupTabBar::createInputPreventionWindow * */ void GroupTabBar::createInputPreventionWindow () { if (!mInputPrevention) { XSetWindowAttributes attrib; attrib.override_redirect = true; mInputPrevention = XCreateWindow (screen->dpy (), screen->root (), -100, -100, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); mIpwMapped = false; } } /* * GroupTabBar::destroyInputPreventionWindow * */ void GroupTabBar::destroyInputPreventionWindow () { if (mInputPrevention) { XDestroyWindow (screen->dpy (), mInputPrevention); mInputPrevention = None; mIpwMapped = true; } } ./plugins/group/src/glow.h0000644000004100000410000000375113246301623015776 0ustar www-datawww-data/** * * Compiz group plugin * * glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _GROUP_GLOW_H #define _GROUP_GLOW_H #include "group.h" extern const unsigned short GLOWQUAD_TOPLEFT; extern const unsigned short GLOWQUAD_TOPRIGHT; extern const unsigned short GLOWQUAD_BOTTOMLEFT; extern const unsigned short GLOWQUAD_BOTTOMRIGHT; extern const unsigned short GLOWQUAD_TOP; extern const unsigned short GLOWQUAD_BOTTOM; extern const unsigned short GLOWQUAD_LEFT; extern const unsigned short GLOWQUAD_RIGHT; extern const unsigned short NUM_GLOWQUADS; /* Represents a particular glow texture, so here * we have hardcoded in the texture data, the offset * and the size of the texture */ typedef struct _GlowTextureProperties { char *textureData; int textureSize; int glowOffset; } GlowTextureProperties; /* Each glow quad contains a 2x2 scale + positional matrix * (the 3rd column is not used since that is for matrix skew * operations which we do not care about) * and also a CompRect which describes the size and position of * the quad on the glow */ class GlowQuad { public: CompRect mBox; GLTexture::Matrix mMatrix; }; extern const GlowTextureProperties glowTextureProperties[2]; #endif ./plugins/group/group.xml.in0000644000004100000410000004534313246301623016354 0ustar www-datawww-data <_short>Group and Tab Windows <_long>With this plugin you can group and tab windows Window Management opengl mousepoll fade place text <_short>Selection <_short>Key bindings <_short>Grouping <_short>Key bindings <_short>Tabbing <_short>Key bindings <_short>Glow <_short>Key bindings <_short>General <_short>Selection <_short>Options <_short>Colors <_short>Tabbing <_short>Misc. Options <_short>Animation Options <_short>Appearance <_short>Window Title Font <_short>Slot Dragging <_short>Glow ./plugins/resize/0000755000004100000410000000000013246301624014226 5ustar www-datawww-data./plugins/resize/CMakeLists.txt0000644000004100000410000000030713246301623016765 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) add_subdirectory (src/logic) include_directories (src/logic/include) compiz_plugin(resize PLUGINDEPS composite opengl LIBRARIES resize_logic) ./plugins/resize/resize.xml.in0000644000004100000410000001431713246301623016663 0ustar www-datawww-data <_short>Resize Window <_long>Resize window Window Management composite opengl decor <_short>Bindings <_short>Specific Window Matches <_short>Additional Modifier Keys <_short>Outline Modifier <_short>Rectangle Modifier <_short>Stretch Modifier <_short>Centered Modifier ./plugins/resize/src/0000755000004100000410000000000013246301624015015 5ustar www-datawww-data./plugins/resize/src/screen-impl.h0000644000004100000410000000655713246301623017420 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_SCREEN_IMPL #define RESIZE_SCREEN_IMPL #include "screen-interface.h" #include "window-impl.h" #include namespace resize { class CompScreenImpl : public CompScreenInterface { public: CompScreenImpl (CompScreen *impl) : mImpl (impl) { } virtual Window root () { return mImpl->root (); } virtual CompWindowInterface * findWindow (Window id) { return CompWindowImpl::wrap (mImpl->findWindow (id)); } virtual void freeWindowInterface (CompWindowInterface *i) { CompWindowImpl::unwrap (i); } virtual int xkbEvent () { return mImpl->xkbEvent (); } virtual void handleEvent (XEvent *event) { mImpl->handleEvent (event); } virtual int syncEvent () { return mImpl->syncEvent (); } virtual Display * dpy () { return mImpl->dpy (); } virtual void warpPointer (int dx, int dy) { mImpl->warpPointer (dx, dy); } virtual CompOutput::vector & outputDevs () { return mImpl->outputDevs (); } virtual bool otherGrabExist (const char *n, void *o) { return mImpl->otherGrabExist (n, o); } virtual void updateGrab (CompScreen::GrabHandle handle, Cursor cursor) { mImpl->updateGrab (handle, cursor); } virtual CompScreen::GrabHandle pushGrab (Cursor cursor, const char *name) { return mImpl->pushGrab (cursor, name); } virtual CompScreen::GrabHandle pushPointerGrab (Cursor cursor, const char *name) { return mImpl->pushPointerGrab (cursor, name); } virtual CompScreen::GrabHandle pushKeyboardGrab (const char *name) { return mImpl->pushKeyboardGrab (name); } virtual void removeGrab (CompScreen::GrabHandle handle, CompPoint *restorePointer) { mImpl->removeGrab (handle, restorePointer); } /* CompOption::Class */ virtual CompOption * getOption (const CompString &name) { return mImpl->getOption (name); } /* CompSize */ virtual int width () const { return mImpl->width (); } virtual int height () const { return mImpl->height (); } virtual Cursor cursorCache (unsigned int cursorName) { return mImpl->cursorCache (cursorName); } private: CompScreen *mImpl; }; } /* namespace resize */ #endif /* RESIZE_SCREEN_IMPL */ ./plugins/resize/src/gl-window-impl.h0000644000004100000410000000343213246301623020035 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_WINDOW_IMPL_H #define RESIZE_GL_WINDOW_IMPL_H #include "gl-window-interface.h" namespace resize { class GLWindowImpl : public GLWindowInterface { public: GLWindowImpl (GLWindow *impl) : mImpl (impl) { } static GLWindowImpl *wrap (GLWindow *impl) { if (impl) return new GLWindowImpl (impl); else return NULL; } virtual void glPaintSetEnabled (bool enable) { mImpl->glPaintSetEnabled (resizeWindow, enable); } ResizeWindow *resizeWindow; private: GLWindow *mImpl; }; } /* namespace resize */ #endif /* RESIZE_GL_WINDOW_IMPL_H */ ./plugins/resize/src/resize.h0000644000004100000410000000566113246301623016476 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _RESIZE_H #define _RESIZE_H #include #include #include #include #include "resize_options.h" #include "resize-logic.h" #include "resize-defs.h" class ResizeScreen : public PluginClassHandler, public GLScreenInterface, public ScreenInterface, public ResizeOptions { public: ResizeScreen (CompScreen *s); ~ResizeScreen (); void handleEvent (XEvent *event); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void optionChanged (CompOption *o, Options); void resizeMaskValueToKeyMask (int valueMask, int *mask); void glPaintRectangle (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, unsigned short *borderColor, unsigned short *fillColor); public: ResizeLogic logic; GLScreen *gScreen; }; class ResizeWindow : public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: ResizeWindow (CompWindow *w); ~ResizeWindow (); bool damageRect (bool, const CompRect &); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void getStretchScale (BoxPtr pBox, float *xScale, float *yScale); public: CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; ResizeScreen *rScreen; }; class ResizePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif ./plugins/resize/src/logic/0000755000004100000410000000000013246301623016111 5ustar www-datawww-data./plugins/resize/src/logic/CMakeLists.txt0000644000004100000410000000177313246301623020661 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_BINARY_DIR}/generated ${COMPIZ_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/composite-screen-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/gl-screen-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/resize-logic.h ${CMAKE_CURRENT_SOURCE_DIR}/include/resize-window-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/screen-interface.h ${CMAKE_CURRENT_SOURCE_DIR}/include/window-interface.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/resize-logic.cpp ) ADD_LIBRARY( resize_logic STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( resize_logic compiz_rect compiz_region ) ADD_DEPENDENCIES (resize_logic resize-options) ./plugins/resize/src/logic/include/0000755000004100000410000000000013246301624017535 5ustar www-datawww-data./plugins/resize/src/logic/include/gl-screen-interface.h0000644000004100000410000000275013246301623023526 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_SCREEN_INTERFACE #define RESIZE_GL_SCREEN_INTERFACE namespace resize { class GLScreenInterface { public: virtual ~GLScreenInterface () {} virtual void glPaintOutputSetEnabled (bool enable) = 0; }; } /* namespace resize */ #endif /* RESIZE_GL_SCREEN_INTERFACE */ ./plugins/resize/src/logic/include/window-interface.h0000644000004100000410000000617313246301623023161 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_WINDOW_INTERFACE #define RESIZE_WINDOW_INTERFACE #include namespace resize { class ResizeWindowInterface; class GLWindowInterface; class CompositeWindowInterface; /* * Interface between a concrete CompWindow * and ResizeLogic. * * An enabler for having ResizeLogic testable. */ class CompWindowInterface { public: virtual ~CompWindowInterface () {} virtual Window id () = 0; virtual CompRect outputRect () const = 0; virtual XSyncAlarm syncAlarm () = 0; virtual XSizeHints & sizeHints () const = 0; virtual const CompWindow::Geometry & serverGeometry () const = 0; virtual const CompWindowExtents & border () const = 0; virtual const CompWindowExtents & output () const = 0; virtual bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight) = 0; virtual bool syncWait () = 0; virtual void sendSyncRequest () = 0; virtual void configureXWindow (unsigned int valueMask, XWindowChanges *xwc) = 0; virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask) = 0; virtual void ungrabNotify () = 0; virtual bool shaded () = 0; virtual CompSize size () const = 0; virtual unsigned int actions () = 0; virtual unsigned int type () = 0; virtual unsigned int & state () = 0; virtual bool overrideRedirect () = 0; virtual void updateAttributes (CompStackingUpdateMode stackingMode) = 0; virtual int outputDevice () = 0; virtual const CompSize serverSize () const = 0; virtual void maximize (unsigned int state = 0) = 0; virtual XWindowChanges & saveWc () = 0; virtual int & saveMask () = 0; /* equivalent of CompMatch::evaluate */ virtual bool evaluate (CompMatch &match) = 0; virtual ResizeWindowInterface *getResizeInterface () = 0; virtual GLWindowInterface *getGLInterface () = 0; virtual CompositeWindowInterface *getCompositeInterface () = 0; }; } /* namespace resize */ #endif /* RESIZE_WINDOW_INTERFACE */ ./plugins/resize/src/logic/include/composite-window-interface.h0000644000004100000410000000301613246301623025152 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_WINDOW_INTERFACE_H #define RESIZE_COMPOSITE_WINDOW_INTERFACE_H namespace resize { class CompositeWindowInterface { public: virtual ~CompositeWindowInterface () {} virtual void damageRectSetEnabled (bool enable) = 0; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_WINDOW_INTERFACE_H */ ./plugins/resize/src/logic/include/composite-screen-interface.h0000644000004100000410000000306013246301623025121 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_SCREEN_INTERFACE #define RESIZE_COMPOSITE_SCREEN_INTERFACE namespace resize { class CompositeScreenInterface { public: virtual ~CompositeScreenInterface () {} virtual bool compositingActive () = 0; virtual void damageRegion (const CompRegion &r) = 0; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_SCREEN_INTERFACE */ ./plugins/resize/src/logic/include/property-writer-interface.h0000644000004100000410000000341513246301623025044 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_PROPERTY_WRITER_INTERFACE_H #define RESIZE_PROPERTY_WRITER_INTERFACE_H namespace resize { class PropertyWriterInterface { public: virtual ~PropertyWriterInterface() {} virtual bool updateProperty (Window, CompOption::Vector &, int) = 0; virtual void deleteProperty (Window) = 0; virtual const CompOption::Vector & readProperty (Window) = 0; virtual void setReadTemplate (const CompOption::Vector &) = 0; virtual const CompOption::Vector & getReadTemplate () = 0; }; } /* namespace resize */ #endif /* RESIZE_PROPERTY_WRITER_INTERFACE_H */ ./plugins/resize/src/logic/include/resize-window-interface.h0000644000004100000410000000303013246301623024445 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_RESIZE_WINDOW_INTERFACE_H #define RESIZE_RESIZE_WINDOW_INTERFACE_H namespace resize { class ResizeWindowInterface { public: virtual ~ResizeWindowInterface () {} virtual void getStretchScale (BoxPtr pBox, float *xScale, float *yScale) = 0; }; } /* namespace resize */ #endif /* RESIZE_RESIZE_WINDOW_INTERFACE_H */ ./plugins/resize/src/logic/include/resize-logic.h0000644000004100000410000001143413246301623022304 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Daniel d'Andrada */ #ifndef RESIZELOGIC_H #define RESIZELOGIC_H #include #include #include #include #include "resize-defs.h" class ResizeOptions; class CompositeScreen; class GLScreen; namespace resize { class CompWindowInterface; class CompScreenInterface; class CompositeScreenInterface; class GLScreenInterface; class PropertyWriterInterface; } class ResizeLogic { public: ResizeLogic(); virtual ~ResizeLogic(); void handleEvent (XEvent *event); void getPaintRectangle (BoxPtr pBox); void getStretchRectangle (BoxPtr pBox); void finishResizing (); Cursor cursorFromResizeMask (unsigned int mask); void damageRectangle (BoxPtr pBox); bool initiateResize (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int mode); bool terminateResize (CompAction *action, CompAction::State state, CompOption::Vector &options); bool initiateResizeDefaultMode (CompAction *action, CompAction::State state, CompOption::Vector &options); resize::CompScreenInterface *mScreen; struct _ResizeKeys { const char *name; int dx; int dy; unsigned int warpMask; unsigned int resizeMask; } rKeys[NUM_KEYS]; Atom resizeNotifyAtom; resize::PropertyWriterInterface *resizeInformationAtom; resize::CompWindowInterface *w; int mode; bool centered; XRectangle savedGeometry; XRectangle geometry; /* geometry without the vertical maximization. Its value is undefined when maximized_vertically == false */ XRectangle geometryWithoutVertMax; bool maximized_vertically; int outlineMask; int rectangleMask; int stretchMask; int centeredMask; int releaseButton; unsigned int mask; int pointerDx; int pointerDy; KeyCode key[NUM_KEYS]; unsigned int keyCursorNames[NUM_KEYS]; CompScreen::GrabHandle grabIndex; bool isConstrained; CompRegion constraintRegion; bool inRegionStatus; int lastGoodHotSpotY; CompSize lastGoodSize; bool offWorkAreaConstrained; boost::shared_ptr grabWindowWorkArea; ResizeOptions *options; resize::CompositeScreenInterface *cScreen; resize::GLScreenInterface *gScreen; private: void handleKeyEvent (KeyCode keycode); void handleMotionEvent (int xRoot, int yRoot); void sendResizeNotify (); void updateWindowSize (); void updateWindowProperty (); /* Helper functions for handleMotionEvent() */ void snapWindowToWorkAreaBoundaries (int &wi, int &he, int &wX, int &wY, int &wWidth, int &wHeight); void setUpMask (int xRoot, int yRoot); void accumulatePointerMotion (int xRoot, int yRoot); void constrainToWorkArea (int &che, int &cwi); void limitMovementToConstraintRegion (int &wi, int &he, int xRoot, int yRoot, int wX, int wY, int wWidth, int wHeight); void computeWindowPlusBordersRect (int &wX, int &wY, int &wWidth, int &wHeight, int wi, int he); void enableOrDisableVerticalMaximization (int yRoot); void computeGeometry (int wi, int he); int getOutputForEdge (int windowOutput, unsigned int touch, bool skipFirst); unsigned int findTouchingOutput (int touchPoint, unsigned int side); void getPointForTp (unsigned int tp, unsigned int output, int &op, int &wap); unsigned int lastMaskX; unsigned int lastMaskY; }; #endif /* RESIZELOGIC_H */ ./plugins/resize/src/logic/include/screen-interface.h0000644000004100000410000000522613246301623023127 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_SCREEN_INTERFACE_H #define RESIZE_SCREEN_INTERFACE_H #include namespace resize { class CompWindowInterface; /* * Interface between a concrete CompScreen * and ResizeLogic. * * An enabler for having ResizeLogic testable. */ class CompScreenInterface { public: virtual ~CompScreenInterface () {} virtual Window root () = 0; virtual CompWindowInterface * findWindow (Window id) = 0; virtual void freeWindowInterface (CompWindowInterface *) {} virtual int xkbEvent () = 0; virtual void handleEvent (XEvent *event) = 0; virtual int syncEvent () = 0; virtual Display * dpy () = 0; virtual void warpPointer (int dx, int dy) = 0; virtual CompOutput::vector & outputDevs () = 0; virtual bool otherGrabExist (const char *, void *) = 0; virtual void updateGrab (CompScreen::GrabHandle handle, Cursor cursor) = 0; virtual CompScreen::GrabHandle pushGrab (Cursor cursor, const char *name) = 0; virtual CompScreen::GrabHandle pushPointerGrab (Cursor cursor, const char *name) = 0; virtual CompScreen::GrabHandle pushKeyboardGrab (const char *name) = 0; virtual void removeGrab (CompScreen::GrabHandle handle, CompPoint *restorePointer) = 0; virtual Cursor cursorCache (unsigned int cursorName) = 0; /* CompOption::Class */ virtual CompOption * getOption (const CompString &name) = 0; /* CompSize */ virtual int width () const = 0; virtual int height () const = 0; }; } /* namespace resize */ #endif /* RESIZE_SCREEN_INTERFACE_H */ ./plugins/resize/src/logic/include/gl-window-interface.h0000644000004100000410000000275013246301623023556 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_WINDOW_INTERFACE_H #define RESIZE_GL_WINDOW_INTERFACE_H namespace resize { class GLWindowInterface { public: virtual ~GLWindowInterface () {} virtual void glPaintSetEnabled (bool enable) = 0; }; } /* namespace resize */ #endif /* RESIZE_GL_WINDOW_INTERFACE_H */ ./plugins/resize/src/logic/include/resize-defs.h0000644000004100000410000000313113246301623022123 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef RESIZEDEFS_H #define RESIZEDEFS_H #define RESIZE_SCREEN(s) ResizeScreen *rs = ResizeScreen::get(s) #define RESIZE_WINDOW(w) ResizeWindow *rw = ResizeWindow::get(w) #define ResizeUpMask (1L << 0) #define ResizeDownMask (1L << 1) #define ResizeLeftMask (1L << 2) #define ResizeRightMask (1L << 3) #define NUM_KEYS 4 #define MIN_KEY_WIDTH_INC 24 #define MIN_KEY_HEIGHT_INC 24 #endif /* RESIZEDEFS_H */ ./plugins/resize/src/logic/src/0000755000004100000410000000000013246301624016701 5ustar www-datawww-data./plugins/resize/src/logic/src/resize-logic.cpp0000644000004100000410000012435113246301623022006 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Daniel d'Andrada */ #include #include #include #include "resize-logic.h" #include "resize_options.h" #include "screen-interface.h" #include "gl-screen-interface.h" #include "composite-screen-interface.h" #include "window-interface.h" #include "composite-window-interface.h" #include "gl-window-interface.h" #include "resize-window-interface.h" #include "property-writer-interface.h" #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} static const unsigned short TOUCH_LEFT = 1; static const unsigned short TOUCH_RIGHT = 2; static const unsigned short TOUCH_TOP = 3; static const unsigned short TOUCH_BOTTOM = 4; #define LEFT_CURSOR XC_left_side #define RIGHT_CURSOR XC_right_side #define UP_CURSOR XC_top_side #define UP_LEFT_CURSOR XC_top_left_corner #define UP_RIGHT_CURSOR XC_top_right_corner #define DOWN_CURSOR XC_bottom_side #define DOWN_LEFT_CURSOR XC_bottom_left_corner #define DOWN_RIGHT_CURSOR XC_bottom_right_corner #define MIDDLE_CURSOR XC_fleur using namespace resize; ResizeLogic::ResizeLogic() : mScreen (NULL), w (NULL), centered (false), maximized_vertically (false), outlineMask (0), rectangleMask (0), stretchMask (0), centeredMask (0), releaseButton (0), grabIndex (0), isConstrained (false), offWorkAreaConstrained (true), options (NULL), cScreen (NULL), gScreen (NULL), lastMaskX (0), lastMaskY (0) { rKeys[0].name = "Left"; rKeys[0].dx = -1; rKeys[0].dy = 0; rKeys[0].warpMask = ResizeLeftMask | ResizeRightMask; rKeys[0].resizeMask = ResizeLeftMask; rKeys[1].name = "Right"; rKeys[1].dx = 1; rKeys[1].dy = 0; rKeys[1].warpMask = ResizeLeftMask | ResizeRightMask; rKeys[1].resizeMask = ResizeRightMask; rKeys[2].name = "Up"; rKeys[2].dx = 0; rKeys[2].dy = -1; rKeys[2].warpMask = ResizeUpMask | ResizeDownMask; rKeys[2].resizeMask = ResizeUpMask; rKeys[3].name = "Down"; rKeys[3].dx = 0; rKeys[3].dy = 1; rKeys[3].warpMask = ResizeUpMask | ResizeDownMask; rKeys[3].resizeMask = ResizeDownMask; } ResizeLogic::~ResizeLogic() { } void ResizeLogic::handleEvent (XEvent *event) { switch (event->type) { case KeyPress: if (event->xkey.root == mScreen->root ()) handleKeyEvent (event->xkey.keycode); break; case ButtonRelease: if (event->xbutton.root == mScreen->root ()) { if (grabIndex) { if (releaseButton == -1 || (int) event->xbutton.button == releaseButton) { CompAction *action = &options->optionGetInitiateButton (); terminateResize (action, CompAction::StateTermButton, noOptions ()); } } } break; case MotionNotify: if (event->xmotion.root == mScreen->root ()) handleMotionEvent (pointerX, pointerY); break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == mScreen->root ()) handleMotionEvent (pointerX, pointerY); break; case ClientMessage: if (event->xclient.message_type == Atoms::wmMoveResize) { unsigned long type = event->xclient.data.l[2]; if (type <= WmMoveResizeSizeLeft || type == WmMoveResizeSizeKeyboard) { CompWindowInterface *w; w = mScreen->findWindow (event->xclient.window); if (w) { mScreen->freeWindowInterface (w); w = NULL; CompOption::Vector o (0); o.push_back (CompOption ("window", CompOption::TypeInt)); o[0].value ().set ((int) event->xclient.window); o.push_back (CompOption ("external", CompOption::TypeBool)); o[1].value ().set (true); if (type == WmMoveResizeSizeKeyboard) { initiateResizeDefaultMode (&options->optionGetInitiateKey (), CompAction::StateInitKey, o); } else { /* TODO: not only button 1 */ if (pointerMods & Button1Mask) { static unsigned int mask[] = { ResizeUpMask | ResizeLeftMask, ResizeUpMask, ResizeUpMask | ResizeRightMask, ResizeRightMask, ResizeDownMask | ResizeRightMask, ResizeDownMask, ResizeDownMask | ResizeLeftMask, ResizeLeftMask, }; o.push_back (CompOption ("modifiers", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o.push_back (CompOption ("direction", CompOption::TypeInt)); o.push_back (CompOption ("button", CompOption::TypeInt)); o[2].value ().set ((int) pointerMods); o[3].value ().set ((int) event->xclient.data.l[0]); o[4].value ().set ((int) event->xclient.data.l[1]); o[5].value ().set ((int) mask[event->xclient.data.l[2]]); o[6].value ().set ((int) (event->xclient.data.l[3] ? event->xclient.data.l[3] : -1)); lastMaskX = lastMaskY = 0; initiateResizeDefaultMode ( &options->optionGetInitiateButton (), CompAction::StateInitButton, o); handleMotionEvent (pointerX, pointerY); } } } } else if (this->w && type == WmMoveResizeCancel) { if (this->w->id () == event->xclient.window) { terminateResize (&options->optionGetInitiateButton (), CompAction::StateCancel, noOptions ()); terminateResize (&options->optionGetInitiateKey (), CompAction::StateCancel, noOptions ()); } } } break; case DestroyNotify: if (w && w->id () == event->xdestroywindow.window) { terminateResize (&options->optionGetInitiateButton (), 0, noOptions ()); terminateResize (&options->optionGetInitiateKey (), 0, noOptions ()); } break; case UnmapNotify: if (w && w->id () == event->xunmap.window) { terminateResize (&options->optionGetInitiateButton (), 0, noOptions ()); terminateResize (&options->optionGetInitiateKey (), 0, noOptions ()); } break; default: break; } if (event->type == mScreen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; /* Check if we need to change to outline mode */ unsigned int mods = 0xffffffff; bool modifierMode = false; int oldMode = mode; if (outlineMask) mods = outlineMask; if ((stateEvent->mods & mods) == mods) { modifierMode = true; mode = ResizeOptions::ModeOutline; } mods = 0xffffffff; if (rectangleMask) mods = rectangleMask; if ((stateEvent->mods & mods) == mods) { modifierMode = true; mode = ResizeOptions::ModeRectangle; } mods = 0xffffffff; if (stretchMask) mods = stretchMask; if ((stateEvent->mods & mods) == mods) { modifierMode = true; mode = ResizeOptions::ModeStretch; } mods = 0xffffffff; if (centeredMask) mods = centeredMask; /* No modifier mode set, check match options */ if (w) { if (w->evaluate (options->optionGetNormalMatch ())) { modifierMode = true; mode = ResizeOptions::ModeNormal; } if (w->evaluate (options->optionGetOutlineMatch ())) { modifierMode = true; mode = ResizeOptions::ModeOutline; } if (w->evaluate (options->optionGetRectangleMatch ())) { modifierMode = true; mode = ResizeOptions::ModeRectangle; } if (w->evaluate (options->optionGetStretchMatch ())) { modifierMode = true; mode = ResizeOptions::ModeStretch; } } if (!modifierMode) mode = options->optionGetMode (); if (w && oldMode != mode) { Box box; getStretchRectangle (&box); damageRectangle (&box); getPaintRectangle (&box); damageRectangle (&box); box.x1 = w->outputRect ().x (); box.y1 = w->outputRect ().y (); box.x2 = box.x1 + w->outputRect ().width (); box.y2 = box.y1 + w->outputRect ().height (); damageRectangle (&box); } if ((stateEvent->mods & mods) == mods) { centered = true; } else if (w) { if (!w->evaluate (options->optionGetResizeFromCenterMatch ())) centered = false; else centered = true; } else centered = false; } } mScreen->handleEvent (event); if (event->type == mScreen->syncEvent () + XSyncAlarmNotify) { if (w) { XSyncAlarmNotifyEvent *sa; sa = (XSyncAlarmNotifyEvent *) event; if (w->syncAlarm () == sa->alarm) updateWindowSize (); } } } void ResizeLogic::handleKeyEvent (KeyCode keycode) { if (grabIndex && w) { int widthInc = w->sizeHints ().width_inc; int heightInc = w->sizeHints ().height_inc; if (widthInc < MIN_KEY_WIDTH_INC) widthInc = MIN_KEY_WIDTH_INC; if (heightInc < MIN_KEY_HEIGHT_INC) heightInc = MIN_KEY_HEIGHT_INC; for (unsigned int i = 0; i < NUM_KEYS; i++) { if (keycode != key[i]) continue; if (mask & rKeys[i].warpMask) XWarpPointer (mScreen->dpy (), None, None, 0, 0, 0, 0, rKeys[i].dx * widthInc, rKeys[i].dy * heightInc); else { CompWindow::Geometry server = w->serverGeometry (); const CompWindowExtents &border = w->border (); int left = server.x () - border.left; int top = server.y () - border.top; int width = border.left + server.width () + border.right; int height = border.top + server.height () + border.bottom; int x = left + width * (rKeys[i].dx + 1) / 2; int y = top + height * (rKeys[i].dy + 1) / 2; mScreen->warpPointer (x - pointerX, y - pointerY); mask = rKeys[i].resizeMask; if ((mask & ResizeLeftMask || mask & ResizeRightMask) && (mask != lastMaskX)) { pointerDx *= -1; lastMaskX = mask; } if ((mask & ResizeUpMask || mask & ResizeDownMask) && (mask != lastMaskY)) { pointerDy *= -1; lastMaskY = mask; } mScreen->updateGrab (grabIndex, mScreen->cursorCache (keyCursorNames[i])); } break; } } } void ResizeLogic::handleMotionEvent (int xRoot, int yRoot) { if (grabIndex) { BoxRec box; int wi, he, cwi, che; /* size of window contents (c prefix for constrained)*/ int wX, wY, wWidth, wHeight; /* rect. for window contents+borders */ wi = savedGeometry.width; he = savedGeometry.height; if (!mask) { setUpMask (xRoot, yRoot); } else { accumulatePointerMotion (xRoot, yRoot); } if (mask & ResizeLeftMask || lastMaskX & ResizeLeftMask) wi -= pointerDx; else if (mask & ResizeRightMask || lastMaskX & ResizeRightMask) wi += pointerDx; if (mask & ResizeUpMask || lastMaskY & ResizeUpMask) he -= pointerDy; else if (mask & ResizeDownMask || lastMaskY & ResizeDownMask) he += pointerDy; if (w->state () & CompWindowStateMaximizedVertMask) he = w->serverGeometry ().height (); if (w->state () & CompWindowStateMaximizedHorzMask) wi = w->serverGeometry ().width (); cwi = wi; che = he; if (w->constrainNewWindowSize (wi, he, &cwi, &che) && mode != ResizeOptions::ModeNormal && mode != ResizeOptions::ModeOutline) { Box box; /* Also, damage relevant paint rectangles */ if (mode == ResizeOptions::ModeRectangle) getPaintRectangle (&box); else if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); damageRectangle (&box); } if (offWorkAreaConstrained) constrainToWorkArea (che, cwi); wi = cwi; he = che; /* compute rect. for window + borders */ computeWindowPlusBordersRect (wX, wY, wWidth, wHeight, /*out*/ wi, he); /*in*/ snapWindowToWorkAreaBoundaries (wi, he, wX, wY, wWidth, wHeight); if (isConstrained) limitMovementToConstraintRegion (wi, he, /*in/out*/ xRoot, yRoot, wX, wY, wWidth, wHeight); /*in*/ if (mode != ResizeOptions::ModeNormal && mode != ResizeOptions::ModeOutline) { if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); else getPaintRectangle (&box); damageRectangle (&box); } enableOrDisableVerticalMaximization (yRoot); computeGeometry (wi, he); if (mode != ResizeOptions::ModeNormal && mode != ResizeOptions::ModeOutline) { if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); else getPaintRectangle (&box); damageRectangle (&box); } else if (mode == ResizeOptions::ModeNormal) { updateWindowSize (); } updateWindowProperty (); sendResizeNotify (); } } void ResizeLogic::updateWindowSize () { if (w->syncWait ()) return; if (w->serverGeometry ().width () != geometry.width || w->serverGeometry ().height () != geometry.height) { XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = geometry.x; xwc.y = geometry.y; xwc.width = geometry.width; xwc.height = geometry.height; w->sendSyncRequest (); w->configureXWindow (CWX | CWY | CWWidth | CWHeight, &xwc); } } void ResizeLogic::updateWindowProperty () { CompOption::Vector data = resizeInformationAtom->getReadTemplate ();; CompOption::Value v; if (data.size () != 4) return; v = geometry.x; data.at (0).set (v); v = geometry.y; data.at (1).set (v); v = geometry.width; data.at (2).set (v); v = geometry.height; data.at (3).set (v); resizeInformationAtom->updateProperty (w->id (), data, XA_CARDINAL); } void ResizeLogic::sendResizeNotify () { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = mScreen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = resizeNotifyAtom; xev.xclient.window = w->id (); xev.xclient.data.l[0] = geometry.x; xev.xclient.data.l[1] = geometry.y; xev.xclient.data.l[2] = geometry.width; xev.xclient.data.l[3] = geometry.height; xev.xclient.data.l[4] = 0; XSendEvent (mScreen->dpy (), mScreen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } void ResizeLogic::finishResizing () { w->ungrabNotify (); resizeInformationAtom->deleteProperty (w->id ()); mScreen->freeWindowInterface (w); w = NULL; } void ResizeLogic::getPaintRectangle (BoxPtr pBox) { pBox->x1 = geometry.x - w->border ().left; pBox->y1 = geometry.y - w->border ().top; pBox->x2 = geometry.x + geometry.width + w->serverGeometry ().border () * 2 + w->border ().right; if (w->shaded ()) pBox->y2 = geometry.y + w->size ().height () + w->border ().bottom; else pBox->y2 = geometry.y + geometry.height + w->serverGeometry ().border () * 2 + w->border ().bottom; } void ResizeLogic::getStretchRectangle (BoxPtr pBox) { BoxRec box; float xScale, yScale; getPaintRectangle (&box); w->getResizeInterface ()->getStretchScale (&box, &xScale, &yScale); pBox->x1 = (int) (box.x1 - (w->output ().left - w->border ().left) * xScale); pBox->y1 = (int) (box.y1 - (w->output ().top - w->border ().top) * yScale); pBox->x2 = (int) (box.x2 + w->output ().right * xScale); pBox->y2 = (int) (box.y2 + w->output ().bottom * yScale); } Cursor ResizeLogic::cursorFromResizeMask (unsigned int mask) { unsigned int cursor_name; if (mask & ResizeLeftMask) { if (mask & ResizeDownMask) cursor_name = DOWN_LEFT_CURSOR; else if (mask & ResizeUpMask) cursor_name = UP_LEFT_CURSOR; else cursor_name = LEFT_CURSOR; } else if (mask & ResizeRightMask) { if (mask & ResizeDownMask) cursor_name = DOWN_RIGHT_CURSOR; else if (mask & ResizeUpMask) cursor_name = UP_RIGHT_CURSOR; else cursor_name = RIGHT_CURSOR; } else if (mask & ResizeUpMask) { cursor_name = UP_CURSOR; } else { cursor_name = DOWN_CURSOR; } return mScreen->cursorCache (cursor_name); } void ResizeLogic::snapWindowToWorkAreaBoundaries (int &wi, int &he, int &wX, int &wY, int &wWidth, int &wHeight) { int workAreaSnapDistance = 15; /* Check if resized edge(s) are near output work-area boundaries */ foreach (CompOutput &output, mScreen->outputDevs ()) { const CompRect &workArea = output.workArea (); /* if window and work-area intersect in x axis */ if (wX + wWidth > workArea.x () && wX < workArea.x2 ()) { if (mask & ResizeLeftMask) { int dw = workArea.x () - wX; if (0 < dw && dw < workAreaSnapDistance) { wi -= dw; wWidth -= dw; wX += dw; } } else if (mask & ResizeRightMask) { int dw = wX + wWidth - workArea.x2 (); if (0 < dw && dw < workAreaSnapDistance) { wi -= dw; wWidth -= dw; } } } /* if window and work-area intersect in y axis */ if (wY + wHeight > workArea.y () && wY < workArea.y2 ()) { if (mask & ResizeUpMask) { int dh = workArea.y () - wY; if (0 < dh && dh < workAreaSnapDistance) { he -= dh; wHeight -= dh; wY += dh; } } else if (mask & ResizeDownMask) { int dh = wY + wHeight - workArea.y2 (); if (0 < dh && dh < workAreaSnapDistance) { he -= dh; wHeight -= dh; } } } } } void ResizeLogic::setUpMask (int xRoot, int yRoot) { int xDist, yDist; int minPointerOffsetX, minPointerOffsetY; CompWindow::Geometry server = w->serverGeometry (); xDist = xRoot - (server.x () + (server.width () / 2)); yDist = yRoot - (server.y () + (server.height () / 2)); /* decision threshold is 10% of window size */ minPointerOffsetX = MIN (20, server.width () / 10); minPointerOffsetY = MIN (20, server.height () / 10); /* if we reached the threshold in one direction, make the threshold in the other direction smaller so there is a chance that this threshold also can be reached (by diagonal movement) */ if (abs (xDist) > minPointerOffsetX) minPointerOffsetY /= 2; else if (abs (yDist) > minPointerOffsetY) minPointerOffsetX /= 2; if (abs (xDist) > minPointerOffsetX) { if (xDist > 0) mask |= ResizeRightMask; else mask |= ResizeLeftMask; } if (abs (yDist) > minPointerOffsetY) { if (yDist > 0) mask |= ResizeDownMask; else mask |= ResizeUpMask; } /* if the pointer movement was enough to determine a direction, warp the pointer to the appropriate edge and set the right cursor */ if (mask) { Cursor cursor; CompAction *action; int pointerAdjustX = 0; int pointerAdjustY = 0; action = &options->optionGetInitiateKey (); action->setState (action->state () | CompAction::StateTermButton); if (mask & ResizeRightMask) pointerAdjustX = server.x () + server.width () + w->border ().right - xRoot; else if (mask & ResizeLeftMask) pointerAdjustX = server.x () - w->border ().left - xRoot; if (mask & ResizeDownMask) pointerAdjustY = server.y () + server.height () + w->border ().bottom - yRoot; else if (mask & ResizeUpMask) pointerAdjustY = server.y () - w->border ().top - yRoot; mScreen->warpPointer (pointerAdjustX, pointerAdjustY); cursor = cursorFromResizeMask (mask); mScreen->updateGrab (grabIndex, cursor); } } void ResizeLogic::accumulatePointerMotion (int xRoot, int yRoot) { /* only accumulate pointer movement if a mask is already set as we don't have a use for the difference information otherwise */ if (centered || options->optionGetResizeFromCenter ()) { pointerDx += (xRoot - lastPointerX) * 2; pointerDy += (yRoot - lastPointerY) * 2; } else { pointerDx += xRoot - lastPointerX; pointerDy += yRoot - lastPointerY; } /* If we hit the edge of the screen while resizing * the window and the adjacent window edge has not hit * the edge of the screen, then accumulate pointer motion * in the opposite direction. (So the apparant x / y * mixup here is intentional) */ if (isConstrained) { if (mask == ResizeLeftMask) { if (xRoot == 0 && geometry.x - w->border ().left > grabWindowWorkArea->left ()) pointerDx += abs (yRoot - lastPointerY) * -1; } else if (mask == ResizeRightMask) { if (xRoot == mScreen->width () -1 && geometry.x + geometry.width + w->border ().right < grabWindowWorkArea->right ()) pointerDx += abs (yRoot - lastPointerY); } if (mask == ResizeUpMask) { if (yRoot == 0 && geometry.y - w->border ().top > grabWindowWorkArea->top ()) pointerDy += abs (xRoot - lastPointerX) * -1; } else if (mask == ResizeDownMask) { if (yRoot == mScreen->height () -1 && geometry.y + geometry.height + w->border ().bottom < grabWindowWorkArea->bottom ()) pointerDx += abs (yRoot - lastPointerY); } } } void ResizeLogic::constrainToWorkArea (int &che, int &cwi) { if (mask & ResizeUpMask) { int decorTop = savedGeometry.y + savedGeometry.height - (che + w->border ().top); if (grabWindowWorkArea->y () > decorTop) che -= grabWindowWorkArea->y () - decorTop; } if (mask & ResizeDownMask) { int decorBottom = savedGeometry.y + che + w->border ().bottom; if (decorBottom > grabWindowWorkArea->y () + grabWindowWorkArea->height ()) che -= decorBottom - (grabWindowWorkArea->y () + grabWindowWorkArea->height ()); } if (mask & ResizeLeftMask) { int decorLeft = savedGeometry.x + savedGeometry.width - (cwi + w->border ().left); if (grabWindowWorkArea->x () > decorLeft) cwi -= grabWindowWorkArea->x () - decorLeft; } if (mask & ResizeRightMask) { int decorRight = savedGeometry.x + cwi + w->border ().right; if (decorRight > grabWindowWorkArea->x () + grabWindowWorkArea->width ()) cwi -= decorRight - (grabWindowWorkArea->x () + grabWindowWorkArea->width ()); } } void ResizeLogic::limitMovementToConstraintRegion (int &wi, int &he, int xRoot, int yRoot, int wX, int wY, int wWidth, int wHeight) { int minHeight = 50; /* rect. for a minimal height window + borders (used for the constraining in X axis) */ int minimalInputHeight = minHeight + w->border ().top + w->border ().bottom; /* small hot-spot square (on window's corner or edge) that is to be constrained to the combined output work-area region */ int x, y; int width = w->border ().top; /* square size = title bar height */ int height = width; bool status; /* whether or not hot-spot is in the region */ /* compute x & y for constrained hot-spot rect */ if (mask & ResizeLeftMask) x = wX; else if (mask & ResizeRightMask) x = wX + wWidth - width; else x = MIN (MAX (xRoot, wX), wX + wWidth - width); if (mask & ResizeUpMask) y = wY; else if (mask & ResizeDownMask) y = wY + wHeight - height; else y = MIN (MAX (yRoot, wY), wY + wHeight - height); status = constraintRegion.contains (x, y, width, height); /* only constrain movement if previous position was valid */ if (inRegionStatus) { bool xStatus = false; int yForXResize = y; int nx = x; int nw = wi; int nh = he; int minWidth = 50; if (mask & (ResizeLeftMask | ResizeRightMask)) { xStatus = status; if (mask & ResizeUpMask) yForXResize = wY + wHeight - minimalInputHeight; else if (mask & ResizeDownMask) yForXResize = wY + minimalInputHeight - height; else yForXResize = y; if (!constraintRegion.contains (x, yForXResize, width, height)) { if (lastGoodHotSpotY >= 0) yForXResize = lastGoodHotSpotY; else yForXResize = y; } } if (mask & ResizeLeftMask) { while ((nw > minWidth) && !xStatus) { xStatus = constraintRegion.contains (nx, yForXResize, width, height); if (!xStatus) { nw--; nx++; } } if (nw > minWidth) { x = nx; wi = nw; } } else if (mask & ResizeRightMask) { while ((nw > minWidth) && !xStatus) { xStatus = constraintRegion.contains (nx, yForXResize, width, height); if (!xStatus) { nw--; nx--; } } if (nw > minWidth) { x = nx; wi = nw; } } if (mask & ResizeUpMask) { while ((nh > minHeight) && !status) { status = constraintRegion.contains (x, y, width, height); if (!status) { nh--; y++; } } if (nh > minHeight) he = nh; } else if (mask & ResizeDownMask) { while ((nh > minHeight) && !status) { status = constraintRegion.contains (x, y, width, height); if (!status) { nh--; y--; } } if (nh > minHeight) he = nh; } if (((mask & (ResizeLeftMask | ResizeRightMask)) && xStatus) || ((mask & (ResizeUpMask | ResizeDownMask)) && status)) { /* hot-spot inside work-area region, store good values */ lastGoodHotSpotY = y; lastGoodSize = CompSize (wi, he); } else { /* failed to find a good hot-spot position, restore size */ wi = lastGoodSize.width (); he = lastGoodSize.height (); } } else { inRegionStatus = status; } } void ResizeLogic::computeWindowPlusBordersRect (int &wX, int &wY, int &wWidth, int &wHeight, int wi, int he) { wWidth = wi + w->border ().left + w->border ().right; wHeight = he + w->border ().top + w->border ().bottom; if (centered || options->optionGetResizeFromCenter ()) { if (mask & ResizeLeftMask) wX = geometry.x + geometry.width - (wi + w->border ().left); else wX = geometry.x - w->border ().left; if (mask & ResizeUpMask) wY = geometry.y + geometry.height - (he + w->border ().top); else wY = geometry.y - w->border ().top; } else { if (mask & ResizeLeftMask) wX = savedGeometry.x + savedGeometry.width - (wi + w->border ().left); else wX = savedGeometry.x - w->border ().left; if (mask & ResizeUpMask) wY = savedGeometry.y + savedGeometry.height - (he + w->border ().top); else wY = savedGeometry.y - w->border ().top; } } void ResizeLogic::enableOrDisableVerticalMaximization (int yRoot) { /* maximum distance between the pointer and a work area edge (top or bottom) for a vertical maximization */ const int max_edge_distance = 5; if (!options->optionGetMaximizeVertically()) return; if (!offWorkAreaConstrained) return; if (centered || options->optionGetResizeFromCenter ()) { if (maximized_vertically) { geometry = geometryWithoutVertMax; maximized_vertically = false; } } else if (mask & ResizeUpMask) { if (yRoot - grabWindowWorkArea->top() <= max_edge_distance && !maximized_vertically) { maximized_vertically = true; geometryWithoutVertMax = geometry; } else if (yRoot - grabWindowWorkArea->top() > max_edge_distance && maximized_vertically) { geometry = geometryWithoutVertMax; maximized_vertically = false; } } else if (mask & ResizeDownMask) { if (grabWindowWorkArea->bottom() - yRoot <= max_edge_distance && !maximized_vertically) { maximized_vertically = true; geometryWithoutVertMax = geometry; } else if (grabWindowWorkArea->bottom() - yRoot > max_edge_distance && maximized_vertically) { geometry = geometryWithoutVertMax; maximized_vertically = false; } } } void ResizeLogic::computeGeometry(int wi, int he) { XRectangle *regular_geometry; if (maximized_vertically) regular_geometry = &geometryWithoutVertMax; else regular_geometry = &geometry; if (centered || options->optionGetResizeFromCenter ()) { if ((mask & ResizeLeftMask) || (mask & ResizeRightMask)) regular_geometry->x -= ((wi - regular_geometry->width) / 2); if ((mask & ResizeUpMask) || (mask & ResizeDownMask)) regular_geometry->y -= ((he - regular_geometry->height) / 2); } else { if (mask & ResizeLeftMask) regular_geometry->x -= wi - regular_geometry->width; if (mask & ResizeUpMask) regular_geometry->y -= he - regular_geometry->height; } regular_geometry->width = wi; regular_geometry->height = he; if (maximized_vertically) { geometry.x = geometryWithoutVertMax.x; geometry.width = geometryWithoutVertMax.width; geometry.y = grabWindowWorkArea->y() + w->border().top; geometry.height = grabWindowWorkArea->height() - w->border().top - w->border().bottom; } } bool ResizeLogic::initiateResize (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int initMode) { CompWindowInterface *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = mScreen->findWindow (xid); if (w && (w->actions () & CompWindowActionResizeMask)) { int x, y; int button; CompWindow::Geometry server = w->serverGeometry (); x = CompOption::getIntOptionNamed (options, "x", pointerX); y = CompOption::getIntOptionNamed (options, "y", pointerY); button = CompOption::getIntOptionNamed (options, "button", -1); mask = CompOption::getIntOptionNamed (options, "direction"); /* Initiate the resize in the direction suggested by the * sector of the window the mouse is in, eg drag in top left * will resize up and to the left. Keyboard resize starts out * with the cursor in the middle of the window and then starts * resizing the edge corresponding to the next key press. */ if (state & CompAction::StateInitKey) { mask = 0; } else if (!mask) { int sectorSizeX = server.width () / 3; int sectorSizeY = server.height () / 3; int posX = x - server.x (); int posY = y - server.y (); if (posX < sectorSizeX) mask |= ResizeLeftMask; else if (posX > (2 * sectorSizeX)) mask |= ResizeRightMask; if (posY < sectorSizeY) mask |= ResizeUpMask; else if (posY > (2 * sectorSizeY)) mask |= ResizeDownMask; /* if the pointer was in the middle of the window, just prevent input to the window */ if (!mask) { mScreen->freeWindowInterface (w); return true; } } if (mScreen->otherGrabExist ("resize", NULL) || this->w || (w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask | CompWindowTypeFullscreenMask)) || w->overrideRedirect ()) { mScreen->freeWindowInterface (w); return false; } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (w->shaded ()) mask &= ~(ResizeUpMask | ResizeDownMask); this->w = w; savedGeometry.x = server.x (); savedGeometry.y = server.y (); savedGeometry.width = server.width (); savedGeometry.height = server.height (); geometry = savedGeometry; pointerDx = x - pointerX; pointerDy = y - pointerY; centered |= w->evaluate (this->options->optionGetResizeFromCenterMatch ()); if ((w->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) { /* if the window is fully maximized, showing the outline or rectangle would be visually distracting as the window can't be resized anyway; so we better don't use them in this case */ mode = ResizeOptions::ModeNormal; } else if (!gScreen || !cScreen || !cScreen->compositingActive ()) { mode = ResizeOptions::ModeNormal; } else { mode = initMode; } if (mode != ResizeOptions::ModeNormal) { if (w->getGLInterface () && mode == ResizeOptions::ModeStretch) w->getGLInterface ()->glPaintSetEnabled (true); if (w->getCompositeInterface () && mode == ResizeOptions::ModeStretch) w->getCompositeInterface ()->damageRectSetEnabled (true); gScreen->glPaintOutputSetEnabled (true); } if (!grabIndex) { Cursor cursor; if (state & CompAction::StateInitKey) cursor = mScreen->cursorCache (MIDDLE_CURSOR); else cursor = cursorFromResizeMask (mask); if (state & CompAction::StateInitButton) { grabIndex = mScreen->pushPointerGrab (cursor, "resize"); } else { grabIndex = mScreen->pushGrab (cursor, "resize"); } } if (grabIndex) { BoxRec box; unsigned int grabMask = CompWindowGrabResizeMask | CompWindowGrabButtonMask; bool sourceExternalApp = CompOption::getBoolOptionNamed (options, "external", false); if (sourceExternalApp) grabMask |= CompWindowGrabExternalAppMask; releaseButton = button; w->grabNotify (x, y, state, grabMask); /* Click raise happens implicitly on buttons 1, 2 and 3 so don't * restack this window again if the action buttonbinding was from * one of those buttons */ if (mScreen->getOption ("raise_on_click")->value ().b () && button != Button1 && button != Button2 && button != Button3) w->updateAttributes (CompStackingUpdateModeAboveFullscreen); /* using the paint rectangle is enough here as we don't have any stretch yet */ getPaintRectangle (&box); damageRectangle (&box); if (state & CompAction::StateInitKey) { int xRoot, yRoot; xRoot = server.x () + (server.width () / 2); yRoot = server.y () + (server.height () / 2); mScreen->warpPointer (xRoot - pointerX, yRoot - pointerY); } isConstrained = sourceExternalApp; /* Update offWorkAreaConstrained and workArea at grab time */ offWorkAreaConstrained = false; if (sourceExternalApp) { int output = w->outputDevice (); bool sl = mScreen->outputDevs ().at (output).workArea ().left () > w->serverGeometry ().left (); bool sr = mScreen->outputDevs ().at (output).workArea ().right () < w->serverGeometry ().right (); bool st = mScreen->outputDevs ().at (output).workArea ().top () > w->serverGeometry ().top (); bool sb = mScreen->outputDevs ().at (output).workArea ().bottom () < w->serverGeometry ().bottom (); /* Prevent resizing beyond work area edges when resize is initiated externally (e.g. with window frame or menu) and not with a key (e.g. alt+button) */ offWorkAreaConstrained = true; int lco = getOutputForEdge (output, TOUCH_RIGHT, sl); int rco = getOutputForEdge (output, TOUCH_LEFT, sr); int tco = getOutputForEdge (output, TOUCH_BOTTOM, st); int bco = getOutputForEdge (output, TOUCH_TOP, sb); /* Now we need to form one big rect which describes * the available workarea */ int left = mScreen->outputDevs ().at (lco).workArea ().left (); int right = mScreen->outputDevs ().at (rco).workArea ().right (); int top = mScreen->outputDevs ().at (tco).workArea ().top (); int bottom = mScreen->outputDevs ().at (bco).workArea ().bottom (); grabWindowWorkArea.reset (new CompRect (0, 0, 0, 0)); { grabWindowWorkArea->setLeft (left); grabWindowWorkArea->setRight (right); grabWindowWorkArea->setTop (top); grabWindowWorkArea->setBottom (bottom); } inRegionStatus = false; lastGoodHotSpotY = -1; lastGoodSize = w->serverSize (); /* Combine the work areas of all outputs */ constraintRegion = CompRegion::empty (); foreach (CompOutput &output, mScreen->outputDevs ()) constraintRegion += output.workArea (); } } maximized_vertically = false; } else if (w) mScreen->freeWindowInterface (w); return false; } bool ResizeLogic::terminateResize (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (w) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int mask = 0; if (mode == ResizeOptions::ModeNormal) { if (state & CompAction::StateCancel) { xwc.x = savedGeometry.x; xwc.y = savedGeometry.y; xwc.width = savedGeometry.width; xwc.height = savedGeometry.height; mask = CWX | CWY | CWWidth | CWHeight; } else if (maximized_vertically) { w->maximize (CompWindowStateMaximizedVertMask); xwc.x = geometry.x; xwc.y = geometry.y; xwc.width = geometry.width; xwc.height = geometry.height; mask = CWX | CWY | CWWidth | CWHeight; /* Once vertically maximized, save the original window y & height * geometry, so restoring the window will result in the correct size */ w->saveWc ().y = savedGeometry.y; w->saveWc ().height = savedGeometry.height + (w->border ().top + w->border ().bottom); w->saveMask () = CWY | CWHeight; } } else { XRectangle finalGeometry; if (state & CompAction::StateCancel) finalGeometry = savedGeometry; else finalGeometry = geometry; if (memcmp (&finalGeometry, &savedGeometry, sizeof (finalGeometry)) == 0) { BoxRec box; if (mode == ResizeOptions::ModeStretch) getStretchRectangle (&box); else getPaintRectangle (&box); damageRectangle (&box); } else { if (maximized_vertically) { w->maximize(CompWindowStateMaximizedVertMask); xwc.x = finalGeometry.x; xwc.width = finalGeometry.width; mask = CWX | CWWidth ; } else { xwc.x = finalGeometry.x; xwc.y = finalGeometry.y; xwc.width = finalGeometry.width; xwc.height = finalGeometry.height; mask = CWX | CWY | CWWidth | CWHeight; } } if (mode != ResizeOptions::ModeNormal) { if (w->getGLInterface () && mode == ResizeOptions::ModeStretch) w->getGLInterface ()->glPaintSetEnabled (false); if (w->getCompositeInterface () && mode == ResizeOptions::ModeStretch) w->getCompositeInterface ()->damageRectSetEnabled (false); gScreen->glPaintOutputSetEnabled (false); } } if ((mask & CWWidth) && xwc.width == (int) w->serverGeometry ().width ()) mask &= ~CWWidth; if ((mask & CWHeight) && xwc.height == (int) w->serverGeometry ().height ()) mask &= ~CWHeight; if (mask) { if (mask & (CWWidth | CWHeight)) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); } finishResizing (); if (grabIndex) { mScreen->removeGrab (grabIndex, NULL); grabIndex = 0; } releaseButton = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } bool ResizeLogic::initiateResizeDefaultMode (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindowInterface *w; unsigned int mode; w = mScreen->findWindow (CompOption::getIntOptionNamed (options, "window")); if (!w) return false; mode = this->options->optionGetMode (); if (w->evaluate (this->options->optionGetNormalMatch ())) mode = ResizeOptions::ModeNormal; if (w->evaluate (this->options->optionGetOutlineMatch ())) mode = ResizeOptions::ModeOutline; if (w->evaluate (this->options->optionGetRectangleMatch ())) mode = ResizeOptions::ModeRectangle; if (w->evaluate (this->options->optionGetStretchMatch ())) mode = ResizeOptions::ModeStretch; mScreen->freeWindowInterface (w); return initiateResize (action, state, options, mode); } void ResizeLogic::damageRectangle (BoxPtr pBox) { int x1, x2, y1, y2; x1 = pBox->x1 - 1; y1 = pBox->y1 - 1; x2 = pBox->x2 + 1; y2 = pBox->y2 + 1; if (cScreen) cScreen->damageRegion (CompRect (x1, y1, x2 - x1, y2 - y1)); } /* Be a little bit intelligent about how we calculate * the workarea. Basically we want to be enclosed in * any area that is obstructed by panels, but not * where two outputs meet * * Also, it does not make sense to resize over * non-touching outputs, so detect that case too * */ int ResizeLogic::getOutputForEdge (int windowOutput, unsigned int touch, bool skipFirst) { int op, wap; int ret = windowOutput; getPointForTp (touch, windowOutput, op, wap); if ((op == wap) || skipFirst) { int co = windowOutput; do { int oco = co; co = findTouchingOutput (op, touch); /* Could not find a leftmost output from here * so we must have hit the edge of the universe */ if (co == -1) { ret = oco; co = -1; break; } getPointForTp (touch, co, op, wap); /* There is something in the way here.... */ if (op != wap) { ret = co; co = -1; } } while (co != -1); } return ret; } unsigned int ResizeLogic::findTouchingOutput (int touchPoint, unsigned int side) { for (unsigned int i = 0; i < mScreen->outputDevs ().size (); i++) { CompOutput &o = mScreen->outputDevs ().at (i); if (side == TOUCH_LEFT) { if (o.left () == touchPoint) return i; } if (side == TOUCH_RIGHT) { if (o.right () == touchPoint) return i; } if (side == TOUCH_TOP) { if (o.top () == touchPoint) return i; } if (side == TOUCH_BOTTOM) { if (o.bottom () == touchPoint) return i; } } return -1; } void ResizeLogic::getPointForTp (unsigned int tp, unsigned int output, int &op, int &wap) { CompRect og = CompRect (mScreen->outputDevs ().at (output)); CompRect wag = mScreen->outputDevs ().at (output).workArea (); switch (tp) { case TOUCH_LEFT: op = og.right (); wap = wag.right (); break; case TOUCH_RIGHT: op = og.left (); wap = wag.left (); break; case TOUCH_TOP: op = og.bottom (); wap = wag.bottom (); break; case TOUCH_BOTTOM: op = og.top (); wap = wag.top (); break; default: return; } } ./plugins/resize/src/logic/tests/0000755000004100000410000000000013246301624017254 5ustar www-datawww-data./plugins/resize/src/logic/tests/mock-window.h0000644000004100000410000000652613246301623021673 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_MOCK_WINDOW_H #define RESIZE_MOCK_WINDOW_H #include #include "window-interface.h" #include "gl-window-interface.h" #include "composite-window-interface.h" namespace resize { class MockWindow : public CompWindowInterface, public GLWindowInterface, public CompositeWindowInterface { public: MOCK_METHOD0(id, Window()); MOCK_CONST_METHOD0(outputRect, CompRect()); MOCK_METHOD0(syncAlarm, XSyncAlarm()); MOCK_CONST_METHOD0(sizeHints, XSizeHints&()); MOCK_CONST_METHOD0(serverGeometry, CompWindow::Geometry &()); MOCK_CONST_METHOD0(border, CompWindowExtents&()); MOCK_CONST_METHOD0(output, CompWindowExtents&()); MOCK_METHOD4(constrainNewWindowSize, bool (int width, int height, int *newWidth, int *newHeight)); MOCK_METHOD0(syncWait, bool()); MOCK_METHOD0(sendSyncRequest, void()); MOCK_METHOD2(configureXWindow, void(unsigned int valueMask, XWindowChanges *xwc)); MOCK_METHOD4(grabNotify, void (int x, int y, unsigned int state, unsigned int mask)); MOCK_METHOD0(ungrabNotify, void()); MOCK_METHOD0(shaded, bool()); MOCK_CONST_METHOD0(size, CompSize()); MOCK_METHOD0(actions, unsigned int()); MOCK_METHOD0(type, unsigned int()); MOCK_METHOD0(state, unsigned int &()); MOCK_METHOD0(overrideRedirect, bool()); MOCK_METHOD1(updateAttributes, void(CompStackingUpdateMode stackingMode)); MOCK_METHOD0(outputDevice, int()); MOCK_CONST_METHOD0(serverSize, const CompSize()); MOCK_METHOD1(maximize, void(unsigned int state)); MOCK_METHOD0(saveWc, XWindowChanges &()); MOCK_METHOD0(saveMask, int &()); MOCK_METHOD1(evaluate, bool(CompMatch &match)); MOCK_METHOD0(getResizeInterface, ResizeWindowInterface*()); MOCK_METHOD0(getGLInterface, GLWindowInterface*()); MOCK_METHOD0(getCompositeInterface, CompositeWindowInterface*()); /* from GLWindowInterface */ MOCK_METHOD1(glPaintSetEnabled, void(bool enable)); /* from CompositeWindowInterface */ MOCK_METHOD1(damageRectSetEnabled, void(bool enable)); }; } /* namespace resize */ #endif /* RESIZE_MOCK_WINDOW_H */ ./plugins/resize/src/logic/tests/resize-options-mock.cpp0000644000004100000410000000321513246301623023701 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #include "resize_options.h" ResizeOptions::ResizeOptions (bool init /* = true */) : mOptions (ResizeOptions::OptionNum), mNotify (ResizeOptions::OptionNum) { mOptions[ResizeOptions::MaximizeVertically].value ().set (true); } ResizeOptions::~ResizeOptions () { } CompOption::Vector & ResizeOptions::getOptions () { return mOptions; } bool ResizeOptions::setOption (const CompString &name, CompOption::Value &value) { return true; } ./plugins/resize/src/logic/tests/CMakeLists.txt0000644000004100000410000000067013246301623022016 0ustar www-datawww-dataadd_executable (compiz_test_resize_logic test-logic.cpp resize-options-mock.cpp x11-mocks.cpp) target_link_libraries (compiz_test_resize_logic resize_logic compiz_core ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_resize_logic COVERAGE resize_logic) ./plugins/resize/src/logic/tests/mock-screen.h0000644000004100000410000000544513246301623021642 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_MOCK_SCREEN_H #define RESIZE_MOCK_SCREEN_H #include #include "screen-interface.h" #include "gl-screen-interface.h" #include "composite-screen-interface.h" namespace resize { class MockScreen : public CompScreenInterface, public GLScreenInterface, public CompositeScreenInterface { public: MOCK_METHOD0(root, Window()); MOCK_METHOD1(findWindow, CompWindowInterface*(Window id)); MOCK_METHOD0(xkbEvent, int()); MOCK_METHOD1(handleEvent, void(XEvent *event)); MOCK_METHOD0(syncEvent, int()); MOCK_METHOD0(dpy, Display*()); MOCK_METHOD2(warpPointer, void(int dx, int dy)); MOCK_METHOD0(outputDevs, CompOutput::vector&()); MOCK_METHOD2(otherGrabExist, bool(const char *, void *)); MOCK_METHOD2(updateGrab, void(CompScreen::GrabHandle handle, Cursor cursor)); MOCK_METHOD2(pushGrab, CompScreen::GrabHandle(Cursor cursor, const char *name)); MOCK_METHOD2(pushPointerGrab, CompScreen::GrabHandle(Cursor cursor, const char *name)); MOCK_METHOD1(pushKeyboardGrab, CompScreen::GrabHandle(const char *name)); MOCK_METHOD2(removeGrab, void(CompScreen::GrabHandle handle, CompPoint *restorePointer)); MOCK_METHOD1(cursorCache, Cursor (unsigned int)); MOCK_METHOD1(getOption, CompOption*(const CompString &name)); MOCK_CONST_METHOD0(width, int()); MOCK_CONST_METHOD0(height, int()); /* from GLSCreenInterface */ MOCK_METHOD1(glPaintOutputSetEnabled, void(bool enable)); /* from CompositeScreenInterface */ MOCK_METHOD0(compositingActive, bool()); MOCK_METHOD1(damageRegion, void(const CompRegion &r)); }; } /* namespace resize */ #endif /* RESIZE_MOCK_SCREEN_H */ ./plugins/resize/src/logic/tests/fake-property-writer.h0000644000004100000410000000367613246301623023542 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_FAKE_PROPERTY_WRITER_H #define RESIZE_FAKE_PROPERTY_WRITER_H #include "property-writer-interface.h" namespace resize { class FakePropertyWriter : public PropertyWriterInterface { public: virtual bool updateProperty (Window, CompOption::Vector &, int) { return true; } virtual void deleteProperty (Window) { } virtual const CompOption::Vector & readProperty (Window) { return mPropertyValues; } virtual void setReadTemplate (const CompOption::Vector &v) { mPropertyValues = v; } virtual const CompOption::Vector & getReadTemplate () { return mPropertyValues; } CompOption::Vector mPropertyValues; }; } /* namespace resize */ #endif /* RESIZE_FAKE_PROPERTY_WRITER_H */ ./plugins/resize/src/logic/tests/x11-mocks.cpp0000644000004100000410000000264213246301623021506 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #include #include Status XSendEvent(Display* /* display */, Window /* w */, Bool /* propagate */, long /* event_mask */, XEvent* /* event_send */) { return Success; } ./plugins/resize/src/logic/tests/test-logic.cpp0000644000004100000410000002513113246301623022033 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #include #include "mock-screen.h" #include "mock-window.h" #include "fake-property-writer.h" #include #include "resize-logic.h" #include "resize_options.h" using namespace resize; using ::testing::AnyNumber; using ::testing::Return; using ::testing::ReturnPointee; using ::testing::ReturnRef; using ::testing::SaveArg; using ::testing::StrEq; using ::testing::_; class ResizeLogicTest : public ::testing::Test { public: virtual void SetUp () { SetUpMockWindow (); SetUpMockScreenExpectations (); SetUpFakePropertyWriter (); InjectMocksAndFakesIntoTestSubject (); } void SetUpMockWindow () { EXPECT_CALL (mockWindow, id ()) .WillRepeatedly (Return (123)); EXPECT_CALL (mockWindow, actions ()) .WillRepeatedly (Return (CompWindowActionResizeMask)); mockWindowServerGeometry.set (100 /* x */, 100 /* y */, 100 /* w */, 100 /* h */, 2 /* border */); EXPECT_CALL (mockWindow, serverGeometry ()) .WillRepeatedly (ReturnRef (mockWindowServerGeometry)); EXPECT_CALL (mockWindow, serverSize ()) .WillRepeatedly (Invoke (this, &ResizeLogicTest::GetMockWindowServerSize)); EXPECT_CALL (mockWindow, outputDevice ()) .WillRepeatedly (Return (0)); EXPECT_CALL (mockWindow, evaluate (_)) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, type ()) .WillRepeatedly (Return (0)); EXPECT_CALL (mockWindow, overrideRedirect ()) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, shaded ()) .WillRepeatedly (Return (false)); mockWindowState = 0; EXPECT_CALL (mockWindow, state ()) .WillRepeatedly (ReturnPointee (&mockWindowState)); mockWindowBorder.left = 1; mockWindowBorder.right = 2; mockWindowBorder.top = 3; mockWindowBorder.bottom = 4; EXPECT_CALL (mockWindow, border ()) .WillRepeatedly (ReturnRef (mockWindowBorder)); mockSaveWc.x = 1; mockSaveWc.y = 2; mockSaveWc.width = 3; mockSaveWc.height = 4; EXPECT_CALL (mockWindow, saveWc ()) .WillRepeatedly (ReturnRef (mockSaveWc)); mockSaveMask = 1; EXPECT_CALL (mockWindow, saveMask ()) .WillRepeatedly (ReturnRef (mockSaveMask)); EXPECT_CALL (mockWindow, grabNotify (_,_,_,_)) .Times(AnyNumber()); EXPECT_CALL (mockWindow, ungrabNotify ()) .Times(AnyNumber()); EXPECT_CALL (mockWindow, sendSyncRequest ()) .Times(AnyNumber()); EXPECT_CALL (mockWindow, syncWait ()) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, constrainNewWindowSize (_,_,_,_)) .WillRepeatedly (Return (false)); EXPECT_CALL (mockWindow, configureXWindow (_,_)) .Times(AnyNumber()); EXPECT_CALL (mockWindow, getGLInterface ()) .WillRepeatedly (Return (&mockWindow)); EXPECT_CALL (mockWindow, getCompositeInterface ()) .WillRepeatedly (Return (&mockWindow)); EXPECT_CALL (mockWindow, glPaintSetEnabled(_)) .Times(AnyNumber()); EXPECT_CALL (mockWindow, damageRectSetEnabled(_)) .Times(AnyNumber()); } void SetUpMockScreenExpectations () { optionRaiseOnClick.setName ("raise_on_click", CompOption::TypeBool); optionRaiseOnClick.value ().set ((bool) false); EXPECT_CALL (mockScreen, getOption (StrEq ("raise_on_click"))) .WillRepeatedly (Return (&optionRaiseOnClick)); outputDevices.push_back (CompOutput ()); outputDevices[0].setGeometry(0, 0, 1280, 1024); EXPECT_CALL (mockScreen, outputDevs ()) .WillRepeatedly (ReturnRef (outputDevices)); EXPECT_CALL (mockScreen, findWindow (123)) .WillRepeatedly (Return (&mockWindow)); EXPECT_CALL (mockScreen, compositingActive ()) .WillRepeatedly (Return (true)); EXPECT_CALL (mockScreen, syncEvent ()) .WillRepeatedly (Return (-XSyncAlarmNotify)); EXPECT_CALL (mockScreen, handleEvent (_)); EXPECT_CALL (mockScreen, dpy ()) .WillRepeatedly (Return ((Display*)NULL)); EXPECT_CALL (mockScreen, xkbEvent ()) .WillRepeatedly (Return (0)); EXPECT_CALL (mockScreen, glPaintOutputSetEnabled (_)) .Times(AnyNumber()); EXPECT_CALL (mockScreen, cursorCache(_)) .WillRepeatedly (Return (0)); } void SetUpFakePropertyWriter () { fakePropWriter.mPropertyValues.resize(4); for (int i = 0; i < 4; i++) { char buf[4]; snprintf (buf, 4, "%i", i); CompString tmpName (buf); fakePropWriter.mPropertyValues.at (i).setName (tmpName, CompOption::TypeInt); } } void InjectMocksAndFakesIntoTestSubject () { logic.resizeInformationAtom = &fakePropWriter; logic.mScreen = &mockScreen; logic.cScreen = NULL; // avoid entering CompositeScreen during tests logic.gScreen = &mockScreen; logic.options = &resizeOptions; } CompSize GetMockWindowServerSize () { CompSize size (mockWindowServerGeometry.width(), mockWindowServerGeometry.height()); return size; } ResizeLogic logic; MockWindow mockWindow; MockScreen mockScreen; FakePropertyWriter fakePropWriter; ResizeOptions resizeOptions; CompOption optionRaiseOnClick; CompOutput::vector outputDevices; CompWindow::Geometry mockWindowServerGeometry; unsigned int mockWindowState; CompWindowExtents mockWindowBorder; XWindowChanges mockSaveWc; int mockSaveMask; }; TEST_F (ResizeLogicTest, MaximizeVerticallyWhenResizedTopEdgeScreen) { CompAction action; CompAction::State state = 0; CompOption::Vector options; options.push_back (CompOption ("window", CompOption::TypeInt)); options[0].value ().set ((int) 123); options.push_back (CompOption ("external", CompOption::TypeBool)); options[1].value ().set (true); EXPECT_CALL (mockScreen, otherGrabExist (StrEq ("resize"), _)) .WillOnce (Return (false)); EXPECT_CALL (mockScreen, pushGrab (_, StrEq ("resize"))) .WillOnce (Return ((CompScreen::GrabHandle)1)); /* hit the middle of the top edge of the window */ pointerX = mockWindowServerGeometry.centerX (); pointerY = mockWindowServerGeometry.top(); logic.initiateResizeDefaultMode(&action, state, options); /* move the pointer to the top of the screen */ pointerY = 1; XEvent event; event.type = MotionNotify; event.xmotion.root = 345; EXPECT_CALL (mockScreen, root ()) .WillRepeatedly (Return (event.xmotion.root)); logic.handleEvent(&event); EXPECT_CALL (mockScreen, removeGrab (_, _)); EXPECT_CALL (mockWindow, maximize (CompWindowStateMaximizedVertMask)) .Times(1) .WillRepeatedly(SaveArg<0>(&mockWindowState)); logic.terminateResize(&action, state, options); } TEST_F (ResizeLogicTest, DontMaximizeVerticallyIfFarFromTopEdge) { CompAction action; CompAction::State state = 0; CompOption::Vector options; options.push_back (CompOption ("window", CompOption::TypeInt)); options[0].value ().set ((int) 123); options.push_back (CompOption ("external", CompOption::TypeBool)); options[1].value ().set (true); EXPECT_CALL (mockScreen, otherGrabExist (StrEq ("resize"), _)) .WillOnce (Return (false)); EXPECT_CALL (mockScreen, pushGrab (_, StrEq ("resize"))) .WillOnce (Return ((CompScreen::GrabHandle)1)); /* hit the middle of the top edge of the window */ pointerX = mockWindowServerGeometry.centerX (); pointerY = mockWindowServerGeometry.top(); logic.initiateResizeDefaultMode(&action, state, options); /* move the pointer just a bit upwards. Still far away from the top edge of * the screen */ pointerY -= 10; XEvent event; event.type = MotionNotify; event.xmotion.root = 345; EXPECT_CALL (mockScreen, root ()) .WillRepeatedly (Return (event.xmotion.root)); logic.handleEvent(&event); EXPECT_CALL (mockScreen, removeGrab (_, _)); EXPECT_CALL (mockWindow, maximize (_)) .Times(0); logic.terminateResize(&action, state, options); } /* Simulate a resize that is initiated by the "resize" compiz plugin himself * instead of externally. E.g.: user presses Alt + middle mouse button (the * default button assignment for resizing) * * Regression test for bug lp1045191 * https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/1045191 * This bug would cause a crash in this situation. */ TEST_F (ResizeLogicTest, DontCrashIfSourceNotExternalApp) { CompAction action; CompAction::State state = 0; CompOption::Vector options; options.push_back (CompOption ("window", CompOption::TypeInt)); options[0].value ().set ((int) 123); options.push_back (CompOption ("external", CompOption::TypeBool)); options[1].value ().set (false); /* source is not an external app */ EXPECT_CALL (mockScreen, otherGrabExist (StrEq ("resize"), _)) .WillOnce (Return (false)); EXPECT_CALL (mockScreen, pushGrab (_, StrEq ("resize"))) .WillOnce (Return ((CompScreen::GrabHandle)1)); /* hit a point near but not directly over the top window edge. * You don't have to hit the window border if the resize is * initiated by the initiate_button compiz action */ pointerX = mockWindowServerGeometry.centerX (); pointerY = mockWindowServerGeometry.top() + (mockWindowServerGeometry.height() / 4); logic.initiateResizeDefaultMode(&action, state, options); /* move the pointer to the top of the screen */ pointerY = 1; XEvent event; event.type = MotionNotify; event.xmotion.root = 345; EXPECT_CALL (mockScreen, root ()) .WillRepeatedly (Return (event.xmotion.root)); logic.handleEvent(&event); EXPECT_CALL (mockScreen, removeGrab (_, _)); logic.terminateResize(&action, state, options); } ./plugins/resize/src/composite-screen-impl.h0000644000004100000410000000372513246301623021412 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_SCREEN_IMPL_H #define RESIZE_COMPOSITE_SCREEN_IMPL_H #include "composite-screen-interface.h" #include namespace resize { class CompositeScreenImpl : public CompositeScreenInterface { public: CompositeScreenImpl (CompositeScreen *impl) : mImpl (impl) { } virtual ~CompositeScreenImpl() {} virtual bool compositingActive () { return mImpl->compositingActive (); } virtual void damageRegion (const CompRegion &r) { mImpl->damageRegion (r); } static CompositeScreenImpl *wrap (CompositeScreen *impl) { if (impl) return new CompositeScreenImpl (impl); else return NULL; } private: CompositeScreen *mImpl; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_SCREEN_IMPL_H */ ./plugins/resize/src/gl-screen-impl.h0000644000004100000410000000351513246301623020007 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_GL_SCREEN_IMPL #define RESIZE_GL_SCREEN_IMPL #include "gl-screen-interface.h" #include namespace resize { class GLScreenImpl : public GLScreenInterface { public: GLScreenImpl (GLScreen *impl) : mImpl (impl) { } virtual ~GLScreenImpl() {} virtual void glPaintOutputSetEnabled (bool enable) { mImpl->glPaintOutputSetEnabled(ResizeScreen::get(screen), enable); } static GLScreenImpl *wrap (GLScreen *impl) { if (impl) return new GLScreenImpl (impl); else return NULL; } private: GLScreen *mImpl; }; } /* namespace resize */ #endif /* RESIZE_GL_SCREEN_INTERFACE */ ./plugins/resize/src/resize-window-impl.h0000644000004100000410000000357513246301623020744 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_RESIZE_WINDOW_IMPL_H #define RESIZE_RESIZE_WINDOW_IMPL_H #include "resize-window-interface.h" namespace resize { class ResizeWindowImpl : public ResizeWindowInterface { public: ResizeWindowImpl (ResizeWindow *impl) : mImpl (impl) { } ResizeWindow *impl() { return mImpl; } static ResizeWindowImpl *wrap (ResizeWindow *impl) { if (impl) return new ResizeWindowImpl (impl); else return NULL; } virtual void getStretchScale (BoxPtr pBox, float *xScale, float *yScale) { return mImpl->getStretchScale(pBox, xScale, yScale); } private: ResizeWindow *mImpl; }; } /* namespace resize */ #endif /* RESIZE_RESIZE_WINDOW_IMPL_H */ ./plugins/resize/src/window-impl.h0000644000004100000410000001163413246301623017440 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_WINDOW_IMPL_H #define RESIZE_WINDOW_IMPL_H #include #include "window-interface.h" #include "resize-window-impl.h" #include "gl-window-impl.h" #include "composite-window-impl.h" namespace resize { class CompWindowImpl : public CompWindowInterface { public: CompWindowImpl (CompWindow *impl) : mImpl (impl) { mResizeImpl = ResizeWindowImpl::wrap(ResizeWindow::get (impl)); mGLImpl = GLWindowImpl::wrap(GLWindow::get (impl)); if (mGLImpl) mGLImpl->resizeWindow = ResizeWindow::get (impl); mCompositeImpl = CompositeWindowImpl::wrap(CompositeWindow::get (impl)); if (mCompositeImpl) mCompositeImpl->resizeWindow = ResizeWindow::get (impl); } virtual ~CompWindowImpl () { delete mResizeImpl; delete mGLImpl; delete mCompositeImpl; } CompWindow *impl() { return mImpl; } static CompWindowImpl *wrap (CompWindow *impl) { if (impl) return new CompWindowImpl (impl); else return NULL; } static void unwrap (CompWindowInterface *i) { delete i; } virtual Window id () { return mImpl->id (); } virtual CompRect outputRect () const { return mImpl->outputRect (); } virtual XSyncAlarm syncAlarm () { return mImpl->syncAlarm (); } virtual XSizeHints & sizeHints () const { return mImpl->sizeHints (); } virtual const CompWindow::Geometry & serverGeometry () const { return mImpl->serverGeometry (); } virtual const CompWindowExtents & border () const { return mImpl->border (); } virtual const CompWindowExtents & output () const { return mImpl->output (); } virtual bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight) { return mImpl->constrainNewWindowSize (width, height, newWidth, newHeight); } virtual bool syncWait () { return mImpl->syncWait (); } virtual void sendSyncRequest () { mImpl->sendSyncRequest (); } virtual void configureXWindow (unsigned int valueMask, XWindowChanges *xwc) { mImpl->configureXWindow (valueMask, xwc); } virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask) { mImpl->grabNotify (x, y, state, mask); } virtual void ungrabNotify () { mImpl->ungrabNotify (); } virtual bool shaded () { return mImpl->shaded (); } virtual CompSize size () const { return mImpl->size (); } virtual unsigned int actions () { return mImpl->actions (); } virtual unsigned int type () { return mImpl->type (); } virtual unsigned int & state () { return mImpl->state (); } virtual bool overrideRedirect () { return mImpl->overrideRedirect (); } virtual void updateAttributes (CompStackingUpdateMode stackingMode) { mImpl->updateAttributes (stackingMode); } virtual int outputDevice () { return mImpl->outputDevice (); } virtual const CompSize serverSize () const { return mImpl->serverSize (); } virtual void maximize (unsigned int state = 0) { mImpl->maximize (state); } virtual XWindowChanges & saveWc () { return mImpl->saveWc (); } virtual int & saveMask () { return mImpl->saveMask (); } virtual bool evaluate (CompMatch &match) { return match.evaluate (mImpl); } virtual ResizeWindowInterface *getResizeInterface () { return mResizeImpl; } virtual GLWindowInterface *getGLInterface () { return mGLImpl; } virtual CompositeWindowInterface *getCompositeInterface () { return mCompositeImpl; } private: CompWindow *mImpl; ResizeWindowImpl *mResizeImpl; GLWindowImpl *mGLImpl; CompositeWindowImpl *mCompositeImpl; }; } /* namespace resize */ #endif /* RESIZE_WINDOW_IMPL_H */ ./plugins/resize/src/composite-window-impl.h0000644000004100000410000000356513246301623021444 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_COMPOSITE_WINDOW_IMPL_H #define RESIZE_COMPOSITE_WINDOW_IMPL_H #include "composite-window-interface.h" namespace resize { class CompositeWindowImpl : public CompositeWindowInterface { public: CompositeWindowImpl (CompositeWindow *impl) : mImpl (impl) { } static CompositeWindowImpl *wrap (CompositeWindow *impl) { if (impl) return new CompositeWindowImpl (impl); else return NULL; } virtual void damageRectSetEnabled (bool enable) { mImpl->damageRectSetEnabled (resizeWindow, enable); } ResizeWindow *resizeWindow; private: CompositeWindow *mImpl; }; } /* namespace resize */ #endif /* RESIZE_COMPOSITE_WINDOW_IMPL_H */ ./plugins/resize/src/resize.cpp0000644000004100000410000003741413246301623017032 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include "resize.h" #include "window-impl.h" #include "property-writer-impl.h" #include "resize-window-impl.h" #include "screen-impl.h" #include "gl-screen-impl.h" #include "composite-screen-impl.h" COMPIZ_PLUGIN_20090315 (resize, ResizePluginVTable) void ResizeScreen::handleEvent (XEvent *event) { logic.handleEvent(event); } void ResizeWindow::getStretchScale (BoxPtr pBox, float *xScale, float *yScale) { CompRect rect (window->borderRect ()); *xScale = (rect.width ()) ? (pBox->x2 - pBox->x1) / (float) rect.width () : 1.0f; *yScale = (rect.height ()) ? (pBox->y2 - pBox->y1) / (float) rect.height () : 1.0f; } static bool resizeInitiateDefaultMode (CompAction *action, CompAction::State state, CompOption::Vector &options) { RESIZE_SCREEN (screen); return rs->logic.initiateResizeDefaultMode(action, state, options); } static bool resizeTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { RESIZE_SCREEN (screen); return rs->logic.terminateResize(action, state, options); } void ResizeScreen::glPaintRectangle (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, unsigned short *borderColor, unsigned short *fillColor) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); const unsigned short MaxUShort = std::numeric_limits ::max (); const float MaxUShortFloat = MaxUShort; bool usingAverageColors = false; BoxRec box; CompRegion damageRegion; GLMatrix sTransform (transform); GLfloat vertexData [12]; GLfloat vertexData2[24]; GLint origSrc, origDst; #ifdef USE_GLES GLint origSrcAlpha, origDstAlpha; #endif GLushort fc[4], bc[4], averageFillColor[4]; if (optionGetUseDesktopAverageColor ()) { const unsigned short *averageColor = screen->averageColor (); if (averageColor) { usingAverageColors = true; borderColor = const_cast(averageColor); memcpy (averageFillColor, averageColor, 4 * sizeof (unsigned short)); averageFillColor[3] = MaxUShort * 0.6; if (fillColor) fillColor = averageFillColor; } } bool blend = !optionGetDisableBlend (); if (blend && borderColor[3] == MaxUShort) { if (optionGetMode () == ResizeOptions::ModeOutline || fillColor[3] == MaxUShort) blend = false; } if (blend) { #ifdef USE_GLES glGetIntegerv (GL_BLEND_SRC_RGB, &origSrc); glGetIntegerv (GL_BLEND_DST_RGB, &origDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &origSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &origDstAlpha); #else glGetIntegerv (GL_BLEND_SRC, &origSrc); glGetIntegerv (GL_BLEND_DST, &origDst); #endif } logic.getPaintRectangle (&box); vertexData[0] = box.x1; vertexData[1] = box.y1; vertexData[2] = 0.0f; vertexData[3] = box.x1; vertexData[4] = box.y2; vertexData[5] = 0.0f; vertexData[6] = box.x2; vertexData[7] = box.y1; vertexData[8] = 0.0f; vertexData[9] = box.x2; vertexData[10] = box.y2; vertexData[11] = 0.0f; // FIXME: this is a quick work-around. // GL_LINE_LOOP and GL_LINE_STRIP primitive types in the SGX Pvr X11 driver // take special number of vertices (and reorder them). Thus, usage of // those line primitive is currently not supported by our GLVertexBuffer // implementation. This is a quick workaround to make it all work until // we come up with a better GLVertexBuffer::render(...) function. vertexData2[0] = box.x1; vertexData2[1] = box.y1; vertexData2[2] = 0.0f; vertexData2[3] = box.x1; vertexData2[4] = box.y2; vertexData2[5] = 0.0f; vertexData2[6] = box.x1; vertexData2[7] = box.y2; vertexData2[8] = 0.0f; vertexData2[9] = box.x2; vertexData2[10] = box.y2; vertexData2[11] = 0.0f; vertexData2[12] = box.x2; vertexData2[13] = box.y2; vertexData2[14] = 0.0f; vertexData2[15] = box.x2; vertexData2[16] = box.y1; vertexData2[17] = 0.0f; vertexData2[18] = box.x2; vertexData2[19] = box.y1; vertexData2[20] = 0.0f; vertexData2[21] = box.x1; vertexData2[22] = box.y1; vertexData2[23] = 0.0f; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (blend) { glEnable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } /* fill rectangle */ if (fillColor) { fc[3] = blend ? fillColor[3] : 0.85f * MaxUShortFloat; fc[0] = fillColor[0] * (unsigned long) fc[3] / MaxUShortFloat; fc[1] = fillColor[1] * (unsigned long) fc[3] / MaxUShortFloat; fc[2] = fillColor[2] * (unsigned long) fc[3] / MaxUShortFloat; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, fc); streamingBuffer->addVertices (4, &vertexData[0]); streamingBuffer->end (); streamingBuffer->render (sTransform); } /* draw outline */ static const int defaultBorderWidth = 2; int borderWidth = defaultBorderWidth; if (optionGetIncreaseBorderContrast() || usingAverageColors) { // Generate a lighter color based on border to create more contrast unsigned int averageColorLevel = (borderColor[0] + borderColor[1] + borderColor[2]) / 3; float colorMultiplier; if (averageColorLevel > MaxUShort * 0.3) colorMultiplier = 0.7; // make it darker else colorMultiplier = 2.0; // make it lighter bc[3] = borderColor[3]; bc[0] = MIN(MaxUShortFloat, ((float) borderColor[0]) * colorMultiplier) * bc[3] / MaxUShortFloat; bc[1] = MIN(MaxUShortFloat, ((float) borderColor[1]) * colorMultiplier) * bc[3] / MaxUShortFloat; bc[2] = MIN(MaxUShortFloat, ((float) borderColor[2]) * colorMultiplier) * bc[3] / MaxUShortFloat; if (optionGetIncreaseBorderContrast ()) { borderWidth *= 2; glLineWidth (borderWidth); streamingBuffer->begin (GL_LINES); streamingBuffer->addVertices (8, &vertexData2[0]); streamingBuffer->addColors (1, bc); streamingBuffer->end (); streamingBuffer->render (sTransform); } else if (usingAverageColors) { borderColor = bc; } } bc[3] = blend ? borderColor[3] : MaxUShortFloat; bc[0] = borderColor[0] * bc[3] / MaxUShortFloat; bc[1] = borderColor[1] * bc[3] / MaxUShortFloat; bc[2] = borderColor[2] * bc[3] / MaxUShortFloat; glLineWidth (defaultBorderWidth); streamingBuffer->begin (GL_LINES); streamingBuffer->addColors (1, bc); streamingBuffer->addVertices (8, &vertexData2[0]); streamingBuffer->end (); streamingBuffer->render (sTransform); if (blend) { glDisable (GL_BLEND); #ifdef USE_GLES glBlendFuncSeparate (origSrc, origDst, origSrcAlpha, origDstAlpha); #else glBlendFunc (origSrc, origDst); #endif } CompositeScreen *cScreen = CompositeScreen::get (screen); if (optionGetMode () == ResizeOptions::ModeOutline) { // Top damageRegion += CompRect (box.x1 - borderWidth, box.y1 - borderWidth, box.x2 - box.x1 + borderWidth * 2, borderWidth * 2); // Right damageRegion += CompRect (box.x2 - borderWidth, box.y1 - borderWidth, borderWidth + borderWidth / 2, box.y2 - box.y1 + borderWidth * 2); // Bottom damageRegion += CompRect (box.x1 - borderWidth, box.y2 - borderWidth, box.x2 - box.x1 + borderWidth * 2, borderWidth * 2); // Left damageRegion += CompRect (box.x1 - borderWidth, box.y1 - borderWidth, borderWidth + borderWidth / 2, box.y2 - box.y1 + borderWidth * 2); } else { CompRect damage (box.x1 - borderWidth, box.y1 - borderWidth, box.x2 - box.x1 + borderWidth * 2, box.y2 - box.y1 + borderWidth * 2); damageRegion += damage; } cScreen->damageRegion (damageRegion); } bool ResizeScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (logic.w && logic.mode == ResizeOptions::ModeStretch) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; bool status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); if (status && logic.w) { unsigned short *border, *fill; border = optionGetBorderColor (); fill = optionGetFillColor (); switch (logic.mode) { case ResizeOptions::ModeOutline: glPaintRectangle (sAttrib, transform, output, border, NULL); break; case ResizeOptions::ModeRectangle: glPaintRectangle (sAttrib, transform, output, border, fill); break; default: break; } } return status; } bool ResizeWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; if (window == static_cast(rScreen->logic.w)->impl () && rScreen->logic.mode == ResizeOptions::ModeStretch) { GLMatrix wTransform (transform); BoxRec box; float xScale, yScale; if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; status = gWindow->glPaint (attrib, transform, region, mask | PAINT_WINDOW_NO_CORE_INSTANCE_MASK); GLWindowPaintAttrib lastAttrib (gWindow->lastPaintAttrib ()); if (window->alpha () || lastAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; rScreen->logic.getPaintRectangle (&box); getStretchScale (&box, &xScale, &yScale); int x = window->geometry (). x (); int y = window->geometry (). y (); float xOrigin = x - window->border ().left; float yOrigin = y - window->border ().top; wTransform.translate (xOrigin, yOrigin, 0.0f); wTransform.scale (xScale, yScale, 1.0f); wTransform.translate ((rScreen->logic.geometry.x - x) / xScale - xOrigin, (rScreen->logic.geometry.y - y) / yScale - yOrigin, 0.0f); gWindow->glDraw (wTransform, lastAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } bool ResizeWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; if (window == static_cast(rScreen->logic.w)->impl () && rScreen->logic.mode == ResizeOptions::ModeStretch) { BoxRec box; rScreen->logic.getStretchRectangle (&box); rScreen->logic.damageRectangle (&box); status = true; } status |= cWindow->damageRect (initial, rect); return status; } /* We have to make some assumptions here in order to do this neatly, * see build/generated/resize_options.h for more info */ #define ResizeModeShiftMask (1 << 0) #define ResizeModeAltMask (1 << 1) #define ResizeModeControlMask (1 << 2) #define ResizeModeMetaMask (1 << 3) void ResizeScreen::resizeMaskValueToKeyMask (int valueMask, int *mask) { if (valueMask & ResizeModeShiftMask) *mask |= ShiftMask; if (valueMask & ResizeModeAltMask) *mask |= CompAltMask; if (valueMask & ResizeModeControlMask) *mask |= ControlMask; if (valueMask & ResizeModeMetaMask) *mask |= CompMetaMask; } void ResizeScreen::optionChanged (CompOption *option, ResizeOptions::Options num) { int *mask = NULL; int valueMask = 0; switch (num) { case ResizeOptions::OutlineModifier: mask = &logic.outlineMask; valueMask = optionGetOutlineModifierMask (); break; case ResizeOptions::RectangleModifier: mask = &logic.rectangleMask; valueMask = optionGetRectangleModifierMask (); break; case ResizeOptions::StretchModifier: mask = &logic.stretchMask; valueMask = optionGetStretchModifierMask (); break; case ResizeOptions::CenteredModifier: mask = &logic.centeredMask; valueMask = optionGetCenteredModifierMask (); break; default: break; } if (mask) resizeMaskValueToKeyMask (valueMask, mask); } ResizeScreen::ResizeScreen (CompScreen *s) : PluginClassHandler (s), gScreen (GLScreen::get (s)) { logic.mScreen = new resize::CompScreenImpl (screen); logic.cScreen = resize::CompositeScreenImpl::wrap (CompositeScreen::get (s)); logic.gScreen = resize::GLScreenImpl::wrap (gScreen); logic.options = this; CompOption::Vector atomTemplate; ResizeOptions::ChangeNotify notify = boost::bind (&ResizeScreen::optionChanged, this, _1, _2); atomTemplate.resize (4); for (int i = 0; i < 4; i++) { char buf[4]; snprintf (buf, 4, "%i", i); CompString tmpName (buf); atomTemplate.at (i).setName (tmpName, CompOption::TypeInt); } logic.resizeNotifyAtom = XInternAtom (s->dpy (), "_COMPIZ_RESIZE_NOTIFY", 0); logic.resizeInformationAtom = new resize::PropertyWriterImpl ( new PropertyWriter ("_COMPIZ_RESIZE_INFORMATION", atomTemplate)); for (unsigned int i = 0; i < NUM_KEYS; i++) logic.key[i] = XKeysymToKeycode (s->dpy (), XStringToKeysym (logic.rKeys[i].name)); optionSetInitiateKeyInitiate (resizeInitiateDefaultMode); optionSetInitiateKeyTerminate (resizeTerminate); optionSetInitiateButtonInitiate (resizeInitiateDefaultMode); optionSetInitiateButtonTerminate (resizeTerminate); optionSetOutlineModifierNotify (notify); optionSetRectangleModifierNotify (notify); optionSetStretchModifierNotify (notify); optionSetCenteredModifierNotify (notify); resizeMaskValueToKeyMask (optionGetOutlineModifierMask (), &logic.outlineMask); resizeMaskValueToKeyMask (optionGetRectangleModifierMask (), &logic.rectangleMask); resizeMaskValueToKeyMask (optionGetStretchModifierMask (), &logic.stretchMask); resizeMaskValueToKeyMask (optionGetCenteredModifierMask (), &logic.centeredMask); ScreenInterface::setHandler (s); if (gScreen) GLScreenInterface::setHandler (gScreen, false); } ResizeScreen::~ResizeScreen () { delete logic.mScreen; delete logic.cScreen; delete logic.gScreen; delete logic.resizeInformationAtom; } ResizeWindow::ResizeWindow (CompWindow *w) : PluginClassHandler (w), window (w), gWindow (GLWindow::get (w)), cWindow (CompositeWindow::get (w)), rScreen (ResizeScreen::get (screen)) { WindowInterface::setHandler (window); if (cWindow) CompositeWindowInterface::setHandler (cWindow, false); if (gWindow) GLWindowInterface::setHandler (gWindow, false); } ResizeWindow::~ResizeWindow () { } bool ResizePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/resize/src/property-writer-impl.h0000644000004100000410000000423713246301623021330 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Daniel d'Andrada */ #ifndef RESIZE_PROPERTY_WRITER_IMPL_H #define RESIZE_PROPERTY_WRITER_IMPL_H #include "core/propertywriter.h" #include "property-writer-interface.h" namespace resize { class PropertyWriterImpl : public PropertyWriterInterface { public: PropertyWriterImpl (PropertyWriter *impl) : mImpl (impl) {} virtual ~PropertyWriterImpl() {delete mImpl;} virtual bool updateProperty (Window w, CompOption::Vector &v, int i) { return mImpl->updateProperty (w, v, i); } virtual void deleteProperty (Window w) { mImpl->deleteProperty (w); } virtual const CompOption::Vector & readProperty (Window w) { return mImpl->readProperty (w); } virtual void setReadTemplate (const CompOption::Vector &v) { mImpl->setReadTemplate (v); } virtual const CompOption::Vector & getReadTemplate () { return mImpl->getReadTemplate (); } PropertyWriter* mImpl; }; } /* namespace resize */ #endif /* RESIZE_PROPERTY_WRITER_IMPL_H */ ./plugins/put/0000755000004100000410000000000013246301624013535 5ustar www-datawww-data./plugins/put/CMakeLists.txt0000644000004100000410000000015013246301623016270 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (put PLUGINDEPS composite opengl) ./plugins/put/put.xml.in0000644000004100000410000003154613246301623015504 0ustar www-datawww-data <_short>Put <_long>Put window Window Management opengl decor wobbly fade opengl composite <_short>Bindings <_short>Put to arbitrary viewport <_short>Put to adjacent viewport <_short>Put within viewport <_short>Put on empty regions <_short>Misc. Options <_short>Padding <_short>Animation ./plugins/put/src/0000755000004100000410000000000013246301624014324 5ustar www-datawww-data./plugins/put/src/put.h0000644000004100000410000001135413246301623015310 0ustar www-datawww-data/* * Copyright (c) 2006 Darryll Truchan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "put_options.h" enum PutType { PutUnknown = 0, PutBottomLeft = 1, PutBottom = 2, PutBottomRight = 3, PutLeft = 4, PutCenter = 5, PutRight = 6, PutTopLeft = 7, PutTop = 8, PutTopRight = 9, PutRestore = 10, PutViewport = 11, PutViewportLeft = 12, PutViewportRight = 13, PutAbsolute = 14, PutPointer = 15, PutViewportUp = 16, PutViewportDown = 17, PutRelative = 18, PutNextOutput = 19, PutPreviousOutput = 20, PutEmptyBottomLeft = 21, PutEmptyBottom = 22, PutEmptyBottomRight = 23, PutEmptyLeft = 24, PutEmptyCenter = 25, PutEmptyRight = 26, PutEmptyTopLeft = 27, PutEmptyTop = 28, PutEmptyTopRight, }; class PutScreen : public PluginClassHandler , public PutOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: PutScreen (CompScreen *s); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void handleEvent (XEvent *); bool initiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options, PutType type); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &option); bool toViewport (CompAction *action, CompAction::State state, CompOption::Vector &option, int vp); private: CompRegion emptyRegion (CompWindow *window, const CompRect &outputRect); bool boxCompare (const CompRect &a, const CompRect &b); CompRect extendBox (CompWindow *w, const CompRect &tmp, const CompRegion &r, bool xFirst, bool left, bool right, bool up, bool down); CompRect findRect (CompWindow *w, const CompRegion &r, bool left, bool right, bool up, bool down); unsigned int computeResize (CompWindow *w, XWindowChanges *xwc, bool left, bool right, bool up, bool down); int adjustVelocity (CompWindow *w); void finishWindowMovement (CompWindow *w); CompPoint getDistance (CompWindow *w, PutType type, CompOption::Vector &option); unsigned int getOutputForWindow (CompWindow *w); PutType typeFromString (const CompString &); /* Data */ CompScreen *screen; CompositeScreen *cScreen; GLScreen *gScreen; Atom compizPutWindowAtom; Window lastWindow; PutType lastType; int moreAdjust; CompScreen::GrabHandle grabIndex; friend class PutWindow; }; class PutWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: PutWindow (CompWindow *window); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); private: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; GLfloat xVelocity, yVelocity; /* animation velocity */ GLfloat tx, ty; /* animation translation */ int lastX, lastY; /* starting position */ int targetX, targetY; /* target of the animation */ bool adjust; /* animation flag */ friend class PutScreen; }; #define PUT_SCREEN(s) \ PutScreen *ps = PutScreen::get (s); #define PUT_WINDOW(w) \ PutWindow *pw = PutWindow::get (w); class PutPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/put/src/put.cpp0000644000004100000410000010502113246301623015636 0ustar www-datawww-data/* * Copyright (c) 2006 Darryll Truchan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "put.h" #include COMPIZ_PLUGIN_20090315 (put, PutPluginVTable); #define PUT_ONLY_EMPTY(type) (type >= PutEmptyBottomLeft && \ type <= PutEmptyTopRight) #define TOP_BORDER(w) ((w)->border ().top) #define LEFT_BORDER(w) ((w)->border ().left) #define RIGHT_BORDER(w) ((w)->border ().right + 2 * (w)->serverGeometry ().border ()) #define BOTTOM_BORDER(w) ((w)->border ().bottom + 2 * (w)->serverGeometry ().border ()) #define HALF_WIDTH(w) ((w)->serverWidth () / 2 + (w)->serverGeometry ().border ()) #define HALF_HEIGHT(w) ((w)->serverHeight () / 2 + (w)->serverGeometry ().border ()) /* * Maximumize functions * Functions are from Maximumize plugin * (Author:Kristian Lyngstøl ) */ /* Generates a region containing free space (here the * active window counts as free space). The region argument * is the start-region (ie: the output dev). * Logic borrowed from opacify (courtesy of myself). */ CompRegion PutScreen::emptyRegion (CompWindow *window, const CompRect& outputRect) { CompRegion newRegion; newRegion += outputRect; foreach(CompWindow *w, screen->windows ()) { if (w->id () == window->id ()) continue; if (w->invisible () || /*w->hidden () ||*/ w->minimized ()) continue; if (w->wmType () & CompWindowTypeDesktopMask) continue; if (w->wmType () & CompWindowTypeDockMask) { if (w->struts ()) { CompRegion tmpRegion; tmpRegion += w->struts ()->left; tmpRegion += w->struts ()->right; tmpRegion += w->struts ()->top; tmpRegion += w->struts ()->bottom; newRegion -= tmpRegion; } continue; } newRegion -= w->serverBorderRect (); } return newRegion; } /* Returns true if box a has a larger area than box b. */ bool PutScreen::boxCompare (const CompRect& a, const CompRect& b) { int areaA, areaB; areaA = a.width () * a.height (); areaB = b.width () * b.height (); return (areaA > areaB); } /* Extends the given box for Window w to fit as much space in region r. * If XFirst is true, it will first expand in the X direction, * then Y. This is because it gives different results. * PS: Decorations are icky. */ static const unsigned short LEFT = 0; static const unsigned short RIGHT = 1; static const unsigned short TOP = 2; static const unsigned short BOTTOM = 3; inline void addToCorner (CompRect& rect, unsigned int corner, const short inc) { switch (corner) { case LEFT: rect.setX (rect.x () + inc); break; case RIGHT: rect.setWidth (rect.width () + inc); break; case TOP: rect.setY (rect.y () + inc); break; case BOTTOM: rect.setHeight (rect.height () + inc); break; } } inline void expandCorner (CompWindow *w, CompRect& tmp, const CompRegion& r, unsigned int corner, int direction) { bool touch = false; #define CHECKREC \ r.contains (CompRect (tmp.x () - LEFT_BORDER (w), \ tmp.y () - TOP_BORDER (w), \ tmp.width () + LEFT_BORDER (w) + RIGHT_BORDER (w), \ tmp.height () + TOP_BORDER (w) + BOTTOM_BORDER (w))) while (CHECKREC) { addToCorner (tmp, corner, direction); touch = true; } if (touch) addToCorner (tmp, corner, -direction); #undef CHECKREC } CompRect PutScreen::extendBox (CompWindow *w, const CompRect& tmp, const CompRegion& r, bool xFirst, bool left, bool right, bool up, bool down) { short int counter = 0; CompRect result = tmp; while (counter < 1) { if ((xFirst && counter == 0) || (!xFirst && counter == 1)) { if (left) expandCorner (w, result, r, LEFT, -1); if (right) expandCorner (w, result, r, RIGHT, 1); counter++; } if ((xFirst && counter == 1) || (!xFirst && counter == 0)) { if (down) expandCorner (w, result, r, BOTTOM, 1); if (up) expandCorner (w, result, r, TOP, -1); counter++; } } return result; } /* Create a box for resizing in the given region * Also shrinks the window box in case of minor overlaps. * FIXME: should be somewhat cleaner. */ CompRect PutScreen::findRect (CompWindow *w, const CompRegion& r, bool left, bool right, bool up, bool down) { CompRect windowBox, ansA, ansB, orig; windowBox.setGeometry (w->serverX (), w->serverY (), w->serverWidth (), w->serverHeight ()); orig = windowBox; ansA = extendBox (w, windowBox, r, true, left, right, up, down); ansB = extendBox (w, windowBox, r, false, left, right, up, down); if (boxCompare (orig, ansA) && boxCompare (orig, ansB)) return orig; if (boxCompare (ansA, ansB)) return ansA; else return ansB; } /* Calls out to compute the resize */ unsigned int PutScreen::computeResize (CompWindow *w, XWindowChanges *xwc, bool left, bool right, bool up, bool down) { unsigned int mask = 0; CompRect box; CompRegion region; int outputDevice = w->outputDevice (); region = emptyRegion (w, screen->outputDevs ()[outputDevice]); box = findRect (w, region, left, right, up, down); if (box.x () != w->serverX ()) mask |= CWX; if (box.y () != w->serverY ()) mask |= CWY; if (box.width () != w->serverWidth ()) mask |= CWWidth; if (box.height () != w->height ()) mask |= CWHeight; xwc->x = box.x (); xwc->y = box.y (); xwc->width = box.width (); xwc->height = box.height (); return mask; } /* * End of Maximumize functions */ /* * calculate the velocity for the moving window */ int PutScreen::adjustVelocity (CompWindow *w) { float dx, dy, adjust, amount; float x1, y1; PUT_WINDOW (w); x1 = pw->targetX; y1 = pw->targetY; dx = x1 - (w->x () + pw->tx); dy = y1 - (w->y () + pw->ty); adjust = dx * 0.15f; amount = fabs (dx) * 1.5; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; pw->xVelocity = (amount * pw->xVelocity + adjust) / (amount + 1.0f); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; pw->yVelocity = (amount * pw->yVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (pw->xVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (pw->yVelocity) < 0.2f) { /* animation done */ pw->xVelocity = pw->yVelocity = 0.0f; pw->tx = x1 - w->x (); pw->ty = y1 - w->y (); return 0; } return 1; } void PutScreen::finishWindowMovement (CompWindow *w) { PUT_WINDOW (w); w->move (pw->targetX - w->x (), pw->targetY - w->y (), true); if (w->state () & (MAXIMIZE_STATE | CompWindowStateFullscreenMask)) w->updateAttributes (CompStackingUpdateModeNone); } unsigned int PutScreen::getOutputForWindow (CompWindow *w) { PUT_WINDOW (w); if (!pw->adjust) return w->outputDevice (); /* outputDeviceForWindow uses the server geometry, so specialcase a running animation, which didn't apply the server geometry yet */ CompWindow::Geometry geom; geom.set (w->x () + pw->tx, w->y () + pw->ty, w->width (), w->height (), w->geometry ().border ()); return screen->outputDeviceForGeometry (geom); } CompPoint PutScreen::getDistance (CompWindow *w, PutType type, CompOption::Vector &option) { CompScreen *s = screen; int x, y, dx, dy, posX, posY; int viewport, output; CompRect workArea; CompPoint result; PUT_SCREEN (s); PUT_WINDOW (w); posX = CompOption::getIntOptionNamed (option,"x", 0); posY = CompOption::getIntOptionNamed (option,"y", 0); /* get the output device number from the options list */ output = CompOption::getIntOptionNamed (option,"output", -1); /* no output in options list -> use the current output */ if (output == -1) { /* no output given, so use the current output if this wasn't a double tap */ if (ps->lastType != type || ps->lastWindow != w->id ()) output = getOutputForWindow (w); } else { /* make sure the output number is not out of bounds */ output = MIN (output, (int) s->outputDevs ().size () - 1); } if (output == -1) { /* user double-tapped the key, so use the screen work area */ workArea = s->workArea (); /* set the type to unknown to have a toggle-type behaviour between 'use output work area' and 'use screen work area' */ ps->lastType = PutUnknown; } else { /* single tap or output provided via options list, use the output work area */ workArea = s->getWorkareaForOutput (output); ps->lastType = type; } if (PUT_ONLY_EMPTY (type)) { unsigned int mask; XWindowChanges xwc; bool left, right, up, down; left = right = up = down = false; switch (type) { case PutEmptyBottomLeft: left = down = true; break; case PutEmptyBottom: down = true; break; case PutEmptyBottomRight: right = down = true; break; case PutEmptyLeft: left = true; break; case PutEmptyCenter: left = right = up = down = true; break; case PutEmptyRight: right = true; break; case PutEmptyTopLeft: left = up = true; break; case PutEmptyTop: up = true; break; case PutEmptyTopRight: right = up = true; break; default: break; } mask = computeResize (w, &xwc, left,right,up,down); if (mask) { if (w->constrainNewWindowSize (xwc.width, xwc.height, &xwc.width, &xwc.height)) mask |= CWWidth | CWHeight; } workArea.setGeometry (xwc.x, xwc.y, xwc.width, xwc.height); } /* the windows location */ x = w->x () + pw->tx; y = w->y () + pw->ty; switch (type) { case PutEmptyCenter: case PutCenter: /* center of the screen */ dx = (workArea.width () / 2) - HALF_WIDTH (w) - w->serverGeometry ().border () - (x - workArea.x ()); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - w->serverGeometry ().border () - (y - workArea.y ()); break; case PutLeft: /* center of the left edge */ dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutEmptyLeft: /* center of the left edge */ workArea.setX (workArea.x () - LEFT_BORDER (w)); dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutTopLeft: /* top left corner */ dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutEmptyTopLeft: /* top left corner */ workArea.setX (workArea.x () - LEFT_BORDER (w)); workArea.setY (workArea.y () - TOP_BORDER (w)); dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutTop: /* center of top edge */ dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutEmptyTop: /* center of top edge */ workArea.setY (workArea.x () - TOP_BORDER (w)); dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutTopRight: /* top right corner */ dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutEmptyTopRight: /* top right corner */ workArea.setX (workArea.x () + RIGHT_BORDER (w)); workArea.setY (workArea.y () - TOP_BORDER (w)); dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = -(y - workArea.y ()) + TOP_BORDER (w) + ps->optionGetPadTop (); break; case PutRight: /* center of right edge */ dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutEmptyRight: /* center of right edge */ workArea.setX (workArea.x () + RIGHT_BORDER (w)); dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = (workArea.height () / 2) - HALF_HEIGHT (w) - (y - workArea.y ()); break; case PutBottomRight: /* bottom right corner */ dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutEmptyBottomRight: /* bottom right corner */ workArea.setX (workArea.x () + RIGHT_BORDER (w)); workArea.setY (workArea.y () + BOTTOM_BORDER (w)); dx = workArea.width () - w->serverWidth () - (x - workArea.x ()) - RIGHT_BORDER (w) - ps->optionGetPadRight (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w)- ps->optionGetPadBottom (); break; case PutBottom: /* center of bottom edge */ dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutEmptyBottom: /* center of bottom edge */ workArea.setY (workArea.y () + BOTTOM_BORDER (w)); dx = (workArea.width () / 2) - HALF_WIDTH (w) - (x - workArea.x ()); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutBottomLeft: /* bottom left corner */ dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutEmptyBottomLeft: /* bottom left corner */ workArea.setX (workArea.x () - LEFT_BORDER (w)); workArea.setY (workArea.y () + BOTTOM_BORDER (w)); dx = -(x - workArea.x ()) + LEFT_BORDER (w) + ps->optionGetPadLeft (); dy = workArea.height () - w->serverHeight () - (y - workArea.y ()) - BOTTOM_BORDER (w) - ps->optionGetPadBottom (); break; case PutRestore: /* back to last position */ dx = pw->lastX - x; dy = pw->lastY - y; break; case PutViewport: { int vpX, vpY, hDirection, vDirection; /* get the viewport to move to from the options list */ viewport = CompOption::getIntOptionNamed (option, "viewport", -1); /* if viewport wasn't supplied, bail out */ if (viewport < 0) return result; /* split 1D viewport value into 2D x and y viewport */ vpX = viewport % s->vpSize ().width (); vpY = viewport / s->vpSize ().width (); if (vpY > (int) s->vpSize ().height ()) vpY = s->vpSize ().height () - 1; /* take the shortest horizontal path to the destination viewport */ hDirection = (vpX - s->vp ().x ()); if (hDirection > (int) s->vpSize ().width () / 2) hDirection = (hDirection - s->vpSize ().width ()); else if (hDirection < - ((int) s->vpSize ().width ()) / 2) hDirection = (hDirection + s->vpSize ().width ()); /* we need to do this for the vertical destination viewport too */ vDirection = (vpY - s->vp ().y ()); if (vDirection > (int) s->vpSize ().height () / 2) vDirection = (vDirection - s->vpSize ().height ()); else if (vDirection < -((int) s->vpSize ().height ()) / 2) vDirection = (vDirection + s->vpSize ().height ()); dx = s->width () * hDirection; dy = s->height () * vDirection; break; } case PutViewportLeft: /* move to the viewport on the left */ dx = (s->vp ().x () >= 1) ? -s->width () : 0; dy = 0; break; case PutViewportRight: /* move to the viewport on the right */ dx = (s->vp ().x () < s->vpSize ().width ()-1) ? s->width () : 0; dy = 0; break; case PutViewportUp: /* move to the viewport above */ dx = 0; dy = (s->vp ().y () >= 1) ? -s->height () : 0; break; case PutViewportDown: /* move to the viewport below */ dx = 0; dy = (s->vp ().y () < s->vpSize ().height ()-1) ? s->height () : 0; break; case PutPreviousOutput: case PutNextOutput: { int outputNum, currentNum; int nOutputDev = s->outputDevs ().size (); CompOutput *currentOutput, *newOutput; if (nOutputDev < 2) return result; currentNum = getOutputForWindow (w); outputNum = (currentNum + (type == PutNextOutput ? 1 : -1)) % nOutputDev; if (outputNum < 0) outputNum += nOutputDev; outputNum = CompOption::getIntOptionNamed (option,"output", outputNum); if (outputNum >= nOutputDev) return result; currentOutput = &s->outputDevs ().at(currentNum); newOutput = &s->outputDevs ().at(outputNum); /* move by the distance of the output center points */ dx = (newOutput->x1 () + newOutput->width () / 2) - (currentOutput->x1 () + currentOutput->width () / 2); dy = (newOutput->y1 () + newOutput->height () / 2) - (currentOutput->y1 () + currentOutput->height () / 2); /* update work area for new output */ workArea = newOutput->workArea (); } break; case PutAbsolute: /* move the window to an exact position */ if (posX < 0) /* account for a specified negative position, like geometry without (-0) */ dx = posX + s->width () - w->serverWidth () - x - RIGHT_BORDER (w); else dx = posX - x + LEFT_BORDER (w); if (posY < 0) /* account for a specified negative position, like geometry without (-0) */ dy = posY + s->height () - w->height () - y - BOTTOM_BORDER (w); else dy = posY - y + TOP_BORDER (w); break; case PutRelative: /* move window by offset */ dx = posX; dy = posY; break; case PutPointer: { /* move the window to the pointers position * using the current quad of the screen to determine * which corner to move to the pointer */ int rx, ry; Window root, child; int winX, winY; unsigned int pMask; /* get the pointers position from the X server */ if (XQueryPointer (s->dpy (), w->id (), &root, &child, &rx, &ry, &winX, &winY, &pMask)) { if (ps->optionGetWindowCenter ()) { /* window center */ dx = rx - HALF_WIDTH (w) - x; dy = ry - HALF_HEIGHT (w) - y; } else if (rx < (int) s->workArea ().width () / 2 && ry < (int) s->workArea ().height () / 2) { /* top left quad */ dx = rx - x + LEFT_BORDER (w); dy = ry - y + TOP_BORDER (w); } else if (rx < (int) s->workArea ().width () / 2 && ry >= (int) s->workArea ().height () / 2) { /* bottom left quad */ dx = rx - x + LEFT_BORDER (w); dy = ry - w->height () - y - BOTTOM_BORDER (w); } else if (rx >= (int) s->workArea ().width () / 2 && ry < (int) s->workArea ().height () / 2) { /* top right quad */ dx = rx - w->width () - x - RIGHT_BORDER (w); dy = ry - y + TOP_BORDER (w); } else { /* bottom right quad */ dx = rx - w->width () - x - RIGHT_BORDER (w); dy = ry - w->height () - y - BOTTOM_BORDER (w); } } else { dx = dy = 0; } } break; default: /* if an unknown type is specified, do nothing */ dx = dy = 0; break; } if ((dx || dy) && ps->optionGetAvoidOffscreen () && !(w->type () & CompWindowTypeFullscreenMask)) { /* avoids window borders offscreen, but allow full viewport movements */ int inDx, dxBefore; int inDy, dyBefore; CompWindowExtents extents, area; inDx = dxBefore = dx % s->width (); inDy = dyBefore = dy % s->height (); extents.left = x + inDx - LEFT_BORDER (w); extents.top = y + inDy - TOP_BORDER (w); extents.right = x + inDx + w->serverWidth () + RIGHT_BORDER (w); extents.bottom = y + inDy + w->serverHeight () + BOTTOM_BORDER (w); area.left = workArea.left () + ps->optionGetPadLeft (); area.top = workArea.top () + ps->optionGetPadTop (); area.right = workArea.right () - ps->optionGetPadRight (); area.bottom = workArea.bottom () - ps->optionGetPadBottom (); if (extents.left < area.left) { inDx += area.left - extents.left; } else if (w->serverWidth () <= workArea.width () && extents.right > area.right) { inDx += area.right - extents.right; } if (extents.top < area.top) { inDy += area.top - extents.top; } else if (w->serverHeight () <= workArea.height () && extents.bottom > area.bottom) { inDy += area.bottom - extents.bottom; } /* apply the change */ dx += inDx - dxBefore; dy += inDy - dyBefore; } result.set (dx, dy); return result; } void PutScreen::preparePaint (int ms) { PUT_SCREEN (screen); if (ps->moreAdjust && ps->grabIndex) { int steps; float amount, chunk; amount = ms * 0.025f * ps->optionGetSpeed (); steps = amount / (0.5f * ps->optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float)steps; while (steps--) { Window endAnimationWindow = None; ps->moreAdjust = 0; foreach(CompWindow *w, screen->windows ()) { PUT_WINDOW (w); if (pw->adjust) { pw->adjust = adjustVelocity (w); ps->moreAdjust |= pw->adjust; pw->tx += pw->xVelocity * chunk; pw->ty += pw->yVelocity * chunk; if (!pw->adjust) { /* animation done */ finishWindowMovement (w); if (w->id () == screen->activeWindow ()) endAnimationWindow = w->id (); pw->tx = pw->ty = 0; } } } if (!ps->moreAdjust) { /* unfocus moved window if enabled */ if (ps->optionGetUnfocusWindow ()) screen->focusDefaultWindow (); else if (endAnimationWindow) screen->sendWindowActivationRequest (endAnimationWindow); break; } } } cScreen->preparePaint (ms); } /* This is the guts of the paint function. You can transform the way the * entire output is painted or you can just draw things on screen with openGL. * The unsigned int here is a mask for painting the screen, see opengl/opengl.h * on how you can change it */ bool PutScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; PUT_SCREEN (screen); if (ps->moreAdjust) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); return status; } void PutScreen::donePaint () { PUT_SCREEN (screen); if (ps->moreAdjust && ps->grabIndex) { cScreen->damageScreen (); // FIXME } else { if (ps->grabIndex) { /* release the screen grab */ screen->removeGrab (ps->grabIndex, NULL); ps->grabIndex = 0; } } cScreen->donePaint (); } /* This is our event handler. It directly hooks into the screen's X Event handler and allows us to handle * our raw X Events */ void PutScreen::handleEvent (XEvent *event) { switch (event->type) { /* handle client events */ case ClientMessage: /* accept the custom atom for putting windows */ if (event->xclient.message_type == compizPutWindowAtom) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { /* * get the values from the xclientmessage event and populate * the options for put initiate * * the format is 32 * and the data is * l[0] = x position - unused (for future PutExact) * l[1] = y position - unused (for future PutExact) * l[2] = viewport number * l[3] = put type, int value from enum * l[4] = output number */ CompOption::Vector opt (5); CompOption::Value value0 = (int) event->xclient.window; opt.push_back (CompOption ( "window",CompOption::TypeInt)); opt[0].set (value0); CompOption::Value value1 = (int) event->xclient.data.l[0]; opt.push_back (CompOption ( "x",CompOption::TypeInt)); opt[1].set (value1); CompOption::Value value2 = (int) event->xclient.data.l[1]; opt.push_back (CompOption ( "y",CompOption::TypeInt)); opt[2].set (value2); CompOption::Value value3 = (int) event->xclient.data.l[2]; opt.push_back (CompOption ( "viewport",CompOption::TypeInt)); opt[3].set (value3); CompOption::Value value4 = (int) event->xclient.data.l[4]; opt.push_back (CompOption ( "output",CompOption::TypeInt)); opt[4].set (value4); initiateCommon (NULL, 0, opt, (PutType) event->xclient.data.l[3]); } } break; default: break; } screen->handleEvent (event); } /* This gets called whenever the window needs to be repainted. * WindowPaintAttrib gives you some attributes like brightness/saturation etc * to play around with. GLMatrix is the window's transformation matrix. The * unsigned int is the mask, have a look at opengl.h on what you can do * with it */ bool PutWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLMatrix wTransform (transform); if (adjust) { wTransform.translate (tx, ty, 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; } return gWindow->glPaint (attrib, wTransform, region, mask); } /* * initiate action callback */ bool PutScreen::initiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &option, PutType type) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (option, "window", 0); if (!xid) xid = screen->activeWindow (); w = screen->findWindow (xid); if (w) { CompScreen *s = screen; CompPoint delta; /* we don't want to do anything with override redirect windows */ if (w->overrideRedirect ()) return false; /* we don't want to be moving the desktop and docks */ if (w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; /* don't move windows without move action */ if (!(w->actions () & CompWindowActionMoveMask)) return false; /* only allow movement of fullscreen windows to next output */ if ((type != PutNextOutput && type != PutPreviousOutput) && (w->type () & CompWindowTypeFullscreenMask)) { return false; } /* * handle the put types */ delta = getDistance (w, type, option); /* don't do anything if there is nothing to do */ if (!delta.x () && !delta.y ()) return true; if (!grabIndex) { /* this will keep put from working while something else has a screen grab */ if (s->otherGrabExist ("put", NULL)) return false; /* we are ok, so grab the screen */ grabIndex = s->pushGrab (s->invisibleCursor (), "put"); } if (grabIndex) { PUT_WINDOW (w); lastWindow = w->id (); /* save the windows position in the saveMask * this is used when unmaximizing the window */ if (w->saveMask () & CWX) w->saveWc ().x += delta.x (); if (w->saveMask () & CWY) w->saveWc ().y += delta.y (); /* Make sure everyting starts out at the windows current position */ pw->lastX = w->x () + pw->tx; pw->lastY = w->y () + pw->ty; pw->targetX = pw->lastX + delta.x (); pw->targetY = pw->lastY + delta.y (); /* mark for animation */ pw->adjust = true; moreAdjust = true; /* cause repainting */ pw->cWindow->addDamage (); } } /* tell event.c handleEvent to not call XAllowEvents */ return false; } PutType PutScreen::typeFromString (const CompString &type) { if (type == "absolute") return PutAbsolute; else if (type == "relative") return PutRelative; else if (type == "pointer") return PutPointer; else if (type == "viewport") return (PutType) PutViewport; else if (type == "viewportleft") return PutViewportLeft; else if (type == "viewportright") return PutViewportRight; else if (type == "viewportup") return PutViewportUp; else if (type == "viewportdown") return PutViewportDown; else if (type == "previousoutput") return PutPreviousOutput; else if (type == "nextoutput") return PutNextOutput; else if (type == "restore") return PutRestore; else if (type == "bottomleft") return PutBottomLeft; else if (type == "emptybottomleft") return PutEmptyBottomLeft; else if (type == "left") return PutLeft; else if (type == "emptyleft") return PutEmptyLeft; else if (type == "topleft") return PutTopLeft; else if (type == "emptytopleft") return PutEmptyTopLeft; else if (type == "top") return PutTop; else if (type == "emptytop") return PutEmptyTop; else if (type == "topright") return PutTopRight; else if (type == "emptytopright") return PutEmptyTopRight; else if (type == "right") return PutRight; else if (type == "emptyright") return PutEmptyRight; else if (type == "bottomright") return PutBottomRight; else if (type == "emptybottomright") return PutEmptyBottomRight; else if (type == "bottom") return PutBottom; else if (type == "emptybottom") return PutEmptyBottom; else if (type == "center") return PutCenter; else if (type == "emptycenter") return PutEmptyCenter; else return PutUnknown; } bool PutScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &option) { PutType type = PutUnknown; CompString typeString; typeString = CompOption::getStringOptionNamed (option, "type"); if (!typeString.empty ()) type = typeFromString (typeString); /* if (type == (PutType) PutViewport) return toViewport (action, state, option); else*/ return initiateCommon (action, state, option,type); } bool PutScreen::toViewport (CompAction *action, CompAction::State state, CompOption::Vector &option, int vp) { unsigned int index; if (CompOption::findOption (option, "viewport", &index) == NULL) { int last = option.size (); option.resize(last+1); option[last].setName ("viewport",CompOption::TypeInt); option[last].value ().set (vp-1); } else { option[index].value ().set (vp-1); } return initiateCommon (action, state, option, (PutType) PutViewport); } PutScreen::PutScreen (CompScreen *screen) : PluginClassHandler (screen), PutOptions (), screen (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), lastWindow (None), lastType (PutUnknown), moreAdjust (false), grabIndex (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); compizPutWindowAtom = XInternAtom(screen->dpy (), "_COMPIZ_PUT_WINDOW", 0); optionSetPutPutInitiate (boost::bind (&PutScreen::initiate, this, _1, _2, _3)); #define setAction(action, type) \ optionSet##action##KeyInitiate (boost::bind (&PutScreen::initiateCommon, \ this, _1,_2,_3,type)); \ optionSet##action##ButtonInitiate (boost::bind (&PutScreen::initiateCommon,\ this, _1,_2,_3,type)) setAction (PutRestore, PutRestore); setAction (PutPointer, PutPointer); setAction (PutNextOutput, PutNextOutput); setAction (PutPreviousOutput, PutPreviousOutput); setAction (PutCenter, PutCenter); setAction (PutEmptyCenter, PutEmptyCenter); setAction (PutLeft, PutLeft); setAction (PutEmptyLeft, PutEmptyLeft); setAction (PutRight, PutRight); setAction (PutEmptyRight, PutEmptyRight); setAction (PutTop, PutTop); setAction (PutEmptyTop, PutEmptyTop); setAction (PutBottom, PutBottom); setAction (PutEmptyBottom, PutEmptyBottom); setAction (PutTopleft, PutTopLeft); setAction (PutEmptyTopleft, PutEmptyTopLeft); setAction (PutTopright, PutTopRight); setAction (PutEmptyTopright, PutEmptyTopRight); setAction (PutBottomleft, PutBottomLeft); setAction (PutEmptyBottomleft, PutEmptyBottomLeft); setAction (PutBottomright, PutBottomRight); setAction (PutEmptyBottomright, PutEmptyBottomRight); #define setViewportAction(num) \ optionSetPutViewport##num##KeyInitiate(boost::bind (&PutScreen::toViewport,\ this, _1,_2,_3,num)); setViewportAction(1); setViewportAction(2); setViewportAction(3); setViewportAction(4); setViewportAction(5); setViewportAction(6); setViewportAction(7); setViewportAction(8); setViewportAction(9); setViewportAction(10); setViewportAction(11); setViewportAction(12); #define setDirectionAction(action) \ optionSet##action##KeyInitiate(boost::bind (&PutScreen::initiateCommon, \ this, _1,_2,_3,action)) setDirectionAction(PutViewportLeft); setDirectionAction(PutViewportRight); setDirectionAction(PutViewportUp); setDirectionAction(PutViewportDown); } PutWindow::PutWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), xVelocity (0), yVelocity (0), tx (0), ty (0), lastX (window->serverX ()), lastY (window->serverY ()), adjust (false) { WindowInterface::setHandler (window); CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); } bool PutPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/place/0000755000004100000410000000000013246301624014011 5ustar www-datawww-data./plugins/place/CMakeLists.txt0000644000004100000410000000102013246301623016541 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/constrain-to-workarea/include/) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/screen-size-change/include/) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/smart/include/) add_subdirectory (src/constrain-to-workarea) add_subdirectory (src/screen-size-change) add_subdirectory (src/smart) compiz_plugin (place LIBRARIES compiz_place_constrain_to_workarea compiz_place_screen_size_change compiz_place_smart) ./plugins/place/src/0000755000004100000410000000000013246301624014600 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/0000755000004100000410000000000013246301623021030 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/CMakeLists.txt0000644000004100000410000000226413246301623023574 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/constrain-to-workarea.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/constrain-to-workarea.cpp ${compiz_SOURCE_DIR}/src/size.cpp ) ADD_LIBRARY( compiz_place_constrain_to_workarea STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_place_constrain_to_workarea PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_place_constrain_to_workarea compiz_core ${GLIBMM_LIBRARIES} ) ./plugins/place/src/constrain-to-workarea/include/0000755000004100000410000000000013246301623022453 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/include/constrain-to-workarea.h0000644000004100000410000000526713246301623027067 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #ifndef _COMPIZ_PLACE_CLAMP_TO_WORKAREA_H #define _COMPIZ_PLACE_CLAMP_TO_WORKAREA_H #include #include #include #include #include namespace compiz { namespace place { extern unsigned int clampGeometrySizeOnly; extern unsigned int clampGeometryToViewport; void clampGeometryToWorkArea (compiz::window::Geometry &g, const CompRect &workArea, const CompWindowExtents &border, unsigned int flags, const CompSize &screenSize); CompPoint & constrainPositionToWorkArea (CompPoint &pos, const compiz::window::Geometry &serverGeometry, const CompWindowExtents &border, const CompRect &workArea); CompPoint getViewportRelativeCoordinates (const compiz::window::Geometry &geom, const CompSize &screen); CompWindowExtents getWindowEdgePositions (const CompPoint &position, const compiz::window::Geometry &geom, const CompWindowExtents &border); void clampHorizontalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea); void clampVerticalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea); void subtractBordersFromEdgePositions (CompWindowExtents &edgePositions, const CompWindowExtents &border, unsigned int legacyBorder); bool onlySizeChanged (unsigned int mask); bool applyWidthChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask); bool applyHeightChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask); } } #endif ./plugins/place/src/constrain-to-workarea/src/0000755000004100000410000000000013246301623021617 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/src/constrain-to-workarea.cpp0000644000004100000410000002011613246301623026554 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "constrain-to-workarea.h" namespace compiz { namespace place { unsigned int clampGeometrySizeOnly = (1 << 0); unsigned int clampGeometryToViewport = (1 << 1); } } namespace cp = compiz::place; namespace cw = compiz::window; void cp::clampGeometryToWorkArea (cw::Geometry &g, const CompRect &workArea, const CompWindowExtents &border, unsigned int flags, const CompSize &screenSize) { int x, y, left, right, bottom, top; if (flags & clampGeometryToViewport) { /* left, right, top, bottom target coordinates, clamed to viewport * sizes as we don't need to validate movements to other viewports; * we are only interested in inner-viewport movements */ x = g.x () % screenSize.width (); if ((x + g.width ()) < 0) x += screenSize.width (); y = g.y () % screenSize.height (); if ((y + g.height ()) < 0) y += screenSize.height (); } else { x = g.x (); y = g.y (); } left = x - border.left; right = left + g.widthIncBorders () + (border.left + border.right); top = y - border.top; bottom = top + g.heightIncBorders () + (border.top + border.bottom); if ((right - left) > workArea.width ()) { left = workArea.left (); right = workArea.right (); } else { if (left < workArea.left ()) { right += workArea.left () - left; left = workArea.left (); } if (right > workArea.right ()) { left -= right - workArea.right (); right = workArea.right (); } } if ((bottom - top) > workArea.height ()) { top = workArea.top (); bottom = workArea.bottom (); } else { if (top < workArea.top ()) { bottom += workArea.top () - top; top = workArea.top (); } if (bottom > workArea.bottom ()) { top -= bottom - workArea.bottom (); bottom = workArea.bottom (); } } /* bring left/right/top/bottom to actual window coordinates */ left += border.left; right -= border.right + 2 * g.border (); top += border.top; bottom -= border.bottom + 2 * g.border (); if ((right - left) != g.width ()) { g.setWidth (right - left); flags &= ~clampGeometrySizeOnly; } if ((bottom - top) != g.height ()) { g.setHeight (bottom - top); flags &= ~clampGeometrySizeOnly; } if (!(flags & clampGeometrySizeOnly)) { if (left != x) g.setX (g.x () + left - x); if (top != y) g.setY (g.y () + top - y); } } CompPoint & cp::constrainPositionToWorkArea (CompPoint &pos, const cw::Geometry &serverGeometry, const CompWindowExtents &border, const CompRect &workArea) { CompWindowExtents extents; int delta; extents.left = pos.x () - border.left; extents.top = pos.y () - border.top; extents.right = extents.left + serverGeometry.widthIncBorders () + (border.left + border.right); extents.bottom = extents.top + serverGeometry.heightIncBorders () + (border.top + border.bottom); delta = workArea.right () - extents.right; if (delta < 0) extents.left += delta; delta = workArea.left () - extents.left; if (delta > 0) extents.left += delta; delta = workArea.bottom () - extents.bottom; if (delta < 0) extents.top += delta; delta = workArea.top () - extents.top; if (delta > 0) extents.top += delta; pos.setX (extents.left + border.left); pos.setY (extents.top + border.top); return pos; } CompPoint cp::getViewportRelativeCoordinates (const cw::Geometry &geom, const CompSize &screen) { /* left, right, top, bottom target coordinates, clamed to viewport * sizes as we don't need to validate movements to other viewports; * we are only interested in inner-viewport movements */ int x = geom.x () % screen.width (); if ((geom.x2 ()) < 0) x += screen.width (); int y = geom.y () % screen.height (); if ((geom.y2 ()) < 0) y += screen.height (); return CompPoint (x, y); } CompWindowExtents cp::getWindowEdgePositions (const CompPoint &position, const cw::Geometry &geom, const CompWindowExtents &border) { CompWindowExtents edgePositions; edgePositions.left = position.x () - border.left; edgePositions.right = edgePositions.left + geom.widthIncBorders () + (border.left + border.right); edgePositions.top = position.y () - border.top; edgePositions.bottom = edgePositions.top + geom.heightIncBorders () + (border.top + border.bottom); return edgePositions; } void cp::clampHorizontalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea) { if ((edgePositions.right - edgePositions.left) > workArea.width ()) { edgePositions.left = workArea.left (); edgePositions.right = workArea.right (); } else { if (edgePositions.left < workArea.left ()) { edgePositions.right += workArea.left () - edgePositions.left; edgePositions.left = workArea.left (); } if (edgePositions.right > workArea.right ()) { edgePositions.left -= edgePositions.right - workArea.right (); edgePositions.right = workArea.right (); } } } void cp::clampVerticalEdgePositionsToWorkArea (CompWindowExtents &edgePositions, const CompRect &workArea) { if ((edgePositions.bottom - edgePositions.top) > workArea.height ()) { edgePositions.top = workArea.top (); edgePositions.bottom = workArea.bottom (); } else { if (edgePositions.top < workArea.top ()) { edgePositions.bottom += workArea.top () - edgePositions.top; edgePositions.top = workArea.top (); } if (edgePositions.bottom > workArea.bottom ()) { edgePositions.top -= edgePositions.bottom - workArea.bottom (); edgePositions.bottom = workArea.bottom (); } } } void cp::subtractBordersFromEdgePositions (CompWindowExtents &edgePositions, const CompWindowExtents &border, unsigned int legacyBorder) { const unsigned int doubleBorder = 2 * legacyBorder; edgePositions.left += border.left; edgePositions.right -= border.right + doubleBorder; edgePositions.top += border.top; edgePositions.bottom -= border.bottom + doubleBorder; } bool cp::onlySizeChanged (unsigned int mask) { return (!(mask & (CWX | CWY)) && (mask & (CWWidth | CWHeight))); } bool cp::applyWidthChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask) { bool alreadySet = mask & CWWidth; if (alreadySet) alreadySet = edgePositions.right - edgePositions.left == xwc.width; if (!alreadySet) { xwc.width = edgePositions.right - edgePositions.left; mask |= CWWidth; return true; } return false; } bool cp::applyHeightChange (const CompWindowExtents &edgePositions, XWindowChanges &xwc, unsigned int &mask) { bool alreadySet = mask & CWHeight; if (alreadySet) alreadySet = edgePositions.bottom - edgePositions.top == xwc.height; if (!alreadySet) { xwc.height = edgePositions.bottom - edgePositions.top; mask |= CWHeight; return true; } return false; } ./plugins/place/src/constrain-to-workarea/tests/0000755000004100000410000000000013246301624022173 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/tests/CMakeLists.txt0000644000004100000410000000134413246301623024734 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_place_constrain_to_workarea_test ${CMAKE_CURRENT_SOURCE_DIR}/test-constrain-to-workarea.cpp) add_executable (compiz_test_place_constrain_to_workarea ${CMAKE_CURRENT_SOURCE_DIR}/constrain-to-workarea/src/test-place-constrain-to-workarea.cpp) target_link_libraries (compiz_test_place_constrain_to_workarea compiz_place_constrain_to_workarea_test compiz_place_constrain_to_workarea ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_place_constrain_to_workarea COVERAGE compiz_place_constrain_to_workarea) ./plugins/place/src/constrain-to-workarea/tests/test-constrain-to-workarea.cpp0000644000004100000410000000237013246301623030106 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-constrain-to-workarea.h" ./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/0000755000004100000410000000000013246301624026424 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/0000755000004100000410000000000013246301624027213 5ustar www-datawww-data./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/CMakeLists.txt0000644000004100000410000000212013246301623031745 0ustar www-datawww-datalink_directories (${COMPIZ_TEST_PLACE_LINK_DIRS}) include_directories (${COMPIZ_TEST_PLACE_INCLUDE_DIRS} ${compiz_SOURCE_DIR}/include ${compiz_BINARY_DIR} ${compiz_BINARY_DIR}/generated ${compiz_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/plugins/place/src ${compiz_SOURCE_DIR}/src/window/geometry/include/ ${compiz_SOURCE_DIR}/src/window/geometry-saver/include/ ${compiz_SOURCE_DIR}/src/window/extents/include/ ${compiz_SOURCE_DIR}/src/point/include/ ${compiz_SOURCE_DIR}/src/rect/include/ ${COMPIZ_PLACE_TEST_BASE_DIR}) add_executable (test-place-clamp-to-workarea test-place-constrain-to-workarea.cpp ../test-place.cpp ${compiz_SOURCE_DIR}/plugins/place/src/constrain-to-workarea.cpp ${compiz_SOURCE_DIR}/src/size.cpp) target_link_libraries (test-place-clamp-to-workarea compiz_window_geometry compiz_window_extents compiz_point compiz_rect ${COMPIZ_TEST_PLACE_LIBRARIES}) add_test (test-place-clamp-to-workarea ${CMAKE_CURRENT_BINARY_DIR}/test-place-clamp-to-workarea) ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootroot./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/test-place-constrain-to-workarea.cpp./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/src/test-place-constrain-to-wo0000644000004100000410000003702013246301623034241 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include namespace cw = compiz::window; namespace cwe = cw::extents; namespace cp = compiz::place; using ::testing::WithParamInterface; using ::testing::ValuesIn; using ::testing::Combine; class PlaceClampGeometryToWorkArea : public CompPlaceTest { public: PlaceClampGeometryToWorkArea () : screensize (1000, 2000), workArea (50, 50, 900, 1900), flags (0) { memset (&extents, 0, sizeof (cwe::Extents)); } protected: CompSize screensize; CompRect workArea; cw::Geometry g; cwe::Extents extents; unsigned int flags; }; namespace { const cw::Geometry LimitOfAllowedGeometry (50, 50, 900, 1900, 0); } namespace compiz { namespace window { std::ostream & operator<<(std::ostream &os, const Geometry &g) { return os << "Window Geometry: (" << g.x () << ", " << g.y () << ", " << g.width () << ", " << g.height () << ", " << g.border () << ")"; } namespace extents { std::ostream & operator<<(std::ostream &os, const Extents &e) { return os << "Window Extents: (left: " << e.left << ", right: " << e.right << ", top: " << e.top << ", bottom: " << e.bottom << ")"; } } } } std::ostream & operator<<(std::ostream &os, const CompPoint &p) { return os << "Point: (" << p.x () << ", " << p.y () << ")"; } TEST_F (PlaceClampGeometryToWorkArea, NoConstrainmentRequired) { g = cw::Geometry (100, 100, 200, 200, 0); /* Do nothing */ cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, cw::Geometry (100, 100, 200, 200, 0)); } TEST_F (PlaceClampGeometryToWorkArea, LargerThanWorkAreaConstrainsToWorkAreaSize) { /* Larger than workArea */ g = cw::Geometry (50, 50, 950, 1950, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideTopLeftConstrainment) { /* Outside top left */ g = cw::Geometry (0, 0, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideTopRightConstrainment) { /* Outside top right */ g = cw::Geometry (100, 0, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideBottomLeftConstrainment) { /* Outside bottom left */ g = cw::Geometry (0, 100, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, OutsideBottomRightConstrainment) { /* Outside bottom right */ g = cw::Geometry (100, 100, 900, 1900, 0); cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } TEST_F (PlaceClampGeometryToWorkArea, NoChangePositionIfSizeUnchanged) { /* For the size only case, we should not * change the position of the window if * the size does not change */ g = cw::Geometry (0, 0, 900, 1900, 0); flags = cp::clampGeometrySizeOnly; cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, cw::Geometry (0, 0, 900, 1900, 0)); } TEST_F (PlaceClampGeometryToWorkArea, ChangePositionIfSizeChanged) { g = cw::Geometry (0, 0, 1000, 2000, 0); flags = cp::clampGeometrySizeOnly; cp::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, LimitOfAllowedGeometry); } namespace { typedef std::tr1::tuple ConstrainPositionToWorkAreaParam; const cw::Geometry & WindowGeometry (const ConstrainPositionToWorkAreaParam &p) { return std::tr1::get <0> (p); } const cwe::Extents & WindowExtents (const ConstrainPositionToWorkAreaParam &p) { return std::tr1::get <1> (p); } CompPoint InitialPosition (const ConstrainPositionToWorkAreaParam &p) { /* Initial position is where the window is right now */ return (std::tr1::get <0> (p)).pos (); } const CompRect WArea (50, 50, 900, 1900); const CompPoint ExpectedPosition (WArea.pos ()); } class PlaceConstrainPositionToWorkArea : public CompPlaceTest, public WithParamInterface { public: PlaceConstrainPositionToWorkArea () { memset (&extents, 0, sizeof (cwe::Extents)); } protected: CompRect workArea; cw::Geometry g; cwe::Extents extents; }; TEST_P (PlaceConstrainPositionToWorkArea, PositionConstrainedWithExtents) { g = WindowGeometry (GetParam ()); extents = WindowExtents (GetParam ()); CompPoint pos = InitialPosition (GetParam ()); pos = cp::constrainPositionToWorkArea (pos, g, extents, WArea); const CompPoint expectedAfterExtentsAdjustment = ExpectedPosition + CompPoint (extents.left, extents.top); EXPECT_EQ (expectedAfterExtentsAdjustment, pos); } namespace { cwe::Extents PossibleExtents[] = { cwe::Extents (0, 0, 0, 0), cwe::Extents (1, 0, 0, 0), cwe::Extents (0, 1, 0, 0), cwe::Extents (0, 0, 1, 0), cwe::Extents (0, 0, 0, 1) }; cw::Geometry PossibleGeometries[] = { cw::Geometry (WArea.x (), WArea.y (), WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x () - 1, WArea.y (), WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x (), WArea.y () - 1, WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x () + 1, WArea.y (), WArea.width (), WArea.height (), 0), cw::Geometry (WArea.x (), WArea.y () + 1, WArea.width (), WArea.height (), 0) }; } INSTANTIATE_TEST_CASE_P (PlacementData, PlaceConstrainPositionToWorkArea, Combine (ValuesIn (PossibleGeometries), ValuesIn (PossibleExtents))); class PlaceGetEdgePositions : public CompPlaceTest { public: PlaceGetEdgePositions () : geom (100, 200, 300, 400, 1), border (1, 2, 3, 4), pos (geom.pos ()) { } protected: cw::Geometry geom; cwe::Extents border; CompPoint pos; }; TEST_F (PlaceGetEdgePositions, GetEdgePositions) { int left = geom.x () - border.left; int right = left + (geom.widthIncBorders ()) + (border.left + border.right); int top = geom.y () - border.top; int bottom = top + (geom.heightIncBorders ()) + (border.top + border.bottom); const cwe::Extents ExpectedExtents (left, right, top, bottom); cwe::Extents actualExtents (cp::getWindowEdgePositions (pos, geom, border)); EXPECT_EQ (ExpectedExtents, actualExtents); } namespace { const CompSize SCREEN_SIZE (1000, 1000); const unsigned int WINDOW_SIZE = 250; } TEST (PlaceGetViewportRelativeCoordinates, WithinScreenWidth) { cw::Geometry geom (SCREEN_SIZE.width () / 2, SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (geom.pos ().x (), position.x ()); } TEST (PlaceGetViewportRelativeCoordinates, WithinScreenHeight) { cw::Geometry geom (SCREEN_SIZE.width () / 2, SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (geom.pos ().y (), position.y ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideOuterScreenWidth) { cw::Geometry geom (SCREEN_SIZE.width () + 1, SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (1, position.x ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideInnerScreenWidth) { cw::Geometry geom (-(WINDOW_SIZE + 1), SCREEN_SIZE.height () / 2, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (SCREEN_SIZE.width () - (WINDOW_SIZE + 1), position.x ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideOuterScreenHeight) { cw::Geometry geom (SCREEN_SIZE.width () / 2, SCREEN_SIZE.height () + 1, WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (1, position.y ()); } TEST (PlaceGetViewportRelativeCoordinates, OutsideInnerScreenHeight) { cw::Geometry geom (SCREEN_SIZE.width () / 2, -(WINDOW_SIZE + 1), WINDOW_SIZE, WINDOW_SIZE, 0); CompPoint position (cp::getViewportRelativeCoordinates (geom, SCREEN_SIZE)); EXPECT_EQ (SCREEN_SIZE.height () - (WINDOW_SIZE + 1), position.y ()); } namespace { const CompRect WORK_AREA (25, 25, 1000, 1000); const cwe::Extents EdgePositions[] = { /* Exact match */ cwe::Extents (WORK_AREA.left (), WORK_AREA.right (), WORK_AREA.top (), WORK_AREA.bottom ()), /* Just within */ cwe::Extents (WORK_AREA.left () + 1, WORK_AREA.right () - 1, WORK_AREA.top () + 1, WORK_AREA.bottom () - 1), /* Just outside right */ cwe::Extents (WORK_AREA.left () + 1, WORK_AREA.right () + 1, WORK_AREA.top (), WORK_AREA.bottom ()), /* Just outside left */ cwe::Extents (WORK_AREA.left () - 1, WORK_AREA.right () - 1, WORK_AREA.top (), WORK_AREA.bottom ()), /* Just outside top */ cwe::Extents (WORK_AREA.left (), WORK_AREA.right (), WORK_AREA.top () - 1, WORK_AREA.bottom () - 1), /* Just outside bottom */ cwe::Extents (WORK_AREA.left (), WORK_AREA.right (), WORK_AREA.top () + 1, WORK_AREA.bottom () + 1), }; } class PlaceClampEdgePositions : public CompPlaceTest, public WithParamInterface { }; TEST_P (PlaceClampEdgePositions, WithinWorkAreaWidth) { CompWindowExtents edgePositions (GetParam ()); cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, WORK_AREA); const int edgePositionsWidth = edgePositions.right - edgePositions.left; ASSERT_GT (edgePositionsWidth, 0); EXPECT_LE (edgePositionsWidth, WORK_AREA.width ()); } TEST_P (PlaceClampEdgePositions, OutsideLeft) { CompWindowExtents edgePositions (GetParam ()); cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_GE (edgePositions.left, WORK_AREA.left ()); ASSERT_GE (edgePositions.right, WORK_AREA.left ()); } TEST_P (PlaceClampEdgePositions, OutsideRight) { CompWindowExtents edgePositions (GetParam ()); cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_LE (edgePositions.left, WORK_AREA.right ()); ASSERT_LE (edgePositions.right, WORK_AREA.right ()); } TEST_P (PlaceClampEdgePositions, WithinWorkAreaHeight) { CompWindowExtents edgePositions (GetParam ()); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, WORK_AREA); const int edgePositionsHeight = edgePositions.bottom - edgePositions.top; ASSERT_GT (edgePositionsHeight, 0); EXPECT_LE (edgePositionsHeight, WORK_AREA.height ()); } TEST_P (PlaceClampEdgePositions, OutsideTop) { CompWindowExtents edgePositions (GetParam ()); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_GE (edgePositions.top, WORK_AREA.top ()); ASSERT_GE (edgePositions.bottom, WORK_AREA.top ()); } TEST_P (PlaceClampEdgePositions, OutsideBottom) { CompWindowExtents edgePositions (GetParam ()); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, WORK_AREA); ASSERT_LE (edgePositions.top, WORK_AREA.bottom ()); ASSERT_LE (edgePositions.bottom, WORK_AREA.bottom ()); } INSTANTIATE_TEST_CASE_P (WAEdgePositions, PlaceClampEdgePositions, ValuesIn (EdgePositions)); TEST (PlaceSubtractBordersFromEdgePositions, NormalGravity) { const CompWindowExtents borders (1, 2, 3, 4); const CompWindowExtents edgePositions (100, 200, 100, 200); const unsigned int legacyBorder = 1; CompWindowExtents expectedEdgePositions (edgePositions.left + (borders.left), edgePositions.right - (borders.right + 2 * legacyBorder), edgePositions.top + (borders.top), edgePositions.bottom - (borders.bottom + 2 * legacyBorder)); CompWindowExtents modifiedEdgePositions (edgePositions); cp::subtractBordersFromEdgePositions (modifiedEdgePositions, borders, legacyBorder); EXPECT_EQ (expectedEdgePositions, modifiedEdgePositions); } TEST (PlaceSizeAndPositionChanged, PositionChangedReturnsFalse) { EXPECT_FALSE (cp::onlySizeChanged (CWX | CWY)); } TEST (PlaceSizeAndPositionChanged, SizeChangedReturnsTrue) { EXPECT_TRUE (cp::onlySizeChanged (CWWidth | CWHeight)); } TEST (PlaceSizeAndPositionChanged, XAndWidthChangedReturnsFalse) { EXPECT_FALSE (cp::onlySizeChanged (CWX | CWWidth)); } TEST (PlaceSizeAndPositionChanged, YAndHeightChangedReturnsFalse) { EXPECT_FALSE (cp::onlySizeChanged (CWY | CWHeight)); } TEST (PlaceApplyWidthChange, ReturnFalseIfNoChange) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; xwc.width = 100; unsigned int mask = CWWidth; EXPECT_FALSE (cp::applyWidthChange(edgePositions, xwc, mask)); } TEST (PlaceApplyWidthChange, ApplyWidthAndSetFlag) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; unsigned int mask = 0; ASSERT_TRUE (cp::applyWidthChange(edgePositions, xwc, mask)); EXPECT_EQ (edgePositions.right - edgePositions.left, xwc.width); EXPECT_EQ (CWWidth, mask); } TEST (PlaceApplyHeightChange, ReturnFalseIfNoChange) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; xwc.height = 100; unsigned int mask = CWHeight; EXPECT_FALSE (cp::applyHeightChange(edgePositions, xwc, mask)); } TEST (PlaceApplyWidthChange, ApplyHeightAndSetFlag) { CompWindowExtents edgePositions (100, 200, 100, 200); XWindowChanges xwc; unsigned int mask = 0; ASSERT_TRUE (cp::applyHeightChange(edgePositions, xwc, mask)); EXPECT_EQ (edgePositions.bottom - edgePositions.top, xwc.height); EXPECT_EQ (CWHeight, mask); } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootroot./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/test-place-constrain-to-workarea.cpp./plugins/place/src/constrain-to-workarea/tests/constrain-to-workarea/test-place-constrain-to-workar0000644000004100000410000000424313246301623034333 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include class CompPlaceTestConstrainToWorkarea : public CompPlaceTest { public: CompPlaceTestConstrainToWorkarea (); ~CompPlaceTestConstrainToWorkarea (); }; CompPlaceTestConstrainToWorkarea::CompPlaceTestConstrainToWorkarea () { } CompPlaceTestConstrainToWorkarea::~CompPlaceTestConstrainToWorkarea () { } TEST_F(CompPlaceTestConstrainToWorkarea, TestConstrainToWorkarea) { CompSize screensize (1000, 2000); CompRect workArea (50, 50, 900, 1900); compiz::window::Geometry g (100, 100, 200, 200, 0); compiz::window::extents::Extents extents; unsigned int flags = 0; memset (&extents, 0, sizeof (compiz::window::extents::Extents)); /* Do nothing */ compiz::place::clampGeometryToWorkArea (g, workArea, extents, flags, screensize); EXPECT_EQ (g, compiz::window::Geometry (100, 100, 200, 200, 0)); } ./plugins/place/src/constrain-to-workarea/tests/test-constrain-to-workarea.h0000644000004100000410000000310613246301623027551 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_TIMER_H #define _COMPIZ_TEST_TIMER_H #include #include #include #include #include #include #include #include #include #include class CompPlaceTest : public ::testing::Test { }; #endif ./plugins/place/src/place.h0000644000004100000410000001116313246301623016036 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include #include #include #include #include #include #include #include "place_options.h" #include "screen-size-change.h" #include "smart.h" namespace compiz { namespace place { CompWindowList collectStrutWindows (const CompWindowList &allWindows); } } class PlaceScreen : public PluginClassHandler, public ScreenInterface, public PlaceOptions { public: PlaceScreen (CompScreen *); ~PlaceScreen (); void handleEvent (XEvent *event); void doHandleScreenSizeChange (int, int); bool handleScreenSizeChangeFallback (int width, int height); void handleScreenSizeChange (int width, int height); bool getPointerPosition (CompPoint &p); void addSupportedAtoms (std::vector&); CompSize mPrevSize; int mStrutWindowCount; CompTimer mResChangeFallbackHandle; CompWindowList mStrutWindows; Atom fullPlacementAtom; }; #define PLACE_SCREEN(s) \ PlaceScreen *ps = PlaceScreen::get (s) class PlaceWindow : public PluginClassHandler, public compiz::place::ScreenSizeChangeObject, public compiz::place::Placeable, public WindowInterface { public: PlaceWindow (CompWindow *w); ~PlaceWindow (); bool place (CompPoint &pos); CompRect doValidateResizeRequest (unsigned int &, XWindowChanges *, bool, bool); void validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source); void grabNotify (int, int, unsigned int, unsigned int); CompPoint mPrevServer; protected: void applyGeometry (compiz::window::Geometry &ng, compiz::window::Geometry &og); const compiz::window::Geometry & getGeometry () const; const CompPoint & getViewport () const; const CompRect & getWorkarea (const compiz::window::Geometry &g) const; const CompRect & getWorkarea () const; const compiz::window::extents::Extents & getExtents () const; unsigned int getState () const; private: typedef enum { NoPlacement = 0, PlaceOnly, ConstrainOnly, PlaceAndConstrain, PlaceOverParent, PlaceCenteredOnScreen } PlacementStrategy; void doPlacement (CompPoint &pos); bool windowIsPlaceRelevant (CompWindow *w); bool hasUserDefinedPosition (bool); PlacementStrategy getStrategy (); const CompOutput & getPlacementOutput (int mode, PlacementStrategy strategy, CompPoint pos); int getPlacementMode (); void sendMaximizationRequest (); void constrainToWorkarea (const CompRect& workArea, CompPoint& pos); void placeCascade (const CompRect& workArea, CompPoint& pos); void placeCentered (const CompRect& workArea, CompPoint& pos); void placeRandom (const CompRect& workArea, CompPoint& pos); void placePointer (const CompRect& workArea, CompPoint& pos); void placeSmart (CompPoint& pos, const compiz::place::Placeable::Vector &); bool cascadeFindFirstFit (const Placeable::Vector &placeabless, const CompRect& workArea, CompPoint &pos); void cascadeFindNext (const Placeable::Vector &placeables, const CompRect& workArea, CompPoint &pos); bool matchPosition (CompPoint &pos, bool& keepInWorkarea); bool matchViewport (CompPoint &pos); bool matchXYValue (CompOption::Value::Vector &matches, CompOption::Value::Vector &xValues, CompOption::Value::Vector &yValues, CompPoint &pos, CompOption::Value::Vector *constrainValues = NULL, bool *keepInWorkarea = NULL); CompWindow *window; PlaceScreen *ps; }; #define PLACE_WINDOW(w) \ PlaceWindow *pw = PlaceWindow::get (w) class PlacePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/place/src/screen-size-change/0000755000004100000410000000000013246301623020251 5ustar www-datawww-data./plugins/place/src/screen-size-change/CMakeLists.txt0000644000004100000410000000235513246301623023016 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/plugins/place/src/constrain-to-workarea/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/screen-size-change.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/screen-size-change.cpp ) ADD_LIBRARY( compiz_place_screen_size_change STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_place_screen_size_change PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_place_screen_size_change compiz_place_constrain_to_workarea compiz_core ${GLIBMM_LIBRARIES} ) ./plugins/place/src/screen-size-change/include/0000755000004100000410000000000013246301624021675 5ustar www-datawww-data./plugins/place/src/screen-size-change/include/screen-size-change.h0000644000004100000410000000374113246301623025524 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #ifndef _COMPIZ_PLACE_SCREEN_SIZE_CHANGE_H #define _COMPIZ_PLACE_SCREEN_SIZE_CHANGE_H #include #include #include #include #include #include #include "constrain-to-workarea.h" namespace compiz { namespace place { const unsigned int WindowMaximized = 1 << 2; class ScreenSizeChangeObject { public: ScreenSizeChangeObject (const compiz::window::Geometry &g); virtual ~ScreenSizeChangeObject (); virtual const compiz::window::Geometry & getGeometry () const = 0; virtual void applyGeometry (compiz::window::Geometry &ng, compiz::window::Geometry &og) = 0; virtual const CompPoint & getViewport () const = 0; virtual const CompRect & getWorkarea (const compiz::window::Geometry &g) const = 0; virtual const compiz::window::extents::Extents & getExtents () const = 0; virtual unsigned int getState () const = 0; compiz::window::Geometry adjustForSize (const CompSize &oldSize, const CompSize &newSize); void unset (); private: compiz::window::GeometrySaver mSaver; }; } } #endif ./plugins/place/src/screen-size-change/src/0000755000004100000410000000000013246301624021041 5ustar www-datawww-data./plugins/place/src/screen-size-change/src/screen-size-change.cpp0000644000004100000410000001062713246301623025224 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "screen-size-change.h" #include compiz::place::ScreenSizeChangeObject::ScreenSizeChangeObject (const compiz::window::Geometry &g) : mSaver (g) { } compiz::place::ScreenSizeChangeObject::~ScreenSizeChangeObject () { } compiz::window::Geometry compiz::place::ScreenSizeChangeObject::adjustForSize (const CompSize &oldSize, const CompSize &newSize) { int vpX, vpY; compiz::window::Geometry g, vpRelRect; int pivotX, pivotY, pivotWidth, pivotHeight; g = getGeometry (); compiz::window::Geometry og (g); pivotX = g.x (); pivotY = g.y (); /* FIXME: Should use saved geometry for maximized / fullscreen windows */ /* calculate target vp x, y index for window's pivot point */ pivotWidth = (getState () & compiz::place::WindowMaximized) ? newSize.width () : oldSize.width (); pivotHeight = (getState () & compiz::place::WindowMaximized) ? newSize.height () : oldSize.height (); vpX = pivotX / pivotWidth; if (pivotX < 0) vpX -= 1; vpY = pivotY / pivotHeight; if (pivotY < 0) vpY -= 1; unsigned int mask = mSaver.pop (vpRelRect, CHANGE_X | CHANGE_Y | CHANGE_WIDTH | CHANGE_HEIGHT); if (mask) { /* set position/size to saved original rectangle */ g.applyChange (compiz::window::Geometry (vpRelRect.x (), vpRelRect.y (), vpRelRect.width (), vpRelRect.height (), vpRelRect.border ()), mask); } else { /* set position/size to window's current rectangle (with position relative to target viewport) */ vpRelRect.setX (g.x () - vpX * oldSize.width ()); vpRelRect.setY (g.y () - vpY * oldSize.height ()); vpRelRect.setWidth (g.width ()); vpRelRect.setHeight (g.height ()); g = vpRelRect; /* if coords. relative to viewport are outside new viewport area, shift window left/up so that it falls inside */ if (vpRelRect.x () + vpRelRect.width() >= newSize.width ()) g.setX (g.x () - (vpRelRect.x () + vpRelRect.width () - newSize.width ())); if (vpRelRect.y () + vpRelRect.height() >= newSize.height ()) g.setY (g.y () - (vpRelRect.y () + vpRelRect.width () - newSize.height ())); g.setWidth (vpRelRect.width ()); g.setHeight (vpRelRect.height ()); } unsigned int flags = 0; const CompRect &workArea = getWorkarea (g); compiz::place::clampGeometryToWorkArea (g, workArea, getExtents (), flags, newSize); if (!mask) { /* save window geometry (relative to viewport) so that it can be restored later */ mask = getGeometry ().changeMask (g); mSaver.push (vpRelRect, mask); } else { compiz::window::Geometry rg (vpRelRect.x () + vpX * newSize.width (), vpRelRect.y () + vpY * newSize.height (), vpRelRect.width (), vpRelRect.height (), vpRelRect.border ()); /* Don't care about any bits not restored */ rg.applyChange (g, ~mask); /* Push any bits back on the saver * that don't match the requested window geometry * since we will need to restore to them later */ unsigned int remaining = g.changeMask (rg); mSaver.push (vpRelRect, remaining); } g.setX (g.x () + vpX * newSize.width ()); g.setY (g.y () + vpY * newSize.height ()); /* for maximized/fullscreen windows, update saved pos/size XXX, * also pull in the old code to handle maximized windows which * currently can't be implemented yet */ /* actually move/resize window in directions given by mask */ applyGeometry (g, og); return g; } void compiz::place::ScreenSizeChangeObject::unset () { compiz::window::Geometry g; mSaver.pop (g, !0); } ./plugins/place/src/screen-size-change/tests/0000755000004100000410000000000013246301624021414 5ustar www-datawww-data./plugins/place/src/screen-size-change/tests/CMakeLists.txt0000644000004100000410000000130613246301623024153 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_place_screen_size_change_test ${CMAKE_CURRENT_SOURCE_DIR}/test-screen-size-change.cpp) add_executable (compiz_test_place_screen_size_change ${CMAKE_CURRENT_SOURCE_DIR}/screen-size-change/src/test-place-screen-size-change.cpp) target_link_libraries (compiz_test_place_screen_size_change compiz_place_screen_size_change_test compiz_place_screen_size_change ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_place_screen_size_change COVERAGE compiz_place_screen_size_change) ./plugins/place/src/screen-size-change/tests/test-screen-size-change.h0000644000004100000410000000321013246301623026207 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_PLACE_SCREEN_SIZE_CHANGE_H #define _COMPIZ_TEST_PLACE_SCREEN_SIZE_CHANGE_H #include #include #include #include #include #include #include #include #include #include class CompPlaceScreenSizeChangeTest : public ::testing::Test { public: }; #endif ./plugins/place/src/screen-size-change/tests/screen-size-change/0000755000004100000410000000000013246301623025065 5ustar www-datawww-data./plugins/place/src/screen-size-change/tests/screen-size-change/src/0000755000004100000410000000000013246301624025655 5ustar www-datawww-data././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootroot./plugins/place/src/screen-size-change/tests/screen-size-change/src/test-place-screen-size-change.cpp./plugins/place/src/screen-size-change/tests/screen-size-change/src/test-place-screen-size-change.cp0000644000004100000410000005010413246301623033711 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include namespace cp = compiz::place; namespace cw = compiz::window; namespace compiz { namespace window { std::ostream & operator<< (std::ostream &os, const Geometry &g) { return os << "compiz::window::Geometry " << std::endl << " - x: " << g.x () << std::endl << " - y: " << g.y () << std::endl << " - width: " << g.width () << std::endl << " - height: " << g.height () << std::endl << " - border: " << g.border (); } } } namespace { class StubScreenSizeChangeObject : public cp::ScreenSizeChangeObject { public: StubScreenSizeChangeObject (const cw::Geometry &); ~StubScreenSizeChangeObject (); const cw::Geometry & getGeometry () const; void applyGeometry (cw::Geometry &n, cw::Geometry &o); const CompPoint & getViewport () const; const CompRect & getWorkarea (const cw::Geometry &g) const; const cw::extents::Extents & getExtents () const; unsigned int getState () const; void setWorkArea (const CompRect &); void setGeometry (const cw::Geometry &g); cw::Geometry sizeAdjustTest (const CompSize &oldSize, const CompSize &newSize); private: CompPoint mCurrentVp; CompRect mCurrentWorkArea; cw::extents::Extents mCurrentExtents; cw::Geometry mCurrentGeometry; }; const unsigned int MOCK_STRUT_SIZE = 24; const unsigned int WIDESCREEN_MONITOR_WIDTH = 1280; const unsigned int TALLER_MONITOR_HEIGHT = 1050; const unsigned int MONITOR_WIDTH = 1024; const unsigned int MONITOR_HEIGHT = 768; const unsigned int DUAL_MONITOR_WIDTH = MONITOR_WIDTH * 2; const unsigned int DUAL_MONITOR_HEIGHT = MONITOR_HEIGHT * 2; const unsigned int WINDOW_WIDTH = 300; const unsigned int WINDOW_HEIGHT = 400; const unsigned int WINDOW_X = (MONITOR_WIDTH / 2) - (WINDOW_WIDTH / 2); const unsigned int WINDOW_Y = (MONITOR_HEIGHT / 2) - (WINDOW_HEIGHT / 2); void reserveStruts (CompRect &workArea, unsigned int strutSize) { workArea.setLeft (workArea.left () + strutSize); workArea.setTop (workArea.top () + strutSize); workArea.setBottom (workArea.bottom () - strutSize); } } class PlaceScreenSizeChange : public CompPlaceScreenSizeChangeTest { protected: PlaceScreenSizeChange () : windowGeometryBeforeChange (), stubScreenSizeChangeObject (windowGeometryBeforeChange) { } cw::Geometry ChangeScreenSizeAndAdjustWindow (const CompSize &newSize); void SetWindowGeometry (const cw::Geometry &geometry); void SetInitialScreenSize (const CompSize &size); cw::Geometry GetInitialWindowGeometry (); private: CompSize screenSizeAfterChange; CompSize screenSizeBeforeChange; cw::Geometry windowGeometryBeforeChange; StubScreenSizeChangeObject stubScreenSizeChangeObject; }; cw::Geometry PlaceScreenSizeChange::GetInitialWindowGeometry () { return windowGeometryBeforeChange; } void PlaceScreenSizeChange::SetInitialScreenSize (const CompSize &size) { screenSizeBeforeChange = size; } void PlaceScreenSizeChange::SetWindowGeometry (const compiz::window::Geometry &geometry) { windowGeometryBeforeChange = geometry; stubScreenSizeChangeObject.setGeometry (windowGeometryBeforeChange); } cw::Geometry PlaceScreenSizeChange::ChangeScreenSizeAndAdjustWindow (const CompSize &newSize) { cw::Geometry g (stubScreenSizeChangeObject.sizeAdjustTest (screenSizeBeforeChange, newSize)); screenSizeBeforeChange = newSize; return g; } StubScreenSizeChangeObject::StubScreenSizeChangeObject (const cw::Geometry &g) : ScreenSizeChangeObject (g), mCurrentVp (0, 0), mCurrentWorkArea (50, 50, 1000, 1000), mCurrentGeometry (g) { memset (&mCurrentExtents, 0, sizeof (cw::extents::Extents)); } StubScreenSizeChangeObject::~StubScreenSizeChangeObject () { } const cw::Geometry & StubScreenSizeChangeObject::getGeometry () const { return mCurrentGeometry; } void StubScreenSizeChangeObject::applyGeometry (cw::Geometry &n, cw::Geometry &o) { ASSERT_EQ (mCurrentGeometry, o) << "incorrect usage of applyGeometry"; mCurrentGeometry = n; } const CompPoint & StubScreenSizeChangeObject::getViewport () const { return mCurrentVp; } const CompRect & StubScreenSizeChangeObject::getWorkarea (const cw::Geometry &g) const { return mCurrentWorkArea; } const cw::extents::Extents & StubScreenSizeChangeObject::getExtents () const { return mCurrentExtents; } unsigned int StubScreenSizeChangeObject::getState () const { return 0; } void StubScreenSizeChangeObject::setWorkArea (const CompRect &wa) { mCurrentWorkArea = wa; } void StubScreenSizeChangeObject::setGeometry (const cw::Geometry &g) { mCurrentGeometry = g; } cw::Geometry StubScreenSizeChangeObject::sizeAdjustTest (const CompSize &oldSize, const CompSize &newSize) { CompRect workArea (0, 0, newSize.width (), newSize.height ()); /* Reserve top, bottom and left parts of the screen for * fake "24px" panels */ reserveStruts (workArea, MOCK_STRUT_SIZE); setWorkArea (workArea); cw::Geometry g = adjustForSize (oldSize, newSize); return g; } TEST_F (PlaceScreenSizeChange, NoMovementOnSmallerWidth) { SetInitialScreenSize (CompSize (WIDESCREEN_MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* First test that changing the screen size * to something smaller here doesn't cause our * (small) window to be moved */ cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, NoMovementOnSmallerHeight) { SetInitialScreenSize (CompSize (MONITOR_WIDTH, TALLER_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* First test that changing the screen size * to something smaller here doesn't cause our * (small) window to be moved */ cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, NoMovementOnLargerSize) { SetInitialScreenSize (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Making the screen size bigger with no * saved geometry should cause the window not to move */ cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedToEdgeOfRemainingMonitorOnUnplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the other "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); /* The window should be exactly on-screen at the edge */ cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH - WINDOW_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedBackToOriginalPositionOnReplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Move the window to the other "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); /* Re-plug the monitor - window should go back * to the same position */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Window should be at the same position we left it at */ cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedBackToOriginalPositionOnExpansion) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, MONITOR_HEIGHT)); /* Re-plug the monitor */ ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Plug 2 monitors downwards, no change */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, NoOverlapStrutsOnRePlacement) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the bottom "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug bottom "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT - WINDOW_HEIGHT - MOCK_STRUT_SIZE, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, MovedToOriginalPositionOnPerpendicularExpansion) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the bottom "monitor" */ SetWindowGeometry (cw::Geometry (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug bottom "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, MONITOR_HEIGHT)); /* Re-plug bottom "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnSecondViewportWhenConstraineToFirst) { /* Unplug a "monitor" */ SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the entire window right a viewport */ SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + (MONITOR_WIDTH - WINDOW_WIDTH), WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); /* Now change the screen resolution again - the window should * move to be within the constrained size of its current * viewport */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnSecondViewportAfterMovedToOriginalPosition) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the entire window right a viewport */ SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug a "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Replug the monitor, make sure that the geometry is restored */ cw::Geometry expectedWindowGeometryAfterChange (DUAL_MONITOR_WIDTH + MONITOR_WIDTH + WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainAtOriginalPositionOnSecondViewportUnplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainAtOriginalPositionOnSecondViewportReplug) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); SetWindowGeometry (cw::Geometry (DUAL_MONITOR_WIDTH + WINDOW_X, MONITOR_HEIGHT + WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Replug the monitor and move the window to where it fits on the first * monitor on the second viewport, then make sure it doesn't move */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportWhenMovedToFirstMonitor) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Deal with the case where the position is negative, which means * it's actually wrapped around to the rightmost viewport */ SetWindowGeometry (cw::Geometry (WINDOW_X - MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug the right "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (-WINDOW_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportWhenRestored) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Deal with the case where the position is negative, which means * it's actually wrapped around to the rightmost viewport */ SetWindowGeometry (cw::Geometry (WINDOW_X - MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); /* Unplug the right "monitor" */ ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Re-plug the right "monitor" */ cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportFirstMonitor) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the left monitor, verify that it survives an * unplug/plug cycle */ SetWindowGeometry (cw::Geometry (WINDOW_X - DUAL_MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange (WINDOW_X - MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } TEST_F (PlaceScreenSizeChange, RemainOnPreviousViewportFirstMonitorWhenRestored) { SetInitialScreenSize (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); /* Move the window to the left monitor, verify that it survives an * unplug/plug cycle */ SetWindowGeometry (cw::Geometry (WINDOW_X - DUAL_MONITOR_WIDTH, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, 0)); ChangeScreenSizeAndAdjustWindow (CompSize (MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry windowGeometryAfterChange = ChangeScreenSizeAndAdjustWindow (CompSize (DUAL_MONITOR_WIDTH, DUAL_MONITOR_HEIGHT)); cw::Geometry expectedWindowGeometryAfterChange = GetInitialWindowGeometry (); EXPECT_EQ (expectedWindowGeometryAfterChange, windowGeometryAfterChange); } ./plugins/place/src/screen-size-change/tests/test-screen-size-change.cpp0000644000004100000410000000236513246301623026554 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-screen-size-change.h" ./plugins/place/src/smart/0000755000004100000410000000000013246301623015725 5ustar www-datawww-data./plugins/place/src/smart/CMakeLists.txt0000644000004100000410000000210013246301623020456 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/smart.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/smart.cpp ) ADD_LIBRARY( compiz_place_smart STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_place_smart PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_place_smart compiz_core ${GLIBMM_LIBRARIES} ) ./plugins/place/src/smart/include/0000755000004100000410000000000013246301624017351 5ustar www-datawww-data./plugins/place/src/smart/include/smart.h0000644000004100000410000000401013246301623020642 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #ifndef _COMPIZ_PLACE_SMART_H #define _COMPIZ_PLACE_SMART_H #include #include #include #include #include #include namespace compiz { namespace place { extern const unsigned int WindowAbove; extern const unsigned int WindowBelow; class Placeable { public: typedef std::vector Vector; const compiz::window::Geometry & geometry () const { return getGeometry (); } const compiz::window::extents::Extents & extents () const { return getExtents (); } const CompRect & workArea () const { return getWorkarea (); } unsigned int state () const { return getState (); } virtual ~Placeable () = 0; protected: virtual const compiz::window::Geometry & getGeometry () const = 0; virtual const compiz::window::extents::Extents & getExtents () const = 0; virtual const CompRect & getWorkarea () const = 0; virtual unsigned int getState () const = 0; Placeable (); }; void smart (Placeable *placeable, CompPoint &pos, const compiz::place::Placeable::Vector &placeables); } } #endif ./plugins/place/src/smart/src/0000755000004100000410000000000013246301624016515 5ustar www-datawww-data./plugins/place/src/smart/src/smart.cpp0000644000004100000410000001305413246301623020351 0ustar www-datawww-data#include "smart.h" #include #ifndef foreach #define foreach BOOST_FOREACH #endif /* overlap types */ static const unsigned short NONE = 0; static const short H_WRONG = -1; static const short W_WRONG = -2; namespace compiz { namespace place { const unsigned int WindowAbove = 1 << 0; const unsigned int WindowBelow = 1 << 1; Placeable::Placeable () { } Placeable::~Placeable () { } void smart (Placeable *placeable, CompPoint &pos, const compiz::place::Placeable::Vector &placeables) { /* * SmartPlacement by Cristian Tibirna (tibirna@kde.org) * adapted for kwm (16-19jan98) and for kwin (16Nov1999) using (with * permission) ideas from fvwm, authored by * Anthony Martin (amartin@engr.csulb.edu). * Xinerama supported added by Balaji Ramani (balaji@yablibli.com) * with ideas from xfce. * adapted for Compiz by Bellegarde Cedric (gnumdk(at)gmail.com) */ int overlap = 0, minOverlap = 0; /* temp holder */ int basket = 0; /* CT lame flag. Don't like it. What else would do? */ bool firstPass = true; /* get the maximum allowed windows space */ int xTmp = placeable->workArea ().x (); int yTmp = placeable->workArea ().y (); /* client gabarit */ int cw = placeable->geometry ().width () - 1; int ch = placeable->geometry ().height () - 1; int xOptimal = xTmp; int yOptimal = yTmp; /* loop over possible positions */ do { /* test if enough room in x and y directions */ if (yTmp + ch > placeable->workArea ().bottom () && ch < placeable->workArea ().height ()) overlap = H_WRONG; /* this throws the algorithm to an exit */ else if (xTmp + cw > placeable->workArea ().right ()) overlap = W_WRONG; else { overlap = NONE; /* initialize */ int cxl = xTmp; int cxr = xTmp + cw; int cyt = yTmp; int cyb = yTmp + ch; foreach (Placeable *p, placeables) { const compiz::window::Geometry &otherGeometry = p->geometry (); const compiz::window::extents::Extents &otherExtents = p->extents (); int xl = otherGeometry.x () - otherExtents.left; int yt = otherGeometry.y () - otherExtents.top; int xr = otherGeometry.x2 () + otherExtents.right + otherGeometry.border () * 2; int yb = otherGeometry.y2 () + otherExtents.bottom + otherGeometry.border () * 2; /* if windows overlap, calc the overall overlapping */ if (cxl < xr && cxr > xl && cyt < yb && cyb > yt) { xl = MAX (cxl, xl); xr = MIN (cxr, xr); yt = MAX (cyt, yt); yb = MIN (cyb, yb); if (p->state () & compiz::place::WindowAbove) overlap += 16 * (xr - xl) * (yb - yt); else if (p->state () & compiz::place::WindowBelow) overlap += 0; else overlap += (xr - xl) * (yb - yt); } } } /* CT first time we get no overlap we stop */ if (overlap == NONE) { xOptimal = xTmp; yOptimal = yTmp; break; } if (firstPass) { firstPass = false; minOverlap = overlap; } /* CT save the best position and the minimum overlap up to now */ else if (overlap >= NONE && overlap < minOverlap) { minOverlap = overlap; xOptimal = xTmp; yOptimal = yTmp; } /* really need to loop? test if there's any overlap */ if (overlap > NONE) { int possible = placeable->workArea ().right (); if (possible - cw > xTmp) possible -= cw; /* compare to the position of each client on the same desk */ foreach (Placeable *p, placeables) { const compiz::window::Geometry &otherGeometry = p->geometry (); const compiz::window::extents::Extents &otherExtents = p->extents (); int xl = otherGeometry.x () - otherExtents.left; int yt = otherGeometry.y () - otherExtents.top; int xr = otherGeometry.x2 () + otherExtents.right + otherGeometry.border () * 2; int yb = otherGeometry.y2 () + otherExtents.bottom + otherGeometry.border () * 2; /* if not enough room above or under the current * client determine the first non-overlapped x position */ if (yTmp < yb && yt < ch + yTmp) { if (xr > xTmp && possible > xr) possible = xr; basket = xl - cw; if (basket > xTmp && possible > basket) possible = basket; } } xTmp = possible; } /* else ==> not enough x dimension (overlap was wrong on horizontal) */ else if (overlap == W_WRONG) { xTmp = placeable->workArea ().x (); int possible = placeable->workArea ().bottom (); if (possible - ch > yTmp) possible -= ch; /* test the position of each window on the desk */ foreach (Placeable *p, placeables) { const compiz::window::Geometry &otherGeometry = p->geometry (); const compiz::window::extents::Extents &otherExtents = p->extents (); int yt = otherGeometry.y () - otherExtents.top; int yb = otherGeometry.y2 () + otherExtents.bottom + otherGeometry.border () * 2; /* if not enough room to the left or right of the current * client determine the first non-overlapped y position */ if (yb > yTmp && possible > yb) possible = yb; basket = yt - ch; if (basket > yTmp && possible > basket) possible = basket; } yTmp = possible; } } while (overlap != NONE && overlap != H_WRONG && yTmp < placeable->workArea ().bottom ()); if (ch >= placeable->workArea ().height ()) yOptimal = placeable->workArea ().y (); pos.setX (xOptimal + placeable->extents ().left); pos.setY (yOptimal + placeable->extents ().top); } } } ./plugins/place/src/smart/tests/0000755000004100000410000000000013246301623017067 5ustar www-datawww-data./plugins/place/src/smart/tests/CMakeLists.txt0000644000004100000410000000072413246301623021632 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_executable (compiz_test_place_smart_on_screen ${CMAKE_CURRENT_SOURCE_DIR}/offscreen/src/test-place-smart-on-screen.cpp) target_link_libraries (compiz_test_place_smart_on_screen compiz_place_smart ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_place_smart_on_screen COVERAGE compiz_place_smart) ./plugins/place/src/smart/tests/offscreen/0000755000004100000410000000000013246301623021041 5ustar www-datawww-data./plugins/place/src/smart/tests/offscreen/src/0000755000004100000410000000000013246301624021631 5ustar www-datawww-data./plugins/place/src/smart/tests/offscreen/src/test-place-smart-onscren.cpp0000644000004100000410000000645413246301623027177 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include "smart.h" #include #include #include class CompPlaceSmartOffscreenTest : public ::testing::Test { }; class MockPlaceableObject : public compiz::place::Placeable { public: MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas); const compiz::window::Geometry & getGeometry () const { return mGeometry; } const CompRect & getWorkarea () const { return *mWorkarea; } const compiz::window::extents::Extents & getExtents () const { return mExtents; } private: compiz::window::Geometry mGeometry; CompRect *mWorkarea; compiz::window::extents::Extents mExtents; } MockPlaceableObject::MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas) : compiz::place::Placeable::Placeable (), mGeometry (geometry), mExtents (extents) { unsigned int areaMax = 0; CompRect *running = availableWorkareas.front (); /* Pick the workarea that we best intersect */ foreach (CompRect *rect, availableWorkareas) { unsigned int area = abs ((*rect & static_cast (geometry)).area ()); if (area > areaMax) { running = rect; areaMax = area; } } mWorkarea = running; } TEST_F(CompPlaceSmartOffscreenTest, TestOffscreenOne) { CompRect wa1 (0, 24, 1680, 1026); CompRect wa2 (1680, 24, 1024, 744); compiz::place::Placeable::Vector v; std::vector workAreas; workAreas.push_back (&wa1); workAreas.push_back (&wa2); /* Intersects 1 */ compiz::window::Geometry g (0, 0, 640, 480); compiz::window::extents::Extents e (10, 10, 10, 10); MockPlaceableObject p (g, e, workAreas); CompPoint pos (g.x (), g.y ()); compiz::place::smart (p, pos, v); std::cout << pos.x () << pos.y () << std::endl; EXPECT_EQ (pos, CompPoint (0, 0)); } ./plugins/place/src/smart/tests/offscreen/src/test-place-smart-on-screen.cpp0000644000004100000410000001050613246301623027412 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include "smart.h" #include #include #include #include #ifndef foreach #define foreach BOOST_FOREACH #endif class CompPlaceSmartOffscreenTest : public ::testing::Test { }; class MockPlaceableObject : public compiz::place::Placeable { public: MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas); const compiz::window::Geometry & getGeometry () const { return mGeometry; } const CompRect & getWorkarea () const { return *mWorkarea; } const compiz::window::extents::Extents & getExtents () const { return mExtents; } unsigned int getState () const { return 0; } private: compiz::window::Geometry mGeometry; CompRect *mWorkarea; compiz::window::extents::Extents mExtents; }; MockPlaceableObject::MockPlaceableObject (const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &extents, const std::vector &availableWorkareas) : compiz::place::Placeable::Placeable (), mGeometry (geometry), mExtents (extents) { unsigned int areaMax = 0; CompRect *running = availableWorkareas.front (); /* Pick the workarea that we best intersect */ foreach (CompRect *rect, availableWorkareas) { unsigned int area = abs ((*rect & static_cast (geometry)).area ()); if (area > areaMax) { running = rect; areaMax = area; } } mWorkarea = running; } TEST_F(CompPlaceSmartOffscreenTest, TestOffscreenOne) { CompRect wa1 (0, 24, 1680, 1026); CompRect wa2 (1680, 24, 1024, 744); compiz::place::Placeable::Vector v; std::vector workAreas; workAreas.push_back (&wa1); workAreas.push_back (&wa2); /* Intersects 1 */ compiz::window::Geometry g (0, 0, 640, 480, 0); compiz::window::extents::Extents e; e.left = 10; e.right = 10; e.top = 10; e.bottom = 10; MockPlaceableObject p (g, e, workAreas); CompPoint pos (g.x (), g.y ()); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (10, 34)); /* Intersects 2 */ g = compiz::window::Geometry (1681, 0, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (1690, 34)); /* Intersects 2 partially */ g = compiz::window::Geometry (1681, 500, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (1690, 34)); /* Intersects 1 + 2 partially (1 more) */ g = compiz::window::Geometry (1300, 500, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (10, 34)); /* Intersects 1 + 2 partially (2 more) */ g = compiz::window::Geometry (1600, 500, 640, 480, 0); p = MockPlaceableObject (g, e, workAreas); compiz::place::smart (&p, pos, v); EXPECT_EQ (pos, CompPoint (1690, 34)); } ./plugins/place/src/place.cpp0000644000004100000410000010277613246301623016404 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include "place.h" COMPIZ_PLUGIN_20090315 (place, PlacePluginVTable) namespace cp = compiz::place; #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} PlaceScreen::PlaceScreen (CompScreen *screen) : PluginClassHandler (screen), mPrevSize (screen->width (), screen->height ()), mStrutWindowCount (0), fullPlacementAtom (XInternAtom (screen->dpy (), "_NET_WM_FULL_PLACEMENT", 0)) { ScreenInterface::setHandler (screen); mResChangeFallbackHandle.setTimes (4000, 4500); /* 4 Seconds */ screen->updateSupportedWmHints (); } PlaceScreen::~PlaceScreen () { screen->addSupportedAtomsSetEnabled (this, false); mResChangeFallbackHandle.stop (); screen->updateSupportedWmHints (); } CompWindowList compiz::place::collectStrutWindows (const CompWindowList &all) { CompWindowList l; foreach (CompWindow *w, all) { if (!w->managed () || w->overrideRedirect ()) continue; if (w->struts ()) l.push_back (w); } return l; } void PlaceScreen::doHandleScreenSizeChange (int newWidth, int newHeight) { foreach (CompWindow *w, screen->windows ()) { if (!w->managed ()) continue; if (w->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) continue; PlaceWindow::get (w)->adjustForSize (mPrevSize, CompSize (newWidth, newHeight)); } } const compiz::window::Geometry & PlaceWindow::getGeometry () const { return window->serverGeometry (); } const CompPoint & PlaceWindow::getViewport () const { return screen->vp (); } const CompRect & PlaceWindow::getWorkarea (const compiz::window::Geometry &g) const { return screen->getWorkareaForOutput (screen->outputDeviceForGeometry (g)); } const CompRect & PlaceWindow::getWorkarea () const { return getWorkarea (window->serverGeometry ()); } const compiz::window::extents::Extents & PlaceWindow::getExtents () const { return window->border (); } unsigned int PlaceWindow::getState () const { unsigned int state = 0; if (window->state () & CompWindowStateAboveMask) state |= compiz::place::WindowAbove; if (window->state () & CompWindowStateBelowMask) state |= compiz::place::WindowBelow; if (window->state () & CompWindowStateMaximizedVertMask || window->state () & CompWindowStateMaximizedHorzMask) state |= compiz::place::WindowMaximized; return state; } void PlaceWindow::applyGeometry (compiz::window::Geometry &ng, compiz::window::Geometry &og) { CompRect workArea = screen->getWorkareaForOutput ( screen->outputDeviceForGeometry (og)); XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int mask = og.changeMask (ng); xwc.x = ng.x (); xwc.y = ng.y (); xwc.width = ng.width (); xwc.height = ng.height (); xwc.border_width = ng.border (); window->configureXWindow (mask, &xwc); if ((window->actions () & MAXIMIZE_STATE) == MAXIMIZE_STATE && (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) && !(window->state () & CompWindowStateFullscreenMask)) { if (og.width () >= workArea.width () && og.height () >= workArea.height ()) { sendMaximizationRequest (); } } } bool PlaceScreen::handleScreenSizeChangeFallback (int width, int height) { /* If countdown is not finished yet (i.e. at least one struct window didn't * update its struts), reset the count down and move windows around here */ if (mStrutWindowCount > 0) /* no windows with struts found */ { mStrutWindowCount = 0; doHandleScreenSizeChange (width, height); } return false; } void PlaceScreen::handleScreenSizeChange (int width, int height) { if (mPrevSize == CompSize (width, height)) return; mResChangeFallbackHandle.stop (); mStrutWindows = compiz::place::collectStrutWindows (screen->windows ()); /* Don't wait for strut windows to update if there are none */ if (mStrutWindows.empty ()) doHandleScreenSizeChange (width, height); else { /* Wait for windows with set struts to update their struts, but * if one of them isn't updating them, have a fallback to ignore them */ mResChangeFallbackHandle.setCallback ( boost::bind (&PlaceScreen::handleScreenSizeChangeFallback, this, width, height)); mResChangeFallbackHandle.start (); } } void PlaceScreen::handleEvent (XEvent *event) { if (event->type == ConfigureNotify && event->xconfigure.window == screen->root () && (event->xconfigure.width != screen->width () || event->xconfigure.height != screen->height ())) { mPrevSize.setWidth (screen->width ()); mPrevSize.setHeight (screen->height ()); } screen->handleEvent (event); switch (event->type) { case ConfigureNotify: { if (event->xconfigure.window == screen->root ()) { handleScreenSizeChange (event->xconfigure.width, event->xconfigure.height); } } break; case PropertyNotify: if (event->xproperty.atom == Atoms::wmStrut || event->xproperty.atom == Atoms::wmStrutPartial) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) { if (!mStrutWindows.empty ()) { mStrutWindows.remove (w); /* Only do when handling screen size change. ps->strutWindowCount is 0 at any other time */ if (mStrutWindows.empty ()) doHandleScreenSizeChange (screen->width (), screen->height ()); /* 2nd pass */ } } } } } /* sort functions */ static bool compareLeftmost (compiz::place::Placeable *a, compiz::place::Placeable *b) { int ax, bx; ax = a->geometry ().x () - a->extents ().left; bx = b->geometry ().x () - a->extents ().left; return (ax <= bx); } static bool compareTopmost (compiz::place::Placeable *a, compiz::place::Placeable *b) { int ay, by; ay = a->geometry ().y () - a->extents ().top; by = b->geometry ().y () - a->extents ().top; return (ay <= by); } static bool compareNorthWestCorner (compiz::place::Placeable *a, compiz::place::Placeable *b) { int fromOriginA; int fromOriginB; int ax, ay, bx, by; ax = a->geometry ().x () - a->extents ().left; bx = b->geometry ().x () - a->extents ().left; ay = a->geometry ().y () - a->extents ().top; by = b->geometry ().y () - a->extents ().top; /* probably there's a fast good-enough-guess we could use here. */ fromOriginA = sqrt (ax * ax + ay * ay); fromOriginB = sqrt (bx * bx + by * by); return (fromOriginA <= fromOriginB); } PlaceWindow::PlaceWindow (CompWindow *w) : PluginClassHandler (w), compiz::place::ScreenSizeChangeObject (w->serverGeometry ()), window (w), ps (PlaceScreen::get (screen)) { WindowInterface::setHandler (w); } PlaceWindow::~PlaceWindow () { if (!ps->mStrutWindows.empty() && window->struts()) { ps->mStrutWindows.remove(window); if (ps->mStrutWindows.empty()) { ps->doHandleScreenSizeChange(screen->width(), screen->height()); } } } bool PlaceWindow::place (CompPoint &pos) { bool status = window->place (pos); CompPoint viewport; if (status) return status; doPlacement (pos); if (matchViewport (viewport)) { int x, y; viewport.setX (MAX (MIN (viewport.x (), screen->vpSize ().width () - 1), 0)); viewport.setY (MAX (MIN (viewport.y (), screen->vpSize ().height () - 1), 0)); x = pos.x () % screen->width (); if (x < 0) x += screen->width (); y = pos.y () % screen->height (); if (y < 0) y += screen->height (); pos.setX (x + (viewport.x () - screen->vp ().x ()) * screen->width ()); pos.setY (y + (viewport.y () - screen->vp ().y ()) * screen->height ()); } return true; } CompRect PlaceWindow::doValidateResizeRequest (unsigned int &mask, XWindowChanges *xwc, bool onlyValidateSize, bool clampToViewport) { CompWindow::Geometry geom (xwc->x, xwc->y, xwc->width, xwc->height, window->serverGeometry ().border ()); CompPoint pos (geom.pos ()); if (clampToViewport) pos = cp::getViewportRelativeCoordinates(geom, *screen); CompWindowExtents edgePositions = cp::getWindowEdgePositions (pos, geom, window->border ()); int output = screen->outputDeviceForGeometry (geom); CompRect workArea = screen->getWorkareaForOutput (output); if (clampToViewport && xwc->width >= workArea.width () && xwc->height >= workArea.height ()) { if ((window->actions () & MAXIMIZE_STATE) == MAXIMIZE_STATE && (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) && !(window->state () & CompWindowStateFullscreenMask)) { sendMaximizationRequest (); } } cp::clampHorizontalEdgePositionsToWorkArea (edgePositions, workArea); cp::clampVerticalEdgePositionsToWorkArea (edgePositions, workArea); /* bring left/right/top/bottom to actual window coordinates */ cp::subtractBordersFromEdgePositions (edgePositions, window->border (), geom.border ()); /* always validate position if the application changed only its size, * as it might become partially offscreen because of that */ if (cp::onlySizeChanged (mask)) onlyValidateSize = false; if (cp::applyWidthChange(edgePositions, *xwc, mask)) onlyValidateSize = false; if (cp::applyHeightChange(edgePositions, *xwc, mask)) onlyValidateSize = false; if (!onlyValidateSize) { if (edgePositions.left != pos.x ()) { xwc->x += edgePositions.left - pos.x (); mask |= CWX; } if (edgePositions.top != pos.y ()) { xwc->y += edgePositions.top - pos.y (); mask |= CWY; } } return workArea; } void PlaceWindow::validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source) { CompRect workArea; CompWindow::Geometry geom; bool sizeOnly = false; window->validateResizeRequest (mask, xwc, source); if (!mask) return; /* Clamp all windows initially on placement */ if (window->placed () && source == ClientTypePager) return; if (window->state () & CompWindowStateFullscreenMask) return; if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return; /* do nothing if the window was already (at least partially) offscreen * and already placed */ bool onscreen = CompRect (0, 0, screen->width (), screen->height ()).contains (window->geometry ()); if (window->placed () && !onscreen) return; if (hasUserDefinedPosition (false)) /* try to keep the window position intact for USPosition - obviously we can't do that if we need to change the size */ sizeOnly = true; doValidateResizeRequest (mask, xwc, sizeOnly, true); } void PlaceScreen::addSupportedAtoms (std::vector &atoms) { atoms.push_back (fullPlacementAtom); screen->addSupportedAtoms (atoms); } void PlaceWindow::doPlacement (CompPoint &pos) { CompRect workArea; CompPoint targetVp; PlacementStrategy strategy; bool keepInWorkarea; int mode; if (matchPosition (pos, keepInWorkarea)) { strategy = keepInWorkarea ? ConstrainOnly : NoPlacement; } else { strategy = getStrategy (); if (strategy == NoPlacement) return; } mode = getPlacementMode (); const CompOutput &output = getPlacementOutput (mode, strategy, pos); workArea = output.workArea (); targetVp = window->initialViewport (); if (strategy == PlaceOverParent) { CompWindow *parent; parent = screen->findWindow (window->transientFor ()); if (parent) { /* center over parent horizontally */ pos.setX (parent->serverBorderRect ().x () + (parent->serverBorderRect ().width () / 2) - (window->serverBorderRect ().width () / 2)); /* "visually" center vertically, leaving twice as much space below as on top */ pos.setY (parent->serverBorderRect ().y () + (parent->serverBorderRect ().height () - window->serverBorderRect ().height ()) / 3); /* if parent is visible on current viewport, clip to work area; don't constrain further otherwise */ if (parent->serverBorderRect ().x () < screen->width () && parent->serverBorderRect ().x () + parent->serverBorderRect ().width () > 0 && parent->serverBorderRect ().y () < screen->height () && parent->serverBorderRect ().y () + parent->serverBorderRect ().height () > 0) { targetVp = parent->defaultViewport (); strategy = ConstrainOnly; } else { strategy = NoPlacement; } } } if (strategy == PlaceCenteredOnScreen) { /* center window on current output device */ pos.setX (output.x () + (output.width () - window->serverGeometry ().width ()) /2); pos.setY (output.y () + (output.height () - window->serverGeometry ().height ()) / 2); strategy = ConstrainOnly; } workArea.setX (workArea.x () + (targetVp.x () - screen->vp ().x ()) * screen->width ()); workArea.setY (workArea.y () + (targetVp.y () - screen->vp ().y ()) * screen->height ()); if (strategy == PlaceOnly || strategy == PlaceAndConstrain) { /* Construct list of placeables */ compiz::place::Placeable::Vector placeables; foreach (CompWindow *w, screen->windows ()) { PLACE_WINDOW (w); if (windowIsPlaceRelevant (w)) placeables.push_back (static_cast (pw)); } switch (mode) { case PlaceOptions::ModeCascade: placeCascade (workArea, pos); break; case PlaceOptions::ModeCentered: placeCentered (workArea, pos); break; case PlaceOptions::ModeRandom: placeRandom (workArea, pos); break; case PlaceOptions::ModePointer: placePointer (workArea, pos); break; case PlaceOptions::ModeMaximize: sendMaximizationRequest (); break; case PlaceOptions::ModeSmart: placeSmart (pos, placeables); break; } /* When placing to the fullscreen output, constrain to one output nevertheless */ if ((unsigned int) output.id () == (unsigned int) ~0) { int id; CompWindow::Geometry geom (window->serverGeometry ()); geom.setPos (pos); id = screen->outputDeviceForGeometry (geom); workArea = screen->getWorkareaForOutput (id); workArea.setX (workArea.x () + (targetVp.x () - screen->vp ().x ()) * screen->width ()); workArea.setY (workArea.y () + (targetVp.y () - screen->vp ().y ()) * screen->height ()); } /* Maximize windows if they are too big for their work area (bit of * a hack here). Assume undecorated windows probably don't intend to * be maximized. */ if ((window->actions () & MAXIMIZE_STATE) == MAXIMIZE_STATE && (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) && !(window->state () & CompWindowStateFullscreenMask)) { if (window->serverWidth () >= workArea.width () && window->serverHeight () >= workArea.height ()) { sendMaximizationRequest (); } } } if (strategy == ConstrainOnly || strategy == PlaceAndConstrain) constrainToWorkarea (workArea, pos); } void PlaceWindow::placeCascade (const CompRect &workArea, CompPoint &pos) { Placeable::Vector placeables; /* Find windows that matter (not minimized, on same workspace * as placed window, may be shaded - if shaded we pretend it isn't * for placement purposes) */ foreach (CompWindow *w, screen->windows ()) { if (!windowIsPlaceRelevant (w)) continue; if (w->type () & (CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask)) continue; if (w->serverX () >= workArea.right () || w->serverX () + w->serverGeometry ().width () <= workArea.x () || w->serverY () >= workArea.bottom () || w->serverY () + w->serverGeometry ().height () <= workArea.y ()) continue; placeables.push_back (static_cast (PlaceWindow::get (w))); } if (!cascadeFindFirstFit (placeables, workArea, pos)) { /* if the window wasn't placed at the origin of screen, * cascade it onto the current screen */ cascadeFindNext (placeables, workArea, pos); } } void PlaceWindow::placeCentered (const CompRect &workArea, CompPoint &pos) { pos.setX (workArea.x () + (workArea.width () - window->serverGeometry ().width ()) / 2); pos.setY (workArea.y () + (workArea.height () - window->serverGeometry ().height ()) / 2); } void PlaceWindow::placeRandom (const CompRect &workArea, CompPoint &pos) { int remainX, remainY; pos.setX (workArea.x ()); pos.setY (workArea.y ()); remainX = workArea.width () - window->serverGeometry ().width (); if (remainX > 0) pos.setX (pos.x () + (rand () % remainX)); remainY = workArea.height () - window->serverGeometry ().height (); if (remainY > 0) pos.setY (pos.y () + (rand () % remainY)); } void PlaceWindow::placePointer (const CompRect &workArea, CompPoint &pos) { if (PlaceScreen::get (screen)->getPointerPosition (pos)) { unsigned int dx = (window->serverGeometry ().widthIncBorders () / 2); unsigned int dy = (window->serverGeometry ().heightIncBorders () / 2); pos -= CompPoint (dx, dy); } else placeCentered (workArea, pos); } using namespace compiz::place; void PlaceWindow::placeSmart (CompPoint &pos, const compiz::place::Placeable::Vector &placeables) { compiz::place::smart (this, pos, placeables); } static void centerTileRectInArea (CompRect &rect, const CompRect &workArea) { int fluff; /* The point here is to tile a window such that "extra" * space is equal on either side (i.e. so a full screen * of windows tiled this way would center the windows * as a group) */ fluff = (workArea.width () % (rect.width () + 1)) / 2; rect.setX (workArea.x () + fluff); fluff = (workArea.height () % (rect.height () + 1)) / 3; rect.setY (workArea.y () + fluff); } static bool rectOverlapsWindow (const CompRect &rect, const compiz::place::Placeable::Vector &placeables) { CompRect dest; foreach (compiz::place::Placeable *other, placeables) { CompRect intersect; CompRect sbr = other->geometry (); sbr.setLeft (sbr.left () - other->extents ().left); sbr.setRight (sbr.right () + other->extents ().right); sbr.setTop (sbr.top () - other->extents ().top); sbr.setBottom (sbr.bottom () - other->extents ().bottom); intersect = rect & sbr; if (!intersect.isEmpty ()) return true; } return false; } /* Find the leftmost, then topmost, empty area on the workspace * that can contain the new window. * * Cool feature to have: if we can't fit the current window size, * try shrinking the window (within geometry constraints). But * beware windows such as Emacs with no sane minimum size, we * don't want to create a 1x1 Emacs. */ bool PlaceWindow::cascadeFindFirstFit (const Placeable::Vector &placeables, const CompRect &workArea, CompPoint &pos) { /* This algorithm is limited - it just brute-force tries * to fit the window in a small number of locations that are aligned * with existing windows. It tries to place the window on * the bottom of each existing window, and then to the right * of each existing window, aligned with the left/top of the * existing window in each of those cases. */ bool retval = false; Placeable::Vector belowSorted, rightSorted; /* Below each window */ belowSorted = placeables; std::sort (belowSorted.begin (), belowSorted.end (), compareLeftmost); std::sort (belowSorted.begin (), belowSorted.end (), compareTopmost); /* To the right of each window */ rightSorted = placeables; std::sort (belowSorted.begin (), belowSorted.end (), compareTopmost); std::sort (belowSorted.begin (), belowSorted.end (), compareLeftmost); CompRect rect = this->geometry (); rect.setLeft (rect.left () - this->extents ().left); rect.setRight (rect.right () + this->extents ().right); rect.setTop (rect.top () - this->extents ().top); rect.setBottom (rect.bottom () - this->extents ().bottom); centerTileRectInArea (rect, workArea); if (workArea.contains (rect) && !rectOverlapsWindow (rect, placeables)) { pos.setX (rect.x () + this->extents ().left); pos.setY (rect.y () + this->extents ().top); retval = true; } if (!retval) { /* try below each window */ foreach (Placeable *p, belowSorted) { CompRect outerRect; if (retval) break; outerRect = p->geometry (); outerRect.setLeft (rect.left () - this->extents ().left); outerRect.setRight (rect.right () + this->extents ().right); outerRect.setTop (rect.top () - this->extents ().top); outerRect.setBottom (rect.bottom () - this->extents ().bottom); outerRect.setX (outerRect.x ()); outerRect.setY (outerRect.bottom ()); if (workArea.contains (rect) && !rectOverlapsWindow (rect, belowSorted)) { pos.setX (rect.x () + this->extents ().left); pos.setY (rect.y () + this->extents ().top); retval = true; } } } if (!retval) { /* try to the right of each window */ foreach (Placeable *p, rightSorted) { CompRect outerRect; if (retval) break; outerRect = p->geometry (); outerRect.setLeft (rect.left () - this->extents ().left); outerRect.setRight (rect.right () + this->extents ().right); outerRect.setTop (rect.top () - this->extents ().top); outerRect.setBottom (rect.bottom () - this->extents ().bottom); outerRect.setX (outerRect.right ()); outerRect.setY (outerRect.y ()); if (workArea.contains (rect) && !rectOverlapsWindow (rect, rightSorted)) { pos.setX (rect.x () + this->extents ().left); pos.setY (rect.y () + this->extents ().top); retval = true; } } } return retval; } void PlaceWindow::cascadeFindNext (const Placeable::Vector &placeables, const CompRect &workArea, CompPoint &pos) { Placeable::Vector sorted; Placeable::Vector::iterator iter; int cascadeX, cascadeY; int xThreshold, yThreshold; int winWidth, winHeight; int cascadeStage; sorted = placeables; std::sort (sorted.begin (), sorted.end (), compareNorthWestCorner); /* This is a "fuzzy" cascade algorithm. * For each window in the list, we find where we'd cascade a * new window after it. If a window is already nearly at that * position, we move on. */ /* arbitrary-ish threshold, honors user attempts to * manually cascade. */ static const unsigned short CASCADE_FUZZ = 15; xThreshold = MAX (this->extents ().left, CASCADE_FUZZ); yThreshold = MAX (this->extents ().top, CASCADE_FUZZ); /* Find furthest-SE origin of all workspaces. * cascade_x, cascade_y are the target position * of NW corner of window frame. */ cascadeX = MAX (0, workArea.x ()); cascadeY = MAX (0, workArea.y ()); /* Find first cascade position that's not used. */ winWidth = window->serverWidth (); winHeight = window->serverHeight (); cascadeStage = 0; for (iter = sorted.begin (); iter != sorted.end (); ++iter) { Placeable *p = *iter; int wx, wy; /* we want frame position, not window position */ wx = p->geometry ().x () - p->extents ().left; wy = p->geometry ().y () - p->extents ().top; if (abs (wx - cascadeX) < xThreshold && abs (wy - cascadeY) < yThreshold) { /* This window is "in the way", move to next cascade * point. The new window frame should go at the origin * of the client window we're stacking above. */ wx = cascadeX = p->geometry ().x (); wy = cascadeY = p->geometry ().y (); /* If we go off the screen, start over with a new cascade */ if ((cascadeX + winWidth > workArea.right ()) || (cascadeY + winHeight > workArea.bottom ())) { cascadeX = MAX (0, workArea.x ()); cascadeY = MAX (0, workArea.y ()); static const unsigned short CASCADE_INTERVAL = 50; /* space between top-left corners of cascades */ cascadeStage += 1; cascadeX += CASCADE_INTERVAL * cascadeStage; /* start over with a new cascade translated to the right, * unless we are out of space */ if (cascadeX + winWidth < workArea.right ()) { iter = sorted.begin (); continue; } else { /* All out of space, this cascade_x won't work */ cascadeX = MAX (0, workArea.x ()); break; } } } else { /* Keep searching for a further-down-the-diagonal window. */ } } /* cascade_x and cascade_y will match the last window in the list * that was "in the way" (in the approximate cascade diagonal) */ /* Convert coords to position of window, not position of frame. */ pos.setX (cascadeX + this->extents ().left); pos.setY (cascadeY + this->extents ().top); } bool PlaceWindow::hasUserDefinedPosition (bool acceptPPosition) { PLACE_SCREEN (screen); CompMatch &match = ps->optionGetForcePlacementMatch (); if (match.evaluate (window)) return false; if (acceptPPosition && (window->sizeHints ().flags & PPosition)) return true; if ((window->type () & CompWindowTypeNormalMask) || ps->optionGetWorkarounds ()) { /* Only accept USPosition on non-normal windows if workarounds are * enabled because apps claiming the user set -geometry for a * dialog or dock are most likely wrong */ if (window->sizeHints ().flags & USPosition) return true; } return false; } PlaceWindow::PlacementStrategy PlaceWindow::getStrategy () { if (window->type () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask | CompWindowTypeUtilMask | CompWindowTypeToolbarMask | CompWindowTypeMenuMask | CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask)) { /* assume the app knows best how to place these */ return NoPlacement; } if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { /* see above */ return NoPlacement; } if (hasUserDefinedPosition (true)) return ConstrainOnly; if (window->transientFor () && (window->type () & (CompWindowTypeDialogMask | CompWindowTypeModalDialogMask))) { CompWindow *parent = screen->findWindow (window->transientFor ()); if (parent && parent->managed ()) return PlaceOverParent; } if (window->type () & (CompWindowTypeDialogMask | CompWindowTypeModalDialogMask | CompWindowTypeSplashMask)) { return PlaceCenteredOnScreen; } return PlaceAndConstrain; } const CompOutput & PlaceWindow::getPlacementOutput (int mode, PlacementStrategy strategy, CompPoint pos) { int output = -1; int multiMode; /* short cut: it makes no sense to determine a placement output if there is only one output */ if (screen->outputDevs ().size () == 1) return screen->outputDevs ().at (0); switch (strategy) { case PlaceOverParent: { CompWindow *parent; parent = screen->findWindow (window->transientFor ()); if (parent) output = parent->outputDevice (); } break; case ConstrainOnly: { CompWindow::Geometry geom = window->serverGeometry (); geom.setPos (pos); output = screen->outputDeviceForGeometry (geom); } break; default: break; } if (output >= 0) return screen->outputDevs ()[output]; multiMode = ps->optionGetMultioutputMode (); /* force 'output with pointer' for placement under pointer */ if (mode == PlaceOptions::ModePointer) multiMode = PlaceOptions::MultioutputModeUseOutputDeviceWithPointer; switch (multiMode) { case PlaceOptions::MultioutputModeUseActiveOutputDevice: return screen->currentOutputDev (); break; case PlaceOptions::MultioutputModeUseOutputDeviceWithPointer: { CompPoint p; if (PlaceScreen::get (screen)->getPointerPosition (p)) { output = screen->outputDeviceForPoint (p.x (), p.y ()); } } break; case PlaceOptions::MultioutputModeUseOutputDeviceOfFocussedWindow: { CompWindow *active; active = screen->findWindow (screen->activeWindow ()); if (active) output = active->outputDevice (); } break; case PlaceOptions::MultioutputModePlaceAcrossAllOutputs: /* only place on fullscreen output if not placing centered, as the constraining will move the window away from the center otherwise */ if (strategy != PlaceCenteredOnScreen) return screen->fullscreenOutput (); break; } if (output < 0) return screen->currentOutputDev (); return screen->outputDevs ()[output]; } int PlaceWindow::getPlacementMode () { CompOption::Value::Vector& matches = ps->optionGetModeMatches (); CompOption::Value::Vector& modes = ps->optionGetModeModes (); int i, min; min = MIN (matches.size (), modes.size ()); for (i = 0; i < min; i++) if (matches[i].match ().evaluate (window)) return modes[i].i (); return ps->optionGetMode (); } void PlaceWindow::constrainToWorkarea (const CompRect &workArea, CompPoint &pos) { pos = cp::constrainPositionToWorkArea (pos, window->serverGeometry (), window->border (), workArea); } bool PlaceWindow::windowIsPlaceRelevant (CompWindow *w) { if (w->id () == window->id ()) return false; if (!w->isViewable () && !w->shaded ()) return false; if (w->overrideRedirect ()) return false; if (w->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; return true; } void PlaceWindow::sendMaximizationRequest () { XEvent xev; Display *dpy = screen->dpy (); xev.xclient.type = ClientMessage; xev.xclient.display = dpy; xev.xclient.format = 32; xev.xclient.message_type = Atoms::winState; xev.xclient.window = window->id (); xev.xclient.data.l[0] = 1; xev.xclient.data.l[1] = Atoms::winStateMaximizedHorz; xev.xclient.data.l[2] = Atoms::winStateMaximizedVert; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (dpy, screen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } bool PlaceScreen::getPointerPosition (CompPoint &p) { Window wDummy; int iDummy; unsigned int uiDummy; int x, y; bool ret; /* this means a server roundtrip, which kind of sucks; this * this code should be removed as soon as we have software cursor * rendering and thus a cache pointer co-ordinate */ ret = XQueryPointer (screen->dpy (), screen->root (), &wDummy, &wDummy, &x, &y, &iDummy, &iDummy, &uiDummy); p.set (x, y); return ret; } bool PlaceWindow::matchXYValue (CompOption::Value::Vector &matches, CompOption::Value::Vector &xValues, CompOption::Value::Vector &yValues, CompPoint &pos, CompOption::Value::Vector *constrainValues, bool *keepInWorkarea) { unsigned int i, min; if (window->type () & CompWindowTypeDesktopMask) return false; min = MIN (matches.size (), xValues.size ()); min = MIN (min, yValues.size ()); for (i = 0; i < min; i++) { if (matches[i].match ().evaluate (window)) { pos.setX (xValues[i].i ()); pos.setY (yValues[i].i ()); if (keepInWorkarea) { if (constrainValues && constrainValues->size () > i) *keepInWorkarea = (*constrainValues)[i].b (); else *keepInWorkarea = true; } return true; } } return false; } bool PlaceWindow::matchPosition (CompPoint &pos, bool &keepInWorkarea) { return matchXYValue ( ps->optionGetPositionMatches (), ps->optionGetPositionXValues (), ps->optionGetPositionYValues (), pos, &ps->optionGetPositionConstrainWorkarea (), &keepInWorkarea); } bool PlaceWindow::matchViewport (CompPoint &pos) { if (matchXYValue (ps->optionGetViewportMatches (), ps->optionGetViewportXValues (), ps->optionGetViewportYValues (), pos)) { /* Viewport matches are given 1-based, so we need to adjust that */ pos.setX (pos.x () - 1); pos.setY (pos.y () - 1); return true; } return false; } void PlaceWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { /* Don't restore geometry if the user moved the window */ if (screen->grabExist ("move") || screen->grabExist ("resize")) unset (); window->grabNotify (x, y, state, mask); } bool PlacePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/place/place.xml.in0000644000004100000410000001102313246301623016220 0ustar www-datawww-data <_short>Place Windows <_long>Place windows at appropriate positions when mapped Window Management composite opengl decor <_short>Fixed Window Placement <_short>Windows with fixed positions <_short>Windows with fixed placement mode <_short>Windows with fixed viewport ./plugins/clone/0000755000004100000410000000000013246301624014025 5ustar www-datawww-data./plugins/clone/CMakeLists.txt0000644000004100000410000000015213246301623016562 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (clone PLUGINDEPS composite opengl) ./plugins/clone/clone.xml.in0000644000004100000410000000110213246301623016245 0ustar www-datawww-data <_short>Clone Output <_long>Output clone handler Desktop opengl decor ./plugins/clone/src/0000755000004100000410000000000013246301624014614 5ustar www-datawww-data./plugins/clone/src/clone.cpp0000644000004100000410000003436513246301623016432 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * clone.cpp * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Ported to Compiz 0.9 by: * Copyright (c) 2009 Sam Spilsbury * * Author: David Reveman */ #include "clone.h" COMPIZ_PLUGIN_20090315 (clone, ClonePluginVTable); static void togglePaintFunctions (CloneScreen *cs, bool enabled) { screen->handleEventSetEnabled (cs, enabled); cs->cScreen->preparePaintSetEnabled (cs, enabled); cs->gScreen->glPaintOutputSetEnabled (cs, enabled); cs->cScreen->donePaintSetEnabled (cs, enabled); foreach (CompWindow *w, screen->windows ()) { CLONE_WINDOW (w); cw->gWindow->glPaintSetEnabled (cw, enabled); } } void CloneScreen::finish () { grab = false; if (src != dst) { Clone *fClone = NULL; /* check if we should replace current clone */ foreach (Clone *iClone, clones) { if (iClone->dst == dst) { fClone = iClone; break; } } /* no existing clone for this destination, we must allocate one */ if (!fClone) { fClone = new Clone (); XSetWindowAttributes attr; int x, y; attr.override_redirect = true; x = (int) screen->outputDevs ()[dst].x1 (); y = (int) screen->outputDevs ()[dst].y1 (); fClone->input = XCreateWindow (screen->dpy (), screen->root (), x, y, (int) screen->outputDevs ()[dst].width (), (int) screen->outputDevs ()[dst].height (), 0, 0, InputOnly, CopyFromParent, CWOverrideRedirect, &attr); XMapRaised (screen->dpy (), fClone->input); clones.push_back (fClone); } if (fClone) { fClone->src = src; fClone->dst = dst; } } if (grabbedOutput != dst) { /* remove clone */ foreach (Clone *iClone, clones) { if (iClone->dst == grabbedOutput) { XDestroyWindow (screen->dpy (), iClone->input); clones.remove (iClone); delete iClone; break; } } } } void CloneScreen::preparePaint (int msSinceLastPaint) { if (grab) { if (grabHandle) { offset -= msSinceLastPaint * 0.005f; if (offset < 0.0f) offset = 0.0f; } else { offset += msSinceLastPaint * 0.005f; if (offset >= 1.0f) offset = 1.0f; } } cScreen->preparePaint (msSinceLastPaint); foreach (Clone *iClone, clones) { CompOutput *srcOutput = &(screen->outputDevs () [iClone->src]); CompOutput *dstOutput = &(screen->outputDevs () [iClone->dst]); CompRegion dstOutputRegion (*dstOutput); CompRegion srcOutputRegion (*srcOutput); int dx, dy; dx = dstOutput->x1 () - srcOutput->x1 (); dy = dstOutput->y1 () - srcOutput->y1 (); if (cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_REGION_MASK) { if (srcOutput->width () != dstOutput->width () || srcOutput->height () != dstOutput->height ()) { cScreen->damageRegion (dstOutputRegion); iClone->region = srcOutputRegion; } else { CompRegion currentDamageRegion = cScreen->currentDamage (); iClone->region = currentDamageRegion - dstOutputRegion; iClone->region.translate (dx, dy); currentDamageRegion = iClone->region + currentDamageRegion; cScreen->damageRegion (currentDamageRegion); iClone->region = currentDamageRegion - srcOutputRegion; iClone->region.translate (-dx, -dy); } } else { iClone->region = srcOutputRegion; } } } void CloneScreen::donePaint () { if (grab) { if (offset == 1.0f) finish (); cScreen->damageScreen (); } cScreen->donePaint (); if (!grab && clones.empty ()) togglePaintFunctions (this, false); } bool CloneScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; unsigned int dstForThisOutput, outputId = 0; CompRegion sRegion = region; dstForThisOutput = outputId = ((unsigned int) output->id () != (unsigned int) ~0) ? output->id () : 0; if (!grab || (unsigned int) grabbedOutput != outputId) { foreach (Clone *iClone, clones) { if ((unsigned int) iClone->dst == outputId) { sRegion = iClone->region; dstForThisOutput = (unsigned int) iClone->src; if (screen->outputDevs ()[dstForThisOutput].width () != screen->outputDevs ()[outputId].width () || screen->outputDevs ()[dstForThisOutput].height () != screen->outputDevs ()[outputId].height ()) transformed = true; else transformed = false; break; } } } if (output->id () != (unsigned int) ~0) status = gScreen->glPaintOutput (attrib, transform, sRegion, &screen->outputDevs ()[dstForThisOutput], mask); else status = gScreen->glPaintOutput (attrib, transform, sRegion, output, mask); if (grab) { GLMatrix sTransform = transform; GLenum filter; float zoom1, zoom2x, zoom2y, x1, y1, x2, y2; float zoomX, zoomY; int dx, dy; zoom1 = 160.0f / screen->outputDevs ()[src].height (); x1 = x - (screen->outputDevs ()[src].x1 () * zoom1); y1 = y - (screen->outputDevs ()[src].y1 () * zoom1); x1 -= (screen->outputDevs ()[src].width () * zoom1) / 2; y1 -= (screen->outputDevs ()[src].height () * zoom1) / 2; if (grabHandle) { x2 = screen->outputDevs ()[grabbedOutput].x1 () - screen->outputDevs ()[src].x1 (); y2 = screen->outputDevs ()[grabbedOutput].y1 () - screen->outputDevs ()[src].y1 (); zoom2x = (float) screen->outputDevs ()[grabbedOutput].width () / screen->outputDevs ()[src].width (); zoom2y = (float) screen->outputDevs ()[grabbedOutput].height () / screen->outputDevs ()[src].height (); } else { x2 = screen->outputDevs ()[dst].x1 () - screen->outputDevs ()[src].x1 (); y2 = screen->outputDevs ()[dst].y1 () - screen->outputDevs ()[src].y1 (); zoom2x = (float) screen->outputDevs ()[dst].width () / screen->outputDevs ()[src].width (); zoom2y = (float) screen->outputDevs ()[dst].height () / screen->outputDevs ()[src].height (); } /* XXX: hmm.. why do I need this.. */ if (x2 < 0.0f) x2 *= zoom2x; if (y2 < 0.0f) y2 *= zoom2y; dx = x1 * (1.0f - offset) + x2 * offset; dy = y1 * (1.0f - offset) + y2 * offset; zoomX = zoom1 * (1.0f - offset) + zoom2x * offset; zoomY = zoom1 * (1.0f - offset) + zoom2y * offset; sTransform.translate (-0.5f, -0.5f, -DEFAULT_Z_CAMERA); sTransform.scale (1.0f / screen->outputDevs ()[outputId].width (), -1.0f / screen->outputDevs ()[outputId].height (), 1.0f); sTransform.translate (dx - screen->outputDevs ()[outputId].x1 (), dy - screen->outputDevs ()[outputId].y2 (), 0.0f); sTransform.scale (zoomX, zoomY, 1.0f); filter = gScreen->textureFilter (); if (offset == 0.0f) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); CompRegion srcOutputRegion (screen->outputDevs ()[src]); foreach (CompWindow *w, screen->windows ()) { GLMatrix gTransform = transform; gTransform.translate (-100, 0, 0); CLONE_WINDOW (w); if (w->destroyed ()) continue; if (!w->shaded ()) { if (!w->isViewable () || !cw->cWindow->damaged ()) continue; } cw->gWindow->glPaint (cw->gWindow->paintAttrib (), sTransform, srcOutputRegion, PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK); } gScreen->setTextureFilter (filter); } return status; } bool CloneWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { CLONE_SCREEN (screen); if (!cs->clones.empty () && cs->transformed) mask |= PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; return gWindow->glPaint (attrib, transform, region, mask); } bool CloneScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { std::list ::iterator it = clones.begin (); if (grab || screen->otherGrabExist ("clone", NULL)) return false; if (!grabHandle) grabHandle = screen->pushGrab (None, "clone"); grab = true; x = CompOption::getIntOptionNamed (options, "x", 0); y = CompOption::getIntOptionNamed (options, "y", 0); src = grabbedOutput = screen->outputDeviceForPoint (x, y); /* trace source */ while (it != clones.end ()) { if ((*it)->dst == src) { src = (*it)->src; it = clones.begin (); } else { ++it; } } togglePaintFunctions (this, true); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); return true; } bool CloneScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (grabHandle) { int x, y; screen->removeGrab (grabHandle, NULL); grabHandle = NULL; x = CompOption::getIntOptionNamed (options, "x", 0); y = CompOption::getIntOptionNamed (options, "y", 0); dst = screen->outputDeviceForPoint (x, y); cScreen->damageScreen (); } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } void CloneScreen::setStrutsForCloneWindow (Clone *clone) { #if 0 // Pointless code - needs fixing CompOutput *output = &screen->outputDevs ()[clone->dst]; XRectangle *rect = NULL; CompStruts *struts; CompStruts *wStruts; CompWindow *w; w = screen->findWindow (clone->input); if (!w) return; struts = new CompStruts (); if (!struts) return; wStruts = w->struts (); if (wStruts) delete wStruts; struts->left.x = 0; struts->left.y = 0; struts->left.width = 0; struts->left.height = screen->height (); struts->right.x = screen->width (); struts->right.y = 0; struts->right.width = 0; struts->right.height = screen->height (); struts->top.x = 0; struts->top.y = 0; struts->top.width = screen->width (); struts->top.height = 0; struts->bottom.x = 0; struts->bottom.y = screen->height (); struts->bottom.width = screen->width (); struts->bottom.height = 0; /* create struts relative to a screen edge that this output is next to */ if (output->x1 () == 0) rect = &struts->left; else if (output->x2 () == screen->width ()) rect = &struts->right; else if (output->y1 () == 0) rect = &struts->top; else if (output->y2 () == screen->height ()) rect = &struts->bottom; if (rect) { rect->x = output->x1 (); rect->y = output->y1 (); rect->width = output->width (); rect->height = output->height (); } wStruts = struts; /* * ^ FIXME: This code does nothing. Looks like it was meant to be: * *w->struts() = struts; * However that is not legal. CompWindow needs a setStruts(). */ #endif } void CloneScreen::handleMotionEvent (CompPoint &p) { if (grabHandle) { x = p.x (); y = p.y (); cScreen->damageScreen (); } } void CloneScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: { CompPoint p (pointerX, pointerY); handleMotionEvent (p); } break; case EnterNotify: case LeaveNotify: { CompPoint p (pointerX, pointerY); handleMotionEvent (p); } default: break; } screen->handleEvent (event); switch (event->type) { case CreateNotify: { foreach (Clone *iClone, clones) { if (event->xcreatewindow.window == iClone->input) setStrutsForCloneWindow (iClone); } } default: break; } } void CloneScreen::outputChangeNotify () { std::list ::iterator it; for (it = clones.begin (); it != clones.end (); ++it) { if ((unsigned int) (*it)->dst >= screen->outputDevs ().size () || (unsigned int) (*it)->src >= screen->outputDevs ().size ()) { clones.erase (it); it = clones.begin (); continue; } } screen->outputChangeNotify (); } CloneScreen::CloneScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabHandle (NULL), grab (false), offset (1.0f), transformed (false), src (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); optionSetInitiateButtonInitiate (boost::bind (&CloneScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&CloneScreen::terminate, this, _1, _2, _3)); } CloneWindow::CloneWindow (CompWindow *window) : PluginClassHandler (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { GLWindowInterface::setHandler (gWindow, false); } CloneScreen::~CloneScreen () { while (!clones.empty ()) { clones.pop_front (); } } bool ClonePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/clone/src/clone.h0000644000004100000410000000644213246301623016072 0ustar www-datawww-data#ifndef COMPIZ_CLONE_H #define COMPIZ_CLONE_H /* * Copyright © 2006 Novell, Inc. * * clone.h * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Ported to Compiz 0.9 by: * Copyright (c) 2009 Sam Spilsbury * * Author: David Reveman */ #include "clone_options.h" #include #include #include class Clone { public: int src; int dst; CompRegion region; Window input; }; class CloneScreen : public PluginClassHandler , public CloneOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: CloneScreen (CompScreen *); ~CloneScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle grabHandle; bool grab; float offset; bool transformed; std::list clones; int x, y; int grabbedOutput; int src, dst; void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void outputChangeNotify (); /* Internal class functions */ void finish (); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); void setStrutsForCloneWindow (Clone *clone); void handleMotionEvent (CompPoint &p); }; class CloneWindow : public PluginClassHandler , public GLWindowInterface { public: CloneWindow (CompWindow *window); CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask); }; #define CLONE_SCREEN(s) \ CloneScreen *cs = CloneScreen::get (s) #define CLONE_WINDOW(w) \ CloneWindow *cw = CloneWindow::get (w) class ClonePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif ./plugins/reflex/0000755000004100000410000000000013246301624014212 5ustar www-datawww-data./plugins/reflex/CMakeLists.txt0000644000004100000410000000015313246301623016750 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (reflex PLUGINDEPS composite opengl) ./plugins/reflex/src/0000755000004100000410000000000013246301624015001 5ustar www-datawww-data./plugins/reflex/src/reflex.h0000644000004100000410000000450313246301623016440 0ustar www-datawww-data/* * Compiz reflection effect plugin * * reflex.h * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "reflex_options.h" class ReflexFunction { public: GLFragment::FunctionId handle; int target; int param; int unit; }; class ReflexScreen : public PluginClassHandler , public ScreenInterface, public ReflexOptions { public: ReflexScreen (CompScreen *); ~ReflexScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool imageLoaded; GLTexture::List image; unsigned int width; unsigned int height; std::list reflexFunctions; void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *window); GLFragment::FunctionId getReflexFragmentFunction (GLTexture *texture, int param, int unit); void optionChanged (CompOption *opt, ReflexOptions::Options num); void destroyFragmentFunctions (); }; #define REFLEX_SCREEN(s) \ ReflexScreen *rs = ReflexScreen::get (s) class ReflexWindow : public PluginClassHandler , public GLWindowInterface { public: ReflexWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool active; void glDrawTexture (GLTexture *texture, GLFragment::Attrib &, unsigned int); void updateMatch (); }; #define REFLEX_WINDOW(w) \ ReflexWindow *rw = ReflexWindow::get (w) class ReflexPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/reflex/src/reflex.cpp0000644000004100000410000002016013246301623016770 0ustar www-datawww-data/* * Compiz reflection effect plugin * * reflex.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "reflex.h" COMPIZ_PLUGIN_20090315 (reflex, ReflexPluginVTable); GLFragment::FunctionId ReflexScreen::getReflexFragmentFunction (GLTexture *texture, int param, int unit) { GLFragment::FunctionData *data; int target; ReflexFunction *function; CompString targetString; if (texture->target () == GL_TEXTURE_2D) target = COMP_FETCH_TARGET_2D; else target = COMP_FETCH_TARGET_RECT; foreach (GLTexture *tex, image) { if (tex->target () == GL_TEXTURE_2D) targetString = CompString ("2D"); else targetString = CompString ("RECT"); } /* Do we already have a function for this? */ foreach (ReflexFunction *f, reflexFunctions) { if (f->param == param && f->target == target && f->unit == unit) return f->handle; } data = new GLFragment::FunctionData (); if (data) { GLFragment::FunctionId handle = 0; char str[1024]; data->addTempHeaderOp ("image"); data->addTempHeaderOp ("tmp"); data->addFetchOp ("output", NULL, target); data->addColorOp ("output", "output"); snprintf (str, 1024, "MAD tmp, fragment.position, program.env[%d]," " program.env[%d];", param, param + 1); data->addDataOp (str); snprintf (str, 1024, "TEX image, tmp, texture[%d], %s;", unit, targetString.c_str ()); data->addDataOp (str); snprintf (str, 1024, "MUL_SAT tmp, output.a, program.env[%d].b;" "MAD image, -output.a, image, image;" "MAD output, image, tmp.a, output;", param + 1); data->addDataOp (str); if (!data->status ()) { delete data; return 0; } function = new ReflexFunction (); if (function) { handle = data->createFragmentFunction ("reflex"); function->handle = handle; function->target = target; function->param = param; function->unit = unit; reflexFunctions.push_back (function); } delete data; return handle; } return 0; } void ReflexWindow::updateMatch () { bool f_active; REFLEX_SCREEN (screen); f_active = rs->optionGetMatch ().evaluate (window); if (f_active != active) { active = f_active; if (active) gWindow->glDrawTextureSetEnabled (this, true); else gWindow->glDrawTextureSetEnabled (this, false); cWindow->addDamage (); } } void ReflexScreen::optionChanged (CompOption *opt, ReflexOptions::Options num) { CompString pname ("reflex"); switch (num) { case ReflexOptions::File: { CompSize size; CompString string (optionGetFile ()); if (imageLoaded) { image.clear (); } image = GLTexture::readImageToTexture (string, pname, size); imageLoaded = image.size (); width = size.width (); height = size.height (); cScreen->damageScreen (); } break; case ReflexOptions::Match: foreach (CompWindow *w, screen->windows ()) { REFLEX_WINDOW (w); rw->updateMatch (); } cScreen->damageScreen (); break; case ReflexOptions::Window: case ReflexOptions::Decoration: { bool shouldEnable = (optionGetWindow () || optionGetDecoration ()); foreach (CompWindow *w, screen->windows ()) { REFLEX_WINDOW (w); shouldEnable |= optionGetMatch ().evaluate (w); rw->gWindow->glDrawTextureSetEnabled (rw, shouldEnable); } cScreen->damageScreen (); } default: /* FIXME: this isn't right.... */ cScreen->damageScreen (); break; } } void ReflexWindow::glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask) { REFLEX_SCREEN (screen); bool enabled; bool windowTexture = false; foreach (GLTexture *tex, gWindow->textures ()) { if (tex == texture) windowTexture = true; } enabled = windowTexture ? rs->optionGetWindow () : rs->optionGetDecoration (); if (enabled && active && rs->imageLoaded && GL::fragmentProgram) { GLFragment::Attrib fa = attrib; int function; int unit = 0; int param; float tx = 0.0f, ty = 0.0f, dx = 0.0f, mx = 0.0f; if (rs->optionGetMoving ()) { mx = window->x () + (window->width () / 2); mx /= screen->width () / 2.0; mx -= 1.0; mx *= -0.065; } else mx = 0.0; foreach (GLTexture *tex, rs->image) { if (tex->target () == GL_TEXTURE_2D) { tx = 1.0 / screen->width (); ty = 1.0 / screen->height (); dx = mx; } else { tx = 1.0f / screen->width () * rs->width; ty = 1.0f / screen->height () * rs->height; dx = mx * rs->width; } } unit = fa.allocTextureUnits (1); param = fa.allocParameters (2); function = rs->getReflexFragmentFunction (texture, param, unit); if (function) { fa.addFunction (function); GL::activeTexture (GL_TEXTURE0_ARB + unit); foreach (GLTexture *tex, rs->image) { tex->enable (GLTexture::Good); GL::activeTexture (GL_TEXTURE0_ARB); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param, tx, ty, 0.0f, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param + 1, dx, 0.0f, rs->optionGetThreshold (), 0.0f); tex->disable (); } } gWindow->glDrawTexture (texture, fa, mask); if (unit) { GL::activeTexture (GL_TEXTURE0_ARB + unit); foreach (GLTexture *tex, rs->image) tex->disable (); GL::activeTexture (GL_TEXTURE0_ARB); } } else { gWindow->glDrawTexture (texture, attrib, mask); } } void ReflexScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); foreach (CompWindow *w, screen->windows ()) { REFLEX_WINDOW (w); rw->updateMatch (); } } void ReflexScreen::matchPropertyChanged (CompWindow *w) { REFLEX_WINDOW (w); rw->updateMatch (); screen->matchPropertyChanged (w); } void ReflexScreen::destroyFragmentFunctions () { while (!reflexFunctions.empty ()) { ReflexFunction *func = reflexFunctions.front (); GLFragment::destroyFragmentFunction (func->handle); reflexFunctions.remove (func); } } ReflexScreen::ReflexScreen (CompScreen *) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), imageLoaded (false), width (0), height (0) { CompSize size; CompString string (optionGetFile ()); CompString pname ("reflex"); image = GLTexture::readImageToTexture (string, pname, size); imageLoaded = image.size (); width = size.width (); height = size.height (); optionSetFileNotify (boost::bind (&ReflexScreen::optionChanged, this, _1, _2)); optionSetMatchNotify (boost::bind (&ReflexScreen::optionChanged, this, _1, _2)); } ReflexScreen::~ReflexScreen () { if (reflexFunctions.size ()) destroyFragmentFunctions (); } ReflexWindow::ReflexWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), active (false) { REFLEX_SCREEN (screen); GLWindowInterface::setHandler (gWindow, false); if (rs->optionGetWindow () || rs->optionGetDecoration ()) gWindow->glDrawTextureSetEnabled (this, true); updateMatch (); } bool ReflexPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/reflex/images/0000755000004100000410000000000013246301624015457 5ustar www-datawww-data./plugins/reflex/images/reflection.png0000644000004100000410000225343513246301623020334 0ustar www-datawww-dataPNG  IHDRZvt_ vpAg1IDATxlYmufݜ|w@&$v%ʢRC E)r &aN,R("HDD}|}gZ{ {{k5ck"ATAQATHH@=)* ""?PDUT@EI@IAP@)L ?(/5|hkQ+("B ՟?$ADUB Qg˫ J(~~S,μ Zf1I{-;矈qg";+IBH6 ** (F[A@ TUHEPAI{ّ#d^?Ib3z2 *ӛsT&&l![}'-|wRjA +EUETRRaSа_Ÿk ^ ""z6֯p4ZYAQNIYi`2CSKNj,~n]01/P_wJH?U#k7O3 @H% ǍN#@BN o7g!eߡ.]_WUÇ2#x`~.pH*)~pH#QDR 5lT%,"s J=v{4>?/~{ Xb9#@x'PQ@TQ9<$4K]kf~֙G3 TRqgc5Y7}zY7M21$aQEU5|](p 4<V+o  h Li^~ M׻D J8Nقa#OfcaWxx_o<݅˓ >ju`a6~bx%>B$  pb5,"i'F#233Xu펻^|}&U}tpsþox 0lذFd~ v'^j_M؎T}.@ Q8>WE@@B (TBT{?[Ĝ-}' xBpWfPFc|SD܎0UpPPƫ^`T@Nz}>1l:+d¥@a(g;*: x.  C/4hIàX2^@P³`LAH4<I//-;FA;#b "2ZEc;h?s7ַmt,zVR?"D:a8E@Ty *x@&laD Lu| JQ (s6)]xK px4/4J̲tVL %6J-]Z>XV>UKSчC$oqkXUH4bdL/Z >>엌YXeG—V듁" K}gQ1l U|+a9C {b* }avkn$@H@aQH~# '1CEA8|7񯩳`== $rHȞZ?:cf~|~>b.L-I}XM U.S6C GJ5@\HËUΗC;J(Zb3 W;=(TJSQ)UUf h2M ?.=䛛m:B.Olv@mh@S{sUZ]"BUMBjXC<3xW"( \;IdXYzCsUы&gZgxPXn~fk@1PU|-fai(4LY|*DӲ̤ ^1[>|ovuSja?@}* *CUUu]#l$yw.$MTBPAD"/VҲڼ-k"SR 6Yٳ;fÏڭ4n.* @AćFI5t^/5F) qټ'n%)`du@Q P;y| k;5b(@0L!xT㉉I*qUvO,ZbK)-T)?:9" ) ٮ~c4Ě{dInCPyVXR!p>G0J1!yNI`*•"Yح@!i}5՘\S] B}">ҡ~IǴJCYGܺypJʪlAx˘"^XY 'wAWx l z!@PYF0G3c= ?T ħ)./$O8RԸVKB@\ 8 KmZA@GIni}n-!@1Kӟ!/lxO>N# CV8\T!!U J$.Pah dWV|aSXN&^U T h/1#Ed|}u4pVWu*nI"r661k9< IN0RY:Ts08yw}։9A;w>/bgemqxP|X'%^|]@G` PTKHLT'IE:Gj#VC-Us鱎.C!0^C8]MD 8J+-=Wbh>jR " \FǙZoͼ )RPÄ NIݸ3许ryP6Q.T0DEP`Ip,!X(Hjy(l QTb 86(3D> ?+Z)2 UTMSτHK?5.n]MZI) `ת7VElચCUL񂄪TB | u[$5+o4x#%2 4@*>Wŷ425 Uu,BU%ϼOu ƛdo}\ъ5 @A;ܳ1 !' |lf3xL\;6&c"DH\h.`맷 W" QF*~~Dq ?~<IcoDObXH D=y `l@bQ@H("QU)X'zԇ5%$Q$k,/5l~6@+U -4IF& Aמ:l7iXH=I$֥ RGE?/OY:e%)Qb0& D* WDel6ۓz}'BB(?pZnaHIfG _)i}zZ+Lq̙CZCDPH0 9saXc۫חi42Xퟎ4DHJI ( 7:k!"=J{*@+c4ث 'Aӭ>$ST 1C8@Cvp:JG41wn~\=Z=hzbX%iGNcm? ƳPfPB  K!zp _cH*4\eJ$̕..FjB0ٞ@γ"zY+oO-o[;?x.UB!$j˦U߅[7[oq{a" G'd/¯FY38L"I}fwL}ECDYďbRG}МZݵB*fbKl bsA OxQXpaP@D Kpկ!$k5.-6̢擒tV &$2R YRU9[ˎqaΪTODa6LYղKiۄ)k2(HK *I#>nF[ů5bjwSg6jOniP}c.S:V(]!#._ W[af"CjbJMo6GaQͿ\[v U swGn<8-1rE!7"qĪ*Jp?Xx ?O_ TtWGwG 8gI  9a(!ZXoi?Rym..܀hY8JDD$XvF$iIK G+?dҙVc4ҡEbf41&1+ a"2Mb]PZ!6Z (|UDC J $58Mװ-QDIEΑΓ=U0I^: W qIꌪjnbmIuj@,47c _jv+&þb2Ee뗋#6mdo97  n`Tc=L' dOŁNIkS 8VEN}#5 ,KOo9t  }ۏfKpp̞2F뽁AnIH`v4[[y">n>9xs ׵C{ixSۀ:P*B[@: ~F*뫂b@h$0x5FAdFoIku,d,KDDpbfsǻcOIcG]vx1髷 (H}a4k&D1*("'b, {?s:*KVBP| ,dTJt85QH-B@5ԷYH%@-I1ۿ< (B(ZhZ]VT0+jdi dgFC琙T ?NQ4/v.zZRz UpAV];曼wd&rqPф&`Dy&1|u]Âhy[Щ |[o[.-/SU1NJ xf' BҖP17Zm餻ڄģ|zOGNhlڢRs3Ey Q5D]j\X!1c5-,HIS!"qt@4ZGA$_@T +!¤\i//Yo3:W"!֦Xմ`8rf6LջZ_˝:HlkeU"^b\ panVxQD"?C(J PңxPQBZ"jaIT8RR04, aiO]ZJFE^My<5 nRS)!"ͱ 0=<F^<+".}LWI{f$VFQd/ `E3,NכSBOIok'Coa=&0qDUkoG8̾_QKG5Z.;|Q 6ĦAf!ooKNXT'xmRgfEki{O# -V2>iݞb{isiԫ.,~ <ÑEB$I i\" \Hk@js$ܨzi_5Tל e"GR``3cW+J`t~Șxp,nK e"jb% MqȦ.Cf,BgѬu2wQ!b>R(,Rd⦥x:+zt6Uux @BՃQrAW54e  %eT)V^pRl@S!ѣck}A-%'jK&M&AF(]IF ɝR x8D)j9*fFi 3A.SQWRb|IB ǯ>7>#"V.?$)hWa 5"nwd PuLzNV*/&QSu[QqÉUbV7?(plq4639i +e1+^1P֙lϦW f~IV<7d0Q,)`y…T北KB@R/ 8'P@Z:@2#9.2Sh-nv ,/'$%$"C!Sd?r%%t:++_T/)A 2w;'Nx(|QKt] @E+H "9Yذx  ?$#GwE_Pjf W4ij w֝RLuQ-&ɭaL&ILgI,mAy} p~@ z1 $@#6yo<,yZ0۟Q_{Բ:Φ;ݷW~#B!Tj_|Ibk.bEɌP2V{*>zU0WA[_{c͉ak^q[7V+ *y ˹N|#FC)$#4苺o}/oCm1O3"F q8k52Ng!'l5≗k+ WO{03ZE?u*xDA85 (r v@E"':=(* TvM /p*CAC"K>'4Y[MMLˇwS4 %A%5^\oV2PQP/(h5|'e괂R%XzW$uW6ԫTuw\P_{2ƛAgOMso%d[' !iONtNx0w ftL'l ڽ& +J oэGcOE6BB-Jy*ukHTs`ΛV8lM5J&R8ۇ/MkBi2+Y<+*]~qicgªZ+3f-m xt'F}L/ouY煷>{O wY*vp*He8TpU:*H4,95|EUaTjy&dR⼦1y+Ħrbn3 ~hduWόj[N24Ã/'2'{wq}B_Xm S@FBL/ Y4zQȏIU) TTɪ%iuFJcj,u +M5_ze;7&Zr! |4xPs`m]Hۏ(:<*9Ud `U~qQg(Z Vd6R':8{xʹӲtN!JmC`<ᰜ9zz/'Bŕn4>fND( rȎHAʀ&|!ctD(k $@5 O웪zn_Zoiڴ`i2J[ m&r1 xLzp[~|@z  AQp6RRL6o4y'A$dw'̶ֲIle5 "xży4yItm+KV&,gՍ%RF)r/~zDyomcVU$_@Ljh8{ z\ _{z?ǟm:R{TTcQ폽gjw.N O Dg3*Eٲ рjcV蛀4/P P+hXQ%b+duR5:gȕ LIÐ@SFk!gO=o$Qk{c,:*OXQ[d ã$l)O{iY2zW=,=.vDɔN"ޫH Iy/8E$OWeTLZhP%cBN.lOw L|~CaNPպ PYTExO΃d샙){k6t s=3h`H'`t[.]tV{|Yub+K+2JmS dձ%=:*jʻ=υPeOй8%SEPdJI#̑_=3Rs!ģۇ3y;s23Iݿ/m-o =lK"j!*)bW6HT:2D ; lUeA'n͌;yةR#(@"LPNC:ݙ*f";5;f"dvI9-8m `%S@FgRӽG9Yk7F+O){toҳ/43YFYLXg )UM2?K_?=CVUI;6oj¤"Ns>r+SPί  ! {; rt8J,7a*;$v F $Ko~)xZFtl {D@QNgp熪&`kU:$KK 0x-ǧG\tR╫4V]C4X[G[6 5~`Q "b_^BE' _Y|@ Ve+(de4k[ l.-5[ G2f@P_JrtN@z+)G A9zՙn=J<9E% $D@ &A`(\w+) IeNFy6a+KpեFezFAD @2c ?BbtaSn`W*hIz`KB` Y.ىz (O&%=:tƶ)Wu[^׶6IvJEYRWQgͩşrDk{jGb(]5(PT;|ygSr|m#PCY SVf*ʂDZT+^Ogg ?!4d=>l"Ђ'lNLiwvg0G,K snNŸLOOh7WZ >z{L)zG+ƮܕK@4z݅` WzyH禂T1*ҹFe)fe&,Xzk H 88逸]ڥ+bhȕ@5 1-I9;O.j@6iV nv %WY XN t4,Xkԋ81sŷj-(7n= 5j U^B꾩Oq }4Wr9yຎU  &`&yj1HĖTPwTޫ U@:u ;]eM7ݪ-.$ f): `IYPC+8+3'zPB/>X: [@e%ߢFkUOiuVYd)B,45{q>\z)w>s(`k_ vFiJ;p<FjĚĤ\z=^y?OF@牼Vt0s(`"SeOybU{63fR 1BA=&BaVXW6:.Dk_*Me eSҞt{2M1+K@:teOd7I)]Hrqr|/&lR҇h=~@vKb<8(:,UxV"D\aPW +\^bEW|^6s #LXgeYbI@NuSe|uC, UVejl/_%e9, Q-&t O$isBЀi@[%E(աzF-U&0?]TdչOM)#]qNEClNc,ѕ?o~M5L@Q0 Y %(D*m"_p N1¬~2)3l[K˭ -l0{G$V& ^0ɗ[0TAD*^xdݹ0^/JRG$("20*AٔX"LL"@B"dBF$ʏj$!@+6iG SS%zVq ~jQ]8(+zP34c© ,IZˉgGG'Y"H Wp3u(%hI4DA DQ@\=x=bh~_M,(4W6"zܗsݠӭp"{ks7=Ǿ؄,<,?%U/ Jv\qٖU6Բy◿{w8O=!d}Bg҂ {ãIYeBcyoߜ򡸼lFBӤi;ntrx';/*bŋV瓟ZA#eGqJ  ۝![ooYEJD&dd-vL8&rX 0!B4jR;ھ?# ͦ?NբMRi}0;9< zn_:>j~NNCBUPW=m$$H M͈!L% ˌ !R^T qK/:y,fNzU0qs²jׄm?|rӵWd(2T%gv@az`Ȑ1[ÌW ge13Cp 0(wn?#+W;2t?=)Ng(g6ij Ar)+Y_K&>ZԤ= |i*bUM8+$:bNlϠ}hذҟ}njZs~zPJ|d+AP5OTQdwf&O^[ewߝN9k T}" S &w ƴ== !W?{"0R*]\zż8>8L1f 7=9PLV @e|ãB2[v{??_P 33VLr?cw@DPd7ku `Ƨck$o NN=/<<*Rv:Bf͇v[5V`028zN=>3MN[18_dk«WPi!fK;~6 ܽt_}s hHUtDm@e}(=- Υ1F=<<<쏋RESt4:Z0'd֤6 ^`{}1t4͜+]銡*d_G . JJg؃zLkrZB͞ vo%,8@K U(Yޠ#ʅ`g_Nt.SGk7?2ڍ,݅n+ĕl?<<+QF"`u<ҏԘOΜ0[a٦+f8͚(mj-?l6wЀPcOԯףv~$a= nO5s}oUkv m/'nU!GXGo цLecs&j̷')t A XTBȷiIa5ÞGWJkͫk6gXXXvgO S;˽ޅkT̆G۩Mii7*QP {sxZ*•ߩTX^h_ Ps>}cFg^]|ڵ(e0? g*&l,l8FGghdVz`fÌ Ԡ Ymu-폊R< #zBH&E֕ovr-/ӳh4-xJ{%Y:Ʉ D/Zxd/W9]%Uhcv֖f|rq ى>ظzA 7pX&(%m(zV?8YѤJ7K;뽅&I2|t0ǣR OجontdruiLyFV{cwܟ&}fGdž"X@chbV`h:h+V{4Lپ1 / ~a_} ɵG#G\q=cC<滻p}?XFKo>w daamUY&(AQҥ qGIԼ>)fPxqwq tđ6(p嵯ɣ"*3dMu\٩GK 0N' vŚPT rkr'ONΫ*1zn4Ze)ɵO-߭MJp'$΋Q++`#_her'KORfCDΫayS+}=~|z& \ * odaZj:_* Y)⽲Dk@<u *AP&Q-\ 5j6zW..vq ;%b8XZu3,v,s9ΣtCy&lj ,(ݴ+@ + yJ|1<> Ɠ)0#'0]fK~<ۛ,FؗҫwhudYTe [N_Ωc+ @E=9)Zx >i`/'S益7`U!ZWs U*b#~V=ϯauԁ$f@pR8Bu!o=|dpi5/?*H9<O_~'ۼi/G'<=S cȨ2>~K_ݳјr`!QI/lt>.kLJlc7ؽw㝱CBE+o=l.F?ssjGjE!x@7CsO=n6>~M%L*GĖ)`P2;}3FNxB@&[h筕F0xMΠdH Df0 7JcㄫP ̡'T@X^f֛B'bA$Pp;5mx+ic,n`}}k7>-l7F'nHAl.!@/_~ɲ()ώN,p~{ݳzLHW_{i{g(J[Lf@0m6k+_LJ㽻,i6lē*_[:e4c@5 n?Ԛ$U d6 RN;&_K^oRY (ET_Ǥd{/^]{Ah{ S(>OVq>w DS Xb7icL/Go|!SZX+Nͫy.KQoJJݺ~Xv/Anq"g` A9?91`wVN6Om$6nmˉr vUQvC`RkP.?WikG$Ӵ@x!OF0sr5l7_XBAJz9_<|"4fosoR, 9 JdNof-/5摹!ē`/[79ULJU@{.P1J٥׿lTBw|2ܾsLnMLֻx-iFUr/ tfytl|sPOַ(~_$.`T{B8e]F&9\̅߸a:Y?5Ęt"Ig@K4`;M34JOp18焉lAޥFhd4/;?~rx4(t?lrF0r!AӤnӒh'Lg;旾4>y/]@ }Pg('T*.4xGjo֞^ DQi'\gAOpYJɴĆٿ_f,Mлl6NR3;Dձd⓴Xnyx`owx:8 QAfۇxт3<Խ&O^#aO= =t~~AVila#ۼ$$'gRF?ReJyOuy3V'8kL= NnTpVƋ~^Ju>R:80W _#S4Bzؗ? qjeQ'^̻+ 퍪s|{8,r~:+IŲZ7j"`xs"럹A9Fy#:+;ye{U`p6N8{z'y+|Yđ?)'^J ^󁽸ȃX+ŕ?dRuy? pit 3Ͼ}aEl߽{4vv;;ޟ #tqugfpi˘ItT ~H1bɛV&x\1QoPn$='g QQq>+87}m pnpJ\[%Ez$Oh8SLN<5:V`vߔD{uEvi'ǀNbq ڑ|>~eo/ElvYsFNF A3:{6 ^g0wQ HPO<"Տ` V&Z3 a뫺o:B~Cx3fй`>yn?O}13̘G EnvUƎ-yRY=|8)SkxݺS$y|R:v^U)5|alzc1N}xwLa6CT *oT 1QJ{ ^]Zkeѣ]]vSOUz8puq[!T#xd;n4i \EᣣaYȳǃ亣gӅ˛ h5[Y ͦ`U +=仟?pVri0)0F@fE~8t:=EKqv Փxg:9WRڅ).\Zjf͍wGO&G%"bWŃr]l)"cnU<+'+w T)z;\^9׬HeTzWL`ĝʈrV̂)"_ʿ[~zZz_/@ 0j@Q8Dz|Out@-B8O4agF`*됨^)}cfK[GpDk7_[RU <2:t^rL9m'婼ua}XCdSu*S ҋ+Jze/u h:<~z=yzDKn/J5:ճ͍ϖ6Wm@ys{6{k+AT嗟OK+HVAeRkT?X)}::@T^DB l n35.4nVQL& Ѩ Ke|z9%%B(*zB)PZ+̞n6e UK NV;繈4D%C1\|v* P}d0p!RY4ͅ'j]Lgf rQ2]뼷[[%"J5TUC&Ġhk2C鰶 'Sc҉GB)$m?_}⣜߾/~UDPڍ✳JU f_hppKsBͼpr6_#UiPe =o-tCM:mGi748d"7Icz4,fm'R YI@\GVVr}/Σ'gjf7S 2@&Xshx,0:&!J ^“ *,7?zT擓=XX_DEԃ[_oza:VF6 QQ!7◗QĉUW {rxR wWG'cDԈHmn\ؼQ% Ngc&YSmOmt2-р* L2= ( Dިv#wBm#$T+E)tCP@6"UC\MT K+mʻ[ Tý"ӡ gHA@c?2V@ñ vZ7Up#vFEjKj9,k9@9:y[Zj)j) K_ `Bz4<:]M>ڮn_&NX@Ab;j *9Dk`F4OF9oݾE5Svj}W|,%ΩY~;ÑV`ހ(ݯ?~Ț:;d Bɐ4ܐll PBhkNR2 Z@NM(۟_~덃;5_ZZr;ƥCޣ*Iaoz|2}㭣vFGvxr,v<. Pf"GP/P" goN vo|vt(0*@H@JdX\}i _<=A.fiI&k,O,~W(wg0d\bȝTO-E?F0=9̶pYJ" ՉBQZsK4b/l5|y# $˓gtz< '-_ 󝄅Eŷ^=hwX㬧9:5L?jp+Vh+/_ra+>墿=Vq&zzjrVZǿ;pTgޚמl7C-zUN ug'BRۯ8ڥf}x~NXV D{8ZX1Q'a$'`q/_ RbUgb 9Z/nzd?i(zB*@SE&LH2NJlϭY) _+}^}w߹f뗗3ϔg'ĥ%e卫I'zj7.Ԛ{yڻh"]齏n?<) 1K PܯZ"pB*g"&~$dVfgV2-0 z?8D'YΗ[FB$~0<ܼWPkq,AAB)q4 Ic "`\bbNjU3Tm`n9lH:IՁh:+\L![_7a4'dP(#S)Z:D/&۸UDSㆥ[)V[JΣHOs$X#DW#[FάAV5y#!'cwaȳ'7bs6O~0Wo>:MڟI5o"2&H Pwq`K.5CPUr}o҅kvhfvC#V 9 5~8Jr(ox*d^(HMk!`Xg>{3VJ@6JL>)( ! Jbi3ITLaR.+otg_=dޅgVn|v}I"R{ hpbOֶ:Knouyt$mccke*$/29ƃI$j!Wfk;dÃZS`-XD@%^\n }Mԙo&JS֢8 3ai,;9;x0 ޶HBFv +9q5MCqs8An8XsGR^pss%x'xhPJI+Kܹ+ 3TIT}yѽ)t!nsR9<7M#:C5blRwivWa lB.+~Eui gp.ջ?(]ZnW/\|d\z,u!8ڵ_^=Άۏ JW;͢<82O@(,[kW(]dIxh&#t4+|!n/ o}~<ˎGW- Hէ:=Ȗ-N_;ز:Z{sϛ|/,-P*I$Ґ"!ę鉎EkBRS"ER($ _U>g>ݽs^kJDE=geGF`f//$UBD2jB:o8VocG<:YF5;=7WcOcIBdy͑Qf%FZE&8yW9]# egs=n֚`fS6*g^yh'}cYZ~X,F{FN$W6X ??a=VgΞZ>91^GR@9Mʚw* Θ$lɱ&;g\=uʷ\k}6.W rG@-&(<Vtf7^O1" +C9A@%e<}1|N0ͻ$DVhD4" w |ya>K»So=ztr#}Q+d\N})CUWo۫e>[oc'Opwqq'h5rtaT{77c ю b G" tZKKK[M#OkX P+:|Hٿ/MVU^}%qw ,*}ԅ!:8v;ey>v-d⻑ j8u[i| r }`plXS;O:%{Ў 51q™7&W: L33ڍ mkmXYK\R 6392TvJs+nwPwMT ~ϳ|㫗sc͛ A1gz"6ىwY}Ӝ@3ܲA;E5:۩$?p۬ ]3 JSw@.b8#oӁ5*ữ-~u-f| (Oe0itcO1_o':b;w0Ns D|sEBW_SX|z+IPv~x{G6쬬u!ފMO#?O~| no5n}UUg ڰ0 ︫|݅zO 0Su;N,(;++K=š]HmضƠV /LP ŔF+y_Ӯ:f1B^v_D 6Z1dR%!2.ui0ƒ$:1So P#*Ou"r& ph.aJ@j &'h=6YJw~f#)$&PI׿S<I^O%,?{mPy2g`-(2]GC'ijO-N5:22T+ ǻ=7tY|m/ y|n.wNc~܃>2=Feт,~{ :xl}jǾy>\nIsA`P ҏ+a+ElcWT'Jh.+֨PW:gߛ׷X$W0ll :I*H D+/`yֱӧ㕋I)E/·f'ተ6|6omlGa}86WotJË|IN4w%lύ9R$A<ɍko]G 5l1+;k[}}.6Xp5 `|nfmmy/*UiPj4jƝFL#LxC++XBw݈Ial]^JD@ؑbҘSb#p/.4GxR因: .y#  ֩8] dHӓ3U_Lwps5IԂ>DC?f D0l^-0zQ'y#.m2"Őun;!-ojFQ@/?+KE@BA2%7;S8zLz^㻗Zpvs(6KO _yyz<ϫ:*q鐩PP9eS]IE\XUwZ{:n7%څC7SxSL& ;Ľ7/cp#!4I2yTi//?npJ!)0J<4f84."|fu0rOa~[9vQlqŗ{4F~rfhrdWַcU:2)ѼĹ~?C\>{n^X"fG|i|K3aVqZ U/YoǢ|kб#sF'Rh@aX=:Vy}s~ xl1VcmtX@ 6:1g\ pvov_bM^/ϕ;i향0d JQV}0rI@\@cR*҄_ˈ|9V:/m+m< @ad'|(l7' )!@&wօo|䡻ޙ&Zknكfad>G\{6#ŭ-)ʻى 5@a46[ssڍI{٣Gkf7Iaub9/&IDcM8^< +~69)  Q.ɖW*%鷇˷ N<-M ^wf*3x1%:b"L+ж ;B{4(4q"xt+C9-UcV 0)ϭ]3wK2j@E ]6J3¡JWZ DXC8*T&1&ALN^;KϾ#?t+7: =0Ƌ~pjV NvLnJ1k*Fչ@>owݰy >xNN}APZ#lY%ZXb%l O(jOaH'Ҥ\{YM=~/Bd7"H%^5^"/&|6'M.1# q%bP1&>qQaF^=ЧwϷoęj):X‘}S%x/Z䖗tuzJ6d1흃ZAX~Qz艙J$` a/=yn"O&v*Z孶!BsI@ YH5K%@80qntFJ1"lV "f~ %WTPw5 o̔2.6/R%J{|^@eˇ" \ bx IH0>;}c?0VzLwife8zjNCEAz{Da$}PHs Y=+t/_j?y Oxc#$D=VfTc?\BaA Ft'HvR:X@+p8o =(} HƎ~* 6{4 "[E*qU+͟*;~r~pׄ>1H=D! \lNA͉sC vt0)l TG/@SZXefsdC1 rxm徣7onc}+b\Ramzft^Zk/O6``gt"`(Gʞ [+}.l3tJ7 xe5k^gZ+e5/VE^mtĤwN/ND pzZ@&b^6l "jt— C^qM 8ۢC fgV@ aB!{DTU>تDg$$ eX 񹣥ЯOL盚NǚM%FxP )Hb, ѹ7:oPRCdAٖE'd] /;y4 vuw  D:ß=Ο7g.您}sǍ4_?k%s>$PwQrCVxM*yYL7~G/3\[l Ӟ`C6u|@䁮= ?M#h(WAz^z.z1jg?)n&9RD*CySgLfqV=XV2g^}{]FKncru~:S9z,nmnwx5<O5~ę3fyOp\?<|Asi~/!mQBBĠ9=)'Yc 0!iQK5t{+Β,d0>37ae@0$$AOz] "T˅"B ђ$)/C~h1jN]޾kl$9uXsi5=!ՓXx$K{pZ12 9(&GYU81́(p\P ROt7 4y1h=V^u# T5d\i؉¡Ԏth\beQнr+wwxڥ##ʵ㧏Ww=;|9MצŽ`6ǡ>RC?Rt{;&x05|azft}2UB!<<374/w c&:̏O/D{@ɣxZ  [z݈DHaATTi^oF,˕p { "M]?+tI7TXLkrM@d)j}RiU0UZeqipHBUOWFVо(J:=FIXH+^ O^exPP"݄YP=c+ 1r0=<nI`Xe|w[+Qog٠8\{v!(tzR03$z;M7ا~Ͽl'^#*ae^BtSWو_vk9̥'%iyFD 0z7/J6#<yd:A+BgIs>R\xCd6܂T~ZUp葋Pgd6nY!+/M fRB +}ow\n|]N t'?]N*bZdk묊COݱtC\>zg77H|upYv6h:<<[מU &vzI~Crm"n`ڍ^b5 \yT9x~yw71 0B~ّBRvyq+ʍN^~ddKm"Rn BP-CcEVEO2FZo%FVP(*w5pci2 3g'ʯM񟴮.v'Bb#Cvn5pjKB>,D:0b4`.4kK0(Nln)A@ J{۪2^;A8r|"̏ }IBt:D 8f79wn\ol9(Fo¥+ J -ҟ?~% +g{AZ+oܐ$G|8 fll1TT恽I؈MDb:v[_|fv/ oD;Hj&+ ~_{?163Wʅ a[ ArS>]YJ6Z5 D!=Yo{~rׯ鍎pҾֶ"7me)Q؃ӥX(QggWVߘ8{уD{}i,'O56V͵a߹ƥ@b%4peIg rK<|h?z'1"P(O:]ҭbT1(Ox*?OyU 7اai;+v L/b!.0 pPGt:h~rJ@w\C G|1˿_?ڿܧKt!$v;?.&'U?rZɞBygxA0Q$`h6סZ^𢻖i2$V7zJˇbU8 0Й;wTQ(Y{G  `z=CJ6z F! Ïo n!.9 1(n4PrrC%7'IP\{>?+*OWs;cQ˝(iǏ>2Z9AV1rkC`f[hԀȨhAXrϽ_ A'N.WWQ%hmN İ U+V>JӋ>i`75JDdݱ $SڞR]k#ȔnW;ORg;yhdڕۅԨ$3hKs'/SJ%DHbPţ7T& UʶH>(P."7f andfsJ<@]HDZ#$0.1(M#Oyw>>f/&ݎtzCw^zg9);phk*Q IH[{M?'ĖSY:UL-5|RqT>QX :fT!=Tx_LTwt$fgAsR`/@sFTFC[;ab3ݭF['},-\<;{tbN_/$!av䇵f$Bppfh?;Fo^\1@|?"(׆kXB:͞جy%Va!X}w+(5^ID3UO3@ ͲΖz}XiD] 1d6Zc #s'8VzdJ?$11l<t֓ _;F^~^A(Ѳ褫9ADHL3pX A.-jXXj3APv#ƃp^+  ׊c)6C{T#_yڿ'F^\' E9s~o˱mmIq,Dp!`4=M)|;1&=Wk.W2UıO5LMxT]Hēww;w䯷c2c'3L̓~}Iydٕ?O>OǞbu:O'pD[ 4g0cw|KݟkNlv1Β?v˩I$XIf<94 HE@LDD42Y`D=4YQV pNU.Z7b$Ji>߯@?{`LC9G FhbP;CNx'Dc[mR-(Wwzѩ72T~ȣ $@I2z{ѹo7: WKO{>%(Fȼ{宼^$+w&߀ a9v=M;ƾ~X)A}Ej澪a跶(AE:xr_Arχ_yn#a7ґH;P?ʖ D V|?OʍP{厧ݺzʵLZdaNpr{5 , d}S{\ /_%" rSёRGA^]<6=RHlEA\`U fϸbDʖ\QMe Cn?K$&Ͻ mc 1xݠȝ΋Ҩ {w NT2\ChqIf@4${A׾;gWP7$C@{8){Կܪf`l+ "Ȧ!Raxn!FQ*1̆Б[=$3ww|;/̙vV7%J'w[~?Y?.mv :@vH(E=;t j`eFFdֿ G%}R+^~_<#\tw9I_8udˠb$ 4Cȧ_ym73͈va`_,Dž7KHV {(N23jy;gy-y'?BT!H{~jڑ[% Gs.˗.7FYԄCՂO +jcEJ˜k浃8Q@jUN tcQ:;5>R=: y@n$x D,6Ć<L$ 틍P3m-i%]nѩ) ԰?x'WB|-O}tuu:Q tu2V+"Gbt>b qW`uX.F Eg6΀N:̕*U > D 1 )$"Ujѕ{+~eWl8M( .S̶q: 0PIlZgCm)_iOdS& 2)g9Z,9:䫡qϮW6;1(A4Fz|뙎`(Ξ[I02hd=vP88AJ*qNhwa{:o2%E"aAóH#D`LC׏}3I dS;z!taۋlfm7O_ҵvgq!{gߍ8۝$9.v\4}Rv(-,"a}F_ ׀|ЄK"mLb QM0|7nPA 7<]'AN^o:㽮L}lk7doy;:VISS20dNs {8 PwK09$j~>}ڞœWz{k:v[Q3$ R [o@ 3 Q Rd@BuU_b{H񗅻3 !ʒ]->zqPˠrŏW/^NA `ed0xэj͚DLߝω<۽zvmSgGtd1.a0"hX\A%{yoo|^+O|3 GOH:,UJi ( [oH _(Xb*BKa0 o/ Jӣ:(;ʏ=X@j{o.cd۳l%dQ6HJ&[[l!I%c6WWӌ^uCXbH05|P!B8Y plH^'+Nۨf? @ڗozr3Oq~3ÁlMP!k2ó7((t@$Ol>Mފ}oK)i-1 H$v~{'rƫvNqk(N49e,F^ zb`۸HV_aw$hq^^%[bKJw5=~\ T*D:tlJ(TN>__?'.Tc[`;8CZ^&HAX4fDQݗO=:vT`Ha{Jɷ6\F}jGqcse/bǧK"ms[gN~x|bZ J`a8jB J01ҵb%N! 'â@@j;89]gਏj T*S_bt Dζ%ƏU<:  tz%d_$1);-%"^8u-E)Ԕ?V3BcAQIy'^(#+% )%P*fg Am֛nIb֦~T>2~ipʌ9q}ŧpccK0[o>&I3f2̚%h"ANuϿ兦ⁱ 9ufIq1%ۺN(dn'+ i|퍈\DF'uBq?pj;JFeŽ-JةM+tI/#ec"_&D$&$@ZϾ/w?̩a `. *I{v?tzǬ4eu(09=ʅ7vQvcTDnj%@S wbf +v561|(0vJ8fŵptXb S7#A뫵d~EM]V)w̞<O;pT+n qQIk bb|?I_Ic! 'n^W`14RXI1R&_N@m7`>:4s7F2P8D_UGrFMEn qw+w2A}Fq#w`dL!c~w JVlD 3K7a8s_]A`AU96s$T=&D$1 1y-0`ǿC6{j!3e<\$6wo͸ϡ1'l}RP;\byx(<*,??rQ1/wD_6[?^vs #檺54:ɧ:,w ędݝ$rd) KyL&| 'v#"D(/W-\P4nrn!/tOW93+=ؐ\;L,͜ml:c]?gy.#, j쉇N#K{ONݵ-t(r5H̠P] &&xw99=OWHNPZnحE@W{{w{  Iuh谮V.(p$V8 qFG`u2"'o}2VJHr?TgM^0:mѶuUFà"Nb$ӷ\kA|b d+|rA$6ㆨ)}~QԐ&,5EA L$ԆUVӍ Ц}aBBH=Vn}ѩ9`j>p+n%{ן~e%!V kw.zRV.bd+2ҳi^5[vC()HG4S R/8R6r]=<Ѿ  <~J +y5I{aoxEXWT'߰Л}c%q<+5#o!I¥V2 f85 A;6ԎFJ'l66%pׇNخrD;Qa9Kh0QWIa3%BN̜ (0Y_uڱ {msVH_؀:5P%L0p' pSCG$n-8#fn>/>p?^eܰl{VaFçM879_f4rtAr(U$WpKf{=D(/hl'B]٪ !.Xl6&&^B L?nh.&ӹXH>)DoϬMʃQj9o+bQMt.hW{8?_R:_<ljp-,T0Ar21;5dTNÌLHCVQF7_{G@GI~xʆOM^05="$uz־s^OB%@|:3Ȉ&7ZmUku;l%Yr$f}? qIG~ԻH1ˉڟTľtvĕ]cy*MT@Hn?B0q?Ww Iu$/Jd~XP@p!U"%{":"#&[X?Ud0W?;PQ[&SO^D14K^n-DAubyqTJ4WPS 4W[o~ѵJeܩƢ0K 颾PxpgZWU֯t=6 W7:qq-ܗI,(;ջno)ELB7INf0ƑCK6AtNO  .m6ZB8Wۀd"J@əHoyy~5򆦇TZn=x?/Цi'A"bRG*; [%^5wq?%q,9k[no'QI!l8Tllou >@"*IpݸLjJ1>@=3\ӎl=# {GD+㶫GM=F &ꮮCڭ~ GI' )[rvW3k>f+#y4 q40^ZH% BtIR|*YAX_=55eAQP鱧4 pd0q߯"CS6H*B h( [/>ފ3_}T_Ν*IjlO r@Fx@H/ם8$ͦ]dN# E7m;*eOZպHao$JB)VX m)rU82.#Щ${HLjmWJ|lL"LEՂnh*b k+ MMRp$PZ_ D&vGXɉw1梅9nѸe"hDl+f[ȇ$  hT.)UfM#.@i-^€-~x"4:ډ \w`&I-PA7:D̩umۄZBJ$ uP]0Xm9eC"R='<@ѓoozOҶЯ5b99m*sj3;쯏}+18Se*3f-+&Zmqr%A"PˉI\Q>xD^XF$Zz8-/GL'q,)|ФAxNb%  7wߝ:qWY|n=/.q9b *#սk~G [tc0*[n6C'٠lvM0$nv Fy5dhS]iYVbHi'B 3%U_rq+ }Q{䟙W !U=1%LfF=PiA> 0j`~Oֺ vCaDw8XrZ!Wϐ*3s N(cIPNOhG|DpJSNcP WXw{7?joo4V_V}4 ]{r8"*}HoXiէ=vG̭-/'oCzRY{/8b0(ApG@(Dh|!01&ʛz;؇P +y0#awa~Ϟ9y+H00$$"DadPD#DSox۷=pixz\4> vlDb6䔠$0:v?`[mǂNd1YyQT$V@4Y>Iz81@;#8M\%h P C>4u1OUmK[4l($Q'/ b46r%\ 4: $l)i0Аb @%¡$9 ?Ɋ[ ),á)>HPvfEaM9"?o HycɻY!QJ"FĚ=Pf!N>?v&tcn{nyE,`r 77zF(kƯ>{B #cG07sgmq|#SyfKE2q?1E #2#a=o`G (k 0S@>$v>T``xaZ/ HC=Ikt 2#ĠJZ1Ea.oc$E(L8:hx)Ķr!A]B+ bK:j)8QFBmVy7Jqjs}I0uyi!91k)n,dĨ̇UQ _|n1ATՑ~/@4d\HruRT)dyQP}d8#o/ԆR:[T1AN+~Qc8}Kځ p&_2 6y@ D jWE{HDT4(tG fkJtf3MY&pabqe(VF]YauJMwlkͥ/G:  +OE/Wʷ!vz&H]=2;'Pߵ:!KHqT4>q,F \(rǵ`ϲ@)m)b-RH:$\#o1 LӒqmOB_Nm+dy)xR+ kvT".WGG ˆ,~pl0 Qt[j{{Hls"x[m:;Z`a1wWp;XU$ )AqDYI@$-, WA)y?5&~2ݿ| 9EbQ%1u 2IW^ j)zR쌭M5cky{oDt: )6O7t}홞6H;zvՆV^֪3R1҆z>R@ni 2= ,ZXAC* FLnF@iFZfoP#˫&Y{N^qSk:8do~/ڣ?#%"wrVYaIxkRsFO!"`x.otɟ|CA;`2׹%$4$'G/%$fKrDJH fO=97nt!< D1-  %uI7aeO ,C V*6Z݈=~ zshCw6LZTMY5,q0CP83= I.gJ#fɫ DVH)dÑh *3b̵:Yv,LaP- >&Wô۪C3@B E\QR F*> p?F"4$ ɩ˫yc}6璌Jz(ڟ{~Ӑ' ƿ;y'Bgc6P_g݋68=sѸʄR2/9d٘b"|+4y[7#ED_gvbH6ރ)#0 a1u)[[(B$@*?3C0 ]X  ݥ+ъۯJɥwHħ._?"%&Zzo]9w|sNkay^D׏鍊ZY%N/䣾JȉmϽZ/PEqڄlz%Y  2} KvX$qHCcG.KGu%sm rqblYv:̓DRcF6Q U~IT֌ >$"JٴLV[a Jm)3H!1 pXp#DA4{6 *0'sֿf<6F* >pH. R*Kr?|L5󏽺ƆV}̱'f #JtfW^:J3GC+7 ]a`dK`^bЧ3iEʛ;~k:ςav'ր;Rl@sg]RK'Fi[6p˚I|1=,gB@VQYH(1B3sH`n0\~B *BB򫣷q?V+pHU;[xrdwOH!!Ҁwn3k'LJBaY\wr/ @~b(97_^ƆRjo6#`F{A89EI<8S@ܫK.c=Ե?/6#f=%ك SN8<{ĵT{ $N#^>(e3#O_M9-v %̏j(?ВmxjL %IySw pHJUNj_\?CvfqA4RP!NtF? B*{ߚ#Y!?}&y6z\R7&/fyGߝ8"wD9XsQcx>UofOgy &"]JfZ*&o1x<]GR*wwE*?vr@x Į ++nV `L2n4!/K%0b*~,~{=0Fۉ"I42⍟mV_N(OT"_֘.v~a#O7{xO¥6 `ºǮή d^}cYƂ"b)0Ձn/罘dsQFSg^(1cg̓}~p NMGBE$cr Wpb ժlMt88lGN%7R8XtՉ !Xs~/-k`oɳͱ*PUjT/8f!JDWG6 ? I AǾwDlmNnE̢t<~:Gʡ&xUBtҏI c}Kc;lGةzd5g"*5|؋_l#tP }*U>s$6FĵLbMJS~ii/lDށF>6% "gBvqx oy/t hÿ16= =VBT̥8b&~3~6Fbekn\hOtNQўZ];,Q! CpgJr溄s~zW}O; U@`wnlǗ7AkOa٥JPŅ34lNO*#|FZ,*=s;{oydfu{Gx^ʲAt(ԍʉr :/DEl Dm'Q%0G{ǂȒӑ,? dȹc%/}/H+>3R8~wk AHME.VDW* KRNlD!gBy+61# 3YE8G1e&8$`8y&^j6H)8@c$D*T6nl-d,2we4FW ESƵbCoh_C<+/?mm8[K&c)Z:>iegNޅq!s   Mԣ7V8NTxCn"c,.Nt~~G6κ0J YL6)| _g T, "8ơG$A\~q }4 ZVCU8bC-2w~g=^wmci3I?N K{ZyO3B IY&x--Fh~vV8Q Ĭ2{ :=ᘚQ[pmSHoDDwS6$IqY^H2,F/?Kc؎1|7[e;(2@LC3 :(P;9[-#H$LUn: E8}Ƌ!1ł7]oGg !AwKPV[A6T6Fs8O_}]vIA5鞐S [KA {fEj!j.\\݁܌Jv{y$?g;5jQY_XkcfqD&/~?!Dn/ 64`МyC7VÍ@"?Kfà -E8aعƼn,Qg:,/R]Z١uDMTbTh\+HK zq mP@P՝["t=DTQ+^4'G,=4Lr̅$ X0 \qP,"бdqyGB!DTV4i[Fy08m"+3:`UWft-L.޵ ] W?׺7M$c'^~қ~DTL||uJ)MuV%lfeV$a^S|-du:"-SO1n[=xdr=_(ͽ@t"$͓8jTjfX;u  |0w[kWV:jh4@0-3w__H 66>n=2wW6w1$2 3a4o/C?T{?+コ Sm<yșۗ32F Ƥ[@Bv26QMۏ>7YVxAyggS0;(!`@V I/[N7_ IQ0PՙBWm.w}ժGƈœI mD1.ϝZlFYHAjŀ%p/kY'$jֶ\CW)=ɦR x^rlHʞ}Uԋg8 UiyJʔ ;InSpz? 2"(U?[^ob5$3/.|c +&W7gnz5 U*QOa$6USEq^Z}hJb{N{@` t%tHbBC̏5MZt_%:zsPTëAZ BQ.XѹEʍ-"Y臺[eac(mz(A֕S3y,Φ B^ 5=JMx[1O5hIT~`RɔDhu y1(<(DVZ!BĬ6k*rY~"lF,驐=Yyy[_x6{+w3y33/}3w,+9:z:҈KJ/RJnN!{Ѝ.o.DV(ύa'xj$G}Ž S&&?=؄W^lHzfbL> .\Yf7(gLA O dF G*`GZ(fd,L}tx>LTvI߀l7m|pmh-^ys>3 qcz|4<ƥ(1r\ۺ(iMX[G$&:ivW..7{Z^eRKw[d[[ :]`ߓrqӨA; Ď]+"Aa{ۙwm& vY؉cʯ怑[ˉOFG=BŜ$,aح_=O]=0FR::JX)`k M'1(5:xt)Sg[[[ " z tfBbIʄmUđP2rKk4)X/?{h#Fο!.tj: q6ɿJ;Sf|@oB>f%@k"4J߳:rk F# | vJ((`brة۠w` YG&*)'i2 DF)1߸~y'fxxme_;{^ ĺv-#d &ZǛ*յF/%X8Uĉݯ?}ǫ?Ӛ_w EF@Tټs^B"AIZ wu:[&}yg30w|U DRV6X3ӰsN}HccB1@gxS2ʊ@6;;~v4#ynֶ ݽ0(la ?_P(zxKd}<- ù".%HC dDMu–!0Zo_alpl @BytAr mz3B'g{yдZ_Gu؉6-* $6X(<||?,7>oAz߯;{,Hl*W=79%Dig}X2II܏g_a)nt"Vsb\\=̀@30 4znH$]He/0Q i \NkCFbrv CM8Xܥt[!F"0y %wރ4EKU`!e6TOpHN8î4$mdsH|yTYʣ9"zOI1(1@xkm&꨷?OKk/⡢_[A1Pں"g;7a:wζ'=Ox mxy2( Jqz&ACNo/w/3 Gb! (+ +QM罾w|5r=zI; \nkBkHN);yFywYVDMLv!&8:+ )=B\ *O6F•KR z ,#dN6Ǝ1fE7c@Q[~6+Ql aAĝF,/~ꛯniD/Џ/# ˓SA~N ms!XEtגlN˟>8刺&H";7EH3"M?EH}H -;Ǥϛ| HA(J1jI1zzfb&?DOLL7[!JDU0S^罽ߛ>{͇},}7󜽗riϴ̎@-i5ҶHqeO6XFAP6NAg3'YIaau>Z{5։U) M;AO?{G[`[عl $GղLA"Bv P+^/t%(tv-Pf[ݳ{sS~qZ'ZNd1}"rJJD<}X LaèCͭ&n5++c|YjFր b=o۹&3Պmm  t)/۱ޅ-P[Bb@N=W@P}fzn_!t͢4 \ $]f yؙ;6e> }j `ݕTɢ8IW$۷|sG$pq&F$4{QvûKڶgף_*rܼe=UۋÓzkҳ 0U8ƯpN0h]ңK_zȯ^_?ɧ;k[ AF,Upt r;UβåoJޱȾWG p<J)il.!ܗɠ;Aa+ܟF.6瞌(f( S+I`Wg;^D T@m8p٭ʿqcq3*yIYuag+Bzд /VBF.gSی}%, DPޛJ#D i(mK`G ufW+!iYg7͞R}-V@)sz1 b,IԷ ]fs?,PLwTluZivLݳj IH6m% C䔒)iD4Xvy rB9~]g'FWh]Hd3+?Sxڦ *-dY+ VHuf#'>rXo4=^h"ڙ[W.( CN=vrR|&IʜkߦٹZYW}B)&i uO֗o^o#߻{{ :RRj;x(&u]1˥@7ﶜF};/zA40>mxv0?8!PAc'~-̈UKo Q_ ꎬlLBՕ<. &DX:;k##Ʀ-y6͌$fdČQnt:/́1ӦTzdPB%0`or[%гCVBkm4-ٶM3ш5!k@쉤<拻D\ȈZ{ۍ["0R6g(F&-MI 3dbP$)\NPqNHq6#c>b?՗>qeF;R$v]߻,o@`u,ҙ7C]<}+πNtNM5 Pf{Ou}Gy拧"BX,.FH U~}%ڭ"Xv2 8\~`,)N썮C`39˗./R+Ҷ 쑣'^[ B>}عP P$3nyayssK /(ЌY fD9C#y K-n~pD z[|{jAXnɝŠ6{6ck0Jo.6}k>b)]g'@m^C1;H/b(Mb+Ո3J4GchO&k02gke+y BIJ;v[N!e~kNjv@v\`xزC!!=]WTELcth7,b< D`nu;@@,ٚ,ۜ-EFxφnZ;xnJ2<(}kxp@I$6kx,h_\{CsmcY~jzAM}Y8ʅ>,}(XyHp ̥o#ELy#h3EdBoꉍ#j\7t-avfFDXڗqalgY_S(݊AJb&3DC>])cg,]4eU;KB%{;_ߺHҒ#q} kmٚ{JGZa"}CP  ꨀ?'.Fw; .Wuh%%oP9`xl5©O2Y4aFkFfl0AǾv)JdXiqM8iLI u'g۾,ow#E2!*vK;RR4)x9*V+H@!h_I)/]RJ5uxՆ%>IeMIoTSi,[ 7C;"P9eɎxD65L}KK@(Y&q@5D@1ʍ@t^"텚ٚ/QQǜUU:[h4k"L@-qjx :621H PwSmAԛy#(g_EJkg;]S@BɴB=6orn[~EZ|/FYkKEdJID `˿7v%UJadCA)fKB'aFFxԈ ⮙䧎FFdj흩I;\Mi|u4ӡJlB'H8 v,E*/ }Y&/i5G9B1HY7,ٽ˅l-5a݌UЕc1 >|cql/)0ڣg2,A!H]f;Cɂ(YqY$;Rp1:(BBg-Oy 򸳺0,Af1 䡍SH-|@WM\XW}3ƿx}G7?O?`ع-X=!Ġ{ɧuPb_031JT00s-"1zJ4ko,IG B&˵~q{'Z…@[s18b 9݅HH3ŘM aƽ;fkH YN=;ѽtAKqec`¥= $ ’Q퉱ySF[-?\jbVJkkK4Fa'gRhG@ zH BlxVD= +kon*♵W.}?m$ݭm,t/aK R:Wl1K #aE|EA{tnc<Ln8VA/ȈJVb9Ao(YGII'W?U "dyCcΣXD*B]g/Vf d-R d߉+JśI=L80UrwՂZѵPu=;h#a(腈T>#L^ ' FE@JxPm`L'MU4he!l94 u@356o<vytqx{R4B@kf޲䶟w TuL\L&)c#R'&uz;Ha3ЛR8w% >*Q3( lw h02 0kX׃2Ao =p8;l daძ7tK:X]𠯅Ln)-Y+\X:Rӝn: 5GJǩ )I'2fA|2\Vrr E`嬠(A@Zɰ^sw;I'ޚ$ʟʣ??{;*&Ǝb/KΒ2:+%pzL+(3uLI 0)ꌊ=ug敘F"㕝+W מ_gGj(Ruw^c X7:;މC>j>HLƑ9$v'g+le98=/ (B~j,Tr DMvW !PF-xf+ KcxkEC#LcY#o) Ywe&X1k]1_gcO56%_깱{&UD 5#Uj+ܬ]FBFR1hc\XkcX6NF EU9tw vo/ Fz@&}QrPpnyc4 1f_&ib DB`e6g/\*.ljd[=*`{xKBrBBڹѧٹ۰,4AQ =K30$:Ȗ v3#;v4'+z}0C?)r(@ V۵Q`O2HƓSE|;~ ^Yif ;-܇ZÑ 2qw.%TSĻ_`D:̬3}_"oGm/ndWwrl1^̖EQIQ8S'[Z[=S~by|fP`DbMhWmkX%F| 4DFVe_ #D=nU'б9Ѩc q̎BFPv ndIɯPj,OihLm l;qh $ԩxKg[11ވ{"}Fp:Jݸ#{_^0H0@=)K"4wQ5(lkw3i $~o@HEMҢ@%JCU* 8X&Lr>a%6mJ$5;q.}<عj$Ў亹S;-,/oti8RAsΔ`2`(jũvGƝm}=s"@i7oŠ39R_1}g__?Rl\_!WN=% SVTj€Ċ׷SrD!P}w{Fb"${ S޿=cZ3hG^*RdC߼$TNf_|@,b.h4`S+S+u5H:"bdjJw-`Vچ)9EF'H d0϶jEW #DGBr8m_xG+= q1$aPʎp%8K1m-yNaD=xg6g)ۧo:OtXSt#iv97"(qbeR$0>D.Io= ͼŮq/HƑךupu&x9o# BNt@B8D=$0 k} /\ңLC#Ibցtq5qOs{d2'@lF|MHB"qPyh ,{w< 7喻vO9B Еs5D(N1m45[R;d%4ALb( hQ3W?~_|;f[q, *'G}'{2{?*Q$0B@$˖Bu/zWQ@3*SP\?&RNE rX:n,3Z1 R~aPHZ(£Z]9P]Y(^ol♵,3˩~y#I ~Z[ָT,mhLƧ~&@6D3rkKf!R婭z7!5t-f=Ӹ"hyJ3ZPXnppͿz(Y?lB͌0$.Ȳ4f"Sp-uH,9s|B/g=b;|9!fBcTAL@v1sRjP{m%­.a 0@µ_/zj[8p(MHٔS:IAPn:sOᄆqrt֓8ҋVIF/|{{4hr?q=xo /.NH,BW2K¢ h!ٿ|YKCs[nKZIWU.@h@@ч׵)7[!w<&藸AR( BD"Gs6w~+6hރL'8,' gwo|ohx{Q"%mkC#a7 ˫ C*T&?$ M2L00 b -(Xwџ_4B4#Fsk]p+M8B Cѥ0e 2j+T797@Z=]r4j<$~ڞ{lYq6gz!t$B(كe͢$1P3I?x-q% hƶMے=jNy/GE@R죗P*Xڈ+P-_F;%'r~(Z-Xm3`} }n 1JV\VHQ?`}wSJp)׹d@ $~}/iϧr!ɱ?yA(OuK\pcYR‡jt"!Rzo\"؉AI5`. fԗ9*\]] ڞ$4ht&ϝ|rtd>.L׌^&S$$!Vx Z-?֬Z}s SH) ؈H8S(PZ/2yK+a91=`!ֶiGfJ7&g'Ϋz}[@w}m{/;6s>{k @;:y/Zoʯri`t(bK<14Ÿ &B A%o -U6FeլC5iG\f`{yJMt]F5WiJN%єNJSG;-Xs *G}mai&/B-0Yp !"QwK4aד([HQJg|_l+fX@7$D95=ilk<Ѓ NuD<@&mcw">~4D@8M$mIc~a[%]iX);_c!o*^N07'2 PQ@"1zћ\n Wf}jznJ~3͈LB0HۑL}B华30vb]hgepMAuɒ,VG&xknV*zAHzFQ{;7)n vk),i!{7nN?k+"&eI1Ըv4K'ȱ8u¦]æ@ i%%"].};eJ!3#SvTfl}k^+BR(2nD-` ^{N(͟(1?ewV`B[~A=|cO]#>0!n{m(nLr"A$ q,B o7,)q#k ]9s2Ffmw$_lߒ^3A0dY|{Ȁv7d"1'ŧg (knȒPCbﶷóBP]_l2tgBf^*  ݰ m[vq]x+Qu׶6=c)MшR' p@ R#F8`kv,3@SA?<%R[k[PlS]ġ4&LjA(:B@1X.jKΑ@9`ܘ}Kخd g_i 6׹bBGbzA 3N'i8AgL%cL #D~z[`UR`Ĕ׮|sg~|@Rl4xDD(#Fs+Km/TJ)СNrӁpȶ114Ȳn6r1`ՈTgK8XRʭVҿzw|ioa+Pt{'&(m!JSsotz{O)2NBJ_"*?̄ipr2"hԍ@|Y>63nWk Gny1*ˋ<9RaIZʩH#w񮒘Ėc,+qn`B_:::hbף"*GQY?#~ hH{8Jsc&%@bb9t7EwѶO4D`-_anӱm['7}G-p30ل{Kl^0LXC+4Lɭf F1i /J}lަrlϗ˫aΞ/{+[ĉ]{Dfl'Szv`ōv7 ZE:[caGaq %rs7;RPK*[]m_^8Nl|]mn *b$hf3`^kUeK|sӵE/JZ3Vu=ߵ7q:s2eJY8 S4=Ʌ"D@Bwn^A =Z,n;0jb/F4a$, Xg'OS dXFIqjl:#;hWYv60@Hr|;;G<Xg/D5QI!zkb;bfLήU27:V7XR "+;^}e03VMCz¬xP#BL38%@ >6ha*M~7}b͕qHB+m:"+g;ݾ3KR }ۚRk] "Qw0'~L"YBK>YWof{-m)PA鱧oE >? Fxgd^lzQ:52 )։ 1>9-[/٨m]dġ?^[C=yk߾գxʚQFdH$iv蓂FufW:Qk+Dǡ b() 㺅"SU hPHivg'W}OLnwB1W*Btd #* VK (s/b=g;ZhI njtD{ϯǥĎx`񨃘x`2%kPm3SXVq{Q (fV*عDbkl֐da*3@-;AΉ1Dln$Y*rگ"Nѻ=gϾ돕l\Pɖ)$A>9[յk# r{lDoÙzmW]L噷P?#wqO7dRy-#4sE(||j5>*n?x+ o<]f"E'|ŐǐWq fJwD8\%Ä́?_] |=U_oˌejU=̽,|O6^ۋ.VhqȖ+m-_%N0¥jaQbT6/7h)hvS7/h'S/~ukjI`[qc(+nAVVf)d1@&D))4FCDdJcu֫Eu 5XEnXGj[!b}J{+cG_,24{)>dyu w֡yV {c D(dտ6m@@$ͱYZ}0xoqnДVFldB+K>A+$5":w# N|iFbQ9kϔ^^TvWq~Ī HB2H+-ѫZfY³ZGb=g D֊,K >r&j/0ZgqҚRE"3`CA3cibLƇ,̃N_˕gfWVNnYBd%N|;s,;&oIL"@@}#7Ԣyp;m^_laC3%?nmՀEhIKǵ2#˷;6K~qHRҸ`1h;unx~~R9ǷDP}<__Q8dL:HPH[H;_:sHA7`}vq}J1+X:9Kͧhq"3d=ԫن&j!őU\y"qr['Mouv , k@x7ol?[^ut5h(L =6f @)i}nSs.g|YoK-\I;gv4wOKZMPkaKne.$7"  8srgw_r=Zmf/|y5tO3 J0A҉7m&! H%;#?F[ V?PkX%@C*bd dCvOT\2Vg 1_oFQ P\}Au7O=Qh` z;]jnn<6 RD~{X/;G&ҚA*Lݵ&MY-/7PLGGe[1S݃Ʃ̆4"(d h586Ga, [SnuBL*E"NC:Jo8XL4SZn<1#8>@:fM2˽v8[a?#X9{bqy}d?ٶ~/}9mK a;T/ք:kۭ~ @IW”N6%dw>1 (m_͎ʆ/mDg*_ (SOկFLjO!ILyd--70֬#M6``q@ ;mhDJTBJa0Ȳ*o}M%;f6Jܾ'vZrбқ CM(hzn"_9J߈}MZ|/~kuATrdx/2y}eQD;wwHűxjjBǺiՉ034%Dr;XZi IPi8^ys07VB!> Ico,&~،`4 Bat\<Ur-ucp@b5ӔY =&BC_o 7qDMQD-1 iߟ͎l6g _Lۿ|/l"P9焧t?]<9w-)drݢU < 8u^f3M]W[R,G?;׿f`qp+jB#c(-2,>[mxA)+H%ɀ2qQC^ RM*Ky2IdRkU>[G ѝ s@Dz6~8xf hXg4 w0HZ򡭋 Wؤk{{BZk3w|ʖmS1Iy "7'{d{%,dF/߬ʳdp?x_,.,n&dQ\BJ ܣV? È5؎a&Sh]Llې:^Nڙ|vlVkK B`fB:3nݸ H߾K yȇ=.l5V&y$w7:W{V{i z!ޟ9df-8I5QӴ`]x45+̥EqP1|SnYPEX9P+>k@^؅dM~ޯVgȂh"" DZ*kŋ~O9V^aq~v/ӈ(FCspWL(,&ZZ2 p=[}E 4c#̶WG;N h}5&*^N Քd8dp%{CG@eNRY~@BI K3BC'k/@<LiwO2zK#{3/>Ү%03k.w󎖹ŀEj6m⵹8^nZ2CfE8Z؅_z/(PCXW@aI31ÅV7 Hif6`'"f: VP f[b9n6[ߑёbF P@%-"BP@[>[.;^}y^t./?ͫZFэWwW2"U"d $,\)>]-k4[ A﯋~?{}fOzH EjqeJK3S+S}td7 ZL _]F gӏ/*+$ґ7aJќkG OTjj zLEľ*7_ێ [;-mR0Q(_M:]?RN>'-+. rlqఆ"sxcs" +|Ozocf0fodVZ-~'گC'RPi`w&JCv]כ?[ lqDpkKm"/n(@[(h"_I J\zSq7[{N|ť@ڇ\߾81'Qƒ-Hd gkZ+!K]?" TR@Rq o l\\B@}Kn-I"\[F#~"j aBc[^89oۋ[}iٗzbVOՙSGeoЀ]]OvneƂp#"!Š L yx5Yc`K3#[²PGd_Ʀ``YNv1~p3""Z;5ڸ4HA,U@㇯^#̆=.A Ȟ +Ԁ](Twlm*!:‘q-j_7"DDFHD1 `-dEuD)(Px4ioq(R Hm$nѭS5]q&?쉐_} E<6H$`4P" ?-UʕJ!@`ewD*@˒LB׺ \g»q}#{6}W/FxgYm!LR#J`zعxzt[x4u@3#4=? 5kԑ<ɔfH`{f$qƷh5` n68$,Zn殭>Bfw~oV/8Dyٻz8n|ۗmy!ڙBI;]}˗ O*pS+=:.[nTnuDžGT|S"! *X̄r?8xr(o5miɶX>-x6%2X_E7J!peqX.3>=0 uCTepGI u/ؕ@'+QjJM( 5Rn-FW*4*WzeGˍvOĔߴg cq:9"81aų*aM:՛zJSzx7r738IlѼ{beuvZbNA0 xpʼnW{}9úd'/zhA@%+ɯY m+xAfE9@F<%t+N1`yx?zIyB\OLC4Ax{^@YhAE:fdF )>cS7Iu3Sr;6R0?Cf!-dI BUn_[+r~a(;W&_殖(sQY֠hڄ޻cc@,Qv?=8mBA@~?SwW]#g̣$eQ'n夕1-X, "aVQ(sC|aFtr(b]NdI 4)CVHh'j@h~a.Pɥ¾x`My$탻H=+t-zP~Vˍ7. +[Y&SI4|N/4~ki)+8R0O\s>D3#)Ajf"Z:u·J.s9g^? Ex\zHuKȋ}<}XNsY0~JRECݞL$]U5jE-;]?`{ETCn.|{wz&4'':cϾ9 H !c +#yQnC &iIBB = 5f+N;1wo6ښN$z[}/YEbڧXksj PNa3d|`mzۆrt{i_F?@b4(1Y -)GǥEY.^/4 A叏kFO& l 0j*:;F|ϥlB8s\@{pkO@{.r:fɄ9?kښ,*7n5Yd eNVxiԶ9ـl,aēu!:P`AL_,r*y/~;椛iph![bv0 O.eZxYE٧ﯕMdDڈF[4H|߃\p({RҀK|hN[6 ;-A #'Bi2ˬ -0b95odd!D!ѝ9][ˡ6PY"~,%U/PzmF‘kwVJr{G)B+e+ˌ=I13Hf{zR_|xI L 1߾dk[6 4kCRRɄ SD;&SF% gfЍK]/"1}Վ19 "[W]dW v\6޽LM]_Q7zfN'檰j-"kBw:Ad \'?yd_?LИi @e(nq8.> >W;\X10!x1sm>Qlr2|arª-6"[$ IF:#-zimkmI\,;M8/J6~Pv*$zdHoi 4+/!r},g}r*NpHwhlsa}P# 7VkO_6۟ ;~VDvizb1j7j2xJ+KF‚1ڱs7z*Zj8QExoe!v#Z}ԎMD}GC3jdo)8qD_a (;02Z v!Zpܑ"3zN8+bMbuQGBo 1{dۊ1hks& 7fC恑@*TA:mtm( ŦR{# ^%$)ete&퐴a`?p[%F웓 U/K*(6d_q]6acR<,;ڽAbqr۝Xnѱ<HN2W] F ҚXҁ\oUڜf|!`o8Wkdd]WwbbÔL ߡ1x4Piͬ#eړʍS;A?F'FLVY-I"RB`ٛ~]?ǎWTp%35hA~] fmgpٮ6!>LxXԻv~ʶrSA2&bEF4BHh<=u]i'XZ=m V ;y,*~d@vJlE$6{l&Qev2Y#cj"`"YxC%"/{"; l$ݜ{7yGwoQ(w׼ւGx%VŤr1NLbWJ+PaM&;քC8Lzm0 "HyvZ [ ݉f&g[$.W/]g.%9GZߏzvqxsǟޟ_l@@s*lk-)µvϋp0! Ϳy9\cqn7MׅD(,),u>3 D:Zs)! NJTE0/Hinv{)Tk嬙滂]/B IYSq箯uJ凞#q0Nɐ ޽sό,67n"%[Dn\'.)H%we{ٙ QB +B˭z7A1,pQADf񝮛z0tsLD" !|t$Ocr)قTNgc<>CH`DRӓ9Fy 3i9(FZCV_K l7"5PYiK@;H ֹzf/b]16q9hC8d po@6;&OŊiaVfZҮXj~TV3j@|ΫlqGBq,3D7 RLJCq P Yqz \|5v#⿵mAFKӎ2:@ő{Z@!m'449܉.}'tXeӔFشjR$Yp\ @$)$]N?tX+6`~!xrjLk6;%%"F^\5mFh(f!C#"^xkL5ᣈ p8zXNHzf+wn5ULQHngG[VfqyzfUHc 9ZH'GHhd8Ԉ8vLZ(: $‘Cܟox"͚9ұ-v~! eq \BD r3iۭWG 6{ -K(iKU~QdK"Ip rb$@w׏?Tܶx?_wIrsgQfyֻ"cPC wt۳Ksoo *@2n '߹ޙv>͍Q,!2vG>tu%E^72@"rscѭ}(CB2'@lܤ rbBMl1{]MA{u& ZN(,~b|Q=$BvN,H?*q;yFD06o6Nν-@dNԥ@X@h  Z-dE?5mJgSqnJc<_4m %j'ɎbFMLkC/gT@VΞFr6w{RmiB+ۭ҃Nd[[AW'W5QLҀq8,M#N_4"hT79Y2Ėڜ*k``" cYҊԽtI#KIb:`L~$:zK-{=zO~ENDgzAflwZ" P ,?5c(dAqE =iXqX>9 Nm2ck άAt5TI[!G &GZRH>ێ%YZG J@lu;H$r{oYnn̨mFDОvyu+ssO|ԡ(,_))}tOAع;REw$^z413pA*vW$H4k, D? FsO-*M]Ťy7rHV_GZ [ c=zbFCyH Z9~bvUbmF&Śca%cJȌdbQ kɸsBF*R:pJ&aNIJwe(,!\N j FhuMؖ%%PjaRWiR2'F2d!z򶧧SOVޫY]@޾x D! nߛ):7ՁLD–JF(["VC߷#=f-K?HPڙ8bBǠSf  \+Z̸FzJd!ny{ٙi%ffܜ==IrBPU%@VT*n̴=TROD ` P׃)MI&KÍRdc/ѐӖ#it^+= Ql][cu,GvK&:pGZD'GNfs&9p~pu#3i=7}7$M2 @ԓsY)ƌ^(Py*Lrc6'%w!0@-VkLZ =2xWQ!T/PHFϒbAuiP&$=,5 A: -qs;nR)m(7`%4Z,K]O]G8- !"촅x'2^@"RfG+8؏ I H:>*%N4:*1q؄ WBYm5hH3wMY#,bY(}Tlp8Mb)D"]?W=PFk76vЃ^O]GkxyI׈䳐.dj%d$M[#BDk}_u=_ b> FL9g.GMUuh 6.SxkS9>FXr6ʕBrQg[ƞol +Y-Hg|4T⎏8Ƌ{nf:|tTgF=$EάzhP@Bp~FGnʹsŲ*]id[LOݡhA+J!pBk ,7}ܳ^s{P꿀sK 0W><Z1<Ѱw-~jAõك*><g=CFN= )|rǟc vv;~dYaVT%Sb` F+Ǐ_xЉSI0FK}tL)v<Z Ad^0+H $A G{%Q>Q v%Ǐ:켿rܾ%9L*V~}DnW Zkvo6&5R|_Մ4$zXҪ'RAz.X=?m)f(X-gLtW"-ȠBQN+tx]}3Bĸh(cX8/yg90{#[ۑUziÐISKġ"lfuKa {rGqYj|b2I y3)0Shn+k3̄xKnZMZ &8U_Hfp5&DkCs䭿R_k?E3Pbg @7Xsa[K‚ &S)r&#}U!- ^ %(ٖ(hWv71 ,>Xj0xQ'ql:!f@$jccO?u`^ͫl{+{F`*-^r 07Xc8*P`nczhr ^F[;R' F1Dz[̡n"pho1Vg~ꂠ@{:Ҷ0:vPح%!MR]\$+:^F; 0!w)My-J>]]YUI?^-&f{!P>MVV!!ځ_(y|I-HՕϟ߹tƦ^yVͅǥQ(_늰tiP&rbx\CJ)5/&-(l5qw/v.h@C|^}J?޸ٳbAADaAUMULd@7@'qYF0 DB!r 4-DVYI\H4*Qz#瞻xpsT:M~6V-4(5>"Viaؽ(И0 l7õ?8Vu9!x zh~1tǹ⮊Ղ&i&l\z򹓻`Xm)C ;bP~W(Y(Ǒ.:FQTr9{yDHO_%S3KH$7gGu{V3(zwPKoEQN_FAX*{#e_!v=RB% Bn/o|v"w `4dK'NVdCm"#KA@28W':S|8]} P@U):SPj@Q.2 VtPڿu3Ҷ'I "≱Q% XU,>B56ݠb5dHJ(wAU,4@o ľd8XD: )B/~!hV{&[P#"G.$+|CIf!%0]>!w݇,~QOi:#'?rlm$|ʶq7tH r&tѪrvcV$ĻԜ=p!f\kҤt#F]^mAZNrHV|W;N8>2sL9lxh9tTQŜQdZO?^,SҘ̜Ixqq|?Xn lFXt^>YeFI`yh-^Zn_ >wltz<2= ځS#PH ވtBi -haE;NŘs f̘@Rq+j#D]D`V{~Pj ʹJ?t -G@&?g7B*KZ&+Jw5&h#tw^ٶ-N4w.3avM}qzЁCkAf!̩ʡozrG l^y#.YH2"j%#GzϢjdCĩZQG ҨF-C֐C'tXTY2 )dA4cu:DJ{7Aٺ ["< SN"zg>vMU"I@Թs9 MdQ72hJȴ2ܱRg~~[:+Pk,L㶧di &$T`5BgEbCON`Ç4IU#sgXz\54 ? # {(vL"h3FZv tݝ:0 ½eMC`^n ޜYcN.G$՝ɗx)^j"9ruv{#Zq- )'`0H4Wihr͐?A2 BB3D4% p ,F?li*JJ5GS19ܔzEvqvP[{'[W ,)=V BoI=BԊ}y~4X bCUJlb"X \ԎS,ytﮮ5ƊIC D D: e}  )R2h7;ME)ܕ2#ʀ<3<}~a ˳RvWnǠ[,R4uw&H%vIJ'`1 lȀ68rAPsNXX/ #b2zlrw@9F ITE%uiی\ЄV/7Z+eA"^T`D5%}%MA `^(0dPzY ' N٠1E~/'uOM[w '׻#񜋆Pâ"%((έՂryT1?nr963c"׹g㻷z/6`YpHe#"2,ܣie dr(?*$,URsvHk7W?0}kh7"e_P^&)uIJڱ_sI`vIO 0Sa3p/_+(h*"88 )Q Y&uMd. ѻp% tGWs?ͯ]y Zr_8[|߾3_)R"PmFx7ɖSXG{mՏ]mJ]yJ*g'"@`$*X]d! JErFE5,SaN+lUfqږ*;p;hMJq ڭͶJA<&8SbM8QA*"'QF縟( L/ Ҁ$ a>0"$!']w[!(xeDi$ ҊQ F-F¦\jE_GD?!M5e`DCT mѤ zzR0Q+5׎Z~~V=dEYj(om0$LR@0O'ɰ*(ՅdMJ:\vds_wJ)OMQViV =5ԘldH Mg 䧏U 9E.e14I8+R躀~GwQd,aI89x @*Ѻ2Yg /ItR鑘(L?hPg_V[6Kx(3VY`$e^?2tϞi[P%$oE.UmlJ9YnH$Z&r'r'iqPG`=]"g\j/5z9|!a8&y̍[X\MP-?5? tM=ɂc%ɔ&7E>Y{g\+eO&յGPJU4Ӊvķ/ 0ȓ,:9-i"WRg%&MQ2"a:Sjn_;zbGaS2NE͠t56Q߽/jӦS;#sR*@#8ӫoځPr3胯[](*p!Hq8~aٿh30gxJuC'+::W*W칢 94ahYXo+9wQX"3tNdI`v+xwlt!BDŬyx| ш*z)|P5>-G^m=D1m"u_* ED@~ĆF?~4.@s+ZH4(>%m 8T_骰V /޺"T4!ޠ'`N >&/7wl/hQAY.nlAVkJd#j1t9+OaDҼS|zz}LN|J:$vP"\? ?yW-V/yn"ek= 6qf>49WRFRsV!z۫ݢ͌mMK|߯)(Dpn|Xc@y6[-UZki&sF$ z3cs "@Ъvg_{dUH$d)yQ tFf6"bR)"=8|R?k8vC7sl7YaE A]lj pZ kry=J Zz8R݊@_6B $h9Nq!SAxi86Z[IAsKPAo jejx߼}xὓG~|T+0H`LuAXUMMEhV?NEqz`q0C@HSzalE1iEk" lև+>Udox(L'ad/QO o<7D1al5 GލMOV4S}fI͹r#ꆮZ&ɄHk _Vb%4{k=BnsKy ͊"n~\pY7ۡUZ#rJA/g!٥otf[ڿSM̈LS{}~%K241S:c)ʯe͕ndeP JLO\y8& 7^ Wnlo'DTZ;Zg!|b]?WYmPffi6琺IipR?O@ÁU层sxl͕m!c>.dQ*8+3[avm3X)b f_k"a#G>*aV:z `ܚ̈́Le|4Stl̓Cُg⠞jX& ~Уn:rÞHd޴Ӄ & R.vrak9ijSQ-+tih5/ ?yR[t 2$7=3>{n}2j Q+5-[*>_)B&D샇k~h030" 9Z;~97gdF\E)v K YAP;z*\n!<9 C$Os wO\1л:VS&9=OD7vصS`Xe&lSx6XeVeS-x>ΖQ'`!E("sy[rro )Lit31>PH^D= }ђTIى( _=[D'گbHF\XR{\[ݰXS +P"7X:rzq.=$qHL^awO5Sj\ViU\9 24g=oqYāޗs%N3;cl\ {}sA={{_e 2a?pp% 7з|@}6N~@ml~p瑱pW{6 ly/pV)!bg@"v+-ݵ04Ʋ PCCRRn;`?(՝+WWwKDI w )rwI@ڳŝvC~CeM"BY*vׂ5; w#qpR>h wN{P.g˃ NzZ1O=&D3;=vT>nlq f6'WCL2Cduf{&f )^jklck.ܿ(ɵT3pl|!*]^9_x `^H _E~׈:w84=^g$ċLo{ 7θ~JSrʯK$Kkȇb?ԏoË]L]IÀ0KKGc`:|$^d"J7{rAO睽m2#+9-{=`~b ~?L]*?1=1wZo?jxs$D _! W HPl5в5 NSaA帮FKl@ڬ/J6]r}sc30 r?$xlSq 6+Z; 0E%ɚU<#BDR*uIiEˎ__>M =*=v&ӾMbAϜ(=[yG }NԐ9)w"E1kح1"33RuOWh1Lhbj)nA0( ,ƁcnSDʛZTLb n5AX[4Va`E"꺷zkQ3 e";&S:4b:#ƸCEV{1 ,'$ v\҅/QTk]k2=_v|Io+˦P)E)܈sc\~IuTb('Y]-Y"E׮?*/^ڄ %H7!ۇ8[x1qWc#J@9Zԓ(U(s9 O0CWƂފR'9 7WDfcK0Rf_ r?.-G I5!w6CJoB֣K}SzvcI:J i5Δ0@Nyjj'TSqqESa^y$$$B(L~>4ZZc$ٳ[7J|]ۏ"a8K)V8jbQAc;`_w_$ {( ª Z^y9g"B TM: [A~~h${u]=TkW[Qmm`:^']7fL Vuq⳾Eswy $a RJŲ;7*(aԸ[{N>9^p|(/C"|ʾ'GXka&bTЁ{0'[&1"+>J VYl034GFGte|i!ǧ#;W_0κ ~sד/Zk!PʱCŐ3pKcn5o$4ܢΩ{=]H*4!by@htRW {2@uuf"B݋SED JX$.,EVʋqw;]r=ℿ5]D ea|O!%P g?5̜,CAE"Ć WD@% *1x1۹`rj(['w_}x~a7ktYl Q4 ?&$vOQCO81 N>+;zѲB;Wm7UďppOh"KJ@~v~N_ZJ9~U1j5"H}}8Zg;2Ddt/EK"Ł9Iž4-a @L~cSOrF "'۹A[imݓ'H_K[g0#v^SR_  —Z!umьQ~M$`h5%Li'j Vtku=gqc|m5 EB1q͎YTd5^8~.askZ@XM)$YG:矩1j-s`FHDJ+tܒ?HhT>s^/*yiWօZB b-+lWGGF >_[ l-Z@Pvu4;YҠHvD%n/wMZfwO.  -&zeg@% { ([[?4v'egd 1y5a38R>E_{{7>VZVS IH&d(3[@t+/*A{@/!(Oz׷ɽL HXBYH"!(1b9bۑ ~č"(c03]0ďA6´hN[ V" P('KlW&$],$CI* .BnGwOF{nDrϙo$e|@t&h+Edž~Mz_g[Ɵܚ6.I"X–c/ (21b7Fp~1W/@ۡoR*^+n}_8qﮉ<:Y ;r}UD=bV@ _Dnˌ6RW̟ykc~ry-ձjw_bԖA1hJ)b,HBqM@ ݕU;Vƽ4ebhG o>j{g<1skoߎDȸ>v7ȍ'ZĘ+(O?;[_];8On>π!%. mȅſx{T6W^˵6Yy:}H:ITʛbV'c ,ʱܭ &8gEADFaܣjo4|~s.!pCitlĆ~]߻7RnkdHwID4;daiziK*RbhL rSY bdYL_ȈP:$Kn[D?t[{j_%/r`z6 7#U$=͊fؔ:5c3`>;|EAi'QlyG " *$Y =K5X񹂐"AowdD/vѵ.ܽ}C`kVǸ4^i!BpV k{rRN/12 tqΕJՂ3 ~ [%#*1N0N6Q Vl?ٻߘYsgɇWZ훽_\npuͽy}\o~S[_x@s.   Lq)M跿D;ݹ(&N@67kIe*y=S!!~`ZÈ`rvY(-%Aeu9_ 9MȦlDlj~N/彦 #I&i= I^r)ǐ-*?3[$!p>9? _-~Z!h:ѱw"Ǿg~H|qNA#-BƤ;eo5<1g^?镅@Dh"2 ض!cYUR18$:GFFFG@uۖP ewѫ\g??=X8$ƪ&j<2AdldPXPZ'CԽCdUnѝu}i:JV`{{-g֢]6Adlп;9M,Wyg T%?P##)n.ѵDU1bo ~dNjy|]]EH1X({Iڪ |hۂwдz"!}xuwݱnW}HNA1 Oq++nqP}ҍ{ -aYRG*<U*ӮQy% L#r FR/nCւۋS$E\#{FMG 2-$4!UHf.Rb!LcS}DIXKEdOn}A_6)C vDD^gXl[\ݷF?܊ ɍ@%$Zqd-[vmCӠls|ma# h!+}/\̥K>)6P jO ̘AXXov-LQrmK3[޻tg'ҎvOkd!ƩH<= 4R qT/}qKXFcXns+nґN @T62mZFE; 9CX̏nuؾ}_J}؄?o~w+ͤW̋kw>a%b*!/ϋ9΃~kA>F6lG_j,/.p;],OfP&ŷ@,Uy_24Y %<$a\ pCho/bnbw'j Xi7J%BDsv@pl# ʫBŚZA'1Q=Hfc"N'dtPϔ:TG2i13R†0"LU/NbFR2Pd\Z)LҹeTa F* ouk |}uETG>k"k,1iTHO7ˆ!$'7>Xzaб)b؉MH@XBˑ1ݖ yȄ&Ǭu% 6Q`"VLlSiG+PRiB?Ebj$H'C;uIq TPe'US7ӟJwNTߔt(C!UX!5bD j@<Z6ߊ6'ݗE1&% K@/^mX)Hj&{MwzɮS S&7PD pFAK("ܞix1&j* b硖 Ew,JL۷.~%߽Ke#ӿ ijBH9/01HBgj[DH6!0H3_P[2swN%g6s< ي4B#b%36t@LYz jbuY$h?[v(=wk?\y©jOPI"t[[1XW 11D?q-HnmՑsK.T#2KhDEIi$ qHnjJI (D$,b薊2 ³r;QK_k#r"E?x}PoD_mųeIEjۚ"Q'hȢm;EF]]A3i\7k'`n:lDždLAr]FxJB$4s7BT;H0 1w)mC=s.jDf*Wv{ HkN^2غŞT|OI] v-$7y $-;S<r3li$eա&{H g{er蠽맿ĩqIQtrcZwldAivѱ g} 0TC Jk䷆GZA H"fI (^H47"6W׌R[5PHY_}ܵ\O?1eKV)^ Gaةݢ_>w7N`6)TCKncLt/6]5 !$@ V\Y\Y_mmu*5(!~o~m޿_ۻł\e |}BNi\jDcEE$FXUo.IN+'򫹉5$^xn73[UkO<H4U]wTރ~!2"+2>aL" R \Ek( r~ZrimCMKwljɒ(Ӌ(`2s 8#פIF%%շM1Y. DnQș{WG;J|7GQx}kcf00A1n^I:զp~]*,\G&3,Xɗ@6by 4Oѡ"F(>wbTR:t#!2S_(-( Rغv`TvOnZiR'ҝn(,"MJsX1Z=zޮrs/|۫NXs}%Q#{ag;{ <ur W/ݼnu{~܋zp[krx,~D6qXgk^;L(#Aޔi!R, q- 5Akrvv{'ww#R&WkJ'!Vlb` /qȈ7:3Z{ Vp% YFYeR L7?\}O['EծRh$(W͍{6Fu /Y$H"2dў(\eeSNgLԉb91Rg 7Jpэ-KzW5 H{ao܃gfNniMT#Ns3G5#S{O~zD_?] jw h FN#Ir&ΆD/l[RHU}GxgϿXY @`1vo>y7/wf}lFFR GWVv-D47zg*F o\yß;K=vH !=1&bPfB?Wr<ةӧOV/n 1["N)T_2-!aa a8ic, $iV&qD ̂J3lߕvCʪʓ5B@M{/>:0n1_MaNN ADM^g#p/CۘhNUY<<ү6cĒ?e\N}{R';iNrfNcXD}ĉv;IAUw :z֮ϱB lt[ť(N/7E7nԊ}`mf|Q v,iPb-*u1D?;wf@D@4{{ÝЌYrܼLV`"k7+?Gq飛<`sĈ,Q7HkxqF`u.l_%H2)oYAGy*\Jr#Fiu:g17wy/yx_,\=W-oW:$(Dnm ؝uW]f!Vv׌ƛܲ Id),>h˽xgG - *8p>mĤd!h|k G.Z+ּ}kW\a**W !-:"GV#Ν8J?d60CiIB= g衱QAPJPЙIO=K$fQSNxq!l e6Qs{T':s)lŔ )PPfLTܻ84Kҁ3oF3̲?8}i2*půe/?r~Ez&ؽdA8.1;P3Ynmy0wy{L?cpg.} L$:%I@t⑙@itfS6LwX(T2 kG>0틎.̎tn_{?hiH a@GzzTArp/c4[aF–Hs{ݳVW/ևU0&`9 l AkG9B,bE|xƞ;<A"$D@SR 3*\EL&pY wwrumA\?FaGrGp4R2?ž 0!i{~bGTwPy:Z:}V)0{JAuۛ|aW{N2s{h<7<.<988"̞4"қ̝:sc.R:`%2ß 07`3QTP83"!X>:-@``vmcQ#h,) D0L<6fzʈ,Ct#BGU %&ђ݉p_~fQkX́?ou`n N2BRDzpo'Vۻ:|,S;28iw d)PG'Gl#h/wy2&U  e,ѱəE+kA (\W5l}ķ!셋^ˀBAnй0l}/v58dP~$rwM)Z++Fqzol W?^K?Z:|nBku_t^ȱ""=)u"GTkK@ vGQ|d١⃁AF'IqsϸH)So1PK'O42`ˍ=G#?nɯN>ZD;vnU~m4n?JHyCk:[x#Zvk;qj*'Б#u *}:mk_)YPyrzlir贶%%T=0?R&[iax fKPa7{-}mj s܄dD6@RQg^$bOƕU' ;z()BqEI*ܼqgwF;~l-ݿǭ\﫜* jGYcJ!E47avWe^k]*#D0H5Hڥ0OwVv_hTo됳G(Aol2^qA+-7EiG.#z KoNNJUQ:{)?il mBYFDHpgIgk ^ƁB Ool$M)+yW?Kvh-Uh"1<ps7|o$ aENb37P4NCJ2F8`@id14;.,$ ΄ԒeI嗋:ěބk]9D@EF??EfUvQ}hP4"c*m[fm7E~ɹwٯ]:&aKnp6P;T +9ٵf5;Hi@zlblx' beIU{cK6I/ݺb_ [hN^32ImWW 7_VE;s/qWvT4Ę==$whB_xW[}5s9 bFd9+x ]}㸊!Ч@4"+BP(sbพF@H/V 9f764=&[_,(tZWBP F,t|Ȩ}"XF"Ϟ*ju*'XjVu_NP-Gei{xxbI< O"T`SUU!*nŋ$?⥉W뫔\#xkXZvRlD>uOv;+ So|WX+.^SWzW~H @zNw׏_LyDAa+pvJzXDZZJqz%_,{VZ-: pgl(oVAa{[\pt%P tsBG˛zlnP@…\n9;?ܧ홼ٹhu =<{lxxkaҘ7 81 ~Q!{wskH)IVig,J~饼ď FnIF*޵G3Rk~eaqDf5HYifz8. βCh1(!6 l9Oe ̜ x~Nطk~=O6 yfxiGF!vUڼ2gwY>,[_^ژ/b1 b(/?1^bDG/c+4q%5C:e=:5:q@nz EʱuU!@cGgr ~|3~"R.Enp܅#_l6)D|WŢy}-љ/ĭo,Z?5Oޝ]G(]+mEP4^d3N;|C9rg.;uPqѪTF;J0^I 8rF)O."QY<48gm3' 呒|TQXvg }}DpK` GJ Pټ{eXb@T=|($s9ut|mdT(FcߏXngJmᜢ\^]< 1rTFQ@<8\R{/9mTF**~d 0X$F&ep(4>'??}c^>pb;2$@R+wnymMnۮ_tt!th:S=7fD r3 EO$T`A}c@ҡ2l*''&+@ںĸ݄\cGjFFRdy+[췟-(@3BYÓ_9v{hVԾPeb( (RRKhnկGəj klȒ;( BP~yٰSgI"@"on욎S[>J[.}yv+N.|BDZq.K{,¢&f| c]`k7wwuk]J+2Oƥ.lϽ͍/`k?ҩh@뇯|l%d$阒`|TH1SaZt{'yNCBgNJ,_zvCWsۨYPp<sQxwtGڝ9]>|H"Kǁ|1H?" \@"/^hd]&1CTwd6> &$B@ O9XŰ[.̴"R Q7F{@Qr;ASTċ`(v?ޥST'nKq9 "^K [k+wz2~?~q*bDXDnbӴ^sź$[\j4Z{~5vn\O~o}V;0Rwr`$Qө LnuVc3AF*P!^$Z8SV󵊋"-oA ʏ=r+!8OFXԅ*Ji!$?rBX,L@FGLQ'> hQQcMR7 q^S/(1½ɛS +ڦo)% AO t]b,`>JwdjHR?L#ip'e$_eA_Vg޹^譝Z0Nu 8Q*,{;Ű7[^3xN@3hcăr 'yAl/{> N͹kݜi?Iy`D8UXVɒ!wW8nsPksD VҎS˯?O#fg?wLpD^ 9OX""6~/7mwMѕw@D] zƣcՅrHRc{ =)q醔h m{<>q@Х|Zd3ll=)E$!w" s*UnnZ`NSQ[~kQ<;5d׎vy0s|OlW`>c{cC%zrt'P,38τ?c g$?Feqs<. +AOTNwꇥ}Hg/<@Wa5si&Gs`P({ s(&lX3 y%ؐ\Ht1>? 3` 46*^ܻ[@܋8:WWU6g|7ZsT{'c_zB֯bzt%_r^}9__]3>x]&;9X= @i=rѾʡ$]΍,2 \_hBU~UhH{> ɇ6;gΕ;HhhsI Zc+F+Zj)K:k=QX!-6l4Y'nlM(af@(5ߜwPo\hSgw/eH13*˥R{[sY0 C{Usc }Zуc+Ԁ)0Q4{Ž+ ,}a-7Nɹ^(ns_ONM~x97N022݈@/?9쪏'PFϔs# pfq(ؙ+{0ZyNeY,F%[9=uP+-jqٞd(y7zDـ>cx/Az< "@%J՗,nfC)Bw(co轴ݟZjb_ H尵%_)_*4 %+4Qɚ@qp{"o^۰V%u|Cs@ۗEz{B" ;{T :5փ|Dto|`=+;ZrݝHfK^P+ ևK=zrth%^av$ :9Z@.@} m*Bq=Z( %\yt!7K Å\ͅ S&eGs1& ~FBݭ{?|rmT¨o[B2,+ |ms/:͸BQF~H] Qs/`fbk>wك~iDA j *A{{uoW+"1YY TVH(,^p~ʀto1Ϧu3edTe4שT-wzo}L(v86ؤ݄(l-/@"AHLCVl#(i@vaPbHfIik}Oݺa~fK!)6s|cK _I# ̤Ýf?we/Pה{Ou1.> gr@JQw}E[aj|מם;+k{N+l Hy. 0s#Tf 6w;QFDQz%]rK^nüB@*'}얲Z\ ŝ ""޽w3O~xEDl:3VEMBm,|慭w.E8r=^-ȣeU6&w۞rOwB(4`#c{{?)AK=ٯl4qgYJd@PLA)Rr#[͗A%Qϼf@btZaLˊlΤ'7VE( -_2K>J=mOJJJJ+cB(xG1(B|6ib@֩?AC̵tvFo>D%gINbW];:{Oi+',F~q]^?~3 r%B?=F%-T *'"gA:C)&,j%fDCV#᝶VZ(0AWx[˿tOX$zn˰mw>9e3oƒh|jyk#\w/akf+F@ko,mF>3ߺ- ED"!tE+ʊc71{Z@gblV[/j T(|*ua:o,vzx^Z[/VEQdD8֌ '_yq΋sĂNWi*spb*jiG:F"w/fo~k悟cm{r8XR0a:+uIT&Dce^_ZF6n{[qn'y2)/grW8H' \ 7ty(PHB%0+˾`Iپ0pH$A"&Y㈘Գ147-ED84Vj&70MmG+vlo,H2N} Ŵ{~:S:ۻo;n?F?h 3 0%"T͗|*)e8 -?GH~l\ ,44 D^)Y-"*{7ؼg~}BqKSc"b_u_r?/ϾH}lWpɣՖ"RE<l-8F6@&qE4YXiޟl ٠B@iO"ˣUռsgӷ~9nq޹>'U DM]4,HjLх#X~rF9ӍC.scc Ց(o}StY@^:U^%Co'^ȀX8JMOnʗ7fMWGFPh@'noꟕﯿmlExi &8Hz4Z- Xu#W6"@̗BqʞP6UA %/챉 [+ݕ8g#=1- eM.D' heBN(IzT( JX@ D )VFA t*HL9[q+txe,(J9AaKOn^G7itVf# ˼V{ONa$6=ؐFYm=}&3&p:bM'9CfNrڂBa0CҐg@\>:Q@~J%V(gN,(27kǯYw?ot' \KÃ~.9̿xޱ"`վכlv:^^n3_.hm"@M%jrl6Ǐ[͟,m$PiҚKf[{8[=h1FGPsxkm'r<ĈZp=]{tp.8.tWn\)r@Rh7{/Bο<~ONxXnmuݢc+[T޼2/rվ[u3~[lV1-!MY ~}`w[AXV'{GT:d!r xRIH, %|suHqm@D%v!Berol| &H0k]}#Zy&N(2`:d$C#(k1~ŤG":F:"Tk go[2P- U݋W:J-2v.\v-QīKOzQeLlH"IW I9>:CHeeUeB$A@$lmvlX]Ym. P@)Ȭ:3"COs{p*x#B%IW mG*(2.`N4ҢG>^&F=G;Bջ@=oy !XsgW_տ)O?:Pru!?Cqb~=P’ƣpoMᰐ*/<ɇ[!w8V "EOW `,{v ,BsW߆B{p^ɠ?C7f FnTDq/!ab|=wOѾ_&qd#3xm摔ALEeZkM|Kv.(9#%G@n&N|$ }F XCEƐd`}Ԙ.dED`C(jq.] @{\A1DD̝7o\yc`v_udF6M_,k;peg :;;-z兊vTΒ8̈́E~'F5lTp߸ղJw:LG0x׏MYoy*&?|׷>(]HE!KwȞʿ:5j*[ț'G,}u,T:`v<֦glO_`}6aM6I+ q8#?}t%]8U |' "3=#@(y,q$pWuIbg}\T,@`Y b'9 HH>ܥ7o-+$l{a+T>ZsQ@r}w3}zňvT*Iqb0`v=T63CHZIYP*?vvn޾V*dc$3Zm^-S!6ݷ.]W#d1+DE""`||d꘿TޙG:6_IHBRʙwg4 鴣"PV(HƃZSǯ]12<-חfa$]>RJta}MKӍ@G_[4]%@i#驹2rG%I N#HXLV ׈EO3Wkmf56KgdO+\^ Jnb$&1{ RI͖  GكTSpG{X'A!=Qnȑ M>#a1K+m.m @!zcgxoFqGK>nqFU_>huĕ$Zxb]4)H%KQ=rs}y,A$Hd zt2}@$ P y]⫝o4ӌͭZ`;^@0]mN.׼= -#ʲ3r_&‘*닛t6֮6E!Fg 4& 0@7p> :S™[Ǐ97L x,pU H4j3$b* 3O60xύv>e4]j4X@l+:0xپHA V#S] F~ =QD_r?og ܉VVuetks2U"2Aݴ N6Jk?+k J~u̶" Xw&5:c$[+.o6@| {)l (B"=szB5D0XYnh@ޜu"a%yl<^k-8ve)Y )RbKFXzt7﮷ &0@c9K/6w7o?nH(ǟ?6ݏ.?i4o-H\m}. ?"2Ż&hcM(epj5D0q8͇T^b&vj9B (>?3 Hڼֲ_l9|'!AX?W^1'w$]RD"D?R"@A=DM(b<{Bv)K'$h"P:-GNْ0}RHMof36sD*ļ4 1u'euŗ?|bz{=bRb|NtmI?HB_<9$?$DHO~s"*zu_yg"=D)/?<!Bwj9hWKmDZ$8Z2O/gλ'~PnFetc7Exc@KeOF PȶuoN0LR{5h'۬*a}nt?tыfD6Kϝ_1 ;N(,HZƁ6aӃ{C dz[}3ta!"by0waW6M' `e9 '_Q=V/_o?iEsCkMww79 ȭZE3DlonQc)QU_/d-x8d2^Q ƃQw0Np{2\7۾r'oM'w+ PyUg5V:E ȾH}}{-փVPi5Is̖=HԍR%~;w)r((c;5[ŀ>Fe@bRVb%uU/$ =n,'RM(_EҸu 8PBGBxNF ?ϝxyM˲%\U=:_K3}jŇQ=&o=#RoV7rlu+[uδvq?\xD^PA}$(h7])ާ(b )$ ^kH@WwSfT=M!cZ1k-ؚ̱zdqsVD,g~.YH¸ cRvi{@Hk)A FNTX!ms)Ok߇v!0F|ڻap~f)a 'ȑO>4OeA?6F,{|`@$4'}&{k ,%JU:jBoWP AU`KK [Vڒ0}~JjHi{_~ u{tzQ\NX]= 备lWfkk{T ^qѿWz4! X0NhgJuĪ)gH, ({- `*w/Lvr$r#Gr4%Y QnRB>>lM2hmYDNfFZo觷vیFBS_OwVzJAS f .lmHPo)䴚^胿 +A\w߼'@$p.0iL!E'7%?x!0&3va;XU Q\Q=RIc-ȈDɁUc*3Zooiv-y:ͻUut*3G~xdD1 ;3|4gP1XJft&]GF&6PG/^5fKDl7خ1.^$k,(x{g@ٮy~Wihkm 1 -7oYN*TL{ĺ=^[׋FyDng2=Ƥ5QMїT&*, c$BL^xzeeೃ};/9* 2O5>ݬPp'Y OOW~ɠ:s oӡW*3pġզ6Pе[yiKZ Q";818F 0 NX RVkh 0 (Hk[uF~vxz:_W)+}8 Cg@iQS+&*NM3Y-B(a<ܼNّr50"Kϝ[|2Kf^W?\hXO9T qsjܟo+4֡MdTp $4h^e.=nIץB$Y.Ōd{B/2s{qx`a GR%N/2Hl@SY">R{T'TLms29|[L~eO.aDт396bG+VlF}2Vٯs巾<"aJ 1>#jv{b[3'M8lo m # >zb} ; 6985y`&T i8N]Y$uHO/ܠIgOy7=\sU#Vﴷy_s,~(P@_>0*QC+ 7ZVeW()v<_Ю&R5m̬6swss' Eh}_o(QT P ‚bBC&"$\w'¤hE8͢8Sd%725⏫}WE^((#PLTg6Q`Uڣ?\ht2/6?ICoRw=:j- @ $lHRu~x`0 {߭D0Dľ[7gf2̾!lꈩhT2φH0n=2Q/r8z)>zZ}!@1[Z -UYţ!$ZHZ(Z J;1|]z+AP _)0#ɪS!e"X"I{nP&ELo%E@˷;^Ie╿ٴnP3j~@ rwUM?Mbn?eN @_^!aO>#eE m|2FSv D(Fthu";nK%nI _Bb$NI$e$sO3 <6멓y쾲mL~ MoW8"9_ [g K2DڽwYً_y'ڑq?XO%CipvXG܁nG8ܐ:on& [[5BH fmE,@zww":H۳I)cB@Ұ,ټk4'Sĸs!6D$7{ƿD1$DAD EqGRJ!0CPYÀ5TM9zXC(vb$!%Ht–j%`z(~ 5Ʋ>qnmB5-l* vnt05[0O`T C  [Gmd!W+l^+ Y[ec7@id NDM!P rӈRpkO~b+]o=pwB,V{vaLio{-^fYn7M_!YZ}ʲFSOw|j+"^& awᓗ7je~'+/EV["/1[x  I9~ο@y?x/T#ciyi;gVCt>?Whl͊Z%ƌl|~`ßwmS7:W_<];D|PDf@V(VR}9:in Bb2i͔ aL}q[LnZh %lB ́%ݖdyL"Nb G?8' HW.;yvPh NLXs nfC1`IRl@W76n/\,:= XanI@sWH/7bXwW7E";Gu 3gǥY ?~bYHX#s!H%\)tF'b)֌ YZiqC5*NAl?Oz토D xq7:UzO2wT@XH U*~侇k@)՟-٬v8٧Bބގ&.Й0T6ͥJ8>aM94оs phN?ur@V͓*P2J>C,(͏O-޺t| y1bhm;_xS.K ]0D.1Y91P9PD-- ۙ o8t櫇s-ЊF*-艧<ܩd_o̧|%0vh"Z>jbSje7;%HoCÎAc&K]Ⱥb!%@~( &fBP-;,̦&ѱmumJ7T+BLjxT(N` R T&*0 7&2$c b}ˠW UctDʘ 4^sOՊv(sz]OLw{^S&46+&4Lki*;?ic2.\:Ҷ8cL(4?ґ;Hʻ[<O^7n9gֆYNQE,&fkfKGŝ_[4p]Ũ4Lgѧۨw-ik%I-t'm` O" }ȋ^ӎF#̀DJ A]v-<8*Jp"kn`.h[n.+~ BIPWwY|Iu;QP1361 @`M| ( !++C&ѭݺ!;f^%bVPu)`p>FAW+@26D! Hn9&q/ՁQ@M;4rtAT14#;@j`Lp۶8MPhC#™Ud$DA4錳j]6$|.iMhfAے.}aX BpoCk4<vw3s(r^\M(ozt[Zz2#j߷DPaf*{̀[˝+\GC{\=z͗.n4N#n3<8_/|zDO*DDyՉ'W_:wA{O-} >|[sw!;jB:X.h@ C)5jM"^^dIfPϙN ׷遶Q[*gͶ_q&Šl@ɖl byV 4sI6-UjJ&eJ7R ɶ0,phB0^V^-lCo 0Qa+?vQlK[ 0j5 ,fȝ8.0|G4NDMص},*&KXCZ l$OL1~D@?LX[ `ta1h*X~+z)~ !.»$m *E10:C6 0BɊն46[@ݜ3H:׌R2"Ijt F4aH kA":V /̶IV-͔H]YacXvC:.UCVpO(unwe \xf*o~p={h&QrD dHL+?w~Cemw& (LھϿZ~ԟcyz-pj@$v~\Z^^PvnO%L.glqm|?o EHJPD'È?2J#:P2L?̛O:{)Wcn:0T}Z(>v1gI&Ao+ R(ƀ5P|k cFg|4Ohڲid5RP6bҜ7a""݃8eQ]ww'f@ENE V Zʱێ:!:vw=Hd0EQq !kKUXc@#H)ǼIp+9nsxdڃ?m,hk?uvzG? ]PDa0qB昑0VX(ןA:FE"uyIg앆&x& T'QQ%n@BM/ ɝ>l  BS;Z=:6oNl0kޘ qI]gG PjOn=xaPV:XTD@_=2r<UalWW߫&+\Z^:P"ur'M k&gE6#埌1¯X`>w5Z5R½zl8cNGȞ:f?^ @B3/o QZb&u4Z=y9' T'U}l;}s`$x~"l#\ qs[\oeu@KߪL+@([!" 4-wxcGȴTkk[[a) AF0g¹z8``pf/7|(V+]ʦAlk@om)2IP E(,H;L2)57P!c(Ӛ .M2$NnEdxNc @؋/eİzskV ;^/ ijګ6>Y]ZI3vuLh~Ew},!tOd>Du= S%dmO4⧘Qw8H,5 P8+AȇZ㭶CxLkođ$*rv?%|)Pa(Z`0&H~*Scbr`?PcR,1[xJ2P!pRc︉D˙R`gxb3XxnKV^w9{ BۀM/ХقjWofPۣN{tn2U\cJse̍㓇!؝[BιG*URQ8+:Y}in.d?`IєPP46/{ !a;g&Fj*`W" ̒rfx`;M ޽~|?'oӍR{/PZqkjcaiV1@ԗy- -v@Da쟼Զ&O!F!1 mh.HYl6pv[c՚@9ժgLbAPq픜T :$>v *.J1ũ9Tk5}6@ iQ]ZKCC\0Et)b;jォ+$GaKrG;SWC$0mTl/t\E@ܼ0ZVC`_) $ aa C1] "fJCjWQ55A˵@.%dGԾ$V&u0'6ҶVNA4?z6 K&xӃb=FDIsKXfG w7C_QXԽw?KJˣ7r0?~fS4:4i-\z6Ο4DREL "=i-L'Ԁa'ꓨ0I /(eY8:jW#cI 9t.Xms;]j^Q؞ 'Pǃ "2j,ثon; ;r0Tl)RAAcM^:}Lj~p(w|߬,:QҏpTh{3Q;-[U {JXEO➊9jԉQXH& >[8"2[Su R?j;$h"zO HĶfQ{!ar3Q\P Z!Ph&g怔>R}pثV龣r;h$Fi QoNntlQϾlʎ8`j'C//>~NHB5Gc _v2;wMy~ |Z5rޢg_hmZ?}%4*A3`2d'mꗞKm+@/.hjyư_ü ӂc_[W#w5 '%dNNO_NϼWwUd7OtZwsJ (KYR#v|%"gV|KqCad^JhܣE70vjٽP":5 DDUE"Jлf6< }`S_j잚P٥vX9B0b"jM̝=Й56J\:O(I%xF ӥ)1Ż @,pC@uL COȩ۹ jͅ ma({z#f{/ i)1thMqFH7?15jEȈ!(0b))^JFhe < bZF~;ok*n !҈  q&*Zä\; ;ڃ nbGFͅ!G;Fl{vF;pxfQwȆի/L?6vRv~m8`^zp!% zQKFͥ] Vþ6Ƴ}Бxn/9dͭ`*_~; _v @+8| HFv*;ȿj06v<+d<BKN)`0/R@D>nYt G͞"8 Q[**`FҪ>Q[N]:*,7KēmHd}%(ADP |m6ʾgG',UVP֢9ƐFnn,:\XXd@Ah#;B1gKhk)<:R$0,xzb1b@!@EϟX]^oĽ-/҄<͕3v㥊іe)-Kk  $m]GѸ,=]zT]٬9#A'E*h1L ~;VX+ d_^9 5o,Fn9+ujlm͓m۩~2V*L(%ٍ%($(٣x Qtym1+ @ DZڵ !嬩܇O ڙΦKً9KCJ1PiJ)+uVІtgXL]r0˗ώeUas'Ba5x՗s~È"ܝGH'+az~pKGtX;>iYi LJWd_3ˆCv]-^ypRkgcDjd$7[}P&AXZjL~Ŭ j=YpmN) Y[0:A${  jyy3eq;>0w=PGlA٤0)1G@?5"=GnYvGO) ]'R6qiU} %{?sD7yAP)t4bFjmn4t+aMf`cw'\ t|c>'1⃡ HYR^ZnDN;,݊ LgE@譪R A~E*S2 B"m;KJ!1QQ`G%"h;[|a𴭵3 =e;[5Fj]>h _,h{ DhenN,?11y &QR;Kڡ]ۄ" B0\'`~ᅈ$ɕh0V EU"eٔѭ?)745/v,[ie+ed#(MVN۶hʦiҤi+e(oVR=P)%gu$.u_!uy>4UgӢ&#/ikOP$>e٨~`"R ԫ@mg}`}'Qs< fݔ(ۓnYvRcŬv6uA0[y@cbjl= Ei}A;){\+U8oT>f2F(QZir=Bxoxmgr[u6j;-/`԰Z90^*mz[C}"I уx\ш4ՑL“\?w7呱Ţ4Ϯ  b4q?ϥL_kZU5L~ӖZ4A_R1\,G?ߘEj>9;Q_zEmȟ<1Gk:So)|cdP=V^=|leTBAT eL`=AP)ҤÏ:^!O_$±}\W7@T^/`-{`QD!3N o4 &1S{ f~$ԍ HǭD'thgW9_w6&kv$LDԝaG(mÏk!@g|t{蔇>56TiFV F>̫HP';(k:a  i!o!?a{V}`w`f;^IB0#PZZITD"" Č`$;yJ0W*no@VF A(h`! Z/y ׮ܮO Yڶ]&ɦ3\ipxhxdddt`pp``TJ}b>D1uԴ7_ ig= 4*6CL=Q 1w+~}rcar˛ܓ%DD,t憳:բl6Җ\-Wx$K#IAG(];;ݟڮmbT̅ʕZ>@QTiFFq[5ި3%KTzBb ʲ,7ٲjR vymYLi`tj8WZ1VbI 4 CVY?û>P1m'Dv'qR[Ğ0dց-L 8eSr~ fxlJ 0AK#KιR0Ik@˦TO/Tg '+:bv%?OEgR ׍*V$Pw}3?tD+ vR`T3<:ܑh(% 29x*h혠eiKۙt__iQ*d# Ftsnms#Sxm7B8v]rw\DJGI7CV;76'olmYZR8ortW[H3}b40X/|Fm!:6$yzzxMl$[C݄잀^ݥeR/\m 6*#b-owTz$4N&Nm/7}_}G$SN@سA@JMe^vkbBM6g}톍@"Ht|@Y5p \R+ ]Љk3wmDD$t@Z` pwtªo6FcTRtj!FTx *Y+d~h!\V1{&( DIHNgP1pʕ/}R>xQkwtrȀоq^^ BL4rlEشF k[' @O  f!ꖯM3Gqrky/ l<=}x;;}Γ#U.΂.GL{6q'ROUQsi mF PGb1B"ʥCEW!)DRS)Ep$K)V$v^6MqlS7RdPQmKi/j;)tSպAO! _|Fvx`Jt8Cn>I;fksmW B>ţ8v hw+n{&=tH=l8/mKN17nDhP@Z])?5(!'")!v+wy+v@v~]Dh-J>^KF.MlR-;0\c#4R`HQb='wJKCZ` Y޷v/@2F%T!d!W$CU)BDn-Յ,:yNs}cbΔJcdJo!b|\\Nn`oJA @lnk$R]r@7"'F>b @ޥCwrm2d?5\宯B_&|qpI\%ĝ`Ϟ ݙ9(pEzK=AMWAH3; أ־wS{_46,c#LݍL=t@0/еf0 " w̰|1,(d \zф@ƭ 2Î=6xlqR4bv7i~3j@'u mY5m߮X .QL-I!h)_F>ykʦPm;*LG6b#4(@2Hʡ}tju?l7|=Byx/%U (uupZZ3 j$+qF9>[ՔE~ևYs} 젲=g6n=;dq()H7H@_D4" Ht"BTBPu!hX*wb ==h`$QoF թsz $_J/:BeJP] %'/qHޝ;v 2YYJe dtn?9 !jhvL &kh|߫Uj;-v[+pO,QP-=f݄@A:M*(MJl8XN9'ODT4L )\33`?؇Fqf6:|DJ?FޓB'.1I<*őIF*mP bK_tr@pJ:ۄ,6&J3ke$:p""*mu_0k^lU[JJ{oRcvABX9]_!owPvӲ0T?O@ Dj٪.mX"GG&J(/q=X]<2\>2Djq.AUٝGd0#  -|| t+v4ꦡ |OWk׮- }'zS';0t:Gv9b BB|z~,WV6'~C>}lV~L}ը%vu~.jLԪfay;V* 3KRKр U+w<&4(Cf"ڼ3olFFK\usɡ{)lun*{x(K7.opJ;p,,(9ԍ^ n1Y]ީ{~?zh;1HC62^lg7 AIQ,]e*;?ByҒeA#Ó| *Rֿ̅ t@T"w]2%0= D&Æ C"H 67F[rLv^aVJ,5BMjQ@X|ͦ4vZ +V21{r h`0@Zh:9cf?5}mFa.Aۂ*eDcqO󻡳{+iBFFnn.Zyyɕ ;/#GϿu,3ؚ A\(V -X:X;tfz陟l߾ܛ_|W S>4:q?(#"":V욽+ R-#Xk'I YhgӖ4F ,%^C`BϏ-8Ac#c6a$aFZT 3Z 9c[1R 4` j{s jMH婢g#wo B+qX f>4Z 79}$B &6*X9Ce^tjr2l/o5Ox)>KDgCQ`ą?V bGA4j"G8r@E6ET}7e)?BdR'.}.ŌcEa֬>|PxÔu?5tCb#̖(t,'npTnP0\ SEb6-'ը(.0 J9A!R`{S|*#`+RF'{'{=Ή]H1^S\t}M?|@l:_ խ'/eQC͉=z+dOFxG O_bh??Y뫋]vS|# ]쑛zld  la3HұOv,P~zZ+/a@3sVpO:\ՂF`^GK ã`k|S˦w #Lla6>v&0"=BU}Fen*9%D$(,! 1Xkt[NTͣ]1Zg'B+e S^h4J{-5j+ہi$M}|uytߘ E#RV&)LSʵ:# } "  a-VHvk*L̰ #]}Z#+UP* C"R |P\EH_*Y|B8n9cCWC1˽/2n>ubjX=TQvJG:q"`c]5[e) L u$+j2(c `[M$]gȲ[%-*}lL׎MZ]ߩwBIr04lj&Aj)\ ;&0_|-Rߛ 1Sar+؃z1I t3@ 6Y]xx0e{o[H;NVw,I0 ӧgR3J4:![*ND Q *z{Q$fT:wh,~̊Q;響Ѵ=i zqwqqKi4#ozq;*F16Y;>275/Y6X"Lzj/V -}+'Rn&ʥg(ĐCtVݬ Lhvm]ɭNRlWo EY&T(`YCU҄a'T"`-S8n)in{Ng9WKʱ`1x&4jx`I͵PSTnx|ȩWOgC ;^lڍf=~qKVR]F nnVC#hM L?YmM Ȋ Ex] j+* Ȕ$p&"/>k~BFkdIO=f/(,+79̿d\oS"@xv"VJ~y-`dT(, FRR6BZuP1RsOB CIP 2#;h$ڍXDnf"kpi$O 2iSU6w۾9)6Mޡ;U䳋~!h[-KkrV_j3 ZewiiP{|O:0'РdAmw,w\x,Hg=t'OޱD›ψgk2P'_9`R)q-,"'~r;`neXߺ?CW/Ϭ?8<\{|KpeDf&`mh!9!ݡj wºlͭhXbci7k8R (ƀFdwwZc',L&v.v껕E:]%MhuDzP, F<\N8_|5hXg.pW/^Zz1^BD2mٴ[[3<|y{8Oh!alcS{rX,H~ˈF0p B_f)-EɁoUҗÂX n>osSnRuz>8)*L ‚]IČM#D1YB!9-a@SBZPdef*#!)KXQN{5C1H9QFUIs" DYZ[nnβ[gC4`uZzȄ}OCczvɭ-f bj9šOZS:qOt6dPyAH{e&H>$w899˓]8l-8g\xa:js)X"(uіQ8Qoh0eF 2gwfQrZſ?wpmy)};1RYSSxm7꿿ʮ^tι֎'WU 96@ (Ѥ,mْ7oq{7זueْLRDI si5aSch=P}^k9i.g÷[}:#ړ|M1Vy'gƀ$|pA Gg&3jogoDX)J7Ԧ3~س,&~ ;CI-=; q$x[ [wW܉c3þtFYʴڊ[41ls-?otaD°YX\ zy2|OmuBЖ,׶iTJَp82Xz=k$YŕFݔyo >ǯlpX_^7}f"FX۩wB 7g_s{=܌#N*s?]@>1[tneFq90>Y'Qfmd6ouo?ԚMh2WO:`[D v@(z-@ }JNO~2}i䏏7sN|w;?=r9!I УZC@Pn)XOZ/P6*a`N(ԧ~z ĝ:MW~/nb$RVXp>Ap; NSghWev wˇ~R턢0*|2]i"mQ9h^ZrݏPc۝KF,D}ю0ȣ"B/ Q1a呇@ 3 OP±g?Wf#H~0+2$2QvNZ]HJye !5}d]@=V ? ?#xFxɞ nѡSϼqxE  t#'"aa0q70@dC5tm*─)c4n);:uT(;dM%I8^冉FqCʀE( K@+eJZucl,:#E,"p$ܪ[gǂťA)PAx*AeD`$@R~3g>ٜwgxvysƄ%mJ7 .Ji0-bnu[Hif IX.Rpz;~՝wo8r X gs#")~v fI=5I~yRMdBQ,MO%@^T* [!vlI4,HSoC 7f TTv hsyfv*{{a, 9DDio|!vܡΞ6Kr\X%I:Zى8$D{FF$:GGh^E2Yǒ$dϮ[4J%w\/0B[#YA^Z "F(ʘпUbRtr? E<^(.Ф[n-s"?e> D=^# 05-:5c_oc k&3o+?Lb ׭MBuIY=Qџbqp_=L` 0>JCvK7q(#\Ҏ5 pUyg**pӛ&u6 Z{a' O8tvʾlFڌ 78tX3f|^pq /\;qħ6b'R50&*4wCj𳍎 wC` k&K@ėkWF'WF6qX;rO( {'hwD$EvܩUJ'9& A6ֳ&R6hQ9Y$GJk(h"$ V`eLS Do`7®ht"&FP66G{#{u@J>Ν87N{g-nP¶ 5lm%FQx6Ya$!A A"Ezaɩ\fDh;4h1"q~ܢ#o@ "eFex%$E} X:P[wc'ҿ{K20vI\ L_ R_ IO`%6`/EP.Ϛ ڱ@L$q񳙁װMV(|Έ` )1 S D)"H$J)c55ĒTUwvAdsj%`ѽ_^ 2vlu }YVݹ?!x?)9\(E qt8B >Jv.fc{sTa݉{T @ j;1Qc@;: B8I,AMx 7n'F;{HJ/>D˫r sԮtB?/8B}8>~ݕݦ-5#AP`D86QcPW-={ӇsW,͕̍7+> c%LyH~C!7(;"R(S#م jO{B_'܅J>J1@ y孿!d~$AˊqD@@)೏<FմR̄H_̖uzhDCQKm!;#@"'xБR 2 "eJN'w[;N;_ $Aq1{ƽՇ.꿸˕fg_'9I/$:Ί@x-LNל_nWeR?gP7ڛ"wWw5ݾՍNF|?[[w+nl{kESWՋB)7P@['خ tX)DNwKB\UTI&ƙyixgD?O-iՅvf4^죇tux뭥hѤn(mLlXvky:őZ*{(٨`Xr '\$#A=9d $Q9 2İaqF@1j!LFC_anҒ7?u#940t뙉erm6Bm˺ 1=50R>equn楹WFn]OV7&f k s_Jj(`tYOrTI2y؟$l&QJӥ' wgVOC_EN ~8hsPp{;"ۏ!{bپ.1 1XĀ %)7<8Gopk"&ot)Dݖa;ǣ"خڨ_~=Ë@Z]0&j/':JuZUa#f#@5k9iov9Ҷ_,mgfWJd>&s!X7gہb`$7ۈhFiGC Չs|$4f*I0vO◼>KǞM\۟^/ū79`IO v':1f-ԗWvE_q6c%8U%˪P>HLqEm{k6==W- tLli+:l Y>tTi{=7JLn[Jbs "R(̈BJwP#B"X F7N@t_Ao,Epyonm[1FD?wͭ'>qEKK2t擥oFiF p{u3dtwgJU$т (VL'(Y괚QTϨz$dvʚ$DÐKz=jX 1m w G2>]AɹZ ; Dӧ ѥq&{c~v,g,3NjR2^#$CM"iȘK3RMqљBq^ٯYN[7WðҬ^92u|R39k(zQIz5@qJ\mG ` j"CՇ1(X(A!w -Pw@ &*eyОxSFCh MJqE' $-VDZ|/ b[T0X>a½ yf$C_TcC)8zxK{үR t%0dC>Bjvso_~~eJ6o}{(ҋ?u U yO3A'o`LyMũe"s:3׺}3on||ةCJYMAfDQ=ŝ˥]p, a}VEa1,F1B 02)҄bc1䢍vP!l:zFx$hl}hCzte`B+{D oXg[b| p{n難¦13KwJ꫞ LVn} .xr}{'A!Iԭ`ix)w[ȠÇYG81 `fEhs*o3:1 k5[ Ğq I+S}/[84i})Yf yD ) T  h̕YrJۀgYr@N2 LH JzRGDFIٙ9SqF,A'rǿ~k{Q1O}i+'IЍRkb 7<*c{ZIDKtn3P ;NUUn$ILXSԱ333S' 'ݕ;G-S3z\{>V؁8X$n0Z&mviLMY@DS834rz_Pda*42)x=ͼt ,8HYfAAi8e!F/d|FIXNamc!Wz#B_7BɞŒ6#(Rcڝ᤼G^@En;ivX-fNĐܯ?+`7 z5ӃB, |/&Ȏ2QzO%= 210Iԭ*r^F-2ͅ՛ԏ,cߛ/cLҼ ?3AGb너()x-ۂU *B|[ׂՑrםS[G}192[ڨX[}fN .!']x J[MT7\|c@?>Y \_nE0fyN?Ml 1qj5t&Uoia]M.&R$j߽ 0g/CH{a%S_1 Ƌ[ִ˴mk;F oܹUn77˝(JX!J=d_ ˍ 64}mCgÍhpֵ@uwp۸Rf"1 ޸d;=FmFg>zƿ,uxZ-KÎň/:Q3h*w[Ͱw3f: 1=/`k!2<@lYX@=Ð4 FmB`TH\^0~pbd5xk'ld9tŘCˮݮmF]K5w$Ȋ,ϞD}ga:Z{rB?ŖY!`DF|䓪({]^<# S_?=q~!uq/|6}J{3<0Qف52#2q$a }NP)ya&גؕw~/1Z+]y:ۼ~MgR,"pen S;7l޾0eF]Rdt$z-p,2las5@53>JֈJFmHN#HƝIŃtX R!*(zzSpn &+4~j2S?䧽)^iЩ̍(Ymd+d) &s%zQ)& ڦ#)CM ͕.`yO>wBk}*!ѳeD}H">,1(G!5Irr3s3pz`BA~uH#|3vklÏS!E"iRձQ9&CFHԃek}Ei&i[P} S} P:k:Ce!rrqHKA\;2*k|l DPYI`JIPۮrH\ q}ǐ6;[vWv=%1(@6n"_kDN|U˖_wyb: T.uTty9ۄBTߎ]8&tv~뾧b6فչu؝13 66S}ϭWu ƭt;btΏc; (F kc [M@J#ZJYAAIRѿrk_)J.^}ţְe# WWך2tbh{*]8-J0\07 VyMl2bawC nuj" \Qb8fr+Xe+Ķ| lؘvmu=yښN"QHe]o\Ql9Ξq`(e53THʊm°JqF@gJDVn3D+?2@uikZz8v 0O,.I)ܩ<9!3T )řFҢ=zw ɋJgI'+[J]_]^\nqvg JDPI?k2Eդ <`K I-gh74$ AAeNcVX#2F`N\=A[r<f7m;_ҼT J'Ēvy3Ccu(R;~4KLjl1dXo;J1JRC^?Wj#ڨDP d &?<3o]"T|Լ+\{Ş/-D8tOg&X{/Y&i̭[EsO{+oDF0Œ'ǚ ΏRcl+r,v%Ǯ$k|/@ QGxhe|`М^y&:8szxWaSy 75jl2:EH␳s .S5џީc`Qd$(d9>׾zM82s<~G[NYht‘k';89==8z{{3cw>ıpṧ魷c)oe;D]=꯮BAض=#-+8;rPVcҨ&V!{JBsD[Y9=38sdZyYY+qol(*]kv 睟w3N@izT٣muADM_u0Tu%_}=~qԈ _@I&NnʺjA*:7#s? B%$sxBm\ӼbT^00CvPX0i,$LV;=(g9I࿀FTDH9"C9%q쨤\ޯ?N~cpR6}( 0A%>\(71{a7}>iϨ? l3iu||'Wf]ـ.ڞBJ뎉SL2Q8qH/#*)c"¦t)37'y9)_{Н^^^Y}'D_^m.s$~SUH; Rf[KT6 㟪~9?k.{Wޫ|[z~\+*va)8I(KrόVQ9Va,=wmM@'Qۊ(GjU Qa^(+2഻;!._-R.qWTpsdla :Y9r)xfe׏~{ lP`Å&8N?yؠzڽ(Fîc9`XΞzgfOVV?}Pk>yR1 d/!F?ct@.jH qir@H܉DbŹt\[I?~C)V8~ݖҨ±d>I&s/w&IR@,!%8 ^孀@v2E ;@(-=UFwh$Tbވ՚0uZ;Ac'"F,ŭܔvyńAlvV9E$cKT_?ީ&kӗq3ȅrc('+тt;6r A0r=n;D#7F)ش7"@a8 s:v;ćq'y.+وXQz$K[9уP7׻݄G}LmUs`ֆvfܮ[3@t05["R(6pjvgN| C/ ֍ymБ`F ivd &KfFmmmVAf$d.``|V_ YbKi{pΑ?w?Vk3f}/m` W3k Dq[O#: d{65 YUu%/MoX UQHh0@,9:+8βh+Q%uӭC(9[{2%"B'QM/hjODz[ք? GAec+!Ȳ(}am5ڼB,zV"q| |J?4V=ըO+P WƏnolU۳ 7#U0B#G}r7szIQ ̑In X:\IBɡb04Ԏ+;>&K @X!0Mɑ%?n ?ZhMy{LBLD%;1h)}u'vC/ I90ȴP̐IB&f 0̓U4_$Prg> el*[+ꬃku+=:?iW4_{-y7c^чhrhd(_.1ܩW_=Y 7~?Ǯ&ꃲ%AmuMJiv|csO]x8[:|y>/mc&%0nQ2>:ؼ7w۸"; ]DX*xRf\OY`o;Vdiktw{]s$,cjla? 5_,`MJ! %ZI"Dݹ/엣4 @DIٶ;8~~cP+SVʶ&v3Q@@T/\D;ai9O4GdN° nT3n#dNLYȪ>xxtn_xt/Lmu)MUNjv Fs{{P#-Li6`?X(y^\Ūcv+aDCI(c xR~|(X[ skb2ŦsdJG"{~~\KjB 6Q`#K$ KP&<;7Dܐk,ԽXssڙ[e7AOGm:~&@L!3jf #`v= —3:He 8?x,AW8X‹1+׷ƎE[wNCC\Oʨl[=zJI:ze]qKM7?}Bfiwgo1cc8X)v|!H NiD8mm ѩoin߹݌Ƚ4jח8F"m˱3c wʧQ|%R8&?@W@(%)[A" zlGG''ugQ [@λ[EkP$HʦsFGcP͉g[{+܉ȶ݁cCcCI{ui4vt%_L36,`:UBĚxX -#͎wP0;b+l{BiDs5I[*#r>3F$6I,m7ٖD @z߳!4܍t/>ܛD);|ə+O4n~CpEt1W {|.50{֍:8/]xx&btHW(4"8GN?J+9f06 ȸ0pwlkcϼcpNa?lMtt?Z{t(@$ $-{n(\ֵAٝuvnxl&+Uk5Mhd J7RڣCk]5/;g♕(JS3A`VfP!mHw0h?2;HNb\bd½USʅڦ@E7֟3 MCRQrhteyH_Yo4OX&{!~xup70Xt%sn7Nف{[(V%bNbFtzhH~Hn=ujwPP~L&vjlL cX>lëI)i$<H4"k"?Sq0ęH ( pxc[7;쎌îZ].ŻPF}$mRI:0NR #|Č;2$%&ٲMjih%td L qgk+˛C^KgVň/WwPaK2ZB@{/;;(DI0Xk8"30" =wa7QoX-ڲF>_xV|zy!G';zxvX/wC?Oű<-BbJ)J|"Mھ79cnCպ2>syc8ލAsbeԲ+q Tas:C .Ɉhg9>J"6L.G,h85zJ tfrDFz<-ζrn?XXxR9at*UIx^lbʼnw~ލ\S|`EfIMX?_9CǿZjy_Dc=urȗJ)!e*BpJR&lϴ6ڃL}fx݁#&Pl[B)M?l*Bh}n6axmՕ7#DmFLRem9Z: w yw5\NKX\I4i`/1_ :^-g) @krk5\﯄`>?2a`ScZmB1ʂw 9􌬽!C3')D݅CtKag`!dcl]2ᣁB/Q6((Z,GZ'x;d^lԟYkBAd+si-XˋL*ǢyON;y%c]6)UGD/HR|^[eS{-4^![XcYG^.޼[L}#H:--",Ѳ+ZXmWw{7_8? Vn-5:(,ًeTީM}9٬Grv6Lqi/vl=Y@86Q &ڰ5R3H:s]9o!%h c?u5‘4u;4QQ3zyJDJi`If'ˈ"m)bPmI&aE mNû&k[Z VTsN'Df(?pk2-87 _mu". sg2:ƁӃ$៙4g AtnE ԍqRk$FHȼ4ƩO$ZS2"5Y~jZŕKl٨~uٝ-Zh Ķl皑쉽JdRL)=,^*¶sl=>n c013vlD@8ݭ`!l\ވ'E  e%V"Q\X6!Uy5|axqw=aw$aO T^'*}  mj@(nl,$Pհ=i:Z~dRMQ;k@bƊE/V[v0,ˣ~H Շ1t7['fI&hu'^=J!EуpNvup Qy7>3{ɋGPkO;1;6O UQ; mdLҭR{ 9qMܲS oٕVCǶ#.4Ҹ >Hh< ;ЋTʱF5tΔ*ph؛ `t#0VT^PCoo`d5gNUNn@ley^7S{cI4 EAEQX۾IWB#I" "I7OW-kNB OlV%8T^MRc0%Li%4AUتXyտBV ڌE|$FŇxub^BcLrƢs5.wHRIH}|T^#TJ)B)ߜx"FAEV'}0 N??gP6ٱK3,) kpdw0o?f2v5r3 Q =H2jaFx0b%K1t.ߞ󕏌3g/mu9|ļNwG3$Ipoz f'\< "# Bfo{8pc㊕_/xܩ'OSw37viv;qy{3Qf0o_}mBf;GF Zk.@Oz$jod<E/֥ Ҹ W츞ʎzpcA$(iC ?ir|@Jta:ʋL!;hCC5S1hBO:/[B[QSXqdB@zxffaaPT} 8fnɔY Hl0 "pV3So@ }3D"JEUm]rBFt6Jad84ZbN &1c&= =3eo5(Hb*dk v.a0@bG*I^8?[`e,*J&ΫZh.gD{1Cw&6"ЗX"7' FŷAy+zhDC6n/h\'?BbhZ/rQC[-5RJtEޑY? 9L"dr N o F & FB&$>] շ{cD }$%p;%I4kFF;E٧^yRD16K:sKO?;?w$aN M_|Tހ1zria4nAƲröBG퐫(_l:>-Gg6.6{(;b?TH~kcի3_俱: ~; oXİR8[{ ,Hi'W P*崙d4=VB@ځp5bm 'G F6H#6j5

e*Y[@&k<U:IB;ɆۃǖSYKFAH#ٍ}Ao26DB׳8Fޯ,}HAP!YGcV޹ۚ8w%MǮy%=d%k*-j۝"r'Ibms»  K@PvneY&훆P. *yWpM@(^(1QgFh /Y&ǯ vuޑ۔a0#Iq ƈ$@粥kiDq%w߸ /|N"6jK[9=Rؒ#""̑٨gQ$6j6A'l۵KD=W%;Cu7V\Tm+5Ҏ5*R/|I޴mˑ̞lgswUdnEkj/$0vwT2Z-'7/P(e;42[$@(c$Zezf:7 @prSijj7zp@Bmt@I,B PԺ̮/WD w644-z4LBd#q Dfn/Vˆv-NX,TK >DPvK&f&f !ѡQjr%@?D2FGE"ϸf c\2׸+hPbl=Q._.2&;mP[(zz,E"F(jU:\6(s7 AS|C"Я$fw3썏͠$BGclןʵVv ;G~Kv&"@Pvo-c2dSjKTڵͻ^"$0@K p9r 8zdFW %T U-7[TF??%;ĉ8ydNL1Mv(.7A/~3 L1*?F 24GŞ:;j-̤T+B{_:S}8 :^-a1fֻqk_yRiY᤽[z f&'DH=%}YǑѝ:svK vq(^` '}ꟓXd# P&(P̌ KЮ[* ,KJǤM A'b~ԥV, ij\(S``?s;頱 IaA؞?Xt)DՀ9NRKEOD=@GaI܌O_8^ >dDzh6lD+ +.uK?G`}q@vCdro{K.ab4a@^f5Rw[{15 ؠ=]Zn4h HHoih2=5PڊrL}Zu>sk괞\\4(XtQhYM m@9sbRf$!@.F)/8 `,S1M3zmxnbBփW@5jҗnFHY3LOt9]}h+累}|gSl ;[!s#WC3?;1A Ǒ8LݤG1%m&QKڭZ6A@{ 8 P9tMؖɿ]7.&MC7gcdYߎ;VJD&r7|h['~Z{^rVu%EBAEi?*?Π=T&nlrnj4gZkBCKwod粻)SATE\hV[s  jGBR!;a |:8pDIq{6뒵5b A W`z$D<<|V+OݨWcBwd SP޳\bLvB6( Q7s: {J/4|eer#1 "Tm_j`R;?ӵӰV:VHnn85s_Agi72i7ERD~$\ō҅wTZgc6ڍk <ѹiGRqF;-cJd/~\='˹6Z!#,6F=*bkWΣsB BKw+mMq,@JXnuHO6:vp/Zbʕ0z{3ͭҩ΢2yȤ#rEL"$"JLVwWG&'oA!(Ԉ|DIojޘʡӻo,' v'kYq'&Wf0;^iDCk&_B`1fې8cW?phnxh:#{p’*۱쓳:kH$2LF^{='c|M"u-Y7x_{?@fp"nRt{+4r|n+whɞ Ąol`797CӉ q`c9Mmlȵ8륀 PY궓yycE@+ݟsw㔍8j8I*TysCQY:;Y@9Ԁ2EhgG\P {meYEV.WEAi;30u6ۈ 'j[ڠ'~tܩ wj(zv/1qu؄8-ՂP2N#a44} Ov9zMS3j}~a;`z餼t(N%T˻!ℐwq^qB(BtO/NXTJ+xc\Z gcn'03 퓳Q7LpH 4aCD{ͽ׮#3l273# "P?NV߹[ri'`CY"ܵN}a]FZl{1p* "@m!>mm0Syjr1$xkbt(#두v\<}8δWV&1lLr?BRL,0vI>mRDNإSٙ[?r5iWm,'峙L·X$XfOkZrg՛ia(h_H_]tzc0X=S6"Ua@:.v똳VNGEco{ԗ'uWi6{yHU+_K:}oMNg8g&~7.XIܑ{MQpH[h `] Ђ$B jm Eh)^;u (R玜wjiTKgwDY0Q*iw+twΗCKDDQtĘ܃݈1ܗĥ?\ԩExٽ P alodnl$Fg F;OWp?&n,i{mdns?fn?"2! 3[{1Jܭ ;Q :5dqn <`dncJY[T'At"KםcGRʲ9VFƖՁJ|+SsjvkW3M{rQ5;mc}v>{z:nFjثve6"RǏ:^BkУղqJ|׬B1H;2'˵_T]{ϞeZ z~e3nfr'q2@ F|pyok@`bF:PygX\q|vN#h,xP漜GI`i2FIJ%孨MZMY).Bݰl:V $ ?hT&8w]*‰Yc__!BL@Lӿ6 oٮ_R|g7\y8!7TsW؇[#ŵR{rNڍP!%BitkR+;3|5k݃ Gs[Ljpwӵ]քuӷ۫[]7+ `[DD$QG]$7~oVQ6deOIx|v8_DH4;$CT,9'*((X]!?݉zz 5#'W붦wkuX/|p#% =1P(wR5 dvAxz t0PliȎX]Ybrr# bqKV,8x B$URòɭ2hx~alK%{n`ѧG7aN(Ꚙ5ֽVUM'᪏4i"͆~ik/ Pwl~sKL\ecmjA1wh$C>S0y$~!*K}YfcX<6o Z@ǝF w1?]L|Kq4$09hzeM>P[[xĝZ -RG_`(z78{1 /46/dUj=gY$b_^|DZ+[@ɥjwc:a?6$*a6oח+7%a#Xh}I`UšrBV!6[x_)>= f# =[!H 6,O W%ARKJͫ#G;O{$FL~;xź;yr@lrM(`@dg(,@Զ4IOx?G$&~}⻻o?YquuӁBGSnf+B_VF)dTp0QB9%?ָD[yOҤr8YZqn2yySrOvS)<5Qn}w ୍Oel~hA/.Gz~(,l8OT~ qo04qgGP!W.,)`tk[2~ ZǠZT Y%AԳ>?:B@$v2ӫdmԞrRcl@$3Qޚ:j9UZwD48}#:bgF!B`ݚD{'0r`Tb$TZ3_Bc9Trt!_|:{~|bsCCNBIDVA-d'閝͎Ft(TsBНP3^$qL¡&5^ M`y7HULx3VdM?nyI׎DXҊ2ߪvIێo6*ֶMeCɊaVCO;F[j`=v=3mWb׭_1Xt.+fMPP&̍JALG$!ԓ{_K>7I:K_ƨw/pb8-;yRӫUvp7gX2vݏqp|AaHzhL4=k#`#Y!ڷNh5(4jMX$tst8L"r/k 5v+x{j(։y}c}/9lMa)u)^8 G#{0|'(TOD@G HЩz=0ӳJ/W'}yΔz`{;YyӘWVwX"S31BwlvyZ 1lPP7]AȲF.frO^ wOwN"2Ac*3dl+ te"v>?\+z7 o>yb&lLNuh y`b5|&dlD40V"˫WH}$ 5 OǷϜƭ8v J[ L}gIzcEah9ZױD!ΫԃΩfiwF/~Ç(p3Ow;|(GDIؼ|2Q2X1"U˃$tn-꿾-3OpιֶǻM o AOIJR>mUeV5QY#SLUJ))EQHщAxxZ>^q9{5AfŞ֌Nm]ПQU%#gi'WfK"u0"#l-2RXcߺ~ExF-\e,\=Hr5u$dhJϔ3wEbi6Z&~E"M, N2)ad5{fGPh`6=}|YR* 5pj`Wi#ZǑaavWQ;89@0f}yx%|tV{/t'nwAC}8TRONg1T1kTPLCZde@X]fۘ21G4D9xЏV8w8p h,ݛ9N]D&W\r=@5MBSJ(yXvُ57'́ nN^CBlј{piPssӁu FK3kZ VٺzXL5`Pi]j=A[7# ")5g`yl:x+g{J)r|rR1pLnٓX:I`gS!ٜu,)X -mRVZi~t,{Օ@ҶL$Mu⽕Q>tl<(Db{)J%I,-1@AEA2ltm( 4G#c;K>w3$& ad~q{?0 ȬfШJ5ɶ8܉˄!L:Y4eEҭm4zH)i!x0$#`LQ.-Vo N,ŋV3NHZ5do NTzxG*+k=?51(!2 Hw:H6 Ģvnbߩ>ɷ{Żs Qkq˞GF=bdMF'OGQ#HsHpQW52EN1ER5bẒo7 qf;pbe]?8-D!N?[#.0S:Co]j a9JƝCwIš[͖w911w^8fya5֐vX˳Gh{:#Q5cl8AqŚVv7#QrpƝ>0Bm#3Hpg[k`qɐI0LE۔B4()2( Ԓ$e޿tF ;<rž`d$ =i0% |--;oU~@XfV,Հ3־I?aldxmt|G= /sg'jV=4jaihGSfǫfF@˭Linn`"1%RvY#m2JLY>Re D(wPsLQV5GEފtx CI+*c_\i>v_qiC2kFnr[]}c2 coA^1k5t{%]ע8ڷIECR|R(иugXkc#YkBD4o8Y4%2ֈ ! f_@fLo;ED?{5o}2~uUBcOX7^ۉ9_4^:9Ol=@ġnLMp@kx-D BUǯWO.uux#pF^3NՕl9l 86J,:g6͉5zBK KpŞ4kt˻}#420  nGl)돽;$FF( fHJ/rϭv;W?pscB5HHiBMk4 C|X ŢkZk\cj{saV0f3A1PAMNVj@f=nˡDO}#HfϹm;:vWq@SoNVȱew zb-|4DID:L2Mqg@N-n$A3!spr'L +=E@7^?46&dAFd#zjPP4cE`:W޸6bY*ָz_\EZwxu^=h>snHƨ;D':U[_M )pHi+c;6EjZTOMZ1so #ޘ\#׺M/H Yy{4,]iX tbi͍bRH8о&=&q;f"!aɗ_|z7~~fg! `Ne3˸WHqb.dKM恁SR!$lv@#jX9cH2 Q2_>@9>*AcVn/;*;4{n3e+H@S?kVQXڽCQºXnjH.II32!2 a]87f?RBOMs8}/w]] nt >9b.[!k7Pbx6h$=21wZM[#fIJx*'%~Mb#\Q@&i(L7X! $4oƢkGe9wL0L!4M;S2´t}YΜvgIߞ{T3%~ $vXb DiƒBQgY 틷m ^Y@Þ~z;,>l}z]ps9jkjf qh-uYī©G1(-y L^יX- z Ʉ@aS[}= a\1`~-0  (@[&Z$n񠱴 DK<Ea8ǩNsnv"V*/$qD:X=zىW%^L43׶jUAḱz;7_]x B٨GkdB3[$"m\xG3kL$YהÊ 6!JۏG\!Ŏc[R90x!H}ŌWW#WD(IÖi󻫱xws|&aw'n?=w+VD"ښɰ ":n!Bk4x>G'Vl1VH?(N:P7e6'%hEޞ $=xl^[^VBDB`d(_}䣿koǟo|s|>Ot;ҾzuUgsbjdxTr\+˺Y7_8~to~͎nXm*pqzU.6?YKQxa+*h0XB(ⓏMsq? ?KF2VD~u&c_!%KP?w;`LܫXSn@Lu{g"4 c`Q0wj5s\XSI3vQrpBS '_Dc$!*2vLKDVʹJőxBqޝ?R\ipqĕO4R?d<=m[t7|>ncVN̅3`ڑR1jF GhWN )ou8RaZ ׵Qw/z㍘@woZe} _X"smG@u߼YzxMHU~~rO(]|珮*5rsх(-f+tbjXUx=@"V<@Zl˟ f@񀐹4mGQ1 7vU>넳D{#TZ(ųV3szWY ZBZ;VZ~W}W, JB2矚ƭ v18 W״׷Jl^yⵕޠ~{u29+ֆ^1LW\zecVGBs4[4m"1":@KQ֮S?oI܋"؝VCl,2 XM|^L(|0/*WJ;mT:݌HЂ3h#CK 0U­2 z 0#WL"%dx9GC :L$Lq?eh.ΙdGnlvyaV:`8,嗮nH3%#2q[Iaƀcn0*ۀy* SBיcwWbf[8bؓ (K gn)sl}!;%%_"`fX!3uID@;;W&GAv*_h@44V~*=#+ov;8AifQ/K "c|I 9:  [Bnu3a QȤ_\ykQv_YQiF̓o@/|k@PJqZ(uכ\u࡝K擝 BȘ#K N+h7G'W/vC -uD]'OљuV*vnrk a R18D(OϘYj_꺵8>Puro?x% Ro7굝nmuo‘0} a"J8ܻw8 PI2lKV[|P䐕޺tΏmu?5ÅAwQ 1㸳W:zndeUq=ՁP;ֻaKizo?.r"`U0wcT:Ӧ#:C^ۿJBC% 6}TsLum'h'U!rPՖdXxQfqn0!0SJglwi: RZԂQy 4D:#<&K:/ک쵃e;OEG4}n?PD90clwA)bJS}!"Y.ޝ:p ĥslD1"62UJV:mDv'z$Aswqhfc]Kݿqyxr ỉڱg5Zq_ѵ Aw#7n>~o0 Dd}Ŷ&z`B96؍kvw]0IiĸtPR;ZA{9v|(1$ފ]=fD1e:'8oꚧ "JVRkUk)WK+o#$B4s C$d]AS}/gz Tgy1*媥Af7޺;$T'v koߝ|W 5LSL^ "1VnԯLNn~|1m1Dz%Acmusk6%eDp{@&s\cLJb``Z`JCm0S.] ۴3k h Ƭ6K7 @ai9'WzF3x̎5 \ؐ JF V: RZU{7[H~;dT74 *OLo`Ёz/^|*=Lh}kv,2+GF*rȱN9J#=(_"$yp&n<(eP%JӥXB`B~garg7fV]0%U:^Vfz7>z,4eWx^8VGQ:FyvmۡTV+&;S  =WwNK5FBQgF߿ؑ6'@( *cnm6=[ 0fJH.(=]wocI5rrs5;}r/VS6&fVRp fFb%2eYkh`Urⳟ ggKKC?Q1D0aB`0#w`Փ@Z{rч3ڝɤ'HA'z9N=5ySF"A3zZ5 QjcFbNRe a;02-,8T2`6P*چ.HPϵez?nFT'"a|;ͭ50la.P׋p+v~ à'8 |/R:Sظ=B6uyk*ܡqQvG ;s٦|Ү Nm~aϨd{{44l XW۠T7apY‘/IX,^S:s3=N 0u?)0/6Ya4꺖\u/*A#=+7DHBJr>s_ąON4N Gǭ{ B,=2pPdi?*~KfbN5jSiRӊfl}ɹV!dF* uU BAdʩGڶ3Sf+*xG?hѯ"Ok'Pj&qdd("Vθw3A0Lǵ-g{S̕to| SC *_=O ٱ]A3RM'f{B3ϐ# 23N (!p8c=Df !#jUe #x"U]U ;@Bb*H^FWr]+Po3ݶ(O}F*nKKǂ֑Nن5!(/^+#DNҘ{^=oSW筵=^]3UmY FkAR轹οQR" 6J=>v{I1gJ zʄ~MŞ)Q D!_>Uǟ8هQH%*`򍵘cu?w5zH3KtD\za2>nMkXZpRQc].9v{jWpmwrʔ)Z ^k-ݍ58&tm#0+1Ҩ.rcƯ?nrADTÍ<"#1 A!/武mU6e!A;sGV ֲ_.޼t\ޞzZRbK`0Y`;fޥμpPB- \*)4-`#{uM7SG}{ D_nS,ZS!܋0 sonV FS0ڵuRHG3p#PgLchP1跶6{1yf~{AZ8dĜ3$+1W ۰ aZg` ²~ՏFI @"`ax9uhN2@t#vmN^z8YcWBnqpCsf$Ԙ{q]W' o]Xwj';}(s`аu,YojS6L##-!2 MQ84y)mgp#/~ϟ=>$^2L"4^V3FH0:(䮴 :D'Y6L W.t0C/8?J|_=ڥdn2~32߹ytfkch뒩 |{hh*e13`Tޘ{ݰװT(u7nJs8@#&JiFx%@!=L춢O[j$kq|$[oPԶr&@o A =Y)DwDv^xvֱ\+MQՀH t N–;3}^SUj~yrve2_l ȰdoPJ~Q<$DKQXʻ2ǰ! mPم"W줏'D ɽLg[~c5 =-& CHAˢz޹AzXi"HN=?e:ĉO1sr})@ܽTz:s^Z3w R^c^1z7?B-6?y!k%R3 @@fFe̝SZhm26-i[Ƨ Ts޹讆:̏Uܫ[SSA5SD% -? Paُtk 6JcsTRf-q&0y E##cdQZ"Q /- (j R}CFSߟ^Kw|T~pw)m'K+kB+V]0 ؍YPْdJ )wȩ~ss3v-Ӏ4\ǚuCjSj-V豃''?>;9^Q:F.b9a x~Ľ`0 +ss݋ŷ RHhs|`C9&ڎ_ h-/D&Fm7*&{]Wv6=I 0pxcYs%9֒H5"$!©h܄Pu{fN[}<[{.A"}}W(3W#'zR)|ov%Quj't91|Q`odifb*C(n8ɶ&u?D5 lgb l@}=*FřH{'4,?~ü[+x|} yM٬Li~Ií$''6TJ@ "uLGQȚJ/cӋ$Q(=#jUR0lCq+/b5#MWڦHΦT@EĘܽ[7Zt_0cOI՟4ÒWNx{S{Ru@-Niֹu< F怹vێq:J+ܿKX&33}?q:FuԀDq4PiXiV<č*@rǞg:YY|}p1W/RJē'?و4L| 7)H/0+[St%XXX烝[ޡ${=P^Anj6/ceKBJ'"cj*Gg:ڛ! S_3Wf( X{S~mk'KH SgQiJCW~ Ψw@ o|h7۵\_ ,[X'RSN~]TޝJHM[BV=({ׯM>iΕ'2Id@rTN. $mĪ|̦wn&wwSRh44 -fk*lYQɽz/GuDdB6iID_1S,iyi)03^wCsDdXV~a'P@ 'Q"}A,k Uv;Wv:2sN#"(~>:qi";ڱF[yjsA0Z?4ucr'֗{c j؎B{3AzSIPyٯ|{`(@RGFW$Rɾ Ŋ58T1h Ҁ-[8IsGo{WC0lcSV s䁝溁JkL3jԫ `|裪U.IZiX M}=LS(qx؆ ZRZJ'a۫Ȉw#ty+(~_HDW)C df! EYsv)e~3."Ǭaoց 槾j꒖NB>^љEYwj[jWB#<C&۳Zcv t6aFNooF:X"1PuPb`cku;jiSZ+vyNj)4Uof+t af9㷙F=B2*N:7@F[jӱ-T6RJ;Vl@`QXA(v5p>W0,s>dZs1%q {Z0nz̢l9dk֭F_Dypԏr\hJ UKL^Vf|2G;޽ƶʘNL6 (P CWFb@w_r}~+6F"T+] Pyr9ůw#RJԤ>pOf(7oٹ8"+,CakxcS㰭L"֑'׏2ZH'4bak t[ZiR'j(jB\5zrYǔBh샳 ^\O@Q5G.$" 7d҅[ vlkҷ~z3Y(T`;KӴiÙibOb`sꍭڎ|E1{^ Ͽx D/xI*PSu+GMN0uQٴ;/} FXLFs/cǫ[CNܵw/d|BAұX"}Y1hpޜz-^ i:(iJ͈cc7n悶%+Heyfq-O#` FlF4рzx1<8WQT[XXtxE@#MfၘtK"LW66ZWpJ?!wu;`$DY&DcsuU[ƤS<HH!zT]c`fA J(ĝ\?gi7ʈBJj+SWh!l67М~w3훲\~߰:[Z _%mad̀Qa8F7h8-^ K&n~3=4z<8XbH xJ%QP0:xGK4;"!|H;`!1տ RI"ҸMfsOڢ?0"ӹa扲"00D :!2!`e:5Is{F'dF?wdE6V80^'#(D2`3.mv|؝Zi=/2C&aߟ6'iP α w O:Ss-L<^ev<ⶳmz4|L5^L^{KwWzn5]tCr,,G2A.)),) M-$F^owF_ :6" NrNϔ/|2?|-ܴD %¨5&'][dwHI(o_6jvN&JvmcX:q2ֈ v@ 0!6Y~?s`,Pn=|@Z㾰6DL8$s;㧯9LL&{7~qg])'2f7 FHU"j!3{ob&#*?x8`!cڏO~JIݎ-F0(\ DRADB! D{Tfl-Ҋ+wNM&3?Qb|5q{>(u*V {.Y}D4O\qa(0a"kP- "0> r FËF(#PRON0PVV&K<-́g&](!3k@ivB5h|?CgZ!-#HCz#jTwClVܭ#]n &5VBX<C1Mx0hТQ޽pNs{ivQlr>La=\$b\[ۍ:/&])~}͌c*V* [-3'Ν,4~8ϟOAqN' 3R5pC?2" 5f x8Q8L@Fi4T'@|&}X[qUEGIWfTxR$U ֌ ^>uL»l> z`@$go,yJ$휙{̕~-f?QL.WKHНJkJm1+5g ^w!?cO|iCYkP{T&}JE )SӥddD!& ؼjVF<ܸ'e ŌeZc" JP „po$IT$Agx|Y% WoϚ굿>?ĊS>,O}B@  7'.^UkM%^IGMQ_jb&E"[ 8JWYdW,T $AꝞp~ИƖi4 Diʹ~k+IdUw0DbQQ+۲HI~*ȡ2Z;duc <8ɩґPpUF]P2s5R3st VC`^`)VNc?+@; "'嗞͏.Yo4wVʑSNosgie}y'.KBRAij z ) -AVq:a,b;97U8TFDD- JH!ұYSߖ 0a!" M؏O/WX@F12*K XwBJzI.}@gf$[&!hűbBa%ĵ-i) ZH TΕa5P'w~G0f$JG` !5f;w/}p}ic[)ǵwbAHVyj,g&T*c46%-+ߌzvA{kc}OT`FF1$,5c'Љ44ccSqc٪jV26v$a 茹֡Qp0)y !듇]aI4k-,v DF\ NS7&I@||S*(&}ȉ΁ߖ5_$:H$$wW@۶G6V<OoǬ͖ ;Ll`E\ͩY)qB۞APcj}@SyUH`?gW# )Hpka6[ytbiNxSF{elFWso߅ %} <;ĺT"BRˋM^җw@),)X *f=$hgo :)>1"ږ9S= @WV$4HBm4V`\ЭF fYd{ybm2A`ɿeen#='T0}D F1)!198w?rx;+ (wbz|^[#Z3K"w٘oƃc_˛;;^ c{H!IF {o5c8Uщ N xDˡ*]Ý d'AVgA.fHjܲ(h#N)+፝f)1ARZtgkydbv}& 2B+Ff&f@z/ ÕPu93F֚j"IBf~}{ &k(Bם߫}+V}ˌH"OhNpu%-#㖏=V|e},MјLB{g*۝@1kWoU"D$O@6 %AdRxH`歷.A3 ȍY~W]C2>tV>?{~)T{PG;rS'c")l8PQh)iWuO GsENX`c;F`]r(4pu@2A( einfV )iSc 픑tcXү5snBjQss7Vŝf|< _sU΍V;60޺ Yw{>ύD:X @, ǎYr6<Դ [P )/kq BF^`{kW>|\;# ?#^4 5"T30W쉉ŀL QS"\ͺ[-:'{& F2pFw:K3NA)`ߌmƁ;(Cg;RWՙ᠛cx 7*En;-uJzRR/yV@mU>d_q̯e.ᥘ͉oοNfDFA,$2;^*yRI^ ػs_ҪCl1Qk= oBdĭM GI3~tS̜;LNū7ag yoL1<0*oL̸ո@h`y_ErB^QAǐKqA"_;Sq#&(d^wwAq"گ{Ь(Ln#[XǼ'z S=>` hƈh{^y»Rph~ܶ WҡVx6u2OPcy뛫*Nׯ)"J؉5 @af&lYYF)/2aH >gncmRUB bH{:o+Aϸ@-Әziz kWYtr3uS;u8lű  hbC\6f MWcLHJ(!&E FLY+\}`Be ZRh D"!$Umܟ -P (qvFwk;{=N5 IR ?$9Ǟ:w^:cyqBFZGv0%{b"BU5B#qmZ;_8v3qg?krhngd4&nع;m?;6@d}>YRN> ܠ=K0TIO1ʓnU>, !^f*^ϰ:J_AaOMC@Hi LF$Zkvfv-QB vJj"{{D4Z8`.!pbLo,o"L7+L|}{j d DII41A+9֪?ˈݯW|SEr ”wjƑm(cfjO ncXk :4j wTfw g7L@#`R~Ù5 @gdΚpAH }cmrIhY31(vE_uU[ +!ϟuK4\8{Om}C9eh,1J5}L:eiÃGTh=RőLQ3qJ]צ6 n "@̊v\w'JXÚWnlZ7ȠUo4u-(7_Rc7i~J'00Q!`88nuϖGHL̍m_Mد1QoXBmL \j*QDb:ҙ(6 UϚCnbT*x"!X֭߯ OO3e{Ggt}u07eBdB gX>jҰ f$~#2=62FaW#vf`V d-gO<=[/b:wkT0Bphtυ@#;)##ouCgRo{cF+߻pah}o1H:]~`6cIpH2W)fYӑQV]GЌSaJ&Ӽm;tHӐ8yfM*8;I =L6eoi+$~B_)@HU9~۾n#&#@Q׏jf: )-w_ԑ/ٯ*5{/6%@qd"AM@ʙ;fGr%2 NLR֑LX(*@Ejs1Y3!I;0Nʲr3Rwc(ք1rTdfsڤ5~kg>JC/mNܧ5ap{ ; `QDt^ٛ| 7?n1cDEc V I] &)a@Lv*2" '* D6lP N 4):׺{Q^Ț+[JJ?X#J`gɩ20uJ] x'DE!X* m]/&Bd2Dx1k )rH{Rs9in{=֣g:7J8]!Qu ;㯽{}E"YŖmzzoV#5j=Ha27X Zc|:G5ǨV*W9L Cшp4.bn)r"\x ^x[#V}W(zm*SŲ]Ɓ7X] ͺܶ ̝~7q$i4i$vƭ7 @KGCr&gAW*ZISdinBU?dLxQS gj g:I?qܴ4A顤~$ !qs'JwNeK"N{J{=h9zyO#)O)!5yi _KA~u J]O,8 1A{ Dmdε[!%6L Lv~?9?f9 m6o_yWn^ebyvp,`4Y{+ LBf=C B1'ڞ07wff{=X߾~.3~X{1 @L~v27ŠnňHņV!V3yabb!͛hb źGJw\ٻY ݙ< J!Umt>Sᙕس\^gsec.E$P VP@URHpjGyg?wx7~n83(On7 D8:>p oן2w]ۮ 4J²Y\XR=5#ԍ5d@)ko#5n[}sBFV'oeg W|5vXX#Pe& l6#tWId ڍ~6d&Ε/,HVKU'!$ZG?7U"RݖA<9]CӫG j6=ک!_x \C[8Lo6czOˬX%&i$iݍ5MRѬn}JIPq P/NgX0 !gyJg=llqYT25礊JBf;7ڳvbx斝b7J_h~cF?O!M{<1i8Ԭ{@pOjrJd儓0@Gqka`r-Y3Hey% $aC&c3F,14l f:Ihn".~7\~G/S*&'po{BϞ̐/ukfIQ0q bqFdβ,+gYK sSBn=by!hB ;qz:N_u۪߼ cU>3~_x[ב! 2qLZ{E7mw¸R;vjXʡj&g#pľt0 N[exNGNK?Rj@$_:нSp?DUSTʴZkz#Gk4%>3yO==\XiNz8$@ jep(9-0HΔ|V1#3jDM5![މ!Pܩ-``Ƨ¦'72oޝ-Z%a@H6-LN>^+$yd7G}ꃟDG5qMW DDCx"&\qAl9Վ"=dcG F%kg-AQi#- E}u؀iLCT|,l(v|4jpc4d*k6lqB0fÞD) !H;}ꉏ\o-Eȶc)掅Kw vǙYHؚGAV)!8'R' bfjoofWKAkQ1u9:[ck X4Ц='Z "dÉ"Ac LDېoz%{Kw!ɟc :N@0N}\q(@ exe)>5skǮ9Va.+4L2g^yu`mSH)=O?[Q0TϤdА#7Gra {~PJfHc؟7Q (Y%Q3Z+mSܫ204ܹ;7LhSr Lhxx0!SOp<&YY|-9qAC/i4ͺo7[ՌﮮYM@}04MrS3'ʻ?~J PFcDxͶD2A&DQ&gNк?5\wn[8-5Gc7;VJ0V@v^`@>ɟB 4@+ġ4/㠱sfC8'*6tonw 6O\4ŝtμ@R>6S̶8cۛ-WN+]E8uHD´t4Y45"kJdMgSO?ɒ>I2O^z58WEN?~ds9`hף qKC_ .Y˃] UiꂦwVEYD ֮n[e- a@7Lk$.V:%w5k[20Pq5RP=Ƌ!(1SuW5kޛV#iNRS@DuE Lxa˗c#0'&"Be;4) =*ƅ%U#YP1!XnK܉{;g3 Sǀ y$ F8H!sTp2x˺]:iyo g&$ (Ƶm.Cu;; - A&IaT=ċ?-?L"8VJ p玟}LL.dhg t93O?3U*nt S L\hZig^77$q&q1I#H~D4 JcSl#ͽ֥6hkNl+&8,ɉfN\|YEJU'B*/F%GH+57i[[~ʫ5Saqo0SHA1$,§]퍃|Le ,$JO'[y͜{o*/I'e6B'\ ^oq!cIALEEmň20ſfR,GاU,Zo¹"# kѶ,#I nY`d$p^( ZmΊLQ|a5CǑy>&r#pzw4+#<ވi<4_2;VLQ8f$)4/F8= 82'F2ډq[Z550zG) \[` {RdYrZ̨w]?mnij٘f$"t$;\%]Z1qE"Gx4 !Ux٫U>??tbyc/&-7@)偍`B:οqkn|B3Sa*,?|S| 20[wnܸUym酝.dʓ,9ɯt:K^*vag:&R [JA@(E 0vvPת(QeRc;HT4ϖ׋L̂uى"HNdr2{7*L~Özb˳3h( Hb kӓ"N`#֣\{gꛍ;}A $@/}[O&ێ?ywff wrDU%tY8k.3hdzyjÂU8ֵ=nXΩWCڔFW`tha`5pb<~q2YJ/( G1 Jʵv ϩo@s9!j3 a;!Io2*g9t$x$Bt:f]> u}8<{p[mCWYF{qlzKNޱ˓5E-˦1px+wP"RH`Y8sO?η~vu3L)XGlT{ _|ꄫ vxR+Aqkmek?o{?;Ku"$LLJ'-^$?aX:yX9#|m"/%8jEvCsl^edd,L>hDb@idxIn0KX4vʋ0ݥى-kdAvLm{.B 5ikg]fB`JK~Ϩt3>{w S>YI>$ 2`։) -=qvoo+\=YrNbP*E( R: ӑ1bqD #ι:z\;iBʅ `&"iq5XK*քɳ5m 5[r=&S oDq{>}~=LF?Y)RʗTҒ8&Ad_o/Fl-/V#HYSGv(UnBdV;k B\RfBfG2"Y˸&7֭f)aMz4V#2A bqױ Ƞoj oau݀b1_hLjXL`Ԅ;XR0sUwBcB4A,m=ۉekZZ0~aXpP`bؼ.x+3kU> V 8n7hN8".̱|ԯ^2Id7Q !I/eKw/,]E DaGZL:қ=@"yVե/pNLDG ʬ*ocV73'}H4eb6 B৾ƛo6\af@oYPE<|! Rfߑ˄mo1,\$u剞s53=wgBJ$ÿ[ɤG"S 4gNeBb3TZc~0rzbO$2Irr:[@`(TiZsPFt[ϴjc,IO(@V᷌H'pے>xLWo4 =e Q^wqza2>{}; GQq8h0r)҉|GS`#}S`6C@< ~<ľGT]O~[l4q4' "ߋ2#&23=ȧob>Pv*[Җtؼ(ÚНΎ#8WL&>lVġs0-L+V)B>$zˇ熼B #R*^FWf:l!dR,&_5s0Z!6h+U?( s;>5ۺ\ m#ʓ 'Db,P|0ݐ@?SzMdﮮ=n;+Ӈ14G]0)T>LSؙ8 o|k] Oi-? _[?(-Sx"fw x7}W`؄K<(`e{:j&#{^ 'ED2?mҫϟ,!(4 pچ!b dYw]%1G29at1ejHxm\ 3&uH$)M;^L$RQ,І٦. ' VyNzd͋$ff:>\?YH<xփXtp$ܥ!Rɨ02y<L8Xba1`Dsc8C$KfJavHqYOW,"2:9}?UX2rMş"!k(hao ?^XTvfW[hI'7ePF ]` mb@R1L",sYdX;tp-:Ξ P q {T!>go'[j) /&s 3pKANe;iV#4uC3w.۷0`c/H*C$!!)&ho$߷2fG&7_H{jmbJtΘIfE@FCJ̜Qv\=-;5+';^/]i3: 20 LhDʿ[k̙CQ_I#/e]f'q4vO"^bbAR _{5'، SF^OOiF'4R^qBCm1kQ[Hď\0,Z(B5Ga3pZ$.q g PF|Fj,0j{ψ51p,SE]Twͽlh @{o|2N0 >B"T @t~23 WCM |qhn+c=tT$z8s2/e@a6mW~*Xl1BgE,(3N 1d`v|]HM'qffH%% !".cέ:Ӣ(PŮWzyHЉ: {7oc/2$ArR X #6NQnJZvHݽFP00F2bڜJC",SL<2־b*M6ךWk zQ',Ir@kdʕ\>X:eMx)ʧj|+q~O*=@ uTcf:5'o *X«q%}sVjpCxUZs !TwIXSe"ԟЎݓn`:x)̾'H偙"l1zivTєZuXཝyeo:~(g;abއ%x6AsHgCF451 9:*ضh8=o010 {oj@I63."FDd ((ۇw*4r lg ҭ>ۯ0ppgG8lC!7N[6xg|9_{=pڗټjD.is'C u+ ̜>d/7l{h 1ʿ @F/d_%ѨbjDl=[MLr'^{(?3J}u|5 ?;ű2! Q AbﻘI:v+TAd ;A0Lg5YB< ʋn}Oo uOey1k(IC!wКBo&ZΉ"ܻ ֿbW~ϭ ]($ S2[JА҈ePw*kihC8!9k&`ٷA)dp R6e]o R}}Q!ťO"X9Dj:bc:ngR|a9NOM5>9)/LzfB'aBuُ.6q|\.2+a Hјl `f`+K:`Ӏl ggdzl0UBD(`iw@J<1 $!l5bfZt]/&7O'ߙK^_/$bIȑoC*DgGQ^ '蜴2/ޯ-Hov=~zo!j|KLg1$ƭ=s7 0{>v־r)̓`CEփ\*;#"+׋r2t%^o2I`={t#F !r7'#dCεhnySV6` iQIGR&WkN]=w~}6ך3TtfAJi>SH" 0Jf42EaidyT6JsѾ0L2ǒoPJ+S7[}0+'zG `vM5#B!#ƕZ!}!7l{] M HǓ[  ARbj0H )up<4Dɀ?Nm6:8K¡ H'n4]h'*vU2v`aFҧo̎͟ۀxdnMR4Z-Mxr?Jf!aÏ*L$NYtƒg{ rl(FJɛs 0!w;CTy.zIh.V$6} D! +:]:@V$ -> FRZ[isŻ{͢0NԷ4~L>^B b)$#\%0&:䂍6ڍ[.4lf;F|Aa``?xk'jlxjQӧӀ@x璏t;z xK`VԪh:xFԆDIU[f*;{Z)A3)I' 碗ǖp+K++'|m a{s)߷XHx>KE'dCVWN_+c Y3Rnx+Y"w&NGkVYmNFͽ])ZogrUeX^- DfyvW:ڕtyV4 Ay~j 5ׯ6~7_H !0cG{A< aTjЏC<"G|ɓL+mBͫefob3Div2ݙ|x2~"߷fRZ3Wk_`K8ΚU,]Ov!_OpGQo.HPq@ !lGH3tVjz:gP[|%)mqOb k L$L-RɀH<7@)F?f"<+N6kAӽs&>oΜ[n>>D ϱQ ӐGj3Ǚ'o>Bz2S}'w; ˙ {<^{lFb}$rt#MH(dX$;]k1nY1F_g/})LD>|r *B{l'&軷\@ s"wg#ed?E2rgo3>)rD6PIA 81a~m2@VWQ4#(6{LCD*i"h۳}$_Yk@kv.[0cpn`2ʑcIJ)6E #AeFܛWꛎ1$/~н&%{[7s?Z2Yf٧+_ZS_u0]1'!,a؂j3R[lZp9X1i C~%"[}Rb+"/ػފHT읕X*ݫ9~rzYóL~S9؝^/D~gv-Ty B95cc XFp9<IȘ#TRJK֖;h.hD6DL](e$3ydE~VJ1Vig{ېj=Lv>-DszfjR?\.\ Ry]fED2=^OrKm啼:$!wp{VW?s︶h zK>T1EijنwwY&I3y•ߋ}ԡ!>A'!Ùsf d1vM9Ρf s s@׬%i-yG&{-r*f:eH/Y'޸~Q|cS0:r:+[R|"%`QhOkEfMZ;Rne˹{(i HdS#0k_HWś;zߜkstG".,Dqא$3g~+_' ؑ~1􇀉#%BE' pdej\ɭ.FE1|1?qmX!S29|3Dn}_c:ނ,Eo&{StV{䉧#kFDfIcoxӣЬa(=0Q= HΚUێ0</ (궐ID ]yԮ"C#9b̚@;]=97=N`MUvl|9n$ 7CfV_Wt] [zŽ>eVCtO]M>Wy&/_]yj-B+a,#jӎHuFsÑY0R|l,+ȇ~A:]McJ<)DNS~&nT5}()8pYiNΙ A[;7x$Uޏ^׊.G#]Q0ƊNH`d([3FX9 @Է;pl+[Qn+O >yzA'z(H+{_ ?PlG' Ub(JV@t,aYÃ۾h%Y$20yv{F%Azds~aӇ@+HSffAL~߉+NlX}-0!1F/)~,c{,.P0q2Ld܉L:tI5081tm}`}t@aju cn7wi0_U).=L.:w(l?tXk{37%gI0J}m!>!X45?>\q,oVv;> BA.9wu˟XE"g[۩:[o{\O?1v,[~8W}فѥ~?<! w$-qEkVԘN;>#Tjq&Tc<Ў;=i "z?Vs-$̞{Z*!"{`D͠BRFte48*߈sR xB2x7P}T]2Z-|ZVo…}df OҘyocDrR~3U@37!w.mI~=8;c ȈG‐zGa83󺹼8}ʓNX+>z$&ib.&b#yvrˈJ2JUPF,mhwdƉ ۶V;]"L\~.6b̅tҿ36*ջ3<Y08SX @uA F C &)Ul:,̉Þ0)q4𙑄Ddֺ,'j㩹c@[ktEJ1+>;3[Uql{k2r8#a"F(O>ʇ=@j̪W DSw}_!k:k߼L]jϥmuikqĕ #(9@ v5Dj3ezu}l0K~Cf|?Hv>-ulmme3/7lнwNS3pm H 8f"RfLtݫ7Ҋ  kv~"d 7C @u`Mȃ\:bWrKOO";==]xY!\i{ ll$kn ΀H7+$hCPx*'IM'V0RBl!P> @ ,.i7q$u$}>KFWVDDͥށ^p>]7ϐyrEjVɏG&($Goy|A/?0~ϞΝG](wZDd0$OM7fZ' ҄]?]֮1N85u=uzmx]ۏ'">&*f/؛Ox귰͹Rqv)_iP0R4@7A$ܩAz3;m.uxd)U8G,Wg2"qG-%]w=Övk6kf+ Ƴ'5_j$ B'Z~Z6 Ư?b\n0[L_Jqҫ7r>!H5C\8B0`p@)}NI7{` Z10RPq$U440cwAr˓Mːރ}+IG;'j`^# vs?ر~Q聓Cg.ԅ& ЄD@\:{B%R{As-F2e BOH@C@8dWi&ayL"g;${r I6&ҏU&q0[KM϶]3k** jtg@`79k6*< ,V*tWґKE0"[ĩ/Z ;6k> gnF|akIf41)s3>p<((jt{p&³i>"9};dJ^"Jx[a9;K"rlbm{|`0V%15Ky3)jF4Քz"[jحzͅX~Od.e=I4$ ^RC '6WI0ѻ;Lf$515 mhƠجv:Z!` |R麡ihvI{B*gk^k*Z_s/ܨRldoٜHB\VT?ڨ˱½  gtECn!(:~} dI00RW~AWxϘ=SH>Wnu~Cf1wY4J;ٮũD!+]nc!AQ31w_}xFsс6DO}'=qqw{<]#TftvWYy/PJ^H)<'d ̉)Ss53 ػV|V/8hoq|-NE.&`~)VK8~JYkLF?8l+ f{~r;i,Ngz` G5E=H+ۧUwIμYZ=Sw/BѨnT!#ZCGR(3oBX1`Y f|D` -~ISܔsٚQv%"D gbFǭeZV~/֋wzOU[H@HȀ~3:M_ث(%pp@MeɁGq ÈQ+҈fF5ВGX+I.Č^Ǵ'AR=|0L4qƛI)#_?c<]*=v֗EjU󗝧O7YA)g4iʵ >P#6p3#?y?'j& w䕻(&V{.HQJTMsvܔahb{a\h c9V0Q?=n^ݽ>K!-9"Eqoy $H^Y>=y'yAHT?is7_lbjH}oDG>|bLzxUINٵk{WÑ3 Pe(Ne"Mw6O#W[2ȏ)/^G)Dr]ьS^m'-=:Rowr*=p'kZl'Kr6jfrx7w4M17.A/JkXæ Bd@Һ[8jv\5ti`PDfm$?]T9Ey_-3|=xOŒO~,;jH\Fq pQ#iY5jɖe ]π( tDFOKPUBAO3LVwK٥8J'eD ,qdKݻ-?5f #yNcmQ FۚԄ9@ *0cŲ4nTjk;fGpjgz~MF9\WϏUG`kvNUup-zuJ+]a 6ؕ`OG=yCfTgr@Nuk6@0J|׾85Μ5ȀUwR27&݆f=N脵QȌFn!j =[kAD#7Ė?}MW~©]֙S_͹{_8Ǐ=n"C?x}f3r^vъ!0#4̏GfR#.P]Z\ZD3'OE0ZpqDu>1a%^<rHrd meDj|!2 ӶaN.j՞ϵ fbBh\)ψN3*C9+3}RV{Z3h}4[ֈR)bŅI[ vx>Ϗ Nn^zO)&{~߽uLqm]IVg6&!YPUpX[?ɛ ?哇[d@BI/fY{;]X7zRHDBJA?s~@˥/umY>?xϻMd1֞[*wZJH\8l@w$JEbEË,ׄ,܀>NwcR__#}ns2]Q?!Q߷}!OboXxƵV䭞 d Q2`1[ `pύ2WL)YfP"3"uΫ 6>f@ٍ\P^7&P$fs_yfK<аqsdƳ/-C'{go]P5$fP2!Q~!zr|)b%d(I|߃6)ƶ ARR(-3ZT9esjƏ}>%yКP9u{?6zWW1 BDHgp,prDSj`>:`f!5 XXt+Ƿg(Ye*rHSUT(32?5v_LnOeqa{+,yRX2w u%D~*GETuFnz*ulbrCAGEh~a(R!F&Ep-.X3o7Oz̴XkonP*f4d,(!!~[Q^mcF**rW?}\UlBbЭNy1 .8g5>SԴ'\Ə|V+OxrB.+P5J5/]|c}K3C~ 1Sl@| }Х$c&)RA+E<P"ay؍Hit3B ۯ좌)Nr{n>-aiQcӬXIߖBzpo$>p=m!^fsN.cZ79ob(!tDUH$&rs{ "Ba\AZk(("s %|&b3mH@Y|~%WJ) HNߩխhTAHp" h,Y=/[/(>[O#R8}s>M~>^}4F;:۬5sWw}|o?7;}-梛Si\ 06|f󬼨t\LG> H߻g^(nLhbԮ ݘ/; F}yS7%E?KK7L }#)GXl``Av`Zg (ňJJT@f°c VR#Q^=JR c hN#Jm<:m;qr XvmQn  {+nKMDH@Lkq7*:! )-3~?|{Zi=_~ΠAǡmJΊGX`>S?t g @g2:7p.ENz͠^H+wvvi>֫4[6IquaY _G#8Y,$KScAvF.xq}k.<b@ Y|^" + BԾ}ݫR޵{Vɓp|"‹޼pmm0\7Y@qψ +(/|y3 x% n ?I JajA 0lψ;T2ҫ @$ )%XF`*D Yq쭛4=ӅO+W}kIh,N;K># cgmFHZ:'^}5{wlϗh7=G y"!#DUi#x`]u8[=fa6R4g57|d}]x` R"+Ю Rp|ЫfsNz.xKݹF.4ð㠠!@}&?`uߵ f TH i^SۛϨ?W7o4qƮXpk]{Y fv|hM7R،Br\Pd鼅Xf) :siw6WW64*}!/}~_) ˜ 8sS&'\ZJ[Ol$P: Ha=a͉v=_ظFox\K?C89x́mNPwLr2LǍB { ",gg 9i;ݻ5+{EiN}p\aRc%@~KkOJ`oܼ\zqkW(f5򂎤GX|#J%bQ8""H$ep>p`",hkӓ ]Fg7g7 8e% |b`xΣPWi _IZĹ.!onj2džvf`HfĚielh")"9p]D:p(M-hwmҠD"?tIY|~42 @v{X;Zq(^nJis򂳷kLeiW`os6P*>C קYyNU%DD4%^_ΖG9wef' @0,{gO/PS//7FuWMNE!0m}V El/&)@$dQ\Hiӽ;A3hoL,ʎ?[o6Z#3*m+=A׮1N"Z6PDZT!-p"-Žw, 029vq.Ki?Fw'g%[d2q!l'V$Uo+dn~XsOLT:gU6uXM<*y:JEHӢI4w {q{Ͳ'_ئO}/iͬ 5#`C RtiDRJe T/mҠ(u _tRP+dXiw6`ʥXJt\ 7z[T~^{;O:lG3{HVa"?~>sl*t`B@)1 J"1 ~p85E/s?z6 TӉʼn #K+>\[L }pYkxA' ]Ed%OxUWI.?L]>="TڵNn D˜:>ϝzsb]<ƒ/^{|b{~FDޮPYTS|Wf7o'51ǻx;qCf}9,h 5DPCKQMPRjd hT^3Am,K5JH rۻ`Dlk#*Yd1/WZ#,ۗwo$3E@+Ј}d˫_.{v:mw#~lnbPtE?Qϖ'@ohxLp{[dYږ+Ok6<3 +ތ; $FZWKt

Be~͵U`m p ĩkV%Sk'f&H\(&hOu~2k +C{e*;hAh*]-Mv9M$?Ħp,!E";3YfΦ"Ĉ̺`xy7|t34P a̹ƒ L"YS8T >0 #PGfYq,=0؋^ۍڙa13;^NZٻpH\ONB͛U/6ki!HHaĵ_z[v-~#|+焬v/do+uXb>+ OJ)n'jY1"'L /`,}0#gN ޲N|:^}W yf3s'MH;q-E2u\C .(Fd@' (x#Ʉj9=QܠZhŎUg:|ncjU#st=M^k ෪n>kt-On2V)t*Ƴ~U&y"iK@j0Ja@"璍KWGֱ's.Ě\t!ȁy4 ]$fo L4(l#vZ @>"qf_# }@d7`H+;u110iFX)T>Z!E&#@o}zᠦG_t<x402:Nw+ϗSk%B!+ a>>i AҊ' X۳Ze$0VB:U{Ď*MCAҐuqI#aIPӌsJ)$!5AK_)(XL,]>ǧ[t6G+\¸H (%g1yɧ[M a"8+ڗ?GO/,y!|fZ{0-J]1 |ŌɩX!M ho^B x }\-A"y.z58FpZY3i'*vu[eNU]eFgvٻ]r2dJ VH0e#9t0 "y~|i/ G-x;cx9<ӥ֩3,{Y Z10bRsfMTJf+ΜR 'P,8f}IsI[%:᝙y_Vh_ x(f#(;k`uNXcD,%0 4Q.# W4JiɆ qD@VG"bKK*Nٙ*¹3#"L~sX3~Ucmk(I(zomƠ4kiNQ T<H[ HVS䃆]*)|hFtW6Ef@FR$|[)`gJ}%$(!%ff(jxzF"guopaS;ۗfkBeĒMtkIDWSw߹3NiHQdwZy>?]^'& \Z}yC婕5#+æ ("X& USk( P ~bIT8vfjQzךּ'o jXM0xb{JbPdC3{N5+ 3Đ$Dtc >!je/nd~VC{a}ݝ[C>ԼՖ4(|MI ^HC,I2VQ7w43i<"hb7^' ԝ8w*ǎZ.?}0i~Bb/@a4>VvzKGbHHX2 ﳯU&"DAf$Ú7KĬs窡KKEyXJP9|(G{>G۳>{K?{>P>G V3: :i$ AiDsY ye)"q#r}Dr  6j5;τja@_qIx5?EVæ @4+뗏 *zbagtO[퍳(޾R =d'R{<#ZDjDU6^wr_ (g |8^kȘSZE4p;u h:+O%?&(̹ͥ||HxxȨOZkZט32mRJ3LiyAz!  *pYpLJ 1ȹWzSZp@"B@boy|iE)'o~1(q;_W ^p0$GG[p£>ü $ffba 5Dm;4%Eى x`C1>sBK) !bU(uJTT?.[`0׷-SČx/uʩbGnO}0Pn'2vG5<$Nl\=_llrJ\hLqMu!Jw)JM,9~n{u|J3?C@4K@ J=n˾~QSfYdXSu58/>d-"hb#ə7;I)D`J#aZ0hwLzD0$& j^1'nϧL i$ vw%D!(,f}vt1#omozﻠh7=a $ODC7@ TGс92|H&z{!4GDq(w$#>SY;9uf=@窡 k$q1 ! ?N=`,n/՛>xyw_xwQ;r0Щ."VOböH#DpږF2@ z>(+] bM39=?Y^M HVSAy Qd 2]z%V| #/g*g{ݛn*d{oҴb ݯ\:+!O %Tw}ً ("gf>>3?{ `4pEbZtigzf,bK},'S%lRK)}J+I@ޖ~g)/v)ʏaqrwB'zqĕ/n ]a8=_h]"$wHL>p|p}t"T.2p D^ UDƬ6$aeO+ɺz&@ך+dT1`DH({nd G-dP%@ M^]X $4 VʽQF)y@;_r/k0'"H x!z8L=b4-(: n@g]DfH`Ed'.d~rDhy(]hJk*fmz}QXi#M*44>8xNOm^'$&9ȠwzTX 0S!#101 t3sz@mdɂm#,ﰔ}4jy$ňZK ݺN~k#IE+?@!KoYWaʾ;x&ٚL%.(7?^S LJHL˿;j>ykie;-_ $$J^__`#,CllV}t ke*S~ڶSf96˖Ꝗ kV3'Q]K^o 6I[Η*Y>0iZbc ӫ6Ctbdɭ}*)rVqLRo.P$rpOD$#EEgUbgP]TAYfyk oF:+B^ u]'Gi$!k [QKyD@$ ԠX/UE,SSr <-TQ밑aE@0866ͣ*4v`o(-?`T`tkA%$oIn2cpfpǻh|mQ/l1(KH_3N8FOljb![;ݼ|]üfd/3Fo&1;{OFjJs k y+OLfq]_iFc"$^WK"eO C f6s%%cm-|,>O\W$QDT袞45VA }.DgoxmEؿ9+R^jJ%p;?=@@BTW޿rޮx@"Ͽn8Ⱦ;ptm`^T/'%VQdb h{2F(\<$=f=m (7P`bL³I I$s_ FEdY\x8ZծEtO4SXCsJD "S:OΔ)uK m ;H$Y(/TA]$QO+O`24+"ɏݯNDq]SPnZVD٥ !H qn}sg3ok֣l'}y\epȨ0XuQW& %"@Dd@𥐺9P53#i$!+^2FpgnYgm 'vV VJE:R/η15Y' y _P}$}-ݞ$nG#|u<1sx #7uA}w3*\Q1lc (8bȞ{>$Uww)D=7XW 5:SG>(T" "}ٯuW/G'/f=/V6ZHD"is3G}fřF b>Í1"|ʅN9~}4b{xuC$f'SO11ɊWSh&bjj3pl[ Ydv5m55x & ,N 6鳋E c|[@z/-g$B3lWV&͕%2/NP<>d:57D>I*f*y;` dZ1 Alzpp\.1h:!FJ"J8f=ϣADBDgFI+ X~)5h<{7|jU/FPt<F0߉'1#! @m[y ̚_d0a/XIRL`~X:F52՟iJ5_\9%"9Pُ̉Jml}aa V8 ;R<Ɛ|4T9241T,[3ݮFhƭ6l5)@`ĂI'SWig{faՁAσ<<%->DPVe:}{l= [P# j]iTWOW?_j5׏Mw1 ݹS۝Km7pûw6zxuD//fG6 v4cqlt?o?!eXKңv|*yJ؜(& Ib4mW"iY"%#D:)M恱d` JERQ(Rj  42co!7ZaK!V1Ј7 J^4 ҖN'I4\R0v>@ 6>/6#GCCFgaˬ}2/ Cb!S@d0z}Fyo:P“H I+L2wM7X>_bFaY{5F]3Y!0~[Gn}v~KT';kFBB")-)ǾmF#_?'C U gМ]`䇯ܯvtDt,ݩԼ31 D{7 ,yzH$+{7 Yf'=O։c2C'S`/~4%ƙXBHIkEpC(#i|-¦Dԉ[w1$2o󦱬'?}5(eLd.˧2{dX'S9±$bmCFf ^K92@hxokdcd!Idrf{h嗏<$[|f͔+-.e?Ypryx,#xXzM*ywn{mQ $.C89G{ ` `YN|u ^$lBk5ah6 ]BN tg׮(-ꚤ`gFa*,kvg7JcZ)F+6c6ژZpA5WUݺثգ3pw f9zwX@ C,r^-me'|kF PѤa$b+v{.2K&NvKIF4x%/n@)Gd{?gxlݶ.=梕6* NOj "klvL_؅ _dZE5?&Ҽ8TD \Uzw V,/> f*QVl w%𦉌@s+ѨNWDhϪ [/<$B:2, 1rȬND"~ruOonΜεoe6|z)M@x 0GxZʀ$L,i٬Ȏ.[,71&~-z40ѭVQ=?zg"@sl`rmrS=~'m f*h:%a0W~%ՃCl :6M=exm 3=l rֶKIƶSy;VuIɶv}СJ3 xOҲǧxPk5ȏ6tEp,mHZVspuLtm'ULN/-9rG=v}lz<<47TwdhbwKYipަ.L֦B@H߽?t+dehwSKw4h#3<i.povP0su~:xieVjB`VxfIȀh$⯮FVqzIo{ٽƢ=o-Ve.{Y,(̭N7xded2͓=ܩ ÍFZGfȗJ0,K%!ϥ[]+QeqEKRHړ1Gkg gv1ä7?Y|)@4# 'Ƒ8A&LlT!Br9?%Ob-(~({-BeSjDŽ6`XpXN̔`жR,`@q<u$hp"3m][(%@R r/ zU8E$o.^_^9s=L=l&hi;ˋ_lMx{aot&PMG8&`f$'eN3jS a,7q݈@y; #x JҀs͠ Bf$1h4J)_L  5Spq5{Ml'_4EG{fc9-| Kkܽ}, @`GM0N=ۀ#FdQ%>IS_^L~>h3"+g]}ݜ-cv>Me@%'UY .hĨ(wlsO &u]2>tףmHIGxKFsO=oWFi LE &-|;0ZȬCLr3g-za;$Z޼zR/K 0hu4so,}p $|s]%fF "M-u` 2 w҇8OBm獏F.Jz[1W?*_N{1p}:A霉 ׾ Q[,g88 81 K 6Jj[; Te4IhȜII# i*90 d!yF :u޿fϪo';+oLaU_Wyg3?~ZN\*v%py^)1д@Fn,bB!fP820J[z(VlM3q-h9}|Jy@|>I9R kHE*R #\";[)"  si` ~HDk-7`@]{w7; ̢$dR`mFьloKxmȹfIL#"gP 9JG(6 C p 7/佯t}W|N6i2,PGzHc kȆuw+iz=tMx>;\za| X<YE~f/춆xND2;?S@p 8O$KOkyu0c Pi,f7 ` A w,- ^i~æc[e \I=^)#ЫLV52s8IK^n((H3p? 9C'{,{lW/2 eɜkE^?lJeP53 AU?7]#LqӸо2%L`L{,MbomF(c VRڹg71[[8~.ff\{AKĥ L2va\b6Fyέ~p=›90P6mM@I;J":B`K ­] `e~D Uh` #7tH> Ĕu,) rP^]Ld~7~pD_zaàSJ%kz\1ܻ'Qtw'Gv,c )zx[.7~y9O,ixm(}/WII @|#OɇdB a~6\d`Q4m)! 1QaRn B #P/"Ot^:L-f&11dQu=Z s0u:_P 6J;a. ԉckS8N3 $;oIhRQ<+-'ަ\__*:vH,ÌKu]i ؛ LI:@1&ַ6wͶR]cT_nv7>y,?L6/s3^}_t:g9/}䣿YYGh'frj kkQVp,OiruwSdD{uy82x7XH Ym"Q$woh\?8PX:7rʣbmg:ІIWq+ "Lj-w #vhmff+:&>?լ](f%f3 fsR2]iiI@DhOg!OA.1Bjn2J 2*e!37|~GOK>7BͻԦ^?S(BИ~@ oyk?0px;G\g9FHn۟v:'G+s{1!:B0kɔAB"2d&ӊAkN."^:l`p3RN|y)l>{fM%Dzy'[AN!W32-Gە~ΔJ8Gf/@Ƨ;| 6.|>b|w6+1=qeţU쬈FʖLJ`PဈH{A!|JKNwMGDDQBe4?c6FV_;H@mYH%gqBE ^ ݰV;ךSѾeO|&A^mKB,Q'<_x/3PPkFIȂGVM#aapVgeM쳏1;ǹO8K[VDs W2 k{MD*B*\IӃ'77f:TT}LmJ8ĵ%d@R''<U{m-Uؙsot#2NfT%Ɗ/C Q@W갡BfiHBU(_n#^St&_Hq={ _-U[f탿̿_p,l'=6<A;фU$?9ŏfO|'ɞ2._ AzՐcOG=&x±L`(`$EN (Іcf|<Cneebcd6̝v1U9 F!2G>f`mvGe&V57LRsB3B4$ѧ_96귏 \̋ݰrc˵D( WpiJV;M7[|0JO%;7v6X2&:{%fF& `]Vm7[gA 0 ޺`ologo<pUn6kJ8IՓN/ߞΦF=G?ק_v7>phD8^/6̆js azJt ZWDv6`t~3d[(eLdI:֛{P0\kDIdm8[B3=Q[!ᩝA- ϶+lnaxXǑOPIgF?=%%HSvluvǿqx/. %ڵϽxa^4);j](-젮X֛x}Ѷ$۝~]bT;:็X  7>nGA8BIaBf+6Lz(`v]l76&; mBҀ6~5(sU>-E$kœ[3COW6 ēm.@Th:a @Ȁ"S,3^w %vĔ/֚ge2sh\yhgv=<ZT2ټD }שE>췛5Km)EmgMpSG~{kG.oȮ^|`g6SSۡ(qrm(( 0KY~f&Q( -7' afHB5Ȣɺ(]GT8?o 33PHwvR.lFƠgN 1EpZH0jbPksoثyNa"kCښKeՕ3O,'Dڎ=?0z_iᦳ>LbWPk=P*W -˝? Q\0D~ 3$wL.u[9}o:\d`dxȼI+Z̋ζt5]kvw%U0)"c߫6 ];Md BN@i6&F rdf;fFQ 2wyvp{.[G>:#GЯq-b,fH5?22(bOBX ǃȘDr(k<8bayY?C`6lԳS[9bFïO P>V.ޭ֣3@D=Z0C3hr,Yv*mF&z) BF'zBA¤F}+Z鴳Ex0-nǶQjOVlo=#2u$" DR~9}*3ki`'HǯV4eNߪ5z|C>ѧoӗ_}ٜt!@= Nfd JV{u o,g#i<joAC?~ d~g6~O=Doh}M9 j&07檻l~:@ t'rzfL;q|aݰ,CЂH*zw 3y%]g is3 ,r R9 $q3mw{niRݪ ]9[2|5A2^읮"%c8Z࡞w0 xKbP<\50g 8ܜ̂ Nbb6b\!v])_!Qv;-5T)p@)/0ĭcyY/F褔ck鹳"4fetdP ]snO5e9T& [R*3 쯈l,) o3bʊBEVƐ2$HH<^6U %9 e09E:夐L} O%EɃW7Τ*$=6I W$%j ީIXΖ>OJw.=1uq`n</s)"cIHxEԖYnuw6#r;sQpi S _*1.^j(CPxf>,w6G0m]K'C*PF1ĺTnl [82(@xC*֥yuq}v"WrQSxmMkl7lqv$mW?QVc)q ǜ| 3(ޖs^fS兝BzmG!Xq@hX,OUwݪwN"7$S' ~k0+7;MrHBP0# qNBFbFC Gيeޒ w:~hlLez;hD+LYBڈ3ȚvF$XE rӵ!"8)uǀ1{;Ec4TPˀԻqV/\{rfj "Ke%퀤a4 C6,W"]v#MLcu\N 4DDB}~ѝ;/Q+٭M1luMcT?>iPGFKW~u\᯾ҡs_~E!aFI$"#ã I` 䧃Λ|!X\ kʹg" D ˭o?\ }\riys] {:2q(iY,rY)7,:r1樲k`$FDt+S<5G/>Vhe+Ygb8"DxgjԸ)J۝4~8^VgˑA~:h/##1H$h/;>mH1сc鵐lw5h=ڿձl5WAUmna 7Ǐ0jH_4' 0ixq? aÎa f"(,g @VO++ED"N[ '%JZyn>Q̈+=AŒ̀">Z.f7:֎lgI`ǞΔw ?Qd _|t5od_l\kem]XJ;^khKѓℝ)Q bgkSZ96/{kL7zߞ g#-nrEE"n?xgk=LϿֆŐ DH|Zg }FGELqeYiiGj"-$FyQV?<]3'ѧoU~ڻNa:+Of0"b7D}}1'Dʣ˲>di}-PqNele 3=_b]uBb6q.x#^;d2Pv$#..uy@hŚ`9{^?&0*[ώϘ{֞AK;^v %8%Ag=lG$ G7DFXeɓw~W/cyxawvH󿂳+5HG{|68Z6ӛC@ ` >" ~0$!@@~Hfr_pCmK)260~X6*E(36JJJ;VjB" mDJ3c/Am|ޔxnI^s8H#k/Qyf N˲ǹ!Uzc|~z/  vmHW*@l &YI\jVH 35qt Gw=/t^tH"w䕍SfA$D 7'P̸S߮LY%-gO߹q7ԥK3_PDBnTqX`0,>ՓM>'&/)n8skox3e:Yi`D|`( hi'^NUv+*A1&VyQ3TwGlS :gK" d,za,3nɠʩ{LN1PDd!b?1<7i:iidjlF56.m/6Pij"IB=IP-jALʠ=2}O-q9OrOYw=!@;0!88K)c²7D Z![.:RHA@{k•E<(͎B 3өJzG?_3F7fs#E3rkZ6ٌq P+ÛߘjcTn7`,F"r Bu ;h6[)Lf ZH3'1Ҷ(ݰi}GFa:9h)kOl" s'8/}!EdI˒H|O[kkP.o,;!"md{ձHxbE~ov:"^mӸ cgG^zj* @$cn23 0zu{1 '@6D@4HeO [N;|+};% З77H ^ܝNW!!˕~\/!%k?&sZ11 ]-Sc)àLFl5dʖ[ G#lk2Hx t-c& íF79_-]XkA"MT7(6J\֨=c%=8O^RT oAF]$;1R?hyUo/D u,/fT /@497APD0zʁdrl~/ZÈ$ hے"rnmHJ> ZlЫ6F'U]oھ##d{M !gf+G>F$ƵKC4]ɊYac]4ޮ;]BӅJ$Y٢P : 8I G:sgV'h*aa@:8vH 9\M:dۘv UtHҲliV{QzOa"פt+?gmUs@tTbd/Mx$ P 70V&}(?KBͣw?0̐%"tfw}1X[̑Iɡc8@ip~΀ي须K\V'~N&Jz fU΄( pc{ ¿E vg 57{tsa.02ɰ`m2緮 ˼ѥR{Ր' Ƙd3= 2Zz ڛ>-L 3;6~σ%sL!m o%8s ?uD853*D|f沷~'<1s=wFj$ħ!`#T$#}*J2RzK4TL2DVʵsY DHC7,Imǒ%we[!m[qp OC1(C\F֝lNH)*9R\Pݻ/gA昽GǽzQro^9[uo e25ZdK،dJ33I$E1Cx= z]tz(oS2F1,'l]?t1W.!JqN^xN/\ 9mtBk"W 9C?V<}fvO )KZGBa4 {f_ٴM Pdt떏 m0x$Ft0\H:ɻha GX6a.6^_`Ql'w~ <_Owv x2(L!Jf5AD)M̩ܒ*H`jN'ĜwJB<;!v̒Q>y2z (Ul2m͠ (}:2iJ?<;R1``NLB =&0F&HX7-V0~Rȅ )lt'NHJoٳz@ς۬A>Śx0>8號:b>JT- 'c`c-fK=˶0D{\ɕǟef`/GtY d$Jqrg&9R13U;joG⧸e[ TzKY7 bH[]}27[FEMy}'F 2GK1 | e h:s~A>wB њ$W|#V@} "3DLxጲiE];wl`}7G"sKwYl$1iL@PT$Ar:\xv:~!|-Px hh?=U[_.07_{?Sc"$PED*l fqCt~ j׎}b]@Z d]9rA,^)strSA ҎqÌl$Gۖ#tz[F+#:]p-&3G!}\aPiP4(o?Of_}Z /p1tU9sy܂x`4"FȥWLVZ 'VA(|yXD13Dĉ:`(ǴDX?= UF1 ˤ3}_ 8n HŴG,?qy2L]+۝RطHt_1O `Ȭ㦿26+(5F!QElw@XߨW^%"[ J 3⩇ X~RBFRa~eJ _Xl2r8 n(b)&⏵ `81SH9f*۽~~_B __~tuzҐyOw?YhiJX,ZYo^߽Foi i3"!ݎrA/?_yJ!L+h\54@A td?AiN^44`g[?]n]vM u˧&+F6H$-u( tdLQfI-HsdBx- rbiz"kgn4ak@G: [V\Ɋ T`7u=oU?{o aTuaS7@f6(*X ^_+"pOMz16[^mӡs|j1;\#i!^;*V4sc"ى{E4ၡgw@j9S(rg2Dl7-9Ahh4J[JK!QHڙ `ĝˉTa6L|+eE{FsYS*Kqw"f)Ye& b¡3>ֆD!zk lꛩ Svi n_ȂP"!AȖkH$U?al=]L2kiЋRĿ4 Ezoo?zzY]M˟EØCqg=r*bm՟sWW˅pQ' 8]!+hPH@HL^1rYfsRf Lmro}XD/)rT1uIQo7#IᐍV^,\-&䇑 ׭7>Z{B+fuC^ݸ±,˞o&1.2:[2D. *a*ٝd' Vw|z$lc\|aFxK {<ޱXҠAzt`8j"Rmr/ɟ^^m Ծfx|JYJΖ;;[^o'v6Ng'hZgm^h? wO>ɉ[飷|4<̷ixfZJax2F|H% D,];uA;aU w大g2- pKGId d7;^ıd"Uԓ;۶W涶H$b'P|nRL8ؒ00H5N,"&+=zY6,{PWrlxf"_hd{7:,0bbHWvΛ "{mu}T J[_Hnվ3D{ oɲp~țS@=zI4{츍x@jAH$P&FPpuk.e-) l?Fc!$f2QejUXpnzX"EQ8=q ̧juY;7ݯ'>žܣtqk[8X•Ҷ?Vܨ88n?aJnp$[MEl>Q?>ԩ-mlGVt+>oOX,,ƨ D a7"0w/z<# Z觨A]~~-w\`h96nM FǗoubfZ(n1t ϼ=%Юx8oF3|IKɽO;?h(G R!ɻQ׏4#b2bm ZOW*g lАwW9D n8ڞ8{YuamMZ^j>3IdHLpf1#ZTcCO1э ɝΥ8"ʕ+mP@*Y ۱|ehɱ}_ZEu\}׶znF &\ppq{D\=Tn7\4{?ii:Ǫ,@k7>g$tٗ_8W"#)3y"> ).X .Zy~+jxa:?웗 a/2çC YF=dg] D U3wX`f7xϭ7~uc[Nư Rz粹Fw9%5ID[ "&W<6N,6zΒ,Z㥙xh#EkZO=v'fTuV L6#Nfo:bST[,Y)r*Ha˴[H V@M ͉'PCځi}[d+v4n !3Lv/dG}}l뾟 SNP2$a(ʻ,kJ9 Ҝ(qí}_sR-rh"N4ҁT]];T@+q{DҕO L;1qWT30$[ WrTu]H'^hYVỹ1D9.[G }PE:erdVV9=wfI 0Pd@D$  w:-.lkkBg.r!*!p6^*24Q8=y1adH jy߶܍n|/\dgCONUB KK Y2fskw? ]5Lꤰn]iNZ@NLNW7 $8r'b7C :HHWW0mk2 (nCK "ѫ;KDJAe5W@- Ab { >}\//x3.DL&hքtɞl^]VƠ[͐Shδ6;dYMc(Ot~ 96. F4T۱A &)@T6m# ) lPWݸ!JqqWH%i۲8=>kI]ސ6aD`BB&؞ںG S+܌;"P;^)9])0QMgV L*F1m @$aXfhΤv(qLbdͶ=g%ej=G[A{Ol_{^H4YUQ5fNbwraގj#"{/5K/?9>9t]ݫMȖQ0c 11H`ngS92 V&en_-zn'Y 4E{/w7o<"\"uLR D]3 /n̹_dadTϾϸrbeV(alLal636g6-mD%<݋SŬƽ|M(ũeFp^>#VYr4!D# >}xݝW[48{~%Iʤߟ)_BG/o=Ғjӹv[ZKxZk߿x /42}ӕt?yyfdo%Da C̶xbNBp; ca =<H"gJ.&9hG!Р ?7ݞ"1X'[XcYS޻~n@kSΫ$u:+ȯ3{Zkk]-0!)n "ק~uݡ*~P[=RRx-X!E Gr>&EDB @`i  X:2&~/^Nl =g N>rbQ*\!аVzTQJ Z]xg/ldS\ُ"73':k7~>=h!e4񤄀 kz.e4݁v 8KSQQ~|UF&/k+| 2 @G^e-oO]ZN|s6F28_nO{%7ucYJ"i"0` @TV ~VgYONX ^O$ OA& @AR@in:+uQT_qpF(҅6Sqe^?G?4RwvZ׷mߞȍi$PtӇDN<@ff&NGM3UdNxfzM]ZQ;[Y7v#י4^imBmQXs@ 4!!5~hFm`vAl 04egr;6 DC)0VkWGƷ޸73FGsU$7:1>ZϜ'vD{/6Vj^hݷ7,KBl3֠y3ohQTL.i\v^Y,jwvǦwk}:"?[rxide#2E.y{B;[w~cO>416=[߆XHl $% /h 總hG4BYK L`lNs63jVW gNC.sߝfcNqϚjI`@f h+"Ҟb~ݱhZmz կ'ɳ, 0S$yo4k,}XtւS{ܴo}FMi3%o:9N;fX Ԍx|gF¤`0d19`,d@&21Q&T!E 8$0vB+_k}a{'%HNycհ:[rz\α/>0dAMMJ޸4cWGD$maPn3#cB߀aEݭRN0cHdИ@d`ѭ dyu loI\sxgˌ/Wrn v]'ŹR>r5;f&οŷ/O8ZjZ"`"Dڅӓ I "q2H@@ !N1g~7\;[ˋuiwfobNUW@ Oν;+m4Sw-7߽ubA!mac]TlVͷ9PŵmŨ=H:v@@=^<kJCT͖'\ZGY<}֝k2 buA8bi" Xj뭸@]>r=QGZ>uɝS:O,Z"4/+͉x흞[ l Xr,+p#/n$iSC &c&LxƄ'i@0J@H1yH I޲ @NZ @ojÆ5 7R:aRYZdcNU0qWH"= 2jF CӺ҃.TNuHcL {Ro6ڊ>~ EᩲK2{H2kk}<͂YV@ b]DZd**kFnր Y+tDj[QmdXNNMzS%QV:Zar`BX S/ѩOwyΎVw7Z?TXtJ.W:z(m"(W#z͗Oς1Hw5LIokvsY~&g[钻Wgu;pSFMD*ϕ+b$uXl(pO6lV_7|{n+_놺W:e}܈Sni:6viז(l/H ePQ! Rə, 覆~ BBuŐ-c,<+T6":q!'1GW:=caF! Lrw3 ȳ8?\\R|RM9өnZwJi BzsJ9vbZivb[<'%: {yNlX.PWx5>0rV h#ِ ١aXLTPyĸv73uk!]1}KY?&bOs6u1;'{-0hI]ނwbX=rΧ/otza$ £hZ)+ߴ,)BBO_[ P(4Sp?4PLS I6@ @D $W04NNgo^[Hib(ȫNZ.=8f{Nj}i(l.FC'G@qE&o[HZ=H+9$Q,fX}]J~ݕ)qЭcHS3Qr-lbQ:'6ADx34#RVy$ vkޝ+eMJ%bwaw7c!MRa?psIXh оQIUJGl@`تCm43>eB[pkMbbg}Rvmم9\-ݮ$#H~{. @:m ^XSȐjq SEo17vںٌs붝; 7-|L~[M zw)D8ʧq(ЖB(KIZ(n5Ab+Y4=-NƬBee;ze/0ںFU"D\'?O zy4}ţ" ^og>3_~ 0dHlG3Ͼty>WHb$E4&h"eyqZ79ܬM;4"@`V^Mخ78]~ƿ^b!|z^[#O#K{Q'-AX-ۮeI;GECg":Nڪ ȔJى*"Ou<$5 n2k G.<ؚ#gsĖ7umD @ۊQz] @fp^RW,u-Rc҆]e6mcPPNkQ?9cg)82so{dncx$"9OWF8XN04~0XFšX@Ii+c5@f ˅Hp@7 lhX#61znhM]"I"G흔L۩ gȄ<`RX\9 !8h[ƒG>W\4^X0R&QuRR"; 6B!˅Ez ,ubB/ݹV#U@^gꮺ%[12J ͻo<dy{hDeΏ2?I}~88{\D2=vtIGdmmgG$cgsm !m5U+ޢvBm oɰ"mǟ 8czǧ $^k2h¨yHFn(;FI.""Xx'>S {!Hd"3rnBI"6-} ])}6 aUW~ޥbǪF w0 D0Ht>V2LWk!k$`'@Nj[/8"HZH' "D;+ boVIH8xFuD8ίm"&&$P{zncq()%#" p/X~JU#ueq;i]zPRlgs G=@Q6#]3ڂhT'֚x`|z(B@ i9`=824fD4uٲ`m9\K(o~1}~?ʗ.!r[Y.m {0h -!՛O&G^}ՋPkk+珥UhULh1"!kEV!kEN@@Zb̌($Ü( 7`n Y#}ˬ!~-/dXZib"D?ux}s9tWK/2棆RelQ \ni5sfGv }cYLM F͞%h'KX LW5Nv0bMc?Jۂ[>iٴ Qc;1h(#Kgy]/@2X)D76ϕ?F .>wz¸wUMJ6/le!Dnm;ńi/'иQ#¯ODdaHaL&p 1LJ 6ٮq=cJ])HFIB"D$\!Oi 3 U;wUI?y,#GPZfL< itt!ZsQgs{nonVwP`*ZY8UWĂI($"c4=^A1Uc`1wLD.X=mjkr(+ H ,Xϗ68_ٟPkIp_S{-f7573X}{zZ#v&zw'uu.]Uտm:=W%Νrܳ/ˆ $I@f D+6L1c]/tKҭNr&˓8jc;KKKͽ+Lɰ$o1gyՎ<>mH+b&/W2tl@J>FkL{hRٝO` 2x~QJ⬓%LIY@(]OUNƕB/"B:cl]>ykUk+Ƅ@"l sXCŀ ?a>Y]\Gœj{Tg[8lrwYޞJgMfk] ?֡0Q-(=,0 dA(1-;"0@X3cI; F;X @MC@Dp5.]*0@4,BumF3{wD<(K@bݏw\d]fC,5LarHQJIF[mtktL (ɬΗ$4ڳnOUr6*[j~[{kլ"%7j4h^M_Rwtot~h9coo-NBH ||_{`R+׾N;Rbi"L\(ƾI\3hnN.x7i4 ,b;(R]mu[7wu al@p魓k>tj4A_UaKTU׶, %1Y(7&Ebe'Ba>#dO3Ji̝>Pf%2Ȥ;xj1#:=Ӳ\UW'vϘOSw^E-\uŗS]cVg+'7~l)_|TnGY<NNu_:z-S146%&faO{{9U wQ|NC;=y$a?SÎoh.Cc(#IH (.FxhF{~8) Gs{!^[:7ҥ`bRǁ0Ĕ$O.znȈ:^xlj 哞q=3'-g6RPca<n&-KHjc!jj6)KN_X4C,^X}P0]vyTg2(DAcEkgO.cOZP̑8_q^(A~}5o=?yr`fy>5F<"Hl7?{?~Yy}v&@ѹ__'zpNB(F! (0rC״&QI1~Rq˭nzūD Ŧ-a|W..Q8qx \&bXRƩ@!8e GX2H"u8NM C= E%p0{ͧh`QS22HHSzuQ[@pQm5'\/><_YXuћ_:3` I-降OK7,}zZZݛs NɭKV}bzM\O(JIrIh2a!@fL ҀFV:r\A0ƫla糌q[T7Q3MxKrBԀ$68 I"TpeVX:so Q[E؞-Vo  4d$*{t&F=X.9c5o=);ϒBcӉP E址0#(hos&;,L2IֱrZݼ8ؘ.fܽ\w>" WGؿw//^''@?Q+kg&QwmF"+ۂtv22Xy+Vv)ֱ,ŻO}O~[պbPvXD\M a.4']Ʊs*jSM,`_~pg)Ay.$kD* TW)G1Q l4*<<Ȉ:jTӺkld=FF#f4@Ls{zk%W߼3#"CK9qfxAf"~_;laCa;|% u@d@$X!=2 x]JJ~e D`ǩ;Cj_gRϝ?u@kD_O_n>628=f>yt*7K VLh: HM*yUj?T|y;'e2W.3ht'ޔm$Q?Gڸu)- b_<Ϯڝqw<2䊢 /m7ڑk hZх!Hc1ӧOn=ff1||%\e55ZWL+b۫ F*=5\z_mU/qڄ^:~Y၏NYfܸmm@l>kyp>`B\ޛ&4}{Pj#{(z]Z6ML5/%Gc+§>kwc H~on$fߌӍ*& ,'Q ^KΚWR܏=+ ,< 0 Eb%F!,\F dF/ wՌ$e4>j嫊暇[р$# 9n%;@J?#`uf^ўɎlWd5#sC^X4϶ht ! uA#5J N+)#q 9$$TijI("k`~/">pi)1^<,¬IgődW򪧈#oZ^ ^PSnşe1]<ֈ3۝8/>M3 ^ß܊~^B2p𓏞fbˀ(0"?BYȨMs n*үH;;տ_Ho?pF&!XlDw&g:yЭiϳ[(X~Wžc3;z*#^<"I Q47u_MBAʅ'g6T Na.!^D"0u=*ӫv;fEZ4aUWƠȤa #;[+`$gay6e5w3= _}}{st8涞*Tf<2?)>f+]1o"X_% h&!R# rv9D\~0+ G5Ww{8LIr' *sPDz⩋ \X]/qڟ9g%3^*ov:VׄiG#RG=!iĀDYcϸa(bSV=A?o+cXHʕQ2:? 1)@Ictj! &>2{ /5`jTVc#ŢGT3!pI> C% D{~"+鞔pUʹq||ey (MV(" 2f .@@rmD$EVr~0]ߎ&gIE?jt=uu6<ߒ;qzoj;by9Wp!%ƁkI_UqfM0Im|[/VP $ͅi`Q;pS̘OL^uwZyV0J1w|^4Rv WFE ,;o"qozQ0zV©czt2Q'&$ҡfP\dRVġ{CnpzR2viTX eV9<)\*ޘLJD4 %Xe/0yYJFd?U;YQ2iln̿+9W"h:hgbɵ"` _@ پ8^>p( _05PGAͬғW-u8+p6*3n_rQ'uswqˈ$/SaeSkb=dr94ccy%L+z .mLn픧oN B A )j?&~/w DyP`Ak"])A~*&\e/h>dp7.Tt3!2xo`uLHDme+)^Mg ٧)dxf6zxH/ Y=km39JrDd S.Q@v\--nj /PJo3iGJD8"3s4"ǽZ-ӟ*g&N ;-D`QK]y"GRƗzg"c|f.nU x 7y}bGȧ} OV"/$y$l7+^2kX!#!@xAeDq-w`pĈ+`yb|zH3h lƊ?k&]3 ]L¹c%^L/$!R31f>S*V] cAOu[k.D=sgx=. V.XX(>lFgn[G#!l{f 0 owMU ӊxW=cFbTVtǀ|#:/mӐ C/wޢv@կ~ޙཥגE|!Jk-k;ZXrXOG1$b?ٓQ6qQ=mR$*mkV"_4?"F~p:μ7L)͉I["(р~9s+S/@$xXn 6A֡q#*h ~수HT*_g6Ӱǰ?mcƁU_3 oR6ABscd'RlF鍧},hD(yO5=;3܄@хVoDJ}4='f]2cWIKD@VSL>ZlIB/n D&tӝLuK+ٯ^!:T֩DÔ%pfvMN[U٩Τ18/ m\yǿ[4y _1QXD9B{RJ~ yP{-;o%#"o[ Frޓ;ˢl[V ώc4L :2# T~NDgE2;WΕ@ ñ$ $lPy=͝z_!P/H3Q4 /7=_ R k,$O[.^r7KN' k4/_i?cYbni94 g . B<a&4paʟA!XxuB~^]MÅ?=l:w'y͊'͙zoFffj1q 6bbkLj+xaQ-Ax/G 22sIώ rvf֭y^yS*`Dzjfd)?`K,,:=+d&X1 (M5А}m6gN`1Hl&D_H r"&4'oߦznfƃm$\49s]xvv72y'IS>'W֚=-gJs}q&bf3AWBJOmY[R[P` #L)fccvddѣ|y{OU-tq A{.F.Ltڊ\-V_?jE԰N'<0xn'MK WouA.kfu5_BdȑR>oEcĬ ]Oͨك& 2і~乫FiNXt۹8>zvx&99V=3vPA;(Gpʏ,<|G F} ]|M oE?eg'GgHRidZk >CV%QU9+u[R`Dv/CFDڟOoކQ['?W1jńxp9`-DA#ncPJgw[d""2 A2u Y:ϧO7[VB@j竑 '槽9xUMG ' ZL֦W϶Gqy烢wwxJ<~b'G]ph <̂" ǭ{|k22R@O>VD7Qlw0h7쑉pgvXZf (l0r]rxr6(͞j#H6WG⮊ ݮI@c1 j^Z,~WͷKNxc7{&f"Ð& PO 0[ JK0 "a|;'q4u79x5=R"2:ޫ`eMo)o?JLVtsM_02'/=3QLWcy`_n ZxYQbPgNj _ 9S!߅İܔQ _}OPJLJg͞+/F_e DeżDH1h_о }[.dJa`?Fd!ש\M_x{M]7;S5Ҡi9j\nF`(BHaDC)$$Bߋ&|& O 9>;cI&ңcggHNZgbvjxyNuֳHun%SZ y5DV7ۻWp!0CӪwحHp__<I smF  )qzzdFW7:"H~z9\&t"IhJ- 3h&/YiQǠ88Ɔ9 QeX@}à\nۯP{(UaQf:~Z~ ZAn =x@=+% :fw.$P`ܺ2tɋ#z%=iXۧTznjdaߘ|FirTmxhT2*NgS`W67n_+٫Yc]wEx[?~_;4|\Cpêq@4 2|jPU;Kl/ɑ]})W3+둛Xtӛ]5;h֚UגVkٛe^tx Ǎ HH(H݊O`|6V-MM's%Wv#{}XR؝~<9zKyV!gF") CH2xwƔۮ% d4&1JK =ͨ MEWa|̋<\myFyֹ&Ezv\_Ql~=1#W(?4}e,o|0!T˟|k i-X6fD)!N] ځE$&`$)\Ҫ20!u'1C8y3YmyOaϾdO7fv{i\?ԏ;k^{+P lDWMtC'S !Z3zx;s#| ?R8F=3f0VY5ꭞRWz|9T':OD0ɗ5K*`0 B;?!/hz tm?/mI@z юa, Id$G@0㿬:QA`q/Q]V8H2ȵ 5[b4*7ѷ99 Rp|v$#>8)"ēf~}"$hMտ=<#H( ˜'p=wg{ݯ?RKXgnwXP[o]<or?9C]9, 57!*``^z.=5n6w+/$&K2Z<1"'~M@ˑTgݕzx"kH= ]̈́ްqfqڷkF2/bP]Iu2A-1K#E #HeVECՈh3fVU) shtKN0 gϣG_̔'Q`H ;iH'nMv$AH(;G݈\%`rQϝpմu코x쫞[?O/F@Sɍ8[x2ݍ+R?-:KQ3BǙjq)ͻ~jzȅgu8uج/t@ Ep.m"`q U;JiFYŒ {}Ațbn_Gh'f)N7h@Hon8:5oE#yLVp+{F[bFTP.RC-% 1Ҳ"3ˏMr Π:bHbn!ƦC ~nxD,uF&R]OJi` iF"fԐDĈ萑* cJ &TDB_X雓^ FbDzOF;YWkab 1|CB}42 iNf&juHϱ{ PD@AD$??܊e͉rP.$19v&mTl$}mc5|F0Ƌܺ;GKQueϺ_h`F:i.7`fUkϭlϱ؏183a&ohX p(Y8$kmu=Tʻ6A#C]*? ,K㉜^W4` LA~;+KףR"j&fM:v ƈ:쁽d'[GOo=P1mF*ШĢm\.AalnqǯwIzC-$**̯Yn6R5 /ԍ =;!!b`'k9*;񃎞?\;%Vzb/o>|Ukho@> Fx *~aR$7H2lvIJɳdVO^aRWJm;:h[+gD|AVGn7we]S@bV#G?͚kkϷwP(F`C`@# l ~^w>x(iBH0 = @@0Oң4=)B>N*$Ȕ+_t:0}Y5Q1^s#QIRkKo[̄7}hPC^pU8M^?+ 3gpQގ6vzA=V&de/&^:_ L 08å#sEh^/%iyAANx)>~^OЌIj=] (HV٣S'9:a ʉP/ @jgzxt2CΑ,w\琰.CطoT'&w.1 P5iw8aE^'Ͼ>?9)7g~Y=W/DebL>JBIvlXye*IH XˑhW}OJڇ}}Gi{{Ǎ[W+UA(XY(/)D{Q°UÓt0="#<_sG. ":ЁBcVț铺p}4w9g##G+SebV޺ރ6i靵oge 9C#A5P*!@ HXX@r&T(6hx@18hh@&P hZ^@hBuT ,}i5ND$N7AB5q'uu 2o+f {=:%t5j;2a2lve5P_8.p1k687h '4PŠkȷƘוR.;_4}_/+rݰШ"}͈Tt?8ZBO@!;񄷡l9]"$d&a\ot<:'SQ(HfGI{)~spvkwVY4nCZt ɘ/xXfEg?MJQ/6hW?96s21:)m)52?\Y-nZvvSvlVukgm3 qw a ̰!Qϧp^H3 #1@VC h2@ ;";zѱM@ PcҪT{[VbҽIk~<&]tt;.#wk0==h8RG_zFzrviZk7#:RQhFko٧+f<]nV!%vH%>(T_Q|wD!Al{`3UIO([(kzmd|լ5 I5` ^,X`bXo̓>p@BͨMѪCm<e2[?(fӉoO֊ߎ+FŪkg nIOJiC9p8SWkAWS8@;h_ :^ֶoviɼyA2 &KU I1s5SVǣl]N껹/ڞx6=sqY;xVUn?k ^1=AÅ7Y||$9".|FFb5Ǹ^kt9nJ(M,FP?SE@WJ#X&Ό''gDz&" $C"4l`d9Zފ|z걕W u@ )Le  ]a${_Z}䦔r܏`6\ޞJ{^42HDkvA3PL —9HKn2se,OͮGȐi6h۷9~~1~tGn#i k.n^~,î8|әؿEy\&80^.π]HFtYCԐOȈKē(v\fyq~oU")xaD8;nt>[R?o_F2ry٩g󱭶 Zi&rKػ#d2 zJHg[oAE.U$swd>T?%O6kaR oWu,F~zoz$q(. i<6nx@*tIwDFQꍾ#*FոcjDܝí#7z F)0|VĄr:U2x>Dd^|2ӗn&<^&qb܎lw0B j@ %pv' ɇ{[ F(}(X$=~;O}?_;\-vu\rAf!~ ^M3 ^ɃD ɯlA+NR[=Nݩީ5NǥUSſ_*e7;Jfp+-|5䦋[Dɯk N{*v4o/2d=N;mOaZHJЫ4 kCl')pe$d "/_ҧMbY~jN0B'Wm^lVI^ WLz({Zӗ?妭Ӿ4!< ݻ ;$dܲMHNπd Ƞ67~o(*!h9QV*fR^PLZ++R*/vt_֏o_m\cӃ^̃hx ZkV(5xҨP3@ʜ agg3/3>NyPt~+"w|=ja5*WkkFbzadW"T#Ee+zUl%qЋ_,On^ߛq[d-cz@ _N1$L<, 8rHP 1@{zUG60ҋg.rH+ZGj{?V"D`!Ȼ0;;b&}>CܾMYH|Ͻ(Z<Lz-10iQ$lLǬ,>wqqy;^󓈈^G̨e+QZ zU_gcܲtIHt/US?3A|tٞZh/ZAP-GYy8+d>3jO"6>fZƲ{v}&o.{'65s;P!|ݚ1^_ "a 44+D@Q5z`uegj'w3^7-dr<o^#$D_=cҞ/7h/)C&{WnQ9\O`@&G'zZ֣f*Zju R ]1\!1>:.MBhaގMvy(Bd )n[)tLBh#*&]ʡ_Aˈtz8 |$AZ<@a x ؈^^O4ID%{n HphQx49|՚9ȬB$@f|_5wXNA ;Omg-Y>b@O" \B~׫[9H$Au⇹-qϛ& :m&(s5(Wk?zR_6_Mfꭩ\%p:uRbmb(\/EWn-H+gVxnٽjUrY2_پ}y-\< vtp>4]3BP@h$S3ф@n!]O}zci3 ܯݭ/F~s#_6lfTa]DBnI# ".VVRo[o9PC-Dd- Z6z_tLH*HC{ux=Jr\\ %FSj h¦E kKmFx%z42n,#jgӛǧk-T(5Kzlfu"@0O:LAc@0p7a|*t!W8; ZO놈JϏ(Pt&2/˅YygmD1u^4a~chQF+Fa9un=Dd' tȭSJxP8XNQ|~cߙLd#(NCx7p\r Ɔc.fHxG,xƼ)UMMjGPmoh[JSy1u=mv F♍5Pܹ򼍀n*-# "#w!#Lll4->ղDjQܓM"BUf:{};|ݽe"WJH+-HÞф+S7ilmTF^:}-OQa%:o3vv4s3A:~0}ߪs #Ϸ CH|!:n15ԑ"2jW)Hh54~.*gX]MGMxԻ2Qrg}oI `ErGk0_+"$"3{ݛݣÓkun.Zl斷k(Hйv dM ,>>\ Yoslɾ 5dq^If w@*7ډEqִ# {볣QzLfuG A!0ᦀF6m"u4Eo: \O 4;p#bd〠 TmDAv=sUGqv%y~^G C~br?-wl&T4^8j͉4֨y~bL_ȇr3HN=>}CVFoNfu 7bwNe"@2z4ǃhWOշ A8jLH{]G3短nexa$eޖ2{&٭X9v}9ƛI߬w ffgD,ƌ!,@y ^\a>Zu`ne4% ˤF% sISXWuW{'HQ,܍w:ݓEx:?7R$W:>+Lҙ} ^jlψuG =o:n>+2H^z=DNxF7^o^>cpli|bJP bG俉|%/Er87f HYYo@ `L |Myq^4R>3(4GlsW?. ϬzW#GvJoY6 ,0`-K)4eaO::ϝn4g>9 eFPPZil,itu]vs=͢?oџmECثxE[E/~f:i ̬:Eo" >ݨ',$0w  Q* 6g5:6fh*g! rSqBhc$l[?;Qz./W› G,ˮ G_vWޙ2dƗn{.A)ʎX;M卒DZiU>9w"07;׻[[{4h[]{*-6Ç3zA /6C[z !D4?P{FK!Ec4:giwl-aGZ2Vz_,ճ;Yϛg*7';qbw䤆ty:d BZ5&E$;_.?l [ ӕ3`V!Hy0_5* yDkb27gFs[MB_|Ȣ6i6%Ȉ4Rض^pF֝~e[-h.af5]4VRkN83G(]|o~%)  ䷜ō肪OǶ] zh9yQo5=,|+c' FY/H\ثh[o^jX_]Iys``#ML"zI]4;eکH3Es_7O?:M^ztgz7o/ݞ CܻcWo3ݛ6W_0l;cw"apRaS$|895`t=..Vz O/8s8bFHޑ9T*!DӱWL.e_q@ !ΚJ73uqՁ@Ж0ZPFSW|wPY2~>&B[mt' iI{֠l ߽KݘI7?:kŬt?0j/D`={&=!M+bdf~17)G$jiԙά4oWK||j?8=@ͺ sv'6q2$cXJd_t"/dǭ !VCߝt[Wl!YVb\}tUJ>xB3&=xGtG&G"ڜz$yd058'hpۗ}%}\it!M3ڿc'fI@cog}1~%HHAFNYKXbg{-_E|\cPnN+/5W~!:޽c$1y607:[fLdwڕ浉7mF v=$%Ռڹwz8pvv-ւEGM[J>O_06qq ̨%2"ɅJw}|+WL$@%Ð+ ?2+'~8\ K4^O[ܛA_"IfrjgNNEMgGd|:Oqʯ&hN?&t9 ^wnP$yOV:0BbɝwZI.Iq s^iӭg+5cf7Ss7 ^lҀY- ]Bs7\;]#ŭHlbBdlV״ d\3S_?e܆f#qWb)DguW{>DO=xnkk0wΒyKKHլZ6u{oL0{go6ǯ?v>8Fƒ"4sx}v]G_6Q]̎{תu+bt^Zdd#c5H<$ڇ I~^<5B\^U\}:JӄVG6Qnh)ř⩢,h2|ᬎ[EP*1p/";[;ō;բ_"6ZuP熃:8p1f|ؗ)Qk>[.`$GD!yp=|pm#sIBDE0XV Jцr7"ܘ[de_ kI,3!{LΊʀ 90S}yg3h~yf͈5z$ڞ:;HՊ[э5SΘ<ۙ<9$xxu.0ܭ{gET0槶=YOwSsZ6iNF2U pNI\@|,7:. eY?-z 2=k[5QiHXҁ}ŷOfRg'+9rlms~7'-aQd%%”X\[G:_4ϼxOv-W8gNz}1Gqh$) 4ln\ nmh9 ܵ#~VLH@$C8nZjR˂Y|j}b _gd7{77ݚ}=`` r455~X ʋ!2Vl^i6(RcttitUC"ɛw*CH_9>X|Bz~'ֳ .8HyX42 smThG|Ɉ$ٛJWGf?b L(hHlfUKвNtc;71ɯWV D#X Dx``PG;*n+=~QjrdnWXs z,+S P4r^{:@ŊENU˓76*ev#Tz

ZOEr.I)12O cjR$c͸ui:@ B)?4֍=NZ7wc-M6/Q|xZڙyn|Y`8YmC}OͅEnrTϼX 0F`tjXj8.#hnުW|IA"b/=a`=j|n,~iox~SL(2TBDB#&l`F@(bs|& B ?:>s!ϣ썉ɘ~u'ᄝ~ QG DVBg4%'@a -:4bUճUpE"ҮY1y+J%xzľ1턥LB{NAS`DP[ԕW[+FK=_Z5OzHH:0ɅQ%֥zM`d̥Gw3#|q/ abD~"-Av)<8z3 Cy>؁~ߌhZs0EB4'[V>0I8)Db2O nEI b;ORJAII3rm.bT<͘"4V({6lzOE:́Ч[nzAцoysaHrcHw<%PChMPkvؘe0SLެvYnOo8[N+.KD\7/?.;R@N}iFn~Ge@9q֜SՌUy"`^r/b@j~axӶ_;h=23G m!}+0q8 T 7r"CYxu˩I!K\6֯zჳP8ri<`Q&%07E 0$3UsE9?xSyp/BP$3d&c"Jnp8/ #x}p^nA"?Jk g^RG C]!r>3rM ^acz5.MkNvW dIN$7:dB|RiYɵ_|ֹ3k H/i|l656@jmBLO=z:|p[kgc(FaR'??J^{<4l"| =8B:*71UOEF 0 n^~B O 0^jh伆ՠٍzW~gU®HBZ$ tUiVIur)7"A2&6*^-Yo[{QMMk~x>ARWe`lV3]WaKoƛkA7Vn r/oowζo]=hjBBV$3g EP|p>dok5 LEi>T. BcmٷYl4ZX&/[ ]N" ae1 2ԇ}V>`0:mkr~)=#Mau,T-ˉ7Zw8'89n::yV5{⇣veɁyfj/Ư4cw0WȦrݬ܊ȍnֹ?>BHǼƈt#kA:֭k8/F8QX~112# P{lv=2A ퟝ|w K|hзQ3ӊPF&?r[2#b-8JUu3JNh J[B@'2pNDdU/ԛL06̑H5͑_z?u?@ )g)@^s+2z&̸s4>wT]Ө͑ˇyK4l:Ob{gMϝ߫mGc?M~D trkjrxDfbAV;3b1{8Kn+@4>n7z]q杛=,[]/1+~eA" Ѱo $icޘ)}QM?[,;k>Io eP@4ѤH5$$=ߡ' ihQlDB5@@*^oބZS{87cC܈ך~B"!WDUK*7[Y0"MBJ 4T@s?L;0U?jsŭrh0v%R5"=9PR*vT ώ\Q %HW  +9=ie S${.V&On%E撧ۉj^}}cJD 2{%aw2][ *FK‡k ®9l7C/<uPy#??< h. <ԠЕ+lpdׯz"^:|ܪ-qhՊ=M&* #)][~R dnXnEh6]‘TblD17ンݪxӟmf%}H{h3" te1pZsl3z'@ L٧#% kcKKf)#q!4Vd|+BRlνRo攻[HȌ;k(olPm$~6u,s I\hLQYpoFBZ>S#jGWiyzС_eo=|ٽT̃G߰E܋p@S!PϼKo%gz캨 p"{yO1`~!t#ɶ ReSP;6^֯&*.#(x?A#IOLFp$ nIv/a``R>41uI;ݎ r+ٯVRî#8*~qJ)Db@ <9ufv^„,.K4RB#C^xr;6;{tu|&"ObfiMhsݽK`ۏVe(}zrExܲ&͐Vs#oOQ8{÷zɭK@ GJG9^?T͝wnk!@QntPC$iv܊ŀH\q/-;fqGr`*HOGww5V}e-`&"j _SKM'HqZ 3ny!mK`޴1_Mdb$>}U/B== 1gF1oMO ߈ s`.mvs9TΕd\WةbىrdVGIDEDtA Ϧە%j4xiudT.tmF>\B.28wdzV+ƙG/? ǿ;~U G͡!`㜹UM=yS"" I:ʊz{tCYRzʕN 2)FcLg"k\:Zǎy(\_=ެm3j!{Ki0UuX.%cu?vYL_EZKቇ^`de"B27춴X7F_4~6er i`N~ܷA˱}LM"tc$>PQz;^eSiMŖ"x[o^3.Z+KsU'*`i?wpňt\q x`FdE aAF4W>&! @LF[>픧_іG{eİq8=ٵAyDVBP|NBV6@J]`F]sA7_ufK{Q&H" :F-vZHs?:=WPyZkmH@ϪHZ?+^9(IfV,qͳUEw(_']Q[w!uzǶ`C̈[αvamc*?tw|/f}[Gs+cc#_q{SJY؎^/Nvh xȾ- $̥d@)KD}7?9aP{"DBɱf9r;eL: Uv<'q\-t/1h/5_B*Lhj!)vٯ?߭tFpJcXͶaB"rʖ MCn$AvFIaaɝuc#[D!tAb> =jXl& Սҙ=Dfi"!}emn?!p9ڼkZM{۫m}7^}&?_1ޖO\\.}8,/c k[ll$ 2Wk u9;CU}P$vn=# 7-4Rcӯ: _vpOO<"{q&kIm2HzZN_ZtU^u0 ~g$FBËGi>b(Wh3uV5QFWrKzjYy1N۽gڂs 0MSd'Z/,(5G' Vꜗ5C: rK@SB.>% dv-lP>vP"FDf^Z-Ro/;R)HoxsHЅfS3kn60p*55^=YW"+Qz8*1 +ãS  E2l*j' p*SrSJ) 5F|>#v# ~2>٢uլ/Q>[o_S}}zmfyѺya}*\zW3aK*H(7Ë&:}i 4;gI7oODR;[61n4tƹrt@Por~3]0=@9 XJs=^VoO;j#}"K'CCuGS/Jrǧo fMe: "ֈ sA>_͟7H$4GY9n#5#=lX}\oHaNq@O<1 UZyڅnJtJ렇̚`́b$|N1tdelGcFYwӷf?>a?߉MW`^n|ãu^*4N~o?"Л|w}Ž+~ IB)< $p2"cDS&[OV*S{g#s/3b B3f:c Q+lp(ѹ+GٌH8>>7±)p0n{|r+/Bh\͌ ͌$]7N*}n{Ȳ@1Zk՗u2BH+OTt3\$vfgIvIw]ggK br{)sRU'luօ u42vPO:(lO MdJ.u6hXMZ?~6I,}%\Ub7OBHoH@J A  +t|qxkr#fn-,QJw}JCJwI]^ܞ[z{/[M\ÑHu)(l R(PT$A/ċ0+%@:;q^.0PTt֗q?4ğP_vJF/ȇxR,b,D`l,ދFPvRPwɥӛu_UߞI%ά04-GGt@Zw]dվ}'T{VJ}ŋ}-!=>2E:Tz5,P!_b5IvmlB2Ϗ OQrM}wB!4A9 +++"X@RG%D"tsr4A:Vj 2I*#׻v*3{w޾sf|XeRaMR2"Cdhlxzj;?+sܯuT&4O7=ajI9C$̮󑇇wNn~Tz6=i;gB",os߲ڞ?TxXڰcEV{ ?&ř&3r&m8~kf]E"wûrW; UP{ *e?y*]Bdދ@Ft8>mHӸ}5޹ج??$gi!bΘ[gV|l]'ޙd'Kyk 0NoԷTC(@@ \n;Y,YWlu5cZ}Ers<Ǐ,՗ ^$JP~`j^JNB#ZHt1Jyx1/@ 7ƽȖF!vܿ]OӱOݾW,~mRDv_? W| #u=lIt"ퟝ(tg $fG'&YvnpL,UY*A@UF $iAV`?J~ht43zW<$Ab"wo}PDt^zw;o@΀tM wFtV캎tYuv߱PA8NFC,鐴ut!*]]].jD_dX@-p}_vrWs[FIhiu9GđQ*$*$zM2^4yGލr.09<6 H}HBaEÍagx rF=B+ru>t*)ɛ @[Tm.^:R7!鱩Bn'>l ve<0CRt"3LMؽxlazX9 [u+yg&DF=\;^(֏7LJj%"Ckg+Wά ڦ|A˩'7 ݂~J֩n} P0a|2yg{ Ȣ+F{])4ʅ}V\tkN֯MiJ|Mi$i:mIKlm}F r;B%z\NV_O\=Ra:D\gHBR"[GP'Zku]ɀ$ %!ϿZ:Pzr=44whT2i9ɀ?xi77zkwQ2NwӻW@Wl|[2l:,*`&/2NOڃVBSecXe|ƬkwbKkK%@A.nzrzs1 1XDyڃa`90-]a ?M31"s3~ֿ{q1x BA*1bc&[ X >K{<]riFje@n5zaYyS;*us㣌nte([<ԫ.KggQÝu-(xnTH\)K&Oo%F5#⽠2"5ܸ =smwbfJvJcţՃF&BxZ3fwvP=('S5񍠖A#7N' DzM%RaRR*DD gӋgezJ-]`[$4!"]`plj,sdL@ Zwf;^)& 1 iI_Zgnymso{rPәhvժ5VUnZML沍3m#NRhfdzĈ[^z ^?ѫ]=a[Kփ+S#ynoOЯm=ƾH:dc#g'Kp/ zۺ#+N)Y%N} @J w=jP -hR |B1G{v]NXU66J`PGs#7r=xb\LN7Td %AhrlD-ׅ.am*7%*w4;` @I^pQB0(0XV+HšӓJm|nVں2.¼So2 :|%9iHJU]3iGQᳵ[͑Ѷ' ׆%{ȶUr~tyDڮ8߰{tV׾``UN;E|"5bl!`8\F:H%8`b%^WJߊԢvzuq(|(G}ӕHk_8{wc/Ѩ4~a-Nfz] 4 I 'L튗CZS>X~sqU6kۯu\Z?m8o]#`G-ەHٙxV#d~,miZO8uvˏ'.K&4گˉo~'`=0cGpHJGAg0MG1@&>̡ke"ɁAx->nXh!߈j`ao."!Op:wlW` oiOΔ >[2 x3<"iuÆ@Uۿe^uewKd们QGH̨LF5*[ f!N #ABרPGr:;=鄴f5<+q6G\KIF$,3Ɉ1Krv( ($`Zvk7QtֺuhߎGVw:/OyU%jyx2tA4A!AOzjr$I2- 5d#-/vbzyDfގ/{{ǽJϝ h@$!4}; 6~k?~qD|l~T0-֋ݸ4$P7ӅT1 &UKzՎ"a\a"rPqX 23Ȉѱl G =#(GJu- D"#w)=b$޻ Ո~t;OSuOaUXJ_a y;if,Dm/l;HsRv)+T!"k|ԓܻ[޾;*"ZkcoMddv,tDc370\ҁ/\[{c7(xRgv VWg.8Ϳy\H|l!wV<,1~#PԼnΙ{HR\nu#h4>*^T~iIʅ d)3!8!ێd`5&,d RI.2Ó.ELJkz!8oKan/kU ʖkyFU"q^ \ʞ_f[%N/|Eƒ%f n;{< 'S }wλb*w?^vG;Jh\AaIgE@>qEe1T|F0sO7Mgch3%3뻯;j.SFI)>$"M'auU/.;;/U#,2II拞TV?}ѝwsh[IӐ)J ' *e (sg /k݃ݝ퍵톪t /SC);n]a{K: i}h+ XȓjZ]Y/_="8F]J>|KCd]\@){3nW@|šùJfP[e r'/ ]b[嵇6Z@tFtrf} }ś9 G퍩 zٽ 5攒 mUmL_+\op1__Ms)T/ a1R%!d@Dڋ+'-<*ϩ 4T!὆.e|L"~cCS!Z8N|tUҌBi.Y+?=M2ޓ$P*o$!jUg#絛AvP .onF/aeh߯ޙpQt~(a7?ŬzSHZ;h[lrS| R3p:^һ#A0qPx%D(4;CzeQ{d)uzb4ٰu](pW&N 3mpWF`0'M9~w+/r%BK^$^OZ(k;{'WɩӶ\ زd4枺=LiRNWmN`=W0wz 9q,#B#^?|Pas7w 7 g{ni]Ll>6쨋!_ӠsUz0썎3Gj/BItVX}ǫ g&xԿ|q|&%^MB"nqL?Q~츬 @Z?$@$ v~"]Z(gu@T(L->Y0DH, =d"$MЯOn6;}^u"n;lĿ<eb/`=8zSat>bЇcr%Tgc׻7D^{ U}Ϊ٥rX)ٽګ 'ȓ}i`@>vpI'B%&v5QB(!emkF׶%u#ZS,}e+@!F?=7/kuÛ;2{1wҗ֜8=8{筫a CĊ &;`;Ai\aKW-C$`hV]QC3==GeS(MPYV"˥vཅ\Q'zp5;&_pu'y+n#0~X3J%>nqd8\:;uxRRfXc W87NNo6<8Scޭ׭}F$naRɼ{@Fx|%Pϭ$Hva#JVqPn}r o࿷C@i\\7,~CI}6+^%T9\?H'|iW"5]gr!vDo8ѱErLEgki=ihd5={va:--r_eԷ坯oY#3Cݝ;Ѵ:@vd'L[[wCf:/o}+:>[n\%x^,vϋェ N97Es}z;7d& H\rq%B1{BUI" $i#=7YsRф2RZ/Uh:im{C^}AcD|N([{r5K[U@Ȳ]MM{ᷖ+V7!/wvB.fK|+@db՟磓˖bnq b;ԟ_͇^K e~6 H[z?6+x':0`9Ձ{yQQV0teA.l%(/f^gu%!Eg"]d?{  "Lho_J?ʈc{fD_M%u7SH׵LdT@j"0oe.'SlPYFH:>YQ<፝+=ب`hQˋIG{'y>\W78 {?Kکj_[2N+2gvc4q{N{^1"v-S}h6H A Cx|8#@UqI#&e}Q&N"$6N6RNwR%tKDV޼:'xU{Xrԯ$_pS#' ]>  W>z'nKVݵw= ȏRjK-n)Ë희t1֤x:tS7(б_ONBB{v-om,BhϪtgGGn(^)9g=~tړusb >,m#?.j =X)V: ۆfOx9tY)e4E:2qYʳyAI n6;@cqwaD`A?` kx@^ʲ^5W[|{P c d3oe45Szw x f/SD!7bgx9gC BC]d&&#w5TA݌~ ɮy!"BDirbfsmڒV-lQ/J`L*1[zK&1Wjʄ^T[١},DY{Pd>6]FXǃjɵP|J ,z0?P8!2tt8AFV@V&߆|x$ CDD_<;(4`^B'.x dois4ZRlh OΛN~-^Ro_t^]GM#jL*pl)Ypǰz\([c6XlXsY!(%حG4@5mK%D_nU6W̼Ҏ~*mzXY9uP<6[o׌ΰjN\e~'QlOA׋k6@!H3B`4-B,7CVU `9 D"11i2f[ b#ţף}sWuo'ZaQ -dνH$yܑ*C5S#hgt|[OjD.֪h4XIb+q$ ڼZoiKHw©-n~ LHt>>ZjB JeWuL,/B\PO |g-/mі IBKYzZ)ԴxQxN@.fؿ_Cxl{ct:Ʉ"/: ,;!+@vq8|kڌ`r1S^ ]6rG<)#5Q՛dx3Ng(:?+jGC꽍o!\qf&[C_ ]Ћa8:j7{^jbcGXoxB@$ő3/ׁQb|"Ən-⪷DxN~:WI^ȽGm{ MO 7ߞ1sUvۄfnj3}cSu$$D&!cѭҵv`< 6vrYwn+av8}?r YikRد2KQU:T(F7R "SrtdpZ@Nn-ϭu @ +Wi]ǵX2(b^ӉN:@JCn\W7H{%7/VZI<:h+bqU 02ݳl 4lSTgxotx*Vp ,6H$sL.)ZZ4C(9BhĵPfhxz8y&Y! wh+J/0Z RœY-A6$ٍ_='u~v冩#ސN tu@ز*7.Ow¡3 Z˓ZKBC%!$c5! bi~HdmWvZVգahu4>=xmّb{[O?uj[5APulNFΔ=7 trK( fȵLidWzhděG.roVyUN_ Ԁo~#IA t0BEl '0T𸦉pa _]. "["@&;fsRۻhȳG#!vl(@C (PӱɛAHry,GN L~(9@PBԵDD:iz$HϞ>OLͷVBL(O\, R)_mo!FeO6ƆeQQRE'BD9y|)QG_Jn5'ו ]LFZ7O$#WoGKMyaft!˘6w.Rf+4xHD8"D5:]x([A Ok',D(;kז$AlJ_TAu3~,W[.c 5 />YbVȃT3OGZrw1Ub23QP&rSyz5c२E7!!'&LiZZߟiե(4pܾ Tós@`  q5gH/G!@rjQ|̊;|h١TX/-έ^gRDFrhd?xZՑff >SQC|>Qnؑ2>_Z鱈Qǁ$$1IoOBw7K(YV6W 5h>{g=Ҹ"_h XRs["WLn Ԡڴl*DP  Vo4OoNKh zi(wi&ƻh:gSd, 'Ӻ{9cvY4;Iz8.-ɞ acNg"絊3$&;OnɧwJ^a13P3(Q)="~k=0&f_ ;MVM( 0!X׫7;< fz ~~^0IrpԽ6^sϼ$"o,@$/1^ӇWVmч7\^%pZD*;޻R(X(GW_fz8#(R.J&Kg嵛sG*& M FձE(FDG5HIS PHFѱ8#:"u{kiI!|-O7|CK=D@V5V32(2RD gv66Qy1swE1j~X՝޵$nrƳxNbӱƃP.s@A`RRg F&^>,  Jn'>U>W졙p*ADuZ8% Ji+/|?@) ЩJͼA^bV?=y]npf ?߶q P87N\vd\P>W2L&lyFPh+8LxlZ0}vTK].v;In[)v!|~ҕӛ2(qL;_\)J? O\u\:}/+zmjvȫК*@$2R{ڃ}BkG8;_j_LIaV ?@^EAq M 62٩S 0vEg 6J %843دblZxs?ZJw@:`NR׬4QzxrAt3!;#ji bce|iㅠz3:;|IHAS*\3^9҃D_0W^hł__ (&d0R nt[$(}О]^apyo Uo_ʯ5%rIb6@ASZ#yTWJzP zxuk1bf4F!H5s{5sݑ%߽I @ҵtQU][  rܽC%ݫ:>~,b)T&_CWR}Uv*Cd&]SY򳥱~/?>$ LaS3ر}'2}blJ2ͭK?bXQ\˅VV?8>&]~,0ɵk/?ַḮ&.lj]&N,ۊ2s\iSyz^kϽ~`"rdԝvrP7i偾aJxHb`d͈o`IO_*Yg6O^"MnFS}" L[ǎD̻|"XDްBRD4MgwmKIzEȬK$g"6)DᑙQm:2̔8,7v__/Y:%h@_þ),B0n0oGIUu:rxHV|ܼn^=. [97VEdfk5-™DﮕH!6>;>Kp\G@ula@1T| i3 oZ}h+[=PJs|顙H#Y~ZF]*%L{_.kё fsՃz\4{VU1R3HQA4ɩ%QKAVy1ە)-7 A\NVw ڝPf]Ua:lnWihAW}?B (C}" hܬYG gd[d"*Q~uL+9ct1Q#T~~$~v?w)Z3ߗN-SS/mR)Pxq]DLu@/i!=;QgOVk¨]sSl:2H0u-$ulkm?iNǶL]}+Ѫm=\xDude9향Ó& S=Z &׍fsvyil *'y6U'5zeǑ 9/sǀA!ޚ}w`nUfQ#흴ʼ`OiRZVl6(tX72_<]rr=6]): -u _d"IL9bB{?Ml$Wq ^Ņ#lmV^|B$BhjbF#K)fQ?=JIHܼg;O@A!V qSQG/kb @]X kE#DC جZQ=PY.7V#wJ|Ը"`wI:bVJ7Z`*L]= g4w?7ùuOH(Ϻw榾I&QjI1 )nco!"(p|j8QJf"#:e*Mu ]W .=)d,# Q(][nOOk*Ex̄XSiZeW#=6qb0i߬#Rҟ&bÕqHn!\|wLx1Q&$t 2V0H {:sukuE<"PUFҝ\w{kjL&ivO+%CK#Q"B*Nɛbs=ei 'L&VņR5\L؂GG rAF "P2vm(ӊCY%z$f1nm~Z6%pʹG [ @?/ϐJ\p.:O(%WQyy4R/  …8.ہ[ǵ)H=.h#ثLfTE^HF@=[<0bYc'٭Z b%d}~22>"28-$VO~mvc+ ;jEeX a:z{]pɀ?cב\_+GH!m6| ]/ql&MHz4UDWX,+ٸt5 "MivBɹ>}[~7oΥt8pL˜.Dr&Ķi3[_|fpi6XBhGg\.tjjmz bW]zDd>s(#mzr+ ,U`u@daͷʝ;@o%4Lu&;7| 7faw֞7NuӍӃx{-3 DcA԰|SVUy4ua_ֻ?'9ܾ:8ix F$7"XJҗ!$ԕxT~B#A~EfU/ X+~3#@#zb#B"kZzrV%%#]%k+m]\_+=@++=HĞ6bcې1=Sc|g„ƍHzθGWcgcOƦI"nT4vJ~kLȌ|{R>qxٹ0H >oAH 0:uKp,oW%TBNןraz`_̧` s s$#AIt a␡OK ~azWH20ئX<avvjN6IQZݹ89R%"ntf}hf$;PoUkhN8Q^9엏w2XHOUiW{͹Z~RbLJ?K1 Ù@7ug9"y^f ȝq%,?n{ !ЍcDq=PQzh9}m `kπͻW|]u K:]/f*C<| 0 +‹;~`vڰW>bF rzB+47mԄ.*0 ~Bpl& sQb ==]dZ$ܯ*#"rd3! (4-;ShvlR2g7v+c&t\W^GVFH0?ڝ #hF^chрL`xYT,u,es O:ߊ>U vN:#07o C(D~(N`ItP;mTq\~9Bw3>3WT 7Čz5M=5KgF򃇻_efk9AIc rKwI <'&jʍҙ Um"PNK B}_~[hR]RUf06OF~|vJF&& ry2Ts,]uŧK5U+V1uO;; Gp"sG[W"FNuKW:. @}}k;X1/ؗ+A ^7'n"36ٙj6ځ0џ0(PgCN`+ҒJ%akKO΂[E{b(Q(7[Иk[4iO]ŎGK {"! SƇZnO)G^ N*uv< brt"Q;H3ێ._+$H$c6䪝 Џ aXip "(?DƏeoip2hepJ8oL_2%x@ 5V},XRyS!瓒=<2C@u&K5J:zf iuZDX]KFg]W v~8`;ِaɭV[}dtRnuV'hI E\8xc O֝f:).wjp% >jL\kY#CAZnJɐF/ZM>@KuB- &~lfT1{_B3 ͒%W4dW?钑7+wl!" p4ui 4RDY? ,_^ɥ۝^$mFfB^JRRA21 w@ .Pjj~b t\z(͡  "wJtB"3aZhHPl+%{CŰ4b^_k&wBz1K%kTꄶ`.5/wQ]J,V-<*5` /RY\f~QKf'y\jR~ILNy0frPJM20/ϻHmWcu$ac9x] .W01C3*'1/0|61)h,[ bts>{QGCT7aFzdD[(f2aov_JFx>үjc=$"SH@yni GEcϗ$N˃HBgR2K@[ H(e OkJguTkbq\2hUPGZElȈ5vl$ken=T #҅ F䕂!qT䕜&[RC᫄eTi "ddpvqxJOE'/āx[^yy zsH=%O";=Ҍፑأc ?  A1 RG)nIIX_;p]%{yUC@:i.wX1D,ۤkF EcaJy!/@D 3rP8taB,Y.ɾTX1G<$`ׄH;&F#[7+G!cifi=krfrhy,;յkǮz;΂a-f@17ϯOjHj4[HBl.wI +i;zvչD3+;8Xy ABG;J*ňfpu䷶)зpj\o>0S:P`1Vy4Ho~nfCK%pK]Au5B!POcӷfKjPSSNBmfhKY,CnF34<4b 7. ,jGPSsxol.BmOs:UG$r7ZeEd ޜ2;{'*WV DTs&ި "Xoϡqέ˫g,=Ht[Ӌga<"H Pۇ}@ kx`"ָ[J㣫;0u!L<4+=\,5-T~@'K@0r@q(G:I(5׆璁Yh`v`@jwt#f#(0v8Pl v"({)AD*NEY[(?k+9Jw)v?HUؚ ŇGXx0`˜) f\}ۑddbΨgٍNYKiRNg^rʃN3Ep*n-YH GaF6t}A*ׁp!lq[yIZW0RfQT{7P8|~8mhpf V: @!TY^Z=־:PQҷ o=]Ih#3W3K6ILewANq$~g͂v $FᕳEkxkn"u [uѵNy4߽؈Yv% ٪~]%nȫN/B&JOfZo՜α. Z 3= 0`#a QuyX=w/~zKI:(Z' V|xU$=! 3#Ƙ:\Uٜ:Ll( g6r@jF8νܔ2!dxSFp*Fڣbmr33ԉIHO  p6{3T@oPHڑ\tE6|. BR"c lך6s8-:Tʓa( WܛP'uiAH@@y7A=;lᔙ?|b::brt\nLѼZ *d$ˌ+Inl ャhLգWZ$9Hɩ5Y'%f:Q=u}l $2h[c'=WBIDvek E Wn~5+$ʱ${i,0=r9T#԰N4 ?ZoVZbQYaκrIi-7:NJ>JZ!J?8δ^<Ɩ Qjz4&uC5ՆRvym 9MB{{ jBOYx € 8,wy)v[- gotϕK``}X+~>rtd$5>-KYʁ82s^\߭AtNSĪ[k;>4o!™6"ʑ|ؾ/Y P0 !{ɌuV N"1XZc?Eǃy+7Zn^7^X.3a'@:S}ޗJ?|sT*5gjDdPf` pn0t3coF^޳ @j@_AJ8fmğ52ʇ-&TO.u9=>o«_X4iت><; >蔮"uw;=|_wo>}\S|b(_u"t%?џ=eB@pRjH v-84rF(%M- (e:[ߺ{9깨7.H"dh ңRsmpNP]ſ_ JW\[D~Xo5# ./=GqLVjv)t(=t =ܰHfswvOދH ОRkod@X fƣ|1"X )EZUr[^õ_Qo ;W8;HGOa왥B3AY7#d nEz%=֠l#^з~x/]-+ @ zA>1DBpоɦ%aalRGm`]J4hm ՟?]#7_'Aʁ`|f4$}5;L<1 "37oXnChnu] ox /@ S@u33RTF"RfuʲR n]u\ Yw"=Q@KR Ӽff_ůFW1932}v6 OJ Yz||+7L45lVLޕٝoUB&X`<}C Ek͈i9z104$u@Psv|=ąZ2(G'鬢_^ןTU?HKJF$Bc7e*Wj&z?M{:g/Ӻx"}N0æR397BJ6 N7Su]rWrYhȚD|^KFT@1ltAuܤW׊vcx-p~XCa1S\cQ2LdѦݓ4NqMR]Ф!)O#܍;*1)K۽cCzSs;ioΜPlq{3#O~⛠|eMR T; Xeqd!vk=ҍ|?z()_(x }j y-rq+^upV޶Pq(zb`AR J@'2N'Zj`sשr85Ww:aPd>+{@G! H "Y%s$9R]BfqrQ>Ja`VL$4|lCB*;d{swfu* Pa\H1 j u+Z'UyߙikC!7KugoJ9/lea4o8hInB{< z~73;WB.:/۲! iF Ĉr*q2H+z/lY,/~]O4{J@Bf gCuw\M#I!-'cu-'fn g˽[kJ~͸9*ͅŻUIHH  ~#SeY{7//ov|XjFKv1CgwZS 2=W *:J$P,N-߰1EJ~eA* [1nU ]Rcb/&"DM9 g=s)$LH\A\$(+v/X澦F^U[i"1Y0k4ӌ&k;nzbFZ8Nv*IѴ}`P ]Ω=ے1 J16?w6rgb''Wŵa+oI@'٫'ER-eFCG/g^MP˒ipF;oQ{rRW\D]7"b Z_ Vҳ3'*wKxQ?JŬfm.A0Vf#ޕ>Jh͕REW?J3sLX}ݖJ_I*k8m[>_dhrO;T%Qw3Gx<k84(zv܎09:o\|RHCOKɱv薽Zn :U^.,3d_ȖE`TrwqJE&GGA9 'Uu%L6CO>n:~q|}o(9j- A,! xizOedSU€v}R._$ V@!K J1QPfAR$FJoPX9I]%'tt[-F 8iyTri= $8iٛޓ@"͠$Vm+[*Ƀ ;2lG^\7f@ppFv-QԎRH:?0e^& ӗ_ڷTr{5+l6gum,Tc.ݹeƾ@#cPPij$m>T]ꐏ uþ?ޝ9uܪ@mH-j`|+go}"mEtň@D#}h|9c LΛvGh;?y7; yB6P&A˄gjȼf@!U;o΄G{wTYr#uVuP,7zdɉp+.D d/@ۙߨeOvD!]d741#:86Lܩi m#'mD`!nu4>](wYr=ysZ*ш޲K>gj@E_] w;~|uzϤT׌ҵB/˃v/tL^:5\&/fZ@ 8i)XSʹ#X1H~ ]BJzy*Gx=ƌ~#oVkk)A,DjNA2RN\u/$Qwmg}Gs8+v#A7r]WJCb7$Ut/< ze3r'3w#6~}r`oq,"KRL,j :vΪwπ?Yg Q&ʁџܙU7Cf$ }E|͡+VJGȾa ELRm8uiЁDZv bě#*}%h>lˠ0ǴB"Unt.(jpq Qh/ۡNq 6{ R%#ܦ;X8YݯNu& i憙&gnWHv*χ+3ԟX ˳EpK-A@89K]'?rX gZun7.!DgwtYF:][eD#9ʮIGw3Oִ8[YUB?W]Aw.]=R]c󭇍kSz1_-撊DR(0۵) SwcvFTvC: ^o<|~.N)t鱱l5T]f!oVG s+ iaj>}}N{XҥX RDsGڌ* 4e351:uySɃ{Il M~Xyf}Yr]c$+ܻ5|jm`ze4+ouJNH 6XX}Q} Omb~h Gl *c)u[q6cac/4ddwlNjQ 2عP8i6>V' ^hEHʜpҚ.ewmSE*朅U-#`Îd'QWԏ0AdI߬Ξ` "Hԅq@5 @`$\Oxfnȫ6W8``ԩ ~*F~$d0}Ά go\~~@Xw YeEzֺ¡ׯlV#*֯$XH"R^]7YDQ ;*|ܽkO0䃇gUr=Q](&NS?m/Jf҃U:=wb81_]I]a]qu5!WȭqG_o)s }0XkAe=W{ecGO]\^^vR44;Pú*:=L J=hszj&(\ ); :ٷӚۿ? ۨ" T.hvS[)E?mX2{;y(KSva(1WU7'fgӣ"<o++3HAOkg ńzh{lMXݟln3)n%\:!ZdgMy{SRnpF]SfOqoDb) bS,Gi1z'F1CWewgm54e\) :]1Co~H+- H Pfˑ1 g|F)ۂF? H;'~PqgWg1OܻjʂXE~8?w&=Hҝ*K<ރy,= dg yv{.8s! iI6ҁg|e$2R;]o7S?>v;qo$[s"!1{O 7 BѠUw˷ÛQ,0?¸3c:E@ ֮tPwc4mnC1] Bot|~5n8pHɥl7:PEvked]1ET ~=ҸzHZdo]^B"M4j‚}|l(Õu!~mɄJN =)J woԧ-t?z2cow = 6¡нIjf5=1uk1iT?8P3wO/Fed\\|l:WߠC'F#)A͵N]s*SgKP>-?i4m JlPT*gQ{ 3ԕ7(VD2XNv\(YK N(HVɞ x'ݑ0/ّ֩GS6C݃A\QA"Db}&7x-4,I(!dN q(l@PX`?B" K}$Ž;*=d*d- @OFSsM`Xu"t O{X{̌VXb{[O fg]_+m+x"Zf!~qEPrvM,3OTu=G&g}rG3"BA AȣcK7QlUɥ쑌J\ V&_"5L<Ȏ-}2kɴ0AWOo.Nӭf!E |gf>Uj{ӣѹ DTS~2=vtqZ7}RW&vmTp|$B;ej(s$,vWn6yn(?_EH V v@R婽k{P̞PP[mл:|jܯ#VGٓ]< ϗs4nySu!CK\MԾ^J8Bv)4`??eDq:?>v2+F7ܭ f;do?JL 6yVUkojp@(7włBb`Vp޵kD'g)xk ǽ:#X(I8#!Ah7 NOgi Q]C m`/+j9$k3Sd*V*Sń!GFXg0?$~-j7CAc^?7tG6aLv^7k2#jyk}yPfksk;r8~K;(>}cdf_:gP l Md0ûeUov1oe Vh:әpkDvn 1˯zgG۷j5u2=R K #^ٜZ;R_JrҙũD ;W6{J.5U#PPMMkXh !V{ͫcgmZT@"GfWowvu2#??zTؙ^YF><鴧f&vAغvpWoF8c'ʛّSzi)}r, 3jn!J NelftySIDD3P Ϊǻz9xO.-G2$}~ȏbD(9s~(ҷm etmwt*lzF%-] ű"V3$ 8XPȎB͉<_=:t.PJCz(Hf , R93fx}sSY뚅ܡhv FbLvjh" ǡPj2D~qdyΝqnl9$X!}l1`b]ZkxM/3}(GG)pGBnD"[8(dM_5 lsqQrlFQJ #J بp_E1߮[8׽#Ո(0luOƾk+SJi~d DAɿ7YSg~d.5|Μ=_yj71QWt .3 xq, 7#ukEiN? dEaETɗ0xKФ3.ߣ=V{ ;A"m2q\8NWfgt`ڭ&-?^?{P&0z{97g@]t_Y>:(7 egߛp9ƴX2K_7X4.=;([wlnXާ] ٶ)AԤ /(jk,fǯ>p.DX5 *Z@Wd*4^j@ƽ "Sv{tWy-.O xk<׎M"fwWq-l )Q&2\_*hqs.j*~$EYnj,o=;̄H2 4ٺjc@i^1oW;ߝ /XnrܥB45$7B@@MLU\#z.cރԝVN cQQΙ]!Uy+rETPz'{va{gT/(eyoqoֻsy*ޭ^7{T6;SZb(,^MO\S!w6N,͟p=|V=MD(dex׎ڢMlysnWapX`6W;ok8!75+Ϗz&H'd)i=ԗl I:xyiVK^F4/vY?ſ'MM=Y p$1>EK$?m؁ۋIaz;v d;OdwMdo#p)/}) 禼:ŖOyBNQQjWt#xJ)XU*UFS;GG&&F{z'fvk~ Q{;OWI=j)rAGN3`j#$gU<lbm4?„/v7BB8[k=Bz8wϩmYqv>$tơwISh>[cpZr@QDIppֶaޱ!?"fcwl1}H(BJR;we%Xr%^=]@*NMBTQoBCFu,a0Eݠ 3mS3\%BDs vVʳ 9YsLt*@8;- 4"lm.Mw#~|bиݬEōNSh+Z]9a VU dGڈDEͬv" xq\/ް{rsNBsⵏ;8}W:$  x9*D/ֺ͟A{Ѕ<{UXwTPQ*o"䎥5̤֫p؀0f 3! Y$^AZsIQqtfBMb"vNJ ^<8רUBpvfa^Qw͛YYpQ͍wbpm7}ԁFNo#S90۵)mv[щH;-X;ݩ^U ޸@fkf^xm bw#.eIhM`/r[x:5@*swz u&QQe["SڗjK1Nה;-ETIbm*8EcVV&3W|^8>['b7p`oZ4AZƮ5@H{h^+A.K" (퐃 v_QC?o0)>0~ҥ rR>1D7ujQЋc'gO nmP wR`@2h6YNii/Nӷ_L V #>Bg4PR lv:P7@Tw[ D*n!Ge=*"!Q&*-Q5Y;)u~oeKzծcD@j[:-wZp%kNMa6`Hn/͓*Ҏ"mOw> ?%Ji:0 >sd^r>y(Ax?[j_C|є?(S4(ߕ+=#SА0k"PN`\ 1 K(퇝;]uX{l@ }` MHka0Fe],oc$K= 89V?ɦp0tQ{;gn?VZ!=S( iBiY7hhwR蘯]s ^?5݌lCԦF!ZoDJv'L^QD)@ cN[[}ѝ:Jj#?{[)E?J?%SIC <&@#zY/G4-$l=Y*~DM#;gбɶ4@KN1 )--]3é>t'*fKPA&"Bʈ ՠwF4`׿@ލ_>GT4CKҋ?<:FSh 7NV6k?Wiw[$ްxYwx'-&i3)'& ZnޜV{`XS<[I}`=-퐊84]GL ^C`˟ @2g6n4>s"ŚY4CT1L3Y0%GH0bؿu;nB_CQ QogrD2>hW[!E I~L]l=03~r}]Ul?~ )ݥ__+DSGFQlzw\A0, [z0VRf_-qC<~`XwNAAvu|6]H DɵWnW?b⾅73%$-,41(8zsvpu٩u_xn{eGcqϟxw7"(0-+/ PJͮP qKAz>',0GUDw@* Y)?z~D! #]k<[;Ј 5]Z  Svi];=:Rf0ˋGN@c'|XkqT.y^"j6k)Y-h})s4zM`h Mde璯ɅU?&)lWϟq~ArPgƑ-]I10Lx vgF0{vA^ C11a&$v@Fy|Ea!aԼe̢,Q1T]`VW@(dG:N;f2B5o êa 8n0`hڎэﻦ}rVzS90<;Qؑ$cHݜ_O3u[&o-='sD"(\ QLjIMZ5|#H jנvCOd.`HI;ɉBχqxЙF=nî_?lܽm-#A$VlB35"E2ՀHvk㚏N;aru ;L/NSlCL8rغo|&PB$++stE4-bF6!`{Bax/~AA]}#cADK0` ?"`<]!s% z@ a6sّ{:*D& c*AƵ" 3@m7ah#x$5q$&DVNQQ3sbUVAlW";^F)=uQb#@U6A)EA[C0&ccjmfEoQA4q:sՊ"%dEܨ nwG9qJMϗ4uh5A@ rxn@ܦHPC$ Ncd˽E7:wݸ;6hdf+.wk`7~/]b$^w Ԗklly MPs.Y+hA2v7SÀ""jn p/uqz:\Zx_䮾_}fjƄcl0 }`ysz|#^t1PDL`xs?/=)r\AR[_ğ,|303{Žh$ :٩ ÉdoM{KF*5Tj^?K1ov*k/70ΊܻMP IҀ@=JE4dY2,i l0'cG wn7wEωWD *1&;d6aֆѮ1&!6(`uI KtQ@% ~E aЋDyJ@"fd"Vl#v9{8Idt8xI B {9<)>TKvK͐;¯Gꗑd$pܵ05$ߘ{ 4)"@gVkÍi =QcCbe[kadLӱ S~FNHt)3B9W|z9ӽEa2{U9^‡xBwWAkcDa6",aXG" ADȄ3Z #L) Bd$[z&wn-(ҊQk^W:QhP*o_hݿyR}Hx[ .|"ָ}} S $(7v8HͥR^M+5}S/H? ?hX 9dGh Y`lNDqj"aP鬠DIT h~q',h4M$f.>9o5&2 Pi44BM-+`c$=FR.52sdc6Ϗ X, A)'z:R⸎  3 (`kLc;8 6o &SĀ[?mjfY"ask4Y@DK fw{ ccwԥn?5e 4w"tè@/Kr OGƛQg}r^pK*#&Xr46rQ ^kHM"5u#շY*an~};o/6{mh=GϮla=ķWrudj}\̍TdL?Tw o#:B` 11$ $&cQ )74w' YLDs0xH$:nB4օJ3vBBŰwjܧX;% P*Ey*SB_YXHoV4Je1s#a:nҕBPNOH @`Ç^dd,dD0D`6=?rL0MbذP hEPe1͝+c珎wt2}xf4zLZaaxf"J!-q|PrfOԄb ۹a7\:9 "`.|٬ TL'7s#uLra> $#s|m[ AR?x᯿EAaܘCUA/A<="+U#QFs4(.b1n͌q$tB'S?5[! Z l+BӨ|{isv!zdq k[/];;Lja8gvlu_G6+2BZ+-hs?F!'6Az詭N)偿^3)zeouӕ[sݎBٍZaLNxd!#~񯏽D+G^LR☇xfIP1Eo /TKb" X틠E,E>\pݜ˸ ^0Β."DL(2Ƅ i`zXD[$ .hH`:`NXt'ҏbae360}ӠP[cTV#VW%VSFW s 1ϊI'Ŀf1x(QݍU@?)DQe %EmhDpUxdyk'_Wkt>[c{7'vҫ)]ޝwO IF_aug앱+ӳ;!"(&˻zq LJGjlf XX{Gt bN#vRzJ?n~Q%wP@)(Y]h#"֗ȀaK8[ {RFDధL]8[^3nJEqd^JMt+})7&\:Qg )L.ַZ!Ƿ_~.UGvogVRnGnWTUtOqʯLՏ(90(w5)M }OnEţ/_ݼ8ib dp+.buyjP8RwEc?,Q=1"EH:8௠K0"5vtP%hD_T 7 cm0.!>{ :W%А⇤‚(6Y<^n-N94Q T9;^:vO!| wSFaX7s9Jx;J?/O")$^Psx)BaHS؀ʤ>P&^cE!@/#ƫ/gY+˭t;g,;IA1Twuaj&_m3tIL?DX8ݙюFBd tcz "$,,‘hN*L%ڥ]W/wǭPVF C"A7;~tj}\~Ӊi:\ۙrvtŊmwe01d'ҋ(<מi"PF= ƛ? CEc5*`1k'G?6$}0SXzވrjVo"~WH~*`i' 7}:|pC!s`̢ГdH*ߒ͟ֈd3])q8de#QbI'T68P#*Nb`F`ll2žֹSٽ@tL+BB!v5_>Sge"1,66֮ZΦ4 Ipj} T)G(DfHjGrsHVxvb~[w^YDX^:83{w;cnzj7;?Y ! fM)1b7gZ4㯼ROڿ+?]_|Rъ+=c]E @OʧRܭo?aneT0x`.wgBlD8p[bc}֓*aݹiQc86ʰ VA^dfI2 98{E)$@ëHe< DPJĸ]Q1{`M l8$Z\VnʖW1&a{[xJGWyħ'% L-h*"JPϜVt9`[`_HI _c -(YYAƽryҎYBHUʹzGW9QXHpp?C Ra\4a% Jz"(@FnVB](ulc+ ^ZZ=OB iJp ;KrrQ <Xj_~#[q H!>̒ S  0v<1&/t~%jP뻕#ՙ\YsCA޻7j٣H&BN2nX۳Ͼ'Agt.]1Z:C& SUjOnd(B5cĶ7 { =֭ʹ-$%g+1S?V9?;"¡;GJ@0ݥt;N3Z\bc"$\ C63^! jͧw J* 1Ϛ+nijx-<ێ10\\TGmM0!(E$r"ws!9Q70LjnULZbtM vPO_kX,n(ݣc[*@l(d7wDDDfw4l^h_I|Z&9+Wgivx)3K0=meޮmF@ԤSc{=uZ*24"7N̫/waXܸud T:f@Hsd&~U_u 8 3L'; H!7U] ETY 13KM%}0&5_T9wBh[}^dDGEi5uɛܘ-@@ a1I|ш!:XP|K̈́F_+pe`DS%6~0]|ªy d}$b~ X `\Z󃷟/ً7wN#ƻ?l6%u0 Glv҈D{N`k(lb@l+!9ـX20Hws_?Y 0ȴ<!)f1qʺѠA 31M,DB@B6W{Wp!a󀡆1S@k-N!DFB'$~>ͪa[f1pڗVSGWo|=7p[ Ʃ}B:^YDGf3Fjct$v*f6L@H'Y3m"J2>ʮ?OjOɒ}u68`G ŵ[ p[bkL\1 $5H/6 V7{');d A 8 J%E,Jɱ':1[VdLfS"D#Dh@L6L!ecB(S)(CY"s&cDx.lGpSK+߀J8q޻hD@=SWw!񹡊;藹MkUl ´1Hj!SvehR7^p3~;4O D 3,>Arc)DRS 6Ε};|G??O4Fh+5|-`Vq"U(UDtaE/(| 8aa *WoL*ʦӞ2^;8 00RB"`~~k[ͤ0FPW/ =?99ʢ34YR2*_V\ۻF>Ѕ=ܑuF Xz-D5ͨi Xnɧ H$4]W խp5$}G Jjmm\ 6:;-ꯥ098[W."]&ThLdkwXT'Z)Q{{>"yZ3\iR4 '(_-bU [k5ZԻVM`J7>z@1FcDae(_w$u㽙 _}b8IFSߨbԙÓ}'0l<8kx@eA^3Zn:6S7*ᩑŇ|,dPAD62f[ ~ g:n,-*\pirv*j9y;tҞ cVMc=Y:)7X@aд!S= 3XpzJGK?6%Q&JpDK,.>vկDRb[__~>][ x^ z[0_Z0WZM_}Napxruq2Snu:_v˵r7أ_|g9;====cg_|S'uL:2bbphB4ȱ =W@0PbD pՇWv=;rzzB (Q#SӅΑ{5@ )ydڭFXS]j&S9́a*Ƹ-.Ot3uؽꏮN-(LHekMH|[O O$d$<LskmKSsMn/bcy1E DJ͌n@dqSqFHS 9^Iҏn$ H+JL9hOEe? 0 ,lAqӏAKpKv%1,Iq%?ݮXS1x'[-gFwQT"ĬWV퉾Y=?@v <6hZF(ʣ➯51;a%EV B"Np? 9jrqݵWj0%Ab%sS)Bq( 9 @}k 3s]DEF^!5Rz==_xЄ P~woc~O_vHvN㙠iiP?qmY\<>a#mۿgI֔.y|%1ډϾ?nZLHMrܹW HgSԽ4{\~29SL҅¿|g  s>C0(baG̱X;!G JQdzDg3 &KX0v2ޓs",eQY7p%fqs"b}[a0i}%RAD1=#)s3]HqEkV 'xA'@\%*M ꩳ.kL%'T dGq 6t|l Nn63Ay*\^uy,y[fr*sI#0}Օ0O,v`e8S xk5ң #X^B[D"iɗ_/ND컱ϵl(=uGV2vWw'?n AHP9DNqw&. G6H IѣwꁟL߈̟''\xNV-s]4n:&i.]zW^?_Uqx*ywiҮ fvDZ DDCD%uϛ, F:CSVԠHƁ<ګsκPa^FEٕ {"(8&mAKb6o FQs7u9AmSka="B<:7)+=F=]n[?WL頸oJD͢'.o#C"&}lBRF'?dj.8ݱ'A N<$/g"X !jMNf((lÆZ&Ev*Vaؔ-g̜TC NAv:ώ n2>1:PGkEhHb~g~ɡ@4-&vfQu&tF2=NuDPv D γkю?XBAT1 y/;~6>P >Ry-.=%rU#䤺!0UR1nXBd0W0SdX?t|.3/ˢouIRݴfi|*8&#1f6S[?i׉\ qLO82p>|=8͡d Mķ1_^xY F[#6d&pH[wy]Yo^ҰW|3Q>[> GŁpr '!( jiTkJGwڪo$`a`a1-b@pFB=0k r ֒OD!6Z'XLdXhg'KN sT3:lB;RH n(+xr4m[kc'ߺ7ĥ )}CdQ8Fl Fo#oe+ ( R:t:5cƦqvI?"+Z`1, v3ɏM w(Hٟ(~k 6$`s1*{u-*(COuC2` fɜlQwJa-3>A~nD C#T5R)D$,,b@ rɘuI|:lJWTo(0_Z]Od%yL: @#"}7/=OJS]r_ibV'X0 jU˯>=Vha&U:(\:s!ě["pX'֖?#jAw7Y0r_Y#C#8̈́!깮&C )h&27`mXJ F 9 aa{շBRaY:Mw/\EK` n) iS M'Ўv5*3 NĬb}F̓gH`%,Ӥ rQZf2Y^;|4VfM5D+c]yy{aa]o8UO;䮨FN(T7 K$3 RXdw;) h`U'r_#33Yz.&"BTsSY@T{ (o"q2~/4G (`Aİ:r,3p95^tSD5>7SC9$rW,^ GB~ԏ}1+(S"[Yˏ?6<ެ 7sx ۞#gNnO4O>D1D42DPN]˄6r1_'N9JEmY bQ+]ݟ}rA@0LSI`@#} l|2vmV8~qA~fD"imC",F+HñpXkcTD~Jye8]1O#;J$'VO!Dt> `*^Q+($&kR%}TKBSNy0Z{6hV.'QwrXgR]?wG;/rˢq.8(UBbM;-gIl S>PmF&;Gu s{M胿Pg|~cjw"Ysܫt 6*ځZ!D( 00ש QP7^kqRi87V/VnkߪLlBts,Z9RG4J;*VsC8G[g`"ͫzsqǀZƭax̧<N|vYwXTt ̄ggQRwѣT,{)*ΣSϤ>IB̎31X5Q5=?tdoX; 0NѰٟbAjƊ stsp?9V*]0X$$c|@X8 H"!ͨ@P$2 Ay=ZrbXv`vmLqh'DZAӯ앇s)Qnؒb2 4~?QAexsb0k? WZ0_ S{N.N stRA9=pݦA5(MъS#+A;s D9[t +Wh~mQ-?zˁ֮҅,aS fMc#ndXl6C`T.*dTѭl.G.| 톈Q$¦o|E  o玭dFb>vx6]k_Crby Fm6ӫ_n~"jڏ~cFҹ#r~55yӨW/lVEfݢz*tU|Q,cݖxٖ^Wm|hN1;0~pA)L%1ǣ$ '&$Y鏆1JJ ҟ" 1RDab|QP gL-}Du4qQu?u6~m z8Y%{*ǚ쬈b؇`9Fip{B@@WZkT`[Dy]bTm׽)4zNDvw4꾪.0(:h7Pj,Z1sbJoΪ֎uc[G2aV}\#~3XRY7;>蒓 0aw ($ [`MϲP޺qS.t=^ J$6h}{I,fV6Ǥ G$顙bs^:t~;;Ii'Id[[K}qFrmnzWo>("ƈw;C ~GIMpɡM0:2U-}f;[ә͞IWÉc(xF_hrV.Dn K !3.y-l T*M @x}5}<(D`^08~?ړb۩PAجV 4QD?`~2zܞvL(2G+!`% 1v\(Q"0 ǂpJILZFD#v@?qթrPy Q-Ig`>1wPrC}u]Mˣfˠsze[qH>D<_t|TvBHyc>߽ʊEJD?~81K=Jpj-D"BNFe 1HM0YͬoFtk]nă Y²Gٕss)vQ=6!dY3 @ Gz8hO3qrb|F#kc|?jT3YݔzKԭ:SQIJ8)ΐ,"l9~J''Q8U\~<]#X8!TB_4,lj@@[\-a_m=F"w4^^)'#[3YTqџQZI0lL[a¡9}L-Y~*F4rU(Z GeI~wm_ lDu)NCRjR!"R?^Q9]1[?^N07HJbAU ř + ?"=J EdyD \#œN]ze;{"S/d!kT 4}BʬEAk V%k~fM`:""p#bc_[ˀ\ ]_@DJuiBs#k8Gobh޳NMg9׺N23Rڋoq%M.m;*ew?0{"s1[i_kCDP=FZX|βXuE[ȝԮ " ATCv*"/}= E0F]"&EP1K27\ vUPDA`ڌ@@yvm]Llñ( YGn!TNŮ-j ih>)911sc3uv6YIb /hv% g[a 9%J*[pbS DԤ> f V'hi1iPPmkupލvݏ8Jvm) !1siwySKZ;%[T3p^3Zkow&CbuU!%%}Ir_+66#}{oL$^}}c<+ ‚Ī} KPA#횼\?`MvȖdžForxjR{bn`66JK,臎p#v)FCULEu|1\R-D__l_j 7s78 3EJm$a!DVǎ8` +GIn-^}|ߙzplb*Taҁ'8X333J3aݗ\1g2آ> `sq|fgad:m?of3| ٱǷDx]\73y%@L#)R-d0@W@-P*!:eSgS-w sj7ִ1e]m"0kKL%(pW6SJAB@`)7U.HB;BP zfT[('߮}Y RG8j# Gÿ0{? J) }wuK`+1QYؼ>g Uo>gG:лM}C]J̭0$T4g? NvSGKNHR3b $-H$J!8==:N4DqF)uwl(%"RZ:/%","b(ຎb B{ H$ +1~ODy~" a e)xt TI/H=ثoIİ , nGJiƼe f{S̞kOvjg i!{9yiꤢM<7֓ hI$%;$I,i-wmBeo>އw Oj4 vtlk&V%tt9T:Η (U1QRUT: BF`@mYQ2Def8ycqP $u(@ělʌVÑA$4u\QBz~C3r+tu|,dQl@_}q+k=Mr+Z{b+l=B@\X."ٱnоF40f(`z|7f?v ӻ*~g(4dݯqq4p[# b I˜ &*Dsݍ0!K9e9!Z6@"ms&=Ch>2'O[Dbn&꿃-ˮNl1?^޻@ !G#N4 13F#Nf$f4 SPeeeZcsDw| ′,0[`+pm/v/# 2dz {{sdF.>7ܿ2FX6T.S [k; JˀFERی5o&B` |$q{ ]0 __ےs;dtp*RB&Z#m@n 7qHHD4r`9,tHdZ!]HӤJK@neaD*tyV7X@5jfv{'8מ P+*RaП(4%qac$Ex06#͛XCñ"7K <)Aøy`+ b9j>{q ; T7jڋG)İ gB@ elodc'ۭ=Zuic. 2v[k)R8jZ;c %R }u9sp|\bcI; IVt so٣&wo^ pT}(V+@e+PrxWp9qǐBv]cnBXEN"@HVGNi$$Pwi . OSX?zO\h*d )*QJVav FiѶ@qWH~~O܃DXܨ0 jWr,&\$\%et!ѾVV+v^̈́@$U5O|X;}>zjWoݬ/1s?]OJkoǯtxNDfvg~nۍo(Z5܁&"_l_ n/?5JC!V N޽6", 9Tr,-cB $'b$E| TnI찓]H5EԑrGB\JK b7s.|=nÆYVS+N]B8H?O6EKr X U"AȎUf2[ ѩDRčU.X1.P)ғ(B"M@MZ 8,bw [;>v[U;SSK3wZ"Ћt 4LJ6SW&IDh}ʛ[kVaټBAj'?~6˩JHpG^_P̤V! Ҧ{cd$jr"K7@Af(Ġ0$p_|drq#BQ/U篫s>]@bO-QϐB;D `UZ5ZjfҘ8iɽJNtD dWuSFDGwp>dT vAY?@4z>Viu%W 8bkU>p em9ďC7~͏g&rv t6'{! ޚ%h0 fk%߿yvEŒbW>l{' yrdD#1@\k(I3/WHT&ofe1#Mem!DӼQ*`>DDîx0{  Y-# Հ>L<A:J ld촽홉IHQc]#.GA@J5A`!ࠗ.F}0M[CC$4,+?_!yc}^u,Q:@ɫ] 9`1w;QSAurfDQa "I IH:fnMU`͏ɺ{ڷO>™&U[aFͮ궒 jTd0F[`f{!%Ht=P|nbmʀq(&؈"XÏ=H*M͏V G£Ǚb'yrB]NgYWF%P5fݯoO'FJtav>{}WXN]-hfJKDV\]=ĩش~tᝃ/i m^8Ey:"<3$aM Xn%3RztﮋrPw:\29~',g,JiHBB ť 5!@*BLʓ0`K"E0k- hqSlu,Y=#Wv]԰`z%~Q\In%e y?4'JR-{yϋ; "+/.`- x3޹\7 an[, c%I@yp}w+: B%Fvrn,Ñ8SkQ`IB$-]]zdu) ѽ5ܭy[F,űVkBvn{ ZT3v2`\OVK(JuFi;qz\9{̗&h>A Ea~f]W~i(F>x;xrB#Dc>qzEQNPT r)/@wǣ/Yg̮|wq0Jp"Cl ,s*V'PuHn=@.Ȁ?T-[FoVN(( pT{R<]!0r۷T4)@Ng~7dE,`qrzA[Hӥm@c8 ɳ* <b{A`^X6y} ebP%A [}O)ͭYZؾG{{j:t87[yX 1dchEZsَ;FP;,֭Yk.G:\0# R_Ts _V}HkmLV=S 쮏O}[Q!!rFDࠛY oDݖmބRmD̐K`DF_~cyck_m̽W ʻ7(Bmt= *^tn>_>2_Pfy~rik^yXgQVCDz &$,w>V%y~~2C N&1envD)a J /*Ċʰrl`^@c;wJ#Gg(APv`ŷI莃" Sf#J`>mM cK@2zKae)BaTH04AE_E 윰C:wWFt^ ,o76i&  "uXo&eAGi󸵹VZD/w!Td!sCX=j~ȥR{So8bFOЁBUm#.6Z ?pA>v˭ cV*Ԟaϖ;dWh(%g"RlƂxmvIme/fEF0 _ʾn=(DD_޻qYom ~~EV`.Q {F^kweU,[I&隚[ R* 9bnwL)`F'[!@-MRt,F@u'TDF9ޓROEgwILỉpNб'a_c[ǁ&5L&b,3I@b+bw~'>O"l4<'G6-N.+ܘ8߁{/L8>&v~/|R}9mWY̙@ 1`ơ+Xr KӶ# (ka,(HnV8HO5-3n32MLn#1wAV H X10"q$vbo. GzDyuBMe@(aN8RD@KbE#Hy}Wg{ CE,,"6P:إfҤSA0;492̓"<" @E>*^ d攜=k }`샗y|$y͎A v˂ ٨S4~xkdp؝8σے7ºTR[3<]@)V\^`60X+a, !U%,KZV^{z6r / EXYq> ƒWչׯ!ȲYxt.FDdzijXvqTQ0Mc讚n7cLdBB-RsIȸ`_;n{s>\N)R0TM BXQ2hqcf#n-yQ oގ@*U [[{~ a?>M4p=PBb/$?ė>Ê"'_*yP@ư:|^_@iycUѪV>BQ+ @!=xv jɭ* -C F+&LFyς(uMA-T >JUF3d[SD{x~ѯ?'V΍T\N†߾r$_/ ^ H),.$o.zWb굌D( kMFIy趔Ap5  0ߍ.q (<0Pa.Ķ_/pwզYRʥr( XpYFܜ>by.9tcZ`.{BPlM",͍7_t>S'ke%<"$Wbu ; ji(2LacĚOi"^H]*|s=6z1@C̠`BXgC d*3 4-uz26,ǑJS @dYFt9KbB0r$=P] P7wpq'f?j/ulj,vk=Bpn"V.jĊIaXr0PDP=4ηϧҜY8W` " -ۆIrÃ*!$^ofsm !$0/]N67z  %7fws}rN ?\_x6ײ օ?̹Mμ^VaKʈGt;7kļ>cam:1&˵<d*"(^f"H^Vhz'&o?̴md08av)ł7uUѵ2hpirRvnll>= WawR6jYyAjEjv_ef+̒^彻6裊| &A@J0ֈ$DnڊDvT8\z7PaX@y%:Hu?Oo3_7LsRZc'}ZTȋ^I4cX)9QB`6aDl쁜`VO+it!(Ŏ~q#*@i ؚ 6nM+nƛWQlZ=ƒ5՞FQT n%eHllF6Y39.QTCP}EB ǟwp&^3e+F;:S(P2L:p456X()`#܎-).dZ_=a=3Ols[?^>pvQLv~ŭ+w'“rځYwٔr؍|?Y8(Dlnٚ}|dak-SyxHJa7Hys#pY~ƹT(K=Pk Ao 6 >ۺ*`\}FY;40>nXZa`;JB.Q 1A݆zEvޮuR.3';^8ew~U*Rl_H1 )kM2t&v&+Lh$ wun٬J~Y lfխhQVt-1+{#3QeVU<Քl L:0&p!!~k[߬~f{rs^szg7 .:E>ȀT 9nV륭{/+R?A^H8"Nڑx_zDrd 24~8|JQtϿs&|?zMQB\0Ś E\m8`qu@BQv@'󰱆[zE (r# 3`׀.XrӤ0FT E$z rbstV]kM쉠H?r7֚ QjMDNj/pS\9P~W<@CpubY.oT#=MV<ʷjDKGE)"TAP(&T^7Đ6}-tLhi#l<\EZ Da,= <Ƀ#ˏ/mVթlO}}u@ضyks4ztBއ: !BOS1 bQ&nSS#jDB!.KG#_!'͏/[p %lO0Npapb8NQmqJi\9h2Vsܒj#@f fKܝW& /}! :_HW=[~u? j ;@?i<RDgo'fyi X!;o"W΍ 7+Y Raw(A;ylCS2 fTPǧ@tR(>EyThKdƔKs#'* I @ b&_*S|",Aa\H(`p[:Sa}[5eɯWPDtᑙ͹ pK[.z۹F *(Ԋ/+䂽p@,(v\卑ڕ''-"qtfvm ,׾XHkSݬԒŪQZ5[T{~aV)~"Mb D&o5Zqs6>iw:x7o??[dp ]%Y*no=+:=ۥT)JUzWfFUb#Xhť_0c~۪vr#s񈘰s4F5- :$1l%H+KőDn/t3.Iзh;!Q($iׯ,dE@ITU`JSJeYq:@lw+5FhǺ1דjn2i @ڟ藂pb{0 ۬͌JjORm\n NinUoןZEm}%B rbu,lM?>>sg=\ G4AtI+]̒v3^%<@ml-Ko_<*VO<7N䵠.QT;㺠%VY3*(F0  {SŝB:6ZBQ ;NACDYƸPlfҡRH5}V ]'ATA[mFVz=bcI+TeJ;tQ ό|S.1U~6S\USAnnl MZq6GճHl~zZ^ jm2Ve!HVUQ!Maȡwͮccֈr AGOd &_pw IИL!bE*ˌrt,/x;Fȶ7+u0P`V'ƣ|̉ !EF'ef3+8TFs[McһQ>x\5y M+YwOh6oI4b\,)Ҥ``c)PxE"9/._aɾz~{99 hrAְ T60Gr|ߺ sQ>VX*,3DCx!-( As JSY&Rr݄ +c{ce XwR2ۼ "U" "5#f]G!N駀~֎=maq *H\?whJ;-x-QTBIO<%r MsuLk#Zww˻Ǝ ?ugq2Z%?% @ ^ xL}']Kn\U_5z/V.("wwȌ&dRTѕJ ")Sr >Z=DN&E=V=?U/d~S3e5XXagL!Yd/$p‹Z;mV%Q̋eo}t7ڳDAܹ6¨ (Ov_Op8<ʩծ?m{ 1(3a"ӕŲ/k"#;aG. | a䏓>@ɏ_GEe%lbX<Y+Н!cK炃A8 w bٍ =>b \}Bԁ-b(9Dr{Y(D|`nxݗg2[+mmo21(pr̃چĀaP=E֭e= okcۗ).%Ud2&ҤZOq koRg*k-N%ksO//`l" xH|#U_?\͛'*@[cǻgE% ]oԎqZ\&ӷĹe .o/탽xYh(CDBU g/8Q.f?ロo@T#R Zx6 :T tA,;B;DfKM=.")Z^05?ZnY{ڛWxle@[L n7ZJ&cIzkৠGϯa[_);';NOdZ4ǗkȞ0.C58fל{5"(!bp6Ơ_䥒# v;vj-P9iKף1HAD!BeXZ|S|1 L B#]TE|[i( *,,s[߷'À{ꔡ03s^N@H\&X ZG ,@s[=%d^rapLƏ]nṟ$>nτyPD$yj>>:{͈[}* Cq^* _Co23jJ!l QvV7g{ȥ֍~;KOh~曭1CoMګGPIx!xQ㱆vZ`15owzQ+.|J#!,kkv%^iR\ ̫BeP4g0ƈxӆZ!tj*/oSV^ֲSV {yBcOn+L .Uv7K#XFA9͊Xk?eO̮XtH!\CϚv*E'Eno 2[/܌>$~>7z3-ly$25i\Ka p2ۥ@.VX[Q{*F(8߹q,,ȓ H5RHځM̜}:59$=/Xc@sP T<5e'7y|bxR~#(,VfۛۆtE ǵjH*Ɂ#b g%p);$ Cal#?ŋ1 C3(T9V([˧?WV *( 7:z VfheARORaߡ&@$* u2vz8jwJ.w!H{[?ܷ 64+5@2D( hs+rN##}Hk!h7ÜZiҮH}vJ\/KBA $!ak*(sKhH烟?u{7A|E񬏣cYl7Y!wy(bN~A'S޷/>}h>ny|cw 7*%DOT#{p8vr`vv D |957ӟ'q4 @."EHa`YujjkEpH-wKc3ۺף`ڐk0Sb9t09a\@ւc;5!XO8 *>퍵`5˥ H`0ރ,-p^衒Y|ᔂ>&kۋG`#WP;ٻ۽#w@%Mz8- d#)Ww3֖Ց-,h Jl4\v GlO,NwֿANOn5~p0Nl Y8?oėGnR RLRIeLւ0hmzۻG}?ޔ}u0}# ^lus9yz}&ֲ*H"Y ZP 87FEvݎݲ1iA8ivu{du{6Oo߻?PS_~ҕ)r]=Y]fW0 98^Pn$샪櫓=u:+ {[?"ϲzvJn #-a3@ bi`p _+)()`!$poΰa&Cgu)6b@qѠ;1*MhD "n `9OQ(ԫ:daEBa$dnw w>EhmoAMwOE(W&7^(P2 vo^/OaTLMmu#T(0x`A才۰LKbbH3v5vz­~W_ƻlPރߠѵGB{<U( [zZn.w *l:X*">LÁ^ddfMJr|C̓7ۋԸABZReE>SQ M snČUؽi10w!>}&]1.*&@@S|ж7o~iOAUp X6o鍙"wñ{0r"9ΪVP<9ٿW7j_G1zE [h~?{>>^ean=aAڽg#r,73.]#̩}JOK)'tK!iE*'eA"٘K!z(q0wA  i1z-z 5̙SyH*EHLnmn|@ҊwZ ЉYks$M^ORMuLJǬP!> 3ӫ;E@(SJXXbyr݇YҫIΔ31sXNK/VU9X0YfT!ʼr RD*V.L!YI@H NfC.>ZC7? ~<,IjvkyfvvwgM jF6"bE C&$T0XS"BTLFWI I#Z}/+VHy{[ R€H[B~e'ʗ*]u98:ck}L@I'kǁv?,N7cd,$[AfNC>8 4fj=)E0_iǚ0I'B Hraߩ[kV K10 ePtE!6@;Аu/(&i #pY S]dL^0ry@)<6sPPt5R]h7mܽ'*%;K]s {k |yfNB~N7H"*ar[xmW\v #?xkaa%El+/>>@&9@`#!rR0Y`FWk.wzWY Z9rxX UX UX Sd֊GVhSBMg~9d +mN1XF]!q @0]>\m1t|1Bu|6rK#E`^[]qjXt=l~*Wjn3+U޽0 t%j!"P%Ⱥ#91u'؜4i ͙pdi}M%TP$L$^~{ K+q籽vbP\)NI~*,PT֝X!ZJb~㙤" ^aT|Xk-Gu)ACؑ|.;u< cZ0Y(FQg2Y\>~ 4.# MmY BJ`S ,ÀR>rĈ;<ݿXxGɚ?nP{`0+o`gAso~JHe0r'8}y*ȱi"{p|R+ . j*gW ,r" e^j)J[Fr"6P\$"^N{N.]xN޿)"l`*RD(4EEگW t<}[n&07z9ߘ_ongv+8QPȀ(&WADq:2>xvHښzqӦP[=mvyAL|P\۫=J?5>@2dO!7`}tto!D;eSXZ"w@)E$:mR~g=ЀH:Dc2asZgyH@5R K[7@vwX RB+9X0ڬZeB,Z@ #bV  ~?$ ~($ݵ̓(ݽqn sioY&kbp> d1=m"s3S /]Ocd&nU@`&od~w9z-'s#0+GD];I DPײ`R +5FP\kQ&-eHq9ϓTW**JzNO?B:zuAkD%cR&/N46xf-HWJ蠴[2FDzcj3Ɵs[rT%,rP,f ﶶ1^~y& M*f~i^k(E΁`ScoLnUhraK~kihEwe\ 1ߪI?r t/rV[-udU1 ?ϣH'xI&cH*BC_1o6KDPlgBNV4BwW瓻WGgpSr-v;Vo TV$o>bCZIA>qa1֋$AXaAFoJ$˯ j VF{aDfRY(]ZY+}he@=jھ3ᄁ5MVuxk6kgɁ*›R8YB7 MD@QjM vHJ"i6,YmfuL-ɺk'ώ,`8j\ t0Shr#;OF+خjT pZ3WzA>\Gr_UKߞŏn1%Z"Jwݏ^;mKg&ZJ޼R>kEMlĔXt**t>0ȟgwnW*L[-kӥEk1?i.En)ϒk_Btvex6cMa t64 ,a frVJy[  Gǩ 3N^f (_e6+'D->[{k7uXTh pa<:ST@R<&b`F _)]˖mm7j7[gX V$GԻ+ BྦGbPI5oOW\&+r>*Oʗₘ(;!TH h.d|K _& [j$z.< m;Sc"P1+;KW5±z퐤l-JEypn*So>LP "%YoN7 PPkq9䌢*=)UL@a:caV7͈(DHoVjV4sȮj[y{ۿ.~= T>rzmϧnܞj5 TRXoO0@Dc?VoO?'y+>U"dgYlrYlXЀcj·[ t\,֕9`$g/0^޻|H MBgn@SӤEz/.!Kd1{!RH ; nz *nB=gd)yNM{pfְd E- KB:FFnb;~vO`t  "` z$ֵ =X\(>xރb@D$K\RXg76M^:fˍy]4=9vgU_j_ @d =p!32j$!DbW})b~w(- A!Q  /< +-GIlKfE>ejR!gF>n_4w6`ٴZX*i@6RVj =fЌ)P~5}Uݜʚ#"yoך}x\^w)3"[?+6;ofߟ{a[þFȾ=OmT쳻rhRؽB5n:)-S7/NG$7bJZc柂Ou6W68 =ax?`aw]܏~Ū"pRy %ff^R3pxq/2Jف.cu(JċpE (i"TiRy.?3nG\e"0i@, j7 s:sU2T?fR |XnD(L Lp>nwA{\8bWm+*FDb "`iQǭtyk}IqDqŦmDCs:"JFU5BˈhQ%:+psѧCTg{7&k+DJaT mٮM ' ԇWVD*oxŊ!VJÇ#w<&|yO^sSGG4>R-Z{Zg"եɿ$ѧH7w~W(8;m)vb7:SQ@:"[~͏:9Q.XL Ej17k^W"(WT/ktp4!C^ 5O\`s.3*, U w{ HJqfH)7 XV|v>nL..(`03ZAܷ*8,wV}&x0hieG_  `>TFzg  $\AZwQ0\諐F'+duycNRO9V'(4dkpنӟF-ML_ ?HzLেh]#*7hvܚܪ]]Nf6GJ)cZ@YG߲`;(Xog#V,mqeϭ.Tn@]2.@ҩ2"T$"/C.|!P&-p ABCg9xa-,,˜XRaI X9eo tƁG4; =y3]f[ ܱU,Fn|BpAB\E`c}!~" ߱_k?|=G/~ňG6%̣'wJ-CjdO~a#֛EԻ{w] -!6jRe"rokׄWo" ec>rz+fBH`d%A yLl 1##HE-z۷ &lEBl]11x;BNx#  REBQ5ҽ'*;\<C&pkZ )!F1 `U?Bajb-(nmW{;} z)AܨW]@.WJ"* o=3:6yf 6gU^e%z(mޏ~oTj!/UrVT0@=.yIp-(Ncgzġ"/jZm-" /,ee_aQd B­6bm/ hEiq`'Rg%Q=+7BjNY[;y"`$۫9A@)Xqr^^6"%2&v^J$OLd֪jDHʹ~I At 3;@u5MےcŪ˨vi_~3/> /7o֛o/ ((D/olnCTt( !_]P?avl[a6ssY;7QaD!%M/Zk6~'{fdtҙīfnDCѷ^Z :.Xw@P1sobt];/3̷Cbz[Hm2v) p^8ܘǀȀmnH A PDjpy[Dnp6u165" bn'le$"ы,-,"<+( B>yDcNAN( Y'뵧@ҫ{.xJGX# XF(ЁP*0iڠt?Y[['-gݫ7촠y "!۝n4ucs"8z` &5dU.m;TjyNZ=ak,՛[}$FfmhcJy_&]{j6ŵe""jKJP©i#c-tPÏAa*C;  VwMV?v0OdrD:oW?iA!>}s7Rv 4Dak0F&YaUc*4.֭:j ^)cj>Ósa 6n\Q0G`nCHHHJ+圥pw$jPJn7q卥/%oDTH[PqXp&{O ىcWQ([Rړ 2dx wIYUi8OtX1k&Q@@LZɱG&zT26` $בս̜je,):_ Z 'B3%x-jl6Zᴭk)e$Xo @:}&۵;=8Ge=$cw0¸-RMlqp{E1"W5.j襧w+Y4_‚˯_?~gOQVJ *8_"\S('*nYID0(ٸKQpQacQN7&(Į"EvDfLztAZDܨ wjЮXalp{J8aMF o hsu0 9 )l4p@>.HX(`ٞ $ڼ !+vApyC"42 ֤( ugRxj(ȴ7MsςE/*2|,Hd@G8TlWo~[qժMHhEelո: &bReLr tJr/$PF9QƏm0 o(ץl_,gZZQ(XChv筂RF|HZ -1?]C@W[ƥܿ=e{J/w Z{}>^ժ}ᗿFDJǷ7?.WϒyЋ%|`4<b%7DŽlf=eWV:(64\^9!y3k4ztHW;&âPRM*}(epZ`кZ)z\G~Vi@98U Ҁcm0\^HJJeBBTLBn3>[.  ?abl/4h@Gm~A~:Hx³fو+ TuHݚ_1{o:I0bFKw5e3XHӱV^G8@¹596+dA,qӵg+dtZAiY3ݮ7a|&jT(|RZ+z6*uR+" t>U%<r bJ3[8eb DGA{r&fDQPɖ)02է[j _9lq4[Po&@C[!"|ŋ:2n[G6?_fObtX ׮,Rw/W>Amec~H) ;ݝek%5HnhW[3ؤb1!V:-^R h=:-s JY-gt*}SQXqPoCnyNWDM p@< w@~f1`;. yG+b2~_kXXɳX,-PTɳ_YD2zYTl5ppBCFǕgH}4:HQkv^D1UҤeFbg:}X''N$OOl*3 ҷX,k"7'n|[+6]qgYb`t* ƶɚMMR76LI6TZXFQGjsb_b@ -̚< ո-,F[s]Êؾ޲qgN7n3+5X?P, .T6Q ~q'l_2Pp_:*_ߨ~?;UPk4O^_߬sa.7a >@z[`Mzsy"@+{h e: |netL]˷<}6m |鳱jy^l1sVTLp,#wS2mLPoO+3dA'jeIq<DW#~ǏݕbkD0E\Ԥ_PH 6nJ %,x6Z6Vh`RŁɋ{`ZiBS g"oɭ#{Q-wJ,bmuZPkRe9Oӳ3JxDoVpsAME{j [6VsvmM4:LUvtH8[J°gjxz\a +vZ音O#2 5wo,Rkkih7X gFBTUV9 zx'~|ɒj%@ |Lr'ߨãݼx񽻈rܭ֑0iwJ7uk!]hՃK~}5 3[/h^pP?6R2 )fa g1d^{ R .`?"&+%iocM 뎐xbr켂.0F;3[SԎ c'Ay+slsz@ʿsVEn{VF,rHnצP 0-0@|! );Pjo ER.ӦPs\e2lCruwϮ6Q8; 1v{Cff;>,Po*9Gn/޺ "<${] _`O?1.ݖ}B@'EDc!JUT)%}w M#'σ%;N~=޾'rA}%dJZU2MwXkd63fں4-GR5ҔZTbHAb_/3!^uVbkG١8ʝ> 3JZG+-"xD(TB$ɒ$D95:|c A" J%"k{]Çۯ#S@1d})wozjNjϞ@o_Za(N«\!aFKٝ~}fGh7T<n JLh,@rOoJ)u1b [l|kX3MN+ Wɬ px*Q 6Q?LE]w(dXS9ZHwpK`c9V!,H@J1 H#_23nDWNN^+ͣc bE$v7& E]H.x끡 O܃9@0(w&ܓuN]qlAu⬮jA!dRڍY)8%O >gx~^}2 0# Ϫ/|\i$Qk1ρdi7jaUpmpZ"-"֪tgbB0kN00T R+ݨ=. h"dYdI 6[Q5 !sȾ=ozM`P3aDT(bvRPß~ԕ3?}y!A+@-#!)YG 3DZ.i Z%Y;FǧǽQ ɟαU&TЊAv{BR]F3/v*AbKWO\9c)?_1osXnD"Ny;mvi)TRwvɢ@۟؉hb2#ģUWx¢*g#G{w֤ X )Ya'gˁB.ly$ZkF-YSXژLBh,;{ JlcQu>+ EC4ona w6e:+ RX#+AҎņ ìUT˫w&[3!uMzi-ഫ)?ߐ I5Ztt敝!B3kUyx;08ų%PZ޻ӗQAxjQyD4bk3~pnBy8hH¼(It ]alAû XP([PIlR5PSy?9:MǠkd: ,&f_Ecz饖y}fSo/;ߜ~mB#"_Ш{svKZ;TQw1/,, .t5N֘{)ZP l}X+7k0ȿ;"e#qgTR8B"t7!Ō ."`K@Ɠ aɘ3h0@TB%yK@ҩ#G 3JFtrotMvV7]ۦe$ouqt(`ߝ|T&Ň8*iX~39]EZ ?MU1T *"T2{J!Ȱqj `ړ>\Ae bOt TSу2PDt5B %E0;*f 3ƺb5lv)  V3=vHi21/(N,` ttx}#u ~zbIyQ DQ Xl77?yd(WvG@Ʌåmto;D+ =0%7wxg/o;ZXGwmހ"fT], ]onyRcCGwn6܉:73|O7BG-cA%HU#fG1d ӏהVB38S)Ђ \xut$fW/({9YFw vPM㎛Iǯ 'PAɵDb2 XTVNW#nƟJyi4BG9{9\ >pBxT(,bE8%PD"p1:O$jpe2q_sJ ǽ~>/`>+pҁl67*VRY"mT6z#"ܱ23OI :e/[͊B z+`a 9eA,זYXݜ=S_\$ ^<:f2NӇ@e @c11!eVӭ@TM2뙎VLn郀7XA;X?$|pVv(NmTC"_ N|aFʵ_x7Ja6n>@Uk?~bNUS6I@?yO;/Lu}ΕbPڥ\x쑳A^#MRĽ)ɎSeNH%R"ff2Ohw'?t8!3 +OlyGit RSm\;(4lcZy*N4cDA(A0FdWR>s+Z^qwl**T3Е fkR|ϝ]JyDd1}٠Rx1o8nF+ r^҇P`6ȣhaQ! oFe좍ܥ1bi2 %l٦ͭ]OT.lY+AД qyۯ$֍&p כ`mڪ6!h"afIR)Ck#F=-6T銉.R1MwscD`t2k2Fc$J9@G!xrӿ6 %I!={~V @*t^)+*mB?cg?iݛyؑa?R{:$]}7&T,}T ?^_=Ft>9"Mg\J1+$$1J]Qg# ؼ(*M뙛~aƟ/gKVaQԾ*u6Oζ*&ʈKZ1Q^ @E=X1veb arC3u( M&ƀ8Ƀ6=}WoꊼZ'! 67ZtS'.pl%F;l߰CII?0fL@P)#d;ҽRS@7)%t9ɰL{c_,ݣ~{7l4[' }sU+6@TE|^s'B!%9E5'3-_9R|ga- PgۃTtYEr,jْ2j}8XTAl2BAlotaY;0!"_9iBb`ߙ?B` [,mXywA `/?xj̥NFx>V֤(*)g~c9lmL/}Dboe6>An\z`*@BE)\4ǀI–-3ѣgYa޼!ODPld:4Gg#/}T!O^. $+;ORyK|W,*NJ_Uk]@[+8! ˝xS 8 [֠$.w(NJ_aQ혊Âή'6b.` F ZHC'#O\ )muVQK{jW.:ߚs$Ewve~f]kyH$`-?0):]GHnZnhF1XZl0@TLͨ"`Ҥ[fĈ3!yh@9Yɻ@)rTPCp#Sf6r"V楀bNq}F]L2vԢxdZPQ0& = _W-K_R#5uQW_=h/w߭o:n6?ά[FL)Ԟ3AΗ;$'H- 5@`|ˇ5íd X2"LҎC,qOgײfwn?McMDY6wPp6ɬlWd>a@/.Vh2##KfDٽ>uB33x!!eae$f+* }C g蘆WFb3 nQnjJ#˗|""D28DD!k'Eϒ[k&9\ n]ZOA`w5b]>t=ydytbxXtoZ3H7W?rr8@* 6[ b w`PӘm[NmrF@6CLi a@,i[p@W[A)ճŲXPQY;MO@eĤMs'ClIDH)}_SwύfĔȩ6c$kdð;5$BH'4,ІB'Oe_T? ]gAwoii>z \'; ?汐A?>,93*XcաVc߼;-ՁPlE*ONX{{/={? > ظ3xKr gX oF0,8~X+&k\a&A% "ΐP"QՂPF -$MkkDf\: ! [C[ѭ=8 [ivDH XY3(+&LΩJ<{Aa.(sƝr;sٞwJ9 < :A+`%^8T;U{5uo3":! BHت=u}6w\ 2=KȨ+۫+DЙcd%((=3eF&07Ju7` |YKYHDO`!4;q6Fbzw$""$E폷3,= jj]3_ lƭ҂-e>9`˄kzgN\3njW+n\04+~Cpbo/gtq7B,Gx4HcY?ϫ 16|Ix#sv(7ss%A\bQ89>7` К/paLج\?8:"V(5k6FpOscsɸH&ZB9 [d@eݹ´R<ؗO*:Ez*%fYR9Gz:r-ZِI*RYڱ[\q'C'鋰 [u$ӠF$i݊g"%F+0jow UWtnN/ߙ>o_T+xv TJsF U,Xk71.$lS}el.=vH@,&I25n05cS9aucf0x}gL%C h h|Jz[8B#Zϝ]O +2%~c" "h-MUuq%pMlu_( !;ߘ}y*'I~RƍƵD4m?sZW4B!?>?"\N6QSN*yXL>2$j~IZ+W;39uRǢ2i<~ TS+ϻB@b`X d'ĸ; EXihϻ "0#E)#>X*#x,Hq|zZb֟I2|*D$ǟIoGo.%;_"`Z挨&P5'ڦ Pu~p!w*E׋~ǣ. ,B- *P5@aRz =Fc$Z5uSD[q@,>\5ur}B@Njne8> a&H(?=ADlMf7*S FiFP,&[T(e2#E;q bVY "b ˡ#X$YJzxۢTwY$" 4Jw>:pqDٸNN !2{X#UzJ٭໏=x{cAw ?2V JW7"X V?]o?~n' Zƺ6܉irKÁ8?mn_'J)y{HL?n:3at͗N@ǝvu,z"@>v51N'seDK=s<'4#l3 y=,TyݿOq,ӯlk 󰓸dROMU@).l{vꋁPO]=̮ T>ad<~-I!Sκ y40}ud(f$=̴rBE@[ץgEad˕>Ip_hN=x.]aH}3b1t]Po߈²EGL!h )fC`i'[i@(l SPU²RUa<4v gt4 KO\ -l];d l@Wοs=0oS`F/-v+H߽5f{r3ĠJWj{HPn\"=w齤[pa w?'C[iDG5>qkc{>rGի.a^0e >"@DU>LfEI~`qv,0/sqC'HDDucz (c=C&  0by""1Ɖ1vWtX_:4nRy@k*D(Q% }2YGYaGAEjOXOYGl5BP5ʌV65u[#r0L7TY-lֈs`G°\ ٰk٦mڹ"QpחeM!EΧk)~PqY՝iش {:1DCWE?ҳ?%tJ&/K޵o=A*{+}7sut܀IroGhMr}E,KQk S!UI:~v,P Xv2 |u9ȍ 0 3Y[!JEߜy>ߔ)Z#0!cz73Y;mS6h "W..?3oOٓ쟽|J'ZןUw:ng|2JAѿ/~2R8\ B 3N` DakMڿjZz[YT֏s&R€yIĈs>rW+}|ґ(~[TĚ s[;х=s\1yKHj,lN{Bssso Bf A)n|">'xw nϒ#FW a z38wmc1)B?y;T~pʠͩ y HM0X~; +P$2U`rg#A~qtgil-wnquD)Bn POj`}80Sa&diku'U$  [+VL*L#rjNo[I ef!y"D`%T+D"B `R)tw^m7Hm" ?^#rE*"q+I7ҜM;`E-y%}DA{_Zx_mXi??{VLҲ}4j_J#hї?UCr#0II`& nmr+:U""B3@+3, {2l}8|x2"& Sm\*3)D|1W*0wƂ"b\"~ʊNXz8O4105S|j%RJFڗ (*)B$/ye7{f&)B**0Y `Xyrt ^Xע1=_9J\nK|ndJD~*ˢz2 +w#訪N-?=-f5jN]Lԣ!Qm"TP޷Ef\ pcdlc$f7eBw.UFF+a))[O-Qٟ _|R,t`U:  :U|:*lVEǹZCG0maC-TABsy^4C_Q~4*Z*[<=9vo}i|f7ϗ/> 6CVJ1x6U0ݘ˗Q~;Mm }N?-ubBzŒ 8qa+`?6k]Cr8 <£~o:@ Ы㽊]6Lbk@URJ(m]]C9]rVb,HmFVS2 |8 .SA+֡ Bh tDwIq6|8Xnc,fy%L1$_Yw^~!^kJB)@9Ѯm{R7{wvx)Q;nDŔΟ M囔\$ֲpC3B,X Il2ʰlNKZ)$.8Vn7p2s)1ek%pY84VUXz/ȁyNtDRf]:\nBPy{qX$# ⾭W.ҙ3xr ٘2(OUX<8=J`X{_[|.`BnNUJ_4R,4gB4rwMgAǙ7\UU( *kaP0i6h))!~ ~VE%% n #,pD*ΉKх|,SP~|s{X|݀ h~'瞨UJg<#Ab}^j"WmpqۨVD5iDD[L^%ÕT֨ :+0c̩C/-[%k-5Iwc+#5*T-Aʽ # *p;nnnz+Q:X B񅆻k SKpcea`w$ԵҚ|'mVsT,Ӊ>g˖H*nWBmZ9aLt@^˂JxTd6NGW{CA  HґXPzχ s/N ƞ뵇]| BzoB:YO}MzZU&8w ̈́ҍmlm Y_$VDVYJϬsllO/E @g+ +XXKH6Jt%Eph eh[& +!jkTT@ 6_V& ? Do2]ٱZJYmw6[fYTJiw^?vķxAd#jɯII&ڐd֌QZx񛧞HH )Lj)9q(qf1?^"Peok@\B"d6LΒFq}|ޝʋOp1+:B=ŵo(T 7p7;fI\ UHH_ppJxw W;˕wְ3XZ̲HVD  I= _"niA +@SұV Gxm-5SPUQݾe0aGQ>K (=HaJ`oAeYjҭaWnD |h8%ufUIZ n[ MY9kUP[REEYq<u?<|ߕW>UwNF2O*^lFrj]m[I _|a. W}P)Uto'annYUfY8*kW^dB%+BeQ J{ZkGz Y "qwve{%8OCJ t#0[C6H &("R$6|G;a=+C(-3~P@fJbk,'-iVJ[n?抙"^ڷo,GbLϝ_{! tڏyb9IPFL3 a3(I jDS;= :J̏ l* 5lZ5i@pD*BUҩrb,¶3؃mB3~}zG uS 7d/WY5 B4,ۡm$e{_ZTV Lf'MygKEO ^_dNTS|zxs\ ,\Fo 7rg*J9r7#MccWv_zOVҟm>s*Hwa^Y@W:,ĹӯD¨Zpx5̎ yQVɶG$F@kRaf +Z^f' 4(0|ٌ{9<&x,5{6XQ5"XfAa?EX8I%s+Lu %y4#&} <=L(ՋWBVZ~1?:X}CJJC V޳lWu`nikHC!V6Dͻn0.mϬy *lj-WZ9lBBUĚv.IY@s˲ũ@npyz*"g{fP:GD!@U "jkcߝl3q@j" T Q:OX~eI<֕m>BbĢysW*o:wˍ{>ˉu;5Bctoc zW_F)sBzܼQE}xE>[EIjޜ:۹VW:”k5M״9%*)\`?:.0]3"HHvF}QHN#\ ;"X1IZ-vڻ"=R)] Zcl8$k# ;8(ђ ,!RJ0^%H㪠qJh",yçz^bLt![hR]˶N#[ݓ=~pPi&-\^9GK;+b_ށm8;E"Pᓼ Pr'4@ΙiA5@ZNW -y(EgVa[b>!"!Y~,*JhS 6blfcr K?nsҼHڲ 2w2ӅSn M;_~dfW@{{;SMHJ wonCtwL}@R !aNzW7z@KfOigvIn"A+gP%}^RKT&0Ûo>} JΎ`S+^k{:)6, 5B6I%eizMa31y+g^qKwJ ɀJU@L=XfdlmtxlPƒOW/],_}J4 [b;yv6Mm)ޞ36-ykt~`d@`x YP[.sFU9U+v÷ť^*/Jk];`s,*rƽ4Yv7:Zs<O=n )| ^ DX3`һWw ;Q9,3k*U6Te+bQYf\9.|ݲڸC=[t%\gKm:)p:@~od=udO7{,V)`SX BϘ: .2W] $ot 8hW-v8,gFM h;6;ݽ vy#|GPl6;ovteC+GH.~d**R$DDM}kG^|$ قPFJfgzv_T0* RpA|E AH ^P# 8\¨ ؑEAZ,Ζȩ=MnCK+/&Pn{ ԕtl, AHdڨlcC邩/=j?T(TJsҳ$Vseٌpk^6B5k5ƴH8I 5iꌚ7K$|r)E#+ -Ch7Ok޽{tTu:/XcoXTH,㍴>%6k}jqØ;wP :NMlj5IҽK%?=Y|rd]wNC3o)Ap"f,Ṵ(վ^N\H\ MBrsLe:€յ6((f K J.HQ;҈;„&e& pvqxD^*G[/l$`,r4HaհpB!Zx< W~z?h O(@"oW-wvp!)"dcmI;bU=%*޺ߨ)B/QlbW+ <[*hmv}Qk̟hw OsoXgJ]V$Ӈ*wɝPgN#3T@R\h))YF }=fjM9rD$6֎Z84@baxVOp I0&iۢ"CaO`w*d)CO:ފc?%۵F l),dZtmظt7ڵѥ~9J9s6ksC"v'o*Њ b82݃T-a?n?d1MVZ;Xg#A9rݘPھBTWs`WFxP'R>Dʟ m @h%/>44 *fŸvqjvgؖwBP$٤Q&-!*roleAxSq8?m8pƉ+c`w``$?bv@S""Ί"h^jfeYIWHa0?`D4h^XavqDywk&T~%V{* h J7rѻTK7փ=|#w_`H5YV}[ }:vLU'0:3 EG'0LD+fR W p&h2Ɗ#~7{! #pR1iʓ-$aT.h@gFĀXucjv0S0K'Yi6{mQZR)DP ؄bh, Cz`Vo%/p?/N[&RiJ)ھ9\K\ڊyfPl4fey7^5H,Ά[\Yo[fP n He0ܙP"^{yցG1=4m}%m+ej}0 H(oQWnXxfO}/.V|a; 0({~-@¢,sgD6)wvdAfR|r;LJF=K8'`7wIY,CiHƻ=y%~% 4q(*d: E0;ft+&/,*yΩ bFkͧS%<}셐1T wO98A@`- ˷C6r0e`, [I&A)ͬYzMP({\۳5ZW!D撾p}D׬frIHb ? ISU\)FN75I<Ʉ?#돍R=jMٚ}o>_[VFfa=^S{wGz01&DiZ,>F& яTP͊m$r:ݻv*Ki;3 ?#<'fTR\L[P T;Y F#c6 g*+@Fck 0d[&wPeT./]73;%$ V}%B{/*SԣP֮7Cق.aF3RmUPRx?TFBT΋돧+iw1DpJʶH44|FunTlBΉ T C)A>BF!Ǚ+S?8dZQ&)eTAUpp%`])t{zYZ̾b׷;nAXOӷU#a}3x:vmk}@#wYP fH>H)e"5lv(Nqi+BTIL{]r2i"Me[GlVq~d, }P`! bN[Zq}7M__f?n@[Cw[N[?KO5{닕F/Kx|5fN.CYυJjf1NLPE9;OKl.`٥rnbЉ *]gT\w*ҥ֭J7 (7gZwSI_[$Qk(]7ֱHYͧA[/>[S_ UfB(L[F-q@8/ hDa~,af迉?BP4x}Zr%Itv3Oca%TJib%vƒx%( C) B~%̋>4!LƝj^@HMRj5,5w#boM_)k}zO>QT\s}~lv>y+VۇZ-ª*:-4wb}dg1*qKñJ$E\!b@TJs)IG (i^]LOdM)!`bf8_lmb2Y3݌[\_LM^}N?}Ub@w^[6p4]Fvګks/奐Bk͍oo]] 5w7XT䮂WJhkKuEyyqz=bK_2=6M"R Z; Amd]4Q+.\\Y&yGP$VHb,sn'R0&8? rQ#c# "riR 0' r30;;f&D.*S  ,P_[&*H ^I"Ξc (HV&y(5qQ)*D[4cfaR2}u-lpƽ+@`~FgKt gk#r _;Pt vxo#AdN;(ԍYr$L6Y#jkHS{(ɲU)@dJ(&L!,1n?Pew`FnXd@‚x'̰czC@L/-X",|9GnQeӒuňT@Ÿ r+dҍoGoq0  w Ȋ=? ˝Ȝxu1ywI+ὕ_§vhQvq/v~qVPC{zK/Iٕ뉢gоUJ@jܰ헑{{IN%*F?tYŔ\no8.&FX5%ЕAc& w3Y|-B$lH}2D^ ,~Q3tcWK JIҡHZB6?s=&>[w|~'Zd 7]}ogf(xhܘbg{hή0a̓@IDQJ]pm ^z8=OB9YnMYTAir!U*QU=l S1) @/b%Hb0ֵ4I#:~# "bfQe:XLd4q,BǁyD?7D_IEP,+*0R>謡e`߻?3t*rmX9RfPkrhG2FsfFC^$b엏 /?w_YiL'Dž)3[ x'o kbiR<>GH8GF7 &j٥EFd+B4-ltݭaot" B BG +׶+.ӡ 7 Ov0 vL~2˯G<ń_ [^J ַ7%Iصo LEqވ]ݸ CTӋiמc ŗapgKk}] stÅ Z$725{bX%%1;j.2ݞ]ATGOb 0z?(҄ZT 3"m$ 26`@ǣWLe 3KQ6&`Mw*6@?ʽ sGh>[.Rߩ/v1f$'˥0^Ύ|e؃3N=Yͱ2 wS޵oL/ Mk-k6kbPTy,ꭽ2/($prŹro+C,E4v'rt E=ɅWAfAfNV?Ѣ뀈PA9rjZɆYآbY烀\ PgE-:qgx|6Ġ$!q5 J?7y+Jn\I[Cn2 |NM2$_&iR 1{ ޭ5FxD?zj]:;dí]kweY>}'k'ySfnl N (^¾ssW `^~fu;]"jRUJK*Gr!["+ Lj_YT)e@P: (*aho"HH $J_jbžU}X}#%\6^I<(_L?7S%8a]CUR(x?$@f?X 0bA>"B%0g+bYbf0b@Jj@MEyקg?ѝFL#KGJٵ3`bEs583 d[`pP Da%Vqve`+-a~d9z_ADm!R2YCDR.τqOH XD6. J`0<__EĦ~YpPE|DXQ젋 ""Ka2 xmșB=L̦ IKaں|䞺FB;] 0yg+Ma]mʉ/APJy<xɺY\[4HcFRG wucȑ '>RѼ8Y2e~/b>~R,XMh[ i*5YW9'|R~!_'Ό,mj[?QVTEɶq$g`+2zE[ը(%[gׇe:yn,B2(5& >ѐ"ŹŕSnH Nܰ؈{1 Ib0B啉CMkk=ߔHJU]"S%IEYƾC [KKS`@5n)a(cBv 7fff6N @1Ty7'k}/ _6_@ ֵ[D1Ot 7 Q@6;k/EHʝo,nez1L̨~H ~1@!"h7}?2^ u_Z{vh,|`%q+\j1d WPM|@M,F(`bfyO0;@֕"`زeN0Mթj( о8XU*,8gnZPeg/u5;v/huryS?*Inë%.oJZ-!dAzIazo#SB[o<4=29^R{{4nߙ\jM=)D7 ̎ŭYEU D')P3T5m$PnбH.u޵Jj ĞF쭸^TY@UK#kőޓŅE%jB60V'6bI @1adךLAd #яO'TÎZ`jհ[c^_wF(Eϲ``߭~PF[FW AirM.\&lfwU 솭1+r/Kr3Duoh aTBLDͿ}N;?זz'a'h6[mA, ́] `z\m<9e$aQ"gƲa;L @l6*&@!wYo~$q92&;/9_ |ɛ Sh]( 0jI-$jO?<6u+k GKJ^ Ns?I,hse'pF_ڼn:Qۆt2Ҿ؁^B ˒س]x3 l l wZq)۪7*< nI8 S~-!"_np3-IjT ,b!ZADux<݌Yhk! :MmWN>~|:҃FEEdU jhq4ԕH~@?|NW Z,~Ĝ8tm1/3#Jf7PCϾD u`nb}8"xؕ ^Fӝ u+WNz7Ⱦt;o*!]Un_߃úa%cmv5<2T3tŋ3%#7+Fx^qј ~*;5_ksIŚ;1Uu^)E IF E{ᮛt*RU~ a3B Xov܏Yi|u@H㦟qV. "1@Hڤ烃iNN4L=$zOvEHڹ=gUޫk#H0Ν@yQI$9(`fa7~2={ւzԬʍhbE>njXߥ41S^G,0`C.rBd YGF[oh ;Dl5;QknjGTnՒVJQ(@+[Ձ;] sV cGaMґ͂h; EIE L0瓻38H#\ D3KATI|knxUƃa z4!`%>$z4ٚ]6+[p$<;\  ll~Gת䴗rt)©)D֚lG_98˛Ei4f* 1t Q֫,Ac A ZG% TzQ nQJ+3-TMr!B ASLB!rHB-(J=?5WL|!dn[nspNV>[bn=1]_^\͠M1X\p!Ř+KH XGpp!,{UȞPR1k#o1 8vvb +ՠZ Tn"AUڛl Ƭ{%!R]>̑gT&E a* 9ZQ8M'OK|$5} 2F,\k/k۳[}gk~pt; ugOdŝ#'=2]4!o@ H00,eMQߌZښ. 6*쇋l5YY\X\W#3e0 U/B1SH^m!W2[H@]pRea `4\fN!mRϘ}='<ɯ'DK?|/jT o c'T .ӨœFENފޏwsG~xJ:ܢK_<]"P1k}1=c7J/BΏ>Fwk~y*SDXO12>wVSZtgԖ["E& ($y_ -L20k?vvPːo+?V 92llLAѨW+V%@0 cIRS:W &jJbRyK:Ke2`Ht+h?T± YkJkߚJC ĤIrs\si  V.>rCY""d۳6`_.`z;nΈL. c=&YNv2#|nH=IB= \4d"VBBu:ݲ8 L"TA]РdՎ%˨øZld¡PHP$7e<%]~b퓧QQΓ|fQ|#MA,p>D_/=N­!_9)H+ 3O]6-6 ջͲy"w(@P>.ٍ TK9o嚡,p BuZ`ak*6I!*m'\R&1w+y.9JlLBU1l>I1̤Nod#rT t(RJ9hUuBDfF"sdl m R sc&PDGE/k K,<:K ȹ$\꽿S2պҐfl:+ғ־ʃ ӿܿ/MB@dus>x$ҭfmCDZ}d2+s/+3{}IgehA-$ pjGⶡ_ŋ'(!%Aa` e+DH5*GUٶ6+ʋ-dHH;ðR# PQAY["JipHjaGګ +E<r? @+ {_=A#@)dcjlw;WOQZfG_hb6^ivWD/fl:o,Kmت*@8 O7sB ?u2;/￯Y!]G]aK8Z@vLt5a'zt{؏cFo9\Z}$;EPيMFnz\ 5 Q*TFp;9V rcە:k\ECɍlrFq_|B~y)С^&|kP~M 32YPyQ$\7.=t]]TN7{Ձ-F7.6-{-~#ޭ,Qd dzs~! J3M!n01v/U{]{^[>yυ#I ԡ'&hAZMTS Yvo(%GkWx?f@dISd^ [@l"y~l]uL")E0ڸә1kF6?؜{o4)t[O=6MHф68s zBr~1CM־WQn>%O]s o6͵2 c )Q GxWVNkTJ" Ba67@9HZI@x$q ^+@ud˲ ~MF,+V~NTNԡ R+ESms:@ȰkzwEF\^CytpWok`ݛ ψ]T7pI:nTD"DwIofCjo72`ocRELy3""Q43eL^bMuB&]4j X0(n3;0A+A &O2rבIRRkOq,mEJPGuϞ_3eO|orΖ~un )"`+xHփǾG|QiO^ҡ?XVXDxC-kv2 p*`+nJ N jnW+l\ya9ٶ3GՉhgnӮ-ӨʒzI|F!jε$VY٦_m9\s̚iBW l֤xr`WZ5VED$:4褲w!i"lVh %$@vG]SԸ_!KТ9 B30)A ֊&zG:{R@ȝ>=I:\,?].Uh?(q~8omQQ޵0ߔlfoEARpW`* ȴTnNhPAK2 12)JZg=URm2.<5eD"qgKf'+rwjR *> -Ub]:y1a@t!TؿrS$m)>6'O2BzC($ k5m { }xd6zuP vq~ݺ1@X1.^={S=ꙍ_*f,?ӲѼTGֳS ;@(l37*8YFR3h1͒-YW\`ڭwJͱgP8AXl7Vʲ[UFެzH)+@k<0oj7wۈ ^>!$8 3AVEn E7A/"ȥ69ӥ n6q,@ !#-۔-(NG_V:ėBOvtdqv0oo̺}4ͼ-3+ "ils*-O֨oTMlذI6 Tv9Q-58 G_e-JS|I  aPKb\eAi֕^DDz+zhJAU`AAZ4@f)BYA EtlV P@BOt'a2cN=7$oAD#ZjW;L_?hf_x|7_cR_WJ\Ҋh&ע5 4IG'+_[lFSbaeMD4I*f<ܲ È\hko8bFC[ck,ǣ(5+N=שi"tx zwPvg?W@&5q*f,"h2UўEθKՐ̒ipj=(5c憱b8no o^Z}L>z/}ljp7owxpy~ [nd@jbamsfiـi\h Q"JY$C q8烼5"œDYJp {o7I Xe9F"4Cx{iw9dBIwт&;]!Jɟ)/n|@ZRDMFT9URc{G㗞U{!сg,꺠N3|Q=ر99b;¶>Zq"6 rPK;Oۥr,oGx.H+Trϋ> ؼN-@z}jEJ!)A):v38k!f<%!Ä:Y N Sh^2pM2D"W jT\ Hb 5 SoO2lIwdI+hk ujWD㞈ru;Rs)`ÈQJ +Y!zʼnQ9Wk-ߍՉ EXNI500I78*aF(E^*tWP\_5,`n=*3"ӈӖV֗],:;Ofڽ^E{EѕՅs=0,N;?LuV޺xUtP`lԒ7ᮟ\8l<2/w d6_Ti ˣYX$R_n$lOϷ`ka߫iŭS(nrE90?Vټt%D-yjVU^bGT5[vVRJ~`azC.w_Ţ$hcf/n(R30- 9O(,%'T" YLE(8uM PZPDgq+ gVޓ_N:&=\ hE#Pzˀ^(PQ{P*/Pdb贙_vSdbUp`dtk:$Aјcbr$4TՊ Cظ}_KzM&}4aM ٿrOp >xy$فFg0;;=U >FlW[fgcR b{o`z4Xl]zx5's1F_)l%hzbGMcK@t/͗8D-*lUOg+bs: ,$a; ݎFfٮH+Je0!E=#[ȊDz.37<(<8n?K+N)QD1MbJ!gKMPC:l 6۸^"ǣ#mǿ:UAK ;\<7HDXf-Y&P'] Jwٮ@WI,lĪ\)|@<̥ Q;^uv( AXvZeTx ||ppg Ь`"zjes[1ך00(B*X9ŃՁy!̪9'?0o?&({Wc ɧ7nqk^ w~Ԑ%[kn+&ֽ9G:0-(hOj43߭%L6%{!  0*RQBN ~R 6^Q PcYb"Bejp-9@c'PTX#E&rVlD.\'Xc d7$N [cyvZلrT*cC"C eHwQ ʥF.lRy(0'(T'8F&p6ڬAʒO;guN@t.Sg#Pg#G}FFw zgIJ?SeϩKAh# `/b05F{VZg/o>J%ymFPPAAجnfjW$a,ְe#HFM=V޾u(C^ =?A+l X&vam2Jb2@S"7ǟzIFxW uBV(6l9BW֋n_$K"2s7v^BK[ ɱEY86&@̰z关>xIe9KgjKlŀe3;c|d0E{ic$ǵLLCf;E5"!()k.nj?TOɨN9j3`k- 4񃽡UTИۭZҞy Zg e"ҙe"Hm{Xiy31E\q@(ɧQ>M]*eG(Po`QmbHllLmtw}3J%$wyYiҟ\ըu `w[Wug%IA o*eFOIQYv@sU/l7Ǚ"'ѓQnX1<~/jrf(N͒QȈJR`ݪ[:6uJ=2)8HR`,`G({q~ ؚ{(JhZFP{T|Z֎qLs |0@H.gERl{Nr[|嫕B2 \ }{$Ѳ&R޷%i>S/!)6ٮҍZtqS,/wJD*SJXŜV-|vF42eի-laoj{;44YR \ \TM4@[jq[lv?B'+w@f,rsDfmb$&%ȫ6k*""Qu?쯄gDJHL1Ǘ3&cW-@ ' s0BkB`1C7Q 0@GF)Nm#F0`Ftum/yb.XzvO[ 8n\l-k=ʀ)A ZKa|@Q9軀ZY[xۋ{cá}:*#R aw+X Xq/Lp߼H; A6QCHYlGK_l]I%>qJǦCr LҹEf± (eJO0^9 +/tފ8[hAW3+5B p\82=CfYyR:6"ʼ. *_ W'< G=]K7" 35W ex?}gߵӐ l^ owz;2Ag(=*I˹U*HR;Չ\$Sp_`OZ/")`~߅`FXD|y7s%LrnX\؝6L'E9D83r7k 3I vw6[ЫPm%G~IU ۺ,BRTğfO8- 5aQb>?h犫N] '3h7? KTZ0K߯@Z.lwħB\iW>m wot*) j+P&$#~*qȏLLSX9*E6S 36e7fc7l7D+6EvzM2FC#ck,$#A!!b"8ң٧1iw& U E^ ȾO>Y_OɝF`fd,Z/srԬhIeIAPtG }-]W4fZ!<ݩ\& 6ˀPDd0% 0'$^'UOhRH&6Y@+*a둭kwL1΍xhNr9dod*UP"6 "@U4yXWXɉ(ώs񊎶[MeNo? x$8돷H)GzA6CN4rJuJ5xTB8pp)9WDDLv钒5 %{ h)@ wa^9M8~iN̴\t, }%y:g~v橦VHg_] Ƙp4pvߘεjR}RY\l>9! QL,j MB&({>F!qvG?T7ǻrG`cq 8uBe$/ٹq" 3D}i ]m |1+ Q|PЫ$iс$JJQ< N{ɱHy8hvl 2Sb0{G6@WM#`-1Nc VXNd6߾}|e(BsўlSS$olto>yJJ;x`, Kf6X| lgwޓoPftH" ӷב?[?FHD*{z.fšVίD ˍgjW8ިI9*iXDxhw5S2+bWD?af xUED84 \8:2k$,m-|v[Z5jBpn<)(_BeQ=Ut7z3B0cV,N+ u* `gJVv2rQ`vLvz-ܿ&6^Gn'WC9-C]`YldyD`W@0a i TF`1< 4j{x?I s#c}fɭRzC`FD>~݀Gޕ G۟ iHqz38n9㞳d|UY*e>-hH)bmdRf>B9Q$}_U@;RŦv<z!%g 2mW~]aﭽ,WccnAm/9uR&ٗP(]$*'"}ˑ*.l+B&:(CQ [cQ%C\j@U;ݹzR&}:I=Z <ݱ޳#Q{kz%2.@Rt-3,Tn -\Jp:P*$Q 1) 7p el@ 3HO @Š=g?d0f0$T2x-3HB} c56As :Bnq9,q\r#(J$~֝+Z9`Կh˾/=vt U/{'0d?=:''%תR  sхkU&,$lN {[S. `Rb,E:" lzXݖ峔r%dQWݕnQV^ {tX =^D8 Ӏw-CuHp.5,sr9N(SZT 0#"$ y+塪 h2"Vc AoBp:cݜ7y|v3V~T#ֳG@핓^eSk鴵\SD8`I%Ls5`&,h Qƾ6M4b` D 20|A]iǎ1Ikvn?_Xdž Y&BO$YOB srkXRE+<Wyˡl >Ak-g#Oc@s<$E@b׼G+cwk7֌6j^%0] WYp癯-dهW[ue<@Z ZBfnsdwF0ٹP\" PZ}1&{j5DHkgdv"5I8jM /:\mbVWZ_-ۆ58J_Rm`ű-ؤikEUh!+Xq֥&,)e Auf !,NȂWڽfn22&ov{NdunnO|[ Ʋb*P-UQ0h1* N:Jdi;ʬ~+@ KMw'P)D%Q2JGCuUE w(AkS9>qMaYy@WE(Ԝ">w(,T (HA䚀(`""K/0~Ϻ/2"bHGWt:|x?]aGCZm><=kK!s޻ޚ+F8Pvc@pu'ѓmkH|_}΃iK 51cw_[ X67:TɒMDe(+3ue>~p!y#j޺~Zpj@ 6{/>Y:(&{owΟkS$!buOt\C[Gvc }|%m6~uJijUC\J3_wK~ 򄫁ZnVՎ)lU^"er{U lΉdf07`6a6rog_9PEBJ! ݨq= Q|`@ 1^ "H@B;bk}Tm_G@ UAW[ u{?LLƜ@y' 6 !%$ x((B}{VhS ,! (X.?If-l4Z8]"֘tXs`.҈٥_q u\^nEɁ d!= w^E 0x{<[?]O (aLL;n7ot}{eGKY م5`p$}0`U0m{@PY7{mL1?hָި/_R޻phâA'[ޯp[)ȳ]nnizŹ\f$`VS#1z IXBS[eY$Fɲ0OkBg|թTBtPe B; mlaU͹pY_bg)}^#f@^#B$x4҇yjr''rc-{+xZBsoq=@̯^HN[{Z9RQ˖&pQ^`6bJ\ 0lW|SbYup<J նXsL D M2`'V}F@fMpw,z?5VXN&V/I1,%KLN` dILmHhDڻ\A]\x&$&E0K !(9y/#IL•Ƈ!~=s|\.z?Y'}xﱧ)9[o} QҫSs@ ^ A_ճWkZW)3n$ȫkMML8f>~3ܬ6*`[?j'R-PgYdĒ'Xc>z6FO=mEvU(荒|1}L9|~~}i~\j\Wj0ZNABa?@֦.~}=DlV;l`r$KzTM+BwVFWpSYZU\+E3cy͗7grg@-@fnڞ:i-XХd]!xƒX(kf(6ut3m QbYJ-5Ƙ$3r4c RAXov]?VӭF-u啺$V4;LC)vX5P(}s)ui ]9%Lkݨ0 Aj,uvG-dBni@lԼ&rMȻ7{_ FmQDXqB׋r@yuԪ" 2Ih8^ +toFߕ 7iz9g8UBF!\ 6'Ë*kb@2Lҍ y .Tu AWEt7eP34QNRLDžZBƧ?i4/[qnȯ׆aﳵtVMX&Y#d8'VIEJFÇO~xw6kx(xwuZ/X >=d^Kߩ]*mY="6D;e;({W \HRmg6AIMS@Tg &(؆Ɓ y4C}|,lx?;He$l `%K 1 D+Y[]:J$BWjPr@,oNԄ@y:Ô%%458("LUT($oNU YƐk4ȡ9!ddoW_K}#O<.G~/o]uKppv9x"5BA]!tM&37Rߚ0٥' d`'1,. *w t9g`6e=-`+اh#̌Hj0NYEH)fȘ}vja bP-/m/,8`!_N4:(" z v"`K<ʑn7ܹRV ;iȥ e~rwb1a<¥ `eX@ҹ$fИ%( 6"AO ְv7%~>y4}gNp~'9n:,gW=Ŏ}x_5}viÙ8[qse_f;<^GeѲf3xМȁ&)[`&$3Ǘl)_BS. l|#,֫)߈ZY:NNc!F8M7$j\;b%aMa+㴪 ƹ\(Xpc)Gepam̔iJQ5Ws"eNi |y & " /L>>-(§׿8 7` qۛG VvRDMA%Q+ĵLI56'UMR=‚w˛ͭs#[hDR" o ,Y  UX\Zl\v{wdh6o"DȎcU'5(l(36R 8|nnYSR݅'b%}HD_$z!jP]#:wUnXXO"g&ԷB$6 ˛Pûg5Q[;T*)BT/gB-`jb~eBM-(Jf0@>z iw&{,–Ikq&$9Iv&'8FS\BP,3w2Vvaf/>y#ÏJyd2>IˋalQa0['Ǿ]%hhȋpiCbw6Eok0~]k?8{C"o{"={q JZiC+8%o#{*sӵ#UxsA[: d7N刯Lݱv5+]|D" PEJ=p^XI?9(L&R[6GQdsOk, +b/Bw;]$fVEASG ]="J,zyԉXDD_+>9"BwQ$b,(4F|~жkׯ9eQ$3?="AZczO@p (ׂ,3YOY>.9/hHcgm\jTt;ng5;ףeƃ"D0%5* xXkkɐR+0 AND=<7<`?#?m6JkH`iw]2"b00jV`,(moӾAron~,to O+/} j5А,K{vޗKO)BsNaQNo<|Q5F潇/n 6(l Ík6o5*??L׫&RI(U",oo¾eXdsl:8eWp83Ep~.nǖA2TM\Ù@bւ4icvѳ&$5 Jq/ބtPm-,u,i/UM91 X +2y'y#E%ot: ʽ"5VL6dz[X9];6/uiᑯxh?eeO^Z.}uȻ<94 @I7ubJv[ ՕA!$330gv,T(dރ5@!T+Y)@B‚֢Q ؔ=O _y=aa@zqs!"ÒZڽ!603GPa"&IbVQ呖T  v|p)nC4ɘAz:ݪDɥJj1fZNIA ×8w3*uXVcwL`vȌFGlg'O oCײ@H7&w ېZ|J?}@=spn^  pˋ2aygKW-_ Aܓu3I ^xNg8:Ssyf Hew>$IScyF0}r~hVAV9ždZr)@WZW$S>ˠ$OS*ʡf6-^8IEZh-\A(>3+izh0I}g}yՍ #Q9 TDXAɀ@^ uȶ|0^&a1wq~%Cqg8G5;5ʉ1e ]أԐ%rf1ZS@O QX10p i |Oci4FoM/vn%vq-ȥw p>s_ TUuB'2Ia_ⷯA>HzG+ALQ u$hW/Q%Ȟs^{lQm۟/LG 1 Lwr,{yǿէ>="nƶZ W m4ia7TAO-XLQ ʏ#++le T-3!F41xp4N$2;=Z+}"!`J[TRf{JLZ@%#3 )ə$-9;~2֦QP(e\D|V\'ﴞ0`.>yl/G%8 X 7H;$̊'D*[SEfDj2E;i @@F^k<* ,3[c 6@U-0d! 1J/BKV{(+"Y fͣIc(߅pV& * Ғ^X@RM@7(C aV.FP@M ~ ;- [?}j' k >̳\[>+~E_l- gk/a9+GZ0Q!.[ _qCٙpwHsd ЋGM%߼?QdmJ.ϊYV%Nv xA&y_ ApK4k ϓd$kեFQ_QĤ^s{85" 6}޾aDG5eC#V`| Sa*aBfxsri8^qE=k1v:0.-[]8&i1 ܨg" !e6TmޟEm]t~g:@Z%bEC[o>=GⳚ)Vrnc 3`_'4M~}{!)Ct -WV-oQo>x⴯ I🷲nהT\P(ֲOe OB! iG>!j) \wsI !iM(e.0gB_9PfoDNA;lz56&M,p`<F(<=D rdIR&t6ZOJI".PhF(DvFak-~Ժ?ZkוA].rGzw_w⃄ [$woy`*(HDPiAD–?&D`bHEIczIlr<0ڞ:Y.y:qJp $BX+ Qp61Fa  D0M.f, 9jP| ãgv!jCfelJ0_VKPl tw3̎(yv ([,,Y|fdTNUƪ"G!IĆdѨ?qj,p_bz Y) &QU̅)ͱ bWpl "HI|g؊H}̭\7_ @ҿd )@n9띧Խ:9b{;|* HK iLqvE M1\k7XוMI?2?I )o (ƀBWI!"JeF@wCϋ'B衐̷q_i]sx2EtaP0b͒zR !6pTұUeS~ raU(-}r~(Y_x?~ڿ?]ΝyT\Ÿ¾ֱ?jOqğ_}|M8LN"j,梇`|M?<ؽ_ jW9p扚8J =fA=Xbd V'˫58Y ٠<"@ *Kbr dq2+7i"3A`&8 VE!,&;޼ýpg7; dx2d$ J,M|93U%Ǐ;$W=hv)pɲ8P(0{Zɍ72h![OaxG^|b8ƥknRn}t,( YUyYWP-#Rd:x~;wBȶT 3 0$3>Ad5HHVl_sX΅>;0U02K]gZ l_$s`6/u X)+diM(qp@LvG?aQ,P/KR/e,&5Yj ލ˛{^o4e[>` bemccB3drS>/b$_XZJkS^ 4oۑr_ZHq2ީW@k?)RLJ2o5 ,WN\Jټt6N ߖcdN7ޝɁ;LR*?%. UVUAIwm@k}56&7jR6ӣ\>Ҍc*=!L&yԠcD,"AoeLCEEnm"k5 9!Cp!@Dئ:5ЬZ* `'.:,:<@w .`Q~Bi6T#Z{㫜RQlˣXe%# l{ksK֏[]N?'i|թK 9蟮*!5Shs/a`D!78ك{_=ީ0" Նc@ryHbsU DЙ,ek$Հ!vC@D?DGscmIʊLŹg~|\..`gEDE/<0G병//aC|^׺IdnWrZ?݋M (% QBB) J_cpQɃN׼",6X_ U4ę1l,?u}}gw?zJ `Np+J,KM?Gr< Yލ`B#F[fvS\!HBA84ך$h Ra` og<+S מ s/{^Ȯ"RPqĈ*aBAXV a ld Ңe 0Ίl.vWૅi:Z)SQE`DPD [a Q@ 7dBoLJh.U2\P|,hJh@JB eC/#H5]X> D/vR0!PlaO~~$X.xa=4ڭkcMEb 4qc*VRT9&b^^L zo?Kt*z53PrP/K:eR7%!$A\H'=cbJSe6(5YfLZ3NU\ MR4*`]*USɂK I}E"eD^P#_ ܹ!)gy٪m%p~4cZ惓Dv.War*y]9 _N~>m-8J[ ҘSTqjhPml&nqج0o,s 8MSL0QVZVx?zT,"zlI2B  N.}Z-5Œ]`-Wi " d [4y;+q^]Qoåkp8DsPsǦY Lr H1el$w(^;YSNe>Y07lEfI<Eqj,5&z؋쯉h@H,szJ|xE |#^`QTwj%BcKEq E13Iu}vA hJJD$>h,~=o4jn Zl_ώڥo2S[ ?Bω M &/h^ˆ.&cpIp\mlORQgF͝ u9u`(<!aFD5AHUFJfk?Mi2N[ER-ŇLYMȍizS\HdG~g<_vr#%JEHLp7-(W7^ؘ=09Ќrp&#/[?^&叇+_{q!{FpcG,27'!a ~Cv,مu !6S!8iqNCTJ̈RCYxfjI8_0H:}ꩆj<Sc02Z#hlؚ,qdiXn튗¡ i&mz{!Upe}9!JޥJ'1 \XS\ݣU_6c l/\Sg4{ITH KaT[}8 ^BO/C|ϮVbZ&8M,n֊䍰U&"VQZÍxcbs.H*U݃ȣej/!_ @ H$pj 2F șXYJxwR8ϺQ )TgEP`)I vQ Dp*OA(d2ÙqF&n&*E0W{=PdѿtD7\oz;yn^k*:U7gx'zϪc]}~SL+ҿ_{tGϡv@TBn'҇_3QvubRs\yE#41@;r,wzR01Xɾx@*9iiYDAaHclaAMx)4$0(ۙկ"$y&&YHL1XMQ99qPtG)BVj`<FIbvjQ>]|$@"BYݺxtMxɧ eo4ԥ1WLvsnF}%v$օ *n)Q+ ȦBʣIf&ƁW ZK5BerGg Qu4I "\]eaDd oM+ĩpr54BTܤ2N'J"3bE\( XpKj))w'fGp]xA!l no^!M89eD7+ Dv c~qeU;)/_/>>yT9&~էbV;BrF/~et<MXڴKZz̚lk_LT~5_|2RY1\˺i}ǔ6x %Ul07_~4sQ?G؊鿥Tl]C.-f+R}%6ebMDh&h,1Z(~H8I$FQ&"'Vp  w.I]h*オĤeN⌹4wd}uX ֌n<~Py [wKMc!;߾;q/_.' yX|r,4"'ca/j=&Ì475LAelS9n4˝X?s 13 1"@UEIfYf 2BBP^97jt57BMedR"\6c/2ˁ;-r&G7sMWq(18+(I)L^}$xћs72Uio7yl[@XЧr7`ޑ] K[F1w;3_p|se/VwU p e}(SK |s|b ۗ<\7{hSgϧUqbw&RE | ~,2z\I Ȳ7\9€@`mbH2 YEqǙw8d]6#[a&w`l 4%X @[ mf~ݚbn8!ɽ ۖrW%@ ͪ?۸zj3)ӒɁೝgHo}.ްWY /5mf$/^͂xG vӐ)Sp|Uf@p/Vшl6vL8'2;ʣ1=G0N} Z HI3C]?VKMiȎⅽ-bZD+lAjB͕9ij'(Vl:q+(ʯ//IeON>'{{@L#;qW.|ҕқB&ǓǏH+EW lO}^h{^V4It A7w>}eØ{׶FPybh^pPq[ ~ R쿯TDt ts*^N̸ %ifq8@hAhY TW\}6&ҥxW \ٰTA! [k 3d2(N,];"g6'lʠ$#fԴNGRu hZଗI $86('th~7J%+Ld`M֥y39]9p>B~. `7ޥPُwHN]c%ޭO_ڻ( T_i;P. Pp UujdQW Z ?,I+_tԢ*K b3C1}]r I H!hnեJGG>Gc$Us"ܷXhͨ Dz rKF*5T1B.MBM)Ԑ("l L֌@.bjn33ŨaEHA-8 Sjrd$jgr%ـRU_ 8P՗8Ep }̽5B31oj`sy|vLvϴF/nG{̑){>~Xq???:ZI:7Z쯻xhngbn UgMF EKr70Wd0,,zf'rR=_2~Wh+U+IEhZQ#"c fA\£`3t3͹e \]R Z562=jHTNJ"AQ*c a$!2D@Ho+gbH`e'92 g6ܺ'R7s2z+&"|3:sXw_&Qȿ:ѐ9~mQW#HLD-Ű|TgAt3kG0wNjƃg8r?N1Qg|jY֚Ǒ-̰_ganͅ{}OF}Ʒ^Ht '4IcyWb-3/Ez_S7HռKF~xKP[g6sCs!W@aq܁uD&d|>kIj9$K:c3EGcGѐQ%*wsP 9!aBLmZtIt Ş kTPžSir./U$DXkYPPa|kix* oI{Z>`shImuM?sDDhg@4+\v| +cC"%X9b5bcQfL;c)Irg@Qz(?$Q"*0 fTK"ء|brx(>(hiP4v;/jBDJ\G]C@8_=0aj] `b7U@ rIE_hԐʸ^B>Υ?@ M%yM}ƨQ ϴ5!Qi@',Ok.~ͺ[ZO9E]>d.m}#Rg.Ǖe՝\M Ϫ5T#d=xa@b lzf@{Zua4f1}0 ʦ7jeo9-%;bunGT=l=lԀVU҈e;SdϠ =ƽMwwPغ<'Ӏ;BQU'A7T2N7 cL9<)1  ifHXf&qĎ:=Ok44(`$6P"o;,-,?m|+|sxzFgm}MIe%-F(8f~ pK '00v- ⦁!"J@HiDiݡ0Vn ,&V'" FlEs`UAhrSRqu*"Tm,X4F "eV2nD zk!W|h`  -~ca`'W?5u7GM)LйwLݟcy{"Źh󅳌:v/l>jը{$F*:(>v`zϨ3R$pbv ٚH5!&~܍wpk_4 7?:RT)7aat YAfoj9KR^Pr@3QD'eVFcuαdqւkv깃wwu +NE7ܕ/n޾Fg6P1ci'j|;-OsH](#~@5y,bwo 7nszF{,M^6HM˦F<ŧluń14]_7Z!a(!p1dlIVq3M@3`AX>qJ;{$ֺ{/ޡñABWZhHh٘ݔ6wDѶ \!5<{რdo$΅J%@ aH ,81䛴Q&fJ If*U+PKtNӫҫ4V?>kw_^&#ňi$z;Qe,HTq_HpNE 7?ѩ[y2yMι [Xѳ35T#+꿞zJJ+wQg(cX#Xo{əP^,AÝ \gD8wXEONEƽ8q qWI|e2 gЀufĸ~o?[7U_{o}p~~_8.x–UB(gKdY)N 3"{q$Dq2Y(YbF4d򝍹O޹!Tz{o5(8>B}ڛ~уk Q$"HJhg@bVh%s*u 3 +$kGs`\[}3 I lsK:vp3R.EX嚵kspbNƚc!=rH0Q! }}锔ߢD 8@ ,҄!L☾£K`w@{wwݻOgچ)ryf#*<jiW4TtW4-ʼn v2^^!cۄ:&l0 ufK12w@Qetbj=4!XwP߾57S^Ae߬VA8V%F@Fp/" ya\ *+ŠL P`s;h\Dc Vמ~ZrQ@c{{6 HbL*TH*]̓_/r4gggg6Sv?EKߏoh.D3H菟{8QXݭVxΎ~E_o*. ;H BΛ񕪘03c\ en3;f4?вp=FE%̌&N h2HDཎX9ZܷG~۽Ghίolnz~>8v2vsP&.T*GKMX0.*P#gR r.Xe".̶]NhuY"*+8۶+/O~-n\zgҟd ]Lb= StI4A6T=L0Zi`ZdAM'@'0hfu;+uvZ\B]Y!Ot6@ٰ󡵦9,n"Ŷ!!Vh=pXI.P@* =CD۝λ!:2./}&4A-\aB^rS;O6k5kEkXM?j$r#3䂰dީwRAwN|5{sKh̅7T}_n־A_Aak5(<,r?Z J6/LWG3{)X]VS>UIQÇ(^'x@x Q>,iYH:STa̵.4[["p|z{aKet32Ҙ 8Kgħ-1 #r ~2),ň(HDz! ),sAB\*Z7:<@c@ ΚgЁŢv:훭oUD\%zM|lպB8@fI4j`"gSwlQB1R[;С# HJN( DѺꀐg޺v9=ۮ-v֩G_)qހ}g["jGZ^u; owӤr|e{ zn;Ve㻹4W,CpD@Wc] m\T౺V (JKiXOf9V%Ec5x k?[N]ԆBkX;+c> }')juGHH]ÔF "&l8ev># oc(( D(iZ.HaQl=@37$Lmӽ؄j3D&s6g@*Tc -s. ba!" )? 5RkpM.4YV5f?883g;ϧ7Grrx0:o^"(=1טYO@2ʠyۋAp;k3LJ,,qv3x`y0}si7_~)Ʊw˥8ݻYCS]ڥtm8/"T!U 1RG<&KdGoTϵTDJT ف&% "Eӄ+0GB( zvWEXiE]JEǙ $4=f"!It ǘ9 f\?h^E{`ׄ y}~aO\_:"9B%uܦ=£yf^nR yhRP(u&za3VL38 f|}A,"jZz S3@\NXDj뭚56˭goɈW|m|VR%VTm#`_K#Lf8E`+_&\ V,3!$޳ ˭p4ա/z @mf#PT$8ffegOjQl7%+Nj=ܦH@Dy<Ғwg^ID0zN{É""r`r)~Ee3)]zFO$tI]*÷HD dM^6 *ma,Cw`fqXK  ` %D0$6;= `}Gfp䣑_ 1;2r [B*:h?j+)Dpe?pyZ.c-XrqQl )pKS{[G3XOƾC'v/#&+΍ $; E:*EZQ.^¹Awd%l%"0NtA]ZRD:i 2F"UUL#ВAA,Sj˔jԌ*Uq,H÷V\%lgqJ3MTGZx{VL2Bʧ!tv4²SN?Œg?j]LJX$YNcB0 a /dvڵ޹HEnh!͏L1+%u;CGkR 9WukuP`" ʬweÃ5¬^jY޸0|l4@@%$T$*  aJ SDaavbv? ?Фr^7dQ1D"DC ׀q$`W"˲šPOX.FáyI*U< Ne,s?ʎ^Hat3EkThs&.oGcPg G" ocɯ9T5m-ݿolkk}WP0 BsdJ h;C0F i yi-s£蜢ꞳYz^"Dp;&CZAw:־B RkjM6h <$N>7jl {Yv??^hmY6sS P*{gN/,|N>m⾿F7螺BRW 'ڛ0Mr˓s5wCtHvSWHuI$ h@H!jQq`oUږmӳ) I)ArK eA@\+Qx5Mg i%dzsqfpG̦%E4qfOTȆzf&HD8Q٠7 EZLu-.VHKDq@orΌ|~S5ڎ>/"OI/ g+@&b-Vq3n*رcKKv :sU˜^pŪ;X +o͈GI eϰ˶rdD=MV nn -%N9Fx|;ji *a†mF)B'h|>, k-`\F};/'wQ9*0ڨS)_z/ZwU%b5d~:u ڛ ҾݹW|/ 㧿so|o=zqR;[ǗFzAYԛ!)z'=RJCR)$"Z#(Ƅe*k畬kUBsH8dpB-3A}(o+J84hEʑ-hk ~; POODAi`, ,sDŽi䎙ATETnZ YOжqNU9*z:kFF/hCaԊ{Ft+w6Wq)v} pf]IڽikZFqUT1(Pi R ?$~֝ZHr`:+{ߘJ-s p{{wۢd{mۭ!OIrV9<Դh;$x>U_fc_Pˀp,xBg_S]Cz_tpEJ4"+o)'>JCE^!wd'N4 U4H"6շ35% 8|d6(Vr(rl-{0duH6*%*s2nׯǐZK+#9YK}ŰH\# 8a6h0wZg^_Q"DI-_Bqfm8x05)b}>֒\Aq1"R~(Br~TTӌc"%,tscJ\N@Ym¦\A"fUqDCgE(VmF,0h#+C%-č~\U(0@6VF@8LDwK ʴֺKꉼ 2^ٻ9m\xvWi걵-%,5,|x!!U'x4;mh0ީo'H6GGo-(HeK9#+nOb&x N ֟.3BZ4BxImq?ۉtT6ṇ"ri,D.0>SK+ݗX S RʗI|n0wLҬy µ--8Dz_wba;, ̈#& }@˺WB1X*a%+c5<їTYhQw,q,9&ܚ;K&DH~6[zQ]C*6]k}z i斮`w@%CCErTik DgSt#A׵nA6XLe΅}RV{ l7NDFP.Mi D],H(M£ @m8/jHH3ildW,:_k!dYJ, 9 3sf![DlDqX N:IWT*HĜ{iAwFߪ]q evګsu$BIgtv k3tbgo`Rw?篽RBBTcLjIJ/6 !6ˏPP#R_S [f_c8XۨkRw#*a(U.4=$fwёȀj+C,[FfgNz*+ /UC*$ AAWN*c* P4F@'Ί(gO+atE?ͣxMwt[C|0kم?^ғjuG|qHa9]R%@T|0`N7)P+B`gG r>hj*g[kc`+) 3\]N-mL=fǕ AGY .f_J7Ko*>6 tP`@( LL@\$j@ vp'O]Cyv>96oW@aXI9+ b~>1h%`h Xrɯ$+zA͟]XNϠ}VB<ټ?Xq.q|R7r<;zw걈YLϡVTcM/#Q2VB-ټ2E Qff6|zj*J'qt ͘+NMN}QFwMJxί0/\= cǖp!R-k`Yy<|E{(Ne`x}_f߻NL I7Q^XǬ@m6SIB]؄y2.I ..u8|P 5{}J%ЂE%KqY!!. B{MD:j0Y -l\sj4z x2;Cp GņEQ)AÌ;ܤa|Lzw&z(&b@Z^G._!36{Na]ye)`oA pqOeǥiσ' 2N_gߟ9ˌwKOEy@Ljh2kv,_G%kh/10Wc]FD?BuR1? WY `W!׸zR94h_iep&?ZXLUs!G+ըBWH}I4R|J 59~#%y@s;k\']go'kD RM-ˑ)$qsR(/H@#Um0V"%DuG2)<.J w,f] e*wç-eyNH8#T.?~+z$ˍ @4q"G!EmnO)10dX0Jd.u("-8Œvav{<'DTh$J ');-q491l`| "gav(e.ס rR9fYg}jTE0|%W'Aäl(HR͔z/3;|e̠sGAX{g.:upe^_3?86ڏY8DO0:C-#L–-g8|d8U,ejy8DjjYZ'hdRkL3ӟ: )ussT]Ś(l K81=XzE.6P;$udsNOyv4FRŲw9<:]~嗣gxC~,꜋/+i#65ISxTh,X zYMa/C?p@hS+ D5tX#^8$/{xvg@2?̢o [HT"ֲv.V$*}+I(,DB*R[J ?'Rw!b `,D\Ԯ֎3^\ DoK.\Kx0͝cڹ'A#:FpGM#T_N\9"ٮ3职2@I`d`<| ϾZnѐVrW4dF:av8forݭFO Q+JCw,'w+s+B5q2 Apܵ(8WE&Xڡq%+SرxNޯ1!"ϟ_4؈9}l!UH~_iABp8>~r.ԟ0c K{?2w(5EB> ?~svo#BC ֩/Ź_L6=p*~foqqeGgQńJndR(."|%rUXW 3G>r'Yy^7/TP~e"5v2'>TIXv P-C>Lt.5>)ݥ4Q.G$ʬY ܶi]G;m9$c1SvP;"Y\&ϒ85mr}`tAr`&#I 9~f!̘ʯVTA`xVB!BD~))فapV~7:TcʒC5=sA"ˤcx=^қ|1b3 APJkhkUGr땆 WlrS?K~ocrr& IdaM.7?{pݧr\حC,faɿ`wd.gme%98jgo0v#a]Xxoc'[q G8pX_8Z>G./e.Zer . -9 XHY*F85߷mbp#J;nfP躔B@gu再bciAyngTI!q9ВNQ 2|W) |* p*TJbU]G`a1 h2A.pKh5{fp@*Rӌ].:ĭ dh{c̈O@ k9Jk$ @ӆn5PD6pfR,T3-߾2vq_SWHܱBG'@Zk3]9FʾXFPdEyoPS C{C0ݕI\6|x°E}*//1}AZ XQ t+ B2bo șH9g~Jż|j /`hv]ҨID}L;5ڵwpa3ވ"RJLYO-ěfwa,j4Qib PJt1"BYan>VÆ=N`p㞖3sZ2D0JFƹ8H0 b@ז_tJ+NnhcM@3 atպJ\,8QBߏ1~>U~`FBR72 R ĀoPPLm@RvΉ-f+?W{- ҃U{}-ġRM]klӨ)1jvԵIoX>--^*l/˗ ׬HdBeol߇kt$ w y晾qA?ʺR t"þ`qaeWtU6q>$4.H=򞅭ߺ8} )Og}Euo Ո"{k`B2vΘ7盹{rdyN;3':[+E_R?Vϸ?yG^gHzt/fJkO~+NER̊_ 3C״dZ$g[Zڇ@m VF!+g M+0;)0XC+64) DdY%"Ig%40P>zwe˿چ\i|Fq[0OuUkOT ,'P!+ϯB,k0""iĸ8\R`ሀC)Vt}|:* pYwd@^҇atcOhy=RDV)G*:JSLj9! g"djdlՆC㠮֔ UhlF8 6xL (bT8q(W{AYu6o@$Ro٢M5UEv/R|wF<ӣ$-&VWVPڱolgU^{J@\>|@O ~tgWZ˘4nϝzo0<ތ`9u;EҗV)BBfO^2~wO)xVTJuHO=܌]S8G A4~TYXy#I o|!Y)rded9),[ODFʳ kȋ/I@G pvg7 M<~OֳԹ{щC=مZ)fS;>S@UiJʉ/VBƊLA i2FUR3Cg:ٱ54s5>DwV[^| ׮я:X k:Z>$w}oB)Dqvp+!GZ.3Du{ ~S[izԢ |'E”@rf$Xm,fmCԆrx5%g& d$۳Ŷʆ(j|Y&2r# I_奈Aș, o6#}췇!)i/̩>~TJĂKyz< W5a'.5;pXGJa3;ҙgg2Rdˣyw&k˾8Uz19x[k+`ݥG,ՐUJ*2SOƲrc;u)v)7V-&2~elC5et#؉Νgi\S*+?Q8rZ9#˯셿QVn!6C]X n-xm+;,DϏc¾ozY`C@)@fI'xf.V8i4eEb-hem\Q%Ǭr`֠uqP>j >\GQdG,Q6 ʈajʼnc@t+"%KB^8h Lyy$*(l7 TK2yETǤD?b ?A9Z^>]P[C?W]CyRF UI+Y*GrrSl(]wҽ5*xE Eb':v?ߝ)|r:t9F] x M<(97V`[;kP\\J)Р*0aqΊ>8G$(X)"B p¤DrVrٺ(:NxOo|4([{zzx2EFlmTj#F Vx"8!0(+V)ѪkŽ53G~bkjWg~Jvh5_Bjm@uuW{&&Վ`xov槛_?hAݘ !kg?2!Dj6RhgD1FtFmTypŰvWs|IU%%X?-͔ $Lx2oϬkz0N|?I_7,NL@8t_|l01Q1YթBEi&QQJ{#HPpUz iz㫎sC~R |,!) @J`& F?`n$vH "l2;.7?G͕^x 1í㑿j>*R ;A`6>8sIuȦ'b򙵈a AQ@ Fq&lqeީ^#~~RTH_6=2JKzu5Gb;6:ݶ֩?eb穽+ ڞɬjK 1rʭ/0*@pɅhR_'(q@^Cl`lvX|=7CԱ.ۻQ_Y:M(xʙ-yniU_.a$EjdPxNQNz  I A"jT[!" ΪQflRRU~I+f 0ޜ'),r g]C*Qlj^va*ZX^O@z1S1Nn5^chgSn)z#ҪD߅cbo0lD+ ol|s:QR\{eN5^pPυ͚zqj٤F2VI[M8wt[Px("M,<& U`$9ƥsoã2z?zmv1ݹi51$q\g$vfC;^(ek(:n3of\@Q-OG>Zx5mwGk{*0Fg9MD71j=Gwj D0jФAr!ij(8"Dʉ$E2:k b;;mաX% =FܾŕO ~r/QX֯mq̜)b$FȘ XՒTbx6 aa8+Q|L@ݑ QužKY&XzWo//hT.|~(H(-&zE@&ʗZE;VX1mջjc^-GTJvMUyt.3,TIZADS8x zFI9h~ B̖~԰fcvϷyrFpWlh$%Yۥ3G$"O'G3`{%Da b]_jƍf{JMOpX)]$%a!b%s}V(@.X\L|zB A BӐ[Rr#@QfaXD᧮$awo `f,nqF -fĊ-H*] J/K'3ɿն$H?H%z ̄Pnv7}$zP4F >JMYOܑY=ˊ8,lQqNe 8_)yɈQ2Pj~W8's>H{R5wiZm"Z= $JD 0D[cv!.?"wFv5I)$P,_3"[!|TpRZ+sͰz&Dz6@M 'H:)ͨE˻Ks}ҽ>Jg-.>JGuZq}6@Y!Xn7s*Ɓ1Rq Hjw@.%l"-g-"ak vozI-N]$#&F``g-S5\r J.Tʹl8Ñ8!EPo%[&Rrq7O Dw =zZL~a)1F>\0Bpfb-'- w0unoY;vlC}Z1/jD|𯀏}'eέLW!VoF`g>ocON锇WM=k=Va[GDZidWIir1_.nfy_oR'[kxȌi'9ŃQ&@nϼ+3qTvsex*!z<0sZWO#UrzA 2J v920yl(Qۇ`@7}ؒ  E֮Dѭxϩ#^@2靕ͫ+O/ )b3uۮؽ7?{[BxsZEaP @VgZ"GxW0Ѱp~ɉeD0 Xt9}3I eBBnF&'l[l\}9J[V,K YcmH1As,j tY0!LMRΕ|BX+JdiNBf)D U0;֓ B ٺx >+vI.3iSD~֮5$.EV>@qb 8_z4DT)TS8Bd qQ j 傃'OLa{a*$2aZs{kO}ƕ?}1y[e7*b]!jVn 8N ODqIQ6C"tPf8:1PEɋljgth we yv2Syȭ)tm`> ą#ͻwu%|k|o"VD>L)qC㨥Zu=}Ppg# 8R2O76ۉI) ("=BBRѮC$#oc>9^m"*lC]ϧ ěCvƺDDiUb2εrp9d0\c/G*ز22馜 T"oq¶!2#M..湻{kU>^'z9ʌ žP^DvI:gaE՚š@;悿}'Z[?'gD½W\;;zgE;rڭ7qFp5uK >&8P'i4dJzK^9A+POyB#s,,ͻϤ4*9&:F@;ZH6ɣH%H'^ώ~~+u\BKif.p.EJ֣>.2U!c˄6;| FTUkPNH)l6Β"xZ ɷjkAC  ~}tzw="/'>}Jnb:k[?~smHpR#p| 52hsQJ 9)vN4΅zM-QLn癊dV}GDJL ؁a:{'˹Ԁ=/jvnMe[) 4?ބ8%E9@}/ϐJrP'lX vҡ:ʥ~O3"#wsB1QZ)&,4%91ICك#̮D ͎}ב:~Ĝ[M'qI8{c͗Rq{g̛ڏ:OTz~\pbLJGxJ!M\Jc]ZOTYUqhwiyx)S›zh`*.i )ZwbomƳ3qZ1~-A@VK\zgq(5YUwOPG>5҅e}3b1j_HN +MNqE;zc;9{wCK7-9>h`^7Ӌ;C"D{ǾZBlqԬ#*Ƀ}^vk$0pXT(C5: D9C䩐 6cIH²3atq#PaǕB汫^.yZJF»KPgX\ivB<]pq|KؐZ5V7rC Wm'M *;̯ӡ?e7$_XM(&/&u33;x)ƢjaHq&Y[8Y,-Y4R 6}wd?/?^ݽB)@ȒQ0b+GT*NDV`q*ˋCLB@@K"g2@hHBDsӯZ*)8; o/?7Ώp&\=l"m}S^dNc&(C#`flT"ݎ%dzU-}8r1m75˕.4LAH2AieX͝aagzNGۃEnk'"!cc äeW&,7) Ԋ"RC XSBq{X@\z|pa[ 9!4fj;dlʇ > w@YKH/9cϜ9\Q?&9N?=oGk5d6[?lcӌS~PYj > \1gYfSOC , !y52:5E }.l8ȮXd8ys׺ dv,Oa ̢̋@‰Ohp"'Ē_٬H#f+p!"1LRV@q{onf#gPtWgMO_{rҗv=6;|éW-oӉ(MZ%l4FAܲJDNa c]P( ~a)tWVKnҘ@S@ɀ2VH+圠~~a 2X )K@6INNZ=~Dʰ!ur!N<4T`K+Uiǫ FaW8#|oP'QTTl}*;)(zw|nX8 kHF$_}i<:ż (̆?jKt'{uzD)B$_α|' qҶk ϰ꟟9doTZf7Yt1{`cQ1>GLYƖYKc;|csޱ裻q%ﰅDT[蹯f#`=Jj_ş6*,Y%/,Ml=,:V#5;#Xi'hSUg-\ȫT(Ia]@`h. 33VIZ00)PL9u )PG.1~mܫ` ":h]i@`഑F#op*L2Ĺluoz qb䮰-afwG3 6{x(xYnvr_c&PWpҧ-$ ;wc16mj'(_VPnoN}adf1] үR}LPd̚h[@ BQu'h!F{☝}OȯGYC\7_HP+[YaF/l{I;fGI"{)1 cAuplh0p_IT!buk0:ש+N%H7^|rC$?ٙ cdU PW~e++uR*OH5h(3TJc1t3Ǧp,αL=WLNr@}2e yY/aۻ0uEGQ;Gzlscf' ]`>x8VHSzZGp Ճu ι;sn^;{o #Ȟ%yLs9Pc@kUVAp)V3{L-kvz4k Ӄ\R:ƞMɡ?H / X{ilHy.stRr.B,rypYpB傇CLDizP,80Qe9 ;a1y'I7A x V3o;g%WSu׎`RD\UVޘ%C#mP(J7z`=Ke q9b1q. ,ֿ`qJVcX ܰC2\BZ{Sgw»׺w6%o'j;8.Y$pnͯ= %Hq SkbX ;`-KnbBaq {Ȱ}O W`uq  iC' ` : k=i `a7B1(-"97E\7HKW(08љ_uRȪqPJQ?=rٮ!]Rtp)}#iq?P#MȠP˳ms@Ӟ-:LΉSy\}/ R5B__V\ƏC;RARK͋j>TS;czsziR*-zgLS9PBƴ&J5C(@L='4"<5;1mh otdFGZ^:uc [ީAR1SAd` L4XYCEyua%?G[5-(ndDRNa Q!81P1ԭC뇒3"Lo?¨hO*9nxmkS8 @kOGDǨ%ɬk5e^N1NcB(8TsN1mBz [D(azP2 *%#.x ;ٖ= -rhsqOD `UDC~E2iw,D"@Vf}ZEv)k0h-2 ="cz?#.zܸ)EWgr#"B\vla9ϴ2;>{F\`n)8D:VJ-MQ \m[qVƴ.G_g7j]K n)"PՂ.nl/3'Qu :{ϿHy5e{θ8k D(ת:8a .c[6n-VRn8h H01G?;{B-f]Xy͛c|wgI]P36ߺ#6n]_”8vlYwډ'уy=l}O£w~򫉵0Wy LyO?2`~rs١c *J8ڞB]#$5\T;q2|pD2vpJzmbAzUS7]Fodu(=PUFR[J’:ėeƁvPjϧD* ﱑKB{_߈P17F֍"@Žyz8s( VoɊo@°(ńQ!OR)>aI3ꛂc Hluzlgz҂QCXj+; ۭC`f_go_AD q=t Zu [HGRLQH\)2#E9*%σYd.@:M߁,q!ՐȏF#xW386Ò~"H|>d9W@<\6% o(4U 5:MA^O#+p)ovd)ICcA`b Bm<# $~pGNg SRާbTp~M9w>#1(*g~,X}U?Jr'z텇Jl[8׫c#'W ,b(Eso&Be"e3LT{1X4`a[5>BU>i'N81ww #x3]/A>!`~1rsb#gRza4X_ O`LUg7u}p B$v,$F(:EL_ٝ%K":F;7gW8.6b91(seƔv7f߻3[k ȉQ6 {#qUJJ` GJX=uՈek R7 ؂EIY[;M{<n5AT0ز( UXa[=NELY^$n&݄4!8UaQ˸E(#e f=^ Uqyqy o9d88~9(iiTBdfӬ;d'':YF#4f9v,p~c-FFOGH,kǿ*&?/gWy2Iw?6Ԙ6QOQ , PZ0RqTK%D^ |RD Zh=(}^N1bet5jcrG t`$fS]t`FudƸ QP`m/7|Qi@a'ZXNv &WkGbgaic$n(@>xrVV#kj?Jfg]^z| y~aAyڸ7Ru#@RKO|UTyP(HBSGy:sCza/kMP ׵^I/|wԷ=lS={ ۻڃE 6p\, [ 㴴 /, D-NQ4-Ā(M4 #M᜵ l :D,~ 8sQFipv\ _d}/>'"˛>\r]]6((q$j4OKOkf5i=I )ɑ@hCeg^g=?s0 68g-:w[7ɲ*.Gto6Ras PejToZ*T( HJw cF\.uT΋ ٻ 50NA='e/.Vki5A ~ps6* "磰LLjÈF%P "^*Ee[L t8> |@Hj?1!4!LV Ux;!ONK?͗t>DGC>ԗRCE!3tB{Ol Y)_E;3ejǿp$(Sֹz*FqSeݨHI6OmW!k)>*r6Yk!ޚXK<2y)>7QڴTVy$ EUF xܐToom^+(zOlPk>#3O1A% ,繖k)]v/w62<߫d3Py Q+9(VOD1"!jE$#a",8>xHGrpZ O0y}:y s09>l 6FA@͖19& X|$Z8@JEPA{PNɜɠ"V?NΉ82eJ6".nZgFxKG@R:ӣdpE,S@b` {4cYAzQ"w Yg&}8h0NUNQ%j*J~bqᙺS?S2| 𱅼=Hպb9G[ѐV RJn5TӃgk 4AUѬiQj`Z]X@@r@,g\>մ(:*z~Jbl5]T=ZaP[(@΋j&018]@u[zMSh;orV|ȬT^[M҂&=v!}YHWq'ULwU53N %<2\͟C( )Z1:.*xݩ%0SXhc%ө*`mOcu1s"M0bu0,]Z1$lg50'j7Xǁ"[OXfHݻp\!ѣyji4X͑rEv]GztC>(̜}#""eY2 :3߹ش=aj "] m'**?ϧ2zoLw)@Mxk1ʖPWwaIQ t:fu"s؉hF:dMqUfebb<:G܈MՉUwde6vk0yןЩV2'ŋO1cLv%hMgEJ 8P" HAZz#YAs0Ȝ^#wRtto.ݺ{fm)0!Tn>ȍ!T͒! ]1|bs@HT6;bݡ 7lx:Ǭhr,}[b'ݞ>ܛ/򀐌.Jv.n9-(AK5J ;Mw tf !D2b|,dXh 0Z~E`0i$;ڼrtħ׿#m ŔV9/w [P;mWlM*nq+O6oԓO$!"lo5 an ''^4vjn?柬ߗXk CmjWu{5=y`ar^3}+yvКS$u-;tNqo/:W9?ðINyIUxLϏ eP-rk  Vᜊ 3zE[p.(.kIE騾W4H%/7KT]2ёB"Z=U".%BXeAFcJ5<9pHƪ :J_"<|D?cey*ӧ bΧ_=!*HDU\ɇ%"(>EyD6XU?n/w%k_:_ 'g'D_ZV u.+O5Rzϡٺpb9-0]Ag6'N4%# 2*>18e@EQųo`k%:6CE^ 01R[E_t Q>=E@7SI8^4mq㨆ÕCS@@ Z`-x+$(Zr82wl(A.Q-ݹ;rr)(J|p7\7ţ k=YPڢW[m U5Iap0 nJg2 jr[_ܰlTf[0k ?!<*B`)@DJ" L*4M7#*l_MIYQB0h5r^-PEXTJ5dt!6vA x6N<Ǭ MjF?<OeH:I|l唻D]ź׿3|H8תr촷[T}u>tl#ERC]ͤ6K.32c Wv^K_ؠdfaѕ&>;31({frRiU*DL~;1$ gEeai"I6n T(toߘ_ncU.TF 6 U2$<7N .1Mg 45@XՁ(;V+mV& ,]Yj+}ޛCdTTyx>scʒ{wzZ]U|I$x4 @F m_!aaY@f*-,۰X$s+' RaӛVDJ@"&l-H`l(Z9U RW)e50-gW}uCۖ @f8nu…W&c᪯c6( _.{`н9龦C=;==p(o2 3 hY"#R"痠w vҝz>jٸ:& ǁW"|w/,~kH/]N !xI*hU"ᣪsd);[Oy&JkܾdrfLt]pؖ Fp5 *:5C tyy¬m 0 _>>0iՁFa'xb/K "NuCj^IP}&"`'gܐ-ԉ8$5Dʥ%Č0Q7ާOoR3;ީҍmLy.E76kY"kP@e{n{@j(ӇjjȦӬ排t 19,l$y4H&Inz8;G<ѥ)(s;IN+(,&bnU/-q%ڰ {.L2@) zyf= $KcK[TzH ED Yt0S*VJ4O"!;h}Al4/ XAY]F WIVɼ#̼ !X&PX~l^AEE'ٴN/NM{! ׾dX- AD@^+ 7zZ;P+ozN8g~S/>a2ROI9dzʋwO}mIUK=Թvtjt7.,&3#(PASuyo/T~>TㅑH1xoD\fYc)}!GW)Dk5t,=Oceq8[:r2)E|O~ yо 5>T:*eɥ8V'){=E3BWZ9&GNڻwVDo/߾d x>l͝7'aYDId_kQh> ʵ:ո40:ɦ\ijIǩ JP$ם[V-{+Zd"n{G%"5)zA(-nc{WU"LppS̩Q Js1M,'nKY'7_{?~\uQ# *0 >๖33H<j[U}1#cqpl(! 鰔FĘ,EU \v˽5SQcu}|DU-f) W]r2XOtMP]zk4S /:k@I74G( W0' xlA"P)Kt z "jQJ@M>[g+rˬg{rUQ9F63/]ӫre#gIb x**RI22_Hcu1^GK0:!:^0\Q >UY45ۯ<@n'gSW ə -әmA,S /{%,9'%_~A?}Yk!Ep?_y21HdMfzyr(^>A2fFXc V02]07HlÿFF"߰R~>kN%@}J}jmw( UjeQ-ClJyO4^!p!jch>U)FTvHWܟ 9LFBDci70KQ8R*X`$Q7X+ϻy2kL<=]BDʇ:}<5D@ؾU[58;[P+AQ v nL0{>=Z`]Tf!ʲGt&6mFbrR: \@ DKc4(;aQcw*rF65=z:Cw,ǥ$+~p{w|7& &zq[%b=@;4U6_4:f~ C+_:V7Hfkbevعy"?=]c3$"ulPb>N7Yk ^dBHi RIep{Te"=3^~sAkFM/)b֚μ|+[rA.cx j`[9.k7+|EsF E͘QDZ`D"Rꏊ|A!3@1u;u`v`q~uiJ (.pdV"9>ޛ)(l3drB0m뗚uRcibp'ZNk\tl֒(1dkVkA Rn1m #QXR fUjH|qB]웩|Spz*A@c``Tʸ1=ǸҊ:HяFh^^=r^#2] 20H dyk@=`Lϊ-y{$lYp'{prnV~~77{.ۻ)orx%[e@:`b &@d$D`N,el ?QL?~ETAߥYNH?0ȉ* )LBy`"*&cAr01.&ds!BmD&U@ ¬d~@duAX3+zsz5;jغ,!=@%{.Ro㄄Ɨ\WQQuA[E G-!ve$lw\dXSBTk2Un=â<J굚\$.V[v:N2 i(`qllPR :@@Hj*rG̶)&D@k_$LaU(]2Zs}w[qrqmߪV(݋/gc9T LU a_)'s}"yǩvҺ֋//=S~'KO@QG+FiKMD8h&M7B8!&e15o|ieBDI':T{`zizT޾ Q};+j!`OonنAtݫ`4[N:YQl%: wS:Iҡ[aH(/6 Jˢp v)9juyUׂ*6O]NMBIFkHv>)X=E ~gcv8I3R:Ym|«V; V@ (X ':N.yL^@]*aiY+F+0$>Tw MMaՐ~XR%}fhוt(ܿ+,z06~2gڇgV5w3}0uL&Ma>, b;kV2+ /$t7=R^|e1҉ שUe-)B$,LC;3f:7kML , x'.h!:A4@ l8 ;N 2(`^B88g(,1o嫍bqEc0p`J8)Gwg,sbz  <G!bnhv"w ;P9"&͖ (Ƹ+A T~Ms˟|vO/+%_ 'O7,1]X]ޯwF&t?~  1(R\qw> =B흟]ҙ!2(87~q됻A|gb .Yh&{k$ZcB0C< qXDV[^F!(cU( 60n/K?#lU8ȧr| Dӏd6 H?U@ yV!a",R R6ڡeh3WZ!͋@DG~{Нds`ŵC'LɸWT?$HΏ|,'y}GAڭ2bAxZ3 L0ۣTsՄPgzp}]/Ppf5Tʩ"Z 6- @g}9ή~*XylƠ9zҶe\mJ(+2&A >DDV*/'>!T+1h*4{ú_#tga@`A:1`؃m}qQn]~͗٢-;8쓙 (@ʎne7vS;YNW$d0:z|!TىsbW]4MfW;D&6w*Nzoǔ߄G!Q{[ѓcfgCnEKH:4m3saRRbzsh]k/ٿݾ! C0M 0] jc/@Q9dAM}OíjtI^J·+|G"X˙WsPP"p&b͌9DN4v׆`G7 l$ƞiTvgk7}ۺ಩:Fh  zo5wj\Yb " )2?v{VpmoI3Zb@YD)֥˖dDJHIpZx,vp(aeqZz<"Ҁb@EU+wPkSu@T1ԡCм''ԍBH E((Cl4 ^gzq͉7K_iK_Y*`n**7fO^jy"SB3Nq醙摯.#G^yl_#ҕ8hٕEݙ3m,E΀k;择ܹtVp;--fԸGSқxZ)W1] N6LX)hX k(="aUE,GXkբߙFPv'\g݇}*aXkHfUda wUP`7~>WWKMCj!R}U2UN|~Q R (T҅&(\o V8ˎ7 ZkV8{ϒ+:^D;@:7h8^B5#F1jwyn8Gބ8&z:3Bǹ}\@٦>L/4Ib. 6k6uJgbTa3b57(f#GCL0aӬBM4P] j_m]Q)J)Ĺ*瑆1J8P"A~) -Fۧ<J/'rKċH)SkhngH{/*h5z! cOt.g//^qf_zt_;1@7_zFJAM`yd2ԁew 7rzUJy;v[l [te62/dvFt3lգ`?,D;*+T*䛃𵊪$"Pi"_1&ş ^39E@hC(T 5+LM8ZίD t'R!}$` ,;PtZ:F,mNCp1ø]j fKQeݲf*mԲxW4 %G(Vq@Hz$U'k32LŹ7!H> KQ/'(<"~@+iv_2L73B4'>ƻNS@ %C@1YD>h^ۡ ݫ9$7׉T*&a·J,3n%cKGj8Y(ܲ( 79 ..ͼB+z%R"(><<}|<[ǵONϦ՟-iKѓ)0ڤSW $JRy&5 ;k Nn& P+-OʿbkMCa+XJ]?HP6v bv:K%O"NÎRGîsN9aIߦ҄m =h m[_ /.(Jm<䥃- -l=-U8  G1`V z@_J:jJטѦN (!0uED}5Ǖ VsQ!DC2) nnp·̷4c/Pyc*#؇1׎PԦU3y OLq4IM\# :U[}*pY?}|ހs\7V~.[ofV81QP(`=';BIהO<,Wm(b' %23;)_|l̋OheX[؂?_ߓp򓈌J~bVMO}ghdECZcB}+RR3A0z'%%to>*茠i~4;kNq=:ycm"ys-9W;G4Cl0[(W.0z'$d$`9ؘ\AHw;4!Lz]HЄg奚3G\͖>-z= imT:IEgk;=T3}u# kT`4BDh߹= - mRVfůYbMd0<WRA5dдGIAnI$H8/Cn43/_VB`4t<@L}&?PY|TfIel.7BU RӏQhC|rvx4䣷L*JI*QAi;9R"f;X1 =qSH \z8p _;}װsj%rh{~kڬ _q 3Fg/YAkKGw>('OԲ&fip6_ Ɏ *O@K,,%B'49` -4kVs[ͧLAR=R! ٬n(I*:ꖊRk+R;& y>r)sZj'ji?e =GR0Aʜ˽l4)9ZR4I&& -$,VNm0NHJE ){y?Y]>bqXRӭGBhCԔ ><1!? Q@ܡ,j.TF5 `KhrkH$ HJ\X=ްC\nmZtiyY)j#K\mYgBHGUwðL$,^JL,H)1 q,ˋ\Auef2ꢢbQZ@aM9 0;d x1DhJ4!Q >yd6Aӻ\!SP1|СČgqrg yW-@qx_Xq_?  Wa\:jB70y gj >L_#_xf$Qt LWhOh>g2)m'cTї4nâՠ2dO㎱SL$!5*n#*E'T${Gb;ixNb/8%n1:Tx1Xift ;t +~3> ‹iwsn u7 +y*yM *`5W(~؜T(>PAjd+ZgdӤ7\m(c$;F6؁V_99(3ǩV| r+&(E)aJ &E+V%|CAQB 3*d 8URqQ oPA ?~*h?ۚ<~kqn,?sNQҨs H(0){KSnK'Uux)N"PQQ) %qFOYd❝_: "<\Ȼo({MeCzzb֓TFU4aњ$72H$XkT"_k)޺0Ƭ{ e㊲V*V j_GX3hlC_8)@zD8D_ {c}!>Ls6[u%+Xd"xPv>8T0Tuif0̦/xfyBPz%Ad/ĄmgݑSJu`#E@ ܸ+qy .*H)`=)ND )H>`m1#!r3ɠ[Jfsq>CZ.Cp 7:" KT7L۫g2L|<DFx`cg! hC󋧮7c0\x;xnX3L E_R-5UU Bt,"Nk, 7W3~8,.}az5z c@+Kfjn94{le^~q{ ;~s~gxF >RkXk]+Wf KÐ}2H+ў0ԒI7Ez?pCpYEay8 0D 0q.η+ QQv7?RS,Bk:2VgĶ‏d4l-Ԏp( @$"օJ@ ґ2nЁ-Y"@~ZLUD2cVD`% =E4=ԅ2cDf:-=lN)ԆE΃1r<0N,TfrKŔF-AUqι\p4 ,ׄ6 ۄZ20IA]s*0x].U 6 A/Y0!(,6C4Y16 ǐr Dм|ufƓ)ڹB"ko7?Ӫ7NI 'khh2 z w冢Olr@aW:W:z_xo}/?f)'G~(7^=6h~]Ykϐ-KvM2{l# >r54]%oƪ6\4SLz&kDY-%ii^cHDfk "jVip/`B%ZŶ tvoPFp WՓ_4FMֈCW:/ xZk[W4i~v/@Tnnp6E8:trU\Pm3 HfPj9'=`Yyc9ET8hw VݙLnʌ3p@ZB̊@XiAAJU,9s>B bh7 xąM(85euTpʪyY=0350a=@ *T =O DqST5 !,|~x?(9p kjOWD_n"F7׿Qh(=٪vaQS]Y"}eDs teW??AS_*~z ^~zLIHLZ{逸ЛcUxᑲ|cJJ"2c237;XI@lIoH6Lt?wdj6eʝR,怹,*%4a61aZLUZ4F1svk/nciԍ:xݝ7 <@efT;{R0 Z*V蔨RN!.M(AЌw\6=RGw\IHZ@X+ lc"vZ,",8lbnG"@B!NTDvnZh#K 8 D\ &rspu(ϛ2= !̉);೶!#"i\#yê`7Y~lK@q-IHxٵ2c8b*)dZG{ʝQ wmT]wg|c3zā$Ε<Ho}+ w^m | D5}WDIYڿވpwo^85e^Jz$YNKr~:wN]Ǘ2C4[ʇ42(MKƦ8t-_-f`P-d!Ьa3X(~4 P0;W8\MWݩD hïnk O(QV 4whBI HUSTta 5xϬ=dWUaGQ M6Z(hāME\`qµ<@d9R gz#Q%"^+иB D:_TؑB髏OaQ |tG?tw9daR"˙A2 ճ£QJ"E]/"p"9W(n>s.9simQ`;rED.fU<cV 3 Rvo2 0czIgg48-UةJ+)b` W-'HZP[Of:(X7"W?p|QOzȠ#ؐCEujOEɚc/e\%ޅ \.t7)@AcaWd(KU}d=_Q% b)D0dԖ]TqZ2\4VTW_8b+YRfsnV=tFEg+YD@ %w@ѫkۋKcxvo4{QuJf5ZPiMRC&Ik͹V~t6s{ldmVms'RKC"dVm8*ՠ3C5y4YTs$ ' k7Sj((uG~ւXč`Q,w;3[ev] 5 h[HBJoq%*,=B,˙QDv GR4\V PbDqRVAIXNM R\j$t3* ǍIMOuS+Xpkz)A@[A}A͡Ɵ]!}Z(7@M՛ѱaETu*aWT%_x0AUUUR"( {Q%  ̾^+u󙩔@㔷ul;z<> ȝ;=v:!10,0^|jc\Y_ӏvd'}-#o/(o֬ƤD}~J/GỤ̏{v?\MPOoz}ݘvGׄ'?hųрI4Il? RV^W3,RN7B>R?'8\e{5I/lp}y Qbʌ @4b@P&౬QV##s@'LB?!82'eWf jDiw;lڑ9 wON4D\6w'uJg:Lj5`RFV_X 40Ѣ6. 2Y'[8QIA@\^SKZ>29w)\EJ+S]*ec`{H`ZȖ uq2a0 Cki-IdkO{L\.O<9^X^~++O?Eg5BA +aeؘCz'~%{n :zpİNJPQ:su=܁Sk ox3$5~+Gx듧lF, _0}~YȦMfgV0`&gD$!4I ?9 =0*+3x8x'D52{ v5eo&SrJA&p 1$Zš^Q-j8I\ơZLQCgGHcsvV>;x!k3 #R!()F披Z)KL;q! U&Pd TXê.;7gAոB"U"U!%4zJMő1X2s_ :}wד,}D̸Pw Q m%ƒhIkKFMLe 4_ 7 2 P220:R3OZxkϦ&q}%IȀ*>5WOrh[ۃ]4,gf$lWu~pKLRK !Skd{oqjnK ԑVVoQ7hf0pҠ7ANr^t8z` 9g`j{PDDCƦG \XDtU$R05.TL},kF SU<G\bzgIF4C mԤ_kY'!3LV+sfLe'K*92H)0Б%ăsAkeHDv"L rDºlOI:W *0SDah tcc u=v)@)n1 䘰w@H?a$H $, h rp,ߟ}VՀϧ ENl+\!h&Va vc3>U)$-*pΕwkDv ?Ա_@l;俰 Lbd.i씙G>/]$#{].E[IS!XX$Iԟg߬nO͞,S:}++J`m(~@P8QD2Э*H1HO nﶶuЋ)h<72VWlbE$JpT$8-TP-Udw\Ǻz;鎙P9aNGl&,E ϧ61r4X$Hx*)r9mHcs r 8_/Ep /,XPrV~nK99 ˒k"J&`@ǁ}Cĉ9rE(6!wmt^}ͥ_}L5wZ62MlcN

?kAˡ|ti~T{!?H*2\)=a ET;A"wvIr_cА7QshPTKؕ%KYZ"lN-ߘAݏlBdXu3cyZEhS,K2 #m+p$IjA$L|8jW.n&i`/=WДզjcFV)EebS S_R5%_|hnG8W 9D_`*a"! @ {T *jW9W@C (w+NP!3kfj-&;(8ڴ>?qCkxv*.P3gzE *ynpB,Uu!ǕSzKuKy8VB@-@c4#ZRYvMpե Z,Ge#R%mY*?eޛ:UUMͅ -Hْ<0A# cSiRb  [EbV2pi=C4ÛW_ig0g"d)(YbfpK!`g=xnf޽_z#坝gLDPm0@ggbލbD.XXcLb%Ɂ? {x෾\C/0wHFd&0U T>A|rDevєכZ;TNcvhS,F~ۨXTѤemc{ڏ 7FGRA3*:/߅Ԡ2WNbއ7&Fe_;1Bt@;K3F!$C&I$ƐAi֨5j_+7זgFz+]{&7|hm ?*X`vNUb\>*q3"WBc'da0'J;48fVrGFo[t4Yh'HqwPX%D+ P!*d&K7Q1w;cB$}qB<:7='->,˟ݛ_jr.~(,fд@NK}ÄʻW?}y֨x1*; Z?[b_8bm{.մIsv4}(Y(W.W,ˤfB@"1hM4K&ZiR}q* diͥ?T?*lARSF/ N̛fc8EDz5[;B$!_ kߍE17_(c(F"bM% aLFnCm[ `--LW VHxz+x$2+hȬ*@rEQ .=>NR$vU-FMph(l\Hy8wn;iuBZ;p&I} N}$P<OAg$&+"& c`4D^W:31uXC`ki:FcO8 R)+fSyߨQ=F\wRjj/-(X|0>T8[<~i[7Z@~O$l# 7Ryn?yaկX5y!,kY|_@'/X24N3Hs@7 |W:v;o -|4+֓_wh&]W3!6?ʍ~8̦x׊*EO`3v7Ԝ F`lW%h4f^ Uc3@#}j 5iGȭ'XڦZ->> ܶgV^NTLU@ \C&a81+u;[w =负+p`Vo2&4w"Db'O.{Ca dGƨ^0 #yKd"%~o4>+a2J̆ ּ-D *)@!N8C 7!KD)eBu~54ôŎSi/.щD"enhSߗ+D4ڝ2v3]U_~0ڢDD FD̛8A&Ka 1k ``8HD[|Ŧ8&R$ߊG)HZV˒h&4vgks!%rbKa'ȇ7tYMǥ |c7N/J["}Hq?o 蟗猈8R-ao![g=N ů1;w/=r4_-cfq"ƒ/oANwi҉z_x+4HB}+)3 5Rk6Mmb2I-ib{Z(ƫOWW}(ᄋupwmTaNCFd&Ԅ1*5ы"e0NuCGZ_R2 #1"E4ixH7GPSD@;!&EqG P$<>0HyC_LϷ΢NxݬA"t>UhՌ|wz\V,D Ѡ6_͗I4dҜ6UcU4b`1N86“Z/+2`V*B, DFEpPEiD[ʟ3/aZ,2h/ XVPci!$@qD<|0k}r/m?brgЈ=a&m*RL1E_L2˿{7/`ᵟ3 tC`vι҉0Cc3Ӛ_I^O7t6l+Jv4d$416M1$I$VV .\z߿ը?{WiGW:,h/]CU_P~` 8c7ygTժ{IEʲL/ xkjDž%0$C۾>~#` w'/S@tHSa3 ߓ*PiF Z "Alv J43Z;E@*:Pe"hVWzǝ/- >]t'^Y֒0вT@uKb[)jR[Vg@U(]̎[(5`Ud Yɀ6^c'Zֶɏg -4WOm  w8CP@HXdȂѪq{,?̛珝߽i3Ne [9CUx8m\J( ]9#k%u~̉dҕ?qZ!T=+EY*g_~@d{vݓ^]<1W#?vE |c5S,Ml-1_$i$Z=I뇸TۃCn6~\?ܾys8:о ˭ V907[lʯ{A Y49`7lңup6V\̊1vԻ" 'd,9Vʤ!0!*w1+.m2Z,4hz w{R) kٽrpɐ).-$AeQɪf:~G^f"5+4< tPD(]#$pTGmZz8eKq>0|7% rBQE$vQ&E_2Ԫ:vZahƩO^#L*i7OīĈ0 ?|hu(#9o9z޺O)c`$+XQ 䕎UYEwzo )x|gEK&8x2?7&T0~.낝+Ge↽n{:'*~腧}M5:ϘU9%d6/s:dj]3YbLbcҬ^g O[TDiwܕf:DN) Qu2d!ƒVљ[`,1!4Vū#yC\Kh4NBRA29mSE BF8asJS>46us\=)xif2(hvZT& kIURm1}bRT֙*d^Q >ٰcl䫌ɂG {?E{Z5Jn&;́ F5R_wSGE(gUREH.E` nԶ3\4 iÈ5aFP8M8O{d:eyKMbԓ "&qszn,&΂Ǖ+ιz9*S'| qlVZ03k+â}O}' O5:rVnig̠ qy0Kv{gҤ^˲4IjYY6S__;ܨϮm з~lvޭ<ٿ|^?#[]W{^>g5{::p7*hL8 l:WEd:7 U"< (EP>ZڣX;7E(K,`Lb2݀1. ȉG@nM)+lgG7;[|,Q݃u* l"-N1(l R)|ظ& q#?*GXY|+9pݍU9jG5p%vÑٴ%;5Œr ɞ[$r aEUW#sW ^mԛem"1 6`L LqIQahT #!h]Eo_8~2һ򄅝:ʡs* Xc r-IR9: x }_j0D뇈U?(K@T9Wt.ūԓev{m\X{ Ӭި7҆y({ffZQ7kZa[Ssg٦sJnp/rh|fjWٯL_YyMT&_^ZeP(A0w}bO$ $=N.@b֬Hc‪s9=<#3D[G@)9gXUU@cB1&daǸ.ު Ֆ'4nU4_S 4vV?=+S;ذfS1 @ 4nTi[OKU^n@LTS_F G-}iD'=b J/?Qa[P L _ PU{C+8gDhT>Tw)ҬƄu* q2"1:\Y⭥ #}m$[=}jJ>8x}͘Jwq\/PqeT:أ;ĩ)0%$~wsLϯy=Yؘ1UDPPٱp1l^ѧ ztipGڵZ%ݻB@3$H]hLfSV=ז[|mŖ 7?VoqfxյG^>.n N6WGd  hcE7D+Prawp>NvϬi8Z?BS[]aZ-d*w3mB SĚh9嫰ּ.GTTg4P]Q "Q@K[prJ Uyd,re}V+ڷ;p~&?$LƆ UwK#X_fT Y/ؘryc i"İl GWi5V8"+8|]{OiDtƖDCRlG]ٜ[ @ƐJS_I}Uv 82JR?^;qT 3x gD{vc+*Kw.>]˜;l ϸDQ ?pI-ysZe"Ji:ʢ\zipʲtw6VߺLX)D,[ZƺGVfٙv+s}.ݽqi{nqImt~t6wVo+ftYח x2Kb7Ƣ؄;aVZt{k߂Bi.3qDT*4sOet(i&HD(`Ke䲢E1-RtʝV1j8G_]0l~6 z,\Ńay F x t~1a=P~ S! +1@s<ʄUJxz߮ XWv3_ևFS$6P؅?r^ZQ}_r-'mbF'K+<稚٥I,9HP{dfzzGdgeEv_e}_&դP@D =G8LUU{R@Fkz>A*B -'RP8~xYvXݛ~dҗ1UT~Aur룃0b! VnbhX{U{pL+"-&X\}@!:v9>CT\1XgZ3_%={d&mYViԔ TEGpt}jjo_}㐶2$ƭ)}]=3_Obʏ`YLyP21-5{zi _OD;Na*eBqôꡧTJ6@r5?.8"bD`"~H)P0># =rS±BDYqV>SO ;+o0siBpgyh8{^b9Z1 c,O_gHɹhp_q)p! m="²io)ؽfJ/Wh0X칝<]?)$;A@ј(`Ğ^9 M,lکrĊf4cʹTFY896$c 4B"Z(r@?]z򵫢lt޾:rGœYhww8qe3$Ad)wb8$&$ @`tHH9ltb lCߛ~[ۻAA"OQiG(jCJgfD+Zj3tY .Hx!?ZCk߻˲c hz_ОgxA`敇cޕwbePljb ]% C ]k =F.# ! {@pK0EK>5$99x 2PBB$L+gq _aY^15y/f>s@ps:CVyۨ}~jnڐ/Ql9'/n\S"F[Mj$|<]EUXV4BJYvaexb1pGAvl|%PCC(<K# @ f7n)Nv֏,<7  4DX\GWKÆ =EG ƵsshAY[_}C~G߹vy ̿ BBo@.҆EH_4-(1"Y~Kew.uT@K4 A #@+ZiF4C\/|\j_VyV(#W%&3*:dGBF^cZ=dw_lR2eW^=ּF'_B*mpTbuL(H^B:ߋN2~#՛s8g !PhigPAbB$ y(@ {3!Q⯭@ A{3G =UO/0>h259< !QgFX;bʇ"+Har/hO_+OPT 5+VNTD嘴#c SkҹҘU]m"wp[)A7A> [B?Aɫ}AFӍ~x*i^Pa\&/TOd(rT x8 czlZ.Ը",(6ɡ_Jzl ҿy5&JJ؂G`EWdkweߎUSĢé xLhiaf"^ZS wn&+O|-cc_{j%ށ@:gAP{i>ovnxyFN߬9'pmluG|@JaegsWy8 mWև؂"lOv8eoS[DF\5XA#H%X6PZ "#,`3Pu6Υ:̳MڇXlSHf~,vu_ΧVzfDIJ"XXn/3$O8(o3q1Fc/>ՕR=keV(@u[8(A..njuO kY$H SP0i(REơR-x4w@;Ә rn۝ +kX!or: ÃH맞^)Ke9v=}q2kz!ԱwNM,sGDIEmOxťG&>Rrٙ"l p6Hwn?X8KDaq~~ѐ"ewsc~׿ͭ nxCIǷf^~` G^^@ʍ,վ =˥⑕m뼆q~~,c 0+ iŠ8F0Z:{@<:ވ34Kb|(TzY@DSai(8y,$}QQzY-O%DfLES6mjo>?嵕\]PHԈx՝RNϺ45Y֗V!<_FSpH+bBbݣQ,#fwh "[KI13&f,RvF{"?1{3RsY. uzq8/9,6^:q9xqfh`$T& WA|++B\jkH ? IbG;^kRo){G`"~.4)'arlQifޔV Qy4G<EȌDc￵֕y_0_k<}yL+ .mK3GpG?{h˫G^90a#!C[{IɈ;xm}f JETm }O1Ė:}M9}4@QY0I |t !8TU&!h#'5.zEeS1/f2͙(>_nቖӐV׿Xzoֺaso/C\U<^YVQTUEukXŢǺvn8ԏ&Zo>:?«Q+cͬ7(5s=Q6Ж&LP p)H ;9j0;~&hX /'8 Brv 呚$`Ь"ZQn`|zmB8U`Bp!XvYa6➕+GwUM#AT9v;vݒ -i"<\9ᔵd2~̉$BI@Mu 9ҤԄ+P#|RHd ʧȌhC?8qyڗo^Zd`S|q3\>gl\jhYoCnJC<;D\FEHZX8+;*dGYt|{σ8Ώc|{;ǐ?0TUT ԓ[7nt_>4;_y|Yewo߿t;F7(mS? p͟UJ0fXM,*_%5"0nz92#8z8n EIW@:&W K̩X)ndf@*=^L dC$LEdz]0|/÷~=κ 1dcSd_X4?}@H!jܴRE6Y"z]"  Z"YXp5md-jItdiGxN $r! 40޽c|+d_$28a[ ȓQ5epI<|V aIoW E6Uu,~}yW%7NYAG+g^g" Q_n1VĹG*+;gN4CU1# ^TS}]Q&>?3[1Ƙwaźt?x޳iͱ AԦwMЩ$}\H05If𬎨Te)@dʮaڮ?]Zlq(_u H$!!w.,Emɩ=q=~R><|㍌\u*?WtO&YVR<^( CR&m-51zė-Cә7?7u½s:-Ζ/<)Dؔxo62yb{w{G·?+MPdB cfP^g{cM=yx:_g|9 \{2l椡}Ngg ֎;9AW? qaMj1ǫݫ(6J;QeHu6wa 5 QFdX+ Vb: 7y"<*iK/ m6C4aeVca6~u=; @|w;DP bA#H?߼@8joh0Z@P'*S LZwCrNK:c7W8nfv<ܶ9E@$-I#(tRYPE{4ho{E _PeɏSh Zx{ NzfJ$-Gaڡ`k)/qѮ_(?4-)d|퍺"BAG®zN,$bC>~`u׎(DqNF]5\+"űO4Xg)FwΚΓǎ.fyq_u"H:5 pOO6wv`TgĔ6ދDӧ9@},29=Y|=OºsU昍Bc)F ЕE4?4 V֐'H !"6 ~IUbB9mlphI,ǶZWq:@3,%ؖl; j;DfL`TQ϶N.!aӲ~V!jUo=zZlk3%)&_xUWMf=bж[2[d\Ǔ`(`Ag]gTǛqGYpDZBx^)B7`e'dP4]nnl1KUT`Urф|T"գNiqqx+[d7WHn|^R?q|e%XoՉe rI`ȱ7D&NA71:9+ urAg)ryQ:;OǏј#Ji\vV?(,YPxp}XA[<й-bڦN)4L>_k4a+TvX~Px)l8aQȂJͯ=T5 eu( \;; '/vd^}gbDlJQDxazhJpj!XIJ3kJcQ<]- ^yv.N/p_3'[s*K1/-8CEĩ ,J_Z%;r`I`aB@A6tΊ`/c3^j1Θ|ȼzN!- v{Pq[m.fZ_[͚Q >Ǚ4 ?9 cWۇWl"utq~ +gJaaAA J b N3i ddTSPR}N0.S'5.,2“|*{|pfX/])]J0E |2ÉS"&f=ظ8X,7&vjZ{11 )THi6 S|uz]ݹV\'UOv09J+~`ZS-mtV@af:;<3JldD32*Na>ötlC1ܫsKZRxoD<6YwO'r&m#ϖޡ)|{jxU`荏ju2{Vpk̸@7wh&?aO%vN6-][NrYlDlv 5(r,?G%BlqgJLsUK>̈́ Dߍ!uRzmZ8$bED8UئXC !*^on&g> a Reb|Z`!zf[Cf=xď]gb"}0&xoWz_w8 Jsq"R-Yq·Όjt[moo֊](ol]ElYr ᨴV|qֱs8cg5D)2z>dtqC'fY:&h1+zVM?Ud ,l@"O;bQn@]?KՁnwYz,ja@c9D4C{Ik!}P8kMl%:6 X@`T4 ] L.d1|"_rj:TQ[a/u9?v)z_Ób/"k^Ŕie^KiW"D#g]Yxc5_WܐD'f1rZ`jA+ j?#fU.!OP(ĖUjl! ْh@ p=ߪc P<梑MY8S("`2e3)'DӫoN pIW^>0rB ^}oיw X7GC~t3?\Ĉ@ϧjH1O,l1SqY|J-y^ҫزfTu/$*hg%2c&R|4_,lK=̎e{AEs("+^8)B+5i.AtVYF"S<A.ye h(!$M(sPڼh drp30F1jN%~2@2_q{Uߨ$4bF"HqU40)^&)%NL=3I`912w-.}׳4S@ż *U_"0ř2/]?~ %0l\\妾Q6w6w6q_,\suz3 co5BnN[Pn@g+Cw| V=x:±v܏$:p8*Y'1U+-d@~ky[y_34!ծIT?c 됔B1V#6(<19nfg]1^(jzPes]s"腡Ig_l.,凮q0 p I jA׽?<խ^ |EaM,ثZMDblB*`cL(F|_O d b@9e%73W.dJ1-bp'CuA03ºfu)WSG(.M)cA q(=xMAGIY@C#lgP ~O=xzj&AޠFW_m sY]F%`|@\Y^-\NTY~~ 9-~ZDw|n?=rw\|{l3CWk=;dC:td^xi_F 2߫E"냴DUi+;pvGv}+26M(`b07¾%X+;D{sE [AUJTD(3`="YG#vQl8WKC_c w =L5fۤa7xWcrygHifpuyo$&o?~a9d'‹,A Ϥ,+ʑUW,F(J :aq,[ӧ艖̞Th$13 C]/iܰ 8 *D 8a /Dzg !lِI WL:GQ RsQ(fl\ L/hefQV*51Sn~ @|3SʗbsN:$QY#MÜgF_J<  ՒԒ0*q ?Jj:ŒbH&lOTpXÃ]M"X(#@c{6Ny0͂2ۣv 8df#Jd: ޹f&{ڗT,?bRZ#0 }q-ݳ3 "& >Wȹďߑ QjcqlK%xmT[gimzpw%97wm Y9l (HIsЧOE~a% (mwl?1KAxVMlh"YyDKi\H6|Lq20W]o[jĴVjJJBtU6DGL'AZ۵}6Ȩ}Js[73 |Y~GiQFb'GK X^Uv\-*B~GqJ^ڀ$'U8ffzm];> K@[bwMBblh q` c'n"U<<Ȳ. R {K D9u1a/.tmZYl͠SK !`-qJZ~v@ ػr^ hj"LffG7x|cw0@*:F, t7@8qAdp`(jRIC`4 H^sgK$f>"~G*T-D-(p"-3;=Lcx{0L+8]5{umٚv}p Ϸa߻I_9Z<c|pdnz"Ž =u [/3 zݿϵk]Ln /S"a9 DrV6֋v75-4cL(&-{ eN3罃3r9}9xCqȌqcLX^wIqSkZj[ يQ0t>$uv-c5z(2shcfTI)Ge9u c{]}"h(A9&*wo?'Ýo޸~x=7c<\ø8@$"J(j~J~Yǂ TH3 FUgPȮk /,+c w (8Zz͠{:2S+iPx=`ȂSJp|[4cH fpyU5C xtD KD69(jE\,]J~ tJBJ>e|MM .6-sLba@dBa6>-ݚh60!P^]cg coD;>}m}3zQ|m;7~R'8+cB $bS~a6s nFgXă Dd B6dvHn$gw =(5jMR˂P\>`?ea 䖥`ad C Ѓ+(g:ic<5_*<0SLrDV1k@CNط :վ{Gn\y;~QJQ(tPJu,{+qP12t;,J@pE "ØOµFSƏR 1x:2.m-ns-Yo*VÈ+3 1gLhjZ1x"-G)ц-_BAg]&?™3ŭS " iP5"3]AP%o+ >COz3Q=4 [qSgY]YF$hgө4zf[fc c`]%Yy!/vt]WYh@Щ`FMyB9pE؋_H.vlԨ:u'L.1qlXL1vۀpgZO'ˊJJwcP` bCB9pJD`ħȡza׹uLPAwEvzDw-f[w3XNXo0C)‘ ʿ=ê S."D'KEbWmQр "NNsyGu } 蔠%lʇE2s93И OJY-C8]nTKx?bL& l`mIIm0']>koV k{yPKw*$tZXnΜMԊn)361 BX=?"ãۗ~Z@1d@0IA `8jҾ$Cg}Mհܡ~neJkvS;+LkBRV'檹CDWad=tţ8;M%x Uu<{w@9;mۧ@nPT8':",e|ZO1`1kIe5af&r!}xʄ_nؚUHɦh69UDmi sokoN%1  sEQCTtIJCZz6\Q Wc500g p:*Iף- E&HDO8U^5%a0+Zg1UE465[|mӨ<{g.;F9WtbD^Ծafk{ |1 !WD=vzI@)z7ob|s"!#s-HA"(aSÅSEc)$9b-Q / bÏsGˋ9(w`=Lk& {[Ň//y 4[D'I':Z=Jk6Sv|*bvY5N*9c+ Qj({vz{E h$ 2YAp .!:£s,Y'OnO .Ep;];axi(n}s:)Ve~NOU]$ „LdHq51&X@},u(wAK]ޞ:|)ȫGΧU5Y J#HT?H,?~ʬVTu8v7p%^x*XsqLΥu:fcî M :OEfjZV$Z'%8اO\|lTB49(Lb[^c)WkW /Pk-P<b`Gи*ޣ'32p=XJ >+d"@ǡEY~Πt8oqE}v\ɋutnLɢZf]3sl6;G@u tU/_Rk_BQ{?~wUqt!PtA$[kA<`#2O4HdX(@:@bՊmq${O1v6I;?r<#OC0;i27s .l;4E*EՊ/:cQ+K~adz24, M"s^MA߼_.ZravjT[.ZR,85~ "Hɴ˃5HaxׯBi%@j+Y%zPsSw;>[w7+Ond'_;>ת%I"RIh *B:p.!.^Q_]aNyܩd=*p !ݺR1. vN=(N /F~qH $*ts[Yi5j$ ͍b gI;F^**z¢QRPm۵+wl//eH n LMZQV4 -_"|;m; LUsj7q O/Q37X:@^abJkod0y\VKR)J!FK͇{1Dxh38xpZ=O72S$xFFT5Ĩ/]Aa`W kՅCN dq?k˪7G^-A ak4L|@x"_/S Ǵjʼn0 3(ө0u ~ P) vԙkQ2(# u Lchnߟ]?T‰wjݲb'sW#؇629 B' LcqΚUB{@C | dX3{;dIiZ(b% o%t 4A,o-礮? Ebpt빮,M$48 P T1@S{:-8}o)+ #i. ' `9cD;?smׄHRLۭLr㘁FyM{R+O0! dM$}o*b @!C.9kR VMN [U1+{x,ٱ0|hf'4{]wkwgC\{pe}aAT !Ax( i\M 1t>;Դ|>vի >!ݟk|s_<ƼK3(ivPuP&t+ߘ'G7^Y&!Sc>0;@w)7'']9H"˲ٮ'8_;>?I$:!WvUeHsol[a|[n+?-9nE:Rw0Pԇ0Ua0DuWlh>KYDR>{֒ٳw6 0%*m  D'\ʞIU2v,W!E:>*EBx`sӬS3PC9]3,({yWb{01Z&-&݃A ` q~ɩFvNS9>KʓtZC@hu$X>N2J( PTnDjNx>OfX%q'B@>&Inhd c`zWp_$ٻlJϺxadz u]`t̷ .;[cGˣMgqNQK*Hx.+#Gssca&sF#$$afX4Pߞ))֭NNOBTt=U*i &SP;c:~\Cb4F{-K|N ;l~o8@Gh73rV0 ݀c09~ oN=k51!)2H"ӽ2&OyCajnXG Q[Wo+\ԉ\s|cB~!͖AdiE83hULlĕvTߩY{* Es1š=e" wC^7., n>4R3s ??W.88\٪Rh@B=}}mh Ebj^KtZg|1 s`AMzj10&1ؗoGSӣ3'ԋsL!PE*4M5`TaDJFKcBN" lV1Y~RP̐EGs8s@ Ԧ$|2JȀ`Vfv溺(Y&IT@o]OD`[_, [_" P*2""%eJF-Pz D**9}APssb*r$JRtĉm,5]rLq\1S. u}6t@(񀼲IAjv']% Y(Km[rǭ!χrf>\>"Yΐ(-AG]({H WԚndQ^V\(`a){̸B ISwhS< W`$?QT "psjg=*O@\ Σ-ƥFdgW*F ;/^F3&, Za'z)ŕ #@po?᫁XeB p.i9} Z4|@RX,;c1<[ #׏5Zh4RIiE|4冐o$ʀQH׸AEgadd/Vx-Du 2.dދ"%3PF$͆۵^#"݋m0|RB) EHHi-Y aF}>:]~+7+Ưa@*"jZ=~}):*0w*_-ADRtPgÒ~hA lVn8 Daf{S =̊ - oqfYr9'FU @ ER +_p(<$6a. 6O@vAMc"j ܞ'qU( @T#Hte'RVwo;څײ?'UD7(I8FO' [ +Pv4 uoDP΁僭@JnXhEk5B{}2Px";>X  O6BZ/kꜻZO|HEhmR@ Qcx}Eb {ɡ>PgZz4!MTR|Pv$aQJf`SxeVvG2` *UAJ VcߚXq[7*TBZk=6c(Ӗ~tȒDHHљ÷HCTv\1+a(bNFT1ZGʏ&:q;mNRkO>»c|41V* `Z@Ȁ:L}pYsE IYeW( % -ྠL*8)ZYƺW`$F2="d=e0w 6.~i1?'aDAPIk( ˄`BvP> N"" JCDŽlScxTS)1]۳)hߴ8ZדD\ϹC5yq`߯P2`&T@ey"coM5 RaO R؍۟ˁf;)O9m4hUK3gcC/yPtE7PI0(=A dǸϼ05;S3y_̎}rGH{٩F RJIۃMz5wu79]sdV[*QB fxUWi1Uph5_ _4N' pfG -V VP2 PI"~q$HɣW<&Au-b4BNf"@x"Nؖ#NRhD9$$ogW 8c:+[ܞv ް*)9~9dVj!mj_Dhxe_If i3@[O,"9VNZKiTKǙo%%*J&SwebP(,^\FBf»3~6ȋ7҈"ಗ^5ꩯ}qѐeV>sVQig8ѧzʚ7q@_In[a|>OK0cTfUIψH*3b?3XVJK8r"a),i@SʵSMv]#x10A 2ȱy (JE._[KAR2v%j )MM+LJv'i}QӍ 27 ifDH)Dy0W 8MacY4}$Lp@$EP>%(rʶ8 H|[aySa syutp]{q$(ˤSK /P=kآꑑ1l#ā?X_:E}ryp3dзr)VF#-HH̾!4:"*2Lo"V33\p`d[Fd߸[<AhҝvDИ~R9 2,a y$喇}#z J4Kx v{r@%"W ~ydg͍3-.Ȳ믒pߎ)E`Bp93g9u9(L4ӟ!zL@ Ś]WǶw8e's^(βcv4֕^o'P7ըgI,Ո3?J{Vgoʫb.K(gNwR=2'h _DEoV"[(s:qBUx$i #IXfG8J`T $4QO2#$t^9[  CQ07K~Xjc~Po߷KitRk4q`׊_qSBpZM̶l F i84|T Pۜr TV`a܆>`})g- nyε3 D 8U'Yx mv>λ*7ECIzv3u1|0p`?ȑ v$h6@j'Y%/W{{Єbc4ǯs`W 7ECCwVq7Ͻz8a瘭Κג߷or|vȲ$Qo$Zj4e+=FV#Wmlby6 XQTM41> ~@c@Xzu؋ !JW|:rǮ҄=kGTRZ`BX^} XR^Qu[zv ^eP-Gezj@I!2C2 ҡEރdP+7񏏆!(IjuXji6"*a`oa72UI 1cYRdި82;XSP[I in@?(iWf֭SҘSZ$uL{11CCnCx %C܍v5Mqx|w!SA"OR\CN# -exČv/k#<{L>z k5B3RD-R'0>PE(]޵I0QE3qE$O@1ur3`9~vX("0[:ʭt8:9_k6ZfV͛n߉᧶RN>^SJ!z~0rch}w"¥٫;3w}@S<@Ңպl=BHhv-MrZ#@Eb`SX JPYy',PA aLfP) 8J>MK17F g@M $ l(`On"_2Q#?,R̲@PB `&"(拔 *M !Elzm*N];=&@Mu.¥I(TߗeJ"IrK72q<\K/m>\>$(Zf:Cɡ=N~!ð-rc͑ΉY)˓S$-' A4WϟRn<8`Bp3~M" 5\xY̧;SQ0pa\c;@2A]]v^txA[޳PB`v9kGθn۟;"Nyr=ki]7RY\.>d(YW^z+ W|2kGT=ZYbšXyBEઇ&>ruP00(Ib cĄP %+ᙩV]̦fڌ A|XOَPPpdR (GhhyQPUMmݮ эG޹߽ N%D;đ$ Eo4g{w-\TAB  L'CtyW@NHdրc9ڡvX!*ΰ, F9v]sBPv:_%j%ElVPo|M?6Jdӯv]DX\Gjz=7RKA(=18f|b&8gn /8gsKZEv@,#}PP9#k|J ZlJ VP#0@TܚF^rA˞ b r?:Jg$b\P6mzoCF3`E11 r@VVL֝}G?B8/eoW:I(,)Ԧj"2KˤAs Xs S5 ( XgXr+M-)&d.)-%LT%g=&v @2FĚ43;,9R׾-#cΔ7TJ;!{("A @H ~ŕ7jȮ^$m>Ń_X+GӃhm0Ҋ{>fF6'UWjᢎ%b5 v 2&q R%4/>25Omzw=-x}h:cvܔegoD]:Κܛ|/oGȰkCYkMƀI]X0kG~D]Wadܽ,a"tiU&I!i  0@"bk02q2X UWġ[AOMRlKaǥpYײ2(]}M2E:paD3BVĔ.a5kRYLId8ŀ/sB@R )g4HV "H8DGݲ5j,1e†+ [r881R7MFYj&JT *<ΘX2dzq/>LQԗwT.{?G4V4> "^N .&vAO7$ Ao잫3|캿=x ,RpQW1)8|䛩ZM8ZKp4(*2+["HdU|5wTYpΦD\N[]2"'hᄋjZg64dtjGޚzPQ<FԍS봜Ȅ@s4f.Ǻ釶E,GRU;@^4p'9WGZ+zj,vBd=F!; Ft~@ >fX"mrfuM=X5nh/7h׋!,3$9 (DJFb-r Bp\nNn}wZH[?<&Y*mP9p1%,bmA+?[S22@fdݶ$dMTJ>%c3i׶F M¸XPLY3*3M _+r+UP؇} qPzAR Lgv?ANUr 4_bqFЋ'x^=9:R"ݟT^Np4HKu^D!&jGN^#Ubd|]`DP]a0&,aݪ\_䂻WV4uk){⃿x3~wt2WK&Y#\^~"l5 eɶ5C TDQQC;ŐNyaQnVwncw_) CLsKfD[J䌠_LJT ޼Q𢍠0_:ۿ{nMl5t?o:[>I.23*AZPHRafv{Inn8)W(t k(HPP\&N}zw??Ed*UHDcKcEN#ۡGFyWՎY>)a1 jP5!W'Ry;Sb%mXDfo?#zDED6=`p@cY! VHHFF.}Գ2d݊32A+9MVՔ .!&MD T*ȆۺL1P-DLcq\W.Ϸ߻9|2"3c9aLs RJh9N`)k[W ,w~ÞpT)2s{yqpvIV @NF#, ѩ1mRO*.5$Yqtaolݚ$:{F B(,3Ș|Vyw Sl4/0z?JV!CD(j*yѕJ?o4&:# "{hzt8AKWקN2S7.R]!!jWN@3\)ht $S(Lcm8D) eЗ +O3(ap,KY:5u0B$3 NӒOO#>:|קiO3'G-ce(L*] e Ib.gXY؉8y8 ;DaNi@2,1C$ޖ I%4AШ nwP(v~# M@=6}=)sɯJ=~>&yM `?wHmMG.;f9 ==d|#xAyDs-Ci4]!7@3*5F+ӱ `"H! p^C)R58cX.o6s]ʟyKEJ]?sFS¬3u/]Q"9hlmtޚ?en`|GDZ"Dl3kwpv=9Dѻ008LaiLN%A,hBg7>SBB'V(ƹaQ~O8/D(#tbV* *(^db%9SI42NOghXg)36_Ps>u`"IQkHG͡ Q 8n%ipnbI~T'#@H~2@+ !ZG4+@4 *1lӣ^ 8fnLĈ}u$@!Gq92 QM+;cHls%&P zGU e7_"SAE*\7_ݺ2wVFEPŒ9L=P#fo1r#x';/o^j;tvŚoGډvVV?ۙ)9g#ZJ'L(A:WˉBslT0e JʡpCYUܿTn@nwWϬd ״:f9kmY iG gNб"VD:g pv;S݆S0.!H2ӯA (ʬ7Z^uMV֫x ս2/Ai5s,ؠN%2`:#x,iVP)Y@S STZ$i4(p,I!b\p0E+Z  h#Fڇ|ݤ⡽\?$~GyF$BJRj )- \:C@CC8 Pc, reYkW{{e;_;q>ɏ߮ f InT- eyK"<]ڬhQbgr; X;sdMb5)t+2Zn-H/ 2S`Y{yQ* g9A" "fO+H\)܏(IYa(vփQ@;czOドq%/I ƨ.Mc A}(,1k)@x yZKUj9fsh[=MTafE8nCt=!H}Xrˉ^e-^aieR1,KK-v/UeE/ʠRz6m]<7ER'&0 I% Rju̘ ؐɢFXݢǺm%7޿bfЩk3BDE=|Fj_, pQ! lhlQ܇S[E4 YS:Pt)x`twˬA*ITo}受] S!YL*su-ZOxS÷d5dȠɲ"$ATɴ;r>0s\#m1(1]V11u$ pUޢ*^Frkfd`yߪkv;&'aU@Ml /:axFwkkr#Ry`2E4Y* QvCr`97F#[!hjX(J(`wqMʱt`-Kg&ݶ 2c'@03ha];K1$X‰Dދp.*K<,?c6t86A-sd D Zض&I1ѽ/FW1Ѕ-\DS|v:Ի> 5OQ@G+Aw/{j_ĩ =ů( =sU(Af JVXV05dd*,ᯣ0}ĶMU *yDwгakzRWիyX* ׈#Ţsn!„J@ Q5ycG'J͒3+M 26"4s k&v=Q(gn:t772| p皱(HH,yѱZ(6婒9HDװ.w_11֎~11;ud)\9T Ma?mw~G+f]U9lޙؔ~ƍCjw<2Y "3`@hQJ7%Af@;0*ڤK2RTrI?F h"M0t9}E_} K5D :H&B I aLY/**h-G^D>;D>ZNxq yF˾)}`s$PE{~kdwd/d Q_h#Tƣ%MR^܌m(S' @ VWmf+s\ܨX'syٕW "Er2oa^ LBY<ʴRX 3 fy.mRSIsƃذë^Z(AM]qM$h [WVm|t'z)_vuE[G(dhax1AYC6#QxERP0,\㊪*'H; 1?u-X1 xe"gFO~QmI}uhE<~2єt]\AW -tR $%jM|N jn>:y~O)/f ""HȲ= zQ5luT /*h g*b B#gi0ZE:tb9ySd1xq2c~ 3; ksbdxhUv`T#!R>—FOK9cEPD&Gꆣ̀sK;( +@ո,ZŇӵ^;eӜ""ST p-bb*+/j=-i?M @k1HH3O'T"\i=]i{˅$žVYejSwoolE<]̽=8"v=N77l44_Ǹ%d.Q4aќr6PS9̓ah$!NUn|:H2԰})+ {0 yPދ{_;,U>Hy-eYfɄocM¾,EdkYk0ӑLEtmGgΫMkPkzWyy 5Tlgj *W֤aԼڨQHVH1Hيy M,u @hKQֹŞS.)HV"w:88F+<=8ΛYh_.]X@Rʍm1+X$԰M {&~rz1tíGA`h)(N w\ -(+VSY32ݭňGOkp CyyվZ 6I8RtT`*NBX*D7-/>htc-a6vB"G;z.? IȠqؗ;=Ǝ23OZ\E#ab7 (G ɔUT_} Me`B<3({\G{sb66~FU* YN& )4~:ǩjlhgP%2PAzj,~пn0<"ݑ<@ۅ XEjABNȪ^A̴6 tTzU\*Bʲ2STE"@i}Yȋ=PvVM&GZkVD̡c mYЅ<<\ޫϘ?wZ o!! V/o/Da;^VLɒ 禅0U`E#2Ξ H@D^c9xj(K:bN_D(0P],du$Ӯk"P#0 &0i V"R#\@ջGk[=c=p,PFTR PG@=i(SԜDF&.o_ ϔwP[`P=`R5U[pWULPW]Xቾ 9 H#' wUh%Ϣ/ {Gv5'FZ1,jB8֯[&LjRz|Hk3)D>(w( 9DG/@wb Dn[<^dnOTV_;ӱYn癵d2T;A4F sF|qѧ!Ҡ񆺞7WaȪp#*~>`H]DԡUPXz#}U buT(9YfSWALj* wfV3TEit Q6+iBeKv%C>?ͯ@Teu,BLk1SClmVPdaW@a%>3=NbLQ@ū",&Fz?vӓۤ+(REttWrvnTO!̴qX&#,k\[z3 c 90L":z4K%v@Zx]..y0ľ9a("*?nMGE>F[mQbHZ#7p@osks'))ZEU8" 5K `iR"<˗ &LU ŏAftHL36f8I\GUvex>R7-?ocDfznAR%01Yf$^+&B [W& 5*r}Ba DoR&P1v ˂ږkkx`rʰ 2BRF!myʙ{lhw>"&kU6Tzi`iQP ⚢OP>i"TU$a]̅P3@G}؏. xGFslr! *"H|GYb~`P_N|ڠ@Q *?\ 1/B8"Q*gxa@Cd׷mkr4Vi)1,=ڤ+Y36Ku4[VOJ֖BS!LpRGxtЙ^I_DANUÒS92FUN=he6a h}in-{DϮX Z1<^ ܺT̉6d%Y*&uT)tA!HT C slB*:xkezNCu̎<Lyd~BMmY g:ToL{&܁s8+Pb 4QD}DߺsDn%C/*k'_ezdIȅ/nࠚzyɤ_ ʺʳoy^"6j=-h KJq]3C#mttM~j\nN?+'D68*+gd  ô2++ `0h-?qt8NL{h3aҳR!.€Sx,AzV 8[@8peգХ۵˘^Txk[' ^Amu QsPLՓ28ߋpN4A(\li&@w5j A0STVw(h[)k\\ xRy#Pk刪n*z[3Lߠ?[xeB(B?Sk\#Pcu<Ζo4bꡳV *(/-*st5w^ ߫ڍ*E`:P0g7ꍳgm># 5ʍE1A1ZXaE=".eh 6P{?=OW/k7BDP={ÃQgROw/o31ثkt c-DYe};2YYsPQKkpI$CwGo/oQ9CPl|9d=ES y!uꃧg;aڙo6Te&?q0ue ӣ^XL !u~Tmt2=<~~È+/|Iɐv{1S#Sy"GQqz86WPHw sǢ ^@D.Aʝirl$B]'eˮS=!B%vP:0 1p؝řGıןڟ7Ưt1"mBb=@ؐW>~0nU @ɏvFjkK=AkvQtAh5&X1)*>A#<PbBOcyJ$ QU.WYqkt:"ba_ÏNYER#(H'‚Ȥ$B߄55U$0یBQA*mKE.k5fMvTP ;c UfR-!ڧR~C"thpF`b%FӻaǑW_m @V$bԕz S@4d`{vU8U[ ( 2x9 O0q ۛ\nD4Cix" e!5c}5kaze01 MDBٵ)?P~;h@^UDU^_As~tΞPK}~ʑ8"4mM3=EE}Q\T@ZDst?ƕML@B HKg]5A`wmkȄpff$+,@)0cc rqxtL#J*,QgjZ~.VbUnֺ.eȰeK ^vJLєj<,S"<'JѨW%Ts?ů{ϟdw[E v@&SʹD@Q]a*we(ƣA Do3/Uލw&xTj@t|I#Xj[ eca "tBЋ)`,j02}zʵ~H2L yHh-Ɔ젔D:Q%CNu_Cx= }oZX "8 h &4LIE¬?k݇`7J*$$Mte߉V6Zb•":VG_{Zp"aw2WԿixY u`Kw+kA??ڕWZd;iu:aVI'L  -6 r3)}"7`o[,ݹ[3+{fQE$km}P*{#ȌD]$dqEM9^%vtJ֥(NB,.kewkg!Y& 5 ؇,+T,b}뛯Ӎvh-0|6/P^s`D4Iiy8 /s&-Zta$@ytT.F@I&^_!ݑ9{uDtFW?O=aL 4XX*WLn^봔ҜH@7npG+#H/3 fT50kFչwWSY& ~ZUvx;!VMH &] h׌0?~]ڹ{eDd]JVEE0CeE:kOEdXqP;`X1;?jY_n9_Ϯ 1w'u1}f_Xe}4lrYT/^|Je 0kR;k5;cLf5%B 4i `P˺xG Α b&c엍+K0@+ܷ jPɈq l hQQ-,$,8Eo#zh{VNWO-Z^AHu٠´51UT91Y2HV`W\o/7.YSTkʬw+-e"NlJ:w +4vP* ԉˠ!B].PD ͧp\ 3Q* "Zײdks$xeɃ+Yh+L 4ݦJ_ޓSWJ>j ,!ujXk FCФ|W3یƕp&0v%UP?p/)A16C{j'!|YRƞ! -ITٿAY,&J1GCHdΜy:/OK^nwݻck@Y_}b73nZk-!""$kBTr cr5{YMf]`W'0A!,o9֯@ޡ.X u=+04%8"*5H*:ja -;2rE#/ݶu*#P֭6RM5Ӯ@U[R#EahOv'xWzT^Z^b?0f!3T-E<'^G|"͓1*Txw]j]{mmΥ! vRZ9KG0]#ʧj#Y HO6'Y ʥE,& NNx\vų&:sS擈?ֿG\;\T"1*DP(p薏jnR. v{g;^z8Šճx is.>vr)(kmg G&/[w{&,J wnN$CI(0˟ EKJDއYDD!i2fUa:P!P9QYi`NU PK9}r%DC6_37֌IEz)W{ujQvÝ'ׯ¾Y͉[Fd66lX%"[k) Mvf D虉ӀPD}=)44} `Aqoy K2ZX99A Y"cNamm}5Y5~X{ԶRQpT@DK[@# kkrkZOsl  FQ#l1 GZQVn_ghɷ;7U+˝E5,CՐ#'4G ?U__d!}@C.QB8QQ.ٵD { w乮((pNy*:GL?{ٯ|%IQc6lM9I @@Jz7ԩw#dlU{{Li)t#@T\L$Y 6D8ݎקzu# ƑԀR3?/Kp0_ 4.3:a}TT'Ñ:t{f uU>*1 ?.ӿ~\ ?}+z8Y{G`69U4cB̠*r7?!-H7,AEdMu:;кjpz,W-<}TL %XrEtDt:NQ[FbgOϟ\|/O LL"IT6$;pX!ɻ*^h]7Rlry:,Fjx ,yТYVs E{Nw7Zj>:\hMoParv"*Q8IZNs DTq5̦,E-W` (9OkZ/B$A)L@b 5٢QGGudwCXZ#V}80+] 4ZYgv z)9EPA%ɭj/~D@JMm?)gXC`xUud؎iPy<~R[ :x7]| f? ܒ!D|+OWW h UD $d>A@Wi ' ,H]}"Rī3xC=Mk&8GJ3" }c6x,YM0 KoE$][N\o睻Zr¨kUUq㵪zy}N*"4g򳚾f" {cffWoy"R."RyFhZV;/ղfDZc5GeԐCAՠ1`3 !PASt9$3y熈ξ7H ~uF!c_[[6 24'N? b򨭏Ec̞ldяs︫;uDѭwzy d:DJ) 0eAPֻq._0&&5_MWGkSRJC}ƥBgdg51挡xh4Ӈם+-ד7V`y(ZܙԨ5e$G [z4ƙ O?o1 *ު8Si H@tMfQD4xroΕ;F4Kdh$yJ/g?oTw*o-ϟx2HU*wfhrxkooD*__{챎gyFY[v;3y;3d gϨ!XT|9r4(?;3dN냻UQ FV4TQu!1LC#YԒ%# |)fP2md>F2~o)ؔ"XzzqtOc{V`5H]#DH஽R;@D>\MJY[rω:WԷNEb2;?-9q0d9)x90ԥcvz:nnp}7n<[nl3d(:tھ4&!ekd^l:{>E(W6CCΩQ5E/A[+迴9wQ"xR^lg:fy/ou tXuebW*_?6ak l:Lf骨xڀ~#?D@#1dk(x%FD(D Y(Fs  MGU)D:!Dihtu}n!ǀeku YTVb:E۱G =kvޥvSi6:sA'->+mՙQg-akgE>z|LoՍ Ud{!X1-|`i¼%"[BK)^ƠISnF5Z+z~ļ}6THEg?{N7fpʃw9&dK3"ųwvkWU9=z{Ā/Ɨ:-SdZEf,̆'mQb3~hj@d>Q>#GN9,U$YU3K&WwjU\T$*`Y"u;O%sl[(Q дE4Y˂d*C;GX~*B^heml$qc*"˝ /f ^VEqYzda$Q H Qa|Ym[+d~ cN)=b.G"PۤgVZՀ1fmU*ͨF0@M}$^%w+pfDQKB.r/6+4Vp ._B啾ޞ-'1 A B jt1hx}u{#M6ei3 0`P+G.!{Xiom*~K1ܲi\dfOYnO5. #HpȪ&gL?eғ-#< jLM]MMU<;^<=eh%p7 l,p#߬dU}: $$zfea/{Wd\ד7W~~7_{r0ƀYڢ4c&׸gC#Wd'(YZuŗzI2z"@ h5SA%eF/3FI00lF*@H40ia-BM8-@].VK}T-Ccc0^kSͅwo vlA*k*AgMMO6[ÍBhZ@#FhW 0RRAep.3~P'<]:m~!\ R,PTWyOQDiʨʨ ,?^~/E`2}4|PDT=闺{㭘*)I$oRތgFe-Tf}:2`(ȕDNS˖!%YbH LGwI@3ʼe~95oߝ-0plRe8GXAk?XG\xd.~oa\d ē3 ;~` 8p_bsj 'g+_?ݯ}¹~N m+1on)F\UuZt;!yPjh(\1,((V(C i=VA}vKPam!j"AT)t3@D8Ig2 Y^өq'òhv4XAEK:PDbJ,ULxk^] d3[TGd +PYa%]`>Xo^9;'pyX̬;ze5sm# (Qs'=XhZ`t \ua>O!1HFAUb : Dy]DQ azH|ApvJ'8JAuHH8xvwbk^Zw,54f"YF{fio$ĝ$D 3yRe"K3@8kT>D Qj{wU:bPeD|;7& K'{Z3ӝZI,?ɖM4ļ9sv"\:r0v{ډOߍjHhD@9D+u9{w>|뭷_~~5K"vN?Nȇ34So(! +;~xFpEI1.T(M*PF+x$3?1wB7UNI?@j;BIk, ]A0V^0  /(zb+$AeEOjf|ΌyD{T\Gtv9OՓXPR<*5Vа RVܽtc1&coʻMЍ]>LޘAlga? Ȫ铗tk"tUȎ_lGbe%/731`.;YgaTR"vrvN 7KA߷zN}~Y@(dz{ԽnP|T I9'>Hh2 #'#gb敀aUsG m0ghR ; O S /O|_ M)LUg'{Eyu%v@]ySۿbUdF6R6~N,/%uGӈ!))ĜjkqB"$qм)2䄪*+Hy's &&<]@Gc]US9<Ҥ : Si^E~NI!}rCA^aZŮ(V E,8Fp:+!DPDA QD `EQQm*vF3,=VэY+P)-|f15@)sY@_X\:3@>@  rNeuh$FqÅ8{=C^!;v߃r!blB컪`LP UVa}2K8Ӑ?S \;э⮹p$o]֏ۈz- µ~9Ug$L v5(;{u]Ud48Hܫi /tF`TeSAڕ#INS&*/QD +SR;XA#=PdsĆ3/,ٿkg*ՌJ4Y܇f. 7O H~ '~iS}a5O5-5Lj*.JhfHU2>{1إɤN.is@ HJC.n`[`lgj̩Lj#XRÛP$A0㎇WDn V Z ՘\q $0k I{>'epND*\oP?)/Ջ_A]udY3Nɥo¾v9/TƓ\5o?;kSmsB]pF-U;W/k/ȠJ0NE 3E1^R>|ՙ2~+`xb#Da mi"U#6ۧYeۻt`ez߇WyX}: he=#XKFF@YjHbe3$)Q2~n.2`aaCBn`4acs‚*{ŵͭ˭(CG0 Ď 꽀P EkؿzaB KώB<ָpYeiqZչd~U^C%?Wl,}nєOc8>CKOa ^>V} ic )Քd)"VOjpqyHD?! 1%+'>}G7Ξ f3{L@E VaAլ 9F"Ec+z:LɸϿw߾w(EsQl&4' P Rګǔw@N@c{(15":=P"ꌦ!9_S#O ہx(#d*5E B P/PUVX@,FhHa o fU~RKPc,( LNc9E#K!Z>}KLj# zRzG?p9KjaAgu)hfBq ޥFDs-Ysמ޽n놲QwR%!6ǟ9(fDUۻd)̓aŴAT"yէ`XWhV e-lasoOu; ɹRwߺHm`nKQွXGʲ˪Vd29|/#L63dɢAE΃"ho S-3y(W!k=DJl%UՏjH f}`TH|?Xuf\q{&RЀDU/wwxt 620Za6O,g4DkPEinR>;T$dAphZUmu''tv@"U!YӸ>#E}IwXYPG?<[Ϭ"Ԅy5 P'gbXKh ffλM*_WcGJFѮ( E1x:SϾc4_+2daMh R#P%dhZϒ3531+Ԥ"Ĕ8@<C/d,U^NY^yx-un(K4VQ`..̄"tĈT9,4ޫ+ZTJ}O$fuxa'Po#u"$Jޮ3K ).겠SO/}.`mE0B<űidDcB;n`"Is.;Kr5l=IPS:#3ɍS7ۋD?^^̉ ŨqLT3E 1Fcj DB'%Jտ6Xe1&o(Cb &!&LŮEJ#LmTP@1U%0jÝsR~P.TU A.1hb}V yw;TKXob>n|qRgSpoIB h>ˌUQ{ Kd`h@O㺋wϹD$t 0/k@Tݏ2zT3zTpQvyԅ׽+kYk"V{(a u'4i"%tP4j)|Xa=ևGxC4;hFy3r[eo⑕[̨%avm4 zXhk*mtEs{P_M*慠Q)*uhӕ{`gP,eCʚ|IaABcp*, ZY/\+(ھrs(DRO1BTXXUNӉ z LAkJAęYi )KbE8| 'DVaQ 4Q؄rŒ{reɀӦDޜR!Y\bfvA 'wPu d0}j<\z+Z1cT ڮ&:,foa#_tA LQԥM=N> 5Tfyy`"["=:?em/fA~,{u|Xr.FJWPL7 ,h V>y]ix`[{=;'%6ao=2 Ƕ~Y`<\]6o:@):<%S/޳w`a;=o1#4ˀT]ydWG-=)W,( IJIL,ufwD]$8JJy%JF;Vst2n]/]J`E J_ 6vN Â+xT f$ׅ38@1[`r_B"(A* `QC @0 .-{DUwj3&ŮjC79+]fpM#faܡmvhcjh=k kџ ~sWD֤K1n .=H]c !(jaLٛ F?&hOgAA.@ZAORZ7M?t,!D8q` ="ˏ{ A̢S,NI$4ꅗ>:X/wj{y005)DT ~Y"6] K0w;84?8`ܘ2[#=yXnzyD&r͊߳t9>|f=ȔFQAA:9Agm:w 1l"i!BE^Mwg賡G t ~x]dsQ8=l9@x)$"`fe{vTq쐋]a ߭ 5}W2Y m 2k2[f,2$PX>b?KЀ#1)TPB݈aSacoEP^ BM, B;s>&Dkr?6 ߾{s˯L0Qݪ @1 !QųG[E += Z l,$W;G }D 7"07eOtOTG`LX')Jpe715Q% H~ @#I;{;Tw)Dz"ҝ Zׂʪj_BY%4`"/ (d (h}[쀥|jp4g֮ƖP6EfPfPO}aٚLsPo6XNڗ-dlj.@@3Ϧ^-1O4nEE|DpcϚO:tKO媉tpr}_˕2 _{)4(Hd2cj!Pql|mԥxBKP1 sȴJb%cA8TaKoq)i75m8ZwOTAmbͨ 3t  Bkv@]0]wIQ("G}-n&SLEXP6` 4}Kx^,ѐD_,c8<]?` WV`' ~mE=E8SUU[)H@4~GFq^@̲6"( İ:Lh g ɤ4mp](*TAg&Huh}=z}3DFsK|>WRE LTK7+5""ÏP6^TsոIO5J pmWOᨃ*nǭ\h;BMDcN!}AOc)De{NAMs ȶ-yΉ^+29I%U8paLGU#Q3܀;WZ5T;6y1@ʾ +Cp{3p_,)񕅐՜!ʋ1!j~Q׫ hm͈ד0S /dxCI,TJ\X~HjOW]Is $r87{ obX75?E;Wי\IE@{V2PX'D5c%Jsp*E#. D\Umkϊsͫ7kl*V-Q21(q;%)Д}48"85h怇FPCfA8jDTS$*U v.;a50P Kb:6d7FGR2.K7PL#;nǾ0T׫?W眧̩9k%9Rc9&UVS XZߺwK*s .KtRd܉U>BZ0=' h^E!P V Ct_: VmڨLuC(ZAKO f#44HID D֏J5}85 6B,wȝ(2%X|;3DX@ا[_Cj+{2a*^nM4AGA9l7 ;'K F9N5"?= 9a!?bYѶ}d6DIc`uM7֊ P>䨁W-^/,cË2#bHELnWo HV %V>R?4_OKdw?WocL?BAG"0l8)TxcnMbR(jhw2?pO,}RL M=4Y>L滣OVl~OF˯v˟ ͿXtNGAi UZ 23NSiz.ދ]\DJT٦Uq$M,/}zsBs C=-6 ݷމ "rsZc S70qqK+/I!H '8g1\G:*UX;1.3ư wɅlD ZC9` Qg "2kюB|Mόorux'l8$ZsgOg'UmcU_I`o {yzςxW2r817 e>",%5"dƴFC>5#Cta(,Z +h{O#Կ~r&ӔwY1c~e&蜑UGu-Q~X%7 k )`?NwiaY>G~}u<ӿ o܉Β1T&k8nHRحD뙀|Dqm5jDzd8 6ƚMōs-e^\U}%8f h(=#BA#Zq1~0S V Itwwd2(sykr{?qh _KCcLx?dQ(%#9( 4ffB}fPT{\f[GO Gj")u)XT^LǮa 3ۼsTz-}Y v 9௰#Y,03AJӹWvOfL2^z cQWDe茩FdDEJ^ʞOݗ֖ '@`Cɫ4zu_v5;Ӑ^F,B_j>ycUTti">jlr5fjLI<@c啙&dDǓsI 2%$1bsa`~ˋ[0QLI4S!f@lW.߳Ocz/T?A9?O4,5l!IAg%j: dZ3EDŋK[D(s*7ҹLc8M՛NϟLcH*3¤lK"U7勤:V^&3I9%e$TjqPfU+!U;1*3PlPD^uRd{{sVpfҌEu:P B0Y4=[дZU;|n 3 O>Y9UE]"ob^vsMYŠaoޗ=?7R\1.1}VdFDHB'U#E+KEԋs^TsyX⤿N>_W61ʅ&'΄V%V{%xW?:6t]ަ$J Tq2=.:ph5Z5ő'JAUVWA@!LiAӃ[<|8jo~ C^m':#|tCa=;i>9 kϿ?+^Ÿur%[Tђ/t6]e3_b =\&"i*R8m{]tG3ſL䙳_$޸R޻x}c(61l$k, 0,zLH&,4B(d xԑ-iLw^Ahpm5?묋&[$z6K}.tɨ=oH=*|1rL*rpgg -zؔG4dn1 7„<}@iykwNGztxuIJ׌ɏUwN,AP3I% *A&DdlUw~#Oҳme=iوޓڨnI¨IBb \I|b>|=QPؓq6]ӓ1'ءxp@cg0&Lk6CAȏ_,KrbtӅ}Q8䫽.-"0.R{K ̭wf^@ċwn?Soj;d"2d21Qe8N 05HZ)(]C+ԇ%Ct)_^sqs ( D br2V|p%a`1с䘈dz_E❄Q SɚF>vR 1sc_ئnpŞ~?t>ZSIb,˞wΕCˡ}p΋? }}q"9H)9gN35k \ikT7frB0&s"wn=X^3fU :*r'~vvL (X9l$q7A蕜{a<;#_\Hꤠ #yZ늋R8cbL%+աiWxdBwG3ć>V4# WtaNw]?5 V%:&Da<+r}9>aS&._O-8@bC)J?am>Tzb?b/~3I؇fWsjQ|57t Q(ĝԘ (FLQ[(Nس}mF~?L7Z){&1)k, l AU: L<%<`Fk 4&GS&kUrU ;ű 6Óߘ7Ea#XӐd;!y|(A W/ۿ1B2ILŠ}P&Yd*PAjkZj?Pvvea}i~MxM.Z!UsvvO=\WyS4ԅ货>^ +K:$_0 M]=xEf/..q4 ^z"\KSUuǞGDk-mE\?0)z攐حعYq ah2"4c">[G[67'?U^]aDtwl4 2N]x.Nȉ"~S΍ިsrY e\Xc'jin׻5C*_ GYXJ%[Ba:9qn?7ϝm@uc̴G""bW#8큭ubksy~g¸TM2L!6`^reH05wuC(wӯHq(0sc{rS'6gv6-WIi֘"!m QSSV #ј5;~7)hT2*b :EcMVC<#7 NS(l$([*Ĭ`A ;[H?.Zr=r3ؘCJz+:+ Jegj/s0 My?x`ZD#!6+eV+T+3j+PF=,=d _x!aiتƭtȐzwZg2CfRk [wx㈬hBM()/z*.|ei0ןl -??8UtScjVl./eV0W19~~|̬ PTu&b BrqL|:R/܊Qj>sV=-9>|Pbx e2 ww:U/Un_Z/x[ѱ\k p?zl86u<9zxr1wH<@l 3g\,&^aGD"S\i ZRz;aJ#DUdYŜL lѸ»*ͬq1?-"Q(LF{M Y0&=R։R@A9EUhLe?`sG;uI&WA4aRDXCa.-tut~ CPE@n6ηdڨ ZnwPYJuovn_oY|sԈpgH)d`j pog_97N<j=~ch(p#;n.~$X0**y?MR_[+JbN+aU?tܚw&LJ w ITUno2`86iR&[J6{g+>d[K3&?ۼwٞgbFw?l*(DzFd;AX,3bJ,oI2$(TIb0]D솄\-$ba9 "\=JM jdvK=G*uw>j?$0[_4= ZфTH jIN,Udc⫍y_8skW efrQ?~U]udq15*A-*d'uP|`?•otFthdLt5_x4"F5s'uWPz*w{4F J/ȳx=a*}4)'p&P .fJEZ]T&ӱ|t ' h&H_A&G;]#6@v鋯V⽯$7se]|f$^Zvn:4r/)Tv;M,w;1jج?!m_v/7mu># Sn`5}J ϡH0ʢjӸ(ŕ&@bDci4}5vmRҲXب e_Vjtxr{E-®k~I"Y Հ2A&(3ɬK6K;rIο#A(h)4R܇Z%pL8y?uH{ysRcZ&݆.`xd=a)~jahMS[B\^3${Br:J{GɈ (Y0ef,W^0 y 5; )lv\ QL'6&42(%dQSv4-wW DgO23LX;1ͲΒ!Hšn*ۭ~VHK*–aVg)~i~nH vZ+6׬_/B%坸׶ zOV,W[/o_w.[9E=Y'Ԝ4&E zQ֟gЩ CǶ1Tw#؝5A)̠!1˧fX7c\΢Bu -1&cPpTK,_'aNrS0}O d0&d= xڞ+#kÀ 3:eT#z;nT=%{.\^xJ?"*g~w|h1܏VG3vuFbcUh GV;tAn݋=)b߹)bN!v7({iLG) UCUsA_*pq!A,XΩtKDTYuUaD W[]שׂwcʬ1W)0ʭ1$ UVaͼ h3kUk˫ア{-o矼: sb*hj˄1 {qdGׄ4HV@gPwPaE ~#v(C(޵XCJ[X>~ÝK^d$F!ީe J=I ‡b_^)=TN{.ßo$ 4ZBRDj{Lt^)fn! R}6T>ySMۦ/ԚsڅnwzI(p;~gllu=-W<)M6O7A!4a#F{w>T/5~yFʉ )*Η VG(weJn s<^sy "V 3ɰ#'h9$91 ?^?-O.}TѠsy׳Sé;txq< zgLu tAƄDՓ-r7R|OS^0QDoYR"~aBw}ϱ"Pu:_PD`_&;ybm} *{{|_25Td .5bȓ3s :(H\BPf) nCVxѶjJCRL e ջn|N1(x^jS6\ԑ/JqlaL/S1ߗGO 'DVz2ɢS#(`f5},]shcqZy8J{n27vn" n]Ľw,6$ZF*2Ku<5M8zq zh%Y2-`řkS Qk.>s+LSAg@F4s,#V Ɠ*j?{Xkĩz D = +zNZ00rBU;8s[S")1TVzEtdO.]hcO:ߢo/$ !aޗc#\t?ң23!2ee1٪kg#?)XW옄چsm *&pXm~uY/t^˝ݕыs"*_=s,@-0@df(\LK#S+!Ok(tEV I ;o<4FYQ5dHAE5j 5j̤JsL{0ؤ ` Jܜg@G+s^ɯ6`9@[KU`2u÷ʵs>fGn,l ;3K'yۻ1Y[Ё:[vP,.x?J4lJ3{c44*5bK>iƠJd8[3 +3Cٯ<g)z؜]b52h8\ U|21:a<&v!"w_GAmaBw$%!i"p.T&"C3 g:x~́'I U0t"NE>f ε,r4,Hp+wE^=HHw/4{P?+?6Bڙ[%,j;Dkh}twFA{ =!\8 x50OՄceE^xqG3ϖ 4\c9zn9?u\Sab`D4T˝7/]H /6o~qI"PF@Eչֿ F۽?̲ljKN7;nBI=_AQǁ\0D:s-Iܨ91S1힯uYJ'#ϯLa9 _V9!4M>4G Tf dGCk*I ǣF=lɡJ<,FqVթzv^z*Fʱ?V;J&T9(L@FeO3[U}d X;13']ܙ@D"1"oHų6/7\t5{#5~kE>??& Ĥ⪓. 1$lsW~sF>=R58{"5NܞY>PQK%ViJfh$ fzڻƐ-N ՠ7LDCNQyd(PL"TU}``bu2s2 Ec}%DGת4&w +FOL?_W/z&JU1`_juҮضn7$łNϿ8 (>n."cH/ʉ*Qɥv.أFXʌ-2G!!&"vޞi hkV;x1|뺑 3p OqkrzgrW7Wo+}DTvH6xvۆb˫cc-JʚS#x0, 6)6*hhHMwEQ318p0 +DkmGj2!tJ,Nb PbH oI x UL񀖯H G )T瘙*(z@wtQNoz+f ^3*n|Cgf`O]qh 1=λK{~^ɳWˑ:4ӫuD )0!47250}t]ʗsD(FS)snrհddGx^88SiU%a"A2feυXQ779NMG7MXY375r !! d!ڻks$B*ShB8˳֌U=+`3Pȋ޻Qe o#!_xېyTy]=x`3򭕎/n^E\H27-B=w Q~5b-֥y%FЄ OV_Gu[i1A7 /E$Bc2ftgJJ`%*UƄBlʃP6b8käI'Etf\èxzqL=CS9#;=<7mn L"=Eٮ*޸1. GR֯$ջXE*~F0Wx[CƐ]Tf %sf4[u94Mwg(K\ܘ$0W`/Ὠpo`r%Wϝ˲&g9Hhk&wJ1 2(q5QN鬔? fGKWZnѱ mrs;RDʾ,W{ݕy q.\ti!fc,m[)7,tpsK跇7Ylj %֔-%s"8*TgU?( Z`!ol>RUx7.tmKpkQխعJ-|?~Tr~lU2|BLLB\/sO:?ιǖ3` ȕ拏8nf[ZEĻJ{a;q;9eSfm^DJۓ۟S4MD B$ĉ,aø:.1ؓwelLӵshw2"W"RtB BZ\b`NʁQ!0QO6mn,TeO ifeT:ga  su̇MBb(BL!/[B1ێ-3R`*sN[oGƀQ]fI*L aKZ*47o8{pUS$P{,Cpx/|^S+ qgkφ!/_p;  $ >UǪJ *2VUeAXc@d{_a98c3Dy_2F86r.;PxImBt~>@橧_=e2—mw_]`IJ V?BphCٞk9\MDd|SG)0,hAlmuՋs+?+=(9ZlrRXB*1DRT 6Ǝ")mHU,Dш#րPȭpmǏ+ BQyN棤x0s@Ԡ1Q07-|Xنp=u@)$키.B!cx1qhjC~\/!#6]w.k)~bM6U;}2et_Ny LġP DزSj3n?<}bΤASyİ0(o+Va! d응6Nn˜>p6B`w_~ix./nj>4(/\:-n:@c_4'+f ^Iޢ毇, +1sؘη/II"R{O?;(f>P_Pũ#J Wz9'bImFb"MA"ÚN;ga L%4f@qdl >$ *ܐTނV2!Szb"0y( ]Gyja~fyNw3^We1.I//ٮWyc8wEy8e=OY5 d*C/ k[5?""ISi)ڐ$RP f4= eVV/-CWbUboA%̴ /uFWdy3m:BMòxw/l9C\IXOW_XLZ/~zqQѻ5p])! Ȫ!"d N{}t笺!4[,vPԽZ")?8 k$D6104͘‡]Ӳ\rx`!Jj=^0Ltu'71-%m_ ##O3D;j6ȴݲ.bq:Ӵbj>KQ` bJ ub2Ld=ƆމPv6_Tw:{$o+v,2cx ^kI$by MۤA1ɐ+UI$7)d"r#h3t yJՠpHue8(I 8lbp0䜯d L%J3P2+}VC7O&\Ә+fTzUx|۴yf햆VWCUDwu6*&IFf̮)Iߨfۺ ,\Tb2 S ª4NJ#)>8V\o]9)]+$$8zq;4 PMXzu;;D(FZ3xǚ{@<x\9t~jk(Dᶲ2T>t&Q|zsT喞^<j [W3Cl޽1VF'_qEӫHMnrxV>znYNwFÔ8^OH;5$O í1X&pQU$[L` Y3)*ɉ6[Pđ86VAYh YF*K*ݪ!JUW=4nQ_D3%X&ԣX #[L 0wfYUP'UT];qf+WܳMrϚoV974< K DSa6u'KIzYg>dLdt -=jtT–HrΦÉJ\YD0m \HхLz^P/K 2ZfogsD^cqur4\rt~-6nEec=(FI_ukD%fà'}3c}5W?]|ʱwVAxD PQ%G~&'": sL4KFTV6dZ.k*=O*tA/e*xQwpc ^ci8%c6Ki5YfgEH1RB_9+Eb]@󗅁X/=?۴=֐PQ(ʑiIpC?X\7jדZ6C'q /W6I- 6z`[EHtcsЍKg[)  1Mu..zGZEM'oe_YimkzMpeاrVSTT_X/[orWO.|[iH: C`w?:;Y5њO 5Z G +Dk#-N-Ot>{R6US^j,?G%3x{X孨7Ii?:y1I /6l ⱕeݡj SId_񰯙G8 OWWtwʸ5>~q6 k@2(H2qP'I r* fEtk gs kL̦Y[Vڵ *Y+*q%ИRnPJ^玄pMueXQ34$'+andM nEJޗU""n˧?*xq3/5azQ LYW͏>|p(7ZgE16h'&VQ2ffBy砷ݲ $P;g[ƐnTf4RR%MAgxb|jsµS=5GMppp:9(GDĻ"ΊEzE47C& L,ųDDڵ`8JF`24fI^LUU/!\b_P)AxHssE=D,>;;+ Rҙ7v{}e2&z~)M%%F$'j<3UHUor_[G?cⷕ6zvm?d-5+a4T*kdCEd0RA dYTL!+PI,c0)MwK&1DlVGGgaa^yVTrH)pFfAá3^K{#†50r:X3_8%*-^TqhE*WA E²Qq-7mYCpÛ^oci}3'1Dn &"G9^kA(VҴ~%$Ľnn{N(jV$|{ARҧYZc9N,JM6]Y}*5eK̜5>w'=S]r~<b<=\K+na0e̢ #hUTpe:p+oWLMk]PT۪K+鄱[ ]vTuƞW5EAQx5`~co=X]jHkG Mбj ˪|?T: ګն)/ 1In"smk MWu>9*'xNJ`mWOmL+eĩN:8TUڐ&lZD&axTH4aTeK\KR:"ܲؕܬƁl_UmZf>0 nRO379Q`4VX?:er,u28C(G?l>G[&멞/ _9c+W,&T[yt0h̡MHk%3Q-κ Y%RW$^*0!SQV#_xJ{e.Cbfh`]#Ej=Bo}nP;zr3񪙜_!>NԄR>{Vf #Ro.ԋ-qXPQm:Z'؞mzTfmRqq؝QUOBsxNžd=|G}:_nݙ dʍ~6o/~1LwuS̵Z?1HA|$$&oEZS !f1yޫ-IY~3~~g938/b* .A@5i& ⶺLI'jMҘ *i01sy+'(vYFl kiJ:%7ؙݯrҊ.)TꦪQLM(~Y1KQdl^Mwé \#ӝ5I#T`#1Xu$FS-O k>@$ 7)>ḁ':+/cTB (c1=c"9EOv +B)`" gIh"iiZ}5Sxa?IÞW= &SHRwݷ VߒBR*4%s]J1^ě3O::I: [D-m~Ѡ2 Rg"õ߾"woīXRH jkD=0Т ;5eRLjwsJƔ< - }&֤6AӬ]{ ndPIˮ4@ ?aP)&&lH@J9{hi9Va4VJLA)q)|ow[,z"1CFEMʮPb6mΰz-ܞ%hT)iHΤK]C;}/~a%7Nu]N(u%ZmƩ{H#-B}D)[U=DsffRUY *zԾ3<"4q R ^ě~STczQU?~rS)ez%>yCH7AwmUzOs5(I)U4$UtZVu6 _Lpْ@mEUuRQx[.m sn|O {IP/w:Co0Cdl}}_+z'DgM]مvBQ o-췚3[3nh +E?!@J{cLLXDe2L)緮{qNU( c&Q2?YF1٨E@:p- 2 etM! y]iLխJbCg . 5fXx܌hc.k FӀV*paJDM=DnQ)ދ%B v%ѱ̣?=O?i|<)@)ԩdR (E6 *t}V˃|,=W"]$͍>Uz82MiɆ'_釗gVϴ`c>MמQJΧQ-@vDAyBß; 1TGHmzpS4Ktڭ{ǶGv8yŸ I~$ _o$2]njIsZV2ÅD,z-:sW7;G,q]k5<`DDz*+)~WҼ'0푯pp̅ցwܞᒫʁ-5dȆm=wßT/e7^ǡΰ4@NZGIqrNyuQNn(8bDN.8(YԵYZuēW`aX~؅ eѢ22٭~\%&t֦(~U&Zj iN6!SCak&c(hAE T"+);L !G^%֧[Xm9wAw6SEIT5%B1ŀUTdiQx Uf;Է6Y\;nh|QJd)@й+_o]<3YT}/?!@L/u>ta7{:9[)h0M#}w7K܄.^H' wTk BgKdUk+_AI`ctD>eLn (-4@3% i1" A45,δ"m raIhlh>]QtTӇETRS+ڜBOf9Ҫo72񘌫k -jh7V _ak6݋FpxmPjnؙѕC*~sdBn5Y{οǪ_G)b/(^B񴍋:r)1AITUmn}caÎrvD&V\'` *{4a`%14tS=@T z ^{Srst򔧙a֤;CeKR{j))Giӷ7 d^fC*f0[ֳOmמY%-&W_ӎR_CFW~|8YPG.llfBM,u*ᔱtBkХ`={hQWDC [oly6@vW2€z{]oJ`T ?ޫL6UqdmXT"7Yl͐U‹lq,٢I*T\*`U-G^)E0Xf• Qw$* H S+b~|䫙˿g|9(>P tw T p6LJP JEQj˩.Y 2e<yh'g"xƚ&|ɏK0ߡG_z 9Cm IS2t5Nw3-x@jJۇݰGVG=ZF-§Yx}q=E4ʈ5]$eAm ߇7dɴw]Y0XY<Z:L2wDrgX32wDxҏFu9 Zs'\ =M |0 pdq-F5'b%:[x% f0Y%TE$v^4h@rŶ)~>x~Uog~rS=~ܦ!%J1"(I{)#@7!1Џ' T6дU"ZUx_iM>P0NDJUHG :8; TD/\dPywGg>Ŧ?V7Bʢ1{:J:۲ aT h5s_7[Nc\$c"UК9Is=./S8bnGԡ7F-%˙͟xGt$c_ѥ$FEfqcO,?ެܰ7|#3)׌'5[4 `cXc}Mrl@q[xup)axD@8iY]0<lD_OfiK* Aڄĩ V 9bLÔ7i"Y.UpRi?QIR2bDw|C!0$Ҩ_7FXw\C Ρ> ݄}dR\yb:Aֿ3/lMEMW*3gʙ¼ͫi9ڛ_h1\ $3(zև!RD쩾лI^Ɉ '"R(XkVM tw*?rq)> U=pzBU/q.h2 ! 쑪᫘{X z|I4AApws0k$m MX;xm{szhAYw'5budxyK5LJ5*Mom׍?:7R'mw_epsna24TTqƬȬVpPY 9EYEVK}{fK姼iu*2*|zd)/X%-2|X ۣ*KO?|V9l@\0HCu_0sf~*SDq}6P%>=@' @ӃidiRA˖c4jm t;+8Ќ̓bQQEcoH|:TuHM4ĵ24%qaj/HUZZjh)SX4xZˑ8 NK=*II5@l^,=d5*N1s:ϙR0*i|RV@D ``9131dCEqLf7 3}(UYV`]O&*wgq.) \5wȹims UyJy1Fe5<ʠ,_?Jڟ6tfp| ;E|< Oa?!*C Dnxn$lŗ[cjXXU?!^ޫ{x&CQ(y"KD+Ӧyӡ )RU?v}}'g ؋P4cbEʒY8 x`?Br?cUՓA֨!%⮂ Qfr^5W## )fa(g'f'ű))ٌWZ֞3Ć"~ djOI9U0H(E$]4q{ HN*kd^|Ln +4BB)k}tBIlWJ?N&:^\೥[@@TNwd2BStJ-Xh2Q-nbŧ/%hXTcgM (Fv@*а#,FAPKyJ6{d^ɇ!* 8)1%ogBRC[:x:mҩt[Jd^?c0 KlR\S/aU)WAh=ю?`Q:LVyDN7(/V!CYyZ5޿qHˀRC kZmD31F*{^y7D.pbØhUԳi%MHopsPGȄ+SC@L 9"LPPALB1NkXrru1:}ЏG* @|:,ׅz4X^KoTؗ7boB$ Y: 3AB=<ьY_Y iw͹ffavXӑ!ѱkH%k̲'&z ^I6e@$vݳُSCT;g$mJ&Hc*;?py_Ddʚ9-''5 .k>W qFX:~` -9ĢPecK,ACx2kj9&]0:3M6э8}JK l!OQWO'5&IحK ]=?g__Yf ibqAx–%n\'@hvS\=U*+ ,et@"߿ek4-fFnaZrcfP"W|Tʤg`~xm a 3=_ /f`hi֔Tw5XwPi!jzٚb_"ݮ-͘LTGlЙqY`";A 6D2fR}J0%R)~7v0{G G$)*j4*׉S$x {A2pIrPBi  ez/qYhs'WL2.Wy Y/KNEsDQN#; [Ivvұ'|V*ٯ!(fho~g/ۧ=^wO1sy ѦF3 P{eH3~C3Ʀ<PhO-@ "kU+YЄWQڏfcTFPT^S'vٔ<-j@rr }٣{{E .˧b*HV #3N6rs*`f5 "BfO puކUD hCYâڽaʙðP]pG5@DiE>O>w4*Oݔ.ty+՗/pI3DlZ^ jnDT> <דX)=)hV*¢cf>)eq)`cқFWw =yqn7fj@9w~5d?;MND8UC2VUfHrTZm ˳gQM.zd%yB3V/gE^Z.}EE*@{[m"Q9XɭR2vߝ8pd^|5ur\m(eDp 0:\ ciJPXR|U`y[`$-qnVGCx3T}%Bqfh܂SOG?l>La0_y!@ڹ hk[wgXi $U<#MFרY2Q]!`Q>skxxvP Du>/-%jLPCEUa受F8)Lj^NouXV}t'x%8e(`CQ$%xb %FzzW*ۄ0TsGif8 jKΨp~꯮S{'iY#LtzK6IM|!(qBZW;.ZtŸ|^ȶ9XƄkR|zxN+k:&|W0OWcCe}$LR,E Qv٦HZ:<QOCѪP\kd{ ü2 4r&!Pێ /ܨFpɟvF2coUbWFC6E1QKʲmZF{"T8'ާk)鸉['{?l|Ѕ=uo~ KfJ>VZznN/H݈m@.%KYF#"^]bن\AP6:Hv s{No4 s UdJ\':qͲ?aoUŒ:ͳ_\k XlǍ?n:M^G x4҃B9?1B^|g|3p쬝U-&6R Hi->)XSol\=ŧN'/HXŃ^{4sxgocZk%1ﻣkl"Ii۱Ƌ ?}駷l3``b2HȤ(EdS4[1x%\,.W;Y:Õhs.63k dNmM l=7GZIDZlnn /7A<ϋ !ɚTh3Ԙ0Wlx:"'ya3Vv1*ށ9ܠ0cNL`aᇣXQ);mud*F*-U4D+C}'kﮞT`鏞&ei:BsLfQSF%ßђ dR`y'7!՚ cF 2Q}fw>/]eיZ{tύUrdI5)DV+xi{6fatKIVj$(CM'z_Xks!{^ {(aJ#5YUZ-d_#R//CUS"|IԞX0*N:L8Iy"`մ0kPd# A-ޏN6pP'N#KF)0{7>ף87( :B[6}~wVc.?{55)Cu2*%UivnFw]̍>krs-.v3RWb4j>޸Sy&P Yc sFcJuSUUjpg~эI~c&>ҐY 4rc.9p X,4&)ԏUpjNxSxPCXCc͈*[MnXnYKJ1x@]ɭ?ut5>;%|ٳaJl3E:wβjz d檝ֆ)Cͷe jBv1S6 5pO޻aρƦ0XnQ&H{ǵtk†XvWV .+-^aʝ?6Li L?8Ĕ9Nye *ta(fy0fT ٴn0ڰ1hOw|SՑW?fLg1쑲D~靗6 /9_Ux}bb|T5)% !3NQoBDvR>*K}_Vr{?9sõ5ל]d&z|ѷIMJ̺P땯zуIbjvėfBwv7bA[:h7F !(؟^Tyd0Lfɘh䍇Ve~8_bTFNhZ8U$ri+Æ6Yc*Zfd*}3*ƪ*ҢsPjJhmss 6广b_|&6G2 ;?W(=vǤ [QŒJĬ"ź*@3ͪ+rLIծP*;wMdQG6_"} D3œnqj)geֿl\ƥ:>GjΑ lCEb27jM^'q72w, aVN9!Nj)oͶ(^MMAY&5#7[xz&l 0wxަ Q,|{css!<[ڪDzأ M"?*l7Wi T?1x?\/ggfZgIWț>=”0L2~iəoɇM:~WXy V !%}&tzS{<7 <ՋxM8dA[V%Q9oQ6YJ6G&<6$8?qFjFhh>61.Py Z T|Hk@!y MSm.{_n9gvhw_A&ghc+cCl'z=ҕܞ/\6_}p}_*:ae2cH-Sqr>6^dJ y!5LQP#5Go-xZ/W?}@78TyU&XBSkb} !Z TWAWCaC& |{-<hlx j;F6;# &}{yv-W)e~R}V6}cuCOf奷, dz(efE,@ JYIn -fuݸqe[2XNYτkpyfG"O4LCtE뛕 ѯ֢XUNoFz=ݻZM 6Z`(Ĵe!L$@IM*b si ֬ 镞 qMȃ3+R[PNyq scWf-<.Q1kU N"lCM[tȍ=^gWcl;/\ErGAvV#Vk߱p mvU^-GNA #@&; xQWwc|b{'5yC+drpJ!O&dIw<+~x~aǢ23=O1)ܢ")RZmOc =B! y' XVά0e3׳:Zގם~~ ?.xJX#xo~2A>-١Nv5^3k 7;W鹏}RPC23Ou~jza?]zZ./; eN6m&y4w4b"6Pk]1>PW~Bۃ u^3whؘm8IWuM[Nf?+eFȗjg24J/ApUf^38,HDC@aD_gKODYmy&PZQB;7QL˔M ;s&־uџ^6/>ikU8ʍl+?o_oV5tx; lBʢZ@Ihsayrau"x{=yD'Sc(Am*TP qS3;=OG/m^vYycFitGx4@$IA\_RUbNKkчb>8<|zTv 1]E[{l9^u5$IY;_HXcXOBS皌DaL PDU&+chK)8O*_O(Nưٝ^$ o\>za,AƨPJOz-r\%Cx%֢4 ͽ 8MPȯvF#Д50j@Iu FpHg5!gRfI*l :|}Q"WDbQFRhdncEn{tZ&ecv3e쓳;΀A MĴ1f-<9d|mmTYnpKlH l #2ʝ̆ex*/""R/mxI H& fR7kr oΎsۮ-{j|qoU^<5DV6rB/#;>!i% @l٥, J},9,1TUD_%?jec~ f<0D[RӭS,Ύ_g#gGcwh=`^8ZU6%U:#F{Q7̡MZvnK3̴םU~5}O+7X]L7بkmw w8L~݊=UG!c(3?h/)>;CQJ[ǡf*e`6Hɴ{0g$nq6븥4/ B= Jr-: ϲ器f4pIH%ff ֚o TTٝ$U5 }g-S}cҹW:†-9U/Ս]'ݪܾV %ײ%e3ȑy^}H7KR&;^c( JW]{0b@^`]Ntej"UAo>?s)|UW~]U$JOP~E&2X$Cz"lcP(R>}FˊDNӨxe_yHAKv㓤=se6Vk~Pl]':N_:wfPeO ~ ^ֿШH"49#:9V[Y WpȬ U'Gͬj? vXg ewOxi(ـ?vLxMZ* tҵQ_G2fc$D|!>DrJ *y:Z:6L?G&VAc]Q{#W2NH(wC@q&D#" ZUbYƒU!٬hŷ*Q$അXDoA˂^ V~?x@/w<3ϒ@crGTɮko^0Jw,eu9ph3K'"k( TĹ˝ fuU~lNVLJ J:*8-&P,pyzo.Y'ZB~ヷ濶F- ^<0%{XY@$Uo@UbYw9)]}ygnjPMeQP,NHW{?S݇.H7YA?7#1% ܟ,2MFþNsDP/8ge\PԍK{oLʳt]&słX~!8~)"ëgr'h(D|i z`ZtgD.?`X ;BW1$m0Ww̷4i\){jU˘8h|e/`[ w˛}s53j_R)fۄn/-]gYJ<'CBqVoWdOOPWLшP _;vKNpP S#%_[u* 3 ɬ?O~Ge%kkˣuY(f)LBFEiJS ;1 Ift l}ecs[ĄFaBRDXh-}U 9*fDZnz$|dWϮmk/qÑ#3? 9}xx]-FiO鳋uRwYKn`ٰ*ţ*e9Q IMq3ux ƍgۧ;O5`W( K0#FN3ɜY`vn=& ܇?jdOWE1<5M* Ќܑb%*3扮  J[!v3換Jx6eaRmU5>7nfL~KahQ3SѣZʼnY|(o@}zͭO-I֢ sm8߸D gHMA(`AA("1sf9ߛטly% ]\j5lQxb"iACQkķ^+'I{WʬK5YUv8GF&8ITx1YeKփ[Uxt[Þ?{6TlL0'Vo룴ظr<gMaD$nP``Rhd)Z"NӱkGڌ0Xg84 vNOkdRC.3D(z 3 ߿YȈCj؜s)d䃠Q}4@i)֨z'u,r=n Q!AJb{eVsX2cHxPT|~ǙudfTo'|Kg}첱7 . 8s?ذ^hp;v3s&%f+4֓۳R"}i{ؐrI cB<*T\RL#\Z09;8C)uD VesJ!,5Y[6@7T!U͸t7H0%r!;!Re&LOi4\ B Ht<'i4iJ?Oѕ}[{u —1 Œ\}z3һѹ@wFxu.b1"Tl#AՋ^voDUT|C:OӥsO,Ԅ2%9l-f=;`vZzG^D;˽mI+[6T!š/aĹV(c}&FW5,@f!47˞mȚM$:$H6dXy^rZ@79 x\OT_G bu?^S@j`l ShqZL+-_{*P*UKo=ߛ5^`mf[ab2/Ss-;d01Lׯ:$8.LNF baAWFف5U>wvZⰖUZa% dAZ_)y~}/ht۹0:fyD01Z_k;+2Zk2T2$A 7s&ǞS,%])CXs;1# JLɍj⍅Js3EjQ,7@IWpy1&^CeڙWqVJǞïMӖjt̞GֿDLܶ/>di.:kg,鵑/oRo4-l؄QQ9xHdkd5;Z9!Ek%@cM )@\TU6n_SQO*n_Y?'kC`MNFHwց)$S\c%UUr3wK'+9?gLqd{딈fF"$ioryZ(X&=OΟ$k18vdxbl)$e2ůV 3n1o2aF!_'#5$h}sgerdS,xި͖fD)W JӽP7wm5lMO.Ɩ?^歟~rws_9y1@F7^|ڬڕkΫ].<\L>4&JJ Q$ QQn`#;B aߝmRMYE(ia!,4ƫJG7{%W_k8}k/moa;h 2x6Uz2aC&qA! p>c]wgVx2\8g[ȓ7KǪqq ` Z^p}3_B w_47g  ƞ.HO/Tc$ʟJ\:jf:)icWx 3v櫭*U1 $d צ(K*08vc؋l;/Ō?SnT)0mhiSv(w JVNI @I1xPmlVRz'Sr]"ƭCXx5]BPUnl{eɴ ^6)9XnfIaKX/n=be,xU9ٮ[+6^j/EUqs,#{YWds B&h2CUV\=IRù+vdK) ǢEw{b zӧ5 QPRT/mK4laF4eU;&Du/tDX X %*fݣW;sx=::S;%0! ̧whޏIJjb=٥J* X޸]"2}#OMEv;!۹lΘaQ1_^D8K-q]Sϕ3޶V۽rzč`;D'eɡeF Ppۉ5ix9ʺPPu|*bR9aL֎F.5gͺ>13fcqF@b]%YV7^d:|LfGuDXܹRtPJd{]ou~cнkSRc/~cXeW1yh3(c_*6 ǴG6 +B-,+ʢa/ޕogT=N}U 3ia&`a;^-c 3-9‰8_) _)r14͎*xy(3f:g %U1SxIP$0hbapCe_(Qv@.A .R*+d[X6n'Yw/dxfݏƕs@i⭒`} LfLCX|~\e{{oF ˉ Y;! &#))ly2Mp6O辞kpӂTz4%jkuҢQeHÊXLWLUf0s0eYBUe9q9'1"16hhmG νsi|f瞚VPe|jw{{c}-6|ޞLsG +)ޤ9}1||EaEPbks, 5d ݇u9)×GM2\۫xוּ@S[c!u$8Ԩ fh*Uj5An^tBiVu&w6IduX iŘļ]7B3ǯܴONOP%;eK6!<7tXњ*uo?AƣUX[8/F*&W0ǯ"Y񢪮܅K,R^a3M{w*};Ygqg"B1}JFB g0-UF9|:wL4{ ?hZk!`(.61Um^ҴcM 8!v}KcR"еatAh40gl0#bg 5YQ z=+@]EMhgoh#^r\H~rlͯKj kq93<)<~Tcb%%cUa}٫ %IEnȜ@,W{{j<0a|I[iP=t;fzzU%LgDx-~Wת[O|nI RJnH&iA`+0+ N 0 ?Q+HԽ{@!=]hpOXvQ;BV\gۗcאŸ/ό k>#Fc 'Su9Y4TuRFb 3j09lm۹ysr?EՋ?M,_Lƽq=`۫}O3s^7G"^uJؚVTmۖ<*t,UlhNTP,d=5=d`b50"7b9ҰI>xWN#Tѽ77CˀsޒlF^ǗS+zQ2 w޹c=0`hdV{ȕjvs~>=KED9g`&Tx*DiT87N;}j#٩"tW<o^n_YU ;چ IQ#)i퐒Xȵ[Q IFoQIU:" 4QJפ(c"یyi&MqyO7TĴ?|j0fm&f3O}/uJ8gI]hBFX՜M6s̾;qm%iܺN>~Uk[>,G=]l+IENDB`./plugins/reflex/reflex.xml.in0000644000004100000410000000323113246301623016624 0ustar www-datawww-data <_short>Reflection <_long>Draws reflections Effects opengl blur svg png imgjpeg composite opengl <_short>Main ./plugins/ring/0000755000004100000410000000000013246301624013664 5ustar www-datawww-data./plugins/ring/CMakeLists.txt0000644000004100000410000000015613246301623016425 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (ring PLUGINDEPS composite opengl text) ./plugins/ring/ring.xml.in0000644000004100000410000002223013246301623015750 0ustar www-datawww-data <_short>Ring Switcher <_long>Use a circular representation of open windows to switch focus between them Window Management text switcher staticswitcher decor opengl <_short>Bindings <_short>General Options <_short>Ring Appearance <_short>Window Title Display ./plugins/ring/src/0000755000004100000410000000000013246301624014453 5ustar www-datawww-data./plugins/ring/src/ring.cpp0000644000004100000410000007303713246301623016127 0ustar www-datawww-data/* * * Compiz ring switcher plugin * * ring.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "ring.h" COMPIZ_PLUGIN_20090315 (ring, RingPluginVTable); const double PI = 3.14159265359f; const unsigned short ICON_SIZE = 512; bool textAvailable; static void toggleFunctions (bool enabled) { RING_SCREEN (screen); rs->cScreen->preparePaintSetEnabled (rs, enabled); rs->cScreen->donePaintSetEnabled (rs, enabled); rs->gScreen->glPaintOutputSetEnabled (rs, enabled); screen->handleEventSetEnabled (rs, enabled); foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); rw->gWindow->glPaintSetEnabled (rw, enabled); rw->cWindow->damageRectSetEnabled (rw, enabled); } } void RingScreen::switchActivateEvent (bool activating) { CompOption::Vector o; CompOption o1 ("root", CompOption::TypeInt); o1.value ().set ((int) screen->root ()); o.push_back (o1); CompOption o2 ("active", CompOption::TypeBool); o2.value ().set (activating); o.push_back (o2); screen->handleCompizEvent ("ring", "activate", o); } bool RingWindow::is (bool removing) { if ((!removing && window->destroyed ()) || window->overrideRedirect () || window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; RING_SCREEN (screen); if (!removing && (!window->mapNum () || !window->isViewable ())) { if (rs->optionGetMinimized ()) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else return false; } if (!removing && rs->mType == RingScreen::RingTypeNormal) { if (!window->mapNum () || !window->isViewable ()) { if (window->serverX () + window->width () <= 0 || window->serverY () + window->height () <= 0 || window->serverX () >= screen->width () || window->serverY () >= screen->height ()) return false; } else if (!window->focus ()) return false; } else if (rs->mType == RingScreen::RingTypeGroup && rs->mClientLeader != window->clientLeader () && rs->mClientLeader != window->id ()) return false; if (window->state () & CompWindowStateSkipTaskbarMask || !rs->mCurrentMatch.evaluate (window)) return false; return true; } void RingScreen::freeWindowTitle () { } void RingScreen::renderWindowTitle () { if (!textAvailable || !optionGetWindowTitle ()) return; CompText::Attrib attrib; freeWindowTitle (); if (!mSelectedWindow) return; CompRect oe = screen->getCurrentOutputExtents (); /* 75% of the output device as maximum width */ attrib.maxWidth = oe.width () * 3 / 4; attrib.maxHeight = 100; attrib.size = optionGetTitleFontSize (); attrib.color[0] = optionGetTitleFontColorRed (); attrib.color[1] = optionGetTitleFontColorGreen (); attrib.color[2] = optionGetTitleFontColorBlue (); attrib.color[3] = optionGetTitleFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetTitleFontBold ()) attrib.flags |= CompText::StyleBold; attrib.family = "Sans"; attrib.bgHMargin = 15; attrib.bgVMargin = 15; attrib.bgColor[0] = optionGetTitleBackColorRed (); attrib.bgColor[1] = optionGetTitleBackColorGreen (); attrib.bgColor[2] = optionGetTitleBackColorBlue (); attrib.bgColor[3] = optionGetTitleBackColorAlpha (); mText.renderWindowTitle (mSelectedWindow->id (), mType == RingScreen::RingTypeAll, attrib); } void RingScreen::drawWindowTitle (const GLMatrix &transform) { if (!textAvailable || !optionGetWindowTitle ()) return; CompRect oe = screen->getCurrentOutputExtents (); float x = oe.centerX () - mText.getWidth () / 2; float y; unsigned short verticalOffset = optionGetVerticalOffset (); /* assign y (for the lower corner!) according to the setting */ switch (optionGetTitleTextPlacement ()) { case RingOptions::TitleTextPlacementCenteredOnScreen: y = oe.centerY () + mText.getHeight () / 2; break; case RingOptions::TitleTextPlacementTopOfScreenMinusOffset: case RingOptions::TitleTextPlacementBottomOfScreenPlusOffset: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTitleTextPlacement () == RingOptions::TitleTextPlacementTopOfScreenMinusOffset) y = oe.y1 () + workArea.y () + mText.getHeight () + verticalOffset; else /* TitleTextPlacementBottomOfScreenPlusOffset */ y = oe.y1 () + workArea.y2 () - verticalOffset; } break; default: return; break; } mText.draw (transform, floor (x), floor (y), 1.0f); } bool RingWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { RING_SCREEN (screen); bool status; if (rs->mState != RingScreen::RingStateNone) { GLWindowPaintAttrib sAttrib = attrib; bool scaled = false; bool pixmap = true; if (window->mapNum () && gWindow->textures ().empty ()) { gWindow->bind (); } if (mAdjust || mSlot) { scaled = mAdjust || (mSlot); mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } else if (rs->mState != RingScreen::RingStateIn) { if (rs->optionGetDarkenBack ()) /* modify brightness of the other windows */ sAttrib.brightness = sAttrib.brightness / 2; } status = gWindow->glPaint (sAttrib, transform, region, mask); pixmap = !gWindow->textures ().empty (); if (scaled && pixmap) { GLWindowPaintAttrib wAttrib (gWindow->lastPaintAttrib ()); GLMatrix wTransform = transform; if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; if (mSlot) { wAttrib.brightness = (float)wAttrib.brightness * mSlot->depthBrightness; if (window != rs->mSelectedWindow) wAttrib.opacity = (float)wAttrib.opacity * rs->optionGetInactiveOpacity () / 100; } if (window->alpha () || wAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (mScale, mScale, 1.0f); wTransform.translate (mTx / mScale - window->x (), mTy / mScale - window->y (), 0.0f); gWindow->glDraw (wTransform, wAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } if (scaled && (rs->mState != RingScreen::RingStateIn) && ((rs->optionGetOverlayIcon () != RingOptions::OverlayIconNone) || !pixmap)) { GLTexture *icon; icon = gWindow->getIcon (512, 512); if (!icon) icon = rs->gScreen->defaultIcon (); if (icon) { GLTexture::Matrix matrix; GLTexture::MatrixList matricies; float scale; float x, y; enum RingOptions::OverlayIcon iconOverlay; int scaledWinWidth = window->width () * mScale; int scaledWinHeight = window->height () * mScale; if (!pixmap) iconOverlay = RingOptions::OverlayIconBig; else iconOverlay = (enum RingOptions::OverlayIcon) rs->optionGetOverlayIcon (); switch (iconOverlay) { case RingOptions::OverlayIconNone: case RingOptions::OverlayIconEmblem: scale = (mSlot) ? mSlot->depthScale : 1.0f; if (icon->width () > ICON_SIZE || icon->height () > ICON_SIZE) scale = MIN ((scale * ICON_SIZE / icon->width ()), (scale * ICON_SIZE / icon->height ())); break; case RingOptions::OverlayIconBig: default: /* only change opacity if not painting an icon for a minimized window */ if (pixmap) sAttrib.opacity /= 3; scale = MIN (((float) scaledWinWidth / icon->width ()), ((float) scaledWinHeight / icon->height ())); break; } int width = icon->width () * scale; int height = icon->height () * scale; switch (iconOverlay) { case RingOptions::OverlayIconNone: case RingOptions::OverlayIconEmblem: x = window->x () + scaledWinWidth - width; y = window->y () + scaledWinHeight - height; break; case RingOptions::OverlayIconBig: default: x = window->x () + scaledWinWidth / 2 - width / 2; y = window->y () + scaledWinHeight / 2 - height / 2; break; } x += mTx; y += mTy; mask |= PAINT_WINDOW_BLEND_MASK; /* if we paint the icon for a minimized window, we need to force the usage of a good texture filter */ if (!pixmap) mask |= PAINT_WINDOW_TRANSFORMED_MASK; CompRegion iconReg (window->x (), window->y (), icon->width (), icon->height ()); matrix = icon->matrix (); matrix.x0 -= (window->x () * matrix.xx); matrix.y0 -= (window->y () * matrix.yy); matricies.push_back (matrix); gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (matricies, iconReg, iconReg); if (gWindow->vertexBuffer ()->end ()) { GLWindowPaintAttrib wAttrib (sAttrib); GLMatrix wTransform = transform; if (!pixmap) sAttrib.opacity = gWindow->paintAttrib ().opacity; if (mSlot) wAttrib.brightness = (float)wAttrib.brightness * mSlot->depthBrightness; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (scale, scale, 1.0f); wTransform.translate ((x - window->x ()) / scale - window->x (), (y - window->y ()) / scale - window->y (), 0.0f); gWindow->glDrawTexture (icon, wTransform, wAttrib, mask); } } } } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } static inline float ringLinearInterpolation (float valX, float minX, float maxX, float minY, float maxY) { double factor = (maxY - minY) / (maxX - minX); return (minY + (factor * (valX - minX))); } bool RingWindow::compareWindows (CompWindow *w1, CompWindow *w2) { if (w1->mapNum () && !w2->mapNum ()) return true; if (w2->mapNum () && !w1->mapNum ()) return false; return (w2->activeNum () < w1->activeNum ()); } bool RingWindow::compareRingWindowDepth (RingScreen::RingDrawSlot e1, RingScreen::RingDrawSlot e2) { RingScreen::RingSlot *a1 = (*(e1.slot)); RingScreen::RingSlot *a2 = (*(e2.slot)); if (a1->y < a2->y) return true; else /* if (a1->y >= a2->y) */ return false; } bool RingScreen::layoutThumbs () { float angle; int index = 0; float xScale, yScale; if ((mState == RingStateNone) || (mState == RingStateIn)) return false; float baseAngle = (2 * PI * mRotTarget) / 3600; CompRect oe = screen->getCurrentOutputExtents (); /* the center of the ellipse is in the middle of the used output device */ int centerX = oe.centerX (); int centerY = oe.centerY (); int ellipseA = oe.width () * optionGetRingWidth () / 200; int ellipseB = oe.height () * optionGetRingHeight () / 200; mDrawSlots.resize (mWindows.size ()); foreach (CompWindow *w, mWindows) { RING_WINDOW (w); if (!rw->mSlot) rw->mSlot = new RingSlot (); if (!rw->mSlot) return false; /* we subtract the angle from the base angle to order the windows clockwise */ angle = baseAngle - (index * (2 * PI / mWindows.size ())); rw->mSlot->x = centerX + (optionGetRingClockwise () ? -1 : 1) * ((float) ellipseA * sin (angle)); rw->mSlot->y = centerY + ((float) ellipseB * cos (angle)); int ww = w->width () + w->input ().left + w->input ().right; int wh = w->height () + w->input ().top + w->input ().bottom; if (ww > optionGetThumbWidth ()) xScale = (float)(optionGetThumbWidth ()) / (float) ww; else xScale = 1.0f; if (wh > optionGetThumbHeight ()) yScale = (float)(optionGetThumbHeight ()) / (float) wh; else yScale = 1.0f; rw->mSlot->scale = MIN (xScale, yScale); /* scale and brightness are obtained by doing a linear inter- polation - the y positions are the x values for the interpolation (the larger Y is, the nearer is the window), and scale/brightness are the y values for the interpolation */ rw->mSlot->depthScale = ringLinearInterpolation (rw->mSlot->y, centerY - ellipseB, centerY + ellipseB, optionGetMinScale (), 1.0f); rw->mSlot->depthBrightness = ringLinearInterpolation (rw->mSlot->y, centerY - ellipseB, centerY + ellipseB, optionGetMinBrightness (), 1.0f); mDrawSlots.at (index).w = w; mDrawSlots.at (index).slot = &rw->mSlot; ++index; } /* sort the draw list so that the windows with the lowest Y value (the windows being farest away) are drawn first */ sort (mDrawSlots.begin (), mDrawSlots.end (), RingWindow::compareRingWindowDepth); // TODO return true; } void RingScreen::addWindowToList (CompWindow *w) { mWindows.push_back (w); } bool RingScreen::updateWindowList () { sort (mWindows.begin (), mWindows.end (), RingWindow::compareWindows); mRotTarget = 0; foreach (CompWindow *w, mWindows) { if (w == mSelectedWindow) break; mRotTarget += DIST_ROT; } return layoutThumbs (); } bool RingScreen::createWindowList () { mWindows.clear (); foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->is ()) { addWindowToList (w); rw->mAdjust = true; } } return updateWindowList (); } void RingScreen::switchToWindow (bool toNext) { CompWindow *w; // We need w to be in this scope unsigned int cur = 0; if (!mGrabIndex) return; foreach (w, mWindows) { if (w == mSelectedWindow) break; ++cur; } if (cur == mWindows.size ()) return; if (toNext) w = mWindows.at ((cur + 1) % mWindows.size ()); else w = mWindows.at ((cur + mWindows.size () - 1) % mWindows.size ()); if (w) { CompWindow *old = mSelectedWindow; mSelectedWindow = w; if (old != w) { if (toNext) mRotAdjust += DIST_ROT; else mRotAdjust -= DIST_ROT; mRotateAdjust = true; cScreen->damageScreen (); renderWindowTitle (); } } } int RingScreen::countWindows () { int count = 0; foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->is ()) ++count; } return count; } int RingScreen::adjustRingRotation (float chunk) { float dx = mRotAdjust; float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mRVelocity = (amount * mRVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mRVelocity) < 0.2f) { mRVelocity = 0.0f; mRotTarget += mRotAdjust; mRotAdjust = 0; return 0; } int change = mRVelocity * chunk; if (!change) { if (mRVelocity) change = (mRotAdjust > 0) ? 1 : -1; } mRotAdjust -= change; mRotTarget += change; if (!layoutThumbs ()) return false; return true; } int RingWindow::adjustVelocity () { float x1, y1, scale; if (mSlot) { scale = mSlot->scale * mSlot->depthScale; x1 = mSlot->x - (window->width () * scale) / 2; y1 = mSlot->y - (window->height () * scale) / 2; } else { scale = 1.0f; x1 = window->x (); y1 = window->y (); } float dx = x1 - (window->x () + mTx); float adjust = dx * 0.15f; float amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mXVelocity = (amount * mXVelocity + adjust) / (amount + 1.0f); float dy = y1 - (window->y () + mTy); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; mYVelocity = (amount * mYVelocity + adjust) / (amount + 1.0f); float ds = scale - mScale; adjust = ds * 0.1f; amount = fabs (ds) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mScaleVelocity = (amount * mScaleVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (mYVelocity) < 0.2f && fabs (ds) < 0.001f && fabs (mScaleVelocity) < 0.002f) { mXVelocity = mYVelocity = mScaleVelocity = 0.0f; mTx = x1 - window->x (); mTy = y1 - window->y (); mScale = scale; return 0; } return 1; } bool RingScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mState != RingStateNone) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; //mask |= PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (mState != RingStateNone) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); /* TODO: This code here should be reworked */ if (mState == RingScreen::RingStateSwitching || mState == RingScreen::RingStateOut) for (std::vector ::iterator it = mDrawSlots.begin (); it != mDrawSlots.end (); ++it) { CompWindow *w = (*it).w; RING_WINDOW (w); status |= rw->gWindow->glPaint (rw->gWindow->paintAttrib (), sTransform, CompRegion::infinite (), 0); } if (mState != RingStateIn) drawWindowTitle (sTransform); } return status; } void RingScreen::preparePaint (int msSinceLastPaint) { if (mState != RingStateNone && (mMoreAdjust || mRotateAdjust)) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mRotateAdjust = adjustRingRotation (chunk); mMoreAdjust = false; foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->mAdjust) { rw->mAdjust = rw->adjustVelocity (); mMoreAdjust |= rw->mAdjust; rw->mTx += rw->mXVelocity * chunk; rw->mTy += rw->mYVelocity * chunk; rw->mScale += rw->mScaleVelocity * chunk; } else if (rw->mSlot) { rw->mScale = rw->mSlot->scale * rw->mSlot->depthScale; rw->mTx = rw->mSlot->x - w->x () - (w->width () * rw->mScale) / 2; rw->mTy = rw->mSlot->y - w->y () - (w->height () * rw->mScale) / 2; } } if (!mMoreAdjust && !mRotateAdjust) { switchActivateEvent (false); break; } } } cScreen->preparePaint (msSinceLastPaint); } void RingScreen::donePaint () { if (mState != RingStateNone) { if (mMoreAdjust) cScreen->damageScreen (); else { if (mRotateAdjust) cScreen->damageScreen (); if (mState == RingStateIn) { toggleFunctions (false); mState = RingStateNone; } else if (mState == RingStateOut) mState = RingStateSwitching; } } cScreen->donePaint (); } bool RingScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; } if (mState != RingStateNone) { foreach (CompWindow *w, screen->windows ()) { RING_WINDOW (w); if (rw->mSlot) { delete rw->mSlot; rw->mSlot = NULL; rw->mAdjust = true; } } mMoreAdjust = true; mState = RingStateIn; cScreen->damageScreen (); if (!(state & CompAction::StateCancel) && mSelectedWindow && !mSelectedWindow->destroyed ()) screen->sendWindowActivationRequest (mSelectedWindow->id ()); } if (action) action->setState ( ~(CompAction::StateTermKey | CompAction::StateTermButton | CompAction::StateTermEdge)); return false; } bool RingScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (screen->otherGrabExist ("ring", NULL)) return false; mCurrentMatch = optionGetWindowMatch (); mMatch = CompOption::getMatchOptionNamed (options, "match", CompMatch ()); if (!mMatch.isEmpty ()) mCurrentMatch = mMatch; int count = countWindows (); if (count < 1) return false; if (!mGrabIndex) { if (optionGetSelectWithMouse ()) mGrabIndex = screen->pushGrab (screen->normalCursor (), "ring"); else mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "ring"); } if (mGrabIndex) { mState = RingScreen::RingStateOut; if (!createWindowList ()) return false; mSelectedWindow = mWindows.front (); renderWindowTitle (); mRotTarget = 0; mMoreAdjust = true; toggleFunctions (true); cScreen->damageScreen (); switchActivateEvent (true); } return true; } bool RingScreen::doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, RingType type) { bool ret = true; if ((mState == RingStateNone) || (mState == RingStateIn)) { if (type == RingTypeGroup) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { mType = RingTypeGroup; mClientLeader = (w->clientLeader ()) ? w->clientLeader () : w->id (); ret = initiate (action, state, options); } } else { mType = type; ret = initiate (action, mState, options); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (mState & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } if (ret) switchToWindow (nextWindow); return ret; } void RingScreen::windowSelectAt (int x, int y, bool shouldTerminate) { CompWindow *selected = NULL; if (!optionGetSelectWithMouse ()) return; /* first find the top-most window the mouse pointer is over */ foreach (CompWindow *w, mWindows) { RING_WINDOW (w); if (rw->mSlot) { if ((x >= (rw->mTx + w->x ())) && (x <= (rw->mTx + w->x () + (w->width () * rw->mScale))) && (y >= (rw->mTy + w->y ())) && (y <= (rw->mTy + w->y () + (w->height () * rw->mScale)))) { /* we have found one, select it */ selected = w; break; } } } if (selected && shouldTerminate) { CompOption o ("root", CompOption::TypeInt); CompOption::Vector opts; o.value ().set ((int) screen->root ()); opts.push_back (o); mSelectedWindow = selected; terminate (NULL, 0, opts); } else if (!shouldTerminate && (selected != mSelectedWindow )) { if (!selected) freeWindowTitle (); else { mSelectedWindow = selected; renderWindowTitle (); } cScreen->damageScreen (); } } void RingScreen::windowRemove (CompWindow *w) { if (w) { if (mState == RingStateNone) return; RING_WINDOW (w); if (!rw->is (true)) return; bool inList = false; CompWindow *selected; selected = mSelectedWindow; CompWindowVector::iterator it = mWindows.begin (); while (it != mWindows.end ()) { if (*it == w) { inList = true; if (w == selected) { ++it; if (it != mWindows.end ()) selected = *it; else selected = mWindows.front (); --it; mSelectedWindow = selected; renderWindowTitle (); } mWindows.erase (it); break; } ++it; } if (!inList) return; /* Terminate if the window closed was the last window in the list */ if (mWindows.empty ()) { CompOption o ("root", CompOption::TypeInt); CompOption::Vector opts; o.value ().set ((int) screen->root ()); opts.push_back (o); terminate (NULL, 0, opts); return; } // Let the window list be updated to avoid crash // when a window is closed while ending (RingStateIn). if (!mGrabIndex && mState != RingStateIn) return; if (updateWindowList ()) { mMoreAdjust = true; mState = RingStateOut; cScreen->damageScreen (); } } } void RingScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; switch (event->type) { case DestroyNotify: /* We need to get the CompWindow * for event->xdestroywindow.window here because in the ::screen->handleEvent call below, that CompWindow's id will become 1, so findWindow won't be able to find the CompWindow after that. */ w = ::screen->findWindow (event->xdestroywindow.window); break; default: break; } screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME) { w = screen->findWindow (event->xproperty.window); if (w && mGrabIndex && (w == mSelectedWindow)) { renderWindowTitle (); cScreen->damageScreen (); } } break; case ButtonPress: if (event->xbutton.button == Button1 && mGrabIndex) windowSelectAt (event->xbutton.x_root, event->xbutton.y_root, true); break; case MotionNotify: if (mGrabIndex) windowSelectAt (event->xmotion.x_root, event->xmotion.y_root, false); break; case UnmapNotify: w = ::screen->findWindow (event->xunmap.window); windowRemove (w); break; case DestroyNotify: windowRemove (w); break; default: break; } } bool RingWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; RING_SCREEN (screen); if (initial) { if (rs->mGrabIndex && is ()) { rs->addWindowToList (window); if (rs->updateWindowList ()) { mAdjust = true; rs->mMoreAdjust = true; rs->mState = RingScreen::RingStateOut; rs->cScreen->damageScreen (); } } } else if (rs->mState == RingScreen::RingStateSwitching && mSlot) { cWindow->damageTransformedRect (mScale, mScale, mTx, mTy, rect); status = true; } status |= cWindow->damageRect (initial, rect); return status; } RingScreen::RingScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mGrabIndex (0), mState (RingScreen::RingStateNone), mMoreAdjust (false), mRotateAdjust (false), mRotAdjust (0), mRVelocity (0.0f), mSelectedWindow (NULL) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); #define RINGTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&RingScreen::func, \ this, _1, _2, _3)); #define RINGSWITCHBIND(opt, func, next, type) \ optionSet##opt##Initiate (boost::bind (&RingScreen::func, \ this, _1, _2, _3, \ next, type)); RINGSWITCHBIND (NextKey, doSwitch, true, RingTypeNormal); RINGSWITCHBIND (PrevKey, doSwitch, false, RingTypeNormal); RINGSWITCHBIND (NextAllKey, doSwitch, true, RingTypeAll); RINGSWITCHBIND (PrevAllKey, doSwitch, false, RingTypeAll); RINGSWITCHBIND (NextGroupKey, doSwitch, true, RingTypeGroup); RINGSWITCHBIND (PrevGroupKey, doSwitch, false, RingTypeGroup); RINGTERMBIND (NextKey, terminate); RINGTERMBIND (PrevKey, terminate); RINGTERMBIND (NextAllKey, terminate); RINGTERMBIND (PrevAllKey, terminate); RINGTERMBIND (NextGroupKey, terminate); RINGTERMBIND (PrevGroupKey, terminate); RINGSWITCHBIND (NextButton, doSwitch, true, RingTypeNormal); RINGSWITCHBIND (PrevButton, doSwitch, false, RingTypeNormal); RINGSWITCHBIND (NextAllButton, doSwitch, true, RingTypeAll); RINGSWITCHBIND (PrevAllButton, doSwitch, false, RingTypeAll); RINGSWITCHBIND (NextGroupButton, doSwitch, true, RingTypeGroup); RINGSWITCHBIND (PrevGroupButton, doSwitch, false, RingTypeGroup); RINGTERMBIND (NextButton, terminate); RINGTERMBIND (PrevButton, terminate); RINGTERMBIND (NextAllButton, terminate); RINGTERMBIND (PrevAllButton, terminate); RINGTERMBIND (NextGroupButton, terminate); RINGTERMBIND (PrevGroupButton, terminate); } RingScreen::~RingScreen () { mWindows.clear (); mDrawSlots.clear (); } RingWindow::RingWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mSlot (NULL), mXVelocity (0.0f), mYVelocity (0.0f), mScaleVelocity (0.0f), mTx (0.0f), mTy (0.0f), mScale (1.0f), mAdjust (false) { CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } RingWindow::~RingWindow () { if (mSlot) delete mSlot; } bool RingPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("ring", CompLogLevelWarn, "No compatible text plugin"\ " loaded"); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/ring/src/ring.h0000644000004100000410000001157613246301623015574 0ustar www-datawww-data/* * * Compiz ring switcher plugin * * ring.h * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include "ring_options.h" extern bool textAvailable; class RingScreen : public PluginClassHandler , public RingOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: RingScreen (CompScreen *screen); ~RingScreen (); public: typedef enum { RingStateNone = 0, RingStateOut = 1, RingStateSwitching = 2, RingStateIn = 3 } RingState; typedef enum { RingTypeNormal = 0, RingTypeGroup = 1, RingTypeAll = 2 } RingType; class RingSlot { public: int x, y; /* thumb center coordinates */ float scale; /* size scale (fit to max thumb size) */ float depthScale; /* scale for depth impression */ float depthBrightness; /* brightness for depth impression */ }; class RingDrawSlot { public: CompWindow *w; RingSlot **slot; }; public: CompositeScreen *cScreen; GLScreen *gScreen; CompText mText; CompScreen::GrabHandle mGrabIndex; RingState mState; RingType mType; bool mMoreAdjust; bool mRotateAdjust; int mRotTarget; int mRotAdjust; GLfloat mRVelocity; /* only used for sorting */ std::vector mWindows; std::vector mDrawSlots; int mWindowsSize; int mNWindows; Window mClientLeader; CompWindow *mSelectedWindow; CompMatch mMatch; CompMatch mCurrentMatch; public: /* Functions that we hook */ void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); public: /* Internal Functions */ void freeWindowTitle (); void renderWindowTitle (); void drawWindowTitle (const GLMatrix &transform); bool layoutThumbs (); void addWindowToList (CompWindow *w); bool updateWindowList (); bool createWindowList (); void switchToWindow (bool toNext); int countWindows (); int adjustRingRotation (float chunk); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool doSwitch (CompAction *action, CompAction::State state, CompOption::Vector options, bool nextWindow, RingType f_type); void windowSelectAt (int x, int y, bool f_terminate); void windowRemove (CompWindow *w); void switchActivateEvent (bool); }; class RingWindow : public PluginClassHandler , public GLWindowInterface, public CompositeWindowInterface { public: RingWindow (CompWindow *); ~RingWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; RingScreen::RingSlot *mSlot; GLfloat mXVelocity; GLfloat mYVelocity; GLfloat mScaleVelocity; GLfloat mTx; GLfloat mTy; GLfloat mScale; bool mAdjust; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool, const CompRect &); bool is (bool removing = false); static bool compareWindows (CompWindow *w1, CompWindow *w2); static bool compareRingWindowDepth (RingScreen::RingDrawSlot e1, RingScreen::RingDrawSlot e2); int adjustVelocity (); }; extern const double PI; #define DIST_ROT (3600 / mWindows.size ()) #define DIST_ROT_w (3600 / rs->mWindows.size ()) extern const unsigned short ICON_SIZE; #define RING_SCREEN(s) \ RingScreen *rs = RingScreen::get (s) #define RING_WINDOW(w) \ RingWindow *rw = RingWindow::get (w) class RingPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/bench/0000755000004100000410000000000013246301623014003 5ustar www-datawww-data./plugins/bench/CMakeLists.txt0000644000004100000410000000015313246301623016542 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (bench PLUGINDEPS composite opengl) ./plugins/bench/src/0000755000004100000410000000000013246301623014572 5ustar www-datawww-data./plugins/bench/src/bench_tex.h0000644000004100000410000631226613246301623016722 0ustar www-datawww-data/** * * Compiz benchmark plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ unsigned char number_data[10][2049] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35\0\0\0\212\0\0\0\304\0\0\0\317\0" "\0\0\260\0\0\0Z\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0>\0\0\0\362\0\0\0\377\0\0\0\215\0\0\0Z\0\0\0\327\0\0" "\0\377\0\0\0\260\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\20\0\0\0\353\0\0\0\377\0\0\0\316\0\0\0\0\0\0\0\0\0\0\0E\0\0\0\377" "\0\0\0\377\0\0\0\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0y\0\0\0\377\0\0\0\377\0\0\0\232\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0\377\0\0" "\0\377\0\0\0\363\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\312" "\0\0\0\377\0\0\0\377\0\0\0\204\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\371\0\0\0\377" "\0\0\0\377\0\0\0Q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\370\0\0\0" "\377\0\0\0\377\0\0\0x\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\356\0\0\0\377\0\0\0\377" "\0\0\0\202\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\30\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\347\0\0\0\377\0\0\0\377\0\0" "\0\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\344\0\0\0\377\0\0\0\377\0\0\0\253\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0p\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\345\0\0\0\377\0\0\0\377\0\0\0\245\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0t" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\352\0\0\0\377\0\0\0\377\0\0\0\223\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\343\0\0\0\377\0\0\0\377\0\0\0}\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\364\0\0\0\377\0\0\0\377\0\0\0j\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\241\0\0\0\377\0\0\0\377\0\0\0\217\0\0\0\0" "\0\0\0\0\0\0\0\5\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0&\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0<\0\0\0\377\0\0\0\377\0\0\0\260\0\0\0\0\0\0\0\0" "\0\0\0&\0\0\0\377\0\0\0\377\0\0\0\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\232\0\0\0\377\0\0\0\364\0\0\0$\0\0\0\0\0\0\0\215" "\0\0\0\377\0\0\0\361\0\0\0,\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\3\0\0\0\201\0\0\0\363\0\0\0\371\0\0\0\350\0\0\0\377\0\0" "\0\314\0\0\0""2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0""5\0\0\0@\0\0\0!\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""3\0\0\0\303\0\0\0\330\0\0" "\0\330\0\0\0""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\5\0\0\0\203\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\263\0\0\0\345\0\0\0]\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0p\0\0\0\20\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\20\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\0""0\0\0\0=\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0g\0\0\0""0\0\0\0#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\274\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0'\0\0\0t\0\0\0\250\0\0\0\311\0\0\0\324\0\0\0\307\0" "\0\0\234\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\260\0\0\0\377\0\0\0\273\0\0\0W\0\0\0i\0\0\0\343\0\0\0\377\0" "\0\0\377\0\0\0\240\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\260\0\0\0\324\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0""0\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0h\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\260" "\0\0\0z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\327\0\0\0\377\0\0\0\377\0\0" "\0\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\377\0\0\0\377\0\0\0\332\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\306\0\0\0\377\0\0\0\377\0\0\0\277\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\5\0\0\0\361\0\0\0\377\0\0\0\377\0\0\0e\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "Y\0\0\0\377\0\0\0\377\0\0\0\271\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\32\0\0\0\347\0\0\0\377" "\0\0\0\264\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\0\326\0\0\0\375\0\0\0\204\0\0\0\3" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0""2\0\0\0\341\0\0\0\345\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\25\0\0" "\0A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\0\0\0" "\367\0\0\0\262\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0L\0\0\0\350\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\216\0\0\0\377\0\0\0\347\0" "\0\0\220\0\0\0\220\0\0\0\220\0\0\0\220\0\0\0\220\0\0\0\261\0\0\0\350\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\314\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\350\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\314\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\350" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\30\0\0\0g\0\0\0\234\0\0\0\301\0\0\0\323\0\0\0\317" "\0\0\0\262\0\0\0n\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0t\0\0\0\377\0\0\0\312\0\0\0\\\0\0\0[\0\0\0\303\0\0\0\377" "\0\0\0\377\0\0\0\332\0\0\0\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0t\0\0\0\354\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\347\0\0\0\377" "\0\0\0\377\0\0\0\230\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0X\0\0\0\204\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\260\0\0\0\377\0\0\0\377" "\0\0\0\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\271\0\0\0\377\0\0\0\377\0\0\0\303" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0!\0\0\0\366\0\0\0\377\0\0\0\377\0\0\0d\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Z\0\0\0" "\225\0\0\0\353\0\0\0\377\0\0\0\343\0\0\0k\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\0\0\0\276\0\0\0\371" "\0\0\0\377\0\0\0\322\0\0\0n\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&\0\0\0\350\0\0\0" "\377\0\0\0\377\0\0\0\235\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0q\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0=\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\204\0\0\0C\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0T\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\225\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0z\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0!\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\370\0\0\0K\0\0\0\0\0\0\0\0\0\0" "\0B\0\0\0\361\0\0\0\377\0\0\0\377\0\0\0\224\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0r\0\0\0\331\0\0\0\377\0\0\0\352\0\0\0\351\0\0\0\377" "\0\0\0\377\0\0\0\341\0\0\0r\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\0\0\0""5\0\0\0D\0\0\0>\0\0\0\40\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\0\0\0\313\0\0\0" "\330\0\0\0\330\0\0\0r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\203\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\0\366\0\0\0\375\0\0\0\377\0\0\0\377\0" "\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\240\0\0\0\325\0\0\0\313\0\0\0\377\0\0\0\377\0\0\0" "\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0/\0\0\0\375\0\0\0K\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\273\0\0\0\276\0\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0J\0\0\0\376" "\0\0\0""2\0\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\325\0\0\0\243\0\0" "\0\0\0\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0g\0\0\0\367\0\0\0\36\0\0\0\0\0" "\0\0\0\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\0\0\0\350\0\0\0\232\0\0\0\30\0\0\0\30\0\0" "\0\30\0\0\0\315\0\0\0\377\0\0\0\377\0\0\0\223\0\0\0\30\0\0\0\22\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\310\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0(\0\0\0(\0\0\0(\0\0\0(\0\0\0(\0" "\0\0\320\0\0\0\377\0\0\0\377\0\0\0\232\0\0\0(\0\0\0\37\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\310" "\0\0\0\377\0\0\0\377\0\0\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0#\0\0\0""0\0\0\0\322\0\0\0\377" "\0\0\0\377\0\0\0\236\0\0\0""0\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224" "\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\374\0\0\0\374\0\0\0\374\0\0\0\374\0" "\0\0\374\0\0\0\374\0\0\0\374\0\0\0'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\354\0\0\0\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354" "\0\0\0?\0\0\0\221\0\0\0\311\0\0\0\310\0\0\0\241\0\0\0I\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\342" "\0\0\0|\0\0\0m\0\0\0\320\0\0\0\377\0\0\0\377\0\0\0\241\0\0\0\2\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\226\0\0\0$\0\0\0\0\0" "\0\0\0\0\0\0\17\0\0\0\352\0\0\0\377\0\0\0\377\0\0\0u\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\232\0\0\0\377\0\0\0\377\0\0\0\344\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0u\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0o\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "_\0\0\0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\0\0\0\377\0\0\0\377\0" "\0\0\373\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0" "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\277\0\0\0\377\0\0\0\377\0\0\0" "\267\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\210\0\0\0\376" "\0\0\0Y\0\0\0\0\0\0\0\0\0\0\0_\0\0\0\377\0\0\0\377\0\0\0\363\0\0\0,\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\315\0\0\0\375\0\0" "\0\353\0\0\0\352\0\0\0\377\0\0\0\377\0\0\0\300\0\0\0-\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0""2\0" "\0\0D\0\0\0<\0\0\0\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0G\0\0\0\241\0\0\0\314\0\0\0" "\323\0\0\0\276\0\0\0\224\0\0\0S\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\4\0\0\0\245\0\0\0\377\0\0\0\351\0\0\0s\0\0\0R\0\0\0" "\213\0\0\0\375\0\0\0\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\202\0\0\0\377\0\0\0\375\0\0\0""0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\207\0\0\0\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\24\0\0\0\370\0\0\0\377\0\0\0\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23" "\0\0\0F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0f\0\0\0\377" "\0\0\0\377\0\0\0\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\237\0\0\0\377\0\0\0\377" "\0\0\0x\0\0\0L\0\0\0\224\0\0\0\241\0\0\0{\0\0\0\34\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\304\0\0\0\377\0\0\0\377\0\0\0\352" "\0\0\0\317\0\0\0\212\0\0\0\347\0\0\0\377\0\0\0\364\0\0\0A\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\323\0\0\0\377\0\0\0\377\0\0\0\373" "\0\0\0\26\0\0\0\0\0\0\0L\0\0\0\377\0\0\0\377\0\0\0\350\0\0\0\11\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\327\0\0\0\377\0\0\0\377\0\0\0\323\0" "\0\0\0\0\0\0\0\0\0\0\15\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0U\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\312\0\0\0\377\0\0\0\377\0\0\0\275\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\367\0\0\0\377\0\0\0\377\0\0\0\202\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\247\0\0\0\377\0\0\0\377\0\0\0\271\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\362\0\0\0\377\0\0\0\377\0\0\0\212\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\0\0\0\377\0\0\0\377\0\0\0\302\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0p\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\26\0\0\0\365\0\0\0\377\0\0\0\341\0\0\0\0\0\0\0" "\0\0\0\0\34\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0+\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\0\0\0\377\0\0\0\377\0\0\0B\0\0\0\0\0\0\0" "}\0\0\0\377\0\0\0\377\0\0\0\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0a\0\0\0\346\0\0\0\374\0\0\0\345\0\0\0\377\0\0" "\0\365\0\0\0\210\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0,\0\0\0B\0\0\0""5\0\0\0\10\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0U\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224" "\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\224\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\10\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\7\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\262\0\0\0""0\0\0\0""0\0\0\0""0\0" "\0\0""0\0\0\0""0\0\0\0B\0\0\0\374\0\0\0\303\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\224\0\0\0\240\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0z\0\0\0\377\0\0\0P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\27\0\0\0\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\346" "\0\0\0\333\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0_\0\0\0\377\0\0\0k\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\321\0\0\0\355\0\0\0\12\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0D\0\0\0\377\0\0\0\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\267" "\0\0\0\371\0\0\0\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0*\0\0\0\376\0\0\0\240\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\234\0\0\0\377\0\0\0.\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\26\0\0\0\367\0\0\0\272\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\201\0\0\0\377\0\0\0G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\352\0\0\0\324" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0W\0\0\0\250\0\0\0\314\0\0\0\323\0\0" "\0\277\0\0\0\207\0\0\0\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\2\0\0\0\263\0\0\0\377\0\0\0\377\0\0\0\215\0\0\0X\0\0\0\334" "\0\0\0\377\0\0\0\365\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0Y\0\0\0\377\0\0\0\377\0\0\0\351\0\0\0\0\0\0\0\0\0\0\0k\0\0\0\377" "\0\0\0\377\0\0\0\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\224\0\0\0\377\0\0\0\377\0\0\0\314\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\222" "\0\0\0\377\0\0\0\377\0\0\0\314\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0E\0\0\0" "\377\0\0\0\377\0\0\0\351\0\0\0\1\0\0\0\0\0\0\0k\0\0\0\377\0\0\0\377\0\0\0" "\305\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\0\0\0" "\366\0\0\0\377\0\0\0\222\0\0\0_\0\0\0\336\0\0\0\377\0\0\0\311\0\0\0\37\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)\0\0\0\247\0" "\0\0\376\0\0\0\361\0\0\0\335\0\0\0\377\0\0\0\343\0\0\0g\0\0\0\3\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0=\0\0\0\367\0\0\0\377\0\0\0\330" "\0\0\0\14\0\0\0\0\0\0\0h\0\0\0\377\0\0\0\377\0\0\0\260\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\313\0\0\0\377\0\0\0\377\0\0\0\212\0" "\0\0\0\0\0\0\0\0\0\0\14\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0G\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0s\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\364\0\0\0\377\0\0\0\377\0\0\0\202\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\13\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0t\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\365\0\0\0\377\0\0\0\377\0\0\0\206\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\333\0\0\0\377\0\0\0\377\0\0\0\216\0\0\0\0" "\0\0\0\0\0\0\0\17\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0W\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0Z\0\0\0\377\0\0\0\377\0\0\0\336\0\0\0\21\0\0" "\0\0\0\0\0p\0\0\0\377\0\0\0\377\0\0\0\317\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0T\0\0\0\327\0\0\0\377\0\0\0\366\0\0\0\345\0" "\0\0\377\0\0\0\367\0\0\0\236\0\0\0\23\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36\0\0\0=\0\0\0C\0\0\0""1\0\0" "\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0[\0\0\0\256\0\0\0\317\0\0\0\312\0\0" "\0\240\0\0\0?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\3\0\0\0\262\0\0\0\377\0\0\0\377\0\0\0~\0\0\0a\0\0\0\354\0\0\0" "\377\0\0\0\207\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0o\0\0\0\377\0\0\0\377\0\0\0\276\0\0\0\0\0\0\0\0\0\0\0y\0\0\0\377\0\0" "\0\377\0\0\0Q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\316\0" "\0\0\377\0\0\0\377\0\0\0\215\0\0\0\0\0\0\0\0\0\0\0F\0\0\0\377\0\0\0\377\0" "\0\0\313\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\370\0\0\0" "\377\0\0\0\377\0\0\0{\0\0\0\0\0\0\0\0\0\0\0""4\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\375\0\0\0\377" "\0\0\0\377\0\0\0z\0\0\0\0\0\0\0\0\0\0\0""3\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\343\0\0\0\377\0\0\0" "\377\0\0\0\207\0\0\0\0\0\0\0\0\0\0\0@\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\235\0\0\0\377\0\0\0\377\0" "\0\0\256\0\0\0\0\0\0\0\0\0\0\0i\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0_\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"\0\0\0\361\0\0\0\377\0\0\0\367" "\0\0\0B\0\0\0$\0\0\0\324\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0R\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0/\0\0\0\276\0\0\0\375\0\0\0\377" "\0\0\0\352\0\0\0y\0\0\0\356\0\0\0\377\0\0\0\377\0\0\0""9\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\22\0\0\0\1" "\0\0\0\1\0\0\0\371\0\0\0\377\0\0\0\375\0\0\0\15\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\37\0" "\0\0\377\0\0\0\377\0\0\0\275\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0M\0\0\0\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0j\0\0\0\377\0" "\0\0\377\0\0\0K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0X\0" "\0\0\377\0\0\0}\0\0\0\2\0\0\0\0\0\0\0""7\0\0\0\353\0\0\0\377\0\0\0\237\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\0\350\0" "\0\0\377\0\0\0\357\0\0\0\346\0\0\0\377\0\0\0\353\0\0\0w\0\0\0\2\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35\0" "\0\0=\0\0\0E\0\0\0.\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" }; static unsigned char image_data[512 * 256 * 4 + 1] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3" "\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2" "\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5" "\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0" "\0\0\12\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0" "\0\0\13\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\11\0\0\0\10\0" "\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\7\0\0\0\11\0\0\0\14\0\0\0\17\0\0\0\22" "\0\0\0\24\0\0\0\27\0\0\0\31\0\0\0\33\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34" "\0\0\0\34\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35" "\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\34" "\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\33\0\0\0\31\0\0\0\27\0\0\0\24" "\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\11\0\0\0\7\0\0\0\5\0\0\0\3\0\0\0\2\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0" "\0\4\0\0\0\7\0\0\0\12\0\0\0\16\0\0\0\23\0\0\0\30\0\0\0\35\0\0\0\"\0\0\0(" "\0\0\0-\0\0\0""1\0\0\0""5\0\0\0""7\0\0\0""9\0\0\0:\0\0\0:\0\0\0:\0\0\0:\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0" "\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0" ";\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0\0\0;\0" "\0\0;\0\0\0:\0\0\0:\0\0\0:\0\0\0:\0\0\0""9\0\0\0""7\0\0\0""5\0\0\0""1\0\0" "\0-\0\0\0(\0\0\0\"\0\0\0\35\0\0\0\30\0\0\0\23\0\0\0\16\0\0\0\12\0\0\0\7\0" "\0\0\4\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\10\0" "\0\0\14\0\0\0\22\0\0\0\31\0\0\0!\0\0\0)\0\0\0""2\0\0\0:\0\0\0B\0\0\0I\0\0" "\0P\0\0\0V\0\0\0[\0\0\0^\0\0\0`\0\0\0b\0\0\0b\0\0\0b\0\0\0b\0\0\0c\0\0\0" "c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0" "\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0" "\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0" "c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0\0\0c\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0c\0\0\0c\0\0\0c\0\0\0" "b\0\0\0b\0\0\0b\0\0\0b\0\0\0`\0\0\0^\0\0\0[\0\0\0V\0\0\0P\0\0\0I\0\0\0B\0" "\0\0:\0\0\0""2\0\0\0)\0\0\0!\0\0\0\31\0\0\0\22\0\0\0\14\0\0\0\10\0\0\0\4" "\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\2\0\0\0\4\0\0\0\7\0\0\0\14\0\0\0\23\0\0\0\34\0\0\0&\0\0\0" """2\0\0\0?\0\0\0K\0\0\0W\0\0\0a\0\0\0j\0\0\0r\0\0\0x\0\0\0~\0\0\0\203\0\0" "\0\206\0\0\0\210\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\210\0\0\0\206\0\0\0\203\0\0\0" "~\0\0\0x\0\0\0r\0\0\0j\0\0\0a\0\0\0W\0\0\0K\0\0\0?\0\0\0""2\0\0\0&\0\0\0" "\34\0\0\0\23\0\0\0\14\0\0\0\7\0\0\0\4\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\5\0\0\0\12\0\0\0\22\0\0\0\33\0\0\0(\0" "\0\0""6\0\0\0E\0\0\0V\0\0\0e\0\0\0s\0\0\0\177\0\0\0\210\0\0\0\217\0\0\0\224" "\0\0\0\230\0\0\0\233\0\0\0\236\0\0\0\241\0\0\0\243\0\0\0\244\0\0\0\244\0" "\0\0\244\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0\244\0\0\0\244\0" "\0\0\243\0\0\0\241\0\0\0\236\0\0\0\233\0\0\0\230\0\0\0\224\0\0\0\217\0\0" "\0\210\0\0\0\177\0\0\0s\0\0\0e\0\0\0V\0\0\0E\0\0\0""6\0\0\0(\0\0\0\33\0\0" "\0\22\0\0\0\12\0\0\0\5\0\0\0\2\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\7\0\0\0\15\0\0\0\27\0\0\0$\0\0\0""4\0\0\0F\0\0\0Y\0\0\0l\0\0\0}\0\0" "\0\214\0\0\0\227\0\0\0\237\0\0\0\244\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0" "\243\0\0\0\242\0\0\0\243\0\0\0\243\0\0\0\244\0\0\0\244\0\0\0\244\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245" "\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0" "\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0" "\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\245\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0\244\0\0\0\244\0\0\0\243\0\0\0\243" "\0\0\0\242\0\0\0\243\0\0\0\244\0\0\0\245\0\0\0\245\0\0\0\244\0\0\0\237\0" "\0\0\227\0\0\0\214\0\0\0~\0\0\0m\0\0\0Z\0\0\0G\0\0\0""5\0\0\0%\0\0\0\30\0" "\0\0\16\0\0\0\10\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\11\0\0\0\20\0\0\0" "\34\0\0\0,\0\0\0?\0\0\0T\0\0\0j\0\0\0\177\0\0\0\221\0\0\0\237\0\0\0\250\0" "\0\0\255\0\0\0\255\0\0\0\252\0\0\0\244\0\0\0\235\0\0\0\226\0\0\0\220\0\0" "\0\214\0\0\0\213\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0" "\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0" "\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0" "\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213" "\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\213\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0" "\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214" "\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\213\0\0\0\213\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\212\0\0\0\213\0\0\0" "\214\0\0\0\220\0\0\0\226\0\0\0\235\0\0\0\244\0\0\0\252\0\0\0\255\0\0\0\255" "\0\0\0\250\0\0\0\237\0\0\0\221\0\0\0\200\0\0\0k\0\0\0U\0\0\0@\0\0\0-\0\0" "\0\35\0\0\0\21\0\0\0\12\0\0\0\5\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\11\0\0\0\22\0\0\0\40\0\0\0""3" "\0\0\0I\0\0\0a\0\0\0y\0\0\0\216\0\0\0\237\0\0\0\253\0\0\0\261\0\0\0\261\0" "\0\0\254\0\0\0\243\0\0\0\230\0\0\0\213\0\0\0\177\10\10\10x&&&\177HHH\220" "ccc\244uuu\267\200\200\200\307\206\206\206\320\206\206\206\320\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206" "\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206" "\321\206\206\206\321\206\206\206\320\206\206\206\320\200\200\200\307uuu\267" "ccc\244HHH\220&&&\177\10\10\10x\0\0\0\200\0\0\0\214\0\0\0\231\0\0\0\244\0" "\0\0\255\0\0\0\262\0\0\0\262\0\0\0\254\0\0\0\240\0\0\0\217\0\0\0z\0\0\0b" "\0\0\0J\0\0\0""5\0\0\0\"\0\0\0\24\0\0\0\13\0\0\0\6\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\12\0\0\0\24\0\0\0#\0\0\0" """7\0\0\0P\0\0\0k\0\0\0\204\0\0\0\231\0\0\0\250\0\0\0\260\0\0\0\262\0\0\0" "\255\0\0\0\242\0\0\0\225\0\0\0\205\20\20\20}JJJ\217\206\206\206\272\235\235" "\235\312\247\247\247\307\255\255\255\306\261\261\261\305\262\262\262\305" "\262\262\262\305\263\263\263\304\263\263\263\304\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305" "\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262" "\262\305\263\263\263\304\263\263\263\304\262\262\262\305\262\262\262\305" "\261\261\261\305\255\255\255\306\247\247\247\307\235\235\235\312\206\206" "\206\272JJJ\217\20\20\20}\0\0\0\206\0\0\0\226\0\0\0\243\0\0\0\256\0\0\0\263" "\0\0\0\261\0\0\0\251\0\0\0\232\0\0\0\205\0\0\0m\0\0\0R\0\0\0""9\0\0\0&\0" "\0\0\27\0\0\0\14\0\0\0\6\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4" "\0\0\0\12\0\0\0\24\0\0\0$\0\0\0:\0\0\0T\0\0\0q\0\0\0\214\0\0\0\241\0\0\0" "\256\0\0\0\262\0\0\0\256\0\0\0\244\0\0\0\225\0\0\0\204###\203uuu\256\234" "\234\234\312\255\255\255\306\272\272\272\302\307\307\307\300\316\316\316" "\276\323\323\323\275\326\326\326\274\327\327\327\274\327\327\327\274\327" "\327\327\274\330\330\330\273\330\330\330\273\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327" "\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327" "\327\327\274\327\327\327\274\327\327\327\274\330\330\330\273\330\330\330" "\273\327\327\327\274\327\327\327\274\327\327\327\274\326\326\326\274\323" "\323\323\275\316\316\316\276\307\307\307\300\272\272\272\302\255\255\255" "\306\234\234\234\312uuu\256###\203\0\0\0\206\0\0\0\227\0\0\0\245\0\0\0\257" "\0\0\0\263\0\0\0\257\0\0\0\242\0\0\0\216\0\0\0s\0\0\0W\0\0\0=\0\0\0'\0\0" "\0\30\0\0\0\16\0\0\0\7\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\12\0\0\0\24" "\0\0\0$\0\0\0;\0\0\0V\0\0\0t\0\0\0\220\0\0\0\246\0\0\0\261\0\0\0\261\0\0" "\0\251\0\0\0\231\0\0\0\206\37\37\37\201{{{\265\241\241\241\311\263\263\263" "\304\304\304\304\300\321\321\321\275\334\334\334\272\344\344\344\271\352" "\352\352\267\354\354\354\267\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\360\360\360\266\360\360\360\266\360" "\360\360\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\357\357\357\266\360\360\360\266\360\360\360\266\360\360\360\266\357" "\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357" "\266\354\354\354\267\352\352\352\267\344\344\344\271\334\334\334\272\321" "\321\321\275\304\304\304\300\263\263\263\304\241\241\241\311{{{\265\37\37" "\37\201\0\0\0\211\0\0\0\233\0\0\0\253\0\0\0\263\0\0\0\263\0\0\0\250\0\0\0" "\222\0\0\0w\0\0\0Y\0\0\0?\0\0\0(\0\0\0\30\0\0\0\16\0\0\0\10\0\0\0\5\0\0\0" "\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\3\0\0\0\11\0\0\0\23\0\0\0#\0\0\0:\0\0\0V\0\0\0v\0\0\0\222\0\0\0\250\0\0" "\0\263\0\0\0\261\0\0\0\245\0\0\0\220\6\6\6{```\234\237\237\237\311\264\264" "\264\304\307\307\307\300\326\326\326\274\342\342\342\271\353\353\353\267" "\360\360\360\266\365\365\365\265\367\367\367\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\374\374\374\264" "\374\374\374\264\374\374\374\264\374\374\374\264\374\374\374\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264" "\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\374\374\374\264\374\374\374\264" "\374\374\374\264\374\374\374\264\374\374\374\264\372\372\372\264\372\372" "\372\264\372\372\372\264\372\372\372\264\372\372\372\264\367\367\367\264" "\365\365\365\265\360\360\360\266\353\353\353\267\342\342\342\271\326\326" "\326\274\307\307\307\300\264\264\264\304\237\237\237\311```\234\6\6\6{\0" "\0\0\223\0\0\0\250\0\0\0\263\0\0\0\265\0\0\0\252\0\0\0\225\0\0\0z\0\0\0Z" "\0\0\0?\0\0\0(\0\0\0\31\0\0\0\17\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\4" "\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\7\0\0\0\21\0\0\0\40\0\0\0" """7\0\0\0T\0\0\0t\0\0\0\222\0\0\0\251\0\0\0\264\0\0\0\262\0\0\0\243\0\0\0" "\213\37\37\37\200\223\223\223\312\256\256\256\305\304\304\304\300\326\326" "\326\274\343\343\343\271\354\354\354\267\363\363\363\265\367\367\367\264" "\372\372\372\264\374\374\374\264\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\374\374\374\264\372\372\372\264\367\367\367\264\363\363\363\265\354\354" "\354\267\343\343\343\271\326\326\326\274\304\304\304\300\256\256\256\305" "\223\223\223\312\37\37\37\200\0\0\0\220\0\0\0\246\0\0\0\265\0\0\0\267\0\0" "\0\254\0\0\0\225\0\0\0x\0\0\0Y\0\0\0=\0\0\0'\0\0\0\30\0\0\0\15\0\0\0\11\0" "\0\0\7\0\0\0\6\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0\16\0" "\0\0\34\0\0\0""3\0\0\0P\0\0\0q\0\0\0\220\0\0\0\250\0\0\0\264\0\0\0\262\0" "\0\0\243\0\0\0\212888\213\233\233\233\313\270\270\270\303\317\317\317\275" "\340\340\340\272\353\353\353\267\363\363\363\265\367\367\367\264\374\374" "\374\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\374\374\374\264\367\367\367\264\363\363\363\265\353\353\353\267\340\340" "\340\272\317\317\317\275\270\270\270\303\233\233\233\313888\213\0\0\0\217" "\0\0\0\247\0\0\0\265\0\0\0\267\0\0\0\254\0\0\0\224\0\0\0w\0\0\0W\0\0\0:\0" "\0\0#\0\0\0\26\0\0\0\16\0\0\0\12\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5" "\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" "\0\0\0\4\0\0\0\12\0\0\0\27\0\0\0,\0\0\0I\0\0\0k\0\0\0\214\0\0\0\245\0\0\0" "\263\0\0\0\261\0\0\0\242\0\0\0\211EEE\223\237\237\237\312\275\275\275\302" "\324\324\324\274\346\346\346\270\360\360\360\266\367\367\367\264\374\374" "\374\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\374\374" "\374\264\367\367\367\264\360\360\360\266\346\346\346\270\324\324\324\274" "\275\275\275\302\237\237\237\312EEE\223\0\0\0\217\0\0\0\247\0\0\0\265\0\0" "\0\267\0\0\0\252\0\0\0\221\0\0\0r\0\0\0Q\0\0\0""5\0\0\0!\0\0\0\24\0\0\0\15" "\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\5\0\0\0" "\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\22\0\0\0$\0\0\0" "?\0\0\0a\0\0\0\204\0\0\0\241\0\0\0\261\0\0\0\261\0\0\0\243\0\0\0\212EEE\223" "\237\237\237\312\275\275\275\302\326\326\326\274\350\350\350\270\363\363" "\363\265\371\371\371\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\371\371\371\264\363\363\363\265\350\350\350\270\326\326\326\274\275\275" "\275\302\237\237\237\312EEE\223\0\0\0\222\0\0\0\251\0\0\0\266\0\0\0\266\0" "\0\0\247\0\0\0\213\0\0\0j\0\0\0I\0\0\0/\0\0\0\35\0\0\0\22\0\0\0\15\0\0\0" "\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\33\0\0\0""4\0\0\0T\0\0\0y\0" "\0\0\231\0\0\0\256\0\0\0\261\0\0\0\245\0\0\0\213888\213\235\235\235\312\275" "\275\275\302\327\327\327\274\350\350\350\270\365\365\365\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\376\376\376\263\376\376\376\264\376\376\377\270\377\377\377\302\377" "\377\377\305\377\377\377\275\377\377\377\265\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\365\365\365\265\350\350\350\270\327\327\327" "\274\275\275\275\302\235\235\235\312888\213\0\0\0\224\0\0\0\254\0\0\0\267" "\0\0\0\264\0\0\0\240\0\0\0\202\0\0\0_\0\0\0A\0\0\0(\0\0\0\31\0\0\0\21\0\0" "\0\16\0\0\0\14\0\0\0\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\23\0\0\0(\0\0\0F\0\0\0j\0\0\0\216" "\0\0\0\250\0\0\0\262\0\0\0\250\0\0\0\220\37\37\37\200\233\233\233\313\273" "\273\273\302\326\326\326\274\350\350\350\270\365\365\365\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\264\376\376\377\264\376\376\376\265\374\375\376\266\373\375\376" "\267\372\374\376\272\371\374\376\274\370\373\376\301\371\374\376\316\375" "\376\377\342\377\377\377\347\374\375\376\325\373\374\376\276\376\376\376" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\365\365\365" "\265\350\350\350\270\326\326\326\274\273\273\273\302\233\233\233\313\37\37" "\37\200\0\0\0\232\0\0\0\260\0\0\0\271\0\0\0\260\0\0\0\227\0\0\0v\0\0\0T\0" "\0\0""7\0\0\0$\0\0\0\27\0\0\0\21\0\0\0\16\0\0\0\15\0\0\0\14\0\0\0\13\0\0" "\0\13\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4" "\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\34" "\0\0\0""6\0\0\0Y\0\0\0\177\0\0\0\237\0\0\0\261\0\0\0\256\0\0\0\231\6\6\6" "|\223\223\223\312\270\270\270\303\324\324\324\274\350\350\350\270\365\365" "\365\265\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\264\376\376\377\264\376\376\376\265\374\375\376\267" "\372\374\376\272\367\373\376\274\365\372\376\300\363\371\376\303\360\367" "\375\310\353\365\375\316\345\362\374\325\336\357\374\335\331\355\374\343" "\327\355\374\352\342\362\375\362\365\374\376\373\373\375\376\375\351\362" "\371\360\333\350\366\326\347\360\371\300\373\374\376\265\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\372\372\372\264\365\365\365\265\350\350\350\270" "\324\324\324\274\270\270\270\303\223\223\223\312\6\6\6|\0\0\0\244\0\0\0\267" "\0\0\0\271\0\0\0\250\0\0\0\213\0\0\0h\0\0\0G\0\0\0.\0\0\0\37\0\0\0\26\0\0" "\0\23\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\15\0\0\0\13\0\0\0\13\0\0\0\11\0\0" "\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\2\0\0\0\7\0\0\0\22\0\0\0'\0\0\0F\0\0\0l\0\0\0\221\0\0\0\253\0" "\0\0\262\0\0\0\244\0\0\0\206```\234\256\256\256\305\317\317\317\275\346\346" "\346\270\363\363\363\265\372\372\372\264\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\264\377\377\377\264\377\377\377\264\376\376\376\265\375\376" "\376\267\371\374\376\272\365\372\376\276\362\370\375\303\357\366\375\307" "\354\365\375\315\347\363\374\323\342\360\374\333\333\355\374\342\322\352" "\373\351\313\351\373\360\307\347\373\364\304\347\374\367\277\346\374\371" "\267\343\374\373\257\342\373\375\253\342\373\376\266\347\374\377\332\363" "\375\377\336\357\370\377\260\324\353\376\226\301\345\367\250\311\352\347" "\316\337\363\313\352\361\372\274\374\375\376\264\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\363\363\363\265\346\346\346\270\317\317\317\275\256\256" "\256\305```\234\0\0\0\225\0\0\0\257\0\0\0\273\0\0\0\265\0\0\0\235\0\0\0|" "\0\0\0Y\0\0\0<\0\0\0'\0\0\0\34\0\0\0\26\0\0\0\23\0\0\0\22\0\0\0\20\0\0\0" "\17\0\0\0\15\0\0\0\15\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6" "\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\12\0\0\0\31\0\0\0" """2\0\0\0V\0\0\0}\0\0\0\237\0\0\0\261\0\0\0\255\0\0\0\225\37\37\37\201\237" "\237\237\311\304\304\304\300\340\340\340\272\360\360\360\266\371\371\371" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\376\376\264\373\375\376" "\267\372\374\376\271\371\374\376\273\367\372\376\276\360\367\375\305\352" "\364\375\313\345\362\374\321\340\360\374\326\334\356\374\335\330\355\374" "\344\322\352\373\352\312\351\373\360\302\345\373\365\271\343\373\373\264" "\342\373\375\260\342\373\375\253\341\373\376\245\340\373\376\237\337\373" "\377\231\336\373\377\223\335\373\377\216\334\373\377\216\333\373\377\216" "\333\373\377\216\333\373\377\224\335\373\377\263\345\372\377\220\311\345" "\377:\233\315\3771\225\314\377T\243\324\376\177\263\337\370\241\305\350\346" "\301\330\357\321\343\355\370\277\370\372\375\266\376\376\376\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371\264" "\360\360\360\266\340\340\340\272\304\304\304\300\237\237\237\311\37\37\37" "\201\0\0\0\244\0\0\0\270\0\0\0\273\0\0\0\253\0\0\0\215\0\0\0j\0\0\0I\0\0" "\0""1\0\0\0\"\0\0\0\33\0\0\0\27\0\0\0\25\0\0\0\24\0\0\0\22\0\0\0\20\0\0\0" "\17\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5" "\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0!\0\0\0?\0\0\0e\0\0\0\214" "\0\0\0\250\0\0\0\260\0\0\0\243\0\0\0\203{{{\265\264\264\264\304\326\326\326" "\274\353\353\353\267\367\367\367\264\374\374\374\264\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\376\376\264\352\364\375\305\331\355\374\327\325\354\373\336\320" "\351\373\345\314\350\373\352\306\347\372\360\277\345\372\364\270\343\372" "\370\260\341\372\373\251\337\372\376\243\336\372\377\237\336\372\377\234" "\336\372\377\230\335\372\377\223\334\372\377\217\333\372\377\213\332\372" "\377\212\332\372\377\212\332\372\377\212\332\372\377\212\332\372\377\212" "\332\372\377\212\332\372\377\212\332\372\377\212\332\372\377\212\332\372" "\377\213\332\372\377\240\336\370\377g\265\333\377\21\207\303\377\0~\276\377" "\10\201\300\377+\220\311\377P\237\321\376u\257\333\367\223\275\344\347\271" "\323\355\320\356\364\372\271\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\374\374\374\264\367\367\367\264\353\353\353\267\326" "\326\326\274\264\264\264\304{{{\265\0\0\0\227\0\0\0\261\0\0\0\274\0\0\0\265" "\0\0\0\235\0\0\0z\0\0\0X\0\0\0=\0\0\0*\0\0\0\40\0\0\0\33\0\0\0\31\0\0\0\26" "\0\0\0\25\0\0\0\23\0\0\0\22\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\13\0\0\0\12" "\0\0\0\10\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\23\0\0\0" "*\0\0\0K\0\0\0s\0\0\0\227\0\0\0\255\0\0\0\253\0\0\0\225###\203\241\241\241" "\311\307\307\307\300\342\342\342\271\363\363\363\265\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\373\375\376\266\325\352\374\332\261" "\337\371\371\247\336\370\373\241\334\370\375\233\333\370\376\225\332\370" "\377\222\331\370\377\220\331\370\377\216\331\370\377\213\330\370\377\211" "\327\370\377\210\330\370\377\207\327\370\377\210\327\370\377\210\330\370" "\377\210\330\370\377\210\330\370\377\210\330\370\377\210\330\370\377\210" "\327\370\377\210\330\370\377\207\327\370\377\210\327\370\377\210\330\370" "\377\210\330\370\377\210\330\370\377\210\330\370\377\232\333\366\377_\261" "\332\377\16\204\301\377\0}\275\377\0}\274\377\2}\275\377\16\203\300\377%" "\214\306\377H\232\317\375v\253\335\357\317\340\363\304\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\363\363\363\265\342\342\342\271\307\307\307\300\241\241\241\311###\203" "\0\0\0\250\0\0\0\272\0\0\0\273\0\0\0\250\0\0\0\211\0\0\0g\0\0\0I\0\0\0""2" "\0\0\0&\0\0\0!\0\0\0\35\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0" "\0\21\0\0\0\17\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0" "\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\3\0\0\0\12\0\0\0\30\0\0\0""2\0\0\0W\0\0\0\177\0\0\0\240\0\0\0\255" "\0\0\0\243\0\0\0\205uuu\256\263\263\263\304\326\326\326\274\353\353\353\267" "\367\367\367\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\372\374\376\267\321\351\373\337\233\331\370\377\211\326\366\377\206\325" "\366\377\205\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377" "\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325" "\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377" "\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325" "\366\377\204\325\366\377\204\325\366\377\204\325\366\377\204\325\366\377" "\204\325\366\377\226\330\364\377\\\256\330\377\15\203\300\377\0|\274\377" "\0|\273\377\0|\273\377\0|\273\377\3|\273\377\35\207\303\377^\240\326\366" "\307\333\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\367\367\367\264\353\353\353\267" "\326\326\326\274\263\263\263\304uuu\256\0\0\0\236\0\0\0\265\0\0\0\275\0\0" "\0\262\0\0\0\226\0\0\0t\0\0\0S\0\0\0;\0\0\0.\0\0\0&\0\0\0!\0\0\0\37\0\0\0" "\34\0\0\0\32\0\0\0\30\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0\16\0\0\0" "\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0" "\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\36\0\0\0;\0" "\0\0a\0\0\0\211\0\0\0\244\0\0\0\252\0\0\0\230\20\20\20}\234\234\234\312\304" "\304\304\300\342\342\342\271\362\362\362\266\372\372\372\264\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\372\374\376\267\321\351\373" "\337\226\327\367\377\201\323\365\377\177\312\352\377\200\311\350\377\200" "\322\364\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365" "\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\200" "\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365" "\377\200\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\200" "\322\365\377\200\322\365\377\200\322\365\377\200\322\365\377\222\326\363" "\377X\254\326\377\15\202\276\377\0{\273\377\0{\272\377\0{\272\377\0{\272" "\377\0{\272\377\27\204\301\377]\237\325\366\310\334\361\307\376\376\376\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\372\372\372\264\362\362\362\266\342\342\342\271\304\304\304\300" "\234\234\234\312\20\20\20}\0\0\0\257\0\0\0\274\0\0\0\267\0\0\0\241\0\0\0" "\200\0\0\0_\0\0\0F\0\0\0""5\0\0\0+\0\0\0&\0\0\0#\0\0\0\40\0\0\0\36\0\0\0" "\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\20\0\0\0\16\0\0\0\15\0\0\0" "\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0#\0\0\0C\0\0\0j\0\0\0\217\0\0" "\0\246\0\0\0\244\0\0\0\213III\217\255\255\255\306\321\321\321\275\352\352" "\352\267\367\367\367\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\372\374\376\270\320\350\372\340\224\325\365\377" "~\317\362\377\202\301\335\377\233\265\303\377\217\310\341\377\201\314\356" "\377}\316\362\377}\316\362\377}\317\363\377}\316\362\377}\317\362\377|\316" "\362\377|\316\362\377|\316\362\377|\316\362\377|\316\362\377|\316\362\377" "|\317\363\377|\316\362\377|\317\362\377|\316\362\377|\316\362\377|\316\362" "\377|\316\362\377|\316\362\377|\316\362\377\214\322\360\377T\251\324\377" "\14\201\275\377\0{\272\377\0{\272\377\0{\271\377\0z\271\377\0z\271\377\27" "\203\300\377]\237\325\366\310\334\361\307\376\376\376\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\203\203\203\321\10\10\10\373EEE\344\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263ppp\327\7\7\7\374aaa\334\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\371\371\371\264fff\332\15\15\15\372TTT\340\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\367\367\367\264\352\352\352\267\321\321\321\275\255" "\255\255\306III\217\0\0\0\250\0\0\0\272\0\0\0\273\0\0\0\250\0\0\0\212\0\0" "\0j\0\0\0O\0\0\0<\0\0\0""2\0\0\0,\0\0\0(\0\0\0%\0\0\0\"\0\0\0\40\0\0\0\35" "\0\0\0\32\0\0\0\27\0\0\0\25\0\0\0\22\0\0\0\20\0\0\0\16\0\0\0\15\0\0\0\13" "\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\2\0\0\0\7\0\0\0\22\0\0\0(\0\0\0J\0\0\0r\0\0\0\225\0\0\0\245\0\0" "\0\235\0\0\0\177\206\206\206\272\272\272\272\302\333\333\333\273\360\360" "\360\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\371\374\376\270\317\350\372\341\220\323\363\377" "z\314\361\377\202\302\337\377\271\314\326\377\313\330\341\377\242\313\336" "\377\205\311\347\377z\313\356\377x\314\360\377y\314\361\377y\314\361\377" "y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314\361" "\377y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314\361\377y\314" "\361\377y\314\361\377x\314\361\377x\314\361\377\207\317\357\377P\247\323" "\377\13\200\274\377\0z\271\377\0z\271\377\0z\270\377\0z\270\377\0z\270\377" "\27\203\277\377]\237\324\366\310\334\361\307\376\376\376\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\13\13\13\373\0\0\0\377\1\1\1\377\374\374\374\264\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263EEE\345\7\7\7\374555\352\363\363\363\265\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\11\11\11\373\0\0\0\377\10\10\10\374\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\353\353\353\267333\353\0\0\0\377\0\0\0\377\5\5\5\375\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\360\360\360\266\333\333\333\273\272\272\272\302\206" "\206\206\272\0\0\0\243\0\0\0\270\0\0\0\275\0\0\0\260\0\0\0\224\0\0\0u\0\0" "\0X\0\0\0D\0\0\0""9\0\0\0""2\0\0\0-\0\0\0)\0\0\0'\0\0\0$\0\0\0\40\0\0\0\35" "\0\0\0\33\0\0\0\30\0\0\0\25\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13" "\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\2\0\0\0\10\0\0\0\25\0\0\0-\0\0\0P\0\0\0x\0\0\0\230\0\0\0\244\0\0\0\226\10" "\10\10x\235\235\235\312\305\305\305\300\343\343\343\271\365\365\365\265\374" "\374\374\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\371\374\376\270\317\347\372\341\215\321\363\377u\312\357\377" "\177\301\336\377\276\320\333\377\351\360\367\377\327\343\353\377\263\320" "\337\377\215\310\342\377x\310\353\377u\311\357\377u\312\357\377t\312\357" "\377t\312\357\377t\312\357\377t\312\357\377t\312\357\377u\312\357\377u\312" "\357\377t\311\357\377u\311\357\377t\311\357\377t\311\357\377t\311\357\377" "t\311\357\377t\311\357\377t\311\357\377\202\314\355\377L\244\321\377\12\177" "\273\377\0y\270\377\0y\267\377\0y\267\377\0y\267\377\0y\266\377\27\202\276" "\377]\237\324\366\310\334\361\307\376\376\376\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\362\362\362\266ppp\327\35\35\35\363\4\4\4\376111\353\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\343\343\343\271>>>\347\7\7\7\374\\\\" "\\\335\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\256\256\256\305```\334...\355\17\17\17\370\3" "\3\3\376\6\6\6\375\24\24\24\366:::\351\203\203\203\321\362\362\362\266\377" "\377\377\263\377\377\377\263\377\377\377\263vvv\325\10\10\10\374aaa\334\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\372\372\372" "\264\264\264\264\304ooo\327>>>\347\36\36\36\363\11\11\11\373\2\2\2\376\10" "\10\10\373(((\357\227\227\227\313\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\360\360\360\266\243\243" "\243\310aaa\334...\355\14\14\14\372\2\2\2\376...\355\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\362\362\362\266ppp\327\35\35\35\363\4\4\4\376111\353\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "hhh\331\11\11\11\373\217\217\217\316\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\5\5\5\375\0\0\0\377\0\0\0\377" "\344\344\344\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263333\353\0\0\0\377\0\0\0\377" "UUU\337\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263]]]\334\4\4\4\376\13\13\13\372" "\27\27\27\365\36\36\36\363!!!\361\"\"\"\361###\361&&&\360***\356888\351i" "ii\331\353\353\353\267\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\4\4\4\376\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\333\333\333\273\"\"\"\361" "\0\0\0\377\0\0\0\377\0\0\0\377333\353\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\374\374\374" "\264\365\365\365\265\343\343\343\271\305\305\305\300\235\235\235\312\10\10" "\10x\0\0\0\265\0\0\0\276\0\0\0\265\0\0\0\235\0\0\0}\0\0\0`\0\0\0L\0\0\0?" "\0\0\0""7\0\0\0""2\0\0\0.\0\0\0,\0\0\0(\0\0\0%\0\0\0\"\0\0\0\36\0\0\0\33" "\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11" "\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\11\0\0\0\27" "\0\0\0""1\0\0\0V\0\0\0~\0\0\0\234\0\0\0\243\0\0\0\220&&&\177\247\247\247" "\307\316\316\316\276\350\350\350\270\367\367\367\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\370" "\373\376\271\316\347\372\341\213\317\362\377r\307\356\377}\277\336\377\276" "\320\333\377\355\365\374\377\355\365\374\377\342\352\362\377\304\327\342" "\377\226\307\336\377y\305\350\377q\306\355\377q\307\356\377q\307\356\377" "q\307\356\377q\307\356\377q\307\356\377p\307\356\377p\307\356\377p\306\356" "\377p\306\356\377p\306\356\377p\306\356\377p\306\356\377p\306\356\377p\306" "\356\377p\306\356\377}\310\354\377H\242\317\377\11~\272\377\0y\267\377\0" "y\266\377\0x\266\377\0x\266\377\0x\266\377\27\201\274\377]\237\324\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\304\304\304\300\34\34" "\34\364\0\0\0\377\0\0\0\377\0\0\0\377\34\34\34\363\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\357\357\357\266\"\"\"\361\0\0\0\377\0\0\0\377\7\7\7\374***\356\11\11\11" "\373777\352\254\254\254\306\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\360\360" "\360\266///\355\26\26\26\365\340\340\340\272\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\366\366\366\265JJJ\343\10\10" "\10\373\226\226\226\314\377\377\377\263\377\377\377\263\353\353\353\267m" "mm\330\26\26\26\365\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\32\32\32\364\316\316\316\276\377\377" "\377\263\377\377\377\263\16\16\16\371\0\0\0\377\5\5\5\375\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\344\344" "\344\271\271\271\271\303\215\215\215\316```\334555\352\26\26\26\366\4\4\4" "\375\5\5\5\375888\351\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\374\374\374\264\237\237\237\311GGG\344\13\13" "\13\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\10\10\10\373\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\357\357" "\357\266\206\206\206\320666\352\5\5\5\375\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\10\10\10\373\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263```\334\10\10\10\373bbb\333\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\304\304\304\300\34\34\34\364\0\0\0\377\0\0\0\377\0\0" "\0\377\34\34\34\363\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\6\6\6\374\0\0\0\377\26\26\26\365\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\25\25\25" "\366\0\0\0\377\0\0\0\377\302\302\302\301\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\360\360\360\266///\355\26" "\26\26\365\340\340\340\272\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\366\366\366\265JJJ\343\10\10\10\373\226\226\226" "\314\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263TTT\337\6\6\6\374&&&\360\3\3\3\376\1\1\1\377" "\264\264\264\304\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\12\12\12\373\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377&&&\360\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\15\15\15\371\0\0\0\377\10\10\10\374\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\262\262\262\305\23\23\23\367" "\0\0\0\377\0\0\0\377\0\0\0\377III\343\352\352\352\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\367\367\367\264\350\350\350\270\316\316\316\276\247" "\247\247\307&&&\177\0\0\0\264\0\0\0\300\0\0\0\272\0\0\0\244\0\0\0\206\0\0" "\0i\0\0\0S\0\0\0E\0\0\0=\0\0\0""7\0\0\0""4\0\0\0""0\0\0\0,\0\0\0)\0\0\0%" "\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0\16\0" "\0\0\14\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3" "\0\0\0\12\0\0\0\31\0\0\0""5\0\0\0[\0\0\0\203\0\0\0\237\0\0\0\243\0\0\0\215" "HHH\220\255\255\255\306\323\323\323\275\354\354\354\267\371\371\371\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\370\373\376\271\316\347\372\342\210\315\360\377l\304\354\377" "y\275\334\377\275\320\333\377\355\365\374\377\357\367\376\377\357\367\376" "\377\353\363\371\377\327\342\351\377\254\315\336\377\205\304\342\377q\303" "\351\377l\303\353\377k\303\354\377k\303\354\377k\303\354\377k\303\354\377" "k\303\354\377k\303\354\377k\303\354\377k\303\354\377k\303\354\377k\303\354" "\377k\303\354\377k\303\354\377k\302\354\377w\305\352\377E\237\315\377\11" "}\270\377\0x\266\377\0x\266\377\0x\265\377\0x\265\377\0w\264\377\27\201\274" "\377]\237\324\366\310\334\361\307\376\376\376\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\267\267\267\303" "\12\12\12\373\0\0\0\377\0\0\0\377\0\0\0\377\"\"\"\361\314\314\314\276\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\\\\\\\335\0\0\0\377\0\0\0\377\0\0\0\377GGG\344\4\4\4" "\375\0\0\0\377\0\0\0\377\0\0\0\377]]]\334\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263777\351\0" "\0\0\377\0\0\0\377MMM\342\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263www\325\0\0\0\377\0\0\0\377+++\356\377\377\377\263" "\214\214\214\317\15\15\15\371\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377###" "\361\271\271\271\303\366\366\366\265\352\352\352\267\234\234\234\312\34\34" "\34\364\0\0\0\377\0\0\0\377///\354\377\377\377\263\377\377\377\263\1\1\1" "\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377\377\263" "@@@\347\4\4\4\376\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\34\34\34\364\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263444\353\0\0\0\377\0\0\0\377\0" "\0\0\377\10\10\10\374EEE\345\214\214\214\317\322\322\322\275\371\371\371" "\264\277\277\277\301\0\0\0\377\0\0\0\377***\356\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\217" "\217\217\316\15\15\15\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377YYY\336\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\4\4\4\375\0\0\0\377\1\1\1\376\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\267\267\267\303\12\12\12\373\0\0\0\377\0\0\0\377\0\0\0\377" "\"\"\"\361\314\314\314\276\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\10\10\10\373\0\0\0\377\1\1\1\377\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "---\355\0\0\0\377\0\0\0\377\235\235\235\312\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263777\351\0\0\0\377\0\0\0\377" "MMM\342\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263www\325\0\0\0\377\0\0\0\377+++\356\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\4\4\4\376\0" "\0\0\377\6\6\6\374jjj\331\0\0\0\377(((\357\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263;;;\350\0" "\0\0\377\0\0\0\377\0\0\0\377\360\360\360\266\374\374\374\264\375\375\375" "\263\365\365\365\265\323\323\323\275ttt\326\0\0\0\377\0\0\0\377\15\15\15" "\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\32\32" "\32\364\0\0\0\377\16\16\16\371\377\377\377\263\377\377\377\263\375\375\375" "\263uuu\325\3\3\3\376\0\0\0\377\0\0\0\377\22\22\22\370\234\234\234\312\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371" "\371\371\264\354\354\354\267\323\323\323\275\255\255\255\306HHH\220\0\0\0" "\265\0\0\0\303\0\0\0\277\0\0\0\253\0\0\0\216\0\0\0q\0\0\0Z\0\0\0L\0\0\0C" "\0\0\0=\0\0\0:\0\0\0""5\0\0\0""1\0\0\0.\0\0\0)\0\0\0&\0\0\0\"\0\0\0\37\0" "\0\0\33\0\0\0\31\0\0\0\25\0\0\0\23\0\0\0\20\0\0\0\16\0\0\0\14\0\0\0\12\0" "\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0\33\0\0\0""7" "\0\0\0^\0\0\0\206\0\0\0\241\0\0\0\243\0\0\0\213ccc\244\261\261\261\305\326" "\326\326\274\356\356\356\267\371\371\371\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\370\373\376" "\271\316\347\372\342\205\313\357\377h\301\352\377v\272\333\377\275\317\333" "\377\355\365\374\377\357\367\376\377\357\367\376\377\357\367\376\377\354" "\364\373\377\335\347\357\377\274\325\342\377\222\306\337\377s\300\344\377" "h\300\352\377h\300\352\377h\300\352\377h\300\352\377h\300\352\377h\300\352" "\377h\300\352\377g\300\352\377g\300\352\377f\300\352\377f\300\352\377f\300" "\352\377g\277\352\377r\302\350\377A\235\314\377\11|\267\377\0x\265\377\0" "w\264\377\0w\264\377\0w\263\377\0w\263\377\27\200\273\377]\237\323\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\311\311\311\277\13\13\13\372\0\0\0\377\0\0\0\377\22" "\22\22\367\213\213\213\317\374\374\374\264\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\342\342" "\342\271\5\5\5\375\0\0\0\377...\355\375\375\375\263\377\377\377\263777\352" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377YYY\336\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\16\16\16\371\0\0\0\377" "\0\0\0\377\1\1\1\376\275\275\275\302\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\367\367\367\264\24\24\24\366\0\0\0\377\0\0\0\377\11\11\11\373\377\377" "\377\263\10\10\10\373\0\0\0\377\0\0\0\377\32\32\32\364\0\0\0\377\0\0\0\377" "***\356\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\307" "\307\307\300\0\0\0\377\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263" "\3\3\3\376\0\0\0\377\36\36\36\363\377\377\377\263\377\377\377\263\377\377" "\377\263\37\37\37\362\10\10\10\374!!!\362EEE\345nnn\327\231\231\231\313\300" "\300\300\301\237\237\237\312\0\0\0\377\0\0\0\377ooo\327\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263OOO\341\0\0\0" "\377\0\0\0\377\0\0\0\377\340\340\340\272\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\211\211\211\317\0\0\0\377\5\5\5\375\272" "\272\272\302\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\26\26\26\366\22\22\22\370000\354PPP" "\341sss\326\227\227\227\313\275\275\275\302\326\326\326\274\354\354\354\267" "\374\374\374\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\202\202\202\321\6\6\6\374)))\356\304\304\304\300" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\0\0\0\377\0\0\0\377\1\1\1\377\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\311\311\311\277\13\13" "\13\372\0\0\0\377\0\0\0\377\22\22\22\367\213\213\213\317\374\374\374\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\34\34\34\364\0\0\0\377\0\0\0\377\374\374\374\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263KKK\343\0" "\0\0\377\0\0\0\377zzz\324\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\16\16\16\371\0\0\0\377\0\0\0\377\1\1\1\376" "\275\275\275\302\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\367\367\367\264" "\24\24\24\366\0\0\0\377\0\0\0\377\11\11\11\373\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\10\10" "\10\373\0\0\0\377\14\14\14\372\366\366\366\265\34\34\34\364\0\0\0\377\227" "\227\227\314\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263zzz\324\0\0\0\377\0\0\0\377\0\0\0\377\367\367\367\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\277\277" "\277\301\0\0\0\377\0\0\0\377TTT\337\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263)))\357\0\0\0\377\22\22\22\367\377\377\377\263\342" "\342\342\271:::\351\0\0\0\377\0\0\0\377\0\0\0\377KKK\343\350\350\350\270" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\371\371\371\264\356\356\356\267\326\326\326\274\261\261" "\261\305ccc\244\0\0\0\267\0\0\0\305\0\0\0\303\0\0\0\260\0\0\0\224\0\0\0w" "\0\0\0b\0\0\0Q\0\0\0I\0\0\0C\0\0\0>\0\0\0:\0\0\0""6\0\0\0""2\0\0\0.\0\0\0" "*\0\0\0&\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0\30\0\0\0\25\0\0\0\22\0\0\0\17\0" "\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0" "\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0" "\13\0\0\0\34\0\0\0""9\0\0\0a\0\0\0\211\0\0\0\243\0\0\0\244\0\0\0\213uuu\267" "\262\262\262\305\327\327\327\274\356\356\356\267\371\371\371\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\367\373\376\272\314\346\372\343\202\311\356\377d\276\350\377r\270" "\332\377\274\317\333\377\355\365\374\377\357\367\376\377\357\367\376\377" "\357\367\376\377\357\367\376\377\355\365\374\377\344\355\365\377\315\335" "\350\377\243\312\335\377t\275\340\377d\275\347\377c\275\350\377c\275\350" "\377c\275\350\377c\275\350\377c\275\350\377c\275\350\377b\275\350\377b\275" "\350\377b\275\350\377b\275\350\377b\275\350\377m\276\346\377=\233\312\377" "\10{\266\377\0v\263\377\0v\263\377\0v\262\377\0u\262\377\0u\262\377\27\200" "\272\377]\236\323\366\310\334\361\307\376\376\376\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\362\362\362\266\36\36\36\363\0\0\0\377\0\0\0" "\377777\351\352\352\352\267\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263|||\323\0\0\0\377\0\0\0\377www\325\377\377\377\263\377\377\377\263" "\366\366\366\265|||\323\10\10\10\373\0\0\0\377\0\0\0\377\0\0\0\377\233\233" "\233\313\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "666\352\0\0\0\377\0\0\0\377\0\0\0\377///\355\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\211\211\211\317\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\377\377" "\377\377\263\220\220\220\316```\334\256\256\256\305\375\375\375\263\3\3\3" "\376\0\0\0\377\16\16\16\371\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\365\365\365\265\0\0\0\377\0\0\0\377\22\22\22\367\377\377" "\377\263\377\377\377\263\6\6\6\375\0\0\0\377...\355\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263;;;\350\0" "\0\0\377\14\14\14\372\352\352\352\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\13\13\13\373" "\0\0\0\377\0\0\0\377\334\334\334\272\377\377\377\263\377\377\377\263\377" "\377\377\263\217\217\217\316\4\4\4\375\6\6\6\374\237\237\237\312\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263TTT\340\7\7\7\374%%%\360\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\30\30\30\365\0\0\0\377\0\0\0\377\11\11\11" "\373\244\244\244\310\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\0\0\0\377\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\362\362\362\266\36\36\36\363\0\0" "\0\377\0\0\0\377777\351\352\352\352\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263666\352\0\0\0\377\0\0\0\377\363\363\363\265\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263mmm\330\0\0\0\377\0\0" "\0\377YYY\336\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263666\352\0\0\0\377\0\0\0\377\0\0\0\377///\355\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\211\211\211\317\0\0\0\377\0\0\0\377\0\0" "\0\377\1\1\1\377\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\353\353\353\267\0\0\0\377\0\0\0\377+++\356\377\377" "\377\263\234\234\234\312\0\0\0\377!!!\361\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\243\243\243\310\0\0\0\377" "\0\0\0\377\0\0\0\377\356\356\356\267\377\377\377\263\377\377\377\263\377" "\377\377\263\353\353\353\267\35\35\35\363\0\0\0\377\21\21\21\370\343\343" "\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" ":::\351\0\0\0\377\25\25\25\366\220\220\220\316\17\17\17\370\0\0\0\377\0\0" "\0\377\24\24\24\366\243\243\243\310\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\371\371\371\264\356\356\356\267\327\327\327\274\262\262\262\305" "uuu\267\0\0\0\272\0\0\0\310\0\0\0\306\0\0\0\265\0\0\0\232\0\0\0}\0\0\0h\0" "\0\0Y\0\0\0O\0\0\0I\0\0\0D\0\0\0@\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0*" "\0\0\0&\0\0\0\"\0\0\0\36\0\0\0\33\0\0\0\27\0\0\0\24\0\0\0\22\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\34" "\0\0\0:\0\0\0b\0\0\0\212\0\0\0\244\0\0\0\245\0\0\0\213\200\200\200\307\262" "\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\367\373\376\272\313\346\371\343\177\306\354\377`\273\346\377o\266\330" "\377\273\317\332\377\355\365\374\377\357\367\376\377\357\367\376\377\357" "\367\376\377\357\367\376\377\357\367\376\377\356\366\375\377\352\363\372" "\377\334\347\356\377\257\315\335\377\177\276\334\377d\272\344\377_\272\346" "\377_\272\346\377^\272\346\377^\272\346\377^\272\346\377^\272\346\377^\272" "\346\377^\272\346\377^\272\346\377^\272\346\377h\273\344\3779\230\311\377" "\7z\265\377\0v\262\377\0u\261\377\0u\261\377\0u\261\377\0u\261\377\27\177" "\271\377]\236\323\366\310\334\361\307\376\376\376\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263ddd\333\0\0\0\377\0\0\0\377888\351\371\371\371" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263<<<\347\0\0\0\377\0\0\0\377\254\254\254\306\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\300\300\300\301\15\15\15\371\0\0\0\377" "\0\0\0\377\30\30\30\365\371\371\371\264\377\377\377\263\377\377\377\263\377" "\377\377\263<<<\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\221\221\221\315" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\374\374\374\264\35\35\35\363\1\1\1\377\0\0\0\377\0\0\0\377\0\0\0" "\377\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\15\15\15\371\0\0\0\377\1\1\1\377\372\372\372\264\377\377\377" "\263\377\377\377\263\377\377\377\263\266\266\266\304\0\0\0\377\0\0\0\377" "QQQ\340\377\377\377\263\377\377\377\263\12\12\12\373\0\0\0\377<<<\350\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\267" "\267\267\303\0\0\0\377\0\0\0\377ooo\327\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263+++\356\0\0\0\377\0\0\0\377\266\266\266\304\377\377\377\263\344\344\344" "\271KKK\343\0\0\0\377$$$\360\302\302\302\301\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\2\2\2\376\0\0\0\377\0\0\0\377\0\0\0\377" "\3\3\3\376\211\211\211\320\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\0\0\0\377" "\0\0\0\377\3\3\3\376\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263ddd\333\0\0\0\377\0\0\0\377888\351\371\371\371" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263VVV\337\0\0\0\377\0\0\0\377\346\346\346\270\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\221\221\221\315\0\0\0\377\0\0\0\377" "\1\1\1\376FFF\344\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263<<<\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\221\221\221\315\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\374\374\374\264\35\35\35\363\1\1\1\377\0\0\0\377\0\0\0\377\0\0\0\377" "\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\252\252\252\307\0\0\0\377\0\0\0\377\\\\\\\335\377\377\377\263\377" "\377\377\263)))\357\0\0\0\377\247\247\247\307\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\316\316\316\276\0\0\0\377\0\0\0\377" "\0\0\0\377\343\343\343\271\377\377\377\263\377\377\377\263\367\367\367\264" "444\352\0\0\0\377\7\7\7\374\267\267\267\303\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263KKK\342\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\1\1\1\377QQQ\340\354\354\354\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\200\200\200\307\0\0\0\275\0\0\0\313" "\0\0\0\311\0\0\0\271\0\0\0\237\0\0\0\203\0\0\0m\0\0\0^\0\0\0U\0\0\0P\0\0" "\0J\0\0\0E\0\0\0A\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0)\0\0\0%\0\0\0\"\0" "\0\0\35\0\0\0\32\0\0\0\26\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\14\0\0\0\12\0" "\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\34\0\0\0:\0\0\0c\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\366\372\376\272\313" "\345\370\344{\304\352\377[\267\344\377k\263\327\377\273\316\332\377\355\365" "\374\377\357\367\376\377\357\367\376\377\357\367\376\377\357\367\376\377" "\357\367\376\377\357\367\376\377\357\367\376\377\356\366\375\377\343\355" "\364\377\306\331\344\377\225\303\333\377j\270\337\377[\266\343\377Z\266\344" "\377Z\266\344\377Z\266\344\377Z\266\344\377Z\266\344\377Z\266\344\377Z\266" "\344\377Z\266\344\377b\270\342\3776\226\306\377\7y\263\377\0u\261\377\0u" "\261\377\0u\260\377\0t\260\377\0t\260\377\27\177\271\377]\236\323\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\332\332\332" "\273\5\5\5\375\0\0\0\377\23\23\23\367\353\353\353\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\30\30" "\30\365\0\0\0\377\0\0\0\377\323\323\323\275\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\252\252\252\307\1\1\1\377" "\0\0\0\377\0\0\0\377\226\226\226\314\377\377\377\263\377\377\377\263\377" "\377\377\263EEE\345\0\0\0\377\4\4\4\376\12\12\12\373\0\0\0\377\23\23\23\367" "\356\356\356\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\227\227\227\314\0\0\0\377<<<\347\27\27\27\365\0\0\0\377\0\0\0\377" "\343\343\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\34\34\34\363\0\0\0\377\0\0\0\377\352\352\352\267\377\377\377\263" "\377\377\377\263\377\377\377\263AAA\346\0\0\0\377\10\10\10\374\324\324\324" "\274\377\377\377\263\377\377\377\263\22\22\22\370\0\0\0\377EEE\344\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263666\352\0" "\0\0\377\14\14\14\372\354\354\354\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263VVV\337\0\0\0\377\0\0\0\377uuu\325ttt\326\15\15\15\372\0\0\0\377\1\1" "\1\376\34\34\34\364\15\15\15\371\6\6\6\375\1\1\1\376\6\6\6\374\40\40\40\362" "ggg\331\360\360\360\266\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377" "\0\0\0\377\342\342\342\271\244\244\244\310jjj\331888\351\21\21\21\370'''" "\360\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\15\15\15\372XXX\337\0\0" "\0\377\0\0\0\377ooo\327\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\4\4\4\376" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\332\332" "\332\273\5\5\5\375\0\0\0\377\23\23\23\367\353\353\353\267\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "}}}\323\0\0\0\377\0\0\0\377\322\322\322\275\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\263\263\263\304\0\0\0\377\0\0\0\377\0\0" "\0\377\11\11\11\373\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263EEE\345\0\0\0\377\4\4\4\376\12\12\12\373\0\0\0\377\23\23\23\367\356" "\356\356\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\227\227\227\314\0\0\0\377<<<\347\27\27\27\365\0\0\0\377\0\0\0\377\343" "\343\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263fff\332\0\0\0\377\0\0\0\377\243\243\243\310\377\377\377\263\377\377\377" "\263\226\226\226\314\0\0\0\377%%%\360\233\233\233\313\377\377\377\263\377" "\377\377\263\377\377\377\263\367\367\367\264\1\1\1\376\0\0\0\377\0\0\0\377" "\327\327\327\274\377\377\377\263\374\374\374\264FFF\344\0\0\0\377\6\6\6\374" "\251\251\251\307\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263===\347\0\0\0\377\0\0\0\377\0\0\0" "\377\26\26\26\365\251\251\251\307\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264" "\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\300" "\0\0\0\316\0\0\0\315\0\0\0\275\0\0\0\243\0\0\0\211\0\0\0s\0\0\0d\0\0\0[\0" "\0\0U\0\0\0O\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0)" "\0\0\0%\0\0\0\40\0\0\0\35\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0\15\0" "\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0\0c" "\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\366\372" "\376\273\313\345\370\344x\301\351\377V\264\342\377h\261\325\377\272\316\331" "\377\355\365\374\377\357\367\376\377\357\367\376\377\357\367\376\377\357" "\367\376\377\352\364\375\377\340\360\372\377\335\356\371\377\334\355\370" "\377\332\354\370\377\323\347\363\377\276\327\345\377\223\300\330\377d\264" "\334\377U\263\341\377U\263\342\377U\263\342\377U\263\342\377U\263\342\377" "U\263\342\377U\263\342\377U\263\342\377\\\264\337\3772\223\304\377\6x\262" "\377\0t\260\377\0t\260\377\0t\260\377\0t\257\377\0t\257\377\27~\267\377]" "\236\322\366\310\334\361\307\376\376\376\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\\\\\\\335\0\0\0\377\0\0\0\377\217\217\217\316\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\6\6\6\374\0\0\0\377\0\0\0\377\356\356\356\267\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263GGG\344\0\0\0\377\0\0\0\377BBB\346\377\377\377\263\377\377\377\263\377" "\377\377\263OOO\341\0\0\0\377\2\2\2\376\201\201\201\322\0\0\0\377\0\0\0\377" "[[[\335\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263&" "&&\360\0\0\0\377\267\267\267\303666\352\0\0\0\377\0\0\0\377\312\312\312\277" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263000\354\0" "\0\0\377\0\0\0\377\332\332\332\273\377\377\377\263\377\377\377\263~~~\323" "\0\0\0\377\1\1\1\377\217\217\217\316\377\377\377\263\377\377\377\263\377" "\377\377\263\33\33\33\364\0\0\0\377CCC\345\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\273\273\273\302\0\0\0\377\0\0\0\377eee\332\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\200\200\200\322\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377<<<\350\377\377" "\377\263\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\27\27\27\365ppp\327\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\0\0\0\377" "\0\0\0\377\17\17\17\370\374\374\374\264EEE\344\0\0\0\377\0\0\0\377YYY\336" "\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\0\0\0\377\0\0\0\377\4\4\4\375\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\\\\\\\335\0\0\0\377\0\0\0\377\217\217\217\316" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263PPP\341\0\0\0\377\0\0\0\377\253\253\253\306" "\315\315\315\276\242\242\242\311ttt\326CCC\345\20\20\20\370\0\0\0\377\0\0" "\0\377\0\0\0\377QQQ\341\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263OOO\341\0\0\0\377\2\2\2\376\201\201\201\322\0\0\0\377\0\0\0\377" "[[[\335\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263&" "&&\360\0\0\0\377\267\267\267\303666\352\0\0\0\377\0\0\0\377\312\312\312\277" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\37\37\37" "\362\0\0\0\377\10\10\10\373\365\365\365\265\377\377\377\263\312\312\312\277" "///\355\0\0\0\377\0\0\0\377\6\6\6\375\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\23\23\23\367\0\0\0\377\0\0\0\377\314\314\314" "\276\374\374\374\264MMM\342\0\0\0\377\11\11\11\373\254\254\254\306\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\6\6\6\374\0\0\0\377\0\0\0\377SSS\340\356" "\356\356\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\303\0" "\0\0\320\0\0\0\317\0\0\0\277\0\0\0\250\0\0\0\215\0\0\0x\0\0\0j\0\0\0a\0\0" "\0[\0\0\0U\0\0\0P\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0""1\0\0\0-\0" "\0\0(\0\0\0$\0\0\0\40\0\0\0\33\0\0\0\30\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0\0c\0\0" "\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327" "\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\366\372\376" "\273\312\344\371\344u\277\350\377R\261\340\377d\256\324\377\271\315\331\377" "\355\365\374\377\357\367\376\377\356\366\375\377\352\364\374\377\355\366" "\375\377\333\354\370\377\244\323\355\377\210\307\350\377\202\305\347\377" "\177\303\347\377|\301\346\377v\276\343\377l\267\336\377[\261\334\377Q\260" "\340\377O\257\340\377N\257\340\377M\257\340\377K\255\337\377J\255\337\377" "I\254\337\377H\254\337\377Q\256\334\377.\220\302\377\6w\261\377\0s\257\377" "\0s\256\377\0s\256\377\0s\256\377\0s\256\377\27}\266\377]\235\322\366\310" "\334\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\367\367\367\264\16\16\16\371" "\0\0\0\377\24\24\24\366\371\371\371\264\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\1\1" "\1\377\0\0\0\377\0\0\0\377\372\372\372\264\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\254\254" "\254\306\0\0\0\377\0\0\0\377\25\25\25\366\377\377\377\263\377\377\377\263" "\377\377\377\263]]]\335\0\0\0\377\0\0\0\377\354\354\354\267333\353\0\0\0" "\377\2\2\2\376\271\271\271\303\377\377\377\263\377\377\377\263\251\251\251" "\307\0\0\0\377)))\356\377\377\377\263OOO\341\0\0\0\377\0\0\0\377\256\256" "\256\305\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "FFF\344\0\0\0\377\0\0\0\377\303\303\303\300\372\372\372\264eee\332\0\0\0" "\377\1\1\1\376\202\202\202\321\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263%%%\360\0\0\0\377<<<\347\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263@@@\346\0\0\0\377\6\6\6\375\340\340\340\272\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263111\354\0\0\0\377\0\0" "\0\377\0\0\0\377\23\23\23\367@@@\347nnn\327\233\233\233\313\303\303\303\300" "\346\346\346\270\367\367\367\264\363\363\363\265\211\211\211\317\0\0\0\377" "\0\0\0\377\5\5\5\375\377\377\377\263ddd\333\0\0\0\377\0\0\0\377\0\0\0\377" "\22\22\22\370<<<\350www\325\305\305\305\300\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\0\0\0\377\0\0\0\377\13\13\13\372\377\377\377\263" "\372\372\372\264III\343\0\0\0\377\0\0\0\377JJJ\343\372\372\372\264\377\377" "\377\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\5\5\5\375\377" "\377\377\263\377\377\377\263\377\377\377\263\367\367\367\264\16\16\16\371" "\0\0\0\377\24\24\24\366\371\371\371\264\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\6\6" "\6\374\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\243\243\243\310\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263]]]\335\0\0\0\377\0\0" "\0\377\354\354\354\267333\353\0\0\0\377\2\2\2\376\271\271\271\303\377\377" "\377\263\377\377\377\263\251\251\251\307\0\0\0\377)))\356\377\377\377\263" "OOO\341\0\0\0\377\0\0\0\377\256\256\256\305\377\377\377\263\377\377\377\263" "\377\377\377\263\267\267\267\303\0\0\0\377\0\0\0\377CCC\345\367\367\367\264" "lll\330\5\5\5\375\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\343\343\343\271" "\377\377\377\263\377\377\377\263\377\377\377\263%%%\360\0\0\0\377\0\0\0\377" "\263\263\263\304@@@\346\0\0\0\377\17\17\17\371\272\272\272\302\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263$$$\360\0\0\0\377\0\0\0\377)" "))\357\213\213\213\317\366\366\366\265\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\306\0\0\0\322\0\0\0\321\0\0\0\302\0\0\0\253\0\0\0\222\0\0\0~\0\0\0o\0" "\0\0f\0\0\0`\0\0\0[\0\0\0V\0\0\0P\0\0\0K\0\0\0E\0\0\0@\0\0\0;\0\0\0""5\0" "\0\0""0\0\0\0,\0\0\0'\0\0\0\"\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\24\0\0\0\20" "\0\0\0\16\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0" "\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\365\372" "\376\273\312\344\370\345r\275\346\377M\256\336\377`\254\322\377\270\315\331" "\377\355\365\374\377\356\366\376\377\333\355\371\377\270\333\357\377\331" "\350\362\377\340\354\365\377\237\315\346\377\\\262\337\377K\254\336\377H" "\254\335\377F\253\335\377E\253\335\377D\251\335\377B\251\334\377A\250\334" "\377@\250\334\377?\250\334\377>\247\334\377=\247\334\377=\246\334\377<\246" "\334\377;\246\333\377F\250\331\377)\215\301\377\5v\260\377\0s\256\377\0r" "\255\377\0r\255\377\0r\255\377\0r\255\377\27|\265\377]\235\321\366\310\334" "\361\307\376\376\376\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\245\245\245\310\0\0\0\377\0\0\0" "\377XXX\336\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\3\3\3\376\0\0\0" "\377\0\0\0\377\374\374\374\264\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\353\353\353\267\0\0" "\0\377\0\0\0\377\4\4\4\375\377\377\377\263\377\377\377\263\377\377\377\263" "mmm\330\0\0\0\377\0\0\0\377\330\330\330\273\322\322\322\275\10\10\10\374" "\0\0\0\377\36\36\36\362\363\363\363\265\377\377\377\263666\352\0\0\0\377" "\206\206\206\321\377\377\377\263ggg\331\0\0\0\377\0\0\0\377\222\222\222\315" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263[[[\335\0" "\0\0\377\0\0\0\377\177\177\177\322)))\356\0\0\0\377\13\13\13\372\234\234" "\234\312\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263444\353\0\0\0\377///\354\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\316\316\316\276\1\1\1\376\0\0\0\377QQQ\340\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263///\355\0\0\0\377\0\0\0\377" "\0\0\0\377\334\334\334\272\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\354\354" "\354\267\0\0\0\377\0\0\0\377\36\36\36\363\377\377\377\263\5\5\5\375\0\0\0" "\377\0\0\0\377\0\0\0\377\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\0\0\0\377\0\0\0\377\7\7\7\374\377\377\377\263\377\377\377\263\375\375\375" "\263XXX\336\0\0\0\377\0\0\0\377===\347\365\365\365\265\377\377\377\263\377" "\377\377\263\0\0\0\377\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263" "\377\377\377\263\245\245\245\310\0\0\0\377\0\0\0\377XXX\336\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263OOO\341\0\0\0\377\0\0\0\377\7\7\7\374***" "\356TTT\337\201\201\201\322\260\260\260\305\336\336\336\272'''\360\0\0\0" "\377\0\0\0\377\220\220\220\316\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263mmm\330\0\0\0\377\0\0\0\377\330\330\330\273\322\322\322" "\275\10\10\10\374\0\0\0\377\36\36\36\362\363\363\363\265\377\377\377\263" "666\352\0\0\0\377\206\206\206\321\377\377\377\263ggg\331\0\0\0\377\0\0\0" "\377\222\222\222\315\377\377\377\263\377\377\377\263\377\377\377\263]]]\334" "\0\0\0\377\0\0\0\377]]]\334\40\40\40\362\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377KKK\342\377\377\377\263\377\377\377\263\377\377" "\377\263666\352\0\0\0\377\0\0\0\377\13\13\13\373\0\0\0\377\0\0\0\377\231" "\231\231\313\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\235\235\235\312\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\22\22" "\22\370sss\326\354\354\354\267\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\310\0\0\0\324\0\0\0\323\0\0\0\304\0\0" "\0\256\0\0\0\226\0\0\0\203\0\0\0u\0\0\0l\0\0\0f\0\0\0`\0\0\0[\0\0\0U\0\0" "\0O\0\0\0J\0\0\0D\0\0\0>\0\0\0:\0\0\0""4\0\0\0/\0\0\0)\0\0\0%\0\0\0\40\0" "\0\0\34\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0" "\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0" "\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\365\372\376\274\312\344\370\345n\273\345\377" "G\252\334\377[\250\320\377\267\314\331\377\355\365\374\377\343\361\372\377" "\242\322\355\377g\264\335\377\253\316\341\377\344\355\364\377\312\340\355" "\377r\271\336\377>\245\332\3778\243\331\3777\243\331\3777\243\331\3777\242" "\331\3777\242\331\3776\242\331\3776\242\331\3776\242\331\3776\242\331\377" "6\242\331\3776\242\331\3776\242\331\3776\242\331\377A\244\327\377&\213\277" "\377\5u\257\377\0r\255\377\0r\255\377\0r\254\377\0r\254\377\0q\254\377\26" "|\265\377\\\235\321\366\310\334\361\307\376\376\376\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263aaa\334" "\0\0\0\377\0\0\0\377\232\232\232\313\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\13\13\13\372\0\0\0\377\0\0\0\377\362\362\362\266\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\362\362\362\266\0\0\0\377\0\0\0\377\15\15\15\372\377\377\377" "\263\377\377\377\263\377\377\377\263\177\177\177\322\0\0\0\377\0\0\0\377" "\302\302\302\301\377\377\377\263|||\323\0\0\0\377\0\0\0\377MMM\342\312\312" "\312\277\1\1\1\377\10\10\10\374\356\356\356\267\377\377\377\263~~~\323\0" "\0\0\377\0\0\0\377uuu\325\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263ddd\333\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377777\352\324" "\324\324\274\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263EEE\345\0\0\0\377\33\33\33\364\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263TTT\340\0\0\0\377\1\1\1\376\314\314\314\276" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\33\33\33\364\0\0\0\377\0\0\0\377\247\247\247\307\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263qqq\326\0\0\0\377\0\0\0\377\200\200\200\322" "\377\377\377\263\241\241\241\311\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377\2\2\2\376\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263ooo\327\0\0\0\377" "\0\0\0\377111\354\354\354\354\267\377\377\377\263\0\0\0\377\0\0\0\377\5\5" "\5\375\377\377\377\263\377\377\377\263\377\377\377\263aaa\334\0\0\0\377\0" "\0\0\377\232\232\232\313\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\235\235\235\312\0\0\0\377\0\0\0\377\202\202\202\321\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263BBB\345\0\0\0" "\377\0\0\0\377qqq\326\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\177\177\177\322\0\0\0\377\0\0\0\377\302\302\302\301\377\377" "\377\263|||\323\0\0\0\377\0\0\0\377MMM\342\312\312\312\277\1\1\1\377\10\10" "\10\374\356\356\356\267\377\377\377\263~~~\323\0\0\0\377\0\0\0\377uuu\325" "\377\377\377\263\377\377\377\263\377\377\377\263\36\36\36\362\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\376>>>\347\263\263\263\304<" "<<\347\0\0\0\377\0\0\0\377\247\247\247\307\377\377\377\263\377\377\377\263" "KKK\342\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\376:::\351" "\202\202\202\321\277\277\277\301\366\366\366\265\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\272\272\272\302" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15\15\372" "jjj\331\352\352\352\267\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\313\0" "\0\0\326\0\0\0\325\0\0\0\307\0\0\0\261\0\0\0\232\0\0\0\207\0\0\0z\0\0\0q" "\0\0\0k\0\0\0e\0\0\0_\0\0\0Z\0\0\0T\0\0\0O\0\0\0I\0\0\0C\0\0\0=\0\0\0""7" "\0\0\0""2\0\0\0-\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\27\0\0\0\24\0\0\0" "\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0" "\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327" "\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\365\371\376" "\274\310\343\370\345f\266\343\3778\242\330\377O\242\315\377\265\313\330\377" "\350\363\373\377\267\333\360\377Y\260\336\377;\242\330\377z\266\327\377\323" "\340\352\377\346\357\366\377\257\322\347\377N\251\331\3772\236\327\3772\236" "\327\3772\236\327\3772\236\327\3772\237\327\3772\236\327\3772\236\327\377" "2\236\327\3772\236\327\3772\236\327\3772\236\327\3772\236\327\3772\236\327" "\377<\240\325\377#\210\275\377\4t\255\377\0r\254\377\0q\254\377\0q\254\377" "\0q\253\377\0q\253\377\26{\263\377[\233\321\366\307\333\361\307\376\376\376" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263444\353\0\0\0\377\0\0\0\377\314\314\314\276\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\33\33\33\364\0\0\0\377\0\0\0\377\327" "\327\327\274\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\303\303\303\300\0\0\0\377\0\0\0\377" ":::\350\377\377\377\263\377\377\377\263\377\377\377\263\224\224\224\314\0" "\0\0\377\0\0\0\377\247\247\247\307\377\377\377\263\375\375\375\263000\354" "\0\0\0\377\0\0\0\377\32\32\32\364\0\0\0\377EEE\344\377\377\377\263\377\377" "\377\263\226\226\226\314\0\0\0\377\0\0\0\377YYY\336\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\37\37\37\362\0\0\0\377\0\0\0\377" "!!!\361\234\234\234\312\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263VVV\337\0\0\0\377\7\7\7\374\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\346\346\346\270\7\7" "\7\374\0\0\0\377<<<\347\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263888\351\0\0\0\377\0\0" "\0\377zzz\324\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\215\215\215\316\2\2\2\376\0\0\0\377" "<<<\347\375\375\375\263\377\377\377\263\377\377\377\263\0\0\0\377\0\0\0\377" "\0\0\0\377\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263hhh\331\33\33\33\364\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\216\216\216\316\4\4\4\376\0\0\0\377%%%\360\337\337\337\272\0\0\0" "\377\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263\377\377\377\263" "444\353\0\0\0\377\0\0\0\377\314\314\314\276\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\256\256\256\305\0\0\0\377\0\0\0\377iii\331\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263aaa\333\0" "\0\0\377\0\0\0\377QQQ\341\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\224\224\224\314\0\0\0\377\0\0\0\377\247\247\247\307\377" "\377\377\263\375\375\375\263000\354\0\0\0\377\0\0\0\377\32\32\32\364\0\0" "\0\377EEE\344\377\377\377\263\377\377\377\263\226\226\226\314\0\0\0\377\0" "\0\0\377YYY\336\377\377\377\263\377\377\377\263\330\330\330\273\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\7\7\7\374TTT\337\317\317\317\275\377\377\377" "\263\377\377\377\263\321\321\321\275\5\5\5\375\0\0\0\377\26\26\26\366\354" "\354\354\267\377\377\377\263bbb\333\0\0\0\377\0\0\0\377bbb\333\26\26\26\365" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\5\5\5\375///\355kkk\330" "\254\254\254\306\343\343\343\271\377\377\377\263\304\304\304\300\0\0\0\377" "\1\1\1\377\266\266\266\304EEE\344\1\1\1\376\0\0\0\377\0\0\0\377\0\0\0\377" "\13\13\13\372mmm\330\356\356\356\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327" "\327\327\274\262\262\262\305\206\206\206\321\0\0\0\315\0\0\0\327\0\0\0\326" "\0\0\0\311\0\0\0\264\0\0\0\236\0\0\0\214\0\0\0\177\0\0\0w\0\0\0p\0\0\0j\0" "\0\0d\0\0\0_\0\0\0Y\0\0\0S\0\0\0M\0\0\0G\0\0\0A\0\0\0;\0\0\0""5\0\0\0""0" "\0\0\0+\0\0\0&\0\0\0!\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\2\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\364\371\376\274\307\342\367" "\346`\263\340\3770\234\325\377J\237\314\377\263\311\330\377\316\346\365\377" "p\271\341\3775\236\326\3770\234\325\377R\247\323\377\261\315\336\377\343" "\354\365\377\333\351\363\377\205\277\337\3771\235\325\377/\234\325\377/\234" "\325\377/\234\325\377/\234\325\377/\234\325\377/\234\325\377/\234\325\377" "/\234\325\377/\234\325\377/\234\325\377/\234\325\377/\234\325\3778\235\322" "\377\40\206\273\377\4s\254\377\0q\253\377\0q\253\377\0q\252\377\0p\252\377" "\0p\252\377\25z\262\377X\231\320\366\307\333\361\307\376\376\376\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\26\26\26\366\0\0\0\377\0\0\0\377\353\353\353\267\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\356\356\356\267qqq\326\20\20\20\370777\352\377" "\377\377\263555\352\0\0\0\377\0\0\0\377\256\256\256\305\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263fff\332\0\0\0\377\0\0\0\377\235\235\235\312\377\377\377\263\377\377\377" "\263\377\377\377\263\255\255\255\306\0\0\0\377\0\0\0\377\213\213\213\317" "\377\377\377\263\377\377\377\263\326\326\326\274\13\13\13\372\0\0\0\377\0" "\0\0\377\0\0\0\377\227\227\227\314\377\377\377\263\377\377\377\263\255\255" "\255\306\0\0\0\377\0\0\0\377===\347\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263!!!\361\0\0\0\377\0\0\0\377\272\272\272\302\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263mmm\330\0" "\0\0\377\0\0\0\377\324\324\324\274\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263ooo\327\0\0\0\377\0\0\0\377\255\255" "\255\306\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263YYY\336\0\0\0\377\0\0\0\377SSS\340" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\362\362" "\362\266ZZZ\336\0\0\0\377\0\0\0\377BBB\346\365\365\365\265\377\377\377\263" "\377\377\377\263\377\377\377\263\5\5\5\375\0\0\0\377\0\0\0\377\356\356\356" "\267\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\302\302\302\301\2\2\2\376\12" "\12\12\373\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\242\242\242\311\6\6\6\374\0\0\0\377\30\30\30\365\0\0\0\377\0\0\0" "\377\4\4\4\376\377\377\377\263\377\377\377\263\377\377\377\263\26\26\26\366" "\0\0\0\377\0\0\0\377\353\353\353\267\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\356\356\356\267qqq\326\20\20\20\370777\352\377\377\377\263\304\304\304" "\300\0\0\0\377\0\0\0\377PPP\341\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\203\203\203\321\0\0\0\377\0\0\0\377" "111\353\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\255" "\255\255\306\0\0\0\377\0\0\0\377\213\213\213\317\377\377\377\263\377\377" "\377\263\326\326\326\274\13\13\13\372\0\0\0\377\0\0\0\377\0\0\0\377\227\227" "\227\314\377\377\377\263\377\377\377\263\255\255\255\306\0\0\0\377\0\0\0" "\377===\347\377\377\377\263\377\377\377\263\214\214\214\317\0\0\0\377\0\0" "\0\377\20\20\20\370lll\330\344\344\344\271\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263aaa\334\0\0\0\377\0\0\0\377" "FFF\344\377\377\377\263zzz\324\0\0\0\377\0\0\0\377\213\213\213\317\362\362" "\362\266vvv\325\33\33\33\364\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377\0\0\0\377\0\0\0\377\1\1\1\377rrr\326\316\316\316\276\0\0\0\377\0\0" "\0\377\323\323\323\275\377\377\377\263\302\302\302\301444\353\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\20\20\20\370\204\204\204\321\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266" "\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\317\0\0\0\331\0\0" "\0\330\0\0\0\313\0\0\0\267\0\0\0\242\0\0\0\220\0\0\0\204\0\0\0{\0\0\0u\0" "\0\0o\0\0\0i\0\0\0d\0\0\0]\0\0\0W\0\0\0Q\0\0\0K\0\0\0E\0\0\0>\0\0\0""9\0" "\0\0""3\0\0\0.\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\20" "\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0" "\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274" "\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\364\371\376\274\306\341" "\367\346]\260\337\377,\232\323\377F\234\312\377\254\305\325\377\211\303\344" "\3778\236\325\377+\231\323\377*\231\323\3777\235\323\377\205\267\324\377" "\320\340\354\377\342\356\371\377\306\335\355\377K\245\326\377+\231\323\377" "*\231\323\377*\231\323\377*\231\323\377*\231\323\377*\231\323\377*\231\323" "\377*\231\323\377*\231\323\377*\231\323\377*\231\323\377*\231\323\3773\232" "\320\377\35\204\271\377\3r\253\377\0p\252\377\0o\251\377\0o\251\377\0o\250" "\377\0o\250\377\24y\261\377W\231\320\366\307\333\361\307\376\376\376\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\10\10\10\374\0\0\0\377\0\0\0\377\371\371\371\264\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\263\263\263\304SSS\340\12\12\12\373\0\0\0\377\0\0\0\377\13\13\13\372\377" "\377\377\263aaa\334\0\0\0\377\0\0\0\377rrr\326\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\323\323\323\275\12\12" "\12\373\0\0\0\377///\354\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\311\311\311\277\0\0\0\377\0\0\0\377ggg\331\377\377\377\263" "\377\377\377\263\377\377\377\263\232\232\232\313\0\0\0\377\0\0\0\377\1\1" "\1\377\350\350\350\270\377\377\377\263\377\377\377\263\312\312\312\277\0" "\0\0\377\0\0\0\377&&&\360\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\213\213\213\317\0\0\0\377\0\0\0\377\216\216\216\316\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\211" "\211\211\317\0\0\0\377\0\0\0\377\242\242\242\311\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\371\371\371\264\24\24\24\367\0\0" "\0\377!!!\361\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263~~~\323\0\0\0" "\377\0\0\0\377///\354\377\377\377\263\377\377\377\263\347\347\347\270}}}" "\323\25\25\25\366\0\0\0\377\5\5\5\375uuu\325\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\24\24\24\366\0\0\0\377" "\0\0\0\377\307\307\307\300\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\343\343\343\271\40\40\40" "\362\0\0\0\377MMM\342\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\253\253\253\306\10\10\10\374\0\0\0\377\0" "\0\0\377\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263\377\377\377" "\263\10\10\10\374\0\0\0\377\0\0\0\377\371\371\371\264\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\263\263\263" "\304SSS\340\12\12\12\373\0\0\0\377\0\0\0\377\13\13\13\372\377\377\377\263" "\332\332\332\273\0\0\0\377\0\0\0\377777\352\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\247\247\247\307\0\0\0\377" "\0\0\0\377\30\30\30\365\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\311\311\311\277\0\0\0\377\0\0\0\377ggg\331\377\377\377\263\377" "\377\377\263\377\377\377\263\232\232\232\313\0\0\0\377\0\0\0\377\1\1\1\377" "\350\350\350\270\377\377\377\263\377\377\377\263\312\312\312\277\0\0\0\377" "\0\0\0\377&&&\360\377\377\377\263\377\377\377\263QQQ\341\0\0\0\377\0\0\0" "\377\273\273\273\302\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\353\353\353" "\267\20\20\20\370\0\0\0\377\0\0\0\377rrr\326\224\224\224\315\0\0\0\377\0" "\0\0\377xxx\324\377\377\377\263\377\377\377\263\377\377\377\263\315\315\315" "\276\221\221\221\315bbb\333111\353\6\6\6\374\0\0\0\377\0\0\0\377\0\0\0\377" "\12\12\12\373\327\327\327\274\0\0\0\377\0\0\0\377\256\256\256\305\377\377" "\377\263\377\377\377\263\377\377\377\263\231\231\231\313\26\26\26\365\0\0" "\0\377\0\0\0\377\0\0\0\377\0\0\0\377XXX\336\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305" "\206\206\206\321\0\0\0\320\0\0\0\332\0\0\0\331\0\0\0\315\0\0\0\272\0\0\0" "\245\0\0\0\224\0\0\0\207\0\0\0\177\0\0\0y\0\0\0s\0\0\0n\0\0\0h\0\0\0b\0\0" "\0[\0\0\0U\0\0\0O\0\0\0H\0\0\0B\0\0\0<\0\0\0""6\0\0\0""0\0\0\0+\0\0\0%\0" "\0\0!\0\0\0\34\0\0\0\31\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0" "\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0" "\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206" "\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\363\371\375\275\304\341\367\347Y\256\336\377(\227\322" "\377B\231\310\377\204\262\316\377<\237\325\377'\226\321\377'\226\321\377" "'\226\321\377*\227\321\377X\245\317\377\261\314\337\377\331\350\367\377\332" "\352\371\377\216\302\341\3774\233\322\377'\226\321\377'\226\321\377'\226" "\321\377'\226\321\377'\226\321\377'\226\321\377'\226\321\377'\226\321\377" "'\226\321\377'\226\321\377'\226\321\377.\227\316\377\32\202\267\377\3q\251" "\377\0o\250\377\0o\250\377\0n\247\377\0n\247\377\0n\247\377\23x\261\377U" "\227\317\366\306\333\361\307\376\376\376\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\2\2\2\376\0" "\0\0\377\0\0\0\377\237\237\237\312\371\371\371\264\350\350\350\270\244\244" "\244\310YYY\336\24\24\24\366\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\4" "\4\376\213\213\213\317\377\377\377\263\254\254\254\306\0\0\0\377\0\0\0\377" "!!!\361\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\333" "\333\333\273\40\40\40\362\0\0\0\377\16\16\16\371\324\324\324\274\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\352\352\352\267" "\0\0\0\377\0\0\0\377@@@\346\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263@@@\346\3\3\3\376@@@\347\377\377\377\263\377\377\377\263" "\377\377\377\263\356\356\356\267\0\0\0\377\0\0\0\377\22\22\22\370\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\254\254\254\306" "\0\0\0\377\0\0\0\377]]]\335\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\252\252\252\307\0\0\0\377\0\0\0\377iii\331\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\227\227\227\313" "\0\0\0\377\0\0\0\377~~~\323\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\356\356\356\267\237\237\237\312NNN\341\17" "\17\17\370BBB\346\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\247\247\247\307\0\0\0\377" "\0\0\0\377\17\17\17\370\234\234\234\312444\352\4\4\4\376\0\0\0\377\0\0\0" "\377444\352\312\312\312\277\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263666\352\0\0\0\377\0\0\0\377" "\200\200\200\322\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\362\362\362\266{{{\323\17\17\17\370\0\0\0\377\"\"\"\361\347\347" "\347\270\377\377\377\263\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\263\263\263\304\12\12\12\373\0\0\0\377" "\0\0\0\377\0\0\0\377\377\377\377\263\377\377\377\263\377\377\377\263\2\2" "\2\376\0\0\0\377\0\0\0\377\237\237\237\312\371\371\371\264\350\350\350\270" "\244\244\244\310YYY\336\24\24\24\366\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\4\4\4\376\213\213\213\317\377\377\377\263\357\357\357\266\0\0\0\377" "\0\0\0\377\35\35\35\363\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\315\315\315\276\0\0\0\377\0\0\0\377\16\16\16" "\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\352" "\352\352\267\0\0\0\377\0\0\0\377@@@\346\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263@@@\346\3\3\3\376@@@\347\377\377\377\263\377" "\377\377\263\377\377\377\263\356\356\356\267\0\0\0\377\0\0\0\377\22\22\22" "\370\377\377\377\263\377\377\377\263%%%\360\0\0\0\377\7\7\7\374\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\214\214\214" "\317\0\0\0\377\0\0\0\377\12\12\12\373\255\255\255\306\0\0\0\377\0\0\0\377" "```\334\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\363\363\363\265\237\237\237" "\311KKK\343\15\15\15\371NNN\341\337\337\337\272\0\0\0\377\0\0\0\377\214\214" "\214\317\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\365\365\365\265vvv\325\17\17\17\371\0\0\0\377\0\0\0\377\6\6\6\374\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327" "\327\274\262\262\262\305\206\206\206\321\0\0\0\322\0\0\0\333\0\0\0\332\0" "\0\0\316\0\0\0\274\0\0\0\250\0\0\0\227\0\0\0\213\0\0\0\202\0\0\0}\0\0\0w" "\0\0\0r\0\0\0k\0\0\0f\0\0\0_\0\0\0X\0\0\0R\0\0\0L\0\0\0E\0\0\0?\0\0\0""9" "\0\0\0""3\0\0\0-\0\0\0(\0\0\0\"\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0" "\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\363\370\375\275\301\337\367" "\347U\253\335\377%\223\320\3771\223\312\3776\227\313\377#\222\317\377#\222" "\317\377#\222\317\377#\222\317\377#\223\317\3774\227\316\377\201\263\321" "\377\305\333\355\377\325\350\372\377\301\334\362\377j\261\333\377)\225\320" "\377#\222\317\377#\222\317\377#\222\317\377#\222\317\377#\222\317\377#\222" "\317\377#\222\317\377#\222\317\377#\222\317\377#\222\317\377)\223\314\377" "\27\177\265\377\3p\250\377\0n\247\377\0n\247\377\0n\247\377\0n\246\377\0" "n\246\377\22v\257\377S\226\316\366\306\332\361\307\376\376\376\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\33\33\33\364\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\10\10\10\373444\352ttt\326\327\327" "\327\274\377\377\377\263\377\377\377\263\375\375\375\263\40\40\40\362\0\0" "\0\377\0\0\0\377ddd\332\360\360\360\266\327\327\327\274{{{\323\17\17\17\371" "\0\0\0\377\15\15\15\371\272\272\272\302\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\7\7\7\374\0" "\0\0\377\35\35\35\363\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\22\22\22\370\0\0\0\377" "\4\4\4\376\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\317\317\317\275\0\0\0\377\0\0\0\377,,,\355\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\315\315\315\276\0\0\0\377\0\0\0" "\377777\352\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "888\351\0\0\0\377\0\0\0\377\316\316\316\276\312\312\312\277\241\241\241\311" "xxx\324OOO\341%%%\360\3\3\3\376\0\0\0\377\0\0\0\377\0\0\0\377\6\6\6\374\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\322\322\322\275\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377***\356\245\245\245\310\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263www\325\0\0\0\377\0\0\0\377\24\24\24" "\366\300\300\300\301\363\363\363\265\264\264\264\304ZZZ\336\15\15\15\372" "\0\0\0\377\1\1\1\377MMM\342\356\356\356\267\377\377\377\263\377\377\377\263" "\5\5\5\375\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\270\270\270\303\14\14\14\372\0\0\0\377\0\0\0" "\377\377\377\377\263\377\377\377\263\377\377\377\263\33\33\33\364\0\0\0\377" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\10\10\10\373444\352ttt\326\327\327\327\274\377\377\377\263\377\377" "\377\263\377\377\377\263\2\2\2\376\0\0\0\377\6\6\6\375\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\357\357\357" "\266\0\0\0\377\0\0\0\377\7\7\7\374\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\7\7\7\374\0\0\0\377\35\35\35\363" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\22\22\22\370\0\0\0\377\4\4\4\376\377\377" "\377\263\377\377\377\263\10\10\10\373\0\0\0\377\15\15\15\371\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263iii\331\10\10\10\374BBB\346\310\310\310\277\0\0\0\377\0\0\0\377FFF\344" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\352\352\352\267\0\0\0\377" "\0\0\0\377kkk\330\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\357\357\357\266zzz\324\35\35\35" "\363@@@\347\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357" "\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\323\0\0\0" "\334\0\0\0\333\0\0\0\320\0\0\0\276\0\0\0\252\0\0\0\233\0\0\0\217\0\0\0\206" "\0\0\0\200\0\0\0{\0\0\0u\0\0\0p\0\0\0i\0\0\0c\0\0\0]\0\0\0V\0\0\0O\0\0\0" "H\0\0\0B\0\0\0<\0\0\0""5\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27" "\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0" "\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327" "\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\362\370\375" "\275\275\335\366\347R\250\333\377\"\221\315\377\"\217\314\377!\220\314\377" "\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377" "$\221\314\377V\237\312\377\252\310\337\377\313\342\370\377\311\342\370\377" "\236\312\351\377E\240\324\377!\220\315\377\37\217\315\377\37\217\315\377" "\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377\37\217\315\377" "\37\217\315\377\37\217\315\377%\217\312\377\24}\263\377\2o\247\377\0n\246" "\377\0n\246\377\0m\246\377\0m\245\377\0m\245\377\21u\256\377Q\224\315\366" "\304\331\360\307\375\376\376\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\263\263\263\304...\355\12" "\12\12\373\1\1\1\376\7\7\7\374\32\32\32\365444\353XXX\336\206\206\206\320" "\300\300\300\301\372\372\372\264\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\272\272\272\302" "\10\10\10\373\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "...\355\321\321\321\275\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\37\37\37\362" "\0\0\0\377\6\6\6\375\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\201\201\201\322\11\11" "\11\373:::\350\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\366\366\366\265\2\2\2\376\0\0\0\377\10\10\10\373\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\365\365\365\265\2\2" "\2\376\0\0\0\377\13\13\13\372\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\6\6\6\374\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\14\14" "\14\372fff\332\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\366\366\366\265\0\0\0\377\0" "\0\0\377\0\0\0\377\3\3\3\376@@@\347\260\260\260\305\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\352\352" "\352\267\22\22\22\367\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\6\6\6\374GGG\344\277\277\277\301\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263bbb\333\10\10\10\374YYY\336\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\310\310\310\277'''\357\34\34\34\364\377\377\377\263\377\377\377\263\377" "\377\377\263\263\263\263\304...\355\12\12\12\373\1\1\1\376\7\7\7\374\32\32" "\32\365444\353XXX\336\206\206\206\320\300\300\300\301\372\372\372\264\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\32\32\32\364\0\0\0\377\10\10\10\373\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\12\12\12\373\0\0\0\377\2\2\2\376\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\37\37\37\362\0\0\0\377\6" "\6\6\375\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\201\201\201\322\11\11\11\373:::" "\350\377\377\377\263\377\377\377\263\10\10\10\374\0\0\0\377\3\3\3\376\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\342\342\342" "\271\0\0\0\377\0\0\0\377+++\356\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\366\366\366\265\0\0\0\377\0\0\0\377JJJ\343\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\324\0\0\0\335\0\0\0\334\0\0\0" "\321\0\0\0\300\0\0\0\256\0\0\0\236\0\0\0\222\0\0\0\211\0\0\0\203\0\0\0~\0" "\0\0y\0\0\0s\0\0\0m\0\0\0f\0\0\0_\0\0\0Y\0\0\0R\0\0\0K\0\0\0E\0\0\0>\0\0" "\0""8\0\0\0""2\0\0\0,\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22" "\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\360\366\374\275\273\333\365" "\347P\247\332\377#\220\315\377!\217\314\377\40\217\314\377\40\217\314\377" "\37\216\314\377\37\216\314\377\37\216\314\377\36\216\314\377\37\216\314\377" "6\223\307\377\205\262\320\377\276\331\360\377\305\341\372\377\270\331\364" "\377w\267\340\377*\223\316\377\33\214\313\377\33\214\313\377\33\214\313\377" "\33\214\313\377\33\214\313\377\33\214\313\377\33\214\313\377\33\214\313\377" "\33\214\313\377\40\214\310\377\22{\262\377\2n\246\377\0m\245\377\0m\245\377" "\0m\245\377\1n\245\377\2n\246\377\23v\257\377Q\224\315\366\303\330\356\310" "\374\374\374\264\375\375\375\263\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\310\310\310\277BBB\346\15\15\15\372\3\3" "\3\376\22\22\22\367AAA\346\237\237\237\311\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263|||\323\6\6\6\374CCC\345\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263HHH\344\13\13\13\372}}}\323\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263aaa\334\10\10\10\374UUU\337" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263<<<\350\6" "\6\6\374\24\24\24\366\35\35\35\363(((\357777\351III\343___\334vvv\325\221" "\221\221\315\260\260\260\305\330\330\330\273\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263PPP\341\7\7\7\374XXX" "\337\334\334\334\272\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\304\304\304\300---\355\4\4\4\375\11\11\11\373\"\"\"\361OOO\341" "\222\222\222\315\353\353\353\267\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\177\177\177\322" "\12\12\12\373\220\220\220\316\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263ooo\327\6\6\6\374EEE" "\344\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263|||\323\6\6\6\374CCC\345\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263ddd\333\6\6\6\374FFF\344\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\367\367\367\264\0\0\0\377\0\0\0\377\24\24\24\367\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\3\3\3\376\0" "\0\0\377)))\356\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372" "\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206" "\321\0\0\0\326\0\0\0\336\0\0\0\335\0\0\0\322\0\0\0\301\0\0\0\260\0\0\0\237" "\0\0\0\225\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0|\0\0\0v\0\0\0p\0\0\0i\0\0" "\0c\0\0\0\\\0\0\0U\0\0\0N\0\0\0H\0\0\0A\0\0\0:\0\0\0""4\0\0\0.\0\0\0(\0\0" "\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0" "\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0" "\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321" "\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372" "\372\264\352\361\367\276\267\331\363\350T\250\332\377*\223\316\377)\222\315" "\377)\222\315\377(\221\315\377'\221\315\377&\221\315\377%\220\315\377%\220" "\315\377$\220\315\377'\217\313\377^\236\305\377\250\310\342\377\276\336\371" "\377\274\335\370\377\242\315\356\377R\245\326\377\37\215\313\377\34\214\312" "\377\33\213\312\377\33\213\312\377\32\212\312\377\31\212\312\377\30\211\312" "\377\30\211\311\377\30\212\311\377\34\211\306\377\20y\261\377\2n\246\377" "\1n\245\377\3n\246\377\6p\247\377\7q\247\377\11s\250\377\32z\261\377T\226" "\316\367\277\323\351\311\365\365\365\265\367\367\367\264\372\372\372\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\13\13\13\372\0\0\0\377\5\5\5\375\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\17\17\17\371\0\0\0\377\17\17\17\370\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\327\0" "\0\0\337\0\0\0\336\0\0\0\323\0\0\0\303\0\0\0\261\0\0\0\242\0\0\0\230\0\0" "\0\217\0\0\0\212\0\0\0\205\0\0\0\177\0\0\0y\0\0\0s\0\0\0l\0\0\0f\0\0\0_\0" "\0\0X\0\0\0Q\0\0\0J\0\0\0C\0\0\0<\0\0\0""6\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0" "\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\372\372\372\264\366\366\366\265\356\356\356\267\333" "\342\351\302\260\322\356\352]\254\335\3778\231\321\3775\227\320\3774\227" "\320\3773\227\317\3773\226\317\3772\225\316\3771\225\316\3770\225\316\377" "0\225\316\377.\224\316\377@\224\305\377\210\260\317\377\263\327\365\377\266" "\331\371\377\262\326\367\377\213\300\350\377:\231\321\377&\220\313\377%\220" "\313\377$\217\313\377#\216\313\377\"\215\312\377\40\215\312\377\37\214\312" "\377\35\213\311\377\36\211\306\377\23z\262\377\12r\250\377\12s\250\377\14" "t\251\377\17v\252\377\22x\254\377\25y\254\377%\200\265\377W\226\314\367\260" "\304\331\315\342\342\342\271\353\353\353\267\363\363\363\265\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\177" "\177\177\322\10\10\10\373NNN\341\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263:::\351\0\0\0\377\4\4\4\376\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327" "\327\274\262\262\262\305\206\206\206\321\0\0\0\327\0\0\0\340\0\0\0\337\0" "\0\0\324\0\0\0\304\0\0\0\263\0\0\0\244\0\0\0\232\0\0\0\222\0\0\0\214\0\0" "\0\207\0\0\0\202\0\0\0|\0\0\0u\0\0\0o\0\0\0i\0\0\0b\0\0\0[\0\0\0T\0\0\0L" "\0\0\0E\0\0\0>\0\0\0""7\0\0\0""2\0\0\0,\0\0\0&\0\0\0!\0\0\0\34\0\0\0\30\0" "\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0" "\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0" "\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274" "\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\366\366\366\265\353\353\353\267\332\332\332\273\301\311\316\307\245\306" "\342\353\204\275\347\376o\262\340\376f\256\336\377^\253\334\377V\247\330" "\377O\243\326\377H\240\324\377B\235\322\377?\234\321\377>\233\321\377;\232" "\320\3777\226\314\377h\236\303\377\247\314\355\377\256\325\370\377\255\325" "\370\377\245\317\364\377k\260\336\3777\227\317\3773\225\316\3774\226\316" "\3773\225\316\3772\225\315\3771\224\315\377/\223\315\377-\222\314\377)\216" "\307\377\35\200\264\377\24x\254\377\25y\255\377\27z\255\377\33|\256\377\40" "\177\261\377*\203\266\377?\214\302\377]\225\313\370\223\245\271\324\304\304" "\304\300\336\336\336\272\356\356\356\267\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\271\271\271\303\15\15\15\372GGG\344\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327" "\327\327\274\262\262\262\305\206\206\206\321\0\0\0\327\0\0\0\340\0\0\0\340" "\0\0\0\325\0\0\0\305\0\0\0\264\0\0\0\245\0\0\0\233\0\0\0\224\0\0\0\216\0" "\0\0\212\0\0\0\204\0\0\0~\0\0\0x\0\0\0r\0\0\0k\0\0\0d\0\0\0]\0\0\0V\0\0\0" "N\0\0\0G\0\0\0@\0\0\0:\0\0\0""3\0\0\0-\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0" "\0\0\25\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0" "\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\365\365\365\265\344\344\344\271\317\317\317\275\265\270\274\310\234" "\260\302\337\230\265\317\356\230\270\325\362\230\273\334\366\222\274\336" "\370\213\272\336\373\204\271\337\374\200\270\341\376z\267\342\376s\264\341" "\377j\260\337\377a\253\333\377V\246\327\377_\243\320\377\240\310\354\377" "\246\321\367\377\246\321\370\377\246\321\367\377\220\304\355\377T\244\327" "\377=\232\320\377>\232\320\377?\233\320\377>\233\320\377>\232\317\377=\232" "\317\377<\231\317\3775\223\311\377'\205\270\377\36~\260\377\37~\260\377$" "\201\263\3771\207\271\377B\216\303\377T\225\312\376d\230\312\371p\225\274" "\354\221\233\247\322\276\276\276\302\334\334\334\272\357\357\357\266\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206" "\206\206\321\0\0\0\330\0\0\0\340\0\0\0\340\0\0\0\326\0\0\0\306\0\0\0\265" "\0\0\0\250\0\0\0\235\0\0\0\226\0\0\0\220\0\0\0\213\0\0\0\206\0\0\0\200\0" "\0\0z\0\0\0t\0\0\0m\0\0\0f\0\0\0_\0\0\0X\0\0\0P\0\0\0I\0\0\0B\0\0\0;\0\0" "\0""5\0\0\0.\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0" "\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3" "\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213" "\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372" "\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\366\366\366\265\354\354" "\354\267\336\336\336\272\314\315\316\277\272\276\301\306\255\263\271\314" "\243\253\263\321\232\245\256\326\225\243\260\333\222\245\266\341\222\251" "\275\347\222\255\305\353\223\261\314\360\220\263\321\364\215\265\326\367" "\214\266\332\372\212\271\337\374\213\275\344\376\240\314\362\377\242\317" "\367\377\242\317\367\377\242\317\367\377\236\314\365\377{\271\346\377T\245" "\327\377L\241\323\377I\237\322\377E\235\321\377C\234\320\377D\234\320\377" "C\234\320\377<\226\313\3770\212\272\377,\205\265\3775\212\273\377F\221\305" "\377Z\231\317\376f\230\311\371r\227\275\357\201\227\257\340\233\245\256\320" "\274\276\300\303\327\327\327\274\352\352\352\267\365\365\365\265\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\331\0\0\0\341\0\0\0\340\0\0\0\327\0\0\0\307\0\0\0\267\0\0" "\0\251\0\0\0\236\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\210\0\0\0\202\0\0\0" "|\0\0\0u\0\0\0o\0\0\0h\0\0\0a\0\0\0Y\0\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0""6" "\0\0\0""0\0\0\0)\0\0\0%\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206" "\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\372\372\372\264\367\367\367" "\264\362\362\362\266\354\354\354\267\346\346\346\270\337\337\337\272\330" "\330\330\273\320\320\320\275\311\312\312\300\300\301\302\302\266\270\272" "\305\254\257\262\311\242\246\252\315\233\242\250\321\226\241\253\327\223" "\242\257\334\220\242\263\341\216\245\270\346\215\250\277\354\216\254\310" "\360\220\262\320\364\223\271\332\370\231\301\346\373\227\305\354\375\207" "\275\346\376\177\270\343\376x\265\341\376q\263\337\377k\260\335\377e\254" "\333\377]\250\330\377P\240\321\377I\226\306\377Q\226\311\377_\234\321\376" "j\234\316\373r\223\267\355\202\225\252\336\231\240\250\320\264\265\270\305" "\314\314\314\276\337\337\337\272\354\354\354\267\366\366\366\265\372\372" "\372\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262" "\262\305\206\206\206\321\0\0\0\331\0\0\0\341\0\0\0\341\0\0\0\327\0\0\0\310" "\0\0\0\270\0\0\0\252\0\0\0\240\0\0\0\231\0\0\0\223\0\0\0\216\0\0\0\212\0" "\0\0\204\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0[\0\0\0T\0\0\0M\0\0\0E\0" "\0\0>\0\0\0""7\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245" "\0\0\0\213\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266" "\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\374\374\374\264\372\372\372\264\367\367\367\264\366\366" "\366\265\363\363\363\265\360\360\360\266\356\356\356\267\352\352\352\267" "\346\346\346\270\340\340\340\272\333\333\333\273\324\324\324\274\315\315" "\315\276\305\305\305\300\273\273\273\302\262\262\262\305\250\252\254\311" "\242\246\252\315\234\244\252\321\226\240\251\326\220\235\250\333\214\234" "\253\340\213\237\261\345\214\245\271\352\216\252\304\360\223\264\321\364" "\224\272\332\370\221\273\336\372\216\273\340\373\205\267\337\375v\250\326" "\374q\236\313\370u\225\267\355\201\222\246\336\234\240\245\315\263\263\264" "\305\310\310\310\277\330\330\330\273\347\347\347\270\362\362\362\266\367" "\367\367\264\374\374\374\264\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\332\0" "\0\0\341\0\0\0\341\0\0\0\327\0\0\0\311\0\0\0\270\0\0\0\253\0\0\0\241\0\0" "\0\232\0\0\0\225\0\0\0\220\0\0\0\213\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0" "\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0?\0\0\0""8\0\0\0""2\0\0\0," "\0\0\0&\0\0\0!\0\0\0\34\0\0\0\30\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0" "\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0" "\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\213\206\206\206\321\262" "\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\375\375\375\263\375\375\375\263\374\374\374\264\374" "\374\374\264\372\372\372\264\367\367\367\264\366\366\366\265\363\363\363" "\265\362\362\362\266\357\357\357\266\353\353\353\267\347\347\347\270\343" "\343\343\271\337\337\337\272\332\332\332\273\323\323\323\275\315\315\315" "\276\304\304\304\300\274\274\274\302\263\264\264\305\255\257\261\310\246" "\253\256\313\237\245\252\317\226\235\245\323\217\231\242\330\215\232\246" "\335\214\235\255\342\213\240\265\347\203\233\264\347\205\226\247\334\227" "\235\244\320\253\254\256\307\302\302\302\301\322\322\322\275\340\340\340" "\272\353\353\353\267\365\365\365\265\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327" "\327\327\274\262\262\262\305\206\206\206\321\0\0\0\332\0\0\0\342\0\0\0\341" "\0\0\0\327\0\0\0\311\0\0\0\271\0\0\0\254\0\0\0\242\0\0\0\233\0\0\0\226\0" "\0\0\221\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0e\0\0\0" "]\0\0\0V\0\0\0O\0\0\0H\0\0\0A\0\0\0:\0\0\0""3\0\0\0,\0\0\0'\0\0\0\"\0\0\0" "\35\0\0\0\30\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6" "\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\375\375\375\263\374\374\374\264\374\374\374\264\372" "\372\372\264\371\371\371\264\366\366\366\265\365\365\365\265\362\362\362" "\266\360\360\360\266\354\354\354\267\352\352\352\267\344\344\344\271\340" "\340\340\272\334\334\334\272\327\327\327\274\322\322\322\275\314\314\314" "\276\303\303\303\300\274\275\275\302\265\266\267\305\257\261\262\307\250" "\253\255\312\246\251\255\312\256\260\261\306\274\274\274\302\311\311\311" "\277\332\332\332\273\346\346\346\270\357\357\357\266\366\366\366\265\374" "\374\374\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\332\0\0\0\342\0\0\0\341\0\0\0\330\0\0\0\311\0" "\0\0\272\0\0\0\255\0\0\0\243\0\0\0\234\0\0\0\227\0\0\0\222\0\0\0\215\0\0" "\0\207\0\0\0\202\0\0\0|\0\0\0u\0\0\0n\0\0\0f\0\0\0_\0\0\0W\0\0\0P\0\0\0H" "\0\0\0A\0\0\0:\0\0\0""3\0\0\0-\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\24" "\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0" "\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245" "\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266" "\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\374\374\374\264\374\374\374\264\372\372\372\264" "\371\371\371\264\367\367\367\264\366\366\366\265\363\363\363\265\360\360" "\360\266\356\356\356\267\352\352\352\267\347\347\347\270\343\343\343\271" "\337\337\337\272\332\332\332\273\324\324\324\274\321\321\321\275\316\316" "\316\276\317\317\317\275\324\324\324\274\336\336\336\272\353\353\353\267" "\363\363\363\265\371\371\371\264\374\374\374\264\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372" "\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321" "\0\0\0\332\0\0\0\342\0\0\0\341\0\0\0\330\0\0\0\312\0\0\0\272\0\0\0\255\0" "\0\0\243\0\0\0\235\0\0\0\230\0\0\0\223\0\0\0\216\0\0\0\211\0\0\0\203\0\0" "\0|\0\0\0u\0\0\0n\0\0\0g\0\0\0_\0\0\0X\0\0\0Q\0\0\0I\0\0\0B\0\0\0;\0\0\0" """4\0\0\0.\0\0\0(\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\16\0" "\0\0\14\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13" "\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\332\0\0\0\342" "\0\0\0\341\0\0\0\330\0\0\0\312\0\0\0\273\0\0\0\255\0\0\0\244\0\0\0\236\0" "\0\0\230\0\0\0\224\0\0\0\216\0\0\0\212\0\0\0\203\0\0\0}\0\0\0w\0\0\0p\0\0" "\0h\0\0\0a\0\0\0Y\0\0\0Q\0\0\0J\0\0\0C\0\0\0<\0\0\0""5\0\0\0.\0\0\0)\0\0" "\0#\0\0\0\36\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0" "\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0" "c\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274" "\262\262\262\305\206\206\206\321\0\0\0\332\0\0\0\342\0\0\0\342\0\0\0\331" "\0\0\0\312\0\0\0\273\0\0\0\256\0\0\0\244\0\0\0\236\0\0\0\231\0\0\0\224\0" "\0\0\217\0\0\0\212\0\0\0\204\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0Z\0" "\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0""5\0\0\0/\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32" "\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0c\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206" "\206\206\321\0\0\0\332\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\312\0\0\0\273" "\0\0\0\256\0\0\0\245\0\0\0\236\0\0\0\231\0\0\0\225\0\0\0\220\0\0\0\212\0" "\0\0\205\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0[\0\0\0S\0\0\0K\0\0\0D\0" "\0\0<\0\0\0""6\0\0\0/\0\0\0)\0\0\0$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0" "\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214" "\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372" "\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264" "\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333" "\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\312\0\0\0\273\0\0\0\256\0\0\0\245\0" "\0\0\236\0\0\0\232\0\0\0\226\0\0\0\221\0\0\0\213\0\0\0\205\0\0\0\177\0\0" "\0x\0\0\0q\0\0\0j\0\0\0b\0\0\0[\0\0\0T\0\0\0L\0\0\0D\0\0\0=\0\0\0""6\0\0" "\0""0\0\0\0)\0\0\0$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14" "\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0" "\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321" "\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266" "\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0" "\0\342\0\0\0\331\0\0\0\312\0\0\0\273\0\0\0\256\0\0\0\245\0\0\0\237\0\0\0" "\232\0\0\0\226\0\0\0\221\0\0\0\214\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0\0" "\0j\0\0\0c\0\0\0[\0\0\0T\0\0\0L\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0" "\0\0%\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0" "\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0" "\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274" "\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331" "\0\0\0\312\0\0\0\273\0\0\0\257\0\0\0\245\0\0\0\237\0\0\0\232\0\0\0\226\0" "\0\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0c\0\0\0" "[\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\37\0" "\0\0\33\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0" "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0" "\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\273\0\0\0\257\0\0\0\246\0\0\0\240\0\0\0\232\0\0\0\226\0\0\0\221\0\0" "\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0T\0\0" "\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\257\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\226\0\0\0\221\0\0\0\214\0\0\0" "\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0T\0\0\0M\0\0\0E\0" "\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\257\0\0\0" "\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200" "\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7" "\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\257\0\0\0\246\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s" "\0\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\257\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227" "\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0k\0\0\0d\0\0" "\0]\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0" "\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0" "\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\342\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0" "\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0" "\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227" "\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0>\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227" "\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327" "\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0" "\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227" "\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213" "\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327" "\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262" "\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0" "\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0" "\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0" "\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0" "\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0" "\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\337\337\337\272UUU\337" "UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337UUU\337\232" "\232\232\313\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\251\251\251\307UUU\337\242\242\242\311\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206" "\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0" "\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0" "\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0" "\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23" "\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0" "\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0" "\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372" "\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\337" "\337\337\272QQQ\340'''\357\0\0\0\377\0\0\0\377\3\3\3\376///\354///\354//" "/\354///\354///\354\17\17\17\371]]]\335\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263>>>\347\0\0\0\377\247\247\247" "\310\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0" "\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0" "\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0" "\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15" "\15\15\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263CCC\345]]]\335\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\371\371\371\264\12\12\12\373\7\7\7\374\365\365\365\265" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262" "\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313" "\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0" "\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0" "\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0" "\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0" "\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0" "\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357" "\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15" "\15\371\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263YYY\336ppp\327\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\256\256\256\305\0\0\0\377888\351\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305" "\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0" "\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215" "\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0" "\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0" "\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" "\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0" "\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266" "\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15\15\371" "\377\377\377\263\377\377\377\263\377\377\377\263\233\233\233\313\277\277" "\277\301\377\377\377\263\377\377\377\263\302\302\302\301\211\211\211\320" "\211\211\211\320\211\211\211\320\211\211\211\320\366\366\366\265\252\252" "\252\307OOO\341FFF\344\213\213\213\317\377\377\377\263\356\356\356\267\226" "\226\226\314___\334FFF\344FFF\344\\\\\\\335\234\234\234\312\372\372\372\264" "\377\377\377\263\377\377\377\263\315\315\315\276\211\211\211\320\211\211" "\211\320\211\211\211\320\211\211\211\320\366\366\366\265\232\232\232\313" "MMM\342NNN\341\227\227\227\313\377\377\377\263\377\377\377\263\255\255\255" "\306TTT\340III\343\210\210\210\320\374\374\374\264\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\270\270\270\303bbb\333GGG\344PPP\341\211\211\211\317\366\366\366\265\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\270\270\270\303ddd\332HHH\344EEE\344[[[\335\206\206\206\320\314\314" "\314\276\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263bbb\333\0\0\0\377{{{\323\377\377\377\263\377\377\377\263" "\377\377\377\263\270\270\270\303ddd\332HHH\344EEE\344[[[\335\206\206\206" "\320\314\314\314\276\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\270\270\270\303bbb\333GGG\344PPP\341\211\211" "\211\317\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\276\276\276\302eee\332G" "GG\344JJJ\343hhh\331\245\245\245\310\366\366\366\265\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357" "\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343" "\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0" "\0\0\234\0\0\0\227\0\0\0\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0" "\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262" "\305\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263lll\330" "\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377" "\377\263333\353ttt\326\377\377\377\263\377\377\377\263\206\206\206\320##" "#\361\0\0\0\377\0\0\0\377\0\0\0\377{{{\323\1\1\1\377\2\2\2\376\0\0\0\377" "@@@\346\377\377\377\263]]]\335\0\0\0\377<<<\347uuu\325VVV\337\4\4\4\376\0" "\0\0\377,,,\355\356\356\356\267\377\377\377\263\233\233\233\313###\361\0" "\0\0\377\0\0\0\377\0\0\0\377[[[\335\3\3\3\376\0\0\0\377\0\0\0\377\0\0\0\377" "rrr\326vvv\325\2\2\2\376\1\1\1\377\0\0\0\377\0\0\0\377XXX\336\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263SSS\340" "\0\0\0\377\12\12\12\373iii\331///\355\0\0\0\377\40\40\40\362\336\336\336" "\272\377\377\377\263\377\377\377\263\377\377\377\263kkk\330\0\0\0\377\1\1" "\1\376MMM\342sss\326QQQ\341\4\4\4\376\15\15\15\371\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263$$$\360\0\0\0\377" "\316\316\316\276\377\377\377\263\377\377\377\263kkk\330\0\0\0\377\1\1\1\376" "MMM\342sss\326QQQ\341\4\4\4\376\15\15\15\371\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263SSS\340\0\0\0\377\12\12\12\373iii\331" "///\355\0\0\0\377\40\40\40\362\336\336\336\272\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263ZZZ\336\0\0\0\377\0\0\0\377444\352rr" "r\326HHH\344\0\0\0\377$$$\360\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0" "\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\234\0\0\0\227\0\0\0" "\223\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0" "\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\6" "\6\6\375YYY\336YYY\336YYY\336\24\24\24\366ttt\326\377\377\377\263\377\377" "\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\35" "\35\35\363\307\307\307\300\366\366\366\265;;;\350@@@\346\377\377\377\263" "]]]\335666\352\377\377\377\263\377\377\377\263\377\377\377\263qqq\326\0\0" "\0\377\0\0\0\377ggg\331\377\377\377\263\377\377\377\263\350\350\350\270\0" "\0\0\377\0\0\0\377\0\0\0\377@@@\347\363\363\363\265\245\245\245\310\0\0\0" "\377\0\0\0\377\10\10\10\374---\355\352\352\352\267\314\314\314\276\1\1\1" "\376\0\0\0\377\4\4\4\376\350\350\350\270\377\377\377\263\377\377\377\263" "\377\377\377\263zzz\324\0\0\0\377\0\0\0\377nnn\327\377\377\377\263\343\343" "\343\271\1\1\1\376\0\0\0\377777\352\377\377\377\263\377\377\377\263\346\346" "\346\270\3\3\3\376\0\0\0\377EEE\345\377\377\377\263\377\377\377\263\377\377" "\377\263\201\201\201\322\15\15\15\371\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\337\337\337\272\1\1\1\377\32\32\32\365\377\377" "\377\263\377\377\377\263\346\346\346\270\3\3\3\376\0\0\0\377EEE\345\377\377" "\377\263\377\377\377\263\377\377\377\263\201\201\201\322\15\15\15\371\377" "\377\377\263\377\377\377\263\377\377\377\263zzz\324\0\0\0\377\0\0\0\377n" "nn\327\377\377\377\263\343\343\343\271\1\1\1\376\0\0\0\377777\352\377\377" "\377\263\377\377\377\263\377\377\377\263~~~\323\0\0\0\377\0\0\0\377111\354" "\377\377\377\263\377\377\377\263\377\377\377\263TTT\340\34\34\34\363\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372" "\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321\0\0" "\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0" "\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201" "\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8" "\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0" "\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0" "\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206" "\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263lll\330\0\0\0\377\0\0\0\377\3\3\3\376,,,\355,,,\355,,,\355\13" "\13\13\373ttt\326\377\377\377\263\377\377\377\263\377\377\377\263\350\350" "\350\270\0\0\0\377\0\0\0\377\0\0\0\377\200\200\200\322\377\377\377\263\377" "\377\377\263\264\264\264\304\202\202\202\321\377\377\377\263\323\323\323" "\275\327\327\327\274\377\377\377\263\377\377\377\263\377\377\377\263\267" "\267\267\303\0\0\0\377\0\0\0\377'''\360\377\377\377\263\377\377\377\263\350" "\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\273\273\273\302\377\377\377\263" "\372\372\372\264\1\1\1\376\0\0\0\377\0\0\0\377\227\227\227\314\377\377\377" "\263\377\377\377\263\26\26\26\365\0\0\0\377\0\0\0\377\261\261\261\305\377" "\377\377\263\377\377\377\263\377\377\377\263\23\23\23\367\0\0\0\377\0\0\0" "\377\244\244\244\310\377\377\377\263\377\377\377\263\30\30\30\365\0\0\0\377" "\0\0\0\377\305\305\305\300\377\377\377\263\270\270\270\303\0\0\0\377\0\0" "\0\377!!!\361\342\342\342\271\377\377\377\263\377\377\377\263\346\346\346" "\270aaa\334\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\213\213\213\317\0\0\0\377UUU\337\377\377\377\263\377\377\377\263\270\270" "\270\303\0\0\0\377\0\0\0\377!!!\361\342\342\342\271\377\377\377\263\377\377" "\377\263\346\346\346\270aaa\334\377\377\377\263\377\377\377\263\377\377\377" "\263\23\23\23\367\0\0\0\377\0\0\0\377\244\244\244\310\377\377\377\263\377" "\377\377\263\30\30\30\365\0\0\0\377\0\0\0\377\305\305\305\300\377\377\377" "\263\377\377\377\263\24\24\24\366\0\0\0\377\0\0\0\377\203\203\203\321\377" "\377\377\263\377\377\377\263\377\377\377\263\261\261\261\305\34\34\34\363" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372" "\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206\321" "\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0" "\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0" "\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0V\0\0\0N\0\0\0F\0\0\0?\0\0" "\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17" "\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0" "\13\0\0\0\35\0\0\0;\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206" "\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372\264" "\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263" "\377\377\377\263\377\377\377\263333\353ttt\326\377\377\377\263\377\377\377" "\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\311\311" "\311\277\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\354\354\354\267\227\227\227\313rrr\326i" "ii\331QQQ\340\0\0\0\377\0\0\0\377\23\23\23\367\377\377\377\263\377\377\377" "\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\346\346\346\270\377\377" "\377\263\377\377\377\263\11\11\11\373\0\0\0\377\0\0\0\377\275\275\275\302" "\377\377\377\263\377\377\377\263!!!\362\0\0\0\377\0\0\0\377\241\241\241\311" "\377\377\377\263\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0" "\0\377\270\270\270\303\377\377\377\263\377\377\377\263&&&\360\0\0\0\377\0" "\0\0\377yyy\324\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0\0" "\377\4\4\4\375444\353yyy\324\340\340\340\272\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263EEE\344\0\0\0\377\237" "\237\237\312\377\377\377\263\377\377\377\263\321\321\321\275\0\0\0\377\0" "\0\0\377\0\0\0\377\4\4\4\375444\353yyy\324\340\340\340\272\377\377\377\263" "\377\377\377\263\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0" "\0\377\270\270\270\303\377\377\377\263\377\377\377\263&&&\360\0\0\0\377\0" "\0\0\377yyy\324\377\377\377\263\321\321\321\275\0\0\0\377\0\0\0\377\0\0\0" "\377\252\252\252\307\377\377\377\263\377\377\377\263\377\377\377\263\375" "\375\375\263\366\366\366\265\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\375\375\375\263\372\372\372\264\357\357\357\266\327\327\327\274\262" "\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0" "\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0" "\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0" "\0V\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0\0d\0\0\0\213\0\0\0\245" "\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305\327\327\327\274\357" "\357\357\266\372\372\372\264\375\375\375\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15" "\15\15\371\377\377\377\263\377\377\377\263\377\377\377\263sss\326\243\243" "\243\310\377\377\377\263\377\377\377\263\377\377\377\263\350\350\350\270" "\0\0\0\377\0\0\0\377\0\0\0\377\346\346\346\270\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\237\237\237\311\13\13" "\13\372\0\0\0\377\15\15\15\372@@@\347666\352\0\0\0\377\0\0\0\377\20\20\20" "\370\377\377\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377" "\0\0\0\377\350\350\350\270\377\377\377\263\377\377\377\263\13\13\13\373\0" "\0\0\377\0\0\0\377\277\277\277\301\377\377\377\263\377\377\377\263\"\"\"" "\361\0\0\0\377\0\0\0\377\237\237\237\312\377\377\377\263\377\377\377\263" "\263\263\263\304\0\0\0\377\0\0\0\377\0\0\0\377\24\24\24\367\32\32\32\365" "\32\32\32\365\5\5\5\375\0\0\0\377\0\0\0\377XXX\337\377\377\377\263\377\377" "\377\263===\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\6\6\6\374" "\201\201\201\322\377\377\377\263\377\377\377\263\377\377\377\263\374\374" "\374\264\16\16\16\371\5\5\5\375\357\357\357\266\377\377\377\263\377\377\377" "\263\377\377\377\263===\347\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" "\377\6\6\6\374\201\201\201\322\377\377\377\263\377\377\377\263\263\263\263" "\304\0\0\0\377\0\0\0\377\0\0\0\377\24\24\24\367\32\32\32\365\32\32\32\365" "\5\5\5\375\0\0\0\377\0\0\0\377XXX\337\377\377\377\263\263\263\263\304\0\0" "\0\377\0\0\0\377\0\0\0\377\270\270\270\303\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357\357\357\266" "\327\327\327\274\262\262\262\305\206\206\206\321\0\0\0\333\0\0\0\343\0\0" "\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0" "\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0" "\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0" "\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0" "\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\35\0\0\0:\0\0" "\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206\206\206\321\262\262\262\305" "\327\327\327\274\357\357\357\266\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263lll\330\0" "\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350\270" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\363\363" "\363\265\15\15\15\372\0\0\0\377\2\2\2\376\311\311\311\277\377\377\377\263" "\277\277\277\301\0\0\0\377\0\0\0\377\20\20\20\370\377\377\377\263\377\377" "\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350\270\377" "\377\377\263\377\377\377\263\13\13\13\373\0\0\0\377\0\0\0\377\277\277\277" "\301\377\377\377\263\377\377\377\263\"\"\"\361\0\0\0\377\0\0\0\377\237\237" "\237\312\377\377\377\263\377\377\377\263\271\271\271\303\0\0\0\377\0\0\0" "\377\0\0\0\377vvv\325\237\237\237\312\237\237\237\312\237\237\237\312\237" "\237\237\312\237\237\237\312\300\300\300\301\377\377\377\263\377\377\377" "\263\367\367\367\264vvv\325\37\37\37\362\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\1\1\1\376\317\317\317\275\377\377\377\263\377\377\377\263\270\270" "\270\303\0\0\0\377444\353\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\367\367\367\264vvv\325\37\37\37\362\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\377\1\1\1\376\317\317\317\275\377\377\377\263\271\271\271" "\303\0\0\0\377\0\0\0\377\0\0\0\377vvv\325\237\237\237\312\237\237\237\312" "\237\237\237\312\237\237\237\312\237\237\237\312\300\300\300\301\377\377" "\377\263\272\272\272\302\0\0\0\377\0\0\0\377\0\0\0\377\266\266\266\304\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372" "\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206" "\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260" "\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0" "\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0" "\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0" "\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\13\0\0\0\34\0\0\0:\0\0\0d\0\0\0\213\0\0\0\245\0\0\0\245\0\0\0\214\206" "\206\206\321\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\251\251\251\307\216\216\216" "\316\371\371\371\264\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263lll\330\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0" "\0\0\377\0\0\0\377\350\350\350\270\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\271\271\271\303\0\0\0\377\0\0\0\377\32\32\32\365" "\377\377\377\263\377\377\377\263\276\276\276\302\0\0\0\377\0\0\0\377\20\20" "\20\370\377\377\377\263\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377" "\0\0\0\377\350\350\350\270\377\377\377\263\377\377\377\263\13\13\13\373\0" "\0\0\377\0\0\0\377\277\277\277\301\377\377\377\263\377\377\377\263\"\"\"" "\361\0\0\0\377\0\0\0\377\237\237\237\312\377\377\377\263\377\377\377\263" "\344\344\344\271\0\0\0\377\0\0\0\377\0\0\0\377\251\251\251\307\377\377\377" "\263\377\377\377\263\377\377\377\263\374\374\374\264\316\316\316\276\354" "\354\354\267\377\377\377\263\363\363\363\265\304\304\304\300\377\377\377" "\263\377\377\377\263\326\326\326\274rrr\326\4\4\4\376\0\0\0\377\0\0\0\377" "\216\216\216\316\377\377\377\263\377\377\377\263jjj\331\0\0\0\377uuu\325" "\377\377\377\263\377\377\377\263\377\377\377\263\363\363\363\265\304\304" "\304\300\377\377\377\263\377\377\377\263\326\326\326\274rrr\326\4\4\4\376" "\0\0\0\377\0\0\0\377\216\216\216\316\377\377\377\263\344\344\344\271\0\0" "\0\377\0\0\0\377\0\0\0\377\251\251\251\307\377\377\377\263\377\377\377\263" "\377\377\377\263\374\374\374\264\316\316\316\276\354\354\354\267\377\377" "\377\263\350\350\350\270\1\1\1\376\0\0\0\377\0\0\0\377\237\237\237\312\377" "\377\377\263\377\377\377\263\377\377\377\263\342\342\342\271\254\254\254" "\306\365\365\365\265\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372" "\372\372\264\357\357\357\266\327\327\327\274\262\262\262\305\206\206\206" "\321\0\0\0\333\0\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260" "\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0" "\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0" "\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0" "\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0" "\0\0\13\0\0\0\34\0\0\0:\0\0\0c\0\0\0\212\0\0\0\244\0\0\0\245\0\0\0\214\200" "\200\200\307\262\262\262\305\327\327\327\274\357\357\357\266\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\244\244\244\310\0\0\0\377\0\0\0\377]]]\335\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263lll\330" "\0\0\0\377\0\0\0\377\15\15\15\371\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350" "\270\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\270" "\270\270\303\0\0\0\377\0\0\0\377\17\17\17\371\375\375\375\263\377\377\377" "\263\221\221\221\315\0\0\0\377\0\0\0\377\20\20\20\370\377\377\377\263\377" "\377\377\263\350\350\350\270\0\0\0\377\0\0\0\377\0\0\0\377\350\350\350\270" "\377\377\377\263\377\377\377\263\13\13\13\373\0\0\0\377\0\0\0\377\277\277" "\277\301\377\377\377\263\377\377\377\263\"\"\"\361\0\0\0\377\0\0\0\377\237" "\237\237\312\377\377\377\263\377\377\377\263\377\377\377\263***\356\0\0\0" "\377\0\0\0\377vvv\325\377\377\377\263\377\377\377\263\377\377\377\263\264" "\264\264\304\0\0\0\377\270\270\270\303\377\377\377\263\311\311\311\277\6" "\6\6\374\360\360\360\266\377\377\377\263\377\377\377\263\377\377\377\263" ">>>\347\0\0\0\377\0\0\0\377\227\227\227\313\377\377\377\263\377\377\377\263" "***\356\0\0\0\377\307\307\307\300\377\377\377\263\377\377\377\263\377\377" "\377\263\311\311\311\277\6\6\6\374\360\360\360\266\377\377\377\263\377\377" "\377\263\377\377\377\263>>>\347\0\0\0\377\0\0\0\377\227\227\227\313\377\377" "\377\263\377\377\377\263***\356\0\0\0\377\0\0\0\377vvv\325\377\377\377\263" "\377\377\377\263\377\377\377\263\264\264\264\304\0\0\0\377\270\270\270\303" "\377\377\377\263\377\377\377\263333\353\0\0\0\377\0\0\0\377iii\331\377\377" "\377\263\377\377\377\263\377\377\377\263qqq\326\14\14\14\372\371\371\371" "\264\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264\357" "\357\357\266\327\327\327\274\262\262\262\305\200\200\200\307\0\0\0\333\0" "\0\0\343\0\0\0\342\0\0\0\331\0\0\0\313\0\0\0\274\0\0\0\260\0\0\0\247\0\0" "\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0" "z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0" """1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0" "\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\13\0\0\0\34" "\0\0\0""9\0\0\0b\0\0\0\211\0\0\0\243\0\0\0\244\0\0\0\214uuu\267\262\262\262" "\305\327\327\327\274\356\356\356\267\371\371\371\264\375\375\375\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263hhh\331\0\0\0\377\0\0\0\377(((\357\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\365\365\365\265\277\277\277\301UUU\337\0\0\0\377\0\0\0\377\13\13\13" "\372\277\277\277\301\300\300\300\301\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\346\346\346\270\260\260\260" "\305\0\0\0\377\0\0\0\377\0\0\0\377\260\260\260\305\316\316\316\276\377\377" "\377\263\377\377\377\263\377\377\377\263\357\357\357\266\10\10\10\374\0\0" "\0\377\0\0\0\377NNN\341\201\201\201\322\36\36\36\363\0\0\0\377\0\0\0\377" "\15\15\15\371\277\277\277\301\326\326\326\274\260\260\260\305\0\0\0\377\0" "\0\0\377\0\0\0\377\260\260\260\305\360\360\360\266\277\277\277\301\10\10" "\10\373\0\0\0\377\0\0\0\377\222\222\222\315\353\353\353\267\303\303\303\300" "\34\34\34\364\0\0\0\377\0\0\0\377{{{\323\326\326\326\274\377\377\377\263" "\377\377\377\263\261\261\261\305\3\3\3\376\0\0\0\377\26\26\26\365\333\333" "\333\273\377\377\377\263\346\346\346\270***\356111\354\377\377\377\263\377" "\377\377\263\311\311\311\277\0\0\0\377PPP\341\365\365\365\265\377\377\377" "\263\344\344\344\271\34\34\34\363\0\0\0\377\12\12\12\373\346\346\346\270" "\377\377\377\263\346\346\346\270\2\2\2\376\25\25\25\366\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\311\311\311\277\0\0\0\377PP" "P\341\365\365\365\265\377\377\377\263\344\344\344\271\34\34\34\363\0\0\0" "\377\12\12\12\373\346\346\346\270\377\377\377\263\377\377\377\263\261\261" "\261\305\3\3\3\376\0\0\0\377\26\26\26\365\333\333\333\273\377\377\377\263" "\346\346\346\270***\356111\354\377\377\377\263\377\377\377\263\377\377\377" "\263\300\300\300\301\7\7\7\374\0\0\0\377\22\22\22\370\324\324\324\274\377" "\377\377\263\323\323\323\275\23\23\23\367ggg\331\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\375\375\375\263\371\371\371\264\356\356\356\267" "\327\327\327\274\262\262\262\305uuu\267\0\0\0\333\0\0\0\342\0\0\0\341\0\0" "\0\331\0\0\0\312\0\0\0\273\0\0\0\260\0\0\0\247\0\0\0\240\0\0\0\233\0\0\0" "\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d" "\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0?\0\0\0""8\0\0\0""1\0\0\0+\0\0\0%\0\0\0" "\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0" "\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0\33\0\0\0""7\0\0\0_\0\0" "\0\206\0\0\0\241\0\0\0\243\0\0\0\214ccc\244\261\261\261\305\326\326\326\274" "\356\356\356\267\371\371\371\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\272\272\272\302" "\4\4\4\376\0\0\0\377uuu\325\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\311\311" "\311\277\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\2" "\2\376\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\204\204\204\321\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" "\0\377///\354\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\206\206\206\320\4\4\4\375\0\0\0\377\0\0\0\377$$$\360\227\227\227\314" "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377GGG\344\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377\0\0\0\377\266\266\266\304\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\377\237\237\237\312\13\13\13\373\0\0\0\377\0\0\0\377\0\0\0" "\377\0\0\0\377GGG\344\377\377\377\263\377\377\377\263\377\377\377\263\247" "\247\247\310\34\34\34\364\0\0\0\377\4\4\4\375\34\34\34\364\10\10\10\374>" ">>\347\346\346\346\270\377\377\377\263\377\377\377\263\330\330\330\273\32" "\32\32\364\0\0\0\377\12\12\12\373\34\34\34\364\6\6\6\375\0\0\0\377\36\36" "\36\363\256\256\256\305\377\377\377\263\377\377\377\263\222\222\222\315\0" "\0\0\377PPP\341\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\330\330\330\273\32\32\32\364\0\0\0\377\12\12\12\373\34\34\34\364\6\6" "\6\375\0\0\0\377\36\36\36\363\256\256\256\305\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\247\247\247\310\34\34\34\364\0\0\0\377" "\4\4\4\375\34\34\34\364\10\10\10\374>>>\347\346\346\346\270\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\273\273\273\302)))\357\0" "\0\0\377\4\4\4\376\33\33\33\364\7\7\7\374TTT\337\372\372\372\264\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371\264" "\356\356\356\267\326\326\326\274\261\261\261\305ccc\244\0\0\0\333\0\0\0\342" "\0\0\0\341\0\0\0\330\0\0\0\311\0\0\0\273\0\0\0\257\0\0\0\247\0\0\0\240\0" "\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s" "\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0N\0\0\0F\0\0\0>\0\0\0""8\0\0\0""1\0\0\0" "+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0" "\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\12\0\0\0\31\0\0\0""5" "\0\0\0\\\0\0\0\203\0\0\0\237\0\0\0\243\0\0\0\216HHH\220\255\255\255\306\323" "\323\323\275\354\354\354\267\371\371\371\264\375\375\375\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\322\322\322\275\273\273\273\302\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\342" "\342\342\271\252\252\252\307\303\303\303\300\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\314\314\314\276\252\252\252\307\261\261\261\305\343" "\343\343\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\347\347\347\270\272\272\272\302\247" "\247\247\310\255\255\255\306\323\323\323\275\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263KKK\342\0\0\0\377\227\227\227\313\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\347\347\347\270\272\272\272\302\247\247\247\310\255" "\255\255\306\323\323\323\275\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\314\314\314\276\252\252\252\307\261\261\261\305\343\343\343" "\271\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\330\330\330" "\273\256\256\256\305\256\256\256\305\344\344\344\271\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\371\371\371\264\354\354\354\267\323\323\323\275\255\255\255\306HHH\220" "\0\0\0\333\0\0\0\342\0\0\0\340\0\0\0\327\0\0\0\310\0\0\0\272\0\0\0\257\0" "\0\0\247\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0" "\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0" "\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17" "\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0" "\11\0\0\0\27\0\0\0""1\0\0\0W\0\0\0\177\0\0\0\234\0\0\0\243\0\0\0\221&&&\177" "\247\247\247\307\316\316\316\276\350\350\350\270\367\367\367\264\375\375" "\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263///\355\33\33\33" "\364\353\353\353\267\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\375\375\375\263\367\367\367\264\350\350\350\270\316\316\316" "\276\247\247\247\307&&&\177\0\0\0\334\0\0\0\342\0\0\0\337\0\0\0\325\0\0\0" "\307\0\0\0\271\0\0\0\256\0\0\0\246\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222" "\0\0\0\215\0\0\0\207\0\0\0\201\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U" "\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0" "\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\25\0\0\0-\0\0\0Q\0\0\0y\0\0\0\230\0\0" "\0\244\0\0\0\227\10\10\10x\235\235\235\312\305\305\305\300\343\343\343\271" "\365\365\365\265\374\374\374\264\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\374\374\374\264\365\365" "\365\265\343\343\343\271\305\305\305\300\235\235\235\312\10\10\10x\0\0\0" "\336\0\0\0\342\0\0\0\336\0\0\0\323\0\0\0\305\0\0\0\267\0\0\0\255\0\0\0\245" "\0\0\0\240\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\200\0" "\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0" "\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0" "\0\22\0\0\0(\0\0\0K\0\0\0s\0\0\0\225\0\0\0\245\0\0\0\236\0\0\0\201\206\206" "\206\272\272\272\272\302\333\333\333\273\360\360\360\266\372\372\372\264" "\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\375\375\375\263\372\372\372\264\360\360\360\266\333\333\333\273\272\272" "\272\302\206\206\206\272\0\0\0\327\0\0\0\340\0\0\0\342\0\0\0\335\0\0\0\321" "\0\0\0\303\0\0\0\266\0\0\0\254\0\0\0\245\0\0\0\240\0\0\0\233\0\0\0\227\0" "\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0d\0\0\0" "]\0\0\0U\0\0\0M\0\0\0F\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0" "\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0" "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0#\0\0\0D\0\0\0k\0\0\0" "\217\0\0\0\246\0\0\0\245\0\0\0\214III\217\255\255\255\306\321\321\321\275" "\352\352\352\267\367\367\367\264\375\375\375\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\375\375\375\263\367\367\367\264\352\352" "\352\267\321\321\321\275\255\255\255\306III\217\0\0\0\333\0\0\0\342\0\0\0" "\343\0\0\0\333\0\0\0\317\0\0\0\300\0\0\0\264\0\0\0\252\0\0\0\244\0\0\0\237" "\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0" "s\0\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""1\0\0" "\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\13" "\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\14\0\0\0\36" "\0\0\0<\0\0\0b\0\0\0\211\0\0\0\244\0\0\0\253\0\0\0\231\20\20\20}\234\234" "\234\312\304\304\304\300\342\342\342\271\362\362\362\266\372\372\372\264" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\372\372\372\264" "\362\362\362\266\342\342\342\271\304\304\304\300\234\234\234\312\20\20\20" "}\0\0\0\337\0\0\0\344\0\0\0\342\0\0\0\331\0\0\0\314\0\0\0\276\0\0\0\262\0" "\0\0\251\0\0\0\243\0\0\0\237\0\0\0\233\0\0\0\227\0\0\0\222\0\0\0\214\0\0" "\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0k\0\0\0d\0\0\0]\0\0\0U\0\0\0M\0\0\0E" "\0\0\0>\0\0\0""7\0\0\0""1\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33\0\0\0\26\0\0\0" "\23\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0" "\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\3\0\0\0\12\0\0\0\30\0\0\0""3\0\0\0X\0\0\0\200\0\0\0\240\0\0" "\0\256\0\0\0\244\0\0\0\207uuu\256\263\263\263\304\326\326\326\274\353\353" "\353\267\367\367\367\264\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375" "\375\263\367\367\367\264\353\353\353\267\326\326\326\274\263\263\263\304" "uuu\256\0\0\0\332\0\0\0\342\0\0\0\345\0\0\0\341\0\0\0\326\0\0\0\310\0\0\0" "\273\0\0\0\260\0\0\0\251\0\0\0\243\0\0\0\237\0\0\0\233\0\0\0\227\0\0\0\222" "\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\\0\0\0" "U\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\23\0\0\0+\0\0\0L\0\0\0t\0\0" "\0\227\0\0\0\256\0\0\0\254\0\0\0\227###\203\241\241\241\311\307\307\307\300" "\342\342\342\271\363\363\363\265\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263" "\372\372\372\264\363\363\363\265\342\342\342\271\307\307\307\300\241\241" "\241\311###\203\0\0\0\337\0\0\0\345\0\0\0\345\0\0\0\336\0\0\0\322\0\0\0\304" "\0\0\0\270\0\0\0\256\0\0\0\247\0\0\0\243\0\0\0\237\0\0\0\233\0\0\0\226\0" "\0\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0" "\\\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0" "\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0" "\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\17\0\0\0\"\0\0\0@\0\0" "\0f\0\0\0\214\0\0\0\251\0\0\0\261\0\0\0\244\0\0\0\205{{{\265\264\264\264" "\304\326\326\326\274\353\353\353\267\367\367\367\264\374\374\374\264\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\374\374\374" "\264\367\367\367\264\353\353\353\267\326\326\326\274\264\264\264\304{{{\265" "\0\0\0\331\0\0\0\343\0\0\0\347\0\0\0\344\0\0\0\332\0\0\0\315\0\0\0\300\0" "\0\0\265\0\0\0\254\0\0\0\247\0\0\0\242\0\0\0\237\0\0\0\232\0\0\0\226\0\0" "\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0\\" "\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0" "\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0" "\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\3\0\0\0\12\0\0\0\32\0\0\0""3\0\0" "\0W\0\0\0~\0\0\0\240\0\0\0\262\0\0\0\256\0\0\0\227\37\37\37\201\237\237\237" "\311\304\304\304\300\340\340\340\272\360\360\360\266\371\371\371\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371" "\264\360\360\360\266\340\340\340\272\304\304\304\300\237\237\237\311\37\37" "\37\201\0\0\0\337\0\0\0\346\0\0\0\347\0\0\0\341\0\0\0\326\0\0\0\311\0\0\0" "\273\0\0\0\261\0\0\0\252\0\0\0\246\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\226" "\0\0\0\221\0\0\0\214\0\0\0\206\0\0\0\200\0\0\0y\0\0\0r\0\0\0k\0\0\0c\0\0" "\0[\0\0\0T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\37" "\0\0\0\33\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0" "\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\7\0\0\0\23\0\0\0(\0" "\0\0G\0\0\0m\0\0\0\222\0\0\0\254\0\0\0\263\0\0\0\246\0\0\0\211```\234\256" "\256\256\305\317\317\317\275\346\346\346\270\363\363\363\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\363\363\363\265\346" "\346\346\270\317\317\317\275\256\256\256\305```\234\0\0\0\332\0\0\0\343\0" "\0\0\347\0\0\0\345\0\0\0\334\0\0\0\320\0\0\0\304\0\0\0\270\0\0\0\257\0\0" "\0\251\0\0\0\245\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\226\0\0\0\221\0\0\0" "\214\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0\0\0j\0\0\0c\0\0\0[\0\0\0T\0\0\0" "L\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0*\0\0\0%\0\0\0\37\0\0\0\33\0\0\0\26" "\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0" "\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4\0\0\0\15\0\0\0\35\0\0\0""7\0\0\0Z\0" "\0\0\200\0\0\0\240\0\0\0\262\0\0\0\260\0\0\0\233\6\6\6|\223\223\223\312\270" "\270\270\303\324\324\324\274\350\350\350\270\365\365\365\265\372\372\372" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375" "\263\372\372\372\264\365\365\365\265\350\350\350\270\324\324\324\274\270" "\270\270\303\223\223\223\312\6\6\6|\0\0\0\340\0\0\0\346\0\0\0\347\0\0\0\341" "\0\0\0\327\0\0\0\312\0\0\0\276\0\0\0\264\0\0\0\254\0\0\0\247\0\0\0\244\0" "\0\0\241\0\0\0\235\0\0\0\232\0\0\0\226\0\0\0\221\0\0\0\213\0\0\0\205\0\0" "\0\177\0\0\0x\0\0\0q\0\0\0j\0\0\0b\0\0\0[\0\0\0T\0\0\0L\0\0\0D\0\0\0=\0\0" "\0""6\0\0\0""0\0\0\0)\0\0\0$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17" "\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\24\0\0\0)\0\0\0G\0\0\0k\0\0\0\217\0\0\0" "\251\0\0\0\264\0\0\0\252\0\0\0\223\37\37\37\200\233\233\233\313\273\273\273" "\302\326\326\326\274\350\350\350\270\365\365\365\265\372\372\372\264\375" "\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\375\375\375\263\372\372\372\264\365\365\365\265\350" "\350\350\270\326\326\326\274\273\273\273\302\233\233\233\313\37\37\37\200" "\0\0\0\335\0\0\0\344\0\0\0\347\0\0\0\344\0\0\0\334\0\0\0\320\0\0\0\304\0" "\0\0\271\0\0\0\261\0\0\0\253\0\0\0\247\0\0\0\244\0\0\0\241\0\0\0\235\0\0" "\0\231\0\0\0\225\0\0\0\220\0\0\0\212\0\0\0\205\0\0\0~\0\0\0w\0\0\0p\0\0\0" "i\0\0\0b\0\0\0[\0\0\0S\0\0\0K\0\0\0D\0\0\0<\0\0\0""6\0\0\0/\0\0\0)\0\0\0" "$\0\0\0\37\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10" "\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\4" "\0\0\0\15\0\0\0\34\0\0\0""5\0\0\0U\0\0\0{\0\0\0\233\0\0\0\260\0\0\0\263\0" "\0\0\250\0\0\0\220888\213\235\235\235\312\275\275\275\302\327\327\327\274" "\350\350\350\270\365\365\365\265\372\372\372\264\375\375\375\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\375\375\375\263\372\372\372\264" "\365\365\365\265\350\350\350\270\327\327\327\274\275\275\275\302\235\235" "\235\312888\213\0\0\0\334\0\0\0\343\0\0\0\347\0\0\0\346\0\0\0\337\0\0\0\325" "\0\0\0\311\0\0\0\276\0\0\0\265\0\0\0\257\0\0\0\251\0\0\0\246\0\0\0\244\0" "\0\0\240\0\0\0\235\0\0\0\231\0\0\0\224\0\0\0\217\0\0\0\212\0\0\0\204\0\0" "\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0Z\0\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0" """5\0\0\0/\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0" "\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\2\0\0\0\10\0\0\0\23\0\0\0%\0\0\0A\0\0\0c\0\0\0\206\0" "\0\0\243\0\0\0\263\0\0\0\263\0\0\0\247\0\0\0\220EEE\223\237\237\237\312\275" "\275\275\302\326\326\326\274\350\350\350\270\363\363\363\265\371\371\371" "\264\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\371\371\371\264\363" "\363\363\265\350\350\350\270\326\326\326\274\275\275\275\302\237\237\237" "\312EEE\223\0\0\0\334\0\0\0\343\0\0\0\347\0\0\0\347\0\0\0\342\0\0\0\330\0" "\0\0\315\0\0\0\302\0\0\0\271\0\0\0\261\0\0\0\254\0\0\0\251\0\0\0\246\0\0" "\0\243\0\0\0\240\0\0\0\235\0\0\0\230\0\0\0\224\0\0\0\216\0\0\0\212\0\0\0" "\203\0\0\0}\0\0\0w\0\0\0p\0\0\0h\0\0\0a\0\0\0Y\0\0\0Q\0\0\0J\0\0\0C\0\0\0" "<\0\0\0""5\0\0\0.\0\0\0)\0\0\0#\0\0\0\36\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0" "\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\13\0\0\0\30\0\0\0.\0\0\0K\0" "\0\0m\0\0\0\216\0\0\0\247\0\0\0\265\0\0\0\264\0\0\0\246\0\0\0\217EEE\223" "\237\237\237\312\275\275\275\302\324\324\324\274\346\346\346\270\360\360" "\360\266\367\367\367\264\374\374\374\264\375\375\375\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\263\375\375\375\263\374\374\374\264\367\367\367\264\360\360\360\266" "\346\346\346\270\324\324\324\274\275\275\275\302\237\237\237\312EEE\223\0" "\0\0\333\0\0\0\343\0\0\0\347\0\0\0\350\0\0\0\343\0\0\0\333\0\0\0\321\0\0" "\0\306\0\0\0\274\0\0\0\264\0\0\0\256\0\0\0\253\0\0\0\250\0\0\0\245\0\0\0" "\243\0\0\0\237\0\0\0\234\0\0\0\230\0\0\0\223\0\0\0\216\0\0\0\211\0\0\0\203" "\0\0\0|\0\0\0u\0\0\0n\0\0\0g\0\0\0_\0\0\0X\0\0\0Q\0\0\0I\0\0\0B\0\0\0;\0" "\0\0""4\0\0\0.\0\0\0(\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\16" "\0\0\0\14\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\7\0\0\0\17\0\0\0\36\0\0\0""5\0\0" "\0S\0\0\0s\0\0\0\223\0\0\0\252\0\0\0\267\0\0\0\265\0\0\0\250\0\0\0\22288" "8\213\233\233\233\313\270\270\270\303\317\317\317\275\340\340\340\272\353" "\353\353\267\363\363\363\265\367\367\367\264\374\374\374\264\375\375\375" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377" "\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377" "\263\377\377\377\263\377\377\377\263\375\375\375\263\374\374\374\264\367" "\367\367\264\363\363\363\265\353\353\353\267\340\340\340\272\317\317\317" "\275\270\270\270\303\233\233\233\313888\213\0\0\0\334\0\0\0\343\0\0\0\350" "\0\0\0\350\0\0\0\344\0\0\0\335\0\0\0\323\0\0\0\310\0\0\0\277\0\0\0\266\0" "\0\0\262\0\0\0\255\0\0\0\252\0\0\0\247\0\0\0\245\0\0\0\242\0\0\0\237\0\0" "\0\233\0\0\0\227\0\0\0\222\0\0\0\215\0\0\0\207\0\0\0\202\0\0\0|\0\0\0u\0" "\0\0n\0\0\0f\0\0\0_\0\0\0W\0\0\0P\0\0\0H\0\0\0A\0\0\0:\0\0\0""3\0\0\0-\0" "\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0" "\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\2\0\0\0\4\0\0\0\10\0\0\0\22\0\0\0\"\0\0\0:\0\0\0W\0\0\0" "w\0\0\0\225\0\0\0\254\0\0\0\267\0\0\0\266\0\0\0\251\0\0\0\224\37\37\37\200" "\223\223\223\312\256\256\256\305\304\304\304\300\326\326\326\274\343\343" "\343\271\354\354\354\267\363\363\363\265\367\367\367\264\372\372\372\264" "\374\374\374\264\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\377\377\377\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263" "\375\375\375\263\375\375\375\263\375\375\375\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\377\377\377\263\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\375\375\375\263\375\375" "\375\263\375\375\375\263\375\375\375\263\375\375\375\263\374\374\374\264" "\372\372\372\264\367\367\367\264\363\363\363\265\354\354\354\267\343\343" "\343\271\326\326\326\274\304\304\304\300\256\256\256\305\223\223\223\312" "\37\37\37\200\0\0\0\334\0\0\0\343\0\0\0\350\0\0\0\350\0\0\0\345\0\0\0\336" "\0\0\0\324\0\0\0\311\0\0\0\300\0\0\0\270\0\0\0\262\0\0\0\256\0\0\0\254\0" "\0\0\250\0\0\0\246\0\0\0\244\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\226\0\0" "\0\221\0\0\0\214\0\0\0\207\0\0\0\200\0\0\0z\0\0\0s\0\0\0l\0\0\0e\0\0\0]\0" "\0\0V\0\0\0O\0\0\0H\0\0\0A\0\0\0:\0\0\0""3\0\0\0,\0\0\0'\0\0\0\"\0\0\0\35" "\0\0\0\30\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0" "\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\2\0\0\0\4\0\0\0\12\0\0\0\25\0\0\0&\0\0\0=\0\0\0Z\0\0\0z\0\0\0\225\0" "\0\0\254\0\0\0\267\0\0\0\266\0\0\0\254\0\0\0\232\6\6\6{```\234\237\237\237" "\311\264\264\264\304\307\307\307\300\326\326\326\274\342\342\342\271\353" "\353\353\267\360\360\360\266\365\365\365\265\367\367\367\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\374" "\374\374\264\374\374\374\264\374\374\374\264\374\374\374\264\374\374\374" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372" "\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\374\374\374\264\374" "\374\374\264\374\374\374\264\374\374\374\264\374\374\374\264\372\372\372" "\264\372\372\372\264\372\372\372\264\372\372\372\264\372\372\372\264\367" "\367\367\264\365\365\365\265\360\360\360\266\353\353\353\267\342\342\342" "\271\326\326\326\274\307\307\307\300\264\264\264\304\237\237\237\311```\234" "\6\6\6{\0\0\0\335\0\0\0\344\0\0\0\347\0\0\0\350\0\0\0\344\0\0\0\336\0\0\0" "\325\0\0\0\313\0\0\0\301\0\0\0\272\0\0\0\263\0\0\0\260\0\0\0\254\0\0\0\252" "\0\0\0\250\0\0\0\246\0\0\0\243\0\0\0\240\0\0\0\235\0\0\0\231\0\0\0\225\0" "\0\0\220\0\0\0\213\0\0\0\205\0\0\0\177\0\0\0y\0\0\0r\0\0\0k\0\0\0d\0\0\0" "]\0\0\0U\0\0\0M\0\0\0F\0\0\0?\0\0\0""8\0\0\0""2\0\0\0,\0\0\0&\0\0\0!\0\0" "\0\34\0\0\0\30\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\1\0\0\0\1\0\0\0\2\0\0\0\5\0\0\0\14\0\0\0\27\0\0\0'\0\0\0?\0\0\0[\0\0\0x" "\0\0\0\225\0\0\0\253\0\0\0\266\0\0\0\267\0\0\0\261\0\0\0\244\0\0\0\225\37" "\37\37\201{{{\265\241\241\241\311\263\263\263\304\304\304\304\300\321\321" "\321\275\334\334\334\272\344\344\344\271\352\352\352\267\354\354\354\267" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\360\360\360\266\360\360\360\266\360\360\360\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357" "\357\266\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\357\357\357\266\360\360" "\360\266\360\360\360\266\360\360\360\266\357\357\357\266\357\357\357\266" "\357\357\357\266\357\357\357\266\357\357\357\266\354\354\354\267\352\352" "\352\267\344\344\344\271\334\334\334\272\321\321\321\275\304\304\304\300" "\263\263\263\304\241\241\241\311{{{\265\37\37\37\201\0\0\0\332\0\0\0\340" "\0\0\0\345\0\0\0\347\0\0\0\347\0\0\0\344\0\0\0\335\0\0\0\324\0\0\0\312\0" "\0\0\302\0\0\0\272\0\0\0\264\0\0\0\260\0\0\0\255\0\0\0\253\0\0\0\251\0\0" "\0\247\0\0\0\245\0\0\0\242\0\0\0\237\0\0\0\234\0\0\0\230\0\0\0\223\0\0\0" "\216\0\0\0\212\0\0\0\204\0\0\0~\0\0\0w\0\0\0p\0\0\0i\0\0\0b\0\0\0[\0\0\0" "T\0\0\0M\0\0\0E\0\0\0>\0\0\0""7\0\0\0""0\0\0\0+\0\0\0%\0\0\0\40\0\0\0\33" "\0\0\0\27\0\0\0\23\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\5\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\2\0\0\0\6\0\0\0\15\0\0\0\30\0\0\0(\0\0\0?\0\0\0Y\0\0" "\0w\0\0\0\222\0\0\0\247\0\0\0\264\0\0\0\271\0\0\0\267\0\0\0\257\0\0\0\244" "\0\0\0\230###\203uuu\256\234\234\234\312\255\255\255\306\272\272\272\302" "\307\307\307\300\316\316\316\276\323\323\323\275\326\326\326\274\327\327" "\327\274\327\327\327\274\327\327\327\274\330\330\330\273\330\330\330\273" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327" "\327\274\327\327\327\274\327\327\327\274\327\327\327\274\327\327\327\274" "\330\330\330\273\330\330\330\273\327\327\327\274\327\327\327\274\327\327" "\327\274\326\326\326\274\323\323\323\275\316\316\316\276\307\307\307\300" "\272\272\272\302\255\255\255\306\234\234\234\312uuu\256###\203\0\0\0\331" "\0\0\0\337\0\0\0\343\0\0\0\346\0\0\0\347\0\0\0\346\0\0\0\342\0\0\0\333\0" "\0\0\323\0\0\0\311\0\0\0\301\0\0\0\272\0\0\0\264\0\0\0\260\0\0\0\255\0\0" "\0\253\0\0\0\252\0\0\0\250\0\0\0\246\0\0\0\244\0\0\0\241\0\0\0\236\0\0\0" "\232\0\0\0\226\0\0\0\222\0\0\0\215\0\0\0\210\0\0\0\202\0\0\0|\0\0\0u\0\0" "\0o\0\0\0h\0\0\0a\0\0\0Y\0\0\0R\0\0\0J\0\0\0C\0\0\0<\0\0\0""6\0\0\0""0\0" "\0\0)\0\0\0%\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\17\0\0\0\15\0\0\0" "\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\3\0\0\0\7\0\0" "\0\16\0\0\0\31\0\0\0(\0\0\0=\0\0\0W\0\0\0r\0\0\0\213\0\0\0\240\0\0\0\260" "\0\0\0\270\0\0\0\273\0\0\0\270\0\0\0\261\0\0\0\250\0\0\0\236\20\20\20}JJ" "J\217\206\206\206\272\235\235\235\312\247\247\247\307\255\255\255\306\261" "\261\261\305\262\262\262\305\262\262\262\305\263\263\263\304\263\263\263" "\304\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262" "\262\262\305\262\262\262\305\262\262\262\305\262\262\262\305\262\262\262" "\305\262\262\262\305\262\262\262\305\263\263\263\304\263\263\263\304\262" "\262\262\305\262\262\262\305\261\261\261\305\255\255\255\306\247\247\247" "\307\235\235\235\312\206\206\206\272JJJ\217\20\20\20}\0\0\0\331\0\0\0\336" "\0\0\0\342\0\0\0\346\0\0\0\347\0\0\0\347\0\0\0\344\0\0\0\337\0\0\0\330\0" "\0\0\321\0\0\0\310\0\0\0\300\0\0\0\271\0\0\0\264\0\0\0\260\0\0\0\255\0\0" "\0\253\0\0\0\252\0\0\0\250\0\0\0\247\0\0\0\245\0\0\0\242\0\0\0\237\0\0\0" "\235\0\0\0\231\0\0\0\225\0\0\0\220\0\0\0\213\0\0\0\206\0\0\0\200\0\0\0z\0" "\0\0t\0\0\0m\0\0\0f\0\0\0_\0\0\0X\0\0\0P\0\0\0I\0\0\0B\0\0\0;\0\0\0""5\0" "\0\0.\0\0\0)\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\14" "\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0" "\4\0\0\0\10\0\0\0\16\0\0\0\30\0\0\0'\0\0\0;\0\0\0R\0\0\0j\0\0\0\202\0\0\0" "\227\0\0\0\250\0\0\0\265\0\0\0\273\0\0\0\275\0\0\0\273\0\0\0\265\0\0\0\257" "\0\0\0\250\0\0\0\243\10\10\10x&&&\177HHH\220ccc\244uuu\267\200\200\200\307" "\206\206\206\320\206\206\206\320\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321" "\206\206\206\321\206\206\206\321\206\206\206\321\206\206\206\321\206\206" "\206\320\206\206\206\320\200\200\200\307uuu\267ccc\244HHH\220&&&\177\10\10" "\10x\0\0\0\327\0\0\0\333\0\0\0\337\0\0\0\342\0\0\0\345\0\0\0\347\0\0\0\347" "\0\0\0\345\0\0\0\341\0\0\0\334\0\0\0\325\0\0\0\315\0\0\0\306\0\0\0\276\0" "\0\0\270\0\0\0\263\0\0\0\260\0\0\0\255\0\0\0\253\0\0\0\252\0\0\0\250\0\0" "\0\247\0\0\0\246\0\0\0\243\0\0\0\241\0\0\0\236\0\0\0\232\0\0\0\227\0\0\0" "\223\0\0\0\216\0\0\0\212\0\0\0\204\0\0\0~\0\0\0x\0\0\0r\0\0\0k\0\0\0d\0\0" "\0]\0\0\0V\0\0\0N\0\0\0G\0\0\0@\0\0\0:\0\0\0""3\0\0\0-\0\0\0'\0\0\0\"\0\0" "\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0" "\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\5\0\0\0\10\0\0" "\0\17\0\0\0\27\0\0\0$\0\0\0""5\0\0\0J\0\0\0_\0\0\0v\0\0\0\213\0\0\0\235\0" "\0\0\253\0\0\0\265\0\0\0\273\0\0\0\275\0\0\0\274\0\0\0\272\0\0\0\270\0\0" "\0\265\0\0\0\265\0\0\0\265\0\0\0\270\0\0\0\272\0\0\0\275\0\0\0\300\0\0\0" "\303\0\0\0\306\0\0\0\310\0\0\0\313\0\0\0\315\0\0\0\317\0\0\0\320\0\0\0\322" "\0\0\0\323\0\0\0\324\0\0\0\326\0\0\0\327\0\0\0\327\0\0\0\327\0\0\0\330\0" "\0\0\331\0\0\0\331\0\0\0\332\0\0\0\332\0\0\0\332\0\0\0\332\0\0\0\332\0\0" "\0\332\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0" "\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333" "\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0" "\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0" "\0\333\0\0\0\333\0\0\0\333\0\0\0\333\0\0\0\332\0\0\0\332\0\0\0\332\0\0\0" "\332\0\0\0\333\0\0\0\333\0\0\0\334\0\0\0\336\0\0\0\340\0\0\0\342\0\0\0\344" "\0\0\0\345\0\0\0\345\0\0\0\344\0\0\0\341\0\0\0\334\0\0\0\327\0\0\0\320\0" "\0\0\311\0\0\0\302\0\0\0\274\0\0\0\266\0\0\0\262\0\0\0\260\0\0\0\255\0\0" "\0\253\0\0\0\252\0\0\0\250\0\0\0\247\0\0\0\246\0\0\0\244\0\0\0\241\0\0\0" "\237\0\0\0\234\0\0\0\230\0\0\0\225\0\0\0\221\0\0\0\214\0\0\0\207\0\0\0\202" "\0\0\0|\0\0\0u\0\0\0o\0\0\0i\0\0\0b\0\0\0[\0\0\0T\0\0\0L\0\0\0E\0\0\0>\0" "\0\0""7\0\0\0""2\0\0\0,\0\0\0&\0\0\0!\0\0\0\34\0\0\0\30\0\0\0\24\0\0\0\21" "\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\2\0\0\0\4\0\0\0\5\0\0\0\11\0\0\0\16\0\0\0\25\0\0\0!\0\0" "\0/\0\0\0A\0\0\0T\0\0\0h\0\0\0|\0\0\0\215\0\0\0\235\0\0\0\250\0\0\0\261\0" "\0\0\267\0\0\0\272\0\0\0\275\0\0\0\276\0\0\0\300\0\0\0\302\0\0\0\305\0\0" "\0\310\0\0\0\313\0\0\0\315\0\0\0\317\0\0\0\322\0\0\0\324\0\0\0\326\0\0\0" "\327\0\0\0\331\0\0\0\332\0\0\0\333\0\0\0\334\0\0\0\335\0\0\0\336\0\0\0\337" "\0\0\0\340\0\0\0\340\0\0\0\340\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0" "\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343" "\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0" "\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0\0\343\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\341\0\0\0\336\0\0\0\332\0\0\0\326" "\0\0\0\320\0\0\0\312\0\0\0\304\0\0\0\276\0\0\0\271\0\0\0\264\0\0\0\261\0" "\0\0\256\0\0\0\254\0\0\0\253\0\0\0\252\0\0\0\250\0\0\0\247\0\0\0\246\0\0" "\0\244\0\0\0\242\0\0\0\237\0\0\0\235\0\0\0\232\0\0\0\226\0\0\0\223\0\0\0" "\216\0\0\0\212\0\0\0\205\0\0\0\177\0\0\0y\0\0\0s\0\0\0l\0\0\0f\0\0\0_\0\0" "\0X\0\0\0Q\0\0\0J\0\0\0C\0\0\0<\0\0\0""6\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40" "\0\0\0\33\0\0\0\27\0\0\0\23\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0" "\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0" "\0\0\6\0\0\0\10\0\0\0\15\0\0\0\25\0\0\0\36\0\0\0(\0\0\0""7\0\0\0G\0\0\0X" "\0\0\0j\0\0\0z\0\0\0\211\0\0\0\226\0\0\0\240\0\0\0\250\0\0\0\257\0\0\0\265" "\0\0\0\272\0\0\0\276\0\0\0\303\0\0\0\307\0\0\0\311\0\0\0\314\0\0\0\316\0" "\0\0\321\0\0\0\323\0\0\0\325\0\0\0\326\0\0\0\330\0\0\0\331\0\0\0\333\0\0" "\0\333\0\0\0\334\0\0\0\335\0\0\0\336\0\0\0\337\0\0\0\340\0\0\0\340\0\0\0" "\340\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\341\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0" "\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0" "\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0" "\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342" "\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\342\0\0\0\341\0" "\0\0\341\0\0\0\340\0\0\0\337\0\0\0\336\0\0\0\335\0\0\0\333\0\0\0\331\0\0" "\0\326\0\0\0\322\0\0\0\315\0\0\0\311\0\0\0\303\0\0\0\276\0\0\0\271\0\0\0" "\265\0\0\0\262\0\0\0\256\0\0\0\255\0\0\0\254\0\0\0\252\0\0\0\251\0\0\0\250" "\0\0\0\247\0\0\0\246\0\0\0\244\0\0\0\242\0\0\0\240\0\0\0\235\0\0\0\232\0" "\0\0\230\0\0\0\223\0\0\0\220\0\0\0\214\0\0\0\207\0\0\0\201\0\0\0|\0\0\0v" "\0\0\0p\0\0\0i\0\0\0c\0\0\0\\\0\0\0U\0\0\0N\0\0\0H\0\0\0A\0\0\0:\0\0\0""4" "\0\0\0.\0\0\0(\0\0\0#\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0" "\15\0\0\0\13\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\12\0\0\0\16\0\0\0\23\0" "\0\0\32\0\0\0$\0\0\0/\0\0\0;\0\0\0I\0\0\0Y\0\0\0g\0\0\0t\0\0\0\200\0\0\0" "\213\0\0\0\224\0\0\0\235\0\0\0\244\0\0\0\253\0\0\0\260\0\0\0\264\0\0\0\271" "\0\0\0\274\0\0\0\277\0\0\0\302\0\0\0\304\0\0\0\307\0\0\0\311\0\0\0\313\0" "\0\0\315\0\0\0\317\0\0\0\320\0\0\0\321\0\0\0\322\0\0\0\323\0\0\0\324\0\0" "\0\325\0\0\0\326\0\0\0\327\0\0\0\327\0\0\0\327\0\0\0\327\0\0\0\330\0\0\0" "\330\0\0\0\330\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0" "\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0" "\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0" "\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331\0\0\0\331" "\0\0\0\331\0\0\0\330\0\0\0\330\0\0\0\327\0\0\0\325\0\0\0\323\0\0\0\321\0" "\0\0\316\0\0\0\313\0\0\0\310\0\0\0\304\0\0\0\300\0\0\0\273\0\0\0\270\0\0" "\0\264\0\0\0\261\0\0\0\257\0\0\0\254\0\0\0\253\0\0\0\252\0\0\0\250\0\0\0" "\250\0\0\0\247\0\0\0\246\0\0\0\245\0\0\0\243\0\0\0\241\0\0\0\237\0\0\0\235" "\0\0\0\232\0\0\0\230\0\0\0\225\0\0\0\221\0\0\0\215\0\0\0\210\0\0\0\203\0" "\0\0~\0\0\0y\0\0\0s\0\0\0m\0\0\0f\0\0\0_\0\0\0Y\0\0\0R\0\0\0K\0\0\0E\0\0" "\0>\0\0\0""8\0\0\0""2\0\0\0,\0\0\0'\0\0\0\"\0\0\0\35\0\0\0\31\0\0\0\25\0" "\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0" "\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0" "\7\0\0\0\12\0\0\0\15\0\0\0\21\0\0\0\27\0\0\0\37\0\0\0'\0\0\0""1\0\0\0=\0" "\0\0H\0\0\0T\0\0\0_\0\0\0i\0\0\0t\0\0\0}\0\0\0\206\0\0\0\216\0\0\0\224\0" "\0\0\232\0\0\0\237\0\0\0\243\0\0\0\247\0\0\0\252\0\0\0\256\0\0\0\261\0\0" "\0\264\0\0\0\267\0\0\0\272\0\0\0\274\0\0\0\276\0\0\0\300\0\0\0\301\0\0\0" "\303\0\0\0\304\0\0\0\305\0\0\0\306\0\0\0\307\0\0\0\307\0\0\0\311\0\0\0\311" "\0\0\0\311\0\0\0\311\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0" "\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0\0\312\0\0" "\0\312\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0" "\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0" "\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313" "\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0\0\0\313\0" "\0\0\313\0\0\0\313\0\0\0\313\0\0\0\312\0\0\0\311\0\0\0\310\0\0\0\307\0\0" "\0\304\0\0\0\302\0\0\0\277\0\0\0\275\0\0\0\272\0\0\0\267\0\0\0\264\0\0\0" "\261\0\0\0\257\0\0\0\254\0\0\0\253\0\0\0\251\0\0\0\251\0\0\0\247\0\0\0\247" "\0\0\0\246\0\0\0\246\0\0\0\244\0\0\0\244\0\0\0\242\0\0\0\241\0\0\0\237\0" "\0\0\235\0\0\0\232\0\0\0\230\0\0\0\225\0\0\0\221\0\0\0\216\0\0\0\212\0\0" "\0\205\0\0\0\200\0\0\0{\0\0\0u\0\0\0p\0\0\0i\0\0\0c\0\0\0]\0\0\0V\0\0\0O" "\0\0\0H\0\0\0B\0\0\0<\0\0\0""5\0\0\0""0\0\0\0*\0\0\0%\0\0\0\40\0\0\0\33\0" "\0\0\27\0\0\0\24\0\0\0\20\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0" "\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\4\0\0" "\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\16\0\0\0\21\0\0\0\26\0\0\0\34" "\0\0\0#\0\0\0*\0\0\0""2\0\0\0<\0\0\0E\0\0\0N\0\0\0X\0\0\0a\0\0\0i\0\0\0q" "\0\0\0w\0\0\0}\0\0\0\203\0\0\0\211\0\0\0\215\0\0\0\222\0\0\0\226\0\0\0\232" "\0\0\0\236\0\0\0\242\0\0\0\245\0\0\0\250\0\0\0\252\0\0\0\255\0\0\0\257\0" "\0\0\261\0\0\0\263\0\0\0\264\0\0\0\265\0\0\0\267\0\0\0\270\0\0\0\270\0\0" "\0\271\0\0\0\271\0\0\0\272\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0" "\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273\0\0\0\273" "\0\0\0\273\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274" "\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0" "\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0" "\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0" "\274\0\0\0\274\0\0\0\274\0\0\0\274\0\0\0\273\0\0\0\273\0\0\0\272\0\0\0\271" "\0\0\0\267\0\0\0\265\0\0\0\263\0\0\0\261\0\0\0\257\0\0\0\256\0\0\0\254\0" "\0\0\252\0\0\0\251\0\0\0\247\0\0\0\247\0\0\0\246\0\0\0\246\0\0\0\245\0\0" "\0\244\0\0\0\244\0\0\0\243\0\0\0\242\0\0\0\241\0\0\0\237\0\0\0\236\0\0\0" "\234\0\0\0\232\0\0\0\227\0\0\0\224\0\0\0\221\0\0\0\216\0\0\0\212\0\0\0\206" "\0\0\0\201\0\0\0|\0\0\0w\0\0\0r\0\0\0k\0\0\0f\0\0\0_\0\0\0X\0\0\0R\0\0\0" "L\0\0\0E\0\0\0?\0\0\0""9\0\0\0""3\0\0\0-\0\0\0(\0\0\0\"\0\0\0\36\0\0\0\32" "\0\0\0\26\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0" "\0\0\4\0\0\0\4\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0" "\0\0\4\0\0\0\5\0\0\0\6\0\0\0\10\0\0\0\12\0\0\0\14\0\0\0\17\0\0\0\23\0\0\0" "\26\0\0\0\34\0\0\0\40\0\0\0'\0\0\0-\0\0\0""5\0\0\0<\0\0\0D\0\0\0K\0\0\0S" "\0\0\0Z\0\0\0b\0\0\0h\0\0\0m\0\0\0s\0\0\0y\0\0\0~\0\0\0\203\0\0\0\207\0\0" "\0\214\0\0\0\220\0\0\0\224\0\0\0\227\0\0\0\233\0\0\0\236\0\0\0\240\0\0\0" "\242\0\0\0\244\0\0\0\245\0\0\0\250\0\0\0\251\0\0\0\252\0\0\0\253\0\0\0\254" "\0\0\0\255\0\0\0\255\0\0\0\255\0\0\0\256\0\0\0\256\0\0\0\256\0\0\0\256\0" "\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0\0\257\0\0" "\0\257\0\0\0\257\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0" "\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0" "\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260" "\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0" "\0\0\260\0\0\0\260\0\0\0\260\0\0\0\260\0\0\0\257\0\0\0\257\0\0\0\255\0\0" "\0\254\0\0\0\253\0\0\0\252\0\0\0\251\0\0\0\250\0\0\0\247\0\0\0\247\0\0\0" "\246\0\0\0\245\0\0\0\244\0\0\0\244\0\0\0\244\0\0\0\243\0\0\0\243\0\0\0\242" "\0\0\0\241\0\0\0\240\0\0\0\237\0\0\0\236\0\0\0\235\0\0\0\232\0\0\0\230\0" "\0\0\226\0\0\0\224\0\0\0\221\0\0\0\216\0\0\0\212\0\0\0\206\0\0\0\202\0\0" "\0}\0\0\0x\0\0\0s\0\0\0n\0\0\0h\0\0\0b\0\0\0[\0\0\0U\0\0\0O\0\0\0H\0\0\0" "B\0\0\0<\0\0\0""6\0\0\0""0\0\0\0+\0\0\0%\0\0\0!\0\0\0\34\0\0\0\31\0\0\0\24" "\0\0\0\22\0\0\0\17\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0" "\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0" "\0\5\0\0\0\6\0\0\0\7\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\20\0\0\0\23\0\0\0\26" "\0\0\0\34\0\0\0!\0\0\0&\0\0\0+\0\0\0""2\0\0\0""8\0\0\0>\0\0\0D\0\0\0L\0\0" "\0R\0\0\0X\0\0\0^\0\0\0c\0\0\0j\0\0\0o\0\0\0u\0\0\0z\0\0\0\177\0\0\0\204" "\0\0\0\207\0\0\0\213\0\0\0\217\0\0\0\222\0\0\0\225\0\0\0\230\0\0\0\232\0" "\0\0\233\0\0\0\235\0\0\0\236\0\0\0\240\0\0\0\241\0\0\0\242\0\0\0\243\0\0" "\0\243\0\0\0\244\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0\245\0\0\0" "\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246\0\0\0\246" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247" "\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0" "\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0" "\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0" "\247\0\0\0\247\0\0\0\247\0\0\0\247\0\0\0\246\0\0\0\245\0\0\0\245\0\0\0\244" "\0\0\0\244\0\0\0\243\0\0\0\243\0\0\0\243\0\0\0\242\0\0\0\241\0\0\0\241\0" "\0\0\241\0\0\0\241\0\0\0\241\0\0\0\240\0\0\0\237\0\0\0\237\0\0\0\236\0\0" "\0\235\0\0\0\234\0\0\0\232\0\0\0\231\0\0\0\227\0\0\0\225\0\0\0\223\0\0\0" "\220\0\0\0\215\0\0\0\212\0\0\0\206\0\0\0\202\0\0\0~\0\0\0y\0\0\0t\0\0\0o" "\0\0\0i\0\0\0d\0\0\0]\0\0\0W\0\0\0Q\0\0\0K\0\0\0E\0\0\0>\0\0\0""9\0\0\0""3" "\0\0\0.\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0" "\15\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\4\0\0\0\4\0\0\0\6\0\0" "\0\7\0\0\0\10\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\22\0\0\0\25\0\0\0\31\0\0\0" "\35\0\0\0!\0\0\0&\0\0\0,\0\0\0""1\0\0\0""7\0\0\0=\0\0\0B\0\0\0H\0\0\0N\0" "\0\0T\0\0\0Z\0\0\0`\0\0\0f\0\0\0l\0\0\0q\0\0\0w\0\0\0{\0\0\0\177\0\0\0\202" "\0\0\0\206\0\0\0\211\0\0\0\215\0\0\0\217\0\0\0\222\0\0\0\224\0\0\0\226\0" "\0\0\227\0\0\0\231\0\0\0\232\0\0\0\233\0\0\0\234\0\0\0\235\0\0\0\236\0\0" "\0\236\0\0\0\236\0\0\0\237\0\0\0\237\0\0\0\237\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240" "\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0" "\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0" "\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0" "\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\240\0\0\0\237\0\0\0\237\0\0\0\237" "\0\0\0\237\0\0\0\237\0\0\0\237\0\0\0\236\0\0\0\236\0\0\0\236\0\0\0\235\0" "\0\0\235\0\0\0\235\0\0\0\234\0\0\0\233\0\0\0\232\0\0\0\231\0\0\0\230\0\0" "\0\226\0\0\0\225\0\0\0\223\0\0\0\221\0\0\0\216\0\0\0\214\0\0\0\210\0\0\0" "\205\0\0\0\201\0\0\0}\0\0\0y\0\0\0u\0\0\0o\0\0\0j\0\0\0d\0\0\0_\0\0\0Y\0" "\0\0S\0\0\0M\0\0\0G\0\0\0A\0\0\0;\0\0\0""5\0\0\0""0\0\0\0+\0\0\0&\0\0\0!" "\0\0\0\35\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10" "\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\10\0\0\0\11" "\0\0\0\13\0\0\0\16\0\0\0\21\0\0\0\24\0\0\0\27\0\0\0\33\0\0\0\37\0\0\0#\0" "\0\0(\0\0\0-\0\0\0""2\0\0\0""7\0\0\0=\0\0\0C\0\0\0I\0\0\0O\0\0\0T\0\0\0Z" "\0\0\0_\0\0\0e\0\0\0k\0\0\0p\0\0\0u\0\0\0y\0\0\0}\0\0\0\200\0\0\0\203\0\0" "\0\207\0\0\0\212\0\0\0\214\0\0\0\216\0\0\0\221\0\0\0\222\0\0\0\223\0\0\0" "\225\0\0\0\226\0\0\0\227\0\0\0\230\0\0\0\230\0\0\0\231\0\0\0\232\0\0\0\232" "\0\0\0\232\0\0\0\232\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0" "\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0" "\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0" "\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0" "\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234" "\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\234\0\0\0\233\0" "\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0\0\233\0\0" "\0\233\0\0\0\232\0\0\0\232\0\0\0\232\0\0\0\232\0\0\0\231\0\0\0\230\0\0\0" "\230\0\0\0\227\0\0\0\226\0\0\0\225\0\0\0\223\0\0\0\222\0\0\0\221\0\0\0\216" "\0\0\0\214\0\0\0\212\0\0\0\207\0\0\0\203\0\0\0\200\0\0\0|\0\0\0x\0\0\0t\0" "\0\0o\0\0\0j\0\0\0e\0\0\0_\0\0\0Z\0\0\0T\0\0\0O\0\0\0I\0\0\0C\0\0\0=\0\0" "\0""7\0\0\0""2\0\0\0-\0\0\0(\0\0\0#\0\0\0\37\0\0\0\33\0\0\0\27\0\0\0\24\0" "\0\0\21\0\0\0\16\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0" "\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0" "\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\15\0\0\0\17\0" "\0\0\22\0\0\0\25\0\0\0\31\0\0\0\34\0\0\0\40\0\0\0%\0\0\0)\0\0\0/\0\0\0""4" "\0\0\0:\0\0\0>\0\0\0D\0\0\0J\0\0\0O\0\0\0U\0\0\0[\0\0\0`\0\0\0e\0\0\0j\0" "\0\0o\0\0\0s\0\0\0w\0\0\0{\0\0\0~\0\0\0\201\0\0\0\204\0\0\0\207\0\0\0\211" "\0\0\0\213\0\0\0\215\0\0\0\216\0\0\0\220\0\0\0\221\0\0\0\222\0\0\0\223\0" "\0\0\223\0\0\0\224\0\0\0\225\0\0\0\225\0\0\0\226\0\0\0\226\0\0\0\226\0\0" "\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0" "\226\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0" "\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227" "\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0" "\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0\0\227\0\0" "\0\227\0\0\0\227\0\0\0\227\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0" "\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\226\0\0\0\225" "\0\0\0\225\0\0\0\224\0\0\0\223\0\0\0\223\0\0\0\222\0\0\0\221\0\0\0\220\0" "\0\0\216\0\0\0\215\0\0\0\213\0\0\0\211\0\0\0\207\0\0\0\204\0\0\0\201\0\0" "\0~\0\0\0{\0\0\0w\0\0\0s\0\0\0o\0\0\0j\0\0\0e\0\0\0`\0\0\0[\0\0\0U\0\0\0" "O\0\0\0J\0\0\0D\0\0\0>\0\0\0:\0\0\0""4\0\0\0/\0\0\0)\0\0\0%\0\0\0\40\0\0" "\0\34\0\0\0\31\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0" "\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0" "\0\10\0\0\0\12\0\0\0\13\0\0\0\16\0\0\0\20\0\0\0\24\0\0\0\26\0\0\0\32\0\0" "\0\36\0\0\0\"\0\0\0'\0\0\0,\0\0\0""0\0\0\0""5\0\0\0;\0\0\0@\0\0\0E\0\0\0" "K\0\0\0P\0\0\0V\0\0\0[\0\0\0_\0\0\0d\0\0\0i\0\0\0n\0\0\0r\0\0\0u\0\0\0y\0" "\0\0|\0\0\0\177\0\0\0\202\0\0\0\204\0\0\0\206\0\0\0\210\0\0\0\212\0\0\0\213" "\0\0\0\214\0\0\0\215\0\0\0\216\0\0\0\217\0\0\0\220\0\0\0\220\0\0\0\221\0" "\0\0\221\0\0\0\221\0\0\0\221\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0" "\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0" "\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0" "\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223" "\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0" "\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\223\0\0\0\222\0\0\0\222\0\0" "\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0\222\0\0\0" "\221\0\0\0\221\0\0\0\221\0\0\0\221\0\0\0\220\0\0\0\220\0\0\0\217\0\0\0\216" "\0\0\0\215\0\0\0\214\0\0\0\213\0\0\0\212\0\0\0\210\0\0\0\206\0\0\0\204\0" "\0\0\202\0\0\0\177\0\0\0|\0\0\0y\0\0\0u\0\0\0r\0\0\0n\0\0\0i\0\0\0d\0\0\0" "_\0\0\0[\0\0\0V\0\0\0P\0\0\0K\0\0\0E\0\0\0@\0\0\0;\0\0\0""5\0\0\0""0\0\0" "\0,\0\0\0'\0\0\0\"\0\0\0\36\0\0\0\32\0\0\0\26\0\0\0\24\0\0\0\20\0\0\0\16" "\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0" "\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\15\0\0\0\17\0" "\0\0\22\0\0\0\24\0\0\0\30\0\0\0\33\0\0\0\40\0\0\0$\0\0\0(\0\0\0-\0\0\0""1" "\0\0\0""7\0\0\0<\0\0\0A\0\0\0F\0\0\0K\0\0\0P\0\0\0U\0\0\0Z\0\0\0_\0\0\0c" "\0\0\0g\0\0\0k\0\0\0p\0\0\0s\0\0\0v\0\0\0y\0\0\0|\0\0\0~\0\0\0\200\0\0\0" "\202\0\0\0\204\0\0\0\205\0\0\0\207\0\0\0\207\0\0\0\210\0\0\0\212\0\0\0\212" "\0\0\0\212\0\0\0\213\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0" "\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0" "\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215" "\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0\0\0\215\0" "\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0" "\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\214\0\0\0\213\0\0\0\212\0\0\0" "\212\0\0\0\212\0\0\0\210\0\0\0\207\0\0\0\207\0\0\0\205\0\0\0\204\0\0\0\202" "\0\0\0\200\0\0\0~\0\0\0|\0\0\0y\0\0\0v\0\0\0s\0\0\0p\0\0\0k\0\0\0g\0\0\0" "c\0\0\0_\0\0\0Z\0\0\0U\0\0\0P\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0" """1\0\0\0-\0\0\0(\0\0\0$\0\0\0\40\0\0\0\33\0\0\0\30\0\0\0\24\0\0\0\22\0\0" "\0\17\0\0\0\15\0\0\0\13\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0" "\13\0\0\0\15\0\0\0\20\0\0\0\23\0\0\0\26\0\0\0\31\0\0\0\35\0\0\0\40\0\0\0" "%\0\0\0)\0\0\0.\0\0\0""3\0\0\0""7\0\0\0<\0\0\0A\0\0\0F\0\0\0K\0\0\0O\0\0" "\0T\0\0\0Y\0\0\0]\0\0\0b\0\0\0f\0\0\0i\0\0\0m\0\0\0p\0\0\0s\0\0\0u\0\0\0" "x\0\0\0z\0\0\0|\0\0\0~\0\0\0\177\0\0\0\200\0\0\0\202\0\0\0\203\0\0\0\203" "\0\0\0\204\0\0\0\205\0\0\0\205\0\0\0\205\0\0\0\206\0\0\0\206\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0" "\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207" "\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0" "\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0\0\207\0\0" "\0\207\0\0\0\207\0\0\0\207\0\0\0\206\0\0\0\206\0\0\0\205\0\0\0\205\0\0\0" "\205\0\0\0\204\0\0\0\203\0\0\0\203\0\0\0\202\0\0\0\200\0\0\0\177\0\0\0~\0" "\0\0|\0\0\0z\0\0\0x\0\0\0u\0\0\0s\0\0\0p\0\0\0m\0\0\0i\0\0\0f\0\0\0b\0\0" "\0]\0\0\0Y\0\0\0T\0\0\0O\0\0\0K\0\0\0F\0\0\0A\0\0\0<\0\0\0""7\0\0\0""3\0" "\0\0.\0\0\0)\0\0\0%\0\0\0\40\0\0\0\35\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20" "\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0" "\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0" "\0\12\0\0\0\14\0\0\0\16\0\0\0\21\0\0\0\24\0\0\0\26\0\0\0\32\0\0\0\35\0\0" "\0\"\0\0\0%\0\0\0)\0\0\0.\0\0\0""3\0\0\0""7\0\0\0<\0\0\0A\0\0\0E\0\0\0J\0" "\0\0O\0\0\0S\0\0\0W\0\0\0[\0\0\0_\0\0\0c\0\0\0f\0\0\0i\0\0\0l\0\0\0o\0\0" "\0q\0\0\0t\0\0\0u\0\0\0w\0\0\0y\0\0\0z\0\0\0{\0\0\0|\0\0\0}\0\0\0~\0\0\0" "~\0\0\0\177\0\0\0\177\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0" "\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0" "\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0" "\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0" "\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201" "\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\201\0\0\0\200\0\0\0\200\0" "\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0\0\200\0\0" "\0\200\0\0\0\200\0\0\0\200\0\0\0\177\0\0\0\177\0\0\0~\0\0\0~\0\0\0}\0\0\0" "|\0\0\0{\0\0\0z\0\0\0y\0\0\0w\0\0\0u\0\0\0t\0\0\0q\0\0\0o\0\0\0l\0\0\0i\0" "\0\0f\0\0\0c\0\0\0_\0\0\0[\0\0\0W\0\0\0S\0\0\0O\0\0\0J\0\0\0E\0\0\0A\0\0" "\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0)\0\0\0%\0\0\0\"\0\0\0\35\0\0\0\32\0\0" "\0\26\0\0\0\24\0\0\0\21\0\0\0\16\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0" "\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\22\0" "\0\0\24\0\0\0\27\0\0\0\33\0\0\0\36\0\0\0\"\0\0\0&\0\0\0*\0\0\0.\0\0\0""3" "\0\0\0""7\0\0\0<\0\0\0@\0\0\0D\0\0\0H\0\0\0M\0\0\0Q\0\0\0U\0\0\0X\0\0\0\\" "\0\0\0_\0\0\0b\0\0\0e\0\0\0h\0\0\0j\0\0\0m\0\0\0n\0\0\0p\0\0\0r\0\0\0s\0" "\0\0t\0\0\0u\0\0\0v\0\0\0w\0\0\0w\0\0\0x\0\0\0x\0\0\0y\0\0\0y\0\0\0y\0\0" "\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0" "z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0" "\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0" "\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0z\0\0\0y\0\0\0" "y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0\0\0y\0" "\0\0x\0\0\0x\0\0\0w\0\0\0w\0\0\0v\0\0\0u\0\0\0t\0\0\0s\0\0\0r\0\0\0p\0\0" "\0n\0\0\0m\0\0\0j\0\0\0h\0\0\0e\0\0\0b\0\0\0_\0\0\0\\\0\0\0X\0\0\0U\0\0\0" "Q\0\0\0M\0\0\0H\0\0\0D\0\0\0@\0\0\0<\0\0\0""7\0\0\0""3\0\0\0.\0\0\0*\0\0" "\0&\0\0\0\"\0\0\0\36\0\0\0\33\0\0\0\27\0\0\0\24\0\0\0\22\0\0\0\17\0\0\0\15" "\0\0\0\13\0\0\0\11\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0" "\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0" "\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\22\0\0\0\25\0\0\0\30\0\0\0" "\33\0\0\0\37\0\0\0\"\0\0\0&\0\0\0*\0\0\0.\0\0\0""2\0\0\0""6\0\0\0:\0\0\0" ">\0\0\0C\0\0\0G\0\0\0J\0\0\0O\0\0\0R\0\0\0V\0\0\0X\0\0\0\\\0\0\0_\0\0\0a" "\0\0\0d\0\0\0f\0\0\0g\0\0\0i\0\0\0k\0\0\0l\0\0\0m\0\0\0n\0\0\0o\0\0\0p\0" "\0\0p\0\0\0q\0\0\0q\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0" "\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0" "s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0" "\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0" "\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0s\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0" "r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0r\0\0\0q\0\0\0q\0\0\0p\0\0\0p\0" "\0\0o\0\0\0n\0\0\0m\0\0\0l\0\0\0k\0\0\0i\0\0\0g\0\0\0f\0\0\0d\0\0\0a\0\0" "\0_\0\0\0\\\0\0\0X\0\0\0V\0\0\0R\0\0\0O\0\0\0J\0\0\0G\0\0\0C\0\0\0>\0\0\0" ":\0\0\0""6\0\0\0""2\0\0\0.\0\0\0*\0\0\0&\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0" "\30\0\0\0\25\0\0\0\22\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0" "\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\12\0\0" "\0\14\0\0\0\16\0\0\0\20\0\0\0\23\0\0\0\25\0\0\0\31\0\0\0\33\0\0\0\37\0\0" "\0\"\0\0\0&\0\0\0)\0\0\0.\0\0\0""1\0\0\0""5\0\0\0:\0\0\0=\0\0\0A\0\0\0E\0" "\0\0H\0\0\0L\0\0\0O\0\0\0R\0\0\0U\0\0\0X\0\0\0Z\0\0\0]\0\0\0_\0\0\0`\0\0" "\0b\0\0\0d\0\0\0e\0\0\0f\0\0\0g\0\0\0h\0\0\0i\0\0\0i\0\0\0j\0\0\0j\0\0\0" "k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0" "\0\0k\0\0\0k\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0" "\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0" "l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0\0\0l\0" "\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0\0k\0\0" "\0k\0\0\0k\0\0\0k\0\0\0j\0\0\0j\0\0\0i\0\0\0i\0\0\0h\0\0\0g\0\0\0f\0\0\0" "e\0\0\0d\0\0\0b\0\0\0`\0\0\0_\0\0\0]\0\0\0Z\0\0\0X\0\0\0U\0\0\0R\0\0\0O\0" "\0\0L\0\0\0H\0\0\0E\0\0\0A\0\0\0=\0\0\0:\0\0\0""5\0\0\0""1\0\0\0.\0\0\0)" "\0\0\0&\0\0\0\"\0\0\0\37\0\0\0\33\0\0\0\31\0\0\0\25\0\0\0\23\0\0\0\20\0\0" "\0\16\0\0\0\14\0\0\0\12\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3" "\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\13\0\0\0\14\0\0\0\16\0\0" "\0\20\0\0\0\23\0\0\0\26\0\0\0\31\0\0\0\33\0\0\0\37\0\0\0\"\0\0\0%\0\0\0)" "\0\0\0,\0\0\0""0\0\0\0""4\0\0\0""7\0\0\0;\0\0\0>\0\0\0B\0\0\0E\0\0\0H\0\0" "\0K\0\0\0N\0\0\0Q\0\0\0S\0\0\0U\0\0\0W\0\0\0Y\0\0\0[\0\0\0\\\0\0\0]\0\0\0" "^\0\0\0_\0\0\0`\0\0\0a\0\0\0b\0\0\0b\0\0\0b\0\0\0c\0\0\0c\0\0\0c\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0" "d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0" "\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0" "\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0d\0\0\0c\0\0\0c\0\0\0c\0\0\0" "b\0\0\0b\0\0\0b\0\0\0a\0\0\0`\0\0\0_\0\0\0^\0\0\0]\0\0\0\\\0\0\0[\0\0\0Y" "\0\0\0W\0\0\0U\0\0\0S\0\0\0Q\0\0\0N\0\0\0K\0\0\0H\0\0\0E\0\0\0B\0\0\0>\0" "\0\0;\0\0\0""7\0\0\0""4\0\0\0""0\0\0\0,\0\0\0)\0\0\0%\0\0\0\"\0\0\0\37\0" "\0\0\33\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\20\0\0\0\16\0\0\0\14\0\0\0\13\0" "\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0" "\0\0\5\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0\0\21\0\0" "\0\23\0\0\0\26\0\0\0\31\0\0\0\33\0\0\0\36\0\0\0\"\0\0\0%\0\0\0(\0\0\0,\0" "\0\0.\0\0\0""2\0\0\0""5\0\0\0""9\0\0\0<\0\0\0>\0\0\0B\0\0\0E\0\0\0G\0\0\0" "J\0\0\0L\0\0\0N\0\0\0P\0\0\0Q\0\0\0S\0\0\0T\0\0\0V\0\0\0W\0\0\0X\0\0\0X\0" "\0\0Y\0\0\0Z\0\0\0[\0\0\0[\0\0\0[\0\0\0[\0\0\0[\0\0\0\\\0\0\0\\\0\0\0\\\0" "\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0" "\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0" "]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0" "\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0]\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\" "\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0\\\0\0\0[\0\0\0[\0\0\0[\0\0" "\0[\0\0\0[\0\0\0Z\0\0\0Y\0\0\0X\0\0\0X\0\0\0W\0\0\0V\0\0\0T\0\0\0S\0\0\0" "Q\0\0\0P\0\0\0N\0\0\0L\0\0\0J\0\0\0G\0\0\0E\0\0\0B\0\0\0>\0\0\0<\0\0\0""9" "\0\0\0""5\0\0\0""2\0\0\0.\0\0\0,\0\0\0(\0\0\0%\0\0\0\"\0\0\0\36\0\0\0\33" "\0\0\0\31\0\0\0\26\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11" "\0\0\0\10\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\4" "\0\0\0\4\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\17\0\0" "\0\21\0\0\0\23\0\0\0\25\0\0\0\30\0\0\0\33\0\0\0\35\0\0\0\40\0\0\0$\0\0\0" "'\0\0\0)\0\0\0-\0\0\0""0\0\0\0""3\0\0\0""6\0\0\0""9\0\0\0<\0\0\0>\0\0\0A" "\0\0\0C\0\0\0E\0\0\0G\0\0\0I\0\0\0J\0\0\0M\0\0\0N\0\0\0O\0\0\0P\0\0\0Q\0" "\0\0Q\0\0\0R\0\0\0S\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0\0\0U\0\0\0U\0\0" "\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0" "V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0" "\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0" "\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0V\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0" "U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0U\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0\0\0T\0" "\0\0S\0\0\0R\0\0\0Q\0\0\0Q\0\0\0P\0\0\0O\0\0\0N\0\0\0M\0\0\0J\0\0\0I\0\0" "\0G\0\0\0E\0\0\0C\0\0\0A\0\0\0>\0\0\0<\0\0\0""9\0\0\0""6\0\0\0""3\0\0\0""0" "\0\0\0-\0\0\0)\0\0\0'\0\0\0$\0\0\0\40\0\0\0\35\0\0\0\33\0\0\0\30\0\0\0\25" "\0\0\0\23\0\0\0\21\0\0\0\17\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0" "\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0" "\0\0\4\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\16\0\0\0" "\20\0\0\0\22\0\0\0\25\0\0\0\27\0\0\0\32\0\0\0\35\0\0\0\40\0\0\0\"\0\0\0%" "\0\0\0(\0\0\0+\0\0\0.\0\0\0""0\0\0\0""3\0\0\0""5\0\0\0""7\0\0\0:\0\0\0<\0" "\0\0>\0\0\0@\0\0\0B\0\0\0C\0\0\0E\0\0\0F\0\0\0H\0\0\0H\0\0\0I\0\0\0J\0\0" "\0J\0\0\0K\0\0\0L\0\0\0L\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0" "M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0" "\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0" "\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0N\0\0\0" "N\0\0\0N\0\0\0N\0\0\0N\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0" "\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0M\0\0\0L\0\0\0L\0\0\0K\0\0" "\0J\0\0\0J\0\0\0I\0\0\0H\0\0\0H\0\0\0F\0\0\0E\0\0\0C\0\0\0B\0\0\0@\0\0\0" ">\0\0\0<\0\0\0:\0\0\0""7\0\0\0""5\0\0\0""3\0\0\0""0\0\0\0.\0\0\0+\0\0\0(" "\0\0\0%\0\0\0\"\0\0\0\40\0\0\0\35\0\0\0\32\0\0\0\27\0\0\0\25\0\0\0\22\0\0" "\0\20\0\0\0\16\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0" "\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0" "\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\15\0\0\0\16\0" "\0\0\20\0\0\0\22\0\0\0\24\0\0\0\26\0\0\0\31\0\0\0\33\0\0\0\36\0\0\0\40\0" "\0\0#\0\0\0%\0\0\0(\0\0\0+\0\0\0-\0\0\0/\0\0\0""2\0\0\0""4\0\0\0""5\0\0\0" """7\0\0\0:\0\0\0;\0\0\0<\0\0\0>\0\0\0?\0\0\0@\0\0\0A\0\0\0B\0\0\0C\0\0\0" "C\0\0\0C\0\0\0D\0\0\0D\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0" "\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0" "\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0" "F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0\0\0F\0" "\0\0F\0\0\0F\0\0\0F\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0" "\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0E\0\0\0D\0\0\0D\0\0\0C\0\0\0" "C\0\0\0C\0\0\0B\0\0\0A\0\0\0@\0\0\0?\0\0\0>\0\0\0<\0\0\0;\0\0\0:\0\0\0""7" "\0\0\0""5\0\0\0""4\0\0\0""2\0\0\0/\0\0\0-\0\0\0+\0\0\0(\0\0\0%\0\0\0#\0\0" "\0\40\0\0\0\36\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\20\0\0" "\0\16\0\0\0\15\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\3" "\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\14\0\0" "\0\16\0\0\0\17\0\0\0\22\0\0\0\24\0\0\0\26\0\0\0\30\0\0\0\32\0\0\0\34\0\0" "\0\37\0\0\0!\0\0\0#\0\0\0%\0\0\0'\0\0\0)\0\0\0,\0\0\0.\0\0\0""0\0\0\0""1" "\0\0\0""3\0\0\0""5\0\0\0""6\0\0\0""7\0\0\0""8\0\0\0:\0\0\0:\0\0\0;\0\0\0" "<\0\0\0<\0\0\0<\0\0\0=\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0" "\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0" "\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0" "?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0?\0" "\0\0?\0\0\0?\0\0\0?\0\0\0?\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0" "\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0>\0\0\0=\0\0\0" "<\0\0\0<\0\0\0<\0\0\0;\0\0\0:\0\0\0:\0\0\0""8\0\0\0""7\0\0\0""6\0\0\0""5" "\0\0\0""3\0\0\0""1\0\0\0""0\0\0\0.\0\0\0,\0\0\0)\0\0\0'\0\0\0%\0\0\0#\0\0" "\0!\0\0\0\37\0\0\0\34\0\0\0\32\0\0\0\30\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0" "\17\0\0\0\16\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5" "\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\10\0\0\0\11" "\0\0\0\13\0\0\0\14\0\0\0\15\0\0\0\17\0\0\0\21\0\0\0\22\0\0\0\24\0\0\0\26" "\0\0\0\31\0\0\0\33\0\0\0\35\0\0\0\37\0\0\0\40\0\0\0\"\0\0\0%\0\0\0'\0\0\0" "(\0\0\0*\0\0\0,\0\0\0-\0\0\0.\0\0\0""0\0\0\0""0\0\0\0""2\0\0\0""3\0\0\0""3" "\0\0\0""4\0\0\0""5\0\0\0""5\0\0\0""6\0\0\0""6\0\0\0""7\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8" "\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""8\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7" "\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""7\0\0\0""6\0\0\0""6\0\0\0""5" "\0\0\0""5\0\0\0""4\0\0\0""3\0\0\0""3\0\0\0""2\0\0\0""0\0\0\0""0\0\0\0.\0" "\0\0-\0\0\0,\0\0\0*\0\0\0(\0\0\0'\0\0\0%\0\0\0\"\0\0\0\40\0\0\0\37\0\0\0" "\35\0\0\0\33\0\0\0\31\0\0\0\26\0\0\0\24\0\0\0\22\0\0\0\21\0\0\0\17\0\0\0" "\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0" "\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\6\0\0\0\6\0\0\0\10\0" "\0\0\10\0\0\0\12\0\0\0\13\0\0\0\15\0\0\0\16\0\0\0\17\0\0\0\22\0\0\0\23\0" "\0\0\25\0\0\0\26\0\0\0\31\0\0\0\32\0\0\0\34\0\0\0\35\0\0\0\40\0\0\0!\0\0" "\0#\0\0\0%\0\0\0&\0\0\0'\0\0\0(\0\0\0)\0\0\0*\0\0\0,\0\0\0,\0\0\0-\0\0\0" ".\0\0\0.\0\0\0.\0\0\0/\0\0\0/\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1" "\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""1\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0""0" "\0\0\0""0\0\0\0""0\0\0\0""0\0\0\0/\0\0\0/\0\0\0.\0\0\0.\0\0\0.\0\0\0-\0\0" "\0,\0\0\0,\0\0\0*\0\0\0)\0\0\0(\0\0\0'\0\0\0&\0\0\0%\0\0\0#\0\0\0!\0\0\0" "\40\0\0\0\35\0\0\0\34\0\0\0\32\0\0\0\31\0\0\0\26\0\0\0\25\0\0\0\23\0\0\0" "\22\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\13\0\0\0\12\0\0\0\10\0\0\0\10\0\0\0" "\6\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0" "\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0\13\0\0" "\0\14\0\0\0\15\0\0\0\17\0\0\0\20\0\0\0\22\0\0\0\24\0\0\0\25\0\0\0\26\0\0" "\0\30\0\0\0\31\0\0\0\33\0\0\0\35\0\0\0\36\0\0\0\40\0\0\0\40\0\0\0\"\0\0\0" "#\0\0\0$\0\0\0%\0\0\0%\0\0\0'\0\0\0'\0\0\0'\0\0\0(\0\0\0)\0\0\0)\0\0\0)\0" "\0\0)\0\0\0)\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0" "\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0" "+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0" "\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0\0+\0\0" "\0+\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0*\0\0\0" "*\0\0\0*\0\0\0*\0\0\0*\0\0\0)\0\0\0)\0\0\0)\0\0\0)\0\0\0)\0\0\0(\0\0\0'\0" "\0\0'\0\0\0'\0\0\0%\0\0\0%\0\0\0$\0\0\0#\0\0\0\"\0\0\0\40\0\0\0\40\0\0\0" "\36\0\0\0\35\0\0\0\33\0\0\0\31\0\0\0\30\0\0\0\26\0\0\0\25\0\0\0\24\0\0\0" "\22\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0" "\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\7\0\0\0" "\10\0\0\0\10\0\0\0\12\0\0\0\13\0\0\0\15\0\0\0\15\0\0\0\17\0\0\0\20\0\0\0" "\22\0\0\0\23\0\0\0\24\0\0\0\26\0\0\0\27\0\0\0\31\0\0\0\32\0\0\0\33\0\0\0" "\34\0\0\0\35\0\0\0\36\0\0\0\37\0\0\0\40\0\0\0\40\0\0\0!\0\0\0\"\0\0\0\"\0" "\0\0\"\0\0\0#\0\0\0#\0\0\0$\0\0\0$\0\0\0$\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0" "\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0" "\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0" "%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0%\0\0\0$\0\0\0$\0\0\0$\0" "\0\0#\0\0\0#\0\0\0\"\0\0\0\"\0\0\0\"\0\0\0!\0\0\0\40\0\0\0\40\0\0\0\37\0" "\0\0\36\0\0\0\35\0\0\0\34\0\0\0\33\0\0\0\32\0\0\0\31\0\0\0\27\0\0\0\26\0" "\0\0\24\0\0\0\23\0\0\0\22\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\15\0\0\0\13\0" "\0\0\12\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\3" "\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3" "\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\11\0\0\0" "\13\0\0\0\13\0\0\0\15\0\0\0\15\0\0\0\17\0\0\0\20\0\0\0\22\0\0\0\22\0\0\0" "\24\0\0\0\24\0\0\0\26\0\0\0\27\0\0\0\30\0\0\0\31\0\0\0\32\0\0\0\33\0\0\0" "\33\0\0\0\34\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0\36\0\0\0\36\0\0\0\37\0\0\0" "\37\0\0\0\37\0\0\0\37\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0" "\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\40\0\0\0\37\0\0\0" "\37\0\0\0\37\0\0\0\37\0\0\0\36\0\0\0\36\0\0\0\35\0\0\0\35\0\0\0\35\0\0\0" "\34\0\0\0\33\0\0\0\33\0\0\0\32\0\0\0\31\0\0\0\30\0\0\0\27\0\0\0\26\0\0\0" "\24\0\0\0\24\0\0\0\22\0\0\0\22\0\0\0\20\0\0\0\17\0\0\0\15\0\0\0\15\0\0\0" "\13\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0" "\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0" "\0\0\6\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\15\0\0" "\0\16\0\0\0\17\0\0\0\20\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\24\0\0\0\25\0\0" "\0\26\0\0\0\26\0\0\0\27\0\0\0\27\0\0\0\30\0\0\0\31\0\0\0\31\0\0\0\31\0\0" "\0\31\0\0\0\32\0\0\0\32\0\0\0\32\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0\0\33\0\0" "\0\33\0\0\0\33\0\0\0\32\0\0\0\32\0\0\0\32\0\0\0\31\0\0\0\31\0\0\0\31\0\0" "\0\31\0\0\0\30\0\0\0\27\0\0\0\27\0\0\0\26\0\0\0\26\0\0\0\25\0\0\0\24\0\0" "\0\23\0\0\0\22\0\0\0\22\0\0\0\20\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\14\0\0" "\0\13\0\0\0\13\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4" "\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1" "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" "\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4" "\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0" "\12\0\0\0\13\0\0\0\14\0\0\0\15\0\0\0\15\0\0\0\16\0\0\0\17\0\0\0\20\0\0\0" "\21\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0" "\25\0\0\0\25\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0" "\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\27\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0\26\0\0\0" "\25\0\0\0\25\0\0\0\24\0\0\0\24\0\0\0\24\0\0\0\23\0\0\0\22\0\0\0\22\0\0\0" "\22\0\0\0\21\0\0\0\20\0\0\0\17\0\0\0\16\0\0\0\15\0\0\0\15\0\0\0\14\0\0\0" "\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0" "\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0" "\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\7\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0\12\0\0\0\13\0\0\0\13\0\0\0\14\0\0" "\0\15\0\0\0\15\0\0\0\16\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\20\0\0\0\20\0\0" "\0\21\0\0\0\21\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0" "\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\23\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0\0\22\0\0" "\0\22\0\0\0\22\0\0\0\21\0\0\0\21\0\0\0\20\0\0\0\20\0\0\0\17\0\0\0\17\0\0" "\0\17\0\0\0\16\0\0\0\15\0\0\0\15\0\0\0\14\0\0\0\13\0\0\0\13\0\0\0\12\0\0" "\0\11\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0" "\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0" "\0\0\5\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0" "\12\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\14\0\0\0\15\0\0\0\15\0\0\0" "\15\0\0\0\15\0\0\0\16\0\0\0\16\0\0\0\16\0\0\0\16\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0\17\0\0\0" "\16\0\0\0\16\0\0\0\16\0\0\0\16\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0" "\14\0\0\0\14\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0" "\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0" "\0\4\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0" "\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0" "\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0" "\0\10\0\0\0\10\0\0\0\10\0\0\0\11\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\13\0\0" "\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0" "\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\15\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0\0\14\0\0" "\0\14\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\12\0\0" "\0\12\0\0\0\12\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0" "\6\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0" "\3\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0" "\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0" "\6\0\0\0\6\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\11" "\0\0\0\11\0\0\0\11\0\0\0\11\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13" "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12\0\0\0\12" "\0\0\0\12\0\0\0\11\0\0\0\11\0\0\0\11\0\0\0\11\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\5\0\0\0" "\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0" "\2\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0\0\0" "\5\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\7\0\0\0\7\0\0\0\7\0\0\0" "\7\0\0\0\7\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10" "\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\7\0" "\0\0\7\0\0\0\7\0\0\0\7\0\0\0\7\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0\0\0\6\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0" "\0\0\5\0\0\0\5\0\0\0\5\0\0\0\5\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0\0\0\4\0" "\0\0\4\0\0\0\4\0\0\0\4\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0\3\0" "\0\0\3\0\0\0\3\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0\0\0\2\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\0" "\0\0\1\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" }; ./plugins/bench/src/bench.h0000644000004100000410000000566213246301623016033 0ustar www-datawww-data/** * * Compiz benchmark plugin * * bench.c * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * New frame rate measurement algorithm: * Copyright (c) 2011 Daniel van Vugt * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include "bench_tex.h" #include "bench_options.h" #define TIMEVALDIFFU(tv1, tv2) \ (((tv1)->tv_sec == (tv2)->tv_sec || (tv1)->tv_usec >= (tv2)->tv_usec) ? \ ((((tv1)->tv_sec - (tv2)->tv_sec) * 1000000) + \ ((tv1)->tv_usec - (tv2)->tv_usec)): \ ((((tv1)->tv_sec - 1 - (tv2)->tv_sec) * 1000000) + \ (1000000 + (tv1)->tv_usec - (tv2)->tv_usec))) #ifdef GL_DEBUG static GLenum gl_error; #define GLERR gl_error=glGetError(); if (gl_error != GL_NO_ERROR) { fprintf (stderr,"GL error 0x%X has occured at %s:%d\n",gl_error,__FILE__,__LINE__); } #else #define GLERR #endif class BenchScreen : public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public BenchOptions { public: BenchScreen (CompScreen *screen); ~BenchScreen (); CompositeScreen *cScreen; GLScreen *gScreen; GLuint mDList; float mAlpha; enum { MAX_FPS = 500, FADE_FPS = 50, SECONDS_PER_AVERAGE = 2, MAX_SAMPLES = MAX_FPS * SECONDS_PER_AVERAGE, MIN_MS_PER_UPDATE = 1000 }; bool mFakedDamage; CompRect mRect; CompTimer mTimer; int mSample[MAX_SAMPLES]; int mFrames; int mLastPrintFrames; struct timeval mLastPrint; struct timeval mLastRedraw; GLuint mNumTex[10]; GLuint mBackTex; bool mActive; CompositeFPSLimiterMode mOldLimiterMode; void damageSelf (); bool timedOut (); float averageFramerate () const; void postLoad (); template void serialize (Archive & ar, const unsigned int count) { ar & mActive; } bool initiate (CompOption::Vector &options); void limiterModeChanged (CompOption *opt); void preparePaint (int msSinceLastPaint); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); }; class BenchPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/bench/src/bench.cpp0000644000004100000410000002705513246301623016366 0ustar www-datawww-data/** * * Compiz benchmark plugin * * bench.cpp * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * New frame rate measurement algorithm: * Copyright (c) 2011 Daniel van Vugt * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "bench.h" using namespace compiz::core; COMPIZ_PLUGIN_20090315 (bench, BenchPluginVTable) static const unsigned int TEX_WIDTH = 512; static const unsigned short TEX_HEIGHT = 256; void BenchScreen::preparePaint (int msSinceLastPaint) { struct timeval now; gettimeofday (&now, 0); int timediff = TIMEVALDIFFU (&now, &mLastRedraw); mSample[mFrames % MAX_SAMPLES] = timediff; timediff /= 1000; mFrames++; mLastRedraw = now; if (optionGetOutputConsole () && mActive) { int dTime = timer::timeval_diff (&now, &mLastPrint); if (dTime > optionGetConsoleUpdateTime () * 1000) { int dFrames = mFrames - mLastPrintFrames; mLastPrintFrames = mFrames; g_print ("[BENCH] : %d frames in %d.%01d seconds = %d.%03d FPS\n", dFrames, dTime / 1000, (dTime % 1000) / 100, dFrames * 1000 / dTime, ((dFrames * 1000) % dTime) / 10); mLastPrint = now; } } if (mActive) { mAlpha += timediff / 1000.0; if (mAlpha >= 1.0f) { mAlpha = 1.0f; /* * If we're only creating "fake" damage to update the benchmark * and no other damage is pending, then do it progressively * less often so the framerate can steadily decrease toward zero. */ if (mFakedDamage) mTimer.setTimes (mTimer.minTime () * 2); else { /* * Piggyback on damage events other than our own, so the * benchmark updates at least as often as the rest * of the screen. */ damageSelf (); if (mTimer.minTime () != MIN_MS_PER_UPDATE) mTimer.setTimes (MIN_MS_PER_UPDATE); } } } else { if (mAlpha <= 0.0) { cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); mTimer.stop (); } mAlpha -= timediff / 1000.0; if (mAlpha < 0.0f) mAlpha = 0.0f; } mFakedDamage = false; cScreen->preparePaint (msSinceLastPaint); } float BenchScreen::averageFramerate () const /* * Returns the average frame rate of the last SECONDS_PER_AVERAGE seconds. * This calculation is accurate no matter how often/seldom the screen * gets painted. No timers required. Calculus rocks :) */ { const int usPerAverage = SECONDS_PER_AVERAGE * 1000000; int i = (mFrames + MAX_SAMPLES - 1) % MAX_SAMPLES; int lastSample = 0; int timeSum = 0; int count = 0; int maxCount = MIN (MAX_SAMPLES, mFrames); while (timeSum < usPerAverage && count < maxCount) { lastSample = mSample[i]; timeSum += lastSample; i = (i + MAX_SAMPLES - 1) % MAX_SAMPLES; count++; } float fps = 0.0f; if (timeSum < usPerAverage) { if (timeSum > 0) fps = (float)(count * 1000000) / timeSum; } else { fps = (float)(count - 1); if (lastSample > 0) fps += (float)(usPerAverage - (timeSum - lastSample)) / lastSample; fps /= SECONDS_PER_AVERAGE; } return fps; } bool BenchScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; bool isSet; unsigned int fps; GLMatrix sTransform (transform); status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); if (mAlpha <= 0.0 || !optionGetOutputScreen ()) return status; glGetError(); glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT); GLERR; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (sTransform.getMatrix ()); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f (1.0, 1.0, 1.0, mAlpha); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); mRect.setX (optionGetPositionX ()); mRect.setY (optionGetPositionY ()); glTranslatef (mRect.x (), mRect.y (), 0); glEnable (GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, mBackTex); glBegin (GL_QUADS); glTexCoord2f (0, 0); glVertex2f (0, 0); glTexCoord2f (0, 1); glVertex2f (0, TEX_HEIGHT); glTexCoord2f (1, 1); glVertex2f (TEX_WIDTH, TEX_HEIGHT); glTexCoord2f (1, 0); glVertex2f (TEX_WIDTH, 0); glEnd(); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); glTranslatef (53, 83, 0); float avgFps = averageFramerate (); float rrVal = avgFps * cScreen->optimalRedrawTime () / 1000.0; /* * rrVal is slightly inaccurate and can be off by a couple of FPS. * This means the graph for a 60 FPS config goes up to 62.5 FPS. * This is because cScreen->optimalRedrawTime only has millisec precision * and can't be avoided without improving the precision of the composite * plugin. */ rrVal = MIN (1.0, MAX (0.0, rrVal) ); if (rrVal < 0.5) { glBegin (GL_QUADS); glColor4f (0.0, 1.0, 0.0, mAlpha); glVertex2f (0.0, 0.0); glVertex2f (0.0, 25.0); glColor4f (rrVal * 2.0, 1.0, 0.0, mAlpha); glVertex2f (330.0 * rrVal, 25.0); glVertex2f (330.0 * rrVal, 0.0); glEnd(); } else { glBegin (GL_QUADS); glColor4f (0.0, 1.0, 0.0, mAlpha); glVertex2f (0.0, 0.0); glVertex2f (0.0, 25.0); glColor4f (1.0, 1.0, 0.0, mAlpha); glVertex2f (165.0, 25.0); glVertex2f (165.0, 0.0); glEnd(); glBegin (GL_QUADS); glColor4f (1.0, 1.0, 0.0, mAlpha); glVertex2f (165.0, 0.0); glVertex2f (165.0, 25.0); glColor4f (1.0, 1.0 - ( (rrVal - 0.5) * 2.0), 0.0, mAlpha); glVertex2f (165.0 + 330.0 * (rrVal - 0.5), 25.0); glVertex2f (165.0 + 330.0 * (rrVal - 0.5), 0.0); glEnd(); } glColor4f (0.0, 0.0, 0.0, mAlpha); glCallList (mDList); glTranslatef (72, 45, 0); glEnable (GL_TEXTURE_2D); isSet = false; fps = (avgFps * 100.0); fps = MIN (999999, fps); for (unsigned int pos = 100000; pos >= 1; pos /= 10) { if (fps >= pos || isSet || pos <= 100) { unsigned int digit = fps / pos; glBindTexture (GL_TEXTURE_2D, mNumTex[digit]); glCallList (mDList + 1); isSet = true; fps %= pos; } glTranslatef ((pos == 100) ? 19 : 12, 0, 0); } glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); glPopMatrix(); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glColor4f (1.0, 1.0, 1.0, 1.0); glPopAttrib(); glGetError(); return status; } void BenchScreen::limiterModeChanged (CompOption *opt) { if (mActive) cScreen->setFPSLimiterMode ((CompositeFPSLimiterMode) opt->value ().i ()); } BenchScreen::BenchScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mAlpha (0), mFakedDamage (false), mFrames (0), mLastPrintFrames (0), mActive (false), mOldLimiterMode ((CompositeFPSLimiterMode) BenchOptions::FpsLimiterModeDefaultLimiter) { optionSetInitiateKeyInitiate (boost::bind (&BenchScreen::initiate, this, _3)); optionSetFpsLimiterModeNotify (boost::bind (&BenchScreen::limiterModeChanged, this, _1)); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); mRect.setGeometry (optionGetPositionX (), optionGetPositionY (), TEX_WIDTH, TEX_HEIGHT); mTimer.setCallback (boost::bind (&BenchScreen::timedOut, this)); glGenTextures (10, mNumTex); glGenTextures (1, &mBackTex); glGetError(); glEnable (GL_TEXTURE_2D); for (int i = 0; i < 10; i++) { //Bind the texture glBindTexture (GL_TEXTURE_2D, mNumTex[i]); //Load the parameters glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, 16, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, number_data[i]); GLERR; } glBindTexture (GL_TEXTURE_2D, mBackTex); //Load the parameters glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexImage2D (GL_TEXTURE_2D, 0, 4, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data); GLERR; glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); mDList = glGenLists (2); glNewList (mDList, GL_COMPILE); glLineWidth (2.0); glBegin (GL_LINE_LOOP); glVertex2f (0, 0); glVertex2f (0, 25); glVertex2f (330, 25); glVertex2f (330, 0); glEnd(); glLineWidth (1.0); glBegin (GL_LINES); for (int i = 33; i < 330; i += 33) { glVertex2f (i, 15); glVertex2f (i, 25); } for (int i = 16; i < 330; i += 33) { glVertex2f (i, 20); glVertex2f (i, 25); } glEnd(); glEndList(); glNewList (mDList + 1, GL_COMPILE); glBegin (GL_QUADS); glTexCoord2f (0, 0); glVertex2f (0, 0); glTexCoord2f (0, 1); glVertex2f (0, 32); glTexCoord2f (1, 1); glVertex2f (16, 32); glTexCoord2f (1, 0); glVertex2f (16, 0); glEnd(); glEndList(); } BenchScreen::~BenchScreen () { if (mActive) { // Restore FPS limiter mode cScreen->setFPSLimiterMode (mOldLimiterMode); } glDeleteLists (mDList, 2); glDeleteTextures (10, mNumTex); glDeleteTextures (1, &mBackTex); } void BenchScreen::damageSelf () { CompRegion self (mRect); cScreen->damageRegion (self); } bool BenchScreen::timedOut () { mFakedDamage = (cScreen->damageMask () == 0); damageSelf (); return true; } bool BenchScreen::initiate (CompOption::Vector &options) { mActive = !mActive; mActive &= optionGetOutputScreen () || optionGetOutputConsole (); Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (xid != ::screen->root ()) return false; if (mActive) { // Store current FPS limiter mode mOldLimiterMode = cScreen->FPSLimiterMode (); cScreen->setFPSLimiterMode ((CompositeFPSLimiterMode) optionGetFpsLimiterMode ()); cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); for (int t = 0; t < MAX_SAMPLES; t++) mSample[t] = 0; } else { // Restore FPS limiter mode cScreen->setFPSLimiterMode (mOldLimiterMode); mTimer.stop (); } mTimer.start (1000 / FADE_FPS); mFrames = 0; mLastPrintFrames = 0; gettimeofday (&mLastRedraw, 0); mLastPrint = mLastRedraw; return true; } bool BenchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/bench/bench.xml.in0000644000004100000410000000464213246301623016217 0ustar www-datawww-data <_short>Benchmark <_long>A simple benchmark plugin Extras opengl composite opengl <_short>Main <_short>Screen Output <_short>Console Output ./plugins/expo/0000755000004100000410000000000013246301623013677 5ustar www-datawww-data./plugins/expo/CMakeLists.txt0000644000004100000410000000053213246301623016437 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) add_subdirectory (src/click_threshold) include_directories (src/click_threshold/include) add_subdirectory (src/wall_offset) include_directories (src/wall_offset/include) compiz_plugin (expo PLUGINDEPS composite opengl LIBRARIES compiz_expo_click_threshold compiz_expo_wall_offset ) ./plugins/expo/expo.xml.in0000644000004100000410000002134513246301623016006 0ustar www-datawww-data <_short>Expo <_long>Expose all viewports and freely arrange open windows amongst them Desktop opengl composite opengl decor cube cubeaddon wobbly animation wallpaper imgpng <_short>Bindings <_short>Behaviour <_short>Appearance Inactive Viewports Reflection ./plugins/expo/src/0000755000004100000410000000000013246301623014466 5ustar www-datawww-data./plugins/expo/src/wall_offset/0000755000004100000410000000000013246301623016773 5ustar www-datawww-data./plugins/expo/src/wall_offset/CMakeLists.txt0000644000004100000410000000115113246301623021531 0ustar www-datawww-datainclude_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) link_directories (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) set ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/wall-offset.h ) set ( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/wall-offset.cpp ) add_library ( compiz_expo_wall_offset STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) add_subdirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) target_link_libraries ( compiz_expo_wall_offset compiz_core ) ./plugins/expo/src/wall_offset/include/0000755000004100000410000000000013246301624020417 5ustar www-datawww-data./plugins/expo/src/wall_offset/include/wall-offset.h0000644000004100000410000000224713246301623023017 0ustar www-datawww-data/** * Copyright © 2012 Canonical Ltd. * * Authors: * Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _COMPIZ_EXPO_WALL_OFFSET_H #define _COMPIZ_EXPO_WALL_OFFSET_H #include #include #include namespace compiz { namespace expo { void calculateWallOffset (const CompRect &output, const CompPoint &offsetInScreenCoords, const CompPoint &vpSize, const CompSize &screenSize, float &offsetInWorldX, float &offsetInWorldY, float &worldScaleFactorX, float &worldScaleFactorY, float animationProgress); } } #endif ./plugins/expo/src/wall_offset/src/0000755000004100000410000000000013246301624017563 5ustar www-datawww-data./plugins/expo/src/wall_offset/src/wall-offset.cpp0000644000004100000410000000347413246301623022521 0ustar www-datawww-data/** * Copyright © 2012 Canonical Ltd. * * Authors: * Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "wall-offset.h" namespace compiz { namespace expo { void calculateWallOffset (const CompRect &output, const CompPoint &offsetInScreenCoords, const CompPoint &vpSize, const CompSize &screenSize, float &offsetInWorldX, float &offsetInWorldY, float &worldScaleFactorX, float &worldScaleFactorY, float animationProgress) { const float sx = screenSize.width () / static_cast (output.width ()); const float sy = screenSize.height () / static_cast (output.height ()); offsetInWorldX = 0.0; offsetInWorldY = 0.0; worldScaleFactorX = 1.0f; worldScaleFactorY = 1.0f; offsetInWorldX = ((vpSize.x () * sx) / ((float) output.width ()) * (offsetInScreenCoords.x ()) * animationProgress); worldScaleFactorX = 1.0f - ((float) (offsetInScreenCoords.x ()) / (float) (output.width ())) * animationProgress; offsetInWorldY = ((vpSize.y () * sy) / ((float) output.height ()) * (offsetInScreenCoords.y ()) * animationProgress); worldScaleFactorY = 1.0f - ((float) (offsetInScreenCoords.y ()) / (float) output.height ()) * animationProgress; } } } ./plugins/expo/src/wall_offset/tests/0000755000004100000410000000000013246301624020136 5ustar www-datawww-data./plugins/expo/src/wall_offset/tests/test-expo-wall-offset.cpp0000644000004100000410000002172213246301623025016 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include "wall-offset.h" using ::testing::WithParamInterface; using ::testing::ValuesIn; using ::testing::Combine; using ::testing::Range; class ExpoWallOffsetTest : public ::testing::Test { protected: float offsetInWorldX; float offsetInWorldY; float worldScaleFactorX; float worldScaleFactorY; }; namespace { const unsigned int nAnimationsBegin = 0; const unsigned int nAnimationSteps = 20; struct OffsetAnimationParameters { float offsetInWorldX; float offsetInWorldY; float worldScaleFactorX; float worldScaleFactorY; }; struct OffsetParameters { float offsetX; float offsetY; int vpSizeWidth; int vpSizeHeight; int screenWidth; int screenHeight; int outputWidth; int outputHeight; OffsetAnimationParameters animationParameters[20]; }; const OffsetParameters testingOffsetParameters[] = { { 0, 0, 1, 1, 100, 100, 100, 100, { { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 }, { 0, 0, 1.0, 1.0 } } }, /* Monitor 1280x800, Screen: 1280x800, Viewport Layout: 2x2, Offset: 32, 24 */ { 32, 24, 2, 2, 1280, 800, 1280, 800, { { 0, 0, 1, 1 }, { 0.0025000001769512892, 0.0011718750465661287, 0.99874997138977051, 0.99906247854232788 }, { 0.0050000003539025784, 0.0023437500931322575, 0.99750000238418579, 0.99812501668930054 }, { 0.0075000002980232239, 0.0035156251396983862, 0.9962499737739563, 0.99718749523162842 }, { 0.010000000707805157, 0.0046875001862645149, 0.99500000476837158, 0.9962499737739563 }, { 0.012500000186264515, 0.005859375, 0.99374997615814209, 0.99531251192092896 }, { 0.015000000596046448, 0.0070312502793967724, 0.99250000715255737, 0.99437499046325684 }, { 0.017500000074505806, 0.0082031246274709702, 0.99124997854232788, 0.99343752861022949 }, { 0.020000001415610313, 0.0093750003725290298, 0.99000000953674316, 0.99250000715255737 }, { 0.022499999031424522, 0.01054687425494194, 0.98874998092651367, 0.99156248569488525 }, { 0.02500000037252903, 0.01171875, 0.98750001192092896, 0.99062502384185791 }, { 0.027500001713633537, 0.01289062574505806, 0.98624998331069946, 0.98968750238418579 }, { 0.030000001192092896, 0.014062500558793545, 0.98500001430511475, 0.98874998092651367 }, { 0.032499998807907104, 0.015234374441206455, 0.98374998569488525, 0.98781251907348633 }, { 0.035000000149011612, 0.01640624925494194, 0.98250001668930054, 0.98687499761581421 }, { 0.037500001490116119, 0.017578125, 0.98124998807907104, 0.98593747615814209 }, { 0.040000002831220627, 0.01875000074505806, 0.98000001907348633, 0.98500001430511475 }, { 0.042500000447034836, 0.019921876490116119, 0.97874999046325684, 0.98406249284744263 }, { 0.044999998062849045, 0.021093748509883881, 0.97750002145767212, 0.98312497138977051 }, { 0.047499999403953552, 0.02226562425494194, 0.97624999284744263, 0.98218750953674316 } } }, /* Monitor 1280x1024, Screen: 2560x1024, Viewport Layout: 2x2, Offset: 32, 24 */ { 32, 24, 2, 2, 2560, 1024, 1280, 1024, { { 0, 0, 1, 1 }, { 0.0050000003539025784, 0.001500000013038516, 0.99874997138977051, 0.99906247854232788 }, { 0.010000000707805157, 0.0030000000260770321, 0.99750000238418579, 0.99812501668930054 }, { 0.015000000596046448, 0.0045000002719461918, 0.9962499737739563, 0.99718749523162842 }, { 0.020000001415610313, 0.0060000000521540642, 0.99500000476837158, 0.9962499737739563 }, { 0.02500000037252903, 0.0074999998323619366, 0.99374997615814209, 0.99531251192092896 }, { 0.030000001192092896, 0.0090000005438923836, 0.99250000715255737, 0.99437499046325684 }, { 0.035000000149011612, 0.010499999858438969, 0.99124997854232788, 0.99343752861022949 }, { 0.040000002831220627, 0.012000000104308128, 0.99000000953674316, 0.99250000715255737 }, { 0.044999998062849045, 0.013499999418854713, 0.98874998092651367, 0.99156248569488525 }, { 0.05000000074505806, 0.014999999664723873, 0.98750001192092896, 0.99062502384185791 }, { 0.055000003427267075, 0.016499999910593033, 0.98624998331069946, 0.98968750238418579 }, { 0.060000002384185791, 0.018000001087784767, 0.98500001430511475, 0.98874998092651367 }, { 0.064999997615814209, 0.019499998539686203, 0.98374998569488525, 0.98781251907348633 }, { 0.070000000298023224, 0.020999999716877937, 0.98250001668930054, 0.98687499761581421 }, { 0.075000002980232239, 0.022499999031424522, 0.98124998807907104, 0.98593747615814209 }, { 0.080000005662441254, 0.024000000208616257, 0.98000001907348633, 0.98500001430511475 }, { 0.085000000894069672, 0.025499999523162842, 0.97874999046325684, 0.98406249284744263 }, { 0.08999999612569809, 0.026999998837709427, 0.97750002145767212, 0.98312497138977051 }, { 0.094999998807907104, 0.028499998152256012, 0.97624999284744263, 0.98218750953674316 } } }, }; typedef std::tr1::tuple AnimParam; } class ExpoWallOffsetTestAnimations : public ExpoWallOffsetTest, public ::testing::WithParamInterface { public: void RecordProperty (const char *name, float value) { ::testing::Message message; message << value; Test::RecordProperty (name, message.GetString ().c_str ()); } }; TEST_P (ExpoWallOffsetTestAnimations, TestAnimationValues) { const OffsetParameters &offset (std::tr1::get <0> (GetParam ())); const unsigned int &index (std::tr1::get <1> (GetParam ())); RecordProperty ("outputWidth", offset.outputWidth); RecordProperty ("outputHeight", offset.outputHeight); RecordProperty ("screenWidth", offset.screenWidth); RecordProperty ("screenHeight", offset.screenHeight); RecordProperty ("offsetX", offset.offsetX); RecordProperty ("offsetY", offset.offsetY); RecordProperty ("expected.offsetInWorldX", offset.animationParameters[index].offsetInWorldX); RecordProperty ("expected.offsetInWorldY", offset.animationParameters[index].offsetInWorldY); RecordProperty ("expected.worldScaleFactorX", offset.animationParameters[index].worldScaleFactorX); RecordProperty ("expected.worldScaleFactorY", offset.animationParameters[index].worldScaleFactorY); compiz::expo::calculateWallOffset (CompRect (0, 0, offset.outputWidth, offset.outputWidth), CompPoint (offset.offsetX, offset.offsetY), CompPoint (offset.vpSizeWidth, offset.vpSizeHeight), CompSize (offset.screenWidth, offset.screenHeight), offsetInWorldX, offsetInWorldY, worldScaleFactorX, worldScaleFactorY, index / static_cast (nAnimationSteps)); RecordProperty ("offsetInWorldX", offsetInWorldX); RecordProperty ("offsetInWorldY", offsetInWorldY); RecordProperty ("worldScaleFactorX", worldScaleFactorX); RecordProperty ("worldScaleFactorY", worldScaleFactorY); EXPECT_FLOAT_EQ (offsetInWorldX, offset.animationParameters[index].offsetInWorldX); EXPECT_FLOAT_EQ (offsetInWorldY, offset.animationParameters[index].offsetInWorldY); EXPECT_FLOAT_EQ (worldScaleFactorX, offset.animationParameters[index].worldScaleFactorX); EXPECT_FLOAT_EQ (worldScaleFactorY, offset.animationParameters[index].worldScaleFactorY); } INSTANTIATE_TEST_CASE_P (ExpoAnimationOffsetTest, ExpoWallOffsetTestAnimations, Combine (ValuesIn (testingOffsetParameters), Range (nAnimationsBegin, nAnimationSteps))); ./plugins/expo/src/wall_offset/tests/CMakeLists.txt0000644000004100000410000000102613246301623022674 0ustar www-datawww-dataif (NOT GTEST_FOUND) message ("Google Test not found - cannot build tests!") set (COMPIZ_BUILD_TESTING OFF) endif (NOT GTEST_FOUND) include_directories (${GTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_LIBRARY_DIRS}) add_executable (compiz_test_expo_wall_offset ${CMAKE_CURRENT_SOURCE_DIR}/test-expo-wall-offset.cpp) target_link_libraries (compiz_test_expo_wall_offset compiz_expo_wall_offset ${GTEST_BOTH_LIBRARIES}) compiz_discover_tests (compiz_test_expo_wall_offset COVERAGE compiz_expo_wall_offset) ./plugins/expo/src/group_glow.h0000644000004100000410000003215213246301623017026 0ustar www-datawww-data#ifndef _GROUP_GLOWTEX_H #define _GROUP_GLOWTEX_H /** * * Compiz group plugin * * group_glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ /* * glowTex */ static char glowTexRect[4097] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\14" "\377\377\377\14\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377" "\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377" "\35\377\377\377\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377\27\377\377" "\377\27\377\377\377\35\377\377\377#\377\377\377'\377\377\377'\377\377\377" "+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377" "\377+\377\377\377+\377\377\377+\377\377\3771\377\377\3771\377\377\3771\377" "\377\3771\377\377\3771\377\377\3771\377\377\3771\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377" "\27\377\377\377\35\377\377\377#\377\377\377+\377\377\3771\377\377\3776\377" "\377\377<\377\377\377>\377\377\377C\377\377\377I\377\377\377I\377\377\377" "I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377" "\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377" "\377\377L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\22\377\377\377\27\377\377\377#\377\377\377+\377\377\3776\377\377" "\377C\377\377\377L\377\377\377U\377\377\377]\377\377\377`\377\377\377d\377" "\377\377h\377\377\377k\377\377\377k\377\377\377k\377\377\377k\377\377\377" "k\377\377\377k\377\377\377k\377\377\377p\377\377\377p\377\377\377p\377\377" "\377p\377\377\377p\377\377\377p\377\377\377p\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\14\377\377\377\22\314\314\314\35\377\377\377'\377" "\377\3771\377\377\377>\357\357\357P\377\377\377]\363\363\363k\365\365\365" "v\365\365\365|\377\377\377\202\367\367\367\210\367\367\367\214\367\367\367" "\216\367\367\367\221\367\367\367\221\367\367\367\221\367\367\367\221\367" "\367\367\221\367\367\367\221\367\367\367\224\367\367\367\224\367\367\367" "\224\367\367\367\224\367\367\367\224\367\367\367\224\367\367\367\224\0\0" "\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\27\377" "\377\377'\377\377\3776\377\377\377I\377\377\377Y\377\377\377k\376\376\376" "y\377\377\377\210\377\377\377\224\377\377\377\235\377\377\377\245\377\377" "\377\253\377\377\377\255\377\377\377\262\377\377\377\262\377\377\377\263" "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377" "\377\266\377\377\377\266\377\377\377\266\377\377\377\266\377\377\377\266" "\377\377\377\266\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\27\377\377\377#\377\377\3771\377\377\377I\377\377\377]\377" "\377\377r\377\377\377\205\377\377\377\231\377\377\377\247\377\377\377\263" "\377\377\377\275\377\377\377\304\377\377\377\310\377\377\377\313\377\377" "\377\316\377\377\377\320\377\377\377\320\377\377\377\320\377\377\377\320" "\377\377\377\320\377\377\377\320\377\377\377\322\377\377\377\322\377\377" "\377\322\377\377\377\322\377\377\377\322\377\377\377\322\377\377\377\322" "\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\35\377\377" "\377+\377\377\377>\377\377\377Y\377\377\377r\377\377\377\210\376\376\376" "\237\377\377\377\262\377\377\377\302\377\377\377\313\377\377\377\324\377" "\377\377\332\376\376\376\336\377\377\377\341\377\377\377\342\377\377\377" "\344\377\377\377\344\377\377\377\344\377\377\377\344\377\377\377\344\377" "\377\377\344\377\377\377\345\377\377\377\345\377\377\377\345\377\377\377" "\345\377\377\377\345\377\377\377\345\377\377\377\345\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377#\377\377\3776\377\377\377P\377" "\377\377k\377\377\377\205\376\376\376\237\372\372\372\266\377\377\377\307" "\373\373\373\325\373\373\373\337\374\374\374\345\374\374\374\352\374\374" "\374\355\374\374\374\357\374\374\374\360\374\374\374\361\374\374\374\361" "\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374" "\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362" "\374\374\374\362\374\374\374\362\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\377+\377\377\377C\377\377\377]\377\377\377|\377\377\377" "\231\377\377\377\263\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\6\377\377\377\22\324\324\324#\377\377\3771\377\377\377L\363\363" "\363k\377\377\377\210\377\377\377\247\377\377\377\302\377\377\377\325\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377" "\377#\377\377\377<\377\377\377U\377\377\377v\377\377\377\226\377\377\377" "\263\377\377\377\315\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\6\377\377\377\14\377\377\377\27\377\377\377'\377\377\377>\377\377\377]\377" "\377\377|\370\370\370\237\377\377\377\275\373\373\373\325\377\377\377\345" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\27\377" "\377\377+\377\377\377C\377\377\377`\377\377\377\202\377\377\377\247\377\377" "\377\304\377\377\377\332\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\27\377\377\377+\377\377\377C\377\377\377" "d\377\377\377\210\377\377\377\253\377\377\377\310\376\376\376\336\374\374" "\374\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\377+\377\377\377I\377\377\377h\377\377\377\214\377\377\377\260" "\377\377\377\313\374\374\374\342\374\374\374\357\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\342\342\3421\377\377\377I\377" "\377\377k\377\377\377\216\377\377\377\262\377\377\377\316\374\374\374\344" "\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377k\377\377\377\221\377\377" "\377\263\377\377\377\320\377\377\377\344\377\377\377\361\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377k\377\377\377\221\377\377\377\263\377\377\377\320\377\377" "\377\344\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\364\364\364p\377\377\377\221" "\372\372\372\266\377\377\377\320\374\374\374\345\377\377\377\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373\373\322" "\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377" "\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\377\377" "\377\221\377\377\377\266\373\373\373\322\377\377\377\345\377\377\377\362" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377" "\377\3771\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373" "\373\322\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377" "p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345\374\374" "\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377" "\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266" "\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377" "\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345" "\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377" "\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377" "\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377" "\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377" "\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377" "\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224" "\377\377\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377" "1\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322" "\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", }; #endif ./plugins/expo/src/glow.cpp0000644000004100000410000003445213246301623016152 0ustar www-datawww-data/** * * Compiz group plugin * * glow.cpp * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "expo.h" #include "group_glow.h" const GlowTextureProperties glowTextureProperties = { /* GlowTextureRectangular */ glowTexRect, 32, 21 }; /* * GroupWindow::paintGlow * * Takes our glow texture, stretches the appropriate positions in the glow texture, * adds those geometries (so plugins like wobby deform this texture correctly) * and then draws the glow texture with this geometry (plugins like wobbly and friends * will automatically deform the texture based on our set geometry) */ void ExpoWindow::paintGlow (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion &paintRegion, unsigned int mask) { CompRegion reg; GLushort colorData[4]; const GLushort *selColorData = ExpoScreen::get (screen)->optionGetSelectedColor (); float alpha = static_cast (selColorData[3] / 65535.0f); /* Premultiply color */ colorData[0] = selColorData[0] * alpha; colorData[1] = selColorData[1] * alpha; colorData[2] = selColorData[2] * alpha; colorData[3] = selColorData[3]; gWindow->vertexBuffer ()->begin (); /* There are 8 glow parts of the glow texture which we wish to paint * separately with different transformations */ for (int i = 0; i < NUM_GLOWQUADS; ++i) { /* Using precalculated quads here */ reg = CompRegion (mGlowQuads[i].mBox); if (reg.boundingRect ().x1 () < reg.boundingRect ().x2 () && reg.boundingRect ().y1 () < reg.boundingRect ().y2 ()) { GLTexture::MatrixList matl; reg = CompRegion (reg.boundingRect ().x1 (), reg.boundingRect ().y1 (), reg.boundingRect ().width (), reg.boundingRect ().height ()); matl.push_back (mGlowQuads[i].mMatrix); /* Add color data for all 6 vertices of the quad */ for (int n = 0; n < 6; ++n) gWindow->vertexBuffer ()->addColors (1, colorData); gWindow->glAddGeometry (matl, reg, paintRegion); } } if (gWindow->vertexBuffer ()->end ()) { //GLScreen::get (screen)->setTexEnvMode (GL_MODULATE); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* we use PAINT_WINDOW_TRANSFORMED_MASK here to force the usage of a good texture filter */ foreach (GLTexture *tex, ExpoScreen::get (screen)->outline_texture) { gWindow->glDrawTexture (tex, transform, attrib, mask | PAINT_WINDOW_BLEND_MASK | PAINT_WINDOW_TRANSLUCENT_MASK | PAINT_WINDOW_TRANSFORMED_MASK); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLScreen::get (screen)->setTexEnvMode (GL_REPLACE); } } /* * ExpoWindow::computeGlowQuads * * This function computes the matrix transformation required for each * part of the glow texture which we wish to stretch to some rectangular * dimensions * * There are eight quads different parts of the texture which we wish to * paint here, the 4 sides and four corners, eg: * * ------------------ * | 1 | 4 | 6 | * ------------- ------------------ * | 1 | 4 | 6 | | | | | * ------------- | | | | * | 2 | n | 7 | -> | 2 | n | 7 | * ------------- | | | | * | 3 | 5 | 8 | | | | | * ------------- ------------------ * | 3 | 5 | 8 | * ------------------ * * In this example here, 2, 4, 5 and 7 are stretched, and the matrices for * each quad rect adjusted accordingly for it's size compared to the original * texture size. * * When we are adjusting the matrices here, the initial size of each corner has * a size of of "1.0f", so according to 2x2 matrix rules, * the scale factor is the inverse of the size of the glow (which explains * while you will see here that matrix->xx is (1 / glowSize) * where glowSize is the size the user specifies they want their glow to extend. * (likewise, matrix->yy is adjusted similarly for corners and for top/bottom) * * matrix->x0 and matrix->y0 here are set to be the top left edge of the rect * adjusted by the matrix scale factor (matrix->xx and matrix->yy) * */ void ExpoWindow::computeGlowQuads (GLTexture::Matrix *matrix) { /* Passing NULL to this function frees the glow quads * (so the window is not painted with glow) */ if (matrix) { if (!mGlowQuads) mGlowQuads = new GlowQuad[NUM_GLOWQUADS]; if (!mGlowQuads) return; } else { if (mGlowQuads) { delete[] mGlowQuads; mGlowQuads = NULL; } return; } /* TODO: Make glowSize configurable via CCSM */ int glowSize = 48; int glowOffset = (glowSize * ExpoScreen::get (screen)->mGlowTextureProperties->glowOffset / ExpoScreen::get (screen)->mGlowTextureProperties->textureSize) + 1; /* Top left corner */ CompRect *box = &mGlowQuads[GLOWQUAD_TOPLEFT].mBox; mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix = *matrix; GLTexture::Matrix *quadMatrix = &mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix; /* Precalculate some values we need multiple times */ CompWindow *w = window; int winRealX = w->x () - w->border ().left; int winRealY = w->y () - w->border ().top; /* Set the desired rect dimensions * for the part of the glow we are painting */ int x1 = winRealX - glowSize + glowOffset; int y1 = winRealY - glowSize + glowOffset; int winRealWidth = w->geometry ().widthIncBorders (); int winRealHeight = w->geometry ().heightIncBorders (); int halfWinRealWidth = winRealWidth / 2; int halfWinRealHeight = winRealHeight / 2; int xPlusHalfWidth = winRealX + halfWinRealWidth; int yPlusHalfHeight = winRealY + halfWinRealHeight; int xPlusGlowOff = winRealX + glowOffset; int yPlusGlowOff = winRealY + glowOffset; int xMinusGlowOff = winRealX - glowOffset; int yMinusGlowOff = winRealY - glowOffset; float glowPart = 1.0f / glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling both parts of the texture in a positive direction * here (left to right top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the x and y dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = quadMatrix->yy = glowPart; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); int x2 = MIN (xPlusGlowOff, xPlusHalfWidth); int y2 = MIN (yPlusGlowOff, yPlusHalfHeight); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top right corner */ box = &mGlowQuads[GLOWQUAD_TOPRIGHT].mBox; mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix; /* Set the desired rect dimensions * for the part of the glow we are painting */ x1 = xMinusGlowOff + winRealWidth; y1 = yPlusGlowOff - glowSize; x2 = x1 + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the y part of the texture in a positive direction * and the x part in a negative direction here * (right to left top to bottom) * * The base position (x0 and y0) here requires us to move backwards * on the y dimension and forwards on x by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - x1 * xx */ quadMatrix->xx = -glowPart; quadMatrix->yy = glowPart; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = -(y1 * quadMatrix->yy); x1 = MAX (xMinusGlowOff + winRealWidth, xPlusHalfWidth); y2 = MIN (yPlusGlowOff, yPlusHalfHeight); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom left corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mBox; mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix; x1 = xPlusGlowOff - glowSize; y1 = yMinusGlowOff + winRealHeight; /* x2 = xPlusGlowOff; */ y2 = yMinusGlowOff + winRealHeight + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the x part of the texture in a positive direction * and the y part in a negative direction here * (left to right bottom to top) * * The base position (x0 and y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors (since we are moving forward on x we * need the inverse of that which is 1 - y1 * yy */ quadMatrix->xx = glowPart; quadMatrix->yy = -glowPart; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0f - (y1 * quadMatrix->yy); y1 = MAX (winRealY + winRealHeight - glowOffset, yPlusHalfHeight); x2 = MIN (xPlusGlowOff, xPlusHalfWidth); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom right corner */ box = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mBox; mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix; x1 = xMinusGlowOff + winRealWidth; y1 = yMinusGlowOff + winRealHeight; x2 = x1 + glowSize; y2 = y1 + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * Scaling the both parts of the texture in a negative direction * (right to left bottom to top) * * The base position (x0 and y0) here requires us to move forwards * on both dimensions by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -glowPart; quadMatrix->yy = -glowPart; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); x1 = MAX (xMinusGlowOff + winRealWidth, xPlusHalfWidth); y1 = MAX (yMinusGlowOff + winRealHeight, yPlusHalfHeight); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Top edge */ box = &mGlowQuads[GLOWQUAD_TOP].mBox; mGlowQuads[GLOWQUAD_TOP].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_TOP].mMatrix; x1 = xPlusGlowOff; y1 = yPlusGlowOff - glowSize; x2 = xMinusGlowOff + winRealWidth; y2 = yPlusGlowOff; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a positive direciton * * The base position (y0) here requires us to move backwards * on the x dimension and forwards on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = glowPart; quadMatrix->x0 = 1.0; quadMatrix->y0 = -(y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Bottom edge */ box = &mGlowQuads[GLOWQUAD_BOTTOM].mBox; mGlowQuads[GLOWQUAD_BOTTOM].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOM].mMatrix; x1 = xPlusGlowOff; y1 = yMinusGlowOff + winRealHeight; x2 = xMinusGlowOff + winRealWidth; y2 = y1 + glowSize; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the x part of the texture here, but we * are scaling on the y part in a negative direciton * * The base position (y0) here requires us to move forwards * on y by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = 0.0f; quadMatrix->yy = -glowPart; quadMatrix->x0 = 1.0; quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy); *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Left edge */ box = &mGlowQuads[GLOWQUAD_LEFT].mBox; mGlowQuads[GLOWQUAD_LEFT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_LEFT].mMatrix; x1 = xPlusGlowOff - glowSize; y1 = yPlusGlowOff; x2 = xPlusGlowOff; y2 = yMinusGlowOff + winRealHeight; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a positive direciton * * The base position (x0) here requires us to move backwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = glowPart; quadMatrix->yy = 0.0f; quadMatrix->x0 = -(x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); /* Right edge */ box = &mGlowQuads[GLOWQUAD_RIGHT].mBox; mGlowQuads[GLOWQUAD_RIGHT].mMatrix = *matrix; quadMatrix = &mGlowQuads[GLOWQUAD_RIGHT].mMatrix; x1 = xMinusGlowOff + winRealWidth; y1 = yPlusGlowOff; x2 = xMinusGlowOff + winRealWidth + glowSize; y2 = yMinusGlowOff + winRealHeight; /* 2x2 Matrix here, adjust both x and y scale factors * and the x and y position * * No need to scale the y part of the texture here, but we * are scaling on the x part in a negative direciton * * The base position (x0) here requires us to move forwards * on x by the calculated rect dimensions * multiplied by the scale factors */ quadMatrix->xx = -glowPart; quadMatrix->yy = 0.0f; quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx); quadMatrix->y0 = 1.0; *box = CompRect (x1, y1, x2 - x1, y2 - y1); } ./plugins/expo/src/expo.h0000644000004100000410000001331013246301623015610 0ustar www-datawww-data/** * * Compiz expo plugin * * expo.c * * Copyright (c) 2008 Dennis Kasprzyk * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include "expo_options.h" #include "glow.h" class ExpoScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public ExpoOptions { public: ExpoScreen (CompScreen *); void handleEvent (XEvent *); void preparePaint (int); void paint (CompOutput::ptrList &, unsigned int ); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); bool dndInit (CompAction *, CompAction::State, CompOption::Vector&); bool dndFini (CompAction *, CompAction::State, CompOption::Vector&); bool doExpo (CompAction *, CompAction::State, CompOption::Vector&); bool exitExpo (CompAction *, CompAction::State, CompOption::Vector&); bool termExpo (CompAction *, CompAction::State, CompOption::Vector&); bool nextVp (CompAction *, CompAction::State, CompOption::Vector&); bool prevVp (CompAction *, CompAction::State, CompOption::Vector&); typedef enum { DnDNone, DnDDuring, DnDStart } DnDState; typedef enum { VPUpdateNone, VPUpdateMouseOver, VPUpdatePrevious } VPUpdateMode; CompositeScreen *cScreen; GLScreen *gScreen; float expoCam; bool expoActive; bool expoMode; DnDState dndState; CompWindow *dndWindow; CompPoint prevCursor; CompPoint newCursor; CompPoint prevClickPoint; CompPoint origVp; CompPoint selectedVp; CompPoint lastSelectedVp; CompPoint paintingVp; std::vector vpActivity; float vpBrightness; float vpSaturation; VPUpdateMode vpUpdateMode; bool anyClick; unsigned int clickTime; bool doubleClick; CompRegion tmpRegion; float curveAngle; float curveDistance; float curveRadius; std::vector vpNormals; CompScreen::GrabHandle grabIndex; GLTexture::List outline_texture; CompSize outline_texture_size; const GlowTextureProperties *mGlowTextureProperties; private: void moveFocusViewport (int, int); void finishWindowMovement (); void updateWraps (bool); void invertTransformedVertex (const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int[2] ); void paintWall (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int , bool ); KeyCode leftKey; KeyCode rightKey; KeyCode upKey; KeyCode downKey; }; class ExpoWindow : public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: ExpoWindow (CompWindow *); ~ExpoWindow (); bool damageRect (bool , const CompRect &); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int ); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void glAddGeometry (const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int , unsigned int ); void glDrawTexture (GLTexture *, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int ); void paintGlow (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion &paintRegion, unsigned int mask); void computeGlowQuads (GLTexture::Matrix *matrix); void resizeNotify (int, int, int, int); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; ExpoScreen *eScreen; private: GlowQuad *mGlowQuads; float expoOpacity; }; class ExpoPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/expo/src/click_threshold/0000755000004100000410000000000013246301623017627 5ustar www-datawww-data./plugins/expo/src/click_threshold/CMakeLists.txt0000644000004100000410000000117213246301623022370 0ustar www-datawww-datainclude_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) link_directories (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) set ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/click-threshold.h ) set ( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/click-threshold.cpp ) add_library ( compiz_expo_click_threshold STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) add_subdirectory ( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) target_link_libraries ( compiz_expo_click_threshold compiz_point ) ./plugins/expo/src/click_threshold/include/0000755000004100000410000000000013246301623021252 5ustar www-datawww-data./plugins/expo/src/click_threshold/include/click-threshold.h0000644000004100000410000000167213246301623024510 0ustar www-datawww-data/** * * Compiz Expo plugin * * click-threshold.h * * Copyright © 2012 Canonical Ltd. * * Authors: * Renato Araujo Oliviera Filho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _COMPIZ_EXPO_CLICK_THRESHOLD_H #define _COMPIZ_EXPO_CLICK_THRESHOLD_H #include namespace compiz { namespace expo { bool clickMovementInThreshold (int previousX, int previousY, int currentX, int currentY); } } #endif ./plugins/expo/src/click_threshold/src/0000755000004100000410000000000013246301623020416 5ustar www-datawww-data./plugins/expo/src/click_threshold/src/click-threshold.cpp0000644000004100000410000000202113246301623024174 0ustar www-datawww-data/** * * Compiz Expo plugin * * click-threshold.cpp * * Copyright © 2012 Canonical Ltd. * * Authors: * Renato Araujo Oliviera Filho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "click-threshold.h" #include static const unsigned short DND_THRESHOLD = 5; bool compiz::expo::clickMovementInThreshold (int previousX, int previousY, int currentX, int currentY) { if ((abs (previousX - currentX) <= DND_THRESHOLD) && (abs (previousY - currentY) <= DND_THRESHOLD)) return true; else return false; } ./plugins/expo/src/click_threshold/tests/0000755000004100000410000000000013246301624020772 5ustar www-datawww-data./plugins/expo/src/click_threshold/tests/CMakeLists.txt0000644000004100000410000000105613246301623023533 0ustar www-datawww-dataif (NOT GTEST_FOUND) message ("Google Test not found - cannot build tests!") set (COMPIZ_BUILD_TESTING OFF) endif (NOT GTEST_FOUND) include_directories (${GTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_LIBRARY_DIRS}) add_executable (compiz_test_expo_click_threshold ${CMAKE_CURRENT_SOURCE_DIR}/test-expo-click-threshold.cpp) target_link_libraries (compiz_test_expo_click_threshold compiz_expo_click_threshold ${GTEST_BOTH_LIBRARIES}) compiz_discover_tests (compiz_test_expo_click_threshold COVERAGE compiz_expo_click_threshold) ./plugins/expo/src/click_threshold/tests/test-expo-click-threshold.cpp0000644000004100000410000000465313246301623026512 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Renato Araujo Oliveira Filho */ #include #include "click-threshold.h" class ExpoClickThresholdTest : public ::testing::Test { }; TEST(ExpoClickThresholdTest, TestNotMove) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 10, 10)); } TEST(ExpoClickThresholdTest, TestMoveNearLeft) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 8, 8)); } TEST(ExpoClickThresholdTest, TestMoveNearRight) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 13, 13)); } TEST(ExpoClickThresholdTest, TestMoveFarLeft) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 1, 1)); } TEST(ExpoClickThresholdTest, TestMoveFarRight) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 30, 30)); } TEST(ExpoClickThresholdTest, TestMoveNearX) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 13, 10)); } TEST(ExpoClickThresholdTest, TestMoveNearY) { EXPECT_TRUE(compiz::expo::clickMovementInThreshold (10, 10, 10, 13)); } TEST(ExpoClickThresholdTest, TestMoveFarX) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 30, 10)); } TEST(ExpoClickThresholdTest, TestMoveFarY) { EXPECT_FALSE(compiz::expo::clickMovementInThreshold (10, 10, 10, 30)); } ./plugins/expo/src/expo.cpp0000644000004100000410000012706713246301623016162 0ustar www-datawww-data/** * * Compiz expo plugin * * expo.cpp * * Copyright (c) 2011 Linaro Limited * Copyright (c) 2008 Dennis Kasprzyk * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * Travis Watkins * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "expo.h" #include "click-threshold.h" #include "wall-offset.h" #include #include #ifndef USE_GLES #include #endif #include COMPIZ_PLUGIN_20090315 (expo, ExpoPluginVTable); #define sigmoid(x) (1.0f / (1.0f + exp (-11.0f * ((x) - 0.5f)))) #define sigmoidProgress(x) ((sigmoid (x) - sigmoid (0)) / \ (sigmoid (1) - sigmoid (0))) #define interpolate(a, b, val) (((val) * (a)) + ((1 - (val)) * (b))) bool ExpoScreen::dndInit (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (expoMode && expoCam == 1.0f) { dndState = DnDStart; action->setState (action->state () | CompAction::StateTermButton); cScreen->damageScreen (); return true; } return false; } bool ExpoScreen::dndFini (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (expoCam == 1.0f && (dndState == DnDDuring || dndState == DnDStart)) { if (dndWindow) finishWindowMovement (); dndState = DnDNone; dndWindow = NULL; /* The action could be an action of key, edge or button binding if * expo was terminated during dnd. Thus we must fetch the action of * dndButton ourselves or we mess their state up. */ CompAction &dndAction = optionGetDndButton (); dndAction.setState (dndAction.state () & CompAction::StateInitButton); cScreen->damageScreen (); return true; } return false; } bool ExpoScreen::doExpo (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist ("expo", NULL) || (screen->vpSize ().width () == 1 && screen->vpSize ().height () == 1)) return false; if (!expoMode) { if (!grabIndex) grabIndex = screen->pushGrab (None, "expo"); updateWraps (true); expoMode = true; anyClick = false; doubleClick = false; clickTime = 0; dndState = DnDNone; dndWindow = NULL; selectedVp = screen->vp (); lastSelectedVp = selectedVp; origVp = selectedVp; screen->addAction (&optionGetDndButton ()); screen->addAction (&optionGetExitButton ()); screen->addAction (&optionGetNextVpButton ()); screen->addAction (&optionGetPrevVpButton ()); cScreen->damageScreen (); } else termExpo (action, state, options); return true; } bool ExpoScreen::termExpo (CompAction *action, CompAction::State state, CompOption::Vector &options) { /* Warning: *action is NULL if we came here from handleEvent. */ if (!expoMode) return true; expoMode = false; if (dndState != DnDNone) dndFini (action, state, options); if (expoCam == 1.0f) { if (state & CompAction::StateCancel) vpUpdateMode = VPUpdatePrevious; else vpUpdateMode = VPUpdateMouseOver; } dndState = DnDNone; dndWindow = NULL; screen->removeAction (&optionGetDndButton ()); screen->removeAction (&optionGetExitButton ()); screen->removeAction (&optionGetNextVpButton ()); screen->removeAction (&optionGetPrevVpButton ()); cScreen->damageScreen (); screen->focusDefaultWindow (); return true; } bool ExpoScreen::exitExpo (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (!expoMode) return false; termExpo (action, 0, noOptions ()); anyClick = true; cScreen->damageScreen (); return true; } bool ExpoScreen::nextVp (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (!expoMode) return false; CompPoint pointer (pointerX, pointerY); if (!screen->workArea ().contains (pointer)) return false; unsigned int newX = selectedVp.x () + 1; unsigned int newY = selectedVp.y (); if (newX >= (unsigned int) screen->vpSize ().width ()) { newX = 0; newY = newY + 1; if (newY >= (unsigned int) screen->vpSize ().height ()) newY = 0; } moveFocusViewport (newX - selectedVp.x (), newY - selectedVp.y ()); cScreen->damageScreen (); return true; } bool ExpoScreen::prevVp (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (!expoMode) return false; CompPoint pointer (pointerX, pointerY); if (!screen->workArea ().contains (pointer)) return false; int newX = selectedVp.x () - 1; int newY = selectedVp.y (); if (newX < 0) { newX = screen->vpSize ().width () - 1; newY = newY - 1; if (newY < 0) newY = screen->vpSize ().height () - 1; } moveFocusViewport (newX - selectedVp.x (), newY - selectedVp.y ()); cScreen->damageScreen (); return true; } void ExpoScreen::moveFocusViewport (int dx, int dy) { lastSelectedVp = selectedVp; int newX = selectedVp.x () + dx; int newY = selectedVp.y () + dy; newX = MAX (0, MIN (static_cast (screen->vpSize ().width ()) - 1, newX)); newY = MAX (0, MIN (static_cast (screen->vpSize ().height ()) - 1, newY)); selectedVp.set (newX, newY); cScreen->damageScreen (); } void ExpoScreen::finishWindowMovement () { CompOption::Vector o(0); dndWindow->ungrabNotify (); screen->handleCompizEvent ("expo", "start_viewport_switch", o); screen->moveViewport (screen->vp ().x () - selectedVp.x (), screen->vp ().y () - selectedVp.y (), true); screen->handleCompizEvent ("expo", "end_viewport_switch", o); /* update saved window attributes in case we moved the window to a new viewport */ if (dndWindow->saveMask () & CWX) { dndWindow->saveWc ().x = dndWindow->saveWc ().x % screen->width (); if (dndWindow->saveWc ().x < 0) dndWindow->saveWc ().x += screen->width (); } if (dndWindow->saveMask () & CWY) { dndWindow->saveWc ().y = dndWindow->saveWc ().y % screen->height (); if (dndWindow->saveWc ().y < 0) dndWindow->saveWc ().y += screen->height (); } /* update window attibutes to make sure a moved maximized window is properly snapped to the work area */ if (dndWindow->state () & MAXIMIZE_STATE) dndWindow->updateAttributes (CompStackingUpdateModeNone); #if 0 /* FIXME: obsolete in the meantime? */ { /* make sure we snap to the correct output */ int lastOutput = s->currentOutputDev; int centerX = (WIN_X (w) + WIN_W (w) / 2) % s->width; if (centerX < 0) centerX += s->width; int centerY = (WIN_Y (w) + WIN_H (w) / 2) % s->height; if (centerY < 0) centerY += s->height; s->currentOutputDev = outputDeviceForPoint (s, centerX, centerY); updateWindowAttributes (w, CompStackingUpdateModeNone); s->currentOutputDev = lastOutput; } #endif } void ExpoScreen::handleEvent (XEvent *event) { switch (event->type) { case KeyPress: if (expoMode && event->xkey.root == screen->root ()) { if (event->xkey.keycode == leftKey) moveFocusViewport (-1, 0); else if (event->xkey.keycode == rightKey) moveFocusViewport (1, 0); else if (event->xkey.keycode == upKey) moveFocusViewport (0, -1); else if (event->xkey.keycode == downKey) moveFocusViewport (0, 1); } break; case ButtonPress: if (expoMode && expoCam == 1.0f && event->xbutton.button == Button1 && event->xbutton.root == screen->root ()) { CompPoint pointer (event->xbutton.x_root, event->xbutton.y_root); if (!screen->workArea ().contains (pointer)) break; anyClick = true; if (clickTime == 0) clickTime = event->xbutton.time; else if (event->xbutton.time - clickTime <= static_cast (optionGetDoubleClickTime ()) && lastSelectedVp == selectedVp) doubleClick = true; else { clickTime = event->xbutton.time; doubleClick = false; } cScreen->damageScreen (); prevClickPoint = CompPoint (event->xbutton.x, event->xbutton.y); } break; case ButtonRelease: if (expoMode && expoCam == 1.0f && event->xbutton.button == Button1 && event->xbutton.root == screen->root ()) { CompPoint pointer (event->xbutton.x_root, event->xbutton.y_root); if (!screen->workArea ().contains (pointer)) break; if (event->xbutton.time - clickTime > (unsigned int)optionGetDoubleClickTime ()) { clickTime = 0; doubleClick = false; } else if (doubleClick || compiz::expo::clickMovementInThreshold(prevClickPoint.x (), prevClickPoint.y (), event->xbutton.x, event->xbutton.y)) { clickTime = 0; doubleClick = false; termExpo (NULL, 0, noOptions ()); anyClick = true; } } break; default: break; } screen->handleEvent (event); } void ExpoScreen::preparePaint (int msSinceLastPaint) { float val = (static_cast (msSinceLastPaint) / 1000.0f) / optionGetZoomTime (); if (optionGetExpoAnimation() != ExpoScreen::ExpoAnimationNone) { if (expoMode) expoCam = MIN (1.0, expoCam + val); else expoCam = MAX (0.0, expoCam - val); } else { if (expoMode) expoCam = 1; else expoCam = 0; } if (expoCam) { unsigned int i, j, vp; unsigned int vpCountHorz = screen->vpSize ().width (); unsigned int vpCountVert = screen->vpSize ().height (); unsigned int vpCount = vpCountHorz * vpCountVert; if (vpActivity.size () < vpCount) { vpActivity.resize (vpCount); foreach (float &activity, vpActivity) activity = 1.0f; } for (i = 0; i < vpCountHorz; ++i) { for (j = 0; j < vpCountVert; ++j) { vp = j * vpCountHorz + i; if (CompPoint (i, j) == selectedVp) vpActivity[vp] = MIN (1.0, vpActivity[vp] + val); else vpActivity[vp] = MAX (0.0, vpActivity[vp] - val); } } const float degToRad = M_PI / 180.0f; const int screenWidth = screen->width (); for (i = 0; i < 360; ++i) { vpNormals[i * 3] = (-sin (i * degToRad) / screenWidth) * expoCam; vpNormals[i * 3 + 1] = 0.0; vpNormals[i * 3 + 2] = (-cos (i * degToRad) * expoCam) - (1 - expoCam); } } cScreen->preparePaint (msSinceLastPaint); } void ExpoScreen::updateWraps (bool enable) { screen->handleEventSetEnabled (this, enable); cScreen->preparePaintSetEnabled (this, enable); cScreen->paintSetEnabled (this, enable); cScreen->donePaintSetEnabled (this, enable); gScreen->glPaintOutputSetEnabled (this, enable); gScreen->glPaintTransformedOutputSetEnabled (this, enable); ExpoWindow *ew; foreach (CompWindow *w, screen->windows ()) { ew = ExpoWindow::get (w); ew->cWindow->damageRectSetEnabled (ew, enable); ew->gWindow->glPaintSetEnabled (ew, enable); ew->gWindow->glDrawSetEnabled (ew, enable); ew->gWindow->glAddGeometrySetEnabled (ew, enable); ew->gWindow->glDrawTextureSetEnabled (ew, enable); } } void ExpoScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { if (expoCam > 0.0 && outputs.size () > 1 && optionGetMultioutputMode () == MultioutputModeOneBigWall) { outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } cScreen->paint (outputs, mask); } void ExpoScreen::donePaint () { CompOption::Vector o(0); screen->handleCompizEvent ("expo", "start_viewport_switch", o); switch (vpUpdateMode) { case VPUpdateMouseOver: screen->moveViewport (screen->vp ().x () - selectedVp.x (), screen->vp ().y () - selectedVp.y (), true); screen->focusDefaultWindow (); vpUpdateMode = VPUpdateNone; break; case VPUpdatePrevious: screen->moveViewport (screen->vp ().x () - origVp.x (), screen->vp ().y () - origVp.y (), true); lastSelectedVp = selectedVp; selectedVp = origVp; screen->focusDefaultWindow (); vpUpdateMode = VPUpdateNone; break; default: break; } screen->handleCompizEvent ("expo", "end_viewport_switch", o); if ((expoCam > 0.0f && expoCam < 1.0f) || dndState != DnDNone) cScreen->damageScreen (); if (expoCam == 1.0f) { foreach (float &vp, vpActivity) if (vp != 0.0 && vp != 1.0) cScreen->damageScreen (); } if (grabIndex && expoCam <= 0.0f && !expoMode) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; updateWraps (false); } cScreen->donePaint (); switch (dndState) { case DnDDuring: { if (dndWindow) dndWindow->move (newCursor.x () - prevCursor.x (), newCursor.y () - prevCursor.y (), optionGetExpoImmediateMove ()); prevCursor = newCursor; cScreen->damageScreen (); } break; case DnDStart: { int xOffset = screen->vpSize ().width () * screen->width (); int yOffset = screen->vpSize ().height () * screen->height (); dndState = DnDNone; bool inWindow; int nx, ny; CompWindow *w; for (CompWindowList::reverse_iterator iter = screen->windows ().rbegin (); iter != screen->windows ().rend (); ++iter) { w = *iter; CompRect input (w->inputRect ()); if (w->destroyed () || (!w->shaded () && !w->isViewable ())) continue; if (w->onAllViewports ()) { nx = (newCursor.x () + xOffset) % screen->width (); ny = (newCursor.y () + yOffset) % screen->height (); } else { nx = newCursor.x () - (screen->vp ().x () * screen->width ()); ny = newCursor.y () - (screen->vp ().y () * screen->height ()); } inWindow = (nx >= input.left () && nx <= input.right ()) || (nx >= (input.left () + xOffset) && nx <= (input.right () + xOffset)); inWindow &= (ny >= input.top () && ny <= input.bottom ()) || (ny >= (input.top () + yOffset) && ny <= (input.bottom () + yOffset)); if (!inWindow) continue; /* make sure we never move windows we're not allowed to move */ if (!w->managed ()) break; else if (!(w->actions () & CompWindowActionMoveMask)) break; else if (w->type () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) break; dndState = DnDDuring; dndWindow = w; w->grabNotify (nx, ny, 0, CompWindowGrabMoveMask | CompWindowGrabButtonMask); screen->updateGrab (grabIndex, screen->cursorCache (XC_fleur)); w->raise (); w->moveInputFocusTo (); break; } prevCursor = newCursor; } break; case DnDNone: screen->updateGrab (grabIndex, screen->normalCursor ()); break; default: break; } } static bool unproject (float winx, float winy, float winz, const GLMatrix &modelview, const GLMatrix &projection, const GLint viewport[4], float *objx, float *objy, float *objz) { GLMatrix finalMatrix = projection * modelview; float in[4], out[4]; if (!finalMatrix.invert ()) return false; in[0] = winx; in[1] = winy; in[2] = winz; in[3] = 1.0; /* Map x and y from window coordinates */ in[0] = (in[0] - viewport[0]) / viewport[2]; in[1] = (in[1] - viewport[1]) / viewport[3]; /* Map to range -1 to 1 */ in[0] = in[0] * 2 - 1; in[1] = in[1] * 2 - 1; in[2] = in[2] * 2 - 1; for (int i = 0; i < 4; ++i) { out[i] = in[0] * finalMatrix[i] + in[1] * finalMatrix[4 + i] + in[2] * finalMatrix[8 + i] + in[3] * finalMatrix[12 + i]; } if (out[3] == 0.0) return false; out[0] /= out[3]; out[1] /= out[3]; out[2] /= out[3]; *objx = out[0]; *objy = out[1]; *objz = out[2]; return true; } void ExpoScreen::invertTransformedVertex (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, CompOutput *output, int vertex[2]) { GLMatrix sTransform (transform); float p1[3], p2[3], v[3]; GLint viewport[4]; gScreen->glApplyTransform (attrib, output, &sTransform); sTransform.toScreenSpace (output, -attrib.zTranslate); glGetIntegerv (GL_VIEWPORT, viewport); unproject (vertex[0], screen->height () - vertex[1], 0, sTransform, *gScreen->projectionMatrix (), viewport, &p1[0], &p1[1], &p1[2]); unproject (vertex[0], screen->height () - vertex[1], -1.0, sTransform, *gScreen->projectionMatrix (), viewport, &p2[0], &p2[1], &p2[2]); for (int i = 0; i < 3; ++i) v[i] = p1[i] - p2[i]; float alpha = -p1[2] / v[2]; if (optionGetDeform () == DeformCurve && screen->desktopWindowCount ()) { const float screenWidth = static_cast (screen->width ()); const float screenWidthSquared = screenWidth * screenWidth; const float curveDistSquaredPlusQuarter = curveDistance * curveDistance + 0.25; const float pOne2MinusCurveDist = p1[2] - curveDistance; const float v0Squared = v[0] * v[0]; const float v2Squared = v[2] * v[2]; const float vsv = v2Squared * screenWidthSquared + v0Squared; const float p = (2.0 * screenWidthSquared * pOne2MinusCurveDist * v[2] + 2.0 * p1[0] * v[0] - v[0] * screenWidth) / vsv; const float q = (-screenWidthSquared * curveDistSquaredPlusQuarter + screenWidthSquared * pOne2MinusCurveDist * pOne2MinusCurveDist + 0.25 * screenWidthSquared + p1[0] * p1[0] - p1[0] * screenWidth) / vsv; const float rq = 0.25 * p * p - q; const float ph = -p * 0.5; if (rq < 0.0) { vertex[0] = -1000; vertex[1] = -1000; return; } else { alpha = ph + sqrt(rq); if (p1[2] + (alpha * v[2]) > 0.0) { vertex[0] = -1000; vertex[1] = -1000; return; } } } vertex[0] = ceil (p1[0] + (alpha * v[0])); vertex[1] = ceil (p1[1] + (alpha * v[1])); } void ExpoScreen::paintWall (const GLScreenPaintAttrib &attrib, const GLMatrix& transform, const CompRegion& region, CompOutput *output, unsigned int mask, bool reflection) { GLfloat vertexData[12]; GLushort colorData[16]; GLMatrix sTransformW, sTransform (transform); CompPoint vpSize (screen->vpSize ().width (), screen->vpSize ().height ()); /* amount of gap between viewports */ const float gapY = optionGetVpDistance () * 0.1f * expoCam; const float gapX = optionGetVpDistance () * 0.1f * screen->height () / screen->width () * expoCam; int glPaintTransformedOutputIndex = gScreen->glPaintTransformedOutputGetCurrentIndex (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); // Make sure that the base glPaintTransformedOutput function is called gScreen->glPaintTransformedOutputSetCurrentIndex (MAXSHORT); /* Zoom animation stuff */ /* camera position for the selected viewport */ GLVector vpCamPos (0, 0, 0, 1); /* camera position during expo mode */ GLVector expoCamPos (0, 0, 0, 1); float sx = screen->width () / static_cast (output->width ()); float sy = screen->height () / static_cast (output->height ()); if (optionGetDeform () == DeformCurve) vpCamPos[GLVector::x] = -sx * (0.5 - ((static_cast (output->x ()) + output->width () / 2.0) / static_cast (screen->width ()))); else vpCamPos[GLVector::x] = screen->vp ().x () * sx + 0.5 + output->x () / output->width () - vpSize.x () * 0.5 * sx + gapX * screen->vp ().x (); vpCamPos[GLVector::y] = -(screen->vp ().y () * sy + 0.5 + output->y () / output->height ()) + vpSize.y () * 0.5 * sy - gapY * screen->vp ().y (); float biasZ = MAX (vpSize.x () * sx, vpSize.y () * sy); if (optionGetDeform () == DeformTilt || optionGetReflection ()) biasZ *= (0.15 + optionGetDistance ()); else biasZ *= optionGetDistance (); float progress = sigmoidProgress (expoCam); if (optionGetDeform () != DeformCurve) expoCamPos[GLVector::x] = gapX * (vpSize.x () - 1) * 0.5; expoCamPos[GLVector::y] = -gapY * (vpSize.y () - 1) * 0.5; expoCamPos[GLVector::z] = -DEFAULT_Z_CAMERA + DEFAULT_Z_CAMERA * (MAX (vpSize.x () + (vpSize.x () - 1) * gapX, vpSize.y () + (vpSize.y () - 1) * gapY) + biasZ); /* interpolate between vpCamPos and expoCamPos */ GLVector cam; cam[GLVector::x] = vpCamPos[GLVector::x] * (1 - progress) + expoCamPos[GLVector::x] * progress; cam[GLVector::y] = vpCamPos[GLVector::y] * (1 - progress) + expoCamPos[GLVector::y] * progress; cam[GLVector::z] = vpCamPos[GLVector::z] * (1 - progress) + expoCamPos[GLVector::z] * progress; float aspectX = 1.0f, aspectY = 1.0f; if (vpSize.x () > vpSize.y ()) { aspectY = vpSize.x () / static_cast (vpSize.y ()); aspectY -= 1.0; aspectY *= -optionGetAspectRatio () + 1.0; aspectY *= progress; aspectY += 1.0; } else { aspectX = vpSize.y () / static_cast (vpSize.x ()); aspectX -= 1.0; aspectX *= -optionGetAspectRatio () + 1.0; aspectX *= progress; aspectX += 1.0; } /* End of Zoom animation stuff */ float rotation = 0.0f; if (optionGetDeform () == DeformTilt) { if (optionGetExpoAnimation () == ExpoAnimationZoom) rotation = 10.0 * sigmoidProgress (expoCam); else rotation = 10.0 * expoCam; } GLenum oldFilter = gScreen->textureFilter (); if (optionGetMipmaps ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); /* ALL TRANSFORMATION ARE EXECUTED FROM BOTTOM TO TOP */ float oScale = 1 / (1 + ((MAX (sx, sy) - 1) * progress)); sTransform.scale (oScale, oScale, 1.0); /* zoom out */ oScale = DEFAULT_Z_CAMERA / (cam[GLVector::z] + DEFAULT_Z_CAMERA); sTransform.scale (oScale, oScale, oScale); // glNormal3f (0.0, 0.0, -oScale); sTransform.translate (-cam[GLVector::x], -cam[GLVector::y], -cam[GLVector::z] - DEFAULT_Z_CAMERA); if (reflection) { float scaleFactor = optionGetScaleFactor (); sTransform.translate (0.0, (vpSize.y () + ((vpSize.y () - 1) * gapY * 2)) * -sy * aspectY, 0.0); sTransform.scale (1.0, -1.0, 1.0); sTransform.translate (0.0, - (1 - scaleFactor) / 2 * sy * aspectY * (vpSize.y () + ((vpSize.y () - 1) * gapY * 2)), 0.0); sTransform.scale (1.0, scaleFactor, 1.0); glCullFace (GL_FRONT); } /* rotate */ sTransform.rotate (rotation, 0.0f, 1.0f, 0.0f); sTransform.scale (aspectX, aspectY, 1.0); CompPoint offsetInScreenCoords (optionGetXOffset (), optionGetYOffset ()); float offsetInWorldCoordX, offsetInWorldCoordY, worldScaleFactorX, worldScaleFactorY; compiz::expo::calculateWallOffset (*output, offsetInScreenCoords, vpSize, *screen, offsetInWorldCoordX, offsetInWorldCoordY, worldScaleFactorX, worldScaleFactorY, sigmoidProgress (expoCam)); /* translate expo to center */ sTransform.translate (vpSize.x () * sx * -0.5 + offsetInWorldCoordX, vpSize.y () * sy * 0.5 - offsetInWorldCoordY, 0.0f); worldScaleFactorY -= (float)optionGetYBottomOffset () / (float)output->height (); sTransform.scale (worldScaleFactorX, worldScaleFactorY, 1.0f); if (optionGetDeform () == DeformCurve) sTransform.translate ((vpSize.x () - 1) * sx * 0.5, 0.0, 0.0); sTransformW = sTransform; /* revert prepareXCoords region shift. Now all screens display the same */ sTransform.translate (0.5f, -0.5f, DEFAULT_Z_CAMERA); if (vpSize.x () > 2) /* we can't have 90 degree for the left/right most viewport */ curveAngle = interpolate (359 / ((vpSize.x () - 1) * 2), 1, optionGetCurve ()); else curveAngle = interpolate (180 / vpSize.x (), 1, optionGetCurve ()); const float halfGapX = gapX / 2.0; curveDistance = ((0.5f * sx) + halfGapX) / tanf ((M_PI / 360.0f) * curveAngle); curveRadius = ((0.5f * sx) + halfGapX) / sinf ((M_PI / 360.0f) * curveAngle); expoActive = true; float rotateX, vpp; int vp; for (int j = 0; j < vpSize.y (); ++j) { GLMatrix sTransform2 (sTransform), sTransform3; for (int i = 0; i < vpSize.x (); ++i) { if (optionGetExpoAnimation () == ExpoAnimationVortex) sTransform2.rotate (360 * expoCam, 0.0f, 1.0f, 2.0f * expoCam); sTransform3 = sTransform2; sTransform3.translate ( output->x () / static_cast (output->width ()), -output->y () / static_cast (output->height ()), 0.0); cScreen->setWindowPaintOffset ((screen->vp ().x () - i) * screen->width (), (screen->vp ().y () - j) * screen->height ()); vp = (j * vpSize.x ()) + i; vpp = (expoCam * vpActivity[vp]) + (1 - expoCam); vpp = sigmoidProgress (vpp); vpBrightness = vpp + ((1.0 - vpp) * optionGetVpBrightness () / 100.0); vpSaturation = vpp + ((1.0 - vpp) * optionGetVpSaturation () / 100.0); paintingVp.set (i, j); if (optionGetDeform () == DeformCurve) { sTransform3.translate (-vpCamPos[GLVector::x], 0.0f, curveDistance - DEFAULT_Z_CAMERA); rotateX = -i + interpolate ((static_cast (vpSize.x ()) / 2.0) - 0.5, screen->vp ().x (), progress); sTransform3.rotate (curveAngle * rotateX, 0.0, 1.0, 0.0); sTransform3.translate (vpCamPos[GLVector::x], 0.0f, DEFAULT_Z_CAMERA - curveDistance); } gScreen->glPaintTransformedOutput (attrib, sTransform3, screen->region (), output, mask); if (!reflection) { int cursor[2] = { pointerX, pointerY }; invertTransformedVertex (attrib, sTransform3, output, cursor); if (cursor[0] > 0 && cursor[0] < static_cast (screen->width ()) && cursor[1] > 0 && cursor[1] < static_cast (screen->height ())) { newCursor.setX (i * screen->width () + cursor[0]); newCursor.setY (j * screen->height () + cursor[1]); if (anyClick || dndState != DnDNone) { /* Used to save last viewport interaction was in */ lastSelectedVp = selectedVp; selectedVp.set (i, j); anyClick = false; } } } /* not sure this will work with different resolutions */ if (optionGetDeform () != DeformCurve) sTransform2.translate (sx + gapX, 0.0f, 0.0); } /* not sure this will work with different resolutions */ sTransform.translate (0.0, -(sy + gapY), 0.0f); } // glNormal3f (0.0, 0.0, -1.0); if (reflection) { GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* just enable blending if it is disabled */ if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (optionGetDeform () != DeformCurve) { streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = 65535; colorData[4] = 0; colorData[5] = 0; colorData[6] = 0; colorData[7] = 32768; colorData[8] = 0; colorData[9] = 0; colorData[10] = 0; colorData[11] = 65535; colorData[12] = 0; colorData[13] = 0; colorData[14] = 0; colorData[15] = 32768; vertexData[0] = 0; vertexData[1] = 0; vertexData[2] = 0; vertexData[3] = 0; vertexData[4] = -vpSize.y () * (sy + gapY); vertexData[5] = 0; vertexData[6] = vpSize.x () * sx * (1.0 + gapX); vertexData[7] = 0; vertexData[8] = 0; vertexData[9] = vpSize.x () * sx * (1.0 + gapX); vertexData[10] = -vpSize.y () * sy * (1.0 + gapY); vertexData[11] = 0; streamingBuffer->addColors (4, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransformW); } else { GLMatrix cTransform; cTransform.translate (0.0, 0.0, -DEFAULT_Z_CAMERA); glCullFace (GL_BACK); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = (1.0 * expoCam) * 65535; colorData[4] = 0; colorData[5] = 0; colorData[6] = 0; colorData[7] = (1.0 * expoCam) * 65535; colorData[8] = 0; colorData[9] = 0; colorData[10] = 0; colorData[11] = (0.5 * expoCam) * 65535; colorData[12] = 0; colorData[13] = 0; colorData[14] = 0; colorData[15] = (0.5 * expoCam) * 65535; vertexData[0] = -0.5; vertexData[1] = -0.5; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = -0.5; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = 0; vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = 0; vertexData[11] = 0; streamingBuffer->addColors (4, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (cTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = (0.5 * expoCam) * 65535; colorData[4] = 0; colorData[5] = 0; colorData[6] = 0; colorData[7] = (0.5 * expoCam) * 65535; colorData[8] = 0; colorData[9] = 0; colorData[10] = 0; colorData[11] = 0; colorData[12] = 0; colorData[13] = 0; colorData[14] = 0; colorData[15] = 0; vertexData[0] = -0.5; vertexData[1] = 0; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = 0; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = 0.5; vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = 0.5; vertexData[11] = 0; streamingBuffer->addColors (4, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (cTransform); } glCullFace (GL_BACK); if (optionGetGroundSize () > 0.0) { float groundSize = optionGetGroundSize (); GLMatrix gTransform; gTransform.translate (0.0, 0.0, -DEFAULT_Z_CAMERA); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -0.5; vertexData[1] = -0.5; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = -0.5; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = -0.5 + groundSize; vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = -0.5 + groundSize; vertexData[11] = 0; streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (gTransform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); /* just disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); } expoActive = false; cScreen->setWindowPaintOffset (0, 0); gScreen->glPaintTransformedOutputSetCurrentIndex (glPaintTransformedOutputIndex); gScreen->setTextureFilter (oldFilter); } bool ExpoScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (expoCam > 0.0) mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_CLEAR_MASK; return gScreen->glPaintOutput (attrib, transform, region, output, mask); } void ExpoScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { expoActive = false; if (expoCam > 0) mask |= PAINT_SCREEN_CLEAR_MASK; if (optionGetExpoAnimation () == ExpoScreen::ExpoAnimationZoom) { vpBrightness = 0.0f; vpSaturation = 0.0f; } else { vpBrightness = (1.0f - sigmoidProgress (expoCam)); vpSaturation = (1.0f - sigmoidProgress (expoCam)); } if (expoCam <= 0 || (expoCam > 0.0 && expoCam < 1.0 && optionGetExpoAnimation () != ExpoAnimationZoom)) gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); else gScreen->clearOutput (output, GL_COLOR_BUFFER_BIT); mask &= ~PAINT_SCREEN_CLEAR_MASK; if (expoCam > 0.0) { if (optionGetReflection ()) paintWall (attrib, transform, region, output, mask, true); paintWall (attrib, transform, region, output, mask, false); anyClick = false; } } bool ExpoWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { if (eScreen->expoCam == 0.0f) return gWindow->glDraw (transform, attrib, region, mask); // Scaling factors to be applied to attrib later in glDrawTexture expoOpacity = 1.0f; int expoAnimation = eScreen->optionGetExpoAnimation (); if (eScreen->expoActive) { if (expoAnimation != ExpoScreen::ExpoAnimationZoom) expoOpacity = eScreen->expoCam; if (window->wmType () & CompWindowTypeDockMask && eScreen->optionGetHideDocks ()) { if (expoAnimation == ExpoScreen::ExpoAnimationZoom && eScreen->paintingVp == eScreen->selectedVp) expoOpacity = (1.0f - sigmoidProgress (eScreen->expoCam)); else expoOpacity = 0.0f; } } bool status = gWindow->glDraw (transform, attrib, region, mask); if (window->type () & CompWindowTypeDesktopMask && eScreen->optionGetSelectedColor ()[3] && // colour is visible mGlowQuads && eScreen->paintingVp == eScreen->selectedVp && region.numRects ()) { /* reset geometry and paint */ gWindow->vertexBuffer ()->begin (); gWindow->vertexBuffer ()->end (); paintGlow (transform, attrib, CompRegion::infinite (), mask); } return status; } static const unsigned short EXPO_GRID_SIZE = 100; void ExpoWindow::glAddGeometry (const GLTexture::MatrixList &matrices, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (eScreen->expoCam > 0.0 && screen->desktopWindowCount () && eScreen->optionGetDeform () == ExpoScreen::DeformCurve) { gWindow->glAddGeometry (matrices, region, clip, MIN (maxGridWidth, EXPO_GRID_SIZE), maxGridHeight); int stride = gWindow->vertexBuffer ()->getVertexStride (); int oldVCount = gWindow->vertexBuffer ()->countVertices (); GLfloat *v = gWindow->vertexBuffer ()->getVertices (); v += stride - 3; v += stride * oldVCount; CompPoint offset; if (!window->onAllViewports ()) { offset = eScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); } float ang; float lastX = -1000000000.0f; float lastZ = 0.0f; const float radSquare = pow (eScreen->curveDistance, 2) + 0.25; for (int i = oldVCount; i < gWindow->vertexBuffer ()->countVertices (); ++i) { if (v[0] == lastX) v[2] = lastZ; else if (v[0] + offset.x () >= -EXPO_GRID_SIZE && v[0] + offset.x () < screen->width () + EXPO_GRID_SIZE) { ang = ((v[0] + offset.x ()) / static_cast (screen->width ())) - 0.5; ang *= ang; if (ang < radSquare) { v[2] = eScreen->curveDistance - sqrt (radSquare - ang); v[2] *= sigmoidProgress (eScreen->expoCam); } } lastX = v[0]; lastZ = v[2]; v += stride; } } else gWindow->glAddGeometry (matrices, region, clip, maxGridWidth, maxGridHeight); } void ExpoWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { GLWindowPaintAttrib wAttrib (attrib); if (eScreen->expoCam > 0.0) { wAttrib.opacity *= expoOpacity; wAttrib.brightness *= eScreen->vpBrightness; wAttrib.saturation *= eScreen->vpSaturation; } if (eScreen->expoCam > 0.0 && eScreen->optionGetDeform () == ExpoScreen::DeformCurve && eScreen->gScreen->lighting () && screen->desktopWindowCount ()) { CompPoint offset; if (!window->onAllViewports ()) { offset = eScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); } GLVertexBuffer *vb = gWindow->vertexBuffer (); int stride = vb->getVertexStride (); GLfloat *v = vb->getVertices () + stride - 3; GLfloat normal[3]; int idx; float x; for (int i = 0; i < vb->countVertices (); ++i) { x = (v[0] + offset.x () - screen->width () / 2) * eScreen->curveAngle / screen->width (); while (x < 0) x += 360.0; idx = floor (x); normal[0] = -eScreen->vpNormals[idx * 3]; normal[1] = eScreen->vpNormals[(idx * 3) + 1]; normal[2] = eScreen->vpNormals[(idx * 3) + 2]; vb->addNormals (1, normal); v += stride; } /* I am not entirely certain if these ifdefs are necessary * since we should be doing normalization in the shader, * however I have them here for now */ #ifndef USE_GLES glEnable (GL_NORMALIZE); #endif gWindow->glDrawTexture (texture, transform, wAttrib, mask); #ifndef USE_GLES glDisable (GL_NORMALIZE); #endif } else { // glEnable (GL_NORMALIZE); gWindow->glDrawTexture (texture, transform, wAttrib, mask); // glDisable (GL_NORMALIZE); } } bool ExpoWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLMatrix wTransform (transform); if (eScreen->expoActive) { if (eScreen->expoCam > 0.0) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; float opacity = 1.0; bool zoomAnim = eScreen->optionGetExpoAnimation () == ExpoScreen::ExpoAnimationZoom; bool hide = eScreen->optionGetHideDocks () && (window->wmType () & CompWindowTypeDockMask); if (!zoomAnim) opacity = attrib.opacity * eScreen->expoCam; if (hide) { if (zoomAnim && eScreen->paintingVp == eScreen->selectedVp) opacity = attrib.opacity * (1 - sigmoidProgress (eScreen->expoCam)); else opacity = 0; } if (opacity <= 0) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; /* Stretch maximized windows a little so that you don't * have an awkward gap */ if (((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) && (eScreen->dndWindow != window)) { CompOutput *o = &screen->outputDevs ()[screen->outputDeviceForGeometry(window->geometry())]; float yS = 1.0 + ((o->height () / (float) window->height ()) - 1.0f) * sigmoidProgress (eScreen->expoCam); float xS = 1.0 + ((o->width () / (float) window->width ()) - 1.0f) * sigmoidProgress (eScreen->expoCam); wTransform.translate (window->x () + window->width (), window->y () + window->height () + eScreen->optionGetYBottomOffset (), 0.0f); wTransform.scale (xS, yS, 1.0f); wTransform.translate (-(window->x () + window->width ()), -(window->y () + window->height ()), 0.0f); } } return gWindow->glPaint (attrib, wTransform, region, mask); } bool ExpoWindow::damageRect (bool initial, const CompRect &rect) { if (eScreen->expoCam > 0.0f) eScreen->cScreen->damageScreen (); return cWindow->damageRect (initial, rect); } void ExpoWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { window->resizeNotify (dx, dy, dwidth, dheight); if (!(window->type () & CompWindowTypeDesktopMask)) { compLogMessage ("expo", CompLogLevelWarn, "Received a resizeNotify "\ "for a non-desktop window."); assert (window->type () & CompWindowTypeDesktopMask); return; } /* Desktop window was resized. Update our glowQuads. */ foreach (GLTexture *tex, eScreen->outline_texture) { GLTexture::Matrix mat = tex->matrix (); computeGlowQuads (&mat); } } #define EXPOINITBIND(opt, func) \ optionSet##opt##Initiate (boost::bind (&ExpoScreen::func, \ this, _1, _2, _3)); #define EXPOTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&ExpoScreen::func, \ this, _1, _2, _3)); ExpoScreen::ExpoScreen (CompScreen *s) : PluginClassHandler (s), ExpoOptions (), cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), expoCam (0.0f), expoActive (false), expoMode (false), dndState (DnDNone), dndWindow (NULL), origVp (s->vp ()), selectedVp (s->vp ()), lastSelectedVp (s->vp ()), vpUpdateMode (VPUpdateNone), clickTime (0), doubleClick (false), vpNormals (360 * 3), grabIndex (0), mGlowTextureProperties (&glowTextureProperties) { leftKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Left")); rightKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Right")); upKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Up")); downKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Down")); EXPOINITBIND (ExpoKey, doExpo); EXPOTERMBIND (ExpoKey, termExpo); EXPOINITBIND (ExpoButton, doExpo); EXPOTERMBIND (ExpoButton, termExpo); EXPOINITBIND (ExpoEdge, doExpo); EXPOTERMBIND (ExpoButton, termExpo); EXPOINITBIND (DndButton, dndInit); EXPOTERMBIND (DndButton, dndFini); EXPOINITBIND (ExitButton, exitExpo); EXPOINITBIND (NextVpButton, nextVp); EXPOINITBIND (PrevVpButton, prevVp); ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); outline_texture = GLTexture::imageDataToTexture (mGlowTextureProperties->textureData, CompSize (mGlowTextureProperties->textureSize, mGlowTextureProperties->textureSize), GL_RGBA, GL_UNSIGNED_BYTE); } ExpoWindow::ExpoWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), eScreen (ExpoScreen::get (screen)), mGlowQuads (NULL), expoOpacity (1.0f) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); if (window->type () & CompWindowTypeDesktopMask) { foreach (GLTexture *tex, eScreen->outline_texture) { GLTexture::Matrix mat = tex->matrix (); computeGlowQuads (&mat); } window->resizeNotifySetEnabled (this, true); } } ExpoWindow::~ExpoWindow () { computeGlowQuads (NULL); } bool ExpoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/expo/src/glow.h0000644000004100000410000000347613246301623015621 0ustar www-datawww-data/** * * Compiz group plugin * * glow.h * * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen, * Danny Baumann, Sam Spilsbury * Authors: Patrick Niklaus * Roi Cohen * Danny Baumann * Sam Spilsbury * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _EXPO_GLOW_H #define _EXPO_GLOW_H #define GLOWQUAD_TOPLEFT 0 #define GLOWQUAD_TOPRIGHT 1 #define GLOWQUAD_BOTTOMLEFT 2 #define GLOWQUAD_BOTTOMRIGHT 3 #define GLOWQUAD_TOP 4 #define GLOWQUAD_BOTTOM 5 #define GLOWQUAD_LEFT 6 #define GLOWQUAD_RIGHT 7 #define NUM_GLOWQUADS 8 /* Represents a particular glow texture, so here * we have hardcoded in the texture data, the offset * and the size of the texture */ typedef struct _GlowTextureProperties { char *textureData; int textureSize; int glowOffset; } GlowTextureProperties; /* Each glow quad contains a 2x2 scale + positional matrix * (the 3rd column is not used since that is for matrix skew * operations which we do not care about) * and also a CompRect which describes the size and position of * the quad on the glow */ class GlowQuad { public: CompRect mBox; GLTexture::Matrix mMatrix; }; extern const GlowTextureProperties glowTextureProperties; #endif ./plugins/composite/0000755000004100000410000000000013246301624014727 5ustar www-datawww-data./plugins/composite/CMakeLists.txt0000644000004100000410000000111713246301623017466 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/pixmapbinding/include) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/backbuffertracking/include) link_directories (${CMAKE_CURRENT_BINARY_DIR}/src/pixmapbinding) link_directories (${CMAKE_CURRENT_BINARY_DIR}/src/backbuffertracking) compiz_plugin (composite LIBRARIES compiz_composite_pixmapbinding compiz_composite_backbuffertracking) add_subdirectory (src/pixmapbinding) add_subdirectory (src/backbuffertracking) ./plugins/composite/include/0000755000004100000410000000000013246301623016351 5ustar www-datawww-data./plugins/composite/include/composite/0000755000004100000410000000000013246301624020354 5ustar www-datawww-data./plugins/composite/include/composite/agedamagequery.h0000644000004100000410000000334213246301623023507 0ustar www-datawww-data/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_COMPOSITE_AGEDAMAGEQUERY_H #define _COMPIZ_COMPOSITE_AGEDAMAGEQUERY_H #include #include namespace compiz { namespace composite { namespace buffertracking { class AgeDamageQuery { public: typedef boost::shared_ptr Ptr; typedef boost::function AreaShouldBeMarkedDirty; virtual ~AgeDamageQuery () {} virtual CompRegion damageForFrameAge (unsigned int) = 0; virtual const CompRegion & currentFrameDamage () = 0; }; } } } #endif ./plugins/composite/include/composite/composite.h0000644000004100000410000003210213246301623022524 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPIZ_COMPOSITE_H #define _COMPIZ_COMPOSITE_H #include #define COMPIZ_COMPOSITE_ABI 6 #include "core/pluginclasshandler.h" #include "core/timer.h" #include "core/output.h" #include "core/screen.h" #include "core/wrapsystem.h" #include "composite/agedamagequery.h" #define COMPOSITE_SCREEN_DAMAGE_PENDING_MASK (1 << 0) #define COMPOSITE_SCREEN_DAMAGE_REGION_MASK (1 << 1) #define COMPOSITE_SCREEN_DAMAGE_ALL_MASK (1 << 2) #define OPAQUE 0xffff #define COLOR 0xffff #define BRIGHT 0xffff /** * Used to indicate only part of the screen is being redrawn */ #define PAINT_SCREEN_REGION_MASK (1 << 0) /** * Used to indicate that the whole screen is being redrawn */ #define PAINT_SCREEN_FULL_MASK (1 << 1) /** * Used to indicate that every window on this screen will be * transformed, so non-painted areas should be * double-buffered */ #define PAINT_SCREEN_TRANSFORMED_MASK (1 << 2) /** * Used to indicate that some windows on this screen will * be drawn transformed */ #define PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK (1 << 3) /** * Used to indicate that nothing is being drawn on this pass */ #define PAINT_SCREEN_CLEAR_MASK (1 << 4) /** * Used to indicate that occlusion detection is not in use * on this pass */ #define PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK (1 << 5) /** * Used to indicate that no background will be drawn on this * pass */ #define PAINT_SCREEN_NO_BACKGROUND_MASK (1 << 6) typedef enum { CompositeFPSLimiterModeDisabled = 0, CompositeFPSLimiterModeDefault, CompositeFPSLimiterModeVSyncLike } CompositeFPSLimiterMode; class PrivateCompositeScreen; class PrivateCompositeWindow; class CompositeScreen; class CompositeWindow; namespace compiz { namespace composite { class PaintHandler { public: virtual ~PaintHandler () {}; virtual void paintOutputs (CompOutput::ptrList &outputs, unsigned int mask, const CompRegion ®ion) = 0; virtual bool hasVSync () { return false; }; virtual bool requiredForcedRefreshRate () { return false; }; virtual void prepareDrawing () {}; virtual bool compositingActive () { return false; }; virtual unsigned int getFrameAge () { return 1; } }; } } class CompositeScreenInterface; extern template class WrapableInterface; /** * Wrapable function interface for CompositeScreen */ class CompositeScreenInterface : public WrapableInterface { public: /** * Hook which activates just before the screen is painted, * plugins should use this to calculate animation parameters * * @param msSinceLastPaint Describes how many milliseconds have passed * since the last screen repaint */ virtual void preparePaint (int); /** * Hook which activates right after the screen is painted, * plugins should use this to run post-paint cleanup, damage handling * and setting next paint variables * */ virtual void donePaint (); /** * Hookable function which dispatches painting of outputs * to rendering plugins such as OpenGL. Hook this function * to change which outputs are painted, or to paint them * manually if you are rendering */ virtual void paint (CompOutput::ptrList &outputs, unsigned int); /** * Hookable function which gets a list of windows that need to be * evaluated for repainting */ virtual const CompWindowList & getWindowPaintList (); /** * Hookable function to register a new paint handler, overload * and insert your own paint handler if you want to prevent * another one from being loaded */ virtual bool registerPaintHandler (compiz::composite::PaintHandler *pHnd); /** * Hookable function to notify unregistration of a paint handler * */ virtual void unregisterPaintHandler (); /** * Hookable function to damage regions directly */ virtual void damageRegion (const CompRegion &r); /** * Hookable function to notify plugins that the last damage * event for this frame has been received, and all further damage * events will be for the next frame */ virtual void damageCutoff (); }; extern template class PluginClassHandler; class CompositeScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: CompositeScreen (CompScreen *s); ~CompositeScreen (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); bool compositingActive (); /** * Returns the value of an XDamage Extension event signature */ int damageEvent (); /** * Causes the entire screen to be redrawn on the next * event loop */ void damageScreen (); void damagePending (); /** * Causes the damage that was recorded on N - 1 number of * frames ago to be added to the current frame, applied * culmulatively. An age of "zero" means that the entire frame * is considered undefined and must be completely repaired, * wheras an age of 1 means that this frame is the same as the * last frame, so no damage is required. */ void applyDamageForFrameAge (unsigned int); unsigned int getFrameAge (); /** * @brief recordDamageOnCurrentFrame * * Causes damage to be recorded on one-frame ago. Ideally this * should be used in the case where damage was already recorded * for a frame, but due to an unforeseen circumstance at the time * additional painting area needed to be allocated at paint-time. */ void recordDamageOnCurrentFrame (const CompRegion &); typedef compiz::composite::buffertracking::AgeDamageQuery DamageQuery; typedef DamageQuery::AreaShouldBeMarkedDirty AreaShouldBeMarkedDirty; DamageQuery::Ptr getDamageQuery (AreaShouldBeMarkedDirty callback = AreaShouldBeMarkedDirty ()); unsigned int damageMask (); const CompRegion & currentDamage () const; void showOutputWindow (); void hideOutputWindow (); void updateOutputWindow (); bool outputWindowChanged () const; Window overlay (); Window output (); int & overlayWindowCount (); void setWindowPaintOffset (int x, int y); CompPoint windowPaintOffset (); /** * Limits the number of redraws per second */ void setFPSLimiterMode (CompositeFPSLimiterMode newMode); CompositeFPSLimiterMode FPSLimiterMode (); int redrawTime (); int optimalRedrawTime (); bool handlePaintTimeout (); WRAPABLE_HND (0, CompositeScreenInterface, void, preparePaint, int); WRAPABLE_HND (1, CompositeScreenInterface, void, donePaint); WRAPABLE_HND (2, CompositeScreenInterface, void, paint, CompOutput::ptrList &outputs, unsigned int); WRAPABLE_HND (3, CompositeScreenInterface, const CompWindowList &, getWindowPaintList); WRAPABLE_HND (4, CompositeScreenInterface, bool, registerPaintHandler, compiz::composite::PaintHandler *); WRAPABLE_HND (5, CompositeScreenInterface, void, unregisterPaintHandler); /** * Adds a specific region to be redrawn on the next * event loop */ WRAPABLE_HND (6, CompositeScreenInterface, void, damageRegion, const CompRegion &); WRAPABLE_HND (7, CompositeScreenInterface, void, damageCutoff); friend class PrivateCompositeDisplay; private: PrivateCompositeScreen *priv; public: static bool toggleSlowAnimations (CompAction *action, CompAction::State state, CompOption::Vector &options); }; /* window paint flags bit 1-16 are used for read-only flags and they provide information that describe the screen rendering pass currently in process. bit 17-32 are writable flags and they provide information that is used to optimize rendering. */ /** * this flag is present when window is being painted * on a transformed screen. */ #define PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK (1 << 0) /** * this flag is present when window is being tested * for occlusion of other windows. */ #define PAINT_WINDOW_OCCLUSION_DETECTION_MASK (1 << 1) /** * this flag indicates that the window ist painted with * an offset */ #define PAINT_WINDOW_WITH_OFFSET_MASK (1 << 2) /** * flag indicate that window is translucent. */ #define PAINT_WINDOW_TRANSLUCENT_MASK (1 << 16) /** * flag indicate that window is transformed. */ #define PAINT_WINDOW_TRANSFORMED_MASK (1 << 17) /** * flag indicate that core PaintWindow function should * not draw this window. */ #define PAINT_WINDOW_NO_CORE_INSTANCE_MASK (1 << 18) /** * flag indicate that blending is required. */ #define PAINT_WINDOW_BLEND_MASK (1 << 19) class CompositeWindowInterface; extern template class WrapableInterface; class CompositeWindowInterface : public WrapableInterface { public: /** * Hookable function to determine which parts of the * screen for this window to redraw on the next pass * * @param initial Indicates if this is the first time * this window is being redrawn * @param rect Reference to a rect which describes which * parts of the screen need to be redrawn on next pass */ virtual bool damageRect (bool initial, const CompRect &rect); }; extern template class PluginClassHandler; class CompositeWindow : public WrapableHandler, public PluginClassHandler { public: CompositeWindow (CompWindow *w); ~CompositeWindow (); /** * Binds the window contents of this window to some offscreen pixmap */ bool bind (); /** * Releases the pixmap data for this window with XFreePixmap. */ void release (); /** * Returns the window pixmap */ Pixmap pixmap (); /** * Pixmap size at the time the pixmap was last bound */ const CompSize & size (); /** * Forces this window to be composited so that the X Server * stops drawing it and all output is redirected to an * offscreen pixmap */ void redirect (); /** * Stops this window from being composited, so that the X Server * draws the window on-screen normally and output is not redirected * to an offscreen pixmap */ void unredirect (); /** * Returns true if a window is redirected */ bool redirected (); bool overlayWindow (); /** * Returns true if pixmap updates are frozen */ bool frozen (); void damageTransformedRect (float xScale, float yScale, float xTranslate, float yTranslate, const CompRect &rect); void damageOutputExtents (); /** * Causes an area of the window to be redrawn on the * next event loop */ void addDamageRect (const CompRect &); /** * Causes the window to be redrawn on the next * event loop */ void addDamage (bool force = false); /** * Returns true if this window will be redrawn or * partially redrawn on the next event loop */ bool damaged (); /** * Sets screen redraw hints for "damaged" areas * as stated by XDamageNotifyEvent * * @param de An XDamageNotifyEvent to be used to * calculate areas to redraw on the next event loop */ void processDamage (XDamageNotifyEvent *de); void updateOpacity (); void updateBrightness (); void updateSaturation (); /** * Returns the window opacity */ unsigned short opacity (); /** * Returns the window brightness */ unsigned short brightness (); /** * Returns the window saturation */ unsigned short saturation (); /** * A function to call when a new pixmap is ready to * be bound just before the old one is released */ void setNewPixmapReadyCallback (const boost::function &cb); WRAPABLE_HND (0, CompositeWindowInterface, bool, damageRect, bool, const CompRect &); friend class PrivateCompositeWindow; friend class CompositeScreen; private: PrivateCompositeWindow *priv; }; #endif ./plugins/composite/src/0000755000004100000410000000000013246301624015516 5ustar www-datawww-data./plugins/composite/src/window.cpp0000644000004100000410000003354113246301623017536 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include "privates.h" template class WrapableInterface; template class PluginClassHandler; CompositeWindow::CompositeWindow (CompWindow *w) : PluginClassHandler (w), priv (new PrivateCompositeWindow (w, this)) { CompScreen *s = screen; if (w->windowClass () != InputOnly) priv->damage = XDamageCreate (s->dpy (), w->id (), XDamageReportBoundingBox); else priv->damage = None; priv->opacity = OPAQUE; if (!(w->type () & CompWindowTypeDesktopMask)) priv->opacity = s->getWindowProp32 (w->id (), Atoms::winOpacity, OPAQUE); priv->brightness = s->getWindowProp32 (w->id (), Atoms::winBrightness, BRIGHT); priv->saturation = s->getWindowProp32 (w->id (), Atoms::winSaturation, COLOR); if (w->isViewable ()) priv->damaged = true; } CompositeWindow::~CompositeWindow () { if (priv->damage) XDamageDestroy (screen->dpy (), priv->damage); if (!priv->redirected) { priv->cScreen->overlayWindowCount ()--; if (priv->cScreen->overlayWindowCount () < 1) priv->cScreen->showOutputWindow (); } release (); addDamage (); if (lastDamagedWindow == priv->window) lastDamagedWindow = NULL; delete priv; } void PrivateCompositeWindow::setNewPixmapReadyCallback (const PixmapBinding::NewPixmapReadyCallback &cb) { mPixmapBinding.setNewPixmapReadyCallback (cb); } void CompositeWindow::setNewPixmapReadyCallback (const PixmapBinding::NewPixmapReadyCallback &cb) { priv->setNewPixmapReadyCallback (cb); } void PrivateCompositeWindow::allowFurtherRebindAttempts () { mPixmapBinding.allowFurtherRebindAttempts (); } PrivateCompositeWindow::PrivateCompositeWindow (CompWindow *w, CompositeWindow *cw) : window (w), cWindow (cw), cScreen (CompositeScreen::get (screen)), mPixmapBinding (boost::function (), this, this, this, screen->serverGrabInterface ()), damage (None), damaged (false), redirected (cScreen->compositingActive ()), overlayWindow (false), opacity (OPAQUE), brightness (BRIGHT), saturation (COLOR) { WindowInterface::setHandler (w); } bool PrivateCompositeWindow::bind () { return mPixmapBinding.bind (); } bool CompositeWindow::bind () { if (!priv->cScreen->compositingActive ()) return false; redirect (); return priv->bind (); } void PrivateCompositeWindow::release () { mPixmapBinding.release (); } void CompositeWindow::release () { return priv->release (); } Pixmap PrivateCompositeWindow::pixmap () const { return mPixmapBinding.pixmap (); } WindowPixmapInterface::Ptr PrivateCompositeWindow::getPixmap () { Pixmap pixmap = XCompositeNameWindowPixmap (screen->dpy (), ROOTPARENT (window)); WindowPixmapInterface::Ptr p (new X11WindowPixmap (screen->dpy (), pixmap)); return p; } bool PrivateCompositeWindow::getAttributes (XWindowAttributes &attr) { return window->queryFrameAttributes (attr); } bool PrivateCompositeWindow::frozen () { /* keep old pixmap for windows that are unmapped on the client side, * but not yet on our side as it's pretty likely that plugins are * currently using it for animations */ bool pendingUnmap = !window->mapNum () && window->isViewable (); bool hidden = window->state () & CompWindowStateHiddenMask; bool animated = window->hasUnmapReference (); return (pendingUnmap || hidden) && animated; } Pixmap CompositeWindow::pixmap () { return priv->pixmap (); } const CompSize & PrivateCompositeWindow::size () const { return mPixmapBinding.size (); } const CompSize & CompositeWindow::size () { return priv->size (); } void CompositeWindow::redirect () { if (priv->redirected || !priv->cScreen->compositingActive ()) return; XCompositeRedirectWindow (screen->dpy (), ROOTPARENT (priv->window), CompositeRedirectManual); priv->redirected = true; if (priv->overlayWindow) { priv->cScreen->overlayWindowCount ()--; priv->overlayWindow = false; } if (priv->cScreen->overlayWindowCount () < 1) priv->cScreen->showOutputWindow (); else priv->cScreen->updateOutputWindow (); } void CompositeWindow::unredirect () { if (!priv->redirected || !priv->cScreen->compositingActive ()) return; release (); priv->redirected = false; priv->overlayWindow = true; priv->cScreen->overlayWindowCount ()++; if (priv->cScreen->overlayWindowCount () > 0) priv->cScreen->updateOutputWindow (); XCompositeUnredirectWindow (screen->dpy (), ROOTPARENT (priv->window), CompositeRedirectManual); } bool CompositeWindow::redirected () { return priv->redirected; } bool CompositeWindow::overlayWindow () { return priv->overlayWindow; } bool CompositeWindow::frozen () { return priv->frozen (); } void CompositeWindow::damageTransformedRect (float xScale, float yScale, float xTranslate, float yTranslate, const CompRect &rect) { int x1 = (short) (rect.x1 () * xScale) - 1; int y1 = (short) (rect.y1 () * yScale) - 1; int x2 = (short) (rect.x2 () * xScale + 0.5f) + 1; int y2 = (short) (rect.y2 () * yScale + 0.5f) + 1; x1 += (short) xTranslate; y1 += (short) yTranslate; x2 += (short) (xTranslate + 0.5f); y2 += (short) (yTranslate + 0.5f); if (x2 > x1 && y2 > y1) { const CompWindow::Geometry &geom = priv->window->serverGeometry (); x1 += geom.x () + geom.border (); y1 += geom.y () + geom.border (); x2 += geom.x () + geom.border (); y2 += geom.y () + geom.border (); priv->cScreen->damageRegion (CompRegion (CompRect (x1, y1, x2 - x1, y2 - y1))); } } void CompositeWindow::damageOutputExtents () { if (priv->cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; if (priv->window->shaded () || (priv->window->isViewable ())) { const CompWindow::Geometry &geom = priv->window->geometry (); const CompWindowExtents &output = priv->window->output (); /* top */ int x1 = -output.left - geom.border (); int y1 = -output.top - geom.border (); int x2 = priv->window->size ().width () + output.right; int y2 = -geom.border (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); /* bottom */ y1 = priv->window->size ().height (); y2 = y1 + output.bottom - geom.border (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); /* left */ x1 = -output.left - geom.border (); y1 = -geom.border (); x2 = -geom.border (); y2 = priv->window->size ().height (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); /* right */ x1 = priv->window->size ().width (); x2 = x1 + output.right - geom.border (); if (x1 < x2 && y1 < y2) addDamageRect (CompRect (x1, y1, x2 - x1, y2 - y1)); } } void CompositeWindow::addDamageRect (const CompRect &rect) { if (priv->cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; if (!damageRect (false, rect)) { int x = rect.x (); int y = rect.y (); const CompWindow::Geometry &geom = priv->window->geometry (); x += geom.x () + geom.border (); y += geom.y () + geom.border (); priv->cScreen->damageRegion (CompRegion (CompRect (x, y, rect.width (), rect.height ()))); } } void CompositeWindow::addDamage (bool force) { if (priv->cScreen->damageMask () & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; if (priv->window->shaded () || force || (priv->window->isViewable ())) { int border = priv->window->serverGeometry ().border (); int x1 = -MAX (priv->window->output ().left, priv->window->input ().left) - border; int y1 = -MAX (priv->window->output ().top, priv->window->input ().top) - border; int x2 = priv->window->size ().width () + MAX (priv->window->output ().right, priv->window->input ().right) ; int y2 = priv->window->size ().height () + MAX (priv->window->output ().bottom, priv->window->input ().bottom) ; CompRect r (x1, y1, x2 - x1, y2 - y1); addDamageRect (r); } } bool CompositeWindow::damaged () { return priv->damaged; } void CompositeWindow::processDamage (XDamageNotifyEvent *de) { if (priv->window->syncWait ()) priv->damageRects.push_back (de->area); else priv->handleDamageRect (this, de->area); } void PrivateCompositeWindow::handleDamageRect (CompositeWindow *w, XRectangle const& rect) { if (!w->priv->redirected) return; bool initial = false; if (!w->priv->damaged) w->priv->damaged = initial = true; if (!w->damageRect (initial, CompRect (rect.x, rect.y, rect.width, rect.height))) { const CompWindow::Geometry &geom = w->priv->window->geometry (); int x = rect.x + geom.x () + geom.border (); int y = rect.y + geom.y () + geom.border (); w->priv->cScreen->damageRegion (CompRegion (CompRect (x, y, rect.width, rect.height))); } if (initial) w->damageOutputExtents (); } void CompositeWindow::updateOpacity () { if (priv->window->type () & CompWindowTypeDesktopMask) return; unsigned short opacity = screen->getWindowProp32 (priv->window->id (), Atoms::winOpacity, OPAQUE); if (opacity != priv->opacity) { priv->opacity = opacity; addDamage (); } } void CompositeWindow::updateBrightness () { unsigned short brightness = screen->getWindowProp32 (priv->window->id (), Atoms::winBrightness, BRIGHT); if (brightness != priv->brightness) { priv->brightness = brightness; addDamage (); } } void CompositeWindow::updateSaturation () { unsigned short saturation = screen->getWindowProp32 (priv->window->id (), Atoms::winSaturation, COLOR); if (saturation != priv->saturation) { priv->saturation = saturation; addDamage (); } } unsigned short CompositeWindow::opacity () { return priv->opacity; } unsigned short CompositeWindow::brightness () { return priv->brightness; } unsigned short CompositeWindow::saturation () { return priv->saturation; } bool CompositeWindow::damageRect (bool initial, const CompRect &rect) { WRAPABLE_HND_FUNCTN_RETURN (bool, damageRect, initial, rect) return false; } void PrivateCompositeWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyMap: allowFurtherRebindAttempts (); damaged = false; break; case CompWindowNotifyUnmap: cWindow->addDamage (true); cWindow->release (); if (!redirected && cScreen->compositingActive ()) cWindow->redirect (); break; case CompWindowNotifyRestack: case CompWindowNotifyHide: case CompWindowNotifyShow: case CompWindowNotifyAliveChanged: cWindow->addDamage (true); break; case CompWindowNotifyReparent: case CompWindowNotifyUnreparent: if (redirected) cWindow->release (); cScreen->damageScreen (); cWindow->addDamage (true); break; case CompWindowNotifyFrameUpdate: cWindow->release (); break; case CompWindowNotifySyncAlarm: { for (XRectangle const& rect : damageRects) PrivateCompositeWindow::handleDamageRect (cWindow, rect); damageRects.clear(); break; } default: break; } window->windowNotify (n); } void PrivateCompositeWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { window->resizeNotify (dx, dy, dwidth, dheight); if (window->shaded () || (window->isViewable ())) { int x = window->geometry ().x (); int y = window->geometry ().y (); int x1 = x - window->output ().left - dx; int y1 = y - window->output ().top - dy; int x2 = x + window->size ().width () + window->output ().right - dx - dwidth; int y2 = y + window->size ().height () + window->output ().bottom - dy - dheight; cScreen->damageRegion (CompRegion (CompRect (x1, y1, x2 - x1, y2 - y1))); } cWindow->release (); cWindow->addDamage (); } void PrivateCompositeWindow::moveNotify (int dx, int dy, bool now) { if (window->shaded () || (window->isViewable ())) { int x = window->geometry ().x (); int y = window->geometry ().y (); int x1 = x - window->output ().left - dx; int y1 = y - window->output ().top - dy; int x2 = x + window->geometry ().width () + window->output ().right - dx; int y2 = y + window->geometry ().height () + window->output ().bottom - dy; cScreen->damageRegion (CompRegion (CompRect (x1, y1, x2 - x1, y2 - y1))); } cWindow->addDamage (); window->moveNotify (dx, dy, now); } bool CompositeWindowInterface::damageRect (bool initial, const CompRect &rect) WRAPABLE_DEF (damageRect, initial, rect) ./plugins/composite/src/pixmapbinding/0000755000004100000410000000000013246301623020346 5ustar www-datawww-data./plugins/composite/src/pixmapbinding/CMakeLists.txt0000644000004100000410000000147313246301623023113 0ustar www-datawww-datainclude (FindPkgConfig) PKG_CHECK_MODULES (X11 x11) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${X11_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/pixmapbinding.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/pixmapbinding.cpp ${compiz_SOURCE_DIR}/src/size.cpp # XXX: Remove once we've merged this into a general geometry lib ) ADD_LIBRARY( compiz_composite_pixmapbinding STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_composite_pixmapbinding compiz_servergrab ${X11_LIBRARIES} ) ./plugins/composite/src/pixmapbinding/include/0000755000004100000410000000000013246301624021772 5ustar www-datawww-data./plugins/composite/src/pixmapbinding/include/pixmapbinding.h0000644000004100000410000001062113246301623024773 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #ifndef _COMPOSITE_PIXMAP_REBIND_H #define _COMPOSITE_PIXMAP_REBIND_H #include #include #include #include #include #include class ServerGrabInterface; class CompositePixmapRebindInterface { public: virtual ~CompositePixmapRebindInterface () {} virtual Pixmap pixmap () const = 0; virtual bool bind () = 0; virtual const CompSize & size () const = 0; virtual void release () = 0; /* This isn't great API, but probably necessary * unless we make it a requirement that the * renderer sets the strategy for the rebinder */ virtual void setNewPixmapReadyCallback (const boost::function &) = 0; /* Also don't like this either */ virtual void allowFurtherRebindAttempts () = 0; }; class PixmapFreezerInterface { public: virtual ~PixmapFreezerInterface () {} virtual bool frozen () = 0; }; class WindowAttributesGetInterface { public: virtual ~WindowAttributesGetInterface () {} virtual bool getAttributes (XWindowAttributes &) = 0; }; class WindowPixmapInterface { public: virtual ~WindowPixmapInterface () {} typedef boost::shared_ptr Ptr; virtual Pixmap pixmap () const = 0; virtual void releasePixmap () = 0; }; class X11WindowPixmap : public WindowPixmapInterface { public: X11WindowPixmap (Display *d, Pixmap p) : mDisplay (d), mPixmap (p) { } Pixmap pixmap () const { return mPixmap; } void releasePixmap () { if (mPixmap) XFreePixmap (mDisplay, mPixmap); mPixmap = None; } private: Display *mDisplay; Pixmap mPixmap; }; class WindowPixmap { public: WindowPixmap () : mPixmap () { } WindowPixmap (WindowPixmapInterface::Ptr &pm) : mPixmap (pm) { } Pixmap pixmap () const { if (mPixmap) return mPixmap->pixmap (); return None; } ~WindowPixmap () { if (mPixmap) mPixmap->releasePixmap (); } private: WindowPixmapInterface::Ptr mPixmap; }; class WindowPixmapGetInterface { public: virtual ~WindowPixmapGetInterface () {} virtual WindowPixmapInterface::Ptr getPixmap () = 0; }; class PixmapBinding : public CompositePixmapRebindInterface { public: typedef boost::function NewPixmapReadyCallback; PixmapBinding (const NewPixmapReadyCallback &, WindowPixmapGetInterface *, WindowAttributesGetInterface *, PixmapFreezerInterface *, ServerGrabInterface *); ~PixmapBinding (); Pixmap pixmap () const; bool bind (); const CompSize & size () const; void release (); void setNewPixmapReadyCallback (const boost::function &); void allowFurtherRebindAttempts (); private: std::auto_ptr mPixmap; CompSize mSize; bool needsRebind; bool bindFailed; NewPixmapReadyCallback newPixmapReadyCallback; WindowPixmapGetInterface *windowPixmapRetreiver; WindowAttributesGetInterface *windowAttributesRetreiver; PixmapFreezerInterface *pixmapFreezer; ServerGrabInterface *serverGrab; }; #endif ./plugins/composite/src/pixmapbinding/src/0000755000004100000410000000000013246301624021136 5ustar www-datawww-data./plugins/composite/src/pixmapbinding/src/pixmapbinding.cpp0000644000004100000410000000733613246301623024503 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #include #include "pixmapbinding.h" PixmapBinding::PixmapBinding (const NewPixmapReadyCallback &cb, WindowPixmapGetInterface *pmg, WindowAttributesGetInterface *wag, PixmapFreezerInterface *pf, ServerGrabInterface *sg) : mPixmap (), mSize (), needsRebind (true), bindFailed (false), newPixmapReadyCallback (cb), windowPixmapRetreiver (pmg), windowAttributesRetreiver (wag), pixmapFreezer (pf), serverGrab (sg) { } PixmapBinding::~PixmapBinding () { needsRebind = false; } const CompSize & PixmapBinding::size () const { return mSize; } Pixmap PixmapBinding::pixmap () const { static Pixmap nPixmap = None; if (needsRebind || !mPixmap.get ()) return nPixmap; return mPixmap->pixmap (); } bool PixmapBinding::bind () { /* don't try to bind window again if it failed previously */ if (bindFailed) return false; if (needsRebind) { XWindowAttributes attr; /* We have to grab the server here to make sure that window is mapped when getting the window pixmap */ ServerLock mLock (serverGrab); windowAttributesRetreiver->getAttributes (attr); if (attr.map_state != IsViewable || (attr.width == 0 && attr.border_width == 0) || (attr.height == 0 && attr.border_width == 0)) { bindFailed = true; needsRebind = false; return false; } WindowPixmapInterface::Ptr newPixmap = windowPixmapRetreiver->getPixmap (); CompSize newSize = CompSize (attr.border_width * 2 + attr.width, attr.border_width * 2 + attr.height); if (newPixmap->pixmap () && newSize.width () && newSize.height ()) { /* Notify renderer that a new pixmap is about to * be bound */ if (newPixmapReadyCallback) newPixmapReadyCallback (); /* Assign new pixmap */ std::auto_ptr newPixmapWrapper (new WindowPixmap (newPixmap)); mPixmap = newPixmapWrapper; mSize = newSize; needsRebind = false; } else { bindFailed = true; needsRebind = false; return false; } } return true; } void PixmapBinding::release () { if (!pixmapFreezer->frozen ()) needsRebind = true; } void PixmapBinding::setNewPixmapReadyCallback (const NewPixmapReadyCallback &cb) { newPixmapReadyCallback = cb; } void PixmapBinding::allowFurtherRebindAttempts () { bindFailed = false; needsRebind = true; } ./plugins/composite/src/pixmapbinding/tests/0000755000004100000410000000000013246301624021511 5ustar www-datawww-data./plugins/composite/src/pixmapbinding/tests/CMakeLists.txt0000644000004100000410000000070213246301623024247 0ustar www-datawww-dataadd_executable (compiz_test_composite_pixmapbinding ${CMAKE_CURRENT_SOURCE_DIR}/test-composite-pixmapbinding.cpp) target_link_libraries (compiz_test_composite_pixmapbinding compiz_composite_pixmapbinding ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_composite_pixmapbinding COVERAGE compiz_composite_pixmapbinding) ./plugins/composite/src/pixmapbinding/tests/test-composite-pixmapbinding.cpp0000644000004100000410000003240513246301623030026 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Sam Spilsbury */ #include #include #include #include #include #include "pixmapbinding.h" using ::testing::Invoke; using ::testing::Return; using ::testing::_; class CompositePixmapBinderTest : public ::testing::Test { }; class MockPixmapFreezer : public PixmapFreezerInterface { public: MOCK_METHOD0 (frozen, bool ()); }; class MockWindowPixmapGet : public WindowPixmapGetInterface { public: MOCK_METHOD0 (getPixmap, WindowPixmapInterface::Ptr ()); }; class FakeWindowAttributesGet : public WindowAttributesGetInterface { public: FakeWindowAttributesGet (XWindowAttributes &wa) : mAttributes (wa) { } bool getAttributes (XWindowAttributes &wa) { wa = mAttributes; return true; } private: XWindowAttributes mAttributes; }; class MockWindowAttributesGet : public WindowAttributesGetInterface { public: MOCK_METHOD1 (getAttributes, bool (XWindowAttributes &)); }; class MockPixmap : public WindowPixmapInterface { public: typedef boost::shared_ptr Ptr; MOCK_CONST_METHOD0 (pixmap, Pixmap ()); MOCK_METHOD0 (releasePixmap, void ()); }; class MockServerGrab : public ServerGrabInterface { public: MOCK_METHOD0 (grabServer, void ()); MOCK_METHOD0 (ungrabServer, void ()); MOCK_METHOD0 (syncServer, void ()); }; class PixmapReadyInterface { public: virtual ~PixmapReadyInterface () {} virtual void ready () = 0; }; class MockPixmapReady : public PixmapReadyInterface { public: MOCK_METHOD0 (ready, void ()); }; TEST(CompositePixmapBinderTest, TestInitialBindSuccess) { /* Leave this here * There's a bug in Google Mock at the moment where * if a function with an expectation which returns * Mock B through a container is itself contained in * Mock A, then when Mock A is destroyed, it will first * lock a mutex, and then it will invoke * the destructor the container containing Mock B which * in turn might invoke Mock B's destructor and thus * lock the same mutex in the same thread (deadlock). * * Keeping this reference here ensures that MockPixmap * stays alive while MockWindowPixmapGet is being destroyed */ MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); pr.bind (); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestInitialBindSuccessNoRebind) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestRebindAfterRelease) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (mpf, frozen ()).WillOnce (Return (false)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); pr.release (); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestNoRebindAfterReleaseWhenFrozen) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); MockPixmapReady ready; boost::function readyCb (boost::bind (&PixmapReadyInterface::ready, &ready)); PixmapBinding pr (readyCb, &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_CALL (ready, ready ()); EXPECT_CALL (msg, ungrabServer ()); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (mpf, frozen ()).WillOnce (Return (true)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); pr.release (); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); EXPECT_CALL (*wp, releasePixmap ()); } TEST(CompositePixmapBinderTest, TestInitialBindFailureWindowUnmapped) { MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsUnmapped; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); } TEST(CompositePixmapBinderTest, TestInitialBindFailureWindowZeroSize) { MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 0; xwa.height = 0; xwa.map_state = IsViewable; xwa.border_width = 0; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); } TEST(CompositePixmapBinderTest, TestInitialBindFailureNilPixmapReturned) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 0; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (0)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); } TEST(CompositePixmapBinderTest, TestInitialBindFailureWindowUnmappedSuccessOnRemap) { MockPixmap::Ptr wp (boost::make_shared ()); MockWindowPixmapGet mwpg; MockWindowAttributesGet mwag; MockServerGrab msg; MockPixmapFreezer mpf; XWindowAttributes xwa; xwa.width = 100; xwa.height = 200; xwa.map_state = IsUnmapped; xwa.border_width = 1; FakeWindowAttributesGet fwag (xwa); PixmapBinding pr (boost::function (), &mwpg, &mwag, &mpf, &msg); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_FALSE (pr.bind ()); EXPECT_EQ (pr.pixmap (), 0); EXPECT_EQ (pr.size (), CompSize (0, 0)); EXPECT_FALSE (pr.bind ()); pr.allowFurtherRebindAttempts (); xwa.width = 100; xwa.height = 200; xwa.map_state = IsViewable; xwa.border_width = 1; FakeWindowAttributesGet fwag2 (xwa); EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); EXPECT_CALL (mwag, getAttributes (_)).WillOnce (Invoke (&fwag2, &FakeWindowAttributesGet::getAttributes)); EXPECT_CALL (mwpg, getPixmap ()).WillOnce (Return (wp)); EXPECT_CALL (msg, ungrabServer ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_TRUE (pr.bind ()); EXPECT_CALL (*wp, pixmap ()).WillOnce (Return (1)); EXPECT_EQ (pr.pixmap (), 1); EXPECT_EQ (pr.size (), CompSize (102, 202)); } ./plugins/composite/src/screen.cpp0000644000004100000410000006615213246301623017512 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include "privates.h" #include #include #include template class WrapableInterface; namespace bt = compiz::composite::buffertracking; static const int FALLBACK_REFRESH_RATE = 60; /* if all else fails */ CompWindow *lastDamagedWindow = 0; void PrivateCompositeScreen::handleEvent (XEvent *event) { CompWindow *w; switch (event->type) { case CreateNotify: if (screen->root () == event->xcreatewindow.parent) { /* The first time some client asks for the composite * overlay window, the X server creates it, which causes * an errorneous CreateNotify event. We catch it and * ignore it. */ if (overlay == event->xcreatewindow.window) return; } break; case PropertyNotify: if (event->xproperty.atom == Atoms::winOpacity) { w = screen->findWindow (event->xproperty.window); if (w) CompositeWindow::get (w)->updateOpacity (); } else if (event->xproperty.atom == Atoms::winBrightness) { w = screen->findWindow (event->xproperty.window); if (w) CompositeWindow::get (w)->updateBrightness (); } else if (event->xproperty.atom == Atoms::winSaturation) { w = screen->findWindow (event->xproperty.window); if (w) CompositeWindow::get (w)->updateSaturation (); } break; default: if (shapeExtension && event->type == shapeEvent + ShapeNotify) { w = screen->findWindow (((XShapeEvent *) event)->window); if (w && w->mapNum ()) CompositeWindow::get (w)->addDamage (); } else if (event->type == damageEvent + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent*)event; damages[de->damage] = de->area; } break; } screen->handleEvent (event); switch (event->type) { case Expose: handleExposeEvent (&event->xexpose); break; case ClientMessage: if (event->xclient.message_type == Atoms::winOpacity) { w = screen->findWindow (event->xclient.window); if (w && (w->type () & CompWindowTypeDesktopMask) == 0) { unsigned short opacity = event->xclient.data.l[0] >> 16; screen->setWindowProp32 (w->id (), Atoms::winOpacity, opacity); } } else if (event->xclient.message_type == Atoms::winBrightness) { w = screen->findWindow (event->xclient.window); if (w) { unsigned short brightness = event->xclient.data.l[0] >> 16; screen->setWindowProp32 (w->id (), Atoms::winBrightness, brightness); } } else if (event->xclient.message_type == Atoms::winSaturation) { w = screen->findWindow (event->xclient.window); if (w) { unsigned short saturation = event->xclient.data.l[0] >> 16; screen->setWindowProp32 (w->id (), Atoms::winSaturation, saturation); } } break; default: if (event->type == damageEvent + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; if (lastDamagedWindow && de->drawable == lastDamagedWindow->id ()) w = lastDamagedWindow; else { w = screen->findWindow (de->drawable); if (w) lastDamagedWindow = w; } if (w) CompositeWindow::get (w)->processDamage (de); } else if (shapeExtension && event->type == shapeEvent + ShapeNotify) { w = screen->findWindow (((XShapeEvent *) event)->window); if (w && w->mapNum ()) CompositeWindow::get (w)->addDamage (); } else if (randrExtension && event->type == randrEvent + RRScreenChangeNotify) { XRRScreenChangeNotifyEvent *rre; rre = (XRRScreenChangeNotifyEvent *) event; if (screen->root () == rre->root) detectRefreshRate (); } break; } } int CompositeScreen::damageEvent () { return priv->damageEvent; } template class PluginClassHandler; CompositeScreen::CompositeScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateCompositeScreen (this)) { if (!XQueryExtension (s->dpy (), COMPOSITE_NAME, &priv->compositeOpcode, &priv->compositeEvent, &priv->compositeError)) { compLogMessage ("core", CompLogLevelFatal, "No composite extension"); setFailed (); return; } int compositeMajor, compositeMinor; XCompositeQueryVersion (s->dpy (), &compositeMajor, &compositeMinor); if (compositeMajor == 0 && compositeMinor < 2) { compLogMessage ("core", CompLogLevelFatal, "Old composite extension"); setFailed (); return; } if (!XDamageQueryExtension (s->dpy (), &priv->damageEvent, &priv->damageError)) { compLogMessage ("core", CompLogLevelFatal, "No damage extension"); setFailed (); return; } if (!XFixesQueryExtension (s->dpy (), &priv->fixesEvent, &priv->fixesError)) { compLogMessage ("core", CompLogLevelFatal, "No fixes extension"); setFailed (); return; } priv->shapeExtension = XShapeQueryExtension (s->dpy (), &priv->shapeEvent, &priv->shapeError); priv->randrExtension = XRRQueryExtension (s->dpy (), &priv->randrEvent, &priv->randrError); priv->makeOutputWindow (); priv->detectRefreshRate (); priv->slowAnimations = false; if (!priv->init ()) setFailed (); } CompositeScreen::~CompositeScreen () { priv->paintTimer.stop (); XCompositeReleaseOverlayWindow (screen->dpy (), screen->root ()); delete priv; } namespace { bool alwaysMarkDirty () { return true; } } PrivateCompositeScreen::PrivateCompositeScreen (CompositeScreen *cs) : cScreen (cs), compositeEvent (0), compositeError (0), compositeOpcode (0), damageEvent (0), damageError (0), fixesEvent (0), fixesError (0), fixesVersion (0), shapeExtension (false), shapeEvent (0), shapeError (0), randrExtension (false), randrEvent (0), randrError (0), damageMask (COMPOSITE_SCREEN_DAMAGE_ALL_MASK), currentlyTrackingDamage (DamageForCurrentFrame), overlay (None), output (None), exposeRects (), windowPaintOffset (0, 0), overlayWindowCount (0), outputShapeChanged (false), redrawTime (1000 / FALLBACK_REFRESH_RATE), optimalRedrawTime (1000 / FALLBACK_REFRESH_RATE), scheduled (false), painting (false), reschedule (false), damageRequiresRepaintReschedule (true), slowAnimations (false), pHnd (NULL), FPSLimiterMode (CompositeFPSLimiterModeDefault), withDestroyedWindows (), cmSnAtom (0), newCmSnOwner (None), roster (*screen, ageingBuffers, boost::bind (alwaysMarkDirty)) { gettimeofday (&lastRedraw, 0); // wrap outputChangeNotify ScreenInterface::setHandler (screen); optionSetSlowAnimationsKeyInitiate (CompositeScreen::toggleSlowAnimations); } PrivateCompositeScreen::~PrivateCompositeScreen () { Display *dpy = screen->dpy (); if (cmSnAtom) XSetSelectionOwner (dpy, cmSnAtom, None, CurrentTime); if (newCmSnOwner != None) XDestroyWindow (dpy, newCmSnOwner); } bool PrivateCompositeScreen::init () { Display *dpy = screen->dpy (); Time cmSnTimestamp = 0; XEvent event; XSetWindowAttributes attr; char buf[128]; snprintf (buf, 128, "_NET_WM_CM_S%d", screen->screenNum ()); cmSnAtom = XInternAtom (dpy, buf, 0); Window currentCmSnOwner = XGetSelectionOwner (dpy, cmSnAtom); if (currentCmSnOwner != None && !replaceCurrentWm) { compLogMessage ( "composite", CompLogLevelError, "Screen %d on display \"%s\" already has a compositing " "manager (%x); try using the --replace option to replace " "the current compositing manager.", screen->screenNum (), DisplayString (dpy), currentCmSnOwner); return false; } attr.override_redirect = true; attr.event_mask = PropertyChangeMask; newCmSnOwner = XCreateWindow (dpy, screen->root (), -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (dpy, newCmSnOwner, Atoms::wmName, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) PACKAGE, strlen (PACKAGE)); XWindowEvent (dpy, newCmSnOwner, PropertyChangeMask, &event); cmSnTimestamp = event.xproperty.time; XSetSelectionOwner (dpy, cmSnAtom, newCmSnOwner, cmSnTimestamp); if (XGetSelectionOwner (dpy, cmSnAtom) != newCmSnOwner) { compLogMessage ("core", CompLogLevelError, "Could not acquire compositing manager " "selection on screen %d display \"%s\"", screen->screenNum (), DisplayString (dpy)); return false; } /* Send client message indicating that we are now the compositing manager */ event.xclient.type = ClientMessage; event.xclient.window = screen->root (); event.xclient.message_type = Atoms::manager; event.xclient.format = 32; event.xclient.data.l[0] = cmSnTimestamp; event.xclient.data.l[1] = cmSnAtom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (dpy, screen->root (), FALSE, StructureNotifyMask, &event); return true; } bool CompositeScreen::registerPaintHandler (compiz::composite::PaintHandler *pHnd) { Display *dpy; WRAPABLE_HND_FUNCTN_RETURN (bool, registerPaintHandler, pHnd); dpy = screen->dpy (); if (priv->pHnd) return false; CompScreen::checkForError (dpy); XCompositeRedirectSubwindows (dpy, screen->root (), CompositeRedirectManual); priv->overlayWindowCount = 0; if (CompScreen::checkForError (dpy)) { compLogMessage ("composite", CompLogLevelError, "Another composite manager is already " "running on screen: %d", screen->screenNum ()); return false; } foreach (CompWindow *w, screen->windows ()) { CompositeWindow *cw = CompositeWindow::get (w); cw->priv->overlayWindow = false; cw->priv->redirected = true; } priv->pHnd = pHnd; priv->detectRefreshRate (); showOutputWindow (); return true; } void CompositeScreen::unregisterPaintHandler () { Display *dpy; WRAPABLE_HND_FUNCTN (unregisterPaintHandler) dpy = screen->dpy (); foreach (CompWindow *w, screen->windows ()) { CompositeWindow *cw = CompositeWindow::get (w); cw->priv->overlayWindow = false; cw->priv->redirected = false; cw->release (); } priv->overlayWindowCount = 0; XCompositeUnredirectSubwindows (dpy, screen->root (), CompositeRedirectManual); priv->pHnd = NULL; priv->paintTimer.stop (); priv->detectRefreshRate (); hideOutputWindow (); } bool CompositeScreen::compositingActive () { if (priv->pHnd) return priv->pHnd->compositingActive (); return false; } const CompRegion * PrivateCompositeScreen::damageTrackedBuffer (const CompRegion ®ion) { const CompRegion *currentDamage = NULL; switch (currentlyTrackingDamage) { case DamageForCurrentFrame: currentDamage = &(roster.currentFrameDamage ()); ageingBuffers.markAreaDirty (region); break; case DamageForLastFrame: currentDamage = &(lastFrameDamage); lastFrameDamage += region; break; case DamageFinalPaintRegion: currentDamage = &(tmpRegion); tmpRegion += region; break; default: compLogMessage ("composite", CompLogLevelFatal, "unreachable section"); assert (false); abort (); } assert (currentDamage); return currentDamage; } void CompositeScreen::damageScreen () { /* Don't tell plugins about damage events when the damage buffer is already full */ bool alreadyDamaged = priv->damageMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK; alreadyDamaged |= ((currentDamage () & screen->region ()) == screen->region ()); priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_ALL_MASK; priv->damageMask &= ~COMPOSITE_SCREEN_DAMAGE_REGION_MASK; if (priv->damageRequiresRepaintReschedule) priv->scheduleRepaint (); /* * Call through damageRegion since plugins listening for incoming damage * may need to know that the whole screen was redrawn */ if (!alreadyDamaged) { damageRegion (CompRegion (0, 0, screen->width (), screen->height ())); /* Set the damage region as the fullscreen region, because if * windows are unredirected we need to correctly subtract from * it later */ priv->damageTrackedBuffer (screen->region ()); } } void CompositeScreen::damageRegion (const CompRegion ®ion) { WRAPABLE_HND_FUNCTN (damageRegion, region); if (priv->damageMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) return; /* Don't cause repaints to be scheduled for empty damage * regions */ if (region.isEmpty ()) return; const CompRegion *currentDamage = priv->damageTrackedBuffer (region); priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_REGION_MASK; /* If the number of damage rectangles grows two much between repaints, * we have a lot of overhead just for doing the damage tracking - * in order to make sure we're not having too much overhead, damage * the whole screen if we have a lot of damage rects */ if (currentDamage->numRects () > 100) damageScreen (); if (priv->damageRequiresRepaintReschedule) priv->scheduleRepaint (); } void CompositeScreen::damageCutoff () { WRAPABLE_HND_FUNCTN (damageCutoff); } void CompositeScreen::damagePending () { priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_PENDING_MASK; if (priv->damageRequiresRepaintReschedule) priv->scheduleRepaint (); } void CompositeScreen::applyDamageForFrameAge (unsigned int age) { /* Track into "last frame damage" */ priv->currentlyTrackingDamage = DamageForLastFrame; damageRegion (priv->roster.damageForFrameAge (age)); priv->currentlyTrackingDamage = DamageForCurrentFrame; } unsigned int CompositeScreen::getFrameAge () { if (priv->pHnd) return priv->pHnd->getFrameAge (); return 1; } void CompositeScreen::recordDamageOnCurrentFrame (const CompRegion &r) { priv->ageingBuffers.markAreaDirtyOnLastFrame (r); } typedef CompositeScreen::AreaShouldBeMarkedDirty ShouldMarkDirty; namespace { bool alwaysDirty () { return true; } } CompositeScreen::DamageQuery::Ptr CompositeScreen::getDamageQuery (ShouldMarkDirty callback) { /* No initial damage */ bt::AgeingDamageBufferObserver &observer (priv->ageingBuffers); return boost::make_shared (*screen, boost::ref (observer), !callback.empty () ? callback : boost::bind (alwaysDirty)); } unsigned int CompositeScreen::damageMask () { return priv->damageMask; } void CompositeScreen::showOutputWindow () { if (priv->pHnd) { Display *dpy = screen->dpy (); XserverRegion region; region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeBounding, 0, 0, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeInput, 0, 0, region); XFixesDestroyRegion (dpy, region); damageScreen (); priv->outputShapeChanged = true; } } void CompositeScreen::hideOutputWindow () { Display *dpy = screen->dpy (); XserverRegion region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeBounding, 0, 0, region); XFixesDestroyRegion (dpy, region); } void CompositeScreen::updateOutputWindow () { if (priv->pHnd) { Display *dpy = screen->dpy (); XserverRegion region; CompRegion tmpRegion (screen->region ()); for (CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); rit != screen->windows ().rend (); ++rit) if (CompositeWindow::get (*rit)->overlayWindow ()) tmpRegion -= (*rit)->region (); XShapeCombineRegion (dpy, priv->output, ShapeBounding, 0, 0, tmpRegion.handle (), ShapeSet); region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, priv->output, ShapeInput, 0, 0, region); XFixesDestroyRegion (dpy, region); priv->outputShapeChanged = true; } } bool CompositeScreen::outputWindowChanged () const { return priv->outputShapeChanged; } void PrivateCompositeScreen::makeOutputWindow () { overlay = XCompositeGetOverlayWindow (screen->dpy (), screen->root ()); output = overlay; XSelectInput (screen->dpy (), output, ExposureMask); cScreen->hideOutputWindow (); } Window CompositeScreen::output () { return priv->output; } Window CompositeScreen::overlay () { return priv->overlay; } int & CompositeScreen::overlayWindowCount () { return priv->overlayWindowCount; } void CompositeScreen::setWindowPaintOffset (int x, int y) { priv->windowPaintOffset = CompPoint (x, y); } CompPoint CompositeScreen::windowPaintOffset () { return priv->windowPaintOffset; } void PrivateCompositeScreen::detectRefreshRate () { const bool forceRefreshRate = (pHnd ? pHnd->requiredForcedRefreshRate () : false); const bool detect = optionGetDetectRefreshRate () && !forceRefreshRate; if (detect) { CompString name; CompOption::Value value; value.set ((int) 0); if (randrExtension) { XRRScreenConfiguration *config; config = XRRGetScreenInfo (screen->dpy (), screen->root ()); value.set ((int) XRRConfigCurrentRate (config)); XRRFreeScreenConfigInfo (config); } if (value.i () == 0) value.set ((int) FALLBACK_REFRESH_RATE); mOptions[CompositeOptions::DetectRefreshRate].value ().set (false); screen->setOptionForPlugin ("composite", "refresh_rate", value); mOptions[CompositeOptions::DetectRefreshRate].value ().set (true); optimalRedrawTime = redrawTime = 1000 / value.i (); } else { if (forceRefreshRate && (optionGetRefreshRate () < FALLBACK_REFRESH_RATE)) { CompOption::Value value; value.set ((int) FALLBACK_REFRESH_RATE); screen->setOptionForPlugin ("composite", "refresh_rate", value); } redrawTime = 1000 / optionGetRefreshRate (); optimalRedrawTime = redrawTime; } } CompositeFPSLimiterMode CompositeScreen::FPSLimiterMode () { return priv->FPSLimiterMode; } void CompositeScreen::setFPSLimiterMode (CompositeFPSLimiterMode newMode) { priv->FPSLimiterMode = newMode; } void PrivateCompositeScreen::scheduleRepaint () { if (painting) { reschedule = true; return; } if (scheduled) return; scheduled = true; int delay; if (FPSLimiterMode == CompositeFPSLimiterModeVSyncLike || (pHnd && pHnd->hasVSync ())) delay = 1; else { struct timeval now; gettimeofday (&now, 0); int elapsed = compiz::core::timer::timeval_diff (&now, &lastRedraw); if (elapsed < 0) elapsed = 0; delay = elapsed < optimalRedrawTime ? optimalRedrawTime - elapsed : 1; } paintTimer.start (boost::bind (&CompositeScreen::handlePaintTimeout, cScreen), delay); } int CompositeScreen::redrawTime () { return priv->redrawTime; } int CompositeScreen::optimalRedrawTime () { return priv->optimalRedrawTime; } bool CompositeScreen::handlePaintTimeout () { struct timeval tv; priv->painting = true; priv->reschedule = false; gettimeofday (&tv, 0); if (priv->damageMask) { /* Damage that accumulates here does not require a repaint reschedule * as it will end up on this frame */ priv->damageRequiresRepaintReschedule = false; if (priv->pHnd) priv->pHnd->prepareDrawing (); int timeDiff = compiz::core::timer::timeval_diff (&tv, &priv->lastRedraw); /* handle clock rollback */ if (timeDiff < 0) timeDiff = 0; /* * Now that we use a "tickless" timing algorithm, timeDiff could be * very large if the screen is truely idle. * However plugins expect the old behaviour where timeDiff is rarely * larger than the frame rate (optimalRedrawTime). * So enforce this to keep animations timed correctly and smooth... */ if (timeDiff > 100) timeDiff = priv->optimalRedrawTime; priv->redrawTime = timeDiff; preparePaint (priv->slowAnimations ? 1 : timeDiff); /* substract top most overlay window region */ if (priv->overlayWindowCount) { for (CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); rit != screen->windows ().rend (); ++rit) { CompWindow *w = (*rit); if (w->destroyed () || w->invisible ()) continue; if (!CompositeWindow::get (w)->redirected ()) priv->ageingBuffers.subtractObscuredArea (w->region ()); break; } if (priv->damageMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { priv->damageMask &= ~COMPOSITE_SCREEN_DAMAGE_ALL_MASK; priv->damageMask |= COMPOSITE_SCREEN_DAMAGE_REGION_MASK; } } /* All further damage is for the next frame now, as * priv->tmpRegion will be assigned. Notify plugins that do * damage tracking of this */ damageCutoff (); priv->tmpRegion = (priv->roster.currentFrameDamage () + priv->lastFrameDamage) & screen->region (); priv->currentlyTrackingDamage = DamageFinalPaintRegion; if (priv->damageMask & COMPOSITE_SCREEN_DAMAGE_REGION_MASK && priv->tmpRegion == screen->region ()) damageScreen (); Display *dpy = screen->dpy (); std::map::iterator d = priv->damages.begin (); for (; d != priv->damages.end (); ++d) { XserverRegion sub = XFixesCreateRegion (dpy, &d->second, 1); if (sub != None) { XDamageSubtract (dpy, d->first, sub, None); XFixesDestroyRegion (dpy, sub); } } XSync (dpy, False); priv->damages.clear (); /* Any more damage requires a repaint reschedule */ priv->damageRequiresRepaintReschedule = true; priv->lastFrameDamage = CompRegion (); int mask = priv->damageMask; priv->damageMask = 0; CompOutput::ptrList outputs (0); if (priv->optionGetForceIndependentOutputPainting () || !screen->hasOverlappingOutputs ()) { foreach (CompOutput &o, screen->outputDevs ()) { outputs.push_back (&o); } } else outputs.push_back (&screen->fullscreenOutput ()); priv->currentlyTrackingDamage = DamageForCurrentFrame; /* All new damage goes on the next frame */ priv->ageingBuffers.incrementAges (); paint (outputs, mask); donePaint (); priv->outputShapeChanged = false; foreach (CompWindow *w, screen->windows ()) { if (w->destroyed ()) { CompositeWindow::get (w)->addDamage (); break; } } } priv->lastRedraw = tv; priv->painting = false; priv->scheduled = false; if (priv->reschedule) priv->scheduleRepaint (); return false; } void CompositeScreen::preparePaint (int msSinceLastPaint) WRAPABLE_HND_FUNCTN (preparePaint, msSinceLastPaint) void CompositeScreen::donePaint () WRAPABLE_HND_FUNCTN (donePaint) void CompositeScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { WRAPABLE_HND_FUNCTN (paint, outputs, mask) if (priv->pHnd) priv->pHnd->paintOutputs (outputs, mask, priv->tmpRegion); } const CompWindowList & CompositeScreen::getWindowPaintList () { WRAPABLE_HND_FUNCTN_RETURN (const CompWindowList &, getWindowPaintList) /* Include destroyed windows */ if (screen->destroyedWindows ().empty ()) return screen->windows (); else { CompWindowList destroyedWindows = screen->destroyedWindows (); priv->withDestroyedWindows.resize (0); foreach (CompWindow *w, screen->windows ()) { foreach (CompWindow *dw, screen->destroyedWindows ()) { if (dw->next == w) { priv->withDestroyedWindows.push_back (dw); destroyedWindows.remove (dw); break; } } priv->withDestroyedWindows.push_back (w); } /* We need to put all the destroyed windows which didn't get * inserted in the paint list at the top of the stack since * w->next was probably either invalid or NULL */ foreach (CompWindow *dw, destroyedWindows) priv->withDestroyedWindows.push_back (dw); return priv->withDestroyedWindows; } } void PrivateCompositeScreen::handleExposeEvent (XExposeEvent *event) { if (output == event->window) return; exposeRects.push_back (CompRect (event->x, event->y, event->width, event->height)); if (event->count == 0) { CompRect rect; foreach (CompRect rect, exposeRects) { cScreen->damageRegion (CompRegion (rect)); } exposeRects.clear (); } } void PrivateCompositeScreen::outputChangeNotify () { screen->outputChangeNotify (); XMoveResizeWindow (screen->dpy (), overlay, 0, 0, screen->width (), screen->height ()); cScreen->damageScreen (); } bool CompositeScreen::toggleSlowAnimations (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompositeScreen *cs = CompositeScreen::get (screen); if (cs) cs->priv->slowAnimations = !cs->priv->slowAnimations; return true; } void CompositeScreenInterface::preparePaint (int msSinceLastPaint) WRAPABLE_DEF (preparePaint, msSinceLastPaint) void CompositeScreenInterface::donePaint () WRAPABLE_DEF (donePaint) void CompositeScreenInterface::paint (CompOutput::ptrList &outputs, unsigned int mask) WRAPABLE_DEF (paint, outputs, mask) const CompWindowList & CompositeScreenInterface::getWindowPaintList () WRAPABLE_DEF (getWindowPaintList) bool CompositeScreenInterface::registerPaintHandler (compiz::composite::PaintHandler *pHnd) WRAPABLE_DEF (registerPaintHandler, pHnd); void CompositeScreenInterface::unregisterPaintHandler () WRAPABLE_DEF (unregisterPaintHandler); void CompositeScreenInterface::damageRegion (const CompRegion &r) WRAPABLE_DEF (damageRegion, r); void CompositeScreenInterface::damageCutoff () WRAPABLE_DEF (damageCutoff); const CompRegion & CompositeScreen::currentDamage () const { return priv->roster.currentFrameDamage (); } ./plugins/composite/src/backbuffertracking/0000755000004100000410000000000013246301623021332 5ustar www-datawww-data./plugins/composite/src/backbuffertracking/CMakeLists.txt0000644000004100000410000000106713246301623024076 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${COMPIZ_LIBRARY_DIRS}) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/backbuffertracking.cpp ) ADD_LIBRARY( compiz_composite_backbuffertracking STATIC ${SRCS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_composite_backbuffertracking compiz_size compiz_core ) ./plugins/composite/src/backbuffertracking/include/0000755000004100000410000000000013246301623022755 5ustar www-datawww-data./plugins/composite/src/backbuffertracking/include/backbuffertracking.h0000644000004100000410000000710613246301623026747 0ustar www-datawww-data/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_COMPOSITE_BACKBUFFERTRACKING_H #define _COMPIZ_COMPOSITE_BACKBUFFERTRACKING_H #include #include #include #include #include #include class CompSize; class CompRegion; namespace compiz { namespace composite { namespace buffertracking { class DamageAgeTracking { public: virtual ~DamageAgeTracking () {}; virtual void dirtyAreaOnCurrentFrame (const CompRegion &) = 0; virtual void overdrawRegionOnPaintingFrame (const CompRegion &) = 0; virtual void subtractObscuredArea (const CompRegion &) = 0; virtual void incrementFrameAges () = 0; }; class AgeingDamageBufferObserver { public: virtual ~AgeingDamageBufferObserver () {}; virtual void observe (DamageAgeTracking &damageAgeTracker) = 0; virtual void unobserve (DamageAgeTracking &damageAgeTracker) = 0; }; class AgeingDamageBuffers : public AgeingDamageBufferObserver, boost::noncopyable { public: AgeingDamageBuffers (); void observe (DamageAgeTracking &damageAgeTracker); void unobserve (DamageAgeTracking &damageAgeTracker); void incrementAges (); void markAreaDirty (const CompRegion ®); void markAreaDirtyOnLastFrame (const CompRegion ®); void subtractObscuredArea (const CompRegion ®); private: class Private; std::auto_ptr priv; }; class FrameRoster : public DamageAgeTracking, public AgeDamageQuery, boost::noncopyable { public: typedef AgeDamageQuery::AreaShouldBeMarkedDirty AreaShouldBeMarkedDirty; typedef boost::shared_ptr Ptr; FrameRoster (const CompSize &size, AgeingDamageBufferObserver &tracker, const AreaShouldBeMarkedDirty &shouldMarkDirty); ~FrameRoster (); void dirtyAreaOnCurrentFrame (const CompRegion &); void overdrawRegionOnPaintingFrame (const CompRegion &); void subtractObscuredArea (const CompRegion &); void incrementFrameAges (); CompRegion damageForFrameAge (unsigned int); const CompRegion & currentFrameDamage (); class Private; std::auto_ptr priv; static const unsigned int NUM_TRACKED_FRAMES = 10; static FrameRoster::Ptr create (const CompSize &size, const AreaShouldBeMarkedDirty &shouldMarkDirty); private: }; } // namespace buffertracking } // namespace composite } // namespace compiz #endif ./plugins/composite/src/backbuffertracking/src/0000755000004100000410000000000013246301623022121 5ustar www-datawww-data./plugins/composite/src/backbuffertracking/src/backbuffertracking.cpp0000644000004100000410000001300013246301623026434 0ustar www-datawww-data/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include "backbuffertracking.h" #include namespace bt = compiz::composite::buffertracking; class bt::FrameRoster::Private { public: Private (const CompSize &size, bt::AgeingDamageBufferObserver &observer, const bt::FrameRoster::AreaShouldBeMarkedDirty &shouldBeMarkedDirty) : screenSize (size), observer (observer), shouldBeMarkedDirty (shouldBeMarkedDirty), oldFrames (1) { } CompSize screenSize; bt::AgeingDamageBufferObserver &observer; bt::FrameRoster::AreaShouldBeMarkedDirty shouldBeMarkedDirty; std::deque oldFrames; }; bt::FrameRoster::FrameRoster (const CompSize &size, bt::AgeingDamageBufferObserver &tracker, const AreaShouldBeMarkedDirty &shouldBeMarkedDirty) : priv (new bt::FrameRoster::Private (size, tracker, shouldBeMarkedDirty)) { priv->observer.observe (*this); } bt::FrameRoster::~FrameRoster () { priv->observer.unobserve (*this); } CompRegion bt::FrameRoster::damageForFrameAge (unsigned int age) { if (!age) return CompRegion (0, 0, priv->screenSize.width (), priv->screenSize.height ()); if (age >= priv->oldFrames.size ()) return CompRegion (0, 0, priv->screenSize.width (), priv->screenSize.height ()); CompRegion accumulatedDamage; while (age--) { unsigned int frameNum = (priv->oldFrames.size () - age) - 1; accumulatedDamage += priv->oldFrames[frameNum]; } return accumulatedDamage; } void bt::FrameRoster::dirtyAreaOnCurrentFrame (const CompRegion &r) { if (priv->shouldBeMarkedDirty (r)) (*priv->oldFrames.rbegin ()) += r; } void bt::FrameRoster::subtractObscuredArea (const CompRegion &r) { (*priv->oldFrames.rbegin ()) -= r; } void bt::FrameRoster::overdrawRegionOnPaintingFrame (const CompRegion &r) { assert (priv->oldFrames.size () > 1); std::deque ::reverse_iterator it = priv->oldFrames.rbegin (); ++it; (*it) += r; } void bt::FrameRoster::incrementFrameAges () { priv->oldFrames.push_back (CompRegion ()); /* Get rid of old frames */ if (priv->oldFrames.size () > NUM_TRACKED_FRAMES) priv->oldFrames.pop_front (); } const CompRegion & bt::FrameRoster::currentFrameDamage () { return *priv->oldFrames.rbegin (); } class bt::AgeingDamageBuffers::Private { public: std::vector damageAgeTrackers; }; bt::AgeingDamageBuffers::AgeingDamageBuffers () : priv (new bt::AgeingDamageBuffers::Private ()) { } void bt::AgeingDamageBuffers::observe (bt::DamageAgeTracking &damageAgeTracker) { priv->damageAgeTrackers.push_back (&damageAgeTracker); } void bt::AgeingDamageBuffers::unobserve (bt::DamageAgeTracking &damageAgeTracker) { std::vector ::iterator it = std::find (priv->damageAgeTrackers.begin (), priv->damageAgeTrackers.end (), &damageAgeTracker); if (it != priv->damageAgeTrackers.end ()) priv->damageAgeTrackers.erase (it); } void bt::AgeingDamageBuffers::incrementAges () { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->incrementFrameAges (); } } void bt::AgeingDamageBuffers::markAreaDirty (const CompRegion ®) { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->dirtyAreaOnCurrentFrame (reg); } } void bt::AgeingDamageBuffers::subtractObscuredArea (const CompRegion ®) { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->subtractObscuredArea (reg); } } void bt::AgeingDamageBuffers::markAreaDirtyOnLastFrame (const CompRegion ®) { for (std::vector ::iterator it = priv->damageAgeTrackers.begin (); it != priv->damageAgeTrackers.end (); ++it) { bt::DamageAgeTracking *tracker = *it; tracker->overdrawRegionOnPaintingFrame (reg); } } ./plugins/composite/src/backbuffertracking/tests/0000755000004100000410000000000013246301624022475 5ustar www-datawww-data./plugins/composite/src/backbuffertracking/tests/CMakeLists.txt0000644000004100000410000000161613246301623025240 0ustar www-datawww-datafind_library (GMOCK_LIBRARY gmock) find_library (GMOCK_MAIN_LIBRARY gmock_main) if (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) message ("Google Mock and Google Test not found - cannot build tests!") set (COMPIZ_BUILD_TESTING OFF) endif (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) include_directories (${GTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_LIBRARY_DIRS}) add_executable (compiz_test_composite_backbuffertracking ${CMAKE_CURRENT_SOURCE_DIR}/test-composite-backbuffertracking.cpp) target_link_libraries (compiz_test_composite_backbuffertracking compiz_composite_backbuffertracking ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_composite_backbuffertracking COVERAGE compiz_composite_backbuffertracking) ./plugins/composite/src/backbuffertracking/tests/test-composite-backbuffertracking.cpp0000644000004100000410000003172013246301623031775 0ustar www-datawww-data/* * Compiz, composite plugin, GLX_EXT_buffer_age logic * * Copyright (c) 2012 Sam Spilsbury * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include "backbuffertracking.h" using ::testing::NiceMock; using ::testing::_; using ::testing::AtLeast; namespace bt = compiz::composite::buffertracking; namespace { class MockAgeingDamageBufferObserver : public bt::AgeingDamageBufferObserver { public: MOCK_METHOD1 (observe, void (bt::DamageAgeTracking &)); MOCK_METHOD1 (unobserve, void (bt::DamageAgeTracking &)); }; bool alwaysDirty () { return true; } class BackbufferTracking : public ::testing::Test { public: BackbufferTracking () : screen (1000, 1000), roster () { } virtual void SetUp () { SetupRoster (); } virtual void SetupRoster () { roster.reset (new bt::FrameRoster (screen, niceTracker, boost::bind (alwaysDirty))); } protected: CompSize screen; NiceMock niceTracker; bt::FrameRoster::Ptr roster; }; class BackbufferTrackingCallbacks : public BackbufferTracking { public: BackbufferTrackingCallbacks () : shouldDamage (false) { } protected: void allowDamage (bool allow) { shouldDamage = allow; } private: virtual void SetupRoster () { roster.reset (new bt::FrameRoster (screen, niceTracker, boost::bind (&BackbufferTrackingCallbacks::shouldDamageCallback, this, _1))); } bool shouldDamageCallback (const CompRegion &) { return shouldDamage; } bool shouldDamage; }; } std::ostream & operator<< (std::ostream &os, const CompRegion ®) { os << "Region with Bounding Rectangle : " << reg.boundingRect ().x () << " " << reg.boundingRect ().y () << " " << reg.boundingRect ().width () << " " << reg.boundingRect ().height () << std::endl; CompRect::vector rects (reg.rects ()); for (CompRect::vector::iterator it = rects.begin (); it != rects.end (); it++) os << " - subrectangle: " << (*it).x () << " " << (*it).y () << " " << (*it).width () << " " << (*it).height () << " " << std::endl; return os; } TEST (BackbufferTrackingConstruction, CreateAddsToObserverList) { MockAgeingDamageBufferObserver mockAgeingDamageBufferObserver; /* We can't verify the argument here, * but we can verify the function call */ EXPECT_CALL (mockAgeingDamageBufferObserver, observe (_)); EXPECT_CALL (mockAgeingDamageBufferObserver, unobserve (_)).Times (AtLeast (0)); bt::FrameRoster roster (CompSize (), mockAgeingDamageBufferObserver, boost::bind (alwaysDirty)); } TEST (BackbufferTrackingConstruction, DestroyRemovesFromObserverList) { MockAgeingDamageBufferObserver mockAgeingDamageBufferObserver; /* We can't verify the argument here, * but we can verify the function call */ EXPECT_CALL (mockAgeingDamageBufferObserver, observe (_)).Times (AtLeast (0)); EXPECT_CALL (mockAgeingDamageBufferObserver, unobserve (_)); bt::FrameRoster roster (CompSize (), mockAgeingDamageBufferObserver, boost::bind (alwaysDirty)); } TEST_F (BackbufferTrackingCallbacks, TrackIntoCurrentIfCallbackTrue) { allowDamage (true); CompRegion damage (100, 100, 100, 100); roster->dirtyAreaOnCurrentFrame (damage); EXPECT_EQ (damage, roster->currentFrameDamage ()); } TEST_F (BackbufferTrackingCallbacks, NoTrackIntoCurrentIfCallbackFalse) { allowDamage (false); CompRegion damage (100, 100, 100, 100); roster->dirtyAreaOnCurrentFrame (damage); EXPECT_EQ (CompRegion::empty (), roster->currentFrameDamage ()); } TEST_F (BackbufferTracking, DirtyAreaSubtraction) { CompRegion dirty (100, 100, 100, 100); CompRegion obscured (150, 150, 50, 50); roster->dirtyAreaOnCurrentFrame (dirty); roster->subtractObscuredArea (obscured); EXPECT_EQ (dirty - obscured, roster->currentFrameDamage ()); } TEST_F (BackbufferTracking, DirtyAreaForAgeZeroAll) { EXPECT_EQ (CompRegion (0, 0, screen.width (), screen.height ()), roster->damageForFrameAge (0)); } TEST_F (BackbufferTracking, DirtyAreaAllForOlderThanTrackedAge) { EXPECT_EQ (CompRegion (0, 0, screen.width (), screen.height ()), roster->damageForFrameAge (1)); } TEST_F (BackbufferTracking, NoDirtyAreaForLastFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); EXPECT_EQ (CompRegion::empty (), roster->damageForFrameAge (1)); } TEST_F (BackbufferTracking, DirtyAreaIfMoreSinceLastFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame(all); EXPECT_EQ (all, roster->damageForFrameAge (1)); } TEST_F (BackbufferTracking, AddOverdrawRegionForLastFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->incrementFrameAges (); roster->overdrawRegionOnPaintingFrame (all); EXPECT_EQ (all, roster->damageForFrameAge (2)); } TEST_F (BackbufferTracking, TwoFramesAgo) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); EXPECT_EQ (topleft, roster->damageForFrameAge (2)); } TEST_F (BackbufferTracking, TwoFramesAgoCulmulative) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion topright (0, screen.width () / 2, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->dirtyAreaOnCurrentFrame (topright); roster->incrementFrameAges (); EXPECT_EQ (topleft + topright, roster->damageForFrameAge (2)); } TEST_F (BackbufferTracking, ThreeFramesAgo) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion bottomright (screen.width () / 2, screen.height () / 2, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); EXPECT_EQ (topleft + bottomright, roster->damageForFrameAge (3)); } /* These are more or less functional tests from this point forward * just checking a number of different situations */ TEST_F (BackbufferTracking, ThreeFramesAgoWithFourFrames) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion bottomright (screen.width () / 2, screen.height () / 2, screen.width () / 2, screen.height () / 2); CompRegion topright (screen.width () / 2, 0, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topright); roster->incrementFrameAges (); EXPECT_EQ (topright + bottomright, roster->damageForFrameAge (3)); } TEST_F (BackbufferTracking, ThreeFramesAgoWithFourFramesAndOverlap) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion topleft (0, 0, screen.width () / 2, screen.height () / 2); CompRegion bottomright (screen.width () / 2, screen.height () / 2, screen.width () / 2, screen.height () / 2); CompRegion topright (screen.width () / 2, 0, screen.width () / 2, screen.height () / 2); roster->dirtyAreaOnCurrentFrame (all); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (topleft); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (bottomright); roster->incrementFrameAges (); EXPECT_EQ (bottomright, roster->damageForFrameAge (3)); } TEST_F (BackbufferTracking, AllDamageForExceedingMaxTrackedFrames) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion damage (0, 0, 1, 1); roster->dirtyAreaOnCurrentFrame (all); for (unsigned int i = 0; i < bt::FrameRoster::NUM_TRACKED_FRAMES - 1; ++i) { roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (damage); } EXPECT_EQ (all, roster->damageForFrameAge (bt::FrameRoster::NUM_TRACKED_FRAMES + 1)); } TEST_F (BackbufferTracking, DamageForMaxTrackedFrame) { CompRegion all (0, 0, screen.width (), screen.height ()); CompRegion damage (0, 0, 1, 1); roster->dirtyAreaOnCurrentFrame (all); for (unsigned int i = 0; i < bt::FrameRoster::NUM_TRACKED_FRAMES + 1; ++i) { roster->incrementFrameAges (); roster->dirtyAreaOnCurrentFrame (damage); } EXPECT_EQ (all, roster->damageForFrameAge (bt::FrameRoster::NUM_TRACKED_FRAMES)); } class MockDamageAgeTracking : public bt::DamageAgeTracking { public: typedef boost::shared_ptr Ptr; MOCK_METHOD0 (incrementFrameAges, void ()); MOCK_METHOD1 (dirtyAreaOnCurrentFrame, void (const CompRegion &)); MOCK_METHOD1 (subtractObscuredArea, void (const CompRegion &)); MOCK_METHOD1 (overdrawRegionOnPaintingFrame, void (const CompRegion &)); }; class AgeingDamageBuffers : public ::testing::Test { public: AgeingDamageBuffers () { ageing.observe (mockDamageAgeTracker); } MockDamageAgeTracking mockDamageAgeTracker; bt::AgeingDamageBuffers ageing; }; TEST_F (AgeingDamageBuffers, IncrementAgesOnValidRosters) { EXPECT_CALL (mockDamageAgeTracker, incrementFrameAges ()); ageing.incrementAges (); } TEST_F (AgeingDamageBuffers, DirtyAreaOnValidRosters) { CompRegion dirtyArea (100, 100, 100, 100); EXPECT_CALL (mockDamageAgeTracker, dirtyAreaOnCurrentFrame (dirtyArea)); ageing.markAreaDirty (dirtyArea); } TEST_F (AgeingDamageBuffers, SubtractObscuredAreaOnValidRosters) { CompRegion obscuredArea (100, 100, 100, 100); EXPECT_CALL (mockDamageAgeTracker, subtractObscuredArea (obscuredArea)); ageing.subtractObscuredArea (obscuredArea); } TEST_F (AgeingDamageBuffers, AddOverdrawAreaOnValidRosters) { CompRegion overdrawArea (100, 100, 100, 100); EXPECT_CALL (mockDamageAgeTracker, overdrawRegionOnPaintingFrame (overdrawArea)); ageing.markAreaDirtyOnLastFrame (overdrawArea); } TEST_F (AgeingDamageBuffers, IncrementAgesOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, incrementFrameAges ()).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.incrementAges (); } TEST_F (AgeingDamageBuffers, DirtyAreaOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, dirtyAreaOnCurrentFrame (_)).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.markAreaDirty (CompRegion::empty ()); } TEST_F (AgeingDamageBuffers, SubtractObscuredAreaOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, subtractObscuredArea (_)).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.subtractObscuredArea (CompRegion::empty ()); } TEST_F (AgeingDamageBuffers, AddOverdrawAreaOnInvalidRosters) { EXPECT_CALL (mockDamageAgeTracker, overdrawRegionOnPaintingFrame (_)).Times (0); ageing.unobserve (mockDamageAgeTracker); ageing.markAreaDirtyOnLastFrame (CompRegion::empty ()); } ./plugins/composite/src/privates.h0000644000004100000410000001111313246301623017520 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPOSITE_PRIVATES_H #define _COMPOSITE_PRIVATES_H #include #include #include #include #include #include "pixmapbinding.h" #include "backbuffertracking.h" #include "composite_options.h" extern CompPlugin::VTable *compositeVTable; extern CompWindow *lastDamagedWindow; enum DamageTracking { DamageForCurrentFrame = 0, DamageForLastFrame = 1, DamageFinalPaintRegion }; class PrivateCompositeScreen : ScreenInterface, public CompositeOptions { public: PrivateCompositeScreen (CompositeScreen *cs); ~PrivateCompositeScreen (); bool setOption (const CompString &name, CompOption::Value &value); void outputChangeNotify (); void handleEvent (XEvent *event); void makeOutputWindow (); bool init (); void handleExposeEvent (XExposeEvent *event); void detectRefreshRate (); void scheduleRepaint (); const CompRegion * damageTrackedBuffer (const CompRegion &); public: CompositeScreen *cScreen; int compositeEvent, compositeError, compositeOpcode; int damageEvent, damageError; int fixesEvent, fixesError, fixesVersion; bool shapeExtension; int shapeEvent, shapeError; bool randrExtension; int randrEvent, randrError; CompRegion lastFrameDamage; unsigned long damageMask; CompRegion tmpRegion; DamageTracking currentlyTrackingDamage; Window overlay; Window output; std::list exposeRects; CompPoint windowPaintOffset; int overlayWindowCount; bool outputShapeChanged; struct timeval lastRedraw; int redrawTime; int optimalRedrawTime; bool scheduled, painting, reschedule; bool damageRequiresRepaintReschedule; bool slowAnimations; CompTimer paintTimer; compiz::composite::PaintHandler *pHnd; CompositeFPSLimiterMode FPSLimiterMode; CompWindowList withDestroyedWindows; Atom cmSnAtom; Window newCmSnOwner; /* Map Damage handle to its bounding box */ std::map damages; compiz::composite::buffertracking::AgeingDamageBuffers ageingBuffers; compiz::composite::buffertracking::FrameRoster roster; }; class PrivateCompositeWindow : public WindowInterface, public CompositePixmapRebindInterface, public WindowPixmapGetInterface, public WindowAttributesGetInterface, public PixmapFreezerInterface { public: PrivateCompositeWindow (CompWindow *w, CompositeWindow *cw); void windowNotify (CompWindowNotify n); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool now); Pixmap pixmap () const; bool bind (); const CompSize & size () const; void release (); void setNewPixmapReadyCallback (const boost::function &); void allowFurtherRebindAttempts (); bool frozen (); static void handleDamageRect (CompositeWindow *w, XRectangle const& rect); public: CompWindow *window; CompositeWindow *cWindow; CompositeScreen *cScreen; PixmapBinding mPixmapBinding; Damage damage; bool damaged; bool redirected; bool overlayWindow; unsigned short opacity; unsigned short brightness; unsigned short saturation; std::vector damageRects; private: bool getAttributes (XWindowAttributes &); WindowPixmapInterface::Ptr getPixmap (); }; #endif ./plugins/composite/src/composite.cpp0000644000004100000410000000554313246301623020232 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include "composite/composite.h" #include "privates.h" #include "core/abiversion.h" class CompositePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (composite, CompositePluginVTable) CompOption::Vector & CompositeScreen::getOptions () { return priv->getOptions (); } bool CompositeScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool PrivateCompositeScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CompositeOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CompositeOptions::DetectRefreshRate: if (optionGetDetectRefreshRate ()) { detectRefreshRate (); break; } /* Fall through when DetectRefreshRate is unchecked */ case CompositeOptions::RefreshRate: if (optionGetDetectRefreshRate ()) return false; redrawTime = 1000 / optionGetRefreshRate (); optimalRedrawTime = redrawTime; break; default: break; } return rv; } bool CompositePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_COMPOSITE_ABI; screen->storeValue ("composite_ABI", p); return true; } return false; } void CompositePluginVTable::fini () { screen->eraseValue ("composite_ABI"); } ./plugins/composite/compiz-composite.pc.in0000644000004100000410000000047513246301623021166 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-composite Description: Compositing plugin for compiz Version: @VERSION@ Requires: compiz Libs: @_composite_plugin_LDFLAGS@ -L${libdir} -lcomposite Cflags: @COMPIZ_CFLAGS@ @_composite_plugin_CFLAGS@ -I${includedir}/compiz./plugins/composite/composite.xml.in0000644000004100000410000000362013246301623020060 0ustar www-datawww-data <_short>Composite <_long>Composite plugin General ./plugins/move/0000755000004100000410000000000013246301624013673 5ustar www-datawww-data./plugins/move/CMakeLists.txt0000644000004100000410000000014713246301623016434 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(move PLUGINDEPS composite opengl)./plugins/move/src/0000755000004100000410000000000013246301624014462 5ustar www-datawww-data./plugins/move/src/move.h0000644000004100000410000000733513246301623015610 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "move_options.h" #include #include #include #include #include #define NUM_KEYS (sizeof (mKeys) / sizeof (mKeys[0])) struct _MoveKeys { const char *name; int dx; int dy; } mKeys[] = { { "Left", -1, 0 }, { "Right", 1, 0 }, { "Up", 0, -1 }, { "Down", 0, 1 } }; class MoveScreen : public GLScreenInterface, public ScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public MoveOptions { public: MoveScreen (CompScreen *screen); ~MoveScreen (); CompositeScreen *cScreen; GLScreen *gScreen; void updateOpacity (); void handleEvent (XEvent *); bool registerPaintHandler (compiz::composite::PaintHandler *pHnd); void unregisterPaintHandler (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); bool getMovingRectangle (BoxPtr pbox); bool damageMovingRectangle (BoxPtr pbox); bool glPaintMovingRectangle (const GLMatrix &transform, CompOutput *output, unsigned short *borderColor, unsigned short *fillColor); CompWindow *w; int savedX; int savedY; int x; int y; Region region; int status; KeyCode key[NUM_KEYS]; int releaseButton; GLushort moveOpacity; CompScreen::GrabHandle grab; unsigned int origState; bool paintRect; int rectX; int rectY; int snapOffX; int snapBackX; int snapOffY; int snapBackY; bool hasCompositing; bool yConstrained; }; class MoveWindow : public GLWindowInterface, public PluginClassHandler { public: MoveWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), cWindow (CompositeWindow::get (window)) { if (gWindow) GLWindowInterface::setHandler (gWindow, false); }; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; compiz::window::configure_buffers::Releasable::Ptr releasable; }; #define MOVE_SCREEN(s) \ MoveScreen *ms = MoveScreen::get (s) #define MOVE_WINDOW(w) \ MoveWindow *mw = MoveWindow::get (w) class MovePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/move/src/move.cpp0000644000004100000410000006617113246301623016146 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include "move.h" COMPIZ_PLUGIN_20090315 (move, MovePluginVTable) static const int defaultBorderWidth = 2; static const int biggerBorderWidthMultiplier = 2; static bool moveInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; MOVE_SCREEN (screen); Window xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w && (w->actions () & CompWindowActionMoveMask)) { CompScreen *s = screen; if (s->otherGrabExist ("move", NULL) || ms->w || w->overrideRedirect () || w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask | CompWindowTypeFullscreenMask)) return false; unsigned int mods = CompOption::getIntOptionNamed (options, "modifiers", 0); int x = CompOption::getIntOptionNamed (options, "x", w->geometry ().x () + (w->size ().width () / 2)); int y = CompOption::getIntOptionNamed (options, "y", w->geometry ().y () + (w->size ().height () / 2)); int button = CompOption::getIntOptionNamed (options, "button", -1); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (ms->region) { XDestroyRegion (ms->region); ms->region = NULL; } ms->status = RectangleOut; ms->savedX = w->serverGeometry ().x (); ms->savedY = w->serverGeometry ().y (); ms->x = 0; ms->y = 0; lastPointerX = x; lastPointerY = y; bool sourceExternalApp = CompOption::getBoolOptionNamed (options, "external", false); ms->yConstrained = sourceExternalApp && ms->optionGetConstrainY (); ms->origState = w->state (); CompRect workArea (s->getWorkareaForOutput (w->outputDevice ())); ms->snapBackX = w->serverGeometry ().x () - workArea.x (); ms->snapOffX = x - workArea.x (); ms->snapBackY = w->serverGeometry ().y () - workArea.y (); ms->snapOffY = y - workArea.y (); if (!ms->grab) { Cursor moveCursor = screen->cursorCache (XC_fleur); if (state & CompAction::StateInitButton) ms->grab = s->pushPointerGrab (moveCursor, "move"); else ms->grab = s->pushGrab (moveCursor, "move"); } if (ms->grab) { unsigned int grabMask = CompWindowGrabMoveMask | CompWindowGrabButtonMask; if (sourceExternalApp) grabMask |= CompWindowGrabExternalAppMask; ms->w = w; ms->releaseButton = button; w->grabNotify (x, y, mods, grabMask); /* Click raise happens implicitly on buttons 1, 2 and 3 so don't * restack this window again if the action buttonbinding was from * one of those buttons */ if (screen->getOption ("raise_on_click")->value ().b () && button != Button1 && button != Button2 && button != Button3) w->updateAttributes (CompStackingUpdateModeAboveFullscreen); if (state & CompAction::StateInitKey) { int xRoot = w->geometry ().x () + (w->size ().width () / 2); int yRoot = w->geometry ().y () + (w->size ().height () / 2); s->warpPointer (xRoot - pointerX, yRoot - pointerY); } if (ms->optionGetMode () != MoveOptions::ModeNormal) { Box box; ms->gScreen->glPaintOutputSetEnabled (ms, true); ms->paintRect = true; ms->rectX = 0; ms->rectY = 0; if (ms->getMovingRectangle (&box)) ms->damageMovingRectangle (&box); } if (ms->moveOpacity != OPAQUE) { MOVE_WINDOW (w); if (mw->cWindow) mw->cWindow->addDamage (); if (mw->gWindow) mw->gWindow->glPaintSetEnabled (mw, true); } if (ms->optionGetLazyPositioning ()) { MOVE_WINDOW (w); if (mw->gWindow) mw->releasable = w->obtainLockOnConfigureRequests (); } } } return false; } static bool moveTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { MOVE_SCREEN (screen); if (ms->w) { MOVE_WINDOW (ms->w); if (ms->paintRect) { ms->paintRect = false; ms->gScreen->glPaintOutputSetEnabled (ms, false); mw->window->move (ms->rectX, ms->rectY, true); } if (state & CompAction::StateCancel) { ms->w->move (ms->savedX - ms->w->geometry ().x (), ms->savedY - ms->w->geometry ().y (), false); } /* update window attributes as window constraints may have changed - needed e.g. if a maximized window was moved to another output device */ ms->w->updateAttributes (CompStackingUpdateModeNone); ms->w->ungrabNotify (); if (ms->grab) { screen->removeGrab (ms->grab, NULL); ms->grab = NULL; } if (ms->moveOpacity != OPAQUE) { if (mw->cWindow) mw->cWindow->addDamage (); if (mw->gWindow) mw->gWindow->glPaintSetEnabled (mw, false); } mw->releasable.reset (); ms->w = 0; ms->releaseButton = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } /* creates a region containing top and bottom struts. only struts that are outside the screen workarea are considered. */ static Region moveGetYConstrainRegion (CompScreen *s) { CompWindow *w; REGION r; CompRect workArea; BoxRec extents; Region region = XCreateRegion (); if (!region) return NULL; r.rects = &r.extents; r.numRects = r.size = 1; r.extents.x1 = MINSHORT; r.extents.y1 = 0; r.extents.x2 = 0; r.extents.y2 = s->height (); XUnionRegion (&r, region, region); r.extents.x1 = s->width (); r.extents.x2 = MAXSHORT; XUnionRegion (&r, region, region); for (unsigned int i = 0; i < s->outputDevs ().size (); i++) { XUnionRegion (s->outputDevs ()[i].region (), region, region); workArea = s->getWorkareaForOutput (i); extents = s->outputDevs ()[i].region ()->extents; foreach (w, s->windows ()) { if (!w->mapNum ()) continue; if (w->struts ()) { r.extents.x1 = w->struts ()->top.x; r.extents.y1 = w->struts ()->top.y; r.extents.x2 = r.extents.x1 + w->struts ()->top.width; r.extents.y2 = r.extents.y1 + w->struts ()->top.height; if (r.extents.x1 < extents.x1) r.extents.x1 = extents.x1; if (r.extents.x2 > extents.x2) r.extents.x2 = extents.x2; if (r.extents.y1 < extents.y1) r.extents.y1 = extents.y1; if (r.extents.y2 > extents.y2) r.extents.y2 = extents.y2; if (r.extents.x1 < r.extents.x2 && r.extents.y1 < r.extents.y2 && r.extents.y2 <= workArea.y ()) XSubtractRegion (region, &r, region); r.extents.x1 = w->struts ()->bottom.x; r.extents.y1 = w->struts ()->bottom.y; r.extents.x2 = r.extents.x1 + w->struts ()->bottom.width; r.extents.y2 = r.extents.y1 + w->struts ()->bottom.height; if (r.extents.x1 < extents.x1) r.extents.x1 = extents.x1; if (r.extents.x2 > extents.x2) r.extents.x2 = extents.x2; if (r.extents.y1 < extents.y1) r.extents.y1 = extents.y1; if (r.extents.y2 > extents.y2) r.extents.y2 = extents.y2; if (r.extents.x1 < r.extents.x2 && r.extents.y1 < r.extents.y2 && r.extents.y1 >= workArea.bottom ()) XSubtractRegion (region, &r, region); } } } return region; } static void moveHandleMotionEvent (CompScreen *s, int xRoot, int yRoot) { MOVE_SCREEN (s); if (ms->grab) { int dx, dy; CompWindow *w; w = ms->w; int wX = w->geometry ().x (); int wY = w->geometry ().y (); int wWidth = w->geometry ().widthIncBorders (); int wHeight = w->geometry ().heightIncBorders (); ms->x += xRoot - lastPointerX; ms->y += yRoot - lastPointerY; if (w->type () & CompWindowTypeFullscreenMask) dx = dy = 0; else { int min, max; dx = ms->x; dy = ms->y; CompRect workArea = s->getWorkareaForOutput (w->outputDevice ()); if (ms->yConstrained) { if (!ms->region) ms->region = moveGetYConstrainRegion (s); /* make sure that the top border extents or the top row of pixels are within what is currently our valid screen region */ if (ms->region) { int x = wX + dx - w->border ().left; int y = wY + dy - w->border ().top; int width = wWidth + w->border ().left + w->border ().right; int height = w->border ().top ? w->border ().top : 1; int status = XRectInRegion (ms->region, x, y, (unsigned int) width, (unsigned int) height); /* only constrain movement if previous position was valid */ if (ms->status == RectangleIn) { int xStatus = status; while (dx && xStatus != RectangleIn) { xStatus = XRectInRegion (ms->region, x, y - dy, (unsigned int) width, (unsigned int) height); if (xStatus != RectangleIn) dx += (dx < 0) ? 1 : -1; x = wX + dx - w->border ().left; } while (dy && status != RectangleIn) { status = XRectInRegion (ms->region, x, y, (unsigned int) width, (unsigned int) height); if (status != RectangleIn) dy += (dy < 0) ? 1 : -1; y = wY + dy - w->border ().top; } } else ms->status = status; } } if (ms->optionGetSnapoffSemimaximized ()) { int snapoffDistance = ms->optionGetSnapoffDistance (); int snapbackDistance = ms->optionGetSnapbackDistance (); if (w->state () & CompWindowStateMaximizedVertMask) { if (abs (yRoot - workArea.y () - ms->snapOffY) >= snapoffDistance) { if (!s->otherGrabExist ("move", NULL)) { int width = w->serverGeometry ().width (); if (w->saveMask () & CWWidth) width = w->saveWc ().width; ms->x = ms->y = 0; /* Get a lock on configure requests so that we can make * any movement here atomic */ compiz::window::configure_buffers::ReleasablePtr lock (w->obtainLockOnConfigureRequests ()); w->maximize (0); XWindowChanges xwc; xwc.x = xRoot - (width / 2); xwc.y = yRoot + w->border ().top / 2; w->configureXWindow (CWX | CWY, &xwc); ms->snapOffY = ms->snapBackY; return; } } } else if (ms->origState & CompWindowStateMaximizedVertMask && ms->optionGetSnapbackSemimaximized ()) { if (abs (yRoot - workArea.y () - ms->snapBackY) < snapbackDistance) { if (!s->otherGrabExist ("move", NULL)) { w->maximize (ms->origState); s->warpPointer (0, -snapbackDistance); return; } } } else if (w->state () & CompWindowStateMaximizedHorzMask) { if (abs (xRoot - workArea.x () - ms->snapOffX) >= snapoffDistance) { if (!s->otherGrabExist ("move", NULL)) { int width = w->serverGeometry ().width (); w->saveMask () |= CWX | CWY; if (w->saveMask () & CWWidth) width = w->saveWc ().width; /* Get a lock on configure requests so that we can make * any movement here atomic */ compiz::window::configure_buffers::ReleasablePtr lock (w->obtainLockOnConfigureRequests ()); w->maximize (0); XWindowChanges xwc; xwc.x = xRoot - (width / 2); xwc.y = yRoot + w->border ().top / 2; w->configureXWindow (CWX | CWY, &xwc); ms->snapOffX = ms->snapBackX; return; } } } else if (ms->origState & CompWindowStateMaximizedHorzMask && ms->optionGetSnapbackSemimaximized ()) { /* TODO: Snapping back horizontally just works for the left side * of the screen for now */ if (abs (xRoot - workArea.x () - ms->snapBackX) < snapbackDistance) { if (!s->otherGrabExist ("move", NULL)) { w->maximize (ms->origState); /* TODO: Here we should warp the pointer back, but this somehow interrupts * the horizontal maximizing, we should fix it and reenable this warp: * s->warpPointer (workArea.width () / 2 - snapbackDistance, 0); */ return; } } } } if (w->state () & CompWindowStateMaximizedVertMask) { min = workArea.y () + w->border ().top; max = workArea.bottom () - w->border ().bottom - wHeight; if (wY + dy < min) dy = min - wY; else if (wY + dy > max) dy = max - wY; } if (w->state () & CompWindowStateMaximizedHorzMask) { if (wX > (int) s->width () || wX + w->size ().width () < 0 || wX + wWidth < 0) return; min = workArea.x () + w->border ().left; max = workArea.right () - w->border ().right - wWidth; if (wX + dx < min) dx = min - wX; else if (wX + dx > max) dx = max - wX; } } if (dx || dy) { if (ms->optionGetMode () == MoveOptions::ModeNormal) { w->move (wX + dx - w->geometry ().x (), wY + dy - w->geometry ().y (), false); } else { ms->rectX += wX + dx - w->geometry ().x (); ms->rectY += wY + dy - w->geometry ().y (); } ms->x -= dx; ms->y -= dy; } } } void MoveScreen::handleEvent (XEvent *event) { switch (event->type) { case ButtonPress: case ButtonRelease: if (event->xbutton.root == screen->root () && grab && (releaseButton == -1 || releaseButton == (int) event->xbutton.button)) moveTerminate (&optionGetInitiateButton (), CompAction::StateTermButton, noOptions ()); break; case KeyPress: if (event->xkey.root == screen->root () && grab) for (unsigned int i = 0; i < NUM_KEYS; i++) if (event->xkey.keycode == key[i]) { int moveIncrement = optionGetKeyMoveInc (); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, mKeys[i].dx * moveIncrement, mKeys[i].dy * moveIncrement); break; } break; case MotionNotify: if (event->xmotion.root == screen->root ()) moveHandleMotionEvent (screen, pointerX, pointerY); break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == screen->root ()) moveHandleMotionEvent (screen, pointerX, pointerY); break; case ClientMessage: if (event->xclient.message_type == Atoms::wmMoveResize) { MOVE_SCREEN (screen); unsigned long type = event->xclient.data.l[2]; if (type == WmMoveResizeMove || type == WmMoveResizeMoveKeyboard) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { CompOption::Vector o; o.push_back (CompOption ("window", CompOption::TypeInt)); o[0].value ().set ((int) event->xclient.window); o.push_back (CompOption ("external", CompOption::TypeBool)); o[1].value ().set (true); if (event->xclient.data.l[2] == WmMoveResizeMoveKeyboard) moveInitiate (&optionGetInitiateKey (), CompAction::StateInitKey, o); /* TODO: not only button 1 */ else if (pointerMods & Button1Mask) { o.push_back (CompOption ("modifiers", CompOption::TypeInt)); o[2].value ().set ((int) pointerMods); o.push_back (CompOption ("x", CompOption::TypeInt)); o[3].value ().set ((int) event->xclient.data.l[0]); o.push_back (CompOption ("y", CompOption::TypeInt)); o[4].value ().set ((int) event->xclient.data.l[1]); o.push_back (CompOption ("button", CompOption::TypeInt)); o[5].value ().set ((int) (event->xclient.data.l[3] ? event->xclient.data.l[3] : -1)); moveInitiate (&optionGetInitiateButton (), CompAction::StateInitButton, o); moveHandleMotionEvent (screen, pointerX, pointerY); } } } else if (ms->w && type == WmMoveResizeCancel && ms->w->id () == event->xclient.window) { moveTerminate (&optionGetInitiateButton (), CompAction::StateCancel, noOptions ()); moveTerminate (&optionGetInitiateKey (), CompAction::StateCancel, noOptions ()); } } break; case DestroyNotify: if (w && w->id () == event->xdestroywindow.window) { moveTerminate (&optionGetInitiateButton (), 0, noOptions ()); moveTerminate (&optionGetInitiateKey (), 0, noOptions ()); } break; case UnmapNotify: if (w && w->id () == event->xunmap.window) { moveTerminate (&optionGetInitiateButton (), 0, noOptions ()); moveTerminate (&optionGetInitiateKey (), 0, noOptions ()); } break; default: break; } screen->handleEvent (event); } bool MoveWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLWindowPaintAttrib sAttrib = attrib; MOVE_SCREEN (screen); if (ms->grab && ms->w == window && ms->moveOpacity != OPAQUE) /* modify opacity of windows that are not active */ sAttrib.opacity = (sAttrib.opacity * ms->moveOpacity) >> 16; bool status = gWindow->glPaint (sAttrib, transform, region, mask); return status; } void MoveScreen::updateOpacity () { moveOpacity = (optionGetOpacity () * OPAQUE) / 100; } bool MoveScreen::registerPaintHandler(compiz::composite::PaintHandler *pHnd) { hasCompositing = true; cScreen->registerPaintHandler (pHnd); return true; } void MoveScreen::unregisterPaintHandler() { hasCompositing = false; cScreen->unregisterPaintHandler (); } MoveScreen::MoveScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), w (0), region (NULL), status (RectangleOut), releaseButton (0), grab (NULL), paintRect(false), rectX(0), rectY(0), hasCompositing (false), yConstrained (false) { updateOpacity (); for (unsigned int i = 0; i < NUM_KEYS; i++) key[i] = XKeysymToKeycode (screen->dpy (), XStringToKeysym (mKeys[i].name)); if (cScreen) { CompositeScreenInterface::setHandler (cScreen); hasCompositing = cScreen->compositingActive (); } optionSetOpacityNotify (boost::bind (&MoveScreen::updateOpacity, this)); optionSetInitiateButtonInitiate (moveInitiate); optionSetInitiateButtonTerminate (moveTerminate); optionSetInitiateKeyInitiate (moveInitiate); optionSetInitiateKeyTerminate (moveTerminate); ScreenInterface::setHandler (screen); GLScreenInterface::setHandler (gScreen); gScreen->glPaintOutputSetEnabled (this, false); } MoveScreen::~MoveScreen () { if (region) XDestroyRegion (region); } bool MoveScreen::getMovingRectangle (BoxPtr pBox) { MOVE_SCREEN (screen); CompWindow *w = ms->w; if (!w) return false; int wX = w->geometry ().x () - w->border ().left; int wY = w->geometry ().y () - w->border ().top; int wWidth = w->geometry ().widthIncBorders () + w->border ().left + w->border ().right; int wHeight = w->geometry ().heightIncBorders () + w->border ().top + w->border ().bottom; pBox->x1 = wX + ms->rectX; pBox->y1 = wY + ms->rectY; pBox->x2 = pBox->x1 + wWidth; pBox->y2 = pBox->y1 + wHeight; return true; } bool MoveScreen::damageMovingRectangle (BoxPtr pBox) { CompRegion damageRegion; int borderWidth; if (!cScreen || !pBox) return false; borderWidth = defaultBorderWidth; if (optionGetIncreaseBorderContrast ()) borderWidth *= biggerBorderWidthMultiplier; if (optionGetMode () == MoveOptions::ModeRectangle) { CompRect damage (pBox->x1 - borderWidth, pBox->y1 - borderWidth, pBox->x2 - pBox->x1 + borderWidth * 2, pBox->y2 - pBox->y1 + borderWidth * 2); damageRegion += damage; } else if (optionGetMode () == MoveOptions::ModeOutline) { // Top damageRegion += CompRect (pBox->x1 - borderWidth, pBox->y1 - borderWidth, pBox->x2 - pBox->x1 + borderWidth * 2, borderWidth * 2); // Right damageRegion += CompRect (pBox->x2 - borderWidth, pBox->y1 - borderWidth, borderWidth + borderWidth / 2, pBox->y2 - pBox->y1 + borderWidth * 2); // Bottom damageRegion += CompRect (pBox->x1 - borderWidth, pBox->y2 - borderWidth, pBox->x2 - pBox->x1 + borderWidth * 2, borderWidth * 2); // Left damageRegion += CompRect (pBox->x1 - borderWidth, pBox->y1 - borderWidth, borderWidth + borderWidth / 2, pBox->y2 - pBox->y1 + borderWidth * 2); } if (!damageRegion.isEmpty ()) { cScreen->damageRegion (damageRegion); return true; } return false; } bool MoveScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (status && paintRect) { unsigned short *borderColor = optionGetBorderColor (); unsigned short *fillColor = NULL; if (optionGetMode() == MoveOptions::ModeRectangle) fillColor = optionGetFillColor (); return glPaintMovingRectangle (transform, output, borderColor, fillColor); } return status; } bool MoveScreen::glPaintMovingRectangle (const GLMatrix &transform, CompOutput *output, unsigned short *borderColor, unsigned short *fillColor) { BoxRec box; if (!getMovingRectangle(&box)) return false; const unsigned short MaxUShort = std::numeric_limits ::max (); const float MaxUShortFloat = MaxUShort; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix sTransform (transform); bool usingAverageColors = false; GLfloat vertexData[12]; GLfloat vertexData2[24]; GLushort fc[4], bc[4], averageFillColor[4]; GLint origSrc, origDst; #ifdef USE_GLES GLint origSrcAlpha, origDstAlpha; #endif if (optionGetUseDesktopAverageColor ()) { const unsigned short *averageColor = screen->averageColor (); if (averageColor) { usingAverageColors = true; borderColor = const_cast(averageColor); memcpy (averageFillColor, averageColor, 4 * sizeof (unsigned short)); averageFillColor[3] = MaxUShort * 0.6; if (fillColor) fillColor = averageFillColor; } } bool blend = optionGetBlend (); if (blend && borderColor[3] == MaxUShort) { if (optionGetMode () == MoveOptions::ModeOutline || fillColor[3] == MaxUShort) blend = false; } if (blend) { #ifdef USE_GLES glGetIntegerv (GL_BLEND_SRC_RGB, &origSrc); glGetIntegerv (GL_BLEND_DST_RGB, &origDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &origSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &origDstAlpha); #else glGetIntegerv (GL_BLEND_SRC, &origSrc); glGetIntegerv (GL_BLEND_DST, &origDst); #endif } vertexData[0] = box.x1; vertexData[1] = box.y1; vertexData[2] = 0.0f; vertexData[3] = box.x1; vertexData[4] = box.y2; vertexData[5] = 0.0f; vertexData[6] = box.x2; vertexData[7] = box.y1; vertexData[8] = 0.0f; vertexData[9] = box.x2; vertexData[10] = box.y2; vertexData[11] = 0.0f; vertexData2[0] = box.x1; vertexData2[1] = box.y1; vertexData2[2] = 0.0f; vertexData2[3] = box.x1; vertexData2[4] = box.y2; vertexData2[5] = 0.0f; vertexData2[6] = box.x1; vertexData2[7] = box.y2; vertexData2[8] = 0.0f; vertexData2[9] = box.x2; vertexData2[10] = box.y2; vertexData2[11] = 0.0f; vertexData2[12] = box.x2; vertexData2[13] = box.y2; vertexData2[14] = 0.0f; vertexData2[15] = box.x2; vertexData2[16] = box.y1; vertexData2[17] = 0.0f; vertexData2[18] = box.x2; vertexData2[19] = box.y1; vertexData2[20] = 0.0f; vertexData2[21] = box.x1; vertexData2[22] = box.y1; vertexData2[23] = 0.0f; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (blend) { glEnable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } /* fill rectangle */ if (fillColor) { fc[3] = blend ? fillColor[3] : 0.85f * MaxUShortFloat; fc[0] = fillColor[0] * (unsigned long) fc[3] / MaxUShortFloat; fc[1] = fillColor[1] * (unsigned long) fc[3] / MaxUShortFloat; fc[2] = fillColor[2] * (unsigned long) fc[3] / MaxUShortFloat; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, fc); streamingBuffer->addVertices (4, &vertexData[0]); streamingBuffer->end (); streamingBuffer->render (sTransform); } /* draw outline */ int borderWidth = defaultBorderWidth; if (optionGetIncreaseBorderContrast() || usingAverageColors) { // Generate a lighter color based on border to create more contrast unsigned int averageColorLevel = (borderColor[0] + borderColor[1] + borderColor[2]) / 3; float colorMultiplier; if (averageColorLevel > MaxUShort * 0.3) colorMultiplier = 0.7; // make it darker else colorMultiplier = 2.0; // make it lighter bc[3] = borderColor[3]; bc[0] = MIN(MaxUShortFloat, ((float) borderColor[0]) * colorMultiplier) * bc[3] / MaxUShortFloat; bc[1] = MIN(MaxUShortFloat, ((float) borderColor[1]) * colorMultiplier) * bc[3] / MaxUShortFloat; bc[2] = MIN(MaxUShortFloat, ((float) borderColor[2]) * colorMultiplier) * bc[3] / MaxUShortFloat; if (optionGetIncreaseBorderContrast ()) { borderWidth *= biggerBorderWidthMultiplier; glLineWidth (borderWidth); streamingBuffer->begin (GL_LINES); streamingBuffer->addVertices (8, &vertexData2[0]); streamingBuffer->addColors (1, bc); streamingBuffer->end (); streamingBuffer->render (sTransform); } else if (usingAverageColors) { borderColor = bc; } } bc[3] = blend ? borderColor[3] : MaxUShortFloat; bc[0] = borderColor[0] * bc[3] / MaxUShortFloat; bc[1] = borderColor[1] * bc[3] / MaxUShortFloat; bc[2] = borderColor[2] * bc[3] / MaxUShortFloat; glLineWidth (defaultBorderWidth); streamingBuffer->begin (GL_LINES); streamingBuffer->addColors (1, bc); streamingBuffer->addVertices (8, &vertexData2[0]); streamingBuffer->end (); streamingBuffer->render (sTransform); if (blend) { glDisable (GL_BLEND); #ifdef USE_GLES glBlendFuncSeparate (origSrc, origDst, origSrcAlpha, origDstAlpha); #else glBlendFunc (origSrc, origDst); #endif } damageMovingRectangle (&box); return true; } bool MovePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/move/move.xml.in0000644000004100000410000001035513246301623015773 0ustar www-datawww-data <_short>Move Window <_long>Move your windows around Window Management composite opengl decor <_short>Appearance ./plugins/showdesktop/0000755000004100000410000000000013246301624015277 5ustar www-datawww-data./plugins/showdesktop/CMakeLists.txt0000644000004100000410000000016013246301623020033 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (showdesktop PLUGINDEPS composite opengl) ./plugins/showdesktop/showdesktop.xml.in0000644000004100000410000000705013246301623021001 0ustar www-datawww-data <_short>Show Desktop <_long>Access the desktop easily by using variable ways to move windows out of view Desktop showdesktop opengl composite opengl fade decor unityshell <_short>General <_short>Appearance ./plugins/showdesktop/src/0000755000004100000410000000000013246301624016066 5ustar www-datawww-data./plugins/showdesktop/src/showdesktop.h0000644000004100000410000001703313246301623020614 0ustar www-datawww-data/* * showdesktop.h * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * Give credit where credit is due, keep the authors message below. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * - Diogo Ferreira (playerX) * - Danny Baumann * - Sam Spilsbury * * * Copyright (c) 2007 Diogo "playerX" Ferreira * * This wouldn't have been possible without: * - Ideas from the compiz community (mainly throughnothing's) * - David Reveman's work * * */ #include #include #include #include #include #include "showdesktop_options.h" extern const unsigned short SD_STATE_OFF; extern const unsigned short SD_STATE_ACTIVATING; extern const unsigned short SD_STATE_ON; extern const unsigned short SD_STATE_DEACTIVATING; /* Initialize the enums containing allowed directions * for intelligent random and fully random direction modes */ enum IRDirection { IntelligentRandomToCorners, IntelligentRandomUpDown, IntelligentRandomLeftRight }; enum FRDirection { FullRandomUp, FullRandomDown, FullRandomLeft, FullRandomRight, FullRandomTopLeft, FullRandomBottomLeft, FullRandomTopRight, FullRandomBottomRight }; class ShowdesktopPlacer { public: ShowdesktopPlacer (); void up (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void down (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void left (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void right (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void topLeft (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void topRight (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void bottomLeft (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void bottomRight (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); void upOrDown (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void leftOrRight (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void closestCorner (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void partRandom (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, const CompSize &screen, int partSize); void random (const CompRect &workArea, const compiz::window::Geometry &geometry, const compiz::window::extents::Extents &border, int partSize); int placed; int onScreenX, onScreenY; int offScreenX, offScreenY; int origViewportX; int origViewportY; }; class ShowdesktopScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ShowdesktopOptions { public: ShowdesktopScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; int state; int moreAdjust; void handleEvent (XEvent *event); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void enterShowDesktopMode (); void leaveShowDesktopMode (CompWindow *); int prepareWindows (int oldState); }; class ShowdesktopWindow: public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: ShowdesktopWindow (CompWindow *); ~ShowdesktopWindow (); CompWindow *window; GLWindow *gWindow; int sid; int distance; ShowdesktopPlacer *placer; GLfloat xVelocity, yVelocity; GLfloat tx, ty; unsigned int notAllowedMask; unsigned int stateMask; bool showdesktoped; bool wasManaged; float delta; bool adjust; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void getAllowedActions (unsigned int &, unsigned int &); bool focus (); bool is (); void setHints (bool enterSDMode); void repositionPlacer (int oldState); int adjustVelocity (); int state; int moreAdjust; }; /* shortcut macros, usually named X_SCREEN and X_WINDOW * these might seem overly complicated but they are shortcuts so * we don't have to access the privates arrays all the time * */ #define SD_SCREEN(s) \ ShowdesktopScreen *ss = ShowdesktopScreen::get(s) #define SD_WINDOW(w) \ ShowdesktopWindow *sw = ShowdesktopWindow::get(w) /* class vtable definition */ class ShowdesktopPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/showdesktop/src/showdesktop.cpp0000644000004100000410000005516113246301623021153 0ustar www-datawww-data/* * showdesktop.cpp * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * Give credit where credit is due, keep the authors message below. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * - Diogo Ferreira (playerX) * - Danny Baumann * - Sam Spilsbury * * * Copyright (c) 2007 Diogo "playerX" Ferreira * * This wouldn't have been possible without: * - Ideas from the compiz community (mainly throughnothing's) * - David Reveman's work * * */ #include "showdesktop.h" COMPIZ_PLUGIN_20090315 (showdesktop, ShowdesktopPluginVTable); namespace cw = compiz::window; namespace cwe = compiz::window::extents; namespace { int windowBorderX (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.x () - border.left; } int windowBorderY (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.y () - border.top; } int windowBorderWidth (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.width () + border.left + border.right; } int windowBorderHeight (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.height () + border.top + border.bottom; } int widthAndRightBorder (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.width () + border.left + border.right; } int leftBorder (const cwe::Extents &border) { return border.left; } int widthAndBottomBorder (const cw::Geometry &geometry, const cwe::Extents &border) { return geometry.height () + border.bottom; } int topBorder (const cwe::Extents &border) { return border.top; } bool centerOfWindowIsOnLeftHalf (const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen) { return (windowBorderX (geometry, border) + (windowBorderWidth (geometry, border) / 2)) < (screen.width () / 2); } bool centerOfWindowIsOnTopHalf (const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen) { return (windowBorderY (geometry, border) + (windowBorderHeight (geometry, border) / 2)) < (screen.height () / 2); } } const unsigned short SD_STATE_OFF = 0; const unsigned short SD_STATE_ACTIVATING = 1; const unsigned short SD_STATE_ON = 2; const unsigned short SD_STATE_DEACTIVATING = 3; /* non interfacing code, aka the logic of the plugin */ bool ShowdesktopWindow::is () { SD_SCREEN (screen); if (window->grabbed ()) return false; if (!window->focus ()) return false; if (!ss->optionGetWindowMatch ().evaluate (window)) return false; if (window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; if (window->state () & CompWindowStateSkipPagerMask) return false; return true; } void ShowdesktopWindow::setHints (bool enterSDMode) { unsigned int state = window->state (); showdesktoped = enterSDMode; if (enterSDMode) { stateMask = state & CompWindowStateSkipPagerMask; state |= CompWindowStateSkipPagerMask; notAllowedMask = (CompWindowActionMoveMask | CompWindowActionResizeMask); window->changeState (state); //#warning need to make window->managed wrappable //window->setManaged (false) } else { //window->setManaged (wasManaged); state &= ~CompWindowStateSkipPagerMask; state |= (stateMask & CompWindowStateSkipPagerMask); notAllowedMask = 0; stateMask = 0; window->changeState (state); } } namespace { int topOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.y () - widthAndBottomBorder (geometry, border) + partSize; } int bottomOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.y () + workArea.height () + topBorder (border) - partSize; } int leftOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.x () - widthAndRightBorder (geometry, border) + partSize; } int rightOffscreenPosition (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { return workArea.x () + workArea.width () + leftBorder (border) - partSize; } } void ShowdesktopPlacer::up (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = geometry.x (); offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::down (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = geometry.x (); offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::left (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); offScreenY = geometry.y (); } void ShowdesktopPlacer::right (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); offScreenY = geometry.y (); } void ShowdesktopPlacer::topLeft (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::topRight (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::bottomLeft (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::bottomRight (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::leftOrRight (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { offScreenY = geometry.y (); if (centerOfWindowIsOnLeftHalf (geometry, border, screen)) offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); else offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::upOrDown (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { offScreenX = geometry.x (); if (centerOfWindowIsOnTopHalf (geometry, border, screen)) offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); else offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::closestCorner (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { if (centerOfWindowIsOnLeftHalf (geometry, border, screen)) offScreenX = leftOffscreenPosition (workArea, geometry, border, partSize); else offScreenX = rightOffscreenPosition (workArea, geometry, border, partSize); if (centerOfWindowIsOnTopHalf (geometry, border, screen)) offScreenY = topOffscreenPosition (workArea, geometry, border, partSize); else offScreenY = bottomOffscreenPosition (workArea, geometry, border, partSize); } void ShowdesktopPlacer::partRandom (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, const CompSize &screen, int partSize) { /* generate a random value in the range 0-2, which represents * the allowed direction for intelligent random direction mode */ IRDirection randomMode = static_cast(rand () % 3); /* move to corners */ switch (randomMode) { case IntelligentRandomToCorners: closestCorner (workArea, geometry, border, screen, partSize); break; case IntelligentRandomLeftRight: leftOrRight (workArea, geometry, border, screen, partSize); break; case IntelligentRandomUpDown: upOrDown (workArea, geometry, border, screen, partSize); break; } } void ShowdesktopPlacer::random (const CompRect &workArea, const cw::Geometry &geometry, const cwe::Extents &border, int partSize) { /* generate a random value in the range 0-7, which represents * the allowed direction for fully random direction mode */ FRDirection randomDirection = static_cast(rand () % 8); switch (randomDirection) { case FullRandomUp: up (workArea, geometry, border, partSize); break; case FullRandomDown: down (workArea, geometry, border, partSize); break; case FullRandomLeft: left (workArea, geometry, border, partSize); break; case FullRandomRight: right (workArea, geometry, border, partSize); break; case FullRandomTopLeft: topLeft (workArea, geometry, border, partSize); break; case FullRandomTopRight: topRight (workArea, geometry, border, partSize); break; case FullRandomBottomLeft: bottomLeft (workArea, geometry, border, partSize); break; case FullRandomBottomRight: bottomRight (workArea, geometry, border, partSize); break; } } void ShowdesktopWindow::repositionPlacer (int oldState) { if (!placer) return; SD_SCREEN (screen); if (oldState == SD_STATE_OFF) { placer->onScreenX = window->x (); placer->onScreenY = window->y (); placer->origViewportX = screen->vp ().x (); placer->origViewportY = screen->vp ().y (); } const int partSize = ss->optionGetWindowPartSize (); const CompRect &workArea = screen->workArea (); const cw::Geometry &geometry = window->geometry (); const cwe::Extents &border = window->border (); switch (ss->optionGetDirection ()) { /* Single directions */ case ShowdesktopOptions::DirectionUp: placer->up (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionDown: placer->down (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionLeft: placer->left (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionRight: placer->right (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionTopLeftCorner: placer->topLeft (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionBottomLeftCorner: placer->bottomLeft (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionTopRightCorner: placer->topRight (workArea, geometry, border, partSize); break; case ShowdesktopOptions::DirectionBottomRightCorner: placer->bottomRight (workArea, geometry, border, partSize); break; /* Dual directions */ case ShowdesktopOptions::DirectionUpDown: placer->upOrDown (workArea, geometry, border, *screen, partSize); break; case ShowdesktopOptions::DirectionLeftRight: placer->leftOrRight (workArea, geometry, border, *screen, partSize); break; /* Quad directions */ case ShowdesktopOptions::DirectionToCorners: placer->closestCorner (workArea, geometry, border, *screen, partSize); break; /* One of 3 random directions per window */ case ShowdesktopOptions::DirectionIntelligentRandom: placer->partRandom (workArea, geometry, border, *screen, partSize); break; /* One of 8 random directions per window */ case ShowdesktopOptions::DirectionFullyRandom: placer->random (workArea, geometry, border, partSize); break; default: break; } } int ShowdesktopScreen::prepareWindows (int oldState) { int count = 0; foreach (CompWindow *w, screen->windows ()) { SD_WINDOW (w); if (!sw->is ()) continue; if (!sw->placer) sw->placer = new ShowdesktopPlacer (); if (!sw->placer) continue; sw->repositionPlacer (oldState); sw->placer->placed = true; sw->adjust = true; w->setShowDesktopMode (true); sw->setHints (true); if (sw->tx) sw->tx -= (sw->placer->onScreenX - sw->placer->offScreenX); if (sw->ty) sw->ty -= (sw->placer->onScreenY - sw->placer->offScreenY); w->move (sw->placer->offScreenX - w->x (), sw->placer->offScreenY - w->y (), true); count++; } return count; } int ShowdesktopWindow::adjustVelocity () { float adjust, amount; float x1, y1; float baseX, baseY; SD_SCREEN (screen); x1 = y1 = 0.0; if (ss->state == SD_STATE_ACTIVATING) { x1 = placer->offScreenX; y1 = placer->offScreenY; baseX = placer->onScreenX; baseY = placer->onScreenY; } else { x1 = placer->onScreenX; y1 = placer->onScreenY; baseX = placer->offScreenX; baseY = placer->offScreenY; } float dx = x1 - (baseX + tx); adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; xVelocity = (amount * xVelocity + adjust) / (amount + 1.0f); float dy = y1 - (baseY + ty); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; yVelocity = (amount * yVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (xVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (yVelocity) < 0.2f) { xVelocity = yVelocity = 0.0f; tx = x1 - baseX; ty = y1 - baseY; return 0; } return 1; } /* this function gets called periodically (about every 15ms on this machine), * animation takes place here */ void ShowdesktopScreen::preparePaint (int msSinceLastPaint) { cScreen->preparePaint (msSinceLastPaint); if ((state == SD_STATE_ACTIVATING) || (state == SD_STATE_DEACTIVATING)) { int steps; float amount, chunk, speed, timestep; if (optionGetSkipAnimation()) { speed = USHRT_MAX; timestep = 0.1; } else { speed = optionGetSpeed(); timestep = optionGetTimestep(); } amount = msSinceLastPaint * 0.05f * speed; steps = amount / (0.5f * timestep); if (!steps) steps = 1; chunk = amount / (float)steps; while (steps--) { moreAdjust = 0; foreach (CompWindow *w, screen->windows ()) { SD_WINDOW (w); if (sw->adjust) { sw->adjust = sw->adjustVelocity (); moreAdjust |= sw->adjust; sw->tx += sw->xVelocity * chunk; sw->ty += sw->yVelocity * chunk; } } if (!moreAdjust) break; } } } bool ShowdesktopScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if ((state == SD_STATE_ACTIVATING) || (state == SD_STATE_DEACTIVATING)) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (attrib, transform, region, output, mask); } void ShowdesktopScreen::donePaint () { if (moreAdjust) cScreen->damageScreen (); else if (state == SD_STATE_ACTIVATING) state = SD_STATE_ON; else if (state == SD_STATE_DEACTIVATING) { bool inSDMode = false; foreach (CompWindow *w, screen->windows ()) { if (w->inShowDesktopMode ()) inSDMode = true; else { SD_WINDOW (w); if (sw->placer) { delete sw->placer; sw->placer = NULL; sw->tx = 0; sw->ty = 0; } } } if (inSDMode) state = SD_STATE_ON; else state = SD_STATE_OFF; } cScreen->donePaint (); } bool ShowdesktopWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { SD_SCREEN (screen); if ((ss->state == SD_STATE_ACTIVATING) || (ss->state == SD_STATE_DEACTIVATING)) { GLMatrix wTransform = transform; GLWindowPaintAttrib wAttrib = attrib; if (adjust) { float offsetX = (ss->state == SD_STATE_DEACTIVATING) ? (placer->offScreenX - placer->onScreenX) : (placer->onScreenX - placer->offScreenX); float offsetY = (ss->state == SD_STATE_DEACTIVATING) ? (placer->offScreenY - placer->onScreenY) : (placer->onScreenY - placer->offScreenY); mask |= PAINT_WINDOW_TRANSFORMED_MASK; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (1.0f, 1.0f, 1.0f); wTransform.translate(tx + offsetX - window->x (), ty + offsetY - window->y (), 0.0f); } return gWindow->glPaint (wAttrib, wTransform, region, mask); } else if (ss->state == SD_STATE_ON) { GLWindowPaintAttrib wAttrib = attrib; if (window->inShowDesktopMode ()) wAttrib.opacity = wAttrib.opacity * ss->optionGetWindowOpacity (); return gWindow->glPaint (wAttrib, transform, region, mask); } else return gWindow->glPaint (attrib, transform, region, mask); } void ShowdesktopScreen::handleEvent (XEvent *event) { switch (event->type) { case PropertyNotify: if (event->xproperty.atom == Atoms::desktopViewport) { SD_SCREEN (screen); if ((ss->state == SD_STATE_ON) || (ss->state == SD_STATE_ACTIVATING)) screen->leaveShowDesktopMode (NULL); } break; } screen->handleEvent (event); } void ShowdesktopWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { window->getAllowedActions (setActions, clearActions); clearActions |= notAllowedMask; } void ShowdesktopScreen::enterShowDesktopMode () { if (state == SD_STATE_OFF || state == SD_STATE_DEACTIVATING) { int count = prepareWindows (state); if (count > 0) { XSetInputFocus (screen->dpy (), screen->root (), RevertToPointerRoot, CurrentTime); state = SD_STATE_ACTIVATING; cScreen->damageScreen (); } } screen->enterShowDesktopMode (); } void ShowdesktopScreen::leaveShowDesktopMode (CompWindow *w) { if (state != SD_STATE_OFF) { foreach (CompWindow *cw, screen->windows ()) { SD_WINDOW (cw); if (w && (w->id () != cw->id ())) continue; if (sw->placer && sw->placer->placed) { sw->adjust = true; sw->placer->placed = false; /* adjust onscreen position to handle viewport changes */ sw->tx += (sw->placer->onScreenX - sw->placer->offScreenX); sw->ty += (sw->placer->onScreenY - sw->placer->offScreenY); sw->placer->onScreenX += (sw->placer->origViewportX - screen->vp (). x ()) * screen->width (); sw->placer->onScreenY += (sw->placer->origViewportY - screen->vp ().y ()) * screen->height (); cw->move (sw->placer->onScreenX - cw->x (), sw->placer->onScreenY - cw->y (), true); sw->setHints (false); cw->setShowDesktopMode (false); } } state = SD_STATE_DEACTIVATING; cScreen->damageScreen (); } screen->leaveShowDesktopMode (w); } bool ShowdesktopWindow::focus () { /* if (sw->showdesktoped) w->managed = sw->wasManaged;*/ bool ret = window->focus (); /* if (sw->showdesktoped) w->managed = false; */ return ret; } ShowdesktopPlacer::ShowdesktopPlacer () : placed (0), onScreenX (0), onScreenY (0), offScreenX (0), offScreenY (0), origViewportX (0), origViewportY (0) { } /* screen initialization */ ShowdesktopScreen::ShowdesktopScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), state (SD_STATE_OFF), moreAdjust (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); } /* window initialization */ ShowdesktopWindow::ShowdesktopWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), sid (0), distance (0), placer (NULL), xVelocity (0.0f), yVelocity (0.0f), tx (0.0f), ty (0.0f), notAllowedMask (0), stateMask (0), showdesktoped (false), wasManaged (window->managed ()), delta (1.0f), adjust (false), state (0), moreAdjust (false) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow); } ShowdesktopWindow::~ShowdesktopWindow () { if (placer) delete placer; } bool ShowdesktopPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/animationjc/0000755000004100000410000000000013246301623015220 5ustar www-datawww-data./plugins/animationjc/CMakeLists.txt0000644000004100000410000000017113246301623017757 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (animationjc PLUGINDEPS composite opengl animation) ./plugins/animationjc/animationjc.xml.in0000644000004100000410000000740113246301623020645 0ustar www-datawww-data <_short>Animations Experimental <_long>Extra window animations Effects opengl animation opengl composite animation decor <_short>Effect Settings <_short>Black Hole <_short>Flicker <_short>Ghost <_short>Popcorn <_short>Raindrop open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects animationjc:Black Hole <_name>Black Hole animationjc:Ghost <_name>Ghost animationjc:Popcorn <_name>Popcorn open_effects open_random_effects close_effects close_random_effects focus_effects animationjc:Flicker <_name>Flicker animationjc:Raindrop <_name>Raindrop ./plugins/animationjc/include/0000755000004100000410000000000013246301623016643 5ustar www-datawww-data./plugins/animationjc/include/animationjc/0000755000004100000410000000000013246301623021137 5ustar www-datawww-data./plugins/animationjc/include/animationjc/animationjc.h0000644000004100000410000000162313246301623023606 0ustar www-datawww-data#ifndef _COMPIZ_ANIMATIONJC_H #define _COMPIZ_ANIMATIONJC_H #define ANIMATIONADDON_ABI 20091206 #include #include #include #include using namespace::std; class PrivateAnimJCScreen; /// Base class for all polygon- and particle-based animations class BaseAddonAnim : virtual public Animation { public: BaseAddonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~BaseAddonAnim () {} bool needsDepthTest () { return mDoDepthTest; } protected: /// Gets info about the extension plugin that implements this animation. ExtensionPluginInfo *getExtensionPluginInfo (); CompositeScreen *mCScreen; GLScreen *mGScreen; bool mDoDepthTest; ///< Whether depth testing should be used in the effect }; #endif ./plugins/animationjc/src/0000755000004100000410000000000013246301624016010 5ustar www-datawww-data./plugins/animationjc/src/raindrop.cpp0000644000004100000410000000505413246301623020335 0ustar www-datawww-data#include "private.h" #include RaindropAnim::RaindropAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon) { } void RaindropAnim::initGrid () { mGridWidth = 20; mGridHeight = 20; } void RaindropAnim::step () { float t = 1. - progressLinear (); if (mCurWindowEvent == WindowEventClose) t = 1. - t; CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); AnimJCScreen *ajs = AnimJCScreen::get (screen); float waveLength = ajs->optionGetRaindropWavelength (); int numWaves = ajs->optionGetRaindropNumWaves (); float waveAmp = (pow ((float)oheight / ::screen->height (), 0.4) * 0.08) * ajs->optionGetRaindropAmplitude (); float wavePosition = -waveLength * numWaves + (1. + waveLength * numWaves) * t; GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; i++, object++) { Point3d &objPos = object->position (); float origx = wx + mModel->scale ().x () * (owidth * object->gridPosition ().x () - outExtents.left); objPos.setX (origx); float origy = wy + mModel->scale ().y () * (oheight * object->gridPosition ().y () - outExtents.top); objPos.setY (origy); // find distance to center in grid terms float gridDistance = sqrt (pow (object->gridPosition ().x ()-0.5, 2) + pow (object->gridPosition ().y ()-0.5, 2)) * sqrt (2); float distFromWave = gridDistance - wavePosition; if (distFromWave < waveLength*numWaves && distFromWave > 0) objPos.setZ (waveAmp * sin (3.14159265 * distFromWave / waveLength / numWaves) * pow (sin (3.14159265 * distFromWave / waveLength), 2)); else objPos.setZ (0); } } ./plugins/animationjc/src/animationjc.cpp0000644000004100000410000000753113246301623021015 0ustar www-datawww-data#include "private.h" class AnimJCPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; COMPIZ_PLUGIN_20090315 (animationjc, AnimJCPluginVTable); AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimJC animJCExtPluginInfo (CompString ("animationjc"), NUM_EFFECTS, animEffects, NULL, NUM_NONEFFECT_OPTIONS); AnimEffect AnimEffectBlackHole; AnimEffect AnimEffectFlicker; AnimEffect AnimEffectGhost; AnimEffect AnimEffectPopcorn; AnimEffect AnimEffectRaindrop; ExtensionPluginInfo * BaseAddonAnim::getExtensionPluginInfo () { return &animJCExtPluginInfo; } BaseAddonAnim::BaseAddonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mCScreen (CompositeScreen::get (::screen)), mGScreen (GLScreen::get (::screen)), mDoDepthTest (false) { } void AnimJCScreen::initAnimationList () { int i = 0; AnimEffectUsedFor focusableUsedFor = AnimEffectUsedFor::all () .exclude (AnimEventShade); AnimEffectUsedFor openUsedFor = AnimEffectUsedFor::all () .exclude (AnimEventShade) .exclude (AnimEventFocus); animEffects[i++] = AnimEffectBlackHole = new AnimEffectInfo ("animationjc:Black Hole", openUsedFor, &createAnimation); animEffects[i++] = AnimEffectFlicker = new AnimEffectInfo ("animationjc:Flicker", focusableUsedFor, &createAnimation); animEffects[i++] = AnimEffectGhost = new AnimEffectInfo ("animationjc:Ghost", openUsedFor, &createAnimation); animEffects[i++] = AnimEffectPopcorn = new AnimEffectInfo ("animationjc:Popcorn", openUsedFor, &createAnimation); animEffects[i++] = AnimEffectRaindrop = new AnimEffectInfo ("animationjc:Raindrop", focusableUsedFor, &createAnimation); animJCExtPluginInfo.effectOptions = &getOptions (); AnimScreen *as = AnimScreen::get (::screen); // Extends animation plugin with this set of animation effects. as->addExtension (&animJCExtPluginInfo); } PrivateAnimJCScreen::PrivateAnimJCScreen (CompScreen *s) : mOutput (s->fullscreenOutput ()) { } PrivateAnimJCScreen::~PrivateAnimJCScreen () { AnimScreen *as = AnimScreen::get (::screen); as->removeExtension (&animJCExtPluginInfo); for (int i = 0; i < NUM_EFFECTS; i++) { delete animEffects[i]; animEffects[i] = NULL; } } AnimJCScreen::AnimJCScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateAnimJCScreen (s)) { initAnimationList (); } AnimJCScreen::~AnimJCScreen () { delete priv; } AnimJCWindow::AnimJCWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), aWindow (AnimWindow::get (w)) { } AnimJCWindow::~AnimJCWindow () { Animation *curAnim = aWindow->curAnimation (); if (!curAnim) return; // We need to interrupt and clean up the animation currently being played // by animationaddon for this window (if any) if (curAnim->remainingTime () > 0 && curAnim->getExtensionPluginInfo ()->name == CompString ("animationjc")) { aWindow->postAnimationCleanUp (); } } bool AnimJCPluginVTable::init () { if (!CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) | !CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) | !CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) | !CompPlugin::checkPluginABI ("animation", ANIMATION_ABI)) return false; return true; } ./plugins/animationjc/src/ghost.cpp0000644000004100000410000000600413246301623017637 0ustar www-datawww-data#include "private.h" GhostAnim::GhostAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon) { } void GhostAnim::updateAttrib (GLWindowPaintAttrib &attrib) { AnimJCScreen *ajs = AnimJCScreen::get (screen); attrib.opacity *= 1. - progressLinear (); attrib.saturation *= ajs->optionGetGhostSaturation (); } void GhostAnim::initGrid () { AnimJCScreen *ajs = AnimJCScreen::get (screen); mGridWidth = ajs->optionGetGhostGrid (); mGridHeight = ajs->optionGetGhostGrid (); } void GhostAnim::step () { float t = 1. - progressLinear (); if (mCurWindowEvent == WindowEventClose) t = 1. - t; CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); AnimJCScreen *ajs = AnimJCScreen::get (screen); float waveAmp = 3 * ajs->optionGetGhostAmplitude (); float waveLengthX1 = 0.4; float waveLengthX2 = 0.3; float waveLengthY1 = 0.45; float waveLengthY2 = 0.35; float wavePositionX1 = 0.25 * t * ajs->optionGetGhostWaveSpeed (); float wavePositionX2 = -0.25 * t * ajs->optionGetGhostWaveSpeed (); float wavePositionY1 = 0.25 * t * ajs->optionGetGhostWaveSpeed (); float wavePositionY2 = -0.25 * t * ajs->optionGetGhostWaveSpeed (); GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; i++, object++) { Point3d &objPos = object->position (); float origx = wx + mModel->scale ().x () * (owidth * object->gridPosition ().x () - outExtents.left); float origy = wy + mModel->scale ().y () * (oheight * object->gridPosition ().y () - outExtents.top); float x = object->gridPosition ().x (); float y = object->gridPosition ().y (); float distFromWaveX1 = x - wavePositionX1; float distFromWaveX2 = x - wavePositionX2; float distFromWaveY1 = y - wavePositionY1; float distFromWaveY2 = y - wavePositionY2; objPos.setX (origx + waveAmp * sin (distFromWaveX1 / waveLengthX1 * 2 * M_PI) + waveAmp * sin (distFromWaveX2 / waveLengthX2 * 2 * M_PI)); objPos.setY (origy + waveAmp * sin (distFromWaveY1 / waveLengthY1 * 2 * M_PI) + waveAmp * sin (distFromWaveY2 / waveLengthY2 * 2 * M_PI)); objPos.setZ (0); } } ./plugins/animationjc/src/private.h0000644000004100000410000001265113246301623017637 0ustar www-datawww-data#include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include #include "animationjc_options.h" extern AnimEffect AnimEffectBlackHole; extern AnimEffect AnimEffectFlicker; extern AnimEffect AnimEffectGhost; extern AnimEffect AnimEffectPopcorn; extern AnimEffect AnimEffectRaindrop; #define NUM_EFFECTS 5 // This must have the value of the first "effect setting" above // in AnimJCScreenOptions #define NUM_NONEFFECT_OPTIONS 0 class ExtensionPluginAnimJC : public ExtensionPluginInfo { public: ExtensionPluginAnimJC (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex) {} ~ExtensionPluginAnimJC () {} const CompOutput *output () { return mOutput; } private: const CompOutput *mOutput; }; class AnimJCScreen : public PluginClassHandler, public AnimationjcOptions { public: AnimJCScreen (CompScreen *); ~AnimJCScreen (); int getIntenseTimeStep (); void initAnimationList (); private: PrivateAnimJCScreen *priv; }; class PrivateAnimJCScreen { friend class AnimJCScreen; public: PrivateAnimJCScreen (CompScreen *); ~PrivateAnimJCScreen (); protected: CompOutput &mOutput; }; class AnimJCWindow : public PluginClassHandler { public: AnimJCWindow (CompWindow *); ~AnimJCWindow (); protected: CompWindow *mWindow; ///< Window being animated. AnimWindow *aWindow; }; /*** BLACK HOLE **************************************************************/ class BlackHoleAnim : public GridTransformAnim { public: BlackHoleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); float getBlackHoleProgress () { return progressLinear (); } void initGrid (); inline bool using3D () { return false; } void step (); }; /*** RAINDROP ****************************************************************/ class RaindropAnim : public GridTransformAnim { public: RaindropAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void initGrid (); inline bool using3D () { return true; } void step (); }; /*** POPCORN *****************************************************************/ class PopcornSingleAnim : public TransformAnim { public: PopcornSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) { } float layerProgress (int); void applyTransform (); void updateAttrib (GLWindowPaintAttrib &); void updateBB (CompOutput &output); bool updateBBUsed () { return true; } }; class PopcornAnim : public MultiAnim { public: PopcornAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : MultiAnim ::MultiAnim (w, curWindowEvent, duration, info, icon) { } }; /*** GHOST *******************************************************************/ class GhostAnim : public GridTransformAnim { public: GhostAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void initGrid (); inline bool using3D () { return true; } void step (); void updateAttrib (GLWindowPaintAttrib &); }; /*** FLICKER *****************************************************************/ class FlickerSingleAnim : public GridTransformAnim { public: FlickerSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon) { } void updateAttrib (GLWindowPaintAttrib &); void initGrid (); void step (); bool updateBBUsed () { return true; } void updateBB (CompOutput &output) { TransformAnim::updateBB (output); } }; class FlickerAnim : public MultiAnim { public: FlickerAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : MultiAnim ::MultiAnim (w, curWindowEvent, duration, info, icon) { } }; ./plugins/animationjc/src/flicker.cpp0000644000004100000410000000451213246301623020134 0ustar www-datawww-data#include void FlickerSingleAnim::updateAttrib (GLWindowPaintAttrib &attrib) { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); float o = 0.2; attrib.opacity *= o / (1. - (4-layer)*o); } void FlickerSingleAnim::initGrid () { mGridWidth = 2; mGridHeight = 20; } void FlickerSingleAnim::step () { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float t = 1 - progressLinear (); if (mCurWindowEvent == WindowEventClose) t = 1 - t; float amplitude = AnimJCScreen::get (screen)->optionGetFlickerAmplitude (); float waveLength = 0.4; float wavePosition = -waveLength + (1. + waveLength) * t; float displacement = 0; GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; i++, object++) { Point3d &objPos = object->position (); if (i % 2 == 0) // left side; reuse old displacement on right side { float distFromWave = object->gridPosition ().y () - wavePosition; if (distFromWave > 0 && distFromWave <= waveLength) { displacement = amplitude * sin (distFromWave/waveLength * M_PI); } else { displacement = 0; } } float x = wx + mModel->scale ().x () * (owidth * object->gridPosition ().x () - outExtents.left); float y = wy + mModel->scale ().y () * (oheight * object->gridPosition ().y () - outExtents.top); switch (layer) { case 1: x -= displacement; break; case 2: x += displacement; break; case 3: y -= displacement; break; case 4: y += displacement; break; default: break; } objPos.setX (x); objPos.setY (y); objPos.setZ (0); } } ./plugins/animationjc/src/popcorn.cpp0000644000004100000410000000254213246301623020176 0ustar www-datawww-data#include #define WIN_X(w) ((w)->x () - (w)->input ().left) #define WIN_Y(w) ((w)->y () - (w)->input ().top) #define WIN_W(w) ((w)->width () + (w)->input ().left + (w)->input ().right) #define WIN_H(w) ((w)->height () + (w)->input ().top + (w)->input ().bottom) float PopcornSingleAnim::layerProgress (int layer) { if (layer == 0) return 0; float tStart = (5. - layer) / 6.; float tEnd = tStart + 1./3.; float t = progressLinear (); if (t < tStart) return 0; if (t > tEnd) return 1; return (t - tStart) / (tEnd - tStart); } void PopcornSingleAnim::updateAttrib (GLWindowPaintAttrib &attrib) { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); attrib.opacity *= 1. - progressLinear (); attrib.opacity *= 1. - layerProgress (layer); } void PopcornSingleAnim::applyTransform () { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); if (layer == 0) return; float p = layerProgress (layer); float v = 40.; float theta = (54. + 144.*(layer-1)) / 180. * 3.14159265; float dx = v * cos (theta) * p; float dy = -v * sin (theta) * p; mTransform.translate (dx, dy, 0.16*p*AnimJCScreen::get (screen)->optionGetPopcornKernelHeight ()); } void PopcornSingleAnim::updateBB (CompOutput &output) { TransformAnim::updateBB (output); } ./plugins/animationjc/src/blackhole.cpp0000644000004100000410000000460113246301623020440 0ustar www-datawww-data#include "private.h" #include BlackHoleAnim::BlackHoleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon), GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info, icon) { } void BlackHoleAnim::initGrid () { mGridWidth = 20; mGridHeight = 20; } void BlackHoleAnim::step () { CompRect winRect (mAWindow->savedRectsValid () ? mAWindow->saveWinRect () : mWindow->geometry ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); CompWindowExtents outExtents (mAWindow->savedRectsValid () ? mAWindow->savedOutExtents () : mWindow->output ()); int wx = winRect.x (); int wy = winRect.y (); int owidth = outRect.width (); int oheight = outRect.height (); float centerx = wx + mModel->scale ().x () * (owidth * 0.5 - outExtents.left); float centery = wy + mModel->scale ().y () * (oheight * 0.5 - outExtents.top); float delay = AnimJCScreen::get (screen)->optionGetBlackholeDelay (); float tau = (1. - delay) / 8.; GridModel::GridObject *object = mModel->objects (); unsigned int n = mModel->numObjects (); for (unsigned int i = 0; i < n; i++, object++) { // find distance to center in grid terms, 0..1 float gridDistance = 2 * max (fabs (object->gridPosition ().x ()-0.5), fabs (object->gridPosition ().y ()-0.5)); // use that and tau to find r float cutoff = gridDistance * delay; float r = 1; if (getBlackHoleProgress () > cutoff) r = exp (-(getBlackHoleProgress () - cutoff) / tau); // find real original coordinates float origx = wx + mModel->scale ().x () * (owidth * object->gridPosition ().x () - outExtents.left); float origy = wy + mModel->scale ().y () * (oheight * object->gridPosition ().y () - outExtents.top); // shrink toward center by r Point3d &objPos = object->position (); objPos.setX ((origx-centerx) * r + centerx); objPos.setY ((origy-centery) * r + centery); objPos.setZ (0); } } ./plugins/animationjc/compiz-animationjc.pc.in0000644000004100000410000000044013246301623021742 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-animationjc Description: Animation JC plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl compiz-animation Libs: -L${libdir} -lanimationjc Cflags: @COMPIZ_CFLAGS@ ./plugins/copytex/0000755000004100000410000000000013246301624014420 5ustar www-datawww-data./plugins/copytex/CMakeLists.txt0000644000004100000410000000015213246301623017155 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(copytex PLUGINDEPS composite opengl)./plugins/copytex/src/0000755000004100000410000000000013246301624015207 5ustar www-datawww-data./plugins/copytex/src/copytex.cpp0000644000004100000410000002143613246301623017413 0ustar www-datawww-data/* * Compiz copy to texture plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* * This plugin uses the "copy to texture" taken from Luminocity * http://live.gnome.org/Luminocity */ #include "copytex.h" #include COMPIZ_PLUGIN_20090315 (copytex, CopytexPluginVTable) const int MAX_SUB_TEX = 2048; const unsigned int SHM_SIZE = MAX_SUB_TEX * MAX_SUB_TEX * 4; static GLTexture::Matrix _identity_matrix = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; GLTexture::List CopyPixmap::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source) { if (depth != 32 && depth != 24) return GLTexture::List (); CopyPixmap::Ptr cp (CopyPixmap::create (pixmap, width, height, depth)); if (!cp->textures.size ()) return GLTexture::List (); else { GLTexture::List tl (cp->textures.size ()); for (unsigned int i = 0; i < cp->textures.size (); i++) tl[i] = cp->textures[i]; return tl; } return GLTexture::List (); } CopyPixmap::Ptr CopyPixmap::create (Pixmap pixmap, int width, int height, int depth) { int maxTS = MIN (MAX_SUB_TEX, GL::maxTextureSize); int nWidth = ceil ((float) width / (float) maxTS); int nHeight = ceil ((float) height / (float) maxTS); CopyPixmap::Ptr cp (new CopyPixmap (pixmap, width, height, depth)); cp->textures.resize (nWidth * nHeight); /* Creating a new CopyPixmap::Ptr here is okay since * the refcount will still effectively be the same */ for (int x = 0, w = width; x < nWidth; x++, w -= maxTS) for (int y = 0, h = height; y < nHeight; y++, h -= maxTS) cp->textures[y + (x * nHeight)] = new CopyTexture (cp, CompRect (x * maxTS, y * maxTS, MIN (w, maxTS), MIN (h, maxTS))); cp->damage = XDamageCreate (screen->dpy (), cp->pixmap, XDamageReportBoundingBox); CopytexScreen::get (screen)->pixmaps[cp->damage] = cp; return cp; } CopyPixmap::CopyPixmap (Pixmap pixmap, int width, int height, int depth) : pixmap (pixmap), damage (None), depth (depth) { } CopyPixmap::~CopyPixmap () { if (damage) XDamageDestroy (screen->dpy (), damage); if (CopytexScreen::get (screen)) CopytexScreen::get (screen)->pixmaps.erase (damage); } CopyTexture::CopyTexture (CopyPixmap::Ptr cp, CompRect dim) : cp (cp), dim (dim), damage (0, 0, dim.width (), dim.height ()) { GLenum target; GLTexture::Matrix matrix = _identity_matrix; #ifdef USE_GLES target = GL_TEXTURE_2D; matrix.xx = 1.0f / dim.width (); matrix.yy = 1.0f / dim.height (); matrix.x0 = -dim.x () * matrix.xx; matrix.y0 = -dim.y () * matrix.yy; #else if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (dim.width ()) && POWER_OF_TWO (dim.height ()))) { target = GL_TEXTURE_2D; matrix.xx = 1.0f / dim.width (); matrix.yy = 1.0f / dim.height (); matrix.x0 = -dim.x () * matrix.xx; matrix.y0 = -dim.y () * matrix.yy; } else { target = GL_TEXTURE_RECTANGLE_NV; matrix.xx = 1.0f; matrix.yy = 1.0f; matrix.x0 = -dim.x (); matrix.y0 = -dim.y (); } #endif setData (target, matrix, false); setGeometry (dim.x1 (), dim.y1 (), dim.x2 () - dim.x1 (), dim.y2 () - dim.y1 ()); glBindTexture (target, name ()); if (cp->depth == 32) glTexImage2D (target, 0, GL_RGBA, dim.width (), dim.height (), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0); else glTexImage2D (target, 0, GL_RGB, dim.width (), dim.height (), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0); setFilter (GL_NEAREST); setWrap (GL_CLAMP_TO_EDGE); } CopyTexture::~CopyTexture () { CopyPixmap::Textures::iterator it = std::find (cp->textures.begin (), cp->textures.end (), this); if (it != cp->textures.end ()) cp->textures.erase (it); } void CopyTexture::update () { COPY_SCREEN (screen); char *addr = 0; Pixmap tmpPix; XImage *image = 0; XGCValues gcv; GC gc; if (!damage.width () || !damage.height ()) return; gcv.graphics_exposures = false; gcv.subwindow_mode = IncludeInferiors; gc = XCreateGC (screen->dpy (), cp->pixmap, GCGraphicsExposures | GCSubwindowMode, &gcv); if (cs->useShm) tmpPix = XShmCreatePixmap (screen->dpy (), cp->pixmap, cs->shmInfo.shmaddr, &cs->shmInfo, damage.width (), damage.height (), cp->depth); else tmpPix = XCreatePixmap (screen->dpy (), cp->pixmap, damage.width (), damage.height (), cp->depth); XCopyArea (screen->dpy (), cp->pixmap, tmpPix, gc, dim.x () + damage.x (), dim.y () + damage.y (), damage.width (), damage.height (), 0, 0); XSync (screen->dpy (), false); if (cs->useShm) addr = cs->shmInfo.shmaddr; else { image = XGetImage (screen->dpy (), tmpPix, 0, 0, damage.width (), damage.height (), AllPlanes, ZPixmap); if (image) addr = image->data; } glBindTexture (target (), name ()); glTexSubImage2D (target (), 0, damage.x (), damage.y (), damage.width (), damage.height (), GL_BGRA, #if IMAGE_BYTE_ORDER == MSBFirst GL_UNSIGNED_INT_8_8_8_8_REV, #else GL_UNSIGNED_BYTE, #endif addr); glBindTexture (target (), 0); XFreePixmap (screen->dpy (), tmpPix); XFreeGC (screen->dpy (), gc); if (image) XDestroyImage (image); damage.setGeometry (0, 0, 0, 0); } void CopyTexture::enable (Filter filter) { update (); GLTexture::enable (filter); } void CopyTexture::disable () { GLTexture::disable (); } void CopytexScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type == damageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; std::map::iterator it = pixmaps.find (de->damage); if (it != pixmaps.end ()) { CopyPixmap::Ptr cp = it->second; int x1, x2, y1, y2; foreach (CopyTexture *t, cp->textures) { x1 = MAX (de->area.x, t->dim.x1 ()) - t->dim.x1 (); x2 = MIN (de->area.x + de->area.width, t->dim.x2 ()) - t->dim.x1 (); y1 = MAX (de->area.y, t->dim.y1 ()) - t->dim.y1 (); y2 = MIN (de->area.y + de->area.height, t->dim.y2 ()) - t->dim.y1 (); if (t->damage.width () && t->damage.height ()) { x1 = MIN (x1, t->damage.x1 ()); x2 = MAX (x2, t->damage.x2 ()); y1 = MIN (y1, t->damage.y1 ()); y2 = MAX (y2, t->damage.y2 ()); } if (x1 < x2 && y1 < y2) t->damage.setGeometry (x1, y1, x2 - x1, y2 - y1); } } } } CopytexScreen::CopytexScreen (CompScreen *screen) : PluginClassHandler (screen) { useShm = false; if (XShmQueryExtension (screen->dpy ())) { int i; Bool b; XShmQueryVersion (screen->dpy (), &i, &i, &b); if (b) useShm = true; } if (useShm) { shmInfo.shmid = shmget (IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0600); if (shmInfo.shmid < 0) { compLogMessage ("copytex", CompLogLevelError, "Can't create shared memory\n"); useShm = false; } } if (useShm) { shmInfo.shmaddr = (char *) shmat (shmInfo.shmid, 0, 0); if (shmInfo.shmaddr == ((char *)-1)) { shmctl (shmInfo.shmid, IPC_RMID, 0); compLogMessage ("copytex", CompLogLevelError, "Can't attach shared memory\n"); useShm = false; } } if (useShm) { shmInfo.readOnly = false; if (!XShmAttach (screen->dpy (), &shmInfo)) { shmdt (shmInfo.shmaddr); shmctl (shmInfo.shmid, IPC_RMID, 0); compLogMessage ("copytex", CompLogLevelError, "Can't attach X shared memory\n"); useShm = false; } } damageNotify = CompositeScreen::get (screen)->damageEvent () + XDamageNotify; ScreenInterface::setHandler (screen); hnd = GLScreen::get (screen)-> registerBindPixmap (CopyPixmap::bindPixmapToTexture); } CopytexScreen::~CopytexScreen () { if (useShm) { XShmDetach (screen->dpy (), &shmInfo); shmdt (shmInfo.shmaddr); shmctl (shmInfo.shmid, IPC_RMID, 0); } GLScreen::get (screen)->unregisterBindPixmap (hnd); } bool CopytexPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/copytex/src/copytex.h0000644000004100000410000000510313246301623017051 0ustar www-datawww-data/* * Compiz copy to texture plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /* * This plugin uses the "copy to texture" taken from Luminocity * http://live.gnome.org/Luminocity */ #include #include #include #include #include #include #include extern const int MAX_SUB_TEX; extern const unsigned int SHM_SIZE; class CopyTexture; class CopyPixmap { public: typedef std::vector Textures; typedef boost::shared_ptr Ptr; static CopyPixmap::Ptr create (Pixmap pixmap, int width, int height, int depth); ~CopyPixmap (); static GLTexture::List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source); public: Textures textures; Pixmap pixmap; Damage damage; int depth; private: CopyPixmap (Pixmap pixmap, int width, int height, int depth); }; class CopyTexture : public GLTexture { public: CopyTexture (boost::shared_ptr cp, CompRect dim); ~CopyTexture (); void enable (Filter filter); void disable (); void update (); const CompRect & size () const { return dim; } public: CopyPixmap::Ptr cp; CompRect dim; CompRect damage; }; class CopytexScreen : public ScreenInterface, public PluginClassHandler { public: CopytexScreen (CompScreen *screen); ~CopytexScreen (); void handleEvent (XEvent *); bool useShm; XShmSegmentInfo shmInfo; int damageNotify; std::map pixmaps; GLTexture::BindPixmapHandle hnd; }; #define COPY_SCREEN(s) \ CopytexScreen *cs = CopytexScreen::get (s) class CopytexPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/copytex/copytex.xml.in0000644000004100000410000000044513246301623017244 0ustar www-datawww-data <_short>Copy to texture <_long>Copy pixmap content to texture General opengl ./plugins/opengl/0000755000004100000410000000000013246301624014211 5ustar www-datawww-data./plugins/opengl/opengl.xml.in0000644000004100000410000001033713246301623016627 0ustar www-datawww-data <_short>OpenGL <_long>OpenGL Plugin General composite <_short>X11 Sync Objects <_short>Cards Blacklist <_long>The list of the cards for which we should disable X11/GL syncing. ./plugins/opengl/CMakeLists.txt0000644000004100000410000000143313246301623016751 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) set (INTERNAL_LIBRARIES compiz_opengl_double_buffer compiz_opengl_fsregion compiz_opengl_blacklist compiz_opengl_glx_tfp_bind ) add_subdirectory (src/doublebuffer) add_subdirectory (src/fsregion) add_subdirectory (src/blacklist) add_subdirectory (src/glxtfpbind) include_directories (src/glxtfpbind/include) if (USE_GLES) compiz_plugin(opengl PLUGINDEPS composite CFLAGSADD "-DUSE_GLES" LIBRARIES ${OPENGLES2_LIBRARIES} ${INTERNAL_LIBRARIES} dl INCDIRS ${OPENGLES2_INCLUDE_DIR}) else (USE_GLES) find_package (OpenGL) if (OPENGL_FOUND) compiz_plugin(opengl PLUGINDEPS composite LIBRARIES ${OPENGL_gl_LIBRARY} ${INTERNAL_LIBRARIES} dl INCDIRS ${OPENGL_INCLUDE_DIR}) endif (OPENGL_FOUND) endif (USE_GLES) ./plugins/opengl/DRIVERS0000644000004100000410000000554313246301623015260 0ustar www-datawww-dataNotes on Graphics Drivers ========================= Please amend this file as you discover undocumented behaviour in various graphics drivers as it will assist other developers who may face similar problems in future. fglrx ===== 1. fglrx is currently detecting the binary name "compiz" and forcing indirect mode rendering. This causes certain opengl functionality such as GLSL, framebuffer objects and vertex buffer objects to not work correctly even if they are advertised. RESOLVED. WORKAROUND: Distributions should change the binary name to something other than "compiz", either at ship time or execution time. nvidia ====== 1. nvidia does not permit vertex array client states and vertex buffer objects to be active at the same time. Eg, the following code has undefined behaviour and will crash. glEnableClientState (GL_VERTEX_ARRAY); ... glBindBufferARB (GL_ARRAY_BUFFER_ARB, vertexBuffer); glDrawArrays (GL_TRIANGLES, 0, vertexBufferSize); 2. nvidia does not permit mixing of extension and core functionality tokens with extension entry points and core functionality entry points. The following is undefined: glBindFramebufferEXT (GL_FRAMEBUFFER, fboId); mesa ==== 1. Mesa does not advertise GLX_BIND_TO_MIPMAP_TEXTURE_EXT even though mipmap storage for GLXPixmaps are supported. RESOLVED. WORKAROUND: Until this bug is fixed, detect when a Mesa driver is running and force the usage of GLX_BIND_TO_MIPMAP_TEXTURE on all 24 and 32 bit depth fbconfigs llvmpipe ======== 1. llvmpipe does not support using glXSwapBuffers and glXCopySubBufferMESA on the same front buffer RESOLVED. WORKAROUND: detect when llvmpipe is active and force the usage of glXSwapBuffers on every frame 2. llvmpipe will crash when a pixmap does not exist on the server side and glXBindTexImageEXT is used on it. RESOLVED. WORKAROUND: grab the server, query the server as to whether or not the pixmap exists, call glXBindTexImageEXT and then release the server grab. This will ensure we never call glXBindTexImageEXT on a destroyed pixmap. virtualbox ========== 1. vboxdrv requires the usage of a second X Server connection inside of glXBindTexImageEXT. If compiz requires a server grab at this time (eg, the pixmap may not have its lifetime managed by us, see issue #2 in llvmpipe), then the driver will hang in glXBindTexImageEXT as it must use this connection in order to listen for any new damage events. RESOLVED. WORKAROUND: force the usage of the copy-to-texture path when using this driver ("Chromium") and binding an externally managed pixmap to a texture vmwgfx ====== 1. vmwgfx does not implement glGenerateMipmap for FBO-backed textures. RESOLVED. WORKAROUND: do not use glGenerateMipmap with vmwgfx. This means that some functionality, like smoothed blurs will not be available on this driver. ./plugins/opengl/include/0000755000004100000410000000000013246301623015633 5ustar www-datawww-data./plugins/opengl/include/opengl/0000755000004100000410000000000013246301624017120 5ustar www-datawww-data./plugins/opengl/include/opengl/texture.h0000644000004100000410000002335413246301623020777 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * Copyright 2015 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _GLTEXTURE_H #define _GLTEXTURE_H #include "core/region.h" #include "core/string.h" #include #ifdef USE_GLES #include #else #include #endif #include #include #include #define POWER_OF_TWO(v) ((v & (v - 1)) == 0) /** * Returns a 2D matrix adjusted texture co-ordinate x */ #define COMP_TEX_COORD_X(m, vx) ((m).xx * (vx) + (m).x0) /** * Returns a 2D matrix adjusted texture co-ordinate y */ #define COMP_TEX_COORD_Y(m, vy) ((m).yy * (vy) + (m).y0) /** * Returns a 2D matrix adjusted texture co-ordinate xy */ #define COMP_TEX_COORD_XY(m, vx, vy) \ ((m).xx * (vx) + (m).xy * (vy) + (m).x0) /** * Returns a 2D matrix adjusted texture co-ordinate yx */ #define COMP_TEX_COORD_YX(m, vx, vy) \ ((m).yx * (vx) + (m).yy * (vy) + (m).y0) class PrivateTexture; /** * An abstract representation of an OpenGL texture. * * Enabling and disabling the texture, and drawing it with OpenGL * -------------------------------------------------------------- * * Because there are different texture binding backends, it is not safe to * enable the texture target using OpenGL directly. Instead, you should use the * ::enable () and ::disable () member functions. The ::enable () member * function also allows you to specifiy a level of texture filtering, either * Fast or Good. If you are drawing the texture at a smaller size then the * render size, then it should be safe to use the Fast filter. * * Getting OpenGL information about the texture * -------------------------------------------- * * It is possible to get the ::name () and ::target () of the texture to use * that data for OpenGL purposes. * * Mipmapping * ---------- * * Compiz also supports a mipmapping filter to make textures appear smoother * when viewed at angles. To enable this you can use the ::setMipmap and * ::mipmap functions in order to enable this. Mipmapping is not available on * certain hardware. In this case, the function will simply fail silently. * * Overloading the binding of textures * ----------------------------------- * * For whatever reason, you may wish to write your own texture binding method * which overloads the standard GLX_ext_texture_from_pixmap method. It is * possible to do this by overloading the ::enable () and ::disable () methods * of the GLTexture through your own class. Then on your plugin's init function * you should use GLTexture::BindPixmapHandle hnd = GLScreen::get * (screen)->registerBindPixmap (YourPixmap::bindPixmapToTexture) and on fini * you must also call GLScreen::get (screen)->unregistrerBindPixmap (hnd). * * A sample implementation can be found in the Copy To Texture plugin. */ class GLTexture : public CompRect { public: typedef enum { Fast, Good } Filter; /** * a texture matrix * * Texture Matrix manipulation * * Since all textures are 2D, it is possible to perform basic 2D * Manipulation operations on the texture. * * Member variable | Function * ----------------|---------- * .x0 | X Position on the screen * .y0 | Y Position on the screen * .xx | X Scale Factor * .yy | Y Scale Factor * .xy | X Shear Factor * .yx | Y Shear Factor * * The COMP_TEX_COORD functions return matrix-adjusted values for * texture positions. The "real" value of your co-ordinate on the * texture itself should be inputted into these functions, and these * functions will return the appropriate number to feed to functions * such as glTexCoord2f. */ typedef struct { float xx; float yx; float xy; float yy; float x0; float y0; } Matrix; typedef std::vector MatrixList; /** * a list of OpenGL textures, usually used for texture tiling * * In order to overcome hardware maximum texture size limitations, * Compiz supports tiled texturing. As such, all texture generation * functions (such as bindPixmapTotexture, imageDataToTexture, * readImageToTexture, etc) will all return a GLTexture:List. When * rendering these textures you must loop through each texture in the * list in order that you render each part of the texture that the user * sees. * * On especially small textures, it is ok to directly access the first * item in the list for the sake of optimization, however whenever it is * not clear what the size of the texture is, you should always loop the * list. */ class List : public std::vector { public: List (); List (unsigned int); List (const List &); ~List (); List & operator= (const List &); void clear (); }; typedef boost::function BindPixmapProc; typedef unsigned int BindPixmapHandle; public: /** * Returns the OpenGL texture name. */ GLuint name () const; /** * Returns the OpenGL texture target. */ GLenum target () const; /** * Returns the openGL texture filter. */ GLenum filter () const; /** * Returns a 2D 2x3 matrix describing the transformation of * this texture. */ const Matrix & matrix () const; /** * Establishes the texture as the current drawing texture * in the openGL context * * @param filter Defines what kind of filtering level this * texture should be drawn with */ virtual void enable (Filter filter); /** * Stops the textures from being the current drawing texture * in the openGL context */ virtual void disable (); /** * Returns true if this texture is MipMapped. */ bool mipmap () const; /** * Sets if this texture should be MipMapped. */ void setMipmap (bool); /** * Sets the openGL filter which should be used on this texture. */ void setFilter (GLenum); void setWrap (GLenum); /** * Increases the reference count of a texture. */ static void incRef (GLTexture *); /** * Decreases the reference count of a texture. */ static void decRef (GLTexture *); /** * Creates a collection of GLTextures from an X11 pixmap. * @param pixmap pixmap data which should be converted * into texture data * @param width width of the texture * @param height height of the texture * @param depth color depth of the texture * @param source whether the pixmap lifecycle is managed externally * * @returns a GLTexture::List with the contents of the pixmap. */ static List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source = compiz::opengl::InternallyManaged); /** * Creates a collection of GLTextures from a raw image buffer. * @param image a raw image buffer which should be converted * into texture data * @param size size of this new texture * * @returns a GLTexture::List with the contents of of * a raw image buffer. */ static List imageBufferToTexture (const char *image, CompSize size); /** * Creates a collection of GLTextures from raw pixel data. * @param image raw pixel data * @param size size of the raw pixel data * @param format GL format of the raw pixel data (eg. GL_RGBA) * @param type GL data type of the raw pixel data (eg. GL_FLOAT) */ static List imageDataToTexture (const char *image, CompSize size, GLenum format, GLenum type); /** * Uses image loading plugins to read an image from the disk and * return a GLTexture::List with its contents * * @param imageFileName filename of the image * @param pluginName name of the plugin, used to find the default * image path * @param size size of this new texture */ static List readImageToTexture (CompString &imageFileName, CompString &pluginName, CompSize &size); friend class PrivateTexture; protected: /** * Consrtucts a defauly empty GLTexture. * * @deprecated This function is only for ABI backwards compatibility and * will be removed in the future. */ GLTexture (); /** Constructs an OpenGL texture. */ GLTexture (int width, int height, GLenum target, Matrix const& m, bool mipmap); virtual ~GLTexture (); /** * Initializer. * * @deprecated This function is only for ABI backwards compatibility and * will be removed in the future. */ void setData (GLenum target, Matrix const& m, bool mipmap); private: PrivateTexture *priv; }; #endif ./plugins/opengl/include/opengl/vector.h0000644000004100000410000000654713246301623020606 0ustar www-datawww-data/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ #ifndef _GLVECTOR_H #define _GLVECTOR_H /** * Class which describes a point or vector * in 3D space */ class GLVector { public: typedef enum { x, y, z, w } VectorCoordsEnum; GLVector (); GLVector (float x, float y, float z, float w = 1.0f); /** * Returns a reference to the x, y, z or w value by using * 0, 1, 2, 3 as array-access items */ float& operator[] (int item); /** * Returns a reference to the x, y, z or w value by using * x, y, z, w as array-access items */ float& operator[] (VectorCoordsEnum coord); /** * Returns a readonly x, y, z or w value by using * 0, 1, 2, 3 as array-access items */ const float & operator[] (int item) const; /** * Returns a readonly x, y, z or w value by using * x, y, z, w as array-access items */ const float & operator[] (VectorCoordsEnum coord) const; /** * Adds all elements in a GLVector */ GLVector& operator+= (const GLVector& rhs); /** * Subtracts all elements in a GLVector */ GLVector& operator-= (const GLVector& rhs); /** * Scales all elements in a vector * @param k Scale factor */ GLVector& operator*= (const float k); /** * Scales all elements in a vector by 1 / k * @param k Scale factor */ GLVector& operator/= (const float k); GLVector& operator^= (const GLVector& rhs); /** * Returns the norm of this vector */ float norm (); /** * Returns the normalized version of the vector */ GLVector& normalize (); /** * Returns the homogenized version of the vector */ GLVector& homogenize (); private: friend GLVector operator+ (const GLVector& lhs, const GLVector& rhs); friend GLVector operator- (const GLVector& lhs, const GLVector& rhs); friend GLVector operator- (const GLVector& vector); friend float operator* (const GLVector& lhs, const GLVector& rhs); friend GLVector operator* (const float k, const GLVector& vector); friend GLVector operator* (const GLVector& vector, const float k); friend GLVector operator/ (const GLVector& lhs, const GLVector& rhs); friend GLVector operator^ (const GLVector& lhs, const GLVector& rhs); float v[4]; }; #endif ./plugins/opengl/include/opengl/shadercache.h0000644000004100000410000000620413246301623021524 0ustar www-datawww-data/* * Copyright © 2012 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Alexandros Frantzis */ #ifndef GL_SHADER_CACHE_H_ #define GL_SHADER_CACHE_H_ #include /** * How to use a variable in a shader. */ enum GLShaderVariableType { /** The variable is not used */ GLShaderVariableNone, /** The variable value is held in a uniform */ GLShaderVariableUniform, /** The variable value is held in a varying (from a vertex attribute) */ GLShaderVariableVarying, }; /** * Parameters that define a vertex-fragment shader pair. */ struct GLShaderParameters { /** Whether this shader supports opacity */ bool opacity; /** Whether this shader supports brightness */ bool brightness; /** Whether this shader supports saturation */ bool saturation; /** Whether this shader supports color and how */ GLShaderVariableType color; /** Whether this shader supports normals and how */ GLShaderVariableType normal; /** The number of textures this shader uses */ int numTextures; /** Gets a minimalistic string representation of the parameters */ std::string id() const; /** Gets a unique hash value for this set of parameters */ int hash() const; }; /** * An object representing a named vertex-fragment shader pair. */ struct GLShaderData { GLShaderData(const std::string &name, const std::string &vertexShader, const std::string &fragmentShader); std::string name; std::string vertexShader; std::string fragmentShader; bool isCached; }; class PrivateShaderCache; /** * A cache of vertex-fragment shader pairs (GLShaderData). */ class GLShaderCache { public: GLShaderCache (); ~GLShaderCache (); /** * Gets the GLShaderData associated with the specified parameters. * * @param params the parameters to get the GLShaderData for. * * @return the GLShaderData */ const GLShaderData &getShaderData (const GLShaderParameters ¶ms); private: PrivateShaderCache *priv; }; #endif ./plugins/opengl/include/opengl/program.h0000644000004100000410000000464613246301623020751 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #ifndef _COMPIZ_GLPROGRAM_H #define _COMPIZ_GLPROGRAM_H #ifdef USE_GLES #include #else #include #endif #include #include class PrivateProgram; class GLProgram { public: GLProgram (const CompString &vertexShader, const CompString &fragmentShader); ~GLProgram (); bool valid (); void bind (); void unbind (); bool setUniform (const char *name, GLfloat value); bool setUniform (const char *name, GLint value); bool setUniform (const char *name, const GLMatrix &value); bool setUniform2f (const char *name, GLfloat x, GLfloat y); bool setUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z); bool setUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); bool setUniform2i (const char *name, GLint x, GLint y); bool setUniform3i (const char *name, GLint x, GLint y, GLint z); bool setUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w); GLuint attributeLocation (const char *name); private: PrivateProgram *priv; }; #endif // _COMPIZ_GLPROGRAM_H ./plugins/opengl/include/opengl/vertexbuffer.h0000644000004100000410000001121113246301623021773 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins * Frederic Plourde */ #ifndef _COMPIZ_GLVERTEXBUFFER_H #define _COMPIZ_GLVERTEXBUFFER_H #ifdef USE_GLES #include #else #include #endif #include #include #include class PrivateVertexBuffer; struct GLWindowPaintAttrib; namespace compiz { namespace gl { class AutoProgram { public: virtual ~AutoProgram () {} virtual GLProgram *getProgram(GLShaderParameters ¶ms) = 0; }; } } class GLVertexBuffer { public: static bool enabled (); GLVertexBuffer (); GLVertexBuffer (GLenum usage); ~GLVertexBuffer (); typedef compiz::gl::AutoProgram AutoProgram; static GLVertexBuffer *streamingBuffer (); void begin (GLenum primitiveType = GL_TRIANGLES); bool end (); // vertices and normals are 3 parts, count is number of xyz groups void addVertices (GLuint nVertices, const GLfloat *vertices); GLfloat *getVertices () const; // AKA GLWindow::Geometry::vertices int getVertexStride () const; // AKA GLWindow::Geometry::vertexStride int countVertices () const; // AKA GLWindow::Geometry::vCount void addNormals (GLuint nNormals, const GLfloat *normals); // color is always RGBA (4 parts), count is number of rgba groups void addColors (GLuint nColors, const GLushort *colors); void color4f (GLfloat r, GLfloat g, GLfloat b, GLfloat a); void colorDefault (); // texture is index, texcoords are 2 parts, count is number of pairs void addTexCoords (GLuint texture, GLuint nTexcoords, const GLfloat *texcoords); GLuint countTextures () const; void addUniform (const char *name, GLfloat value); void addUniform (const char *name, GLint value); bool addUniform (const char *name, const GLMatrix &value); void addUniform2f (const char *name, GLfloat x, GLfloat y); void addUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z); void addUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void addUniform2i (const char *name, GLint x, GLint y); void addUniform3i (const char *name, GLint x, GLint y, GLint z); void addUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w); void setProgram (GLProgram *program); void setAutoProgram (AutoProgram *autoProgram); // This no-argument render () function is intended for use by plugins // that have custom programs. int render (); int render (const GLMatrix &modelview); int render (const GLushort *indices, GLuint nIndices); int render (const GLMatrix &modelview, const GLushort *indices, GLuint nIndices); int render (const GLMatrix &modelview, const GLWindowPaintAttrib &attrib); int render (const GLMatrix &modelview, const GLWindowPaintAttrib &attrib, const GLushort *indices, GLuint nIndices); int render (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib); int render (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib, const GLushort *indices, GLuint nIndices); void setVertexOffset (GLuint vOffset); void setMaxVertices (GLint vMax); private: PrivateVertexBuffer *priv; }; #endif // _COMPIZ_GLVERTEXBUFFER_H ./plugins/opengl/include/opengl/xtoglsync.h0000644000004100000410000000543513246301623021331 0ustar www-datawww-data/* * Copyright © 2011 NVIDIA Corporation * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * NVIDIA Corporation not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * NVIDIA Corporation makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NVIDIA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: James Jones */ #ifndef _GLXTOGLSYNC_H #define _GLXTOGLSYNC_H #include #include #include #include "opengl/opengl.h" /** * Class that manages an XFenceSync wrapped in a GLsync object. * * Can be used to synchronize operations in the GL command stream * with operations in the X command stream. */ class XToGLSync { public: XToGLSync (); ~XToGLSync (); XSyncAlarm alarm (void) const { return a; } bool isReady (void) const { return state == XTOGLS_READY; } /** * Sends the trigger request to the server. The fence will be signaled * after all rendering has completed. */ void trigger (void); /** * Calls glWaitSync. Any OpenGL commands after this will wait for the * fence to be signaled. */ void insertWait (void); /** * Blocks until the fence is signaled, or until a timeout expires. * * \param The maximum time to wait, in nanoseconds. * \return One of \c GL_ALREADY_SIGNALED, \c GL_CONDITION_SATISFIED, * \c GL_TIMEOUT_EXPIRED, or \c GL_WAIT_FAILED. */ GLenum checkUpdateFinished (GLuint64 timeout); /** * Resets the fence. */ void reset (void); void handleEvent (XSyncAlarmNotifyEvent *ev); private: XSyncFence f; GLsync fGL; XSyncCounter c; XSyncAlarm a; XSyncValue nextCounterValue; enum { XTOGLS_READY, XTOGLS_TRIGGER_SENT, XTOGLS_WAITING, XTOGLS_DONE, XTOGLS_RESET_PENDING, } state; static bool syncValuesInitialized; static XSyncValue zero; static XSyncValue one; static Bool alarmEventPredicate (Display *dpy, XEvent *ev, XPointer arg); }; #endif ./plugins/opengl/include/opengl/framebufferobject.h0000644000004100000410000000710013246301623022741 0ustar www-datawww-data/* * Copyright (c) 2011 Collabora, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Collabora Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Collabora Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * COLLABORA LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL COLLABORA LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Pekka Paalanen */ #ifndef _COMPIZ_GLFRAMEBUFFEROBJECT_H #define _COMPIZ_GLFRAMEBUFFEROBJECT_H #include struct PrivateGLFramebufferObject; /** * Class representing a framebuffer object in GL, supporting only one * color attachment as per GLES 2 spec. The color attachment is referred * to as the texture (of the FBO). * * Usage: * 1. create a GLFramebufferObject (requires a GL context) * 2. call allocate (size), and check status () * 3. old = bind () * 4. do your rendering * 5. rebind (old) * 6. use the rendered texture via tex () * 7. go to 2 or 3, or delete to quit (requires a GL context) */ class GLFramebufferObject { public: GLFramebufferObject (); ~GLFramebufferObject (); /** * Ensure the texture is of the given size, recreating it if needed, * and replace the FBO color attachment with it. The texture contents * become undefined, unless specified in the 'image' argument. * When specifying 'image', it's also possible to pass-in the * desired image's 'format' and 'type'. * * Returns true on success, and false on texture allocation failure. */ bool allocate (const CompSize &size, const char *image = NULL, GLenum format = GL_RGBA, GLenum type = GL_UNSIGNED_BYTE); /** * Bind this as the current FBO, previous binding in GL context is * undone. GL rendering is now targeted to this FBO. * Returns a pointer to the previously bound FBO, or NULL if * the previous binding was zero (the window system provided * framebuffer). * * The previous FBO is no longer bound, so you can use its * texture. To restore the previous FBO, call rebind (FBO) with * the returned pointer as the argument. */ GLFramebufferObject *bind (); /** * Bind the given FBO as the current FBO, without looking up the * previous binding. The argument can be NULL, in which case the * window system provided framebuffer gets bound (FBO is unbound). */ static void rebind (GLFramebufferObject *fbo); /** * Check the FBO completeness. Returns true on complete. * Otherwise returns false and reports the error to log. */ bool checkStatus (); /** * Return a pointer to the texture that is the color attachment. * This will return NULL, if allocate () has not been called, or * the last allocate () call failed. */ GLTexture *tex (); private: PrivateGLFramebufferObject *priv; }; #endif // _COMPIZ_GLFRAMEBUFFEROBJECT_H ./plugins/opengl/include/opengl/opengl.h0000644000004100000410000011614213246301623020561 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPIZ_OPENGL_H #define _COMPIZ_OPENGL_H #ifdef USE_GLES #define SUPPORT_X11 #include #include #include #include #else #include #include #include #include /* Some implementations have not yet given a definition * to GLX_BACK_BUFFER_AGE_EXT but this is the token as defined * in the spec (https://www.opengl.org/registry/specs/EXT/glx_buffer_age.txt) */ #define GLX_BACK_BUFFER_AGE_EXT 0x20F4 #endif #include #include #include #include #include #include #include #include #include #define COMPIZ_OPENGL_ABI 8 /* * Some plugins check for #ifdef USE_MODERN_COMPIZ_GL. Support it for now, but * but the offending code should be changed to: #if COMPIZ_OPENGL_ABI >= 5 * Or the preprocessor checks should be removed altogether. */ #define USE_MODERN_COMPIZ_GL 1 #if !defined(GL_BGRA) #if !defined(GL_BGRA_EXT) #error GL_BGRA support is required #else #define GL_BGRA GL_BGRA_EXT #endif #endif #if !defined(GL_BGRA) #if !defined(GL_BGRA_EXT) #error GL_BGRA support is required #else #define GL_BGRA GL_BGRA_EXT #endif #endif /** * camera distance from screen, 0.5 * tan (FOV) */ extern const float DEFAULT_Z_CAMERA; extern const float RED_SATURATION_WEIGHT; extern const float GREEN_SATURATION_WEIGHT; extern const float BLUE_SATURATION_WEIGHT; class PrivateGLScreen; class PrivateGLWindow; extern GLushort defaultColor[4]; #ifndef GLX_EXT_texture_from_pixmap #define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 #define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 #define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 #define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 #define GLX_Y_INVERTED_EXT 0x20D4 #define GLX_TEXTURE_FORMAT_EXT 0x20D5 #define GLX_TEXTURE_TARGET_EXT 0x20D6 #define GLX_MIPMAP_TEXTURE_EXT 0x20D7 #define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 #define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 #define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA #define GLX_TEXTURE_1D_BIT_EXT 0x00000001 #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 #define GLX_TEXTURE_1D_EXT 0x20DB #define GLX_TEXTURE_2D_EXT 0x20DC #define GLX_TEXTURE_RECTANGLE_EXT 0x20DD #define GLX_FRONT_LEFT_EXT 0x20DE #endif #ifndef GL_ARB_sync # ifndef GL_ES_VERSION_2_0 typedef struct __GLsync *GLsync; typedef int64_t GLint64; typedef uint64_t GLuint64; typedef intptr_t GLintptr; # endif # ifdef GL_APPLE_sync # define GL_TIMEOUT_IGNORED GL_TIMEOUT_IGNORED_APPLE # define GL_ALREADY_SIGNALED GL_ALREADY_SIGNALED_APPLE # define GL_TIMEOUT_EXPIRED GL_TIMEOUT_EXPIRED_APPLE # define GL_CONDITION_SATISFIED GL_CONDITION_SATISFIED_APPLE # define GL_WAIT_FAILED GL_WAIT_FAILED_APPLE # define GL_SYNC_GPU_COMMANDS_COMPLETE GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE # define GL_SYNC_STATUS GL_SYNC_STATUS _APPLE # define GL_SIGNALED GL_SIGNALED_APPLE # else # define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull # define GL_ALREADY_SIGNALED 0x911A # define GL_TIMEOUT_EXPIRED 0x911B # define GL_CONDITION_SATISFIED 0x911C # define GL_WAIT_FAILED 0x911D # define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 # define GL_SYNC_STATUS 0x9114 # define GL_SIGNALED 0x9119 # endif #endif #ifndef GL_EXT_x11_sync_object #define GL_SYNC_X11_FENCE_EXT 0x90E1 #endif namespace GL { #ifdef USE_GLES typedef EGLImageKHR (*EGLCreateImageKHRProc) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); typedef EGLBoolean (*EGLDestroyImageKHRProc) (EGLDisplay dpy, EGLImageKHR image); typedef void (*GLEGLImageTargetTexture2DOESProc) (GLenum target, GLeglImageOES image); typedef EGLBoolean (*EGLPostSubBufferNVProc) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); #else typedef void (*FuncPtr) (void); typedef FuncPtr (*GLXGetProcAddressProc) (const GLubyte *procName); typedef void (*GLXBindTexImageProc) (Display *display, GLXDrawable drawable, int buffer, int *attribList); typedef void (*GLXReleaseTexImageProc) (Display *display, GLXDrawable drawable, int buffer); typedef void (*GLXQueryDrawableProc) (Display *display, GLXDrawable drawable, int attribute, unsigned int *value); typedef void (*GLXCopySubBufferProc) (Display *display, GLXDrawable drawable, int x, int y, int width, int height); typedef int (*GLXGetVideoSyncProc) (unsigned int *count); typedef int (*GLXWaitVideoSyncProc) (int divisor, int remainder, unsigned int *count); typedef int (*GLXSwapIntervalProc) (int interval); #ifndef GLX_VERSION_1_3 typedef struct __GLXFBConfigRec *GLXFBConfig; #endif typedef GLXFBConfig *(*GLXGetFBConfigsProc) (Display *display, int screen, int *nElements); typedef int (*GLXGetFBConfigAttribProc) (Display *display, GLXFBConfig config, int attribute, int *value); typedef GLXPixmap (*GLXCreatePixmapProc) (Display *display, GLXFBConfig config, Pixmap pixmap, const int *attribList); typedef void (*GLXDestroyPixmapProc) (Display *display, GLXPixmap pixmap); typedef void (*GLGenProgramsProc) (GLsizei n, GLuint *programs); typedef void (*GLDeleteProgramsProc) (GLsizei n, GLuint *programs); typedef void (*GLBindProgramProc) (GLenum target, GLuint program); typedef void (*GLProgramStringProc) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); typedef void (*GLProgramParameter4fProc) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (*GLGetProgramivProc) (GLenum target, GLenum pname, int *params); #endif typedef void (*GLActiveTextureProc) (GLenum texture); typedef void (*GLClientActiveTextureProc) (GLenum texture); typedef void (*GLMultiTexCoord2fProc) (GLenum, GLfloat, GLfloat); typedef void (*GLGenFramebuffersProc) (GLsizei n, GLuint *framebuffers); typedef void (*GLDeleteFramebuffersProc) (GLsizei n, const GLuint *framebuffers); typedef void (*GLBindFramebufferProc) (GLenum target, GLuint framebuffer); typedef GLenum (*GLCheckFramebufferStatusProc) (GLenum target); typedef void (*GLFramebufferTexture2DProc) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (*GLGenerateMipmapProc) (GLenum target); typedef void (*GLBindBufferProc) (GLenum target, GLuint buffer); typedef void (*GLDeleteBuffersProc) (GLsizei n, const GLuint *buffers); typedef void (*GLGenBuffersProc) (GLsizei n, GLuint *buffers); typedef void (*GLBufferDataProc) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); typedef void (*GLBufferSubDataProc) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef void (*GLGetShaderivProc) (GLuint shader, GLenum pname, GLint *params); typedef void (*GLGetShaderInfoLogProc) (GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infoLog); typedef void (*GLGetProgramivProc) (GLuint program, GLenum pname, GLint* params); typedef void (*GLGetProgramInfoLogProc) (GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infoLog); typedef GLuint (*GLCreateShaderProc) (GLenum type); typedef void (*GLShaderSourceProc) (GLuint shader, GLsizei count, const GLchar **string, const GLint* length); typedef void (*GLCompileShaderProc) (GLuint shader); typedef GLuint (*GLCreateProgramProc) (); typedef void (*GLAttachShaderProc) (GLuint program, GLuint shader); typedef void (*GLLinkProgramProc) (GLuint program); typedef void (*GLValidateProgramProc) (GLuint program); typedef void (*GLDeleteShaderProc) (GLuint shader); typedef void (*GLDeleteProgramProc) (GLuint program); typedef void (*GLUseProgramProc) (GLuint program); typedef int (*GLGetUniformLocationProc) (GLuint program, const GLchar* name); typedef void (*GLUniform1fProc) (GLint location, GLfloat x); typedef void (*GLUniform1iProc) (GLint location, GLint x); typedef void (*GLUniform2fProc) (GLint location, GLfloat x, GLfloat y); typedef void (*GLUniform3fProc) (GLint location, GLfloat x, GLfloat y, GLfloat z); typedef void (*GLUniform4fProc) (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); typedef void (*GLUniform2iProc) (GLint location, GLint x, GLint y); typedef void (*GLUniform3iProc) (GLint location, GLint x, GLint y, GLint z); typedef void (*GLUniform4iProc) (GLint location, GLint x, GLint y, GLint z, GLint w); typedef void (*GLUniformMatrix4fvProc) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef int (*GLGetAttribLocationProc) (GLuint program, const GLchar *name); typedef void (*GLEnableVertexAttribArrayProc) (GLuint index); typedef void (*GLDisableVertexAttribArrayProc) (GLuint index); typedef void (*GLVertexAttribPointerProc) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *ptr); typedef void (*GLGenRenderbuffersProc) (GLsizei n, GLuint *rb); typedef void (*GLDeleteRenderbuffersProc) (GLsizei n, const GLuint *rb); typedef void (*GLBindRenderbufferProc) (GLenum target, GLuint renderbuffer); typedef void (*GLFramebufferRenderbufferProc) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (*GLRenderbufferStorageProc) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef GLsync (*GLFenceSyncProc) (GLenum condition, GLbitfield flags); typedef void (*GLDeleteSyncProc) (GLsync sync); typedef GLenum (*GLClientWaitSyncProc) (GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (*GLWaitSyncProc) (GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (*GLGetSyncivProc) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); typedef GLsync (*GLImportSyncProc) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); /* GL_ARB_shader_objects */ #ifndef USE_GLES typedef GLhandleARB (*GLCreateShaderObjectARBProc) (GLenum type); typedef GLhandleARB (*GLCreateProgramObjectARBProc) (); typedef void (*GLShaderSourceARBProc) (GLhandleARB shader, GLsizei count, const GLchar **string, const GLint* length); typedef void (*GLCompileShaderARBProc) (GLhandleARB shader); typedef void (*GLValidateProgramARBProc) (GLhandleARB program); typedef void (*GLDeleteObjectARBProc) (GLhandleARB object); typedef void (*GLAttachObjectARBProc) (GLhandleARB program, GLhandleARB shader); typedef void (*GLLinkProgramARBProc) (GLhandleARB program); typedef void (*GLUseProgramObjectARBProc) (GLhandleARB program); typedef int (*GLGetUniformLocationARBProc) (GLhandleARB program, const GLchar* name); typedef int (*GLGetAttribLocationARBProc) (GLhandleARB program, const GLchar *name); typedef void (*GLGetObjectParameterivProc) (GLhandleARB object, GLenum type, int *param); typedef void (*GLGetInfoLogProc) (GLhandleARB object, int maxLen, int *len, char *log); #endif #ifdef USE_GLES extern EGLCreateImageKHRProc createImage; extern EGLDestroyImageKHRProc destroyImage; extern GLEGLImageTargetTexture2DOESProc eglImageTargetTexture; #else extern GLXBindTexImageProc bindTexImage; extern GLXReleaseTexImageProc releaseTexImage; extern GLXQueryDrawableProc queryDrawable; extern GLXCopySubBufferProc copySubBuffer; extern GLXGetVideoSyncProc getVideoSync; extern GLXWaitVideoSyncProc waitVideoSync; extern GLXSwapIntervalProc swapInterval; extern GLXGetFBConfigsProc getFBConfigs; extern GLXGetFBConfigAttribProc getFBConfigAttrib; extern GLXCreatePixmapProc createPixmap; extern GLXDestroyPixmapProc destroyPixmap; extern GLGenProgramsProc genPrograms; extern GLDeleteProgramsProc deletePrograms; extern GLBindProgramProc bindProgram; extern GLProgramStringProc programString; extern GLProgramParameter4fProc programEnvParameter4f; extern GLProgramParameter4fProc programLocalParameter4f; extern GLGetProgramivProc getProgramiv; #endif extern GLActiveTextureProc activeTexture; extern GLClientActiveTextureProc clientActiveTexture; extern GLMultiTexCoord2fProc multiTexCoord2f; extern GLGenFramebuffersProc genFramebuffers; extern GLDeleteFramebuffersProc deleteFramebuffers; extern GLBindFramebufferProc bindFramebuffer; extern GLCheckFramebufferStatusProc checkFramebufferStatus; extern GLFramebufferTexture2DProc framebufferTexture2D; extern GLGenerateMipmapProc generateMipmap; extern GLBindBufferProc bindBuffer; extern GLDeleteBuffersProc deleteBuffers; extern GLGenBuffersProc genBuffers; extern GLBufferDataProc bufferData; extern GLBufferSubDataProc bufferSubData; extern GLGetShaderivProc getShaderiv; extern GLGetShaderInfoLogProc getShaderInfoLog; extern GLGetProgramivProc getProgramiv; extern GLGetProgramInfoLogProc getProgramInfoLog; extern GLCreateShaderProc createShader; extern GLShaderSourceProc shaderSource; extern GLCompileShaderProc compileShader; extern GLCreateProgramProc createProgram; extern GLAttachShaderProc attachShader; extern GLLinkProgramProc linkProgram; extern GLValidateProgramProc validateProgram; extern GLDeleteShaderProc deleteShader; extern GLDeleteProgramProc deleteProgram; extern GLUseProgramProc useProgram; extern GLGetUniformLocationProc getUniformLocation; extern GLUniform1fProc uniform1f; extern GLUniform1iProc uniform1i; extern GLUniform2fProc uniform2f; extern GLUniform2iProc uniform2i; extern GLUniform3fProc uniform3f; extern GLUniform3iProc uniform3i; extern GLUniform4fProc uniform4f; extern GLUniform4iProc uniform4i; extern GLUniformMatrix4fvProc uniformMatrix4fv; extern GLGetAttribLocationProc getAttribLocation; extern GLEnableVertexAttribArrayProc enableVertexAttribArray; extern GLDisableVertexAttribArrayProc disableVertexAttribArray; extern GLVertexAttribPointerProc vertexAttribPointer; extern GLGenRenderbuffersProc genRenderbuffers; extern GLDeleteRenderbuffersProc deleteRenderbuffers; extern GLBindRenderbufferProc bindRenderbuffer; extern GLFramebufferRenderbufferProc framebufferRenderbuffer; extern GLRenderbufferStorageProc renderbufferStorage; #ifndef USE_GLES extern GLCreateShaderObjectARBProc createShaderObjectARB; extern GLCreateProgramObjectARBProc createProgramObjectARB; extern GLShaderSourceARBProc shaderSourceARB; extern GLCompileShaderARBProc compileShaderARB; extern GLValidateProgramARBProc validateProgramARB; extern GLDeleteObjectARBProc deleteObjectARB; extern GLAttachObjectARBProc attachObjectARB; extern GLLinkProgramARBProc linkProgramARB; extern GLUseProgramObjectARBProc useProgramObjectARB; extern GLGetUniformLocationARBProc getUniformLocationARB; extern GLGetAttribLocationARBProc getAttribLocationARB; extern GLGetObjectParameterivProc getObjectParameteriv; extern GLGetInfoLogProc getInfoLog; #endif #ifdef USE_GLES static const GLenum FRAMEBUFFER_BINDING = GL_FRAMEBUFFER_BINDING; static const GLenum FRAMEBUFFER = GL_FRAMEBUFFER; static const GLenum RENDERBUFFER = GL_RENDERBUFFER; static const GLenum COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0; static const GLenum DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT; static const GLenum STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT; static const GLenum DEPTH24_STENCIL8 = GL_DEPTH24_STENCIL8_OES; /* OpenGL|ES does not support different draw/read framebuffers */ static const GLenum DRAW_FRAMEBUFFER = GL_FRAMEBUFFER; static const GLenum READ_FRAMEBUFFER = GL_FRAMEBUFFER; static const GLenum DRAW_FRAMEBUFFER_BINDING = FRAMEBUFFER_BINDING; static const GLenum READ_FRAMEBUFFER_BINDING = FRAMEBUFFER_BINDING; static const GLenum FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE; static const GLenum FRAMEBUFFER_UNDEFINED = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; static const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; static const GLenum FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_READ_BUFFER = 0; static const GLenum FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED; static const GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = 0; static const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; static const GLenum ARRAY_BUFFER = GL_ARRAY_BUFFER; static const GLenum STATIC_DRAW = GL_STATIC_DRAW; static const GLenum STREAM_DRAW = GL_STREAM_DRAW; static const GLenum DYNAMIC_DRAW = GL_DYNAMIC_DRAW; static const GLenum INFO_LOG_LENGTH = GL_INFO_LOG_LENGTH; static const GLenum COMPILE_STATUS = GL_COMPILE_STATUS; static const GLenum LINK_STATUS = GL_LINK_STATUS; static const GLenum FRAGMENT_SHADER = GL_FRAGMENT_SHADER; static const GLenum VERTEX_SHADER = GL_VERTEX_SHADER; #else static const GLenum FRAMEBUFFER_BINDING = GL_FRAMEBUFFER_BINDING_EXT; static const GLenum FRAMEBUFFER = GL_FRAMEBUFFER_EXT; static const GLenum RENDERBUFFER = GL_RENDERBUFFER; static const GLenum COLOR_ATTACHMENT0 = GL_COLOR_ATTACHMENT0_EXT; static const GLenum DEPTH_ATTACHMENT = GL_DEPTH_ATTACHMENT_EXT; static const GLenum STENCIL_ATTACHMENT = GL_STENCIL_ATTACHMENT_EXT; static const GLenum DEPTH24_STENCIL8 = GL_DEPTH24_STENCIL8_EXT; static const GLenum DRAW_FRAMEBUFFER = GL_DRAW_FRAMEBUFFER_EXT; static const GLenum READ_FRAMEBUFFER = GL_READ_FRAMEBUFFER_EXT; static const GLenum DRAW_FRAMEBUFFER_BINDING = GL_DRAW_FRAMEBUFFER_BINDING_EXT; static const GLenum READ_FRAMEBUFFER_BINDING = GL_READ_FRAMEBUFFER_BINDING_EXT; static const GLenum FRAMEBUFFER_COMPLETE = GL_FRAMEBUFFER_COMPLETE_EXT; static const GLenum FRAMEBUFFER_UNDEFINED = GL_FRAMEBUFFER_UNDEFINED; static const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_READ_BUFFER = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT; static const GLenum FRAMEBUFFER_UNSUPPORTED = GL_FRAMEBUFFER_UNSUPPORTED_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT; static const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0; static const GLenum ARRAY_BUFFER = GL_ARRAY_BUFFER_ARB; static const GLenum STATIC_DRAW = GL_STATIC_DRAW_ARB; static const GLenum STREAM_DRAW = GL_STREAM_DRAW_ARB; static const GLenum DYNAMIC_DRAW = GL_DYNAMIC_DRAW_ARB; static const GLenum INFO_LOG_LENGTH = GL_OBJECT_INFO_LOG_LENGTH_ARB; static const GLenum COMPILE_STATUS = GL_OBJECT_COMPILE_STATUS_ARB; static const GLenum LINK_STATUS = GL_OBJECT_LINK_STATUS_ARB; static const GLenum FRAGMENT_SHADER = GL_FRAGMENT_SHADER_ARB; static const GLenum VERTEX_SHADER = GL_VERTEX_SHADER_ARB; #endif extern GLFenceSyncProc fenceSync; extern GLDeleteSyncProc deleteSync; extern GLClientWaitSyncProc clientWaitSync; extern GLWaitSyncProc waitSync; extern GLGetSyncivProc getSynciv; extern GLImportSyncProc importSync; extern bool textureFromPixmap; extern bool textureRectangle; extern bool textureNonPowerOfTwo; extern bool textureNonPowerOfTwoMipmap; extern bool textureEnvCombine; extern bool textureEnvCrossbar; extern bool textureBorderClamp; extern bool textureCompression; extern GLint maxTextureSize; extern bool fboSupported; extern bool fboStencilSupported; extern bool fboEnabled; extern bool vboSupported; extern bool vboEnabled; extern bool shaders; extern bool stencilBuffer; extern GLint maxTextureUnits; extern bool bufferAge; extern bool sync; extern bool xToGLSync; extern bool canDoSaturated; extern bool canDoSlightlySaturated; #ifndef USE_GLES void getProgramInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log); void getShaderInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log); void getShaderivARBWrapper (GLuint object, GLenum type, int *param); void getProgramivARBWrapper (GLuint object, GLenum type, int *param); GLuint createShaderARBWrapper (GLenum type); GLuint createProgramARBWrapper (GLenum type); void shaderSourceARBWrapper (GLuint shader, GLsizei count, const GLchar **string, const GLint *length); void compileShaderARBWrapper (GLuint shader); void validateProgramARBWrapper (GLuint program); void deleteShaderARBWrapper (GLuint shader); void deleteProgramARBWrapper (GLuint program); void attachShaderARBWrapper (GLuint program, GLuint shader); void linkProgramARBWrapper (GLuint program); void useProgramARBWrapper (GLuint program); int getUniformLocationARBWrapper (GLuint program, const GLchar *name); int getAttribLocationARBWrapper (GLuint program, const GLchar *name); #endif }; struct GLScreenPaintAttrib { GLfloat xRotate; GLfloat yRotate; GLfloat vRotate; GLfloat xTranslate; GLfloat yTranslate; GLfloat zTranslate; GLfloat zCamera; }; #define MAX_DEPTH 32 #ifndef USE_GLES struct GLFBConfig { GLXFBConfig fbConfig; int yInverted; int mipmap; int textureFormat; int textureTargets; }; #endif extern const unsigned short NOTHING_TRANS_FILTER; extern const unsigned short SCREEN_TRANS_FILTER; extern const unsigned short WINDOW_TRANS_FILTER; extern GLScreenPaintAttrib defaultScreenPaintAttrib; class GLScreen; class GLFramebufferObject; class GLScreenInterface; extern template class WrapableInterface; class GLScreenInterface : public WrapableInterface { public: /** * Hookable function used for plugins to use openGL to draw on an output * * @param attrib Describes some basic drawing attribs for the screen * including translation, rotation and scale * @param matrix Describes a 4x4 3D modelview matrix for which this * screen should be drawn in * @param region Describes the region of the screen being redrawn * @param output Describes the output being redrawn * @param mask Bitmask which describes how the screen is being redrawn' */ virtual bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask); /** * Hookable function used for plugins to use openGL to draw on an output * when the screen is transformed * * There is little difference between this and glPaintOutput, however * this will be called when the entire screen is being transformed * (eg cube) * * @param attrib Describes some basic drawing attribs for the screen * including translation, rotation and scale * @param matrix Describes a 4x4 3D modelview matrix for which this * screen should be drawn in * @param region Describes the region of the screen being redrawn * @param output Describes the output being redrawn * @param mask Bitmask which describes how the screen is being redrawn' */ virtual void glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask); /** * Hookable function to apply elements from a GLScreenPaintAttrib * to a GLMatrix in the context of a CompOutput * * @param attrib Describes the basic drawing attribs of a screen * including translation, rotation and scale to be applies to a matrix * @param output Describes the output in which these operations take * place * @param matrix Pointer to a matrix where transformations will * be applied */ virtual void glApplyTransform (const GLScreenPaintAttrib &attrib, CompOutput *output, GLMatrix *mask); virtual void glEnableOutputClipping (const GLMatrix &, const CompRegion &, CompOutput *); virtual void glDisableOutputClipping (); virtual GLMatrix *projectionMatrix (); /** * Hookable function used by plugins to shade the final composited * Output. * * @param tmpRegion Describes the final composited output region * @param scratchFbo Describes the final composited FBO that is * to be rendered. */ virtual void glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask); /** * Return true if glPaintCompositedOutput is required for this frame */ virtual bool glPaintCompositedOutputRequired (); /** * Hookable function used by plugins to determine stenciling mask */ virtual void glBufferStencil (const GLMatrix &matrix, GLVertexBuffer &vertexBuffer, CompOutput *output); }; extern template class PluginClassHandler; class GLScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: GLScreen (CompScreen *s); ~GLScreen (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); /** * Returns the current compiz-wide openGL texture filter */ GLenum textureFilter (); /** * Sets a new compiz-wide openGL texture filter */ void setTextureFilter (GLenum); void clearTargetOutput (unsigned int mask); /** * Gets the libGL address of a particular openGL functor */ #ifndef USE_GLES GL::FuncPtr getProcAddress (const char *name); #endif void updateBackground (); /** * Returns the current compiz-wide texture filter */ GLTexture::Filter filter (int); /** * Sets a new compiz-wide texture filter */ void setFilter (int, GLTexture::Filter); /** * Sets a new compiz-wid openGL texture environment mode */ void setTexEnvMode (GLenum mode); /** * Turns lighting on and off */ void setLighting (bool lighting); /** * Returns true if lighting is enabled */ bool lighting (); void clearOutput (CompOutput *output, unsigned int mask); void setDefaultViewport (); GLTexture::BindPixmapHandle registerBindPixmap (GLTexture::BindPixmapProc); void unregisterBindPixmap (GLTexture::BindPixmapHandle); #ifndef USE_GLES GLFBConfig * glxPixmapFBConfig (unsigned int depth); #endif #ifdef USE_GLES EGLContext getEGLContext (); #endif /** * Returns a GLProgram from the cache or creates one and caches it */ GLProgram *getProgram (std::list); /** * Returns a GLShaderData from the cache or creates one and caches it */ const GLShaderData *getShaderData (GLShaderParameters ¶ms); /** * Returns the FBO compiz is using for the screen */ GLFramebufferObject *fbo (); /** * Returns a default icon texture */ GLTexture *defaultIcon (); void resetRasterPos (); bool glInitContext (XVisualInfo *); bool driverHasBrokenFBOMipmaps () const; WRAPABLE_HND (0, GLScreenInterface, bool, glPaintOutput, const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); WRAPABLE_HND (1, GLScreenInterface, void, glPaintTransformedOutput, const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); WRAPABLE_HND (2, GLScreenInterface, void, glApplyTransform, const GLScreenPaintAttrib &, CompOutput *, GLMatrix *); WRAPABLE_HND (3, GLScreenInterface, void, glEnableOutputClipping, const GLMatrix &, const CompRegion &, CompOutput *); WRAPABLE_HND (4, GLScreenInterface, void, glDisableOutputClipping); WRAPABLE_HND (5, GLScreenInterface, GLMatrix *, projectionMatrix); WRAPABLE_HND (6, GLScreenInterface, void, glPaintCompositedOutput, const CompRegion &, GLFramebufferObject *, unsigned int); WRAPABLE_HND (7, GLScreenInterface, bool, glPaintCompositedOutputRequired); WRAPABLE_HND (8, GLScreenInterface, void, glBufferStencil, const GLMatrix &, GLVertexBuffer &, CompOutput *); friend class GLTexture; friend class GLWindow; private: PrivateGLScreen *priv; }; struct GLWindowPaintAttrib { GLushort opacity; GLushort brightness; GLushort saturation; GLfloat xScale; GLfloat yScale; GLfloat xTranslate; GLfloat yTranslate; }; class GLWindow; class GLWindowInterface; extern template class WrapableInterface; class GLWindowInterface : public WrapableInterface { public: /** * Hookable function to paint a window on-screen * * @param attrib Describes basic drawing attribs of this window; * opacity, brightness, saturation * @param matrix A 4x4 matrix which describes the transformation of * this window * @param region Describes the region of the window being drawn * @param mask Bitmask which describes how this window is drawn */ virtual bool glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask); /** * Hookable function to draw a window on-screen * * Unlike glPaint, when glDraw is called, the window is * drawn immediately * * @param matrix A 4x4 matrix which describes the transformation of * this window * @param attrib A Fragment attrib which describes the texture * modification state of this window * @param region Describes which region will be drawn * @param mask Bitmask which describes how this window is drawn */ virtual bool glDraw (const GLMatrix &matrix, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask); /** * Hookable function to add points to a window * texture geometry * * This function adds rects to a window's texture geometry * and modifies their points by the values in the GLTexture::MatrixList * * It is used for texture transformation to set points * for where the texture should be skewed * * @param matrices Describes the matrices by which the texture exists * @param region * @param clipRegion * @param min * @param max */ virtual void glAddGeometry (const GLTexture::MatrixList &matrices, const CompRegion ®ion, const CompRegion &clipRegion, unsigned int min = MAXSHORT, unsigned int max = MAXSHORT); virtual void glDrawTexture (GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int); /** * Hookable function to notify transformation was complete, plugins * should use the results of transformation from glPaint here */ virtual void glTransformationComplete (const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask); }; extern template class PluginClassHandler; class GLWindow : public WrapableHandler, public PluginClassHandler { public: static GLWindowPaintAttrib defaultPaintAttrib; public: GLWindow (CompWindow *w); ~GLWindow (); const CompRegion & clip () const; /** * Returns the current paint attributes for this window */ GLWindowPaintAttrib & paintAttrib (); /** * Returns the last paint attributes for this window */ GLWindowPaintAttrib & lastPaintAttrib (); unsigned int lastMask () const; /** * Binds this window to an openGL texture */ bool bind (); /** * Releases this window from an openGL texture */ void release (); /** * Returns the tiled textures for this window */ const GLTexture::List & textures () const; /** * Returns the matrices for the tiled textures for this windwo */ const GLTexture::MatrixList & matrices () const; void updatePaintAttribs (); /** * Returns the window vertex buffer object */ GLVertexBuffer * vertexBuffer (); /** * Add a vertex and/or fragment shader function to the pipeline. * * @param name Name of the plugin adding the functions * @param vertex_shader Function to add to the vertex shader * @param fragment_shader Function to add to the fragment shader */ void addShaders (std::string name, std::string vertex_shader, std::string fragment_shader); /** * Use this if overriding glDrawTexture completely - used to clear * out any internal shader caches. */ void clearShaders (); GLTexture *getIcon (int width, int height); WRAPABLE_HND (0, GLWindowInterface, bool, glPaint, const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); WRAPABLE_HND (1, GLWindowInterface, bool, glDraw, const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); WRAPABLE_HND (2, GLWindowInterface, void, glAddGeometry, const GLTexture::MatrixList &, const CompRegion &, const CompRegion &, unsigned int = MAXSHORT, unsigned int = MAXSHORT); WRAPABLE_HND (3, GLWindowInterface, void, glDrawTexture, GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int); WRAPABLE_HND (4, GLWindowInterface, void, glTransformationComplete, const GLMatrix &, const CompRegion &, unsigned int); friend class GLScreen; friend class PrivateGLScreen; private: PrivateGLWindow *priv; }; #endif ./plugins/opengl/include/opengl/pixmapsource.h0000644000004100000410000000262213246301623022011 0ustar www-datawww-data/* * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_OPENGL_PIXMAP_SOURCE_H #define _COMPIZ_OPENGL_PIXMAP_SOURCE_H namespace compiz { namespace opengl { typedef enum _PixmapSource { InternallyManaged = 0, ExternallyManaged = 1 } PixmapSource; } } #endif ./plugins/opengl/include/opengl/doublebuffer.h0000644000004100000410000000377313246301623021746 0ustar www-datawww-data#ifndef _COMPIZ_OPENGL_BUFFERBLIT_H #define _COMPIZ_OPENGL_BUFFERBLIT_H #include #include namespace compiz { namespace opengl { namespace impl { typedef boost::function GLXWaitVideoSyncSGIFunc; typedef boost::function GLXSwapIntervalEXTFunc; } class DoubleBuffer { public: DoubleBuffer (const impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc); virtual ~DoubleBuffer (); virtual void swap () const = 0; virtual bool blitAvailable () const = 0; virtual void blit (const CompRegion ®ion) const = 0; virtual bool fallbackBlitAvailable () const = 0; virtual void fallbackBlit (const CompRegion ®ion) const = 0; virtual void copyFrontToBack () const = 0; typedef enum { VSYNC, HAVE_PERSISTENT_BACK_BUFFER, NEED_PERSISTENT_BACK_BUFFER, _NSETTINGS } Setting; typedef enum _RedrawType { Swap, Blit } FrontbufferRedrawType; typedef enum _SyncType { NoSync = 0, Async = 1, Blocking = 2 } SyncType; typedef enum _FrameThrottleState { ExternalFrameThrottlingRequired, FrameThrottledInternally } FrameThrottleState; void set (Setting name, bool value); void render (const CompRegion ®ion, bool fullscreen); void vsync (FrontbufferRedrawType redrawType); bool hardwareVSyncFunctional (); protected: bool setting[_NSETTINGS]; private: virtual bool enableAsyncVideoSync (FrontbufferRedrawType, FrameThrottleState &); virtual void disableAsyncVideoSync (); virtual bool enableBlockingVideoSync (FrontbufferRedrawType, FrameThrottleState &); virtual void disableBlockingVideoSync (); SyncType syncType; FrameThrottleState bufferFrameThrottleState; unsigned int blockingVSyncUnthrottledFrames; impl::GLXSwapIntervalEXTFunc swapIntervalFunc; impl::GLXWaitVideoSyncSGIFunc waitVideoSyncFunc; unsigned int lastVSyncCounter; }; } } #endif ./plugins/opengl/include/opengl/programcache.h0000644000004100000410000000316513246301623021730 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #ifndef _COMPIZ_GLPROGRAMCACHE_H #define _COMPIZ_GLPROGRAMCACHE_H #include #include #include #include #include class PrivateProgramCache; struct GLShaderData; class GLProgramCache { private: PrivateProgramCache *priv; public: GLProgramCache (size_t); ~GLProgramCache (); GLProgram* operator () (std::list); }; #endif // _COMPIZ_GLPROGRAMCACHE_H ./plugins/opengl/include/opengl/matrix.h0000644000004100000410000000556413246301623020606 0ustar www-datawww-data/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ #ifndef _GLMATRIX_H #define _GLMATRIX_H #include #include #include class CompOutput; class GLMatrix { public: GLMatrix (); GLMatrix (const float *); const float* getMatrix () const; GLMatrix& operator*= (const GLMatrix& rhs); float& operator[] (unsigned int pos); void reset (); void toScreenSpace (const CompOutput *output, float z); bool invert (); void rotate (const float angle, const float x, const float y, const float z); void rotate (const float angle, const GLVector& vector); void scale (const float x, const float y, const float z); void scale (const GLVector& vector); void translate (const float x, const float y, const float z); void translate (const GLVector& vector); private: friend GLMatrix operator* (const GLMatrix& lhs, const GLMatrix& rhs); friend GLVector operator* (const GLMatrix& lhs, const GLVector& rhs); float m[16]; }; namespace compiz { namespace opengl { namespace matrix { /* This function returns co-ordinates into viewport space. In order * to convert into something like damage rectangles please remember * to flip on the y axis. */ inline CompPoint projectIntoViewport (const GLMatrix &modelview, const GLMatrix &projection, const CompRect &vp, const GLVector &vector) { GLVector projected (projection * modelview * vector); projected.homogenize (); projected[0] = projected[0] * 0.5 + 0.5; projected[1] = projected[1] * 0.5 + 0.5; return CompPoint (projected[0] * vp.width () + vp.x (), projected[1] * vp.height () + vp.y ()); } } } } #endif ./plugins/opengl/src/0000755000004100000410000000000013246301624015000 5ustar www-datawww-data./plugins/opengl/src/matrix.cpp0000644000004100000410000003247713246301623017024 0ustar www-datawww-data/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ /* * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * From Mesa 3-D graphics library. */ #include #include #include #include #include #define DEG2RAD (M_PI / 180.0f) /** * Identity matrix. */ static const float identity[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; #define A(row, col) a[(col << 2) + row] #define B(row, col) b[(col << 2) + row] #define P(row, col) product[(col << 2) + row] /** * Perform a full 4x4 matrix multiplication. * * \param a matrix. * \param b matrix. * \param product will receive the product of \p a and \p b. * * \warning Is assumed that \p product != \p b. \p product == \p a is allowed. * * \note KW: 4*16 = 64 multiplications * * \author This \c matmul was contributed by Thomas Malik */ static void matmul4 (float *product, const float *a, const float *b) { for (int i = 0; i < 4; i++) { const float ai0 = A(i,0), ai1 = A(i,1), ai2 = A(i,2), ai3 = A(i,3); P(i,0) = ai0 * B(0,0) + ai1 * B(1,0) + ai2 * B(2,0) + ai3 * B(3,0); P(i,1) = ai0 * B(0,1) + ai1 * B(1,1) + ai2 * B(2,1) + ai3 * B(3,1); P(i,2) = ai0 * B(0,2) + ai1 * B(1,2) + ai2 * B(2,2) + ai3 * B(3,2); P(i,3) = ai0 * B(0,3) + ai1 * B(1,3) + ai2 * B(2,3) + ai3 * B(3,3); } } GLMatrix::GLMatrix () { memcpy (m, identity, sizeof (m)); } GLMatrix::GLMatrix (const float *mat) { memcpy (m, mat, sizeof (m)); } void GLMatrix::reset () { memcpy (m, identity, sizeof (m)); } const float * GLMatrix::getMatrix () const { return m; } GLMatrix& GLMatrix::operator*= (const GLMatrix& rhs) { *this = *this * rhs; return *this; } GLMatrix operator* (const GLMatrix& lhs, const GLMatrix& rhs) { GLMatrix result; matmul4 (result.m, lhs.m, rhs.m); return result; } GLVector operator* (const GLMatrix& lhs, const GLVector& rhs) { GLVector result; const float *a = lhs.m; for (int i = 0; i < 4; i++) { result[i] = A(i,0) * rhs[0] + A(i,1) * rhs[1] + A(i,2) * rhs[2] + A(i,3) * rhs[3]; } return result; } #undef A #undef B #undef P /* ** Invert 4x4 matrix. ** Contributed by David Moore (See Mesa bug #6748) */ bool GLMatrix::invert () { float inv[16], det; inv[0] = m[5]*m[10]*m[15] - m[5]*m[11]*m[14] - m[9]*m[6]*m[15] + m[9]*m[7]*m[14] + m[13]*m[6]*m[11] - m[13]*m[7]*m[10]; inv[4] = -m[4]*m[10]*m[15] + m[4]*m[11]*m[14] + m[8]*m[6]*m[15] - m[8]*m[7]*m[14] - m[12]*m[6]*m[11] + m[12]*m[7]*m[10]; inv[8] = m[4]*m[9]*m[15] - m[4]*m[11]*m[13] - m[8]*m[5]*m[15] + m[8]*m[7]*m[13] + m[12]*m[5]*m[11] - m[12]*m[7]*m[9]; inv[12] = -m[4]*m[9]*m[14] + m[4]*m[10]*m[13] + m[8]*m[5]*m[14] - m[8]*m[6]*m[13] - m[12]*m[5]*m[10] + m[12]*m[6]*m[9]; inv[1] = -m[1]*m[10]*m[15] + m[1]*m[11]*m[14] + m[9]*m[2]*m[15] - m[9]*m[3]*m[14] - m[13]*m[2]*m[11] + m[13]*m[3]*m[10]; inv[5] = m[0]*m[10]*m[15] - m[0]*m[11]*m[14] - m[8]*m[2]*m[15] + m[8]*m[3]*m[14] + m[12]*m[2]*m[11] - m[12]*m[3]*m[10]; inv[9] = -m[0]*m[9]*m[15] + m[0]*m[11]*m[13] + m[8]*m[1]*m[15] - m[8]*m[3]*m[13] - m[12]*m[1]*m[11] + m[12]*m[3]*m[9]; inv[13] = m[0]*m[9]*m[14] - m[0]*m[10]*m[13] - m[8]*m[1]*m[14] + m[8]*m[2]*m[13] + m[12]*m[1]*m[10] - m[12]*m[2]*m[9]; inv[2] = m[1]*m[6]*m[15] - m[1]*m[7]*m[14] - m[5]*m[2]*m[15] + m[5]*m[3]*m[14] + m[13]*m[2]*m[7] - m[13]*m[3]*m[6]; inv[6] = -m[0]*m[6]*m[15] + m[0]*m[7]*m[14] + m[4]*m[2]*m[15] - m[4]*m[3]*m[14] - m[12]*m[2]*m[7] + m[12]*m[3]*m[6]; inv[10] = m[0]*m[5]*m[15] - m[0]*m[7]*m[13] - m[4]*m[1]*m[15] + m[4]*m[3]*m[13] + m[12]*m[1]*m[7] - m[12]*m[3]*m[5]; inv[14] = -m[0]*m[5]*m[14] + m[0]*m[6]*m[13] + m[4]*m[1]*m[14] - m[4]*m[2]*m[13] - m[12]*m[1]*m[6] + m[12]*m[2]*m[5]; inv[3] = -m[1]*m[6]*m[11] + m[1]*m[7]*m[10] + m[5]*m[2]*m[11] - m[5]*m[3]*m[10] - m[9]*m[2]*m[7] + m[9]*m[3]*m[6]; inv[7] = m[0]*m[6]*m[11] - m[0]*m[7]*m[10] - m[4]*m[2]*m[11] + m[4]*m[3]*m[10] + m[8]*m[2]*m[7] - m[8]*m[3]*m[6]; inv[11] = -m[0]*m[5]*m[11] + m[0]*m[7]*m[9] + m[4]*m[1]*m[11] - m[4]*m[3]*m[9] - m[8]*m[1]*m[7] + m[8]*m[3]*m[5]; inv[15] = m[0]*m[5]*m[10] - m[0]*m[6]*m[9] - m[4]*m[1]*m[10] + m[4]*m[2]*m[9] + m[8]*m[1]*m[6] - m[8]*m[2]*m[5]; det = m[0]*inv[0] + m[1]*inv[4] + m[2]*inv[8] + m[3]*inv[12]; if (det == 0) return false; det = 1.0f / det; for (int i = 0; i < 16; i++) m[i] = inv[i] * det; return true; } /** * Generate a 4x4 transformation matrix from glRotate parameters, and * post-multiply the input matrix by it. * * \author * This function was contributed by Erich Boleyn (erich@uruk.org). * Optimizations contributed by Rudolf Opalla (rudi@khm.de). */ void GLMatrix::rotate (const float angle, const float xRot, const float yRot, const float zRot) { float x = xRot, y = yRot, z = zRot; float s, c; float matrix[16]; bool optimized; s = (float) sin (angle * DEG2RAD); c = (float) cos (angle * DEG2RAD); memcpy (matrix, identity, sizeof (matrix)); optimized = false; #define M(row, col) matrix[col * 4 + row] if (x == 0.0f) { if (y == 0.0f) { if (z != 0.0f) { optimized = true; /* rotate only around z-axis */ M(0,0) = c; M(1,1) = c; if (z < 0.0f) { M(0,1) = s; M(1,0) = -s; } else { M(0,1) = -s; M(1,0) = s; } } } else if (z == 0.0f) { optimized = true; /* rotate only around y-axis */ M(0,0) = c; M(2,2) = c; if (y < 0.0f) { M(0,2) = -s; M(2,0) = s; } else { M(0,2) = s; M(2,0) = -s; } } } else if (y == 0.0f) { if (z == 0.0f) { optimized = true; /* rotate only around x-axis */ M(1,1) = c; M(2,2) = c; if (x < 0.0f) { M(1,2) = s; M(2,1) = -s; } else { M(1,2) = -s; M(2,1) = s; } } } if (!optimized) { float xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c; const float mag = sqrtf (x * x + y * y + z * z); if (mag <= 1.0e-4) { /* no rotation, leave mat as-is */ return; } x /= mag; y /= mag; z /= mag; /* * Arbitrary axis rotation matrix. * * This is composed of 5 matrices, Rz, Ry, T, Ry', Rz', multiplied * like so: Rz * Ry * T * Ry' * Rz'. T is the final rotation * (which is about the X-axis), and the two composite transforms * Ry' * Rz' and Rz * Ry are (respectively) the rotations necessary * from the arbitrary axis to the X-axis then back. They are * all elementary rotations. * * Rz' is a rotation about the Z-axis, to bring the axis vector * into the x-z plane. Then Ry' is applied, rotating about the * Y-axis to bring the axis vector parallel with the X-axis. The * rotation about the X-axis is then performed. Ry and Rz are * simply the respective inverse transforms to bring the arbitrary * axis back to it's original orientation. The first transforms * Rz' and Ry' are considered inverses, since the data from the * arbitrary axis gives you info on how to get to it, not how * to get away from it, and an inverse must be applied. * * The basic calculation used is to recognize that the arbitrary * axis vector (x, y, z), since it is of unit length, actually * represents the sines and cosines of the angles to rotate the * X-axis to the same orientation, with theta being the angle about * Z and phi the angle about Y (in the order described above) * as follows: * * cos ( theta ) = x / sqrt ( 1 - z^2 ) * sin ( theta ) = y / sqrt ( 1 - z^2 ) * * cos ( phi ) = sqrt ( 1 - z^2 ) * sin ( phi ) = z * * Note that cos ( phi ) can further be inserted to the above * formulas: * * cos ( theta ) = x / cos ( phi ) * sin ( theta ) = y / sin ( phi ) * * ...etc. Because of those relations and the standard trigonometric * relations, it is pssible to reduce the transforms down to what * is used below. It may be that any primary axis chosen will give the * same results (modulo a sign convention) using thie method. * * Particularly nice is to notice that all divisions that might * have caused trouble when parallel to certain planes or * axis go away with care paid to reducing the expressions. * After checking, it does perform correctly under all cases, since * in all the cases of division where the denominator would have * been zero, the numerator would have been zero as well, giving * the expected result. */ xx = x * x; yy = y * y; zz = z * z; xy = x * y; yz = y * z; zx = z * x; xs = x * s; ys = y * s; zs = z * s; one_c = 1.0f - c; /* We already hold the identity-matrix so we can skip some statements */ M(0,0) = (one_c * xx) + c; M(0,1) = (one_c * xy) - zs; M(0,2) = (one_c * zx) + ys; /* M(0,3) = 0.0F; */ M(1,0) = (one_c * xy) + zs; M(1,1) = (one_c * yy) + c; M(1,2) = (one_c * yz) - xs; /* M(1,3) = 0.0F; */ M(2,0) = (one_c * zx) - ys; M(2,1) = (one_c * yz) + xs; M(2,2) = (one_c * zz) + c; /* M(2,3) = 0.0F; */ /* M(3,0) = 0.0F; M(3,1) = 0.0F; M(3,2) = 0.0F; M(3,3) = 1.0F; */ } #undef M matmul4 (m, m, matrix); } void GLMatrix::rotate (const float angle, const GLVector& vector) { rotate (angle, vector[GLVector::x], vector[GLVector::y], vector[GLVector::z]); } /** * Multiply a matrix with a general scaling matrix. * * \param matrix matrix. * \param x x axis scale factor. * \param y y axis scale factor. * \param z z axis scale factor. * * Multiplies in-place the elements of \p matrix by the scale factors. */ void GLMatrix::scale (const float x, const float y, const float z) { m[0] *= x; m[4] *= y; m[8] *= z; m[1] *= x; m[5] *= y; m[9] *= z; m[2] *= x; m[6] *= y; m[10] *= z; m[3] *= x; m[7] *= y; m[11] *= z; } void GLMatrix::scale (const GLVector& vector) { scale (vector[GLVector::x], vector[GLVector::y], vector[GLVector::z]); } /** * Multiply a matrix with a translation matrix. * * \param matrix matrix. * \param x translation vector x coordinate. * \param y translation vector y coordinate. * \param z translation vector z coordinate. * * Adds the translation coordinates to the elements of \p matrix in-place. */ void GLMatrix::translate (const float x, const float y, const float z) { m[12] = m[0] * x + m[4] * y + m[8] * z + m[12]; m[13] = m[1] * x + m[5] * y + m[9] * z + m[13]; m[14] = m[2] * x + m[6] * y + m[10] * z + m[14]; m[15] = m[3] * x + m[7] * y + m[11] * z + m[15]; } void GLMatrix::translate (const GLVector& vector) { translate (vector[GLVector::x], vector[GLVector::y], vector[GLVector::z]); } void GLMatrix::toScreenSpace (const CompOutput *output, float z) { translate (-0.5f, -0.5f, z); scale (1.0f / output->width (), -1.0f / output->height (), 1.0f); translate (-output->x1 (), -output->y2 (), 0.0f); } float& GLMatrix::operator[] (unsigned int pos) { assert (pos <= 15); return m[pos]; } ./plugins/opengl/src/window.cpp0000644000004100000410000002576513246301623017031 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include "privates.h" template class WrapableInterface; template class PluginClassHandler; GLWindow::GLWindow (CompWindow *w) : PluginClassHandler (w), priv (new PrivateGLWindow (w, this)) { CompositeWindow *cw = CompositeWindow::get (w); priv->paint.opacity = cw->opacity (); priv->paint.brightness = cw->brightness (); priv->paint.saturation = cw->saturation (); priv->lastPaint = priv->paint; } GLWindow::~GLWindow () { delete priv; } /** * Callback object to create GLPrograms automatically when using GLVertexBuffer. */ class GLWindowAutoProgram : public GLVertexBuffer::AutoProgram { public: GLWindowAutoProgram (PrivateGLWindow *pWindow) : pWindow(pWindow) {} GLProgram *getProgram (GLShaderParameters ¶ms) { GLScreen *gScreen = pWindow->gScreen; const GLShaderData *shaderData = gScreen->getShaderData (params); pWindow->shaders.push_back (shaderData); return gScreen->getProgram (pWindow->shaders); } PrivateGLWindow *pWindow; }; PrivateGLWindow::PrivateGLWindow (CompWindow *w, GLWindow *gw) : window (w), gWindow (gw), cWindow (CompositeWindow::get (w)), gScreen (GLScreen::get (screen)), textures (), regions (), updateState (UpdateRegion | UpdateMatrix), needsRebind (true), clip (), bindFailed (false), vertexBuffer (new GLVertexBuffer ()), autoProgram(new GLWindowAutoProgram (this)), icons (), configureLock (w->obtainLockOnConfigureRequests ()) { paint.xScale = 1.0f; paint.yScale = 1.0f; paint.xTranslate = 0.0f; paint.yTranslate = 0.0f; WindowInterface::setHandler (w); CompositeWindowInterface::setHandler (cWindow); vertexBuffer->setAutoProgram(autoProgram); cWindow->setNewPixmapReadyCallback (boost::bind (&PrivateGLWindow::clearTextures, this)); } PrivateGLWindow::~PrivateGLWindow () { delete vertexBuffer; delete autoProgram; cWindow->setNewPixmapReadyCallback (boost::function ()); } void PrivateGLWindow::setWindowMatrix () { CompRect input (window->inputRect ()); if (textures.size () != matrices.size ()) matrices.resize (textures.size ()); for (unsigned int i = 0; i < textures.size (); i++) { matrices[i] = textures[i]->matrix (); matrices[i].x0 -= (input.x () * matrices[i].xx); matrices[i].y0 -= (input.y () * matrices[i].yy); } updateState &= ~(UpdateMatrix); } void PrivateGLWindow::clearTextures () { textures.clear (); } bool GLWindow::bind () { if (priv->needsRebind) { if (!priv->cWindow->bind ()) { if (!priv->textures.empty ()) { /* Getting a new pixmap failed, recycle the old texture */ priv->needsRebind = false; return true; } else return false; } GLTexture::List textures = GLTexture::bindPixmapToTexture (priv->cWindow->pixmap (), priv->cWindow->size ().width (), priv->cWindow->size ().height (), priv->window->depth ()); if (textures.empty ()) { compLogMessage ("opengl", CompLogLevelInfo, "Couldn't bind redirected window 0x%x to " "texture\n", (int) priv->window->id ()); if (priv->cWindow->size ().width () > GL::maxTextureSize || priv->cWindow->size ().height () > GL::maxTextureSize) { compLogMessage ("opengl", CompLogLevelWarn, "Bug in window 0x%x (identifying as %s)", (int) priv->window->id (), priv->window->resName ().size () ? priv->window->resName ().c_str () : "(none available)"); compLogMessage ("opengl", CompLogLevelWarn, "This window tried to create an absurdly large window %i x %i\n", priv->cWindow->size ().width (), priv->cWindow->size ().height ()); compLogMessage ("opengl", CompLogLevelWarn, "Unforunately, that's not supported on your hardware, because you have a maximum texture size of %i", GL::maxTextureSize); compLogMessage ("opengl", CompLogLevelWarn, "you should probably file a bug against that application"); compLogMessage ("opengl", CompLogLevelWarn, "for now, we're going to hide tht window so that it doesn't break your desktop\n"); XReparentWindow (screen->dpy (), priv->window->id (), GLScreen::get (screen)->priv->saveWindow, 0, 0); } return false; } else { bool immediatelyUpdateMatricesAndRegions = priv->textures.size () != textures.size (); priv->textures = textures; priv->needsRebind = false; /* If the number of textures changed, we should immediately * update the matrices and regions so that they are at least * initialized, but we'll queue another update just before * glPaint too in case the window moved or changed size */ if (immediatelyUpdateMatricesAndRegions) { priv->setWindowMatrix (); priv->updateWindowRegions (); priv->updateState |= PrivateGLWindow::UpdateMatrix | PrivateGLWindow::UpdateRegion; } } } return true; } void GLWindow::release () { if (!priv->cWindow->frozen ()) priv->needsRebind = true; } void GLWindowInterface::glTransformationComplete (const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask) WRAPABLE_DEF (glTransformationComplete, matrix, region, mask) bool GLWindowInterface::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) WRAPABLE_DEF (glPaint, attrib, transform, region, mask) bool GLWindowInterface::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) WRAPABLE_DEF (glDraw, transform, attrib, region, mask) void GLWindowInterface::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) WRAPABLE_DEF (glAddGeometry, matrix, region, clip, maxGridWidth, maxGridHeight) void GLWindowInterface::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) WRAPABLE_DEF (glDrawTexture, texture, transform, attrib, mask) const CompRegion & GLWindow::clip () const { return priv->clip; } GLWindowPaintAttrib & GLWindow::paintAttrib () { return priv->paint; } GLWindowPaintAttrib & GLWindow::lastPaintAttrib () { return priv->lastPaint; } void PrivateGLWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { window->resizeNotify (dx, dy, dwidth, dheight); updateState |= PrivateGLWindow::UpdateMatrix | PrivateGLWindow::UpdateRegion; gWindow->release (); } void PrivateGLWindow::moveNotify (int dx, int dy, bool now) { window->moveNotify (dx, dy, now); updateState |= PrivateGLWindow::UpdateMatrix; foreach (CompRegion &r, regions) r.translate (dx, dy); } void PrivateGLWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyUnmap: case CompWindowNotifyReparent: case CompWindowNotifyUnreparent: case CompWindowNotifyFrameUpdate: gWindow->release (); break; default: break; } window->windowNotify (n); } void GLWindow::updatePaintAttribs () { CompositeWindow *cw = CompositeWindow::get (priv->window); priv->paint.opacity = cw->opacity (); priv->paint.brightness = cw->brightness (); priv->paint.saturation = cw->saturation (); } GLVertexBuffer * GLWindow::vertexBuffer () { return priv->vertexBuffer; } const GLTexture::List & GLWindow::textures () const { static const GLTexture::List emptyList; /* No pixmap backs this window, let * users know that the window needs rebinding */ if (priv->needsRebind) return emptyList; return priv->textures; } const GLTexture::MatrixList & GLWindow::matrices () const { return priv->matrices; } GLTexture * GLWindow::getIcon (int width, int height) { GLIcon icon; CompIcon *i = priv->window->getIcon (width, height); if (!i) return NULL; if (!i->width () || !i->height ()) return NULL; foreach (GLIcon &icon, priv->icons) if (icon.icon == i) return icon.textures[0]; icon.icon = i; icon.textures = GLTexture::imageBufferToTexture ((char *) i->data (), *i); if (icon.textures.size () > 1 || icon.textures.size () == 0) return NULL; priv->icons.push_back (icon); return icon.textures[0]; } void GLWindow::addShaders (std::string name, std::string vertex_shader, std::string fragment_shader) { GLShaderData *data = new GLShaderData (name, vertex_shader, fragment_shader); priv->shaders.push_back(data); } void GLWindow::clearShaders () { for (std::list::const_iterator it = priv->shaders.begin(); it != priv->shaders.end(); ++it) { if ((*it)->isCached != true) { delete *it; } } priv->shaders.clear (); } void PrivateGLWindow::updateFrameRegion (CompRegion ®ion) { window->updateFrameRegion (region); updateState |= PrivateGLWindow::UpdateRegion; } void PrivateGLWindow::updateWindowRegions () { CompRect input (window->serverInputRect ()); if (regions.size () != textures.size ()) regions.resize (textures.size ()); for (unsigned int i = 0; i < textures.size (); i++) { regions[i] = CompRegion (*textures[i]); regions[i].translate (input.x (), input.y ()); regions[i] &= window->region (); } updateState &= ~(UpdateRegion); } unsigned int GLWindow::lastMask () const { return priv->lastMask; } ./plugins/opengl/src/glxtfpbind/0000755000004100000410000000000013246301623017140 5ustar www-datawww-data./plugins/opengl/src/glxtfpbind/CMakeLists.txt0000644000004100000410000000110513246301623021675 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${compiz_SOURCE_DIR}/src/servergrab/include ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${COMPIZ_LIBRARY_DIRS}) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/glx-tfp-bind.cpp ) ADD_LIBRARY( compiz_opengl_glx_tfp_bind STATIC ${SRCS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_opengl_glx_tfp_bind compiz_servergrab ) ./plugins/opengl/src/glxtfpbind/include/0000755000004100000410000000000013246301623020563 5ustar www-datawww-data./plugins/opengl/src/glxtfpbind/include/glx-tfp-bind.h0000644000004100000410000000404013246301623023225 0ustar www-datawww-data/* * Compiz, opengl plugin, GLX_EXT_texture_from_pixmap rebind logic * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _COMPIZ_OPENGL_GLX_TFP_BIND_H #define _COMPIZ_OPENGL_GLX_TFP_BIND_H #ifndef LP_1030891_NOT_FIXED #define LP_1030891_NOT_FIXED #endif #include #include class ServerGrabInterface; typedef unsigned long Pixmap; typedef unsigned long GLXPixmap; namespace compiz { namespace opengl { typedef boost::function PixmapCheckValidityFunc; typedef boost::function BindTexImageEXTFunc; typedef boost::function WaitGLXFunc; bool bindTexImageGLX (ServerGrabInterface *, Pixmap, GLXPixmap, const PixmapCheckValidityFunc &, const BindTexImageEXTFunc &, const WaitGLXFunc &, PixmapSource); } // namespace opengl } // namespace compiz #endif ./plugins/opengl/src/glxtfpbind/src/0000755000004100000410000000000013246301623017727 5ustar www-datawww-data./plugins/opengl/src/glxtfpbind/src/glx-tfp-bind.cpp0000644000004100000410000000450013246301623022725 0ustar www-datawww-data/* * Compiz, opengl plugin, GLX_EXT_texture_from_pixmap rebind logic * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include "glx-tfp-bind.h" namespace cgl = compiz::opengl; bool cgl::bindTexImageGLX (ServerGrabInterface *serverGrabInterface, Pixmap x11Pixmap, GLXPixmap glxPixmap, const cgl::PixmapCheckValidityFunc &checkPixmapValidity, const cgl::BindTexImageEXTFunc &bindTexImageEXT, const cgl::WaitGLXFunc &waitGLX, cgl::PixmapSource source) { #ifndef LP_1030891_NOT_FIXED ServerLock lock (serverGrabInterface); waitGLX (); #endif /* External pixmaps can disappear on us, but not * while we have a server grab at least */ if (source == cgl::ExternallyManaged) { #ifdef LP_1030891_NOT_FIXED ServerLock lock (serverGrabInterface); #endif if (!checkPixmapValidity (x11Pixmap)) return false; #ifdef LP_1030891_NOT_FIXED // We need to bind before the above ServerLock is lost bindTexImageEXT (glxPixmap); return true; #endif } bindTexImageEXT (glxPixmap); return true; } ./plugins/opengl/src/glxtfpbind/tests/0000755000004100000410000000000013246301624020303 5ustar www-datawww-data./plugins/opengl/src/glxtfpbind/tests/CMakeLists.txt0000644000004100000410000000065213246301623023045 0ustar www-datawww-dataadd_executable (compiz_test_opengl_glx_tfp_bind ${CMAKE_CURRENT_SOURCE_DIR}/test-opengl-glx-tfp-bind.cpp) target_link_libraries (compiz_test_opengl_glx_tfp_bind compiz_opengl_glx_tfp_bind ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_opengl_glx_tfp_bind COVERAGE compiz_opengl_glx_tfp_bind) ./plugins/opengl/src/glxtfpbind/tests/test-opengl-glx-tfp-bind.cpp0000644000004100000410000001334413246301623025545 0ustar www-datawww-data#include #include #include #include #include "glx-tfp-bind.h" using ::testing::InSequence; using ::testing::NiceMock; using ::testing::StrictMock; using ::testing::Return; namespace cgl = compiz::opengl; namespace { const Pixmap pixmap = 1; const GLXPixmap glxPixmap = 2; void emptyWaitGLX () {} bool emptyCheckPixmap (Pixmap p) { return true; } void emptyBindTexImage (GLXPixmap p) {} cgl::WaitGLXFunc waitGLX () { return boost::bind (emptyWaitGLX); } cgl::PixmapCheckValidityFunc pixmapCheckValidity () { return boost::bind (emptyCheckPixmap, _1); } cgl::BindTexImageEXTFunc bindTexImageEXT () { return boost::bind (emptyBindTexImage, _1); } } class MockWaitGLX { public: MOCK_METHOD0 (waitGLX, void ()); }; class MockPixmapCheckValidity { public: MOCK_METHOD1 (checkValidity, bool (Pixmap)); }; class MockBindTexImageEXT { public: MOCK_METHOD1 (bindTexImageEXT, void (GLXPixmap)); }; class MockServerGrab : public ServerGrabInterface { public: MOCK_METHOD0 (grabServer, void ()); MOCK_METHOD0 (syncServer, void ()); MOCK_METHOD0 (ungrabServer, void ()); }; TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestTakesServerGrab) { MockServerGrab mockServerGrab; InSequence s; #ifndef LP_1030891_NOT_FIXED EXPECT_CALL (mockServerGrab, grabServer ()); EXPECT_CALL (mockServerGrab, syncServer ()); EXPECT_CALL (mockServerGrab, ungrabServer ()); EXPECT_CALL (mockServerGrab, syncServer ()); #endif cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckValidity (), bindTexImageEXT (), waitGLX (), cgl::InternallyManaged); } #ifdef LP_1030891_NOT_FIXED TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestTakesServerGrabLP1030891SpecialCase) { MockServerGrab mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockServerGrab, grabServer ()); EXPECT_CALL (mockServerGrab, syncServer ()).Times (2); EXPECT_CALL (mockServerGrab, ungrabServer ()); EXPECT_CALL (mockPixmapCheck, checkValidity (pixmap)).WillOnce (Return (true)); EXPECT_CALL (mockBindTexImage, bindTexImageEXT (glxPixmap)); cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::ExternallyManaged); } #endif TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestCallsWaitGLX) { NiceMock mockServerGrab; MockWaitGLX mockWaitGLX; cgl::WaitGLXFunc waitGLXFuncMock (boost::bind (&MockWaitGLX::waitGLX, &mockWaitGLX)); #ifndef LP_1030891_NOT_FIXED EXPECT_CALL (mockWaitGLX, waitGLX ()); #endif cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckValidity (), bindTexImageEXT (), waitGLXFuncMock, cgl::InternallyManaged); } TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestNoCallToCheckValidityIfInternalAndImmediateBind) { NiceMock mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockBindTexImage, bindTexImageEXT (glxPixmap)); EXPECT_TRUE (cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::InternallyManaged)); } TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestCheckValidityIfExternalNoBindIfInvalid) { NiceMock mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockPixmapCheck, checkValidity (pixmap)).WillOnce (Return (false)); EXPECT_FALSE (cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::ExternallyManaged)); } TEST (CompizOpenGLGLXTextureFromPixmapBindTest, TestCheckValidityIfExternalBindIfValid) { NiceMock mockServerGrab; StrictMock mockPixmapCheck; StrictMock mockBindTexImage; cgl::PixmapCheckValidityFunc pixmapCheckFunc (boost::bind (&MockPixmapCheckValidity::checkValidity, &mockPixmapCheck, _1)); cgl::BindTexImageEXTFunc bindTexImageEXTFunc (boost::bind (&MockBindTexImageEXT::bindTexImageEXT, &mockBindTexImage, _1)); EXPECT_CALL (mockPixmapCheck, checkValidity (pixmap)).WillOnce (Return (true)); EXPECT_CALL (mockBindTexImage, bindTexImageEXT (glxPixmap)); EXPECT_TRUE (cgl::bindTexImageGLX (&mockServerGrab, pixmap, glxPixmap, pixmapCheckFunc, bindTexImageEXTFunc, waitGLX (), cgl::ExternallyManaged)); } ./plugins/opengl/src/shadercache.cpp0000644000004100000410000001635213246301623017744 0ustar www-datawww-data/* * Copyright © 2012 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Alexandros Frantzis */ #include #include #include /** * Compares two GLShaderParameters objects. */ class GLShaderParametersComparer { public: bool operator()(const GLShaderParameters &left, const GLShaderParameters &right) const { return left.hash() < right.hash(); } }; GLShaderData::GLShaderData(const std::string &name, const std::string &vertexShader, const std::string &fragmentShader) : name(name), vertexShader(vertexShader), fragmentShader(fragmentShader), isCached(false) { } typedef std::map ShaderMapType; /** * Private data for GLPrivate */ class PrivateShaderCache { public: PrivateShaderCache() {} ShaderMapType::const_iterator addShaderData(const GLShaderParameters ¶ms); std::string createVertexShader (const GLShaderParameters ¶ms); std::string createFragmentShader (const GLShaderParameters ¶ms); ShaderMapType shaderMap; }; /********************** * GLShaderParameters * **********************/ int GLShaderParameters::hash() const { return static_cast(opacity) | (static_cast(brightness) << 1) | (static_cast(saturation) << 2) | (static_cast(color) << 3) | (static_cast(normal) << 5) | (static_cast(numTextures) << 8); } std::string GLShaderParameters::id() const { std::stringstream ss; ss << (opacity ? "t" : "f"); ss << (brightness ? "t" : "f"); ss << (saturation ? "t" : "f"); ss << (color == GLShaderVariableNone ? "n" : color == GLShaderVariableUniform ? "u" : "v"); ss << (normal == GLShaderVariableNone ? "n" : normal == GLShaderVariableUniform ? "u" : "v"); ss << numTextures; return ss.str(); } /***************** * GLShaderCache * *****************/ GLShaderCache::GLShaderCache () : priv (new PrivateShaderCache ()) { } GLShaderCache::~GLShaderCache () { delete priv; } const GLShaderData & GLShaderCache::getShaderData (const GLShaderParameters ¶ms) { ShaderMapType::const_iterator iter; // Try to find a cached shader pair that matches the parameters. // If we don't have it cached, create it. if ((iter = priv->shaderMap.find (params)) == priv->shaderMap.end ()) iter = priv->addShaderData (params); return iter->second; } /********************** * PrivateShaderCache * **********************/ ShaderMapType::const_iterator PrivateShaderCache::addShaderData (const GLShaderParameters ¶ms) { GLShaderData shaderData (params.id (), createVertexShader (params), createFragmentShader (params)); shaderData.isCached = true; std::pair ret = shaderMap.insert(std::pair(params,shaderData)); return ret.first; } /** * Creates a minimal vertex shader that can handle the GLShaderParameters. * * @param params the GLShaderParameters the created shader should handle. * * @return the shader string */ std::string PrivateShaderCache::createVertexShader (const GLShaderParameters ¶ms) { std::stringstream ss; ss << "#ifdef GL_ES\n" << "precision mediump float;\n" << "#endif\n"; ss << "uniform mat4 modelview;\n" << "uniform mat4 projection;\n"; ss << "attribute vec3 position;\n" << "attribute vec3 normal;\n" << "attribute vec4 color;\n" << "attribute vec2 texCoord0;\n" << "attribute vec2 texCoord1;\n" << "attribute vec2 texCoord2;\n" << "attribute vec2 texCoord3;\n"; ss << "@VERTEX_FUNCTIONS@\n"; if (params.color == GLShaderVariableVarying) ss << "varying vec4 vColor;\n"; for (int i = 0; i < params.numTextures; i++) ss << "varying vec2 vTexCoord" << i << ";\n"; ss << "void main() {\n"; for (int i = 0; i < params.numTextures; i++) ss << "vTexCoord" << i << " = texCoord" << i <<";\n"; if (params.color == GLShaderVariableVarying) ss << "vColor = color;\n"; ss << "gl_Position = projection * modelview * vec4(position, 1.0);\n"; ss << "@VERTEX_FUNCTION_CALLS@\n}"; return ss.str(); } /** * Creates a minimal fragment shader that can handle the GLShaderParameters. * * @param params the GLShaderParameters the created shader should handle. * * @return the shader string */ std::string PrivateShaderCache::createFragmentShader (const GLShaderParameters ¶ms) { std::stringstream ss; ss << "#ifdef GL_ES\n" << "precision mediump float;\n" << "#endif\n"; ss << "uniform vec3 paintAttrib;\n"; for (int i = 0; i < params.numTextures; i++) { ss << "uniform sampler2D texture" << i << ";\n"; ss << "varying vec2 vTexCoord" << i << ";\n"; } if (params.color == GLShaderVariableUniform) ss << "uniform vec4 singleColor;\n"; else if (params.color == GLShaderVariableVarying) ss << "varying vec4 vColor;\n"; ss << "@FRAGMENT_FUNCTIONS@\n"; ss << "void main() {\n vec4 color = "; if (params.color == GLShaderVariableUniform) ss << "singleColor *"; else if (params.color == GLShaderVariableVarying) ss << "vColor *"; /* Sample first texture only */ if (params.numTextures) ss << " texture2D(texture0, vTexCoord0);\n"; else ss << " 1.0;\n"; if (params.saturation) { ss << "vec3 desaturated = color.rgb * vec3 (0.30, 0.59, 0.11);\n" << "desaturated = vec3 (dot (desaturated, color.rgb));\n" << "color.rgb = color.rgb * vec3 (paintAttrib.z) + desaturated *\n" << " vec3 (1.0 - paintAttrib.z);\n"; } if (params.brightness) { ss << "color.rgb = color.rgb * paintAttrib.y;\n"; } ss << "gl_FragColor = color;\n"; ss << "@FRAGMENT_FUNCTION_CALLS@\n"; if (params.opacity) { ss << "gl_FragColor = gl_FragColor * paintAttrib.x;\n"; } ss << "}\n"; return ss.str(); } ./plugins/opengl/src/framebufferobject.cpp0000644000004100000410000001352513246301623021164 0ustar www-datawww-data/* * Copyright (c) 2011 Collabora, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Collabora Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Collabora Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * COLLABORA LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL COLLABORA LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Pekka Paalanen */ #include #include #include struct PrivateGLFramebufferObject { PrivateGLFramebufferObject () : fboId (0), pushedId (0), glTex (NULL), status (-1) { } void pushFBO (); void popFBO (); GLuint fboId; GLuint pushedId; GLuint rbStencilId; GLTexture *glTex; GLint status; static GLuint boundId; static std::map idMap; }; GLuint PrivateGLFramebufferObject::boundId = 0; std::map PrivateGLFramebufferObject::idMap; void PrivateGLFramebufferObject::pushFBO () { pushedId = boundId; if (boundId != fboId) { (*GL::bindFramebuffer) (GL::FRAMEBUFFER, fboId); boundId = fboId; } } void PrivateGLFramebufferObject::popFBO () { if (boundId != pushedId) { (*GL::bindFramebuffer) (GL::FRAMEBUFFER, pushedId); boundId = pushedId; } } GLFramebufferObject::GLFramebufferObject () : priv (new PrivateGLFramebufferObject) { (*GL::genFramebuffers) (1, &priv->fboId); (*GL::genRenderbuffers) (1, &priv->rbStencilId); if (priv->fboId != 0) PrivateGLFramebufferObject::idMap[priv->fboId] = this; } GLFramebufferObject::~GLFramebufferObject () { if (priv->glTex) GLTexture::decRef (priv->glTex); PrivateGLFramebufferObject::idMap.erase (priv->fboId); (*GL::deleteFramebuffers) (1, &priv->fboId); (*GL::deleteRenderbuffers) (1, &priv->rbStencilId); delete priv; } bool GLFramebufferObject::allocate (const CompSize &size, const char *image, GLenum format, GLenum type) { priv->status = -1; if (!priv->glTex || size.width () != priv->glTex->width () || size.height () != priv->glTex->height ()) { if (priv->glTex) GLTexture::decRef (priv->glTex); priv->glTex = NULL; GLTexture::List list = GLTexture::imageDataToTexture (image, size, format, type); if (list.size () != 1 || list[0] == NULL) return false; priv->glTex = list[0]; GLTexture::incRef (priv->glTex); if (GL::fboStencilSupported) { (*GL::bindRenderbuffer) (GL::RENDERBUFFER, priv->rbStencilId); (*GL::renderbufferStorage) (GL::RENDERBUFFER, GL::DEPTH24_STENCIL8, size.width (), size.height ()); } } priv->pushFBO (); (*GL::framebufferTexture2D) (GL::FRAMEBUFFER, GL::COLOR_ATTACHMENT0, priv->glTex->target (), priv->glTex->name (), 0); priv->status = (*GL::checkFramebufferStatus) (GL::DRAW_FRAMEBUFFER); priv->popFBO (); return true; } GLFramebufferObject * GLFramebufferObject::bind () { GLFramebufferObject *old = NULL; if (priv->boundId != 0) { std::map::iterator it; it = PrivateGLFramebufferObject::idMap.find (priv->boundId); if (it != PrivateGLFramebufferObject::idMap.end ()) old = it->second; else compLogMessage ("opengl", CompLogLevelError, "An FBO without GLFramebufferObject cannot be restored"); } (*GL::bindFramebuffer) (GL::FRAMEBUFFER, priv->fboId); priv->boundId = priv->fboId; (*GL::framebufferRenderbuffer) (GL::FRAMEBUFFER, GL::DEPTH_ATTACHMENT, GL::RENDERBUFFER, priv->rbStencilId); (*GL::framebufferRenderbuffer) (GL::FRAMEBUFFER, GL::STENCIL_ATTACHMENT, GL::RENDERBUFFER, priv->rbStencilId); return old; } // static void GLFramebufferObject::rebind (GLFramebufferObject *fbo) { GLuint id = fbo ? fbo->priv->fboId : 0; if (id != fbo->priv->boundId) { (*GL::bindFramebuffer) (GL::FRAMEBUFFER, id); fbo->priv->boundId = id; } } static const char * getFboErrorString (GLint status) { switch (status) { case GL::FRAMEBUFFER_COMPLETE: return "GL::FRAMEBUFFER_COMPLETE"; case GL::FRAMEBUFFER_INCOMPLETE_ATTACHMENT: return "GL::FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; case GL::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: return "GL::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; case GL::FRAMEBUFFER_INCOMPLETE_DIMENSIONS: return "GL::FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; case GL::FRAMEBUFFER_UNSUPPORTED: return "GL::FRAMEBUFFER_UNSUPPORTED"; default: return "unexpected status"; } } bool GLFramebufferObject::checkStatus () { priv->pushFBO (); priv-> status = (*GL::checkFramebufferStatus) (GL_FRAMEBUFFER); priv->popFBO (); if (priv->status == static_cast (GL::FRAMEBUFFER_COMPLETE)) return true; compLogMessage ("opengl", CompLogLevelError, "FBO is incomplete: %s (0x%04x)", getFboErrorString (priv->status), priv->status); return false; } GLTexture * GLFramebufferObject::tex () { return priv->glTex; } ./plugins/opengl/src/blacklist/0000755000004100000410000000000013246301623016747 5ustar www-datawww-data./plugins/opengl/src/blacklist/CMakeLists.txt0000644000004100000410000000017113246301623021506 0ustar www-datawww-dataif (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif () add_library (compiz_opengl_blacklist STATIC blacklist.cpp) ./plugins/opengl/src/blacklist/blacklist.cpp0000644000004100000410000000411313246301623021422 0ustar www-datawww-data/* * Compiz opengl plugin, Blacklist feature * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "blacklist.h" #include #include namespace compiz { namespace opengl { bool blacklisted (const char *blacklistRegex, const char *glVendor, const char *glRenderer, const char *glVersion) { bool matches = false; if (blacklistRegex && blacklistRegex[0]) { regex_t re; // Ensure the regex contains something other than spaces, or ignore. const char *p = blacklistRegex; while (*p == ' ') p++; if (*p && !regcomp (&re, blacklistRegex, REG_EXTENDED)) { char driver[1024]; snprintf (driver, sizeof driver, "%s\n%s\n%s", glVendor ? glVendor : "", glRenderer ? glRenderer : "", glVersion ? glVersion : ""); if (!regexec (&re, driver, 0, NULL, 0)) matches = true; regfree (&re); } } return matches; } } // namespace opengl } // namespace compiz ./plugins/opengl/src/blacklist/blacklist.h0000644000004100000410000000277013246301623021076 0ustar www-datawww-data/* * Compiz opengl plugin, Blacklist function * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef __COMPIZ_OPENGL_BLACKLIST_H #define __COMPIZ_OPENGL_BLACKLIST_H namespace compiz { namespace opengl { bool blacklisted (const char *blacklistRegex, const char *glVendor, const char *glRenderer, const char *glVersion); } // namespace opengl } // namespace compiz #endif ./plugins/opengl/src/blacklist/tests/0000755000004100000410000000000013246301624020112 5ustar www-datawww-data./plugins/opengl/src/blacklist/tests/CMakeLists.txt0000644000004100000410000000043313246301623022651 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS} ..) set (exe "compiz_opengl_test_blacklist") add_executable (${exe} test-blacklist.cpp) target_link_libraries (${exe} compiz_opengl_blacklist ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests(${exe} COVERAGE compiz_opengl_blacklist) ./plugins/opengl/src/blacklist/tests/test-blacklist.cpp0000644000004100000410000001275013246301623023547 0ustar www-datawww-data/* * Compiz opengl plugin, Backlist feature * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "gtest/gtest.h" #include "blacklist.h" using namespace compiz::opengl; static const char *recommendedRegex = "(nouveau|Intel).*Mesa 8.0"; TEST (DriverBlacklist, QuantalIntelIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "Intel Open Source Technology Center", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 9.0")); } TEST (DriverBlacklist, PreciseIntelIsBad) { EXPECT_TRUE (blacklisted (recommendedRegex, "Tungsten Graphics, Inc", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 8.0.2")); } TEST (DriverBlacklist, QuantalNouveauIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "nouveau", "Gallium 0.4 on NV86", "3.0 Mesa 9.0-devel")); } TEST (DriverBlacklist, PreciseNouveauIsBad) { EXPECT_TRUE (blacklisted (recommendedRegex, "nouveau", "Gallium 0.4 on NVA8", "2.1 Mesa 8.0.2")); } TEST (DriverBlacklist, FglrxIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "Advanced Micro Devices, Inc.", "ATI Radeon HD 5450", "4.2.11627 Compatibility Profile Context")); } TEST (DriverBlacklist, NvidiaIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "NVIDIA Corporation", "Quadro 1000M/PCIe/SSE2", "4.2.0 NVIDIA 304.48")); } TEST (DriverBlacklist, RadeonIsGood1) { EXPECT_FALSE (blacklisted (recommendedRegex, "X.Org R300 Project", "Gallium 0.4 on ATI RV350", "2.1 Mesa 8.0.2")); } TEST (DriverBlacklist, RadeonIsGood2) { EXPECT_FALSE (blacklisted (recommendedRegex, "X.Org", "Gallium 0.4 on AMD CEDAR", "2.1 Mesa 8.0.3")); } TEST (DriverBlacklist, RadeonIsGood3) { EXPECT_FALSE (blacklisted (recommendedRegex, "X.Org", "Gallium 0.4 on AMD RS880", "2.1 Mesa 8.0.2")); } TEST (DriverBlacklist, LLVMpipeIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "VMware, Inc.", "Gallium 0.4 on llvmpipe (LLVM 0x300)", "2.1 Mesa 8.0.4")); } TEST (DriverBlacklist, UnknownIsGood) { EXPECT_FALSE (blacklisted (recommendedRegex, "Acme", "Graphics Driver", "4.2 8.0 9.0 123.456")); } TEST (DriverBlacklist, NoBlacklist) { EXPECT_FALSE (blacklisted ("", "Tungsten Graphics, Inc", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 8.0.2")); EXPECT_FALSE (blacklisted ("", "foo", "bar", "blah")); EXPECT_FALSE (blacklisted ("", "", "", "")); } TEST (DriverBlacklist, LineContinuation) { EXPECT_FALSE (blacklisted ("alpha", "beta", "gamma", "delta")); EXPECT_FALSE (blacklisted ("betagam", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("gamma", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("del", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("(mag|gam)", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("beta.*delt", "beta", "gamma", "delta")); EXPECT_FALSE (blacklisted ("beta.*felt", "beta", "gamma", "delta")); EXPECT_TRUE (blacklisted ("beta\ngamma\ndelta", "beta", "gamma", "delta")); } TEST (DriverBlacklist, StraySpaces) { EXPECT_FALSE (blacklisted (" ", "Hello world", "and", "goodbye")); EXPECT_FALSE (blacklisted (" ", " ", " ", " ")); EXPECT_FALSE (blacklisted (" ", "Tungsten Graphics, Inc", "Mesa DRI Intel(R) Sandybridge Desktop", "3.0 Mesa 8.0.2")); } ./plugins/opengl/src/screen.cpp0000644000004100000410000022545313246301623016775 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Travis Watkins */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include "privates.h" #include "blacklist/blacklist.h" #include #include template class WrapableInterface; #ifndef USE_GLES /* * Historically most versions of fglrx have contained a nasty hack that checks * if argv[0] == "compiz", and downgrades OpenGL features including dropping * GLSL support (hides GL_ARB_shading_language_100). (LP #1026920) * This hack in fglrx is misguided and I'm told AMD have or will remove * it soon. In the mean time, modify argv[0] so it's not triggered... */ class DetectionWorkaround { public: DetectionWorkaround () { program_invocation_short_name[0] = 'C'; } ~DetectionWorkaround () { program_invocation_short_name[0] = 'c'; } }; #endif using namespace compiz::opengl; /** * The number of X11 sync objects to create. */ static const size_t NUM_X11_SYNCS = 16; /** * The maximum time to wait for a sync object, in nanoseconds. */ static const GLuint64 MAX_SYNC_WAIT_TIME = 1000000000ull; // One second namespace GL { #ifdef USE_GLES EGLCreateImageKHRProc createImage; EGLDestroyImageKHRProc destroyImage; GLEGLImageTargetTexture2DOESProc eglImageTargetTexture; EGLPostSubBufferNVProc postSubBuffer = NULL; #else typedef int (*GLXSwapIntervalProc) (int interval); GLXBindTexImageProc bindTexImage = NULL; GLXReleaseTexImageProc releaseTexImage = NULL; GLXQueryDrawableProc queryDrawable = NULL; GLXCopySubBufferProc copySubBuffer = NULL; GLXGetVideoSyncProc getVideoSync = NULL; GLXWaitVideoSyncProc waitVideoSync = NULL; GLXSwapIntervalProc swapInterval = NULL; GLXGetFBConfigsProc getFBConfigs = NULL; GLXGetFBConfigAttribProc getFBConfigAttrib = NULL; GLXCreatePixmapProc createPixmap = NULL; GLXDestroyPixmapProc destroyPixmap = NULL; GLGenProgramsProc genPrograms = NULL; GLDeleteProgramsProc deletePrograms = NULL; GLBindProgramProc bindProgram = NULL; GLProgramStringProc programString = NULL; GLProgramParameter4fProc programEnvParameter4f = NULL; GLProgramParameter4fProc programLocalParameter4f = NULL; #endif GLActiveTextureProc activeTexture = NULL; GLClientActiveTextureProc clientActiveTexture = NULL; GLMultiTexCoord2fProc multiTexCoord2f = NULL; GLGenFramebuffersProc genFramebuffers = NULL; GLDeleteFramebuffersProc deleteFramebuffers = NULL; GLBindFramebufferProc bindFramebuffer = NULL; GLCheckFramebufferStatusProc checkFramebufferStatus = NULL; GLFramebufferTexture2DProc framebufferTexture2D = NULL; GLGenerateMipmapProc generateMipmap = NULL; GLBindBufferProc bindBuffer = NULL; GLDeleteBuffersProc deleteBuffers = NULL; GLGenBuffersProc genBuffers = NULL; GLBufferDataProc bufferData = NULL; GLBufferSubDataProc bufferSubData = NULL; GLGetShaderivProc getShaderiv = NULL; GLGetShaderInfoLogProc getShaderInfoLog = NULL; GLGetProgramivProc getProgramiv = NULL; GLGetProgramInfoLogProc getProgramInfoLog = NULL; GLCreateShaderProc createShader = NULL; GLShaderSourceProc shaderSource = NULL; GLCompileShaderProc compileShader = NULL; GLCreateProgramProc createProgram = NULL; GLAttachShaderProc attachShader = NULL; GLLinkProgramProc linkProgram = NULL; GLValidateProgramProc validateProgram = NULL; GLDeleteShaderProc deleteShader = NULL; GLDeleteProgramProc deleteProgram = NULL; GLUseProgramProc useProgram = NULL; GLGetUniformLocationProc getUniformLocation = NULL; GLUniform1fProc uniform1f = NULL; GLUniform1iProc uniform1i = NULL; GLUniform2fProc uniform2f = NULL; GLUniform2iProc uniform2i = NULL; GLUniform3fProc uniform3f = NULL; GLUniform3iProc uniform3i = NULL; GLUniform4fProc uniform4f = NULL; GLUniform4iProc uniform4i = NULL; GLUniformMatrix4fvProc uniformMatrix4fv = NULL; GLGetAttribLocationProc getAttribLocation = NULL; #ifndef USE_GLES GLCreateShaderObjectARBProc createShaderObjectARB = NULL; GLCreateProgramObjectARBProc createProgramObjectARB = NULL; GLCompileShaderARBProc compileShaderARB = NULL; GLShaderSourceARBProc shaderSourceARB = NULL; GLValidateProgramARBProc validateProgramARB = NULL; GLDeleteObjectARBProc deleteObjectARB = NULL; GLAttachObjectARBProc attachObjectARB = NULL; GLLinkProgramARBProc linkProgramARB = NULL; GLUseProgramObjectARBProc useProgramObjectARB = NULL; GLGetUniformLocationARBProc getUniformLocationARB = NULL; GLGetAttribLocationARBProc getAttribLocationARB = NULL; GLGetObjectParameterivProc getObjectParameteriv = NULL; GLGetInfoLogProc getInfoLog = NULL; #endif GLEnableVertexAttribArrayProc enableVertexAttribArray = NULL; GLDisableVertexAttribArrayProc disableVertexAttribArray = NULL; GLVertexAttribPointerProc vertexAttribPointer = NULL; GLGenRenderbuffersProc genRenderbuffers = NULL; GLDeleteRenderbuffersProc deleteRenderbuffers = NULL; GLFramebufferRenderbufferProc framebufferRenderbuffer = NULL; GLBindRenderbufferProc bindRenderbuffer = NULL; GLRenderbufferStorageProc renderbufferStorage = NULL; GLFenceSyncProc fenceSync = NULL; GLDeleteSyncProc deleteSync = NULL; GLClientWaitSyncProc clientWaitSync = NULL; GLWaitSyncProc waitSync = NULL; GLGetSyncivProc getSynciv = NULL; GLImportSyncProc importSync = NULL; bool textureFromPixmap = true; bool textureRectangle = false; bool textureNonPowerOfTwo = false; bool textureNonPowerOfTwoMipmap = false; bool textureEnvCombine = false; bool textureEnvCrossbar = false; bool textureBorderClamp = false; bool textureCompression = false; GLint maxTextureSize = 0; bool fboSupported = false; bool fboEnabled = false; bool fboStencilSupported = false; bool vboSupported = false; bool vboEnabled = false; bool shaders = false; GLint maxTextureUnits = 1; bool bufferAge = false; bool sync = false; bool xToGLSync = false; bool canDoSaturated = false; bool canDoSlightlySaturated = false; unsigned int vsyncCount = 0; bool stencilBuffer = false; #ifndef USE_GLES GLuint createShaderARBWrapper (GLenum type) { return static_cast ((GL::createShaderObjectARB) (type)); } GLuint createProgramARBWrapper (GLenum type) { return static_cast ((GL::createProgramObjectARB) ()); } void shaderSourceARBWrapper (GLuint shader, GLsizei count, const GLchar **string, const GLint *length) { (GL::shaderSourceARB) (static_cast (shader), count, string, length); } void compileShaderARBWrapper (GLuint shader) { (GL::compileShaderARB) (static_cast (shader)); } void validateProgramARBWrapper (GLuint program) { (GL::validateProgramARB) (static_cast (program)); } void deleteShaderARBWrapper (GLuint shader) { (GL::deleteObjectARB) (static_cast (shader)); } void deleteProgramARBWrapper (GLuint program) { (GL::deleteObjectARB) (static_cast (program)); } void attachShaderARBWrapper (GLuint program, GLuint shader) { (GL::attachObjectARB) (static_cast (program), static_cast (shader)); } void linkProgramARBWrapper (GLuint program) { (GL::linkProgramARB) (static_cast (program)); } void useProgramARBWrapper (GLuint program) { (GL::useProgramObjectARB) (static_cast (program)); } int getUniformLocationARBWrapper (GLuint program, const GLchar *name) { return (GL::getUniformLocationARB) (static_cast (program), name); } int getAttribLocationARBWrapper (GLuint program, const GLchar *name) { return (GL::getAttribLocationARB) (static_cast (program), name); } void getProgramInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log) { (GL::getInfoLog) (static_cast (object), maxLen, len, log); } void getShaderInfoLogARBWrapper (GLuint object, int maxLen, int *len, char *log) { (GL::getInfoLog) (static_cast (object), maxLen, len, log); } void getShaderivARBWrapper (GLuint object, GLenum type, int *param) { (GL::getObjectParameteriv) (static_cast (object), type, param); } void getProgramivARBWrapper (GLuint object, GLenum type, int *param) { (GL::getObjectParameteriv) (static_cast (object), type, param); } #endif } CompOutput *targetOutput = NULL; /** * Callback object to create GLPrograms automatically when using GLVertexBuffer. */ class GLScreenAutoProgram : public GLVertexBuffer::AutoProgram { public: GLScreenAutoProgram (GLScreen *gScreen) : gScreen(gScreen) {} GLProgram *getProgram (GLShaderParameters ¶ms) { const GLShaderData *shaderData = gScreen->getShaderData (params); std::list tempShaders; tempShaders.push_back (shaderData); return gScreen->getProgram (tempShaders); } GLScreen *gScreen; }; #ifndef USE_GLES class BufferAgeFrameProvider : public FrameProvider { public: BufferAgeFrameProvider (Display *disp, GLXDrawable drawable) : mDisplay (disp), mDrawable (drawable) { } unsigned int getCurrentFrame () { unsigned int age = 0; (*GL::queryDrawable) (mDisplay, mDrawable, GLX_BACK_BUFFER_AGE_EXT, &age); return age; } void useCurrentFrame () { } void endFrame () { } void invalidateAll () { } bool providesPersistence () { return true; } bool alwaysPostprocess () { return false; } private: Display *mDisplay; GLXDrawable mDrawable; }; namespace compiz { namespace opengl { void swapIntervalGLX (Display *d, int interval) { // Docs: http://www.opengl.org/registry/specs/SGI/swap_control.txt if (GL::swapInterval) GL::swapInterval (interval); } int waitVSyncGLX (int wait, int remainder, unsigned int *count) { /* * While glXSwapBuffers/glXCopySubBufferMESA are meant to do a * flush before they blit, it is best to not let that happen. * Because that flush would occur after GL::waitVideoSync, causing * a delay and the final blit to be slightly out of sync resulting * in tearing. So we need to do a glFinish before we wait for * vsync, to absolutely minimize tearing. */ glFinish (); // Docs: http://www.opengl.org/registry/specs/SGI/video_sync.txt if (GL::waitVideoSync) return GL::waitVideoSync (wait, remainder, count); return 0; } } } #else namespace compiz { namespace opengl { void swapIntervalEGL (Display *display, int interval) { eglSwapInterval (eglGetDisplay (display), interval); } int waitVSyncEGL (int wait, int remainder, unsigned int *count) { /* not supported */ return 0; } } } #endif class UndefinedFrameProvider : public FrameProvider { public: unsigned int getCurrentFrame () { return 0; } void useCurrentFrame () { } void endFrame () { } void invalidateAll () { } bool providesPersistence () { return false; } bool alwaysPostprocess () { return false; } }; class PostprocessFrameProvider : public FrameProvider { public: PostprocessFrameProvider (GLFramebufferObject *object) : mObject (object), mAge (0) { } unsigned int getCurrentFrame () { return mAge; } void useCurrentFrame () { /* We are now using this buffer, reset * age back to zero */ mAge = 0; } void endFrame () { ++mAge; } void invalidateAll () { mAge = 0; } bool providesPersistence () { return true; } bool alwaysPostprocess () { return true; } private: GLFramebufferObject *mObject; unsigned int mAge; }; class OptionalPostprocessFrameProvider : public FrameProvider { public: typedef boost::function PostprocessRequired; OptionalPostprocessFrameProvider (const FrameProvider::Ptr &backbuffer, const FrameProvider::Ptr &scratchbuffer, const PostprocessRequired &ppRequired) : mBackbuffer (backbuffer), mScratchbuffer (scratchbuffer), mPPRequired (ppRequired) { } unsigned int getCurrentFrame () { if (mPPRequired ()) return mScratchbuffer->getCurrentFrame (); else return mBackbuffer->getCurrentFrame (); } void useCurrentFrame () { if (mPPRequired ()) mScratchbuffer->useCurrentFrame (); else mBackbuffer->useCurrentFrame (); } void endFrame () { mScratchbuffer->endFrame (); } void invalidateAll () { mScratchbuffer->invalidateAll (); } bool providesPersistence () { /* We are only as good as the backbuffer is */ return mBackbuffer->providesPersistence (); } bool alwaysPostprocess () { if (mPPRequired ()) return mScratchbuffer->alwaysPostprocess (); else return mBackbuffer->alwaysPostprocess (); } private: FrameProvider::Ptr mBackbuffer; FrameProvider::Ptr mScratchbuffer; PostprocessRequired mPPRequired; }; bool GLScreen::glInitContext (XVisualInfo *visinfo) { #ifndef USE_GLES DetectionWorkaround workaround; #endif #ifdef USE_GLES Display *xdpy; Window overlay; EGLDisplay dpy; EGLConfig config; EGLint major, minor; const char *eglExtensions, *glExtensions; XWindowAttributes attr; EGLint count, visualid; EGLConfig configs[1024]; CompOption::Vector o (0); const EGLint config_attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 1, EGL_GREEN_SIZE, 1, EGL_BLUE_SIZE, 1, EGL_ALPHA_SIZE, 0, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_CONFIG_CAVEAT, EGL_NONE, EGL_STENCIL_SIZE, 1, EGL_NONE }; const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; xdpy = screen->dpy (); dpy = eglGetDisplay ((EGLNativeDisplayType)xdpy); if (!eglInitialize (dpy, &major, &minor)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } eglBindAPI (EGL_OPENGL_ES_API); if (!eglChooseConfig (dpy, config_attribs, configs, 1024, &count)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } if (!XGetWindowAttributes (xdpy, screen->root (), &attr)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } EGLint val; int msaaBuffers = MAXSHORT; int msaaSamples = MAXSHORT; visualid = XVisualIDFromVisual (attr.visual); config = configs[0]; for (int i = 0; i < count; ++i) { eglGetConfigAttrib (dpy, configs[i], EGL_SAMPLE_BUFFERS, &val); if (val > msaaBuffers) continue; msaaBuffers = val; eglGetConfigAttrib (dpy, configs[i], EGL_SAMPLES, &val); if (val > msaaSamples) continue; msaaSamples = val; eglGetConfigAttrib (dpy, configs[i], EGL_NATIVE_VISUAL_ID, &val); if (val != visualid) continue; config = configs[i]; break; } overlay = CompositeScreen::get (screen)->overlay (); priv->surface = eglCreateWindowSurface (dpy, config, overlay, 0); if (priv->surface == EGL_NO_SURFACE) { compLogMessage ("opengl", CompLogLevelFatal, "eglCreateWindowSurface failed"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } // Do not preserve buffer contents on swap eglSurfaceAttrib (dpy, priv->surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); priv->ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT, context_attribs); if (priv->ctx == EGL_NO_CONTEXT) { compLogMessage ("opengl", CompLogLevelFatal, "eglCreateContext failed"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } if (!eglMakeCurrent (dpy, priv->surface, priv->surface, priv->ctx)) { compLogMessage ("opengl", CompLogLevelFatal, "eglMakeCurrent failed"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } eglExtensions = (const char *) eglQueryString (dpy, EGL_EXTENSIONS); glExtensions = (const char *) glGetString (GL_EXTENSIONS); if (!glExtensions || !eglExtensions) { compLogMessage ("opengl", CompLogLevelFatal, "No valid GL extensions string found."); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } GL::textureFromPixmap = true; GL::textureNonPowerOfTwo = true; GL::fboSupported = true; GL::fboEnabled = true; GL::vboSupported = true; GL::vboEnabled = true; GL::shaders = true; GL::stencilBuffer = true; GL::maxTextureUnits = 4; glGetIntegerv (GL_MAX_TEXTURE_SIZE, &GL::maxTextureSize); GL::createImage = (GL::EGLCreateImageKHRProc) eglGetProcAddress ("eglCreateImageKHR"); GL::destroyImage = (GL::EGLDestroyImageKHRProc) eglGetProcAddress ("eglDestroyImageKHR"); GL::eglImageTargetTexture = (GL::GLEGLImageTargetTexture2DOESProc) eglGetProcAddress ("glEGLImageTargetTexture2DOES"); if (!strstr (eglExtensions, "EGL_KHR_image_pixmap") || !strstr (glExtensions, "GL_OES_EGL_image") || !GL::createImage || !GL::destroyImage || !GL::eglImageTargetTexture) { compLogMessage ("opengl", CompLogLevelFatal, "GL_OES_EGL_image is missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } // work around efika supporting GL_BGRA directly instead of via this extension #ifndef GL_BGRA if (!strstr (glExtensions, "GL_EXT_texture_format_BGRA8888")) { compLogMessage ("opengl", CompLogLevelFatal, "GL_EXT_texture_format_BGRA8888 is missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } #endif if (strstr (glExtensions, "GL_OES_texture_npot")) GL::textureNonPowerOfTwoMipmap = true; if (strstr (eglExtensions, "EGL_NV_post_sub_buffer")) GL::postSubBuffer = (GL::EGLPostSubBufferNVProc) eglGetProcAddress ("eglPostSubBufferNV"); GL::fboStencilSupported = GL::fboSupported && strstr (glExtensions, "GL_OES_packed_depth_stencil"); if (!GL::fboSupported && !GL::postSubBuffer) { compLogMessage ("opengl", CompLogLevelFatal, "GL_EXT_framebuffer_object or EGL_NV_post_sub_buffer are required"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } GL::activeTexture = glActiveTexture; GL::genFramebuffers = glGenFramebuffers; GL::deleteFramebuffers = glDeleteFramebuffers; GL::bindFramebuffer = glBindFramebuffer; GL::checkFramebufferStatus = glCheckFramebufferStatus; GL::framebufferTexture2D = glFramebufferTexture2D; GL::generateMipmap = glGenerateMipmap; GL::bindBuffer = glBindBuffer; GL::deleteBuffers = glDeleteBuffers; GL::genBuffers = glGenBuffers; GL::bufferData = glBufferData; GL::bufferSubData = glBufferSubData; GL::getShaderiv = glGetShaderiv; GL::getShaderInfoLog = glGetShaderInfoLog; GL::getProgramiv = glGetProgramiv; GL::getProgramInfoLog = glGetProgramInfoLog; GL::createShader = glCreateShader; GL::shaderSource = (GL::GLShaderSourceProc) glShaderSource; GL::compileShader = glCompileShader; GL::createProgram = glCreateProgram; GL::attachShader = glAttachShader; GL::linkProgram = glLinkProgram; GL::validateProgram = glValidateProgram; GL::deleteShader = glDeleteShader; GL::deleteProgram = glDeleteProgram; GL::useProgram = glUseProgram; GL::getUniformLocation = glGetUniformLocation; GL::uniform1f = glUniform1f; GL::uniform1i = glUniform1i; GL::uniform2f = glUniform2f; GL::uniform2i = glUniform2i; GL::uniform3f = glUniform3f; GL::uniform3i = glUniform3i; GL::uniform4f = glUniform4f; GL::uniform4i = glUniform4i; GL::uniformMatrix4fv = glUniformMatrix4fv; GL::getAttribLocation = glGetAttribLocation; GL::enableVertexAttribArray = glEnableVertexAttribArray; GL::disableVertexAttribArray = glDisableVertexAttribArray; GL::vertexAttribPointer = glVertexAttribPointer; GL::genRenderbuffers = glGenRenderbuffers; GL::deleteRenderbuffers = glDeleteRenderbuffers; GL::bindRenderbuffer = glBindRenderbuffer; GL::framebufferRenderbuffer = glFramebufferRenderbuffer; GL::renderbufferStorage = glRenderbufferStorage; glClearColor (0.0, 0.0, 0.0, 1.0); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_BLEND); glEnable (GL_CULL_FACE); priv->updateView (); priv->lighting = false; priv->filter[NOTHING_TRANS_FILTER] = GLTexture::Fast; priv->filter[SCREEN_TRANS_FILTER] = GLTexture::Good; priv->filter[WINDOW_TRANS_FILTER] = GLTexture::Good; if (GL::textureFromPixmap) registerBindPixmap (EglTexture::bindPixmapToTexture); priv->incorrectRefreshRate = false; #else Display *dpy = screen->dpy (); const char *glExtensions; GLfloat globalAmbient[] = { 0.1f, 0.1f, 0.1f, 0.1f }; GLfloat ambientLight[] = { 0.0f, 0.0f, 0.0f, 0.0f }; GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 0.9f }; GLfloat light0Position[] = { -0.5f, 0.5f, -9.0f, 1.0f }; CompOption::Vector o (0); priv->ctx = glXCreateContext (dpy, visinfo, NULL, True); if (!priv->ctx) { compLogMessage ("opengl", CompLogLevelWarn, "glXCreateContext with direct rendering failed - trying indirect"); /* force Mesa libGL into indirect rendering mode, because glXQueryExtensionsString is context-independant */ setenv ("LIBGL_ALWAYS_INDIRECT", "1", True); priv->ctx = glXCreateContext(dpy, visinfo, NULL, true); if (!priv->ctx) { compLogMessage ("opengl", CompLogLevelWarn, "glXCreateContext failed"); XFree (visinfo); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } } XFree (visinfo); glXMakeCurrent (dpy, CompositeScreen::get (screen)->output (), priv->ctx); glExtensions = (const char *) glGetString (GL_EXTENSIONS); if (!glExtensions) { compLogMessage ("opengl", CompLogLevelFatal, "No valid GL extensions string found."); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } const char *glVendor = (const char *) glGetString (GL_VENDOR); const char *glRenderer = (const char *) glGetString (GL_RENDERER); const char *glVersion = (const char *) glGetString (GL_VERSION); priv->glVendor = glVendor; priv->glRenderer = glRenderer; priv->glVersion = glVersion; if (glRenderer != NULL && (strcmp (glRenderer, "Software Rasterizer") == 0 || strcmp (glRenderer, "Mesa X11") == 0)) { compLogMessage ("opengl", CompLogLevelFatal, "Software rendering detected"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } priv->commonFrontbuffer = true; priv->incorrectRefreshRate = false; if (glRenderer != NULL && strstr (glRenderer, "on llvmpipe")) { /* * Most drivers use the same frontbuffer infrastructure for * swapbuffers as well as subbuffer copying. However there are some * odd exceptions like LLVMpipe (and SGX-something?) that use separate * buffers, so we can't dynamically switch between buffer swapping and * copying in those cases. */ priv->commonFrontbuffer = false; } if (glVendor != NULL && strstr (glVendor, "NVIDIA")) { /* * NVIDIA provides an incorrect refresh rate, we need to * force 60Hz */ priv->incorrectRefreshRate = true; } if (glVendor != NULL && strstr (glVendor, "VMware") && glRenderer != NULL && strstr (glRenderer, "on SVGA3D")) { /* vmwgfx has an incomplete glGenerateMipmap implementation. * It does not seem to support generating mipmaps for * FBO backed textures - instead it raises SIGABRT with * an exception stating that the command does not exist. * * This is actually supported in the spec, it just seems * to be unavailable in the driver. */ priv->driverHasBrokenFBOMipmapImplementation = true; } if (strstr (glExtensions, "GL_ARB_texture_non_power_of_two")) GL::textureNonPowerOfTwo = true; GL::textureNonPowerOfTwoMipmap = GL::textureNonPowerOfTwo; glGetIntegerv (GL_MAX_TEXTURE_SIZE, &GL::maxTextureSize); if (strstr (glExtensions, "GL_NV_texture_rectangle") || strstr (glExtensions, "GL_EXT_texture_rectangle") || strstr (glExtensions, "GL_ARB_texture_rectangle")) { GL::textureRectangle = true; if (!GL::textureNonPowerOfTwo) { GLint maxTextureSize; glGetIntegerv (GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, &maxTextureSize); if (maxTextureSize > GL::maxTextureSize) GL::maxTextureSize = maxTextureSize; } } if (!(GL::textureRectangle || GL::textureNonPowerOfTwo)) { compLogMessage ("opengl", CompLogLevelFatal, "Support for non power of two textures missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); return false; } if (strstr (glExtensions, "GL_ARB_texture_env_combine")) { GL::textureEnvCombine = true; /* XXX: GL_NV_texture_env_combine4 need special code but it seams to be working anyway for now... */ if (strstr (glExtensions, "GL_ARB_texture_env_crossbar") || strstr (glExtensions, "GL_NV_texture_env_combine4")) GL::textureEnvCrossbar = true; } if (strstr (glExtensions, "GL_ARB_texture_border_clamp") || strstr (glExtensions, "GL_SGIS_texture_border_clamp")) GL::textureBorderClamp = true; GL::maxTextureUnits = 1; if (strstr (glExtensions, "GL_ARB_multitexture")) { GL::activeTexture = (GL::GLActiveTextureProc) getProcAddress ("glActiveTexture"); GL::clientActiveTexture = (GL::GLClientActiveTextureProc) getProcAddress ("glClientActiveTexture"); GL::multiTexCoord2f = (GL::GLMultiTexCoord2fProc) getProcAddress ("glMultiTexCoord2f"); if (GL::activeTexture && GL::clientActiveTexture && GL::multiTexCoord2f) glGetIntegerv (GL_MAX_TEXTURE_UNITS_ARB, &GL::maxTextureUnits); } if (strstr (glExtensions, "GL_EXT_framebuffer_object")) { GL::genFramebuffers = (GL::GLGenFramebuffersProc) getProcAddress ("glGenFramebuffersEXT"); GL::deleteFramebuffers = (GL::GLDeleteFramebuffersProc) getProcAddress ("glDeleteFramebuffersEXT"); GL::bindFramebuffer = (GL::GLBindFramebufferProc) getProcAddress ("glBindFramebufferEXT"); GL::checkFramebufferStatus = (GL::GLCheckFramebufferStatusProc) getProcAddress ("glCheckFramebufferStatusEXT"); GL::framebufferTexture2D = (GL::GLFramebufferTexture2DProc) getProcAddress ("glFramebufferTexture2DEXT"); GL::generateMipmap = (GL::GLGenerateMipmapProc) getProcAddress ("glGenerateMipmapEXT"); GL::genRenderbuffers = (GL::GLGenRenderbuffersProc) getProcAddress ("glGenRenderbuffersEXT"); GL::deleteRenderbuffers = (GL::GLDeleteRenderbuffersProc) getProcAddress ("glDeleteRenderbuffersEXT"); GL::bindRenderbuffer = (GL::GLBindRenderbufferProc) getProcAddress ("glBindRenderbufferEXT"); GL::framebufferRenderbuffer = (GL::GLFramebufferRenderbufferProc) getProcAddress ("glFramebufferRenderbufferEXT"); GL::renderbufferStorage = (GL::GLRenderbufferStorageProc) getProcAddress ("glRenderbufferStorageEXT"); if (GL::genFramebuffers && GL::deleteFramebuffers && GL::bindFramebuffer && GL::checkFramebufferStatus && GL::framebufferTexture2D && GL::generateMipmap && GL::genRenderbuffers && GL::deleteRenderbuffers && GL::bindRenderbuffer && GL::framebufferRenderbuffer && GL::renderbufferStorage ) GL::fboSupported = true; } GL::fboStencilSupported = GL::fboSupported && strstr (glExtensions, "GL_EXT_packed_depth_stencil"); if (strstr (glExtensions, "GL_ARB_vertex_buffer_object")) { GL::bindBuffer = (GL::GLBindBufferProc) getProcAddress ("glBindBufferARB"); GL::deleteBuffers = (GL::GLDeleteBuffersProc) getProcAddress ("glDeleteBuffersARB"); GL::genBuffers = (GL::GLGenBuffersProc) getProcAddress ("glGenBuffersARB"); GL::bufferData = (GL::GLBufferDataProc) getProcAddress ("glBufferDataARB"); GL::bufferSubData = (GL::GLBufferSubDataProc) getProcAddress ("glBufferSubDataARB"); if (GL::bindBuffer && GL::deleteBuffers && GL::genBuffers && GL::bufferData && GL::bufferSubData) GL::vboSupported = true; } priv->updateRenderMode (); if (strstr (glExtensions, "GL_ARB_fragment_shader") && strstr (glExtensions, "GL_ARB_vertex_shader") && strstr (glExtensions, "GL_ARB_shader_objects") && strstr (glExtensions, "GL_ARB_shading_language_100")) { GL::getShaderiv = (GL::GLGetShaderivProc) GL::getShaderivARBWrapper; GL::getShaderInfoLog = (GL::GLGetShaderInfoLogProc) GL::getShaderInfoLogARBWrapper; GL::getProgramiv = (GL::GLGetProgramivProc) GL::getProgramivARBWrapper; GL::getProgramInfoLog = (GL::GLGetProgramInfoLogProc) GL::getProgramInfoLogARBWrapper; GL::getObjectParameteriv = (GL::GLGetObjectParameterivProc) getProcAddress ("glGetObjectParameterivARB"); GL::getInfoLog = (GL::GLGetInfoLogProc) getProcAddress ("glGetInfoLogARB"); GL::createShader = (GL::GLCreateShaderProc) GL::createShaderARBWrapper; GL::createShaderObjectARB = (GL::GLCreateShaderObjectARBProc) getProcAddress ("glCreateShaderObjectARB"); GL::shaderSource = (GL::GLShaderSourceProc) GL::shaderSourceARBWrapper; GL::shaderSourceARB = (GL::GLShaderSourceARBProc) getProcAddress ("glShaderSourceARB"); GL::compileShader = (GL::GLCompileShaderProc) GL::compileShaderARBWrapper; GL::compileShaderARB = (GL::GLCompileShaderARBProc) getProcAddress ("glCompileShaderARB"); GL::createProgram = (GL::GLCreateProgramProc) GL::createProgramARBWrapper; GL::createProgramObjectARB = (GL::GLCreateProgramObjectARBProc) getProcAddress ("glCreateProgramObjectARB"); GL::attachShader = GL::attachShaderARBWrapper; GL::attachObjectARB = (GL::GLAttachObjectARBProc) getProcAddress ("glAttachObjectARB"); GL::linkProgram = GL::linkProgramARBWrapper; GL::linkProgramARB = (GL::GLLinkProgramARBProc) getProcAddress ("glLinkProgramARB"); GL::validateProgram = GL::validateProgramARBWrapper; GL::validateProgramARB = (GL::GLValidateProgramARBProc) getProcAddress ("glValidateProgramARB"); GL::deleteShader = GL::deleteShaderARBWrapper; GL::deleteProgram = GL::deleteProgramARBWrapper; GL::deleteObjectARB = (GL::GLDeleteObjectARBProc) getProcAddress ("glDeleteObjectARB"); GL::useProgram = GL::useProgramARBWrapper; GL::useProgramObjectARB = (GL::GLUseProgramObjectARBProc) getProcAddress ("glUseProgramObjectARB"); GL::getUniformLocation = GL::getUniformLocationARBWrapper; GL::getUniformLocationARB = (GL::GLGetUniformLocationARBProc) getProcAddress ("glGetUniformLocationARB"); GL::uniform1f = (GL::GLUniform1fProc) getProcAddress ("glUniform1fARB"); GL::uniform1i = (GL::GLUniform1iProc) getProcAddress ("glUniform1iARB"); GL::uniform2f = (GL::GLUniform2fProc) getProcAddress ("glUniform2fARB"); GL::uniform2i = (GL::GLUniform2iProc) getProcAddress ("glUniform2iARB"); GL::uniform3f = (GL::GLUniform3fProc) getProcAddress ("glUniform3fARB"); GL::uniform3i = (GL::GLUniform3iProc) getProcAddress ("glUniform3iARB"); GL::uniform4f = (GL::GLUniform4fProc) getProcAddress ("glUniform4fARB"); GL::uniform4i = (GL::GLUniform4iProc) getProcAddress ("glUniform4iARB"); GL::uniformMatrix4fv = (GL::GLUniformMatrix4fvProc) getProcAddress ("glUniformMatrix4fvARB"); GL::getAttribLocation = (GL::GLGetAttribLocationProc) GL::getAttribLocationARBWrapper; GL::getAttribLocationARB = (GL::GLGetAttribLocationARBProc) getProcAddress ("glGetAttribLocationARB"); GL::enableVertexAttribArray = (GL::GLEnableVertexAttribArrayProc) getProcAddress ("glEnableVertexAttribArrayARB"); GL::disableVertexAttribArray = (GL::GLDisableVertexAttribArrayProc) getProcAddress ("glDisableVertexAttribArrayARB"); GL::vertexAttribPointer = (GL::GLVertexAttribPointerProc) getProcAddress ("glVertexAttribPointerARB"); GL::shaders = true; } if (strstr (glExtensions, "GL_ARB_texture_compression")) GL::textureCompression = true; if (strstr (glExtensions, "GL_ARB_sync")) { GL::fenceSync = (GL::GLFenceSyncProc) getProcAddress ("glFenceSync"); GL::deleteSync = (GL::GLDeleteSyncProc) getProcAddress ("glDeleteSync"); GL::clientWaitSync = (GL::GLClientWaitSyncProc) getProcAddress ("glClientWaitSync"); GL::waitSync = (GL::GLWaitSyncProc) getProcAddress ("glWaitSync"); GL::getSynciv = (GL::GLGetSyncivProc) getProcAddress ("glGetSynciv"); if (GL::fenceSync && GL::deleteSync && GL::clientWaitSync && GL::waitSync && GL::getSynciv) GL::sync = true; } if (strstr (glExtensions, "GL_EXT_x11_sync_object")) { GL::importSync = (GL::GLImportSyncProc) getProcAddress ("glImportSyncEXT"); if (GL::importSync) { priv->optionSetEnableX11SyncNotify(boost::bind(&PrivateGLScreen::optionChanged, priv, _1, _2)); priv->optionSetX11SyncBlacklistVendorNotify(boost::bind(&PrivateGLScreen::optionChanged, priv, _1, _2)); priv->optionSetX11SyncBlacklistModelNotify(boost::bind(&PrivateGLScreen::optionChanged, priv, _1, _2)); GL::xToGLSync = priv->checkX11GLSyncIsSupported (); } } glClearColor (0.0, 0.0, 0.0, 1.0); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_CULL_FACE); glDisable (GL_BLEND); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glColor4usv (defaultColor); if (GL::textureEnvCombine && GL::maxTextureUnits >= 2) { GL::canDoSaturated = true; if (GL::textureEnvCrossbar && GL::maxTextureUnits >= 4) GL::canDoSlightlySaturated = true; } priv->updateView (); glLightModelfv (GL_LIGHT_MODEL_AMBIENT, globalAmbient); glEnable (GL_LIGHT0); glLightfv (GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv (GL_LIGHT0, GL_POSITION, light0Position); glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glNormal3f (0.0f, 0.0f, -1.0f); priv->lighting = false; priv->filter[NOTHING_TRANS_FILTER] = GLTexture::Fast; priv->filter[SCREEN_TRANS_FILTER] = GLTexture::Good; priv->filter[WINDOW_TRANS_FILTER] = GLTexture::Good; if (GL::textureFromPixmap) registerBindPixmap (TfpTexture::bindPixmapToTexture); #endif /* Scratch framebuffer must be allocated before updating * the backbuffer provider */ if (GL::fboSupported) { priv->scratchFbo.reset (new GLFramebufferObject ()); priv->scratchFbo->allocate (*screen, NULL, GL_BGRA); } GLVertexBuffer::streamingBuffer ()->setAutoProgram (priv->autoProgram); priv->updateFrameProvider (); return true; } bool GLScreen::driverHasBrokenFBOMipmaps () const { return priv->driverHasBrokenFBOMipmapImplementation; } template class PluginClassHandler; GLScreen::GLScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateGLScreen (this)) { #ifndef USE_GLES DetectionWorkaround workaround; #endif XVisualInfo *visinfo = NULL; #ifndef USE_GLES Display *dpy = s->dpy (); XVisualInfo templ; GLXFBConfig *fbConfigs; int defaultDepth, nvisinfo, nElements, value, i; const char *glxExtensions; XWindowAttributes attr; CompOption::Vector o (0); if (!XGetWindowAttributes (dpy, s->root (), &attr)) { screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } templ.visualid = XVisualIDFromVisual (attr.visual); visinfo = XGetVisualInfo (dpy, VisualIDMask, &templ, &nvisinfo); if (!nvisinfo) { compLogMessage ("opengl", CompLogLevelFatal, "Couldn't get visual info for default visual"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } defaultDepth = visinfo->depth; glXGetConfig (dpy, visinfo, GLX_USE_GL, &value); if (!value) { compLogMessage ("opengl", CompLogLevelFatal, "Root visual is not a GL visual"); XFree (visinfo); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } glXGetConfig (dpy, visinfo, GLX_DOUBLEBUFFER, &value); if (!value) { compLogMessage ("opengl", CompLogLevelFatal, "Root visual is not a double buffered GL visual"); XFree (visinfo); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } glxExtensions = glXQueryExtensionsString (dpy, s->screenNum ()); if (glxExtensions == NULL) { compLogMessage ("opengl", CompLogLevelFatal, "glXQueryExtensionsString is NULL for screen %d", s->screenNum ()); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } if (!strstr (glxExtensions, "GLX_SGIX_fbconfig")) { compLogMessage ("opengl", CompLogLevelFatal, "GLX_SGIX_fbconfig is missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } if (strstr (glxExtensions, "GLX_EXT_buffer_age")) { compLogMessage ("opengl", CompLogLevelInfo, "GLX_EXT_buffer_age is supported"); GL::bufferAge = true; } priv->getProcAddress = (GL::GLXGetProcAddressProc) getProcAddress ("glXGetProcAddressARB"); GL::bindTexImage = (GL::GLXBindTexImageProc) getProcAddress ("glXBindTexImageEXT"); GL::releaseTexImage = (GL::GLXReleaseTexImageProc) getProcAddress ("glXReleaseTexImageEXT"); GL::queryDrawable = (GL::GLXQueryDrawableProc) getProcAddress ("glXQueryDrawable"); GL::getFBConfigs = (GL::GLXGetFBConfigsProc) getProcAddress ("glXGetFBConfigs"); GL::getFBConfigAttrib = (GL::GLXGetFBConfigAttribProc) getProcAddress ("glXGetFBConfigAttrib"); GL::createPixmap = (GL::GLXCreatePixmapProc) getProcAddress ("glXCreatePixmap"); GL::destroyPixmap = (GL::GLXDestroyPixmapProc) getProcAddress ("glXDestroyPixmap"); if (!strstr (glxExtensions, "GLX_EXT_texture_from_pixmap") || !GL::bindTexImage || !GL::releaseTexImage) { compLogMessage ("opengl", CompLogLevelFatal, "GLX_EXT_texture_from_pixmap is missing"); GL::textureFromPixmap = false; } else GL::textureFromPixmap = true; if (!GL::queryDrawable || !GL::getFBConfigs || !GL::getFBConfigAttrib || !GL::createPixmap || !GL::destroyPixmap) { compLogMessage ("opengl", CompLogLevelFatal, "fbconfig functions missing"); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); return; } if (strstr (glxExtensions, "GLX_MESA_copy_sub_buffer")) GL::copySubBuffer = (GL::GLXCopySubBufferProc) getProcAddress ("glXCopySubBufferMESA"); if (strstr (glxExtensions, "GLX_SGI_video_sync")) { GL::getVideoSync = (GL::GLXGetVideoSyncProc) getProcAddress ("glXGetVideoSyncSGI"); GL::waitVideoSync = (GL::GLXWaitVideoSyncProc) getProcAddress ("glXWaitVideoSyncSGI"); } if (strstr (glxExtensions, "GLX_SGI_swap_control")) { GL::swapInterval = (GL::GLXSwapIntervalProc) getProcAddress ("glXSwapIntervalSGI"); } priv->initXToGLSyncs (); fbConfigs = (*GL::getFBConfigs) (dpy, s->screenNum (), &nElements); GL::stencilBuffer = false; for (i = 0; i <= MAX_DEPTH; i++) { int j, db, stencil, depth, alpha, mipmap, msaaBuffers, msaaSamples, rgba; priv->glxPixmapFBConfigs[i].fbConfig = NULL; priv->glxPixmapFBConfigs[i].mipmap = 0; priv->glxPixmapFBConfigs[i].yInverted = 0; priv->glxPixmapFBConfigs[i].textureFormat = 0; priv->glxPixmapFBConfigs[i].textureTargets = 0; db = MAXSHORT; stencil = MAXSHORT; depth = MAXSHORT; msaaBuffers = MAXSHORT; msaaSamples = MAXSHORT; mipmap = 0; rgba = 0; for (j = 0; j < nElements; j++) { XVisualInfo *vi; int visualDepth; vi = glXGetVisualFromFBConfig (dpy, fbConfigs[j]); if (vi == NULL) continue; visualDepth = vi->depth; XFree (vi); if (visualDepth != i) continue; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_ALPHA_SIZE, &alpha); (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BUFFER_SIZE, &value); if (value != i && (value - alpha) != i) continue; value = 0; if (i == 32) { (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_TEXTURE_RGBA_EXT, &value); if (value) { rgba = 1; priv->glxPixmapFBConfigs[i].textureFormat = GLX_TEXTURE_FORMAT_RGBA_EXT; } } if (!value) { if (rgba) continue; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_TEXTURE_RGB_EXT, &value); if (!value) continue; priv->glxPixmapFBConfigs[i].textureFormat = GLX_TEXTURE_FORMAT_RGB_EXT; } (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_DOUBLEBUFFER, &value); if (value > db) continue; db = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_STENCIL_SIZE, &value); if (value > stencil) continue; stencil = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_DEPTH_SIZE, &value); if (value > depth) continue; depth = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_SAMPLE_BUFFERS, &value); if (value > msaaBuffers) continue; msaaBuffers = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_SAMPLES, &value); if (value > msaaSamples) continue; msaaSamples = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &value); if (value < mipmap) continue; mipmap = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_Y_INVERTED_EXT, &value); priv->glxPixmapFBConfigs[i].yInverted = value; (*GL::getFBConfigAttrib) (dpy, fbConfigs[j], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value); priv->glxPixmapFBConfigs[i].textureTargets = value; priv->glxPixmapFBConfigs[i].fbConfig = fbConfigs[j]; priv->glxPixmapFBConfigs[i].mipmap = mipmap; } if (i == defaultDepth) if (stencil != MAXSHORT) GL::stencilBuffer = true; } if (nElements) XFree (fbConfigs); if (!priv->glxPixmapFBConfigs[defaultDepth].fbConfig) { compLogMessage ("opengl", CompLogLevelFatal, "No GLXFBConfig for default depth, " "this isn't going to work."); screen->handleCompizEvent ("opengl", "fatal_fallback", o); setFailed (); } #endif if (!glInitContext (visinfo)) setFailed (); } GLScreen::~GLScreen () { // Must occur before context is destroyed. priv->destroyXToGLSyncs (); if (priv->hasCompositing) CompositeScreen::get (screen)->unregisterPaintHandler (); #ifdef USE_GLES Display *xdpy = screen->dpy (); EGLDisplay dpy = eglGetDisplay (xdpy); eglMakeCurrent (dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (priv->ctx != EGL_NO_CONTEXT) eglDestroyContext (dpy, priv->ctx); eglDestroySurface (dpy, priv->surface); eglTerminate (dpy); eglReleaseThread (); #else glXMakeCurrent (screen->dpy (), None, NULL); if (priv->ctx) glXDestroyContext (screen->dpy (), priv->ctx); #endif delete priv; } PrivateGLScreen::PrivateGLScreen (GLScreen *gs) : gScreen (gs), cScreen (CompositeScreen::get (screen)), textureFilter (GL_LINEAR), backgroundTextures (), backgroundLoaded (false), rasterPos (0, 0), projection (NULL), clearBuffers (true), lighting (false), #ifndef USE_GLES ctx (NULL), getProcAddress (0), doubleBuffer (screen->dpy (), *screen, cScreen->output ()), #else ctx (EGL_NO_CONTEXT), doubleBuffer (screen->dpy (), *screen, surface), #endif scratchFbo (), outputRegion (), refreshSubBuffer (false), lastMask (0), bindPixmap (), hasCompositing (false), commonFrontbuffer (true), incorrectRefreshRate (false), programCache (new GLProgramCache (30)), shaderCache (), autoProgram (new GLScreenAutoProgram(gs)), rootPixmapCopy (None), rootPixmapSize (), frameProvider (), glVendor (NULL), glRenderer (NULL), glVersion (NULL), postprocessingRequired (false), prevRegex (), prevBlacklisted (false), currentSyncNum (0), currentSync (0), warmupSyncs (0), driverHasBrokenFBOMipmapImplementation (false) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); } PrivateGLScreen::~PrivateGLScreen () { delete projection; delete programCache; delete autoProgram; if (rootPixmapCopy) XFreePixmap (screen->dpy (), rootPixmapCopy); } GLushort defaultColor[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; GLenum GLScreen::textureFilter () { return priv->textureFilter; } void GLScreen::setTextureFilter (GLenum filter) { priv->textureFilter = filter; } void PrivateGLScreen::optionChanged(CompOption *opt, OpenglOptions::Options num) { switch (num) { case OpenglOptions::EnableX11Sync: case OpenglOptions::X11SyncBlacklistModel: case OpenglOptions::X11SyncBlacklistVendor: GL::xToGLSync = checkX11GLSyncIsSupported (); if (!syncObjectsEnabled ()) destroyXToGLSyncs (); break; default: break; } } void PrivateGLScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); switch (event->type) { case ConfigureNotify: if (event->xconfigure.window == screen->root ()) updateScreenBackground (); break; case PropertyNotify: if (event->xproperty.atom == Atoms::xBackground[0] || event->xproperty.atom == Atoms::xBackground[1]) { if (event->xproperty.window == screen->root ()) gScreen->updateBackground (); } else if (event->xproperty.atom == Atoms::winOpacity || event->xproperty.atom == Atoms::winBrightness || event->xproperty.atom == Atoms::winSaturation) { w = screen->findWindow (event->xproperty.window); if (w) GLWindow::get (w)->updatePaintAttribs (); } else if (event->xproperty.atom == Atoms::wmIcon) { w = screen->findWindow (event->xproperty.window); if (w) GLWindow::get (w)->priv->icons.clear (); } break; default: if (event->type == cScreen->damageEvent () + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; #ifdef USE_GLES std::map::iterator it = boundPixmapTex.find (de->damage); #else std::map::iterator it = boundPixmapTex.find (de->damage); #endif if (it != boundPixmapTex.end ()) { it->second->damaged = true; } /* XXX: It would be nice if we could also update * the background of the root window when the root * window pixmap changes, but unfortunately XDamage * reports damage events any time a child of the root * window gets a damage event, which means that we'd * be recopying the root window pixmap all the time * which is no good, so don't do that */ } else if (event->type == screen->syncEvent () + XSyncAlarmNotify) { XSyncAlarmNotifyEvent *ae = reinterpret_cast(event); std::map::iterator it = alarmToSync.find (ae->alarm); if (it != alarmToSync.end ()) it->second->handleEvent (ae); } break; } } void GLScreen::clearTargetOutput (unsigned int mask) { clearOutput (targetOutput, mask); } static void frustum (GLfloat *m, GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat nearval, GLfloat farval) { GLfloat x, y, a, b, c, d; x = (2.0 * nearval) / (right - left); y = (2.0 * nearval) / (top - bottom); a = (right + left) / (right - left); b = (top + bottom) / (top - bottom); c = -(farval + nearval) / ( farval - nearval); d = -(2.0 * farval * nearval) / (farval - nearval); #define M(row,col) m[col * 4 + row] M(0,0) = x; M(0,1) = 0.0f; M(0,2) = a; M(0,3) = 0.0f; M(1,0) = 0.0f; M(1,1) = y; M(1,2) = b; M(1,3) = 0.0f; M(2,0) = 0.0f; M(2,1) = 0.0f; M(2,2) = c; M(2,3) = d; M(3,0) = 0.0f; M(3,1) = 0.0f; M(3,2) = -1.0f; M(3,3) = 0.0f; #undef M } static void perspective (GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) { GLfloat xmin, xmax, ymin, ymax; ymax = zNear * tan (fovy * M_PI / 360.0); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; frustum (m, xmin, xmax, ymin, ymax, zNear, zFar); } void PrivateGLScreen::updateView () { GLfloat projection_array[16]; #ifndef USE_GLES glMatrixMode (GL_PROJECTION); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glDepthRange (0, 1); glRasterPos2f (0, 0); #endif glViewport (-1, -1, 2, 2); rasterPos = CompPoint (0, 0); perspective (projection_array, 60.0f, 1.0f, 0.1f, 100.0f); if (projection != NULL) delete projection; projection = new GLMatrix (projection_array); #ifndef USE_GLES glMatrixMode (GL_PROJECTION); glLoadMatrixf (projection_array); glMatrixMode (GL_MODELVIEW); #endif CompRegion region (screen->region ()); /* remove all output regions from visible screen region */ foreach (CompOutput &o, screen->outputDevs ()) region -= o; /* we should clear color buffers before swapping if we have visible regions without output */ clearBuffers = !region.isEmpty (); gScreen->setDefaultViewport (); } void PrivateGLScreen::outputChangeNotify () { screen->outputChangeNotify (); frameProvider->invalidateAll (); if (scratchFbo) scratchFbo->allocate (*screen, NULL, GL_BGRA); updateView (); } #ifndef USE_GLES GL::FuncPtr GLScreen::getProcAddress (const char *name) { static void *dlhand = NULL; GL::FuncPtr funcPtr = NULL; if (priv->getProcAddress) funcPtr = priv->getProcAddress ((GLubyte *) name); if (!funcPtr) { if (!dlhand) dlhand = dlopen ("libopengl.so", RTLD_LAZY); if (dlhand) { dlerror (); funcPtr = (GL::FuncPtr) dlsym (dlhand, name); if (dlerror () != NULL) funcPtr = NULL; } } return funcPtr; } #endif void PrivateGLScreen::updateScreenBackground () { Display *dpy = screen->dpy (); Atom pixmapAtom, actualType; int actualFormat, i, status; unsigned int width = 1, height = 1, depth = 0; unsigned long nItems; unsigned long bytesAfter; unsigned char *prop; Pixmap pixmap = None; pixmapAtom = XInternAtom (dpy, "PIXMAP", false); for (i = 0; pixmap == 0 && i < 2; i++) { status = XGetWindowProperty (dpy, screen->root (), Atoms::xBackground[i], 0, 4, false, AnyPropertyType, &actualType, &actualFormat, &nItems, &bytesAfter, &prop); if (status == Success && nItems && prop) { if (actualType == pixmapAtom && actualFormat == 32 && nItems == 1) { Pixmap p = None; memcpy (&p, prop, 4); if (p) { unsigned int ui; int i; Window w; if (XGetGeometry (dpy, p, &w, &i, &i, &width, &height, &ui, &depth)) { if ((int) depth == screen->attrib ().depth) pixmap = p; } } } XFree (prop); } } if (pixmap) { backgroundTextures = GLTexture::bindPixmapToTexture (pixmap, width, height, depth); if (backgroundTextures.empty ()) { compLogMessage ("core", CompLogLevelWarn, "Couldn't bind background pixmap 0x%x to " "texture", (int) pixmap); } } else { backgroundTextures.clear (); } if (backgroundTextures.empty ()) { CompSize size; /* Try to get the root window background */ XGCValues gcv; GC gc; gcv.graphics_exposures = false; gcv.subwindow_mode = IncludeInferiors; gc = XCreateGC (screen->dpy (), screen->root (), GCGraphicsExposures | GCSubwindowMode, &gcv); if (rootPixmapSize.width () != screen->width () || rootPixmapSize.height () != screen->height ()) { if (rootPixmapCopy) XFreePixmap (screen->dpy (), rootPixmapCopy); rootPixmapSize = CompSize (screen->width (), screen->height ()); rootPixmapCopy = XCreatePixmap (screen->dpy (), screen->root (), rootPixmapSize.width (), rootPixmapSize.height (), DefaultDepth (screen->dpy (), DefaultScreen (screen->dpy ()))); backgroundTextures = GLTexture::bindPixmapToTexture (rootPixmapCopy, rootPixmapSize.width (), rootPixmapSize.height (), DefaultDepth (screen->dpy (), DefaultScreen (screen->dpy ()))); if (backgroundTextures.empty ()) { compLogMessage ("core", CompLogLevelWarn, "Couldn't bind background pixmap 0x%x to " "texture", (int) screen->width ()); } } if (rootPixmapCopy) { XCopyArea (screen->dpy (), screen->root (), rootPixmapCopy, gc, 0, 0, screen->width (), screen->height (), 0, 0); XSync (screen->dpy (), false); } else { backgroundTextures.clear (); } XFreeGC(dpy, gc); } } void GLScreen::setTexEnvMode (GLenum mode) { #ifndef USE_GLES if (priv->lighting) glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); else glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode); #endif } void GLScreen::setLighting (bool lighting) { #ifndef USE_GLES if (priv->lighting != lighting) { if (!priv->optionGetLighting ()) lighting = false; if (lighting) { glEnable (GL_COLOR_MATERIAL); glEnable (GL_LIGHTING); } else { glDisable (GL_COLOR_MATERIAL); glDisable (GL_LIGHTING); } priv->lighting = lighting; setTexEnvMode (GL_REPLACE); } #endif } bool GLScreenInterface::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) WRAPABLE_DEF (glPaintOutput, sAttrib, transform, region, output, mask) void GLScreenInterface::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) WRAPABLE_DEF (glPaintTransformedOutput, sAttrib, transform, region, output, mask) void GLScreenInterface::glApplyTransform (const GLScreenPaintAttrib &sAttrib, CompOutput *output, GLMatrix *transform) WRAPABLE_DEF (glApplyTransform, sAttrib, output, transform) void GLScreenInterface::glEnableOutputClipping (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output) WRAPABLE_DEF (glEnableOutputClipping, transform, region, output) void GLScreenInterface::glDisableOutputClipping () WRAPABLE_DEF (glDisableOutputClipping) GLMatrix * GLScreenInterface::projectionMatrix () WRAPABLE_DEF (projectionMatrix) bool GLScreenInterface::glPaintCompositedOutputRequired () WRAPABLE_DEF (glPaintCompositedOutputRequired) void GLScreenInterface::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) WRAPABLE_DEF (glPaintCompositedOutput, region, fbo, mask) void GLScreenInterface::glBufferStencil(const GLMatrix &matrix, GLVertexBuffer &vertexBuffer, CompOutput *output) WRAPABLE_DEF (glBufferStencil, matrix, vertexBuffer, output) GLMatrix * GLScreen::projectionMatrix () { WRAPABLE_HND_FUNCTN_RETURN (GLMatrix *, projectionMatrix) return priv->projection; } void GLScreen::updateBackground () { priv->backgroundTextures.clear (); if (priv->backgroundLoaded) { priv->backgroundLoaded = false; CompositeScreen::get (screen)->damageScreen (); } } bool GLScreen::lighting () { return priv->lighting; } GLTexture::Filter GLScreen::filter (int filter) { return priv->filter[filter]; } void GLScreen::setFilter (int num, GLTexture::Filter filter) { priv->filter[num] = filter; } #ifndef USE_GLES GLFBConfig* GLScreen::glxPixmapFBConfig (unsigned int depth) { return &priv->glxPixmapFBConfigs[depth]; } #endif void GLScreen::clearOutput (CompOutput *output, unsigned int mask) { BoxPtr pBox = &output->region ()->extents; if (pBox->x1 != 0 || pBox->y1 != 0 || pBox->x2 != (int) screen->width () || pBox->y2 != (int) screen->height ()) { glEnable (GL_SCISSOR_TEST); glScissor (pBox->x1, screen->height () - pBox->y2, pBox->x2 - pBox->x1, pBox->y2 - pBox->y1); glClear (mask); glDisable (GL_SCISSOR_TEST); } else { glClear (mask); } } void GLScreen::setDefaultViewport () { priv->lastViewport.x = screen->outputDevs ()[0].x1 (); priv->lastViewport.y = screen->height () - screen->outputDevs ()[0].y2 (); priv->lastViewport.width = screen->outputDevs ()[0].width (); priv->lastViewport.height = screen->outputDevs ()[0].height (); glViewport (priv->lastViewport.x, priv->lastViewport.y, priv->lastViewport.width, priv->lastViewport.height); } #ifdef USE_GLES EGLContext GLScreen::getEGLContext () { return priv->ctx; } #endif GLProgram * GLScreen::getProgram (std::list shaders) { return (*priv->programCache)(shaders); } const GLShaderData * GLScreen::getShaderData (GLShaderParameters ¶ms) { return &priv->shaderCache.getShaderData(params); } GLDoubleBuffer::GLDoubleBuffer (Display *d, const CompSize &s, const compiz::opengl::impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const compiz::opengl::impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc) : compiz::opengl::DoubleBuffer (swapIntervalFunc, waitVideoSyncFunc), mDpy (d), mSize (s) { } bool PrivateGLScreen::checkX11GLSyncIsSupported () { if (!GL::importSync) return false; if (!optionGetEnableX11Sync ()) return false; bool blacklisted_card = false; size_t blacklisted_cards = optionGetX11SyncBlacklistVendor ().size(); for (unsigned i = 0; i < blacklisted_cards; ++i) { CompString const& vendor = optionGetX11SyncBlacklistVendor ()[i].s(); if (glVendor && strstr (glVendor, vendor.c_str())) { CompString const& model = optionGetX11SyncBlacklistModel ()[i].s(); blacklisted_card = blacklisted (model.c_str(), NULL, glRenderer, glVersion); if (blacklisted_card) break; } } return !blacklisted_card; } bool PrivateGLScreen::syncObjectsInitialized () const { return !xToGLSyncs.empty (); } bool PrivateGLScreen::syncObjectsEnabled () { return GL::sync && GL::xToGLSync; } void PrivateGLScreen::initXToGLSyncs () { assert (!syncObjectsInitialized ()); assert (xToGLSyncs.empty ()); assert (alarmToSync.empty ()); if (syncObjectsEnabled () && !syncObjectsInitialized ()) { xToGLSyncs.resize (NUM_X11_SYNCS, NULL); foreach (XToGLSync*& sync, xToGLSyncs) { sync = new XToGLSync (); alarmToSync[sync->alarm ()] = sync; } currentSyncNum = 0; currentSync = xToGLSyncs[0]; warmupSyncs = 0; } } void PrivateGLScreen::destroyXToGLSyncs () { if (syncObjectsInitialized ()) { foreach (XToGLSync* sync, xToGLSyncs) delete sync; xToGLSyncs.resize (0); } alarmToSync.clear (); currentSyncNum = 0; currentSync = NULL; warmupSyncs = 0; } void PrivateGLScreen::updateXToGLSyncs () { const std::vector::size_type numSyncs = xToGLSyncs.size (); if (numSyncs) { if (warmupSyncs >= numSyncs / 2) { const std::vector::size_type resetSyncIdx = (currentSyncNum + (numSyncs / 2)) % numSyncs; XToGLSync* syncToReset = xToGLSyncs[resetSyncIdx]; GLenum status = syncToReset->checkUpdateFinished (0); if (status == GL_TIMEOUT_EXPIRED) { status = syncToReset->checkUpdateFinished (MAX_SYNC_WAIT_TIME); } if (status != GL_ALREADY_SIGNALED && status != GL_CONDITION_SATISFIED) { // This should never happen. If there was an error somewhere, // then we don't want to risk a hang here, so just destroy the // sync objects. We'll recreate them again in the next call to // prepareDrawing. compLogMessage ("opengl", CompLogLevelError, "Timed out waiting for sync object."); destroyXToGLSyncs (); return; } syncToReset->reset (); } else { warmupSyncs++; } currentSyncNum++; currentSyncNum %= numSyncs; currentSync = xToGLSyncs[currentSyncNum]; } } #ifndef USE_GLES void GLXDoubleBuffer::copyFrontToBack() const { int w = screen->width (); int h = screen->height (); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glOrtho (0, w, 0, h, -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glReadBuffer (GL_FRONT); glRasterPos2i (0, 0); glCopyPixels (0, 0, w, h, GL_COLOR); glReadBuffer (GL_BACK); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); } GLXDoubleBuffer::GLXDoubleBuffer (Display *d, const CompSize &s, Window output) : GLDoubleBuffer (d, s, boost::bind (compiz::opengl::swapIntervalGLX, d, _1), boost::bind (compiz::opengl::waitVSyncGLX, _1, _2, _3)), mOutput (output) { } void GLXDoubleBuffer::swap () const { glXSwapBuffers (mDpy, mOutput); } bool GLXDoubleBuffer::blitAvailable () const { return GL::copySubBuffer ? true : false; } void GLXDoubleBuffer::blit (const CompRegion ®ion) const { const CompRect::vector &blitRects (region.rects ()); foreach (const CompRect &r, blitRects) { int y = mSize.height () - r.y2 (); (*GL::copySubBuffer) (screen->dpy (), mOutput, r.x1 (), y, r.width (), r.height ()); } } bool GLXDoubleBuffer::fallbackBlitAvailable () const { return true; } void GLXDoubleBuffer::fallbackBlit (const CompRegion ®ion) const { const CompRect::vector &blitRects (region.rects ()); int w = screen->width (); int h = screen->height (); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glOrtho (0, w, 0, h, -1.0, 1.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glDrawBuffer (GL_FRONT); foreach (const CompRect &r, blitRects) { int x = r.x1 (); int y = h - r.y2(); glRasterPos2i (x, y); glCopyPixels (x, y, w, h, GL_COLOR); } glDrawBuffer (GL_BACK); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glFlush (); } #else EGLDoubleBuffer::EGLDoubleBuffer (Display *d, const CompSize &s, EGLSurface const &surface) : GLDoubleBuffer (d, s, boost::bind (compiz::opengl::swapIntervalEGL, d, _1), boost::bind (compiz::opengl::waitVSyncEGL, _1, _2, _3)), mSurface (surface) { } void EGLDoubleBuffer::swap () const { eglSwapBuffers (eglGetDisplay (mDpy), mSurface); } bool EGLDoubleBuffer::blitAvailable () const { return GL::postSubBuffer ? true : false; } void EGLDoubleBuffer::blit (const CompRegion ®ion) const { CompRect::vector blitRects (region.rects ()); int y = 0; foreach (const CompRect &r, blitRects) { y = mSize.height () - r.y2 (); (*GL::postSubBuffer) (eglGetDisplay (screen->dpy ()), mSurface, r.x1 (), y, r.width (), r.height ()); } } bool EGLDoubleBuffer::fallbackBlitAvailable () const { return false; } void EGLDoubleBuffer::fallbackBlit (const CompRegion ®ion) const { } void EGLDoubleBuffer::copyFrontToBack() const { } #endif void PrivateGLScreen::paintOutputs (CompOutput::ptrList &outputs, unsigned int mask, const CompRegion ®ion) { if (clearBuffers) { if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) glClear (GL_COLOR_BUFFER_BIT); } if (currentSync) currentSync->insertWait (); // Disable everything that we don't usually need and could slow us down glDisable (GL_BLEND); glDisable (GL_STENCIL_TEST); glDisable (GL_DEPTH_TEST); glDepthMask (GL_FALSE); glStencilMask (0); #ifdef UNSAFE_ARM_SGX_FIXME refreshSubBuffer = ((lastMask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) && !(mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) && (mask & COMPOSITE_SCREEN_DAMAGE_REGION_MASK)); if (refreshSubBuffer) { // FIXME: We shouldn't have to substract a 1X1 pixel region here !! // This is an ugly workaround for what appears to be a bug in the SGX // X11 driver (e.g. on Pandaboard OMAP4 platform). // Posting a fullscreen damage region to the SGX seems to reset the // framebuffer, causing the screen to blackout. cScreen->damageRegion (CompRegion (screen->fullscreenOutput ()) - CompRegion (CompRect(0, 0, 1, 1))); } #endif CompRegion paintRegion ((mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) ? screen->region () : region); bool useFbo = false; GLFramebufferObject *oldFbo = NULL; postprocessingRequired = gScreen->glPaintCompositedOutputRequired (); postprocessingRequired |= frameProvider->alwaysPostprocess (); /* Clear the color buffer where appropriate */ if (GL::fboEnabled && postprocessRequiredForCurrentFrame ()) { oldFbo = scratchFbo->bind (); if (scratchFbo->checkStatus ()) useFbo = true; } foreach (CompOutput *output, outputs) { XRectangle r; targetOutput = output; r.x = output->x1 (); r.y = screen->height () - output->y2 (); r.width = output->width (); r.height = output->height (); if (lastViewport.x != r.x || lastViewport.y != r.y || lastViewport.width != r.width || lastViewport.height != r.height) { glViewport (r.x, r.y, r.width, r.height); lastViewport = r; } if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { GLMatrix identity; gScreen->glPaintOutput (defaultScreenPaintAttrib, identity, CompRegion (*output), output, PAINT_SCREEN_REGION_MASK | PAINT_SCREEN_FULL_MASK); } else if (mask & COMPOSITE_SCREEN_DAMAGE_REGION_MASK) { GLMatrix identity; #ifdef UNSAFE_ARM_SGX_FIXME /* * FIXME: * This code is unsafe and causes Unity bug 1036520. * So it probably needs to be replaced with something else * on platforms where it is required. * * We should NEVER be extending tmpRegion, because that's * telling windows/plugins it is OK to paint outside the * damaged region. */ if (refreshSubBuffer) tmpRegion = CompRegion (*output); #endif /* Clip current paint region to output extents */ CompRegionRef outputReg (output->region ()); outputRegion = (paintRegion & outputReg); if (!gScreen->glPaintOutput (defaultScreenPaintAttrib, identity, outputRegion, output, PAINT_SCREEN_REGION_MASK)) { identity.reset (); gScreen->glPaintOutput (defaultScreenPaintAttrib, identity, outputReg, output, PAINT_SCREEN_FULL_MASK); paintRegion += outputReg; cScreen->recordDamageOnCurrentFrame (outputReg); } } } targetOutput = &screen->outputDevs ()[0]; glViewport (0, 0, screen->width (), screen->height ()); if (useFbo) { // FIXME: does not work if screen dimensions exceed max texture size // We should try to use glBlitFramebuffer instead. GLFramebufferObject::rebind (oldFbo); /* If we must always postprocess, then we don't have any * "real" backbuffer persistence, redraw the whole thing */ gScreen->glPaintCompositedOutput (frameProvider->alwaysPostprocess () ? screen->region () : paintRegion, scratchFbo.get (), mask); } frameProvider->endFrame (); if (cScreen->outputWindowChanged ()) { /* * Changes to the composite output window seem to take a whole frame * to take effect. So to avoid a visible flicker, we skip this frame * and do a full redraw next time. */ cScreen->damageScreen (); return; } bool persistence = frameProvider->providesPersistence (); bool alwaysSwap = optionGetAlwaysSwapBuffers (); bool fullscreen = persistence || alwaysSwap || ((mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) && commonFrontbuffer); doubleBuffer.set (DoubleBuffer::VSYNC, optionGetSyncToVblank ()); doubleBuffer.set (DoubleBuffer::HAVE_PERSISTENT_BACK_BUFFER, persistence); doubleBuffer.set (DoubleBuffer::NEED_PERSISTENT_BACK_BUFFER, alwaysSwap); doubleBuffer.render (paintRegion, fullscreen); lastMask = mask; updateXToGLSyncs (); } unsigned int PrivateGLScreen::getFrameAge () { return frameProvider->getCurrentFrame (); } bool PrivateGLScreen::hasVSync () { #ifdef USE_GLES return false; #else return GL::waitVideoSync && optionGetSyncToVblank () && doubleBuffer.hardwareVSyncFunctional (); #endif } bool PrivateGLScreen::requiredForcedRefreshRate () { return incorrectRefreshRate; } bool PrivateGLScreen::compositingActive () { return true; } void PrivateGLScreen::damageCutoff () { cScreen->applyDamageForFrameAge (frameProvider->getCurrentFrame ()); frameProvider->useCurrentFrame (); cScreen->damageCutoff (); } void PrivateGLScreen::updateRenderMode () { #ifndef USE_GLES GL::fboEnabled = GL::fboSupported && optionGetFramebufferObject (); GL::vboEnabled = GL::vboSupported && optionGetVertexBufferObject (); #endif } void PrivateGLScreen::updateFrameProvider () { #ifndef USE_GLES const Window outputWindow = CompositeScreen::get (screen)->output (); if (GL::fboEnabled) { if (GL::bufferAge) { FrameProvider::Ptr back (new BufferAgeFrameProvider (screen->dpy (), outputWindow)); FrameProvider::Ptr scratch (new PostprocessFrameProvider (scratchFbo.get ())); OptionalPostprocessFrameProvider::PostprocessRequired ppReq (boost::bind (&PrivateGLScreen::postprocessRequiredForCurrentFrame, this)); frameProvider.reset (new OptionalPostprocessFrameProvider (back, scratch, ppReq)); } else { /* Prefer using FBO's instead of switching between a defined/undefined backbuffer */ frameProvider.reset (new PostprocessFrameProvider (scratchFbo.get ())); } } else { if (GL::bufferAge) frameProvider.reset (new BufferAgeFrameProvider (screen->dpy (), outputWindow)); else frameProvider.reset (new UndefinedFrameProvider ()); } #else frameProvider.reset (new PostprocessFrameProvider (scratchFbo.get ())); #endif } void PrivateGLScreen::prepareDrawing () { bool wasFboEnabled = GL::fboEnabled; updateRenderMode (); if (wasFboEnabled != GL::fboEnabled) { updateFrameProvider (); CompositeScreen::get (screen)->damageScreen (); } // Check if the option to use sync objects has been enabled or disabled. if (syncObjectsEnabled () && !syncObjectsInitialized ()) { initXToGLSyncs (); } if (currentSync) { if (!currentSync->isReady ()) { for (std::vector::size_type i = xToGLSyncs.size () / 2; i > 0; i--) { // try to check next sync updateXToGLSyncs (); // method updateXToGLSync may disable syncs if (!currentSync) break; if (currentSync->isReady ()) break; } } } if (currentSync) { if (!currentSync->isReady ()) { // If this happens, then we must have missed an event or update // somewhere. Destroy and recreate the sync objects to put us back // into a good state. destroyXToGLSyncs (); initXToGLSyncs (); } } if (currentSync) { // Tell the server to trigger the fence object after all rendering has // completed. assert (currentSync->isReady ()); currentSync->trigger (); } } bool PrivateGLScreen::driverIsBlacklisted (const char *regex) const { /* * regex matching is VERY expensive, so only do it when the result might * be different to last time. The gl* variables never change value... */ if (prevRegex != regex) { prevBlacklisted = blacklisted (regex, glVendor, glRenderer, glVersion); prevRegex = regex; } return prevBlacklisted; } bool PrivateGLScreen::postprocessRequiredForCurrentFrame () { return postprocessingRequired; } GLTexture::BindPixmapHandle GLScreen::registerBindPixmap (GLTexture::BindPixmapProc proc) { priv->bindPixmap.push_back (proc); if (!priv->hasCompositing && CompositeScreen::get (screen)->registerPaintHandler (priv)) priv->hasCompositing = true; return priv->bindPixmap.size () - 1; } void GLScreen::unregisterBindPixmap (GLTexture::BindPixmapHandle hnd) { bool hasBP = false; priv->bindPixmap[hnd].clear (); for (unsigned int i = 0; i < priv->bindPixmap.size (); i++) if (!priv->bindPixmap[i].empty ()) hasBP = true; if (!hasBP && priv->hasCompositing) { CompositeScreen::get (screen)->unregisterPaintHandler (); priv->hasCompositing = false; } } GLFramebufferObject * GLScreen::fbo () { return priv->scratchFbo.get (); } GLTexture * GLScreen::defaultIcon () { CompIcon *i = screen->defaultIcon (); CompSize size; if (!i) return NULL; if (!i->width () || !i->height ()) return NULL; if (priv->defaultIcon.icon == i) return priv->defaultIcon.textures[0]; priv->defaultIcon.textures = GLTexture::imageBufferToTexture ((char *) i->data (), *i); if (priv->defaultIcon.textures.size () == 1) priv->defaultIcon.icon = i; else { priv->defaultIcon.icon = NULL; priv->defaultIcon.textures.clear (); } return priv->defaultIcon.textures[0]; } void GLScreen::resetRasterPos () { #ifndef USE_GLES glRasterPos2f (0, 0); #endif priv->rasterPos.setX (0); priv->rasterPos.setY (0); } ./plugins/opengl/src/program.cpp0000644000004100000410000001502713246301623017157 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #include #include #include class PrivateProgram { public: GLuint program; bool valid; }; void printShaderInfoLog (GLuint shader) { GLint length = 0; GLint chars = 0; (*GL::getShaderiv) (shader, GL::INFO_LOG_LENGTH, &length); if (length > 0) { GLchar *infoLog; infoLog = new GLchar[length]; (*GL::getShaderInfoLog) (shader, length, &chars, infoLog); std::cout << infoLog << std::endl; delete[] infoLog; } } void printProgramInfoLog(GLuint program) { GLint length = 0; GLint chars = 0; (*GL::getProgramiv) (program, GL::INFO_LOG_LENGTH, &length); if (length > 0) { GLchar *infoLog; infoLog = new GLchar[length]; (*GL::getProgramInfoLog) (program, length, &chars, infoLog); std::cout << infoLog << std::endl; delete[] infoLog; } } static bool compileShader (GLuint *shader, GLenum type, const CompString &source) { const GLchar *data; GLint status; data = (GLchar *)source.c_str (); *shader = (*GL::createShader) (type); (*GL::shaderSource) (*shader, 1, &data, NULL); (*GL::compileShader) (*shader); (*GL::getShaderiv) (*shader, GL::COMPILE_STATUS, &status); return (status == GL_TRUE); } GLProgram::GLProgram (const CompString &vertexShader, const CompString &fragmentShader) : priv (new PrivateProgram ()) { GLuint vertex, fragment; GLint status; priv->valid = false; priv->program = (*GL::createProgram) (); if (!compileShader (&vertex, GL::VERTEX_SHADER, vertexShader)) { printShaderInfoLog (vertex); std::cout << vertexShader << std::endl << std::endl; return; } if (!compileShader (&fragment, GL::FRAGMENT_SHADER, fragmentShader)) { printShaderInfoLog (fragment); std::cout << fragmentShader << std::endl << std::endl; return; } (*GL::attachShader) (priv->program, vertex); (*GL::attachShader) (priv->program, fragment); (*GL::linkProgram) (priv->program); (*GL::validateProgram) (priv->program); (*GL::getProgramiv) (priv->program, GL::LINK_STATUS, &status); if (status == GL_FALSE) { printProgramInfoLog (priv->program); return; } (*GL::deleteShader) (vertex); (*GL::deleteShader) (fragment); priv->valid = true; } GLProgram::~GLProgram () { (*GL::deleteProgram) (priv->program); delete priv; } bool GLProgram::valid () { return priv->valid; } void GLProgram::bind () { (*GL::useProgram) (priv->program); } void GLProgram::unbind () { (*GL::useProgram) (0); } bool GLProgram::setUniform (const char *name, GLfloat value) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform1f) (location, value); return true; } bool GLProgram::setUniform (const char *name, GLint value) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform1i) (location, value); return true; } bool GLProgram::setUniform (const char *name, const GLMatrix &value) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniformMatrix4fv) (location, 1, GL_FALSE, value.getMatrix ()); return true; } bool GLProgram::setUniform2f (const char *name, GLfloat x, GLfloat y) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform2f) (location, x, y); return true; } bool GLProgram::setUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform3f) (location, x, y, z); return true; } bool GLProgram::setUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform4f) (location, x, y, z, w); return true; } bool GLProgram::setUniform2i (const char *name, GLint x, GLint y) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform2i) (location, x, y); return true; } bool GLProgram::setUniform3i (const char *name, GLint x, GLint y, GLint z) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform3i) (location, x, y, z); return true; } bool GLProgram::setUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w) { GLint location = (*GL::getUniformLocation) (priv->program, name); if (location == -1) return false; (*GL::uniform4i) (location, x, y, z, w); return true; } GLuint GLProgram::attributeLocation (const char *name) { return (*GL::getAttribLocation) (priv->program, name); } ./plugins/opengl/src/paint.cpp0000644000004100000410000011376613246301623016634 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright © 2011 Linaro, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Travis Watkins */ #include "privates.h" #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include "privates.h" #include "fsregion/fsregion.h" #define DEG2RAD (M_PI / 180.0f) using namespace compiz::opengl; GLScreenPaintAttrib defaultScreenPaintAttrib = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -DEFAULT_Z_CAMERA }; GLWindowPaintAttrib GLWindow::defaultPaintAttrib = { OPAQUE, BRIGHT, COLOR, 1.0f, 1.0f, 0.0f, 0.0f }; void GLScreen::glApplyTransform (const GLScreenPaintAttrib &sAttrib, CompOutput *output, GLMatrix *transform) { WRAPABLE_HND_FUNCTN (glApplyTransform, sAttrib, output, transform) transform->translate (sAttrib.xTranslate, sAttrib.yTranslate, sAttrib.zTranslate + sAttrib.zCamera); transform->rotate (sAttrib.xRotate, 0.0f, 1.0f, 0.0f); transform->rotate (sAttrib.vRotate, cosf (sAttrib.xRotate * DEG2RAD), 0.0f, sinf (sAttrib.xRotate * DEG2RAD)); transform->rotate (sAttrib.yRotate, 0.0f, 1.0f, 0.0f); } void PrivateGLScreen::paintBackground (const GLMatrix &transform, const CompRegion ®ion, bool transformed) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[18]; GLushort colorData[4]; BoxPtr pBox = const_cast (region.handle ())->rects; int n, nBox = const_cast (region.handle ())->numRects; if (!nBox) return; if (screen->opaqueDesktopWindowCount ()) { if (!backgroundTextures.empty ()) { backgroundTextures.clear (); } backgroundLoaded = false; return; } else { if (!backgroundLoaded) updateScreenBackground (); backgroundLoaded = true; } if (backgroundTextures.empty ()) { streamingBuffer->begin (GL_TRIANGLES); n = nBox; while (n--) { vertexData[0] = pBox->x1; vertexData[1] = pBox->y1; vertexData[2] = 0.0f; vertexData[3] = pBox->x1; vertexData[4] = pBox->y2; vertexData[5] = 0.0f; vertexData[6] = pBox->x2; vertexData[7] = pBox->y1; vertexData[8] = 0.0f; vertexData[9] = pBox->x1; vertexData[10] = pBox->y2; vertexData[11] = 0.0f; vertexData[12] = pBox->x2; vertexData[13] = pBox->y2; vertexData[14] = 0.0f; vertexData[15] = pBox->x2; vertexData[16] = pBox->y1; vertexData[17] = 0.0f; streamingBuffer->addVertices (6, vertexData); pBox++; } colorData[0] = colorData[1] = colorData[2] = 0; colorData[3] = std::numeric_limits ::max (); streamingBuffer->addColors (1, colorData); streamingBuffer->end (); streamingBuffer->render (transform); } else { n = nBox; for (unsigned int i = 0; i < backgroundTextures.size (); i++) { GLfloat textureData[12]; GLTexture *bg = backgroundTextures[i]; CompRegion r = region & *bg; pBox = const_cast (r.handle ())->rects; nBox = const_cast (r.handle ())->numRects; n = nBox; streamingBuffer->begin (GL_TRIANGLES); while (n--) { GLfloat tx1 = COMP_TEX_COORD_X (bg->matrix (), pBox->x1); GLfloat tx2 = COMP_TEX_COORD_X (bg->matrix (), pBox->x2); GLfloat ty1 = COMP_TEX_COORD_Y (bg->matrix (), pBox->y1); GLfloat ty2 = COMP_TEX_COORD_Y (bg->matrix (), pBox->y2); vertexData[0] = pBox->x1; vertexData[1] = pBox->y1; vertexData[2] = 0.0f; vertexData[3] = pBox->x1; vertexData[4] = pBox->y2; vertexData[5] = 0.0f; vertexData[6] = pBox->x2; vertexData[7] = pBox->y1; vertexData[8] = 0.0f; vertexData[9] = pBox->x1; vertexData[10] = pBox->y2; vertexData[11] = 0.0f; vertexData[12] = pBox->x2; vertexData[13] = pBox->y2; vertexData[14] = 0.0f; vertexData[15] = pBox->x2; vertexData[16] = pBox->y1; vertexData[17] = 0.0f; textureData[0] = tx1; textureData[1] = ty1; textureData[2] = tx1; textureData[3] = ty2; textureData[4] = tx2; textureData[5] = ty1; textureData[6] = tx1; textureData[7] = ty2; textureData[8] = tx2; textureData[9] = ty2; textureData[10] = tx2; textureData[11] = ty1; streamingBuffer->addVertices (6, vertexData); streamingBuffer->addTexCoords (0, 6, textureData); pBox++; } streamingBuffer->end (); if (bg->name ()) { if (transformed) bg->enable (GLTexture::Good); else bg->enable (GLTexture::Fast); streamingBuffer->render (transform); bg->disable (); } } } } /* This function currently always performs occlusion detection to minimize paint regions. OpenGL precision requirements are no good enough to guarantee that the results from using occlusion detection is the same as without. It's likely not possible to see any difference with most hardware but occlusion detection in the transformed screen case should be made optional for those who do see a difference. */ void PrivateGLScreen::paintOutputRegion (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { CompRegion tmpRegion (region); CompWindow *w; GLWindow *gw; int windowMask, odMask; bool status, unredirectFS; bool withOffset = false; GLMatrix vTransform; CompPoint offXY; std::set unredirected; CompWindowList pl; CompWindowList::reverse_iterator rit; unredirectFS = CompositeScreen::get (screen)-> getOption ("unredirect_fullscreen_windows")->value ().b (); const CompMatch &unredirectable = CompositeScreen::get (screen)-> getOption ("unredirect_match")->value ().match (); const CompString &blacklist = optionGetUnredirectDriverBlacklist (); bool blacklisted = driverIsBlacklisted (blacklist.c_str ()); if (mask & PAINT_SCREEN_TRANSFORMED_MASK) { windowMask = PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; } else { windowMask = 0; } /* * We need to COPY the PaintList for now because there seem to be some * odd cases where the master list might change during the below loops. * (LP: #958540) */ pl = cScreen->getWindowPaintList (); if (!(mask & PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK)) { FullscreenRegion fs (*output, screen->region ()); /* detect occlusions */ for (rit = pl.rbegin (); rit != pl.rend (); ++rit) { w = (*rit); gw = GLWindow::get (w); if (w->destroyed ()) continue; if (!w->shaded ()) { /* Non-damaged windows don't have valid pixmap * contents and we aren't displaying them yet * so don't factor them into occlusion detection */ if (!gw->priv->cWindow->damaged ()) { gw->priv->clip = region; continue; } if (!w->isViewable ()) continue; } /* copy region */ gw->priv->clip = tmpRegion; odMask = PAINT_WINDOW_OCCLUSION_DETECTION_MASK; if ((cScreen->windowPaintOffset ().x () != 0 || cScreen->windowPaintOffset ().y () != 0) && !w->onAllViewports ()) { withOffset = true; offXY = w->getMovementForOffset (cScreen->windowPaintOffset ()); vTransform = transform; vTransform.translate (offXY.x (), offXY.y (), 0); gw->priv->clip.translate (-offXY.x (), -offXY. y ()); odMask |= PAINT_WINDOW_WITH_OFFSET_MASK; status = gw->glPaint (gw->paintAttrib (), vTransform, tmpRegion, odMask); } else { withOffset = false; status = gw->glPaint (gw->paintAttrib (), transform, tmpRegion, odMask); } if (status) { if (withOffset) { tmpRegion -= w->region ().translated (offXY); } else tmpRegion -= w->region (); } FullscreenRegion::WinFlags flags = 0; if (w->type () & CompWindowTypeDesktopMask) flags |= FullscreenRegion::Desktop; if (w->alpha ()) flags |= FullscreenRegion::Alpha; /* Anything which was not occlusion detected is not a suitable * candidate for unredirection either */ if (!status) flags |= FullscreenRegion::NoOcclusionDetection; CompositeWindow *cw = CompositeWindow::get (w); /* * Windows with alpha channels can partially occlude windows * beneath them and so neither should be unredirected in that case. * * Performance note: unredirectable.evaluate is SLOW because it * involves regex matching. Too slow to do on every window for * every frame. So we only call it if a window is redirected AND * potentially needs unredirecting. This means changes to * unredirect_match while a window is unredirected already may not * take effect until it is un-fullscreened again. But that's better * than the high price of regex matching on every frame. */ if (unredirectFS && !blacklisted && !(mask & PAINT_SCREEN_TRANSFORMED_MASK) && !(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK) && fs.isCoveredBy (w->region (), flags) && (!cw->redirected () || unredirectable.evaluate (w))) { unredirected.insert (w); } else { if (!cw->redirected ()) { if (fs.allowRedirection (w->region ())) { // 1. GLWindow::release to force gw->priv->needsRebind gw->release (); // 2. GLWindow::bind, which redirects the window, // rebinds the pixmap, and then rebinds the pixmap // to a texture. gw->bind (); // 3. Your window is now redirected again with the // latest pixmap contents. } else { unredirected.insert (w); } } } } } /* Unredirect any redirected fullscreen windows */ foreach (CompWindow *fullscreenWindow, unredirected) CompositeWindow::get (fullscreenWindow)->unredirect (); if (!(mask & PAINT_SCREEN_NO_BACKGROUND_MASK)) paintBackground (transform, tmpRegion, (mask & PAINT_SCREEN_TRANSFORMED_MASK)); /* paint all windows from bottom to top */ foreach (w, pl) { if (w->destroyed ()) continue; gw = GLWindow::get (w); /* Release any queued ConfigureWindow requests now */ gw->priv->configureLock->release (); if (unredirected.find (w) != unredirected.end ()) continue; if (!w->shaded ()) { if (!w->isViewable ()) continue; } const CompRegion &clip = (!(mask & PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK)) ? gw->clip () : region; if ((cScreen->windowPaintOffset ().x () != 0 || cScreen->windowPaintOffset ().y () != 0) && !w->onAllViewports ()) { offXY = w->getMovementForOffset (cScreen->windowPaintOffset ()); vTransform = transform; vTransform.translate (offXY.x (), offXY.y (), 0); gw->glPaint (gw->paintAttrib (), vTransform, clip, windowMask | PAINT_WINDOW_WITH_OFFSET_MASK); } else { gw->glPaint (gw->paintAttrib (), transform, clip, windowMask); } } } // transformIsSimple tells you if it's simple enough to use scissoring static bool transformIsSimple (const GLMatrix &transform) { const float *t = transform.getMatrix (); return // t[0] can be anything (x scale) t[1] == 0.0f && t[2] == 0.0f && t[3] == 0.0f && t[4] == 0.0f && // t[5] can be anything (y scale) t[6] == 0.0f && t[7] == 0.0f && t[8] == 0.0f && t[9] == 0.0f && // t[10] can be anything (z scale) t[11] == 0.0f && // t[12]..t[14] can be anything (translation) t[15] == 1.0f; } void GLScreen::glEnableOutputClipping (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output) { WRAPABLE_HND_FUNCTN (glEnableOutputClipping, transform, region, output) // Bottom-left corner of the output: const GLint x = output->x1 (); const GLint y = screen->height () - output->y2 (); const GLsizei w = output->width (); const GLsizei h = output->height (); // Transformed (only scale and translation is supported!) const float *t = transform.getMatrix (); const GLfloat scalex = t[0], scaley = t[5], transx = t[12], transy = t[13]; const GLfloat centrex = x + w / 2.0f; const GLfloat centrey = y + h / 2.0f; GLfloat scaledw = fabs (w * scalex); GLfloat scaledh = fabs (h * scaley); GLfloat tx = centrex - (scaledw / 2.0f) + transx * w; GLfloat ty = centrey - (scaledh / 2.0f) + transy * h; glScissor (tx, ty, roundf (scaledw), roundf (scaledh)); glEnable (GL_SCISSOR_TEST); } void GLScreen::glDisableOutputClipping () { WRAPABLE_HND_FUNCTN (glDisableOutputClipping) glDisable (GL_SCISSOR_TEST); } void GLScreen::glBufferStencil (const GLMatrix &matrix, GLVertexBuffer &vertexBuffer, CompOutput *output) { WRAPABLE_HND_FUNCTN (glBufferStencil, matrix, vertexBuffer, output); GLfloat x = output->x (); GLfloat y = screen->height () - output->y2 (); GLfloat x2 = output->x () + output->width (); GLfloat y2 = screen->height () - output->y2 () + output->height (); GLfloat vertices[] = { x, y, 0, x, y2, 0, x2, y, 0, x2, y2, 0 }; GLushort colorData[] = { 0xffff, 0xffff, 0xffff, 0xffff }; vertexBuffer.begin (GL_TRIANGLE_STRIP); vertexBuffer.addVertices (4, vertices); vertexBuffer.addColors (1, colorData); vertexBuffer.end (); } #define CLIP_PLANE_MASK (PAINT_SCREEN_TRANSFORMED_MASK | \ PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK) void GLScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { WRAPABLE_HND_FUNCTN (glPaintTransformedOutput, sAttrib, transform, region, output, mask) GLMatrix sTransform = transform; if (mask & PAINT_SCREEN_CLEAR_MASK) clearTargetOutput (GL_COLOR_BUFFER_BIT); setLighting (true); glApplyTransform (sAttrib, output, &sTransform); if ((mask & CLIP_PLANE_MASK) == CLIP_PLANE_MASK) { if (transformIsSimple (sTransform)) { glEnableOutputClipping (sTransform, region, output); sTransform.toScreenSpace (output, -sAttrib.zTranslate); priv->paintOutputRegion (sTransform, region, output, mask); glDisableOutputClipping (); } else if ( (GL::fboEnabled && GL::fboStencilSupported) || GL::stencilBuffer ) { sTransform.toScreenSpace (output, -sAttrib.zTranslate); glClearStencil (0); glClear (GL_STENCIL_BUFFER_BIT); glEnable (GL_STENCIL_TEST); glStencilFunc (GL_ALWAYS, 1, 1); glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); GLVertexBuffer vb; vb.setAutoProgram (priv->autoProgram); glBufferStencil (sTransform, vb, output); glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glStencilMask (1); vb.render (sTransform); glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc (GL_EQUAL, 1, 1); glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); priv->paintOutputRegion (sTransform, region, output, mask); glDisable (GL_STENCIL_TEST); } else { // This won't look quite right but should never happen. // Give a warning? sTransform.toScreenSpace (output, -sAttrib.zTranslate); priv->paintOutputRegion (sTransform, region, output, mask); } } else { sTransform.toScreenSpace (output, -sAttrib.zTranslate); priv->paintOutputRegion (sTransform, region, output, mask); } } bool GLScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { WRAPABLE_HND_FUNCTN_RETURN (bool, glPaintOutput, sAttrib, transform, region, output, mask) GLMatrix sTransform = transform; if (mask & PAINT_SCREEN_REGION_MASK) { if (mask & PAINT_SCREEN_TRANSFORMED_MASK) { if (mask & PAINT_SCREEN_FULL_MASK) { CompRegionRef region (output->region ()); CompositeScreen *cs = priv->cScreen; glPaintTransformedOutput (sAttrib, sTransform, region, output, mask); cs->recordDamageOnCurrentFrame (region); return true; } return false; } setLighting (false); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); /* * Sometimes region might be empty but we still need to force the * repaint. This can happen when a fullscreen window is unredirected, * and damageScreen is called. CompositeScreen::handlePaintTimeout * then subtracts the whole screen of damage because it's an overlay * and we're left with an empty damage region. * Even when this happens we may want to force the repaint if * windows are getting transformed (and so the unredirected window * needs to be redirected again). */ if (!region.isEmpty () || (mask & PAINT_SCREEN_FULL_MASK) || (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK)) priv->paintOutputRegion (sTransform, region, output, mask); return true; } else if (mask & PAINT_SCREEN_FULL_MASK) { CompRegionRef region (output->region ()); CompositeScreen *cs = priv->cScreen; glPaintTransformedOutput (sAttrib, sTransform, region, output, mask); cs->recordDamageOnCurrentFrame (region); return true; } else { return false; } } bool GLScreen::glPaintCompositedOutputRequired () { WRAPABLE_HND_FUNCTN_RETURN (bool, glPaintCompositedOutputRequired); return false; } void GLScreen::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) { WRAPABLE_HND_FUNCTN (glPaintCompositedOutput, region, fbo, mask) GLMatrix sTransform; const GLTexture::Matrix & texmatrix = fbo->tex ()->matrix (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLES); if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { GLfloat tx1 = COMP_TEX_COORD_X (texmatrix, 0.0f); GLfloat tx2 = COMP_TEX_COORD_X (texmatrix, screen->width ()); GLfloat ty1 = 1.0 - COMP_TEX_COORD_Y (texmatrix, 0.0f); GLfloat ty2 = 1.0 - COMP_TEX_COORD_Y (texmatrix, screen->height ()); const GLfloat vertexData[] = { 0.0f, 0.0f, 0.0f, 0.0f, (float)screen->height (), 0.0f, (float)screen->width (), 0.0f, 0.0f, 0.0f, (float)screen->height (), 0.0f, (float)screen->width (), (float)screen->height (), 0.0f, (float)screen->width (), 0.0f, 0.0f, }; const GLfloat textureData[] = { tx1, ty1, tx1, ty2, tx2, ty1, tx1, ty2, tx2, ty2, tx2, ty1, }; streamingBuffer->addVertices (6, &vertexData[0]); streamingBuffer->addTexCoords (0, 6, &textureData[0]); } else { BoxPtr pBox = const_cast (region.handle ())->rects; int nBox = const_cast (region.handle ())->numRects; while (nBox--) { GLfloat tx1 = COMP_TEX_COORD_X (texmatrix, pBox->x1); GLfloat tx2 = COMP_TEX_COORD_X (texmatrix, pBox->x2); GLfloat ty1 = 1.0 - COMP_TEX_COORD_Y (texmatrix, pBox->y1); GLfloat ty2 = 1.0 - COMP_TEX_COORD_Y (texmatrix, pBox->y2); const GLfloat vertexData[] = { (float)pBox->x1, (float)pBox->y1, 0.0f, (float)pBox->x1, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y1, 0.0f, (float)pBox->x1, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y1, 0.0f, }; const GLfloat textureData[] = { tx1, ty1, tx1, ty2, tx2, ty1, tx1, ty2, tx2, ty2, tx2, ty1, }; streamingBuffer->addVertices (6, &vertexData[0]); streamingBuffer->addTexCoords (0, 6, &textureData[0]); pBox++; } } streamingBuffer->end (); fbo->tex ()->enable (GLTexture::Fast); sTransform.toScreenSpace (&screen->fullscreenOutput (), -DEFAULT_Z_CAMERA); streamingBuffer->render (sTransform); fbo->tex ()->disable (); } static void addSingleQuad (GLVertexBuffer *vertexBuffer, const GLTexture::MatrixList &matrix, unsigned int nMatrix, int x1, int y1, int x2, int y2, bool rect) { GLfloat vertexData[18] = { (float)x1, (float)y1, 0.0, (float)x1, (float)y2, 0.0, (float)x2, (float)y1, 0.0, (float)x2, (float)y1, 0.0, (float)x1, (float)y2, 0.0, (float)x2, (float)y2, 0.0 }; vertexBuffer->addVertices (6, vertexData); if (rect) { unsigned int it; for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x1); data[1] = COMP_TEX_COORD_Y (mat, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x1); data[1] = COMP_TEX_COORD_Y (mat, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x2); data[1] = COMP_TEX_COORD_Y (mat, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x2); data[1] = COMP_TEX_COORD_Y (mat, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x1); data[1] = COMP_TEX_COORD_Y (mat, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_X (mat, x2); data[1] = COMP_TEX_COORD_Y (mat, y2); vertexBuffer->addTexCoords (it, 1, data); } } else { unsigned int it; for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x1, y1); data[1] = COMP_TEX_COORD_YX (mat, x1, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x1, y2); data[1] = COMP_TEX_COORD_YX (mat, x1, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x2, y1); data[1] = COMP_TEX_COORD_YX (mat, x2, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x2, y1); data[1] = COMP_TEX_COORD_YX (mat, x2, y1); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x1, y2); data[1] = COMP_TEX_COORD_YX (mat, x1, y2); vertexBuffer->addTexCoords (it, 1, data); } for (it = 0; it < nMatrix; it++) { GLfloat data[2]; const GLTexture::Matrix &mat = matrix[it]; data[0] = COMP_TEX_COORD_XY (mat, x2, y2); data[1] = COMP_TEX_COORD_YX (mat, x2, y2); vertexBuffer->addTexCoords (it, 1, data); } } } static void addQuads (GLVertexBuffer *vertexBuffer, const GLTexture::MatrixList &matrix, unsigned int nMatrix, int x1, int y1, int x2, int y2, bool rect, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (maxGridWidth == 0 || maxGridHeight == 0) return; int nQuadsX = (maxGridWidth == MAXSHORT) ? 1 : 1 + (x2 - x1 - 1) / (int) maxGridWidth; // ceil. division int nQuadsY = (maxGridHeight == MAXSHORT) ? 1 : 1 + (y2 - y1 - 1) / (int) maxGridHeight; if (nQuadsX == 1 && nQuadsY == 1) { addSingleQuad (vertexBuffer, matrix, nMatrix, x1, y1, x2, y2, rect); } else { int quadWidth = 1 + (x2 - x1 - 1) / nQuadsX; // ceil. division int quadHeight = 1 + (y2 - y1 - 1) / nQuadsY; int nx1, ny1, nx2, ny2; for (ny1 = y1; ny1 < y2; ny1 = ny2) { ny2 = MIN (ny1 + (int) quadHeight, y2); for (nx1 = x1; nx1 < x2; nx1 = nx2) { nx2 = MIN (nx1 + (int) quadWidth, x2); addSingleQuad (vertexBuffer, matrix, nMatrix, nx1, ny1, nx2, ny2, rect); } } } } void GLWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { WRAPABLE_HND_FUNCTN (glAddGeometry, matrix, region, clip) BoxRec full; int nMatrix = matrix.size (); full = clip.handle ()->extents; if (region.handle ()->extents.x1 > full.x1) full.x1 = region.handle ()->extents.x1; if (region.handle ()->extents.y1 > full.y1) full.y1 = region.handle ()->extents.y1; if (region.handle ()->extents.x2 < full.x2) full.x2 = region.handle ()->extents.x2; if (region.handle ()->extents.y2 < full.y2) full.y2 = region.handle ()->extents.y2; if (full.x1 < full.x2 && full.y1 < full.y2) { BoxPtr pBox; int nBox; BoxPtr pClip; int nClip; BoxRec cbox; int it, x1, y1, x2, y2; bool rect = true; for (it = 0; it < nMatrix; it++) { if (matrix[it].xy != 0.0f || matrix[it].yx != 0.0f) { rect = false; break; } } pBox = const_cast (region.handle ())->rects; nBox = const_cast (region.handle ())->numRects; while (nBox--) { x1 = pBox->x1; y1 = pBox->y1; x2 = pBox->x2; y2 = pBox->y2; pBox++; if (x1 < full.x1) x1 = full.x1; if (y1 < full.y1) y1 = full.y1; if (x2 > full.x2) x2 = full.x2; if (y2 > full.y2) y2 = full.y2; if (x1 < x2 && y1 < y2) { nClip = const_cast (clip.handle ())->numRects; if (nClip == 1) { addQuads (priv->vertexBuffer, matrix, nMatrix, x1, y1, x2, y2, rect, maxGridWidth, maxGridHeight); } else { pClip = const_cast (clip.handle ())->rects; while (nClip--) { cbox = *pClip; pClip++; if (cbox.x1 < x1) cbox.x1 = x1; if (cbox.y1 < y1) cbox.y1 = y1; if (cbox.x2 > x2) cbox.x2 = x2; if (cbox.y2 > y2) cbox.y2 = y2; if (cbox.x1 < cbox.x2 && cbox.y1 < cbox.y2) { addQuads (priv->vertexBuffer, matrix, nMatrix, cbox.x1, cbox.y1, cbox.x2, cbox.y2, rect, maxGridWidth, maxGridHeight); } } } } } } } #ifndef USE_GLES static void enableLegacyOBSAndRender (GLScreen *gs, GLWindow *w, GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, GLTexture::Filter filter, unsigned int mask) { // XXX: This codepath only works with !GL::vbo so that's the only case // where you'll find it's called. At least for now. if (GL::canDoSaturated && attrib.saturation != COLOR) { GLfloat constant[4]; texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PRIMARY_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glColor4f (1.0f, 1.0f, 1.0f, 0.5f); GL::activeTexture (GL_TEXTURE1_ARB); texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); if (GL::canDoSlightlySaturated && attrib.saturation > 0) { glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT; constant[3] = 1.0; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); GL::activeTexture (GL_TEXTURE2_ARB); texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); constant[3] = attrib.saturation / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); if (attrib.opacity < OPAQUE || attrib.brightness != BRIGHT) { GL::activeTexture (GL_TEXTURE3_ARB); texture->enable (filter); constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); w->vertexBuffer ()->render (transform, attrib); texture->disable (); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL::activeTexture (GL_TEXTURE2_ARB); } else { w->vertexBuffer ()->render (transform, attrib); } texture->disable (); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL::activeTexture (GL_TEXTURE1_ARB); } else { glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT * constant[0]; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT * constant[1]; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT * constant[2]; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); w->vertexBuffer ()->render (transform, attrib); } texture->disable (); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL::activeTexture (GL_TEXTURE0_ARB); texture->disable (); glColor4usv (defaultColor); gs->setTexEnvMode (GL_REPLACE); } else { texture->enable (filter); if (mask & PAINT_WINDOW_BLEND_MASK) { if (attrib.opacity != OPAQUE || attrib.brightness != BRIGHT) { GLushort color; color = (attrib.opacity * attrib.brightness) >> 16; gs->setTexEnvMode (GL_MODULATE); glColor4us (color, color, color, attrib.opacity); w->vertexBuffer ()->render (transform, attrib); glColor4usv (defaultColor); gs->setTexEnvMode (GL_REPLACE); } else { w->vertexBuffer ()->render (transform, attrib); } } else if (attrib.brightness != BRIGHT) { gs->setTexEnvMode (GL_MODULATE); glColor4us (attrib.brightness, attrib.brightness, attrib.brightness, BRIGHT); w->vertexBuffer ()->render (transform, attrib); glColor4usv (defaultColor); gs->setTexEnvMode (GL_REPLACE); } else { w->vertexBuffer ()->render (transform, attrib); } texture->disable (); } } #endif void GLWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { WRAPABLE_HND_FUNCTN (glDrawTexture, texture, transform, attrib, mask) GLTexture::Filter filter; if (mask & PAINT_WINDOW_BLEND_MASK) glEnable (GL_BLEND); if (mask & (PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)) filter = priv->gScreen->filter (SCREEN_TRANS_FILTER); else filter = priv->gScreen->filter (NOTHING_TRANS_FILTER); glActiveTexture(GL_TEXTURE0); texture->enable (filter); #ifdef USE_GLES priv->vertexBuffer->render (transform, attrib); #else if (!GLVertexBuffer::enabled ()) enableLegacyOBSAndRender (priv->gScreen, this, texture, transform, attrib, filter, mask); else priv->vertexBuffer->render (transform, attrib); #endif clearShaders (); texture->disable (); if (mask & PAINT_WINDOW_BLEND_MASK) glDisable (GL_BLEND); } bool GLWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { WRAPABLE_HND_FUNCTN_RETURN (bool, glDraw, transform, attrib, region, mask) const CompRegion ® = (mask & PAINT_WINDOW_TRANSFORMED_MASK) ? CompRegion::infinite () : region; if (reg.isEmpty ()) return true; if (!priv->window->isViewable () || !priv->cWindow->damaged ()) return true; if (textures ().empty () && !bind ()) return false; if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) mask |= PAINT_WINDOW_BLEND_MASK; GLTexture::MatrixList ml (1); // // Don't assume all plugins leave TexEnvMode in a clean state (GL_REPLACE). // Sometimes plugins forget to clean up correctly, so make sure we're // in the correct mode or else windows could be rendered incorrectly // like in LP: #877920. // priv->gScreen->setTexEnvMode (GL_REPLACE); if (priv->updateState & PrivateGLWindow::UpdateMatrix) priv->setWindowMatrix (); if (priv->updateState & PrivateGLWindow::UpdateRegion) priv->updateWindowRegions (); for (unsigned int i = 0; i < priv->textures.size (); i++) { ml[0] = priv->matrices[i]; priv->vertexBuffer->begin (); glAddGeometry (ml, priv->regions[i], reg); if (priv->vertexBuffer->end ()) glDrawTexture (priv->textures[i], transform, attrib, mask); } return true; } void GLWindow::glTransformationComplete (const GLMatrix &matrix, const CompRegion ®, unsigned int mask) { WRAPABLE_HND_FUNCTN (glTransformationComplete, matrix, reg, mask); } bool GLWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { WRAPABLE_HND_FUNCTN_RETURN (bool, glPaint, attrib, transform, region, mask) bool status; priv->lastPaint = attrib; if (priv->window->alpha () || attrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; priv->lastMask = mask; glTransformationComplete (transform, region, mask); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) { if (mask & PAINT_WINDOW_TRANSFORMED_MASK) return false; if (mask & PAINT_WINDOW_NO_CORE_INSTANCE_MASK) return false; if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) return false; if (priv->window->shaded ()) return false; return true; } if (mask & PAINT_WINDOW_NO_CORE_INSTANCE_MASK) return true; status = glDraw (transform, attrib, region, mask); return status; } ./plugins/opengl/src/texture.cpp0000644000004100000410000004771613246301623017222 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright 2015 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "privates.h" #include "glx-tfp-bind.h" namespace cgl = compiz::opengl; #ifdef USE_GLES std::map boundPixmapTex; #else std::map boundPixmapTex; #endif static const GLTexture::Matrix _identity_matrix = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; GLTexture::List::List () : std::vector (0) { } GLTexture::List::List (unsigned int size) : std::vector (size) { for (unsigned int i = 0; i < size; i++) at (i) = NULL; } GLTexture::List::List (const GLTexture::List &c) : std::vector (c.size ()) { for (unsigned int i = 0; i < c.size (); i++) { at (i) = c[i]; GLTexture::incRef (c[i]); } } GLTexture::List::~List () { foreach (GLTexture *t, *this) if (t) GLTexture::decRef (t); } GLTexture::List & GLTexture::List::operator= (const GLTexture::List &c) { this->clear (); resize (c.size ()); for (unsigned int i = 0; i < c.size (); i++) { at (i) = c[i]; GLTexture::incRef (c[i]); } return *this; } void GLTexture::List::clear () { foreach (GLTexture *t, *this) if (t) GLTexture::decRef (t); std::vector ::clear (); } GLTexture::GLTexture () : CompRect (0, 0, 0, 0), priv (new PrivateTexture (this, GL_TEXTURE_2D, _identity_matrix, true)) { } GLTexture::GLTexture (int width, int height, GLenum target, Matrix const& matrix, bool mipmap) : CompRect (0, 0, width, height), priv (new PrivateTexture (this, target, matrix, mipmap)) { } GLTexture::~GLTexture () { if (priv) delete priv; } PrivateTexture::PrivateTexture (GLTexture* texture, GLenum target, GLTexture::Matrix const& matrix, bool mipmap) : texture (texture), name (0), target (target), filter (GL_NEAREST), wrap (GL_CLAMP_TO_EDGE), matrix (matrix), mipmap (mipmap), mipmapSupport (false), initial (true), refCount (1) { glGenTextures (1, &name); } PrivateTexture::~PrivateTexture () { if (name) { glDeleteTextures (1, &name); } } GLuint GLTexture::name () const { return priv->name; } GLenum GLTexture::target () const { return priv->target; } const GLTexture::Matrix & GLTexture::matrix () const { return priv->matrix; } bool GLTexture::mipmap () const { return priv->mipmap && priv->mipmapSupport; } GLenum GLTexture::filter () const { return priv->filter; } void GLTexture::enable (GLTexture::Filter filter) { GLScreen *gs = GLScreen::get (screen); #ifndef USE_GLES glEnable (priv->target); #endif glBindTexture (priv->target, priv->name); if (filter == Fast) { if (priv->filter != GL_NEAREST) { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); priv->filter = GL_NEAREST; } } else if (priv->filter != gs->textureFilter ()) { if (gs->textureFilter () == GL_LINEAR_MIPMAP_LINEAR) { if (mipmap ()) { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); if (priv->filter != GL_LINEAR) glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); priv->filter = GL_LINEAR_MIPMAP_LINEAR; } else if (priv->filter != GL_LINEAR) { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); priv->filter = GL_LINEAR; } } else { glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, gs->textureFilter ()); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, gs->textureFilter ()); priv->filter = gs->textureFilter (); } } if (priv->filter == GL_LINEAR_MIPMAP_LINEAR) { if (priv->initial) { GL::generateMipmap (priv->target); priv->initial = false; } } } void GLTexture::disable () { glBindTexture (priv->target, 0); #ifndef USE_GLES glDisable (priv->target); #endif } void GLTexture::setData (GLenum target, Matrix const& m, bool mipmap) { priv->target = target; priv->matrix = m; priv->mipmapSupport = mipmap; } void GLTexture::setMipmap (bool enable) { priv->mipmap = enable; } void GLTexture::setFilter (GLenum filter) { glBindTexture (priv->target, priv->name); priv->filter = filter; glTexParameteri (priv->target, GL_TEXTURE_MIN_FILTER, filter); glTexParameteri (priv->target, GL_TEXTURE_MAG_FILTER, filter); glBindTexture (priv->target, 0); } void GLTexture::setWrap (GLenum wrap) { glBindTexture (priv->target, priv->name); priv->wrap = GL_CLAMP_TO_EDGE; glTexParameteri (priv->target, GL_TEXTURE_WRAP_S, wrap); glTexParameteri (priv->target, GL_TEXTURE_WRAP_T, wrap); glBindTexture (priv->target, 0); } GLTexture::List PrivateTexture::loadImageData (const char *image, unsigned int width, unsigned int height, GLenum format, GLenum type) { /* TODO Add support for multiple textures */ if ((int) width > GL::maxTextureSize || (int) height > GL::maxTextureSize) return GLTexture::List (); GLTexture::List rv (1); GLTexture::Matrix matrix = _identity_matrix; GLint internalFormat; GLenum target; bool mipmap; bool pot = POWER_OF_TWO (width) && POWER_OF_TWO (height); #ifdef USE_GLES target = GL_TEXTURE_2D; matrix.xx = 1.0f / width; matrix.yy = 1.0f / height; matrix.y0 = 0.0f; mipmap = GL::textureNonPowerOfTwoMipmap || pot; #else if (GL::textureNonPowerOfTwo || pot) { target = GL_TEXTURE_2D; matrix.xx = 1.0f / width; matrix.yy = 1.0f / height; matrix.y0 = 0.0f; mipmap = GL::generateMipmap && (GL::textureNonPowerOfTwoMipmap || pot); } else { target = GL_TEXTURE_RECTANGLE_NV; matrix.xx = 1.0f; matrix.yy = 1.0f; matrix.y0 = 0.0f; mipmap = false; } #endif GLTexture* t = new GLTexture (width, height, target, matrix, mipmap); t->setFilter (GL_NEAREST); t->setWrap (GL_CLAMP_TO_EDGE); rv[0] = t; #ifdef USE_GLES // For GLES2 no format conversion is allowed, i.e., format must equal internalFormat internalFormat = format; #else internalFormat = GL_RGBA; #endif #ifndef USE_GLES CompOption *opt; opt = GLScreen::get (screen)->getOption ("texture_compression"); if (opt->value ().b () && GL::textureCompression) internalFormat = GL_COMPRESSED_RGBA_ARB; #endif glBindTexture (target, t->name ()); glTexImage2D (target, 0, internalFormat, width, height, 0, format, type, image); glBindTexture (target, 0); return rv; } GLTexture::List GLTexture::imageBufferToTexture (const char *image, CompSize size) { #if IMAGE_BYTE_ORDER == MSBFirst return PrivateTexture::loadImageData (image, size.width (), size.height (), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV); #else return PrivateTexture::loadImageData (image, size.width (), size.height (), GL_BGRA, GL_UNSIGNED_BYTE); #endif } GLTexture::List GLTexture::imageDataToTexture (const char *image, CompSize size, GLenum format, GLenum type) { return PrivateTexture::loadImageData (image, size.width (), size.height (), format, type); } GLTexture::List GLTexture::readImageToTexture (CompString &imageFileName, CompString &pluginName, CompSize &size) { void *image = NULL; if (!screen->readImageFromFile (imageFileName, pluginName, size, image) || !image) return GLTexture::List (); GLTexture::List rv = GLTexture::imageBufferToTexture ((char *)image, size); free (image); return rv; } void GLTexture::decRef (GLTexture *tex) { tex->priv->refCount--; if (tex->priv->refCount <= 0) delete tex; } void GLTexture::incRef (GLTexture *tex) { tex->priv->refCount++; } GLTexture::List GLTexture::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source) { if (!GL::textureFromPixmap) { compLogMessage("opengl", CompLogLevelError, "GL::textureFromPixmap is not supported."); } if (width <= 0 || height <= 0) { compLogMessage("opengl", CompLogLevelError, "Couldn't bind 0-sized pixmap to texture: " "the width and height arguments must be nonzero."); return GLTexture::List (); } if (width > GL::maxTextureSize || height > GL::maxTextureSize) { compLogMessage("opengl", CompLogLevelError, "Impossible to bind a pixmap bigger than %dx%d to texture.", GL::maxTextureSize, GL::maxTextureSize); return GLTexture::List (); } GLTexture::List rv; foreach (BindPixmapProc &proc, GLScreen::get (screen)->priv->bindPixmap) { if (!proc.empty ()) rv = proc (pixmap, width, height, depth, source); if (rv.size ()) return rv; } return GLTexture::List (); } #ifdef USE_GLES EglTexture::EglTexture (GLenum target, GLTexture::Matrix const& matrix, bool mipmap, int width, int height) : GLTexture (width, height, target, matrix, mipmap), damaged (true), damage (None), updateMipMap (true) { } EglTexture::~EglTexture () { GLuint temp = name (); glBindTexture (target (), name ()); glDeleteTextures (1, &temp); glBindTexture (target (), 0); boundPixmapTex.erase (damage); XDamageDestroy (screen->dpy (), damage); } GLTexture::List EglTexture::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, cgl::PixmapSource source) { GLTexture::List rv (1); EglTexture *tex = NULL; EGLImageKHR eglImage = NULL; GLenum texTarget = GL_TEXTURE_2D; GLTexture::Matrix matrix = _identity_matrix; bool mipmap = GL::textureNonPowerOfTwoMipmap || (POWER_OF_TWO (width) && POWER_OF_TWO (height)); const EGLint img_attribs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE }; eglImage = GL::createImage (eglGetDisplay (screen->dpy ()), EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, (EGLClientBuffer)pixmap, img_attribs); if (eglImage == EGL_NO_IMAGE_KHR) { compLogMessage ("core", CompLogLevelWarn, "eglCreateImageKHR failed"); return GLTexture::List (); } matrix.xx = 1.0f / width; matrix.yy = 1.0f / height; matrix.y0 = 0.0f; tex = new EglTexture (texTarget, matrix, mipmap, width, height); rv[0] = tex; glBindTexture (texTarget, tex->name ()); GL::eglImageTargetTexture (texTarget, (GLeglImageOES)eglImage); GL::destroyImage (eglGetDisplay (screen->dpy ()), eglImage); tex->setFilter (GL_NEAREST); tex->setWrap (GL_CLAMP_TO_EDGE); glBindTexture (texTarget, 0); tex->damage = XDamageCreate (screen->dpy (), pixmap, XDamageReportBoundingBox); boundPixmapTex[tex->damage] = tex; return rv; } void EglTexture::enable (GLTexture::Filter filter) { glBindTexture (target (), name ()); GLTexture::enable (filter); if (damaged) updateMipMap = true; if (this->filter () == GL_LINEAR_MIPMAP_LINEAR && updateMipMap) { GL::generateMipmap (target ()); updateMipMap = false; } damaged = false; } #else namespace { bool checkPixmapValidityGLX (Pixmap pixmap) { Window windowReturn; unsigned int uiReturn; int iReturn; if (!XGetGeometry (screen->dpy (), pixmap, &windowReturn, &iReturn, &iReturn, &uiReturn, &uiReturn, &uiReturn, &uiReturn)) return false; return true; } const cgl::WaitGLXFunc & waitGLXFunc () { static const cgl::WaitGLXFunc f (boost::bind (glXWaitX)); return f; } const cgl::PixmapCheckValidityFunc & checkPixmapValidityFunc () { static const cgl::PixmapCheckValidityFunc f (boost::bind (checkPixmapValidityGLX, _1)); return f; } const cgl::BindTexImageEXTFunc & bindTexImageEXT () { static int *attrib_list = NULL; static const cgl::BindTexImageEXTFunc f (boost::bind (GL::bindTexImage, screen->dpy (), _1, GLX_FRONT_LEFT_EXT, attrib_list)); return f; } } TfpTexture::TfpTexture (GLenum target, GLTexture::Matrix const& matrix, bool mipmap, Pixmap pixmap, int width, int height, Pixmap x11Pixmap, cgl::PixmapSource source) : GLTexture (width, height, target, matrix, mipmap), x11Pixmap (x11Pixmap), pixmap (pixmap), damaged (true), damage (None), updateMipMap (true), source (source) { } TfpTexture::~TfpTexture () { if (pixmap) { glEnable (target ()); glBindTexture (target (), name ()); releaseTexImage (); glBindTexture (target (), 0); glDisable (target ()); GL::destroyPixmap (screen->dpy (), pixmap); boundPixmapTex.erase (damage); XDamageDestroy (screen->dpy (), damage); } } bool TfpTexture::bindTexImage (const GLXPixmap &glxPixmap) { return compiz::opengl::bindTexImageGLX (screen->serverGrabInterface (), x11Pixmap, glxPixmap, checkPixmapValidityFunc (), bindTexImageEXT (), waitGLXFunc (), source); } void TfpTexture::releaseTexImage () { (*GL::releaseTexImage) (screen->dpy (), pixmap, GLX_FRONT_LEFT_EXT); } GLTexture::List TfpTexture::bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, cgl::PixmapSource source) { GLTexture::List rv (1); TfpTexture *tex = NULL; unsigned int target = 0; GLenum texTarget = GL_TEXTURE_2D; GLXPixmap glxPixmap = None; GLTexture::Matrix matrix = _identity_matrix; bool mipmap = false; GLFBConfig *config = GLScreen::get (screen)->glxPixmapFBConfig (depth); int attribs[7], i = 0; if (!config->fbConfig) { compLogMessage ("core", CompLogLevelWarn, "No GLXFBConfig for depth %d", depth); return GLTexture::List (); } attribs[i++] = GLX_TEXTURE_FORMAT_EXT; attribs[i++] = config->textureFormat; bool pot = POWER_OF_TWO (width) && POWER_OF_TWO (height); /* If no texture target is specified in the fbconfig, or only the TEXTURE_2D target is specified and GL_texture_non_power_of_two is not supported, then allow the server to choose the texture target. */ if (config->textureTargets & GLX_TEXTURE_2D_BIT_EXT && (GL::textureNonPowerOfTwo || pot)) target = GLX_TEXTURE_2D_EXT; else if (config->textureTargets & GLX_TEXTURE_RECTANGLE_BIT_EXT) target = GLX_TEXTURE_RECTANGLE_EXT; mipmap = config->mipmap && GL::generateMipmap != NULL && (pot || GL::textureNonPowerOfTwoMipmap); attribs[i++] = GLX_MIPMAP_TEXTURE_EXT; attribs[i++] = mipmap; /* Workaround for broken texture from pixmap implementations, that don't advertise any texture target in the fbconfig. */ if (!target) { if (!(config->textureTargets & GLX_TEXTURE_2D_BIT_EXT)) target = GLX_TEXTURE_RECTANGLE_EXT; else if (!(config->textureTargets & GLX_TEXTURE_RECTANGLE_BIT_EXT)) target = GLX_TEXTURE_2D_EXT; } if (target) { attribs[i++] = GLX_TEXTURE_TARGET_EXT; attribs[i++] = target; } attribs[i++] = None; /* We need to take a server grab here if the pixmap is * externally managed as we need to be able to query * if it actually exists */ boost::scoped_ptr lock; if (source == cgl::ExternallyManaged) { lock.reset (new ServerLock (screen->serverGrabInterface ())); if (!checkPixmapValidityGLX (pixmap)) return false; } glxPixmap = (*GL::createPixmap) (screen->dpy (), config->fbConfig, pixmap, attribs); if (!glxPixmap) { compLogMessage ("core", CompLogLevelWarn, "glXCreatePixmap failed"); return GLTexture::List (); } if (!target) (*GL::queryDrawable) (screen->dpy (), glxPixmap, GLX_TEXTURE_TARGET_EXT, &target); switch (target) { case GLX_TEXTURE_2D_EXT: texTarget = GL_TEXTURE_2D; matrix.xx = 1.0f / width; if (config->yInverted) { matrix.yy = 1.0f / height; matrix.y0 = 0.0f; } else { matrix.yy = -1.0f / height; matrix.y0 = 1.0f; } break; case GLX_TEXTURE_RECTANGLE_EXT: texTarget = GL_TEXTURE_RECTANGLE_ARB; matrix.xx = 1.0f; if (config->yInverted) { matrix.yy = 1.0f; matrix.y0 = 0; } else { matrix.yy = -1.0f; matrix.y0 = height; } break; default: compLogMessage ("core", CompLogLevelWarn, "pixmap 0x%x can't be bound to texture", (int) pixmap); GL::destroyPixmap (screen->dpy (), glxPixmap); glxPixmap = None; return GLTexture::List (); } tex = new TfpTexture (texTarget, matrix, mipmap, glxPixmap, width, height, pixmap, source); rv[0] = tex; glBindTexture (texTarget, tex->name ()); tex->bindTexImage (glxPixmap); tex->setFilter (GL_NEAREST); tex->setWrap (GL_CLAMP_TO_EDGE); glBindTexture (texTarget, 0); tex->damage = XDamageCreate (screen->dpy (), pixmap, XDamageReportBoundingBox); boundPixmapTex[tex->damage] = tex; return rv; } void TfpTexture::enable (GLTexture::Filter filter) { glEnable (target ()); glBindTexture (target (), name ()); if (damaged && pixmap) { releaseTexImage (); bindTexImage (pixmap); } GLTexture::enable (filter); if (damaged) updateMipMap = true; if (this->filter () == GL_LINEAR_MIPMAP_LINEAR && updateMipMap) { (*GL::generateMipmap) (target ()); updateMipMap = false; } damaged = false; } #endif ./plugins/opengl/src/privates.h0000644000004100000410000001754513246301623017021 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _OPENGL_PRIVATES_H #define _OPENGL_PRIVATES_H #include #include #include #include #include #include #include #include #include #include #include #include "privatetexture.h" #include "privatevertexbuffer.h" #include "opengl_options.h" extern CompOutput *targetOutput; class GLDoubleBuffer : public compiz::opengl::DoubleBuffer { public: GLDoubleBuffer (Display *, const CompSize &, const compiz::opengl::impl::GLXSwapIntervalEXTFunc &, const compiz::opengl::impl::GLXWaitVideoSyncSGIFunc &); protected: Display *mDpy; const CompSize &mSize; }; #ifndef USE_GLES class GLXDoubleBuffer : public GLDoubleBuffer { public: GLXDoubleBuffer (Display *, const CompSize &, Window); void swap () const; bool blitAvailable () const; void blit (const CompRegion ®ion) const; bool fallbackBlitAvailable () const; void fallbackBlit (const CompRegion ®ion) const; void copyFrontToBack () const; protected: Window mOutput; }; #else class EGLDoubleBuffer : public GLDoubleBuffer { public: EGLDoubleBuffer (Display *, const CompSize &, EGLSurface const &); void swap () const; bool blitAvailable () const; void blit (const CompRegion ®ion) const; bool fallbackBlitAvailable () const; void fallbackBlit (const CompRegion ®ion) const; void copyFrontToBack () const; private: EGLSurface const & mSurface; }; #endif class GLIcon { public: GLIcon () : icon (NULL) {} CompIcon *icon; GLTexture::List textures; }; class FrameProvider { public: typedef boost::shared_ptr Ptr; typedef std::tr1::tuple Frame; virtual ~FrameProvider () {} virtual GLuint getCurrentFrame () = 0; virtual void useCurrentFrame () = 0; virtual void endFrame () = 0; virtual bool providesPersistence () = 0; virtual bool alwaysPostprocess () = 0; virtual void invalidateAll () = 0; }; class PrivateGLScreen : public ScreenInterface, public CompositeScreenInterface, public compiz::composite::PaintHandler, public OpenglOptions { public: PrivateGLScreen (GLScreen *gs); ~PrivateGLScreen (); bool setOption (const CompString &name, CompOption::Value &value); void optionChanged (CompOption*, OpenglOptions::Options); void handleEvent (XEvent *event); void outputChangeNotify (); void paintOutputs (CompOutput::ptrList &outputs, unsigned int mask, const CompRegion ®ion); bool hasVSync (); bool requiredForcedRefreshRate (); unsigned int getFrameAge (); void updateRenderMode (); void updateFrameProvider (); void prepareDrawing (); bool compositingActive (); void damageCutoff (); void paintBackground (const GLMatrix &transform, const CompRegion ®ion, bool transformed); void paintOutputRegion (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void updateScreenBackground (); void updateView (); bool checkX11GLSyncIsSupported (); bool syncObjectsInitialized () const; bool syncObjectsEnabled (); void initXToGLSyncs (); void destroyXToGLSyncs (); void updateXToGLSyncs (); bool driverIsBlacklisted (const char *regex) const; bool postprocessRequiredForCurrentFrame (); public: GLScreen *gScreen; CompositeScreen *cScreen; GLenum textureFilter; #ifndef USE_GLES GLFBConfig glxPixmapFBConfigs[MAX_DEPTH + 1]; #endif GLTexture::List backgroundTextures; bool backgroundLoaded; GLTexture::Filter filter[3]; CompPoint rasterPos; GLMatrix *projection; bool clearBuffers; bool lighting; #ifdef USE_GLES EGLContext ctx; EGLSurface surface; EGLDoubleBuffer doubleBuffer; #else GLXContext ctx; GL::GLXGetProcAddressProc getProcAddress; GLXDoubleBuffer doubleBuffer; #endif boost::shared_ptr scratchFbo; CompRegion outputRegion; XRectangle lastViewport; bool refreshSubBuffer; unsigned int lastMask; std::vector bindPixmap; bool hasCompositing; bool commonFrontbuffer; bool incorrectRefreshRate; // hack for NVIDIA specifying an incorrect // refresh rate, causing us to miss vblanks GLIcon defaultIcon; Window saveWindow; // hack for broken applications, see: // https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/807487 GLProgramCache *programCache; GLShaderCache shaderCache; GLVertexBuffer::AutoProgram *autoProgram; Pixmap rootPixmapCopy; CompSize rootPixmapSize; FrameProvider::Ptr frameProvider; const char *glVendor, *glRenderer, *glVersion; bool postprocessingRequired; mutable CompString prevRegex; mutable bool prevBlacklisted; std::vector xToGLSyncs; std::map alarmToSync; std::vector::size_type currentSyncNum; XToGLSync *currentSync; std::vector::size_type warmupSyncs; bool driverHasBrokenFBOMipmapImplementation; }; class PrivateGLWindow : public WindowInterface, public CompositeWindowInterface { public: static const unsigned int UpdateRegion = 1 << 0; static const unsigned int UpdateMatrix = 1 << 1; public: PrivateGLWindow (CompWindow *w, GLWindow *gw); ~PrivateGLWindow (); void windowNotify (CompWindowNotify n); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool now); void updateFrameRegion (CompRegion ®ion); void setWindowMatrix (); void updateWindowRegions (); void clearTextures (); CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; GLScreen *gScreen; GLTexture::List textures; GLTexture::MatrixList matrices; CompRegion::Vector regions; unsigned int updateState; bool needsRebind; CompRegion clip; bool bindFailed; bool overlayWindow; GLushort opacity; GLushort brightness; GLushort saturation; GLWindowPaintAttrib paint; GLWindowPaintAttrib lastPaint; unsigned int lastMask; GLVertexBuffer *vertexBuffer; // map of shaders, plugin name is key, pair of vertex and fragment // shader source code is value std::list shaders; GLVertexBuffer::AutoProgram *autoProgram; std::list icons; compiz::window::configure_buffers::Releasable::Ptr configureLock; }; #endif ./plugins/opengl/src/vertexbuffer.cpp0000644000004100000410000004721713246301623020225 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins * Frederic Plourde * Alexandros Frantzis */ #include #include #ifdef USE_GLES #include #else #include #include #endif #include #include "privates.h" GLVertexBuffer *PrivateVertexBuffer::streamingBuffer = NULL; bool GLVertexBuffer::enabled () { // FIXME: GL::shaders shouldn't be a requirement here. But for now, // fglrx doesn't have GL::shaders and that causes blending problems. return GL::vboEnabled && GL::shaders; } GLVertexBuffer::GLVertexBuffer () : priv (new PrivateVertexBuffer ()) { priv->usage = GL::STATIC_DRAW; colorDefault (); } GLVertexBuffer::GLVertexBuffer (GLenum usage) : priv (new PrivateVertexBuffer ()) { if (usage != GL::STATIC_DRAW && usage != GL::DYNAMIC_DRAW && usage != GL::STREAM_DRAW) usage = GL::STATIC_DRAW; priv->usage = usage; colorDefault (); } GLVertexBuffer::~GLVertexBuffer () { delete priv; } GLVertexBuffer *GLVertexBuffer::streamingBuffer () { if (PrivateVertexBuffer::streamingBuffer == NULL) PrivateVertexBuffer::streamingBuffer = new GLVertexBuffer (GL::STREAM_DRAW); return PrivateVertexBuffer::streamingBuffer; } void GLVertexBuffer::begin (GLenum primitiveType /* = GL_TRIANGLES */) { priv->primitiveType = primitiveType; priv->vertexData.clear (); priv->vertexOffset = 0; priv->maxVertices = -1; priv->normalData.clear (); priv->colorData.clear (); for (std::vector::iterator it = priv->uniforms.begin(); it != priv->uniforms.end(); ++it) { delete *it; } priv->uniforms.clear (); priv->nTextures = 0; for (int i = 0; i < PrivateVertexBuffer::MAX_TEXTURES; i++) priv->textureData[i].clear (); } bool GLVertexBuffer::end () { if (priv->vertexData.empty ()) return false; if (!enabled ()) return true; GL::bindBuffer (GL_ARRAY_BUFFER, priv->vertexBuffer); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->vertexData.size (), &priv->vertexData[0], priv->usage); if (priv->normalData.size ()) { GL::bindBuffer (GL_ARRAY_BUFFER, priv->normalBuffer); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->normalData.size (), &priv->normalData[0], priv->usage); } if (!priv->colorData.size ()) { priv->colorData.resize (4); priv->colorData[0] = priv->color[0]; priv->colorData[1] = priv->color[1]; priv->colorData[2] = priv->color[2]; priv->colorData[3] = priv->color[3]; } if (priv->colorData.size ()) { GL::bindBuffer (GL_ARRAY_BUFFER, priv->colorBuffer); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->colorData.size (), &priv->colorData[0], priv->usage); } for (GLuint i = 0; i < priv->nTextures; i++) { GL::bindBuffer (GL_ARRAY_BUFFER, priv->textureBuffers[i]); GL::bufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * priv->textureData[i].size (), &priv->textureData[i][0], priv->usage); } GL::bindBuffer (GL_ARRAY_BUFFER, 0); return true; } void GLVertexBuffer::addVertices (GLuint nVertices, const GLfloat *vertices) { priv->vertexData.reserve (priv->vertexData.size () + (nVertices * 3)); for (GLuint i = 0; i < nVertices * 3; i++) { priv->vertexData.push_back (vertices[i]); } } GLfloat *GLVertexBuffer::getVertices() const { return &priv->vertexData[0]; } int GLVertexBuffer::getVertexStride() const { return 3; // as seen in addVertices } int GLVertexBuffer::countVertices() const { return priv->vertexData.size() / 3; } void GLVertexBuffer::setVertexOffset (GLuint vOffset) { priv->vertexOffset = vOffset; } void GLVertexBuffer::setMaxVertices (GLint vMax) { priv->maxVertices = vMax; } void GLVertexBuffer::addNormals (GLuint nNormals, const GLfloat *normals) { priv->normalData.reserve (priv->normalData.size () + (nNormals * 3)); for (GLuint i = 0; i < nNormals * 3; i++) { priv->normalData.push_back (normals[i]); } } void GLVertexBuffer::addColors (GLuint nColors, const GLushort *colors) { priv->colorData.reserve (priv->colorData.size () + (nColors * 4)); for (GLuint i = 0; i < nColors * 4; i++) { priv->colorData.push_back (colors[i] / 65535.0f); } } void GLVertexBuffer::color4f (GLfloat r, GLfloat g, GLfloat b, GLfloat a) { priv->color[0] = r; priv->color[1] = g; priv->color[2] = b; priv->color[3] = a; } void GLVertexBuffer::colorDefault () { priv->color[0] = defaultColor[0] / 65535.0; priv->color[1] = defaultColor[1] / 65535.0; priv->color[2] = defaultColor[2] / 65535.0; priv->color[3] = defaultColor[3] / 65535.0; } void GLVertexBuffer::addTexCoords (GLuint texture, GLuint nTexcoords, const GLfloat *texcoords) { if (texture >= PrivateVertexBuffer::MAX_TEXTURES) return; if (texture >= priv->nTextures) priv->nTextures = texture + 1; std::vector &data = priv->textureData[texture]; data.reserve (data.size () + (nTexcoords * 2)); for (GLuint i = 0; i < nTexcoords * 2; i++) data.push_back (texcoords[i]); } GLuint GLVertexBuffer::countTextures () const { return priv->nTextures; } void GLVertexBuffer::addUniform (const char *name, GLfloat value) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)value); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform (const char *name, GLint value) { Uniform* uniform = new Uniform(name, value); priv->uniforms.push_back (uniform); } bool GLVertexBuffer::addUniform (const char *name, const GLMatrix &value) { //#warning Add 'addUniform' support to GLMatrix type ! return true; } void GLVertexBuffer::addUniform2f (const char *name, GLfloat x, GLfloat y) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)x, (double)y); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform3f (const char *name, GLfloat x, GLfloat y, GLfloat z) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)x, (double)y, (double)z); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform4f (const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { // we're casting to double here to make our template va_arg happy Uniform* uniform = new Uniform(name, (double)x, (double)y, (double)z, (double)w); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform2i (const char *name, GLint x, GLint y) { Uniform* uniform = new Uniform(name, x, y); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform3i (const char *name, GLint x, GLint y, GLint z) { Uniform* uniform = new Uniform(name, x, y, z); priv->uniforms.push_back (uniform); } void GLVertexBuffer::addUniform4i (const char *name, GLint x, GLint y, GLint z, GLint w) { Uniform* uniform = new Uniform(name, x, y, z, w); priv->uniforms.push_back (uniform); } void GLVertexBuffer::setProgram (GLProgram *program) { priv->program = program; } void GLVertexBuffer::setAutoProgram (AutoProgram *autoProgram) { priv->autoProgram = autoProgram; } int GLVertexBuffer::render () { if (enabled ()) return priv->render (NULL, NULL, NULL, NULL, 0); else return -1; } int GLVertexBuffer::render (const GLushort *indices, GLuint nIndices) { if (enabled ()) return priv->render (NULL, NULL, NULL, indices, nIndices); else return -1; } int GLVertexBuffer::render (const GLMatrix &modelview) { const GLWindowPaintAttrib attrib = { OPAQUE, BRIGHT, COLOR, 0, 0, 0, 0 }; return render (modelview, attrib); } int GLVertexBuffer::render (const GLMatrix &modelview, const GLushort *indices, GLuint nIndices) { const GLWindowPaintAttrib attrib = { OPAQUE, BRIGHT, COLOR, 0, 0, 0, 0 }; return render (modelview, attrib, indices, nIndices); } int GLVertexBuffer::render (const GLMatrix &modelview, const GLWindowPaintAttrib &attrib) { GLScreen *gScreen = GLScreen::get (screen); GLMatrix *projection = gScreen->projectionMatrix (); return render (*projection, modelview, attrib, NULL, 0); } int GLVertexBuffer::render (const GLMatrix &modelview, const GLWindowPaintAttrib &attrib, const GLushort *indices, GLuint nIndices) { GLScreen *gScreen = GLScreen::get (screen); GLMatrix *projection = gScreen->projectionMatrix (); return render (*projection, modelview, attrib, indices, nIndices); } int GLVertexBuffer::render (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib) { return render (projection, modelview, attrib, NULL, 0); } #if 0 #define PRINT_MATRIX(m) printMatrix ((m), #m) static void printMatrix (const GLMatrix &matrix, const char *title = NULL) { const float *m = matrix.getMatrix(); printf ("--- %s ---\n", title ? title : "?"); for (int y = 0; y < 4; y++) printf ("[%5.1f %5.1f %5.1f %5.1f]\n", m[y], m[y+4], m[y+8], m[y+12]); } #else #define PRINT_MATRIX(m) #endif int GLVertexBuffer::render (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib, const GLushort *indices, GLuint nIndices) { if (!priv->vertexData.size ()) return -1; PRINT_MATRIX(modelview); PRINT_MATRIX(projection); if (enabled ()) return priv->render (&projection, &modelview, &attrib, indices, nIndices); else return priv->legacyRender (projection, modelview, attrib, indices, nIndices); } PrivateVertexBuffer::PrivateVertexBuffer () : nTextures (0), vertexOffset (0), maxVertices (-1), program (NULL), autoProgram (0) { if (!GL::genBuffers) return; GL::genBuffers (1, &vertexBuffer); GL::genBuffers (1, &normalBuffer); GL::genBuffers (1, &colorBuffer); GL::genBuffers (4, &textureBuffers[0]); } PrivateVertexBuffer::~PrivateVertexBuffer () { if (!GL::deleteBuffers) return; if (vertexBuffer) GL::deleteBuffers (1, &vertexBuffer); if (normalBuffer) GL::deleteBuffers (1, &normalBuffer); if (colorBuffer) GL::deleteBuffers (1, &colorBuffer); if (textureBuffers[0]) GL::deleteBuffers (4, &textureBuffers[0]); for (std::vector::iterator it = uniforms.begin(); it != uniforms.end(); ++it) { delete *it; } } int PrivateVertexBuffer::render (const GLMatrix *projection, const GLMatrix *modelview, const GLWindowPaintAttrib *attrib, const GLushort *indices, GLuint nIndices) { GLfloat attribs[3] = {1, 1, 1}; GLint positionIndex = -1; GLint normalIndex = -1; GLint colorIndex = -1; GLint texCoordIndex[4] = {-1, -1, -1, -1}; GLProgram *tmpProgram = program; // If we don't have an explicitly set program, try to get one // using the AutoProgram callback object. if (tmpProgram == NULL && autoProgram) { // Convert attrib to shader parameters GLShaderParameters params; params.opacity = attrib->opacity != OPAQUE; params.brightness = attrib->brightness != BRIGHT; params.saturation = attrib->saturation != COLOR; params.color = colorData.size () == 4 ? GLShaderVariableUniform : colorData.size () > 4 ? GLShaderVariableVarying : GLShaderVariableNone; params.normal = normalData.size () <= 4 ? GLShaderVariableUniform : GLShaderVariableVarying; params.numTextures = nTextures; // Get a program matching the parameters tmpProgram = autoProgram->getProgram(params); } if (tmpProgram == NULL) { std::cerr << "no program defined!" << std::endl; return -1; } tmpProgram->bind (); if (!tmpProgram->valid ()) { return -1; } if (projection) tmpProgram->setUniform ("projection", *projection); if (modelview) tmpProgram->setUniform ("modelview", *modelview); positionIndex = tmpProgram->attributeLocation ("position"); (*GL::enableVertexAttribArray) (positionIndex); (*GL::bindBuffer) (GL::ARRAY_BUFFER, vertexBuffer); (*GL::vertexAttribPointer) (positionIndex, 3, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); //use default normal if (normalData.empty ()) { tmpProgram->setUniform3f ("singleNormal", 0.0f, 0.0f, -1.0f); } // special case a single normal and apply it to the entire operation else if (normalData.size () == 3) { tmpProgram->setUniform3f ("singleNormal", normalData[0], normalData[1], normalData[2]); } else if (normalData.size () > 3) { normalIndex = tmpProgram->attributeLocation ("normal"); (*GL::enableVertexAttribArray) (normalIndex); (*GL::bindBuffer) (GL::ARRAY_BUFFER, normalBuffer); (*GL::vertexAttribPointer) (normalIndex, 3, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); } // special case a single color and apply it to the entire operation if (colorData.size () == 4) { tmpProgram->setUniform4f ("singleColor", colorData[0], colorData[1], colorData[2], colorData[3]); } else if (colorData.size () > 4) { colorIndex = tmpProgram->attributeLocation ("color"); (*GL::enableVertexAttribArray) (colorIndex); (*GL::bindBuffer) (GL::ARRAY_BUFFER, colorBuffer); (*GL::vertexAttribPointer) (colorIndex, 4, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); } for (int i = nTextures - 1; i >= 0; i--) { char name[10]; snprintf (name, 10, "texCoord%d", i); texCoordIndex[i] = tmpProgram->attributeLocation (name); (*GL::enableVertexAttribArray) (texCoordIndex[i]); (*GL::bindBuffer) (GL::ARRAY_BUFFER, textureBuffers[i]); (*GL::vertexAttribPointer) (texCoordIndex[i], 2, GL_FLOAT, GL_FALSE, 0, 0); (*GL::bindBuffer) (GL::ARRAY_BUFFER, 0); snprintf (name, 9, "texture%d", i); tmpProgram->setUniform (name, i); } // set per-plugin uniforms for (unsigned int i = 0; i < uniforms.size (); i++) { uniforms[i]->set (tmpProgram); } //convert paint attribs to 0-1 range if (attrib) { attribs[0] = attrib->opacity / 65535.0f; attribs[1] = attrib->brightness / 65535.0f; attribs[2] = attrib->saturation / 65535.0f; tmpProgram->setUniform3f ("paintAttrib", attribs[0], attribs[1], attribs[2]); } const GLuint nVerticesToDraw = maxVertices > 0 ? std::min (static_cast (vertexData.size () / 3), maxVertices) : vertexData.size () / 3; if (nIndices && indices) glDrawElements (primitiveType, nIndices, GL_UNSIGNED_SHORT, indices); else glDrawArrays (primitiveType, vertexOffset, nVerticesToDraw); for (int i = 0; i < 4; ++i) { if (texCoordIndex[i] != -1) (*GL::disableVertexAttribArray) (texCoordIndex[i]); } if (colorIndex != -1) (*GL::disableVertexAttribArray) (colorIndex); if (normalIndex != -1) (*GL::disableVertexAttribArray) (normalIndex); (*GL::disableVertexAttribArray) (positionIndex); tmpProgram->unbind (); return 0; } int PrivateVertexBuffer::legacyRender (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib, const GLushort *indices, GLuint nIndices) { #ifndef USE_GLES glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadMatrixf (projection.getMatrix ()); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadMatrixf (modelview.getMatrix ()); glEnableClientState (GL_VERTEX_ARRAY); glVertexPointer (3, GL_FLOAT, 0, &vertexData[0]); //use default normal if (normalData.empty ()) { glNormal3f (0.0f, 0.0f, -1.0f); } // special case a single normal and apply it to the entire operation else if (normalData.size () == 3) { glNormal3fv (&normalData[0]); } else if (normalData.size () > 3) { glEnableClientState (GL_NORMAL_ARRAY); glNormalPointer (GL_FLOAT, 0, &normalData[0]); } // special case a single color and apply it to the entire operation if (colorData.size () == 4) { glColor4fv (&colorData[0]); } else if (colorData.size () > 4) { glEnableClientState (GL_COLOR_ARRAY); glColorPointer (4, GL_FLOAT, 0, &colorData[0]); } for (int i = nTextures - 1; i >= 0; i--) { GL::clientActiveTexture (GL_TEXTURE0_ARB + i); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glTexCoordPointer (2, GL_FLOAT, 0, &textureData[i][0]); } const GLuint nVerticesToDraw = maxVertices > 0 ? std::min (static_cast (vertexData.size () / 3), maxVertices) : vertexData.size () / 3; if (indices && nIndices) { glDrawElements (primitiveType, nIndices, GL_UNSIGNED_SHORT, indices); } else glDrawArrays (primitiveType, vertexOffset, nVerticesToDraw); glDisableClientState (GL_VERTEX_ARRAY); glDisableClientState (GL_NORMAL_ARRAY); glDisableClientState (GL_COLOR_ARRAY); for (int i = nTextures; i > 0; i--) { GL::clientActiveTexture (GL_TEXTURE0_ARB + i); glDisableClientState (GL_TEXTURE_COORD_ARRAY); } GL::clientActiveTexture (GL_TEXTURE0_ARB); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); #endif return 0; } ./plugins/opengl/src/privatevertexbuffer.h0000644000004100000410000001013013246301623021245 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins * Frederic Plourde */ #ifndef _VERTEXBUFFER_PRIVATE_H #define _VERTEXBUFFER_PRIVATE_H #ifdef USE_GLES #include #else #include #endif #include #include class GLVertexBuffer; class AbstractUniform { public: virtual ~AbstractUniform() {} void virtual set(GLProgram* program) = 0; }; template < typename T, int C > class Uniform: public AbstractUniform { public: Uniform(const char *_name, ... ); void set(GLProgram* program); public: T a[C]; std::string name; }; template < typename T, int C > Uniform< T, C >::Uniform(const char *_name, ... ) { va_list arg_list; va_start( arg_list, _name ); name = _name; for( int i = 0; i < C; i++ ) a[i] = va_arg( arg_list, T ); va_end( arg_list ); } template < typename T, int C > void Uniform< T, C >::set(GLProgram* prog) { const char* n = name.c_str(); // This will only get called from privateVertexBuffer::render // so we know we've got a valid, bound program here if (typeid(a[0]) == typeid(double)) { switch (C) { case 1: prog->setUniform (n, (GLfloat) a[0]); break; case 2: prog->setUniform2f (n, a[0], a[1]); break; case 3: prog->setUniform3f (n, a[0], a[1], a[2]); break; case 4: prog->setUniform4f (n, a[0], a[1], a[2], a[3]); break; } } else if (typeid(a[0]) == typeid(int)) { switch (C) { case 1: prog->setUniform (n, (GLint) a[0]); break; case 2: prog->setUniform2i (n, a[0], a[1]); break; case 3: prog->setUniform3i (n, a[0], a[1], a[2]); break; case 4: prog->setUniform4i (n, a[0], a[1], a[2], a[3]); break; } } else { compLogMessage ("opengl", CompLogLevelError, "Unknown uniform type!"); } } class GLVertexBuffer; class PrivateVertexBuffer { public: PrivateVertexBuffer (); ~PrivateVertexBuffer (); int render (const GLMatrix *projection, const GLMatrix *modelview, const GLWindowPaintAttrib *attrib, const GLushort *indices, GLuint nIndices); int legacyRender (const GLMatrix &projection, const GLMatrix &modelview, const GLWindowPaintAttrib &attrib, const GLushort *indices, GLuint nIndices); public: static GLVertexBuffer *streamingBuffer; std::vector vertexData; std::vector normalData; std::vector colorData; enum { MAX_TEXTURES = 4 }; std::vector textureData[MAX_TEXTURES]; GLuint nTextures; GLfloat color[4]; GLuint vertexOffset; GLint maxVertices; GLProgram *program; GLenum primitiveType; GLenum usage; GLuint vertexBuffer; GLuint normalBuffer; GLuint colorBuffer; GLuint textureBuffers[4]; std::vector uniforms; GLVertexBuffer::AutoProgram *autoProgram; }; #endif //_VERTEXBUFFER_PRIVATE_H ./plugins/opengl/src/privatetexture.h0000644000004100000410000001045013246301623020243 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * Copyright © 2011 Linaro Ltd. * Copyright 2015 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Travis Watkins */ #ifndef _PRIVATETEXTURE_H #define _PRIVATETEXTURE_H #ifdef USE_GLES #define SUPPORT_X11 #include #include #include #else #include #include #endif #include #include #include class GLScreen; class GLDisplay; class PrivateTexture { public: PrivateTexture (GLTexture* texture, GLenum target, GLTexture::Matrix const& matrix, bool mipmap); ~PrivateTexture (); static GLTexture::List loadImageData (const char *image, unsigned int width, unsigned int height, GLenum format, GLenum type); public: GLTexture *texture; GLuint name; GLenum target; GLenum filter; GLenum wrap; GLTexture::Matrix matrix; bool mipmap; bool mipmapSupport; bool initial; int refCount; }; #ifdef USE_GLES class EglTexture : public GLTexture { public: ~EglTexture (); void enable (Filter filter); static List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source); private: EglTexture (GLenum target, GLTexture::Matrix const& matrix, bool mipmap, int width, int height); public: bool damaged; Damage damage; bool updateMipMap; }; extern std::map boundPixmapTex; #else class TfpTexture : public GLTexture { public: ~TfpTexture (); void enable (Filter filter); bool bindTexImage (const GLXPixmap &); void releaseTexImage (); static List bindPixmapToTexture (Pixmap pixmap, int width, int height, int depth, compiz::opengl::PixmapSource source); private: TfpTexture (GLenum target, GLTexture::Matrix const& matrix, bool mipmap, Pixmap pixmap, int width, int height, Pixmap x11Pixmap, compiz::opengl::PixmapSource source); public: Pixmap x11Pixmap; GLXPixmap pixmap; bool damaged; Damage damage; bool updateMipMap; compiz::opengl::PixmapSource source; }; extern std::map boundPixmapTex; #endif #endif ./plugins/opengl/src/fsregion/0000755000004100000410000000000013246301623016613 5ustar www-datawww-data./plugins/opengl/src/fsregion/CMakeLists.txt0000644000004100000410000000026213246301623021353 0ustar www-datawww-dataif (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif () add_library (compiz_opengl_fsregion STATIC fsregion.cpp) target_link_libraries (compiz_opengl_fsregion compiz_core) ./plugins/opengl/src/fsregion/fsregion.cpp0000644000004100000410000000453213246301623021137 0ustar www-datawww-data/* * Compiz opengl plugin, FullscreenRegion class * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "fsregion.h" namespace compiz { namespace opengl { FullscreenRegion::FullscreenRegion (const CompRect &output) : untouched (output), orig (output), allOutputs (output) { } FullscreenRegion::FullscreenRegion (const CompRect &output, const CompRegion &all) : untouched (output), orig (output), allOutputs (all) { } bool FullscreenRegion::isCoveredBy (const CompRegion ®ion, WinFlags flags) { bool fullscreen = false; if (!(flags & (Desktop | Alpha | NoOcclusionDetection)) && region == untouched && region == orig) { fullscreen = true; } untouched -= region; return fullscreen; } bool FullscreenRegion::allowRedirection (const CompRegion ®ion) { /* Don't allow existing unredirected windows that cover this * region to be redirected again as they were probably unredirected * on another monitor * Also be careful to not allow unredirection of offscreen windows * (outside of allOutputs). */ return region.intersects (orig) || !region.intersects (allOutputs); } } // namespace opengl } // namespace compiz ./plugins/opengl/src/fsregion/fsregion.h0000644000004100000410000000370713246301623020607 0ustar www-datawww-data/* * Compiz opengl plugin, FullscreenRegion class * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef __COMPIZ_OPENGL_FSREGION_H #define __COMPIZ_OPENGL_FSREGION_H #include "core/rect.h" #include "core/region.h" namespace compiz { namespace opengl { class FullscreenRegion { public: typedef enum { Desktop = 1, Alpha = 2, NoOcclusionDetection = 3 } WinFlag; typedef unsigned int WinFlags; FullscreenRegion (const CompRect &output); FullscreenRegion (const CompRect &output, const CompRegion &all); // isCoveredBy is called for windows from TOP to BOTTOM bool isCoveredBy (const CompRegion ®ion, WinFlags flags = 0); bool allowRedirection (const CompRegion ®ion); private: CompRegion untouched; CompRegion orig; CompRegion allOutputs; }; } // namespace opengl } // namespace compiz #endif ./plugins/opengl/src/fsregion/tests/0000755000004100000410000000000013246301624017756 5ustar www-datawww-data./plugins/opengl/src/fsregion/tests/CMakeLists.txt0000644000004100000410000000044713246301623022522 0ustar www-datawww-datainclude_directories (${GTEST_INCLUDE_DIRS} ..) set (exe "compiz_opengl_test_fsregion") add_executable (${exe} test-fsregion.cpp) target_link_libraries (${exe} compiz_opengl_fsregion compiz_core ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests(${exe} COVERAGE compiz_opengl_fsregion) ./plugins/opengl/src/fsregion/tests/test-fsregion.cpp0000644000004100000410000002044013246301623023252 0ustar www-datawww-data/* * Compiz opengl plugin, FullscreenRegion class * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "gtest/gtest.h" #include "fsregion.h" using namespace compiz::opengl; TEST (OpenGLFullscreenRegion, NoWindows) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, OneFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, FullscreenNoDesktop) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); } TEST (OpenGLFullscreenRegion, AlphaFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Alpha)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, AlphaOverFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (50, 60, 70, 80), FullscreenRegion::Alpha)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, NoOcclusionFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::NoOcclusionDetection)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, NoOcclusionOverFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (50, 60, 70, 80), FullscreenRegion::NoOcclusionDetection)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, NormalWindows) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, TwoFullscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, Offscreen) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (-100, -100, 1, 1))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (2000, 2000, 123, 456))); EXPECT_TRUE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, CancelFullscreen1) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (500, 500, 345, 234))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, CancelFullscreen2) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (-100, -100, 1, 1))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (2000, 2000, 123, 456))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (500, 500, 345, 234))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (20, 20, 50, 20))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, Overflow) { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (10, 10, 40, 30))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (-10, -10, 1044, 788))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } TEST (OpenGLFullscreenRegion, KeepUnredirectedStateIfNotOnMonitor) { CompRect left (0, 0, 1024, 768); CompRect right (1025, 0, 1024, 768); CompRegion all (0, 0, 2048, 768); CompRect offscreen1 (2048, 0, 1024, 768); CompRect offscreen2 (-1024, 0, 1024, 768); CompRegion window (right); FullscreenRegion monitor (left, all); /* Eg, not covering the monitor, should be redirected */ EXPECT_FALSE (monitor.isCoveredBy (window)); /* Don't allow the redirection however, because we weren't * covering the monitor at all. */ EXPECT_FALSE (monitor.allowRedirection (window)); /* Verify off-screen windows are always redirected (eg. other viewports) */ EXPECT_TRUE (monitor.allowRedirection (offscreen1)); EXPECT_TRUE (monitor.allowRedirection (offscreen2)); } TEST (OpenGLFullscreenRegion, MaximizedWithDocks) // LP: #1053902 { FullscreenRegion monitor (CompRect (0, 0, 1024, 768)); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 24))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 24, 64, 744))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (64, 24, 960, 744))); EXPECT_FALSE (monitor.isCoveredBy (CompRegion (0, 0, 1024, 768), FullscreenRegion::Desktop)); } ./plugins/opengl/src/programcache.cpp0000644000004100000410000001240513246301623020140 0ustar www-datawww-data/* * Copyright © 2011 Linaro Ltd. * Copyright 2015 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Linaro Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Linaro Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * LINARO LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Travis Watkins */ #include #include #include "privates.h" typedef std::list access_history_t; typedef boost::shared_ptr GLProgramPtr; typedef std::pair value; static GLProgram * compileProgram (std::string name, std::list shaders) { std::list::const_iterator it; std::string vertex_shader; std::string fragment_shader; std::string vertex_functions = ""; std::string vertex_function_calls = ""; std::string fragment_functions = ""; std::string fragment_function_calls = ""; int vpos, vcallpos, fpos, fcallpos; for (it = shaders.begin (); it != shaders.end (); ++it) { //find the special shaders to put the rest in if ((*it)->vertexShader.find ("@VERTEX_FUNCTIONS@") != std::string::npos) { vertex_shader = (*it)->vertexShader; } else { if ((*it)->vertexShader.length ()) { vertex_functions += (*it)->vertexShader; vertex_function_calls += (*it)->name + "_vertex();\n"; } } if ((*it)->fragmentShader.find ("@FRAGMENT_FUNCTIONS@") != std::string::npos) { fragment_shader = (*it)->fragmentShader; } else { if ((*it)->fragmentShader.length ()) { fragment_functions += (*it)->fragmentShader; fragment_function_calls += (*it)->name + "_fragment();\n"; } } } // put shader functions and function calls into the main shader vpos = vertex_shader.find ("@VERTEX_FUNCTIONS@"); vertex_shader.replace (vpos, 18, vertex_functions); vcallpos = vertex_shader.find ("@VERTEX_FUNCTION_CALLS@"); vertex_shader.replace (vcallpos, 23, vertex_function_calls); fpos = fragment_shader.find ("@FRAGMENT_FUNCTIONS@"); fragment_shader.replace (fpos, 20, fragment_functions); fcallpos = fragment_shader.find ("@FRAGMENT_FUNCTION_CALLS@"); fragment_shader.replace (fcallpos, 25, fragment_function_calls); return new GLProgram (vertex_shader, fragment_shader); } class PrivateProgramCache { public: PrivateProgramCache (size_t); const size_t capacity; access_history_t access_history; std::map cache; void insert (std::string, GLProgramPtr const&); void evict (); }; GLProgramCache::GLProgramCache (size_t capacity) : priv (new PrivateProgramCache (capacity)) { assert (priv->capacity != 0); } GLProgramCache::~GLProgramCache () { delete priv; } GLProgram* GLProgramCache::operator () (std::list shaders) { std::list::const_iterator name_it; std::string name; GLProgramPtr program; for (name_it = shaders.begin(); name_it != shaders.end(); ++name_it) { if (name.length () == 0) name += (*name_it)->name; else name += ":" + (*name_it)->name; } std::map::iterator it = priv->cache.find (name); if (it == priv->cache.end ()) { program = GLProgramPtr (compileProgram (name, shaders)); priv->insert (name, program); } else { priv->access_history.splice (priv->access_history.end (), priv->access_history, (*it).second.second); (*it).second.second = priv->access_history.rbegin ().base (); program = (*it).second.first; } return program.get(); } PrivateProgramCache::PrivateProgramCache (size_t c) : capacity (c) { } void PrivateProgramCache::insert (std::string name, GLProgramPtr const& program) { assert (cache.find (name) == cache.end ()); if (cache.size () == capacity) evict (); // update most recently used GLProgram access_history_t::iterator it = access_history.insert (access_history.end (), name); cache.insert (std::make_pair (name, std::make_pair (program, it))); } void PrivateProgramCache::evict () { assert (!access_history.empty ()); // find least recently used GLProgram std::map::iterator it = cache.find (access_history.front ()); assert (it != cache.end ()); cache.erase (it); access_history.pop_front (); } ./plugins/opengl/src/opengl.cpp0000644000004100000410000000570213246301623016773 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include #include "privates.h" const float DEFAULT_Z_CAMERA = 0.866025404f; const float RED_SATURATION_WEIGHT = 0.30f; const float GREEN_SATURATION_WEIGHT = 0.59f; const float BLUE_SATURATION_WEIGHT = 0.11f; const unsigned short NOTHING_TRANS_FILTER = 0; const unsigned short SCREEN_TRANS_FILTER = 1; const unsigned short WINDOW_TRANS_FILTER = 2; CompOption::Vector & GLScreen::getOptions () { return priv->getOptions (); } bool GLScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool PrivateGLScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = OpenglOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case OpenglOptions::TextureFilter: cScreen->damageScreen (); if (!optionGetTextureFilter ()) textureFilter = GL_NEAREST; else textureFilter = GL_LINEAR; break; default: break; } return rv; } class OpenglPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (opengl, OpenglPluginVTable) bool OpenglPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI)) { CompPrivate p; p.uval = COMPIZ_OPENGL_ABI; screen->storeValue ("opengl_ABI", p); return true; } return false; } void OpenglPluginVTable::fini () { screen->eraseValue ("opengl_ABI"); } ./plugins/opengl/src/xtoglsync.cpp0000644000004100000410000001113413246301623017535 0ustar www-datawww-data/* * Copyright © 2011 NVIDIA Corporation * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * NVIDIA Corporation not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * NVIDIA Corporation makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NVIDIA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: James Jones */ #include "opengl/xtoglsync.h" bool XToGLSync::syncValuesInitialized = false; XSyncValue XToGLSync::zero; XSyncValue XToGLSync::one; XToGLSync::XToGLSync () : f (None), fGL (NULL), c (None), a (None), state (XToGLSync::XTOGLS_READY) { Display *dpy = screen->dpy (); f = XSyncCreateFence (dpy, DefaultRootWindow (dpy), False); fGL = GL::importSync (GL_SYNC_X11_FENCE_EXT, f, 0); if (!syncValuesInitialized) { XSyncIntToValue (&zero, 0); XSyncIntToValue (&one, 1); syncValuesInitialized = true; } XSyncIntToValue (&nextCounterValue, 1); c = XSyncCreateCounter (dpy, zero); XSyncAlarmAttributes alarmAttribs; alarmAttribs.trigger.counter = c; alarmAttribs.trigger.value_type = XSyncAbsolute; alarmAttribs.trigger.wait_value = one; alarmAttribs.trigger.test_type = XSyncPositiveTransition; alarmAttribs.events = True; a = XSyncCreateAlarm (dpy, XSyncCACounter | XSyncCAValueType | XSyncCAValue | XSyncCATestType | XSyncCAEvents, &alarmAttribs); } XToGLSync::~XToGLSync () { Display *dpy = screen->dpy (); switch (state) { case XTOGLS_WAITING: break; case XTOGLS_RESET_PENDING: { XEvent ev; XIfEvent (dpy, &ev, &XToGLSync::alarmEventPredicate, reinterpret_cast(this)); handleEvent(reinterpret_cast(&ev)); } // Fall through. case XTOGLS_READY: XSyncTriggerFence (dpy, f); XFlush (dpy); break; case XTOGLS_TRIGGER_SENT: case XTOGLS_DONE: // Nothing to do. break; } GL::deleteSync (fGL); XSyncDestroyFence (dpy, f); XSyncDestroyCounter (dpy, c); XSyncDestroyAlarm (dpy, a); } Bool XToGLSync::alarmEventPredicate (Display *dpy, XEvent *ev, XPointer arg) { if (ev->type == screen->syncEvent () + XSyncAlarmNotify) { XToGLSync *sync = reinterpret_cast(arg); XSyncAlarmNotifyEvent *ae = reinterpret_cast(ev); if (ae->alarm == sync->a) return True; } return False; } void XToGLSync::trigger (void) { Display *dpy = screen->dpy (); assert (state == XTOGLS_READY); XSyncTriggerFence (dpy, f); XFlush (dpy); state = XTOGLS_TRIGGER_SENT; } void XToGLSync::insertWait (void) { if (state != XTOGLS_TRIGGER_SENT) return; GL::waitSync (fGL, 0, GL_TIMEOUT_IGNORED); state = XTOGLS_WAITING; } GLenum XToGLSync::checkUpdateFinished (GLuint64 timeout) { GLenum status; switch (state) { case XTOGLS_DONE: return GL_ALREADY_SIGNALED; case XTOGLS_WAITING: status = GL::clientWaitSync (fGL, 0, timeout); if (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED) { state = XTOGLS_DONE; } return status; default: return GL_WAIT_FAILED; } } void XToGLSync::reset (void) { Display *dpy = screen->dpy (); if (state != XTOGLS_DONE) { return; } XSyncResetFence (dpy, f); XSyncAlarmAttributes values; values.trigger.wait_value = nextCounterValue; XSyncChangeAlarm (dpy, a, XSyncCAValue, &values); XSyncSetCounter (dpy, c, nextCounterValue); int overflow; XSyncValueAdd (&nextCounterValue, nextCounterValue, one, &overflow); state = XTOGLS_RESET_PENDING; } void XToGLSync::handleEvent (XSyncAlarmNotifyEvent* ae) { if (ae->alarm == a) { if (state != XTOGLS_RESET_PENDING) { return; } state = XTOGLS_READY; } } ./plugins/opengl/src/vector.cpp0000644000004100000410000001252313246301623017010 0ustar www-datawww-data/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Danny Baumann */ /* * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * From Mesa 3-D graphics library. */ #include #include #include GLVector::GLVector () { v[0] = v[1] = v[2] = 0.0; v[3] = 1.0; } GLVector::GLVector (float x, float y, float z, float w) { v[0] = x; v[1] = y; v[2] = z; v[3] = 1.0; } float& GLVector::operator[] (int item) { return v[item]; } float& GLVector::operator[] (VectorCoordsEnum coord) { int item = (int) coord; return v[item]; } const float & GLVector::operator[] (int item) const { return v[item]; } const float & GLVector::operator[] (VectorCoordsEnum coord) const { int item = (int) coord; return v[item]; } GLVector& GLVector::operator+= (const GLVector& rhs) { for (int i = 0; i < 3; i++) v[i] += rhs[i]; return *this; } GLVector operator+ (const GLVector& lhs, const GLVector& rhs) { GLVector result; for (int i = 0; i < 3; i++) result[i] = lhs[i] + rhs[i]; return result; } GLVector& GLVector::operator-= (const GLVector& rhs) { for (int i = 0; i < 3; i++) v[i] -= rhs[i]; return *this; } GLVector operator- (const GLVector& lhs, const GLVector& rhs) { GLVector result; for (int i = 0; i < 3; i++) result[i] = lhs[i] - rhs[i]; return result; } GLVector operator- (const GLVector& vector) { GLVector result; for (int i = 0; i < 3; i++) result[i] = -vector[i]; return result; } GLVector& GLVector::operator*= (const float k) { for (int i = 0; i < 3; i++) v[i] *= k; return *this; } float operator* (const GLVector& lhs, const GLVector& rhs) { float result = 0; for (int i = 0; i < 3; i++) result += lhs[i] * rhs[i]; return result; } GLVector operator* (const float k, const GLVector& vector) { GLVector result; for (int i = 0; i < 3; i++) result[i] = k * vector[i]; return result; } GLVector operator* (const GLVector& vector, const float k) { return k * vector; } GLVector& GLVector::operator/= (const float k) { for (int i = 0; i < 3; i++) v[i] /= k; return *this; } GLVector operator/ (const GLVector& vector, const float k) { GLVector result; for (int i = 0; i < 3; i++) result[i] = vector[i] / k; return result; } GLVector& GLVector::operator^= (const GLVector& vector) { *this = *this ^ vector; return *this; } GLVector operator^ (const GLVector& lhs, const GLVector& rhs) { GLVector result; result[0] = lhs[1] * rhs[2] - lhs[2] * rhs[1]; result[1] = lhs[2] * rhs[0] - lhs[0] * rhs[2]; result[2] = lhs[0] * rhs[1] - lhs[1] * rhs[0]; result[3] = 1.0f; return result; } float GLVector::norm () { return sqrt ((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2])); } GLVector & GLVector::normalize () { float mag = norm (); /* avoid division by 0 */ if (mag == 0.0) return *this; for (unsigned int i = 0; i < 3; i++) v[i] /= mag; return *this; } GLVector & GLVector::homogenize () { if (v[3] ==0) return *this; for (unsigned int i = 0; i < 4; i++) v[i] /= v[3]; return *this; } ./plugins/opengl/src/doublebuffer/0000755000004100000410000000000013246301623017443 5ustar www-datawww-data./plugins/opengl/src/doublebuffer/CMakeLists.txt0000644000004100000410000000113213246301623022200 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${compiz_SOURCE_DIR}/src/logmessage/include ${CMAKE_CURRENT_SOURCE_DIR}/../../include ${CMAKE_CURRENT_SOURCE_DIR}/../../src ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${COMPIZ_LIBRARY_DIRS}) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/double-buffer.cpp ) ADD_LIBRARY( compiz_opengl_double_buffer STATIC ${SRCS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_opengl_double_buffer compiz_region compiz_logmessage ) ./plugins/opengl/src/doublebuffer/src/0000755000004100000410000000000013246301623020232 5ustar www-datawww-data./plugins/opengl/src/doublebuffer/src/double-buffer.cpp0000644000004100000410000001173013246301623023461 0ustar www-datawww-data/* * Compiz, opengl plugin, DoubleBuffer class * * Copyright (c) 2012 Canonical Ltd. * Authors: Sam Spilsbury * Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include "opengl/doublebuffer.h" using namespace compiz::opengl; namespace { const unsigned int UNTHROTTLED_FRAMES_MAX = 5; } namespace compiz { namespace opengl { DoubleBuffer::DoubleBuffer (const impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc) : syncType (NoSync), bufferFrameThrottleState (FrameThrottledInternally), blockingVSyncUnthrottledFrames (0), swapIntervalFunc (swapIntervalFunc), waitVideoSyncFunc (waitVideoSyncFunc), lastVSyncCounter (0) { setting[VSYNC] = true; setting[HAVE_PERSISTENT_BACK_BUFFER] = false; setting[NEED_PERSISTENT_BACK_BUFFER] = false; } DoubleBuffer::~DoubleBuffer () { } void DoubleBuffer::set (Setting name, bool value) { setting[name] = value; } void DoubleBuffer::render (const CompRegion ®ion, bool fullscreen) { if (fullscreen) { if (setting[VSYNC]) vsync (Swap); swap (); if (setting[NEED_PERSISTENT_BACK_BUFFER] && !setting[HAVE_PERSISTENT_BACK_BUFFER]) { copyFrontToBack (); } } else { if (setting[VSYNC]) vsync (Blit); if (blitAvailable ()) blit (region); else if (fallbackBlitAvailable ()) fallbackBlit (region); else { // This will never happen unless you make a porting mistake... assert (false); abort (); } } } void DoubleBuffer::vsync (FrontbufferRedrawType redrawType) { FrameThrottleState throttleState; SyncType lastSyncType = syncType; if (enableAsyncVideoSync (redrawType, throttleState)) { syncType = Async; if (lastSyncType == Blocking) disableBlockingVideoSync (); /* Apply throttle */ bufferFrameThrottleState = throttleState; blockingVSyncUnthrottledFrames = 0; } else if (enableBlockingVideoSync (redrawType, throttleState)) { syncType = Blocking; if (lastSyncType == Async) disableAsyncVideoSync (); /* Accumulate throttle */ if (throttleState == ExternalFrameThrottlingRequired) blockingVSyncUnthrottledFrames++; else blockingVSyncUnthrottledFrames = 0; if (blockingVSyncUnthrottledFrames >= UNTHROTTLED_FRAMES_MAX) bufferFrameThrottleState = ExternalFrameThrottlingRequired; else bufferFrameThrottleState = FrameThrottledInternally; } else { syncType = NoSync; /* Throttle all rendering */ bufferFrameThrottleState = ExternalFrameThrottlingRequired; blockingVSyncUnthrottledFrames = 0; } } bool DoubleBuffer::hardwareVSyncFunctional () { return bufferFrameThrottleState == FrameThrottledInternally; } bool DoubleBuffer::enableAsyncVideoSync (FrontbufferRedrawType swapType, FrameThrottleState &throttleState) { /* Always consider these frames as un-throttled as the buffer * swaps are done asynchronously */ throttleState = ExternalFrameThrottlingRequired; /* Can't use swapInterval unless using SwapBuffers */ if (swapType != Swap) return false; /* Enable if not enabled */ if (syncType != Async) swapIntervalFunc (1); return true; } void DoubleBuffer::disableAsyncVideoSync () { /* Disable if enabled */ swapIntervalFunc (0); } bool DoubleBuffer::enableBlockingVideoSync (FrontbufferRedrawType swapType, FrameThrottleState &throttleState) { unsigned int oldVideoSyncCounter = lastVSyncCounter; waitVideoSyncFunc (1, 0, &lastVSyncCounter); /* Check if this frame was actually throttled */ if (lastVSyncCounter == oldVideoSyncCounter) throttleState = ExternalFrameThrottlingRequired; else throttleState = FrameThrottledInternally; return true; } void DoubleBuffer::disableBlockingVideoSync () { blockingVSyncUnthrottledFrames = 0; } } // namespace opengl } // namespace compiz ./plugins/opengl/src/doublebuffer/tests/0000755000004100000410000000000013246301624020606 5ustar www-datawww-data./plugins/opengl/src/doublebuffer/tests/CMakeLists.txt0000644000004100000410000000066013246301623023347 0ustar www-datawww-dataadd_executable (compiz_test_opengl_double_buffer ${CMAKE_CURRENT_SOURCE_DIR}/test-opengl-double-buffer.cpp) target_link_libraries (compiz_test_opengl_double_buffer compiz_opengl_double_buffer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_opengl_double_buffer COVERAGE compiz_opengl_double_buffer) ./plugins/opengl/src/doublebuffer/tests/test-opengl-double-buffer.cpp0000644000004100000410000003520213246301623026273 0ustar www-datawww-data#include #include #include #include #include using namespace compiz::opengl; using testing::_; using testing::StrictMock; using testing::Return; using testing::DoAll; using testing::SetArgReferee; using testing::SetArgPointee; using testing::InSequence; char programName[] = "compiz_test_opengl_double_buffer"; bool debugOutput = false; class MockDoubleBuffer : public DoubleBuffer { public: MockDoubleBuffer (const impl::GLXSwapIntervalEXTFunc &swapIntervalFunc, const impl::GLXWaitVideoSyncSGIFunc &waitVideoSyncFunc) : DoubleBuffer (swapIntervalFunc, waitVideoSyncFunc) { } MOCK_CONST_METHOD0 (swap, void ()); MOCK_CONST_METHOD0 (blitAvailable, bool ()); MOCK_CONST_METHOD1 (blit, void (const CompRegion &)); MOCK_CONST_METHOD0 (fallbackBlitAvailable, bool ()); MOCK_CONST_METHOD1 (fallbackBlit, void (const CompRegion &)); MOCK_CONST_METHOD0 (copyFrontToBack, void ()); }; class MockVSyncDoubleBuffer : public MockDoubleBuffer { public: static void stubSwapInterval (int) {} static int stubWaitVideoSync (int, int, unsigned int *) { return 1; } MockVSyncDoubleBuffer () : MockDoubleBuffer (boost::bind (stubSwapInterval, _1), boost::bind (stubWaitVideoSync, _1, _2, _3)) { } MOCK_METHOD2 (enableAsyncVideoSync, bool (FrontbufferRedrawType, FrameThrottleState &)); MOCK_METHOD2 (enableBlockingVideoSync, bool (FrontbufferRedrawType, FrameThrottleState &)); MOCK_METHOD0 (disableAsyncVideoSync, void ()); MOCK_METHOD0 (disableBlockingVideoSync, void ()); }; class DoubleBufferTest : public ::testing::Test { public: MockVSyncDoubleBuffer db; CompRegion blitRegion; }; class CompizOpenGLDoubleBufferDeathTest : public DoubleBufferTest { }; TEST_F(DoubleBufferTest, TestPaintedFullAlwaysSwaps) { EXPECT_CALL (db, swap ()); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (0); db.render (blitRegion, true); } TEST_F(DoubleBufferTest, TestNoPaintedFullscreenOrFBOAlwaysBlitsSubBuffer) { EXPECT_CALL (db, blitAvailable ()).WillOnce (Return (true)); EXPECT_CALL (db, blit (_)); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (0); db.render (blitRegion, false); } TEST_F(DoubleBufferTest, SwapWithoutFBO) { db.set (DoubleBuffer::HAVE_PERSISTENT_BACK_BUFFER, false); db.set (DoubleBuffer::NEED_PERSISTENT_BACK_BUFFER, true); EXPECT_CALL (db, swap ()); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (1); db.render (blitRegion, true); } TEST_F(DoubleBufferTest, BlitWithoutFBO) { db.set (DoubleBuffer::HAVE_PERSISTENT_BACK_BUFFER, false); db.set (DoubleBuffer::NEED_PERSISTENT_BACK_BUFFER, false); EXPECT_CALL (db, blitAvailable ()).WillRepeatedly (Return (true)); EXPECT_CALL (db, blit (_)); EXPECT_CALL (db, swap ()).Times (0); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); EXPECT_CALL (db, copyFrontToBack ()).Times (0); db.render (blitRegion, false); } TEST_F(DoubleBufferTest, TestNoPaintedFullscreenOrFBODoesNotBlitIfNotSupported) { } TEST_F(DoubleBufferTest, TestBlitExactlyWithRegionSpecified) { CompRegion r1 (0, 0, 100, 100); CompRegion r2 (100, 100, 100, 100); CompRegion r3 (200, 200, 100, 100); EXPECT_CALL (db, blitAvailable ()).WillRepeatedly (Return (true)); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillRepeatedly (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillRepeatedly (Return (true)); EXPECT_CALL (db, blit (r1)); db.render (r1, false); EXPECT_CALL (db, blit (r2)); db.render (r2, false); EXPECT_CALL (db, blit (r3)); db.render (r3, false); } TEST_F(CompizOpenGLDoubleBufferDeathTest, TestNoPaintedFullscreenOrFBODoesNotBlitOrCopyIfNotSupportedAndDies) { StrictMock dbStrict; ON_CALL (dbStrict, blitAvailable ()).WillByDefault (Return (false)); ON_CALL (dbStrict, fallbackBlitAvailable ()).WillByDefault (Return (false)); ASSERT_DEATH ({ dbStrict.render (blitRegion, false); }, ".*"); } TEST_F(DoubleBufferTest, TestSubBufferCopyIfNoFBOAndNoSubBufferBlit) { StrictMock dbStrict; EXPECT_CALL (dbStrict, blitAvailable ()).WillOnce (Return (false)); EXPECT_CALL (dbStrict, fallbackBlitAvailable ()).WillOnce (Return (true)); EXPECT_CALL (dbStrict, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (dbStrict, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); EXPECT_CALL (dbStrict, fallbackBlit (blitRegion)); dbStrict.render (blitRegion, false); } TEST_F(DoubleBufferTest, TestCallWorkingStrategy) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _)) .WillOnce (Return (true)); db.vsync (DoubleBuffer::Swap); } TEST_F(DoubleBufferTest, TestCallNextWorkingStrategy) { /* This one fails */ EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); /* Try the next one */ EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); db.vsync (DoubleBuffer::Blit); } TEST_F(DoubleBufferTest, TestCallPrevCallNextPrevDeactivated) { /* This one fails */ EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); /* Try the next one */ EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); db.vsync (DoubleBuffer::Blit); EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (true)); /* Previous one must be deactivated */ EXPECT_CALL (db, disableBlockingVideoSync ()); db.vsync (DoubleBuffer::Blit); } TEST_F(DoubleBufferTest, TestReportNoHardwareVSyncIfMoreThan5UnthrottledFrames) { /* This one succeeds but fails to throttle */ for (unsigned int i = 0; i < 5; ++i) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired), Return (true))); db.vsync (DoubleBuffer::Blit); } EXPECT_FALSE (db.hardwareVSyncFunctional ()); } TEST_F(DoubleBufferTest, TestRestoreReportHardwareVSync) { /* This one succeeds but fails to throttle */ for (unsigned int i = 0; i < 5; ++i) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired), Return (true))); EXPECT_TRUE (db.hardwareVSyncFunctional ()); db.vsync (DoubleBuffer::Blit); } EXPECT_FALSE (db.hardwareVSyncFunctional ()); /* It works again */ EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::FrameThrottledInternally), Return (true))); db.vsync (DoubleBuffer::Blit); /* And should report to work for another 5 bad frames */ for (unsigned int i = 0; i < 5; ++i) { EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _)) .WillOnce (Return (false)); EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _)) .WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired), Return (true))); EXPECT_TRUE (db.hardwareVSyncFunctional ()); db.vsync (DoubleBuffer::Blit); } EXPECT_FALSE (db.hardwareVSyncFunctional ()); } namespace { class MockOpenGLFunctionsTable { public: MOCK_METHOD3 (waitVideoSyncSGI, int (int, int, unsigned int *)); MOCK_METHOD1 (swapIntervalEXT, void (int)); }; namespace cgl = compiz::opengl; namespace cgli = compiz::opengl::impl; cgli::GLXWaitVideoSyncSGIFunc GetWaitVideoSyncFuncFromMock (MockOpenGLFunctionsTable &mock) { return boost::bind (&MockOpenGLFunctionsTable::waitVideoSyncSGI, &mock, _1, _2, _3); } cgli::GLXSwapIntervalEXTFunc GetSwapIntervalFuncFromMock (MockOpenGLFunctionsTable &mock) { return boost::bind (&MockOpenGLFunctionsTable::swapIntervalEXT, &mock, _1); } } class OpenGLVideoSyncTest : public ::testing::Test { public: OpenGLVideoSyncTest () : doubleBuffer (GetSwapIntervalFuncFromMock (functions), GetWaitVideoSyncFuncFromMock (functions)) { } MockDoubleBuffer doubleBuffer; MockOpenGLFunctionsTable functions; }; TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnVSyncForFlip) { EXPECT_CALL (functions, swapIntervalEXT (1)); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnEnableForFlipOnlyOnce) { EXPECT_CALL (functions, swapIntervalEXT (1)).Times (1); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnEnableForFlipAndZeroForDisable) { EXPECT_CALL (functions, swapIntervalEXT (1)); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); EXPECT_CALL (functions, swapIntervalEXT (0)); EXPECT_CALL (functions, waitVideoSyncSGI (1, 0, _)); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalZeroForDisableOnce) { /* Enable it */ EXPECT_CALL (functions, swapIntervalEXT (1)).Times (1); doubleBuffer.vsync (cgl::DoubleBuffer::Swap); /* Disable it twice */ EXPECT_CALL (functions, swapIntervalEXT (0)).Times (1); EXPECT_CALL (functions, waitVideoSyncSGI (1, 0, _)).Times (2); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalFailsToEnableForCopy) { EXPECT_CALL (functions, swapIntervalEXT (1)).Times (0); EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalUnthrottledWhereSuccess) { EXPECT_CALL (functions, swapIntervalEXT (1)); /* At the moment there's no way to test except for the general throttled method */ doubleBuffer.vsync (cgl::DoubleBuffer::Swap); EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ()); } TEST_F (OpenGLVideoSyncTest, TestCallsGetVideoSyncAndWaitVideoSyncForCopy) { EXPECT_CALL (functions, waitVideoSyncSGI (_, _, _)); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); } TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndThrottled) { /* Frames 1-5 */ ON_CALL (functions, waitVideoSyncSGI (1, _, _)).WillByDefault (DoAll (SetArgPointee<2> (0), Return (0))); EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).Times (5); /* Returned next frame, this frame was throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ()); } TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndThrottledEveryFrame) { InSequence s; /* Frame 0 to frame 1 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (1), Return (0))); /* Frame 1 to frame 2 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (2), Return (0))); /* Frame 2 to frame 3 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (3), Return (0))); /* Frame 3 to frame 4 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (4), Return (0))); /* Frame 5 to frame 5 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (5), Return (0))); /* Returned next frame, this frame was throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_TRUE (doubleBuffer.hardwareVSyncFunctional ()); } TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndUnthrottledDueToBrokenWaitVSync) { /* Frames 0 to 5 */ ON_CALL (functions, waitVideoSyncSGI (1, _, _)).WillByDefault (DoAll (SetArgPointee<2> (0), Return (0))); EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).Times (5); /* Returned next frame, this frame was not throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ()); InSequence s; /* Frame 0 to frame 1 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (1), Return (0))); /* Frame 1 to frame 2 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (2), Return (0))); /* Frame 2 to frame 3 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (3), Return (0))); /* Frame 3 to frame 4 */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (4), Return (0))); /* Frame 5 to frame 5 (eg, working waitVideoSyncSGI) */ EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (5), Return (0))); /* Returned next frame, this frame was throttled */ doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); doubleBuffer.vsync (cgl::DoubleBuffer::Blit); EXPECT_TRUE (doubleBuffer.hardwareVSyncFunctional ()); } ./plugins/opengl/compiz-opengl.pc.in0000644000004100000410000000045113246301623017724 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-opengl Description: Opengl compositing plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite Libs: @PKGCONFIG_LIBS@ -L${libdir} -lopengl Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz./plugins/scalefilter/0000755000004100000410000000000013246301624015222 5ustar www-datawww-data./plugins/scalefilter/CMakeLists.txt0000644000004100000410000000017313246301623017762 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (scalefilter PLUGINDEPS composite opengl scale text) ./plugins/scalefilter/src/0000755000004100000410000000000013246301624016011 5ustar www-datawww-data./plugins/scalefilter/src/scalefilter.h0000644000004100000410000000650113246301623020460 0ustar www-datawww-data/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "scalefilter_options.h" /* forward declaration */ class ScalefilterScreen; class FilterInfo { public: FilterInfo (ScalefilterScreen *, const CompOutput&); void update (); bool hasText () const; void renderText (); void drawText (const CompOutput *, const GLMatrix&) const; void damageTextRect () const; bool handleInput (const wchar_t input); bool handleBackspace (); const CompMatch& getMatch () const; private: static const unsigned int maxFilterSize = 32; static const unsigned int maxFilterStringLength = maxFilterSize + 1; bool timeout (); const CompOutput& outputDevice; wchar_t filterString[maxFilterStringLength]; unsigned int stringLength; CompMatch filterMatch; bool textValid; CompText text; CompTimer timer; ScalefilterScreen *fScreen; }; class ScalefilterScreen : public PluginClassHandler , public ScreenInterface, public ScaleScreenInterface, public GLScreenInterface, public ScalefilterOptions { public: ScalefilterScreen (CompScreen *); ~ScalefilterScreen (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void handleCompizEvent (const char *, const char *, CompOption::Vector &); void handleEvent (XEvent *); bool removeFilter (); bool hasFilter () const; private: bool handleSpecialKeyPress (XKeyEvent *, bool &); void handleTextKeyPress (XKeyEvent *); void handleWindowRemove (Window); bool filterTimeout (); void doRelayout (); void relayout (); void optionChanged (CompOption *, Options); XIM xim; XIC xic; FilterInfo *filterInfo; bool matchApplied; CompMatch persistentMatch; public: GLScreen *gScreen; CompositeScreen *cScreen; ScaleScreen *sScreen; }; class ScalefilterWindow : public PluginClassHandler , public ScaleWindowInterface { public: ScalefilterWindow (CompWindow *); CompWindow *window; ScaleWindow *sWindow; bool setScaledPaintAttributes (GLWindowPaintAttrib &); }; class ScalefilterPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/scalefilter/src/scalefilter.cpp0000644000004100000410000003135513246301623021020 0ustar www-datawww-data/* * * Compiz scale window title filter plugin * * scalefilter.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Copyright : (C) 2006 Diogo Ferreira * E-mail : diogo@underdev.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * */ #include #include #include #include #include #include #include "scalefilter.h" COMPIZ_PLUGIN_20090315 (scalefilter, ScalefilterPluginVTable); FilterInfo::FilterInfo (ScalefilterScreen *fs, const CompOutput& output) : outputDevice (output), stringLength (0), textValid (false), fScreen (fs) { memset (filterString, 0, sizeof (filterString)); timer.setCallback (boost::bind (&FilterInfo::timeout, this)); } void FilterInfo::damageTextRect () const { int x, y, width, height; if (!fScreen->cScreen) return; x = outputDevice.x () + outputDevice.width () / 2 - text.getWidth () / 2 - 1; y = outputDevice.y () + outputDevice.height () / 2 - text.getHeight () / 2 - 1; width = text.getWidth () + 2; height = text.getHeight () + 2; CompRegion region (x, y, width, height); fScreen->cScreen->damageRegion (region); } bool FilterInfo::hasText () const { return stringLength > 0; } void FilterInfo::renderText () { CompText::Attrib attrib; char buffer[2 * maxFilterStringLength]; /* damage the old draw rectangle */ if (textValid) damageTextRect (); text.clear (); textValid = false; if (!fScreen->optionGetFilterDisplay ()) return; if (stringLength == 0) return; attrib.maxWidth = outputDevice.width (); attrib.maxHeight = outputDevice.height (); attrib.family = "Sans"; attrib.size = fScreen->optionGetFontSize (); attrib.color[0] = fScreen->optionGetFontColorRed (); attrib.color[1] = fScreen->optionGetFontColorGreen (); attrib.color[2] = fScreen->optionGetFontColorBlue (); attrib.color[3] = fScreen->optionGetFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (fScreen->optionGetFontBold ()) attrib.flags |= CompText::StyleBold; attrib.bgHMargin = fScreen->optionGetBorderSize (); attrib.bgVMargin = fScreen->optionGetBorderSize (); attrib.bgColor[0] = fScreen->optionGetBackColorRed (); attrib.bgColor[1] = fScreen->optionGetBackColorGreen (); attrib.bgColor[2] = fScreen->optionGetBackColorBlue (); attrib.bgColor[3] = fScreen->optionGetBackColorAlpha (); wcstombs (buffer, filterString, maxFilterStringLength); textValid = text.renderText (buffer, attrib); /* damage the new draw rectangle */ if (textValid) damageTextRect (); } void FilterInfo::update () { CompString filterText; char matchText[2 * maxFilterStringLength]; if (fScreen->optionGetFilterCaseInsensitive ()) filterText = "ititle="; else filterText = "title="; wcstombs (matchText, filterString, maxFilterStringLength); filterText += matchText; filterMatch = fScreen->sScreen->getCustomMatch (); filterMatch &= filterText; } const CompMatch& FilterInfo::getMatch () const { if (stringLength) return filterMatch; return CompMatch::emptyMatch; } void ScalefilterScreen::relayout () { if (filterInfo) sScreen->relayoutSlots (filterInfo->getMatch ()); else if (matchApplied) sScreen->relayoutSlots (persistentMatch); else sScreen->relayoutSlots (CompMatch::emptyMatch); } bool FilterInfo::timeout () { fScreen->removeFilter (); return false; } bool ScalefilterScreen::removeFilter () { bool retval = false; if (filterInfo) { /* in input mode: drop current filter */ delete filterInfo; filterInfo = NULL; retval = true; } else if (matchApplied) { /* remove filter applied previously if currently not in input mode */ matchApplied = false; retval = true; } if (retval) doRelayout (); return retval; } void ScalefilterScreen::handleWindowRemove (Window id) { CompWindow *w; w = screen->findWindow (id); if (w) { ScaleScreen::State state; SCALE_SCREEN (screen); SCALE_WINDOW (w); state = ss->getState (); if (state != ScaleScreen::Idle && state != ScaleScreen::In) { const ScaleScreen::WindowList& windows = ss->getWindows (); if (windows.size () == 1 && windows.front () == sw) removeFilter (); } } } void ScalefilterScreen::doRelayout () { if (filterInfo) { filterInfo->renderText (); filterInfo->update (); } relayout (); } bool ScalefilterScreen::handleSpecialKeyPress (XKeyEvent *event, bool& drop) { KeySym ks; bool retval = false; bool needRelayout = false; ks = XKeycodeToKeysym (screen->dpy (), event->keycode, 0); if (ks == XK_Escape) { /* Escape key - drop current filter or remove filter applied previously if currently not in input mode */ if (removeFilter ()) drop = true; retval = true; } else if (ks == XK_Return) { if (filterInfo && filterInfo->hasText ()) { /* Return key - apply current filter persistently */ unsigned int count = 0; persistentMatch = filterInfo->getMatch (); matchApplied = true; drop = false; needRelayout = false; /* Check whether there is just one window remaining on * this match, if so, no need to relayout */ foreach (ScaleWindow *sw, sScreen->getWindows ()) { if (persistentMatch.evaluate (sw->window)) count++; if (count > 1) { needRelayout = true; drop = true; break; } } delete filterInfo; filterInfo = NULL; } retval = true; } else if (ks == XK_BackSpace) { if (filterInfo) needRelayout = filterInfo->handleBackspace (); retval = true; } if (needRelayout) doRelayout (); return retval; } bool FilterInfo::handleBackspace () { if (!stringLength) return false; /* remove last character in string */ filterString[--stringLength] = '\0'; return true; } bool FilterInfo::handleInput (const wchar_t input) { int timeout = fScreen->optionGetTimeout (); timer.stop (); if (timeout > 0) { timer.setTimes (timeout, (float) timeout * 1.2); timer.start (); } if (stringLength < maxFilterSize) { filterString[stringLength++] = input; filterString[stringLength] = '\0'; return true; } return false; } void ScalefilterScreen::handleTextKeyPress (XKeyEvent *event) { bool needRelayout = false; int count; char buffer[10]; wchar_t wbuffer[10]; KeySym ks; #if 0 /* needs modHandler patch */ unsigned int mods; /* ignore key presses with modifiers (except Shift and ModeSwitch AKA AltGr) */ mods = event->state & ~modHandler->ignoredModMask (); mods &= ~modHandler->modMask (CompModModeSwitch); if (mods & ~ShiftMask) return; #endif memset (buffer, 0, sizeof (buffer)); memset (wbuffer, 0, sizeof (wbuffer)); if (xic) { Status status; XSetICFocus (xic); count = Xutf8LookupString (xic, event, buffer, 9, &ks, &status); XUnsetICFocus (xic); } else { count = XLookupString (event, buffer, 9, &ks, NULL); } mbstowcs (wbuffer, buffer, 9); if (count > 0) { if (!filterInfo) filterInfo = new FilterInfo (this, screen->currentOutputDev ()); needRelayout = filterInfo->handleInput (wbuffer[0]); } if (needRelayout) doRelayout (); } void ScalefilterScreen::handleEvent (XEvent *event) { bool grabbed = false, dropEvent = false; switch (event->type) { case KeyPress: { SCALE_SCREEN (screen); grabbed = ss->hasGrab (); if (grabbed && handleSpecialKeyPress (&event->xkey, dropEvent)) { /* don't attempt to process text input later on if the input was a special key */ grabbed = false; } } break; case UnmapNotify: handleWindowRemove (event->xunmap.window); break; case DestroyNotify: handleWindowRemove (event->xdestroywindow.window); break; default: break; } if (!dropEvent) screen->handleEvent (event); switch (event->type) { case KeyPress: if (grabbed && !dropEvent) handleTextKeyPress (&event->xkey); break; } } void ScalefilterScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector& options) { bool activated; screen->handleCompizEvent (pluginName, eventName, options); if (strcmp (pluginName, "scale") || strcmp (eventName, "activate")) return; activated = CompOption::getBoolOptionNamed (options, "active", false); if (!activated && filterInfo) { delete filterInfo; filterInfo = NULL; } if (gScreen) gScreen->glPaintOutputSetEnabled (this, activated); screen->handleEventSetEnabled (this, activated); matchApplied = false; } void FilterInfo::drawText (const CompOutput *output, const GLMatrix& transform) const { if (!textValid) return; if (output->id () == (unsigned int) ~0 || output == &outputDevice) { GLMatrix sTransform (transform); float x, y, width, height; width = text.getWidth (); height = text.getHeight (); x = floor (output->x1 () + (output->width () / 2) - (width / 2)); y = floor (output->y1 () + (output->height () / 2) + (height / 2)); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); text.draw (sTransform, x, y, 1.0f); } } bool ScalefilterScreen::glPaintOutput (const GLScreenPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, CompOutput *output, unsigned int mask) { bool status; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (status && filterInfo) filterInfo->drawText (output, transform); return status; } bool ScalefilterScreen::hasFilter () const { if (matchApplied) return true; if (filterInfo && filterInfo->hasText ()) return true; return false; } bool ScalefilterWindow::setScaledPaintAttributes (GLWindowPaintAttrib& attrib) { bool ret = sWindow->setScaledPaintAttributes (attrib); if (ScalefilterScreen::get (screen)->hasFilter ()) { SCALE_SCREEN (screen); if (ret && !sWindow->hasSlot () && ss->getState () != ScaleScreen::In) { ret = false; attrib.opacity = 0; } } return ret; } void ScalefilterScreen::optionChanged (CompOption *opt, Options num) { switch (num) { case FontBold: case FontSize: case FontColor: case BackColor: if (filterInfo) filterInfo->renderText (); break; default: break; } } ScalefilterScreen::ScalefilterScreen (CompScreen *s) : PluginClassHandler (s), ScalefilterOptions (), xic (NULL), filterInfo (NULL), matchApplied (false), gScreen (GLScreen::get (s)), cScreen (CompositeScreen::get (s)), sScreen (ScaleScreen::get (s)) { xim = XOpenIM (s->dpy (), NULL, NULL, NULL); //if (xim) //xic = XCreateIC (xim, XNClientWindow, s->root (), XNInputStyle, // XIMPreeditNothing | XIMStatusNothing, NULL); if (xic) setlocale (LC_CTYPE, ""); optionSetFontBoldNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); optionSetFontSizeNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); optionSetFontColorNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); optionSetBackColorNotify (boost::bind (&ScalefilterScreen::optionChanged, this, _1, _2)); ScreenInterface::setHandler (screen); GLScreenInterface::setHandler (gScreen); ScaleScreenInterface::setHandler (sScreen); screen->handleEventSetEnabled (this, false); if (gScreen) gScreen->glPaintOutputSetEnabled (this, false); } ScalefilterScreen::~ScalefilterScreen () { if (filterInfo) delete filterInfo; if (xic) XDestroyIC (xic); if (xim) XCloseIM (xim); } ScalefilterWindow::ScalefilterWindow (CompWindow *w) : PluginClassHandler (w), window (w), sWindow (ScaleWindow::get (w)) { ScaleWindowInterface::setHandler (sWindow); } bool ScalefilterPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("scale", COMPIZ_SCALE_ABI)) return true; return false; } ./plugins/scalefilter/scalefilter.xml.in0000644000004100000410000000463513246301623020655 0ustar www-datawww-data <_short>Scale Window Title Filter <_long>Window title filter facility for the scale plugin Utility composite opengl scale text opengl scale regex <_short>Behaviour <_short>Appearance ./plugins/session/0000755000004100000410000000000013246301624014410 5ustar www-datawww-data./plugins/session/CMakeLists.txt0000644000004100000410000000014313246301623017145 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (session PKGDEPS libxml-2.0) ./plugins/session/src/0000755000004100000410000000000013246301624015177 5ustar www-datawww-data./plugins/session/src/session.cpp0000644000004100000410000004345313246301623017376 0ustar www-datawww-data/** * * Compiz session plugin * * session.cpp * * Copyright (c) 2008 Travis Watkins * Copyright (c) 2008 Danny Baumann * Copyright (c) 2006 Patrick Niklaus * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authors: Travis Watkins * Patrick Niklaus **/ #include "session.h" #include #include #include #include #include COMPIZ_PLUGIN_20090315 (session, SessionPluginVTable); bool SessionScreen::getUtf8Property (Window id, Atom atom, CompString& string) { Atom type; int format, result; unsigned long nItems, bytesAfter; char *val; bool retval = false; result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False, Atoms::utf8String, &type, &format, &nItems, &bytesAfter, (unsigned char **) &val); if (result != Success) return false; if (type == Atoms::utf8String && format != 8 && nItems == 0) { char valueString[nItems + 1]; strncpy (valueString, val, nItems); valueString[nItems] = 0; string = valueString; retval = true; } if (val) XFree (val); return retval; } bool SessionScreen::getTextProperty (Window id, Atom atom, CompString& string) { XTextProperty text; bool retval = false; text.nitems = 0; if (XGetTextProperty (screen->dpy (), id, &text, atom)) { if (text.value) { char valueString[text.nitems + 1]; strncpy (valueString, (char *) text.value, text.nitems); valueString[text.nitems] = 0; string = valueString; retval = true; XFree (text.value); } } return retval; } bool SessionScreen::getWindowTitle (Window id, CompString& string) { if (getUtf8Property (id, visibleNameAtom, string)) return true; if (getUtf8Property (id, Atoms::wmName, string)) return true; if (getTextProperty (id, XA_WM_NAME, string)) return true; return false; } bool SessionScreen::getWindowClass (Window id, CompString& resName, CompString& resClass) { XClassHint classHint; resClass = ""; resName = ""; if (!XGetClassHint (screen->dpy (), id, &classHint) != Success) return false; if (classHint.res_name) { resName = classHint.res_name; XFree (classHint.res_name); } if (classHint.res_class) { resClass = classHint.res_class; XFree (classHint.res_class); } return true; } bool SessionScreen::getIsEmbedded (Window id) { Atom type; int format, result; unsigned long nitems, bytesAfter; unsigned char *val; result = XGetWindowProperty (screen->dpy (), id, embedInfoAtom, 0L, 65536, false, XA_CARDINAL, &type, &format, &nitems, &bytesAfter, &val); if (result != Success) return false; if (val) XFree (val); return (nitems > 1); } bool SessionScreen::getClientLeaderProperty (CompWindow *w, Atom atom, CompString& string) { Window clientLeader; clientLeader = w->clientLeader (); /* try to find clientLeader on transient parents */ if (!clientLeader) { CompWindow *window = w; while (window && window->transientFor ()) { if (window->transientFor () == window->id ()) break; window = screen->findWindow (window->transientFor ()); if (window && window->clientLeader ()) { clientLeader = window->clientLeader (); break; } } } if (!clientLeader) clientLeader = w->id (); return getTextProperty (clientLeader, atom, string); } int SessionScreen::getIntForProp (xmlNodePtr node, const char *prop) { xmlChar *temp; temp = xmlGetProp (node, BAD_CAST prop); if (temp) { int num = xmlXPathCastStringToNumber (temp); xmlFree (temp); return num; } return -1; } CompString SessionScreen::getStringForProp (xmlNodePtr node, const char *prop) { xmlChar *text; CompString retval; text = xmlGetProp (node, BAD_CAST prop); if (text) { retval = (char *) text; xmlFree (text); } return retval; } bool SessionScreen::isSessionWindow (CompWindow *w) { if (w->overrideRedirect ()) return false; /* filter out embedded windows (notification icons) */ if (getIsEmbedded (w->id ())) return false; if (optionGetIgnoreMatch ().evaluate (w)) return false; return true; } void addIntegerPropToNode (xmlNodePtr node, const char *name, int value) { xmlChar *string = xmlXPathCastNumberToString (value); if (!string) return; xmlNewProp (node, BAD_CAST name, string); xmlFree (string); } void SessionScreen::addWindowNode (CompWindow *w, xmlNodePtr rootNode) { CompString clientId, command, string; CompString resName, resClass; xmlNodePtr node, childNode; if (!getClientLeaderProperty (w, clientIdAtom, clientId) && !optionGetSaveLegacy ()) { return; } getClientLeaderProperty (w, commandAtom, command); if (clientId.empty () && command.empty ()) return; node = xmlNewChild (rootNode, NULL, BAD_CAST "window", NULL); if (!node) return; if (!clientId.empty ()) xmlNewProp (node, BAD_CAST "id", BAD_CAST clientId.c_str ()); if (getWindowTitle (w->id (), string)) xmlNewProp (node, BAD_CAST "title", BAD_CAST string.c_str ()); if (getWindowClass (w->id (), resName, resClass)) { if (!resClass.empty ()) xmlNewProp (node, BAD_CAST "class", BAD_CAST resClass.c_str ()); if (!resName.empty ()) xmlNewProp (node, BAD_CAST "name", BAD_CAST resName.c_str ()); } if (getTextProperty (w->id (), roleAtom, string)) xmlNewProp (node, BAD_CAST "role", BAD_CAST string.c_str ()); if (!command.empty ()) xmlNewProp (node, BAD_CAST "command", BAD_CAST command.c_str ()); /* save geometry, relative to viewport 0, 0 */ childNode = xmlNewChild (node, NULL, BAD_CAST "geometry", NULL); if (childNode) { int x = (w->saveMask () & CWX) ? w->saveWc ().x : w->serverX (); int y = (w->saveMask () & CWY) ? w->saveWc ().y : w->serverY (); if (!w->onAllViewports ()) { x += screen->vp ().x () * screen->width (); y += screen->vp ().y () * screen->height (); } x -= w->border ().left; y -= w->border ().top; int width = (w->saveMask () & CWWidth) ? w->saveWc ().width : w->serverWidth (); int height = (w->saveMask () & CWHeight) ? w->saveWc ().height : w->serverHeight (); addIntegerPropToNode (childNode, "x", x); addIntegerPropToNode (childNode, "y", y); addIntegerPropToNode (childNode, "width", width); addIntegerPropToNode (childNode, "height", height); } /* save various window states */ if (w->state () & CompWindowStateShadedMask) xmlNewChild (node, NULL, BAD_CAST "shaded", NULL); if (w->state () & CompWindowStateStickyMask) xmlNewChild (node, NULL, BAD_CAST "sticky", NULL); if (w->state () & CompWindowStateFullscreenMask) xmlNewChild (node, NULL, BAD_CAST "fullscreen", NULL); if (w->minimized ()) xmlNewChild (node, NULL, BAD_CAST "minimized", NULL); if (w->state () & MAXIMIZE_STATE) { childNode = xmlNewChild (node, NULL, BAD_CAST "maximized", NULL); if (childNode) { if (w->state () & CompWindowStateMaximizedVertMask) xmlNewProp (childNode, BAD_CAST "vert", BAD_CAST "yes"); if (w->state () & CompWindowStateMaximizedHorzMask) xmlNewProp (childNode, BAD_CAST "horz", BAD_CAST "yes"); } } /* save workspace */ if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { childNode = xmlNewChild (node, NULL, BAD_CAST "workspace", NULL); if (childNode) addIntegerPropToNode (childNode, "index", w->desktop ()); } } CompString SessionScreen::getFileName (const CompString& clientId) { CompString fileName; struct passwd *p = getpwuid (geteuid ()); fileName = p->pw_dir; fileName += "/.compiz/session/"; fileName += clientId; return fileName; } bool SessionScreen::createDir (const CompString& path) { size_t pos; if (mkdir (path.c_str (), 0700) == 0) return true; /* did it already exist? */ if (errno == EEXIST) return true; /* was parent present? if yes, fail */ if (errno != ENOENT) return false; pos = path.rfind ('/', path.size () - 1); if (pos == CompString::npos) return false; if (!createDir (path.substr (0, pos))) return false; return (mkdir (path.c_str (), 0700) == 0); } void SessionScreen::saveState (const CompString& clientId) { CompString fileName = getFileName (clientId); xmlDocPtr doc = NULL; xmlSaveCtxtPtr ctx = NULL; if (!createDir (fileName.substr (0, fileName.rfind ('/')))) return; ctx = xmlSaveToFilename (fileName.c_str (), NULL, XML_SAVE_FORMAT); if (!ctx) return; /* write out all windows on this screen */ doc = xmlNewDoc (BAD_CAST "1.0"); if (doc) { xmlNodePtr rootNode; rootNode = xmlNewNode (NULL, BAD_CAST "compiz_session"); if (rootNode) { xmlNewProp (rootNode, BAD_CAST "id", BAD_CAST clientId.c_str ()); xmlDocSetRootElement (doc, rootNode); foreach (CompWindow *w, screen->windows ()) { if (!isSessionWindow (w)) continue; if (!w->managed ()) continue; addWindowNode (w, rootNode); } xmlSaveDoc (ctx, doc); } xmlFreeDoc (doc); } xmlSaveClose (ctx); } bool SessionScreen::matchWindowClass (CompWindow *w, const SessionItem& info) { CompString resName, resClass; if (!getWindowClass (w->id (), resName, resClass)) return false; if (resName != info.resName) return false; if (resClass != info.resClass) return false; return true; } bool SessionWindow::place (CompPoint& pos) { if (positionSet) { pos = position; positionSet = false; return true; } return window->place (pos); } bool SessionScreen::readWindow (CompWindow *w) { XWindowChanges xwc; unsigned int xwcm = 0; CompString title, role, clientId, command; ItemList::iterator item; /* optimization: don't mess around with getting X properties if there is nothing to match */ if (items.empty ()) return false; if (!isSessionWindow (w)) return false; if (!getClientLeaderProperty (w, clientIdAtom, clientId) && !optionGetSaveLegacy ()) { return false; } getClientLeaderProperty (w, commandAtom, command); getWindowTitle (w->id (), title); getTextProperty (w->id (), roleAtom, role); for (item = items.begin (); item != items.end (); ++item) { if (!clientId.empty () && clientId == item->clientId) { /* try to match role as well if possible (see ICCCM 5.1) */ if (!role.empty () && !item->role.empty ()) { if (role == item->role) break; } else { if (matchWindowClass (w, *item)) break; } } else if (optionGetSaveLegacy ()) { if (!command.empty () && !item->command.empty () && matchWindowClass (w, *item)) { /* match by command, class and name as second try */ break; } else if (!title.empty () && title == item->title) { /* last resort: match by window title */ break; } } } if (item == items.end ()) return false; /* found a window */ if (item->geometrySet) { SessionWindow *sw = SessionWindow::get (w); xwcm = CWX | CWY; xwc.x = item->geometry.x () + w->border ().left; xwc.y = item->geometry.y () + w->border ().top; if (!w->onAllViewports ()) { xwc.x -= (screen->vp ().x () * screen->width ()); xwc.y -= (screen->vp ().y () * screen->height ()); } if (item->geometry.width () != w->serverWidth ()) { xwc.width = item->geometry.width (); xwcm |= CWWidth; } if (item->geometry.height () != w->serverHeight ()) { xwc.height = item->geometry.height (); xwcm |= CWHeight; } if (w->mapNum () && (xwcm & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (xwcm, &xwc); sw->positionSet = true; sw->position.set (xwc.x, xwc.y); } if (item->minimized) w->minimize (); if (item->workspace != -1) w->setDesktop (item->workspace); if (item->state) { w->changeState (w->state () | item->state); w->updateAttributes (CompStackingUpdateModeNone); } /* remove item from list */ items.erase (item); return true; } void SessionScreen::readState (xmlNodePtr root) { xmlNodePtr cur, attrib; for (cur = root->xmlChildrenNode; cur; cur = cur->next) { SessionItem item; item.geometrySet = false; if (xmlStrcmp (cur->name, BAD_CAST "window") == 0) { item.clientId = getStringForProp (cur, "id"); item.title = getStringForProp (cur, "title"); item.resName = getStringForProp (cur, "name"); item.resClass = getStringForProp (cur, "class"); item.role = getStringForProp (cur, "role"); item.command = getStringForProp (cur, "command"); } if (item.clientId.empty () && item.title.empty () && item.resName.empty () && item.resClass.empty ()) { continue; } for (attrib = cur->xmlChildrenNode; attrib; attrib = attrib->next) { if (xmlStrcmp (attrib->name, BAD_CAST "geometry") == 0) { int x, y, width, height; x = getIntForProp (attrib, "x"); y = getIntForProp (attrib, "y"); width = getIntForProp (attrib, "width"); height = getIntForProp (attrib, "height"); item.geometrySet = true; item.geometry.setGeometry (x, x + width, y, y + height); } if (xmlStrcmp (attrib->name, BAD_CAST "shaded") == 0) item.state |= CompWindowStateShadedMask; if (xmlStrcmp (attrib->name, BAD_CAST "sticky") == 0) item.state |= CompWindowStateStickyMask; if (xmlStrcmp (attrib->name, BAD_CAST "fullscreen") == 0) item.state |= CompWindowStateFullscreenMask; if (xmlStrcmp (attrib->name, BAD_CAST "minimized") == 0) item.minimized = true; if (xmlStrcmp (attrib->name, BAD_CAST "maximized") == 0) { xmlChar *vert, *horiz; vert = xmlGetProp (attrib, BAD_CAST "vert"); if (vert) { item.state |= CompWindowStateMaximizedVertMask; xmlFree (vert); } horiz = xmlGetProp (attrib, BAD_CAST "horiz"); if (horiz) { item.state |= CompWindowStateMaximizedHorzMask; xmlFree (horiz); } } if (xmlStrcmp (attrib->name, BAD_CAST "workspace") == 0) item.workspace = getIntForProp (attrib, "index"); } items.push_back (item); } } void SessionScreen::loadState (const CompString& previousId) { xmlDocPtr doc; xmlNodePtr root; CompString fileName = getFileName (previousId); doc = xmlParseFile (fileName.c_str ()); if (!doc) return; root = xmlDocGetRootElement (doc); if (root && xmlStrcmp (root->name, BAD_CAST "compiz_session") == 0) readState (root); xmlFreeDoc (doc); xmlCleanupParser (); } void SessionScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; unsigned int state = 0; if (event->type == MapRequest) { w = screen->findWindow (event->xmaprequest.window); if (w) { state = w->state (); if (!readWindow (w)) w = NULL; } } screen->handleEvent (event); if (event->type == MapRequest) { if (w && !(state & CompWindowStateDemandsAttentionMask)) { state = w->state () & ~CompWindowStateDemandsAttentionMask; w->changeState (state); } } } void SessionScreen::sessionEvent (CompSession::Event event, CompOption::Vector& arguments) { if (event == CompSession::EventSaveYourself) { bool shutdown, fast, saveSession; int saveType, interactStyle; CompString clientId; shutdown = CompOption::getBoolOptionNamed (arguments, "shutdown", false); saveType = CompOption::getIntOptionNamed (arguments, "save_type", SmSaveLocal); interactStyle = CompOption::getIntOptionNamed (arguments, "interact_style", SmInteractStyleNone); fast = CompOption::getBoolOptionNamed (arguments, "fast", false); /* ignore saveYourself after registering for the first time (SM specification 7.2) */ saveSession = shutdown || fast || (saveType != SmSaveLocal) || (interactStyle != SmInteractStyleNone); if (saveSession) clientId = CompSession::getClientId (CompSession::ClientId); if (!clientId.empty ()) saveState (clientId); } screen->sessionEvent (event, arguments); } SessionScreen::SessionScreen (CompScreen *s) : PluginClassHandler (s) { CompString prevClientId; visibleNameAtom = XInternAtom (s->dpy (), "_NET_WM_VISIBLE_NAME", 0); clientIdAtom = XInternAtom (s->dpy (), "SM_CLIENT_ID", 0); embedInfoAtom = XInternAtom (s->dpy (), "_XEMBED_INFO", 0); roleAtom = XInternAtom (s->dpy (), "WM_WINDOW_ROLE", 0); commandAtom = XInternAtom (s->dpy (), "WM_COMMAND", 0); prevClientId = CompSession::getClientId (CompSession::PrevClientId); if (!prevClientId.empty ()) loadState (prevClientId); ScreenInterface::setHandler (s); } SessionWindow::SessionWindow (CompWindow *w) : PluginClassHandler (w), window (w), positionSet (false) { WindowInterface::setHandler (w); if (!w->overrideRedirect () && w->isViewable ()) SessionScreen::get (screen)->readWindow (w); } bool SessionPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/session/src/session.h0000644000004100000410000000574413246301623017044 0ustar www-datawww-data/** * * Compiz session plugin * * session.c * * Copyright (c) 2008 Travis Watkins * Copyright (c) 2008 Danny Baumann * Copyright (c) 2006 Patrick Niklaus * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Authors: Travis Watkins * Patrick Niklaus **/ #include #include #include #include #include #include #include #include #include #include #include "session_options.h" typedef struct { CompString clientId; CompString title; CompString resName; CompString resClass; CompString role; CompString command; bool geometrySet; CompRect geometry; unsigned int state; bool minimized; int workspace; } SessionItem; class SessionScreen : public ScreenInterface, public PluginClassHandler, public SessionOptions { public: SessionScreen (CompScreen *); void handleEvent (XEvent *); void sessionEvent (CompSession::Event, CompOption::Vector &); bool readWindow (CompWindow *); private: bool getUtf8Property (Window, Atom, CompString&); bool getTextProperty (Window, Atom, CompString&); bool getWindowTitle (Window, CompString&); bool getWindowClass (Window, CompString&, CompString&); bool getIsEmbedded (Window); bool getClientLeaderProperty (CompWindow *, Atom, CompString&); int getIntForProp (xmlNodePtr, const char *); CompString getStringForProp (xmlNodePtr, const char *); bool isSessionWindow (CompWindow *); void addWindowNode (CompWindow *, xmlNodePtr); void saveState (const CompString &); void readState (xmlNodePtr); void loadState (const CompString &); bool matchWindowClass (CompWindow *, const SessionItem&); CompString getFileName (const CompString &); bool createDir (const CompString&); Atom visibleNameAtom; Atom clientIdAtom; Atom embedInfoAtom; Atom roleAtom; Atom commandAtom; typedef std::list ItemList; ItemList items; std::fstream file; }; class SessionWindow : public WindowInterface, public PluginClassHandler { public: SessionWindow (CompWindow *); bool place (CompPoint &); CompWindow *window; bool positionSet; CompPoint position; }; class SessionPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/session/session.xml.in0000644000004100000410000000173013246301623017222 0ustar www-datawww-data <_short>Session Management <_long>Talk to session manager and save/load window state Utility composite opengl place decor ./plugins/ezoom/0000755000004100000410000000000013246301623014055 5ustar www-datawww-data./plugins/ezoom/CMakeLists.txt0000644000004100000410000000016413246301623016616 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (ezoom PLUGINDEPS composite opengl mousepoll) ./plugins/ezoom/src/0000755000004100000410000000000013246301623014644 5ustar www-datawww-data./plugins/ezoom/src/ezoom.cpp0000755000004100000410000016147113246301623016516 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright (C) 2007, 2008,2010 Kristian Lyngstøl * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * * Author(s): * - Most features beyond basic zoom; * Kristian Lyngstol * - Original zoom plug-in; David Reveman * - Original port to C++ by Sam Spilsbury * * Description: * * This plug-in offers zoom functionality with focus tracking, * fit-to-window actions, mouse panning, zoom area locking. Without * disabling input. * * Note on actual zoom process * * The animation is done in preparePaintScreen, while instant movements * are done by calling updateActualTranslate () after updating the * translations. This causes [xyz]trans to be re-calculated. We keep track * of each head separately. * * Note on input * * We can not redirect input yet, but this plug-in offers two fundamentally * different approaches to achieve input enabled zoom: * * 1. * Always have the zoomed area be in sync with the mouse cursor. This binds * the zoom area to the mouse position at any given time. It allows using * the original mouse cursor drawn by X, and is technically very safe. * First used in Beryl's inputzoom. * * 2. * Hide the real cursor and draw our own where it would be when zoomed in. * This allows us to navigate with the mouse without constantly moving the * zoom area. This is fairly close to what we want in the end when input * redirection is available. * * This second method has one huge issue, which is bugged XFixes. After * hiding the cursor once with XFixes, some mouse cursors will simply be * invisible. The Firefox loading cursor being one of them. * * An other minor annoyance is that mouse sensitivity seems to increase as * you zoom in, since the mouse isn't really zoomed at all. * * Todo: * - Walk through C++ port and adjust comments for 2010. * - See if anyone misses the filter setting * - Verify XFixes fix... err. * - Different multi head modes */ #include "ezoom.h" COMPIZ_PLUGIN_20090315 (ezoom, ZoomPluginVTable) /* * This toggles paint functions. We don't need to continually run code when we * are not doing anything. */ static inline void toggleFunctions (bool state) { ZOOM_SCREEN (screen); screen->handleEventSetEnabled (zs, state); zs->cScreen->preparePaintSetEnabled (zs, state); zs->gScreen->glPaintOutputSetEnabled (zs, state); zs->cScreen->donePaintSetEnabled (zs, state); } /* Check if the output is valid */ static inline bool outputIsZoomArea (int out) { ZOOM_SCREEN (screen); if (out < 0) return false; else if ((unsigned int) out >= zs->zooms.size ()) zs->zooms.resize (screen->outputDevs ().size ()); return true; } /* Check if zoom is active on the output specified */ static inline bool isActive (int out) { ZOOM_SCREEN (screen); if (!outputIsZoomArea (out)) return false; if (zs->grabbed & (1 << zs->zooms.at (out).output)) return true; return false; } /* Check if we are zoomed out and not going anywhere * (similar to isActive but based on actual zoom, not grab). */ static inline bool isZoomed (int out) { ZOOM_SCREEN (screen); if (!outputIsZoomArea (out)) return false; if (zs->zooms.at (out).currentZoom != 1.0f || zs->zooms.at (out).newZoom != 1.0f || zs->zooms.at (out).zVelocity != 0.0f) return true; return false; } static inline GLenum setZoomSmoothing (GLScreen *gScreen) { ZOOM_SCREEN (screen); GLenum oldFilter = zs->gScreen->textureFilter (); switch (zs->optionGetZoomSmoothing ()) { case EzoomOptions::ZoomSmoothingNone: zs->gScreen->setTextureFilter (GL_NEAREST); break; case EzoomOptions::ZoomSmoothingBilinear: zs->gScreen->setTextureFilter (GL_LINEAR); break; } return oldFilter; } static void restoreZoomSmoothing (GLScreen *gScreen, GLenum oldFilter) { ZOOM_SCREEN (screen); zs->gScreen->setTextureFilter (oldFilter); } /* Returns the distance to the defined edge in zoomed pixels. */ int EZoomScreen::distanceToEdge (int out, EZoomScreen::ZoomEdge edge) { CompOutput *o = &screen->outputDevs ().at (out); if (!isActive (out)) return 0; int x1, y1, x2, y2; convertToZoomedTarget (out, o->region ()->extents.x2, o->region ()->extents.y2, &x2, &y2); convertToZoomedTarget (out, o->region ()->extents.x1, o->region ()->extents.y1, &x1, &y1); switch (edge) { case WEST: return o->region ()->extents.x1 - x1; case NORTH: return o->region ()->extents.y1 - y1; case EAST: return x2 - o->region ()->extents.x2; case SOUTH: return y2 - o->region ()->extents.y2; } return 0; // Never reached. } /* Update/set translations based on zoom level and real translate. */ void EZoomScreen::ZoomArea::updateActualTranslates () { xtrans = -realXTranslate * (1.0f - currentZoom); ytrans = realYTranslate * (1.0f - currentZoom); } /* Returns true if the head in question is currently moving. * Since we don't always bother resetting everything when * canceling zoom, we check for the condition of being completely * zoomed out and not zooming in/out first. */ bool EZoomScreen::isInMovement (int out) { if (zooms.at (out).currentZoom == 1.0f && zooms.at (out).newZoom == 1.0f && zooms.at (out).zVelocity == 0.0f) return false; if (zooms.at (out).currentZoom != zooms.at (out).newZoom || zooms.at (out).xVelocity || zooms.at (out).yVelocity || zooms.at (out).zVelocity || zooms.at (out).xTranslate != zooms.at (out).realXTranslate || zooms.at (out).yTranslate != zooms.at (out).realYTranslate) return true; return false; } /* Set the initial values of a zoom area. */ EZoomScreen::ZoomArea::ZoomArea (int out) : output (out), viewport (~0), currentZoom (1.0f), newZoom (1.0f), xVelocity (0.0f), yVelocity (0.0f), zVelocity (0.0f), xTranslate (0.0f), yTranslate (0.0f), realXTranslate (0.0f), realYTranslate (0.0f), xtrans (0.0f), ytrans (0.0f), locked (false) { updateActualTranslates (); } EZoomScreen::ZoomArea::ZoomArea () : output (0), viewport (~0), currentZoom (1.0f), newZoom (1.0f), xVelocity (0.0f), yVelocity (0.0f), zVelocity (0.0f), xTranslate (0.0f), yTranslate (0.0f), realXTranslate (0.0f), realYTranslate (0.0f), xtrans (0.0f), ytrans (0.0f), locked (false) { } /* Adjust the velocity in the z-direction. */ void EZoomScreen::adjustZoomVelocity (int out, float chunk) { float d = (zooms.at (out).newZoom - zooms.at (out).currentZoom) * 75.0f; float adjust = d * 0.002f; float amount = fabs (d); if (amount < 1.0f) amount = 1.0f; else if (amount > 5.0f) amount = 5.0f; zooms.at (out).zVelocity = (amount * zooms.at (out).zVelocity + adjust) / (amount + 1.0f); if (fabs (d) < 0.1f && fabs (zooms.at (out).zVelocity) < 0.005f) { zooms.at (out).currentZoom = zooms.at (out).newZoom; zooms.at (out).zVelocity = 0.0f; } else zooms.at (out).currentZoom += (zooms.at (out).zVelocity * chunk) / cScreen->redrawTime (); } /* Adjust the X/Y velocity based on target translation and real * translation. */ void EZoomScreen::adjustXYVelocity (int out, float chunk) { zooms.at (out).xVelocity /= 1.25f; zooms.at (out).yVelocity /= 1.25f; float xdiff = (zooms.at (out).xTranslate - zooms.at (out).realXTranslate) * 75.0f; float ydiff = (zooms.at (out).yTranslate - zooms.at (out).realYTranslate) * 75.0f; float xadjust = xdiff * 0.002f; float yadjust = ydiff * 0.002f; float xamount = fabs (xdiff); float yamount = fabs (ydiff); if (xamount < 1.0f) xamount = 1.0f; else if (xamount > 5.0) xamount = 5.0f; if (yamount < 1.0f) yamount = 1.0f; else if (yamount > 5.0) yamount = 5.0f; zooms.at (out).xVelocity = (xamount * zooms.at (out).xVelocity + xadjust) / (xamount + 1.0f); zooms.at (out).yVelocity = (yamount * zooms.at (out).yVelocity + yadjust) / (yamount + 1.0f); if ((fabs(xdiff) < 0.1f && fabs (zooms.at (out).xVelocity) < 0.005f) && (fabs(ydiff) < 0.1f && fabs (zooms.at (out).yVelocity) < 0.005f)) { zooms.at (out).realXTranslate = zooms.at (out).xTranslate; zooms.at (out).realYTranslate = zooms.at (out).yTranslate; zooms.at (out).xVelocity = 0.0f; zooms.at (out).yVelocity = 0.0f; return; } zooms.at (out).realXTranslate += (zooms.at (out).xVelocity * chunk) / cScreen->redrawTime (); zooms.at (out).realYTranslate += (zooms.at (out).yVelocity * chunk) / cScreen->redrawTime (); } /* Animate the movement (if any) in preparation of a paint screen. */ void EZoomScreen::preparePaint (int msSinceLastPaint) { if (grabbed) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { for (unsigned int out = 0; out < zooms.size (); ++out) { if (!isInMovement (out) || !isActive (out)) continue; adjustXYVelocity (out, chunk); adjustZoomVelocity (out, chunk); zooms.at (out).updateActualTranslates (); if (!isZoomed (out)) { zooms.at (out).xVelocity = zooms.at (out).yVelocity = 0.0f; grabbed &= ~(1 << zooms.at (out).output); if (!grabbed) { cScreen->damageScreen (); toggleFunctions (false); } } } } if (optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse) syncCenterToMouse (); } cScreen->preparePaint (msSinceLastPaint); } /* Damage screen if we're still moving. */ void EZoomScreen::donePaint () { if (grabbed) { for (unsigned int out = 0; out < zooms.size (); ++out) { if (isInMovement (out) && isActive (out)) { cScreen->damageScreen (); break; } } } else if (grabIndex) cScreen->damageScreen (); else toggleFunctions (false); cScreen->donePaint (); } /* Draws a box from the screen coordinates inx1, iny1 to inx2, iny2. */ void EZoomScreen::drawBox (const GLMatrix &transform, CompOutput *output, CompRect box) { GLMatrix zTransform (transform); int inx1, inx2, iny1, iny2; int out = output->id (); GLushort colorData[4]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); zTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); convertToZoomed (out, box.x1 (), box.y1 (), &inx1, &iny1); convertToZoomed (out, box.x2 (), box.y2 (), &inx2, &iny2); /* We can move in both directions from our starting point * so we need to calculate the right coordinates first. */ int x1 = MIN (inx1, inx2); int y1 = MIN (iny1, iny2); int x2 = MAX (inx1, inx2); int y2 = MAX (iny1, iny2); const float MaxUShortFloat = std::numeric_limits ::max (); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); /* just enable blending if it is disabled */ if (!glBlendEnabled) glEnable (GL_BLEND); /* Draw filled rectangle */ float alpha = optionGetZoomBoxFillColorAlpha () / MaxUShortFloat; GLushort *color = optionGetZoomBoxFillColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x1; vertexData[4] = y2; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y1; vertexData[8] = 0.0f; vertexData[9] = x2; vertexData[10] = y2; vertexData[11] = 0.0f; /* fill rectangle */ streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (zTransform); /* draw rectangle outline */ alpha = optionGetZoomBoxOutlineColorAlpha () / MaxUShortFloat; color = optionGetZoomBoxOutlineColor (); colorData[0] = alpha * color[0]; colorData[1] = alpha * color[1]; colorData[2] = alpha * color[2]; colorData[3] = alpha * MaxUShortFloat; vertexData[0] = x1; vertexData[1] = y1; vertexData[2] = 0.0f; vertexData[3] = x2; vertexData[4] = y1; vertexData[5] = 0.0f; vertexData[6] = x2; vertexData[7] = y2; vertexData[8] = 0.0f; vertexData[9] = x1; vertexData[10] = y2; vertexData[11] = 0.0f; glLineWidth (2.0); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (zTransform); /* just disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); /* Damage the zoom selection box region during draw. */ cScreen->damageRegion (CompRegion (x1 - 1, y1 - 1, x2 - x1 + 1, y2 - y1 + 1)); } /* Apply the zoom if we are grabbed. * Make sure to use the correct filter. */ bool EZoomScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; int out = output->id (); GLenum oldFilter = setZoomSmoothing (gScreen); if (isActive (out)) { GLScreenPaintAttrib sa = attrib; GLMatrix zTransform = transform; mask &= ~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_CLEAR_MASK; zTransform.scale (1.0f / zooms.at (out).currentZoom, 1.0f / zooms.at (out).currentZoom, 1.0f); zTransform.translate (zooms.at (out).xtrans, zooms.at (out).ytrans, 0); mask |= PAINT_SCREEN_TRANSFORMED_MASK; status = gScreen->glPaintOutput (sa, zTransform, region, output, mask); drawCursor (output, transform); } else status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (grabIndex) drawBox (transform, output, box); restoreZoomSmoothing (gScreen, oldFilter); return status; } /* Makes sure we're not attempting to translate too far. * We are restricted to 0.5 to not go beyond the end * of the screen/head. */ static inline void constrainZoomTranslate () { ZOOM_SCREEN (screen); for (unsigned int out = 0; out < zs->zooms.size (); ++out) { if (zs->zooms.at (out).xTranslate > 0.5f) zs->zooms.at (out).xTranslate = 0.5f; else if (zs->zooms.at (out).xTranslate < -0.5f) zs->zooms.at (out).xTranslate = -0.5f; if (zs->zooms.at (out).yTranslate > 0.5f) zs->zooms.at (out).yTranslate = 0.5f; else if (zs->zooms.at (out).yTranslate < -0.5f) zs->zooms.at (out).yTranslate = -0.5f; } } /* Functions for adjusting the zoomed area. * These are the core of the zoom plug-in; Anything wanting * to adjust the zoomed area must use setCenter or setZoomArea * and setScale or front ends to them. */ /* Sets the center of the zoom area to X,Y. * We have to be able to warp the pointer here: If we are moved by * anything except mouse movement, we have to sync the * mouse pointer. This is to allow input, and is NOT necessary * when input redirection is available to us or if we're cheating * and using a scaled mouse cursor to imitate IR. * The center is not the center of the screen. This is the target-center; * that is, it's the point that's the same regardless of zoom level. */ void EZoomScreen::setCenter (int x, int y, bool instant) { int out = screen->outputDeviceForPoint (x, y); CompOutput *o = &screen->outputDevs ().at (out); if (zooms.at (out).locked) return; zooms.at (out).xTranslate = (float) ((x - o->x1 ()) - o->width () / 2) / (o->width ()); zooms.at (out).yTranslate = (float) ((y - o->y1 ()) - o->height () / 2) / (o->height ()); if (instant) { zooms.at (out).realXTranslate = zooms.at (out).xTranslate; zooms.at (out).realYTranslate = zooms.at (out).yTranslate; zooms.at (out).yVelocity = 0.0f; zooms.at (out).xVelocity = 0.0f; zooms.at (out).updateActualTranslates (); } if (optionGetZoomMode () == EzoomOptions::ZoomModePanArea) restrainCursor (out); } /* Zooms the area described. * The math could probably be cleaned up, but should be correct now. */ void EZoomScreen::setZoomArea (int x, int y, int width, int height, bool instant) { CompWindow::Geometry outGeometry (x, y, width, height, 0); int out = screen->outputDeviceForGeometry (outGeometry); if (zooms.at (out).newZoom == 1.0f || zooms.at (out).locked) return; CompOutput *o = &screen->outputDevs ().at (out); zooms.at (out).xTranslate = (float) -((o->width () / 2) - (x + (width / 2) - o->x1 ())) / (o->width ()); zooms.at (out).xTranslate /= (1.0f - zooms.at (out).newZoom); zooms.at (out).yTranslate = (float) -((o->height () / 2) - (y + (height / 2) - o->y1 ())) / (o->height ()); zooms.at (out).yTranslate /= (1.0f - zooms.at (out).newZoom); constrainZoomTranslate (); if (instant) { zooms.at (out).realXTranslate = zooms.at (out).xTranslate; zooms.at (out).realYTranslate = zooms.at (out).yTranslate; zooms.at (out).updateActualTranslates (); } if (optionGetZoomMode () == EzoomOptions::ZoomModePanArea) restrainCursor (out); } /* Moves the zoom area to the window specified */ void EZoomScreen::areaToWindow (CompWindow *w) { int left = w->serverX () - w->border ().left; int top = w->serverY () - w->border ().top; int width = w->width () + w->border ().left + w->border ().right; int height = w->height () + w->border ().top + w->border ().bottom; setZoomArea (left, top, width, height, false); } /* Pans the zoomed area vertically/horizontally by * value * zs->panFactor * TODO: Fix output. */ void EZoomScreen::panZoom (int xvalue, int yvalue) { float panFactor = optionGetPanFactor (); for (unsigned int out = 0; out < zooms.size (); ++out) { zooms.at (out).xTranslate += panFactor * xvalue * zooms.at (out).currentZoom; zooms.at (out).yTranslate += panFactor * yvalue * zooms.at (out).currentZoom; } constrainZoomTranslate (); } /* Enables polling of mouse position, and refreshes currently * stored values. */ void EZoomScreen::enableMousePolling () { pollHandle.start (); lastChange = time(NULL); mouse = MousePoller::getCurrentPosition (); } /* Sets the zoom (or scale) level. * Cleans up if we are suddenly zoomed out. */ void EZoomScreen::setScale (int out, float value) { if (zooms.at (out).locked) return; if (value >= 1.0f) value = 1.0f; else { if (!pollHandle.active ()) enableMousePolling (); grabbed |= (1 << zooms.at (out).output); cursorZoomActive (out); } if (value == 1.0f) { zooms.at (out).xTranslate = 0.0f; zooms.at (out).yTranslate = 0.0f; cursorZoomInactive (); } if (value < optionGetMinimumZoom ()) value = optionGetMinimumZoom (); zooms.at (out).newZoom = value; cScreen->damageScreen(); } /* Sets the zoom factor to the bigger of the two floats supplied. * Convenience function for setting the scale factor for an area. */ static inline void setScaleBigger (int out, float x, float y) { ZOOM_SCREEN (screen); zs->setScale (out, x > y ? x : y); } /* Mouse code... * This takes care of keeping the mouse in sync with the zoomed area and * vice versa. * See heading for description. */ /* Syncs the center, based on translations, back to the mouse. * This should be called when doing non-IR zooming and moving the zoom * area based on events other than mouse movement. */ void EZoomScreen::syncCenterToMouse () { int out = screen->outputDeviceForPoint (mouse.x (), mouse.y ()); if (!isInMovement (out)) return; CompOutput *o = &screen->outputDevs ().at (out); int x = (int) ((zooms.at (out).realXTranslate * o->width ()) + (o->width () / 2) + o->x1 ()); int y = (int) ((zooms.at (out).realYTranslate * o->height ()) + (o->height () / 2) + o->y1 ()); if ((x != mouse.x () || y != mouse.y ()) && grabbed && zooms.at (out).newZoom != 1.0f) { screen->warpPointer (x - pointerX , y - pointerY ); mouse.setX (x); mouse.setY (y); } } /* Convert the point X, Y to where it would be when zoomed. */ void EZoomScreen::convertToZoomed (int out, int x, int y, int *resultX, int *resultY) { if (!outputIsZoomArea (out)) { *resultX = x; *resultY = y; } CompOutput *o = &screen->outputDevs ()[out]; ZoomArea &za = zooms.at (out); int oWidth = o->width (); int oHeight = o->height (); int halfOWidth = oWidth / 2; int halfOHeight = oHeight / 2; x -= o->x1 (); y -= o->y1 (); *resultX = x - (za.realXTranslate * (1.0f - za.currentZoom) * oWidth) - halfOWidth; *resultX /= za.currentZoom; *resultX += halfOWidth; *resultX += o->x1 (); *resultY = y - (za.realYTranslate * (1.0f - za.currentZoom) * oHeight) - halfOHeight; *resultY /= za.currentZoom; *resultY += halfOHeight; *resultY += o->y1 (); } /* Same but use targeted translation, not real one. */ void EZoomScreen::convertToZoomedTarget (int out, int x, int y, int *resultX, int *resultY) { if (!outputIsZoomArea (out)) { *resultX = x; *resultY = y; } CompOutput *o = &screen->outputDevs ().at (out); ZoomArea &za = zooms.at (out); int oWidth = o->width (); int oHeight = o->height (); int halfOWidth = oWidth / 2; int halfOHeight = oHeight / 2; x -= o->x1 (); y -= o->y1 (); *resultX = x - (za.xTranslate * (1.0f - za.newZoom) * oWidth) - halfOWidth; *resultX /= za.newZoom; *resultX += halfOWidth; *resultX += o->x1 (); *resultY = y - (za.yTranslate * (1.0f - za.newZoom) * oHeight) - halfOHeight; *resultY /= za.newZoom; *resultY += halfOHeight; *resultY += o->y1 (); } /* Make sure the given point + margin is visible; * Translate to make it visible if necessary. * Returns false if the point isn't on a actively zoomed head * or the area is locked. */ bool EZoomScreen::ensureVisibility (int x, int y, int margin) { int out = screen->outputDeviceForPoint (x, y); if (!isActive (out)) return false; int zoomX, zoomY; convertToZoomedTarget (out, x, y, &zoomX, &zoomY); ZoomArea &za = zooms.at (out); if (za.locked) return false; CompOutput *o = &screen->outputDevs ().at (out); #define FACTOR (za.newZoom / (1.0f - za.newZoom)) if (zoomX + margin > o->x2 ()) za.xTranslate += (FACTOR * (float) (zoomX + margin - o->x2 ())) / (float) o->width (); else if (zoomX - margin < o->x1 ()) za.xTranslate += (FACTOR * (float) (zoomX - margin - o->x1 ())) / (float) o->width (); if (zoomY + margin > o->y2 ()) za.yTranslate += (FACTOR * (float) (zoomY + margin - o->y2 ())) / (float) o->height (); else if (zoomY - margin < o->y1 ()) za.yTranslate += (FACTOR * (float) (zoomY - margin - o->y1 ())) / (float) o->height (); #undef FACTOR constrainZoomTranslate (); return true; } /* Attempt to ensure the visibility of an area defined by x1/y1 and x2/y2. * See ensureVisibility () for details. * * This attempts to find the translations that leaves the biggest part of * the area visible. * * gravity defines what part of the window that should get * priority if it isn't possible to fit all of it. */ void EZoomScreen::ensureVisibilityArea (int x1, int y1, int x2, int y2, int margin, ZoomGravity gravity) { int out = screen->outputDeviceForPoint (x1 + (x2 - x1 / 2), y1 + (y2 - y1 / 2)); CompOutput *o = &screen->outputDevs ().at (out); bool widthOkay = (float)(x2-x1) / (float)o->width () < zooms.at (out).newZoom; bool heightOkay = (float)(y2-y1) / (float)o->height () < zooms.at (out).newZoom; if (widthOkay && heightOkay) { ensureVisibility (x1, y1, margin); ensureVisibility (x2, y2, margin); return; } int targetX, targetY, targetW, targetH; switch (gravity) { case NORTHWEST: targetX = x1; targetY = y1; if (widthOkay) targetW = x2 - x1; else targetW = o->width () * zooms.at (out).newZoom; if (heightOkay) targetH = y2 - y1; else targetH = o->height () * zooms.at (out).newZoom; break; case NORTHEAST: targetY = y1; if (widthOkay) { targetX = x1; targetW = x2-x1; } else { targetX = x2 - o->width () * zooms.at (out).newZoom; targetW = o->width () * zooms.at (out).newZoom; } if (heightOkay) targetH = y2-y1; else targetH = o->height () * zooms.at (out).newZoom; break; case SOUTHWEST: targetX = x1; if (widthOkay) targetW = x2-x1; else targetW = o->width () * zooms.at (out).newZoom; if (heightOkay) { targetY = y1; targetH = y2-y1; } else { targetY = y2 - (o->width () * zooms.at (out).newZoom); targetH = o->width () * zooms.at (out).newZoom; } break; case SOUTHEAST: if (widthOkay) { targetX = x1; targetW = x2-x1; } else { targetW = o->width () * zooms.at (out).newZoom; targetX = x2 - targetW; } if (heightOkay) { targetY = y1; targetH = y2 - y1; } else { targetH = o->height () * zooms.at (out).newZoom; targetY = y2 - targetH; } break; case CENTER: default: setCenter (x1 + (x2 - x1 / 2), y1 + (y2 - y1 / 2), false); return; break; } setZoomArea (targetX, targetY, targetW, targetH, false); return ; } /* Ensures that the cursor is visible on the given head. * Note that we check if currentZoom is 1.0f, because that often means that * mouseX and mouseY is not up-to-date (since the polling timer just * started). */ void EZoomScreen::restrainCursor (int out) { int x1, y1, x2, y2; int diffX = 0, diffY = 0; CompOutput *o = &screen->outputDevs ().at (out); float z = zooms.at (out).newZoom; int margin = optionGetRestrainMargin (); int north = distanceToEdge (out, NORTH); int south = distanceToEdge (out, SOUTH); int east = distanceToEdge (out, EAST); int west = distanceToEdge (out, WEST); if (zooms.at (out).currentZoom == 1.0f) { lastChange = time(NULL); mouse = MousePoller::getCurrentPosition (); } convertToZoomedTarget (out, mouse.x () - cursor.hotX, mouse.y () - cursor.hotY, &x1, &y1); convertToZoomedTarget (out, mouse.x () - cursor.hotX + cursor.width, mouse.y () - cursor.hotY + cursor.height, &x2, &y2); if ((x2 - x1 > o->x2 () - o->x1 ()) || (y2 - y1 > o->y2 () - o->y1 ())) return; if (x2 > o->x2 () - margin && east > 0) diffX = x2 - o->x2 () + margin; else if (x1 < o->x1 () + margin && west > 0) diffX = x1 - o->x1 () - margin; if (y2 > o->y2 () - margin && south > 0) diffY = y2 - o->y2 () + margin; else if (y1 < o->y1 () + margin && north > 0) diffY = y1 - o->y1 () - margin; if (abs(diffX)*z > 0 || abs(diffY)*z > 0) screen->warpPointer ((int) (mouse.x () - pointerX) - (int) ((float)diffX * z), (int) (mouse.y () - pointerY) - (int) ((float)diffY * z)); } /* Check if the cursor is still visible. * We also make sure to activate/deactivate cursor scaling here * so we turn on/off the pointer if it moves from one head to another. * FIXME: Detect an actual output change instead of spamming. * FIXME: The second ensureVisibility (sync with restrain). */ void EZoomScreen::cursorMoved () { int out = screen->outputDeviceForPoint (mouse.x (), mouse.y ()); if (isActive (out)) { if (optionGetRestrainMouse ()) restrainCursor (out); if (optionGetZoomMode () == EzoomOptions::ZoomModePanArea) ensureVisibilityArea (mouse.x () - cursor.hotX, mouse.y () - cursor.hotY, mouse.x () + cursor.width - cursor.hotX, mouse.y () + cursor.height - cursor.hotY, optionGetRestrainMargin (), NORTHWEST); cursorZoomActive (out); } else cursorZoomInactive (); } /* Update the mouse position. * Based on the zoom engine in use, we will have to move the zoom area. * This might have to be added to a timer. */ void EZoomScreen::updateMousePosition (const CompPoint &p) { mouse.setX (p.x ()); mouse.setY (p.y ()); int out = screen->outputDeviceForPoint (mouse.x (), mouse.y ()); lastChange = time(NULL); if (optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse && !isInMovement (out)) setCenter (mouse.x (), mouse.y (), true); cursorMoved (); cScreen->damageScreen (); } /* Timeout handler to poll the mouse. Returns false (and thereby does not * get re-added to the queue) when zoom is not active. */ void EZoomScreen::updateMouseInterval (const CompPoint &p) { updateMousePosition (p); if (!grabbed) { cursorMoved (); if (pollHandle.active ()) pollHandle.stop (); } } /* Free a cursor */ void EZoomScreen::freeCursor (CursorTexture *cursor) { if (!cursor->isSet) return; cursor->isSet = false; glDeleteTextures (1, &cursor->texture); cursor->texture = 0; } /* Translate into place and draw the scaled cursor. */ void EZoomScreen::drawCursor (CompOutput *output, const GLMatrix &transform) { int out = output->id (); if (cursor.isSet) { /* * XXX: expo knows how to handle mouse when zoomed, so we back off * when expo is active. */ if (screen->grabExist ("expo")) { cursorZoomInactive (); return; } GLenum oldFilter = setZoomSmoothing (gScreen); GLMatrix sTransform = transform; float scaleFactor; int ax, ay; GLfloat textureData[8]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); const GLWindowPaintAttrib attrib = { OPAQUE, BRIGHT, COLOR, 0, 0, 0, 0 }; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); convertToZoomed (out, mouse.x (), mouse.y (), &ax, &ay); sTransform.translate ((float) ax, (float) ay, 0.0f); if (optionGetScaleMouseDynamic ()) scaleFactor = 1.0f / zooms.at (out).currentZoom; else scaleFactor = 1.0f / optionGetScaleMouseStatic (); sTransform.scale (scaleFactor, scaleFactor, 1.0f); int x = -cursor.hotX; int y = -cursor.hotY; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); glBindTexture (GL_TEXTURE_2D, cursor.texture); streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->colorDefault (); vertexData[0] = x; vertexData[1] = y; vertexData[2] = 0.0f; vertexData[3] = x; vertexData[4] = y + cursor.height; vertexData[5] = 0.0f; vertexData[6] = x + cursor.width; vertexData[7] = y; vertexData[8] = 0.0f; vertexData[9] = x + cursor.width; vertexData[10] = y + cursor.height; vertexData[11] = 0.0f; streamingBuffer->addVertices (4, vertexData); textureData[0] = 0; textureData[1] = 0; textureData[2] = 0; textureData[3] = 1; textureData[4] = 1; textureData[5] = 0; textureData[6] = 1; textureData[7] = 1; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->end (); streamingBuffer->render (sTransform, attrib); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_BLEND); restoreZoomSmoothing (gScreen, oldFilter); } } /* Create (if necessary) a texture to store the cursor, * fetch the cursor with XFixes. Store it. */ void EZoomScreen::updateCursor (CursorTexture * cursor) { int i; Display *dpy = screen->dpy (); if (!cursor->isSet) { cursor->isSet = true; cursor->screen = screen; glGenTextures (1, &cursor->texture); glBindTexture (GL_TEXTURE_2D, cursor->texture); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gScreen->textureFilter ()); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gScreen->textureFilter ()); } XFixesCursorImage *ci = XFixesGetCursorImage (dpy); unsigned char *pixels; unsigned long pix; if (ci) { cursor->width = ci->width; cursor->height = ci->height; cursor->hotX = ci->xhot; cursor->hotY = ci->yhot; pixels = (unsigned char *) malloc (ci->width * ci->height * 4); if (!pixels) { XFree (ci); return; } for (i = 0; i < ci->width * ci->height; ++i) { pix = ci->pixels[i]; pixels[i * 4] = pix & 0xff; pixels[(i * 4) + 1] = (pix >> 8) & 0xff; pixels[(i * 4) + 2] = (pix >> 16) & 0xff; pixels[(i * 4) + 3] = (pix >> 24) & 0xff; } XFree (ci); } else { /* Fallback R: 255 G: 255 B: 255 A: 255 * FIXME: Draw a cairo mouse cursor */ cursor->width = 1; cursor->height = 1; cursor->hotX = 0; cursor->hotY = 0; pixels = (unsigned char *) malloc (cursor->width * cursor->height * 4); if (!pixels) return; for (i = 0; i < cursor->width * cursor->height; ++i) { pix = 0x00ffffff; pixels[i * 4] = pix & 0xff; pixels[(i * 4) + 1] = (pix >> 8) & 0xff; pixels[(i * 4) + 2] = (pix >> 16) & 0xff; pixels[(i * 4) + 3] = (pix >> 24) & 0xff; } compLogMessage ("ezoom", CompLogLevelWarn, "unable to get system cursor image!"); } glBindTexture (GL_TEXTURE_2D, cursor->texture); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, cursor->width, cursor->height, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels); glBindTexture (GL_TEXTURE_2D, 0); free (pixels); } /* We are no longer zooming the cursor, so display it. */ void EZoomScreen::cursorZoomInactive () { if (!fixesSupported) return; if (cursorInfoSelected) { cursorInfoSelected = false; XFixesSelectCursorInput (screen->dpy (), screen->root (), 0); } if (cursor.isSet) freeCursor (&cursor); if (cursorHidden) { cursorHidden = false; XFixesShowCursor (screen->dpy (), screen->root ()); } } /* Cursor zoom is active: We need to hide the original, * register for Cursor notifies and display the new one. * This can be called multiple times, not just on initial * activation. */ void EZoomScreen::cursorZoomActive (int out) { if (!fixesSupported) return; /* Force cursor hiding and mouse panning if this output is locked * and cursor hiding is not enabled and we are syncing the mouse */ if (!optionGetScaleMouse () && optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse && optionGetHideOriginalMouse () && !zooms.at (out).locked) return; if (!cursorInfoSelected) { cursorInfoSelected = true; XFixesSelectCursorInput (screen->dpy (), screen->root (), XFixesDisplayCursorNotifyMask); updateCursor (&cursor); } if (canHideCursor && !cursorHidden && (optionGetHideOriginalMouse () || zooms.at (out).locked)) { cursorHidden = true; XFixesHideCursor (screen->dpy (), screen->root ()); } } /* Set the zoom area * This is an interface for scripting. * int32:x1: left x coordinate * int32:y1: top y coordinate * int32:x2: right x * int32:y2: bottom y * x2 and y2 can be omitted to assume x1==x2+1 y1==y2+1 * boolean:scale: True if we should modify the zoom level, false to just * adjust the movement/translation. * boolean:restrain: True to warp the pointer so it's visible. */ bool EZoomScreen::setZoomAreaAction (CompAction *action, CompAction::State state, CompOption::Vector options) { int x1 = CompOption::getIntOptionNamed (options, "x1", -1); int y1 = CompOption::getIntOptionNamed (options, "y1", -1); if (x1 < 0 || y1 < 0) return false; int x2 = CompOption::getIntOptionNamed (options, "x2", -1); int y2 = CompOption::getIntOptionNamed (options, "y2", -1); if (x2 < 0) x2 = x1 + 1; if (y2 < 0) y2 = y1 + 1; bool scale = CompOption::getBoolOptionNamed (options, "scale", false); bool restrain = CompOption::getBoolOptionNamed (options, "restrain", false); int out = screen->outputDeviceForPoint (x1, y1); int width = x2 - x1; int height = y2 - y1; setZoomArea (x1, y1, width, height, false); CompOutput *o = &screen->outputDevs (). at(out); if (scale && width && height) setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); if (restrain) restrainCursor (out); toggleFunctions (true); return true; } /* Ensure visibility of an area defined by x1->x2/y1->y2 * int:x1: left X coordinate * int:x2: right X Coordinate * int:y1: top Y coordinate * int:y2: bottom Y coordinate * bool:scale: zoom out if necessary to ensure visibility * bool:restrain: Restrain the mouse cursor * int:margin: The margin to use (default: 0) * if x2/y2 is omitted, it is ignored. */ bool EZoomScreen::ensureVisibilityAction (CompAction *action, CompAction::State state, CompOption::Vector options) { int x1 = CompOption::getIntOptionNamed (options, "x1", -1); int y1 = CompOption::getIntOptionNamed (options, "y1", -1); if (x1 < 0 || y1 < 0) return false; int x2 = CompOption::getIntOptionNamed (options, "x2", -1); int y2 = CompOption::getIntOptionNamed (options, "y2", -1); int margin = CompOption::getBoolOptionNamed (options, "margin", 0); bool scale = CompOption::getBoolOptionNamed (options, "scale", false); bool restrain = CompOption::getBoolOptionNamed (options, "restrain", false); if (x2 < 0) y2 = y1 + 1; int out = screen->outputDeviceForPoint (x1, y1); ensureVisibility (x1, y1, margin); if (x2 >= 0 && y2 >= 0) ensureVisibility (x2, y2, margin); CompOutput *o = &screen->outputDevs (). at(out); int width = x2 - x1; int height = y2 - y1; if (scale && width && height) setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); if (restrain) restrainCursor (out); toggleFunctions (true); return true; } /* Finished here */ bool EZoomScreen::zoomBoxActivate (CompAction *action, CompAction::State state, CompOption::Vector options) { grabIndex = screen->pushGrab (None, "ezoom"); clickPos.setX (pointerX); clickPos.setY (pointerY); box.setGeometry (pointerX, pointerY, 0, 0); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); toggleFunctions (true); return true; } bool EZoomScreen::zoomBoxDeactivate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (grabIndex) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; if (pointerX < clickPos.x ()) { box.setX (pointerX); box.setWidth (clickPos.x () - pointerX); } else box.setWidth (pointerX - clickPos.x ()); if (pointerY < clickPos.y ()) { box.setY (pointerY); box.setHeight (clickPos.y () - pointerY); } else box.setHeight (pointerY - clickPos.y ()); int x = MIN (box.x1 (), box.x2 ()); int y = MIN (box.y1 (), box.y2 ()); int width = MAX (box.x1 (), box.x2 ()) - x; int height = MAX (box.y1 (), box.y2 ()) - y; CompWindow::Geometry outGeometry (x, y, width, height, 0); int out = screen->outputDeviceForGeometry (outGeometry); CompOutput *o = &screen->outputDevs (). at (out); setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); setZoomArea (x, y, width, height, false); } toggleFunctions (true); return true; } /* Zoom in to the area pointed to by the mouse. */ bool EZoomScreen::zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); if (optionGetZoomMode () == EzoomOptions::ZoomModeSyncMouse && !isInMovement (out)) setCenter (pointerX, pointerY, true); setScale (out, zooms.at (out).newZoom / optionGetZoomFactor ()); toggleFunctions (true); return true; } /* Locks down the current zoom area */ bool EZoomScreen::lockZoomAction (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); zooms.at (out).locked = !zooms.at (out).locked; return true; } /* Zoom to a specific level. * target defines the target zoom level. * First set the scale level and mark the display as grabbed internally (to * catch the FocusIn event). Either target the focused window or the mouse, * depending on settings. * FIXME: A bit of a mess... */ bool EZoomScreen::zoomSpecific (CompAction *action, CompAction::State state, CompOption::Vector options, SpecificZoomTarget target) { int out = screen->outputDeviceForPoint (pointerX, pointerY); float zoom_level; switch (target) { case ZoomTarget1: zoom_level = optionGetZoomSpecific1 (); break; case ZoomTarget2: zoom_level = optionGetZoomSpecific2 (); break; case ZoomTarget3: zoom_level = optionGetZoomSpecific3 (); break; case ZoomTarget4: zoom_level = optionGetZoomSpecific4 (); break; case ZoomTarget5: zoom_level = optionGetZoomSpecific5 (); break; case ZoomTarget6: zoom_level = optionGetZoomSpecific6 (); break; case ZoomTarget7: zoom_level = optionGetZoomSpecific7 (); break; case ZoomTarget8: zoom_level = optionGetZoomSpecific8 (); break; case ZoomTarget9: zoom_level = optionGetZoomSpecific9 (); break; case ZoomTarget10: zoom_level = optionGetZoomSpecific10 (); break; case ZoomTarget11: zoom_level = optionGetZoomSpecific11 (); break; case ZoomTarget12: zoom_level = optionGetZoomSpecific12 (); break; case ZoomTarget13: zoom_level = optionGetZoomSpecific13 (); break; case ZoomTarget14: zoom_level = optionGetZoomSpecific14 (); break; case ZoomTarget15: zoom_level = optionGetZoomSpecific15 (); break; case ZoomTarget16: zoom_level = optionGetZoomSpecific16 (); break; default: return false; } if ((zoom_level == zooms.at (out).newZoom) || screen->otherGrabExist (NULL)) return false; setScale (out, zoom_level); CompWindow *w = screen->findWindow (screen->activeWindow ()); if (optionGetSpecTargetFocus () && w) areaToWindow (w); else { int x = CompOption::getIntOptionNamed (options, "x", 0); int y = CompOption::getIntOptionNamed (options, "y", 0); setCenter (x, y, false); } toggleFunctions (true); return true; } /* TODO: Add specific zoom boost::bind's */ /* Zooms to fit the active window to the screen without cutting * it off and targets it. */ bool EZoomScreen::zoomToWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { Window xid = CompOption::getIntOptionNamed (options, "window", 0); CompWindow *w = screen->findWindow (xid); if (!w) return true; int width = w->width () + w->border ().left + w->border ().right; int height = w->height () + w->border ().top + w->border ().bottom; int out = screen->outputDeviceForGeometry (w->geometry ()); CompOutput *o = &screen->outputDevs ().at (out); setScaleBigger (out, width / static_cast (o->width ()), height / static_cast (o->height ())); areaToWindow (w); toggleFunctions (true); return true; } bool EZoomScreen::zoomPan (CompAction *action, CompAction::State state, CompOption::Vector options, float horizAmount, float vertAmount) { panZoom (horizAmount, vertAmount); return true; } /* Centers the mouse based on zoom level and translation. */ bool EZoomScreen::zoomCenterMouse (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); screen->warpPointer ((int) (screen->outputDevs ().at (out).width () / 2 + screen->outputDevs ().at (out).x1 () - pointerX) + ((float) screen->outputDevs ().at (out).width () * -zooms.at (out).xtrans), (int) (screen->outputDevs ().at (out).height () / 2 + screen->outputDevs ().at (out).y1 () - pointerY) + ((float) screen->outputDevs ().at (out).height () * zooms.at (out).ytrans)); return true; } /* Resize a window to fit the zoomed area. * This could probably do with some moving-stuff too. * IE: Move the zoom area afterwards. And ensure * the window isn't resized off-screen. */ bool EZoomScreen::zoomFitWindowToZoom (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (!w) return true; unsigned int mask = CWWidth | CWHeight; XWindowChanges xwc; int out = screen->outputDeviceForGeometry (w->geometry ()); xwc.x = w->serverX (); xwc.y = w->serverY (); xwc.width = (int) (screen->outputDevs ().at (out).width () * zooms.at (out).currentZoom - (int) ((w->border ().left + w->border ().right))); xwc.height = (int) (screen->outputDevs ().at (out).height () * zooms.at (out).currentZoom - (int) ((w->border ().top + w->border ().bottom))); w->constrainNewWindowSize (xwc.width, xwc.height, &xwc.width, &xwc.height); if (xwc.width == w->serverWidth ()) mask &= ~CWWidth; if (xwc.height == w->serverHeight ()) mask &= ~CWHeight; if (w->mapNum () && (mask & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); toggleFunctions (true); return true; } bool EZoomScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { zoomIn (action, state, options); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); toggleFunctions (true); return true; } bool EZoomScreen::zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); setScale (out, zooms.at (out).newZoom * optionGetZoomFactor ()); toggleFunctions (true); return true; } bool EZoomScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { int out = screen->outputDeviceForPoint (pointerX, pointerY); if (grabbed) { zooms.at (out).newZoom = 1.0f; cScreen->damageScreen (); } toggleFunctions (true); action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } /* Focus-track related event handling. * The lastMapped is a hack to ensure that newly mapped windows are * caught even if the grab that (possibly) triggered them affected * the mode. Windows created by a key binding (like creating a terminal * on a key binding) tends to trigger FocusIn events with mode other than * Normal. This works around this problem. * FIXME: Cleanup. * TODO: Avoid maximized windows. */ void EZoomScreen::focusTrack (XEvent *event) { static Window lastMapped = 0; if (event->type == MapNotify) { lastMapped = event->xmap.window; return; } else if (event->type != FocusIn) return; if ((event->xfocus.mode != NotifyNormal) && (lastMapped != event->xfocus.window)) return; lastMapped = 0; CompWindow *w = screen->findWindow (event->xfocus.window); if (w == NULL || w->id () == screen->activeWindow () || time(NULL) - lastChange < optionGetFollowFocusDelay () || !optionGetFollowFocus ()) return; int out = screen->outputDeviceForGeometry (w->geometry ()); if (!isActive (out) && !optionGetAlwaysFocusFitWindow ()) return; if (optionGetFocusFitWindow ()) { int width = w->width () + w->border ().left + w->border ().right; int height = w->height () + w->border ().top + w->border ().bottom; float scale = MAX (width / static_cast (screen->outputDevs ().at (out).width ()), height / static_cast (screen->outputDevs ().at (out).height ())); if (scale > optionGetAutoscaleMin ()) setScale (out, scale); } areaToWindow (w); toggleFunctions (true); } /* Event handler. Pass focus-related events on and handle XFixes events. */ void EZoomScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: if (grabIndex) { if (pointerX < clickPos.x ()) { box.setX (pointerX); box.setWidth (clickPos.x () - pointerX); } else box.setWidth (pointerX - clickPos.x ()); if (pointerY < clickPos.y ()) { box.setY (pointerY); box.setHeight (clickPos.y () - pointerY); } else box.setHeight (pointerY - clickPos.y ()); cScreen->damageScreen (); } break; case FocusIn: case MapNotify: focusTrack (event); break; default: if (event->type == fixesEventBase + XFixesCursorNotify) { //XFixesCursorNotifyEvent *cev = (XFixesCursorNotifyEvent *) //event; if (cursor.isSet) updateCursor (&cursor); } break; } screen->handleEvent (event); } /* TODO: Use this ctor carefully */ EZoomScreen::CursorTexture::CursorTexture () : isSet (false), screen (0), width (0), height (0), hotX (0), hotY (0) { } EZoomScreen::EZoomScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabbed (0), grabIndex (0), lastChange (0), cursorInfoSelected (false), cursorHidden (false) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); int major, minor; fixesSupported = XFixesQueryExtension(screen->dpy (), &fixesEventBase, &fixesErrorBase); XFixesQueryVersion (screen->dpy (), &major, &minor); if (major >= 4) canHideCursor = true; else canHideCursor = false; unsigned int n = screen->outputDevs ().size (); for (unsigned int i = 0; i < n; ++i) { /* zs->grabbed is a mask ... Thus this limit */ if (i > sizeof (long int) * 8) break; ZoomArea za (i); zooms.push_back (za); } pollHandle.setCallback (boost::bind ( &EZoomScreen::updateMouseInterval, this, _1)); optionSetZoomInButtonInitiate (boost::bind (&EZoomScreen::zoomIn, this, _1, _2, _3)); optionSetZoomOutButtonInitiate (boost::bind (&EZoomScreen::zoomOut, this, _1, _2, _3)); optionSetZoomInKeyInitiate (boost::bind (&EZoomScreen::zoomIn, this, _1, _2, _3)); optionSetZoomOutKeyInitiate (boost::bind (&EZoomScreen::zoomOut, this, _1, _2, _3)); optionSetZoomSpecific1KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget1)); optionSetZoomSpecific2KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget2)); optionSetZoomSpecific3KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget3)); optionSetZoomSpecific4KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget4)); optionSetZoomSpecific5KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget5)); optionSetZoomSpecific6KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget6)); optionSetZoomSpecific7KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget7)); optionSetZoomSpecific8KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget8)); optionSetZoomSpecific9KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget9)); optionSetZoomSpecific10KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget10)); optionSetZoomSpecific11KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget11)); optionSetZoomSpecific12KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget12)); optionSetZoomSpecific13KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget13)); optionSetZoomSpecific14KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget14)); optionSetZoomSpecific15KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget15)); optionSetZoomSpecific16KeyInitiate (boost::bind (&EZoomScreen::zoomSpecific, this, _1, _2, _3, ZoomTarget16)); optionSetPanLeftKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, -1, 0)); optionSetPanRightKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, 1, 0)); optionSetPanUpKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, 0, -1)); optionSetPanDownKeyInitiate (boost::bind (&EZoomScreen::zoomPan, this, _1, _2, _3, 0, 1)); optionSetFitToWindowKeyInitiate (boost::bind (&EZoomScreen::zoomToWindow, this, _1, _2, _3)); optionSetCenterMouseKeyInitiate (boost::bind (&EZoomScreen::zoomCenterMouse, this, _1, _2, _3)); optionSetFitToZoomKeyInitiate (boost::bind ( &EZoomScreen::zoomFitWindowToZoom, this, _1, _2, _3)); optionSetLockZoomKeyInitiate (boost::bind (&EZoomScreen::lockZoomAction, this, _1, _2, _3)); optionSetZoomBoxButtonInitiate (boost::bind (&EZoomScreen::zoomBoxActivate, this, _1, _2, _3)); optionSetZoomBoxButtonTerminate (boost::bind ( &EZoomScreen::zoomBoxDeactivate, this, _1, _2, _3)); optionSetSetZoomAreaInitiate (boost::bind ( &EZoomScreen::setZoomAreaAction, this, _1, _2, _3)); optionSetEnsureVisibilityInitiate (boost::bind ( &EZoomScreen::ensureVisibilityAction, this, _1, _2, _3)); } EZoomScreen::~EZoomScreen () { if (pollHandle.active ()) pollHandle.stop (); if (zooms.size ()) zooms.clear (); cScreen->damageScreen (); cursorZoomInactive (); } bool ZoomPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } ./plugins/ezoom/src/ezoom.h0000755000004100000410000002050613246301623016154 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright (C) 2007, 2008 Kristian Lyngstøl * * Ported to compiz 0.9 by: * Copyright (C) 2009, Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * * Author(s): * - Original zoom plug-in; David Reveman * - Most features beyond basic zoom; * Kristian Lyngstol * - Sam I suppose? (for the c++) * * Todo: Un-puke the header-file. Five levels of indentation in a .h is a * clear sign that something is horribly wrong. * * Essentially, this needs to be re-done for C++. As is the case of most of * eZoom. * */ #include #include #include #include #include "ezoom_options.h" #include enum SpecificZoomTarget { ZoomTarget1 = 0, ZoomTarget2, ZoomTarget3, ZoomTarget4, ZoomTarget5, ZoomTarget6, ZoomTarget7, ZoomTarget8, ZoomTarget9, ZoomTarget10, ZoomTarget11, ZoomTarget12, ZoomTarget13, ZoomTarget14, ZoomTarget15, ZoomTarget16 }; class EZoomScreen : public PluginClassHandler , public EzoomOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: EZoomScreen (CompScreen *); ~EZoomScreen (); public: CompositeScreen *cScreen; GLScreen *gScreen; public: typedef enum { NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, CENTER } ZoomGravity; typedef enum { NORTH, SOUTH, EAST, WEST } ZoomEdge; class CursorTexture { public: bool isSet; GLuint texture; CompScreen *screen; int width; int height; int hotX; int hotY; public: CursorTexture (); }; /* Stores an actual zoom-setup. This can later be used to store/restore * zoom areas on the fly. * * [xy]Translate and newZoom are target values, and [xy]Translate always * ranges from -0.5 to 0.5. * * currentZoom is actual zoomed value * * real[XY]Translate are the currently used values in the same range as * [xy]Translate, and [xy]trans is adjusted for the zoom level in place. * [xyz]trans should never be modified except in updateActualTranslates() * * viewport is a mask of the viewport, or ~0 for "any". */ class ZoomArea { public: int output; unsigned long int viewport; GLfloat currentZoom; GLfloat newZoom; GLfloat xVelocity; GLfloat yVelocity; GLfloat zVelocity; GLfloat xTranslate; GLfloat yTranslate; GLfloat realXTranslate; GLfloat realYTranslate; GLfloat xtrans; GLfloat ytrans; bool locked; public: ZoomArea (int out); ZoomArea (); void updateActualTranslates (); }; public: std::vector zooms; // list of zooms (different zooms for each output) CompPoint mouse; // we get this from mousepoll unsigned long int grabbed; CompScreen::GrabHandle grabIndex; // for zoomBox time_t lastChange; CursorTexture cursor; // the texture for the faux-cursor // we paint to do fake input // handling bool cursorInfoSelected; bool cursorHidden; CompRect box; CompPoint clickPos; MousePoller pollHandle; // mouse poller object private: bool fixesSupported; int fixesEventBase; int fixesErrorBase; bool canHideCursor; public: void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void handleEvent (XEvent *); public: int distanceToEdge (int out, EZoomScreen::ZoomEdge edge); bool isInMovement (int out); void adjustZoomVelocity (int out, float chunk); void adjustXYVelocity (int out, float chunk); void drawBox (const GLMatrix &transform, CompOutput *output, CompRect box); void setCenter (int x, int y, bool instant); void setZoomArea (int x, int y, int width, int height, bool instant); void areaToWindow (CompWindow *w); void panZoom (int xvalue, int yvalue); void enableMousePolling (); void setScale (int out, float value); void syncCenterToMouse (); void convertToZoomed (int out, int x, int y, int *resultX, int *resultY); void convertToZoomedTarget (int out, int x, int y, int *resultX, int *resultY); bool ensureVisibility (int x, int y, int margin); void ensureVisibilityArea (int x1, int y1, int x2, int y2, int margin, ZoomGravity gravity); void restrainCursor (int out); void cursorMoved (); void updateMousePosition (const CompPoint &p); void updateMouseInterval (const CompPoint &p); /* Make dtor */ void freeCursor (CursorTexture * cursor); void drawCursor (CompOutput *output, const GLMatrix &transform); void updateCursor (CursorTexture * cursor); void cursorZoomInactive (); void cursorZoomActive (int); public: bool setZoomAreaAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool ensureVisibilityAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomBoxActivate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomBoxDeactivate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options); bool lockZoomAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomSpecific (CompAction *action, CompAction::State state, CompOption::Vector options, SpecificZoomTarget target); bool zoomToWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomPan (CompAction *action, CompAction::State state, CompOption::Vector options, float horizAmount, float vertAmount); bool zoomCenterMouse (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomFitWindowToZoom (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); void focusTrack (XEvent *event); }; #define ZOOM_SCREEN(s) \ EZoomScreen *zs = EZoomScreen::get (s) class ZoomPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/ezoom/ezoom.xml.in0000755000004100000410000004151713246301623016350 0ustar www-datawww-data opengl expo decor mousepoll staticswitcher switcher opengl mousepoll <_short>Enhanced Zoom Desktop <_long>Enhanced zoom functions for the visually impaired and other users Accessibility <_short>Zoom In/Out <_short>Mouse Behaviour <_short>Specific Zoom <_short>Zoom Area Movement <_short>Panning <_short>Fitting <_short>Zoom In/Out <_short>Mouse Behaviour <_short>Zoom Area Movement <_short>Panning <_short>Focus Tracking <_short>Animation ./plugins/obs/0000755000004100000410000000000013246301624013510 5ustar www-datawww-data./plugins/obs/CMakeLists.txt0000644000004100000410000000014613246301623016250 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(obs PLUGINDEPS composite opengl)./plugins/obs/src/0000755000004100000410000000000013246301624014277 5ustar www-datawww-data./plugins/obs/src/obs.cpp0000644000004100000410000002236113246301623015571 0ustar www-datawww-data/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "obs.h" #include "obs_options.h" COMPIZ_PLUGIN_20090315 (obs, ObsPluginVTable); const unsigned short MODIFIER_OPACITY = 0; const unsigned short MODIFIER_SATURATION = 1; const unsigned short MODIFIER_BRIGHTNESS = 2; void ObsWindow::changePaintModifier (unsigned int modifier, int direction) { if (window->overrideRedirect () || (modifier == MODIFIER_OPACITY && (window->type () & CompWindowTypeDesktopMask))) return; int step = oScreen->stepOptions[modifier]->value ().i (); int value = customFactor[modifier] + (step * direction); value = MAX (MIN (value, 100), step); if (value != customFactor[modifier]) { customFactor[modifier] = value; modifierChanged (modifier); } } void ObsWindow::updatePaintModifier (unsigned int modifier) { int lastFactor = customFactor[modifier]; if (modifier == MODIFIER_OPACITY && (window->type ()& CompWindowTypeDesktopMask)) { customFactor[modifier] = startFactor[modifier]; matchFactor[modifier] = 100; } else { CompOption::Value::Vector *matches, *values; matches = &oScreen->matchOptions[modifier]->value ().list (); values = &oScreen->valueOptions[modifier]->value ().list (); int min = MIN (matches->size (), values->size ()); int lastMatchFactor = matchFactor[modifier]; matchFactor[modifier] = 100; for (int i = 0; i < min; ++i) { if (matches->at (i).match ().evaluate (window)) { matchFactor[modifier] = values->at (i).i (); break; } } if (customFactor[modifier] == lastMatchFactor) customFactor[modifier] = matchFactor[modifier]; } if (customFactor[modifier] != lastFactor) modifierChanged (modifier); } void ObsWindow::modifierChanged (unsigned int modifier) { bool hasCustom = false; if (modifier == MODIFIER_OPACITY) gWindow->glPaintSetEnabled (this, customFactor[modifier] != 100); for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) { if (customFactor[i] != 100) { hasCustom = true; break; } } gWindow->glDrawTextureSetEnabled (this, hasCustom); cWindow->addDamage (); } static bool alterPaintModifier (CompAction *action, CompAction::State state, CompOption::Vector& options, unsigned int modifier, int direction) { CompWindow *w; Window xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findTopLevelWindow (xid); if (w) ObsWindow::get (w)->changePaintModifier (modifier, direction); return true; } bool ObsWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { mask |= PAINT_WINDOW_TRANSLUCENT_MASK; return gWindow->glPaint (attrib, transform, region, mask); } /* Note: Normally plugins should wrap into glPaint to modify opacity, brightness and saturation. As some plugins bypass glPaint when they draw windows and our custom values always need to be applied, we wrap into glDrawTexture here */ void ObsWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { GLWindowPaintAttrib wAttrib (attrib); int factor = customFactor[MODIFIER_OPACITY]; if (factor != 100) { wAttrib.opacity = factor * wAttrib.opacity / 100; mask |= PAINT_WINDOW_TRANSLUCENT_MASK; } factor = customFactor[MODIFIER_BRIGHTNESS]; if (factor != 100) wAttrib.brightness = factor * wAttrib.brightness / 100; factor = customFactor[MODIFIER_SATURATION]; if (factor != 100) wAttrib.saturation = factor * wAttrib.saturation / 100; return gWindow->glDrawTexture (texture, transform, wAttrib, mask); } void ObsScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) ObsWindow::get (w)->updatePaintModifier (i); } } void ObsScreen::matchPropertyChanged (CompWindow *w) { for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) ObsWindow::get (w)->updatePaintModifier (i); screen->matchPropertyChanged (w); } #define MODIFIERBIND(modifier, direction) \ boost::bind (alterPaintModifier, _1, _2, _3, modifier, direction) ObsScreen::ObsScreen (CompScreen *s) : PluginClassHandler (s) { ScreenInterface::setHandler (screen); unsigned int mod = MODIFIER_OPACITY; stepOptions[mod] = &mOptions[ObsOptions::OpacityStep]; matchOptions[mod] = &mOptions[ObsOptions::OpacityMatches]; valueOptions[mod] = &mOptions[ObsOptions::OpacityValues]; mod = MODIFIER_SATURATION; stepOptions[mod] = &mOptions[ObsOptions::SaturationStep]; matchOptions[mod] = &mOptions[ObsOptions::SaturationMatches]; valueOptions[mod] = &mOptions[ObsOptions::SaturationValues]; mod = MODIFIER_BRIGHTNESS; stepOptions[mod] = &mOptions[ObsOptions::BrightnessStep]; matchOptions[mod] = &mOptions[ObsOptions::BrightnessMatches]; valueOptions[mod] = &mOptions[ObsOptions::BrightnessValues]; optionSetOpacityIncreaseKeyInitiate (MODIFIERBIND (MODIFIER_OPACITY, 1)); optionSetOpacityIncreaseButtonInitiate (MODIFIERBIND (MODIFIER_OPACITY, 1)); optionSetOpacityDecreaseKeyInitiate (MODIFIERBIND (MODIFIER_OPACITY, -1)); optionSetOpacityDecreaseButtonInitiate (MODIFIERBIND (MODIFIER_OPACITY, -1)); optionSetSaturationIncreaseKeyInitiate (MODIFIERBIND (MODIFIER_SATURATION, 1)); optionSetSaturationIncreaseButtonInitiate (MODIFIERBIND (MODIFIER_SATURATION, 1)); optionSetSaturationDecreaseKeyInitiate (MODIFIERBIND (MODIFIER_SATURATION, -1)); optionSetSaturationDecreaseButtonInitiate (MODIFIERBIND (MODIFIER_SATURATION, -1)); optionSetBrightnessIncreaseKeyInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, 1)); optionSetBrightnessIncreaseButtonInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, 1)); optionSetBrightnessDecreaseKeyInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, -1)); optionSetBrightnessDecreaseButtonInitiate (MODIFIERBIND (MODIFIER_BRIGHTNESS, -1)); } bool ObsWindow::updateTimeout () { for (int i = 0; i < MODIFIER_COUNT; ++i) updatePaintModifier (i); return false; } bool ObsScreen::setOption (const CompString &name, CompOption::Value &value) { CompOption *o; if (!ObsOptions::setOption (name, value)) return false; o = CompOption::findOption (getOptions (), name, NULL); if (!o) return false; for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) { if (o == matchOptions[i] || o == valueOptions[i]) { foreach (CompWindow *w, screen->windows ()) ObsWindow::get (w)->updatePaintModifier (i); } } return true; } ObsWindow::ObsWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), oScreen (ObsScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, false); OBS_SCREEN(screen); startFactor[MODIFIER_OPACITY] = os->optionGetDefaultOpacitySpawnValue (); startFactor[MODIFIER_BRIGHTNESS] = os->optionGetDefaultBrightnessSpawnValue (); startFactor[MODIFIER_SATURATION] = os->optionGetDefaultSaturationSpawnValue (); for (unsigned int i = 0; i < MODIFIER_COUNT; ++i) { customFactor[i] = startFactor[i]; matchFactor[i] = 100; if (customFactor[i] != 100) { modifierChanged (i); } /* defer initializing the factors from window matches as match evalution * means wrapped function calls */ updateHandle.setTimes (0, 0); updateHandle.setCallback (boost::bind (&ObsWindow::updateTimeout, this)); updateHandle.start (); } } ObsWindow::~ObsWindow () { updateHandle.stop (); } bool ObsPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/obs/src/obs.h0000644000004100000410000000605313246301623015236 0ustar www-datawww-data/* * Copyright © 2008 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include #include #include #include #include "obs_options.h" extern const unsigned short MODIFIER_OPACITY; extern const unsigned short MODIFIER_SATURATION; extern const unsigned short MODIFIER_BRIGHTNESS; const unsigned short MODIFIER_COUNT = 3; class ObsScreen : public ScreenInterface, public PluginClassHandler , public ObsOptions { public: ObsScreen (CompScreen *); bool setOption (const CompString &name, CompOption::Value &value); void matchPropertyChanged (CompWindow *); void matchExpHandlerChanged (); CompOption *stepOptions[MODIFIER_COUNT]; CompOption *matchOptions[MODIFIER_COUNT]; CompOption *valueOptions[MODIFIER_COUNT]; }; class ObsWindow : public GLWindowInterface, public PluginClassHandler { public: ObsWindow (CompWindow *); ~ObsWindow (); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); void glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); void changePaintModifier (unsigned int, int); void updatePaintModifier (unsigned int); void modifierChanged (unsigned int); bool updateTimeout (); private: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; ObsScreen *oScreen; int customFactor[MODIFIER_COUNT]; int startFactor[MODIFIER_COUNT]; int matchFactor[MODIFIER_COUNT]; CompTimer updateHandle; }; #define OBS_SCREEN(s) \ ObsScreen *os = ObsScreen::get (s); class ObsPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/obs/obs.xml.in0000644000004100000410000001424713246301623015431 0ustar www-datawww-data <_short>Opacity, Brightness and Saturation <_long>Per window adjustments of opacity, brightness and saturation Accessibility opengl blur <_short>Opacity <_short>Window Specific Settings <_short>Brightness <_short>Window Specific Settings <_short>Saturation <_short>Window Specific Settings ./plugins/animationplus/0000755000004100000410000000000013246301624015610 5ustar www-datawww-data./plugins/animationplus/CMakeLists.txt0000644000004100000410000000021213246301623020342 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (animationplus PLUGINDEPS animation animationaddon composite opengl) ./plugins/animationplus/src/0000755000004100000410000000000013246301624016377 5ustar www-datawww-data./plugins/animationplus/src/animationplus.cpp0000644000004100000410000001036113246301623021766 0ustar www-datawww-data/** * Example Animation extension plugin for compiz * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #ifdef HAVE_CONFIG_H #include #endif #include #include "private.h" COMPIZ_PLUGIN_20090315 (animationplus, AnimPlusPluginVTable); AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimPlus animPlusExtPluginInfo (CompString ("animationplus"), NUM_EFFECTS, animEffects, NULL, NUM_NONEFFECT_OPTIONS); ExtensionPluginInfo * BasePlusAnim::getExtensionPluginInfo () { return &animPlusExtPluginInfo; } BasePlusAnim::BasePlusAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mCScreen (CompositeScreen::get (::screen)), mGScreen (GLScreen::get (::screen)) { } /* // For effects with custom polygon step functions: AnimExtEffectProperties fxAirplaneExtraProp = { .animStepPolygonFunc = fxAirplaneLinearAnimStepPolygon}; */ AnimEffect AnimEffectBlinds; AnimEffect AnimEffectHelix; AnimEffect AnimEffectShatter; AnimEffect AnimEffectBonanza; void AnimPlusScreen::initAnimationList () { int i = 0; AnimEffectUsedFor usedFor = AnimEffectUsedFor::all () .exclude (AnimEventShade) .exclude (AnimEventFocus); animEffects[i++] = AnimEffectBlinds = new AnimEffectInfo ("animationplus:Blinds", usedFor, &createAnimation ); /* Currently broken */ animEffects[i++] = AnimEffectBonanza = new AnimEffectInfo ("animationplus:Bonanza", usedFor, &createAnimation ); animEffects[i++] = AnimEffectHelix = new AnimEffectInfo ("animationplus:Helix", usedFor, &createAnimation ); animEffects[i++] = AnimEffectShatter = new AnimEffectInfo ("animationplus:Shatter", usedFor, &createAnimation ); animPlusExtPluginInfo.effectOptions = &getOptions (); AnimScreen *as = AnimScreen::get (::screen); as->addExtension (&animPlusExtPluginInfo); } AnimPlusScreen::AnimPlusScreen (CompScreen *s) : //cScreen (CompositeScreen::get (s)), //gScreen (GLScreen::get (s)), //aScreen (as), PluginClassHandler (s), mOutput (s->fullscreenOutput ()) { initAnimationList (); } AnimPlusScreen::~AnimPlusScreen () { AnimScreen *as = AnimScreen::get (::screen); as->removeExtension (&animPlusExtPluginInfo); for (int i = 0; i < NUM_EFFECTS; i++) { delete animEffects[i]; animEffects[i] = NULL; } } AnimPlusWindow::AnimPlusWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), aWindow (AnimWindow::get (w)) { } AnimPlusWindow::~AnimPlusWindow () { Animation *curAnim = aWindow->curAnimation (); if (!curAnim) return; // We need to interrupt and clean up the animation currently being played // by animationsim for this window (if any) if (curAnim->remainingTime () > 0 && curAnim->getExtensionPluginInfo ()->name == CompString ("animationplus")) { aWindow->postAnimationCleanUp (); } } bool AnimPlusPluginVTable::init () { if (!CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) || !CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) || !CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) || !CompPlugin::checkPluginABI ("animation", ANIMATION_ABI) || !CompPlugin::checkPluginABI ("animationaddon", ANIMATIONADDON_ABI)) return false; return true; } ./plugins/animationplus/src/blinds.cpp0000644000004100000410000000406413246301623020361 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * blinds.cpp * * Copyright : (C) 2008 Kevin DuBois * E-mail : kdub432@gmail.com * * Based on other animations by * : Erkin Bahceci * E-mail : erkinbah@gmail.com * * Which were based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. *const float ExplodeAnim::kDurationFactor = 1.43; * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float BlindsAnim::kDurationFactor = 1.43; BlindsAnim::BlindsAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mAllFadeDuration = 0.3f; mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; mBackAndSidesFadeDur = 0.2f; } void BlindsAnim::init () { ANIMPLUS_SCREEN (screen); tessellateIntoRectangles (as->optionGetBlindsGridx (), 1, as->optionGetBlindsThickness ()); foreach (PolygonObject *p, mPolygons) { //rotate around y axis p->rotAxis.set (0, 1, 0); p->finalRelPos.set (0, 0, 0); int numberOfHalfTwists = as->optionGetBlindsNumHalftwists (); p->finalRotAng = 180 * numberOfHalfTwists ; } } ./plugins/animationplus/src/private.h0000644000004100000410000001002413246301623020216 0ustar www-datawww-data#include #include #include #include #ifdef USE_LIBRSVG #include #include #include #include #endif #include #include #include #include #include #include "animationplus_options.h" extern AnimEffect AnimEffectBlinds; extern AnimEffect AnimEffectBonanza; extern AnimEffect AnimEffectHelix; extern AnimEffect AnimEffectShatter; #define NUM_EFFECTS 4 // This must have the value of the first "effect setting" above // in AnimEgScreenOptions #define NUM_NONEFFECT_OPTIONS 0 #define WIN_X(w) ((w)->x () - (w)->input ().left) #define WIN_Y(w) ((w)->y () - (w)->input ().top) #define WIN_W(w) ((w)->width () + (w)->input ().left + (w)->input ().right) #define WIN_H(w) ((w)->height () + (w)->input ().top + (w)->input ().bottom) class ExtensionPluginAnimPlus : public ExtensionPluginInfo { public: ExtensionPluginAnimPlus (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex) {} ~ExtensionPluginAnimPlus () {} const CompOutput *output () { return mOutput; } private: const CompOutput *mOutput; }; class BasePlusAnim : virtual public Animation { public: BasePlusAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~BasePlusAnim () {} protected: // Gets info about the extension plugin that implements this animation. ExtensionPluginInfo* getExtensionPluginInfo (); CompositeScreen *mCScreen; GLScreen *mGScreen; }; class AnimPlusScreen : public PluginClassHandler , public AnimationplusOptions { public: AnimPlusScreen (CompScreen *); ~AnimPlusScreen (); protected: void initAnimationList (); CompOutput &mOutput; }; class AnimPlusWindow : public PluginClassHandler { public: AnimPlusWindow (CompWindow *); ~AnimPlusWindow (); protected: CompWindow *mWindow; AnimWindow *aWindow; }; #define ANIMPLUS_SCREEN(s) \ AnimPlusScreen *as = AnimPlusScreen::get (s); #define ANIMPLUS_WINDOW(w) \ AnimPlusWindow *aw = AnimPlusWindow::get (w); // ratio of perceived length of animation compared to real duration // to make it appear to have the same speed with other animation effects #define EXPLODE_PERCEIVED_T 0.7f /* * Function prototypes * */ class BlindsAnim : public PolygonAnim { public: BlindsAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class HelixAnim : public PolygonAnim { public: HelixAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class BonanzaAnim : public ParticleAnim { public: BonanzaAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void genFire (int x, int y, int radius, float size, float time); void step (float); protected: int mAnimFireDirection; unsigned int mFirePDId; }; class ShatterAnim : public PolygonAnim { public: ShatterAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class AnimPlusPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/animationplus/src/bonanza.cpp0000644000004100000410000001575213246301623020544 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * bonanza.c * * Copyright : (C) 2008 Kevin DuBois * E-mail : kdub423@gmail.com * * Based on animations system by: (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" #include "animation_tex.h" // ===================== Effect: Burn ========================= BonanzaAnim::BonanzaAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), ParticleAnim::ParticleAnim (w, curWindowEvent, duration, info, icon) { ANIMPLUS_SCREEN (screen); // Light Particles are for extras, dark particles unused? initLightDarkParticles (as->optionGetBonanzaParticles (), as->optionGetBonanzaParticles () / 10, 0.125, 0.5); mAnimFireDirection = 0; } void BonanzaAnim::genFire (int x, int y, int radius, float size, float time) { ANIMPLUS_SCREEN (screen); ParticleSystem &ps = mParticleSystems[0]; float fireLife = as->optionGetBonanzaLife (); float fireLifeNeg = 1 - fireLife; float fadeExtra = 0.2f * (1.01 - fireLife); float max_new = ps.particles ().size () * (time / 50) * (1.05 - fireLife); float numParticles = ps.particles ().size (); unsigned short *c = as->optionGetBonanzaColor (); float colr1 = (float)c[0] / 0xffff; float colg1 = (float)c[1] / 0xffff; float colb1 = (float)c[2] / 0xffff; float colr2 = 1 / 1.7 * (float)c[0] / 0xffff; float colg2 = 1 / 1.7 * (float)c[1] / 0xffff; float colb2 = 1 / 1.7 * (float)c[2] / 0xffff; float cola = (float)c[3] / 0xffff; float rVal; Particle *part = &(ps.particles ()[0]); float deg = 0; float inc = 2.0 * 3.1415 / numParticles; float partw = 5.00; float parth = partw * 1.5; bool mysticalFire = as->optionGetBonanzaMystical (); for (unsigned int i = 0; i < numParticles && max_new > 0; i++, part++) { deg += inc; if (part->life <= 0.0f) { // give gt new life rVal = (float)(random() & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * fireLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partw; part->height = parth; rVal = (float)(random() & 0xff) / 255.0; part->w_mod = part->h_mod = size * rVal; part->x = (float)x + (float) radius * cosf(deg); part->y = (float)y + (float) radius * sinf(deg); //clip if (part->x <= 0) part->x = 0; if (part->x >= 2 * x) part->x = 2*x; if (part->y <= 0) part->y = 0; if (part->y >= 2 * y) part->y = 2*y; part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = 0.0f; // set speed and direction rVal = (float)(random() & 0xff) / 255.0; part->xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random() & 0xff) / 255.0; part->yi = ((rVal * 20.0) - 15.0f); part->zi = 0.0f; if (mysticalFire) { // Random colors! (aka Mystical Fire) rVal = (float)(random() & 0xff) / 255.0; part->r = rVal; rVal = (float)(random() & 0xff) / 255.0; part->g = rVal; rVal = (float)(random() & 0xff) / 255.0; part->b = rVal; } else { rVal = (float)(random() & 0xff) / 255.0; part->r = colr1 - rVal * colr2; part->g = colg1 - rVal * colg2; part->b = colb1 - rVal * colb2; } // set transparancy part->a = cola; // set gravity part->xg = (part->x < part->xo) ? 1.0 : -1.0; part->yg = -3.0f; part->zg = 0.0f; ps.activate (); max_new -= 1; } else { part->xg = (part->x < part->xo) ? 1.0 : -1.0; } } } void BonanzaAnim::step (float time) { float timestep = 2.0; CompRect rect = mWindow->outputRect (); mRemainingTime -= timestep; if (mRemainingTime <= 0) mRemainingTime = 0; // avoid sub-zero values float new_f = 1 - (mRemainingTime) / (mTotalTime - timestep); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade) { new_f = 1 - new_f; } mUseDrawRegion = true; mDrawRegion = CompRegion (); /* define an expanding circle as a union of rectangular X regions. */ float radius = 0; if (mRemainingTime > 0) { XPoint pts[20]; int i; float two_pi = 3.14159 * 2.0; int centerX = rect.centerX () + rect.x (); int centerY = rect.centerY () + rect.y (); float corner_dist = sqrt( powf(rect.centerX ()/2,2) + powf(rect.centerY (),2)); radius = new_f * corner_dist; for (i = 0; i < 20; i++) { pts[i].x = centerX + (int)(radius * cosf( (float) i/20.0 * two_pi )); pts[i].y = centerY + (int)(radius * sinf( (float) i/20.0 * two_pi )); } Region pointsRegion = XPolygonRegion (&pts[0], 20, WindingRule);; mDrawRegion = CompRegionRef(pointsRegion) - CompRegion::empty ().united (rect); XDestroyRegion (pointsRegion); } else { mDrawRegion = CompRegion::empty (); } mUseDrawRegion = (fabs (new_f) > 1e-5); genFire (rect.centerX (), rect.centerY (), radius, WIN_W(mWindow) / 40.0, time); if (mRemainingTime <= 0 && mParticleSystems.size () && mParticleSystems.at (0).active ()) { mRemainingTime = 0; } if (mParticleSystems.empty () || !mParticleSystems.at (0).active ()) { mParticleSystems.clear (); // Abort animation compLogMessage ("animationaddon", CompLogLevelError, "Couldn't do bonanza animation\n"); mRemainingTime = 0; } } ./plugins/animationplus/src/animation_tex.h0000644000004100000410000004065513246301623021420 0ustar www-datawww-data/** * * Particle texture for Beryl benchmark plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ static const unsigned char fireTex[4097] = { "\0\0\0\0\377\377\377\3\377\377\377\2\377\377\377\5\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\14\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\13\377\377" "\377\13\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\2\0\0\0\0\0" "\0\0\0\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377" "\6\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377" "\20\377\377\377\22\377\377\377\20\377\377\377\21\377\377\377\17\377\377\377" "\20\377\377\377\17\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\11\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\1\0\0\0\0\377\377\377\5\377\377\377\4\377\377\377\6\377\377" "\377\6\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\14\377\377" "\377\15\377\377\377\20\377\377\377\20\377\377\377\24\377\377\377\24\377\377" "\377\23\377\377\377\23\377\377\377\26\377\377\377\25\377\377\377\23\377\377" "\377\21\377\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377" "\377\15\377\377\377\15\377\377\377\11\377\377\377\11\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\30\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\33\377\377\377" "\31\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\25\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\7\377\377\377\6\377\377\377\12\377\377\377\11\377\377\377" "\14\377\377\377\15\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\32\377\377\377\35\377\377\377\34\377\377\377\34\377\377\377" "\36\377\377\377\40\377\377\377\36\377\377\377\34\377\377\377\34\377\377\377" "\34\377\377\377\32\377\377\377\31\377\377\377\26\377\377\377\25\377\377\377" "\22\377\377\377\16\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377!\377\377\377" "\"\377\377\377#\377\377\377#\377\377\377&\377\377\377&\377\377\377$\377\377" "\377#\377\377\377\40\377\377\377!\377\377\377\35\377\377\377\34\377\377\377" "\25\377\377\377\24\377\377\377\21\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "&\377\377\377,\377\377\377+\377\377\377,\377\377\377-\377\377\377-\377\377" "\377,\377\377\377+\377\377\377&\377\377\377)\377\377\377$\377\377\377\34" "\377\377\377\34\377\377\377\27\377\377\377\24\377\377\377\23\377\377\377" "\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\6\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\27\377\377\377\31\377\377\377\36\377\377\377!\377\377\377%\377\377\377(" "\377\377\3771\377\377\3772\377\377\3775\377\377\377;\377\377\377<\377\377" "\3779\377\377\3778\377\377\3773\377\377\3771\377\377\377-\377\377\377'\377" "\377\377\"\377\377\377\34\377\377\377\36\377\377\377\32\377\377\377\25\377" "\377\377\21\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377\7\377" "\377\377\13\377\377\377\14\377\377\377\17\377\377\377\21\377\377\377\31\377" "\377\377\31\377\377\377\35\377\377\377!\377\377\377'\377\377\377+\377\377" "\3771\377\377\377=\377\377\377E\377\377\377H\377\377\377M\377\377\377M\377" "\377\377J\377\377\377I\377\377\377A\377\377\377A\377\377\3778\377\377\377" ",\377\377\377%\377\377\377$\377\377\377\"\377\377\377\34\377\377\377\24\377" "\377\377\22\377\377\377\17\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\13\377\377\377\14\377\377\377\20\377\377\377\23\377\377\377\27\377" "\377\377\35\377\377\377$\377\377\377(\377\377\377.\377\377\3776\377\377\377" "=\377\377\377H\377\377\377W\377\377\377Y\377\377\377]\377\377\377a\377\377" "\377\\\377\377\377\\\377\377\377U\377\377\377O\377\377\377?\377\377\3774" "\377\377\377-\377\377\377+\377\377\377\40\377\377\377\32\377\377\377\27\377" "\377\377\23\377\377\377\22\377\377\377\15\377\377\377\11\377\377\377\13\377" "\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\377\377\377\30\377" "\377\377\37\377\377\377$\377\377\377.\377\377\3779\377\377\377?\377\377\377" "N\377\377\377X\377\377\377h\377\377\377r\377\377\377w\377\377\377|\377\377" "\377x\377\377\377p\377\377\377k\377\377\377\\\377\377\377J\377\377\377F\377" "\377\3779\377\377\377*\377\377\377$\377\377\377\36\377\377\377\30\377\377" "\377\25\377\377\377\24\377\377\377\20\377\377\377\14\377\377\377\12\377\377" "\377\15\377\377\377\17\377\377\377\22\377\377\377\27\377\377\377\34\377\377" "\377\40\377\377\377%\377\377\377.\377\377\377<\377\377\377M\377\377\377[" "\377\377\377l\377\377\377~\377\377\377\227\377\377\377\230\377\377\377\234" "\377\377\377\233\377\377\377\226\377\377\377\205\377\377\377i\377\377\377" "b\377\377\377P\377\377\3779\377\377\377-\377\377\377(\377\377\377!\377\377" "\377\35\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377\13\377\377" "\377\12\377\377\377\15\377\377\377\21\377\377\377\23\377\377\377\31\377\377" "\377\37\377\377\377!\377\377\377(\377\377\3774\377\377\377@\377\377\377Q" "\377\377\377g\377\377\377\200\377\377\377\231\377\377\377\254\377\377\377" "\275\377\377\377\310\377\377\377\304\377\377\377\264\377\377\377\227\377" "\377\377\212\377\377\377f\377\377\377Q\377\377\377B\377\377\377:\377\377" "\377/\377\377\377&\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\14\377\377\377\12\377\377\377\17\377\377\377\22\377\377\377" "\24\377\377\377\31\377\377\377\40\377\377\377&\377\377\377-\377\377\377:" "\377\377\377H\377\377\377X\377\377\377k\377\377\377\220\377\377\377\252\377" "\377\377\324\377\377\377\363\377\377\377\370\377\377\377\366\377\377\377" "\335\377\377\377\263\377\377\377\221\377\377\377w\377\377\377b\377\377\377" "P\377\377\377>\377\377\3770\377\377\377&\377\377\377\37\377\377\377\32\377" "\377\377\26\377\377\377\23\377\377\377\15\377\377\377\11\377\377\377\16\377" "\377\377\21\377\377\377\27\377\377\377\33\377\377\377\"\377\377\377(\377" "\377\377/\377\377\377<\377\377\377N\377\377\377b\377\377\377z\377\377\377" "\231\377\377\377\275\377\377\377\361\377\377\377\375\377\377\377\376\377" "\377\377\376\377\377\377\370\377\377\377\316\377\377\377\240\377\377\377" "\205\377\377\377b\377\377\377L\377\377\377<\377\377\377.\377\377\377&\377" "\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\15\377" "\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377\32\377" "\377\377\40\377\377\377$\377\377\377,\377\377\377:\377\377\377L\377\377\377" "`\377\377\377|\377\377\377\231\377\377\377\310\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\376\377\377\377\375\377\377\377\332\377" "\377\377\241\377\377\377\207\377\377\377f\377\377\377R\377\377\377@\377\377" "\3773\377\377\377+\377\377\377\"\377\377\377\35\377\377\377\30\377\377\377" "\24\377\377\377\17\377\377\377\14\377\377\377\16\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\40\377\377\377$\377\377\377,\377\377\377;" "\377\377\377N\377\377\377e\377\377\377\206\377\377\377\246\377\377\377\327" "\377\377\377\374\377\377\377\375\377\377\377\376\377\377\377\376\377\377" "\377\374\377\377\377\331\377\377\377\243\377\377\377\210\377\377\377b\377" "\377\377O\377\377\377>\377\377\377.\377\377\377&\377\377\377\40\377\377\377" "\33\377\377\377\27\377\377\377\22\377\377\377\15\377\377\377\12\377\377\377" "\16\377\377\377\22\377\377\377\23\377\377\377\32\377\377\377\40\377\377\377" "'\377\377\3770\377\377\377?\377\377\377U\377\377\377h\377\377\377\200\377" "\377\377\237\377\377\377\270\377\377\377\344\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\354\377\377\377\275\377\377\377\227\377" "\377\377\200\377\377\377e\377\377\377Q\377\377\377>\377\377\377.\377\377" "\377%\377\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377" "\377\15\377\377\377\11\377\377\377\17\377\377\377\22\377\377\377\25\377\377" "\377\31\377\377\377\"\377\377\377*\377\377\3773\377\377\377=\377\377\377" "J\377\377\377^\377\377\377o\377\377\377\211\377\377\377\235\377\377\377\271" "\377\377\377\327\377\377\377\342\377\377\377\335\377\377\377\302\377\377" "\377\240\377\377\377\216\377\377\377k\377\377\377X\377\377\377C\377\377\377" "9\377\377\377/\377\377\377&\377\377\377\"\377\377\377\33\377\377\377\26\377" "\377\377\22\377\377\377\14\377\377\377\12\377\377\377\15\377\377\377\22\377" "\377\377\31\377\377\377\35\377\377\377\37\377\377\377$\377\377\377,\377\377" "\3777\377\377\377A\377\377\377Q\377\377\377[\377\377\377p\377\377\377\212" "\377\377\377\231\377\377\377\242\377\377\377\253\377\377\377\251\377\377" "\377\236\377\377\377\215\377\377\377u\377\377\377b\377\377\377O\377\377\377" "<\377\377\3771\377\377\377)\377\377\377\"\377\377\377\34\377\377\377\32\377" "\377\377\27\377\377\377\21\377\377\377\16\377\377\377\12\377\377\377\17\377" "\377\377\21\377\377\377\20\377\377\377\27\377\377\377\37\377\377\377$\377" "\377\377&\377\377\377,\377\377\3778\377\377\377B\377\377\377R\377\377\377" "_\377\377\377k\377\377\377~\377\377\377\207\377\377\377\220\377\377\377\220" "\377\377\377\203\377\377\377q\377\377\377_\377\377\377V\377\377\377F\377" "\377\3777\377\377\377,\377\377\377%\377\377\377!\377\377\377\31\377\377\377" "\25\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377\11\377\377\377" "\12\377\377\377\16\377\377\377\22\377\377\377\27\377\377\377\33\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377/\377\377\3779\377\377\377E\377" "\377\377L\377\377\377^\377\377\377d\377\377\377e\377\377\377k\377\377\377" "l\377\377\377d\377\377\377a\377\377\377O\377\377\377C\377\377\377=\377\377" "\3770\377\377\377)\377\377\377$\377\377\377\35\377\377\377\30\377\377\377" "\25\377\377\377\22\377\377\377\16\377\377\377\12\377\377\377\13\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\21\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377$\377\377\377)\377\377\3771\377\377\3776\377" "\377\377@\377\377\377J\377\377\377N\377\377\377P\377\377\377S\377\377\377" "X\377\377\377P\377\377\377J\377\377\377E\377\377\3777\377\377\377,\377\377" "\377+\377\377\377%\377\377\377\40\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\21\377\377\377\14\377\377\377\11\377\377\377\12\377\377\377" "\13\377\377\377\11\377\377\377\14\377\377\377\21\377\377\377\23\377\377\377" "\27\377\377\377\33\377\377\377\37\377\377\377&\377\377\377(\377\377\377*" "\377\377\3774\377\377\3779\377\377\377<\377\377\377=\377\377\377C\377\377" "\377E\377\377\377?\377\377\3779\377\377\377:\377\377\377.\377\377\377(\377" "\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\24\377\377" "\377\21\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\22\377\377" "\377\25\377\377\377\30\377\377\377\33\377\377\377\"\377\377\377!\377\377" "\377%\377\377\377*\377\377\377-\377\377\3770\377\377\377/\377\377\3773\377" "\377\3772\377\377\3774\377\377\377-\377\377\377,\377\377\377*\377\377\377" "\"\377\377\377\37\377\377\377\32\377\377\377\33\377\377\377\27\377\377\377" "\21\377\377\377\17\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377" "\6\377\377\377\10\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\23\377\377\377\30\377\377\377\32\377\377\377" "\35\377\377\377\40\377\377\377!\377\377\377%\377\377\377(\377\377\377&\377" "\377\377)\377\377\377(\377\377\377+\377\377\377$\377\377\377!\377\377\377" "#\377\377\377\36\377\377\377\30\377\377\377\30\377\377\377\24\377\377\377" "\22\377\377\377\20\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\23\377\377\377" "\26\377\377\377\31\377\377\377\33\377\377\377\34\377\377\377!\377\377\377" "\40\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377&\377\377\377\36" "\377\377\377\35\377\377\377\35\377\377\377\34\377\377\377\26\377\377\377" "\24\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\7\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6" "\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\16\377\377\377\21\377\377\377\22\377\377\377\26\377\377\377\26\377\377\377" "\30\377\377\377\33\377\377\377\32\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\37\377\377\377\31\377\377\377\31\377\377\377\27\377\377\377" "\30\377\377\377\21\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\13" "\377\377\377\11\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\22\377\377\377\30\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\6\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\10\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\20\377\377\377" "\23\377\377\377\21\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\15\377\377\377\12\377\377\377\11\377\377\377\12\377\377\377\7\377\377\377" "\6\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\1\377\377\377\1" "\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377\7\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\13\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377\16\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\3\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\377\377\377\2\377\377\377\4\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\13\377\377\377\13\377\377" "\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\15\377\377" "\377\13\377\377\377\14\377\377\377\11\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\6\377\377" "\377\7\377\377\377\4\377\377\377\5\377\377\377\3\377\377\377\1\0\0\0\0\0" "\0\0\0" }; ./plugins/animationplus/src/shatter.cpp0000644000004100000410000000437213246301623020562 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2008 Kevin DuBois * E-mail : kdub432@gmail.com * * Based on other animations by * : Erkin Bahceci * E-mail : erkinbah@gmail.com * * Which were based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float ShatterAnim::kDurationFactor = 1.43; ShatterAnim::ShatterAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mAllFadeDuration = 0.4f; mBackAndSidesFadeDur = 0.2f; mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } void ShatterAnim::init () { ANIMPLUS_SCREEN (screen); int static_polygon; int screen_height = screen->outputDevs ().at (mWindow->outputDevice ()).height (); tessellateIntoGlass (as->optionGetShatterNumSpokes (), as->optionGetShatterNumTiers (), 1); //can't really see how thick it is... foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (0, 0, 1); static_polygon = 1; p->finalRelPos.set (0, static_polygon * (-p->centerPosStart.y () + screen_height), 0); if (p->finalRelPos.y ()) p->finalRotAng = RAND_FLOAT() * 120 * ( RAND_FLOAT() < 0.5 ? -1 : 1 ); } } ./plugins/animationplus/src/helix.cpp0000644000004100000410000000517013246301623020216 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * animation.c * * Copyright : (C) 2008 Kevin DuBois * E-mail : kdub432@gmail.com * * Based on other animations by * : Erkin Bahceci * E-mail : erkinbah@gmail.com * * Which were based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" const float HelixAnim::kDurationFactor = 1.43; HelixAnim::HelixAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mAllFadeDuration = 0.4f; mBackAndSidesFadeDur = 0.2f; mDoDepthTest = TRUE; mDoLighting = TRUE; mCorrectPerspective = CorrectPerspectivePolygon; } void HelixAnim::init () { ANIMPLUS_SCREEN (screen); int gridsizeY = as->optionGetHelixGridy (); int count = 0; tessellateIntoRectangles (1, gridsizeY, as->optionGetHelixThickness ()); foreach (PolygonObject *p, mPolygons) { //rotate around y axis normally, or the z axis if the effect is in vertical mode if (as->optionGetHelixDirection ()) p->rotAxis.set (0, 0, 1); else p->rotAxis.set (0, 1, 0); //only move the pieces in a 'vertical' rotation if (as->optionGetHelixDirection ()) p->finalRelPos.set (0, -1 * ((mWindow->height () / gridsizeY) * (count - gridsizeY/2)), 0); else p->finalRelPos.set (0, 0, 0); //determine how long, and what direction to spin int numberOfTwists = as->optionGetHelixNumTwists (); int spin_dir = as->optionGetHelixSpinDirection (); if (spin_dir) p->finalRotAng = 270 - ( 2 * numberOfTwists * count); else p->finalRotAng = ( 2 * numberOfTwists * count) - 270; count++; } } ./plugins/animationplus/animationplus.xml.in0000644000004100000410000001257113246301623021627 0ustar www-datawww-data <_short>Animations Plus <_long>More window animations Effects animation animationaddon animationaddon opengl composite <_short>Effect Settings <_short>Helix <_short>Blinds <_short>Shatter <_short>Bonanza open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects animationplus:Blinds <_name>Blinds animationplus:Helix <_name>Helix animationplus:Bonanza <_name>Bonanza animationplus:Shatter <_name>Shatter ./plugins/animationplus/VERSION0000644000004100000410000000001013246301623016646 0ustar www-datawww-data0.9.5.0 ./plugins/bicubic/0000755000004100000410000000000013246301623014324 5ustar www-datawww-data./plugins/bicubic/CMakeLists.txt0000644000004100000410000000015413246301623017064 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (bicubic PLUGINDEPS composite opengl) ./plugins/bicubic/src/0000755000004100000410000000000013246301623015113 5ustar www-datawww-data./plugins/bicubic/src/bicubic.h0000644000004100000410000000377513246301623016700 0ustar www-datawww-data/* * * Compiz bicubic filter plugin * * bicubic.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2008 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "bicubic_options.h" class BicubicFunction { public: int handle; int target; int param; int unit; }; class BicubicScreen : public PluginClassHandler , public BicubicOptions { public: BicubicScreen (CompScreen *screen); ~BicubicScreen (); GLScreen *gScreen; CompositeScreen *cScreen; std::list func; GLenum lTexture; int getBicubicFragmentFunction (GLTexture *texture, int param, int unit); void generateLookupTexture (GLenum format); }; class BicubicWindow : public PluginClassHandler , public GLWindowInterface { public: BicubicWindow (CompWindow *); CompositeWindow *cWindow; GLWindow *gWindow; void glDrawTexture (GLTexture *texture, GLFragment::Attrib &, unsigned int); }; #define BICUBIC_SCREEN(s) \ BicubicScreen *bs = BicubicScreen::get (s) #define BICUBIC_WINDOW(w) \ BicubicWindow *bw = BicubicWindow::get (w) class BicubicPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/bicubic/src/bicubic.cpp0000644000004100000410000001715613246301623017231 0ustar www-datawww-data/* * * Compiz bicubic filter plugin * * bicubic.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "bicubic.h" COMPIZ_PLUGIN_20090315 (bicubic, BicubicPluginVTable); int BicubicScreen::getBicubicFragmentFunction (GLTexture *texture, int param, int unit) { GLFragment::FunctionData *data; int target; CompString targetString; if (texture->target () == GL_TEXTURE_2D) { target = COMP_FETCH_TARGET_2D; targetString = "2D"; } else { target = COMP_FETCH_TARGET_RECT; targetString = "RECT"; } foreach (BicubicFunction *function, func) if (function->param == param && function->target == target && function->unit == unit) return function->handle; data = new GLFragment::FunctionData (); if (data) { int handle = 0; BicubicFunction *function = NULL; CompString filterTemp[] = { "hgX", "hgY", "cs00", "cs01", "cs10", "cs11" }; for (unsigned int i = 0; i < sizeof (filterTemp) / sizeof (filterTemp[0]); i++) data->addTempHeaderOp (filterTemp[i].c_str()); data->addDataOp ( "MAD cs00, fragment.texcoord[0], program.env[%d]," "{-0.5, -0.5, 0.0, 0.0};", param + 2); data->addDataOp ( "TEX hgX, cs00.x, texture[%d], 1D;", unit); data->addDataOp ( "TEX hgY, cs00.y, texture[%d], 1D;", unit); data->addDataOp ( "MUL cs10, program.env[%d], hgX.y;", param); data->addDataOp ( "MUL cs00, program.env[%d], -hgX.x;", param); data->addDataOp ( "MAD cs11, program.env[%d], hgY.y, cs10;", param + 1); data->addDataOp ( "MAD cs01, program.env[%d], hgY.y, cs00;", param + 1); data->addDataOp ( "MAD cs10, program.env[%d], -hgY.x, cs10;", param + 1); data->addDataOp ( "MAD cs00, program.env[%d], -hgY.x, cs00;", param + 1); data->addDataOp ( "ADD cs00, cs00, fragment.texcoord[0];"); data->addDataOp ( "ADD cs01, cs01, fragment.texcoord[0];"); data->addDataOp ( "ADD cs10, cs10, fragment.texcoord[0];"); data->addDataOp ( "ADD cs11, cs11, fragment.texcoord[0];"); data->addDataOp ( "TEX cs00, cs00, texture[0], %s;", targetString.c_str()); data->addDataOp ( "TEX cs01, cs01, texture[0], %s;", targetString.c_str()); data->addDataOp ( "TEX cs10, cs10, texture[0], %s;", targetString.c_str()); data->addDataOp ( "TEX cs11, cs11, texture[0], %s;", targetString.c_str()); data->addDataOp ( "LRP cs00, hgY.z, cs00, cs01;"); data->addDataOp ( "LRP cs10, hgY.z, cs10, cs11;"); data->addDataOp ( "LRP output, hgX.z, cs00, cs10;"); data->addColorOp ( "output", "output"); if (!data->status ()) { delete data; return 0; } function = new BicubicFunction (); if (function) { handle = data->createFragmentFunction ("bicubic"); function->handle = handle; function->target = target; function->param = param; function->unit = unit; func.push_back (function); } delete data; return handle; } return 0; } void BicubicWindow::glDrawTexture (GLTexture *texture, GLFragment::Attrib &attrib, unsigned int mask) { BICUBIC_SCREEN (screen); if ((mask & (PAINT_WINDOW_TRANSFORMED_MASK | PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)) && bs->gScreen->textureFilter () == GLTexture::Good) { GLFragment::Attrib fa = attrib; int function, param; int unit = 0; param = fa.allocParameters (3); unit = fa.allocTextureUnits (1); function = bs->getBicubicFragmentFunction (texture, param, unit); if (function) { fa.addFunction (function); GL::activeTexture (GL_TEXTURE0_ARB + unit); glBindTexture (GL_TEXTURE_1D, bs->lTexture); GL::activeTexture (GL_TEXTURE0_ARB); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param, texture->matrix ().xx, 0.0f, 0.0f, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param + 1, 0.0f, -texture->matrix ().yy, 0.0f, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, param + 2, 1.0 / texture->matrix ().xx, 1.0 / -texture->matrix ().yy, 0.0f, 0.0f); } gWindow->glDrawTexture (texture, fa, mask); if (unit) { GL::activeTexture (GL_TEXTURE0_ARB + unit); glBindTexture (GL_TEXTURE_1D, 0); GL::activeTexture (GL_TEXTURE0_ARB); } } else { gWindow->glDrawTexture (texture, attrib, mask); } } void BicubicScreen::generateLookupTexture (GLenum format) { GLfloat values[512]; float a, a2, a3, w0, w1, w2, w3; for (int i = 0; i < 512; i += 4) { a = (float)i / 512.0; a2 = a * a; a3 = a2 * a; w0 = (1.0 / 6.0) * ((-a3) + (3.0 * a2) + (-3.0 * a) + 1.0); w1 = (1.0 / 6.0) * ((3.0 * a3) + (-6.0 * a2) + 4.0); w2 = (1.0 / 6.0) * ((-3.0 * a3) + (3.0 * a2) + (3.0 * a) + 1.0); w3 = (1.0 / 6.0) * a3; values[i] = 1.0 - (w1 / (w0 + w1)) + a; values[i + 1] = 1.0 + (w3 / (w2 + w3)) - a; values[i + 2] = w0 + w1; values[i + 3] = w2 + w3; } glGenTextures (1, &lTexture); glBindTexture (GL_TEXTURE_1D, lTexture); glTexImage1D (GL_TEXTURE_1D, 0, format, 128, 0, GL_RGBA, GL_FLOAT, values); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBindTexture (GL_TEXTURE_1D, 0); } BicubicScreen::BicubicScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)) { bool failed = false; const char *glExtensions; GLenum format = GL_RGBA16F_ARB; if (!GL::fragmentProgram) { compLogMessage ("bicube", CompLogLevelFatal, "GL_ARB_fragment_program not supported."); setFailed (); failed = true; } if (!failed) { glExtensions = (const char *) glGetString (GL_EXTENSIONS); if (!glExtensions) { compLogMessage ("bicubic", CompLogLevelFatal, "No valid GL extensions string found."); setFailed (); failed = true; } } if (!failed) { if (!strstr (glExtensions, "GL_ARB_texture_float")) { compLogMessage ("bicubic", CompLogLevelFatal, "GL_ARB_texture_float not supported. " "This can lead to visual artifacts."); format = GL_RGBA; } } generateLookupTexture (format); } BicubicScreen::~BicubicScreen () { BicubicFunction *f; while (func.size ()) { f = func.front (); GLFragment::destroyFragmentFunction (f->handle); func.remove (f); } glDeleteTextures (1, &lTexture); } BicubicWindow::BicubicWindow (CompWindow *window) : PluginClassHandler (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { GLWindowInterface::setHandler (gWindow); } bool BicubicPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/bicubic/bicubic.xml.in0000644000004100000410000000067513246301623017063 0ustar www-datawww-data <_short>Bicubic filter <_long>Bicubic texture filtering opengl Effects composite opengl blur ./plugins/fadedesktop/0000755000004100000410000000000013246301623015215 5ustar www-datawww-data./plugins/fadedesktop/CMakeLists.txt0000644000004100000410000000016013246301623017752 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (fadedesktop PLUGINDEPS opengl composite) ./plugins/fadedesktop/src/0000755000004100000410000000000013246301623016004 5ustar www-datawww-data./plugins/fadedesktop/src/fadedesktop.h0000644000004100000410000000427213246301623020453 0ustar www-datawww-data/** * * Compiz fade to desktop plugin * * fadedesktop.c * * Copyright (c) 2006 Robert Carr * 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include "fadedesktop_options.h" class FadedesktopScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public FadedesktopOptions { public: typedef enum { Off, Out, On, In } State; public: FadedesktopScreen (CompScreen *); void activateEvent (bool); void preparePaint (int); void donePaint (); void enterShowDesktopMode (); void leaveShowDesktopMode (CompWindow *w); CompositeScreen *cScreen; GLScreen *gScreen; State state; int fadeTime; }; class FadedesktopWindow : public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: FadedesktopWindow (CompWindow *); bool isFadedesktopWindow (); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool fading; bool isHidden; GLushort opacity; }; #define FD_SCREEN(s) \ FadedesktopScreen *fs = FadedesktopScreen::get (s); #define FD_WINDOW(w) \ FadedesktopWindow *fw = FadedesktopWindow::get (w); class FadedesktopPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/fadedesktop/src/fadedesktop.cpp0000644000004100000410000001261513246301623021006 0ustar www-datawww-data/** * * Compiz fade to desktop plugin * * fadedesktop.cpp * * Copyright (c) 2006 Robert Carr * 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "fadedesktop.h" COMPIZ_PLUGIN_20090315 (fadedesktop, FadedesktopPluginVTable); void FadedesktopScreen::activateEvent (bool activating) { CompOption::Vector o; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value (). set ((int) screen->root ()); o[1].value (). set (activating); screen->handleCompizEvent ("fadedesktop", "activate", o); } bool FadedesktopWindow::isFadedesktopWindow () { FD_SCREEN (screen); if (!window->managed ()) return false; if (window->grabbed ()) return false; if (window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return false; if (window->state () & CompWindowStateSkipPagerMask) return false; if (!fs->optionGetWindowMatch ().evaluate (window)) return false; return true; } void FadedesktopScreen::preparePaint (int msSinceLastPaint) { fadeTime -= msSinceLastPaint; if (fadeTime < 0) fadeTime = 0; if (state == Out || state == In) { foreach (CompWindow *w, screen->windows ()) { bool doFade; FD_WINDOW (w); if (state == Out) doFade = fw->fading && w->inShowDesktopMode (); else doFade = fw->fading && !w->inShowDesktopMode (); if (doFade) { float windowFadeTime; if (state == Out) windowFadeTime = fadeTime; else windowFadeTime = optionGetFadetime () - fadeTime; fw->opacity = fw->cWindow->opacity () * (windowFadeTime / optionGetFadetime ()); } } } cScreen->preparePaint (msSinceLastPaint); } void FadedesktopScreen::donePaint () { if (state == Out || state == In) { if (fadeTime <= 0) { bool isStillSD = false; foreach (CompWindow *w, screen->windows ()) { FD_WINDOW (w); if (fw->fading) { if (state == Out) { w->hide (); fw->isHidden = true; } fw->fading = false; } if (w->inShowDesktopMode ()) isStillSD = true; } if (state == Out || isStillSD) state = On; else state = Off; activateEvent (false); } else { cScreen->damageScreen (); } } cScreen->donePaint (); } bool FadedesktopWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (fading || isHidden) { GLWindowPaintAttrib wAttrib = attrib; wAttrib.opacity = opacity; return gWindow->glPaint (wAttrib, transform, region, mask); } return gWindow->glPaint (attrib, transform, region, mask); } void FadedesktopScreen::enterShowDesktopMode () { if (state == Off || state == In) { if (state == Off) activateEvent (true); state = Out; fadeTime = optionGetFadetime() - fadeTime; foreach (CompWindow *w, screen->windows ()) { FD_WINDOW (w); if (fw->isFadedesktopWindow ()) { fw->fading = true; w->setShowDesktopMode (true); fw->opacity = fw->cWindow->opacity (); } } cScreen->damageScreen (); } screen->enterShowDesktopMode (); } void FadedesktopScreen::leaveShowDesktopMode (CompWindow *w) { if (state != Off) { if (state != In) { if (state == On) activateEvent (true); state = In; fadeTime = optionGetFadetime() - fadeTime; } foreach (CompWindow *cw, screen->windows ()) { if (w && (w->id () != cw->id ())) continue; FD_WINDOW (cw); if (fw->isHidden) { cw->setShowDesktopMode (false); cw->show (); fw->isHidden = false; fw->fading = true; } else if (fw->fading) { cw->setShowDesktopMode (false); } } cScreen->damageScreen (); } screen->leaveShowDesktopMode (w); } FadedesktopScreen::FadedesktopScreen (CompScreen *screen) : PluginClassHandler (screen), FadedesktopOptions (), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), state (Off), fadeTime (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); } FadedesktopWindow::FadedesktopWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), fading (false), isHidden (false), opacity (OPAQUE) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow); } bool FadedesktopPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/fadedesktop/fadedesktop.xml.in0000644000004100000410000000173613246301623020644 0ustar www-datawww-data <_short>Fade to Desktop <_long>Easily access your desktop Desktop opengl fade composite opengl decor showdesktop fadetodesktop ./plugins/wallpaper/0000755000004100000410000000000013246301624014714 5ustar www-datawww-data./plugins/wallpaper/CMakeLists.txt0000644000004100000410000000020013246301623017443 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (wallpaper PLUGINDEPS composite opengl LIBRARIES Xrender) ./plugins/wallpaper/src/0000755000004100000410000000000013246301624015503 5ustar www-datawww-data./plugins/wallpaper/src/wallpaper.cpp0000644000004100000410000004460413246301623020205 0ustar www-datawww-data/* * Compiz wallpaper plugin * * wallpaper.cpp * * Copyright (c) 2008 Dennis Kasprzyk * * Rewrite of wallpaper.c * Copyright (c) 2007 Robert Carr * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "wallpaper.h" COMPIZ_PLUGIN_20090315 (wallpaper, WallpaperPluginVTable); static Visual * findArgbVisual (Display *dpy, int screen) { XVisualInfo temp; int nvi; temp.screen = screen; temp.depth = 32; temp.c_class = TrueColor; XVisualInfo *xvi = XGetVisualInfo (dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &temp, &nvi); if (!xvi) return 0; Visual *visual = 0; XRenderPictFormat *format; for (int i = 0; i < nvi; ++i) { format = XRenderFindVisualFormat (dpy, xvi[i].visual); if (format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; break; } } XFree (xvi); return visual; } void WallpaperScreen::createFakeDesktopWindow () { Display *dpy = screen->dpy (); XSizeHints xsh; XWMHints xwmh; XSetWindowAttributes attr; XserverRegion region; Visual *visual = findArgbVisual (dpy, screen->screenNum ()); if (!visual) return; xsh.flags = PSize | PPosition | PWinGravity; xsh.width = 1; xsh.height = 1; xsh.win_gravity = StaticGravity; xwmh.flags = InputHint; xwmh.input = 0; attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, screen->root (), visual, AllocNone); fakeDesktop = XCreateWindow (dpy, screen->root (), -1, -1, 1, 1, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap, &attr); XSetWMProperties (dpy, fakeDesktop, NULL, NULL, programArgv, programArgc, &xsh, &xwmh, NULL); XChangeProperty (dpy, fakeDesktop, Atoms::winStateSkipPager, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winStateSkipPager, 1); XChangeProperty (dpy, fakeDesktop, Atoms::winType, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winTypeDesktop, 1); region = XFixesCreateRegion (dpy, NULL, 0); XFixesSetWindowShapeRegion (dpy, fakeDesktop, ShapeInput, 0, 0, region); XFixesDestroyRegion (dpy, region); XMapWindow (dpy, fakeDesktop); XLowerWindow (dpy, fakeDesktop); } void WallpaperScreen::destroyFakeDesktopWindow () { if (fakeDesktop != None) XDestroyWindow (screen->dpy (), fakeDesktop); fakeDesktop = None; } void WallpaperScreen::updateProperty () { if (backgroundsPrimary.empty()) { if (propSet) XDeleteProperty (screen->dpy (), screen->root (), compizWallpaperAtom); propSet = false; } else if (!propSet) { unsigned char sd = 1; XChangeProperty (screen->dpy (), screen->root (), compizWallpaperAtom, XA_CARDINAL, 8, PropModeReplace, &sd, 1); propSet = true; } } static void initBackground (WallpaperBackground *back) { unsigned int c[2]; unsigned short *color; if (!back->image.empty ()) { CompString pname ("wallpaper"); back->imgTex = GLTexture::readImageToTexture (back->image, pname, back->imgSize); if (back->imgTex.empty ()) { compLogMessage ("wallpaper", CompLogLevelWarn, "Failed to load image: %s", back->image.c_str ()); back->imgSize.setWidth (0); back->imgSize.setHeight (0); } } color = back->color1; c[0] = ((color[3] << 16) & 0xff000000) | ((color[0] * color[3] >> 8) & 0xff0000) | ((color[1] * color[3] >> 16) & 0xff00) | ((color[2] * color[3] >> 24) & 0xff); color = back->color2; c[1] = ((color[3] << 16) & 0xff000000) | ((color[0] * color[3] >> 8) & 0xff0000) | ((color[1] * color[3] >> 16) & 0xff00) | ((color[2] * color[3] >> 24) & 0xff); if (back->fillType == WallpaperOptions::BgFillTypeVerticalGradient) { back->fillTex = GLTexture::imageBufferToTexture ((char *) &c, CompSize (1, 2)); back->fillTexMatrix.push_back (back->fillTex[0]->matrix()); back->fillTexMatrix[0].xx = 0.0; } else if (back->fillType == WallpaperOptions::BgFillTypeHorizontalGradient) { back->fillTex = GLTexture::imageBufferToTexture ((char *) &c, CompSize (2, 1)); back->fillTexMatrix.push_back (back->fillTex[0]->matrix()); back->fillTexMatrix[0].yy = 0.0; } else { back->fillTex = GLTexture::imageBufferToTexture ((char *) &c, CompSize (1, 1)); back->fillTexMatrix.push_back (back->fillTex[0]->matrix()); back->fillTexMatrix[0].xx = 0.0; back->fillTexMatrix[0].yy = 0.0; } } void WallpaperScreen::blackenSecondary () { unsigned short black [] = {1, 0, 0, 0}; backgroundsSecondary.clear (); for (int i = 0; i < numBackgrounds; ++i) { backgroundsSecondary.push_back (WallpaperBackground ()); backgroundsSecondary[i].image = ""; backgroundsSecondary[i].imagePos = 0; backgroundsSecondary[i].fillType = 0; memcpy (backgroundsSecondary[i].color1, black, 4 * sizeof(unsigned short)); memcpy (backgroundsSecondary[i].color2, black, 4 * sizeof(unsigned short)); initBackground (&backgroundsSecondary[i]); } } void WallpaperScreen::updateBackgrounds () { #define GET_OPTION(opt) CompOption::Value::Vector c##opt = optionGet##opt (); GET_OPTION (BgImage); GET_OPTION (BgImagePos); GET_OPTION (BgFillType); GET_OPTION (BgColor1); GET_OPTION (BgColor2); #undef GET_OPTION if (!((cBgImagePos.size () == cBgImage.size ()) && (cBgFillType.size () == cBgImage.size ()) && (cBgColor1.size () == cBgImage.size ()) && (cBgColor2.size () == cBgImage.size ()))) { compLogMessage ("wallpaper", CompLogLevelWarn, "Malformed option"); return; } numBackgrounds = cBgImage.size (); backgroundsPrimary.clear (); for (unsigned int i = 0; i < cBgImage.size (); ++i) { backgroundsPrimary.push_back (WallpaperBackground ()); backgroundsPrimary[i].image = cBgImage[i].s (); backgroundsPrimary[i].imagePos = cBgImagePos[i].i (); backgroundsPrimary[i].fillType = cBgFillType[i].i (); memcpy (backgroundsPrimary[i].color1, cBgColor1[i].c (), 4 * sizeof(unsigned short)); memcpy (backgroundsPrimary[i].color2, cBgColor2[i].c (), 4 * sizeof(unsigned short)); initBackground (&backgroundsPrimary[i]); } blackenSecondary (); fadeDuration = optionGetCycleTimeout (); fadeTimer = optionGetFadeDuration (); } void WallpaperScreen::rotateBackgrounds () { if (numBackgrounds) { WallpaperBackground item = backgroundsPrimary.front(); backgroundsSecondary = backgroundsPrimary; backgroundsPrimary.erase (backgroundsPrimary.begin ()); backgroundsPrimary.push_back (item); } fadeTimer = fadeDuration; } void WallpaperScreen::updateTimers () { fadeTimeout = (optionGetCycleTimeout () * 1000 * 60); fadeDuration = (optionGetFadeDuration () * 1000); fadeTimer = fadeDuration; if (optionGetCycleWallpapers ()) rotateTimer.start (fadeTimeout, fadeTimeout * 1.2); else rotateTimer.stop (); } bool WallpaperScreen::rotateTimeout () { rotateBackgrounds (); updateProperty (); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); cScreen->damageScreen (); return true; } /* Installed as a handler for the images setting changing through bcop */ void WallpaperScreen::wallpaperBackgroundsChanged (CompOption *o, Options num) { updateBackgrounds (); updateProperty (); updateTimers (); cScreen->damageScreen (); } void WallpaperScreen::wallpaperCycleOptionChanged (CompOption *o, Options num) { blackenSecondary (); updateTimers (); } void WallpaperScreen::wallpaperToggleCycle (CompOption *o, Options num) { if (optionGetCycleWallpapers ()) rotateTimer.start (fadeTimeout, fadeTimeout * 1.2); else rotateTimer.stop (); } WallpaperBackground * WallpaperScreen::getBackgroundForViewport (WallpaperBackgrounds &bg) { CompPoint offset = cScreen->windowPaintOffset (); CompPoint vp = screen->vp (); CompSize vpSize = screen->vpSize (); CompRect workarea = screen->workArea (); if (bg.empty()) return NULL; int x = vp.x () - (offset.x () / (int) workarea.width ()); x %= vpSize.width (); if (x < 0) x += vpSize.width (); int y = vp.y () - (offset.y () / (int) workarea.height ()); y %= vpSize.height (); if (y < 0) y += vpSize.height (); return &bg[(x + (y * vpSize.width ())) % bg.size()]; } void WallpaperScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (!screen->desktopWindowCount () && fakeDesktop == None && !backgroundsPrimary.empty()) createFakeDesktopWindow (); if ((screen->desktopWindowCount () > 1 || backgroundsPrimary.empty()) && fakeDesktop != None) destroyFakeDesktopWindow (); } void WallpaperScreen::preparePaint (int msSinceLastPaint) { fadeTimer -= msSinceLastPaint; if (fadeTimer < 0) fadeTimer = 0; alpha = (fadeDuration - fadeTimer) / fadeDuration; cScreen->preparePaint (msSinceLastPaint); } void WallpaperScreen::donePaint () { if (fadeTimer > 0) cScreen->damageScreen (); else { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } cScreen->donePaint (); } bool WallpaperScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { desktop = NULL; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void WallpaperWindow::drawBackgrounds (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask, WallpaperBackgrounds &bg, bool fadingIn) { WALLPAPER_SCREEN (screen); CompRect tmpRect; GLTexture::Matrix matrix; GLTexture::MatrixList tmpMatrixList; WallpaperBackground *back = ws->getBackgroundForViewport (bg); GLWindowPaintAttrib tmpAttrib = attrib; tmpMatrixList.push_back (matrix); GLVertexBuffer *vb = gWindow->vertexBuffer (); vb->begin (); tmpMatrixList[0] = back->fillTexMatrix[0]; if (back->fillType == WallpaperOptions::BgFillTypeVerticalGradient) tmpMatrixList[0].yy /= (float) screen->height () / 2.0; else if (back->fillType == WallpaperOptions::BgFillTypeHorizontalGradient) tmpMatrixList[0].xx /= (float) screen->width () / 2.0; gWindow->glAddGeometry (tmpMatrixList, screen->region (), (mask & PAINT_WINDOW_TRANSFORMED_MASK) ? CompRegion::infinite () : region); if (ws->optionGetCycleWallpapers ()) tmpAttrib.opacity *= fadingIn ? (1.0f - ws->alpha) : ws->alpha; if (tmpAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_BLEND_MASK; if (vb->end ()) gWindow->glDrawTexture(back->fillTex[0], transform, tmpAttrib, mask); if (back->imgSize.width () && back->imgSize.height ()) { CompRegion reg = screen->region (); float s1, s2; int x, y; vb->begin (); tmpMatrixList[0] = back->imgTex[0]->matrix (); if (back->imagePos == WallpaperOptions::BgImagePosScaleAndCrop) { s1 = (float) screen->width () / back->imgSize.width (); s2 = (float) screen->height () / back->imgSize.height (); s1 = MAX (s1, s2); tmpMatrixList[0].xx /= s1; tmpMatrixList[0].yy /= s1; x = (screen->width () - ((int)back->imgSize.width () * s1)) / 2.0; tmpMatrixList[0].x0 -= x * tmpMatrixList[0].xx; y = (screen->height () - ((int)back->imgSize.height () * s1)) / 2.0; tmpMatrixList[0].y0 -= y * tmpMatrixList[0].yy; } else if (back->imagePos == WallpaperOptions::BgImagePosScaled) { s1 = (float) screen->width () / back->imgSize.width (); s2 = (float) screen->height () / back->imgSize.height (); tmpMatrixList[0].xx /= s1; tmpMatrixList[0].yy /= s2; } else if (back->imagePos == WallpaperOptions::BgImagePosCentered) { x = (screen->width () - (int)back->imgSize.width ()) / 2; y = (screen->height () - (int)back->imgSize.height ()) / 2; tmpMatrixList[0].x0 -= x * tmpMatrixList[0].xx; tmpMatrixList[0].y0 -= y * tmpMatrixList[0].yy; tmpRect.setLeft (MAX (0, x)); tmpRect.setTop (MAX (0, y)); tmpRect.setRight (MIN (screen->width (), x + back->imgSize.width ())); tmpRect.setBottom (MIN (screen->height (), y + back->imgSize.height ())); reg = CompRegion (tmpRect); } if (back->imagePos == WallpaperOptions::BgImagePosTiled || back->imagePos == WallpaperOptions::BgImagePosCenterTiled) { if (back->imagePos == WallpaperOptions::BgImagePosCenterTiled) { x = (screen->width () - (int)back->imgSize.width ()) / 2; y = (screen->height () - (int)back->imgSize.height ()) / 2; if (x > 0) x = (x % (int)back->imgSize.width ()) - (int)back->imgSize.width (); if (y > 0) y = (y % (int)back->imgSize.height ()) - (int)back->imgSize.height (); } else { x = 0; y = 0; } while (y < (int) screen->height ()) { int xi = x; while (xi < (int) screen->width ()) { tmpMatrixList[0] = back->imgTex[0]->matrix (); tmpMatrixList[0].x0 -= xi * tmpMatrixList[0].xx; tmpMatrixList[0].y0 -= y * tmpMatrixList[0].yy; tmpRect.setLeft (MAX (0, xi)); tmpRect.setTop (MAX (0, y)); tmpRect.setRight (MIN (screen->width (), xi + back->imgSize.width ())); tmpRect.setBottom (MIN (screen->height (), y + back->imgSize.height ())); reg = CompRegion (tmpRect); gWindow->glAddGeometry (tmpMatrixList, reg, region); xi += (int)back->imgSize.width (); } y += (int)back->imgSize.height (); } } else gWindow->glAddGeometry (tmpMatrixList, reg, region); if (vb->end ()) gWindow->glDrawTexture (back->imgTex[0], transform, tmpAttrib, mask | PAINT_WINDOW_BLEND_MASK); } } bool WallpaperWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { WALLPAPER_SCREEN (screen); bool ret = gWindow->glDraw (transform, attrib, region, mask); if ((!ws->desktop || ws->desktop == window) && !ws->backgroundsPrimary.empty() && window->type () & CompWindowTypeDesktopMask) { int filterIdx; if (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) filterIdx = SCREEN_TRANS_FILTER; else if (mask & PAINT_WINDOW_TRANSFORMED_MASK) filterIdx = WINDOW_TRANS_FILTER; else filterIdx = NOTHING_TRANS_FILTER; GLTexture::Filter saveFilter = ws->gScreen->filter (filterIdx); ws->gScreen->setFilter (filterIdx, GLTexture::Good); if (ws->optionGetCycleWallpapers () && ws->rotateTimer.active ()) drawBackgrounds (transform, attrib, region, mask, ws->backgroundsSecondary, true); drawBackgrounds (transform, attrib, region, mask, ws->backgroundsPrimary, false); ws->gScreen->setFilter (filterIdx, saveFilter); ws->desktop = window; } return ret; } bool WallpaperWindow::damageRect (bool initial, const CompRect& rect) { WALLPAPER_SCREEN (screen); if (window->id () == ws->fakeDesktop){ ws->cScreen->damageScreen ();} return cWindow->damageRect (initial, rect); } WallpaperScreen::WallpaperScreen (CompScreen *screen) : PluginClassHandler (screen), WallpaperOptions (), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), backgroundsPrimary (), backgroundsSecondary () { ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); compizWallpaperAtom = XInternAtom (screen->dpy (), "_COMPIZ_WALLPAPER_SUPPORTED", 0); propSet = false; fakeDesktop = None; desktop = NULL; fadeTimer = 0.0f; fadeTimeout = 0.0f; fadeDuration = 0.0f; alpha = 0.0f; optionSetBgImageNotify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgImagePosNotify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgFillTypeNotify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgColor1Notify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetBgColor2Notify (boost::bind (&WallpaperScreen:: wallpaperBackgroundsChanged, this, _1, _2)); optionSetCycleWallpapersNotify (boost::bind (&WallpaperScreen:: wallpaperToggleCycle, this, _1, _2)); optionSetCycleTimeoutNotify (boost::bind (&WallpaperScreen:: wallpaperCycleOptionChanged, this, _1, _2)); optionSetFadeDurationNotify (boost::bind (&WallpaperScreen:: wallpaperCycleOptionChanged, this, _1, _2)); rotateTimer.setCallback (boost::bind (&WallpaperScreen::rotateTimeout, this)); updateBackgrounds (); updateProperty (); cScreen->damageScreen (); if (!screen->desktopWindowCount () && backgroundsPrimary.size()) createFakeDesktopWindow (); } WallpaperScreen::~WallpaperScreen () { if (propSet) XDeleteProperty (screen->dpy (), screen->root (), compizWallpaperAtom); if (fakeDesktop != None) destroyFakeDesktopWindow (); } WallpaperWindow::WallpaperWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)) { CompositeWindowInterface::setHandler (cWindow, true); GLWindowInterface::setHandler (gWindow, true); } bool WallpaperPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/wallpaper/src/wallpaper.h0000644000004100000410000001015113246301623017640 0ustar www-datawww-data/* * Compiz wallpaper plugin * * wallpaper.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@compiz-fusion.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include "wallpaper_options.h" #include #include class WallpaperBackground { public: CompString image; int imagePos; int fillType; unsigned short color1[4]; unsigned short color2[4]; GLTexture::List imgTex; CompSize imgSize; GLTexture::List fillTex; GLTexture::MatrixList fillTexMatrix; }; typedef std::vector WallpaperBackgrounds; class WallpaperScreen : public PluginClassHandler, public WallpaperOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: WallpaperScreen (CompScreen *screen); ~WallpaperScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool propSet; Window fakeDesktop; CompWindow *desktop; int numBackgrounds; CompTimer rotateTimer; float fadeTimer; float fadeTimeout; float fadeDuration; float alpha; WallpaperBackgrounds backgroundsPrimary; WallpaperBackgrounds backgroundsSecondary; void createFakeDesktopWindow (); void destroyFakeDesktopWindow (); void updateProperty(); void blackenSecondary (); void updateBackgrounds (); void rotateBackgrounds (); void updateTimers (); bool rotateTimeout (); void wallpaperBackgroundsChanged (CompOption *opt, Options num); void wallpaperCycleOptionChanged (CompOption *opt, Options num); void wallpaperToggleCycle (CompOption *opt, Options num); WallpaperBackground *getBackgroundForViewport (WallpaperBackgrounds&); void handleEvent (XEvent *); void preparePaint (int msSinceLastPaint); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); /* _COMPIZ_WALLPAPER_SUPPORTED atom is used to indicate that * the wallpaper plugin or a plugin providing similar functionality is * active so that desktop managers can respond appropriately */ Atom compizWallpaperAtom; }; class WallpaperWindow : public PluginClassHandler , public CompositeWindowInterface, public GLWindowInterface { public: WallpaperWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; void drawBackgrounds (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int , WallpaperBackgrounds &, bool ); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int ); bool damageRect (bool , const CompRect &); }; #define WALLPAPER_SCREEN(s) \ WallpaperScreen *ws = WallpaperScreen::get (s); #define WALLPAPER_WINDOW(w) \ WallpaperWindow *ww = WallpaperWindow::get (w); class WallpaperPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/wallpaper/wallpaper.xml.in0000644000004100000410000000575013246301623020040 0ustar www-datawww-data <_short>Wallpaper <_long>Define individual desktop wallpapers for each viewport and cycle through them automatically Utility opengl composite opengl svg png imgjpeg decor <_short>Desktop Backgrounds <_short>Wallpaper Rotation ./plugins/kdecompat/0000755000004100000410000000000013246301623014673 5ustar www-datawww-data./plugins/kdecompat/CMakeLists.txt0000644000004100000410000000015613246301623017435 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (kdecompat PLUGINDEPS composite opengl) ./plugins/kdecompat/src/0000755000004100000410000000000013246301623015462 5ustar www-datawww-data./plugins/kdecompat/src/kdecompat.cpp0000644000004100000410000005531013246301623020141 0ustar www-datawww-data/* * * Compiz KDE compatibility plugin * * kdecompat.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "kdecompat.h" #include COMPIZ_PLUGIN_20090315 (kdecompat, KDECompatPluginVTable); inline void KDECompatScreen::checkPaintFunctions () { bool enabled = false; foreach (CompWindow *w, screen->windows ()) { KDECompatWindow *kcw = KDECompatWindow::get (w); bool wEnabled = (kcw->mPreviews.size () || kcw->mIsPreview || (kcw->mSlideData && kcw->mSlideData->remaining > 0.0)); enabled |= wEnabled; kcw->gWindow->glPaintSetEnabled (kcw, wEnabled); kcw->cWindow->damageRectSetEnabled (kcw, wEnabled); } KDECOMPAT_SCREEN (screen); gScreen->glPaintOutputSetEnabled (ks, enabled); cScreen->donePaintSetEnabled (ks, enabled); cScreen->preparePaintSetEnabled (ks, enabled); } void KDECompatWindow::stopCloseAnimation () { while (mUnmapCnt) { window->unmap (); mUnmapCnt--; } while (mDestroyCnt) { window->destroy (); mDestroyCnt--; } } void KDECompatWindow::sendSlideEvent (bool start) { CompOption::Vector o (2); o[0] = CompOption ("window", CompOption::TypeInt); o[0].value ().set ((int) window->id ()); o[1] = CompOption ("active", CompOption::TypeBool); o[1].value ().set (start); screen->handleCompizEvent ("kdecompat", "slide", o); } void KDECompatWindow::startSlideAnimation (bool appearing) { if (!mSlideData) return; KDECOMPAT_SCREEN (screen); if (appearing) mSlideData->duration = ks->optionGetSlideInDuration (); else mSlideData->duration = ks->optionGetSlideOutDuration (); if (mSlideData->remaining > mSlideData->duration) mSlideData->remaining = mSlideData->duration; else mSlideData->remaining = mSlideData->duration - mSlideData->remaining; mSlideData->appearing = appearing; ks->mHasSlidingPopups = true; ks->checkPaintFunctions (); cWindow->addDamage (); sendSlideEvent (true); } void KDECompatWindow::endSlideAnimation () { if (mSlideData) { mSlideData->remaining = 0; stopCloseAnimation (); sendSlideEvent (false); } KDECompatScreen::get (screen)->checkPaintFunctions (); } void KDECompatScreen::preparePaint (int msSinceLastPaint) { if (mHasSlidingPopups) { foreach (CompWindow *w, screen->windows ()) { KDECOMPAT_WINDOW (w); if (!kw->mSlideData) continue; kw->mSlideData->remaining -= msSinceLastPaint; if (kw->mSlideData->remaining <= 0) kw->endSlideAnimation (); } } cScreen->preparePaint (msSinceLastPaint); } bool KDECompatScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (mHasSlidingPopups) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); return status; } void KDECompatScreen::donePaint () { if (mHasSlidingPopups) { mHasSlidingPopups = false; foreach (CompWindow *w, screen->windows ()) { KDECOMPAT_WINDOW (w); if (kw->mSlideData && kw->mSlideData->remaining) { kw->cWindow->addDamage (); mHasSlidingPopups = true; } } } cScreen->donePaint (); } bool KDECompatWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status = false; KDECOMPAT_SCREEN (screen); if ((!(ks->optionGetPlasmaThumbnails () || mPreviews.empty ()) && !(mSlideData || mSlideData->remaining)) || !window->mapNum () || (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) { status = gWindow->glPaint (attrib, transform, region, mask); return status; } if (mSlideData && mSlideData->remaining) { GLMatrix wTransform = transform; SlideData *data = mSlideData; float xTranslate = 0, yTranslate = 0, remainder; CompRect clipBox (window->x (), window->y (), window->width (), window->height ()); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; remainder = (float) data->remaining / data->duration; if (!data->appearing) remainder = 1.0 - remainder; switch (data->position) { case East: xTranslate = (data->start - window->x ()) * remainder; clipBox.setWidth (data->start - clipBox.x ()); break; case West: xTranslate = (data->start - window->width ()) * remainder; clipBox.setX (data->start); break; case North: yTranslate = (data->start - window->height ()) * remainder; clipBox.setY (data->start); break; case South: default: yTranslate = (data->start - window->y ()) * remainder; clipBox.setHeight (data->start - clipBox.y1 ()); break; } status = gWindow->glPaint (attrib, transform, region, mask | PAINT_WINDOW_NO_CORE_INSTANCE_MASK); if (window->alpha () || attrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (xTranslate, yTranslate, 0.0f); glEnable (GL_SCISSOR_TEST); glScissor (clipBox.x1 (), screen->height () - clipBox.y2 (), clipBox.width (), clipBox.height ()); status = gWindow->glDraw (wTransform, attrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); glDisable (GL_SCISSOR_TEST); } foreach (const Thumb& thumb, mPreviews) { CompWindow *tw = screen->findWindow (thumb.id); GLWindow *gtw; const CompRect &rect = thumb.thumb; unsigned int paintMask = mask | PAINT_WINDOW_TRANSFORMED_MASK; float xScale = 1.0f, yScale = 1.0f, xTranslate, yTranslate; GLTexture *icon = NULL; if (!tw) continue; gtw = GLWindow::get (tw); xTranslate = rect.x () + window->x () - tw->x (); yTranslate = rect.y () + window->y () - tw->y (); if (!gtw->textures ().empty ()) { unsigned int width, height; width = tw->width () - tw->input ().left + tw->input ().right; height = tw->height () - tw->input ().top + tw->input ().bottom; xScale = (float) rect.width () / width; yScale = (float) rect.height () / height; xTranslate += tw->input ().left * xScale; yTranslate += tw->input ().top * yScale; } else { icon = gWindow->getIcon (512, 512); if (!icon) icon = ks->gScreen->defaultIcon (); if (icon && !icon->name ()) icon = NULL; if (icon) { GLTexture::MatrixList matrices (1); paintMask |= PAINT_WINDOW_BLEND_MASK; if (icon->width () >= rect.width () || icon->height () >= rect.height ()) { xScale = (float) rect.width () / icon->width (); yScale = (float) rect.height () / icon->height (); if (xScale < yScale) yScale = xScale; else xScale = yScale; } xTranslate += rect.width () / 2 - (icon->width () * xScale / 2); yTranslate += rect.height () / 2 - (icon->height () * yScale / 2); matrices[0] = icon->matrix (); matrices[0].x0 -= (tw->x () * icon->matrix ().xx); matrices[0].y0 -= (tw->y () * icon->matrix ().yy); gtw->vertexBuffer ()->begin (); gtw->glAddGeometry (matrices, tw->geometry (), CompRegion::infinite ()); gtw->vertexBuffer ()->end (); } } if (!gtw->textures ().empty () || icon) { GLMatrix wTransform (transform); if (tw->alpha () || attrib.opacity != OPAQUE) paintMask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (tw->x (), tw->y (), 0.0f); wTransform.scale (xScale, yScale, 1.0f); wTransform.translate (xTranslate / xScale - tw->x (), yTranslate / yScale - tw->y (), 0.0f); if (!gtw->textures ().empty ()) gtw->glDraw (wTransform, attrib, CompRegion::infinite (), paintMask); else if (icon) gtw->glDrawTexture (icon, wTransform, attrib, paintMask); } } if (!status) status = gWindow->glPaint (attrib, transform, region, mask); return status; } void KDECompatWindow::updatePreviews () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; unsigned int oldPreviewsSize; KDECOMPAT_SCREEN (screen); oldPreviewsSize = mPreviews.size (); mPreviews.clear (); result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdePreviewAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == ks->mKdePreviewAtom) { long *data = (long *) propData; unsigned int nPreview = *data++; if (n == (6 * nPreview + 1)) { while (mPreviews.size () < nPreview) { Thumb t; if (*data++ != 5) break; t.id = *data++; t.thumb.setX (*data++); t.thumb.setY (*data++); t.thumb.setWidth (*data++); t.thumb.setHeight (*data++); mPreviews.push_back (t); } } } XFree (propData); } if (oldPreviewsSize != mPreviews.size ()) cWindow->damageOutputExtents (); foreach (CompWindow *cw, screen->windows ()) { CompWindow *rw; KDECompatWindow *kcw = KDECompatWindow::get (cw); kcw->mIsPreview = false; foreach (rw, screen->windows ()) { KDECompatWindow *krw = KDECompatWindow::get (rw); foreach (const Thumb& t, krw->mPreviews) { if (t.id == cw->id ()) { kcw->mIsPreview = true; break; } } if (kcw->mIsPreview) break; } ks->checkPaintFunctions (); } } void KDECompatWindow::updateSlidePosition () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; KDECOMPAT_SCREEN (screen); if (mSlideData) { delete mSlideData; mSlideData = NULL; } result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdeSlideAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == ks->mKdeSlideAtom && n == 2) { long *data = (long *) propData; mSlideData = new SlideData; if (mSlideData) { mSlideData->remaining = 0; mSlideData->start = data[0]; mSlideData->position = (KDECompatWindow::SlidePosition) data[1]; } } window->windowNotifySetEnabled (this, true); XFree (propData); } else window->windowNotifySetEnabled (this, false); ks->checkPaintFunctions (); } void KDECompatWindow::handleClose (bool destroy) { KDECOMPAT_SCREEN (screen); if (mSlideData && ks->optionGetSlidingPopups ()) { if (destroy) { mDestroyCnt++; window->incrementDestroyReference (); } else { mUnmapCnt++; window->incrementUnmapReference (); } if (mSlideData->appearing || !mSlideData->remaining) startSlideAnimation (false); } } CompAction * KDECompatScreen::getScaleAction (const char *name) { CompPlugin *p = mScaleHandle; if (!p) return NULL; foreach (CompOption &option, p->vTable->getOptions ()) { if (option.type () == CompOption::TypeAction || option.type () == CompOption::TypeButton || option.type () == CompOption::TypeKey) { if (option.name () == name) return &option.value ().action (); } } return NULL; } bool KDECompatScreen::scaleActivate () { if (mPresentWindow && !mScaleActive) { CompOption::Vector options (2); CompAction *action; options[0] = CompOption ("root", CompOption::TypeInt); options[0].value ().set ((int) screen->root ()); options[1] = CompOption ("match", CompOption::TypeMatch); options[1].value ().set (CompMatch ()); CompMatch& windowMatch = options[1].value ().match (); foreach (Window win, mPresentWindowList) { std::ostringstream exp; exp << "xid=" << win; windowMatch |= exp.str (); } windowMatch.update (); action = getScaleAction ("initiate_all_key"); if (action && action->initiate ()) action->initiate () (action, 0, options); } return false; } void KDECompatWindow::presentGroup () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; KDECOMPAT_SCREEN (screen); if (!ks->optionGetPresentWindows ()) return; if (!ks->mScaleHandle) { compLogMessage ("kdecompat", CompLogLevelWarn, "Scale plugin not loaded, present windows " "effect not available!"); return; } result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdePresentGroupAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == ks->mKdePresentGroupAtom) { long *property = (long *) propData; if (!n || !property[0]) { CompOption::Vector o (1); CompAction *action; /* end scale */ o[0] = CompOption ("root", CompOption::TypeInt); o[0].value ().set ((int) screen->root ()); action = ks->getScaleAction ("initiate_all_key"); if (action && action->terminate ()) action->terminate () (action, CompAction::StateCancel, o); ks->mPresentWindow = NULL; } else { /* Activate scale using a timeout - Rationale: * At the time we get the property notify event, Plasma * most likely holds a pointer grab due to the action being * initiated by a button click. As scale also wants to get * a pointer grab, we need to delay the activation a bit so * Plasma can release its grab. */ ks->mPresentWindow = window; ks->mPresentWindowList.clear (); for (unsigned int i = 0; i < n; i++) ks->mPresentWindowList.push_back (property[i]); ks->mScaleTimeout.setCallback ( boost::bind (&KDECompatScreen::scaleActivate, ks)); ks->mScaleTimeout.start (); } } XFree (propData); } } void KDECompatScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options) { screen->handleCompizEvent (pluginName, eventName, options); if (mScaleHandle && strcmp (pluginName, "scale") == 0 && strcmp (eventName, "activate") == 0) { mScaleActive = CompOption::getBoolOptionNamed (options, "active", false); if (!mScaleActive && mPresentWindow) XDeleteProperty (screen->dpy (), mPresentWindow->id (), mKdePresentGroupAtom); } } void KDECompatWindow::updateBlurProperty (bool enabled) { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; bool validProperty = false; KDECOMPAT_SCREEN (screen); if (!ks->mBlurLoaded || !ks->optionGetWindowBlur ()) return; if (!enabled) { if (mBlurPropertySet) XDeleteProperty (screen->dpy (), window->id (), KDECompatScreen::get (screen)->mCompizWindowBlurAtom); return; } if (!mBlurPropertySet) { result = XGetWindowProperty (screen->dpy (), window->id (), ks->mCompizWindowBlurAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { /* somebody else besides us already set a property, * don't touch that property */ XFree (propData); return; } } result = XGetWindowProperty (screen->dpy (), window->id (), ks->mKdeBlurBehindRegionAtom, 0, 32768, false, AnyPropertyType, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (format == 32 && actual == XA_CARDINAL && n > 0 && (n % 4 == 0)) { long *data = (long *) propData; unsigned int nBox = n / 4; long compizProp[nBox * 6 + 2]; unsigned int i = 2; compizProp[0] = 2; /* threshold */ compizProp[1] = 0; /* filter */ while (nBox--) { int x, y, w, h; x = *data++; y = *data++; w = *data++; h = *data++; compizProp[i++] = GRAVITY_NORTH | GRAVITY_WEST; /* P1 gravity */ compizProp[i++] = x; /* P1 X */ compizProp[i++] = y; /* P1 Y */ compizProp[i++] = GRAVITY_NORTH | GRAVITY_WEST; /* P2 gravity */ compizProp[i++] = x + w; /* P2 X */ compizProp[i++] = y + h; /* P2 Y */ } XChangeProperty (screen->dpy (), window->id (), ks->mCompizWindowBlurAtom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) compizProp, i); mBlurPropertySet = true; validProperty = TRUE; } XFree (propData); } if (mBlurPropertySet && !validProperty) { mBlurPropertySet = FALSE; XDeleteProperty (screen->dpy (), window->id (), ks->mKdeBlurBehindRegionAtom); } } void KDECompatWindow::windowNotify (CompWindowNotify n) { if (!KDECompatScreen::get (screen)->optionGetSlidingPopups ()) return window->windowNotify (n); switch (n) { case CompWindowNotifyClose: handleClose (false); break; case CompWindowNotifyBeforeDestroy: handleClose (true); break; case CompWindowNotifyBeforeMap: startSlideAnimation (true); break; default: break; } } void KDECompatScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == mKdePreviewAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->updatePreviews (); } else if (event->xproperty.atom == mKdeSlideAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->updateSlidePosition (); } else if (event->xproperty.atom == mKdePresentGroupAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->presentGroup (); } else if (event->xproperty.atom == mKdeBlurBehindRegionAtom) { w = screen->findWindow (event->xproperty.window); if (w) KDECompatWindow::get (w)->updateBlurProperty (true); } break; } } bool KDECompatWindow::damageRect (bool initial, const CompRect &rect) { bool status; KDECOMPAT_SCREEN (screen); if (mIsPreview && ks->optionGetPlasmaThumbnails ()) { foreach (CompWindow *cw, screen->windows ()) { KDECompatWindow *kdw = KDECompatWindow::get (cw); foreach (const Thumb& thumb, kdw->mPreviews) { if (thumb.id != window->id ()) continue; CompRect rect (thumb.thumb.x () + cw->x (), thumb.thumb.y () + cw->y (), thumb.thumb.width (), thumb.thumb.height ()); ks->cScreen->damageRegion (rect); } } } status = cWindow->damageRect (initial, rect); return status; } void KDECompatScreen::advertiseSupport (Atom atom, bool enable) { if (enable) { unsigned char value = 0; XChangeProperty (screen->dpy (), screen->root (), atom, mKdePreviewAtom, 8, PropModeReplace, &value, 1); } else { XDeleteProperty (screen->dpy (), screen->root (), atom); } } void KDECompatScreen::optionChanged (CompOption *option, KdecompatOptions::Options num) { if (num == KdecompatOptions::PlasmaThumbnails) advertiseSupport (mKdePreviewAtom, option->value ().b ()); else if (num == KdecompatOptions::SlidingPopups) advertiseSupport (mKdeSlideAtom, option->value (). b ()); else if (num == KdecompatOptions::PresentWindows) advertiseSupport (mKdePresentGroupAtom, option->value ().b () && mScaleHandle); else if (num == KdecompatOptions::WindowBlur) { advertiseSupport (mKdeBlurBehindRegionAtom, option->value ().b () && mBlurLoaded); foreach (CompWindow *w, screen->windows ()) KDECompatWindow::get (w)->updateBlurProperty (option->value ().b ()); } } KDECompatScreen::KDECompatScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mKdePreviewAtom (XInternAtom (screen->dpy (), "_KDE_WINDOW_PREVIEW", 0)), mKdeSlideAtom (XInternAtom (screen->dpy (), "_KDE_SLIDE", 0)), mKdePresentGroupAtom (XInternAtom (screen->dpy (), "_KDE_PRESENT_WINDOWS_GROUP", 0)), mKdeBlurBehindRegionAtom (XInternAtom (screen->dpy (), "_KDE_NET_WM_BLUR_BEHIND_REGION", 0)), mCompizWindowBlurAtom (XInternAtom (screen->dpy (), "_COMPIZ_WM_WINDOW_BLUR", 0)), mHasSlidingPopups (false), mDestroyCnt (0), mUnmapCnt (0), mScaleHandle (CompPlugin::find ("scale")), mScaleActive (false), mBlurLoaded ((CompPlugin::find ("blur") != NULL)), mPresentWindow (NULL) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); mScaleTimeout.setTimes (100, 200); advertiseSupport (mKdePreviewAtom, optionGetPlasmaThumbnails ()); advertiseSupport (mKdeSlideAtom, optionGetSlidingPopups ()); advertiseSupport (mKdePresentGroupAtom, optionGetPresentWindows () && mScaleHandle); optionSetPlasmaThumbnailsNotify ( boost::bind (&KDECompatScreen::optionChanged, this, _1, _2)); } KDECompatScreen::~KDECompatScreen () { advertiseSupport (mKdePreviewAtom, false); advertiseSupport (mKdeSlideAtom, false); advertiseSupport (mKdePresentGroupAtom, false); } KDECompatWindow::KDECompatWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mIsPreview (false), mSlideData (NULL), mDestroyCnt (0), mUnmapCnt (0), mBlurPropertySet (false) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); updateBlurProperty (KDECompatScreen::get (screen)->optionGetWindowBlur ()); } KDECompatWindow::~KDECompatWindow () { stopCloseAnimation (); if (mSlideData) delete mSlideData; if (KDECompatScreen::get (screen)->mPresentWindow == window) KDECompatScreen::get (screen)->mPresentWindow = NULL; updateBlurProperty (false); } bool KDECompatPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/kdecompat/src/kdecompat.h0000644000004100000410000001004513246301623017602 0ustar www-datawww-data/* * * Compiz KDE compatibility plugin * * kdecompat.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include "kdecompat_options.h" #include class KDECompatScreen : public PluginClassHandler , public CompositeScreenInterface, public GLScreenInterface, public ScreenInterface, public KdecompatOptions { public: KDECompatScreen (CompScreen *); ~KDECompatScreen (); public: void handleEvent (XEvent *); void advertiseSupport (Atom atom, bool enable); void optionChanged (CompOption *option, KdecompatOptions::Options num); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); void handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options); CompAction * getScaleAction (const char *name); bool scaleActivate (); void freeScaleTimeout (); inline void checkPaintFunctions (); CompositeScreen *cScreen; GLScreen *gScreen; Atom mKdePreviewAtom; Atom mKdeSlideAtom; Atom mKdePresentGroupAtom; Atom mKdeBlurBehindRegionAtom; Atom mCompizWindowBlurAtom; bool mHasSlidingPopups; int mDestroyCnt; int mUnmapCnt; CompPlugin *mScaleHandle; bool mScaleActive; CompTimer mScaleTimeout; bool mBlurLoaded; CompWindow *mPresentWindow; std::vector mPresentWindowList; }; #define KDECOMPAT_SCREEN(s) \ KDECompatScreen *ks = KDECompatScreen::get (s) class KDECompatWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: KDECompatWindow (CompWindow *); ~KDECompatWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: typedef struct { Window id; CompRect thumb; } Thumb; typedef enum { West = 0, North = 1, East = 2, South = 3 } SlidePosition; typedef struct { SlidePosition position; int start; bool appearing; int remaining; int duration; } SlideData; std::list mPreviews; bool mIsPreview; SlideData *mSlideData; int mDestroyCnt; int mUnmapCnt; bool mBlurPropertySet; public: bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool damageRect (bool, const CompRect &); void updatePreviews (); void stopCloseAnimation (); void sendSlideEvent (bool start); void startSlideAnimation (bool appearing); void endSlideAnimation (); void updateSlidePosition (); void updateBlurProperty (bool enabled); void handleClose (bool); void presentGroup (); void windowNotify (CompWindowNotify n); }; #define KDECOMPAT_WINDOW(w) \ KDECompatWindow *kw = KDECompatWindow::get(w) class KDECompatPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/kdecompat/kdecompat.xml.in0000644000004100000410000000347313246301623020000 0ustar www-datawww-data General <_short>KDE Compatibility <_long>KDE compatibility plugin animation composite opengl decor opengl <_short>Popup Slide Effect ./plugins/cube/0000755000004100000410000000000013246301624013643 5ustar www-datawww-data./plugins/cube/CMakeLists.txt0000644000004100000410000000014713246301623016404 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(cube PLUGINDEPS composite opengl)./plugins/cube/cube.xml.in0000644000004100000410000001162313246301623015712 0ustar www-datawww-data <_short>Desktop Cube <_long>Place windows and viewports on a cube Desktop largedesktop opengl switcher scale decor <_short>Behaviour <_short>Appearance <_short>Cube Cap Colors <_short>Skydome <_short>Transparent Cube ./plugins/cube/include/0000755000004100000410000000000013246301623015265 5ustar www-datawww-data./plugins/cube/include/cube/0000755000004100000410000000000013246301624016204 5ustar www-datawww-data./plugins/cube/include/cube/cube.h0000644000004100000410000001361413246301623017277 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_CUBE_H #define _COMPIZ_CUBE_H #include #include #include #include #include #include #include #define COMPIZ_CUBE_ABI 2 typedef enum { BTF = 0, FTB } PaintOrder; class CubeScreen; class PrivateCubeScreen; class CubeScreenInterface : public WrapableInterface { public: /** * Hookable function to get the current state of rotation * * @param x X rotation * @param v Y Rotation * @param progress */ virtual void cubeGetRotation (float &x, float &v, float &progress); virtual void cubeClearTargetOutput (float xRotate, float vRotate); virtual void cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); virtual void cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); virtual void cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); virtual bool cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points); virtual void cubePaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); virtual bool cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order); virtual bool cubeShouldPaintAllViewports (); }; extern template class PluginClassHandler; class CubeScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: typedef enum { RotationNone = 0, RotationChange, RotationManual } RotationState; typedef enum { Automatic = 0, MultipleCubes, OneBigCube } MultioutputMode; CubeScreen (CompScreen *s); ~CubeScreen (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); WRAPABLE_HND (0, CubeScreenInterface, void, cubeGetRotation, float &, float&, float&); WRAPABLE_HND (1, CubeScreenInterface, void, cubeClearTargetOutput, float, float); WRAPABLE_HND (2, CubeScreenInterface, void, cubePaintTop, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int, const GLVector &); WRAPABLE_HND (3, CubeScreenInterface, void, cubePaintBottom, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int, const GLVector &); WRAPABLE_HND (4, CubeScreenInterface, void, cubePaintInside, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, int, const GLVector &); WRAPABLE_HND (5, CubeScreenInterface, bool, cubeCheckOrientation, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, std::vector &); WRAPABLE_HND (6, CubeScreenInterface, void, cubePaintViewport, const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); WRAPABLE_HND (7, CubeScreenInterface, bool, cubeShouldPaintViewport, const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, PaintOrder); WRAPABLE_HND (8, CubeScreenInterface, bool, cubeShouldPaintAllViewports); int invert () const; unsigned short* topColor () const; unsigned short* bottomColor () const; bool unfolded () const; RotationState rotationState () const; void rotationState (RotationState state); int xRotations () const; int nOutput () const; float outputXScale () const; float outputYScale () const; float outputXOffset () const; float outputYOffset () const; float distance () const; float desktopOpacity () const; MultioutputMode multioutputMode () const; int sourceOutput () const; PaintOrder paintOrder () const; void repaintCaps (); friend class PrivateCubeWindow; friend class PrivateCubeScreen; private: PrivateCubeScreen *priv; }; #define CUBE_SCREEN(s) \ CubeScreen *cs = CubeScreen::get (s) #endif ./plugins/cube/src/0000755000004100000410000000000013246301624014432 5ustar www-datawww-data./plugins/cube/src/privates.h0000644000004100000410000001331513246301623016442 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _CUBE_PRIVATES_H #define _CUBE_PRIVATES_H #include #include "cube_options.h" class PrivateCubeScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public CubeOptions { public: PrivateCubeScreen (CompScreen *s); ~PrivateCubeScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *cubeScreen; void preparePaint (int); void donePaint (); void paint (CompOutput::ptrList &outputs, unsigned int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glEnableOutputClipping (const GLMatrix &, const CompRegion &, CompOutput *); void glDisableOutputClipping(); void glApplyTransform (const GLScreenPaintAttrib &, CompOutput *, GLMatrix *); bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); void outputChangeNotify (); const CompWindowList & getWindowPaintList (); bool updateGeometry (int sides, int invert); void updateOutputs (); void updateSkydomeTexture (); void updateSkydomeList (GLfloat fRadius); bool setOption (const CompString &name, CompOption::Value &value); bool adjustVelocity (); void moveViewportAndPaint (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, unsigned int mask, PaintOrder paintOrder, int dx); void paintAllViewports (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *outputPtr, unsigned int mask, int xMove, float size, int hsize, PaintOrder paintOrder); static bool unfold (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool fold (CompAction *action, CompAction::State state, CompOption::Vector &options); public: int mInvert; int mXRotations; PaintOrder mPaintOrder; CubeScreen::RotationState mRotationState; bool mPaintAllViewports; GLfloat mDistance; GLfloat mTc[12]; CompScreen::GrabHandle mGrabIndex; int mSrcOutput; bool mUnfolded; GLfloat mUnfold; GLfloat mUnfoldVelocity; GLfloat *mVertices; int mNVertices; GLuint mSkyListId; int mPw; int mPh; CompSize mSkySize; GLTexture::List mTexture; GLTexture::List mSky; int mImgCurFile; int mNOutput; int mOutput[64]; int mOutputMask[64]; bool mCleared[64]; bool mCapsPainted[64]; bool mFullscreenOutput; float mOutputXScale; float mOutputYScale; float mOutputXOffset; float mOutputYOffset; float mDesktopOpacity; float mToOpacity; int mLastOpacityIndex; bool mRecalcOutput; CompWindowList mReversedWindowList; }; class PrivateCubeWindow; extern template class PluginClassHandler; class PrivateCubeWindow : public PluginClassHandler, public GLWindowInterface { public: PrivateCubeWindow (CompWindow *w); ~PrivateCubeWindow (); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; CubeScreen *cubeScreen; }; #endif ./plugins/cube/src/cube.cpp0000644000004100000410000013202713246301623016060 0ustar www-datawww-data /* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Mirco Müller (Skydome support) */ #include #include #include #include #include "privates.h" class CubePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (cube, CubePluginVTable) void CubeScreenInterface::cubeGetRotation (float &x, float &v, float &progress) WRAPABLE_DEF (cubeGetRotation, x, v, progress); void CubeScreenInterface::cubeClearTargetOutput (float xRotate, float vRotate) WRAPABLE_DEF (cubeClearTargetOutput, xRotate, vRotate); void CubeScreenInterface::cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) WRAPABLE_DEF (cubePaintTop, sAttrib, transform, output, size, normal) void CubeScreenInterface::cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) WRAPABLE_DEF (cubePaintBottom, sAttrib, transform, output, size, normal) void CubeScreenInterface::cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) WRAPABLE_DEF (cubePaintInside, sAttrib, transform, output, size, normal) bool CubeScreenInterface::cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points) WRAPABLE_DEF (cubeCheckOrientation, sAttrib, transform, output, points) void CubeScreenInterface::cubePaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) WRAPABLE_DEF (cubePaintViewport, sAttrib, transform, region, output, mask) bool CubeScreenInterface::cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order) WRAPABLE_DEF (cubeShouldPaintViewport, sAttrib, transform, output, order) bool CubeScreenInterface::cubeShouldPaintAllViewports () WRAPABLE_DEF (cubeShouldPaintAllViewports); int CubeScreen::invert () const { return priv->mInvert; } unsigned short* CubeScreen::topColor () const { return priv->optionGetTopColor (); } unsigned short* CubeScreen::bottomColor () const { return priv->optionGetBottomColor (); } bool CubeScreen::unfolded () const { return priv->mUnfolded; } CubeScreen::RotationState CubeScreen::rotationState () const { return priv->mRotationState; } void CubeScreen::rotationState (CubeScreen::RotationState state) { priv->mRotationState = state; } int CubeScreen::xRotations () const { return priv->mXRotations; } int CubeScreen::nOutput () const { return priv->mNOutput; } float CubeScreen::outputXScale () const { return priv->mOutputXScale; } float CubeScreen::outputYScale () const { return priv->mOutputYScale; } float CubeScreen::outputXOffset () const { return priv->mOutputXOffset; } float CubeScreen::outputYOffset () const { return priv->mOutputYOffset; } float CubeScreen::distance () const { return priv->mDistance; } float CubeScreen::desktopOpacity () const { return priv->mDesktopOpacity; } CubeScreen::MultioutputMode CubeScreen::multioutputMode () const { switch (priv->optionGetMultioutputMode ()) { case CubeOptions::MultioutputModeOneBigCube: return OneBigCube; break; case 0: return MultipleCubes; break; default: break; } return Automatic; } int CubeScreen::sourceOutput () const { return priv->mSrcOutput; } PaintOrder CubeScreen::paintOrder () const { return priv->mPaintOrder; } bool CubeScreen::cubeShouldPaintAllViewports () { WRAPABLE_HND_FUNCTN_RETURN (bool, cubeShouldPaintAllViewports); return priv->mPaintAllViewports; } void CubeScreen::repaintCaps () { memset (priv->mCapsPainted, 0, sizeof (Bool) * screen->outputDevs ().size ()); } bool PrivateCubeScreen::updateGeometry (int sides, int invert) { /* This will never happen, but we want to calm down the static code analyzer * Coverity * See: https://bugs.launchpad.net/compiz/+bug/1101541 for details */ if (!sides) return false; sides *= mNOutput; GLfloat mps = M_PI / sides; GLfloat tmps = 2 * mps; GLfloat distance = 0.5f / tanf (mps); GLfloat radius = 0.5f / sinf (mps); GLfloat normInvert = 0.5f * invert; int i, n = (sides + 2) * 2; GLfloat *v; if (mNVertices != n) { v = (GLfloat *) realloc (mVertices, sizeof (GLfloat) * n * 3); if (!v) return false; mNVertices = n; mVertices = v; } else v = mVertices; *v++ = 0.0f; *v++ = normInvert; *v++ = 0.0f; for (i = 0; i <= sides; ++i) { *v++ = radius * sinf (i * tmps + mps); *v++ = normInvert; *v++ = radius * cosf (i * tmps + mps); } *v++ = 0.0f; *v++ = -0.5 * invert; *v++ = 0.0f; for (i = sides; i >= 0; --i) { *v++ = radius * sinf (i * tmps + mps); *v++ = -normInvert; *v++ = radius * cosf (i * tmps + mps); } mInvert = invert; mDistance = distance; return true; } void PrivateCubeScreen::updateOutputs () { CompOutput *pBox0, *pBox1; unsigned int i, j; int k = 0; mFullscreenOutput = true; for (i = 0; i < screen->outputDevs ().size (); ++i) { mOutputMask[i] = -1; /* dimensions must match first output */ if (screen->outputDevs ()[i].width () != screen->outputDevs ()[0].width () || screen->outputDevs ()[i].height () != screen->outputDevs ()[0].height ()) continue; pBox0 = &screen->outputDevs ()[0]; pBox1 = &screen->outputDevs ()[i]; /* top and bottom line must match first output */ if (pBox0->y1 () != pBox1->y1 () || pBox0->y2 () != pBox1->y2 ()) continue; ++k; for (j = 0; j < screen->outputDevs ().size (); ++j) { pBox0 = &screen->outputDevs ()[j]; /* must not intersect other output region */ if (i != j && pBox0->x2 () > pBox1->x1 () && pBox0->x1 () < pBox1->x2 ()) { --k; break; } } } if (optionGetMultioutputMode () == CubeOptions::MultioutputModeOneBigCube) { mFullscreenOutput = false; mNOutput = 1; return; } if (optionGetMultioutputMode () == 0) { mFullscreenOutput = true; mNOutput = 1; return; } if ((unsigned int) k != screen->outputDevs ().size ()) { mFullscreenOutput = false; mNOutput = 1; return; } /* add output indices from left to right */ int x; j = 0; for (;;) { x = MAXSHORT; k = -1; for (i = 0; i < screen->outputDevs ().size (); ++i) { if (mOutputMask[i] != -1) continue; if (screen->outputDevs ()[i].x1 () < x) { x = screen->outputDevs ()[i].x1 (); k = i; } } if (k < 0) break; mOutputMask[k] = j; mOutput[j] = k; ++j; } mNOutput = j; if (mNOutput == 1 && (screen->outputDevs ()[0].width () != screen->width () || screen->outputDevs ()[0].height () != screen->height ())) mFullscreenOutput = true; } void PrivateCubeScreen::updateSkydomeTexture () { mSky.clear (); if (!optionGetSkydome ()) return; CompString imgName = optionGetSkydomeImage (); CompString pname = "cube"; if (optionGetSkydomeImage ().empty () || (mSky = GLTexture::readImageToTexture (imgName, pname, mSkySize)).empty ()) { GLfloat MaxUShortFloat = static_cast (std::numeric_limits ::max ()); GLfloat aaafTextureData[128][128][3]; GLfloat fRStart = optionGetSkydomeGradientStartColorRed () / MaxUShortFloat; GLfloat fGStart = optionGetSkydomeGradientStartColorGreen () / MaxUShortFloat; GLfloat fBStart = optionGetSkydomeGradientStartColorBlue () / MaxUShortFloat; GLfloat fREnd = optionGetSkydomeGradientEndColorRed () / MaxUShortFloat; GLfloat fGEnd = optionGetSkydomeGradientEndColorGreen () / MaxUShortFloat; GLfloat fBEnd = optionGetSkydomeGradientEndColorBlue () / MaxUShortFloat; GLfloat fRStep = (fREnd - fRStart) / 128.0f; GLfloat fGStep = (fGEnd - fGStart) / 128.0f; GLfloat fBStep = (fBStart - fBEnd) / 128.0f; GLfloat fR = fRStart; GLfloat fG = fGStart; GLfloat fB = fBStart; for (int iX = 127; iX >= 0; --iX) { fR += fRStep; fG += fGStep; fB -= fBStep; for (int iY = 0; iY < 128; ++iY) { aaafTextureData[iX][iY][0] = fR; aaafTextureData[iX][iY][1] = fG; aaafTextureData[iX][iY][2] = fB; } } mSkySize = CompSize (128, 128); mSky = GLTexture::imageDataToTexture ((char *) aaafTextureData, mSkySize, GL_RGB, GL_FLOAT); mSky[0]->setFilter (GL_LINEAR); mSky[0]->setWrap (GL_CLAMP_TO_EDGE); } } #ifndef USE_GLES static bool fillCircleTable (GLfloat **ppSint, GLfloat **ppCost, const int n) { const GLfloat angle = 2 * M_PI / (GLfloat) ((n == 0) ? 1 : n); const int size = abs (n); *ppSint = (GLfloat *) calloc (sizeof (GLfloat), size + 1); *ppCost = (GLfloat *) calloc (sizeof (GLfloat), size + 1); if (!(*ppSint) || !(*ppCost)) { free (*ppSint); free (*ppCost); return false; } (*ppSint)[0] = 0.0; (*ppCost)[0] = 1.0; for (int i = 1; i < size; ++i) { (*ppSint)[i] = sin (angle * i); (*ppCost)[i] = cos (angle * i); } (*ppSint)[size] = (*ppSint)[0]; (*ppCost)[size] = (*ppCost)[0]; return true; } #endif void PrivateCubeScreen::updateSkydomeList (GLfloat fRadius) { #ifndef USE_GLES GLint iSlices = 128; GLint iStacks = 64; GLfloat afTexCoordX[4]; GLfloat afTexCoordY[4]; GLfloat *sint1; GLfloat *cost1; GLfloat *sint2; GLfloat *cost2; GLfloat r; GLfloat x; GLfloat y; GLfloat z; int iStacksStart; int iStacksEnd; int iSlicesStart; int iSlicesEnd; if (optionGetSkydomeAnimated ()) { iStacksStart = 11; /* min. 0 */ iStacksEnd = 53; /* max. 64 */ iSlicesStart = 0; /* min. 0 */ iSlicesEnd = 128; /* max. 128 */ } else { iStacksStart = 21; /* min. 0 */ iStacksEnd = 43; /* max. 64 */ iSlicesStart = 21; /* min. 0 */ iSlicesEnd = 44; /* max. 128 */ } GLfloat fStepX = 1.0 / (GLfloat) (iSlicesEnd - iSlicesStart); GLfloat fStepY = 1.0 / (GLfloat) (iStacksEnd - iStacksStart); GLfloat oneMinusFStepX = 1.0f - fStepX; GLfloat oneMinusFStepY = 1.0f - fStepY; if (!mSky.size () || !fillCircleTable (&sint1, &cost1, -iSlices)) return; if (!fillCircleTable (&sint2, &cost2, iStacks * 2)) { free (sint1); free (cost1); return; } afTexCoordX[0] = 1.0f; afTexCoordY[0] = oneMinusFStepY; afTexCoordX[1] = oneMinusFStepX; afTexCoordY[1] = oneMinusFStepY; afTexCoordX[2] = oneMinusFStepX; afTexCoordY[2] = 1.0f; afTexCoordX[3] = 1.0f; afTexCoordY[3] = 1.0f; if (!mSkyListId) mSkyListId = glGenLists (1); glNewList (mSkyListId, GL_COMPILE); mSky[0]->enable (GLTexture::Good); GLfloat mSkyWidth = mSkySize.width (); GLfloat mSkyHeight = mSkySize.height (); glBegin (GL_QUADS); for (int i = iStacksStart; i < iStacksEnd; ++i) { afTexCoordX[0] = 1.0f; afTexCoordX[1] = oneMinusFStepX; afTexCoordX[2] = oneMinusFStepX; afTexCoordX[3] = 1.0f; for (int j = iSlicesStart; j < iSlicesEnd; ++j) { /* bottom-right */ z = cost2[i]; r = sint2[i]; x = cost1[j]; y = sint1[j]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[3] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[3] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); /* top-right */ z = cost2[i + 1]; r = sint2[i + 1]; x = cost1[j]; y = sint1[j]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[0] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[0] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); /* top-left */ z = cost2[i + 1]; r = sint2[i + 1]; x = cost1[j + 1]; y = sint1[j + 1]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[1] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[1] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); /* bottom-left */ z = cost2[i]; r = sint2[i]; x = cost1[j + 1]; y = sint1[j + 1]; glTexCoord2f ( COMP_TEX_COORD_X (mSky[0]->matrix (), afTexCoordX[2] * mSkyWidth), COMP_TEX_COORD_Y (mSky[0]->matrix (), afTexCoordY[2] * mSkyHeight)); glVertex3f (x * r * fRadius, y * r * fRadius, z * fRadius); afTexCoordX[0] -= fStepX; afTexCoordX[1] -= fStepX; afTexCoordX[2] -= fStepX; afTexCoordX[3] -= fStepX; } afTexCoordY[0] -= fStepY; afTexCoordY[1] -= fStepY; afTexCoordY[2] -= fStepY; afTexCoordY[3] -= fStepY; } glEnd (); mSky[0]->disable (); glEndList (); free (sint1); free (cost1); free (sint2); free (cost2); #endif } bool PrivateCubeScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CubeOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CubeOptions::In: rv = updateGeometry (screen->vpSize ().width (), value.b () ? -1 : 1); break; case CubeOptions::Skydome: case CubeOptions::SkydomeImage: case CubeOptions::SkydomeAnimated: case CubeOptions::SkydomeGradientStartColor: case CubeOptions::SkydomeGradientEndColor: updateSkydomeTexture (); updateSkydomeList (1.0f); cScreen->damageScreen (); break; case CubeOptions::MultioutputMode: updateOutputs (); updateGeometry (screen->vpSize ().width (), mInvert); cScreen->damageScreen (); break; default: break; } return rv; } bool PrivateCubeScreen::adjustVelocity () { float unfold; if (mUnfolded) unfold = 1.0f - mUnfold; else unfold = 0.0f - mUnfold; float adjust = unfold * 0.02f * optionGetAcceleration (); float amount = fabs (unfold); if (amount < 1.0f) amount = 1.0f; else if (amount > 3.0f) amount = 3.0f; mUnfoldVelocity = (amount * mUnfoldVelocity + adjust) / (amount + 2.0f); return (fabs (unfold) < 0.002f && fabs (mUnfoldVelocity) < 0.01f); } void PrivateCubeScreen::preparePaint (int msSinceLastPaint) { int opt; float x, progress; unsigned short *topColor, *bottomColor; if (mGrabIndex) { float amount = msSinceLastPaint * 0.2f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mUnfold += mUnfoldVelocity * chunk; if (mUnfold > 1.0f) mUnfold = 1.0f; if (adjustVelocity ()) { if (mUnfold < 0.5f) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, NULL); mGrabIndex = 0; } mUnfold = 0.0f; } break; } } } memset (mCleared, 0, sizeof (Bool) * screen->outputDevs ().size ()); memset (mCapsPainted, 0, sizeof (Bool) * screen->outputDevs ().size ()); /* Transparency handling */ if (mRotationState == CubeScreen::RotationManual || (mRotationState == CubeScreen::RotationChange && !optionGetTransparentManualOnly ())) opt = mLastOpacityIndex = CubeOptions::ActiveOpacity; else if (mRotationState == CubeScreen::RotationChange) opt = mLastOpacityIndex = CubeOptions::InactiveOpacity; else opt = CubeOptions::InactiveOpacity; mToOpacity = (mOptions[opt].value ().f () / 100.0f) * OPAQUE; cubeScreen->cubeGetRotation (x, x, progress); if (mDesktopOpacity != mToOpacity || (progress > 0.0 && progress < 1.0)) { float inactiveOpacity = optionGetInactiveOpacity (); mDesktopOpacity = (inactiveOpacity - ((inactiveOpacity - mOptions[mLastOpacityIndex].value ().f ()) * progress)) / 100.0f * OPAQUE; } topColor = optionGetTopColor (); bottomColor = optionGetBottomColor (); mPaintAllViewports = (mDesktopOpacity != OPAQUE || topColor[3] != OPAQUE || bottomColor[3] != OPAQUE); cScreen->preparePaint (msSinceLastPaint); } void PrivateCubeScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { float x, progress; cubeScreen->cubeGetRotation (x, x, progress); if (optionGetMultioutputMode () == MultioutputModeOneBigCube && screen->outputDevs ().size () && (progress > 0.0f || mDesktopOpacity != OPAQUE)) { outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } cScreen->paint (outputs, mask); } bool PrivateCubeScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mGrabIndex || mDesktopOpacity != OPAQUE) { mask &= ~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK; } mSrcOutput = ((unsigned int) output->id () != (unsigned int) ~0) ? output->id () : 0; /* Always use BTF painting on non-transformed screen */ mPaintOrder = BTF; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void PrivateCubeScreen::donePaint () { if (mGrabIndex || mDesktopOpacity != mToOpacity) cScreen->damageScreen (); cScreen->donePaint (); } bool CubeScreen::cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points) { WRAPABLE_HND_FUNCTN_RETURN (bool, cubeCheckOrientation, sAttrib, transform, output, points) GLMatrix pm (priv->gScreen->projectionMatrix ()->getMatrix ()); GLMatrix sTransform = transform; bool rv = false; priv->gScreen->glApplyTransform (sAttrib, output, &sTransform); sTransform.translate (priv->mOutputXOffset, -priv->mOutputYOffset, 0.0f); sTransform.scale (priv->mOutputXScale, priv->mOutputYScale, 1.0f); GLMatrix mvp = pm * sTransform; GLVector pntA = mvp * points[0]; if (pntA[3] < 0.0f) rv = !rv; pntA.homogenize (); GLVector pntB = mvp * points[1]; if (pntB[3] < 0.0f) rv = !rv; pntB.homogenize (); GLVector pntC = mvp * points[2]; pntC.homogenize (); GLVector vecA = pntC - pntA; GLVector vecB = pntC - pntB; GLVector ortho = vecA ^ vecB; if (ortho[2] > 0.0f) rv = !rv; return rv; } bool CubeScreen::cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order) { WRAPABLE_HND_FUNCTN_RETURN (bool, cubeShouldPaintViewport, sAttrib, transform, output, order) float pointZ = priv->mInvert * priv->mDistance; std::vector vPoints; vPoints.push_back (GLVector (-0.5, 0.0, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.5, pointZ, 1.0)); vPoints.push_back (GLVector ( 0.0, 0.0, pointZ, 1.0)); bool ftb = cubeCheckOrientation (sAttrib, transform, output, vPoints); return (order == FTB && ftb) || (order == BTF && !ftb); } void PrivateCubeScreen::moveViewportAndPaint (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *outputPtr, unsigned int mask, PaintOrder paintOrder, int dx) { if (!cubeScreen->cubeShouldPaintViewport (sAttrib, transform, outputPtr, paintOrder)) return; int output = ((unsigned int) outputPtr->id () != (unsigned int) ~0) ? outputPtr->id () : 0; mPaintOrder = paintOrder; if (mNOutput > 1) { /* translate to cube output */ int cubeOutput = mOutputMask[output]; /* convert from window movement to viewport movement */ int dView = -dx; cubeOutput += dView; dView = cubeOutput / mNOutput; cubeOutput = cubeOutput % mNOutput; if (cubeOutput < 0) { cubeOutput += mNOutput; --dView; } /* translate back to compiz output */ output = mSrcOutput = mOutput[cubeOutput]; cScreen->setWindowPaintOffset (-dView * screen->width (), 0); CompRegion reg (screen->outputDevs () [output]); cubeScreen->cubePaintViewport (sAttrib, transform, reg, &screen->outputDevs () [output], mask); cScreen->setWindowPaintOffset (0, 0); } else { CompRegion region; cScreen->setWindowPaintOffset (dx * screen->width (), 0); if (optionGetMultioutputMode () == MultioutputModeMultipleCubes) region = CompRegion (*outputPtr); else region = screen->region (); cubeScreen->cubePaintViewport (sAttrib, transform, region, outputPtr, mask); cScreen->setWindowPaintOffset (0, 0); } } void PrivateCubeScreen::paintAllViewports (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *outputPtr, unsigned int mask, int xMove, float size, int hsize, PaintOrder paintOrder) { GLScreenPaintAttrib sa = sAttrib; int origXMoveAdd = 0; // dx for the viewport we start painting with (back-most). int iFirstSign; /* 1 if we do xMove += i first and -1 if we do xMove -= i first. */ float halfHsize = hsize / 2.0; if (mInvert == 1) { /* xMove ==> dx for the viewport which is the nearest to the viewer in z axis. xMove +/- hsize / 2 ==> dx for the viewport which is the farthest to the viewer in z axis. */ if ((sa.xRotate < 0.0f && hsize % 2 == 1) || (sa.xRotate > 0.0f && hsize % 2 == 0)) { origXMoveAdd = halfHsize; iFirstSign = 1; } else { origXMoveAdd = -halfHsize; iFirstSign = -1; } } else { /* xMove is already the dx for farthest viewport. */ if (sa.xRotate > 0.0f) iFirstSign = -1; else iFirstSign = 1; } int xMoveAdd; float tsSize = 360.0f / size; for (int i = 0; i <= halfHsize; ++i) { /* move to the correct viewport (back to front). */ xMoveAdd = origXMoveAdd; /* move to farthest viewport. */ xMoveAdd += iFirstSign * i; /* move i more viewports to the right / left. */ /* Needed especially for unfold. We paint the viewports around xMove viewport. Adding or subtracting hsize from xMove has no effect on what viewport we paint, but can make shorter paths. */ if (xMoveAdd < -halfHsize) xMoveAdd += hsize; else if (xMoveAdd > halfHsize) xMoveAdd -= hsize; /* Paint the viewport. */ xMove += xMoveAdd; sa.yRotate -= mInvert * xMoveAdd * tsSize; moveViewportAndPaint (sa, transform, outputPtr, mask, paintOrder, xMove); sa.yRotate += mInvert * xMoveAdd * tsSize; xMove -= xMoveAdd; /* do the same for an equally far viewport. */ if (i == 0 || i * 2 == hsize) continue; xMoveAdd = origXMoveAdd; /* move to farthest viewport. */ xMoveAdd -= iFirstSign * i; /* move i more viewports to the left / right (opposite side from the one chosen first) */ if (xMoveAdd < -halfHsize) xMoveAdd += hsize; else if (xMoveAdd > halfHsize) xMoveAdd -= hsize; xMove += xMoveAdd; sa.yRotate -= mInvert * xMoveAdd * tsSize; moveViewportAndPaint (sa, transform, outputPtr, mask, paintOrder, xMove); sa.yRotate += mInvert * xMoveAdd * tsSize; xMove -= xMoveAdd; } } void CubeScreen::cubeGetRotation (float &x, float &v, float &progress) { WRAPABLE_HND_FUNCTN (cubeGetRotation, x, v, progress) x = 0.0f; v = 0.0f; progress = 0.0f; } void CubeScreen::cubeClearTargetOutput (float xRotate, float vRotate) { WRAPABLE_HND_FUNCTN (cubeClearTargetOutput, xRotate, vRotate) if (!priv->mSky.empty ()) { priv->gScreen->setLighting (false); #ifndef USE_GLES glPushMatrix (); if (priv->optionGetSkydomeAnimated () && priv->mGrabIndex == 0) { glRotatef (vRotate / 5.0f + 90.0f, 1.0f, 0.0f, 0.0f); glRotatef (xRotate, 0.0f, 0.0f, -1.0f); } else glRotatef (90.0f, 1.0f, 0.0f, 0.0f); glCallList (priv->mSkyListId); glPopMatrix (); #endif } else priv->gScreen->clearTargetOutput (GL_COLOR_BUFFER_BIT); } void CubeScreen::cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { WRAPABLE_HND_FUNCTN (cubePaintTop, sAttrib, transform, output, size, normal) GLScreenPaintAttrib sa = sAttrib; GLMatrix sTransform = transform; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); priv->gScreen->setLighting (true); unsigned short *color = priv->optionGetTopColor (); int opacity = priv->mDesktopOpacity * color[3] / 0xffff; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); std::vector colorData; colorData.push_back (color[0] * opacity / 0xffff); colorData.push_back (color[1] * opacity / 0xffff); colorData.push_back (color[2] * opacity / 0xffff); colorData.push_back (opacity); sa.yRotate += (360.0f / size) * (priv->mXRotations + 1); priv->gScreen->glApplyTransform (sa, output, &sTransform); sTransform.translate (priv->mOutputXOffset, -priv->mOutputYOffset, 0.0f); sTransform.scale (priv->mOutputXScale, priv->mOutputYScale, 1.0f); if ((priv->mDesktopOpacity != OPAQUE) || (color[3] != OPAQUE)) { #ifndef USE_GLES priv->gScreen->setTexEnvMode (GL_MODULATE); #endif // just enable blending if it is disabled if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } bool withTexture = priv->mInvert == 1 && size == 4 && priv->mTexture.size (); if (withTexture) priv->mTexture[0]->enable (GLTexture::Good); streamingBuffer->begin (GL_TRIANGLE_FAN); streamingBuffer->addColors (1, &(colorData[0])); streamingBuffer->addVertices (priv->mNVertices >> 1, priv->mVertices); streamingBuffer->addNormals (1, const_cast (&normal[0])); if (withTexture) streamingBuffer->addTexCoords (0, 2, priv->mTc); streamingBuffer->end (); streamingBuffer->render (sTransform); if (withTexture) priv->mTexture[0]->disable (); priv->gScreen->setTexEnvMode (GL_REPLACE); // just disable blending if it was disabled before if (!glBlendEnabled) glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } void CubeScreen::cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { WRAPABLE_HND_FUNCTN (cubePaintBottom, sAttrib, transform, output, size, normal) GLScreenPaintAttrib sa = sAttrib; GLMatrix sTransform = transform; GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); priv->gScreen->setLighting (true); unsigned short *color = priv->optionGetBottomColor (); int opacity = priv->mDesktopOpacity * color[3] / 0xffff; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); std::vector colorData; colorData.push_back (color[0] * opacity / 0xffff); colorData.push_back (color[1] * opacity / 0xffff); colorData.push_back (color[2] * opacity / 0xffff); colorData.push_back (opacity); sa.yRotate += (360.0f / size) * (priv->mXRotations + 1); priv->gScreen->glApplyTransform (sa, output, &sTransform); sTransform.translate (priv->mOutputXOffset, -priv->mOutputYOffset, 0.0f); sTransform.scale (priv->mOutputXScale, priv->mOutputYScale, 1.0f); if ((priv->mDesktopOpacity != OPAQUE) || (color[3] != OPAQUE)) { #ifndef USE_GLES priv->gScreen->setTexEnvMode (GL_MODULATE); #endif // just enable blending if it is disabled if (!glBlendEnabled) glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } streamingBuffer->begin (GL_TRIANGLE_FAN); streamingBuffer->addColors (1, &(colorData[0])); streamingBuffer->addVertices (priv->mNVertices, priv->mVertices); streamingBuffer->addNormals (1, const_cast (&normal[0])); streamingBuffer->setVertexOffset (priv->mNVertices >> 1); streamingBuffer->setMaxVertices (priv->mNVertices >> 1); streamingBuffer->end (); streamingBuffer->render (sTransform); priv->gScreen->setTexEnvMode (GL_REPLACE); // just disable blending if it was disabled before if (!glBlendEnabled) glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } void CubeScreen::cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { WRAPABLE_HND_FUNCTN (cubePaintInside, sAttrib, transform, output, size, normal) } void PrivateCubeScreen::glEnableOutputClipping (const GLMatrix &transform, const CompRegion ®ion, CompOutput *output) { if (mRotationState != CubeScreen::RotationNone) { /* FIXME: No output clipping in OpenGL|ES yet */ #ifndef USE_GLES glPushMatrix (); glLoadMatrixf (transform.getMatrix ()); glTranslatef (mOutputXOffset, -mOutputYOffset, 0.0f); glScalef (mOutputXScale, mOutputYScale, 1.0f); GLdouble mDist2 = 0.5 / mDistance; if (mInvert == 1) { GLdouble clipPlane0[] = { 1.0, 0.0, mDist2, 0.0 }; GLdouble clipPlane1[] = { -1.0, 0.0, mDist2, 0.0 }; GLdouble clipPlane2[] = { 0.0, -1.0, mDist2, 0.0 }; GLdouble clipPlane3[] = { 0.0, 1.0, mDist2, 0.0 }; glClipPlane (GL_CLIP_PLANE0, clipPlane0); glClipPlane (GL_CLIP_PLANE1, clipPlane1); glClipPlane (GL_CLIP_PLANE2, clipPlane2); glClipPlane (GL_CLIP_PLANE3, clipPlane3); } else { GLdouble clipPlane0[] = { -1.0, 0.0, -mDist2, 0.0 }; GLdouble clipPlane1[] = { 1.0, 0.0, -mDist2, 0.0 }; GLdouble clipPlane2[] = { 0.0, 1.0, -mDist2, 0.0 }; GLdouble clipPlane3[] = { 0.0, -1.0, -mDist2, 0.0 }; glClipPlane (GL_CLIP_PLANE0, clipPlane0); glClipPlane (GL_CLIP_PLANE1, clipPlane1); glClipPlane (GL_CLIP_PLANE2, clipPlane2); glClipPlane (GL_CLIP_PLANE3, clipPlane3); } glEnable (GL_CLIP_PLANE0); glEnable (GL_CLIP_PLANE1); glEnable (GL_CLIP_PLANE2); glEnable (GL_CLIP_PLANE3); glPopMatrix (); #endif } else gScreen->glEnableOutputClipping (transform, region, output); } void PrivateCubeScreen::glDisableOutputClipping() { #ifndef USE_GLES glDisable(GL_CLIP_PLANE0); glDisable(GL_CLIP_PLANE1); glDisable(GL_CLIP_PLANE2); glDisable(GL_CLIP_PLANE3); #endif gScreen->glDisableOutputClipping(); } void CubeScreen::cubePaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { WRAPABLE_HND_FUNCTN (cubePaintViewport, sAttrib, transform, region, output, mask) priv->gScreen->glPaintTransformedOutput (sAttrib, transform, region, output, mask); } void PrivateCubeScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *outputPtr, unsigned int mask) { int output = ((unsigned int) outputPtr->id () != (unsigned int) ~0) ? outputPtr->id () : 0; mReversedWindowList = cScreen->getWindowPaintList (); mReversedWindowList.reverse (); if ((((unsigned int) outputPtr->id () != (unsigned int) ~0) && mRecalcOutput) || (((unsigned int) outputPtr->id () == (unsigned int) ~0) && !mRecalcOutput && mNOutput > 1)) { mRecalcOutput = ((unsigned int) outputPtr->id () == (unsigned int) ~0); mNOutput = 1; updateGeometry (screen->vpSize ().width (), mInvert); } int cullNorm; glGetIntegerv (GL_CULL_FACE_MODE, &cullNorm); int cullInv = (cullNorm == GL_BACK)? GL_FRONT : GL_BACK; bool wasCulled = glIsEnabled (GL_CULL_FACE); if (!mFullscreenOutput) { float outputWidth = outputPtr->width (); float outputHeight = outputPtr->height (); mOutputXScale = (float) screen->width () / outputWidth; mOutputYScale = (float) screen->height () / outputHeight; mOutputXOffset = (screen->width () / 2.0f - (outputPtr->x1 () + outputPtr->x2 ()) / 2.0f) / outputWidth; mOutputYOffset = (screen->height () / 2.0f - (outputPtr->y1 () + outputPtr->y2 ()) / 2.0f) / outputHeight; } else { mOutputXScale = 1.0f; mOutputYScale = 1.0f; mOutputXOffset = 0.0f; mOutputYOffset = 0.0f; } float xRotate, vRotate, progress; cubeScreen->cubeGetRotation (xRotate, vRotate, progress); GLScreenPaintAttrib sa = sAttrib; sa.xRotate += xRotate; sa.vRotate += vRotate; if (!mCleared[output]) { float rRotate = xRotate - ((screen->vp ().x () * 360.0f) / screen->vpSize ().width ()); cubeScreen->cubeClearTargetOutput (rRotate, vRotate); mCleared[output] = true; } mask &= ~PAINT_SCREEN_CLEAR_MASK; int hsize = screen->vpSize ().width () * mNOutput; float size = hsize; if (mGrabIndex) { sa.vRotate = 0.0f; size += mUnfold * 8.0f; size += powf (mUnfold, 6) * 64.0; size += powf (mUnfold, 16) * 8192.0; sa.zTranslate = -mInvert * (0.5f / tanf (M_PI / size)); /* Distance we move the camera back when unfolding the cube. TODO: Currently hardcoded to 1.5, make this configurable via CCSM. */ sa.zCamera -= mUnfold * 1.5f; } else { if (vRotate > 100.0f) sa.vRotate = 100.0f; else if (vRotate < -100.0f) sa.vRotate = -100.0f; else sa.vRotate = vRotate; sa.zTranslate = -mInvert * mDistance; } if (sa.xRotate > 0.0f) mXRotations = (int) (hsize * sa.xRotate + 180.0f) / 360.0f; else mXRotations = (int) (hsize * sa.xRotate - 180.0f) / 360.0f; sa.xRotate -= (360.0f * mXRotations) / hsize; sa.xRotate *= mInvert; sa.xRotate = sa.xRotate / size * hsize; GLenum oldFilter = gScreen->textureFilter (); if (mGrabIndex && optionGetMipmap ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); PaintOrder paintOrder; if (mInvert == 1) { /* Outside cube - start with FTB faces */ paintOrder = FTB; glCullFace (cullInv); } else /* Inside cube - start with BTF faces */ paintOrder = BTF; if (mInvert == -1 || cubeScreen->cubeShouldPaintAllViewports ()) { glEnable(GL_CULL_FACE); paintAllViewports (sa, transform, region, outputPtr, mask, mXRotations, size, hsize, paintOrder); if(!wasCulled) glDisable(GL_CULL_FACE); } glCullFace (cullNorm); if (wasCulled && cubeScreen->cubeShouldPaintAllViewports ()) glDisable (GL_CULL_FACE); bool paintCaps = !mGrabIndex && hsize > 2 && !mCapsPainted[output] && (mInvert != 1 || mDesktopOpacity != OPAQUE || cubeScreen->cubeShouldPaintAllViewports () || sa.vRotate != 0.0f || sa.yTranslate != 0.0f); if (paintCaps) { std::vector top; top.push_back (GLVector (0.5, 0.5, 0.0, 1.0)); top.push_back (GLVector (0.0, 0.5, -0.5, 1.0)); top.push_back (GLVector (0.0, 0.5, 0.0, 1.0)); std::vector bottom; bottom.push_back (GLVector (0.5, -0.5, 0.0, 1.0)); bottom.push_back (GLVector (0.0, -0.5, -0.5, 1.0)); bottom.push_back (GLVector (0.0, -0.5, 0.0, 1.0)); bool topDir = cubeScreen->cubeCheckOrientation (sa, transform, outputPtr, top); bool bottomDir = cubeScreen->cubeCheckOrientation (sa, transform, outputPtr, bottom); mCapsPainted[output] = true; bool allCaps = cubeScreen->cubeShouldPaintAllViewports () || mInvert != 1; if (topDir && bottomDir) { if (allCaps) { cubeScreen->cubePaintBottom (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintInside (sa, transform, outputPtr, hsize, GLVector (0.0f, 0.0f, -1.0f, 1.0f)); } cubeScreen->cubePaintTop (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); } else if (!topDir && !bottomDir) { if (allCaps) { cubeScreen->cubePaintTop (sa, transform, outputPtr, hsize, GLVector (0.0f, 1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintInside (sa, transform, outputPtr, hsize, GLVector (0.0f, 0.0f, -1.0f, 1.0f)); } cubeScreen->cubePaintBottom (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); } else if (allCaps) { cubeScreen->cubePaintTop (sa, transform, outputPtr, hsize, GLVector (0.0f, 1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintBottom (sa, transform, outputPtr, hsize, GLVector (0.0f, -1.0f, 0.0f, 1.0f)); cubeScreen->cubePaintInside (sa, transform, outputPtr, hsize, GLVector (0.0f, 0.0f, -1.0f, 1.0f)); } } if (wasCulled) glEnable (GL_CULL_FACE); if (mInvert == 1) /* Outside cube - continue with BTF faces */ paintOrder = BTF; else { /* Inside cube - continue with FTB faces */ paintOrder = FTB; glCullFace (cullInv); } if (mInvert == 1 || cubeScreen->cubeShouldPaintAllViewports ()) { glEnable(GL_CULL_FACE); paintAllViewports (sa, transform, region, outputPtr, mask, mXRotations, size, hsize, paintOrder); if(!wasCulled) glDisable(GL_CULL_FACE); } glCullFace (cullNorm); gScreen->setTextureFilter (oldFilter); } bool PrivateCubeWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if ((window->type () & CompWindowTypeDesktopMask) && (attrib.opacity != cubeScreen->priv->mDesktopOpacity)) { GLWindowPaintAttrib wAttrib = attrib; wAttrib.opacity = cubeScreen->priv->mDesktopOpacity; return gWindow->glPaint (wAttrib, transform, region, mask); } else return gWindow->glPaint (attrib, transform, region, mask); } const CompWindowList & PrivateCubeScreen::getWindowPaintList () { if (mPaintOrder == FTB) return mReversedWindowList; else return cScreen->getWindowPaintList (); } void PrivateCubeScreen::glApplyTransform (const GLScreenPaintAttrib &sAttrib, CompOutput *output, GLMatrix *transform) { transform->translate (mOutputXOffset, -mOutputYOffset, 0.0f); transform->scale (mOutputXScale, mOutputYScale, 1.0f); gScreen->glApplyTransform (sAttrib, output, transform); transform->scale (1.0f / mOutputXScale, 1.0 / mOutputYScale, 1.0f); transform->translate (-mOutputXOffset, mOutputYOffset, 0.0f); } bool PrivateCubeScreen::unfold (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (::screen->root () == xid) { CUBE_SCREEN (screen); if (screen->vpSize ().width () * cs->priv->mNOutput < 4 || screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) return false; if (!cs->priv->mGrabIndex) cs->priv->mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "cube"); if (cs->priv->mGrabIndex) { cs->priv->mUnfolded = true; cs->priv->cScreen->damageScreen (); } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); } return false; } bool PrivateCubeScreen::fold (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if (!xid || ::screen->root () == xid) { CUBE_SCREEN (screen); if (cs->priv->mGrabIndex) { cs->priv->mUnfolded = false; cs->priv->cScreen->damageScreen (); } } action->setState (action->state () & ~(CompAction::StateTermButton | CompAction::StateTermKey)); return false; } void PrivateCubeScreen::outputChangeNotify () { updateOutputs (); updateGeometry (screen->vpSize ().width (), mInvert); screen->outputChangeNotify (); } bool PrivateCubeScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v) { bool status = screen->setOptionForPlugin (plugin, name, v); if (status && strcmp (plugin, "core") == 0 && strcmp (name, "hsize") == 0) updateGeometry (screen->vpSize ().width (), mInvert); return status; } PrivateCubeScreen::PrivateCubeScreen (CompScreen *s) : cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), cubeScreen (CubeScreen::get (s)), mInvert (1), mXRotations (0), mPaintOrder (BTF), mRotationState (CubeScreen::RotationNone), mPaintAllViewports (false), mDistance (0.0f), mTc (), mGrabIndex (0), mSrcOutput (0), mUnfolded (false), mUnfold (0.0f), mUnfoldVelocity (0.0f), mVertices (NULL), mNVertices (0), mSkyListId (0), mPw (0), mPh (0), mSkySize (0, 0), mTexture (0), mSky (0), mImgCurFile (0), mNOutput (1), mOutput (), mOutputMask (), mCleared (), mCapsPainted (), mFullscreenOutput (true), mOutputXScale (1.0f), mOutputYScale (1.0f), mOutputXOffset (0.0f), mOutputYOffset (0.0f), mDesktopOpacity (OPAQUE), mToOpacity (OPAQUE), mLastOpacityIndex (CubeOptions::InactiveOpacity), mRecalcOutput (false), mReversedWindowList (0) { for (int i = 0; i < 8; ++i) mTc[i] = 0.0f; memset (mCleared, 0, sizeof (mCleared)); updateOutputs (); updateGeometry (screen->vpSize ().width (), mInvert); optionSetUnfoldKeyInitiate (PrivateCubeScreen::unfold); optionSetUnfoldKeyTerminate (PrivateCubeScreen::fold); ScreenInterface::setHandler (s); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); } PrivateCubeScreen::~PrivateCubeScreen () { if (mVertices) free (mVertices); #ifndef USE_GLES if (mSkyListId) glDeleteLists (mSkyListId, 1); #endif } template class PluginClassHandler; PrivateCubeWindow::PrivateCubeWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), cubeScreen (CubeScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, true); } PrivateCubeWindow::~PrivateCubeWindow () { } template class PluginClassHandler; CubeScreen::CubeScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateCubeScreen (s)) { } CubeScreen::~CubeScreen () { delete priv; } CompOption::Vector & CubeScreen::getOptions () { return priv->getOptions (); } bool CubeScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool CubePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) { CompPrivate p; p.uval = COMPIZ_CUBE_ABI; screen->storeValue ("cube_ABI", p); return true; } return false; } void CubePluginVTable::fini () { screen->eraseValue ("cube_ABI"); } ./plugins/cube/images/0000755000004100000410000000000013246301624015110 5ustar www-datawww-data./plugins/cube/images/freedesktop.png0000644000004100000410000005053313246301623020136 0ustar www-datawww-dataPNG  IHDRmaQ"IDATx[obU_b$ިwxe8草q4јL J;-CPh9 m̍1N }6M!KXz@@^+zvQ6M$[[[p8,--=y~Яbmm- mllRs+5G*,GFFt^zWGJ΅HdVZ 0mUj>RcEm$9<<4L"vK=^&R)-//\.$zuÍF `Z*WoBCK1 Mȧ`0YsP1B +(C-uZԹ9T1#m+XBX_{.P 0h评iBEk!+ 0R}Ma3ϕJErci&Pm?WEt @kwz2i\V4qrr"# טVܭnzg\Tr Eg%*{Ú: B6Ɉ_yXt:v`XXu* @@?26dTUթkzB(yke|C7|0uN"|>ɪ61PρV,zBa(ѱ~\IU:d5hz B?}6dUfKz{\}P*Է @П 5ma+?QpH5O 0_ 'x0& rKHLy|_#ZJWBUq6z0+&Z-ufD~NkLٟweQ(SnX?+Vs#  Cꨮ^ꇿ.՟ڦn[Kan9_+޹TEaOk5z@Ph44h= {E h1^uM*MJJ]s<~߰Qou~j|j2znyNC=d~>1ᱬ^,u*+WR*:pdsinl`Je" п)?za}TKMysu~skEN:&!5X75#"^пVNLIH9##ϋ/V z\xE@!{ކnX hE"49 /|hX{e!G#,c3$I"?п(>p_˽boX(y v3N`/[^~_%^Qt83狏8xE@U玁(`EPWN.QQ@yK냩/GdƚCE@Bygߛ|MVxk30N@Xп\.xi)ɈH3HM !ZOSSVBA?7Aբ@'п0}Bfhh2SUAf8<511a_@ Gu 6|4SiI>5FҼxqqFlV6@?.O`EnAzWY? ':>=eY񺢽ƩAqvwj_k$5zוHU= y'4:s ܜP?T#a g|*^Tk@=?^!kvz2 51)4qI+/ UU*ڇG A.kUwD@]|[ڶLF*V(qz =OӻFҿ!^_m?O3}KV2cVݶq&}\󭱜AaHZ!y߭>ߵvmv:c@6d'^jn 8%^s'xtT*%'.*?_#{Y&ߥܿR@+Uu*[M菋bU3Hp"^2[<4>@Sp?):3ә3DAgb-vc 9&H|,+,qV讱i8[ } Yt_gUXU@ٞRT׉E̪c?ػ(0:@b`h&QIG4J E* XPEyȣ疥 }m),lvK \O 1_;;wr~$ewl6ˢ?YĵC(2+2 ]/`ɪD8L"JhnxP}X^uvԁiVlʲd8SɕWL:wH;TمLhnBPmd2#<|-՝/lw&F0.sk̴6MW囪l;'o!mi4T@?0ۼ* ExPf4Dy0娠t$wtȻ{l781H- dhmTtIMf2 .'Es[Z!gHm`B#vsEs[-\Ѩ|{#6G>;6596&>1 I [_yҜ -+ҟZ&~'xU?pzbCs_iA [SyEC)E ֵdmw6WuޘݗZ\YVcT4O[~zL|q'[vNdr.SV|[mCm@4H$M&''5\X^CLĂGb8 hMK6vPhP\.'?-B,4aN6s$Kx =5:8JK(Ej/2n&«F~T@~đ%ǚI1?DI۟:8z,rGq-Uf?9l?fLM+Xyo9hi%mlIJ]Ia(Tʑ'l$"Cӎ*ܖD$q$}pu+6xZbb1w<hn+F$|^ŕmֲҍ1{4v-9q>ǿ\E3Eq+r$Dž[M,j5.޸WϿMKw ɈPhn$o5zuEןg+w4m`pK%E-Wne4zyM&`r0s4E?B8p Q֖GmUE (X8s$d+`fe>MP ڊ=X-n -lR5*4mP6\uppБ+mEH  T47B_+208 yvceDMʢ:xwObMCyӀhC!涴) WzE@}}&_1ؚĀ!6X^GFFƧf菁#y,<|LIMhiՂPP *7"涼544YsE\JĸO 79ےH5bhX^_Y. 䋦<)ouMHk:6r:bh|&_4UB=hnװ<6^ݔ}%Dp*|ݔwnq4 C;S3spb?p|e|ݔ'[=`{l4wm˫L6nB*k_Q ~GCU;Gs.5Oġ@oM gmESoJs4KX^t-B'lmEo*(LgN"s0khMUijI+&VoxC4km땋pAƁqT.rJ}8-gř̙9/{z͝h (5.H?04ʺpcoX/DRh4Fsgش hX582kUӲLRWHݏ_ʿS/K! nz7MVʻhnW+|Sf.A@ZGW6 qy͟.!Z|j ܲ<-bm8;QWF}C#X%-r<-l/xPƝ7rqWiӡ[C2)נUH`)Z{g]Hib[ 󄚛ޱCsg8^$Ե^s6` zG;/Oyy( ͭfod,@llzO8{}kr:OZ=$Zh?S5kw ͍t~X:,x:_J[,3tJXcv0J`,=hnFΣ]|&q橥$ >?PI`%Xz8€;w a&jNzuquvtthk^TTZI՚<~yѣ;45f]fa b *&2477- a{P)&%Xƛ|`.{ĕ6ZC@s?As+X:S~I,ghn}3hng4e٩t-zSa}Mh%4پg4_tz<,Cƛ|?鱞 Mo"P+u=FsmiW?z~|œWzv5xߔQt,_3[^CeJt:1hn}S><,)/thnz{$44V?R"DGKQk<ƿ7/-kԕ)wtܮU[ϐ[u@?hn4U\Tzu=Fsy%秪Bmy3KK=?+סe8;[hn7 X-񯷃 :1RѻO4 XFBE^t2͂#x9f7SujjJTCPQgK;((a6i4$%Ѩ ]( -m4y@mw-ۖ-BՀJX۴XӨ){aGd|Xj$iyS hGWU۩n ώhn?ײfϛ\:::M-'xpDsp2æ܏kj+^/=ܾeM- `1e;Fwg_iaSBs.斷WT__Ts4L4Tz2&iXe+lNcxpDsp^ kqy]ӎRhny{ +bs:xpDs XQ[Nko:T]5O7u+'gdWs~]CY؏@gׄmcd2nKkۈCMݻ_Z-- 5Wa+SK3hn*W@a@s5H4B^˳D~:SPw`s`^ɩn!4NOOƒ#[9ɺH F:-بJvZ?1* _8X1UE渝Fvb'Gփ?܊ U͍3.-lYyT!"Nt U͍_Ds籰0tt[ғX`E5c*FH4ch5Xv aChM(%\n3sUwFDsoDs}m˦،΃ͦ?5q>һG:u܉DB-dhDs8رK߽ϦVDs;ث)hn4 "[(U͍fLs[e6 7XeSD-`FsxM9+I t X`qdFwnwq;G:+NES8ņܭ3U-8"흘5fQ칪7??W$?zi@8>X HhnB@s;k .~k/l~=ځ}n*0b  x_AWSPCp~2T0 5 %>c,aՅqeB*Cy-_TC~rYgXEc xgvu^斶Wy4~31= 7>GaWMZȤ sKmFw?!{GscيgxA=p uX{ʌ8@@cn,P^ܞ]TLeqiT`Ѱ<7,DxZ F>Wy47 4~ 30Xd%{ ٫6D Y9{Gs:w2WrH2`6f,`C&khnrO<;ϯ  %c`rTâ*&CTHa*XX#^ȈTr*nhn_ *v=OekF,voe;7{Se?0*˵rceUO[e+s0I($ -fja@+!\ Ay !A t29sy9|s^ɤ0Ϛ^飹@eSY!-E k4^ |~,CmR{F p~e'nwVa ZfF@_L嬽*@-^飹C&͖{5ϰ_?nΏ04>_ v/y*+Gs3ecI=oV.vM9f_H}i>=divطPe mBzd< ϔ5&tfGnI]߿/k8 EoFsL8;:<3S j0Sj/kёMO[ͬ wXL+56 Irm\MK}MOOAo(V>uX<.!&V A0Hk. 緑E]eMҗFGGm^飹"3GawV2qJȢ.hn]-yǥ3rK'%^9G'/h5t6$^;|.OdBlďbPr47* n)hff&,{hn&;:YvR7jEtr47COKSsgm}b):ͽs-,~"O'?c8j h~\ŕ4O۫bձs) "W["'HU_&_)YHD1H%D{hn&@"M ~K) Wӣ<o8+$@i*mίhf~)!S7Ll,SﶢW=52k5JF+}4-JSU7!_ Xg?cxj {F<Gs*?GJS_/l*mI0ʃMr47," {9!ViCHZ߅ ):iC>|JptJDaN"9+M d 4}Poo앣tAin.9@/](8L/KdVEs 7 $MWFkdOSr47Ƅl)*o(_#Cv,VHl+Gsq4U *:/ |Rù5aR*YJb%Df̈́~oPյB~&2(@@DmC`\H+Gs3aMRoEx HDPJnw-B/:YJ)Jyj|BLWffZ_*h|B)P*X|T$PQ15JiZ}6&i$GLh&im6M6ͣ0:̝ɜd;w~1ĖY*>%N3=@hB>hjey.{?=!R 0{gT7 j1l6Ohn\.p#;WV(Vܜ+Is]\j;OܔV]@@,Ծ&͍mq.! -\E?u"(/|r)˫hwGvৗzuAeKz11ye47i4Ao{n) zzRahn({XZyZP  mBWRi47 _xmZF6{*M&ܢ+++HV^M^)vN#o`*ޏ‚SEmv,&,&ʺQ@g;TD[Յ&1m@%h*y8qrNۆ4:9Eg lSB\$E+Ip4ڵ)5bEUwWԾMۙ[w}r o*.傝>Rhp;f`K3.<檵&δH)P "&-Dsk1@!]ǐSʙ[/h:p KEQV6,9䐼2t9<^Q˾鯓rqM ` TP(Jm @^mEshnOxZq(ikS~Bwmdv./\D쌖Ꜽ2hT1{>]Vs㳋*t:]XiUOȫh Fs{CFE> Mݦ[5m5#wk 49U)]Ԧ>$ Qw/!'+_5z>1B LUl2$NtMaE >j<&51bV'k{{{=aHye47IhlE= ;Y #XʫhnTM`l̂,rV*zZT`oV)V1s+4.,,`NHy-yY2j;#=Q%_4(M3L__<bLDsMEߢ$M묦RTl 8@&6@yM,c&}1?W@ڡo}l8mcQ^殸4;TfcOlD47+oce?*x`c ^JkHS^ί:L^DaeVʫ늂I*e@u(hp6 n'm+lִ鯲 B2z47Bz4ǽGiZ[q1rtG47pJ &L)M\.gWk+ )Es-="4M ʰ("hnQAng/..**qjѹʫłoX.@yu75B\Go.p\.LN+ȆgEa,`JȌ3ςpV^w}9җMQot?%KLtQEyE^wᾼ+?2Q</4ioǡ•zpU6AXW0(n_&"͚֚MFڇY]]O^lԞ+1:= }.cwX,UZZZRRRVV柼bC|bK(x%I|D#MwARUW>**j" KPQq0.RPEYD Q@@ P V H )5W37~z}jz׿{%BK.\8xK(**裏JGL0Nn+#pWW#'^rLgG s=W4N=zꉇ?I曤y\y0g;?#U4TRaVڵkUX^LggҪz$uw?y!ige/g;ѡC ŵ^Ky% U|y/gYes~v3#\ jԨQժU9VKW;+Ig$#;y/mw礓NӦMS:t狉7I N 0~ I SҀ7nO0L,wT,CuhtQyJ4;zK7Fa|X+9xS:C"Uϙ􏵪>5jUVq ֪UKL\veʃQ_xkda* Hu2" jg;?Sp敩juI8TWݻWPzuR^9vRi@!An 3gWH֭%u}ݲ~QNOoKy'eY]?uY"%2egcLgW6#M~3??%1 g;?=:u-'N?MX4RJKcy%5ciY|6 $ǡN?u3m3b$.M=Ve7hpr.m]U^5GL ^ggGmOT $ ڵksW*W^yEL?`ڔcyE1WXcÆ 3:ߙ ?4=OWe,ATظqcM}1?_q=w߿̟~[h)?9J0_4:UEL4ILxi[%`@4Ebh炼bw|٣ 1yev̴x/wT&O9)<Ѹlt*8@טW XCy'U7m,p%ǩҬ^Mb[Ѭ5mG-4Ronti~ʭv:)r~/N$RX![^s5c,`?SF¥R7)xbXNhwҾwGC /`$٣ʐEXoI0KAbpag;_W^zhKA x!֭[C- 0tom,)..Zhܸ15"%IS@ EX?(;$t&Cf%g+߾}|!pyg}6ZBhP֣,ԠAIE zT =q$ yLIjQ+<ܹS^ސ%eɰl޼ߐ3{Čg"c:]P^= <۷a38(tO밲W;?شiS2,Lw&LꎳUh|?oAlF-,,0LkE,RBT˧:-2 t3%Ep}N^JiZ+,WgoG.>yNϥ* .qedf.C}S[lQ& Hך/|voUv}Ef̰L~ Q]LN&hϚ5Xrσl#* AIFE }1Zy f4W<)4OvY[oQV=5 @5{ÝR%z~aBm۶@:,^;~<뀋`еkW@땪z-=X#Ƨ"6.?p<'Y}_K3vk1G?~z~Dd7|S4T G9 ;\ PaqP%-QVҠK _N4dW 1ܲwZ`ܫWi QOVLPQ͕csnfEt2f;y )poZqm?]v1#K$jvAϟ/&8J 2ROG_shQ.[Wu*ѠAyI `{@֝K:HQc30GDdHG줙~.L~-Sgd 4>Nzu*T Jq^3ljzal1P(2l'n֬ʲH5 p*;y# ͤÔLC + >7?*%,2eUf`5vXJiL",:u* d{)+((˜{D+Y(*H=n;W(?@J$y+BL[dDRHSN"DܙW麟oz=ػ>{=\{jأga>zZ(٬Jߛ_ڒ:+>!KϰEy#Dh3gH797l\QŨW{g+u- B^Mwsp1B_re$y%EB ?[ xk z1i7JCRB]!Kd9Nx~4dUe\ nǜ(87n\KU+Hn&XAX95PMp,hC *Yh=i7b I]oc7P.ٶ`g=b4lLl_$@G*qh y,S{1vIY`a},PRyΜ>m1_phVc@WAC>>j~=m:{rQ\~Sܲ3 LڥRfs̑0N^ze'X/X@T)j(i 5_(]PcRyknOX@9T0?X@a؁`5Z]IuM<A5y ڋ۷okt8Ā[dKZڀ-DMK{Ǐ۷o'{.G}-=M[n }1^ZDC˛jVpׯtˁ{TOvo7ո'7niLD!wq56 w ,˱oA`ӛ3 87I౭2*1_MNmAUMB@y}ɒ%a ^ \ YDCnf}AθONNb}~aj@+Ъʻ LܹsqaSqɩK y vD}5ĔNU9"Wo j&0;ܝ⧒]޽J1b 5jPJEMV7stsE-[PYUj8ϊIUhAoCԩS -Zw Hp\+f4y 9ٳgdA)x*MQ%r۫7aro(8 l6{&32[Lc*#{P ()3bhOEZ #4=ҥ&n|l>RBO&@ M0.!) B^<RӞw7JVKuu_+ -^xQ`Z@J->!AƐ< 0id}VB23Klg}mAb zR(vA0MUbY4y rRH5JW;iXٳ/ȅar>/5ԾJqM y}Dį+n$49U:Qb][>yfȪJUuzj8k7/_֮]KsO 5h]t…/N9qThgqZؚYI@\߱% ,ΡO{ܦPP;K˼h8 } }7Z/%(y4؛MsLK'#\Pq,* .it.K.]vmk clRCwzmDfb xh N4wi˷,aR|`\?8쓬d˞ɾ y"-BPJH4%Oӧ̛rz]|Y<>|?ꎫnݺpht]ՆLVLy_~[Hf9~x\ kGX"yinqLٳg2@E u-MU Bzƍe: H_gʘН_=wgϞ ?\ܹs6XS^}BO8 ܼys AͰ%&Sסsy_ۏT¬QnHT.#L8p@sZy-gҥl@Hdd+nf 8;[at4B^G Τ`*nګU- J}\ۭuw,ܵ }d`@ u.kʫ/_XXBݺႜlr: d['իz'-.saoQYG9_Y!#LnH\Mvܑ/_.ix DXqnyٚ"dQ/I].["0?\ׯ|QzYTuW2Hu!7K u{8&;љ4N}Ak`sJXM;W]EҰB՝+}2(W)C27ccc|4ڻc Xd.AKc`m)l7rb(\$3p1>;f(X1п0?|ۧ0da KI0, bQ!itdODO_߅a JIףOUME9m\sqW[c%9^%Qs @AtʿaKedl|b[hjy,NI1E#Q>(9өWWW#8{%`ZSXOE{DqKK$:\"}, ml6J/!D[q;?5:Ag|i:: XۊX)inprTS1q,HIן&p9g6akgѤ$GeV]itf>OՆWߝSfx=kr%U ZZb<7%9^ORasvM0v^k\.XF0%9^O}Ғnby%*d}؁vK@Jr4N M=z&xIGtwHrjtzƫ $9^x(֭)}TFA[*uYJRU{y{{9j/%9^h}|| >;;c/SMDj١7!ݮmL5%ZG|ɦ8.HIr*[___Ox$ǫ$9^%IWIrJUx$ǫ$ߑ٩HNIENDB`./plugins/cube/compiz-cube.pc.in0000644000004100000410000000042413246301623017010 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-cube Description: Cube plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lcube Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz./plugins/loginout/0000755000004100000410000000000013246301623014564 5ustar www-datawww-data./plugins/loginout/CMakeLists.txt0000644000004100000410000000015513246301623017325 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (loginout PLUGINDEPS composite opengl) ./plugins/loginout/src/0000755000004100000410000000000013246301623015353 5ustar www-datawww-data./plugins/loginout/src/loginout.cpp0000644000004100000410000001654613246301623017733 0ustar www-datawww-data/* * Compiz login/logout effect plugin * * loginout.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "loginout.h" COMPIZ_PLUGIN_20090315 (loginout, LoginoutPluginVTable) void LoginoutScreen::updateWindowMatch (CompWindow *w) { bool curr; LOGINOUT_WINDOW (w); curr = optionGetInMatch ().evaluate (w); if (curr != lw->login) { lw->login = curr; if (curr) { lw->gWindow->glPaintSetEnabled (lw, true); lw->gWindow->glDrawSetEnabled (lw, true); numLoginWin++; } else { lw->gWindow->glPaintSetEnabled (lw, false); lw->gWindow->glDrawSetEnabled (lw, false); numLoginWin--; } cScreen->damageScreen (); } curr = optionGetOutMatch ().evaluate (w); if (curr != lw->logout) { lw->logout = curr; if (curr) { lw->gWindow->glPaintSetEnabled (lw, true); lw->gWindow->glDrawSetEnabled (lw, true); numLogoutWin++; } else { lw->gWindow->glPaintSetEnabled (lw, false); lw->gWindow->glDrawSetEnabled (lw, false); numLogoutWin--; } cScreen->damageScreen (); } if (numLoginWin || numLogoutWin) { cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } else { cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } } void LoginoutScreen::optionChanged (CompOption *opt, LoginoutOptions::Options num) { switch (num) { case LoginoutOptions::InMatch: case LoginoutOptions::OutMatch: foreach (CompWindow *w, screen->windows ()) updateWindowMatch (w); cScreen->damageScreen (); break; default: cScreen->damageScreen (); break; } } void LoginoutScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { updateWindowMatch (w); } } void LoginoutScreen::matchPropertyChanged (CompWindow *w) { updateWindowMatch (w); screen->matchPropertyChanged (w); } bool LoginoutWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; LOGINOUT_SCREEN (screen); if ((ls->in > 0.0 || ls->out > 0.0) && !login && !logout && !(window->wmType () & CompWindowTypeDesktopMask) && ls->opacity < 1.0) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; status = gWindow->glPaint (attrib, transform, region, mask); return status; } bool LoginoutWindow::glDraw (const GLMatrix &transform, GLFragment::Attrib &fragment, const CompRegion ®ion, unsigned int mask) { bool status; LOGINOUT_SCREEN (screen); if ((ls->in > 0.0 || ls->out > 0.0) && !login && !logout) { GLFragment::Attrib fA = fragment; if (!(window->wmType () & CompWindowTypeDesktopMask)) fA.setOpacity (fragment.getOpacity () * ls->opacity); fA.setBrightness (fragment.getBrightness () * ls->brightness); fA.setSaturation (fragment.getSaturation () * ls->saturation); status = gWindow->glDraw (transform, fA, region, mask); } else { status = gWindow->glDraw (transform, fragment, region, mask); } return status; } void LoginoutScreen::preparePaint (int ms) { float val; val = ((float)ms / 1000.0) / optionGetInTime (); if (numLoginWin) in = MIN (1.0, in + val); else in = MAX (0.0, in - val); val = ((float)ms / 1000.0) / optionGetOutTime (); if (numLogoutWin) out = MIN (1.0, out + val); else out = MAX (0.0, out - val); if (in > 0.0 || out > 0.0) { val = (in * optionGetInOpacity () / 100.0) + (1.0 - in); float val2 = (out * optionGetOutOpacity () / 100.0) + (1.0 - out); opacity = MIN (val, val2); val = (in * optionGetInSaturation () / 100.0) + (1.0 - in); val2 = (out * optionGetOutSaturation () / 100.0) + (1.0 - out); saturation = MIN (val, val2); val = (in * optionGetInBrightness () / 100.0) + (1.0 - in); val2 = (out * optionGetOutBrightness () / 100.0) + (1.0 - out); brightness = MIN (val, val2); } cScreen->preparePaint (ms); } void LoginoutScreen::donePaint () { if ((in > 0.0 && in < 1.0) || (out > 0.0 && out < 1.0)) cScreen->damageScreen (); cScreen->donePaint (); } LoginoutScreen::LoginoutScreen (CompScreen *screen) : PluginClassHandler (screen), LoginoutOptions (), cScreen (CompositeScreen::get (screen)), kdeLogoutInfoAtom (XInternAtom (screen->dpy (), "_KWIN_LOGOUT_EFFECT", 0)), numLoginWin (0), numLogoutWin (0), brightness (1.0), saturation (1.0), opacity (1.0), in (0.0), out (0.0) { char buf[128]; int scr = DefaultScreen (screen->dpy ()); ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); optionSetInMatchNotify (boost::bind (&LoginoutScreen::optionChanged, this, _1, _2)); optionSetOutMatchNotify (boost::bind (&LoginoutScreen::optionChanged, this, _1, _2)); /* wmSnSelectionWindow is not available, so we have to retrieve it * ourselves. */ snprintf (buf, 128, "WM_S%d", scr); wmSnSelectionWindow = XInternAtom (screen->dpy (), buf, 0); /* This is a temporary solution until an official spec will be released */ XChangeProperty (screen->dpy (), wmSnSelectionWindow, kdeLogoutInfoAtom, kdeLogoutInfoAtom, 8, PropModeReplace, (unsigned char*)&kdeLogoutInfoAtom, 1); /* Disable paint functions until we need them */ cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } LoginoutScreen::~LoginoutScreen () { char buf[128]; int scr = DefaultScreen (screen->dpy ()); snprintf (buf, 128, "WM_S%d", scr); XDeleteProperty (screen->dpy (), wmSnSelectionWindow, kdeLogoutInfoAtom); } LoginoutWindow::LoginoutWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), login (false), logout (false) { LOGINOUT_SCREEN (screen); WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow); gWindow->glPaintSetEnabled (this, false); gWindow->glDrawSetEnabled (this, false); ls->updateWindowMatch (window); } LoginoutWindow::~LoginoutWindow () { LOGINOUT_SCREEN (screen); if (login) { ls->numLoginWin--; ls->cScreen->damageScreen (); } if (logout) { ls->numLogoutWin--; ls->cScreen->damageScreen (); } } bool LoginoutPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/loginout/src/loginout.h0000644000004100000410000000450113246301623017364 0ustar www-datawww-data/* * Compiz login/logout effect plugin * * loginout.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "loginout_options.h" class LoginoutScreen : public PluginClassHandler , public LoginoutOptions, public ScreenInterface, public CompositeScreenInterface { public: LoginoutScreen (CompScreen *); ~LoginoutScreen (); CompositeScreen *cScreen; Atom kdeLogoutInfoAtom; Atom wmSnSelectionWindow; int numLoginWin; int numLogoutWin; float brightness; float saturation; float opacity; float in; float out; void updateWindowMatch (CompWindow *); void optionChanged (CompOption *opt, LoginoutOptions::Options num); void preparePaint (int); void donePaint (); void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *); }; class LoginoutWindow : public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: LoginoutWindow (CompWindow *); ~LoginoutWindow (); CompWindow *window; GLWindow *gWindow; bool login; bool logout; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool glDraw (const GLMatrix &, GLFragment::Attrib &, const CompRegion &, unsigned int); }; #define LOGINOUT_SCREEN(s) \ LoginoutScreen *ls = LoginoutScreen::get (s); #define LOGINOUT_WINDOW(w) \ LoginoutWindow *lw = LoginoutWindow::get (w); class LoginoutPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/loginout/loginout.xml.in0000644000004100000410000000557013246301623017562 0ustar www-datawww-data <_short>Login/Logout <_long>Login/Logout effect Effects opengl regex composite opengl decor <_short>Login <_short>Logout ./plugins/splash/0000755000004100000410000000000013246301624014217 5ustar www-datawww-data./plugins/splash/CMakeLists.txt0000644000004100000410000000015313246301623016755 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (splash PLUGINDEPS composite opengl) ./plugins/splash/src/0000755000004100000410000000000013246301624015006 5ustar www-datawww-data./plugins/splash/src/splash.cpp0000644000004100000410000003326413246301623017013 0ustar www-datawww-data/* * Compiz splash plugin * * splash.cpp * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "splash.h" COMPIZ_PLUGIN_20090315 (splash, SplashPluginVTable); const std::string SPLASH_BACKGROUND_DEFAULT(""); const std::string SPLASH_LOGO_DEFAULT(""); void SplashScreen::preparePaint (int ms) { bool lastShot = false; fade_in -= ms; if (fade_in < 0) { time += fade_in; fade_in = 0; if (time < 0) { if (fade_out > 0 && fade_out <= ms) lastShot = true; fade_out += time; time = 0; if (fade_out < 0) fade_out = 0; } } if (initiate) { fade_in = fade_out = optionGetFadeTime () * 1000.0; time = optionGetDisplayTime () * 1000.0; initiate = false; } if (fade_in || fade_out || time || lastShot) { active = true; mMove += ms / 500.0; if (!hasInit) { hasInit = true; mMove = 0.0; CompString back_s (optionGetBackground ()); CompString logo_s (optionGetLogo ()); CompString pname ("splash"); back_img = GLTexture::readImageToTexture (back_s, pname, backSize); logo_img = GLTexture::readImageToTexture (logo_s, pname, logoSize); if (!back_img.size ()) { CompString defaultBack (SPLASH_BACKGROUND_DEFAULT); back_img = GLTexture::readImageToTexture (defaultBack, pname, backSize); if (back_img.size ()) { compLogMessage ("splash", CompLogLevelWarn, "Could not load splash background image " "\"%s\" using default!", back_s.c_str () ); } } if (!logo_img.size ()) { CompString defaultLogo (SPLASH_LOGO_DEFAULT); logo_img = GLTexture::readImageToTexture (defaultLogo, pname, logoSize); if (logo_img.size ()) { compLogMessage ("splash", CompLogLevelWarn, "Could not load splash logo image " "\"%s\" using default!", logo_s.c_str () ); } } if (!back_img.size ()) compLogMessage ("splash", CompLogLevelWarn, "Could not load splash background image " "\"%s\" !", back_s.c_str () ); if (!logo_img.size ()) compLogMessage ("splash", CompLogLevelWarn, "Could not load splash logo image \"%s\" !", logo_s.c_str () ); } } else { active = false; if (hasInit) hasInit = false; cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); foreach (CompWindow *w, screen->windows ()) { SPLASH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, false); } } cScreen->preparePaint (ms); } void SplashScreen::donePaint () { if (fade_in || fade_out || time) cScreen->damageScreen (); cScreen->donePaint (); } static CompRect splashGetCurrentOutputRect () { int root_x = 0, root_y = 0; int ignore_i; unsigned int ignore_ui; int output; Window ignore_w; if (screen->outputDevs ().size () == 1) output = 0; else { XQueryPointer (screen->dpy (), screen->root (), &ignore_w, &ignore_w, &root_x, &root_y, &ignore_i, &ignore_i, &ignore_ui); output = screen->outputDeviceForPoint (root_x, root_y); } CompRect rect (screen->outputDevs ()[output]); return rect; } bool SplashScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform = transform; GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); bool status = true; float alpha = 0.0; if (active) { alpha = (1.0 - (fade_in / (optionGetFadeTime () * 1000.0) ) ) * (fade_out / (optionGetFadeTime () * 1000.0) ); saturation = 1.0 - ((1.0 - (optionGetSaturation () / 100.0) ) * alpha); brightness = 1.0 - ((1.0 - (optionGetBrightness () / 100.0) ) * alpha); } status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (!active) return status; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (back_img.size ()) { int x, y; for (x = 0; x < MESH_W; x++) { for (y = 0; y < MESH_H; y++) { mesh[x][y][0] = (x / (MESH_W - 1.0) ) + (0.02 * sin ( (y / (MESH_H - 1.0) * 8) + mMove) ); mesh[x][y][1] = (y / (MESH_H - 1.0) ) + (0.02 * sin ( (mesh[x][y][0] * 8) + mMove) ); } } foreach (GLTexture* tex, back_img) { tex->enable (GLTexture::Good); if (screen->outputDevs ().size () > 1) { x = (screen->width () - backSize.width ()) / 2; y = (screen->height () - backSize.height ()) / 2; } else { CompRect headOutputRect = splashGetCurrentOutputRect (); x = (headOutputRect.width () - backSize.width ()) / 2; y = (headOutputRect.height () - backSize.height ()) / 2; x += headOutputRect.x (); y += headOutputRect.y (); } GLTexture::Matrix mat = tex->matrix (); sTransform.translate (x, y, 0); float cx1, cx2, cy1, cy2; std::vector coords; std::vector vertices; coords.reserve (12 * (MESH_W - 1) * (MESH_H - 1)); vertices.reserve (18 * (MESH_W - 1) * (MESH_H - 1)); for (x = 0; x < MESH_W - 1; x++) { for (y = 0; y < MESH_H - 1; y++) { cx1 = (x / (MESH_W - 1.0) ) * backSize.width (); cx2 = ( (x + 1) / (MESH_W - 1.0) ) * backSize.width (); cy1 = (y / (MESH_H - 1.0) ) * backSize.height (); cy2 = ( (y + 1) / (MESH_H - 1.0) ) * backSize.height (); coords.push_back (COMP_TEX_COORD_X (mat, cx1)); coords.push_back (COMP_TEX_COORD_Y (mat, cy1)); coords.push_back (COMP_TEX_COORD_X (mat, cx1)); coords.push_back (COMP_TEX_COORD_Y (mat, cy2)); coords.push_back (COMP_TEX_COORD_X (mat, cx2)); coords.push_back (COMP_TEX_COORD_Y (mat, cy2)); coords.push_back (COMP_TEX_COORD_X (mat, cx2)); coords.push_back (COMP_TEX_COORD_Y (mat, cy2)); coords.push_back (COMP_TEX_COORD_X (mat, cx2)); coords.push_back (COMP_TEX_COORD_Y (mat, cy1)); coords.push_back (COMP_TEX_COORD_X (mat, cx1)); coords.push_back (COMP_TEX_COORD_Y (mat, cy1)); vertices.push_back (mesh[x][y][0] * backSize.width ()); vertices.push_back (mesh[x][y][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x][y + 1][0] * backSize.width ()); vertices.push_back (mesh[x][y + 1][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x + 1][y + 1][0] * backSize.width ()); vertices.push_back (mesh[x + 1][y + 1][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x + 1][y + 1][0] * backSize.width ()); vertices.push_back (mesh[x + 1][y + 1][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x + 1][y][0] * backSize.width ()); vertices.push_back (mesh[x + 1][y][1] * backSize.height ()); vertices.push_back (0.0f); vertices.push_back (mesh[x][y][0] * backSize.width ()); vertices.push_back (mesh[x][y][1] * backSize.height ()); vertices.push_back (0.0f); } } stream->begin (GL_TRIANGLES); stream->color4f (1.0, 1.0, 1.0, alpha); stream->addVertices (vertices.size () / 3, &vertices[0]); stream->addTexCoords (0, coords.size () / 2, &coords[0]); if (stream->end ()) stream->render (sTransform); if (screen->outputDevs ().size () > 1) { CompRect headOutputRect = splashGetCurrentOutputRect (); x = (headOutputRect.width () - backSize.width ()) / 2; y = (headOutputRect.height () - backSize.height ()) / 2; x += headOutputRect.x (); y += headOutputRect.y (); } else { x = (screen->width () - backSize.width ()) / 2; y = (screen->height () - backSize.height ()) / 2; } sTransform.translate (-x, -y, 0); tex->disable (); } } if (logo_img.size ()) { foreach (GLTexture* tex, logo_img) { tex->enable (GLTexture::Good); int x, y; if (screen->outputDevs ().size () > 1) { CompRect headOutputRect = splashGetCurrentOutputRect (); x = (headOutputRect.width () - logoSize.width ()) / 2; y = (headOutputRect.height () - logoSize.height ()) / 2; x += headOutputRect.x (); y += headOutputRect.y (); } else { x = (screen->width () - logoSize.width ()) / 2; y = (screen->height () - logoSize.height ()) / 2; } GLTexture::Matrix mat = tex->matrix (); sTransform.translate (x, y, 0); GLfloat coords[12]; GLfloat vertices[18]; coords[0] = COMP_TEX_COORD_X (mat, 0); coords[1] = COMP_TEX_COORD_Y (mat, 0); coords[2] = COMP_TEX_COORD_X (mat, 0); coords[3] = COMP_TEX_COORD_Y (mat, logoSize.height ()); coords[4] = COMP_TEX_COORD_X (mat, logoSize.width ()); coords[5] = COMP_TEX_COORD_Y (mat, logoSize.height ()); coords[6] = COMP_TEX_COORD_X (mat, logoSize.width ()); coords[7] = COMP_TEX_COORD_Y (mat, logoSize.height ()); coords[8] = COMP_TEX_COORD_X (mat, logoSize.width ()); coords[9] = COMP_TEX_COORD_Y (mat, 0); coords[10] = COMP_TEX_COORD_X (mat, 0); coords[11] = COMP_TEX_COORD_Y (mat, 0); vertices[0] = 0; vertices[1] = 0; vertices[2] = 0; vertices[3] = 0; vertices[4] = logoSize.height (); vertices[5] = 0; vertices[6] = logoSize.width (); vertices[7] = logoSize.height (); vertices[8] = 0; vertices[9] = logoSize.width (); vertices[10] = logoSize.height (); vertices[11] = 0; vertices[12] = logoSize.width (); vertices[13] = 0; vertices[14] = 0; vertices[15] = 0; vertices[16] = 0; vertices[17] = 0; stream->begin (GL_TRIANGLES); stream->color4f (1.0, 1.0, 1.0, alpha); stream->addVertices (6, vertices); stream->addTexCoords (0, 6, coords); if (stream->end ()) stream->render (sTransform); sTransform.translate (-x, -y, 0); tex->disable (); } } glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); return status; } bool SplashWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; SPLASH_SCREEN (screen); if (ss->active) { GLWindowPaintAttrib pA = attrib; pA.brightness = (attrib.brightness * ss->brightness); pA.saturation = (attrib.saturation * ss->saturation); status = gWindow->glPaint (pA, transform, region, mask); } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } bool SplashScreen::initiateSplash (CompAction *action, CompAction::State state, CompOption::Vector options) { initiate = true; cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); foreach (CompWindow *w, screen->windows ()) { SPLASH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, true); } return false; } /* replace with ctor, dtor, init etc */ SplashScreen::SplashScreen (CompScreen *screen) : PluginClassHandler (screen), SplashOptions (), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), splashAtom (XInternAtom (screen->dpy (), "_COMPIZ_WM_SPLASH", 0)), fade_in (0), fade_out (0), time (0), backSize (0, 0), logoSize (0, 0), hasInit (false), hasLogo (false), hasBack (false), mMove (0.0), brightness (0), saturation (0), initiate (false), active (false) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); if (optionGetFirststart () ) { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; result = XGetWindowProperty (screen->dpy (), screen->root (), splashAtom, 0L, 8192L, false, XA_INTEGER, &actual, &format, &n, &left, &propData); if (result == Success && n && propData) { XFree (propData); } else { int value = 1; XChangeProperty (screen->dpy (), screen->root (), splashAtom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) &value, 1); } initiate = true; // should fix later if (initiate) { cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } } optionSetInitiateKeyInitiate (boost::bind (&SplashScreen::initiateSplash, this, _1, _2, _3)); } SplashWindow::SplashWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)) { GLWindowInterface::setHandler (gWindow, false); SPLASH_SCREEN (screen); if (ss->initiate) { gWindow->glPaintSetEnabled (this, true); } } bool SplashPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/splash/src/splash.h0000644000004100000410000000470013246301623016451 0ustar www-datawww-data/* * Compiz splash plugin * * splash.h * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include "splash_options.h" #define MESH_W 16 #define MESH_H 16 extern const std::string SPLASH_BACKGROUND_DEFAULT; extern const std::string SPLASH_LOGO_DEFAULT; class SplashScreen : public PluginClassHandler , public SplashOptions, public CompositeScreenInterface, public GLScreenInterface { public: SplashScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; Atom splashAtom; int fade_in; int fade_out; int time; GLTexture::List back_img, logo_img; CompSize backSize, logoSize; bool hasInit, hasLogo, hasBack; float mesh[MESH_W][MESH_H][2]; float mMove; float brightness; float saturation; bool initiate; bool active; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); bool initiateSplash (CompAction *, CompAction::State, CompOption::Vector); }; #define SPLASH_SCREEN(s) \ SplashScreen *ss = SplashScreen::get (s) class SplashWindow : public PluginClassHandler , public GLWindowInterface { public: SplashWindow (CompWindow *); CompWindow *window; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); }; #define SPLASH_WINDOW(w) \ SplashWindow *sw = SplashWindow::get (w) class SplashPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/splash/images/0000755000004100000410000000000013246301624015464 5ustar www-datawww-data./plugins/splash/images/splash_logo.png0000644000004100000410000000724513246301623020513 0ustar www-datawww-dataPNG  IHDR1 #OlIDATxytENj+nHnEE/XVT " *"aEQuu t+{XL&C9$ G@b8Cꭟoz$s$l}Uݿ BP( BP( BP( BP( ’xq!Fyn,OʇD}.2RLnȧ'J╷o&3h j˼ rRmR!f/INyy.~Rc^%9>NF0٥t] xX617O~? zxK:H`y5e!=QE;Mw9KV- Ѓ0 >/sn*oV/Bt?]"^e7)h?򹻵~[:H_g)~|<ƏVнWz$3{M }OB@ww}PgqVP uW c^N_kQ;$gVpk&ܬFgpaJ[M?{8ؙN#-lb(vԼ!yG쓸atT~յ,Bv\A}Y[nEk)埐{PhVC4 dARNH"=q,#ұT(^~-xf+mxs'ef*%ȂK<a0{g^í$MPgbV}.zQ,/8"jmT, obayI`Cg dE&\ Γ_ݡe>Bo~'*Zmm:^.j^ mt]d2Q_QCF{Hc<͏?.Je_òȄK=Y-$q"Wkc8 )x=N?;?iЍc|-]%SQ0N!jK(@}OI#ŏ~A<7pAYܷb_=ȂwD[~6rpK~IsJ^L ΑmzP켼V_NBXnO'(ƼUG1VC />DM,"ޭv<+b_r'=IY?jN>Uh;"ܔd zCJ_ tƿ gq&ꬼSOw4FH'18$Z"Exg_G&|Oo ^%bՏ (ɱM:- XZ 1 }Q賴J?:%SPg#)NQOG1{j xCTJ1yBl힬3 .?2)$.<̘hmQq5DFC&\I1D,Y Uzz/C]U(@ǴV/GR/|QB֚zV r,yxdBcE']G&j*08HDaw:;]1Wz#kKfė[O&,imL8 >D.%YP{aB6 nd e׵2&A[A43*{Vl +_[ 0$I<΋gKh냺7Ma1[ YZ1,p5c]CCe=dB1vvčl(?bL($E|&ݏL@[($7\QC25fe$uU<@BjI\/faLOb!2WdB%Obn!X,I좔Ă?$@[$`;ɞ1K[|C/PqZ=NwiFem crp.'jP;-5&b4u;^_Z4hKBD}ŤbR_1E+/=g{2*hdm7kѩ7E=/=.v~b\*ɋ NEaDžYt*wlݸ /e''&jQާ-uV ey*do@z ů'bvEi,^7?@R^zgY~m?l[#Rt*ëG zbl'o!#QJ吝M0_Ư o .ޕbX aEbr!Y#Z86@s{Xl&)Lb)lO\SG[[7Dۭp\DK=&~=7 yy;=7,mg/ x\ٷzi5R[ Tn/e#\z@lwfOd^;?Pl0G^cJ0^T\ByT-܈'R=|Y9;rNȧzNTն b"X'p7{}ϋZN#(OZ^oy A nu8R+v ߌlKWpXzw|`@f[7 R.{ %z?t8CP_FC& sIPZlb!` wQ((+5A_v; 럥]w~vpzB:@B~Y5( @y_xB# 9m/Y;C p4o4Bk O( EBL- @ R.Ұ3HPt.bB > E\, )CbhC)C<qX%pKPIENDB`./plugins/splash/images/splash_background.png0000644000004100000410000004631613246301623021674 0ustar www-datawww-dataPNG  IHDR=;LIDATx}dWuBW=3ӓ43$"Xʋ6X^X kuf``KX,0&H"*`QɝsΕ{UꪮbWs=>iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤIM_Z0Bb缥( @ Mhc+m6sTv'ĢWj^ ɏCCK^u.I/#&vc lj.zE6at lXAhCAAVAٔ_G0W~þA@a`t:_o~km 60D(10Н$#&p ]_x0ȋ_>6tȖ̅: .ѱ1ظ#GW꺾h¼"{+C@ J_4߱QŠy'.v5:ԩY~>ֹ[ X_:ilAww7ye /{ӓ=;&( I?Khμ @*|z D] !:vD+ut7C}C^:|lӉ&;_0,9 3sKOUWW}δiڮ-0au1qt`Wz+tex `Ovg 5^X 7>yWt$HV]掼 = :T6ǽ^^:dBC/l沲1 }aU 7]C Ҋc7 ^ WB||]ٷс67m|t^O'ye+;NF8DO$nFFFu jZu5/"@Z nw싯pߕteKJūLy<ʎ&&e9LBZpaΞ8tL= S|SkoЩ}0«!2t9Bxtln>_M_+\.Wd/ \ 4Ms4v eS=,@Zu|>}&Cѕ}RMtewU:=ei70WUu]| i b1^ 3K S_zJʳǃzb=z D.n%2Y _hӆG ? Nv̱{dlj^^)% l H s>J >*@Zi9z @dbܬ<ҽzt OWu>/1٫a1cـ cpLB}/Iw@GK V<{f2<~5}8I {)kX4CP]j=٫89L@)[é30>>EbJ7pH(s00}j_ JxS <{ Xσst8W0) -PN0zo~|o]cJtn'٫Dtt!Ϩ Jte@W^h|J>@z}%@`03ZѺ7~n/x>o= qϿ C _p^eFuc05WII@Z xݏa>GepvwDA]D_삉'žtU?ѱ ns&s@dɎ'j&A!nA.,,R٥?`5nA&@Q҅8}<,¾W?CRDS;aaN>Xߪ.^h [:][dAOvT:٫yR7@\  8^) (M-;BmI (_Q&ݪ.\h*u>?/={ DF.V oCeQL* Mv餲LkP<@ ë^ً(J:{.\觀p * >/Y0]G(o?Vٓ5H*!.e}vIFˋ<=DIz`"E@㭿_r^+ɎMF|Ӻ)夔_,F@dk64s}MT@9[J8D.zn^nx1%w[˕}%mA9 }>~BXB%NyRJ@YߴPAP*5k,:BT>Z*$$5a..Fـ`Yt)ay={Fض ˎKyKRd5aU0\OLRwA^@Sc}$O+YJY +  >_֛:ÑӰes'Ӊ$tbV\/,Ԅ~_ja I5H\Xdm{v-<ˬcL0dj>ZT:kn):7E{!4q-<Þ֌J'ݞb{bjWvv8 qi7>GC+h455Kܕr%t9YVFJ@Eޣ`k> C{wBsce`ۋIYxjWx$1 4"0U7@فe[ |ӷ9>ps3w#dCR(&,#XRPm0 'EU"*M}^zwl333lzֻO+YJl= 7xj_G`P-HZLH|7m{O`WW#tBKK *`"fwզ&,oSPpT+1T6)CT60v@&uCi[''Y/@! :P&^i+{P]Eh!0؁<7?gݽ ZkDISD5a;Y%|=JXzTP6F`Ol5`*0!b3.P7AAv`;^}10ӌVd e  %smY x:Ӻ` @QXdum/w{|`ofcr*eJZ+UJ> ,tRXZ@n@Hةe.¿(qrR$[n~Czxm)I$Rq(fQT{Q j¢ MGK=='A%n  E4uOǿÙS u-Xc"{ &"kQ/]JPMMX$H#'tBL12Q1@Ǹ*ݠ۠_} Ͽt&BlGWAtOFL]unOe #GI$JdPA%Fk3.طgaSg;s LJF,su BnR,%} V֬c/>!\1$*(С.;6@"vBBݘ0~it`,JޯԄ%eNbr>\dI-KISctҫ:`@ PʯDz(4rq kȷrY:jQQb=HnS"(J]BNN@SDTt&`=[~`zxLB 0(Ucr9dPu|ZR5PWk-sȒ߶({fb@J5IZ:o^y}az6u3 H3K ݞmSJ쵨&,kw)(I%HRfq\Lz\ u^ڬ tv2vavX Ӊ8ّ >dj^+h:yHX@&6#A6`3$} H^Rb?l Z[iF@ WE*w&,#(k+ن\yys%2ƀfbtخKH 80vSgX ^ ]WKU5aQ]BYofp,%GIY"th"K`ao}\tb"$);m "sW5/TXPkH:JL݄Dv]UltT=lDTM,MC@?g`sg` ]d ABHe2?{- :Ȓ2LqԌn-dcz$\@F]t ݔxiv^>v,K3əfB\Կ>jtZ4JI:%" Iuϝde9Qv A%-1ըAכf_ '(;ܶ\o X!*XUYJnJ+{5XO%RWLĜG`ADf:$b&AusQ߰r8:} 1kMH+u[6RJW m/p \]< d-؁b؟M# 2Paϻ>? /cc[475&z4#!;!,ՄeoUjL _X,gzQxd;P@74\: PqÆo>=\O+ : XXJԄE  U]y2 .=N':$bT,QgD77egP/uHl_ iF+T 7a-5DWй@R;slVrU#f *. CMԢ'Hf b-X1: ;GA*` V*2&EVN:\haɷ6L d8!:dP@F-U ?|?ԽH /b33b@R(%\Y-H'ȖQF݋13+M @ݛU Gw]rpҌY 0nCz$2Y q q9*"X ȥ)IJY:/4t v:ftӌ^Kk\߃p!xD ؎ɅX앾YӄՄ9IU25^G.TEI\*}pVY@@@0Up߹ n`ADd'c Qf sg- C:H&~ǕGPWA +q :ubd^WCU)uf!@U}vD].)r% 8=u;]La] %0dűcjquPV a ` ӯAM^9 i^ E ";p /%dcW&,Z0@dyl wy; \ۤe~͹#3 KwDK&oZC,lhgՌ ,ň}[<1ܑ|K xk-Ԅdn+H;.ث~j u3uyqt\jx y`L(!! `P(-7Kx55amZeR\g!SHOɁ1du,tٌSW^~#bNU&+jR> ]/郰Z؁!Fnɘő\k7ְ KJ2>;#Xy02쥘k 2^ 2e+x Kb$7e,ve_}aro3{oǀ;U05Xn-9_b1\AjRbUSw@`b΅Ji]%QJ4X:PW/CdĉDTA]JI1V뀏 rex^)@mr1v"Q@ɹr&6#6SYŖo JDt,A];*vh;)VMACbDɲj u  +MMZ ?JVߝogQ:@Pݧb=꿢۠9HLķcZ[vµ.zCB& 0v0m1 d2qe/"< r|EZp;55m˵tBl1$6@Y*e] h@ۻK}-ML"$$!@$pnVkb9(kPd Z8W>^1䒅%VR!BR4{w=DÁĶY q~+9ם(VBDRK@H  RKMXA] eu+F^\\QP`"n Sݍp!8~ e!v,M@0@NbQt?J P^.ZFA&\ $ϋ 9F^ Tw@ ۉc۩v="aQ5QVh}9? qC; $bY@Wv~a.5aIA|+%K5֑`#l1(8Vl[UwKoI(iFd b,ޠԀP,5adm=?c$Fީ,`5TIqD, c3lnPW`U8? ãLRVD]׃CJ^LVeR !)J90&I baKN&/R3Lg] рWUCkϜKM@vDL3Vv… nݤJƭyt`I2H7;Sm+=ƶ" |&b9c[Lk0OXoNodHVpc'x⠁@aٹFbKlPP4/aG [6mƆ;@0@v,"B %KR4,\ V +MtAKLxv*8I'_}`A=2I8 $J n1fy mRd}U_ʽ 1!a@fD{RVs2)bm51'5aр ߬A'v;ɜۄ'mRoY@.%&[ekĹ4Sߊ,ahH}`l]`9؁a,!cϣpJ0 4w}+\@O|mv7TĀ"6^Du2#@7j>']q8q[%ox)̔+&A>?6gʲA.nJ`n`(s Wg (-{%-a֠Uu=L@'Q\''0؀bX ,5߯a1l7 2xahknL(ƿ[8OnM|p``aKKDrh! NŇ%YWx68Kc$x$!J-p| "(4%`Hqfo-NvnԂ+-N4N3gdvBSb7lsppP.4XDJ#HD! '[: IUI%sH1:1zB\]u Hc5!ؓ؁bDPqb$)3;Ɏ'&P8ٱ(AQ~@OF7lڴ18AWJ?|Mk ɏd_%Y8U0;C @8/:*;Yel #%p>7JZnd*5zi!&4#8$E' e H㤌$77⹖=u31,s._ " gq ů> k  AQtRB&A\]+7 &XdJ>^eS}8~ *llڮhWSG`ۮ=*th@vM\KG:jYt J @H2tݰvM\'%q TLW NBKA6VWYҏX_ o7 KS,?5x۷&{es>/[FZ )`!AP(FL Bz  5p2Ԁ^I@\֊U= $N# `ԛOƇԃ3g޽{V6 ~fjKtNj_`=0XUoj)pr9)Ұ|`i0;mlb, N SA;'߀绡 x?~5Y mli.qUP*2+sۇ O͛7Ve P ~OvO;Di/# 0KP=;h .}>=@ Y1JIV`e``&\&,v1Vٓ_%.PQ@;1eEH$?6TcG/s/rpաˡ!P_lu دcYK EP{0CW8cEشiW!F-U dϏp=W ]Hka.|cp%zÆ ct&HBo9\ (+P1N _"$RAʷ$dE+~``"!=ؿ 15!BOʃ6, A";`Cd t&x7®_MXhkk˩TZy@e ,WM`v D#0sE:6&&0V )Y n088X!VVYAŒAGZe¼)@ĸK`#}{YZ BVPՄ6`g 0] ,;nrE LfX;  T+ӄSA`+Hjȑ I@.*LT1@A~yM]/$yaYFdAߔ!A "] Ʃ#">ŮV 'RE~}EY \0e8sx[لoΝ;Ǵ:C?#E@8ر@$$]XRڱ /Հm~⪋ `9)"*/>  $!q0۶nCCC VuA~v#஁igL'هhbcNXj O/ AA0dPںդ !9pY ̀-&(%cG [73)ٳg+6yzV0}YXiٮY#CSZ_ M4"$ic&BAZwJ%0]GBz|'(8x C`sA7a'p(XQ+@(\~wo`4i(FP88kR' ( @ ~sic's 2m%w4߃:y[`Fq؊qb%m`N:ji#lOa|rk Dt06]şxhK'&,.\(o9V"d'%h軳^} l n%dǖRuR=g"h8\yju`@t J¥ d4$33(fsppƠc^7I\0"f@cao~g {e- sl %HTe.|< Dji59Av{-]@5s +~=/r=A|)hf`DT&Z[[;,7;qS=4ic %0f 1a?>O@3dPW 07qXĖa؛̱1Pt\Ph![AHj u#LHYV̙c0<򿠵M^Ыzb GdYƀ`bR l}0f J8nAMF6'nC&( 0#0w c+I 2 }/D&. "B ЂeCiYr t"c()L a1QVpOQb x?ônAB#``Yj ZmD@IVیJ-5! g P0PLtattGf.@0[2ν0UOkXdZ9FE[lt zio{S0@"K0VSU[ře1v= Uhki\sD̜y ahd@e%@a dꂎ7}#,!W)iUL1J(#a.A)l0:_&|N=,!I4-ImN[`Zvp0Pm?KI9FtՖ|D= &*b+{ay?Di]ZLw2E`h6pdͤI[@ {1l;@(B(.At(L=KPRc8Qڋ0{)'b4̠-0 EE~mm4iW^GƱt#YpP+cb~?^E켜#,e Z.h MZm1,!fa?Z|eNY TK#r,&"eݷӉl`׼LݗǢ4ilN :cl蔠XAbG`طl_ Ն~]  ++NDC[>HVeoF'F+/M!0a;3 :gf2kNB#8n,c m4i4 %x N.A !c~<{ϰw`ȊE2hyalBj $p Xm"'#P1. ՟4LcJAVW :z#1)iR (S1Nst4Bw@o S2 m,n@t.l-6{~ L3@-Ga]|=0=#ֹkO{Ѿ'`*%HrbEN(V<;VDg<jN?0:!-# v| jt&Kvs` N-}M +^@=`Lu(MZ%AA1@28Lukp 瞿gh (s%1g:Ѳ] o&m]4 .v .<@5V<lVU]IgΫnҊV1+<O~ZE8UKAC^U < 0h2d0`1k'i "F0hA?,ybwY^>U"(Gmeq.VVݙI (Y@lnj/o_6ߘ,+FZ hvM}[Ao= H[?Q]{1h}'`Hh UX<øEp̱~ Ҥ EF ? OK[H][[V`;xNHV AVk\ ]̣O݃4""K`]%+F+D-B%m/MZUɰiI1Q DȵX j D0^i-& q-̉]b'[y H+,^ f R>Yw%7+ٓ0[Ejߴ80IAt cKu1&VI0Vr!-x.LjH+# 5Ū* N~5heXAÄ!@@I8F]ukx*+frEںAD(Y&0RX4ɰOc%Xh^jI[k acpA{&NG@74˕!ҤI (aH@@)i?|u)́ XTfB/ηIm4 4 ;ǻc&*I#H$xG}}+077'ie4V$ ]+F,  e $bɾҊ082d%q+!D9sPl&&= 7vLfK,,,u:Ay"d@A-p 4^1iIQzr?=<+2ŊL7Yp{)(hc$}+tTo)HcVBevczMFԙc0߆͛:w]xհ=?W;.ݥm+K75͈,AUsYF]z n)F-N(؅e>4'%ѹVt O[yC=B$^V3Oi1%dS*0!0E z@ UUwwwdllLQ˲ގkM@] *ye".zc UWctx:5>hF/=c $ed|`/tl1zm';TЊ/REr&SS!3vidLd(BF`P Pi-Z/ >### &{:>4Pf R`^pŞt_XXW_7_iqՅ[sQ : s?W?Ņ~32'7)?1Qp10t5"G0Mzzʶ0v _]SgGA߅NТ@~|l\z_pFL'sPMO9fy  :ũF9_4y"j>p-& feN ePܟuqx6JRIYIKLw@Dg?7 EE􉾧gOD{ՊLXl jH,.. x>XNFiELXj"V(:?/,V >T(j_\ϵOG2h'>Ajfx, Lk]pXdnBьLE]l'{awlU$d/X2] ?ѓ-$ @7=h4 -x)L5Zdeq3Tz],D®_nZG.6ó(@lތ` k p7V1;evvՃ-lS3-XH0J2%J.OAm $0gsN>wWiٳ^ 7cu3 s34BFEÑ<14:?Q#r? \{A{`yw%v.Uw "z 0仠kSgh 333HcH?O?5??/w (ZO]xknj@$ T'ҟIP[_pW=  CAHh 4/[ C?07:: 绻AsK7r@Anq+b^1-2?r3qM WA/Y` >m_A;px 235fMAq 0Lp\~mxC nF\E YRYW4N,5FL-?ׄ; X4n/K7襺1gdþJ]-L&?6@&#͝d%===q jys]7OƮp%Rnf,p7YDmLWtښ!fPQ@A`|_In .zmZrf D . 26I XMNN"T{վ ]7룕f$S95H?(07|mo#(]ݎK 8.g5 O :ڛئV6  a/{ڸ{.iR@Ae}k|B^u 4  bQ6A/Ut;`'E \[iMa >MW[^BV___T]ue|i$Tdf{_UݔV4kj7E^|,@Fzz=m7V H |\eVݣ_Qիcgξz^g-Vlq4MtTkx@ Hm| گ@2P | >.qQmhqnaH`]ͱVtˌ-3VF0\$*DHu׃$bI 4)P8GX!T3{r}~euCj"F"1#VK @Z΢.'H)H$øGZ U~Uwz({p$XJ{aք@clqjԜH >i@Bd6ڛv ^w⎺ɰ [g6Fj $H-T'9^)M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤIMUj:IENDB`./plugins/splash/splash.xml.in0000644000004100000410000000523613246301623016645 0ustar www-datawww-data <_short>Splash <_long>A simple splash plugin Extras opengl composite opengl imgsvg imgpng imgjpeg decor <_short>Main <_short>Images <_short>Appearance ./plugins/inotify/0000755000004100000410000000000013246301624014406 5ustar www-datawww-data./plugins/inotify/CMakeLists.txt0000644000004100000410000000027113246301623017145 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include (CheckIncludeFile) check_include_file ("sys/inotify.h" HAS_INOTIFY) if (HAS_INOTIFY) compiz_plugin(inotify) endif ()./plugins/inotify/inotify.xml.in0000644000004100000410000000054013246301623017214 0ustar www-datawww-data <_short>File Watcher <_long>File change notification plugin Utility composite opengl decor ./plugins/inotify/src/0000755000004100000410000000000013246301624015175 5ustar www-datawww-data./plugins/inotify/src/inotify.h0000644000004100000410000000372413246301623017034 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef COMPIZ_INOTIFY_H #define COMPIZ_INOTIFY_H #include #include #include class InotifyScreen : public ScreenInterface, public PluginClassHandler { public: InotifyScreen (CompScreen *screen); ~InotifyScreen (); void fileWatchAdded (CompFileWatch *fileWatch); void fileWatchRemoved (CompFileWatch *fileWatch); private: typedef struct { CompFileWatchHandle handle; int wd; } InotifyWatch; typedef std::list WatchList; void processEvents (); WatchList watches; int fd; CompWatchFdHandle fdHandle; }; class InotifyPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #endif ./plugins/inotify/src/inotify.cpp0000644000004100000410000001040613246301623017362 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "inotify.h" #include #include #include #include COMPIZ_PLUGIN_20090315 (inotify, InotifyPluginVTable) InotifyScreen::InotifyScreen (CompScreen *screen) : PluginClassHandler (screen) { fd = inotify_init (); fdHandle = screen->addWatchFd (fd, POLLIN | POLLPRI | POLLHUP | POLLERR, boost::bind (&InotifyScreen::processEvents, this)); ScreenInterface::setHandler (screen, true); const CompFileWatchList &watchList = screen->getFileWatches (); CompFileWatchList::const_iterator iter; for (iter = watchList.begin (); iter != watchList.end (); ++iter) fileWatchAdded (*iter); } InotifyScreen::~InotifyScreen () { const CompFileWatchList &watchList = screen->getFileWatches (); CompFileWatchList::const_iterator iter; for (iter = watchList.begin (); iter != watchList.end (); ++iter) fileWatchRemoved (*iter); screen->removeWatchFd (fdHandle); close (fd); } void InotifyScreen::processEvents () { char buf[256 * (sizeof (struct inotify_event) + 16)]; int len; len = read (fd, buf, sizeof (buf)); if (len < 0) { perror ("read"); } else { struct inotify_event *event; int i = 0; WatchList::iterator iter; const CompFileWatchList &list = screen->getFileWatches (); CompFileWatchList::const_iterator wIter; while (i < len) { event = (struct inotify_event *) &buf[i]; for (iter = watches.begin (); iter != watches.end (); ++iter) if ((*iter).wd == event->wd) break; if (iter != watches.end ()) { for (wIter = list.begin (); wIter != list.end (); ++wIter) if ((*iter).handle == (*wIter)->handle) break; if (wIter != list.end ()) { const char *name = (event->len) ? event->name : NULL; (*wIter)->callBack (name); } } i += sizeof (*event) + event->len; } } } static unsigned int inotifyMask (CompFileWatch *watch) { unsigned int mask = 0; if (watch->mask & NOTIFY_CREATE_MASK) mask |= IN_CREATE; if (watch->mask & NOTIFY_DELETE_MASK) mask |= IN_DELETE; if (watch->mask & NOTIFY_MOVE_MASK) mask |= IN_MOVE; if (watch->mask & NOTIFY_MODIFY_MASK) mask |= IN_MODIFY; return mask; } void InotifyScreen::fileWatchAdded (CompFileWatch *fileWatch) { InotifyWatch iw; iw.handle = fileWatch->handle; iw.wd = inotify_add_watch (fd, fileWatch->path.c_str (), inotifyMask (fileWatch)); if (iw.wd < 0) { perror ("inotify_add_watch"); return; } watches.push_back (iw); } void InotifyScreen::fileWatchRemoved (CompFileWatch *fileWatch) { WatchList::iterator iter; for (iter = watches.begin (); iter != watches.end (); ++iter) { if ((*iter).handle == fileWatch->handle) { if (inotify_rm_watch (fd, (*iter).wd)) perror ("inotify_rm_watch"); watches.erase (iter); break; } } } bool InotifyPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/annotate/0000755000004100000410000000000013246301624014536 5ustar www-datawww-data./plugins/annotate/CMakeLists.txt0000644000004100000410000000023013246301623017270 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(annotate PLUGINDEPS composite opengl PKGDEPS pangocairo cairo cairo-xlib-xrender) ./plugins/annotate/src/0000755000004100000410000000000013246301624015325 5ustar www-datawww-data./plugins/annotate/src/annotate.cpp0000644000004100000410000006715113246301623017653 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "annotate.h" COMPIZ_PLUGIN_20090315 (annotate, AnnoPluginVTable) #define DEG2RAD (M_PI / 180.0f) void AnnoScreen::cairoClear (cairo_t *cr) { cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); content = false; } cairo_t * AnnoScreen::cairoContext () { if (!cairo) { XRenderPictFormat *format; Screen *xScreen; xScreen = ScreenOfDisplay (screen->dpy (), screen->screenNum ()); int w = screen->width (); int h = screen->height (); format = XRenderFindStandardFormat (screen->dpy (), PictStandardARGB32); pixmap = XCreatePixmap (screen->dpy (), screen->root (), w, h, 32); texture = GLTexture::bindPixmapToTexture (pixmap, w, h, 32); if (texture.empty ()) { compLogMessage ("annotate", CompLogLevelError, "Couldn't bind pixmap 0x%x to texture", (int) pixmap); XFreePixmap (screen->dpy (), pixmap); return NULL; } damage = XDamageCreate (screen->dpy (), pixmap, XDamageReportBoundingBox); surface = cairo_xlib_surface_create_with_xrender_format (screen->dpy (), pixmap, xScreen, format, w, h); cairo = cairo_create (surface); if (cairoBuffer.size ()) { cairo_t *cr = cairo_create (surface); int stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, w); cairo_surface_t *raw_source = cairo_image_surface_create_for_data ((unsigned char *) cairoBuffer.c_str (), CAIRO_FORMAT_ARGB32, w, h, stride); if (cr && raw_source) { cairo_set_source_surface (cr, raw_source, 0, 0); cairo_paint (cr); cairo_surface_destroy (raw_source); cairo_destroy (cr); cairoBuffer.clear (); } } else cairoClear (cairo); } return cairo; } void AnnoScreen::setSourceColor (cairo_t *cr, unsigned short *color) { cairo_set_source_rgba (cr, (double) color[0] / 0xffff, (double) color[1] / 0xffff, (double) color[2] / 0xffff, (double) color[3] / 0xffff); } void AnnoScreen::drawEllipse (double xc, double yc, double radiusX, double radiusY, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth) { cairo_t *cr = cairoContext (); if (cr) { setSourceColor (cr, fillColor); cairo_save (cr); cairo_translate (cr, xc, yc); if (radiusX > radiusY) { cairo_scale (cr, 1.0, radiusY/radiusX); cairo_arc (cr, 0, 0, radiusX, 0, 2 * M_PI); } else { cairo_scale (cr, radiusX/radiusY, 1.0); cairo_arc (cr, 0, 0, radiusY, 0, 2 * M_PI); } cairo_restore (cr); cairo_fill_preserve (cr); cairo_set_line_width (cr, strokeWidth); setSourceColor (cr, strokeColor); cairo_stroke (cr); content = true; } } void AnnoScreen::drawRectangle (double x, double y, double w, double h, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth) { cairo_t *cr = cairoContext (); if (cr) { double ex1, ey1, ex2, ey2; setSourceColor (cr, fillColor); cairo_rectangle (cr, x, y, w, h); cairo_fill_preserve (cr); cairo_set_line_width (cr, strokeWidth); cairo_stroke_extents (cr, &ex1, &ey1, &ex2, &ey2); setSourceColor (cr, strokeColor); cairo_stroke (cr); content = true; } } void AnnoScreen::drawLine (double x1, double y1, double x2, double y2, double width, unsigned short *color) { cairo_t *cr = cairoContext (); if (cr) { double ex1, ey1, ex2, ey2; cairo_set_line_width (cr, width); cairo_move_to (cr, x1, y1); cairo_line_to (cr, x2, y2); cairo_stroke_extents (cr, &ex1, &ey1, &ex2, &ey2); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); setSourceColor (cr, color); cairo_stroke (cr); content = true; } } void AnnoScreen::drawText (double x, double y, const char *text, const char *fontFamily, double fontSize, cairo_font_slant_t fontSlant, cairo_font_weight_t fontWeight, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth) { REGION reg; cairo_t *cr = cairoContext (); if (cr) { cairo_text_extents_t extents; cairo_set_line_width (cr, strokeWidth); setSourceColor (cr, fillColor); cairo_select_font_face (cr, fontFamily, fontSlant, fontWeight); cairo_set_font_size (cr, fontSize); cairo_text_extents (cr, text, &extents); cairo_save (cr); cairo_move_to (cr, x, y); cairo_text_path (cr, text); cairo_fill_preserve (cr); setSourceColor (cr, strokeColor); cairo_stroke (cr); cairo_restore (cr); reg.rects = ®.extents; reg.numRects = 1; reg.extents.x1 = x; reg.extents.y1 = y + extents.y_bearing - 2.0; reg.extents.x2 = x + extents.width + 20.0; reg.extents.y2 = y + extents.height; content = true; } } /* DBUS Interface (TODO: plugin interface) */ /* Here, you can use DBUS or any other plugin via the action system to draw on * the screen using cairo. Parameters are as follows: * "tool": ["rectangle", "circle", "line", "text"] default: "line" * - This allows you to select what you want to draw * Tool-specific parameters: * - * "circle" * - * - "xc" float, default: 0 - X Center * - * - "yc" float, default: 0 - Y Center * - * - "radius" float, default: 0 - Radius * - * "rectangle" * - * - "x" float, default: 0 - X Point * - * - "y" float, default: 0 - Y Point * - * - "width" float, default: 0 - Width * - * - "height" float, default: 0 - Height * - * "line" * - * - "x1" float, default: 0 - X Point 1 * - * - "y1" float, default: 0 - Y Point 1 * - * - "x2" float, default: 0 - X Point 2 * - * - "y2" float, default: 0 - Y Point 2 * - * "text" * - * - "slant" string, default: "" - ["oblique", "italic", ""] - Text Slant * - * - "weight" string, default: " - ["bold", ""] - Text Weight * - * - "text" string, default: "" - Any Character - The text to display * - * - "family" float, default: "Sans" - The font family * - * - "size" float, default: 36.0 - Font Size * - * - "x" float, default: 0 - X Point * - * - "u" float, default: 0 - Y Point * Other parameters are: * - * - "fill_color" float, default: 0 - Drawing Fill Color * - * - "stroke_color" float, default: 0 - Drawing Border Color * - * - "line_width" float, default: 0 - Drawing Width * - * - "stroke_width" float, default: 0 - Drawing Height * - * - All of these are taken from the builtin options if not provided */ bool AnnoScreen::draw (CompAction *action, CompAction::State state, CompOption::Vector &options) { cairo_t *cr = cairoContext (); if (cr) { const char *tool; unsigned short *fillColor, *strokeColor; tool = CompOption::getStringOptionNamed (options, "tool", "line").c_str (); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); fillColor = optionGetFillColor (); fillColor = CompOption::getColorOptionNamed (options, "fill_color", fillColor); strokeColor = optionGetStrokeColor (); strokeColor = CompOption::getColorOptionNamed (options, "stroke_color", strokeColor); double strokeWidth = optionGetStrokeWidth (); strokeWidth = CompOption::getFloatOptionNamed (options, "stroke_width", strokeWidth); if (strcasecmp (tool, "rectangle") == 0) { double x = CompOption::getFloatOptionNamed (options, "x", 0); double y = CompOption::getFloatOptionNamed (options, "y", 0); double w = CompOption::getFloatOptionNamed (options, "w", 100); double h = CompOption::getFloatOptionNamed (options, "h", 100); drawRectangle (x, y, w, h, fillColor, strokeColor, strokeWidth); } else if (strcasecmp (tool, "ellipse") == 0) { double xc = CompOption::getFloatOptionNamed (options, "xc", 0); double yc = CompOption::getFloatOptionNamed (options, "yc", 0); double xr = CompOption::getFloatOptionNamed (options, "radiusX", 100); double yr = CompOption::getFloatOptionNamed (options, "radiusY", 100); drawEllipse (xc, yc, xr, yr, fillColor, strokeColor, strokeWidth); } else if (strcasecmp (tool, "line") == 0) { double x1 = CompOption::getFloatOptionNamed (options, "x1", 0); double y1 = CompOption::getFloatOptionNamed (options, "y1", 0); double x2 = CompOption::getFloatOptionNamed (options, "x2", 100); double y2 = CompOption::getFloatOptionNamed (options, "y2", 100); drawLine (x1, y1, x2, y2, strokeWidth, fillColor); } else if (strcasecmp (tool, "text") == 0) { const char *text, *family; cairo_font_slant_t slant; cairo_font_weight_t weight; const char *str; str = CompOption::getStringOptionNamed (options, "slant", "").c_str (); if (strcasecmp (str, "oblique") == 0) slant = CAIRO_FONT_SLANT_OBLIQUE; else if (strcasecmp (str, "italic") == 0) slant = CAIRO_FONT_SLANT_ITALIC; else slant = CAIRO_FONT_SLANT_NORMAL; str = CompOption::getStringOptionNamed (options, "weight", "").c_str (); if (strcasecmp (str, "bold") == 0) weight = CAIRO_FONT_WEIGHT_BOLD; else weight = CAIRO_FONT_WEIGHT_NORMAL; double x = CompOption::getFloatOptionNamed (options, "x", 0); double y = CompOption::getFloatOptionNamed (options, "y", 0); text = CompOption::getStringOptionNamed (options, "text", "").c_str (); family = CompOption::getStringOptionNamed (options, "family", "Sans").c_str (); double size = CompOption::getFloatOptionNamed (options, "size", 36.0); drawText (x, y, text, family, size, slant, weight, fillColor, strokeColor, strokeWidth); } } return true; } bool AnnoScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector& options) { if (grabIndex) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); switch (drawMode) { case LineMode: drawLine (initialPointerX, initialPointerY, lineVector.x (), lineVector.y (), optionGetStrokeWidth (), optionGetStrokeColor ()); break; case RectangleMode: drawRectangle (rectangle.x (), rectangle.y (), rectangle.width (), rectangle.height (), optionGetFillColor (), optionGetStrokeColor (), optionGetStrokeWidth ()); break; case EllipseMode: drawEllipse (ellipse.center.x (), ellipse.center.y (), ellipse.radiusX, ellipse.radiusY, optionGetFillColor (), optionGetStrokeColor (), optionGetStrokeWidth ()); break; default: break; } drawMode = NoMode; return false; } bool AnnoScreen::initiateErase (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); annoLastPointerX = pointerX; annoLastPointerY = pointerY; drawMode = EraseMode; screen->handleEventSetEnabled (this, true); return false; } bool AnnoScreen::initiateFreeDraw (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); annoLastPointerX = pointerX; annoLastPointerY = pointerY; drawMode = FreeDrawMode; screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::initiateLine (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); initialPointerX = pointerX; initialPointerY = pointerY; drawMode = LineMode; screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::initiateRectangle (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); drawMode = RectangleMode; initialPointerX = pointerX; initialPointerY = pointerY; rectangle.setGeometry (initialPointerX, initialPointerY, 0, 0); lastRect = rectangle; screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::initiateEllipse (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "annotate"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); drawMode = EllipseMode; initialPointerX = pointerX; initialPointerY = pointerY; ellipse.radiusX = 0; ellipse.radiusY = 0; lastRect.setGeometry (initialPointerX, initialPointerY, 0, 0); screen->handleEventSetEnabled (this, true); return true; } bool AnnoScreen::clear (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (content) { cairo_t *cr = cairoContext (); if (cr) cairoClear (cairo); cScreen->damageScreen (); /* We don't need to refresh the screen or handle events anymore */ screen->handleEventSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } return true; } bool AnnoScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (status) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[18]; GLfloat textureData[12]; CompRect rect; GLMatrix sTransform = transform; int numRect; int pos = 0; int angle; float offset = optionGetStrokeWidth () / 2; /* This replaced prepareXCoords (s, output, -DEFAULT_Z_CAMERA) */ sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); if (content && !region.isEmpty ()) { foreach (GLTexture *tex, texture) { CompRect::vector rect = region.rects (); numRect = region.rects ().size (); tex->enable (GLTexture::Fast); streamingBuffer->begin (GL_TRIANGLES); while (numRect--) { GLfloat tx1 = COMP_TEX_COORD_X (tex->matrix (), rect.at (pos).x1 ()); GLfloat tx2 = COMP_TEX_COORD_X (tex->matrix (), rect.at (pos).x2 ()); GLfloat ty1 = COMP_TEX_COORD_Y (tex->matrix (), rect.at (pos).y1 ()); GLfloat ty2 = COMP_TEX_COORD_Y (tex->matrix (), rect.at (pos).y2 ()); vertexData[0] = rect.at (pos).x1 (); vertexData[1] = rect.at (pos).y1 (); vertexData[2] = 0.0f; vertexData[3] = rect.at (pos).x1 (); vertexData[4] = rect.at (pos).y2 (); vertexData[5] = 0.0f; vertexData[6] = rect.at (pos).x2 (); vertexData[7] = rect.at (pos).y1 (); vertexData[8] = 0.0f; vertexData[9] = rect.at (pos).x1 (); vertexData[10] = rect.at (pos).y2 (); vertexData[11] = 0.0f; vertexData[12] = rect.at (pos).x2 (); vertexData[13] = rect.at (pos).y2 (); vertexData[14] = 0.0f; vertexData[15] = rect.at (pos).x2 (); vertexData[16] = rect.at (pos).y1 (); vertexData[17] = 0.0f; textureData[0] = tx1; textureData[1] = ty1; textureData[2] = tx1; textureData[3] = ty2; textureData[4] = tx2; textureData[5] = ty1; textureData[6] = tx1; textureData[7] = ty2; textureData[8] = tx2; textureData[9] = ty2; textureData[10] = tx2; textureData[11] = ty1; streamingBuffer->addVertices (6, vertexData); streamingBuffer->addTexCoords (0, 6, textureData); ++pos; } streamingBuffer->end (); streamingBuffer->render (sTransform); tex->disable (); } } switch (drawMode) { case LineMode: glLineWidth (optionGetStrokeWidth ()); streamingBuffer->begin (GL_LINES); streamingBuffer->addColors (1, optionGetStrokeColor ()); vertexData[0] = initialPointerX; vertexData[1] = initialPointerY; vertexData[2] = 0.0f; vertexData[3] = lineVector.x (); vertexData[4] = lineVector.y (); vertexData[5] = 0.0f; streamingBuffer->addVertices (2, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); break; case RectangleMode: vertexData[0] = rectangle.x1 (); vertexData[1] = rectangle.y1 (); vertexData[2] = 0.0f; vertexData[3] = rectangle.x1 (); vertexData[4] = rectangle.y2 (); vertexData[5] = 0.0f; vertexData[6] = rectangle.x2 (); vertexData[7] = rectangle.y1 (); vertexData[8] = 0.0f; vertexData[9] = rectangle.x2 (); vertexData[10] = rectangle.y2 (); vertexData[11] = 0.0f; /* fill rectangle */ streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, optionGetFillColor ()); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* draw rectangle outline */ vertexData[0] = rectangle.x1 (); vertexData[1] = rectangle.y1 (); vertexData[2] = 0.0f; vertexData[3] = rectangle.x2 (); vertexData[4] = rectangle.y1 (); vertexData[5] = 0.0f; vertexData[6] = rectangle.x2 (); vertexData[7] = rectangle.y2 (); vertexData[8] = 0.0f; vertexData[9] = rectangle.x1 (); vertexData[10] = rectangle.y2 (); vertexData[11] = 0.0f; glLineWidth (optionGetStrokeWidth ()); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, optionGetStrokeColor ()); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); break; case EllipseMode: /* fill ellipse */ streamingBuffer->begin (GL_TRIANGLE_FAN); streamingBuffer->addColors (1, optionGetFillColor ()); vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y (); vertexData[2] = 0.0f; streamingBuffer->addVertices (1, vertexData); for (angle = 0; angle <= 360; angle += 1) { vertexData[0] = ellipse.center.x () + (ellipse.radiusX * sinf (angle * DEG2RAD)); vertexData[1] = ellipse.center.y () + (ellipse.radiusY * cosf (angle * DEG2RAD)); streamingBuffer->addVertices (1, vertexData); } vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y () + ellipse.radiusY; streamingBuffer->addVertices (1, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* draw ellipse outline */ glLineWidth (optionGetStrokeWidth ()); streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, optionGetStrokeColor ()); vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y () + ellipse.radiusY - offset; vertexData[2] = 0.0f; streamingBuffer->addVertices (1, vertexData); for (angle = 360; angle >= 0; angle -= 1) { vertexData[0] = ellipse.center.x () + ((ellipse.radiusX - offset) * sinf (angle * DEG2RAD)); vertexData[1] = ellipse.center.y () + ((ellipse.radiusY - offset) * cosf (angle * DEG2RAD)); vertexData[2] = 0.0f; vertexData[3] = ellipse.center.x () + ((ellipse.radiusX + offset) * sinf (angle * DEG2RAD)); vertexData[4] = ellipse.center.y () + ((ellipse.radiusY + offset) * cosf (angle * DEG2RAD)); vertexData[5] = 0.0f; streamingBuffer->addVertices (2, vertexData); } vertexData[0] = ellipse.center.x (); vertexData[1] = ellipse.center.y () + ellipse.radiusY + offset; streamingBuffer->addVertices (1, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); break; default: break; } glDisable (GL_BLEND); } return status; } void AnnoScreen::handleMotionEvent (int xRoot, int yRoot) { CompRect damageRect; if (grabIndex) { static unsigned short clearColor[] = { 0, 0, 0, 0 }; switch (drawMode) { case EraseMode: drawLine (annoLastPointerX, annoLastPointerY, xRoot, yRoot, optionGetEraseWidth (), clearColor); break; case FreeDrawMode: drawLine (annoLastPointerX, annoLastPointerY, xRoot, yRoot, optionGetStrokeWidth (), optionGetStrokeColor ()); break; case LineMode: lineVector.setX (xRoot); lineVector.setY (yRoot); damageRect.setGeometry (MIN(initialPointerX, lineVector.x ()), MIN(initialPointerY, lineVector.y ()), abs (lineVector.x () - initialPointerX), abs (lineVector.y () - initialPointerY)); break; case RectangleMode: if (optionGetDrawShapesFromCenter ()) rectangle.setGeometry (initialPointerX - abs (xRoot - initialPointerX), initialPointerY - abs (yRoot - initialPointerY), (abs (xRoot - initialPointerX)) * 2, (abs (yRoot - initialPointerY)) * 2); else rectangle.setGeometry (MIN(initialPointerX, xRoot), MIN(initialPointerY, yRoot), abs (xRoot - initialPointerX), abs (yRoot - initialPointerY)); damageRect = rectangle; break; case EllipseMode: if (optionGetDrawShapesFromCenter ()) { ellipse.center.setX (initialPointerX); ellipse.center.setY (initialPointerY); } else { ellipse.center.setX (initialPointerX + (xRoot - initialPointerX) / 2); ellipse.center.setY (initialPointerY + (yRoot - initialPointerY) / 2); } ellipse.radiusX = abs (xRoot - ellipse.center.x ()); ellipse.radiusY = abs (yRoot - ellipse.center.y ()); damageRect = CompRect (ellipse.center.x () - ellipse.radiusX, ellipse.center.y () - ellipse.radiusY, ellipse.radiusX * 2, ellipse.radiusY * 2); break; default: break; } if (cScreen && (drawMode == LineMode || drawMode == RectangleMode || drawMode == EllipseMode)) { /* Add border width to the damage region */ damageRect.setGeometry (damageRect.x () - (optionGetStrokeWidth () / 2), damageRect.y () - (optionGetStrokeWidth () / 2), damageRect.width () + optionGetStrokeWidth () + 1, damageRect.height () + optionGetStrokeWidth () + 1); cScreen->damageRegion (damageRect); cScreen->damageRegion (lastRect); lastRect = damageRect; } annoLastPointerX = xRoot; annoLastPointerY = yRoot; gScreen->glPaintOutputSetEnabled (this, true); } } void AnnoScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: case EnterNotify: case LeaveNotify: handleMotionEvent (pointerX, pointerY); break; default: if (event->type == cScreen->damageEvent () + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; if (pixmap == de->drawable) cScreen->damageRegion (CompRegion (CompRect (de->area))); } break; } screen->handleEvent (event); } AnnoScreen::AnnoScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabIndex (0), pixmap (None), surface (NULL), cairo (NULL), content (false), damage (None) { ScreenInterface::setHandler (screen, false); GLScreenInterface::setHandler (gScreen, false); optionSetDrawInitiate (boost::bind (&AnnoScreen::draw, this, _1, _2, _3)); optionSetEraseButtonInitiate (boost::bind (&AnnoScreen::initiateErase, this, _1, _2, _3)); optionSetEraseButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateFreeDrawButtonInitiate (boost::bind (&AnnoScreen::initiateFreeDraw, this, _1, _2, _3)); optionSetInitiateFreeDrawButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateLineButtonInitiate (boost::bind (&AnnoScreen::initiateLine, this, _1, _2, _3)); optionSetInitiateLineButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateRectangleButtonInitiate (boost::bind (&AnnoScreen::initiateRectangle, this, _1, _2, _3)); optionSetInitiateRectangleButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetInitiateEllipseButtonInitiate (boost::bind (&AnnoScreen::initiateEllipse, this, _1, _2, _3)); optionSetInitiateEllipseButtonTerminate (boost::bind (&AnnoScreen::terminate, this, _1, _2, _3)); optionSetClearButtonInitiate (boost::bind (&AnnoScreen::clear, this, _1, _2, _3)); optionSetClearKeyInitiate (boost::bind (&AnnoScreen::clear, this, _1, _2, _3)); drawMode = NoMode; } AnnoScreen::~AnnoScreen () { if (cairo) cairo_destroy (cairo); if (surface) cairo_surface_destroy (surface); if (pixmap) XFreePixmap (screen->dpy (), pixmap); if (damage) XDamageDestroy (screen->dpy (), damage); } bool AnnoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/annotate/src/annotate.h0000644000004100000410000001157513246301623017317 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "annotate_options.h" #include #include #include #include static int annoLastPointerX = 0; static int annoLastPointerY = 0; static int initialPointerX = 0; static int initialPointerY = 0; typedef struct _Ellipse { CompPoint center; int radiusX; int radiusY; } Ellipse; enum DrawMode { NoMode = 0, EraseMode, FreeDrawMode, LineMode, RectangleMode, EllipseMode, TextMode }; class AnnoScreen : public PluginClassHandler , public ScreenInterface, public GLScreenInterface, public AnnotateOptions { public: AnnoScreen (CompScreen *screen); ~AnnoScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle grabIndex; Pixmap pixmap; GLTexture::List texture; cairo_surface_t *surface; cairo_t *cairo; CompString cairoBuffer; // used for serialization bool content; Damage damage; CompRect rectangle; CompRect lastRect; DrawMode drawMode; CompPoint lineVector; Ellipse ellipse; void handleEvent (XEvent *); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void cairoClear (cairo_t *cr); cairo_t * cairoContext (); void setSourceColor (cairo_t *cr, unsigned short *color); void drawLine (double x1, double y1, double x2, double y2, double width, unsigned short *color); void drawRectangle (double x, double y, double w, double h, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth); void drawEllipse (double xc, double yc, double radiusX, double radiusY, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth); void drawText (double x, double y, const char *text, const char *fontFamily, double fontSize, cairo_font_slant_t fontSlant, cairo_font_weight_t fontWeight, unsigned short *fillColor, unsigned short *strokeColor, double strokeWidth); /* Actions */ bool draw (CompAction *action, CompAction::State state, CompOption::Vector& options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateErase (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateFreeDraw (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateLine (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateRectangle (CompAction *action, CompAction::State state, CompOption::Vector& options); bool initiateEllipse (CompAction *action, CompAction::State state, CompOption::Vector& options); bool clear (CompAction *action, CompAction::State state, CompOption::Vector& options); void handleMotionEvent (int xRoot, int yRoot); }; #define ANNO_SCREEN(s) \ AnnoScreen *as = get (s); class AnnoPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/annotate/annotate.xml.in0000644000004100000410000000552013246301623017477 0ustar www-datawww-data <_short>Annotate <_long>Annotate plugin Extras decor opengl ./plugins/kde/0000755000004100000410000000000013246301624013470 5ustar www-datawww-data./plugins/kde/CMakeLists.txt0000644000004100000410000000123013246301623016223 0ustar www-datawww-datafind_package (Compiz REQUIRED) find_package (KDE4 4.2) include (CompizPlugin) if (KDE4_FOUND) include(KDE4Defaults) include(MacroLibrary) string (REGEX REPLACE "-fvisibility=hidden" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) string (REGEX REPLACE "-fno-exceptions" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) string (REGEX REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) QT4_AUTOMOC (src/dispatcher.cpp) compiz_plugin (kde LIBRARIES ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} LIBDIRS ${KDE4_LIB_DIR} INCDIRS ${KDE4_INCLUDES} ) endif () ./plugins/kde/src/0000755000004100000410000000000013246301624014257 5ustar www-datawww-data./plugins/kde/src/dispatcher.h0000644000004100000410000000421513246301623016557 0ustar www-datawww-data/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef DISPATCHER_H_ #define DISPATCHER_H_ #include #include #include #include class TimerObject; class SocketObject; class EventDispatcherCompiz : public QAbstractEventDispatcher { Q_OBJECT public: EventDispatcherCompiz (QObject *parent = 0); virtual ~EventDispatcherCompiz (); virtual void flush (); virtual bool hasPendingEvents (); virtual void interrupt (); virtual bool processEvents (QEventLoop::ProcessEventsFlags flags); virtual void registerSocketNotifier (QSocketNotifier *notifier); virtual void registerTimer (int timerId, int interval, QObject *object); virtual QList registeredTimers (QObject *object) const; virtual void unregisterSocketNotifier (QSocketNotifier *notifier); virtual bool unregisterTimer (int timerId); virtual bool unregisterTimers (QObject *object); virtual void wakeUp (); void startingUp (); void closingDown (); private: void wakeUpEvent (); private: QList mTimers; QList mSockets; QList mDeleteTimers; QList mDeleteSockets; CompWatchFdHandle mX11Handle; CompWatchFdHandle mWakeUpHandle; QList mQueuedEvents; int mWakeUpPipe[2]; CompTimer mEventTimer; }; #endif ./plugins/kde/src/kde.h0000644000004100000410000000253613246301623015200 0ustar www-datawww-data/* * Copyright (c) 2009 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef KDE_H_ #define KDE_H_ #include "dispatcher.h" #include #include #include #include class KdeScreen : public PluginClassHandler { public: KdeScreen (CompScreen *); virtual ~KdeScreen (); void sendGlibNotify (); private: KApplication *mApp; EventDispatcherCompiz *mEventDispatcher; char *argv[1]; int argc; }; class KdePluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #endif ./plugins/kde/src/socket.cpp0000644000004100000410000000321113246301623016247 0ustar www-datawww-data/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "socket.h" #include #include #include #include SocketObject::SocketObject (QSocketNotifier *notifier) : mNotifier (notifier) { short int mask; switch (notifier->type()) { case QSocketNotifier::Read: mask = POLLIN | POLLPRI | POLLHUP | POLLERR; break; case QSocketNotifier::Write: mask = POLLOUT; break; case QSocketNotifier::Exception: mask = 0; break; default: return; } mHandle = screen->addWatchFd (notifier->socket (), mask, boost::bind (&SocketObject::callback, this)); } SocketObject::~SocketObject () { screen->removeWatchFd (mHandle); } QSocketNotifier * SocketObject::notifier () const { return mNotifier; } void SocketObject::callback () { QEvent event(QEvent::SockAct); QApplication::sendEvent(mNotifier, &event); } ./plugins/kde/src/dispatcher.cpp0000644000004100000410000001311613246301623017112 0ustar www-datawww-data/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "dispatcher.h" #include "timer.h" #include "socket.h" #include #include #include "dispatcher.moc" EventDispatcherCompiz::EventDispatcherCompiz (QObject *) { mWakeUpPipe[0] = 0; mWakeUpPipe[1] = 0; mEventTimer.start (boost::bind (&EventDispatcherCompiz::processEvents, this, QEventLoop::AllEvents), 1, MAXSHORT); } EventDispatcherCompiz::~EventDispatcherCompiz () { foreach (TimerObject *timer, mTimers) delete timer; foreach (SocketObject *socket, mSockets) delete socket; } void EventDispatcherCompiz::flush () { XFlush (QX11Info::display()); } bool EventDispatcherCompiz::hasPendingEvents () { extern Q_CORE_EXPORT uint qGlobalPostedEventsCount(); return qGlobalPostedEventsCount() != 0; } void EventDispatcherCompiz::interrupt () { wakeUp (); } bool EventDispatcherCompiz::processEvents (QEventLoop::ProcessEventsFlags flags) { emit awake (); Display *dpy = QX11Info::display(); while (!(flags & QEventLoop::ExcludeUserInputEvents) && !mQueuedEvents.isEmpty()) { // process a pending user input event XEvent event = mQueuedEvents.takeFirst(); // send through event filter if (filterEvent(&event)) continue; if (qApp->x11ProcessEvent(&event) == 1) return true; } while (XPending (dpy)) { XEvent event; // process events from the X server XNextEvent(dpy, &event); if (flags & QEventLoop::ExcludeUserInputEvents) { // queue user input events switch (event.type) { case ButtonPress: case ButtonRelease: case MotionNotify: case XKeyPress: case XKeyRelease: case EnterNotify: case LeaveNotify: mQueuedEvents.append(event); continue; case ClientMessage: // only keep the wm_take_focus // client messages if (event.xclient.format == 32) { if (event.xclient.message_type == Atoms::wmProtocols || (Atom) event.xclient.data.l[0] == Atoms::wmTakeFocus) { break; } } mQueuedEvents.append(event); continue; default: break; } } // send through event filter if (filterEvent(&event)) continue; if (qApp->x11ProcessEvent(&event) == 1) return true; } QApplication::sendPostedEvents(); while (!mDeleteTimers.isEmpty ()) delete mDeleteTimers.takeFirst (); while (!mDeleteSockets.isEmpty ()) delete mDeleteSockets.takeFirst (); return true; } void EventDispatcherCompiz::registerSocketNotifier (QSocketNotifier *notifier) { mSockets.append (new SocketObject (notifier)); } void EventDispatcherCompiz::registerTimer (int timerId, int interval, QObject *object) { TimerObject *timer = new TimerObject (timerId, interval, object); mTimers.append (timer); } QList EventDispatcherCompiz::registeredTimers (QObject *object) const { QList list; foreach (TimerObject *timer, mTimers) if (timer->object () == object) { list.append (timer->timerInfo ()); } return list; } void EventDispatcherCompiz::unregisterSocketNotifier (QSocketNotifier *notifier) { SocketObject *sock = NULL; foreach (SocketObject *socket, mSockets) if (socket->notifier () == notifier) { sock = socket; break; } if (sock) { mSockets.removeAll (sock); mDeleteSockets.append (sock); } } bool EventDispatcherCompiz::unregisterTimer (int timerId) { TimerObject *time = NULL; foreach (TimerObject *timer, mTimers) if (timer->timerInfo ().first == timerId) { time = timer; break; } if (time) { mTimers.removeAll (time); time->disable (); mDeleteTimers.append (time); return true; } return false; } bool EventDispatcherCompiz::unregisterTimers (QObject *object) { QList list; foreach (TimerObject *timer, mTimers) if (timer->object () == object) { list.append (timer); } if (!list.isEmpty ()) { foreach (TimerObject *timer, list) { mTimers.removeAll (timer); timer->disable (); mDeleteTimers.append (timer); } return true; } return false; } void EventDispatcherCompiz::wakeUp () { if (mWakeUpPipe[1]) if (write (mWakeUpPipe[1], "w", 1) <= 0) return; } void EventDispatcherCompiz::startingUp () { if (pipe (mWakeUpPipe) < 0) return; mWakeUpHandle = screen->addWatchFd (mWakeUpPipe [0],POLLIN, boost::bind (&EventDispatcherCompiz::wakeUpEvent, this)); mX11Handle = screen->addWatchFd (ConnectionNumber (QX11Info::display()), POLLIN | POLLHUP | POLLERR, NULL); } void EventDispatcherCompiz::closingDown () { screen->removeWatchFd (mX11Handle); screen->removeWatchFd (mWakeUpPipe[0]); } void EventDispatcherCompiz::wakeUpEvent () { char buf[256]; if (read (mWakeUpPipe[0], buf, 256) <= 0) return; } ./plugins/kde/src/kde.cpp0000644000004100000410000000347013246301623015531 0ustar www-datawww-data/* * Copyright (c) 2009 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "kde.h" #include COMPIZ_PLUGIN_20090315 (kde, KdePluginVTable); typedef int (*X11ErrorHandlerProc)(Display *, XErrorEvent *); KdeScreen::KdeScreen (CompScreen *screen) : PluginClassHandler (screen) { mEventDispatcher = new EventDispatcherCompiz (); argv[0] = strdup ("compiz"); argc = 1; KCmdLineArgs::init (argc, argv, "compiz", "compiz", ki18n ("Compiz KDE event loop plugin"), "0.0.1"); // Save the compiz error handler X11ErrorHandlerProc er = XSetErrorHandler(NULL); mApp = new KApplication (); // Restore our error handler XSetErrorHandler(er); } KdeScreen::~KdeScreen () { // Save the compiz error handler X11ErrorHandlerProc er = XSetErrorHandler(NULL); delete mApp; delete mEventDispatcher; // Restore our error handler XSetErrorHandler(er); free (argv[0]); } bool KdePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/kde/src/socket.h0000644000004100000410000000215613246301623015723 0ustar www-datawww-data/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SOCKET_H_ #define SOCKET_H_ #include class QSocketNotifier; class SocketObject { public: SocketObject (QSocketNotifier *notifier); ~SocketObject (); QSocketNotifier *notifier () const; private: void callback (); private: QSocketNotifier *mNotifier; CompWatchFdHandle mHandle; }; #endif ./plugins/kde/src/timer.h0000644000004100000410000000252613246301623015554 0ustar www-datawww-data/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TIMER_H_ #define TIMER_H_ #include #include #include #include class TimerObject { public: TimerObject (int timerId, int interval, QObject *object); ~TimerObject (); QAbstractEventDispatcher::TimerInfo timerInfo () const; QObject *object () const; void disable (); private: bool execute (); private: QAbstractEventDispatcher::TimerInfo mTimerInfo; CompTimer mTimer; QObject *mObject; bool mEnabled; }; #endif ./plugins/kde/src/timer.cpp0000644000004100000410000000312713246301623016105 0ustar www-datawww-data/* * Copyright (c) 2010 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "timer.h" #include "boost/bind.hpp" #include #include TimerObject::TimerObject (int timerId, int interval, QObject *object) : mTimerInfo (QAbstractEventDispatcher::TimerInfo (timerId, interval)), mObject (object) { mTimer.start (boost::bind (&TimerObject::execute, this), interval); mEnabled = true; } TimerObject::~TimerObject () { mTimer.stop (); } QAbstractEventDispatcher::TimerInfo TimerObject::timerInfo () const { return mTimerInfo; } QObject * TimerObject::object () const { return mObject; } bool TimerObject::execute () { if (!mEnabled) return false; QTimerEvent event (mTimerInfo.first); QApplication::sendEvent (mObject, &event); return mEnabled; } void TimerObject::disable () { mEnabled = false; mTimer.stop(); };./plugins/kde/kde.xml.in0000644000004100000410000000055613246301623015367 0ustar www-datawww-data <_short>KDE/Qt Event Loop <_long>Integrates the KDE/Qt event loop into Compiz General composite opengl decor ./plugins/scaleaddon/0000755000004100000410000000000013246301624015022 5ustar www-datawww-data./plugins/scaleaddon/CMakeLists.txt0000644000004100000410000000017213246301623017561 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (scaleaddon PLUGINDEPS composite opengl text scale) ./plugins/scaleaddon/scaleaddon.xml.in0000644000004100000410000001272413246301623020253 0ustar www-datawww-data <_short>Scale Addons <_long>Some useful additions to the scale plugin Utility composite opengl scale text decor opengl scale <_short>Bindings <_short>Appearance <_short>Window Title <_short>Window Highlight <_short>Behaviour <_short>Natural Scale Mode <_short>Window Pull ./plugins/scaleaddon/src/0000755000004100000410000000000013246301624015611 5ustar www-datawww-data./plugins/scaleaddon/src/scaleaddon.h0000644000004100000410000000657313246301623020071 0ustar www-datawww-data/* * * Compiz scale plugin addon plugin * * scaleaddon.h * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Organic scale mode taken from Beryl's scale.c, written by * Copyright : (C) 2006 Diogo Ferreira * E-mail : diogo@underdev.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * */ #include #include #include #include #include #include #include #include #include "scaleaddon_options.h" class ScaleAddonScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public ScaleScreenInterface, public ScaleaddonOptions { public: ScaleAddonScreen (CompScreen *); CompositeScreen *cScreen; ScaleScreen *sScreen; Window highlightedWindow; Window lastHighlightedWindow; int lastState; float scale; std::vector paintSlots; void handleEvent (XEvent *); bool layoutSlotsAndAssignWindows (); bool layoutNaturalThumbs (); bool isOverlappingAny (ScaleWindow *w, const std::map , const CompRegion &border); void donePaint (); void checkWindowHighlight (); bool closeWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool pullWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomWindow (CompAction *action, CompAction::State state, CompOption::Vector options); void handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options); void optionChanged (CompOption *opt, ScaleaddonOptions::Options num); }; #define ADDON_SCREEN(s) \ ScaleAddonScreen *as = ScaleAddonScreen::get (s) class ScaleAddonWindow : public PluginClassHandler , public ScaleWindowInterface { public: ScaleAddonWindow (CompWindow *); CompWindow *window; ScaleWindow *sWindow; CompositeWindow *cWindow; ScaleSlot origSlot; CompText text; bool rescaled; CompWindow *oldAbove; void scalePaintDecoration (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void scaleSelectWindow (); void renderTitle (); void drawTitle (const GLMatrix &transform); void drawHighlight (const GLMatrix &transform); }; #define ADDON_WINDOW(w) \ ScaleAddonWindow *aw = ScaleAddonWindow::get (w) class ScaleAddonPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/scaleaddon/src/scaleaddon.cpp0000644000004100000410000010472713246301623020424 0ustar www-datawww-data/* * * Compiz scale plugin addon plugin * * scaleaddon.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Organic scale mode taken from Beryl's scale.c, written by * Copyright : (C) 2006 Diogo Ferreira * E-mail : diogo@underdev.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * */ #include "scaleaddon.h" #include COMPIZ_PLUGIN_20090315 (scaleaddon, ScaleAddonPluginVTable); bool textAvailable; void ScaleAddonWindow::renderTitle () { ADDON_SCREEN (screen); int titleOpt = as->optionGetWindowTitle (); if (!textAvailable || titleOpt == ScaleaddonOptions::WindowTitleNoDisplay || !sWindow->hasSlot () || (titleOpt == ScaleaddonOptions::WindowTitleHighlightedWindowOnly && as->highlightedWindow != window->id ())) return; text.clear (); CompText::Attrib attrib; float scale = sWindow->getSlot ().scale; attrib.maxWidth = window->width () * scale; attrib.maxHeight = window->height () * scale; attrib.family = "Sans"; attrib.size = as->optionGetTitleSize (); attrib.color[0] = as->optionGetFontColorRed (); attrib.color[1] = as->optionGetFontColorGreen (); attrib.color[2] = as->optionGetFontColorBlue (); attrib.color[3] = as->optionGetFontColorAlpha (); attrib.flags = CompText::WithBackground | CompText::Ellipsized; if (as->optionGetTitleBold ()) attrib.flags |= CompText::StyleBold; attrib.bgHMargin = as->optionGetBorderSize (); attrib.bgVMargin = as->optionGetBorderSize (); attrib.bgColor[0] = as->optionGetBackColorRed (); attrib.bgColor[1] = as->optionGetBackColorGreen (); attrib.bgColor[2] = as->optionGetBackColorBlue (); attrib.bgColor[3] = as->optionGetBackColorAlpha (); text.renderWindowTitle (window->id (), as->sScreen->getType () == ScaleTypeAll, attrib); } void ScaleAddonWindow::drawTitle (const GLMatrix &transform) { ScalePosition pos = sWindow->getCurrentPosition (); CompRect geom = window->borderRect (); float width = text.getWidth (); float height = text.getHeight (); float x = pos.x () + window->x () + geom.width () * pos.scale / 2 - width / 2; float y = pos.y () + window->y () + geom.height () * pos.scale / 2 - height / 2; text.draw (transform, floor (x), floor (y), 1.0f); } void ScaleAddonWindow::drawHighlight (const GLMatrix &transform) { if (rescaled) return; GLint oldBlendSrc, oldBlendDst; GLushort colorData[4]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); ScalePosition pos = sWindow->getCurrentPosition (); CompRect geom = window->borderRect (); ADDON_SCREEN (screen); #ifdef USE_GLES GLint oldBlendSrcAlpha, oldBlendDstAlpha; #endif float x = pos.x () + window->x () - (window->border ().left * pos.scale); float y = pos.y () + window->y () - (window->border ().top * pos.scale); float width = geom.width () * pos.scale; float height = geom.height () * pos.scale; /* we use a poor replacement for roundf() * (available in C99 only) here */ x = floor (x + 0.5f); y = floor (y + 0.5f); #ifdef USE_GLES glGetIntegerv (GL_BLEND_SRC_RGB, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST_RGB, &oldBlendDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &oldBlendSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &oldBlendDstAlpha); #else GLboolean wasBlend = glIsEnabled (GL_BLEND); glGetIntegerv (GL_BLEND_SRC, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST, &oldBlendDst); if (!wasBlend) glEnable (GL_BLEND); #endif glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = as->optionGetHighlightColorRed (); colorData[1] = as->optionGetHighlightColorGreen (); colorData[2] = as->optionGetHighlightColorBlue (); colorData[3] = as->optionGetHighlightColorAlpha (); streamingBuffer->addColors (1, colorData); vertexData[0] = x; vertexData[1] = y; vertexData[2] = 0.0f; vertexData[3] = x; vertexData[4] = y + height; vertexData[5] = 0.0f; vertexData[6] = x + width; vertexData[7] = y; vertexData[8] = 0.0f; vertexData[9] = x + width; vertexData[10] = y + height; vertexData[11] = 0.0f; streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); #ifdef USE_GLES glBlendFuncSeparate (oldBlendSrc, oldBlendDst, oldBlendSrcAlpha, oldBlendDstAlpha); #else if (!wasBlend) glDisable (GL_BLEND); glBlendFunc (oldBlendSrc, oldBlendDst); #endif } void ScaleAddonScreen::checkWindowHighlight () { if (highlightedWindow != lastHighlightedWindow) { CompWindow *w = screen->findWindow (highlightedWindow); if (w) { ADDON_WINDOW (w); aw->renderTitle (); aw->cWindow->addDamage (); } w = screen->findWindow (lastHighlightedWindow); if (w) { ADDON_WINDOW (w); aw->renderTitle (); aw->cWindow->addDamage (w); } lastHighlightedWindow = highlightedWindow; } } bool ScaleAddonScreen::closeWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { if (!sScreen->hasGrab ()) return false; CompWindow *w = screen->findWindow (highlightedWindow); if (w) w->close (screen->getCurrentTime ()); return true; } bool ScaleAddonScreen::pullWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { if (!sScreen->hasGrab ()) return false; CompWindow *w = screen->findWindow (highlightedWindow); if (w) { CompPoint vp = w->defaultViewport (); int xOffset = (screen->vp ().x () - vp.x ()) * screen->width (); int yOffset = (screen->vp ().y () - vp.y ()) * screen->height (); int x = w->x () + xOffset; int y = w->y () + yOffset; if (optionGetConstrainPullToScreen ()) { CompRect workArea, extents; workArea = screen->outputDevs ()[w->outputDevice ()].workArea (); extents = w->borderRect (); extents.setX (extents.x () + xOffset); extents.setY (extents.y () + yOffset); if (extents.x1 () < workArea.x1 ()) x += workArea.x1 () - extents.x1 (); else if (extents.x2 () > workArea.x2 ()) x += workArea.x2 () - extents.x2 (); if (extents.y1 () < workArea.y1 ()) y += workArea.y1 () - extents.y1 (); else if (extents.y2 () > workArea.y2 ()) y += workArea.y2 () - extents.y2 (); } if (x != w->x () || y != w->y ()) { ScalePosition pos; ADDON_WINDOW (w); ScalePosition oldPos = aw->sWindow->getCurrentPosition (); w->moveToViewportPosition (x, y, true); /* Select this window when ending scale */ aw->sWindow->scaleSelectWindow (); /* stop scaled window disappearing */ pos.setX (oldPos.x () - xOffset); pos.setY (oldPos.y () - yOffset); if (optionGetExitAfterPull ()) { CompAction *action; CompOption::Vector o; CompOption *opt; o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); opt = CompOption::findOption (sScreen->getOptions (), "initiate_key", 0); action = &opt->value ().action (); if (action->terminate ()) action->terminate () (action, 0, o); } else { ScaleSlot slot = aw->sWindow->getSlot (); /* provide a simple animation */ aw->cWindow->addDamage (); pos.setX (oldPos.x () - slot.width () / 20); pos.setY (oldPos.y () - slot.height () / 20); pos.scale = oldPos.scale * 1.1f; aw->sWindow->setCurrentPosition (pos); aw->cWindow->addDamage (); } } } return true; } bool ScaleAddonScreen::zoomWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { if (!sScreen->hasGrab ()) return false; CompWindow *w = screen->findWindow (highlightedWindow); if (w) { ADDON_WINDOW (w); if (!aw->sWindow->hasSlot ()) return false; int head = screen->outputDeviceForPoint (aw->sWindow->getSlot ().pos ()); CompRect output = screen->outputDevs ()[head]; /* damage old rect */ aw->cWindow->addDamage (); if (!aw->rescaled) { ScaleSlot slot = aw->sWindow->getSlot (); CompRect geom = w->borderRect (); aw->oldAbove = w->next; w->raise (); /* backup old values */ aw->origSlot = slot; aw->rescaled = true; int x1 = output.centerX () - geom.width () / 2 + w->border ().left; int y1 = output.centerY () - geom.height () / 2 + w->border ().top; int x2 = slot.x () + geom.width (); int y2 = slot.y () + geom.height (); slot.scale = 1.0f; slot.setGeometry (x1, y1, x2 - x1, y2 - y1); aw->sWindow->setSlot (slot); } else { if (aw->oldAbove) w->restackBelow (aw->oldAbove); aw->rescaled = false; aw->sWindow->setSlot (aw->origSlot); } /* slot size may have changed, so * update window title */ aw->renderTitle (); aw->cWindow->addDamage (); } return true; } void ScaleAddonScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME && sScreen->hasGrab ()) { CompWindow *w = screen->findWindow (event->xproperty.window); if (w) { ADDON_WINDOW (w); aw->renderTitle (); aw->cWindow->addDamage (); } } break; case MotionNotify: if (sScreen->hasGrab ()) { highlightedWindow = sScreen->getHoveredWindow (); checkWindowHighlight (); } break; default: break; } } void ScaleAddonWindow::scalePaintDecoration (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { ScaleScreen::State state; ADDON_SCREEN (screen); state = as->sScreen->getState (); sWindow->scalePaintDecoration (attrib, transform, region, mask); if (state == ScaleScreen::Wait || state == ScaleScreen::Out) { if (as->optionGetWindowHighlight () && window->id () == as->highlightedWindow) drawHighlight (transform); if (textAvailable) drawTitle (transform); } } void ScaleAddonWindow::scaleSelectWindow () { ADDON_SCREEN (screen); as->highlightedWindow = window->id (); as->checkWindowHighlight (); sWindow->scaleSelectWindow (); } void ScaleAddonScreen::donePaint () { ScaleScreen::State state = sScreen->getState (); if (state != ScaleScreen::Idle && lastState == ScaleScreen::Idle) { foreach (CompWindow *w, screen->windows ()) ScaleAddonWindow::get (w)->renderTitle (); } else if (state == ScaleScreen::Idle && lastState != ScaleScreen::Idle) { foreach (CompWindow *w, screen->windows ()) ScaleAddonWindow::get (w)->text.clear (); } if (state == ScaleScreen::Out && lastState != ScaleScreen::Out) { lastHighlightedWindow = None; checkWindowHighlight (); } lastState = state; cScreen->donePaint (); } void ScaleAddonScreen::handleCompizEvent (const char *pluginName, const char *eventName, CompOption::Vector &options) { screen->handleCompizEvent (pluginName, eventName, options); if ((strcmp (pluginName, "scale") == 0) && (strcmp (eventName, "activate") == 0)) { bool activated = CompOption::getBoolOptionNamed (options, "active", false); if (activated) { screen->addAction (&optionGetCloseKey ()); screen->addAction (&optionGetZoomKey ()); screen->addAction (&optionGetPullKey ()); screen->addAction (&optionGetCloseButton ()); screen->addAction (&optionGetZoomButton ()); screen->addAction (&optionGetPullButton ()); /* TODO: or better ad->highlightedWindow = sd->selectedWindow; here? do we want to show up the highlight without mouse move initially? */ highlightedWindow = None; lastHighlightedWindow = None; checkWindowHighlight (); } else { foreach (CompWindow *w, screen->windows ()) { ADDON_WINDOW (w); aw->rescaled = false; } screen->removeAction (&optionGetCloseKey ()); screen->removeAction (&optionGetZoomKey ()); screen->removeAction (&optionGetPullKey ()); screen->removeAction (&optionGetCloseButton ()); screen->removeAction (&optionGetZoomButton ()); screen->removeAction (&optionGetPullButton ()); } } } /** * experimental organic layout method * inspired by smallwindows (smallwindows.sf.net) by Jens Egeblad * FIXME: broken. * */ #if 0 static const double ORGANIC_STEP = 0.05f; static int organicCompareWindows (const void *elem1, const void *elem2) { CompWindow *w1 = *((CompWindow **) elem1); CompWindow *w2 = *((CompWindow **) elem2); return (WIN_X (w1) + WIN_Y (w1)) - (WIN_X (w2) + WIN_Y (w2)); } static double layoutOrganicCalculateOverlap (CompScreen *s, int win, int x, int y) { int overlapX, overlapY; int xMin, xMax, yMin, yMax; double result = -0.01; SCALE_SCREEN (); ADDON_SCREEN (); int x1 = x; int y1 = y; int x2 = x1 + WIN_W (ss->windows[win]) * as->scale; int y2 = y1 + WIN_H (ss->windows[win]) * as->scale; for (int i = 0; i < ss->nWindows; ++i) { if (i == win) continue; overlapX = overlapY = 0; xMax = MAX (ss->slots[i].x1, x1); xMin = MIN (ss->slots[i].x1 + WIN_W (ss->windows[i]) * as->scale, x2); if (xMax <= xMin) overlapX = xMin - xMax; yMax = MAX (ss->slots[i].y1, y1); yMin = MIN (ss->slots[i].y1 + WIN_H (ss->windows[i]) * as->scale, y2); if (yMax <= yMin) overlapY = yMin - yMax; result += (double)overlapX * overlapY; } return result; } static double layoutOrganicFindBestHorizontalPosition (CompScreen *s, int win, int *bestX, int areaWidth) { double bestOverlap = 1e31, overlap; SCALE_SCREEN (); ADDON_SCREEN (); int y1 = ss->slots[win].y1; int y2 = ss->slots[win].y1 + WIN_H (ss->windows[win]) * as->scale; int w = WIN_W (ss->windows[win]) * as->scale; *bestX = ss->slots[win].x1; for (int i = 0; i < ss->nWindows; ++i) { CompWindow *lw = ss->windows[i]; if (i == win) continue; if (ss->slots[i].y1 < y2 && ss->slots[i].y1 + WIN_H (lw) * as->scale > y1) { if (ss->slots[i].x1 - w >= 0) { double overlap = layoutOrganicCalculateOverlap (s, win, ss->slots[i].x1 - w, y1); if (overlap < bestOverlap) { *bestX = ss->slots[i].x1 - w; bestOverlap = overlap; } } if (WIN_W (lw) * as->scale + ss->slots[i].x1 + w < areaWidth) { double overlap = layoutOrganicCalculateOverlap (s, win, ss->slots[i].x1 + WIN_W (lw) * as->scale, y1); if (overlap < bestOverlap) { *bestX = ss->slots[i].x1 + WIN_W (lw) * as->scale; bestOverlap = overlap; } } } } overlap = layoutOrganicCalculateOverlap (s, win, 0, y1); if (overlap < bestOverlap) { *bestX = 0; bestOverlap = overlap; } overlap = layoutOrganicCalculateOverlap (s, win, areaWidth - w, y1); if (overlap < bestOverlap) { *bestX = areaWidth - w; bestOverlap = overlap; } return bestOverlap; } static double layoutOrganicFindBestVerticalPosition (CompScreen *s, int win, int *bestY, int areaHeight) { double bestOverlap = 1e31, overlap; SCALE_SCREEN (); ADDON_SCREEN (); int x1 = ss->slots[win].x1; int x2 = ss->slots[win].x1 + WIN_W (ss->windows[win]) * as->scale; int h = WIN_H (ss->windows[win]) * as->scale; *bestY = ss->slots[win].y1; for (int i = 0; i < ss->nWindows; ++i) { CompWindow *w = ss->windows[i]; if (i == win) continue; if (ss->slots[i].x1 < x2 && ss->slots[i].x1 + WIN_W (w) * as->scale > x1) { if (ss->slots[i].y1 - h >= 0 && ss->slots[i].y1 < areaHeight) { double overlap = layoutOrganicCalculateOverlap (s, win, x1, ss->slots[i].y1 - h); if (overlap < bestOverlap) { *bestY = ss->slots[i].y1 - h; bestOverlap = overlap; } } if (WIN_H (w) * as->scale + ss->slots[i].y1 > 0 && WIN_H (w) * as->scale + h + ss->slots[i].y1 < areaHeight) { double overlap = layoutOrganicCalculateOverlap (s, win, x1, WIN_H (w) * as->scale + ss->slots[i].y1); if (overlap < bestOverlap) { *bestY = ss->slots[i].y1 + WIN_H(w) * as->scale; bestOverlap = overlap; } } } } overlap = layoutOrganicCalculateOverlap (s, win, x1, 0); if (overlap < bestOverlap) { *bestY = 0; bestOverlap = overlap; } overlap = layoutOrganicCalculateOverlap (s, win, x1, areaHeight - h); if (overlap < bestOverlap) { *bestY = areaHeight - h; bestOverlap = overlap; } return bestOverlap; } static bool layoutOrganicLocalSearch (CompScreen *s, int areaWidth, int areaHeight) { bool improvement; int i; double totalOverlap; SCALE_SCREEN (); do { improvement = false; for (i = 0; i < ss->nWindows; ++i) { bool improved; do { int newX, newY; double oldOverlap, overlapH, overlapV; improved = false; oldOverlap = layoutOrganicCalculateOverlap (s, i, ss->slots[i].x1, ss->slots[i].y1); overlapH = layoutOrganicFindBestHorizontalPosition (s, i, &newX, areaWidth); overlapV = layoutOrganicFindBestVerticalPosition (s, i, &newY, areaHeight); if (overlapH < oldOverlap - 0.1 || overlapV < oldOverlap - 0.1) { improved = true; improvement = true; if (overlapV > overlapH) ss->slots[i].x1 = newX; else ss->slots[i].y1 = newY; } } while (improved); } } while (improvement); totalOverlap = 0.0; for (i = 0; i < ss->nWindows; ++i) { totalOverlap += layoutOrganicCalculateOverlap (s, i, ss->slots[i].x1, ss->slots[i].y1); } return (totalOverlap > 0.1); } static void layoutOrganicRemoveOverlap (CompScreen *s, int areaWidth, int areaHeight) { CompWindow *w; SCALE_SCREEN (); ADDON_SCREEN (); int spacing = ss->opt[SCALE_SCREEN_OPTION_SPACING].value.i; while (layoutOrganicLocalSearch (s, areaWidth, areaHeight)) { for (int i = 0; i < ss->nWindows; ++i) { w = ss->windows[i]; int centerX = ss->slots[i].x1 + WIN_W (w) / 2; int centerY = ss->slots[i].y1 + WIN_H (w) / 2; int newWidth = (int)((1.0 - ORGANIC_STEP) * (double)WIN_W (w)) - spacing / 2; int newHeight = (int)((1.0 - ORGANIC_STEP) * (double)WIN_H (w)) - spacing / 2; int newX = centerX - (newWidth / 2); int newY = centerY - (newHeight / 2); ss->slots[i].x1 = newX; ss->slots[i].y1 = newY; ss->slots[i].x2 = newX + WIN_W (w); ss->slots[i].y2 = newY + WIN_H (w); } as->scale -= ORGANIC_STEP; } } static bool layoutOrganicThumbs (CompScreen *s) { CompWindow *w; int i; XRectangle workArea; SCALE_SCREEN (); ADDON_SCREEN (); int moMode = ss->opt[SCALE_SCREEN_OPTION_MULTIOUTPUT_MODE].value.i; switch (moMode) { case SCALE_MOMODE_ALL: workArea = s->workArea; break; case SCALE_MOMODE_CURRENT: default: workArea = s->outputDev[s->currentOutputDev].workArea; break; } as->scale = 1.0f; qsort (ss->windows, ss->nWindows, sizeof(CompWindow *), organicCompareWindows); for (i = 0; i < ss->nWindows; ++i) { w = ss->windows[i]; SCALE_WINDOW (w); sWindow->slot = &ss->slots[i]; ss->slots[i].x1 = WIN_X (w) - workArea.x; ss->slots[i].y1 = WIN_Y (w) - workArea.y; ss->slots[i].x2 = WIN_X (w) + WIN_W (w) - workArea.x; ss->slots[i].y2 = WIN_Y (w) + WIN_H (w) - workArea.y; if (ss->slots[i].x1 < 0) { ss->slots[i].x2 += abs (ss->slots[i].x1); ss->slots[i].x1 = 0; } if (ss->slots[i].x2 > workArea.width - workArea.x) { ss->slots[i].x1 -= abs (ss->slots[i].x2 - workArea.width); ss->slots[i].x2 = workArea.width - workArea.x; } if (ss->slots[i].y1 < 0) { ss->slots[i].y2 += abs (ss->slots[i].y1); ss->slots[i].y1 = 0; } if (ss->slots[i].y2 > workArea.height - workArea.y) { ss->slots[i].y1 -= abs (ss->slots[i].y2 - workArea.height - workArea.y); ss->slots[i].y2 = workArea.height - workArea.y; } } ss->nSlots = ss->nWindows; layoutOrganicRemoveOverlap (s, workArea.width - workArea.x, workArea.height - workArea.y); for (i = 0; i < ss->nWindows; ++i) { w = ss->windows[i]; SCALE_WINDOW (w); if (ss->type == ScaleTypeGroup) raiseWindow (ss->windows[i]); ss->slots[i].x1 += w->input.left + workArea.x; ss->slots[i].x2 += w->input.left + workArea.x; ss->slots[i].y1 += w->input.top + workArea.y; ss->slots[i].y2 += w->input.top + workArea.y; sWindow->adjust = true; } return true; } #endif /* * Inspired by KWin - the KDE Window Manager * presentwindows.cpp * Copyright (C) 2007 Rivo Laks * Copyright (C) 2008 Lucas Murray * */ bool ScaleAddonScreen::isOverlappingAny (ScaleWindow *w, std::map targets, const CompRegion &border) { if (border.intersects (targets[w])) return true; // Is there a better way to do this? std::map ::const_iterator i; for (i = targets.begin (); i != targets.end (); ++i) { if (w == (*i).first) continue; if (targets[w].intersects ((*i).second)) return true; } return false; } bool ScaleAddonScreen::layoutNaturalThumbs () { ScaleScreen::WindowList windows = ScaleScreen::get (screen)->getWindows (); bool overlapping; CompRect area = screen->workArea (); CompRect bounds = area; std::map targets; std::map directions; int direction = 0; int iterCount = 0; if (windows.size () == 1) { // Just move the window to its original location to save time if (screen->fullscreenOutput ().workArea ().contains (windows.front ()->window->geometry ())) { ScaleSlot slot ((CompRect &) windows.front ()->window->geometry ()); windows.front ()->setSlot (slot); return true; } } foreach (ScaleWindow *w, windows) { bounds = CompRegion (bounds).united (w->window->outputRect ()).boundingRect (); targets[w] = CompRegion (w->window->outputRect ()); // Reuse the unused "slot" as a preferred direction attribute. This is used when the window // is on the edge of the screen to try to use as much screen real estate as possible. directions[w] = direction; ++direction; if (direction == 4) direction = 0; } do { overlapping = false; foreach (ScaleWindow *w, windows) { foreach (ScaleWindow *e, windows) { if (e->window->id () != w->window->id () && targets[w].intersects (targets[e])) { int moveX = targets[w].boundingRect ().centerX () - targets[e].boundingRect ().centerX (); int moveY = targets[w].boundingRect ().centerY () - targets[e].boundingRect ().centerY (); //int xSection, ySection; // Overlap detected, determine direction to push overlapping = true; moveX /= optionGetNaturalPrecision (); moveY /= optionGetNaturalPrecision (); /* Force movement */ if (moveX == 0) moveX = optionGetNaturalPrecision (); if (moveY == 0) moveY = optionGetNaturalPrecision (); targets[w] = targets[w].translated (moveX, moveY); targets[e] = targets[e].translated (-moveX, -moveY); /* Try to keep the bounding rect the same aspect as the screen so that more * screen real estate is utilised. We do this by splitting the screen into nine * equal sections, if the window center is in any of the corner sections pull the * window towards the outer corner. If it is in any of the other edge sections * alternate between each corner on that edge. We don't want to determine it * randomly as it will not produce consistant locations when using the filter. * Only move one window so we don't cause large amounts of unnecessary zooming * in some situations. We need to do this even when expanding later just in case * all windows are the same size. * (We are using an old bounding rect for this, hopefully it doesn't matter) * FIXME: Disabled for now * xSection = (targets[w].boundingRect ().x () - bounds.x ()) / (bounds.width () / 3); ySection = (targets[w].boundingRect ().y () - bounds.y ()) / (bounds.height () / 3); moveX = 0; moveY = 0; if (xSection != 1 || ySection != 1) // Remove this if you want the center to pull as well { if (xSection == 1) xSection = (directions[w] / 2 ? 2 : 0); if (ySection == 1) ySection = (directions[w] % 2 ? 2 : 0); } if (xSection == 0 && ySection == 0) { moveX = bounds.left () - targets[w].boundingRect ().centerX (); moveY = bounds.top () - targets[w].boundingRect ().centerY (); } if (xSection == 2 && ySection == 0) { moveX = bounds.right () - targets[w].boundingRect ().centerX (); moveY = bounds.top () - targets[w].boundingRect ().centerY (); } if (xSection == 2 && ySection == 2) { moveX = bounds.right () - targets[w].boundingRect ().centerX (); moveY = bounds.bottom () - targets[w].boundingRect ().centerY (); } if (xSection == 0 && ySection == 2) { moveX = bounds.left () - targets[w].boundingRect ().centerX (); moveY = bounds.right () - targets[w].boundingRect ().centerY (); } if (moveX != 0 || moveY != 0) targets[w].translate (moveX, moveY); */ } // Update bounding rect bounds = CompRegion (bounds).united (targets[w]).boundingRect (); bounds = CompRegion (bounds).united (targets[e]).boundingRect (); } } } while (overlapping); // Work out scaling by getting the most top-left and most bottom-right window coords. // The 20's and 10's are so that the windows don't touch the edge of the screen. double scale; if (bounds == area) scale = 1.0; // Don't add borders to the screen else if (area.width () / double (bounds.width ()) < area.height () / double (bounds.height ())) scale = (area.width () - 20) / double (bounds.width ()); else scale = (area.height () - 20) / double (bounds.height ()); // Make bounding rect fill the screen size for later steps bounds = CompRect ( bounds.x () - (area.width () - 20 - bounds.width () * scale ) / 2 - 10 / scale, bounds.y () - (area.height () - 20 - bounds.height () * scale ) / 2 - 10 / scale, area.width () / scale, area.height () / scale ); // Move all windows back onto the screen and set their scale foreach (ScaleWindow *w, windows) { targets[w] = CompRect ( (targets[w].boundingRect ().x () - bounds.x () ) * scale + area.x (), (targets[w].boundingRect ().y () - bounds.y ()) * scale + area.y (), targets[w].boundingRect ().width () * scale, targets[w].boundingRect ().height () * scale ); ScaleSlot slt (targets[w].boundingRect ()); slt.scale = scale; slt.filled = true; w->setSlot (slt); } // Don't expand onto or over the border CompRegion borderRegion = CompRegion (area); CompRegion areaRegion = CompRegion (area); borderRegion.translate (-200, -200); borderRegion.shrink (-200, -200); // actually expands the region areaRegion.translate (10 / scale, 10 / scale); areaRegion.shrink (10 / scale, 10 / scale); borderRegion ^= areaRegion; bool moved = false; do { moved = false; foreach (ScaleWindow *w, windows) { CompRegion oldRegion; // This may cause some slight distortion if the windows are enlarged a large amount int widthDiff = optionGetNaturalPrecision (); int heightDiff = ((w->window->height () / w->window->width ()) * (targets[w].boundingRect ().width() + widthDiff)) - targets[w].boundingRect ().height (); int xDiff = widthDiff / 2; // Also move a bit in the direction of the enlarge, allows the int yDiff = heightDiff / 2; // center windows to be enlarged if there is gaps on the side. // Attempt enlarging to the top-right oldRegion = targets[w]; targets[w] = CompRegion ( targets[w].boundingRect ().x () + xDiff, targets[w].boundingRect ().y () - yDiff - heightDiff, targets[w].boundingRect ().width () + widthDiff, targets[w].boundingRect ().height () + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; // Attempt enlarging to the bottom-right oldRegion = targets[w]; targets[w] = CompRegion( targets[w].boundingRect ().x () + xDiff, targets[w].boundingRect ().y () + yDiff, targets[w].boundingRect ().width () + widthDiff, targets[w].boundingRect ().height () + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; // Attempt enlarging to the bottom-left oldRegion = targets[w]; targets[w] = CompRegion ( targets[w].boundingRect ().x() - xDiff - widthDiff, targets[w].boundingRect ().y() + yDiff, targets[w].boundingRect ().width() + widthDiff, targets[w].boundingRect ().height() + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; // Attempt enlarging to the top-left oldRegion = targets[w]; targets[w] = CompRegion ( targets[w].boundingRect ().x() - xDiff - widthDiff, targets[w].boundingRect ().y() - yDiff - heightDiff, targets[w].boundingRect ().width() + widthDiff, targets[w].boundingRect ().height() + heightDiff ); if (isOverlappingAny (w, targets, borderRegion)) targets[w] = oldRegion; else moved = true; } ++iterCount; } while (moved && iterCount < 100); // The expanding code above can actually enlarge windows over 1.0/2.0 scale, we don't like this // We can't add this to the loop above as it would cause a never-ending loop so we have to make // do with the less-than-optimal space usage with using this method. foreach (ScaleWindow *w, windows) { double scale = targets[w].boundingRect ().width() / double( w->window->width()); if (scale > 2.0 || (scale > 1.0 && (w->window->width() > 300 || w->window->height() > 300))) { scale = (w->window->width () > 300 || w->window->height () > 300) ? 1.0 : 2.0; targets[w] = CompRegion ( targets[w].boundingRect ().center().x() - int (w->window->width() * scale) / 2, targets[w].boundingRect ().center().y() - int (w->window->height () * scale) / 2, w->window->width() * scale, w->window->height() * scale ); } } return true; } bool ScaleAddonScreen::layoutSlotsAndAssignWindows () { bool status; switch (optionGetLayoutMode ()) { case LayoutModeNatural: status = layoutNaturalThumbs (); break; case LayoutModeNormal: default: status = sScreen->layoutSlotsAndAssignWindows (); break; } return status; } void ScaleAddonScreen::optionChanged (CompOption *opt, ScaleaddonOptions::Options num) { switch (num) { case ScaleaddonOptions::WindowTitle: case ScaleaddonOptions::TitleBold: case ScaleaddonOptions::TitleSize: case ScaleaddonOptions::BorderSize: case ScaleaddonOptions::FontColor: case ScaleaddonOptions::BackColor: if (textAvailable) { foreach (CompWindow *w, screen->windows ()) { ADDON_WINDOW (w); aw->renderTitle (); } } break; default: break; } } ScaleAddonScreen::ScaleAddonScreen (CompScreen *) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), sScreen (ScaleScreen::get (screen)), highlightedWindow (0), lastHighlightedWindow (0), lastState (ScaleScreen::Idle), scale (1.0f) { CompAction::CallBack cb; ChangeNotify notify; ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); ScaleScreenInterface::setHandler (sScreen, true); cb = boost::bind (&ScaleAddonScreen::closeWindow, this, _1, _2, _3); optionSetCloseKeyInitiate (cb); optionSetCloseButtonInitiate (cb); cb = boost::bind (&ScaleAddonScreen::zoomWindow, this, _1, _2, _3); optionSetZoomKeyInitiate (cb); optionSetZoomButtonInitiate (cb); cb = boost::bind (&ScaleAddonScreen::pullWindow, this, _1, _2, _3); optionSetPullKeyInitiate (cb); optionSetPullButtonInitiate (cb); notify = boost::bind (&ScaleAddonScreen::optionChanged, this, _1, _2); optionSetWindowTitleNotify (notify); optionSetTitleBoldNotify (notify); optionSetTitleSizeNotify (notify); optionSetBorderSizeNotify (notify); optionSetFontColorNotify (notify); optionSetBackColorNotify (notify); } ScaleAddonWindow::ScaleAddonWindow (CompWindow *window) : PluginClassHandler (window), window (window), sWindow (ScaleWindow::get (window)), cWindow (CompositeWindow::get (window)), rescaled (false), oldAbove (NULL) { ScaleWindowInterface::setHandler (sWindow); } bool ScaleAddonPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("scaleaddon", CompLogLevelInfo, "Text Plugin not loaded, no text will be drawn."); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("scale", COMPIZ_SCALE_ABI)) return true; return false; } ./plugins/gears/0000755000004100000410000000000013246301623014025 5ustar www-datawww-data./plugins/gears/gears.xml.in0000644000004100000410000000075313246301623016262 0ustar www-datawww-data <_short>Cube Gears <_long>Render gears inside of the transparent cube Effects composite opengl cube cube opengl ./plugins/gears/CMakeLists.txt0000644000004100000410000000015713246301623016570 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (gears PLUGINDEPS composite opengl cube) ./plugins/gears/src/0000755000004100000410000000000013246301623014614 5ustar www-datawww-data./plugins/gears/src/gears.h0000644000004100000410000000426213246301623016072 0ustar www-datawww-data/* * Compiz cube gears plugin * * gears.h * * This is an example plugin to show how to render something inside * of the transparent cube * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Based on glxgears.c: * http://cvsweb.xfree86.org/cvsweb/xc/programs/glxgears/glxgears.c */ #include #include #include #include #include #include #include #include #include #include #include #include "gears_options.h" class GearsScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public CubeScreenInterface, public PluginClassHandler , public GearsOptions { public: GearsScreen (CompScreen *s); ~GearsScreen (); CompScreen *screen; CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *csScreen; void cubeClearTargetOutput (float xRotate, float vRotate); void cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); void preparePaint (int); void donePaint (); private: bool damage; bool warningPrinted; float contentRotation; GLuint gear1, gear2, gear3; float angle; float a1, a2, a3; }; #define GET_GEARS_SCREEN (screen) \ GearsScreen *es = GearsScreen::get (screen); class GearsPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/gears/src/gears.cpp0000644000004100000410000002462113246301623016426 0ustar www-datawww-data/* * Compiz cube gears plugin * * gears.cpp * * This is an example plugin to show how to render something inside * of the transparent cube * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Based on glxgears.c: * http://cvsweb.xfree86.org/cvsweb/xc/programs/glxgears/glxgears.c */ #include "gears.h" COMPIZ_PLUGIN_20090315 (gears, GearsPluginVTable); static void gear (GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth) { GLint i; GLfloat r0, r1, r2, maxr2, minr2; GLfloat angle, da; GLfloat u, v, len; r0 = inner_radius; r1 = outer_radius - tooth_depth / 2.0; maxr2 = r2 = outer_radius + tooth_depth / 2.0; minr2 = r2; da = 2.0 * M_PI / teeth / 4.0; glShadeModel (GL_SMOOTH); /* draw inside radius cylinder */ glBegin (GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { angle = i * 2.0 * M_PI / teeth; glNormal3f (-cos (angle), -sin (angle), 0.0); glVertex3f (r0 * cos (angle), r0 * sin (angle), -width * 0.5); glVertex3f (r0 * cos (angle), r0 * sin (angle), width * 0.5); } glEnd(); glShadeModel (GL_FLAT); glNormal3f (0.0, 0.0, 1.0); /* draw front face */ glBegin (GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r0 * cos (angle), r0 * sin (angle), width * 0.5); glVertex3f (r1 * cos (angle), r1 * sin (angle), width * 0.5); if (i < teeth) { glVertex3f (r0 * cos (angle), r0 * sin (angle), width * 0.5); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * 0.5); } } glEnd(); /* draw front sides of teeth */ glBegin (GL_QUADS); for (i = 0; i < teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle), r1 * sin (angle), width * 0.5); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * 0.5); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), width * 0.5); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * 0.5); r2 = minr2; } r2 = maxr2; glEnd(); glNormal3f (0.0, 0.0, -1.0); /* draw back face */ glBegin (GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * 0.5); glVertex3f (r0 * cos (angle), r0 * sin (angle), -width * 0.5); if (i < teeth) { glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * 0.5); glVertex3f (r0 * cos (angle), r0 * sin (angle), -width * 0.5); } } glEnd(); /* draw back sides of teeth */ glBegin (GL_QUADS); da = 2.0 * M_PI / teeth / 4.0; for (i = 0; i < teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * 0.5); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * 0.5); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 0.5); glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * 0.5); r2 = minr2; } r2 = maxr2; glEnd(); /* draw outward faces of teeth */ glBegin (GL_QUAD_STRIP); for (i = 0; i < teeth; i++) { angle = i * 2.0 * M_PI / teeth; glVertex3f (r1 * cos (angle), r1 * sin (angle), width * 0.5); glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * 0.5); u = r2 * cos (angle + da) - r1 * cos (angle); v = r2 * sin (angle + da) - r1 * sin (angle); len = sqrt (u * u + v * v); u /= len; v /= len; glNormal3f (v, -u, 0.0); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * 0.5); glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * 0.5); glNormal3f (cos (angle + 1.5 * da), sin (angle + 1.5 * da), 0.0); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), width * 0.5); glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * 0.5); u = r1 * cos (angle + 3 * da) - r2 * cos (angle + 2 * da); v = r1 * sin (angle + 3 * da) - r2 * sin (angle + 2 * da); glNormal3f (v, -u, 0.0); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * 0.5); glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * 0.5); glNormal3f (cos (angle + 3.5 * da), sin (angle + 3.5 * da), 0.0); r2 = minr2; } r2 = maxr2; glVertex3f (r1 * cos (0), r1 * sin (0), width * 0.5); glVertex3f (r1 * cos (0), r1 * sin (0), -width * 0.5); glEnd(); } void GearsScreen::cubeClearTargetOutput (float xRotate, float vRotate) { csScreen->cubeClearTargetOutput (xRotate, vRotate); glClear (GL_DEPTH_BUFFER_BIT); } void GearsScreen::cubePaintInside (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { /* we do not want to paint 3d gears if the camera is inside * the cube, because the gears would obstruct our view */ if (csScreen->invert () == -1) { /* it is enough to print the warning once */ if (!warningPrinted) { compLogMessage ("gears", CompLogLevelWarn, "Gears are disabled when viewing the cube from the inside"); warningPrinted = true; } return; } // CUBE_SCREEN (screen); static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 }; GLScreenPaintAttrib sA = sAttrib; sA.yRotate += csScreen->invert () * (360.0f / size) * (csScreen->xRotations () - (screen->vp ().x () * csScreen->nOutput ())); //CompTransform mT = *transform; GLMatrix mT = transform; gScreen->glApplyTransform (sA, output, &mT); // (*s->applyScreenTransform) (s, &sA, output, &mT); glPushMatrix(); glLoadMatrixf (mT.getMatrix ()); glTranslatef (csScreen->outputXOffset (), -csScreen->outputYOffset (), 0.0f); glScalef (csScreen->outputXScale (), csScreen->outputYScale (), 1.0f); bool enabledCull = false; glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT); glDisable (GL_BLEND); if (!glIsEnabled (GL_CULL_FACE) ) { enabledCull = true; glEnable (GL_CULL_FACE); } glPushMatrix(); glRotatef (contentRotation, 0.0, 1.0, 0.0); glScalef (0.05, 0.05, 0.05); glColor4usv (defaultColor); glEnable (GL_NORMALIZE); glEnable (GL_LIGHTING); glEnable (GL_LIGHT1); glDisable (GL_COLOR_MATERIAL); glEnable (GL_DEPTH_TEST); glDepthMask (GL_TRUE); glDepthFunc (GL_LESS); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glPushMatrix(); glTranslatef (-3.0, -2.0, 0.0); glRotatef (angle, 0.0, 0.0, 1.0); glCallList (gear1); glPopMatrix(); glPushMatrix(); glTranslatef (3.1, -2.0, 0.0); glRotatef (-2.0 * angle - 9.0, 0.0, 0.0, 1.0); glCallList (gear2); glPopMatrix(); glPushMatrix(); glTranslatef (-3.1, 4.2, 0.0); glRotatef (-2.0 * angle - 25.0, 0.0, 0.0, 1.0); glCallList (gear3); glPopMatrix(); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, white); glPopMatrix(); glDisable (GL_LIGHT1); glDisable (GL_NORMALIZE); glEnable (GL_COLOR_MATERIAL); if (!gScreen->lighting ()) glDisable (GL_LIGHTING); glDisable (GL_DEPTH_TEST); if (enabledCull) glDisable (GL_CULL_FACE); glPopMatrix(); glPopAttrib(); damage = true; csScreen->cubePaintInside (sAttrib, transform, output, size, normal); } void GearsScreen::preparePaint (int ms) { contentRotation += ms * 360.0 / 20000.0; contentRotation = fmod (contentRotation, 360.0); angle += ms * 360.0 / 8000.0; angle = fmod (angle, 360.0); a1 += ms * 360.0 / 3000.0; a1 = fmod (a1, 360.0); a2 += ms * 360.0 / 2000.0; a2 = fmod (a2, 360.0); a3 += ms * 360.0 / 1000.0; a3 = fmod (a3, 360.0); cScreen->preparePaint (ms); } void GearsScreen::donePaint () { if (damage) { cScreen->damageScreen (); damage = false; } cScreen->donePaint (); } GearsScreen::GearsScreen (CompScreen *screen) : PluginClassHandler (screen), screen (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), csScreen (CubeScreen::get (screen)), damage(false), warningPrinted (false), contentRotation(0.0), angle(0.0), a1(0.0), a2(0.0), a3(0.0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); CubeScreenInterface::setHandler (csScreen); static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; static GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 0.3f }; static GLfloat diffuseLight[] = { 0.5f, 0.5f, 0.5f, 0.5f }; glLightfv (GL_LIGHT1, GL_AMBIENT, ambientLight); glLightfv (GL_LIGHT1, GL_DIFFUSE, diffuseLight); glLightfv (GL_LIGHT1, GL_POSITION, pos); gear1 = glGenLists (1); glNewList (gear1, GL_COMPILE); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); gear (1.0, 4.0, 1.0, 20, 0.7); glEndList(); gear2 = glGenLists (1); glNewList (gear2, GL_COMPILE); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); gear (0.5, 2.0, 2.0, 10, 0.7); glEndList(); gear3 = glGenLists (1); glNewList (gear3, GL_COMPILE); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); gear (1.3, 2.0, 0.5, 10, 0.7); glEndList(); } GearsScreen::~GearsScreen () { glDeleteLists (gear1, 1); glDeleteLists (gear2, 1); glDeleteLists (gear3, 1); } bool GearsPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/regex/0000755000004100000410000000000013246301624014037 5ustar www-datawww-data./plugins/regex/CMakeLists.txt0000644000004100000410000000011413246301623016572 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(regex)./plugins/regex/src/0000755000004100000410000000000013246301624014626 5ustar www-datawww-data./plugins/regex/src/regex.cpp0000644000004100000410000001636313246301623016454 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "regexplugin.h" #include "core/atoms.h" #include #include COMPIZ_PLUGIN_20090315 (regex, RegexPluginVTable) class RegexExp : public CompMatch::Expression { public: typedef enum { TypeTitle, TypeRole, TypeClass, TypeName, } Type; RegexExp (const CompString& str, int item); virtual ~RegexExp (); bool evaluate (const CompWindow *w) const; static int matches (const CompString& str); private: typedef struct { const char *name; size_t length; Type type; unsigned int flags; } Prefix; static const Prefix prefix[]; Type mType; regex_t *mRegex; }; const RegexExp::Prefix RegexExp::prefix[] = { { "title=", 6, TypeTitle, 0 }, { "role=", 5, TypeRole, 0 }, { "class=", 6, TypeClass, 0 }, { "name=", 5, TypeName, 0 }, { "ititle=", 7, TypeTitle, REG_ICASE }, { "irole=", 6, TypeRole, REG_ICASE }, { "iclass=", 7, TypeClass, REG_ICASE }, { "iname=", 6, TypeName, REG_ICASE } }; RegexExp::RegexExp (const CompString& str, int item) : mRegex (NULL) { if ((unsigned int) item < sizeof (prefix) / sizeof (prefix[0])) { int status; CompString value; value = str.substr (prefix[item].length); mRegex = new regex_t; status = regcomp (mRegex, value.c_str (), REG_NOSUB | prefix[item].flags); if (status) { char errMsg[1024]; regerror (status, mRegex, errMsg, sizeof (errMsg)); compLogMessage ("regex", CompLogLevelWarn, "%s = %s", errMsg, value.c_str ()); regfree (mRegex); delete mRegex; mRegex = NULL; } mType = prefix[item].type; } } RegexExp::~RegexExp () { if (mRegex) { regfree (mRegex); delete mRegex; } } bool RegexExp::evaluate (const CompWindow *w) const { const CompString *string = NULL; const RegexWindow *rw = RegexWindow::get (w); switch (mType) { case TypeRole: string = &rw->role; break; case TypeTitle: string = &rw->title; break; case TypeClass: string = &rw->resClass; break; case TypeName: string = &rw->resName; break; } if (!mRegex || !string) return false; if (regexec (mRegex, string->c_str (), 0, NULL, 0)) return false; return true; } int RegexExp::matches (const CompString& str) { for (unsigned int i = 0; i < sizeof (prefix) / sizeof (prefix[0]); i++) if (str.compare (0, prefix[i].length, prefix[i].name) == 0) return (int) i; return -1; } CompMatch::Expression * RegexScreen::matchInitExp (const CompString& str) { int item = RegexExp::matches (str); if (item >= 0) return new RegexExp (str, item); return screen->matchInitExp (str); } bool RegexWindow::getStringProperty (Atom nameAtom, Atom typeAtom, CompString& string) { Atom type; unsigned long nItems; unsigned long bytesAfter; unsigned char *str = NULL; int format, result; result = XGetWindowProperty (screen->dpy (), window->id (), nameAtom, 0, LONG_MAX, false, typeAtom, &type, &format, &nItems, &bytesAfter, (unsigned char **) &str); if (result != Success) return false; if (type != typeAtom) { XFree (str); return false; } string = (char *) str; XFree (str); return true; } void RegexWindow::updateRole () { RegexScreen *rs = RegexScreen::get (screen); role = ""; getStringProperty (rs->roleAtom, XA_STRING, role); } void RegexWindow::updateTitle () { RegexScreen *rs = RegexScreen::get (screen); title = ""; if (getStringProperty (rs->visibleNameAtom, Atoms::utf8String, title)) return; if (getStringProperty (Atoms::wmName, Atoms::utf8String, title)) return; getStringProperty (XA_WM_NAME, XA_STRING, title); } void RegexWindow::updateClass () { XClassHint classHint; resClass = ""; resName = ""; if (!XGetClassHint (screen->dpy (), window->id (), &classHint) != Success) return; if (classHint.res_name) { resName = classHint.res_name; XFree (classHint.res_name); } if (classHint.res_class) { resClass = classHint.res_class; XFree (classHint.res_class); } } void RegexScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); if (event->type != PropertyNotify) return; w = screen->findWindow (event->xproperty.window); if (!w) return; if (event->xproperty.atom == XA_WM_NAME) { RegexWindow::get (w)->updateTitle (); screen->matchPropertyChanged (w); } else if (event->xproperty.atom == roleAtom) { RegexWindow::get (w)->updateRole (); screen->matchPropertyChanged (w); } else if (event->xproperty.atom == XA_WM_CLASS) { RegexWindow::get (w)->updateClass (); screen->matchPropertyChanged (w); } } /* It's not safe to call CompScreen::matchExpHandlerChanged * from the ::RegexScreen constructor since that could end * up calling RegexWindow::get () on windows (which haven't * had a RegexWindow struct created for them) through * ::matchExpHandlerChanged -> CompMatch::evaluate () -> * RegexExp::evaluate () -> RegexWindow::get () */ bool RegexScreen::applyInitialActions () { screen->matchExpHandlerChanged (); return false; } RegexScreen::RegexScreen (CompScreen *s) : PluginClassHandler (s) { CompTimer::CallBack cb = boost::bind (&RegexScreen::applyInitialActions, this); ScreenInterface::setHandler (s); roleAtom = XInternAtom (s->dpy (), "WM_WINDOW_ROLE", 0); visibleNameAtom = XInternAtom (s->dpy (), "_NET_WM_VISIBLE_NAME", 0); mApplyInitialActionsTimer.setTimes (0, 0); mApplyInitialActionsTimer.setCallback (cb); mApplyInitialActionsTimer.start (); } RegexScreen::~RegexScreen () { screen->matchInitExpSetEnabled (this, false); screen->matchExpHandlerChanged (); } RegexWindow::RegexWindow (CompWindow *w) : PluginClassHandler (w), window (w) { updateRole (); updateTitle (); updateClass (); } bool RegexPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/regex/src/regexplugin.h0000644000004100000410000000433413246301623017333 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef COMPIZ_REGEXPLUGIN_H #define COMPIZ_REGEXPLUGIN_H #include "core/screen.h" #include "core/timer.h" #include "core/pluginclasshandler.h" #include class RegexScreen : public PluginClassHandler, public ScreenInterface { public: RegexScreen (CompScreen *s); ~RegexScreen (); void handleEvent (XEvent *event); bool applyInitialActions (); CompMatch::Expression * matchInitExp (const CompString& value); Atom roleAtom; Atom visibleNameAtom; CompTimer mApplyInitialActionsTimer; }; class RegexWindow : public PluginClassHandler { public: RegexWindow (CompWindow *w); void updateRole (); void updateTitle (); void updateClass (); bool getStringProperty (Atom nameAtom, Atom typeAtom, CompString& string); CompString role; CompString title; CompString resName; CompString resClass; CompWindow *window; }; class RegexPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif ./plugins/regex/regex.xml.in0000644000004100000410000000052613246301623016302 0ustar www-datawww-data <_short>Regex Matching <_long>Regex window matching Utility composite opengl decor ./plugins/shelf/0000755000004100000410000000000013246301624014026 5ustar www-datawww-data./plugins/shelf/CMakeLists.txt0000644000004100000410000000015213246301623016563 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (shelf PLUGINDEPS composite opengl) ./plugins/shelf/src/0000755000004100000410000000000013246301624014615 5ustar www-datawww-data./plugins/shelf/src/shelf.h0000644000004100000410000001064613246301623016075 0ustar www-datawww-data/* * Compiz Shelf plugin * * shelf.h * * Copyright (C) 2007 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Danny Baumann * Sam Spilsbury * * Description: * * This plugin visually resizes a window to allow otherwise obtrusive * windows to be visible in a monitor-fashion. Use case: Anything with * progress bars, notification programs, etc. * * Todo: * - Check for XShape events * - Handle input in a sane way * - Mouse-over? */ #include #include #include #include #include #include #include "shelf_options.h" class ShelfedWindowInfo { public: ShelfedWindowInfo (CompWindow *); ~ShelfedWindowInfo (); public: CompWindow *w; Window ipw; XRectangle *inputRects; int nInputRects; int inputRectOrdering; XRectangle *frameInputRects; int frameNInputRects; int frameInputRectOrdering; }; class ShelfWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: ShelfWindow (CompWindow *); ~ShelfWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; float mScale; float targetScale; float steps; ShelfedWindowInfo *info; void moveNotify (int, int, bool); bool damageRect (bool, const CompRect &); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void saveInputShape (XRectangle **rectRects, int *retCount, int *retOrdering); CompWindow * getRealWindow (); void shapeInput (); void unshapeInput (); void adjustIPW (); void createIPW (); bool handleShelfInfo (); void scale (float fScale); void handleButtonPress (unsigned int x, unsigned int y); void handleButtonRelease (); void handleEnter (XEvent *event); }; #define SHELF_WINDOW(w) \ ShelfWindow *sw = ShelfWindow::get (w) class ShelfScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ShelfOptions { public: ShelfScreen (CompScreen *); CompositeScreen *cScreen; GLScreen *gScreen; CompScreen::GrabHandle grabIndex; Window grabbedWindow; Cursor moveCursor; unsigned int lastPointerX; unsigned int lastPointerY; std::list shelfedWindows; void handleEvent (XEvent *); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void addWindowToList (ShelfedWindowInfo *info); void removeWindowFromList (ShelfedWindowInfo *info); void adjustIPWStacking (); void handleMotionEvent (unsigned int x, unsigned int y); bool trigger (CompAction *action, CompAction::State state, CompOption::Vector options); bool reset (CompAction *action, CompAction::State state, CompOption::Vector options); bool triggerScreen (CompAction *action, CompAction::State state, CompOption::Vector options); bool inc (CompAction *action, CompAction::State state, CompOption::Vector options); bool dec (CompAction *action, CompAction::State state, CompOption::Vector options); CompWindow * findRealWindowID (Window wid); }; #define SHELF_SCREEN(w) \ ShelfScreen *ss = ShelfScreen::get (w) extern const float SHELF_MIN_SIZE; // Minimum pixelsize a window can be scaled to class ShelfPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/shelf/src/shelf.cpp0000644000004100000410000004652313246301623016433 0ustar www-datawww-data/* * Compiz Shelf plugin * * shelf.h * * Copyright (C) 2007 Canonical Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Danny Baumann * Sam Spilsbury * * Description: * * This plugin visually resizes a window to allow otherwise obtrusive * windows to be visible in a monitor-fashion. Use case: Anything with * progress bars, notification programs, etc. * * Todo: * - Check for XShape events * - Handle input in a sane way * - Mouse-over? */ #include "shelf.h" COMPIZ_PLUGIN_20090315 (shelf, ShelfPluginVTable); const float SHELF_MIN_SIZE = 50.0f; // Minimum pixelsize a window can be scaled to /* Enables / Disables screen paint functions */ static void toggleScreenFunctions (bool enabled) { SHELF_SCREEN (screen); screen->handleEventSetEnabled (ss, enabled); ss->cScreen->preparePaintSetEnabled (ss, enabled); ss->gScreen->glPaintOutputSetEnabled (ss, enabled); ss->cScreen->donePaintSetEnabled (ss, enabled); } static void toggleWindowFunctions (CompWindow *w, bool enabled) { SHELF_WINDOW (w); sw->window->moveNotifySetEnabled (sw, enabled); sw->cWindow->damageRectSetEnabled (sw, enabled); sw->gWindow->glPaintSetEnabled (sw, enabled); } /* Checks if w is a ipw and returns the real window */ CompWindow * ShelfWindow::getRealWindow () { ShelfedWindowInfo *run; SHELF_SCREEN (screen); foreach (run, ss->shelfedWindows) { if (window->id () == run->ipw) return run->w; } return NULL; } void ShelfWindow::saveInputShape (XRectangle **retRects, int *retCount, int *retOrdering) { XRectangle *rects; int count = 0, ordering; Display *dpy = screen->dpy (); rects = XShapeGetRectangles (dpy, window->id (), ShapeInput, &count, &ordering); /* check if the returned shape exactly matches the window shape - if that is true, the window currently has no set input shape */ if ((count == 1) && (rects[0].x == -window->geometry ().border ()) && (rects[0].y == -window->geometry ().border ()) && (rects[0].width == (window->serverWidth () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverHeight () + window->serverGeometry (). border ()))) { count = 0; } *retRects = rects; *retCount = count; *retOrdering = ordering; } /* Shape the input of the window when scaled. * Since the IPW will be dealing with the input, removing input * from the window entirely is a perfectly good solution. */ void ShelfWindow::shapeInput () { Window frame; Display *dpy = screen->dpy(); saveInputShape (&info->inputRects, &info->nInputRects, &info->inputRectOrdering); frame = window->frame(); if (frame) { saveInputShape (&info->frameInputRects, &info->frameNInputRects, &info->frameInputRectOrdering); } else { info->frameInputRects = NULL; info->frameNInputRects = -1; info->frameInputRectOrdering = 0; } /* clear shape */ XShapeSelectInput (dpy, window->id(), NoEventMask); XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); if (frame) XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); XShapeSelectInput (dpy, window->id(), ShapeNotify); } /* Restores the shape of the window: * If the window had a custom shape defined by inputRects then we restore * that in order with XShapeCombineRectangles. * Most windows have no specific defined shape so we can restore it with * setting the shape to a 0x0 mask */ void ShelfWindow::unshapeInput () { Display *dpy = screen->dpy (); if (info->nInputRects) { XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, info->inputRects, info->nInputRects, ShapeSet, info->inputRectOrdering); } else { XShapeCombineMask (dpy, window->id(), ShapeInput, 0, 0, None, ShapeSet); } if (info->frameNInputRects >= 0) { if (info->frameNInputRects) { XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, info->frameInputRects, info->frameNInputRects, ShapeSet, info->frameInputRectOrdering); } else { XShapeCombineMask (dpy, window->frame(), ShapeInput, 0, 0, None, ShapeSet); } } } void ShelfScreen::preparePaint (int msSinceLastPaint) { float steps; steps = (float) msSinceLastPaint / (float) optionGetAnimtime (); if (steps < 0.005) steps = 0.005; /* FIXME: should only loop over all windows if at least one animation is running */ foreach (CompWindow *w, screen->windows ()) ShelfWindow::get (w)->steps = steps; cScreen->preparePaint (msSinceLastPaint); } void ShelfScreen::addWindowToList (ShelfedWindowInfo *info) { shelfedWindows.push_back (info); } void ShelfScreen::removeWindowFromList (ShelfedWindowInfo *info) { shelfedWindows.remove (info); } /* Adjust size and location of the input prevention window */ void ShelfWindow::adjustIPW () { XWindowChanges xwc; Display *dpy = screen->dpy (); float f_width, f_height; if (!info || !info->ipw) return; f_width = window->width () + 2 * window->geometry ().border () + window->border ().left + window->border ().right + 2.0f; f_width *= targetScale; f_height = window->height () + 2 * window->geometry ().border () + window->border ().top + window->border ().bottom + 2.0f; f_height *= targetScale; xwc.x = window->x () - window->border ().left; xwc.y = window->y () - window->border ().top; xwc.width = (int) f_width; xwc.height = (int) f_height; xwc.stack_mode = Below; /* XXX: This causes XConfigureWindow to break */ //xwc.sibling = window->id (); XMapWindow (dpy, info->ipw); XConfigureWindow (dpy, info->ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); } void ShelfScreen::adjustIPWStacking () { foreach (ShelfedWindowInfo *run, shelfedWindows) { if (!run->w->prev || run->w->prev->id () != run->ipw) ShelfWindow::get (run->w)->adjustIPW (); } } /* Create an input prevention window */ void ShelfWindow::createIPW () { Window ipw; XSetWindowAttributes attrib; XWindowChanges xwc; if (!info || info->ipw) return; attrib.override_redirect = true; //attrib.event_mask = 0; ipw = XCreateWindow (screen->dpy (), screen->root (), 0, 0, -100, -100, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); xwc.x = window->serverGeometry ().x () - window->border ().left; xwc.y = window->serverGeometry ().y () - window->border ().top; xwc.width = window->serverGeometry ().width () + window->border ().left + window->border ().right; xwc.height = window->serverGeometry ().height () + window->border ().top + window->border ().bottom; XMapWindow (screen->dpy (), ipw); XConfigureWindow (screen->dpy (), ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); info->ipw = ipw; } ShelfedWindowInfo::ShelfedWindowInfo (CompWindow *window) : w (window), ipw (None), inputRects (NULL), nInputRects (0), inputRectOrdering (0), frameInputRects (NULL), frameNInputRects (0), frameInputRectOrdering (0) { } ShelfedWindowInfo::~ShelfedWindowInfo () { } bool ShelfWindow::handleShelfInfo () { SHELF_SCREEN (screen); if (targetScale == 1.0f && info) { if (info->ipw) XDestroyWindow (screen->dpy (), info->ipw); unshapeInput (); ss->removeWindowFromList (info); delete info; info = NULL; return false; } else if (targetScale != 1.0f && !info) { info = new ShelfedWindowInfo (window); if (!info) return false; shapeInput (); createIPW (); ss->addWindowToList (info); } return true; } /* Sets the scale level and adjust the shape */ void ShelfWindow::scale (float fScale) { if (window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) return; targetScale = MIN (fScale, 1.0f); if ((float) window->width () * targetScale < SHELF_MIN_SIZE) targetScale = SHELF_MIN_SIZE / (float) window->width (); if (handleShelfInfo ()) adjustIPW (); cWindow->addDamage (); } /* Binding for toggle mode. * Toggles through three preset scale levels, * currently hard coded to 1.0f (no scale), 0.5f and 0.25f. */ bool ShelfScreen::trigger (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); if (sw->targetScale > 0.5f) sw->scale (0.5f); else if (sw->targetScale <= 0.5f && sw->targetScale > 0.25) sw->scale (0.25f); else sw->scale (1.0f); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } /* Reset window to 1.0f scale */ bool ShelfScreen::reset (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); sw->scale (1.0f); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } /* Returns the ratio to multiply by to get a window that's 1/ration the * size of the screen. */ static inline float shelfRat (CompWindow *w, float ratio) { float winHeight = (float) w->height (); float winWidth = (float) w->width (); float screenHeight = (float) screen->height (); float screenWidth = (float) screen->width (); float ret; if (winHeight / screenHeight < winWidth / screenWidth) ret = screenWidth / winWidth; else ret = screenHeight / winHeight; return ret / ratio; } bool ShelfScreen::triggerScreen (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); /* FIXME: better should save calculated ratio and reuse it */ if (sw->targetScale > shelfRat (w, 2.0f)) sw->scale (shelfRat (w, 2.0f)); else if (sw->targetScale <= shelfRat (w, 2.0f) && sw->targetScale > shelfRat (w, 3.0f)) sw->scale (shelfRat (w, 3.0f)); else if (sw->targetScale <= shelfRat (w, 3.0f) && sw->targetScale > shelfRat (w, 6.0f)) sw->scale (shelfRat (w, 6.0f)); else sw->scale (1.0f); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } /* shelfInc and shelfDec are matcing functions and bindings; * They increase and decrease the scale factor by 'interval'. */ bool ShelfScreen::inc (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); sw->scale (sw->targetScale / optionGetInterval ()); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } bool ShelfScreen::dec (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (!w) return true; SHELF_WINDOW (w); sw->scale (sw->targetScale * optionGetInterval ()); toggleWindowFunctions (w, true); toggleScreenFunctions (true); return true; } void ShelfWindow::handleButtonPress (unsigned int x, unsigned int y) { SHELF_SCREEN (screen); if (!screen->otherGrabExist ("shelf", 0)) { window->activate (); ss->grabbedWindow = window->id (); ss->grabIndex = screen->pushGrab (screen->cursorCache (XC_fleur), "shelf"); ss->lastPointerX = x; ss->lastPointerY = y; } } void ShelfScreen::handleMotionEvent (unsigned int x, unsigned int y) { CompWindow *w; int dx, dy; if (!grabIndex) return; w = screen->findWindow (grabbedWindow); if (!w) return; dx = x - lastPointerX; dy = y - lastPointerY; w->move (dx, dy, true); lastPointerX += dx; lastPointerY += dy; } void ShelfWindow::handleButtonRelease () { SHELF_SCREEN (screen); ss->grabbedWindow = None; if (ss->grabIndex) { window->moveInputFocusTo (); screen->removeGrab (ss->grabIndex, NULL); ss->grabIndex = 0; } } void ShelfWindow::handleEnter (XEvent *event) { XEvent enterEvent; memcpy (&enterEvent.xcrossing, &event->xcrossing, sizeof (XCrossingEvent)); enterEvent.xcrossing.window = window->id (); XSendEvent (screen->dpy (), window->id (), false, EnterWindowMask, &enterEvent); } CompWindow * ShelfScreen::findRealWindowID (Window wid) { CompWindow *orig; orig = screen->findWindow (wid); if (!orig) return NULL; return ShelfWindow::get (orig)->getRealWindow (); } void ShelfScreen::handleEvent (XEvent *event) { CompWindow *w = NULL, *oldPrev = NULL, *oldNext = NULL; switch (event->type) { case EnterNotify: w = findRealWindowID (event->xcrossing.window); if (w) ShelfWindow::get (w)->handleEnter (event); break; case ButtonPress: w = findRealWindowID (event->xbutton.window); if (w) ShelfWindow::get (w)->handleButtonPress (event->xbutton.x_root, event->xbutton.y_root); break; case ButtonRelease: w = screen->findWindow (grabbedWindow); if (w) ShelfWindow::get (w)->handleButtonRelease (); break; case MotionNotify: handleMotionEvent (event->xmotion.x_root, event->xmotion.y_root); break; case ConfigureNotify: w = screen->findWindow (event->xconfigure.window); if (w) { oldPrev = w->prev; oldNext = w->next; } break; } screen->handleEvent (event); switch (event->type) { case ConfigureNotify: if (w) /* already assigned above */ { if (w->prev != oldPrev || w->next != oldNext) { /* restacking occured, ensure ipw stacking */ adjustIPWStacking (); } } break; } } /* The window was damaged, adjust the damage to fit the actual area we * care about. */ bool ShelfWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; if (mScale != 1.0f) { float xTranslate, yTranslate; xTranslate = window->border ().left * (mScale - 1.0f); yTranslate = window->border ().top * (mScale - 1.0f); cWindow->damageTransformedRect (mScale, mScale, xTranslate, yTranslate, rect); status = true; } status |= cWindow->damageRect (initial, rect); return status; } /* Scale the window if it is supposed to be scaled. * Translate into place. * * FIXME: Merge the two translations. */ bool ShelfWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { if (targetScale != mScale && steps) { mScale += (float) steps * (targetScale - mScale); if (fabsf (targetScale - mScale) < 0.005) mScale = targetScale; } if (mScale != 1.0f) { GLMatrix mTransform = transform; float xTranslate, yTranslate; xTranslate = window->border ().left * (mScale - 1.0f); yTranslate = window->border ().top * (mScale - 1.0f); mTransform.translate (window->x (), window->y (), 0); mTransform.scale (mScale, mScale, 0); mTransform.translate (xTranslate / mScale - window->x (), yTranslate / mScale - window->y (), 0.0f); mask |= PAINT_WINDOW_TRANSFORMED_MASK; return gWindow->glPaint (attrib, mTransform, region, mask); } else { return gWindow->glPaint (attrib, transform, region, mask); } } bool ShelfScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (!shelfedWindows.empty ()) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (attrib, transform, region, output, mask); } /* Checks to see if we need to adjust the window further and hence * damages it's area. Also checks if we still need to paint the area of the * window */ void ShelfScreen::donePaint () { bool stillPainting = false; /* Fixme: should create internal window list */ foreach (CompWindow *w, screen->windows ()) { SHELF_WINDOW (w); if (sw->mScale != sw->targetScale) { sw->cWindow->addDamage (); } if (sw->mScale == 1.0f && sw->targetScale == 1.0f) toggleWindowFunctions (w, false); else stillPainting = true; } if (!stillPainting) toggleScreenFunctions (false); cScreen->donePaint (); } void ShelfWindow::moveNotify (int dx, int dy, bool immediate) { if (targetScale != 1.00f) adjustIPW (); window->moveNotify (dx, dy, immediate); } /* Configuration, initialization, boring stuff. --------------------- */ ShelfScreen::ShelfScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabIndex (0), grabbedWindow (None), lastPointerX (0), lastPointerY (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); optionSetTriggerKeyInitiate (boost::bind (&ShelfScreen::trigger, this, _1, _2, _3)); optionSetResetKeyInitiate (boost::bind (&ShelfScreen::reset, this, _1 , _2, _3)); optionSetTriggerscreenKeyInitiate (boost::bind (&ShelfScreen::triggerScreen, this, _1, _2, _3)); optionSetIncButtonInitiate (boost::bind (&ShelfScreen::inc, this, _1, _2, _3)); optionSetDecButtonInitiate (boost::bind (&ShelfScreen::dec, this, _1, _2, _3)); } ShelfWindow::ShelfWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mScale (1.0f), targetScale (1.0f), steps (0), info (NULL) { WindowInterface::setHandler (window, false); CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); } ShelfWindow::~ShelfWindow () { if (info) { targetScale = 1.0f; /* implicitly frees sw->info */ handleShelfInfo (); } } /* Check for necessary plugin dependencies and for Xorg shape extension. * If we don't have either, bail out */ bool ShelfPluginVTable::init () { if (!screen->XShape ()) { compLogMessage ("shelf", CompLogLevelError, "No Shape extension found. Shelfing not possible \n"); return false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/shelf/shelf.xml.in0000644000004100000410000000467313246301623016267 0ustar www-datawww-data <_short>Shelf <_long>Visually scales a window down to allow easy monitoring without true/traditional resizing. Window Management opengl composite opengl wall decor <_short>Bindings ./plugins/imgjpeg/0000755000004100000410000000000013246301623014346 5ustar www-datawww-data./plugins/imgjpeg/CMakeLists.txt0000644000004100000410000000030113246301623017100 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include (FindJPEG) if (JPEG_FOUND) compiz_plugin (imgjpeg LIBRARIES ${JPEG_LIBRARIES} INCDIRS ${JPEG_INCLUDE_DIR}) endif (JPEG_FOUND) ./plugins/imgjpeg/src/0000755000004100000410000000000013246301623015135 5ustar www-datawww-data./plugins/imgjpeg/src/imgjpeg.cpp0000644000004100000410000001724313246301623017272 0ustar www-datawww-data/* * jpeg.cpp * based on: * beryl-plugins::jpeg.c - adds JPEG image support to beryl. * Copyright: (C) 2006 Nicholas Thomas * Danny Baumann (JPEG writing, option stuff) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "imgjpeg.h" COMPIZ_PLUGIN_20090315 (imgjpeg, JpegPluginVTable) static bool rgbToBGRA (const JSAMPLE *source, void *&data, CompSize &size, int alpha) { int height = size.height (); int width = size.width (); char *dest = (char *) malloc ((unsigned)(height * width * 4)); if (!dest) return false; data = dest; int pos; for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { pos = h * width + w; #if __BYTE_ORDER == __BIG_ENDIAN dest[(pos * 4) + 3] = source[(pos * 3) + 2]; /* blue */ dest[(pos * 4) + 2] = source[(pos * 3) + 1]; /* green */ dest[(pos * 4) + 1] = source[(pos * 3) + 0]; /* red */ dest[(pos * 4) + 0] = alpha; #else dest[(pos * 4) + 0] = (char)source[(pos * 3) + 2]; /* blue */ dest[(pos * 4) + 1] = (char)source[(pos * 3) + 1]; /* green */ dest[(pos * 4) + 2] = (char)source[(pos * 3) + 0]; /* red */ dest[(pos * 4) + 3] = alpha; #endif } } return true; } static bool rgbaToRGB (unsigned char *source, JSAMPLE **dest, CompSize &size, int stride) { int height = size.height (); int width = size.width (); JSAMPLE *d; d = (JSAMPLE *) malloc ((unsigned)height * (unsigned)width * 3 * sizeof (JSAMPLE)); if (!d) return false; *dest = d; int ps = stride / width; /* pixel size */ int pos; for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { pos = h * width + w; #if __BYTE_ORDER == __BIG_ENDIAN d[(pos * 3) + 0] = source[(pos * ps) + 3]; /* red */ d[(pos * 3) + 1] = source[(pos * ps) + 2]; /* green */ d[(pos * 3) + 2] = source[(pos * ps) + 1]; /* blue */ #else d[(pos * 3) + 0] = source[(pos * ps) + 0]; /* red */ d[(pos * 3) + 1] = source[(pos * ps) + 1]; /* green */ d[(pos * 3) + 2] = source[(pos * ps) + 2]; /* blue */ #endif } } return true; } static void jpegErrorExit (j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; struct jpegErrorMgr *err = (struct jpegErrorMgr *) cinfo->err; /* Format the message */ (*cinfo->err->format_message) (cinfo, buffer); printf ("%s\n", buffer); /* Return control to the setjmp point */ longjmp (err->setjmp_buffer, 1); } bool JpegScreen::readJPEG (FILE *file, CompSize &size, void *&data) { if (!file) return false; struct jpeg_decompress_struct cinfo; struct jpegErrorMgr jerr; cinfo.err = jpeg_std_error (&jerr.pub); jerr.pub.error_exit = jpegErrorExit; if (setjmp (jerr.setjmp_buffer)) { /* this is called on decompression errors */ jpeg_destroy_decompress (&cinfo); return false; } jpeg_create_decompress (&cinfo); jpeg_stdio_src (&cinfo, file); jpeg_read_header (&cinfo, true); cinfo.out_color_space = JCS_RGB; jpeg_start_decompress (&cinfo); size.setHeight ((int)cinfo.output_height); size.setWidth ((int)cinfo.output_width); JSAMPLE *buf = (JSAMPLE *) calloc (cinfo.output_height * cinfo.output_width * (unsigned)cinfo.output_components, sizeof (JSAMPLE)); if (!buf) { jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); return false; } JSAMPROW *rows = (JSAMPROW *) malloc (cinfo.output_height * sizeof (JSAMPROW)); if (!rows) { free (buf); jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); return false; } for (unsigned int i = 0; i < cinfo.output_height; ++i) rows[i] = &buf[i * cinfo.output_width * (unsigned)cinfo.output_components]; while (cinfo.output_scanline < cinfo.output_height) jpeg_read_scanlines (&cinfo, &rows[cinfo.output_scanline], cinfo.output_height - cinfo.output_scanline); jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); /* convert the rgb data into BGRA format */ bool result = rgbToBGRA (buf, data, size, 255); free (rows); free (buf); return result; } bool JpegScreen::writeJPEG (unsigned char *buffer, FILE *file, CompSize &size, int stride) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; JSAMPLE *data; /* convert the rgb data into BGRA format */ if (!rgbaToRGB (buffer, &data, size, stride)) return false; cinfo.err = jpeg_std_error (&jerr); jpeg_create_compress (&cinfo); jpeg_stdio_dest (&cinfo, file); cinfo.image_width = (unsigned) size.width (); cinfo.image_height = (unsigned) size.height (); cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults (&cinfo); jpeg_set_quality (&cinfo, optionGetQuality (), true); jpeg_start_compress (&cinfo, true); while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &data[(cinfo.image_height - cinfo.next_scanline - 1) * (unsigned) size.width () * 3]; jpeg_write_scanlines (&cinfo, row_pointer, 1); } jpeg_finish_compress (&cinfo); jpeg_destroy_compress (&cinfo); free (data); return true; } CompString JpegScreen::fileNameWithExtension (CompString &path) { unsigned int len = path.length (); if ((len > 5 && path.substr (len - 5, 5) == ".jpeg") || (len > 4 && path.substr (len - 4, 4) == ".jpg")) return path; return path + ".jpeg"; } bool JpegScreen::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { bool status = false; CompString fileName = fileNameWithExtension (path); if (format == "jpeg" || format == "jpg" || !(status = screen->imageToFile (path, format, size, stride, data))) { FILE *file = fopen (fileName.c_str (), "wb"); if (file) { status = writeJPEG ((unsigned char *) data, file, size, stride); fclose (file); } } return status; } bool JpegScreen::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { bool status = false; CompString fileName = fileNameWithExtension (name); FILE *file = fopen (fileName.c_str (), "rb"); if (file) { status = readJPEG (file, size, data); fclose (file); } if (status) { stride = size.width () * 4; return true; } /* Isn't a JPEG - pass to the next in the chain. */ return screen->fileToImage (name, size, stride, data); } JpegScreen::JpegScreen (CompScreen *screen) : PluginClassHandler (screen) { ScreenInterface::setHandler (screen, true); } bool JpegPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/imgjpeg/src/imgjpeg.h0000644000004100000410000000451313246301623016733 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include "imgjpeg_options.h" struct jpegErrorMgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; class JpegScreen : public ScreenInterface, public PluginClassHandler, public ImgjpegOptions { public: JpegScreen (CompScreen *screen); bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); bool imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data); private: CompString fileNameWithExtension (CompString &path); bool readJPEG (FILE *file, CompSize &size, void *&data); bool writeJPEG (unsigned char *buffer, FILE *file, CompSize &size, int stride); }; class JpegPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/imgjpeg/imgjpeg.xml.in0000644000004100000410000000124613246301623017122 0ustar www-datawww-data <_short>JPEG <_long>JPEG image format plugin Image Loading imageext:jpeg imageext:jpg imagemime:image/jpeg composite opengl ./plugins/compiztoolbox/0000755000004100000410000000000013246301624015635 5ustar www-datawww-data./plugins/compiztoolbox/CMakeLists.txt0000644000004100000410000000020413246301623020370 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (compiztoolbox PLUGINDEPS composite opengl LIBRARIES Xrender) ./plugins/compiztoolbox/include/0000755000004100000410000000000013246301623017257 5ustar www-datawww-data./plugins/compiztoolbox/include/compiztoolbox/0000755000004100000410000000000013246301624022170 5ustar www-datawww-data./plugins/compiztoolbox/include/compiztoolbox/compiztoolbox.h0000644000004100000410000001147113246301623025254 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_COMPIZTOOLBOX_H #define _COMPIZ_COMPIZTOOLBOX_H #include #include #include #include #include #include #include #include #include #include #define COMPIZ_COMPIZTOOLBOX_ABI 3 typedef enum { XDGUserDirDesktop = 0, XDGUserDirDownload, XDGUserDirTemplates, XDGUserDirPublicshare, XDGUserDirDocuments, XDGUserDirMusic, XDGUserDirPictures, XDGUserDirVideos } XDGUserDir; CompString getXDGUserDir (XDGUserDir userDir); typedef enum { CurrentViewport = 0, AllViewports, Panels, Group } SwitchWindowSelection; class BaseSwitchScreen { public: BaseSwitchScreen (CompScreen *screen); virtual ~BaseSwitchScreen () {} void handleEvent (XEvent *); void setSelectedWindowHint (bool focus); void activateEvent (bool activating); void updateForegroundColor (); void updateBackground (bool useBackgroundColor, unsigned short backgroundColor[]); CompWindow *switchToWindow (bool toNext, bool autoChangeVPOption, bool focus); static bool compareWindows (CompWindow *w1, CompWindow *w2); static Visual *findArgbVisual (Display *dpy, int scr); virtual void windowRemove (CompWindow *w) {} virtual void doWindowDamage (CompWindow *w); virtual void handleSelectionChange (bool toNext, int nextIdx) {} virtual void getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption); virtual bool getMipmap () { return false; } CompositeScreen *cScreen; GLScreen *gScreen; PropertyWriter selectWinAtom; Atom selectFgColorAtom; CountedList windows; Window popupWindow; CompWindow *selectedWindow; unsigned int lastActiveNum; CompScreen::GrabHandle grabIndex; bool moreAdjust; SwitchWindowSelection selection; unsigned int fgColor[4]; bool ignoreSwitcher; }; class BaseSwitchWindow { public: enum IconMode { HideIcon, /* show thumbnail, but hide icon */ ShowIcon, /* show thumbnail and icon */ ShowIconOnly /* show only icon */ }; BaseSwitchWindow (BaseSwitchScreen *, CompWindow *); virtual ~BaseSwitchWindow () {} void paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y, int width1, int height1, int width2, int height2); virtual void updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon) {} virtual void updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon) {} virtual IconMode getIconMode () { return HideIcon; } virtual void updateIconPos (int &wx, int &wy, int x, int y, float width, float height) {} bool damageRect (bool, const CompRect &); bool isSwitchWin (bool removing = false); BaseSwitchScreen *baseScreen; GLWindow *gWindow; CompositeWindow *cWindow; GLScreen *gScreen; CompWindow *window; }; extern const unsigned short ICON_SIZE; extern const unsigned short MAX_ICON_SIZE; #endif ./plugins/compiztoolbox/compiztoolbox.xml.in0000644000004100000410000000061213246301623021672 0ustar www-datawww-data <_short>Compiz Library Toolbox <_long>Commonly used routines by plugins separated into a separate library Utility composite opengl ./plugins/compiztoolbox/src/0000755000004100000410000000000013246301624016424 5ustar www-datawww-data./plugins/compiztoolbox/src/compiztoolbox.cpp0000644000004100000410000004315513246301623022047 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include "compiztoolbox_options.h" #include #include const unsigned short ICON_SIZE = 512; const unsigned short MAX_ICON_SIZE = 512; bool openGLAvailable; class CompizToolboxScreen : public PluginClassHandler , public CompiztoolboxOptions { public: CompizToolboxScreen (CompScreen *); }; class CompizToolboxPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (compiztoolbox, CompizToolboxPluginVTable) CompString getXDGUserDir (XDGUserDir userDir) { std::ifstream userDirsFile; CompString userDirsFilePath; const char *userDirsPathSuffix = "/user-dirs.dirs"; const char *varNames[8] = { "XDG_DESKTOP_DIR", "XDG_DOWNLOAD_DIR", "XDG_TEMPLATES_DIR", "XDG_PUBLICSHARE_DIR", "XDG_DOCUMENTS_DIR", "XDG_MUSIC_DIR", "XDG_PICTURES_DIR", "XDG_VIDEOS_DIR" }; const char *varName = varNames[userDir]; size_t varLength = strlen (varName); char *home = getenv ("HOME"); if (!(home && strlen (home))) return ""; char *configHome = getenv ("XDG_CONFIG_HOME"); if (configHome && strlen (configHome)) { userDirsFilePath = configHome; userDirsFilePath += userDirsPathSuffix; } else { userDirsFilePath = home; userDirsFilePath = userDirsFilePath + "/.config" + userDirsPathSuffix; } userDirsFile.open (userDirsFilePath.c_str (), std::ifstream::in); if (!userDirsFile.is_open ()) return ""; // The user-dirs file has lines like: // XDG_DESKTOP_DIR="$HOME/Desktop" // Read it line by line until the desired directory is found. while (!userDirsFile.eof()) { CompString line; getline (userDirsFile, line); size_t varPos = line.find (varName); if (varPos != CompString::npos) // if found { userDirsFile.close (); // Skip the =" part size_t valueStartPos = varPos + varLength + 2; // Ignore the " at the end CompString value = line.substr (valueStartPos, line.length () - valueStartPos - 1); if (value.substr (0, 5) == "$HOME") return CompString (home) + value.substr (5); else if (value.substr (0, 7) == "${HOME}") return CompString (home) + value.substr (7); else return value; } } userDirsFile.close (); return ""; } void BaseSwitchScreen::updateBackground(bool useBackgroundColor, unsigned short backgroundColor[]) { if (!popupWindow) return; unsigned long background_pixel = 0ul; if (useBackgroundColor) { background_pixel = ((((static_cast(backgroundColor [3]) * backgroundColor [2]) >> 24) & 0x0000ff) | (((backgroundColor [3] * backgroundColor [1]) >> 16) & 0x00ff00) | (((backgroundColor [3] * backgroundColor [0]) >> 8) & 0xff0000) | (((backgroundColor [3] & 0xff00) << 16))); } XSetWindowBackground (screen->dpy(), popupWindow, background_pixel); } void BaseSwitchScreen::setSelectedWindowHint (bool focus) { Window selectedWindowId = None; CompOption::Vector opts; CompOption::Value v; if (selectedWindow && !selectedWindow->destroyed ()) { selectedWindowId = selectedWindow->id (); /* FIXME: Changing the input focus here will * screw up the ordering of windows in * the switcher, so we probably want to avoid that */ if (focus) selectedWindow->moveInputFocusTo (); } v = CompOption::Value ((int) selectedWindowId); opts = selectWinAtom.getReadTemplate (); opts.at (0).set (v); selectWinAtom.updateProperty (popupWindow, opts, XA_WINDOW); } void BaseSwitchScreen::getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption) { minimizedOption = false; matchOption = NULL; } bool BaseSwitchWindow::isSwitchWin (bool removing) { bool minimizedOption; CompMatch *matchOption; baseScreen->getMinimizedAndMatch (minimizedOption, matchOption); if (!removing && window->destroyed ()) return false; if (!removing && (!window->isViewable () || !window->isMapped ())) { if (minimizedOption) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else { return false; } } if (!window->isFocussable ()) return false; if (window->overrideRedirect ()) return false; if (baseScreen->selection == Panels) { if (!(window->type () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask))) return false; } else { if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return false; if (window->state () & CompWindowStateSkipTaskbarMask) return false; if (matchOption && !matchOption->evaluate (window)) return false; } if (!removing && baseScreen->selection == CurrentViewport) { if (!window->mapNum () || !window->isViewable ()) { const CompWindow::Geometry &sg = window->serverGeometry (); if (sg.x () + sg.width () <= 0 || sg.y () + sg.height () <= 0 || sg.x () >= (int) ::screen->width () || sg.y () >= (int) ::screen->height ()) return false; } else { if (!window->focus ()) return false; } } return true; } void BaseSwitchScreen::activateEvent (bool activating) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) ::screen->root ()); o[1].value ().set (activating); ::screen->handleCompizEvent ("switcher", "activate", o); } bool BaseSwitchScreen::compareWindows (CompWindow *w1, CompWindow *w2) { if (w1->mapNum () && !w2->mapNum ()) return true; if (w2->mapNum () && !w1->mapNum ()) return false; return w2->activeNum () < w1->activeNum (); } CompWindow * BaseSwitchScreen::switchToWindow (bool toNext, bool autoChangeVPOption, bool focus) { CompWindow *w = NULL; CompWindowList::iterator it; int cur = 0; int nextIdx = 0; if (!grabIndex) return NULL; for (it = windows.begin (); it != windows.end (); ++it, ++cur) { if (*it == selectedWindow) break; } if (it == windows.end ()) return NULL; if (toNext) { ++it; if (it == windows.end ()) w = windows.front (); else w = *it; nextIdx = (cur + 1) % windows.size (); } else { if (it == windows.begin ()) w = windows.back (); else w = *--it; nextIdx = (cur + windows.size () - 1) % windows.size (); } if (w) { CompWindow *old = selectedWindow; if (selection == AllViewports && autoChangeVPOption) { XEvent xev; CompPoint pnt = w->defaultViewport (); xev.xclient.type = ClientMessage; xev.xclient.display = ::screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = Atoms::desktopViewport; xev.xclient.window = ::screen->root (); xev.xclient.data.l[0] = pnt.x () * ::screen->width (); xev.xclient.data.l[1] = pnt.y () * ::screen->height (); xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (::screen->dpy (), ::screen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } lastActiveNum = w->activeNum (); selectedWindow = w; if (old != w) handleSelectionChange (toNext, nextIdx); if (popupWindow) { CompWindow *popup; popup = ::screen->findWindow (popupWindow); if (popup) CompositeWindow::get (popup)->addDamage (); setSelectedWindowHint (focus); } doWindowDamage (w); if (old && !old->destroyed ()) doWindowDamage (old); } return w; } void BaseSwitchScreen::doWindowDamage (CompWindow *w) { CompositeWindow::get (w)->addDamage (); } Visual * BaseSwitchScreen::findArgbVisual (Display *dpy, int scr) { XVisualInfo *xvi; XVisualInfo temp; int nvi; int i; XRenderPictFormat *format; Visual *visual; temp.screen = scr; temp.depth = 32; temp.c_class = TrueColor; xvi = XGetVisualInfo (dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &temp, &nvi); if (!xvi) return 0; visual = 0; for (i = 0; i < nvi; i++) { format = XRenderFindVisualFormat (dpy, xvi[i].visual); if (format->type == PictTypeDirect && format->direct.alphaMask) { visual = xvi[i].visual; break; } } XFree (xvi); return visual; } void BaseSwitchWindow::paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y, int width1, int height1, int width2, int height2) { if (!openGLAvailable) return; GLWindowPaintAttrib sAttrib (attrib); IconMode iconMode; int wx, wy; float width, height; GLTexture *icon = NULL; const CompWindow::Geometry &g = window->geometry (); mask |= PAINT_WINDOW_TRANSFORMED_MASK; if (gWindow->textures ().empty ()) iconMode = ShowIconOnly; else iconMode = getIconMode (); if (window->mapNum ()) { if (gWindow->textures ().empty ()) gWindow->bind (); } if (iconMode != ShowIconOnly) { GLenum filter; GLMatrix wTransform (transform); int ww, wh; int addWindowGeometryIndex = gWindow->glAddGeometryGetCurrentIndex (); width = width1; height = height1; ww = window->borderRect ().width (); wh = window->borderRect ().height (); if (ww > width) sAttrib.xScale = width / ww; else sAttrib.xScale = 1.0f; if (wh > height) sAttrib.yScale = height / wh; else sAttrib.yScale = 1.0f; if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; width = ww * sAttrib.xScale; height = wh * sAttrib.yScale; updateIconPos (wx, wy, x, y, width, height); sAttrib.xTranslate = wx - g.x () + window->border ().left * sAttrib.xScale; sAttrib.yTranslate = wy - g.y () + window->border ().top * sAttrib.yScale; if (window->alpha () || sAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (g.x (), g.y (), 0.0f); wTransform.scale (sAttrib.xScale, sAttrib.yScale, 1.0f); wTransform.translate (sAttrib.xTranslate / sAttrib.xScale - g.x (), sAttrib.yTranslate / sAttrib.yScale - g.y (), 0.0f); filter = gScreen->textureFilter (); if (baseScreen->getMipmap ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); /* XXX: replacing the addWindowGeometry function like this is very ugly but necessary until the vertex stage has been made fully pluggable. */ gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); gWindow->glDraw (wTransform, sAttrib, CompRegion::infinite (), mask); gWindow->glAddGeometrySetCurrentIndex (addWindowGeometryIndex); gScreen->setTextureFilter (filter); if (iconMode != HideIcon) { icon = gWindow->getIcon (MAX_ICON_SIZE, MAX_ICON_SIZE); if (icon) updateIconTexturedWindow (sAttrib, wx, wy, x, y, icon); } } else { width = width2; height = height2; /* try to get a matching icon first */ icon = gWindow->getIcon (width, height); /* if none found, try a large one */ if (!icon) icon = gWindow->getIcon (MAX_ICON_SIZE, MAX_ICON_SIZE); if (!icon) icon = gScreen->defaultIcon (); if (icon) updateIconNontexturedWindow (sAttrib, wx, wy, width, height, x, y, icon); } if (icon) { CompRegion iconReg (g.x (), g.y (), icon->width (), icon->height ()); GLTexture::MatrixList matrix (1); int addWindowGeometryIndex = gWindow->glAddGeometryGetCurrentIndex (); mask |= PAINT_WINDOW_BLEND_MASK; matrix[0] = icon->matrix (); matrix[0].x0 -= (g.x () * matrix[0].xx); matrix[0].y0 -= (g.y () * matrix[0].yy); sAttrib.xTranslate = wx - g.x (); sAttrib.yTranslate = wy - g.y (); gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometrySetCurrentIndex (MAXSHORT); gWindow->glAddGeometry (matrix, iconReg, CompRegion::infinite ()); gWindow->glAddGeometrySetCurrentIndex (addWindowGeometryIndex); if (gWindow->vertexBuffer ()->end ()) { GLMatrix wTransform (transform); wTransform.translate (g.x (), g.y (), 0.0f); wTransform.scale (sAttrib.xScale, sAttrib.yScale, 1.0f); wTransform.translate (sAttrib.xTranslate / sAttrib.xScale - g.x (), sAttrib.yTranslate / sAttrib.yScale - g.y (), 0.0f); gWindow->glDrawTexture (icon, wTransform, sAttrib, mask); } } } bool BaseSwitchWindow::damageRect (bool initial, const CompRect &rect) { if (!openGLAvailable) return true; if (baseScreen->grabIndex) { CompWindow *popup; popup = ::screen->findWindow (baseScreen->popupWindow); if (popup) { foreach (CompWindow *w, baseScreen->windows) { if (window == w) { CompositeWindow::get (popup)->addDamage (); break; } } } } return cWindow->damageRect (initial, rect); } void BaseSwitchScreen::updateForegroundColor () { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; if (!popupWindow) return; result = XGetWindowProperty (::screen->dpy (), popupWindow, selectFgColorAtom, 0L, 4L, false, XA_INTEGER, &actual, &format, &n, &left, &propData); if (result == Success && n && propData) { if (n == 3 || n == 4) { long *data = (long *) propData; fgColor[0] = MIN (0xffff, data[0]); fgColor[1] = MIN (0xffff, data[1]); fgColor[2] = MIN (0xffff, data[2]); if (n == 4) fgColor[3] = MIN (0xffff, data[3]); } XFree (propData); } else { fgColor[0] = 0; fgColor[1] = 0; fgColor[2] = 0; fgColor[3] = 0xffff; } } void BaseSwitchScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; switch (event->type) { case DestroyNotify: /* We need to get the CompWindow * for event->xdestroywindow.window here because in the ::screen->handleEvent call below, that CompWindow's id will become 1, so findWindowAtDisplay won't be able to find the CompWindow after that. */ w = ::screen->findWindow (event->xdestroywindow.window); break; default: break; } ::screen->handleEvent (event); switch (event->type) { case UnmapNotify: w = ::screen->findWindow (event->xunmap.window); windowRemove (w); break; case DestroyNotify: windowRemove (w); break; case PropertyNotify: if (event->xproperty.atom == selectFgColorAtom) { if (event->xproperty.window == popupWindow) updateForegroundColor (); } break; default: break; } } BaseSwitchScreen::BaseSwitchScreen (CompScreen *screen) : popupWindow (None), selectedWindow (NULL), lastActiveNum (0), grabIndex (NULL), moreAdjust (false), selection (CurrentViewport), ignoreSwitcher (false) { CompOption::Vector atomTemplate; CompOption::Value v; CompOption o; if (openGLAvailable) { cScreen = CompositeScreen::get (screen); gScreen = GLScreen::get (screen); } o.setName ("id", CompOption::TypeInt); atomTemplate.push_back (o); selectWinAtom = PropertyWriter (CompString (DECOR_SWITCH_WINDOW_ATOM_NAME), atomTemplate); selectFgColorAtom = XInternAtom (::screen->dpy (), DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, 0); fgColor[0] = 0; fgColor[1] = 0; fgColor[2] = 0; fgColor[3] = 0xffff; } BaseSwitchWindow::BaseSwitchWindow (BaseSwitchScreen *ss, CompWindow *w) : baseScreen (ss), window (w) { if (openGLAvailable) { gWindow = GLWindow::get (w); cWindow = CompositeWindow::get (w); gScreen = GLScreen::get (screen); } } CompizToolboxScreen::CompizToolboxScreen (CompScreen *screen) : PluginClassHandler (screen) { } bool CompizToolboxPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) openGLAvailable = true; else openGLAvailable = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_COMPIZTOOLBOX_ABI; screen->storeValue ("compiztoolbox_ABI", p); return true; } return false; } void CompizToolboxPluginVTable::fini () { screen->eraseValue ("compiztoolbox_ABI"); } ./plugins/compiztoolbox/compiz-compiztoolbox.pc.in0000644000004100000410000000042613246301623022776 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-compiztoolbox Description: Toolbox library plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lcompiztoolbox Cflags: @COMPIZ_CFLAGS@ ./plugins/staticswitcher/0000755000004100000410000000000013246301624015765 5ustar www-datawww-data./plugins/staticswitcher/CMakeLists.txt0000644000004100000410000000020113246301623020515 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (staticswitcher PLUGINDEPS composite opengl compiztoolbox) ./plugins/staticswitcher/src/0000755000004100000410000000000013246301624016554 5ustar www-datawww-data./plugins/staticswitcher/src/staticswitcher.h0000644000004100000410000001102613246301623021764 0ustar www-datawww-data/* * * Compiz application switcher plugin * * staticswitcher.h * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Based on switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include #include #include "staticswitcher_options.h" class StaticSwitchScreen : public BaseSwitchScreen, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public StaticswitcherOptions { public: StaticSwitchScreen (CompScreen *screen); ~StaticSwitchScreen (); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void updatePopupWindow (); void updateWindowList (); void createWindowList (); bool getPaintRectangle (CompWindow *w, CompRect &rect, int *opacity); void doWindowDamage (CompWindow *w); void handleSelectionChange (bool toNext, int nextIdx); void createPopup (); bool showPopup (); Cursor getCursor (bool mouseSelectOn); void initiate (SwitchWindowSelection selection, bool shouldShowPopup); void windowRemove (CompWindow *w); int getRowXOffset (int y); void getWindowPosition (unsigned int index, int *x, int *y); CompWindow *findWindowAt (int x, int y); void handleEvent (XEvent *event); bool adjustVelocity (); void paintRect (const GLMatrix &transform, CompRect &box, int offset, unsigned short *color, unsigned short opacity); void paintSelectionRect (const GLMatrix &transform, int x, int y, float dx, float dy, unsigned int opacity); void getMinimizedAndMatch (bool &minimizedOption, CompMatch *&match); bool getMipmap (); Window lastActiveWindow; CompTimer popupDelayTimer; Window clientLeader; int previewWidth; int previewHeight; int previewBorder; int xCount; bool switching; GLfloat mVelocity; float pos; float move; bool mouseSelect; }; class StaticSwitchWindow : public BaseSwitchWindow, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler { public: StaticSwitchWindow (CompWindow *window); bool isSwitchWin (bool removing = false); bool damageRect (bool initial, const CompRect &rect); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void paintThumb (const GLWindowPaintAttrib &, const GLMatrix &, unsigned int, int, int); void updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon); void updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon); void updateIconPos (int &wx, int &wy, int x, int y, float width, float height); IconMode getIconMode (); StaticSwitchScreen *sScreen; }; extern const unsigned short MAX_ICON_SIZE; extern const unsigned short PREVIEWSIZE; extern const unsigned short BORDER; #define SWITCH_SCREEN(s) \ StaticSwitchScreen *ss = StaticSwitchScreen::get (s) #define SWITCH_WINDOW(w) \ StaticSwitchWindow *sw = StaticSwitchWindow::get (w) class StaticSwitchPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/staticswitcher/src/staticswitcher.cpp0000644000004100000410000010534313246301623022325 0ustar www-datawww-data/* * * Compiz application switcher plugin * * staticswitcher.cpp * * Copyright : (C) 2008 by Danny Baumann * E-mail : maniac@compiz-fusion.org * * Based on switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "staticswitcher.h" COMPIZ_PLUGIN_20090315 (staticswitcher, StaticSwitchPluginVTable) const unsigned short ICON_SIZE = 48; const unsigned short PREVIEWSIZE = 150; const unsigned short BORDER = 10; void StaticSwitchScreen::updatePopupWindow () { int newXCount, newYCount; int winWidth, winHeight; float aspect; int count = windows.size (); double dCount = count; int w = PREVIEWSIZE, h = PREVIEWSIZE, b = BORDER; int x, y; XSizeHints xsh; /* maximum window size is 2/3 of the current output */ winWidth = ::screen->currentOutputDev ().width () * 2 / 3; winHeight = ::screen->currentOutputDev ().height () * 2 / 3; if (count <= 4) { /* don't put 4 or less windows in multiple rows */ newXCount = count; newYCount = 1; } else { aspect = (float) winWidth / winHeight; /* round is available in C99 only, so use a replacement for that */ newYCount = floor (sqrt (dCount / aspect) + 0.5f); newXCount = ceil (dCount / newYCount); } while ((w + b) * newXCount > winWidth || (h + b) * newYCount > winHeight) { /* shrink by 10% until all windows fit */ w = w * 9 / 10; h = h * 9 / 10; b = b * 9 / 10; } winWidth = MIN (count, newXCount); winHeight = (count + newXCount - 1) / newXCount; winWidth = winWidth * w + (winWidth + 1) * b; winHeight = winHeight * h + (winHeight + 1) * b; xCount = MIN (newXCount, count); previewWidth = w; previewHeight = h; previewBorder = b; x = ::screen->currentOutputDev ().region ()->extents.x1 + ::screen->currentOutputDev ().width () / 2; y = ::screen->currentOutputDev ().region ()->extents.y1 + ::screen->currentOutputDev ().height () / 2; xsh.flags = PSize | PPosition | PWinGravity; xsh.x = x; xsh.y = y; xsh.width = winWidth; xsh.height = winHeight; xsh.win_gravity = StaticGravity; XSetWMNormalHints (::screen->dpy (), popupWindow, &xsh); CompWindow *popup = screen->findWindow (popupWindow); XWindowChanges xwc; unsigned int valueMask = 0; valueMask |= (CWX | CWY | CWWidth | CWHeight); xwc.x = x - winWidth / 2; xwc.y = y - winHeight / 2; xwc.width = winWidth; xwc.height = winHeight; if (popup) popup->configureXWindow (valueMask, &xwc); else XConfigureWindow (::screen->dpy (), popupWindow, valueMask, &xwc); } void StaticSwitchScreen::updateWindowList () { pos = 0; move = 0; selectedWindow = windows.front (); if (popupWindow) updatePopupWindow (); } void StaticSwitchScreen::createWindowList () { windows.clear (); foreach (CompWindow *w, ::screen->windows ()) { SWITCH_WINDOW (w); if (sw->isSwitchWin ()) { windows.push_back (w); sw->cWindow->damageRectSetEnabled (sw, true); } } windows.sort (BaseSwitchScreen::compareWindows); updateWindowList (); } bool StaticSwitchWindow::damageRect (bool initial, const CompRect &rect) { return BaseSwitchWindow::damageRect (initial, rect); } BaseSwitchWindow::IconMode StaticSwitchWindow::getIconMode () { if (sScreen->optionGetIconOnly ()) return ShowIconOnly; if (!sScreen->optionGetIcon ()) return HideIcon; return ShowIcon; } bool StaticSwitchScreen::getPaintRectangle (CompWindow *w, CompRect &rect, int *opacity) { int mode; mode = optionGetHighlightRectHidden (); if (w->isViewable () || w->shaded ()) { rect = w->borderRect (); return true; } else if (mode == HighlightRectHiddenTaskbarEntry && (w->iconGeometry ().x1 () != 0 || w->iconGeometry ().y1 () != 0 || w->iconGeometry ().x2 () != 0 || w->iconGeometry ().y2 () != 0)) { rect = w->iconGeometry (); return true; } else if (mode == HighlightRectHiddenOriginalWindowPosition) { rect = w->serverBorderRect (); if (opacity) *opacity /= 4; return true; } return false; } void StaticSwitchScreen::doWindowDamage (CompWindow *w) { if (w->isViewable () || w->shaded ()) { CompositeWindow::get (w)->addDamage (); } else { CompRect box; if (getPaintRectangle (w, box, NULL)) { CompRect boxExtended (box.x () - 2, box.y () - 2, box.width () + 4, box.height () + 4); cScreen->damageRegion (CompRegion (boxExtended)); } } } void StaticSwitchScreen::handleSelectionChange (bool toNext, int nextIdx) { move = nextIdx; moreAdjust = true; } void StaticSwitchScreen::createPopup () { if (!popupWindow) { Display *dpy = ::screen->dpy (); XWMHints xwmh; XClassHint xch; Atom state[4]; int nState = 0; XSetWindowAttributes attr; Visual *visual; visual = findArgbVisual (dpy, ::screen->screenNum ()); if (!visual) return; xwmh.flags = InputHint; xwmh.input = 0; xch.res_name = (char *)"compiz"; xch.res_class = (char *)"switcher-window"; attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap (dpy, ::screen->root (), visual, AllocNone); attr.override_redirect = 1; popupWindow = XCreateWindow (dpy, ::screen->root (), -1, -1, 1, 1, 0, 32, InputOutput, visual, CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect, &attr); XSetWMProperties (dpy, popupWindow, NULL, NULL, programArgv, programArgc, NULL, &xwmh, &xch); state[nState++] = Atoms::winStateAbove; state[nState++] = Atoms::winStateSticky; state[nState++] = Atoms::winStateSkipTaskbar; state[nState++] = Atoms::winStateSkipPager; XChangeProperty (dpy, popupWindow, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, nState); XChangeProperty (dpy, popupWindow, Atoms::winType, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winTypeUtil, 1); ::screen->setWindowProp (popupWindow, Atoms::winDesktop, 0xffffffff); updateBackground(optionGetUseBackgroundColor(), optionGetBackgroundColor()); setSelectedWindowHint (false); updatePopupWindow (); } } bool StaticSwitchScreen::showPopup () { /* Always checks for an existing popup */ createPopup (); XMapWindow (::screen->dpy (), popupWindow); cScreen->damageScreen (); popupDelayTimer.stop (); return false; } Cursor StaticSwitchScreen::getCursor (bool mouseSelectOn) { if (mouseSelectOn) return ::screen->normalCursor (); return ::screen->invisibleCursor (); } void StaticSwitchScreen::initiate (SwitchWindowSelection selection, bool shouldShowPopup) { bool noSwitchWindows; bool newMouseSelect; if (::screen->otherGrabExist ("switcher", "scale", "cube", 0)) return; this->selection = selection; selectedWindow = NULL; noSwitchWindows = true; foreach (CompWindow *w, ::screen->windows ()) { if (StaticSwitchWindow::get (w)->isSwitchWin ()) { noSwitchWindows = false; break; } } if (noSwitchWindows) return; newMouseSelect = optionGetMouseSelect () && selection != Panels && shouldShowPopup; if (!grabIndex) grabIndex = ::screen->pushGrab (getCursor (newMouseSelect), "switcher"); else if (newMouseSelect != mouseSelect) ::screen->updateGrab (grabIndex, getCursor (newMouseSelect)); mouseSelect = newMouseSelect; if (grabIndex) { if (!switching) { lastActiveNum = ::screen->activeNum (); createWindowList (); if (shouldShowPopup) { unsigned int delay; delay = optionGetPopupDelay () * 1000; if (delay) { if (popupDelayTimer.active ()) popupDelayTimer.stop (); popupDelayTimer.start (boost::bind (&StaticSwitchScreen::showPopup, this), delay, delay * 1.2); } else { showPopup (); } setSelectedWindowHint (optionGetFocusOnSwitch ()); } lastActiveWindow = screen->activeWindow (); activateEvent (true); } cScreen->damageScreen (); switching = true; moreAdjust = true; ::screen->handleEventSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); foreach (CompWindow *w, ::screen->windows ()) { SWITCH_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, true); } } } static bool switchTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (action) action->setState (action->state () & (unsigned)~(CompAction::StateTermKey | CompAction::StateTermButton)); if (xid && xid != ::screen->root ()) return false; SWITCH_SCREEN (screen); if (ss->grabIndex) { if (ss->popupDelayTimer.active ()) ss->popupDelayTimer.stop (); if (ss->popupWindow) XUnmapWindow (::screen->dpy (), ss->popupWindow); ss->switching = false; if (state & CompAction::StateCancel) ss->selectedWindow = NULL; if (state && ss->selectedWindow && !ss->selectedWindow->destroyed ()) ::screen->sendWindowActivationRequest (ss->selectedWindow->id ()); ::screen->removeGrab (ss->grabIndex, 0); ss->grabIndex = NULL; if (!ss->popupWindow) ::screen->handleEventSetEnabled (ss, false); ss->selectedWindow = NULL; if (screen->activeWindow () != ss->lastActiveWindow) { CompWindow *w = screen->findWindow (ss->lastActiveWindow); if (w) w->moveInputFocusTo (); } ss->setSelectedWindowHint (false); ss->lastActiveNum = 0; ss->cScreen->damageScreen (); } return false; } static bool switchInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options, SwitchWindowSelection selection, bool shouldShowPopup, bool nextWindow) { Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "root"); if (xid != ::screen->root ()) return false; SWITCH_SCREEN (::screen); if (!ss->switching) { if (selection == Group) { CompWindow *w; Window xid; xid = (Window) CompOption::getIntOptionNamed (options, "window"); w = ::screen->findWindow (xid); if (w) ss->clientLeader = (w->clientLeader ()) ? w->clientLeader () : xid; else ss->clientLeader = None; } ss->initiate (selection, shouldShowPopup); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); else if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } ss->switchToWindow (nextWindow, ss->optionGetAutoChangeVp (), ss->optionGetFocusOnSwitch ()); return false; } void StaticSwitchScreen::getMinimizedAndMatch (bool &minimizedOption, CompMatch *&matchOption) { minimizedOption = optionGetMinimized (); matchOption = &optionGetWindowMatch (); } bool StaticSwitchScreen::getMipmap () { return optionGetMipmap (); } void StaticSwitchScreen::windowRemove (CompWindow *w) { if (w) { bool inList = false; CompWindow *selected; CompWindow *old; SWITCH_WINDOW (w); if (!sw->isSwitchWin (true)) return; sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); old = selected = selectedWindow; CompWindowList::iterator it = windows.begin (); while (it != windows.end ()) { if (*it == w) { inList = true; if (w == selected) { ++it; if (it == windows.end ()) selected = windows.front (); else selected = *it; --it; } CompWindowList::iterator del = it; ++it; windows.erase (del); } else ++it; } if (!inList) return; if (windows.size () == 0) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) ::screen->root ()); switchTerminate (NULL, 0, o); return; } if (!grabIndex) return; updateWindowList (); int i = 0; foreach (CompWindow *w, windows) { selectedWindow = w; move = pos = i; if (selectedWindow == selected) break; i++; } if (popupWindow) { CompWindow *popup; popup = ::screen->findWindow (popupWindow); if (popup) CompositeWindow::get (popup)->addDamage (); setSelectedWindowHint (optionGetFocusOnSwitch ()); } if (old != selectedWindow) { CompositeWindow::get (selectedWindow)->addDamage (); CompositeWindow::get (w)->addDamage (); if (old && !old->destroyed ()) CompositeWindow::get (old)->addDamage (); moreAdjust = true; } } } int StaticSwitchScreen::getRowXOffset (int y) { int retval = 0; int count = windows.size (); if (count - (y * (int)xCount) >= (int)xCount) return 0; switch (optionGetRowAlign ()) { case RowAlignLeft: break; case RowAlignCentered: retval = (xCount - count + (y * (int)xCount)) * (previewWidth + previewBorder) / 2; break; case RowAlignRight: retval = (xCount - count + (y * (int)xCount)) * (previewWidth + previewBorder); break; } return retval; } void StaticSwitchScreen::getWindowPosition (unsigned int index, int *x, int *y) { int row, column; if (index >= windows.size ()) return; column = (int)index % xCount; row = (int)index / xCount; *x = column * previewWidth + (column + 1) * previewBorder; *x += getRowXOffset (row); *y = row * previewHeight + (row + 1) * previewBorder; } CompWindow * StaticSwitchScreen::findWindowAt (int x, int y) { CompWindow *popup; popup = ::screen->findWindow (popupWindow); if (popup) { unsigned int i = 0; foreach (CompWindow *w, windows) { int x1, x2, y1, y2; getWindowPosition (i, &x1, &y1); x1 += popup->geometry ().x (); y1 += popup->geometry ().y (); x2 = x1 + previewWidth; y2 = y1 + previewHeight; if (x >= x1 && x < x2 && y >= y1 && y < y2) return w; i++; } } return NULL; } void StaticSwitchScreen::handleEvent (XEvent *event) { BaseSwitchScreen::handleEvent (event); switch (event->type) { case ButtonPress: if (grabIndex && mouseSelect) { CompWindow *selected; selected = findWindowAt (event->xbutton.x_root, event->xbutton.y_root); if (selected) { selectedWindow = selected; CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) ::screen->root ()); switchTerminate (NULL, CompAction::StateTermButton, o); } } break; default: break; } } bool StaticSwitchScreen::adjustVelocity () { float dx, adjust, amount; int count = windows.size (); dx = move - pos; if (abs (dx) > abs (dx + count)) dx += count; if (abs (dx) > abs (dx - count)) dx -= count; adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mVelocity = (amount * mVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.001f && fabs (mVelocity) < 0.001f) { mVelocity = 0.0f; return false; } return true; } void StaticSwitchScreen::preparePaint (int msSinceLastPaint) { if (moreAdjust) { int steps; float amount, chunk; int count = windows.size (); amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { moreAdjust = adjustVelocity (); if (!moreAdjust) { pos = move; break; } pos += mVelocity * chunk; pos = fmod (pos, count); if (pos < 0.0) pos += count; } } cScreen->preparePaint (msSinceLastPaint); } void StaticSwitchScreen::paintRect (const GLMatrix &transform, CompRect &box, int offset, unsigned short *color, unsigned short opacity) { GLushort colorData[4] = { color[0], color[1], color[2], static_cast (color[3] * opacity / 100) }; GLfloat vertexData[12] = { static_cast (box.x1 () + offset), static_cast (box.y1 () + offset), 0, static_cast (box.x2 () - offset), static_cast (box.y1 () + offset), 0, static_cast (box.x2 () - offset), static_cast (box.y2 () - offset), 0, static_cast (box.x1 () + offset), static_cast (box.y2 () - offset), 0 }; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_LINE_LOOP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); } bool StaticSwitchScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (grabIndex) { int mode; CompWindow *switcher, *zoomed; Window zoomedAbove = None; if (!popupDelayTimer.active ()) mode = optionGetHighlightMode (); else mode = HighlightModeNone; if (mode == HighlightModeBringSelectedToFront) { CompWindow *frontWindow = ::screen->clientList ().back (); zoomed = selectedWindow; if (zoomed && zoomed != frontWindow) { CompWindow *w; for (w = zoomed->prev; w && w->id () <= 1; w = w->prev) ; zoomedAbove = (w) ? w->id () : None; ::screen->unhookWindow (zoomed); ::screen->insertWindow (zoomed, frontWindow->id ()); } else { zoomed = NULL; } } else { zoomed = NULL; } ignoreSwitcher = true; status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); if (zoomed) { ::screen->unhookWindow (zoomed); ::screen->insertWindow (zoomed, zoomedAbove); } ignoreSwitcher = false; switcher = ::screen->findWindow (popupWindow); if (switcher || mode == HighlightModeShowRectangle) { GLMatrix sTransform (transform); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (mode == HighlightModeShowRectangle) { CompWindow *w; w = selectedWindow; if (w) { CompRect box; int opacity = 100; if (getPaintRectangle (w, box, &opacity)) { unsigned short *color; GLushort colorData[4]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); glEnable (GL_BLEND); /* fill rectangle */ colorData[0] = optionGetHighlightColorRed (); colorData[1] = optionGetHighlightColorGreen (); colorData[2] = optionGetHighlightColorBlue (); colorData[3] = optionGetHighlightColorAlpha (); colorData[3] = colorData[3] * opacity / 100; vertexData[0] = box.x1 (); vertexData[1] = box.y2 (); vertexData[2] = 0.0f; vertexData[3] = box.x1 (); vertexData[4] = box.y1 (); vertexData[5] = 0.0f; vertexData[6] = box.x2 (); vertexData[7] = box.y2 (); vertexData[8] = 0.0f; vertexData[9] = box.x2 (); vertexData[10] = box.y1 (); vertexData[11] = 0.0f; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); /* draw outline */ glLineWidth (1.0); color = optionGetHighlightBorderColor (); paintRect (sTransform, box, 0, color, opacity); paintRect (sTransform, box, 2, color, opacity); color = optionGetHighlightBorderInlayColor (); paintRect (sTransform, box, 1, color, opacity); glDisable (GL_BLEND); } } } if (switcher) { SWITCH_WINDOW (switcher); if (!switcher->destroyed () && switcher->isViewable () && sw->cWindow->damaged ()) { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, CompRegion::infinite (), 0); } } } } else { status = gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } return status; } void StaticSwitchScreen::donePaint () { if (grabIndex && moreAdjust) { CompWindow *w; w = ::screen->findWindow (popupWindow); if (w) CompositeWindow::get (w)->addDamage (); } else if (!grabIndex && !moreAdjust) { activateEvent (false); cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); foreach (CompWindow *w, ::screen->windows ()) { SWITCH_WINDOW (w); sw->cWindow->damageRectSetEnabled (sw, false); sw->gWindow->glPaintSetEnabled (sw, false); } } cScreen->donePaint (); } void StaticSwitchScreen::paintSelectionRect (const GLMatrix &transform, int x, int y, float dx, float dy, unsigned int opacity) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLushort colorData[4]; GLfloat vertexData[18]; GLMatrix sTransform (transform); float op; int w, h; int count = windows.size (); w = previewWidth + previewBorder; h = previewHeight + previewBorder; glEnable (GL_BLEND); if (dx > xCount - 1) op = 1.0 - MIN (1.0, dx - (xCount - 1)); else if (dx + (dy * xCount) > count - 1) op = 1.0 - MIN (1.0, dx - (count - 1 - (dy * xCount))); else if (dx < 0.0) op = 1.0 + MAX (-1.0, dx); else op = 1.0; for (unsigned int i = 0; i < 4; i++) colorData[i] = (float)fgColor[i] * opacity * op / 0xffff; sTransform.translate (x + previewBorder / 2 + (dx * w), y + previewBorder / 2 + (dy * h), 0.0f); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -1; vertexData[1] = -1; vertexData[2] = 0; vertexData[3] = -1; vertexData[4] = 1; vertexData[5] = 0; vertexData[6] = w + 1; vertexData[7] = -1; vertexData[8] = 0; vertexData[9] = w + 1; vertexData[10] = 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -1; vertexData[1] = h - 1; vertexData[2] = 0; vertexData[3] = -1; vertexData[4] = h + 1; vertexData[5] = 0; vertexData[6] = w + 1; vertexData[7] = h - 1; vertexData[8] = 0; vertexData[9] = w + 1; vertexData[10] = h + 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = -1; vertexData[1] = 1; vertexData[2] = 0; vertexData[3] = -1; vertexData[4] = h - 1; vertexData[5] = 0; vertexData[6] = 1; vertexData[7] = 1; vertexData[8] = 0; vertexData[9] = 1; vertexData[10] = h - 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = w - 1; vertexData[1] = 1; vertexData[2] = 0; vertexData[3] = w - 1; vertexData[4] = h - 1; vertexData[5] = 0; vertexData[6] = w + 1; vertexData[7] = 1; vertexData[8] = 0; vertexData[9] = w + 1; vertexData[10] = h - 1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (sTransform); glDisable (GL_BLEND); } bool StaticSwitchWindow::isSwitchWin (bool removing) { bool baseIsSwitchWin = BaseSwitchWindow::isSwitchWin (removing); if (baseIsSwitchWin && sScreen->selection == Group) { if (sScreen->clientLeader != window->clientLeader () && sScreen->clientLeader != window->id ()) return false; } return baseIsSwitchWin; } void StaticSwitchWindow::updateIconTexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, int x, int y, GLTexture *icon) { float xScale, yScale; xScale = (float) ICON_SIZE / icon->width (); yScale = (float) ICON_SIZE / icon->height (); if (xScale < yScale) yScale = xScale; else xScale = yScale; sAttrib.xScale = (float) sScreen->previewWidth * xScale / PREVIEWSIZE; sAttrib.yScale = (float) sScreen->previewWidth * yScale / PREVIEWSIZE; wx = x + sScreen->previewWidth - (sAttrib.xScale * icon->width ()); wy = y + sScreen->previewHeight - (sAttrib.yScale * icon->height ()); } void StaticSwitchWindow::updateIconNontexturedWindow (GLWindowPaintAttrib &sAttrib, int &wx, int &wy, float &width, float &height, int x, int y, GLTexture *icon) { sAttrib.xScale = width / icon->width (); sAttrib.yScale = height / icon->height (); if (sAttrib.xScale < sAttrib.yScale) sAttrib.yScale = sAttrib.xScale; else sAttrib.xScale = sAttrib.yScale; width = icon->width () * sAttrib.xScale; height = icon->height () * sAttrib.yScale; wx = x + (sScreen->previewWidth / 2) - (width / 2); wy = y + (sScreen->previewHeight / 2) - (height / 2); } void StaticSwitchWindow::updateIconPos (int &wx, int &wy, int x, int y, float width, float height) { wx = x + (sScreen->previewWidth / 2) - (width / 2); wy = y + (sScreen->previewHeight / 2) - (height / 2); } void StaticSwitchWindow::paintThumb (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, unsigned int mask, int x, int y) { BaseSwitchWindow::paintThumb (attrib, transform, mask, x, y, sScreen->previewWidth, sScreen->previewHeight, sScreen->previewWidth * 3 / 4, sScreen->previewHeight * 3 / 4); } bool StaticSwitchWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; /* We are painting the switcher popup window: * Paint the popup window first and then paint * the relevant thumbnails */ if (window->id () == sScreen->popupWindow) { int x, y, offX; float px, py, pos; int count = sScreen->windows.size (); const CompWindow::Geometry &g = window->geometry (); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK || sScreen->ignoreSwitcher) return false; status = gWindow->glPaint (attrib, transform, region, mask); if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK) && region.isEmpty ()) return true; glEnable (GL_SCISSOR_TEST); glScissor (g.x (), 0, g.width (), ::screen->height ()); unsigned int i = 0; foreach (CompWindow *w, sScreen->windows) { sScreen->getWindowPosition (i, &x, &y); StaticSwitchWindow::get (w)->paintThumb ( gWindow->lastPaintAttrib (), transform, mask, x + g.x (), y + g.y ()); i++; } pos = fmod (sScreen->pos, count); px = fmod (pos, sScreen->xCount); py = floor (pos / sScreen->xCount); offX = sScreen->getRowXOffset (py); if (pos > count - 1) { px = fmod (pos - count, sScreen->xCount); sScreen->paintSelectionRect (transform, g.x (), g.y (), px, 0.0, gWindow->lastPaintAttrib ().opacity); px = fmod (pos, sScreen->xCount); sScreen->paintSelectionRect (transform, g.x () + offX, g.y (), px, py, gWindow->lastPaintAttrib ().opacity); } if (px > sScreen->xCount - 1) { sScreen->paintSelectionRect (transform, g.x (), g.y (), px, py, gWindow->lastPaintAttrib ().opacity); py = fmod (py + 1, ceil ((double) count / sScreen->xCount)); offX = sScreen->getRowXOffset (py); sScreen->paintSelectionRect (transform, g.x () + offX, g.y (), px - sScreen->xCount, py, gWindow->lastPaintAttrib ().opacity); } else { sScreen->paintSelectionRect (transform, g.x () + offX, g.y (), px, py, gWindow->lastPaintAttrib ().opacity); } glDisable (GL_SCISSOR_TEST); } /* Adjust opacity/brightness/saturation of windows that are * not selected */ else if (sScreen->switching && !sScreen->popupDelayTimer.active () && (window != sScreen->selectedWindow)) { GLWindowPaintAttrib sAttrib (attrib); GLuint value; value = (GLuint) sScreen->optionGetSaturation (); if (value != 100) sAttrib.saturation = sAttrib.saturation * value / 100; value = (GLuint) sScreen->optionGetBrightness (); if (value != 100) sAttrib.brightness = sAttrib.brightness * value / 100; if (window->wmType () & (unsigned)~(CompWindowTypeDockMask | CompWindowTypeDesktopMask)) { value = (GLuint) sScreen->optionGetOpacity (); if (value != 100) sAttrib.opacity = sAttrib.opacity * value / 100; } status = gWindow->glPaint (sAttrib, transform, region, mask); } /* Fallback case for selected window */ else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } StaticSwitchScreen::StaticSwitchScreen (CompScreen *screen) : BaseSwitchScreen (screen), PluginClassHandler (screen), clientLeader (None), previewWidth (0), previewHeight (0), previewBorder (0), xCount (0), switching (false), mVelocity (0.0), pos (0), move (0), mouseSelect (false) { auto bgUpdater = [=] (...){ this->updateBackground (this->optionGetUseBackgroundColor (), this->optionGetBackgroundColor ());}; optionSetUseBackgroundColorNotify (bgUpdater); optionSetBackgroundColorNotify (bgUpdater); #define SWITCHBIND(a,b,c) boost::bind (switchInitiateCommon, _1, _2, _3, a, b, c) optionSetNextButtonInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextButtonTerminate (switchTerminate); optionSetNextKeyInitiate (SWITCHBIND (CurrentViewport, true, true)); optionSetNextKeyTerminate (switchTerminate); optionSetPrevButtonInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevButtonTerminate (switchTerminate); optionSetPrevKeyInitiate (SWITCHBIND (CurrentViewport, true, false)); optionSetPrevKeyTerminate (switchTerminate); optionSetNextAllButtonInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllButtonTerminate (switchTerminate); optionSetNextAllKeyInitiate (SWITCHBIND (AllViewports, true, true)); optionSetNextAllKeyTerminate (switchTerminate); optionSetPrevAllButtonInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllButtonTerminate (switchTerminate); optionSetPrevAllKeyInitiate (SWITCHBIND (AllViewports, true, false)); optionSetPrevAllKeyTerminate (switchTerminate); optionSetNextGroupButtonInitiate (SWITCHBIND (Group, true, true)); optionSetNextGroupButtonTerminate (switchTerminate); optionSetNextGroupKeyInitiate (SWITCHBIND (Group, true, true)); optionSetNextGroupKeyTerminate (switchTerminate); optionSetPrevGroupButtonInitiate (SWITCHBIND (Group, true, false)); optionSetPrevGroupButtonTerminate (switchTerminate); optionSetPrevGroupKeyInitiate (SWITCHBIND (Group, true, false)); optionSetPrevGroupKeyTerminate (switchTerminate); optionSetNextNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupButtonTerminate (switchTerminate); optionSetNextNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, true)); optionSetNextNoPopupKeyTerminate (switchTerminate); optionSetPrevNoPopupButtonInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupButtonTerminate (switchTerminate); optionSetPrevNoPopupKeyInitiate (SWITCHBIND (CurrentViewport, false, false)); optionSetPrevNoPopupKeyTerminate (switchTerminate); optionSetNextPanelButtonInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelButtonTerminate (switchTerminate); optionSetNextPanelKeyInitiate (SWITCHBIND (Panels, false, true)); optionSetNextPanelKeyTerminate (switchTerminate); optionSetPrevPanelButtonInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelButtonTerminate (switchTerminate); optionSetPrevPanelKeyInitiate (SWITCHBIND (Panels, false, false)); optionSetPrevPanelKeyTerminate (switchTerminate); #undef SWITCHBIND ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } StaticSwitchScreen::~StaticSwitchScreen () { if (popupDelayTimer.active ()) popupDelayTimer.stop (); if (popupWindow) XDestroyWindow (::screen->dpy (), popupWindow); } StaticSwitchWindow::StaticSwitchWindow (CompWindow *window) : BaseSwitchWindow (dynamic_cast (StaticSwitchScreen::get (screen)), window), PluginClassHandler (window), sScreen (StaticSwitchScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, false); CompositeWindowInterface::setHandler (cWindow, false); if (sScreen->popupWindow && sScreen->popupWindow == window->id ()) gWindow->glPaintSetEnabled (this, true); } bool StaticSwitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("compiztoolbox", COMPIZ_COMPIZTOOLBOX_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/staticswitcher/staticswitcher.xml.in0000644000004100000410000002457613246301623022171 0ustar www-datawww-data <_short>Static Application Switcher <_long>Static Application Switcher opengl compiztoolbox composite opengl compiztoolbox decor bs Window Management <_short>Bindings <_short>Behaviour <_short>Appearance <_short>Selected Window Highlight <_short>Background ./plugins/mblur/0000755000004100000410000000000013246301623014045 5ustar www-datawww-data./plugins/mblur/CMakeLists.txt0000644000004100000410000000015213246301623016603 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (mblur PLUGINDEPS composite opengl) ./plugins/mblur/mblur.xml.in0000644000004100000410000000364313246301623016323 0ustar www-datawww-data <_short>Motion blur <_long>Motion blur effect Effects opengl composite opengl decor <_short>Main <_short>Activate <_short>Main <_short>Visibility/Performance <_short>Activate ./plugins/mblur/src/0000755000004100000410000000000013246301623014634 5ustar www-datawww-data./plugins/mblur/src/mblur.h0000644000004100000410000000414613246301623016133 0ustar www-datawww-data/* * Compiz motion blur effect plugin * * mblur.c * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "mblur_options.h" class MblurScreen : public PluginClassHandler , public CompositeScreenInterface, public GLScreenInterface, public MblurOptions { public: MblurScreen (CompScreen *); ~MblurScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool active; bool update; /* is an update of the motion blur texture needed? */ float alpha; /* motion blur blending value */ float timer; /* motion blur fadeout time */ bool activated; GLuint texture; /* functions that we will intercept */ void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector options); }; #define MBLUR_SCREEN(s) \ MblurScreen *ms = MblurScreen::get (s) class MblurPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/mblur/src/mblur.cpp0000644000004100000410000001557113246301623016472 0ustar www-datawww-data/* * Compiz motion blur effect plugin * * mblur.c * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "mblur.h" COMPIZ_PLUGIN_20090315 (mblur, MblurPluginVTable); static void toggleFunctions (bool enabled) { MBLUR_SCREEN (screen); ms->cScreen->preparePaintSetEnabled (ms, enabled); ms->gScreen->glPaintOutputSetEnabled (ms, enabled); } /* activate/deactivate motion blur */ bool MblurScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options) { activated = !activated; if (activated) toggleFunctions (true); return true; } void MblurScreen::preparePaint (int msec) { active |= activated; /* fade motion blur out if no longer active */ if (activated) { timer = 500; toggleFunctions (true); } else { timer -= msec; } // calculate motion blur strength dependent on framerate float val = 101 - MIN (100, MAX (1, msec) ); float a_val = optionGetStrength () / 20.0; a_val = a_val * a_val; a_val /= 100.0; alpha = 1.0 - pow (a_val, 1.0 / val); if (active && timer <= 0) cScreen->damageScreen (); if (timer <= 0) { active = FALSE; } if (timer <= 0 && !activated) toggleFunctions (false); if (update && active) cScreen->damageScreen (); cScreen->preparePaint (msec); } /* FIXME?: This function was originally paintScreen (!= paintOutput). However * no paintScreen exists in compiz 0.9. This might result in code being executed * twice! */ bool MblurScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (!active) update = true; status = gScreen->glPaintOutput (attrib, transform, region, output, mask); bool enable_scissor = false; if (active && glIsEnabled (GL_SCISSOR_TEST) ) { glDisable (GL_SCISSOR_TEST); enable_scissor = true; } if (active && optionGetMode () == ModeTextureCopy) { float tx, ty; GLuint target; if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (screen->width ()) && POWER_OF_TWO (screen->height ()) ) ) { target = GL_TEXTURE_2D; tx = 1.0f / screen->width (); ty = 1.0f / screen->height (); } else { target = GL_TEXTURE_RECTANGLE_NV; tx = 1; ty = 1; } if (!texture) { glGenTextures (1, &texture); glBindTexture (target, texture); glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture (target, 0); } // blend motion blur texture to screen glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT | GL_VIEWPORT_BIT); glPushMatrix (); glLoadIdentity (); glViewport (0, 0, screen->width (), screen->height ()); glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA); glScalef (1.0f / screen->width (), -1.0f / screen->height (), 1.0f); glTranslatef (0.0f, -screen->height (), 0.0f); glBindTexture (target, texture); glEnable (target); if (!update) { glEnable (GL_BLEND); glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); alpha = (timer / 500.0) * alpha + (1.0 - (timer / 500.0) ) * 0.5; glColor4f (1, 1, 1, alpha); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_QUADS); glTexCoord2f (0, screen->height () * ty); glVertex2f (0, 0); glTexCoord2f (0, 0); glVertex2f (0, screen->height ()); glTexCoord2f (screen->width () * tx, 0); glVertex2f (screen->width (), screen->height ()); glTexCoord2f (screen->width () * tx, screen->height () * ty); glVertex2f (screen->width (), 0); glEnd (); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); // copy new screen to motion blur texture glCopyTexSubImage2D (target, 0, 0, 0, 0, 0, screen->width (), screen->height ()); } else { glCopyTexImage2D (target, 0, GL_RGB, 0, 0, screen->width (), screen->height (), 0); } glBindTexture (target, 0); glDisable (target); glPopMatrix (); glPopAttrib (); update = false; cScreen->damageScreen (); } if (active && optionGetMode () == ModeAccumulationBuffer) { // create motion blur effect using accumulation buffer alpha = (timer / 500.0) * alpha + (1.0 - (timer / 500.0) ) * 0.5; if (update) { glAccum (GL_LOAD, 1.0); } else { glAccum (GL_MULT, 1.0 - alpha); glAccum (GL_ACCUM, alpha); glAccum (GL_RETURN, 1.0); } update = FALSE; cScreen->damageScreen (); } if (enable_scissor) glEnable (GL_SCISSOR_TEST); return status; } void MblurScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (optionGetOnTransformedScreen () && (mask & PAINT_SCREEN_TRANSFORMED_MASK) ) { toggleFunctions (true); active = TRUE; timer = 500; } gScreen->glPaintTransformedOutput (attrib, transform, region, output, mask); } MblurScreen::MblurScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), active (false), update (true), timer (500), activated (false), texture (0) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); gScreen->glPaintTransformedOutputSetEnabled (this, true); optionSetInitiateKeyInitiate (boost::bind (&MblurScreen::toggle, this, _1, _2, _3)); cScreen->damageScreen (); } MblurScreen::~MblurScreen () { if (texture) glDeleteTextures (1, &texture); } bool MblurPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/winrules/0000755000004100000410000000000013246301624014575 5ustar www-datawww-data./plugins/winrules/CMakeLists.txt0000644000004100000410000000012113246301623017326 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (winrules) ./plugins/winrules/src/0000755000004100000410000000000013246301624015364 5ustar www-datawww-data./plugins/winrules/src/winrules.h0000644000004100000410000000541613246301623017412 0ustar www-datawww-data/* * winrules plugin for compiz * * Copyright (C) 2007 Bellegarde Cedric (gnumdk (at) gmail.com) * Copyright (C) 2009 Sam Spilsbury (smspillaz@gmail.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "winrules_options.h" class WinrulesScreen : public PluginClassHandler , public WinrulesOptions, public ScreenInterface { public: WinrulesScreen (CompScreen *screen); void handleEvent (XEvent *event); void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *w); void setProtocols (unsigned int protocols, Window id); void optionChanged (CompOption *option, WinrulesOptions::Options num); }; #define WINRULES_SCREEN(screen) \ WinrulesScreen *ws = WinrulesScreen::get(screen); class WinrulesWindow : public PluginClassHandler , public WindowInterface { public: WinrulesWindow (CompWindow *window); CompWindow *window; void getAllowedActions (unsigned int &, unsigned int &); bool is (); void setNoFocus (int optNum); void setNoAlpha (int optNum); void updateState (int optNum, int mask); void setAllowedActions (int optNum, int action); bool matchSizeValue (CompOption::Value::Vector matches, CompOption::Value::Vector widthValues, CompOption::Value::Vector heightValues, int *width, int *height); bool matchSize (int *width, int *height); void updateWindowSize (int width, int height); bool applyRules (); bool alpha () const; bool isFocussable () const; bool focus (); unsigned int allowedActions; unsigned int stateSetMask; unsigned int protocolSetMask; }; #define WINRULES_WINDOW(window) \ WinrulesWindow *ww = WinrulesWindow::get(window); class WinrulesPluginVTable: public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/winrules/src/winrules.cpp0000644000004100000410000003171713246301623017750 0ustar www-datawww-data/* * winrules plugin for compiz * * Copyright (C) 2007 Bellegarde Cedric (gnumdk (at) gmail.com) * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "winrules.h" COMPIZ_PLUGIN_20090315 (winrules, WinrulesPluginVTable); void WinrulesScreen::setProtocols (unsigned int protocols, Window id) { Atom protocol[4]; int count = 0; if (protocols & CompWindowProtocolDeleteMask) protocol[count++] = Atoms::wmDeleteWindow; if (protocols & CompWindowProtocolTakeFocusMask) protocol[count++] = Atoms::wmTakeFocus; if (protocols & CompWindowProtocolPingMask) protocol[count++] = Atoms::wmPing; if (protocols & CompWindowProtocolSyncRequestMask) protocol[count++] = Atoms::wmSyncRequest; XSetWMProtocols (screen->dpy (), id, protocol, count); } bool WinrulesWindow::is () { if (window->overrideRedirect ()) return false; if (window->wmType () & CompWindowTypeDesktopMask) return false; return true; } bool WinrulesWindow::isFocussable () const { window->isFocussable (); return false; // We only want to return false else where we are not wrapped } bool WinrulesWindow::focus () { window->focus (); return false; // We only want to return false for the window we are wrapped } bool WinrulesWindow::alpha () const { window->alpha (); return false; // We only want to return false else where we are not wrapped } void WinrulesWindow::setNoFocus (int optNum) { unsigned int newProtocol = window->protocols (); WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) { if (window->protocols () & CompWindowProtocolTakeFocusMask) { protocolSetMask |= (window->protocols () & CompWindowProtocolTakeFocusMask); newProtocol = window->protocols () & ~CompWindowProtocolTakeFocusMask; } window->isFocussableSetEnabled (this, true);// causes w->isFocussable () // to return false window->focusSetEnabled (this, true); // causes w->focus () to return // false for this window } else if ((protocolSetMask & CompWindowProtocolTakeFocusMask)) { newProtocol = window->protocols () | (protocolSetMask & CompWindowProtocolTakeFocusMask); protocolSetMask &= ~CompWindowProtocolTakeFocusMask; window->isFocussableSetEnabled (this, false); window->focusSetEnabled (this, false); } if (newProtocol != window->protocols ()) { ws->setProtocols (newProtocol, window->id ()); } } void WinrulesWindow::setNoAlpha (int optNum) { WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) { window->alphaSetEnabled (this, true); // Causes w->alpha () to return // false } else { window->alphaSetEnabled (this, false); } } void WinrulesWindow::updateState (int optNum, int mask) { unsigned int newState = window->state (); WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) { newState |= mask; newState = window->constrainWindowState (newState, window->actions ()); stateSetMask |= (newState & mask); } else if (stateSetMask & mask) { newState &= ~mask; stateSetMask &= ~mask; } if (newState != window->state ()) { window->changeState (newState); if (mask & (CompWindowStateFullscreenMask | CompWindowStateAboveMask | CompWindowStateBelowMask )) window->updateAttributes (CompStackingUpdateModeNormal); else window->updateAttributes (CompStackingUpdateModeNone); } } void WinrulesWindow::setAllowedActions (int optNum, int action) { WINRULES_SCREEN (screen); if (!is ()) return; if (ws->getOptions ().at (optNum). value ().match ().evaluate (window)) allowedActions &= ~action; else if (!(allowedActions & action)) allowedActions |= action; window->recalcActions (); } bool WinrulesWindow::matchSizeValue (CompOption::Value::Vector matches, CompOption::Value::Vector widthValues, CompOption::Value::Vector heightValues, int *width, int *height) { int min; if (!is ()) return false; if (window->type () & CompWindowTypeDesktopMask) return false; min = MIN (matches.size (), widthValues.size ()); min = MIN ((unsigned int) min, heightValues.size ()); min = MIN ((unsigned int) min, matches.size ()); for (int i = 0; i < min; i++) { if ((matches.at (i).match ().evaluate (window))) { *width = widthValues.at (i).i (); *height = heightValues.at (i).i (); return true; } } return false; } bool WinrulesWindow::matchSize (int *width, int *height) { WINRULES_SCREEN (screen); return matchSizeValue (ws->optionGetSizeMatches (), ws->optionGetSizeWidthValues (), ws->optionGetSizeHeightValues (), width, height); } void WinrulesWindow::updateWindowSize (int width, int height) { XWindowChanges xwc; unsigned int xwcm = 0; if (width != window->serverWidth ()) xwcm |= CWWidth; if (height != window->serverHeight ()) xwcm |= CWHeight; xwc.width = width; xwc.height = height; if (window->mapNum () && xwcm) window->sendSyncRequest (); window->configureXWindow (xwcm, &xwc); } void WinrulesScreen::optionChanged (CompOption *option, WinrulesOptions::Options num) { unsigned int updateStateMask = 0, updateActionsMask = 0; switch (num) { case WinrulesOptions::SkiptaskbarMatch: updateStateMask = CompWindowStateSkipTaskbarMask; break; case WinrulesOptions::SkippagerMatch: updateStateMask = CompWindowStateSkipPagerMask; break; case WinrulesOptions::AboveMatch: updateStateMask = CompWindowStateAboveMask; break; case WinrulesOptions::BelowMatch: updateStateMask = CompWindowStateBelowMask; break; case WinrulesOptions::StickyMatch: updateStateMask = CompWindowStateStickyMask; break; case WinrulesOptions::FullscreenMatch: updateStateMask = CompWindowStateFullscreenMask; break; case WinrulesOptions::MaximizeMatch: updateStateMask = CompWindowStateMaximizedHorzMask | CompWindowStateMaximizedVertMask; break; case WinrulesOptions::NoMoveMatch: updateActionsMask = CompWindowActionMoveMask; break; case WinrulesOptions::NoResizeMatch: updateActionsMask = CompWindowActionResizeMask; break; case WinrulesOptions::NoMinimizeMatch: updateActionsMask = CompWindowActionMinimizeMask; break; case WinrulesOptions::NoMaximizeMatch: updateActionsMask = CompWindowActionMaximizeVertMask | CompWindowActionMaximizeHorzMask; break; case WinrulesOptions::NoCloseMatch: updateActionsMask = CompWindowActionCloseMask; break; case WinrulesOptions::NoArgbMatch: foreach (CompWindow *w, screen->windows ()) { WINRULES_WINDOW (w); ww->setNoAlpha (num); } return; break; case WinrulesOptions::SizeMatches: foreach (CompOption::Value &v, option->value ().list ()) { CompMatch &m = v.match (); m.update (); } return; break; default: return; break; } if (updateStateMask) { /* We traverse a copy of the list here because windows can be unhooked * on state change rather than the delayed unhook that happens in <0.8.x */ CompWindowList windows = screen->windows (); foreach (CompWindow *w, windows) { WINRULES_WINDOW (w); ww->updateState (num, updateStateMask); } return; } if (updateActionsMask) { foreach (CompWindow *w, screen->windows ()) { WINRULES_WINDOW (w); ww->setAllowedActions (num, updateActionsMask); } return; } return; } bool WinrulesWindow::applyRules () { int width, height; updateState (WinrulesOptions::SkiptaskbarMatch, CompWindowStateSkipTaskbarMask); updateState (WinrulesOptions::SkippagerMatch, CompWindowStateSkipPagerMask); updateState (WinrulesOptions::AboveMatch, CompWindowStateAboveMask); updateState (WinrulesOptions::BelowMatch, CompWindowStateBelowMask); updateState (WinrulesOptions::StickyMatch, CompWindowStateStickyMask); updateState (WinrulesOptions::FullscreenMatch, CompWindowStateFullscreenMask); updateState (WinrulesOptions::MaximizeMatch, CompWindowStateMaximizedHorzMask | CompWindowStateMaximizedVertMask); setAllowedActions (WinrulesOptions::NoMoveMatch, CompWindowActionMoveMask); setAllowedActions (WinrulesOptions::NoResizeMatch, CompWindowActionResizeMask); setAllowedActions (WinrulesOptions::NoMinimizeMatch, CompWindowActionMinimizeMask); setAllowedActions (WinrulesOptions::NoMaximizeMatch, CompWindowActionMaximizeVertMask | CompWindowActionMaximizeHorzMask); setAllowedActions (WinrulesOptions::NoCloseMatch, CompWindowActionCloseMask); setNoAlpha (WinrulesOptions::NoArgbMatch); if (matchSize (&width, &height)) updateWindowSize (width, height); return false; } void WinrulesScreen::handleEvent (XEvent *event) { if (event->type == MapRequest) { CompWindow *w = screen->findWindow (event->xmap.window); if (w) { WINRULES_WINDOW (w); ww->setNoFocus (WinrulesOptions::NoFocusMatch); ww->applyRules (); } } screen->handleEvent (event); } void WinrulesWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { window->getAllowedActions (setActions, clearActions); clearActions |= ~allowedActions; } void WinrulesScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { WINRULES_WINDOW (w); ww->applyRules (); } } void WinrulesScreen::matchPropertyChanged (CompWindow *w) { WINRULES_WINDOW (w); /* Re-apply rules on match property change */ ww->applyRules (); screen->matchPropertyChanged (w); } WinrulesScreen::WinrulesScreen (CompScreen *screen) : PluginClassHandler (screen) { ScreenInterface::setHandler (screen); optionSetSkiptaskbarMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetSkippagerMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetAboveMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetBelowMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetFullscreenMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetStickyMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetMaximizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoArgbMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoMoveMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoResizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoMinimizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoMaximizeMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoCloseMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); optionSetNoFocusMatchNotify (boost::bind (&WinrulesScreen::optionChanged, this, _1, _2)); } WinrulesWindow::WinrulesWindow (CompWindow *window) : PluginClassHandler (window), window (window), allowedActions (~0), stateSetMask (0), protocolSetMask (0) { CompTimer timer; WindowInterface::setHandler (window); window->isFocussableSetEnabled (this, false); window->alphaSetEnabled (this, false); window->focusSetEnabled (this, false); timer.setCallback (boost::bind(&WinrulesWindow::applyRules, this)); timer.setTimes (0, 0); timer.start (); } bool WinrulesPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/winrules/winrules.xml.in0000644000004100000410000000700213246301623017572 0ustar www-datawww-data <_short>Window Rules <_long>Set windows rules Window Management opengl composite decor regex <_short>Matches <_short>Size rules <_short>Fixed Size Windows ./plugins/maximumize/0000755000004100000410000000000013246301623015111 5ustar www-datawww-data./plugins/maximumize/CMakeLists.txt0000644000004100000410000000012313246301623017645 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (maximumize) ./plugins/maximumize/src/0000755000004100000410000000000013246301623015700 5ustar www-datawww-data./plugins/maximumize/src/maximumize.cpp0000644000004100000410000003510213246301623020572 0ustar www-datawww-data/* * Compiz Fusion Maximumize plugin * * Copyright 2007-2008 Kristian Lyngstøl * Copyright 2008 Eduardo Gurgel Pinho * Copyright 2008 Marco Diego Aurelio Mesquita * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Eduardo Gurgel * Marco Diego Aurélio Mesquita * * Description: * * Maximumize resizes a window so it fills as much of the free space in any * direction as possible without overlapping with other windows. * */ #include "maximumize.h" COMPIZ_PLUGIN_20090315 (maximumize, MaximumizePluginVTable); /* Convenience constants to make the code more readable (hopefully) */ const short REDUCE = -1; const unsigned short INCREASE = 1; /* Returns true if rectangles a and b intersect by at least 40 in both * directions */ bool MaximumizeScreen::substantialOverlap (const CompRect& a, const CompRect& b) { if (a.x2 () <= b.x1 () + 40) return false; if (b.x2 () <= a.x1 () + 40) return false; if (a.y2 () <= b.y1 () + 40) return false; if (b.y2 () <= a.y1 () + 40) return false; return true; } /* Generates a region containing free space (here the * active window counts as free space). The region argument * is the start-region (ie: the output dev). * Logic borrowed from opacify (courtesy of myself). */ CompRegion MaximumizeScreen::findEmptyRegion (CompWindow *window, const CompRect& output) { CompRegion newRegion (output); CompRect tmpRect, windowRect; if (optionGetIgnoreOverlapping ()) windowRect = window->serverBorderRect (); foreach (CompWindow *w, screen->windows ()) { CompRegion tmpRegion; if (w->id () == window->id ()) continue; if (w->invisible () /*|| w->hidden */|| w->minimized ()) continue; if (w->wmType () & CompWindowTypeDesktopMask) continue; if (w->wmType () & CompWindowTypeDockMask) { if (w->struts ()) { tmpRegion += w->struts ()->left; tmpRegion += w->struts ()->right; tmpRegion += w->struts ()->top; tmpRegion += w->struts ()->bottom; newRegion -= tmpRegion; } continue; } if (optionGetIgnoreSticky () && (w->state () & CompWindowStateStickyMask) && !(w->wmType () & CompWindowTypeDockMask)) { continue; } tmpRect = w->serverBorderRect (); if (optionGetIgnoreOverlapping () && substantialOverlap (tmpRect, windowRect)) { continue; } tmpRegion += tmpRect; newRegion -= tmpRegion; } return newRegion; } /* Returns true if box a has a larger area than box b. */ bool MaximumizeScreen::boxCompare (const CompRect& a, const CompRect& b) { int areaA, areaB; areaA = a.width () * a.height (); areaB = b.width () * b.height (); return (areaA > areaB); } /* While the rectangle has space, add inc to i. When it CHEKCREC fails (ie: * we overstepped our boundaries), reduce i by inc; undo the last change. * inc is either 1 or -1, but could easily be looped over for fun and * profit. (Ie: start with -100, hit the wall, go with -20, then -1, etc.) * * NOTE: We have to pass along tmp, r and w for CHECKREC. * FIXME: */ /* If a window, with decorations, defined by tmp and w is still in free * space, evaluate to true. */ inline void MaximumizeScreen::addToCorner (CompRect& rect, Corner corner, const short inc) { switch (corner) { case X1: rect.setX (rect.x () + inc); break; case X2: rect.setWidth (rect.width () + inc); break; case Y1: rect.setY (rect.y () + inc); break; case Y2: rect.setHeight (rect.height () + inc); break; } } #define CHECKREC \ r.contains (CompRect (tmp.x1 () - w->border ().left, \ tmp.y1 () - w->border ().top, \ tmp.width () + w->border ().right + w->border ().left, \ tmp.height () + w->border ().bottom + w->border ().top)) void MaximumizeScreen::growGeneric (CompWindow *w, CompRect& tmp, const CompRegion& r, Corner corner, const short inc) { bool touch = false; while (CHECKREC) { addToCorner (tmp, corner, inc); touch = true; } if (touch) addToCorner (tmp, corner, -inc); } /* Grow a box in the left/right directions as much as possible without * overlapping other relevant windows. */ void MaximumizeScreen::growWidth (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset) { if (mset.left) growGeneric (w, tmp, r, X1, REDUCE); if (mset.right) growGeneric (w, tmp, r, X2, INCREASE); } /* Grow box in the up/down direction as much as possible without * overlapping other relevant windows. */ void MaximumizeScreen::growHeight (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset) { if (mset.down) growGeneric (w, tmp, r, Y2, INCREASE); if (mset.up) growGeneric (w, tmp, r, Y1, REDUCE); } /* Extends the given box for Window w to fit as much space in region r. * If XFirst is true, it will first expand in the X direction, * then Y. This is because it gives different results. */ CompRect MaximumizeScreen::extendBox (CompWindow *w, const CompRect& tmp, const CompRegion& r, bool xFirst, const MaxSet& mset) { CompRect result = tmp; if (xFirst) { growWidth (w, result, r, mset); growHeight (w, result, r, mset); } else { growHeight (w, result, r, mset); growWidth (w, result, r, mset); } return result; } /* These two functions set the width and height respectively, with gravity * towards the center of the window. They will set the box-width to width * as long as at least one of the sides can be modified. Same for height. */ void MaximumizeScreen::setBoxWidth (CompRect& box, const int width, const MaxSet& mset) { int original = box.width (); int increment; if (!mset.left && !mset.right) return; if (mset.left != mset.right) increment = original - width; else increment = (original - width) / 2; box.setX (box.x () + (mset.left ? increment : 0)); box.setWidth (box.width () - (mset.right ? increment : 0)); } void MaximumizeScreen::setBoxHeight (CompRect& box, const int height, const MaxSet& mset) { int original = box.height (); int increment; if (!mset.down && !mset.up) return ; if (mset.up != mset.down) increment = original - height; else increment = (original - height) / 2; box.setY (box.y () + (mset.up ? increment : 0)); box.setHeight (box.height () - (mset.down ? increment : 0)); } /* Reduce box size by setting width and height to 1/4th or the minimum size * allowed, whichever is bigger. */ CompRect MaximumizeScreen::minimumize (CompWindow *w, const CompRect& box, const MaxSet& mset) { const int minWidth = w->sizeHints ().min_width; const int minHeight = w->sizeHints ().min_height; int width, height; CompRect result = box; /* unmaximize first */ w->maximize (0); width = result.width (); height = result.height (); if (width / 4 < minWidth) setBoxWidth (result, minWidth, mset); else setBoxWidth (result, width / 4, mset); if (height / 4 < minHeight) setBoxHeight (result, minHeight, mset); else setBoxHeight (result, height / 4, mset); return result; } /* Create a box for resizing in the given region * Also shrinks the window box in case of minor overlaps. * FIXME: should be somewhat cleaner. */ CompRect MaximumizeScreen::findRect (CompWindow *w, const CompRegion& r, const MaxSet& mset) { CompRect windowBox, ansA, ansB, orig; windowBox.setGeometry (w->serverX (), w->serverY (), w->serverWidth (), w->serverHeight ()); orig = windowBox; if (mset.shrink) windowBox = minimumize (w, windowBox, mset); if (!mset.grow) return windowBox; ansA = extendBox (w, windowBox, r, true, mset); ansB = extendBox (w, windowBox, r, false, mset); if (!optionGetAllowShrink ()) { if (boxCompare (orig, ansA) && boxCompare (orig, ansB)) return orig; } else { /* Order is essential here. */ if (!boxCompare (ansA, windowBox) && !boxCompare (ansB, windowBox)) return orig; } if (boxCompare (ansA, ansB)) return ansA; else return ansB; } /* Calls out to compute the resize */ unsigned int MaximumizeScreen::computeResize (CompWindow *w, XWindowChanges *xwc, const MaxSet& mset) { int outputDevice = w->outputDevice (); const CompOutput& output = screen->outputDevs ()[outputDevice]; CompRegion region; unsigned int mask = 0; CompRect box; region = findEmptyRegion (w, output); box = findRect (w, region, mset); if (box.x1 () != w->serverX ()) mask |= CWX; if (box.y1 () != w->serverY ()) mask |= CWY; if (box.width () != w->serverWidth ()) mask |= CWWidth; if (box.height () != w->serverHeight ()) mask |= CWHeight; xwc->x = box.x1 (); xwc->y = box.y1 (); xwc->width = box.width (); xwc->height = box.height (); return mask; } /* General trigger. This is for maximumizing / minimumizing without a direction * Note that the function is static in the class so 'this' in unavailable, * we have to use MAX_SCREEN (screen) to get the object */ bool MaximumizeScreen::triggerGeneral (CompAction *action, CompAction::State state, CompOption::Vector &options, bool grow) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) { int width, height; unsigned int mask; XWindowChanges xwc; MaxSet mset; MAX_SCREEN (screen); if (screen->otherGrabExist (0)) return false; mset.left = ms->optionGetMaximumizeLeft (); mset.right = ms->optionGetMaximumizeRight (); mset.up = ms->optionGetMaximumizeUp (); mset.down = ms->optionGetMaximumizeDown (); mset.grow = grow; mset.shrink = true; mask = computeResize (w, &xwc, mset); if (mask) { if (w->constrainNewWindowSize (xwc.width, xwc.height, &width, &height)) { mask |= CWWidth | CWHeight; xwc.width = width; xwc.height = height; } if (w->mapNum () && (mask & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); } } return true; } /* * Maximizing on specified direction. */ bool MaximumizeScreen::triggerDirection (CompAction *action, CompAction::State state, CompOption::Vector &options, bool left, bool right, bool up, bool down, bool grow) { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) { int width, height; unsigned int mask; XWindowChanges xwc; MaxSet mset; if (screen->otherGrabExist (0)) return false; mset.left = left; mset.right = right; mset.up = up; mset.down = down; mset.grow = grow; mset.shrink = !grow; mask = computeResize (w, &xwc, mset); if (mask) { if (w->constrainNewWindowSize (xwc.width, xwc.height, &width, &height)) { mask |= CWWidth | CWHeight; xwc.width = width; xwc.height = height; } if (w->mapNum () && (mask & (CWWidth | CWHeight))) w->sendSyncRequest (); w->configureXWindow (mask, &xwc); } } return true; } /* Configuration, initialization, boring stuff. --------------------- */ /* Screen Constructor */ MaximumizeScreen::MaximumizeScreen (CompScreen *screen) : PluginClassHandler (screen) { /* This macro uses boost::bind to have lots of callbacks trigger the same * function with different arguments */ #define MAXSET(opt, up, down, left, right) \ optionSet##opt##Initiate (boost::bind (&MaximumizeScreen::triggerDirection,\ this, _1, _2, _3, up, \ down, left, right, true)) #define MINSET(opt, up, down, left, right) \ optionSet##opt##Initiate (boost::bind (&MaximumizeScreen::triggerDirection,\ this, _1, _2, _3, up, \ down, left, right, false)) /* Maximumize Bindings */ optionSetTriggerMaxKeyInitiate ( boost::bind (&MaximumizeScreen::triggerGeneral,this, _1, _2, _3, true)); /* TriggerDirection, left, right, up, down */ MAXSET (TriggerMaxLeft, true, false, false, false); MAXSET (TriggerMaxRight, true, false, false, false); MAXSET (TriggerMaxUp, false, false, true, false); MAXSET (TriggerMaxDown, false, false, false, true); MAXSET (TriggerMaxHorizontally, true, true, false, false); MAXSET (TriggerMaxVertically, false, false, true, true); MAXSET (TriggerMaxUpLeft, true, false, true, false); MAXSET (TriggerMaxUpRight, false, true, true, false); MAXSET (TriggerMaxDownLeft, true, false, false, true); MAXSET (TriggerMaxDownRight, false, true, false, true); /* Maximumize Bindings */ optionSetTriggerMinKeyInitiate ( boost::bind (&MaximumizeScreen::triggerGeneral, this, _1, _2, _3, false)); MINSET (TriggerMinLeft, true, false, false, false); MINSET (TriggerMinRight, true, false, false, false); MINSET (TriggerMinUp, false, false, true, false); MINSET (TriggerMinDown, false, false, false, true); MINSET (TriggerMinHorizontally, true, true, false, false); MINSET (TriggerMinVertically, false, false, true, true); MINSET (TriggerMinUpLeft, true, false, true, false); MINSET (TriggerMinUpRight, false, true, true, false); MINSET (TriggerMinDownLeft, true, false, false, true); MINSET (TriggerMinDownRight, false, true, false, true); #undef MAXSET #undef MINSET } /* Initial plugin init function called. Checks to see if we are ABI * compatible with core, otherwise unload */ bool MaximumizePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/maximumize/src/maximumize.h0000644000004100000410000000727713246301623020253 0ustar www-datawww-data/* * Compiz Fusion Maximumize plugin * * Copyright 2007-2008 Kristian Lyngstøl * Copyright 2008 Eduardo Gurgel Pinho * Copyright 2008 Marco Diego Aurelio Mesquita * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Kristian Lyngstøl * Eduardo Gurgel * Marco Diego Aurélio Mesquita * * Description: * * Maximumize resizes a window so it fills as much of the free space in any * direction as possible without overlapping with other windows. */ #include #include #include "maximumize_options.h" /* Convenience constants to make the code more readable (hopefully) */ extern const short REDUCE; extern const unsigned short INCREASE; typedef struct { bool left; bool right; bool up; bool down; bool shrink; // Shrink and grow can both be executed. bool grow; // Shrink will run first. } MaxSet; class MaximumizeScreen : public PluginClassHandler , public MaximumizeOptions { public: MaximumizeScreen (CompScreen *); bool triggerGeneral (CompAction *action, CompAction::State state, CompOption::Vector &options, bool grow); bool triggerDirection (CompAction *action, CompAction::State state, CompOption::Vector &options, bool left, bool right, bool up, bool down, bool grow); private: typedef enum { X1, X2, Y1, Y2 } Corner; bool substantialOverlap (const CompRect& a, const CompRect& b); CompRegion findEmptyRegion (CompWindow *window, const CompRect& output); bool boxCompare (const CompRect& a, const CompRect& b); void growGeneric (CompWindow *w, CompRect& tmp, const CompRegion& r, Corner corner, const short inc); inline void addToCorner (CompRect& rect, Corner corner, const short inc); inline void growWidth (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset); inline void growHeight (CompWindow *w, CompRect& tmp, const CompRegion& r, const MaxSet& mset); CompRect extendBox (CompWindow *w, const CompRect& tmp, const CompRegion& r, bool xFirst, const MaxSet& mset); void setBoxWidth (CompRect& box, const int width, const MaxSet& mset); void setBoxHeight (CompRect& box, const int height, const MaxSet& mset); CompRect minimumize (CompWindow *w, const CompRect& box, const MaxSet& mset); CompRect findRect (CompWindow *w, const CompRegion& r, const MaxSet& mset); unsigned int computeResize (CompWindow *w, XWindowChanges *xwc, const MaxSet& mset); }; #define MAX_SCREEN(s) \ MaximumizeScreen *ms = MaximumizeScreen::get (s); class MaximumizePluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/maximumize/maximumize.xml.in0000644000004100000410000001443313246301623020432 0ustar www-datawww-data <_short>Maximumize <_long>Maximumizes windows (resize them to fit the available screenspace). Window Management decor composite opengl <_short>Options <_short>Bindings <_short>Maximumize Bindings <_short>Minimumize Bindings ./plugins/commands/0000755000004100000410000000000013246301624014526 5ustar www-datawww-data./plugins/commands/CMakeLists.txt0000644000004100000410000000011713246301623017264 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(commands)./plugins/commands/src/0000755000004100000410000000000013246301624015315 5ustar www-datawww-data./plugins/commands/src/commands.cpp0000644000004100000410000001562013246301623017625 0ustar www-datawww-data/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "commands.h" #include "core/abiversion.h" #include "core/screen.h" COMPIZ_PLUGIN_20090315 (commands, CommandsPluginVTable); bool CommandsScreen::runCommand (CompAction *action, CompAction::State state, CompOption::Vector& options, int commandOption) { Window xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid != screen->root ()) return false; CommandsScreen *cs = CommandsScreen::get (screen); screen->runCommand (cs->mOptions[commandOption].value (). s ()); return true; } CommandsScreen::CommandsScreen (CompScreen *s) : PluginClassHandler (s) { #define DISPATCH(opt) boost::bind (CommandsScreen::runCommand, _1, _2, _3, opt) optionSetRunCommand0KeyInitiate (DISPATCH (CommandsOptions::Command0)); optionSetRunCommand1KeyInitiate (DISPATCH (CommandsOptions::Command1)); optionSetRunCommand2KeyInitiate (DISPATCH (CommandsOptions::Command2)); optionSetRunCommand3KeyInitiate (DISPATCH (CommandsOptions::Command3)); optionSetRunCommand4KeyInitiate (DISPATCH (CommandsOptions::Command4)); optionSetRunCommand5KeyInitiate (DISPATCH (CommandsOptions::Command5)); optionSetRunCommand6KeyInitiate (DISPATCH (CommandsOptions::Command6)); optionSetRunCommand7KeyInitiate (DISPATCH (CommandsOptions::Command7)); optionSetRunCommand8KeyInitiate (DISPATCH (CommandsOptions::Command8)); optionSetRunCommand9KeyInitiate (DISPATCH (CommandsOptions::Command9)); optionSetRunCommand10KeyInitiate (DISPATCH (CommandsOptions::Command10)); optionSetRunCommand11KeyInitiate (DISPATCH (CommandsOptions::Command11)); optionSetRunCommand12KeyInitiate (DISPATCH (CommandsOptions::Command12)); optionSetRunCommand13KeyInitiate (DISPATCH (CommandsOptions::Command13)); optionSetRunCommand14KeyInitiate (DISPATCH (CommandsOptions::Command14)); optionSetRunCommand15KeyInitiate (DISPATCH (CommandsOptions::Command15)); optionSetRunCommand16KeyInitiate (DISPATCH (CommandsOptions::Command16)); optionSetRunCommand17KeyInitiate (DISPATCH (CommandsOptions::Command17)); optionSetRunCommand18KeyInitiate (DISPATCH (CommandsOptions::Command18)); optionSetRunCommand19KeyInitiate (DISPATCH (CommandsOptions::Command19)); optionSetRunCommand20KeyInitiate (DISPATCH (CommandsOptions::Command20)); optionSetRunCommand0ButtonInitiate (DISPATCH (CommandsOptions::Command0)); optionSetRunCommand1ButtonInitiate (DISPATCH (CommandsOptions::Command1)); optionSetRunCommand2ButtonInitiate (DISPATCH (CommandsOptions::Command2)); optionSetRunCommand3ButtonInitiate (DISPATCH (CommandsOptions::Command3)); optionSetRunCommand4ButtonInitiate (DISPATCH (CommandsOptions::Command4)); optionSetRunCommand5ButtonInitiate (DISPATCH (CommandsOptions::Command5)); optionSetRunCommand6ButtonInitiate (DISPATCH (CommandsOptions::Command6)); optionSetRunCommand7ButtonInitiate (DISPATCH (CommandsOptions::Command7)); optionSetRunCommand8ButtonInitiate (DISPATCH (CommandsOptions::Command8)); optionSetRunCommand9ButtonInitiate (DISPATCH (CommandsOptions::Command9)); optionSetRunCommand10ButtonInitiate (DISPATCH (CommandsOptions::Command10)); optionSetRunCommand11ButtonInitiate (DISPATCH (CommandsOptions::Command11)); optionSetRunCommand12ButtonInitiate (DISPATCH (CommandsOptions::Command12)); optionSetRunCommand13ButtonInitiate (DISPATCH (CommandsOptions::Command13)); optionSetRunCommand14ButtonInitiate (DISPATCH (CommandsOptions::Command14)); optionSetRunCommand15ButtonInitiate (DISPATCH (CommandsOptions::Command15)); optionSetRunCommand16ButtonInitiate (DISPATCH (CommandsOptions::Command16)); optionSetRunCommand17ButtonInitiate (DISPATCH (CommandsOptions::Command17)); optionSetRunCommand18ButtonInitiate (DISPATCH (CommandsOptions::Command18)); optionSetRunCommand19ButtonInitiate (DISPATCH (CommandsOptions::Command19)); optionSetRunCommand20ButtonInitiate (DISPATCH (CommandsOptions::Command20)); optionSetRunCommand0EdgeInitiate (DISPATCH (CommandsOptions::Command0)); optionSetRunCommand1EdgeInitiate (DISPATCH (CommandsOptions::Command1)); optionSetRunCommand2EdgeInitiate (DISPATCH (CommandsOptions::Command2)); optionSetRunCommand3EdgeInitiate (DISPATCH (CommandsOptions::Command3)); optionSetRunCommand4EdgeInitiate (DISPATCH (CommandsOptions::Command4)); optionSetRunCommand5EdgeInitiate (DISPATCH (CommandsOptions::Command5)); optionSetRunCommand6EdgeInitiate (DISPATCH (CommandsOptions::Command6)); optionSetRunCommand7EdgeInitiate (DISPATCH (CommandsOptions::Command7)); optionSetRunCommand8EdgeInitiate (DISPATCH (CommandsOptions::Command8)); optionSetRunCommand9EdgeInitiate (DISPATCH (CommandsOptions::Command9)); optionSetRunCommand10EdgeInitiate (DISPATCH (CommandsOptions::Command10)); optionSetRunCommand11EdgeInitiate (DISPATCH (CommandsOptions::Command11)); optionSetRunCommand12EdgeInitiate (DISPATCH (CommandsOptions::Command12)); optionSetRunCommand13EdgeInitiate (DISPATCH (CommandsOptions::Command13)); optionSetRunCommand14EdgeInitiate (DISPATCH (CommandsOptions::Command14)); optionSetRunCommand15EdgeInitiate (DISPATCH (CommandsOptions::Command15)); optionSetRunCommand16EdgeInitiate (DISPATCH (CommandsOptions::Command16)); optionSetRunCommand17EdgeInitiate (DISPATCH (CommandsOptions::Command17)); optionSetRunCommand18EdgeInitiate (DISPATCH (CommandsOptions::Command18)); optionSetRunCommand19EdgeInitiate (DISPATCH (CommandsOptions::Command19)); optionSetRunCommand20EdgeInitiate (DISPATCH (CommandsOptions::Command20)); } bool CommandsPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/commands/src/commands.h0000644000004100000410000000332213246301623017266 0ustar www-datawww-data/* * Copyright © 2009 Danny Baumann * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Danny Baumann not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Danny Baumann makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DANNY BAUMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Danny Baumann */ #include "commands_options.h" #include "core/plugin.h" #include class CommandsScreen : public PluginClassHandler, public CommandsOptions { public: CommandsScreen (CompScreen *s); static bool runCommand (CompAction *action, CompAction::State state, CompOption::Vector &options, int commandOption); }; class CommandsPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/commands/commands.xml.in0000644000004100000410000004300713246301623017461 0ustar www-datawww-data <_short>Commands <_long>Assigns bindings to arbitrary commands General composite opengl decor <_short>Commands <_short>Key Bindings <_short>Button Bindings <_short>Edge Bindings ./plugins/mousepoll/0000755000004100000410000000000013246301623014743 5ustar www-datawww-data./plugins/mousepoll/CMakeLists.txt0000644000004100000410000000012213246301623017476 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (mousepoll) ./plugins/mousepoll/mousepoll.xml.in0000644000004100000410000000132113246301623020106 0ustar www-datawww-data <_short>Mouse position polling <_long>Updates the mouse pointer position from the xserver Utility opengl composite decor <_short>Misc ./plugins/mousepoll/include/0000755000004100000410000000000013246301623016366 5ustar www-datawww-data./plugins/mousepoll/include/mousepoll/0000755000004100000410000000000013246301623020405 5ustar www-datawww-data./plugins/mousepoll/include/mousepoll/mousepoll.h0000644000004100000410000000220513246301623022574 0ustar www-datawww-data/* * * Compiz mouse position polling plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef _COMPIZ_MOUSEPOLL_H #define _COMPIZ_MOUSEPOLL_H #define COMPIZ_MOUSEPOLL_ABI 1 class MousePoller { public: typedef boost::function CallBack; MousePoller (); ~MousePoller (); void setCallback (CallBack callback); void start (); void stop (); bool active (); CompPoint getPosition (); static CompPoint getCurrentPosition (); private: bool mActive; CompPoint mPoint; CallBack mCallback; friend class MousepollScreen; }; #endif ./plugins/mousepoll/src/0000755000004100000410000000000013246301624015533 5ustar www-datawww-data./plugins/mousepoll/src/mousepoll.cpp0000644000004100000410000001103013246301623020250 0ustar www-datawww-data/* * * Compiz mouse position polling plugin * * mousepoll.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "private.h" COMPIZ_PLUGIN_20090315 (mousepoll, MousepollPluginVTable); bool MousepollScreen::getMousePosition () { Window root, child; int rootX, rootY; int winX, winY; int w = screen->width (), h = screen->height (); unsigned int maskReturn; bool status = XQueryPointer (screen->dpy (), screen->root (), &root, &child, &rootX, &rootY, &winX, &winY, &maskReturn); if (!status || rootX > w || rootY > h || screen->root () != root) return false; if (rootX != pos.x () || rootY != pos.y ()) { pos.set (rootX, rootY); return true; } return false; } bool MousepollScreen::updatePosition () { if (getMousePosition ()) { for (std::list::iterator it = pollers.begin (); it != pollers.end ();) { MousePoller *poller = *it; ++it; poller->mPoint = pos; poller->mCallback (pos); } } return true; } bool MousepollScreen::addTimer (MousePoller *poller) { bool start = pollers.empty (); std::list::iterator it = std::find (pollers.begin (), pollers.end (), poller); if (it != pollers.end ()) return false; pollers.insert (it, poller); if (start) { getMousePosition (); timer.start (); } return true; } void MousepollScreen::removeTimer (MousePoller *poller) { std::list::iterator it = std::find (pollers.begin(), pollers.end (), poller); if (it == pollers.end ()) return; pollers.erase (it); if (pollers.empty ()) timer.stop (); } void MousePoller::setCallback (MousePoller::CallBack callback) { bool wasActive = mActive; if (mActive) stop (); mCallback = callback; if (wasActive) start (); } void MousePoller::start () { MOUSEPOLL_SCREEN (screen); if (!ms) { compLogMessage ("mousepoll", CompLogLevelWarn, "Plugin version mismatch, can't start mouse poller."); return; } if (mCallback.empty ()) { compLogMessage ("mousepoll", CompLogLevelWarn, "Can't start mouse poller without callback."); return; } ms->addTimer (this); mActive = true; } void MousePoller::stop () { MOUSEPOLL_SCREEN (screen); /* Prevent broken plugins from calling stop () twice */ if (!mActive) return; if (!ms) { compLogMessage ("mousepoll", CompLogLevelWarn, "Plugin version mismatch, can't stop mouse poller."); return; } mActive = false; ms->removeTimer (this); } bool MousePoller::active () { return mActive; } CompPoint MousePoller::getCurrentPosition () { CompPoint p; MOUSEPOLL_SCREEN (screen); if (!ms) compLogMessage ("mousepoll", CompLogLevelWarn, "Plugin version mismatch, can't get mouse position."); else { ms->getMousePosition (); p = ms->pos; } return p; } CompPoint MousePoller::getPosition () { return mPoint; } MousePoller::MousePoller () : mActive (false), mPoint (0, 0), mCallback (NULL) { } MousePoller::~MousePoller () { if (mActive) stop (); } void MousepollScreen::updateTimer () { float timeout = optionGetMousePollInterval (); timer.setTimes (timeout, timeout * 1.5); } template class PluginClassHandler ; MousepollScreen::MousepollScreen (CompScreen *screen) : PluginClassHandler (screen) { updateTimer (); timer.setCallback (boost::bind (&MousepollScreen::updatePosition, this)); optionSetMousePollIntervalNotify (boost::bind (&MousepollScreen::updateTimer, this)); } bool MousepollPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_MOUSEPOLL_ABI; screen->storeValue ("mousepoll_ABI", p); return true; } return false; } void MousepollPluginVTable::fini () { screen->eraseValue ("mousepoll_ABI"); } ./plugins/mousepoll/src/private.h0000644000004100000410000000345113246301623017360 0ustar www-datawww-data/* * * Compiz mouse position polling plugin * * mousepoll.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "mousepoll_options.h" typedef enum _MousepollOptions { MP_DISPLAY_OPTION_MOUSE_POLL_INTERVAL, MP_DISPLAY_OPTION_NUM } MousepollDisplayOptions; class MousepollScreen; extern template class PluginClassHandler ; class MousepollScreen : public PluginClassHandler , public MousepollOptions { public: MousepollScreen (CompScreen *screen); std::list pollers; CompTimer timer; CompPoint pos; bool updatePosition (); bool getMousePosition (); bool addTimer (MousePoller *poller); void removeTimer (MousePoller *poller); void updateTimer (); }; #define MOUSEPOLL_SCREEN(s) \ MousepollScreen *ms = MousepollScreen::get (s) #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption)) class MousepollPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); void fini (); }; ./plugins/mousepoll/compiz-mousepoll.pc.in0000644000004100000410000000041413246301623021211 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-mousepoll Description: Mousepoll plugin for compiz Version: @VERSION@ Requires: compiz Libs: -L${libdir}/compiz -lmousepoll Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz ./plugins/ccp/0000755000004100000410000000000013246301623013471 5ustar www-datawww-data./plugins/ccp/CMakeLists.txt0000644000004100000410000000062213246301623016231 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (ccp LIBRARIES compizconfig CFLAGSADD -I${CMAKE_SOURCE_DIR}/compizconfig/libcompizconfig/include) if (NOT COMPIZ_DISABLE_PLUGIN_CCP) if (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ccp PROPERTIES INSTALL_RPATH "${COMPIZCONFIG_LIBDIR}" ) endif (COMPIZ_BUILD_WITH_RPATH) endif (NOT COMPIZ_DISABLE_PLUGIN_CCP) ./plugins/ccp/ccp.xml.in0000644000004100000410000000024313246301623015364 0ustar www-datawww-data <_short>CCP <_long>Compizconfig Settings Plugins ./plugins/ccp/src/0000755000004100000410000000000013246301623014260 5ustar www-datawww-data./plugins/ccp/src/ccp.h0000644000004100000410000000341013246301623015174 0ustar www-datawww-data/* * Compiz configuration system library plugin * * Copyright (C) 2007 Dennis Kasprzyk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ extern "C" { #include #include #include #include #include } #include #include #include class CcpScreen : public ScreenInterface, public PluginClassHandler { public: CcpScreen (CompScreen *screen); ~CcpScreen (); bool initPluginForScreen (CompPlugin *p); bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); bool timeout (); bool reload (); void setOptionFromContext (CompOption *o, const char *plugin); void setContextFromOption (CompOption *o, const char *plugin); public: CCSContext *mContext; bool mApplyingSettings; CompTimer mTimeoutTimer; CompTimer mReloadTimer; }; class CcpPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/ccp/src/ccp.cpp0000644000004100000410000002777713246301623015555 0ustar www-datawww-data/* * Compiz configuration system library plugin * * Copyright (C) 2007 Dennis Kasprzyk * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ccp.h" COMPIZ_PLUGIN_20090315 (ccp, CcpPluginVTable) static const unsigned short CCP_UPDATE_MIN_TIMEOUT = 250; static const unsigned short CCP_UPDATE_MAX_TIMEOUT = 4000; #define CORE_VTABLE_NAME "core" static void ccpSetValueToValue (CCSSettingValue *sv, CompOption::Value *v, CCSSettingType type) { switch (type) { case TypeInt: v->set ((int) sv->value.asInt); break; case TypeFloat: v->set ((float) sv->value.asFloat); break; case TypeBool: v->set ((bool) sv->value.asBool); break; case TypeColor: v->set ((unsigned short *) sv->value.asColor.array.array); break; case TypeString: v->set (CompString (sv->value.asString)); break; case TypeMatch: v->set (CompMatch (sv->value.asMatch)); break; case TypeKey: { CompAction action; int keycode = (sv->value.asKey.keysym == NoSymbol) ? 0 : XKeysymToKeycode (screen->dpy (), sv->value.asKey.keysym); action.setKey (CompAction::KeyBinding (keycode, sv->value.asKey.keyModMask)); v->set (action); } break; case TypeButton: { CompAction action; action.setEdgeMask (sv->value.asButton.edgeMask); action.setButton (CompAction::ButtonBinding ( sv->value.asButton.button, sv->value.asButton.buttonModMask)); v->set (action); } break; case TypeEdge: { CompAction action; action.setEdgeMask (sv->value.asEdge); v->set (action); } break; case TypeBell: { CompAction action; action.setBell (sv->value.asBell); v->set (action); } break; default: break; } } static bool ccpCCSTypeToCompizType (CCSSettingType st, CompOption::Type *ct) { switch (st) { case TypeBool: *ct = CompOption::TypeBool; break; case TypeInt: *ct = CompOption::TypeInt; break; case TypeFloat: *ct = CompOption::TypeFloat; break; case TypeColor: *ct = CompOption::TypeColor; break; case TypeString: *ct = CompOption::TypeString; break; case TypeMatch: *ct = CompOption::TypeMatch; break; case TypeKey: *ct = CompOption::TypeKey; break; case TypeButton: *ct = CompOption::TypeButton; break; case TypeEdge: *ct = CompOption::TypeEdge; break; case TypeBell: *ct = CompOption::TypeBell; break; case TypeList: *ct = CompOption::TypeList; break; default: return false; } return true; } static void ccpConvertPluginList (CCSSetting *s, CCSSettingValueList list, CompOption::Value *v) { CCSString *strCcp = (CCSString *) calloc (1, sizeof (CCSString)); CCSString *strCore = (CCSString *) calloc (1, sizeof (CCSString)); int i; strCcp->value = strdup ("ccp"); strCcp->refCount = 1; strCore->value = strdup ("core"); strCore->refCount = 1; CCSStringList sl = ccsGetStringListFromValueList (list); while (ccsStringListFind(sl, strCcp)) sl = ccsStringListRemove (sl, strCcp, TRUE); while (ccsStringListFind(sl, strCore)) sl = ccsStringListRemove (sl, strCore, TRUE); sl = ccsStringListPrepend (sl, strCcp); sl = ccsStringListPrepend (sl, strCore); CompOption::Value::Vector val (ccsStringListLength (sl)); CCSStringList l; for (l = sl, i = 0; l; l = l->next) { if (l->data) val[i].set (CompString (((CCSString *)l->data)->value)); ++i; } v->set (CompOption::TypeString, val); ccsStringListFree (sl, TRUE); } static void ccpSettingToValue (CCSSetting *s, CompOption::Value *v) { if (ccsSettingGetType (s) != TypeList) ccpSetValueToValue (ccsSettingGetValue (s), v, ccsSettingGetType (s)); else { CCSSettingValueList list; CompOption::Type type; ccsGetList (s, &list); if (!ccpCCSTypeToCompizType (ccsSettingGetInfo (s)->forList.listType, &type)) type = CompOption::TypeBool; if ((strcmp (ccsSettingGetName (s), "active_plugins") == 0) && (strcmp (ccsPluginGetName (ccsSettingGetParent (s)), CORE_VTABLE_NAME) == 0)) { ccpConvertPluginList (s, list, v); } else { int i = 0; CompOption::Value::Vector val (ccsSettingValueListLength (list)); while (list) { ccpSetValueToValue (list->data, &val[i], ccsSettingGetInfo (s)->forList.listType); list = list->next; ++i; } v->set (type, val); } } } static void ccpInitValue (CCSSettingValue *value, CompOption::Value *from, CCSSettingType type) { switch (type) { case TypeInt: value->value.asInt = from->i (); break; case TypeFloat: value->value.asFloat = from->f (); break; case TypeBool: value->value.asBool = from->b (); break; case TypeColor: { for (unsigned int i = 0; i < 4; ++i) value->value.asColor.array.array[i] = from->c ()[i]; } break; case TypeString: value->value.asString = strdup (from->s ().c_str ()); break; case TypeMatch: value->value.asMatch = strdup (from->match ().toString ().c_str ()); break; case TypeKey: if (from->action ().type () & CompAction::BindingTypeKey) { value->value.asKey.keysym = XKeycodeToKeysym (screen->dpy (), from->action ().key ().keycode (), 0); value->value.asKey.keyModMask = from->action ().key ().modifiers (); } else { value->value.asKey.keysym = 0; value->value.asKey.keyModMask = 0; } break; case TypeButton: if (from->action ().type () & CompAction::BindingTypeButton) { value->value.asButton.button = from->action ().button ().button (); value->value.asButton.buttonModMask = from->action ().button ().modifiers (); value->value.asButton.edgeMask = 0; } else if (from->action ().type () & CompAction::BindingTypeEdgeButton) { value->value.asButton.button = from->action ().button ().button (); value->value.asButton.buttonModMask = from->action ().button ().modifiers (); value->value.asButton.edgeMask = from->action ().edgeMask (); } else { value->value.asButton.button = 0; value->value.asButton.buttonModMask = 0; value->value.asButton.edgeMask = 0; } break; case TypeEdge: value->value.asEdge = from->action ().edgeMask (); break; case TypeBell: value->value.asBell = from->action ().bell (); break; default: break; } } static void ccpValueToSetting (CCSSetting *s, CompOption::Value *v) { CCSSettingValue *value = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (!value) return; value->refCount = 1; value->parent = s; if (ccsSettingGetType (s) == TypeList) { CCSSettingValue *val; foreach (CompOption::Value &lv, v->list ()) { val = (CCSSettingValue *) calloc (1, sizeof (CCSSettingValue)); if (val) { val->refCount = 1; val->parent = s; val->isListChild = TRUE; ccpInitValue (val, &lv, ccsSettingGetInfo (s)->forList.listType); value->value.asList = ccsSettingValueListAppend (value->value.asList, val); } } } else ccpInitValue (value, v, ccsSettingGetType (s)); ccsSetValue (s, value, TRUE); ccsFreeSettingValue (value); } static bool ccpTypeCheck (CCSSetting *s, CompOption *o) { CompOption::Type ot; switch (ccsSettingGetType (s)) { case TypeList: return ccpCCSTypeToCompizType (ccsSettingGetType (s), &ot) && (ot == o->type ()) && ccpCCSTypeToCompizType (ccsSettingGetInfo (s)->forList.listType, &ot) && (ot == o->value ().listType ()); break; default: return ccpCCSTypeToCompizType (ccsSettingGetType (s), &ot) && (ot == o->type ()); break; } return false; } void CcpScreen::setOptionFromContext (CompOption *o, const char *plugin) { CCSPlugin *bsp = ccsFindPlugin (mContext, (plugin) ? plugin : CORE_VTABLE_NAME); if (!bsp) return; CCSSetting *setting = ccsFindSetting (bsp, o->name ().c_str ()); if (!setting || !ccpTypeCheck (setting, o)) return; CompOption::Value value; ccpSettingToValue (setting, &value); mApplyingSettings = true; screen->setOptionForPlugin (plugin, o->name ().c_str (), value); mApplyingSettings = false; } void CcpScreen::setContextFromOption (CompOption *o, const char *plugin) { CCSPlugin *bsp = ccsFindPlugin (mContext, (plugin) ? plugin : CORE_VTABLE_NAME); if (!bsp) return; CCSSetting *setting = ccsFindSetting (bsp, o->name ().c_str ()); if (!setting || !ccpTypeCheck (setting, o)) return; ccpValueToSetting (setting, &o->value ()); ccsWriteChangedSettings (mContext); } bool CcpScreen::reload () { foreach (CompPlugin *p, CompPlugin::getPlugins ()) foreach (CompOption &o, p->vTable->getOptions ()) setOptionFromContext (&o, p->vTable->name ().c_str ()); return false; } bool CcpScreen::timeout () { ccsProcessEvents (mContext, ProcessEventsNoGlibMainLoopMask); CCSSettingList list = ccsContextStealChangedSettings (mContext); if (ccsSettingListLength (list)) { CCSSettingList l = list; CCSSetting *s; CompPlugin *p; CompOption *o; while (l) { s = l->data; l = l->next; p = CompPlugin::find (ccsPluginGetName (ccsSettingGetParent (s))); if (!p) continue; o = CompOption::findOption (p->vTable->getOptions (), ccsSettingGetName (s)); if (o) setOptionFromContext (o, ccsPluginGetName (ccsSettingGetParent (s))); ccsDebug ("Setting Update \"%s\"", ccsSettingGetName (s)); } ccsSettingListFree (list, FALSE); ccsContextClearChangedSettings (mContext); } return true; } bool CcpScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v) { CompOption *o = NULL; CompPlugin *p; bool can_save = (!mApplyingSettings && !mReloadTimer.active ()); if (can_save) { p = CompPlugin::find (plugin); if (p) { o = CompOption::findOption (p->vTable->getOptions (), name); if (o && (o->value () == v)) o = NULL; } } bool status = screen->setOptionForPlugin (plugin, name, v); if (o && status && can_save) setContextFromOption (o, p->vTable->name ().c_str ()); return status; } bool CcpScreen::initPluginForScreen (CompPlugin *p) { bool status = screen->initPluginForScreen (p); if (status) { foreach (CompOption &opt, p->vTable->getOptions ()) setOptionFromContext (&opt, p->vTable->name ().c_str ()); } return status; } CcpScreen::CcpScreen (CompScreen *screen) : PluginClassHandler (screen), mApplyingSettings (false) { ccsSetBasicMetadata (TRUE); mContext = ccsContextNew (screen->screenNum (), &ccsDefaultInterfaceTable); ccsReadSettings (mContext); ccsContextClearChangedSettings (mContext); mReloadTimer.start (boost::bind (&CcpScreen::reload, this), 0); mTimeoutTimer.start (boost::bind (&CcpScreen::timeout, this), CCP_UPDATE_MIN_TIMEOUT, CCP_UPDATE_MAX_TIMEOUT); ScreenInterface::setHandler (screen); } CcpScreen::~CcpScreen () { ccsContextDestroy (mContext); } bool CcpPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/cubeaddon/0000755000004100000410000000000013246301623014650 5ustar www-datawww-data./plugins/cubeaddon/CMakeLists.txt0000644000004100000410000000016413246301623017411 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (cubeaddon PLUGINDEPS composite opengl cube) ./plugins/cubeaddon/cubeaddon.xml.in0000644000004100000410000002271013246301623017725 0ustar www-datawww-data <_short>Cube Reflection and Deformation <_long>Adds a reflection to the desktop cube and deformes it to a cylinder or sphere Effects composite opengl cube rotate imgpng imgsvg imgjpeg opengl cube <_short>Cube Caps <_short>Bindings <_short>Reflection <_short>Deformation <_short>Sphere <_short>Cube Caps <_short>Behaviour <_short>Top <_short>Bottom ./plugins/cubeaddon/src/0000755000004100000410000000000013246301623015437 5ustar www-datawww-data./plugins/cubeaddon/src/cubeaddon.h0000644000004100000410000001220413246301623017533 0ustar www-datawww-data/* * Compiz cube reflection and cylinder deformation plugin * * cubeaddon.h * * Copyright : (C) 2009 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * includes code from cubecaps.c * * Copyright : (C) 2007 Guillaume Seguin * E-mail : guillaume@segu.in * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include #include #include #include #include "cubeaddon_options.h" const unsigned short CUBEADDON_GRID_SIZE = 100; const unsigned short CAP_ELEMENTS = 15; const unsigned int CAP_NVERTEX = (((CAP_ELEMENTS * (CAP_ELEMENTS + 1)) + 2) * 3); const unsigned int CAP_NIDX = (CAP_ELEMENTS * (CAP_ELEMENTS - 1) * 4); const unsigned int CAP_NIMGVERTEX = (((CAP_ELEMENTS + 1) * (CAP_ELEMENTS + 1)) * 5); const unsigned int CAP_NIMGIDX = (CAP_ELEMENTS * CAP_ELEMENTS * 4); const float RAD2I1024 = 162.9746617f; class CubeaddonScreen : public CompositeScreenInterface, public GLScreenInterface, public CubeScreenInterface, public PluginClassHandler, public CubeaddonOptions { public: CubeaddonScreen (CompScreen *); ~CubeaddonScreen (); bool setOption (const CompString &name, CompOption::Value &value); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib&, const GLMatrix&, const CompRegion&, CompOutput *, unsigned int); void glPaintTransformedOutput (const GLScreenPaintAttrib&, const GLMatrix&, const CompRegion&, CompOutput *, unsigned int); void cubeGetRotation (float &x, float &v, float &progress); void cubeClearTargetOutput (float xRotate, float vRotate); void cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); void cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal); bool cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points); bool cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order); bool cubeShouldPaintAllViewports (); class CubeCap { public: CubeCap (); void load (bool scale, bool aspect, bool clamp); int mCurrent; CompOption::Value::Vector mFiles; bool mLoaded; GLTexture::List mTexture; GLMatrix mTexMat; }; friend class CubeaddonWindow; private: bool changeCap (bool top, int change); void drawBasicGround (); void paintCap (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, bool top, bool adjust); private: CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *cubeScreen; bool mReflection; bool mFirst; CompOutput *mLast; float mYTrans; float mZTrans; float mBackVRotate; float mVRot; float mDeform; bool mWasDeformed; GLfloat *mWinNormals; unsigned int mWinNormSize; GLfloat mCapFill[CAP_NVERTEX]; GLfloat mCapFillNorm[CAP_NVERTEX]; GLushort mCapFillIdx[CAP_NIDX]; float mCapDeform; float mCapDistance; int mCapDeformType; CubeCap mTopCap; CubeCap mBottomCap; float mSinT[1024]; float mCosT[1024]; }; class CubeaddonWindow : public GLWindowInterface, public PluginClassHandler { public: CubeaddonWindow (CompWindow *); bool glDraw (const GLMatrix&, const GLWindowPaintAttrib&, const CompRegion&, unsigned int); void glAddGeometry (const GLTexture::MatrixList&, const CompRegion&, const CompRegion&, unsigned int, unsigned int); void glDrawTexture (GLTexture *, const GLMatrix &matrix, const GLWindowPaintAttrib& attrib, unsigned int); CompWindow *window; GLWindow *gWindow; CubeaddonScreen *caScreen; CubeScreen *cubeScreen; }; class CubeaddonPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/cubeaddon/src/cubeaddon.cpp0000644000004100000410000012340113246301623020070 0ustar www-datawww-data/* * Compiz cube reflection and cylinder deformation plugin * * cubeaddon.cpp * * Copyright : (C) 2009 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * includes code from cubecaps.c * * Copyright : (C) 2007 Guillaume Seguin * E-mail : guillaume@segu.in * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "cubeaddon.h" COMPIZ_PLUGIN_20090315 (cubeaddon, CubeaddonPluginVTable); unsigned short COLORMAX = 0xffff; /* * Initiate a CubeCap */ CubeaddonScreen::CubeCap::CubeCap () { mCurrent = 0; mLoaded = false; } /* * Attempt to load current cap image (if any) */ void CubeaddonScreen::CubeCap::load (bool scale, bool aspect, bool clamp) { /* we need to clear the texture, if no texture files are specified */ if (mFiles.empty ()) { mTexture.clear (); mLoaded = false; mCurrent = 0; return; } CompSize tSize; float xScale, yScale; CUBE_SCREEN (screen); mTexture.clear (); mLoaded = false; CompString imgName = mFiles[mCurrent].s (); CompString pname = "cubeaddon"; mTexture = GLTexture::readImageToTexture (imgName, pname, tSize); if (mTexture.empty ()) { compLogMessage ("cubeaddon", CompLogLevelWarn, "Failed to load slide: %s", mFiles[mCurrent].s ().c_str ()); return; } mLoaded = true; mTexMat.reset (); mTexMat[0] = mTexture[0]->matrix ().xx; mTexMat[1] = mTexture[0]->matrix ().yx; mTexMat[4] = mTexture[0]->matrix ().xy; mTexMat[5] = mTexture[0]->matrix ().yy; mTexMat[12] = mTexture[0]->matrix ().x0; mTexMat[13] = mTexture[0]->matrix ().y0; if (aspect) { if (scale) xScale = yScale = MIN (tSize.width (), tSize.height ()); else xScale = yScale = MAX (tSize.width (), tSize.height ()); } else { xScale = tSize.width (); yScale = tSize.height (); } mTexMat.translate (tSize.width () / 2.0, tSize.height () / 2.0, 0.0); mTexMat.scale (xScale / 2.0, yScale / 2.0, 1.0); if (scale) xScale = 1.0 / sqrtf (((cs->distance () * cs->distance ()) + 0.25)); else xScale = 1.0 / sqrtf (((cs->distance () * cs->distance ()) + 0.25) * 0.5); mTexMat.scale (xScale, xScale, 1.0); mTexture[0]->enable (GLTexture::Good); if (clamp) { if (GL::textureBorderClamp) { #ifndef USE_GLES /* FIXME: Simulate with shaders */ glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); #endif } else { glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } } else { glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (mTexture[0]->target (), GL_TEXTURE_WRAP_T, GL_REPEAT); } mTexture[0]->disable (); } /* Settings handling -------------------------------------------------------- */ /* * Switch cap, load it and damage screen if possible */ bool CubeaddonScreen::changeCap (bool top, int change) { CubeCap *cap = (top)? &mTopCap : &mBottomCap; int count = cap->mFiles.size (); /* mCurrent just changes in this case */ if (count && change) cap->mCurrent = (cap->mCurrent + change + count) % count; if (top) { cap->load (optionGetTopScale (), optionGetTopAspect (), optionGetTopClamp ()); } else { cap->load (optionGetBottomScale (), optionGetBottomAspect (), optionGetBottomClamp ()); cap->mTexMat.scale (1.0, -1.0, 1.0); } cScreen->damageScreen (); return false; } bool CubeaddonScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CubeaddonOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CubeaddonOptions::TopImages : mTopCap.mFiles = optionGetTopImages (); mTopCap.mCurrent = 0; changeCap (true, 0); break; case CubeaddonOptions::BottomImages : mBottomCap.mFiles = optionGetBottomImages (); mBottomCap.mCurrent = 0; changeCap (false, 0); break; case CubeaddonOptions::TopScale : case CubeaddonOptions::TopAspect : case CubeaddonOptions::TopClamp : changeCap (true, 0); break; case CubeaddonOptions::BottomScale : case CubeaddonOptions::BottomAspect : case CubeaddonOptions::BottomClamp : changeCap (false, 0); break; default: break; } return rv; } void CubeaddonScreen::drawBasicGround () { glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); float i = optionGetIntensity () * 2; GLMatrix transform; transform.translate (0.0f, 0.0f, -DEFAULT_Z_CAMERA); GLfloat ground1Vertices[] = { -0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, 0.0, 0.0, 0.5, 0.0, 0.0 }; unsigned short maxG1Color = MAX (0.0f, 1.0f - i) * 65535; unsigned short minG1Color = MIN (1.0, 1.0 - (i - 1.0)) * 65535; GLushort ground1Colors[] = { 0, 0, 0, maxG1Color, 0, 0, 0, maxG1Color, 0, 0, 0, minG1Color, 0, 0, 0, minG1Color }; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addVertices (4, ground1Vertices); streamingBuffer->addColors (4, ground1Colors); if (streamingBuffer->end ()) streamingBuffer->render (transform); if (optionGetGroundSize () > 0.0) { GLfloat ground2Vertices[] = { -0.5, -0.5, 0.0, 0.5, -0.5, 0.0, -0.5, static_cast (-0.5 + optionGetGroundSize ()), 0.0, 0.5, static_cast (-0.5 + optionGetGroundSize ()), 0.0 }; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor1 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addColors (1, optionGetGroundColor2 ()); streamingBuffer->addVertices (4, ground2Vertices); if (streamingBuffer->end ()) streamingBuffer->render (transform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); } bool CubeaddonScreen::cubeCheckOrientation (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, std::vector &points) { bool status = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, points); if (mReflection) return !status; return status; } void CubeaddonScreen::cubeGetRotation (float &x, float &v, float &progress) { cubeScreen->cubeGetRotation (x, v, progress); if (optionGetMode () == ModeAbove && v > 0.0 && mReflection) { mVRot = v; v = 0.0; } else mVRot = 0.0; } void CubeaddonScreen::cubeClearTargetOutput (float xRotate, float vRotate) { if (mReflection) glCullFace (GL_BACK); cubeScreen->cubeClearTargetOutput (xRotate, mBackVRotate); if (mReflection) glCullFace (GL_FRONT); } bool CubeaddonScreen::cubeShouldPaintViewport (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, PaintOrder order) { bool rv = cubeScreen->cubeShouldPaintViewport (sAttrib, transform, output, order); if (rv || cubeScreen->unfolded ()) return rv; if (mDeform > 0.0 && optionGetDeformation () == DeformationCylinder) { float z[3]; z[0] = cubeScreen->invert () * cubeScreen->distance (); z[1] = z[0] + (0.25 / cubeScreen->distance ()); z[2] = cubeScreen->invert () * sqrtf (0.25 + (cubeScreen->distance () * cubeScreen->distance ())); std::vector vPoints[3]; vPoints[0].push_back (GLVector (-0.5, 0.0, z[0], 1.0)); vPoints[0].push_back (GLVector ( 0.0, 0.5, z[1], 1.0)); vPoints[0].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[1].push_back (GLVector ( 0.5, 0.0, z[0], 1.0)); vPoints[1].push_back (GLVector ( 0.0, -0.5, z[1], 1.0)); vPoints[1].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[2].push_back (GLVector (-0.5, 0.0, z[2], 1.0)); vPoints[2].push_back (GLVector ( 0.0, 0.5, z[2], 1.0)); vPoints[2].push_back (GLVector ( 0.0, 0.0, z[2], 1.0)); bool ftb1 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[0]); bool ftb2 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[1]); bool ftb3 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[2]); rv = (order == FTB && (ftb1 || ftb2 || ftb3)) || (order == BTF && (!ftb1 || !ftb2 || !ftb3)); } else if (mDeform > 0.0 && optionGetDeformation () == DeformationSphere) { float z[4]; z[0] = sqrtf (0.5 + (cubeScreen->distance () * cubeScreen->distance ())); z[1] = z[0] + (0.25 / cubeScreen->distance ()); z[2] = sqrtf (0.25 + (cubeScreen->distance () * cubeScreen->distance ())); z[3] = z[2] + 0.5; std::vector vPoints[4]; vPoints[0].push_back (GLVector ( 0.0, 0.0, z[3], 1.0)); vPoints[0].push_back (GLVector (-0.5, 0.5, z[2], 1.0)); vPoints[0].push_back (GLVector ( 0.0, 0.5, z[2], 1.0)); vPoints[1].push_back (GLVector ( 0.0, 0.0, z[3], 1.0)); vPoints[1].push_back (GLVector ( 0.5, -0.5, z[2], 1.0)); vPoints[1].push_back (GLVector ( 0.0, -0.5, z[2], 1.0)); vPoints[2].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[2].push_back (GLVector (-0.5, -0.5, z[0], 1.0)); vPoints[2].push_back (GLVector (-0.5, 0.0, z[0], 1.0)); vPoints[3].push_back (GLVector ( 0.0, 0.0, z[1], 1.0)); vPoints[3].push_back (GLVector ( 0.5, 0.5, z[0], 1.0)); vPoints[3].push_back (GLVector ( 0.5, 0.0, z[0], 1.0)); bool ftb1 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[0]); bool ftb2 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[1]); bool ftb3 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[2]); bool ftb4 = cubeScreen->cubeCheckOrientation (sAttrib, transform, output, vPoints[3]); rv = (order == FTB && (ftb1 || ftb2 || ftb3 || ftb4)) || (order == BTF && (!ftb1 || !ftb2 || !ftb3 || !ftb4)); } return rv; } void CubeaddonScreen::paintCap (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, bool top, bool adjust) { GLScreenPaintAttrib sa; GLMatrix sTransform; int cullNorm, cullInv; bool wasCulled = glIsEnabled (GL_CULL_FACE); float cInv = (top) ? 1.0: -1.0; CubeCap *cap; bool cAspect; unsigned short *color; glGetIntegerv (GL_CULL_FACE_MODE, &cullNorm); cullInv = (cullNorm == GL_BACK)? GL_FRONT : GL_BACK; if (top) color = cubeScreen->topColor (); else color = cubeScreen->bottomColor (); int opacity = cubeScreen->desktopOpacity () * color[3] / 0xffff; glEnable (GL_BLEND); if (top) { cap = &mTopCap; cAspect = optionGetTopAspect (); } else { cap = &mBottomCap; cAspect = optionGetBottomAspect (); } glEnable(GL_CULL_FACE); for (int l = 0; l < ((cubeScreen->invert () == 1) ? 2 : 1); l++) { glCullFace(((l == 1) ^ top) ? cullInv : cullNorm); for (int i = 0; i < size; i++) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_FAN); if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps ()) { streamingBuffer->addNormals (CAP_NVERTEX / 3, (l == 0) ? mCapFill : mCapFillNorm); } else { GLfloat nonDeformNormals[] = { 0.0f, (l == 0) ? 1.0f : -1.0f, 0.0f }; streamingBuffer->addNormals (1, nonDeformNormals); } sa = sAttrib; sTransform = transform; if (cubeScreen->invert () == 1) { sa.yRotate += (360.0f / size) * cubeScreen->xRotations (); if (!adjust) sa.yRotate -= (360.0f / size) * screen->vp ().x (); } else { sa.yRotate += 180.0f; sa.yRotate -= (360.0f / size) * cubeScreen->xRotations (); if (!adjust) sa.yRotate += (360.0f / size) * screen->vp ().x (); } sa.yRotate += (360.0f / size) * i; gScreen->glApplyTransform (sa, output, &sTransform); GLMatrix cTransform (sTransform); cTransform.translate (cubeScreen->outputXOffset (), -cubeScreen->outputYOffset (), 0.0f); cTransform.scale (cubeScreen->outputXScale (), cubeScreen->outputYScale (), 1.0f); cTransform.scale (1.0, cInv, 1.0); float normalizedOpacity = opacity / static_cast (OPAQUE); float premultColors[] = { (color[0] / OPAQUE) * normalizedOpacity, (color[1] / OPAQUE) * normalizedOpacity, (color[2] / OPAQUE) * normalizedOpacity }; streamingBuffer->color4f (premultColors[0], premultColors[1], premultColors[2], normalizedOpacity); streamingBuffer->addVertices (CAP_ELEMENTS + 2, mCapFill); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps ()) { #ifndef USE_GLES streamingBuffer->begin (GL_QUADS); streamingBuffer->color4f (premultColors[0], premultColors[1], premultColors[2], normalizedOpacity); streamingBuffer->addNormals (CAP_NVERTEX / 3, (l == 0) ? mCapFill : mCapFillNorm); GLushort *idx = mCapFillIdx; GLfloat capVertices[CAP_NIDX * 3]; GLfloat *capVerticesPtr = capVertices; for (unsigned int i = 0; i < CAP_NIDX; ++i) { unsigned int vertexIndex = idx[i] * 3; *(capVerticesPtr++) = (mCapFill[vertexIndex]); *(capVerticesPtr++) = (mCapFill[vertexIndex + 1]); *(capVerticesPtr++) = (mCapFill[vertexIndex + 2]); } streamingBuffer->addVertices (CAP_NIDX, &capVertices[0]); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); #endif } if (cap->mLoaded) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix texMat = cap->mTexMat; if (cubeScreen->invert () != 1) texMat.scale (-1.0, 1.0, 1.0); streamingBuffer->begin (GL_TRIANGLE_FAN); float normalizedOpacity = cubeScreen->desktopOpacity () / OPAQUE; streamingBuffer->color4f (normalizedOpacity, normalizedOpacity, normalizedOpacity, normalizedOpacity); cap->mTexture[0]->enable (GLTexture::Good); if (cAspect) { float scale, xScale = 1.0, yScale = 1.0; scale = (float)output->width () / (float)output->height (); if (output->width () > output->height ()) { xScale = 1.0; yScale = 1.0 / scale; } else { xScale = scale; yScale = 1.0; } if (optionGetTopScale ()) { scale = xScale; xScale = 1.0 / yScale; yScale = 1.0 / scale; } texMat.scale (xScale, yScale, 1.0); } texMat.rotate (-(360.0f / size) * i, 0.0, 0.0, 1.0); GLVector sGen (texMat[0], texMat[8], texMat[4], texMat[12]); GLVector tGen (texMat[1], texMat[9], texMat[5], texMat[13]); /* Generate texCoords for the top section of the * cap */ GLfloat texCoords[(CAP_ELEMENTS + 2) * 2]; GLfloat *texCoordsPtr = texCoords; for (unsigned int i = 0; i < CAP_ELEMENTS + 2; i++) { GLVector v (mCapFill[i * 3], mCapFill[i * 3 + 1], mCapFill[i * 3 + 2], 1.0f); float s = v * sGen + 0.5; float t = v * tGen + 0.5; *(texCoordsPtr++) = s; *(texCoordsPtr++) = t; } streamingBuffer->addTexCoords (0, CAP_NVERTEX / 3, &texCoords[0]); streamingBuffer->addVertices (CAP_NVERTEX / 3, mCapFill); streamingBuffer->setMaxVertices (CAP_ELEMENTS + 2); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps ()) { #ifndef USE_GLES streamingBuffer->begin (GL_QUADS); streamingBuffer->color4f (normalizedOpacity, normalizedOpacity, normalizedOpacity, normalizedOpacity); streamingBuffer->addNormals (CAP_NVERTEX / 3, (l == 0) ? mCapFill : mCapFillNorm); /* Generate texCoords and vertices for the * curvature around the top section of the cap * * This is a little more inefficient than it should be. * * The previous implementation used glDrawElements with * and IBO to ensure that we didn't send lots of redundant * geometry to the GPU, however GLVertexBuffer doesn't have * any concept of indexed rendering, and instead takes a vertex * buffer with all the geometry. * * FIXME: This code uses GL_QUADS, so its not compatible with * OpenGL|ES at the moment */ GLushort *idx = mCapFillIdx; GLfloat capVertices[CAP_NIDX * 3]; GLfloat texCoords[CAP_NIDX * 2]; GLfloat *capVerticesPtr = capVertices; GLfloat *texCoordsPtr = texCoords; for (unsigned int i = 0; i < CAP_NIDX; ++i) { unsigned int vertexIndex = idx[i] * 3; GLVector v (mCapFill[vertexIndex], mCapFill[vertexIndex + 1], mCapFill[vertexIndex + 2], 1.0f); *(capVerticesPtr++) = v[GLVector::x]; *(capVerticesPtr++) = v[GLVector::y]; *(capVerticesPtr++) = v[GLVector::z]; /* GL_OBJECT_LINEAR is simulated by doing: * texCoord.s = dot (vec4 (obj, 1.0), sGenPlane) * texCoord.t = dot (vec4 (obj, 1.0), tGenPlane) */ float s = v * sGen + 0.5; float t = v * tGen + 0.5; *(texCoordsPtr++) = s; *(texCoordsPtr++) = t; } streamingBuffer->addVertices (CAP_NIDX, &capVertices[0]); streamingBuffer->addTexCoords (0, CAP_NIDX, &texCoords[0]); if (streamingBuffer->end ()) streamingBuffer->render (cTransform); #endif } cap->mTexture[0]->disable (); } } } glDisable (GL_BLEND); glCullFace (cullNorm); if (!wasCulled) glDisable (GL_CULL_FACE); } void CubeaddonScreen::cubePaintTop (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { /* we do not want to draw anything if this option is disabled */ if (!optionGetDrawTop ()) return; if (((!optionGetDrawBottom () && cubeScreen->invert () == -1) || (!optionGetDrawTop () && cubeScreen->invert () == 1)) && /* the original top cap will work for the non-deformed cube only */ (optionGetDeformation () == DeformationNone)) cubeScreen->cubePaintTop (sAttrib, transform, output, size, normal); else paintCap (sAttrib, transform, output, size, true, optionGetAdjustTop ()); } void CubeaddonScreen::cubePaintBottom (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, CompOutput *output, int size, const GLVector &normal) { /* we do not want to draw anything if this option is disabled */ if (!optionGetDrawBottom ()) return; if (((!optionGetDrawBottom () && cubeScreen->invert () == 1) || (!optionGetDrawTop () && cubeScreen->invert () == -1)) && /* the original bottom cap will work for the non-deformed cube only */ (optionGetDeformation () == DeformationNone)) cubeScreen->cubePaintBottom (sAttrib, transform, output, size, normal); else paintCap (sAttrib, transform, output, size, false, optionGetAdjustBottom ()); } void CubeaddonWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { if (caScreen->mDeform > 0.0) { GLVertexBuffer *vb = gWindow->vertexBuffer (); int i, oldVCount = vb->countVertices (); GLfloat *v; int offX = 0, offY = 0; int sx1, sx2, sw, sy1, sy2, sh; float radSquare, last[2][4]; float inv = (cubeScreen->invert () == 1) ? 1.0 : -1.0; float ang, sx1g, sx2g, sy1g, sy2g; CubeScreen::MultioutputMode cMOM = cubeScreen->multioutputMode (); int caD = caScreen->optionGetDeformation (); float cDist = cubeScreen->distance (); if (caD == CubeaddonScreen::DeformationCylinder || cubeScreen->unfolded ()) { radSquare = (cDist * cDist) + 0.25; } else { maxGridHeight = MIN (CUBEADDON_GRID_SIZE, maxGridHeight); radSquare = (cDist * cDist) + 0.5; } gWindow->glAddGeometry (matrix, region, clip, MIN (CUBEADDON_GRID_SIZE, maxGridWidth), maxGridHeight); vb = gWindow->vertexBuffer (); v = vb->getVertices (); v += vb->getVertexStride () - 3; v += vb->getVertexStride () * oldVCount; if (!window->onAllViewports ()) { CompPoint offset = caScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); offX = offset.x (); offY = offset.y (); } if (cMOM == CubeScreen::OneBigCube) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else if (cMOM == CubeScreen::MultipleCubes) { sx1 = caScreen->mLast->x1 (); sx2 = caScreen->mLast->x2 (); sw = sx2 - sx1; sy1 = caScreen->mLast->y1 (); sy2 = caScreen->mLast->y2 (); sh = sy2 - sy1; } else { if (cubeScreen->nOutput () != (int) screen->outputDevs ().size ()) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else { sx1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x1 (); sx2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x2 (); sw = sx2 - sx1; sy1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y1 (); sy2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y2 (); sh = sy2 - sy1; } } sx1g = sx1 - CUBEADDON_GRID_SIZE; sx2g = sx2 + CUBEADDON_GRID_SIZE; sy1g = sy1 - CUBEADDON_GRID_SIZE; sy2g = sy2 + CUBEADDON_GRID_SIZE; if (caD == CubeaddonScreen::DeformationCylinder || cubeScreen->unfolded ()) { float lastX = std::numeric_limits ::min (), lastZ = 0.0; for (i = oldVCount; i < vb->countVertices (); i++) { if (v[0] == lastX) { v[2] = lastZ; } else if (v[0] + offX >= sx1g && v[0] + offY < sx2g) { ang = (((v[0] + offX - sx1) / (float)sw) - 0.5); ang *= ang; if (ang < radSquare) { v[2] = sqrtf (radSquare - ang) - cDist; v[2] *= caScreen->mDeform * inv; } } lastX = v[0]; lastZ = v[2]; v += vb->getVertexStride (); } } else { last[0][0] = -1000000000.0; last[1][0] = -1000000000.0; int cLast = 0; for (i = oldVCount; i < vb->countVertices (); i++) { if (last[0][0] == v[0] && last[0][1] == v[1]) { v[0] = last[0][2]; v[2] = last[0][3]; v += vb->getVertexStride (); continue; } else if (last[1][0] == v[0] && last[1][1] == v[1]) { v[0] = last[1][2]; v[2] = last[1][3]; v += vb->getVertexStride (); continue; } float vpx = v[0] + offX; float vpy = v[1] + offY; if (vpx >= sx1g && vpx < sx2g && vpy >= sy1g && vpy < sy2g) { last[cLast][0] = v[0]; last[cLast][1] = v[1]; float a1 = (((vpx - sx1) / (float)sw) - 0.5); float a2 = (((vpy - sy1) / (float)sh) - 0.5); a2 *= a2; ang = atanf (a1 / cDist); a2 = sqrtf (radSquare - a2); int iang = (((int)(ang * RAD2I1024)) + 1024) & 0x3ff; v[2] += ((caScreen->mCosT [iang] * a2) - cDist) * caScreen->mDeform * inv; v[0] += ((caScreen->mSinT [iang] * a2) - a1) * sw * caScreen->mDeform; last[cLast][2] = v[0]; last[cLast][3] = v[2]; cLast = (cLast + 1) & 1; } v += vb->getVertexStride (); } } } else { gWindow->glAddGeometry (matrix, region, clip, maxGridWidth, maxGridHeight); } } bool CubeaddonWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK) && caScreen->mDeform) { CompPoint offset; if (!window->onAllViewports ()) { offset = caScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); } int x1 = window->x () - window->output ().left + offset.x (); int x2 = window->x () + window->width () + window->output ().right + offset.x (); if (x1 < 0 && x2 < 0) return false; if (x1 > screen->width () && x2 > screen->width ()) return false; } return gWindow->glDraw (transform, attrib, region, mask); } void CubeaddonWindow::glDrawTexture (GLTexture *texture, const GLMatrix &matrix, const GLWindowPaintAttrib &attrib, unsigned int mask) { if (caScreen->mDeform > 0.0 && caScreen->gScreen->lighting ()) { int i; int sx1, sx2, sw, sy1, sy2, sh; int offX = 0, offY = 0; float x, y; GLfloat *v, *n; GLVertexBuffer *vb = gWindow->vertexBuffer (); CubeScreen::MultioutputMode cMOM = cubeScreen->multioutputMode (); float cDist = cubeScreen->distance (); float inv = (cubeScreen->invert () == 1) ? 1.0: -1.0; float ym = (caScreen->optionGetDeformation () == CubeaddonScreen::DeformationCylinder) ? 0.0 : 1.0; int vertexCount = vb->countVertices (); if ((int) caScreen->mWinNormSize < vertexCount * 3) { delete [] caScreen->mWinNormals; caScreen->mWinNormals = new GLfloat[vertexCount * 3]; caScreen->mWinNormSize = vertexCount * 3; } if (!window->onAllViewports ()) { CompPoint offset = caScreen->cScreen->windowPaintOffset (); offset = window->getMovementForOffset (offset); offX = offset.x (); offY = offset.y (); } if (cMOM == CubeScreen::OneBigCube) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else if (cMOM == CubeScreen::MultipleCubes) { sx1 = caScreen->mLast->x1 (); sx2 = caScreen->mLast->x2 (); sw = sx2 - sx1; sy1 = caScreen->mLast->y1 (); sy2 = caScreen->mLast->y2 (); sh = sy2 - sy1; } else { if (cubeScreen->nOutput () != (int) screen->outputDevs ().size ()) { sx1 = 0; sx2 = screen->width (); sw = screen->width (); sy1 = 0; sy2 = screen->height (); sh = screen->height (); } else { sx1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x1 (); sx2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].x2 (); sw = sx2 - sx1; sy1 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y1 (); sy2 = screen->outputDevs ()[cubeScreen->sourceOutput ()].y2 (); sh = sy2 - sy1; } } v = vb->getVertices () + (vb->getVertexStride () - 3); n = caScreen->mWinNormals; if (cubeScreen->paintOrder () == FTB) { for (i = 0; i < vertexCount; i++) { x = (((v[0] + offX - sx1) / (float)sw) - 0.5); y = (((v[1] + offY - sy1) / (float)sh) - 0.5); *(n)++ = x / sw * caScreen->mDeform; *(n)++ = y / sh * caScreen->mDeform * ym; *(n)++ = v[2] + cDist; v += vb->getVertexStride (); } } else { for (i = 0; i < vertexCount; i++) { x = (((v[0] + offX - sx1) / (float)sw) - 0.5); y = (((v[1] + offY - sy1) / (float)sh) - 0.5); *(n)++ = -x / sw * caScreen->mDeform * inv; *(n)++ = -y / sh * caScreen->mDeform * ym * inv; *(n)++ = -(v[2] + cDist); v += vb->getVertexStride (); } } vb->addNormals (caScreen->mWinNormSize / 3, caScreen->mWinNormals); gWindow->glDrawTexture (texture, matrix, attrib, mask); return; } gWindow->glDrawTexture (texture, matrix, attrib, mask); } bool CubeaddonScreen::cubeShouldPaintAllViewports () { bool status = cubeScreen->cubeShouldPaintAllViewports (); return (!optionGetDrawTop () || !optionGetDrawBottom () || (mDeform > 0.0) || status); } void CubeaddonScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform = transform; float cDist = cubeScreen->distance (); float cDist2 = cubeScreen->distance () * cubeScreen->distance (); if (optionGetDeformation () != DeformationNone && screen->vpSize ().width () * cubeScreen->nOutput () > 2 && screen->desktopWindowCount () && (cubeScreen->rotationState () == CubeScreen::RotationManual || (cubeScreen->rotationState () == CubeScreen::RotationChange && !optionGetCylinderManualOnly ()) || mWasDeformed) && (!cubeScreen->unfolded () || optionGetUnfoldDeformation ())) { float x, progress; cubeScreen->cubeGetRotation (x, x, progress); mDeform = progress; if (optionGetSphereAspect () > 0.0 && cubeScreen->invert () == 1 && optionGetDeformation () == DeformationSphere) { float scale, val = optionGetSphereAspect () * mDeform; if (output->width () > output->height ()) { scale = (float)output->height () / (float)output->width (); scale = (scale * val) + 1.0 - val; sTransform.scale (scale, 1.0, 1.0); } else { scale = (float)output->width () / (float)output->height (); scale = (scale * val) + 1.0 - val; sTransform.scale (1.0, scale, 1.0); } } } else { mDeform = 0.0; } cubeScreen->cubeShouldPaintAllViewportsSetEnabled (this, true); if (mCapDistance != cDist) { changeCap (true, 0); changeCap (false, 0); } if (mDeform != mCapDeform || mCapDistance != cDist || mCapDeformType != optionGetDeformation ()) { float *quad; int j; float rS, r, x, y, z; if (optionGetDeformation () != DeformationSphere || !optionGetDeformCaps ()) { rS = cDist2 + 0.5; mCapFill[0] = 0.0; mCapFill[1] = 0.5; mCapFill[2] = 0.0; mCapFillNorm[0] = 0.0; mCapFillNorm[1] = -1.0; mCapFillNorm[2] = 0.0; z = cDist; r = 0.25 + cDist2; for (j = 0; j <= CAP_ELEMENTS; j++) { x = -0.5 + ((float)j / (float)CAP_ELEMENTS); z = ((sqrtf(r - (x * x)) - cDist) * mDeform) + cDist; y = 0.5; quad = &mCapFill[(1 + j) * 3]; quad[0] = x; quad[1] = y; quad[2] = z; quad = &mCapFillNorm[(1 + j) * 3]; quad[0] = -x; quad[1] = -y; quad[2] = -z; } } else { float w; rS = cDist2 + 0.5; mCapFill[0] = 0.0; mCapFill[1] = ((sqrtf (rS) - 0.5) * mDeform) + 0.5; mCapFill[2] = 0.0; mCapFillNorm[0] = 0.0; mCapFillNorm[1] = -1.0; mCapFillNorm[2] = 0.0; for (int i = 0; i < CAP_ELEMENTS; i++) { w = (float)(i + 1) / (float)CAP_ELEMENTS; r = (((w / 2.0) * (w / 2.0)) + (cDist2 * w * w)); for (j = 0; j <= CAP_ELEMENTS; j++) { x = - (w / 2.0) + ((float)j * w / (float)CAP_ELEMENTS); z = ((sqrtf(r - (x * x)) - (cDist * w)) * mDeform) + (cDist * w); y = ((sqrtf(rS - (x * x) - (r - (x * x))) - 0.5) * mDeform) + 0.5; quad = &mCapFill[(1 + (i * (CAP_ELEMENTS + 1)) + j) * 3]; quad[0] = x; quad[1] = y; quad[2] = z; quad = &mCapFillNorm[(1 + (i * (CAP_ELEMENTS + 1)) + j) * 3]; quad[0] = -x; quad[1] = -y; quad[2] = -z; } } } mCapDeform = mDeform; mCapDistance = cDist; mCapDeformType = optionGetDeformation (); } if (cubeScreen->invert () == 1 && mFirst && optionGetReflection ()) { mFirst = false; mReflection = true; if (screen->grabExist ("cube")) { GLMatrix rTransform = sTransform; rTransform.translate (0.0, -1.0, 0.0); rTransform.scale (1.0, -1.0, 1.0); glCullFace (GL_FRONT); gScreen->glPaintTransformedOutput (sAttrib, rTransform, region, output, mask); glCullFace (GL_BACK); drawBasicGround (); } else { GLMatrix rTransform = sTransform; GLMatrix pTransform; float angle = 360.0 / ((float) screen->vpSize ().width () * cubeScreen->nOutput ()); float xRot, vRot, xRotate, xRotate2, vRotate, p; float rYTrans; GLVector point (-0.5, -0.5, cDist, 1.0); GLVector point2 (-0.5, 0.5, cDist, 1.0); float deform = 0.0f; cubeScreen->cubeGetRotation (xRot, vRot, p); mBackVRotate = 0.0; xRotate = xRot; xRotate2 = xRot; vRotate = vRot; if (vRotate < 0.0) xRotate += 180; vRotate = fmod (fabs (vRotate), 180.0); xRotate = fmod (fabs (xRotate), angle); xRotate2 = fmod (fabs (xRotate2), angle); if (vRotate >= 90.0) vRotate = 180.0 - vRotate; if (xRotate >= angle / 2.0) xRotate = angle - xRotate; if (xRotate2 >= angle / 2.0) xRotate2 = angle - xRotate2; xRotate = (mDeform * angle * 0.5) + ((1.0 - mDeform) * xRotate); xRotate2 = (mDeform * angle * 0.5) + ((1.0 - mDeform) * xRotate2); pTransform.reset (); pTransform.rotate (xRotate, 0.0f, 1.0f, 0.0f); pTransform.rotate (vRotate, cosf (xRotate * (M_PI / 180.0f)), 0.0f, sinf (xRotate * (M_PI / 180.0f))); point = pTransform * point; pTransform.reset (); pTransform.rotate (xRotate2, 0.0f, 1.0f, 0.0f); pTransform.rotate (vRotate, cosf (xRotate2 * (M_PI / 180.0f)), 0.0f, sinf (xRotate2 * (M_PI / 180.0f))); point2 = pTransform * point2; switch (optionGetMode ()) { case ModeJumpyReflection: mYTrans = 0.0; if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps () && optionGetDrawBottom ()) rYTrans = sqrt (0.5 + cDist2) * -2.0; else rYTrans = point[1] * 2.0; break; case ModeDistance: mYTrans = 0.0; rYTrans = sqrt (0.5 + cDist2) * -2.0; break; default: if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps () && optionGetDrawBottom ()) { mYTrans = mCapFill[1] - 0.5; rYTrans = -mCapFill[1] - 0.5; } else if (optionGetDeformation () == DeformationSphere && vRotate > atan (cDist * 2) / (M_PI / 180.0f)) { mYTrans = sqrt (0.5 + cDist2) - 0.5; rYTrans = -sqrt (0.5 + cDist2) - 0.5; } else { mYTrans = -point[1] - 0.5; rYTrans = point[1] - 0.5; } break; } if (!optionGetAutoZoom () || ((cubeScreen->rotationState () != CubeScreen::RotationManual) && optionGetZoomManualOnly ())) mZTrans = 0.0; else mZTrans = -point2[2] + cDist; if (optionGetMode () == ModeAbove) mZTrans = 0.0; if (optionGetDeformation () == DeformationCylinder) deform = (sqrt (0.25 + cDist2) - cDist) * -mDeform; else if (optionGetDeformation () == DeformationSphere) deform = (sqrt (0.5 + cDist2) - cDist) * -mDeform; if (mDeform > 0.0) mZTrans = deform; if (optionGetMode () == ModeAbove && mVRot > 0.0) { mBackVRotate = mVRot; if (optionGetDeformation () == DeformationSphere && optionGetDeformCaps () && optionGetDrawBottom ()) { mYTrans = mCapFill[1] - 0.5; rYTrans = -mCapFill[1] - 0.5; } else { mYTrans = 0.0; rYTrans = -1.0; } pTransform.reset (); gScreen->glApplyTransform (sAttrib, output, &pTransform); point = GLVector (0.0, 0.0, -cDist + deform, 1.0); point = pTransform * point; rTransform.translate (0.0, 0.0, point[2]); rTransform.rotate (mVRot, 1.0, 0.0, 0.0); rTransform.scale (1.0, -1.0, 1.0); rTransform.translate (0.0, -rYTrans, -point[2] + mZTrans); } else { rTransform.translate (0.0, rYTrans, mZTrans); rTransform.scale (1.0, -1.0, 1.0); } glCullFace (GL_FRONT); gScreen->glPaintTransformedOutput (sAttrib, rTransform, region, output, mask); glCullFace (GL_BACK); if (optionGetMode () == ModeAbove && mVRot > 0.0) { float v = MIN (1.0, mVRot / 30.0); unsigned short col1[4], col2[4]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLMatrix gTransform; glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gTransform.translate (0, 0, -DEFAULT_Z_CAMERA); float i = optionGetIntensity () * 2; float c = optionGetIntensity (); GLfloat vertices[] = { 0.5f, v / 2.0f, 0.0f, -0.5f, v / 2.0f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; unsigned short cMax = MAX (0.0, 1.0 - i) + (v * c); unsigned short cMin = MIN (1.0, 1.0 - (i - 1.0)) + (v * c); GLushort colors[] = { 0, 0, 0, cMax, 0, 0, 0, cMax, 0, 0, 0, cMin, 0, 0, 0, cMin }; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addColors (4, colors); streamingBuffer->addVertices (4, vertices); if (streamingBuffer->end ()) streamingBuffer->render (gTransform); for (int j = 0; j < 4; j++) { col1[j] = (1.0 - v) * optionGetGroundColor1 () [j] + (v * (optionGetGroundColor1 () [j] + optionGetGroundColor2 () [j]) * 0.5); col2[j] = (1.0 - v) * optionGetGroundColor2 () [j] + (v * (optionGetGroundColor1 () [j] + optionGetGroundColor2 () [j]) * 0.5); } if (optionGetGroundSize () > 0.0) { GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, -0.5f + static_cast (((1 - v) * optionGetGroundSize ()) + v), -0.5f, -0.5f + static_cast (((1 - v) * optionGetGroundSize ()) + v) }; GLushort colors[] = { col1[0], col1[1], col1[2], col1[3], col1[0], col1[1], col1[2], col1[3], col2[0], col2[1], col2[2], col2[3], col2[0], col2[1], col2[2], col2[3] }; streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->addVertices (4, vertices); streamingBuffer->addColors (4, colors); if (streamingBuffer->end ()) streamingBuffer->render (gTransform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); } else drawBasicGround (); } cubeScreen->repaintCaps (); mReflection = false; } else cubeScreen->cubeShouldPaintAllViewportsSetEnabled (this, false); if (!optionGetReflection ()) { mYTrans = 0.0; mZTrans = (sqrt (0.25 + cDist2) - cDist) * -mDeform; } sTransform.translate (0.0, mYTrans, mZTrans); gScreen->glPaintTransformedOutput (sAttrib, sTransform, region, output, mask); } bool CubeaddonScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mLast != output) mFirst = true; mLast = output; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void CubeaddonScreen::donePaint () { mFirst = true; mYTrans = 0.0; mZTrans = 0.0; mWasDeformed = (mDeform > 0.0); if (mDeform > 0.0 && mDeform < 1.0) { cScreen->damageScreen (); mDeform = 0.0; } cScreen->donePaint (); } CubeaddonScreen::CubeaddonScreen (CompScreen *s) : PluginClassHandler (s), CubeaddonOptions (), cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), cubeScreen (CubeScreen::get (s)), mReflection (false), mFirst (true), mLast (0), mYTrans (0.0), mZTrans (0.0), mDeform (0.0), mWinNormals (0), mWinNormSize (0), mCapDeform (-1.0), mCapDistance (cubeScreen->distance ()) { GLushort *idx; idx = mCapFillIdx; for (int i = 0; i < CAP_ELEMENTS - 1; i++) for (int j = 0; j < CAP_ELEMENTS; j++) { idx[0] = 1 + (i * (CAP_ELEMENTS + 1)) + j; idx[1] = 1 + ((i + 1) * (CAP_ELEMENTS + 1)) + j; idx[2] = 2 + ((i + 1) * (CAP_ELEMENTS + 1)) + j; idx[3] = 2 + (i * (CAP_ELEMENTS + 1)) + j; idx += 4; } mTopCap.mFiles = optionGetTopImages (); mBottomCap.mFiles = optionGetBottomImages (); for (int i = 0; i < 1024; i++) { mSinT[i] = sinf(i / RAD2I1024); mCosT[i] = cosf(i / RAD2I1024); } changeCap (true, 0); changeCap (false, 0); #define BIND_ACTION(opt, t, d) \ optionSet##opt##Initiate (boost::bind (&CubeaddonScreen::changeCap, this, t, d)) BIND_ACTION (TopNextKey, true, 1); BIND_ACTION (TopPrevKey, true, -1); BIND_ACTION (BottomNextKey, false, 1); BIND_ACTION (BottomNextKey, false, -1); BIND_ACTION (TopNextButton, true, 1); BIND_ACTION (TopPrevButton, true, -1); BIND_ACTION (BottomNextButton, false, 1); BIND_ACTION (BottomNextButton, false, -1); #undef BIND_ACTION CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); CubeScreenInterface::setHandler (cubeScreen, true); } CubeaddonScreen::~CubeaddonScreen () { if (mWinNormals) delete [] mWinNormals; } CubeaddonWindow::CubeaddonWindow (CompWindow *w) : PluginClassHandler (w), window (w), gWindow (GLWindow::get (w)), caScreen (CubeaddonScreen::get (screen)), cubeScreen (CubeScreen::get (screen)) { GLWindowInterface::setHandler (gWindow, true); } bool CubeaddonPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("cube", COMPIZ_CUBE_ABI)) return true; return false; } ./plugins/cubeaddon/images/0000755000004100000410000000000013246301623016115 5ustar www-datawww-data./plugins/cubeaddon/images/fusioncap.png0000644000004100000410000041321213246301623020615 0ustar www-datawww-dataPNG  IHDRXXfQIDATxdYvݷ>FDF>*3jzg9vs,K2l`%C`@d DdBH 0lH9$J֋21L̦Cԫ^]ՕU?sn܌zn 7WfFrujjjjjjjjjz 5PC ~Wlxˆkj' 5XC 5PC} ӏ훏]}l 5PC 5P3DUFo۷V~v(7׀O[C 5PC 5sQ}p~=;]yZr tkj {˟=εyY级D /] ^>lQjjnzr2{4F3gi5ΒSރunXܾD-g/_>lEkjz& ŲxgqJ@L?kSd{[K:IuTveM۪Y5o6P` 5PC Aj+au 툘h*U&67ЌL8W崾d]4*Yz;fZ٤Mipo[5P` 5PC BT,Am(eϊeVpdF![U)Tn+Ur<&,F*9jmp$bl3Ms12K服cԣ&w-lLPۃkK:PD-jzv k @7 DփT.˗<`lWnlwFܔ)łbƉt p*Gcm{Ή'F#{` `$b>A,6qfzMD&i㽅E1:F =]MZ/ĩKq9v5XC 5PD!XC3 ЩRaƀMlllD3Ǔ bc$426%G#ЌtN9wqEN88F#="I4Sbq,6 bNIۘy&1g4q6G/l=jƥK`gˏmjAԥr`z7RXn筃(fZ Qi;iF0*FЌwFF8'hTE hoEPslD;{F 7()f"I1Z>%k%š5i4v6FOi ;ZC 5PC ROQ-EvzN(x׌ &r4 pȸi8z:/꜌gr#iλƉ;Ii!byKwL0qC/i귂x4 86"Q57dGYڹ{7ZΝӇYC &j'[DP^?P3F3-+??,ul&Gd~ PlJAޏf ܌ 8crLfFf"l{&\#"~4tMHcG{GO9Pu"T sN *'H&$2!d&Q`I5 @p‚]p c{tcڶMPwc niޢvpޯV:XC 5B3QQB6c0nfL+4!j¹[S@ FPi FXٿlMÑw `DpUOcgS*)uEU]KAQE+0XTjҭCW רP3q#pT.Ho0 TD9IK&,x 'py{y<`Pۅ՜y.JHbDD9f$Aok:ڞ^Lg1;}]M-IBD@t:=PۘNh;F#F#!}b .`4a6ի8<<@3?/¿O]bV--[%EJiZ&] ãEԊO; @ d=h 5PC 5@ԇQߏebƭr\`%EyjA7tDmPb,g1BblmoOFݪ(VMVVy ^V|PHoJBR2:W|RRmM2r;/+\&@\n f`Z.,-Cwb<О9W5i^$3cx;{]To ZU͛x뭷0͐RBJɾo:/.ylb04O|AE:<\Er~QhQf{'.bR[A!Ckj'(`& @n[w# *D<8iQp % V!P`n"QXB9p YQ֞P N{bRKx1&@{"4.䟣 #T(s@p&d N_NU p᜻MloozTAmTYՋտ^oK.]:XՏuu[H)ASүM>}խk"ܥvA8:8_GEgm\ 3 -q]܎#2:t=@SU2jz$r)]^+ԩ8Ok!jό6^9(vo:9X&VU(`Pzƫ*TVF_BQh5 >SaH)yTЛ19'>+hni07-[~t %#Lrk/G)8$BE6~=.~;ӗR{[+)߰[T*Q Ui_:KpVہ}{֪W.^xB)33T1F\r/_@RksWg?F7m.nXsEG mL9;hö\HDjiZ `CXC 5Q8xu(}ŧʪ;$L=x)̌C\'&h&m?rQ?\sG];9B!{2,-M<}Z3Isl$W)EŪ+9 B aB8LFJ039htbgѸw5 K;Z &=JT{2>U߯o 6Ms9ۅ}%XUIp?[o᭷BmۂI??g~,!"8b <;Db G1qDۤ%MR{R =D; 5PC sS9Q/~LDઙi4XQ8,*Ԣz[l*oxT5'Pf鉚9g[j:wR΅n}BBQ8\Qg~XLB5x(ɡ蟶wS8})w4_wcE*Bh4Ԡ|n>(:[m;[mVRvX,!g鄻µiضYhfmJIm(1JpF")ޥAkVkjg*H= Du x7*b*HS5 c3&Fkm wpPҁ2j]66Nи75nןmΫʓ@ ]ԭ)X<]T`Wٽ|tt .wA!Ln;ӟ;wt.0 Zl)n1i+1FLm L]RGZP_( !aQ/3/R@UQxPQl(-lhT[fe;oBN:b*m=D3P)򥮦iqwb#hڻ޻{w̶v4Uj:u磂 V=Y}{5*\}xU`hݹsΝבRBfW~tsm歆Z6P3)]ĘHCb$%SI:[xO jODuTyی{jrn m&_yƚ `8PĚ o-GTrT=Yx=)qyfzl)"j8q\X%D$"Q,(DY5rEv{1~#)_ӴwSulZboV^_>5izq สb`y u`NŪf{Ν͛7Έ\c'ICUچ|vIqLaN %b3u.Fؐ5PC BTUhƻ͝પ*?*c3 90m@kDJ"((MzާҲry8srlA/rfۈP'pڮS)y-\8 'jr ބ)b[npRJWЬD&VP}eI!R>nZ]INZz|>oqOZoݺ~888nsdw28ZUږ)2IHLddLA4Z&GF2OwH?!q[ j ^|CpʢD]Uʣ^|Rੀբm$QRZ|"UL(R"|Vl Q8@T12ŁYe] tiaNP*UZRGdE̜~tD3qE@~;Nޕ%ݻi;7~-`]p|UV*PUZ=23\rΝ|>Ϸ+lv͕P@SڔR2RRHIDBdVbLD;]Z` 5Q^K j{{9! \6f;RcL=SX t>$tƋ5Jfj"vځtsP9KtAstc^r_yXA+{5v/ƸW jzJ{3_UZ=+#|Q5=oеNV?f.]t"4pdփX|2.^maf h듴Ljj%<2MŒmVbCI0+)BtkzDQsU!F5y[0`&ު'}f.\+Wt;not6M椵IMLqSFxHD;ZDb<Z` 5Qk <.O^#/D/5+՟ącr5;ؘN ך9=fBɫDЖUFhb:'IQ1ZlO'ӗ]NajJ{:P6xAOs6'l-`m{B]Ղ'y?py\~?<|/ln V&V(!6d! !)r&p}fh 5PD=U!eZN1OQBT4ѕ >'j88Gx987dB5DDsR"j/+\9 K4'|q޻)nlz:ȈzVB9'?hTNMi`?Փcp9ܺu{3xזyaJ)Eb 1FJܐbjdFdf#fhU5PD=/U QCW!i}8D-ʓ,).bfL$ QcJHV,SO<)1gfNq$#}{6};; L&' jH!ꓚIuUV^gu=踛7oܹssNyOM?'&xcԠI#(-S I$%fE1ghRPIZ` 5@SQTcBaFMC>*Dy_C: D9{ *9'=Wbqӝ%Cʜ1GmsB%s"(EQs_=>~{O&;_Wq̙.+ꃌ7xONo_Ӱ>Au5?GGGlcaRCJ -y4ĚuHIM/ڡ֐5PD=55 Q#nI55THpd9X DI f T6_~ "jAD0*4Iٔ.|[* fd`9Su!vJ/-loodq"kՃ꽬Q.\l۔Uɟ+2IH-#Q,JPJHq~G$&RѺ֥!a>R |N >-.՘1}@>DL%*9XT&E:͹QIsQUbqj<7d$:" 4Uh_}omY|[[[x<c>G X_}qz +M)f_CRCJA+Dj11` E!Ӑ5PD}55.ۃ>"D<$D%$u%}ZBT*g Djy>~x+`;;;cG'#\p۾΃Ͽz0Za)%8K[eRCR ڦJdhJÎ,RGLCXC='lgI JĮb,U>DR*gBI:UJUq#j%D@F±3̀HQ̜A$hr5!. X(f'{_ⳟ/ckk ;;;O]]Os{U` GۛUU .ta)%4%H Ԝ$ p74'SۦC09J#2 Z` BԁwFz+LrE@D> rW`u01XTe+USQPǠK̏ 31URԔV@jDf y?|;;W^yN©S0L?>-h؀.aa(|Xs?W^@k oۿب}-2 ZdhMDRQ&G.&δ.֐5Q` Q(BX?ud ʹ ?DDJ EqFtPU:he'D:4Y@1!+Х[xҵ2<5S00"bXVb͛_Tw/ᥗ^6$su f> `}ՃVR6pM~7~٩-5;L R@+"1ģS#R"ukg ND}E3 QMQbm0%D9=BRS*|yUZzs$ъbd:Ta,UV bE2X2R-PYbL&_>8xi^ylmmaooM t XKrV JUCzjܹ͛ur㍿L7_VSQH$8)(*hJڢCXD)4A7RW ʙ8{8D/BTU}PR}Tփ(1 *_' )d嬩8r'HX#g+Z, P9T,*J**߅ aj4@QS[_/ .}zj{=;wh}Zx2kb4'CL֒)0ghEGQئi+SbyKꐡ5Q D5% o Q$b$W=Q| QEe0 Q4zSG:%+f LĊBW*Uy$LۄE2?U& f\[F-5\Ώާޞ{W=x/Z]E0֌l)XXg}q.\wVв;kdh3:ѫ jhÈ%CKDIAB -J %a#i(+/~8u<5)W`xDiJ2pTd"yt(QzB0YD['-Tfye_ =OEY>VDkϮU/>I5}5I 3իWqyf3anl̿훷l())p܆4 6 NZ`}jԓBT>D'DO:;Æ(WV}UB9a}S>[(ڲWIPcW'T)KS~!K'Ԫ jXnϊ0VhL`t VVWB4dH+Зʴ*f-ۆb俽ys^}NVt}ra- WF`j`= `Z˗/wa1F@5~_o~ݍo)I$SHdK )H<&7)1BHiּ@eoDIm$ Q9AE_w:j">t('iU͒>>@Q~ &ܕ4I,{o21?)Z~ь?ur/|[!_5>ya?V\c4<`Z)%x7;[K9ҡIfbq(cve G/Iի= X!S_Aԩ5-uՕ_$l@ԻflT<D jEQ*w̌ٶHZ>+$7d8.րI=YBTUJ@ QjJT4U㝄(:2 R4M`=#42kɁCV|}9 eŜIH1C+JP)j1`h90!Iv˄4(,MZ'hwE%`R2Ŭ\Y y 7-+lUV/Ŷ;ݿb{{{F"(>}Yޓ1l(:/~qE\|1G?孝s82,mC MS'"asmX1RD7gAK͡e ;+hF*6[X9iF_Uިp(#NzU +JW'gvF 5Zɉb<Ĉ鉪FJT*XD\Q^lB><6C6()JTYa',^)XJ6'36]w?0u~z;Hv*W(d0m {$b w:JecQh8J0-KR(-o֭ٳW:uT=(]'QjpUZ7*'Q9ςjc{pʕ5o~x4)15ĐcJT3CIGZ*_h}">y`Tq_9w⋐qPQ٬(3}T*3=z&DRʟXO+Ճ Z=cg&i˃0tU WnG}y_VBU~k]^z2LgP WԪr|ʗGwe=\/xwgg׾5|ӟ.s?t=[е X Y:::q=\Ggd\$V TM(1YВVb,äy #@} YOJ)ӵWjT^|@*W OOZē@QF'g0%!rD2$DpDI8XQг@xzĢ 9΀<jpy,*PJ,BՖ%:e(m y`YDz_UT3+a=UW(]Tîjebf+<%.ׯM.Fcww~GzZX/^|}qsΝ;[nuwVKÂ)1(1RH DI]!5dֺK DYirXm*)/$T*?vF&͸Ќ|\19 ʌ{i*Dd%!jeu$/l$ ;Dk8!zBT1gzVBK"Š U>ΟEa[jSoTrTy^,st@,Rqm@)<,Й@]mI|_U_6-ż}ёsmկԩScO6tiA,'3uΟ?x?1kz4ͼAK۰!ID;bDNo hn၆b3U@:<\~zTU_>X@yJzDQՀW\Dx Y1g3OeRCZz['|T(v %`e  _~bTbv>Ѳ u W! A?yf=t_.{{{xKpW=X`xgMz\~ +E~?ٸh-4VJh'!DI+'p)>m3 Y'*\Uj!`R Bm񸷽*R'@LSTFzFL*  gIzдz݌*(͊V \(p9EL{!*~_E鲜XԢEvN@|y yzKP )Qx(LuPuE+ {*Z)%(gPg_L13f`ъ0ފ5|?ߖ:Tx=ɽzj2Q V'?p\x!@S/;??'&0JY("aچ()V֑wRUjdPi>/\}*< J"/@*EUhFڒT*Nr}a&fَT*4GƠe 6KmT8O,O$}IsL \4+)X\2,Ճ2;O()`xXzbJ=PW(F>(Q5c уެjVPru~zK)U'ؽ6`ZPk)T*y^Ud  L;^}U`ww?n= VJק&Z-Uo/b> ֔ml~wuR$IR"1NEDY̠!1cSYA$j Кu:z=Y'mKx rl+9T%Rm"Ӊ"fБpUŒ`c0[n^;uMm9i\ |QjPʐm&U{7hDxDUUT:gϹ^bom?m¼<%D:\Q^ Q<)ueCzVyKx1vRR7egEY+2[\rTTЁRw] 0+PjUs(1HZiV|]r楗/} D]q?=s\ti-`հя>.zH)7ěomѶ-Du{6Tۣ0C80#c qDp$iI7p@6<gX;T WǛ'iSrS3mW)@%aTu]s̺\\(T(@Rrun UpΌ+lAX (CY2P ~sM[K1XQPra7WK>'0zzZ7iYzPo୷3v4;Jha<0 1B$T5(4:bj!2<,_ΓgU\e{gʧ LOΥ Q2VI]ƪ;zXZ{M):.X\7%IjK/JT8&kT@ Ii7%ˠ`VYNpՀ' (P,*sh,_c5?Lv+[T.n]{-K3xJ" PUZ{KvR`[yZ}@(.EyZZ)YsPC^wRy*IRVӧؾQޏg UZb/wAmbo͝EyM)FJhD["%x*1Cm +,X `[G0%׃+:6 )ywQ^U]ysBѬjI5'IOVKgW0q8P럧7b f.]m73?t8b>ߗlڵk \wbs[hD۪f(C qW\9OX+XiQWȳ<P@}wktӹDՅOSrmxQ%(ɋ:N=E\chbgy3iM &DLĉuFv%ЙWֶ^߈̕܈-ӭ9dҝ^{`YҴy};urvLe FQf`Fd+dCb0p0ؖl 6habK(V M7Q6*]QdRǫH( @\F2pʷ{VX'XIP# 1PTFTYLVbhk ?z=Ν;/#oPy>?z`edwˁYzǃpE ĠC7DJ;;hcL`-?5uO `~m-h A> \TB?E. /ȇaBy"')K!r$e.'D/)O" D9bmg/w'.' nڝ`!rF ivr3xW=˿p_F`B0CU#`)"Qj@zJ<JaRI&J,ޝgq+Q(]ΣY?@%*9/4,g%,{; }9pB@ C%A6*UFm[ww=VWWQ(㕮STf׃u "ըu߽{.\@2L|ʿrPB;SJQ.DXFۀ\-~d͓5 ^ԫ  U*A/ sB!'\N PEAPyp$9BC6OlwN8-`mCe |>Z R ˥(rO `ܻwwu:z˒PF*BL*Rbaf?hzR*rҔ$r6;QQЎq!Q\:,0iUR2("c7Jjg*zʼn,)DP9 ŔQ.01 qZZ# Xډ3RH[LƭE{]^iw_?'NbUOA: r`uauu7o4awz~+k(~{s+; @T-H]TJ n\m@ iU,U|"c;ʀ5!d_BÜ( E!BP!$*`#o  ܕ0<%2P(DhT*DG H~zP0G~?T jpoEOBjXD;IQ1Fu3׎y28DZ-Ew`;8Ǔ ,DQ ,DY2"4QI1L(ŜTI%jĉaKN(Ch XT [nKz>n`uu5x]~v[>}=׽>iMD8s N:k׮ʕ+t:tM"+V~7Zp>?|) .)O=C,|K(E`ky9X à].rA?-Gwvo0?%WPXWCTZz^?d}}o6n^l)E%c"69vPPӃ9JsWf.P 1f_űxƴ`!IEp7DCJTG# fpn?03;eAmA:s!+f+++{:!/Rל//>I{N&; c%Bzsaϓ._̾H)MXiEa ?-役:}vvD~[@;*#Up^ʄ`w%`]^t~T>!pP,QVQ,Q+@>TBToh\^vo6~tˢH&ef3뢌mY'W3\*#l"+Q '3 r03犍1dJSD!"9~Ja%Ɯ&8qBWB-Fe$\eATP&iOlU+b} h6h6stxU,~p Z:P V1A'#<+Wի~DRzg(eIlmԃl<@EpVty^T /O|P*byZ* ACԤ% Cի;. ^>īhL4c`Mw4c["QD#7#zl\rǔDp&gx9%*q8s|njPN*9wb56fǟ&AM}1b JqSEFҀ%ud 7/\zcyyyO1 ^J׬3`%ۅB!f~wn(XAM,ڿǸa~_߹sN_|w0M+@;F5{렗|h`C,}c Aǚ GDF22߳s]΋2"PE-f)g>A8cZ20n,W!(^>s'Tw9Ǚk{? +Qd4*~ cfFuf"~+t=o^Nc Ͻ]X^^י^J<,a)PVYW,3ٳtn߾~B{ ~{o2 tҎ9XvG?o:'Ov>yz=y@½{P]yh)9y%V(RÁ#rFVQ9O 6>@ ՞QNT,b]~*) @ w'$}D)c(>h%ơ*U򉵑]8sTg$) p!qdc* 0B}-x3б@̸ᜐ R, v2ePF'pwDa āc. BR4Вv|i;pܹ=ۅ8+, 29䠷wuu+++}6^}U H)kw"pq~6W@cj&ONbdmܽ{}#%J분E6[* DNR@HBScGbS5 NOpH%*dGE) o/[5G!Ю 2ᲠnWv˨>g qQX:s4 w rfM,Ǚ)|<4*b£gLQ4FNNN3d^+2p7YgW0Cal(MO?.^|ʧN \y5+6|?}V =x :%%^pk&ɴNt:qqsIfQiST"4@E~&mQ<*'vL2 1aF)H`*rEc@j5}JM|Rî 23u:ɌpqRjN/z8wf#7z=K/5SOʹrCAn x: ^>/:P !˙Z-ܾ}Qr#ȌXaNEHMdGJSh@5eD<=D_%+K9q1W$+RL Qsoz*yi4Mm:/I W: Pgן\*XND-6)?zX__P.>/leqBuNGj=mB5BwQo4qk0LBMT7llZX5_gʮV]JKffdDE+ۍd(ti3 KW?K^o^2)zuϳ|`&@/(z|0 |Z)W5 gDt \13vvvo,p*'7nWQzgDf*P"#aL#aj -@M)}ӈpEL&134¯^_z?<&%Ņy><#AZpŠ*s̵u!*& P$;FJNw5mѴ~i' 5j( Q@cTP5 y&9g E,Eq4a0L)]9!fP3VQ$z?݅x]2VWW=׺Ӭнju(KT-#D]o;ERuMfڥ끈bVv'Ly4+? ҹW^@y([!3ز!xFW(%(d~+*c#pݲ3K|xI3ExuuvVA4s;Q}>0q sX?=m4`&`ʃZ-*d+ &Ḩu·%&m䦘 |8fsH!T.!8.4+ RK+S~q劝lf $0̓=/\38u$on%Ԅu;V2]uYQ!t1r'AU27ee8؜q ܠ?C7dʟ f;L]67O7v /lRډB}0x˃z YM:9 t;l:;)j1 1<`h3a`ƒ8y A`RˁrE6]171pBHݒ )+PMZea0\ej!7sB1K:E:v 38:HqWZ8y$b-5vR=tyf@~`u4 U",a͵u X08D{9yt䀹 x ڨN!A4' @4PI66R3(3@v:p%#10vR n?+Ȗ*j,A"~{Еe=RJslzsf_Gg~[% :@f81ɣG;Y>>677Mp#1D؉[0CI$hCFuP ''S.F~tfѦw`kOt w"B$21i\E7mw]ܽ W&xu?*V5 0w`u@F@2Zlr#ߧvC:4촃b-b!.8R69NZ UO3ق̾Ahc;`L@*~s iTǠ ڬ+n]዁y_x=<jZl~.]}8F;݉X+X(hpLQaBJ|>onUNΐg@)WC&voE{Y9VthWX Aؤ 1njOd2n{O=kHVݯW.caiiihs.3ߔ0L{S˛`_㎊c*%uRZ@=TBgvN0AfFzۜJQqL0DIPCP5>4+ )h^(Af5ٚف1H2I4?7:Μ9 <\B .]>d$rw^&p},E9Lo Y9$W^~;;;wN4"p*MPYѪS8wĆ<ӸIq )@5GkisWf겊p6d1C=?^x,// 0+)% ]})>}Al,Y=~ZsdI*N8) F]sA|Ase *QXf`܏+!‰gwP= j4TeQ8hUj/utD hA*WEjalխݺ_p>PR;s0 <`xеJ[{_PG]ZmFM&l35/{nW`I3UJ lK.N0^Huy}b H4: -HQuKp"濚UN;2SN0=ycȁ+cT;t!;YWvh[ź?8ch6X^^P(`086=ty:ך\wڶL:Φ9=Xk%H`ex S۫=0}+bkk P/ #,GBX5˅.l1+X*$HT'J7gRho)J;5&OgHh`dg 8}]ŝG)D0&ןXк%0Igs_mb VBW_8w̉\KkUܯ [,]tb>u/j~[3쿚;]nA2 >[ VVG X7 ;0CB)ʦQ4]0F*O,8)ba_2Fub3 '00L{R1Tc"kj?g}5Y4!ߕ;L^JW{ff5 3ٞ+0@!1Uf䄥 H6TL$ P7 5Q6y(rFFhQ`U\0 [FjyWIrMh,԰6 HÏ-IksBGO7; X/ Fu~* ;c Gro, G"mn''\4co*e"~އʼnպ)Wƈ`&'l# .APJ]  ܣ"=ty-Xe'V:THG\x&fs ދG@ua ו"L rVP3 !DB~.2 ;HY$ȏ^i%Qb++n |XκҼZ~LqpDK:aL$yL f|=[Oh ]A {}_dk/ 䳚qb ʜ|6s˾}KtǝhKxzx\t.E[g^i%/-ԃ AhaD<äN݅(_թieWyWPQdPXwh {>(z,qZ87UWעV5Υ,;b"2. -$ rhg$N?e ݝI%&Mijqs;M`Dt06f~a3u\E2ְ6-c;/_@P*]Ţ) ahF'։C']Æy|Y[8p+;MKx'+}aef}mO\1;;`e˂qc(eg3vړREi;qWʐn$l ˎ0G#`|{x籴 ߻L\<`}mU0ݖ 2'jϙ5 *%"ĦWV`FؐQ yDHw j&aǎً~~Y`jwj pW Vl NR;`Q&;V 8{,:jZv &#fyؾ4ˁ =`,8\Hw XϬbf%lSgmbgw Єkj7JVJF#R2ì>5jK4hzJتWDF[$ȏE aǟ}\ԩSCpah~E'Ovk?ȎBV2v| }$;?;QgH< erlV'IFU7'yϜA^G^7J)-pnנV}Yt%Е}4o`U+sCa ˏهLZ!3# Ct]}>kVٗgo{=`E-G )XBʰcO|kzdIrf(qu. e)@)TF]%/v JÕzf5NlC{2h4bJ[0q{蚍?"<@V VsX"f"*XnȤH 8 e*1GSz. 0vkRg MsPE{ MnBl֠'=uT6;%H@2~-M~s#Z2  9A'3]]>9jtK@qC`O//t2q63RÔJzLB⾩De I)Yb JϣD8>+ Ts$n,3D`.os[Jcq>%<=q+++ [̌v/07X^AVCV3|>ouxrƕ 1ћ5B # Cn敱W+(tPWtJ#q"S^,O}M:uj^*2˃nq=O?` Xuia%Q2~4 !} ~P5MӨWkɵNO]J!Ww;Ͻ| ?0j,ZJv;u֥zlzWP T $1M0'b!n9Pw &L;٨Z@,T&E4LZ*njVrG. ٪[Bi462 _pvm KKK)3~sP7PQ{Z.Q(a,̷z]f\;~|MY_ ֈ% C`*)eECK7~Fz;0]MVnyVkh'T uŏKVph &ى5+Hc,*xm߿|ϼ]h4kED&Kښ q{VJ$;,ZT'r$ '9wn{ҬJ#&ac{~Ӂդݴ9Y NUc vvP 4F9$;e? h./RVֽ]ϖ"),|_p Q04 V516*X,vF 90%`_݅f qC?DPR逕]Iu~.?,Y_ ,"^_t=tVT/Cժ/@' rK6v WvX0QR.e`ˀdQj [TJQV$3>XY]ER->m c+V^J9}XߜrҞlЊʔ cg(ӰgI8$5U2* I[Fg ke,p"nIs!q~ϟG^7. (Jv{{{!C{W<`oNᔼ1RƀMXMQ2g$HJE6uE1P3mZzA4ޫ\.R]n,E ]?mT+Vf N>Hs, \?'go`&x ż>)[b(c;\c{,~+6uŭ ;0bbΞ)Z&<Q\H)+fTҺ9 z_v&{~&5mv',#;3;xeg},TJ\W)T+~x蚍<{j^w y{s`m2)脕H u$L%!LAӀմYX 3(^ J1B & o{ANƑlnW. y([FW0UVDZ\uVArxq2 Q3X@1 ظB Sl+=jΠ%+ ,&__wz3$[֑?fz{YeyW5"z/h<{_5˫Vu{:ĥ#%)_aJ{,%X*w+2N)xu#2k7݅ⵛx41#e VlT@gHogfԫ~Қ~6>dۆq-\=X9X@˛: rP*P*/>}1&mn}9+VX%O 0;=>&)zH%~hBxa8ꕦVtw+9CS@\9(*YU`dn׮auu5l6cW6_=t-{qśdp?LH>]ļmMcy!y\ y4+R1xaVx9ZF0t~݉1Qw@(tPn+&ʀH"XByh)_\Km4M* T*Hes(;'{(]Zy˱9Xu//5a|[Ӏ<.tr0F)7'~:3Pu%_1JMmx.1cYVL(jT+yl+6vi˃.hIƯzKKK( (JWz,",^'{"_u˶T t%StoSJ "B>G>ǥN2{PWCbEaV:O $4Eo>+V X؞`=8z&V.CXbg=TPYnIP/*TJZbRZe4>dPߣhEFwWLFVcRX2>@jjJFc8]!Y" >BuHڌ,g$׮hP(\.6K).tyk(>+XykߢÚ憍 !P*f!3{O5hE I7 ֛E)jј!1Iv^]'0/NTe[Y۽-,//ZP.c'VeޗER.td4MG 14Eah~e6w/c3@(~, W rFp,w4-za*544LHAcsQwDOĐ2?xZF+ nn_t5+]^Z"-l.xp$'6!Đ^Jir"^pt*uFvבG;P{4|pyd=CVrw89Wp^)J{Œ_%ErX4^:z]e 4yW 5GFwKgw׋//qӄ &`tAŃWf~I$t=Y|J/?h)前 Hx:IydU!U*F)OcJZ\6}s-j=;v,H)JG4*~`KKK`^.98 ֘51)G;Pq,=P3~;Rl\AX "Ogcu̘$̟FjT4$+c:q ̺'a,eU ,M 7\T2~QՐ`g XYo:_"B@TBPHz+]zL||(V cs]"|@tS=֛#Y #,xÝN'kT6W4J8x+Xs9y([1Uk,A8v(q*dB4rBd 8ozjDb8>JZRv T*Y,(JJ}Ly{:ĥ>,~؂  XR AX,Sw7v27(;%T |crF=j;=?Q?\%S mP^gi,hI߸;>YUV3@qj5mElnnʕ+RV0᪛Cq9&sju|$!A`X,Rw7]g"P*DDNAM!aD*jܺu vvwb j.lir?ߋkviãSVmA, li\֓GZبaB ՛;]ѥ 3x(׌DFю&M\7$]Y쎽ݐVTRL~Q[K\`| z"SW*xkw>T3fjn?qX^^FMU߿[nb|[ᓷo+׮RhP.S?+Zy+P,'4`0@P@P0q 7*6v0^,%2Z`0tɆ{ASJऎ48+Jm'7v83,>2jC}r be t) 0sl3a0qgȪU(S% @C *ZIu8PN2 G)5\B&λ^QeSV*Rtp;U49RJan G7AL AZaKlM+YZx* _ݺOlb5/P٬;kaG7v76[PTF=ȍg5;ۖ$Ͷ+:JkX,VOnn^5T4XU+ ڄp@MO 1SHʮ(jFs1ԃ *9e> 2IkZf6٤{}=j5E!jړvNg= IO9+Е H^P(hׯ;sj߽\7 ^{ZW՛7Qhs|ZzЕui݃Yc"A |T*jY`gi?K>tU$cAK %lܬٝr0{jA.:vP8k; $o9J>u*Kܞ,E13:T'A,RJz=z ɝگ r8}4P,q}| >v$Δ~ ~ ^owWq X^^6a`x:m:cyZ { %HIL~]a $>}w=Gw)"p?3'y96Aݕ [e, :7+xs'g,`k ӹXθ eSU2|{PՀU> d~=+VnIPmk ېR*;0/lZԐ jz&덫GW "Ax^ ~S|›ȗ+X^^ҒQqL=tyv~cCSIfT$bXV,ddO^]Sab0L<{666~o)M*%a=3Ça0 -M=M'zyIloo#c?v iWC&x2%+k(קJGʕTeNvqƲQP'R4JܜxׁJ.n׌zt:t:4h!i+2NP?Otٳm[[[3r/mlgz5AdHAQ-߸7.aLJoo]޸U,//uV,D] ]i~~VVpnO06 ,Gnw r.;=2MSwbI9k Cҫ5rQ] )!j!d2e[[;xXb1 5}kkkI9Ǣ\hZt:hZ*XZZ W[Z>nlqƵ.<…[7 e,%VH =j- CP@FP@&]ﯗ^|"~g| UϝGo=}6^-,//cuuj5ˠm]m: [7>+XsyrCm:tT*koa;@#'@ )6TTB @0'6K ;D "eV&6Õ+E?&НnA(r`R0X٘Wn"0s tb(G!"TV4L=x-_;o9}r|dq+pG5)[x:^uq_v E)ԌKN?q\F6[8y)޺u <uF |kWm[?{&YR^ {UVVj72q V@v12> "'BI+ ! 9$V+@,N0vffj[Wfex#޸Y]>O>i*+3o\#ۋ [mHqOh >tlw.h `PΘ`aDrBKf(Ic2Vpv \0<ǹCy쭽\ՐtXxtfɱ74|ZhlXEj6ZcqqX^^4*B }py/T ذrBJHAeR(IZ<wYp=L'E]}}}GTB\FoooR^J]1{zUQ+?v ᝃ&{$&srE3ɹDr_ǮE_zC%DC_F:,===Lxxw/) ҔFajʳX2 4uv9QY1uP.оn>b&Vr %v!-HeqjڢY__,VVVpI?5xSD" X\IH)\ !k 5p0X;@+x_ov>#Pq9S'g׉P(hV+wz=rзG]E[0k.=25E[߰u$s8Т:/0.WgevA}OqؒJJLU8hX,eJ\ f<B#`D s^<`*{[@})wv@Sǣ",}cv BPթd$ʷY'p`~n?xn@oI 0T+2?) dƏ!ԖV T\/ |MOo~_ٿDTr|<&\6/r9?~y1ܑ֫~\15[Pڨ<~CM?',Ъjw]е3AfۼP:FQԶM8IIJ Ki@,EtGAx⺘́+h8{cF"tr͓2mv,·V{ߠ+eUbk Zkbii ǎğ^ܹk" `%"2{,DyJ{Ml nHsg-+2 JJA \oFcӇǿ8rÎ-w.'6$E@Z"#cLOO?=z^Tqhj ~(Fon/=@kuu;#/.vߵe 68X.t'a;d Bz{{100LrTPNHi '^9׻3pŅ愴4/[!Sۄ+^xeh" V ~Whxb~TH9{(poYXT͕SSSX\\ѣGmo=E , "+[Vp쓌4 M4vdlRu.ܵo O.x ʕ FFFP.^|Ll F ƴT*allƷ`_*Ą$s'Jɼd>k9h]xI;500rjzV.]е@WWV]uօQG^G\y)mjrw ?1c} qB1UkS}^{.1Iޣiammsii][NVgcVg{X<β}<8n;sQVxkw#V6P)%eʆ†KrT4mwX *4!Y/ \ g,N\LGX͈ uZ|>hN%pۑMް)bzzKKK8r~'2{`Lj<%bss `AFxpCKRTPUT*NSr *MTA&ڿ? ^R՝1!D\j0J)1::ꢅp0^/u J%E 7x3$xВy54^q'~PT.h .΅ڮs^=XK(\$VT;[RE Z+ 4>q|/|BI|,`bbwc;[7p ۩2,{3gBZ+l#cd*x|ptdWX-Iۍ iYZZ29J]OrFwE+8{eYP % O'&\oW]lgidX|*4N`IjW=c~1> Oݏ0>>5'?uŮA)XB!\#G_?V\WII&p@K G{>ǎ=j;3 :3]sF.:zy$.T渋;˄өǏ%FډT%eX!/x'K{˔hSi'm,n8OF N40]3/ѽsߘ6+)z_xfE?~/7_zƭ@.6U@Z4dH, !spM‚,aEXiSeh5@ ePd4ŷp%}w?(+}h6T*8q4RJW.Z QQѣx}}}*n%CIc~K;|G>[^'BRVVV_ .u&t Jck\\̓i-&xΦayy=9/N.=vBX-)7%тY+.c+5q1YƗY= B&fgg133i)R)ހ." g }7Z89{Q2$ ligB,uF+TAGtIj([w7^uU|ڵ Z ###-YT.ZX,mO<<whxrIf5=.z oϸ?p>xCCDc:]u^]ݜύ1,~5Ӄ֣G#hWHɨ R h%"گ5"Vb$.mc0[2x\51f:X?ho]YC~UVN19`J33܋jOB^Eq+rA*j&q#5)оZ Y7 eÕ$h$57ŇjXYYA$VVwv1YRQ!pR_>v<}|ɒt+\7IZi>6~xp~^Yul ]燝 Υi_NM2 wVU|dn)/Y*!yf9Е3\C}_ۿ-7s=25w[`?+ok >z|~q!x_A8tfff055\]h4Z2 FGGk.ƃӋ>ߒ>n2GIۤ s1n5xx3o@sn$N8Lh/9b}Z3}gtl'pu&bNdSuE5 >W:udP(8-o=:g0BTRADŠeY@Mc mI0H0A;c\BSdMEgL6WJ@ orG 7=,m"E zo6H@ʁ'{3eB/z睄MPRвWJ?Z8IlIWk,)K Udޓ*@FҖS 汐GR2{׏}'{n$I%3a dcؓTN?Rgש~t [|5`^)n['$ RUV§ C+iΰdT:hߕlԫIZʃz бOYwc`Jh.I w:QH^---affըw82QCr@,-WQ(tGNY2 =샻1F :e Dd*IM)@K:f&JhGJޫ ϸlϢVA);3=&8FTrLQ;I۟ xVhLyfPvxM kk}懲_N]pX|)ov 'ng'h4IP(8mRLTm"]KShck\N%`hϴx&HgwTœ?)*4f٨+` !ūN WWW h-Oi3ǐ1|i$x$Vtz3X+gJ 2rV{ cE݅"helu (IS :$2mH$q ~Fh68'D( X__"`8uBk_^~s.(+2r$cm5ZB RFW> 8~oɅ޽XKt]lʚ8UXɲc4X Vka, _Hŗ~5|lbL)ݴ|UWp`G)ؿяzu f OYOAܲ[rpVI sKXEUL"W;Tfg;mP΀("(E=3'jt-fU2Oz."=y9ܲoM8t0==}&|>\.zs FFF0>>U*{?z?N~AVS24 wsFi?o2A15~p LNNb~~N;Y_u]{PΪ ΖoɁuN0\M@^nX %BT!SRh߅ ,1ERWkl D+q`"w!/2y+&)?tˍTNu&J)z%}ҰPiEM֖ %_ٲb/ל;9徟n1oLL@l-.I9/}r9 WxU{q!cjjMbq^4xy cX9cy(wVi D4$\jx{lX!kE VƩ%C,Sd.=`d9%#@c^2g˖9׽H{вLU:2Sg<Õr1";?zM8|0p Ng)JRV̋"{n7?{= dIHk: sJ|l: sDތ=y/19tǎ$X]{7lvB#|RSZh8Ձv1dِ`ӃA#GPZRIjd]fvjH%1Y 4 [E*"pXi^.JgˈpJ1SDz͜PuwX[[s8J8_X}h0tҾ_J܈= XXY;. 5%l;k R&> T24R8m tS1F% `O,k P>or{`friBk/#c6FhDB7GM) R;NRAIY֍x5`Ϟ=j;,/籭:N[a)%t8/ԉ‰F 588ZGϸ֚J-LIK)h%LGJ @2@.fjh-=Ōu"0@lcr$瀃2 u[jv[uδh^__v-'EdWqLli{Dű5d))YK 9 - {ɵFH!l4R He#sqԮW$t"l[ rb?;[>97- {H)Q*-g!MSݻn>Z6V3\hô X7J#zFG_Wa`hfAV)T@;bϪ kK->_'|>`)EKEVo\;GБHnRқvђ =&o*a'$Z%`L+r;x`Iұ)#{2#]__M#ƪ\M$MPPfҔ'2>OB/m/-C˺dYRh.T Aysj!!%U"K09iӛ=~c`llḻ; d lbϞ=?}c^$\rwc`K0L.ua2 ~ ?5:={^~vk;X9h+8?Rlw]͗eT*oRFQ.F|~tjY֔?NZ MYhun@ n=}/Vl#J=:`m4PJ!I8:,,%̽d 1WQd5>K0,[p&Z yq42 CꄳǠQ2g>#=9/~+GVurdyUE.v#g㘟?vMP@PJuTFZ0q|8}$,_HDD^O7D:GyYHZ-AbܾgxxInz]g : ֦! ފ/X,bqK!/NLkƠBDh[*JAT1ˆڵFBhG?iݒL\&&ث60K-:&KvVƽSwD@Jahbw7BX!w--gd`.*\W`/ V&l,맙ߘY{cI RԄ)Cm˖eՒLy+!k0,B7u  ǧ:bGGG)XYYADVCT .FFFF‘Z ?/_Y/΢[ʆ~ va"!djw|kxsj& 5Gu<^X1RFhk)`E*vHW\wWz8{h`xx.[:At]19.,dVhA4ߏ-ίN(jh} Ȃc>PeGRٺ/LewVR% ӡۻR b޻ Fҵy%+3[]޵ '2s%LMZXЀ_˼'|o) XP2X5/%~w߂#G`ii g}\DQzKYj{?tn?p]"0!m&WbBJeAS"dϹ^+[z9N$&''䱙2Hw t>&Յ.e6dWNbCcGpsŝBKD\uKi˂ HPPJ@&|8+H6>JM ޥ BH(FK8ab ܳ@+d_?|OZ#P%sepd^c!EyT6$3Y,% l8@*mB9&:l7H['p>?g%ᣎq*.P(lB)Q^14<^ޢz3]g[WMJҪ- ÖP-RS?qոk?ɯbbm iRo.[Ճ/ Y拥LVrI2X[j-Ϸ֨j-[VӃ~gGm=a:Lr]P3 {qƬ/UVf.&Վʞ:w/Hm[Wd`٥w6؁ζP(Zbdd1|جmP &+I Le,W^[aB*V=z,CA@ 7,@14M]T˩6;¤XkhAxœ9ؽe^Wб{l/#~hҥ4-TyNˀ. D)Pڅ\ yÓ:\+c`}KEΞ19l;=VRAR(~Xםcb)&*@.vHf+A|.5ZqdXgr1> 'qqLNNbiim w9SWN6muۅ^.V}BthWzGoo/~++'aHn*S(j3\T6$+!B&HC$EtQ]w)%\å"$qm%ͦgϲlB &  =\Nd́YY6-:,D>BX>:g@echQɐX,P,ιH!Snv^LcX,DeA `Y }xlG'-d21@Nz{> [ _sn|wc ȑ#\uβ+=hy'UX]Fߦ+˵dh4Zv &o`c(TA)U*M S2- 88qhid)eH0!YpofgnƔF@-ڔ7OaQ- *PAl@K27"5yw:'zcu[ \ +ɒ,w݂\s[#vsLDQ.:R-qZb||Ax[$D>}< wp!9sNBOZd;-_ߖaͮ[WgY.2]|>;zG=1OaԲYܧ\åE1[$׊ dt\ 2ХYP`FZ]zI6/n`q߱8a<(j)D%H;%)^X抴`3.ھNv QDʁ.rEdy|.˞\̜ձCzI ߏfb}e#2NZ>:(=Veþco!Tf5W-/uY'O tj8nj]fө.Hꬺk.˩j٪xWB~3b̓$5@, "ee@*xr\Ƶ`N ٱaSܡta^hD )c-rJr9er؍-1~yO/q &''2/nEʋtܺ i'.tՎX@ug1] F2 xxx}}}Gy觿F,w#DVMHUEPdG)_Xu%7lvy f33$mgHjoW ,Ab1jNI$cr968CQQe=ҁcetk6@l/t8d\ʆgLku0|{e߆'N`qqJ^:WJs* FFF۟*jce#J9`ԕ#Dd\d5Z2[Z:W{M<'Objj kkkH*MwAשlY ;۱%‹&z'!D .RqcppxxnO VJS-Y 5ZE*u듥mf!-L֝ Ȱ4Y42W 9;$y4;='(" P۟sdP~@$Y;FkÎ6zL 8g$Z.)\'>b+EVoˉ- 6̖&sz{0;;>8DTUTU7S_,&W $[ dINʀ+S>,:$+^~;?iaȍt۱J]uzf9wuV;X[K>c\F__FGGg8=q24M=QЉP-,eR[.CnYpb{BqU*ω$~g+2 RF9;/ hp'LY>ǁPNCd@z`@r&Ř*6i02;el|s'CY²W}|8Ȳ@ 1!+Q(/y籲aWf*RZbuX}Z}8{'szf"KU$H*a))ano5NGbnnʚf\N8;tm$|oǦv[ovZqHJQnItN0 )8 R`ph?q`ni`Et:pe@Wjqտտ4|P{@U;XhehtđՁetFí7`s%ˡP(౩YdZ! (o޷btf٫|fB>U%̬ <(cPEҁ, k&˂g^LNNbaaS-FXT." _ ]AM| D+l`nL0=%d.?ו$99;7p܉~Y{IyՅd|w_rN[vvٓF ###V@|kX=Jɟ6R^y/-MXl"Rp%E? i B&j=utF#fVXDX&L9)gSˢ-͟0ϙh>+~o)w+)Z@wmv2[L|ښi耖5,BhQנК1Z"-GtV ʵ rQםLVP@P7g氰Vw:8¢."Rt,j6 4ntZ1AHV.,&+jVJ$T(bcg[@LM(}7rւw^6og[T 7Wi4_RǪJWGFwsӱ6:&K"TzxߋoýeLLL`nn9gAVv[D|~o ve;O.rg᝵q|?'T[R>xxbq8Q`ctu9ɋ  4$Q`yq1"t)9֮]p3B81,Vy|iLLL`aa5tb }b ׭n7uuV]`XR,;4u~wym'Ǐ4d,2 fjmk^$ЁVq!ad)D\i֖AR[4H8=Lr=YqiGo8&5pMrNڠ3j@T8 @g$c.s8{ aLLL`yymAVv2<:}Fܐ ܮLLWgX}m΢1Z}+88USA5SѢnC`Y]VX9@ku9(Q== X\c\̋`V{wj,.t/(8;clEO~V޲{Țd1o@O]ipXmLZ;8w|Ougj릟Y7f:uGΠ2TҳU2!-{i, 1~9wc6K}_>1ϸ Y]mӄt-ZJؚY4F%sdރ.XSRn\"Y7M׌bbbKKK5YٳکLW;N]UX],-}8WK>@DvjZ^EE?Q/cvXPa!RX?-]\)uf)ͺ lLd,s/ߍu$I&UcꩶU\Ƈ% r+sA$a#`TkyW0Kl A[A &V VnYuU,--ayy, T*W1Th߀0 -<9r:4Z,+FD }סE{w\6Çcqq1.ړI:-dAFbwM(dRVIgg,J mNgŎZ#YBGFF0<< |3)Y@eX,&zORz0E gyR?U :,ڋ-l&V\.~d2 ExfZiW [UhؾTV0;6VeL dirVTC-G6³4eܱp7caa+++'B ,Eƻ|06fW26XI`h ƔYҖ eטCV뷟}^?pƖhl.ff2F]Uv֙<ı٥T*uJ T*appxpf񣏠HMTi-L=W,]0x+bD ܅sZ^ kkkU)ke'R˫x ı!°֍:\ԎAfEc @mg:;e&ۀ,vQ<05Җgj{Cmiu7_)ճ:9bJ%e,' 8fm8Jg:`vt/-% _0Urj{AsmVvՊ%|?|SppG1$m@/UhY]]V~%l%%@TRgavs >W4(bi%6^nGcR^`l\% Bv 4آI އ5u^o0%R^ٌP.mUq,a[9,W WLm\ub%PFx+%xf6H fRJ";q|sX{o,( ց+"E_?dj:-k\!H^Y Dž=Etcz,i)ьWß=fWc0777T;7-1Q].BԦNVۭZ`(+vrC$IKf cccS_3*I=J:RmH:$wZTeDN^ N"Ug`z]*Qɓ_qPTׇ~,y}U @2UЊ@%[W 2}eҨnI6ZpAN%D{*U:ږ'saD(|$+F^/"\2Abo&ݠgd8Z\.\.bu13y`cmfF"o9GބUd<ȴ5 bqMQĉu}d;?m5&B7WVV<9s+A#PS\!V^5,jG_Dž<(BPhVȪ-;CCCOD9WsU0E uDj؏ a2e x6a]@`̕ Pxu**Ģ+87T,+_ ~4l) "dY*U@L6@̰l )Md^i+H%Yqg(MXtGMFOl\I*2M3Nf$tj+%"\wutǗBp'LSIH |[GۮPұT2t%mIv J Bm%2Fi;J4 /M!ud6vhZ~xSCܰ8![s~'}[y! :_y֛MLD^ yPNbQ-\+xN@M\:ܽ| +yVE+ N~M,|9RJEenQIHhf'F0&,?Ӯ3/qG9 +xg,đe$tEýE oAQ,P荬/Nʚ3m/.&)֜c"VVVl6$X| "I4 uaeeuNOOcvv6ܳE9,ۥlK5Pbӽ"ډ+mdCiFRȓn&NLN/ydi5l#~+vJg\W!gAܹgzj\OuT*(XLRfR_rViMiu[޾)3BSPv*櫓  FG%]y4Wp.#tNB-wL3FP)Ԝj?)0W_A@fA e,2➾7aen MLN]Jӊe}^籶45,--9E>tmKX]JX]]|~2A;EF_:Vu[L퍁?X[orxkg["6`ڽ.JX-zMәC '|'ƳZΖ/ⶱaTD`eٜRd:Fpx~9{',vfP30*\#Zz[@8[ `_Dz-8vK*~XZZrn,$ JIYt@v]t) 9|͌O133,--^p],`؎X꠫P(lxdall | ~_j&^n; a3GVG%x0̬`C;(;ϕnZybe 7;TUe(?C̽>Vif+E@K0 i,xΡ:-X gAg{w)+vgzL+Y>wZ;x<+B#j֘Z^ZճY86 f(rQ;,׌nڇcǎayy{D ޮNKry!i:Ϸ3a.ĢB^fff0;;ẘq<;qKK\-@WXnƼ{wVhuN\jX J>;1}tWU.^n93;2!Lg+qGW00IY24dFeʆ?wǕx;vMq|NAV:'l}bn6XXXՙZyku)ҢGWwĴ]@fl!,7'?e$&FblҠ"-E++{ep 3cqq'f7=F,n4nbDmQVQ*Дs4bReK 2Pe/ם^++ 4=VXU#\T893v,V4n;DeF*A-k8$Vu& :& "012c6:N[Y0[dE:%b{fő}ԉ$~7)yLNNbnn.8q[‰7SFNknn.hrzm}K@qeesss⢫SYҦaWy ,199ZO80<KO BG1=R)=w}K/!7͡oJ3 = H"i~h"xU{1^*`mm ˨Vh6(niw dOy-y(@HSi 92RHhEU2#xR֋6jmd_/}&KPB0i60𠘵va$(c::öKB$N'O0V`ث@_ٖasS8˿EKS@K 1ڈߵN!" # ( i-~Qjmߣ8BOAOs#^G077)%vƣhP(t|> |suNjX^^nFBz! )*0TJDd: 9ORcy*Fg#v@F LUvY^^ޱcqq́g /nm`234EdI0$nr9w;*\3]:huv&vk>YUx!r ?H-@A;Ihkg',Ҕ&SR2 x_EV\.&>v {JH) j&f"L$H2lHMY7F uS!`cR4Bn +,S@67Du|@{zxP̱FEqZkEZ(͙<^g2ZV0`&50:fA=Vjh-%LYJnoo{<100h( 6l˴JAQ2Yθ4S?h޻lbtsi|H8:lAN'QZB'gg;gA77 c#VZC:$4@y Иǖ*[PvS줭Z*M^xIJ%+wb6{#Sʡ!'/W HS&M !Rh!e $DE nA ȒBB(J4%mBceAUϙP! <1YeG| :#w`2Qi.c2c(g Bd@ zq֣Nn2vNwZBG4AJFu7^L-?rJ d Rϵ!4䤋tt β|/F# Pb#b u@1,xƦsKξ筭9122^?&|orYB9wwմwܩDN=Ik4&' ŐofF@Tr 2(GݯN-I&t4ϛM>4$@TԨR"-֩7)%} 9dD#g*(>1]#&|FI)ϝjyMR8qĦJ/?j5̴WtabXf@%8Nj0_[hKZo]jaN'c ܅Sw2j-j["PIm]J㷟~-^ч|>q&(j-ڱ 4M/:Ϊt.J5]v%Ev_v= {Ytm-%6FprRb||CCC'W~0t#c8-VOb~Y^Dbn%Bd+[J]`uu[Ogvcx__$5$NP&TܨfׄcST|7UU:{+3"2/ocHn!u05xcI tm3P&${mN---QN[IށW.*feDG֏*%CP]Fwʡ2# vJ$!<+++./ۦ)+n]tex5%_Sf3XG:zSyi{\y9sI`wo3-PBGe S΋:S/x(ymC6|׃(}Ωt` 2)t066$wཟV )Z;-m& VOf \nw t.Gea QǯIOb?Qǭ!Rvȯip%'j#ʇй"DwX>Ҍ#$ @Ez:rA݇[!-c^+ç0ԭrSfǡJ0(T %f裏ŋAۏ[oV ސ\K""V7Hvx)o_2pTTjZQ;wά$4^`e{Ϩ=.wڽ~*t K{4\')e<#A *wN>JVz+Nr*d%~f{yi)[.[RocJI" Zv l9_L(&%چ~W$I('N,>hw@F[44~UF$a䵶(w?yS3bJzBY|f]~\\*A\e?;1(,//C666BIAV]-t5 GU{{z)[y)(o݂"`źejxV8w _}X͐ձ]v2*:+"wݎg_0*/^o./:ӧ>߂]Sd[n1\6{^gg!切[֡"ZH;zLœiȪ^ )X#a)MͣU)0ԃi4=MB-p'c@cp^9_gL+Z' ~X7qjmAK%t@15R>t{pE\|ٵ8 # ZA3T]|[[[I skn D8yגm/ĉPJauo?Yo,:sj?LV{+۲rҌJm,..buut:T*NI54'O>|[-\+VM.eŋۊփŪ"U3a@:dpjLU\[OCʕzxrqVIto?onb{ݶJ~=J+l6T*PO^d_pPP)=&2GKA;KIK$Z-lmm%a{{e1x ]vzes]|/^23(Ly`+OVR i0e855a,//l?0 ^§T%_4&8xUn>mȵ:)ߦRcz/1lmma||mCRîB^fqamm E|ފ׾en8V-53Eڷ|̄9Yv H` #N[`ܼb0CVJA =`YXjKk}n-%kPR:{=G- fQa:d,e45pUf-&(Mmh?ăwϗ6ʕ+`sIطh0{ADA O(\s$^2V`HXz p9LNNvq /|O j~%|;؃qiҋS{ ~:ON0~,[wcss&Vdkff>ß9Sh6Aeioo!m6Gi[VtLKɩ}VJ!Ӈl$T.=+XD#NO][ҩemL:`qw߼˳1U|VXtI !yՌ|>hTln`.X׬͑v}XpU856qeSl `Egoo;;;]{yn^~車n'UP浪5k =aY&BN< 56Mo~-(v۷Ϭ!>muMiN}*Zn!fӽ@;!<>?1Sz`i'*|J[m7 ֛i;hɶjcҎ n% j۽x TQۛU ʵ'3l.bQ&Z9H!jRR(_RPeS0`dש,T%)C(x 3v+w^q)Wer3ԡT;^ ]&?\Rnr#cXWG(Sl'K;&THy4'l-k~p|T}"lrρ0aʓ^B|)8I%,`Ęd;]\>G!2bGrӅ6+uܢh}6VNJDP0Vx]&7S|γE&+VV?N'PRs044;w,-"KE 45˟e^ǬjW?+0^"MSHPJԩS.m{^`5TgjjV@tZAo!* 3E*A>2_ _JE6y]m)=d*`dd=J嚨$W77:lŁrD6 C $T,ʄRBŤe[lV f? lVbXi;]h c g}}K*U^~a5M 5,Ĭd*Y*: YlR _?ÿƏŇ{` Kv|R @Dt~:֌i߱UȐ555x羄MX2+YlVj6a,jE -0hWW|ڶ&mWJWm-xDnIT1t:k{(()wQ` ;cr/ %`u.J(Uո(O֢l7Q|_ t|f-˧U:[Ncڶ!}i.}wlmm+eu++ֱSjЏ577gϢV!%>E|Ѯi 32\ƒ -}R7qqSW8q_ZK^F|ayըWdaia[ [vӇn"Ѷm+nS>.ƯENk{(e˪\ ^촁T$w FV1\+9kHɴ"B+XjA/CF}Z3+gzwEb,rs,Z*K:E2<9d8wVyTb)ʻH D;f*2W*cbz=;-+V"SFExY͒9qyZٯx څv څ.\z%?<<0kԦjJ!<ӫxze& YnFrWi.if4Amׂu˝$ `[2 SE˰>OO>H^ދu]/UJ!EVRb3rAJɔRVaVJYcDԭjedfsM$)V͢T!(hspY]HP-wUYl őbEcZJm-nٰ7… Nxe<gn,kN9depo<)2ta[\8uꔉ8[^V/oU҆i k A)nǡ>j=vb۴ }OF>ӶhX1cPЖ  h}diX2wQ@M |:UgZQ V@Bn r0fTZ~uVrL6egy^v 5a~e.UǴR\Q+UUXj2!iqO۰nypaaI`Ocx[ﹸMݝU[%Ĥ1P)ό WdTm>3U?q9TUtSk71Wd)O2vBk^Ð] QO:5 Q.w<)#d0XU& ޏP&_(V8(Neۄ*QIUժL:*VХn]$zqxa6l6.tZ^=k}m<&-j6nqVf#-dx:.Af cf&r"*0b!, &HޮLA7B.M8j\SZlB~"dGT$I5?Gc{X}H|mq۰:;&I O}U^Qp0!)mʕ/w}{@0Ϝ9u5o«hׅϪ2Q ͆h4J%`5ECۇ ;ihA)= '^^UxZ)B 8K)6hC Y"T+qk"Z4+=g@֋u+OEc{X(wY6LsaaaJNG?g\DX-ܻGQ1xSNI\5dΜ9Jfz{oxde)P GiÂUmCr5l[c+mf'.Z"OG!ixՇ?1>>pJ)mw{NL{zAUCʷeKPmSvLbbR*A/PRU+t\+11S;= f' { o<罤bEq7KFQ/<ʛ6I߯_u=xϥDt)(T~4~w!;Y-YGz9::ϻP?r7:j[G ͦ02i(3ͳŊT"ڙ\. ]iiV󸈉^;\~T㴣_3cEu.5!p֘Dž o[? >qe3P~}oa }oIޡ'ISN;&~׿񑋗Щ7eCIE |CS3jʩE>Ǵ)%BZ_7[sہڸzJST*e555 lUK?,`IqLԪel`pwXQ`rC^V@*ѷ Jc ΋ЋDPU˫YvRxY7Q<Q(GN[bŊ5`yӁVV+?Zɓ8uxŭ] fcqېRkzs5,,pS>wa}s۴ukbo[ gWFӫ]Xjy#}KʋF 塮Og +-Ž;ޏ/n% *822qgpu0WUzJdPUH$`H1muLE[ Y #RdnrXDߊ[ZkJ$=T^^EŊUX"heY ZCCC8{,N>zq Ǐ|xt{O:a^V8uJy~ayyrG^RS4~77!D{j-n]6m7] |_$fN|Z-6|pl|$L t̯O>=c bɲLsH yA4!U`lsT.V\U)%Ia*,.-ŗ׹VXn9 gUI#.\'Oܩ7i}yK{e(ֵE$קjad'-=qiZkc>3hq75&''111mlllnw/.M,%O1cǹCDHw;3@Duu$A \:R7UDX7v .J@K*Znjj Zzyo[\ŋN/'FðG;E6'kZk}w>tpĉkzT*8qfffK(/^Θ#d8D֓b0S#41X=>>(~oљ+ N< J4绔AEDy3)|Ek K"qTUl[0׳J)hxe=cF\,T,;eH@Jn?7>rzfAΕ)ZO}Ye{#cE)*|@(&$ $An p4R&''u4M}eo_cggNEHA&}^=lmmj5Ŵ577lmmlO?%g!|c/w;y 2Nk^v` VS:%K1hVwv:x#>w_Zqfggs|P@eޞyʩV.AgʱW6fn*B̶iʉg?^3wJۥ\TXy==5 L)vgq(> Vju%T}"`Ŋuņ4MtT1>>=I=NUm.b2]Q^ _?Z7tN>}]v"755}lmmaoo~c~3so;;_8;g[Sn9A$ܓH =>y|nk 'ʦpmp_z`'qvjM*mZeڂOUӂ~ {r$D-@ ;L.6/V9|4X|VVAc' tYL_S{"" w+ϯr9]JrlڄbE$>C^{$ 066fM`ied~XC *?{.*x}Q>}bttN /-prl8{,)5;ScH=]):iKۻ2 >/ 0ӀSSS] Vp9pcp缣yڪ4p; tA4RQ'S8OTPu1[oVde+ Z|-,,`nnA7+1 51 oޅYVcnҥKXXXdUakH{O/ W15Øaj&*kNSڨwR,[{VT*LLL`jjTK. 2soxcOܫD9~(s+s WBb+֌+=4#wq|(TciLH-&A~:ӄ矨V5Kv6aٽV;ެlďftTP+?*iֺ]$I\F.677h4W{=,T+I|*ab go;d055kܾްihkR (J֑,,,`jjATU`q{pggpxjEb_d)r |XpEӆVEQpa~+(U ʯفB0kZ S )^vvo`A`6a+V?i|ZceU->8˜Y՚:677V_[YFq<b{¿כBS/044=4ua/9i$I\YZEViOqUi?G^ND^zY&ou9EX'w 8?,݃5 A' ۉ*t,׺t,LQhqY1?CU6Zu'7 {FVX+? ?Bda:u N;;;FLho׏ugW6ƭ]u<#XXX  1::1#I\{z~x[K9kJEP.BɩKx7`WW+F2P?c W)h__dR FJ f/ X7qbE:D5TEOIc<+9vv)8I`zzӨ.vo6wqkGSx;,..brr<ʡ4g߁4M] D~z8Z:XrcWXԧ>5z?/{)=?i!. T]MBj ᠬJ4@O++I' Y"> /=khXV+WFAJ^7bEL|Nc]lq ZØ7\jwfN6pI _\xA"I>zɵ5 M٩l˯iy˗X:x5\.re W=|&4Zer WT"DE%+jGdC)X9 1Qʖ7ed=izGjx䠉]: uc+VX)l5MVFjGjr˴yc<%L4j ^Vm6+gpS6  Uܪ6gYyYbZ1֠QL ʎ 5k.GK~A‹_Zޞ,^;SP7‡"`ŊuSr*fff033f锭Rmlooɓ.EА'1U8886֮@ۯzED]g01\5+ b0s+ Ayʡ|7)^y* e"fI9IN*TSx"RtbŊ+1X41\j5bvvF{{{ VVVn(`K N$I vh`6`Qeysoච=~v JHi"TgV8+ Rb; WEv6*H}QH WH]t'{J]YlԬN}q*XkiB X5qicŊuUgngggtWs2m]rw/q+W0JLP'kZnٳ"TeK}/Y.^Qy+q}*eCEj&c`UftQ["`Ŋ˾zJ?n*ڀրV qbdӇeRcp{`U4(qmo2Oj-'`+VQw1bի5XVuSNMk:|Wd5C% N2/ I(SlR9 "כu(U`h\/l <ǕV9aJ1T-bMlƊu+T#VX7[ZZhZP~@km"xB^ +]`WoC<#ʦOiOK)`8Ѹ܌qVʜ&3\;d\g4V:Nihl6]j{O=3#ho4/4>o^W$ C(B29X]~I@ }{G@w#0AqYދ,“&ѝ[e`qh|+!(X{5AXYYH ?Ǚ`EIY*)T Z y-rV%jU9\];hD(?+&)|ppXe|TE+VX\qXeQe[[[[SϺ36A@6&D˜rȮ1ӂ M^P: \iGy! [#]၉4͞ K"`]jg3VzE2hrv;?o|WܮJdz^2 5L)C5\By PVUmr2(>O(TLw^ ?ǥDaX}DЁm6¿b:v++YH9+ W:)1Ai-KYs,qoDDyfOe (]ϓFf:M=BVglx :.+s+VXn"j nbyMcl-@VLe" ߝgWH0O걈9n\^ 2~+)V΢..Ŋ0CF X@oq^+V> Ɗu\%I˼;JLR;WK92e .] (7wO "? = R@r c1?o#@ \ѡt:&ͽ**YWR8[D+1^r`"2'GkؤvonNKoK 2(@*1Z /O5 3b֟Z%Lۗ(0m- TUjZnw|R*I۴{+V3>bwdX]]EلKϹ#5cjS\`%2I[(3\&5̈ H9b8FLx'b)g? (̚wܜIBj+c}V|NJ*F2looc{{'\sn;r,W%(DG+ABp<";\Y%(!zH[i1 2B\y PWY??qsXbŊuՏJVWWO;9wJU2B,0Odr(NehJ8mv/J,8 ]J@H8?Nָs^i׫=WTEcŊ5@UUrU+JKKK "k/x4xbPF6p=ǽLJc&+V^=Ui˔VD)' N)%ZF| )J5 `*jzA},CO J["A)p+"CUb:7LTtְW71 g0~ Ö YkN/;=چnyсA! '/u=e!R(h>,v` e-J0Q^ d%XQY"ySyjYp%fck\x| V +MW[0h3VV0W>#Cfϕo Bk$Xʃʫ[­2F"АOnW*'*rТ^Z%QXW+4+AxQe~8HM4u ~,ɠ5RƳRzt^Ue^+@ UV,_WSm!mZquLXQ 56j@(MU6aww|p~~}&i O jM;P+?+n@U] 5+l00 Xӄ]gc E=,\&ɫUl2jMǬȃuMbEՊOhXc2󟀱KiG­A[ڕ*)BV(1Lۅ5ݚ *Puʿc¸F?V!_rA( d2mlbE6,tE&+5~\ɉ,..pztoz0?:d*g:bbqkJmEWVcWrZB`n? i1XC 啭Le-ZoN cŊu\kp;`%iX\e*~OmcPmWp /sv-BsD{l; 8P@j`*0HV!X>0+K)PT R$V`SF(Xy^)YEcX `G+ֵ,\5M,.."MSLTOcfMƕ6fNkJ$U8+"( myRaCi[0xhbapnPiW20ead{*.TƭN#ĊuIiW(+f.]BH~<4*+V vFbc4(W%iݯ**L**M4اgRD;@י̀Q^&Z-+UDMGj Q WÉo?~<䴅Z*+y% LO"t+$'D(@r t@נ>|ڇyy\u9hdk %ˆ`AqSOTbEU{0cŊu5hJD5Ͼ:3V 43nq3L7L 2pCTf<ԛ!@yʶ`|Z2) Z2V}jAZBE]%c3ĤxLbEՎOjX._NxW݋瞛sV*"A+2/Eӭr!q l2K.>yD=oSPQˤ}{4_J>y,wNu\{KF7dZRVu*VT@->b]+ĕ+WF܏;FXG" Lب?:2pdWDGXq ?TUO|yC`ЊO +q2 i6ǞvbPr)Ji9W>Dzt2mA{0>,ed$R7\QD` T &@Ҿs V]})Rf[kR11T+dc̀9b0Vn9o&!3XlIHq5Vޅ7ZSOeWU\ʘڭ@k:(s\)/gˆ~*LJ{?}u`UZ_WAnW 4 gU8"`]fNwM"\uNWOO0@Ğ]w]6yW\)oP[R]In g2@(X$R5 @ .:Zu *j)m'f(XL,[S6 DrS WYzoa*VkSqUN/""ZMRA$ "{&Gg2=khͼr-A'Lilp W \mrE8WU9oC58XuC^XqUnRTuC%HԝlZe*IRq|A,VAXziE'OL׾.LULA뜤vq%" }\#r[0P_a ~*/n_*P› nz\곝HU)r[i6+B׺ݕ,d]a/`"`C)J=V1 v/_Fi$op?UⶠZ25 h9qʷ]RTUo v]?pSP$љXz58ҠRWkjY%UX-<ȺX"`ŊH*MS ._NG=lT.A~+Vbl,f`f"=\(W EW)zЂ&rYW>"c_\U {ZWVeWz6`+{2>-^ U+aKx$ TkFU X"`0V*UO Otm(VHl36 l!vp`Y4㗄<)Iyta&:-Ğ enKB2_!\,C,ZIxX V&*0WBrY_;\,\uP]-Tɋiz?T[-|eʶh >z+%(.5[]`Q_|~6"`]7 n) [ukW+lZX\\tf;5%PA'dpʕ0,9r+V*+AyU)]tan%O(|/̇ zȼCVTbEV@ۡdƺkI},--!MShw]q}U*̺"hY)-+ _pV+؝2| z\*::꺿< 28X& /@D05K$h- 8q;֍_(XbŊup%X[[WO/8=&*ȺbNB9dw "L['!Qb'!ɸ/aVR9vY"`$F #>4`6ƊukU6VVVct}豸kj:˙E֕N Bۥbe[J+pYk#.i*S@Bd *X[`yxJ)9](ۉۄ4=`ĈXbŊu<פ 6hϞīt'Wŭٵ4 ʤN )⬲˚\/.Rh JU$!QVlrkp3-/xVdVPNk0 Q`UB7)x4cŊUP-*iuKKoupp%w;#wCdZʫZÄZU ~lۅ$\Q\)\V!.B齿~*_mC&Nf偕K>k唨ԟa;Q9c|o{N2`ŐXnejF=.֭Q* R•+W@Dܜ_pT% Npsrj%rB /*ʼnTFS!ta6`7X;j7f[P)PABv;AyV+ZBVӹ!Y+UiXXcźJpy1x̘QvBS{w B4P&$)(9oWY 2QKyT2͛.ПUZK*R|9Zrh% vY);qh;hbUժB4Xn*Vz9ߪlbii[=cf~9Jd Jakoj rQNA(NBdD akB؀r&9ԷU뢒*Pp9QQ֭LQeD>7+L!~Qy+V9u VY2[} ~?tT+ J9ʘE[hH֟EBr,ofTETʁUO>aJAlpʟ vHoVb,`]"!Th/7KKf*V[HX7WFDX]]`y6L}RkpzA<sAh, zY NZ?2!cEAj @ heϱn*˷ʮY^^vo=3*TLiݔX M!D;Ob څUHR |PLyptӅ@U:s}UEңEHA" Oȓi&!YU8+V?`L{we}}s7u)*s=uAUvZPɥˬV=VRVRh  +԰"C|Zl7` !MO^b%(ۆȴ /4hehhZ- PZbE:Of];x~.g Tۀ¬SAWTdvy@Gw *:DU\\vD<aԮl,.n+NJSʬ}rhn9sBPcŊe'uj:57Xǰ4EC/[zKKK}u'^D- I Z,+ C *$4 |X"J^h.3{*)ÇRCUH=]8=xS Y(\C2&w9AU{UX6acVe~+ PQ ? 'Q];yL/D0)Hpev99(6370rSQ Thal(.v4;dLNE Є"XN!)n B9|VPIL @8]~,Q)8+USn3V SV `/*RrOݢՑދ(D.,ZɹB΂>nO)!\PQ:bg@ RJ=tq6VJ_ۑvhMD(ȊޫXbź hJPViʕ+6o}p2Ю2mAnj;)@e햓d8(q vځfvtU/%Dsq vP^*WBt!U&\bۻf2,dDh܈8.JUsXQ7*ֵ~L DFe7^u9FuYRfP)>1Ty}<uEH1fwHX]uQ˞\QI݅*OS P.Ju7s&=*_kc_èjnf_QcDX]5U(ĺZX[[Ax9'QIt`d ٭zE.ʪO:l̖p J咮L*;ߎPQd5Ue}L*Q}{dT8ZV~z7ZED7Xa=ǺUZR@)vw,ͯsn={gxq,J00l,@!e"ؙA$8(B "  qx?3]SU]8-~c{ιު[}QO{>{{u֭RwPղTszTY7C0jod@7Ib|bkoUsIljRYz<[2gN4Ə@WbcOoCW>œv4Cˎ_Azz9X$#=^&?~TӁY,U+(W' A>"$Ã,'#&}zpv +.{>+v.L|jN/ф!@C]R,;ȂZ|2^^`}w_ǤDߟ\б}S_M׆*gT4V;JvUͭdVUՓUkD5*kEH;gk%0 ZNbenO`뤮UւmxȆ%@'H䈱B?Ȁ)`dX2 9c Ʊ^XOO\"Ƀk}pZmղVyf MxrJ.*1Tqk`h[Gp"j^ )+sv9Γ@J@k}%mxBD rݐ p1 6b^AzqN|0Uثz^5z9,87!|/Dخ c^`-2n޼Y?8?MK;J@Vc;G4ZwSY" rTúriOWS' O0Us1/ 6e3 =^F,u8(2$l=FW|p{{{/5Z5Zq)f3@&7un1#{Zq]aw5>s L _]&Pތc(Zj0)xJU=̈́!_}ʎeielnC.͢bhwTmfFY[ÁWKFY7]* `-Q4ZZwi3iٺyf9\ï]X@4VVaJO`5DX R%fet1[COX-6/&UGI i)0ZT-aV,ϰܹdVJLC{Ae Ht ٝ$`uNL&)6al_ZӮ/"z~3}U|0Vm*ZI]0U 2?Y ~lpP1LK"NTDj3nw j9  [ 'ޏn GWg5ˌvypg'U昆v=~xYw-yĝ[uYsz׳g#_zڰUHwjn0dp5j5K63H.sM*,'0U+!*N6/ۆϨp0dejnIA 2@ӂh U/ĖD×)˃c%"{V"xGpPɗ\j~uzǏq֭U||kO Pk΋bhG)4[0* Vl*o`[`-=+lsex*XtuStfRS1 ICspfwwP@vߟa1+vvsTDUIhy5EQ DZ)if3k:9xO| j9a;| NUë'er`Uٱh疵2 Y䞟_>Y3SNz$?۵>ZeX$;wNt }װ`X@1tvmzن֭r{~aXCCCpuL 恫;g,u W*\$%pc<=]MFX P6Wh,ߛ\lʃW^0XߜT;Xkk5VNs|–յPϪٵbp@2 +Ĕ%AAX+ JZc֪d2M`VG:x2<#Zfs;peF^AB^8cK@G3܌6Xcyɓ' %htsXg[_y_a\6̎醬u5kUv@3Ý;wpL+'vBF dZJ C;W٫t+rTT=R&)lE=N-j>:U\2Z}zpv6\Lۘgf3\<+i,S\8]ذZhi*G">~bfu?ϩKO!0['cY+p|潷WXotsxVgդ,Ar `+J$(Yk~/ƬR- * WpYN6et\9tr#Ȇ9WY05 ZBJt_IϐAd2F&fNo_o8&-/` ku>Y | `j1b"2׾^5Nc! 0 Ǯ^*kղVqU5ZhdI"Fݑ2Ih@a[jXX|c'N/߭-w̙lKAWzCbyPDnhF7oƇy_X["| ? {唆Deg? +#Ngw{Vۈ+h6h@T[{dE,*7ruѧ`*am%%\k%5?CjU< ZJLqPP#MCIcjՐ-&9%gO_AڃL'!mb¯cL"RX6o.iAz ?elP@45I&^4>L @=J |+q90q$$4Y2U̩تq (\M|q=θ:` ?*k)Spl:ո;0Gaoox>1Ͻskՠ^2*i;.|8z[%;c5M "b{$^1NDW/߼v SՒi5EG  %ho01e2*dg?ˆO19Hk0z,WzSW6 Srل S$=CP^Z)S5E^lk;ܛMtכyOAӋ3>7kdŵ\#A^՚.u}ܹs[߽9ş{5|洂*T@Hhkk@K%w*TЌArikfv`0XxWDj2>lRU Sc>-<0 L;аnFU pjd`(u^xqyÇ]I@$|c{FڝT]]s:TXjUt:VN'eO`d٩jOݶd z$,z e UOHX W R$C.u˃;wrBfk N{3$TKCnʎ١Lk =(ݻ{lmOr<8pj{ Z %M uV~{j`=2- `b5c6",9: ~;O;ΕXUOY3~~vr&K.z ep6/ ~r٫s(_doWEhS5Za}ś%ju"Q!kV9}=oݺ#5g^qw *mS^-*"Xbͤ_! ^'ᓉ,q'Oz;L\g_ /j;s>W > ]h%Pr¢ȅq?9\߳1*)d.%Ǫ`[^ $4 Md^i=4xEKObaeOA\1WM{_||֑ M,2jpM΃kegV 0x@⯹ҥK9n٫bƯ.p[w?%SG;zHm ǕSؗ+ Urܺu ^ݱ-?riAτt^&[mX Ȝ$B)6TL&d!m&è^s\Eh/1 B!P|rΝ;kj4'*Z#JU3g~R(u.o0"/&bB k@)% eɄ/%Xe޼y.dRW|3c#ܾ}_ |1&h$ jHu47+;M;M&KJZuk, dSU9P4ioL*sꙘߗŸPcƷJiY eya5(pގ.?Cpٽe\_$۷{ഖkc{'O%À s r֑MEj|yg<:kG1^ >שּׁjAK|_lf3ɓdc ӗv =%3JX<*U%$Td[$Ks׆9%AU:Bs5kYP;ӰTOT.VP 0W:]:I*׏%bbHo{E G"'t6<٫ !`ww"}/Mb ى'OG}A_yJ^~nZk^zeR`۸{n)~d?}S)U$"*d^ >J^5{w<}.Iy'$'Y+" ^m)̈́gx|jsc1!6Tj}j7{5`0S2kks?eFH _qx^e&ygzq#$F3>-$… Ηd]mൔ-r{yX2j bl&:UH=4Ӯh1R$eY0N43 " jT$^;>٣Oml~zff[7~1n4ۺ[{f[w6H2c&|͓dcz?u17 F Fd8WL)UIv]AB:ϗ BCU@ )W.0E%V z*=&ggr,9;ZLYPYk^NVɨi8N09>'7:ʯ0Gj\5a %ODOW~gN`8Z948 [䇎=f9lԓیd?Wɤ*`j^$ju>ޯ[n^3lgc={ZλH>,& ?MD3z5!P$t!Ĩ!i&bTU>BB T)"A3Bt** ITKGL&P %L#7~ߊqF[7cܺmylY<9[BvƒOolI9 3F&RR eeuDL^K1 "z3hJ" 84qCe9ќ\SCGB9xZ[j="&)׫\O=}^}FI'T'ʇ\&<-≤ r3=WSةn9*Kl 6$zc ˂$Y_ثW}BYmfc}7x`u>K_o|7mk~xkE@(`P`A !F3 "J{`HNU"!N$QUuFn:K~ "L.-&^FD TWb&@I7~߾[f[b3ۼo6e!]3u\񝈙ˁ["?hSơBDj cj LN(eJ븨 2e,ٯad@t|"Bv%Pd `F`yĕx5' J!&Gլ,ʈq[wE! z,IRM89^VdLU@+N2> CE92Q; -ya__\^]r"Ǐzɓ'xp 67o}|Cu} !bf)1>|Aַ_D(2A IC3" .$"61h(BcUUR'!E%-RQU$5LE0_B1I/ӣv҉1x[1n$7oŸ'[u c&ɁN w?Bd`JJ H$- O*hHpռ?U2Lǁb(ZCȪ>5Uzύ*Tj1ߺuܹ^{ wi샻_W+}ςUCFGwOPܟu%L|a$(h"b3R@(FND tdEEDI!hҠC:0RH(!T ""* SMv D Ad U)WR*|:6@DU>zDS9L7cz3ƭ66]31`m<9!̅N73 ejA@8$꼐eO|Y [ xu @ ^CMv MĚ#%Gy l&V #&I{ؤ@^_xEa~kgV3}x](Elcs :c%pِğ}WKB2/j#d[f7n냓ѷ_+gbb3U"#Rc(5<X߀yЛy<T!ԉH%1JA!&L(*!$ Y"jv*Jd&AFZTfR1}}` ,/J*"i,( =f򉉐;fߦzDOGN}[1ntu0'fb5N!"?ؖ޾3QˁV,x fp% QJV /p$5ADR,A"C$DIu_T{*JiU)$h6)Vg"Hio7$psz$d#%hrk̖ KӒe>N@}}0ުUFUN̡sKlC[ڵk B^_u_&^y7LϠf " 'I$ypս`=j}%S3gBf/j]ҩrHG!UJJ31MHd0/0SQMjR%1B} P̔vT 84}XX,8jE ܫ{%+Xbx!&?bb: 8V6n51$M9~z2y n|s3 S4 tyQ*Jc# wELQBTcdܑ#9 я'|H99c%,*iElale_We d241O/.2ᘞ M, lllcý{Dz=z^{5ܼy(𡭭ڵ׮>BI{]*0?9klYOS Ewɬ`!ѽNSܨJbcv"֓ .jyKi,hpUuOKl5[78};fL(c# 7˝R̺D')#dDD՜4_yf)Kب(ӃXBLqoԪX%p-l$3KWehWث(rUuʫ,-?-sW<2z_n8o*:?cQ͕O;VPd&u[Ȃ4 * hmYqY0;SF;8oy^W^:4oټb: ^']^;ShC{hLŔYi&g(!Plny_$xOD~"99P|_ERMQ;$!R'%i2&uQ#%PzK4@Sb9@~8hJi*"Gf"}aRl/4<|Nf{yb&ˑ \36p)9 M4љI!&"!VR:z""rc4")w BIޱ6I5_ Ę%EaPUv4Pڰ^s/FBA D(/6ZxyH# F:,z5խp0,$ظ8Pv<)ZbEu+_d˿\׋ ~y۩A8 W3t:۷[/~\ݵzg֢^IdU(!΂^%,^3UsJ эްW_W"QQ?Of!d8Hr+H4ǩwЁHI :Ic: ƴ\z]Kb)RLB)8I`*W HjL,̔MDܼ."L9C6" f:1aɟ'2L5Qq y=(v@3 mC @ːd `"`E^3Gm%D.izvY""CDX$UzH%$0W:JPX,6h8`q@$ƌwcrL$d=ZzYH+bcs.atvdcQNę7ٳ0zfր(h^4{}d$@N/5ٷX㏓XU\ "[421q($@l~+xӥk׮ ӵk0p5:X3'O׿>N&W~._zQYΎ3J4 }`b&bj @=~j{,obfLG&k(&^hoyXHUQH&;R'0"!$8cu㽑fĞʈ'epڥsЩ5R!KB@ZcE0Z\J_ȯQYdAoo;]Uvb6a U 31*M =D mX T!FBBbHs ^]AeY: 55$ %=a0K q/Y,iҚX "Qʶew+^y2  [%R~qpX/zpd!7DseK]ՆZR>ǬkJZ0fg. 3O;ez@~ZҟŽt2 Q(*_@}!@QuPb i0SAhBHš܇GsuMH.wA!q=9ҝI]O]3ʘzxSR K%h pKĩUdRQ A(CrLVD*o`n_4?Kir%z+L|adi|1bo G4fȜX/ -Α/vLWwΆ"p :Kx`TQ g_f7|ೳ)߅7~կochƞbi~=Ԣ FU;Ģ"Fը`N)}k :DmΟ}GFEDqbT&?2UtҎC >#>$SZ4WꠃO$cvAH_+eN@%骺 x d/t >;`ȣ"Ek1 SaK2al\,ze %e!f$R)Lal4&DAUb\tlz! x*mD]IE^zINz^\4"ܜH4}[Tz֧-܃{R ``Q:?)IDi:iOjH(gNK),^+G4f0`4c1D6l׌}Bӈ9*1#)D*;rȒ^>$X#+Ar;q_:B~rsRB(M-5ݾYOLxCFBA*ၹ<Z% \X^@ $JktW QI2;?\̌dWK,_V9nɂ,ص7SgB/Ȇu"uT BkheFz˓+^Ƭh8(e_2OMc&XZ Xhd.2T2N}ζ X)VXS%t:-%+}5ܽ{=˰6j"CT,i"p}b}_$ X#X*HT`|bL$geT&"tT !ٿ^3y mKpJd"7KfXrYH:x!T b!WͲ bj$S: 2 jy -m˗gÓr }Co?E>E*2]JƜ,Zf.&Q򨢒 Q&|K(b)IH"체f,/(s%,bb֩u79 ~\㓏eJ-9_4XB8%{8%N򜳉9#r;&@Zdp \,lW~eS#TFiՐ286C4֋Maм^/g0^zql'Y;1qs=(몂a_?륗^`˗/ؾ^K[puܻw[[7鋗tsA/{HEESn C43EQF{ %L3Hvf^x4|zy`}'|)$!g(ߙAˆӔIelhוwH 1FK" .@90xw&~Ѐq */$s^6qt5AI^ߍvM8[<Sr9&rm3ep !ʕ+؈,T}Z׿u\~}z;nKo\&Q%`Z!HfK%UTIz31Lt,FHTu!}J4_:*7*Gj ΐD3ZAUD5iu$a.F)YXKۼ[0L. 5B0.̜ٳ^oEBHzP')Ḟ Q&4tolt'pJN dSPrn.0$`%7zCVh7 A iNBQX+XY乪^꓍' #&cAT),S-I݊ &$wH!ee1߯ 0j*Fnʶ&%{rj8b1?FYk۸ Sa(mxif)FTj놆s6z 9B6jΓ* x32NPBȢ^PQ UYffp }_.`7y o 7U=aQĨ#h?6<=TOUUK|ںZX*YJATMB;K|9z_LSb]$օ0<"Qܧ'NuQ1jLҡmS,pc*' ە#'ADaѼKxǀW0m.4.@X22Eu3uB,?ϺAm&[⠉'ctS T<:ӧQd>OD& ceb˞ J^HI7 e|N,VX/4L.x8{q+2cFuȴfMr|Vz DT[tRZd9+3VM)ٛPb-F߶# #+̩znVrKU"l*'ʍ"8ȬPjspV8 d0ۻ._F{.^{c1 ߵyGww=Bc>G{xt I_ʌy0^-fRL&"5)a#bM˷,iymBGŠ*Sosf^61B(-` ߋ Ce`#D0JeT#JWfXe3LҰ^ݬO94VɤzeP䬗T0Web1S0^H$TX B)άe+9J1gfKtU7,,PVW6KZ0C;ϒ8x<\Kj@y\^cmZV1Uͷ5Vy|X.?xqW66ʘ@ j XhQ `D%;ǰy~4AUI:d~jG1qE<' 677)$͓e3{Z6 5[nD}'dON-&bd3:i l*lYaP=G1tY. ͳ1F3[˒cUX0g\fLKꁑ= v7/0Ue`)C$f&?R/3}ȗ6T eES$J=`" r5fkM3a΁V>CM1^)j>EfA T ֫N0g#ܓ?jR ӄ.͐VǕB090ZK dK7Hd#=WKn < XYa]3 Y&9j0?H*z37 kqؤs<4{ԕ5vOzWB{XעB8΅[]82"S^qQ`$4U}Af 4cL҉5,Üh"U91 Wkֻg4 -{U澩%h3q$ǒgKg%d(9ϥ)39HfοkDKrxeWepj%ݧ5t%Baxbd㯑oK}ݮ9HI LaCQg5)ڴ2RK:rOW7X/iXP$A!j`欎T<3a&pW 8kTi ߕ g6-G]4L*rԦǮZ;c䠬 S,MPYM}k;$d ^YQPUp!cga2e &̒mO;DW4%$p5ܼysM߼עoN΅߿s[6gII XJB-3XB /fNCh!j $OIJgJXTfs^HTiss <")%N2vUfr}ҘqBbSĈK.S.VItdb̖aRΡK7zxUώK`zZLĆ1*浾,෰}IEo]wxmJvǔalTt #y^ٻp4c)M3KXX@dfr#@ aP H*ӈY~e|,HFJ sz3IV.LĒLWsLSy_~-EMx^J9(汾",)%0 ۱O>OD >(o'Ow/h6谹7|=1 Kbf~Gwv߼8 3V18B4$ZLs h%o11X `}bbL<}y6d/-%*sbLhWlz鉇U3kk]fm*%Qq Dd/IxbtYQ€E3/F*./kxAc|EU^p:' ")a2]R#]#@U&#[Ue$ M݊0UWc|]"*f0Fd!g! Z"=Udx%L8ĘŴ}33%K5IR%ľ bf dAASh:+nvؔYKr"mQwaHY/"#Q Bq%쑁?b .OwJQ@jYW_R,·$: *1g/L>/z|y6lͼ${by^LjqBwv΅MR`V)I=j2ce6*i0YV͂ЁUMT4xrOft]'`eJ;DzX *_Y)ŝy?*yIoO0X#U.*#@NJx6J \SR9Ɏ=x%ƫ5FgM¨"i)f)~,9*l_cÆԞDU<&U>۩;0lCRͧ&Q]?<}f>زfuz) JKǬ{BKF^dհ^s&RЀ`b|[`dDin.W"q\6i ʱS uJU-e9,^ldmȕCϊ5MacVX<[,@U4m+':TPBNok xfͥXBd-O0M !:S5μ =5^_wױ7Yy{6y hV}ΧhI (0$EUҳ4,]VSU̬}o]w18gUTa'mw 5<_r C3+V^5ӀⱲ[6*SM]6b,pyߣ&,1 nHO.CsDCtQko5ǑvmvsJO2ꋶ%U!+ulx!fPόˤ^@6ʻ\cV HFʔn^kqD(Q W}-v"ʆ] ՆM:4Lxȼ_`/^, 6x<"<1 y#uU/T #EfFx}| Zq\A\e k杖+3$`ylVU>ԩC1CQܸ~P-|R1޴ pyPU#r,>"*L}G, 2DJ/O c!H}{۽g;wh)^ëڋYx!/}+vonq30Mj>60+O)H4 Ve tScIR2cFB{Yr,0[E(lG`] jM>#cUƲzQW8En*S؍>AQPy_ݥw`ۨ.z-M݉jTkUNW`n'Gx@OL 7Ids͞d]TBQStի~ϟz|RrPWciի ^QЍ*8fEdnN'թk)>9AuQQU<"k3滮Sw$2yGƕ]hQrYZ=HB RSovwa"H| ,EGUEpK҃fKz: %ηTL!9eL_UlfRLz-ouH+ 1@4w Vxu2j_-"ר{nA}ʫeT/Qt͓TdmUq_We_QR@Jl0%#v;EQuWbU_֫( ٥ĮG1)QcT|:{B* V&JхJ~_^oiXٹK|;,fmo޵7t z@]~[jnRII0SaHV&5#rV!tE4zQY3i2(sGoxњup Ոq0 Zit0V+*MJ!VY]$O/^PE~NR%gP hr 8fz ࿝L䗘o|k;Eݱ"(x8mpz1F $+RJh12Hl25Rm6CU/OBWSP4z#*ՋHMZ6:TbLѵ ?`#ޢb4)b'S)VT+t5=ȅ֝+b-[֕\G@A]7.L5s튴 k``&^qF H˜_6gQ٬wQ*fSWVeU T0$ V$1@ZJmү Zџz>Yʯ/Zx)YmXK:EkfCx5PEs5xN]+3`o\h5/S(.4^6Ru4i>5Fl-N-Q`Ugpl4[ SԚjhܯ8nZyP%0M)(q7gS֌sΘ\;ǃ穤G Tϗ W 2DJՋy]URU/ˋ+P$(WS}Jt8<>L`7Fc2~3#u;yubơ)XPLyY.5CԲTA F.K4Je'"o{/D"rEUkk/˜petz{o~x{N*X#L8A* krQv*5DseM0/ @fiŬiz{nKdq_)X6S4o ^+TÑR3JaZTE0:HxS ^\0򘞗1covfqV-o|{z+_R`9z=UR5MYW5,| lz naV-+'˻d#z7b\FzeU.@&"{/VΩlDC؀y_VeΜǀQ#>A Inxgu+-cI%BcyH l/5A\2+g~kVء0w}mUξWU8 &7/[obo'OZW+x CX[('2U3Ѧyu+)fɕ3ZJEeXE>YmR3h::{U^cƀjT*XDNNMw{LWw{p*J"nTq7ꬥ|F:k/YEʰ'<ևF)EQ:B:Xh;IWoȫOu-Jؒ:X umYfis-LcaD=aŢHW?Mݱ$ҽrNƴ@JD1Durh}ȸE}0WT}ՁvNEu%5޺bLL_D<*[Xe"B`({.[zuW|>ǫvo}ޭ%nPYf2.D jDȼ&@bK͕$nXNZjnUf[d%M>*̑ >֓4X Ƭ#+R"cJPR#_EU~8jx·!D)e 3%fS=7=|psXp3:k:$fvvwX -gXb%iTR SM|`ЬZEj+)9<ժ@#RJկz0VZ~Y*)Z=<*b։ʓh74Q泴SfϒN2<4 UM_Mqc_AzL+UeR@sWR;jR4A `XJʭ^I%ʀ1)8^8eUpEETҮ"(QX|jMSqTK+BO9"hkUBQJJ1U%F}Wۀ@'b+]{w?LS|'}ҥG9fW^7 O~ c@"L14"X$H2p3+V t iexF,O5hϨ2{6a^H] F ɦ,|g`Aaf+DD}V.c#VW~/ʡ,<[8^uP6/%xY'=]c$[G].h2_u)ERpԼ,ђՎT5Ue#!{lPFt&)*ϳzՏeTA[1cv#A䴅RSS-2z,=]ZZF #(1,B&|mUQV"K_JD>J0Ru fu>!YS| 2M۟8>ׯ_.W9u^]۶x+ѣG0_wwo=?i[."" &1*CUjFzΰ"Un Uz pŊį'jD*PR KT9ݚT6" lhGQ[ETC5J` *VCZ%A崀]l},0W|Жj8 ~H}K\jNȵ.xs*#Dq6z]fJ#k6,2CkKӈ5`< O_ ¡%F^ñ%)VN/?s(B !|e#HC;JBd}U/e?ԍ*<+Ea9^|ZbHBHWҔ N oF=N)&&C"nZɷn*dt:d2AJ銪8ƊǏW^71 yݝ[_VJR-c%eVs_U+y% w1 "ÊHW`|DH f!zǽ@-WPBR#4XZ/1V Xp]d+4$mm5&5P $-L(A"bI,-E;-.@S5idqx*Cm;y`*_G\R%BL&R;Z USoX7sC@+'&je=sAT1jf]@se _Y^[+ $'֧\\9=Ji d7}g,DFQ}Svr#qW] ZO|%eu a\%kF̯Q!&,7{Ն $jUPN~SQ@%sGBQ hGIKޣZ8reBmΑ1FE.\Br3u 1[01ĔHɫ~Xn{,[bF\;7v-wDfU_zUe n<*lYmw,|;ٹ)CELI-q}U "V b,QdMQed&eJ& NJK jĜiT0g_.k5jrѼhjT1$~^kZw̸6]N _O TծS E&A&_yPLj+QMPhbS8(ui]d)Hh5|U/ KS / _\>k-/_EQΘe탕DqwY堑!\-vuk" *k ͳj~""Ԍ#IޯfnABƴUXl,k#h0>x_,^H(kw vz+oJmuKuDU"2 _M,)^iT1 ZOA|?۷>N9" 2Eh[JdL$ip]iTJ*5I"Cf? ҔԘk3;`uMY1A^4^ج0C5DIsAݗ#&A\§ڶ .̣MWW5 ڢq:৐ڍ?}'B5*`P=[5Dh+ ]Rzgw|ȠBi_#Gq(9| YTT>5=p[cpIU͊q#([w,U+z:_yz ̙D1\CFs^DNgZp#m@rU.>]i6EIW AX}H5ѽvրĠĤ@TeP^ҍvjo^vvSuvSuV۶YjaJ*Ekv}+x7z6ٹU 5AIV5Xeʀz`jM#b : t>gTGLȐW2"TBښ0[tZ^]@ƃ8d`]P8@ $R+'d{ ?|cFm&ӏ6xCQ&a(fu5^0`J͖W9a_ܩe1%JJ̖>G[_9wS٩*f7jzA\(߬J+Q!Q'GU݊м q,y5$`eԙ()P-NP~9MDLȡLؽ\FL̒Y a'N]RDhY) [YbR ~i2Y}bƏ ٫"*[oL_oV>.b4Ĕ4q];yU9f_,tOAŠHE^@E*)V?QbY8t**m$bȔYjbXZ"0 )uJUX &On̄9*+Q$:u(Pm_y^xZoƺu/J银scCY]ߕ_(x/pJr/׮rMu -Ũ)?jjؤ.Ol+޸X4v B1+,Ui]BU+OX*j<^B=*4z~QP^CF. _9,S-ŪZ(yq>èQCbҖ-jvIy@|/y„8{&m)C)EG^zɈ0"v%f̋2?81 O]+_nN2}lr_ >\76r<阉!d sJǏ/W_b(})mo򝝷'm Jt -*'(5(ID]uE1:3 J~"r!ܨJ\WxZUS5yW@Qjx+mkgDwg;aiM:!<6\0bodPԏT.lڒ^~ r?vM伦Rm #6lzQΔ—ae8PgF)MiӸEG[V1Qf>ZfU! jX}LWW^JUB}6S/1pD$ $`jTrH1 JHljLD.~bkB B`꓏ C/DzWeg:̚&j}XUG^)XIqoD3qF.6I߹{=*H'0e[7:@h:Ȕo!dR\#V눖YICd~ZաKXu8Fs:իmp_f3olK$xc޾nw U02܍e&qRuk@JfwSC)+[GzmqMܾ} 3_s;o_c? *W@X[&yAx{tXCeo3N%(hSR* fjafPőO%!R+J00%,%pnj` c, ~ ̳ N=@o]w&gzaHTi^?V^ժWI)*\Wz֐]SO2M+ǑR0yOa?6>Ъ力dR pHdDfHNkk/chz.ZkS@bI 5Qr; P4p@>j6%(11}ER9oM"U-IA ^^CIbPC`1t9fG0~ fvꑣfRJHTa^ڶMC*;fM}<~V~vVIj&>u fwXU0 *p8ȵHj&u4R)==TcRqMg>3m_0"kc5!ݬ -+ٝ3DuN2p0 6 .u :g6]@ӓ}17`N uoN_fiZ?Jz1C\SZ ܥsK`iW҆s_9ifaT)Q$"$*OQ"f#;|emq p1f27qK @CBSxFP++}A|3٢~H}^.DbRbm4+ Om* k/-`0eyc۶ `n|wnZ#&mU -r2DATQaRI WKlj7L`pj)|W&%ɝja `%̍.Dmʹe#"ED.\MfʊXc5R~5"(AV=m>.g"MmK|}+Zsw]bGfz[oMe`E`ƃrқ_ 0>lt/PYj/K4^KeC*pf)?C☸-I _'R]ă>>0ŜrU_=[} Jż!|pf{9 ,AT-M(y"=ļrf 'D?=cNSȗRxL"8͙nj8+GRq%$ԋ`_9aϊe}iZRQK9:ET#i]˖%ALZ X2ҖX 92!U5Si>!`iŋf +r$QJn7]m2#yŃQgRNu~M1`]:K, uaI?Hn6&=3>.'(YY6ԇ8/- ΪB f+_V^.'ڧ2V*f|GgV=m9(XF^}?r/[9eԌ@h#Ui9B`JQ=UygDD!2K0febS@#X/}1[fg *IbI 3LVP%qCK$OGVDBw݂T| $cI Lu˜T- 23!!ЖXMT Xb1sTո)%cvOUV ̪oBʪ"5, }z Yw6c9$jQFW/mݠѳRn6U1vK V x ̻3SB8.7AtORנpiJU5BhB a@BN Jհn5zhCPA",WNnKr|ޭs"`?dIHB-4ffIr5_:/[ !`0bWM<dHi&`*b*SD${ BީQ]Gix$cW,4LaWE׻ȅL膈m>UieQt&v4zFQE469އ۹ ۣnmv,'oLGQ(crGwR_=+_{gcSB(kB\=fPytPy0~Z̸+,U:iDžXUFzg7KA mA2>7㮒I:% B=Z+@(0J!tB/5-$ƂTia6Çb}˫%wq);h af*,jSXjTZh#? b_h0*,O -{( HxWXUbhAUjmMs5<* X0HUМRD`&K*fbжaϠ jcQJAY]ϙ FPQWYR~PJO'Meey UU>V)L=]?R.`m8V<7Pm>EȅPfx{L, f#6ueru@4^bl nߗ8:N]y~  cYaCLJcvUBX@j1H7WCW{[>1.U2#cR.r.$6^븪Dž _  |qtJ+ Y3Ʌ>4b,}# ^1I^.SVSO*% T chS)B\~Ϧ*ȕs"$unSn`iLU W!2TT}^塢\IGfw 0"=³jR`2s%P`@in8d'U>36f'}fwo2UCgZ( l!ICulLEKU$W،g KEj4DjyQkQIjm'`%3w^^@gHfV V53,4+x2!]_li&+%>ʰD0{]UkzڬFDeթeF<ʽTQUW)p/mJ~E)2K"0ƃF)qٻmȅd1KX,~_R.u _Ll3-*! #[ YMgMղ')fտl-rJ }te|Ec# Cb(圥rҟ,_zG #2X+5Ɲ/,T&gZ}`Bm[ Kg̤$fһG|@)ҭ=~>ʋ?5Fq<]dDfU%Um8%O^VEXjNAy{B ՈYNޫM.t]'ޓw~pogMih\CV(dY:D:sЙ:5cy (Is9Iv{Y[+~¼15%"|@Ƒ0Q-޲pWw(յͼ/ ;/KPH)̌(C]liZ~Gq,/e 3Lw13|Dg4X\oZ&w}dӦa4%C<*d6WY,{@X =pM4=]W9XRҜsٔӅﱓ͹M7 ] f 6t*)2UdD(dVNi@ 7{UKRzq%6QWj_ ML4" rqPC76q.d9@Ҁ~X_[䳢\ߌLJjb:zsR'$_l">_sG"9e4@56w}IEQDWYT)% pX=(aHvu LS.,b[1\ꢄ{Pe#|*k>NK!x])7W9aG; -{Ol5d2o~0#i1W`ƺ$KP2Fy@p>JE>JECeȢL,T);BͲmM2P!NrPgxs5nA4*13"KM#P1C XQ`ν2dbqxEwE <): hcf\ZcZK6NO#aWˮFALٳBZ96sS0;1&3d,'{:>BU}<~$T/ JE1#)Jɶ}RC/RE40<J(T}lM a}UiJ{^Y94_pϋ r "mmd|8vEyO*7Wcӳ}C&ׯO& 2Zv0;1!`  *u|3UPX; ;FY*0 }mf[(ҝTkkz'4rޘ^d(S;|^<Gj2ԖG~< R0qm +d,%Oq1r";ba |UeIJ.yaViESVAҘܸxq]WKoӾ`̦{R#![VˡPv`vUj̒#hLXtfHxi1UI<|ٜZHe7#DHZybQ|fg]~-_+gYza~E:6E.zYYޕ:BRܻwhkGTxJeipkezh L *g]QV܎/y5 k(6OUa&@ϓW ESVX i ƌ8(7 *WcSn[}5=4M."mVVϊZvT0;Wى1Sr{9kRx$+h/aHT*tZo&6rm;pax/ 9 }0C_TBkkzד@qg R #S9$XY(Rhq#:}kXX˚GYa`,g骁_4\[ukw*Mk}3/& &\slӌHqOfRBZR #o\\y՞ I۞~ESmdt bd^K=Z + N2@S\]^nL@æJmˉ3y{V0=;HGDVu5商9n?&PbvTPusR.)Xx3m?OP2Jv~@_svZDxgNp)]1fZ&f$ 5^ʁ2 ?{hu*}/,Eöe\]*˪Z*A):x/*x;̤ 8CE[鹬G>Wuη}`[[[˅P*HZ.k zZA4scӗ3_vm@1cL&S|*a|{xatSN엀PXt%ZH4 z)z {Tފ, "U)˜tSW( RfEz/:{!P=iy4z5 cqy>h[;;!!`r`vcMǘى1ǟ'/rm:G<`!kqĸrOݷ^UC+ҍ^i_p,m*`49q,9rAUMc<fpJO9! 26WP jŹY1_@|>1Zowm?+?>nGOY۳G#N7RDղȎJ`L|` {v߼x[ϩFsP/3UFy$VA &B},@3ˬH1+R* 9 Eu@u5MVnx+H &ƌQwXVќ$ԝ&}׷20!]TP0;9ɏ17Mǘ߰k'bEzfhDO~)Ǥ> vNԪw1 $^\\+ΫUB>lUݠev*%p[ "NJLYTӏoF]Uuo&9 *hKlxp9a`x5#C;_egf])@l7.FՕQotzeR

͔L;Og]uGJ L+#ދYT TcW_.#\&>^p{{{L :џu\1fӬ1W~cb=l티On'220#e|1ΦG{50׼ܣ, />1=[og`__UF?wwgww\SʯKs_\ks\ISiE'7UV˟yJ1}1FkTZJZXJy; g?bkd |v3 $mE-;1Qc>EcLw۩t_]oW\;e/Dr(ooj SjVʓ拶IPU! YʢZev9XO%`M&'|>V׺@t]c') ߶`w=l|AӅɝ =mcMle_O?SMB=kWԁS Mշ•[2I:ZWYTuXYVwXn *lg]r;hמ'5tdT`gԲʦ:x uX¹ V9DóBtYUNʢ8r{%Sֽ ^5֯X1q&'ߵvpUvU~@d{dϏܕ(cfj9m0{Ƙ1Akj# uk1a){UwoHTiUq4=EuٓjF/: w'8]{vM_[_緯5˔&3:̞1QjIٙIј8tvx?kEu=]?~< cc a.E1yN+'Wݻ?);1H?%ῳrYep'.4:i Z"8@ v= tlS>{X*_kҘ񸷳wޫ:b־`o.C*Cfw@jCg/ =17\ߖ!vֶmpt Te=A;Xc*Z?[Zxc?U>U1gJq N= gw\ ,9ﴇ~S ̎egxz`1:@ooo{7SSpϣtߣٟ}J;w~56R٪EwX'{;?/\{ne>WZv&cL Y}1gDGXx. <Oד$<]m+:;2LlX:uukwm_N#8<]]/'{ww?Y PQ.&c2;C :W*ojx+Źl6}3ө^1ݩccV/Z1(q"ݿw_4Z|ѵ/țBB'Vyw!@g D'bfUU <]e^= kf쥗^:2,l^6:m]:npIwBp"8]!дm!yYC.+7``t1][;&q u\#RT@yxb P]쫧[o^l~kwZ^<]]wg1]g].w-Lzc LXd bIDNzA1XF 8Q DNDHxp9uN9{V{nwMW_}E+7λW?0B'0mea}`hO^`;)<=ըcq`0-Hm],xk\?{'Dc?vMc2|YPI[2Yˬ1a?+)Pw܆{64EU1yp4CDV=Vb-3XwD1N\#/c$:xX}8F=>g!veou Vѩ+#V _{Ҳ9Dcq%{x}j\XhYTD+f+T0?RO9rd즍Nd^oP$$ˌhnn.ק+NcN~0w'm?|H?fXUTU^o]~QNgE}*H4 {/ T1́ |Vk>Z+n+N+n+N+n+N+n% >vԊ|=wn&zAO~ʏ/bjY7 kFܟ+$y8^Vͤ@%q)Zi>yq`M*4.UbHXc$TKd0.]ƁdËu{?˞|{&uڹDu3Ұyۭ K0|\ .^cu]*T 8rjPQ"5MO> ȆwW\R/U]n|s=yDz(,m0|I(K3Z-'.vz/^4y~6W.qڛ)T"KTq`$TQ+f`M8hR/ baLEc= *YVXOPb9˦|CadMlT~X)uvT2(4$ *%* Pm>l6X/!t%w|0vb=M,f21h>9c]&x^W*̤΢ Q뿝d^]+m]%t) _{W5Z$fC% IZƤ|muJoÒ"ˌ붫ժ4FUUYmmfX.WE*xHw% (]-2_q!7D&ȥ5/kǔT"YT*AE[./2@u횱un/-,,l SUR/J^x}ndi ZM2߿ubDq#e{}_",#LЃ Ț& ]\) 8W xqDz,L+`^̪x]Ot:=V8$z}llP}s~a 'ca 8~0tEauk۟1 (`DaeEhe͢ƻ%5ܳ;13H2 y~4  3u8^DXDl6iìw4D^U^xY/Q?n ^"t  ^so]F߽7˅,dRQ2] V|: ^"v˲plP P: cը}IP U?J8!;3S7m]o6gf+GF L2ի1K0sob}WqcٶݭHFiZ{ojؾi⍍#GtX$t%wW޽o&sM9~0DG @ R (3'nCEhx,,TUvZ.  .UV1{SY*90KiL̆OiIL^ /qbQ * *J2AEnf,)qiQ>nWz]ֹip"}/ūe:2[a7/k>46o%K,*V(Py "g2`A^z&^mcVŋ'KKKׂ^"5Ap‹Nns0=x+Y`x0d 3M76~Q[5+*~jTUU PTy[TgffZD'ۮ|r7-}1Y.~̊iI7nTD+Tm$&q%Qյ?}…ѣG=2>?ߥ^"Syu'op0#7ռOT;~n(pMQS,lV=UDUӧOo#`2-QspwMS^_}Wc⻁/  Ly%˘{\k֏g~(!": AT^Qd2[lq 58Q)S>nhwNt܏dG@0 LqȤfZ \R_fiZ( DI6o`p"TIjyy3>bKHre/qi!ʒ\*8K)^|{7Xv˅1jذjVTP PMp$@E{yy9m6r Ʉ|0dx}qoXV! 3(SUy!, ;nYWaBPAΏ^{," /^t%/^t%/0eM`j zCB@/m?۶R7%kUPIn},Pmj߮ok4] I.c;5,^>a,$ԯ^eaVŋ:N~B}\3d  EAYwfYOǞNGR?h" >oqX~QAEnNU}_TPhJT:`tA c;:]en{o~ E43JÎ1˘~=8^9^,dw^X ^$b`U2FVQkaZXXx0`A %9=YW̳绎Iِ CIuaY* jPQ *JAET|cB XDg&isKop=8cI2&̰0,c"6DO|˘<Ìw >3eQ zͥk0 T0oըwEUB, `A HY!ޖzLN0f(^ $hJ^"KeJ%T*r; LdN6~;k-I'>> I@$^mj5*H §s-FSZa>ˌm|^*X1x9j{TƄL|TU\;b01LXf=FnQ0XVh1އ00x}Smu:nݮ0@u^SAEAj,27,Ժ` ?ɋ'Eax%ke+++o}?rŊźTq`0Ph@ LG7<hbd!,3W˖%/Rt:'LWN؈*VD @ c !omrm41^xZf4 d2RA*^PZ-s dzF,Da(ڑe7ήKۖXz$/)^fܷ_}նo{B$*Xdr!t)LQ*يYYM,2f!Q}DCNxXfD|YHbUHT&7P@ S{2hf߹KAQZPQ)}H Dq]m;,J0:#P@ ӗ\e#-ޜ$zUS-[5tųjsssPUVWW}WqLܪ`%55:hf @ LegψEQvfWRR1{l/wBvi[B(zūT*R) mИ`A U# 5総l8~P( g] :qb0xЕ^,*!ο.5qc8&4aEXfQ10{5r J~< kqqoٶ1 /˲0 /e0 raD9^28~!~^_fO ~.1mQ(%`s}|8 A^0b7Qq\?>/[Redg0Sy}IvF?]E>u?gV,?7 JHKPڡEiavKg[v u[j}cMYZ@Z,ŷM.'c _s.#FP]-+~cF[{< =Nq| Ϗm> X3>ŔoΠ 8fuzeCw&ApFA&=UXB\콷,2[9YM wFl/~a>φ›w6J0X.Rb| SO=obH ke?4ga~I#Io "lʰ!0bmfq$|.-}QrBpru?>iC2VMl4sxD"???2O  ~;,ŹyeAE Y{cs$đu6 2qX}#fbb`úCOB XGy;hD2,S:D|]MJՕH@|}WξO.c2jy{a$X3x`a6V0A !`(|dnC<A8b:tP@]&Ђdo _ƁA`(ZE}k)r[ ~0WשH|-X&NL@DWf2&I-Vs1ri.䀋cwp`]63{-v\3>{yT g+o#ۥu|>l{Yb;!(]LBV;d? hB*gHAu7AɊztȓý y|Io >O~:ozon̩~~4w_}t+^E O&^KMh!hâ M,E?[x)``RjxPOWZE Kr*W7!}dN$kϢV\u"<-[в _շ7J ) Vr+NW׹v;z {JF ̙\"nY\2C"VןMl@ `Mf]~A%ŦXvQykR"Nğ;Xx]qPt?ZGz%y] 'UE(I  @bQCZu>q=aX;D<E3߫1ժ[&tR:fuq 7h#Wڊ_nx7iLokH bOj3zоLj4k+G)߶AD +W \lytuj@NBgu,tJTK]uj)kk<FIwGy-|B'(軥&1m*CWX;e0Owߐ? ]{#gm`ֈRr?y""!_^*7 T 4`b0=@<`@+ѓ܍F" HE3d7dczןNCVE4W7_IB"oAssjKii~#yȪ h_~6+{{D$%Q20[g:܁(#aP8g%(Q ~%R'S+`RWj;L6z>F=80.[r?oѦ7T]2yT=0b 38=FlWEJx.[,mq5%Vаse@l8%5=ܫd<2 C7<%FJ!NޘL =ܽV^ouEb.gsU}n>@#KMě+?"]YFF` ո1tβ"\htK'V;%fSJ5ɠS~ XW$2 ńAA%6҃EbPCNGaW?RLYU#].ZE.`׍L(~u8׮wHTw3-~|B|P L+V Qp(C˳YqWDD2jܳ VW^TR#^^?l*5oJZ Q./ŘڧDoG++[6*a ׿ ~V F=q` x J@IJDh4@%^ݨÚп+sU59=Z0u55[ [?fOf@~O[߈DѻW #K_WrWc"u^{RpSܻ{!+hr+':CWu:yL [@+-Gv~x#K0c*0  0sC+#,}'Zg9x~#{uP ~b*Q7QKӱ~;jX"z;}|b a7?b!s 441]")+f3*'ϔc+2RV/s%D.=jՖcxꎈiAY4X I$!3ۗK JR]17Æj1"(l`>$pٮxXB^!9j;=XíV:͑+ `8 f>zQH=6V2}U I~/r8w1F*X{R6o|,' 4gۂbT[Rϥ$.v7,^]C;CI9 cpRyP=0j6~g\w<&ZR25g)Xel{G`]gTuu&(bI3eI؉ /yo60,~:Pb,{ZόG?+LK?4j3ky)0l1RԼ^k6hbZQuBC*[J}sMiY)nS\̥SK^ク[RR=xFc `Q~q1GtWUE #4˺j?׏rz { .! -e ٸ6ѳqnLDgZU;3RG\gs"TVbbl+hMQŪSoZdە#yjΒ~ O}fP"qFNh3}LYW۷(zB #0d9<&w cd:&Ɣ {hD8, )8G"o`A:פ|j2{NaUڴ"0emN> \7T;[ذYyvd#|2 Ukt:'kɻo^gĿKr-yp5P\-v|AnPNLEY-ŪcQC-4e}$-.0UIM]ܙ<& x ꪰ+}) 36TCgbb@ >3b+$k zTbQFG CU7%6## h o9*Cf<QBct( c[yx;`Ϳ9 d#/HjE0"]sC턪lTrl<nf& biY~TP~a}8\ 잹Ng j{lkn([)(9ظ\g7r6W#͆ͱ&͍tLmLzPB/nn%Mڦ ^lJ6NWŢuՎi"wE2]5Хt*w0 ܘ 9P#`>?h^ZN2{*ȮfZ}2Cz.Q&'6Ҵ1Ov<gX3X"+O<}Jg^U=Rhz4jD)NŢӥB@%vcڡCŌ*^Pg5q*>\7MW8-`Y)oMy0犥{OP$' *"@{WН k d#J+D߮ʻZ%}Qac:KABb" X4Y؉?&X~/EkY5 ێX7Yy?qm]$pE "iS|K|>ip%kƷݲͯ>,Iqt қDoەJzqDbplX: ի*)3uH3фG{[VA;?Hj03:},I_$wICѼ8M˭Ģew蕓$w9Y_JPw;(-p֝dՈ[8WZHh$+7[Ӯt,H'=a3 䭏:mc>qCA`FMK.)Ƚ% rkDz8|ũdTZE}kT5Wg(̭؎f2F^ZpbOEH} %s& /Z_0bփc+1,7,_3 ϲ1Q N6R@Cx";XB>so@//w+> qŷ$vHԒʃ0+_qcacJTHF6=U1\B y1 mi|kuKkBOlZwa]W$UfY Q=n}~KGvfmzU1?kΪp$uj*i0+~LG`pC[ r7G1C} *Q,IVt֝YtUS""e.ʣY510pXYY{Hʕ72ѣVQmC6k;v4p>YS p!?8*Beץ[1?ä&kg^UnLR>#NXM蕾Cʯ 3 {?F:qgZ*6 O'^5w)_mb6F$uU9unc㫵#̶ĻJsTHS< ]3A=gB:0Tf}W^ϊ2EjIgqL{SG+`z\>yfn_{h@[6@]w/<O IXJ*bmt2祁u) IͽKT~âA zu 0lYj!o9IqDžJsSum|K1S/z ȥb"/$?!f[m+dTս^efdS7W~yj[0x :,t]М%V/x [ $Xrjc= KۈH/uD F {UE+>B$aGA ,ͺdoHP_٘ S[MQȫ*a=yPTبÍ=0tU̍ 1+SPlՄV|_ ͦr/4;85g`zZF9oM7??T )4QlRgu.?Ӗ"`WH,=, `]%$j()Kg_=[2c;j`Akﶠy8i̊|{= P_9i?Ѷ~K,^(tYeV5GVgėcVQ,(> hoP#^u1yWWeVQ`]vIz5`Odˠ-偕ݾk樑dlѬQV``r9Phc9@XbcXܒ'_mhZE#@@O2[MK%dˏ'}2,-Q`Bީ07ǀVsv qlx'ۻ6',VҖḻYBTUpKo{/rWuP;Urka_;}ڂ/1 HEnhf!ӂ*ֵ -ݚxD?M 6c6\!J  K9oH%Yl>5Ì8O\|z4Xo1 ?`waZ$:\mcdRXtYTLJ̱b +E$qh!P%0⦻B *>Iç1SK#C ONү]* > ղLg+Q*I^SF|HDۧh;9^P>z8J;`Z&&Y%#C*[X"y頔{q ۥޅ!3{ ۰t/΢`=0r{?/wo G?SzI-#;I[`;b#YmfK@g wٯMŻ6m/3 ]יǣvs-E P{BjF(7 j(&,GXzJ\b # 0b[f)##.!!b@Rps&*:wa]S rEt zn(-l*͌B:Y`s#h|0c:v85- t&{ [-ҶTӼA$|wTѝ%҆Pq;yzlƢn'P\%Ao*|I=;~G¶5^Thg&FVQc}Ոx!} g\A$ۣyW@;<#&D9 4Ej|qUT'vFT_tq^o~c[ .AJ!M%yTBp]k^4)+=`^R[ OM +'{00ӎ:F)C VλF3П/vCS蟐zDg ??JU[)QXD]Yv0jVƸƓ[Ȫ{WJw?½ҧ +]|DQ` vk sj/r'=YfB: .W5E2:scy$Ѕۣ~h Pa .=iύVsǠQOY/?|HWYXA !$vAY{ܠ]IqSxѻDBó~WYJ1-lr TMҗE%]jo/u.e8,ɪ6]K//0wœǙrظ刅1mYq0i5,D:Vń(ldw+^SwrTzj0tk&|cu\q̥\K`JIDԁc+%ΰ`XA>dHx%%;z&ﶎ*dJP}=a Ě"d /5P)!A@mhD$(Qkf}50wÝ L0Tmtյ{0(e;>I*];1&qlzb7[ Dc2i>Y+`ú0w&SEkG^TNYyBb:OxE1*7@9 C v?C!&/;7/H@ ;nG=y~%+ x© \PlNU(3[gغOVyR5cF{ר [0- "Y_8V9 FXDFx*Ï^~gM/|4As;w~q2Xofdw ɿ~Uqz,v,0:Rs'Za^dJIZU\ f ykv,TZx1;)rwKv#BQfa,.I#׃.Nn|-M-oQQsod'0cPK Z ,{U˒qxygf ʕ[ÕDtܷk` 9եs܆a"(RIYTgG5܈ .G&nTuTs 3>߶hWdwBQDX 0畭 S]s,#YQwFK/b,n`} ZQ=5t1%f3}}oueh_qEū^Kh@[52\ƥؒL@ $)>BZdTkR-/ U?k31 ReV r:WgM >{#޳Ӵ.wŐnS}_b?4lDrʻ/P/Ռ)o]h^5XhTFbs Q+jYs.ʀ6M}20[RvTz=HRqtAYvqC: B;u0ÚRacuKe{X 8>\ABk_ĒHv(y ~(݊ -ů3p-Ӝ6'7E^PK'@W`EB8t& \e,hDnk%cOU$5 .U%¿Nx XlRTbUE坌 oSg_ 5D FvG rKrMKn'W|y5MY*%"J ) X-ap4e L5DMJWpSaFe q.4*Z*I(laŀ4F<1kKwf)VJCpBb$DuN8I@YlzgmXݮVP->ǽ "b, ȩ~VEWW%:P&?^bZEL6tBS|V&'  -./-.`_e }"x ę [$}ݡjOٵ:5 (Ɣ} NDRAm_}oK3=3Du%VPn8,ƷWMTLtAs|e#1twqL~3 V)iIY}9b]q*7V#\}w \SVo}w!.6pYPSLP䊅iN*{k`Qj]E(9Cvs/K0&r@QJa_ૂ\8UQ08mB%X% ffTD+q2Ruap 5e%+^Gt+]l"e*/7ŭ0 Վ hRE2 \gf1VC]C,neoMUM[6!G7w>XxZ 5e&.\C UTUpg~RjfA+SFS++Mxm+w[KqRtP$TмMn ҫOd#Y0&Č^M+qV/u9R$^([kF:+A!Ѥbg"X%^UF32˕GxXUB:fE hmZ 1w!ÂQfGC4K5BWRlθĹ+}x4nv1jMVfd YC}6gxdYh]ut76m_Ps^`;N"yY Po5KtGPͿ^ bbX\5~Ea5u&<b ^Ԫ;I ~v>O4loik/aV mb,`b&Iw A=$ 3|DfS<-?\ E؆ 5Z}XKC⒲+ѡSNt ,I3gp%` RW T>[;!qG3]6UJ>O>iS"ϋdwaPƢ$`ժ+5zlNHQEdN ̬%z_ `xcѵ ˻cbf|?KIy'&ܐ DUB&8bi,̮]]z!c G.@7<])xPJcB- PD /DEsQ< $;L$#T#MMK6X%L=L {#l6lcڑLZ2"D {Kp+04F3"4Ͻ癓xPſ1]wOZ c!n1kmV>]*0'"5m*a~fMI,mY(JRd ~hqՀgxXQeq~kT~[z8"vH8XZfO2Xuu5:ǪTܰ%?KS%$O@>v܀FT%ޕaeFؐiܝRʌҚ^uIkN5gtK2ŭh-lM(q(J,vezvQ .,~WWlǬ#4|jEiice# =a&v\mԋMHoz#j_M1TEC[gEL PL< "mcݥtCRd^`VJn[kȬ v.F:dCTߨ^#-4_12t a9z ^B`F +Al5 CR=z"@5ZDv SE[Y}nbAP&ڎ#@JWa~g}}|٨-̔[S2yIdϗ1&:V0/=8UpF9YJUDL>gC_PYQ?_ս2qO`c_-^sNJMf0\v*U,mM6 ˼.#<:fx-> ӯF;KGBlX½)߻a O )9uo z*$XB>GSJga̠Y_-X$Zv PCZpgx"׺el uV3d}4DÔ+$hE~Z8Nw!+[^53^pՉBu:.,|,}IAwi̵ToU;ֈ>KJ]^i%eF6`cRpFI:d+jF1d=Y\ܝ&ӿݗ J"t4௢8rU?+E݀#1FTڽl4 &+fKɔ+VT#GõŰʘ˃ ?^ey?^N:Ҋ3A_ Oګ"D_' #/yqfY  r `q>a8vvO:zjlN{ u%sJZΚ.JQ^ ;XDH<"X]EIBCH.F!N|s6\նve5ϣ)wY4{Cp]fx:z9H ^tgJ R3V/PɆ,_ss0שjR yVr6J6YSWe#seM\>E k(Pe<[ TiURb - *{,8D|阀PGUI5}t0WkI3O-旂jG, V ,3 g/_&7dtvf)b8H%R+^O])Ohq!{X tBZ+J+n@yYXٕ}܅dՁrb}̆`9{A\:([UGYGثEduJe|g"brUMHwyK*HюjRv7Ŷcq=7RQoe7rk'%#蕃KRxEuwg%qBsഖʱLBv7^YmL\BP⛒tjn<4~ rߛK ltlu~mrXhJdz%ocN9-V6k YS"`}01ē õE^F'Z.YNU|fz/c6ߵv#!1nuij:m+,;YXc{ʀD%iyyv<ɥ%hJIʧ\P%rR\aL]bY AغYsra,x0{}pG\ 4waBk.shEΪ#*X\K,l:fECH &LB> pT^%ͧL-Ԧo dmϸ=U?,Y}p1.j9'zEIm1[WɟH#h(Wo{P R;)4pZX<tݠ"N'xMwXJ":0܊[(&TACtW.ޏf`,sU`qpN\4 BH?V%e642Q3nXH0[%5 `Ms8ynx;"MHwW ̓gL_2NC<~K0%=K`? J$.MV dQl^! y86.ƫ׿}e)<Odp=5LCu1ʷ/V\u}o6ڎtu> 0y$ hޑ0դHGYZV3*Anu$Rʎѻd MJU"6ݽgJOYP(>ze1d[w6;BWnk!Шn-4Bw@Vϱ䞉;SurDϚ~̇XH$df?$Uf"LtdoL|>Ej;ֆ^~gUЇi)%%[,W?$ b0Vi<,r#0'hSgEJuA ](_HJz d*pQ|.G B8;'69!Vh mGFͱ=.]IY N$dUSɖ6;}.*4O\k\Z z#{RX9qN0(Vz>[aѠⰂggLHBZdT>HRֽ )Y<9f>EhO Q^ D]QUSR26`@}M2 )0t n׀MdI shn,< c!Rf\BL4'x7Yag0k)z-GI$f^iO{89(-SNPf^IER+?vP!q* f8 T+.1 Q,b U4[hnV/5ls!񰭸l4}N\(gqMbRl&3Մn%ȷ* n scUߌI|[ZslZ*+HV TQS2>'--NIڼg,@LHdڈ1#wi4N7 եgsa'߽Ah?*/Au[lVx;;]vޓmY$%mg5gB4HLT[ 2y Xš+_DRĔi%ГU2r(ZA ٬ 0iDF&TXOʘܬN4 2(N\rP"NPuN-j_eڔ[9~N8,%K߅7G>+>RpF ?5o>3n$CrKEٍj3X7cJv9*fW5Dt-0-D`bֵE b 㵟{5!rJG2قS' RCŊc!XVt j-iQPHdCytC!? /o B薌}K^4=2D\GUj:ƍb.<|o*,*Fmn~oQ|ck,At$h[bX3֮~'sf7Nu*b;<0$B5jtAYm[oC'-QUԣ$>huVuj瀆kGh;=S&2z"8g͸BWgL-\PY6Ԛ$uzA{Kn8U i]~9QXtd̮LTT,jYWEԃwaXɸS`jsVa=ѬqƟ 3&!+k:`@B=hmJSĭh-9_Ta_XdRr_U7 Pg²,plFXGHC6Dlu0JAі.)W8`,$[,}$&7P_wk*W4Nq!}S#m6dj2dPFtX)j+Sc1Wu8roI8ӳ7{*uĠ5 EOK"i}z}>>G )$" Xd.T!?4d7xn a] 9FE)V>7;Al`fjNϼMUT ,ѣ, ~gy:~J7Yt 'X?$vDqkPH$Z{@)P{Ʊ,o=,#wEΜGW 0+7L-NqY:tTqA=jwPj&ptq7(͍֠vU J}C+ F)m,c6]ޥ;.)e+\! +Qkzc͸IjU:zؕ. 8&*hɨ<7@Zb5 ˕JLrqg~k֪d^r2I.aKot!t !W2jjF`C Y\c,.Eٿ[\w& J_'Q 9GRosJ16pMOܣ3yݎcRW- BЉ`Yy (GuqY JTJ $yew;pŧHg|تZIm΁/.lJa:ih De2a&}- = B*#KE,T|W>V1ʻʧoD 芢Ab2Pwu\Wꮟ3NǮPdU5xinJO3"i7fԡ"H2W,:xcy%{Gmm^Ґld,l\,G.%e %dg$@ ƌMz`^VTSyNDlf&"#u׋ob5Rece|.$U>+_f=# chEizVoV/ym=fVҶx6Xaؐ {W׌ '֢T>.pvI@(  &g5D,21uc 4%x騔zL!GF i泘chҸ7T:7k).Wr{4΢ bXTUbEX/s DX6Ԧ$>2}N"pw0'i`+LպC.a]Y%4Oq{G?z-UǗYYȦGq$uX |Qra1˄…'1FQgFwR2!tP;wIXv=\6q:xaJc nSZSVvxl.JLCOiswIT# .fǽia9>s苫EA`(=H╭#cDR 7+F/4jժ'К l/ZH/BW 8OAt3ʇ$A, 7 fUXdb- xvD/P wǧlDťu5w 񦗽;X/QH"BT ZJ *ihMt| P_]>Tk{L;DiM|WGroZ,c`P* >;fJ!ˆ}>k0< ޘʁ?E~( >S,Wy:zoɫsX*Cc[9搬nwH}ƦesA\^aD(gʌ=ķmdg<3Qqs+vb;H0+ELb0ȿ  o5 1ߢj*dղFu ɵ|׼:-o$y>J.$!bgDE;YCdz]Lj&gkLP`sxˁH£6qv,^gT+x<+x}6)+v%`*BHcu^KBl9r^9ĝd/W2-dOeI`UNkWw}=;JGemi+MJhxʧCcC|-#G.A1- +Еɤ_< URw8oXdU'" 藟[׌QsZ lafe! 9֡F7<;RŽ"y0Y~5|$.d7ZeBU%IhI봇fJ=AR@Inlj_U@=}  ꎩ{5g6Ueʽ;:&QȚ;q+ kRDfb6m/L< LmdݝHAF{ qJCykҼ HщhN"c [p9Fj4\:.#meh*¥L EB~ifuŶ8u@EoK=2!_ <`Lt8 :2|kS%TۆNZS[4DkpC?Y/ 2-pcx,un v:O"eItm,ڧɸK\}ߓ%HO(>Q@fU֗:'YùA|}"x_v0'JHKB:oK gm+SpƏa0kOZI`ɕnr&w7>@0Ãf+Tiԯ B` E ZkALeևL7]ZN7J7_€.&bU>܂Y]RU䞓f> 2u SY4>TQ.j5$ٮ=="oYPjsCؙH Jm|Uݟ.JWtOI`c%5 WagUU5aN WEZdBghʦD˜SQk;h׭2 Y'd;j^jtW1 Nr80ƨ 29I}%N/d@tz^ k2ᶠ>mK38XI), R z$>ӟ84c7. RְS-Sw Ǐ*/-qm'8%z-U8Ch器; cuRtDf7WC'ܒN˷OŪ%.(4=SSk2r6} 1+qK zE*]z$үAmbx3C VADJAM'fzȭ+=5lcpOFavcsXq*J?f.BC]YAK?^3_Rl]:iMёּ VM R):w9UNd>u闗QN#U,&v^Uʽ4SwݐBn7\;`,>`ҹrdGt&S[Å\Yj۫W6᎕L9%znZߊ_jk-TJ`:LT` 9B<`Ǻw x3TM6++ Y"(7Y>W/`uǗˆ0՛[HV{{cEy+uN!X14`N_A'knLnѫ>5s*Hth fVe̤`H'Š-|y3W-`:) GחkV?6~APMPj<$I CrvlFEr\k;E Dm`+~dY Fpazcupi)4M!0k"ΠBW#}|P⑝2^8[c7i-dCShE!MmDAEmGA%ɥ"D .OU㨩%R^3%Ұ-3[/?YV4]~zJiT%PG~9F" -BϬO mnf Q,nbܥ.Eb ԙ l$1vط!p=o,C/vr[&X 9fUΤ_613ޅ wv3ZnM~OPws6҆E# )r$MjTcvXcyG]-y 2jXغɽ2@}ZUh{''ݘA.1djgl8DXϩȈ&E6~KeO4P=@L 3_r,v5NEsF;9C`\X0fj!>ZČ1e =- J&pM<}+@we0BS\ȮP]\{pKj8f_zeUj&} !]hhY 7Vf2l%hъ |*|d@ ꅶNk[\OJ:BBj&ΉW9YE(73HVOo6Be (rqWVfN'ȰD3SC VC >+acFF$#4L*TN-vRzB ]<d[! w>۵ bls*9(f^/ )mĬ@WT k/tЎ(BLZV|ȟPBaۍUPX+.22<St#Ԣ.7qIXorV||J˜1Cִr4U*ڴ#Ż ʐ*csq1#|꼅F,F V6ȫp{AȮ;"+Q7zBB-~ khfz?Dep8,c Ɩ٢& Y`Fa-a0auff|&? (կ:d'' ;sj.~$Zߖ 'WJ`MīT]IL6)ϴ :d.ylb@8-?6NH-UͶ.Ůk,3W8AA{ `;^/y6x##WDoP|&;TTp }YO҄T{.Kc_S9֜;*(J ug'Y; {`_Z#kl (^mQVB=a%8g#I!VB)/ qQNojReϧb}I1)rF&YT@Y۪gw\(TŅMX ʟ_v>#C68ݵ0`Xj"%q"i{1riם=Q mo2dȆjD$jpFWQ!}s;֢-X6P5'7{(J?C?Y @ g^b%ԠXs8Q,IJ_@m %D_U igBW fUuG$2Sh7tlwZϻ_C%Z`OƤV=嵻֫ 2<,wGO (}YO|L:sY͞,e,Ps|U%J:t =iy֫_[L^/ƇV"Re5pwOel\Z=K8G`,fZhr@!R&}\}*]z`D{cr 2j#~ON5L H(zH_@ :<"U=.V%Z07 (Xx\R+104[  ,i6xWtaT;Ak2B$20,b[UsLuvʁ~P}'Յ][L FK=W |v[c52)sqa UmVw[[IW{k>ȧu$s1g@7.N &{2_;I싋-[e@~iEkf[w[?@=~(whN4㐿 y2jEܟ[g/m';%!iv=#/CT2GP0~܉9[Cbz)Yn6kgGV) >ٔTT:K\C"0Vlδ../Wq+rYt<˾BK5ʺ5EɼC!~4__O! R)Bb ,g~=oKdWH/cTŠj2`2 pAJ^$֙ { xa2ZmBWfǥ.,7TESzjȑ52j$$J &8ŷ@#Ok Sς?4bXmlز FS!T!>R-U"n7SJ4,/ OߎL EwX%8e:+A5՜n}$aE@ay.H4 `ѰubJQ'f?.GS4ڤ\si xUhUqO11z Mu_9Ai3~C@$}Dּ}x[ٸk=lO7Wp.gKE۳M#rP 4?3#HllaB0g *z'K*ͮrs=gN|=[gxzTV!),βտb @W].*h6VRKI8%6 P='?hn߈M"̡e|:X?,0Gf-{Z_?de#GL"qKP~YƊcXI 6 0jAքtے-^D%d;zU705cQ3[޳H.ani!#MpMZvBVABW詿@MeKȯluOOb"YӾ5Օ+ ϲZX wK2mE\.ey)W 21/^R#^bupA[\팬ڇ0П)q/ fYND.\ BVŀ<GقtY|+&%P;MnQO"}k4ʽ OWp"TL-L\ сH\{Ĝj~1wÎ2f@F21(8Ak$|#HմV˩Hgy=Ovi $ylYREX=Vl# H=$IM`UbTYW_]o3hI?^eFl0$%u Qg7ށ;^=Ҋ]52/pRTo5c9Mā2lGo1Lkd}2]PoYAW]p/܋_0ު0Y٣)>nƊȲZA?Y]i?|@i$!Y̓T rW2cyNx2@ueU"892Biəd #hD"G>O~-IKdRo"'URX:f;V[; H*hk"kݕgI ICT\+&/CjYc8kLAe<aՄ6gAKT,X |0B6d,cd4{DaƓ@RǦ  s=G9s;us[062[ 0}A07DD| pKT,Q,b`+YV LMj U+k@Lv&Ϩ 5|dFUDտ*T o 5`iL F=w98(x@?6Y]X.TL'h1BCWLVB LX,wAn* ~)5"VsgXMXꍰ/_'o#rtɊh,k<񲯯g5LmӐY\0Ij6.?{xj{hrIFCoew-bI APV}3Jqu'A`0 G`4"g!թX='n*,/ _Ί*uVQL[\JjaP|Vefؠ|kC0c*`ʥG _{utbVo`%xilN]ךv472+l\v=0!HTjA&b6;|¹B΅I8m<%-ϻzS~~+; ھu2 Dy{0c Ͻi ct8'p_r>L1?ܛ*UQE jKŝCwM`3[+ 3^I fP/sCT iV6X #ۣR7 ylA _Yq騗T$(c=fUᕏ{ "Fk^çڋ^Vv V39BЙT':wa U gkoY}VdKֽy{:8x}AolK^@L^G (f{r9jǟH,"z~;/E-W^ ]n.,ABOqMcuNdE'hB#BƤ"RVS J=r@PVEIk.rAG@eo}Uo5}cCwO 1ǺziazgiV]n2X7]67>C]h7OȇƜ#Y[yΩVSsc2ݑdg݆/A=< ͜#FulM/VDX=DLܮ O?'4Npv4p+$G0ķQݿ(8'Ekeܛ:9[ޝŽAQri#nk4XV 1fR 9J*S$;{>a@dM0%X׉;jJ//\)kyiq}EzI)c@-P "Sl?lfwo7HQ!w= g|GA^W騼XDg9PMsdYw SpGgrx3(p4U=fᴣ 7? &av, A)2ﳷU+ԣiU8er@VS-,(;sq"R]g]'%{6VlȤ'jSK[Pޢq@{AS b$x@q sX"vNn lҖ n ߶ߙmA8$9M*s9RtE;q "a=g䛾r&9Y7dZ-aX&^ 3֒};|b˞>Egɸ5]E/W^JG[,jQbr3yQBD񺙙Ɣ 'yg?I|P%02ho#=Pjg&ޅ Q&=\;⋖\@DH_~3E?//lїzX=dIF(^Q^AP)Ztz/RDJ|{Z㧆<'f, Z|X_s1۠za(aG7wwG. w)˲|off i\m b۽AyQK +.dSѵr':}+~FB1x2-˹xf`{. 'HVOI*`AOZ|WQ)cr{!xrYkwks@ 0"ͩu<׳#o/V q_ ssv+~.IG:c{y,j KNeK9)bCkzƐsGBXzp~73\9zM)^(6^إŲƖLV"[ҟZ.ʹj%`Yb獄8v%u$kjb&0^wfJz/lc2Iڄ(u()[Le&PId9I-131wcUMWS XUTgA/aXb#tD?],N跑ņM"j> ?b4*oq}IR^R۳ݘY"|y] ˢ&df\)fP97tκ'>f|cq(, $dޱ6{cj e5#gݴW3 806c";m|DG 'wYH|% 66W zl@90~ |8THstaEQxU{JwF`mwz"zn^c_j;-Ã^_ PnB%iE 5QDcX OU,LXW++2'CD}&nQsX[,r;£Q:-R;'z?v5`OX`:Óxl&s(Q/£"r["%5Mϝ=k,0XWE>FI΁ˍk^W0묹y?:1[e㰒YOcKDPlc!QG*jc kX;8`c~f%n쪆zP.}>B? (@XFB.\g Q:.YFr,$KwS:]x`Qy6bA7fR׎?y c񮂋{7˗r ~jXΘy/GqaV"2gC/;BW "^==% z\p `S"=NG+.yQ)&ʳC0DFIOy7Bi˭R$s<Sx4\![ZG?:jNJW#Vμ"to(aq!n0{ym4QXq5tcLx%Pq)J%_Cxͼ`Y6o _t4 57\(bYޯ(T3QXWŊsa 3IṂ^ /t&r?e]ā_&.ٓ? Fu*VM[^O0¦:).;oMc[63 Y;5 a߶;Q/Uuh f01qȩh ;BxjLx/v{$TP0Л5CW#Su&*˟zGQ\i*OG[%Q..jlY{+RSMpc^ h6d4c Ib {sbxd7pOxEiXM3m1;@aXMaw7}vn_"I+OEޥUKTII=͑,:!*&ޑU*j,zy vW:8?8U|:$<ՉÏ $"j[vVrsMjc%pd&`#SNGt+Pܒ  F| ,붣.xAc|g x%w:3جz{`{ֹݻS'tpR!5Ro*֯p&d@@p kA82[@)wɒ4QkҔI{ V:3.(iE 1zDLYTݾ )hV|mg,Q$j|3HVڟ7 `ZU<2Pl拆y)+6'LMM7ln_GsaqyZ o:Jyl6콱^]*|$rT>/+s@ fx h%1|ĕ{44ŏ .BHZ;|^qRHmST  W?-ËԸp;Qem -JpZu9|k5iR1S9? W6%hND!vQѾu'FIrX$ˈx`& EC]+"8l$Ѫ87o+#>[.:3ErCUm#/v5Ae]kd4|+e&Gw;~V}e=aSSq^Q1\9Ywk^,CZ S PG9[vVak^Ձ- ^OW 2)NDi`K^6-`H;zd<.Ns7۞# _%< HyxvUDEl@gGkE.}oO#WTnJu!J3sGOň:lvKN Z2xEuNWx*ԭEKy3U:ҭaDs̈́ b3t, t='yM,: j9;O|Djs%F0xiC$@ }I}Ji=ZS(9aۼkE`)Z%:s5@qoeXðDtWb*o{ͤzU%ƂjZ !QD^Dž(h6Q`=˶5F~"$U% bMpXNw񎣔c@h GઓxP3dfuq &A[ "ΥzH0ORgW;s9/  )/V,_u]:0Z [!){1b qfII7I[= !%m<c`u%,S mwP^0!_9_HVOkgCި.-JU t7<j4Hɹ=$t[&1;%A@sVJ=r8' ZbS U%hH<(,  Ƽ {,)^qeF2sB(ˑ4jP:J}$$E5^Ѝ]Mar̄ΙV(kSr0Bލ.R 3_|#2NX@:@ Ta{G+AȰ) s(6LZ0awRdAZ<L.ԧv,׵z7N }Mq_6/ZWjT&q]JrBQlTt'p:OULJ(d4~)˺{D=2l0HLVWPvl KBI&bx%R/#nX +]^$()sL-Er؅yjYgAP@ "Nul%tp ͞X6B>n 2u,*ŰޢC87c~\J -ݡtg!nAV}֝Dh7X&)*v5{*Ӑwyr׿L.xZ_N~YF^'EbIa%.Uc|H` |LDȄ5z59{vMiD򒁶Lj=Ǚf OkK:/w誰 )^9Е?l-zbU$+ ǜ^\Mjb$D0Z?@LK FJ[BOF7P5h5{l\ٍ=1U8ݞyW q!KT,ԝL; E +G =W]|0-cbuv=5\Bs1+"TCU b7HA7E`NBŲ״ЙGai|B*B oG`+JO4V\HʀN]Ro+Db\KZmٽ6=LRäJ"Tˋ{ٔt +a/# m7^)TlM~#?O4:"=9eyT #.!KI2W?!h*|c9`tyte6B8eD-~Kyj!JC$ cy;se=xER#V]qRH *%M+k'ኈ),a8ȇvj9[MR_Mp"*,5($Żk(iQ{ APlѫ Ԟ.c#*MXܖT f M]VXMlD9,9Љ1nLqˇ%( g`;D귰`+L9Bq2/=N]z ogm[ϫd47&ڏѹ]tp'R+%z@ n+>EU8~/fw70WZƘ z>FldjHOS,Xӯx<ωֈ]׽ Xj& '&%n lTC~l,&cQJ )"ğ}ط[o_+ư^J$9gT@(k ԅ<ׇ:eڝa2QWA,_dEaw?F] nb0a_us#^-/W֟;~.ZDu|W 鐐? uw+z=ݞ?FR*% Z$ %cԂ&J5F!魑jq"Eջ1ZH{.Ua2uCR߾ݙv{qK$Cr\rͯ)' Dv?CWZΕN]_V,sOv+, +/Wxs}t5# $}uL aЀ=w(.@Xj͛Y,xk"?4[ӛCܺt->BWǾy|!u1"Fmj&+45DB1 =z co0,qvtY &W"mP'Z<(V*=K Z4':*ĘrrL&,f| ~(C@ZN+&BMW4IUkAY惑ݾ Hha=7w椭:{v%hH ]P|4F_mrg}[[O4-51'> (F3Uё 6{hH ~ k@Egf靃#5qB 葢yȽ*=/Jxr/ejѽIɟoq!HRS8^؟g+ ݒ@6xl=n&D{+°(v8SD-wX ɢī1AgaL܇ $($sh9Eb<\J^vd{v  n` EuB Mɍ[Ӻ~|_6UpS@ʕ*RFhS N0sI縗ovjqyb]D*X x a16N8Y_v1cP]C=wHP oCexJ$9q+ l,$ y)[Ѯl^-+WGJ{{{ ɢGtLL }du+| R+rlV7 i /_A).eYgW loq?wlKhitTu֠M!dªGq.O iMrHRxʆc!GvԳ0Q::pGH+4êܩZ}[W}+ʘIfkiP=먻JdE09 ;}z)I38yvv6*nW#X}7aef;㢔24[Uϓ,ƿx Hww(=~Dk/%Y]"͝Y,,^F {;'z-VN},^Ts ^AL_W>q5/duLdM(d ( SYJ=#d-^0]vk/ neF~=`UIŠUS׆&w\*jT$j.]UVe')mԯ I"W$K[Яuzц%RB'=kJMS|n5?Y]cOS1dWݨzB@CMlm+m^vfEo&{rFzSIH=v5b{S $.U^_扡 bp-E^ݎ z>&jۇ$+|"9\Tl 6\j5!YpjATHoU~ ڀl&k 1>SEλ`s;:=ewL5kaҷ̪XօQG@Ce} e\uW$!t (I -UmQk_{_tN9U4hA6^B1:F;@E";-OR,eŁO/&jQ:-荐jWJÏ rs@Hsʴ"'΃RkD7m EU6y"[9(y'cJ$]M/S3Vײ%_TE!@,a-R3RŲ=%dMo*BOՠ!KKdp c NDI|wtU֋[MR*u뫄Zu˳B9Q貳x` + GRh5EǮ 2Ēo%t#q!8CKI>Glg(H"Mhe]!^KbhL$IjKi9L{aX:blETEGp VS_0VD(i1Ô%r#ӳH.5+  3RHZU]8XpD @$oE27X+l4f&gQHj1fxm( w-UnMr>rKfO˪>-M)z/ibQ„+3ot_&0|uY2,QߑP~aOR}E] `E ђ,-2y>a=H8Z\}_ 'i_6- WN~rV$uhp9(䀕E X}3ȓu5GYq~wT;l#gӆ8fïS Ry[EǿV]/" $e1\!—W-R݂1Bvx}ѢI%.{y1-rPj>  6_3|#o0;zXAog Iʏğz`$3G ;D*@ӽS11bوY\1 xXpAp-z΅p~(8?dE!.ʡ&ɍ<&cLT^!;13+g ɻ.*1HHܻ`W-ŃS,VyC9yaVbX| 3 fVQyLz[JvU}?SfE睢+0g;_aXŪ$c5.1r0]47]%%sz& ^QqGx{?S\E ݬvQwR0e+O>%vW9- 'Pz4Fүrՠ+ԒHj OEoaI)% `pz2, @Et5^{qfO6Ϛa j6r DêxwѬ>9I "pLft_s,\ɢu bt{,VEP 5&a2. O:;uaEqLZ")G9G"=As.nqQ8I:`II q!@^|i!0E Ƣ k|a=Ki9uf5U#&69fq,EhZU-",b| %px[zEB57k(e@+括寧Q?zЌgy՝Pr} aSgjpS *.LÀѰ)[pƣ,B(jk.<)+Z4TsS8Grl<+>@_\jxefixÃJ)E;Bor̘ pdᔄuFy_hz6h0rsU]kOa%9;R1e60]&-$$P y(길`LU:i$$,jxu_lD۪s\~&`zX}csL ˅ w&6G uvOwq\z,Tq?JÒd?4eotj܂R:dbv*7[k#"|!Z|d/ RVg:_AgM߾ya/Rgx$! XjUjn7\U`MTPBÃКLid&H4: "Ŵ,Z?z/hyfH#bMO+ElŸѦGT.SڝR;kްp0oU!-ٹV="^%=ϧ'nTlY#j.b*ZIms+ßoJ_ ՞N<,$2{Bǽ~uW\s#|;-BS|KK{CWBT#m!P1S18WgV$0RbSU :mY-KMyc=p(*`X "55xjNp+?[ԥrجBw {3bt=2:q0KWђޘ [̻TӫJi:ɿݍ ^q &9(٢_9?P9Ѹ+e,f3CV0j7×@c ))eh}QjhG`.l/N~\ZaYD`g8C7 J- K.$k6`QMO\V6ğ(*+"FDDk7J_!av.B%.`(Ջcc.afNco};˜JN,*l5VgE!" S`5?kU~f']ܞ|;#h;?iGņ\JV׮sLscgRيᜮ{ ]B LV5KE )@wM wBQ_A+b+}WQ5;ߊuO&E20z2Ղ^5MT*,e wXnZm1)9\ ~UQ2gfTE8izN^SK7+\JbrW7xXXEcTnl" Xc70khg kq1jA;u}3l{5[T,LLCҿN#jq紿hhH{(p}Tf*2kмt>;1"~t/+Aw+Ji#-Gnq8?՜Х#i~@+ ,j I4#{o_P*LWǕ<Kgk 2%3C,d3$*ekbˢҥޙm09Ŕ֝).Wan@| RMJIW-"LV;+$J|{K%jJHop3neX>tz=p-Ca`w!FCׯh Bb>RŊf{#،:qPb^NŞy}ox^Nf>$gr}$O % >fQt.鮩Q FؓT+CY}\KmMVrw_iV^}`f pFʤx.(_ ]Տ1#&}+RUE1J Ń@s:rR]{R7k(sf3ryXRa>_ffw0Z:)gwCMY; 0P QhQ++#L#[UYfVh Hg){ߖOѯ[J4O+x*! GH I+C}3;0Tnv+u?9 O½F{ej v~NKgQ"F#`kuB2-Xw%./?#z^haJ3ke$3͝Ůxl3D#|SN W4ҺyϦ.)lTdA$X=rRVN{FM-NR\exՐ2E'rg['L6 Lq"ݳ.LM}Y%`Q@:U&`Vi+}HuNNeG2"nZԣ@'8ˁɷY}SP8eOr@zw{c:] O*橘Yy2Ahӎ-ck.NɷkG_CWv3<t6f.p!!Ԍq.ѮWp߳SEN0#eXMnږi=AfgS6~r)f*BvoG6`v[©iZq}bǷ1#y.*\YOn}8gٕSg+iR5WgԨvp1IsYRk$ D??keܨ>ewT*dk~"|N[9EvS&Z5"c7A8 OW8Q=|Cq\?0`q&㯥΁ 8`=5'^@pi]F=Ϥ0.ڏO2 $ X*K-ȹ׳? C Eu, XkK¸&.|h`BN3d@&sQTٖYi>Lqc<Ē42uLJQ$iMǀG \ocoݠ`>=(_pa*җlʇwx`/P\d1$Zk{ 3i3|SmvbVq^z_R< Ls"#ۈɬ}+|in!1Ͳ=?/CUWPa,(AA+&w7/A,k] ֩☫B{Xو2@9i0aL**-Lt[B"]RV͈OAbUܽφ[ obOd:! AwM mGc0=<Jnq;ǯ Q.?oEzcLTĨUQRZ:-c֜{Tsˠoy%gַ<~R-p*u6GTW) 3T^1׈ƫ$:-迴,}CG{!Nm;hH+ AuRZz fKqbo(0BuxzB' *lg&;#VOۣ[82F?'U]Lǫ!١W{\MX&D)27%'jr䑚@E]Xd?/۠/WNg3-g:Z{lZ]~Hը|ccYNUUGaXNALr[x0.Ht{2̿ 0MWXiDD^ &Ƥ兌DZL\0* '\H5L(aAw]j.&OҠIw_ Դq] #^PH\*҄ <xzX1afrʘ.m@Wdu]볗Dl"+G)lVȒZژ'~_"Ir+;sw)-ʌgԛֻؕQw0o?G|fqc-esfP[4]x0hX9V$uDa&{92xNg':m+xƌ K"('*N>xFyGJ SXs+mRF΋-rX ,HN 8%mk{-)ݒqQE[׹6%`}摡§I b(MЙqtJ^5ģ"~ZvuSW j[tX;~ IMİl1#C[=UnxuJ}<\x@:C*VQ:-*`-B>]40"ɰ8tjwl5uA<*v+&ӦUF=VٗEЕ+j==pNM W3{)[kz;RC;y`][z.)u"YbPPHA 6C"X>9fg4W(Z?R?Ӆ܄cŨ0Ès]Gx3 -Rӂܬ9BD$VҴ|»XM(e+D$z2/kws"iR*qf"Mz/?C-O.P'n3r;T~*YJ9m{M3п s4Ã^Nqze؃_j0/Ķ[y  (b֔Ilr_jz?+hY,]J[yf.s\lIn/SAXOR \:V}yK֯Nw<Їr&8-r xO9,'5fݻ(O[> GFIkpC*cɻsSQu8^Bf}􃅡@R/%Eҍ;Jγ&YlV&3Ա&`\$ZBLpP3fapWwW.ã%?,UvMsLO&( r÷_X(Fm&79B{ȋHt3V/'*W*ͨ'>bH:NCȸ-ƭ3YB U,vPg^ yz6A"1eA¢`pW"b-m'9X@2R͊L M~.&ˑVv|(!)`hU4twKbZ,̅<=F9`"]NFQ&uS#c/T($rkN2@"({ves;̝%E;9L)v0h`?@sDxp%xW۪Кב[@6aOZYf5GM"V%R,H!0c:3H 6ip|K/#zE΃䛺R$L }R@p+y:ݲ3j^Isfp( X-F: "uxWji18a;!:S$i9<;qm~lH]nu0 baτx~^rߑ0lzݑ[:pXJoX(iD?=C|ZY-swٟ?Lî궛Nt ,Ь+w+4y(Lchj[3@n7WtOI2HbGn@}ƌB k>\rZ^o%[!{$Oii#9QHIVsbLS*twD[ba/!뱗WT.liF5_aLzir EQH}l1bX=U(82؛.os{ d3 \$Y" 5z^IgWH~+Wٞuh#5^|:<\@j jN΃߸Ha?7 su`jԋ`Dl֖*_yuB0;O^<$1M= 6]Y1,g!QDkQ%-*{-yODF+@'jݸ鼤xj֯LW/H(Q?K骇2D2I#a* x ϕOe[pC )pEEQUV$`xilbĭ*qy﫴W&v wY$z1A[I-0jC$6"y˘P0E"@Ӗ[Ȋr`n_9P3LDϚ{8w~vÅDk[ ˦(wv+gR](G\,3M1 (EvO 0} |S!D^E5sOy0TPx_A_R37n'y(US{wZ:QBBOȨl6::S 'skf{33}bJJINW9'󥪎(垵8c6[Z,Ƀ_nl.EU^ۻpI? ʒ$@4 j`6;4VNF ~tCR06)`lo{ǽB\I0e4@iKI]F>/l'#7_DzA+5Qt'[mt$VRjބ8 Ot=,Ã1vtt'K!<,osИ[]ZN^1)_1O+?zup!7TPѝ2Q`xr6=-CnÐgWYpIJE1Lhm {)۵25h<a`%q}YQ1Wq=t3n3,Q ZGwc\=SG^X9ʤi }ʤ&8UƝuחbvlpOW*1UݽT.3[njI3CEEF\9jhE7XIK^Tny(5zWY:g+Qz'UO#@"AtWY8q[X3'WG@ NПBxgn_XLqؠWS9A&/NAn,A*zX~ ^ CFt\(ySe`4N\@:SP\-T&sn)ZP0^ŏC;<xͺ{:ҋ]:"c,s(X_g{K:v2XWټXEU3QNA.2H,֫€)wRvZW`8$jkսHh^'W_BKS+QєabT2Z(ط $jicerz5r [0]#!GU(\HpITjg϶\Zď7d$6CGt=AQ7l%s'#+$~XG;_d`Ss {-|m3Nsd+N|$9[ު/c9hMhuO%v\cȾH'bKv6CB.@J^@hap,V†//8݊BK&<0E ߴpoFj{;ẘBbuxtBc=d| N8SX`wT<4$G_H6Fw2F{)"6+aNHc9Ry?ʮOf#w#}S.]7hR ~}uCwbp _r0?p䗽 sl4fLtE$$N2GGV^y_RP܀S+>\]+v!= (~QZֆ0n@wr'5E#U:1 6v^6 p!v`9K [*lˠGu! H#$bzXWQTPf/UqYݶ4zX 4f+P9ؠ)qE#ewYϹn^)ѥŗdhJ+7φ tG,orR-pXv\&p˺7p]?,c5!?&=n@,+G~~SEu2y☘[+v^iƲgg22K"Anclm8>F.d|+A̽Ir2E{AN/pNB;0{Cm9gEZ<+> 73N7<ȳFD[ÈQ561I^o2_ o :spRܤNkS <8B7GU4͜1*^[lgLiDHk 6 qP5E6֚ O5jT ֶ7tUjDt(Z?ڵ5~.mA$Cxz!)tKMWW('\pk=_Tx7MxPö3bRj]Kg<.l*X"Ogz63z0UE%}ky.)DNΩM=ilch&Iy 6,5W b^WoK*jEjn*߂ٖy @Tt=0[?Gs#DihŰ&s~[qj/B.cV'WuQU}*:8?+" ۏZ|pN&|sx G9R])'dA&~jb` .v6k[ɹ iy|,0GQf:nLG_1t(j;xw':NoCg<|ӳxaǮT+<,MjoWD2t(ܹ?iϢ%VwI)*TIPV['M⋧nXՂaG;Z[zD"}VWU}xSPO` rOuJ;t?l+yqM).~( KB'`-fw(S`/\. RͨP&-|xW#I/MgV`ul:ut[}$ {F}uA+ޓeb'`.pd&3X'Qs^fBB\ OoL]`Xv H7WaB2!-,֫R Qw#,#BjR[=ԉZgC2IBjQ**Su Eu2\sV/d)X}JHVj( J|vQ|'ӡ<. KFzs+/@R`SY;o;⛼4R>V$݄ưg);fށGݕ-H8BY[>ؒIݙʌӖ( Oo"H=Gj lSEI&9Vg։)<+ JV%"Оx{rK-ĕӡD*S" B#_h Q[d[-$1[]A=8duÕlN @05{L?fq( 5Hg]ݧHn+lgaTd9 3DOyKP226dPь[ْ.(z<\@;:4%qs[tdr_]bJYO)Qƒӯ[Jԣ gN@7U.v.ETծd`7$Zh87̌( _,PW-G ާ;QVDdB t>Nxӣ ZƑd0*{zATs$+Q_]rڽmbuY%aj-CyP65 TIk=g-r?bn8_.ъ0 A`M1Y_L:>7bm T0=Y;usG&VP??5cJn\aף6b\1bh_gZ㼑b1D^ ;Bm{gBKK Z( 1L5,adLl>S$kg:CAoː{#ŧ,3qXT~2hH?h㾡$ %z(oV˚\>KGɈT .Δ-{7S>Őkad3-P!h_8l_DKc@$w@Jg!ś:؋59n3Gl&WMSÌ *I[K *.FRle[?8[=Δa5ԶgEG${A^σOM$01֨رjV^ͯCݩ#Z=s8ßߏJ wγlaݬ/1^B_PI:ۭ ʑ@'F1g֔Ά?ۘ#QɧI-AX:N,վ\գ/Z~u V^ܐ-~DTmOT`Y֧T;K l3 @0EXX%G.ڿ;B/җɬlyM2FhaK A 6~)f5|0j83IØ~%!*4Gf L򆺟#; 7CeF nƴA; `E̒#g. dAzs(mTGlc>KXPAn0 tpKW< G!rk5/n|&_Cqϔ p؁TQؚi9 _h ˪_5#`2t m#̠+l/ݸM*Lת1 9J"PVZITxB3>-{gOt$$¤:jsh4D5V'jhI?v5khr7 =~#^,YUi"H£$5 p ,_JWC hDŹ@fƍXߛ#cFZ'1G]ToA!JRD!j~Ki RxN G٤4ߟ{Ih)W<,Z k4ByRL&:9^c.||f$B\|=_1g{ƒĭ99'!BѮr9 vY:֟-1CFZ%ĸ`2Tއ3ŹH?;XlZEOBb!'?5lG]kh/юY ;w!LɺJ(<9 h2˰ګH1-ڜ~+Ao9/1ȕEaPEB EIv@%!*דONK NdPt~5Fr؏:vrS|),u+h)g|Gc8G<̌HԂxVF]I 8t.4lŴȩ^t92iW@F+6%jՉ=ߘZ$9-\}_m+A$`MCVVI`sZy ⒈*iaY?:`L7DjtzXဝwC#%zmyi]uvըs𫙾1h&lګ%@DT{RAb`t0Z$#@w4#MC5hSY2<(-ReC]c'L)6YDMF]eGYN*MHKf>擵5z'>:>[Ƚe3Ky,^܇6fT5"թLqZ=GctEi -ђUQ+jQ]i\E>[FyH<>6/ }[}}F?cg7SaXB]J FXx(r7 Rv̙|_ҽrFy$Vx2Dv3Cu(cU yer#J]MaXgM84)By`"Sx*ecƮp!wNB.311eBD2t"\$|*:aH%-Dѷlvq|ַ֨\Wu %VT^=ӥ%~v($/aE[M%}d<@cίܐ%5}5ɻ$'kffb}Aw1j艗ĂST#a@ ‰RbQ %$ƄprepzaX-_ÏhE愺bfZ=6RS,)7FNkzWsàX,>_"D:v})wW;_x$ޢ㻅xtg]"oQ/~DQ(]R?;\V/M(+"/= #Ã=(7Wy7+:Ko؁Ԏ4y~OZt U 8/ O _yp3m.90= ]bt,ΧHɳgZkl&cf~ȳI!.dţQwR;D_="FƕHY)#1khl@]liW^m]q$XYatKKB ?EPV4Q|JMaW&!x{~-73Z/*ͩo=/t7>6#`#- 5H@7VțʭCQQ &+ If (f&a[ }gWUrm(:n C&J|hK@ &qƠ[fQ>#{[PzT? ߲.H< <lthBgpA(8/R}^zʙԬ&:Nr;P`H(  d;]n!NOAJ''uMz= `4d "߉pCS@B-M=F;%]sA?x2z*VUWZǭ=śCY?L:^ՈS=v-g7e\P%xM˪XkB[l|F4ip]M{2NZiig"Hp!b6C%\ʛzuz4\/!x1`!#;#] 7 B1طgZV! r9їog~p,}De 6A⋿륍?? 8}q-+.3zgІ22\ed]Y` ؓ0(, 12JdCTq3=6̚ D$K:K"6,+hC_iI,xX\AU {~gV] Bݏ Q-e.27IL;)II14yڎ+إVlbpL7S%nryaGH9X4W2qhR<|+5M_ YS6T'lNeGJU˖ژgd&t%Ž"M&I7ӿm!cOt.}D\ʚ#M(gUQfT`(*Ɗ9aҺ2ݓj۰Z},&gVrqI{$(-}|yZxaZ ]ݘd 3N9zR [GNU%;-",c12;g3mKE07}6);hn /Zs"/ d$s ]@ Hy*bd^>r\*Ӵ|NQIn51:K)ƈHvgPq6*0tjoEzsz9eɁ䨀-`,s_< yx2A\iZR]݀e!@Pc)$I͝.5u a_^Z/>Db˒ӂHYkNʙA䦶AD9/9.Tbj^QZA@7ױ= җNSnƐP>/zEׅRH~t9F'=$A;? "%WUvoSKupQSIJ^ 0,7ōw+UYYX[=W֕ C“%^67e:cךFʜdlv* kayl 8DŽ;D\.fGkaU? "VBjIA:8eA|/wlWֹ%L5t0v k&r/[˅8>$Ɇj}S{N$3l9~_ XNIMXi}є!;-34#\Oo\vP7..Kӯ®BjP1*)D֋x.?/Kj={h{U&^ N8ʬt(y7_ R^R$ -LDQF,jR9X|`7 M yTX;hCPx‹g AMMMێ'{iGXoh4><$V|C4a+`S<nD9+0F"D쒊;P޵sMrۜ +X}_LW&;l9 e0˅ U^ڂ=6PEH4B9@\V<žVTT ' I T#!%jHEP΋'+qqnN@I}j̓[Wsf;5BD(2j0" GL8v̩՚@uq)X*&*r^L#>!Y",9^r`t9]Ndu&? KܲCi#e9lH#xncsU*f&t g]6[.AøcL;aC#8w.$bLoTU/@ Q<z%/^(a?XM+Ju* |*}"^0^@?u=M^ YYboX[ ]@j́s~ǞqAOG78ݬtŰp]v],D׼nCrC6/D֯5J1x 0"*N%!QAnt@ՔȾ\V8nV⑥ENTg쾗3YpУWaWś -mx'l2\@S:/Ary]Ɇ DeuB -ڢIloo|wY2L0-y+Vd Fݴ[ׄa|ަ&Q u+H]\HZcq/?U~H3^Q{]ƢM;sBtnдn$Ya"2a=Pa,h^Lq?-Mb@ޤ/C-B}U@xHQ@ውAcT/̙]ySCjWϹ~Q)FR&3ul3~Aٜ/o."lnzZYU^^+Daˬf^y# rhl?~2Z XVA+$ 3Hn&(qܩ~?r_9#!m_}} AWwd6Ԣ(s n"J:&3,'pǢKvUMnZ܌J#xӵZ޲,gXw]%dN19";B>8 k$ 7S5_--y 56s H5c`%ٳ഍eB$w%(Wӊ hBʄIBl8`1G<2X9pɣ>@fmF9>=:S~Һu}p7^7ysNz܎l (PHx-Vˣwp]͆UeZ AbPJ|az͕xK$+-hmU--\K*DJl°B=,0,@<.liح?LF$<2r.ڋK ͠S],Ziw&De*NCSȇoiCD'XonQ;\8 Fx ]|qG~S ªV%ݣj8HAٞ&lYf $T -Ԓb۩ ePzHgy#b^8;13?M{DU]g~)>yf_wB\1$u:<,^Gep(S;+Q/Q; <i*^umf}Qh`AuZ&.'{{9Ȃ/GD4b=; \m y"tqMwXo&wߩGү883 ~+ljMAG3s:l3gI6-whEсqɦjoCtKTG2QK =+}<k5<[n>t WϓN.FqE(@Ϊ8'?O47R/^Dua1}AUr^6:.L:$]m$W׶(eC"Tn MQ2QEt1+-]!=57E2b. e#Y ۠I aρl7/Q~;oc۫.K8"t~ *_hwL+2,m;%_@`m~wwVșhÔe S:hiɢ&gmDN )>2 )O+M;W'l 셈9IK/'5jg& \7e/?U/jKZL"O$ #i!#5Є>[B>7' LGo1ƅhE|Kb ּ(l}*-$W jr)BOVIQT3GKQ]ygU"D<\ޯp~J9.L_ 7RRiZjoNpCM5Q ט\,x+-_,ɣ+PIq.H5uS5oW <^Wp{0.]N"pp NQ׏D-6nN)%{ !Nkb=;GWg},k|n(~̼t, M/zO0F,b]@Zi D4|p{x~֏Iq p7p>܋D, !6?':#춵Apl5 3GI7!+*:v¾]ѱX4;[1$qz.vhAuĔuJlW`rv5 x6v@g8[l69w:ꁬCnGY\i҇8y^?J!?+}a Cȩy! ":7+:ѮF@{FF"IAc:Gls.=⑶+CZ_i=;v<ˉF(bXR8?I$u[~:"gʬu~69_viގF*sXL* vXģ+orB )ӊV:Q:O,-̘1q Eܮ$| Gj9 ǵ 09!ܤ_a^dJpDg'7ڧ /uX 92R/ӎi"`L-y'^MB*RV2ZN\Y?%YE zYbSζ߄Nco`IrEl_?I^gƎp^?ƒk۴U'niqH, Q7uaWyf_~]z)"C:~hBnB7l뱶Z.) ֺC"hc+Z N2/%V儒k'Op5v|$䟂J`}"r=ք]v3T]ﴎ~.,Pjg"$WKlκsԽ<0n)71VkqX#$m޶fcT.y6Z8L$k@A)T'rb5% s&'̲FI N=Ġ7 KDizǰ!3! @& cXSV#WA/h>N݃tI2[,P9Ɇy7eeG`VC0oV5WtRUUc0CO9\dWJ!S,60,ǨFw5]8ZߞFq>pV xA@92c ZV!\2Z#=9UvmHY}FL|OIlǏ8nk[#NvFRzqXUu>Ut1CtB1"a✩zYzd@$ޯ n vǃۚPɣ֟3 uڻov\9gGUoU̪(=%V#a-fnw JX*hՌ|r#o""Dj#]8&ኞwMٕ|(2donx\i7a]܁ZA+V^,xmU~jR8$I&ar)ϮXJ|(yT}wO7'uN2qC>4/740[?6#?=v)Qbb8>Prg/91$^_10bys)NC;&,cKVO .(V}z'4[j.r2!Du`k:P_׾IޒNzv ,iKb̵O&Ύ9^jǤЊpr%mN킉98t"$ɀdL?0=L/KbX- tgsa8=*i` ' |!Bvx^ &Q҄E2nK`@ ~(~'V}$_$i>lvJݔi~K~M|E4|*j[ڑ-#uB9fJ$+CO8N ]LaGiDVAUq9.oHLnݼNDEb;buڑgv(DWȓ'٘P,ڟS9@g>"DqMCQq"z`|6 7؊=Yy[*,*-_L >/;`)xDk18hx0Gqk2I!e^q{f$nŇ\&dq0Ԍb\ ge"ǩԄqL6$`fJ{GۋWO twiЄBg)"-|HI@Fio)F|C/[A v ~ p٪dW f7E7)~(]]ӳ@Y%/$ v#Y0C p'%ر'Db(nY` Vbyaj`N,w;:ezRFџ>$%L2IOFUq n^R#fڤPkWW3iOG(^PhUT5ReueZ'%1ac&V\QYN,+:aDIxwu`h|$W5 &m|(4c4t,1ZYtMmbc +t(C):ygM̶תּB/:O殠@@aVO6XCwbm 6A7Lb*qcM:BW?XA6ޚXӟ^o,ec[bXZ%jŠP%G?uY"z,$ρpv+#;IVexZKxt=ԘPy[F4 h^+Vm%)˩f?kfU aOEܜʹGkq@#F 4 %բS!wJLEFtgI8J&3jubDRw:f#w~mXx>|K;GQV,d Pz Aw!:gpFI=ZG2XeAʀmW,1(ѪYD&$%zeه{k>va,:Nf Z3um'n,o`BՙIˇKL.(:F'"+& {R'C eJ7=&uEk%Uj>x|ĶzB7Yd,-\bE3+ $PLT)W 1MԻ>J⧭ۆhx L4P,d >dIq'|d զ콀Ơ #Cv q{Mv Zl׷ [L9 J>Ŭ^r~;k< u>mBY1*8;Y FXwq G^dvˍZE]DNn< %y0id" `Uy)\dg:Lg`ݱQWr B>/H(hs}yo>M}A2=F~ f!5!A1r7Ќ@-[BCw0yO=_ml1*eux~[ UúHXCD!d,L<WGUG8:4}[8ZOmY [WfDs:9z-?OҰx;M=[ಘQE΍^V說ԶԲ@^G PTjƅs!ni ]Ah L hC R\ `ǛmP2L7TSaCM9nvA*CLQP}ЖUrid<3xBXAp$b/ on@; @Vz@Y}:k-Q#xs_&8(K Nog訓Y>Bғ92Gd+OH4GہQ)Wyp`áWĐPOl34lƝѥtS;QD^ۼKTWȗ(+ ֛;KC"l~zf1RLؼ;%Ь[Mxܳ}j>*[?$l պr%"`a,;J>Dd-!=t[3-Ly!#H~P_-~IJZۆ-$dUE,(Q2uD,QdKD+>]Hb` K`SBe04:_h3WqjRV:(*WG'{: =8&c^"k~V꽛{u | DGQZ:# 8QaD4qdu }c'̄H̃|m(\7q?/W$e 9!u=ld!@).P2o%K6(yepYMd2I}E'RP``ڥ ׳@s23n"=2J0CB=ZUV/gN(Q*kf"cћoD]#Wp'铒 MMj e4hЫPOׯ|ݔ1a%ky= #|2n=HipkF n4xh+6,DȣG+n5Iw*x>ExYnUhZfUPͭ2@yiɴͷz9*ẎZ+ڻ/fL).) :2"%Z.,Pe ) p:WK!mD*Hf흃;3| ދep :?=jPS5lad뎷0t:Gbii:6͍=- k.٫b?W(BrEsu ))hGrA~EX-Ƈ%}j']iF(yŽR+c{Z_S˱8a.ak64L"$Oe}ly + &-+y&tu kLAZb>R Zm>5q;8׸6UѐY:3:Myi~FX}~p}yX׾5+xu@h8:SS}Wj 1RyuQL#Qc(+hM ;T4ML%$Q],vվ? ['`̮8Je_RyUó=,a^q*wT_; %v3qJ=4&,+l̮DYO{B}ͨD0ݠC}ѯQZFZgt='t Õ2'4,_L򞗝MX@u14Id:hO'4qC"O+QB =9Uw]?BXW0dX޶+Crᖮg!8%EB=CҁӴ23",m@M}٠ O [$.~a]*ۨKH>H`dBz95D|~5qrF50ex: .H$\PT^jC Cլ+F\f@}ǖ( %wLBpZѶz:<ٝycbX+ .t"C&e_=ifcڋ,ڐܥhu1ST́$Knq20_P 1m&;ioߜ, 1 l 3{J ;Dl1g*X h0T{<.œ+"rCxw}Gu$$,.g? _dkz,hiՒ,5 p'_Pޚl5%LPZEOqew9U&'*QRkIze P k4Ǝ{P-KsIM@W 5H_K_h {"~v3^ X5ь\95[@`sAYڝMGHBuJEm"d 42N!ȜOڤ7M99x#wdaa$mu$Ir$?%໹\>%Ͳ "h'R}%X33aMܝïp[exsc8;il/;'scl+@Fv5j[MQǦhFu0&FXgdLV\Xf7(mq+`tM~g㖻񰍔UlGc;[!1ó;MTn*{u&? "9-QU4c3Spy ]yԹ.!rUb"ME~x"HRmJXE˘Mv W3W%L[l'PmR1VJYR*V~tY`향;%ɱ@ --p*N^NjZSzq2W3yv7ll+(/ccy[3 ApBN#co,sH.}Kn4o:5=g@h~SK#Jj-1,e-Y@o CW/Z1JbY;'}qO8O:pVŖL3i!fT 7ˌDz| F$ۗTx-Yq`gq{ihMwcܫ?Jz&=T37'A`J`HSD$EC4Wݕ `N0cq?5F=xi0Si'\qph4ps>D@ I`ƛR-S9Ocx.>-9˙s3p5EÃR] }0//E.F[6$݌_,W)DY̲"7D1#ωJ=v <jt(?D"N%v $71Ll|Xv/C ,PE8-(͝bdʦ Dvy`ߏ_0kr^H8 IGHKhVfC&Ex݌2;Isş4Zsw1H[@)a:3gE*!dh5OjQ|eI tn 5HDo\Ev36&%Is:t&rLk[e dnȝnS2cg,3=SB^;qwZh} _,[0WfP1㓥okp\zr(N(z 3&0Wb.:jpzLCJXK5!ɻV!Oĵp$x%Y/70;p-Ƈ^aŴ%+Wu. AXM`,2} 6DjOxK`ɺ j*MoGtiZ~A]q.hS9 T0R@>qݱ_[Ѫ>]hTざCJ}5KU TU w/#goM)u4 t73 h%(m&a""ku}eݛS ER29GN3(WO;Yn .o؇l,Y pp va% i׋NRC"2i]APCӕ𦃆s70m:6KMh3Еlk$͜T[c3q`Y)eDjfW|]Q4顤9%Z~=WTiu(Z96+ZYVc0rL,Ѻ@Wn ZFB\6NQnVCJi:ªҶ0pyu`(r|85<"DgޝJ<`7LꙎHMvKF&Fb2'4o e I>-Ǟ*H"}75kg24VtF_Ir7AóS &E GC ΢VWW&ޥcd &5‡z- BVD|c2=RB7Lytqd,0#ӈ5g/+ULXŰCGCg- 7}+3(5աLd92O_&{"d~%&SrN'MNC< ,^|P3e@1< 2("/+M7X9+ bNOt]Y40_,?49I`1'Ql8')9sDƚk5*/b> 9\4.ǹKMg kM7d`a^̙+ Q̬@cdqtb!)@(,2AB:xObXnێ<]_\ꨄÀZ""La8}Hk:Xe\enÉ؟Ig Iw\i3 k &ew14%[ʃ, %2e)"K t'5޵hqdYXUbZo-r8 :P%B u?G e>ŌT iD3w\I)8~f f*Kc"rum@!N룼 Yxb!Y#A!WYujO'?xS߳St_ ic"a2=f&߅Ӗ*߉(";ލݘp\EH9Td1 rYP}%0?/¶=hm?>tqcW P`4r{I2ݫIj̼? (} |&IHd Е8$+9.Siy\'3T(^7I)85/İ&Ҕe˒osL dA!iuOqe.ˁv\ft DsʛI`CHeCֽA$^P@`>*`Zү"Trqqb78MqL4S¦7 Tm<. !sWٚ.0tpۂiZ\]04.m%/}9oTAP)ɶBmCN7+a/;;(L[{0'0"AÃv; LHF'a=!<P"@pc̄'9%j<䐷X  ΊZVIa ` ˬ9 ~\:CTӟL3Q<7Lx~$ϳS򦽊{GFyɨ&NA! :C<.0]Z]L{?m|*F˱-pdb">Y;Վxv&̴6sfu3L9aOSF˵n"л aG-)nXJRLO䑷մDwh \&]SDQr7}5wlX*IX $!ћazTl󯁪k'W! ]iT&(Pb5Dx'|BBޝ6+qݦ6V7qfOEU&EƹmLɫ6KS=BTu"sȤ"& @YG CZ/40B{8h tD Qoyc_ޤ&~h5<玐o; tK"-HJ" x L+(P`3"1=I$DJdYdSѯ`мpU^1G^f#d= 'x`ʺ\rϢJ0 #b.0 %^>xzANM-19we^Ko;2hM!B޲ `.pFEY~#8N&fY u |Z*_۸gfoʢ4ɮOv)\@&r^[2aw)\`9Sݒ=+;YKhBuaL5h`g}ₒ@uOJrbXɪ829Mعxtp% AD>lϩKrrtug/pB5IJd3zUfv%SnWRf9NQ-yd/` Iϓ_7(l޹ט"*^0> ߩR~Ep\i[ zZ?3vŞniɰtPnj7Æz~a.+IņwjvЫ[ȀկW4rPUS\<.YSZ^7NcuEJ$wXdoN%,2pbY32UQp΁Df EHI)Yl@B:),6MQW@yRxF`6^#e>=MXn<) 9ٰsY3Q".RAl)?\]_| X8Rōdֺ˕e|d LrͰ2&b6.Hj0jyPa]mT70ʜ,,i]XbXdXb;(]\uErROC%s0hXl7hRa(:~]#a=~&N51Չusgv}I_:QM/]?>(@ \bLY.$GYikfы@G')CW E76] .j6)_o ϑ'd(yxrXO0,);8^60aQiĉfs5k;pƼ$78:a4P%51_0r2m?[ng=J0cXӋCefnģO=HQ::P.sJE)/?˂wSNO) ؽo2nh9Pn薊76s4ZeuU}ϹDSb*Խ HSB`]}( p9> θ_-(Ѿ^!K$Ȃ?x|NR <^ŪtVa$ qH}/+`N 6 V,<8_4| kOr<ՅnE; t"U!_jKj[ޞdG6Pk*+) ݕQ"Q=צb'Œ'G1/`"dsmc>nzQ1f`6M`ѥlCK"+(ޝ-_UJ@UvJ!GR Ws%\[d'->!+ 5LhqIWT["$?+ Bn۟p325&mI{㩁3|aXUtj(mOr{fbTsm'@4Bc1]'xDLbu.7Y7,zxFӹ?s׶eUtC̓ t{Ι^k$}AHRjDzy$&Kaij&Mg gVo~`Ylj㉧D'gcH#] ]V#VzKfi'ZbEMdFra/Q /Sj&zQnbʄ4{%6"WLE tP.#Neo&a3נPNמV s}2!O8!xJvrz?qg"-X#(q.խyyٰ%S%h161ε4T?߯n6yl#ZjJ6 Wfz~ɰ*e<hju)kX%ҤO\*D}?bdxen<fTne#:RZ}?cCxf}Nhˆ`42RD1@4r|a ڡKEsMgdt8uhڷ& j== Cj~=m=gSy8V:iZ:ߺ-&-cWWSƢX4I-"Pìܾ_@`³Dф!74.\huNߗT\^'&kcq#!ҡ\< [kVI L5%5 Ku&1y **!z,w+w=rH?HҲbLJ.Av5_J'l09Ҟ蕖 tgLnA:q,b/Mx`v,"օAҴ͒JpG-\u+7XȦ:]fa]eU-4F1r2msݺ"S(ܶUÆNy-"'NH"IXZw>( ; e[e=ʌ7hPDu _@qz:2~PYDmR[S=ŰbX¦dX9RշΣϙP,%*VBk-z"8Sg:[et95ar0%IF]RoYZՉ)@}rlBKqn'/tz #ސ*(5.Mӯ蚎#DP:2c)}"u/r=Oade,buuYLmF[~5.4riǫ&!?iSC$o7+b*qr5aWѢ,"GLaAL&xZc-PB1q`k8X߸< ;Zlm2 鉕{&^`07)Љ1q3M{(^] 5šN5p.a3uwf Ω8 1]RyJ'n_Mnj[ ^*Ԁ1L;5g\X9'Zpj93W)uO1mxT_* :lhX'=hR0E8EsיA6Y7m8@̷rWK#>?A{uI~ ps "Ssá,8-&[.4n"Ǝ~<0vq%;U6?VuN k7u @B*t) PBߺ 3, c`݀ݸGoL)~3AvkpnjN T)Mfm)uOuA6V|Wr@iӫ"/F}֞Ź8r.m%$RWYN,iں'"1,yxmcA)f,FU +w @0p^*[m8 S͘7jB ;b$zCܩvQL=K? ZIO.¾,Fߢ̐ SL[RqQ "œcJ%$QN=>"'AQӂ\3JA%]J¦H0E p \S=+YJ)]=,dPk| tPقY_EXM IY٦MB0&XYpVƕFK^|Jzj:bSk8/T7h{ys]0s*'A6&&^!qyF X$PB4T^.+e z.za L R?8׽Zt=T]`!UͲeSێ;DfQX]ȑ[s [F*YDJ (~9%?F$T1{ zG]}E=|α7DD4U恣a$ߨY3>ga`齷w 廮C8)z 呏ᣓ1眻줟œnsD%nYѠgH4[^һmE uZKo/6#5nA]^hRO&5'݈؍#w8n]1@,qnWi, Vp}Td{d熒vCR=t,rqMFnbIH_Wc]'v+Nz^:%SE%} \/B5F]elݐSI.Pi=,\,U㊋jb&,Ctz SnPM "˯d5 (A M" wqDG;sZp㝠C~ԇpͶZOU俘cR8'4XEQ+@|х.A&$Z2eP^^!2 :1mU_F`Q^4|k2I/5mԚYv {;ܬq\`77wf N- t$zPB+mQ̐z :FXBV4XEtS&FA\m'+5--r$VY% {2C`|"(̔PLxw'BjgpAY~˽v3-"#˂Q

XLͤ4gq=ZR[CaU}Dm~;uR=L=rNzftV߅F ZWd'H"09.C'4 u]*M{kj룒{~s DYtֶ [fp W_HՆ2:4kO]QBv%)$Q@g +_y :-H(lմA5"װ:/3 V ꅠu&ߛLs5v`>#8@$QO6Ȝ>Jg.ax9Y_!v.hXL >. z5TM!DOJ#/ zE3xHCRߏoLw$= z1\Q>͟J5*:pQFLpE}{U4}3~(4䜰$o/籪QcHas / # 7drfa,zk [EZvĻ tL/Nl웪<:Zew{}?g[uBx{:1g"t߂_ {j$:{ Jtlr!p`0ZUa1RKfeMA®?mNP; 3=:Y]C(ud PJJE Ϧ)N-Ve58"XSYF@TC`2ߔNU$x jڼ\v2<_} $zpH҂}Մk Qx,,'uV_)@0OΡ74C?wnJm[Ou ։Xuij'(ziqcOȟR$/~PT\%qo<6)[mz">EaKwHZ:!(ף/ᛕ9Z*ܼ [8eeQOYy=EW⚿^yTuK{CnI~ʾQ"W %J (O2uy.KiY$D8,:8qB0t_œZ@)IdpwAt)<\y9uS ~spD Pڿgm%.-zl,g=Fc74)iIMR`1Ek1`{mU8s8Bx2XGJ=xoY&',Y|ZY}Fّ르Le.w #bSTvNn6+ؓ)N4BH*Eݥ̤Ƀꂃ?űYЀs̉!=Ŷh|~Ll X0|7 N-}I*ĸz\ %nhvb/Wvz?$'&%NVv}< cc ?y`A֑%x4Uэ Usa3KxU gpr7AOcXv;Cd\φUc%N &6zbkb"S{c<#h`d~o }rr!emVyfQr9x,D.ۭ}O: '|&r^x6/aIu=:4NXo%JZ=,[M}1^;^-W/-%}!uCrӭW/vshɡ mF|;""GfֽZ[K}4WҔڋl%| =ab|Yy5nڏ4wIFd9DU}@q0C)k>"oVcp[^B6i߄XуZZ+Nw.ƫ t,qޖ75g'U1F[hP_1eoŀ5LT8xY@:x?] UĘH]N#ecqXj&Aѫ!o+Hi WL>j^0Xn^Oi{(b*U88UKfSjfm `,JP3r6SAE}Ze]!ſr97ܛʹ҂rWI'N&,vxՉ6]C"?v4H0na0 J9-PP!DxG/b'rouN7D}E{'l٪vQoN#e0j#IӤGWj}>g'SX9dˆVQtCy a-`xBݓJ#m&S*cGŪ> \9_.R}]~dBڲēC eՔH>({/2+P<9o'Q ';H2h}p~ha9|fq{( H n4!pI%3v{= 0 tƪz%NP.z^;]4{(8š.A{XJ>BD9zP~Zo ]RZ;QRCUoV_bgD%m#'$(Ke$@:Y7޺w1dT:xoeMiLQ˃LtclHAq4KP 63<7g$TJ,sd!m fx";:"PwgA-pPbHqܧ\:,hE\|H=|WASb{&e"#Tpr)ZΟ,@מ/ 7.|408 k; '_<}Q=$3ujTqlqjItpPI瓌# :`0]>߱9xd)h빁2/-zjx+cl%%EX7 ^?U~КJ5~" ;@Ĥ)"< 2kfF=L=~i2t10k8UA=\C)-bDxSCl5=qX/ V3 Z8L]dTVYЭ#3ŲIH;X^cF?A iɊ,f*b2E"㏩g[ง&$b!cZfv`0i}Eei褓`4<`2[ɬK v6ei`XR9Qȳ5 V_H|ʔ*HS1oAn}|] nyPpAg Ci9 D` 5]ꡢWSAJE뜒e)<XxJ$wJ ,{KT2ɝM>Gx!zmT/{h3akd~2gTAuTs* B NxfZ<{Z慨 lO]# df9-z}n]ݏ0^ Ge}-ዖzbY[\d|=rQ,uQ }b31R^ď,D0uqRwf=^~AIկƲWjS P -}šK_M;G$b>kV`DbX#\?wFGK0r"[U~|$]d"#bPNNı]1f)3W⏂ Bvތr^]J>"sXCï$V1,(Ȟ9W;E4C'R4"BwUUAQniV) a6$.=:vGͽ? ZDz#B`$?[U;SOC8'4AR9Q'1( 5 ¦*!dr'i^&_ǰ3Wv UlSr/;UH.Eb GQ9-fmOXiWqhgX$y̍}]%Z e twwUE'gX֠YN )5+=b-|qF qdjnojIAc̓O¸p CΒgH [lfz(+modT^n7z5QRaF* sLƜF\pn/<4HH&sM4ӭ"Վ4U޼`ɯwlU/NZbO| |ρwQm`<]d#9e.)b̰P>.=^ ]:e? t \#@ (Q<' JAA4g  cv_/-p~zA|oݝi \,ziv*V'vR|eO#Wк.p %kk1Uj^}f6EKM|tF`ژH\%Mj r2NRG$]$,n< {{4%9M  yJx_oT ! TcߡW}cf̸?,W~St[ֺ 񷂸.xł3/ʼn! Րڂ(hnQ=ESAZnXIV2 i˻w1$k;Ev~/5\G\M4F[vhn;4a)U 8iDO zϊ@m|%]3mYIJ"Yk3@SX7[یOA{47 &btcjp5 #yyYGl"#M"uZpF)lljkZ sНiAX+.'و&S;Rz{r^6N\G-S "BG㮮\ K,*W_ŷ+}_[:!72A&ۨItTS4  - 9QpBbABv6 NhdYŖM Q:G~맜_Pc$ź`ʽnJT[Ñ-%u8fPtavGNz +b% S19[?ZCKRlZŁK6N+6R%kD[!bvglW~3_yCHΟLUd.K h9Oo?x5cԷ2gf= Jt/kA .*^`l_j͋ 坩ql9s$[8#1YW"_ Ȫj7ބo?M5xw}Nz&zvrƈ:Oq-~F\KV=ux(<_-(Y\\ة9$HܸIݧR_%ЌQqܩhȘ!:B9f.)^"G8q.u@PS+vF]TM kC*zuWU zMuliV^U2;"y"Ť5u.[,劢fĪoē/ =/c7J'?fs! zY2r.>Y7*Lm!A6c RL=^h+IU7@' |`' U^Lf(ܡ|L; :CJ,w*8fbKJP1z;~MɗV-#eqrU8#mn)ӑ= %NLy,$8gzInlZ }*ohBV>`m7K7h,( Փ쾬bܦ ;M{xp}}1"ߵC3kx=!BU77XA)LU15ֱ XiڽvE3QG7c㪪@Q` NIbzBquq?<5eX v DDN+',k[Xp፡FȄ_uس\E9 x0YKɑLs^Rx} [0XH,O%C;/'>DNegDaXqQJ۱*Xݭ'vd+YR^^sﯹ/+kNcJH_ I?azFB/*oB^}ײ+|l,OX g {e]V֨%e<-JXn㞃ؠWq;)^jK" XSv'!V#?# vNz8,ɯcaR8 ~}jFJzd\@a" b.xߖr^gY[ז>\Z(uBm-;HFc U^K+G\O^E.uznS?kwn8I.t7@w܊tn-)J)^0![}3E}b5? _P&]#:4bn#K;xSў^^n+xU6 ]]Dzv=Bwȣg?9<#b֯dK.}UŁ2nn*&ZRL6ELMF}bP v(+FH/lOwXu#Q cgم)qd:fmfU'R.Cr1Ϸ9=߻بF| ,r.,oq_Vt)f|H 麇a9|$4 1hY"F^j>4#IEķ=) :|r鵽V0K@4A)ӭڃLVJv0 .&6{ Wr&/jƗGj d~'\.3wJS' @2UHœ#g?K RěHv3>{DqEʜ^>zarW.Rκbtqbj/a>d9OsұHAv`}殠*( |v- S$MKYEVmGwFɯx'55÷6k%J~+bV0Ir\ė'MF6fs5/i{6 hFGe-0Cĸwg*,nz$.zЬ0~&/[%ॼ GQ[67D\Ji'⯢sfb9_%HB697HVT`lLBX 9GP4%\ņ#ZwTSݾ ֥>v"~lݸv8L@e#@aI`ȉ;C1+I(FY5jQl#aV4򁾁ℳȠ_r:< hkw">WQIr0jծ9Զj;%fxY(t*Z_#l,;okռ?A$Dо, w+)q_+"~F7QZA:M>1:l&4!j.{%|1=͊t,I?kUrǧf0h0LO z40`11:@< _A^Kih\k5~FXV*EES-kbPdX%‚BKmvU3bwGfWAD#v*,:&?Oa.O͝6z .0nsd|ˁƴPlp-IfpShbW_ׁͬ ;ojeQ^HVEVɪ2r2_|qEepȁ*K&k=#."Auc  I>'6<w$b4_h=X D)twp)ݥ>ࠄ\;c&VdGXb(oVzD zOs ]3߯` ~ Ez7/AEw_w5\ {V1[@,Zf {w g=kf-Y2WztVWpU^i|ݰ](44f"ťrQ*puOּUl2/`X >x 4 i_M!1QT@@[gF,Ir2Z}V= :reSJK2YtвBLY|bi—^ӷ,w':f@w\PbJ"/#bcGar?2ܧ7a-z΄ðD 7'}+0xS tCG-f%[~p[9t=:VIuw6CJjlj~Jܔv^)M GZ g*p |*303U"~~}g=H.KFz+G=rƎl-nFkcU@ܨXK:ZS媐Ug{Fo i&L|%,([rZ8r߄a|4Cr]+xw:ƺɔPKv\ )]s1>}_h6<v(gEZK<#15b3/`I ,tyZ%sT#ޓ= 3'Km[V jri>m&^C뚧2LGߓ~?&y@B)W<Gv )E%X{Q"JqS44YE)]Re]h M'Cjy\SYpȱړ7wA\}g%&SeͼRS$f#+)Njj=LK'pW<ۄѦXi#NfNcpz# U* ~HI\|(y?ִke}\*pZ`]dN]fwd4 @Dkժ]]vZEN$v!t|O}qMeP:ۭ­^ C7:\Op8GikJޟƎ1Y*Mjx'2\:E8!V޽C~?N:EL`aZJ}\%RaJ& X;,h6jԓĹ2a\Z`xeq"Ʌ ܌4,NE 'u!Enp>` 4b/x$>D8 jՔ}:I;Ճn=U1 NȾ*_wyR"IdW Vɱ9Gft OUK1yʤHF`VL$$z?¿AU ߗ.s_ j%NIF Ӫ%sm8:Y@2" < 5H?v0bpQ٨>%G8fhZ9 1ݬBE0t Ki8詬F"GI(s~hn%X$ >Jzc #fS5&O%`FC/ q\0-fϓF2cW0 0 ӡb'ï_|!p>Z8VD@a40&tX*ȯQ](]wKQ;')n{;5TWN:;P=}/5v//H 'rBZu<&&])_JHs>$EWu6A?ظѤ4Z٥kt.!ס1dM:]G 3S_,H\a}^%?bAiŨPi 4ka, Fڱ8%:^> I]rH%X،+oAU_c"1Fgu_X.W^vL:;G!Z7Ď@W@["¢q啄=".=piNF[13;,L?Sگ蒓M l; pX!|xvџ ~|Ϝ䞷 z%1U: 3>~gYbX ';s+*9Ujx@TQg܊k-V~Q)h/TG/\=d{#2^퀕j?= G$28d]Q@ `DcQ0)㫍<ϹȪ\̶#ʉ8I*A&jVZuUaƼ6Wv;<s.Sbv r%w+ 9g526wa>;d&'* N; {w"ObQEOǰDt9b Iā\q9GYZ ZFr6p~c(ߦJL*Sts4_>?F6Ҕ<i4;܉[$3 s u)k?!wY:8,9뼜KtG.{ays'FÜGϗҍ ׿Jr~(;77;%"x@u_Kyِuz;Mc.w ෙŒU{k\֒xOElQE9NH]w) z3KÞy>rsVs\H`!%DB^;忘ռ@K%X_GJGjv0b MG:fx+ZSFPYxج[:+U:%J*ᜩxIFMzsJ 'v:kzz7-n?.]S1ɻji<7I*-T;?h罇SAdEku?9X.0 gZ=F^>!:``~}D\ֆ/)-Ry1\.Z9nn;lAueٰ+6Ãc~ чtvKeu` ׏/#z2MR2R#u m&t^b9'}fVGZ2L[S)ȌϾ\! m14 :%99eg>)۵'O9wuLD1C8Mkj\^I e΍g,cf:->g v w`/ Zo<냟+2!tYK̙絗fdC7}dbH9O%_lQ'}o`oN/p 5bE#nN{GpeU%M3m,huMD}saI~TE;<3Z"t%I)ƊhXOP*q( hW9b)"N O`}d7ecq>B!&.Ԣ$:T_O<ՉO7n~Em*^N?W!!hVahGR&%,jx)7Hm $R}AdZm5d䆊:eZ:)kMr[ސ.bXS{j\t ˉ5b_nLk#]< `ivmqŮтaMYpֳN1:NjdTWj8F!NV߹o3w_!8twƦdIjYj~brd<պ? 'mJZEB {vtlO0ּn.b#AtH釟?/w!eo/1c]sir *E|&ý҃WX53pݑs-v&9 7=k=S wݎ>#oc͕w< Ṛr,@s7&>:;Nӊ%Eig ՜vԩ7|Dj]`;;:W LDt2 Ɯ{H&(EVvaQtI)(991'(+#~PkYbYB=Q|wZdr֔@u Rzvsl?,8F4yc}RV;~%=*QBMO?"}Y5B;d]a}.0Lc+5M?oīw ,茿5eW(fv&ې a 1U0i4i,m*6%V6b`qO4xN"mي\NjaGl$ ;5-4a9VvL(c,&mܟ_w=_pV k.$FU_FaU1%ɖfm+sVn C}EόeSB9KoB+\9Q*Kf K);)cT/R6pɀQ!w-[Cf[_pwX\n*PԪAκWS@) n0}Ltcx9t}"LTſ#gJo1CZ$PF e+~% b{+4Drɢ\ջYӇisj:Ԓ&US"M<)J8nL9>HAq`w+Kqˡ $ " حRH;?1}%yN||َ04+='i֓r3{ڰ5ϔ5b+P sōٰ{]tz w2yYOBi{K&?9ab|Rfrc%?90'tx1$86Qn\c{r{)YP<g|sVTZ ۅLVuN@˒!O9 9>ry/# H"MJ/A~ 8RlBv لf0c86My 3LC~N®/Fqyx9?YŽaY1,뽙@?"ew51">Ktk q/OFqH|uN#y'3| BЁf~)l ||E3oqwO ++ ,3z%{/Nj9o08zUbݚ#\=S]:9\( nZe;Xݦm̑l5\@ MzżDm"2}D繓v-s'_9j8goZt2ʰOEo\W2s guWg(r X?b'+]x9d| 'g9^x1ENAi עWiW+Jep/h9PbD0d~t"Vx[լma54 i!肌I%ܲ(wo< >JSJV+\zސz c%N^aNj>Wam6=RYaaÒ@ r~j[|P֔tZouuynV!*shӢp#rA-)#=ɫ$|)#fRԢ5LDij>JNRᰡi}AVŢrYI[IȕnXځ;uek{"Se$YM(Nz'Xc*uL!7UVfR씰1D$~y䢇Af)@ziQ(W HzrD磣3lA'8?҅yq'"#K!ѥRP 8ǻ\5㉇É>=J. pcXo>d9kr$oZ8ʥҖ9auw]"=yH:sg@ %hWgA1.߿̬+_Q"+J:[=+u a7A/!--Rp(E } 2Іj =APsO+y~ #-osQ\b @p4S.PsWmԀ}"g:VmwZPU.՛d iP)BLvy-ZTpXr7 vpNC> zxufS}lִhƯԅBJ`䌯EHn/ *QҲIOԅJjHI^s#QO IO/rxW?||o,ٚ u~/2\6 E;Q^EmfAȺp>{Any1$3opLv!rK\W$ n4.Y!;ɐV LhN55qޚIiCTl]LO.m%*y<<^^הky7њj& .&&={l0zYvs-S(UuUFxD@K3 r"u&\On9'㯤A/PL'πa͞^k %׵~1þ:Pg? xY39F^JW}s%4A!83W t(# !m|,RVoCU3/ls޳Ǻj;j;8 OXi<,ԶySP9(b.~̏G0K]4C3jET8DZ<'nk-s^E8w/ a V}xYgyd뢖EEroBb:uk@ثƓ/_sA|$S8;tC fp#\ˣѮ.EB<9P~]|*EӢ <>Ie319'MGi­}y5(Kև@!0y}Ņ$GBa9r%NOoo `k>^&z3;PB2_ +L :w~Sk,>IL0_"&Qa3 ,uV U1fLˡX:–G6l$z *X'֓yDLL)ݿJ~ V:JW`EIr80oybCk!8t&S%@`Ī\ζ/+&9dc*:oG?P=r"Y'%a+:cѫB ҡ:=SAݸ![)1-k΂St5k&a*#3MFS''mg= VthXzcI%L:q--{Uwp!a2?x:iZ' G!CO|>]};sqʎ fڼϱ*{ ljޒ|R|"Z}eh6_ C#G7Zv] QzvׇDnuVVVZV ]QS/Ԡ0AsMdyT1DG3 nVۂ35(Aη:8£fȰ_$ifJ S_YTzk~w5Ò`P!>5U mZMƑ8#4z]BN" ڳ[,D<\WۇanપJVD&Bֲ;>(]68Sѫ^!Y&CӾͱNJ^EÃ4lהMbrOg'qųM\UgI5(V嗊F=ިo$fZ8ek)rm!-͊>HpK(YvІa5W"G|D fڳolRˈ%H{;8.ӸȴP0SH97D:bE Ti+?<]Q- '*n(:zgvݹ0+}2EŹ-'[o@Un+qHTOQg6c=ƌ$lFEޜ _R^zQd$ҹ$4*B*z$@7yWb֑p'\ rI(-CXJ'NU9)իe0A1HmV#E,`EF0LR(ԞC{IxюRc""gGgT8<%JunpMQ u+Em٬YzVv/ ;@PqV"&_+VTQ%1UadY;VW_E }E4vʊ֫gdr]MwHғ[WY)V#d/\͠z+uJe*u~$7$瑑.g,Wqm_C p01QE{$s Yb+Mr!\rYIpTk=8𤓃xxI]!j019UCLx6۲$sP~qT)PB7ȣv棴(dIؘ .|ԥ^o)߽8c.C_U0N6yw'?S;"ll -=}5 zRrW#š`((i9 jd*FHqB1|(kH9cXQ%a n#V[ٕZh;$zg~懸#W]$\}`Y`zq7. (zaOܸ-S#6;sBJ>/8Jeփ 8\mC&M[EFYܩ_y Wv1&NkuRʹs㱜> 5J<^@W<C m:a6EL" G-|ĹU.]F@H_Nq"m]R$V0 i J-ؕPq4N̕}&M9&wy"!hh/rrg˴;H IxSρ%G̅ " ۤgjѳp(!xN1|qpQ̈́찶y@9Gq[}qt3^59s=/G&-9.z':J:"ޘq²tQg B e78/+R׺H0ҲL/scqWsN(c5teMPy#@rlf $+#R{~L=(ƟmTXts!_BQI:M޾f*3?aJWXѫwܽ>o?|'\onj[d,BuCUx00AD`VKE`=C$$ᢞI ֡S^vG>KgXJSGJSiZqWD+Fۋbd2xs<}&8R.e%T0ɬ6yQMٹ$-oZ'tiR<"B-UֹVr)1wSD.n /0MKR) rF0oU?hr6w/]O;X \8*ц2[?7).ܹhV/^IB' S孬QOzI1Upw֕?2~zip|^T!̘ ݩ"③@jf?{9S87zgrly)t"RwEF8w٢WCGMILl%wsb|9-G` p*g`VmT~, GT*L_oSY^CAƒxh0ʒ'&Kh]u^ZLZƸN lX~ jnC<+7 ea1=t,@ Ȏ++AW< XΖXD2q6ǮUJܱ8Jw"(gK{WEDψa.ʴ9Qr3z7XT 㵎֗[g"˳ `l[ ߉ۇe.ͽ- _N53dz 02NFVjuZUͮޑzA;v V3ed:(J i"L8 W5& LMQ@ɇQZrA(4JwQE?Appa+{Ի;B'gpj\V"8ΐ_D#ʁQ.(.'R{%zO S#L!|Z_ pL7uꉱItOi4tIS*G(ax%sQϳWNFxJt*]T.vöD' żBF̸f5._ў/,rBwT,m| Z !YfUZ #SX ۓ6)Bm?.sT[`F.\yoG-ZSB*z,FB>g2;h /YC$A׃>.[2?;g)1;jj_uTWoREn2y`͙@NՕB.AAW|l#zE(B"-ÒX \Нĥu[NRxI@ښyt 7{u@J]1a@Z!qN"-h Fqs<1Xܖ]{Nxq[CWeP6Cd j0?:ѝdo 9+4<8 BCl^9+cR6513Ī oYFka$4M$uxg>|d$NZn%lO22Lĥ)$bE/x%@8r FlAbMÔ4߀҇EpOQKIFM_Qm |u/>9%(,gLZmysN2׆x+]q|P!J$.!7ĩ#\z[К<6)ն/?kz΂scB[Ӫ04dYr6>y85^1tvxZx]+7zmb2Xѡ@ac졹k5ذ9 ZQ#'W5ah٥=ftk ׋"Г,wzFbA]H b|+؞:AXP'8hf5Z;GwC{kuQFC1vclH {]]!CcI.7ƏI͜;OݜW4WT?̓{i7PWՐGUo$/\e/YZ* kP^uܷx+0nPđBfwƢfMd QȃusF"֯ `@ f󤭶!3EV~EQD~09CG(`fn×FylUsw1VPL6dn>M ,IrYE4 PQ]|nN.bet$d)×{ }>6-yG"r 7: IBv3Cq*AM҈au6Y&s>hDtP&Dh $M ^)>E[XlW2`TOJg,,aPXQeoI |@O%b) 1M iMA(V5>]9F1 *(([`0Yf-7_^eFYpG("ৗK3p==tT[T(cIxTV}bW$v]lqX1֯ gA- Z4p 1moB% jvt*A*.D"6P|Pl&="JkE:|f`p4U7ׄ e,Rf23*uaYM:{&q<&ɤ5ς|*\e w.(E:x)Xg >ZmV>ߒc##٫H)5 ZGEq SÐw_)ʧ+aw־0hc=#*2ק:Z2 ZN( ztlNKkvl#]g*l\3dԚ5Tav\z7N@I{ ժ aNO}X 1  *&CQZ 4(Ez + %IZ{ gklR5>'+V6dC J1r,@%uҒtuS -%ά&Y5L\o Q}ʦHS"āui\/0gPCGk0mS9,L,- jbȒ(-D--Bl]nq2w k. sӇu e _Cܸ5Xwy҉W丱Tx{_XN 9.iX4|ԑn ^SR/Zzt :«]h=]T+HTcu>͏1`Q}MH4  RgGh_4I@|VRN_LY L b<̋mV*ա;;qXCYFLS)7>:U(|$Ձc!̓S*x +?ͭ[ ]لK diU*bz=\YC7$Qe&k[MH#rT25P0)EOGwi]1G7z,JPCoQ1Yå?6 : \X/_1 MnA?L1Tqy̰fy-nb׮5MOJ[Ex:y&[z$Dž!ԏk!^ws%XB^fH먏lSH^lB>P28)-~{1q>hy B5EcZwbdEũϷ^#|Na&J%kf2.fMmH:j)\57c|ɑ,6N R$z:MIuRձPVq0/9HEӽHyX?y?kW 7{M}>*c(;(V_귨tPE2=!Xu#f9?90kxY4治v'j֟ ]Pv.x1[?$80ߚ. Vݳ IzA^κ[Bg$]>fKl‹kK%H<4X1eEg{[)lGLv1M'h~gRıy 3.Pv+ae1;n*B#]ډĻ0DSqIeЬ x\dW0&ܮ#//'qH Ӊaʱ8bg4Psv5Z%~o='zX".ZH`N*Mj)'x5RgJBi[xsDw-NR-M .agHƔhMTA7. [@MO`*̙%S0 P^G<&5 %9}+c͈N=TYJyzW VOݖPNW.BR`,^j8I0 Gy>Kw4 %D,^e7*].VG߲WJEeEҦV Dp,;sa, $8W,ߣKaĮʠ؞J YY;bb*%okE6Hn~ah<2 sVx[[7X!R[|j D~9{:AndԿVҦ9螠KGf)n[GGs e،BF3"h@l+VX윐?|,\Ze&m^Av(/!~C:ʙx Ln,*(QiR=R*<^=|cRG]6 M3}Sfدb|F?^1)BW]5RgbΉ573Hr3{Kþ3ϫ\vkM8)Pm57\C ^nu[SNrw͐SXvA1۔7٧4B{pAeX}'hu@)#EsS%B]C>@B8&t _IF.YRn| 0?:B@V5sNc| P;鴷(:ΆVQi[槃b!GcyÌ8 JkSLC U&D$g9> m7]}qP$YdPNs8+ s3 HӊQǰO)2TpE]?y5 dC1 pFXc*,wnB2g@hSQ.oMg)tjޓ%V1ܺWQNU^kh˯d KTWQW4~pp)iMqBY6dPXk3B93FXv~ϖ^`CF[ z S͜+{;5%{|ezQ?*+L/!_{H4&lQ'loڔBIU'6Bdy۠jpҙݾujk݌Ay7Dj 1RDsCu-/INvrXpUֶP4lّcc-` R5OR3.6B.{߆nͨ 7coSӼUf8R GgbO=Pre>aLCa/`!TϬy3懐.cRνf+2Y%PM52yMezqQw5C`C v6/Ϸ]IEtUM(̦ͮP>uQ#sS\8E8[fnB0LPP ` cLn|pE)5?97x6[6\#VyT^W҅?I^=-]imjXl2ꢚTBS*yEUZ"=!t嬼bau?QET;j@Ymyw$:˽~q1P%2"D*\0 斘KTȭ*jMѩHcigr1[`ȵP(;;kYyTbԶejW)Pn\9rlS96KJ7^W~(܎mYYК0WdfZ ]wڧ\gt|v?8II#1dS.Ule:ꎬ5O0hiD%P[ I_m! gqՕwG! ˆFqχ#, v앓ߚG݊4,;i<{%v/ -oi@eMBvOu%eXд3{Y8~X5ak{Pݤ0poA- G__^xt8}pa¦AadFbj,6b3]td=QrP t 5xJlJ^[o<&6*;lgO5z}o3i&Zr)icE,|:(72g*9kҢrFGj9Q0FUhWF2ÿÜ4sPf5+|͎:A.xqu%-o>6u"$ɸm-^5)fQ}8"d`ZӶ $ӛbkN2XLf0÷ \\F-,7#.®LaIljjM;t Zܠ S)ܰ`q6{.P C/ K$0_FmѰTx50B <8p{IHwAf1cQhnԔ~Pݜ:*@9 tQ42qlPb ,8yI 00T*A4/*һnr6aVl4Y;?# ; _ oL .]ʡ3 Z=h$PJű?>H$eWQ.uLI$^ F2~vx(2.f7 G,Wc5ztzCd|`82R,X/$\=9y.\)wb&?1޶ɋf2%]ř  5(/F_htI+#ʈ{@ѩlM51D #moDή)p[ċ}j?."ӧGuHTF3eԊ玲gbXG,%< xM}cS1;ыsFhoX\-[reb7!լ ە. BAt/]̌0ZrɈ &+/v"LaِhR+ٯM)E~"$ؗ[4G`iWy[Z}X쏇^/ 4GahbEߩ6xoؾxbO^fҧv 0>Aϣ>vN)ڈDŽb`(pX;Bl#yy{7ZZ;Go>(*ۚ9hFů+p;'s5:IկOP'T`[(v -.M~ 2gi07bUYױ{M) X=z:8)zsO9BSւ"K9]z'lNi\>_`gIt!&?=9{aM;q T+F6+%hG&$iJ*6` @@s\2ACF3eȥծHbZekA)l{Jk2˽VZf[={_Mp\c`VOa/ʺ6ANBF% vB]U:lj}lxcJyέC)V]RY6Pmxhk ƈJ#LlyÒopXuv8\o^ /a-RI;7Jhϥ&^rO[!PC-m=r_IyxP3U%BG-ngt/5q t^yg[vh*Bc[jbM\;=e)-)-<*n0P[MFr^H=dk̀˶5넪vuMU[y=DVAm `/Gܞ)VAQ) ~RTYlE-tPU6xYzPeZ^%)JIQMbfj.?5X=Kkz*{[a-I)rya֏pL?K]ŹAҭ覨k_=Iv=_ fSG0IK9o?y#wh oɯ0:\Ou̓Ku[]rgp0ju\=OT8S+$7h.8Vtkr<$<>mIxƆNj[A,>LDp  4EH"$ĕcfCܳ5H:>}op8ax_닽B@]yqj4n R| icF7 lΌ^]j#>ΚU)FTWJ R8BӪ[ |W MEsfSpJ|:^/qzՇjB>~O#Z34zTl"CZdΩ\"mT4ơSN1xr9UUJC U&Y%zz{ÚuNN) 2)#xşz ʈѿ;XS˷䗐VM-qY.WEŝyiZ"FC)7M& ;Kh`Ѹu$/*wE/T0Ɯ2lkW^%A#[Q.׿Sy6S~}(̩E x+ q{_X]AS'te[r@ënDAU=%|U ٙ_GEkaUI\fL_effO-Z,÷6χw5,): )3m;fOX?DT,܆/%f5J57A*V)67n˷!>{rUOC^2 kQ^Cv{~]1μe3 )rbt/h(Z 38jCHŜKLq>bă J~\a,a-\|Ӗ=e,{kPd:]0b iҿ=6qۏh9 S[U)_m6yUi+ y~۟Sn aZ>d 3.ڞ4nJgC.9'PZ rIk*0_eUNVP8 !ҼK1#8TS?^&g} nq):jC H#apDqEϸB'~Ώ5471m{ L{ܧ^A_ ӦCKkh"L6WQ[m#*֔A̾|!NpШ A˜;^.r`mR)<43t]lksBhlIDhWbej@c* :07 Ȃi$ːv1=fG^h"卝Nj(_|3#j]'蛧xENj `[j{xBnFL1Sfywy#А7tɤhoc;)CL~qW,x DPRHkZ_垡xdj5r9~xӜ9z+u_zŶ5:QSWtmŁf?#IZRq' IlhЫ˿A,(rYjM=7$ɃIc+X%>s4LN̅ Š2lNlXcS,7c/o6L-yk%Wf#Q©OX򵋺fVg9`JǓ#w^U9^AV~#mvF_mvڱy9CPr|EOj-bW|lQTV4z͞vDv-vw΍vH4t{sVnCЖE2IssakHoApӨ#eJmq l(1fX^<°ЭѩMbX(< 6@.Q?R4\9~ױ=fFZt9Y\7anL]!Cpe[ 24;|Q(YdX1,,{}zE1Us&ss_Tڮ=# }W B|- OwXn D~A&#ؔWΌ 1d]Fqu)DXZ5oeʯ0 $XI9Np6ڲ4{U‡;]JjHH( =pvTTfeO:NOsLo]lGzj{-r)%׬o)zp"zHh{Wԕoa#lZiKv:^d;(Pǻ XZ,Cȇ.H>ṡhLF&`1LHBRgE%?Lͬ:MNG}OSc{W[ޠU:auUfHjvqi5K 0(AvҔ Tۭa:;>O^!a=_F)A d,w  ZOCO#>LEhR 5QժNC ZO-Ҕ}wpYvvj Eףh$TCƂ>[fxc !(<~ 2eW FZN^w ZIms̞|Y\_/RXe( )joe d)!,2M$+LJ"ߒ7 Z3Q=0415KbPNGd{]χSZFr=b)5콛X$F?/_\E{B WYԍO}L gg}e ti">a$EŚL2;e jwI#Xqq;9[(vxgLdw-beL{زu.>.RiiO⾭Iuud)V9iΕGق:FA֍EB-ard0WTHfJ>ZE\wWZ5 ܡTm0(zԘ}-fثX{hF%|fPy%ɭ8s8JMsKZ_\}=5ΏtG>:=cbH^vw|73q3'cZpѡyLR'x!Rj{= =t 9Y_S>67m .tsz\ 6#Fv_h2#h+O!KtbW0!YӒbPO">R׷{ł OLR7'0h-T-MY@b({3A׺ƶVPlҨ'Lʽ~gwU*S獠MյM+>Ea-FU(Sxy6Z0 yIC󿺣֢xs,Ă CpG 됐Q@GbS[ǥ_V!ChʍIWc 2:G` Yw|w$TB'&Y6B]fIpDWΆ7%3C6r:D|`h61B.?6ߞv߁Z,pu8<yjng#Y R8x1炎#c *GS3;?k=(ln#MNY^;sv0n NAs Ď $**#wQ7^e'OK>$y15ʬGث' Z=aBBQl=H[T|[_(;L1b,# RC)tmyu+iKo#l]G<$淌Oez^>)x%h!]OuÍ7:j ]{% H֓_l[܇N|Kk6%] &WiR14(,GmPv]v| 1#RGR'r#{/X܍菜;OOi#ZpI v}mA^oLGIՐKub2@=;3c-.mL ʻ5T~j-.!?Ķ KbCE8^_rĚ% rP:zƨ{%5 ]IoGqhLw0C.~} "Jt$|>O*|!5nT̑-໾R4s^)XM͔;|='V#}UJptd 7kXtWL=bjW`ֿ?Gϊ}T/.k(ퟛ>,<̵r ՅS"ćm:}c>P 14nnJogN;kťv Vdyڰ(,@ƫcX\5p&>SJ#”Z,gF3÷P'yгȰ$ >E^;f{{~/Ĕb4u0/2IMhřNU@e=켧iWU۲W+]L;,˅ZR]~`!%큪49:0u[Ey%n/?ϔnQ=/oV`&BLX&ODKjgTh+Ap15mEٹR37D ['b$P{)kZV}MgVeC%J)Rz:^5?YWx5@2wuD` YI Ԏk?b^֕/vds S|Ff+v`QoR LGK/PLn!qx!UTXSSɢLo- b3H)Fj~81~>".(vPnIxYnO)5PWy3~ͰD1]} f錸WXNz] d*y[$Uu07DceDj ZrTE?,QEUnMz/)q%%R@oHc,>1Lxt\xmoI釃69lZuZ  KOe eʟrTZx7*_*hU[$QJ"˫O\!PI~ֽq֯EqxJ,RޮlШI H3ht7h؆Ni 7,.z&MH3haQrJn궿Dm@T_KxL/kK&FJ| ^I9)yH7mGy=6lҽ: s^ t˯¬c(,s5^_O*7cESjPQhڬb5^9ؘ[n(-,Bkno$UΈujIبXۍBi7&R ?` {ᏽ )^lܙ`&u\ƕS0Yp.7V=T3L(0,BPm C@QIV圗~.Yr0S!plJ 0T l?F6hUצ݈=9ԷKa^LVd@gN*CSk˸4 ԽDžc kf>[ZZɶQE'ke\2C5FSggVgZ \?LđpK&:k0HdH5͚yr3 Ǔ%ByAe&Ͽ%,' Bp@9xoܥ&Ky~Åe^PIbF?A}f(l٫L2UQ2YgS# E7vw EU&GXs!U˧mq2WVn=8S+5deGZc;D?cL'c6֝̐ ;Y|k♇T *U*ܧB=)u3'=_C0͂G0 ^޽wdVǑz&r`* ~*s2$4^S^uX8-4q e$o|хI3 ]=YH٬˵:rk]Q 6^FTf'U~)ZͩV1=&@7&x- S#Ҿt/L &uR&X<}hU7)U-WXFLV0`SM&@6pXEbYɜyZv}&Uto/vYr{4D0`_Tyc|RlJ_*X" j^Iҟ{)7USXX .M|\f'R>k#$(,- 1P|ORI>⇢iJYB!/ ;Ij䂄ц ۏtGI[X,Y1 ?pk*:̀h j;B}28umLK#Í+Fy>m\¾HdLD}l6_BfD qė~q8ie5:oh#>E|Px$ؖ$`lBiS|N V;]S^eh詮or9Q&rAa=ϑDɟ\A/ Q>C"sN}k=J~O߶.JPd1dlS8@6ɬY 8w E(ood$BWqVXԕy ߶S^eP!,VJhRb9DB*ҫrW1 f_eVvڋH{5ٵo'?禫엱}ƥ2NT T| S,#=L:ØtW^HJPX JkP%mN^qYG!~љQvl{/aitvn2%g_5ڙQL7])$wP4"[S|!'JZAhz|8"vv.i3Ņ #[YwWtN7PUrCp~PUGAMkkS8L^@WK IR䵻 &| -p^X)7zuMe*?LVv _ENlR*wS[o XrX<@&hgKT:LMH7Ot3B*h/%$LOl@"B}FKW}x':UwVG>{t͚֣Zj(.vn?X)ِ3Q{- 0{xAV{.}OxLŗ ic#ғYm\(p9D7fn(ZbkF%Xl 2y<7pn-ZyK;]JLpxd_hb3XqNK^m=G,]v@Г*ZD]-99$O^yY&=ّAF\7U왱=[?z)ƪ97i*h[2%}6dQD.GGsZ)l<*?([zÈ%KNx툀:fdb8 ŵWT]MR[C hnm#6qTl=2֘ds|Or-L8 1# 9Xnr9e gC sڸvrV0885#*d ɶCN(o;J;Vpy7RpUV,C=Rs=eJh"#& )SK6,i{[婫jI!l^ ,q~lDW]H"v/?"D=)Nv0Ԅ. , +Һ= c8[/JmN|;:] :@>/sF &2`_Vu\\yHÏL`PM5dث-8sIl0D0EIT0fo V˧}[{ueUk?D]٫qJ'H ޓ|fTd[!uZ`/H<6#*3u_MV`bU,պZvD $w陼[-iE([ǽPpgs0rG!1sSo qA|s`ǻ?a\ڕ]Uƙ) Kh 1v{=aLb#$Ds_^1$jX֖ŪIO-0ԙhc#gltUsEKM;V[z60l}Yo9|ÊKj뙵a1e^%!Yk,'{9ssv"3[ZAM b)ʗȹ:א7|3a[-AE}:LÕ\Y~UQ O0K+]k2Mx?!)x6f>jn='zKa=F7v6-.Tί:v{ 55]I+l~cW٫u7KxpuBlBҩdziRalVAPF6xVh/cM>\2,Wy∂g Wa^OUH}q %dMt-:=`AYcX7t;db<,m[ l =ס{[涒XrXJ`\#MX6mOߕX j)۫zbJbu_Cw(YI>tʳ&K6)aeQ6]`Gr*hQ 嘜]h4XzQ+=#L h{й@K p{2Ơl7S ywՒ+z,Y%JSVg_'P?veP" ysuC |bU$t/4J[%D5ϛFaS>4@b˱cM4>7egT8p63W /U"WID6>&2ƙjL?zTa'SLJFO=Cĸ \/ea5)x/2G3Yw^U~rD u?agSu83S26?) ǓAXIⰮ.F N%]"T;U% ׶{+:Մv=!o#;|kh^g h&?}կ5x1EW[qG&0LQH$2Ljoe^ţpYVr}MW=z{! 8o.cf zA grY˯8|31ie{5zrnVfE,٬O<"#-g,{ť75BXssTИs"Ic^x5J :;lI%/0**;xGL;-;MvɛE7>U0}d>h9/Mx>9{P5D񆽫299qr|p@luVQ3Eb}/QN͝2j'44pziBO~jPAmնr+?[j*/OvD W}8UuΟ}#.bbWHfؤϸ ah̏<$~ A}Z瑞`jEBX(*˶aaDr+S44e lǪz``q0Bhk^f]29f ʦ47Xհ:w^ Z8d`>ʢ?2DNڇJhxY^2T1jK@&̨7 ,#Ǖ"SO{D~zU$&/7T`o7{ƂAWW2V(gcf8{9fꂟ =`'  |nd/#C&V?]|DҜ?WX;m)oٮRjbM[u[$3V2!k,ϷG^^L@.}1s7eKkT/l!jÕ{HЛp^|#^UYl"5)o`㕰ޯo٠~#n ^fܞn~TA"'YC4tHƩBH-L{i_gʡM~Bj<_^}1òo\RsDHx>Ůrb<صӡJ_e,p7Khu\^\dO eqEEh6&WH*FS.Bfܒڄލ,mePSGWHLUy>Z p:x'P# $`\!-:';4b;zj!=RO܍_fwdž|LE\͜Pޛ e6+=2t Dħ[!f[h5WV?GBei"b2c L=(#݂Wsrz @sxn.yep[K FjJ_/*x s^AztWUGEL?8(0*U`пG iv)ɰpVcj 쑏py>?i9Ȩ)MgG-̤WkHG"_2;%*Xc̚nLj)`zO}aIaX]@ei`?ۙ8BLHic%ZIDӖFtBV7P{Q$b:jMa9!1\󲥽t~f`R=~lmblEau+ņtw++4HsHm>,ڈ9g(@smu)uR?>X2LΏVļנ9N0!z$7YG%A3gx3 ̌T= qv^|߄CZ'FןAD- '&|-ހ;^ӳ4Oh9[FWOmE9׎j%V݂22,y]NUb9Puٚ m㎟wuH}o`xzMn]1je Sq^0J:8ek|({%2 <$,JDN&3Q72@9Y(s_~CB$AT Vg2 &[ 8:Ywr]`-`N]& a4e%5ϊ݆HW͒$y<,ثWj8g/#'ťK\e՗*? ߶SA0 ҵrK!V{הV`£S@my)F]%EDaVpR880mK&i.#氐piofE- !G[b"*<,u`'o)cdXe6B8CNZx jYm=52K- ŶPco@amy-x)l[Z3 0Oy:]̩L Ҕb ePQ߹UۧQƽϪQ[,J:%I"9F& 2]jr}()%`Brqt]imGzk6|͗*0z]~r~manQgJun+>{lp&E[Eb( cY$ܜ cKL-_©_Qqd;# "AhSEs18spk0I]!^5$ gg4i3&dK0}i'4 `GMy^tbxW(@/3%M7#SII(vgFD_'o~طy&e-q6W6}x6c4_VqXH>`Rf kzL5y.M/Mm R?#Y~U˗x-/HԨGn.㪫)OV m}:?N氺̱Tq2T(aq'6c.U{ŭQX[`Eupm!no;нzʜ(˃RQH.BcݺІgɮQx4\AHXPPmc&c:n쓠$}"|9x vo#t0/A `Y:ψF"JoAH̗>(X?bMhAܑt*8OuoW7Pwa3zhfۅW fV 5:[@\b:lMd PVIp(EX0O4G)lmPfp>b:zc;#>%UKOڙ<BF4 j/|rZU.6o PJ}!n%vHhSb>sk5b6u ns(dJ^U1^j4_bO7amPc[W EU+?k+V?b+ v܈/$L [*WT-ZX9 =qy'S<`NP$;,hu68x >۔g]<uhcl/+Yq<魠n?#&KMTH/tfpg1;_c%Ia/>ƣgh(]_Ժh-r#%ך(C>=$YA+jcgUK_Uw o>NΣbÌںIL[c`A1\vJ0D|,i|ƫ#KIjAIqgٙ7jaipU.3̚5Xzx@:L. 3jjÀF $mjd́WfpVJJ?')M?1l襻1fD>'?Gb8rPsѸ }/ja``C5QWi}A6^FwȚׂ̳ͦX6GzԿB/T95 IϘݞ+RWQۖ|G0&wk8W q5zd"Nw.tjl(X[ ٫nM^eOCh°ZNG{uoʏo<:iYY +mW6 eXEC3:o{;pZ>ٓL-cfs5jj3snCX)NإGw*5F i .ʑ{Ȣ8Ư&㖸YnsTIPûB%?턾秪R}1sg?XMQQCkKk)'g*oΑQ{Hə6-yߩl&rQ5(L,V8[n)5:qӬ L4DCM[s pf)IPCo(uak',|w.OXaJsQi{A/=ɓ]( |]N6OyXnA5_(˒h;h[p{b#yVn_kY6j'' Z ftg)[DmuƖM*hɛmeKW.cȩ2lx,dZ0HZѩ/h~gX[.Ms̓cMzWbh% x4ߝL|ewyB)K3͈٪{eMWXa_Z};UõZȌ|{J@eSKr*i?.ieR- ;wF"gGLO΃7޿#sJm%W+Qx"ߙK6+ܻ.DfiO2+}UɗwIL_ǿD\ig"Y> $m> 9?w(ՒlMk,#n^Ij??ѥ$Y?h;no0LV=>PsK[FU,O0c> Dp8vcJQ oaUTWjgiw(<=t@ZyK oMr|*<*riIηs ݮ[? 0wx'2'tD :y$ZNx/ =CS!p&{6>m#I|aseRjth, c-WqXSiuΒ.8broHCy^}r;{9v! r ]}FfZi~ˍॼYEh2W%DzhtXo2ڳ둙$c0c%ʐ\lY)lL*ٍ5 3QȇSKs<׸L/Eʰp;/bkJ աWG bH1 LUpRW3b+Z A}^mɖ:nP`_8Xw\g|Pe)><}4\ј9ka`m$}t%d>~O-޺ސMMoSN)qk2!f`]D12`-t;3DRh SnS{K4ي'ǔ95`` 3[/"s}nPk LAgKR*t܍ .3챱WD)i& S47Ր @=taHQ`͑Rq  Tݱ5(N  =G? [Np)pK4J6d@+FYEzlSiX;&rm7:y^EhWA)8+jI=m2eOC^yU QAOp2}]t^\y"Yk!LU@hhWs8RWOx >XmXm,܆br5?hBq5q;vݧY&t˥ 6#D0VslVFBAX7T,;U]=,^GLf/{ڣU#M!GͰw-2dg5J =QC沎pV%T/A4ݨ)[=]HE{b{F0h"څljRH.kxk`P#HgEY3Ty.>`7o~T!Kj*f aکXY-2&ZWg#ܲW(@UَuڲVVqknaKtr=Ç3WP@1]Tfsc " ;*LS{*99;wC爫3We"2l9ec9hgvWvjD֏ױ09OpR.»orȲu*SkSɉ8 &+|,{⧐EBXSD8QHk1.<n% -9{]%45f^.9z$0@!h4}];p5}.Sb٭pBWZ#OIquap.CLKOoQ%YJo@`3-.%kj1J-q37%呀7 d%pI8xr8[Om 0sXdKa8UƓ)/RVp8xw,CUKSۂ!PWf98TG @VJ]ɚr(N(%oZ(|q3ˬJٶ%lTBmҰ#ظCʤ]ŋ~4􈬖@'{Tヶ-I}h'ܙ̥ 2{nb&X^F᭪ ƆvBQT] Mp|$U A;G´.ڃ7`  PjS-\X)ّXBaDL7JJ33E(:*BwTMc#Cm*:s Qah(oSo0>k e`|[fJU%K! T,¤+֟nqKd<Ś|2~E58`'/!/J<0wԹݗ/wA5Wd2{Oe~f&YDB>/YCTGEfOV܍a{`Y4,u%C&9ݘ(ry7Sܯ‹ cm3U+_j99ca JL}yMX1t4zY<-2F78q*,ڔCZBC3VJ. Sܦ:slm{v(\p31YCo.M>ėFk;~|^ K:lIbJM0WH!c0't|ޔ<Ü]FWf [k6xOVS*#m iҪ[{"{~-98KVc̻Z|&)i a-z#6<5 0h@6WTV,փyVGzd>C}ΝbE|^yt|4 mGÝ&>{gN28ݢ{)+eSvtTmK4~PPWgXɜ\_aqA[d`5Vj_K`;Xl6,{ ׆JFKz(-ZѧlXAx1u`&DD @:j".+^]ESa[jqePDFvd;4[->tRTެW^DGiwz [}0/ƭgɍ,e\̪"VLD-hJBO|2gAdZt[[d¦W[ITCm̐k06@g)bu:Ut~C}w&x1QzE/ThvZgυ4P}&RQE#1Iǂ][@$?uDs8̹6;}h1db(G`ymVG,LJΩ NяċxE2!IvqKTbNii Sm%:`i rZi oW%£ٗ푏rpR`k18^U+ugVϜ>oajWڹ>>ҶSt-D!s^j[D#?CINyA/i s  L 뷪w ֐eWd,= )CTDؘʏ1#b)EJInE΃U,1yg<}ɤā@EraR+zx].TDrC,0Oeڲ\És~A8wt&GG{yd a!i$f)|S1ub,`Fg)5 ͱ=PWG5in҄KƆ6ǘ0xyՅF^Ѱdy,^>uWG& Y}#ڼ~ ·:ƁdX%X"EIJElՑtْuE̴Yd;V*KSsgweè07>tR-$T~$zm=-RPzU>V=X|[ VNI:6(]:u܈zgkW3#qɌƸ/xI{T4LTd e6t52 JRWPjL+QΊbB *ESoQi_4$^cB+SZD"JAl讈U1Oa#lwrDjɕ(\j oW< CSMnI-PQF]gWd PEP@+ܖ=%SQxl5C|]CX^gLRahg<|&D+Q37m hE' ԺPOoX67 .=+bLnneKiͶ3x(zLc#z; 7nSBk$(0wѨ}EjY13vcXT# Y^i̬Q6T m%.䜬e7zhb(|B}59M zAnH4nE-LD$¶#a֜x\ЇCIz?:#)6b46Z1^щuW;%=NR~z7Mpm$tsBG\BYj 9oJ[R{"_ݼ.9q'6yK6Hi,)wZpQ,alFLz=ն֝Hy7Wk}R"bP-S=P3d57nS *FX*b.mϽ 2IAxeXp8di z62-lN-ǻHzzHi[K \ grCl1iDȮ. IG<ØpvP!1)WX+aC6 |YYno#sesl ZsP/ x؋'a Nm\Y>ւAzCؚ[6DDHs]ϻ:>@馣a\E=ɆJ :U^q+c"v Gr2x*'J+JG +rb+ s05[VTʻw Q^J VGM 8겤OU݃`Kn^ WbAl }5^emN6QT /WGE)o Vx-xǫ$t@HAZ̧*F@Jk [;TǤڝ9c4/H@i/W_:jd G{s =C_֡Yq;wꎫa[oP֎ǫY6h`bn=5u3Y*Bnm41[s>{hkՆT۝?Jݞ^z13iGJ`b}/]f!Es|bjt`)g bǷ)_ X+\T,ߓaO"bѮw}-- KlwYTį:z]oLH#cz7~uh4C7ie0 $KR.unѷo`l)Z"X|6#@Ȟ0s0X.\7+ 7W#7% pB}Gc6Ie)W8&$8c56C̉ #l  "!VlXkTlq "=HE fh;V`a\Ie'IUBt,:bv#Ϣ;q'l<_7K+'-ُ| \EHtd+BMjIG9u`?tG3GS#FLkϕzP˂1%ڦrV?r4$2-f:򜥀"qt LD"B@ϳ>/҉ a#~5\+WU|}J+NEX$1+[|+xd \¼"h؊]{YEݤ1jbxsb1z)~0iS8:\];IG ~ iua2(v5,-i 83<>8 lKw*Wؒm1 ;Da~qEXV"|)N*U*Α7W]N$ Дl R˦of-Mᖌ~QWƦOA Kq^!qn6tDf}"1nqwnuRh*McM T!KMm1~W.b}pPaN(y㾮27RC,7W㤐 ۃ캕S -RR_,yU03jbK+ܫ'q ԍb 64A kiY|܎&գ j%+7.ez% ʓSU L\}\hX..Rj{VYTӞP7XFrd#=zw,H7zaK:xMO:^^-wg`,N(=vLa%oXP*@PPZlXʒh"Ӗ3'2f4x`@LeZ+C(D\fȠyׁVic88$mb=k}1[hW ;+.$J zTdWL=hTR\Ǟ4`Ȣq5bA(UȉL82V 'E4ӎp~+ڿ GYY|p:O?sULjaPN퉇葏iCɕ+-FIGf,ٰ ɘr:2A*Sp|E7sz}hqv^0/&]-wN'rFlnƁ $F mI`ݸg`[\*#1`9ZwlM/wB})nW"<ɣ-{!76^MgAȶ^d ^o}H%+E^(>ɟR n}X;`K (K֫ Vtli VuDU <7kxJbt_"0CpG )-\k\ ߪ\sj~<]\s {XJ>&- ZR&۳ܚ cҲ#jiUye4]ӆ.Tv{nﱡ}G3Վ2d=BCqkVb(h~~0KA{!EݦQh3g@Fl#%|[^ &YW T.sxͭvJ)ڦd#ԫ&jSqAݓXԪ! ;iU]=rvp#pC2a:PFY薌Q-Nq=ǯqMpQ(7Ge{.ul.V $R_"Yfyh'EC CfVͅ~ݣ !;Ug}A~1H.@Ⱦ z㾺X'!,H:jh`EG^ѹFW b ~if-cތx Jգ F.`qߖ͊IO77tAD0yl o8Dr/;$q#k7! 5.ic>}_4<zg+gIV4O5[, ScLJ]4W-(>R]-$8P($nUY=2JǒCF]*xx)K&(k]l5ͯ'oˠ-uڥVvp1W\ ctrHmjU%CQr{n0iםŽˈ=D GI50GCAhL_lV!|aWE vKwa\i:>O]ZVzy !4 m2uu/zWHA pzf "`@.4U![agssmaP՘չσSױp Rg,ࢣ[XwFaecn+j{:  UHZ>%>A ҂\$^d#HD֑~  YE>Z&+d(SJ,zի2d Y1z5_+GpE\6JDKnN`Q'@Fa+m#WzU`賨ohkbx+0Wkviҭ+K-/wY'Z%\}o6CSWt_j8j}5W=r!̴58t `% 42PKdMI䋑m౮ys_9as`Xn*fyv3Ӓ9mHWE(6 NkAl]>jS,ɥjOC˳v=Tg#IlthGb iR*CD$0 @MWF X뗴mQim&*Pl hnck{Dymiۙ i1WAeOsuc3`fbG^B;Ie6:&c%F?pX:|.oH&]DJ-IRW|^6^Z`sǖ;Taw8b]8QiONًr ZzM'[hrHmtAvк1'*) b/|sUAU6&iAEPժ1Pr0Cw9 L2ͮ]7v"ۏdԊ3[ +TDЫnu_ϡ5ԗ.El4 sM љ]trك[5!-t,oD;־./&s(>dPdMc$ 0kݩt통L2PO؎1Jֆ>hT0E"d_k:nC W]egn,;I2Yձ)W*]+U4ubT+|4DUEFĈ۳V^#S]z=i"VdTM3ZSJ=_9;==^S[Їc7Kpdv,E޲ٶT+HV;gSεW^U^è^5)"I@hzU*Dւ.{{GЂmܱ:)%0YIG,h;:r(xD:+N^)Ю*^SQ +@Uuir*1+܁>iCўnjxYUsQ|1@&?4Vg Bn᧹=3|3jũA, էBOu3q*&xS"^{Ms:RwWY&fW lQ^Q!2#v5MMpO@Mw`,īLe.+h(3ejE#TneA^r4]۵OQ$bWc(VUlcOߧ}!̺jgXkj@-'C\}虿2zIy{mm!WlLi +,)sh#H@-%vUy! Wy \zfV#80WdpRfjO@}; 5x5(i1/d;#GtZ}l蠭i^?5NUQ-.D;zhЉ- 2WX+{fu2??wWO}']#֝d5!l*b.<5^!3H4Y!)ܜ\!`CW%ZG kZU$`tHp3M\#`nvgԹ5e;*l(^\W8 *D+4I9ESH'Tj6JnAZN sz_NvVS183 75#V)ZC-ʢ9Z)BSK U"q:fD;W 3М(xPAl"╣Wc;}2 N1Y 8tƼ.2 LMͥA^ŰsH3YrݕkO:FBJ0Z̨a{6l1y߁\>n6Jmʞ栔] iܣ6hOJ<{k#Piţ߇sFUŭ>s*D@~)bQB-1)>m_;jlRo-H$O^YՅvwltL%@![R+ʤW&/3R%جWNܗA L( (tt\IZ5> *jƂ/ؑn36U$ZFC)R E'1jÊINF`^W\e5qM.9^P9a To<]?[).hb(ooܖ*eiCQMk@ذLp~0g EcvyL(}AsJ謎)|h BTnDUH.CRdG[U#/k-P"ALPz"kp"?$f LZ;u PrpѪ Ә_9\4pg>hڴǫٟ+H6ZeήwIX}[W`\B+RP{y0GvPlRi|cT̽Sv 5&Ѱ4?D Seay͍soMئ=ratԢl Ų/[јx/bR^#"Uϙ Nzig0UGMau^ITPP4bՒ[\Q-4m!lv]s\ I9=Xl. N+47SHRl(Gۄ^X(@X=4 &#Y4k,k`yhGS+(ȔxѣO'ЉVX0"ųrl/Y%3OC栖E~P\zu(ԏ”yQ ?]:k#!' *9mԏ:[7DDP\ W\ȺoEˢ`r{A`++%Mr ê\B6#G)]9\RShvSo#}%US 5 "4VvX,8EڒT2-mGaIUJǞiOG,+|́]կ"ݦA}]SH`3U۪I)YN$!ho>Ql7 {ph~` ¤qSgSq/,gEJmC@ؾٷ&Rͬ蒱8Tn\-oU39 o"YH[d9JhEZV %0R-dP;j(扈ݷ^I`MRO%л*ze%^'caceE)n@mj!_6_E_Z@Yv!Ral;N0#*F57_Eeߦ L[a֝ClŦW e̶2R5%f>K~iXCCȽO\blRto@x\((vWYH,}L1,ؓn#l~Axx17ιN@鮷B$ii nSixwJ]1x˔-I؂#Ff="%AIu%U fYو^. +@M.jm]+ijy/X=Pvf%_ B;N3lP\%GzD1 e*R\qb勓" 1hd+zQFa>ŃoZ2LéVbf5<Qh9]'C(dkKY [lTQaAYX#}^+Y0 B?^ݏMk-Ӹ,>}Nz¹r7띃y]f?H *"N>4.fOSfeA]VI*|ckD?vHc k:44v$G;K1i2 k/'xJL<֓jW*qZg̳j8,mZaBByUY".!2󸷟¦|Pw4R^-&m+͊!H(݄ ]Zϔi>ӱpW&z?zaFS424rPQhmRQ"}ɰJZzz)^5LI^83yγSSɡM*J[,%YdYJ=JUAT[VXTT-7G}]~ۂwhWAR&t3n0R{dryL)h#,~R_2 knp`pZ֕hz<>x–ȝF30WZ*Y 5'nVH6y W-eVVVO@[(dna[{NǬ-k|wS\@-% rnGCBfoq$܃ L-ֺeb5 c€UŮiSXh\t*Z {?Sʏ+3_LE;@q5DRWu`X]IvH6B*M8m 4+x<P"B`/3 ʝB7g=:vع!Sf@p"4"t-^.AXט[Xس,yЪVџ8; dTy1Sy+V!_ Н OA"W{$M.Br@4 ­z6\lb>uq{(T`gjlFAIԿ6fs{{LS 'JaZy{EQS'n'._ *ܿc-l,&I#z o3-;.YE WK@oo%59!p!-)kE WIX%z#$2SOu_oL GQ3a 5U?PU +Y|a^j8Wޜ!gJUz;pxrZգ3VoaLJ0/AJ,+2=ˮ iuwL{fW=| V5u@"he^=t42" ']EH!s`cf`339ќCW03LB' "d, leWh:o}#ӡV)j~ n2QH1:+p;DZ!wںX~.[ = b&lTR]*舝TߘOjJ#F)O]p#~끂&e7RޢhSK%_|lhX!ӁvV](:"9 <v.WνgJ _^f(^ؾ]@b|D98 LZl фN7%)%* M>_^a|尨8z clWíYX6Ԃ~lZ,4^e3z U=a&M"T(7Ϊ熑ɃDl,~g6!GheEέ4ECeFQ$C3!nVL\Iz&I-r YҲ9pZvXx]NA&bfGαcG䘝f81cǧ윓n] fIN`d@nYe1TX*muW5TUsCfwZRK0A5FۡuWzC*-A g T!l*XbUCW^*j рB8O 4֔Ǡv\=&=*Xyv累_ ޝΌ{r4і9(EgOoxuj^µHt&q?DPw–I(.Ϧdqމ#5UHҚB>tXy y/:HZtNS-M?W('84;8/(!  RR*F^*̪®0t>DS7=2P^B#Necso>%RT΢qpQU]47R2AtP8^VXLgۿSR1O_1fN4X19f:-/P ႙!-$2$$L$"w (}h֕E[3׉v$$N0^zQx}*+I1oFcU=>L픏,[+WQڃL-5*jD]wV}cL7eJ楓F"A/Yw|vp|IR=+M~ KClϗ =hdYu\4NolnѤQ誉hfc4,5T@߂5 E'\Hf}|ٶaejywl!f<},db@"s{Y᫤HJHը !KaEugl_[l ˺6.2t^rY]5ZEӥ+-)˙_3+GwJ) 2ksO彪k.j״jinގXoT?}X!75(}9"YzH|VRX]_ |bh7{ub#Ь|:90?w:ɑr9wŐӝ/dz4M"MpL2Ie"YxXB`Gcf cmpd:rn^ :2Ak0啝Ind-JyhH~V P?XI TL/<,Fq( PӰVՕu5C-,1p̣)L`HG rV<**SaUeăNjƠ0#^DԂ!bewlmd肱T\ud'Nn={"[KoOȼ]"Nj%sy*!if-u[WNЋ[nGzZғI0=mΩYѦ D*đ0ҴPskbHW02+urVί/4䬠0!/SnIu?V֓ %=~Rɓ~w=:Or7Mrws rxn3% d`X{ >KNՒ)o:A[!-S NF75u$*rW,FDX?tO΋^USM6 ]ĽT4(jdyX=9PNt0iTévj=WGEoSbWR%uoM sꮇ)!-H}4֭xPA/DluE9hrD[8wj 6Q܊7O )Mvا:yM ][P}Mo>2Y1<P2z1jF|qv '6}wg}ǵ,q+ݎ}<^JAl)f {ݻyaCK눶K͞Yh.17C4@P0GHo_BW\23/{g0bZ#ĽnozD-ĎO ?Ď9fG gކww!1GG>zrOӧO9GO 2iis''ܱ8t7fH1!z6\qn͞>)6|0>QJ']\>TuP 4C0J5o/VS\wh ԨNLU<|oi*7Y㮝!YCeP@yҽ?ך |YeẀjq6UyG+ x6thp||,qg(VB:\\Q6_2]5E*3t@ 91`*gPKǤnkEk-o+E[C5&EX{ě/ΌzUkQM+A yh_зJzůO.kCn#o#(q} ^c%la6 P|+:+ntnI+7̱q}#~!vWtg}zU7 on%az(Pύ<4oVP}ޥ*FA F.a:|\gE)4˰{֬A9\I,bv8; g b7d}|{#sw~|:Ng~ٳo޾kϞ=9ϧ|>;[~Ow:v~t:MiMNda܉H=0f9ڃQѮ4QEx%KlAG& =g 6OXl4g6&NE^q|U-̍ (9GF 2nT%6«zt;nSv%dv/l/t=$\ziJ漆`iPJFj9chC36iZ9:$AYɢ" Z(>*ພ|1}id)*+amic)Iؓ%oPr)+-mRNH ^jXǍE <Go6wXn~o=y3bt$RTŠ}E\M 53DzXkqj t^~ؙ\9q%CQծ؃M~rY計d|0 2~ DZes=b\9d.o,@e&oC花ѵj@ q'~4\ qZYzaZLFa,7o(f!=|rD[cMjCL>#tؓ$5. ajj_F ZaNY_+L7 RD;T͜9V>2ƾZ3Wk]SQt_sw e%<SbF +.'·VΆJQwɝSw9Տ%X4Jt!Bg V@Ǧ+6 žr5%ʺ$9oLDd* J$bOdtɎV;t?`^#}7^NI^LӋi%r}kϞ=_ٓ'O?~ѣ|>yƪNN("՗Wq>=zo~7O;i~?Ǐs3fܙع΂DdN kp `,*{kv^IZzeeۙ ?gn  uE*ƶ.rhIV^fbr!ykiLhܥJ幧aEx b] fgFy~ǣoi*D!K>lb==E /P502in-z.*hk:FzqajrِOrẸZmNǻ} ñ҄I0-LkW6C#@1^>X'ɤw BɊ@F]uN^C7<8N(=p=**g埬e9 9^R#L"e%e۹vWx@8$׃2tsM:\pP`Xl* O*$[Hf+)W쫕Uݧ8-k*NVg:N@Ô=,Fr\Kc(G>SMD^unΨ JOZ)r*Y;i8|'!Gڼy a%iMbpa[a%}ʁc` \ 4ߦC+>E(F‹籀CHuDel"Qw(a(@FEΓnvr9msܸ˷X}ظ* z +Dl\uRֺ jJg +\%$UW۝iʕ8r{1\Q.}yWN1)k#W`r/( #a1EL?buЉdd8\~̽_oc4.`"m{nz9ݽ4O"z[3VӀRDpA&N3DdNS# gϞ}|>O~??g|& 8a& +ž,tX)3Fw.5dAxy q8>/ ^Z%뷰j::d TӒ(j%td ŝ"%_%T4 `׸kSΛ8=ⲌiUZg`:P!Zy=]c DO?UO%P`xN2-iAڳ 7^!i(}iL2 uZY鬏1"^ʍfmDBY R]VFXiƟ\[ebr1b]dGMخO{ܞ)ƑeuK6W-hMʱn@u]ܓdXn.ࢤͥBĝDMCs mdb2l5ir5FZ_"ڀ斾"V{9-_rQ׷lFf5RNOB:\Jʈv75Pg'Nű{l0[1-Ş W1% `;&azrez[r~ 0r<\..gϞ=ɓ' T)#"`Ť+$ ~Ϳ*1k}?oGc{GDr a x >]}R G|}pSuBwUԨd•tq_m 5Pemɒ1*R,^'?(mD70CɑhnVsC1(9ӌKEbF@P@IrT3%ii!OAᘇPl<,'zmW%l/UNEz4=0+ I]̻SA^RpmmP`%y/\j*7BhTA/A4Š.qf+zt.g ! W{vD,ȑcn la1BOճF6"yט|Fv zIZF{`:UϤrJ zwkaLS$cPnK{{Gr[Fr#u;WoO6P5I:<02vт{XN1}&!̬s7zldXGf,A+ap~T2a1GDazNޞTbfa˳嫗ϟ={w^pKtZs"2_e`w^~/<{˗?_|_'wi؞;lekccÃ9l?K^ BE#k"`f7v:Zq؀]ŰY_C`uq*sT#;kY((㲣0n[JRQ:K(R U #V;7o]椱 ];ȆJIP+{+d$GΌK|yy$Y;e#d ج<:{=󟳡xtZ$ ) Z92#L@a#T%{'^y/?'&gb&#:t ,壘ڑ6Ug!+_S#pقZxTZ+=2:/ٙSVy^Q{Zb(e08};nd Ϗ6\R1͎HJ7Bd2FЀVNZIDA&s+$fy:cISaR*U^CV"V=yHkYkx$Ց3AoXÞJͮ0JC@(UFZt-]Xj)VzCҰsJ7s5>H^Ăw]4qO%S&3j;zcqr ΃;VM OS BϛgzyDU"z%{e߲ Ө6XF@lH:k0 RD7UAGr"+A5Q]GW&r8]S9e{f;N뢙_yD(cN!]ߗFHpXZ(c[TGW<2/ Jb^Nr^iObU_^{-kP1*PQ½ *5V4n?_җ^7|G?_;|OHcɓrNH.mX6xgT)ϊm4x,i6,#qfޖ0XbsqRY񗸸(ɬx]mzE7Hv,Q66*|ķ䌰;wq+QrE95R}d]Jz {A1]uAWQ-ư<#tȕTj ljBMt=P+餫J5^\PAsZx~"`5~=3 yґ c\cf2S RbUbL Vћ4`}=a|΃ekߵ hnYH^L v,ʉW.\EЫJ` w?YGibb?8b3P%:~*Sm\hfzQ*YR<=VUv2t*N3YG3HN,*`蹂g[`\%tREgwf*U\ @rǏ@գGNVuU< t$[ ՌXU7_ǧ>'OoNBpw21ˌ]x'[`,d.I膱j|C {PS"m=5i$>HQ="=h* Z%hF^e 2LJWW [{;nudx%1Z.1SiV"ֳ)+JPҭզc +%*`c|Vn 01ǑU1Zر+ Szmn$#Q)ME4{?[LpX]Ú6ZwBD,PgPT3dD?(TH8ȅ<- X3t16mN 9nu.] q&-~;7v\To'o7ūBȵmদ&b,cwjc+s=)j%vEQ)q*`N$+y=$Z43F4(40.Cs~z9ݽizOt>_.kg77w{{{{T_s*l³2ZL ιo_~'?>O?=yǗtb0$ +/TYBK: 1cSd| K<~:1ds@YtڈcKd߫# 3T)IU35#aX|$|剘ƥS){L/ ,(>N־7mU %ڣ•ARTTʰH0! A5C*MWCo(X$3I -7ڳ l)h5P[6+/=B?=͝b &I`/NZG㻆DNUxj.'-|7Pc$e,vtiX""tDzĶ*'D(lV8GPxpѫ s-=zcVF9͡YYgsM;d@z۰5w#A͑=a?'>tLщ D$y9˅GeۄfaW{W-ư,2$W'ՙLl[[bтvW'Z=[VXg6sc4(KƴF] /Tg;z{ fϭO9?5I>lAPzr&)3"'Yr^Z`zj 54Q]Vcf5eu+2OE M0?j cBCJdw/yHsAhZVNk!O%~DO5nkWw=@@c)=f|F̡ga۷(-zm@g[WNk`m!9,#ΔwfQ}S 'P:";ʥիo}q:x%V*2PZ 3ٕW0BlJ ?sۃs,,<)`ec-is"xŋn/ILxlsGx1MoO[wӋiz!Ӌi Q}r3^U)Jk| 4֬sC";c+Dr7o'|Ooh#H¹cV* sZxUB[DX̖_^ bM9XՇ"/E^LbޚޚH+ͬQg4U_ 0tfUϟ??//{_OOoobkHMD'&S0gvI:doւ{4d?gY\uRV:9\mA芴_FLg\q}ÇmsK"Ԡ1͙Oķo 痎%B9q#*$I9n 8OT6r܊:֒&*ONuv.vU쀳޾aȊzZ2]Oǯy%0h8cz@ Vg_#d7IuK" Wr2`>$v"Y BO蠌j&9c 4QݯXk NVW]֒:^EodQMk+ -fӎ?PmآIH9 Γ ܜj` ퟃU銳}XUzTJê\Aj}0 8s`Pi9os&dKL zwӋizKww=MoM|\nna߸yryiRC0+MgU"a1s3Wt| _?wy?|A/n==ai0\ӹ$7 1< KCt=(c45:oWh Z2eL᫽yP%aqfS}loꅕͽL+eÐ6|-6}T?D)J%3ݒVFڋ縝Q ;ՅƊCZV'It@aul q@ 鬟y#j8D9o\~\l-˪AtHGZM esZ)ˎwƚձ5:IN e~ܰ z浥|~Ym"W:Ѓ 'o5*ǪV,XŪ8ŪV+T܌1nV*0֙if2v2a!Z:f!0ѻbޚwwoM_O=\.77/o].j`>{óT}^{^|K_?^~?ٿHdY[ /hMIf.L6ֹXz(|tjk0pr.3`-V d-}݂|o>߰YAIj0T*RMGcq0%bW v?kϕN}pG+!aJr>(UUpւrѽJ6ֲOGp+=Nd7gT[;0Mc7l?8^UET)Q`Uc/G:L+N:p>8g%yr`.sDѿO^L=zt\.nNs|ryq8ԑ1̀Dz:A3U/CU|_Wg?я~O?/~1ώ?a,!0~,jױVIpz&cg|wLROAj,΂NUҁϰeSK0{tXM֬ieī[m(Ǿh1#\y=^-3f1>4'[^ia\~P\jSP% O;"7h~қhgRBpm *Ը 6n) RL:B@]1y~RLik/r;M48D3IzplLCt6&h @cX{ڪȮh@Jت3N#ܪc GS5#{߄2itx%9Kx9leiɄrnbUKQX3(Xނ`rafsaz=:_@8͒ h<~?_~oof8s+TN N#PmZ-Q!>f{gp`^BO[_!ڛ*jbd碶|g.PjM<(6ű ,4NZ#+2UA/,++"/1+q,t Pa֎-,&b őw5lRXM{ʣԝeuT&|[7O<5 gk|pb\aU 2U媽|q92;qǸ;-td8aYCoTc P3׿?ym@[S5Y"~*9Nַx?O>>g/ ȱ^WN`+Afۄ~q|ܬ~*+.1 aWtL~Sm%zV\W%٭PUYnA~ GcX ~3T6 } fMä>mTYZ PBZF*г^E9>Ȕ*qE{}$Ԁ23jmH­[-y=ua?#v5c_@RQ0 Rq0榎L {߮ij"d8[|}l uRzuɱ"U̥+.4 ^Geu*naUk9V c]c5ҳ]wSU=u{ϥ=ӞL3BQlq18,E"!HAB GDQ$ B JP" -a$ḫ{/SUU]'?e]{ԩ:̜euyg=󰻙Ȩ`:M!Rܒl͠_l6H\ <8/]{go}?uzGxdczD{aww^xK.?֏We!@H;Bo' hEfn{cM!4*$*T%oOikj!Z t;Ҩ(Yi#MW+ 5;{@c@L^`PT[jCz-S$Feaj1J !*-!saAJ:Y,l:W74CkbojN_m Ī4RGN}3B6 X3e6J ;\:t &+?bltIcZgWB́ SAK@PܧZ8x΂q\hzYAt.L>Mvx ]5ѫ,^+ j,T iBAI+VO>BUKy 2LP)ĕT-`U>ï`U>Tlb1VjG3;(|ٓ8@9=x=*(0)RWFl,c5hG6W??ݹ_u?ԩGHӡ]ۃ/+/ŋ?}w5&bhmDam4 0jc!cc+;ٳ\<NԑewhOf%I揑FG)8,RO}HAȺjJ\udvTFh;q{Uw \ m>X $`SpTa9u2r\ĨjuYH.!luIR(O80i(#Fc*Mi[`FFq8<5NB>Z3- W:!n]S'߉$zc%e =eY$[7b0%\J?ɡWfTAQ ѡD`Rox.xSV<(Շ&^x.d ҞM̀:cG]ӱ*WU X;Q06d1U1sc#8-ņqŊ=F "ewR߹_Οu/x{l4{C|zdjt{ׯ^o|'í=q7+uvcK ̚i311'q lmaʙ+Be-mrvHZg̻&>MLѻd2ab  šAaѫ: ׋gM\gRY}U"}LGZP>BFイs~f.M oYO4L "rB:m+Tr9<Ҏ -l@gۆ JCY_jX n )[!"x^GN[nH_qߘI艁^@\=}))Z.R?p~a` BtB<{ .]д3gVAbԬt UpZ ~'/\{߽u_z<ݍ,hiCDv 袛ƊЂdz5IU @_ - Fi.]oW3dc 6U)*+ky*l? <|p..&O8b 4"t}zo@E>DA1M$JM*'.,q$9`L^XG1Lk&=3wI-3sWY摳8b Rcv4 )!u7Z!eBfr(#$S/N޾sY^c!`pjш*SR"rksvۖ@`pl-ihTIsH´qoyR yaEݎw"qtN506%t X+e><۾l_4M8";aH0Dilon̬+/z_={ɓgQ `U>Ooݾ_;~g;b K9T cgZ0/84uot%Kc("Ɍ)JȠE 4Ad5{Գ!^SB$7J,CӺdԲ͈{_9z5c.Gݗu ?J)@kf`4bkZ n=YO /pUғ!4XִY.S=T b):0A Trb[4O-.遮8YUMBrG2"fܕ7GS D>z2#cМ鮘>ZZeu~[(QEzE6GCf& lfBˬ"Fw$5?}HZ[fDngbSN}":C`-4b:?\`.LQ?FgRR9(䖺ɤSJ8BAUSo5}=gסVa UCU9$Gtd:B:[G@6}h1VaRF#4W"8bMTfzTP<ʕy9y_?r%dTVЦؕxe3z0Po`:itU8vu*Z5LUaİ{FH[w淿}ܹ/| i:"W U:Lyz~{z_z_Od2}5f`cɱ#*Ɗ2-#3# sF9}:¬׳`蟩 efsr *^#4 ^9NN(GZ3DC6x{B3RO9CVHتBӑ@ J5P#m.uYg8!q뎜 SQ.%(M7Ζê xT†G[%=(ӚbI,.CK(s*a Mn Ek;/SHx``q"=ZԩY$6(NQP|DbF8,x}@ic5% )5aB`VLfE2Nb&XOCEB|-zf[A**φ`V*bJV>$}&^sׯ?/ />}zwwtԮ`4j/ŋ/~?w߾=`c$ a,; 0Z0$WKOhs>t/ +a6 ?H-V) ˿ش t5 xFutOR2fRGEPSܪۃv'ɂ(7lﰌefƛ1uUnD=jL1&XrTjgBtFf@{K2^ tZ@1^.Xݝ XmB[pv.Ut;asSЫTp+W Àp脪ܪY(O쨰5l"jŐAOT6&wTxб 8fZ AkSק,l7|A윀 v-ɪkUr%{ObUʱN)c*o[J m:[-r {@`q忯?~)ڊaz.BۃŸW^y_o;֭qo?fҬ@v<`e rQBZ2+ʠWzB\!EC+m铪$ڮb@Y`I^݃HհAjghma*zLN7Cڧ̗IK N9~I}rV=`[ZȬ)䒠@[9Erev,$Ah(SGh'2X4Q +_1qHdFt޷B SdJ>ѐ'GWRbׂ[O*vCGch!PD2q Vf'r0x ʦ b&{w- KeU\6+!>&scK`4G1Ajhr3],x͆*HP]u 'lOS=A )SgdEhd"bv0A`YB!eTP8);-+ξ XaU`UzUU k j"WfhYwڡ!Eʷ܉yrN++%= EwGxo}kgϞ?0#<ŃY]_'ODX6>rϯC`S.Z* !=J #7j v]xg _# /f58RDu ߼mDT&L ud|?kFg¹QܱӲ ^F! D"ku>)NYܪk4\Ph Ń!6Q& hlUT#N!G-i/'N_E7v4/L󢞀@ݳ^e#+˔;(Y0B@'HxRWy&V*> Ll;a(T6D@pp/*fL),(y*,H}r:yпcU#%xR;m #U&8)OU1+e2GXqÐZÞX9hkw-+=EbAܓaQҞPVoOĥ7) 7vz/+z>=.EoFJle}#*|C.Ό EA"fcR¿r)YW(ȮA?*~Y8y}wf=ʟОmP9*u֕ז"\kr v"XIXUT8T~閍b zYz\Btq&#:v 6;7_SW~套~gϮVGHtOu_TJ a)H>z!\'$BP0[t9jW2r^E^Xo^QO0D-BţQ8r r:O:xY sM*2 j6fթF`/ܝcviɈ2Rxh1P-:,}B~4^ p"OZYu*^L W.B6'4ņJ7 D;V}P=WĬ+8 dRP CPzbpn{UTH6ո~XSď }4b׀=άmG Hr6J~Р裏^x'N:^iWI +ؐ_U^Z3Qɔ/&40D42ю?T |G [/!AӠFIDՒnr@Ek]pUBd[rTCljz1 BSk)dP6 rXQNa-HkR+ 6>A,eJ7(DDŝryfZ6mCcIBqH_Fe2JpQ vKˢ&p^,!FqX$R  [ J @3K3z&ŅΔCF*"f+%{΄Y&&U CU8,@,cgHgW<D D  DCͷB>"D>:8h`1S~ 倛1 T́8"6#+Fpα:Y튉x_BcUÕ;8`\E^xށaq®ReRC__^KŽ̖xE^]\͊o?sǏ?€ܫOA%@WϱcǾկ>oKݻ'WDzafp⼘:*dŇ쎗JԊH* oS'19pi);S  =蛮ngERK(Xv` 6*W4ǫ5=Eyx!BcV$/;=Jg3ҲPH|?r6.3eܛ 6\8,ROCO>4# 4ƏGy 'yV(/,ꐞ 6kn\BPfXE۶[r!/!CEA>r!)Lj҉%*r,(";lBS̱`*MMNW6Tļv~kF1e+)weڍأm6sՇm6o6~v.ǮʖZ @fȕOshHʝ,S KS)2^Ȓ[~mM m+ִjj"lu|l{h$,z(MZL4j%r'eUPXW"9:RelLL@ ]x^5CJ%SWa: j`(,—=Li[Ֆo>Pדհ}sP/:|||`k`*W~oo^juT2jPdp]h61T"Hk{ɾDTK)92 ݻ6O>}ٳgwvv#@5sU^roG%s2XlJL9]qRAtLL$7N6,&Z+bU;D+fEk"ʸW6CxcO^;ޞŸjeމΝ;}ѭ+W~쩧v -NJ[2R3+'pQXw1nòN+/$Y)*oz^ 5rA<0xgP< #O*(v)9i3X+۷;Νlh`ytrLƉ*9}7+W׮]>[aowM8жyY)&́2g)ZbnZr|_tTyV;m4 ȰD'496B|-%^j[H+b#r̬J)SBe$Kqxc 0-ljj]ei[[g#{+֩Rz*VuUΦ~SN8Z)&Չ<?R;"PhPUNxyuJհA*q f))G=)8(UplrhI M˜}z.}Eg819 @Ɗo`g~|~?wnc_=v쀘A+af5`&{t(IJX P)e.x,Ng$mWJ:m##}vrB6VBZ az{ׯ}{cƵPQgd%(+Ub+ W euv}R\˲9GR!%3cdG2HVhW˟ʫO>ӧn[lCW/\pK.}uWn~_^0E `E§Ѓ/k2'ʔđͨ&!甄8ɺ fZԝMθ'n3Pp07ų(6y}IN= ;()$~(TM$Tqv(P-y=?*.B+a֍M1u_OQ¼j_ -Ehqot]5ַXEQի&65-O!B߷Gmr !ܽ[ *"c4J1'%C \ VSRSo߻w]kW7;{ωs{{Ϝ'ZO?ҥKĉ;kkb(ˊJg8=ˬ+&y@DZ+, <,UyKt9bP8|WukNծH YGxnWH"f&>ooz?;uWImCW(*{O?SOw?w;;O+L-&T5/+fγ0)c9xg9:|v[&z;I ~P$hcB͠[Qu,1UMF6:nL.[:rIÅ|f)8KZ*@7< 4@ȖZU !B0skF 9n ٳbXaUuoc\rBϔ<ζCnh&U[V[T,WeC;Cnc-XW`+/$]M3۟UQVrZܣ4r<@ ]N%%ޱP4H*JR3" GMqN:,j 0=QTNsDmrs d5%uJUR?y$O% =88hj 0:Go ruo08^*\9RL# ۳ah6sXhTRZ)ʙ߻wowwwܸqKȓOu@2^ƈxxaT:O/e0?9%9Qma@ cla1Wr|رc_WzҥKΝto΢xWx>գU e!fAF:lX0Gj` A1SCwIVDQ$Ƞ \P-H1lC&.x)ɶ@j&]򞟖UMe\`mLdGB4r8m ҂Xl~Ēn-WԟFt@ u'g&FVw?QB$`An /HCZaEp$%aȔgpVԲZzʏcTZg(f,[DҚR*  s<T${/ ѫl 'kY|WrIVAӠs\ ,r3{?88057ncǾzlʺB> =-J VW5J 35 TW(YHWTDLg3W_}ǎATW-*SNz"YR XjR.p~(oBܔwZ :u6cKzsgDN]Ӧc5fъ#{?Y`GOrQ w;,#_`!xs12`z~v#ЗElı[!.3F@oGÁ6%` aIȳ墤>@(+9$ I+hiof(9L߻wo_k駟w\am"+v;7j4ؒbЕ߰ '[_#)u%fU#D oԡDm+`lpm%V`=?z啗 z@7 +' QKfzJT\[nbʽv%'Jy  T*i{N*JƅJ׏Rw/zE>< b]Y -Ei YOe+cEB09r惥ed[6lATZcHՊFFkydԦF'ț g;PQK "rVjJآY1hG]h8*Zn4'M= Kɲ >tj mm Om0EN, >[7 f#NbOa(&VVGɰveAܱ;^RvIIXM+QU͢W_TRt},~(!HTRQ^ѱl2rB4Ν;~uƍ/94ҩ)bHgew׌rPM?8$!qmp$8>s|~/"Ex&ULK.qH`(&}Ҧ SX [2hl`eS%NPH]* p$pt(ߚ^M<=9r0Si~^w7A&5ա%$(Jo[a"]P]Cq21 #ֿ-{{NK} UAmUWbT.ijIf\&J붚o6;w\v?lw hä^|]!G!*tV<§r3g`L匤z%8F ڀi!aKͫOs|nB%;BWŦNaXwpT:d@cc(pRU[(Q13uTVrnHU rsFTe{M ;a,UNQw4vQHђUMpz^m&; d#qv@Qn nEձ@{g  㿆 5aWa+k^C5s' U͎IqWobccMڇި -Nx6`ݒ0LhE9$7US&z5Hb0FU9+s". }>yoVżΝ;Dt͏?_$14)eȌۂ>#Nf)(4+SHy %, V*#\831O;#4<և}׮7Q|yHVEBW/PogϐbIX#JF%("C^]+U~N߽G8_T T2=4# P$J=L9¤ZT-.4,XnJE0SՂ\wT6J&>&Zzπ75Mf egaH; ,vBA5Ehl& øW7*!JvCuZ$jv,2^$Xl|QjOr'^c>Τܚ9seT -3Y*ryɀ 0)嶻HX̤IYRRV?3hW+cR^saԃHէ9 :ur[A b‡O26+lXU]rAh/nܫX${p/| Dt}{ &)9vELl6@5RVl_iGeeJXܶ>Jhh*{Ȧ`h@8 o|So|_~… 'N<#Mw)2]MS\!d3 b\tNeSU& `(AwR NHK +d\vsZZa c'W:x 5 l o4Ǒj?5^tm#х[_|Ѥw8J^ ꪎ\/,We~ 0 ˺PqdI!rs$;FZ /td~$(w"jư8W6?3rT .<I WCXBN>t+)ݻ͛/_mO*+^:+fVDL 73wFa*r"EUDHcq>`; dL#Aex.>=䓧Nz4}>l` :#>b@2{Udؤh;v9P.OC> d 3q0I+fWQ-~eAQM(/T%ȡ@ kfXN9~hVIb"<Qp稀q]VAɞyܝ5 3 s.H6ըJs2H4q&խSr8'N!lljZgllN JAb&(K3*#nxHMۜ8N=e+6ª8M**}˅WCktv_xgy̙3Ehk:,I({Χ<9 *ݯd)E]>|h(~#BPYƖ c @it+y6 ^v²cfP%%q֢.jMILAD K=pB5NPa@cLXX\¯zA14v3%!VR:s,E疒ֆ}d&(I^*3(זQInj\_Ru $4JWJ'@jwwDM@%=i0_!ۚ DIρ~?^quF<FPDJ\TM*\$NV*@DwYݻw[~sdᵃ#OAVL̤ʢ9҉Qŋ6Ը00#CE Hd-d 4HՓ^z3g8#<\pyt,ռ)wU9 fT4B3ռDHF*@3W"NΥ\*"GZ66'S( }*rr(h`Jmw,{J(X+EvyDU` XЁm"okYTqN6wYrXj0lmr|`t9vf -{g %^S PN$gD̚:'~xWT&TUn2~N@gNp,}9 ߫A*䎖 X{h “?kӃFڡ3ʂb U(Ы Al.#kJV^A; EIs~ݻKDoO~JwoI1[A|0c0˓x@&.YkUU,QAL`+h _Ok w=zk/;wN)e|iBYPm-|$ab+3Q}3P퓴PbQCwʅcEV9Zp(5٩J Gnř;H2VoRl8pPmX {Gs:a5Z%(ݞa!$4 s9o]i!^ tUZύj46=4VH]-;mSPp2R lZ:?7;, un型cZr,T!W۸>._qŎäA\BѬ *ȂIyP VFh$䚢W[*lؒg"uիWľ J teiYN_ QtGggPagOL"L+U];yO1qX~vlE^{_^=0CM;[H0SW)ʨ.{V+֭[n N9ɶ:,PneU, 㱦{$ Z%)uU} @yCh0փ '>L^k7ݗ^~'8vy/j)!Ƴ@T>WrWuuy&ubK}#L}êYaƑz ….j!e@|` *0@u{"cL Ž@%rX~0/Pk߇O:0>l-rH3FO@ #G Rڢ,DO68-Q[NH^ҺZ0FzE.?R,!J;{*~q*0ʋuۉ[+Ngq1وxEruBW{N6VeCHB0M^nZ iL3NWyX g,P0 &XXA, :,E0$ \GS?ȁ~G8HMt9W S_auItC`MGQR<+ƲL 8"m n `\"ՙ %C4 Ki䨫jhD' O-\>bkݣblN.;}իW=1X@l<wWb Ze q~j"Vī{jlztf|'WM\1mzV`o-C҂9bᵂ-DVV-fnl: GjssryOU5iȇ؊rSEcZi{*a"=,lQ:G7Th<ԒmOi £)ZgKzr{mUt{V8D-Mwal,^Y#TaȇklJYW)Q~:|2ا,}ka[HK b\\`󇰔Yb͢iUjZiUZU᮸UȔ[ni+T-f&Z]ZY<`XSF-6u=sK3|wQ:?:5_ ,{:#; cv $ b܇tkg`|n`䷄#5"9JD( c aoݐ'+'ZfeXk/ID0Hk6GAWIr* xnxb@. r\VpIzVVqfrELuT:q޽o߾~K+u~򙴗ĊEV!+>=kĽ Jê VLYXo'0)bG!=TʿGm#mMh:>a^lW3@Ç|p@nE٘Т^y0Vp]v <.)gI:nU)1īqE!*.C2 ZʡNPA=. T.Q"'kak.Og~nCl.0uFmΓWR歒:Nt`]A1*id \XBH݅Շ<^J~z|BN(Cl J#^!N y;-B}#"Wa-I9$GV0o^`CJ_2> x8װ\8X޵#7+wg"r]>,HtJݻw| H5`XRD)&RREynŜGڠհs^Wq1EAǽrP-h?v?~WΞ=k@+f6FBz}"Tb*FqM<^6PG35P FWbf7W%RS䄥ɦ&RA2zXW\&^աt 4^ /(qB98WϻiɐPב:-1P+iYGi# jo-&%y귫JMb2(z%iO%1Xj* .̪Tfm9XP;268 Qc4\*X%`7[M`gFe[f/ݢϕ;;',4~P~m>KW%  .ʦ+fш:fT U9{ `]~7>ĪBjdbWlK~נVe=,hUmЈp\N7jzfdf0`oL6[מҗΝ;oދG_zҴ\AW;0<'*ɁP1gOC TPqRrLUȢz3,˙Ueڒ@eaS0$@ӵw-q}(-'Iuv*YONm}ȶ[C c(F9 eȬIB(E[NiPPTzѦƗ{e9-d@7*vE 4["ʉZEr!sj´Ȍd;TM ?ϑlȪ8?ar!Bĥ319e+E,ne pF$# 9+-2%[  3ii[~/ܾ^MfG}$&G|8aXwvPr 0Hb98Pùbr鞀>4kTHxXT\ ja,7#-cy@9$%j L{a<)0XN`*7L4r+<~S/68WU,SAjoC9s@P9[2&FrgD^j7|sgxĨU96ܱ!&!\uR5Bj *B$=fq%?hBw޽qǔoN9q+XyAR䵱,E֣V:R*ϽVwNM+9-H6]% -2[ ʛۯ}Ν3-2G-5y_<:U=ʙ7EjJB'*(SrhZHb .{q8+1+ eAYi, n.+lB>Ыιc#\ #  :|4h(xK rte,dD6!eܙVYJI*K ck%2jxȨlU㓑vvNe|ASӺ}y:XJJ?)dT㗜DkRTOT&|.R1P1?;K"Uj\"ƒLXT._j~Xwܹqo5ŀV]@E,tep+2)&be|M?+ NѢ*X%9(l:S5H2f[^g~ݗ^~ٳ%رc7 !ſxԠ+F;.XywQ8kljS,;߹j$j"DOz bUbV&!",۲qdbfYN" ,>YG'l'A3p[v*p-Q(H_euK6qB`e,s@U I|뻆`oߍRbŬ¥tZ#*xö&^B.EQ< GN~'t~/}ܹsǏ71?H=bN38@Wm2Ό2$*oRuՌd^BKK9GV$ Zv[\`kb^U+1*>+!4J=TZm D!1)0 K42ZsT^'WOG_Kږ(k666^z+c*މ݄8XE_a'.jTx+F =Њ" PtIC[[`/]3/\pij)40 EbQvv}B,(UEdшQq D­H&8 !s/T5s9gF_̞; R郞iyʖ{V'A{up3HA${v6%ztWlv#~S:Х dawߒ3 K`>8b{b'_ԒYJsd JֲMWaPI!9`W+ā]0p_G¨jo3*"D4ٳI+^h-U7hY: (4΅JMuzw͛7S|ng V+"VlX+)K"ŰrY `^ܪO+="IP}AU.̤Ї`-\k={ֿS9%GHz8ĦW՜%5 q(Z!gR#wRAC\S# a%=UĤR("*UNh]I Qݨr;5n̕OaW1[k7\E?)gE{{ue@Hj\SD*8Xˑ}E*xȳôÂ4$J7r5 G`TQgubԧrY)dPP/MN Z `}{V5+S?H-dv62UuUIr Yy+a]Wpaw,5d ;_zK_~^jww9G޻Xeak{Uկ"MIu7ِ`=LO ï'l50-y`ʤ$’%Z$|4MvUwW*++_`>{{#23Bb{^Z^%0|Ы]qMƯKdIГwT".HZ5}i0 8xuSq$5fy7Ձ!S vӨ3!|/zBs{:[ж*q蹭au,f0E,@</l)HƱ?du1&U.hcsqKfkNZxlHƼ'[p')Z&<9P6e+V27g AF7YLIJoȊWdiZDiR5OYb{|),OԎa㙦:>p^sþWDѫj ޼* j"jL^wXj;I R }cDm3h@ Q>nY\J.@$j߸i4oЈcbDXZ"~* t⣱RO0U`ڠh'6X r>-UV( Rps0E8򺿹D6NثU'xr"Nt ,t\ 6 9sTI֥ECCyŊ8Đ&Y97q!\kx΂˦]jyQr~~kx 5m~rzBN-#eR(iS@`ЛQϟ?сcS ^q/]a w<,Y6Z_U!qև8K1, <iF3#<;>:n6-f7A`|UqAƺBDk1s&cR}׃YtɡDM QSawfQC.3*.v ]`4UvJ":bLALYYf 8m. ;̑'N| )_.wĪWO~3=,iF>ҠdQ4JP }>MS[ vŌL3U0 wB~ohi~O!/CQ0,d4 mgs=I wT0sR;hY9SRXE*U~#|MEwjH+U+K]wHȨD_xϠ#0cf;vLqtܠ;rgc(* 3W{trD虨.81lEo /_Ahϟ?E^3{No h(ÔysƔ jS1o9,QٲOAh<偦ICIp(gu=ZhH%o%DYO]%oM hP|0e9,@n88Hlq\c*״J'g ZR0qf[zɆ1%M6(yX_F` B_?5a~ }//v#r ?fPSc̀)<0aQIpU|c.@(&bG*܎sUMU lq4i:`6a\%{XϞ=Cf"*|#&l'LAsFjǭ̩6=,J 1ŃHve;pm# <<7_yp;w۹EnQο7Z@"C4+Fz%Fϕ &SΊGJD &t[CRvYYňu@2gq}C훉<0C\eAYV]=(n\1#|ޠOp+9laOhVzk1lggC;W2>pe -8Q_đk+q] QB&m3V\LD! ᰙD|̝fr0c4!0,UoOL<|o-խj<}hQ `UNXۓRס,9>,1IPQ-8{ 4}zX{<{8U($qr<OdԗE`=Gj <'u1M'0f+Aeh*M &!IMnj!ME#omqs(HQ͊2}t@b@92Ӻ]I#QT_*Q6XKC+'E1NwДĢE7& ̬.㈒:RgϞ}1,0s̎;L)n1E V :9X%܊!v;eǎ]3T1 [C,-nhkTM(*tBxuoyaɸ SӂWxţTkGŃ<*a }g>[}sq`ǼEgnzNZtf񪳮Ra] Kq'HѦ[Q s%qckdP-]'Y *67Iԭ)ba#vՔ%4 XXAv 4F,񗽂  ͛}HY.q}P$Pt5GwL*lڅMQ]BĞ ĠlހKAʲ(JEu6P#o^XR*3<,mk3< Aw{׬XɴOHZ1NnW G)CKR;.OW6b]0:Xwl5 <."Xaʨs/+d8ބAqt㫃㱸 hPߣUJH[qNW>ӹ2sW>> '?/g=::n={;ڥoUbwllV@|I.3s~9Âa58b)|G )P}1~-+'_Ucn4*I/=$ a \5rk48H쪲!i­jJ}q-nLy%C7(߿=|Od;RZ#cmYu[U_w]dRJ"3)iۘ*;p+"uA( ,#^lb, a2Uu/%T:#R !FH)+࠙M F?ollt"l^E.n)WdF&mݦf8FX YQj*ݶS:. 8d( ?gP~cdԱϿxxx嘘1 L9r1u.PCetU Z"^dT xM+{@?޹s'ɓWEvqY.U%^ƿJ,'ڲ9,(|0sӂVJX/QZeP+n CPSsU,ΆGhJu@[M`}ܯ'&|`ŐUw^4 lM-΀B߰ e@Ֆ>bmaӢQ%kνV?5j=%Yt]bN!˸킌y=?ɩNz!j $JP!&3ް"Җ0e$dP`{UObV6Z4!\|\5( 9NS Vh͠W}IA3Ƙ, /ĸZN4xJHBP6%<2Hhiz(\ ^]]]^^u zAW=E`D' E] a@a% N*VL+Eֽ廬”]5O~sggg駟.-@s Fq r ī͟9C'OЪy *Iyvh vmW;>̼!q҉ }!].1HٲۧnH8Ƨy]yI<)(%gx0U4лu|SAق1凩36XFmr^z>/J@mDıl[/1/}`\&ۿsfpx9 #F Dsw0VSjF*h1bs=3:͛b P"(еR +ia{VC<=L[+<"ə .BSnbRv@az5{8Ww#B !$UȎ:w#AYg%Xg]k ބ-Vu c0o6ßz0Y)W6E Nkv)]׸C~'ڿ/ܿ?֎ؤ~g-+i't5ͳ2č|MQAtv͜,e l{ʇ;0,cXWT_VI i(`tK-`,<8{ Zq$y>iE8)nfGU5 t?xJ =F/w,uA5)& K׸$&dH!$fC\u]+*ҬABb}-lUoÅӭ Չ&:wqdyjÖ|%ua&nϝ)ŋPU2MT`ddC8FB@Wi$ǩ&|{7UU,OgJ L`e9ڶ约P/ZN``= ŀ+{+BAaU´9BV)Jة4P ҏz?nv1?={дxӧK^-uQ=]UB]/oֲ1oƂbW4px=ѩKv Ub,1>cs$"RXzCY-!/T"(SG( ,=r*NR@6.QOO+!,qA3PKMh}r \aM+CNk&~.)Sx6<}Gh, s"ά9"%Q퓭☇\ަpWxhn#h y DSQjG+ zU;&WyW:!WRmN'@u9̋[r1ԬYP( k.tF<E9NHW.L@ Ne9_)(Rc@Q?>SXyV7X<ŏan-?c#ܓOdu(ld$Ū=̳ӳ/;7|5C2 ${jc[[+ 2섬D4 J#;hm-ퟹ&I\'l)$G9t"+ up0)$7ˆgx$s"/r.W Q/6!LLUU26O$@"%QXfׂ*ՕXs" X٪]SJǰZp+.g13B]!.v_p~~>h'O_ѭaU;z]I*).G!oc oPMNoZ\}QV (Ah:-\^E +v"mS"rܺH8JwP;O1`R#~,fl%p5ED&<Ҵk A%+"px#Ѥ̶>Lj*haI7 )YaZ[/=}b,DoymZ.Ma143ixn#{X 85,{zZ2&}L'4T}yXeE_>UBV>*20_nB 8TpLt5KЕD*JUIs E;( `+>=~|Sw  Vڸ5{+* |1B*h^(ZW)P&ZqN{"\ YZlŰ6H)v|_تuMV lOoAUf\+|R Z^^ū[)jzV~Y t3x.poТ㟽-2q:~0E :|Zjnm4R[16Tp &?*s]H̰ ̱wT TZ&aX(n xRS,dMQ&arW 5nD`{ǡ0 q. 9+v+jtOq+I20tE  L^튘ɇ T?~s?sqq~(|Ɏ@W Ϣ[Z >a/1Z]( xj,aQ? :h1Z%E,K`BI-W)GRpW^ !FZht0!G3XJ:2%L$C#GUi:Qv;uDQL簷{G=>>:: ' 4ų_↣fR{@b ; r3UIϹ4am 1JCVDF1,!x9_ >0JTZ*YV>f/H=732  stot(_H@MٕZ3+Oˀ/V,~EwS=bXKLV 0$;tV~U^}+ K\4tJԢrBI(r,GE*MTkMiUur#+r(|HML jT͡FkbWяSx:-$n(>BXM p.1Sjce9eڙck0d"ם`9{HȒpW1uKGU TРъn@Q;A>oOݻZ<\O?}u?x댚'|jW\sh]&^VHhPҶVjfBKR͠T9p/D dH)LqJJX1'ڳ*!բ9K/YP˕[GJo|G,Xٛ-^F% T.PAuOUV2kf@!OA1w`,1 !hb #w9l/"I~@/;x>2OsjC9:lup|\N A3U^U1,Q!õe UXLjW++TCr3)0s/1N^V:="{2x6 o6[vji3 +.b{I]ubS%\*X2(|SY5/_P!cD|p4:wx׿gGwݻw興ζmhG\izI"jЕ=]X.v4uj?D~jw g4A\'d䈅:`yS05L{4 qYztQk<"E ̂:,,=#b^I(*m-]S7m$Wy,+`:GU5_sIXVk3bWZ*=Ux83.Fe18- SA  Ҿ̑P@gp-Yr[%eXʄ}qG/~( ϵbn8#F:lP&IzvCmKFJ B sk$4*+;C+{^  Vm xqqAD4|ٳg1jEz 4WHp1L[y-lRgb ]9j$8Z͇=aqɞ%1OZPE ),ȅ@{'PZQCs輀f-O0rP/OBo,g8⍀9ʗcoE%Y1mSjA]ӝRm,w v]ma[iX |swl6Dt,{9ckY+0WZ4X/ ' $*lSONU +,.^U]JV@ Zi˩3'\{R Bi2k;\ j*AI z"G2d%~B ju7@uXPSkLIn]*Bm8n*\mPYFů=xn;w &=E*M#^@lho(&5jO*$A֩^;@k. }qA/DV&QAơr@q,4 jS0% b6{Z9-?dU(DŽ^Sy>X&I{k]tjCҫVz1)㛪s=3Vm\I QsR2=Iu"@F֎X' c}xIaL;K sdm:& "ib}U>o`Nl @.'pUyc轕9g0lj , >Dr[3C(ϑg*q$qAӽ$5T;BA+ra@m;0^Λouvv6Я1Y/:fA7+cysY W|3Uˊ+} YvK3ut 0F*-Fx"5sɵP#T3DlOlsr^v23G&=d4KnV9R3˒8ӺA {% oh8 n0MFE2Z%'!"жmdF*VgKǜy# <|O{TB2v#\kLpZbl S|~ŵl~: yRGl5NNF72 5;XWC`W!YURBhjؙҦL 0@=Z\s&;AQtWǓ?| IH+ϺEz3F5*OLsB tUPpr@ cr܁vI` !ݻwoh?USnrj-d-Njt 2*㊼4+NVo&=cR.rdpT읶>3 \*ƻ<2y8n d|ᵰ˘XyÔlppލ_ӢpIƙ VQ1‰K'Q: RFL5K5M"UdOO`K^681VO%~XJ\YZ`f_,C"-̫ U敃͕KT5*%n,Qru =̪qdGH`+@W4:4AWS p6jAO #oTPm?<< W>}ӯ^=0Ϻ! ǭXԾ dauTP1#f/c%EI yKqm#Uz1,ᅵv?w`lQ p3ؼ~#Z yw&o qX]^1%Bj3Q$k}fBfS TNH7Sn.|k\%oXS/Kj &fQYW&o'+WIEP,Hܲtƒ5juԌ@q}|@n{.%wzDɱ5H'tŢSa5 n)xRḚ ُ޿r_{7Vv-ugr|8)5Rjo vŭ~H,x*ְZ-W+t帯ȎT-6I?nvR ͗7VF46yHyBt%o=,s=ak|<^ *bkO|cz8fh`:pz` lF~1!r,ſR 7-磦{|XkWRt/W2h-vJԫH>[p1)kss-9٠Jfl=X=^9{|[ͨOl6"z΃5v pRrs@W :R}i00qAW_[ôJųn,U:@;dיu ЮAq'bK?Gz皓~M lժZB:`̼W'j)^ 䬧B9pSލEpSo~HúNwQc M"M'.$_wUAyrPi}ǂE0 n4 Z"宭EPJ};Qɑ3DO*zYc4 Zw:DryZ&zSj+`WBAs}`5c*L\lj@jI[RLV` /3rF~m6{!p-. ۄCfo" *CW6MAZ/0 u^盛_PY޾zzJDߧ<ÇCB6x~-*(@hݏR}j(]nkd!fbX"]xJg?8+[-&i%\hc?[~p3M,DщxHCKo L|7bip| 7[)hBDFU#(w"җn7IJZu3 _ҥ{ň*WTNj âZ`ᜃR Iخ>v2uND-O 4Y F@W,I*ʵrζp΄KȲTzsDLSXH/f>|qu8F;/ "b,ʰx23cZK5)w3t 48]NY~4Q&{x~7<;;c@ O?5SNST{Q=]+ȶܬ95,0ی<]Fn` K|b;tI< .kQZ}({?wө~o/'E`̂`#>W ʞB `y[b! #fFknPH̤Rq+Oe2I\S,ʔ[z=~ $YPQWh *:zR\H;VU<Hh&d}*2z~ty9Z:~U= k WnÚX+rpձ:Ն ]P~o<J'G_WΈ(G&`ʊWEk?ٞgy]ԭY!jLNE(g2]C"—5Z0,-XyHl uY:iX<S1Ų&*?U_hFI^i,9"}װ'%Nˡ+.J$ ^zg`eXMGWr:*`X_sܕKuja1MK>' :3 O~m6fszz.//r/J{ӇfǺ1F(k| "帆ve`*mzjo/!&oeL?T)$湼]ſ = ;ae+hЈ&PIbiTYsX&av-}IF:7Ȳ _*B)l\QZֶ3 y;; vl6>}Ql(ofv@ , %d*VF7\W5<ﮥ ˸~{[?Dtqq1I~J)x"ˢEh!_5 2+ȭm2i1|aVMcMMd 櫷B`3G=Y]-al?\IҲfiBlE7f2>y}^-q\#h2jǾ>m(,C1ΒTO]!Q PӖβ/p e pM5 CYB!c=NŊ6Abmqpq)Gv&rij$޹uZa} )v%V``y>~e1̑7!|A;*bCWlSÁθWp{@7={q~~n|`|'`-ϫ$)īd \ŠfvPP kƐ(d(a=. PAB )"Uf[mè3zFzѼqlה7 ^Q/ 5Uj"Զ>a!QLs&`ֵti>}S@!Aw"iD(Ŗ>qqe|,k $ *;u7W ^yԫ$bm3 ¨É.i:zEJ_bZ߈vE~W|iY̽*(vޗl*(Z+$=ӝ @k~ɉy !y0)W vJzd;A䉙<,Q{7?Wι^=znŭ/A@24V.W!*B& 1:EZ J(<Q,Ljh9~T)\;Iˀکm3|[+t6h\ Ɲ&˄K8L*hmzlV7^ƒXl]z `]6Cm0 F1A; Sʴ<:P4'#M*_`P0r:(g(cx6"差U7iVQ(F=GXLwxn]iHkᢤS3ANMCQ Z`pCJyinxrPGU@hLIYULpMVϼ0U惿A_{p!M[bx`H?x$_7jf}ڇ b[Xb4Ɛ13m/G 6bYs68!<{ I2L$HDO4j_q8~32ܻ7-IpMԜw?wgaU jIv5Њڨ Jz@+N>a 2g8'tߝ\D,gX|` ({ >MOa+ xL>DBcXH vm@ d (|'V͸T[v\Af KP]n_,[@WWW٧4FH:UaXRTʝVzkMeGgQ~ճZ=<W?ܹCDw9<< gy/n[Hg/wݻwoh~u4Y;PgXkiQIqNIRPw]c4+Pr,bxW@%U -Pptc.}D6WSRԇEVZ0RH"*jYfAB+{&v蕎@TWsM0[HD-GaX^SukEd=9dݯy++4 ^}xU{JӎS7BenX e7r!<1֊WW-jz}|MqƴagEeSDt4?*7WA8C0NYzS$߉rYpZ;;utONN9hSo'?]%t:zքN%H[+ ZXranwu%olG{œ'On[x@b@ XW?8==p[ݵjYtE/<3JCakKsG^5Ai: -97Xg4n/f%F*<~85Ċm.IH !1vf=T 0W[:L/3=>4,p鎽`!2pc/edwCulݘgf {jQ2I, `P|G "(HV$meY~fIb=f"6j}^24#jcQx.sЫijfS | LJO\`|ѓ[w n+v8.dPocEUM#C..mޑM E.:) kD>Ovh#L`K\8傗|FV,rPVw630uKTft[6@3)} 5&X>-J5m↑kX,y:Km˜Pt֡+zϺ"S?aFmu03V0q?isG*h:YͨEk :ӂ9BKބcPUFđP̡ @ r1|M8*~K|qq<|Ն͵DjxuAկrWQֿٕAјCQ!eH_<&}lYF*{ݗEY(D(|e~So]G *Ud\Rt g19* +q{p,{KUbwlEhu [%e7q^__Px!ȕy*O4&IJM0)WÏ"-Boa,_CQH:/זmW&@en#Bº&_xdzQ- bet] Ġ8.0K~7 A}IQ1od)5oPι$WWW'O~G}DSCR}ū Ϛ΁]Z❼nN\5MAFTC+ 1(k?f0*d qc]T=g/߫8nkw1,Rtm9_3e,1^ȁ^}U >q1dUd_\d?Z)W{yMF+mDQ/U#U QNr%Z気5-:e>w$!+۴qN&Z6H'hzL yP\+do(iwPTm\LFA˵4̱  p0Ϥicx`Ń"&d] &@EbwB6nW?zo ?= CN;K+%nU끭WrG97-rlN6ZNMT*):ǸrTV9F8Fem7F6fΣ\بx |k0o) &x!ŢW]{)t@6s/l}0`,(=P ߐ~84P` 3e,6NK1/P?VЇ*^J٨T+Q.*$B#0w(D L_aw=X9چS$$"GBņM+ĎihH +B&a5ZjVMz?i΀oq^XDtttt||=jW”i]?QJJp&fvA {*zc1@?yޏ/..B;wf|-t] 'U7Tw`+6JޞcBq&9<#* $0sE1Fl1 AזBs}NdA:)1.c[5gCW*M.=] *rPړ` zo)ʱ#7D~q [tyo d*WR4+t !..^ܵ\x-I0#kUjت/Gk|<'abN@݊{n!'uz]W,QLh졦͞#tnÙEo=infOItdN冧.pmcnR-*^zX_!z@zS[sPvք{Pp9;?==uΝ 1'O.UvY^>PB8a z5rFI,WܰEƂrԿJYhdSgV8~Ǹ¡r"0LsůA{+VE ia-İ]-K\ᣀ^%9 \C CECԕ♹4/3)ܫ#^GweuS筎Ud)$dsCM[j)&݌ĉL] KʒH+z+xab\C0vfQ{ϼOsgLStPTR()̸+?iN"VjѺɒ{F n!Tnx\W vg/.MȨ};b,:dCIĨ`5>hF,X@h"z'D8VGxyy2?:;;iǏo2nruu~(cogYHz8RFr@Ԭ‘k9[K a&$l+ D)D>,4[p1~%]-pEdBպPг{%Ǩ_v[\׮4/ٯUͪUAP&jxjWCu>D5W49gS!}e}ƻex+NJmQoڴvu);|Z.-4-*BCfVCmi:!HȸrP_'*t( a( E41GdBzEC!`ԽX-ZJ3p`,Q7HKA[Z-,to䓿{D! ̌T>5W).Ǥ`tN, `]>|?gǁ57ʰŋ'?ɓ'OΎNNNNNN ̬[e&<BW]i&+ h[#yFדQ]_ 7AE;'>*fQ7Z$ܒq"Ƈf9V pK$]op s=2=ߑNDWط׼L?\:{Dp0,a>tLݫD6hn-󤨟Gi>Ӛ- [}W1,pla +Eca8vK+3el6rBNTԽ/dT]-)w.$ ^lϷEE5&<5P~vIQ$بș-ɫ7>st'3ǣ ̎y\ yīΎ#y:nC'x#0qx&ΎdѰ߾xoܹSe"M7 O2CƁJ(be6V:?F1KY{a ؀/ 4Xy\m/?lΣ[fFN8lRC^ % QV6N#$5iuO$:D䦮`M^Ay%Y)IZ K,@s7d*y0K Wp4}bQje>D.B)na@9 $r5գ\|/7 gAݮ9VcjY a [cMm-{?^^YڡҤC f {E«LLkZI@97 8ǿ "CDFaYAbb !Z+ | aDN`Dy ?~|3ιwݻwﭷz?u~~>Y ix6{7T`{imy#E5Ղ25;;USnalB '=|hH_;0*{UCO(l^'gFj;pU,hP_:F^qgR[܋{A_ќY7|4uQ `DyRqD+ EEEPP1yi[nB㵀 V\ 柳$my|'b$$kVug&S9haMD_"ar8:% EkjrlU~b" _Ӹ5QdZѯm `Dx'_0z=Un2 p;T6&BZa`HVn˃VW99Wg<R@'ι?~_ 3?K~~~qqq;w oymW:@W\͋wMJ0@\bZ0m)$:H*#SQςD،;\QԠhw-JmwC)<`G04wHGn9/;NH 4WzN/#[$B:"m<:1,^=E8F j!`DJfbͲSv ʻP<)0 t _u'!0U#ʌ3H_."܈YžQ_ ^ALPB\[#BR*rML;zutMEU(o kMFwo{'g灐uzzzpp rZ`U46 R{*hDgNi,SU=! Zڜ:ON٤$؃:XITVE%n"tEJHV…zPnniWHHS^5X{2K|IJP]\Q8CE޸ viŋڨFQ L<5:s \G wRe]h6e l~X:N`1NlLnY / L Iv$j f ?@zviA"Cԯ:0<}\WWWO.sm6f~)P033o6|3AG?ѿ[/;bO>>=uAe^^fXPiћ9ތfp_1lPM˾1/Bm8}MPoXl#*R%VEp*eUe٪0Xq?q- `b`+rzd(.'AZu+pL^J[ g.{^tW;Σi\-/@Ĩ5Hٶ0,( <T&Jk Xxq^.̟KiW[DBV(Jg o_bv{xx>|?sl "΁YD(ŀUGî}]Њ]{By"}ݧ?wttttHXZ?ŋO?Ou+^j^fXr>)?zœrT`Դ2ʩi,i#+-Ծ\rqy7Ъ`U\1]24Dȵ&ڝӃq1=Ch|S, ՘WX0VVd]h?\-[^5OlEoaN)+KPBɎЫ}X4aظX."Tp/φd,F&rS Q%GTB7TwJk˱P. r}-[ ++W Fʭ423څ@JW҂fU!///;_ޏ›w;|h(*:5w9 ä:/¼ls=l"nx C9!@ggg9<<B\^^>~O?׶WWWWWWϟ?YeVt&h_^^r“?~_w?8xu|~?|ܿ71x>bc&B*g_~ՓIsk ٯ+ڔSB-\J>RFn,6ӏr1b#0ka½v\y0gD,}%α*Y +W3?{oIv{g44H̠'$>D!!D lG!qb $Ed;$FA@, I1uS{叵Nk=s~>SU޵׷~8M .h\c)h5qzHM2]j\1E:Aoܤ.,rtwPobՕsr J-_֚F+9 05pbrVz` NpfDB6YҴ@?N]M"֋SSV%XטW 3G`C & ]Csw%;{bмʲB]Vb[PtXO^^XX|Mb7o:(sP)%i}I[/>3K۷Hn..D4t@k}Сp;^C\V+g7/cέ.,,.@&"bC33rЪkc@S7ssԏ ?5[89^ VbqYҚsr)ޯK)s7 J+59$Ke7ω..}BOi|s448!'jԮKCWŊM7r6`X*vׯoߵ&1QQqJjba7^r1!*\6p+%ǼU Â"{)D [Ǣ)#ܢ7]^ШEF%BI JY).! 4k}-:Mȑ 0e%K o{Sr7]qJ\ҥa(Mπ>HA ĴU,mp,;ؾT} ]ɺԄ+(s^uZ 2 ָqFџ}ߗh5@ ]!bDDsW`ZZZ|{No5EV&sŇ>vu_;fuuuyyY@J}b^֔H&̑JٝL<аN2J\`rLJM',B-@-k@v!^dEY٨!75CEt|nM|frD_ v vM}sta>V R"ôVx9p YW*Inc;ip,z6q-Wl,SĢ9Ik9,풔rnwʮ%0BU%J,=&tlYBUcvQ(T4ȱuPREr]Z{ѳ6Xdnnnaa7O_#+`ذ!2dijc8ưNX b7c ;1%DfX3׌|'H̻n[[[􊈦D65 潽ݽ` #Og]EuU}8c><==:{<ypvʺN"|ʷZyfgߜO?-,=‚@JT }OtUh^^K<{v6YBʄ-Xaf{1h7mcٷX1$B\} }XPT^F%}EɓThP@KrLDNϲo XU$kmG;7B\Ӂ+}ݍ.t+Yۊ8NrXb*RTa33r{/,M6zbX^1 doqQ򅠔LYҾ6fl\zy v+B\Ȋ62~΃_=bd/cH*}0M)EF20-Mhe_ʊDU@:aXeQ43*WloqXvAZ?{Ԕȯ`eɶXl𱳳>W[iO ;}ewpqgpc8'򘞞NsuSSStw~_#kDbT/'2qꯜ: ե%+J;7**NiL\Dd/ ] ]F^X˥Rst:ܪ g׺sdsNJdTڴ{`s̗ޕ=B[56u 'I\~: ÊbǛWB+UAc"`b[vvy҄vC.$cUU{]+׫F-ؤ=Q)/ZVtK,VET\L(G]vg .(!h4\]lJ-BQ n|`HWb M V8t$D`rXa m R5Rfl._3Æ===-*1Jh4uVŦ"!i{{͛[[[W^ݹuU+ rh {C@fJb1JG|{K}/_/>ykg~~~aaa~nnfvvfffnn=ɒtEaX"Œԩ߿wtGD:)7'.>乥Յ*A-( x"YV? a#FNJy!q}`RV.`w2wz10+[ήe16{)[XT .^Pl2s\VoU>]T[TV,QUq7~oYJ@\+ W]/Ɠo8{VUTqfw19zEϦ]A-aӐ7C]~`V9;E ʪaa[?4JKz;閹j2 =Mv?{Ϟ>,...-- Ғ( VWWggggff>}]yꟾm,Ca1 oxlc鱍={>ˎM=*l3ΞE97866MҊK&7+/jS$ϖ9I09{jX ݳN=i`_)ֽ^aAP-atZOBl=ijܥl3qC@o؜vc2y/E{Glqf1A`egpwzS/|Fl\G VU,_W7Cp)-KhWJU]v†pOUäq:DDӾ{6臅cg.끃:V1g9eXu9SĊL԰N9t6ٴ69m;uNOkn9]%FD3 ׭ݲVcpIclVTƘ c=LU4ЬWVwc%ZXO^P:\6S^3dϳWg=ZD"UMƹx +wrgJSUn_Kef8NalN^{?&ºj`0m8z3l ˄+hAX%nDa' c*dq4j8Ġ֜&y CY{g03=$Iי9+ݍsqq1W/^ܻ~;ر s󛛛KKKu1$yܱ*\5Vn[U5kϥ\ݸ32wF|ʶᲥQGMe6Z}hI#sv놔O7NG9Pc)taAA[k2,.?T|ɆC_Ig6Vfpi6vkmZ| n߃ Z2U+C~}e\ ˅Fíf K'ꕞRHB^I*;Lq9&Μ/r)<]jӘsŨkߧŨIwoCg}h4DTdAUyֈ(~X_zvhuӀrNI#سIHpo>/?>~͛p4)"PI} &=D4 }ƍo}8 }_CcoMʖ7̙{ =rb^6aw0bYɕ߃]tTt1m*Vl\VWr|$U mL9ÑVw:8SW\RIm[[Soxk?7Pd8;x@f6rv`zG阮9ڜxxW-7H,s1K@I .$ r+=/w,|.ԼI$tXUu톘YaWܺ~XPɮi./8憱/jӀ˜p*!AChѧfn~yy`LJ3_hۻu>^" *˭ s $ IRP,d#'5k`cS%UI lFF?t}weeevvvnn.ammm|8޾}[4===;;+ߺu… '{/ 3 |J磯-5>4yFPk?Qi>Ha+?^4c'O\p8d8uP@(%L^$g>B SLL 'DO x!**< F#a)"E!WTHP$DBF+,BB@m1R࠱ p`1F~`d8~Sjyyyjjj~~>2qF"A⢴۷/]tԩuk_ASZɕOS><D`arӃEkk )k:I 5 0ћ݇9 ]FiT?sQb1KB`IFC,(Ra0 y+!W_0+`a +{X̓Pn?V ⠊V!J9fV%WX00{X!ԁnۦVҤWymܴERBRD8ڼPEQ2dǾQ]q}8wJ Y0GG惟?~˟;y+Aܺu+~;;;rԒ[ŋgϞ^,=TW%3ר=4yh-0Kɏ%SVxJ8PbYtEJ!!B^W^9~w1Rd+ ֬ԯ>s/_ʯ0ζ$u}poNlIʎ=O2[ҫ8Ê+h$2Êc dr'ͧO,(X.:npחoW(aad۳kM|q±?')!ĸ??rc;+NV>AjQD6W0^5㒧\J3C)v9-\H%DccutX yY `%aB~v2+*U[. NnG"@.X_ד]wђ͆LJ.J ".s nEd7M(.tb gQ)k)FRf󙛄XzBWt'_ey^`0q~~~uuCO{ÁEl c E2T&D`&l]| 9v񃀀\/xLCd7nMQqBDId+W\t]׼||b:Jg -i1)Gl80(aH#kby{Y^^^[[?%8֭[sssִZ!w?p5г,:&Zf`׾:?Guٜik!Vv9+kYzn7x̪l OKktPPM)U kb` џ;j /ײ"[" .ؿ q~? l[A%s:a:-2?G.w9K &bcC4cdPVQC11}!@qUfd嵵b4Br7S[jE]tX: aք [Bڋ% JխP<>}Qls0)/N&J\ŭ8a-,,lݼWNnͳ1p@ĄlTX #BY/"P^aEm\lͰ; No^_R_~ʕ`g(X+&`A)Q#)t̆1dXgX tz#sꇿccOܸqcooO2Y3/..J/˗EB9))J)!,dc,7=__OMzEqN(斩X U^dHѭ>8gL30wVz/o\n.{%SEٔ\Zˌ= *m8bf4|])q;!Db Ecm6Hb7*cwB9v懿rСC<(A\e6sssJhtҥsg?vx|1塯1J<v%cqwvE֬]+ !IRX+$Qʞ" : >G:~O8nzza Z{_}vӏ-pJNTDR`( |ˏ֟xk%ѱkɀ*0Jz`EYaevWoBkSkM=4v!U5$WѝRl_S{}˨6oҁ-9#_i65 ku\fu ^5O_`I 8t arUsU/pʊ@#oswq9E,r8SyMuP.צrmZ*a*P0.e%mf .Nl&ijs$aN͊`UXlyӫ^;4}!ԹT'b<87_sϲ Æ "4IdG…B) (QN QUf$I_ =`U8QF7o_{d= ZIAG[mЦJ!j dIaթg% KR!f AAQj2L#TʌFDgjwwWX ۂ`aaAoؐ}z12Zfd}"0TW777}l%[FE/ ]5Z{Mg<ˊb ,9%6EE[YVhnocaߛ On9h'2|0BQLhA6Kk[&B2FtF4cL#z|n'\[jg`gXCyW©y8;-s1ZB!cΐڊh*[,BZVGWư0VpWEopM찆4>5. v ZmV+zvp.xg}y0MrXT2wNDh؀2hhN'>rؔ7IqZμJtU>NX%jmJJ x?'rҡC;*N\tM0Įvܲ_^N7pg Ob;)osƦЬe4~p/F{+wv+Xd΋#dXZ2+%a9WUd5d!Sǫߑ#L}f[7˚j1f[*M0]]p}7`Kr@X( ?uo! q7ƐA4 q[IXGr0Q27$?Cv;YqG|t`Cc(I,,s榿C 9:o z:u H1GCi8xYe~%+0J @e @))x82HH}_O|p΀aE~1?aBW?,fPVǨ 5׮./////dNgM(rڣ+[W 8Y$}b⡳`pr eqݚ*L*\Uo_xtog?,̘pU`~I՜'Db= O3~וս{`%&^tǭfiSX:.rXQn I(DVR- O\4#'ooMaclÊ{ 22(7-",Qs@[,K8)2TB9vIՏ傮@+4hR,uKPi !aYyM$(d1`WƠ1MP`4""Ŋ@qϋMҒ;CwaX4S/οE" !*s`P 6~>no쬭KnJja,8nuj+):Yb ERf 痔*(,*fD-ʠ䱴u>l%")w.[,êM^UScZ:{(s.ļb)fx\ Hi&6Hp܁*xM.aQWp 牄b;$4@YACb*ghN?;eO0`U,;P?~sNkR3Jt;ҖQGEq̈':r:ڱcS~``L`B!1S)^Pእm qlgTqE_ż `!TK)e n޸A Eɲ6&P{bJK B@XofFgc@)0ac( ` ̈&Hd7as~'O `uu՝ܾ}[666Fяgo~hcIRA٪0)3̐"T1P+׾/U׽yVCc$ |JtҐ38 ktlsxU`i:EX'7N &?u_XKҶ;W6wU@~w`*foN$S#噣uxE/Ou'"`\sȵb-^%j\Q6aA*üJZl]92HÃZ0NV ZUYaiu–C1[#J5d6.Q5(ΉJ%/Q<(ȶ:d[0w_]]q?zyE0e(@dÌh 2v˗\)lB̟,óJXUUf `_Ȓ&/B(vvwggPk$ER.PڂhΠEVE@2"&t9 Xm* fFc(Ƀ H(@ H)*2$DR u_6;qaXD=;;+4{O}仾q}~"72^IqI dǘȰ1 AAGcg矽uÇ#*zGRRXp2i_Um,%Gw\l={.:\5!Νj.L^i۾qUn0W"g)4k i& U8GKt\Ԑ-8y`bfXuCf.{5wFj-}EvrkdޙqmQT+)w糲,(p{(ыanӓz1jޱFn \\ tXWFy[XY}N]]^8h]"4 xήm8Ł1&6̆0 |bBV4xY5¤m}ت~F =`h <ĩ]S ,# ;;;z鋈)PiH"P%)T,%KҠFy 4D˺ky5(m'z5c=}+S4/ʗs_|鞝 `gg'E3sG+uBR ͩDi4y}=MSڛ}?ޭ~ԩSׯ_oW]JAGK<+"«-U.ZvI9(=-u?1\~t{FU&?@.uW4+䮧>>CK.0б;}8J;V>P/E`jUxЯh8 q;~С?7#YU&gt7SDz5O ̜`ؼ ]]ŕr&LQK0̀XpaH9SރUE^Nl5Gmf hy0ĝ݅n|gQ##!`6  [av 2xhŪ/aXb;¶ 1ʺ DXhwwE iV%IPSJjD@RCt4RHUC HɟPyK`iF##c쇦hGߣ)~;v]pիWORjzzZ!B >g?m1BDjK+K ##{}g;y_dVn}2vWl ||tymdS +Cd0CySX xVyB:MppwAװv;{sw{xY(׊$#L0] `%s&zE}ͳM%SZ.az|SI\@pu <`;cC͕Bλ|~a@TcwqUia΀c*86*mQSbr̥eY83K-ư~569+AyE}yyٟ_ǟ;$~sE``("!" '~L¡ 74hwtiBs+D4-DXH{@fT*Ïk QfO FAh X{5z>zȬyH<}Z.lr" k>%D_~{N(xxwY8vؙ3g.^8":MY.* CS3F!fԓ816}4K lcALs 5`0b7%EXVˣyb݂˖\ >ah0ܚL!d^ª([1e{zmvEo蝈<ϋg0D!zqqqum~Y W<2600` K,1f,9ӻZ<i"oqDa[p0#u%BF,(bB bPB3JShbldI+`WWyna 5YX-aR!X(?OBaX>~N:w\X hvvv7LOOs=?8  :@HiB0OB)XsϿUG.;yd|W)a5YVQ)7x%Vh.,s E7<7u°ҹr@}_$i>O| 3%`=q8-X|%Y{ً7?=oz,?~ٳN-WA&ϳlĬ=W(ڟW+g^F_ូ*11:SY<O>sҷOA?GӃ×˟W;{KVcU;Z0\ ٮ|C3RA>M׀<+k_j\dz\­R ϗc>شi("X˕`܊Um>hL9)XuDÉvWb2*sN~D~\x5 <ϓ}J啕'>̫7A#dE@a:[ЀADbÈlQbBXbqlC@9.d]Q{ta6XɶK ʩPZ -BFB@@⧗}@?lI1 d8 @ceA`&;FBF20` 2Kax[;wsמ<{RfEdjjJ$iGSIDJ]%5AdP!2!P"/5x_`yQdvDgՂmA.d↾ȉxBı"O oN bWy٢o}s{(WbRbb߰4Dj8$#SYEF[F aRtn&4C%~ڎ3.y,+v\:ʒo?)MTrſ>E\;~wjnڛ[^;VR()1M%@Gzy3KK r}J u͉k%gx%UZ˭8}=leuM֊̹"j ;A(xK [pZn}SiCY w4:t&K:Qa!枺I8i8mBBdpTo9(a'Wط ,t\`^bXVEl `nu(&smr7ta]0VuQ^q}zEřEB>lU:Ao˼'D}?JqO_?DfX#QƘ@"ЈbfF0F5 ɃʚD~RJ q}v8Yۻ~>D8gGV~%` b KR| %Ml!I!;jMCgwgzdi;^67}ҥW:t" Jl~~~yy~lXyǨ? JJ.jbbOГꄞ+wo\yΝ;'4 |!M^|acΐ:akzF/N%#h]5NŘ4vuNPɉg{.>Ġ wsI' M큊1c2mcl3g1ƘęH$; ݡvWܝTypGƒ6`u! s]/;b$: K kf iuxAq0*]&:`/=oo".`"'*{v(w Sa{w6{!:vWЏ[ a.0+*_Vo&ھ@pW ]qH(.Wu,確S!wU)[Ss_&^˗:+ GR fa}[ E-Yd``O-6Kv\jD=0OOO:thie+7w<2<4`uX0,32,u uyuSadV+U:iz _* CERTbf"B ;@XfT"b5ʲ8*-Y  %  ^jڽP~EzQ{vڻwmƳg^|Y*]b5á^^^+;lLxKy)B)$BR`BEz{| Zhm{;v̙7n00xG}!MlKIm'%:N[]M ntX ts]j0 sB.c^Hmd5qyuȠ''4ȥ'cv|b1yqٸ\N^`h-ʲs}T[qUzk|-(Gk3r-I r_̕8J65n[p F=WAiqJ= "פWP{XX_^䓾sbO{d=aիWZi;VVV;8vL^Pb, uXJ&k:,Gi4 }O|r\U!a".Fy0d V2o;xuU :7ڱ-*{rOW!";|9;&L`IAN֜[rmr͚z:}Q48I1'RIO]gr#;ސ-uE{C侧`1Re;0F78s`)L e\ݻS|Gg. ߚpj8X*4gJL8ijj*=FI[:t#W 2CH !`DB6 4b+6Y80D$D`[Y1%MGfDB!Vq.J) 4\A\5i\gp;b"'\Ja0F6C°JIkI'D:g`Kn߾hDJ$\[[_9q 6200xlF~XHJ ]y=BOVimΣ=5^Gn\8ɋ/AgXH N&`oEq\|Е㛻9Ot-0nyZqlا,o-4_A8 ,rOzj%ܩԪ.)0&6[wi C:D,KńW6޹SF"qTj$. |iKtfUaev#*._p}!azҏ,KʔVY;si d~a ٜxx' ŹZ3ǯ2L( Xq3Xs̶#I/Utl> $ѐ,790"X]Ƙ b[Vd9U1 ؘU`VdYXq?,Ct HH1E= % eY&%*J*@룫|DeN/-sQ,ldkRgJp?~n:uܹs@VgQ"gg\5H! >蔽d&KQHoS^1g 2+Â%c'4j9\!Vs;-7.︄>N#ⲑ[E:.n_xrq7qJ[k tQDheԚi4̉ hY;W[]sXL KW5/`M".CtsP9-BZhBZfew50r s[!8oӷ4QOySme4I~le~~~uuuzqK +R00;E eTD3ܿV~ WI=Qٹ7+ M!ͺsn_c=[:6V9*LEhw-åv_Fө2Jӓ/_]]]]]}fOQ ،,4F^l E9D )(D zp(f^<Sۭ[wyHH_EȌ^0y%3 $R$P'ZAktX:goݹzj<"İYk=O|JY;3Y"BE&J&+S詥߰N:u…,ÊIW'ߔk2>Е3 gE8UX7yhiiqX^Wn@Ra+\;TK(n#}|܈27;z |X~ئ}8p69Pvf+Į~=xܧi 앳c>WX\UY%TE{RAV|Q_)JB@cMX% 9~WYzoye`?\hv Q|⏸6G̰666œg3 GG +04cqHzp2B,"NS?" n.̾xqv0%E ccsBLԈƧVa*%Y@,-J1,cy  ۺ| Q)$ J*PJH$0N("W,}c/_vI}_-O\ܺ r CdpHB"R =^azzjз<^a 9T@DٚP~w:av2WsSKbBJ6NsQ|\qJi5k'ks?Bd$n%iFw7rndWی,jKz_6sZX71@RoEեILvrm6j$ C~d&t;Pmx/}ϬA}ZzK<:}I$A/$)KN!E ߇ {(H8ld&ln-kJ)v#BWXJ*1-2p&)w&B3v_u[n^y%ZKZYfXSSS+++'-<2f00cA}l]B y8e u$O7=#V8unko +dE ZL+ z+H%Y(a"@aX2BR`,[Pk MC?,EFP{lxƍ K <ϛ_,9ffF9[ lDB]K)ԄH% סŻ"_ScKs=waz,]'y[>AO[#]>kZDO^eRdU7dLS>AUbXT.4\XPfuqoov`ΧP,̙Lxʭ+[^A1xhݧɎ-C^`Мĝw|?j7Q>v9MO*1yK)iR]K3GN|UaJ;Y#I+:s+2$O.L:l4*y/5ȸ@a;; VC3;\ګ/ #憞4S }YīNie055Fq㞥e5}37o0~Xb5202,:p`L yXX̶Z[5p*U9T5KlRӯ$9gdlv9m괼#^ߌ˅H+u7ߔݻЍSU}L'>٭[]0@&,[0[ *a)*ه"/Z˛M$ƞ(Sh; }劰hW(V;-j2..& Nw ى6Rj}ff&pE*'DzgnZze p`aY1@B~WQf,&Xo7*6ǟ9aTړDņ8eaB` f V.a(*BX!"Y$",$T PZYӫGib@}+|r_ޑ(bXqNM/14ZuB&(BF3/TDB߬E¬]ỷ'Ξ=;#:uHy,py%@:T9Ea!\ \f su!2I\sͱX{5I祶+Djnnn>|\@?34; Hjdo2m:a8!D 3Eh݅?MIHjǟyN1~ BMYl8Z s&FsQQTu”* C2!hHK(! ,ҠԘd, hJMM?u^zƍ)"̊g20@do! Zh"H,gE`V<Ô%&-im6bXLA7>:W~ bcYAHpW*yq nX}^8ۛQw]\F@R.Hvʖ%]cl_7QmlаqP8&˹ ;rbv&c%ڈu~OYXQ$4jakz'A[|*$z~&.&^ƥߞR;K@ Mctpْ.*-k%%Θ#?fX؝R{D}pW|Ez(HJ{4E\,5mō.0<NKYpOڥbZg%0Dt677:Ff02Gf42X)V1AA$b06!,H{HGE܅\]pG^a=D6B 0s*kblW֯#2Xc"*{BP,ށ͔$P,+kc,*D]BHk׮esr;x b",@x  \50ld(?K KHV)TQyʟ~my}.%eXYo%uf.r%CZ;|G]5>Lz,ͻOeGDLҔydI'H uZ-S l/,(o g:ǖAuZ{6aT륺OLRW.o*(7+5Y|QF)}ۥ}9p bwlu`o\tE, W[(GYJ"rW{\嬪EA^Eyr#@1bwtZ_KrByE,'!gN$T4-7^5XlE szlpXPcd5zBBpxӟZZZJ9O,LAcLD${ Y{3z{2o  Np"@$eBH$v([f’єC0hL"  rB@ ̂{޷{?q2rϛU=Lśꪬ̛޼NE)!ZK[xǭcgFR$8*n G3!_EJ8xhV&`u{pZkdp0ٙWnNk%e{RZ ͗p%PÕhbK,)\7q'#ʓq:J"8u  u|6n6KL;;cv3/ZCAdͬ)'$kS8QְpPz)>pqKKZ뙙k9șR*EwuDKoJ)IxZKiHfggl3Gr}#]s---}hsR0SHf祬tM)Ψ)`*FL ꜏)1WtWh_g:ds_ht۔8`UokY 7omh^"s$cשԿon, [7&29Uej <$pqSw(9q{z n\po%Q܆ƍ2mYܸ~h%3C+rr++Ywwjv 'Vѫ*V`ٌvf_Zg&[mg$Ôz@T\i?iIG&F!aR?~~Gmhl J̰,ˆ"Ɗ3 ac`MtX aNV)<;W"td.E(EXx~cgd XR.`!qvGoI0O'J+W`1ISswyά4Id 4{^])OU ?xYy* x!YaRlܙC/>SqQBLJSRPyZ0'{^w/..NX/K_S-R<o z/ Օw3j*yV>~0IM,SJbyX.?~_V"k:5hۃABgRȯ6771BVՀn\CX8| {T5.nXRq-ׯM{׌fK9Ǝ Fyc(jFᩭcWm$Uv>Eb_&IT%#?\{o׀+لX;"h֡p^o?⺯pQBBƿ^vR`QGA.7SISɬ\xKo}1\PV=\0Z]z[tm}֏8*:Q\t1g"z<Z/#$-ùwiAϿn4Vˬk;GG j8 iF\œD\U}8%J?ASÒx;:/;'>Ir:#Zuđ'Z%BϋG;,)u '׿JI Iͧb3UQ(B*!R2a](9zrY ty%'5d,Y;o>~*qBDQmooaS,ϋ9J2)9Иn[z sy 3!2lf"Cg~gsss} @aX.{R,f^YYhyܜ#ʆaQ&nooommmmmɯ`0c kۃj>X,+!}gXh!)d7ssfZW=Wԓ*Ls{8xҽKG$Yp]V5JuP *;Ob.[]Uk(cXG b|'?o=0/}}F#4׬p,ApqiO$HXI09Qkb:H uds$.e[,fX<<+C@0QBlz?&Y"2`1'fi5DFUq.p׬d3 rD^Ŕؾ|cfU!KXJX[CΗ֓m{8go8;{T9vVcw.67).ڥޯ #OF\fZ<64Sa%ﶍ̋=:*J3;Yi.0= t"QKTxxj08aYNiūOoMOOOOO `,B9 RZsڮc80.zJgۙ+rqʤ=$4XŒ8I$L2&xOH*K@PbU4 _^m Jy_/tFq?NZfrv'CR~_jk+xA.)J+Xlh{{{ccc{{\۵0Ƥ꭭ YXX*1ɓIkR)nxT`Mٍ^aflk:Fv"Ƴ`nZ9bZ2eO",/R]Q]TmՁN AFM(j(nù9PjU۱fq{`q k\>v~ؚIG]XAWbn].t\5:.9Tc=]MN)Di x꽻Z];uVhl)f^S5+rΔF4\Ztn\=vrvWGh-,,=YǖV6pffCwKν|e\(cy.s"Lh$Զ,X~[k{R*1G ._;NK) 2Bkbj.C8EClXqSFqrAzLsj*:,cYȲ[;?yɃ:"$0 }73*Z)-YT*!{id,Ec!+2<H—\AzO*}_HZ0\=.>XxEϕ+WDØX*:.IewiF*i%ot2ݽ Ҫ_0%úxe3s51˜e\ޛiX( .3IGک0STEC5,vlq>r2.Y 0E(kÕ+C3>Emv]6h.`V\K#'W,4)acN eH \bXcfv}|` saM]O!O`Hmb˭UB]ULc5PV`{@2Kff~4]h-vgISARe?'oBbDVd&Rlm]7/~7533\$¯k0 z߻bJ%)rJA};%#.-)q2`aqs3{\IRS%y 1e+Ll}e-#0{?񁙙,B"\ZY{ϽwdX ҙ$XR*^3S )S Хv~g^ozz}yCA3DKŢR-,,en|#'o~Ew˯qR9}gH%s|t1/-3Q}%gggE Ľi/ o`a,P.*^!7kmb%yY <ã,n0=ikX>u* ZzULjeȒYy~mRaIL.-m(ͱ^qYvu'w<(\9jMOOl䚳ҪۣF@oV?X+,ն5rEn \1E+xIr_;Q rk2)7A ʹ=MuDd [ *`1]sյ6;L-6~nMàuAʁ^58QN% M\Q""S:a\B8ȐF3;EVܔ_b ϒ̲ÒԳ;Qβz&LJed#9jdvHb)NNWH`A]-B з~WJqʭTlE1YLWq!sЍU ypyC%J  J\pP VZk"te-k_xevvVZO}Is̛+kk?[LntaeJ!7! ;<@3TꏞX#aMgGea˅^k(֖R*~Ť (l)vo|7MBb+G v&՚D}k1:q':21](_C7͸kn;B(t vQ {2k88Bӻu06'%3C! 5QU,b&u%ra@Txv7'pj]ٖ&?RGىrt.\Xe+W[:ჭ{dյlwr S '7z)Q7Y#Y1T5<8]&aФjŢ;*jj3ŘQt.~=5R[)r&6B.\R%f=}饵rB J+q:#+@r/<}iIV+ +VVvcqI)F)CJ|ː)eS 1Vu 2Tef?n]MUwqWݙٕ|^J::ëNv'{=p7!8r@\j ad$9 K ]B`}rX; # **X]v~/9y$3ӋO)@J&" )E bKXC!Y?{ӫG?0????d #>r`0A&QiFK"c[ؐa"#>_H8UÊuTI$(LK6H2 X )%X%`0D9aN$y'`EM[^,FiztbbRDd 0+"E)(/)Zd{i׾䃽^ojjjffFPS) qPrfvv5 0ȏ0 <) 0tľ2-`&R7ՓG8wDDg8<<:WW,z<ϋH캲Ukr\ ,UC6ypF\W4 ~?==5}wGWhTH D[X6V{,o?VnK&ZǍY6`^%0wh}d1s̈́[96<O+uZ듉k/X1B^\<8ˏpk <EEVD2@D2Dz"d |>E#u(z_z^cEkߊ>DK=d&U7{qH«gJ>oٝι l'ʷ!滵WCf^C(;3 dGg8Y}\0#zC}BF;%jȆ`U!o=VrPWv #cr(]Đ;MBV71ꠁrvv⤰XsϣF N1)η-˵P|ק~ߙn9|0-58SiAT&VikΘǢ*.HdRDO$XTĐ^|#SZd2 WӫH(Ïo:tHkv i:vs{ujN:* cD#EiG~ˉ+D70syfV6 iR .\0 *Z6q•M'W?sq `ss3qW;\96<j}h0xܘ`^ٶ]>2U`/.ZVxxezfF3j+->s&YHKdE<= CUW_ D˳ڵK\|Þ[^fBƫ"S艫;?bO0Fec5)V UJ,Ȃb*k=S`9>Ҋ|GEQ ZAvk{,>=gJ Lz(RUElM$-% l|řkE6P\λs9kYI]ϒOGIyD'h `FBOK۔eY kq BXKR0JF!c Q?y֖ӝе a..-›ўfOTla9LhNug) p싑 D.n$ź"ysW|ߟ$>eJ"eʳ766[hV`ɈȖ LXY[[ Ðn܇.ܔüxRk2>B'"{]F 7 ^os͒bҍHnզ'_Y h"B!/~kizם73Cȟd%)W6 +~?y?=ܳ3;;~'O^pW?#I,g*d}P5 `e X& A\+i:aQϊeY)VdŎ1E1`0;;KDJYiDEѹ=2$WZ&]ْ/lsp\ZIB1beA `V)XZkx_]wuȑ^'iɿBz˱1fsssccc0E>&麟7mUw,@'{G.ҚRw{^ٶAzDGg3{-,K hZ侣J`fbJ6L,60&egcrr0 ZZͳm˭a>c^D"1OD(B0y 5Qp>[/Rꧧ1f%zȘmRG<&vy?7N4 ɥ #˅Nbbq3flS jO QU<'ODe;d6s7N>+[ju \Ĝ`s+!ƩJϽc4,Ex=>|SneEv;s̥K666_GzXIR&aAJBLD}>K?m& L-,//?_R&$L2 ;!OYOyHY5"-܍NN9qJ%)D kcn UbXeӬCy[ߐ"˅B|p!o\gSoa|a,9FZĤ@`"X( J`!YVZu#=`jjjvvvaaA]:IBhRQ LW[MH|1)E50|R뒵 k|oRj?\"/6Rk=6O)ˊ7GYyoFRM+DR"Ⴭ_y/fg ix(>RJͶ˯9k0(Uߘy7^i5NRB~=:e̛{8aÞ51ZRyEnMtы[ܲg*Evgh`N*Y5]`| O:P6Ss(p*׋Fx:JkHXj9:%l'K1vcZrR]֚ UR<:y+Wן780<,%I[b8Q3Y" H~K.;vdF>8??EիW#knElq+߲ż#&(kbb;- ""#b&XDH,$g)9h\E&qtaĊ[ 7HСUؼp܀MYV5^ IAL& BL6Yʒ@X[VJ_ǟÇ XYY%fKCZ{lT֚xִ+u卾FbURoxvXVaV;tPE?'?3/>y>bLwF{fxjj[ M xUrmVgv,aVj.oL'Gհd~gB:1*tX{D c>{M}%PCǝb~gj)Gܺ6LPY挫B&8ܯ=oaԶ^wHIAqga4+rvF}.D _N\3Ass)sVV񅱅B}LJObUc;+8QߞLh d0P>]M@]*S^h \40i|&l=٣` l9JlT^-<'s]Uv DͿ*$7sl6A rzzٳ333W/lDbOwFi}=D&XcJR5VL~--|+iK.\pJcǎ-mm7>xyeA D paA`DCD%c`LWF a +/5YzVRmX2l! @Ev(Ĺ(8Bn9I # 3BiQEf$v 8ٚ4TY)֊JZ_{ /_NYUTex(0 ;;;Riq|z2(*_hssh"6:A]{\^&{BjL˪QӪ>QJn@駹v|e89ѭZ5oۤ0ęw.1+L_%"U*ݏDUriXwP!ѧw^ݢԏOMݑt֑hK!_\Ƕh[:.֓'m8M9U8E[cgTٸzrQ-,EjHƧΪʦar`8&ʜYHqIú>-+jfڱȸO=jRx+Jõ;+nҫઍC2d[Қ<:aHuBZSN>|W}m NhCCQP0#$)gD eA}Dt唗i(j'N,>aX @") _2adBDaEd"!cX؈!JVxHȚ -`" [0 2qs~m?zTWL d0-#[ٻHdPƗO:%2+X KHIX1+V`,%Ԋ{o=:ooo6R)90̺ sEW02Z{$f_ oU\'XHuk!qB{@ޟҵq(kۣ⹘*BjM+&GY senf*{H;|o0{}w&$ !,Ժ]3+/{nȩ0C딶n%&߭UKy8=E|.Й}+3$V;_s~{}ImJu2c?(cdPMzcЫr$񤧆!_ӕ;8ٺZej'qIuR,Ç9s}ky (4Ä^j,cMss47:nY\\![zM7z?ÿ T@XaBP(XhFd 8HHL̹L ?t+bJe"!V܊% Desqp!-+̇2WtP( JD̰ҵY R0R,EY+f(I.׻kj<ҿʦC8#w稿Z'?鐨gB{6.wUxACSfk@#Y8Sևк%{+ܷbn} "Rydx"'~yHJU@4i u1ylNux^q4ľsc+X 'K :}}_z B!A($0FdS;=~k䋦ZS)uԩ^>gE 1MvjQ`0@P-B\B(G0a!rB-HXlD DÕ(` bqVP˘ϝ@D^AR,qvPܯ9r̙'W7?DU} hP;ڲ (ԙ3g>Lᡧ{F "D&Q6K:,+Xo8q䟿Dtiq1 R.M7ݴ??|ߧ`?%96_G0[VP80'++Ɇ12v(2✅ F#aD&0֣Ş+yњO<孝^'s.N~p'^0`J!AĩȰ@a1l> k001P%vfо=vv \B)VzK3G^dٝQ6YUnލ k-~5La Yb'*{c>wE +A?Ǜ'M[yteց+,]ѥù*fZ#0E:+#Mc>0<6`;}wCL%}>.a3wZN;^u|C}j?8P`WKM8l;NNg`~p!.ſxu^%sGU5Ob( =Wkt }W.m*Y4K!n^5v|)3x-f\S3>|xnnҥKϮo_/~槦H)R `bV|a B ,K_Kx3gAMǏ}ի?_~|kZe,A5fc`"V I:,qk!+Kd\}(at~e3-2s6uh0:1'"bpabėH؋PWQB9`rZl))dl+ke-XY(VZYkaRUG}_ZZZ:~"kmAR 677_V j*ٹGJWϗy_e2RPFՠ8KTG_^{[Ncp zA%?yߏeobcg` {aϐѤ5C&"Ӥ5Yk֊"f$5RV ABrRN0,++qmO TĐC~,077'r333,fV:=?qmIʏU[=]q°@vxc(-%fXB JV`Պ/O/,>|8aMMMzm1 fIh}Zew?>:p~hdHiu.C%9Щg] r0-PD+ln"΋?8F`#AE }'^4[߶R,]>n?(z}zssʕ+'5/}n]xcaݵ0ʟZ ;3m1==}̙ .]o}ݭg15<|ߚ= )X5+Xh3NXL Jv X젉ů]j0,CD/}v~_4Gz=J;,"uωCD1Jto$^U*1U bRsO Ec̄veLD$ff V|;s°U-+1{^^[[;tZRSvvvv1BA8$|'b)Xk%.K.rlx39tmU^Ŕ-k[ȵpk0,_EnU:W 6]NnЫN0$@bۼ?*^UeuO6^yAZe{r "mf`3D>ɼ lbe6WT|rh8KK^HqQTd>g<)8i&1_5uҫgjp ;UW .tLsS(].Uj*)jJVbR0'Ӏp{{'LwT5xϠvB P誖BixciևZXXXZZZ[]o?ѧ/__q9b"X}ӱ+/_>K3333=zt~~~qq7?s|}x#m#ÞGZ9Ҭ8aq Z&,֐w6 DA $ˆ<Ǟ::qܜ?5UʧˏغkTՑԫSۿKKv .@arl-b(ȯ,EJy`'~rqeuur SSSz`0W h&sAQ/_p6# ޳c% sr?c!ҁCΎ[+:Vj^.cՕ:ʝ W,- Q(jݍJ%7'oA=%D[2c^bLCI)0@Dwz3ʞfGȉog/RoD<޷8ndZqBv[nk5B{&j i[Mgu>~ vHc\cAǏcB ^@n5_H`Tc.gig2|ۏeǛb ;3K.ܖݹU]LyQbI2A c(>Ylxر\reukڣ~8}xk b,X쭧 ~s/^1C]b (GM;?'Ye8z 0Iq3p 2s훂iU:Yk" ћ|Zum9w#Wǀ7G]Lu9EvXh]e ߂6@rzj:Y&Wd.n7r31~l, 8fE8|áWpcOV bnZ"xaWu'Ҿ[w vp2l'wH[1$_W$ )]BX[X"b(1Z^w)1zjcoOv o_z7$><77wҥs_oy#)i*&YZ[- MZT!:I=Y `-K-Ek!"(26.DQ$W1 REEuXJ) ED CL5qU0 QXc4pxdf1b& &VD̬4KGR}хW}`ysmmMA`DrWV {A~|1 NBFNA.ӎltUpi>Hg's_=VՎaɶ-`ӞL$%$5VHYgw(z^ܦ1%;1/H(]Wv8RT [ieuveӳcp  E(H)2VK١+, R,QmIHS)Ӷ,B-$h" 0ٗZ߻G%}Ku|==K̓|8]{8((_(&DVuւgT *J2Qvv~Bt4–ty;*t\F8p ng&(]꬯y[+8Ζ SM~|y x7Os qu^ϢkMD[-3&]5EꃱHacak׮]rKWg?ss4@@;o;ꋯKgϞ=rP KDo˗/c_/~o'ΝAaʐ)TL!SUa.&`i]7hѬDܵ1DžŔ#,yXO^ȗn5&|n [GKeI.v69e3zPKU1|SfXT)u0zG]:䷴;"]!ӆ"Bg dJAR$Rl=/j8f+!J% R  Ĥ WgY0YD>IS73{'[hX'Xu-8450.S[r@=LʴV ce =zc}'nٓ"^9kHSY_{^+&nSNmll\vO=ѧ{ܙ~#}]*3P(RUz>@djꂥ VqͿ?^'N:u+CŪeW^ `s<{۔Q(")n"A%m4_UJW Tύ2RF_fFL{ןիF$U%&b^ -d8עAnlQ#`1(XU@ɿZ]ZOM\p{RՓ]re<={֤+NpWy>}ɓW^_o\xӒ)*SHɈц"ԢmBo?ܟ ٳg @S:~{e._\As-`VĠEak7 B3˺4hk;ʹR %L@J h%(sbo>x;;ȁFz,qڢn#ҽPשP_}l>H+YNs E(ɲ`xBbcwiA @5ݬ+($ Qȵb8ޞ?olFY<_" &3io,DU+YR{"#10v#iD'>6bsf@9apu9jJMSA"ZYotN˾x)([aYƌL:BT]*:O[$3i9"+j 8`OQ[>ۅ%,P&x0N ycm0 [9567 [hd z3 &-s@ZVKj`.p+scمJ+=s~痗JN I'{?sZsM#Q:y']k?'>{ۑu[R2nF69tԢItO=O<^"rȑSNiq;O̳\t)r.ze :`j`73IQB]MB6a %nXmŰ?'D͕S6 TB)SX_ο_ɓ'Ed궴4sk!8Sp9еD\h۽ۖgL߻a]knUqE~u5ƪoֿ3?F1+N7DF'αW*N^S9֟^ L,u)ZS0HV#no:7Xz3q tE~70e)ωbp)4הv|HL LHMMAI}i'm"vTĜ6<]Y7}gNBo3lU>]Udq1N4Rv4_e BBUzv /Ttl hP*\ЉsFgr /[H$a@7qtooyFD,vslgETbxѣGظ>?{le#R>tEXY^$JlOaiJ Ԇe*!%J ( MLI>t?ڵkN]\|Y &={;1лf_"bKL$Dx(^J]P,_uM2ɲh?w*uRG"G -A^&/k}D>7ߔe5⛚㪳ʻr q%]{zDL{"{g".~gLw/{y8޹qL1i$>ɨDy 샜&]>3\@[Os+oFQCj(XGܧp!^%Fs3FM`YO^#!=dѾ*.G3[Vc6et"MdxLFռZК8ДM8O , JEM. +<[ej.su0YO:'c6fs(i_7*OsB'mGID:I3 cY@ekkkkkk{{{ׯ_WWؙu|}C+~^5R)I3U3>svwv> }s뫯[_u}뫇Ww_yu{vv_UNC;bKKKΝ;q&"/^WRjsso=u2Dt2WB*!h2<ƭxV^#|6 ƳXJbR8{>|X,BE&XD􍴊Wp`}>;yFӲ̝I7pC"a'YaJuCՇΩxg &0}{"/*;y.|A뇊<+lϲ'X:n 1Տh}ևExR@c9F'O#WEr2i!s-q1޶,Vߤȶȫu.r<*r<"Na<\\6ҩ݈io-DʇD&f>˒L`Gd ̟m qCO.c礦'! q`R,8iep^OȖHVqaX,¡9Gw,m+L ?TAntn6;Ug !djx<βlyyH_vիog^;Ǐ]K?sgΜ9r'Nh 'k<o6/_嫽gXYY9r䈋[FV/]amnnvQ pJPL JIڢ(s!^l-pM >5HWΌoɲ%F XiXh3jg[~N)Ri4Jxus k{7q);U{mI ZA,Rj=VgU2yDJ>Pw|>~?_=tF 7 r~)Xq6m#BL) B$V-[޶BoQJu@*Cz$E Ccxrǩs{XN4Ǿʜu7­fv~` ?6I-Uޏ=:677777~_C+d._ۻ[\i5dKKKKKK ֲ̰,S;SO=?~Я[^22S*ňF}رYEce&VFeYb]rgK{K.F=HM TEpCA iv]Cl6 J-DYҙlA &Q~2r/_vlT_7M?UcEqY,x9P$Uꊏ)s*xܣԛ`a%=+"k.}ނ:v] DRqu_E`e<~xuTDF}dVzDx~`<>edS*x:"9FkubšieQMꚿ ϗ1) eg@WDm#70+l'8NLhU a 9ì 噫kXhxx@«$P.!PcjM3(,FE&jy xÇ>|̙3ׯ_~G|WM: yLaF#dYl||6 G_|1^v47Яvwwo]?w5xF JZ!H1Kp2˺J_,o  0Y PRKI'ΝȾdq,--tݢ)6l[h.ź--f: imyxQ<˳*9E7Z}uY]yOhDQ\p?ϲ3mQj/t87sfX_rC*񳎵<iit롲6qUBԍJR+ܡK! ߪSΈ+SJ !߳han JKPU5ZOjs۵~xF&JoS <[tygQ\x 8^BdyE;p*~%Ms2ߜj3>OFw&vxhOɦV)nu.԰4!,s^(;U(EȨE6-PB 0 qX,wSUWAW9F~#XUo4%"6e$I-ܯ4PvvvN>m;j&!cspxwSd$j}'E Yh=ϯOj}Emmr"#*ɲS\rFWI%rXy}ݚ: S,{Y"+ ݖ~3N}Q,Otlx1)nPF-~uRҶEZЮc.rRwoMV^ 嶗M1,vHD(uX$ bSƀ}#-/#Уm@ha ynElȆXkpJOCCP=ȷUG⼯-ޚeZbg*OOA^:ٯGh_?I'~z/./OlNT+8@IC*ӻN `~2<ԗUl yv}ȳJ=\EvݾVUaunn#Ȼ_yg& 3lViΞU mX#DrqAo^Y>tkh$JBeIt[ @U;X $` )O55%%t"IX0C֪Pk}7ک醐+AQ]$s CSSJ`_D@^a)ķP),}Hn2ɓ'0ǁ݌!g^Ɛ666H~n; PPJA%_Jal dMjXz "hIf7"`RVQtI~$Pql3C-epbW`i[N7oLy _ 2@|"Џ`]mz1hRn)dF;dwKOnS5-Kh9-{$|EH2^X̾U)e]LhK Hnz9l`ב{Od}VHcJ}"^T~אĦVo?ȲSo);{ lXu1pDd.@ PӔ✉&Ybo75V I!I$<~54@iYUzo*.݇(k8Hc-gs["%Y« &gDC 78=}bA@W*ltKNjL?bG^(k׮O^Td(Ra b6QꫳFHU1^v WyghTLU+6Z]%hb%]ҋ/m-QAg./ @~g&q]+ō{.7Q,EA"`@<,qvil]<9m˓fGtH܂L:$ׁt=P,uwSºS0lC;/`hԐD7ĬL. &,m~]> &Gr%lUd"9n%0?1Pő6|x>SŽ8Ax;IDЁnد U#gv'ʯSjQHunj}8,(ЧrԌoDd: u;[6&xސy" J^p1K/RJWZq[!((eʃx+Ev={FXt,&4a]Q€gZ*Q)CAws/?֖\ln ׃a4YL Pfp˾n텮d tfG& ,X4- j˴4:u ^ΤMl{uUߨоDDxL)u2D .4# *Usf'@>4Sʀۜy:"gr edyoDC=ώ;x! ۖ5h0!_zq $HH*ߠMF|XΤJsEw&nC=A؈+XfSJ/ػ$ v.A Obw΅_3VFjJzW'ic=\;vFrJHꅮܕC=3usz-BKZ@}E[yW.bW$|ϼ^Q YRVMªmEeHjs;WF*)wTDeʽw)CȊ'P&-,Z50ZDjh_wpsxð@uah\Y0|gUR,qP`I&xTI$^ⱞ.*!Md-0FN%A^l4tJ^1ysir(;1ÍD pwU WE1Q[?|J0Y$E<QOOAG0 W@KY]s$BG\‚ fLvadc lam!ɈYIv5KСU^J)uq{-!.U]Jd*ByM Ng6[ȿ'Z(yЄa׮]+MӕD0YUbX/S@>SWlW6[2k+cFD9(Ph(%J -,+fbV.pkM@سLd?Ϩ^41f8hT:%$x_NQ;cFޙxHTR J`y' TE*uclNKVe[]aB2{ qMgEZ<ɉnc+pC'fa!yPh`4SdOᄸ у39|_RuJ)1s)8ρBH~A~;(r|an{W&٤-q %Y&_:Kt'o0h/" }H1@*Hu%Y"t3~J.<:` wA?),e_QR};?hsmn C8"y T`AɜƀfD;l(4W\eEæhF(jm_;Oإk;;;j C>Y"! u*SׁUUTDCFU <`+mUW%=rqx%pc}:tmގw:;u0UD?: }E[^*<("/_owBVW5B]/:4%o %0z%Ma]: X"4 ƞ'RL1\Ц_d }@b(i:V2<8Pk&\ʚPg꾎rXH@,1p2@08Rִ gƁ-:Bk>L,Dʂ63mbj!0 CRR/D KkĐab(Xa;X< )[0UrMX]AuYao .B6ˊaއbP$r/tm+@ N{Ex=2B}$nmmmmm]; RAWbWh`U Q1ف@B bS<Nѫ3E unR QY0`})wWvWVVlPϜv Mf9H#ݗt__ z,O:G$*@{2PɠN8~ܭJȊ ,q+=y}I7MFU:R/8K~(@BP &%d22UJC-̧P*E@Wlt&~N"S_+L3r-r3*%F*m}pU\栳(ITx`~W^p$%e=,A[R\Jru{.=רBD^J^fh(#ƀ=Qͣykfccc4_}Nd nW% 5v̷I6ep +Ptc蕇#&=Z/pǚ[~ڿ~nY腾Ձ);aPF"[66G#gN2"\ť!y  bJI̎ Zl-A2GVn`rN0:x)C!DzTrFc2kNK"k,TN{?vܪR?LѦTc5Q- -\IV$}4Hw.]z!YүG̊3P'\^ \š|IHS~u:JGn`-h4&8\,"[󬄮BH* QRF:YjX5e&W{u\_iH6_3%kUDD(<;\j8+u\xtZSO9x ;&-E5F[muvZ3;TcG:٘lvy fM/2Ae0Ts'L)9uNie'g2JY M/(hZ~H}Z(~o" iRL[s { HrS1SҸ"+wA}/RHLbeŏV^MJy dB]sĄK "Ф[UҶh.u\Kd}9!+;IY^x=7_c HtS)9SgƩÕ ]+)n(odm( C.^5s|id@Yܫ2yܦ`5aUi5$_y 2 lEY Eʢ5zFl CuU>IAǑ,nZҦ}{&<Nh2t7oQ9n{ D9lVUSSQab|h```ՓE}zjgNj\sB OT~/>eɇ>.Nk"|{X`!D*HX9j!P0 1jMܴo#D~_J-XiI_Y*i7I*>W[`%@)ו E[%mZ* (NAc+qS(}owKy6E謲uPCBW,n0}%CCx{jҡ$D9 ^R}Mf)j|@hDCW5zs '{J `j[U-BAD~hc(l Zl,984,T 榵04gu叮mF b0hbfB^q:jb5y[MvH޺uEC='g5щV:z81Y[CµޘПk/<㭒d]C܍'{~~R͐P;x8I ©^eԑU߶zLYx\"?1ݦJ+h5ڑbpw]CrҟLq )Eg~j ,(qP W)$ ^9Z=WSNv&7C) g..NZ+kw A]O=˛ևUS$lXVc{D5f`u̮{i]ɋ^uGX""p:@#[ zHIQ%zeoAXx9j{7f]#EL1Tśf&.q0R{zLeu5jfyD)?M#6 hbr8kykTav2 (3 k˧lJG[;d8"F!b0zɉ@kLҚo Jd,AJҗ_|3kCM^Qv!(mf^WYՔW^ye<LA,siU XU >6(52%Y+FPPQy6{T5öre``XX.Ջp-ZN_6 *T¤P@EqGM*8E5%&6fd&Z]'ҟHcfb,):_Q,~{BvOMoL2Z-bh` 3M^L9e5b\&T0C[hh^%pȀdeajDeˠrF r%}8QGxDD[4 b.9 '*"ALjk,xHYl+9E Iw9.MɺғCH.!}7TP)HM>:D , )/š.?W(9-( y`DIZ4(NU]9P!-2$lDpW )K  W{>b`'}&h]ßO> ̈6KJ_v"~싷y"!xv=n_3%닶V(yLsQ׀[|fCզBU'5z!J4 NG=qpr;>("  ԌLȰ_ci@,9Vuz-9סAbzgıX-/FtX{|@a3[`_@_fk:bDa_պIM*= 3ݎV݊s֓ySJ_<& %n8 CZ"zi, saZj-ڟBZ$ }9+Q 2+ h( ]ºp(կW^.E狴+daU&Z`-٩h\E'aY溭I5a?dD ·(7@3!Ht5ӯlFBG6(7b (W%~35 qAo(KCF#GhYqAo{W"ۋY[[Ti}E&e`|F]h3a#Ux-|+TJm'MD(#'t8yc`8S?҆$X.z%V@{9kkU5 B !^sLP~{N_Ut`w+Pҧ'}5h' >7f8dQdz*iV*ؙUdOGvE[Zjccի+zk2dJoWv`zq,+F lY/t%|LD7(}_k"k,KQI3Yzo eQ-qœ&SJZ9  $&LeJr B K1@ oNB4ݱ\gH'iYQY_ D B-cft)VSuTGB| Z'. 湛=o8+ݥ}#.)յwbZQX8^ׯ_ 큷?aTUfԯTE*E&gZ0AU"RdͮG$\*KyA+՛6B򇐚U+%JUJ."fZ֬tܛ(؅\8Y;Lݬ ʠȚs# ^Qί3H4jX\,}ޯ􉠻YzYWP+:P X)cop }Lϲ 7 E--1f@.z{e7ݾ%|o1wzLx8 ]cvM" KX?%E:^ZDZ:I6/!5";}SQj@UZD U_ +aԕ&mGշ4pzC"&'Brb|CN[&@#Cqx[ޗڄZ*NQfYlܣW|}Eo=L!ϐ)2 Loe ֣gQ**a%Ƥ+U JCV6>%zIV=r3{ 3ZwХZ}Nomg Eiu6wHATQ3n*s8<- ^tvfhj^Lu_Gt )2^]8{Y}AB4˶{/>oX*BދB^7F TD+c5d2 ?+uM <h/B%n<8(봄;dg2ps.pO(:&p!R DWL*,m >Yi:1~t5$B ) **`Oj|(> %EJ$&"y$QXp 4;^B {T~qn2=^-2mJA<7h4z饗4#GTy̤ L2%Q}IJ)(n-(t$^"V`sSga T!(r,$ &3b`-AKm!-a vu%?T6֏փ%[τENz~: pQ3SOݡfDmS)Nܥ %⹅aUEMv陬[(W"Q"4dadz"*Ͽd_MR1|ۍ^(_<VblVeRN~, LhWMjGdڴԞ@ MWǪ9:!x% Lk^+:+)g#r ˝^J[arTN:BB])mAP8>{_k`2p7~3.U>]ڛ (>T PmGAףɠZA4]E[*;hi_z饢(u[X d @RB2UA-P9gYV,C#V5(QZlHVGH*H]/@9U ,+>K.J[Z{h Pt%:@pGt. d-ɮxÄD/ '0g#ȫ]G~H]qVCuu܇RaDrRT˴+1Q-b{HdFG(DgzB)ϟ-:_RR_dνn%p&O?!Z+^G[w"*pi':]+[9 piH)op`HtV CNL7ϗ6(} 1usu|bN= =YȨiw}jPDyo$rK -TĥMy!:^$NО.Υ"6\TUlotnSZ4t-,ML6+H{^;M1NԆ"voJ[n} (g۵Gm6U-p4ig. mP눎hK]vŋ;;;g-w<||myVWLAeFJL@L%jCAr}&ep!aRnaJN Wl, *+ DHI!7i? ~V4dϣ/ 7ouXw|oS"hq%^ayu=^-˅\y m)qP1ُ yPsT;/*D_Cgb%=SJ%WEcF\^>]!UrUd\1Yǯ,U Շcu$򷗖#:bESlDD6E6e ^۪^|xJ4EβY9B1HbP,D-"`)DgEQCY#zÛIΓ"Xի_,8[#+ݶ`;Z˚B Y/"!2gq`=йz(2ĽB_U(߿G)2.oXb;07Uky,0{1%h^}*:[F8 q$ ;fq*وP4Sd ɱkV"cZ Bf…rԋPvz|(b=lK/ `@\Q)2yJR]Am/7K aj*<إ_uV A*(Hdy`ecJ!LB~S>ZxΨӦ<iIzhx6>gUSGL'ڑ)*ۢ))9JK+ljj UZy|c !Y.!m?ӴeNGۤGWd795kͲAfgWdԇ0:""f簱/eDc vR)0+@FH~Г^.ӬSYI.:ݢH.lNe+my%gO](, g)aZ1^\| n L9q4ĩ*6 =FUVBD,ƛ_kss oJ9xɽV Žt1ovmꤽ؁rJ+enr,őTN傁h)x3;OW\ w-;τguNǮ}q;vݠ/N5B-| )BtH5wM5$ ?%'HS˕rk<|c9.;Ƙs95uT^k5x`vl؅oP+M^W!IzⵠųXHEiFBfBq:3F< ]nm/I{ 2:5p/ȃdbl-İ0QšSՄg}6/5J܊X ?]ypjҫ^ݡtU0y (ƾPC,\K2,_b],E=RE-]v]L)F*4Ro\*9i&g\Etom+r./tzJ)uEoV:r Y 9¼(onn:ջ赃~+p!0WRa_ ab5"L R<f0_ޥ!^UTBHXB.\Y1w>}toɔd[9{ `6mB`q.&rم|;F Ac=P9w9VD|$ ~iDZrXTv[]JN$^* }aP tB:PKk]\ mz^[9"tv q?tHmm#zH]tvz;q-@M$RDz% {ww e [Ia#ȗ@4 -;ajSm)Uas%&m.McOVZnS3( JuCATx\Ы}~tGB(rjr|IJk@-XPj:U x¶Jpi^Y`xҾ@ TB/(ʉ"W57 Ui]3>iMNln6fގTGlUh3]wC6Nfݏ2T !)!10%Sz `<5]]jJ}3W|.@9ns̴x*9wb/M6rpީu6 eogJȳ/.ۂKQp}ܰh h#`h4dٟRZ{?:4`$9_=S]_X>ֱ*0U"#_ҕ~d̔Ϩ{õ^-zG4kEG_W,F ׼ %6Q㶉pڲᚼ^j;{{?t _;p qˢci.LF]PT6gFHsUe5/S&3  Ī?dmia^<(ji_@ZQ$ k2 `Vp~wQH7#ίSy)1tLTh+nOSOU97U044VVqm!Gǜ*.ӄՓ^("#>l"=.:?c(a_cA NS^e &&`9,QmU ŔiYά#{Grm⚸Q2Svr){27:J2,+߀}*S!stlŘ}IhRao#1b,~Ĝln> ,'?17]R̆b\ğ2_uVaJe|f]XY}J:OA# KA]s OVbGW? uE40cXk'JsYb-Xq~\9[o>p{ۿ/~u;@-@V$/:3@C ^e酆[l,+M']=_zXDLo-0wú9o]4%G:5#n:ʦSje**I٠#v+@Yq'ŴP_$AKM՜`UT)[Fgyiɺ, k*]A{j'kbʺXx֦z[JjCHn7f|4;VxJSs]3xϬcG+uJiYRAkL_ 測)92{~&%[y63:7b.:aVcM\̉Cdc42SNzЭ*F.ښg"\$ ̜Gļr.; 5  sFlν R2h\ -e,PZݢotTT=uʧcU5Y4ߡkFeY^pdFHW1^y|'O|xG|;89qa` .:daaq!jQ]UKR. ^͠I@ӝ{VZhcL^"X"YqRu&)0]BgmM`dClA];N 2 N־nnV#بo8ot\GT~NG\fU2W 7L07$E+wOV8i?pݷ6fCI{SlLKSR+s#!Ȯ9Yei<^bJi5o 2E<L68YtQ^WGWo(h^jd^q"z0, v3Vv}uj dPa d+4EV3h&wiͬݘm@[Ym9;dҡFj;J)hij*$]@,SEBa!JBfaq(2SuysEYIiؠMp15uEX5}Ģikp\`,[j140`|RF */G!T-=v=~ѫϟx|ӟs [: P'Fx.0_Yj(WMş 4+ 5=C4e1X\GjhfVuocqH?YQ(P=MǸ߯k%U@ 7JJЪ]+ 2B5V #IBK`4ÍR jn֛ŮT#g2TPxeL]O>,ZWI=p\Bm}r ٛ^Ed JܪamZ.&J? +BD.Xx.uG0C RNOzLF %+[_wַE2)XGY[i4'thN%Z-0ב@]NH-FB\]NWr4+}U7\$˖QMĘĀ).uP0nGq vGf Kql>RWy'ͤ>Vx='#~k9ͯI]'dBF4xwCBL_r$jmeS:gf8='6|jF~htƯFMw~b?}^**OB,.J[[1Y;-^C(4!rϮ7Jsb-׍0O )j9PR u Oa+Yn-{4Ru\?n&M"-Zϸ|nUУ6jW:zG=~MO/}>;89 s˴3Xh8Tzp^-{[],}pUqv MCFNV"P ,T d㿓FV(.ٴ'@wtずq1lSV[ Տ,,w4MDVW3g 0Lu>eLmۗND#TڤRd: wy_[p8X :@[ۃn{RX^xJ5UĬ+U^bY-XBkE*8Rȟ8Z {٧|yHbo8 5-3Õ1yO5\;y8U-%'xsuU,~$)Pa%Њ)ZE5jb^U(IP; ;rFXXphpjp&6)M (޽休2pލ6dK;ֶ Qq4Fv_3LsK]^& "Z@j牾YIA\'8X.Enjy9p: g-64V4uoNA#i՛cQD;XUTsԡYQ8Z5Mv(0Π,I |de[U9~yk3-̋1xF% U6o8\<&2`/l i_ae4]+`}Ƴ !_z7B&C?,x?DW]Nǃ,>ǥ XW4 Ľbƽ*9ʕC]fU#aJ ^)`%N[]4UW06dkrԬ{bjsLjөxfNz.^+j `AP*^*3'SAQ,]չ|%^2I؋=E25uQUТȐPkJϮYA2_ sr, Q g7kl6G"7}aé ZivRQʅ>K齚uiB$4e>T6R?|1AMρT1bWfsfڍ Fyp""f-YT79uZiL'A2-$1W:l23CF B4TpӚnTCVJl2VK^L$]/&0&F{S@9Eba֥WGrf1h.i==O+}xonn,w}?78:YD-0[Tہ@n "6 WXp|93 ʕ ]W]R]X .H @{8|ޅu8R|f78̚a;JIpx~M۔NL)EivbhVNhT*t%>kY`j71|ُRMJ[eM9(ra0ZUtYm9Gh}}!po3=i9JcdS/JcX'\Kuh@/0T5`2 櫓ZGO=6sV11V=v׮36C;SiK>kFt!P,0n["u3LViz-jaAV]SOFƒ T &Gy\yIHk@.WGXzw0%$lOAAzp9;ּ8mPLǫb5h:3{[FjݾX' 1wb-]Tr蕈s$?~>t_#gE a9D+&iao(_UnEYŰTMw^^}PŃY6~x"@\x=d4 Dڴk⬻oFޓI( Ei@)दI65SZaU^"]=3 mi~ʣ|\.ԏM ,M =PU9$?sGs*5ݺƙe`T0Q"S:dBZh2&2Yr@_@M$qPtc.57ǂ#dʝ= eoX7Zp -c SNh 2Ȧ58Idw~Vء)EÔjQݮ ;E!1JuQif_-mM]nEP8𭘊KL<6CwNa 嶸jZVB54{+SV)X 7 gtwJ#b@Bn=PUf,=-UzVEo'O~__ ѫEvGwp^%IF<l*Ѭx2ljq+ b@WH]q$\n)\'FW,!$Pz/ycu~`]_$oW{rզ]%n];&y EZ̷Q(_'bC s9g-wU'cۗB^}u㨙W4`g0S,ﺣ= ;{|Jݰ"}y >e( <]HvajtooY-2ÁյJĴtRQlE.Vɝ r/\s:!jΞvul)폸))Rh94ds/J1l"2쒜1 W#QuD\ UUηp+2jЀciTXbV\|;|'ֶ8Z9a!++ɞqj(J2j=~Ыp<Ooٳ/=zG/Srtp{ :`!a+$*"JHY!t%ѯ˺ЯtBҊ%*m,9~z]m'NHcd츝"aWs)"ڵ Rf$ʜ݁#@IR3'%LOް!;,FJ(GLB{z4WH~(朙]&3SNe0`24sd4؊XI)*g']21QhmRUƞܶɻ9J^=ǪPTPR{Q'{ 1vKaȗmF*ƔZo_*#/r60FQnkvB3weKZ۳ҍ"4F'V%~K;U;ZR+j`Ăj^Aji UAz| 97޸߾_y,e~ ,Ī}W zqUGmJxS-(UfC z$yo >S,CZuGVj7GX(y %ExڪVM$ͧ*^Bn2q=|q xGe=̵K$ "n0vLUQriS7[#Ơ;U[ܘdhRڰ*!j%}v[+$`UZfPY7v/7S]ê{/:a+8Iumd1nnBX8~HQ PRy#qǼ6!lGgufyZ3ZJ[-ssd ]$mv~E"}jNH,?$1,Jn`Vpdu(m/ SVpeޘ#(]6>B.Bd:=L*?j OtXղQKeYJ<,ї ڤv>Q8777{裏?~k_3o~ã;+Qb87PU;1(14z&P5­$S%&U.@e%H{J5a[юPMTpҮ~mg/' Ðch(SyC V@- &@]4j<{aF-0M  3r6ŮT!?.E;eTe: eR~Hm &xx9؅g35?BA^{^wh\WʙMr79%stO]dK[5.wx8F# cSŹҩ,]ƩbiptZTF_$Z' {'"_7:r"[tSnрgGWbY0MJR>]=fV9fW~!VP+ YܜDp82`ߩxa3arA۱b24R//qTۻh%h6Ӓ-gB`a'|_NzPO.вgk ҡ+m]7=8{ ZՑ?3`F+1YXbk%GzmC|IZq/rs("z4Ò|Uh`[_ߜD ږzĈȭT;g 3u'|Kuܢ-,y%Y˨%'bB'MTLH4MEY+? ;_7~+x Wdo_Dtb0GK 0/ U>zSE O0W6٪2p+ ѯx6tEϐ*hPNj 軼FD]UՕ5l- Il*Ml\M3>U7OuvKr k67\*F#5O ݹq[EXFFth~(ge zQ3%y]dwm JudeMNAХ w;68wflALJ}L8wV Q̠69" TFS ^ elL.juIᥔYD#e;p@,o%'LVBHv%@]uJ=+$ \bXˮBUrEOv w4d%+NWae-}=N`kwNC&γ˂%/S2VeM:TGhT\ ?o|?~phA,ܫ 5C!NvY!{LF5ȫpjn%y.֕E ~eZ)w%uGzA6Xw$`X)stkזŭӷVڝ)CѨ~ߪQ N5t{e!W#C3aXVdSJB Jy)`kn'QЌ[54F /p2"f]BDX'棴F#J MŰzGpw}E_?G,*WEjlUo_(XܕFVRQx7,E蠕怲A+8j@=bgB!־z+L$[q*/*k{]e |]- e *SnCJjzѴOUC7ת'-묅Vg) վ2R o$ekl$XWj³elLj\y 4(OL]R_?i^Ǯk-;;`lt&^nWna{h&5,QQLt+7?_ta 9%xN?'b:i9q?^~]`kJ)7JZORK&"qYf&j:&^Ml疽i{(EQ~6$gp.iػrT:0ܸ9k`{,p:x3,Tot3hHEsh'2K'tDoiIB)ٹEE 9`)#xi7o8@w6M9++&ArF1 ْYB&F![ųi;Q"[IGoŲzByO?/~5HK># _EZ˃A=THbE h%es+Utȍ J%QjS(>z±{7WQʾc`)30v6<;짲}+-PUR LbK&/h"9w< $T%MJ~o:j[-gĕ`)(lD5|(£ZeG_|Է'(fp]acY+pi݄m+rxA{Q+Ӝ=Vh̙9Qu. ^jhayF+[Hb/3s9[M0 ݩ]G#B+@1eNi/f49sg^:ەMCv{'Ct) Ҳj&IWvP\,VCMK¦ȹxiL\p& ɣL[!fe61zM_)45P1TYWP b/sf0QNHhl!,VlWZccnRs1% LZT۝[Eb nMhy g|[0s>Nt xx؋HbKr$3юRń2)K`I;6Jg3˿V WWh ѫO~w_\&֎~X{fWh`-Ń(\<-2m!RTjF]^[+dG4( 32"V>YB/v>B'ZX^܂zLCXLE z2RPhC+5dý]uI- "i!-U5 '(Ek%c"zh]^*`;h/LJJTHVFkeeYu\I[KG֪}L*1vgs/ ΂Qă/ _pq3au4.[BE.̗¸ـ]rA>Yn>_t*x24:Rvd2(G$VSp->p( 5ĥ|.%?X Paz(?@_Ş.br,d (p| W!{BPf7l RVj\@_#3^٣l_DDNT} IIOIƃrwɈW.ol V8E[Z.jVHԗ,I<0Lg43΢~sܔɆ'Fyޒ\11kI(c;Ab2ðix0z\5EM6W^?Hs{>nQmwG6x n}\0جr0*jTĭLH+w3êi;]y=K]?^{m);+z/ugl@6wW2 `Lվ`Z 7;*lmM4o2Q[%`{`GS #tN jYmYPɒǕ>nC5}<c98M` G‰>988~и"#GldϘr%]QvzFd$" .)Ga寶_((> cmo@1 -,s 58YL6}Z z|5,Θ0,ީ.[_3MGsɟ#Ϩ_ =Re. yjr]! m+tXe$?~B/ۿ1V FpN@節 +GA jaTURK*Ro5ĭkU$=sA>zEwޓ{!oJ dLHێ+%rTEm:W߷@bIиGо#CñN2FZmlnlʨ иT:.ǤtO<\N .'lqMֱɻ3ȻQxΏ}8ha >N5!]GM<䬨ܭzXu]X Z?~pl#YaR_`Ы-RB╔̶bWk-u!$jeXYsŹ(ސÍ2Cܺ8YI m`\ױy$s89UP%p5*k r Z}ޅ*HyI h),8 Ws㹃ںl鵯@ce~LEwm'ΊP ʘ#`umP ˎRQ|&#v٠Td\3\Π ]J=d! ~L9sO?d)[o'o'ΉsNūH d.S,HbrIJFjozOeE0&5+P*!\,!}:%=6 綃A=BZ˯ɊUwGH<8#NE7`\>:QJ.,w&m21vÌMPjblJ%,тf}'XmJб?HM16gpZJ*!ԋ9WQ\ U;Q c!V TB ;u+8p 4g9jG RG+߳]j\ډmZ6 boUu/UЉ[ ]YkhaV\fע@[]%˩#Ub`D܋\3pV]AH X>Q ",xV0ٳk?P*b3QW+;6V}QArf9Zc+ށvYݮ2iINοM!np"0F.V5F8ጻ[8?/,o]=OgVP{Z L%rgIʦŀD00ar,c­nE9 H/"E됵+E+%DZP e$̑W156-ZhujYJx_}7%rq]쌽Jmv@T_uis,b^5^C-|s?|_~ݯϾNR i *V l `EdSr"j BJҐ :AW,cex]-n+DXWKZ]^aɧO^ hz([ !Uμgζ?_'.*> h36}edvBWl?Wx$bdo ]ƼhQs],`݅yК`^5?D&B|OYl 8QiP?w_~uӳ|gx:'('j2| bV/fcY#/=VrN.շu+P %28 .`B2aSǦeh@]҆=%UI QT>jZy`TB;HXqMe_*$[okj!^N9R@.JVXt#/u#:H?醃lXX٠e=I_koz./pj )BOޞ[\uYzXMp1\,yQFS5hk!9'o?3N}DhxˮA,ֆrϓ%Kfqc绑>`gY0N4Ѝ{a$|c{W m"ؾ<4v Sߦidxx^3Sdž(/NVENF_/x>0@D||s8W(L1R=oJU( Y~>JfK?mi+W2LFD|ϢCrN.x2Y/]pԶf JR YPuTwZR5im񝌸uMiբ3ulhbԡ -s*2mӷz~gկ|. F$Rՠ8\nNLE=c!3K *$.Ap,c%p1"<+ },<\YS'>!">ӯrՕO;eIM88.װ ֛Kp/!_yp%xͧ2nA=RP0Vgc#N*"yEZ6v]Uuk7.R9ɳԽ"ןxͫ'qn*h8َ7yNc7 mLlͻ{w sgKr~Ero%Rqb#w3)b^}y_+7VyXG{YQEJk آrh)rh4 séa EWeßJ댤8ɗA0@i]JzXKhj;_coyR wU}=#^\q&)۔wBW7Q mϧcAS  ZEh^Ì,`Sa!Ц=ʂ  0:X}ll[&]dMP.`w)co0"ω<PvZ_{d4}HkEwX+Z @ ӳ=:gT^C |*VBGfvA (Z,\ o'"ʜ]RV%K8MoBt7ڷ,%?uĨ,0; ]lCFe@U`3ڲh!&ކ橈m(F'  }ifY1ҺSc G}i^Y vǞ6-13tft:>;"a:f w [Iw5WdRBW[ u,5T1%y JD {%f}aS窪lbdSճet3YTD0{X%!\Q9+a]@Mx*wkbmA#fjܡ|@q^ _t:fioǿϾ.8,rWavF֕K&Xa vj8^YW6_(VRlIaSK)=ѨTPzeOދ EtK|*! `tIz<`k ZnN * O*Pp~V c[2"r];VS'V +cZu(hN4~FAv֥rn6R PI e+qFXU agB`qtCn |lf%T>tD<./i+d, v6ʃ]xŻ+:B7Ȧ+ 36lh霹c$CuM`fPz|4?JLerbF`  w)rn HI|Zhz[G^&d#y&42XbRy,Ĺ eZU6~87h.D:Wcqss .+o?o}sq`"^A$+`Y M5]Z)[xD*WWR0 nJY|_J ̭{^y!'OBӧO+j%Bn*y913 ܩ{fj՞ TTUXDՐwTY0lۆi¸7fdX Hc6m2دWR bb^b`4h54ޛZ6v hp7S|?Ͼy)K^hݧuxl#{:_j\viN|j2FVnm\U"*j1[ȡY?\\|`*{ƹTŜ[]:[q l8r*U5?[ S58cLީ1SaL${qYwhYaBcɪ>d5HmubI Tk4+Al% x\9-5.yZpuE&M%=Bh K-lʆ‰耫Tw'#% H-" !S<u& -zoBa;yĦ՞FCJLX/ܬzTeιOw^ˉWNKi tB *%ꏢW ^`l0VPhAGd{CKY n~>¤!kY-H],<}*"?S?ѣޙV^ؙ%ާ &e^tsJ;';j<"bSidFeD%=~D\h{`TJ%pWVYDt! \h6sX $TaAMXhXР+n'Ts:0aԷ LgObf5+3]i}~>Y3ItЙ1 P31q(OK'\Y}rBlVj u=ȚTPh  ZB7vQ%ŲZ5C8D Jıc僇Rk|f__SnEd\M?c8Ӡ]wX D_G^>p0%qjIMZXI{陋,pN8P Eo|3Aᰨ'T%(hvqQJg-"Ae G]]Gd{ϭC]VZepȤ0ay. |/{spxk.?{:^fh_Ȥv+fHiHK,LK/MPR;ɪYz]?yB- ZK'JTg,NҎU;#lChrfpp#1bpɃ=SV(h@J8І+&5$udok:$^j$ewYlJÖ+n,++3b2yhMEۏߠrž,@̻X8;J^|Н$;4&e_eԧ$%T Ƽ^8ظay4IEkTnlj3Rb֒F*!l|w^2LGy==g&W~;s:>w<7;}].LbPGA'8Gjle1iEhf 9k{9Js\auqFӝ@jC)VR+.]ȷwXWWBV?O@ qˊwuw&D/s^!z.0=7S 6ۨH:z#+1G]yd) [m\ v\*:t4.V,2(c U]RQ6Z LB֫3u[gP_ V#8%PD2# j~V!!nM\}^U_QvyoS>}K8Z0k_C`jUJ`V^nЫA&ˇU!8+Tw4ArTILʺ+X|+Qj AYV\կ"C(GZ1_ 右\NWW[˂MJ ER y^~2} ]u8!4QSu&,d_76v8'~bp.挦$HRa')IJv&Y}i(Zž|0 wٕp =h^ X 8֞5wm^g`c2c9(mcPBB0+ʱe>)ZCfB`%DkHK,{-e~J #xd蹗n@-oPjND˖b[0,32R9EЦX!Uy[xoc¢^̍P.mǵ~EnjXjVTB(\ na`kg4zF9K ھI#p\p Fy;/1"}d/g装BKQ IU9e )im#[ y^>6YIENcrg&XDoD }%(̢jmQWlޛ 8@ | ߍҊKFqD97S^Q64.g)r.L|[ T t* ͣ{ҎytvoF`"{hx mS e ?Սt.nGפNმeOb"zٳg^{ݶ:vvsιm\I J|X8x$$DH<@ !$<86GdщGd!^ ]}9gVZkfZkv[{jj91[l gP9I,J}o 7-̒էu5$kCzҨ*ČL.2 c3*(%V-H(TbǮ2WfR(ɿqfMg899>X;—㒓YR Q:HFjs2AL"Z2FDSsdu>MSo"4LS1 K){;;*bUIfOZ!IbI]QD`RKVHaTd}iܻH|2޴v^as\#٭X&EsZ =E7m]_W:dģwW$Ӳʦ1xQUF~UC;#! Pi4I[s:Mf)2a>`^[z=Kwٝ>R}Z,HR[ƔZ?b{u :Dzxw+Y v~iu=3*5hC# '↎WHb~|[??y,feUaPA K@*AW0}L=CXW:*ED ڣpUc$Vko9vWKhW^J]?ĐWgۻ{w]z3/!CXtQ</岹s-y] @丢?`HE"0#WԦH (jiK!LXUA ݋{H` dZIT'EttUPIcPB{}Sų1c"X/\p 2e՘Mi'g1 ƉxA 8 ~ (sٵ\*4pʢ52Q1rJt! ɺ4XxsP\2t\v} 5I1mcYhu"cpJ8p(NF޶ac}y"+U䟡׍O*1 O "s]:0L5*ɄCDrqD&aM:dWa`H'fk+ĸ :41XWARa٠L NG*)*KT0Z \Zoի@D7nvxЬ7X}p"""Af& uÀ]S)aX=ÀSFD*vGNb"r+D|ؿ)Bxi_[Gb`JЧtҺP-#NIZ v=AdH0ULނmR1KsNg3V?l!NV-ytRn%d+t y8!Y<cseg.d!+g"3+aT쇬rbGK#F#hl0 TLS45D VX=:2J՛55 g} WB48uzqUd< ؓ*69iܼ mk>[=c lMa=4b1^q ZcY|ӈU h% U=n%1~ĭ, -$EB-ԆE!Z_~e,w1XEdυZV^yW ]w͕mfϥ$+">Š::\g=~ =;q(΅LF~Ii!X:"a)96CzݳG#=v?w81L} }ad(QQ~駏-C&|D:d`zXt){G?Z@t4֕C\][1߉՘3]g-ŽM:043eOj,0=!᧔biu+x}dL<ѳԱM[ܒ4Ń}𪺲 0XXशʫcⰒfhzݬQ_WIVF;tV..97 |:9 U ɝq9EDTh|Z 4M4|xGwQJ2#aytJX P&[pӄA27X8:$AΊ Xp閰F_?(B^ bZ|}_BoNzOݾ}(bu]e " 8I|afۀW(/3roYC1*(_`2`,OVh艃Nf8_co dBdjC#QU׃8kAI0b_ZQ8]qҐ4SJ&g4z#V)E[mo{Gz3^0Hpx[^ȑkș"5T`[}R3iﺊj~yqA0 ST@N|U^+):8E(7:/O %$^m?Ty'A y Z٩bKr'8l07Y80݉@#b1j"n5>:Wv,mmEKONz޼u:k ?||YXphTKLbp8 9k%@brP.Ѡ|VFڡA= m$%W3^@pECf#đM]&樽- nA1/{Easx2I1-c4}G4E[h"0M}bhDNճSq `2oKEO.zzVc8йjYY|pi7U%Z`PM d`zV؜tC6& "7Ζ&ѱAG:D8 eZT[y ADwڂK(" 0kDJS1SØ/ EY% `aؙ#Saz]-8adq@/?ʨ~~k)Q7$/u4$C+[n7Pe Wg`XT[~(g5N/ǹrMV5 TaC ,; # 6p4R?4Ux` bqN\ A*&s]2T@O:$k3iv8E1Dbќ ;#2vBrG ,䵼/a)0lUU7f.D~&`: XbOُ0nӑG L d/Ȩg-2aLN$AJ ԢG]:+ cHk5$EqQO>Kj̅#n,Zhүq"3$Ѫ^N!%i=eDY+*p&yNʝ2+  YVDMl@xl*% b[rS(IE a ,MȎxgko1 09E' Zu߼k*4`jy+_6īַ?{J(egg [ ?L1 .o'+b.u]*V|]u{qj2#1Vݰڈ(#?E2ё9ׯ/ЏGo^0f_d @ME(Mj䵄twCZn" 7dHH "MƭSMqu)80b`""zfИ*U6vLVĥX܇xtH0 `b,wzQ,P."1խ#,. b%0 ҳ"yݿr/z<71cLAi!qP%i^QjΘQهn KN"\(3#`D҉aas |34FtB BvR1k2y=r$b 1aɩ`nHhT ћzsxaP%JJ[$LǙc}Lִ@D"S"Ld#5YA`dzPO_!HIɀeQ]0@t&jJݴvy.%\$-NF Q0@(oR=ȧLc=MaxŔ#B-׵ zd #JIΆjԦ50])h*I?Sq*-̩ }_Љ[1!{%=/#0ت&}P]D֯^z!^|+woJ\c(_ޒc;$гt +ze+\uMG3UXXkz1 J۽IЕXAZq[=l E$ՙ8ё!}֠u߼ bnSVEd`qzl"uJ2ݒ!{[E\܄\ipQw *ҥ0),?P3e ѐ ^#xhlJ'eyI:g_^1nv)fy>|]I72IeVˮ9TT31dw|o{NŜ?"0E,W(y9%3z5L< e2<*xlӡTlR"XUN &2lE &71(URYF$AA%˚a\59Àuڼ6O}!6'8à FQcb2k4Օuw9fߗ)#1N9F*zş:0Y]!{J5 uJynwCJmS [ď""[ned&(A%ƍOD:TΌVp*=_CPeQ'eX󸚃%GgBV6X9J06Tީ K IQM}v Dŋ>|_>7?y(pr VpA;B0ZRJ@r_tU6>8ZP)UZIY֝Я0I.=ntneGcwMMO'߾wm9??7v͆-lmQp9п6YdtWµ@' Bw"XG,׉OMweVT^:R^){ 2P]4V٪kSˆV;-:덳 V$ q`b7Q]/n16㷥a6zY"7+MK9KX2l[Ut8"Kbwҷ PY5f瓩R20XTV )TzjJd* "θ"%P{&#LTRF^3+Ŭ+>"l\>oUILUcӬIlHv`8 #Pq0C=V!#8f.DYh@_Pz߼z n2b?xJGJp\ʹ ZIvnvn)4xkF7UCR^RFOM9as͸$[֖ .dF#!~v,EL``V#;*[v9d X!XPXQD&2HבHS5g Œ\ebOEQ D(urJvƌdN'}%j^ }A >.\9L[Jg2 |tT IϏIʀ݋<*TlbJJ,$/uƖ]%#k]߷ O :6%DhQhIf|L\irF ۃ=C2U&H̍Ɍ b ΄e1<%HE EA"m۶l6R>\D{wGmX#XYf-ph9`vL)0vƀe) {7ؿ@`:R_6?0r$B0VY=Xj jSDW;mUZ_X 9_=ypp'?x^ym EEa/BϐPq% WjɶM켾PbUF^LiD*I g)֊EnbωZHJڍH9aPQLy7F ь-RmDsI*üj'}zd1QqĤNo׫!炛X7{`UҲj:XI`._i]?Bj{R1dKfq. D-Htz{nܻ5b6Dnuh.Kyrݵ/EH׈'u)T9\CQZ2KL)C!B+-.o*T5F3 E4Eq$kr_'I)T^M&ZXmʹ^fةo3>fh2Sޕ W.i":@E eEխB5R3;Jʢ?!r]}_UEy{ ԕTǦd B~/}=soPT"~%"lZagiJD޾}ŋV[?|?SWfgarv89BLb ښAPYen6m&E/iT$t^1 N J +%+f@΢2iۭ4yv{R)˲UɬX'nXUͰzsޢ_MO82YJد&̢ZJp%Pd-SӹZHZ26ұNjNyg?k7Ջ0}|1Kքy!-9rīKO>rP ¡ͺ2c0|Mp*cɱÆ9jHT%dqYycnݺl`jT"/@ԭv ˈN/7jH".s1L1caa\aD~,:8cJ1PĨ^EV2W~aˬdӔ$]HK]܎+ ,f(.ы \{ 1_fQV\P&͒phR DE߿c!([ߜ9?}~ƾ5\p'uM+scčׯ_zEP_>:U ТW:\o fo. N[wGr,AQHgYX1 X4ZrxM33"4h%E(;c7{YwJyW3,)E "rrrbo^c C&UUJ03Eldf'j"[~yUHY0rҺ( ZeQT/^ XjgJkLQ@N'yǘeV1fۉZ$L},/]_hhXᗊG_kHb*? W44 ۆ.J=u%oRREhx_RMA.ȸ 3wu2G>^d͘:Ni3@@tCAM(0$,;Ep!С.(u֭%­憤o..~p~yx~qm/.....tXTk,5uKM"8==}CwnOCr`#wed١y)n'"%HVq奱H*w(W+ۥ a6#Mj)KH`,b8FbK9'W E),0(Dzipޮ"A |4W߿oqj~je/~+j9[{;SVUZ9ց-Mm3B$͋S",GOfRI&(5a\I<{TXOV?U ?a0ʎgD0y̒qz *$t P8U(vEYl"]%̈́T&0IO^!Qh2|FVгuCK(=@"{DJ=s("ˋgMx4o[}~~~~~jXT+Buim_x;߸݃h( Kz@(jJ@ ʐ" Z 7`DM­#媙!Nt)7joO/f*h_gIV2:x7jv h*:vu ۵cf A''{=::l6_}TƯ3h.b2+v̿C08>/x9[: ۝Hpjz_0&d,d]-DJU/: w4P•#О0C3$(yo]iR钿STNkd?brmh5J;Q$3';VAEͯqdt [:ʞ}A r}-$a/ r7iPS0"D:L,pf#oiT[UICDKhM Z 4QȅPE*pP|t!"!r޶/.gMil.5MA볳 5պķo߾|zgt#@)Z#mCEnm 4IEPE%M#uen4k/uof E9 feTNȝJSxMMl^bb5=AUb۝B;AX-QZkٙAy<{$7o$ֽѿk>Qqd1܏+I!Ď&&ds겉uL:㐽\F^/I ݀5ޮ @hєVFF[QT"l(JD)(" P">l?-DNZP.Mi5i l6cQQϟ?qk/Ȳ*elA-`dJhێt0-'bc%x4"JY+Z&6z5bսI{ǯ_̣Go(M݈yxom%{-^JT4F'm$Zg˩" |b%^}(52-0e_Sl]ZJaNb)3  S-B-`DI+/dB\Pӵ†3[ b h 9*~6=bau=?=˱{HYn@IX\K ي[akXW"$BEl"PZȆ0؈T(QzDC[%BQBQTP6[vcDP(Jm۾hgŗMmlmLeS ֯^z5E>R_=>6H4 %V*:C;hMBrQłMa[d-8TgMىh O u-;惢Z4~zg"BF=r';+aY5iЯ=z$"_~uA rj'O|r?'>J($Φi|]$gsndX|3RTD}yAlH?Nkb` @C(U( ZJV` GbvB0ylxk2azQ0QRNײ7~SjX\6h&r%uF>*3e(?:B&jIc[NIB+ X.x^4&.wXO=.mfByXD&qFdȜ(a Lي(HClh67"- F( DTJD6ʰ( ؐAv󓼥 C M>k.5y4_6ͳ5-jmT/^4MPA^a7zWOC26lU-E%0Pͧhl'0*ce :\"c9_] e>BG[ y@neԐV8xv7`g8 • =Ѫ/ONOޑo>880]ݻw|\sGǟy۶"m֔ f(t_~c+dvDz;:D=}(9CNFX* 2v| 9SP ad8l@/B9jO2an²խpwWy'F:KϼH,@/' ʂhDNZ&B)Req>qXȏƵ2¸#:۵b֟0LHlLve1,jP [S?A@ JK(a#֢Q!m+R)Cp*Pߤ!͉@n.HhXU>hlj=m5@)n}ϟ?7/p AkT&ɷ bXLV.PbRp(mAi946ƐP,1K`a]*@"5pY`"@{ټ*+bi4Y1fhL:+X&:.PSqW"GPq'O?nO~BQhV b@v*9yϊ ,0*;#@ԣa:10A͠KS e#0-[I8e]>uqGㅫU(g?rQ.z;e':b(C)$Wb*n]IT\hz.zHs]q#+:|`V4_1i3ܘL 5МeAfw]\ߎR^ ?S\P0бKZBǷ6-,"RJY䉂\dc)HC*Sm"4[%SpR+%ZҗLq" 4?Q6!p]'*1XM9堉}@*"ʉXCJ@kҊQS 0qJ@ƣОЛh)!@D1!qWe$*BDԆ7wbigmj_6MmvC`4Pl檼"PLA4,OÈá!Pbd QKHc_hQ/[hLy}hI h :G@ݓUSh3?; tCkÔWƳ Z9h"PDb\C#jC\W JD=zdX~fXggg~駟~j<|ۿPBUh DC@Et ./cbX(wE_Dجꐈ:ĺ{`S|x&>뚴'.}˚QD/b ,20BZ$uhz ] X% ~ C.Y^.2ys4"u,Z &|'T/ xRYEgҗYp\'jb]4$Z'נQ,L2{8A6y'P FXn\Yמ1>r2ES%zF m Z(4]J)[B(lSQE*,NJ[a'Bu%JpAQKoR%C)sj Z$" Q6;@|ؘJ@n eXKreP`V4<\A[lXN6ŏ1wtv3h ٟ6ˎѕw5垙r2nlS\,&a -v׿]'k$ `6v`wOo8( oO{{{"lDy7޾}OnlT4@ *hh4E+SCm$U$uvG!SHp922(hB,Uҿ5!%<bQΌ6l7! : zV, WV6HZh F0,1!XWglux^uz^x J[Nd>zlyDdLԁ29#ڋh;azL?&]r9bkMfnX}o6NAsTeĪE*+!&a-Q6ѶP lE-`I^҈(e1!CҝV0%yl!EIlR!29 JvS_u%D!SJAj>Q*eU /gy7sN,,;M%j-3ȩk)Mz-eY,ai HC?V7ؘW؟]&_U/aAi _g_l6^Z/_^|D"ٳǏ~ڠп|x<; TcjF@#B hexizbĥzNQUt+f 1D< GzeQ1ϲaFJx(g@_ t=Zͼ4ai>$* 5 G: * Ycb' 5EŐS{G寮>2# VՅr ދY1,l#J0Ajs=Nn\aldlF/ 2qU| 䉫k Kn 3cIȔp/n=m ;76 QcW- -B#eR{;M!9yKRN*J `d~e.1,'e@VD^yAziܧ۠kBexW PB-Qli!+Ch1p=bZ~pa|Waox @SIϤ٠#Sn0&ǶN!+Gz:BnDofm'.}q/uɑNƟ!_P;ySy𡲦|i>ɓ'ƐR=>ۿ*\(4b@+i rPVA";rx8VƜMdꚼ2Î.u\X/AQbB4Լ70գ1 q|Yh|^1όtJ~9a6Ȱ@[|>Ou!tISD2*iS;J<DS[nW𳄢I-2qyJĐ6ew\JH(n(9cz1!\wP. paLUyBd5z@(B[w" Q #,EK2s1qyDOD@midϑst,hP5[wmK/H|3TuVx rn Be+(WİtG ==\csG}M\8'O|g+_+i T 6VVDҦ0AV?( Q)?\q1/fj3-$֗Ns!HVyk:ҕeZzhQnP1}d%`qKoqMn5(ij$Mk\z8+JYTwbʤZ#wZY+;4bY1zsf`b{濶MrL``ɊbQ@tyM',-0UjHT*b!| WظX/RڥJ>gG)h) #pƅmb0Oк?k\ AODaa6k@,Xw`Cz,i-D0}$8nh0 2W*hjgm2XES?~,7]^z/^H;owWC pBZZBZhZI hmI*eyC&b($KVşWIE91]+D˧zf,VJr}3datO 0*O@QO 3PQ3 w9%zYtFǑ wׁiD\\B@[tɢ+ZDV΀Q²Ѐ^tZJٲ9%v3:?ôȋUj|9?5 ! Ӏ=4#F\EeYW ݉--e]Z+Wo\6-pM4*n?8QVf QY2B;JۚJQk1hteQia9i3-LKrX&"YiC8bâIџWM,KڐN6Br#X94KTCwN/qY$54D\t 4O#w,v5Jy݆Љ` 'F1VpcE_=[R B..>ݻֈ߼}}OEfgѭͶ:Z%zi@+h4E)Z2Ӌ-Zńp9Q̟9q^^;l;4Z_dpr{kE"6m*NN#B1:0e숽߱_ 8yY憅ܐ8%1/EUh. 9hkڢS_Tv3<_Z~ad1eVif";@gzFR\j4^' te>-,Ӄkџ5 W/#:-L׏. `A oTA tBtnO4JF-ۙIX4@ B^+l>"P{/_ ?F5F9;*(lhBTsר6д1,r FvYD#e\]Pt?ĶJn5`Ug1 + /{CCoKth^Q˹"ZtzK)p6PQNmiWBvIMypޞi}ӧO{ݻǏ?}Tk-"?s֟=:V J Īh5+E+h1:w )6% k/Ө4t@+'pŪ7,BMYBѢb"b\+@MnW_bʯm.;F{zm 2XH t)9}=ϱaKBBEJ3#͊@B뚭;ϱL G +Q"C.dI> +Tw9dJЎ ފ8Q+ICPrx3)8H;0X&w3ŇbMrh {TN,JHȷh}7FQ "9(H'=Q+ ݚ8;B~2𓣕9}wۘ'[]!b,1x{yG}gK%~흪nujiN^]I]9@Tv2Q;+ u*qhai Mc oONNήa,Ű9E?~ " >B4R5{eA+U- р"P)MDcq%:HIU%e^ΏD 3:C2%3WV6݌-̚ف#1wOw£>)[-`z0NjNVf5 S0U"Fׅ$&N]d3iMn!|qLz-Mlxq913G`Ӹ`2zwO = }bMN e%=.bMkʞi+-E/6%rNm:Y!2֊wx2aV+-j⋍zQ?GS-3\=&81vzM7Q^mW B!Y0:5+Gh ^sS'U]Y) Ń%P{֕bŲzV\Y qÀHQaSGԲovO=I|ʐ`s$IB[$ONDO>1dfsttg_6V4}ٓ'ONOOER7oeeuW6(R0h(SBHe1[ ,X.f4W_EQ^E/f9 8\QbcSIʕ>"5uU`p'`.ktڜ`1Zr}P\-w4=yL*0#Ee|)#]U2 Nwj_1ocjVPMFfъװ 0"lC DDZuaC`t=zã!y v =Plk~/7Y;OS-Q-+N"c_LvNbY\D/CC4/D-'N^ IsY,`gSwt"? ͅQ23@ V*>^_T7<.5%RAFP-shn P ŖM E wgݻw>|KSvѫa>~?oFDGGVmZ)lBT тV)m0WʀVP؊P,/QP xNײ`[[rp 'f%[>scS7 17UhŖG^U5@ 0L2H9`M#JGi!Ųs0aºY&5+<,F|T74b>~0i̲DZ:s0uȄ%k0".hw8pLh堼" A+,%M Sn M%,0 :A:m wv~7UW98I|cbD5T?Io>y/BQ-W /&Z}+ In[ɞ,UAv42?#: =ft@!ݟq'@t l6\nWP\/h3wLqk.ӾzHl9S8iI0Z>r4ke9vp\i"z'j@[Ny fW|]Dx9쌹?W 0 ra1`|D/Trph)8H kfFPNf(~qF c- ՗ѷf:kPs,U.\= uO MH}L_ Cez_xo0 om5t3~Dtң›%< b7"eΕb6Ԡuܕu+,49gzgjS;Ni@6/)/@:%f| \2,^J;- Tr@{`/~GLBW[@ DI1o-N Y Q?<9;?uppի)WzǏ>}j$~vD8(Wm`QVmEj)ڴ@竔cfm byx5L~蕷FBo,C4K4# !k-Z`g=v^1TM a!6[SywjsP2-Uq_e;!ᴎ:I(EbT`>JA6pݪ4Y@/b/ŋfa;LnM+Q狡`Ul7PiN#0/;N=Ё;!uzKKj^3dW@hh،5/0ȗ`yϻeFˀtto<%,ަE<7lTwn n6O(mCTY)f`s"tdareih!Q˔uʼchn*C(}}#_H2<y4-hD:CS=z. vj~ݸuv#M;\q5Ϳ΃"rttQO<1xcß}{Wo hVASh<!"h1sJhj:-ֈ掆Iюh-5A)\hbK2%zJ*x<%`ǪlpObk2y@ ThIF>(w~q08ٛ'\^*ym5b=.auw*k˩4ߝy`VEG EX=gEIil/A +p3Ca0vUvjNZ_?WP)B 8.;a ‰O! fu|u ]0fP7 w0`0`LWG:9<xXSs8 ^o?ԁ}owD#zUrlQ_oGRA8'O~_;<Vh Un 1ǜ 2빰GC (k`q&¡ٔdK͝ߙE%]Fc:##\EZ~ k`-5}7ܫMFm*" T08b=|y#U}șɢӻ0r J$8GCW 3D Drahve%%)y L)+*6j+ )vS @ZtNeU-k2缬UCv<b5~ d_‡ZuoFHdO{җϸyj.z1]JMo-O+lȜ%jyB3NBmA#Ϲ۱W3ʓ$`Y~i^ [fh g8k5|kiqz_h%-'OB8ׯDj8+oN ||vRJ>s^ENPHo;s\D>}zVj^RAQ)\+ heFՌN`:@&_BMW-a.WZy[6ێj W%uF=qr׻˄ozph s<*䘉J E"qzR5 ue?֏]Չ`;]ic]0H9:[=иrٳ%Y#<~UW;f@ʱ Uލ)G@WOg8,]+ k4\=E|+oi#RpJIU~>?k kw?|7}so>^T'LV]+`RCWhBLSien7F"J]fS|r;=ʬj۶X3^6oGIzKg+ݙ^ʯ1QGGîU[_w >mK ^u2sf2[11J-n$hywx)̈qyT%{N~'ƪ e z}A1頥XU|}`b@H ;=Jh7w ")P|DȟdͿS2}RZfyx:bB YN]$+,@rV8\_)QZ2]2~ʹ 03otC|K_zyj?ZgϞ}<W_O_ʣG E5)\fL [ML E-BJ[WӠPFr)>f68QS`{qvndwDj'4r5Ea|?8@^>-Eo;%ۻ65v#II_;h@l. XڨGbǢv㌑۾S+\rb&m%ʋ[s=5]>"+"U˄P>Q+NXl96)Q4v) eO'jVz'q j@8# gSk=P[2n2Oiȿ-R?@dEI{ZFLK"} /dƴ.N]_ҧYqsE϶3 O~)TC:P|WGo}&6");J<76 N}W^җ4ϗR4}sww}~ⅈ|tWϟt@}duQ.$2AQE\-0P2+ 1ЕѴ0WE4LN+ YfPyи&pAn1uet L#7+C/bHҫhcsq ΄UZq|%xuxWE:`摞gZ;Tl݈*s*ӋFT`5Q3bme["7rƙ4sf*ϰ x+ / 7ffvc$_][q/u̢iD 6Sx PM[ WvCl@AJsmiZtbݫH.xʸkvaN o<ߋ@$9z}J3U*Tw`O sZp~~^ԢE% yO_ɴT2LEId& e3t]i ]єIUЕ a}^Q%AL+A;>k <+gB[.[b`zcV+wF`ZT/|R@@뷕B'X4A(@Z@:>RZ,CO,I@Wf$Pu_ъqFR6Т-كR[04Re.k&׳6Z^CzQÜ[OmNK(;&Ug/ ezvZx5“3ל.IG r#m{m<}a=^/'hPq1e=ʖ .[q@Zʥ?reȯi7plƨ vRc5lIX1fy̤(pucT3F/Q SDεH{=8Q;fBgB$d9nL2Պy/pOSw0Co^W~("??{{{t|;5M;[oWO^_{(hQ%FY}Rt4Wte"Іe Pby'VexzVkmXhB5:ϟ?W?zpi2i$rQJS.&W3ЊkY )LhЕ,_3bWNJ #Zy@ x>"lć9=@FORoG\ʍ%}!}7Wl組CWG i6yh[sQl3ZTָ0diZla.hQmG/ˀD]6 cݱU ||Db<~tg<'6FQ5 M"D1)JpġliLko+%Kr(6SqBi[IօZ a0eR  /A~͐l@+BOp %Zx{UR Q˨ yPc]iopw:0zn 6tLb44xmCh`Ek,s#]qfQWRJ *i\`d߾\Dѣc ?j!okys?xtܙ"A@v @ jR@Wt0pRd+̺̀Wfr% Đ2 [,Y?ӞhnKY֝7X9&a#{M1-CFMhVar!e0pZ9H3aeZ펀!`Ķ,p7.aaEe@J68ފfFzQ9ȖoJ4v!b&`hۡQ^ΑXQH$2júb RLCsg8hɵ2ib7/At]79[[e8L:'vwg'd\f#`p~ Ų}(L9LQg?_)_9mOuI5ESY&Н kvG b*C&,=Lu!Y?B̓\0^AP -@/@=p(ĉ7:~1AQ".{4=LNzME)FNZ[o@D>O] ++d$eYi]1zUڐ):Qvo۲-0Rn`U"XOnٵm^.sV6 _jTuxVF!߆V ]AiY*%WWao[VQu,s!nAUzUs.z{f;f[^ y )alƒ5{޶WNPzוv;V(7u{TM妻}xc1U_jlؼvD{z>s3u[P:>dhv\Ms-cF i<4J*ilIld@xxO[y򇯾y5ZZWÚ!ZpQW- K4i WA(MSp_E]Dl_اg?h}-9JK5d\qH*H[k&h۹nf 9ce٭ 0WiS/*GG4pKO,|V:RD Rgt Wp!C aяf|YN+W !l{*0¤S,[Lg-_`v?Zg;.r3"i;ͿQB*y2z\r2Hu*[8Փ0/~o޽T4=F(Nt>ooo_}'OM)I5XJ)zoٳ2M?~7n?ZI"+u섚D57m']hHYQmVbP2؍Um㏯۸Ûrp^tǛCv hx߁\%;-E^n_ٺ&:nͶ7d2E^4[a`0zzag~s@G2 7_ksrpu3KD/B+WڟB!{~NZhİ-`M>=q׌AK8AvClWQk~>F WlbSxUy8gfQb%HN<">0䮣- #%Nu­A㪹'!r!x2b+Y Ahr\-[Qs_ ."}K PI ? #( 5Xb[/ ~Xg٤mwոz`NG].>Ii7_9'2)Z/2W uj@Q+ڔ$teMm6[*Bʬ61m?37lWhGh=b ep4r߱ӉgTwp=z[<~ͭQ4v6.дjz 0rj7cd[ały{Kùm],? ^7;/;<0L_#Wdhj=n`, }+ p9+Ba:Z]5 XE]V"FH`kHMPXʨ$%RU lP!&fɍ/Rp>I>kMq&-N.I?ʼn /T%a g9yEٺŹb[,-eB"NA2ԣG?~|{{{{{ O>\."Sn"+EĠNUjc"RLB*eKffe)AWCҀL `[A9@`EQ|݃qv/6 ZT9toXS!um%#\rͭVgS22d `qu:H[ۅa }} (3;[>TkVyA,rO 2h/k7 > =2bTLV$_Vy_FϪ*|_UIjWCM7MT7]5*l|>{5ɎNUL[e깈OApԛ)$%+!y2 x,C܈Pdu7 xG2 -047UPf l'HsI䇓m}w nΣ[%iD MٕPdi/H*@Ö ZJ*:Īl hm[ %e_¯c]GhE{mckGOă*TB *QÁeHpZ6f8OqR"P1,&hRKQनN(nnHh/DN'5mŊa=& j5묛@ RKeXWIX^Ώ+ʞbV!3$hQb䴱O?X,'"p:Hhce>>j>͎8T=AF |rlzs]!f2$ eY7WnJeڧ)\~*FaTxqCh9`wfmSfo`LXXQ T;2pd$YAY=3Ɯ>w^p{"l@rq~ iŸ[0V)oԫEG-ϭB]+jzXQ @.P#a%)J-"UU" eho"g5zUD';ʟPYROgΌ,No-vYRQ`*BiYnlaI9~ES?Ia)@)Q')9 "$9) "*L3t5˱dN9HH)SQ(̟Е:c_[yD`zC_!ub%N:VnrGBW8)OWߓtN7ڻ#_Owe dxT׹xMrW1"gYXp*š\|^V]8U/I#CSV;aX.qyQ~CR,\֍Kg쾝soS>Q2'Ȁ~DZ a5:Td'p2Vr_HkyMDłk8'X< ¨纤Oj [ʥ$VF[{hšd53D-IUw I>·`XsR˖m5(S-,2Ube#iV,L2:p!mYm,evc4W#mW߀Rʀar: @ͣP8Z"BS-hiVQ$Z@MW0˺ ȉ:-*\¹  "f km\*h`P 攑~'s+t`Q7$gyAك#A( mD!)$.Z^ `ubZ:+,U >mmmďOx@{>X`Uc=L[8zdl`,IAˉ b"DF1ޝR^ZIp0t2As;9JXU'jEte*mcT.\`S_ف7o T;E"?K5Da>ka("ɉ[s :qyhĠ+~Hg : @Rf" }IQgX˵J^։m lLR G'IAQjj(R&E4JxRFJ].F!KD rG娯ȴ;X=t6Ggֻ59p, ]1b0ڻad|,EJo l~?kXc)r@=VYvY]ɰcS-Zd#5ၷlC;jfuv-\}iը6:*AL&`LP8B"ЋP9gJxMY: 9N lzۙN>~mW4F[p JcnWU){G: +'e ڹX fu1䅐 hP'>k­זU*̓-[sEKGrXi~]͐mA8O\* )prc^̐͠X-yЖp*LZp2ERɋPLD",M1Phe! +* um1L*,`$cB#hA|k)V~^ujvXy*_$9`C!d^J?h1v2ce8` ?>wZhV&0`w"R]VaQqۍ6x>P? I5dn15k`u"ձ5> RYv o~T$̾-IۂvQLUZZviwFR]@n3H@|f,,XAZ#L Ϛ̤'hAZ| dD! _5޸9>aP$ hYPzE5M™\-ӌt' 2q!'J~W涆0PD,;Sq[͌">YIqWk 0yI ّSXR@hi AZZʢuI-Н,hoN4`j @]'/Z7o,:$\e3o暩jRp|]~Th8/.ٴVmhfw[$ʃ1vcT1ւ>qt&*woƧ_?ҥۑ::BDAuyL+ao|Mf{9&~BI2 \:2TFYkr WAmIz$|v%h,:ء%;n)X?`c vsa-CZd V^Պp ,FP/!dr{#["m9@m OFXSZL dM+sE,#I.ditX 6  %!:h˷oNO )IrYI5(bK1Ֆܭ@:l}H'Q xD-653\n,s= DIg.9 tIO385s p(modgB4 3e`<"4ԍ)K ɬA`R0a&m 2}e]9ծB ժ)&ʤbxK^Ʉδƽ|G=+ɳ-gI{VӟkAՊ:&73hv ݬ?2dx]I([߇0x,F-oSQHi!bdƑuN[ر%zP˕kEuK%b+봲;Pcʿy1}_?f]V7" UX0gxֈ{d0Mw6hv9\ stlbtR+*4ԌJ5_ ˹bnJaN jiawu&g[!Na%Z0-KD*iI t%6u5~~} ZD hs8e!%2|X?5")oY,zQpR۫64F8?Y9/֒76Gǟے)Huq.Ri?:FUK(?f2FZncp{|X@*Q~Fa/ĬDW~:lRo}kf\AxZ&#n&ȩT y*+鰿ÎAF'~ZKa bXoE Y?pX uMH+V<i"R0[@y%xȭtuW,ae0oy̤xיr7*f-1u̵t$>sC@o/tlҰ ʠ?+jT '+E$>,S֊SyÐ:)0׈qMR _o"3S%^7`,C\$R,]>΃q;^6=wM~*fWyX j)"goU~b f-ofɝ<xU^cqHԷ=tLT-V33'(^J~VI'W iscb-5Y@l]ٔ0>]~FbuN;6_tVSR3;F `YJ8G*|4Ne.2i|jce H)& $M4."^DVH2􄯡0|Zbkv'{9e.dD5l^61 h/<̓Vl#?#D6vFu=G,m|-d|o! {xXAm#qZjG^r h7pKv^g'ةmf;bWK :9vѸ$- zDֽv$9yePj-^,R|yJy:GE; aE/8lexX7l<%,EWgZ$C}kH)[Y9VѺ9zj.h*HQDuB9@66@Z F!;៽NJZ;ዱrA&ǓcBXnJ? JM(0J3#є:$ˎ^G'th("7?,ӯD(G.sAU,:P n<=/ڧs2TBέ!Ze+v,VL"E; Dit$U>+>`pzB !Ӫ $8;\Cv)1AUb'NG1xÀAdMj"p 0e+k47eGX5rlatʩ >]&͋{]ى11Tm\+~#fs-^6N#޷ѹ/sp6DC>98;Io[ca8,5 ݣ -$v1DC<GV2^:P$iEt\X#H^(2|7_N?ߞoԺ*j # kJA ISbTSjx!!g: 3)0`K~/szoHJE:SJDU5GC(oVh.=NGڷ\!h-I,s~fYzܱo桃akm3c*LZ`+Ъdq>ȸ0>eKT+wmGld>EvڼY_=~h0dT1܎#s &`x#UڑhWo]j aO|.vvHlp6R"ЮiITRaH'ZܸXvC9*V`qBDq|u#nٷdfظd2-®F"ZiݸBקl] "/9Qn4 `s"?bS(x-:EDAg$%iYOq)-(CsZղl&$uxu!0p$tDą^ސ `OHn"MnPA,˨>@2Wf᠟mGkv k{:oӰ\!P"`H Py͓'q4/H7LS^uŚvа-wZ{)K?"}ͻ0ZTI՘:xL!K`6c[hU69p)WDʹK/Hp=ChA$ p Wi8Ø W0a&~_yrB<)IZ CY:tvJtwф2VbK:2|DbU}nw0b@4;2btB0kH͟0Y|+pB0*x"E)Ъ+ Ѧl%1X>6{MEq0Ì0 8r^tFIRofz@m>lvjbؙ~r{{#d PřMw×B}%轔"{UQ^q!~mD;;}cj[=uzJ N,RPOQTSԄIT @,ΎMنJ<\ck\"Ω{:v0rT)4wHLs5k@mE[nPuh~N\4@LdeXLml*hUHN,=si8T3= ȿk9Kj[m@C*EE30ɪ~^6l"D`b|F$&Hg e s@lpb@WX"gHM&@8VJWaI[ي]({{Bր\M{mtthfU1Լ_ "OCΠrJWT Kg>Hn/U{Y4[A~zؐx8wċj;x3!&#-卬MO:ebPs x_unjaT%b{(U}vIu&x]0װYʕ%eAtz2?Q 9iO:V@M M۲;:dLYSr6vjbkyWx"җCRX¢zp3Կp:}73'&gLr^ڿ} ?? jQKOP =1 K$xxwSJ2QcY9C[]Gx3OWW J-S05!NxMx$Z Ey&E^c~|ý_ӏT8G/|ﮈY8D-4r?}^$7f6KFο>=Pz±jUNSAm ŔN`\,ޓК4qKNrw֍{v!`%%+&->F=3O+]r4RRrL|a1(ƨc$a`A)>3Ŕ{/˝ ' GmӤA!ܺ&[;'}=<(ne߀R :SيrCdUVԟLwvUE ?,C]\ɐ{\(%-E*VZ-t|GwiZnL6*\!F._ՆCL xW%C,h*VpKz! E5L395CޢLW]DSCBvlvAlnmÙ%+ ),'ah0X\}$@]PW~1C< &APX GޤY (N4+bhm@@+iVs(@\ʁhePQKz b6F9:ꏖŒJ-N˵?7S_*wc e"aLw1ڼfhՍ"qB{WmvP#-C](.d[P*wLa5ZT2f19ZӆX ;Gݪⴝ$2^[.FȻHnL&W= mI*WWsSȧt-KpF2ȹ'vvU *N0EmiA*a:/2iHKor7E>^] *`MGf;ݸ3>Q,e"uˌ@( %]n;7{s<;L؛ 5Eo?XnǕ&ST KSJyr}L˜ ,JcFF~V]ee ow%)I*lmzS4mUp@YL"O  A PBN57|nld %q- 95(P`0 C{gy57|{Ajg]:*h n 8E[<0޿8.`VvlmMu$T}s^]ؠF! kV_~jj{WȄneYsr>0$[[4(DESL$[`AQ&0ȭ PçP r1/qp m9K0Led8]]8Q0wMRCrg:IbidiQkRҒ_͚ŁJd`.DD|rsQP1z:d}Fa#/J.͎/W#g=]´%lPo x8d۸69< P1p-SR[(E1,uFv2yy,FA`h[9&Ymҙ9y\wğtIF{c5fWt$8V{s䚁&DYy5ۜ{yR "L D@ &m@ }DŅ#HmۗCIsspY}Ѣ&!k@aSb%NBZqͰ[d[( ->QB S36H-a}\ѰUN&&K'ןⓛ? b֎@M퐇sX]\}"nt CGjo`#> ZwdBXE>,z+rU>L>5WF^eAJ7}w&bYA&xV jF.5y[8̥|Q9M.G#<4^ud w3d3b^6bY8l'^-}(8VIc>St_gIZeR~WqX1] #"2#Τ{݀2_o]>vFL1[ĝART/5Ѯӥ?m/\qIFiy&MfÜGbfk-8 H$(FUگL@# D'*k{iOΧ2?]uĢ[g͝(SQ0OxXa*X2xtzHRѠT72h5uJpz,Ԙ22S þ#M[Y\)He_~E.D[0yOPR ~: o8L8g݈fwcҎڞ ]/BC&_H2<7 U`%Ll|WzԔ&R8Wҋqv 1jGàmD ʤFz^MwE|6 Yп hтaWx>DL)~J0zW&@p$DJ/zbNb:y[lT+CYzH+Uè`4>P?<9ݧw?{s28˳3Z%~0UU)|tzDjOOD^|L+{[U&UU'J̙4fx zĭL%n)3"<>>h]'}ZwRR4[%q%eī/S/¥l2y9uuN8.?_Kk_!ŒЋG 7[қsVu= j,/>ڼDjw>DJp$89+ XFMxEUctcxn}'ܴV~̮ǒnP6jΪ"T=C3K{.8fjT:*t0h KhC b8!Z?A6|54idiU70WTb_ZWa,@C`7c}k:F]w~xa* OބȞ3i`!!4)v cyR]ZЄ3NKM0A*E圀Z8das~t;ʬCw+7kgq֏趂MZXa86.ieT!é1ds%b|ֱe؃Ok$Irzvf  )@24/4f!N?CUf="nl{~Į|p/X-:^7c3U bR oQܢqtoKMj\a!m5lT Q s.J懨sRsjmIIXi}fa^[Pw@)/)*Dpl-K'3NJil4X{! 5, '\^XuI*YR)yieʐ .g>[U$o_~㧛gS0d^~: EIi9%s|!KKL|5.nPD_2- =FvkmvOSQ7I7`ܻƾ~ Zpb88PF=汖a}!,N1tDdaYKBܫȦkHR!0-NV=0_ ۛTzx|\h7/|Y=_,|ZoQPy2Bjp&]CUSIP0]Ѥ; g=3d;Bxve…ejE1/p /UW,izLm3C=>\H!ydekMM7Hh4y)ymRz΂n-ϒ|e֊k.K<; uбyjcFd+E~+Ѯ޵GD[waVozS#lBp]]®:Uk/6ޑ~405Y?`%Szε*"0"mP˯1!R0dDn)_y?|{ PwxeQ]AơEp'-ax)g;P{ I?~ߒDY%j`6eYױ.@ZSQV&[|\ 4Ҍ dE6rms,/dM6.ɐt: BA~w;B-:h#vsPt=fPg.:EL΢#+#u)6%4sfs]yQr1>ŻC?LU=J:K*#SWpkWw['! ^د-jJBö@JWWM~vt' ALE&!~@@J^BZ lHk+$)F+JCJoo~/Dk̩&T;T+Tu%EO<=7f 1+mPM|MֺrxOȠ)D`&jQWOfq_ߤw:5 rXK܍ =ADHmʭp;F}šJQ#rzd kxfTO&ft8^p%a_q {|%qh"H٩5~QŸ~3ȳsawy87]Kc|EGp~5Kc#U"=RUA6W IDZ^5;+L[+N2#%.x㡓w4W!Zb̨dO6R0\DyxHO^1Z|AA(BוQ쫶sN=Ij*n Ar@} *Upိ]h =i٘4D&mVq1 3u6jg-g U )pgUϭ_`J!wĸ/[Tw uJr"Sݒ4H\&u3Y~1a GCiy:0/z-ᅴ0Ŕ h+oFOtQ˪C ( B-doۿo?!tjᴚreRR ((II[1,LmןmKޥzЄH˅ V=`\v@^d0̠DhA+AE;ٕ=(EZ!70qy. f3@m83^-z5P{{ gxtQHh`֡F~V/@[ӎVxT0=+R_bo ?an[.b]fEG@V1:LDH7;8ەLc (G!%钠zT%.I-ГI.Il[|>Dm&V)bR?o_ ^?ɒ#Ebb"Nl&A)RHZ}HO7|sMm0!=F)T3+.Yc$"wf0Rh|BE[-H9uhJ@.ڳJ 0:m1vעV#1gsKWsgl{D8ilFFdܫ nmv@q1s}L[yJ|k(Wӧq"ESxٳ]KQaaJk>q^,uAf&:W{:hbYSJ\?G/an^ zr(,1jDhVXw~aa;9z29KI]Ė'iN+ /n+VC*sxYU=j4(NL {cKB()`M);y}ED5R+hVgeAv,tr礛Mpq ѕ؇g-4{k⢿,jR{ƊǞaC4/Yݎ/t"8_^[pM]lu']Qyn˿! !$C \J΢E:BE3:MCE8]t4DjD}ޢUl: 5|!}n_dEus=i#@[&l4a) JcG3C{O+Q s W@Q}L RʾBAzH{yW5 oQ6=p.Hͣv GR Vċ`Xd ZDGgU[ ms/f #rQe1uЪ"*ٸb:Yr/#\%k͗X8@ /U`b-frѥ~.նwq%w^kfp"ӲŰaf  y{H\ȮDRPթuPzﺕcQt*_q葽O_™dtqTdE Knxf|+^(UW)-%'Zђ1|\@/E 1MC>~>O{ߵ,ؒ]ꑥalST@Vzh+R՝@%3PER _~pO!RVvbYݏ6jYWݲm J?~!)50_yZW޾o5J _GQdAȭ<)ь 4˗89!x}I.Q0FD{*V[gnZa2mי|ьQfo7IB"akR01{N]j6VZ9W"V4$Jfs^MaDBJ} =qĮ pfJ]*^<F )ߖ_C6 | 3c?n}:{-9o?S.:2A=򍀾a̻;O_-),jz="$1rc#9x ,HN/0 6 aQ T^fZ\9kܜN{N'>~IֲJ-FVڎw[%n[卙Ֆ' (VÉ;D_5g|9lJ7/#ߡ ;2duQ?f֟ ˎEK݉Sw/q%!y贪[V h|:8w >x(-vZ7^y*w􄼣]{* my}2.=/`nޤ_ߋ`aТiy X$Q4]4$6ghʹz(Rjy*tI̯dLR}M>X,E xZEhж-C4d2s竴]rs [GX }UXEy98 rCwUfl>Oa!V%TQ]ӭht ^M=T@: bu<iⱉ{wiC*"*b 8-y}()UQ՟~Xb`M#~ག:*q96hU-vM %h  V7PU D|^ *p__rLe84KS-"޸1de/u`'q9qx :-'1b SkK h jueOCϊFRFpޮ%)/z+ 6͒Xi^Bsܾ}c&om<d߀nS[õqM/z.~N ,)GiUG[ is6rY!^-֬tYD i#۶I~ ݷ^`oJpw9ʿ}ݾp&d%ۯIF=U$xFIw$-L>D7;*4ht xE^R%a 2\/͵,-@UkYM3,R}(WaW6l!1K [ȣqpZ<7X,~#'ȳ yr|cq LuBhu+9p\wf$a.ww3 .!bNaVhyl=)M!<18 &ó&w Zp/֋r6IMFO߾߿'_AzMQG%&,64'ۙ]vBan0EG$CҶOI]QtYUiB[\cJmoe(؏:p ad^mJ\r* ~l yې}t Ѻ9ե^z*%$Lrlu+0pOs )Ǥ*W= ;k<Ѻ bRؐİNHDuN99Km;puÛgVY]C ήRJcB",bJN+Jƨ"(vE~'mWo;r3sFz}ͩ[n'{2#H/~]ImTȗد߶/G/aJX2eS/av8X_|O@wfz44$vrnE&"~3N"&<=A:(șFxmlL.^rTqٿ*퉔7dE4g<Kl0ѮM@2mO òjZ+RH9Yļ,|n>Y*jsg xCdE`sY`^}8i {4#6^X Xvq^>CBL!Yf$,VE^9.C6!V&p!t#S!.βyK'_!r8P:X|ȿ5Cx" b_}ȏ1N"/_TkVUW5I~8 eScNVU@Q5peKV;HOǕW,vTz g,'w"Tѕ{KPk$:X zA)cX] FLj#G M5b'Z/#~iRU0[ WY3~vf3 ߺʌ~LGi吟ҨWŜ5H{ˈ#s}}TyQ0󵑱[}ȊVK! Aە9^j.Eˎ 8D}_-x$Rs\5[c8*,z߶*J$NEkjsاL %Kk>IUN",kebe]1~+ÒuA+ xѱ6؂ɻk+lȓ8bkj}DOq<*a;{'2k"F.b7  ,<1bo f 5їWxxo:8XKaB)V;˨˨Z/yEA#;xم]^*7}z.t>4l/4[GvSpb:t;&f?TW.ƫox}ȇ H=w:(.L|{h/n5DqhUXPص^å#Wy}XxyZ4.8ѻWyfw{:D =1rba.('}o_Щޝ̈́5 ?,tyr#[7|kVCmA{q+Y)K_* \~s!k&@@ԅ OB=UD|^G *vIә\K*'_hri-92ʄF!n9 C3(2Co% WB1)L3-1WϥH5UAq`=ȓ?vtk0,ǵO׭+UƓat9-V@YU [BlBya-8i"@r^J雏*8pD޷&8wyT3e+A f8Cj,rcƬ(K#C} _I6t[Ąg)p{4ߐ؟~7?ݓt^SVoMn?MH)X3*ňU0zim(MfF/5=Ԍ{YBP:-y9xhO)^AeWE Gz~᭿o PU,5Őn9335Ê ŁBAe*g^W=0jnv/UV@kEpSrRꓱJ,~Xy9DG6 ]J%f(. lΝ߫v%QVP R yX.myV1bT7*4_ kL 2w@$R7Q{DHF%-|0Xxwiz\&MiGPWyda"ZB <ńO_!Ԑꫛ"F0eӛ({`QylG#LFv#~2!$tv%tc/n": 7rRŷ* Jty7 J~3, kD=z7n=ejW)(r~_ݐ~BAq.kd CCr#;\'T^ {"ōNjԠ?ꎞ;Fe3,N=Pt*TBR(T%qɚ$XJ졑X##\SetPf8q>ti>V (rkUYF#uTQeQ+0n2l/ˤ~J|;d$%DZ~48jn`Θ)@[LtCp-,!*5c%}۸8S3~ܞ5w{T*D2d]+>v|oV+"t aʋhCU$5H?nad>ZB%2[ {Yd'{:t> 59mLUAKpehܥ;Y4$qIЧT鸻=+sZN~K !WK}Qx& c_v.80v [Κ҆.bHysV֮ pCqC_-sjӐ J䚦k ]$wͅ| YU}P/12NF6$[*&bUl`=bYrq26ҊXWXaMG+܏j1تs-(l‡'O i/""E QцOwk iJ}cƭNMa+A*zzk;^džj@'(*@#~$^'fFN,q˻KQZY?]^Xƒ>J0|HJ.ۡ})V*g9dBC)`z> D˗5dV} 3QѢEr#p0*(ahQs60ISߞxwЕ^G;KkLX/dhJШHկn!\TEZa<@x]WFj* >-?at |`'JkƽjݙqFK= Et}'GO\hBz$ 6DtC(0D$wD2J$_KۣF||THO0%%1T0Ρ姡 xb^-ਕo E}&K3-(=.6*W6 > ȒrHӑKv;HY)+8YZW@PpDI9ƺeWZ5ڒGh׿Y{I&{5V:)Ls~i-/wyK3tLz< a N͒'3gBR3Ky?u~7Y>kQzAXUqV;Q3^!w/4%J Z큑f;sbNTjhɑ=aà5R88H}AE SWl_Ke^=oq_So1i 0r`tkz١pr &`$Œ7 k\1G̮)Z 蓾u\`ѡ1/ȦGº[yw$W0;.7LGA;`ҐtBxa%7=-1j 6zGrюi@v&s R)!K>iSm,R|ǽc CYH{2:h[E@` ߈ µdW@T)7RYd ꐐ^M lWhw?F"mKC/O_/W2=\ ا{@J e@%(?܊@nVa?uՁg1o0G LP9@t!zAEGU@T0EFg)Xi۝\ pUmHJwyG? u;wv5{hYÒk[h|UGL~_%:U+/^Y܋<95Jj euGB@P[xXxVJ^|[Qɓhw {},krOcR]n~rj?oŐ\2n&ە\3=%J,ӗ_0FITPW8F9د/$bӴ,c\"U][-E]^VY Z%WVEϼbIr~]#J*Hp%08j]'(KW 2TT3t] c3zE K|Oƥ_89D28ᒞSa1l9|=ME<9r; @ u0Sߏ%c,D'FC!n/o:ptR@,ŕDE.#hR];l9]OLI2:jJgm9M¾g:BxS'htſVpN8κvל420 (.&e;e]qPq_|;eFE2ղ^䴒 DVNG8qkNO!ePrxȚ*'hSQ*ȂLVިb? +~E91@7k]=%4{H F!ujljJ>v%=f .YK|DROiֱGC啡GՑx <"}>D&6"zXƝ#Q_K ?~8';ٗxI+ z؃b\$2'5@MeY>:TvIfgp{QLHn0S ԭߪ5'l؝7+DTc|4<`*(k&6Ú `+eVR8.toPr$8ihv_,LfEsC(Eݦ)۷?7dIpI$ˇ"0]hL "VYt(l*,>"\> j(ATtMAd*`oq[Q}o޾*V0"~=R52|<"հv1\w -EJ>/<<|A&Fƃ`Ua$W4 aboP(Ȗ2i v-8z`PdtSdMy65qEF\G7@1/d,$`wNaZ h+ֺN KP #SJwᇢ\P؋~<ķ֐֋Qj{3Hjzfb/ L>'f+Z7Ԥ2(Oe?3#gon_2êMuhjR5ZlsS |Q$ZeeV  h%sFQkǕf sʓPy5Sqk8Ф B]n:j`öL0RV WR-3lޑ=N߈:|PlsJ%sAgזϣ2( t2rIIReY]( =,a4~hq`6ޯв5-'AAI6`&\v I: O b-E!Y +<,CV[ǰJeG0C >ZMP/z*ġ[jx" TILбD$} Q [z3n0 M/7MbϟΡ%QuD^i(z$;_>)tv_Tqwg)w2L&%FH ;Ϗtr }JNK YRpV__}\^ (t?jT5,{%k1#f+0xK]U1˜F(fp'̶UWd M( fؙW7C=1W _W_޽)g.I:B8;-Q wxKjZ /)$PcĺQ v%m Bfa 8Bdȏ_~܊=+hw)]PW@]hzY )qce7e[9U֐U>ކM?5:ECbVo\]{= v.U=QCw Yw,\4#`Peٝ+-wxQgAnZڸs"} BѥVH ](@r3*bzy.rDquyezA顁?q<4۽A:) iA˓-% y`XOj *wz m5Ά%hswBX ]T'j*|=lȀ޾o??4 @t-iVPUr)-qK*~%˧ C)ӜGpf~? db? zCs ޠMz|U(v!͢5xHY*:Sn=Ļ[> 0_. eV qD ;1ɝَll?v`26<Y XT+Gk'27m#-!7[* c[_|18|R ^0h߻뮌࢐E˄@ՖROO8uBy-H]/~Hzp ipuPTU6:J@W" 7I;2~q(f)R$չń>E_]U43* 94ͣL DJ=|pS (hbENg9E `t&hxƽGbd͛RzOhǫ>nArHKU@]8)2G!m{UU%?)jn%EN>̧N!_= Bߩ?26$_x9 8݌V2sKrȡ9`DZ E9^-(! ICсŅNXHa&\CTamLriÒQV1){MucoduָrO[B/CXs e ?ɰ- e0s(b#چ~@\ַ N_d߱4MA(֟: hx4Os!5lc )ej`5~6~`8B N$:ږYR &6 "Hw~\LTׂsPW.W4 ^r7s?̈dcbJ / Q}ȸ>*e KS~|smis{gX!j_j/Gj~DZE̢`y16ЙsnnW:Ƒ}::QJ!jVojEN3sm\«kO,x)(УG@]w;Dיl 3nLD)JGAkV T:Ő |9!mۖ$N2 OR/,^!MluV 5x90k_3JLF/(1~[[Z4}+~j^*5!19Ұɓ늳 iAx`poipV-<'hh 2]Bb}]jWdf!Z;VVW8dR \5?֢;FCrw>NDT}q:%NjM@}ODk间ϰVHAzr)n SsGꊬΕp [#bp{ʁ,XeqnG{0UJb-]&d0HUYhqqb g fJlMD-Pt 7arxrBDŅ7 **㰧81\7{ŨI#-j,LHa_\ p/|8N^FJpѨi5t:v@:/5e^Fl2‘dDt]ib]qYu`//jD>'>zBŅHʍX(#ި]60\`rpxeXck@5pa[1PΕ}/Eq#-ۙ*B9wSqn<~{)j8b_Vv)%tu}otXUK(/#,_)5Xh9NM=X/0+WpE2 SUw&Dt*X` :Ӟ!AuH1})nX*%&*X q52N07TZGw0sDKD}l ɆgS}c]tW+2zN}\8e.L@e?iL _yMٛdI&n>+E(w:H ~ӟ7po~k(sp&ưG{¼u"76,zU8KGx 4P=L=CL>(x k ŅxBEle:02\F&偖~flӾIrU@]9 r,cT#YsHyEHP@˲K1 ZIK$ȶeL@*+;".aH3^v.2=D꼓.S>{nmYESAi0' hxt\(<>0v.3hݏ~G%/[@T2CKujmm(,\@gnf84-k/~T/._g`|LfYWY}>oCTW&ʸ!MvGÎ{tz"wt1M |d)t:>?#p Zc(F(vYliL4>ڏ=@+7 <^{䮑IGa%Ey#=5hK~%;x Ғc[ܷڰ@ G7]NB8U[c$:/ۛYbj` "Gb@XloX7&Kk9WrDPE pф ֈ 3 6͸j~J=eF訠z˽N=3,\ ֎uAW]uݣɁCئMų- Ϣ~ah*q.,hup*|:pf #_Q)n]53o)[Or$C?n7U<8uxhv7ϻ?\ ///BKU;hP?zqԝ%L~OSe 4'kNѡ vJTC >KC[yeAi{~#Dѻ5X'ׂ$OީէW]mӳY{Rsg&8Wz:էVNE?2} #xVwٞnLDRB<.IdY_ԗf"]eO!y[[yHU`$AQ(Nd'Q=ؔ104Æur-@ϕUPx9]s֥v >dU7nmN!>O/8&VZr-~ŒeFa$}b0k!:y&t5(MpGi8dؔ%Lz.hsf` ]Á> DNLҎ)qFJf{prW~ܛ3-g[!CE霞Rd'eJg6aEIu"EW\4NŜ&#]O6:.5zݪQG? 醧 R-H9fqwaHfי{ꬂUJq,qL5ފΟKJ*J}kW&Og0ͬKQW:+cJCu\Ch> X2\aR]  E-,52iS)V_AfkDs{ZFѦ-|bPګS TS <EZȕex2f-i,SW ek5ԁ.F4,΀$g d)2Do9"φM,|HV[6H'L/js2:zcTk(1xmC 錯ɾ"wj`4q67\ Lؗ >lEy ,p\<]BzV~͚7ÙF.5M b W%6k#dLؕj₂Ys#I 5THM2{Z1C\Xٿ9SL~?Ʃ>9:A+1,,Qn dz19oVT+DzYnA<Ќfh8_1P(N֢|X`/b6ehg&`Ž%УZܭ0 GB3#D]pڰ= d\ >9PzSx+F|b>k-+ot`ᨥ_E^GQC `鮐i]Б[6Zcz){g<;Q:xu"RSĞ^%#INlrU~?:qEǾ-SRbjN5ź)vFo`;(:Lo@Ҷ6>5' `} B,*g>Fb;݈CTYg藢J)y.ېfNM\!v&"Er b]Jˈcak$ѝqBJfqEzUHh+ ȅ{ NL4`C,%jO3~I%8F_QWIjWꪃ*Ci +ovxS[5āhpO_񊸾#{ne&x~Iި63ohؽD@YP޿2_3`=$vPPs:QTY<*sx_㴂R Wh'9Kύ%5RGуh\HR2C膇݆‹P8kOEa+V؉5~ 82T kSSJ_ h:dV@`BQ )SPeMobcѩM@p})ՇE2+6 &!Eu U\'14=Btݝ*ZXEB/3k8Il~۳ fDqWF*wk+ۯFԊ];a0wY_>Bϟi~ot@ < BmZdF3C(A+eGXNu\icXͫ-&cxMqK׷.PzHB*[iGl5l+_PZ~%h5*ru2}XuH@CF!tz-_=+K5[;g"܆ޢ2:lQT_%k,y 7 =ήjL⃦ Qt(Vw.){ K 0lqUtb<.Ќދv&&K(Wa J$A"+(x;x:z:HNSwY!l şn4JSg{lKmD^Z1%Vr Y$|5-7!5=iOzJdERĥCrFf47'0E²焓ci'ϱ @s&Eж3T0A``88۲w A'%yH?$n( "av1H ;2dʃww_rKи’ FQy(x۩##:ɒpjS8s`: 3ʵ]v/!7.tb1 aQKĹͬ>GJ(ڢbl*TޭnQz G|lk g6v; D?^EHg d*Pԇg WV 5 W7xOD|2DiUT.JW~ۤHJ(lNt츜3_]ZKۥFSre\.XG3 <,\)eiZW>6xCU">\%N'^SjYF"hM_-&8&w;u`F_/Hii#*L~AaZPd7TA(\O(/G'P!ܫpy8䲃ʍC\)ll &>D&(2vjy\EϢ<ҡv-?gʯk)Wo4HJr+$cFh1:þ bWbrd' y*݃X2JKLsDjbWFv9/2&hpKL>\[p ^ p2x~#_2|5 nQ5u#W(ك#K G #My`tEg!_` }E^BDXh}~hgdM+o#4ɵJ]E") 2WwV'Y 2T MR3C\lYV`0=? aLKE58VR7|u)=H'6s'̹d[NWx][wxW,W/cwbYYh,;.~4= ]b,ùBzCV) ~eA;>b1(!vFF-斀#IAZjX)T쳻$o+{eA/NQSȻOG?wyDn7ԋl⺣$r,FJhBD δL6o[RuއYuybztM +-եq8'3e^Oe )rEM}ͮ[gry\B$oa`kK:P}Lع>&uW3uR\4s&M!rkZB5VT>h0V ྆Zϟ`~ئ¥o{Ta.Mύ׷Z3j(W-gΘi,뜛+v$FcFlb䎻yQf2 F&sH6T}q᭴? u#a-0G5.8]Zy>$}H O(pJբԳ=p̠U@RRmQ;I3c?LzUNL`nEiw2ƬTZ`Ϙ)=Dvy2*zngp,J~MީM&en iҖ8h9y&qVQ"L ~4™L4^Jw`]^QNM[ V8 qlBʭБlgj+F0B2B pUr`1Q_=3Ψ%P.]dhe(>߭'%ilfZtl!$zD3&4N)}1K>钨IL7ЄtE>`&_lB=wMi$^vw #eHm}~z%_asBJfB3s^O*SGC~]q]9p&Mc&5 FˇݡQ`e;PwǟCk&4!&ݷg,JŚK~Nc@xzD_߹@6 }"q,팴I<;a^bb]Q^(nOcp _(m'<^$႒#󋡛й1]⪔FFupxsy#'OƢbf>bk^B ُ& W9I#ܤoe*NX,Xo~ˢ#I߽G(:!|`oR@(8Կs ^`7t[6L҃ѱI1(vrK_=Fr-XR7\`9<΃+XQeQ}8$i3J8nY];#뾽Q z8<eX?rpUbS>5]PXkoʹ:9?0:zsi`[_H -͵ dBBwU2Z^U9;EJ]* hT MSo6hn0xc7Q 'v_h, r?`*L`XL꘴"n|s0q\?` ͡o|XD^_;~_'/ s2VFBbCʼUfA>ڗ|ۮrP &CJ,Ynkw3XgƂ1t&ȱ5_It'w5 Yګ|C<J%!Il3S7kYյsp᜸Za@ U kG OV㚗lZxZ~fTw/fx+4@|muNNWK ABpIӐ ΢~L>Znv_}9Yus3G,-b[~eHk@uSQ0Q ziIpeZ@v-Ԁ9:[+4rDu&u^qh u؇dZE=mAxbW%zl*H}k6Essi\Yd &]s{ĺ"K9*Iԡܭ D2I |.g| &A:`tj N3hVd:lp.6!G4)PohE)+V@"S1(y~_㡰$R=+rb]~pچiיKD5-R{hFg_VL 1SOگs~oȂ0HQ(xp^̢9r` ԓ48Ub:͢Ÿ;ȴC-{*|HqZ.9Ke6HD&$:"1`]}ւˠxC`9!W(YF .llWz\nV]/F b+k -;I3tUO;"[.Ζʶ l8醩' lLUDr[slSaK۝@\w"Faj΀vM59J5kK2~DAG%)LBLq8,@N+N ַ'*bXM21~-P43&٦Qf|ɖGVgYm>?cKM=iH}a̠:4W:{8Wj$CX*ՖG?vuOs:XIhW>RJbr.⬴]U]~-Q7ot>Iω :D7Y~3soPH uEXLn9 Z_%bR)He > N@17d ݩTl stQ ɳ޹"YG]*0B'AJC iC|  0;OD=]H쿟ZLw!(%Ֆy 8S5i(XH] "T )pg­ӏ3B@G9kg`?tB ]e/P0z$5Zvw a/ X4q &n k1bd#7̪}wdq.=;rr◚r|T]0rnUVԻ" BTX _-og h0zo* XWN(aCfR\:2lloŦDA{?7X9[ ɓ 7U`\wN]=@A.od'׭V6k=rv.߮{z盧^2&9UϺZ^"Q'=Ujȏfo.,~NYe!ez}@+tfJ!vWΤ\)KiR(.;:.+eJ iPi8 !4udI74kfEb+geuBX茛$>smlp+WW~? !bzaa@ޖmhLW(j "ҝ\ċcQ% op">;կ(" ROJhpBRFcwqЎ\`֭?>%Kc*͵:o2oZEFĎNKCPƃs0xwG}U섿밀,kP4({ڹݳ̰Ƣ&%jBKV5bsЕ:POiߓlBjl.š|jq[׼|>_;&Bv67pZ\$E䠌H";["jXN,X[&w130P}G ``^UL CՎBqS~Xn꛺jvge <o Jz֣mc 9k>ّaWB>[ POuz%J#5ÁXOy.]רj8wE4n+=Yt'WnQ[7bv:2R;r(m(c@CֵLY\Ű8@ \ǘ8w%i} pStx4:ݳwݣīD -03²^7'Od}bdN;,' J=*Vn4$0A$C%i~/fTrJ@=i5. U1`3s!IIǬ)'dPJ8`.(DnbGCkr-З"vGYq'ĖӅZhQ͚y7, > @Yμxb|Z˜(KyO1vGMCZE&pj82Ȼ[ m[|-ǧP$=t zDZTt'ՇΊFw3hS/쑈ЪgQGuVi0 x}I[s ^3 lw!宐jJ_WѭUjR<*%ϮdK f07>ү-v.54&L{o'iJ8/J%8M`69MPn9?uTM,!xPj8QhQDj=3 Zl=5-RuH^&|˛K]bGfn"ذgsavQ礰h%GּgF Ğ"^z`=e30nƀ{{ X#uED&aF67ۓ-Ltŋ'wV#'ȊKpʑȬ#9s 0h"&[wjBZ %Җ`^]>xE kؐt at;N/fXLjW,*:{N(]Sz#2X'7x 2+0ր0QC1N,6_i)Ơy/e•++]~{#~VRr;S[S țI8؛bla|ϝcMZwĨ Y3܁RAHm o6Уb%r&1@3]kd}0YzFf:\IVIbuZJ]+"nmXeu pO]dG3z$9Ot֏k_]"_pUBjغfqVmF@k`E1,E,;BM1n3Jqzc"ML:N= 缁QZ+Ŕ?7b~JY}h2)-DUi\MW S-ڴݱ7Pʋ6~ ŵË3>agBwl ѡ8d ȫyˠ°RuXt6ĭ[ /T, 7P~hcX~OS,uG _'\YZQ5)Pv습Y08>Ix̣Aa^~JD#xJcLr!ߔ-_vr*-ӸeLdX^€Z=QUVyp])T̈@e`2o34|Fw@K lu" 'OڢdR&Pѓa1:0)TL aα4Ƃ=Eo#JXUxX :/WZ"$[p!1QѤK+p"}0*4eNmUc Rđ`S[3@QQ`KQ$\\C l&C>% m<2^x3b(29:L8i1Y;mc}EyXN86w<9Jǣ{uYҧ]2<8(N7nRdO7O9dmV}5CpD2 HQWKvB_VNPwe DZ ' `iOқA ^O/?K<|0F]0ep]zT#"a``oEnz bSt%hO艓 7f|ZVUݤֵW,WG+-qGO{Rz ;kXQJ]T_n1M09#&vbk dEW{2͒;pGv{C]40\%Iw "L%TnHC}-MhWz4u4g5hFp[FQ?Dt1JY_( }zXÂE^:&Xm!/u Lj&rl8SpӃiPms=K?NةnDy|wMn軯.0ď',ňAf0H wKB_ fGd{R}󻕻~QuX d|550Ʋ/:y>XJ Jb&UݻwסW=3L+篲8j4t yNV5}M/X*~hXWfWlG\h+Qo5V :;^S'9cQ!Ρ0з{a4y;Q`;aϯ[?FfԠn7gQV;n#-S)+#X k&ٛ?ǰ~na?aKPJj"1z]卺kflOwwUEUH+ uZ0JB2o_W!XUz5cv:E{DWĚ"wӘ^U?K6J+So|ѷN>uk7Bðn%BOŢ÷^g2=:!L]fJ8;RBJ?z,{+jgEt}?n]!UC]9ny^W n=+/Ы#iŸ.px@U|kP+'_7\Kf͗c)-L>HMܢBׂksE:M^)c C=컣`ހ^M`xԜ7h`Qbb5^ Έ/G]lVYO{HH[ t 2"9N'T$lB@8Ӡ"H'J%BBI0e;Z`tCp)`F⍷ieDC~V掼ѓM,uӷ`n4vC(*,n1 pÎ)mvl住70,x-D5žpBO㳀 {uzO'@uQ?ˡ[2;4DXI8+Y^,WbTa?\p_OFeJl\xHX] t 661X$p*|Os#Y|&wk=v,!X#g\݆^&pݳKd5(FvǢalW!s#fǣ?>9"= -p_h'je^FXLL&XF k?aq$`寒CM7C #ZWI\ѱ#* iu,؍a, mk:׊49"]u&73i$9`bc7l_PΤ E9KY~¶c%B^V!X7gU܌C 02dYqS|ğ/',k fdAU4zUʼF' O$d=$x40;m>*.^hŊg'N ֥v[AWT;]㍵XBacUDi0I#5J`y6/Ju_TƷTڊPgT,DX?:-oyXk̵HP* ARKoًBPȵO[ l'*_>pM[]8v~]jt= }=Ӣoֽ>cSDӣ;oŜ=NnC4Q&{8zk)rh˩}Ucd* u81`!!}NTdPNh+iT݌c40~ddؽ3c& gx' bew%0#x9H:ˁfI{ѰY7(|T9dpzyf_G/DTlJi g)dM8߹rl]ˏp #$U5-G";9_Arז7eU.gFf%ی:8d; ӒF12t2Z ,p8 [vMK/;2)Wfgy8S*-*3-pHtqhT9u>n8(⮦3g}Bdd"y$(bLG vl <<,h{ih(~dpmxyX~_?V:&F5^v{WRÝ(tdL.HɡIߜ~XC9YhsHJrXrM1(k+lI N;FΙc$I(Cr3k@j}my,ozoۢ;:lD**Vۡxܞ`Yxp||twt6Ś,a!wx6 qNU9YJ1Yv&B8bIVW5խ &R}XCī{``b3p#\3_*T^rh-lcցÇ{䃵̫b?+R`BӜVi] 'Rg>FW]S&XNԉݶVBjI3#`ڹV-~Czn#`XM %9oWo /רYd F!(.bC~Dir) ͑E%7ބLI#Yk۲O( ú&={yօI~ st3Mzr ߰]. e(WwAw5r2ka;o5z^<>!`KMyvɫ@{f<#oJ>` ;d6GfO9b #ѻ^_?d;Ga=Gђ^FĻO2@| WHW E݂7IU@ ^(xFzg?z&bXr?XF]Wchs%t14T/u5vvnǣ.(L@]$l9ɔ~OЁ5|08>ot`7tn붸`bOt{XN$A&O4+TnSmXtkÞ78/KK=jci~Vm>-p!nrr(!3у( :5eA~ 0D4 z[\.FFWXoxaCRuʅ#*N=[P!5z @ +5d8a`᧋gb~=c;]ًpjTgG:{'7)u6J%{oSck}ty4<,I6s[YPtj KWD>&{2"dwxap`a_:ϯJ\+ʩXph2K:yXIoP=gOH &Ux=j^<GS,<<<,lhF=fw7ZH?40{vǐyp[uYc cyfǜ$f 0ň)o/:! >kOz;8V)^7!lP=sOBNO9Un vE *,m#vȎ 4oGpW̆kyX]>#ib υ5 7~O~Hef`E()9WȩܑDyXh)I _[8JTn@{ T9FhKWX3bX;wĭf:jӂ43EݺӴ 9A=!ߝ/]ݣF1ƶ[ePcɉ>EqxܜjPnsE>|3;.B'?_ҥ?o5H⥵Eo DDWtPmXrCMA~0vwW&?*}Yi;H>Ves׼Pu_e#%:V\:ͻпVl4@8}%|җ+瓷z^X8=I^E,z[X}*v_Dp(F X'obP:5쩥ah^>aYM得.WK66iN'υG=6#ʯ}}Q d]- hGp@Lj iևeQ,;Q@ClZYMlȧR@|<7MGtCpU0c?߷nb7c0JOOx%i4ijarQ~~̥s\-> s^7-Fgy8QV޷"u!WZ^5xzG*(wۇ!Fq߅/8'jNbDG]rE&mqB'<|.D: U;-Cӥc̽;B°z72rE u5 +{T˫X,pk'`ojCTvϚ5KxY$u'zna7S;{Y鿔CKPAt2`&^)=5sA,?PS) 6~oJsXeeo1$BdH- o}v0nQ2?<@g䃳dwԗƹN&o ܦ kiY)@\S?RKQ;yG[HUq69l/8s#s%̅ X,Ob#[=!PgS*.;w@:~3m؏luix0,v4-XK'W>4y'^V0iUDI%Zsv/= O;4B4'7:0Fyql?࠭=\}O7xdyaa0kil=t0D!S`uUD̷+g'+7>OqdJlVAY~Ͷ=g /B7p|:t*dJZ~VrODtҠT pEs{-uٶngv:Gd&+ZmJ҅R&HL+*F:HF|F-_~ " D`>jZKq*K (բaIw>FF>7ɺ- 1P3£dX{U3Ҟ4̏TТk}3ʿ'Hno}yO7" {`B`J$~$ixsx<jM\{+B> zf墻B]yg G>4!ahȳblt Fɣ9,Fc2Vi+=&WD_-PP ޢƉ&bJWה}"}E䬺jSXڜJ5 Y5{zfTMG4JM%{7>C3qT񝴵MJO<'i?%eS1ӹIyZFNz}C:f$|9qKRduNR$?bWѩxEQ=,n,\߾D)>|pLMo957~@B&ŇFLO%EȏN7?һ 7/1$&M v2iJz}RtJH?u*o*BUu 5U ~ohZd({Mb|FGn:^py.`@1v*}c\oüt3wt Űշ-̂6-o&-!kt g\В{@k? rþpf ۪pH/Vnj$Cz#h`Q{`fNoS-6Zmtoy$䐐s;#`q5O aQUVJVraԅYnVk7Pq}tys.V>ͽzj#&$jL<9RH%;)I6z0oIA86?K)*Z ȵi!k*n|\a;=[Q9>wf_˛=Eew?:t۴{t-=^l\H5kc0aI^Js"0_|0֞v@} }#a`vE7$آYda|)Ԡh"b]BH3*qov r(HXi(ư]Ofh coR쒃VOYa3S'U{lMzTM-5oIu-ɛVJ3?mw;> /4FR u{Z &T T=ưlMAK %V*zihȟd6n@[.3H$_uz _48y DaXpY9.fnE]ガ[:l|xSG03>7/tC[`{s$|/B`M \*ѡv9eqWW0B o:IEP€"zS5@=iE7vK~њ@(GxC1:>> ]׾ w3+TwzW2`:hkMP?][YЄ"<.6| {O+, 4&7k ;~Fo(ҫحvhlZ% 8}B篜]0z,9e濿»$iv+oYWu@6nFPZI79XO T$G/.Ӷ!?hM<3rswϳ[6}n)2AĶ/=' z@`&) = 8('U7v1:kQ2? EiODH?lȬAke*+zZEɭk"`R\7,:??K\T[Re^S <.]7M/ j Ek3S ص7P\ oM(D=f,gXݚoURFЎleB15(Wpgi ;m ZW&?q> ⽃n$ ,gn]=BWiMzMZ 1wr!n0jضh]`#ѳu;bG#)-7S;jmrwanib3K"0" ;4Ā)}ª9AV]UÌ5R7P>CMq֍kIyl!1HvHXvKj98"{*!N*Ü Xp](} gZ٠-5!f=ieV;=L u3a %]pHX\bѨ=o<VnIw1?~Ɨ1TX އJzk C*џzXt +j_;|p jFumbI!ݿHꚱP_R.EM 7qTP0+QIoh\&]E'[M$Vh`s]|fO')jtQ 1k_gVl/YLOރ+_.Al0Aj\UC> `ⱁK 1&c.iߢI''ǢMtNU'@o52[ YXJ|Y4@xXf@ŇW3+Şz'f9႕I89[:2z}ɂ)1(.eLJ% k"Wi65Ġ VlV}8}K> \SJS*&&7X8B;󌒛lˏ:6Dl?dT:'<8eQqyZ8[L~AuZum`cC뼓킨Pގ!c/= 1:gW'S~&#|[gsT ϶墳FX龷.{DK h]0 kV#z! cX6(v]4 뵫&F#~,E 8yFnBrcQb Lgb;v_>dR)fc,:+ZTiB sƖG=^twڴaD=߈`dn(/pBsތlG J ЯӔ'?oR0dc%_:ӘuE_( ˻ɓmZFSҁ Fg.yK,o?]<''cՏd WXE+-h6 avl8"7ߚiN4GDs9@RТS] wu.nUR#YR?[r Я:}0jXWKjаx I! +R!y.KTNt ,x>%,†'"\sG7&ֺ;ݝ:}mSQC[} êu3t7Xgca.q/n.~W pi o6]qᖛ#eVg_3(~rU;Ơ3jg#ױ(:}+${%M /]`i8l(ʐH>}y_d &b _|8Uk7l,[h`|,  A*V?&sG(*[MoJi= D+RWͽ!w'?Z`/njmK hf2j)!f#i qŰ^w#u?aS{ V}Dsl\̣:#"v먩so:9*ة&T0ڱRYbxz9FyUa[7P mDצG= f:Azm S$DW%2b:]E .t[j%b}8ϻ pANy$#+#W\Iՙ?^='vph'=7XM^|e9jE*k<(Vuf Q7A~`뮐wS gs; A5vP^}V8_Vjs}Ag[o긕6VAW\4.׺-]nϳ$l$cb5ށ >?$:ACaBfްdjf8_^|CgYjU'P5ϝZ\ EEn̚PЫ9Rw ׇgޗZ/A yG (ba绀rɁ]Їi6/fwڎS :mw.ݞuqqH~OoD8{L`yb25|g1`>NTGgP|bUH4Һa]WRaq)_Lq &ܩcZ˃ȱ´oA۔z~W(1{n3!$Kc`1w"+8X悱TƌJ̋*.Z63xXqqfP!;n|LPj[HiHnRqVk9OWU0SaC'pٕO4fUr}0Kz/Io_ t9c GK%1yK([>w6.տQa) ׻&9dc4?*b<ڄLR;ut;cI}81,:2>l8śUXͿP-aR\3y,o{B(&K nOOB M<XK)wZW])j β] =F#75#U.`V Jq|KRgHL 앍lB>XHf5X;?⻼spHK޳8Ff^oOz<]}zs(3vѫCw3' n꧈#īN9!@&ÚNUg@7^y,PɞJH8MIdJ#a%G" l%G={󤌭 c6Xnr8.$o?՜Zݴ.x~:"6}bs@AFJ°).ob%{Voކrr.` f XM?to%t8Y%cGcBW[ S X' =ClmgS(:ݯb W_BR0BC8ȅ.OFQr(d$C/9 VΚ[nTLw7Jg!GNՅi@-n'3kh|)q(ԬJOǹ8lDCJX) k 9AGmfy ?_b^m A$=,ĤA2Jm@d+g?|ؒV7omGdqiZ.&mXNk"}g,%nİ}!~= 3lJ '9.zb[Dj]%ycE:ⷩL%Qʦeq;m4QL3P IفK{ns9ᾠ}ܧk8 9*"z~_%|#~T@f5 /;IPsᗍaz\- }+/+Y1sBB O!l0Tooy+r[pm{4V\~hғo@3RlUOVPQ@w0_/v}I[{c$_Y ]7&(#gD>;?r hީzgQG7iVS'htGe~.X3?D(j9z?F$Ň++P@>rN]^y-xY~i/x5^8\1r7F{A3Js=O: ӕBNUH\FYHktĨEaB8DU(}RC26\Qgk =H *?3|8FձY+VWŏx:zn6Pn]͈𞀅 ai3xXa}- +9X޽`  ?a0^Ej϶ohLRqs0'R nz#%6R镴V+;` pS)*NAZs9#r@ZZ$VW! 9LUE"[|ϱAv mEW]2A~ґYOG\^ۢ[|"naaUBDVp2?< (?.fwV9^d+.hrȻ)_-K!-M;[MsΓlrOİ%,ʙլ~<@%m9&R[^$eL$ #[2g$eH\W"F^^+鷽zX@bY` )m4StIPcOG4TޗKx}@F|LW}gfo9%|&5D LJCNj`j`[c'5ahdf2"ژPd6KG=p{҇ݚ&7ۿKD"͡NGU1YjMw+Hԍc~# WPbwxCݗڧ*<9&W/u%V ~9k&.cM:/b!!ixXG.:ο+cwo!%!kaN<z`#dҔ9Ѩ{Uց NfwXː7h\!CoFZ2u4=-\-CG]]}b^ ؜iu\Akm-8ѫMtc'AZI ^ ׹F5#E?AgV<"ŷ2p`@e7\X1?fR΄_rf#RSvK*B8:%e1R="?*J\p$X!w12a,= yj$3곺WQM*˅Uh_=繓R!IkwsO<[w܎F,Ld/& ]+ttis Hc-0MoyÊ ْpq* 0$ЂAH7РumynH7Cx濇7xFAsp)_sr][AW?CrLH[^C1( q2R@ uZp[O3a~5qCa`kE |77XS\M@F/QEXwm휆A˻cT2uv] )o=D.WUlgjxyz:nuhչ^Glp~ 5| oքCD5g YtS ..!oL$=JH&]dWz $t= U_A\럩|\T3U.js{cbpt/mRM |4[6gubn7߽N[itj8ІgZTfi-7**k("{[{sk ׈_Ogo+ 2M)d}Y;Pe}`h٨<˼tu`HsFDV{sM.pNzRwqWk IoR^;?3]uY X/q+-_]+? huJ{9,,kdSr ˨hn |a%Ⱥ_zw&Td+:a+݃gl} *Z$nb;UVϑʫ`)&Mc* lѽmL~R{@h~2]-靗@l"4 gkEt`NsT,RYgOjgF)"ro-4,=:YEKnU==Ķ YhL|Ѭ^fՐn@?h(ܕ`b#`ϣt*u/pE>⽿eԎmt"jvʙ߬,pYؐ[gt tpw$t7pm(aEZ93B,9]1ʵi'W>)γ{^ rcؠyNQw {9VKGA"MsOB)2)4ZLEö cJ^+F2E-6tGw$MvlorwV3@kK;}Q5x (ɂXF#5PЮzr؎4g`84~N$E}QC`.%SۙT y3.k&<,u-.Y j5)$i@ >K'LoL2Su8::+=,L󞃲;p~r[KT4{XS`)<- V/^w&W/++J F%1N_F p.Mݔ@m{ ;jdK` 8,BF\ʹ ,ݞl}@QtgL$ ]okN;)iu l3 '͈鲣^jHQzgzv ~fRDV_0Ðu/c;`#'Lȫ3ҝD6c= ;)+k:HaZyz֊+ xËס*:XB`"3oTWAWlDyEKe;ߝv=*ῄ-Ї|Ƒ%- ڱic1$.!^kfCᾴsDtKvYU-EKjضV]IgGo[fPpOU{APv)}4q?hP{2cYZD9 oe\tk[99gCR;14[$3(QٵnHQ-i5ݳVUz= 6_Utnx)Rw5X3Yb458Lyvt٣ FE ev_7䳏3ֿMb;ܮċI|xM8k+O~fK32f  Ɣke) w h>Hi(?Wy;đ#Eh3,&`f 4Fӽ%$3()ðR)$VQRJ?n Li!d҃dܴG#rױ$&r+KLwk+np/҉[]o {R]Ǻ$_x.PRc ]R_?iS[Euy"DsE(䝨-qs]aR ÌA0";zۯWNAQUәρ4AyiY62C ȣX5(͐t~ۭ \)l)1TXa ziVkf5'魎MT-Ǚnꨰ{3"jnQ_^אԣbV's8ʩ*x~bv,^ #tu0kKc#]O&!eR؊XlJVu),ꠠL%Z4~nqNQƦVw-‚V[j|*-]uBt\k_*w՚%}+]f;0I<.{=1= Lۡ!hQ K4 4J%v#dLVnv4Va>*r 4Ћa&·1 ̈́ M&js񙯶 jJm˧.NecX[gq)K0\KV%T M PFCXWp~rokxuW#Uohz4\ߚ)û~6CDѽV hYܓ̚o0)B1/ѫB|0od2,u#r$qgvWo9Wtd $ 봃u4_O'Xh:A#ScNo1ul." )ZosT1/t0?lݷuCH3:kKmզ-$,OT |1K46;ӞQ7P~iBBBm6j̀cغ(?NNsãh9}U:(;jؓyUgC 2ܵX͟^~Eg܎I15XtQ߰GuxJzt6ǔVGh5ݫʵFA0=g6rIOJW%L4A=􃛆sY~PU|[fcғbG-cGs :$8-e$Ҕdufϝ:\^UrWosP Y7Sc~PH˷Pbxqױ)F_`iks/@4)!/@ +0*ˇK +͚KbzF,k]Q.zKCj Kz8TaCǰvO~atGmOV_Km_'x,_3XYWhK!8=ݧvLRWgSWjޔB'\t >=TM^F?ͣ!>++·jѹe=b@wh(W֙^d@1 S:~aJ=XbSo(PUV:1,!Q ìZHLh<ޡjdH35 ՙѽ!X{o":pK"w ,~0[_2{ d-%Fg2ѾvSF%SuQg5a)PZ gpr2z׈Ԡ]9V]8?^f{?qݙqEP$/.&f ZAk&إb1tkRPjm[ !-`lmW/Ya4cnJ$#*Z†eM# 1.-# v8V)1lVfcT{ЉRv{.jɀ*8P]`^Xҙ5,H'27$WѼΥ{jlNְZp%X۳=MtZ=iSGNGȎ`kzѮ1+!Lo*  U,16GJ r\QU0poyJ ?/i?_=<_u,tߩgs0f7:'p %*E0ub+,wU KZ=4+ڊwn%]vA$Y>KA?T, JI(M$1pK#xZc_tbh=5h6k̑$>lAfo !!zXC>ɱJ;X'dY+&N=SYttczeqnWmw_':BƬjE!XkFOpb8(G-4Pb.q :}vp˾xFUw 9h [B'tfeq"c͚GD^"ò1jن'J /d\kܞбԓb R5nqu-noq@R*p ߳٭k\aqѵ!ggW3:V=)S>3NرO3?PcuȩXi&q +\_5q"v-QG~mH{н6.-W3^JlpC\tL%%< gJmQeOC>$ng a{& Ը؏Wnco|8@szh7H/݋F4 5! ZKqc~Ыg@ąa Ʀ~WOy+7hs+ PO, ! -.a )kORs1S r?\pRZM12O*ⶣE^B_?'i&wj6vlzݚǥCdqQ5 >7A<zErŅ"C{:גΩbŢl+ͻNBڵ Io;\Զh+&9&c8L,y\ꞐbC asǮ`( ZE7w[AF "Ǯy'3Rp_,G7U'R0WvoZ*h!jB$w Z2bf4O! t5o `cX>o%:{ fJjyN/|Ƈ-wp^1vL۵ ơ499oj;0٦ω9{&n-V +zWYwϫ`;U_v$V ;y>wtw #Ca&z_z'f Ӹ*zǭzF,!ncg6 ,C̽M:Ķ gbEz M*b x77B~~qP<?DaUT'yb AЄ<;xMu9FcPjnnn]hBpum"*K8zU!7?&v'g /o_ gO$tA";EA" 6R۠+ %jp|_զ.?Y+;d%jLx,fNW+/ 攝, g? I}VJ~qw_hm nieM; L~jL<z_h{{^yIbXHhP(.^7@wOI<l.Nx%;!sU҈bVܳ%CiCoNs画n5=X 0."@n+rT2L%Nռ"fq&9di!PSIduoɡXX&6IcR_@ Szn28Y}ZU͹VL-)nzڈ>TbiU]lƓŽ;n͟:z,#_$R8,iXf{EsM6$G76o5P%=NK;9xk*`k.ºՇ9 r+Q[}o#Ś^y|;cXʅ0IFVIsŏIbc!8t}k*SܧrU`=%(5I}6Og , u-8$ q#L6rnpPp$S&%1ih 0(:fל@ʜܫعy=OorMYʥ`+u!Zi_w{rVŒ55z򅵇Xֱmڅ*w }o%c5h4_݈prFRh{ЯեTâ K\aء<]yW3BWjs! +UIŚG A+oɵ{EougSB=ywnNdIR.uvC]C$kC"tW4۱'z^T,q?iCJCYlRjD]twWf(K.POF": *Aqp+cW!yNrrP@`[m7vXFuv`#W(u^5~w AvpЕRKKuB\ϒHkK}ض|2((jxut0V&2VljArEzetV-qE H_QB쨻{H$|c_Gelq>  Հ`$u Y$TN sScV].(x {Y}~Vɴk9'iOpbXgLnu Ձ':n'|cK tԈӧx~,z>՘U8Epm~4p:Waftσ(5덅eDg$ m{zX3b^Q~? .jQЍau/@h(aBpH-篸c3WX v6ReTp=ن*hkpr.~sI*R22ll9AjkCӀ,Fw?^l@ n8;3(U}xzИ-(dz偒1Qɻ}G{tB PAa/L(0XW=n0% K\%ad>VaҽX{j?ca')y8ALi (Sw/Qƽ*Vʷ ™P:h‘q|')v>oh\*kqLWt> }8lc8Wwkz6#͝f) TXp'пrI\^Efc(z5lҿ5"0 *yts]KPO1Ҏv5&u>*/0k0 c;bGOg-dx#6nؗSRϸb9PHz$*+oFej# [c+OFǙ[abY&B«Zc #& k̑ ?tUr/L CTrD-e ij3uZ4eNbqWtѫi&P8O y{W )]<`SՆl@O@ξIֹ2YSbCs 9\zB+2pm5Z0YMOl&#oF$Sk`V2j2!xҟGw h/Z6J0dx41C{sk涵Dr۱4&,Ek `QI/xfȸ-YΔ50_`H.uL 'J1O,/a]Q,{AtRKXUUtp?e˕GΚYt/{'"B?AKA>7C. a NM:`A}cusY(~4Q *;W{ps^oV iUG+QZHj* m"l,s^|_ӛ]U맏5 0°h `,d"J=K, =:V5vKҎ _i* R*ɀu0xK E{9=6RZ&,UGV*o9 7q=ޫ&kUX`p  P)4Kk~a9V_q#*Z*|@u15 =mƃOW Λ O$-f3n&f[ӫೆLp0R.'綃|Goy/)-hK#[-'n׏Bsn=x a]^w3+$ަ" n:2!ufBy kk6`U k2Nzk+QxwH?,Z9yVQ°`-D:u+bGX݆FpacatxP)L"n^tcgo&[n߼F50dZ9tOw1FO+qaW&T άE&l Hr@3fqerQ/h4#]7W- J/W)H{uzWY6tHrT:ѫuZgLvoMxdߣځiS\̋I'g5/Ԣi[`'#} 2vʭ H91gV/?wk?_V5{kٳL}ABWMdSP+LDOr("H)j3=CS챝NU]{:`,X%Ju vT'jfnQA^85ÒQl )'+B۫^-YV{JR5nk1~8'4dX'l-C`3U=]$!#$&;g Ew=%j1*fܿL!Ԋmnz:9Mu[țR \R7A H8c~{zT:N6yL"k`_/E}D6Yai`0/a;[bdRHUuyO^+FxKט̆g w8$K\k'*ve~ IJ[;z19^AG]"=]!x!-jg:9)t26uFˌ^D- 0޵w=< Ib&DzޘS@fK(#AaRoo^5(\->b{HnqMKה݋~l;lx>ڴkK`t)YjMbgKg՘kJI.2 +;kWliܫ 4hД}h4h7ljݙX c NH*Nh62,miW3IY}g|3qlļ΁ÿFI(HKQ{b1.ϊ}°mxkq5)-k A4㶴-*%tD8zqeٚ~MR-j”˙:lC{=+)/qK茼H+.EՏ(jwZb!(ˋqkrJO?{fAqDF ו؋Iǡܦx*&aX`,]\LE^'a)vr<<}::>r\ ǴUӳ2^ t+r5n :ZGRbG6|5);^gwai?ųD$ueL;=V nr|8b)̒}ֆWYhŌ|;mvol3͔:+56 7qfdH İݗ ;6ijt jod9aKi ^fgrYT)BamS&r92b8aOLr9M SPZ?7KW°\:jѲð&[Gu!L[ٺjTT[\˩9fT<¨RYv,oڌӽhKG#tl4-똖ÄmtUB%>ŏ BTr(dw:&VIl>Io.zO9= Ek0,<3#r5~VeDf}7-,-Og&rwiafV) 2Z/]@dsOO~b[#Yuj2*BJt-L%9V]z)o^cJz]طLm \f6shBh6aLǸ0--QQa;ws2<5cA{抎i>KӌgZUpՄ'BF )trw2űdoYAITh^s3J?@? UҘ.6@)F4|nV%EclHkYߘ3yŗxҲ>?W1OF h+H9y+9s*3$yk>.$ ]*%=Pa!gy09K=?aN <$ j wf6|Ah\ =׬o`2`WIKXzem\}1IGx?u1!haXb׳ I \8gG|t\(C QbSm: }*b>#FM*w o);Rl5&!jx! Vg q.9ʩHs̽?}jdug0PZw`XEaR󊩳DRЫy~ڣW}W#k" 2B@eJEI` g]AvF3Ɍ7oNڟRrnܑ<~(#E֟2t.g*GLwodTO&(F_MOgEq*)GyI; !8wFǽiW8?{ssժEpwhu,up^]GilS\>H҆ZOTG %lv S1^ϗ > D]#'FU&o7@\z^T8?b?{s0wLx5 BKޜW:&^ѫ  tꞏ~'\9W&4R|V-v}S'4́ҝ U[^IdX}>DG*g#i֢wQ6 'vZcQCTF<S;1xo^ k89+Bup (2vs%d6u+: \W^*ܖs_ZJ FGD=+κ/8%7-冖}z#J>`'[蛜6#g53ƽko wGAry2D'j_iщ^抃T엌8%D/2[obK+-/ƅ<ȓNwb>t5"?hі$ P5p5b 1e{Wir89q,axbbO%.7!#1帬/65=2)Dj}=.y4."fgTeE"^FbJmOE}xƺGYax R8it9M;Cj [adCFl@k}cʛ{"KwVC}S -OWm_ ݛ- ;mno`ƼJp+{Y'l+z eWJYte+$5X[ (bgOe<ѯیmpE՞vt+M[&V{Y;(zWDe[p3z_CIwu'K!aeRbeYWQ3hl )},zON9DXe3~O8pays?Jvm4ޣưU|@;P.ma=MYM>"S9((jӐuM({O+UJ,/V𜪇WVi-$j r $I^*Expi+Ah*>S˕܁`unwy~sMԙi VSlhvTlp3(z3Y3dό q"^F@5@,!L=HctA AB_ F[Ԁh.gլB3Tn(-˺(VsfژA4JTJA_WM:_WBʕ9 ~85wu2X[}STÿύzz/`%P얃e=bn!Pǣiw8sAU`Xy-0T@gN 2\ubUs犊MZΣlgyYG1мL'OưAzHc'.H~/ B_EO4p=g .d&z=̌ 0cL, ..''YmR1`sI#_wůqQpQp^*}\.iځ…*Zm/7Ājd\)t 㺭Tr-E VۓpL_M/pnqGOK9Y`VO<  yڞ7 ng!XQNYHuˆأktH ߼wO9/2W < ~!;JtugJy J- ;mIJ>t'*'zV]5rzUqXio̶0QMn(%*9q<\eYV8HUv !C,qoI'#Ϸxqn%#ܑ{ ~ݚ`כp{ғpƲ%ܸmTeΦlNlX;yhS\ꭿ=F s/ $ ;R $.lbJW4Ek^[˛XulD'szK+U쫜>=B\H_Sm(2|3q~@{dWwbT7 gvXĴ:$Ʀckawk%X'O3>Z4/eЦ%1S=N[ `6&o=ŹT-N и{Q\wNTcH}S)Ln_r#'(Zܢ E#ͯ/sVJ=tJݮ$,{hw@Wa ~@5u_%+vI_4E}Zn-R(ޘ}6͏+)=9?j,n5J fIvmUU"yUW"{RUnw/141z G Ӯx$d_?!+/ߝIRAͷՑeo]A ٦ yX(::ɰv@W>'l`o?WlI_(R ջR4nceTI| MD̙:SI[՝e, v nR)"KXc|?!]G(:V^Oi@oIQ<"bZVާ4SܬAܸ୻ڲ3`8AMﳜj.N^ogifDep3֠,GBBwh¹/' #n;^Yai>eX̥HYm}Jxlu{E{Ҭ:OQ na[ڮfKA{AIS a,( vr~R6V9p@,y0oؽJR.D[Izws*<,H?Atb)SJ͵~{S 9?hr6!;^0&Az-Ech=g 0tKV^& -S%>/["*<lFHDN9,j?T-URΛ Bd><H!@}h>Ԓ_9Y9,Y\xy*=zrjM$Y9hÈa9É*}HeCA]#?E ,-wXFk'^-s7v'E"HQᝐ 4{ Y҆ic(KzhJaJGV:)Ĕ$zVPlxxTBd-4ɚ>49Ҷ`/AjlZ#ڎH'Sa 1/ﻅ嶿D/Ç5?nwu\7֝HZΙ B^Ҩ m5Z`)@L:Pq@8Ro꧖`7xQ(7n*){Mngm;cMc9Onf9ц/Ty؇q?a|eQW۴!ft<%񊶤GجXUdtJJ -;Zm0:2Y ӖyWQgbFGe^a+6~wã6N(PN~'] r־S69ν'ش/s}'BzxHLP[ /_%-W۫1E@j+O:ycRxOΒ0*d ȍMrӔ 3+Csf 4RӺqhlqyEX䣗zjS ]B+mnALRZ~KfdZ½cCwf1tR3s(J\3&I5zO/1v'lŴmO\^phgp ZnFRr1-.7' ɕa`[_U ZTEk?mr!0t3`ޯw*~g"{9+ȴ/~(Rv)pO'' ng,Yu1ev o³~I63 h{5RW-ߪ:8Yqro)ܒ<E^M};ǎ~%fF"Bg: Uq0XȣĂsk߫4~,FLNN `Te-@wUī^ߊ&- .'œZZၴ1 [ٚv/Ю}{)?$J$1MWca>2` C ӥZYSڍ|#]X~X8GJm,bS:<}E| ӽ;:։3:|0P% bvdK`-CQƲz t/wtL}\hf*m_Ǧ:MU׹, P)f}xۻWm% +};4zS:S-!X>󳁻@WRA0,$cMBv!%9Ki1 <۬zbz r~Uo YKx0e#>6ڵ {."4CK"w|m% #|@,cm~+5 `&X)JgFJY}s$e/Rڴf?&VyZG'w,\gY{4l^1Z99'b f!}.&\2V֚- lAe'!Whw cYW:ge whJؙuew_X`[a7(Wb5 S-3/.^v %J-UKUjC XW!`9vQ9ѣpcCWs\SnrFpFy#J9jqَP{Gzr( lۛS`X=N 5 oUV M)Ц>|ΕظussDf~,|*uZ`޽&^l\s0"f'GvśAW3\O8Eu.ďfOffs$) dvNA-|B䙋wp\jYrq%*x;OZa)~,c*bܑaUg;V83F>>AwCV򩭘s(E 镞xL^ŠV6T~WN2LgAd~~g+DI;T*^*G/dteS8 ::K'yѫb +Uvdlvi~,HxpEѫvzWǿIİ,ڒ RrH~M_%R%e7'OvKD#yYYW;+IiX6Z~{`ڼ c]+%xbRb<̓`cxeqg C9Ttзz7s n+&*7)2pvjQ{_4^M K =C$_i$ayS7h ]]*lWý8"F0ySͺ2Sg6UIah<=p;m&zbް$"j#GIFk/|~lM( mz-*,vxGt9޼=2+{_KhĿ[6_$~oVcNo ijC4zU9WYN +>Yl= IݟCr u:ai98ɰ~l͵^!\2|p{Hj~CL#a|6LP]8|-68a?y5Ht`CP}dxItEБ?2?[ܟы[ MrALI)K.!jëd SJ–9u/yu#[8y0?2Ʈж-RUz󰬴RD|Cg;9)+8c`4WTf$_tCk6zE&! R?Tjl8n ]JLDa0, ԍE>o&V_i*\lVgQa=` Յ[+oIUk6=a ̶kL)΍ЌtlʦFnȦG+y+շ3-]2uEvWs|*x;f8䕘}5a1]ڳjzOLeZ)`l)B c=!#V$'SgvGkW5'ԷX~+u l+[AeR <0vWŶ]Hr6_C!:?gλ*+ \A)x掄h;$^ßlF"3ECE/\93Z5GZt+7zU.519æj`w+Mj[(DZϖӿ#$k=p1 UHA9'PO {4V(H5"؆~oЕ}22J-=OF@VI5xXPB󐺍+Oehy}+k!%J1Ȃɔ`=Ū+˛eB:"!zL1?OAS^XAVUf[}b&SN!zghBλj T^/ɗxW?2`輊up **VEjqVyF=?f4n-]}`Ez]8ޮ64=ʕU kcJ,NBdP 0+sWUR/YENΪ"BظgŰ/Jg}1Rx=Ţr[Z%g\jjמc+eNb+SLQ~`"I 9B  ?4/ 9 8T$ϫncIF@IT)~-mhnUE-ZcmAbc0o%ܱq5*9 9S&+AtmUjS,ZőDW7RsYrk#bR)[)& m6 yRvncgSΟ*x`es{NW=7^^ΌNaXP@m5o+!tX 2Tj YԽJ6V105lrg">&cdNM ǧ\OK;nEC_(]@QI:΋L#t-0F{+E]{`\' xw]5꧊2G` !EȧC{@ `9Փ6^ ~&qݕ] !v66|h%-zm|i }xSNT;@.XhR0%qH4Y&fB6V}Ƃڞ'4]^ JַWp+JF.ч[@Fj7QMnU: J|S1{59v$Kq1#N~Mϰ,>h8eS^Ga w9ЉV 捼h˛_aunW\a($XHOn(eI1muu4zŖ1@mMKBhQB+D5c7f%%ne6vxNJ%f%>'Bґ7ʑn3菐=v1 ZPE`a̜:{V{$SMmh杈-r=` V11tN Z)&P:FFVntv+PB'.[jcI*ֻcX,J3JŐ/n`e ر,Ҭ1}S5NV&[5=KóvV' jJ+wMdvoz !|z-°6FjR H~r0yzJu`S!%sC>թ;{zx 0jOiI6"g\Hs32 ޻ɑmUfN^[@]j#Hݍ@$bB*a9 xly aX7V-+Ω)(j|2kA,[-O)ݍ^yt%x|+ .nĎ;o1t{d/ $Ի|RưZdX-E妊|jjqW]Ku8V-;Z}6ViY(1;C&2I_̘զDOZ)j6̠,n+RC#t3^v *sDL %^8o`{URڋ=?Ÿ b#{I R EgUJCq9X]uQ\U_\TZ4|!u?_wQa0a51 b/p̰ـ;Q`nU1Bڝ-~(*zL:#q,H([; ' J#97`W!3yps?XeQ. 8Ղ>"rAu>k]u- اѺM%T2=\WFۈ2\5fF"HPRF$g>HB63b.&BnAP\kSаR6$Y{o塶2J:*hL慓K+ZdvWӘ[bCф̈́,xxHzD#XKw”g%c){aPm,ѷ#Q+Bh7 ~;^EUO{d)qh]-aɞTOc-Ldv+ڋ#۪5iw>:{{_xL>{ ybh^G]wI2:udHxpvAySYP~䕐R6x.0lNɦP*Dأ<`زDC^@qupy bκ `wĕGV,`yVuaKJ|!N ؛fQ/r@1$,C{F YGMF*eƈX}uw̻@qUq7!ȸR2dwĂjRj\PPROJ! cyh28:>3'd\2Pk~hϖU]x*@c5Jbx[j=}ch :NՇVRvUw 76plaLz @ؽ4=?Bf3#}y;!ZFם,Q !kU{μUuq\Y',NlSXWbc95\=)E$,Y-ysإT5s&?= Ll3Vg͟tR 5|7+uטr5LRY0fC,@5C\+0lO2,Ru#Da;Pf ɓv@kҌ$r]5Jvǘ*zi k~ xխ!˴JF;n^ $-kYyƉ}XF`[@W_a-(J at4=hJXK .܊Ue[{AWFlqnbv(n#7yư/ /ڹ20=j9aVF'LƟp삚kOHZU%JJ˾|/=/JDh6jc)W8f$kORnꙪf*wPUk譶)-Ewp G+_s W42MNQS~ f΂\`eU\M@tm&ܺXW,!X"Dg OQ7MQ; כ%{{@x&kHt(װք}o&cpHJAQRºlHEF]5m) 餁v<* [.TЛrΤ>2<9"6) }wTOP!0`ص,O:'|O^}]MGm`(_Eޜ0r:ss]gppȦفpoL{Ush;ʼgkf7NKYhKzɻۍ:wZzf:liy&%E,sS[4y>H |Nb^;fi Etff)0Kp%&NO*7`}eA]*',}5knS}d^SR[R,]qAY.]A~>"m?5mΊ_mG\16?x bg~ηbT/ݽ/s. 93cLA"OJ2o=LLk:ٻ%C0-mM`" x,ppߛ oH0B 0ʇe0K)2<)Jgfu;{7h]4uwX5}GD/mƾGi*;g5? ǻͻgef4lcxb=fх}'VR8 vS1WHKR( dhK^Uw3wur]V Oq4yPr,Bքt˥I64N1T?/ (R\* yaɳl KJ¾ݵI `*gdULJ/cN.JB V/?.AE˹\+/#E_6 l"ΉY 0VTfs:~PP ضΏS6FÆG?ёZǀٮyU#H[&dJК9pt2ӼY^O%)#0-Lμ۠LY|psz,g6N?x2I1AhD__N*8#0ðzV3ʒq* OaI1^ͷ*IaqeFZ2Ms#W:E̐|^bk< 1OteK!|A3@6㏭u6q A&JoPkbXҟc4S')NtB[џGH [ia $ E]Gk,F= a hJP!Jz2FXL ޟ1`U='oCkE-Oyͪ|a eO%K C0z"qM]khÛ)H}(köuGJ+/xjw 5U1Kjٛztе QJ>&ՙNnageymYӹ@9wہ*r0ۆX MmN%N94_ƍƆ-GîF]a+RtCr$j{. 6` MĀvg;n[&ǨynN}1$\x1{a ,Edd` A[f5gCԂDk >$CZĴ@ɮ^s#Zm2~MPܪCaOXY9:7PF [j zMt^d<7h%r6I#~ RHȒ54tJFlkyOb NJM2od JY䛗8e|?".Qs0(ӊQ2lNaOVȎ+ Ib]I!p'nP"8pvjBa(vp u ;0EAq1nIKM zf#8Ʈ>avwaXkbZ0t LN5R(Nߙ媼6,oaNjϗ9xJF6i&;ĭw Qo,֕=0V4^.]DۣmP+ڧ~:ϕbT}U *Li6UBVG]p&{#2&uEȚQ?"1z{/lOVY猋=mx0Wk?5*GlKϒḤ'T GІ= GI9G({ lr6)wΌB%6+{)1 ׈$SbViM t1 iUIZK]f0VLa)c xѺ'+Zdd|4! [O[iSR3Su. >`$0s(#]/o/H9 (7:rnJq$#o_ ]UXUFaHaʼk,=t4=ph*g)0%* ޽^P"1 j ̻ y}"g)1 u>5da;7^ʨG/!5νVj-t r߈0z7\ǃPD0{3fB0`) -6zYfȞ֤ؒB%-ęcK}F<?<ՙ5˿.̛!+K9s̪uq"0-zqo4p߫R\ ?" ǹiC:~՗yX5U!*FտuadMi3KD\Loø%ˑ;Qʕ8&14H0K7ˬ&'~e!l榴-3q8np:qNh7uzI]naɡ=r_(wJϣIǭAIQiV1NhyWǣ\iCX:+B?p5.\芵GO4D(Xz{>IniAEjx@|Aq'NxViEP;鈡4Ό}sҸƬ4W2Z,i TKY]Pz%\ss6> sà 4~oy&]ʥ\d側E5=g;XF7\ඞɸitކ3h@txh!VOيVz''ԪWڬ(ndChUv ;2lDz{Чn%ZfWǜ~pĢN'+'egX.zݦoL5޶0˾5^e}N9ֱiI `]ll ҽ!C]b7 n|pe\̷H1]6BM;n>E؃0.:ν?.ѭQgWx|z~*Uo 'WlLD[z֙fm^ O9sz:UPsPxBn( qAdafF/z"y:B% Ƃ|X)]g[P]R#ʌT46V̩vVӴpd\)aVj2/7t7ZM6(i)σi k&ƪiۮ|Wā@ `d|InѕJO;Wp͋Vtn"`1f;^ !dRw|/O7Rj˷ ]݇=ae<+jp:cpkN38)[C3C*EoGiTD[J[W@.Q_crm$ON}B°ZWZ0,(aleݯbP*m-#05SB[B(Ɔ$jpsiJ%uEqC' 3O=r-,p4UyU_]ۢ@8 ]ZXW's+ytvyZ]N@ D e] ?9W (]U*!O$S1 l,ʽ,F;GhtKh!6$1':ulI.Al tr?;i9~`P+{ vZsMELRzf ۷@M'YiVŽmɳamYafObUY7wٹ5s붠|LJm-av.}5?Ʌܨ0J.3GFwQ5R/JL]ʴj2GG' `?{437PNzH[ή}&h#?Ē}<0td{eeaĩO|t!gZaoB7!p~TmJg%N;]s b tY4S1r%<$Na)  .#@l֫ Vs7ph/p=oO X2~;pyٕEWXE'pvxGӽނteg8OPg>|:ɺltnuWW;I NY$QEi!wtAgrb9^Ѽ}eq(9fO[mj^xceOԔ7WoS_@(HZ`VB^uLI׀BS&_C]?Xʮ;ͣp[~/&x:bT}&o k[lw uVv!Z:J"nh=CO3^(to7X̡}G}lswXU'w.eW㩎C:bR@_~a\^ݜtށcӹ{үQVdSr3ɶKon@~=(|,* ]IaChE)t54-20,K~8N#߼sü>srYZiXB1Tؖ2rGcoH?!Ut?#quL$$ Ȟf( nw@|+vZa h} JɱwSQ:a`*Bd R9ٗ*04W{} [G"Zd.e)PM+)W9*396eWv1{CdjoEYY+'V)>)W$9|t52}~7 an'* ])@h>V0>?w)0t3[mן/@Ma?WBA5UQˑJ9P8X0Gav(hFt6S"MH, o t)#_q/}o j('F /)ISCިj3# ;vl[w[aCT}tj2`V~_<Þ^ B b#d " \{o dUe|S|:9U-Θ*u1?ghf݉`[NL~CR1sitp7P6v&nXsvTOفJ,s 2 xm|>>=S;ty| I<^O9enδ )}U4 i\?i~b,ek^KKݙuŖ)EWao@˗]u` 5JQcUOMH@ܘ/&קnsn7A 0gbnh4~ino;94! OAކ3Uˣ\ sddK_Kh,G+ZnߓjѽUr;b|q~*ǀ﹧%uaU+rcQDBDHƒP)8 3%gT(\U31t&S\m` m&CNG*\xq,O& rDιWxc_9{oRґ-%<y ^ŲQ,ʹ[i]ېO\JּV\-bŹk􅳔r<>Иx=,&-|yp4`cC=_]_Ntųf{y<:$s b1҉ܿ3TAl^Y4:0 GYr}+i0LﻐQ!ۂUx,8 |ʪjs,ꅰ̷^*k3N?/zCZV~t-sbj0QJQ q#c&-x,e ,yZP:Hk9'=!,i9L#1ָ Ǖ~_KYã-\?yz3UN1kbƪ<`nωDUu}GY ;0"0~Hq|o&f5Ny^c?ʤOI^<_"Xi>Wr0Փ+X$0C݌̫Ċx3g1V_˧ct5G iB?qZdj JT3€&O\NO6Lh4օ[?#b{<'f>GX?-.XFG/\5913|xǴ*:i2SxyS+Lɚ# /JRVxǛ'9k S њSeZ!/1w\֎L `:"Yg?&7K5X13Q1K2;b]d=CW1B+ŕIk1"X|ޥʒA_BAֱ1*Υ_,ƆYrBpl.$+22+ϥCL6S=دbwqpQdXTk%9$.jJڗVq.M-9KjSsڳƔ 1O:ϡ'n+U? ,;HN?rZ{`Kʆy-`תQ""V!*w_\:\YZYv&Ƒ l ]5w{vGc?&Yi`XL#͜(:Mq:sd%)pxzpǁ DV+r73| obٛy)jwQd[qU9%c}׋ ؐ}cǼ9pbg䳻fW Yء i;:o(cvOP;C~-: *ZG)~Zrj&֜UN2wTLN!Ԁ~Kse-2ƹ6 *~V,vl@w]ٛ#I%>@>Y&&˱ KTPƧ;pAߓ$~q `ɠ|פzLGV*Dot,Vn74* *?R:}dV$_YaU>lCƊuk2g{vh=@n8JS-%lwmiyoY O.|\VΘr z7O檥Y"n1%,TǗ].EA/NFߝ2)l=}rXhM1~ۜN2Q[S[^3\µUfއ ?u˴ka/ aiEݨP =͑{Nk6%_:b۟ %xcp5Ef&yF?ﳬgOI|F׶QA$!0?gN!ts Ԍ@gVwV)Y!Ez?j[bDa4gc=Q 5d +q!ނ*nu!YYgSGsR Q]m^$zjꆷwҙMI Y5B-xyXIN߰L.8ʰ>ˌ: &:=w*:?$MqܪtS]b[ZS-ʧy|jupŮ)php`aǛU,X58 V/ 0e@hqLݳ80|ɪJ;(,hLUjEy:7 &盯.1k[εn9n+>+6=R[!![`Y8U om< ;`BحWXBJ㬅<3dզ4 ~0*لGo"K59':wsUnw/|/Gz˓ToK~hB^r,7p^MᦁOUXr?cś6I]2k`-WHµ>* iy֡TFWyݒՏf)jxϴ Ԓɏ%Z]- b\Z.riXa xNUĨt<H/7Nۧ“Y !X[R6˜8rMZcyg_*O YKiڔQґ؛$bMK+ HOں 7;2uվzŨݐI pxdMxѽܼW֘ XSF$g/`Mtke!;~. ]{}ġܢo5֘aPj#SZC O!{ܼh~Y.uv@oAB1kXʁ$9I;Q(m>M IeY/ҴRsqŀ "Qi3[\c5aņ(CQc$UEhk|3k= LO5]˒ Ǎ,V90p{vN{,ؼ \Z5>]t .є+K׀Ğ-B,k1qݤMN,Bx\Ӈj޶ k4F4@P_@~I:T,ߝ-{-3IsQ-ą[-nlKF okᆱ{Rf7fcC LZy)c,6Qֳ4·7`k,Geg0ˑCgH2J$O0Qw˓Yc5X!W l()>Bz\$t716׾̵37#|fJ&onĩj437!ʸ3iD|\ ?00}B&Rkk|L =R#9Q,sh9f5z;NOzy~3g k*e 7Din ȅUD'KyO `#[PN;?;}5eKb?c6]U`^+F:kk1œ}5o+㛬Tg|,y iBp8Z (({Yi,@AoT$z1G4j7X I|a/OĢ/Xc# N)|Eu|-"_8e ,k)<5- &7o^+D5׍G k=1$ksEEUDj=cX?cl C k LeXnP̻Ư®xu٤bs8a?R^EG3 Ka3WY5!.31뵜Uoxnq ]G#aara:<ٲh"zx6-xd[df6,_+vw_w1]U4-{n3>Kd]r/D{3Ujm^GћUS\R~Eҡ$^$xU+IHgf݋n&/̯o˥yk~텫$7o ,̈{TѽN/as6] ?MINυ i')9 |T,7@ *`+(<)HFHN_L;Kq&Իp#,i Z˚>XkˇXxL׎?6KpVI;ϼ)OO\5n.;v9.kpmk]MX+ڙdYZ*}哼ïu?Za0ӖrNYUg/N,}e0e>|5pyʆ 3nU׬CGާe_1i}%// üZ*O.r~kՂkGL_btnoewQ [V:!MKM\I>U`pMu+W~?jIr*Fs`kBPU08٫<>5]DAcho.kG_ehOv?,zKLeE ?%dwZXci+WQǟi?DEЫw5K?]J>@EaSBP-R;&<p-|єT7#8?s5%j|(|Nh }: :C S9nuZeK?;<_sʡHFQ9; x^cRk9pcdsecc:LZ!X;@Wk1.U{uc+IKlC ~-aAO^Nko7n `qgNdG!fvW+Dqk4̓b"e N. 䕾PC t@7x~Ǽkq;k4tHEd=ttlDǯ[/p5֘gp57͚`fO,u }奬kyPjZnN1[U)W\c5+Ll,Ey"vu6CrJE sD*sk/WXA^sw/?؜WAWHp5x K_gh5aii :qsMZ[kdK$ܧq8*NۯݵXc5XcqG7e%Qk/6"ҚqoA"VTy\]Xc5X#}ZΎ5XcwGm@@['$sˠ5VYZ[:$kc߲Zy-2x}|:!x{z'80*]*xmzZr-LK$gwo޸*({#GOwَϲAK=>3gsßl ΎIv'n!r&>;j,9e$+p5_95@? -5PS7,DS'jN=ѐ@_KX|)T QOdRhY {=ݟ `78yy 4BeF{5'X{e\D"2ge4*/8 B `E?]6J {Z-CzZ= 2pw|7DSq/+\g:;zpL^ *^e@Y;+ٲ^>Dn`U,Ct0ȹ^N^6Q|(&`7m3PeYmUUG~-X}aׁN&jԟ2?%0nq{F`yjk+>-涵`&}wj 0$5ٵDWKW5-m s.v]Kev8aU?m]>,7ܲ&R_eo^b9moO!lԪyIL 07oti"{о XsJ3'̞ kr+(m A g2WUVe`z,ߨ+j |&zCWrw`pK7x ]@2XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`M@4XD`/aP;M\IENDB`./plugins/cubeaddon/images/compizcap.png0000644000004100000410000020724613246301623020623 0ustar www-datawww-dataPNG  IHDRXXfmIDATxyY~}/o41f8C$$E$Ca;l1B²,aC+HJuKB!RRPZ\\΍fwWU~#3^fe]]](TuUuWuuV~B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!F% 2H8"E!.QħR|S,`BTh3*IОTc@@C)e  !i XXt\ E!媄=O*?U{"a6=rUt梈",B!')W 'REREi¬`iFEo5]ٟ$"'P! K,HYbeuS7% ꄂE!$*!{[%G:ɖ/ZE}ѫ")ʶeZU^ԕR5nE!dUF~Q{%sJVʦ WQ﫤hQD DT!`BD_ Ѫdu~ yeD<~uh%b;tlBJ(XBD~W%LgP*!+bU< J|" w5O"#U Vc0E(XB:D Um3iLU2cuXu5>+/ŘDEhXPp3!H+QiD3HVr/a%x<P@jx_g/ս5R- #X2uq:D%Ur)J\e+d,? ^gbUs]E>Z~-W"l>J(X2I:}{U;UQ$z)DVd O:PrB",B#$=~:De/gKWR>S Sy}B\%\3+d ]0?#"L !DIQm$ʿMwFԶ )pO$/veW~2g8[^EVz0(A~ϼIwxB(Xr"uy-J];VV]7뉕SQȐ߄C*T27*%B",BDF]\I:uP剕?(y/Tyٺ8k.i\ZQ+C/"}q:Te ۳VEDBB"P&R9T$R@"XLU~C9VpVPZZ z؛9+ZusI7`B(QIQ7$A$*{ [yuweߺFj(rZ) (@*03^\ڭ닳Wc3rw7xxm-B"P+QE2uTzKwٺH~NTRmXY3N]v9@'hBPL0SdrݦNS7n\:,Cz_n DKg@"GiBȨq$d;TXy+U{swnCV֬S䕊m-҈RJ 3%l9,yUE6m5}Vdi.x 3_\]QDۻ}Q?,q)˔,B"LDuq..ϋVN_Pk5#HuX+ _$Rq4K^HJ-×^A84 NJ/=}y^>]~+'U v,`BFB#N(`sj;[sպ5kݚ&"gREJJ݆mi+IJ,kKAEѪ 85N N?f:cZ)Tu_;?zdxuRph !$Hq^ǚ]`ǭH!aiA|9$NUmQt A"ND%UH)OwҌLp2U  Nc6#Z"3Ϭ/S_~&@EP!#/QJOX|nOqP u'Zr]:KT(u-*~}@LG"R_+`0{˪4D#np/Dh |E}ѫ /{rD|`ByK'9P\]~XWս֌TCj'#GS "SyUjfۅXڏ`%ߣf0]fJd a,XI$[_|uv 6fuZ2WQlu'N}-9E )Z,BtԨr^ѧ{n}&՚UU#X3N\:oDyr4* SS.LTʋbik4giXNw7hF8mWpB`L71u49D+Y:#VtѺ3sVJ/)|wYU-BOldVŃƅS}͵9̓-_ R(XuT*R3o/FzH8TȚuA'MF|TW?'Q l+ Am q? *̦ U&=3a6g-jƦd*k"wvۯoFrv .%Y +0"x"\\x[+ T+D:6+3hiW.?.bWx DDB/+DEbsqy o@5TSIDƵ|+yߵf,2I:}޲{5oUZHT(0% 5..&GO5׺)B  T'ʮT5V*V#^rJ/k#(HGB vެ܅O" H1\?eJ#R̕>gߋEJ)Xd %t=e;;ACD #UT:TrM\!no ,9hQ[~QSyP~ шWMPP4[w=zbI\`"Xw+_y/JI`ڬTlkVm~z1լ4+-?g_{ҙ}toV_Y)U(HD&\Pw̙{^ zɆX IUYQN  */)&6msPhO1 5yqXe$d}zQ\j 6:vF^,_AknQ3BUę~ 7\3)5+uQa3:+heYE]␂5Iz:܉-.g=Pu٨|:xj ~^sHTǍ5l*w"q]D'?6P:m[x~*E+J[r}Gyv!³kѪ~t@uQ#-Qo?7C'QN0۵ƈ_$**BAkV^zѰf;-+<`cK&7^#Riӗlhv "}ښQ[-RYDzMu4u_'1GBT$V!Pi/nﻍS՚ucnE֬ [d7/Mj^x5m]K1 EY0_x=AFD  #'.6+&Z`!򛕺̕/}[UCe"YBɚbH8"?ޖ'G`KlKj tպucܺéˢP-Q,. =t(`OP` SzQy(  V`=8hq'..'?t Ϝ_^El~hMUOsެBمU?:]O4Jy]y @Φ6kn#Y;A . $ /.?/QIi]kO%Q(0PԒSK9U3m߸  Uxzxf#x:4+Muw4/ZNdw~VO>qHF )Y"X][G9B/ Qz{ۮm7z֭źTz+.?D5"VхdiH<+/MS fX EH<}J.X_[pL*'W٧/[./C=ۢa]JD7W ~;>"k4k$k@+#_]BoAxfT54n#jq Uu b)-.K`EE[́ÉPKEM6[(!`x:#X{{)Ÿa :AOO_8 Yi=4+M:ϔԯ~63>6t\urs}}pnAʭSW0 šjcw$j}ʾ& ɣyyapsJa*/Q(BSN^85~">q:$ZyJx+~oVp0Sѿkg?r6ӆE^*{ |;QgvAh4l8FܺZMK䤧.(.o ~BEc**=+mSa(BN'5>ܣ`}^8]*byrs,҇ Mf ]^O-/m:KW?.B~%kb+9ѫ< 2*<{])wÚRalu.J":cVuZKq)( (8RzEQ( !#c ϝM~xooզB~ ~U|Ѳ7+MD+{[li$IWT¯=qi/wP2*ɚt*ZU)#U.ٵZpuVH Q/./(+Q#$ג)n#PقrFr}sGx1R7-Gx7}M!ZA״e҆m"y4JGW*ÏI(X;`Ch͙:jWyE(*;4ɷ IuBQ\]xn}a5BUĩJ CB*Ym6g+˗ Q.U~|ꛙD&YR;_}gVb*>DI{ҢUVzZ#>Xd U%~?*̖$hԦ{hN XK+,Ju %h>33߻ibM`^o)TJ<*hTa"wq'..3O≳ Q?&Z,$Z;8%J)@@7X\5L`yG|JЪ.s>XY?n%9vC/g!iLkG.TYD!dn޾z;%'/P8j՜,5GJJAO$+3D1PA!INk#X ܑt++_R^4oB%v`FuPT^6 5 !dڥxhBkv7 h\qpNQmW E,uU *Z`動Y:眚"OR R@ BNjӴRy~-RyA}X ES)U2_=w:.Garu,SZ$ !.b_mOڎsY5+Vh$lIE+(՞`;&TXr&Qr>D: olg&KG/Nxsths'v&vT\(WKjU~3567F5*vw*'UV(CpT4#O&L!fuT~w_߱;*k IQ2uXd/S VmWN^녲V(kBɑNyK7sXn_#V*UZ δD>w)Bڱ;Ѩ'n̄7s763W㩴O52&ȽkeC"aʥAF7Tʣ_10JfNtMCJ]p' 15H!C#tFDE^f p9r0æn g:WxB9ÿj?qR 4=J,i49oBQ~jƿJe߳KaOBڱUiT+U<Rn.C!,BHurrφB5;{砼`Z2xO[P} D!e1PuxVݕg\yNfWjgo"r8iX1jjRSķ4%BЬRr6;wgBF@ް2HP=%;tO`ՌijN&2J~h x7BȨS^ V?]?ˋL[ hRtCBqʶjT?REzff5r5&jq.+)ZD+J43.&&Y: EJϒlowI"q*4k4]юù(崃vT%25b5*2B56חUS)Xp]xmX@@(ZLB&ދ)Tc)Xd>Eq A TSBPQ%C},QN6RPF Қ BȄ}T*YX: Elj)HH" 5Fph `yQ؞%T<<&qp.b`E$T- &Tf籰|VD#Q2Lf: )5LBE(XQCP;HVIKǒֺƕJ{`W+f74:I)C;Bσs8f ֩+rjXQt +*y3MTMsbW}f 4qpĵY%(sH9z/E=XG=1kU ZA\Kf$˯jF^X%kln98c[; $RF!C&tnq* k,%LSR-1K*JMW+bA9#{g%(HB2T"E2$!ݏP%Þ}Ըkoz>I+q-VRbw#R?0_{q4J7IvqSf+n;S+5O-zr@:-Wق8e&nPԷ1px8sV2T:{fBĄBE=4}'нBTcD$ ҄%?X{,._»WaR  $>g,B0vT/L_EPQF 'c;+ u Ss5a|}sGa:ӄ|mV;ymsb,BqaF#͍_(G,4ki$6OJkaW*>8,^ pIc(e(=!Ǭ", 5vʯf;0>EV0*ef+_`mJR?# qX=ěgCThx! !cr*BqvgV@۲hV 9A\Q+a&;x?ĝGq(D)G:nL1eHR*kDkcSdRM u&&VѬPk07t,_CCx@)CB@=BGS`C2mT!USs?jݵp~ʋiER{`O?vh9EKGrGRuE6Rr%z6dNdmr^OkF{/:])8e(b32cBFE(T'(T.Xśh;b7GʕV*TSH|I(VKօ[Xnlӏa4\͊R*g!%5e~qNQ(XDZ ]A#AR>ERU$]TΕRh1X2J'~ ._hvbͲE 3Aؿ,/jPQ(X'DLEN2,r>)üv& 5^맮^J ࣔ!@xp4 !} rWabNhd!)dItkxu<,/7 YOW.tQC<5 k@qo\~CXU 騖/^"L-W^toav?x O]W`jE{fB-7PQ(X#ʐ +ۢ!(|jȊV\oueC  W`זc7Z88S)CBH`fs2='ZD"!Uh|"n/%Xg,gyLBJK(TՓc]'X$mS(fBy449Ѭ[oaN]G=(59D3 [QGzF!< }tBm|ZO?\e%++hVr{X83xU|P> pQmTdB>[DUקF`1jl1+AkL,Rް0f]*.^kK  &la5kN Xɟ}\|[S*Ck9)Z1fQj~yUo>mjKeG]ڿ>e60A*u<*,uX͊SGIRjV:s~t:KDTTհTpϣd%xO6>ٱ8+װf %g!+X.1YN` dsN=q?e'ZI$+Y '*^yIU0;0I6Kxsn gVᴂQ4 )CYODxF;QPgԐ#>wnjۖzV]w'ݢYyyH bxzuܞ9aUb,BKe/r>BE(X#]\rv(HOST2Lf5'eK)x8U Q;*O͞Y#N҅^Z0;)η8}^%f$_> ەˏfe415|x5w .hO Y2m%f7qd,TtVbr?7E< O nB%dܘEY24gx7Wϲ;O2@ RO`$-JM0 y&#[ac 8b4׊f9ZD0_s7PRf"j3L*hgV1ᅡK5 A s1)!'q8BĊB5M` v=rc[xy*#YLrؾL )TMCBnl+u=dE3TJE10ǩxy{3Ƥ~ʐ=9Ѩ4:S(TyzH5DŽV<훥RѬ0 QsvpAha=%aɀdrETQF>MM)5՛w?hvm MFYZ\q[8a+O}tF)CBhw97R(T9N(W:D;.}sȦ R͔ᢲMV^[\+()C2R3*hf,i? XUD 51;# vK*qx6^{-FȔ?5m[UxbZ)T5 MC1;A F0 a9]7ᅡ+kxgm+e(J%+ A:#2?#~hT_qJ00雥5TS"*+;8gpcn!V4+ION 7l `LRo,ّryx H 9Tego<(/Y =aJ)Tuotr+w1UrY\( M3\jusͮXH겔n{+k8yۤ&E)CO0V X`O4KZ Wrd=uG"vxtKQ&…$e3PD쿌f6Ay2Fnw Nnxo-2Y2$ @5}\Q(TᲵَ߂H h1hX$+nz=T&mHVAGdg_*W,ī yxBZ\|8N:*B헌hu-sa6e,[_<^ 8hDv0nJT* jGpdu*6ϰS0iPJxB.:u%+Y@i@G"~鄂u΢}o =Y=^J@!:''Y'NTPyPuoK5ܪD%QDK2j Jm}O؏<PF\zΓsS!ZghU6kNZ4Y sλmT@]8tʐѬq7eI8{z7+ƨ08&HVS/.kV4&=~y"J@~PSFwS:'*ZE@~;n>YAfNv7g֚!3k`^{ɀӒmV* !d3 S M*Ck 2qV`G6k$fSB(T* xXX sS-Y6}ajB^IngƢtM/HA"qOȓON.ϙg2 3A BmW6PSA BE"[4%u:Z확 h|)Iʐy} Ps`Mv!QšX{R*J5'ɨL;k6nh n!} P \6@}ff|SLdG/ ^sD\18[?(~p*ޒQ;J*C2ney3 d8>4Q0uR'|+Z.OZ: HGJ%,n/B5[d $^e퍌ơ$v* Ҁnx*NHJVʑ),zvYy~PYcIu.BS⒄ {fa%o`]NMP VNä 9iua'oV (JV~?4K LcDVL/ۛDm:FJ>gF# @Yk>e_W˸ζK(Zx0%B5yk8=cF2\EH:VO뙕mNвZr ɼUBU$)CJ9}4s hT`'(T鐫Bۑ!o9?f3lkNdŷ"(5sRX`ʐ豟BE`~(,u <øn Ju.A5YL5k8e2- nj&֨Uc#@zN:#S86a;vh3`nsV՝13k9'Osnp {xZzVZެﷷp՞aY ,heVHȣ*%7={۠3z~8^R@JÆ!`)k5q"{\XĐaYV2cUT` /AZ3$#6te!yRRÏwq;!tc0aC̼ȣ۲&Y"q6d2>/nHCSB"|(9%ubc@VڞYϐKݏ+mY6eD@ֶbim!PB,0[xIl&yYOMQEkB05߲t"X+'ڒ@V{)/HgFFW /aTEoV FY’1+6hYߌ O(P24 )\ ~ξxN_MdEhQ8h`-m.ۅXoD[ Кg=!C^K \Gz'Em-0AT"t&ٛ+e/()D[*Ȫzox,&H)РFb&𲩀d1._ٖDŽkf)PDGǸ۾B}u.6sR`ģ9İ_U`鄳LTHk@ꌶI iQ7Գ Y0W,5g/5Mu{ ϺpM&^"+ZUevw*ФM @+ILQwWc||Gj76ĚBBauO"ZOGDV7Ec6v^D=RSV\^s?R %"PhU'}-I8 ,|&yOZրh_b;<"Z s";ӶVɑ(Y l-duCUdї߼srM@Sv4 FQ8 ?*uʼH4 BR EAc,׃=@T@T1>CUUUZ\d{sl`fKaZUaev 7o>{P(@ Ƌ>LxTJND2>֠-~6z^܎;:"{;[1}[gUZ吡='b|"% y)T%^F;x q.fڹ-noyȒİvVX3MMη#0hEDJDffIp8{ E M hufKhm,"3(aޜ/LTTEj5 h Q_wp<" 4!!2ı)iEdm#Zj3+ǰO*"Zjր2?;҇Uy T~m*N@aK?s:N V(Ay|9ٜ纓7zȍu2E@-kaV/?3z0۟v{{L)RwʯUmVZ6{"x,NMU@*e XalQEkBl8A-V>0PW=%PXW9: Nc72BR*{~~ $ C !r <9N=EqǍ71=6xmǹ}po$b3N_ _]*}TJe@K)Ux? UxV@++H)(oX<cKX)bƃ;?sks &h"4^%qa:T"YHAVi PلJ)(Ɂ+f8_]8wqxV |CFLŒ=)dhJ㎽9:E5qƛRNÂYx6>0DhϿk(GLˤ/gu4Q.+qr1RW9bmpGw ;70Z(ۖP!Ōdh6'u^س#>o-%B{xo4aEhhŽQ3 NJ_/&b1, ^,q,c`"hل: 2ߩ\8hXE ]hnr/o*oQ*p%`fsfn;'`Z { Ž!vOMޣ8^Z 6/nk|PZzH O9N#YrXYI\aZ3'\Pae¹03 3X?yk3t.y3Zy%2q!r]OdiXWvXyT*{t:n`M؀*ϻJC"['otpew{a5NƩe~lh[e𡝎'ȣ_T)Qu  e:GO=Y (hD@C Lαe/TlrlNFTXEvZ[ VʱAez,lhdf8 `@fO:,av ]9X)qǸؒ>pQcRpXBcr2~ XAΩ8>Em1 D4BYb7yc]L8""l ^m]rR]XgV>3oKӴ-[w] bZPMH)h¬ICp3i`Z|S zE9h=SۊL _C#wǁwU6'S8M:Uvo(|dIZ ,peى)K6 Pe"k1mG`كD~*jhі8677 q2 :=\-qg ~6o3]Wa:ն  V/8k= +8x^1 Oz*5L{ ,47TAŦ-ڔfݴ3 d|h-G 0,Y6E`oPhPD aqر8KnH\']ai"j®N-=|u J)8+x2&Ę t^zS '!Џd1q"Z4 ;Z@Sۼ.SLw߰Рvovpu8kv.cDN&l*+ntQ<8MAZUh؇ ?wgϚ谆V!<5uE+0r_-eu'/wLcb3Ђ8XfzgUiHq#Py1QXv FKVKƵ.~͸Xig9kVw uEV0ε oW "+ZxUyT"Z]v ih)+[4'"x߿qסmyn"h[QR Ax2Ǐ]Dwc2N3g^T$\Xy%9>c0~BuJ<@+zEK{N&G=E@yWu\>`ob< {f ,;w_n8IdH4£ ЄC0[]2Ƌ3 bMZ6gP? ^ +=7h ]0\F~I1u9XxnȑAd͒6s>4(7x\V~XqxuQX*IGkP={\8_ y5E|6AmxhH] BYa*+m$' :&˂ӄp8hv #8LrX\"KtN< /]i{k/8nq 6WjKGR@?ᮭ(4m,pUYi- 񫧸~Ca:· ێA;F(w.yc.ЩšXO"@Fzhy5,+TCE*̇`޺f[R]{ NŅW>LxxF64jY)'K_p:)J ~JE`-@8R웉 TGr "}kCDpaLerD,@ N,c;FeNx>ܺGh|N*٠H% kPAŻ;wbm?o̳PH|W 6q՘6+8kTh0_=ō3) 9҉'82 AS'k)^%/N(X pi3ΪѢ{j*h10HWG|X&U0 Np0,hS{g=VxU\,0pP&h8˔I "lBGwEE22:ϟ,Laݻe/pj gĸhTp } JҎ@)(B4XB m|+%WPa_4))S@7z>)[JjErXm( pa?~o^$,+74A~&:G„vHFa H<[XXR YJk2k|R$G-ZO*Yު /dqȒ6W//$+)fه VhixU6plr%"p]5*)Ou tnWpCfݽvWu[rn l:s.o &eA#b) F\Nʕɗt-ֆ A@20svWwSؠq'qAfԋk>>yiFa>2Q8+Ͻ }?{~| F [d%DUF Z7lQ)+-{S7:owٽvQb [#V*)Cy mtX`E[p'h;+hkjEcx=h<298af ZX0zǂXPH^ְhdRi[$֫EX[ue`IÓqZOU$8&QKdS$K2u @;t4c -HD<{KϿrN3BpM%8˅**DiytPg_{/m<ՊW[mBBZOedb{xqLෞ;.j;eC+7d9fϽ>VIç^ >>YUVtaE*8򨖲p%v}\.2a=4NdϽ7.zC) A7G}kжa55`4e|q p!Di<} BE)H*3BPAH!J: 5a_~02c3!PvTJUDYV]mK&,KF8 vZΐlkgX@v:(X0 TpG--ydK?|ɻ"=6}j}6êQZbPJk*+FY~ˌs"=WŽ lX'b|g'%d>D|' `IƐuJ)T*VaYtpPa2[;k3Vmjo1EձVol:)Ru{ G/^?7$A},ihR.\ZL]% u ć.@%dbSPa*@JB D f7_wތr-(Ӱz? XCWV}JƦ&"\y! 2 #,0>!m:xzX. ϟ 4L8t a| \Jsы-ڦxzGL_K'ىU!3 h.!dʱ߬Cb~1BVר£]զJ s!T+ kCӆ SeaB"E EPZAi _~@T- MF`ɠ8_,pPK75˅zW"~ح]Ur '6aSy":I\˕mpރzX˛Rޛ Zܽ{+ږ K"ܴ)G˲p97њuJ,f;Wg·:pVM@G:Dmل@{)Y&2"]!T()/b6=}O_|v,mj='IH]/py;I:JZ{dk]7sOB s8?(+5m ]F(Tdr- :fC(a+,.İPaNZ 6Ư>$P_E\Ͻ'lXۆ ^77U'wv +B]qdap5^Y|w @vojOvwvxUbc : .haN[A}0U4 6YCѶ  ܥl1)CATYilY_xnOnM>t%VP=PY]XjOJl.A V_{[WɆr1$//Ss}yW7 :VՂVh*!B'gЮ':ʖᔃYB Q&ɃIX[WPրXLhOFe 3z,z݆ |.PM;Ŧ[+7w>zI>4t{9ԟe dN1:PsC]L.G#mZZ9s^3RiC41('1{NpF۸{A*fTƧtu\JR \RwKt-~6TvAV>(4ܖ^2ў(r4؃nP *:lFܵcw?fYaxtj~ߜ&Xk:m,޹+:+Ɂ,'^D4_^g:2ѪǗ]g3&H9)*fp^}X砬?U蒕USg\,c*=f,jU{.*U>em;Lޒ fp}tJ)LY{]Tٜ&V#3 gh;+H(D&> „B5>ry X TmwϞuirḁj| uHŪK!0Tcu\7NFhk(=9"lJtg:ƒ.$c)Ԋ\)Ii-X9 E7랽~jW*V,2bՖ~kS%D[!b(eH.28x'6q="Hò/PEwxm{W0,X0'ِ8llf6R::6pu'h'{=YoRH(U,Bɑ\* uZ1e{rǢͳ]$tC+<y\m܄vWZhWQ@PJeo mjYOYHrED:4_y7^p%E[OFȂ.IgfĔ 9|⺋n]g'HHPMCym=& pV* 91"f@]\mؗCA^YJ3a|\݈>Z-@@,~ewLFv'OhqwE:, lX)E pPxʲ ='. s&BZR+ %,LHTA_zxEU@ ]9`גߊTzj"dh^Tw9p!a#pɋ6Q(Jso߾y6m}8Fd#wh潷7+rE? @<.tbsyϕK@WʌمìWUUHfW>DcE[ VZQ-}׃vU!#ThyD\-?pX$aPׁ~( `$r .Pab *3x ns ԕ du=%%1S'm1ӽ.2 "DRc'GU{c$@S.<+k@_h V b/ٍB %h30>P OnN7vh+{pe˻ qSC~@&ѐYqبw` :F[ DB&á^e!BC+\Z̴hG! B _y-=r_c/g,V=@Uk}eEKA( aB[ɅAWzUtKicPpjŠP!CJBh|&>~1 m#hQ xTn-4{[ֽ*#ȊX КB uL{ڇ +$m]e$tL]pyK6*3ɇx (mD>l$C?[ ƁK%qKb{(M\S1x⣶ + EV;UЊ=8z yх2:*R([ |66hw7uUxGuۍj[/(h""`"z-+p=QNÅPa N.[2D !y*@J:/@SX3ZQEV/lc>df{Knr U DNF{"m qU{*x;()_tCK'L?6ʔ+Th_yEV^Ԡd~s9}tuY`I\.S6_aa煈aQYteI&<*i&a>0X3>zO\JrQl@Q.+IbnsisC$'ɨ_Ѧ7MqPvWDD`>]k_[8gzpY E l`9 es$]yS^!iNJ3 ]<{.-p*YTSg(} hk`ݾ} ^>bT9n\[ृӕZ&pW&&pڤa$Er8d&}&; 5#pUZDDsMK ,$Yn@ʱVSу%;P c) )V`5V˜lmv <A"/|߇r=5@nWRŒt *dPBnP(ɫ-|/Pa[C)P5IOV9nm*Ν;G/_&c4yEk@۶F%dj„g> ±sy],R. ;WwW K!ta* T|J޵;Oac0Z/#7JGT}%dȚz_*}c+WTL9,ЖZTm|\$$">nC[4Ё/׊= ¹$E̍J]1C}M} 8G[b1-H OɅ|@4k7m}_Z1P )Q/K }_Yn'hm@v\(jHpKx;± Z6(Ww'R @! g`}BYHRJC* Ey%!T +L7G@t@U 7RƢqģcIܹCGGG44C$rI -*]!P k|==Oڄ9wfKkc/ Y c~b}Y8pAB -c+Fhs7WU)'GW 2ְKlw MX~ײ [tuyfQ^ )`nݑ26h?3gjU mwyrzZ5>K9iA4˰P0^zȃfPaZ :Eb ?qwcem/n۽ "PLN# ,B/,OA" !±Og!\,,n{WH7 }e‰+ C%8-VϸqwαWu=]i >d(9IIx4 ,3\8vPihwqQdG3Y(_ŇiMɽWcfj`MUk7fߺk׮ Do\"UN}JDF+ jzYo H|@$'&;a_6Y(85c&O&GW&t^!ݐRXHZ |+ m9ͣZ6}E0XN3,3qAy9Ϻ,goܸAZjZU*ɋQ/5U4ƪx3M5Em FCNJPDcnd]X4BP9 R^)p%WaQEr.fBym, ?v.~]DV"Z$FY BA^ )=y1lw` XvwwZ+V '''4LhQQqѐHvy@김6/h[MiKɄfl.E5Ts +VU.D8퍝x#y}ߧ~ҥK뇇$"_HQ@tB 蜳ulKm41 0j\."te1H{;:<( 0RxtaSL% KU2m,*?ՙۭhP*LyJ£SY9/V$CQJZ0<߸vjkPaQp@UdԖ {Ng$`jոުIVd-`-[ dt8*?HTV4fׅP h?n2P&9EE; v߫O!¾>y\Chb p(b3`{k@V^҂H >T>yޝmE <Ė6Bo# ~{sS*Hz)`،(`6 ZZ q||LkG=:99!t…*=sb5Kl3h7eYmހm$v%(Xg|;!B g-ş;;u`R2 ^Jt 25 t,qBJ[ tz7V;A?;sXl\Xo@E#*yVl4/@52 К7ZhpPhk'''t||Ld}Tޑl~'eThU5Yy' Y@1M/UȒK=UayqؓUPw>P)E.Rv̞@.=Qb2.y6k܁"(QP!4#{Nw% i[+T/ۛoR3.Vf>%)T7XV#_;;;#888n6CΝ P*RJKU' q7h['^<|O?rOYwTv΂لZN|F!p0CdxR|C(6;:x涝5$- k-\ % TU1 P_ˤإ8TC{,69ËE> L YfI¨NnnnS a+|z SOPTY+݅B+mN2+|?އ=v9uwͰ!A@KiEBuP@V (_~t/t=2xpMhyMNabhrߥ‚2PLkZp%z&[^ XVF Ν;vMgggjt`/P/SE4ڹg $mFsU XRxўcpZ8YB9 R)8@!|e1SzvfRtXE/V!0U$Av6Vw:O˚NwGlrcQ8"Z@UAJGw j%4j h\eoVcy>cwyG._Rt1NNN_ Yh!*mxufF)RDT|D]@߇ :j kr58;4XCd5 GE@RqQ J;>S7-nv[ Deؤ5rx ケ =QbͳRTTeUmȨ4d0{g8X"O FiVYZ\1s*}6eQ5})1 BFsG6ږZ.`+c^+SaҖ" <~HB{Ewe:y,"$>iZRLC *BD"j4GȻg 8f2pdZed6zӓ7ϐ٘$3Œh8$H@U/赺[UX#2[Um7_| 5X9BWj,FHJޕQ=RDZ6[{2;\W&nUܕYٲ|62]0?e4l>.[X2X[iH$bwwW2}VʱsUR٣'X~|C񐇙1T02V0V26*K#LͲۮ& T,eB(W]h\+\?@yY\+ >WEXG+=~S)%RU,".dljjrܵ]VJhHHYQf{8 H;Vaٲ YR H" H $KT,$d: $*Z;;EZi0CJOb3Vñf+.ES0 ;/QU1ƊRbР")Lu2\ΙSkj@e۞R9X./WVQ5>XUR ㏏R655$ ًPDb&Rؘ=AmCŝRrҭ0M"%e9]KB.O EH$K*V$ `QbWNkMʄZe,NDizF4] WiL F4zdL4~g-owf*PaTe! CHtSb 6d 2b2h#+HzVbY,~1v4U@WW+=r?<ѕn W}LO+" IR%QFG9YB$Q< &㤃eDfU4~󠃷BGUò>VEpReN"ro>L"T71ú&LI7,Đ0yrs˜2oq=2+BOPَa ʮIC6p J4E+hj@0`cyONN '"ND\D ȏqL0jxrK !.C5l+сhYB?C]<˃rKLn'l _wB8Tx'KpdqA2D3|05zq )At{bfSRP/m=%XVȨ /(U1uݪ[C/h,ʯWWlh PTj[r~v 8`DJ#Xk<+AVThNrQEDAcBs΅xgYR{ט B\h0WȔ`3Su*@tSX5 a.V<%" >qM$jU`% LrwdwP5в(M8.7qE2`V0@fmaJ% t~06K#ݔ\Jբ h4@eK62 t7,Q(S:IdL÷4 ?KJ'qB+nxn jʖ baff& -> Lgv6攨X@`1@MR7вA*s:` _sU|e[+otL !+=ޡe\AR@ՊI&tx%S@Or8p6Paa$]Ar{Lwj۪q.$*u^ŝ3gzIʺe[ȈQEe1Rܩ3 S2'=DrU-:[2{*IM$"$#*|`JˆjoaUb˻j>]~Ϧ`lffʘ)1VEtYè)Fy~;5E TtdgF>ɩ*cbRqX2A#|e!-Is^YN 8XW;<jY N#)`Kz84Re T)rVko:,+\q5\OOOiN2*YڱҞ ?}_qQOh^$xn4‘iQswLt`u|2G2KrgAZ2 ЂI@o*Dlܙ94TH,V`k}P#yСJh~+<$1VF+T`t&(V8,9~)3e<=Fn*zQ5@Ubم 2&Liĕ Q/ P>)ΣJSŲٿ^s,Z65R6bb 0aV)F2"$^ii)yPp8I"q?>xNo!n?N/D(ܱTAkW8,3 @mUl VmPy3ʕ'݉Cz.LxT J$_V8dlBB-AOnUg}&6 @@BBp NIhI hIHI`I0HCe UeY0IC@i3C?zr\[d81Lh>pFTjǐ+lOaY4tb '6La"Ff1*M9>uf Ј=!h T_ft15\\ f{s'RTW,=<,}tgұ".Ih]Dw(y(g3U?ZarsJ26~rN#sO+8W (` >%`_}*iE P*T]eiInl60jjLJ_wV^#73Qn\w2 (0CTjlbh)pIZF*U&Պ;޷9rApEQvUbUJMdFFʷQiMXχdNulxS6:sxF IBi^u4ƒ+wS+\O2%i ɿq!PE뮐E#DѤQ̴b=>8pؐ<'%L @KzV {ۛ[RaPM}7E|;Ic Ga/XSE*/okGI+HhLX% UBUHаa5nN m{TUkM᰻݅%:Z^ 9u,7Z)$9mS @ H UG4U䶳1Δ>L`J+=}!|qv C ~9P66bԲGYRhGςf$dPӪHJFg؜ja3>"B(%ۋܯwzb.bTr`$}Cҽ:?s /fPLwW녂8re4li}*gb!7ubKnRmEIa`$qt) bŲ3̿q7O -ora'PY;/Vg* =UJE.%79c1+Gnljes8lb}m4Yof6"ZS*UB-RM ;`dt_+lrdÆ.u+}|D&+orM6:poZwF̜OX^d$kR"0l/Na;PЏD qIl5q xE)0Z92;#˝.a4LYԊ+W 1,`z [1cIInW3N)`]uvإ<^CU9p |@i@wWf avQI$9^p2-{р*Vgp]l#o;r<<_>̙& ExTߪg8"_,eʽbN* J{/$ [ -G5;U(xN\zXR5!N#´`j"t)t1tQN"E1x p_w{!zia6R2; tk}UA^=mCb €wL/,>ԇn ,(9 a|KTZ֫!.9afj "{90ZU]#lhc6 Hݧd smq9gn_*e.^VdtCFcE j) N)jU`a2G:Mhȳ~Ne%c,xnyD}=^nhIQ XR`v]6Ee!n{1`NbL ?zQ&qFC7> 7=.lI(q7C pW;#dCW9viGhj&7@ހ3l/,ᠽִp7u-`nQb$0 +SRJDgj\&f;Nڨq]S}'d^PPa^-753Vy?V*aº|s|RЪdh %e,X8}j~2d@~'PT`2x`șI\:U .z˒`EcZOm  Y!;- Ss2UX.`5itD: $z /SDب5la| +i.V!IxЋp^_IQb5!I(^Z5i: Е)W_>M ??sĥMxh~@cTNZ fDʥ7( tgO:+s O8S j )f:Bj)UB"jc CrST4ך~g;  TV.8ViKp@4&_#KZ-%2rR<.J@pї3[ Vi{ RT v}anTTp#2Trw7ziK=阚hφ04L5pԏp/ ;9BGҥb.sҠ.ܚ]Y.ПSX`eYUZJE XY q&_j'O0;$I3h,,;By%4Ihu򃴹Pp`2i1EɴS8,cs~{}'JsHy˒dMT T鿾8T͊0Za!ʤ GǾs hV`u&e|H*(qlرbaubb#JA@~঑W(9CLٸ\ 63n禱47PQf<n/8ꋼIr"G˥hlO/Sq%x' dic{RgZ˘Rm MC8࿻oq;j̯  X>Lژ'"T}K8,fp_7_򘻁DT|38bez)g8-tJ:\I]J^K_WG {4WThUd3,1pD˷S{+GM0c}[f{ie}Ĕ:/lg޲|(K9SU$U<4#ar/_CV5+s-,b!%@ qDiӸНAFNI' =M9IKi>~8s88aO]hGAUv)5K&%,z{hk#Wl>'\j+66ƏQG>ZcPƓFRT2+ Aw*Vm8h;=!˴gMm`:U7rd_7rATXǡWB,1Yء\=.Qlv w;]UFUj*;<Oηg7upe}upeycgyimkeܮXqXg6[ %L0:x^eތpc)@t9ʢD)pݓwþzVY  xh 5/F)>6IO 2i$D~O` Y\-YlPrIaZ{d4=]C[ c|X*jzR9cU# @&\>TÜ5.;+,U[RG}䦔/ Á*Xp` $xig/Rt,WWۛ2= rpe\(qf=u_Y޿˫;K+{ya6Pʍig3ߡ_w 5%+2 $y$;:Jz!7xٔQn6`6JX)T%XZYUFwVA7>y1)\oMa*s g. c md Oc\*M**`I?@"=G(_,B =Y@N-`2P0Ub>~/EQ/X*X TJ}+`˔ /-`Uj,%ˤ`9 GM e@y f8;i]ү^{mimNgpi6?-x{F(r CK  0wO^{ud ư\»W#w_ZAg.Xb,oeshyX0T߾7"1T1E X5ib,j(dF9q7C?Iڮ|~, !R0 p%42SxYXIHV[.2/x\utRKUZHaa͜6;ߙ¯-]{~iZw}Rwys].?UNmX%/e`38˘azr}"ʁC9KD^/!FҬbP$/m|f=R)`<VixXcW(de*V2* G?@PUO@KapYQ7.xml+,'*+AER.O=Џ$NeNYQFqtZh`nV XKٷ`%>|ݛ[,PJُ(Tҡ*UTJd`R\p | +ZY!K7dP<5/4Q4hKQZY|gisݹ; |c_ܬAP&nf@nU1jwx ^T/Nw!D^'z'PV0^t|(,+\3ǩ8] $dCkOorBUʇ PG9 @9[P J)KE4?N/0.^@^*jۤiqfʹmKcfX@!䝛};û7_EDaK)C" !PX &TIBz\K|U,K͠- X\P i/f_^yypwYZwfS/s$ y[TU}̤zi9W^*|IPsNO"> q4N$!z$o^]o\ZU)gH#5Ur)TX "I0͟GǃDÔ2L송OuK:m!:|)Beu{ (^Nou2gj*V`|Ur!QsX[?x󝗿Gb@DagED) +jA*aKp ȠXɂPɘP2P.* T,SbЖ Ӳ(R+kr0S#pYÌwaԥ羺{ŭk՝KݵNgݽ5P\${07|JL ^*djԺA?'!BIޛ}Aڣ03O,fSA?EŊ~~H[+_Q&VgRcp(9X-\j=~ƀ^$GRK0ca#l+w {^V&At?ܺyOrUZ%VơjPO\_Q^/\GhPZE5Rk_1P@YF#pfS)ƺϾݻΥ^wi}3l=½~ }!!AEJק:jyi Ae촗5m~ Xe!AO^ٻ8QQ $j buSN)i]wUU,/+1s2-/r;Y`QL@擟ez׷f:W+[z+ BIԞ0CmߏpΓøE"CRã|1 DzXߡ 'WM#\D)!tqIHfJ/ϓS׉tJ/o/Vl,VZzUQӟO}?9}p"Li"Ld*Vg͍4jU5$X*4X|U,05_0scRL &Pc̦ 0Bv. .\ܙ=|+/t7.mvV;ݙArc^#%_HFNJ[s P!(1 iPO߽׾xUKwyZ5!)t'+bUqU>ǸF` (%%H0:J,+Xk`*&28WWzVa L*\\-mtx% n_͵U\pe{ 0tb Hb4fIӼ`%tԜc~{ub `k[ϼs֥^gi}s5IՋ3 Wzd,s3FiVMPaTB"z'8DhpŘt% %@LK.h;@PTIQK$}a\y̔BcݪaR@e%eef,̏T%L"X;Ϳ7'BV݂X=UJuMɂ8LD]pUF*,B>9Z> n.ū`Plf26QL9V&ɥj٠ɖSG}Ks7^Zܽlwcjg}rwesݞ&2wުiQmlWb% FRƏz;IЀ䇕o7!U/.eN/N, ǭ+]aCAa9!"< DҔ/owp^L@,c@џr;ƠwTQce !@j!*X 0N`7)X;sHr)Z]0< Zl`UL`-`fWke`벅;}Z垯^;|+; |vV6ckzffzR*Z^e+nRU( R ݣS(p \kSwY*"dW B=]ȼU [8 ``G(̪ajVd@N^X~{3T-@U؞V@PfJ[>{Wo/hX.XdYhTոpZ @Vh-c[KrV)'|u,@%˂n5E{Wrw[:;vptѷנb1%I:I+#"J`DҒ^ } `hzC*~.RU%cc|0R99g7^\~w}Ym/owG3=񐕅 YүY?^(>GJ¨^YhRF*^5t\ꀥY")(k`Qr|z@N3o`ev~b@>3UW*AS7OD `XTaA o@r)V.u*ׁLh6*UhQ|w{|јǺ˥ uyʴ^llR G+i0ls ׾}Agesn T1/2 Q䞷f WLX[^B Kua).`yu~9XP$lCF.G?>~g"p@e+RLA J~οOSRTR|" X+a,e>VtdW>@Q| K(* _E{X{{,"`T5޵-Eʗ-|d}]v/{ۇt.ww;+Bz 1hğ; qd F+pUVPuU7xFYo:QD/ RIV+'6|{S*X>? At޿ws!@J9HFRʞR OX75`V%Ut@<qrʳ WH||,dU}>n>TBZUZ̶,.̢|-rL8kKJۂJWQe݂`]{Wwcrgm렳Y\\ PHpqA?^G}PXCIQ/_U+wڵȬzph $r&O;I΀H`Js,,c lmTJ+!ޏoo{*a躮F0W9C*)~l:WP(U.)׎l.X(x=.+r7)_šK F!lUd h{ vjj^{K[:+[NwusB5Uxia Q/ƒA{#E?8DG* _>_+Na{>TNa X0jRξ ^ؚ_BY-@cR"qη?+GQ4 X͗}MyVeZLR, @\W:T/^rE^E:Be!Py@G9à nWt-:fM/J7{>!ljjxwŭ̓+^y>~*Xݫ@`I4K[G9{Џ0_e2_U~x#1Y=6n~")Џw,ܘJ֑ So/c}k^JyXVQF_7y7 ! X ^J(0D Ju^wG Nk\X /ce|Rtu ȇmf:Ѳ l|*]`jzwK_Xؿ^lw+k '%pkV'SEq(u؃^P^8Lޗ b9&?,Pi%hvZ=90T3WD"'h4mIE|^Jf]`-DQ?_Ϋ|СX+2-j\U+_תTp Xeh\4U2WYH խ|+R˸L 0 Wٹ`Ƌ/tv.?{Ym7Ud%/0( cj\i4T4M;Dx+`ghe/r3.>ʾ tGSp0BQR+A1̶YFwjvl*Z$XaOw_ګ'>K*L*kČaE`ae*V6`r+r^zR56\ :Txe`G5c%Ǧfա|>Q#^q t`ԎB~mZ𷮰Zqرux{s^^t.]zY:DAP0J@[>ޖ)$p+`5 y!jνz`0kZeG~VR'|{,LMO VAaw^k'n=JTRJoc&:mfZ5Nd/"r_|}\%eT+PYϼc>GEfMUmU&H3AM)K*<+as gٿA{es24:X}lXIl>f.NȵN]r~qY]EOз)̕\{v<:]߽YolKO3de17T,tˬpM f{ЏpoaR `|"zIYIoEs#z; "ѲU]@e\[ W!$(tGtpTJ)uJAUR}R}^bT(XMB* WcU@&bҤq򽪪gU!UƱm7TLpv49ܛT+-lU-ưk/N_z+ݝ+vw6tV;;Z¡P1 jLUoH0u!UWUxXJs; y!$t:k{xOc͹8 .+j`uG?7>?:Mo_*MdU@-b5nߙVuEP._|=l/؆2YY%W2[Q!m!0O5dQiw.?ݫϷ7uw;ۇ|giIQ2c>WCM,UyR> q1K=~3DβJ 痰2;_jՠmAK4 VP`Nn}_  PVa"Sثm@X(Y~ \XUhMZ& ]*T), lOGӢѶIrA)K<[Sm^8e|&w~Wyiq kݵխnw8X@V@,"O+@õ 207Y~'g8'9>BqHHD^{(Jq]ϔ*G;*R\@e'Ū0` ZM.u*׸#Qg=eCEIXKcV{:˴oX,)f6/c=]^g[7:k{bE/q6:Y<lMD~?~=~^{=0BZCZ n?)Β<&`~{ l:j# `kt]}JI~`%׎oŇW>OD@+RRc=Lj 3ʔmy_ W'];kPU[J;UVE*rgc<`(JA \a.{ xwesҳ/-n_y-v{nsU,X~VʽC":G؃AѽۘmM`ˋh0eܿ;n{dT)7$jU~v|?!DjWRsF0beK\b/']D%Yʀs=u'܏[X|4s}W "nQlaFS_|z=`#|-mNxs~{ec330 Nlh Vmݏ+鯑cB@۷~gWW % "QFBĒq ,._ Xe!@ɻW>}?BX)TT( d\p%+TOju^tY\]U* eVG=Umt[>-$- `{jf,B[pmF\ܙ>g;[׻:+卝v&0r=`¯}B!"A Cj0zpӱJ}G~_Ͼ"LӼu]u^ PW eIVe@.Hke{>a?uѥl  L0*X꿖TEq1{I=F[{37^ZܹlgZwcJ{ysӞ:Mn=֡&gK@+$"!ARB )AEP&!B9Rn\ J52 }˿Y_ Lʖm."^jU9P~«VIrOtiX}}AΧ*LXQ"Z\ r6s$|l F;L !m[l5{̗>Y߿Y߹^,o촧g|b`+u!F_hc5ʷQr aڪmfO'eS dWrw3ͽ+՝~gymݚ u ;+=cڕVE2V(+L +Q喗dR>] >d(~o`%mlH+X鏋.b/<@P6.k%Q'ni}SY V]mm|s\o_1Kݝw6tֶ˛;vkj:8A]Aе<`Q`|A$1 H:QuV6iApg/AV_VW\@a+[% Jvfw^6罧FȀAW*դծLkI8uױLzuM&ܠ6.h9[7ϼ:ڻY۽^,o,4T %aF"NraVET^J,X z'O^7n^?C!j L{5`N^71yV(U8gꩶ_xɩ]OjqAIW}AՄ x`a6( ; =lDvXk/v/n]itֶڋ5şfrDHS* V27ǯ?}Yc!DEQ. yPPT&xQ|~I|{CuAV@eT]W{8- HP`X }laaG['R~A/?>R{3ݵ˝~gqmk!ZO|K$:` q ޅZ|?og'%JUl`e2-)Y2UFj:AW<.!:amR_4m} [}lu XMZ jZ37vכ&l1.A0w=޽BgAgec]|lIJaZ&R{x߯{c{#"XX.zدl  Ą~'gk!ƺ`i aeװU-&+mJln=lgi> 0f{ۻBgڗ:;Wk;ݕvwusWꁥWĚA$-rHFa$3̧G?~wf4ܪJfԕ $sߜ*x*%K*SBX t=ejbUvϷJ.wq&061AGvDFۦA"3V۶ÑSSl/u6w7.wV+[<^RJF(Il`VB!g>޿ywhOl"Er^ X-b/4X&x6_G5NE,Ԭ媂+lhQز+/fE-s%ɻe),߻Bg v/wV PBU z !O$_{?w7E`7@^h@ݐf ;QjԮ3'5XU:˶@U(Tl̺߱MrA Q/\ABW:X`e+V){_]}uxws^mwW㬮APHHXDw5PkIc@Iz{'Qm>%\8gŪ_hF cgZ^6.cZz|!k˶A.L(jܢqBw:|Z>+H sۅٹ`/.n^o^mW6:90J BjVeU̽  e$o}zǫ?B PEB>+٤T_ bUgIU6UXO~egE7JKz\B0%qqQ|r TpԱ"25IogT _s /n:Y߽Yolk:{e` "U ܫ^ ]qHp_|_W>ٷ?(LT~T6R-TcPXr`Q_.PSjj)R@.'پHU"w{\/2J/PƸEa `ӑRіl_&̴(ss_\}upwYiwWp`?AeAi_` |ۿ/O2DZ⺚n+[-gʱC(I*V/ASZ5M^?@uceaȚ`5\=u`V3=fbƁ:hWݪ-PY5twlȴϋd&TBUcV35S]h|m\Y+IEj`U&. \5L1TWyS-m]@}ce逭2ygZM"{sqjfzBFI'lXp?"@t+q WpaY- \5L@]u@ړUvݬuQx 7\}t,["Dy|ժfjhUiBU8M_K*SXUy|7pV35cn4jWϮarU<$x }袨VezʡHkBUk\ l&eBU…em5pV355!zAjX&]uBXr7g\@H9XuD5 `5S35 ]uӄێc5*B ǩDMh-a<ձ:eNQ&LWUWQqW `5S35XwOk[I[T*f`ofj꘧i TIUY`ȴ`צ-PjJbw{8|T2q}a*\5`V35S3] 1 Rg PuY'ԗ^7y^W{0/4s35S35X@W<.!Iy?.b*,/4p35S35^M[CQj8[&UUl[UjfjfzLǁFz5oRF) We_ AW]uCez V{U᪱_hfjfjƋ wq `U"jfjfjƑ꘧ 1ͱVj4P5U306S35S35mE 1hUqtժ1& KT@FބYUV `5S35S35U * Ported to Compiz and BCOP usage by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This version is completly rewritten from scratch with opacify as a * basic template. The original trailfocus was written by: * François Ingelrest and rewritten by: * Dennis Kasprzyk * * * Trailfocus modifies the opacity, brightness and saturation on a window * based on when it last had focus. * */ #include "trailfocus.h" #include COMPIZ_PLUGIN_20090315 (trailfocus, TrailfocusPluginVTable); /* Determines if a window should be handled by trailfocus or not */ bool TrailfocusScreen::isTrailfocusWindow (CompWindow *w) { CompRect input (w->inputRect ()); if (input.left () >= (int) screen->width () || input.right () <= 0 || input.top () >= (int) screen->height () || input.bottom () <= 0) { return false; } if (w->overrideRedirect ()) return false; if (w->destroyed () || !w->mapNum () || w->minimized () || w->shaded ()) return false; if (!optionGetWindowMatch ().evaluate (w)) return false; return true; } /* Walks through the window-list and sets the opacity-levels for * all windows. The inner loop will result in ts->win[i] either * representing a recently focused window, or the least * focused window. */ void TrailfocusScreen::setWindows (TrailfocusWindow *removedWindow) { bool wasTfWindow; foreach (CompWindow *w, screen->windows ()) { TrailfocusWindow *tw = TrailfocusWindow::get (w); bool needDamage; if (removedWindow == tw) continue; wasTfWindow = tw->isTfWindow; tw->isTfWindow = isTrailfocusWindow (w); needDamage = wasTfWindow != tw->isTfWindow; if (tw->isTfWindow) { unsigned int i; for (i = 0; i < windows.size (); i++) if (windows[i] == tw) break; if (memcmp (&tw->attribs, &attribs[i], sizeof (TfAttribs)) != 0) needDamage = true; if (!wasTfWindow && tw->gWindow) tw->gWindow->glPaintSetEnabled (tw, true); tw->attribs = attribs[i]; } else if (wasTfWindow && tw->gWindow) { tw->gWindow->glPaintSetEnabled (tw, false); } if (needDamage && tw->cWindow) tw->cWindow->addDamage (); } } /* Push a new window-id on the trailfocus window-stack (not to be * confused with the real window stack). Only keep one copy of a * window on the stack. If the window allready exist on the stack, * move it to the top. */ bool TrailfocusScreen::pushWindow (Window id) { CompWindow *w; TfWindowList::iterator iter; w = screen->findWindow (id); if (!w) return false; if (!isTrailfocusWindow (w)) return false; for (iter = windows.begin (); iter != windows.end (); ++iter) if ((*iter)->window->id () == id) break; if (iter == windows.begin ()) return false; if (iter != windows.end ()) windows.erase (iter); windows.insert (windows.begin (), TrailfocusWindow::get (w)); if ((int) windows.size () > optionGetWindowsCount ()) windows.pop_back (); return true; } /* Pop a window-id from the trailfocus window-stack (not to be * confused with the real window stack). Only keep one copy of a * window on the stack. Also fill the empty space with the next * window on the real window stack. */ void TrailfocusScreen::popWindow (TrailfocusWindow *tw) { CompWindow *best = NULL; TfWindowList::iterator iter; int distance, bestDist = 1000000; for (iter = windows.begin (); iter != windows.end (); ++iter) if (*iter == tw) break; if (iter == windows.end ()) return; windows.erase (iter); /* find window that was activated right before the destroyed one to fill the empty space */ foreach (CompWindow *cur, screen->windows ()) { bool present = false; if (!isTrailfocusWindow (cur)) continue; if (cur == tw->window) continue; /* we only want windows that were activated before the popped one */ if (cur->activeNum () > tw->window->activeNum ()) continue; /* we do not want any windows already present in the list */ for (unsigned int i = 0; i < windows.size (); i++) { if (windows[i]->window == cur) { present = true; break; } } if (present) continue; if (!best) { best = cur; } else { distance = abs (static_cast (cur->activeNum ()) - static_cast (best->activeNum ())); if (distance < bestDist) { best = cur; bestDist = distance; } } } if (best) windows.push_back (TrailfocusWindow::get (best)); setWindows (tw); } static bool compareActiveness (CompWindow *w1, CompWindow *w2) { return w1->activeNum () >= w2->activeNum (); } /* Walks through the existing stack and removes windows that should * (no longer) be there. Used for option-change. */ void TrailfocusScreen::refillList () { CompWindowList activeList = screen->windows (); unsigned int winMax = optionGetWindowsCount (); activeList.sort (compareActiveness); windows.clear (); foreach (CompWindow *w, activeList) { if (!isTrailfocusWindow (w)) continue; windows.push_back (TrailfocusWindow::get (w)); if (windows.size () == winMax) break; } } /* Handles the event if it was a FocusIn event. */ void TrailfocusScreen::handleEvent (XEvent *event) { switch (event->type) { case FocusIn: if (pushWindow (event->xfocus.window)) setWindows (NULL); break; case PropertyNotify: if (event->xproperty.atom == Atoms::desktopViewport) { refillList (); setWindows (NULL); } break; default: break; } screen->handleEvent (event); } /* Settings changed. Reallocate rs->inc and re-populate it and the * rest of the TrailfocusScreen (-wMask). */ void TrailfocusScreen::recalculateAttributes () { TfAttribs tmp, min, max; int i, start, winMax; start = optionGetWindowsStart () - 1; winMax = optionGetWindowsCount (); if (start >= winMax) { compLogMessage ("trailfocus", CompLogLevelWarn, "Attempting to define start higher than max windows."); start = winMax - 1; } min.opacity = optionGetMinOpacity () * OPAQUE / 100; min.brightness = optionGetMinBrightness () * BRIGHT / 100; min.saturation = optionGetMinSaturation () * COLOR / 100; max.opacity = optionGetMaxOpacity () * OPAQUE / 100; max.brightness = optionGetMaxBrightness () * BRIGHT / 100; max.saturation = optionGetMaxSaturation () * COLOR / 100; attribs.resize (winMax + 1); tmp.opacity = (max.opacity - min.opacity) / (winMax - start); tmp.brightness = (max.brightness - min.brightness) / (winMax - start); tmp.saturation = (max.saturation - min.saturation) / (winMax - start); for (i = 0; i < start; i++) attribs[i] = max; for (i = 0; i + start <= winMax; i++) { attribs[i + start].opacity = max.opacity - (tmp.opacity * i); attribs[i + start].brightness = max.brightness - (tmp.brightness * i); attribs[i + start].saturation = max.saturation - (tmp.saturation * i); } } bool TrailfocusWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { if (isTfWindow) { GLWindowPaintAttrib wAttrib (attrib); wAttrib.opacity = MIN (attrib.opacity, attribs.opacity); wAttrib.brightness = MIN (attrib.brightness, attribs.brightness); wAttrib.saturation = MIN (attrib.saturation, attribs.saturation); return gWindow->glPaint (wAttrib, transform, region, mask); } return gWindow->glPaint (attrib, transform, region, mask); } void TrailfocusScreen::optionChanged (CompOption *opt, Options num) { switch (num) { case MinOpacity: case MaxOpacity: case MinSaturation: case MaxSaturation: case MinBrightness: case MaxBrightness: case WindowsStart: case WindowsCount: recalculateAttributes (); break; default: break; } refillList (); setWindows (NULL); } bool TrailfocusScreen::setupTimerCb () { TrailfocusScreen *ts = TrailfocusScreen::get (screen); ts->refillList (); ts->setWindows (NULL); return false; } TrailfocusScreen::TrailfocusScreen (CompScreen *s) : PluginClassHandler (s), TrailfocusOptions () { ChangeNotify optionCb = boost::bind (&TrailfocusScreen::optionChanged, this, _1, _2); optionSetWindowMatchNotify (optionCb); optionSetWindowsCountNotify (optionCb); optionSetWindowsStartNotify (optionCb); optionSetMinOpacityNotify (optionCb); optionSetMaxOpacityNotify (optionCb); optionSetMinSaturationNotify (optionCb); optionSetMaxSaturationNotify (optionCb); optionSetMinBrightnessNotify (optionCb); optionSetMaxBrightnessNotify (optionCb); ScreenInterface::setHandler (screen); recalculateAttributes (); setupTimer.start (setupTimerCb, 0, 0); } TrailfocusWindow::TrailfocusWindow (CompWindow *w) : PluginClassHandler (w), isTfWindow (false), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)) { attribs.opacity = OPAQUE; attribs.brightness = BRIGHT; attribs.saturation = COLOR; GLWindowInterface::setHandler (gWindow, false); } TrailfocusWindow::~TrailfocusWindow () { /* Since we are popping the window from the stack * gWindow and cWindow are invalidated. Set them to * NULL so that their functions cannot be called */ gWindow = NULL; cWindow = NULL; TrailfocusScreen::get (screen)->popWindow (this); } bool TrailfocusPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/trailfocus/src/trailfocus.h0000644000004100000410000000500713246301623020214 0ustar www-datawww-data/** * Beryl Trailfocus - take three * * Copyright (c) 2006 Kristian Lyngstøl * Ported to Compiz and BCOP usage by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This version is completly rewritten from scratch with opacify as a * basic template. The original trailfocus was written by: * François Ingelrest and rewritten by: * Dennis Kasprzyk * * * Trailfocus modifies the opacity, brightness and saturation on a window * based on when it last had focus. * */ #include #include #include #include #include "trailfocus_options.h" typedef struct { GLushort opacity; GLushort brightness; GLushort saturation; } TfAttribs; class TrailfocusWindow : public GLWindowInterface, public PluginClassHandler { public: TrailfocusWindow (CompWindow *); ~TrailfocusWindow (); bool glPaint (const GLWindowPaintAttrib&, const GLMatrix&, const CompRegion&, unsigned int); bool isTfWindow; TfAttribs attribs; CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; }; class TrailfocusScreen : public ScreenInterface, public PluginClassHandler, public TrailfocusOptions { public: TrailfocusScreen (CompScreen *); void handleEvent (XEvent *); bool pushWindow (Window); void popWindow (TrailfocusWindow *); private: bool isTrailfocusWindow (CompWindow *); void setWindows (TrailfocusWindow *); void refillList (); void recalculateAttributes (); void optionChanged (CompOption *, Options); static bool setupTimerCb (); typedef std::vector TfWindowList; TfWindowList windows; std::vector attribs; CompTimer setupTimer; }; class TrailfocusPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/trailfocus/trailfocus.xml.in0000644000004100000410000000704013246301623020402 0ustar www-datawww-data <_short>Trailfocus <_long>Adjust the opacity, saturation and brightness of windows based on when they last had focus. Effects opengl composite opengl fade decor <_short>Behaviour <_short>Appearance <_short>Opacity <_short>Brightness <_short>Saturation ./plugins/rotate/0000755000004100000410000000000013246301624014223 5ustar www-datawww-data./plugins/rotate/CMakeLists.txt0000644000004100000410000000015613246301623016764 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(rotate PLUGINDEPS composite opengl cube)./plugins/rotate/src/0000755000004100000410000000000013246301624015012 5ustar www-datawww-data./plugins/rotate/src/rotate.cpp0000644000004100000410000006464213246301623017027 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "rotate.h" #include #include static const float ROTATE_POINTER_SENSITIVITY_FACTOR = 0.05f; COMPIZ_PLUGIN_20090315 (rotate, RotatePluginVTable) bool RotateScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = RotateOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case RotateOptions::Sensitivity: mPointerSensitivity = optionGetSensitivity () * ROTATE_POINTER_SENSITIVITY_FACTOR; break; default: break; } return rv; } bool RotateScreen::adjustVelocity (int size, int invert) { float xrot; if (mMoving) xrot = mMoveTo + (mXrot + mBaseXrot); else { xrot = mXrot; if (mXrot < -180.0f / size) xrot = 360.0f / size + mXrot; else if (mXrot > 180.0f / size) xrot = mXrot - 360.0f / size; } float adjust = -xrot * 0.05f * optionGetAcceleration (); float amount = fabs (xrot); if (amount < 10.0f) amount = 10.0f; else if (amount > 30.0f) amount = 30.0f; if (mSlow) adjust *= 0.05f; mXVelocity = (amount * mXVelocity + adjust) / (amount + 2.0f); float yrot = mYrot; /* Only snap if more than 2 viewports */ if (size > 2) { if (mYrot > 50.0f && ((mSnapTop && invert == 1) || (mSnapBottom && invert != 1))) yrot -= 90.f; else if (mYrot < -50.0f && ((mSnapTop && invert != 1) || (mSnapBottom && invert == 1))) yrot += 90.f; } adjust = -yrot * 0.05f * optionGetAcceleration (); amount = fabs (mYrot); if (amount < 10.0f) amount = 10.0f; else if (amount > 30.0f) amount = 30.0f; mYVelocity = (amount * mYVelocity + adjust) / (amount + 2.0f); return (fabs (xrot) < 0.1f && fabs (mXVelocity) < 0.2f && fabs (yrot) < 0.1f && fabs (mYVelocity) < 0.2f); } void RotateScreen::releaseMoveWindow () { mMoveWindow = None; } void RotateScreen::preparePaint (int msSinceLastPaint) { float oldXrot = mXrot + mBaseXrot; if (mGrabIndex || mMoving) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mXrot += mXVelocity * chunk; mYrot += mYVelocity * chunk; if (mXrot > 360.0f / screen->vpSize ().width ()) { mBaseXrot += 360.0f / screen->vpSize ().width (); mXrot -= 360.0f / screen->vpSize ().width (); } else if (mXrot < 0.0f) { mBaseXrot -= 360.0f / screen->vpSize ().width (); mXrot += 360.0f / screen->vpSize ().width (); } if (cubeScreen->invert () == -1) { if (mYrot > 45.0f) { mYVelocity = 0.0f; mYrot = 45.0f; } else if (mYrot < -45.0f) { mYVelocity = 0.0f; mYrot = -45.0f; } } else { if (mYrot > 100.0f) { mYVelocity = 0.0f; mYrot = 100.0f; } else if (mYrot < -100.0f) { mYVelocity = 0.0f; mYrot = -100.0f; } } if (mGrabbed) { mXVelocity /= 1.25f; mYVelocity /= 1.25f; if (fabs (mXVelocity) < 0.01f) mXVelocity = 0.0f; if (fabs (mYVelocity) < 0.01f) mYVelocity = 0.0f; } else if (adjustVelocity (screen->vpSize ().width (), cubeScreen->invert ())) { mXVelocity = 0.0f; mYVelocity = 0.0f; if (fabs (mYrot) < 0.1f) { CompOption::Vector o (0); int tx; float xrot = mBaseXrot + mXrot; if (xrot < 0.0f) tx = (screen->vpSize ().width () * xrot / 360.0f) - 0.5f; else tx = (screen->vpSize ().width () * xrot / 360.0f) + 0.5f; /* flag end of rotation */ cubeScreen->rotationState (CubeScreen::RotationNone); screen->moveViewport (tx, 0, true); mBaseXrot = mMoveTo = mXrot = mYrot = 0.0f; mMoving = false; if (mGrabIndex) { screen->removeGrab (mGrabIndex, &mSavedPointer); mGrabIndex = 0; } if (mMoveWindow) { CompWindow *w = screen->findWindow (mMoveWindow); if (w) w->move (mMoveWindowX - w->x (), 0); } /* only focus default window if switcher isn't active */ else if (!screen->grabExist ("switcher")) screen->focusDefaultWindow (); mMoveWindow = 0; screen->handleCompizEvent ("rotate", "end_viewport_switch", o); } break; } } if (mMoveWindow) { CompWindow *w = screen->findWindow (mMoveWindow); if (w) { float xrot = (screen->vpSize ().width () * (mBaseXrot + mXrot)) / 360.0f; w->moveToViewportPosition (mMoveWindowX - xrot * screen->width (), w->y (), false); } } } if (mMoving) { if (fabs (mXrot + mBaseXrot + mMoveTo) <= 180 / screen->vpSize ().width ()) mProgress = fabs (mXrot + mBaseXrot + mMoveTo) / 180 / screen->vpSize ().width (); else if (fabs (mXrot + mBaseXrot) <= 180 / screen->vpSize ().width ()) mProgress = fabs (mXrot + mBaseXrot) / 180 / screen->vpSize ().width (); else { mProgress += fabs (mXrot + mBaseXrot - oldXrot) / 180 / (screen->vpSize ().width ()); mProgress = MIN (mProgress, 1.0); } } else if (mProgress != 0.0f || mGrabbed) { float amount = msSinceLastPaint * 0.05f * optionGetSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { float dt; if (mGrabbed) dt = 1.0 - mProgress; else dt = 0.0f - mProgress; float adjust = dt * 0.15f; float tamount = fabs (dt) * 1.5f; if (tamount < 0.2f) tamount = 0.2f; else if (tamount > 2.0f) tamount = 2.0f; mProgressVelocity = (tamount * mProgressVelocity + adjust) / (tamount + 1.0f); mProgress += mProgressVelocity * chunk; if (fabs (dt) < 0.01f && fabs (mProgressVelocity) < 0.0001f) { if (mGrabbed) mProgress = 1.0f; else mProgress = 0.0f; break; } } } if (cubeScreen->invert () == 1 && !cubeScreen->unfolded ()) mZoomTranslate = optionGetZoom () * mProgress; else mZoomTranslate = 0.0; cScreen->preparePaint (msSinceLastPaint); } void RotateScreen::donePaint () { if ((mGrabIndex || mMoving || (mProgress != 0.0 && mProgress != 1.0)) && ((!mGrabbed && !mSnapTop && !mSnapBottom) || mXVelocity || mYVelocity || mProgressVelocity)) cScreen->damageScreen (); cScreen->donePaint (); } void RotateScreen::cubeGetRotation (float &x, float &v, float &progress) { cubeScreen->cubeGetRotation (x, v, progress); x += mBaseXrot + mXrot; v += mYrot; progress = MAX (progress, mProgress); } bool RotateScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mGrabIndex || mMoving || mProgress != 0.0f) { GLMatrix sTransform = transform; sTransform.translate (0.0f, 0.0f, -mZoomTranslate); mask &= ~PAINT_SCREEN_REGION_MASK; mask |= PAINT_SCREEN_TRANSFORMED_MASK; return gScreen->glPaintOutput (sAttrib, sTransform, region, output, mask); } return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } bool RotateScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompOption::Vector o (0); if (screen->vpSize ().width () < 2) return false; if (mRotateTimer.active () && mGrabWindow) { if (screen->otherGrabExist ("rotate", "move", NULL)) return false; } else if (screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) return false; mMoving = false; mSlow = false; /* Set the rotation state for cube - if action is non-NULL, * we set it to manual (as we were called from the 'Initiate * Rotation' binding. Otherwise, we set it to Change. */ if (action) cubeScreen->rotationState (CubeScreen::RotationManual); else cubeScreen->rotationState (CubeScreen::RotationChange); screen->handleCompizEvent ("rotate", "start_viewport_switch", o); if (!mGrabIndex) { mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "rotate"); if (mGrabIndex) { int x = CompOption::getIntOptionNamed (options, "x"); int y = CompOption::getIntOptionNamed (options, "y"); mSavedPointer.set (x, y); } } if (mGrabIndex) { mMoveTo = 0.0f; mGrabbed = true; mSnapTop = optionGetSnapTop (); mSnapBottom = optionGetSnapBottom (); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); } return true; } bool RotateScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root"); if ((!xid || screen->root () == xid) && mGrabIndex) { if (!xid) { mSnapTop = false; mSnapBottom = false; } mGrabbed = false; cScreen->damageScreen (); } action->setState (action->state () & ~(CompAction::StateTermButton | CompAction::StateTermKey)); return false; } bool RotateScreen::rotate (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction) { if (screen->vpSize ().width () < 2 || !direction || screen->otherGrabExist ("rotate", "move", "switcher", "group-drag", "cube", NULL)) return false; if (mMoveWindow) releaseMoveWindow (); /* we allow the grab to fail here so that we can rotate on drag-and-drop */ if (!mGrabIndex) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", 0)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", 0)); initiate (NULL, 0, o); } mMoving = true; mMoveTo += 360.0f / screen->vpSize ().width () * direction; mGrabbed = false; cScreen->damageScreen (); return false; } bool RotateScreen::rotateWithWindow (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction) { if (screen->vpSize ().width () < 2 || !direction) return false; Window xid = CompOption::getIntOptionNamed (options, "window"); if (mMoveWindow != xid) { releaseMoveWindow (); if (!mGrabIndex && !mMoving) { CompWindow *w = screen->findWindow (xid); if (w && !(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask)) && !(w->state () & CompWindowStateStickyMask)) { mMoveWindow = w->id (); mMoveWindowX = w->x (); if (optionGetRaiseOnRotate ()) w->raise (); } } } if (!mGrabIndex) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", 0)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", 0)); initiate (NULL, 0, o); } if (mGrabIndex) { mMoving = true; mMoveTo += 360.0f / screen->vpSize ().width () * direction; mGrabbed = false; cScreen->damageScreen (); } return false; } bool RotateScreen::rotateFlip (int direction) { if (screen->otherGrabExist ("rotate", "move", "group-drag", NULL)) return false; CompOption::Vector o (0); mMoveTo = 0.0f; mSlow = false; int warpX = pointerX - (screen->width () * direction); if (direction == -1) screen->warpPointer (screen->width () - 10, 0); else screen->warpPointer (10 - screen->width (), 0); lastPointerX = warpX; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (0); o[2].value ().set (pointerY); rotate (NULL, 0, o, direction); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, direction, 0); mSavedPointer.setX (lastPointerX + (9 * direction)); return false; } bool RotateScreen::rotateEdgeFlip (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction) { CompOption::Vector o (0); if (screen->vpSize ().width () < 2 || screen->otherGrabExist ("rotate", "move", "group-drag", NULL)) return false; if (state & CompAction::StateInitEdgeDnd) { if (!optionGetEdgeFlipDnd ()) return false; } else if (screen->otherGrabExist ("rotate", "group-drag", NULL)) { if (!optionGetEdgeFlipWindow () || !mGrabWindow || /* bail out if window is horizontally maximized, fullscreen * or sticky */ mGrabWindow->state () & (CompWindowStateMaximizedHorzMask | CompWindowStateFullscreenMask | CompWindowStateStickyMask)) return false; } else if (screen->otherGrabExist ("rotate", NULL)) { /* in that case, 'group-drag' must be the active screen grab */ if (!optionGetEdgeFlipWindow ()) return false; } else if (!optionGetEdgeFlipPointer ()) return false; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", 0)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", 0)); if (optionGetFlipTime () == 0 || (mMoving && !mSlow)) { int pointerDx = pointerX - lastPointerX; int warpX; /* TODO: Eliminate those magic numbers here */ if (direction == -1) { warpX = pointerX + screen->width (); screen->warpPointer (screen->width () - 10, 0); lastPointerX = warpX - pointerDx; rotate (NULL, 0, o, direction); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, -1, 0); mSavedPointer.setX (lastPointerX - 9); } else { warpX = pointerX - screen->width (); screen->warpPointer (10 - screen->width (), 0); lastPointerX = warpX - pointerDx; rotate (NULL, 0, o, direction); XWarpPointer (screen->dpy (), None, None, 0, 0, 0, 0, 1, 0); mSavedPointer.setX (lastPointerX + 9); } } else { if (!mRotateTimer.active ()) mRotateTimer.start (boost::bind (&RotateScreen::rotateFlip, this, direction), optionGetFlipTime (), (float) optionGetFlipTime () * 1.2); mMoving = true; mMoveTo += 360.0f / screen->vpSize ().width () * direction; mSlow = true; if (state & CompAction::StateInitEdge) action->setState (action->state () | CompAction::StateTermEdge); if (state & CompAction::StateInitEdgeDnd) action->setState (action->state () | CompAction::StateTermEdgeDnd); cScreen->damageScreen (); } return false; } bool RotateScreen::flipTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root", 0); if (xid && screen->root () != xid) return false; if (mRotateTimer.active ()) { mRotateTimer.stop (); if (mSlow) { mMoveTo = 0.0f; mSlow = false; } cScreen->damageScreen (); } action->setState (action->state () & ~(CompAction::StateTermEdge | CompAction::StateTermEdgeDnd)); return false; } int RotateScreen::rotateToDirection (int face) { int delta = face - screen->vp ().x () - (mMoveTo / (360.0f / screen->vpSize ().width ())); if (delta > screen->vpSize ().width () / 2) delta -= screen->vpSize ().width (); else if (delta < -(screen->vpSize ().width () / 2)) delta += screen->vpSize ().width (); return delta; } bool RotateScreen::rotateTo (CompAction *action, CompAction::State state, CompOption::Vector &options, int face, bool withWindow) { CompOption::Vector o (0); if (face < 0) face = CompOption::getIntOptionNamed (options, "face", screen->vp ().x ()); if (face > screen->vpSize ().width ()) return false; o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (CompOption::getIntOptionNamed (options, "x", pointerX)); o[2].value ().set (CompOption::getIntOptionNamed (options, "y", pointerY)); if (withWindow) { o.push_back (CompOption ("window", CompOption::TypeInt)); o[3].value ().set (CompOption::getIntOptionNamed (options, "window", 0)); rotateWithWindow (NULL, 0, o, rotateToDirection (face)); } else rotate (NULL, 0, o, rotateToDirection (face)); return false; } void RotateScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: if (screen->root () == event->xmotion.root && mGrabIndex) { if (mGrabbed) { GLfloat pointerDx = pointerX - lastPointerX; GLfloat pointerDy = pointerY - lastPointerY; // TODO: Eliminate magic numbers here if (event->xmotion.x_root < 50 || event->xmotion.y_root < 50 || event->xmotion.x_root > screen->width () - 50 || event->xmotion.y_root > screen->height () - 50) screen->warpPointer ((screen->width () / 2) - pointerX, (screen->height () / 2) - pointerY); if (optionGetInvertY ()) pointerDy = -pointerDy; mXVelocity += pointerDx * mPointerSensitivity * cubeScreen->invert (); mYVelocity += pointerDy * mPointerSensitivity; cScreen->damageScreen (); } else { mSavedPointer.setX (mSavedPointer.x () + pointerX - lastPointerX); mSavedPointer.setY (mSavedPointer.y () + pointerY - lastPointerY); } } break; case ClientMessage: if (event->xclient.message_type == Atoms::desktopViewport) { if (screen->root () == event->xclient.window) { if (screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) break; /* reset movement */ mMoveTo = 0.0f; int dx = (event->xclient.data.l[0] / screen->width ()) - screen->vp ().x (); if (dx) { Window win; int i, x, y; unsigned int ui; CompOption::Vector o (0); XQueryPointer (screen->dpy (), screen->root (), &win, &win, &x, &y, &i, &i, &ui); if (dx * 2 > screen->vpSize ().width ()) dx -= screen->vpSize ().width (); else if (dx * 2 < -screen->vpSize ().width ()) dx += screen->vpSize ().width (); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (x); o[2].value ().set (y); rotate (NULL, 0, o, dx); } } } break; default: break; } screen->handleEvent (event); } void RotateWindow::activate () { if (window->placed () && !screen->otherGrabExist ("rotate", "switcher", "cube", NULL)) { /* reset movement */ rScreen->mMoveTo = 0.0f; int dx = window->defaultViewport ().x (); dx -= screen->vp ().x (); if (dx) { Window win; int i, x, y; unsigned int ui; CompOption::Vector o (0); XQueryPointer (screen->dpy (), screen->root (), &win, &win, &x, &y, &i, &i, &ui); if (dx * 2 > screen->vpSize ().width ()) dx -= screen->vpSize ().width (); else if (dx * 2 < -screen->vpSize ().width ()) dx += screen->vpSize ().width (); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("x", CompOption::TypeInt)); o.push_back (CompOption ("y", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (x); o[2].value ().set (y); rScreen->rotate (NULL, 0, o, dx); } } window->activate (); } void RotateWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { if (!rScreen->mGrabWindow) { rScreen->mGrabMask = mask; rScreen->mGrabWindow = window; } window->grabNotify (x, y, state, mask); } void RotateWindow::ungrabNotify () { if (window == rScreen->mGrabWindow) { rScreen->mGrabMask = 0; rScreen->mGrabWindow = NULL; } window->ungrabNotify (); } RotateScreen::RotateScreen (CompScreen *s) : PluginClassHandler (s), gScreen (GLScreen::get (s)), cScreen (CompositeScreen::get (s)), cubeScreen (CubeScreen::get (s)), mSnapTop (false), mSnapBottom (false), mGrabIndex (0), mXrot (0.0f), mXVelocity (0.0f), mYrot (0.0f), mYVelocity (0.0f), mBaseXrot (0.0f), mMoving (false), mMoveTo (0.0f), mMoveWindow (0), mMoveWindowX (0), mSavedPointer (0,0), mGrabbed (false), mSlow (false), mGrabMask (0), mGrabWindow (0), mProgress (0.0f), mProgressVelocity (0.0f), mZoomTranslate (0.0f) { mPointerSensitivity = optionGetSensitivity () * ROTATE_POINTER_SENSITIVITY_FACTOR; #define ROTATEBIND(name) boost::bind (&RotateScreen::name, this, _1, _2, _3) #define ROTATEBINDOPT(name, ...) boost::bind (&RotateScreen::name, this, _1, _2, _3, __VA_ARGS__) optionSetInitiateButtonInitiate (ROTATEBIND (initiate)); optionSetInitiateButtonTerminate (ROTATEBIND (terminate)); optionSetRotateLeftKeyInitiate (ROTATEBINDOPT (rotate, -1)); optionSetRotateLeftButtonInitiate (ROTATEBINDOPT (rotate, -1)); optionSetRotateRightKeyInitiate (ROTATEBINDOPT (rotate, 1)); optionSetRotateRightButtonInitiate (ROTATEBINDOPT (rotate, 1)); optionSetRotateLeftWindowKeyInitiate (ROTATEBINDOPT (rotateWithWindow, -1)); optionSetRotateLeftWindowButtonInitiate (ROTATEBINDOPT (rotateWithWindow, -1)); optionSetRotateRightWindowKeyInitiate (ROTATEBINDOPT (rotateWithWindow, 1)); optionSetRotateRightWindowButtonInitiate (ROTATEBINDOPT (rotateWithWindow, 1)); optionSetRotateTo1KeyInitiate (ROTATEBINDOPT(rotateTo, 0, false)); optionSetRotateTo2KeyInitiate (ROTATEBINDOPT(rotateTo, 1, false)); optionSetRotateTo3KeyInitiate (ROTATEBINDOPT(rotateTo, 2, false)); optionSetRotateTo4KeyInitiate (ROTATEBINDOPT(rotateTo, 3, false)); optionSetRotateTo5KeyInitiate (ROTATEBINDOPT(rotateTo, 4, false)); optionSetRotateTo6KeyInitiate (ROTATEBINDOPT(rotateTo, 5, false)); optionSetRotateTo7KeyInitiate (ROTATEBINDOPT(rotateTo, 6, false)); optionSetRotateTo8KeyInitiate (ROTATEBINDOPT(rotateTo, 7, false)); optionSetRotateTo9KeyInitiate (ROTATEBINDOPT(rotateTo, 8, false)); optionSetRotateTo10KeyInitiate (ROTATEBINDOPT(rotateTo, 9, false)); optionSetRotateTo11KeyInitiate (ROTATEBINDOPT(rotateTo, 10, false)); optionSetRotateTo12KeyInitiate (ROTATEBINDOPT(rotateTo, 11, false)); optionSetRotateTo1WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 0, true)); optionSetRotateTo2WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 1, true)); optionSetRotateTo3WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 2, true)); optionSetRotateTo4WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 3, true)); optionSetRotateTo5WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 4, true)); optionSetRotateTo6WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 5, true)); optionSetRotateTo7WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 6, true)); optionSetRotateTo8WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 7, true)); optionSetRotateTo9WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 8, true)); optionSetRotateTo10WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 9, true)); optionSetRotateTo11WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 10, true)); optionSetRotateTo12WindowKeyInitiate (ROTATEBINDOPT(rotateTo, 11, true)); optionSetRotateToKeyInitiate (ROTATEBINDOPT(rotateTo, -1, false)); optionSetRotateWindowKeyInitiate (ROTATEBINDOPT(rotateTo, -1, true)); optionSetRotateFlipLeftEdgeInitiate (ROTATEBINDOPT(rotateEdgeFlip, -1)); optionSetRotateFlipLeftEdgeTerminate (ROTATEBIND (flipTerminate)); optionSetRotateFlipRightEdgeInitiate (ROTATEBINDOPT(rotateEdgeFlip, 1)); optionSetRotateFlipRightEdgeTerminate (ROTATEBIND (flipTerminate)); #undef ROTATEBIND #undef ROTATEBINDOPT ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); CubeScreenInterface::setHandler (cubeScreen); } RotateWindow::RotateWindow (CompWindow *w) : PluginClassHandler (w), window (w), rScreen (RotateScreen::get (screen)) { WindowInterface::setHandler (window); } bool RotatePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("cube", COMPIZ_CUBE_ABI)) return true; return false; } ./plugins/rotate/src/rotate.h0000644000004100000410000001143213246301623016461 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _ROTATE_H #define _ROTATE_H #include #include #include #include #include #include "rotate_options.h" #define ROTATE_SCREEN(s) RotateScreen *rs = RotateScreen::get(s) #define ROTATE_WINDOW(w) RotateWindow *rw = RotateWindow::get(w) class RotateScreen : public PluginClassHandler, public GLScreenInterface, public CompositeScreenInterface, public CubeScreenInterface, public ScreenInterface, public RotateOptions { public: RotateScreen (CompScreen *s); ~RotateScreen () {}; bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *event); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void cubeGetRotation (float &x, float &v, float &progress); bool adjustVelocity (int size, int invert); void releaseMoveWindow (); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool rotate (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction); bool rotateWithWindow (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction); bool rotateFlip (int direction); bool rotateEdgeFlip (CompAction *action, CompAction::State state, CompOption::Vector &options, int direction); bool flipTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options); int rotateToDirection (int face); bool rotateTo (CompAction *action, CompAction::State state, CompOption::Vector &options, int face, bool withWindow); public: GLScreen *gScreen; CompositeScreen *cScreen; CubeScreen *cubeScreen; float mPointerSensitivity; bool mSnapTop; bool mSnapBottom; CompScreen::GrabHandle mGrabIndex; GLfloat mXrot, mXVelocity; GLfloat mYrot, mYVelocity; GLfloat mBaseXrot; bool mMoving; GLfloat mMoveTo; Window mMoveWindow; int mMoveWindowX; CompPoint mSavedPointer; bool mGrabbed; CompTimer mRotateTimer; bool mSlow; unsigned int mGrabMask; CompWindow *mGrabWindow; float mProgress; float mProgressVelocity; GLfloat mZoomTranslate; }; class RotateWindow : public PluginClassHandler, public WindowInterface { public: RotateWindow (CompWindow *w); ~RotateWindow () {}; void grabNotify (int x, int y, unsigned int state, unsigned int mask); void ungrabNotify (); void activate (); public: CompWindow *window; RotateScreen *rScreen; }; class RotatePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif ./plugins/rotate/rotate.xml.in0000644000004100000410000002237013246301623016653 0ustar www-datawww-data <_short>Rotate Cube <_long>Rotate desktop cube Desktop cube cube decor <_short>Additional Settings <_short>Bindings <_short>Rotate cube <_short>Rotate to cube face <_short>Rotate to cube face with window ./plugins/wizard/0000755000004100000410000000000013246301624014225 5ustar www-datawww-data./plugins/wizard/CMakeLists.txt0000644000004100000410000000016513246301623016766 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (wizard PLUGINDEPS composite opengl mousepoll) ./plugins/wizard/include/0000755000004100000410000000000013246301624015650 5ustar www-datawww-data./plugins/wizard/include/wizard.h0000644000004100000410000001360113246301623017321 0ustar www-datawww-data/* * Compiz wizard particle system plugin * * wizard.h * * Written by : Sebastian Kuhlen * E-mail : DiCon@tankwar.de * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This plugin and parts of its code have been inspired by the showmouse plugin * by Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include "wizard_options.h" #include "wizard_tex.h" extern const unsigned short CACHESIZE_FACTOR; extern const unsigned short COORD_COMPONENTS; extern const unsigned short VERTEX_COMPONENTS; extern const unsigned short COLOR_COMPONENTS; static float rRange (float avg, float range) { return avg + (float)((random () & 0xff)/127.5-1.)*range; } typedef enum { TRIGGER_PERSISTENT = 0, TRIGGER_MOUSEMOVEMENT, TRIGGER_RANDOMSHOT, TRIGGER_RANDOMPERIOD } TriggerType; typedef enum { MOVEMENT_MOUSEPOSITION = 0, MOVEMENT_FOLLOWMOUSE, MOVEMENT_BOUNCE, MOVEMENT_WRAP } MovementType; class GPoint { public: float strength; // Strength of this gravity source float x; // X position float y; // Y position float espeed; // Speed of the gravity source float eangle; // Angle for the movement of this gravity source int movement; // Type of movement of this gravity source }; class Particle { public: float c[3]; // Color float a; // alpha value float x; // X position float y; // Y position float t; // t position (age, born at 1, dies at 0) float phi; // Orientation of texture float vx; // X speed float vy; // Y speed float vt; // t speed (aging speed) float vphi; // Rotation speed float s; // size (side of the square) float snew; // Size when born (reduced to s while new) float g; // Gravity from this particle }; class Emitter { public: bool set_active; // Set to active in the settings bool active; // Currently active (differs from set_active for // the random period trigger) int trigger; // When to generate particles int count; // Amount of particles to be generated float h; // color hue (0..1) float dh; // color hue range float l; // color lightness (0..1) float dl; // color lightness range float a; // Alpha float da; // Alpha range float x; // X position float y; // Y position float espeed; // Speed of the emitter float eangle; // Angle for the movement of this emitter int movement; // Type of movement of this emitter float dx; // X range float dy; // Y range float dcirc; // Circular range float vx; // X speed float vy; // Y speed float vt; // t speed (aging speed) float vphi; // Rotation speed float dvx; // X speed range float dvy; // Y speed range float dvcirc; // Circular speed range float dvt; // t speed (aging speed) range float dvphi; // Rotation speed range float s; // size (side of the square) float ds; // size (side of the square) range float snew; // Size when born (reduced to s while new) float dsnew; // Size when born (reduced to s while new) range float g; // Gravity of particles float dg; // Gravity range float gp; // Part of particles that have gravity }; class ParticleSystem { public: ParticleSystem (); int hardLimit; // Not to be exceeded int softLimit; // If exceeded, old particles age faster int lastCount; // Living particle count to evaluate softLimit float tnew; // Particle is new if t > tnew float told; // Particle is old if t < told float gx; // Global gravity x float gy; // Global gravity y std::vector particles; // The actual particles GLuint tex; // Particle Texture bool active, init; float darken; // Darken background GLuint blendMode; std::vector e; // All emitters in here std::vector g; // All gravity point sources in here /* Cache used in drawParticles It's here to avoid multiple mem allocation during drawing */ std::vector vertices_cache; std::vector coords_cache; std::vector colors_cache; std::vector dcolors_cache; void initParticles (int f_hardLimit, int f_softLimit); void drawParticles (const GLMatrix &transform); void updateParticles (float time); void genNewParticles (Emitter *e); void finiParticles (); }; class WizardScreen : public PluginClassHandler , public WizardOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: WizardScreen (CompScreen *screen); ~WizardScreen (); CompositeScreen *cScreen; GLScreen *gScreen; int mx, my; //Mouse Position from polling bool active; ParticleSystem ps; MousePoller pollHandle; void loadGPoints (); void loadEmitters (); void positionUpdate (const CompPoint &pos); void preparePaint (int time); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &sa, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); bool toggle (); void toggleFunctions(bool enabled); void optionChanged (CompOption *opt, WizardOptions::Options num); }; class WizardPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; COMPIZ_PLUGIN_20090315 (wizard, WizardPluginVTable); ./plugins/wizard/include/wizard_tex.h0000644000004100000410000065640513246301623020220 0ustar www-datawww-data/* * Compiz wizard particle system plugin * Texture of a single particle. Generated using GIMP. * * wizard_tex.h * * Written by : Sebastian Kuhlen * E-mail : DiCon@tankwar.de * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This plugin and parts of its code have been inspired by the showmouse plugin * by Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ static const unsigned char particleTex[65536] = { "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377" "\7\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377" "\7\377\377\377\6\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377" "\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377" "\3\377\377\377\2\377\377\377\1\377\377\377\2\377\377\377\4\377\377\377\5" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\10" "\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377" "\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\2" "\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\10\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\3\377\377" "\377\2\377\377\377\1\377\377\377\3\377\377\377\5\377\377\377\6\377\377\377" "\10\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377" "\377\10\377\377\377\7\377\377\377\5\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\7\377\377\377\11\377\377\377\14" "\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377" "\377\377\12\377\377\377\11\377\377\377\7\377\377\377\5\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\4\377\377\377\6\377\377\377\10\377\377" "\377\13\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377" "\7\377\377\377\5\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\4" "\377\377\377\6\377\377\377\11\377\377\377\14\377\377\377\15\377\377\377\15" "\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\13\377\377\377\10\377\377\377\6\377\377" "\377\4\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\7\377\377\377" "\12\377\377\377\15\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\5\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\14\377\377\377\13\377\377\377\10\377\377\377\6\377\377\377\4" "\377\377\377\2\377\377\377\3\377\377\377\5\377\377\377\10\377\377\377\13" "\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377" "\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\11\377\377\377\11\377\377\377\13" "\377\377\377\14\377\377\377\14\377\377\377\12\377\377\377\7\377\377\377\5" "\377\377\377\2\377\377\377\3\377\377\377\6\377\377\377\11\377\377\377\15" "\377\377\377\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377" "\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\4\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6" "\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\13\377\377\377\15\377\377\377\16\377\377\377\12\377\377\377" "\7\377\377\377\5\377\377\377\2\377\377\377\4\377\377\377\7\377\377\377\13" "\377\377\377\16\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377" "\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\4\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377" "\377\10\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\17\377\377\377\13\377\377\377\10\377\377\377\5\377\377\377\3\377\377\377" "\4\377\377\377\10\377\377\377\14\377\377\377\20\377\377\377\22\377\377\377" "\22\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377" "\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\7" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\14\377\377\377" "\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377" "\13\377\377\377\10\377\377\377\5\377\377\377\3\377\377\377\5\377\377\377" "\11\377\377\377\15\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\16\377\377\377" "\15\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377" "\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\5\377\377\377" "\3\377\377\377\3\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\10\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377" "\14\377\377\377\15\377\377\377\17\377\377\377\21\377\377\377\15\377\377\377" "\11\377\377\377\5\377\377\377\3\377\377\377\5\377\377\377\12\377\377\377" "\17\377\377\377\25\377\377\377\25\377\377\377\24\377\377\377\22\377\377\377" "\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\6\377\377\377\4\377\377\377\3\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\11" "\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\7\377\377\377\10\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\20\377\377\377\20\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377" "\14\377\377\377\16\377\377\377\20\377\377\377\22\377\377\377\16\377\377\377" "\12\377\377\377\5\377\377\377\3\377\377\377\6\377\377\377\13\377\377\377" "\20\377\377\377\27\377\377\377\26\377\377\377\24\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377" "\11\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\7\377" "\377\377\10\377\377\377\11\377\377\377\14\377\377\377\16\377\377\377\16\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\10\377" "\377\377\7\377\377\377\10\377\377\377\12\377\377\377\14\377\377\377\15\377" "\377\377\20\377\377\377\22\377\377\377\20\377\377\377\17\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\14\377\377\377\17\377\377\377\21\377\377\377\23\377\377\377\17\377" "\377\377\12\377\377\377\6\377\377\377\3\377\377\377\7\377\377\377\15\377" "\377\377\22\377\377\377\30\377\377\377\27\377\377\377\25\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377\17\377" "\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377" "\377\377\10\377\377\377\6\377\377\377\4\377\377\377\3\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6" "\377\377\377\7\377\377\377\11\377\377\377\13\377\377\377\15\377\377\377\17" "\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377" "\15\377\377\377\20\377\377\377\22\377\377\377\23\377\377\377\20\377\377\377" "\16\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377" "\14\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377" "\20\377\377\377\12\377\377\377\7\377\377\377\4\377\377\377\10\377\377\377" "\16\377\377\377\26\377\377\377\32\377\377\377\30\377\377\377\26\377\377\377" "\24\377\377\377\22\377\377\377\22\377\377\377\21\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\7\377\377\377\5\377\377\377\3\377\377\377\2\377\377\377\1" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\12\377\377\377\14" "\377\377\377\16\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377" "\16\377\377\377\15\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\12\377\377\377\15\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377" "\23\377\377\377\21\377\377\377\16\377\377\377\14\377\377\377\12\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\14\377\377\377\16\377\377\377\20\377\377\377\23\377\377\377" "\26\377\377\377\21\377\377\377\13\377\377\377\7\377\377\377\4\377\377\377" "\12\377\377\377\20\377\377\377\30\377\377\377\33\377\377\377\31\377\377\377" "\27\377\377\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\11\377\377\377\7\377\377\377\4\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\4\377\377\377\5\377\377\377\5" "\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\6\377\377" "\377\7\377\377\377\10\377\377\377\12\377\377\377\15\377\377\377\20\377\377" "\377\23\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377\377" "\377\14\377\377\377\12\377\377\377\12\377\377\377\14\377\377\377\16\377\377" "\377\21\377\377\377\24\377\377\377\26\377\377\377\23\377\377\377\20\377\377" "\377\16\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377" "\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\16\377\377" "\377\21\377\377\377\23\377\377\377\27\377\377\377\22\377\377\377\14\377\377" "\377\7\377\377\377\5\377\377\377\13\377\377\377\22\377\377\377\34\377\377" "\377\35\377\377\377\33\377\377\377\30\377\377\377\26\377\377\377\25\377\377" "\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377\377\17\377\377" "\377\16\377\377\377\15\377\377\377\12\377\377\377\10\377\377\377\5\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\10\377\377\377\11\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377" "\11\377\377\377\14\377\377\377\16\377\377\377\21\377\377\377\25\377\377\377" "\24\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377\377\377" "\13\377\377\377\13\377\377\377\16\377\377\377\20\377\377\377\23\377\377\377" "\27\377\377\377\26\377\377\377\23\377\377\377\21\377\377\377\16\377\377\377" "\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\14\377\377\377\15\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\24\377\377\377\15\377\377\377\7\377\377\377\5\377\377\377" "\14\377\377\377\25\377\377\377\37\377\377\377\36\377\377\377\33\377\377\377" "\31\377\377\377\27\377\377\377\26\377\377\377\25\377\377\377\24\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377" "\11\377\377\377\6\377\377\377\4\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\12" "\377\377\377\14\377\377\377\17\377\377\377\22\377\377\377\26\377\377\377" "\26\377\377\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\15\377\377\377\17\377\377\377\23\377\377\377\27\377\377\377" "\32\377\377\377\27\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377" "\15\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\14\377\377\377" "\15\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377\31\377\377\377" "\25\377\377\377\15\377\377\377\10\377\377\377\7\377\377\377\16\377\377\377" "\30\377\377\377\"\377\377\377\37\377\377\377\35\377\377\377\32\377\377\377" "\31\377\377\377\30\377\377\377\26\377\377\377\25\377\377\377\23\377\377\377" "\22\377\377\377\20\377\377\377\17\377\377\377\13\377\377\377\7\377\377\377" "\5\377\377\377\3\377\377\377\1\377\377\377\3\377\377\377\4\377\377\377\6" "\377\377\377\7\377\377\377\11\377\377\377\13\377\377\377\12\377\377\377\12" "\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\24\377\377\377\30\377\377\377" "\30\377\377\377\26\377\377\377\24\377\377\377\21\377\377\377\16\377\377\377" "\14\377\377\377\17\377\377\377\22\377\377\377\26\377\377\377\31\377\377\377" "\33\377\377\377\27\377\377\377\23\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\14\377\377\377\16\377\377\377" "\20\377\377\377\23\377\377\377\27\377\377\377\33\377\377\377\30\377\377\377" "\17\377\377\377\10\377\377\377\10\377\377\377\20\377\377\377\33\377\377\377" "$\377\377\377!\377\377\377\36\377\377\377\33\377\377\377\31\377\377\377\30" "\377\377\377\27\377\377\377\26\377\377\377\24\377\377\377\22\377\377\377" "\20\377\377\377\15\377\377\377\11\377\377\377\7\377\377\377\4\377\377\377" "\2\377\377\377\3\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\12" "\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\11\377\377" "\377\13\377\377\377\16\377\377\377\22\377\377\377\26\377\377\377\32\377\377" "\377\32\377\377\377\30\377\377\377\25\377\377\377\22\377\377\377\17\377\377" "\377\15\377\377\377\20\377\377\377\24\377\377\377\30\377\377\377\35\377\377" "\377\33\377\377\377\27\377\377\377\23\377\377\377\17\377\377\377\15\377\377" "\377\15\377\377\377\14\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\24\377\377\377\27\377\377\377\34\377\377\377\31\377\377\377\20\377\377" "\377\10\377\377\377\11\377\377\377\22\377\377\377\37\377\377\377%\377\377" "\377!\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377\32\377\377" "\377\31\377\377\377\26\377\377\377\24\377\377\377\23\377\377\377\21\377\377" "\377\14\377\377\377\10\377\377\377\5\377\377\377\2\377\377\377\3\377\377" "\377\5\377\377\377\6\377\377\377\11\377\377\377\13\377\377\377\14\377\377" "\377\14\377\377\377\14\377\377\377\13\377\377\377\14\377\377\377\14\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\6\377\377\377\7\377\377\377" "\11\377\377\377\14\377\377\377\17\377\377\377\23\377\377\377\27\377\377\377" "\35\377\377\377\35\377\377\377\32\377\377\377\27\377\377\377\24\377\377\377" "\20\377\377\377\20\377\377\377\23\377\377\377\30\377\377\377\34\377\377\377" "\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\20\377\377\377" "\16\377\377\377\15\377\377\377\15\377\377\377\17\377\377\377\21\377\377\377" "\24\377\377\377\30\377\377\377\34\377\377\377\33\377\377\377\20\377\377\377" "\10\377\377\377\12\377\377\377\25\377\377\377#\377\377\377&\377\377\377\"" "\377\377\377\37\377\377\377\35\377\377\377\34\377\377\377\32\377\377\377" "\31\377\377\377\27\377\377\377\25\377\377\377\23\377\377\377\16\377\377\377" "\11\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\5\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\16\377\377\377" "\15\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7" "\377\377\377\11\377\377\377\15\377\377\377\20\377\377\377\24\377\377\377" "\31\377\377\377\37\377\377\377\40\377\377\377\34\377\377\377\31\377\377\377" "\24\377\377\377\20\377\377\377\21\377\377\377\26\377\377\377\33\377\377\377" "!\377\377\377!\377\377\377\33\377\377\377\26\377\377\377\21\377\377\377\20" "\377\377\377\16\377\377\377\15\377\377\377\17\377\377\377\21\377\377\377" "\24\377\377\377\30\377\377\377\35\377\377\377\34\377\377\377\21\377\377\377" "\11\377\377\377\13\377\377\377\27\377\377\377'\377\377\377&\377\377\377#" "\377\377\377\37\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377" "\31\377\377\377\27\377\377\377\25\377\377\377\22\377\377\377\14\377\377\377" "\7\377\377\377\4\377\377\377\2\377\377\377\5\377\377\377\10\377\377\377\12" "\377\377\377\15\377\377\377\17\377\377\377\17\377\377\377\17\377\377\377" "\16\377\377\377\16\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\12\377\377\377\15\377\377\377" "\21\377\377\377\25\377\377\377\33\377\377\377\"\377\377\377\"\377\377\377" "\36\377\377\377\32\377\377\377\26\377\377\377\21\377\377\377\24\377\377\377" "\31\377\377\377\37\377\377\377&\377\377\377\40\377\377\377\32\377\377\377" "\24\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\17\377\377\377" "\21\377\377\377\24\377\377\377\31\377\377\377\36\377\377\377\36\377\377\377" "\22\377\377\377\11\377\377\377\15\377\377\377\33\377\377\377,\377\377\377" "'\377\377\377#\377\377\377\40\377\377\377\37\377\377\377\35\377\377\377\33" "\377\377\377\31\377\377\377\27\377\377\377\25\377\377\377\17\377\377\377" "\12\377\377\377\6\377\377\377\2\377\377\377\5\377\377\377\10\377\377\377" "\13\377\377\377\16\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377" "\20\377\377\377\17\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\12\377\377\377\15\377\377\377\21\377\377\377\26\377\377\377\35\377\377\377" "%\377\377\377&\377\377\377\"\377\377\377\35\377\377\377\27\377\377\377\23" "\377\377\377\27\377\377\377\35\377\377\377#\377\377\377&\377\377\377\37\377" "\377\377\30\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\17\377" "\377\377\22\377\377\377\25\377\377\377\31\377\377\377\37\377\377\377!\377" "\377\377\23\377\377\377\11\377\377\377\17\377\377\377\37\377\377\377-\377" "\377\377(\377\377\377$\377\377\377!\377\377\377\37\377\377\377\36\377\377" "\377\34\377\377\377\31\377\377\377\27\377\377\377\22\377\377\377\14\377\377" "\377\7\377\377\377\4\377\377\377\6\377\377\377\11\377\377\377\14\377\377" "\377\20\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377\21\377\377" "\377\21\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\14\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\13\377\377\377\12\377" "\377\377\12\377\377\377\12\377\377\377\15\377\377\377\22\377\377\377\30\377" "\377\377\37\377\377\377(\377\377\377*\377\377\377$\377\377\377\37\377\377" "\377\30\377\377\377\25\377\377\377\32\377\377\377\40\377\377\377(\377\377" "\377%\377\377\377\35\377\377\377\26\377\377\377\23\377\377\377\21\377\377" "\377\17\377\377\377\22\377\377\377\25\377\377\377\32\377\377\377\40\377\377" "\377#\377\377\377\24\377\377\377\11\377\377\377\21\377\377\377#\377\377\377" ".\377\377\377)\377\377\377$\377\377\377\"\377\377\377\40\377\377\377\36\377" "\377\377\34\377\377\377\31\377\377\377\26\377\377\377\16\377\377\377\10\377" "\377\377\4\377\377\377\5\377\377\377\11\377\377\377\15\377\377\377\22\377" "\377\377\24\377\377\377\24\377\377\377\23\377\377\377\23\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\14\377" "\377\377\13\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\10\377" "\377\377\10\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377" "\377\377\14\377\377\377\13\377\377\377\14\377\377\377\13\377\377\377\16\377" "\377\377\23\377\377\377\31\377\377\377!\377\377\377,\377\377\377.\377\377" "\377'\377\377\377\40\377\377\377\31\377\377\377\27\377\377\377\35\377\377" "\377%\377\377\377,\377\377\377#\377\377\377\33\377\377\377\25\377\377\377" "\22\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377\32\377\377\377" "!\377\377\377&\377\377\377\25\377\377\377\11\377\377\377\24\377\377\377)" "\377\377\3770\377\377\377*\377\377\377&\377\377\377#\377\377\377!\377\377" "\377\37\377\377\377\34\377\377\377\31\377\377\377\21\377\377\377\12\377\377" "\377\5\377\377\377\5\377\377\377\11\377\377\377\16\377\377\377\23\377\377" "\377\26\377\377\377\26\377\377\377\25\377\377\377\25\377\377\377\24\377\377" "\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\15\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377" "\377\377\14\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\16\377" "\377\377\16\377\377\377\16\377\377\377\15\377\377\377\16\377\377\377\15\377" "\377\377\14\377\377\377\16\377\377\377\24\377\377\377\33\377\377\377$\377" "\377\377/\377\377\3771\377\377\377)\377\377\377!\377\377\377\31\377\377\377" "\32\377\377\377!\377\377\377*\377\377\377*\377\377\377!\377\377\377\30\377" "\377\377\24\377\377\377\22\377\377\377\22\377\377\377\26\377\377\377\33\377" "\377\377\"\377\377\377*\377\377\377\26\377\377\377\11\377\377\377\30\377" "\377\3770\377\377\3771\377\377\377+\377\377\377'\377\377\377%\377\377\377" "\"\377\377\377\37\377\377\377\34\377\377\377\26\377\377\377\15\377\377\377" "\7\377\377\377\5\377\377\377\11\377\377\377\16\377\377\377\24\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\30\377\377\377\27\377\377\377" "\26\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377" "\14\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377" "\17\377\377\377\17\377\377\377\20\377\377\377\17\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\25\377\377\377" "\34\377\377\377%\377\377\3771\377\377\3774\377\377\377+\377\377\377\"\377" "\377\377\31\377\377\377\35\377\377\377&\377\377\3771\377\377\377)\377\377" "\377\36\377\377\377\27\377\377\377\24\377\377\377\22\377\377\377\26\377\377" "\377\33\377\377\377#\377\377\377-\377\377\377\30\377\377\377\11\377\377\377" "\34\377\377\3779\377\377\3772\377\377\377,\377\377\377)\377\377\377&\377" "\377\377#\377\377\377\37\377\377\377\33\377\377\377\20\377\377\377\11\377" "\377\377\4\377\377\377\11\377\377\377\17\377\377\377\25\377\377\377\31\377" "\377\377\31\377\377\377\31\377\377\377\31\377\377\377\31\377\377\377\27\377" "\377\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\15\377" "\377\377\14\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\13\377" "\377\377\14\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377" "\377\377\15\377\377\377\15\377\377\377\17\377\377\377\17\377\377\377\20\377" "\377\377\20\377\377\377\20\377\377\377\22\377\377\377\22\377\377\377\22\377" "\377\377\21\377\377\377\22\377\377\377\21\377\377\377\20\377\377\377\17\377" "\377\377\24\377\377\377\34\377\377\377&\377\377\3773\377\377\3777\377\377" "\377-\377\377\377#\377\377\377\31\377\377\377\"\377\377\377,\377\377\377" "2\377\377\377&\377\377\377\33\377\377\377\27\377\377\377\24\377\377\377\26" "\377\377\377\34\377\377\377$\377\377\377/\377\377\377\31\377\377\377\12\377" "\377\377!\377\377\377<\377\377\3774\377\377\377-\377\377\377*\377\377\377" "'\377\377\377#\377\377\377\37\377\377\377\25\377\377\377\13\377\377\377\5" "\377\377\377\11\377\377\377\17\377\377\377\26\377\377\377\32\377\377\377" "\33\377\377\377\33\377\377\377\33\377\377\377\33\377\377\377\30\377\377\377" "\26\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\16\377\377\377\15\377\377\377\16\377\377\377\15\377\377\377" "\15\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\14\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377" "\377\377\20\377\377\377\21\377\377\377\21\377\377\377\23\377\377\377\23\377" "\377\377\24\377\377\377\24\377\377\377\24\377\377\377\23\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\24\377\377\377\34\377\377\377'\377" "\377\3776\377\377\377;\377\377\377/\377\377\377$\377\377\377\35\377\377\377" "'\377\377\3774\377\377\3770\377\377\377#\377\377\377\32\377\377\377\26\377" "\377\377\26\377\377\377\34\377\377\377&\377\377\3772\377\377\377\33\377\377" "\377\14\377\377\377(\377\377\377>\377\377\3775\377\377\377/\377\377\377," "\377\377\377(\377\377\377#\377\377\377\33\377\377\377\17\377\377\377\6\377" "\377\377\11\377\377\377\20\377\377\377\30\377\377\377\34\377\377\377\35\377" "\377\377\35\377\377\377\35\377\377\377\33\377\377\377\31\377\377\377\26\377" "\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377\377\20\377" "\377\377\17\377\377\377\20\377\377\377\17\377\377\377\20\377\377\377\17\377" "\377\377\17\377\377\377\16\377\377\377\16\377\377\377\15\377\377\377\14\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377" "\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377" "\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377" "\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377" "\377\377\20\377\377\377\22\377\377\377\22\377\377\377\23\377\377\377\24\377" "\377\377\25\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377" "\377\377\27\377\377\377\26\377\377\377\24\377\377\377\23\377\377\377\23\377" "\377\377\34\377\377\377(\377\377\3779\377\377\377@\377\377\3772\377\377\377" "$\377\377\377\"\377\377\377.\377\377\377=\377\377\377-\377\377\377\36\377" "\377\377\31\377\377\377\26\377\377\377\35\377\377\377'\377\377\3775\377\377" "\377\35\377\377\377\17\377\377\3772\377\377\377A\377\377\3776\377\377\377" "2\377\377\377.\377\377\377(\377\377\377#\377\377\377\23\377\377\377\11\377" "\377\377\11\377\377\377\21\377\377\377\32\377\377\377\37\377\377\377\37\377" "\377\377\37\377\377\377\37\377\377\377\34\377\377\377\31\377\377\377\26\377" "\377\377\24\377\377\377\22\377\377\377\21\377\377\377\22\377\377\377\22\377" "\377\377\22\377\377\377\22\377\377\377\22\377\377\377\21\377\377\377\22\377" "\377\377\21\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377" "\377\377\15\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\12\377" "\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377" "\377\377\16\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377\24\377" "\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377\377\30\377" "\377\377\32\377\377\377\32\377\377\377\31\377\377\377\30\377\377\377\27\377" "\377\377\25\377\377\377\23\377\377\377\34\377\377\377)\377\377\377<\377\377" "\377E\377\377\3775\377\377\377%\377\377\377'\377\377\3777\377\377\377;\377" "\377\377(\377\377\377\35\377\377\377\31\377\377\377\36\377\377\377(\377\377" "\3778\377\377\377\40\377\377\377\22\377\377\377>\377\377\377C\377\377\377" "9\377\377\3774\377\377\377.\377\377\377(\377\377\377\32\377\377\377\14\377" "\377\377\10\377\377\377\21\377\377\377\34\377\377\377!\377\377\377!\377\377" "\377\"\377\377\377!\377\377\377\35\377\377\377\32\377\377\377\27\377\377" "\377\24\377\377\377\23\377\377\377\23\377\377\377\24\377\377\377\25\377\377" "\377\24\377\377\377\25\377\377\377\24\377\377\377\25\377\377\377\23\377\377" "\377\23\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377\16\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\6\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377\377\377\21\377" "\377\377\23\377\377\377\25\377\377\377\30\377\377\377\30\377\377\377\32\377" "\377\377\33\377\377\377\33\377\377\377\34\377\377\377\34\377\377\377\35\377" "\377\377\33\377\377\377\32\377\377\377\30\377\377\377\26\377\377\377\33\377" "\377\377*\377\377\377?\377\377\377L\377\377\3778\377\377\377%\377\377\377" "/\377\377\377D\377\377\3777\377\377\377#\377\377\377\35\377\377\377\36\377" "\377\377(\377\377\377;\377\377\377#\377\377\377\27\377\377\377O\377\377\377" "F\377\377\377<\377\377\3776\377\377\377/\377\377\377%\377\377\377\20\377" "\377\377\7\377\377\377\22\377\377\377\37\377\377\377$\377\377\377%\377\377" "\377%\377\377\377#\377\377\377\36\377\377\377\32\377\377\377\27\377\377\377" "\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\27\377\377\377" "\30\377\377\377\30\377\377\377\30\377\377\377\26\377\377\377\25\377\377\377" "\24\377\377\377\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6" "\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377" "\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\14\377\377\377\15\377\377\377\16\377" "\377\377\17\377\377\377\21\377\377\377\23\377\377\377\25\377\377\377\30\377" "\377\377\32\377\377\377\35\377\377\377\35\377\377\377\36\377\377\377\36\377" "\377\377\37\377\377\377\37\377\377\377\37\377\377\377\35\377\377\377\33\377" "\377\377\31\377\377\377\32\377\377\377*\377\377\377C\377\377\377S\377\377" "\377<\377\377\377&\377\377\377:\377\377\377L\377\377\3771\377\377\377\"\377" "\377\377\36\377\377\377*\377\377\377?\377\377\377&\377\377\377\36\377\377" "\377Z\377\377\377H\377\377\377?\377\377\3778\377\377\377/\377\377\377\30" "\377\377\377\10\377\377\377\22\377\377\377\"\377\377\377(\377\377\377(\377" "\377\377(\377\377\377$\377\377\377\37\377\377\377\33\377\377\377\27\377\377" "\377\27\377\377\377\30\377\377\377\31\377\377\377\32\377\377\377\33\377\377" "\377\33\377\377\377\33\377\377\377\32\377\377\377\30\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377" "\377\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377" "\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377" "\377\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\12\377" "\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377" "\377\377\13\377\377\377\14\377\377\377\16\377\377\377\17\377\377\377\21\377" "\377\377\23\377\377\377\25\377\377\377\30\377\377\377\32\377\377\377\35\377" "\377\377\40\377\377\377\40\377\377\377!\377\377\377\"\377\377\377\"\377\377" "\377#\377\377\377\"\377\377\377\40\377\377\377\35\377\377\377\32\377\377" "\377*\377\377\377G\377\377\377]\377\377\377@\377\377\377/\377\377\377J\377" "\377\377G\377\377\377*\377\377\377!\377\377\377+\377\377\377C\377\377\377" "+\377\377\377)\377\377\377`\377\377\377L\377\377\377C\377\377\3778\377\377" "\377#\377\377\377\13\377\377\377\23\377\377\377&\377\377\377,\377\377\377" "-\377\377\377,\377\377\377&\377\377\377\40\377\377\377\33\377\377\377\31" "\377\377\377\33\377\377\377\34\377\377\377\35\377\377\377\36\377\377\377" "\36\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377\32\377\377\377" "\31\377\377\377\27\377\377\377\25\377\377\377\24\377\377\377\23\377\377\377" "\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\13\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\15\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377\25\377\377\377" "\27\377\377\377\31\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "$\377\377\377%\377\377\377&\377\377\377'\377\377\377'\377\377\377%\377\377" "\377\"\377\377\377\37\377\377\377*\377\377\377K\377\377\377h\377\377\377" "D\377\377\377;\377\377\377b\377\377\377=\377\377\377)\377\377\377-\377\377" "\377G\377\377\3770\377\377\3778\377\377\377e\377\377\377R\377\377\377F\377" "\377\3777\377\377\377\22\377\377\377\23\377\377\377+\377\377\3772\377\377" "\3773\377\377\377/\377\377\377'\377\377\377\40\377\377\377\34\377\377\377" "\36\377\377\377\37\377\377\377!\377\377\377\"\377\377\377\"\377\377\377!" "\377\377\377\37\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\31\377\377\377\27\377\377\377\26\377\377\377\24\377\377\377" "\23\377\377\377\21\377\377\377\20\377\377\377\17\377\377\377\15\377\377\377" "\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11" "\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\14\377\377\377\15\377\377\377\15\377\377\377\16\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\20\377\377\377" "\20\377\377\377\21\377\377\377\21\377\377\377\21\377\377\377\21\377\377\377" "\22\377\377\377\24\377\377\377\26\377\377\377\30\377\377\377\33\377\377\377" "\36\377\377\377\"\377\377\377&\377\377\377)\377\377\377*\377\377\377+\377" "\377\377,\377\377\377-\377\377\377)\377\377\377%\377\377\377(\377\377\377" "O\377\377\377w\377\377\377H\377\377\377O\377\377\377a\377\377\3774\377\377" "\377-\377\377\377L\377\377\3777\377\377\377Q\377\377\377k\377\377\377X\377" "\377\377F\377\377\377\36\377\377\377\22\377\377\3771\377\377\3779\377\377" "\377:\377\377\3772\377\377\377(\377\377\377!\377\377\377\"\377\377\377$\377" "\377\377&\377\377\377'\377\377\377&\377\377\377$\377\377\377\"\377\377\377" "!\377\377\377\37\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\30\377\377\377\26\377\377\377\25\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377" "\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\21\377" "\377\377\21\377\377\377\22\377\377\377\23\377\377\377\24\377\377\377\24\377" "\377\377\25\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377\26\377" "\377\377\25\377\377\377\25\377\377\377\24\377\377\377\27\377\377\377\31\377" "\377\377\34\377\377\377\40\377\377\377$\377\377\377*\377\377\3770\377\377" "\3771\377\377\3773\377\377\3774\377\377\3773\377\377\377.\377\377\377'\377" "\377\377S\377\377\377\213\377\377\377K\377\377\377o\377\377\377Q\377\377" "\3771\377\377\377P\377\377\377@\377\377\377}\377\377\377r\377\377\377]\377" "\377\3775\377\377\377\21\377\377\3779\377\377\377C\377\377\377C\377\377\377" "4\377\377\377)\377\377\377'\377\377\377*\377\377\377,\377\377\377.\377\377" "\377,\377\377\377)\377\377\377'\377\377\377$\377\377\377#\377\377\377!\377" "\377\377\37\377\377\377\35\377\377\377\33\377\377\377\31\377\377\377\30\377" "\377\377\26\377\377\377\25\377\377\377\23\377\377\377\22\377\377\377\20\377" "\377\377\17\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377" "\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377" "\377\14\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377" "\377\31\377\377\377\31\377\377\377\32\377\377\377\33\377\377\377\33\377\377" "\377\33\377\377\377\33\377\377\377\33\377\377\377\32\377\377\377\32\377\377" "\377\31\377\377\377\32\377\377\377\36\377\377\377\"\377\377\377(\377\377" "\377.\377\377\3777\377\377\377;\377\377\377=\377\377\377?\377\377\377;\377" "\377\3773\377\377\377U\377\377\377\247\377\377\377M\377\377\377\230\377\377" "\377E\377\377\377T\377\377\377M\377\377\377\265\377\377\377\177\377\377\377" "^\377\377\377\20\377\377\377D\377\377\377Q\377\377\377I\377\377\3776\377" "\377\377.\377\377\3773\377\377\3776\377\377\3777\377\377\3773\377\377\377" "/\377\377\377,\377\377\377)\377\377\377'\377\377\377$\377\377\377!\377\377" "\377\36\377\377\377\34\377\377\377\32\377\377\377\30\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\21\377\377\377\20\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\14\377\377\377\12\377\377" "\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\17\377" "\377\377\21\377\377\377\22\377\377\377\24\377\377\377\26\377\377\377\27\377" "\377\377\32\377\377\377\34\377\377\377\37\377\377\377!\377\377\377!\377\377" "\377\"\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377" "\"\377\377\377\"\377\377\377!\377\377\377\40\377\377\377\37\377\377\377$" "\377\377\377+\377\377\3773\377\377\377?\377\377\377I\377\377\377L\377\377" "\377O\377\377\377E\377\377\377T\377\377\377\321\377\377\377w\377\377\377" "z\377\377\377Z\377\377\377`\377\377\377\313\377\377\377\214\377\377\377$" "\377\377\377U\377\377\377f\377\377\377N\377\377\3779\377\377\377?\377\377" "\377D\377\377\377B\377\377\377<\377\377\3777\377\377\3773\377\377\377/\377" "\377\377*\377\377\377&\377\377\377\"\377\377\377\37\377\377\377\35\377\377" "\377\33\377\377\377\31\377\377\377\27\377\377\377\25\377\377\377\24\377\377" "\377\23\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377" "\377\16\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377" "\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377\24\377\377\377" "\25\377\377\377\30\377\377\377\31\377\377\377\34\377\377\377\36\377\377\377" "\40\377\377\377#\377\377\377&\377\377\377)\377\377\377,\377\377\377-\377" "\377\377-\377\377\377.\377\377\377.\377\377\377.\377\377\377-\377\377\377" ",\377\377\377*\377\377\377.\377\377\3779\377\377\377I\377\377\377`\377\377" "\377f\377\377\377g\377\377\377O\377\377\377\377\377\377\377\337\377\377\377" "c\377\377\377\200\377\377\377\343\377\377\377j\377\377\377r\377\377\377\206" "\377\377\377R\377\377\377U\377\377\377\\\377\377\377R\377\377\377I\377\377" "\377B\377\377\377;\377\377\3773\377\377\377-\377\377\377(\377\377\377$\377" "\377\377\40\377\377\377\35\377\377\377\33\377\377\377\31\377\377\377\27\377" "\377\377\26\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377" "\377\377\21\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377\15\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\10\377" "\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377" "\15\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377" "\23\377\377\377\24\377\377\377\26\377\377\377\30\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377\40\377\377\377\"\377\377\377%\377\377\377" ")\377\377\377-\377\377\3772\377\377\3779\377\377\377@\377\377\377C\377\377" "\377D\377\377\377E\377\377\377D\377\377\377B\377\377\377>\377\377\377V\377" "\377\377\177\377\377\377\231\377\377\377\213\377\377\377\377\377\377\377" "\365\377\377\377\301\377\377\377\377\377\377\377\253\377\377\377\235\377" "\377\377\177\377\377\377\204\377\377\377n\377\377\377_\377\377\377M\377\377" "\377?\377\377\3776\377\377\377.\377\377\377)\377\377\377$\377\377\377!\377" "\377\377\36\377\377\377\34\377\377\377\32\377\377\377\30\377\377\377\26\377" "\377\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377" "\377\377\20\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377" "\377\377\11\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377" "\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377" "\23\377\377\377\24\377\377\377\26\377\377\377\27\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377\40\377\377\377#\377\377\377&\377\377\377+" "\377\377\3770\377\377\3777\377\377\377@\377\377\377K\377\377\377[\377\377" "\377q\377\377\377\207\377\377\377\212\377\377\377\205\377\377\377\254\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\376\377\377\377\335\377\377\377\231\377\377\377l\377\377\377R\377\377\377" "B\377\377\3778\377\377\3770\377\377\377*\377\377\377&\377\377\377\"\377\377" "\377\37\377\377\377\34\377\377\377\32\377\377\377\30\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377" "\377\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377" "\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377" "\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\15\377\377\377" "\15\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\22\377\377\377" "\22\377\377\377\23\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\32\377\377\377\33\377\377\377\35\377\377\377" "\37\377\377\377!\377\377\377$\377\377\377'\377\377\377+\377\377\377/\377" "\377\3774\377\377\377;\377\377\377C\377\377\377N\377\377\377^\377\377\377" "v\377\377\377\235\377\377\377\353\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\261\377\377\377v\377\377\377Y\377\377\377G\377\377\377" ";\377\377\3772\377\377\377,\377\377\377'\377\377\377#\377\377\377\40\377" "\377\377\35\377\377\377\33\377\377\377\31\377\377\377\27\377\377\377\26\377" "\377\377\25\377\377\377\23\377\377\377\22\377\377\377\21\377\377\377\21\377" "\377\377\20\377\377\377\17\377\377\377\16\377\377\377\16\377\377\377\15\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\12\377" "\377\377\11\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\20\377\377\377\22\377\377\377\22\377\377\377" "\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\31\377\377\377" "\32\377\377\377\33\377\377\377\35\377\377\377\37\377\377\377!\377\377\377" "$\377\377\377'\377\377\377*\377\377\377.\377\377\3773\377\377\3779\377\377" "\377>\377\377\377D\377\377\377K\377\377\377S\377\377\377]\377\377\377j\377" "\377\377\225\377\377\377\377\377\377\377\363\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\332\377\377\377\320\377" "\377\377\236\377\377\377h\377\377\377I\377\377\3776\377\377\377*\377\377" "\377\"\377\377\377\35\377\377\377\32\377\377\377\31\377\377\377\27\377\377" "\377\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\21\377\377" "\377\20\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377\16\377\377" "\377\15\377\377\377\15\377\377\377\14\377\377\377\14\377\377\377\12\377\377" "\377\12\377\377\377\12\377\377\377\10\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\21\377\377\377\22\377\377\377" "\23\377\377\377\25\377\377\377\27\377\377\377\30\377\377\377\31\377\377\377" "\33\377\377\377\34\377\377\377\35\377\377\377\37\377\377\377\40\377\377\377" "\"\377\377\377#\377\377\377%\377\377\377'\377\377\377)\377\377\377,\377\377" "\377/\377\377\3772\377\377\3775\377\377\377:\377\377\377J\377\377\377b\377" "\377\377\207\377\377\377\217\377\377\377z\377\377\377\322\377\377\377\354" "\377\377\377\352\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\271\377\377\377\220\377\377\377y\377\377\377m\377\377\377k\377\377\377" "h\377\377\377c\377\377\377O\377\377\377?\377\377\3774\377\377\377+\377\377" "\377$\377\377\377\37\377\377\377\33\377\377\377\30\377\377\377\25\377\377" "\377\22\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\15\377\377" "\377\15\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\13\377\377" "\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\13\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377" "\23\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377\30\377\377\377" "\31\377\377\377\31\377\377\377\32\377\377\377\33\377\377\377\34\377\377\377" "\36\377\377\377\37\377\377\377\40\377\377\377\"\377\377\377#\377\377\377" "%\377\377\377*\377\377\3771\377\377\377;\377\377\377H\377\377\377Z\377\377" "\377b\377\377\377[\377\377\377Q\377\377\377r\377\377\377\332\377\377\377" "\236\377\377\377o\377\377\377\223\377\377\377\305\377\377\377\377\377\377" "\377\377\377\377\377\310\377\377\377\247\377\377\377p\377\377\377`\377\377" "\377U\377\377\377L\377\377\377H\377\377\377H\377\377\377G\377\377\377E\377" "\377\377C\377\377\377>\377\377\3774\377\377\377-\377\377\377'\377\377\377" "\"\377\377\377\36\377\377\377\33\377\377\377\30\377\377\377\26\377\377\377" "\24\377\377\377\22\377\377\377\20\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377" "\377\377\11\377\377\377\13\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\20\377" "\377\377\22\377\377\377\22\377\377\377\24\377\377\377\25\377\377\377\26\377" "\377\377\27\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\32\377" "\377\377\33\377\377\377\35\377\377\377!\377\377\377%\377\377\377*\377\377" "\3771\377\377\3779\377\377\377C\377\377\377J\377\377\377G\377\377\377B\377" "\377\377=\377\377\377N\377\377\377i\377\377\377\314\377\377\377v\377\377" "\377K\377\377\377u\377\377\377\36\377\377\377\224\377\377\377\260\377\377" "\377\223\377\377\377\342\377\377\377\226\377\377\377\223\377\377\377]\377" "\377\377Q\377\377\377H\377\377\377A\377\377\377<\377\377\3777\377\377\377" "6\377\377\3776\377\377\3775\377\377\3775\377\377\3774\377\377\3773\377\377" "\3771\377\377\377,\377\377\377'\377\377\377#\377\377\377\37\377\377\377\34" "\377\377\377\32\377\377\377\27\377\377\377\25\377\377\377\23\377\377\377" "\21\377\377\377\20\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\12\377\377\377\11\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377" "\20\377\377\377\21\377\377\377\21\377\377\377\23\377\377\377\23\377\377\377" "\25\377\377\377\25\377\377\377\26\377\377\377\30\377\377\377\33\377\377\377" "\35\377\377\377!\377\377\377%\377\377\377)\377\377\377/\377\377\3776\377" "\377\377;\377\377\377:\377\377\3777\377\377\3774\377\377\3770\377\377\377" ";\377\377\377I\377\377\377n\377\377\377\272\377\377\377^\377\377\3778\377" "\377\377H\377\377\377\223\377\377\377/\377\377\377v\377\377\377\216\377\377" "\377\246\377\377\377\216\377\377\377\232\377\377\377x\377\377\377\201\377" "\377\377Y\377\377\377F\377\377\377?\377\377\3779\377\377\3775\377\377\377" "2\377\377\377.\377\377\377,\377\377\377+\377\377\377+\377\377\377+\377\377" "\377*\377\377\377*\377\377\377)\377\377\377)\377\377\377(\377\377\377&\377" "\377\377\"\377\377\377\37\377\377\377\34\377\377\377\32\377\377\377\27\377" "\377\377\25\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377" "\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377" "\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377" "\377\11\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377" "\377\14\377\377\377\14\377\377\377\16\377\377\377\16\377\377\377\17\377\377" "\377\20\377\377\377\20\377\377\377\22\377\377\377\24\377\377\377\26\377\377" "\377\30\377\377\377\33\377\377\377\35\377\377\377\40\377\377\377$\377\377" "\377(\377\377\377-\377\377\3772\377\377\3771\377\377\377/\377\377\377-\377" "\377\377+\377\377\377(\377\377\377/\377\377\3779\377\377\377F\377\377\377" "m\377\377\377\246\377\377\377O\377\377\377-\377\377\3777\377\377\377N\377" "\377\377J\377\377\3777\377\377\377b\377\377\377w\377\377\377\206\377\377" "\377b\377\377\377\231\377\377\377s\377\377\377d\377\377\377r\377\377\377" "S\377\377\377>\377\377\3778\377\377\3774\377\377\3770\377\377\377-\377\377" "\377*\377\377\377(\377\377\377&\377\377\377$\377\377\377$\377\377\377$\377" "\377\377$\377\377\377#\377\377\377#\377\377\377#\377\377\377\"\377\377\377" "\"\377\377\377!\377\377\377!\377\377\377\36\377\377\377\33\377\377\377\30" "\377\377\377\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377" "\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7" "\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\21\377\377\377" "\23\377\377\377\26\377\377\377\27\377\377\377\32\377\377\377\35\377\377\377" "\40\377\377\377#\377\377\377&\377\377\377*\377\377\377*\377\377\377)\377" "\377\377(\377\377\377&\377\377\377$\377\377\377\"\377\377\377(\377\377\377" ".\377\377\3776\377\377\377H\377\377\377j\377\377\377\203\377\377\377C\377" "\377\377%\377\377\377-\377\377\3775\377\377\377]\377\377\377\40\377\377\377" ";\377\377\377T\377\377\377f\377\377\377k\377\377\377l\377\377\377Y\377\377" "\377\221\377\377\377[\377\377\377U\377\377\377a\377\377\377N\377\377\377" "<\377\377\3772\377\377\377/\377\377\377,\377\377\377)\377\377\377'\377\377" "\377%\377\377\377#\377\377\377!\377\377\377\40\377\377\377\37\377\377\377" "\37\377\377\377\37\377\377\377\37\377\377\377\36\377\377\377\36\377\377\377" "\36\377\377\377\36\377\377\377\34\377\377\377\33\377\377\377\32\377\377\377" "\31\377\377\377\30\377\377\377\26\377\377\377\24\377\377\377\21\377\377\377" "\20\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\16\377\377\377\20\377\377\377\22\377\377\377\23\377\377\377\26\377" "\377\377\30\377\377\377\33\377\377\377\37\377\377\377!\377\377\377$\377\377" "\377%\377\377\377$\377\377\377#\377\377\377\"\377\377\377!\377\377\377\37" "\377\377\377\36\377\377\377\"\377\377\377'\377\377\377,\377\377\3774\377" "\377\377I\377\377\377f\377\377\377k\377\377\377;\377\377\377\40\377\377\377" "%\377\377\377+\377\377\377:\377\377\377U\377\377\377\17\377\377\377<\377" "\377\377J\377\377\377Y\377\377\377X\377\377\377k\377\377\377I\377\377\377" "b\377\377\377q\377\377\377K\377\377\377K\377\377\377T\377\377\377I\377\377" "\377:\377\377\377.\377\377\377+\377\377\377(\377\377\377&\377\377\377$\377" "\377\377\"\377\377\377\40\377\377\377\37\377\377\377\36\377\377\377\35\377" "\377\377\33\377\377\377\33\377\377\377\33\377\377\377\33\377\377\377\33\377" "\377\377\33\377\377\377\31\377\377\377\30\377\377\377\30\377\377\377\27\377" "\377\377\26\377\377\377\25\377\377\377\24\377\377\377\24\377\377\377\23\377" "\377\377\21\377\377\377\20\377\377\377\16\377\377\377\14\377\377\377\13\377" "\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377\377" "\377\21\377\377\377\22\377\377\377\24\377\377\377\26\377\377\377\30\377\377" "\377\34\377\377\377\36\377\377\377\40\377\377\377\40\377\377\377\40\377\377" "\377\37\377\377\377\36\377\377\377\35\377\377\377\34\377\377\377\33\377\377" "\377\36\377\377\377!\377\377\377&\377\377\377+\377\377\3776\377\377\377H" "\377\377\377a\377\377\377Z\377\377\3774\377\377\377\33\377\377\377\40\377" "\377\377%\377\377\377*\377\377\377C\377\377\3771\377\377\377\23\377\377\377" "7\377\377\377A\377\377\377N\377\377\377N\377\377\377Z\377\377\377O\377\377" "\377@\377\377\377f\377\377\377\\\377\377\377@\377\377\377B\377\377\377J\377" "\377\377D\377\377\3777\377\377\377-\377\377\377'\377\377\377%\377\377\377" "#\377\377\377!\377\377\377\40\377\377\377\36\377\377\377\35\377\377\377\34" "\377\377\377\33\377\377\377\32\377\377\377\31\377\377\377\30\377\377\377" "\30\377\377\377\27\377\377\377\27\377\377\377\26\377\377\377\26\377\377\377" "\25\377\377\377\24\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\16\377\377\377\17\377\377\377\21\377" "\377\377\22\377\377\377\25\377\377\377\27\377\377\377\31\377\377\377\32\377" "\377\377\33\377\377\377\33\377\377\377\33\377\377\377\34\377\377\377\33\377" "\377\377\32\377\377\377\31\377\377\377\30\377\377\377\32\377\377\377\35\377" "\377\377!\377\377\377$\377\377\377*\377\377\3777\377\377\377G\377\377\377" "]\377\377\377N\377\377\377/\377\377\377\30\377\377\377\34\377\377\377\40" "\377\377\377$\377\377\377/\377\377\377I\377\377\377\34\377\377\377\27\377" "\377\3772\377\377\377;\377\377\377E\377\377\377G\377\377\377L\377\377\377" "S\377\377\377:\377\377\377G\377\377\377f\377\377\377M\377\377\3777\377\377" "\377<\377\377\377B\377\377\377@\377\377\3775\377\377\377,\377\377\377%\377" "\377\377#\377\377\377!\377\377\377\37\377\377\377\36\377\377\377\34\377\377" "\377\33\377\377\377\32\377\377\377\31\377\377\377\31\377\377\377\30\377\377" "\377\27\377\377\377\25\377\377\377\25\377\377\377\23\377\377\377\23\377\377" "\377\22\377\377\377\22\377\377\377\21\377\377\377\21\377\377\377\20\377\377" "\377\20\377\377\377\17\377\377\377\17\377\377\377\16\377\377\377\15\377\377" "\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377" "\377\13\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\21\377\377" "\377\22\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\26\377\377" "\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377" "\377\26\377\377\377\26\377\377\377\30\377\377\377\32\377\377\377\35\377\377" "\377\40\377\377\377#\377\377\377+\377\377\3777\377\377\377F\377\377\377X" "\377\377\377D\377\377\377+\377\377\377\26\377\377\377\31\377\377\377\34\377" "\377\377\37\377\377\377#\377\377\3774\377\377\3777\377\377\377\20\377\377" "\377\32\377\377\377.\377\377\3776\377\377\377>\377\377\377@\377\377\377B" "\377\377\377L\377\377\377>\377\377\3771\377\377\377J\377\377\377X\377\377" "\377B\377\377\3771\377\377\3776\377\377\377;\377\377\377<\377\377\3773\377" "\377\377+\377\377\377$\377\377\377\40\377\377\377\37\377\377\377\35\377\377" "\377\34\377\377\377\33\377\377\377\32\377\377\377\31\377\377\377\30\377\377" "\377\27\377\377\377\27\377\377\377\25\377\377\377\24\377\377\377\23\377\377" "\377\22\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377\17\377\377" "\377\16\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377" "\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377" "\377\377\22\377\377\377\22\377\377\377\23\377\377\377\23\377\377\377\23\377" "\377\377\24\377\377\377\23\377\377\377\24\377\377\377\23\377\377\377\23\377" "\377\377\23\377\377\377\26\377\377\377\27\377\377\377\32\377\377\377\34\377" "\377\377\37\377\377\377#\377\377\377+\377\377\3776\377\377\377D\377\377\377" "S\377\377\377<\377\377\377'\377\377\377\24\377\377\377\26\377\377\377\31" "\377\377\377\33\377\377\377\36\377\377\377'\377\377\3779\377\377\377%\377" "\377\377\12\377\377\377\33\377\377\377+\377\377\3771\377\377\3778\377\377" "\377;\377\377\377:\377\377\377C\377\377\377A\377\377\3771\377\377\3777\377" "\377\377L\377\377\377K\377\377\3779\377\377\377-\377\377\3772\377\377\377" "6\377\377\3779\377\377\3771\377\377\377)\377\377\377$\377\377\377\37\377" "\377\377\35\377\377\377\34\377\377\377\33\377\377\377\32\377\377\377\31\377" "\377\377\30\377\377\377\27\377\377\377\25\377\377\377\24\377\377\377\23\377" "\377\377\22\377\377\377\21\377\377\377\20\377\377\377\20\377\377\377\16\377" "\377\377\16\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\14\377" "\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\15\377\377\377\17\377\377\377\17\377" "\377\377\17\377\377\377\20\377\377\377\20\377\377\377\20\377\377\377\21\377" "\377\377\20\377\377\377\21\377\377\377\20\377\377\377\21\377\377\377\20\377" "\377\377\23\377\377\377\24\377\377\377\27\377\377\377\31\377\377\377\33\377" "\377\377\36\377\377\377#\377\377\377,\377\377\3776\377\377\377B\377\377\377" "I\377\377\3776\377\377\377$\377\377\377\24\377\377\377\24\377\377\377\26" "\377\377\377\31\377\377\377\33\377\377\377\35\377\377\377+\377\377\3779\377" "\377\377\30\377\377\377\14\377\377\377\35\377\377\377(\377\377\377-\377\377" "\3773\377\377\3777\377\377\3776\377\377\377;\377\377\377C\377\377\3773\377" "\377\377(\377\377\377:\377\377\377L\377\377\377A\377\377\3773\377\377\377" "*\377\377\377.\377\377\3771\377\377\3774\377\377\377.\377\377\377(\377\377" "\377#\377\377\377\36\377\377\377\33\377\377\377\32\377\377\377\31\377\377" "\377\30\377\377\377\27\377\377\377\27\377\377\377\25\377\377\377\24\377\377" "\377\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\17\377\377" "\377\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377\13\377\377" "\377\13\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377\15\377" "\377\377\15\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\20\377" "\377\377\22\377\377\377\23\377\377\377\26\377\377\377\30\377\377\377\33\377" "\377\377\36\377\377\377$\377\377\377,\377\377\3775\377\377\377@\377\377\377" "A\377\377\3771\377\377\377!\377\377\377\23\377\377\377\22\377\377\377\24" "\377\377\377\26\377\377\377\30\377\377\377\32\377\377\377!\377\377\377.\377" "\377\377)\377\377\377\20\377\377\377\16\377\377\377\35\377\377\377&\377\377" "\377*\377\377\377/\377\377\3773\377\377\3772\377\377\3775\377\377\377;\377" "\377\3776\377\377\377*\377\377\377,\377\377\377<\377\377\377H\377\377\377" "9\377\377\377-\377\377\377'\377\377\377*\377\377\377.\377\377\3770\377\377" "\377-\377\377\377'\377\377\377\"\377\377\377\36\377\377\377\32\377\377\377" "\31\377\377\377\30\377\377\377\27\377\377\377\25\377\377\377\25\377\377\377" "\23\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377" "\16\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\15\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\17\377\377\377" "\20\377\377\377\23\377\377\377\24\377\377\377\26\377\377\377\31\377\377\377" "\36\377\377\377$\377\377\377+\377\377\3774\377\377\377>\377\377\377;\377" "\377\377-\377\377\377\37\377\377\377\23\377\377\377\21\377\377\377\22\377" "\377\377\24\377\377\377\26\377\377\377\30\377\377\377\32\377\377\377$\377" "\377\3771\377\377\377\35\377\377\377\12\377\377\377\17\377\377\377\36\377" "\377\377#\377\377\377'\377\377\377,\377\377\377/\377\377\377/\377\377\377" "0\377\377\3776\377\377\3777\377\377\377,\377\377\377\"\377\377\377/\377\377" "\377=\377\377\377?\377\377\3773\377\377\377)\377\377\377%\377\377\377(\377" "\377\377*\377\377\377-\377\377\377+\377\377\377&\377\377\377!\377\377\377" "\35\377\377\377\32\377\377\377\30\377\377\377\27\377\377\377\25\377\377\377" "\24\377\377\377\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377" "\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377" "\12\377\377\377\13\377\377\377\12\377\377\377\13\377\377\377\12\377\377\377" "\13\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\20\377\377\377\21\377\377\377\23\377\377\377\26\377\377\377\30\377\377\377" "\36\377\377\377#\377\377\377+\377\377\3773\377\377\377<\377\377\3775\377" "\377\377)\377\377\377\35\377\377\377\22\377\377\377\20\377\377\377\21\377" "\377\377\22\377\377\377\24\377\377\377\26\377\377\377\27\377\377\377\35\377" "\377\377'\377\377\377*\377\377\377\25\377\377\377\7\377\377\377\20\377\377" "\377\36\377\377\377!\377\377\377%\377\377\377)\377\377\377,\377\377\377," "\377\377\377,\377\377\3771\377\377\3775\377\377\377-\377\377\377$\377\377" "\377%\377\377\3771\377\377\377=\377\377\3778\377\377\377.\377\377\377%\377" "\377\377\"\377\377\377%\377\377\377'\377\377\377*\377\377\377)\377\377\377" "$\377\377\377\40\377\377\377\35\377\377\377\32\377\377\377\26\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377" "\20\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7" "\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\10" "\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\20\377\377\377\22\377\377\377\24\377\377\377\27\377\377\377" "\34\377\377\377\"\377\377\377(\377\377\3771\377\377\377:\377\377\3771\377" "\377\377&\377\377\377\33\377\377\377\22\377\377\377\16\377\377\377\20\377" "\377\377\21\377\377\377\22\377\377\377\24\377\377\377\25\377\377\377\27\377" "\377\377\37\377\377\377)\377\377\377\40\377\377\377\17\377\377\377\10\377" "\377\377\21\377\377\377\35\377\377\377\37\377\377\377\"\377\377\377&\377" "\377\377)\377\377\377*\377\377\377)\377\377\377,\377\377\3771\377\377\377" "/\377\377\377&\377\377\377\37\377\377\377'\377\377\3772\377\377\377=\377" "\377\3773\377\377\377*\377\377\377\"\377\377\377!\377\377\377#\377\377\377" "%\377\377\377'\377\377\377'\377\377\377#\377\377\377\37\377\377\377\33\377" "\377\377\30\377\377\377\25\377\377\377\23\377\377\377\22\377\377\377\21\377" "\377\377\20\377\377\377\20\377\377\377\16\377\377\377\15\377\377\377\15\377" "\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\15\377\377\377" "\16\377\377\377\20\377\377\377\21\377\377\377\23\377\377\377\27\377\377\377" "\33\377\377\377!\377\377\377'\377\377\377.\377\377\3775\377\377\377-\377" "\377\377#\377\377\377\32\377\377\377\21\377\377\377\15\377\377\377\17\377" "\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377\25\377" "\377\377\32\377\377\377!\377\377\377*\377\377\377\30\377\377\377\12\377\377" "\377\11\377\377\377\22\377\377\377\33\377\377\377\36\377\377\377!\377\377" "\377$\377\377\377'\377\377\377'\377\377\377'\377\377\377)\377\377\377-\377" "\377\3770\377\377\377'\377\377\377\40\377\377\377\40\377\377\377)\377\377" "\3773\377\377\3777\377\377\377.\377\377\377&\377\377\377\40\377\377\377\37" "\377\377\377!\377\377\377#\377\377\377%\377\377\377&\377\377\377!\377\377" "\377\36\377\377\377\31\377\377\377\27\377\377\377\24\377\377\377\21\377\377" "\377\20\377\377\377\20\377\377\377\16\377\377\377\16\377\377\377\15\377\377" "\377\14\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377" "\377\377\16\377\377\377\20\377\377\377\22\377\377\377\26\377\377\377\32\377" "\377\377\37\377\377\377$\377\377\377+\377\377\3770\377\377\377(\377\377\377" "\40\377\377\377\31\377\377\377\21\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377" "\25\377\377\377\34\377\377\377#\377\377\377!\377\377\377\22\377\377\377\7" "\377\377\377\12\377\377\377\23\377\377\377\32\377\377\377\34\377\377\377" "\37\377\377\377\"\377\377\377$\377\377\377%\377\377\377%\377\377\377&\377" "\377\377)\377\377\377,\377\377\377(\377\377\377\"\377\377\377\34\377\377" "\377\"\377\377\377*\377\377\3773\377\377\3771\377\377\377*\377\377\377#\377" "\377\377\35\377\377\377\35\377\377\377\37\377\377\377!\377\377\377\"\377" "\377\377#\377\377\377\37\377\377\377\34\377\377\377\30\377\377\377\25\377" "\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377\16\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377\12\377" "\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377\7\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377" "\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377" "\16\377\377\377\17\377\377\377\22\377\377\377\25\377\377\377\31\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377*\377\377\377$\377\377\377\35\377" "\377\377\26\377\377\377\17\377\377\377\14\377\377\377\15\377\377\377\16\377" "\377\377\17\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377" "\377\377\27\377\377\377\35\377\377\377$\377\377\377\32\377\377\377\16\377" "\377\377\6\377\377\377\13\377\377\377\23\377\377\377\31\377\377\377\33\377" "\377\377\35\377\377\377\40\377\377\377\"\377\377\377#\377\377\377#\377\377" "\377#\377\377\377&\377\377\377)\377\377\377)\377\377\377#\377\377\377\35" "\377\377\377\34\377\377\377#\377\377\377+\377\377\3773\377\377\377-\377\377" "\377&\377\377\377\40\377\377\377\33\377\377\377\34\377\377\377\36\377\377" "\377\36\377\377\377\37\377\377\377\40\377\377\377\35\377\377\377\32\377\377" "\377\27\377\377\377\24\377\377\377\22\377\377\377\20\377\377\377\16\377\377" "\377\16\377\377\377\14\377\377\377\14\377\377\377\13\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377" "\377\17\377\377\377\21\377\377\377\24\377\377\377\30\377\377\377\34\377\377" "\377!\377\377\377&\377\377\377%\377\377\377\40\377\377\377\32\377\377\377" "\24\377\377\377\17\377\377\377\12\377\377\377\13\377\377\377\15\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377" "\23\377\377\377\31\377\377\377\37\377\377\377\"\377\377\377\25\377\377\377" "\12\377\377\377\6\377\377\377\14\377\377\377\23\377\377\377\30\377\377\377" "\32\377\377\377\34\377\377\377\36\377\377\377\40\377\377\377\"\377\377\377" "!\377\377\377!\377\377\377#\377\377\377&\377\377\377)\377\377\377$\377\377" "\377\36\377\377\377\31\377\377\377\35\377\377\377$\377\377\377+\377\377\377" "0\377\377\377)\377\377\377#\377\377\377\36\377\377\377\32\377\377\377\32" "\377\377\377\33\377\377\377\34\377\377\377\34\377\377\377\35\377\377\377" "\33\377\377\377\30\377\377\377\26\377\377\377\23\377\377\377\20\377\377\377" "\17\377\377\377\15\377\377\377\14\377\377\377\13\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\11\377\377\377\11\377\377\377\12\377\377\377\14\377\377\377\16\377" "\377\377\21\377\377\377\23\377\377\377\27\377\377\377\33\377\377\377\36\377" "\377\377#\377\377\377!\377\377\377\35\377\377\377\27\377\377\377\22\377\377" "\377\15\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377" "\377\16\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377" "\377\25\377\377\377\32\377\377\377\40\377\377\377\33\377\377\377\20\377\377" "\377\10\377\377\377\7\377\377\377\15\377\377\377\24\377\377\377\27\377\377" "\377\31\377\377\377\33\377\377\377\35\377\377\377\37\377\377\377\40\377\377" "\377\40\377\377\377\40\377\377\377!\377\377\377$\377\377\377&\377\377\377" "$\377\377\377\37\377\377\377\32\377\377\377\30\377\377\377\37\377\377\377" "%\377\377\377+\377\377\377,\377\377\377&\377\377\377\40\377\377\377\33\377" "\377\377\27\377\377\377\27\377\377\377\31\377\377\377\31\377\377\377\31\377" "\377\377\32\377\377\377\31\377\377\377\26\377\377\377\24\377\377\377\22\377" "\377\377\20\377\377\377\16\377\377\377\15\377\377\377\13\377\377\377\13\377" "\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377" "\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\25\377\377\377\31\377\377\377\34\377\377\377" "!\377\377\377\36\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377" "\15\377\377\377\10\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377" "\22\377\377\377\26\377\377\377\33\377\377\377!\377\377\377\26\377\377\377" "\15\377\377\377\6\377\377\377\10\377\377\377\15\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\31\377\377\377\33\377\377\377\35\377\377\377" "\37\377\377\377\37\377\377\377\36\377\377\377\37\377\377\377!\377\377\377" "$\377\377\377%\377\377\377\40\377\377\377\33\377\377\377\27\377\377\377\32" "\377\377\377\40\377\377\377&\377\377\377+\377\377\377'\377\377\377\"\377" "\377\377\34\377\377\377\30\377\377\377\25\377\377\377\25\377\377\377\27\377" "\377\377\27\377\377\377\27\377\377\377\30\377\377\377\27\377\377\377\25\377" "\377\377\23\377\377\377\21\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\10\377\377\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377" "\377\377\21\377\377\377\24\377\377\377\27\377\377\377\33\377\377\377\36\377" "\377\377\32\377\377\377\27\377\377\377\24\377\377\377\17\377\377\377\13\377" "\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\14\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\20\377" "\377\377\23\377\377\377\27\377\377\377\34\377\377\377\34\377\377\377\22\377" "\377\377\12\377\377\377\5\377\377\377\10\377\377\377\15\377\377\377\24\377" "\377\377\25\377\377\377\27\377\377\377\30\377\377\377\32\377\377\377\34\377" "\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\37\377" "\377\377!\377\377\377#\377\377\377\40\377\377\377\34\377\377\377\30\377\377" "\377\26\377\377\377\33\377\377\377\40\377\377\377%\377\377\377)\377\377\377" "#\377\377\377\37\377\377\377\32\377\377\377\26\377\377\377\23\377\377\377" "\24\377\377\377\25\377\377\377\25\377\377\377\26\377\377\377\26\377\377\377" "\25\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\16\377\377\377" "\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377" "\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377" "\377\377\11\377\377\377\12\377\377\377\14\377\377\377\16\377\377\377\20\377" "\377\377\23\377\377\377\26\377\377\377\31\377\377\377\33\377\377\377\27\377" "\377\377\24\377\377\377\21\377\377\377\16\377\377\377\13\377\377\377\10\377" "\377\377\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377" "\377\377\14\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377\20\377" "\377\377\23\377\377\377\30\377\377\377\35\377\377\377\27\377\377\377\17\377" "\377\377\10\377\377\377\5\377\377\377\11\377\377\377\16\377\377\377\23\377" "\377\377\25\377\377\377\26\377\377\377\27\377\377\377\31\377\377\377\33\377" "\377\377\34\377\377\377\34\377\377\377\34\377\377\377\34\377\377\377\35\377" "\377\377\37\377\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377" "\377\25\377\377\377\26\377\377\377\33\377\377\377\37\377\377\377$\377\377" "\377$\377\377\377\40\377\377\377\33\377\377\377\30\377\377\377\24\377\377" "\377\22\377\377\377\23\377\377\377\23\377\377\377\24\377\377\377\23\377\377" "\377\23\377\377\377\24\377\377\377\22\377\377\377\20\377\377\377\17\377\377" "\377\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\24\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377\23\377\377" "\377\20\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377\377" "\377\13\377\377\377\13\377\377\377\15\377\377\377\15\377\377\377\21\377\377" "\377\24\377\377\377\30\377\377\377\33\377\377\377\23\377\377\377\14\377\377" "\377\6\377\377\377\6\377\377\377\11\377\377\377\16\377\377\377\23\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\30\377\377\377\31\377\377" "\377\33\377\377\377\33\377\377\377\33\377\377\377\33\377\377\377\34\377\377" "\377\35\377\377\377\37\377\377\377!\377\377\377\35\377\377\377\31\377\377" "\377\25\377\377\377\23\377\377\377\27\377\377\377\33\377\377\377\36\377\377" "\377\"\377\377\377!\377\377\377\34\377\377\377\31\377\377\377\25\377\377" "\377\22\377\377\377\21\377\377\377\21\377\377\377\22\377\377\377\22\377\377" "\377\21\377\377\377\22\377\377\377\22\377\377\377\21\377\377\377\17\377\377" "\377\15\377\377\377\14\377\377\377\12\377\377\377\12\377\377\377\11\377\377" "\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13" "\377\377\377\14\377\377\377\16\377\377\377\20\377\377\377\22\377\377\377" "\25\377\377\377\25\377\377\377\23\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\7\377\377\377" "\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377" "\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\21\377\377\377" "\24\377\377\377\30\377\377\377\27\377\377\377\17\377\377\377\10\377\377\377" "\3\377\377\377\6\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377" "\23\377\377\377\24\377\377\377\26\377\377\377\27\377\377\377\30\377\377\377" "\32\377\377\377\32\377\377\377\32\377\377\377\32\377\377\377\32\377\377\377" "\34\377\377\377\35\377\377\377\36\377\377\377\35\377\377\377\31\377\377\377" "\26\377\377\377\22\377\377\377\23\377\377\377\27\377\377\377\32\377\377\377" "\36\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\26\377\377\377" "\23\377\377\377\20\377\377\377\17\377\377\377\20\377\377\377\20\377\377\377" "\20\377\377\377\20\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377" "\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\11\377\377\377\12\377\377\377\13\377" "\377\377\15\377\377\377\17\377\377\377\21\377\377\377\24\377\377\377\23\377" "\377\377\21\377\377\377\17\377\377\377\15\377\377\377\12\377\377\377\11\377" "\377\377\6\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377" "\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\12\377\377" "\377\13\377\377\377\14\377\377\377\16\377\377\377\21\377\377\377\25\377\377" "\377\31\377\377\377\22\377\377\377\14\377\377\377\7\377\377\377\3\377\377" "\377\6\377\377\377\11\377\377\377\15\377\377\377\20\377\377\377\22\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377" "\377\30\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\31\377\377" "\377\33\377\377\377\33\377\377\377\34\377\377\377\31\377\377\377\25\377\377" "\377\23\377\377\377\20\377\377\377\23\377\377\377\27\377\377\377\32\377\377" "\377\35\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377\23\377\377" "\377\21\377\377\377\17\377\377\377\16\377\377\377\16\377\377\377\16\377\377" "\377\17\377\377\377\17\377\377\377\17\377\377\377\17\377\377\377\16\377\377" "\377\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\7\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\16\377\377\377" "\20\377\377\377\22\377\377\377\21\377\377\377\17\377\377\377\15\377\377\377" "\13\377\377\377\12\377\377\377\10\377\377\377\6\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\16\377\377\377\21\377\377\377\24\377\377\377\25\377\377\377" "\17\377\377\377\12\377\377\377\5\377\377\377\3\377\377\377\6\377\377\377" "\11\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377" "\23\377\377\377\24\377\377\377\25\377\377\377\27\377\377\377\27\377\377\377" "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\30\377\377\377" "\32\377\377\377\32\377\377\377\30\377\377\377\25\377\377\377\22\377\377\377" "\20\377\377\377\20\377\377\377\23\377\377\377\26\377\377\377\31\377\377\377" "\34\377\377\377\33\377\377\377\27\377\377\377\25\377\377\377\22\377\377\377" "\17\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\15\377\377\377\16\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11" "\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\20\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\7\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\11\377\377\377\12\377\377\377\14\377\377\377" "\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377\14\377\377\377" "\10\377\377\377\4\377\377\377\4\377\377\377\6\377\377\377\12\377\377\377" "\16\377\377\377\17\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377" "\22\377\377\377\24\377\377\377\25\377\377\377\25\377\377\377\25\377\377\377" "\25\377\377\377\25\377\377\377\26\377\377\377\27\377\377\377\30\377\377\377" "\31\377\377\377\30\377\377\377\25\377\377\377\23\377\377\377\20\377\377\377" "\16\377\377\377\20\377\377\377\23\377\377\377\26\377\377\377\30\377\377\377" "\32\377\377\377\30\377\377\377\25\377\377\377\22\377\377\377\20\377\377\377" "\16\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\13\377\377\377\12\377\377\377\11\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\14\377" "\377\377\15\377\377\377\16\377\377\377\15\377\377\377\14\377\377\377\13\377" "\377\377\11\377\377\377\10\377\377\377\7\377\377\377\5\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\7\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\24\377\377\377\17\377\377\377\12\377\377\377\6\377\377\377\3\377\377" "\377\4\377\377\377\7\377\377\377\11\377\377\377\15\377\377\377\16\377\377" "\377\17\377\377\377\20\377\377\377\21\377\377\377\22\377\377\377\23\377\377" "\377\24\377\377\377\25\377\377\377\25\377\377\377\24\377\377\377\23\377\377" "\377\24\377\377\377\25\377\377\377\26\377\377\377\26\377\377\377\30\377\377" "\377\25\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377\16\377\377" "\377\20\377\377\377\23\377\377\377\25\377\377\377\26\377\377\377\30\377\377" "\377\26\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\14\377\377" "\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377" "\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377" "\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\5\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\13\377\377" "\377\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377" "\15\377\377\377\17\377\377\377\22\377\377\377\21\377\377\377\14\377\377\377" "\10\377\377\377\5\377\377\377\2\377\377\377\4\377\377\377\6\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377" "\20\377\377\377\21\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377" "\23\377\377\377\23\377\377\377\23\377\377\377\23\377\377\377\24\377\377\377" "\24\377\377\377\25\377\377\377\26\377\377\377\24\377\377\377\22\377\377\377" "\20\377\377\377\16\377\377\377\14\377\377\377\16\377\377\377\20\377\377\377" "\22\377\377\377\24\377\377\377\25\377\377\377\26\377\377\377\23\377\377\377" "\21\377\377\377\17\377\377\377\15\377\377\377\13\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\12\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377" "\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\13" "\377\377\377\12\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\6\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377" "\377\11\377\377\377\13\377\377\377\15\377\377\377\17\377\377\377\21\377\377" "\377\16\377\377\377\12\377\377\377\7\377\377\377\4\377\377\377\3\377\377" "\377\5\377\377\377\6\377\377\377\11\377\377\377\14\377\377\377\15\377\377" "\377\15\377\377\377\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377" "\377\21\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377\21\377\377" "\377\21\377\377\377\22\377\377\377\23\377\377\377\24\377\377\377\24\377\377" "\377\24\377\377\377\22\377\377\377\17\377\377\377\16\377\377\377\14\377\377" "\377\14\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377\23\377\377" "\377\24\377\377\377\23\377\377\377\21\377\377\377\17\377\377\377\15\377\377" "\377\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377" "\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4" "\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11" "\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\7" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\7\377\377\377\7\377\377\377\11\377\377\377\13\377\377\377\15\377\377\377" "\17\377\377\377\20\377\377\377\14\377\377\377\10\377\377\377\5\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\6\377\377\377\11\377\377\377\13" "\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\20\377\377\377\20\377\377\377\20\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377" "\22\377\377\377\23\377\377\377\23\377\377\377\22\377\377\377\20\377\377\377" "\16\377\377\377\14\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377" "\17\377\377\377\21\377\377\377\22\377\377\377\23\377\377\377\22\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\10\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377\15" "\377\377\377\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\4" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377\10\377" "\377\377\13\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\15\377" "\377\377\15\377\377\377\16\377\377\377\17\377\377\377\20\377\377\377\20\377" "\377\377\20\377\377\377\20\377\377\377\20\377\377\377\17\377\377\377\20\377" "\377\377\21\377\377\377\21\377\377\377\22\377\377\377\21\377\377\377\17\377" "\377\377\16\377\377\377\14\377\377\377\12\377\377\377\12\377\377\377\13\377" "\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377\22\377" "\377\377\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377" "\377\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377" "\3\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7" "\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6" "\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377\15" "\377\377\377\17\377\377\377\13\377\377\377\10\377\377\377\5\377\377\377\3" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377\377\377\11\377" "\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\14\377" "\377\377\15\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377" "\377\377\17\377\377\377\20\377\377\377\21\377\377\377\21\377\377\377\17\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\11\377\377\377\12\377" "\377\377\13\377\377\377\14\377\377\377\16\377\377\377\17\377\377\377\20\377" "\377\377\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\11\377" "\377\377\10\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377" "\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\10\377\377\377\11\377\377\377\13\377\377\377\14\377\377" "\377\15\377\377\377\11\377\377\377\7\377\377\377\5\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\5\377\377\377\6\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377" "\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377\16\377\377\377" "\16\377\377\377\17\377\377\377\17\377\377\377\20\377\377\377\17\377\377\377" "\15\377\377\377\14\377\377\377\12\377\377\377\11\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\14\377\377\377\15\377\377\377\16\377\377\377" "\17\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377" "\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377" "\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377" "\10\377\377\377\11\377\377\377\13\377\377\377\14\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\5\377\377\377\6\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\14\377\377\377\15\377\377\377\15\377\377\377\15\377\377\377" "\15\377\377\377\15\377\377\377\14\377\377\377\15\377\377\377\15\377\377\377" "\16\377\377\377\16\377\377\377\17\377\377\377\16\377\377\377\15\377\377\377" "\13\377\377\377\13\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\15\377\377\377" "\16\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\10\377\377\377" "\7\377\377\377\7\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377" "\11\377\377\377\13\377\377\377\13\377\377\377\11\377\377\377\7\377\377\377" "\5\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4" "\377\377\377\6\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\11" "\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377" "\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377" "\15\377\377\377\15\377\377\377\16\377\377\377\14\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\10\377\377\377" "\11\377\377\377\12\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377" "\14\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\7\377\377\377" "\7\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\11\377\377\377\12" "\377\377\377\12\377\377\377\10\377\377\377\6\377\377\377\4\377\377\377\2" "\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\6\377" "\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\14\377" "\377\377\15\377\377\377\14\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\10\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377\13\377" "\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\6\377\377\377" "\7\377\377\377\10\377\377\377\11\377\377\377\12\377\377\377\10\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377\12\377" "\377\377\12\377\377\377\12\377\377\377\12\377\377\377\13\377\377\377\13\377" "\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377\12\377" "\377\377\13\377\377\377\13\377\377\377\14\377\377\377\14\377\377\377\14\377" "\377\377\13\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377" "\377\377\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\10\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\5\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377\11\377" "\377\377\11\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\13\377\377\377\13\377\377\377\13\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\6\377\377\377\7\377\377\377\10\377\377\377\10\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377" "\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\7" "\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\4\377\377\377\3\377" "\377\377\2\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377" "\377\4\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377" "\7\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377" "\11\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\11\377\377\377\10\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\6" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\10\377\377\377\6\377\377\377" "\5\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\10\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377" "\377\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\5\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\5" "\377\377\377\4\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377" "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\10\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377" "\11\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\10\377\377\377" "\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377" "\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6\377\377" "\377\5\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\7\377\377\377\6\377\377\377\7\377\377\377\7\377\377" "\377\10\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\10" "\377\377\377\10\377\377\377\10\377\377\377\10\377\377\377\7\377\377\377\7" "\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377" "\5\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\4\377\377\377\3" "\377\377\377\2\377\377\377\1\0\0\0\0\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\3\377\377\377\4\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377" "\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377" "\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377\7\377\377\377" "\7\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377\6\377\377\377\5" "\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\4\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\6\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\5\377" "\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\1\377\377" "\377\1\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\5\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6" "\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\5\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377" "\377\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\3\377\377\377\3\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377\377\5\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\6\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\6\377\377\377\5\377\377\377\5\377\377\377\4\377\377\377\4\377\377\377\3" "\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5" "\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377" "\377\377\5\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\5\377\377" "\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377\5\377\377\377" "\5\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0" "\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377" "\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\4\377\377" "\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377\4\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3" "\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\3\377" "\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377\377\3\377\377" "\377\3\377\377\377\3\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377" "\3\377\377\377\3\377\377\377\2\377\377\377\3\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\3\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377" "\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377" "\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\2" "\377\377\377\2\377\377\377\2\377\377\377\2\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1" "\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377" "\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377" "\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377\1\377\377\377" "\1\377\377\377\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" "\1\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" }; ./plugins/wizard/src/0000755000004100000410000000000013246301624015014 5ustar www-datawww-data./plugins/wizard/src/wizard.cpp0000644000004100000410000006404613246301623017031 0ustar www-datawww-data/* * Compiz wizard particle system plugin * * wizard.cpp * * Written by : Sebastian Kuhlen * E-mail : DiCon@tankwar.de * * Ported to Compiz 0.9.x * Copyright : (c) 2010 Scott Moreau * * This plugin and parts of its code have been inspired by the showmouse plugin * by Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include "wizard.h" /* 3 vertices per triangle, 2 triangles per particle */ const unsigned short CACHESIZE_FACTOR = 3 * 2; /* 2 coordinates, x and y */ const unsigned short COORD_COMPONENTS = CACHESIZE_FACTOR * 2; /* each vertex is stored as 3 GLfloats */ const unsigned short VERTEX_COMPONENTS = CACHESIZE_FACTOR * 3; /* 4 colors, RGBA */ const unsigned short COLOR_COMPONENTS = CACHESIZE_FACTOR * 4; ParticleSystem::ParticleSystem () : tex (0), init (false) { } void ParticleSystem::initParticles (int f_hardLimit, int f_softLimit) { particles.clear (); hardLimit = f_hardLimit; softLimit = f_softLimit; active = false; lastCount = 0; // Initialize cache vertices_cache.clear (); coords_cache.clear (); colors_cache.clear (); dcolors_cache.clear (); for (int i = 0; i < hardLimit; ++i) { Particle part; part.t = 0.0f; particles.push_back (part); } } void WizardScreen::loadGPoints () { CompOption::Value::Vector GStrength = optionGetGStrength (); CompOption::Value::Vector GPosx = optionGetGPosx (); CompOption::Value::Vector GPosy = optionGetGPosy (); CompOption::Value::Vector GSpeed = optionGetGSpeed (); CompOption::Value::Vector GAngle = optionGetGAngle (); CompOption::Value::Vector GMovement = optionGetGMovement (); /* ensure that all properties have been updated */ unsigned int ng = GStrength.size (); if (ng != GPosx.size () || ng != GPosy.size () || ng != GSpeed.size () || ng != GAngle.size () || ng != GMovement.size ()) return; ps.g.clear (); for (unsigned int i = 0; i < ng; ++i) { GPoint gi; gi.strength = (float)GStrength.at (i).i () / 1000.0f; gi.x = (float)GPosx.at (i).i (); gi.y = (float)GPosy.at (i).i (); gi.espeed = (float)GSpeed.at (i).i () / 100.0f; gi.eangle = (float)GAngle.at (i).i () / 180.0f * M_PI; gi.movement = GMovement.at (i).i (); ps.g.push_back (gi); } } void WizardScreen::loadEmitters () { CompOption::Value::Vector EActive = optionGetEActive (); CompOption::Value::Vector ETrigger = optionGetETrigger (); CompOption::Value::Vector EPosx = optionGetEPosx (); CompOption::Value::Vector EPosy = optionGetEPosy (); CompOption::Value::Vector ESpeed = optionGetESpeed (); CompOption::Value::Vector EAngle = optionGetEAngle (); CompOption::Value::Vector EMovement = optionGetEMovement (); CompOption::Value::Vector ECount = optionGetECount (); CompOption::Value::Vector EH = optionGetEH (); CompOption::Value::Vector EDh = optionGetEDh (); CompOption::Value::Vector EL = optionGetEL (); CompOption::Value::Vector EDl = optionGetEDl (); CompOption::Value::Vector EA = optionGetEA (); CompOption::Value::Vector EDa = optionGetEDa (); CompOption::Value::Vector EDx = optionGetEDx (); CompOption::Value::Vector EDy = optionGetEDy (); CompOption::Value::Vector EDcirc = optionGetEDcirc (); CompOption::Value::Vector EVx = optionGetEVx (); CompOption::Value::Vector EVy = optionGetEVy (); CompOption::Value::Vector EVt = optionGetEVt (); CompOption::Value::Vector EVphi = optionGetEVphi (); CompOption::Value::Vector EDvx = optionGetEDvx (); CompOption::Value::Vector EDvy = optionGetEDvy (); CompOption::Value::Vector EDvcirc = optionGetEDvcirc (); CompOption::Value::Vector EDvt = optionGetEDvt (); CompOption::Value::Vector EDvphi = optionGetEDvphi (); CompOption::Value::Vector ES = optionGetES (); CompOption::Value::Vector EDs = optionGetEDs (); CompOption::Value::Vector ESnew = optionGetESnew (); CompOption::Value::Vector EDsnew = optionGetEDsnew (); CompOption::Value::Vector EG = optionGetEG (); CompOption::Value::Vector EDg = optionGetEDg (); CompOption::Value::Vector EGp = optionGetEGp (); /* ensure that all properties have been updated */ unsigned int ne = EActive.size (); if (ne != ETrigger.size () || ne != EPosx.size () || ne != EPosy.size () || ne != ESpeed.size () || ne != EAngle.size () || ne != EMovement.size () || ne != ECount.size () || ne != EH.size () || ne != EDh.size () || ne != EL.size () || ne != EDl.size () || ne != EA.size () || ne != EDa.size () || ne != EDx.size () || ne != EDy.size () || ne != EDcirc.size () || ne != EVx.size () || ne != EVy.size () || ne != EVt.size () || ne != EVphi.size () || ne != EDvx.size () || ne != EDvy.size () || ne != EDvcirc.size () || ne != EDvt.size () || ne != EDvphi.size () || ne != ES.size () || ne != EDs.size () || ne != ESnew.size () || ne != EDsnew.size () || ne != EG.size () || ne != EDg.size () || ne != EGp.size ()) return; ps.e.clear (); for (unsigned int i = 0; i < ne; ++i) { Emitter ei; ei.set_active = ei.active = EActive.at (i).b (); ei.trigger = ETrigger.at (i).i (); ei.x = (float)EPosx.at (i).i (); ei.y = (float)EPosy.at (i).i (); ei.espeed = (float)ESpeed.at (i).i () / 100.0f; ei.eangle = (float)EAngle.at (i).i () / 180.0f * M_PI; ei.movement = EMovement.at (i).i (); ei.count = (float)ECount.at (i).i (); ei.h = (float)EH.at (i).i () / 1000.0f; ei.dh = (float)EDh.at (i).i () / 1000.0f; ei.l = (float)EL.at (i).i () / 1000.0f; ei.dl = (float)EDl.at (i).i () / 1000.0f; ei.a = (float)EA.at (i).i () / 1000.0f; ei.da = (float)EDa.at (i).i () / 1000.0f; ei.dx = (float)EDx.at (i).i (); ei.dy = (float)EDy.at (i).i (); ei.dcirc = (float)EDcirc.at (i).i (); ei.vx = (float)EVx.at (i).i () / 1000.0f; ei.vy = (float)EVy.at (i).i () / 1000.0f; ei.vt = (float)EVt.at (i).i () / 10000.0f; ei.vphi = (float)EVphi.at (i).i () / 10000.0f; ei.dvx = (float)EDvx.at (i).i () / 1000.0f; ei.dvy = (float)EDvy.at (i).i () / 1000.0f; ei.dvcirc = (float)EDvcirc.at (i).i () / 1000.0f; ei.dvt = (float)EDvt.at (i).i () / 10000.0f; ei.dvphi = (float)EDvphi.at (i).i () / 10000.0f; ei.s = (float)ES.at (i).i (); ei.ds = (float)EDs.at (i).i (); ei.snew = (float)ESnew.at (i).i (); ei.dsnew = (float)EDsnew.at (i).i (); ei.g = (float)EG.at (i).i () / 1000.0f; ei.dg = (float)EDg.at (i).i () / 1000.0f; ei.gp = (float)EGp.at (i).i () / 10000.0f; ps.e.push_back (ei); } } void ParticleSystem::drawParticles (const GLMatrix &transform) { int i, j, k, l; /* Check that the cache is big enough */ if (vertices_cache.size () < particles.size () * VERTEX_COMPONENTS) vertices_cache.resize (particles.size () * VERTEX_COMPONENTS); if (coords_cache.size () < particles.size () * COORD_COMPONENTS) coords_cache.resize (particles.size () * COORD_COMPONENTS); if (colors_cache.size () < particles.size () * COLOR_COMPONENTS) colors_cache.resize (particles.size () * COLOR_COMPONENTS); if (darken > 0) if (dcolors_cache.size () < particles.size () * COLOR_COMPONENTS) dcolors_cache.resize (particles.size () * COLOR_COMPONENTS); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); if (tex) { glBindTexture (GL_TEXTURE_2D, tex); glEnable (GL_TEXTURE_2D); } i = j = k = l = 0; float offA, offB, cOff; GLfloat xMinusoffA, xMinusoffB, xPlusoffA, xPlusoffB; GLfloat yMinusoffA, yMinusoffB, yPlusoffA, yPlusoffB; GLushort r, g, b, a, dark_a; /* for each particle, use two triangles to display it */ foreach (Particle &part, particles) { if (part.t > 0.0f) { cOff = part.s / 2.0f; //Corner offset from center if (part.t > tnew) //New particles start larger cOff += (part.snew - part.s) * (part.t - tnew) / (1.0f - tnew) / 2.0f; else if (part.t < told) //Old particles shrink cOff -= part.s * (told - part.t) / told / 2.; //Offsets after rotation of Texture offA = cOff * (cos (part.phi) - sin (part.phi)); offB = cOff * (cos (part.phi) + sin (part.phi)); r = part.c[0] * 65535.0f; g = part.c[1] * 65535.0f; b = part.c[2] * 65535.0f; if (part.t > tnew) //New particles start at a == 1 a = part.a + (1.0f - part.a) * (part.t - tnew) / (1.0f - tnew) * 65535.0f; else if (part.t < told) //Old particles fade to a = 0 a = part.a * part.t / told * 65535.0f; else //The others have their own a a = part.a * 65535.0f; dark_a = a * darken; xMinusoffA = part.x - offA; xMinusoffB = part.x - offB; xPlusoffA = part.x + offA; xPlusoffB = part.x + offB; yMinusoffA = part.y - offA; yMinusoffB = part.y - offB; yPlusoffA = part.y + offA; yPlusoffB = part.y + offB; //first triangle vertices_cache[i + 0] = xMinusoffB; vertices_cache[i + 1] = yMinusoffA; vertices_cache[i + 2] = 0; vertices_cache[i + 3] = xMinusoffA; vertices_cache[i + 4] = yPlusoffB; vertices_cache[i + 5] = 0; vertices_cache[i + 6] = xPlusoffB; vertices_cache[i + 7] = yPlusoffA; vertices_cache[i + 8] = 0; //second triangle vertices_cache[i + 9] = xPlusoffB; vertices_cache[i + 10] = yPlusoffA; vertices_cache[i + 11] = 0; vertices_cache[i + 12] = xPlusoffA; vertices_cache[i + 13] = yMinusoffB; vertices_cache[i + 14] = 0; vertices_cache[i + 15] = xMinusoffB; vertices_cache[i + 16] = yMinusoffA; vertices_cache[i + 17] = 0; i += 18; coords_cache[j + 0] = 0.0; coords_cache[j + 1] = 0.0; coords_cache[j + 2] = 0.0; coords_cache[j + 3] = 1.0; coords_cache[j + 4] = 1.0; coords_cache[j + 5] = 1.0; //second coords_cache[j + 6] = 1.0; coords_cache[j + 7] = 1.0; coords_cache[j + 8] = 1.0; coords_cache[j + 9] = 0.0; coords_cache[j + 10] = 0.0; coords_cache[j + 11] = 0.0; j += 12; colors_cache[k + 0] = r; colors_cache[k + 1] = g; colors_cache[k + 2] = b; colors_cache[k + 3] = a; colors_cache[k + 4] = r; colors_cache[k + 5] = g; colors_cache[k + 6] = b; colors_cache[k + 7] = a; colors_cache[k + 8] = r; colors_cache[k + 9] = g; colors_cache[k + 10] = b; colors_cache[k + 11] = a; //second colors_cache[k + 12] = r; colors_cache[k + 13] = g; colors_cache[k + 14] = b; colors_cache[k + 15] = a; colors_cache[k + 16] = r; colors_cache[k + 17] = g; colors_cache[k + 18] = b; colors_cache[k + 19] = a; colors_cache[k + 20] = r; colors_cache[k + 21] = g; colors_cache[k + 22] = b; colors_cache[k + 23] = a; k += 24; if (darken > 0) { dcolors_cache[l + 0] = r; dcolors_cache[l + 1] = g; dcolors_cache[l + 2] = b; dcolors_cache[l + 3] = dark_a; dcolors_cache[l + 4] = r; dcolors_cache[l + 5] = g; dcolors_cache[l + 6] = b; dcolors_cache[l + 7] = dark_a; dcolors_cache[l + 8] = r; dcolors_cache[l + 9] = g; dcolors_cache[l + 10] = b; dcolors_cache[l + 11] = dark_a; //second dcolors_cache[l + 12] = r; dcolors_cache[l + 13] = g; dcolors_cache[l + 14] = b; dcolors_cache[l + 15] = dark_a; dcolors_cache[l + 16] = r; dcolors_cache[l + 17] = g; dcolors_cache[l + 18] = b; dcolors_cache[l + 19] = dark_a; dcolors_cache[l + 20] = r; dcolors_cache[l + 21] = g; dcolors_cache[l + 22] = b; dcolors_cache[l + 23] = dark_a; l += 24; } } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); if (darken > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (l / 4, &dcolors_cache[0]); if (stream->end ()) stream->render (transform); } /* draw particles */ glBlendFunc (GL_SRC_ALPHA, blendMode); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (k / 4, &colors_cache[0]); if (stream->end ()) stream->render (transform); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_TEXTURE_2D); /* only disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); } void ParticleSystem::updateParticles (float time) { int i, j; int newCount = 0; Particle *part; GPoint *gi; float gdist, gangle; active = false; part = &particles[0]; for (i = 0; i < hardLimit; i++, part++) { if (part->t > 0.0f) { // move particle part->x += part->vx * time; part->y += part->vy * time; // Rotation part->phi += part->vphi*time; //Aging of particles part->t += part->vt * time; //Additional aging of particles increases if softLimit is exceeded if (lastCount > softLimit) part->t += part->vt * time * (lastCount - softLimit) / (hardLimit - softLimit); //Global gravity part->vx += gx * time; part->vy += gy * time; //GPoint gravity gi = &g[0]; for (j = 0; (unsigned int)j < g.size (); ++j, ++gi) { if (gi->strength != 0) { gdist = sqrt ((part->x-gi->x)*(part->x-gi->x) + (part->y-gi->y)*(part->y-gi->y)); if (gdist > 1) { gangle = atan2 (gi->y-part->y, gi->x-part->x); part->vx += gi->strength / gdist * cos (gangle) * time; part->vy += gi->strength / gdist * sin (gangle) * time; } } } active = true; newCount++; } } lastCount = newCount; //Particle gravity Particle *gpart; part = &particles[0]; for (i = 0; i < hardLimit; ++i, ++part) { if (part->t > 0.0f && part->g != 0) { gpart = &particles[0]; for (j = 0; j < hardLimit; ++j, ++gpart) { if (gpart->t > 0.0f) { gdist = sqrt ((part->x-gpart->x)*(part->x-gpart->x) + (part->y-gpart->y)*(part->y-gpart->y)); if (gdist > 1) { gangle = atan2 (part->y-gpart->y, part->x-gpart->x); gpart->vx += part->g/gdist* cos (gangle) * part->t*time; gpart->vy += part->g/gdist* sin (gangle) * part->t*time; } } } } } } void ParticleSystem::finiParticles () { particles.clear (); if (tex) glDeleteTextures (1, &tex); init = false; } void ParticleSystem::genNewParticles (Emitter *e) { float q, p, t = 0, h, l; int count = e->count; Particle *part = &particles[0]; int i, j; for (i = 0; i < hardLimit && count > 0; ++i, ++part) { if (part->t <= 0.0f) { //Position part->x = rRange (e->x, e->dx); // X Position part->y = rRange (e->y, e->dy); // Y Position if ((q = rRange (e->dcirc/2.,e->dcirc/2.)) > 0) { p = rRange (0, M_PI); part->x += q * cos (p); part->y += q * sin (p); } //Speed part->vx = rRange (e->vx, e->dvx); // X Speed part->vy = rRange (e->vy, e->dvy); // Y Speed if ((q = rRange (e->dvcirc / 2.0f, e->dvcirc / 2.0f)) > 0) { p = rRange (0, M_PI); part->vx += q * cos (p); part->vy += q * sin (p); } part->vt = rRange (e->vt, e->dvt); // Aging speed if (part->vt > -0.0001f) part->vt = -0.0001f; //Size, Gravity and Rotation part->s = rRange (e->s, e->ds); // Particle size part->snew = rRange (e->snew, e->dsnew); // Particle start size if (e->gp > (float)(random () & 0xffff) / 65535.0f) part->g = rRange (e->g, e->dg); // Particle gravity else part->g = 0.0f; part->phi = rRange (0, M_PI); // Random orientation part->vphi = rRange (e->vphi, e->dvphi); // Rotation speed //Alpha part->a = rRange (e->a, e->da); // Alpha if (part->a > 1) part->a = 1.0f; else if (part->a < 0) part->a = 0.0f; //HSL to RGB conversion from Wikipedia simplified by S = 1 h = rRange (e->h, e->dh); //Random hue within range if (h < 0) h += 1.0f; else if (t > 1) h -= 1.0f; l = rRange (e->l, e->dl); //Random lightness ... if (l > 1) l = 1.0f; else if (l < 0) l = 0.0f; q = e->l * 2; if (q > 1) q = 1.0f; p = 2 * e->l - q; for (j = 0; j < 3; j++) { t = h + (1-j)/3.0f; if (t < 0) t += 1.0f; else if (t > 1) t -= 1.0f; if (t < 1/6.) part->c[j] = p + ((q-p)*6*t); else if (t < 0.5f) part->c[j] = q; else if (t < 2/3.) part->c[j] = p + ((q-p)*6*(2/3.-t)); else part->c[j] = p; } // give new life part->t = 1.0f; active = true; count -= 1; } } } void WizardScreen::positionUpdate (const CompPoint &pos) { mx = pos.x (); my = pos.y (); if (ps.init && active) { Emitter *ei = &(ps.e[0]); GPoint *gi = &(ps.g[0]); for (unsigned int i = 0; i < ps.g.size (); ++i, ++gi) { if (gi->movement == MOVEMENT_MOUSEPOSITION) { gi->x = pos.x (); gi->y = pos.y (); } } for (unsigned int i = 0; i < ps.e.size (); ++i, ++ei) { if (ei->movement == MOVEMENT_MOUSEPOSITION) { ei->x = pos.x (); ei->y = pos.y (); } if (ei->active && ei->trigger == TRIGGER_MOUSEMOVEMENT) ps.genNewParticles (ei); } } } void WizardScreen::preparePaint (int time) { if (active && !pollHandle.active ()) pollHandle.start (); if (active && !ps.init) { ps.init = true; loadGPoints (); loadEmitters (); ps.initParticles (optionGetHardLimit (), optionGetSoftLimit ()); ps.darken = optionGetDarken (); ps.blendMode = (optionGetBlend ()) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; ps.tnew = optionGetTnew (); ps.told = optionGetTold (); ps.gx = optionGetGx (); ps.gy = optionGetGy (); ps.active = true; glGenTextures (1, &ps.tex); glBindTexture (GL_TEXTURE_2D, ps.tex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, particleTex); glBindTexture (GL_TEXTURE_2D, 0); } if (ps.init && active) { Emitter *ei = &(ps.e[0]); GPoint *gi = &(ps.g[0]); for (unsigned int i = 0; i < ps.g.size (); ++i, ++gi) { if (gi->movement == MOVEMENT_BOUNCE || gi->movement == MOVEMENT_WRAP) { gi->x += gi->espeed * cos (gi->eangle) * time; gi->y += gi->espeed * sin (gi->eangle) * time; if (gi->x >= screen->width ()) { if (gi->movement == MOVEMENT_BOUNCE) { gi->x = 2*screen->width () - gi->x - 1; gi->eangle = M_PI - gi->eangle; } else if (gi->movement == MOVEMENT_WRAP) gi->x -= screen->width (); } else if (gi->x < 0) { if (gi->movement == MOVEMENT_BOUNCE) { gi->x *= -1; gi->eangle = M_PI - gi->eangle; } else if (gi->movement == MOVEMENT_WRAP) gi->x += screen->width (); } if (gi->y >= screen->height ()) { if (gi->movement == MOVEMENT_BOUNCE) { gi->y = 2*screen->height () - gi->y - 1; gi->eangle *= -1; } else if (gi->movement == MOVEMENT_WRAP) gi->y -= screen->height (); } else if (gi->y < 0) { if (gi->movement == MOVEMENT_BOUNCE) { gi->y *= -1; gi->eangle *= -1; } else if (gi->movement == MOVEMENT_WRAP) gi->y += screen->height (); } } if (gi->movement == MOVEMENT_FOLLOWMOUSE && (my!=gi->y||mx!=gi->x)) { gi->eangle = atan2(my-gi->y, mx-gi->x); gi->x += gi->espeed * cos(gi->eangle) * time; gi->y += gi->espeed * sin(gi->eangle) * time; } } for (unsigned int i = 0; i < ps.e.size (); ++i, ++ei) { if (ei->movement == MOVEMENT_BOUNCE || ei->movement == MOVEMENT_WRAP) { ei->x += ei->espeed * cos (ei->eangle) * time; ei->y += ei->espeed * sin (ei->eangle) * time; if (ei->x >= screen->width ()) { if (ei->movement == MOVEMENT_BOUNCE) { ei->x = 2*screen->width () - ei->x - 1; ei->eangle = M_PI - ei->eangle; } else if (ei->movement == MOVEMENT_WRAP) ei->x -= screen->width (); } else if (ei->x < 0) { if (ei->movement == MOVEMENT_BOUNCE) { ei->x *= -1; ei->eangle = M_PI - ei->eangle; } else if (ei->movement == MOVEMENT_WRAP) ei->x += screen->width (); } if (ei->y >= screen->height ()) { if (ei->movement == MOVEMENT_BOUNCE) { ei->y = 2*screen->height () - ei->y - 1; ei->eangle *= -1; } else if (ei->movement == MOVEMENT_WRAP) ei->y -= screen->height (); } else if (ei->y < 0) { if (ei->movement == MOVEMENT_BOUNCE) { ei->y *= -1; ei->eangle *= -1; } else if (ei->movement == MOVEMENT_WRAP) ei->y += screen->height (); } } if (ei->movement == MOVEMENT_FOLLOWMOUSE && (my!=ei->y||mx!=ei->x)) { ei->eangle = atan2 (my-ei->y, mx-ei->x); ei->x += ei->espeed * cos (ei->eangle) * time; ei->y += ei->espeed * sin (ei->eangle) * time; } if (ei->trigger == TRIGGER_RANDOMPERIOD && ei->set_active && !((int)random ()&0xff)) ei->active = !ei->active; if (ei->active && ( (ei->trigger == TRIGGER_PERSISTENT) || (ei->trigger == TRIGGER_RANDOMSHOT && !((int)random()&0xff)) || (ei->trigger == TRIGGER_RANDOMPERIOD) )) ps.genNewParticles (ei); } } if (ps.active) { ps.updateParticles (time); cScreen->damageScreen (); } cScreen->preparePaint (time); } void WizardScreen::donePaint () { if (active || ps.active) cScreen->damageScreen (); if (!active && pollHandle.active ()) pollHandle.stop (); if (!active && !ps.active) { ps.finiParticles (); toggleFunctions (false); } cScreen->donePaint (); } bool WizardScreen::glPaintOutput (const GLScreenPaintAttrib &sa, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (sa, transform, region, output, mask); GLMatrix sTransform = transform; if (!ps.active) return status; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); ps.drawParticles (sTransform); return status; } bool WizardScreen::toggle () { active = !active; if (active) toggleFunctions (true); cScreen->damageScreen (); return true; } void WizardScreen::toggleFunctions(bool enabled) { cScreen->preparePaintSetEnabled (this, enabled); cScreen->donePaintSetEnabled (this, enabled); gScreen->glPaintOutputSetEnabled (this, enabled); } void WizardScreen::optionChanged (CompOption *opt, WizardOptions::Options num) { /* checked seperately to allow testing * the results of individual settings * without disturbing the particles * already on the screen */ if (opt->name () == "hard_limit") ps.initParticles (optionGetHardLimit (), optionGetSoftLimit ()); else if (opt->name () == "soft_limit") ps.softLimit = optionGetSoftLimit (); else if (opt->name () == "darken") ps.darken = optionGetDarken (); else if (opt->name () == "blend") ps.blendMode = (optionGetBlend ()) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; else if (opt->name () == "tnew") ps.tnew = optionGetTnew (); else if (opt->name () == "told") ps.told = optionGetTold (); else if (opt->name () == "gx") ps.gx = optionGetGx (); else if (opt->name () == "gy") ps.gy = optionGetGy (); else { loadGPoints (); loadEmitters (); } } WizardScreen::WizardScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), active (false) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); #define optionNotify(name) \ optionSet##name##Notify (boost::bind (&WizardScreen::optionChanged, \ this, _1, _2)) optionNotify (HardLimit); optionNotify (SoftLimit); optionNotify (Darken); optionNotify (Blend); optionNotify (Tnew); optionNotify (Told); optionNotify (Gx); optionNotify (Gy); optionNotify (GStrength); optionNotify (GPosx); optionNotify (GPosy); optionNotify (GSpeed); optionNotify (GAngle); optionNotify (GMovement); optionNotify (EActive); optionNotify (EName); optionNotify (ETrigger); optionNotify (EPosx); optionNotify (EPosy); optionNotify (ESpeed); optionNotify (EAngle); optionNotify (GMovement); optionNotify (ECount); optionNotify (EH); optionNotify (EDh); optionNotify (EL); optionNotify (EDl); optionNotify (EA); optionNotify (EDa); optionNotify (EDx); optionNotify (EDy); optionNotify (EDcirc); optionNotify (EVx); optionNotify (EVy); optionNotify (EVt); optionNotify (EVphi); optionNotify (EDvx); optionNotify (EDvy); optionNotify (EDvcirc); optionNotify (EDvt); optionNotify (EDvphi); optionNotify (ES); optionNotify (EDs); optionNotify (ESnew); optionNotify (EDsnew); optionNotify (EG); optionNotify (EDg); optionNotify (EGp); #undef optionNotify pollHandle.setCallback (boost::bind (&WizardScreen::positionUpdate, this, _1)); optionSetToggleInitiate (boost::bind (&WizardScreen::toggle, this)); } WizardScreen::~WizardScreen () { if (pollHandle.active ()) pollHandle.stop (); if (ps.active) cScreen->damageScreen (); } bool WizardPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } ./plugins/wizard/wizard.xml.in0000644000004100000410000006057713246301623016672 0ustar www-datawww-data <_short>Wizard <_long>Wastes resources to create fancy particle systems for wizard-wannabes :) Effects opengl cube opengl mousepoll <_short>General <_short>Gravity <_short>Global gravity <_short>Point gravity sources <_short>Emitters <_short>General <_short>Advanced ./plugins/mag/0000755000004100000410000000000013246301623013470 5ustar www-datawww-data./plugins/mag/CMakeLists.txt0000644000004100000410000000016213246301623016227 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (mag PLUGINDEPS composite opengl mousepoll) ./plugins/mag/mag.xml.in0000644000004100000410000001072113246301623015364 0ustar www-datawww-data <_short>Magnifier <_long>Magnifier box Accessibility composite opengl mousepoll cube decor imgsvg imgpng imgjpeg opengl mousepoll <_short>Bindings <_short>General <_short>Simple <_short>Image overlay <_short>Fisheye ./plugins/mag/src/0000755000004100000410000000000013246301623014257 5ustar www-datawww-data./plugins/mag/src/mag.h0000644000004100000410000000637513246301623015207 0ustar www-datawww-data/* * * Compiz magnifier plugin * * mag.h * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include "mag_options.h" #define MAG_SCREEN(s) \ MagScreen *ms = MagScreen::get (s) class MagScreen : public PluginClassHandler , public MagOptions, public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface { public: MagScreen (CompScreen *screen); ~MagScreen (); CompositeScreen *cScreen; GLScreen *gScreen; int posX; int posY; bool adjust; GLfloat zVelocity; GLfloat zTarget; GLfloat zoom; enum MagOptions::Mode mode; GLuint texture; GLenum target; int width; int height; GLTexture::List overlay; GLTexture::List mask; CompSize overlaySize, maskSize; GLuint program; MousePoller poller; bool checkStateTimeout (); void preparePaint (int ms); bool glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask); void donePaint (); void cleanup (); bool loadFragmentProgram (); bool loadImages (); void optionChanged (CompOption *opt, MagOptions::Options num); void doDamageRegion (); void positionUpdate (const CompPoint &pos); int adjustZoom (float chunk); void paintSimple (); void paintImage (); void paintFisheye (); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options); bool zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options); }; class MagPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; #if 0 static const char *fisheyeFpString = "!!ARBfp1.0" "PARAM p0 = program.env[0];" "PARAM p1 = program.env[1];" "PARAM p2 = program.env[2];" "TEMP t0, t1, t2, t3;" "SUB t1, p0.xyww, fragment.texcoord[0];" "DP3 t2, t1, t1;" "RSQ t2, t2.x;" "SUB t0, t2, p0;" "RCP t3, t2.x;" "MAD t3, t3, p1.z, p2.z;" "COS t3, t3.x;" "MUL t3, t3, p1.w;" "MUL t1, t2, t1;" "MAD t1, t1, t3, fragment.texcoord[0];" "CMP t1, t0.z, fragment.texcoord[0], t1;" "MAD t1, t1, p1, p2;" "TEX result.color, t1, texture[0], %s;" "END"; #endif ./plugins/mag/src/mag.cpp0000644000004100000410000005567213246301623015546 0ustar www-datawww-data/* * * Compiz magnifier plugin * * mag.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "mag.h" COMPIZ_PLUGIN_20090315 (mag, MagPluginVTable); void MagScreen::cleanup () { if (overlay.size ()) { overlay.clear (); } if (mask.size ()) { mask.clear (); } if (program) { #if 0 GL::deletePrograms (1, &program); #endif program = 0; } } bool MagScreen::loadFragmentProgram () { #if 0 char buffer[1024]; GLsizei bufSize; GLint errorPos; if (!GL::fragmentProgram) return false; if (target == GL_TEXTURE_2D) sprintf (buffer, fisheyeFpString, "2D"); else sprintf (buffer, fisheyeFpString, "RECT"); /* clear errors */ glGetError (); if (!program) GL::genPrograms (1, &program); bufSize = (GLsizei) strlen (buffer); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, program); GL::programString (GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, bufSize, buffer); glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos); if (glGetError () != GL_NO_ERROR || errorPos != -1) { compLogMessage ("mag", CompLogLevelError, "failed to load fisheye fragment program"); GL::deletePrograms (1, &program); program = 0; return false; } GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, 0); return true; #endif return false; } bool MagScreen::loadImages () { #if 0 CompString overlay_s = optionGetOverlay (); CompString mask_s = optionGetMask (); CompString pname ("mag"); if (!GL::multiTexCoord2f) return false; overlay = GLTexture::readImageToTexture (overlay_s, pname, overlaySize); if (!overlay.size ()) { compLogMessage ("mag", CompLogLevelWarn, "Could not load magnifier overlay image \"%s\"!", overlay_s.c_str ()); return false; } mask = GLTexture::readImageToTexture (mask_s, pname, maskSize); if (!mask.size ()) { compLogMessage ("mag", CompLogLevelWarn, "Could not load magnifier mask image \"%s\"!", mask_s.c_str ()); overlay.clear (); return false; } if (overlaySize.width () != maskSize.width () || overlaySize.height () != maskSize.height ()) { compLogMessage ("mag", CompLogLevelWarn, "Image dimensions do not match!"); overlay.clear (); mask.clear (); return false; } return true; #endif return false; } void MagScreen::optionChanged (CompOption *opt, MagOptions::Options num) { cleanup (); switch (optionGetMode ()) { case ModeImageOverlay: if (loadImages ()) mode = MagOptions::ModeImageOverlay; else mode = MagOptions::ModeSimple; break; case MagOptions::ModeFisheye: if (loadFragmentProgram ()) mode = MagOptions::ModeFisheye; else mode = MagOptions::ModeSimple; break; default: mode = MagOptions::ModeSimple; } if (zoom != 1.0) cScreen->damageScreen (); } void MagScreen::doDamageRegion () { int w, h, x, y; CompRegion region; switch (mode) { case MagOptions::ModeSimple: { int b; w = optionGetBoxWidth (); h = optionGetBoxHeight (); b = optionGetBorder (); w += 2 * b; h += 2 * b; x = MAX (0, MIN (posX - (w / 2), screen->width () - w)); y = MAX (0, MIN (posY - (h / 2), screen->height () - h)); CompRegion tmpRegion (x, y, w, h); region = tmpRegion; } break; case MagOptions::ModeImageOverlay: { x = posX - optionGetXOffset (); y = posY - optionGetYOffset (); w = overlaySize.width (); h = overlaySize.height (); CompRegion tmpRegion (x, y, w, h); region = tmpRegion; } break; case MagOptions::ModeFisheye: { int radius = optionGetRadius (); int x2, y2; x = MAX (0.0, posX - radius); y = MAX (0.0, posY - radius); x2 = MIN (screen->width (), posX + radius); y2 = MIN (screen->height (), posY + radius); w = x2 - x; h = y2 - y; CompRegion tmpRegion (x, y, w, h); region = tmpRegion; } break; default: break; } cScreen->damageRegion (region); } void MagScreen::positionUpdate (const CompPoint &pos) { doDamageRegion (); posX = pos.x (); posY = pos.y (); doDamageRegion (); } int MagScreen::adjustZoom (float chunk) { float dx, adjust, amount; float change; dx = zTarget - zoom; adjust = dx * 0.15f; amount = fabs(dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; zVelocity = (amount * zVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.002f && fabs (zVelocity) < 0.004f) { zVelocity = 0.0f; zoom = zTarget; return false; } change = zVelocity * chunk; if (!change) { if (zVelocity) change = (dx > 0) ? 0.01 : -0.01; } zoom += change; return true; } void MagScreen::preparePaint (int time) { if (adjust) { int steps; float amount, chunk; amount = time * 0.35f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { adjust = adjustZoom (chunk); if (adjust) break; } } if (zoom != 1.0) { if (!poller.active ()) { CompPoint pos; pos = poller.getCurrentPosition (); posX = pos.x (); posY = pos.y (); poller.start (); } doDamageRegion (); } cScreen->preparePaint (time); } void MagScreen::donePaint () { if (adjust) doDamageRegion (); if (!adjust && zoom == 1.0 && (width || height)) { glBindTexture (target, texture); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); width = 0; height = 0; glBindTexture (target, 0); } if (zoom == 1.0 && !adjust) { // Mag mode has ended cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); if (poller.active ()) poller.stop (); } cScreen->donePaint (); } void MagScreen::paintSimple () { float pw, ph, bw, bh; int x1, x2, y1, y2; float vc[4]; float tc[4]; int w, h, cw, ch, cx, cy; bool kScreen; unsigned short *color; float tmp; GLMatrix projection; GLMatrix modelview; GLVertexBuffer *vb = GLVertexBuffer::streamingBuffer (); const GLWindowPaintAttrib attrib = { OPAQUE, BRIGHT, COLOR, 0, 0, 0, 0 }; w = optionGetBoxWidth (); h = optionGetBoxHeight (); kScreen = optionGetKeepScreen (); x1 = posX - (w / 2); if (kScreen) x1 = MAX (0, MIN (x1, screen->width () - w)); x2 = x1 + w; y1 = posY - (h / 2); if (kScreen) y1 = MAX (0, MIN (y1, screen->height () - h)); y2 = y1 + h; cw = ceil ((float)w / (zoom * 2.0)) * 2.0; ch = ceil ((float)h / (zoom * 2.0)) * 2.0; cw = MIN (w, cw + 2); ch = MIN (h, ch + 2); cx = (w - cw) / 2; cy = (h - ch) / 2; cx = MAX (0, MIN (w - cw, cx)); cy = MAX (0, MIN (h - ch, cy)); if (x1 != (posX - (w / 2))) { cx = 0; cw = w; } if (y1 != (posY - (h / 2))) { cy = 0; ch = h; } glBindTexture (target, texture); if (width != w || height != h) { glCopyTexImage2D(target, 0, GL_RGB, x1, screen->height () - y2, w, h, 0); width = w; height = h; } else glCopyTexSubImage2D (target, 0, cx, cy, x1 + cx, screen->height () - y2 + cy, cw, ch); if (target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; tc[0] = 0.0; tc[1] = w * pw; tc[2] = h * ph; tc[3] = 0.0; /* Draw zoom box contents */ glScissor (x1, screen->height () - y2, w, h); glEnable (GL_SCISSOR_TEST); modelview.translate ((float)(posX - (screen->width () / 2)) * 2 / screen->width (), (float)(posY - (screen->height () / 2)) * 2 / -screen->height (), 0.0); modelview.scale (zoom, zoom, 1.0); modelview.translate ((float)((screen->width () / 2) - posX) * 2 / screen->width (), (float)((screen->height () / 2) - posY) * 2 / -screen->height (), 0.0); GLfloat vertices[] = { vc[0], vc[2], 0, vc[0], vc[3], 0, vc[1], vc[2], 0, vc[1], vc[3], 0, }; GLfloat texcoords[] = { tc[0], tc[2], tc[0], tc[3], tc[1], tc[2], tc[1], tc[3], }; vb->begin (GL_TRIANGLE_STRIP); vb->colorDefault (); vb->addVertices (4, vertices); vb->addTexCoords (0, 4, texcoords); vb->end (); vb->render (projection, modelview, attrib); glDisable (GL_SCISSOR_TEST); modelview.reset (); glBindTexture (target, 0); /* Save blending state */ #if USE_GLES GLboolean isBlendingEnabled = GL_TRUE; GLint blendSrcRGB = GL_ONE; GLint blendSrcAlpha = GL_ONE; GLint blendDstRGB = GL_ZERO; GLint blendDstAlpha = GL_ZERO; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glGetIntegerv (GL_BLEND_SRC_RGB, &blendSrcRGB); glGetIntegerv (GL_BLEND_DST_RGB, &blendDstRGB); glGetIntegerv (GL_BLEND_SRC_ALPHA, &blendSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &blendDstAlpha); #else glPushAttrib (GL_COLOR_BUFFER_BIT); #endif /* Draw zoom box border */ glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); tmp = MIN (1.0, (zoom - 1) * 3.0); bw = bh = optionGetBorder (); bw = bw * 2.0 / screen->width (); bh = bh * 2.0 / screen->height (); bw = bh = optionGetBorder (); bw *= 2.0 / (float)screen->width (); bh *= 2.0 / (float)screen->height (); color = optionGetBoxColor (); GLfloat verticesBorder[] = { vc[0] - bw, vc[2] + bh, 0, vc[0], vc[2], 0, vc[1] + bw, vc[2] + bh, 0, vc[1], vc[2], 0, vc[1] + bw, vc[3] - bh, 0, vc[1], vc[3], 0, vc[0] - bw, vc[3] - bh, 0, vc[0], vc[3], 0, vc[0] - bw, vc[2] + bh, 0, vc[0], vc[2], 0, }; vb->begin (GL_TRIANGLE_STRIP); vb->color4f (color[0] / 65535.0, color[1] / 65535.0, color[2] / 65535.0, color[3] * tmp / 65535.0); vb->addVertices (10, verticesBorder); vb->end (); vb->render (projection, modelview, attrib); vb->colorDefault (); /* Restore blending state */ #if USE_GLES if (!isBlendingEnabled) glDisable (GL_BLEND); glBlendFuncSeparate (blendSrcRGB, blendDstRGB, blendSrcAlpha, blendDstAlpha); #else glPopAttrib (); #endif } void MagScreen::paintImage () { #if 0 float pw, ph; int x1, x2, y1, y2; float vc[4]; float tc[4]; int w, h, cw, ch, cx, cy; float tmp, xOff, yOff; w = overlaySize.width (); h = overlaySize.height (); xOff = MIN (w, optionGetXOffset ()); yOff = MIN (h, optionGetYOffset ()); x1 = posX - xOff; x2 = x1 + w; y1 = posY - yOff; y2 = y1 + h; cw = ceil ((float)w / (zoom * 2.0)) * 2.0; ch = ceil ((float)h / (zoom * 2.0)) * 2.0; cw = MIN (w, cw + 2); ch = MIN (h, ch + 2); cx = floor (xOff - (xOff / zoom)); cy = h - ch - floor (yOff - (yOff / zoom)); cx = MAX (0, MIN (w - cw, cx)); cy = MAX (0, MIN (h - ch, cy)); glPushAttrib (GL_TEXTURE_BIT); glEnable (target); glBindTexture (target, texture); if (width != w || height != h) { glCopyTexImage2D(target, 0, GL_RGB, x1, screen->height () - y2, w, h, 0); width = w; height = h; } else glCopyTexSubImage2D (target, 0, cx, cy, x1 + cx, screen->height () - y2 + cy, cw, ch); if (target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; tc[0] = xOff - (xOff / zoom); tc[1] = tc[0] + (w / zoom); tc[2] = h - (yOff - (yOff / zoom)); tc[3] = tc[2] - (h / zoom); tc[0] *= pw; tc[1] *= pw; tc[2] *= ph; tc[3] *= ph; glEnable (GL_BLEND); glColor4usv (defaultColor); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); GL::activeTexture (GL_TEXTURE1_ARB); foreach (GLTexture *tex, mask) { tex->enable (GLTexture::Good); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_QUADS); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[0], tc[2]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[0], vc[2]); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[0], tc[3]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[0], vc[3]); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[1], tc[3]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[1], vc[3]); GL::multiTexCoord2f (GL_TEXTURE0_ARB, tc[1], tc[2]); GL::multiTexCoord2f (GL_TEXTURE1_ARB, COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[1], vc[2]); glEnd (); tex->disable (); } GL::activeTexture (GL_TEXTURE0_ARB); glBindTexture (target, 0); glDisable (target); tmp = MIN (1.0, (zoom - 1) * 3.0); glColor4f (tmp, tmp, tmp, tmp); foreach (GLTexture *tex, overlay) { tex->enable (GLTexture::Fast); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBegin (GL_QUADS); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[0], vc[2]); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), 0), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[0], vc[3]); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), h)); glVertex2f (vc[1], vc[3]); glTexCoord2f (COMP_TEX_COORD_X (tex->matrix (), w), COMP_TEX_COORD_Y (tex->matrix (), 0)); glVertex2f (vc[1], vc[2]); glEnd (); tex->disable (); } glColor4usv (defaultColor); glDisable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glPopMatrix(); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopAttrib (); #endif } void MagScreen::paintFisheye () { #if 0 float pw, ph; float radius, fZoom, base; // fZoom is the local zoom variable int x1, x2, y1, y2; float vc[4]; int size; radius = optionGetRadius (); base = 0.5 + (0.0015 * radius); fZoom = (zoom * base) + 1.0 - base; size = radius + 1; x1 = MAX (0.0, posX - size); x2 = MIN (screen->width (), posX + size); y1 = MAX (0.0, posY - size); y2 = MIN (screen->height (), posY + size); glEnable (target); glBindTexture (target, texture); if (width != 2 * size || height != 2 * size) { glCopyTexImage2D(target, 0, GL_RGB, x1, screen->height () - y2, size * 2, size * 2, 0); width = height = 2 * size; } else glCopyTexSubImage2D (target, 0, 0, 0, x1, screen->height () - y2, x2 - x1, y2 - y1); if (target == GL_TEXTURE_2D) { pw = 1.0 / width; ph = 1.0 / height; } else { pw = 1.0; ph = 1.0; } glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glColor4usv (defaultColor); glEnable (GL_FRAGMENT_PROGRAM_ARB); GL::bindProgram (GL_FRAGMENT_PROGRAM_ARB, program); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 0, posX, screen->height () - posY, 1.0 / radius, 0.0f); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 1, pw, ph, M_PI / radius, (fZoom - 1.0) * fZoom); GL::programEnvParameter4f (GL_FRAGMENT_PROGRAM_ARB, 2, -x1 * pw, -(screen->height () - y2) * ph, -M_PI / 2.0, 0.0); x1 = MAX (0.0, posX - radius); x2 = MIN (screen->width (), posX + radius); y1 = MAX (0.0, posY - radius); y2 = MIN (screen->height (), posY + radius); vc[0] = ((x1 * 2.0) / screen->width ()) - 1.0; vc[1] = ((x2 * 2.0) / screen->width ()) - 1.0; vc[2] = ((y1 * -2.0) / screen->height ()) + 1.0; vc[3] = ((y2 * -2.0) / screen->height ()) + 1.0; y1 = screen->height () - y1; y2 = screen->height () - y2; glBegin (GL_QUADS); glTexCoord2f (x1, y1); glVertex2f (vc[0], vc[2]); glTexCoord2f (x1, y2); glVertex2f (vc[0], vc[3]); glTexCoord2f (x2, y2); glVertex2f (vc[1], vc[3]); glTexCoord2f (x2, y1); glVertex2f (vc[1], vc[2]); glEnd (); glDisable (GL_FRAGMENT_PROGRAM_ARB); glColor4usv (defaultColor); glPopMatrix(); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glBindTexture (target, 0); glDisable (target); #endif } bool MagScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (zoom == 1.0) return status; /* Temporarily set the viewport to fullscreen */ glViewport (0, 0, screen->width (), screen->height ()); switch (mode) { case MagOptions::ModeImageOverlay: paintImage (); break; case MagOptions::ModeFisheye: paintFisheye (); break; default: paintSimple (); } gScreen->setDefaultViewport (); return status; } bool MagScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { zTarget = 1.0; adjust = true; cScreen->damageScreen (); return true; } bool MagScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { float factor; factor = CompOption::getFloatOptionNamed (options, "factor", 0); if (factor == 0.0 && zTarget != 1.0) return terminate (action, state, options); if (mode == MagOptions::ModeFisheye) { if (factor != 1.0) factor = optionGetZoomFactor () * 3; zTarget = MAX (1.0, MIN (10.0, factor)); } else { if (factor != 1.0) factor = optionGetZoomFactor (); zTarget = MAX (1.0, MIN (64.0, factor)); } adjust = true; cScreen->damageScreen (); // Mag mode is starting cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool MagScreen::zoomIn (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mode == MagOptions::ModeFisheye) zTarget = MIN (10.0, zTarget + 1.0); else zTarget = MIN (64.0, zTarget * 1.2); adjust = true; cScreen->damageScreen (); // Mag mode is starting cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); return true; } bool MagScreen::zoomOut (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mode == MagOptions::ModeFisheye) zTarget = MAX (1.0, zTarget - 1.0); else zTarget = MAX (1.0, zTarget / 1.2); adjust = true; cScreen->damageScreen (); return true; } MagScreen::MagScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), posX (0), posY (0), adjust (false), zVelocity (0.0f), zTarget (1.0f), zoom (1.0f), program (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); poller.setCallback (boost::bind (&MagScreen::positionUpdate, this, _1)); glGenTextures (1, &texture); #ifdef USE_GLES target = GL_TEXTURE_2D; #else if (GL::textureNonPowerOfTwo) target = GL_TEXTURE_2D; else target = GL_TEXTURE_RECTANGLE_ARB; #endif /* Bind the texture */ glBindTexture (target, texture); /* Load the parameters */ glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D (target, 0, GL_RGB, 0, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); width = 0; height = 0; glBindTexture (target, 0); #define optionNotify(name) \ optionSet##name##Notify (boost::bind (&MagScreen::optionChanged, \ this, _1, _2)) optionNotify (Overlay); optionNotify (Mask); optionNotify (Mode); #undef optionNotify optionSetInitiateInitiate (boost::bind (&MagScreen::initiate, this, _1, _2, _3)); optionSetInitiateTerminate (boost::bind (&MagScreen::initiate, this, _1, _2, _3)); optionSetZoomInButtonInitiate (boost::bind (&MagScreen::zoomIn, this, _1, _2, _3)); optionSetZoomOutButtonInitiate (boost::bind (&MagScreen::zoomOut, this, _1, _2, _3)); switch (optionGetMode ()) { case MagOptions::ModeImageOverlay: if (loadImages ()) mode = MagOptions::ModeImageOverlay; else mode = MagOptions::ModeSimple; break; case MagOptions::ModeFisheye: if (loadFragmentProgram ()) mode = MagOptions::ModeFisheye; else mode = MagOptions::ModeSimple; break; default: mode = MagOptions::ModeSimple; } #if 0 if (!GL::fragmentProgram) compLogMessage ("mag", CompLogLevelWarn, "GL_ARB_fragment_program not supported. " "Fisheye mode will not work."); #endif } MagScreen::~MagScreen () { poller.stop (); if (zoom) cScreen->damageScreen (); glDeleteTextures (1, &target); cleanup (); } bool MagPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } ./plugins/mag/images/0000755000004100000410000000000013246301623014735 5ustar www-datawww-data./plugins/mag/images/Gnome/0000755000004100000410000000000013246301623016002 5ustar www-datawww-data./plugins/mag/images/Gnome/image.svg0000644000004100000410000004732713246301623017622 0ustar www-datawww-data image/svg+xml ./plugins/mag/images/Gnome/mask.png0000644000004100000410000000601013246301623017440 0ustar www-datawww-dataPNG  IHDREPLTE&tRNS  !"#$%&'()*+,-./012345679:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghjklmopqrstuvwyz{|}~'?IDATÏ8J%Ca* Q~UǪͲjRr֮Wʒ$RΝsxlQKz>!"""""""""""""""""""""""""""""R+͋:t>x;ۜ s9WT]S7ԁ3z9i{)_WEZ?-`]3j6zqy _R00'B଩GYoAml@>6#zY%l8U7Fܮ̆~D,Kg!V>GR4bJSv;Ǵ`D%pLA< _=oC,zE##iS>`4w L5-lϚ.uWjNxu N݇ Qvbo;|=ñ`H64/2FpeCS#i.hqA.dj2TÁY גw3Cv?BCV}fmg+mC `J _uW*c-=E~0G!H3H?v"8ГCeҋ GPӛHslK"?GhSJ!/ӧ5%'zB>Ez Oӯi9J¼BކuStWB&mw]JaDz7%лf0J2ؕKì ^0g#01xVec saԥC1qxFgAơ9L.c1&a,&2 UF+t.ecaLÜiK0g@Ѓ"Xc"\]t [ ٧E1\{'@b>C* aw|`?CT ^t`x~ ΍Ff |ðL7 x(e8g 2am+=!X 2о؃nrVCw*iWͭѪk>Mz _E!G4FUЖCiɆ4cz#D林pĩJZv{*lhG~?f*;뾁 g[1$yA6_@>S0 s ufַ@>1d[ _e$z`}X30j5.+K-rGod:\7qɄݬmv|cɫfalȉ!qZ oyJ6O%vfoqwy"R۞R:\3镟x9.́ԍn7=6o ?}['n/yg[mS rBIENDB`./plugins/mag/images/Gnome/overlay.png0000644000004100000410000010624313246301623020177 0ustar www-datawww-dataPNG  IHDRǵjIDATxkLTlMiwmښv&lMvi (wkf(^ADEWxCQ(@n0003\f`@1'0̙3\<χ_Aa}ϙoB RB!BH!B! B @o/>`D@4l̀ 3|wm_[!HO"A8ȏCԃ >_8OBH!Ba- 0oB @p,l )m@HxP$ +o#B @:B"$쇢a6$ D s-!BocB @"ϖ[Bx$oe}RbdBM )X39,͘JS2ȃE޷I! ߂1x4&RYb2AQ1;(>!cǏsitEʹMwP^J&S5Vr::\dykt9+ΦwobE߷j `"3}[RB#GhM6,]LD %ڜ`:GW<ʂK"r&Z%*'GzvP?ϡh8̝?VYA{bT {-/ <w ͽE5Vs)(dX'zߦd8ێ-y8軡 T6 @PG3/myQO!&kz΅PB5b 5gak&zۍ \Z?C[oƼlM_M moB @ӠHcfutq2Vr{?m""7}L4BIc!-^HGR&E9{zkn7:8 PQ %t׿ Xa)}CH}'4iG#VYп~}IHU= #ToGz ZuG2*PyQJ\N&+$Z8صR8e3Qôx"o^ Y5$Fy$$֭_MJ+.B;k:FSYU˨\B'Ya p.*.xc{V>&Fcቯ<7r#Ѱ0--a2řրBhC( \ o&(dXHH3| ē5 mJ C:fp6p1Z>3-.({YNx ?6>ƾפ0cܕƲ9UY0?(ZJ!T zoNx I I !˭OQe[-]ha^R^HEwnmsݸM7(+]:fRvNΦ~~*.UZ>+wǯs֡s gI4uzaS!uWCh8 u%CJ?s$82z#eG !{&فC>$Ɵdf $d8">!<Jo .z2ThD%A  ]0]&cfl#>d ~vCʼn$s)RY`9@k/4cW3lwZ+sǓnmNoHÜC$锄`gH݄>RqG.J@ccUdfqx8X@Kل`>-J!aTBW ; xAB4ӲT }ZK ]u Ym5E@d)G!V" ً0]qrWP e! vWH|]FnB̅= iY6mMp p B`|bB%6$6>J)*7@{ &)UBCOW3Ի O+wpp ׾NَQ]86Β^`FQCB`NY\O3KB8 EPr4ޗG%xBJ>;q[kxP]{^2d/ r yF6vȝ!db7G)D&6KdA% /`=' BD]iim1˟; ]?uRIخUWMS'7v<5}?Fu]@`MRӷ+5H"4FwZtX̜6}.J#]ttm`7`o.,Rd>dӼ9>]GQ.C?Q?`OB{{:VbZ C,ht l%y64vFCܹVe?Vٓ=f|eiC쭙;[ywhD `)tt?Dc4$&/HE^&[_+I貘6bY ]Ő, ua}@rg1qޅiàҾլc"zv^敚Փt[%&{%y?;pux:2vA@)Mf>WJ 46*%8u*3л4f@b1@K$go^GwcPr(EzF*kB;'{Rx)"TgAH JB$wN.N# e_jpI"x-R0ً\C8'ޝ9I{٫ς?B÷QpG(ϝEYmljɛZ-LdJBg"!P Ի<c=* efgXe.<;3h,/w5}h(Ⱦ)h h#Mԇ'BMfh[.}}t &ҪIȞ6c  H@ԞZ]=mx"{1Khm!@t-df;/Ԛ{QlDQI?߶g$F5s_)|6,+Xqf-l 8QlˇXhȿ 0F#}^(=ov}$vA*+ zЈN<~ 3m L?SͬջDpgA:_>m%|[Wj|'ce~ < 3h3rυ䭉 >7'd~Ap( 5~]v$T+BGM`ѻLpǃkj٫3ow`ɝAZ覒툨Mc OqƜȐ.;·ɖxL+6ku wvv(Zn=~0V5@HGԑga7pѥ8}.p.<* {}dA0Fm o. U>}9."A-5'I<;[[@ EkXS^Mnm>K<Q\-楈ێ7o<{/ӄDx]%"c88nW9&⬋ C;B`) z@@aq ?O=č@͕)^n}) VA8Cp[hF HNI?/<!PveoW.[#%+9LHlhx򣥴I@@'"}A?-F3> “A3m{Y+'C[`\\|, >0F5Gb,[:~򧩞[JVrʖE3D/3*4 !}e!*6\7JVK~g5oT]Fb_ )#珑t\.X {P,%<6径%xZ\Ľgls2/p>o]F" y\D3:.gІ/rUPRq@$0dCCڇ1 u 1a6o "WpoCqQ {RkmO!.^#,tq]O;|oVמT0_⒢ c%/5pOSh"ɳU%yЎH7GFȊ_ R>j(@I TF`ٓX' _ ?xFz(Zx%'᪈d&O~e?ŚOn]]6.?'m3Dz*QCG]]]c"QfD$,[p5Ty6}f'N]%ůG B`g  8v8p Qm!C "//Ǯ(y#2ѱd&N]!Fޞ JPV\ݼK&$OXx,3אu jnϜ@8{Vw+E[<@H,w)`ޑ3IׅŇi!'ePcP GA(BN>._v z(yNxZ͊ /]ȚK nuW-}{# }SCt RظC٘2-t()_:]~gN.`& Dc۾U]_GyPϏ"0JskCm{>*&" 7H2ywCftފN~!=.e( }d'}?)ȟu(>1P~SC!DnW-!HBRVUs/ 'q5o-xuΫZsK ߊ.X-"}# D ͼ ?-~iK}0(E?B@G6ADoDlo'JumtSyD`%w?U s5ˏ"8$~$SCO_iȏ"oz d7ccOiv-R,RLCpRk795Op3kǶLF◗kD@"! L ("Ǜ8rK AwqSkߒV b?c,=BPH`/u7 A7)"H)+AzOH},ٰp`"@"iIkQ􆬻MN!2 t^\3R25:f%LOůF'+G>6!(|=۳, _$ؽ' OԱFAA(yk&LG帯0 @[G+)9 >[I1v_iÏEboNl oBq(~+ZkUUg)ӧs.l_A?]w#}+i}< z]h#%^Hȯ4|q`*K~ *XǬ\PEQIMCqߡ)`'C-zGY9^4ȼ=@QbH/SDD5 `:]QWB)f8]ھdJK%Oq @JjC  l?B+g +QkԔ _˗%DW/ ddcܣ<+>`ӥU_p w-X':&5-y!j}ч-D@$(4`= r"<-2PV===Ch>eq_R ȄBvXfKB*9!)(zؕěS0.ش Nr/9b!TW_K qCaqr֧'?2%@Z'~%yjjAtB巆ҨEY7Le9nD "p1 oL6E/IN0ЬxGH/fa$|$ea w_2i#D,ۻ;Hu,E8xh?ֳ>Y7eMa*ؖU)<0'H/O\F-HqЋ#D_4u4Ug|9h @,C/| IOd\[VrޜCN +Gz3gς]0 Ul yK \Fȟ}.Z; | D\nܸ1(1%eo@Bť(|+UlAN hV|g(x\`mf Ikh#!p^?2^H{w*Hu ( 귆1I@6o۴eo}@ IXgV!0A;]v C4 U/)A 78r+7/Ent'b0 wz@ t`p(gňT/8M/% !"0ISЇ +3W)'ɷi`J'|E\t';EeEVv o GϞ={/s3p˟Q4ETd &fC@B=`lЅ_' hٹWM )O~-?X,@ B2&Kp--U,}Oh&HL0+BOvuh\4J |/K^u3 ~oO ?" @OBDj@}qq S'۶Iob8'p>/F(AgvO>!G]`_F`Y1Zgfg#o8v #5љU1'@(A8z }b q]Х !oFҮ`]4]J?MQhNY CX?ckVVPB  i)6cLe{PLl̲ppT:~t'+o>!k׭O/~o"XX5?OF5A \:X+]#@46W@um۶Az0K#c8O ɓ'Ϲ^Wo3& `ߩ @zo0Y^-fF ]ﳂ(|}?T(2EA iF]T-0 jH/M?>vi"(Y) ¯`!_u4E@W?IšDsק&Gn;:?>fs6<bWs85@#?t Fg ;:shHշpa ]YU`Su<⠋vuxw>Ax}?N$ψB^~N#@wZ`N M, L{ (_~Bح @Go4_ÖPQ`Q("not~}"9 k#,z h!"$c.w+ Eߛb߰N>(U٫ z@ fw6)%T>"o5q'B.%NI bZ[[L09ro5d6:XK E2[5;@dg/S/XHߙ~ N'^ÁC{[7J LN6"3Qt[ >i4$Z%\'6bsa0?05Xx@ aT ty X^_֋@=0uqϢG.w[ئ `ڣ @}c]Urڪqz30 gl2=ڇAwk/'s&Tp V7d5lxɾ=_' M@.oM{`Vx[*7@yS .7z:RCa8-m$3/Jq>Z%G(3ff >3)h,H =pAka+6 @0 /Z$i&> q0eY`"Ց޲OĽA|_0eaeٳg ]_@@$ <߬$cl>>^A0+طC+ëzK?]]%x&SH/-,n%0tă[yn Csj/ĭ 2  -z0 OA)#Fg,{ GSnmk;h]} @"Q40]ui,̎,On _3X86`dH۷5wD.!.'D%V_ٳo%&K?U Y:}d? V6P|$|!co-`;m,&򾂸I}uf>F+ >s,z A|0| x@E/-|W<.3h 9[A1Rc`PӁ0tz O̦THyn7k7n)t5 0>װUÃ];  1p._0  #`R-?=( yN=e0S`kt53b򫯠UqW4x (<gpAK\k4:jokw}+7+⯈QW t5YL}s* kPUS~n/˟F `+(ubX* ok}hdPbN& 3 |x1H]DU,zl&0w򭠌D/ NvP@H.}HK 'q\\`f͎}"zp萋.gF wgMPb/ G1c38B8 2 L:lq7#OUķU0x#Ao uqL !I:gt,`h(N*s8< f<cAg ANO=EWIpDJ58 *X.yQHW7NqY1˿%]]`8Eyq6xbx "o+\"`5 7WQ)c*WCP&jHan}B*#,|/N: PTϢOLSRVT (Që(`۟A1X2 f< 0>T ͘U ]u+XA0IXKk |dQnȈq<x Y3c ;VP_ MUDJ/n_V'~5}hA4w5ԭ T bKgs 4|"1_x?@.A`b7>qsDyI^0k߲9N*sdzYD0*$]/˷z#&n+#ia<@qA4cQ6o٤ #$PU*#寙D@H]I?g"?l [~CK at0'^.yi{8AܹCxMkX*{ZE/S?6>p0A0 ^Xg\|Me#8yeϣx#Xc,3 ׏5_.Hdf03OC?$(ċ`Uw7 XRԠ P+.y4+-k)3UP|ޅ7 nm aD`*Di {f{I~[ΚW>Kp Ц /|RL~uK`&b_Q!J `[0/o~.-=y M`Nr uDrbV/~Gd`O@(c/i4uhH~U,\B3x},dp;aD6StD@$D0 L֯.jSXE^/,u*9@-;^ ﴀt(9\' $*ituwHJsVԄb#0Ր?8T coTPTP1+P D$7;p. ޑ4-3;]kl]}{ ^ mۄ馏NO4 %)%._"PԺ]|X͏*?nI=RqxBEi=̣^Eѿe>CL>KޕLy},|hN,E/ l9> 00"R 10މ Or/{3w 0 r?2HK9GpB@ -}C&x},"Ћ@=T՜2{I@mAI ]W#@@Y MtdWrXAi Ln=T'Ž/ eDVV/7ym\Hx #7q*wd:`.aGzPr9dIHJ,(&1"MD_h@%lymJ_x}Q־/R]{MgOmʟ hFP9C>ķ(rW/oV Q6"jǗ?Š{%E(|>t6nlX> @U,d5T go.ޙ^2ƇTB<1ؠ0L2ܬs.LfL끱zGV8D+Ԣ}xPB  (z> z{{~hEH(+§ABDsaK?|$!|HLc1:1OE457 p#8ٹ"D/}(_ E%>uB6e˗S8P@P@k[0M y! #@&4^H~M ͗Pvh,Z\ )^$DТP'"ɩ6jqi łFQJ#~wO? tڅDVN.9o8_gkfbK ;7Kn< \#s mlT##x7/C߿B<Q x c1LoM0TՊ_]H?Nwd܋|BTߗ7ٷg)9|@XPwy},(DExi(~ Bc?Z9Q "VЗ>-~K>@͙ ĩc 7R PZYP[22M9ZV-> wt(FJD@lC [wG߿$|,l߁tѿ4y},`a.>6ȣ߇chD}^=9;p@z)AШJ_ h"khi, @EuOIHI`FO'<ɿj>Kkۧhkk3_^ U)/:L/I;RLgIIK8i ;t?Ht }/? ~'ص' EχrY3wBUfRKCɗ {'O8;wJwLùH"Ē!@BQݗhaſQ  wfBU_ (zgc5dZj 5!q_iD6q $^l,OFQy92+=NfVfT:4aP/d< .o/VٳXa y2 ?.U֒RMgIIK,3$\//~wC}.|x4 :#(z^ '«,@ZZ.cX00mT֔k9y)qE3#k*CQU#N mgCI㊶p*^?˞"ZW(.g>KaQE)5G$Bи%{G=ϴ,;@>'XPMDV>?Ib@r0fXog /9ڬs~PH3QZ , =$|UApQD(~/ >yDߥoWh=˗8Dg], @{Gg^HËA (x V,Bg5Q!qE/_;}?zc<&`xoo:^)G+@\wn!`cTߗ.k7i`ȟ AP^cP: _De$w2uGp#HXK&j}. r'Oj7Veos`C24 @455 ny1 r9ҮHbH.4 PD?*|H\omT;>^Q`~#y983b>WaZg9t䠓$uIMhʞzK>CF@QQy'?Dvٯ{}<;3tsYz uLKMOB;b` ,H'JwYuObhƿ4S; E8 3'fC a 0ǂqkRz/m)퀶[iFo8~KyOs3'Yx99mo /F@۷9e?ij`r h`ί^b yN<pCK7K>Q)nO ؉|C1J,Y씽0T<HpjkeB_|[S]r_ <~oY@N$~;?~ I tGD/!p ^`{hY{' .UB go| )M ` ɽ{͛n!<Û$,)Y FH3q\nA{xC*0Ā! rgo@%"?޺U%uI8@@׀ųSBMc_xH%;R |r]Wa  xˆâ9 {{N}& {W ٿ@J<"OJ_]FQ!OV2mϤu.@i';7?L\\A<lO maeKa?2%VWM@p  ?_fN>p`0hwJR(dPUd/\s$y Su%zQF%K$!]ő=36xZ3$Pwa?Z+P)xT!D#}'<Fބ}d~gXY/!˸qd|>>| @$~s E'\ Ͽ$0]/b*]?ɦB6՗+eIH"CYw=O6X&| Y9ix {D@K*ou :g*ne'nVOlb 7K=諝9{o#D@imخm' ԟM>-tDo_ ŊVb>[ެ~kxC@1Bb?!1F>X2rwO,J?3^xA%uKFdWW@sSHb"YF=s8s5RB% ܤ?.U_c~ D/'oU>cSmvBxqf[ެ}.~ g `t$ zYh\ \͡0@71&e'ۦ-}tg寸)S$c =.sC~/^Žwvb}x\  et/,cB@ #}ÃOs _gt(m>@> 9W̜K0 :<_ ~o8cAFzǀ`(.=ICſK`Ia[AH/ۚ=l_*{$zlgBgBXr&="S\f}hg+U\$dH&H!σwYtI-tw*/^\%u_ dž-MlΗ{]H"2?5Ə>av ?'- !P@._s\g wg s _Tq (\J!g@wb|2 &ԃ >KF Z΅ePpx! RTIލ-~'xX!>]CJ_{u^}6ҟDG5&"Bq|[ |-t ƌ$[=;wޕ)'@@$z KV,SPWB |w]AƦų5{ XDT 2xql3pu0~(|3[>FO(?Ζ7>@^¯YB}Cm@HN*N:G`bKF,;/@Wړ?oq 0"-|8Ne\dqaE'tt`qk*!^(Y]F*;yQ7| ,J6UE,7 ՜s3\{"`ɰ~Q"A"9SŁ(dpb) IRr=Ak9CN[{ (=QTHO@>#@'LL=pڮs ?,  |I?Eዔ+n g͝"z`i 3Il_n_Nw(0SAwwR(oλ?>+tQTBe?Z Vv wKetrZ$Mb?u? Zw*˴[ [6.U[[Wc#Q"`s(pX2-_JL"qC6 &~0G|2f$7~Xc78JSݕ "!AR aj? x ?'Ϧu _B/mXGY ]9Ekv.?1jll`(|?'K?}mK)Cu?( Q)A SHD@o[[5sQ'*rG`!86Em) qRK%#95`>0DNzxoq+׎$x>h@ (rȘqVIIuO%ӥE"0D`P[Wm_`u5zb*@@~-T~0;WpX\٪?;c'dw$ݔd]qz@l!N`alD 5$PBB]u!dBXo߹W.]όGﹿ{|( %a~d}1ge0ՀgAXE{^ @KrU/#πOzR}C.G3ge4##Fj I@=_#x숽$Y/#~dqŁn @F!6ފ>7t@"}9E 9 lK=_ U[6"ţ._ |g.}m-rK蟗I eߕ[xWy S^Yl#\X?@ :Z8m`!t7GG T339 he8#`uk/l߿\<ޚ蟙qI`)1vZyX̩{$Xr5!9FPHpT#l0x1c)pYs~C=dʲ ي GP; -*'{7 {i2I'wW,v it-}(7Eϗ %c{)XK` k)һphw'#$& ^3R]7yq:EE/nJv@G:^|2756 es_+cF_H/.  ˿]t }:)(|8G1qFܔ `d&fϝCr>\k@{<_D?VO;ȅ {kJb 㰿K\!Pf#PL@i.標dV<* H|7uY E;%aoJ 2ۗ型 .YT]WI)'%?af3HީvHI@/Rc\)00 ؟dxE|A ?[O^'l//ͼxkQ@H?u4AV_ka>@N,2JMK`Go}!,GMgZ>tM˼bːwM~~ C"C憄d {٪gA-MߞZr:{& :d/FhL_q) wza[l0x'0I  HB " .  :g⤰SOVRPpZwhj^z_V s'F__>ąֽy_Jv$,c=' ,lDaA Phx0PD9LTRP.ny{ o;[`Lu9OOPwOSN$-_7 gZ>-m?uM~ +?H)(A A 3a 19DBs&O.W 9p |( to%-̜4OTfA;F}>'w{D-IL`!ڕ:MWt^ }*{@C@f W,`K"&$L<dP"!SMo%%x $աnzY0]Iyа_nA3}r3es's Ѩ=6U>, U@&mni?n"`םqI`~ ΜIZt:ZS:ԴqYT oEBJ%FX ;ήNz/ 77I0 b촁4=o 9cuhd<6[#"Jϗ/%3gjN\>q;Hk[ds8%%W=^?D?+C"&ҪVВe_<"ص6/Im 6@m (@}/' R@x⩫z-&]e8m~47oF_ ZZ~,%w?SU]Ea]Qk(r:ڸymI7QHZ 1,y 6PVh\@5P04 ,%c=)=#[B-vXhMu!z1ۆ~^GLAQ.]x|¢B㧻1aaM͍c!|x+3z3rw'qcx@^ ZO*` C{P;KG(!%KچX"K dnɆm.=~uΡ_4Ggw @..+@xcMZF ; L2K[9g⺆ ԯ.0ߩSҒxgwrOeRnA6vX}ZҌg %%~ 8%GI)Δڼ[?27Y``'n2NPUMfE=7c- Ι^?MAiSP#n7'ZCm*`,`ːYUATbБ}H8*n2SU&vBegP^a[XєUQb9|@fL!Հ$ߣKNp#`ZX )|gig A$$F 5ug+=O@W}K]-uQQѮz{GaݏvL@$׭BDgV, 0 0 Ix*``GVgf ,F(TeSaIa\iE! ԖSUie?M1YI@ @cɌٳֹ/#v -$-`gJ9X3EU փ/I@{95lH`m0s[=hTc< 0>V]iD fܽ4 ؅*`a* 0%Y@< neG(r ȦS9@`p$ TJJ%H^q>t4!^Rlz h忯.TXxH s0 vRp_o⩝1YYL'=<=?ʝ%@c@,<}|Ђ֮"p _< ]{bx{`7`D sJ7k;;r$ˇTe\@8%% п6Ǖ~ tҽB t@WPEy@n6<\c(ptw ?%ط5ѵO $/-AGmuhq&kǬrm U!u,0ڲu#GhfyxUypp*u$ʅPߏY^X*t  %%wQ]WWj55$Uqx;v@ /c6EЂо#E,FFl/l61vl k3ΧSxݭnׯWآ1}}ϹApw9B#$l X{N@v rg N~xJ-̷pI8{ X104a3pk-dէ=dOX[j v/0 D")f/@@Tn~ p;@ TjZJHe|DZ^^*=z*-J/`v vxO 0wWO6H]k haz `xGOv;6[Q! D& CXiU'O\"oqˮn/[V'{ga-=J'ŸO'3^(Fw{"23TNn6<:Xka=jz{{R^H!X%<}T 5R>̧҃IN+@\><0Kvvw?*KFF`YuJF_X}T&I~Bdn!`1 u(A%$2TVN˦l$@aPV\V7(zn[BȎ )MH^%`Ov@FK$$-T/ %` yy'T@ F~}t1ge 'AmbURTG}lO@@'ЩK#(e.zŧz湀e2()yJI]? JRPn~PTA"bX*X\Xͪ`l\TI`:.9pؐ!aCem ao}Rrk&:uci`lkρ/cPީU7o'7H@tz~>Z$DR֨ȧz$44@%&%p8M*UCb$P\*`GWuk%^iڴBonfUߕ1ؤ%`>(aq|<C/;5d`bXea3-}$#^z/|GjJRڹ$[ (DH)3fJۤM/ tW]zsV9i*;U@~n "X.JT(J? idJAyFI!CdWTkXT_.VjpH<F`@H"$-Y,SyՆ.uW/IPm'A) 8Ng>cRT{^Ng ?ڗ?fh_JMTEvnc96#h 0@4F/  Ki,O38^Vɔ2$ @iC)~U+Ԫ`zJK. |&Ni h8 yd!Cx!>(#+M1=8ΉCGiMt˟I'ҴrVݸy~KKAON]ʧ3`܈Ǻ=ؑ'P)5ҳR(Ɏ\cGP!B]1*>qR\BRP!"RPC?R*5"L !1/ 8}CCIq \q`)#$} | | . sa6.27[ 򩛦oP/9@PSyǟ4hu^.KaDDjh2M8#9NpY>[zY)xGC_\J]"uį;!JAe CO-AV2O,!(\"4đ)_, ^߰+؟GVSw ̓U[B0 M2W`ސ|%m1S7wReD k>`5#_'=&\Unxr.'VNP}[f_Et%?_8x>ft B=*@vI/@~.2P\|\o(HH? _C@JAMI@~Ղ.Z)8dQA?(_vtHhr`JȆ txPu)O_0C_I%C^v|:bܗaH2 @;Kf$<9l&yUl|P ~lY9KKd@X 6$ LK@ t N&Mq20&ԭ ,9&$ [``A7gמj+cB ;P/@ (Ʉy^ABQ*&v$HRPF@ E TFFh hBAxT(ן:zA!\Khe{up3|0_6\my- }sԯUg:B4me w Dv U *@Y DDƮ@y.-}uZXb[PՖ>lAC+7ɸ{dlidN@PkUxkێj2ʡ?=Z d a`Ԝye"liveld``9j~\@\ 0ATFѮכHludƶ$i *j<ޱ4v~@rV" 7ߊLG@{;0%ٷOJR{ơ B<&`  aV@3ff~MEE F<$kd8%м?r~ &2Ա2sCPuG/\y/g[`xL 6Th3!N7)I l5yD5ud5}ƴ&%(Ő@_ 0V?K[XAT@9[IL}Ʌ&L\xd qhAޅƼ~4 4 }<<! nBߗd^Ьjcո cԄդ)+cH Ko%r"%l<]墐+c5>WhUfb_7Co"[y}Rj }up?&r3KH 1CՈQը#+c_$ظ$]ǑlI@ @~ +;PND굨( Sjan?H*Utlypа (S޽nf`` 5xFK`ۛsZ~ KPOXNTl/maT*i7@wP?k[["p0yd70JA. )qNKpdpg- hh_! fdpWmk\ηR)r*ר凙ː^w  .#{o mJ`H`.22BX^^fKZPD=xmPAOaF!*ٌm*!oT˖xiRﳙ_X}mpcVWK# Kfd]c;-A5%Ҟ4N0v_A53r^TLQR)Qg_7JK&O?@?wKphz~2h$2s_}%ȞL@M uGFVڒ_`&dO^xي:rČ(ʸ8d QeYCsu}w\r3 5P!a\ K%X%؄x5+:ZM6MZK2WSr誵pÏ]D>ߛ򔀹0$|~4H ǔ@rK#H`e lEy ]WbKZp 45XC#!eJt#‰I-,[4A%pa+Xߵ}H!Vů^ߒr ąY~%PԐ([^lKZxX#`P ѾW5:F+$ CG%m_##`,TvD:`w|L+H  $, $aa@62aVdKZ| &A%\ՎU0 %MKAn\5dؠf@~A# t1(YjOZ@? 6I {o l C{4^8 r$0 bYI$FF(%-Mkn,?OkP K$Vxl ?-.A% $0ɆI`G('-M[{aŰ$q% wB8Tg  UP%FBc{% 0."`$P&V eKlI@ @o35< xzBG96#$0Вr] i_Z$ړFi?ت 5H`qƿJ lI@ @Ѵ  XA ر!I`Ƭ$s6##Kd- hh4v!CCmI`IG%h K %aAKmI@ @ѴU , NJV$!AI=۽ ;m 8.~*28P 2O q& C(CL3O %(t_UUWo_k'oō7ErsB@p O!@-;@ nOLA=A-Bho#"~S@`dB!$[8/pD`&8)>-뱅@uF Cmm|6tou!xwN9#Y#൉@dD2T)NJs dB-Bv['I@}>W(0&#^E&__&-*S,# ]@9|1@KJht2B!cꌀ"С[!ދ!G WT`3 h@QIJLFD趉@i]F  qB *tg F' \@}pG4h P,8,Ц=!G P'#v6=F^el!B@H<g#p !m OB'#w}W9KnЦ%^E`DbnЇҬh2S?@@ Q!phl 0[B1H'#͉/@ m &#{A @qYx2?B{G 1߉,r@T#0D +Ad?V!]7!%ǀ@_w<|~_#((NF0>;RXMKy .r.. " E3#2':-<0BA@<#=h P*F+w X^[D`u m!x*œ} P#F;%W[NFiT@)@}!P BlChl#p(_042[#t8; /Bl!P^U!WMԥ2Az. :A 0!J7@_^Er6^ҳkdbMFҡ#B@ .3I!p5>i2=5"ڄ:3u8\! 'j7h@2}ܗ)ZY_էKG5!p41=_Z3#*=7 pmJ  q@J'@ ' w)0R)hM!5SX p qBT3}'(0?EE-*ieÌ@'&NLt.2Bh P 0E#ayDS' Y6fҬ!g caNj#p1GC !06ǔMZ!#9@78DTDP ޼Fݥ'7 0B`_/ʣ0\bC PRHwg{m* 0"i4iPV7К^prj"h6K KgqrpD4Ԥ/~9$'_dh_&nɭ;X "`/GF%mW "GcG]64Dx %2v3!FA` hO)᪈E7E`O "uGFd p"ДCQ}Y=KblPFLJFwLZ=5$5,!gQs=2Shim&=?uY~N!0 )~'04I0H ӊ2 "rh8 ksSG,,&rs{aOWJ0r;E`' "Z@͂ŌA*IYe$ڏjjwKER >);Q=2b6ze @ ٮq:A*v-lcGF@&@N FR "pȬ =#pT}*Lsw "/9!Д@Ȉ##,}.=5sU8\"` DDE@Miko52"DҲ2񖗋)wEY#^DZ3~Ξka;w]'QmYZGNFkej UU뛽^'[|>)Z  FT6E"ά HTV5QXxMn+@"Pwy@`Zء,1 DD|U'hAVkU)i|P^*E`":",E`"<@DD@DD@DD@DD O-OZm-fIENDB`./plugins/mag/images/Oxygen/0000755000004100000410000000000013246301623016206 5ustar www-datawww-data./plugins/mag/images/Oxygen/image.svg0000644000004100000410000044704213246301623020024 0ustar www-datawww-data image/svg+xml ./plugins/mag/images/Oxygen/mask.png0000644000004100000410000000626713246301623017662 0ustar www-datawww-dataPNG  IHDRJ NPLTE ֱGtRNS  !"#$%&'()+,-./012345789:;<=>?@ABCDEFGHIJKMNOPQSTUVWXYZ[\^_`acdefghijklmnopqrstuvwxyz{|}~E] IDAT\:sM1fñJ"Yl).ʨƊI[.Z%FErd:qs_Z۹.|<)rYoHCk!\n1g"gEBf"iv.*$4o[dUgEئ&9nEZ͙B K],4E)B#MX@h,y-bP-FhMBxBhA,f-v,SJ-z9dRUwVXL ad5@ؗc}Uc1(UkKc1@سK,w^z%,vvo awN@vp)]t`-|| kIag#,( ;)TwV l+zМ(| NyR` Y -|o7§X zu4ۂDPהk; BnkA.Y/o-p'ɷ,pɵu-Elyo+bK*~d\#+V۴yM^i.X^n.̕Wo 9Q&1'˧̉'ӻDuRu27ɣƵ!sYyL#Q*>15ITkA*|-Mк҂T,8?xv +RN~mA#쬸RQ˅]̷`vѵQO؍-* †vn{00Uأ{Ym1`a/Z{5bms-'}hbk>JaDiP/c-t=Ba YRh-V^+hR(XYhVYLT p+ k RbB#x"oQhwXm)4$; 8e5Ih3k,R 8fEơBF{"CL"&=%)dN5)2<B]ZkT dwޱH dEьwuۋ-^'dy-6]Z dWoR/ WbBN$.fBr\j=r_7r5~V,C -]V(KW-Vj.o,{ZRȻV>{aBDt ˨w&)DJ[> h!zn|~5Q꥛4p/_a~S+:}yh+Eɱ#=rCjS3/^dS߽b֎ KzXBܵhDcO>~5Q#'@p ?"{IENDB`./plugins/mag/images/Oxygen/overlay.png0000644000004100000410000023737113246301623020412 0ustar www-datawww-dataPNG  IHDR}Ծ>IDATx}$GunuysvI<`IC($`^D0$U*jWZmޙPN9էk] !UvߞSIRkkn-p5\s͵U-pnjֱ`\s͵}/w7Kah\skt[.c\w0k$G.UdR`[u(k]enb /I=!}[γ <쬴@lyк5\{H宏zXRl6 d}Y]l[q}n<770ുx9 k];-jUVɷAVM>h46xq[\ ZZ@z}F _1[S~^ x0J%壏>^|͛i6j}Z+jRi AM7wN}ĊǶ͍zcCM-BP,Xd|Wwpi9P+(a2b @x/qll;ZX\mzz;v|+;wvYwdR5\sH]bh%Y,./n'|+^u}nSX^1yOzyLxW'E<)^ Ĩٟٻ+E¶C?ٶmw.[ )"PF0K@Yb\sx9qkK2lV.,oڴ7jѱ'4GC6l_k- cOZc'­&?7/⟨O"dr<NJ]s5I乬7 )`dJ٪ܱǝ6<2dkY}{ 8qx.|ÀYbYjU"}Ȟ"Ǔur%Yq2cĮ9SL.2 ,#肼\wꓟ&&&{9[6qXﰤ*Ʋb.wm0ۻӚN{߾}~s-[ܭ]9v!x V5\s^vZs/y1/x ͚5ϭm!= -F[o맼y~l^1'e?N@ʥomr"sk0oCugn:V0f@/kd-^yh ,[ L?7 6>jy5~R ecS@Wb%h,᫅ /RC,=D$KECK4+Nffm۶/S @z 0.; v5?HK] x+o*[l-~0- Zڒ3io2s)8>p7'?/d!bn+k-^"};N9婯:K2'dρyٖM3L)Ǿ{я&8M)%NH3c\l]^8;/i¦4&Ixonٲ-[uݽ ]s5-^3w~tn|՟ƀ8t@k9~xQ^u5;NxUly(3b3_pwtr<ԘĜܲKf^ ^Yg6clz;qO&}̖[E藦陙~kjb®kgDjlfJ;m6>p' {9&վV4[@ LXMuM b=)^pQ;HV+l}~~"B22@M:o$\{^pj̃r0Y82iNagfg|w#o'i/b\sp9\@XbEj5rM/j+m=b~Ζkدt s"KH"$v _zrjj759-@Pu!>_+P (f n%%aIJ3%ܓ Ac5ӥfP{YMo^^c$gO1(\$%3uR01`scZG?__7{#.Jdi\s6yQnTUU쭮g?ǽN1 R3g$fj0Α!kX"0@3FrE*%8y(Ob*PyFaT\ko#25KܶLU$OsS$v卍c^fj}_p)~Ki9YqcHo /+_yŇ!VmiҮo~9r3^l/'~ja{f>NX\/Jd!? 8"`Cz{Xm ժz!Q<IRSq{+reu|܄ {]uhxxH[bŊf$ O^K10Y/à&H}@&`]o>@ޟ.p;Y5;k^E^4„Ɔ G/ VY|dVsg8gMmŖ3lHm L7 Wb{'RV@Uԫ8@rozy˜ co-(YȢ|50 )#ym4 H0hϞ{J8Ukz8IY1J;sf]^@rqYX6<ζ#e{F3(N $aL֯[W PNNydz8Nm^APV\Lw8_X__~SA/>ذk9zɊy7WInF[o^|_wNr>~ξkXrSFҳ r щ傴 qd;XP,ׯ7m38ۄFR;;g2:zy95 Dކngti#Ir;aL_ǘ0q ^ZFG}t}jdf֥$k4A^}6bΜl} /t׮]S هv5xK(w||xz0_v{[n U_%00Eϒ H˫KIˊ0HLE;wNMO Es iX5Mɼk22ITilq(q6xƍQB34SdR,?uLֲ֭[:Wdit(ʽb\sHm[/g?w=Oz<3`/3Y 7 a9Lv!T*M6dP)p f6,uvE>s5jw["x2!{=0tH!ε@>Sl' 3{us '&9CFcvlX2nyjM;AL7=^1 灸-;j[l[6‹Ȅ k9~DIξzPaCKW d3Px=cLeJ=2l&u>r߾:;wEqҬT52ISP n"V `0ej5V3>,*PZTU$LDj0T)ڇk*NklGQV j R{j-2a%8I9F@N`K xfJ2ĽUW{֭U]z=g>}viI3TDZc$mvG-oc"Yځk9~DH(0^|z8Ǽe/V@KLxZ 30L`S dR!T4R&۶oٷoVShŲTf )٤RY<$R@JW [ժzc^ͪH42 9D6˴ L5)yD8kԑ֪럀z&W&reM:jΌaEaohh(y6WW&6w=&-r޽N#a'ILV$9CfmE]|I'fmz6gJڦ1j&KU<"ԾŅx  r{'^m<|  o^ݣV9@wUmOek&a/Si<+f̌pA樰B&N x%`Xx LFi]:A2UI,ר=u!!Cۇzn$k01?RZn޴>۪wA ;-\sC]l]^?cR9k.0^ muck8#8 4B #k]$j`^3AzLXOj\56+/;>/pcjjO߻wˑ ̪ .zɉ'&( %3W1g w0(K!t @&l lx˭x[P'tz1瘮[ uV[1j[ -x9f,Uf"`αZM|cф2,M!2䕚 ֠ s^90>`SOg5r*+'a0& xl|̇[iSzȖM'd®k+(HV?ٷ3Z†cϢ®!Ȉ_L#YGl||Ym)lV1|HhdfrJea_LuDj_XݫXTdP$1ՙFdՒfPyj\$Ym#_Vʂca{fdNei8o1I QiD-+.b-M# d"a j [j+@}:Uw#\bOyOw(t{!lĔ NVg'C 0R]ozir}w @a;a\sK_,v^uuՁBiؗ~VN9G+&;Uh 6=&cTZ4~5frm z/L vF8caVcdxv5 2L |=bv===&/z0@6$ '̦~esN.̀9BUr`qM4^c/cá(J6g+ TM^a/u#''Z&V3ڴiShh1In|Q')MHO-$6ZJvva\sK_PM`s>}@`lEv_JO A%2#)w_w]Q/aV0W-z>>j5=&Ms7 t X x=}iwI9 &̸ކ CyC Z2v¿Ǚe/V[Œ2zNsyZ0{+;Ss|:D3b %N )7_,ԃWZ)֬^0h6A؄3{on(T@t]z_?ߋ \3@5RË?(T )c`kY6,m ۈ΃j漕p/jtJIK'&L1bzBOTnD ܡaĪ)9k>h,yZ՘ (UZl7NJs3$ W]uݩ"0/P=ˁk9o@Wu5tEMwpoҁUy f8]i֛feJt" Q;ncnrzY6b̞$1TAƛVxeZSu7(; ]lek@n=dU/Kly}I KƐGs'񿲌ItRvDccaÜ1cIL0W륶N/..W֟ZFYZKjRғ4tEkhQ+FC7~}9N؃̀ftUJ W?Ûi˖Ȅ-_ 2_pm^c6oYbz29Tt]Őzݮ8xP[o[ՎU)^J=:2㡡!xq"ſ:|^ z l ̓}\FiwK@ЖnX0X̘C.Ug~[ƆL ?9dM8I`h 0Lۏi4Cc@M ik!KƋKf g]XF1WB&A'ʓv8v5_" $9͇f͚Syw|yh[Ÿ^Տv=y7qV6xװ"Q A8 8<Ootti|r Ci|_ul[gUI!\C6YWvc0H/|怱T1śIo#{^ӕ"$"^4@ @ ``c J"^>C-(0an׬TkԮ*ȞxFO[᣷4 0w#^xp(Kgil',b6_l:֦͛W]tSU7r9ـxgfNX,gL&_v-o"2/lC `NZ N2bI`L䤵j?_s&LS2 T?ڰacl Vd3 !Ote1/hs9oa ]s_pU)uVZ^_@~LWV L%2H13;n߶}5"ؖ2W9Ę9Pyнz]UV3Yzղ]dA6]|-9¶8.;_e$|D+0de`.Am/xVѮF1Zm3JaFV.J[]w3!h6Y{/Wл7U^+&g\ v^cMذ] I̷kq` Z2gkꓫv !aU۱ )Mf]4чN OKJ <Iࠥb~놆G^Igb)?H ł#!pɳ\r* |~Moz,&LM5??u$|)Hg<iMX-A:YƭjjMLo0Y;X5CC)֛,ޫW}Gp8X/ό<9+HK Xa#K{g sC{E-(Meu Bxsy.1%'-`(Ks[sJiiE'0'Pw,jQKΆ9bura\s|X SU1~cdlt왹0# $d|b ~}k֬%lBdhq`tdf)r7>ebשWXb'=(cՄm΄ !r}+aWElI.`#pdfvfH_{"#\$G'yXal01Diĝ\}+?o{zk(V;hUfqGF9 x|3c`.ϫ9 6a5_[Gm~[f l6 'ڠzU,v;bvv.z+Ԓ3kIbY$G+NYz`峂>a`lKMd|mŗb6L,g1ؤ@֖\:y1Y#g[iփ4os&@V& `M1ač ֳ,yG>KLށ<_.hK:bַ#m]s!*#8ߦK/׮Yw$gXN`SS]wwVH>73iz?|pvԬ@x8gLt%#&Y(DgU0(RX{>,%_: i6Q=Ek{a*C._l[8V PN{>?]\it|g$,@Vߩݷ/^91 =Mz[~wl()ysS[l(kHA|Q &$8 ڴi؝_&:D"845a`Y,$jL5|SΞB{ V},k@D]$ˈe,:~>:pY윖:>ݢ,dh ϴupFzbpSS<;;{oŪկ.^Os? bccLh҅g}^M,/vpk=  W?z{'FA9_,V7B :}[kVS.I5L]j5 KfJz1 RF( +pE@_ +3΅%xP, Ȣ|eYKa k:fe<ɣ[EiRp&sss8['Ե{iU-PУDyܜXqb|򏦎R@DoKns>}ƭEqHw kRB׷WZ~)x/T]GP Hyao7Ŏ3s |UY |됟^u54;lԮV໣lpF1|= 5W2{.\n.gj{J+Kd l.$,.'79MM5=HZV<<<H{j մ0=uf?5O^Q,8z C"8U?Go9d /c֯PT :ƽ5\H/9ǼUZcPQnU| :Nq睓 j-09foZȣn|Qu`[/e9ȏ9Q2 +IYTpg~+@c9hh_`L<./d3fȮ̫[}GsѶ4 ͽE% p$z漹OkINa<4#-Ѿa+TM4c`vvV{IWk'MJ}νa HN~Arʊ.O֑~k^j5c/(gk=+9W\X6b+r".փ7|v{x"<{&]H%|chm`9h5@nŒ !8"W-0ϩifO(HT\XI,]XA3F$Y0( ] 0 sORPSA 3l\-%#fՕt$ib޴bժ7U # =J++y*5f!3 $gf;Ed W]s+,VWk|kZO/t9/g&t7߲jNYoFjqP} Ȍ0aZI` #f,7`շbyJ/%VVT)M0'[@#$h18X<Z_=$m$v', Xwxc9\T{c,sLX3SYsss+ tW^Ml[,sV"MzzՊ7?~5&P$<o+seSZL0O@5~Atҳj:نHU /u>Yx"Ey;PYI3[aJI-%WE8> |oRǏlD^dm:9ȋp] ' 3o*Q-`yRmȘ\ ].]eۦg7麨$!. +"g.ۙ(swm#6!@sDp ؄BFGG{zm~BԪɣ޿4MBNvd.L X[XtI|j/="m®/ }3Hc}[;?1}s^WQa{fk݅Zy[Z/ D: # ų:"*z( w.}v5m"  %%瀙4 E`^'Z1dk%Rii@8ƤjL|cxv&`^BҊݽDӽTUՑ QAj a1yG/58y+?xWt2hkw^"~l:ej۴ysJ=@CNW=( V1ΎljbAz )udgb |E,ai9(pm0EM7)Bu\1bĺg6;ڃD<H=P{xR7 7Y&yjW# *z”B5쩩{=wbϵ=6>Yb+,.vY7&9|)Z#E;v͵)/aҳ갚j KTľ}1lorj&R C{U:]N :f!T_v d&`b2!+?.[s.ߖ-ۀʽsawB{8IyBs' l;٠W8Mt2aMU )x9VٱLKYQ+rȆ%Kix=ᆰ5΀Ƭk"NW<忻s~7~]smpRyQz6ۿ;;^^PйI{MX91dâV"eE">244Œ@vXߴ`٭$Mfٟ`J߱Pd2;buý채vF1~k9K=m. S̮!#+t$_i@xV@sc,m43%1)Ē4(q@5x=w}6^o<%x&D v/tpWH=1elFx%}`6e$ GWg}*Dn&G)$ч^$EӍom+WMPgiKBhF twE9& 11H5:Ly ;_cm,Z'rn^" sFMRf0L X2%lM\= `499BRSVg:w, *.Y B̤ز f, {бbΜw@Vŝ;p7ޠ~@h\M͡fpT^e )y]#(߅,Xk='=Ï쾗\zٻU2Z8t/`YIb^+o=>zO1Ɇ|>nZr;v 8fOLSLnj!՘($e ,|6p0I[Eme@O)1M3X6*a' d5yB > r 8 K;\IKL"@%k0g`V{3TlOkVC8RZP/GԱO9ϰa\{K%NWcھ7六f C\;츩'DĝwݹQ>(JCI7Ti_ {{h6{P#ju()J^.@ftȡ(ը1vp'/,,ˮeIXdaY~g֤D%]¨xҋy[1}6]N+e.KadRs>mIJBr)HZ8(~4)2kݾc=j],O۫K֪^Ծ Ʌ% ,:,} 'Nrh\{HvQKx;:::rI'FB}:yB ;995?>rBWЕfw |oV /_FPN:L;m'U N>]b< IGcP`*btΉܲ##Ѿe_k1xSl cFflђ܄;W JP=IU3,&}䘕 QtICZ4i,=QLo|iIe,X8ka =Lz6aG|矽MX~ ֑ԧ+1x*{Z 2sjKKegmGá@_Ql2\i$C,NaFG\m$󮍱X@F̋Y~f.6I[z&IVX2r2%%'fm"kRE:OcƬ(!Eb[|nLoTby`PlW}W`|ƙg<;F12]ݻĊ|AzROK 9vaתI6 Y/\ |bxԡGxjwTL~RQeZH9K$ 9囎HȤ0ѱ`QG &'6#s[,;qIoHz" 0FG6|r4CqEZLch9) <{{?>_zPuYIEɔ,Y'r~;)5g{@Jg_6Zw0I;==3?:>>$|GSŅ[<)3~(vc8cUH:$ǪSr0Wpy|9Ȃq%DI04R4G}Ӷ aebϏKűuN[Vؒp1dj7cw} Ӆ9>gqW Jw6IkzQZz2۶ 'YO=4 A'gCsaynSxUq[zo=OOz4*&'q5~@+UW/-;Zgvn-t])U} W0?wy^qpSL\IC9$2dMԜ`-YXm83L;+\df_;Q$2}/gE/j+d g3\ViU]"B&cLrعf1޷:Fãzq2$D 上X)>0Ǵ_0B NYA" N 2 Lx[X3HN'S3Laٿ;sϹ@d2lPe:^iUP/x{Jd u";vYb儶Vcqqo6__x)& gZ8c˛v2:hO1Z2mǨ":"+e;?lPl!h qp1 AgC1@K28d6}nsX۶) -1%f6B[ReuR X~vJE=4SSPgIP:;v\X`^^ R4t{aX )zfs9>W;d9[k=7| =矬I`td\ߝ;w}Ա>JWsâirt a(}ݗwl41!ŀZ+&LlO*f9ӲlI ,D)nͱC&1`׃7D"]\QQ=>B"XC3r)$wl6K®Kbe!EЛHwM h -dM{CU cL### Fg̚c]TLpP<E:؃`q)~/CbY/ tð_^/|+7IQ.Q{@*V鎍O4??  |b,yYA_ 7,c.2/`δa J&iFJvEo>AW""%0p^Vht54%ШI1003` ?> fؿp}Do$R<?KG U *Lq]7pYc˲ _<+5ho%& ȹt\a؇fT+ EeFf=Ss`F,;rvk/[$lo-cy6hqFiKDCt{=ƀ{LkMxw9c397٤}( rIT|g1vXbٲ4ٶ3` bh]V?>nXF;V;?(xà ˉg?iOłk…%C(5XWu#7m>~7zAz9zӦu0! .~9{? |Y+reWQ(>{2ߎm$,oR;-{r`(pb7kIĽibzo}uI̦`m{r{ ! Sg:ϑ]]d6fL`Xc1b+|-vNLL Ō=۾}{a 1+Rz-c<@s_ ': 510=DK/%ZoAPh0<( sZ~ϏHx`qNFTet]3 ^>kfЅ%ڃ̀~ *kY7Lz&hrzPjj9HG ?{MM@^dt[:FL N% !sJ}wOQhY/?FlfpG&ɘpW0[/c.pya1{Kض^fN^MX2(/1#Ϻ"KbلcKs(ᆏZۇ+2UX hc&o}Q߫Ñ0j[HrtZ_H)rvڹ#:p,5~ xP+\f~E%f$bJnz2+aJtoYr%9]钂0T@ tށgm<^I RŠK4*c ;Hqf9ƢV@αU<%H حI!DArб'2>Y.MzAȣCHgUY +HTpF)-,&AfZ8 I8( ԦB~O!4 XT$![۶_r '^)O.]v ð{ĸzӞ"o w,5$%%nlܸᷗd@ڪ$(/(v={>CL&)vT~.A$J<(dݢ44Ҡ>q>&ۂ%,xQAab={pș맦H?C]7أi`?|S{>#\s͵ߜ~ދՀG$nbjzGN"Wpݻ.USˠC"V[4|.1A?"4mJ1tXI˓sU f BL09[\\mK`hSR ќVk x|C|‘\sAaa7M/<(  _޻wN8qyܾcH`/@~A:.1١하v P̶l7W%>cTVQx Ňc Ѳ}zuEՒr{r޳(J!&E0cbœy7^>7#ؼQR߷Cwݸ<66bOuVZ@& e2L5^=ƒdrcG浐c)bK^`.X.<y[Ow.|;o϶,2.1fe1S d gоT +ޗ^,T mݐĸ5'd{Anb /Czh`X0! 1hփJ,`9nOz⿎+Z 5$jzXlnC'^z|߾}-8wK.k߲_ Ox*י37h ) G6AHEdqɘ2P%𼌺/w#ʇMbc'/d7CZb6A ɽd2$io``{>ٯ鍗=4\T% ,ߤo~Eq.=k]xj}^ աGCL^H zCv?'?UBH0^6[6vx[?WȠbkE Zg|8x3Wy]aI hjjVoK7n,5GaӠ.Xkd^3w8kKBSK;Eh? >HtF`|9<@l$[&&ӵu)Y+n&!mÿ OUЮKS(LRۘ"kkbX51uQ6f1^JZW=DllP`lgf(Tf0A `: F;ɞ]c)es/Ijo)+9o49#s3 . p=` >zS>j` n6[Asr&վǟ'-Xk). ="&5n%Zu:Y,$wJx:Oy;; @ /::Yz b!vXfYt8nQN`v5mI%?3GFFNմoFѤj:08:56[<cvl)$m$ki3dZ1Et 5cWݓE~=8u%(& fw Br16_]KP}Θ{:00x8A%3d⏣~;~F1~YvRU;>x>k%y?EgRRL;=4;̍;_q-30P!C&Q}_aJ3٘U6r@~yQ C,.KUՋN<+ֶ_\~vLQE= Cjhλ׀g%jw9L(8ssv,5 Bek@PMG*?+)׮[7BρqLC Ġ$G@"n 9 }, N3I"/ɇcV.bI7(<+ ѱd$gsMr$$1CP"P2Yz>>/fi  * D٬Eѵ0,v^w(s2q݋'9'b A`v_/-j;p~p-X0qk*2ϓdpej1%PJtYfZXÙi).|Yrґ tTe~ f c8uQUW:_l:}߸g||@l1 ul:PAc 搄l 롄ci 0<<),oK<$C ,+aRމӠYMn[ڮ 'Zv̹h C^>+ɄV z,qN@0dTeK-Is߮ &R r $/S6S{/LMM-iQw=Mt9+F4KgZ~/ٗa[p``*)![}^[H:ɑXdh\[&{%sN޴iӓdLkZ_/~ :vA $V; blղɕ &0uYL9S)-ЍEH vGgbtEf),Yͼc^sй*fzroU\ 98xU %-Zh%ھ07] pavS(˗y!w8^6Zsk<)b4@8D7lkG : yXsـA+J~S/cDH6ⳞU \s~2`[SƆR;z7_MY=YĸF zjaXmyMh$@ 6`hydH.¾;jyw1gΜ Lz)?{ 塿ճ-$n]΀*c.(>o3n1 4J`j=qBbsޡC{ eXl BXnCYgSB@Y (G4 R99;;s GfeJw#3y}(Oἡ]sj,\~xGRZ]m߾xt" `)Аt8755Yƣ GuHO :ՙW QDh^DC;@{q*PDbRok.uf} T -KP @Sd-;1Oq/:P%(r-OQӟ쎺Wo4AkaNLz)?==}ugJ6aX&$L^/F%`Lx )VܺZzdvմH3X.+N0ĆRH퓔ٚ,q960'5Hj})%A$l4o>X.X~# Q`mVoqXi ՙyg>s kI_ـ Rmj>OD8xߠ/$9 :ȑA*aF"@gllzЁ# :7O.IBhDŽ=d&)SyO.?',ֻ 9.1C鹐z& ߗM>lY*$llؖnBr0yebѨm?H@;"T #34 F5cA6Q&>/t0ȫյ##iY3՘pl' Gd ޼yE(R'pH9\䀥{jՇ^iu2/?2z~_FHw(0PJ7F#6 X+r/҉2I9DŽ-KyI e<\æع-RoWjbئ(_D]VTtXz6#āMBNP!nE̜eظD 80'd,X໗TZH . V6iQq!|Y*P6\.|UF@Fk}eCŀ}_Fnhbt?|Nm]Ϧ)GQt1|u$6mE*` ZVN;j:b,ZYi'E;'ϣB.3G9Xj8¯fհY544hFLu ؉þ6бHEKU4eCΚ}`c~wcHmGI8cv(g?Hs p1Xj : 4̕.养 A w e2q70XbqP5;B4=.hLOvW3(Gxr ˖w;,_ymFt:U%Z`A d#gq$'W.`ĜK젰jXF4$Ale.7CY8xP'KbJH1J)+uI IK>0@MV7{X&GUbAr/Q 4R:{2R6_|eDq_gA:_|&\D/AܼnhȒ! ;/z*X+:r2O~G?R(` M "=94R,kزJhNNnkkL7o)C+PP(uW97C5L.<;:`9sS+WμC W,AVR| b XKXZ(`L)zH;~~ 1חW:Urx\Гv!0 A[)(`BZ1EX% %(sApMA?t0P d30o\ !+( `|c=+yv!FYA֕Mig8J@u@UBGxċo6W'r:M r`5,(?UH]]@-GG`敳j b4RY-*rYr`-1$+"7T~Pf(Y|s"dd[ܣ R~#GkR(b9/Puh^0(yLFxrC#<ۑcT:shVM8){}`S(@wvS1mڴiYfž=HM 2quDM' ,'Ŏ@%lЪH m!se˛VbˆTtgfEتةbg(_V0"*WVbQb\㪵uU~gUt>5Kߓm9sr*_/<0^:;; \EtȿADp(|(Q< `\ڄpUE(`C`m^> ]Ёcr?0HUWUװ #|(;2v\@bYeX؁apVv"pnQS$5ev-QDf!ԥb^ҪcPNt뫾-k(CU\[ޒ;q ${oQiToun82b]5 BW kkk+=T*1am4(`,Y~0;k_P^S)@XaxULKS!QyCGŀL[MTKXK)N|A 6s窔o1G}%`e*`-GQ(>GÌ8EpĊ[zMٻAGz RT8@`,вy`T/_Y,> ?sdyσ @,m$竀@.1ʒ: (} g~:O?asq:]^X0v$b vLT+ Q@!)B߾*?ٱ0 bYM矗4x)K|gljЦN9`%|SDQŨbLUϭRb ~7J-fiJ?s)ZZH|q.(7熦DW4o yg^ykS䃄4W!V֎8u u^IL%$w>LaHg*M & _1v\R!O:>\zD@.ytW2>ʂn3O]2ܨR-d̹JoXs1ʑTy[<Q1`7)ڙie!~h:"xdc`>@0E;lOx#z׻~d4 LJȊEV*ZP6.vA [>-J;UU@\* W|`ppc50:F|S*8$>dbSIߜ/JR|Eς EG!p˫O_LLE6ΊL`UN| *`Wel}̪IIж*rAƒ~*XQuQhrWXĄKH" %.@HTG*nbZaGK-]u1JK[ܝ,L;rx L)7+-:XT~iY d=ɂc|\#;l ZJ^|p,XlD<^$x*AYJD,1RU솦!*1UWw3 @=5f\l}`,N02>F 6x{-~?ܸ*Vo7NLU:+jyIv6Ok\v$t]]]>Zk 8W~ 8 M< :\:Hetѿtd4RΎ7TƱb n+^ט+Ce*ףYrWIRYyz*][ MFҚtAW-ʁp6*XDP@,p z/GS-WN(,5U JXڴ]9hha;.âр@ڶG\FN'ɗ~47|ҡK Ty)zP(X,nuU0=HakR[.Z<a|pW1"?9l0H]o|\FE3,g6#<eoYW3BǓR62sAi7~.hohep"x*Hm 7d2' M%(y5[+c>0y=cGDsǨq&1wEZƮK <_-Z<ǁDpߕb8rIib!<*؁a9<0_`O渣i .٩G+*Uu.6(`˴eX0dh`7OA)KS"6F Gcc#9F81jܤR<"L3KK?g*FT `mZTxc*Rf&T*;K5Wsz}Τ3c2GZP$[RqE AW_m Ma͍\^BEL~m1za<00``. ֢-wUjްXȪ@]%1^HzQ5wmpp_nhy` o{pV+iզ\ a3VNGSY1I*J*=9eQ /cQ1sкirOffJu/\ѠRb) Me6Xo{Lg2%I`QEBqlG*`0T~ FGڴihVܖ|UET#xr7#TLH ;SUc3#|Ĩ𖢣Q!E<%|i_1_[ z@y^;P5WJx:y`U V3s MqJ)=+0_sXL6Е96ti k'wa{˘M9]v1Y!{Wӈr娋9g6x}dQ1*c>ʔ0HF w&(% ?GvIxK5yN6@Wl 5eW|TŘ"}quu:6  X-Ιg캹:ry*W649v"D`ummCs T{)ZHfa:G:.4 .t$1#<yRgZ}ǐ,]ӦMƁ)@6jo,F ,q^j%& M?O|}@044dreGڳjI?)eܹ]/;v\aiDx*R-R ¨$wЫ^8p-6`fU8ͱvT2t mJ?Me5HPVfTnFE gsM|09cqZ&QdAATnw|/\~*ǹmFSߕ' mڴ`K~pvt@傆N߷WpͧE*ЊPS@+t\TSp[sqdN]DRdhӦH1Nʇ8G*OT$RѨR<5ѪH8p-vIIӰ)Md*GW4f)!SS~Lb+b2 6iX.VMWT _=)Z:U  EȵO ֦qxs~VusYvRw·j5%H}ڔW`e^c`*mO%V4]t:='mƬ^E8iR=]lrr=WdehǓ>զ\9t:U:q[-@L~љOi"+im s0|TlYml|lܧ?7צS@ 'L0RYhjUT%Ke]r.\NؘJ^xU;sڴt~!1|^h#AY,SN=BQ:K[kdڐٶm6o+e:444kp{A>D6m F>Lk x|l, :PGƲ_EW4Pb {fvNݱXVG\`mgʁh0_ Īlr]^6 Z/``MS['\ME-&''7XZyF0f[2t=S k_wk ^0]RrFF}<,jA8-7d"9jYfeMLLTR)J,ꁝ2dɒА*Љ8X2@V\*tv>@1+"`lA<19p- rJ_5w_xu6m }F鑑r?ttl*Sktsi襗kjDف.m3懡G"stl*WlѮ:K6/`ؘ;::K jx;21V[nx!@kV<[:q4)jC1][(zeCz54$ =}622#`i7U4 )csNm(W]Sv2eD29 \oڶǠM ,ma$ m>N yc :kSN=\ l;,F3P<: =i;*c+ – X)`_?]· ŬT*Br0V]m<0|u:39 [WYMM`p(A*>쳠}EEef3R}-yԯҦHQ /l85d'qJX,ep-bAT*ִ \pj450b,qn\S[O|$o@֊Q[o}W\$ UR־}5,A[򁯞զX(ȲRb׻L& d7tee{-ZNŽGn7ӑb[9XY5KT~>fӦ+L eo6F7bt:VXO{89=P]Ss:nzF{Ǟd{!4ժT^׿[~)L0VwwW%u a):GwhQn虚xSn)ي3^& Ukhh+)TC0.h]C)(` 삎S{ 96@8m]{VӦ[Y_WŎg>DC@,m q?&q#3]CZ1׳֑P5,X0ZZZTQ ZjӖBV5ұ`9pHݜL ,[km5<888-f:6@\WLioyKmE=s3m'GWeCOss ҦMQ :Bss}V`'uC C ^ - Up,3E7T0x70ň sIsιRH↏uT+Eaν `i6mXW:g痿AKmiTc`pHM1r6|㟸 ;& ·yUUWN.8SmmmAQLWL@xX P~W\Yn:vu@*r=gI߮x"fWr=+٨x ~0#7H+_mڦ`CE7t\n?O#Иqe{Pw_)In0f*`sC ԃl&$/^w1pr5[V0\HsD?C|n_,~i+bU, 6Ɩ};(B]iF˸xGFϯ@RQ@ |xh帟Kb!_V oE|)ٍx?Jsس7xzWiTbq0 ?bV0-AzpMo~GSϖz>M'8+Fe4Rxma`(x2c{m`Ѯ]KEy}lkj6}e7$ߺuk7R:Z?)Iru>.&gkRt7L`qGOwz_FM&S ?<])Iӭd5gZJ=>Ҳ܆s)wbr{`ppCaL3yם?_[7WҦM\ڣq{@g+[_hMHCe-u_&,TV><sӭ| 3qKsz$_^x}/{׻?#rVvlo8vM1r[ni59b0<*v>ί!U]]Ire\ V,_ݣN 2fs.xQ, [[[Vo~70< }6?,[/SzZjߴ\u]M -ˍ3?:ᒥ+lN: Y_yUj6l!'h=k˃ [C?JNRѮ]*s;w ?76GڴM6@8a@ja8CcA&b_S| _QXž={+<Х(ܙVSUR"p3Ź_(K/mhllaXgf599,I:5wOm\jsצM . ?LRc`z h2 uU+z`,VQZ|g |y~ _|M`d\fg֖pLB۞ ,F?j6mӫ C v3`<0qΝ2ހ,1:. s<*x*5|tRx vh9>\ϷP8tkIU„igO" [ak¯ME,=MJOo|pk2+SĹasϞdv@b ?Ͻe*PӼL`N`tO8>.Cں|#yxhg߲oK.VڴM#\'XXY5-NYɉ1 RGV^Ʀ@,cJTp)!%@VS "ƴ^G?aYO_S1F Mرn\i[v~ #7J_mfIUp" |oݷs]ݍMȖs8x)tF\:V ˜ { Y)yJ;po|W7f6z޺m+dj![!*kG3jF_~i i@޽TdU[[ee嗾N`T*x .fBΔO/ '?Cb٨ghz\} ]NԳFFG~EjÓZj6?p!r[ƌsJ}gLK{{{ujag$˂ -|ë#KW*m[g$ NEWy7[IWJïڵ.;k;L{#զm\@' @8~=?~~r2>Z纮h]+`b *YMG~'|J W׬Y3ruW[APt=#tAzE]7ѵ ya߶:PVyΖ>Euۯzկ6m`9konC뮻v9ƒzI`,fvuwb% 9( };.АudWt9*YOg.Ên_P֍7`0OtAi fޮccIarӎRi;~m|\Rզm,`; GԘ'_z=e~OP*FW|Zh-UtEaw>kW+o)||Qzy߯ G"JAVɮd{GL% (xjMxvEP˼/>Cᚹv @2 Jew!|A;QS૴ ڴi}R$Q3FƆ ±ؠҚ.p++v%vV\}ހܴkg_;ґ8 נ*K.Y\ۻ[﹗_~e{GGǀO;ՑڴW`j.k{| vb乕2^;kV߽bŊFh+# Jƹbie| rltډtj?O}lT*cVYYXUUAg߷ox?Ƃ ͅ8;_ŔN 3sѢE~swuN&B@fqdS۶mb+ hXTkڡMgH{~_alTկ6ms偶 DŽ6kQ}{?U~Co@ؽ%Ҥ,[ u 3d%mmڴ:6dfP8-}Sl57o}g$p{"0<9`qC!r[r+*Bù3or7@:ᄏ^oshS&T,W4e1#8_SU|(ủyǎet|.0y i74k]ommmmO^}7 O(ᔡ#i?,@  0ilڴi~\W>-S CƪƖX^n&t~OR_ή=s==* V#|s1݈{W^r%o暎ņZر iRQ `͓nA+ ohjӶXTa!\R/vڱy_* «V -_. aǯP'5_oK"R ⹰l|?, 6 50p+RT8Le"-1(7CƏ (B0^|+}zlUj*i-K2I)5Ȧ&Qz7}勳6I$>fdO0.5k֌,]+e(;6=?PO_x͛7ON~ !<]jxT|r '655 ;/%ⵉWbzy'îۙU%y,9k0 3%#p[z >OvSp=KpѴ [EWt`Y 3CQ[oɬ&Cs‡fbQQ)Bc'o}{@xt^R{뭷~^ :w\f휶Y\*qx)W^Tx]5ʦd2=묳v@ʢ)|k_ d|t$6m `PUAY>_/"jH+ApXm+]k׭M,Z(UŽ%}%@9u]x)~ .cPW^G6|F/pKJz݋R)|m*#*]o,TJ#,Y—6;9H׳B9 MHĆc5eWYkk=[Fn|AYe˖-yH8,P >UWBVZ\|YHgj:޾G}W_MLs s_1ϗ iݻR4[\}y^q*}_Q/Z  ~Gh!H=#cئ>zPѧ1$@9ؘE֦<{ oPVXp ʪ $zk[>sAأ~gR2L-Z>5\@ aSp+ytV=vj}ᇕ=Lgij XwU/KbqD":#/xYslkmm`ydUJKLYV-uT0_P '`{ ~^Df6]z%|n wI{M6?35!MxvTj>8B öF'xˇU?+'Ƶu&Pa^7&Nʧ'?IO) N O7pT߾>weo;n^gX J}ܐf.zn0  W^^^om|oTn>ugK%`8 ax8I-[(I k%av>{{SL`9vHVa쐢ѨaQNMT"ylNgtՂLB8[z@< FrKV_Tv_~7~ RBOn8c;wL ,TlK23 2<11ήeR7:+Vkx忿 ^O?݂6g5|'ZxωXv{ { w̉Mhk]bdtk; .f)yp81֭]7X__ s~2 utG?w?;JMUn5|L^x˙Jxotqu9g0v`d Dخ0x- `Y|emhh`W2dwÇv-׬Y@ [# b455}}8]E{\ ]$#Nn am3 a9?X!\+Cʫ>Fs+,ΤdEWX9d*h;E!iw>cyccܜ ϿjժΡ!{ l=p^bFF#DkkkJCX칢-7=FRO}3wq0{ʮJ7/Z\zUDtZ0~x;y:]v[;tF%Ց.-]*`Zb;UՋ.g[o~#TM2|նȥ;;v$w3A-lx5Rye$x׊aznڵc`+Wqxc|3m޿~[7c}@\< .Mz+5q$q amsa@ ]#8rMN!10+iX V_Y{Țd(9`8s;w~wL(bU|t@w:+U/s5,w+Lٶ񝯾Xn攸/lOU,pZ3ܿsqj6{!Lj=:ʕ+Y,!,>^y}%4s(vX,![m*~!x| quJ)i[ %Q(aʏ_O:)a>w 1W Sp$\aYj:a] 55t2-sn`JZa .Ƴ|-;ͧz8Zmhe7dՋ|)߶}{8>Ux✯$Wb -\wx)K% mҥŋ=%(5\hXu-O74{ \C~o׸n >0)Nد! /1?Ӕi-C|J , .<| n0UOl'2*a1;hYẺ:cj%Ƕ_|͛7-Z4 *T@[,pgz&Pt_H- L>u9R杯Z*FG:Y^|]׳OuQcV%LL \n]ܴ bTVtCpso':] x0(],&œzq¨q^! pP)i],R5 G8MkSS L c/@YQ 9jJ踂TW.c)|O,GxNomCCCLXirC!N g5?%EFd(>VC[Z \ob̤e.ǹug&X[Y1R9C=)XV0EFӵ,?3ƓO>ilܸqۅ^(\&7;H`M\vlkk.=o|@|NSҦ/_tP>ϼ_hDrt׮WJFwsVfEf.R<>6}ݧ5} "IbIzKbBV ->a?⎫Mlc! *atGc~xΝF4wW,B4%8Mx , AZ]]vᗮV(CFI[\ gn-[XtiPNWY]f=t0޽}{ótZ1-+lXnݧ_ͯ+ b|鞞=UZ Ak^u9QS0ʗ IAXfO/ge2J]gUPJ"wu^\sM|u+7 І ۶mC~cp'vbwQ4%ms|s Bz΂ `\cV]Ui,_|lA}}_ܛ(k>L&g/~| .ƥy6\,h"xH$b~J ZɉdW%5G2i|` hn—)WtG|;\*󽪍.EKpFg?"GYE2~.JWbh+ ";)M nu6 h1r]dqYcmznQ->?WI\bŚGNW3_f.xX.sWr)W>1^JcϞToo_%@@/E{[qڻhiE+KFYY<}U0GqtIV>jd&*fK: k)u S4%m+ Gc^wmώ X.y\7G"YOD_ "c}y@JOH_Wƅ^;3k1T__H-@UVLSC#`iJa!; 1H:#i9ᰤv0r .l, & 2g…`aQ|ɻ޽;U LȖ\V (FWor:`L ڵ;hɬ՛mBM%7[*644~7=m֞իWG;~jMrzAL e?6ַ{522KV=b /)looq4%ԃccc#p;ӔREyamavB ]wʦc6]\KXj74jU3&89K.@Jc~Vqw , ȥĎ_]__.|9NkX>Cv'*m7*͢g؆y5Xq/x|' xCHczU~REW4z1P};φ@΂ɑ ! c,BTЎ;Le/EH>8/VS]H,׹4gr²΁0K/{]8YgYZRޏVT`:htr" z<cP޷o_n=cbqb`) iJ0B8 w֭]2 w;5Ӕi.E%,$|>VK6 |vē<7#,U'C2}& ߠ{:glPM0#d}s2Px ,_Sva# ]|#\hOZxˈcgn4S,?s6Lϟ{q<.W?Ɵr//EOӯ{a'{nJ4eTX]WC yaaRss@WWW7s莆}jJ###1MxvհE԰ `Opn' ˯2Q|^˙T_rP`dc4#?e|R'x0\0YвF“N6hA~|Y"0-ic)B!ͫf4%ط4:K4%ma+KZ\)>7? LK_d>vtkevq޸r:ϡ#UfdjFFFF,6T P YSٶ98g.Xy?7ޯrm1AN WW@+oZ97xF/+BFiٳM6mܸC-Z-<]*%ℓm!P4%Up\VSTrhhh  ###C'+jJp=% T:MI@ŔJI W |[~8cC8 `?Xj))+3@vrF86UDeK[KHKӽ>.cБ'z?_5GN(,^l _/~5Ӈ9Y,)u 5[^<A W|0fI/aU,VXtG¶{ɛF]2"5ayas΁{v9`6'nitG} :iJ4%e^^|yW]s̱;1{~;RЁ)X4vUCξiuǩ}Վ,)W%$_3#Q/~p .##{lW+M(;nNRzr. W_}udժUf\ϭ_>FFFj_X !wٲeF}}* -g ʠ[./UI)a0biJmmm---!*R,4%msa9g8P aW p+N8qTUDdډEGf g$EϰY&#)V1HdǓ-"s/ `pnV?mbdd _?&$`U @3BM^ϗE9PI\R=O/]Wx%mZ&lj>dAZ6uyl),]qϚc9&X>oA1v#Vcc;$5i7l ?Jqm3( l8K+BW!&S/!Ydxt6F!,a(Wr nҮ]݋eҔ)4%m3iA} ԰]bYB)MJw*tXB=9[E\s/ BN87ξOU=Z-Z-ɲ-ۀI yLd9I+k ߯oz Y@ `,dcwcuUwWٷv>wUɶ}yݫQ~u\^cIKAvoʾރ-//=?Wo=cZ׽f7t#R{_ ` _v||/~y̙ކh:J_Fڽ\5 IߗD?flXF60u3\̙b&ޖ|9p޾p~Xd3*׼+"~V&e؈J]K}ޟ#i9:/'g8{.9kƍhS WEjDHCmSR)tm!qȾݗOq?'zj灃GvHaL-}"[߃KFꥋ?6sׯӨ lto,59&n'C4{S%,1~ Ϝ9s1N0 ./it? _vH~j6qOE366EE7GfK7\k~k]Im۶?M)Ua[$ 'n*CY)=s5mSRsnؘmKq=8ױ;88X|O|#ٱQTUR>i۹ 9` b|܉ǯ~׮!nQxCݚIѸK Xz?cOHr7d1)^@ߙ,bHrZp @C˥@n(KVG;*m4S p ]zlS UHMg6%#r!W\h环L?zVMI@0N `A㴿?c?G{ ®nߋk6 ػqcv2B1.^xc~9h]!׻n]h7.\P3̓ X\vFo2BB7- L `g"3ZNP[ _ a{#G!'I'\8aY gH{ *WH4kiJ0MIANqjKεqIXn?{cc#GzR+kpsSSז._tم_yr U\/'-5Kw59j7 _cNo^Iҟ% <LF pn :Sئ8vC7f0Lmf!n؁Fl APH)2Ұzy_z̙˗/se]OS"hkJߣpbژ=VLsm\r͑Mpoi}ܹ:fMkQrccc|__\t7GGTR)W*iABE ):VWtZYǜܕ:Er\+///זaT=5u w!^8v qPDn ޫ=:̬Lҏz{m+]hSʜ;w%uk סM!ڔ{Uwz a\ݝLogЯ_#w>FmNCGRu;IzHo=88XZJ"u%*{H,ZBa] RnЉ8$e0$ەxb }IYMgap1,.岉]fC')ex}~'N 0`M?B iڦR 6t>!gZ&:ۥcj%ϛ.-xRooS>Zh2sw+;4ۇV l/DdKp.DeTڥl I{ a HT0|Ԏ;fa#LSj4l#k)U bȃWXVQԝ._8cZSm..\nWn^o@ ?99̑@G%L>KUIG48 ʴ,& ps9ژl,"ϖN9pn INS>9GGFF>>~xK@iJEWX!R;M6Fδo&y9NNrnq &NN^o9kW^]# @aKDlP4??o!~]-d%EW|}K[o 6l0z1Wxz uz pJ>oIJ8{l _r # U {wcI$7NW.@͑M$yLm{MXg@Yq}B3a5)vl;f'N!*!η׉ekv(Ko(R&p/MZö(U)'AX.GK0 i~'-9ړb9zmmVG*L+L^aruƩmr7Gt.J*!p7 njBcA~oqyrrh0`%(ese6-Kf%UGˡ xkf0cFjv!*l{j۔Rfj͘rl''^Nߦx4%<~x 6W^ /G[Ns0MF0O{U {|ژpOSm;v NRt70N٬M0Xwҥ B`0` 8xg]1pѾ>`-+ j08](-5˘um449Qp>kgJ$24/^vN8mJ8se0Ax 6+֯p&M@f7|ۏҥ#6]vrm ۷.Gv>x/, ޽;느v;]vrO8C{IθB:mjMN=BگP ^lH=a c.+v+RG0in8:thN$p;A-J*A"BtX,#ZժpٳgZ`S)6Ir9ZV?\tIN{!b-sfWVl `j\z%8X,OLL X,TER:ׇ v(UȦ86Muv0 a reۏ1w 9'_N0^!?̸<== KH'-OK沶0k 醹QYm - ˷.?ԦFP|% qYLjqqю4D` +U IPɾ.a-D.}FųuXV1Z8STQ;'l!N8:Z^NwXb0)9 +Kh,TLBR_n'ھ}{2OB06uDX p01tΕJ%`h?qJI7/G'A7aC̄uh B'6IB;cW8>#DBZaW6i|ء `r8'vXA{!F $8c8a@sRmRp-Zz,!24?>N!n۔V4e;[/ܮ_8+;Z'+`Q!  +V)75ծ=p*\@x~~>2\JV{ V'Q ]7}`xP1Q90˿.T^L,vCuf-Kv+}ap-mJGǞt7˩Y+ jBg*sA80COt䊵ް[Т499ig h`Zh _K+c/q=OXfF -GK0lqVWAϻNM/ႛ+ 퐣sbC<8jk׮8a^Fu4}i- `J x# "aᴃfJ^0CdJVh!1)xC e;ж)5N+\mdgN8~ /_ܲ$m\qK]"z5CR63uE5ځ~rSVVFFF@-J;`v}Ig;;;rymS"ǻh;"GsW_MUiwa ={6nSiJ #C>' `J!%O$WvF :8+W!iH{g}}¨Xs}:z}a7kXRm13d0fJv!vܙYI12 i۔Mλ~Z>rZdV\ac*USzIn/J*iø  $%Α!ء `J!a:u洃ȁ%U2*- _9N6nm F@pIYY',CK _XBwsX.MEn o0;WXR!|<%1;99=aRI zv¡B+nOA,">YT_OB?>3,oO'UTMI +*jC8nxJ*̲! ={Y>Bf'˾|[ Ph.a BzˤMum\[lѾ;0 ~A![84AxԩSi׺G fSS.4CRs%{!s¡%t`y7i9ehϗ2Oy6 !mJ03D+W]% ^ᴛTjEX׮]KE>a{`>F{*jsB?) jgv¸=aF:KKKSNY;'xˣ !UՀ_9m(I6Pb_E/o{RlibaC@tQzQt]zmܢS\6BMw;"VT { q|h es sСMWGso̐8Co gl~{lazZ+}7@pӳك㑆"7h 4CR6/m-C@,la7.IH˸_a?n!3y?G؇t|%yO]ojiY+L^u-mXn.؇aqt gGjVOb   PT-a,GÉ sv9رc?~e* a\'C>*rpvMRk>ruЯW1n0N8E4v,G-J ~{n]!VTSSSF'&&6@7%-G8Cs@@.{ _:?i z+\mJ\ߢ 'AX) :"#s…HC+VT";88WE8^Ѹܮ]2u'Ce ̕ҝzm0ݯlAG{P%C7 itݞ={l`3HC.XC {9XRmRcYNTҨ횴+$X'qC}]&9aNo1e̕AgK" gRirÀ: M)mJw`3iJ^4~-HgΜȑ' `#҈\%iXRmNf/216/]| Ky-J>'̎W*!*Ӈ| ryZVHs0E%Z3fl6vQm ,AS;wļɓ'rt<Q!](z `JY!|hzz:Y\&70?z衴D*i'O'C84o]C} AOڂ璾pmJM8q"N i4* ) ?;S^aJڄF*f. E@y)y䑌[jaqvŧ솥j B9i9\AH¾0]U^aJڄv !|uۢwal\HGWHEbg Fˎ3e%dhY-pRu߾Ӕrie5{G>7W8/,]0738p-)@xvv6d'lܾ0O+^aJtn!lKrY#,yظ~arr%yLa {ep( +fh~ouZRfv \,~wIU ¼br̐ƒ5b+ ԩH*jB{+=`C,G7??'ȺK@f< >8¡0PEt KB}ٌ)^Ќ_6%Y_\1q@.:thW\I4|5:ڭ0h`XRmV?La]!=P,qg?YD!fQ)I ;Q1ڔ;nS)z{0VN82K0 @?Zp+|b9w\d]J].Y5CR69q0A #GWrb'eŎoЇ>K}74q2N0z/l.IzŲs)$ #W8{A,79s&v6%.0A `J <55"'lۑ8ҵ)3q?`ځ:X\c| 5GWB9$C+DN\e7&%}ޡ8 jh٦ȏVv(U*9SeqU4GWa¼m6@Nu(I/;a \N͒I xɘعȘU@x B. cHCla/ĉqj 6?:^aJd6n0 ,f 7|9b((PcFGG{ ``4"yNQW*ƴMͪ o+<OK0 cǎeD5V+U*&}Вd~=^vXhQzs$p6TJbq|zF`{PzVD.5C3T6+,]| ?9?cr4avy)%~hJ PT-a)d8D7e]ѕpp߳gOepyrw d,y˥e@8T̠MrI9c;51b +T!`(8K £Mg+ PT-a8C8;1SԩSX߿?n[_ jieaCѾo#WVm~b۔\$sx%i[+GN>zj>n_;*jAx8A~A65 {r{챌.:Z:F PXA>CM0^rTVt#Y0.?aw=;ax`~d^a'l4CRys-XG.>>g8Q:(C,AiJnqN840͑ћI29{b+쪨CsC@DS@ok`XRmqhQhݲt4%wjC;'|2~RI!5vMIoIJZ@y45W2|~-GY8}Y!?/G0WGT;*jA'(!’s{XQ\-:d` \s,Ffߴn'9C4w;vL:8aM2ءVT-3u@`AAC&G?ڔ4CR6n)h$gAprq7믛g}q X Cܦn0/or vIBsQ̍M^蓪 AĽc'NH l %螞4 4CR69Lag֛-:qº`>z+Jt@qK-~NXb8,G\qֿ>]% ӧ֚3 4 i>M /:t/]WHst)Nc)~q<v(U*0OR2v)%Yr)ZI΍AK[!+htZ邓b*9OMg3Jlz޶  \%nh8a ;wΒWW/ /..^aS6%Jd%Gfxۃ4 XC,]'?>vx$FWѡy¡ˀ.MOM7#ѦT\acf\ a, av vLTbg=auUVT a9I)r kkk xI[o޽{3 K8IY#x K ;W 8 rN[m0ڔ{L ;9aY-iJv́ղ$䄱"+*jBXNRvA'ѣ6J;8mM%dV4L˜: a~p'}1M ۶)kJy ?":}6pɴlS2n9f c1be|f PTM aLR!]rV?첣}ag裏f(jQ}a$}g)CҬfor@GqHC~Kp_+K=K s1Clj։'Z0gH0ĸ+麪v(U*愰d80xq-vY%mx3Ї>Ncqh+ q0C1i|b#>f՛C"G<\0WX.I:TH31Ұ~ q[ƒ4>|x}v(U*f!p0\[ nO; ={:ariYT>h=ay;Vr9Zo8Vo: ebb۔{ iba=}tڵkq4la<~v(U*զ!Xz,g:@U53pOmJMWpMW؇>kW=Y_؈eASj߾}[WXRmjo"D!HЦE? 'rqt% a9:k8۔$T}(TmJ(׭#^56%p!K|>[ె⺔;3gϞMKk 1 |Ӏ0lJREf;c+y]^\\+_|e@};a.s K*̒׷+A ؁f+fd*i!+9ڵ 9s&3?? ~a,GCCC):U;*jKAR\f [ b<|yy9"(@xxxeO8iJ&7dY B[ hB Zio,`O An8)KڋL;XQNX.G8 [X* `J%!H͊+^^6B$%8}c{Δ^_rؾ| EW J$; pp{*eSAtR qC|ːN}<0Lm… Y366%H{NXR< 6fE _][ ~#)f<+]+XrY:`ٮԩB:vnXޯ -2xۦlzonr4?lS]*ٳgx"F[ /..]`f PT* fa9zuuIG޺`::nS:~]~gsm͔0!,i8m0Kͪ~3h{%i s!&w Hco8=;;۔pٴءVTVoHBsqn4)ӧOcX@1W_]iJfuXyM KW\^}U9 qذm6.GCUrSdiwKNyjەؑ%'WqȮW8+{9YpÇ^aJRpU.e', o@K+Rԧ>[Ώ&I'X%4g%$CiXܸ^R6%=Ix/?:Q]~lvmXz+VT.!Ԭ7n]q;I_6KOjCbVh ZBX׿^ a<}pNrȸc+}b!p:o\afEY⬔½Em;\o$n D0`^+VT ,S"N*hU…KGPn} W0nqB)rVH r! ,.9k8$g #ڒ0и/{*JSڅw3M F'rM6Bsb_!Ywtat*1k1Yʆp%#Pb;{HK` L0 <33{¶:ڸ%ina+VT[N` _W-m]\2b!wؑ17\S!'fhr?׏L*4v`N/9_@)26squٛN;vܦ6Etoo/ ^aJR8ZR|>op݁,H@A1X2Wh r3/䒏ɢBڶ)94,SBn8"Ҹ~p(2)RJ(4P N_s f)P`G(K@8rpkӜm-kMr V* 9ؑKKK_^VT*aH͂?<ʐԬygqZf%*݆@,徰\%bK K۽[ iS3k눯lf C#7!+슳xJis/VTqjK 3]jZNpjS M&! rZ!`&HK''VcM6?Z:au i{`sl/00`\r9 ehhhz*Ju R5.CZ:a\w @dj &#b+}~eNlS>X}`&9e }a7M/DX4\vso_)۔܏+Lٹ|Yf©{WXRT~j88򾰝tYܯY)X-sJIiY~p2E+,4-[D@+¹ } ̒Zm0 ¡½{WXRTᅅ%y[Q8qORb0/6 3 밿XC8r9X`9g/Ӽm^/73/W"ۦT*4+}',?g4Js^ 3+ei32'+s*Ju `]ɩYpA v@ ?oVH)fI',0/='9d?2]:A;؝EeA't4 r>lj΍\teƹa9)aIZhN))U*,ru]i{g>p&aԇp~1VRh,I[rZ/;0BXv1L0?.)1K /Ms0WDs8%-J2w`XRԬըT*qgцpn_p.evWX:P_',!,g єIKӼI5|TZ#TaC_60fC|>&T8+犳\t&{u1}a.SX `JsnIB`Aѕ(Ҳbs&)⋍|3=Y0! ZE]\rMJ?5aI[qP = ;WHcK`qѕ)lt3 iJRaE/=sq`\_T(޽{fآ$SCvZ.WNZv/®K>el#H-+LWxZ' MI ;wnv))U*@A^Gt}alۓp cvST߁r^2 X^f~$gvҵϛd8PC[@%zbQK|CEY|79;WxEWy F~`~ eSaJRE'f8e c+ԬÇste*^ ˪v~0_a2O_ &j%A^b'z+f{H r )ey!9紽t6WXRTw~jZ 0AB'D3m %x}w-G˽4${8C[l0\v+U7\Y,?;:i+ljjjq,a+;6 +U*C8qjkI#f'Z:>яc6qŷ6%?9dRz|oCYst!o:I3a/ v)) ^aJR},("ąY `[!z|(K|n7٦/3s!IJԚ0N >?EOOʁ16vd+2u{q.65>iz*Ju@A!lJ ;xC?9m~KP!F6ڹ_]);dt9V&--u5/G0SR{nmp8 y!vX' LwXR-7,SZ;~-8y$m`@q)b_o]aT%=$$`c; 醫@NC?焋ʠMHCJR݃Fj.{ Ѕ Ϟ=kS~T(2ޠ{,C_n!/9.]MrNWW g78a[~d_(2cpPF 4% @iVT{–@찀jtN oD{G8(uC eJXäI-L2ANSd %iGF ,mJceY:>;PRT6m0Aؔh``;04]22# w ]Y.Q'-GKWPwC0՚C.9֑T* AX g0`K'3qآG4]^6%JR'F`z 8Kh8pTR_^x~ri#\}AXj EV}EMۼIa떽t-yRBmJ48C)N؝X,>|mJ VT"?WJt׾Nxtt40Oj4nSuvBܯv:a`?&BIUαiJt ['}avrO%*nz*Ju@8a\bWUs n,..6቉ l徰_On?+Y v2;:'Zg¶S82kpc@x# i:u[ =a\,rloWXRTv{+l$}e3Hs.yAa,G؁ӝz*Ju T,풴%⋸?C-3po㑆rtrYCnCAYsO*? ,>iud'N6T!np0󆜴֑#jSr9)a{ihr4vp\&9ምXR6C͏ƁV% =h\a߱J;aqsqVrTܰ$-g ;0GLaT*ksՈ*J vR N?O~斜p(+_$ΑN]ȎYUCC*l3y:Z85bM0Vj^BRT uiq`fGru;;}J$''#jUmJx^@8(o.UG^Ï|{=m0Uhh3 +U*jA%~i6Zرc)w˻ '9ax[:UL iyvJg95)trIJfi!lvOOLL2(WjZRT;YvK5aqI qh hCn8d n6a3ʸ%i?=;Ng?\8nw{K)pv\]\\NB<VTMa 5# st3g/} _,YD'h$9`Yo"-C>,erwI~u}pXB(:uS%VT;a`vpkGWv%n?cCR)a?7Z*t.y*!_~BV~ey8~{ h^Ɔ[^'=W=TX϶J_@uz JRm cN~`rUIʕ+Od[___V8NX.ۆ0lpLa8'jeI|ʷ1L ڔ}F%|]6Kw %C^N.YېT*j@xpNxjj|%" NN8T/C侰 #f7P 7C= #>ŏ*GB?pw,_\[[XX#LRT[ q`0]4xY1;;k!/}i ˄)9AL—%",t8񆖞jhbŽR~pR\ck>]2&$(U*jBYr077c9zt||<p7Nw,^t~$K`ϳe_}{38^%^8MRUz;CVT- :v4] 7l9aSpqNxtΝe8)"(?C_,G:jl(~j;dZ~Ttolҏ92s)r䄯) ߠˋ+N8Qw߭XR(m0 .|!-Q-ݻi5b4%_;"kk%&Mxr#ԩSN-=z2 K,?c)}=׿*J!vD0M+krsWe*1eRs 'oYZB[BQ˜[b'vc 8^߈ꫯz5:B5z/3Zm~aaLw|<`Jvv¶0A;q9; 7/:tZҷy/q;{Kph]Teh氿 X]]]/xXzvWt*Ō*U*Jv5 ydhU}ao8^Klq}-8%Fˀy~>}JF?籯`I{gcZٔ+S>88~+_9Clp)ui~~J_?zh[*U*J] 2 (=a}s N80+iQ%'ڇ:??ܰ, $`EnSۋg;=m{Hsٵ /x7m*J ˆ$g .#>^{5;MNn 쐀 Zyd!X `.rρh\*_ׯ^paz W9j~ejjjPT*}C+m~squ4zVQ o]),/3fX 'mxx_ؽVԌ꣣/x嗯򗿼J];g,_~} a `JR}] l7d/@lKomsm?8}' :Ќae%_%iι>[V_,;cloqs\Y%]c |wy?JRmqnÇ3y0kt :& ?55Uw{{B8"6HaG rxt PM_)JRuYDW0\Z[U:.qcS;CaM^-ܤ2\3pu.9Mÿ%xu,cڵk+ yyޥ/G4\{:`JRo'|Da^m¹pt~|Ϟ=c_G{zzv.8CXS~ &rU,v]7xc._z~\!^S]'@ϿBa~ |*Jz !L-t:L׏N,GMc9z|׮]c>ߟÞ0u\Ά&.A'@0+W'''kBa-)L'!{w]g[*HRT᧞z*M.2GK|iXC) a{p»F/r`'t^ptܨ6gϞήGѣGpt3kkk],=Q~VT*A8-ė!rtNm!<222WW;mۖA[N8 {pF9ydƍ5!600FP-ˀI/ҮLU&Wtz>EX*Jz_r Psu:_!`-sS  jqJJsoo̬nR\cBP,򋱼S_—JWO81G/O芾О |ɑ[.WQɌ /w OSƞVT*]0)Ճr;ZPP(ٟ#} au$9ᄄ+[5jD3w | 4$JR6u1IɎ4$60[؍6A`%f1\S<- ӓ2tȑB6tTLڢf辗}st29;_JRACxaa!)D:}kN4uՍ/L1xe[gҥK1|XFz1 U:lgz):维X#UT*@Ø>d0nvT ag ַ'<|fMs}_zE[×N7Γw `JR; vaNphuu5?!%`ŅYKKKFƍᜯMB3Z0& ߵ; _JR8}%v:0fF..c}{߳Ƕ(q%9׾"{t/;q`2|os/!jphȆXRT~ꩧK.fv± 6ͩCn|_.\0OTV|+|h/] ߅ ~ *U*Ju_BgD^z*-\¼'9rةS_Wj,k>+|raW =E#^2vw `JR 1aCF%3fK$Nq?O)dGݾ20 bϗۂ+; WpukݾqT*n˟NGy;6@~8t=vx@НuKXzFȆ/|j|wU*Ju9a\4\V?h/^L4CQ]t51]e{ `JRs/]o߾(3#.Bg%gJ#\U,9Ӂipܱx[rRT{IqS,5 X64ݧJ`@wkkkhKVT*}a3IJ1an}X%bШt'\WVT*}a3$¥>梛2.jE*U*Ju?@8gr].I9ζ^e*U*Ju_AÙlOOORА sN}]{WRT tZMHQ1s _JRGC*q)U*Jua#\q >XRT~*JR)U*JRT*JRT*JVT*JVT*JRT*JRT*XRT*XRT*JRT `JRT `JR*JR*JR)U*JR)U*JRT*JRT*JVT*JRT*JRT*XRT*i'uNK,IENDB`./plugins/neg/0000755000004100000410000000000013246301623013475 5ustar www-datawww-data./plugins/neg/CMakeLists.txt0000644000004100000410000000015013246301623016231 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (neg PLUGINDEPS composite opengl) ./plugins/neg/src/0000755000004100000410000000000013246301623014264 5ustar www-datawww-data./plugins/neg/src/neg.h0000644000004100000410000000434313246301623015212 0ustar www-datawww-data/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "neg_options.h" class NegScreen : public PluginClassHandler , public NegOptions { public: NegScreen (CompScreen *); int negFunction; int negAlphaFunction; bool isNeg; bool checkStateTimeout (); void optionChanged (CompOption *opt, NegOptions::Options num); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector opt, bool all); GLScreen *gScreen; }; class NegWindow : public PluginClassHandler , public GLWindowInterface { public: NegWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool isNeg; void glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); void toggle (); }; #define NEG_SCREEN(s) \ NegScreen *ns = NegScreen::get (s); #define NEG_WINDOW(w) \ NegWindow *nw = NegWindow::get (w); class NegPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/neg/src/neg.cpp0000644000004100000410000003442013246301623015544 0ustar www-datawww-data/* * Copyright (c) 2006 Darryll Truchan * * Pixel shader negating by Dennis Kasprzyk * Usage of matches by Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "neg.h" static std::string fragment_function = " \n\ void neg_fragment () { \n\ vec3 color = vec3(1.0, 1.0, 1.0) - gl_FragColor.rgb; \n\ gl_FragColor = vec4(color, gl_FragColor.a); \n\ } \n\ "; COMPIZ_PLUGIN_20090315 (neg, NegPluginVTable); void NegWindow::toggle () { NEG_SCREEN (screen); /* toggle window negative flag */ isNeg = !isNeg; /* check exclude list */ if (ns->optionGetExcludeMatch ().evaluate (window)) isNeg = false; /* cause repainting */ cWindow->addDamage (); if (isNeg) gWindow->glDrawTextureSetEnabled (this, true); else gWindow->glDrawTextureSetEnabled (this, false); } bool NegScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector options, bool all) { if (all) { foreach (CompWindow *w, screen->windows ()) NegWindow::get (w)->toggle (); /* toggle screen negative flag */ isNeg = !isNeg; } else { Window xid; CompWindow *w; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) NegWindow::get (w)->toggle (); } return true; } void NegWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { bool doNeg = false; GLTexture *tex = NULL; NEG_SCREEN (screen); if (isNeg) { if (ns->optionGetNegDecorations ()) { doNeg = true; tex = texture; } else { doNeg = false; for (unsigned int i = 0; i < gWindow->textures ().size (); i++) { tex = gWindow->textures ()[i]; doNeg = (texture->name () == tex->name ()); if (doNeg) break; } } } if (doNeg && tex) { /* shader program negation */ if (true) { gWindow->addShaders ("neg", "", fragment_function); gWindow->glDrawTexture (texture, transform, attrib, mask); } else /* Texture manipulation negation */ { #ifndef USE_GLES GLTexture::Filter filter; /* this is for the most part taken from paint.c */ if (mask & PAINT_WINDOW_TRANSFORMED_MASK) filter = ns->gScreen->filter (WINDOW_TRANS_FILTER); else if (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) filter = ns->gScreen->filter (SCREEN_TRANS_FILTER); else filter = ns->gScreen->filter (NOTHING_TRANS_FILTER); /* if we can adjust saturation, even if it's just on and off */ if (GL::canDoSaturated && attrib.saturation != COLOR) { GLfloat constant[4]; /* enable the texture */ texture->enable (filter); /* texture combiner */ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PRIMARY_COLOR); /* negate */ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glColor4f (1.0f, 1.0f, 1.0f, 0.5f); /* make another texture active */ GL::activeTexture (GL_TEXTURE1_ARB); /* enable that texture */ texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); /* if we can do saturation that is in between min and max */ if (GL::canDoSlightlySaturated && attrib.saturation > 0) { glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT; constant[3] = 1.0; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); /* make another texture active */ GL::activeTexture (GL_TEXTURE2_ARB); /* enable that texture */ texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT); /* negate */ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); /* color constant */ constant[3] = attrib.saturation / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); /* if we are not opaque or not fully bright */ if (attrib.opacity < OPAQUE || attrib.brightness != BRIGHT) { /* make another texture active */ GL::activeTexture (GL_TEXTURE3_ARB); /* enable that texture */ texture->enable (filter); /* color constant */ constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); gWindow->glDrawTexture (texture, transform, attrib, mask); /* disable the current texture */ texture->disable (); /* set texture mode back to replace */ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); /* re-activate last texture */ GL::activeTexture (GL_TEXTURE2_ARB); } else { /* fully opaque and bright */ gWindow->glDrawTexture (texture, transform, attrib, mask); } /* disable the current texture */ texture->disable (); /* set the texture mode back to replace */ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); /* re-activate last texture */ GL::activeTexture (GL_TEXTURE1_ARB); } else { /* fully saturated or fully unsaturated */ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); /* color constant */ constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT * constant[0]; constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT * constant[1]; constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT * constant[2]; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); gWindow->glDrawTexture (texture, transform, attrib, mask); } /* disable the current texture */ texture->disable (); /* set the texture mode back to replace */ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); /* re-activate last texture */ GL::activeTexture (GL_TEXTURE0_ARB); /* disable that texture */ texture->disable (); /* set the default color */ glColor4usv (defaultColor); /* set screens texture mode back to replace */ ns->gScreen->setTexEnvMode (GL_REPLACE); } else { /* no saturation adjustments */ /* enable the current texture */ texture->enable (filter); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); /* negate */ glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); /* we are not opaque or fully bright */ if ((mask & PAINT_WINDOW_TRANSLUCENT_MASK) || attrib.brightness != BRIGHT) { GLfloat constant[4]; /* color constant */ constant[3] = attrib.opacity / 65535.0f; constant[0] = constant[1] = constant[2] = constant[3] * attrib.brightness / 65535.0f; glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); /* negate */ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); gWindow->glDrawTexture (texture, transform, attrib, mask); } else { /* no adjustments to saturation, brightness or opacity */ gWindow->glDrawTexture (texture, transform, attrib, mask); } /* disable the current texture */ texture->disable (); /* set the screens texture mode back to replace */ ns->gScreen->setTexEnvMode (GL_REPLACE); } #endif } } else { /* not negative */ gWindow->glDrawTexture (texture, transform, attrib, mask); } } void NegScreen::optionChanged (CompOption *opt, NegOptions::Options num) { switch (num) { case NegOptions::NegMatch: case NegOptions::ExcludeMatch: { foreach (CompWindow *w, screen->windows ()) { bool isNowNeg; NEG_WINDOW (w); isNowNeg = optionGetNegMatch ().evaluate (w); isNowNeg = isNowNeg && !optionGetExcludeMatch ().evaluate (w); if (isNowNeg && isNeg && !nw->isNeg) nw->toggle (); else if (!isNowNeg && nw->isNeg) nw->toggle (); } } break; case NegOptions::NegDecorations: { foreach (CompWindow *w, screen->windows ()) if (NegWindow::get (w)->isNeg) NegWindow::get (w)->cWindow->addDamage (); } break; case NegOptions::ActivateAtStartup: { isNeg = optionGetActivateAtStartup(); foreach (CompWindow *w, screen->windows ()) { NEG_WINDOW (w); nw->toggle (); } } default: break; } } NegScreen::NegScreen (CompScreen *screen) : PluginClassHandler (screen), NegOptions (), negFunction (0), negAlphaFunction (0), isNeg (optionGetActivateAtStartup()), gScreen (GLScreen::get (screen)) { optionSetWindowToggleKeyInitiate (boost::bind (&NegScreen::toggle, this, _1, _2, _3, false)); optionSetScreenToggleKeyInitiate (boost::bind (&NegScreen::toggle, this, _1, _2, _3, true)); optionSetNegMatchNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); optionSetExcludeMatchNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); optionSetNegDecorationsNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); optionSetActivateAtStartupNotify (boost::bind (&NegScreen::optionChanged, this, _1, _2)); } NegWindow::NegWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), isNeg (0) { GLWindowInterface::setHandler (gWindow, false); NEG_SCREEN (screen); /* Taken from ObjectAdd, since there is no equavilent * we check for screenNeg == true in ctor */ if (ns->isNeg && ns->optionGetNegMatch ().evaluate (window)) toggle (); } bool NegPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/neg/neg.xml.in0000644000004100000410000000316513246301623015402 0ustar www-datawww-data <_short>Negative <_long>Used to set a window or screen negative Accessibility opengl\ composite opengl blur decor ./plugins/widget/0000755000004100000410000000000013246301624014210 5ustar www-datawww-data./plugins/widget/widget.xml.in0000644000004100000410000000446713246301623016634 0ustar www-datawww-data <_short>Widget Layer <_long>Show widget windows on a separate layer Desktop fade animation opengl composite opengl decor <_short>Behaviour <_short>Appearance <_short>Background in Widget Mode ./plugins/widget/CMakeLists.txt0000644000004100000410000000015313246301623016746 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (widget PLUGINDEPS composite opengl) ./plugins/widget/src/0000755000004100000410000000000013246301624014777 5ustar www-datawww-data./plugins/widget/src/widget.cpp0000644000004100000410000003666213246301623017002 0ustar www-datawww-data/* * * Compiz widget handling plugin * * widget.cpp * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2008 Sam Spilsbury * E-mail : smspillaz@gmail.com * * Idea based on widget.c: * Copyright : (C) 2006 Quinn Storm * E-mail : livinglatexkali@gmail.com * * Copyright : (C) 2007 Mike Dransfield * E-mail : mike@blueroot.co.uk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "widget.h" class WidgetExp : public CompMatch::Expression { public: WidgetExp (const CompString &str); bool evaluate (const CompWindow *w) const; bool value; }; COMPIZ_PLUGIN_20090315 (widget, WidgetPluginVTable); static void enableFunctions (WidgetScreen *ws, bool enabled) { ws->cScreen->preparePaintSetEnabled (ws, enabled); ws->cScreen->donePaintSetEnabled (ws, enabled); foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); ww->window->focusSetEnabled (ww, enabled); ww->gWindow->glPaintSetEnabled (ww, enabled); } } void WidgetWindow::updateTreeStatus () { /* first clear out every reference to our window */ foreach (CompWindow *win, screen->windows ()) { WIDGET_WINDOW (win); if (ww->mParentWidget == win) ww->mParentWidget = NULL; } if (window->destroyed () || !mIsWidget) return; foreach (CompWindow *win, screen->windows ()) { Window clientLeader = win->clientLeader (true); if ((clientLeader == window->clientLeader ()) && (window->id () != win->id ())) { WIDGET_WINDOW (win); ww->mParentWidget = window; } } } bool WidgetWindow::updateWidgetStatus () { bool isWidget; WIDGET_SCREEN (screen); switch (mPropertyState) { case PropertyWidget: isWidget = true; break; case PropertyNoWidget: isWidget = false; break; default: if (!window->managed () || (window->wmType () & CompWindowTypeDesktopMask)) isWidget = false; else isWidget = ws->optionGetMatch ().evaluate (window); break; } bool retval = (!isWidget && mIsWidget) || (isWidget && !mIsWidget); mIsWidget = isWidget; return retval; } bool WidgetWindow::updateWidgetPropertyState () { Atom retType; int format; unsigned long nitems, remain; unsigned char *data = NULL; WIDGET_SCREEN (screen); int result = XGetWindowProperty (screen->dpy (), window->id (), ws->mCompizWidgetAtom, 0, 1L, false, AnyPropertyType, &retType, &format, &nitems, &remain, &data); if (result == Success && data) { if (nitems && format == 32) { unsigned long int *retData = (unsigned long int *) data; if (*retData) mPropertyState = PropertyWidget; else mPropertyState = PropertyNoWidget; } XFree (data); } else mPropertyState = PropertyNotSet; return updateWidgetStatus (); } void WidgetWindow::updateWidgetMapState (bool map) { if (map && mWasHidden) { window->show (); window->raise (); mWasHidden = false; window->managedSetEnabled (this, false); } else if (!map && !mWasHidden) { /* never set ww->mHidden on previously unmapped windows - it might happen that we map windows when entering the widget mode which aren't supposed to be unmapped */ if (window->isViewable ()) { window->hide (); mWasHidden = true; window->managedSetEnabled (this, true); } } } bool WidgetWindow::managed () const { return false; } void WidgetScreen::setWidgetLayerMapState (bool map) { CompWindow *highest = NULL; unsigned int highestActiveNum = 0; CompWindowList copyWindows = screen->windows (); /* We have to operate on a copy of the list, since it's possible * for the screen->windows () to be re-ordered by * WidgetWindow::updateWidgetMapState, (-> CompWindow::raise -> * CompScreen::unhookWindow) */ foreach (CompWindow *window, copyWindows) { WIDGET_WINDOW (window); if (!ww->mIsWidget) continue; if (window->activeNum () > highestActiveNum) { highest = window; highestActiveNum = window->activeNum (); } ww->updateWidgetMapState (map); } if (map && highest) { if (!mLastActiveWindow) mLastActiveWindow = screen->activeWindow (); highest->moveInputFocusTo (); } else if (!map) { CompWindow *w = screen->findWindow (mLastActiveWindow); mLastActiveWindow = None; if (w) w->moveInputFocusTo (); } } bool WidgetScreen::registerExpHandler () { screen->matchExpHandlerChanged (); return false; } WidgetExp::WidgetExp (const CompString &str) : value (strtol (str.c_str (), NULL, 0)) { } bool WidgetExp::evaluate (const CompWindow *w) const { const WidgetWindow *ww = WidgetWindow::get (w); return ((value && ww->mIsWidget) || (!value && !ww->mIsWidget)); } CompMatch::Expression * WidgetScreen::matchInitExp (const CompString &str) { /* Create a new match object */ if (str.find ("widget=") == 0) return new WidgetExp (str.substr (7)); return screen->matchInitExp (str); } void WidgetScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); if (ww->updateWidgetStatus ()) { bool map = !ww->mIsWidget || (mState != StateOff); ww->updateWidgetMapState (map); ww->updateTreeStatus (); screen->matchPropertyChanged (w); } } } bool WidgetScreen::toggle (CompAction *action, CompAction::State state, CompOption::Vector &options) { switch (mState) { case StateOn: case StateFadeIn: setWidgetLayerMapState (false); mFadeTime = 1000.0f * optionGetFadeTime (); mState = StateFadeOut; break; case StateOff: case StateFadeOut: setWidgetLayerMapState (true); mFadeTime = 1000.0f * optionGetFadeTime (); mState = StateFadeIn; break; default: break; } if (!mGrabIndex) mGrabIndex = screen->pushGrab (screen->cursorCache (XC_watch), "widget"); enableFunctions (this, true); cScreen->damageScreen (); return true; } void WidgetScreen::endWidgetMode (CompWindow *closedWidget) { CompOption::Vector options; if (mState != StateOn && mState != StateFadeIn) return; if (closedWidget) { /* end widget mode if the closed widget was the last one */ WIDGET_WINDOW (closedWidget); if (ww->mIsWidget) { foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); if (w == closedWidget) continue; if (ww->mIsWidget) return; } } else return; } options.push_back (CompOption ("root", CompOption::TypeInt)); options[0].value ().set ((int) screen->root ()); toggle (NULL, 0, options); } void WidgetScreen::handleEvent (XEvent *event) { CompWindow *w; screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == mCompizWidgetAtom) { w = screen->findWindow (event->xproperty.window); if (w) { WIDGET_WINDOW (w); if (ww->updateWidgetPropertyState ()) { bool map = !ww->mIsWidget || mState != StateOff; ww->updateWidgetMapState (map); ww->updateTreeStatus (); screen->matchPropertyChanged (w); } } } else if (event->xproperty.atom == Atoms::wmClientLeader) { w = screen->findWindow (event->xproperty.window); if (w) { WIDGET_WINDOW (w); if (ww->mIsWidget) ww->updateTreeStatus (); else if (ww->mParentWidget) { WidgetWindow *pww = WidgetWindow::get (ww->mParentWidget); pww->updateTreeStatus (); } } } break; case ButtonPress: /* terminate widget mode if a non-widget window was clicked */ if (optionGetEndOnClick () && event->xbutton.button == Button1) { if (mState == StateOn) { w = screen->findWindow (event->xbutton.window); if (w && w->managed ()) { WIDGET_WINDOW (w); if (!ww->mIsWidget && !ww->mParentWidget) endWidgetMode (NULL); } } } break; case MapNotify: w = screen->findWindow (event->xmap.window); if (w) { WIDGET_WINDOW (w); ww->updateWidgetStatus (); if (ww->mIsWidget) ww->updateWidgetMapState (mState != StateOff); } break; case UnmapNotify: w = screen->findWindow (event->xunmap.window); if (w) { WIDGET_WINDOW (w); ww->updateTreeStatus (); endWidgetMode (w); } break; case DestroyNotify: w = screen->findWindow (event->xdestroywindow.window); if (w) { WIDGET_WINDOW (w); ww->updateTreeStatus (); endWidgetMode (w); } break; default: break; } } bool WidgetWindow::updateMatch () { if (updateWidgetStatus ()) { WIDGET_SCREEN (screen); updateTreeStatus (); updateWidgetMapState (ws->mState != WidgetScreen::StateOff); screen->matchPropertyChanged (window); } return false; } bool WidgetScreen::updateStatus (CompWindow *w) { WIDGET_WINDOW (w); if (ww->updateWidgetPropertyState ()) ww->updateWidgetMapState (mState != StateOff); Window clientLeader = w->clientLeader (true); if (ww->mIsWidget) ww->updateTreeStatus (); else if (clientLeader) { CompWindow *lw = screen->findWindow (clientLeader); if (lw) { WidgetWindow *lww = WidgetWindow::get (lw); if (lww->mIsWidget) ww->mParentWidget = lw; else if (lww->mParentWidget) ww->mParentWidget = lww->mParentWidget; } } return false; } void WidgetScreen::matchPropertyChanged (CompWindow *w) { WIDGET_WINDOW (w); /* one shot timeout which will update the widget status (timer is needed because we don't want to call wrapped functions recursively) */ if (!ww->mMatchUpdate.active ()) ww->mMatchUpdate.start (boost::bind (&WidgetWindow::updateMatch, ww), 0, 0); screen->matchPropertyChanged (w); } bool WidgetWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; WIDGET_SCREEN (screen); if (ws->mState != WidgetScreen::StateOff) { GLWindowPaintAttrib wAttrib = attrib; float fadeProgress; if (ws->mState == WidgetScreen::StateOn) fadeProgress = 1.0f; else { fadeProgress = ws->optionGetFadeTime (); if (fadeProgress) fadeProgress = (float) ws->mFadeTime / (1000.0f * fadeProgress); fadeProgress = 1.0f - fadeProgress; } if (!mIsWidget && !mParentWidget) { if (ws->mState == WidgetScreen::StateFadeIn || ws->mState == WidgetScreen::StateOn) fadeProgress = 1.0f - fadeProgress; float progress = ws->optionGetBgSaturation () / 100.0f; progress += (1.0f - progress) * fadeProgress; wAttrib.saturation = (float) wAttrib.saturation * progress; progress = ws->optionGetBgBrightness () / 100.0f; progress += (1.0f - progress) * fadeProgress; wAttrib.brightness = (float) wAttrib.brightness * progress; } status = gWindow->glPaint (wAttrib, transform, region, mask); } else status = gWindow->glPaint (attrib, transform, region, mask); return status; } bool WidgetWindow::focus () { WIDGET_SCREEN (screen); /* Don't focus non-widget windows while widget mode is enabled */ if (ws->mState != WidgetScreen::StateOff && !mIsWidget && !mParentWidget) return false; return window->focus (); } void WidgetScreen::preparePaint (int msSinceLastPaint) { if ((mState == StateFadeIn) || (mState == StateFadeOut)) { mFadeTime -= msSinceLastPaint; mFadeTime = MAX (mFadeTime, 0); } cScreen->preparePaint (msSinceLastPaint); } void WidgetScreen::donePaint () { if (mState == StateFadeIn || mState == StateFadeOut) { if (mFadeTime) cScreen->damageScreen (); else { if (mGrabIndex) { screen->removeGrab (mGrabIndex, NULL); mGrabIndex = 0; } if (mState == StateFadeIn) mState = StateOn; else mState = StateOff; } } if (mState == StateOff) { cScreen->damageScreen (); enableFunctions (this, false); } cScreen->donePaint (); } void WidgetScreen::optionChanged (CompOption *option, WidgetOptions::Options num) { switch (num) { case WidgetOptions::Match: { foreach (CompWindow *w, screen->windows ()) { WIDGET_WINDOW (w); if (ww->updateWidgetStatus ()) { bool map = !ww->mIsWidget || mState != StateOff; ww->updateWidgetMapState (map); ww->updateTreeStatus (); screen->matchPropertyChanged (w); } } } break; default: break; } } /* ------ */ WidgetScreen::WidgetScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), mLastActiveWindow (None), mCompizWidgetAtom (XInternAtom (screen->dpy (), "_COMPIZ_WIDGET", false)), mFadeTime (0), mGrabIndex (0) { CompAction::CallBack cb; ChangeNotify notify; CompTimer registerTimer; ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); screen->handleEventSetEnabled (this, true); screen->matchInitExpSetEnabled (this, true); screen->matchExpHandlerChangedSetEnabled (this, true); cb = boost::bind (&WidgetScreen::toggle, this, _1, _2, _3); optionSetToggleKeyInitiate (cb); optionSetToggleButtonInitiate (cb); optionSetToggleEdgeInitiate (cb); notify = boost::bind (&WidgetScreen::optionChanged, this, _1, _2); optionSetMatchNotify (notify); /* one shot timeout to which will register the expression handler after all screens and windows have been initialized */ registerTimer.start (boost::bind(&WidgetScreen::registerExpHandler, this), 0, 0); mState = StateOff; } WidgetScreen::~WidgetScreen () { screen->matchExpHandlerChangedSetEnabled (this, false); screen->matchExpHandlerChanged (); } WidgetWindow::WidgetWindow (CompWindow *window) : PluginClassHandler (window), window (window), gWindow (GLWindow::get (window)), mIsWidget (false), mWasHidden (false), mParentWidget (NULL), mPropertyState (PropertyNotSet) { WindowInterface::setHandler (window); GLWindowInterface::setHandler (gWindow, false); window->managedSetEnabled (this, false); mWidgetStatusUpdate.start (boost::bind (&WidgetScreen::updateStatus, WidgetScreen::get (screen), window), 0, 0); } WidgetWindow::~WidgetWindow () { if (mMatchUpdate.active ()) mMatchUpdate.stop (); if (mWidgetStatusUpdate.active ()) mWidgetStatusUpdate.stop (); } bool WidgetPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/widget/src/widget.h0000644000004100000410000000703313246301623016435 0ustar www-datawww-data/* * * Compiz widget handling plugin * * widget.c * * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2008 Sam Spilsbury * E-mail : smspillaz@gmail.com * * Idea based on widget.c: * Copyright : (C) 2006 Quinn Storm * E-mail : livinglatexkali@gmail.com * * Copyright : (C) 2007 Mike Dransfield * E-mail : mike@blueroot.co.uk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include "widget_options.h" class WidgetScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public WidgetOptions { public: enum WidgetState { StateOff = 0, StateFadeIn = 1, StateOn = 2, StateFadeOut = 3 }; public: WidgetScreen (CompScreen *screen); ~WidgetScreen (); CompositeScreen *cScreen; void handleEvent (XEvent *event); void matchPropertyChanged (CompWindow *w); void matchExpHandlerChanged (); CompMatch::Expression * matchInitExp (const CompString &value); void preparePaint (int); void donePaint (); void setWidgetLayerMapState (bool map); bool registerExpHandler (); bool toggle (CompAction *action, CompAction::State state, CompOption::Vector &options); void endWidgetMode (CompWindow *closedWidget); bool updateStatus (CompWindow *w); void optionChanged (CompOption *, WidgetOptions::Options num); Window mLastActiveWindow; Atom mCompizWidgetAtom; WidgetState mState; int mFadeTime; CompScreen::GrabHandle mGrabIndex; }; #define WIDGET_SCREEN(screen) \ WidgetScreen *ws = WidgetScreen::get (screen) class WidgetWindow : public PluginClassHandler , public WindowInterface, public GLWindowInterface { public: enum WidgetPropertyState { PropertyNotSet = 0, PropertyWidget, PropertyNoWidget }; public: WidgetWindow (CompWindow *w); ~WidgetWindow (); CompWindow *window; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool focus (); void updateTreeStatus (); bool updateWidgetStatus (); bool updateWidgetPropertyState (); void updateWidgetMapState (bool map); bool updateMatch (); bool managed () const; bool mIsWidget; bool mWasHidden; CompWindow *mParentWidget; CompTimer mMatchUpdate; CompTimer mWidgetStatusUpdate; WidgetPropertyState mPropertyState; }; #define WIDGET_WINDOW(window) \ WidgetWindow *ww = WidgetWindow::get (window) class WidgetPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/td/0000755000004100000410000000000013246301624013334 5ustar www-datawww-data./plugins/td/CMakeLists.txt0000644000004100000410000000015413246301623016073 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (td PLUGINDEPS composite opengl cube) ./plugins/td/td.xml.in0000644000004100000410000000664413246301623015103 0ustar www-datawww-data <_short>3D Windows <_long>Elevates windows while rotating the cube Effects opengl cube composite opengl cube decor <_short>Misc. Options <_short>Window Depth <_short>Bevel Corners ./plugins/td/src/0000755000004100000410000000000013246301623014122 5ustar www-datawww-data./plugins/td/src/3d.cpp0000644000004100000410000003545213246301623015145 0ustar www-datawww-data#include "3d.h" COMPIZ_PLUGIN_20090315 (td, TdPluginVTable); const double PI = 3.14159265359f; void setFunctions (bool enabled) { TD_SCREEN (screen); tds->gScreen->glPaintOutputSetEnabled (tds, enabled); tds->gScreen->glApplyTransformSetEnabled (tds, enabled); tds->cScreen->donePaintSetEnabled (tds, enabled); tds->cubeScreen->cubePaintViewportSetEnabled (tds, enabled); tds->cubeScreen->cubeShouldPaintViewportSetEnabled (tds, enabled); tds->cubeScreen->cubeShouldPaintAllViewportsSetEnabled (tds, enabled); foreach (CompWindow *w, screen->windows ()) { TD_WINDOW (w); tdw->gWindow->glPaintSetEnabled (tdw, enabled); } } bool TdWindow::is3D () { if (window->overrideRedirect ()) return false; if (!window->isViewable () || window->shaded ()) return false; if (window->state () & (CompWindowStateSkipPagerMask | CompWindowStateSkipTaskbarMask)) return false; if (!TdScreen::get (screen)->optionGetWindowMatch ().evaluate (window)) return false; return true; } void TdScreen::preparePaint (int msSinceLastPaint) { bool active; CUBE_SCREEN (screen); active = (cs->rotationState () != CubeScreen::RotationNone) && screen->vpSize ().width () > 2 && !(optionGetManualOnly () && (cs->rotationState () != CubeScreen::RotationManual)); if (active || mBasicScale != 1.0) { float maxDiv = (float) optionGetMaxWindowSpace () / 100; float minScale = (float) optionGetMinCubeSize () / 100; float x, progress; cs->cubeGetRotation (x, x, progress); mMaxDepth = 0; foreach (CompWindow *w, screen->windows ()) { TD_WINDOW (w); tdw->mIs3D = false; tdw->mDepth = 0; if (!tdw->is3D ()) continue; tdw->mIs3D = true; mMaxDepth++; tdw->mDepth = mMaxDepth; } minScale = MAX (minScale, 1.0 - (mMaxDepth * maxDiv)); mBasicScale = 1.0 - ((1.0 - minScale) * progress); mDamage = (progress != 0.0 && progress != 1.0); } else { mBasicScale = 1.0; } /* comparing float values with != is error prone, so better cache the comparison and allow a small difference */ mActive = (fabs (mBasicScale - 1.0f) > 1e-4); mCurrentScale = mBasicScale; cScreen->preparePaint (msSinceLastPaint); if (cubeScreen->multioutputMode() != CubeScreen::OneBigCube && screen->outputDevs().size() > 1) setFunctions(false); else setFunctions (mActive); } #define DOBEVEL(corner) (tds->optionGetBevel##corner () ? bevel : 0) #define SET_V \ for (int i = 0; i < 4; i++) \ v[i] = tPoint[i]; #define ADDQUAD(x1,y1,x2,y2) \ point[GLVector::x] = x1; point[GLVector::y] = y1; \ tPoint = transform * point; \ SET_V \ glVertex4fv (v); \ point[GLVector::x] = x2; point[GLVector::y] = y2; \ tPoint = transform * point; \ SET_V \ glVertex4fv (v); \ tPoint = tds->mBTransform * point; \ SET_V \ glVertex4fv (v); \ point[GLVector::x] = x1; point[GLVector::y] = y1; \ tPoint = tds->mBTransform * point; \ SET_V \ glVertex4fv (v); \ #define ADDBEVELQUAD(x1,y1,x2,y2,m1,m2) \ point[GLVector::x] = x1; point[GLVector::y] = y1; \ tPoint = m1 * point; \ SET_V \ glVertex4fv (v); \ tPoint = m2 * point; \ SET_V \ glVertex4fv (v); \ point[GLVector::x] = x2; point[GLVector::y] = y2; \ tPoint = m2 * point; \ SET_V \ glVertex4fv (v); \ tPoint = m1 * point; \ SET_V \ glVertex4fv (v); \ bool TdWindow::glPaintWithDepth (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; int wx, wy, ww, wh; int bevel, cull, cullInv; GLVector point, tPoint; unsigned short *c; TD_SCREEN (screen); CUBE_SCREEN (screen); glIsEnabled (GL_CULL_FACE); wx = window->x () - window->input ().left; wy = window->y () - window->input ().top; ww = window->width () + window->input ().left + window->input ().right; wh = window->height () + window->input ().top + window->input ().bottom; bevel = tds->optionGetBevel (); glGetIntegerv (GL_CULL_FACE_MODE, &cull); cullInv = (cull == GL_BACK)? GL_FRONT : GL_BACK; if (ww && wh && !(mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) && ((cs->paintOrder () == FTB && mFtb) || (cs->paintOrder () == BTF && !mFtb))) { float v[4]; int temp; /* Paint window depth. */ glPushMatrix (); glLoadIdentity (); if (cs->paintOrder () == BTF) glCullFace (cullInv); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (window->id () == screen->activeWindow ()) c = tds->optionGetWidthColor (); else c = tds->optionGetWidthColorInactive (); temp = c[3] * gWindow->paintAttrib ().opacity; temp /= 0xffff; glColor4us (c[0], c[1], c[2], temp); point[GLVector::z] = 0.0f; point[GLVector::w] = 1.0f; glBegin (GL_QUADS); /* Top */ ADDQUAD (wx + ww - DOBEVEL (Topleft), wy + 0.01, wx + DOBEVEL (Topright), wy + 0.01); /* Bottom */ ADDQUAD (wx + DOBEVEL (Bottomleft), wy + wh - 0.01, wx + ww - DOBEVEL (Bottomright), wy + wh - 0.01); /* Left */ ADDQUAD (wx + 0.01, wy + DOBEVEL (Topleft), wx + 0.01, wy + wh - DOBEVEL (Bottomleft)); /* Right */ ADDQUAD (wx + ww - 0.01, wy + wh - DOBEVEL (Topright), wx + ww - 0.01, wy + DOBEVEL (Bottomright)); /* Top left bevel */ if (tds->optionGetBevelTopleft ()) { ADDBEVELQUAD (wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, wx, wy + bevel, tds->mBTransform, transform); ADDBEVELQUAD (wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, wx + bevel, wy, transform, tds->mBTransform); } /* Bottom left bevel */ if (tds->optionGetBevelBottomleft ()) { ADDBEVELQUAD (wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx, wy + wh - bevel, transform, tds->mBTransform); ADDBEVELQUAD (wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx + bevel, wy + wh, tds->mBTransform, transform); } /* Bottom right bevel */ if (tds->optionGetBevelBottomright ()) { ADDBEVELQUAD (wx + ww - bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx + ww - bevel, wy + wh, transform, tds->mBTransform); ADDBEVELQUAD (wx + ww - bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wx + ww, wy + wh - bevel, tds->mBTransform, transform); } /* Top right bevel */ if (tds->optionGetBevelTopright ()) { ADDBEVELQUAD (wx + ww - bevel, wy, wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, transform, tds->mBTransform); ADDBEVELQUAD (wx + ww, wy + bevel, wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, tds->mBTransform, transform); } glEnd (); glColor4usv (defaultColor); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glPopMatrix (); if (cs->paintOrder () == BTF) glCullFace (cull); } if (cs->paintOrder () == BTF) status = gWindow->glPaint (attrib, transform, region, mask); else status = gWindow->glPaint (attrib, tds->mBTransform, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); return status; } bool TdWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; TD_SCREEN (screen); if (mDepth != 0.0f && !tds->mPainting3D && tds->mActive) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; if (tds->mPainting3D && tds->optionGetWidth () && (mDepth != 0.0f) && tds->mWithDepth) { status = glPaintWithDepth (attrib, transform, region, mask); } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } void TdScreen::glApplyTransform (const GLScreenPaintAttrib &attrib, CompOutput *output, GLMatrix *transform) { gScreen->glApplyTransform (attrib, output, transform); transform->scale (mCurrentScale, mCurrentScale, mCurrentScale); } void TdScreen::cubePaintViewport (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { CUBE_SCREEN (screen); if (cs->paintOrder () == BTF) { cs->cubePaintViewport (attrib, transform,region, output, mask); } if (mActive) { GLMatrix mTransform; // NOT a member variable GLMatrix screenSpace; GLMatrix screenSpaceOffset; TdWindow *tdw; CompWindowList pl; CompWindowList::iterator it; float wDepth = 0.0; float pointZ = cs->invert () * cs->distance (); unsigned int newMask; std::vector vPoints; vPoints.push_back (GLVector (-0.5, 0.0, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.5, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.0, pointZ, 1.0)); if (mWithDepth) wDepth = -MIN((optionGetWidth ()) / 30, (1.0 - mBasicScale) / mMaxDepth); if (wDepth != 0.0) { /* all BTF windows in normal order */ foreach (CompWindow *w, screen->windows ()) { tdw = TdWindow::get (w); if (!tdw->mIs3D) continue; mCurrentScale = mBasicScale + (tdw->mDepth * ((1.0 - mBasicScale) / mMaxDepth)); tdw->mFtb = cs->cubeCheckOrientation (attrib, transform, output, vPoints); } } mCurrentScale = mBasicScale; mPainting3D = true; gScreen->setLighting (true); screenSpace.reset (); screenSpace.toScreenSpace (output, -attrib.zTranslate); glPushMatrix (); pl = cScreen->getWindowPaintList (); /* paint all windows from bottom to top */ for (it = pl.begin (); it != pl.end (); ++it) { CompWindow *w = (*it); tdw = TdWindow::get (w); if (w->destroyed () || !w->isMapped() || w->minimized()) continue; if (!w->shaded () || !w->isViewable ()) { if (!tdw->cWindow->damaged ()) continue; } mTransform = transform; newMask = PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; if (tdw->mDepth != 0.0f) { mCurrentScale = mBasicScale + (tdw->mDepth * ((1.0 - mBasicScale) / mMaxDepth)); if (wDepth != 0.0) { mCurrentScale += wDepth; mBTransform = transform; gScreen->glApplyTransform (attrib, output, &mBTransform); mCurrentScale -= wDepth; } gScreen->glApplyTransform (attrib, output, &mTransform); gScreen->glEnableOutputClipping (mTransform, region, output); if ((cScreen->windowPaintOffset ().x () != 0 || cScreen->windowPaintOffset ().y () != 0) && !w->onAllViewports ()) { CompPoint moveOffset; moveOffset = w->getMovementForOffset ( cScreen->windowPaintOffset ()); screenSpaceOffset = screenSpace; screenSpaceOffset.translate (moveOffset.x (), moveOffset.y (), 0); if (wDepth != 0.0) mBTransform = mBTransform * screenSpaceOffset; mTransform = mTransform * screenSpaceOffset; newMask |= PAINT_WINDOW_WITH_OFFSET_MASK; } else { if (wDepth != 0.0) mBTransform = mBTransform * screenSpace; mTransform = mTransform * screenSpace; } glLoadMatrixf (mTransform.getMatrix ()); GL::shaders = false; tdw->gWindow->glPaint (tdw->gWindow->paintAttrib (), mTransform, CompRegion::infinite (), newMask); GL::shaders = true; gScreen->glDisableOutputClipping (); } } glPopMatrix (); mPainting3D = false; mCurrentScale = mBasicScale; } if (cs->paintOrder () == FTB) { cs->cubePaintViewport (attrib, transform, region, output, mask); } } bool TdScreen::cubeShouldPaintAllViewports () { return true; } bool TdScreen::cubeShouldPaintViewport (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, CompOutput *outputPtr, PaintOrder order) { CUBE_SCREEN (screen); bool rv = cs->cubeShouldPaintViewport (attrib, transform, outputPtr, order); if (mActive) { float pointZ = cs->invert () * cs->distance (); bool ftb1, ftb2; std::vector vPoints; vPoints.push_back (GLVector (-0.5, 0.0, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.5, pointZ, 1.0)); vPoints.push_back (GLVector (0.0, 0.0, pointZ, 1.0)); mCurrentScale = 1.0; ftb1 = cs->cubeCheckOrientation (attrib, transform, outputPtr, vPoints); mCurrentScale = mBasicScale; ftb2 = cs->cubeCheckOrientation (attrib, transform, outputPtr, vPoints); return (order == FTB && (ftb1 || ftb2)) || (order == BTF && (!ftb1 || !ftb2)) || rv; } return true; } bool TdScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; if (mActive) { CompPlugin *p; mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK | PAINT_SCREEN_NO_OCCLUSION_DETECTION_MASK; mWithDepth = true; p = CompPlugin::find ("cubeaddon"); if (p) { CompOption::Vector &options = p->vTable->getOptions (); CompOption option; mWithDepth = (CompOption::getIntOptionNamed (options, "deformation", 0) == 0); } } status = gScreen->glPaintOutput (attrib, transform, region, output, mask); return status; } void TdScreen::donePaint () { if (mActive && mDamage) { mDamage = false; cScreen->damageScreen (); } cScreen->donePaint (); } TdScreen::TdScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), cubeScreen (CubeScreen::get (screen)), mActive (false), mPainting3D (false), mCurrentScale (1.0f), mBasicScale (1.0f) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); CubeScreenInterface::setHandler (cubeScreen, false); cScreen->preparePaintSetEnabled (this, true); } TdScreen::~TdScreen () { } TdWindow::TdWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mIs3D (false), mFtb (false), mDepth (0.0f) { GLWindowInterface::setHandler (gWindow, false); } TdWindow::~TdWindow () { } bool TdPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("cube", COMPIZ_CUBE_ABI) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/td/src/3d.h0000644000004100000410000000630213246301623014602 0ustar www-datawww-data/* * * Compiz 3d plugin * * 3d.c * * Copyright : (C) 2006 by Roi Cohen * E-mail : roico12@gmail.com * * Modified by : Dennis Kasprzyk * Danny Baumann * Robert Carr * Diogo Ferreira * Kevin Lange * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ /** TODO: 1. Add 3d shadows / projections. 2. Add an option to select z-order of windows not only by viewports, but also by screens. */ #include #include #include #include #include #include #include "td_options.h" extern const double PI; class TdScreen : public PluginClassHandler , public CompositeScreenInterface, public GLScreenInterface, public CubeScreenInterface, public TdOptions { public: TdScreen (CompScreen *); ~TdScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CubeScreen *cubeScreen; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void glApplyTransform (const GLScreenPaintAttrib &, CompOutput *, GLMatrix *); void cubePaintViewport (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); bool cubeShouldPaintViewport (const GLScreenPaintAttrib &, const GLMatrix &, CompOutput *, PaintOrder ); bool cubeShouldPaintAllViewports (); bool mActive; bool mPainting3D; float mCurrentScale; float mBasicScale; float mMaxDepth; bool mDamage; bool mWithDepth; GLMatrix mBTransform; }; #define TD_SCREEN(s) \ TdScreen *tds = TdScreen::get (s) class TdWindow : public PluginClassHandler , public GLWindowInterface { public: TdWindow (CompWindow *); ~TdWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool glPaintWithDepth (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool is3D (); bool mIs3D; bool mFtb; float mDepth; }; #define TD_WINDOW(w) \ TdWindow *tdw = TdWindow::get (w) class TdPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/resizeinfo/0000755000004100000410000000000013246301624015102 5ustar www-datawww-data./plugins/resizeinfo/CMakeLists.txt0000644000004100000410000000023313246301623017637 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (resizeinfo PLUGINDEPS opengl composite PKGDEPS pango pangocairo cairo-xlib-xrender) ./plugins/resizeinfo/resizeinfo.xml.in0000644000004100000410000000543313246301623020412 0ustar www-datawww-data <_short>Resize Info <_long>Display info on resize similar to metacity Utility opengl opengl composite resize decor ./plugins/resizeinfo/src/0000755000004100000410000000000013246301624015671 5ustar www-datawww-data./plugins/resizeinfo/src/resizeinfo.h0000644000004100000410000000542513246301623020224 0ustar www-datawww-data/** * * Compiz metacity like info during resize * * resizeinfo.c * * Copyright (c) 2007 Robert Carr * * Compiz resize atom usage and general cleanups by * Copyright (c) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include #include #include "resizeinfo_options.h" extern const unsigned short RESIZE_POPUP_WIDTH; extern const unsigned short RESIZE_POPUP_HEIGHT; extern const double PI; /* Cairo helper class */ class InfoLayer { public: InfoLayer (); ~InfoLayer (); bool valid; Screen *s; XRenderPictFormat *format; Pixmap pixmap; cairo_surface_t *surface; GLTexture::List texture; cairo_t *cr; void draw (const GLMatrix &transform, int x, int y); void renderBackground (); void renderText (); }; class InfoScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ResizeinfoOptions { public: InfoScreen (CompScreen *); GLScreen *gScreen; CompositeScreen *cScreen; Atom resizeInfoAtom; CompWindow *pWindow; bool drawing; int fadeTime; InfoLayer backgroundLayer; InfoLayer textLayer; XRectangle resizeGeometry; void damagePaintRegion (); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void donePaint (); void handleEvent (XEvent *event); }; class InfoWindow : public PluginClassHandler , public WindowInterface { public: InfoWindow (CompWindow *); CompWindow *window; void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); }; #define INFO_SCREEN(s) \ InfoScreen *is = InfoScreen::get (s); #define INFO_WINDOW(w) \ InfoWindow *iw = InfoWindow::get (w); class InfoPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/resizeinfo/src/resizeinfo.cpp0000644000004100000410000003561013246301623020556 0ustar www-datawww-data/** * * Compiz metacity like info during resize * * resizeinfo.cpp * * Copyright (c) 2007 Robert Carr * * Compiz resize atom usage and general cleanups by * Copyright (c) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "resizeinfo.h" COMPIZ_PLUGIN_20090315 (resizeinfo, InfoPluginVTable); const unsigned short RESIZE_POPUP_WIDTH = 100; const unsigned short RESIZE_POPUP_HEIGHT = 33; const double PI = 3.14159265359f; /* Set up an InfoLayer to build a cairo->opengl texture pipeline */ InfoLayer::~InfoLayer () { if (cr) cairo_destroy (cr); if (surface) cairo_surface_destroy (surface); if (pixmap) XFreePixmap (screen->dpy (), pixmap); } /* Here 's' is Screen * 'screen' is 'CompScreen *' */ InfoLayer::InfoLayer () : valid (false), s (ScreenOfDisplay (screen->dpy (), screen->screenNum ())), pixmap (None), surface (NULL), cr (NULL) { format = XRenderFindStandardFormat (screen->dpy (), PictStandardARGB32); if (!format) return; pixmap = XCreatePixmap (screen->dpy (), screen->root (), RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT, 32); if (!pixmap) return; surface = cairo_xlib_surface_create_with_xrender_format (screen->dpy (), pixmap, s, format, RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT); if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) { compLogMessage ("resizeinfo", CompLogLevelWarn, "Could not create cairo layer surface,"); return; } texture = GLTexture::bindPixmapToTexture (pixmap, RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT, 32); if (!texture.size ()) { compLogMessage ("resizeinfo", CompLogLevelWarn, "Bind Pixmap to Texture failure"); return; } cr = cairo_create (surface); if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { compLogMessage ("resizeinfo", CompLogLevelWarn, "Could not create cairo context"); return; } valid = true; } /* Draw the window "size" derived from the window hints. We calculate width or height - base_width or base_height and divide it by the increment in each direction. For windows like terminals setting the proper size hints this gives us the number of columns/rows. */ void InfoLayer::renderText () { unsigned short *color; char info[50]; PangoLayout *layout; PangoFontDescription *font; int w, h; INFO_SCREEN (screen); if (!valid) return; unsigned int baseWidth = is->pWindow->sizeHints ().base_width; unsigned int baseHeight = is->pWindow->sizeHints ().base_height; unsigned int widthInc = is->pWindow->sizeHints ().width_inc; unsigned int heightInc = is->pWindow->sizeHints ().height_inc; unsigned int width = is->resizeGeometry.width; unsigned int height = is->resizeGeometry.height; color = is->optionGetTextColor (); unsigned int xv = (widthInc > 1) ? (width - baseWidth) / widthInc : width; unsigned int yv = (heightInc > 1) ? (height - baseHeight) / heightInc : height; /* Clear the context. */ cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); snprintf (info, 50, "%u x %u", xv, yv); font = pango_font_description_new (); layout = pango_cairo_create_layout (is->textLayer.cr); pango_font_description_set_family (font,"Sans"); pango_font_description_set_absolute_size (font, is->optionGetResizeinfoFontSize () * PANGO_SCALE); pango_font_description_set_style (font, PANGO_STYLE_NORMAL); if (is->optionGetResizeinfoFontBold ()) pango_font_description_set_weight (font, PANGO_WEIGHT_BOLD); else pango_font_description_set_weight (font, PANGO_WEIGHT_NORMAL); pango_layout_set_font_description (layout, font); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); pango_layout_set_text (layout, info, -1); pango_layout_get_pixel_size (layout, &w, &h); cairo_move_to (cr, RESIZE_POPUP_WIDTH / 2.0f - w / 2.0f, RESIZE_POPUP_HEIGHT / 2.0f - h / 2.0f); pango_layout_set_width (layout, RESIZE_POPUP_WIDTH * PANGO_SCALE); pango_cairo_update_layout (cr, layout); cairo_set_source_rgba (cr, *(color) / (float)0xffff, *(color + 1) / (float)0xffff, *(color + 2) / (float)0xffff, *(color + 3) / (float)0xffff); pango_cairo_show_layout (cr, layout); pango_font_description_free (font); g_object_unref (layout); } /* Draw the background. We draw this on a second layer so that we do not have to draw it each time we have to update. Granted we could use some cairo trickery for this... */ void InfoLayer::renderBackground () { cairo_pattern_t *pattern; float border = 7.5; float r, g, b, a; INFO_SCREEN (screen); if (!valid) return; cairo_set_line_width (cr, 1.0f); /* Clear */ cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* Setup Gradient */ pattern = cairo_pattern_create_linear (0, 0, RESIZE_POPUP_WIDTH, RESIZE_POPUP_HEIGHT); r = is->optionGetGradient1Red () / (float)0xffff; g = is->optionGetGradient1Green () / (float)0xffff; b = is->optionGetGradient1Blue () / (float)0xffff; a = is->optionGetGradient1Alpha () / (float)0xffff; cairo_pattern_add_color_stop_rgba (pattern, 0.00f, r, g, b, a); r = is->optionGetGradient2Red () / (float)0xffff; g = is->optionGetGradient2Green () / (float)0xffff; b = is->optionGetGradient2Blue () / (float)0xffff; a = is->optionGetGradient2Alpha () / (float)0xffff; cairo_pattern_add_color_stop_rgba (pattern, 0.65f, r, g, b, a); r = is->optionGetGradient3Red () / (float)0xffff; g = is->optionGetGradient3Green () / (float)0xffff; b = is->optionGetGradient3Blue () / (float)0xffff; a = is->optionGetGradient3Alpha () / (float)0xffff; cairo_pattern_add_color_stop_rgba (pattern, 0.85f, r, g, b, a); cairo_set_source (cr, pattern); /* Rounded Rectangle! */ cairo_arc (cr, border, border, border, PI, 1.5f * PI); cairo_arc (cr, border + RESIZE_POPUP_WIDTH - 2 * border, border, border, 1.5f * PI, 2.0 * PI); cairo_arc (cr, RESIZE_POPUP_WIDTH - border, RESIZE_POPUP_HEIGHT - border, border, 0, PI / 2.0f); cairo_arc (cr, border, RESIZE_POPUP_HEIGHT - border, border, PI / 2.0f, PI); cairo_close_path (cr); cairo_fill_preserve (cr); /* Outline */ r = is->optionGetOutlineColorRed () / (float)0xffff; g = is->optionGetOutlineColorGreen () / (float)0xffff; b = is->optionGetOutlineColorBlue () / (float)0xffff; a = is->optionGetOutlineColorAlpha () / (float)0xffff; cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); } static void backgroundColorChanged (CompOption *o, ResizeinfoOptions::Options num) { INFO_SCREEN (screen); is->backgroundLayer.renderBackground (); } void InfoScreen::damagePaintRegion () { if (!fadeTime && !drawing) return; int x = resizeGeometry.x + resizeGeometry.width / 2.0f - RESIZE_POPUP_WIDTH / 2.0f; int y = resizeGeometry.y + resizeGeometry.height / 2.0f - RESIZE_POPUP_HEIGHT / 2.0f; CompRegion reg (x - 5, y - 5, (RESIZE_POPUP_WIDTH + 5), (RESIZE_POPUP_HEIGHT + 5)); cScreen->damageRegion (reg); } /* Handle the fade in /fade out. */ void InfoScreen::preparePaint (int ms) { if (fadeTime) { fadeTime -= ms; if (fadeTime < 0) fadeTime = 0; } cScreen->preparePaint (ms); } void InfoScreen::donePaint () { if (pWindow) { if (fadeTime) damagePaintRegion (); if (!fadeTime && !drawing) { pWindow = NULL; cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } } cScreen->donePaint (); } void InfoWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { INFO_SCREEN (screen); if ((!is->pWindow || !is->drawing) && ((window->state () & MAXIMIZE_STATE) != MAXIMIZE_STATE)) { bool showInfo = (((window->sizeHints ().width_inc != 1) && (window->sizeHints ().height_inc != 1)) || is->optionGetAlwaysShow ()); if (showInfo && (mask & CompWindowGrabResizeMask)) { is->pWindow = window; is->drawing = true; is->fadeTime = is->optionGetFadeTime () - is->fadeTime; is->resizeGeometry.x = window->x (); is->resizeGeometry.y = window->y (); is->resizeGeometry.width = window->width (); is->resizeGeometry.height = window->height (); screen->handleEventSetEnabled (is, true); } } window->grabNotify (x, y, state, mask); } void InfoWindow::ungrabNotify () { INFO_SCREEN (screen); if (window == is->pWindow) { is->drawing = false; is->fadeTime = is->optionGetFadeTime () - is->fadeTime; is->cScreen->damageScreen (); screen->handleEventSetEnabled (is, false); window->ungrabNotifySetEnabled (this, false); } window->ungrabNotify (); } /* Draw a texture at x/y on a quad of RESIZE_POPUP_WIDTH / RESIZE_POPUP_HEIGHT with the opacity in InfoScreen. */ void InfoLayer::draw (const GLMatrix &transform, int x, int y) { BOX box; float opacity; INFO_SCREEN (screen); if (!valid) return; for (unsigned int i = 0; i < texture.size (); i++) { GLushort colorData[4]; GLfloat textureData[8]; GLfloat vertexData[12]; GLTexture *tex = texture[i]; GLTexture::Matrix matrix = tex->matrix (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); tex->enable (GLTexture::Good); matrix.x0 -= x * matrix.xx; matrix.y0 -= y * matrix.yy; box.x1 = x; box.x2 = x + RESIZE_POPUP_WIDTH; box.y1 = y; box.y2 = y + RESIZE_POPUP_HEIGHT; opacity = (float) is->fadeTime / is->optionGetFadeTime (); if (is->drawing) opacity = 1.0f - opacity; streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = opacity * 65535; colorData[1] = opacity * 65535; colorData[2] = opacity * 65535; colorData[3] = opacity * 65535; textureData[0] = COMP_TEX_COORD_X (matrix, box.x1); textureData[1] = COMP_TEX_COORD_Y (matrix, box.y2); textureData[2] = COMP_TEX_COORD_X (matrix, box.x2); textureData[3] = COMP_TEX_COORD_Y (matrix, box.y2); textureData[4] = COMP_TEX_COORD_X (matrix, box.x1); textureData[5] = COMP_TEX_COORD_Y (matrix, box.y1); textureData[6] = COMP_TEX_COORD_X (matrix, box.x2); textureData[7] = COMP_TEX_COORD_Y (matrix, box.y1); vertexData[0] = box.x1; vertexData[1] = box.y2; vertexData[2] = 0; vertexData[3] = box.x2; vertexData[4] = box.y2; vertexData[5] = 0; vertexData[6] = box.x1; vertexData[7] = box.y1; vertexData[8] = 0; vertexData[9] = box.x2; vertexData[10] = box.y1; vertexData[11] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); tex->disable (); } } bool InfoScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if ((drawing || fadeTime) && pWindow) { GLMatrix sTransform = transform; int x = resizeGeometry.x + resizeGeometry.width / 2.0f - RESIZE_POPUP_WIDTH / 2.0f; int y = resizeGeometry.y + resizeGeometry.height / 2.0f - RESIZE_POPUP_HEIGHT / 2.0f; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glEnable (GL_BLEND); #ifndef USE_GLES gScreen->setTexEnvMode (GL_MODULATE); #endif backgroundLayer.draw (sTransform, x, y); textLayer.draw (sTransform, x, y); gScreen->setTexEnvMode (GL_REPLACE); glDisable (GL_BLEND); } return status; } void InfoScreen::handleEvent (XEvent *event) { switch (event->type) { case ClientMessage: if (event->xclient.message_type == resizeInfoAtom) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w && w == pWindow) { resizeGeometry.x = event->xclient.data.l[0]; resizeGeometry.y = event->xclient.data.l[1]; resizeGeometry.width = event->xclient.data.l[2]; resizeGeometry.height = event->xclient.data.l[3]; textLayer.renderText (); cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); w->ungrabNotifySetEnabled (InfoWindow::get (w), true); damagePaintRegion (); } } break; default: break; } screen->handleEvent (event); } InfoScreen::InfoScreen (CompScreen *screen) : PluginClassHandler (screen), ResizeinfoOptions (), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)), resizeInfoAtom (XInternAtom (screen->dpy (), "_COMPIZ_RESIZE_NOTIFY", 0)), pWindow (0), drawing (false), fadeTime (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); memset (&resizeGeometry, 0, sizeof (resizeGeometry)); cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); screen->handleEventSetEnabled (this, false); backgroundLayer.renderBackground (); optionSetGradient1Notify (backgroundColorChanged); optionSetGradient2Notify (backgroundColorChanged); optionSetGradient3Notify (backgroundColorChanged); optionSetOutlineColorNotify (backgroundColorChanged); } InfoWindow::InfoWindow (CompWindow *window) : PluginClassHandler (window), window (window) { WindowInterface::setHandler (window); window->ungrabNotifySetEnabled (this, false); } bool InfoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/water/0000755000004100000410000000000013246301624014047 5ustar www-datawww-data./plugins/water/CMakeLists.txt0000644000004100000410000000015013246301623016602 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(water PLUGINDEPS composite opengl)./plugins/water/water.xml.in0000644000004100000410000000512113246301623016316 0ustar www-datawww-data <_short>Water Effect <_long>Adds water effects to different desktop actions Effects blur video decor opengl ./plugins/water/src/0000755000004100000410000000000013246301624014636 5ustar www-datawww-data./plugins/water/src/water.cpp0000644000004100000410000004704113246301623016471 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Frederic Plourde */ #include "water.h" #include COMPIZ_PLUGIN_20090315 (water, WaterPluginVTable) const unsigned int TEXTURE_SIZE = 256; const float K = 0.1964f; static int waterLastPointerX = 0; static int waterLastPointerY = 0; GLfloat WaterScreen::vertexData [18] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, }; GLfloat WaterScreen::textureData [12] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; bool WaterScreen::fboPrologue (int fIndex) { if (!useFbo) return false; oldFbo = waterFbo[fIndex]->bind (); glGetIntegerv(GL_VIEWPORT, &oldViewport[0]); glViewport (0, 0, texWidth, texHeight); return true; } void WaterScreen::fboEpilogue () { GLFramebufferObject::rebind (oldFbo); glViewport (oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3]); } void WaterScreen::waterUpdate (float dt) { GLfloat fade = 1.0f; if (count < 1000) { if (count > 1) fade = 0.90f + (float) count / 10000.0f; else fade = 0.0f; } if (!fboPrologue (INDEX (this, 1))) return; glEnable (GL_TEXTURE_2D); vertexBuffer[UPDATE]->begin (); vertexBuffer[UPDATE]->addVertices (6, &vertexData[0]); vertexBuffer[UPDATE]->addTexCoords (0, 6, &textureData[0]); vertexBuffer[UPDATE]->end (); /* * Cleanup: * Use GLTexture facilities here, instead of manually setting active * texture, especially when there will be texture unit support */ glActiveTexture (GL_TEXTURE0); waterFbo[INDEX (this, 2)]->tex ()->setFilter (GL_NEAREST); glBindTexture (GL_TEXTURE_2D, waterFbo[INDEX (this, 2)]->tex ()->name ()); glActiveTexture (GL_TEXTURE1); waterFbo[INDEX (this, 0)]->tex ()->setFilter (GL_NEAREST); glBindTexture (GL_TEXTURE_2D, waterFbo[INDEX (this, 0)]->tex ()->name ()); vertexBuffer[UPDATE]->addUniform ("prevTex", 0); vertexBuffer[UPDATE]->addUniform ("currTex", 1); vertexBuffer[UPDATE]->addUniform ("timeLapse", dt * K); vertexBuffer[UPDATE]->addUniform ("fade", fade); GLboolean isBlendingEnabled; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glDisable (GL_BLEND); vertexBuffer[UPDATE]->render (); if (isBlendingEnabled) glEnable (GL_BLEND); glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, 0); glActiveTexture (GL_TEXTURE1); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); fboEpilogue (); /* increment texture index */ fboIndex = INDEX (this, 1); } void WaterScreen::waterVertices (GLenum type, XPoint *p, int n, float v) { if (!fboPrologue (INDEX (this, 0))) return; glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); glLineWidth (1.0f); if (GL::vboEnabled && GL::shaders) { vertexBuffer[SET]->begin (type); float data[3]; for (int i = 0; i < n; i++) { data[0] = ((float) p->x / (float) screen->width ()) * 2.0f - 1.0f; data[1] = (((float) screen->height () - (float) p->y) / (float) screen->height ()) * 2.0f - 1.0f; data[2] = 0.0f; p++; vertexBuffer[SET]->addVertices (1, &data[0]); } vertexBuffer[SET]->end(); vertexBuffer[SET]->addUniform ("color", v); GLboolean isBlendingEnabled; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glDisable (GL_BLEND); vertexBuffer[SET]->render (); if (isBlendingEnabled) glEnable (GL_BLEND); } glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); fboEpilogue (); if (count <= 0) { cScreen->preparePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); gScreen->glPaintCompositedOutputSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); } if (count < 3000) count = 3000; } bool WaterScreen::rainTimeout () { XPoint p; p.x = (int) (screen->width () * (rand () / (float) RAND_MAX)); p.y = (int) (screen->height () * (rand () / (float) RAND_MAX)); waterVertices (GL_POINTS, &p, 1, 0.8f * (rand () / (float) RAND_MAX)); cScreen->damageScreen (); return true; } bool WaterScreen::wiperTimeout () { if (count) { if (wiperAngle == 0.0f) wiperSpeed = 2.5f; else if (wiperAngle == 180.0f) wiperSpeed = -2.5f; } return true; } void WaterScreen::waterSetup () { int size; std::string buffer; texHeight = TEXTURE_SIZE; texWidth = (texHeight * screen->width ()) / screen->height (); #ifdef USE_GLES target = GL_TEXTURE_2D; tx = ty = 1.0f; #else if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (texWidth) && POWER_OF_TWO (texHeight))) { target = GL_TEXTURE_2D; tx = ty = 1.0f; } else { target = GL_TEXTURE_RECTANGLE_NV; tx = texWidth; ty = texHeight; } #endif size = (texWidth + 2) * (texHeight + 2); data = calloc (1, (sizeof (float) * size * 2) + (sizeof (GLubyte) * texWidth * texHeight * 4)); if (!data) return; d0 = (float *)data; d1 = (d0 + (size)); t0 = (unsigned char *) (d1 + (size)); if (GL::vboEnabled && GL::shaders) { char buf[8192]; program[SET] = new GLProgram (set_water_vertices_vertex_shader, set_water_vertices_fragment_shader); if (target == GL_TEXTURE_2D) snprintf (buf, 8192, update_water_vertices_fragment_shader.c_str (), "2D", "2D", 1.0f / (float) texWidth, 1.0f / (float) texWidth, 1.0f / (float) texHeight, 1.0f / (float) texHeight, "2D", "2D", "2D", "2D"); else snprintf (buf, 8192, update_water_vertices_fragment_shader.c_str (), "RECT", "RECT", 1.0f, 1.0f, 1.0f, 1.0f, "RECT", "RECT", "RECT", "RECT"); buffer.assign (buf); program[UPDATE] = new GLProgram (update_water_vertices_vertex_shader, buffer); snprintf (buf, 8192, paint_water_vertices_fragment_shader.c_str (), screen->width (), screen->height ()); buffer.assign (buf); program[PAINT] = new GLProgram (paint_water_vertices_vertex_shader, buffer); vertexBuffer[SET] = new GLVertexBuffer (GL::DYNAMIC_DRAW); vertexBuffer[SET]->setProgram (program[SET]); vertexBuffer[UPDATE] = new GLVertexBuffer (GL::STATIC_DRAW); vertexBuffer[UPDATE]->setProgram (program[UPDATE]); vertexBuffer[PAINT] = new GLVertexBuffer (GL::STATIC_DRAW); vertexBuffer[PAINT]->setProgram (program[PAINT]); } if (GL::fboEnabled) { CompSize size(texWidth, texHeight); for (int i = 0; i < TEXTURE_NUM; i++) { waterFbo[i] = new GLFramebufferObject (); waterFbo[i]->allocate (size, (char *) t0, GL_BGRA, GL_UNSIGNED_BYTE); // check if FBOs are working. If not, fallback to software textures oldFbo = waterFbo[i]->bind (); waterFbo[i]->rebind (oldFbo); if (!waterFbo[i]->checkStatus ()) { useFbo = false; delete waterFbo[i]; break; } } } } bool WaterScreen::glPaintCompositedOutputRequired () { return true; } void WaterScreen::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) { if (count) { if (GL::vboEnabled && GL::shaders) { GLFramebufferObject::rebind (oldFbo); glViewport (oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3]); vertexBuffer[PAINT]->begin (); vertexBuffer[PAINT]->addVertices (6, &vertexData[0]); vertexBuffer[PAINT]->addTexCoords (0, 6, &textureData[0]); vertexBuffer[PAINT]->end (); glEnable (GL_TEXTURE_2D); glActiveTexture (GL_TEXTURE0); fbo->tex ()->setFilter (GL_LINEAR); glBindTexture (GL_TEXTURE_2D, fbo->tex ()->name ()); vertexBuffer[PAINT]->addUniform ("baseTex", 0); glActiveTexture (GL_TEXTURE1); waterFbo[INDEX (this, 0)]->tex ()->setFilter (GL_LINEAR); glBindTexture (GL_TEXTURE_2D, waterFbo[INDEX (this, 0)]->tex ()->name ()); vertexBuffer[PAINT]->addUniform ("waveTex", 1); vertexBuffer[PAINT]->addUniform3f ("lightVec", lightVec[0], lightVec[1], lightVec[2]); vertexBuffer[PAINT]->addUniform ("offsetScale", offsetScale); GLboolean isBlendingEnabled; glGetBooleanv (GL_BLEND, &isBlendingEnabled); glDisable (GL_BLEND); vertexBuffer[PAINT]->render (); if (isBlendingEnabled) glEnable (GL_BLEND); glBindTexture (GL_TEXTURE_2D, 0); glDisable (GL_TEXTURE_2D); } } } /* TODO: a way to control the speed */ void WaterScreen::preparePaint (int msSinceLastPaint) { if (count) { count -= 10; if (count < 0) count = 0; if (wiperTimer.active ()) { float step, angle0, angle1; bool wipe = false; XPoint p[3]; p[1].x = screen->width () / 2; p[1].y = screen->height (); step = wiperSpeed * msSinceLastPaint / 20.0f; if (wiperSpeed > 0.0f) { if (wiperAngle < 180.0f) { angle0 = wiperAngle; wiperAngle += step; wiperAngle = MIN (wiperAngle, 180.0f); angle1 = wiperAngle; wipe = true; } } else { if (wiperAngle > 0.0f) { angle1 = wiperAngle; wiperAngle += step; wiperAngle = MAX (wiperAngle, 0.0f); angle0 = wiperAngle; wipe = true; } } #define TAN(a) (tanf ((a) * (M_PI / 180.0f))) if (wipe) { if (angle0 > 0.0f) { p[2].x = screen->width () / 2 - screen->height () / TAN (angle0); p[2].y = 0; } else { p[2].x = 0; p[2].y = screen->height (); } if (angle1 < 180.0f) { p[0].x = screen->width () / 2 - screen->height () / TAN (angle1); p[0].y = 0; } else { p[0].x = screen->width (); p[0].y = screen->height (); } waterVertices (GL_TRIANGLES, p, 3, 0.0f); } #undef TAN } waterUpdate (0.8f); } cScreen->preparePaint (msSinceLastPaint); } void WaterScreen::donePaint () { if (count) cScreen->damageScreen (); else { cScreen->preparePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); gScreen->glPaintCompositedOutputSetEnabled (this, false); gScreen->glPaintCompositedOutputRequiredSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); } cScreen->donePaint (); } void WaterScreen::handleMotionEvent () { if (grabIndex) { XPoint p[2]; p[0].x = waterLastPointerX; p[0].y = waterLastPointerY; p[1].x = waterLastPointerX = pointerX; p[1].y = waterLastPointerY = pointerY; waterVertices (GL_LINES, p, 2, 0.2f); cScreen->damageScreen (); } } static bool waterInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { unsigned int ui; Window root, child; int xRoot, yRoot, i; WATER_SCREEN (screen); if (!screen->otherGrabExist ("water", NULL)) { if (!ws->grabIndex) { ws->grabIndex = screen->pushGrab (None, "water"); screen->handleEventSetEnabled (ws, true); } if (XQueryPointer (screen->dpy (), screen->root (), &root, &child, &xRoot, &yRoot, &i, &i, &ui)) { XPoint p; p.x = waterLastPointerX = xRoot; p.y = waterLastPointerY = yRoot; ws->waterVertices (GL_POINTS, &p, 1, 1.0f); ws->cScreen->damageScreen (); } } if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); return false; } static bool waterTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { WATER_SCREEN (screen); if (ws->grabIndex) { screen->removeGrab (ws->grabIndex, 0); ws->grabIndex = 0; screen->handleEventSetEnabled (ws, false); } return false; } static bool waterToggleRain (CompAction *action, CompAction::State state, CompOption::Vector &options) { /* Remember StateCancel and StateCommit will be broadcast to all actions so we need to verify that we are actually being toggled... */ if (!(state & CompAction::StateTermKey)) return false; /* And only respond to key taps */ if (!(state & CompAction::StateTermTapped)) return false; WATER_SCREEN (screen); if (!ws->rainTimer.active ()) { int delay; delay = ws->optionGetRainDelay (); ws->rainTimer.start (delay, (float) delay * 1.2); } else { ws->rainTimer.stop (); } return false; } static bool waterToggleWiper (CompAction *action, CompAction::State state, CompOption::Vector &options) { WATER_SCREEN (screen); if (!ws->wiperTimer.active ()) { ws->wiperTimer.start (2000, 2400); } else { ws->wiperTimer.stop (); } return false; } static bool waterTitleWave (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; int xid; WATER_SCREEN (screen); xid = CompOption::getIntOptionNamed (options, "window", screen->activeWindow ()); w = screen->findWindow (xid); if (w) { const CompWindow::Geometry &g = w->geometry (); XPoint p[2]; p[0].x = g.x () - w->border ().left; p[0].y = g.y () - w->border ().top / 2; p[1].x = g.x () + g.width () + w->border ().right; p[1].y = p[0].y; ws->waterVertices (GL_LINES, p, 2, 0.15f); ws->cScreen->damageScreen (); } return false; } static bool waterPoint (CompAction *action, CompAction::State state, CompOption::Vector &options) { XPoint p; float amp; WATER_SCREEN (screen); p.x = CompOption::getIntOptionNamed (options, "x", screen->width () / 2); p.y = CompOption::getIntOptionNamed (options, "y", screen->height () / 2); amp = CompOption::getFloatOptionNamed (options, "amplitude", 0.5f); ws->waterVertices (GL_POINTS, &p, 1, amp); ws->cScreen->damageScreen (); return false; } static bool waterLine (CompAction *action, CompAction::State state, CompOption::Vector &options) { XPoint p[2]; float amp; WATER_SCREEN (screen); p[0].x = CompOption::getIntOptionNamed (options, "x0", screen->width () / 4); p[0].y = CompOption::getIntOptionNamed (options, "y0", screen->height () / 2); p[1].x = CompOption::getIntOptionNamed (options, "x1", screen->width () - screen->width () / 4); p[1].y = CompOption::getIntOptionNamed (options, "y1", screen->height () / 2); amp = CompOption::getFloatOptionNamed (options, "amplitude", 0.25f); ws->waterVertices (GL_LINES, p, 2, amp); ws->cScreen->damageScreen (); return false; } void WaterScreen::handleEvent (XEvent *event) { switch (event->type) { case ButtonPress: if (event->xbutton.root == screen->root () && grabIndex) { XPoint p; p.x = pointerX; p.y = pointerY; waterVertices (GL_POINTS, &p, 1, 0.8f); cScreen->damageScreen (); } break; case EnterNotify: case LeaveNotify: if (event->xcrossing.root == screen->root () && grabIndex) handleMotionEvent (); break; case MotionNotify: if (event->xmotion.root == screen->root () && grabIndex) handleMotionEvent (); default: break; } screen->handleEvent (event); } void WaterScreen::optionChange (WaterOptions::Options num) { switch (num) { case WaterOptions::OffsetScale: offsetScale = optionGetOffsetScale () * 10.0f; break; case WaterOptions::RainDelay: if (rainTimer.active ()) { rainTimer.setTimes (optionGetRainDelay (), (float)optionGetRainDelay () * 1.2); } break; case WaterOptions::LightVecX: lightVec[0] = optionGetLightVecX(); break; case WaterOptions::LightVecY: lightVec[1] = optionGetLightVecY(); break; case WaterOptions::LightVecZ: lightVec[2] = optionGetLightVecZ(); break; default: break; } } WaterScreen::WaterScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), grabIndex (0), oldFbo (NULL), fboIndex (0), useFbo (true), texWidth (0), texHeight (0), target (0), tx (0), ty (0), count (0), data (NULL), d0 (NULL), d1 (NULL), t0 (NULL), wiperAngle (0), wiperSpeed (0), lightVec(GLVector(optionGetLightVecX(), optionGetLightVecY(), optionGetLightVecZ())) { offsetScale = optionGetOffsetScale () * 10.0f; wiperTimer.setCallback (boost::bind (&WaterScreen::wiperTimeout, this)); rainTimer.setCallback (boost::bind (&WaterScreen::rainTimeout, this)); waterSetup (); optionSetOffsetScaleNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetRainDelayNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetLightVecXNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetLightVecYNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetLightVecZNotify (boost::bind (&WaterScreen::optionChange, this, _2)); optionSetInitiateKeyInitiate (waterInitiate); optionSetInitiateKeyTerminate (waterTerminate); optionSetToggleRainKeyTerminate (waterToggleRain); optionSetToggleWiperKeyInitiate (waterToggleWiper); optionSetTitleWaveInitiate (waterTitleWave); optionSetPointInitiate (waterPoint); optionSetLineInitiate (waterLine); ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); } WaterScreen::~WaterScreen () { if (program[SET]) delete program[SET]; if (program[UPDATE]) delete program[UPDATE]; if (program[PAINT]) delete program[PAINT]; for (int i = 0; i < TEXTURE_NUM; i++) { if (waterFbo[i]) delete waterFbo[i]; } if (data) free (data); } bool WaterPluginVTable::init () { const char *missing = NULL; if (!GL::fboSupported) missing = "framebuffer objects"; if (!GL::vboSupported) missing = "vertexbuffer objects"; if (!GL::shaders) missing = "GLSL"; if (missing) { compLogMessage ("water", CompLogLevelError, "Missing hardware support for %s", missing); return false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/water/src/water.h0000644000004100000410000000646413246301623016142 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman * Frederic Plourde */ #include "water_options.h" #include #include #include #include #include #include "shaders.h" #define WATER_SCREEN(s) \ WaterScreen *ws = WaterScreen::get (s) extern const unsigned int TEXTURE_SIZE; extern const float K; #define TEXTURE_NUM 3 #define PROG_NUM 3 #define INDEX(ws, i) (((ws)->fboIndex + (i)) % TEXTURE_NUM) enum programTypes { SET, UPDATE, PAINT}; class WaterScreen : public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public WaterOptions { public: WaterScreen (CompScreen *screen); ~WaterScreen (); void optionChange (WaterOptions::Options num); void handleEvent (XEvent *); bool glPaintCompositedOutputRequired (); void glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask); void preparePaint (int); void donePaint (); bool fboPrologue (int fboIndex); void fboEpilogue (); bool fboUpdate (float dt, float fade); void waterUpdate (float dt); void waterVertices (GLenum type, XPoint *p, int n, float v); bool rainTimeout (); bool wiperTimeout (); void waterSetup (); void handleMotionEvent (); CompositeScreen *cScreen; GLScreen *gScreen; float offsetScale; CompScreen::GrabHandle grabIndex; GLProgram *program[PROG_NUM]; GLVertexBuffer *vertexBuffer[PROG_NUM]; static GLfloat vertexData[18]; static GLfloat textureData[12]; GLFramebufferObject *waterFbo[TEXTURE_NUM]; GLFramebufferObject *oldFbo; GLint oldViewport[4]; int fboIndex; bool useFbo; int texWidth, texHeight; GLenum target; GLfloat tx, ty; int count; void *data; float *d0; float *d1; unsigned char *t0; CompTimer rainTimer; CompTimer wiperTimer; float wiperAngle; float wiperSpeed; GLVector lightVec; }; class WaterPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/water/src/shaders.h0000644000004100000410000003150513246301623016443 0ustar www-datawww-data/* * Copyright © 2011 Collabora Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Collabora Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Collabora Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * COLLABORA LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL LINARO LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Frederic Plourde */ #ifndef _COMPIZ_WATERSHADERS_H #define _COMPIZ_WATERSHADERS_H // This vertex shader is used to set water vertices ... static std::string set_water_vertices_vertex_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ attribute vec3 position; \n\ \n\ void main () \n\ { \n\ gl_PointSize = 3.0; \n\ gl_Position = vec4(position, 1.0); \n\ \n\ }"; // This fragment shader is used to draw water primitives ... // we're only setting the height here, so we only care about the .w coord. static std::string set_water_vertices_fragment_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ uniform float color; \n\ \n\ void main () \n\ { \n\ gl_FragColor = vec4(0.0, 0.0, 0.0, color); \n\ }"; // This vertex shader is used to update water vertices... static std::string update_water_vertices_vertex_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ attribute vec3 position; \n\ attribute vec2 texCoord0; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ void main () \n\ { \n\ vTexCoord0 = texCoord0; \n\ gl_Position = vec4(position, 1.0); \n\ \n\ }"; // This fragment shader is used to compute new normal + height of water vertices. // here we're using two input textures, previous and current. static std::string update_water_vertices_fragment_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ uniform sampler2D prevTex; \n\ uniform sampler2D currTex; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ uniform float timeLapse; \n\ uniform float fade; \n\ \n\ void main () \n\ { \n\ vec2 t01, t21, t10, t12; \n\ vec4 c01, c21, c10, c12; \n\ vec4 curr, prev, v; \n\ float accel; \n\ \n\ // fetch current and previous normals \n\ prev = texture%s (prevTex, vTexCoord0); \n\ curr = texture%s (currTex, vTexCoord0); \n\ \n\ // sample offsets \n\ t01 = vTexCoord0 + vec2 (- %f, 0.0); \n\ t21 = vTexCoord0 + vec2 ( %f, 0.0); \n\ t10 = vTexCoord0 + vec2 ( 0.0,- %f); \n\ t12 = vTexCoord0 + vec2 ( 0.0, %f); \n\ \n\ // fetch necessary samples \n\ c01 = texture%s (currTex, t01); \n\ c21 = texture%s (currTex, t21); \n\ c10 = texture%s (currTex, t10); \n\ c12 = texture%s (currTex, t12); \n\ \n\ // x/y normals from height \n\ v = vec4 (0.0, 0.0, 0.75, 0.0); \n\ v.x = c01.w - c21.w; \n\ v.y = c12.w - c10.w; \n\ \n\ // bumpiness \n\ v = normalize (v); \n\ \n\ // add scale and bias \n\ v = (v * 0.5) + 0.5; \n\ \n\ // done with computing the normal, continue with computing \n\ // the next height value \n\ accel = (curr.w * -4.0) + (c10.w + c12.w + c01.w + c21.w); \n\ \n\ // store new height in alpha component \n\ v.w = (accel * timeLapse) + ((curr.w * 2.0) - prev.w); \n\ \n\ // fade out height \n\ v.w *= fade; \n\ \n\ gl_FragColor = v; \n\ }"; // This vertex shader is used when painting our bump map FX over // final composited screen FBO static std::string paint_water_vertices_vertex_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ attribute vec3 position; \n\ attribute vec2 texCoord0; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ void main () \n\ { \n\ vTexCoord0 = texCoord0; \n\ gl_Position = vec4(position, 1.0); \n\ \n\ }"; // This fragment shader is used to produce our dot3 bump mapping output, // blended over final composited glScreen FBO. // here we're using two input textures : // 1) The final composited FBO color attachment over which we're // applying our bump map FX (baseTex) // 2) The updated bump map (waveTex) static std::string paint_water_vertices_fragment_shader = " \n\ #ifdef GL_ES \n\ precision mediump float; \n\ #endif \n\ \n\ uniform sampler2D baseTex; \n\ uniform sampler2D waveTex; \n\ \n\ varying vec2 vTexCoord0; \n\ \n\ uniform vec3 lightVec; \n\ uniform float offsetScale; \n\ \n\ void main () \n\ { \n\ vec4 normal = texture2D (waveTex, vTexCoord0); \n\ float height = normal.w; \n\ vec2 offset; \n\ \n\ normal = normalize ((normal * 2.0) - 1.0); \n\ \n\ offset.x = normal.x * height * offsetScale/%d.0; \n\ offset.y = normal.y * height * offsetScale/%d.0; \n\ vec4 baseColor = texture2D (baseTex, vTexCoord0 + offset); \n\ \n\ float diffFact = dot (-normal.xyz, lightVec.xyz); \n\ gl_FragColor = vec4 (vec3 (baseColor) + diffFact, 1.0); \n\ }"; #endif // _COMPIZ_WATERSHADERS_H ./plugins/showmouse/0000755000004100000410000000000013246301624014756 5ustar www-datawww-data./plugins/showmouse/CMakeLists.txt0000644000004100000410000000017013246301623017513 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (showmouse PLUGINDEPS composite opengl mousepoll) ./plugins/showmouse/src/0000755000004100000410000000000013246301624015545 5ustar www-datawww-data./plugins/showmouse/src/showmouse.cpp0000644000004100000410000004173313246301623020311 0ustar www-datawww-data/* * * Compiz show mouse pointer plugin * * showmouse.cpp * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smpillaz@gmail.com * * Copyright (C) 2016 by Hypra * E-mail contact@hypra.fr * Added mouse guides. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "showmouse.h" COMPIZ_PLUGIN_20090315 (showmouse, ShowmousePluginVTable); /* 3 vertices per triangle, 2 triangles per particle */ const unsigned short CACHESIZE_FACTOR = 3 * 2; /* 2 coordinates, x and y */ const unsigned short COORD_COMPONENTS = CACHESIZE_FACTOR * 2; /* each vertex is stored as 3 GLfloats */ const unsigned short VERTEX_COMPONENTS = CACHESIZE_FACTOR * 3; /* 4 colors, RGBA */ const unsigned short COLOR_COMPONENTS = CACHESIZE_FACTOR * 4; Particle::Particle () : life (0), fade (0), width (0), height (0), w_mod (0), h_mod (0), r (0), g (0), b (0), a (0), x (0), y (0), z (0), xi (0), yi (0), zi (0), xg (0), yg (0), zg (0), xo (0), yo (0), zo (0) { } ParticleSystem::ParticleSystem (int n) : x (0), y (0) { initParticles (n); } ParticleSystem::ParticleSystem () : x (0), y (0) { initParticles (0); } ParticleSystem::~ParticleSystem () { finiParticles (); } void ParticleSystem::initParticles (int f_numParticles) { particles.clear (); tex = 0; slowdown = 1; active = false; darken = 0; // Initialize cache vertices_cache.clear (); coords_cache.clear (); colors_cache.clear (); dcolors_cache.clear (); for (int i = 0; i < f_numParticles; i++) { Particle p; p.life = 0.0f; particles.push_back (p); } } void ParticleSystem::drawParticles (const GLMatrix &transform) { int i, j, k, l; /* Check that the cache is big enough */ if (vertices_cache.size () < particles.size () * VERTEX_COMPONENTS) vertices_cache.resize (particles.size () * VERTEX_COMPONENTS); if (coords_cache.size () < particles.size () * COORD_COMPONENTS) coords_cache.resize (particles.size () * COORD_COMPONENTS); if (colors_cache.size () < particles.size () * COLOR_COMPONENTS) colors_cache.resize (particles.size () * COLOR_COMPONENTS); if (darken > 0) if (dcolors_cache.size () < particles.size () * COLOR_COMPONENTS) dcolors_cache.resize (particles.size () * COLOR_COMPONENTS); glEnable (GL_BLEND); if (tex) glBindTexture (GL_TEXTURE_2D, tex); i = j = k = l = 0; /* use 2 triangles per particle */ foreach (Particle &part, particles) { if (part.life > 0.0f) { float w = part.width / 2; float h = part.height / 2; GLushort r, g, b, a, dark_a; r = part.r * 65535.0f; g = part.g * 65535.0f; b = part.b * 65535.0f; a = part.life * part.a * 65535.0f; dark_a = part.life * part.a * darken * 65535.0f; w += (w * part.w_mod) * part.life; h += (h * part.h_mod) * part.life; //first triangle vertices_cache[i + 0] = part.x - w; vertices_cache[i + 1] = part.y - h; vertices_cache[i + 2] = part.z; vertices_cache[i + 3] = part.x - w; vertices_cache[i + 4] = part.y + h; vertices_cache[i + 5] = part.z; vertices_cache[i + 6] = part.x + w; vertices_cache[i + 7] = part.y + h; vertices_cache[i + 8] = part.z; //second triangle vertices_cache[i + 9] = part.x + w; vertices_cache[i + 10] = part.y + h; vertices_cache[i + 11] = part.z; vertices_cache[i + 12] = part.x + w; vertices_cache[i + 13] = part.y - h; vertices_cache[i + 14] = part.z; vertices_cache[i + 15] = part.x - w; vertices_cache[i + 16] = part.y - h; vertices_cache[i + 17] = part.z; i += 18; coords_cache[j + 0] = 0.0; coords_cache[j + 1] = 0.0; coords_cache[j + 2] = 0.0; coords_cache[j + 3] = 1.0; coords_cache[j + 4] = 1.0; coords_cache[j + 5] = 1.0; //second coords_cache[j + 6] = 1.0; coords_cache[j + 7] = 1.0; coords_cache[j + 8] = 1.0; coords_cache[j + 9] = 0.0; coords_cache[j + 10] = 0.0; coords_cache[j + 11] = 0.0; j += 12; colors_cache[k + 0] = r; colors_cache[k + 1] = g; colors_cache[k + 2] = b; colors_cache[k + 3] = a; colors_cache[k + 4] = r; colors_cache[k + 5] = g; colors_cache[k + 6] = b; colors_cache[k + 7] = a; colors_cache[k + 8] = r; colors_cache[k + 9] = g; colors_cache[k + 10] = b; colors_cache[k + 11] = a; //second colors_cache[k + 12] = r; colors_cache[k + 13] = g; colors_cache[k + 14] = b; colors_cache[k + 15] = a; colors_cache[k + 16] = r; colors_cache[k + 17] = g; colors_cache[k + 18] = b; colors_cache[k + 19] = a; colors_cache[k + 20] = r; colors_cache[k + 21] = g; colors_cache[k + 22] = b; colors_cache[k + 23] = a; k += 24; if(darken > 0) { dcolors_cache[l + 0] = r; dcolors_cache[l + 1] = g; dcolors_cache[l + 2] = b; dcolors_cache[l + 3] = dark_a; dcolors_cache[l + 4] = r; dcolors_cache[l + 5] = g; dcolors_cache[l + 6] = b; dcolors_cache[l + 7] = dark_a; dcolors_cache[l + 8] = r; dcolors_cache[l + 9] = g; dcolors_cache[l + 10] = b; dcolors_cache[l + 11] = dark_a; //second dcolors_cache[l + 12] = r; dcolors_cache[l + 13] = g; dcolors_cache[l + 14] = b; dcolors_cache[l + 15] = dark_a; dcolors_cache[l + 16] = r; dcolors_cache[l + 17] = g; dcolors_cache[l + 18] = b; dcolors_cache[l + 19] = dark_a; dcolors_cache[l + 20] = r; dcolors_cache[l + 21] = g; dcolors_cache[l + 22] = b; dcolors_cache[l + 23] = dark_a; l += 24; } } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); if (darken > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (l / 4, &dcolors_cache[0]); if (stream->end ()) stream->render (transform); } // draw particles glBlendFunc (GL_SRC_ALPHA, blendMode); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (k / 4, &colors_cache[0]); if (stream->end ()) stream->render (transform); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_BLEND); } void ParticleSystem::updateParticles (float time) { float speed = (time / 50.0); float f_slowdown = slowdown * (1 - MAX (0.99, time / 1000.0) ) * 1000; active = false; foreach (Particle &part, particles) { if (part.life > 0.0f) { // move particle part.x += part.xi / f_slowdown; part.y += part.yi / f_slowdown; part.z += part.zi / f_slowdown; // modify speed part.xi += part.xg * speed; part.yi += part.yg * speed; part.zi += part.zg * speed; // modify life part.life -= part.fade * speed; active = true; } } } void ParticleSystem::finiParticles () { particles.clear (); if (tex) glDeleteTextures (1, &tex); } static void toggleFunctions (bool enabled) { SHOWMOUSE_SCREEN (screen); ss->cScreen->preparePaintSetEnabled (ss, enabled); ss->gScreen->glPaintOutputSetEnabled (ss, enabled); ss->cScreen->donePaintSetEnabled (ss, enabled); } void ShowmouseScreen::genNewParticles (int f_time) { unsigned int nE = optionGetEmitters (); if (nE == 0) { ps.active = true; // Don't stop drawing: we may have guides. return; } bool rColor = optionGetRandom (); float life = optionGetLife (); float lifeNeg = 1 - life; float fadeExtra = 0.2f * (1.01 - life); float max_new = ps.particles.size () * ((float)f_time / 50) * (1.05 - life); unsigned short *c = optionGetColor (); float colr1 = (float)c[0] / 0xffff; float colg1 = (float)c[1] / 0xffff; float colb1 = (float)c[2] / 0xffff; float colr2 = 1.0 / 4.0 * (float)c[0] / 0xffff; float colg2 = 1.0 / 4.0 * (float)c[1] / 0xffff; float colb2 = 1.0 / 4.0 * (float)c[2] / 0xffff; float cola = (float)c[3] / 0xffff; float rVal; float partw = optionGetSize () * 5; float parth = partw; unsigned int i, j; float pos[10][2]; float rA = (2 * M_PI) / nE; int radius = optionGetRadius (); for (i = 0; i < nE; i++) { pos[i][0] = sin (rot + (i * rA)) * radius; pos[i][0] += mousePos.x (); pos[i][1] = cos (rot + (i * rA)) * radius; pos[i][1] += mousePos.y (); } for (i = 0; i < ps.particles.size () && max_new > 0; i++) { Particle &part = ps.particles.at (i); if (part.life <= 0.0f) { // give gt new life rVal = (float)(random() & 0xff) / 255.0; part.life = 1.0f; part.fade = rVal * lifeNeg + fadeExtra; // Random Fade Value // set size part.width = partw; part.height = parth; part.w_mod = part.h_mod = -1; // choose random position j = random() % nE; part.x = pos[j][0]; part.y = pos[j][1]; part.z = 0.0; part.xo = part.x; part.yo = part.y; part.zo = part.z; // set speed and direction rVal = (float)(random() & 0xff) / 255.0; part.xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random() & 0xff) / 255.0; part.yi = ((rVal * 20.0) - 10.0f); part.zi = 0.0f; if (rColor) { // Random colors! (aka Mystical Fire) rVal = (float)(random() & 0xff) / 255.0; part.r = rVal; rVal = (float)(random() & 0xff) / 255.0; part.g = rVal; rVal = (float)(random() & 0xff) / 255.0; part.b = rVal; } else { rVal = (float)(random() & 0xff) / 255.0; part.r = colr1 - rVal * colr2; part.g = colg1 - rVal * colg2; part.b = colb1 - rVal * colb2; } // set transparency part.a = cola; // set gravity part.xg = 0.0f; part.yg = 0.0f; part.zg = 0.0f; ps.active = true; max_new -= 1; } } } void ShowmouseScreen::doDamageRegion () { float w, h; float x1 = screen->width (); float x2 = 0; float y1 = screen->height (); float y2 = 0; foreach (Particle &p, ps.particles) { w = p.width / 2; h = p.height / 2; w += (w * p.w_mod) * p.life; h += (h * p.h_mod) * p.life; x1 = MIN (x1, p.x - w); x2 = MAX (x2, p.x + w); y1 = MIN (y1, p.y - h); y2 = MAX (y2, p.y + h); } CompRegion r (floor (x1), floor (y1), (ceil (x2) - floor (x1)), (ceil (y2) - floor (y1))); cScreen->damageRegion (r); } void ShowmouseScreen::positionUpdate (const CompPoint &p) { mousePos = p; } void ShowmouseScreen::preparePaint (int f_time) { if (active && !pollHandle.active ()) { mousePos = MousePoller::getCurrentPosition (); pollHandle.start (); } if (active && !ps.active) { ps.initParticles (optionGetNumParticles ()); ps.slowdown = optionGetSlowdown (); ps.darken = optionGetDarken (); ps.blendMode = (optionGetBlend()) ? GL_ONE : GL_ONE_MINUS_SRC_ALPHA; ps.active = true; glGenTextures(1, &ps.tex); glBindTexture(GL_TEXTURE_2D, ps.tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, starTex); glBindTexture(GL_TEXTURE_2D, 0); } rot = fmod (rot + (((float)f_time / 1000.0) * 2 * M_PI * optionGetRotationSpeed ()), 2 * M_PI); if (ps.active) { ps.updateParticles (f_time); doDamageRegion (); } if (active) genNewParticles (f_time); cScreen->preparePaint (f_time); } void ShowmouseScreen::donePaint () { if (active || (ps.active)) doDamageRegion (); if (!active && pollHandle.active ()) pollHandle.stop (); if (!active && !ps.active) { ps.finiParticles (); toggleFunctions (false); } cScreen->donePaint (); } bool ShowmouseScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix sTransform = transform; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (!ps.active) return status; //sTransform.reset (); sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); drawGuides (sTransform); if (optionGetEmitters () > 0) ps.drawParticles (sTransform); return status; } void ShowmouseScreen::drawLine (const GLMatrix &transform, double x1, double y1, double x2, double y2, unsigned short *color) { GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); GLfloat vertices[6] = {GLfloat(x1), GLfloat(y1), GLfloat(0), GLfloat(x2), GLfloat(y2), GLfloat(0)}; stream->begin (GL_LINES); stream->addColors (1, color); stream->addVertices (2, vertices); if (stream->end ()) stream->render (transform); } void ShowmouseScreen::drawGuides (const GLMatrix &transform) { unsigned short *color = optionGetGuideColor (); float x = mousePos.x (); float y = mousePos.y (); float thickness = optionGetGuideThickness (); float r = optionGetGuideEmptyRadius (); // If the thickness is zero we don't have to draw, but we should // still mark the region where the guides should be as damaged -- // this is useful when thickness has just been changed. if (thickness > 0) { glLineWidth (thickness); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_BLEND); drawLine (transform, x, 0, x, y - r, color); drawLine (transform, x, y + r, x, screen->height (), color); drawLine (transform, 0, y, x - r, y, color); drawLine (transform, x + r, y, screen->width (), y, color); glDisable (GL_BLEND); } // This has to be manually synchronized with the maximum value in // showmouse.xml.in. The code generated from the XML file keeps // the value private. thickness = 20; cScreen->damageRegion (CompRegion(0, y - thickness / 2 - 1, screen->width (), thickness + 1)); cScreen->damageRegion (CompRegion(x - thickness / 2 - 1, 0, thickness + 1, screen->height ())); } bool ShowmouseScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { active = false; doDamageRegion (); gScreen->glPaintOutputSetEnabled (gScreen, false); return true; } bool ShowmouseScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (active) return terminate (action, state, options); active = true; toggleFunctions (true); gScreen->glPaintOutputSetEnabled (gScreen, true); return true; } void ShowmouseScreen::startupToggle () { if (optionGetActivateAtStartup ()) { active = true; toggleFunctions (true); gScreen->glPaintOutputSetEnabled (gScreen, true); } } ShowmouseScreen::ShowmouseScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), active (false), rot (0.0f) { CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); pollHandle.setCallback (boost::bind (&ShowmouseScreen::positionUpdate, this, _1)); optionSetInitiateInitiate (boost::bind (&ShowmouseScreen::initiate, this, _1, _2, _3)); optionSetInitiateTerminate (boost::bind (&ShowmouseScreen::terminate, this, _1, _2, _3)); optionSetInitiateButtonInitiate (boost::bind (&ShowmouseScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&ShowmouseScreen::terminate, this, _1, _2, _3)); optionSetInitiateEdgeInitiate (boost::bind (&ShowmouseScreen::initiate, this, _1, _2, _3)); optionSetInitiateEdgeTerminate (boost::bind (&ShowmouseScreen::terminate, this, _1, _2, _3)); optionSetActivateAtStartupNotify (boost::bind (&ShowmouseScreen::startupToggle, this)); } ShowmouseScreen::~ShowmouseScreen () { ps.finiParticles (); if (pollHandle.active ()) pollHandle.stop (); } bool ShowmousePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("mousepoll", COMPIZ_MOUSEPOLL_ABI)) return true; return false; } ./plugins/showmouse/src/showmouse_tex.h0000644000004100000410000003661013246301623020634 0ustar www-datawww-data/* * * Compiz show mouse star texture plugin * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ static const unsigned char starTex[4097] = { "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\360\360\360\0\15" "\15\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\16\0\336\336\336\0" "\311\311\311\1\377\377\377\2\377\377\377\3\377\377\377\3\377\377\377\2\361" "\361\361\1\267\267\267\0\17\17\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0~~~\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\361\361\361\0\25\25" "\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!!!\0\371\371\371\1\377\377" "\377\4\367\367\367\11\370\370\370\13\371\371\371\14\370\370\370\12\374\374" "\374\6\377\377\377\2""777\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\207\207\207\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\376\376\376\0\177" "\177\177\0\35\35\35\0\35\35\35\0\35\35\35\0\35\35\35\0\34\34\34\0~~~\1\360" "\360\360\4\361\361\361\13\354\354\354\26\352\352\352\35\353\353\353\37\352" "\352\352\31\357\357\357\16\354\354\354\6\332\332\332\1(((\0\35\35\35\0\35" "\35\35\0\35\35\35\0\32\32\32\0\27\27\27\0\352\352\352\0\377\377\377\0\377" "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\274\274\274\0ooo\0\207\207\207\0\221\221" "\221\0\221\221\221\0\216\216\216\0\330\330\330\2\340\340\340\11\345\345\345" "\26\355\355\355(\357\357\3575\360\360\3608\355\355\355-\350\350\350\33\337" "\337\337\15\353\353\353\3\263\263\263\0\221\221\221\0\221\221\221\0\220\220" "\220\0mmm\0\200\200\200\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\247\247\247\0ttt\0\242\242\242\0QQQ\0QQQ\0\220\220\220\0" "\352\352\352\4\354\354\354\17\353\353\353$\360\360\360B\362\362\362U\362" "\362\362Y\361\361\361I\354\354\354+\350\350\350\26\360\360\360\5\263\263" "\263\2RRR\0QQQ\0```\0\207\207\207\0\202\202\202\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\246\246\246\0\212\212\212\0\304" "\304\304\0rrr\0rrr\0\232\232\232\1\361\361\361\7\353\353\353\27\362\362\362" "2\362\362\362X\364\364\364r\366\366\366w\363\363\363b\361\361\361<\353\353" "\353\37\361\361\361\11\304\304\304\2rrr\0rrr\0\201\201\201\0\240\240\240" "\0\201\201\201\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\0\246\246\246\0}}}\0\377\377\377\0\377\377\377\0\377\377\377\0\377" "\377\377\1\361\361\361\12\355\355\355\40\363\363\363B\366\366\366p\366\366" "\366\217\366\366\366\226\367\367\367{\363\363\363O\357\357\357*\351\351\351" "\16\377\377\377\4\377\377\377\0\377\377\377\0\377\377\377\0\247\247\247\0" "~~~\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\243\243\243\0xxx\0\377\377\377\0\377\377\377\0\375\375\375\0\345\345\345" "\4\347\347\347\17\360\360\360)\364\364\364Q\370\370\370\204\371\371\371\243" "\371\371\371\253\370\370\370\217\365\365\365_\361\361\3616\354\354\354\23" "\351\351\351\7\372\372\372\0\376\376\376\0\377\377\377\0\242\242\242\0xx" "x\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\376\376\376\0\274" "\274\274\1\244\244\244\1\377\377\377\1\375\375\375\1\343\343\343\2\341\341" "\341\7\355\355\355\25\361\361\3616\365\365\365b\371\371\371\231\372\372\372" "\270\373\373\373\300\372\372\372\244\366\366\366q\363\363\363D\354\354\354" "\34\355\355\355\13\307\307\307\2\364\364\364\1\377\377\377\1\300\300\300" "\1\243\243\243\1\373\373\373\0\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0\371\371\371\0\337\337\337\2\367\367\367\3\364" "\364\364\4\343\343\343\5\370\370\370\6\372\372\372\6\354\354\354\6\341\341" "\341\10\347\347\347\16\354\354\354!\363\363\363E\367\367\367s\373\373\373" "\252\373\373\373\310\374\374\374\317\373\373\373\265\371\371\371\203\364" "\364\364T\356\356\356(\350\350\350\24\336\336\336\10\353\353\353\7\371\371" "\371\6\370\370\370\6\353\353\353\5\350\350\350\5\375\375\375\3\352\352\352" "\2\374\374\374\1\377\377\377\0\377\377\377\0\374\374\374\2\325\325\325\6" "\347\347\347\12\355\355\355\17\360\360\360\23\356\356\356\25\360\360\360" "\25\360\360\360\25\354\354\354\30\356\356\356!\360\360\3606\365\365\365]" "\370\370\370\212\373\373\373\274\374\374\374\327\375\375\375\336\374\374" "\374\307\372\372\372\231\367\367\367k\362\362\362>\356\356\356'\361\361\361" "\31\355\355\355\26\357\357\357\25\357\357\357\25\354\354\354\24\360\360\360" "\20\353\353\353\14\336\336\336\10\374\374\374\3\377\377\377\1\346\346\346" "\2\361\361\361\6\355\355\355\16\357\357\357\31\361\361\361$\361\361\361," "\363\363\3632\363\363\3635\362\362\3625\362\362\3629\363\363\363B\365\365" "\365U\370\370\370y\372\372\372\242\374\374\374\315\375\375\375\343\376\376" "\376\350\375\375\375\325\373\373\373\257\371\371\371\207\367\367\367]\364" "\364\364G\362\362\362:\362\362\3626\362\362\3625\363\363\3633\361\361\361" "/\362\362\362'\357\357\357\34\355\355\355\22\364\364\364\10\354\354\354\3" "\327\327\327\3\347\347\347\13\362\362\362\31\357\357\357,\362\362\362B\363" "\363\363S\365\365\365`\367\367\367f\370\370\370i\370\370\370l\371\371\371" "t\370\370\370\205\372\372\372\241\374\374\374\277\376\376\376\336\376\376" "\376\356\376\376\376\362\376\376\376\344\374\374\374\311\373\373\373\253" "\370\370\370\213\370\370\370y\370\370\370n\370\370\370j\370\370\370g\366" "\366\366c\364\364\364W\362\362\362H\360\360\3602\360\360\360\37\356\356\356" "\15\334\334\334\5\371\371\371\3\353\353\353\15\360\360\360\36\360\360\360" "7\363\363\363V\366\366\366p\370\370\370\206\371\371\371\222\372\372\372\232" "\373\373\373\236\373\373\373\245\373\373\373\261\374\374\374\304\375\375" "\375\330\376\376\376\353\377\377\377\365\377\377\377\370\377\377\377\357" "\376\376\376\336\374\374\374\312\373\373\373\265\373\373\373\251\372\372" "\372\240\372\372\372\233\371\371\371\225\370\370\370\212\367\367\367w\364" "\364\364_\361\361\361@\361\361\361&\354\354\354\21\357\357\357\6\342\342" "\342\3\351\351\351\14\357\357\357\36\361\361\3619\364\364\364\\\367\367\367" "|\371\371\371\236\372\372\372\263\373\373\373\302\375\375\375\313\375\375" "\375\323\375\375\375\333\376\376\376\344\376\376\376\355\377\377\377\367" "\377\377\377\373\377\377\377\374\377\377\377\370\376\376\376\360\376\376" "\376\347\375\375\375\335\375\375\375\325\375\375\375\316\374\374\374\306" "\373\373\373\270\371\371\371\245\367\367\367\206\365\365\365g\362\362\362" "B\357\357\357'\355\355\355\20\342\342\342\6\353\353\353\2\343\343\343\11" "\354\354\354\27\357\357\357-\362\362\362N\365\365\365n\370\370\370\224\371" "\371\371\257\373\373\373\312\375\375\375\330\376\376\376\345\376\376\376" "\355\376\376\376\363\377\377\377\367\377\377\377\374\377\377\377\376\377" "\377\377\376\377\377\377\375\377\377\377\371\377\377\377\365\376\376\376" "\357\376\376\376\350\375\375\375\335\373\373\373\317\372\372\372\270\370" "\370\370\235\366\366\366y\364\364\364X\360\360\3605\353\353\353\36\352\352" "\352\14\345\345\345\4\374\374\374\1\351\351\351\4\344\344\344\15\356\356" "\356\33\360\360\3602\362\362\362N\365\365\365r\370\370\370\223\372\372\372" "\266\375\375\375\317\376\376\376\345\377\377\377\361\377\377\377\371\377" "\377\377\374\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377" "\376\377\377\377\375\377\377\377\372\377\377\377\364\376\376\376\351\374" "\374\374\326\373\373\373\276\371\371\371\235\366\366\366}\363\363\363W\361" "\361\361;\357\357\357\40\353\353\353\21\346\346\346\6\361\361\361\2\371\371" "\371\0\311\311\311\2\323\323\323\6\337\337\337\16\354\354\354\34\357\357" "\3570\362\362\362M\365\365\365l\370\370\370\224\373\373\373\264\375\375\375" "\325\376\376\376\351\377\377\377\367\377\377\377\375\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" "\371\376\376\376\356\376\376\376\334\373\373\373\276\371\371\371\236\366" "\366\366w\363\363\363W\357\357\3577\353\353\353\"\345\345\345\21\330\330" "\330\11\302\302\302\2\337\337\337\0\377\377\377\0\371\371\371\0\313\313\313" "\1\344\344\344\4\342\342\342\13\351\351\351\25\353\353\353(\360\360\360B" "\364\364\364h\370\370\370\220\373\373\373\275\374\374\374\334\376\376\376" "\362\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\374\376\376\376\366\375\375\375\344\374\374\374" "\310\372\372\372\235\366\366\366u\361\361\361K\354\354\3540\347\347\347\31" "\351\351\351\15\343\343\343\5\331\331\331\2\362\362\362\0\377\377\377\0\377" "\377\377\0\377\377\377\0\215\215\215\0\234\234\234\1\325\325\325\4\337\337" "\337\11\341\341\341\25\355\355\355)\362\362\362M\366\366\366x\372\372\372" "\254\374\374\374\322\376\376\376\356\376\376\376\371\377\377\377\376\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\376\376\376" "\362\375\375\375\334\373\373\373\271\370\370\370\207\363\363\363[\357\357" "\3571\346\346\346\33\341\341\341\13\325\325\325\5\342\342\342\1\231\231\231" "\0\370\370\370\0\377\377\377\0\377\377\377\0\377\377\377\0ddd\0]]]\0\372" "\372\372\0\340\340\340\2\327\327\327\11\353\353\353\32\361\361\361<\366\366" "\366i\372\372\372\242\374\374\374\314\376\376\376\354\376\376\376\370\377" "\377\377\374\377\377\377\374\376\376\376\374\377\377\377\374\377\377\377" "\372\376\376\376\360\375\375\375\327\373\373\373\260\367\367\367x\363\363" "\363J\355\355\355!\341\341\341\16\311\311\311\4\367\367\367\1\336\336\336" "\0HHH\0\375\375\375\0\377\377\377\0\377\377\377\0\377\377\377\0\233\233\233" "\0\234\234\234\0\377\377\377\0\361\361\361\2\344\344\344\10\352\352\352\31" "\363\363\363<\367\367\367j\372\372\372\244\374\374\374\315\376\376\376\353" "\377\377\377\364\376\376\376\365\376\376\376\363\377\377\377\362\376\376" "\376\364\376\376\376\365\376\376\376\357\375\375\375\330\373\373\373\262" "\370\370\370{\365\365\365J\355\355\355\40\340\340\340\15\343\343\343\3\377" "\377\377\0\361\361\361\0\212\212\212\0\377\377\377\0\377\377\377\0\351\351" "\351\0\351\351\351\0\352\352\352\0\352\352\352\0\351\351\351\0\360\360\360" "\2\341\341\341\12\356\356\356\35\364\364\364D\370\370\370t\373\373\373\255" "\374\374\374\321\376\376\376\347\375\375\375\351\375\375\375\343\375\375" "\375\335\375\375\375\333\375\375\375\340\375\375\375\350\376\376\376\351" "\375\375\375\332\373\373\373\272\370\370\370\204\365\365\365S\361\361\361" "%\350\350\350\17\344\344\344\3\362\362\362\0\351\351\351\0\352\352\352\0" "\351\351\351\0\351\351\351\0CCC\0CCC\0DDD\0DDD\0WWW\0\324\324\324\3\351\351" "\351\16\361\361\361%\365\365\365P\370\370\370\201\373\373\373\265\374\374" "\374\321\375\375\375\334\374\374\374\324\373\373\373\304\372\372\372\272" "\372\372\372\267\373\373\373\300\374\374\374\317\374\374\374\332\374\374" "\374\327\373\373\373\277\371\371\371\221\366\366\366`\361\361\361/\354\354" "\354\25\342\342\342\5\225\225\225\1DDD\0EEE\0CCC\0CCC\0\40\40\40\0\40\40" "\40\0\40\40\40\0\40\40\40\0mmm\1\327\327\327\6\352\352\352\24\362\362\362" "0\365\365\365_\370\370\370\215\372\372\372\270\373\373\373\307\373\373\373" "\302\372\372\372\256\371\371\371\224\367\367\367\205\366\366\366\201\370" "\370\370\217\372\372\372\247\373\373\373\274\373\373\373\311\373\373\373" "\276\371\371\371\234\366\366\366n\362\362\362;\355\355\355\34\342\342\342" "\10\220\220\220\2\"\"\"\0\40\40\40\0\40\40\40\0\40\40\40\0\336\336\336\0" "\336\336\336\0\336\336\336\0\340\340\340\0\351\351\351\1\352\352\352\10\353" "\353\353\31\361\361\3618\365\365\365g\370\370\370\220\371\371\371\256\372" "\372\372\260\371\371\371\240\367\367\367\205\365\365\365f\362\362\362W\362" "\362\362S\364\364\364a\367\367\367{\370\370\370\227\372\372\372\257\372\372" "\372\260\370\370\370\233\366\366\366t\363\363\363C\354\354\354\"\353\353" "\353\12\353\353\353\3\336\336\336\0\336\336\336\0\336\336\336\0\336\336\336" "\0\6\6\6\0\6\6\6\0\6\6\6\0\15\15\15\0\315\315\315\2\352\352\352\12\357\357" "\357\35\361\361\361<\365\365\365g\367\367\367\206\367\367\367\225\367\367" "\367\214\366\366\366q\364\364\364T\361\361\3618\360\360\360*\357\357\357" "'\360\360\3603\363\363\363K\366\366\366g\366\366\366\206\367\367\367\224" "\367\367\367\215\366\366\366q\362\362\362G\360\360\360'\351\351\351\15\315" "\315\315\4\23\23\23\0\6\6\6\0\6\6\6\0\6\6\6\0ggg\0ggg\0ggg\0ggg\0\331\331" "\331\2\366\366\366\12\356\356\356\34\363\363\3637\365\365\365Z\364\364\364" "o\365\365\365t\364\364\364e\363\363\363I\357\357\3572\350\350\350\35\350" "\350\350\23\346\346\346\21\350\350\350\31\354\354\354+\362\362\362A\364\364" "\364^\364\364\364p\365\365\365s\365\365\365a\363\363\363A\361\361\361%\352" "\352\352\15\340\340\340\4lll\0ggg\0ggg\0ggg\0""111\0""111\0""111\0AAA\0\344" "\344\344\2\347\347\347\10\356\356\356\26\362\362\362*\362\362\362A\361\361" "\361K\361\361\361I\361\361\361:\354\354\354%\351\351\351\26\347\347\347\12" "\345\345\345\5\337\337\337\5\355\355\355\10\351\351\351\21\354\354\354\40" "\357\357\3574\361\361\361D\361\361\361M\361\361\361E\361\361\3611\360\360" "\360\34\351\351\351\13\337\337\337\3===\0""111\0""111\0""111\0\353\353\353" "\0\353\353\353\0\353\353\353\0\355\355\355\0\370\370\370\1\364\364\364\5" "\360\360\360\17\357\357\357\33\361\361\361(\361\361\361-\355\355\355)\353" "\353\353\37\345\345\345\22\343\343\343\11\345\345\345\3\361\361\361\1\374" "\374\374\1\351\351\351\3\347\347\347\7\342\342\342\17\352\352\352\33\356" "\356\356&\360\360\360-\360\360\360*\356\356\356\37\361\361\361\22\363\363" "\363\7\367\367\367\2\354\354\354\0\353\353\353\0\353\353\353\0\353\353\353" "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0" "\370\370\370\2\346\346\346\7\354\354\354\14\346\346\346\22\360\360\360\22" "\354\354\354\17\335\335\335\13\325\325\325\5\362\362\362\2\217\217\217\0" "\336\336\336\0\377\377\377\0\314\314\314\0\311\311\311\1\333\333\333\5\330" "\330\330\11\350\350\350\16\361\361\361\22\353\353\353\22\356\356\356\15\346" "\346\346\10\365\365\365\3\377\377\377\1\377\377\377\0\377\377\377\0\377\377" "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" "\0\377\377\377\0\377\377\377\0\341\341\341\2\330\330\330\5\346\346\346\7" "\346\346\346\7\354\354\354\5\326\326\326\4\331\331\331\1\375\375\375\0\215" "\215\215\0\336\336\336\0\377\377\377\0\307\307\307\0\354\354\354\0\355\355" "\355\1\325\325\325\3\342\342\342\5\352\352\352\7\344\344\344\7\336\336\336" "\5\343\343\343\4\375\375\375\1\377\377\377\0\377\377\377\0\377\377\377\0" "\377\377\377\0\377\377\377\0" }; ./plugins/showmouse/src/showmouse.h0000644000004100000410000000776013246301623017760 0ustar www-datawww-data/* * * Compiz show mouse pointer plugin * * showmouse.c * * Copyright : (C) 2008 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * Updated in 2016 by Hypra (contact@hypra.fr): mouse guides support. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include "showmouse_options.h" #include "showmouse_tex.h" extern const unsigned short CACHESIZE_FACTOR; extern const unsigned short COORD_COMPONENTS; extern const unsigned short VERTEX_COMPONENTS; extern const unsigned short COLOR_COMPONENTS; /* ===================== Particle engine ========================= */ class Particle { public: Particle (); float life; /* particle life */ float fade; /* fade speed */ float width; /* particle width */ float height; /* particle height */ float w_mod; /* particle size modification during life */ float h_mod; /* particle size modification during life */ float r; /* red value */ float g; /* green value */ float b; /* blue value */ float a; /* alpha value */ float x; /* X position */ float y; /* Y position */ float z; /* Z position */ float xi; /* X direction */ float yi; /* Y direction */ float zi; /* Z direction */ float xg; /* X gravity */ float yg; /* Y gravity */ float zg; /* Z gravity */ float xo; /* orginal X position */ float yo; /* orginal Y position */ float zo; /* orginal Z position */ }; class ParticleSystem { public: ParticleSystem (int); ParticleSystem (); ~ParticleSystem (); std::vector particles; float slowdown; GLuint tex; bool active; int x, y; float darken; GLuint blendMode; /* Cache used in drawParticles It's here to avoid multiple mem allocation during drawing */ std::vector vertices_cache; std::vector coords_cache; std::vector colors_cache; std::vector dcolors_cache; void initParticles (int f_numParticles); void drawParticles (const GLMatrix &transform); void updateParticles (float time); void finiParticles (); }; class ShowmouseScreen : public PluginClassHandler , public ShowmouseOptions, public CompositeScreenInterface, public GLScreenInterface { private: void drawGuides (const GLMatrix &transform); void drawLine (const GLMatrix &transform, double x1, double y1, double x2, double y2, unsigned short *color); public: ShowmouseScreen (CompScreen *); ~ShowmouseScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompPoint mousePos; bool active; ParticleSystem ps; float rot; MousePoller pollHandle; void startupToggle (); void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void genNewParticles (int); void doDamageRegion (); void positionUpdate (const CompPoint &p); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); }; #define SHOWMOUSE_SCREEN(s) \ ShowmouseScreen *ss = ShowmouseScreen::get (s); class ShowmousePluginVTable : public CompPlugin::VTableForScreen { bool init (); }; ./plugins/showmouse/showmouse.xml.in0000644000004100000410000001101213246301623020130 0ustar www-datawww-data <_short>Show mouse <_long>Increases the visibility of the mouse pointer Accessibility opengl mousepoll cube decor opengl mousepoll <_short>General <_short>Particle Options ./plugins/showmouse/images/0000755000004100000410000000000013246301624016223 5ustar www-datawww-data./plugins/showmouse/images/Star.png0000644000004100000410000000245713246301623017651 0ustar www-datawww-dataPNG  IHDR sIDATMώW9VuT' R  !/3M6켄J؁bcg 0挸6SsLG&a(Wk3ޖov-r[Tُ}Tʈ_1ƵJQul??5;ȯxsEs"?yUA6[4.>ϙq+x9Pmn /sKegɘ=<G`O+cfj[I=_&\Y:-es?o{K rZg'q4+K Aa[ס4xk+["@$7e$S9C)ltLۿߴ \X%{]Y4m}vi_]{3n, 0]؁9sg#ߨ⩜zrȀVMYXU8IVJ+,RgT1#-Lu0II6m"YUřTGIaSwtJ 4Y)*-]t<,5eR wKd(x e&7GI+[kZV?e`2c9RRD-[km.,\4X/nJ #Q'CLMliնHuXpOo)31OCv<"fmya'a|9uG{}=0:Dx;uvƇa8u{$Ag?MMl2R<ʥd{f՟OuZ 9?z۬$S{ACJE:[>k-|r@y|f6,hHhH"ѳ/ҼOwCdo#dLf&"ITݲfpƀK!{R iMGgBY_pzWȐZ[CR&Vd$#|' sR1ah2¨P>>Ď3;JdVPଡy:I_AcČ\ K|%>;>;='l$}bڙ{*cD>ۺGCjv/4dHkSǧ(<ݞӤKn8\:IŒг>4謎OlAbџDžR1ބ[Z)iƒ?X#(l#Ri0U\h}Q }bZZ׾_'cm7=,.C݉O1Aj_PX%k45+KkNST;Y07pfIENDB`./plugins/colorfilter/0000755000004100000410000000000013246301623015250 5ustar www-datawww-data./plugins/colorfilter/CMakeLists.txt0000644000004100000410000000016013246301623020005 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (colorfilter PLUGINDEPS composite opengl) ./plugins/colorfilter/src/0000755000004100000410000000000013246301623016037 5ustar www-datawww-data./plugins/colorfilter/src/colorfilter.h0000644000004100000410000000666113246301623020545 0ustar www-datawww-data/* * Compiz/Fusion color filtering plugin * * Author : Guillaume Seguin * Email : guillaume@segu.in * * Copyright (c) 2007 Guillaume Seguin * * Ported to Compiz 0.9 by: * Copyright (c) 2009 Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _COMPIZ_COLORFILTER_H #define _COMPIZ_COLORFILTER_H #include #include #include #include "colorfilter_options.h" class ColorfilterFunction { public: CompString shader; CompString name; ColorfilterFunction (const CompString &name); bool load (CompString fname); bool loaded () const { return !shader.empty (); } private: void programCleanName (CompString &name); }; class ColorfilterScreen : public PluginClassHandler , public ColorfilterOptions { public: ColorfilterScreen (CompScreen *); ~ColorfilterScreen (); CompositeScreen *cScreen; GLScreen *gScreen; bool isFiltered; int currentFilter; /* 0 : cumulative mode 0 < c <= count : single mode */ std::vector > filtersFunctions; void toggle (); void switchFilter (); bool toggleWindow (CompAction *action, CompAction::State state, CompOption::Vector options); bool toggleScreen (CompAction *action, CompAction::State state, CompOption::Vector options); bool filterSwitch (CompAction *action, CompAction::State state, CompOption::Vector options); void unloadFilters (); int loadFilters (); void matchsChanged (CompOption *opt, ColorfilterOptions::Options num); void excludeMatchsChanged (CompOption *opt, ColorfilterOptions::Options num); void filtersChanged (CompOption *opt, ColorfilterOptions::Options num); void damageDecorations (CompOption *opt, ColorfilterOptions::Options num); }; #define FILTER_SCREEN(s) \ ColorfilterScreen *cfs = ColorfilterScreen::get (s) class ColorfilterWindow : public PluginClassHandler , public GLWindowInterface { public: ColorfilterWindow (CompWindow *); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool isFiltered; void glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); void toggle (); }; #define FILTER_WINDOW(w) \ ColorfilterWindow *cfw = ColorfilterWindow::get (w) class ColorfilterPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif ./plugins/colorfilter/src/colorfilter.cpp0000644000004100000410000002712713246301623021100 0ustar www-datawww-data/* * Compiz/Fusion color filtering plugin * * Author : Guillaume Seguin * Email : guillaume@segu.in * * Copyright (c) 2007 Guillaume Seguin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "colorfilter.h" #include #include #include COMPIZ_PLUGIN_20090315 (colorfilter, ColorfilterPluginVTable); /* Actions handling functions ----------------------------------------------- */ /* * Toggle filtering for a specific window */ void ColorfilterWindow::toggle () { FILTER_SCREEN (screen); /* Toggle window filtering flag */ isFiltered = !isFiltered; /* Check exclude list */ if (cfs->optionGetExcludeMatch ().evaluate (window)) isFiltered = false; /* Ensure window is going to be repainted */ cWindow->addDamage (); gWindow->glDrawTextureSetEnabled (this, isFiltered); } /* * Toggle filtering for the whole screen */ void ColorfilterScreen::toggle () { /* Toggle screen filtering flag */ isFiltered = !isFiltered; /* Toggle filtering for every window */ foreach (CompWindow *w, screen->windows ()) if (w) ColorfilterWindow::get (w)->toggle (); } /* * Switch current filter */ void ColorfilterScreen::switchFilter () { /* % (count + 1) because of the cumulative filters mode */ currentFilter = (currentFilter + 1) % (filtersFunctions.size () + 1); if (currentFilter == 0) compLogMessage ("colorfilter", CompLogLevelInfo, "Cumulative filters mode"); else { std::shared_ptr func = filtersFunctions.at (currentFilter - 1); if (func && func->loaded ()) { compLogMessage ("colorfilter", CompLogLevelInfo, "Single filter mode (using %s filter)", func->name.c_str ()); } else { compLogMessage ("colorfilter", CompLogLevelInfo, "Single filter mode (filter loading failure)"); } } /* Damage currently filtered windows */ foreach (CompWindow *w, screen->windows ()) { FILTER_WINDOW (w); if (cfw->isFiltered) cfw->cWindow->addDamage (); } } /* * Window filtering toggle action */ bool ColorfilterScreen::toggleWindow (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w && GL::shaders) ColorfilterWindow::get (w)->toggle (); return true; } /* * Screen filtering toggle action */ bool ColorfilterScreen::toggleScreen (CompAction *action, CompAction::State state, CompOption::Vector options) { if (GL::shaders) toggle (); return true; } /* * Filter switching action */ bool ColorfilterScreen::filterSwitch (CompAction *action, CompAction::State state, CompOption::Vector options) { if (GL::shaders) switchFilter (); return true; } /* Filters handling functions ----------------------------------------------- */ /* * Free filters resources if any */ void ColorfilterScreen::unloadFilters () { filtersFunctions.clear (); /* Reset current filter */ currentFilter = 0; } ColorfilterFunction::ColorfilterFunction (const CompString &name_) : name(name_) { programCleanName(name); } /* * Clean program name string */ void ColorfilterFunction::programCleanName (CompString &name) { std::replace_if (name.begin (), name.end (), [] (char c) { return !isalnum (c); }, '_'); } /* * File reader function */ bool ColorfilterFunction::load (CompString fname) { std::ifstream fp; int length; char *buffer; const char *home = getenv ("HOME"); CompString path; if (!boost::algorithm::ends_with (fname, ".frag")) fname += ".frag"; /* Try to open file fname as is */ fp.open (fname.c_str ()); /* If failed, try as user filter file (in ~/.compiz/data/filters) */ if (!fp.is_open () && home && home[0] != '\0') { path = CompString (home) + "/.compiz/data/filters/" + fname; fp.open (path.c_str ()); } /* If failed again, try as system wide data file * (in PREFIX/share/compiz/filters) */ if (!fp.is_open ()) { path = CompString (DATADIR) + "/data/filters/" + fname; fp.open (path.c_str ()); } /* If failed again & again, abort */ if (!fp.is_open ()) { return false; } /* get length of file: */ fp.seekg (0, std::ios::end); length = fp.tellg (); length++; fp.seekg (0, std::ios::beg); /* allocate memory */ buffer = new char [length]; /* read data as a block: */ fp.read (buffer, length - 1); buffer[length - 1] = '\0'; fp.close (); shader = buffer; delete[] buffer; return true; } /* * Load filters from a list of files for current screen */ int ColorfilterScreen::loadFilters () { int loaded, count; CompString name, file; CompOption::Value::Vector filters; std::shared_ptr func; /* Free previously loaded filters and malloc */ unloadFilters (); /* Fetch filters filenames */ filters = optionGetFilters (); count = filters.size (); //filtersFunctions.resize (count); /* Load each filter one by one */ loaded = 0; for (int i = 0; i < count; i++) { name = CompString (basename (filters.at (i).s ().c_str ())); if (boost::algorithm::ends_with (name, ".frag")) name.erase (name.end () - 5, name.end ()); file = filters.at (i).s (); if (name.empty ()) { name.clear (); continue; } compLogMessage ("colorfilter", CompLogLevelInfo, "Loading filter %s (item %s).", name.c_str (), file.c_str ()); func = std::shared_ptr (new ColorfilterFunction (name)); if (!func) continue; func->load (file); filtersFunctions.push_back (func); if (func && func->loaded ()) loaded++; } /* Warn if there was at least one loading failure */ if (loaded < count) compLogMessage ("colorfilter", CompLogLevelWarn, "Tried to load %d filter(s), %d succeeded.", count, loaded); /* Damage currently filtered windows */ foreach (CompWindow *w, screen->windows ()) { FILTER_WINDOW (w); if (cfw->isFiltered) cfw->cWindow->addDamage (w); } return loaded; } /* * Wrapper that enables filters if the window is filtered */ void ColorfilterWindow::glDrawTexture (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { FILTER_SCREEN (screen); bool shouldFilter = false; if (isFiltered && !cfs->filtersFunctions.empty ()) { if (cfs->optionGetFilterDecorations ()) shouldFilter = true; else { foreach (GLTexture *tex, gWindow->textures ()) { if (tex->name () == texture->name ()) { shouldFilter = true; break; } } } } if (shouldFilter) { if (cfs->currentFilter == 0) /* Cumulative filters mode */ { /* Enable each filter one by one */ foreach (std::shared_ptr func, cfs->filtersFunctions) { if (func->loaded ()) gWindow->addShaders (func->name, "", func->shader); } } /* Single filter mode */ else if ((unsigned int) cfs->currentFilter <= cfs->filtersFunctions.size ()) { /* Enable the currently selected filter if possible (i.e. if it * was successfully loaded) */ std::shared_ptr func = cfs->filtersFunctions.at (cfs->currentFilter - 1); if (func && func->loaded ()) gWindow->addShaders (func->name, "", func->shader); } } gWindow->glDrawTexture (texture, transform, attrib, mask); } /* Internal stuff ----------------------------------------------------------- */ /* * Filtering match settings update callback */ void ColorfilterScreen::matchsChanged (CompOption *opt, ColorfilterOptions::Options num) { /* Re-check every window against new match settings */ foreach (CompWindow *w, screen->windows ()) { FILTER_WINDOW (w); if (optionGetFilterMatch ().evaluate (w) && isFiltered && !cfw->isFiltered) { cfw->toggle (); } } } /* * Exclude match settings update callback */ void ColorfilterScreen::excludeMatchsChanged (CompOption *opt, ColorfilterOptions::Options num) { /* Re-check every window against new match settings */ foreach (CompWindow *w, screen->windows ()) { bool isExcluded; FILTER_WINDOW (w); isExcluded = optionGetExcludeMatch ().evaluate (w); if (isExcluded && cfw->isFiltered) cfw->toggle (); else if (!isExcluded && isFiltered && !cfw->isFiltered) cfw->toggle (); } } /* * Filters list setting update callback */ void ColorfilterScreen::filtersChanged (CompOption *opt, ColorfilterOptions::Options num) { loadFilters (); } /* * Damage decorations after the "Filter Decorations" setting got changed */ void ColorfilterScreen::damageDecorations (CompOption *opt, ColorfilterOptions::Options num) { cScreen->damageScreen (); } ColorfilterScreen::ColorfilterScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), isFiltered (false), currentFilter (0) { optionSetToggleWindowKeyInitiate (boost::bind ( &ColorfilterScreen::toggleWindow, this, _1, _2, _3)); optionSetToggleScreenKeyInitiate (boost::bind ( &ColorfilterScreen::toggleScreen, this, _1, _2, _3)); optionSetSwitchFilterKeyInitiate (boost::bind ( &ColorfilterScreen::filterSwitch, this, _1, _2, _3)); optionSetFilterMatchNotify (boost::bind ( &ColorfilterScreen::matchsChanged, this, _1, _2)); optionSetExcludeMatchNotify (boost::bind ( &ColorfilterScreen::excludeMatchsChanged, this, _1, _2)); optionSetFiltersNotify (boost::bind ( &ColorfilterScreen::filtersChanged, this, _1, _2)); optionSetFilterDecorationsNotify (boost::bind ( &ColorfilterScreen::damageDecorations, this, _1, _2)); loadFilters (); }; ColorfilterScreen::~ColorfilterScreen () { unloadFilters (); } ColorfilterWindow::ColorfilterWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), isFiltered (false) { GLWindowInterface::setHandler (gWindow, false); FILTER_SCREEN (screen); /* Filter windows when they are open if the screen is filtered and they * match the filtering rules */ if (cfs->isFiltered && cfs->optionGetFilterMatch ().evaluate (window)) toggle (); } bool ColorfilterPluginVTable::init () { if (!GL::shaders) compLogMessage ("colorfilter", CompLogLevelWarn, "No fragment" \ "support, the plugin will continue to load but nothing"\ "will happen"); if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/colorfilter/colorfilter.xml.in0000644000004100000410000000503113246301623020722 0ustar www-datawww-data <_short>Color filter <_long>Filter colors for accessibility purposes Accessibility opengl blur composite opengl decor ./plugins/colorfilter/compiz-core-print-fragment-program.patch0000644000004100000410000000371413246301623025125 0ustar www-datawww-dataFrom fc642f1752caa156d41f5245e5f05b583bb8b886 Mon Sep 17 00:00:00 2001 From: Guillaume Seguin Date: Thu, 16 Aug 2007 02:14:17 +0200 Subject: [PATCH] * Add fragment program pretty printer --- src/fragment.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 49 insertions(+), 0 deletions(-) diff --git a/src/fragment.c b/src/fragment.c index a1c9e6e..04ae571 100644 --- a/src/fragment.c +++ b/src/fragment.c @@ -154,6 +154,53 @@ static CompFunction initialLoadFunction = { COMP_FUNCTION_MASK }; +/* + * Print nicely formatted fragment program + */ +static void +printPrettyFragment (char *source) +{ + char *result, *current; + int feeds = 1, length; + + current = source; + while (*current != '\0') + { + if (strstr (current, ";") == current) break; + feeds++; + current = strstr (current, ";"); + if (!current) break; + else current++; + } + + result = malloc (sizeof (char) * (strlen (source) + feeds + 1)); + if (!result) + result = source; + else + { + current = source; + strcpy (result, "!!ARBfp1.0\n"); + current += 10; + while (*current != '\0') + { + if (strstr (current, ";")) + length = strstr (current, ";") + 1 - current; + else + length = strlen (current); + strncat (result, current, length); + strcat (result, "\n"); + current = strstr (current, ";"); + if (!current) break; + else current++; + } + result[strlen (source) + feeds] = '\0'; + } + compLogMessage (NULL, "core", CompLogLevelInfo, + "Using fragment program :"); + printf ("%s", result); + free (result); +} + static CompFunction * findFragmentFunction (CompScreen *s, int id) @@ -630,6 +677,8 @@ buildFragmentProgram (CompScreen *s, glGetError (); + printPrettyFragment (info.data); + (*s->genPrograms) (1, &program->name); (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, program->name); (*s->programString) (GL_FRAGMENT_PROGRAM_ARB, -- 1.5.2.4 ./plugins/colorfilter/data/0000755000004100000410000000000013246301623016161 5ustar www-datawww-data./plugins/colorfilter/data/filters/0000755000004100000410000000000013246301624017632 5ustar www-datawww-data./plugins/colorfilter/data/filters/grayscale.frag0000644000004100000410000000021313246301623022440 0ustar www-datawww-datavoid grayscale_fragment () { float v = dot(gl_FragColor.rgb, vec3(0.33333, 0.33333, 0.33333)); gl_FragColor.rgb = vec3(v, v, v); } ./plugins/colorfilter/data/filters/protanopia.frag0000644000004100000410000000206413246301623022650 0ustar www-datawww-datavoid protanopia_fragment () { vec3 color = gl_FragColor.rgb; vec4 ab = vec4(-0.0615003999429, 0.058589396688, 0.0827700165681, -0.0793451999536); vec3 ci = vec3(-0.01320014122, 0.013289415272, 0.57638336864); color.r = pow(color.r, 0.4761904); color.g = pow(color.g, 0.5); color.b = pow(color.b, 0.4761904); vec3 temp1; temp1.r = dot(vec3(0.05059983, 0.08585369, 0.00952420), color); temp1.g = dot(vec3(0.01893033, 0.08925308, 0.01370054), color); temp1.b = dot(vec3(0.00292202, 0.00975732, 0.07145979), color); if ((1.0/temp1.g) * temp1.b - ci.b < 0.0) { temp1.r = (ab.b * temp1.g + ci.r * temp1.b) * (1.0/-ab.r); } else { temp1.r = (ab.a * temp1.g + ci.g * temp1.b) * (1.0/-ab.g); } color.r = dot(vec3(30.830854, -29.832659, 1.610474), temp1); color.g = dot(vec3(-6.481468, 17.715578, -2.532642), temp1); color.b = dot(vec3(-0.375690, -1.199062, 14.273846), temp1); color.r = pow(color.r, 2.1); color.g = pow(color.g, 2.0); color.b = pow(color.b, 2.1); gl_FragColor.rgb = color; } ./plugins/colorfilter/data/filters/deuteranopia.frag0000644000004100000410000000206613246301623023156 0ustar www-datawww-datavoid deuteranopia_fragment () { vec3 color = gl_FragColor.rgb; vec4 ab = vec4(-0.0615003999429, 0.058589396688, 0.0827700165681, -0.0793451999536); vec3 ci = vec3(-0.01320014122, 0.013289415272, 0.57638336864); color.r = pow(color.r, 0.4761904); color.g = pow(color.g, 0.5); color.b = pow(color.b, 0.4761904); vec3 temp1; temp1.r = dot(vec3(0.05059983, 0.08585369, 0.00952420), color); temp1.g = dot(vec3(0.01893033, 0.08925308, 0.01370054), color); temp1.b = dot(vec3(0.00292202, 0.00975732, 0.07145979), color); if ((1.0/temp1.r) * temp1.b - ci.b < 0.0) { temp1.g = (ab.r * temp1.r + ci.r * temp1.b) * (1.0/-ab.b); } else { temp1.g = (ab.g * temp1.r + ci.g * temp1.b) * (1.0/-ab.a); } color.r = dot(vec3(30.830854, -29.832659, 1.610474), temp1); color.g = dot(vec3(-6.481468, 17.715578, -2.532642), temp1); color.b = dot(vec3(-0.375690, -1.199062, 14.273846), temp1); color.r = pow(color.r, 2.1); color.g = pow(color.g, 2.0); color.b = pow(color.b, 2.1); gl_FragColor.rgb = color; } ./plugins/colorfilter/data/filters/negative-green.frag0000644000004100000410000000013513246301623023371 0ustar www-datawww-datavoid negative_green_fragment () { gl_FragColor.rgb = vec3(0, 1.0 - gl_FragColor.g, 0); } ./plugins/colorfilter/data/filters/swap-red-blue.frag0000644000004100000410000000011213246301623023133 0ustar www-datawww-datavoid swap_red_blue_fragment () { gl_FragColor.rb = gl_FragColor.br; } ./plugins/colorfilter/data/filters/negative.frag0000644000004100000410000000016513246301623022276 0ustar www-datawww-datavoid negative_fragment () { vec3 color = vec3(1.0, 1.0, 1.0) - gl_FragColor.rgb; gl_FragColor.rgb = color; } ./plugins/colorfilter/data/filters/blueish-filter.frag0000644000004100000410000000025113246301623023406 0ustar www-datawww-datavoid blueish_filter_fragment () { vec3 color = vec3(1.0, 1.0, 1.0) - gl_FragColor.rgb; color.b = clamp(0.8 + color.b, 0.0, 1.0); gl_FragColor.rgb = color; } ./plugins/colorfilter/data/filters/negative-lightness.frag0000644000004100000410000000443713246301623024302 0ustar www-datawww-data/* HSL/RGB conversion taken off GTK's _gtk_hsla_init_from_rgba() and * _gdk_rgba_init_from_hsla(), GPLv2+, * Copyright (C) 2012 Benjamin Otte */ /* hsl: .r = H, .g = S, .b = L */ vec3 negative_lightness_rgb_to_hsl(vec3 rgb) { vec3 hsl; float min; float max; max = max(max(rgb.r, rgb.g), rgb.b); min = min(min(rgb.r, rgb.g), rgb.b); hsl.r = 0.0; // H hsl.g = 0.0; // S hsl.b = (max + min) / 2.0; // L if (max != min) { if (hsl.b <= 0.5) hsl.g = (max - min) / (max + min); else hsl.g = (max - min) / (2.0 - max - min); float delta = max - min; if (rgb.r == max) hsl.r = (rgb.g - rgb.b) / delta; else if (rgb.g == max) hsl.r = 2.0 + (rgb.b - rgb.r) / delta; else if (rgb.b == max) hsl.r = 4.0 + (rgb.r - rgb.g) / delta; hsl.r *= 60.0; if (hsl.r < 0.0) hsl.r += 360.0; } return hsl; } /* hsl: .r = H, .g = S, .b = L */ vec3 negative_lightness_hsl_to_rgb(vec3 hsl) { vec3 rgb; float m1, m2; if (hsl.b <= 0.5) // H m2 = hsl.b * (1.0 + hsl.g); else m2 = hsl.b + hsl.g - hsl.b * hsl.g; m1 = 2.0 * hsl.b - m2; if (hsl.g == 0.0) rgb = vec3(hsl.b, hsl.b, hsl.b); else { float hue; hue = hsl.r + 120.0; while (hue > 360.0) hue -= 360.0; while (hue < 0.0) hue += 360.0; if (hue < 60.0) rgb.r = m1 + (m2 - m1) * hue / 60.0; else if (hue < 180.0) rgb.r = m2; else if (hue < 240.0) rgb.r = m1 + (m2 - m1) * (240.0 - hue) / 60.0; else rgb.r = m1; hue = hsl.r; while (hue > 360.0) hue -= 360.0; while (hue < 0.0) hue += 360.0; if (hue < 60.0) rgb.g = m1 + (m2 - m1) * hue / 60.0; else if (hue < 180.0) rgb.g = m2; else if (hue < 240.0) rgb.g = m1 + (m2 - m1) * (240.0 - hue) / 60.0; else rgb.g = m1; hue = hsl.r - 120.0; while (hue > 360.0) hue -= 360.0; while (hue < 0.0) hue += 360.0; if (hue < 60.0) rgb.b = m1 + (m2 - m1) * hue / 60.0; else if (hue < 180.0) rgb.b = m2; else if (hue < 240.0) rgb.b = m1 + (m2 - m1) * (240.0 - hue) / 60.0; else rgb.b = m1; } return rgb; } void negative_lightness_fragment() { vec3 hsl = negative_lightness_rgb_to_hsl(gl_FragColor.rgb); hsl.b = 1.0 - hsl.b; // invert L gl_FragColor.rgb = negative_lightness_hsl_to_rgb(hsl); } ./plugins/colorfilter/data/filters/blackandwhite.frag0000644000004100000410000000025113246301623023270 0ustar www-datawww-datavoid blackandwhite_fragment () { float v = dot(gl_FragColor.rgb, vec3(0.33333, 0.33333, 0.33333)); gl_FragColor.rgb = v > 0.5 ? vec3(1, 1, 1) : vec3(0, 0, 0); } ./plugins/colorfilter/data/filters/sepia.frag0000644000004100000410000000044013246301623021571 0ustar www-datawww-datavoid sepia_fragment () { vec3 color = gl_FragColor.rgb; color.r = dot(gl_FragColor.rgb, vec3(0.393, 0.769, 0.189)); color.g = dot(gl_FragColor.rgb, vec3(0.349, 0.686, 0.168)); color.b = dot(gl_FragColor.rgb, vec3(0.272, 0.534, 0.131)); gl_FragColor.rgb = color.rgb; } ./plugins/colorfilter/data/filters/swap-green-blue.frag0000644000004100000410000000011413246301623023463 0ustar www-datawww-datavoid swap_green_blue_fragment () { gl_FragColor.gb = gl_FragColor.bg; } ./plugins/colorfilter/data/filters/swap-red-green.frag0000644000004100000410000000011313246301623023305 0ustar www-datawww-datavoid swap_red_green_fragment () { gl_FragColor.rg = gl_FragColor.gr; } ./plugins/colorfilter/data/filters/contrast.frag0000644000004100000410000000032413246301623022326 0ustar www-datawww-datavoid contrast_fragment () { vec3 d; d.r = gl_FragColor.r < 0.51 ? -0.3 : +0.3; d.g = gl_FragColor.g < 0.51 ? -0.3 : +0.3; d.b = gl_FragColor.b < 0.51 ? -0.3 : +0.3; gl_FragColor.rgb += d; } ./plugins/shift/0000755000004100000410000000000013246301624014042 5ustar www-datawww-data./plugins/shift/CMakeLists.txt0000644000004100000410000000015713246301623016604 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (shift PLUGINDEPS composite opengl text) ./plugins/shift/src/0000755000004100000410000000000013246301624014631 5ustar www-datawww-data./plugins/shift/src/shift.cpp0000644000004100000410000013757113246301623016467 0ustar www-datawww-data/* * * Compiz shift switcher plugin * * shift.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * Based on ring.c: * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Rounded corner drawing taken from wall.c: * Copyright : (C) 2007 Robert Carr * E-mail : racarr@beryl-project.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "shift.h" COMPIZ_PLUGIN_20090315 (shift, ShiftPluginVTable); const double PI = 3.14159265359f; bool textAvailable = false; void setFunctions (bool enabled) { SHIFT_SCREEN (screen); screen->handleEventSetEnabled (ss, enabled); ss->cScreen->preparePaintSetEnabled (ss, enabled); ss->cScreen->paintSetEnabled (ss, enabled); ss->gScreen->glPaintOutputSetEnabled (ss, enabled); ss->cScreen->donePaintSetEnabled (ss, enabled); foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); sw->gWindow->glPaintSetEnabled (sw, enabled); sw->cWindow->damageRectSetEnabled (sw, enabled); } } void ShiftScreen::activateEvent (bool activating) { CompOption::Vector o; o.resize (2); o[0] = CompOption ("root", CompOption::TypeInt); o[0].value ().set ((int) screen->root ()); o[1] = CompOption ("active", CompOption::TypeBool); o[1].value ().set (activating); screen->handleCompizEvent ("shift", "activate", o); } bool ShiftWindow::isShiftable () { SHIFT_SCREEN (screen); if (window->overrideRedirect () || (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask))) return false; if (!window->mapNum () || !window->isViewable ()) { if (ss->optionGetMinimized ()) { if (!window->minimized () && !window->inShowDesktopMode () && !window->shaded ()) return false; } else return false; } if (ss->mType == ShiftTypeNormal) { if (!window->mapNum () || !window->isViewable ()) { if (window->serverGeometry ().x () + window->serverGeometry ().width () <= 0 || window->serverGeometry ().y () + window->serverGeometry ().height () <= 0 || window->serverGeometry ().x () >= screen->width () || window->serverGeometry ().y () >= screen->height ()) return false; } else if (!window->focus ()) return false; } else if (ss->mType == ShiftTypeGroup && ss->mClientLeader != window->clientLeader () && ss->mClientLeader != window->id ()) return false; if (window->state () & CompWindowStateSkipTaskbarMask || (ss->mCurrentMatch && !ss->mCurrentMatch->evaluate (window))) return false; return true; } void ShiftScreen::freeWindowTitle () { } void ShiftScreen::renderWindowTitle () { if (!textAvailable || !optionGetWindowTitle ()) return; CompText::Attrib tA; CompRect oe; freeWindowTitle (); if (optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = screen->getCurrentOutputExtents (); /* 75% of the output device as maximum width */ tA.maxWidth = oe.width () * 3 / 4; tA.maxHeight = 100; tA.family = "Sans"; tA.size = optionGetTitleFontSize (); tA.color[0] = optionGetTitleFontColorRed (); tA.color[1] = optionGetTitleFontColorGreen (); tA.color[2] = optionGetTitleFontColorBlue (); tA.color[3] = optionGetTitleFontColorAlpha (); tA.flags = CompText::WithBackground | CompText::Ellipsized; if (optionGetTitleFontBold ()) tA.flags |= CompText::StyleBold; tA.bgHMargin = 15; tA.bgVMargin = 15; tA.bgColor[0] = optionGetTitleBackColorRed (); tA.bgColor[1] = optionGetTitleBackColorGreen (); tA.bgColor[2] = optionGetTitleBackColorBlue (); tA.bgColor[3] = optionGetTitleBackColorAlpha (); text.renderWindowTitle (mSelectedWindow ? mSelectedWindow : None, mType == ShiftTypeAll, tA); } void ShiftScreen::drawWindowTitle (const GLMatrix &transform) { if (!textAvailable || !optionGetWindowTitle ()) return; CompRect oe; float width = text.getWidth (); float height = text.getHeight (); if (optionGetMultioutputMode () == MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = (CompRect) screen->outputDevs ()[mUsedOutput]; float x = oe.centerX () - width / 2; float y; unsigned short verticalOffset = optionGetVerticalOffset (); /* assign y (for the lower corner!) according to the setting */ switch (optionGetTitleTextPlacement ()) { case TitleTextPlacementCenteredOnScreen: y = oe.centerY () + height / 2; break; case TitleTextPlacementTopOfScreenMinusOffset: case TitleTextPlacementBottomOfScreenPlusOffset: { CompRect workArea = screen->currentOutputDev ().workArea (); if (optionGetTitleTextPlacement () == TitleTextPlacementTopOfScreenMinusOffset) y = oe.y1 () + workArea.y1 () + height + verticalOffset; else /* TitleTextPlacementBottomOfScreenPlusOffset */ y = oe.y1 () + workArea.y2 () - verticalOffset; } break; default: return; } text.draw (transform, floor (x), floor (y), 1.0f); } bool ShiftWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status; SHIFT_SCREEN (screen); if (ss->mState != ShiftStateNone && !ss->mPaintingAbove && !(window->wmType () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { GLWindowPaintAttrib sAttrib = attrib; bool scaled = false; if (window->mapNum () && gWindow->textures ().empty ()) gWindow->bind (); if (mActive) scaled = (ss->mActiveSlot != NULL); if (mOpacity > 0.01 && (ss->mActiveSlot == NULL)) { sAttrib.brightness = sAttrib.brightness * mBrightness; sAttrib.opacity = sAttrib.opacity * mOpacity; } else mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; if (mActive && ((unsigned int) ss->mOutput->id () == (unsigned int) ss->mUsedOutput || (unsigned int) ss->mOutput->id () == (unsigned int) ~0)) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; status = gWindow->glPaint (sAttrib, transform, region, mask); if (scaled && !gWindow->textures ().empty ()) { GLWindowPaintAttrib wAttrib (attrib); GLMatrix wTransform = transform; ShiftSlot *slot = ss->mActiveSlot->slot; float sx = ss->mAnim * slot->tx; float sy = ss->mAnim * slot->ty; float sz = ss->mAnim * slot->z; float srot = (ss->mAnim * slot->rotation); float anim = MIN (1.0, MAX (0.0, ss->mAnim)); float sscale; float sopacity; if (slot->primary) sscale = (ss->mAnim * slot->scale) + (1 - ss->mAnim); else sscale = ss->mAnim * slot->scale; if (slot->primary && !ss->mReflectActive) sopacity = (ss->mAnim * slot->opacity) + (1 - ss->mAnim); else sopacity = anim * anim * slot->opacity; if (sopacity <= 0.05) return status; /*if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false;*/ wAttrib.opacity = (float)wAttrib.opacity * sopacity; wAttrib.brightness = (float)wAttrib.brightness * ss->mReflectBrightness; if (window->alpha () || wAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (sx, sy, sz); wTransform.translate (window->x () + (window->width () * sscale / 2), window->y () + (window->height () * sscale / 2), 0.0f); wTransform.scale (ss->mOutput->width (), -ss->mOutput->height (), 1.0f); wTransform.rotate (srot, 0.0, 1.0, 0.0); wTransform.scale (1.0f / ss->mOutput->width (), -1.0f / ss->mOutput->height (), 1.0f); wTransform.scale (sscale, sscale, 1.0f); wTransform.translate (-window->x () - (window->width () / 2), -window->y () - (window->height () / 2), 0.0f); gWindow->glDraw (wTransform, wAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } if (scaled && ((ss->optionGetOverlayIcon () != ShiftOptions::OverlayIconNone) || gWindow->textures ().empty ())) { GLTexture *icon; icon = gWindow->getIcon (512, 512); if (!icon) icon = ss->gScreen->defaultIcon (); if (icon && (icon->name ())) { float scale; float x, y; int iconOverlay = ss->optionGetOverlayIcon (); ShiftSlot *slot = ss->mActiveSlot->slot; GLTexture::MatrixList matl; float sx = ss->mAnim * slot->tx; float sy = ss->mAnim * slot->ty; float sz = ss->mAnim * slot->z; float srot = ss->mAnim * slot->rotation; float sopacity = ss->mAnim * slot->opacity; float sscale; if (slot->primary) sscale = (ss->mAnim * slot->scale) + (1 - ss->mAnim); else sscale = ss->mAnim * ss->mAnim * slot->scale; int scaledWinWidth = window->width () * sscale; int scaledWinHeight = window->height () * sscale; if (gWindow->textures ().empty ()) iconOverlay = ShiftOptions::OverlayIconBig; switch (iconOverlay) { case ShiftOptions::OverlayIconNone: case ShiftOptions::OverlayIconEmblem: scale = 1.0f; break; case ShiftOptions::OverlayIconBig: default: /* only change opacity if not painting an icon for a minimized window */ if (!gWindow->textures ().empty ()) sAttrib.opacity /= 3; scale = MIN (((float) scaledWinWidth / icon->width ()), ((float) scaledWinHeight / icon->height ())); break; } int width = icon->width () * scale; int height = icon->height () * scale; switch (iconOverlay) { case ShiftOptions::OverlayIconNone: case ShiftOptions::OverlayIconEmblem: x = scaledWinWidth - width; y = scaledWinHeight - height; break; case ShiftOptions::OverlayIconBig: default: x = scaledWinWidth / 2 - width / 2; y = scaledWinHeight / 2 - height / 2; break; } mask |= PAINT_WINDOW_BLEND_MASK; /* if we paint the icon for a minimized window, we need to force the usage of a good texture filter */ if (gWindow->textures ().empty ()) mask |= PAINT_WINDOW_TRANSFORMED_MASK; CompRegion iconReg = CompRegion (0, 0, icon->width (), icon->height ()); gWindow->vertexBuffer ()->begin (); matl.push_back (icon->matrix ()); gWindow->glAddGeometry (matl, iconReg, iconReg); if (gWindow->vertexBuffer ()->end ()) { GLWindowPaintAttrib wAttrib (sAttrib); GLMatrix wTransform (transform); if (gWindow->textures ().empty ()) sAttrib.opacity = gWindow->paintAttrib ().opacity; wAttrib = GLWindowPaintAttrib (sAttrib); wAttrib.opacity = (float)wAttrib.opacity * sopacity; wAttrib.brightness = (float)wAttrib.brightness * ss->mReflectBrightness; wTransform.translate (sx, sy, sz); wTransform.translate (window->x () + (window->width () * sscale / 2), window->y () + (window->height () * sscale / 2), 0.0f); wTransform.scale (ss->mOutput->width (), -ss->mOutput->height (), 1.0f); wTransform.rotate (srot, 0.0, 1.0, 0.0); wTransform.scale (1.0f / ss->mOutput->width (), -1.0f / ss->mOutput->height (), 1.0f); wTransform.translate (x - (window->width () * sscale / 2), y - (window->height () * sscale / 2), 0.0f); wTransform.scale (scale, scale, 1.0f); gWindow->glDrawTexture (icon, wTransform, wAttrib, mask); } } } } else { GLWindowPaintAttrib sAttrib = attrib; if (ss->mPaintingAbove) { sAttrib.opacity = sAttrib.opacity * (1.0 - ss->mAnim); if (ss->mAnim > 0.99) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; } status = gWindow->glPaint (sAttrib, transform, region, mask); } return status; } static int compareWindows (const void *elem1, const void *elem2) { CompWindow *w1 = *((CompWindow **) elem1); CompWindow *w2 = *((CompWindow **) elem2); CompWindow *w = w1; if (w1 == w2) return 0; if (!w1->shaded () && !w1->isViewable () && (w2->shaded () || w2->isViewable ())) return 1; if (!w2->shaded () && !w2->isViewable () && (w1->shaded () || w1->isViewable ())) return -1; while (w) { if (w == w2) return 1; w = w->next; } return -1; } static int compareShiftWindowDistance (const void *elem1, const void *elem2) { float a1 = ((ShiftDrawSlot *) elem1)->distance; float a2 = ((ShiftDrawSlot *) elem2)->distance; float ab = fabs (a1 - a2); if (ab > 0.3 && a1 > a2) return -1; else if (ab > 0.3 && a1 < a2) return 1; else return compareWindows (&((ShiftDrawSlot *) elem2)->w, &((ShiftDrawSlot *) elem1)->w); } bool ShiftScreen::layoutThumbsCover () { CompWindow *w; int ww, wh; float xScale, yScale; float distance; CompRect oe; if (optionGetMultioutputMode () == ShiftScreen::MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = screen->outputDevs ()[mUsedOutput]; /* the center of the ellipse is in the middle of the used output device */ int centerX = oe.centerX (); int centerY = oe.centerY (); int maxThumbWidth = oe.width () * optionGetSize () / 100; int maxThumbHeight = oe.height () * optionGetSize () / 100; for (int index = 0; index < mNWindows; ++index) { w = mWindows[index]; SHIFT_WINDOW (w); ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; if (ww > maxThumbWidth) xScale = (float)(maxThumbWidth) / (float)ww; else xScale = 1.0f; if (wh > maxThumbHeight) yScale = (float)(maxThumbHeight) / (float)wh; else yScale = 1.0f; float val1 = floor((float) MIN (mNWindows, optionGetCoverMaxVisibleWindows ()) / 2.0); float pos; float space = (maxThumbWidth / 2); space *= cos (sin (PI / 4) * PI / 3); space *= 2; //space += (space / sin (PI / 4)) - space; for (int i = 0; i < 2; ++i) { if (mInvert ^ (i == 0)) { distance = mMvTarget - index; distance += optionGetCoverOffset (); } else { distance = mMvTarget - index + mNWindows; distance += optionGetCoverOffset (); if (distance > mNWindows) distance -= mNWindows * 2; } pos = MIN (1.0, MAX (-1.0, distance)); sw->mSlots[i].opacity = 1.0 - MIN (1.0, MAX (0.0, fabs(distance) - val1)); sw->mSlots[i].scale = MIN (xScale, yScale); sw->mSlots[i].y = centerY + (maxThumbHeight / 2.0) - (((w->height () / 2.0) + w->border ().bottom) * sw->mSlots[i].scale); if (fabs(distance) < 1.0) { sw->mSlots[i].x = centerX + (sin(pos * PI * 0.5) * space * optionGetCoverExtraSpace ()); sw->mSlots[i].z = fabs (distance); sw->mSlots[i].z *= -(maxThumbWidth / (2.0 * oe.width ())); sw->mSlots[i].rotation = sin(pos * PI * 0.5) * -optionGetCoverAngle (); } else { float rad = (space / oe.width ()) / sin(PI / 6.0); float ang = (PI / MAX(72.0, mNWindows * 2)) * (distance - pos) + (pos * (PI / 6.0)); sw->mSlots[i].x = centerX; sw->mSlots[i].x += sin(ang) * rad * oe.width () * optionGetCoverExtraSpace (); sw->mSlots[i].rotation = optionGetCoverAngle () + 30; sw->mSlots[i].rotation -= fabs(ang) * 180.0 / PI; sw->mSlots[i].rotation *= -pos; sw->mSlots[i].z = -(maxThumbWidth / (2.0 * oe.width ())); sw->mSlots[i].z += -(cos(PI / 6.0) * rad); sw->mSlots[i].z += (cos(ang) * rad); } mDrawSlots[index * 2 + i].w = w; mDrawSlots[index * 2 + i].slot = &sw->mSlots[i]; mDrawSlots[index * 2 + i].distance = fabs(distance); } if (mDrawSlots[index * 2].distance > mDrawSlots[index * 2 + 1].distance) { mDrawSlots[index * 2].slot->primary = false; mDrawSlots[index * 2 + 1].slot->primary = true; } else { mDrawSlots[index * 2].slot->primary = true; mDrawSlots[index * 2 + 1].slot->primary = false; } } mNSlots = mNWindows * 2; qsort (mDrawSlots, mNSlots, sizeof (ShiftDrawSlot), compareShiftWindowDistance); return true; } bool ShiftScreen::layoutThumbsFlip () { CompWindow *w; int ww, wh; float xScale, yScale; float distance; float angle; CompRect oe; if (optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) oe.setGeometry (0, 0, screen->width (), screen->height ()); else oe = screen->outputDevs ()[mUsedOutput]; /* the center of the ellipse is in the middle of the used output device */ int centerX = oe.centerX (); int centerY = oe.centerY (); int maxThumbWidth = oe.width () * optionGetSize () / 100; int maxThumbHeight = oe.height () * optionGetSize () / 100; int slotNum = 0; for (int index = 0; index < mNWindows; ++index) { w = mWindows[index]; SHIFT_WINDOW (w); ww = w->width () + w->border ().left + w->border ().right; wh = w->height () + w->border ().top + w->border ().bottom; if (ww > maxThumbWidth) xScale = (float)(maxThumbWidth) / (float)ww; else xScale = 1.0f; if (wh > maxThumbHeight) yScale = (float)(maxThumbHeight) / (float)wh; else yScale = 1.0f; angle = optionGetFlipRotation () * PI / 180.0; for (int i = 0; i < 2; ++i) { if (mInvert ^ (i == 0)) distance = mMvTarget - index; else { distance = mMvTarget - index + mNWindows; if (distance > 1.0) distance -= mNWindows * 2; } if (distance > 0.0) sw->mSlots[i].opacity = MAX (0.0, 1.0 - (distance * 1.0)); else { if (distance < -(mNWindows - 1)) sw->mSlots[i].opacity = MAX (0.0, mNWindows + distance); else sw->mSlots[i].opacity = 1.0; } if (distance > 0.0 && w->id () != mSelectedWindow) sw->mSlots[i].primary = false; else sw->mSlots[i].primary = true; sw->mSlots[i].scale = MIN (xScale, yScale); sw->mSlots[i].y = centerY + (maxThumbHeight / 2.0) - (((w->height () / 2.0) + w->border ().bottom) * sw->mSlots[i].scale); sw->mSlots[i].x = sin(angle) * distance * (maxThumbWidth / 2); if (distance > 0 && false) sw->mSlots[i].x *= 1.5; sw->mSlots[i].x += centerX; sw->mSlots[i].z = cos(angle) * distance; if (distance > 0) sw->mSlots[i].z *= 1.5; sw->mSlots[i].z *= (maxThumbWidth / (2.0 * oe.width ())); sw->mSlots[i].rotation = optionGetFlipRotation (); if (sw->mSlots[i].opacity > 0.0) { mDrawSlots[slotNum].w = w; mDrawSlots[slotNum].slot = &sw->mSlots[i]; mDrawSlots[slotNum].distance = -distance; ++slotNum; } } } mNSlots = slotNum; qsort (mDrawSlots, mNSlots, sizeof (ShiftDrawSlot), compareShiftWindowDistance); return true; } bool ShiftScreen::layoutThumbs () { bool result = false; if (mState == ShiftStateNone) return false; switch (optionGetMode ()) { case ShiftScreen::ModeCover: result = layoutThumbsCover (); break; case ShiftScreen::ModeFlip: result = layoutThumbsFlip (); break; } if (mState == ShiftStateIn) return false; return result; } void ShiftScreen::addWindowToList (CompWindow *w) { if (mWindowsSize <= mNWindows) { mWindows = (CompWindow **) realloc (mWindows, sizeof (CompWindow *) * (mNWindows + 32)); if (!mWindows) return; mWindowsSize = mNWindows + 32; } if (mSlotsSize <= mNWindows * 2) { mDrawSlots = (ShiftDrawSlot *) realloc (mDrawSlots, sizeof (ShiftDrawSlot) * ((mNWindows * 2) + 64)); if (!mDrawSlots) { free (mDrawSlots); return; } mSlotsSize = (mNWindows * 2) + 64; } mWindows[mNWindows++] = w; } bool ShiftScreen::updateWindowList () { CompWindow **wins; qsort (mWindows, mNWindows, sizeof (CompWindow *), compareWindows); mMvTarget = 0; mMvAdjust = 0; mMvVelocity = 0; for (int i = 0; i < mNWindows; ++i) { if (mWindows[i]->id () == mSelectedWindow) break; ++mMvTarget; } if (mMvTarget == mNWindows) mMvTarget = 0; /* create special window order to create a good animation * A,B,C,D,E --> A,B,D,E,C to get B,D,E,C,(A),B,D,E,C as initial state */ if (optionGetMode () == ShiftScreen::ModeCover) { int idx; wins = (CompWindow **) malloc(mNWindows * sizeof (CompWindow *)); if (!wins) return false; memcpy(wins, mWindows, mNWindows * sizeof (CompWindow *)); for (int i = 0; i < mNWindows; ++i) { idx = ceil (i * 0.5); idx *= (i & 1) ? 1 : -1; if (idx < 0) idx += mNWindows; mWindows[idx] = wins[i]; } free (wins); } return layoutThumbs (); } bool ShiftScreen::createWindowList () { mNWindows = 0; foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); if (sw->isShiftable ()) { addWindowToList (w); sw->mActive = true; } } return updateWindowList (); } void ShiftScreen::switchToWindow (bool toNext) { CompWindow *w; int cur; if (!mGrabIndex) return; for (cur = 0; cur < mNWindows; ++cur) { if (mWindows[cur]->id () == mSelectedWindow) break; } if (cur == mNWindows) return; if (toNext) w = mWindows[(cur + 1) % mNWindows]; else w = mWindows[(cur + mNWindows - 1) % mNWindows]; if (w) { Window old = mSelectedWindow; mSelectedWindow = w->id (); if (old != w->id ()) { if (toNext) mMvAdjust += 1; else mMvAdjust -= 1; mMoveAdjust = true; cScreen->damageScreen (); renderWindowTitle (); } } } int ShiftScreen::countWindows () { int count = 0; foreach (CompWindow *w, screen->windows ()) { if (ShiftWindow::get (w)->isShiftable ()) ++count; } return count; } int ShiftScreen::adjustShiftMovement (float chunk) { float dx = mMvAdjust; float adjust = dx * 0.15f; float amount = fabs(dx) * 1.5f; if (amount < 0.2f) amount = 0.2f; else if (amount > 2.0f) amount = 2.0f; mMvVelocity = (amount * mMvVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.002f && fabs (mMvVelocity) < 0.004f) { mMvVelocity = 0.0f; mMvTarget = mMvTarget + mMvAdjust; mMvAdjust = 0; layoutThumbs (); return false; } float change = mMvVelocity * chunk; if (!change && mMvVelocity) change = (mMvAdjust > 0) ? 0.01 : -0.01; mMvAdjust -= change; mMvTarget += change; while (mMvTarget >= mNWindows) { mMvTarget -= mNWindows; mInvert = !mInvert; } while (mMvTarget < 0) { mMvTarget += mNWindows; mInvert = !mInvert; } if (!layoutThumbs ()) return false; return true; } bool ShiftWindow::adjustShiftAttribs (float chunk) { float opacity, brightness; SHIFT_SCREEN (screen); if ((mActive && ss->mState != ShiftStateIn && ss->mState != ShiftStateNone) || (ss->optionGetHideAll () && !(window->type () & CompWindowTypeDesktopMask) && (ss->mState == ShiftStateOut || ss->mState == ShiftStateSwitching || ss->mState == ShiftStateFinish))) opacity = 0.0; else opacity = 1.0; if (ss->mState == ShiftStateIn || ss->mState == ShiftStateNone) brightness = 1.0; else brightness = ss->optionGetBackgroundIntensity (); float dp = opacity - mOpacity; float adjust = dp * 0.1f; float amount = fabs (dp) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mOpacityVelocity = (amount * mOpacityVelocity + adjust) / (amount + 1.0f); float db = brightness - mBrightness; adjust = db * 0.1f; amount = fabs (db) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; mBrightnessVelocity = (amount * mBrightnessVelocity + adjust) / (amount + 1.0f); /* FIXME: There is a possible floating point overflow here, * can be worked-around but not particularly nice */ if ((fabs (dp) < 0.1f && fabs (mOpacityVelocity) < 0.2f && fabs (db) < 0.1f && fabs (mBrightnessVelocity) < 0.2f) || (fabs(db) != fabs (db) || fabs (mOpacityVelocity) != fabs (mOpacityVelocity) || fabs (dp) != fabs (dp) || fabs (mBrightnessVelocity) != fabs (mBrightnessVelocity))) { mBrightness = brightness; mOpacity = opacity; return false; } mBrightness += mBrightnessVelocity * chunk; mOpacity += mOpacityVelocity * chunk; return true; } bool ShiftScreen::adjustShiftAnimationAttribs (float chunk) { float anim; if (mState != ShiftStateIn && mState != ShiftStateNone) anim = 1.0; else anim = 0.0; float dr = anim - mAnim; float adjust = dr * 0.1f; float amount = fabs (dr) * 7.0f; if (amount < 0.002f) amount = 0.002f; else if (amount > 0.15f) amount = 0.15f; mAnimVelocity = (amount * mAnimVelocity + adjust) / (amount + 1.0f); if (fabs (dr) < 0.002f && fabs (mAnimVelocity) < 0.004f) { mAnim = anim; return false; } mAnim += mAnimVelocity * chunk; return true; } bool ShiftScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (mState != ShiftStateNone) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; mPaintingAbove = false; mOutput = output; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (mState != ShiftStateNone && ((unsigned int) output->id () == (unsigned int) mUsedOutput || ((unsigned int) output->id () == (unsigned int) ~0))) { CompWindow *w; GLMatrix sTransform (transform); int oy1 = screen->outputDevs ()[mUsedOutput].region ()->extents.y1; int oy2 = screen->outputDevs ()[mUsedOutput].region ()->extents.y2; int maxThumbHeight = (oy2 - oy1) * optionGetSize () / 100; int oldFilter = gScreen->textureFilter (); int i; if (optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) { oy1 = 0; oy2 = screen->height (); } sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); /* Reflection drawing */ if (optionGetReflection ()) { GLMatrix rTransform = sTransform; GLMatrix r2Transform; GLushort colorData[4]; GLfloat vertexData[12]; int cull; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); glGetIntegerv (GL_CULL_FACE_MODE, &cull); int cullInv = (cull == GL_BACK)? GL_FRONT : GL_BACK; rTransform.translate (0.0, oy1 + oy2 + maxThumbHeight, 0.0); rTransform.scale (1.0, -1.0, 1.0); glCullFace (cullInv); if (optionGetMipmaps ()) gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); mReflectActive = true; mReflectBrightness = optionGetIntensity (); for (i = 0; i < mNSlots; ++i) { w = mDrawSlots[i].w; SHIFT_WINDOW (w); mActiveSlot = &mDrawSlots[i]; { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), rTransform, CompRegion::infinite (), 0); } } glCullFace (cull); glEnable(GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); r2Transform.translate (0.0, 0.0, -DEFAULT_Z_CAMERA); streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = 0; colorData[1] = 0; colorData[2] = 0; colorData[3] = 0; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); colorData[3] = MIN (1.0, 1.0 - optionGetIntensity ()) * 2.0 * mAnim; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); vertexData[0] = 0.5; vertexData[1] = 0; vertexData[2] = 0; vertexData[3] = -0.5; vertexData[4] = 0; vertexData[5] = 0; vertexData[6] = 0.5; vertexData[7] = -0.5; vertexData[8] = 0; vertexData[9] = -0.5; vertexData[10] = -0.5; vertexData[11] = 0; streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (r2Transform); if (optionGetGroundSize () > 0.0) { streamingBuffer->begin (GL_TRIANGLE_STRIP); colorData[0] = optionGetGroundColor1 ()[0]; colorData[1] = optionGetGroundColor1 ()[1]; colorData[2] = optionGetGroundColor1 ()[2]; colorData[3] = (float)optionGetGroundColor1 ()[3] * mAnim; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); colorData[3] = (float)optionGetGroundColor2 ()[3] * mAnim; streamingBuffer->addColors (1, colorData); streamingBuffer->addColors (1, colorData); vertexData[0] = -0.5; vertexData[1] = -0.5; vertexData[2] = 0; vertexData[3] = 0.5; vertexData[4] = -0.5; vertexData[5] = 0; vertexData[6] = -0.5; vertexData[7] = -0.5 + optionGetGroundSize (); vertexData[8] = 0; vertexData[9] = 0.5; vertexData[10] = -0.5 + optionGetGroundSize (); vertexData[11] = 0; streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (r2Transform); } glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_BLEND); } /* Drawing normal windows */ mReflectBrightness = 1.0; mReflectActive = false; for (i = 0; i < mNSlots; ++i) { w = mDrawSlots[i].w; SHIFT_WINDOW (w); mActiveSlot = &mDrawSlots[i]; { sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, CompRegion::infinite (), 0); } } mActiveSlot = NULL; gScreen->setTextureFilter (oldFilter); if (textAvailable && (mState != ShiftStateIn)) drawWindowTitle (sTransform); if (mState == ShiftStateIn || mState == ShiftStateOut) { bool found; mPaintingAbove = true; w = screen->findWindow (mSelectedWindow); for (; w; w = w->next) { if (w->destroyed () || (!w->shaded () && (!w->isViewable () || !CompositeWindow::get (w)->damaged ()))) continue; found = false; for (i = 0; i < mNWindows; ++i) { if (mWindows[i] == w) found = true; } if (found) continue; SHIFT_WINDOW (w); sw->gWindow->glPaint (sw->gWindow->paintAttrib (), sTransform, CompRegion::infinite (), 0); } mPaintingAbove = false; } } return status; } void ShiftScreen::paint (CompOutput::ptrList &outputs, unsigned int mask) { if (mState != ShiftStateNone && outputs.size () > 0 && optionGetMultioutputMode () == ShiftOptions::MultioutputModeOneBigSwitcher) { CompOutput::ptrList newOutputs; newOutputs.push_back (&screen->fullscreenOutput ()); cScreen->paint (newOutputs, mask); return; } cScreen->paint (outputs, mask); return; } void ShiftScreen::preparePaint (int msSinceLastPaint) { if (mState != ShiftStateNone && (mMoreAdjust || mMoveAdjust)) { float amount = msSinceLastPaint * 0.05f * optionGetShiftSpeed (); int steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; float chunk = amount / (float) steps; while (steps--) { mMoveAdjust = adjustShiftMovement (chunk); if (!mMoveAdjust) break; } amount = msSinceLastPaint * 0.05f * optionGetSpeed (); steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { mMoreAdjust = adjustShiftAnimationAttribs (chunk); foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); mMoreAdjust |= sw->adjustShiftAttribs (chunk); for (int i = 0; i < 2; ++i) { ShiftSlot *slot = &sw->mSlots[i]; slot->tx = slot->x - w->x () - (w->width () * slot->scale) / 2; slot->ty = slot->y - w->y () - (w->height () * slot->scale) / 2; } } if (!mMoreAdjust) break; } } cScreen->preparePaint (msSinceLastPaint); } bool ShiftWindow::canStackRelativeTo () { if (window->overrideRedirect () || (!window->shaded () && !window->pendingMaps () && (!window->isViewable () || window->mapNum () == 0))) return false; return true; } void ShiftScreen::donePaint () { if (mState != ShiftStateNone) { if (mMoreAdjust) cScreen->damageScreen (); else { if (mState == ShiftStateIn) { mState = ShiftStateNone; activateEvent (false); foreach (CompWindow *w, screen->windows ()) { SHIFT_WINDOW (w); sw->mActive = false; } setFunctions (false); cScreen->damageScreen (); } else if (mState == ShiftStateOut) mState = ShiftStateSwitching; if (mMoveAdjust) cScreen->damageScreen (); else if (mState == ShiftStateFinish) { CompWindow *w; mState = ShiftStateIn; mMoreAdjust = true; cScreen->damageScreen (); if (!mCancelled && mMvTarget != 0) { CompWindow *pw = NULL; for (int i = 0; i < mNSlots; ++i) { w = mDrawSlots[i].w; SHIFT_WINDOW (w); if (mDrawSlots[i].slot->primary && sw->canStackRelativeTo ()) { if (pw) w->restackAbove (pw); pw = w; } } } if (!mCancelled && mSelectedWindow) { w = screen->findWindow (mSelectedWindow); if (w) screen->sendWindowActivationRequest (mSelectedWindow); } } cScreen->damageScreen (); } } cScreen->donePaint (); } void ShiftScreen::term (bool cancel) { if (mGrabIndex) { screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; } if (mState != ShiftStateNone) { if (cancel && mMvTarget != 0) { if (mNWindows - mMvTarget > mMvTarget) mMvAdjust = -mMvTarget; else mMvAdjust = mNWindows - mMvTarget; mMoveAdjust = true; } mMoreAdjust = false; mMoveAdjust = false; mState = ShiftStateFinish; mCancelled = cancel; cScreen->damageScreen (); } } bool ShiftScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "root", 0); if (!(xid && screen->root () != xid)) { term ((state & CompAction::StateCancel)); if (action->state () & CompAction::StateTermButton) action->setState (action->state () & ~CompAction::StateTermButton); if (action->state () & CompAction::StateTermKey) action->setState (action->state () & ~CompAction::StateTermKey); } return false; } bool ShiftScreen::initiateScreen (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->otherGrabExist ("shift", NULL)) return false; mCurrentMatch = &(optionGetWindowMatch ()); CompMatch match = CompOption::getMatchOptionNamed ( options, "match", CompMatch::emptyMatch); if (match != CompMatch::emptyMatch) { mMatch = match; mMatch.update (); mCurrentMatch = &mMatch; } int count = countWindows (); if (count < 1) return false; if (!mGrabIndex) mGrabIndex = screen->pushGrab (screen->invisibleCursor (), "shift"); if (mGrabIndex) { mState = ShiftStateOut; activateEvent (true); if (!createWindowList ()) return false; mSelectedWindow = mWindows[0]->id (); renderWindowTitle (); mMvTarget = 0; mMvAdjust = 0; mMvVelocity = 0; mMoreAdjust = true; cScreen->damageScreen (); } mUsedOutput = screen->currentOutputDev ().id (); setFunctions (true); return true; } bool ShiftScreen::doSwitch (CompAction *action, CompAction::State state, CompOption::Vector &options, bool nextWindow, ShiftType type) { bool ret = true; bool initial = false; if ((mState == ShiftStateNone) || (mState == ShiftStateIn)) { if (type == ShiftTypeGroup) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { mType = ShiftTypeGroup; mClientLeader = (w->clientLeader ()) ? w->clientLeader () : w->id (); ret = initiateScreen (action, state, options); } } else { mType = type; ret = initiateScreen (action, state, options); } if (state & CompAction::StateInitKey) action->setState (state | CompAction::StateTermKey); if (state & CompAction::StateInitButton) action->setState (state | CompAction::StateTermButton); if (state & CompAction::StateInitEdge) action->setState (state | CompAction::StateTermEdge); initial = true; } if (ret) { switchToWindow (nextWindow); if (initial && false) { mMvTarget += mMvAdjust; mMvAdjust = 0.0; } } return ret; } bool ShiftScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options) { bool ret = true; mType = ShiftTypeNormal; if ((mState == ShiftStateNone) || (mState == ShiftStateIn) || (mState == ShiftStateFinish)) ret = initiateScreen (action, state, options); else ret = terminate (action, state, options); if (state & CompAction::StateTermButton) action->setState (state & ~CompAction::StateTermButton); if (state & CompAction::StateTermKey) action->setState (state & ~CompAction::StateTermKey); return ret; } bool ShiftScreen::initiateAll (CompAction *action, CompAction::State state, CompOption::Vector &options) { bool ret = true; mType = ShiftTypeAll; if ((mState == ShiftStateNone) || (mState == ShiftStateIn) || (mState == ShiftStateFinish)) ret = initiateScreen (action, state, options); else ret = terminate (action, state, options); if (state & CompAction::StateTermButton) action->setState (state & ~CompAction::StateTermButton); if (state & CompAction::StateTermKey) action->setState (state & ~CompAction::StateTermKey); return ret; } void ShiftScreen::windowRemove (Window id) { CompWindow *w = screen->findWindow (id); if (w) { bool inList = false; int j, i = 0; SHIFT_WINDOW (w); if (mState == ShiftStateNone || sw->isShiftable ()) return; Window selected = mSelectedWindow; while (i < mNWindows) { if (w->id () == mWindows[i]->id ()) { inList = true; if (w->id () == selected) { if (i < (mNWindows - 1)) selected = mWindows[i + 1]->id (); else selected = mWindows[0]->id (); mSelectedWindow = selected; } --mNWindows; for (j = i; j < mNWindows; ++j) mWindows[j] = mWindows[j + 1]; } else ++i; } if (!inList) return; if (mNWindows == 0) { CompOption o; CompOption::Vector opts; o = CompOption ("root", CompOption::TypeInt); o.value ().set ((int) screen->root ()); opts.push_back (o); terminate (NULL, 0, opts); return; } // Let the window list be updated to avoid crash // when a window is closed while ending shift (ShiftStateIn). if (!mGrabIndex && mState != ShiftStateIn) return; if (updateWindowList ()) { mMoreAdjust = true; mState = ShiftStateOut; cScreen->damageScreen (); } } } void ShiftScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_NAME) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) if (mGrabIndex && (w->id () == mSelectedWindow)) { renderWindowTitle (); cScreen->damageScreen (); } } break; case UnmapNotify: windowRemove (event->xunmap.window); break; case DestroyNotify: windowRemove (event->xdestroywindow.window); break; case KeyPress: if (mState == ShiftStateSwitching) { if (event->xkey.keycode == mLeftKey) switchToWindow (false); else if (event->xkey.keycode == mRightKey) switchToWindow (true); else if (event->xkey.keycode == mUpKey) switchToWindow (false); else if (event->xkey.keycode == mDownKey) switchToWindow (true); } break; case ButtonPress: if (mState == ShiftStateSwitching || mState == ShiftStateOut) { if (event->xbutton.button == Button5) switchToWindow (false); else if (event->xbutton.button == Button4) switchToWindow (true); if (event->xbutton.button == Button1) { mButtonPressTime = event->xbutton.time; mButtonPressed = true; mStartX = event->xbutton.x_root; mStartY = event->xbutton.y_root; mStartTarget = mMvTarget + mMvAdjust; } } break; case ButtonRelease: if ((mState == ShiftStateSwitching || mState == ShiftStateOut) && event->xbutton.button == Button1 && mButtonPressed) { int iNew; if ((int)(event->xbutton.time - mButtonPressTime) < optionGetClickDuration ()) term (false); mButtonPressTime = 0; mButtonPressed = false; if (mMvTarget - floor (mMvTarget) >= 0.5) { mMvAdjust = ceil(mMvTarget) - mMvTarget; iNew = ceil(mMvTarget); } else { mMvAdjust = floor(mMvTarget) - mMvTarget; iNew = floor(mMvTarget); } while (iNew < 0) iNew += mNWindows; iNew = iNew % mNWindows; mSelectedWindow = mWindows[iNew]->id (); renderWindowTitle (); mMoveAdjust = true; cScreen->damageScreen (); } break; case MotionNotify: if ((mState == ShiftStateSwitching || mState == ShiftStateOut) && mButtonPressed) { CompRect oe = screen->outputDevs ()[mUsedOutput]; float div = 0; int wx = 0; int wy = 0; int iNew; switch (optionGetMode ()) { case ShiftOptions::ModeCover: div = event->xmotion.x_root - mStartX; div /= oe.width () / optionGetMouseSpeed (); break; case ShiftOptions::ModeFlip: div = event->xmotion.y_root - mStartY; div /= oe.height () / optionGetMouseSpeed (); break; } mMvTarget = mStartTarget + div - mMvAdjust; mMoveAdjust = true; while (mMvTarget >= mNWindows) { mMvTarget -= mNWindows; mInvert = !mInvert; } while (mMvTarget < 0) { mMvTarget += mNWindows; mInvert = !mInvert; } if (mMvTarget - floor (mMvTarget) >= 0.5) iNew = ceil(mMvTarget); else iNew = floor(mMvTarget); while (iNew < 0) iNew += mNWindows; iNew = iNew % mNWindows; if (mSelectedWindow != mWindows[iNew]->id ()) { mSelectedWindow = mWindows[iNew]->id (); renderWindowTitle (); } if (event->xmotion.x_root < 50) wx = 50; if (screen->width () - event->xmotion.x_root < 50) wx = -50; if (event->xmotion.y_root < 50) wy = 50; if (screen->height () - event->xmotion.y_root < 50) wy = -50; if (wx != 0 || wy != 0) { screen->warpPointer (wx, wy); mStartX += wx; mStartY += wy; } cScreen->damageScreen (); } break; } } bool ShiftWindow::damageRect (bool initial, const CompRect &rect) { bool status = false; SHIFT_SCREEN (screen); if (initial) { if (ss->mGrabIndex && isShiftable ()) { ss->addWindowToList (window); if (ss->updateWindowList ()) { mActive = true; ss->mMoreAdjust = true; ss->mState = ShiftStateOut; ss->cScreen->damageScreen (); } } } else if (ss->mState == ShiftStateSwitching && mActive) { ss->cScreen->damageScreen (); status = true; } status |= cWindow->damageRect (initial, rect); return status; } ShiftScreen::ShiftScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mLeftKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Left"))), mRightKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Right"))), mUpKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Up"))), mDownKey (XKeysymToKeycode (screen->dpy (), XStringToKeysym ("Down"))), mGrabIndex (0), mState (ShiftStateNone), mMoreAdjust (false), mMvTarget (0), mMvVelocity (0), mInvert (false), mWindows (NULL), mNWindows (0), mWindowsSize (0), mDrawSlots (NULL), mNSlots (0), mSlotsSize (0), mActiveSlot (NULL), mSelectedWindow (0), mCurrentMatch (NULL), mUsedOutput (0), mAnim (0.0), mAnimVelocity (0.0), mButtonPressTime (0), mButtonPressed (false), mStartX (0), mStartY (0), mStartTarget (0.0f) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); #define SHIFTINITBIND(opt, func) \ optionSet##opt##Initiate (boost::bind (&ShiftScreen::func, \ this, _1, _2, _3)); #define SHIFTTERMBIND(opt, func) \ optionSet##opt##Terminate (boost::bind (&ShiftScreen::func, \ this, _1, _2, _3)); #define SHIFTSWITCHBIND(opt, func, next, type) \ optionSet##opt##Initiate (boost::bind (&ShiftScreen::func, \ this, _1, _2, _3, \ next, type)); /* Key actions */ SHIFTINITBIND (InitiateKey, initiate); SHIFTINITBIND (InitiateAllKey, initiateAll); SHIFTSWITCHBIND (NextKey, doSwitch, true, ShiftTypeNormal); SHIFTSWITCHBIND (PrevKey, doSwitch, false, ShiftTypeNormal); SHIFTSWITCHBIND (NextAllKey, doSwitch, true, ShiftTypeAll); SHIFTSWITCHBIND (PrevAllKey, doSwitch, false, ShiftTypeAll); SHIFTSWITCHBIND (NextGroupKey, doSwitch, true, ShiftTypeGroup); SHIFTSWITCHBIND (PrevGroupKey, doSwitch, false, ShiftTypeGroup); SHIFTTERMBIND (NextKey, terminate); SHIFTTERMBIND (PrevKey, terminate); SHIFTTERMBIND (NextAllKey, terminate); SHIFTTERMBIND (PrevAllKey, terminate); SHIFTTERMBIND (NextGroupKey, terminate); SHIFTTERMBIND (PrevGroupKey, terminate); SHIFTTERMBIND (InitiateKey, terminate); SHIFTTERMBIND (InitiateAllKey, terminate); /* Button Actions */ SHIFTINITBIND (InitiateButton, initiate); SHIFTINITBIND (InitiateAllButton, initiateAll); SHIFTSWITCHBIND (NextButton, doSwitch, true, ShiftTypeNormal); SHIFTSWITCHBIND (PrevButton, doSwitch, false, ShiftTypeNormal); SHIFTSWITCHBIND (NextAllButton, doSwitch, true, ShiftTypeAll); SHIFTSWITCHBIND (PrevAllButton, doSwitch, false, ShiftTypeAll); SHIFTSWITCHBIND (NextGroupButton, doSwitch, true, ShiftTypeGroup); SHIFTSWITCHBIND (PrevGroupButton, doSwitch, false, ShiftTypeGroup); SHIFTTERMBIND (NextButton, terminate); SHIFTTERMBIND (PrevButton, terminate); SHIFTTERMBIND (NextAllButton, terminate); SHIFTTERMBIND (PrevAllButton, terminate); SHIFTTERMBIND (NextGroupButton, terminate); SHIFTTERMBIND (PrevGroupButton, terminate); SHIFTTERMBIND (InitiateButton, terminate); SHIFTTERMBIND (InitiateAllButton, terminate); /* Edge Actions */ SHIFTINITBIND (InitiateEdge, initiate); SHIFTINITBIND (InitiateAllEdge, initiateAll); SHIFTTERMBIND (InitiateEdge, terminate); SHIFTTERMBIND (InitiateAllEdge, terminate); } ShiftScreen::~ShiftScreen () { freeWindowTitle (); if (mWindows) free (mWindows); if (mDrawSlots) free (mDrawSlots); } ShiftWindow::ShiftWindow (CompWindow *window) : PluginClassHandler (window), window (window), cWindow (CompositeWindow::get (window)), gWindow (GLWindow::get (window)), mOpacity (1.0), mBrightness (1.0), mOpacityVelocity (0.0f), mBrightnessVelocity (0.0f), mActive (false) { CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); mSlots[0].scale = 1.0; mSlots[1].scale = 1.0; } ShiftWindow::~ShiftWindow () { } bool ShiftPluginVTable::init () { if (CompPlugin::checkPluginABI ("text", COMPIZ_TEXT_ABI)) textAvailable = true; else { compLogMessage ("shift", CompLogLevelWarn, "No compatible text plugin"\ " loaded"); textAvailable = false; } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/shift/src/shift.h0000644000004100000410000001376113246301623016126 0ustar www-datawww-data/* * * Compiz shift switcher plugin * * shift.h * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@opencompositing.org * * * Based on ring.c: * Copyright : (C) 2007 by Danny Baumann * E-mail : maniac@opencompositing.org * * Based on scale.c and switcher.c: * Copyright : (C) 2007 David Reveman * E-mail : davidr@novell.com * * Rounded corner drawing taken from wall.c: * Copyright : (C) 2007 Robert Carr * E-mail : racarr@beryl-project.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include #include #include #include #include #include #include "shift_options.h" typedef enum { ShiftStateNone = 0, ShiftStateOut, ShiftStateSwitching, ShiftStateFinish, ShiftStateIn } ShiftState; typedef enum { ShiftTypeNormal = 0, ShiftTypeGroup, ShiftTypeAll } ShiftType; typedef struct _ShiftSlot { int x, y; /* thumb center coordinates */ float z; float scale; /* size scale (fits to maximal thumb size) */ float opacity; float rotation; GLfloat tx; GLfloat ty; bool primary; } ShiftSlot; typedef struct _ShiftDrawSlot { CompWindow *w; ShiftSlot *slot; float distance; } ShiftDrawSlot; class ShiftScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ShiftOptions { public: ShiftScreen (CompScreen *); ~ShiftScreen (); CompositeScreen *cScreen; GLScreen *gScreen; CompText text; public: void handleEvent (XEvent *); void preparePaint (int); void paint (CompOutput::ptrList &, unsigned int ); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); public: KeyCode mLeftKey; KeyCode mRightKey; KeyCode mUpKey; KeyCode mDownKey; CompScreen::GrabHandle mGrabIndex; ShiftState mState; ShiftType mType; bool mMoreAdjust; bool mMoveAdjust; float mMvTarget; float mMvAdjust; float mMvVelocity; bool mInvert; /* only used for sorting */ CompWindow **mWindows; int mNWindows; int mWindowsSize; ShiftDrawSlot *mDrawSlots; int mNSlots; int mSlotsSize; ShiftDrawSlot *mActiveSlot; Window mClientLeader; Window mSelectedWindow; CompMatch mMatch; CompMatch *mCurrentMatch; CompOutput *mOutput; int mUsedOutput; float mReflectBrightness; bool mReflectActive; float mAnim; float mAnimVelocity; int mButtonPressTime; bool mButtonPressed; int mStartX; int mStartY; float mStartTarget; float mLastTitle; bool mPaintingAbove; bool mCancelled; public: void activateEvent (bool activating); void freeWindowTitle (); void renderWindowTitle (); void drawWindowTitle (const GLMatrix &transform); bool layoutThumbsCover (); bool layoutThumbsFlip (); bool layoutThumbs (); void addWindowToList (CompWindow *w); bool updateWindowList (); bool createWindowList (); void switchToWindow (bool toNext); int countWindows (); int adjustShiftMovement (float chunk); bool adjustShiftAnimationAttribs (float chunk); void term (bool cancel); bool terminate (CompAction *action, CompAction::State aState, CompOption::Vector &options); bool initiateScreen (CompAction *action, CompAction::State aState, CompOption::Vector &options); bool doSwitch (CompAction *action, CompAction::State aState, CompOption::Vector &options, bool nextWindow, ShiftType type); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector &options); bool initiateAll (CompAction *action, CompAction::State aState, CompOption::Vector &options); void windowRemove (Window id); }; class ShiftWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: ShiftWindow (CompWindow *); ~ShiftWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; public: bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool initial, const CompRect &rect); public: ShiftSlot mSlots[2]; float mOpacity; float mBrightness; float mOpacityVelocity; float mBrightnessVelocity; bool mActive; public: bool adjustShiftAttribs (float chunk); bool canStackRelativeTo (); bool isShiftable (); }; extern const double PI; #define SHIFT_WINDOW(w) \ ShiftWindow *sw = ShiftWindow::get (w) #define SHIFT_SCREEN(s) \ ShiftScreen *ss = ShiftScreen::get (s) class ShiftPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/shift/shift.xml.in0000644000004100000410000003436213246301623016315 0ustar www-datawww-data <_short>Shift Switcher <_long>Shift between open windows using a cover or flip mode Window Management fade obs composite opengl text decor opengl <_short>Bindings <_short>General Options <_short>Mouse Settings <_short>Appearance Reflection Settings <_short>Shift Mode <_short>Flip Mode <_short>Cover Mode <_short>Window Title Display ./plugins/text/0000755000004100000410000000000013246301624013711 5ustar www-datawww-data./plugins/text/CMakeLists.txt0000644000004100000410000000022513246301623016447 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (text PLUGINDEPS composite opengl PKGDEPS pangocairo cairo cairo-xlib-xrender) ./plugins/text/compiz-text.pc.in0000644000004100000410000000044113246301623017123 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-text Description: Text plugin for compiz Version: @VERSION@ Requires: compiz pangocairo cairo cairo-xlib-xrender Libs: -L${libdir}/compiz -ltext Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz ./plugins/text/include/0000755000004100000410000000000013246301623015333 5ustar www-datawww-data./plugins/text/include/text/0000755000004100000410000000000013246301624016320 5ustar www-datawww-data./plugins/text/include/text/text.h0000644000004100000410000000520713246301623017460 0ustar www-datawww-data/* * text.h - adds text image support to compiz. * Copyright: (C) 2006 Patrick Niklaus * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef _COMPIZ_TEXT_H #define _COMPIZ_TEXT_H #define COMPIZ_TEXT_ABI 20090905 class CompText { public: /** * Flags to be passed into the flags field of CompTextAttrib */ typedef enum { StyleBold = (1 << 0), /**< render the text in bold */ StyleItalic = (1 << 1), /**< render the text italic */ Ellipsized = (1 << 2), /**< ellipsize the text if the specified maximum size is too small */ WithBackground = (1 << 3), /**< render a rounded rectangle as background behind the text */ NoAutoBinding = (1 << 4) /**< do not automatically bind the rendered text pixmap to a texture */ } Flags; typedef struct { const char *family; /**< font family */ int size; /**< font size in points */ unsigned short color[4]; /**< font color (RGBA) */ unsigned int flags; /**< rendering flags, see above */ int maxWidth; /**< maximum width of the generated pixmap */ int maxHeight; /**< maximum height of the generated pixmap */ int bgHMargin; /**< horizontal margin in pixels (offset of text into background) */ int bgVMargin; /**< vertical margin */ unsigned short bgColor[4]; /**< background color (RGBA) */ } Attrib; CompText (); ~CompText(); bool renderText (CompString text, const Attrib &attrib); bool renderWindowTitle (Window window, bool renderViewportNumber, const Attrib &attrib); void clear (); Pixmap getPixmap (); int getWidth () const; int getHeight () const; void draw (const GLMatrix &transform, float x, float y, float alpha) const; private: int width; int height; Pixmap pixmap; GLTexture::List texture; }; #endif ./plugins/text/src/0000755000004100000410000000000013246301624014500 5ustar www-datawww-data./plugins/text/src/private.h0000644000004100000410000000535113246301623016326 0ustar www-datawww-data/* * Compiz text plugin * Description: Adds text to pixmap support to Compiz. * * private.h * * Copyright: (C) 2006-2007 Patrick Niklaus, Danny Baumann, Dennis Kasprzyk * Authors: Patrick Niklaus * Danny Baumann * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include class PrivateTextScreen; extern template class PluginClassHandler ; class PrivateTextScreen : public PluginClassHandler , public ScreenInterface, public GLScreenInterface { public: PrivateTextScreen (CompScreen *); ~PrivateTextScreen (); CompString getWindowName (Window id); GLScreen *gScreen; private: Atom visibleNameAtom; Atom utf8StringAtom; Atom wmNameAtom; CompString getUtf8Property (Window id, Atom atom); CompString getTextProperty (Window id, Atom atom); }; class TextSurface { public: TextSurface (); ~TextSurface (); bool valid () const; bool render (const CompText::Attrib &attrib, const CompString &text); int mWidth; int mHeight; Pixmap mPixmap; private: bool initCairo (int w, int h); bool update (int w, int h); void drawBackground (int x, int y, int width, int height, int radius); cairo_t *cr; cairo_surface_t *surface; PangoLayout *layout; XRenderPictFormat *format; PangoFontDescription *font; Screen *scrn; }; #define TEXT_SCREEN(screen) \ PrivateTextScreen *ts = PrivateTextScreen::get (screen); class TextPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); void fini (); }; ./plugins/text/src/text.cpp0000644000004100000410000003300713246301623016172 0ustar www-datawww-data/* * Compiz text plugin * Description: Adds text to pixmap support to Compiz. * * text.cpp * * Copyright: (C) 2006-2007 Patrick Niklaus, Danny Baumann, Dennis Kasprzyk * Authors: Patrick Niklaus * Danny Baumann * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "private.h" static const double PI = 3.14159265359f; COMPIZ_PLUGIN_20090315 (text, TextPluginVTable); CompString PrivateTextScreen::getUtf8Property (Window id, Atom atom) { Atom type; int format; unsigned long nItems, bytesAfter; char *val; CompString retval; int result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False, utf8StringAtom, &type, &format, &nItems, &bytesAfter, (unsigned char **) &val); if (result != Success) return retval; if (type == utf8StringAtom && format == 8 && val && nItems > 0) { char valueString[nItems + 1]; strncpy (valueString, val, nItems); valueString[nItems] = 0; retval = valueString; } if (val) XFree (val); return retval; } CompString PrivateTextScreen::getTextProperty (Window id, Atom atom) { XTextProperty text; CompString retval; text.nitems = 0; if (XGetTextProperty (screen->dpy (), id, &text, atom) && text.value) { char valueString[text.nitems + 1]; strncpy (valueString, (char *) text.value, text.nitems); valueString[text.nitems] = 0; retval = valueString; XFree (text.value); } return retval; } CompString PrivateTextScreen::getWindowName (Window id) { CompString name = getUtf8Property (id, visibleNameAtom); if (name.empty ()) name = getUtf8Property (id, wmNameAtom); if (name.empty ()) name = getTextProperty (id, XA_WM_NAME); return name; } /* Actual text rendering functions */ /* * Draw a rounded rectangle path */ void TextSurface::drawBackground (int x, int y, int width, int height, int radius) { int x0 = x; int y0 = y; int x1 = x + width; int y1 = y + height; const float halfPi = PI / 2.0f; const float triHalfPi = halfPi * 3; cairo_new_path (cr); cairo_arc (cr, x0 + radius, y1 - radius, radius, halfPi, PI); cairo_line_to (cr, x0, y0 + radius); cairo_arc (cr, x0 + radius, y0 + radius, radius, PI, triHalfPi); cairo_line_to (cr, x1 - radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, triHalfPi, 2 * PI); cairo_line_to (cr, x1, y1 - radius); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0, halfPi); cairo_close_path (cr); } bool TextSurface::initCairo (int width, int height) { Display *dpy = screen->dpy (); mPixmap = None; if (width > 0 && height > 0) mPixmap = XCreatePixmap (dpy, screen->root (), width, height, 32); mWidth = width; mHeight = height; if (!mPixmap) { compLogMessage ("text", CompLogLevelError, "Couldn't create %d x %d pixmap.", width, height); return false; } surface = cairo_xlib_surface_create_with_xrender_format (dpy, mPixmap, scrn, format, width, height); if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) { compLogMessage ("text", CompLogLevelError, "Couldn't create surface."); return false; } cr = cairo_create (surface); if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { compLogMessage ("text", CompLogLevelError, "Couldn't create cairo context."); return false; } return true; } bool TextSurface::update (int width, int height) { Display *dpy = screen->dpy (); cairo_surface_destroy (surface); surface = NULL; cairo_destroy (cr); cr = NULL; XFreePixmap (dpy, mPixmap); mPixmap = None; return initCairo (width, height); } bool TextSurface::render (const CompText::Attrib &attrib, const CompString &text) { if (!valid ()) return false; pango_font_description_set_family (font, attrib.family); pango_font_description_set_absolute_size (font, attrib.size * PANGO_SCALE); pango_font_description_set_style (font, PANGO_STYLE_NORMAL); if (attrib.flags & CompText::StyleBold) pango_font_description_set_weight (font, PANGO_WEIGHT_BOLD); if (attrib.flags & CompText::StyleItalic) pango_font_description_set_style (font, PANGO_STYLE_ITALIC); pango_layout_set_font_description (layout, font); if (attrib.flags & CompText::Ellipsized) pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); pango_layout_set_auto_dir (layout, false); pango_layout_set_text (layout, text.c_str (), -1); int width, height; pango_layout_get_pixel_size (layout, &width, &height); if (attrib.flags & CompText::WithBackground) { width += 2 * attrib.bgHMargin; height += 2 * attrib.bgVMargin; } width = MIN (attrib.maxWidth, width); height = MIN (attrib.maxHeight, height); /* update the size of the pango layout */ int layoutWidth = attrib.maxWidth; if (attrib.flags & CompText::WithBackground) layoutWidth -= 2 * attrib.bgHMargin; pango_layout_set_width (layout, layoutWidth * PANGO_SCALE); if (!update (width, height)) return false; pango_cairo_update_layout (cr, layout); cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (attrib.flags & CompText::WithBackground) { drawBackground (0, 0, width, height, MIN (attrib.bgHMargin, attrib.bgVMargin)); cairo_set_source_rgba (cr, attrib.bgColor[0] / 65535.0, attrib.bgColor[1] / 65535.0, attrib.bgColor[2] / 65535.0, attrib.bgColor[3] / 65535.0); cairo_fill (cr); cairo_move_to (cr, attrib.bgHMargin, attrib.bgVMargin); } cairo_set_source_rgba (cr, attrib.color[0] / 65535.0, attrib.color[1] / 65535.0, attrib.color[2] / 65535.0, attrib.color[3] / 65535.0); pango_cairo_show_layout (cr, layout); return true; } bool TextSurface::valid () const { return scrn && format && layout && font && cr && cairo_status (cr) == CAIRO_STATUS_SUCCESS && surface && cairo_surface_status (surface) == CAIRO_STATUS_SUCCESS; } TextSurface::TextSurface () : mWidth (0), mHeight (0), mPixmap (None), cr (NULL), surface (NULL), layout (NULL), format (NULL), font (NULL), scrn (NULL) { Display *dpy = screen->dpy (); scrn = ScreenOfDisplay (dpy, screen->screenNum ()); if (!scrn) { compLogMessage ("text", CompLogLevelError, "Couldn't get screen for %d.", screen->screenNum ()); return; } format = XRenderFindStandardFormat (dpy, PictStandardARGB32); if (!format) { compLogMessage ("text", CompLogLevelError, "Couldn't get format."); return; } if (!initCairo (1, 1)) return; /* init pango */ layout = pango_cairo_create_layout (cr); if (!layout) { compLogMessage ("text", CompLogLevelError, "Couldn't create pango layout."); return; } font = pango_font_description_new (); if (!font) { compLogMessage ("text", CompLogLevelError, "Couldn't create font description."); return; } } TextSurface::~TextSurface () { if (layout) g_object_unref (layout); if (surface) cairo_surface_destroy (surface); if (cr) cairo_destroy (cr); if (font) pango_font_description_free (font); } void CompText::clear () { if (pixmap) XFreePixmap (screen->dpy (), pixmap); width = 0; height = 0; } bool CompText::renderText (CompString text, const Attrib &attrib) { TextSurface surface; bool retval = false; TEXT_SCREEN (screen); if (!ts || !surface.valid () || (!(attrib.flags & NoAutoBinding) && !ts->gScreen)) return false; if (surface.render (attrib, text)) { if (!(attrib.flags & NoAutoBinding)) { texture = GLTexture::bindPixmapToTexture (surface.mPixmap, surface.mWidth, surface.mHeight, 32); retval = !texture.empty (); } else retval = true; } if (!retval && surface.mPixmap) { XFreePixmap (screen->dpy (), surface.mPixmap); return retval; } clear (); pixmap = surface.mPixmap; width = surface.mWidth; height = surface.mHeight; return retval; } bool CompText::renderWindowTitle (Window window, bool withViewportNumber, const CompText::Attrib &attrib) { TEXT_SCREEN (screen); if (!ts) return false; CompString text; if (withViewportNumber) { CompString title = ts->getWindowName (window); if (!title.empty ()) { CompWindow *w = screen->findWindow (window); if (w) { CompPoint winViewport = w->defaultViewport (); CompSize viewportSize = screen->vpSize (); int viewport = winViewport.y () * viewportSize.width () + winViewport.x () + 1; text = compPrintf ("%s -[%d]-", title.c_str (), viewport); } else text = title; } } else text = ts->getWindowName (window); if (text.empty ()) return false; return renderText (text, attrib); } Pixmap CompText::getPixmap () { Pixmap retval = None; if (texture.empty ()) { retval = pixmap; pixmap = None; } return retval; } int CompText::getWidth () const { return width; } int CompText::getHeight () const { return height; } void CompText::draw (const GLMatrix &transform, float x, float y, float alpha) const { if (texture.empty ()) return; GLint oldBlendSrc, oldBlendDst; #ifdef USE_GLES GLint oldBlendSrcAlpha, oldBlendDstAlpha; glGetIntegerv (GL_BLEND_SRC_RGB, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST_RGB, &oldBlendDst); glGetIntegerv (GL_BLEND_SRC_ALPHA, &oldBlendSrcAlpha); glGetIntegerv (GL_BLEND_DST_ALPHA, &oldBlendDstAlpha); #else glGetIntegerv (GL_BLEND_SRC, &oldBlendSrc); glGetIntegerv (GL_BLEND_DST, &oldBlendDst); GLboolean wasBlend = glIsEnabled (GL_BLEND); if (!wasBlend) glEnable (GL_BLEND); #endif glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GLushort colorData[4]; GLfloat textureData[8]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLTexture *tex; GLTexture::Matrix m; GLfloat xPlusWidth = x + width; GLfloat yMinusHeight = y - height; colorData[0] = alpha * 65535; colorData[1] = alpha * 65535; colorData[2] = alpha * 65535; colorData[3] = alpha * 65535; for (unsigned int i = 0; i < texture.size (); ++i) { tex = texture[i]; m = tex->matrix (); tex->enable (GLTexture::Good); streamingBuffer->begin (GL_TRIANGLE_STRIP); vertexData[0] = x; vertexData[1] = yMinusHeight; vertexData[2] = 0; vertexData[3] = x; vertexData[4] = y; vertexData[5] = 0; vertexData[6] = xPlusWidth; vertexData[7] = yMinusHeight; vertexData[8] = 0; vertexData[9] = xPlusWidth; vertexData[10] = y; vertexData[11] = 0; textureData[0] = COMP_TEX_COORD_X (m, 0); textureData[1] = COMP_TEX_COORD_Y (m, 0); textureData[2] = COMP_TEX_COORD_X (m, 0); textureData[3] = COMP_TEX_COORD_Y (m, height); textureData[4] = COMP_TEX_COORD_X (m, width); textureData[5] = COMP_TEX_COORD_Y (m, 0); textureData[6] = COMP_TEX_COORD_X (m, width); textureData[7] = COMP_TEX_COORD_Y (m, height); streamingBuffer->addColors (1, colorData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->end (); streamingBuffer->render (transform); tex->disable (); } #ifdef USE_GLES glBlendFuncSeparate (oldBlendSrc, oldBlendDst, oldBlendSrcAlpha, oldBlendDstAlpha); #else if (!wasBlend) glDisable (GL_BLEND); glBlendFunc (oldBlendSrc, oldBlendDst); #endif } CompText::CompText () : width (0), height (0), pixmap (None) { } CompText::~CompText () { if (pixmap) XFreePixmap (screen->dpy (), pixmap); } template class PluginClassHandler ; PrivateTextScreen::PrivateTextScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)) { visibleNameAtom = XInternAtom (screen->dpy (), "_NET_WM_VISIBLE_NAME", 0); utf8StringAtom = XInternAtom (screen->dpy (), "UTF8_STRING", 0); wmNameAtom = XInternAtom (screen->dpy (), "_NET_WM_NAME", 0); } PrivateTextScreen::~PrivateTextScreen () { } bool TextPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) { CompPrivate p; p.uval = COMPIZ_TEXT_ABI; screen->storeValue ("text_ABI", p); return true; } return false; } void TextPluginVTable::fini () { screen->eraseValue ("text_ABI"); } ./plugins/text/text.xml.in0000644000004100000410000000062313246301623016024 0ustar www-datawww-data <_short>Text <_long>Render text to texture Image Loading opengl composite opengl decor ./plugins/decor/0000755000004100000410000000000013246301624014021 5ustar www-datawww-data./plugins/decor/CMakeLists.txt0000644000004100000410000000135613246301623016565 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include (CompizCommon) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/clip-groups/include/) include_directories (${CMAKE_CURRENT_SOURCE_DIR}/src/pixmap-requests/include/) compiz_plugin(decor PLUGINDEPS composite opengl LIBRARIES decoration compiz_decor_clip_groups compiz_decor_pixmap_requests) add_subdirectory (src/clip-groups) add_subdirectory (src/pixmap-requests) if (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_DECOR) set_target_properties ( decor PROPERTIES INSTALL_RPATH "${COMPIZ_LIBDIR}" ) endif (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_DECOR) install (PROGRAMS "src/compiz-decorator" DESTINATION ${exec_prefix}) add_subdirectory (tests) ./plugins/decor/src/0000755000004100000410000000000013246301624014610 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/0000755000004100000410000000000013246301623017756 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/CMakeLists.txt0000644000004100000410000000216213246301623022517 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/pixmap-requests.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/pixmap-requests.cpp ) ADD_LIBRARY( compiz_decor_pixmap_requests STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_decor_pixmap_requests PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_decor_pixmap_requests compiz_core ${GLIBMM_LIBRARIES} ) ./plugins/decor/src/pixmap-requests/include/0000755000004100000410000000000013246301624021402 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/include/pixmap-requests.h0000644000004100000410000001461313246301623024726 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_DECOR_PIXMAP_REQUESTS_H #define _COMPIZ_DECOR_PIXMAP_REQUESTS_H #include #include #include #include #include #include #include #include class DecorPixmapInterface : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~DecorPixmapInterface () {}; virtual Pixmap getPixmap () = 0; }; class DecorPixmapReceiverInterface : boost::noncopyable { public: virtual ~DecorPixmapReceiverInterface () {} virtual void pending () = 0; virtual void update () = 0; }; /* So far, nothing particularly interesting here * we just need a way to pass around pointers for * testing */ class DecorationInterface : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~DecorationInterface () {} virtual DecorPixmapReceiverInterface & receiverInterface () = 0; virtual unsigned int getFrameType () const = 0; virtual unsigned int getFrameState () const = 0; virtual unsigned int getFrameActions () const = 0; }; class PixmapDestroyQueue : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~PixmapDestroyQueue () {} virtual int destroyUnusedPixmap (Pixmap pixmap) = 0; }; class UnusedPixmapQueue : boost::noncopyable { public: typedef boost::shared_ptr Ptr; virtual ~UnusedPixmapQueue () {} virtual void markUnused (Pixmap pixmap) = 0; }; class PixmapReleasePool : public PixmapDestroyQueue, public UnusedPixmapQueue { public: typedef boost::function FreePixmapFunc; typedef boost::shared_ptr Ptr; PixmapReleasePool (const FreePixmapFunc &freePixmap); void markUnused (Pixmap pixmap); int destroyUnusedPixmap (Pixmap pixmap); private: std::list mPendingUnusedNotificationPixmaps; FreePixmapFunc mFreePixmap; }; class DecorPixmap : public DecorPixmapInterface { public: typedef boost::shared_ptr Ptr; DecorPixmap (Pixmap p, PixmapDestroyQueue::Ptr deletor); ~DecorPixmap (); Pixmap getPixmap (); private: Pixmap mPixmap; PixmapDestroyQueue::Ptr mDeletor; }; class DecorPixmapRequestorInterface : boost::noncopyable { public: virtual ~DecorPixmapRequestorInterface () {} virtual int postGenerateRequest (unsigned int frameType, unsigned int frameState, unsigned int frameActions) = 0; virtual void handlePending (const long *data) = 0; }; class DecorationListFindMatchingInterface { public: virtual ~DecorationListFindMatchingInterface () {} virtual DecorationInterface::Ptr findMatchingDecoration (unsigned int frameType, unsigned int frameState, unsigned int frameActions) const = 0; virtual DecorationInterface::Ptr findMatchingDecoration (Pixmap pixmap) const = 0; }; namespace compiz { namespace decor { typedef boost::function DecorListForWindow; typedef boost::function RequestorForWindow; class PendingHandler : virtual boost::noncopyable { public: PendingHandler (const RequestorForWindow &); void handleMessage (Window window, const long *data); private: RequestorForWindow mRequestorForWindow; }; class UnusedHandler : virtual boost::noncopyable { public: UnusedHandler (const DecorListForWindow &, const UnusedPixmapQueue::Ptr &, const PixmapReleasePool::FreePixmapFunc &); void handleMessage (Window, Pixmap); private: DecorListForWindow mListForWindow; UnusedPixmapQueue::Ptr mQueue; PixmapReleasePool::FreePixmapFunc mFreePixmap; }; namespace protocol { typedef boost::function PendingMessage; typedef boost::function PixmapUnusedMessage; class Communicator : virtual boost::noncopyable { public: Communicator (Atom pendingMsg, Atom unusedMsg, const PendingMessage &, const PixmapUnusedMessage &); void handleClientMessage (const XClientMessageEvent &); private: Atom mPendingMsgAtom; Atom mUnusedMsgAtom; PendingMessage mPendingHandler; PixmapUnusedMessage mPixmapUnusedHander; }; } } } class X11DecorPixmapRequestor : public DecorPixmapRequestorInterface { public: X11DecorPixmapRequestor (Display *dpy, Window xid, DecorationListFindMatchingInterface *listFinder); int postGenerateRequest (unsigned int frameType, unsigned int frameState, unsigned int frameActions); void handlePending (const long *data); private: Display *mDpy; Window mWindow; DecorationListFindMatchingInterface *mListFinder; }; class X11DecorPixmapReceiver : public DecorPixmapReceiverInterface { public: static const unsigned int UpdateRequested = 1 << 0; static const unsigned int UpdatesPending = 1 << 1; X11DecorPixmapReceiver (DecorPixmapRequestorInterface *, DecorationInterface *decor); void pending (); void update (); private: unsigned int mUpdateState; DecorPixmapRequestorInterface *mDecorPixmapRequestor; DecorationInterface *mDecoration; }; #endif ./plugins/decor/src/pixmap-requests/src/0000755000004100000410000000000013246301624020546 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/src/pixmap-requests.cpp0000644000004100000410000001131113246301623024415 0ustar www-datawww-data#include "pixmap-requests.h" #include #include #ifndef foreach #define foreach BOOST_FOREACH #endif namespace cd = compiz::decor; namespace cdp = compiz::decor::protocol; DecorPixmap::DecorPixmap (Pixmap pixmap, PixmapDestroyQueue::Ptr d) : mPixmap (pixmap), mDeletor (d) { } DecorPixmap::~DecorPixmap () { mDeletor->destroyUnusedPixmap (mPixmap); } Pixmap DecorPixmap::getPixmap () { return mPixmap; } X11DecorPixmapReceiver::X11DecorPixmapReceiver (DecorPixmapRequestorInterface *requestor, DecorationInterface *decor) : mUpdateState (0), mDecorPixmapRequestor (requestor), mDecoration (decor) { } void X11DecorPixmapReceiver::pending () { if (mUpdateState & X11DecorPixmapReceiver::UpdateRequested) mUpdateState |= X11DecorPixmapReceiver::UpdatesPending; else { mUpdateState |= X11DecorPixmapReceiver::UpdateRequested; mDecorPixmapRequestor->postGenerateRequest (mDecoration->getFrameType (), mDecoration->getFrameState (), mDecoration->getFrameActions ()); } } void X11DecorPixmapReceiver::update () { if (mUpdateState & X11DecorPixmapReceiver::UpdatesPending) mDecorPixmapRequestor->postGenerateRequest (mDecoration->getFrameType (), mDecoration->getFrameState (), mDecoration->getFrameActions ()); mUpdateState = 0; } X11DecorPixmapRequestor::X11DecorPixmapRequestor (Display *dpy, Window window, DecorationListFindMatchingInterface *listFinder) : mDpy (dpy), mWindow (window), mListFinder (listFinder) { } int X11DecorPixmapRequestor::postGenerateRequest (unsigned int frameType, unsigned int frameState, unsigned int frameActions) { return decor_post_generate_request (mDpy, mWindow, frameType, frameState, frameActions); } void X11DecorPixmapRequestor::handlePending (const long *data) { DecorationInterface::Ptr d = mListFinder->findMatchingDecoration (static_cast (data[0]), static_cast (data[1]), static_cast (data[2])); if (d) d->receiverInterface ().pending (); else postGenerateRequest (static_cast (data[0]), static_cast (data[1]), static_cast (data[2])); } namespace { typedef PixmapReleasePool::FreePixmapFunc FreePixmapFunc; } PixmapReleasePool::PixmapReleasePool (const FreePixmapFunc &freePixmap) : mFreePixmap (freePixmap) { } void PixmapReleasePool::markUnused (Pixmap pixmap) { mPendingUnusedNotificationPixmaps.push_back (pixmap); mPendingUnusedNotificationPixmaps.unique (); } int PixmapReleasePool::destroyUnusedPixmap (Pixmap pixmap) { std::list ::iterator it = std::find (mPendingUnusedNotificationPixmaps.begin (), mPendingUnusedNotificationPixmaps.end (), pixmap); if (it != mPendingUnusedNotificationPixmaps.end ()) { Pixmap pixmap (*it); mPendingUnusedNotificationPixmaps.erase (it); mFreePixmap (pixmap); } return 0; } cd::PendingHandler::PendingHandler (const cd::RequestorForWindow &requestorForWindow) : mRequestorForWindow (requestorForWindow) { } void cd::PendingHandler::handleMessage (Window window, const long *data) { DecorPixmapRequestorInterface *requestor = mRequestorForWindow (window); if (requestor) requestor->handlePending (data); } cd::UnusedHandler::UnusedHandler (const cd::DecorListForWindow &listForWindow, const UnusedPixmapQueue::Ptr &queue, const FreePixmapFunc &freePixmap) : mListForWindow (listForWindow), mQueue (queue), mFreePixmap (freePixmap) { } void cd::UnusedHandler::handleMessage (Window window, Pixmap pixmap) { DecorationListFindMatchingInterface *findMatching = mListForWindow (window); if (findMatching) { DecorationInterface::Ptr decoration (findMatching->findMatchingDecoration (pixmap)); if (decoration) { mQueue->markUnused (pixmap); return; } } /* If a decoration was not found, then this pixmap is no longer in use * and we should free it */ mFreePixmap (pixmap); } cdp::Communicator::Communicator (Atom pendingMsg, Atom unusedMsg, const cdp::PendingMessage &pending, const cdp::PixmapUnusedMessage &pixmapUnused) : mPendingMsgAtom (pendingMsg), mUnusedMsgAtom (unusedMsg), mPendingHandler (pending), mPixmapUnusedHander (pixmapUnused) { } void cdp::Communicator::handleClientMessage (const XClientMessageEvent &xce) { if (xce.message_type == mPendingMsgAtom) mPendingHandler (xce.window, xce.data.l); else if (xce.message_type == mUnusedMsgAtom) mPixmapUnusedHander (xce.window, xce.data.l[0]); } ./plugins/decor/src/pixmap-requests/tests/0000755000004100000410000000000013246301624021121 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/tests/CMakeLists.txt0000644000004100000410000000147513246301623023667 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_decor_pixmap_requests_mock STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_decor_pixmap_requests_mock.cpp) target_link_libraries (compiz_decor_pixmap_requests_mock compiz_decor_pixmap_requests) add_executable (compiz_test_decor_pixmap_requests ${CMAKE_CURRENT_SOURCE_DIR}/test-decor-pixmap-requests.cpp) target_link_libraries (compiz_test_decor_pixmap_requests compiz_decor_pixmap_requests compiz_decor_pixmap_requests_mock decoration ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_decor_pixmap_requests COVERAGE compiz_decor_pixmap_requests) add_subdirectory (integration) ./plugins/decor/src/pixmap-requests/tests/compiz_decor_pixmap_requests_mock.cpp0000644000004100000410000000514613246301623030631 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "compiz_decor_pixmap_requests_mock.h" /* These exist purely because the implicit details of the * constructors of the MOCK_METHODs are quite complex. We can * save compilation time by generating those constructors once, * and linking, rather than generating multiple definitions and * having the linker eliminate them */ MockDecorPixmapDeletor::MockDecorPixmapDeletor () { } MockDecorPixmapDeletor::~MockDecorPixmapDeletor () { } MockDecorPixmapReceiver::MockDecorPixmapReceiver () { } MockDecorPixmapReceiver::~MockDecorPixmapReceiver () { } MockDecoration::MockDecoration () { } MockDecoration::~MockDecoration () { } MockDecorationListFindMatching::MockDecorationListFindMatching () { } MockDecorationListFindMatching::~MockDecorationListFindMatching () { } MockDecorPixmapRequestor::MockDecorPixmapRequestor () { } MockDecorPixmapRequestor::~MockDecorPixmapRequestor () { } XlibPixmapMock::XlibPixmapMock () { } XlibPixmapMock::~XlibPixmapMock () { } MockFindRequestor::MockFindRequestor () { } MockFindRequestor::~MockFindRequestor () { } MockFindList::MockFindList () { } MockFindList::~MockFindList () { } MockUnusedPixmapQueue::MockUnusedPixmapQueue () { } MockUnusedPixmapQueue::~MockUnusedPixmapQueue () { } MockProtocolDispatchFuncs::MockProtocolDispatchFuncs () { } MockProtocolDispatchFuncs::~MockProtocolDispatchFuncs () { } ./plugins/decor/src/pixmap-requests/tests/pixmap-requests/0000755000004100000410000000000013246301623024267 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/tests/pixmap-requests/src/0000755000004100000410000000000013246301623025056 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/tests/test-decor-pixmap-requests.cpp0000644000004100000410000002705513246301623027053 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include "pixmap-requests.h" #include "compiz_decor_pixmap_requests_mock.h" using ::testing::AtLeast; using ::testing::Pointee; using ::testing::Return; using ::testing::ReturnNull; using ::testing::IsNull; using ::testing::_; namespace cd = compiz::decor; namespace cdp = compiz::decor::protocol; TEST(DecorPixmapRequestsTest, TestDestroyPixmapDeletes) { boost::shared_ptr mockDeletor = boost::make_shared (); DecorPixmap pm (1, mockDeletor); EXPECT_CALL (*(mockDeletor.get ()), destroyUnusedPixmap (1)).WillOnce (Return (1)); } TEST(DecorPixmapRequestsTest, TestPendingGeneratesRequest) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); } TEST(DecorPixmapRequestsTest, TestPendingGeneratesOnlyOneRequest) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); receiver.pending (); } TEST(DecorPixmapRequestsTest, TestUpdateGeneratesRequestIfNewOnePending) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); receiver.pending (); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.update (); } TEST(DecorPixmapRequestsTest, TestUpdateGeneratesNoRequestIfNoNewOnePending) { MockDecorPixmapRequestor mockRequestor; MockDecoration mockDecoration; X11DecorPixmapReceiver receiver (&mockRequestor, &mockDecoration); EXPECT_CALL (mockDecoration, getFrameActions ()).WillOnce (Return (3)); EXPECT_CALL (mockDecoration, getFrameState ()).WillOnce (Return (2)); EXPECT_CALL (mockDecoration, getFrameType ()).WillOnce (Return (1)); EXPECT_CALL (mockRequestor, postGenerateRequest (1, 2, 3)); receiver.pending (); receiver.update (); } class DecorPixmapReleasePool : public ::testing::Test { public: DecorPixmapReleasePool () : mockFreeFunc (boost::bind (&XlibPixmapMock::freePixmap, &xlibPixmapMock, _1)), releasePool (mockFreeFunc) { } XlibPixmapMock xlibPixmapMock; PixmapReleasePool::FreePixmapFunc mockFreeFunc; PixmapReleasePool releasePool; }; TEST_F (DecorPixmapReleasePool, MarkUnusedNoFree) { /* Never free pixmaps on markUnused */ EXPECT_CALL (xlibPixmapMock, freePixmap (_)).Times (0); releasePool.markUnused (static_cast (1)); } TEST_F (DecorPixmapReleasePool, NoFreeOnPostDeleteIfNotInList) { EXPECT_CALL (xlibPixmapMock, freePixmap (_)).Times (0); releasePool.destroyUnusedPixmap (static_cast (1)); } TEST_F (DecorPixmapReleasePool, FreeOnPostDeleteIfMarkedUnused) { EXPECT_CALL (xlibPixmapMock, freePixmap (1)).Times (1); releasePool.markUnused (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); } TEST_F (DecorPixmapReleasePool, FreeOnPostDeleteIfMarkedUnusedOnceOnly) { EXPECT_CALL (xlibPixmapMock, freePixmap (1)).Times (1); releasePool.markUnused (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); } TEST_F (DecorPixmapReleasePool, UnusedUniqueness) { EXPECT_CALL (xlibPixmapMock, freePixmap (1)).Times (1); releasePool.markUnused (static_cast (1)); releasePool.markUnused (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); releasePool.destroyUnusedPixmap (static_cast (1)); } class DecorPendingMessageHandler : public ::testing::Test { public: DecorPendingMessageHandler () : pendingHandler (boost::bind (&MockFindRequestor::findRequestor, &mockRequestorFind, _1)) { } MockFindRequestor mockRequestorFind; MockDecorPixmapRequestor mockRequestor; cd::PendingHandler pendingHandler; }; namespace { Window mockWindow = 1; } TEST_F (DecorPendingMessageHandler, NoPendingIfNotFound) { EXPECT_CALL (mockRequestor, handlePending (_)).Times (0); EXPECT_CALL (mockRequestorFind, findRequestor (mockWindow)).WillOnce (ReturnNull ()); long data = 1; pendingHandler.handleMessage (mockWindow, &data); } TEST_F (DecorPendingMessageHandler, PendingIfFound) { long data = 1; EXPECT_CALL (mockRequestor, handlePending (Pointee (data))); EXPECT_CALL (mockRequestorFind, findRequestor (mockWindow)).WillOnce (Return (&mockRequestor)); pendingHandler.handleMessage (mockWindow, &data); } class DecorUnusedMessageHandler : public ::testing::Test { public: DecorUnusedMessageHandler () : mockUnusedPixmapQueue (new MockUnusedPixmapQueue ()), unusedHandler (boost::bind (&MockFindList::findList, &mockListFind, _1), mockUnusedPixmapQueue, boost::bind (&XlibPixmapMock::freePixmap, &xlibPixmapMock, _1)) { } MockFindList mockListFind; MockDecorationListFindMatching mockListFinder; MockUnusedPixmapQueue::Ptr mockUnusedPixmapQueue; XlibPixmapMock xlibPixmapMock; cd::UnusedHandler unusedHandler; }; namespace { Pixmap mockPixmap = 2; } TEST_F (DecorUnusedMessageHandler, FreeImmediatelyWindowNotFound) { /* Don't verify calls to mockListFind */ EXPECT_CALL (mockListFind, findList (_)).Times (AtLeast (0)); /* Just free the pixmap immediately if no window was found */ EXPECT_CALL (xlibPixmapMock, freePixmap (mockPixmap)).Times (1); ON_CALL (mockListFind, findList (mockWindow)).WillByDefault (ReturnNull ()); unusedHandler.handleMessage (mockWindow, mockPixmap); } TEST_F (DecorUnusedMessageHandler, FreeImmediatelyIfNoDecorationFound) { /* Don't verify calls to mockListFind or mockListFinder */ EXPECT_CALL (mockListFind, findList (_)).Times (AtLeast (0)); EXPECT_CALL (mockListFinder, findMatchingDecoration (_)).Times (AtLeast (0)); EXPECT_CALL (xlibPixmapMock, freePixmap (mockPixmap)).Times (1); ON_CALL (mockListFind, findList (mockWindow)) .WillByDefault (Return (&mockListFinder)); ON_CALL (mockListFinder, findMatchingDecoration (mockPixmap)) .WillByDefault (Return (DecorationInterface::Ptr ())); unusedHandler.handleMessage (mockWindow, mockPixmap); } TEST_F (DecorUnusedMessageHandler, AddToQueueIfInUse) { /* Don't verify calls to mockListFind or mockListFinder */ EXPECT_CALL (mockListFind, findList (_)).Times (AtLeast (0)); EXPECT_CALL (mockListFinder, findMatchingDecoration (_)).Times (AtLeast (0)); DecorationInterface::Ptr mockDecoration (new StubDecoration ()); /* Do not immediately free the pixmap */ EXPECT_CALL (xlibPixmapMock, freePixmap (mockPixmap)).Times (0); EXPECT_CALL (*mockUnusedPixmapQueue, markUnused (mockPixmap)).Times (1); ON_CALL (mockListFind, findList (mockWindow)) .WillByDefault (Return (&mockListFinder)); ON_CALL (mockListFinder, findMatchingDecoration (mockPixmap)) .WillByDefault (Return (mockDecoration)); unusedHandler.handleMessage (mockWindow, mockPixmap); } namespace { Atom pendingMsg = 3; Atom unusedMsg = 4; } class DecorProtocolCommunicator : public ::testing::Test { public: DecorProtocolCommunicator () : handlePendingFunc (boost::bind (&MockProtocolDispatchFuncs::handlePending, &mockProtoDispatch, _1, _2)), handleUnusedFunc (boost::bind (&MockProtocolDispatchFuncs::handleUnused, &mockProtoDispatch, _1, _2)), protocolCommunicator (pendingMsg, unusedMsg, handlePendingFunc, handleUnusedFunc) { } void ClientMessageData (XClientMessageEvent &msg, Window window, Atom atom, long l1, long l2, long l3, long l4) { msg.window = window; msg.message_type = atom; msg.data.l[0] = l1; msg.data.l[1] = l2; msg.data.l[2] = l3; msg.data.l[3] = l4; } MockProtocolDispatchFuncs mockProtoDispatch; cdp::PendingMessage handlePendingFunc; cdp::PixmapUnusedMessage handleUnusedFunc; cdp::Communicator protocolCommunicator; }; MATCHER_P (MatchArray3, v, "Contains values") { return arg[0] == v[0] && arg[1] == v[1] && arg[2] == v[2]; } TEST_F (DecorProtocolCommunicator, TestDispatchToPendingHandler) { long data[3]; data[0] = 1; data[1] = 2; data[2] = 3; XClientMessageEvent ev; ClientMessageData (ev, mockWindow, pendingMsg, data[0], data[1], data[2], 0); EXPECT_CALL (mockProtoDispatch, handlePending (mockWindow, MatchArray3 (data))) .Times (1); protocolCommunicator.handleClientMessage (ev); } TEST_F (DecorProtocolCommunicator, TestDispatchToUnusedHandler) { XClientMessageEvent ev; ClientMessageData (ev, mockWindow, unusedMsg, mockPixmap, 0, 0, 0); EXPECT_CALL (mockProtoDispatch, handleUnused (mockWindow, mockPixmap)) .Times (1); protocolCommunicator.handleClientMessage (ev); } ./plugins/decor/src/pixmap-requests/tests/compiz_decor_pixmap_requests_mock.h0000644000004100000410000001027413246301623030274 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_DECOR_PIXMAP_REQUESTS_MOCK_H #define _COMPIZ_DECOR_PIXMAP_REQUESTS_MOCK_H #include #include #include #include "pixmap-requests.h" class MockDecorPixmapDeletor : public PixmapDestroyQueue { public: MockDecorPixmapDeletor (); ~MockDecorPixmapDeletor (); MOCK_METHOD1 (destroyUnusedPixmap, int (Pixmap p)); }; class MockDecorPixmapReceiver : public DecorPixmapReceiverInterface { public: MockDecorPixmapReceiver (); ~MockDecorPixmapReceiver (); MOCK_METHOD0 (pending, void ()); MOCK_METHOD0 (update, void ()); }; class MockDecoration : public DecorationInterface { public: MockDecoration (); ~MockDecoration (); MOCK_METHOD0 (receiverInterface, DecorPixmapReceiverInterface & ()); MOCK_CONST_METHOD0 (getFrameType, unsigned int ()); MOCK_CONST_METHOD0 (getFrameState, unsigned int ()); MOCK_CONST_METHOD0 (getFrameActions, unsigned int ()); }; class MockDecorationListFindMatching : public DecorationListFindMatchingInterface { public: MockDecorationListFindMatching (); ~MockDecorationListFindMatching (); MOCK_CONST_METHOD3 (findMatchingDecoration, DecorationInterface::Ptr (unsigned int, unsigned int, unsigned int)); MOCK_CONST_METHOD1 (findMatchingDecoration, DecorationInterface::Ptr (Pixmap)); }; class MockDecorPixmapRequestor : public DecorPixmapRequestorInterface { public: MockDecorPixmapRequestor (); ~MockDecorPixmapRequestor (); MOCK_METHOD3 (postGenerateRequest, int (unsigned int, unsigned int, unsigned int)); MOCK_METHOD1 (handlePending, void (const long *)); }; class XlibPixmapMock { public: XlibPixmapMock (); ~XlibPixmapMock (); MOCK_METHOD1(freePixmap, int (Pixmap)); }; class MockFindRequestor { public: MockFindRequestor (); ~MockFindRequestor (); MOCK_METHOD1 (findRequestor, DecorPixmapRequestorInterface * (Window)); }; class MockFindList { public: MockFindList (); ~MockFindList (); MOCK_METHOD1 (findList, DecorationListFindMatchingInterface * (Window)); }; class MockUnusedPixmapQueue : public UnusedPixmapQueue { public: MockUnusedPixmapQueue (); ~MockUnusedPixmapQueue (); typedef boost::shared_ptr Ptr; MOCK_METHOD1 (markUnused, void (Pixmap)); }; class StubReceiver : public DecorPixmapReceiverInterface { public: void pending () {} void update () {} }; class StubDecoration : public DecorationInterface { public: DecorPixmapReceiverInterface & receiverInterface () { return mReceiver; } unsigned int getFrameType () const { return 0; } unsigned int getFrameState () const { return 0; } unsigned int getFrameActions () const { return 0; } private: StubReceiver mReceiver; }; class MockProtocolDispatchFuncs { public: MockProtocolDispatchFuncs (); ~MockProtocolDispatchFuncs (); MOCK_METHOD2 (handlePending, void (Window, const long *)); MOCK_METHOD2 (handleUnused, void (Window, Pixmap)); }; #endif ./plugins/decor/src/pixmap-requests/tests/integration/0000755000004100000410000000000013246301623023443 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/tests/integration/CMakeLists.txt0000644000004100000410000000003613246301623026202 0ustar www-datawww-dataadd_subdirectory (xorg-gtest) ./plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/0000755000004100000410000000000013246301623025546 5ustar www-datawww-data./plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/CMakeLists.txt0000644000004100000410000000305713246301623030313 0ustar www-datawww-datainclude (FindPkgConfig) if (BUILD_XORG_GTEST) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS} ${COMPIZ_DECOR_PIXMAP_PROTOCOL_INTEGRATION_INCLUDE_DIRS}) link_directories (${X11_XI_LIBRARY_DIRS} ${COMPIZ_COMPOSITE_DAMAGETRACKING_INTEGRATION_LIBRARY_DIRS}) add_executable (compiz_test_decor_pixmap_protocol_integration ${CMAKE_CURRENT_SOURCE_DIR}/compiz_test_decor_pixmap_protocol_integration.cpp) set (COMPIZ_DECOR_PIXMAP_PROTOCOL_XORG_INTEGRATION_TEST_LIBRARIES xorg_gtest_all compiz_xorg_gtest_main compiz_xorg_gtest_system_test compiz_decor_pixmap_requests compiz_decor_pixmap_requests_mock decoration ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES} ${COMPIZ_DECOR_PIXMAP_PROTOCOL_INTEGRATION_LIBRARIES}) target_link_libraries (compiz_test_decor_pixmap_protocol_integration ${COMPIZ_DECOR_PIXMAP_PROTOCOL_XORG_INTEGRATION_TEST_LIBRARIES}) compiz_discover_tests (compiz_test_decor_pixmap_protocol_integration WITH_XORG_GTEST COVERAGE compiz_decor_pixmap_requests) endif (BUILD_XORG_GTEST) ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootroot./plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/compiz_test_decor_pixmap_protocol_integration.cpp./plugins/decor/src/pixmap-requests/tests/integration/xorg-gtest/compiz_test_decor_pixmap_protocol_i0000644000004100000410000002661613246301623035027 0ustar www-datawww-data/* * Compiz XOrg GTest Decoration Pixmap Protocol Integration Tests * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include "decoration.h" #include #include #include "pixmap-requests.h" #include "compiz_decor_pixmap_requests_mock.h" namespace xt = xorg::testing; namespace ct = compiz::testing; namespace cd = compiz::decor; namespace cdp = compiz::decor::protocol; using ::testing::AtLeast; using ::testing::ReturnNull; using ::testing::Return; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::_; class DecorPixmapProtocol : public xorg::testing::Test { public: typedef boost::function ClientMessageReceiver; void SetUp (); void WaitForClientMessageOnAndDeliverTo (Window client, Atom message, const ClientMessageReceiver &receiver); protected: Atom deletePixmapMessage; Atom pendingMessage; }; namespace { bool Advance (Display *d, bool result) { return ct::AdvanceToNextEventOnSuccess (d, result); } Window MOCK_WINDOW = 1; Pixmap MOCK_PIXMAP = 2; class MockClientMessageReceiver { public: MOCK_METHOD1 (receiveMsg, void (const XClientMessageEvent &)); }; class DisplayFetch { public: virtual ~DisplayFetch () {} virtual ::Display * Display () const = 0; }; class XFreePixmapWrapper { public: XFreePixmapWrapper (const DisplayFetch &df) : mDisplayFetch (df) { } int FreePixmap (Pixmap pixmap) { return XFreePixmap (mDisplayFetch.Display (), pixmap); } private: const DisplayFetch &mDisplayFetch; }; class XErrorTracker { public: XErrorTracker (); ~XErrorTracker (); MOCK_METHOD1 (errorHandler, void (int)); private: XErrorHandler handler; static int handleXError (Display *dpy, XErrorEvent *ev); static XErrorTracker *tracker; }; XErrorTracker * XErrorTracker::tracker = NULL; XErrorTracker::XErrorTracker () { tracker = this; handler = XSetErrorHandler (handleXError); } XErrorTracker::~XErrorTracker () { tracker = NULL; XSetErrorHandler (handler); } int XErrorTracker::handleXError (Display *dpy, XErrorEvent *ev) { tracker->errorHandler (ev->error_code); return 0; } bool PixmapValid (Display *d, Pixmap p) { Window root; unsigned int width, height, border, depth; int x, y; XErrorTracker tracker; EXPECT_CALL (tracker, errorHandler (BadDrawable)).Times (AtLeast (0)); bool success = XGetGeometry (d, p, &root, &x, &y, &width, &height, &border, &depth); return success; } } void DecorPixmapProtocol::SetUp () { xorg::testing::Test::SetUp (); XSelectInput (Display (), DefaultRootWindow (Display ()), StructureNotifyMask); deletePixmapMessage = XInternAtom (Display (), DECOR_DELETE_PIXMAP_ATOM_NAME, 0); pendingMessage = XInternAtom (Display (), DECOR_PIXMAP_PENDING_ATOM_NAME, 0); } class DeliveryMatcher : public ct::XEventMatcher { public: DeliveryMatcher (Atom message, const DecorPixmapProtocol::ClientMessageReceiver &receiver) : mMessage (message), mReceiver (receiver) { } bool MatchAndExplain (const XEvent &xce, MatchResultListener *listener) const { if (xce.xclient.message_type == mMessage) { mReceiver (reinterpret_cast (xce)); return true; } else return false; } void DescribeTo (std::ostream *os) const { *os << "Message delivered"; } private: Atom mMessage; DecorPixmapProtocol::ClientMessageReceiver mReceiver; }; void DecorPixmapProtocol::WaitForClientMessageOnAndDeliverTo (Window client, Atom message, const ClientMessageReceiver &receiver) { ::Display *d = Display (); DeliveryMatcher delivery (message, receiver); ASSERT_TRUE (Advance (d, ct::WaitForEventOfTypeOnWindowMatching (d, client, ClientMessage, -1, -1, delivery))); } TEST_F (DecorPixmapProtocol, PostDeleteCausesClientMessage) { MockClientMessageReceiver receiver; ::Display *d = Display (); decor_post_delete_pixmap (d, MOCK_WINDOW, MOCK_PIXMAP); EXPECT_CALL (receiver, receiveMsg (_)).Times (1); WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&MockClientMessageReceiver::receiveMsg, &receiver, _1)); } TEST_F (DecorPixmapProtocol, PostDeleteDispatchesClientMessageToReceiver) { MockProtocolDispatchFuncs dispatch; cdp::Communicator communicator (pendingMessage, deletePixmapMessage, boost::bind (&MockProtocolDispatchFuncs::handlePending, &dispatch, _1, _2), boost::bind (&MockProtocolDispatchFuncs::handleUnused, &dispatch, _1, _2)); decor_post_delete_pixmap (Display (), MOCK_WINDOW, MOCK_PIXMAP); EXPECT_CALL (dispatch, handleUnused (MOCK_WINDOW, MOCK_PIXMAP)).Times (1); WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, &communicator, _1)); } /* Test end to end. Post the delete message and cause the pixmap to be freed */ class DecorPixmapProtocolEndToEnd : public DecorPixmapProtocol, public DisplayFetch { public: DecorPixmapProtocolEndToEnd () : freePixmap (*this), releasePool (new PixmapReleasePool ( boost::bind (&XFreePixmapWrapper::FreePixmap, &freePixmap, _1))), pendingHandler (boost::bind (&MockFindRequestor::findRequestor, &mockFindRequestor, _1)), unusedHandler (boost::bind (&MockFindList::findList, &mockFindList, _1), releasePool, boost::bind (&XFreePixmapWrapper::FreePixmap, &freePixmap, _1)), stubDecoration (new StubDecoration ()) { } void SetUp () { DecorPixmapProtocol::SetUp (); communicator.reset (new cdp::Communicator ( pendingMessage, deletePixmapMessage, boost::bind (&cd::PendingHandler::handleMessage, &pendingHandler, _1, _2), boost::bind (&cd::UnusedHandler::handleMessage, &unusedHandler, _1, _2))); } ::Display * Display () const { return DecorPixmapProtocol::Display (); } XFreePixmapWrapper freePixmap; PixmapReleasePool::Ptr releasePool; cd::PendingHandler pendingHandler; cd::UnusedHandler unusedHandler; boost::shared_ptr communicator; MockFindList mockFindList; MockFindRequestor mockFindRequestor; StubDecoration::Ptr stubDecoration; MockDecorPixmapRequestor mockRequestor; MockDecorationListFindMatching mockFindMatching; }; class DecorPixmapProtocolDeleteEndToEnd : public DecorPixmapProtocolEndToEnd { public: void SetUp () { DecorPixmapProtocolEndToEnd::SetUp (); ::Display *d = Display (); pixmap = XCreatePixmap (d, DefaultRootWindow (d), 1, 1, DefaultDepth (d, DefaultScreen (d))); decor_post_delete_pixmap (d, MOCK_WINDOW, pixmap); } void TearDown () { if (PixmapValid (Display (), pixmap)) XFreePixmap (Display (), pixmap); } protected: Pixmap pixmap; }; TEST_F (DecorPixmapProtocolDeleteEndToEnd, TestFreeNotFoundWindowPixmapImmediately) { ::Display *d = Display (); EXPECT_CALL (mockFindList, findList (MOCK_WINDOW)).WillOnce (ReturnNull ()); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); /* Check if the pixmap is still valid */ EXPECT_FALSE (PixmapValid (d, pixmap)); } TEST_F (DecorPixmapProtocolDeleteEndToEnd, TestFreeUnusedPixmapImmediately) { ::Display *d = Display (); EXPECT_CALL (mockFindMatching, findMatchingDecoration (pixmap)).WillOnce (Return (DecorationInterface::Ptr ())); EXPECT_CALL (mockFindList, findList (MOCK_WINDOW)).WillOnce (Return (&mockFindMatching)); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); /* Check if the pixmap is still valid */ EXPECT_FALSE (PixmapValid (d, pixmap)); } TEST_F (DecorPixmapProtocolDeleteEndToEnd, TestQueuePixmapIfUsed) { ::Display *d = Display (); EXPECT_CALL (mockFindMatching, findMatchingDecoration (pixmap)).WillOnce (Return (stubDecoration)); EXPECT_CALL (mockFindList, findList (MOCK_WINDOW)).WillOnce (Return (&mockFindMatching)); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, deletePixmapMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); /* Check if the pixmap is still valid */ EXPECT_TRUE (PixmapValid (d, pixmap)); /* Call destroyUnusedPixmap on the release pool, it should release * the pixmap which was otherwise unused */ releasePool->destroyUnusedPixmap (pixmap); /* Pixmap should now be invalid */ EXPECT_FALSE (PixmapValid (d, pixmap)); } class DecorPixmapProtocolPendingEndToEnd : public DecorPixmapProtocolEndToEnd { public: DecorPixmapProtocolPendingEndToEnd () : frameType (1), frameState (2), frameActions (3) { } void SetUp () { DecorPixmapProtocolEndToEnd::SetUp (); ::Display *d = Display (); decor_post_pending (d, MOCK_WINDOW, frameType, frameState, frameActions); } protected: unsigned int frameType, frameState, frameActions; }; MATCHER_P3 (MatchArrayValues3, v1, v2, v3, "Matches three array values") { return static_cast (arg[0]) == v1 && static_cast (arg[1]) == v2 && static_cast (arg[2]) == v3; } TEST_F (DecorPixmapProtocolPendingEndToEnd, TestPostPendingMarksAsPendingOnClient) { EXPECT_CALL (mockFindRequestor, findRequestor (MOCK_WINDOW)).WillOnce (Return (&mockRequestor)); EXPECT_CALL (mockRequestor, handlePending (MatchArrayValues3 (frameType, frameState, frameActions))); /* Deliver it to the communicator */ WaitForClientMessageOnAndDeliverTo (MOCK_WINDOW, pendingMessage, boost::bind (&cdp::Communicator::handleClientMessage, communicator.get (), _1)); } ./plugins/decor/src/decor.cpp0000644000004100000410000024211513246301623016414 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "decor.h" #include #include COMPIZ_PLUGIN_20090315 (decor, DecorPluginVTable) namespace cwe = compiz::window::extents; namespace { void updateRegionWithShapeRectangles (Display *dpy, Window w, CompRegion ®ion) { int n = 0; int order = 0; XRectangle *shapeRects = NULL; shapeRects = XShapeGetRectangles (dpy, w, ShapeInput, &n, &order); if (!shapeRects) return; for (int i = 0; i < n; i++) region += CompRegion (shapeRects[i].x, shapeRects[i].y, shapeRects[i].width, shapeRects[i].height); XFree (shapeRects); } } MatchedDecorClipGroup::MatchedDecorClipGroup (const CompMatch &match) : mMatch (match) { } bool MatchedDecorClipGroup::doPushClippable (DecorClippableInterface *dc) { if (dc->matches (mMatch)) return mClipGroupImpl.pushClippable (dc); return false; } void DecorWindow::doUpdateShadow (const CompRegion ®) { shadowRegion = outputRegion () - (reg - inputRegion ()); } void DecorWindow::doSetOwner (DecorClipGroupInterface *i) { mClipGroup = i; } bool DecorWindow::doMatches (const CompMatch &m) { return const_cast (m).evaluate (window) && !window->invisible (); } const CompRegion & DecorWindow::getOutputRegion () { return mOutputRegion; } const CompRegion & DecorWindow::getInputRegion () { return mInputRegion; } void DecorWindow::doUpdateGroupShadows () { if (mClipGroup) mClipGroup->updateAllShadows (); } /* From core */ /* * DecorWindow::glDraw * * Handles the drawing of the actual decoration texture * (whether that be the bound pixmap for a window type * decoration or a redirected scaled-quad pixmap for * pixmap type decorations). * * For pixmap type decorations, we need to use the precomputed * shadow region for the clipping region of when we draw the * window decoration with glDrawTexture. We also need to add * geometry for each quad on the pixmap decoration so that it * stretches from its original size to the size of the actual * window. * * Usually, this works something like this * * ----------------------------------- * | Q1 | Buttons ... Text (Q2) | Q3 | * ----------------------------------- * | Q4 | | Q5 | * ----------------------------------- * | Q6 | Q7 | Q8 | * ----------------------------------- * * * --------------------------------------------------- * | Q1 | Buttons ... Text (Q2) | Q3 | * --------------------------------------------------- * | Q4 | | Q5 | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * | | | | * --------------------------------------------------- * | Q6 | Q7 | Q8 | * --------------------------------------------------- * * Note here that quads 2, 4, 5 and 7 are scaled according * to the matrix supplied on each quad structure. * * FIXME: This doesn't work with multiple textures, that * needs work to determine the quads for each separate texture * * For window type decorations we add geometry for the frame * region of the window. * * Next, we draw the actual texture with the saved window geometry * */ bool DecorWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status; status = gWindow->glDraw (transform, attrib, region, mask); /* Don't render dock decorations (shadows) on just any old window */ if (!(window->type () & CompWindowTypeDockMask)) { glDecorate (transform, attrib, region, mask); /* Render dock decorations (shadows) on desktop windows only */ if (window->type () & CompWindowTypeDesktopMask) { foreach (CompWindow *w, dScreen->cScreen->getWindowPaintList ()) { bool isDock = w->type () & CompWindowTypeDockMask; bool drawShadow = !(w->invisible () || w->destroyed ()); if (isDock && drawShadow) { DecorWindow *d = DecorWindow::get (w); /* If the last mask was an occlusion pass, glPaint * return value will mean something different, so * remove it */ unsigned int pmask = d->gWindow->lastMask () & ~(PAINT_WINDOW_OCCLUSION_DETECTION_MASK); /* Check if the window would draw by seeing if glPaint * returns true when using PAINT_NO_CORE_INSTANCE_MASK */ pmask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; const GLWindowPaintAttrib &pAttrib (d->gWindow->paintAttrib ()); if (d->gWindow->glPaint (pAttrib, transform, region, pmask)) d->glDecorate (transform, pAttrib, region, mask); } } } } return status; } void DecorWindow::glDecorate (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { if (wd && wd->decor->type == WINDOW_DECORATION_TYPE_PIXMAP) { CompRect box; GLTexture::MatrixList ml (1); mask |= PAINT_WINDOW_BLEND_MASK; gWindow->vertexBuffer ()->begin (); const CompRegion *preg = NULL; if ((mask & (PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK | PAINT_WINDOW_WITH_OFFSET_MASK))) preg = ®ion; else if (mask & PAINT_WINDOW_TRANSFORMED_MASK) preg = &CompRegion::infinite (); else if (mClipGroup) { tmpRegion = mOutputRegion; tmpRegion &= region; tmpRegion &= shadowRegion; preg = &tmpRegion; } else preg = ®ion; /* In case some plugin needs to paint us with an offset region */ if (preg->isEmpty ()) preg = ®ion; const CompRegion ® (*preg); if (updateMatrix) updateDecorationScale (); for (int i = 0; i < wd->nQuad; i++) { box.setGeometry (wd->quad[i].box.x1, wd->quad[i].box.y1, wd->quad[i].box.x2 - wd->quad[i].box.x1, wd->quad[i].box.y2 - wd->quad[i].box.y1); if (box.width () > 0 && box.height () > 0) { ml[0] = wd->quad[i].matrix; const CompRegionRef boxRegion (box.region ()); gWindow->glAddGeometry (ml, boxRegion, reg); } } if (gWindow->vertexBuffer ()->end ()) { glEnable (GL_BLEND); gWindow->glDrawTexture (wd->decor->texture->textures[0], transform, attrib, mask); glDisable (GL_BLEND); } } else if (wd && wd->decor->type == WINDOW_DECORATION_TYPE_WINDOW) { GLTexture::MatrixList ml (1); if (gWindow->textures ().empty ()) gWindow->bind (); if (gWindow->textures ().empty ()) return; if (updateMatrix) updateDecorationScale (); glEnable (GL_BLEND); if (gWindow->textures ().size () == 1) { ml[0] = gWindow->matrices ()[0]; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (ml, window->frameRegion (), region); if (gWindow->vertexBuffer ()->end ()) gWindow->glDrawTexture (gWindow->textures ()[0], transform, attrib, mask); } else { if (updateReg) updateWindowRegions (); for (unsigned int i = 0; i < gWindow->textures ().size (); i++) { ml[0] = gWindow->matrices ()[i]; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (ml, regions[i], region); if (gWindow->vertexBuffer ()->end ()) gWindow->glDrawTexture (gWindow->textures ()[i], transform, attrib, mask); } } glDisable (GL_BLEND); } } static bool bindFailed; /* * DecorTexture::DecorTexture * * Creates a texture for a given pixmap in the property. * bindFailed is a global variable used to determine if * binding to a pixmap gave us more than one texture since * FIXME that isn't supported yet. Also sets damage handlers * for this pixmap */ DecorTexture::DecorTexture (DecorPixmapInterface::Ptr pixmap) : status (true), refCount (1), pixmap (pixmap), damage (None) { unsigned int width, height, depth, ui; Window root; int i; if (!XGetGeometry (screen->dpy (), pixmap->getPixmap (), &root, &i, &i, &width, &height, &ui, &depth)) { status = false; return; } bindFailed = false; textures = GLTexture::bindPixmapToTexture (pixmap->getPixmap (), width, height, depth, compiz::opengl::ExternallyManaged); if (textures.size () != 1) { bindFailed = true; status = false; return; } if (!DecorScreen::get (screen)->optionGetMipmap ()) textures[0]->setMipmap (false); damage = XDamageCreate (screen->dpy (), pixmap->getPixmap (), XDamageReportBoundingBox); } /* * DecorTexture::~DecorTexture * * Remove damage handle on texture * */ DecorTexture::~DecorTexture () { if (damage) XDamageDestroy (screen->dpy (), damage); } /* * DecorScreen::getTexture * * Returns the texture for a given pixmap. Note * that if this particular pixmap was already found * in the list of decor textures, then the refcount * is increased and that one is returned instead of * binding a new texture. * */ DecorTexture * DecorScreen::getTexture (Pixmap pixmap) { if (!cmActive) return NULL; foreach (DecorTexture *t, textures) if (t->pixmap->getPixmap () == pixmap) { t->refCount++; return t; } DecorPixmap::Ptr pm = boost::make_shared (pixmap, mReleasePool); DecorTexture *texture = new DecorTexture (pm); if (!texture->status) { delete texture; return NULL; } textures.push_back (texture); return texture; } /* * DecorScreen::releaseTexture * * Unreferences the texture, deletes the texture from * the list of textures if its no longer in use */ void DecorScreen::releaseTexture (DecorTexture *texture) { texture->refCount--; if (texture->refCount) return; std::list::iterator it = std::find (textures.begin (), textures.end (), texture); if (it == textures.end ()) return; textures.erase (it); delete texture; } /* * computeQuadBox * * Determines a scaled quad box for the decor plugin * by determining the x2 and y2 points by either clamping * or stretching the box. Also applies gravity to determine * relative x1 and y1 points to the window * */ static void computeQuadBox (decor_quad_t *q, int width, int height, int *return_x1, int *return_y1, int *return_x2, int *return_y2, float *return_sx, float *return_sy) { int x1, y1, x2, y2; float sx = 1.0f; float sy = 1.0f; decor_apply_gravity (q->p1.gravity, q->p1.x, q->p1.y, width, height, &x1, &y1); decor_apply_gravity (q->p2.gravity, q->p2.x, q->p2.y, width, height, &x2, &y2); if (q->clamp & CLAMP_HORZ) { if (x1 < 0) x1 = 0; if (x2 > width) x2 = width; } if (q->clamp & CLAMP_VERT) { if (y1 < 0) y1 = 0; if (y2 > height) y2 = height; } if (q->stretch & STRETCH_X) { sx = (float) q->max_width / ((float) (x2 - x1)); } else if (q->max_width < x2 - x1) { if (q->align & ALIGN_RIGHT) x1 = x2 - q->max_width; else x2 = x1 + q->max_width; } if (q->stretch & STRETCH_Y) { sy = (float) q->max_height / ((float) (y2 - y1)); } else if (q->max_height < y2 - y1) { if (q->align & ALIGN_BOTTOM) y1 = y2 - q->max_height; else y2 = y1 + q->max_height; } *return_x1 = x1; *return_y1 = y1; *return_x2 = x2; *return_y2 = y2; if (return_sx) *return_sx = sx; if (return_sy) *return_sy = sy; } /* * Decoration::create * * Factory function to create a Decoration *, takes a decoration * property data, size, type and offset inside that property data * to start reading from. * * This function determines the decoration type and reads the property * data appropriately and then uses the property data to determine the * quads and extents of the input windows and the hinted extents. * */ Decoration::Ptr Decoration::create (Window id, long *prop, unsigned int size, unsigned int type, unsigned int nOffset, DecorPixmapRequestorInterface *requestor) { unsigned int frameType, frameState, frameActions; Pixmap pixmap = None; decor_extents_t border; decor_extents_t input; decor_extents_t maxBorder; decor_extents_t maxInput; int minWidth; int minHeight; int nQuad = N_QUADS_MAX; boost::shared_array quad (new decor_quad_t[nQuad]); if (type == WINDOW_DECORATION_TYPE_PIXMAP && !DecorScreen::get (screen)->cmActive) { compLogMessage ("decor", CompLogLevelWarn, "requested a pixmap type decoration when compositing isn't available"); throw std::exception (); } if (type == WINDOW_DECORATION_TYPE_PIXMAP) { nQuad = decor_pixmap_property_to_quads (prop, nOffset, size, &pixmap, &input, &border, &maxInput, &maxBorder, &minWidth, &minHeight, &frameType, &frameState, &frameActions, quad.get ()); if (!nQuad) throw std::exception (); } else if (type == WINDOW_DECORATION_TYPE_WINDOW) { if (!decor_window_property (prop, nOffset, size, &input, &maxInput, &minWidth, &minHeight, &frameType, &frameState, &frameActions)) { compLogMessage ("decor", CompLogLevelWarn, "malformed decoration - not a window"); throw std::exception (); } border = input; maxBorder = maxInput; } else { compLogMessage ("decor", CompLogLevelWarn, "malformed decoration - undetermined type"); throw std::exception (); } return Decoration::Ptr (new Decoration (type, border, input, maxBorder, maxInput, frameType, frameState, frameActions, minWidth, minHeight, pixmap, quad, nQuad, id, requestor)); } Decoration::Decoration (int type, const decor_extents_t &border, const decor_extents_t &input, const decor_extents_t &maxBorder, const decor_extents_t &maxInput, unsigned int frameType, unsigned int frameState, unsigned int frameActions, unsigned int minWidth, unsigned int minHeight, Pixmap pixmap, const boost::shared_array &quad, unsigned int nQuad, Window owner, DecorPixmapRequestorInterface *requestor) : refCount (0), texture (DecorScreen::get (screen)->getTexture (pixmap)), border (border.left, border.right, border.top, border.bottom), input (input.left, input.right, input.top, input.bottom), maxBorder (maxBorder.left, maxBorder.right, maxBorder.top, maxBorder.bottom), maxInput (maxInput.left, maxInput.right, maxInput.top, maxInput.bottom), minWidth (minWidth), minHeight (minHeight), frameType (frameType), frameState (frameState), frameActions (frameActions), quad (quad), nQuad (nQuad), type (type), updateState (0), mPixmapReceiver (requestor, this) { int x1, y1, x2, y2; if (!texture && type == WINDOW_DECORATION_TYPE_PIXMAP) { compLogMessage ("decor", CompLogLevelWarn, "failed to bind pixmap to texture"); throw std::exception (); } if (type == WINDOW_DECORATION_TYPE_PIXMAP) { int left = 0, right = minWidth, top = 0, bottom = minHeight; for (unsigned int i = 0; i < nQuad; i++) { computeQuadBox (&(quad[i]), minWidth, minHeight, &x1, &y1, &x2, &y2, NULL, NULL); if (x1 < left) left = x1; if (y1 < top) top = y1; if (x2 > right) right = x2; if (y2 > bottom) bottom = y2; } this->output.left = -left; this->output.right = right - minWidth; this->output.top = -top; this->output.bottom = bottom - minHeight; } else { this->output.left = MAX (input.left, maxInput.left); this->output.right = MAX (input.right, maxInput.right); this->output.top = MAX (input.top, maxInput.top); this->output.bottom = MAX (input.bottom, maxInput.bottom); } } /* * Decoration::~Decoration * * Unreferences the decoration, also unreferences the texture * if this decoration is about to be destroyed * */ Decoration::~Decoration () { if (texture) DecorScreen::get (screen)->releaseTexture (texture); } DecorPixmapReceiverInterface & Decoration::receiverInterface () { return mPixmapReceiver; } unsigned int Decoration::getFrameType () const { return frameType; } unsigned int Decoration::getFrameState () const { return frameState; } unsigned int Decoration::getFrameActions () const { return frameActions; } /* * DecorationList is a class which allows multiple decorations * to be stored in a list and read from a window property, which * allows caching to be done for decorations so that we aren't * always querying another process for decorations * */ DecorationList::DecorationList () : mList (0) { } /* * DecorationList::updateDecoration * * Fetches the window property for a particular * window for this decoration list on a particular * decoration atom (whether that be the default * atom on the root window or the _COMPIZ_WINDOW_DECOR * atom on the client) * * Note that due to the way XGetWindowProperty works, * we only cache what is appropriate and then get the * rest from the property in case we didn't read enough * data. It would be awesome if XGetWindowProperty allowed * you to read as much as you wanted. * * FIXME: Currently this function refreshes all decorations. * That's slow and should be fixed * */ bool DecorationList::updateDecoration (Window id, Atom decorAtom, DecorPixmapRequestorInterface *requestor) { unsigned long n, nleft; unsigned char *data; long *prop; Atom actual; int result, format; unsigned int type; /* Dispatch any new updates */ foreach (const Decoration::Ptr &d, mList) { d->mPixmapReceiver.update (); } result = XGetWindowProperty (screen->dpy (), id, decorAtom, 0L, PROP_HEADER_SIZE + 6 * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX), false, XA_INTEGER, &actual, &format, &n, &nleft, &data); if (result != Success || !n || !data) return false; /* Attempted to read the reasonable amount of * around 6 pixmap decorations, if there are more, we need * an additional roundtrip to read everything else */ if (nleft) { XFree (data); result = XGetWindowProperty (screen->dpy (), id, decorAtom, 0L, n + nleft, false, XA_INTEGER, &actual, &format, &n, &nleft, &data); if (result != Success || !n || !data) return false; } prop = (long *) data; if (decor_property_get_version (prop) != decor_version ()) { compLogMessage ("decoration", CompLogLevelWarn, "Property ignored because " "version is %d and decoration plugin version is %d\n", decor_property_get_version (prop), decor_version ()); XFree (data); return false; } type = decor_property_get_type (prop); std::list remove; std::list skip; /* only recreate decorations if they need to be updated */ foreach (const Decoration::Ptr &d, mList) { decor_extents_t input, border, maxInput, maxBorder; input.left = d->input.left; input.right = d->input.right; input.top = d->input.top; input.bottom = d->input.bottom; border.left = d->border.left; border.right = d->border.right; border.top = d->border.top; border.bottom = d->border.bottom; maxInput.left = d->maxInput.left; maxInput.right = d->maxInput.right; maxInput.top = d->maxInput.top; maxInput.bottom = d->maxInput.bottom; maxBorder.left = d->maxBorder.left; maxBorder.right = d->maxBorder.right; maxBorder.top = d->maxBorder.top; maxBorder.bottom = d->maxBorder.bottom; Pixmap pm = d->texture->pixmap->getPixmap (); int num = decor_match_pixmap (prop, n, &pm, &input, &border, &maxInput, &maxBorder, d->minWidth, d->minHeight, d->frameType, d->frameState, d->frameActions, d->quad.get (), d->nQuad); if (num != -1) skip.push_back (num); else remove.push_back (d); } /* Create a new decoration for each individual item on the property */ for (int i = 0; i < decor_property_get_num (prop); i++) { if (std::find (skip.begin (), skip.end (), i) != skip.end ()) continue; try { std::list ::iterator it = mList.begin (); Decoration::Ptr d = Decoration::create (id, prop, n, type, i, requestor); /* Try to replace an existing decoration */ for (; it != mList.end (); ++it) { if ((*it)->frameType == d->frameType && (*it)->frameState == d->frameState && (*it)->frameActions == d->frameActions) { remove.remove ((*it)); (*it) = d; break; } } if (it == mList.end ()) mList.push_back (d); } catch (...) { /* Creating a new decoration failed ... see if we can use * the old one */ unsigned int frameType, frameState, frameActions = 0; Pixmap pixmap = None; decor_extents_t border; decor_extents_t input; decor_extents_t maxBorder; decor_extents_t maxInput; int minWidth; int minHeight; int ok = 0; boost::shared_array quad (new decor_quad_t[N_QUADS_MAX]); if (type == WINDOW_DECORATION_TYPE_PIXMAP) { ok = decor_pixmap_property_to_quads (prop, i, n, &pixmap, &input, &border, &maxInput, &maxBorder, &minWidth, &minHeight, &frameType, &frameState, &frameActions, quad.get ()); } else if (type == WINDOW_DECORATION_TYPE_WINDOW) { ok = decor_window_property (prop, i, n, &input, &maxInput, &minWidth, &minHeight, &frameType, &frameState, &frameActions); } if (ok) { std::list ::iterator it = mList.begin (); /* Use an existing decoration */ for (; it != mList.end (); ++it) { if ((*it)->frameType == frameType && (*it)->frameState == frameState && (*it)->frameActions == frameActions) { remove.remove ((*it)); break; } } } } } foreach (const Decoration::Ptr &d, remove) mList.remove (d); XFree (data); return true; } /* * DecorWindow::updateDecoration * * Updates the decoration list on this window */ void DecorWindow::updateDecoration () { bindFailed = false; decor.updateDecoration (window->id (), dScreen->winDecorAtom, &mRequestor); if (bindFailed) pixmapFailed = true; else pixmapFailed = false; } /* * WindowDecoration::create * * Factory function for WindowDecoration, creates * a window specific decoration for this window, * not to be confused with window /type/ decorations * which are a different matter. * * Decorations can indeed be re-used, and that is what * WindowDecoration is for. * */ WindowDecoration * WindowDecoration::create (const Decoration::Ptr &d) { WindowDecoration *wd; unsigned int nQuad = d->nQuad; wd = new WindowDecoration (); if (!wd) return NULL; if (d->type == WINDOW_DECORATION_TYPE_PIXMAP) { wd->quad = new ScaledQuad[nQuad]; if (!wd->quad) { delete wd; return NULL; } } else { nQuad = 0; wd->quad = NULL; } d->refCount++; wd->decor = d; wd->nQuad = nQuad; return wd; } /* * WindowDecoration::destroy * * Unreferences the bound decoration * and frees quads */ void WindowDecoration::destroy (WindowDecoration *wd) { delete [] wd->quad; delete wd; } /* * DecorWindow::setDecorationMatrices * * Statically update the quad display matrices * (2x3 matrix) each time the window is moved * or resized * * For this to work, we need to multiply the * scaled quad and decor quad matrices together * to get the final scaled transformation * * Translation (x0, y0) is based on the actual box * position in decoration co-ordinate space multiplied * by the scaled transformation matrix */ void DecorWindow::setDecorationMatrices () { float x0, y0; decor_matrix_t a; GLTexture::Matrix b; if (!wd) return; for (int i = 0; i < wd->nQuad; i++) { /* Set the quad matrix to the texture matrix */ wd->quad[i].matrix = wd->decor->texture->textures[0]->matrix (); /* Initial translation point is based on existing translation point */ x0 = wd->decor->quad[i].m.x0; y0 = wd->decor->quad[i].m.y0; a = wd->decor->quad[i].m; b = wd->quad[i].matrix; /* Multiply wd->quad[i].matrix (decoration matrix) * and the scaled quad matrix */ wd->quad[i].matrix.xx = a.xx * b.xx + a.yx * b.xy; wd->quad[i].matrix.yx = a.xx * b.yx + a.yx * b.yy; wd->quad[i].matrix.xy = a.xy * b.xx + a.yy * b.xy; wd->quad[i].matrix.yy = a.xy * b.yx + a.yy * b.yy; wd->quad[i].matrix.x0 = x0 * b.xx + y0 * b.xy + b.x0; wd->quad[i].matrix.y0 = x0 * b.yx + y0 * b.yy + b.y0; wd->quad[i].matrix.xx *= wd->quad[i].sx; wd->quad[i].matrix.yx *= wd->quad[i].sx; wd->quad[i].matrix.xy *= wd->quad[i].sy; wd->quad[i].matrix.yy *= wd->quad[i].sy; /* Align translation points to the right * in the scaled quad (window) space */ if (wd->decor->quad[i].align & ALIGN_RIGHT) x0 = wd->quad[i].box.x2 - wd->quad[i].box.x1; else x0 = 0.0f; /* Align translation points to the bottom * in the scaled quad (window) space */ if (wd->decor->quad[i].align & ALIGN_BOTTOM) y0 = wd->quad[i].box.y2 - wd->quad[i].box.y1; else y0 = 0.0f; wd->quad[i].matrix.x0 -= x0 * wd->quad[i].matrix.xx + y0 * wd->quad[i].matrix.xy; wd->quad[i].matrix.y0 -= y0 * wd->quad[i].matrix.yy + x0 * wd->quad[i].matrix.yx; wd->quad[i].matrix.x0 -= wd->quad[i].box.x1 * wd->quad[i].matrix.xx + wd->quad[i].box.y1 * wd->quad[i].matrix.xy; wd->quad[i].matrix.y0 -= wd->quad[i].box.y1 * wd->quad[i].matrix.yy + wd->quad[i].box.x1 * wd->quad[i].matrix.yx; } updateMatrix = false; } /* * DecorWindow::updateDecorationScale * * Update the scaled quads box for this * window. Do that by determining * the scaled quad box for the window size * and then translating each quad box by * the window position * */ void DecorWindow::updateDecorationScale () { int x1, y1, x2, y2; float sx, sy; if (!wd) return; for (int i = 0; i < wd->nQuad; i++) { int x, y; unsigned int width = window->size ().width (); unsigned int height = window->size ().height (); if (window->shaded ()) { if (dScreen->cScreen && dScreen->cScreen->compositingActive ()) { if (!cWindow->pixmap ()) height = 0; } else height = 0; } computeQuadBox (&wd->decor->quad[i], width, height, &x1, &y1, &x2, &y2, &sx, &sy); /* Translate by x and y points of this window */ x = window->geometry ().x (); y = window->geometry ().y (); wd->quad[i].box.x1 = x1 + x; wd->quad[i].box.y1 = y1 + y; wd->quad[i].box.x2 = x2 + x; wd->quad[i].box.y2 = y2 + y; wd->quad[i].sx = sx; wd->quad[i].sy = sy; } setDecorationMatrices (); } /* * DecorWindow::checkSize * * Convenience function to check if this decoration * is going to display laerger than the window size * itself, in that case we can't use it since it * would like the decoration was larger than the window * (or trying to compress it anymore would result in * eg, distorted text or buttons). In that case * we'd use default decorations * */ bool DecorWindow::checkSize (const Decoration::Ptr &decoration) { return (decoration->minWidth <= (int) window->size ().width () && decoration->minHeight <= (int) window->size ().height ()); } /* * DecorWindow::matchType * * Converts libdecoration window types packed * into the property into Compiz window types * */ bool DecorWindow::matchType (CompWindow *w, unsigned int decorType) { const unsigned int nTypeStates = 5; struct typestate { unsigned int compFlag; unsigned int decorFlag; } typeStates[] = { { CompWindowTypeNormalMask, DECOR_WINDOW_TYPE_NORMAL }, { CompWindowTypeDialogMask, DECOR_WINDOW_TYPE_DIALOG }, { CompWindowTypeModalDialogMask, DECOR_WINDOW_TYPE_MODAL_DIALOG }, { CompWindowTypeMenuMask, DECOR_WINDOW_TYPE_MENU }, { CompWindowTypeUtilMask, DECOR_WINDOW_TYPE_UTILITY} }; for (unsigned int i = 0; i < nTypeStates; i++) { if ((decorType & typeStates[i].decorFlag) && (w->type () & typeStates[i].compFlag)) return true; } return false; } /* * DecorWindow::matchType * * Converts libdecoration window states packed * into the property into Compiz window states * * Since there is no _NET_WM_STATE_ACTIVE * we need to determine that ourselves from * _NET_ACTIVE_WINDOW on the root window * */ bool DecorWindow::matchState (CompWindow *w, unsigned int decorState) { const unsigned int nStateStates = 3; struct statestate { unsigned int compFlag; unsigned int decorFlag; } stateStates[] = { { CompWindowStateMaximizedVertMask, DECOR_WINDOW_STATE_MAXIMIZED_VERT }, { CompWindowStateMaximizedHorzMask, DECOR_WINDOW_STATE_MAXIMIZED_HORZ }, { CompWindowStateShadedMask, DECOR_WINDOW_STATE_SHADED } }; /* Active is a separate check */ if (screen->activeWindow () == w->id ()) decorState &= ~(DECOR_WINDOW_STATE_FOCUS); for (unsigned int i = 0; i < nStateStates; i++) { if ((decorState & stateStates[i].decorFlag) && (w->state () & stateStates[i].compFlag)) decorState &= ~(stateStates[i].decorFlag); } return (decorState == 0); } /* * DecorWindow::matchActions * * Converts libdecoration window actions packed * into the property into Compiz window types * */ bool DecorWindow::matchActions (CompWindow *w, unsigned int decorActions) { const unsigned int nActionStates =16; struct actionstate { unsigned int compFlag; unsigned int decorFlag; } actionStates[] = { { DECOR_WINDOW_ACTION_RESIZE_HORZ, CompWindowActionResizeMask }, { DECOR_WINDOW_ACTION_RESIZE_VERT, CompWindowActionResizeMask }, { DECOR_WINDOW_ACTION_CLOSE, CompWindowActionCloseMask }, { DECOR_WINDOW_ACTION_MINIMIZE, CompWindowActionMinimizeMask }, { DECOR_WINDOW_ACTION_UNMINIMIZE,CompWindowActionMinimizeMask }, { DECOR_WINDOW_ACTION_MAXIMIZE_HORZ, CompWindowActionMaximizeHorzMask }, { DECOR_WINDOW_ACTION_MAXIMIZE_VERT, CompWindowActionMaximizeVertMask }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_HORZ, CompWindowActionMaximizeHorzMask }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_VERT, CompWindowActionMaximizeVertMask }, { DECOR_WINDOW_ACTION_SHADE, CompWindowActionShadeMask }, { DECOR_WINDOW_ACTION_UNSHADE, CompWindowActionShadeMask }, { DECOR_WINDOW_ACTION_STICK, CompWindowActionStickMask }, { DECOR_WINDOW_ACTION_UNSTICK, CompWindowActionStickMask }, { DECOR_WINDOW_ACTION_FULLSCREEN, CompWindowActionFullscreenMask }, { DECOR_WINDOW_ACTION_ABOVE, CompWindowActionAboveMask }, { DECOR_WINDOW_ACTION_BELOW, CompWindowActionBelowMask }, }; for (unsigned int i = 0; i < nActionStates; i++) { if ((decorActions & actionStates[i].decorFlag) && (w->type () & actionStates[i].compFlag)) decorActions &= ~(actionStates[i].decorFlag); } return (decorActions == 0); } DecorationInterface::Ptr DecorationList::findMatchingDecoration (unsigned int frameType, unsigned int frameState, unsigned int frameActions) const { foreach (const Decoration::Ptr &d, mList) { if (d->frameType == frameType && d->frameState == frameState && d->frameActions == frameActions) return d; } return DecorationInterface::Ptr (); } DecorationInterface::Ptr DecorationList::findMatchingDecoration (Pixmap p) const { foreach (const Decoration::Ptr &d, mList) { if (d->texture->pixmap->getPixmap () == p) return d; } return DecorationInterface::Ptr (); } /* * DecorationList::findMatchingDecoration * * Searches a decoration list for a decoration * that actually matches this window, or at least * comes close to it. * * There is an order of preference when matching * decorations here. * * Type:State:Actions * * If a property before another one is matched, that * decoration is "locked" so if a decoration is found * that has the correct matching property but does not * match the locked property, then it is not matched * */ const Decoration::Ptr & DecorationList::findMatchingDecoration (CompWindow *w, bool sizeCheck) { std::list ::iterator cit = mList.end (); DECOR_WINDOW (w); if (!mList.empty ()) { const unsigned int typeMatch = (1 << 0); const unsigned int stateMatch = (1 << 1); const unsigned int actionsMatch = (1 << 2); unsigned int currentDecorState = 0; if (sizeCheck) if (dw->checkSize (mList.front ())) cit = mList.begin (); for (std::list ::iterator it = mList.begin (); it != mList.end (); ++it) { const Decoration::Ptr &d = *it; /* Must always match type */ if (DecorWindow::matchType (w, d->frameType)) { /* Use this decoration if the type matched */ if (!(typeMatch & currentDecorState) && (!sizeCheck || dw->checkSize (d))) { cit = it; currentDecorState |= typeMatch; } /* Must always match state if type is already matched */ if (DecorWindow::matchState (w, d->frameState) && (!sizeCheck || dw->checkSize (d))) { /* Use this decoration if the type and state match */ if (!(stateMatch & currentDecorState)) { cit = it; currentDecorState |= stateMatch; } /* Must always match actions if state and type are already matched */ if (DecorWindow::matchActions (w, d->frameActions) && (!sizeCheck || dw->checkSize (d))) { /* Use this decoration if the requested actions match */ if (!(actionsMatch & currentDecorState)) { cit = it; currentDecorState |= actionsMatch; /* Perfect match, no need to continue searching */ break; } } } } } } if (cit == mList.end ()) throw std::exception (); return *cit; } bool DecorWindow::bareDecorationOnly () { bool shadowOnly = true; /* Only want to decorate windows which have a frame or are in the process * of waiting for an animation to be unmapped (in which case we can give * them a new pixmap type frame since we don't actually need an input * window to go along with that * * FIXME: That's not going to play nice with reparented decorations in core * since the window gets reparented right away before plugins are done * with it */ /* Unconditionally decorate switchers */ if (!isSwitcher) { switch (window->type ()) { case CompWindowTypeDialogMask: case CompWindowTypeModalDialogMask: case CompWindowTypeUtilMask: case CompWindowTypeMenuMask: case CompWindowTypeNormalMask: if (window->mwmDecor () & (MwmDecorAll | MwmDecorTitle)) shadowOnly = false; default: break; } if (window->overrideRedirect ()) shadowOnly = true; if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) shadowOnly = true; if (!shadowOnly) { if (!dScreen->optionGetDecorationMatch ().evaluate (window)) shadowOnly = true; } /* Never on unmapped windows */ if (!window->isViewable ()) shadowOnly = false; } else shadowOnly = false; return shadowOnly; } Decoration::Ptr DecorWindow::findRealDecoration () { Decoration::Ptr decoration; /* Attempt to find a matching decoration */ try { decoration = decor.findMatchingDecoration (window, true); } catch (...) { /* Find an appropriate default decoration to use */ if (dScreen->dmSupports & WINDOW_DECORATION_TYPE_PIXMAP && dScreen->cmActive && !(dScreen->dmSupports & WINDOW_DECORATION_TYPE_WINDOW && pixmapFailed)) { try { decoration = dScreen->decor[DECOR_ACTIVE].findMatchingDecoration (window, false); } catch (...) { compLogMessage ("decor", CompLogLevelWarn, "No default decoration found, placement will not be correct"); decoration.reset (); } } else if (dScreen->dmSupports & WINDOW_DECORATION_TYPE_WINDOW) decoration = dScreen->windowDefault; } return decoration; } Decoration::Ptr DecorWindow::findBareDecoration () { Decoration::Ptr decoration; /* This window isn't "decorated" but it still gets a shadow as long * as it isn't shaped weirdly, since the shadow is just a quad rect */ if (dScreen->optionGetShadowMatch ().evaluate (window)) { if (window->region ().numRects () == 1 && !window->alpha () && dScreen->decor[DECOR_BARE].mList.size ()) decoration = dScreen->decor[DECOR_BARE].mList.front (); if (decoration) { if (!checkSize (decoration)) decoration.reset (); } } return decoration; } namespace { bool shouldDecorateWindow (CompWindow *w, bool shadowOnly, bool isSwitcher) { const bool frameOrUnmapReference = (w->frame () || w->hasUnmapReference ()); const bool realDecoration = frameOrUnmapReference && !shadowOnly; const bool forceDecoration = isSwitcher; return realDecoration || forceDecoration; } /* * notifyDecoration * * Notify other plugins that the window is now fully decorated */ void notifyDecoration (CompWindow *window) { CompOption::Vector o (1); o.at (0).setName ("window", CompOption::TypeInt); o.at (0).value ().set ((int) window->id ()); screen->handleCompizEvent ("decor", "window_decorated", o); } } /* * DecorWindow::update * This is the master function for managing decorations on windows * * The first part of this function determines if we want to actually * decorate a particular window. This only passes if the window * matches the decorated type match and it is also capable of being * decorated (eg, has a frame window and not override redirect) and * also has appropriate _MOTIF_WM_HINTS set on it (specifically 0x3 * and 0x6) * * The next part of the function attempts to find a matching decoration * has has been created by the decorators. If it can't find one, the * window gets a default decoration (until the decorators have "caught * up" with us and given this window an actual decoration. * * Windows that we've marked not to decorate get shadows around them * at least. This is the "bare" type decoration * * If an appropriate decoration is found for this window, a WindowDecoration * (which is a window specific class determining how that decoration * should operate on /this particular window/) is created. * * At this point we also update the "frame extents" in core (for * _NET_REQUEST_FRAME_EXTENTS) and also the actual frame geometry * since we might need a larger space on the frame window (which is * shaped to accomadate decorations) for things like, eg grab areas * which shouldn't be represented to clients as actual visible * decoration space * * FIXME: There are a bunch of hacks in here to allow override redirect * windows which have "special" switcher type decorations to be decorated * without being reparented. Ideally, these shouldn't be handled by * the decor plugin * */ bool DecorWindow::update (bool allowDecoration) { Decoration::Ptr old, decoration; CompPoint movement; CompSize sizeDelta; if (wd) old = wd->decor; else old.reset (); bool shadowOnly = bareDecorationOnly (); bool decorate = shouldDecorateWindow (window, shadowOnly, isSwitcher); unsigned int decorMaximizeState = window->state () & MAXIMIZE_STATE; if (decorate || frameExtentsRequested) { decoration = findRealDecoration (); /* Do not allow windows which are later undecorated * to have a set _NET_FRAME_EXTENTS */ if (decorate) frameExtentsRequested = false; } else decoration = findBareDecoration (); /* Don't allow the windows to be decorated if * we're tearing down or if a decorator isn't running * (nobody owns the selection window) */ if (!dScreen->dmWin || !allowDecoration) decoration.reset (); /* Don't bother going any further if * this window is going to get the same * decoration, just use the old one */ if (decoration == old && lastMaximizedStateDecorated == decorMaximizeState) return false; /* If a decoration was found for this window, create * a new WindowDecoration for it and set the frame * extents accordingly. We should also move the * window by the distance the new decoration provides * in case that actually changed */ if (decoration) { /* Set extents based on maximize/unmaximize state * FIXME: With the new type system, this should be * removed */ if (decorMaximizeState == MAXIMIZE_STATE) window->setWindowFrameExtents (&decoration->maxBorder, &decoration->maxInput); else if (!window->hasUnmapReference ()) window->setWindowFrameExtents (&decoration->border, &decoration->input); lastMaximizedStateDecorated = decorMaximizeState; /* This window actually needs its decoration contents updated * as it was actually visible */ if (decorate || shadowOnly) { if (wd) WindowDecoration::destroy (wd); wd = WindowDecoration::create (decoration); if (!wd) { /* Error condition, reset frame extents */ CompWindowExtents emptyExtents; memset (&emptyExtents, 0, sizeof (CompWindowExtents)); window->setWindowFrameExtents (&emptyExtents, &emptyExtents); return false; } window->updateWindowOutputExtents (); updateReg = true; updateMatrix = true; mOutputRegion = CompRegion (window->outputRect ()); if (dScreen->cmActive) cWindow->damageOutputExtents (); updateDecorationScale (); /* Update the input and output frame */ if (decorate) updateFrame (); } } else { CompWindowExtents emptyExtents; if (wd) { WindowDecoration::destroy (wd); wd = NULL; } /* _NET_FRAME_EXTENTS should be updated before the frame * atom is */ memset (&emptyExtents, 0, sizeof (CompWindowExtents)); window->setWindowFrameExtents (&emptyExtents, &emptyExtents); /* Undecorated windows need to have the * input and output frame removed and the * frame window geometry reset */ updateFrame (); } /* We need to damage the current output extents * and recompute the shadow region if a compositor * is running */ if (dScreen->cmActive) { cWindow->damageOutputExtents (); updateGroupShadows (); } notifyDecoration (window); return true; } /* * DecorWindow::updateFrame * * Updates the actual frame window which is * used for either displaying the decoration in the case of window * type reparented decorations, or handling input events in the case * of pixmap decorations */ void DecorWindow::updateFrame () { /* Destroy the input and output frames in case the window can't * actually be decorated */ if (!wd || !(window->border ().left || window->border ().right || window->border ().top || window->border ().bottom) || (wd->decor->type == WINDOW_DECORATION_TYPE_PIXMAP && outputFrame) || (wd->decor->type == WINDOW_DECORATION_TYPE_WINDOW && inputFrame)) { if (inputFrame) { XDeleteProperty (screen->dpy (), window->id (), dScreen->inputFrameAtom); if (window->frame ()) XDestroyWindow (screen->dpy (), inputFrame); inputFrame = None; frameRegion = CompRegion (); oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; } if (outputFrame) { XDamageDestroy (screen->dpy (), frameDamage); XDeleteProperty (screen->dpy (), window->id (), dScreen->outputFrameAtom); if (window->frame ()) XDestroyWindow (screen->dpy (), outputFrame); dScreen->frames.erase (outputFrame); outputFrame = None; frameRegion = CompRegion (); oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; } } /* If the window can be decorated, update the frames */ if (wd && (window->border ().left || window->border ().right || window->border ().top || window->border ().bottom)) { if (wd->decor->type == WINDOW_DECORATION_TYPE_PIXMAP) updateInputFrame (); else if (wd->decor->type == WINDOW_DECORATION_TYPE_WINDOW) updateOutputFrame (); } } /* * DecorWindow::updateInputFrame * * Actually creates an input frame if there isn't * one, otherwise sets the shape regions on it so that * if the decoration inside the parent window ever * gets stacked on top of the client, it won't obstruct * it * * This also sets the _COMPIZ_WINDOW_DECOR_INPUT_FRAME * atom on the window. Decorators should listen for this * to determine if a window is to be decorated, and when * they get a PropertyNotify indicating that this the case * should draw a decoration and set the _COMPIZ_WINDOW_DECOR * atom in response, otherwise this window is going to * be stuck with default decorations * */ void DecorWindow::updateInputFrame () { XRectangle rects[4]; int x, y, width, height; CompWindow::Geometry server = window->serverGeometry (); CompWindowExtents input; CompWindowExtents border; Window parent; /* Switchers are special, we need to put input frames * there in the root window rather than in the frame * window that this window is reparented into */ if (isSwitcher) parent = screen->root (); else parent = window->frame (); /* Determine frame extents */ if ((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) { border = wd->decor->maxBorder; input = wd->decor->maxInput; } else { border = wd->decor->border; input = wd->decor->input; } x = window->border ().left - border.left; y = window->border ().top - border.top; width = server.widthIncBorders () + input.left + input.right; height = server.heightIncBorders ()+ input.top + input.bottom ; /* Non switcher windows are rooted relative to the frame window of the client * and switchers need to be offset by the window geometry of the client */ if (isSwitcher) { x += window->x (); y += window->y (); } /* Shaded windows automatically have no height */ if (window->shaded ()) height = input.top + input.bottom; /* Since we're reparenting windows here, we need to grab the server * which sucks, but its necessary */ XGrabServer (screen->dpy ()); if (!inputFrame) { XSetWindowAttributes attr; attr.event_mask = StructureNotifyMask; attr.override_redirect = true; inputFrame = XCreateWindow (screen->dpy (), parent, x, y, width, height, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XGrabButton (screen->dpy (), AnyButton, AnyModifier, inputFrame, true, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeSync, None, None); XMapWindow (screen->dpy (), inputFrame); /* Notify the decorators that an input frame has been created on * this window so that they can react by actually create a decoration * for it (while we use the default decorations) */ XChangeProperty (screen->dpy (), window->id (), dScreen->inputFrameAtom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &inputFrame, 1); if (screen->XShape ()) XShapeSelectInput (screen->dpy (), inputFrame, ShapeNotifyMask); /* invalidate the decoration so that it gets shaped */ oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; } if (x != oldX || y != oldY || width != oldWidth || height != oldHeight) { int i = 0; oldX = x; oldY = y; oldWidth = width; oldHeight = height; XMoveResizeWindow (screen->dpy (), inputFrame, x, y, width, height); /* Non switcher decorations need to be lowered in * in the frame to ensure that they go below * the window contents (so that our set input shape * works correctly */ if (!isSwitcher) XLowerWindow (screen->dpy (), inputFrame); rects[i].x = 0; rects[i].y = 0; rects[i].width = width; rects[i].height = input.top; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = input.top; rects[i].width = input.left; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = width - input.right; rects[i].y = input.top; rects[i].width = input.right; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = height - input.bottom; rects[i].width = width; rects[i].height = input.bottom; if (rects[i].width && rects[i].height) i++; XShapeCombineRectangles (screen->dpy (), inputFrame, ShapeInput, 0, 0, rects, i, ShapeSet, YXBanded); frameRegion = CompRegion (); /* Immediately query shape rectangles so that we can * report them if core asks for them */ updateRegionWithShapeRectangles (screen->dpy (), inputFrame, frameRegion); window->updateFrameRegion (); } XUngrabServer (screen->dpy ()); } /* * DecorWindow::updateOutputFrame * * Actually creates an output frame if there isn't * one, otherwise sets the shape regions on it so that * if the decoration inside the parent window ever * gets stacked on top of the client, it won't obstruct * it * * This also sets the _COMPIZ_WINDOW_DECOR_OUTPUT_FRAME * atom on the window. Decorators should listen for this * to determine if a window is to be decorated, and when * they get a PropertyNotify indicating that this the case * should draw a decoration inside the window and set the * _COMPIZ_WINDOW_DECOR atom in response, otherwise this * window is going to be stuck with default decorations * */ void DecorWindow::updateOutputFrame () { XRectangle rects[4]; int x, y, width, height; CompWindow::Geometry server = window->serverGeometry (); CompWindowExtents input; /* Determine frame extents */ if ((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE) input = wd->decor->maxInput; else input = wd->decor->input; x = window->input ().left - input.left; y = window->input ().top - input.top; width = server.widthIncBorders () + input.left + input.right; height = server.heightIncBorders ()+ input.top + input.bottom; if (window->shaded ()) height = input.top + input.bottom; /* Since we're reparenting windows here, we need to grab the server * which sucks, but its necessary */ XGrabServer (screen->dpy ()); if (!outputFrame) { XSetWindowAttributes attr; attr.background_pixel = 0x0; attr.event_mask = StructureNotifyMask; attr.override_redirect = true; outputFrame = XCreateWindow (screen->dpy (), window->frame (), x, y, width, height, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XGrabButton (screen->dpy (), AnyButton, AnyModifier, outputFrame, true, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeSync, None, None); XMapWindow (screen->dpy (), outputFrame); /* Notify the decorators that an input frame has been created on * this window so that they can react by actually create a decoration * for it (while we use the default decorations) */ XChangeProperty (screen->dpy (), window->id (), dScreen->outputFrameAtom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &outputFrame, 1); if (screen->XShape ()) XShapeSelectInput (screen->dpy (), outputFrame, ShapeNotifyMask); /* invalidate the decoration so that it gets shaped */ oldX = 0; oldY = 0; oldWidth = 0; oldHeight = 0; frameDamage = XDamageCreate (screen->dpy (), outputFrame, XDamageReportBoundingBox); dScreen->frames[outputFrame] = this; } if (x != oldX || y != oldY || width != oldWidth || height != oldHeight) { int i = 0; oldX = x; oldY = y; oldWidth = width; oldHeight = height; XMoveResizeWindow (screen->dpy (), outputFrame, x, y, width, height); XLowerWindow (screen->dpy (), outputFrame); rects[i].x = 0; rects[i].y = 0; rects[i].width = width; rects[i].height = input.top; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = input.top; rects[i].width = input.left; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = width - input.right; rects[i].y = input.top; rects[i].width = input.right; rects[i].height = height - input.top - input.bottom; if (rects[i].width && rects[i].height) i++; rects[i].x = 0; rects[i].y = height - input.bottom; rects[i].width = width; rects[i].height = input.bottom; if (rects[i].width && rects[i].height) i++; XShapeCombineRectangles (screen->dpy (), outputFrame, ShapeBounding, 0, 0, rects, i, ShapeSet, YXBanded); frameRegion = CompRegion (); /* Immediately query shape rectangles so that we can * report them if core asks for them */ updateRegionWithShapeRectangles (screen->dpy (), outputFrame, frameRegion); window->updateFrameRegion (); } XUngrabServer (screen->dpy ()); } /* * DecorScreen::checkForDm * * Checks for a running decoration manager on the root window * and also checks to see what decoration modes it supports * * dmWin is set based on the window on supportingDmCheckAtom * on the root window. That's a window which is owned by * the decorator, so if it changes we need to invalidate * all the decorations */ void DecorScreen::checkForDm (bool updateWindows) { Atom actual; int result, format, dmSupports = 0; unsigned long n, left; unsigned char *data; Window dmWin = None; result = XGetWindowProperty (screen->dpy (), screen->root (), supportingDmCheckAtom, 0L, 1L, false, XA_WINDOW, &actual, &format, &n, &left, &data); if (result == Success && n && data) { XWindowAttributes attr; memcpy (&dmWin, data, sizeof (Window)); XFree (data); CompScreen::checkForError (screen->dpy ()); XGetWindowAttributes (screen->dpy (), dmWin, &attr); if (CompScreen::checkForError (screen->dpy ())) dmWin = None; else { result = XGetWindowProperty (screen->dpy (), dmWin, decorTypeAtom, 0L, 2L, false, XA_ATOM, &actual, &format, &n, &left, &data); if (result == Success && n && data) { Atom *ret = (Atom *) data; for (unsigned long i = 0; i < n; i++) { if (ret[i] == decorTypePixmapAtom) dmSupports |= WINDOW_DECORATION_TYPE_PIXMAP; else if (ret[i] == decorTypeWindowAtom) dmSupports |= WINDOW_DECORATION_TYPE_WINDOW; } if (!dmSupports) dmWin = None; XFree (data); } else dmWin = None; } } /* Different decorator became active, update all decorations */ if (dmWin != this->dmWin) { int i; this->dmSupports = dmSupports; /* Create new default decorations */ screen->updateSupportedWmHints (); if (dmWin) { for (i = 0; i < DECOR_NUM; i++) { decor[i].updateDecoration (screen->root (), decorAtom[i], &mRequestor); } } else { /* No decorator active, destroy all decorations */ for (i = 0; i < DECOR_NUM; i++) { decor[i].clear (); foreach (CompWindow *w, screen->windows ()) DecorWindow::get (w)->decor.mList.clear (); } } this->dmWin = dmWin; if (updateWindows) { foreach (CompWindow *w, screen->windows ()) if (w->shaded () || w->isViewable ()) DecorWindow::get (w)->update (true); } } } /* * DecorWindow::updateFrameRegion * * Shapes the toplevel frame region according to the rects * in the decoration that we have. This is a wrapped function * */ void DecorWindow::updateFrameRegion (CompRegion ®ion) { window->updateFrameRegion (region); if (wd) { if (!frameRegion.isEmpty ()) { int x, y; x = window->geometry (). x (); y = window->geometry (). y (); region += frameRegion.translated (x - wd->decor->input.left, y - wd->decor->input.top); } } updateReg = true; updateMatrix = true; } /* * DecorWindow::updateWindowRegions * * Used to update the region that the window type * decorations occupty when the window is moved */ void DecorWindow::updateWindowRegions () { const CompRect &input (window->inputRect ()); if (regions.size () != gWindow->textures ().size ()) regions.resize (gWindow->textures ().size ()); for (unsigned int i = 0; i < gWindow->textures ().size (); i++) { regions[i] = CompRegion (*gWindow->textures ()[i]); regions[i].translate (input.x (), input.y ()); regions[i] &= window->frameRegion (); } updateReg = false; } /* * DecorWindow::place * * Update any windows just before placement * so that placement algorithms will have the * border size at place-time */ bool DecorWindow::place (CompPoint &pos) { update (true); return window->place (pos); } /* * DecorWindow::windowNotify * * Window event notification handler. On various * events on windows we need to update the decorations * */ void DecorWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyMap: /* When the switcher is mapped, it has no frame window * so the frame window for it needs to mapped manually */ if (isSwitcher) { update (true); XMapWindow (screen->dpy (), inputFrame); break; } /* For non-switcher windows we need to update the decoration * anyways, since the window is unmapped. Also need to * update the shadow clip regions for panels and other windows */ update (true); updateDecorationScale (); if (dScreen->mMenusClipGroup.pushClippable (this)) updateGroupShadows (); break; case CompWindowNotifyUnmap: { /* When the switcher is unmapped, it has no frame window * so the frame window for it needs to unmapped manually */ if (isSwitcher) { update (true); XUnmapWindow (screen->dpy (), inputFrame); break; } /* For non-switcher windows we need to update the decoration * anyways, since the window is unmapped. Also need to * update the shadow clip regions for panels and other windows */ update (true); updateDecorationScale (); /* Preserve the group shadow update ptr */ DecorClipGroupInterface *clipGroup = mClipGroup; if (dScreen->mMenusClipGroup.popClippable (this)) if (clipGroup) clipGroup->updateAllShadows (); break; } case CompWindowNotifyUnreparent: { /* Compiz detaches the frame window from * the client on unreparent, so we must * destroy our frame windows by forcing * this window to have no decorations */ update (false); break; } case CompWindowNotifyReparent: /* Always update decorations when a window gets reparented */ update (true); break; case CompWindowNotifyShade: /* We get the notification for shade before the window is * actually resized which means that calling update -> * damageOutputExtents here will not do anything useful for us * so we need to track when windows are (un)shading and then wait * for the following resize notification to actually * update their decoration (since at this point they would have * been resized) */ shading = true; unshading = false; break; case CompWindowNotifyUnshade: unshading = true; shading = false; break; default: break; } window->windowNotify (n); } /* * DecorWindow::updateSwitcher * * Check this window to see if it is a switcher, * if so, update the switcher flag */ void DecorWindow::updateSwitcher () { Atom actualType; int actualFmt; unsigned long nitems, nleft; unsigned long *data; DECOR_SCREEN (screen); if (XGetWindowProperty (screen->dpy (), window->id (), ds->decorSwitchWindowAtom, 0L, 1024L, false, XA_WINDOW, &actualType, &actualFmt, &nitems, &nleft, (unsigned char **) &data) == Success) { if (data) XFree (data); if (nitems == 1) { isSwitcher = true; return; } } isSwitcher = false; } DecorPixmapRequestorInterface * DecorScreen::findWindowRequestor (Window window) { if (window == screen->root ()) { return &mRequestor; } else { CompWindow *w = screen->findWindow (window); if (w) return &(DecorWindow::get (w)->mRequestor); return NULL; } } DecorationListFindMatchingInterface * DecorScreen::findWindowDecorations (Window window) { if (window == screen->root ()) { return &decor[DECOR_ACTIVE]; } else { CompWindow *w = screen->findWindow (window); if (w) return &(DecorWindow::get (w)->decor); return NULL; } } /* * DecorScreen::handleEvent * * Handles X11 events */ void DecorScreen::handleEvent (XEvent *event) { Window activeWindow = screen->activeWindow (); CompWindow *w; switch (event->type) { case DestroyNotify: /* When a decorator selection owner window is destroyed * it means that this decorator went away, so we need * to account for this */ w = screen->findWindow (event->xdestroywindow.window); if (w) { if (w->id () == dmWin) checkForDm (true); } break; case ClientMessage: /* Update decorations whenever someone requests frame extents * so that core doesn't reply with the wrong extents when * when handleEvent is passed to core */ if (event->xclient.message_type == requestFrameExtentsAtom) { w = screen->findWindow (event->xclient.window); if (w) { DecorWindow *dw = DecorWindow::get (w); /* Set the frameExtentsRequested flag so that we know to * at least update _NET_WM_FRAME_EXTENTS (LP: #1110138) */ dw->frameExtentsRequested = true; dw->update (true); } } mCommunicator.handleClientMessage (event->xclient); break; default: /* Check for damage events. If the output or input window * or a texture is updated then damage output extents. */ if (cmActive && event->type == cScreen->damageEvent () + XDamageNotify) { XDamageNotifyEvent *de = (XDamageNotifyEvent *) event; if (frames.find (de->drawable) != frames.end ()) frames[de->drawable]->cWindow->damageOutputExtents (); foreach (DecorTexture *t, textures) { if (t->pixmap->getPixmap () == de->drawable) { foreach (CompWindow *w, screen->windows ()) { if (w->shaded () || w->mapNum ()) { DECOR_WINDOW (w); if (dw->wd && dw->wd->decor->texture == t) dw->cWindow->damageOutputExtents (); } } break; } } } break; } screen->handleEvent (event); /* If the active window changed, update the decoration, * as long as the decoration isn't animating out */ if (screen->activeWindow () != activeWindow) { w = screen->findWindow (activeWindow); if (w && !w->hasUnmapReference ()) DecorWindow::get (w)->update (true); w = screen->findWindow (screen->activeWindow ()); if (w) DecorWindow::get (w)->update (true); } switch (event->type) { case PropertyNotify: /* When the switcher atom changes we should probably * update the switcher property on this window */ if (event->xproperty.atom == decorSwitchWindowAtom) { CompWindow *w = screen->findWindow (event->xproperty.window); if (w) { DECOR_WINDOW (w); if (dw->isSwitcher && (event->xproperty.state != PropertyDelete)) dw->updateSwitcher (); } } /* Decorator has created or updated a decoration for this window, * update the decoration */ else if (event->xproperty.atom == winDecorAtom) { w = screen->findWindow (event->xproperty.window); if (w) { DECOR_WINDOW (w); dw->updateDecoration (); dw->update (true); } } /* _MOTIF_WM_HINTS has been set on this window, it may not * may need to be decorated */ else if (event->xproperty.atom == Atoms::mwmHints) { w = screen->findWindow (event->xproperty.window); if (w) DecorWindow::get (w)->update (true); } else { if (event->xproperty.window == screen->root ()) { /* If the supportingDmCheckAtom changed on the root window * it could mean that the decorator changed, so we need * to update decorations */ if (event->xproperty.atom == supportingDmCheckAtom) { checkForDm (true); } else { /* A default decoration changed */ for (int i = 0; i < DECOR_NUM; i++) { if (event->xproperty.atom == decorAtom[i]) { decor[i].updateDecoration (screen->root (), decorAtom[i], &mRequestor); foreach (CompWindow *w, screen->windows ()) DecorWindow::get (w)->update (true); } } } } } break; /* Whenever a window is configured, we need to update the frame window */ case ConfigureNotify: w = screen->findTopLevelWindow (event->xconfigure.window); if (w) { DECOR_WINDOW (w); if (!w->hasUnmapReference () && dw->wd && dw->wd->decor) dw->updateFrame (); } break; case DestroyNotify: /* Only for when the client window gets destroyed */ w = screen->findTopLevelWindow (event->xproperty.window); if (w) { DECOR_WINDOW (w); if (dw->inputFrame && dw->inputFrame == event->xdestroywindow.window) { XDeleteProperty (screen->dpy (), w->id (), inputFrameAtom); dw->inputFrame = None; } else if (dw->outputFrame && dw->outputFrame == event->xdestroywindow.window) { XDeleteProperty (screen->dpy (), w->id (), outputFrameAtom); dw->outputFrame = None; } } break; /* Add new shape rects to frame region in case of a * shape notification */ default: if (screen->XShape () && event->type == screen->shapeEvent () + ShapeNotify) { w = screen->findWindow (((XShapeEvent *) event)->window); if (w) DecorWindow::get (w)->update (true); else { foreach (w, screen->windows ()) { DECOR_WINDOW (w); if (dw->inputFrame == ((XShapeEvent *) event)->window) { dw->frameRegion = CompRegion (); updateRegionWithShapeRectangles (screen->dpy (), dw->inputFrame, dw->frameRegion); w->updateFrameRegion (); } else if (dw->outputFrame == ((XShapeEvent *) event)->window) { dw->frameRegion = CompRegion (); updateRegionWithShapeRectangles (screen->dpy (), dw->outputFrame, dw->frameRegion); w->updateFrameRegion (); } } } } break; } } /* * DecorWindow::damageRect * * When this window is first presented to the user, we need to update * the decoration since it is now visible * */ bool DecorWindow::damageRect (bool initial, const CompRect &rect) { if (initial) update (true); return cWindow->damageRect (initial, rect); } /* * DecorWindow::getOutputExtents * * Extend "output extents" (eg decoration + shadows) for this * window if necessary */ void DecorWindow::getOutputExtents (CompWindowExtents& output) { window->getOutputExtents (output); if (wd) { CompWindowExtents *e = &wd->decor->output; if (e->left > output.left) output.left = e->left; if (e->right > output.right) output.right = e->right; if (e->top > output.top) output.top = e->top; if (e->bottom > output.bottom) output.bottom = e->bottom; } } /* * DecorScreen::updateDefaultShadowProperty * * Set some default shadow options on the root * window in case the default decorator doesn't * use custom shadows */ void DecorScreen::updateDefaultShadowProperty () { long data[8]; CompOption *activeColorOption = CompOption::findOption (getOptions (), "active_shadow_color"); CompOption *inactiveColorOption = CompOption::findOption (getOptions (), "inactive_shadow_color"); char *colorString[2]; XTextProperty xtp; if (!activeColorOption || !inactiveColorOption) return; colorString[0] = strdup (CompOption::colorToString (activeColorOption->value ().c ()).c_str ()); colorString[1] = strdup (CompOption::colorToString (inactiveColorOption->value ().c ()).c_str ()); /* 1) Active Shadow Radius * 2) Active Shadow Opacity * 3) Active Shadow Offset X * 4) Active Shadow Offset Y * 5) Inactive Shadow Radius * 6) Inactive Shadow Opacity * 7) Inactive Shadow Offset X * 8) Inactive Shadow Offset Y */ /* the precision is 0.0001, so multiply by 1000 */ data[0] = optionGetActiveShadowRadius () * 1000; data[1] = optionGetActiveShadowOpacity () * 1000; data[2] = optionGetActiveShadowXOffset (); data[3] = optionGetActiveShadowYOffset (); data[4] = optionGetInactiveShadowRadius () * 1000; data[5] = optionGetInactiveShadowOpacity () * 1000; data[6] = optionGetInactiveShadowXOffset (); data[7] = optionGetInactiveShadowYOffset (); XChangeProperty (screen->dpy (), screen->root (), shadowInfoAtom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, 8); if (XStringListToTextProperty (colorString, 2, &xtp)) { XSetTextProperty (screen->dpy (), screen->root (), &xtp, shadowColorAtom); XFree (xtp.value); } free (colorString[0]); free (colorString[1]); } bool DecorScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = DecorOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case DecorOptions::Command: if (!dmWin) screen->runCommand (optionGetCommand ()); break; case DecorOptions::ShadowMatch: { CompString matchString; /* Make sure RGBA matching is always present and disable shadows for RGBA windows by default if the user didn't specify an RGBA match. Reasoning for that is that shadows are desired for some RGBA windows (e.g. rectangular windows that just happen to have an RGBA colormap), while it's absolutely undesired for others (especially shaped ones) ... by enforcing no shadows for RGBA windows by default, we are flexible to user desires while still making sure we don't show ugliness by default */ matchString = optionGetShadowMatch ().toString (); if (matchString.find ("rgba=") == CompString::npos) { CompMatch rgbaMatch ("rgba=0"); optionGetShadowMatch () &= rgbaMatch; } } /* fall-through intended */ case DecorOptions::DecorationMatch: foreach (CompWindow *w, screen->windows ()) DecorWindow::get (w)->update (true); break; case DecorOptions::ActiveShadowRadius: case DecorOptions::ActiveShadowOpacity: case DecorOptions::ActiveShadowColor: case DecorOptions::ActiveShadowXOffset: case DecorOptions::ActiveShadowYOffset: case DecorOptions::InactiveShadowRadius: case DecorOptions::InactiveShadowOpacity: case DecorOptions::InactiveShadowColor: case DecorOptions::InactiveShadowXOffset: case DecorOptions::InactiveShadowYOffset: updateDefaultShadowProperty (); break; default: break; } return rv; } /* * DecorWindow::moveNotify * * Translate window scaled quad boxes for movement * and also recompute shadow clip regions * for panels and menus */ void DecorWindow::moveNotify (int dx, int dy, bool immediate) { if (wd) { for (int i = 0; i < wd->nQuad; i++) { wd->quad[i].box.x1 += dx; wd->quad[i].box.y1 += dy; wd->quad[i].box.x2 += dx; wd->quad[i].box.y2 += dy; } } updateReg = true; updateMatrix = true; mInputRegion.translate (dx, dy); mOutputRegion.translate (dx, dy); if (dScreen->cmActive && mClipGroup) updateGroupShadows (); window->moveNotify (dx, dy, immediate); } /* * DecorWindow::resizeNotify * * Called whenever a window is resized. Update scaled quads and * recompute shadow region * */ void DecorWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (shading || unshading) { shading = false; unshading = false; } updateMatrix = true; updateReg = true; mInputRegion = CompRegion (window->inputRect ()); mOutputRegion = CompRegion (window->outputRect ()); if (dScreen->cmActive && mClipGroup) updateGroupShadows (); updateReg = true; window->resizeNotify (dx, dy, dwidth, dheight); } /* * DecorWindow::stateChangeNotify * * Called whenever a window state changes, we might need to use * different extents in case the decoration didn't change * */ void DecorWindow::stateChangeNotify (unsigned int lastState) { update (true); window->stateChangeNotify (lastState); } void DecorScreen::matchPropertyChanged (CompWindow *w) { DecorWindow::get (w)->update (true); screen->matchPropertyChanged (w); } /* * DecorScreen::addSupportedAtoms * * _NET_REQUEST_FRAME_EXTENTS is only supported where * a decorator is running, so add that to _NET_WM_SUPPORTED * where that is the case * */ void DecorScreen::addSupportedAtoms (std::vector &atoms) { screen->addSupportedAtoms (atoms); /* Don't support _NET_REQUEST_FRAME_EXTENTS * where there is no decorator running yet */ if (dmWin) atoms.push_back (requestFrameExtentsAtom); } void DecorWindow::updateHandlers () { if (dScreen->cmActive) { gWindow = GLWindow::get (window); cWindow = CompositeWindow::get (window); CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); } else { CompositeWindowInterface::setHandler (cWindow, false); GLWindowInterface::setHandler (gWindow, false); gWindow = NULL; cWindow = NULL; } } /* * DecorScreen::decoratorStartTimeout * * Start a decorator in case there isn't one running * */ bool DecorScreen::decoratorStartTimeout () { if (!dmWin) screen->runCommand (optionGetCommand ()); /* Update all the windows */ foreach (CompWindow *w, screen->windows ()) { DECOR_WINDOW (w); dw->updateHandlers (); dw->updateSwitcher (); if (!w->overrideRedirect () || dw->isSwitcher) dw->updateDecoration (); if (w->shaded () || w->isViewable ()) dw->update (true); } return false; } bool DecorScreen::registerPaintHandler (compiz::composite::PaintHandler *p) { cmActive = true; return cScreen->registerPaintHandler (p); } void DecorScreen::unregisterPaintHandler () { cmActive = false; return cScreen->unregisterPaintHandler (); } /* * DecorScreen::DecorScreen * * Initialize atoms, and create a * default "window type" decoration * and ensure that _NET_REQUEST_FRAME_EXTENTS * gets added to _NET_WM_SUPPORTED * */ DecorScreen::DecorScreen (CompScreen *s) : PluginClassHandler (s), cScreen (CompositeScreen::get (s)), textures (), dmWin (None), dmSupports (0), cmActive (false), windowDefault (new Decoration (WINDOW_DECORATION_TYPE_WINDOW, decor_extents_t (), decor_extents_t (), decor_extents_t (), decor_extents_t (), 0, 0, 0, 0, 0, None, boost::shared_array (static_cast (NULL)), 0, screen->root (), NULL)), mMenusClipGroup (CompMatch ("type=Dock | type=DropdownMenu | type=PopupMenu")), mRequestor (screen->dpy (), screen->root (), &(decor[DECOR_ACTIVE])), mReleasePool (new PixmapReleasePool ( boost::bind (XFreePixmap, screen->dpy (), _1))), mPendingHandler (boost::bind (&DecorScreen::findWindowRequestor, this, _1)), mUnusedHandler (boost::bind (&DecorScreen::findWindowDecorations, this, _1), mReleasePool, boost::bind (XFreePixmap, screen->dpy (), _1)), mCommunicator (XInternAtom (screen->dpy (), DECOR_PIXMAP_PENDING_ATOM_NAME, FALSE), XInternAtom (screen->dpy (), DECOR_DELETE_PIXMAP_ATOM_NAME, FALSE), boost::bind (&PendingHandler::handleMessage, &mPendingHandler, _1, _2), boost::bind (&UnusedHandler::handleMessage, &mUnusedHandler, _1, _2)) { supportingDmCheckAtom = XInternAtom (s->dpy (), DECOR_SUPPORTING_DM_CHECK_ATOM_NAME, 0); winDecorAtom = XInternAtom (s->dpy (), DECOR_WINDOW_ATOM_NAME, 0); decorAtom[DECOR_BARE] = XInternAtom (s->dpy (), DECOR_BARE_ATOM_NAME, 0); decorAtom[DECOR_ACTIVE] = XInternAtom (s->dpy (), DECOR_ACTIVE_ATOM_NAME, 0); inputFrameAtom = XInternAtom (s->dpy (), DECOR_INPUT_FRAME_ATOM_NAME, 0); outputFrameAtom = XInternAtom (s->dpy (), DECOR_OUTPUT_FRAME_ATOM_NAME, 0); decorTypeAtom = XInternAtom (s->dpy (), DECOR_TYPE_ATOM_NAME, 0); decorTypePixmapAtom = XInternAtom (s->dpy (), DECOR_TYPE_PIXMAP_ATOM_NAME, 0); decorTypeWindowAtom = XInternAtom (s->dpy (), DECOR_TYPE_WINDOW_ATOM_NAME, 0); decorSwitchWindowAtom = XInternAtom (s->dpy (), DECOR_SWITCH_WINDOW_ATOM_NAME, 0); decorPendingAtom = XInternAtom (s->dpy (), DECOR_PIXMAP_PENDING_ATOM_NAME, 0); decorRequestAtom = XInternAtom (s->dpy (), DECOR_REQUEST_PIXMAP_ATOM_NAME, 0); requestFrameExtentsAtom = XInternAtom (s->dpy (), "_NET_REQUEST_FRAME_EXTENTS", 0); shadowColorAtom = XInternAtom (s->dpy (), "_COMPIZ_NET_CM_SHADOW_COLOR", 0); shadowInfoAtom = XInternAtom (s->dpy (), "_COMPIZ_NET_CM_SHADOW_PROPERTIES", 0); cmActive = (cScreen) ? cScreen->compositingActive () && GLScreen::get (s) != NULL : false; checkForDm (false); decoratorStart.start (boost::bind (&DecorScreen::decoratorStartTimeout, this), 0); ScreenInterface::setHandler (s); CompositeScreenInterface::setHandler (cScreen); screen->updateSupportedWmHints (); } /* * DecorScreen::~DecorScreen * * Ensure that _NET_REQUEST_FRAME_EXTENTS * is cleared from _NET_WM_SUPPORTED * */ DecorScreen::~DecorScreen () { for (unsigned int i = 0; i < DECOR_NUM; i++) decor[i].clear (); screen->addSupportedAtomsSetEnabled (this, false); screen->updateSupportedWmHints (); } DecorWindow::DecorWindow (CompWindow *w) : PluginClassHandler (w), window (w), gWindow (GLWindow::get (w)), cWindow (CompositeWindow::get (w)), dScreen (DecorScreen::get (screen)), wd (NULL), inputFrame (None), outputFrame (None), pixmapFailed (false), regions (), updateReg (true), updateMatrix (true), unshading (false), shading (false), isSwitcher (false), frameExtentsRequested (false), mClipGroup (NULL), mOutputRegion (window->outputRect ()), mInputRegion (window->inputRect ()), mRequestor (screen->dpy (), w->id (), &decor), lastMaximizedStateDecorated (0) { WindowInterface::setHandler (window); /* FIXME :DecorWindow::update can call updateWindowOutputExtents * which will call a zero-diff resizeNotify. Since this window * might be part of a startup procedure, we can't assume that * all other windows in the list are necessarily safe to use * (since DecorWindow::DecorWindow might not have been called * for them) so we need to turn off resize notifications * and turn them back on once we're done updating the decoration */ window->resizeNotifySetEnabled (this, false); if (!dScreen->decoratorStart.active ()) { updateHandlers (); updateSwitcher (); if (!w->overrideRedirect () || isSwitcher) updateDecoration (); if (w->shaded () || w->isViewable ()) update (true); } window->resizeNotifySetEnabled (this, true); if (!window->invisible ()) if (dScreen->mMenusClipGroup.pushClippable (this)) updateGroupShadows (); } /* * DecorWindow::~DecorWindow * * On tear-down, we need to shift all windows * back to their original positions */ DecorWindow::~DecorWindow () { if (!window->destroyed ()) update (false); if (wd) WindowDecoration::destroy (wd); if (mClipGroup) mClipGroup->popClippable (this); decor.mList.clear (); } bool DecorPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/decor/src/compiz-decorator0000755000004100000410000000574013246301623020024 0ustar www-datawww-data#!/bin/sh # Starts Compiz Decorator depending on the DE # # Copyright (c) 2007 CyberOrg # Based on compiz-manager script by Kristian Lyngstøl # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # Contributions by: crdlb # Modifications by: Daniel van Vugt # if [ -z "$COMPIZ_BIN_PATH" ]; then COMPIZ_BIN_PATH="/usr/bin/" fi KWIN=`which kwin` METACITY="/usr/bin/metacity" # # Default to gtk/kde4-window-decorator # USE_EMERALD="no" DECORATOR="" #Do not leave users without decoration if decorator fails if [ "$DESKTOP_SESSION" = "kde" ]; then FALLBACKWM="${KWIN}" else FALLBACKWM="${METACITY}" fi FALLBACKWM_OPTIONS=" --replace" # # Set to yes to enable verbose # VERBOSE="yes" # # Echos the arguments if verbose # verbose() { if [ "x$VERBOSE" = "xyes" ]; then printf "$*" fi } # Read configuration from XDG paths if [ -z "$XDG_CONFIG_DIRS" ]; then test -f /etc/xdg/compiz/compiz-manager && . /etc/xdg/compiz/compiz-manager else test -f $XDG_CONFIG_DIRS/compiz/compiz-manager && . $XDG_CONFIG_DIRS/compiz/compiz-manager fi if [ -z "$XDG_CONFIG_HOME" ]; then test -f $HOME/.config/compiz/compiz-manager && . $HOME/.config/compiz/compiz-manager else test -f $XDG_CONFIG_HOME/compiz/compiz-manager && . $XDG_CONFIG_HOME/compiz/compiz-manager fi # start a decorator if [ -x ${COMPIZ_BIN_PATH}emerald ] && [ "$USE_EMERALD" = "yes" ]; then DECORATOR=emerald elif [ -x ${COMPIZ_BIN_PATH}gtk-window-decorator ] && [ -n "$GNOME_DESKTOP_SESSION_ID" ]; then DECORATOR=gtk-window-decorator elif [ -x ${COMPIZ_BIN_PATH}kde4-window-decorator ] && [ x$KDE_SESSION_VERSION = x"4" ]; then DECORATOR=kde4-window-decorator fi # fall back to any decorator that is installed if [ -z "$DECORATOR" ]; then verbose "Couldn't find a perfect decorator match; trying all decorators\n" if [ -x ${COMPIZ_BIN_PATH}emerald ]; then DECORATOR=emerald elif [ -x ${COMPIZ_BIN_PATH}gtk-window-decorator ]; then DECORATOR=gtk-window-decorator elif [ -x ${COMPIZ_BIN_PATH}kde4-window-decorator ]; then DECORATOR=kde4-window-decorator fi fi if [ -n "$DECORATOR" ]; then verbose "Starting ${DECORATOR}\n" exec ${COMPIZ_BIN_PATH}$DECORATOR "$@" else verbose "Found no decorator to start\n" exec $FALLBACKWM $FALLBACKWM_OPTIONS fi ./plugins/decor/src/clip-groups/0000755000004100000410000000000013246301623017053 5ustar www-datawww-data./plugins/decor/src/clip-groups/CMakeLists.txt0000644000004100000410000000213613246301623021615 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/clip-groups.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/clip-groups.cpp ) ADD_LIBRARY( compiz_decor_clip_groups STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_decor_clip_groups PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) TARGET_LINK_LIBRARIES( compiz_decor_clip_groups compiz_core ${GLIBMM_LIBRARIES} ) ./plugins/decor/src/clip-groups/include/0000755000004100000410000000000013246301623020476 5ustar www-datawww-data./plugins/decor/src/clip-groups/include/clip-groups.h0000644000004100000410000000611113246301623023112 0ustar www-datawww-data/* * Copyright (C) 2001 Havoc Pennington * Copyright (C) 2002, 2003 Red Hat, Inc. * Copyright (C) 2003 Rob Adams * Copyright (C) 2005 Novell, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #ifndef _COMPIZ_DECOR_CLIP_GROUPS_H #define _COMPIZ_DECOR_CLIP_GROUPS_H #include #include #include #include namespace compiz { namespace decor { class DecorClipGroupInterface; class DecorClippableInterface { public: virtual ~DecorClippableInterface () = 0; void updateShadow (const CompRegion &r) { doUpdateShadow (r); } void setOwner (DecorClipGroupInterface *i) { doSetOwner (i); } bool matches (const CompMatch &m) { return doMatches (m); } const CompRegion & outputRegion () { return getOutputRegion (); } const CompRegion & inputRegion () { return getInputRegion (); } void updateGroupShadows () { doUpdateGroupShadows (); } private: virtual void doUpdateShadow (const CompRegion &) = 0; virtual void doSetOwner (DecorClipGroupInterface *i) = 0; virtual bool doMatches (const CompMatch &m) = 0; virtual const CompRegion & getOutputRegion () = 0; virtual const CompRegion & getInputRegion () = 0; virtual void doUpdateGroupShadows () = 0; }; class DecorClipGroupInterface { public: virtual ~DecorClipGroupInterface () = 0; bool pushClippable (DecorClippableInterface *dc) { return doPushClippable (dc); } bool popClippable (DecorClippableInterface *dc) { return doPopClippable (dc); } void regenerateClipRegion () { doRegenerateClipRegion (); } const CompRegion & clipRegion () { return getClipRegion (); } void updateAllShadows () { return doUpdateAllShadows (); } private: virtual bool doPushClippable (DecorClippableInterface *dc) = 0; virtual bool doPopClippable (DecorClippableInterface *dc) = 0; virtual void doRegenerateClipRegion () = 0; virtual const CompRegion & getClipRegion () = 0; virtual void doUpdateAllShadows () = 0; }; namespace impl { class GenericDecorClipGroup : public DecorClipGroupInterface { private: bool doPushClippable (DecorClippableInterface *dc); bool doPopClippable (DecorClippableInterface *dc); void doRegenerateClipRegion (); const CompRegion & getClipRegion (); void doUpdateAllShadows (); std::vector mClippables; CompRegion mRegion; }; } } } #endif ./plugins/decor/src/clip-groups/src/0000755000004100000410000000000013246301623017642 5ustar www-datawww-data./plugins/decor/src/clip-groups/src/clip-groups.cpp0000644000004100000410000000303213246301623022610 0ustar www-datawww-data#include "clip-groups.h" #include #include #ifndef foreach #define foreach BOOST_FOREACH #endif using namespace compiz::decor; using namespace compiz::decor::impl; DecorClippableInterface::~DecorClippableInterface () {} DecorClipGroupInterface::~DecorClipGroupInterface () {} bool GenericDecorClipGroup::doPushClippable (DecorClippableInterface *dc) { std::vector ::iterator it = std::find (mClippables.begin (), mClippables.end (), dc); if (it == mClippables.end ()) { mClippables.push_back (dc); regenerateClipRegion (); dc->setOwner (this); return true; } return false; } bool GenericDecorClipGroup::doPopClippable (DecorClippableInterface *dc) { std::vector ::iterator it = std::find (mClippables.begin (), mClippables.end (), dc); if (it != mClippables.end ()) { dc->setOwner (NULL); dc->updateShadow (CompRegion::empty ()); mClippables.erase (it); regenerateClipRegion (); return true; } return false; } void GenericDecorClipGroup::doRegenerateClipRegion () { mRegion -= CompRegion::infinite (); foreach (DecorClippableInterface *clippable, mClippables) { mRegion += clippable->inputRegion (); } } const CompRegion & GenericDecorClipGroup::getClipRegion () { return mRegion; } void GenericDecorClipGroup::doUpdateAllShadows () { foreach (DecorClippableInterface *clippable, mClippables) clippable->updateShadow (mRegion); } ./plugins/decor/src/clip-groups/tests/0000755000004100000410000000000013246301623020215 5ustar www-datawww-data./plugins/decor/src/clip-groups/tests/CMakeLists.txt0000644000004100000410000000072213246301623022756 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_executable (compiz_test_decor_clip_groups ${CMAKE_CURRENT_SOURCE_DIR}/clip-groups/src/test-decor-clip-groups.cpp) target_link_libraries (compiz_test_decor_clip_groups compiz_decor_clip_groups ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_decor_clip_groups COVERAGE compiz_decor_clip_groups) ./plugins/decor/src/clip-groups/tests/clip-groups/0000755000004100000410000000000013246301623022461 5ustar www-datawww-data./plugins/decor/src/clip-groups/tests/clip-groups/src/0000755000004100000410000000000013246301624023251 5ustar www-datawww-data./plugins/decor/src/clip-groups/tests/clip-groups/src/test-decor-clip-groups.cpp0000644000004100000410000002574313246301623030302 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include "clip-groups.h" using ::testing::Invoke; using ::testing::_; using ::testing::StrictMock; using namespace compiz::decor; class CompDecorClipGroupsTest : public ::testing::Test { }; class FakeDecorClippable : public DecorClippableInterface { public: FakeDecorClippable (const CompRegion &inputRegion, const CompRegion &outputRegion, DecorClippableInterface *parent, bool matches) : mInputRegion (inputRegion), mOutputRegion (outputRegion), mParent (parent), mOwner (NULL), mMatches (matches) { } ~FakeDecorClippable () { if (mOwner) mOwner->popClippable (mParent); } const CompRegion & getShadowRegion () { return mShadowRegion; } private: void doUpdateShadow (const CompRegion &r) { mShadowRegion = mOutputRegion.intersected (r - mInputRegion); } void doSetOwner (DecorClipGroupInterface *i) { mOwner = i; } bool doMatches (const CompMatch &m) { return mMatches; } const CompRegion & getOutputRegion () { return mOutputRegion; } const CompRegion & getInputRegion () { return mInputRegion; } void doUpdateGroupShadows () { if (mOwner) mOwner->updateAllShadows (); } CompRegion mInputRegion; CompRegion mOutputRegion; CompRegion mShadowRegion; DecorClippableInterface *mParent; DecorClipGroupInterface *mOwner; bool mMatches; }; class MockDecorClippable : public DecorClippableInterface { public: MOCK_METHOD1 (doUpdateShadow, void (const CompRegion &)); MOCK_METHOD1 (doSetOwner, void (DecorClipGroupInterface *)); MOCK_METHOD1 (doMatches, bool (const CompMatch &)); MOCK_METHOD0 (getOutputRegion, const CompRegion & ()); MOCK_METHOD0 (getInputRegion, const CompRegion & ()); MOCK_METHOD0 (doUpdateGroupShadows, void ()); void Delegate (DecorClippableInterface &other) { ON_CALL (*this, doUpdateShadow (_)).WillByDefault (Invoke (&other, &DecorClippableInterface::updateShadow)); ON_CALL (*this, doSetOwner (_)).WillByDefault (Invoke (&other, &DecorClippableInterface::setOwner)); ON_CALL (*this, doMatches (_)).WillByDefault (Invoke (&other, &DecorClippableInterface::matches)); ON_CALL (*this, getOutputRegion ()).WillByDefault (Invoke (&other, &DecorClippableInterface::outputRegion)); ON_CALL (*this, getInputRegion ()).WillByDefault (Invoke (&other, &DecorClippableInterface::inputRegion)); ON_CALL (*this, doUpdateGroupShadows ()).WillByDefault (Invoke (&other, &DecorClippableInterface::updateGroupShadows)); } }; void PrintTo(const CompRegion ®, ::std::ostream *os) { const CompRect &br = reg.boundingRect (); *os << "Bounding Rect " << br.x () << " " << br.y () << " " << br.width () << " " << br.height () << std::endl; const CompRect::vector &rv = reg.rects (); for (CompRect::vector::const_iterator it = rv.begin (); it != rv.end (); ++it) { const CompRect &r = *it; *os << " - Rect : " << r.x () << " " << r.y () << " " << r.width () << " " << r.height () << std::endl; } } TEST_F(CompDecorClipGroupsTest, TestPushClippable) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); EXPECT_CALL (mdc, getInputRegion ()); EXPECT_CALL (mdc, doSetOwner (_)).Times (2); EXPECT_CALL (mdc, doUpdateShadow (_)); cg.pushClippable (&mdc); } TEST_F(CompDecorClipGroupsTest, TestPushClippableUpdatesRegion) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); EXPECT_CALL (mdc, getInputRegion ()).Times (2); EXPECT_CALL (mdc, doSetOwner (_)).Times (2); EXPECT_CALL (mdc, doUpdateShadow (_)); cg.pushClippable (&mdc); EXPECT_EQ (cg.clipRegion (), mdc.inputRegion ()); } MATCHER_P (CompRegionEq, other, "") { return (arg ^ other).isEmpty (); } TEST_F(CompDecorClipGroupsTest, TestPush2ClippableUpdatesRegion) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (250, 250, 100, 100), CompRegion (200, 200, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); EXPECT_CALL (mdc, getInputRegion ()).Times (4); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc2, getInputRegion ()).Times (2); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (1); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); } TEST_F(CompDecorClipGroupsTest, TestPush3ClippableUpdatesRegion) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (150, 150, 100, 100), CompRegion (100, 100, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); StrictMock mdc3; FakeDecorClippable fdc3 (CompRegion (250, 250, 100, 100), CompRegion (200, 200, 100, 100), &mdc3, true); mdc3.Delegate (fdc3); EXPECT_CALL (mdc, getInputRegion ()).Times (6); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc2, getInputRegion ()).Times (4); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc3, getInputRegion ()).Times (2); EXPECT_CALL (mdc3, doSetOwner (&cg)); EXPECT_CALL (mdc3, doSetOwner (NULL)); EXPECT_CALL (mdc3, doUpdateShadow (_)).Times (1); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); cg.pushClippable (&mdc3); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); accumulated += mdc3.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); } TEST_F(CompDecorClipGroupsTest, TestPush2ClippableUpdatesShadow) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 25, 25), CompRegion (25, 25, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (75, 75, 50, 50), CompRegion (25, 25, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); EXPECT_CALL (mdc, getInputRegion ()).Times (4); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (2); EXPECT_CALL (mdc2, getInputRegion ()).Times (2); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (2); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); cg.updateAllShadows (); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); CompRegion fdcRegion (75, 75, 50, 50); EXPECT_THAT (fdc.getShadowRegion (), CompRegionEq (fdcRegion)); CompRegion fdc2Region (50, 50, 25, 25); EXPECT_THAT (fdc2.getShadowRegion (), CompRegionEq (fdc2Region)); } TEST_F(CompDecorClipGroupsTest, TestPush3ClippableUpdatesRegionPop1) { impl::GenericDecorClipGroup cg; StrictMock mdc; FakeDecorClippable fdc (CompRegion (50, 50, 100, 100), CompRegion (0, 0, 100, 100), &mdc, true); mdc.Delegate (fdc); StrictMock mdc2; FakeDecorClippable fdc2 (CompRegion (150, 150, 100, 100), CompRegion (100, 100, 100, 100), &mdc2, true); mdc2.Delegate (fdc2); StrictMock mdc3; FakeDecorClippable fdc3 (CompRegion (250, 250, 100, 100), CompRegion (200, 200, 100, 100), &mdc3, true); mdc3.Delegate (fdc3); EXPECT_CALL (mdc, getInputRegion ()).Times (7); EXPECT_CALL (mdc, doSetOwner (&cg)); EXPECT_CALL (mdc, doSetOwner (NULL)); EXPECT_CALL (mdc, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc2, getInputRegion ()).Times (5); EXPECT_CALL (mdc2, doSetOwner (&cg)); EXPECT_CALL (mdc2, doSetOwner (NULL)); EXPECT_CALL (mdc2, doUpdateShadow (_)).Times (1); EXPECT_CALL (mdc3, getInputRegion ()).Times (2); EXPECT_CALL (mdc3, doSetOwner (&cg)); EXPECT_CALL (mdc3, doSetOwner (NULL)); EXPECT_CALL (mdc3, doUpdateShadow (_)).Times (1); cg.pushClippable (&mdc); cg.pushClippable (&mdc2); cg.pushClippable (&mdc3); CompRegion accumulated; accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); accumulated += mdc3.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); cg.popClippable (&mdc3); accumulated = CompRegion (); accumulated += mdc.inputRegion (); accumulated += mdc2.inputRegion (); EXPECT_THAT (cg.clipRegion (), CompRegionEq (accumulated)); } ./plugins/decor/src/decor.h0000644000004100000410000002410313246301623016054 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include #include #include "decor_options.h" #define DECOR_SCREEN(s) DecorScreen *ds = DecorScreen::get(s) #define DECOR_WINDOW(w) DecorWindow *dw = DecorWindow::get(w) struct Vector { int dx; int dy; int x0; int y0; }; /* FIXME: Remove */ #define DECOR_BARE 0 #define DECOR_ACTIVE 1 #define DECOR_NUM 2 using namespace compiz::decor; class MatchedDecorClipGroup : public DecorClipGroupInterface { public: MatchedDecorClipGroup (const CompMatch &match); private: bool doPushClippable (DecorClippableInterface *dc); bool doPopClippable (DecorClippableInterface *dc) { return mClipGroupImpl.popClippable (dc); } void doRegenerateClipRegion () { return mClipGroupImpl.regenerateClipRegion (); } const CompRegion & getClipRegion () { return mClipGroupImpl.clipRegion (); } void doUpdateAllShadows () { return mClipGroupImpl.updateAllShadows (); } impl::GenericDecorClipGroup mClipGroupImpl; CompMatch mMatch; }; class DecorTexture { public: DecorTexture (DecorPixmapInterface::Ptr pixmap); ~DecorTexture (); public: bool status; int refCount; DecorPixmapInterface::Ptr pixmap; Damage damage; GLTexture::List textures; }; class DecorWindow; class Decoration : public DecorationInterface { public: typedef boost::shared_ptr Ptr; static const unsigned int UpdateRequested = 1 << 0; static const unsigned int UpdatesPending = 1 << 1; static Decoration::Ptr create (Window id, long *prop, unsigned int size, unsigned int type, unsigned int nOffset, DecorPixmapRequestorInterface *requestor); Decoration (int type, const decor_extents_t &border, const decor_extents_t &input, const decor_extents_t &maxBorder, const decor_extents_t &maxInput, unsigned int frameType, unsigned int frameState, unsigned int frameActions, unsigned int minWidth, unsigned int minHeight, Pixmap pixmap, const boost::shared_array &quad, unsigned int nQuad, Window owner, DecorPixmapRequestorInterface *); ~Decoration (); DecorPixmapReceiverInterface & receiverInterface (); unsigned int getFrameType () const; unsigned int getFrameState () const; unsigned int getFrameActions () const; public: int refCount; DecorTexture *texture; CompWindowExtents output; CompWindowExtents border; CompWindowExtents input; CompWindowExtents maxBorder; CompWindowExtents maxInput; int minWidth; int minHeight; unsigned int frameType; unsigned int frameState; unsigned int frameActions; boost::shared_array quad; int nQuad; int type; unsigned int updateState; X11DecorPixmapReceiver mPixmapReceiver; private: bool bareDecorationOnly (); Decoration::Ptr findRealDecoration (); Decoration::Ptr findBareDecoration (); void moveDecoratedWindowBy (const CompPoint &movement); }; class DecorationList : public DecorationListFindMatchingInterface { public: bool updateDecoration (Window id, Atom decorAtom, DecorPixmapRequestorInterface *requestor); DecorationInterface::Ptr findMatchingDecoration (unsigned int frameType, unsigned int frameState, unsigned int frameActions) const; DecorationInterface::Ptr findMatchingDecoration (Pixmap p) const; const Decoration::Ptr & findMatchingDecoration (CompWindow *w, bool sizeCheck); void clear () { mList.clear (); }; DecorationList (); std::list mList; }; struct ScaledQuad { GLTexture::Matrix matrix; BoxRec box; float sx; float sy; }; class WindowDecoration { public: static WindowDecoration * create (const Decoration::Ptr &d); static void destroy (WindowDecoration *); public: Decoration::Ptr decor; ScaledQuad *quad; int nQuad; }; class DecorWindow; class DecorScreen : public ScreenInterface, public CompositeScreenInterface, public PluginClassHandler, public DecorOptions { public: DecorScreen (CompScreen *s); ~DecorScreen (); bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *event); void matchPropertyChanged (CompWindow *); void addSupportedAtoms (std::vector&); DecorTexture * getTexture (Pixmap); void releaseTexture (DecorTexture *); void checkForDm (bool); bool decoratorStartTimeout (); void updateDefaultShadowProperty (); bool registerPaintHandler (compiz::composite::PaintHandler *pHnd); void unregisterPaintHandler (); private: DecorPixmapRequestorInterface * findWindowRequestor (Window); DecorationListFindMatchingInterface * findWindowDecorations (Window); public: CompositeScreen *cScreen; std::list textures; Atom supportingDmCheckAtom; Atom winDecorAtom; Atom decorAtom[DECOR_NUM]; Atom inputFrameAtom; Atom outputFrameAtom; Atom decorTypeAtom; Atom decorTypePixmapAtom; Atom decorTypeWindowAtom; Atom requestFrameExtentsAtom; Atom shadowColorAtom; Atom shadowInfoAtom; Atom decorSwitchWindowAtom; Atom decorPendingAtom; Atom decorRequestAtom; Window dmWin; int dmSupports; bool cmActive; DecorationList decor[DECOR_NUM]; Decoration::Ptr windowDefault; std::map frames; CompTimer decoratorStart; MatchedDecorClipGroup mMenusClipGroup; X11DecorPixmapRequestor mRequestor; PixmapReleasePool::Ptr mReleasePool; PendingHandler mPendingHandler; UnusedHandler mUnusedHandler; protocol::Communicator mCommunicator; }; class DecorWindow : public WindowInterface, public CompositeWindowInterface, public GLWindowInterface, public PluginClassHandler, public DecorClippableInterface { public: DecorWindow (CompWindow *w); ~DecorWindow (); void getOutputExtents (CompWindowExtents&); void resizeNotify (int, int, int, int); void moveNotify (int, int, bool); void stateChangeNotify (unsigned int); void updateFrameRegion (CompRegion ®ion); bool damageRect (bool, const CompRect &); bool place (CompPoint &pos); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); void glDecorate (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); void windowNotify (CompWindowNotify n); void updateDecoration (); void setDecorationMatrices (); void updateDecorationScale (); void updateFrame (); void updateInputFrame (); void updateOutputFrame (); void updateWindowRegions (); bool checkSize (const Decoration::Ptr &decor); int shiftX (); int shiftY (); bool update (bool); bool resizeTimeout (); void updateSwitcher (); void updateHandlers (); static bool matchType (CompWindow *w, unsigned int decorType); static bool matchState (CompWindow *w, unsigned int decorState); static bool matchActions (CompWindow *w, unsigned int decorActions); private: void doUpdateShadow (const CompRegion &); void doSetOwner (DecorClipGroupInterface *i); bool doMatches (const CompMatch &m); const CompRegion & getOutputRegion (); const CompRegion & getInputRegion (); void doUpdateGroupShadows (); public: CompWindow *window; GLWindow *gWindow; CompositeWindow *cWindow; DecorScreen *dScreen; WindowDecoration *wd; DecorationList decor; CompRegion frameRegion; CompRegion shadowRegion; CompRegion tmpRegion; Window inputFrame; Window outputFrame; Damage frameDamage; int oldX; int oldY; int oldWidth; int oldHeight; bool pixmapFailed; CompRegion::Vector regions; bool updateReg; bool updateMatrix; CompTimer resizeUpdate; CompTimer moveUpdate; bool unshading; bool shading; bool isSwitcher; bool frameExtentsRequested; DecorClipGroupInterface *mClipGroup; CompRegion mOutputRegion; CompRegion mInputRegion; X11DecorPixmapRequestor mRequestor; unsigned int lastMaximizedStateDecorated; private: bool bareDecorationOnly (); Decoration::Ptr findRealDecoration (); Decoration::Ptr findBareDecoration (); void moveDecoratedWindowBy (const CompPoint &movement, const CompSize &sizeDelta); }; class DecorPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/decor/tests/0000755000004100000410000000000013246301623015162 5ustar www-datawww-data./plugins/decor/tests/CMakeLists.txt0000644000004100000410000000003613246301623017721 0ustar www-datawww-dataadd_subdirectory (acceptance) ./plugins/decor/tests/acceptance/0000755000004100000410000000000013246301623017250 5ustar www-datawww-data./plugins/decor/tests/acceptance/CMakeLists.txt0000644000004100000410000000003613246301623022007 0ustar www-datawww-dataadd_subdirectory (xorg-gtest) ./plugins/decor/tests/acceptance/xorg-gtest/0000755000004100000410000000000013246301623021353 5ustar www-datawww-data./plugins/decor/tests/acceptance/xorg-gtest/CMakeLists.txt0000644000004100000410000000254113246301623024115 0ustar www-datawww-datainclude (FindPkgConfig) pkg_check_modules (X11_XI x11 xi xext) if (BUILD_XORG_GTEST AND X11_XI_FOUND) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS}) link_directories (${X11_XI_LIBRARY_DIRS} ${COMPIZ_COMPOSITE_DAMAGETRACKING_INTEGRATION_LIBRARY_DIRS}) add_executable (compiz_test_decor_acceptance ${CMAKE_CURRENT_SOURCE_DIR}/compiz_decor_acceptance_tests.cpp) set (COMPIZ_DECOR_ACCEPTANCE_TEST_LIBRARIES xorg_gtest_all compiz_xorg_gtest_main compiz_xorg_gtest_system_test decoration compiz_point compiz_size compiz_rect ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES}) target_link_libraries (compiz_test_decor_acceptance ${COMPIZ_DECOR_ACCEPTANCE_TEST_LIBRARIES}) # Disabled until the tests can be run without opengl #compiz_discover_tests (compiz_test_decor_acceptance WITH_XORG_GTEST) endif (BUILD_XORG_GTEST AND X11_XI_FOUND) ./plugins/decor/tests/acceptance/xorg-gtest/compiz_decor_acceptance_tests.cpp0000644000004100000410000022166113246301623030134 0ustar www-datawww-data/* * Compiz XOrg GTest Decoration Acceptance Tests * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include "decoration.h" #include #include #include #include #include #include namespace xt = xorg::testing; namespace ct = compiz::testing; using ::testing::AllOf; using ::testing::AtLeast; using ::testing::Eq; using ::testing::Field; using ::testing::ReturnNull; using ::testing::Return; using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Matcher; using ::testing::MakeMatcher; using ::testing::StrEq; using ::testing::ValuesIn; using ::testing::WithParamInterface; using ::testing::_; using ::compiz::testing::HasGeometry; using ::compiz::testing::RelativeWindowGeometry; using ::compiz::testing::AbsoluteWindowGeometry; class BaseDecorAcceptance : public ct::AutostartCompizXorgSystemTestWithTestHelper { public: BaseDecorAcceptance (); virtual void SetUp (); virtual ct::CompizProcess::PluginList GetPluginList (); protected: Window mRootWindow; Atom mUtf8StringAtom; Atom mDecorationManagerNameAtom; Atom mDecorationTypeAtom; Atom mDecorationTypePixmap; Atom mDecorationTypeWindow; Atom mDecorationInputFrameAtom; Atom mDecorationOutputFrameAtom; TmpEnv mDisableConfigureBufferLocksEnv; private: int GetEventMask () const; }; BaseDecorAcceptance::BaseDecorAcceptance () : mRootWindow (0), mUtf8StringAtom (0), mDecorationManagerNameAtom (0), mDecorationTypeAtom (0), mDecorationTypePixmap (0), mDecorationTypeWindow (0), mDecorationInputFrameAtom (0), mDecorationOutputFrameAtom (0), /* Disable configure buffer locks as they cause event delivery indeterminacy * that isn't useful for a testing environment */ mDisableConfigureBufferLocksEnv ("COMPIZ_NO_CONFIGURE_BUFFER_LOCKS", "1") { } int BaseDecorAcceptance::GetEventMask () const { return ct::AutostartCompizXorgSystemTestWithTestHelper::GetEventMask () | SubstructureNotifyMask; } void BaseDecorAcceptance::SetUp () { ct::AutostartCompizXorgSystemTestWithTestHelper::SetUp (); mUtf8StringAtom = XInternAtom (Display (), "UTF8_STRING", 1); ASSERT_NE (0, mUtf8StringAtom); mDecorationManagerNameAtom = XInternAtom (Display (), "_COMPIZ_DM_NAME", 0); ASSERT_NE (0, mDecorationManagerNameAtom); mDecorationTypePixmap = XInternAtom (Display (), DECOR_TYPE_PIXMAP_ATOM_NAME, 0); ASSERT_NE (0, mDecorationTypePixmap); mDecorationTypeWindow = XInternAtom (Display (), DECOR_TYPE_WINDOW_ATOM_NAME, 0); ASSERT_NE (0, mDecorationTypeWindow); mDecorationTypeAtom = XInternAtom (Display (), DECOR_TYPE_ATOM_NAME, 0); ASSERT_NE (0, mDecorationTypeAtom); mDecorationInputFrameAtom = XInternAtom (Display (), DECOR_INPUT_FRAME_ATOM_NAME, 0); ASSERT_NE (0, mDecorationInputFrameAtom); mDecorationOutputFrameAtom = XInternAtom (Display (), DECOR_OUTPUT_FRAME_ATOM_NAME, 0); ASSERT_NE (0, mDecorationOutputFrameAtom); mRootWindow = DefaultRootWindow (Display ()); ASSERT_NE (0, mRootWindow); } ct::CompizProcess::PluginList BaseDecorAcceptance::GetPluginList () { typedef ct::AutostartCompizXorgSystemTestWithTestHelper Base; ct::CompizProcess::PluginList baseList (Base::GetPluginList ()); ct::CompizProcess::PluginList list; list.push_back (ct::CompizProcess::Plugin ("composite", ct::CompizProcess::Real)); list.push_back (ct::CompizProcess::Plugin ("opengl", ct::CompizProcess::Real)); list.push_back (ct::CompizProcess::Plugin ("decor", ct::CompizProcess::Real)); for (ct::CompizProcess::PluginList::iterator it = baseList.begin (); it != baseList.end (); ++it) list.push_back (*it); return list; } namespace compiz { namespace decor { namespace testing { const char *DecorationClientName = "fake"; const char *FailedToAcquireMessage = "Could not acquire selection for an unknown reason"; const char *OtherDecorationManagerRunningMessage = "Another decoration manager is already running"; struct MWMHints { unsigned long flags; unsigned long functions; unsigned long decorations; }; static const unsigned int MwmDecor = 1L << 0; class FakeDecorator { public: FakeDecorator (Display *d, int supporting = WINDOW_DECORATION_TYPE_WINDOW); ~FakeDecorator (); Window currentSelectionOwner (); Atom sessionOwnerAtom (); Window supportingCheckWindow (); private: Display *mDpy; int mScreenNumber; Window mRootWindow; int mSessionStatus; Time mDecorationManagerTimestamp; Atom mSessionOwnerAtom; Window mSessionOwner; Atom mSupportingHintAtom; Atom mSupportingHintWindowAtom; Window mSupportingHintWindow; }; class FakeDecoration { public: typedef boost::shared_ptr Ptr; FakeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight); virtual ~FakeDecoration (); virtual size_t propertyDataSize () const = 0; virtual void addPropertyData (std::vector &) const = 0; bool match (unsigned int type, unsigned int state, unsigned int actions) const; virtual CompPoint restoredFrameWindowOffset () const = 0; virtual CompSize restoredDecorationBorderSize () const = 0; virtual CompSize restoredDecorationInputSize () const = 0; protected: void insertBaseData (std::vector &) const; static const size_t BaseDataSize = 5; unsigned int mType; unsigned int mState; unsigned int mActions; unsigned int mMinWidth; unsigned int mMinHeight; }; class FakeWindowTypeDecoration : public FakeDecoration { public: FakeWindowTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restored, const decor_extents_t &maximized); protected: size_t propertyDataSize () const; void addPropertyData (std::vector &) const; CompPoint restoredFrameWindowOffset () const; CompSize restoredDecorationBorderSize () const; CompSize restoredDecorationInputSize () const; static const unsigned int WindowDecorationSize = 8; private: decor_extents_t mRestored; decor_extents_t mMaximized; }; class FakePixmapTypeDecoration : public FakeDecoration { public: typedef boost::shared_ptr Ptr; FakePixmapTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restoredBorder, const decor_extents_t &restoredInput, const decor_extents_t &maximizedBorder, const decor_extents_t &maximizedInput, Display *dpy); ~FakePixmapTypeDecoration (); void changeRestoredBorder (const decor_extents_t &border); void changeRestoredInput (const decor_extents_t &input); CompPoint restoredFrameWindowOffset () const; CompSize restoredDecorationBorderSize () const; CompSize restoredDecorationInputSize () const; protected: size_t propertyDataSize () const; void addPropertyData (std::vector &) const; private: decor_extents_t mRestoredBorder; decor_extents_t mRestoredInput; decor_extents_t mMaximizedBorder; decor_extents_t mMaximizedInput; decor_context_t mContext; decor_quad_t mQuads[N_QUADS_MAX]; decor_layout_t mLayout; unsigned int mNQuads; Display *mDpy; Pixmap mPixmap; }; class FakeDecorationList { public: FakeDecorationList () : mDecorationType (WINDOW_DECORATION_TYPE_PIXMAP) { } FakeDecorationList (unsigned int type) : mDecorationType (type) { } void AddDecoration (const FakeDecoration::Ptr &); void RemoveDecoration (unsigned int type, unsigned int state, unsigned int actions); void RemoveAllDecorations (); void SetPropertyOnWindow (Display *dpy, Window w, Atom property); private: unsigned int mDecorationType; std::vector decorations; }; class AcquisitionFailed : public std::exception { public: AcquisitionFailed (int status); const char * what () const throw (); private: int mStatus; }; } } } namespace { bool Advance (Display *d, bool result) { return ct::AdvanceToNextEventOnSuccess (d, result); } class ManagerMessageMatcher : public ct::ClientMessageXEventMatcher { public: ManagerMessageMatcher (Display *dpy, Atom managed); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: Display *mDpy; Atom mManager; Atom mManaged; }; void FreePropertyData (unsigned char *array) { if (array) XFree (array); } int SafeFetchProperty (Display *dpy, Window w, Atom property, long offset, long length, Atom requestedType, Atom &returnType, int &returnFormat, unsigned long &returnNItems, unsigned long &returnBytesRemaining, boost::shared_ptr &data) { unsigned char *dataLocation; int status = XGetWindowProperty (dpy, w, property, offset, length, 0, requestedType, &returnType, &returnFormat, &returnNItems, &returnBytesRemaining, &dataLocation); data.reset (dataLocation, boost::bind (FreePropertyData, _1)); return status; } void FetchAndVerifyProperty (Display *dpy, Window w, Atom property, Atom expectedType, int expectedFormat, unsigned long expectedItems, unsigned long expectedBytesAfter, boost::shared_ptr &data) { Atom returnedType = 0; int returnedFormat = 0; unsigned long returnedNItems = 0; unsigned long returnedBytesRemaining = 0; std::stringstream ss; int status = SafeFetchProperty (dpy, w, property, 0L, 1024L, expectedType, returnedType, returnedFormat, returnedNItems, returnedBytesRemaining, data); if (status != Success) ss << "XGetWindowProperty failed:" << std::endl; if (returnedType != expectedType) ss << "Expected type of " << XGetAtomName (dpy, expectedType) << std::endl; if (returnedFormat != expectedFormat) ss << "Expected format of " << expectedFormat << " but got " << returnedFormat << std::endl; if (returnedNItems != expectedItems) ss << "Expected " << expectedItems << " items" << " but got " << returnedNItems << " items" << std::endl; if (returnedBytesRemaining != expectedBytesAfter) ss << "Expected " << expectedBytesAfter << " bytes remaining" << " but got " << returnedBytesRemaining << " bytes remaining" << std::endl; if (!ss.str ().empty ()) throw std::logic_error (ss.str ()); } } ManagerMessageMatcher::ManagerMessageMatcher (Display *dpy, Atom managed) : ct::ClientMessageXEventMatcher (dpy, XInternAtom (dpy, "MANAGER", 1), DefaultRootWindow (dpy)), mDpy (dpy), mManaged (managed) { } bool ManagerMessageMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { if (ct::ClientMessageXEventMatcher::MatchAndExplain (event, listener)) { /* Evaluate the second field for the atom */ return event.xclient.data.l[1] == static_cast (mManaged); } return false; } void ManagerMessageMatcher::DescribeTo (std::ostream *os) const { *os << "manager of selection atom " << XGetAtomName (mDpy, mManaged); } namespace cdt = compiz::decor::testing; cdt::FakeDecoration::FakeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight) : mType (type), mState (state), mActions (actions), mMinWidth (minWidth), mMinHeight (minHeight) { } cdt::FakeDecoration::~FakeDecoration () { } bool cdt::FakeDecoration::match (unsigned int type, unsigned int state, unsigned int actions) const { return type == mType && state == mState && actions == mActions; } cdt::FakeWindowTypeDecoration::FakeWindowTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restored, const decor_extents_t &maximized) : FakeDecoration (type, state, actions, minWidth, minHeight), mRestored (restored), mMaximized (maximized) { } void cdt::FakeWindowTypeDecoration::addPropertyData (std::vector &vec) const { long propData[PROP_HEADER_SIZE + propertyDataSize ()]; decor_gen_window_property (propData, 0, const_cast (&mRestored), const_cast (&mMaximized), mMinWidth, mMinHeight, mState, mType, mActions); for (size_t i = PROP_HEADER_SIZE; i < (PROP_HEADER_SIZE + propertyDataSize ()); ++i) vec.push_back (propData[i]); } size_t cdt::FakeWindowTypeDecoration::propertyDataSize () const { return WINDOW_PROP_SIZE; } CompPoint cdt::FakeWindowTypeDecoration::restoredFrameWindowOffset () const { int xOffset = -mRestored.left; int yOffset = -mRestored.top; return CompPoint (xOffset, yOffset); } CompSize cdt::FakeWindowTypeDecoration::restoredDecorationBorderSize () const { return CompSize (mRestored.left + mRestored.right, mRestored.top + mRestored.bottom); } CompSize cdt::FakeWindowTypeDecoration::restoredDecorationInputSize () const { return restoredDecorationBorderSize (); } cdt::FakePixmapTypeDecoration::FakePixmapTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restoredBorder, const decor_extents_t &restoredInput, const decor_extents_t &maximizedBorder, const decor_extents_t &maximizedInput, Display *dpy) : FakeDecoration (type, state, actions, minWidth, minHeight), mRestoredBorder (restoredBorder), mRestoredInput (restoredInput), mMaximizedBorder (maximizedBorder), mMaximizedInput (maximizedInput), mDpy (dpy), mPixmap (XCreatePixmap (mDpy, DefaultRootWindow (mDpy), 10, 10, DefaultDepth (mDpy, (DefaultScreen (mDpy))))) { /* 10x10 decoration, 0 corner space, 0 spacing, 2px each side */ mContext.extents.left = 2; mContext.extents.right = 2; mContext.extents.top = 2; mContext.extents.bottom = 2; mContext.left_space = 0; mContext.right_space = 0; mContext.top_space = 0; mContext.bottom_space = 0; mContext.left_corner_space = 0; mContext.right_corner_space = 0; mContext.top_corner_space = 0; mContext.bottom_corner_space = 0; decor_get_default_layout (&mContext, minWidth, minHeight, &mLayout); mNQuads = decor_set_lSrStSbS_window_quads (mQuads, &mContext, &mLayout); } cdt::FakePixmapTypeDecoration::~FakePixmapTypeDecoration () { XFreePixmap (mDpy, mPixmap); } size_t cdt::FakePixmapTypeDecoration::propertyDataSize () const { return BASE_PROP_SIZE + (QUAD_PROP_SIZE * mNQuads); } void cdt::FakePixmapTypeDecoration::addPropertyData (std::vector &vec) const { long propData[PROP_HEADER_SIZE + propertyDataSize ()]; decor_quads_to_property (propData, 0, mPixmap, const_cast (&mRestoredInput), const_cast (&mRestoredBorder), const_cast (&mMaximizedInput), const_cast (&mMaximizedBorder), mMinWidth, mMinHeight, const_cast (mQuads), mNQuads, mType, mState, mActions); for (size_t i = PROP_HEADER_SIZE; i < (PROP_HEADER_SIZE + propertyDataSize ()); ++i) vec.push_back (propData[i]); } CompPoint cdt::FakePixmapTypeDecoration::restoredFrameWindowOffset () const { int xOffset = mRestoredBorder.left - mRestoredInput.left; int yOffset = mRestoredBorder.top - mRestoredInput.top; return CompPoint (xOffset, yOffset); } CompSize cdt::FakePixmapTypeDecoration::restoredDecorationBorderSize () const { return CompSize (mRestoredBorder.left + mRestoredBorder.right, mRestoredBorder.top + mRestoredBorder.bottom); } CompSize cdt::FakePixmapTypeDecoration::restoredDecorationInputSize () const { return CompSize (mRestoredInput.left + mRestoredInput.right, mRestoredInput.top + mRestoredInput.bottom); } void cdt::FakePixmapTypeDecoration::changeRestoredBorder (const decor_extents_t &b) { mRestoredBorder = b; } void cdt::FakePixmapTypeDecoration::changeRestoredInput (const decor_extents_t &i) { mRestoredInput = i; } void cdt::FakeDecorationList::AddDecoration (const cdt::FakeDecoration::Ptr &decoration) { decorations.push_back (decoration); } namespace { bool MatchesTypeStateAndActions (const cdt::FakeDecoration::Ptr &decoration, unsigned int type, unsigned int state, unsigned int actions) { return decoration->match (type, state, actions); } } void cdt::FakeDecorationList::RemoveDecoration (unsigned int type, unsigned int state, unsigned int actions) { decorations.erase ( std::remove_if (decorations.begin (), decorations.end (), boost::bind (MatchesTypeStateAndActions, _1, type, state, actions)), decorations.end ()); } void cdt::FakeDecorationList::RemoveAllDecorations () { decorations.clear (); } void cdt::FakeDecorationList::SetPropertyOnWindow (Display *dpy, Window w, Atom property) { size_t size = PROP_HEADER_SIZE; for (std::vector ::iterator it = decorations.begin (); it != decorations.end (); ++it) size += (*it)->propertyDataSize (); std::vector data; data.reserve (size); data.push_back (decor_version ()); data.push_back (mDecorationType); data.push_back (decorations.size ()); for (std::vector ::iterator it = decorations.begin (); it != decorations.end (); ++it) (*it)->addPropertyData (data); XChangeProperty (dpy, w, property, XA_INTEGER, 32, PropModeReplace, reinterpret_cast (&data[0]), size); } cdt::AcquisitionFailed::AcquisitionFailed (int status) : mStatus (status) { } const char * cdt::AcquisitionFailed::what () const throw () { switch (mStatus) { case DECOR_ACQUIRE_STATUS_FAILED: return FailedToAcquireMessage; case DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING: return OtherDecorationManagerRunningMessage; default: return "Unknown status"; } return "Unknown status"; } cdt::FakeDecorator::FakeDecorator (Display *d, int supports) : mDpy (d), mScreenNumber (DefaultScreen (d)), mRootWindow (DefaultRootWindow (d)), mSessionStatus (decor_acquire_dm_session (d, mScreenNumber, "fake", 1, &mDecorationManagerTimestamp)), mSessionOwnerAtom (0), mSessionOwner (0), mSupportingHintAtom (XInternAtom (d, DECOR_TYPE_ATOM_NAME, 0)), mSupportingHintWindowAtom (XInternAtom (d, DECOR_SUPPORTING_DM_CHECK_ATOM_NAME, 0)) { if (mSessionStatus != DECOR_ACQUIRE_STATUS_SUCCESS) throw AcquisitionFailed (mSessionStatus); std::stringstream sessionOwnerStream; sessionOwnerStream << "_COMPIZ_DM_S" << mScreenNumber; mSessionOwnerAtom = XInternAtom (d, sessionOwnerStream.str ().c_str (), 1); mSessionOwner = XGetSelectionOwner (d, mSessionOwnerAtom); if (!mSessionOwner) throw std::runtime_error ("Expected a selection owner"); decor_set_dm_check_hint (d, mScreenNumber, supports); boost::shared_ptr data; FetchAndVerifyProperty (mDpy, mRootWindow, mSupportingHintWindowAtom, XA_WINDOW, 32, 1, 0, data); mSupportingHintWindow = *(reinterpret_cast (data.get ())); if (!mSupportingHintWindow) throw std::runtime_error ("Failed to find supporting hint window"); } cdt::FakeDecorator::~FakeDecorator () { /* Destroy the session owner, taking the selection with it */ XDestroyWindow (mDpy, mSessionOwner); XDestroyWindow (mDpy, mSupportingHintWindow); } Window cdt::FakeDecorator::currentSelectionOwner () { return mSessionOwner; } Atom cdt::FakeDecorator::sessionOwnerAtom () { return mSessionOwnerAtom; } Atom cdt::FakeDecorator::supportingCheckWindow () { return mSupportingHintWindow; } TEST_F (BaseDecorAcceptance, Startup) { } TEST_F (BaseDecorAcceptance, FakeDecoratorSessionOwnerNameSetOnSelectionOwner) { cdt::FakeDecorator decorator (Display ()); boost::shared_ptr data; FetchAndVerifyProperty (Display (), decorator.currentSelectionOwner (), mDecorationManagerNameAtom, mUtf8StringAtom, 8, 4, 0, data); std::string name (reinterpret_cast (data.get ())); EXPECT_THAT (name, StrEq (cdt::DecorationClientName)); } TEST_F (BaseDecorAcceptance, FakeDecoratorReceiveClientMessage) { cdt::FakeDecorator decorator (Display ()); ManagerMessageMatcher matcher (Display (), decorator.sessionOwnerAtom ()); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mRootWindow, ClientMessage, -1, -1, matcher))); } TEST_F (BaseDecorAcceptance, DecorationSupportsWindowType) { cdt::FakeDecorator decorator (Display (), WINDOW_DECORATION_TYPE_WINDOW); boost::shared_ptr data; FetchAndVerifyProperty (Display (), decorator.supportingCheckWindow (), mDecorationTypeAtom, XA_ATOM, 32, 1, 0, data); Atom *atoms = reinterpret_cast (data.get ()); EXPECT_EQ (atoms[0], mDecorationTypeWindow); } TEST_F (BaseDecorAcceptance, DecorationSupportsPixmapType) { cdt::FakeDecorator decorator (Display (), WINDOW_DECORATION_TYPE_PIXMAP); boost::shared_ptr data; FetchAndVerifyProperty (Display (), decorator.supportingCheckWindow (), mDecorationTypeAtom, XA_ATOM, 32, 1, 0, data); Atom *atoms = reinterpret_cast (data.get ()); EXPECT_EQ (atoms[0], mDecorationTypePixmap); } class DecorFakeDecoratorAcceptance : public BaseDecorAcceptance { protected: virtual void SetUp (); virtual void TearDown (); virtual unsigned int SupportedDecorations () const; virtual bool StartDecoratorOnSetUp () const; void SetUpDecorator (); void DisallowDecorationsOnWindow (Window window); void AllowDecorationsOnWindow (Window window); std::auto_ptr decorator; Atom NETWMFrameExtentsAtom; Atom WindowDecorationAtom; Atom DefaultActiveDecorationAtom; Atom DefaultBareDecorationAtom; Atom MWMHintsAtom; }; void DecorFakeDecoratorAcceptance::SetUp () { BaseDecorAcceptance::SetUp (); NETWMFrameExtentsAtom = XInternAtom (Display (), "_NET_FRAME_EXTENTS", 0); WindowDecorationAtom = XInternAtom (Display (), DECOR_WINDOW_ATOM_NAME, 0); DefaultActiveDecorationAtom = XInternAtom (Display (), DECOR_ACTIVE_ATOM_NAME, 0); DefaultBareDecorationAtom = XInternAtom (Display (), DECOR_BARE_ATOM_NAME, 0); if (StartDecoratorOnSetUp ()) SetUpDecorator (); } void DecorFakeDecoratorAcceptance::SetUpDecorator () { decorator.reset (new cdt::FakeDecorator (Display (), SupportedDecorations ())); } namespace { void ChangeDecorationState (Display *display, Window window, unsigned int decorationFlags) { Atom mwmHintsAtom = XInternAtom (display, "_MOTIF_WM_HINTS", 0); cdt::MWMHints hints; hints.flags = 1L << 1; hints.decorations = decorationFlags; XChangeProperty (display, window, mwmHintsAtom, mwmHintsAtom, 32, PropModeReplace, reinterpret_cast (&hints), 3); } } void DecorFakeDecoratorAcceptance::DisallowDecorationsOnWindow (Window window) { ChangeDecorationState (Display (), window, 0); } void DecorFakeDecoratorAcceptance::AllowDecorationsOnWindow (Window window) { ChangeDecorationState (Display (), window, cdt::MwmDecor); } void DecorFakeDecoratorAcceptance::TearDown () { decorator.reset (); BaseDecorAcceptance::TearDown (); } unsigned int DecorFakeDecoratorAcceptance::SupportedDecorations () const { return WINDOW_DECORATION_TYPE_WINDOW; } bool DecorFakeDecoratorAcceptance::StartDecoratorOnSetUp () const { return true; } namespace { void RecievePropertyNotifyEvents (Display *dpy, Window w) { XWindowAttributes attrib; XGetWindowAttributes (dpy, w, &attrib); XSelectInput (dpy, w, attrib.your_event_mask | PropertyChangeMask); } void WaitForPropertyNotify (Display *dpy, Window w, std::string const &prop) { RecievePropertyNotifyEvents (dpy, w); ct::PropertyNotifyXEventMatcher matcher (dpy, prop); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, w, PropertyNotify, -1, -1, matcher))); } void WaitForConfigureOn (Display *display, Window window, int x, int y, unsigned int width, unsigned int height, unsigned int mask) { /* Wait for the ConfigureNotify on the frame window * after an offset move */ ct::ConfigureNotifyXEventMatcher matcher (None, 0, x, y, width, height, mask); Advance (display, ct::WaitForEventOfTypeOnWindowMatching (display, window, ConfigureNotify, -1, -1, matcher)); } void WaitForFrameExtents (Display *dpy, Window w) { RecievePropertyNotifyEvents (dpy, w); XMapRaised (dpy, w); WaitForPropertyNotify (dpy, w, "_NET_FRAME_EXTENTS"); } Window FindParent (Display *dpy, Window w) { Window parent = 0; Window next = w; Window root = DefaultRootWindow (dpy); while (next != root) { parent = next; Window dummy; Window *children; unsigned int nchildren; int status = XQueryTree (dpy, parent, &dummy, &next, &children, &nchildren); XFree (children); if (!status) throw std::logic_error ("XQueryTree failed"); } return parent; } bool WaitForReparent (::Display *dpy, Window w) { return Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1)); } void FreeWindowArray (Window *array) { if (array) XFree (array); } boost::shared_array FetchChildren (Display *dpy, Window w, unsigned int &n) { Window *children; Window dummy; int status = XQueryTree (dpy, w, &dummy, &dummy, &children, &n); if (!status) throw std::logic_error ("XQueryTree failed"); return boost::shared_array (children, boost::bind (FreeWindowArray, _1)); } class FrameExtentsMatcher : public MatcherInterface { public: FrameExtentsMatcher (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom); bool MatchAndExplain (unsigned long *extents, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: unsigned int mLeft; unsigned int mRight; unsigned int mTop; unsigned int mBottom; }; Matcher IsExtents (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) { return MakeMatcher (new FrameExtentsMatcher (left, right, top, bottom)); } } FrameExtentsMatcher::FrameExtentsMatcher (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) : mLeft (left), mRight (right), mTop (top), mBottom (bottom) { } bool FrameExtentsMatcher::MatchAndExplain (unsigned long *extents, MatchResultListener *listener) const { return mLeft == extents[0] && mRight == extents[1] && mTop == extents[2] && mBottom == extents[3]; } void FrameExtentsMatcher::DescribeTo (std::ostream *os) const { *os << "Expected frame extents of :" << std::endl << " left: " << mLeft << std::endl << " right: " << mRight << std::endl << " top: " << mTop << std::endl << " bottom: " << mBottom << std::endl; } TEST_F (DecorFakeDecoratorAcceptance, WindowDefaultFallbackNoExtents) { Window w = ct::CreateNormalWindow (Display ()); WaitForFrameExtents (Display (), w); boost::shared_ptr data; FetchAndVerifyProperty (Display (), w, NETWMFrameExtentsAtom, XA_CARDINAL, 32, 4, 0, data); unsigned long *frameExtents = reinterpret_cast (data.get ()); EXPECT_THAT (frameExtents, IsExtents (0, 0, 0, 0)); } class DecorWithPixmapDefaultsAcceptance : public DecorFakeDecoratorAcceptance { protected: DecorWithPixmapDefaultsAcceptance (); virtual void SetUp (); virtual void TearDown (); virtual unsigned int SupportedDecorations () const; private: Window mRoot; protected: cdt::FakeDecoration::Ptr defaultActiveDecoration (); cdt::FakeDecoration::Ptr rootActiveDecoration; cdt::FakeDecoration::Ptr rootBareDecoration; cdt::FakeDecorationList rootActiveDecorationList; cdt::FakeDecorationList rootBareDecorationList; static const unsigned int MaximizedBorderExtent = 1; static const unsigned int ActiveBorderExtent = 2; static const unsigned int ActiveInputExtent = 4; }; namespace { cdt::FakePixmapTypeDecoration::Ptr MakeFakePixmapTypeDecoration (unsigned int type, unsigned int state, unsigned int actions, unsigned int minWidth, unsigned int minHeight, const decor_extents_t &restoredBorder, const decor_extents_t &restoredInput, const decor_extents_t &maximizedBorder, const decor_extents_t &maximizedInput, Display *dpy) { cdt::FakePixmapTypeDecoration *decoration = new cdt::FakePixmapTypeDecoration (type, state, actions, minWidth, minHeight, restoredBorder, restoredInput, maximizedBorder, maximizedInput, dpy); return boost::shared_ptr (decoration); } decor_extents_t DecorationExtents (unsigned int left, unsigned int right, unsigned int top, unsigned int bottom) { decor_extents_t extents; extents.left = left; extents.right = right; extents.top = top; extents.bottom = bottom; return extents; } class ExtentsFromMatcher : public MatcherInterface { public: ExtentsFromMatcher (Display *dpy, Window w, const decor_extents_t &extents); bool MatchAndExplain (Window window, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: Display *mDpy; Window mWindow; decor_extents_t mExpectedExtents; }; Matcher ExtendsFromWindowBy (Display *dpy, Window w, const decor_extents_t &extents) { return MakeMatcher (new ExtentsFromMatcher (dpy, w, extents)); } } std::ostream & operator<< (std::ostream &lhs, const decor_extents_t &extents) { return lhs << "Extents: " << std::endl << " left: " << extents.left << std::endl << " right: " << extents.right << std::endl << " top: " << extents.top << std::endl << " bottom: " << extents.bottom << std::endl; } ExtentsFromMatcher::ExtentsFromMatcher (Display *dpy, Window w, const decor_extents_t &extents) : mDpy (dpy), mWindow (w), mExpectedExtents (extents) { } bool ExtentsFromMatcher::MatchAndExplain (Window window, MatchResultListener *listener) const { unsigned int border, depth; Window root; int compareX, compareY, matchX, matchY; unsigned int compareWidth, compareHeight, matchWidth, matchHeight; if (!XGetGeometry (mDpy, window, &root, &matchX, &matchY, &matchWidth, &matchHeight, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); if (!XGetGeometry (mDpy, mWindow, &root, &compareX, &compareY, &compareWidth, &compareHeight, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); unsigned int left = matchX - compareX; unsigned int top = matchY - compareY; unsigned int right = (matchX + matchWidth) - (compareX + compareWidth); unsigned int bottom = (matchY + matchHeight) - (compareY + compareHeight); decor_extents_t determinedExtents = DecorationExtents (left, right, top, bottom); return decor_extents_cmp (&determinedExtents, &mExpectedExtents); } void ExtentsFromMatcher::DescribeTo (std::ostream *os) const { *os << "Extends outwards from " << std::hex << mWindow << std::dec << " by: " << mExpectedExtents; } DecorWithPixmapDefaultsAcceptance::DecorWithPixmapDefaultsAcceptance () : mRoot (0), rootActiveDecorationList (WINDOW_DECORATION_TYPE_PIXMAP), rootBareDecorationList (WINDOW_DECORATION_TYPE_PIXMAP) { } unsigned int DecorWithPixmapDefaultsAcceptance::SupportedDecorations () const { return WINDOW_DECORATION_TYPE_PIXMAP; } void DecorWithPixmapDefaultsAcceptance::SetUp () { DecorFakeDecoratorAcceptance::SetUp (); mRoot = DefaultRootWindow (Display ()); unsigned int ResBo = ActiveBorderExtent; unsigned int ResIn = ActiveInputExtent; unsigned int MaxEx = MaximizedBorderExtent; decor_extents_t activeBorderRestored (DecorationExtents (ResBo, ResBo, ResBo, ResBo)); decor_extents_t activeBorderMaximized (DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx)); decor_extents_t activeInputRestored (DecorationExtents (ResIn, ResIn, ResIn, ResIn)); decor_extents_t activeInputMaximized (DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx)); decor_extents_t emptyExtents (DecorationExtents (0, 0, 0, 0)); rootActiveDecoration = MakeFakePixmapTypeDecoration (DECOR_WINDOW_TYPE_NORMAL, 0, 0, 10, 10, activeBorderRestored, activeInputRestored, activeBorderMaximized, activeInputMaximized, Display ()); rootBareDecoration = MakeFakePixmapTypeDecoration (0, 0, 0, 1, 1, emptyExtents, emptyExtents, emptyExtents, emptyExtents, Display ()); rootActiveDecorationList.AddDecoration (rootActiveDecoration); rootBareDecorationList.AddDecoration (rootBareDecoration); rootActiveDecorationList.SetPropertyOnWindow (Display (), mRoot, DefaultActiveDecorationAtom); rootBareDecorationList.SetPropertyOnWindow (Display (), mRoot, DefaultBareDecorationAtom); } void DecorWithPixmapDefaultsAcceptance::TearDown () { /* Remove inserted decorations */ rootActiveDecorationList.RemoveAllDecorations (); rootBareDecorationList.RemoveAllDecorations (); /* This is a bit of a kludge, but we also need to reset * the two decorations manually before TearDown. We can * probably fix this later by encapsulating it all in one * class, but that's a bit of an effort */ rootActiveDecoration.reset (); rootBareDecoration.reset (); DecorFakeDecoratorAcceptance::TearDown (); } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackRecieveInputFrameNotify) { Window w = ct::CreateNormalWindow (Display ()); RecievePropertyNotifyEvents (Display (), w); XMapRaised (Display (), w); ct::PropertyNotifyXEventMatcher matcher (Display (), DECOR_INPUT_FRAME_ATOM_NAME); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), w, PropertyNotify, -1, -1, matcher))); } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackHasInputFrameInParent) { Window w = ct::CreateNormalWindow (Display ()); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); unsigned int nChildren; boost::shared_array children (FetchChildren (Display (), parent, nChildren)); EXPECT_EQ (2, nChildren); } namespace { Window FindDecorationWindowFromChildren (Display *dpy, const boost::shared_array &c, unsigned int nChildren) { for (unsigned int i = 0; i < nChildren; ++i) { /* The decoration window will have no children, but * the wrapper window will have one child */ unsigned int n; boost::shared_array childChildren (FetchChildren (dpy, c[i], n)); if (n == 0) return c[i]; } return None; } } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackNormalWindowExtentOnDecoration) { Window w = ct::CreateNormalWindow (Display ()); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); unsigned int nChildren; boost::shared_array children (FetchChildren (Display (), parent, nChildren)); ASSERT_EQ (2, nChildren); Window decorationWindow = FindDecorationWindowFromChildren (Display (), children, nChildren); ASSERT_NE (None, decorationWindow); decor_extents_t borderExtents (DecorationExtents (ActiveBorderExtent, ActiveBorderExtent, ActiveBorderExtent, ActiveBorderExtent)); EXPECT_THAT (decorationWindow, ExtendsFromWindowBy (Display (), w, borderExtents)); } TEST_F (DecorWithPixmapDefaultsAcceptance, FallbackNormalWindowInputOnFrame) { Window w = ct::CreateNormalWindow (Display ()); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); decor_extents_t inputExtents (DecorationExtents (ActiveInputExtent, ActiveInputExtent, ActiveInputExtent, ActiveInputExtent)); EXPECT_THAT (parent, ExtendsFromWindowBy (Display (), w, inputExtents)); } class DecorPixmapShapeSetAcceptance : public DecorWithPixmapDefaultsAcceptance { public: virtual void SetUp (); protected: int shapeEvent; int shapeError; int shapeMajor; int shapeMinor; }; void DecorPixmapShapeSetAcceptance::SetUp () { DecorWithPixmapDefaultsAcceptance::SetUp (); if (!XShapeQueryVersion (Display (), &shapeMajor, &shapeMinor)) throw std::runtime_error ("Unable to query shape extension version"); if (!XShapeQueryExtension (Display (), &shapeEvent, &shapeError)) throw std::runtime_error ("Unable to initialize shape extension"); } std::ostream & operator<< (std::ostream &os, const XRectangle &r) { os << "XRectangle: " << " x: " << r.x << " y: " << r.y << " width: " << r.width << " height: " << r.height; return os; } namespace { void FreeXRectangleArray (XRectangle *array) { XFree (array); } boost::shared_array ShapeRectangles (::Display *dpy, Window w, int &n, int &order) { XRectangle *rects = XShapeGetRectangles(dpy, w, ShapeInput, &n, &order); return boost::shared_array (rects, boost::bind (FreeXRectangleArray, _1)); } } TEST_F (DecorPixmapShapeSetAcceptance, FrameWindowHasInitialFullShape) { Window w = ct::CreateNormalWindow (Display ()); RecievePropertyNotifyEvents (Display (), w); XMapRaised (Display (), w); WaitForPropertyNotify (Display (), w, "_NET_FRAME_EXTENTS"); Window parent = FindParent (Display (), w); int x, y; unsigned int width, height, border; ct::AbsoluteWindowGeometry (Display (), parent, x, y, width, height, border); int n, order; boost::shared_array rects (ShapeRectangles (Display (), parent, n, order)); ASSERT_THAT (n, Eq (1)); EXPECT_THAT (rects[0], AllOf (Field (&XRectangle::x, Eq (0)), Field (&XRectangle::y, Eq (0)), Field (&XRectangle::width, Eq (width)), Field (&XRectangle::height, Eq (height)))); } TEST_F (DecorPixmapShapeSetAcceptance, FrameWindowShapeIsUpdated) { Window w = ct::CreateNormalWindow (Display ()); RecievePropertyNotifyEvents (Display (), w); XMapRaised (Display (), w); WaitForReparent (Display (), w); WaitForPropertyNotify (Display (), w, DECOR_INPUT_FRAME_ATOM_NAME); Window parent = FindParent (Display (), w); int clientX, clientY; unsigned int clientWidth, clientHeight, border; ct::AbsoluteWindowGeometry (Display (), w, clientX, clientY, clientWidth, clientHeight, border); /* Get the input frame remove its input shape completely */ boost::shared_ptr inputFramePropertyData; FetchAndVerifyProperty (Display (), w, mDecorationInputFrameAtom, XA_WINDOW, 32, 1, 0L, inputFramePropertyData); Window inputFrame = *(reinterpret_cast (inputFramePropertyData.get ())); /* Sync first, and then combine rectangles on the input frame */ XSync (Display (), false); XShapeSelectInput (Display (), parent, ShapeNotifyMask); XShapeCombineRectangles (Display (), inputFrame, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); clientX += ActiveBorderExtent; clientY += ActiveBorderExtent; /* Wait for a shape event on the frame window */ ct::ShapeNotifyXEventMatcher matcher (ShapeInput, clientX, clientY, clientWidth, clientHeight, 1); Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), parent, shapeEvent + ShapeNotify, -1, 0, matcher)); /* Grab the shape rectangles of the parent, they should * be equal to the client window size */ int n, order; boost::shared_array rects (ShapeRectangles (Display (), parent, n, order)); ASSERT_THAT (n, Eq (1)); EXPECT_THAT (rects[0], AllOf (Field (&XRectangle::x, Eq (clientX)), Field (&XRectangle::y, Eq (clientY)), Field (&XRectangle::width, Eq (clientWidth)), Field (&XRectangle::height, Eq (clientHeight)))); } /* TODO: Get bare decorations tests */ /* Helper class with some useful member functions */ class PixmapDecoratorAcceptance : public DecorWithPixmapDefaultsAcceptance { public: typedef cdt::FakeDecoration::Ptr FakeDecorPtr; typedef cdt::FakePixmapTypeDecoration::Ptr FakePixDecorPtr; virtual void TearDown (); Window CreateDecoratableWindow (::Display *display); Window MapAndReparent (::Display *display, Window window); void DecorateWindow (::Display *display, Window window, const FakePixDecorPtr &decoration); void WaitForDecoration (::Display *display, Window window, const FakeDecorPtr &decoration); void WaitForDefaultDecoration (::Display *display, Window window, CompRect &testFrameDecorationGeometry, CompRect &testWindowDecorationGeometry); void WaitForDecorationUpdate (::Display *display, Window window, const FakeDecorPtr &decor); cdt::FakeDecorationList GetDecorations (Window window); Window GetParent (Window window); void ReconfigureDecoration (::Display *display, Window window, const FakePixDecorPtr &decor, cdt::FakeDecorationList &list, const decor_extents_t &border, const decor_extents_t &input); bool DestroyWindow (::Display *display, Window window); protected: std::map windowDecorations; std::map windowParents; }; void PixmapDecoratorAcceptance::TearDown () { windowDecorations.clear (); DecorWithPixmapDefaultsAcceptance::TearDown (); } Window PixmapDecoratorAcceptance::CreateDecoratableWindow (::Display *display) { return ct::CreateNormalWindow (display); } Window PixmapDecoratorAcceptance::MapAndReparent (::Display *display, Window window) { if (windowParents.find (window) != windowParents.end ()) return windowParents[window]; XSelectInput (display, window, StructureNotifyMask | PropertyChangeMask); XMapRaised (display, window); /* Wait for the window to be reparented */ WaitForReparent (display, window); /* Select for StructureNotify on the parent and wrapper * windows */ windowParents[window] = FindParent (display, window); Window root = 0; Window wrapper = ct::GetImmediateParent (display, window, root); XSelectInput (display, windowParents[window], StructureNotifyMask); XSelectInput (display, wrapper, StructureNotifyMask); return windowParents[window]; } void PixmapDecoratorAcceptance::DecorateWindow (::Display *display, Window window, const FakePixDecorPtr &decoration) { windowDecorations[window] = cdt::FakeDecorationList (WINDOW_DECORATION_TYPE_PIXMAP); windowDecorations[window].AddDecoration (decoration); windowDecorations[window].SetPropertyOnWindow (display, window, WindowDecorationAtom); } void PixmapDecoratorAcceptance::WaitForDecoration (::Display *display, Window window, const FakeDecorPtr &decoration) { WaitForDecorationUpdate (display, window, decoration); WaitForPropertyNotify (display, window, DECOR_INPUT_FRAME_ATOM_NAME); } void PixmapDecoratorAcceptance::WaitForDefaultDecoration (::Display *display, Window window, CompRect &decoratedWindowGeometry, CompRect &decoratedFrameGeometry) { WaitForDecoration (display, window, rootActiveDecoration); /* Fetch the window's absolute geometry */ int x, y; unsigned int width, height, border; ct::AbsoluteWindowGeometry (display, window, x, y, width, height, border); /* Fetch frame extents */ boost::shared_ptr data; FetchAndVerifyProperty (Display (), window, NETWMFrameExtentsAtom, XA_CARDINAL, 32, 4, 0, data); unsigned long *frameExtents = reinterpret_cast (data.get ()); decoratedWindowGeometry.setGeometry (x, y, width, height); /* Adjust for decoration size. This is what future decorations * will add and subtract from */ decoratedFrameGeometry.setGeometry (x - frameExtents[0], y - frameExtents[2], width + (frameExtents[0] + frameExtents[1]), height + (frameExtents[2] + frameExtents[3])); } void PixmapDecoratorAcceptance::WaitForDecorationUpdate (::Display *display, Window window, const FakeDecorPtr &decor) { const CompPoint &framePos (decor->restoredFrameWindowOffset ()); /* Wait for the ConfigureNotify on the frame window * after an offset move */ WaitForConfigureOn (display, GetParent (window), framePos.x (), framePos.y (), 0, 0, CWX | CWY); /* Wait for the frame extents to change */ WaitForPropertyNotify (display, window, "_NET_FRAME_EXTENTS"); } void PixmapDecoratorAcceptance::ReconfigureDecoration (::Display *display, Window window, const FakePixDecorPtr &decor, cdt::FakeDecorationList &list, const decor_extents_t &border, const decor_extents_t &input) { decor->changeRestoredInput (input); decor->changeRestoredBorder (border); list.SetPropertyOnWindow (display, window, WindowDecorationAtom); WaitForDecorationUpdate (display, window, decor); } bool PixmapDecoratorAcceptance::DestroyWindow (::Display *display, Window window) { std::map ::iterator parentIterator = windowParents.find (window); std::map ::iterator decorIterator = windowDecorations.find (window); if (parentIterator != windowParents.end ()) windowParents.erase (parentIterator); if (decorIterator != windowDecorations.end ()) { windowDecorations[window].RemoveAllDecorations (); windowDecorations.erase (decorIterator); } XDestroyWindow (display, window); return parentIterator != windowParents.end () || decorIterator != windowDecorations.end (); } Window PixmapDecoratorAcceptance::GetParent (Window window) { return windowParents[window]; } cdt::FakeDecorationList PixmapDecoratorAcceptance::GetDecorations (Window window) { return windowDecorations[window]; } class PixmapInitialDecorationAcceptance : public PixmapDecoratorAcceptance { public: virtual void SetUp (); virtual void TearDown (); virtual bool StartDecoratorOnSetUp () const; Window CreateDecoratedWindow (); protected: cdt::FakePixmapTypeDecoration::Ptr mTestWindowDecoration; CompRect mClientGeometryOnInitialDecoration; CompRect mBorderGeometryOnInitialDecoration; }; void PixmapInitialDecorationAcceptance::SetUp () { PixmapDecoratorAcceptance::SetUp (); unsigned int ResBo = ActiveBorderExtent + 1; unsigned int ResIn = ActiveInputExtent; unsigned int MaxEx = MaximizedBorderExtent; mTestWindowDecoration = MakeFakePixmapTypeDecoration (DECOR_WINDOW_TYPE_NORMAL, 0, 0, 10, 10, DecorationExtents (ResBo, ResBo, ResBo, ResBo), DecorationExtents (ResIn, ResIn, ResIn, ResIn), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), Display ()); } bool PixmapInitialDecorationAcceptance::StartDecoratorOnSetUp () const { return false; } void PixmapInitialDecorationAcceptance::TearDown () { mTestWindowDecoration.reset (); PixmapDecoratorAcceptance::TearDown (); } Window PixmapInitialDecorationAcceptance::CreateDecoratedWindow () { Window testWindow = CreateDecoratableWindow (Display ()); /* We need to first explicitly recieve PropertyNotify events before * core starts sending them */ RecievePropertyNotifyEvents (Display (), testWindow); /* Map and reparent the window so that it gets a decoration */ MapAndReparent (Display (), testWindow); /* Start the decorator */ SetUpDecorator (); WaitForDefaultDecoration (Display (), testWindow, mClientGeometryOnInitialDecoration, mBorderGeometryOnInitialDecoration); DecorateWindow (Display (), testWindow, mTestWindowDecoration); WaitForDecorationUpdate (Display (), testWindow, mTestWindowDecoration); return testWindow; } std::ostream & operator<< (std::ostream &os, const CompSize &sz) { return os << "Size: (width: " << sz.width () << " height: " << sz.height () << ")"; } TEST_F (PixmapInitialDecorationAcceptance, NoSizeChangeInitially) { CreateDecoratedWindow (); EXPECT_EQ (CompSize (mClientGeometryOnInitialDecoration.width (), mClientGeometryOnInitialDecoration.height ()), CompSize (ct::WINDOW_WIDTH, ct::WINDOW_HEIGHT)); } TEST_F (PixmapInitialDecorationAcceptance, SizeChangesApplySubsequently) { Window testWindow = CreateDecoratedWindow (); /* Measuring size change from default decoration to real decoration */ const CompSize &size (mTestWindowDecoration->restoredDecorationBorderSize ()); EXPECT_THAT (testWindow, HasGeometry (Display (), RelativeWindowGeometry, _, _, mBorderGeometryOnInitialDecoration.width () - size.width (), mBorderGeometryOnInitialDecoration.height () - size.height (), _)); } class PixmapDecoratedWindowAcceptance : public PixmapDecoratorAcceptance { public: PixmapDecoratedWindowAcceptance (); virtual void SetUp (); virtual void TearDown (); virtual bool StartDecoratorOnSetUp () const; protected: unsigned int RealDecorationActiveBorderExtent; Window mTestWindow; Window mTestWindowParent; cdt::FakePixmapTypeDecoration::Ptr mTestWindowDecoration; CompRect mClientGeometryOnInitialDecoration; CompRect mBorderGeometryOnInitialDecoration; }; PixmapDecoratedWindowAcceptance::PixmapDecoratedWindowAcceptance () : RealDecorationActiveBorderExtent (ActiveBorderExtent + 1) { } void PixmapDecoratedWindowAcceptance::SetUp () { DecorWithPixmapDefaultsAcceptance::SetUp (); ::Display *display = Display (); mTestWindow = CreateDecoratableWindow (display); mTestWindowParent = MapAndReparent (display, mTestWindow); /* Start the decorator */ SetUpDecorator (); WaitForDefaultDecoration (display, mTestWindow, mClientGeometryOnInitialDecoration, mBorderGeometryOnInitialDecoration); /* We need to change the border extent so that the window * will move from its position in the default decoration */ unsigned int ResBo = RealDecorationActiveBorderExtent; unsigned int ResIn = ActiveInputExtent; unsigned int MaxEx = MaximizedBorderExtent; mTestWindowDecoration = MakeFakePixmapTypeDecoration (DECOR_WINDOW_TYPE_NORMAL, 0, 0, 10, 10, DecorationExtents (ResBo, ResBo, ResBo, ResBo), DecorationExtents (ResIn, ResIn, ResIn, ResIn), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), DecorationExtents (MaxEx, MaxEx, MaxEx, MaxEx), Display ()); DecorateWindow (display, mTestWindow, mTestWindowDecoration); WaitForDecorationUpdate (display, mTestWindow, mTestWindowDecoration); } void PixmapDecoratedWindowAcceptance::TearDown () { mTestWindowDecoration.reset (); DestroyWindow (Display (), mTestWindow); PixmapDecoratorAcceptance::TearDown (); } bool PixmapDecoratedWindowAcceptance::StartDecoratorOnSetUp () const { return false; } namespace { static const unsigned int RemoveState = 0; static const unsigned int AddState = 1; static const unsigned int ToggleState = 2; void ChangeStateOfWindow (Display *dpy, unsigned int mode, const std::string &state, Window w) { XEvent event; const long ClientTypePager = 2; event.type = ClientMessage; event.xany.window = w; event.xclient.format = 32; event.xclient.message_type = XInternAtom (dpy, "_NET_WM_STATE", 0); event.xclient.data.l[0] = mode; event.xclient.data.l[1] = XInternAtom (dpy, state.c_str (), 0); event.xclient.data.l[2] = 0; event.xclient.data.l[3] = ClientTypePager; XSendEvent (dpy, DefaultRootWindow (dpy), 1, SubstructureRedirectMask, &event); XSync (dpy, 0); } boost::shared_ptr FetchCardinalProperty (Display *dpy, Window w, Atom NETWMFrameExtentsAtom) { boost::shared_ptr data; FetchAndVerifyProperty (dpy, w, NETWMFrameExtentsAtom, XA_CARDINAL, 32, 4, 0, data); return data; } } TEST_F (PixmapDecoratedWindowAcceptance, MaximizeBorderExtentsOnMaximize) { ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); boost::shared_ptr data = FetchCardinalProperty (Display (), mTestWindow, NETWMFrameExtentsAtom); unsigned long *frameExtents = reinterpret_cast (data.get ()); unsigned int MaxEx = MaximizedBorderExtent; EXPECT_THAT (frameExtents, IsExtents (MaxEx, MaxEx, MaxEx, MaxEx)); } TEST_F (PixmapDecoratedWindowAcceptance, RestoredBorderExtentsOnVertMaximize) { ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); boost::shared_ptr data = FetchCardinalProperty (Display (), mTestWindow, NETWMFrameExtentsAtom); unsigned long *frameExtents = reinterpret_cast (data.get ()); unsigned int ActEx = RealDecorationActiveBorderExtent; EXPECT_THAT (frameExtents, IsExtents (ActEx, ActEx, ActEx, ActEx)); } TEST_F (PixmapDecoratedWindowAcceptance, RestoredBorderExtentsOnHorzMaximize) { ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); WaitForPropertyNotify (Display (), mTestWindow, "_NET_FRAME_EXTENTS"); boost::shared_ptr data = FetchCardinalProperty (Display (), mTestWindow, NETWMFrameExtentsAtom); unsigned long *frameExtents = reinterpret_cast (data.get ()); unsigned int ActEx = RealDecorationActiveBorderExtent; EXPECT_THAT (frameExtents, IsExtents (ActEx, ActEx, ActEx, ActEx)); } TEST_F (PixmapDecoratedWindowAcceptance, MaximizeFrameWindowSizeEqOutputSize) { XWindowAttributes attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &attrib); /* The assumption here is that there is only one output */ ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); ct::ConfigureNotifyXEventMatcher matcher (None, 0, 0, 0, attrib.width, attrib.height, CWX | CWY | CWWidth | CWHeight); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mTestWindowParent, ConfigureNotify, -1, -1, matcher))); } TEST_F (PixmapDecoratedWindowAcceptance, VertMaximizeFrameWindowYHeight) { XWindowAttributes attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; ct::ConfigureNotifyXEventMatcher matcher (None, 0, 0, offset, 0, attrib.height - 2 * offset, CWY | CWHeight); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mTestWindowParent, ConfigureNotify, -1, -1, matcher))); } TEST_F (PixmapDecoratedWindowAcceptance, HorzMaximizeFrameWindowXWidth) { XWindowAttributes attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; ct::ConfigureNotifyXEventMatcher matcher (None, 0, offset, 0, attrib.width - 2 * offset, 0, CWX | CWWidth); EXPECT_TRUE (Advance (Display (), ct::WaitForEventOfTypeOnWindowMatching (Display (), mTestWindowParent, ConfigureNotify, -1, -1, matcher))); } TEST_F (PixmapDecoratedWindowAcceptance, VertMaximizeFrameWindowSizeSameXWidth) { XWindowAttributes rootAttrib, attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &rootAttrib); XGetWindowAttributes (Display (), mTestWindowParent, &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", mTestWindow); /* Wait for the window to be maximized first */ int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; WaitForConfigureOn (Display (), mTestWindowParent, 0, offset, 0, rootAttrib.height - 2 * offset, CWY | CWHeight); /* Query the window geometry and ensure that the width and * height have remained the same (adding on any extended borders, * in this case 0) */ EXPECT_THAT (mTestWindowParent, HasGeometry (Display (), RelativeWindowGeometry, attrib.x, _, attrib.width, _, _)); } TEST_F (PixmapDecoratedWindowAcceptance, HorzMaximizeFrameWindowSizeSameYHeight) { XWindowAttributes rootAttrib, attrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &rootAttrib); XGetWindowAttributes (Display (), mTestWindowParent, &attrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", mTestWindow); /* Wait for the window to be maximized first */ int offset = RealDecorationActiveBorderExtent - ActiveInputExtent; WaitForConfigureOn (Display (), mTestWindowParent, offset, 0, rootAttrib.width - 2 * offset, 0, CWX | CWWidth); /* Query the window geometry and ensure that the width and * height have remained the same (adding on any extended borders, * in this case 0) */ EXPECT_THAT (mTestWindowParent, HasGeometry (Display (), RelativeWindowGeometry, _, attrib.y, _, attrib.height, _)); } /* Ensure that a window expands to its original size when it is * undecorated */ TEST_F (PixmapDecoratedWindowAcceptance, UndecoratedWindowExpandToOrigSizePlusInitialBorder) { DisallowDecorationsOnWindow (mTestWindow); WaitForConfigureOn (Display (), mTestWindowParent, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), CWX | CWY | CWWidth | CWHeight); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), _)); } TEST_F (PixmapDecoratedWindowAcceptance, UndecorateStaticGravityWindow) { XSizeHints hints; hints.flags = PWinGravity; hints.win_gravity = StaticGravity; XSetWMNormalHints (Display (), mTestWindow, &hints); DisallowDecorationsOnWindow (mTestWindow); WaitForConfigureOn (Display (), mTestWindowParent, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), CWX | CWY | CWWidth | CWHeight); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x (), mBorderGeometryOnInitialDecoration.y (), mBorderGeometryOnInitialDecoration.width (), mBorderGeometryOnInitialDecoration.height (), _)); } class PixmapDecorationAdjustment : public PixmapDecoratedWindowAcceptance, public WithParamInterface { public: void MaximizeWindow (Window window); void RestoreWindow (Window window, int restoredFrameX, int restoredFrameY, unsigned int restoredFrameWidth, unsigned int restoredFrameHeight); }; void PixmapDecorationAdjustment::MaximizeWindow (Window window) { XWindowAttributes rootAttrib; XGetWindowAttributes (Display (), DefaultRootWindow (Display ()), &rootAttrib); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_HORZ", window); ChangeStateOfWindow (Display (), AddState, "_NET_WM_STATE_MAXIMIZED_VERT", window); /* Wait for the window to be maximized first */ WaitForConfigureOn (Display (), mTestWindowParent, 0, 0, rootAttrib.width, rootAttrib.height, CWX | CWY | CWWidth | CWHeight); } void PixmapDecorationAdjustment::RestoreWindow (Window window, int restoredFrameX, int restoredFrameY, unsigned int restoredFrameWidth, unsigned int restoredFrameHeight) { ChangeStateOfWindow (Display (), RemoveState, "_NET_WM_STATE_MAXIMIZED_HORZ", window); ChangeStateOfWindow (Display (), RemoveState, "_NET_WM_STATE_MAXIMIZED_VERT", window); /* Wait for the window to be restored first */ WaitForConfigureOn (Display (), mTestWindowParent, restoredFrameX, restoredFrameY, restoredFrameWidth, restoredFrameHeight, CWX | CWY | CWWidth | CWHeight); } TEST_P (PixmapDecorationAdjustment, AdjustRestoredWindowBorderMovesClient) { ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], GetParam (), GetParam ()); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + GetParam ().left, mBorderGeometryOnInitialDecoration.y () + GetParam ().top, _, _, _)); } TEST_P (PixmapDecorationAdjustment, AdjustRestoredWindowBorderShrinkClient) { ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], GetParam (), GetParam ()); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, _, _, mBorderGeometryOnInitialDecoration.width () - (GetParam ().left + GetParam ().right), mBorderGeometryOnInitialDecoration.height () - (GetParam ().top + GetParam ().bottom), _)); } TEST_P (PixmapDecorationAdjustment, ClientExpandsAsBorderShrinks) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (10, 10, 10, 10), DecorationExtents (10, 10, 10, 10)); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], newExtents, DecorationExtents (10, 10, 10, 10)); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, _, _, mBorderGeometryOnInitialDecoration.width () - (newExtents.left + newExtents.right), mBorderGeometryOnInitialDecoration.height () - (newExtents.top + newExtents.bottom), _)); } TEST_P (PixmapDecorationAdjustment, ClientExpandsAsBorderShrinksWhilstMaximized) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (10, 10, 10, 10), DecorationExtents (10, 10, 10, 10)); MaximizeWindow (mTestWindow); /* Set the property on the window, then demaximize without waiting * for a response we will continue to use the maximized window decoration */ mTestWindowDecoration->changeRestoredBorder (newExtents); windowDecorations[mTestWindow].SetPropertyOnWindow (Display (), mTestWindow, WindowDecorationAtom); const CompPoint &off (mTestWindowDecoration->restoredFrameWindowOffset ()); const CompSize &size (mTestWindowDecoration->restoredDecorationInputSize ()); /* As the window is shrunk to accomodate the border size, we must subtract * the border from the original window size */ CompSize shrink ((newExtents.left + newExtents.right), (newExtents.top + newExtents.bottom)); RestoreWindow (mTestWindow, mBorderGeometryOnInitialDecoration.x () + off.x (), mBorderGeometryOnInitialDecoration.y () + off.y (), mBorderGeometryOnInitialDecoration.width () - shrink.width () + size.width (), mBorderGeometryOnInitialDecoration.height () - shrink.height () + size.height ()); /* Subtract the old offset and size and add on the new decoration geometry */ EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + newExtents.left, mBorderGeometryOnInitialDecoration.y () + newExtents.top, mBorderGeometryOnInitialDecoration.width () - ((newExtents.left + newExtents.right)), mBorderGeometryOnInitialDecoration.height () - ((newExtents.top + newExtents.bottom)), _)); } TEST_P (PixmapDecorationAdjustment, ClientExpandsAsBorderShrinksWhilstUndecorated) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (10, 10, 10, 10), DecorationExtents (10, 10, 10, 10)); /* When decorations are disabled on this window, the frame window * will retain the exact same size, as border == input in the previous * case. So there's no need to wait */ DisallowDecorationsOnWindow (mTestWindow); /* Set the property on the window, then decorate without waiting * for a response we will continue to use the maximized window decoration */ mTestWindowDecoration->changeRestoredBorder (newExtents); windowDecorations[mTestWindow].SetPropertyOnWindow (Display (), mTestWindow, WindowDecorationAtom); AllowDecorationsOnWindow (mTestWindow); const CompPoint &off (mTestWindowDecoration->restoredFrameWindowOffset ()); const CompSize &size (mTestWindowDecoration->restoredDecorationInputSize ()); /* As the window is shrunk to accomadate the border size, we must subtract * the border from the original window size */ CompSize shrink ((newExtents.left + newExtents.right), (newExtents.top + newExtents.bottom)); WaitForConfigureOn (Display (), mTestWindowParent, mBorderGeometryOnInitialDecoration.x () + off.x (), mBorderGeometryOnInitialDecoration.y () + off.y (), mBorderGeometryOnInitialDecoration.width () - shrink.width () + size.width (), mBorderGeometryOnInitialDecoration.height () - shrink.height () + size.height (), CWX | CWY | CWWidth | CWHeight); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + newExtents.left, mBorderGeometryOnInitialDecoration.y () + newExtents.top, mBorderGeometryOnInitialDecoration.width () - (newExtents.left + newExtents.right), mBorderGeometryOnInitialDecoration.height () - (newExtents.top + newExtents.bottom), _)); } TEST_P (PixmapDecorationAdjustment, AdjustRestoredWindowInputNoMoveClient) { decor_extents_t newExtents = GetParam (); ReconfigureDecoration (Display (), mTestWindow, mTestWindowDecoration, windowDecorations[mTestWindow], DecorationExtents (1, 1, 1, 1), newExtents); EXPECT_THAT (mTestWindow, HasGeometry (Display (), AbsoluteWindowGeometry, mBorderGeometryOnInitialDecoration.x () + 1, mBorderGeometryOnInitialDecoration.y () + 1, _, _, _)); } decor_extents_t AdjustmentExtents[] = { DecorationExtents (2, 0, 0, 0), DecorationExtents (0, 2, 0, 0), DecorationExtents (0, 0, 2, 0), DecorationExtents (0, 0, 0, 2) }; INSTANTIATE_TEST_CASE_P (AdjustmentExtents, PixmapDecorationAdjustment, ValuesIn (AdjustmentExtents)); ./plugins/decor/decor.xml.in0000644000004100000410000000717713246301623016257 0ustar www-datawww-data <_short>Window Decoration <_long>Window decorations Effects decorations fade cube scale wobbly composite opengl <_short>Active Shadow <_short>Inactive Shadow ./plugins/scale/0000755000004100000410000000000013246301624014014 5ustar www-datawww-data./plugins/scale/CMakeLists.txt0000644000004100000410000000015113246301623016550 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin(scale PLUGINDEPS composite opengl) ./plugins/scale/scale.xml.in0000644000004100000410000001734713246301623016245 0ustar www-datawww-data <_short>Scale <_long>Scale windows Window Management opengl imgpng fade decor imgpng <_short>Appearance <_short>Behaviour <_short>Bindings ./plugins/scale/include/0000755000004100000410000000000013246301623015436 5ustar www-datawww-data./plugins/scale/include/scale/0000755000004100000410000000000013246301624016526 5ustar www-datawww-data./plugins/scale/include/scale/scale.h0000644000004100000410000001101013246301623017756 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_SCALE_H #define _COMPIZ_SCALE_H #include #include #include #define COMPIZ_SCALE_ABI 3 class ScaleScreen; class PrivateScaleScreen; class ScaleWindow; class PrivateScaleWindow; class ScaleSlot : public CompRect { public: ScaleSlot () {} ScaleSlot (const CompRect &r) : CompRect (r) {} public: bool filled; float scale; }; class ScalePosition : public CompPoint { public: float scale; }; enum ScaleType { ScaleTypeNormal = 0, ScaleTypeOutput, ScaleTypeGroup, ScaleTypeAll }; class ScaleScreenInterface : public WrapableInterface { public: virtual bool layoutSlotsAndAssignWindows (); }; extern template class PluginClassHandler; class ScaleScreen : public WrapableHandler, public PluginClassHandler, public CompOption::Class { public: typedef enum { Idle, Out, Wait, In } State; typedef std::list WindowList; ScaleScreen (CompScreen *s); ~ScaleScreen (); bool hasGrab () const; State getState () const; ScaleType getType () const; const Window & getHoveredWindow () const; const Window & getSelectedWindow () const; const CompMatch & getCustomMatch () const; const WindowList& getWindows () const; void relayoutSlots (const CompMatch& match); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); WRAPABLE_HND (0, ScaleScreenInterface, bool, layoutSlotsAndAssignWindows) friend class ScaleWindow; friend class PrivateScaleScreen; friend class PrivateScaleWindow; private: PrivateScaleScreen *priv; }; class ScaleWindowInterface : public WrapableInterface { public: virtual void scalePaintDecoration (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); virtual bool setScaledPaintAttributes (GLWindowPaintAttrib &); virtual void scaleSelectWindow (); }; extern template class PluginClassHandler; class ScaleWindow : public WrapableHandler, public PluginClassHandler { public: ScaleWindow (CompWindow *w); ~ScaleWindow (); CompWindow *window; bool hasSlot () const; /* Scaled window target position (slot) */ ScaleSlot getSlot () const; void setSlot (const ScaleSlot &); /* Scaled window current position (animation) */ ScalePosition getCurrentPosition () const; void setCurrentPosition (const ScalePosition &); WRAPABLE_HND (0, ScaleWindowInterface, void, scalePaintDecoration, const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int) WRAPABLE_HND (1, ScaleWindowInterface, bool, setScaledPaintAttributes, GLWindowPaintAttrib &) WRAPABLE_HND (2, ScaleWindowInterface, void, scaleSelectWindow) friend class ScaleScreen; friend class PrivateScaleScreen; friend class PrivateScaleWindow; private: PrivateScaleWindow *priv; }; #define SCALE_SCREEN(s) \ ScaleScreen *ss = ScaleScreen::get (s) #define SCALE_WINDOW(w) \ ScaleWindow *sw = ScaleWindow::get (w) #endif ./plugins/scale/src/0000755000004100000410000000000013246301624014603 5ustar www-datawww-data./plugins/scale/src/privates.h0000644000004100000410000001117613246301623016616 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _SCALE_PRIVATES_H #define _SCALE_PRIVATES_H #include #include "scale_options.h" class SlotArea { public: int nWindows; CompRect workArea; typedef std::vector vector; }; class PrivateScaleScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public ScaleOptions { public: PrivateScaleScreen (CompScreen *); void handleEvent (XEvent *event); void preparePaint (int); void donePaint (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void activateEvent (bool activating); void terminateScale (bool accept); void layoutSlotsForArea (const CompRect&, int); void layoutSlots (); void findBestSlots (); bool fillInWindows (); bool layoutThumbs (); bool layoutThumbsAll (); bool layoutThumbsSingle (); SlotArea::vector getSlotAreas (); ScaleWindow * checkForWindowAt (int x, int y); void sendDndStatusMessage (Window, bool asks); void sendDndFinishedMessage (Window); bool actionShouldToggle (CompAction *action, CompAction::State state); static bool scaleTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool scaleInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options, ScaleType type); bool scaleInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options); bool ensureDndRedirectWindow (); bool selectWindowAt (int x, int y, bool moveInputFocus); bool selectWindowAt (int x, int y); void moveFocusWindow (CompWindow *); void moveFocusWindow (int dx, int dy); void moveFocusWindow (int distance); void windowRemove (CompWindow *); bool hoverTimeout (); bool dndCheckTimeout (); void updateOpacity (); int getMultioutputMode (); public: CompositeScreen *cScreen; GLScreen *gScreen; unsigned int lastActiveNum; Window lastActiveWindow; Window selectedWindow; Window hoveredWindow; Window previousActiveWindow; bool grab; CompScreen::GrabHandle grabIndex; Window dndTarget; Atom xdndSelection; Atom xdndFinished; Atom xdndActionAsk; std::vector dndSpinners; CompTimer hover; CompTimer dndCheck; ScaleScreen::State state; int moreAdjust; std::vector slots; int nSlots; ScaleScreen::WindowList windows; GLushort opacity; ScaleType type; Window clientLeader; CompMatch match; CompMatch currentMatch; }; class PrivateScaleWindow : public CompositeWindowInterface, public GLWindowInterface { public: PrivateScaleWindow (CompWindow *); ~PrivateScaleWindow (); bool damageRect (bool, const CompRect &); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); bool isNeverScaleWin () const; bool isScaleWin () const; bool adjustScaleVelocity (); static bool compareWindowsDistance (ScaleWindow *, ScaleWindow *); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; ScaleWindow *sWindow; ScaleSlot *slot; int sid; int distance; GLfloat xVelocity, yVelocity, scaleVelocity; GLfloat scale; GLfloat lastTargetScale, lastTargetX, lastTargetY; GLfloat tx, ty; float delta; bool adjust; float lastThumbOpacity; }; #endif ./plugins/scale/src/scale.cpp0000644000004100000410000014710113246301623016401 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include "privates.h" #define EDGE_STATE (CompAction::StateInitEdge) class ScalePluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (scale, ScalePluginVTable) static ScaleScreen *sScreen = NULL; static PrivateScaleScreen *spScreen = NULL; bool PrivateScaleWindow::isNeverScaleWin () const { if (window->overrideRedirect ()) return true; if (window->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return true; return false; } bool PrivateScaleWindow::isScaleWin () const { if (isNeverScaleWin ()) return false; if (!spScreen->type || spScreen->type == ScaleTypeOutput) { if (!window->focus ()) return false; } if (window->state () & CompWindowStateSkipPagerMask) return false; if (window->state () & CompWindowStateShadedMask) return false; if (!window->mapNum () || !window->isViewable ()) return false; switch (sScreen->priv->type) { case ScaleTypeGroup: if (spScreen->clientLeader != window->clientLeader () && spScreen->clientLeader != window->id ()) return false; break; case ScaleTypeOutput: if ((unsigned int) window->outputDevice () != (unsigned int) screen->currentOutputDev ().id ()) return false; default: break; } if (!spScreen->currentMatch.evaluate (window)) return false; return true; } void PrivateScaleScreen::activateEvent (bool activating) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o.push_back (CompOption ("active", CompOption::TypeBool)); o[0].value ().set ((int) screen->root ()); o[1].value ().set (activating); screen->handleCompizEvent ("scale", "activate", o); } void ScaleWindowInterface::scalePaintDecoration (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) WRAPABLE_DEF (scalePaintDecoration, attrib, transform, region, mask) void ScaleWindow::scalePaintDecoration (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { WRAPABLE_HND_FUNCTN (scalePaintDecoration, attrib, transform, region, mask) if (spScreen->optionGetOverlayIcon () != ScaleOptions::OverlayIconNone) { GLWindowPaintAttrib sAttrib (attrib); GLTexture *icon; icon = priv->gWindow->getIcon (512, 512); if (!icon) icon = spScreen->gScreen->defaultIcon (); if (icon) { float scale; float x, y; int width, height; int scaledWinWidth, scaledWinHeight; scaledWinWidth = priv->window->width () * priv->scale; scaledWinHeight = priv->window->height () * priv->scale; switch (spScreen->optionGetOverlayIcon ()) { case ScaleOptions::OverlayIconNone: case ScaleOptions::OverlayIconEmblem: scale = 1.0f; break; case ScaleOptions::OverlayIconBig: default: sAttrib.opacity /= 3; scale = MIN (((float) scaledWinWidth / icon->width ()), ((float) scaledWinHeight / icon->height ())); break; } width = icon->width () * scale; height = icon->height () * scale; switch (spScreen->optionGetOverlayIcon ()) { case ScaleOptions::OverlayIconNone: case ScaleOptions::OverlayIconEmblem: x = priv->window->x () + scaledWinWidth - icon->width (); y = priv->window->y () + scaledWinHeight - icon->height (); break; case ScaleOptions::OverlayIconBig: default: x = priv->window->x () + scaledWinWidth / 2 - width / 2; y = priv->window->y () + scaledWinHeight / 2 - height / 2; break; } x += priv->tx; y += priv->ty; if (priv->slot) { priv->delta = fabs (priv->slot->x1 () - priv->window->x ()) + fabs (priv->slot->y1 () - priv->window->y ()) + fabs (1.0f - priv->slot->scale) * 500.0f; } if (priv->delta) { float o; float ds; ds = fabs (priv->tx) + fabs (priv->ty) + fabs (1.0f - priv->scale) * 500.0f; if (ds > priv->delta) ds = priv->delta; o = ds / priv->delta; if (priv->slot) { if (o < priv->lastThumbOpacity) o = priv->lastThumbOpacity; } else { if (o > priv->lastThumbOpacity) o = 0.0f; } priv->lastThumbOpacity = o; sAttrib.opacity = sAttrib.opacity * o; } mask |= PAINT_WINDOW_BLEND_MASK; CompRegion iconReg (0, 0, width, height); GLTexture::MatrixList ml (1); ml[0] = icon->matrix (); priv->gWindow->vertexBuffer ()->begin (); if (width && height) priv->gWindow->glAddGeometry (ml, iconReg, iconReg); if (priv->gWindow->vertexBuffer ()->end ()) { GLMatrix wTransform (transform); wTransform.scale (scale, scale, 1.0f); wTransform.translate (x / scale, y / scale, 0.0f); priv->gWindow->glDrawTexture (icon, wTransform, sAttrib, mask); } } } if (spScreen->optionGetDndTimeoutSpinner () && priv->window->id() == spScreen->selectedWindow && priv->slot && spScreen->hover.active ()) { GLTexture* spinner = NULL; if (!spScreen->dndSpinners.empty ()) { int speed = spScreen->optionGetDndTimeoutSpinnerSpeed (); unsigned dndSpinnerIdx = (spScreen->hover.minTime() - spScreen->hover.minLeft()) / speed; const GLTexture::List& tex_list = spScreen->dndSpinners[dndSpinnerIdx % spScreen->dndSpinners.size()]; spinner = tex_list.empty() ? NULL : tex_list.front(); } if (spinner) { float scale; int x, y; int size; int scaledWinWidth, scaledWinHeight; int spinnerMaxSize = spinner->width(); scaledWinWidth = priv->window->width () * priv->scale; scaledWinHeight = priv->window->height () * priv->scale; size = MIN (spinnerMaxSize, MIN (scaledWinWidth, scaledWinHeight)); x = priv->tx + priv->window->x () + (scaledWinWidth - size) / 2; y = priv->ty + priv->window->y () + (scaledWinHeight - size) / 2; scale = 1.0; if (size != spinnerMaxSize) { size = spinnerMaxSize; scale = MIN (scaledWinWidth, scaledWinHeight) / (float) spinnerMaxSize; } priv->cWindow->addDamageRect (CompRect (x, y, size / scale, size / scale)); mask |= PAINT_WINDOW_BLEND_MASK; CompRegion iconReg (0, 0, size, size); GLTexture::MatrixList ml (1); ml[0] = spinner->matrix (); priv->gWindow->vertexBuffer ()->begin (); if (size) priv->gWindow->glAddGeometry (ml, iconReg, iconReg); if (priv->gWindow->vertexBuffer ()->end ()) { GLMatrix wTransform (transform); GLWindowPaintAttrib sAttrib (attrib); wTransform.scale (scale, scale, 1.0f); wTransform.translate (x / scale, y / scale, 0.0f); sAttrib.brightness *= 0.65f; priv->gWindow->glDrawTexture (spinner, wTransform, sAttrib, mask); } } } } bool ScaleWindowInterface::setScaledPaintAttributes (GLWindowPaintAttrib& attrib) WRAPABLE_DEF (setScaledPaintAttributes, attrib) bool ScaleWindow::setScaledPaintAttributes (GLWindowPaintAttrib& attrib) { WRAPABLE_HND_FUNCTN_RETURN (bool, setScaledPaintAttributes, attrib) bool drawScaled = false; /* Windows that wouldn't be visible before and after entering * scale mode (because some plugin modified CompWindow::focus) * should be faded in and out */ if (window->state () & CompWindowStateHiddenMask && !window->inShowDesktopMode ()) { GLfloat factor = 0; GLfloat targetX, targetY, targetScale; GLfloat scaleFactor, xFactor, yFactor, divFactor = 3.0f; if (priv->slot) { targetX = priv->slot->x (); targetY = priv->slot->y (); targetScale = priv->slot->scale; } else { targetX = priv->lastTargetX; targetY = priv->lastTargetY; targetScale = priv->lastTargetScale; } /* Don't FDIV0 */ if (targetScale - priv->scale == 0.0f) { divFactor -= 1.0f; scaleFactor = 1.0f; } else scaleFactor = (1.0f - priv->scale) / (1.0f - targetScale); if (targetX - ((float) window->x () + priv->tx) == 0.0f) { divFactor -= 1.0f; xFactor = 1.0f; } else { float distActual = fabsf (window->x () - ((float) window->x () + priv->tx)); float distTarget = fabsf (window->x () - targetX); xFactor = distActual / distTarget; } if (targetY - ((float) window->y () + priv->ty) == 0.0f) { divFactor -= 1.0f; yFactor = 1.0f; } else { float distActual = fabsf (window->y () - ((float) window->y () + priv->ty)); float distTarget = fabsf (window->y () - targetY); yFactor = distActual / distTarget; } if (divFactor) factor = (scaleFactor + xFactor + yFactor) / divFactor; else factor = 1.0f; attrib.opacity *= factor; } if ((priv->adjust || priv->slot) && priv->isScaleWin()) { if (priv->window->id () != spScreen->selectedWindow && spScreen->opacity != OPAQUE && spScreen->state != ScaleScreen::In) { /* modify opacity of windows that are not active */ attrib.opacity = (attrib.opacity * spScreen->opacity) >> 16; } drawScaled = true; } else if (spScreen->state != ScaleScreen::In) { if (spScreen->optionGetDarkenBack ()) { /* modify brightness of the other windows */ attrib.brightness = attrib.brightness / 2; } /* hide windows on the outputs used for scaling that are not in scale mode */ if (!priv->isNeverScaleWin ()) { int moMode, output; moMode = spScreen->getMultioutputMode (); switch (moMode) { case ScaleOptions::MultioutputModeOnCurrentOutputDevice: output = screen->currentOutputDev ().id (); if (priv->window->outputDevice () == output) attrib.opacity = 0; break; default: attrib.opacity = 0; break; } } if (priv->window->id() == spScreen->selectedWindow) spScreen->selectedWindow = 0; if (priv->window->id() == spScreen->hoveredWindow) spScreen->hoveredWindow = 0; } return drawScaled; } bool PrivateScaleWindow::glPaint (const GLWindowPaintAttrib& attrib, const GLMatrix& transform, const CompRegion& region, unsigned int mask) { bool status; if (spScreen->state != ScaleScreen::Idle) { GLWindowPaintAttrib sAttrib (attrib); bool scaled; scaled = sWindow->setScaledPaintAttributes (sAttrib); if (adjust || slot) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; status = gWindow->glPaint (sAttrib, transform, region, mask); if (scaled) { GLWindowPaintAttrib lastAttrib (gWindow->lastPaintAttrib ()); GLMatrix wTransform (transform); if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK) return false; if (window->alpha () || lastAttrib.opacity != OPAQUE) mask |= PAINT_WINDOW_TRANSLUCENT_MASK; wTransform.translate (window->x (), window->y (), 0.0f); wTransform.scale (scale, scale, 1.0f); wTransform.translate (tx / scale - window->x (), ty / scale - window->y (), 0.0f); gWindow->glDraw (wTransform, lastAttrib, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); sWindow->scalePaintDecoration (sAttrib, transform, region, mask); } } else { status = gWindow->glPaint (attrib, transform, region, mask); } return status; } bool PrivateScaleWindow::compareWindowsDistance (ScaleWindow *w1, ScaleWindow *w2) { return w1->priv->distance < w2->priv->distance; } void PrivateScaleScreen::layoutSlotsForArea (const CompRect& workArea, int nWindows) { if (!nWindows) return; int x, y, width, height; int n; int lines = sqrt (nWindows + 1); int spacing = optionGetSpacing (); int nSlots = 0; y = optionGetYOffset() + workArea.y () + spacing; height = (workArea.height () - optionGetYOffset () - optionGetYBottomOffset () - (lines + 1) * spacing) / lines; for (int i = 0; i < lines; i++) { n = MIN (nWindows - nSlots, ceilf ((float) nWindows / lines)); x = optionGetXOffset() + workArea.x () + spacing; width = (workArea.width () - optionGetXOffset() - (n + 1) * spacing) / n; for (int j = 0; j < n; j++) { slots[this->nSlots].setGeometry (x, y, width, height); slots[this->nSlots].filled = false; x += width + spacing; this->nSlots++; nSlots++; } y += height + spacing; } } SlotArea::vector PrivateScaleScreen::getSlotAreas () { SlotArea::vector slotAreas; slotAreas.resize (screen->outputDevs ().size ()); unsigned int i = 0; foreach (CompOutput &o, screen->outputDevs ()) { slotAreas[i].nWindows = 0; foreach (ScaleWindow *window, windows) { CompWindow *cw = window->priv->window; if (cw->outputDevice () == (int) o.id ()) slotAreas[i].nWindows++; } slotAreas[i++].workArea = o.workArea (); } return slotAreas; } void PrivateScaleScreen::layoutSlots () { int moMode; moMode = getMultioutputMode (); /* if we have only one head, we don't need the additional effort of the all outputs mode */ if (screen->outputDevs ().size () == 1) moMode = ScaleOptions::MultioutputModeOnCurrentOutputDevice; nSlots = 0; switch (moMode) { case ScaleOptions::MultioutputModeOnAllOutputDevices: { SlotArea::vector slotAreas = getSlotAreas (); if (!slotAreas.empty ()) { foreach (SlotArea &sa, slotAreas) layoutSlotsForArea (sa.workArea, sa.nWindows); } } break; case ScaleOptions::MultioutputModeOnCurrentOutputDevice: default: { CompRect workArea (screen->currentOutputDev ().workArea ()); layoutSlotsForArea (workArea, windows.size ()); } break; } } void PrivateScaleScreen::findBestSlots () { CompWindow *w; int i, d, d0 = 0; float sx, sy, cx, cy; foreach (ScaleWindow *sw, windows) { w = sw->priv->window; if (sw->priv->slot) continue; sw->priv->sid = 0; sw->priv->distance = MAXSHORT; for (i = 0; i < nSlots; i++) { if (!slots[i].filled) { sx = (slots[i].x2 () + slots[i].x1 ()) / 2; sy = (slots[i].y2 () + slots[i].y1 ()) / 2; cx = (w->serverX () - (w->defaultViewport ().x () - screen->vp ().x ()) * screen->width ()) + w->width () / 2; cy = (w->serverY () - (w->defaultViewport ().y () - screen->vp ().y ()) * screen->height ()) + w->height () / 2; cx -= sx; cy -= sy; d = sqrt (cx * cx + cy * cy); if (d0 + d < sw->priv->distance) { sw->priv->sid = i; sw->priv->distance = d0 + d; } } } d0 += sw->priv->distance; } } bool PrivateScaleScreen::fillInWindows () { CompWindow *w; int width, height; float sx, sy, cx, cy; foreach (ScaleWindow *sw, windows) { w = sw->priv->window; if (!sw->priv->slot) { if (slots[sw->priv->sid].filled) return true; sw->priv->slot = &slots[sw->priv->sid]; /* Auxilary items reparented into windows are clickable so we want to care about * them when calculating the slot size */ width = w->width () + w->input ().left + w->input ().right; height = w->height () + w->input ().top + w->input ().bottom; sx = (float) (sw->priv->slot->x2 () - sw->priv->slot->x1 ()) / width; sy = (float) (sw->priv->slot->y2 () - sw->priv->slot->y1 ()) / height; sw->priv->slot->scale = MIN (MIN (sx, sy), 1.0f); sx = width * sw->priv->slot->scale; sy = height * sw->priv->slot->scale; cx = (sw->priv->slot->x1 () + sw->priv->slot->x2 ()) / 2; cy = (sw->priv->slot->y1 () + sw->priv->slot->y2 ()) / 2; cx += w->input ().left * sw->priv->slot->scale; cy += w->input ().top * sw->priv->slot->scale; sw->priv->slot->setGeometry (cx - sx / 2, cy - sy / 2, sx, sy); sw->priv->slot->filled = true; sw->priv->lastThumbOpacity = 0.0f; sw->priv->adjust = true; } } return false; } bool ScaleScreenInterface::layoutSlotsAndAssignWindows () WRAPABLE_DEF (layoutSlotsAndAssignWindows) bool ScaleScreen::layoutSlotsAndAssignWindows () { WRAPABLE_HND_FUNCTN_RETURN (bool, layoutSlotsAndAssignWindows) /* create a grid of slots */ priv->layoutSlots (); do { /* find most appropriate slots for windows */ priv->findBestSlots (); /* sort windows, window with closest distance to a slot first */ priv->windows.sort (PrivateScaleWindow::compareWindowsDistance); } while (priv->fillInWindows ()); return true; } bool ScaleScreen::hasGrab () const { return priv->grab; } ScaleScreen::State ScaleScreen::getState () const { return priv->state; } ScaleType ScaleScreen::getType () const { return priv->type; } const CompMatch& ScaleScreen::getCustomMatch () const { return priv->match; } const ScaleScreen::WindowList& ScaleScreen::getWindows () const { return priv->windows; } bool PrivateScaleScreen::layoutThumbs () { switch (type) { case ScaleTypeAll: return layoutThumbsAll (); case ScaleTypeNormal: default: return layoutThumbsSingle (); } } bool PrivateScaleScreen::layoutThumbsAll () { windows.clear (); /* add windows scale list, top most window first */ foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); if (sw->priv->slot) sw->priv->adjust = true; sw->priv->slot = NULL; if (!sw->priv->isScaleWin ()) continue; windows.push_back (sw); } if (windows.empty ()) return false; slots.resize (windows.size ()); return sScreen->layoutSlotsAndAssignWindows (); } bool PrivateScaleScreen::layoutThumbsSingle () { bool ret = false; std::map slotWindows; CompWindowList allWindows; for (int i = 0; i < screen->vpSize ().height (); i++) { for (int j = 0; j < screen->vpSize ().width (); j++) { windows.clear (); slots.clear (); /* add windows scale list, top most window first */ foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); if (w->defaultViewport () != CompPoint (j, i)) continue; if (sw->priv->slot) sw->priv->adjust = true; sw->priv->slot = NULL; if (!sw->priv->isScaleWin ()) continue; windows.push_back (sw); } if (!windows.empty ()) { slots.resize (windows.size ()); ret |= sScreen->layoutSlotsAndAssignWindows (); foreach (ScaleWindow *sw, windows) slotWindows[sw] = *sw->priv->slot; } } } slots.clear (); windows.clear (); for (std::map::iterator it = slotWindows.begin (); it != slotWindows.end (); ++it) { slots.push_back (it->second); windows.push_back (it->first); it->first->priv->slot = &slots.back (); it->first->priv->slot->setX (it->first->priv->slot->x () + (it->first->priv->window->defaultViewport ().x () - screen->vp ().x ()) * screen->width ()); it->first->priv->slot->setY (it->first->priv->slot->y () + (it->first->priv->window->defaultViewport ().y () - screen->vp ().y ()) * screen->height ()); } return ret; } bool PrivateScaleWindow::adjustScaleVelocity () { float dx, dy, ds, adjust, amount; float x1, y1, scale; if (slot) { x1 = slot->x1 (); y1 = slot->y1 (); scale = slot->scale; } else { x1 = window->x (); y1 = window->y (); scale = 1.0f; } dx = x1 - (window->x () + tx); adjust = dx * 0.15f; amount = fabs (dx) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; xVelocity = (amount * xVelocity + adjust) / (amount + 1.0f); dy = y1 - (window->y () + ty); adjust = dy * 0.15f; amount = fabs (dy) * 1.5f; if (amount < 0.5f) amount = 0.5f; else if (amount > 5.0f) amount = 5.0f; yVelocity = (amount * yVelocity + adjust) / (amount + 1.0f); ds = scale - this->scale; adjust = ds * 0.1f; amount = fabs (ds) * 7.0f; if (amount < 0.01f) amount = 0.01f; else if (amount > 0.15f) amount = 0.15f; scaleVelocity = (amount * scaleVelocity + adjust) / (amount + 1.0f); if (fabs (dx) < 0.1f && fabs (xVelocity) < 0.2f && fabs (dy) < 0.1f && fabs (yVelocity) < 0.2f && fabs (ds) < 0.001f && fabs (scaleVelocity) < 0.002f) { xVelocity = yVelocity = scaleVelocity = 0.0f; tx = x1 - window->x (); ty = y1 - window->y (); this->scale = scale; return false; } return true; } bool PrivateScaleScreen::glPaintOutput (const GLScreenPaintAttrib& sAttrib, const GLMatrix& transform, const CompRegion& region, CompOutput *output, unsigned int mask) { if (state != ScaleScreen::Idle) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void PrivateScaleScreen::preparePaint (int msSinceLastPaint) { #ifndef LP1026986_FIXED_PROPERLY if (state != ScaleScreen::Idle) cScreen->damageScreen (); #endif if (state != ScaleScreen::Idle && state != ScaleScreen::Wait) { int steps; float amount, chunk, speed; speed = optionGetSkipAnimation() ? USHRT_MAX : optionGetSpeed(); amount = msSinceLastPaint * 0.05f * speed; steps = amount / (0.5f * optionGetTimestep ()); if (!steps) steps = 1; chunk = amount / (float) steps; while (steps--) { moreAdjust = 0; foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); if (sw->priv->adjust) { sw->priv->adjust = sw->priv->adjustScaleVelocity (); moreAdjust |= sw->priv->adjust; sw->priv->tx += sw->priv->xVelocity * chunk; sw->priv->ty += sw->priv->yVelocity * chunk; sw->priv->scale += sw->priv->scaleVelocity * chunk; } } if (!moreAdjust) break; } } cScreen->preparePaint (msSinceLastPaint); } void PrivateScaleScreen::donePaint () { if (state != ScaleScreen::Idle) { if (moreAdjust) { cScreen->damageScreen (); } else { if (state == ScaleScreen::In) { /* The false activate event is sent when scale state goes back to normal, to avoid animation conflicts with other plugins. */ activateEvent (false); state = ScaleScreen::Idle; screen->handleEventSetEnabled (this, false); cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); sw->priv->cWindow->damageRectSetEnabled (sw->priv, false); sw->priv->gWindow->glPaintSetEnabled (sw->priv, false); } } else if (state == ScaleScreen::Out) { state = ScaleScreen::Wait; // When the animation is completed, select the window under mouse selectWindowAt (pointerX, pointerY); } } } cScreen->donePaint (); } ScaleWindow * PrivateScaleScreen::checkForWindowAt (int x, int y) { int x1, y1, x2, y2; CompWindowList::reverse_iterator rit = screen->windows ().rbegin (); for (; rit != screen->windows ().rend (); ++rit) { CompWindow *w = *rit; SCALE_WINDOW (w); if (sw->priv->slot) { x1 = w->x () - w->input ().left * sw->priv->scale; y1 = w->y () - w->input ().top * sw->priv->scale; x2 = w->x () + (w->width () + w->input ().right) * sw->priv->scale; y2 = w->y () + (w->height () + w->input ().bottom) * sw->priv->scale; x1 += sw->priv->tx; y1 += sw->priv->ty; x2 += sw->priv->tx; y2 += sw->priv->ty; if (x1 <= x && y1 <= y && x2 > x && y2 > y) return sw; } } return NULL; } void PrivateScaleScreen::sendDndStatusMessage (Window source, bool asks) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = Atoms::xdndStatus; xev.xclient.window = source; xev.xclient.data.l[0] = dndTarget; xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = None; if (asks) { xev.xclient.data.l[1] = 1 << 0 | 1 << 1; xev.xclient.data.l[4] = xdndActionAsk; } XSendEvent (screen->dpy (), source, false, 0, &xev); } void PrivateScaleScreen::sendDndFinishedMessage (Window source) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = xdndFinished; xev.xclient.window = source; xev.xclient.data.l[0] = dndTarget; xev.xclient.data.l[1] = 0; // Not accepted xev.xclient.data.l[2] = None; XSendEvent (screen->dpy (), source, false, 0, &xev); } bool PrivateScaleScreen::scaleTerminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { SCALE_SCREEN (screen); Window xid; int selectX = CompOption::getIntOptionNamed (options, "select_x", -1); int selectY = CompOption::getIntOptionNamed (options, "select_y", -1); if (ss->priv->actionShouldToggle (action, state)) return false; xid = CompOption::getIntOptionNamed (options, "root"); if (xid && ::screen->root () != xid) return false; if (!ss->priv->grab) return false; if (selectX != -1 && selectY != -1) { if (!ss->priv->selectWindowAt (selectX, selectY, true)) return false; } if (ss->priv->grabIndex) { ::screen->removeGrab (ss->priv->grabIndex, 0); ss->priv->grabIndex = 0; } if (ss->priv->dndTarget) { ss->priv->dndCheck.stop (); XUnmapWindow (::screen->dpy (), ss->priv->dndTarget); } ss->priv->grab = false; if (ss->priv->state != ScaleScreen::Idle) { foreach (CompWindow *w, ::screen->windows ()) { SCALE_WINDOW (w); if (sw->priv->slot) { sw->priv->lastTargetScale = sw->priv->slot->scale; sw->priv->lastTargetX = sw->priv->slot->x (); sw->priv->lastTargetY = sw->priv->slot->y (); sw->priv->slot = NULL; sw->priv->adjust = true; } else { sw->priv->lastTargetScale = 1.0f; sw->priv->lastTargetX = w->x (); sw->priv->lastTargetY = w->y (); } } if (state & CompAction::StateCancel) { if (::screen->activeWindow () != ss->priv->previousActiveWindow) { CompWindow *w; w = ::screen->findWindow (ss->priv->previousActiveWindow); if (w) w->moveInputFocusTo (); } } else if (ss->priv->state != ScaleScreen::In) { CompWindow *w = ::screen->findWindow (ss->priv->selectedWindow); if (w) w->activate (); } ss->priv->state = ScaleScreen::In; ss->priv->cScreen->damageScreen (); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); ss->priv->lastActiveNum = 0; if (selectX != -1 && selectY != -1) return true; return false; } bool PrivateScaleScreen::ensureDndRedirectWindow () { if (!dndTarget) { XSetWindowAttributes attr; long xdndVersion = 5; attr.override_redirect = True; dndTarget = XCreateWindow (screen->dpy (), screen->root (), 0, 0, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attr); XChangeProperty (screen->dpy (), dndTarget, Atoms::xdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char *) &xdndVersion, 1); } if (screen->XShape ()) { CompRegion workAreaRegion; foreach (const CompOutput& output, screen->outputDevs ()) workAreaRegion |= output.workArea (); XShapeCombineRegion (screen->dpy (), dndTarget, ShapeBounding, 0, 0, workAreaRegion.handle (), ShapeSet); } XMoveResizeWindow (screen->dpy (), dndTarget, 0, 0, screen->width (), screen->height ()); XMapRaised (screen->dpy (), dndTarget); XSync (screen->dpy (), False); return true; } bool PrivateScaleScreen::actionShouldToggle (CompAction *action, CompAction::State state) { if (state & EDGE_STATE) return TRUE; if (state & (CompAction::StateInitKey | CompAction::StateTermKey)) { if (optionGetKeyBindingsToggle ()) return TRUE; else if (!action->key ().modifiers ()) return TRUE; } if (state & (CompAction::StateInitButton | CompAction::StateTermButton)) if (optionGetButtonBindingsToggle ()) return TRUE; return FALSE; } bool PrivateScaleScreen::scaleInitiate (CompAction *action, CompAction::State state, CompOption::Vector &options, ScaleType type) { Window xid; xid = CompOption::getIntOptionNamed (options, "root"); if (::screen->root () == xid) { SCALE_SCREEN (::screen); if (ss->priv->actionShouldToggle (action, state) && (ss->priv->state == ScaleScreen::Wait || ss->priv->state == ScaleScreen::Out)) { if (ss->priv->type == type) return scaleTerminate (action, CompAction::StateCancel, options); } else { ss->priv->type = type; return ss->priv->scaleInitiateCommon (action, state, options); } } return false; } bool PrivateScaleScreen::scaleInitiateCommon (CompAction *action, CompAction::State state, CompOption::Vector &options) { int noAutoGrab = CompOption::getIntOptionNamed (options, "no_auto_grab", 0); if (screen->otherGrabExist ("scale", NULL) && !noAutoGrab) return false; match = CompOption::getMatchOptionNamed (options, "match", CompMatch::emptyMatch); if (match.isEmpty ()) match = optionGetWindowMatch (); currentMatch = match; if (!layoutThumbs ()) return false; /* Another plugin may be using us externally */ grab = noAutoGrab; if (!grab) { if (state & CompAction::StateInitEdgeDnd) { if (ensureDndRedirectWindow ()) grab = true; } else if (!grabIndex) { grabIndex = screen->pushGrab (screen->normalCursor (), "scale"); if (grabIndex) grab = true; } } if (grab) { if (!lastActiveNum) lastActiveNum = screen->activeNum () - 1; Window active_window = screen->activeWindow (); bool found_active = false; foreach (ScaleWindow *sw, windows) { if (sw->window->id() == active_window) { found_active = true; break; } } if (!found_active) active_window = None; previousActiveWindow = active_window; lastActiveWindow = active_window; selectedWindow = active_window; hoveredWindow = None; this->state = ScaleScreen::Out; activateEvent (true); cScreen->damageScreen (); screen->handleEventSetEnabled (this, true); cScreen->preparePaintSetEnabled (this, true); cScreen->donePaintSetEnabled (this, true); gScreen->glPaintOutputSetEnabled (this, true); foreach (CompWindow *w, screen->windows ()) { SCALE_WINDOW (w); sw->priv->cWindow->damageRectSetEnabled (sw->priv, true); sw->priv->gWindow->glPaintSetEnabled (sw->priv, true); } } if ((state & (CompAction::StateInitButton | EDGE_STATE)) == CompAction::StateInitButton) { action->setState (action->state () | CompAction::StateTermButton); } if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); return false; } void ScaleWindowInterface::scaleSelectWindow () WRAPABLE_DEF (scaleSelectWindow) void ScaleWindow::scaleSelectWindow () { WRAPABLE_HND_FUNCTN (scaleSelectWindow) if (spScreen->selectedWindow != priv->window->id ()) { CompWindow *oldW, *newW; oldW = screen->findWindow (spScreen->selectedWindow); newW = screen->findWindow (priv->window->id ()); spScreen->selectedWindow = priv->window->id (); if (oldW) CompositeWindow::get (oldW)->addDamage (); if (newW) CompositeWindow::get (newW)->addDamage (); } } bool ScaleWindow::hasSlot () const { return priv->slot != NULL; } ScaleSlot ScaleWindow::getSlot () const { if (!priv->slot) { ScaleSlot empty; return empty; } return *priv->slot; } void ScaleWindow::setSlot (const ScaleSlot &newSlot) { SCALE_SCREEN (screen); priv->adjust = true; if (!priv->slot) priv->slot = new ScaleSlot (); *priv->slot = newSlot; /* Trigger the animation to this point */ if (ss->priv->state == ScaleScreen::Wait) ss->priv->state = ScaleScreen::Out; else if (ss->priv->state == ScaleScreen::Idle) ss->priv->state = ScaleScreen::In; priv->cWindow->addDamage (); } ScalePosition ScaleWindow::getCurrentPosition () const { ScalePosition pos; pos.setX (priv->tx); pos.setY (priv->ty); pos.scale = priv->scale; return pos; } void ScaleWindow::setCurrentPosition (const ScalePosition &newPos) { SCALE_SCREEN (screen); priv->tx = newPos.x (); priv->ty = newPos.y (); priv->scale = newPos.scale; /* Trigger the animation to this point */ if (ss->priv->state == ScaleScreen::Wait) ss->priv->state = ScaleScreen::Out; else if (ss->priv->state == ScaleScreen::Idle) ss->priv->state = ScaleScreen::In; priv->cWindow->addDamage (); priv->adjust = true; } const Window & ScaleScreen::getHoveredWindow () const { return priv->hoveredWindow; } const Window & ScaleScreen::getSelectedWindow () const { return priv->selectedWindow; } bool PrivateScaleScreen::selectWindowAt (int x, int y, bool moveInputFocus) { ScaleWindow *w = checkForWindowAt (x, y); if (w && w->priv->isScaleWin ()) { w->scaleSelectWindow (); if (moveInputFocus) { lastActiveNum = w->priv->window->activeNum (); lastActiveWindow = w->priv->window->id (); w->priv->window->moveInputFocusTo (); } hoveredWindow = w->priv->window->id (); return true; } hoveredWindow = None; return false; } bool PrivateScaleScreen::selectWindowAt (int x, int y) { CompOption *o = screen->getOption ("click_to_focus"); bool focus = (o && !o->value ().b ()); return selectWindowAt (x, y, focus); } void PrivateScaleScreen::moveFocusWindow (int distance) { CompWindow *selected; CompWindow *next; next = NULL; selected = screen->findWindow (selectedWindow ? selectedWindow : screen->activeWindow ()); auto scaledWindows = windows; /* Sort windows to respect the natural grid view */ scaledWindows.sort ([] (ScaleWindow *sw1, ScaleWindow *sw2) { if (!sw1->priv->slot) return !sw2->priv->slot; if (!sw2->priv->slot) return true; int cy1 = (sw1->priv->slot->y1 () + sw1->priv->slot->y2 ()) / 2; int cy2 = (sw2->priv->slot->y1 () + sw2->priv->slot->y2 ()) / 2; if (abs (cy1 - cy2) < std::max (sw1->priv->slot->height (), sw2->priv->slot->height ()) / 2) { int cx1 = (sw1->priv->slot->x1 () + sw1->priv->slot->x2 ()) / 2; int cx2 = (sw2->priv->slot->x1 () + sw2->priv->slot->x2 ()) / 2; return cx1 < cx2; } return cy1 < cy2; }); if (selected && !scaledWindows.empty()) { SCALE_WINDOW (selected); auto selected_it = std::find (scaledWindows.begin (), scaledWindows.end (), sw); if (selected_it != scaledWindows.end ()) { std::advance (selected_it, distance); if (selected_it == scaledWindows.end ()) { if (distance > 0) selected_it = scaledWindows.begin (); else if (distance < 0) selected_it = std::prev (scaledWindows.end ()); } next = (*selected_it)->window; } } moveFocusWindow (next); } void PrivateScaleScreen::moveFocusWindow (int dx, int dy) { CompWindow *active; CompWindow *focus = NULL; active = screen->findWindow (selectedWindow ? selectedWindow : screen->activeWindow ()); if (active) { SCALE_WINDOW (active); if (sw->priv->slot) { ScaleSlot *slot; int x, y, cx, cy, d, min = MAXSHORT; cx = (sw->priv->slot->x1 () + sw->priv->slot->x2 ()) / 2; cy = (sw->priv->slot->y1 () + sw->priv->slot->y2 ()) / 2; foreach (ScaleWindow *w, windows) { slot = w->priv->slot; if (!slot) continue; x = (slot->x1 () + slot->x2 ()) / 2; y = (slot->y1 () + slot->y2 ()) / 2; d = abs (x - cx) + abs (y - cy); if (d < min) { if ((dx > 0 && slot->x1 () < sw->priv->slot->x2 ()) || (dx < 0 && slot->x2 () > sw->priv->slot->x1 ()) || (dy > 0 && slot->y1 () < sw->priv->slot->y2 ()) || (dy < 0 && slot->y2 () > sw->priv->slot->y1 ())) continue; min = d; focus = w->window; } } } } moveFocusWindow (focus); } void PrivateScaleScreen::moveFocusWindow (CompWindow *focus) { /* move focus to the last focused window if no slot window is currently focused */ if (!focus) { foreach (ScaleWindow *sw, windows) { if (!sw->priv->slot) continue; if (!focus || focus->activeNum () < sw->window->activeNum ()) focus = sw->window; } } if (focus) { ScaleWindow::get (focus)->scaleSelectWindow (); lastActiveNum = focus->activeNum (); lastActiveWindow = focus->id (); if (!focus->focused ()) focus->moveInputFocusTo (); } } void ScaleScreen::relayoutSlots (const CompMatch& match) { if (match.isEmpty ()) priv->currentMatch = priv->match; else priv->currentMatch = match; if (priv->state == ScaleScreen::Idle || priv->state == ScaleScreen::In) return; if (priv->layoutThumbs ()) { priv->state = ScaleScreen::Out; priv->moveFocusWindow (0, 0); } priv->cScreen->damageScreen (); } void PrivateScaleScreen::windowRemove (CompWindow *w) { if (!w || state == ScaleScreen::Idle || state == ScaleScreen::In) return; foreach (ScaleWindow *lw, windows) { if (lw->priv->window == w) { if (layoutThumbs ()) { state = ScaleScreen::Out; cScreen->damageScreen (); break; } else { /* terminate scale mode if the recently closed * window was the last scaled window */ terminateScale (false); break; } } } } void PrivateScaleScreen::terminateScale (bool accept) { CompOption::Vector o (0); o.push_back (CompOption ("root", CompOption::TypeInt)); o[0].value ().set ((int) screen->root ()); scaleTerminate (&optionGetInitiateEdge (), accept ? 0 : CompAction::StateCancel, o); scaleTerminate (&optionGetInitiateKey (), accept ? 0 : CompAction::StateCancel, o); activateEvent (false); } bool PrivateScaleScreen::hoverTimeout () { if (grab && state != ScaleScreen::In) { CompWindow *w = screen->findWindow (selectedWindow); if (w) { lastActiveNum = w->activeNum (); lastActiveWindow = w->id (); w->moveInputFocusTo (); } terminateScale (true); } return false; } bool PrivateScaleScreen::dndCheckTimeout () { if (!dndTarget) return false; CompWindow *w = screen->findWindow (dndTarget); if (!w || !w->isMapped ()) return false; Window drag_owner = XGetSelectionOwner (screen->dpy (), xdndSelection); if (drag_owner) { // evil hack because some apps (Qt) don't release the selection owner on drag finished Window root_r, child_r; int root_x_r, root_y_r, win_x_r, win_y_r; unsigned int mask; XQueryPointer (screen->dpy (), screen->root (), &root_r, &child_r, &root_x_r, &root_y_r, &win_x_r, &win_y_r, &mask); if (mask & (Button1Mask | Button2Mask | Button3Mask)) return true; } terminateScale (false); return false; } void PrivateScaleScreen::handleEvent (XEvent *event) { CompWindow *w = NULL; switch (event->type) { case KeyPress: if (screen->root () == event->xkey.root) { if (grabIndex) { KeySym keySym = XkbKeycodeToKeysym (event->xany.display, event->xkey.keycode, 0, 0); if (keySym == XK_Left) moveFocusWindow (-1, 0); else if (keySym == XK_Right) moveFocusWindow (1, 0); else if (keySym == XK_Up) moveFocusWindow (0, -1); else if (keySym == XK_Down) moveFocusWindow (0, 1); else if (keySym == XK_Tab) moveFocusWindow (!(event->xkey.state & ShiftMask) ? 1 : -1); else if (keySym == XK_w && (event->xkey.state & ControlMask)) { if (CompWindow *selected = screen->findWindow (selectedWindow)) selected->close (0); } } } break; case ButtonPress: if (screen->root () == event->xbutton.root && grabIndex && state != ScaleScreen::In) { XButtonEvent *button = &event->xbutton; /* Button1 terminates scale mode, other buttons can select * windows */ if (event->xbutton.button != Button1) break; if (selectWindowAt (button->x_root, button->y_root, true)) { terminateScale (true); } else if (optionGetClickOnDesktop () != ScaleOptions::ClickOnDesktopNone) { CompPoint pointer (button->x_root, button->y_root); CompRect workArea (screen->currentOutputDev ().workArea ()); workArea.setX (workArea.x() + optionGetXOffset ()); workArea.setY (workArea.y() + optionGetYOffset ()); workArea.setBottom (workArea.bottom () + optionGetYBottomOffset ()); if (workArea.contains (pointer)) { terminateScale (false); if (optionGetClickOnDesktop () == ScaleOptions::ClickOnDesktopShowDesktop) screen->enterShowDesktopMode (); } } } break; case MotionNotify: if (screen->root () == event->xmotion.root && grabIndex && state != ScaleScreen::In) { selectWindowAt (event->xmotion.x_root, event->xmotion.y_root); } break; case DestroyNotify: /* We need to get the CompWindow * for event->xdestroywindow.window * here because in the ::handleEvent call below that CompWindow's * id will become "1" so CompScreen::findWindow won't * be able to find teh window after that */ w = screen->findWindow (event->xdestroywindow.window); break; case UnmapNotify: w = screen->findWindow (event->xunmap.window); break; case ClientMessage: if (event->xclient.message_type == Atoms::xdndPosition) { if (event->xclient.window == dndTarget) { bool acceptsDnd = false; if (grab && state != ScaleScreen::In) { dndCheck.stop (); ScaleWindow *sw = checkForWindowAt (pointerX, pointerY); if (sw && sw->priv->isScaleWin ()) { int time; time = optionGetHoverTime (); acceptsDnd = true; if (hover.active ()) { int lastMotion = sqrt (pow (pointerX - lastPointerX, 2) + pow (pointerY - lastPointerY, 2)); if (sw->window->id () != selectedWindow || lastMotion > optionGetDndDistance ()) hover.stop (); } if (!hover.active ()) { hover.start (time, (float) time * 1.2); } selectWindowAt (pointerX, pointerY); } else { if (hover.active ()) hover.stop (); } } sendDndStatusMessage (event->xclient.data.l[0], acceptsDnd); } } else if (event->xclient.message_type == Atoms::xdndEnter) { if (event->xclient.window == dndTarget && grab && state != ScaleScreen::In) { dndCheck.stop (); } } else if (event->xclient.message_type == Atoms::xdndLeave) { if (event->xclient.window == dndTarget && grab && state != ScaleScreen::In) { dndCheck.start (); } } else if (event->xclient.message_type == Atoms::xdndDrop) { if (event->xclient.window == dndTarget) { sendDndFinishedMessage (event->xclient.data.l[0]); if (grab && state != ScaleScreen::In) { terminateScale (true); } } } default: break; } screen->handleEvent (event); /* Only safe to remove the window after all events have been * handled, so that we don't get race conditions on calls * to scale functions */ switch (event->type) { case UnmapNotify: dndCheck.start (); if (w) windowRemove (w); break; case DestroyNotify: if (w) windowRemove (w); break; } } bool PrivateScaleWindow::damageRect (bool initial, const CompRect& rect) { bool status = false; if (initial) { if (spScreen->grab && isScaleWin ()) { if (spScreen->layoutThumbs ()) { spScreen->state = ScaleScreen::Out; spScreen->cScreen->damageScreen (); } } } else if (spScreen->state == ScaleScreen::Wait) { if (slot) { cWindow->damageTransformedRect (scale, scale, tx, ty, rect); status = true; } } status |= cWindow->damageRect (initial, rect); return status; } template class PluginClassHandler; ScaleScreen::ScaleScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateScaleScreen (s)) { sScreen = this; spScreen = priv; } ScaleScreen::~ScaleScreen () { delete priv; sScreen = NULL; spScreen = NULL; } template class PluginClassHandler; ScaleWindow::ScaleWindow (CompWindow *w) : PluginClassHandler (w), window (w), priv (new PrivateScaleWindow (w)) { } ScaleWindow::~ScaleWindow () { delete priv; } PrivateScaleScreen::PrivateScaleScreen (CompScreen *s) : cScreen (CompositeScreen::get (s)), gScreen (GLScreen::get (s)), lastActiveNum (0), lastActiveWindow (None), selectedWindow (None), hoveredWindow (None), previousActiveWindow (None), grab (false), grabIndex (0), dndTarget (None), xdndSelection (XInternAtom (screen->dpy (), "XdndSelection", False)), xdndFinished (XInternAtom (screen->dpy (), "XdndFinished", False)), xdndActionAsk (XInternAtom (screen->dpy (), "XdndActionAsk", False)), state (ScaleScreen::Idle), moreAdjust (false), nSlots (0) { opacity = (OPAQUE * optionGetOpacity ()) / 100; hover.setCallback (boost::bind (&PrivateScaleScreen::hoverTimeout, this)); dndCheck.setCallback (boost::bind (&PrivateScaleScreen::dndCheckTimeout, this)); dndCheck.setTimes (200); optionSetOpacityNotify (boost::bind (&PrivateScaleScreen::updateOpacity, this)); #define SCALEBIND(a) \ boost::bind (PrivateScaleScreen::scaleInitiate, _1, _2, _3, a) optionSetInitiateEdgeInitiate (SCALEBIND (ScaleTypeNormal)); optionSetInitiateEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateButtonInitiate (SCALEBIND (ScaleTypeNormal)); optionSetInitiateButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateKeyInitiate (SCALEBIND (ScaleTypeNormal)); optionSetInitiateKeyTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateAllEdgeInitiate (SCALEBIND (ScaleTypeAll)); optionSetInitiateAllEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateAllButtonInitiate (SCALEBIND (ScaleTypeAll)); optionSetInitiateAllButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateAllKeyInitiate (SCALEBIND (ScaleTypeAll)); optionSetInitiateAllKeyTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateGroupEdgeInitiate (SCALEBIND (ScaleTypeGroup)); optionSetInitiateGroupEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateGroupButtonInitiate (SCALEBIND (ScaleTypeGroup)); optionSetInitiateGroupButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateGroupKeyInitiate (SCALEBIND (ScaleTypeGroup)); optionSetInitiateGroupKeyTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateOutputEdgeInitiate (SCALEBIND (ScaleTypeOutput)); optionSetInitiateOutputEdgeTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateOutputButtonInitiate (SCALEBIND (ScaleTypeOutput)); optionSetInitiateOutputButtonTerminate (PrivateScaleScreen::scaleTerminate); optionSetInitiateOutputKeyInitiate (SCALEBIND (ScaleTypeOutput)); optionSetInitiateOutputKeyTerminate (PrivateScaleScreen::scaleTerminate); #undef SCALEBIND CompString pluginName("scale"); CompSize size; CompString file; file = "dnd-spinner-000.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-125.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-250.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-375.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-500.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-625.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-750.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); file = "dnd-spinner-875.png"; dndSpinners.push_back(GLTexture::readImageToTexture(file, pluginName, size)); ScreenInterface::setHandler (s); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); screen->handleEventSetEnabled (this, false); cScreen->preparePaintSetEnabled (this, false); cScreen->donePaintSetEnabled (this, false); gScreen->glPaintOutputSetEnabled (this, false); } void PrivateScaleScreen::updateOpacity () { opacity = (OPAQUE * optionGetOpacity ()) / 100; } /* When we are only scaling windows on the current output, over-ride the * multioutput mode so that windows will only be displayed on the current * output, regardless of the setting. */ int PrivateScaleScreen::getMultioutputMode () { if (type == ScaleTypeOutput) return MultioutputModeOnCurrentOutputDevice; return optionGetMultioutputMode (); } PrivateScaleWindow::PrivateScaleWindow (CompWindow *w) : window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), sWindow (ScaleWindow::get (w)), slot (NULL), sid (0), distance (0.0), xVelocity (0.0), yVelocity (0.0), scaleVelocity (0.0), scale (1.0), lastTargetScale (1.0f), lastTargetX (w->x ()), lastTargetY (w->y ()), tx (0.0), ty (0.0), delta (1.0), adjust (false), lastThumbOpacity (0.0) { CompositeWindowInterface::setHandler (cWindow, spScreen->state != ScaleScreen::Idle); GLWindowInterface::setHandler (gWindow, spScreen->state != ScaleScreen::Idle); } PrivateScaleWindow::~PrivateScaleWindow () { } CompOption::Vector & ScaleScreen::getOptions () { return priv->getOptions (); } bool ScaleScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } bool ScalePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) { CompPrivate p; p.uval = COMPIZ_SCALE_ABI; screen->storeValue ("scale_ABI", p); return true; } return false; } void ScalePluginVTable::fini () { screen->eraseValue ("scale_ABI"); } ./plugins/scale/images/0000755000004100000410000000000013246301623015260 5ustar www-datawww-data./plugins/scale/images/dnd-spinner-875.png0000644000004100000410000000451513246301623020535 0ustar www-datawww-dataPNG  IHDRddpTbKGD IDATxU_o kTe ͱVXfn5r\.Jj͟ jbcHr/"q ||k~Ϗs%DUk\AzEd3=LG:+z!p0I m(ATUj`?Nwt ֹ̹/mQ)2$^i'7HOw M;HI5OIY RDPtT- ;j2b!|8&G"r0C` qb:(pp67 %"s;5S8OI $qНxGD6$GiCR~gd… ӲCU+;-8o 4qX.";o>P l d ^` f E'AkKUmp|$9xHyBΏ 0>ୌݭrNF{[+ &Z'i[ t+ہm:3̌ږ>!ෆbʊf`=a愵KOE u9bX"ҫ sɄ'đЗNnp%qH608l/7^$=+{ɷKȹ,=Aws8y1i䀥 #qa:"rEl{Vx=w'9s,-AݓmdN;Nk2SߓPg8Ѹ$zȔQJfDײ8C@n߹VD$oG+g>PD%TKj7RU&њavqd58H7({b]pa?sʉ"l6~g$yF_M)X_S8]gEEEEEEEEEEřI']5Fj{w-7`igBU_/.`'x]DNX= z3l~("O$4$P8{D{wBӉ%<@tBҌQg~9~QQY{> PJwى2,Pձ5`!>_q)ioIA* =j'=ŎZ=5 Ε2uj3p* jߔ:jϧҪ=FO-W#N؀Oh.`C-Lޛ)Dce( բ2 _ȓ*-"X!RD61?~ Μ.IX^ja ˷7MB؄ Z=9<}1/67VTTTTTTTTTTTq]-lH5@,9mQqzn}M`>!01? /"ܶ:NTCkK٭sBp7($SٛhͮW?𸈼^Ab`׍UwȶvGUTˁGS^e#܋<ȋUuR&&{_Mi7%)Ee-A^v/ k%k"e~L`&UXFPKrxZ\MeRnuiLn5|cr#W9J8ONwIxgAK:cx{G^C/k3715gzv3za-5ZOHX%x|DV!Dx6%~'|NRGn 9[9i&Ka+?k)5U]6Pջ%? }:`"঄nƾy«+EĴ$ŗ0NBFUuyJoTOZ8.hBPSJ)w2T8wD\ Ij8h*Bn "oUݲm5ylL>cx0j>~I:/p$XBY# kR"{|fC'"|܅X;f}$aB! iiI)U1B6i#"'C_IXB%@['")y⏣[Ui–~V[(yꅿi<)A V[(Aj e0Ȫj2e%ζUh o2  pԍ$Cb՟vR DDZꎥ6J7o@N@iJg8{-!i,^J\(Ձ/t+IENDB`./plugins/scale/images/dnd-spinner-500.png0000644000004100000410000000450113246301623020511 0ustar www-datawww-dataPNG  IHDRddpTbKGDIDATx[Uu:LaZF[*VBSr}@)(&jA蓷EMc,H01K4$^(c%2JՙvkfN眵uf&9{^[ \\ zG!`x\DNU XҢg"󽊣2 Q1jg~U<[+`JP "֪IJU=xA1ܒ^JMKKt(:Br^Ieu*(-yE[\M  Cn`h׀t)+ Ubہ3Q`/xLD`.FE䅌6WduD$"2p 8bǁ-fy= QUM `w|ٽq`aGm'T_E4TBNe;A!zf Yܢ݃|Gl_mQ%yp/PH Ƥ>)f^Ҭr+ig{o7g~Q7+, U]E%rQ:D|JUh'Yd M 5 h `mS!QDʪ "e5X("eUՑ{q [ArfXZ("eUWennAT `gHYUa RV{gA]Qj;t;(=9HBwb%syRD^*ة""]DlB"x71A!&D ĊVĐK;hCNQ;Xz3Rf:ˇ眵:sAX+W"Vk&n̨?S >2G.H0[+:`/ai0p0$Ȥ|`N4&ٟf?AHUƁPwyu[p;VڞMDZc}(L~2 x2ޒPlcve@66~)Tu |(^O kUu5@fI[b`V vf)-ta5p1@ V7Ⅷ0).w)*XoUzpQ*S/;a<(*xF+)/qUz*B/UF 5z Ed\Usu#~ªZVɱAUVh ^3H]c | pGlޜ:; CW.Me3#6RU_m@F{Alg"n àkj ָ讂ȟIj$"kHy/ehیͭØXA8`XǁR/}ȣ}t1;$"w&K韇,Qy&H]KvIxBڜ r깳~ك'E~!%K1(}jlU~RKFzByxsR$XVOBvANO)B=3(pOS^jJ =Cϣ)TB!{m`M7!fO)p:!<^SB|`` ƨR(ae)}M3ݽs4i{眙{3s)r `l# d`EUIg"X[Ga '뀵"rܿUT&nn k ,0^PZU/jO;zLp']Mx+,>蠧 ݨ- vPQB R=JTtB<`N; < & ,hgԕD\^\EpCٞOUgWҸ '"/$]I ȟE m x_bǀkDdWb_Yc5s6 U^Ugڔ<]ڣw3T5yzdUnd*ˁeeje{g2s_F9 :@X9?QK[-,"G'UE_Xz-p]b}ZUcL!NO:U="HnyvF} 7ZLJp*!̯Z(ഄ&QU:C/>`),"EN{DFE {!5?+,q`XgjO#ZFDU =bgAx ؔ}R\Zj vH|| rYЍ3Z [ ?cfqLAFt(>:d)l53Ft>Ҥj-D.ݍI!1& hDdK!"f9jv0NDz\ ۀ2;ŷ3oB&mÉv 9@YMɿ&՛"T%~jXxϩ[PDM/{E ۛ^ x("ùuM&qӄ1p@gE-OBwUw%u,K/b,yktAU{ .F5a,{`]=Ę4C~>S#Biƨr!_hTuyGoPk*q_&VF]ӊqP p>fӱ  O]E!']LG8)2O]1QWQHQ"Sv\+^G}6O]|=ugu=S!8 Ur8'3)䅜V@%:6d*SBڊi`뾙FDX%*Lu=-2T&"a!^2DZT;O7WQnP9A5Ni/Z݂F87­O] \ 0 )zIv/ޫRV$ zds2[-_ǞܛpDJfC8'hj8{8jBO=$N*qaF* <-"Cژь>GFRDs7 ظ'E˼ױ'_F%O7G {F;+{} re,V*UQH/ UPȒ3e6PVWB^UL w n` iL/o'|nGUmˁc3ZDvNث󰗵h<1Ə&x2Esx}`ifG3Rեρkh UzzW@BdtU XKke=mn*y Z!z!e14,}lmشTNcV#ގ :m,"GfD9qyܛV9bw _R96n6N䪂 vr)$mWz9A*lr7#2y`^Xcޣ+=^4D_b,ϧPVG9z1C?ڔq؅oɼ!:jVsos3s~gU#^/sbvO%HoV҄E v |3o8,̒`oTa3;ef_ k^`})a3Da6/a9f?O!3,i+aZ=_[RUIF،v ;v[0~?).5Jj\r>ߊ +A#ǞW'㠙ݷNVR|~2~WVi^- O;e1UN8^ΰw|n3{*FLjpF` qtJo^2}tGAD2&՛RhI7<76[DGRsG,^I:Iu5$ؕܺIܾ]L0a65U ^FR➺(iWYJt xZ{*?m[8#|wG' p٪ A$>M브gCM~Hvi U ag6TNY\, t Lg~1e J"&]axҞ9|6Nf_QE JV-`jzoQAJQVU+iA= ۪ A=MmL҂Bѓ fXx ,KQVU(FpAMP)P^`I[Uh"Srm4Q`^iLg1:0B`m0v@* 0O3; {{ܝ`l3ÌLgLwAUbT&l^$8!0^o6'z^/b֏>ϸ1(&DM+QbpQ~x*FpBd`7e4NDu\H N(nxT*MJM[^AJ(az8͝i 2㘌s +AI1CE+iyss>?JMZ p:f ^;3rJ&u+3@)_Մ[yU5fvJ!B <\n׍i%\@ArN!e9o"b0&*Bž D1%M(*VTk-k̕v̜۽493o9sPBTup?: ^9?;-LGfVT&s&EGgEdo[Gi 5njgDd¿Uf6`7 ,0k3TUJ qߐF QW[h>h^RPQRG]- QUZB Q:Tuptc 00,"$ȣQW*rÄyG`#"m`J]U{5Jn9Pf^Ew mX |xbv`ؾtRS.CUo6Z7#O? uwgQFS}hIc.>zX.oD]&! F9 :4aHOU-,"uQOƞ=SbJ AB֪j%"  "?A l J=/&Ե x("ܮ\ 3 yx(2?&|X~&& 6o"UcDaDd V??-\Uy0. cDža9j ?+7 IRIY]*}xt[ [ |3ƜypY߈ xHv}LÐ 2oaG]nD'K*ML9ӣV\[Rd򪈼頧%ke ƺ`6]_R(aMS"r*is+"gVToPU]|bnA^H;άfDUN6h{\v֗">`dSn@D<&F߸ɫ 2g\|➺OUCXS?/PQQQQQQQQQQQ1L0'^ xms0p,'[/5MxPb̶ȹ$.3qF?9I8 Ј!~pe6!dJΞ؍A);1 DoQP2LUՔݟb~ v:Ҵ`c-]#̤ Eѳ2x O]eaGq X婫\zm.` n¢ 8SWY p>K9vUvz9q4?/׀tP8؉L5 LD&jQ0yg?ǣ P&{{[s/TTθmPMQZq]CpďS7 9-i[ ;i_vN[QQQQQQQQQQQqqa'V`|:c"YǢ xOOyR3[ !; 1 |'J,2XV=пZREre RnKT˙jjwPabzpv;%BX{HO"F|?ҤjLW 7帯)_ SzvAuZ9ϔ,ښV;!Y8p?&'ؚ9FxP|[ [{s&/  ,67 'OU_r 0yb5~S}̽w9%0s{Jv n`.0-8pD 02 MHi \ ,6>O0ʟD XB0d)(ATxOUuxp;|EUh oLfJb"ʅ2䂂ʅ2duB RJTup!0ƨC Ȱ0fy3J".L3 xAD0ݧS >y-t /[ }\,J$a0#K7!^vXx11o,zEdz*CDdql@7DUgf weCFx+p6c@8ܢr@ATu pelU}gEdؔW#O ^:OyVrQq:eѰm!"{VDv8^k3a"Q #.S2M(ka>e:"`}B.o]KcQ'K>07٘0~,:0z͘h٥ ~wHWxO Wmt-jl Å~9xӅw]-EtxLL7 ۏ>>Y0SIp1|j0 t3Ut =9ɋ-1f^@Gw"*5zk A =t#xx=_D괳Jrx 9"2O x2:: :U&SZ]Aqْ_vV:="Ә0b|c)!B&jr͞F\by 1nS%b4F] BTN Q#` !뱛  ٓ[Hg$͡u,p@DAʘM-~=Qפ"z~oΨF[:kֶNJ2KbMW |]O]ea%;ί1aE{rMO] ^1=opM>Z9Xmeog`Pb6{lE{]ZbZo3QBZT:̠dvч2 "oIZ CQv/UUR!hԍsP(UwLb*BE!#L(l;***********M7}v*M#Tk8ꩿ(s^ dms/7Ni?YHTu1՜YpP )%C<։v lHUL0zSK2HL,`IXZ蟁u)T |-EP~(?.l^#OD~jJlaV ?^A1nVZ>'Ҍ:rCUVfT#tz#AO^|%b q.7AG&]V,1oƼ)]E4$Gn4>PJeg _8J쫎kd=G?%7I)TZD"@-dn}3ZOC`~ML_7+E 1U)"Z׫? <&"/&g"?l%pI-M)"I5IrBRB8{ -hU݆_#"bQ'E(pwZ*AD3{D I) \ ÑĠӝo#"?*?Jg8½a/xwS?ax/Pҕ?MaIENDB`./plugins/scale/compiz-scale.pc.in0000644000004100000410000000042713246301623017335 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-scale Description: Scale plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl Libs: -L${libdir} -lscale Cflags: @COMPIZ_CFLAGS@ -I${includedir}/compiz./plugins/firepaint/0000755000004100000410000000000013246301623014705 5ustar www-datawww-data./plugins/firepaint/CMakeLists.txt0000644000004100000410000000015613246301623017447 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (firepaint PLUGINDEPS composite opengl) ./plugins/firepaint/src/0000755000004100000410000000000013246301623015474 5ustar www-datawww-data./plugins/firepaint/src/firepaint.cpp0000644000004100000410000004212613246301623020166 0ustar www-datawww-data/* * Compiz fire effect plugin * * firepaint.cpp * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "firepaint.h" COMPIZ_PLUGIN_20090315 (firepaint, FirePluginVTable); /* 3 vertices per triangle, 2 triangles per particle */ const unsigned short CACHESIZE_FACTOR = 3 * 2; /* 2 coordinates, x and y */ const unsigned short COORD_COMPONENTS = CACHESIZE_FACTOR * 2; /* each vertex is stored as 3 GLfloats */ const unsigned short VERTEX_COMPONENTS = CACHESIZE_FACTOR * 3; /* 4 colors, RGBA */ const unsigned short COLOR_COMPONENTS = CACHESIZE_FACTOR * 4; Particle::Particle () : life (0), fade (0), width (0), height (0), w_mod (0), h_mod (0), r (0), g (0), b (0), a (0), x (0), y (0), z (0), xi (0), yi (0), zi (0), xg (0), yg (0), zg (0), xo (0), yo (0), zo (0) { } ParticleSystem::ParticleSystem (int n) : x (0), y (0) { initParticles (n); } ParticleSystem::ParticleSystem () : slowdown (1.0f), tex (0), active (false), x (0), y (0), darken (0.0f), blendMode (0) { initParticles (0); } ParticleSystem::~ParticleSystem () { finiParticles (); } void ParticleSystem::initParticles (int f_numParticles) { particles.clear (); // Initialize cache vertices_cache.clear (); coords_cache.clear (); colors_cache.clear (); dcolors_cache.clear (); for (int i = 0; i < f_numParticles; ++i) { Particle p; p.life = 0.0f; particles.push_back (p); } } void ParticleSystem::drawParticles(const GLMatrix &transform) { int i, j, k, l; /* Check that the cache is big enough */ if (vertices_cache.size () < particles.size () * VERTEX_COMPONENTS) vertices_cache.resize (particles.size () * VERTEX_COMPONENTS); if (coords_cache.size () < particles.size () * COORD_COMPONENTS) coords_cache.resize (particles.size () * COORD_COMPONENTS); if (colors_cache.size () < particles.size () * COLOR_COMPONENTS) colors_cache.resize (particles.size () * COLOR_COMPONENTS); if (darken > 0) if (dcolors_cache.size () < particles.size () * COLOR_COMPONENTS) dcolors_cache.resize (particles.size () * COLOR_COMPONENTS); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); if (tex) { glBindTexture (GL_TEXTURE_2D, tex); glEnable (GL_TEXTURE_2D); } i = j = k = l = 0; GLfloat w, h; GLfloat xMinusW, xPlusW, yMinusH, yPlusH; GLushort r, g, b, a, dark_a; /* for each particle, use two triangles to display it */ foreach (Particle &part, particles) { if (part.life > 0.0f) { w = part.width / 2.0f; h = part.height / 2.0f; r = part.r * 65535.0f; g = part.g * 65535.0f; b = part.b * 65535.0f; a = part.life * part.a * 65535.0f; dark_a = part.life * part.a * 65535.0f * darken; w += w * part.w_mod * part.life; h += h * part.h_mod * part.life; xMinusW = part.x - w; xPlusW = part.x + w; yMinusH = part.y - h; yPlusH = part.y + h; //first triangle vertices_cache[i + 0] = xMinusW; vertices_cache[i + 1] = yMinusH; vertices_cache[i + 2] = part.z; vertices_cache[i + 3] = xMinusW; vertices_cache[i + 4] = yPlusH; vertices_cache[i + 5] = part.z; vertices_cache[i + 6] = xPlusW; vertices_cache[i + 7] = yPlusH; vertices_cache[i + 8] = part.z; //second triangle vertices_cache[i + 9] = xPlusW; vertices_cache[i + 10] = yPlusH; vertices_cache[i + 11] = part.z; vertices_cache[i + 12] = xPlusW; vertices_cache[i + 13] = yMinusH; vertices_cache[i + 14] = part.z; vertices_cache[i + 15] = xMinusW; vertices_cache[i + 16] = yMinusH; vertices_cache[i + 17] = part.z; i += 18; coords_cache[j + 0] = 0.0; coords_cache[j + 1] = 0.0; coords_cache[j + 2] = 0.0; coords_cache[j + 3] = 1.0; coords_cache[j + 4] = 1.0; coords_cache[j + 5] = 1.0; //second coords_cache[j + 6] = 1.0; coords_cache[j + 7] = 1.0; coords_cache[j + 8] = 1.0; coords_cache[j + 9] = 0.0; coords_cache[j + 10] = 0.0; coords_cache[j + 11] = 0.0; j += 12; colors_cache[k + 0] = r; colors_cache[k + 1] = g; colors_cache[k + 2] = b; colors_cache[k + 3] = a; colors_cache[k + 4] = r; colors_cache[k + 5] = g; colors_cache[k + 6] = b; colors_cache[k + 7] = a; colors_cache[k + 8] = r; colors_cache[k + 9] = g; colors_cache[k + 10] = b; colors_cache[k + 11] = a; //second colors_cache[k + 12] = r; colors_cache[k + 13] = g; colors_cache[k + 14] = b; colors_cache[k + 15] = a; colors_cache[k + 16] = r; colors_cache[k + 17] = g; colors_cache[k + 18] = b; colors_cache[k + 19] = a; colors_cache[k + 20] = r; colors_cache[k + 21] = g; colors_cache[k + 22] = b; colors_cache[k + 23] = a; k += 24; if (darken > 0) { dcolors_cache[l + 0] = r; dcolors_cache[l + 1] = g; dcolors_cache[l + 2] = b; dcolors_cache[l + 3] = dark_a; dcolors_cache[l + 4] = r; dcolors_cache[l + 5] = g; dcolors_cache[l + 6] = b; dcolors_cache[l + 7] = dark_a; dcolors_cache[l + 8] = r; dcolors_cache[l + 9] = g; dcolors_cache[l + 10] = b; dcolors_cache[l + 11] = dark_a; //second dcolors_cache[l + 12] = r; dcolors_cache[l + 13] = g; dcolors_cache[l + 14] = b; dcolors_cache[l + 15] = dark_a; dcolors_cache[l + 16] = r; dcolors_cache[l + 17] = g; dcolors_cache[l + 18] = b; dcolors_cache[l + 19] = dark_a; dcolors_cache[l + 20] = r; dcolors_cache[l + 21] = g; dcolors_cache[l + 22] = b; dcolors_cache[l + 23] = dark_a; l += 24; } } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); if (darken > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (l / 4, &dcolors_cache[0]); if (stream->end ()) stream->render (transform); } /* draw particles */ glBlendFunc (GL_SRC_ALPHA, blendMode); stream->begin (GL_TRIANGLES); stream->addVertices (i / 3, &vertices_cache[0]); stream->addTexCoords (0, j / 2, &coords_cache[0]); stream->addColors (k / 4, &colors_cache[0]); if (stream->end ()) stream->render (transform); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_TEXTURE_2D); /* only disable blending if it was disabled before */ if (!glBlendEnabled) glDisable (GL_BLEND); } void ParticleSystem::updateParticles (float time) { float speed = (time / 50.0); float f_slowdown = slowdown * (1 - MAX (0.99, time / 1000.0)) * 1000; active = false; foreach (Particle &part, particles) { if (part.life > 0.0f) { // move particle part.x += part.xi / f_slowdown; part.y += part.yi / f_slowdown; part.z += part.zi / f_slowdown; // modify speed part.xi += part.xg * speed; part.yi += part.yg * speed; part.zi += part.zg * speed; // modify life part.life -= part.fade * speed; active = true; } } } void ParticleSystem::finiParticles () { particles.clear (); if (tex) glDeleteTextures (1, &tex); } static void toggleFunctions (bool enabled) { FIRE_SCREEN (screen); screen->handleEventSetEnabled (fs, enabled); fs->cScreen->preparePaintSetEnabled (fs, enabled); fs->gScreen->glPaintOutputSetEnabled (fs, enabled); fs->cScreen->donePaintSetEnabled (fs, enabled); } void FireScreen::fireAddPoint (int x, int y, bool requireGrab) { if (!requireGrab || grabIndex) { XPoint p; p.x = x; p.y = y; points.push_back (p); toggleFunctions (true); } } bool FireScreen::addParticle (CompAction *action, CompAction::State state, CompOption::Vector options) { float x = CompOption::getFloatOptionNamed (options, "x", 0); float y = CompOption::getFloatOptionNamed (options, "y", 0); fireAddPoint (x, y, false); cScreen->damageScreen (); return true; } bool FireScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (screen->otherGrabExist (NULL)) return false; if (!grabIndex) grabIndex = screen->pushGrab (None, "firepaint"); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); fireAddPoint (pointerX, pointerY, true); return true; } bool FireScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (grabIndex) { screen->removeGrab (grabIndex, NULL); grabIndex = 0; } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } bool FireScreen::clear (CompAction *action, CompAction::State state, CompOption::Vector options) { points.clear (); return true; } void FireScreen::preparePaint (int time) { float bg = optionGetBgBrightness () / 100.0f; if (init && !points.empty ()) { ps.initParticles (optionGetNumParticles ()); init = false; glGenTextures (1, &ps.tex); glBindTexture (GL_TEXTURE_2D, ps.tex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, fireTex); glBindTexture (GL_TEXTURE_2D, 0); ps.slowdown = optionGetFireSlowdown (); ps.darken = 0.5f; /* TODO: Magic number */ ps.blendMode = GL_ONE; } if (!init) ps.updateParticles (time); if (!points.empty ()) { int rVal2; float rVal, size = 4; float fireLife = optionGetFireLife (); float fireWidth = optionGetFireSize (); float fireHeight = fireWidth * 1.5f; bool mystFire = optionGetFireMystical (); float max_new = MIN ((int) ps.particles.size (), (int) points.size () * 2) * ((float) time / 50.0f) * (1.05f - fireLife); for (unsigned int i = 0; i < ps.particles.size () && max_new > 0; ++i) { Particle &part = ps.particles.at (i); if (part.life <= 0.0f) { /* give gt new life */ rVal = (float) (random () & 0xff) / 255.0; part.life = 1.0f; /* Random Fade Value */ part.fade = (rVal * (1 - fireLife) + (0.2f * (1.01 - fireLife))); /* set size */ part.width = fireWidth; part.height = fireHeight; rVal = (float) (random () & 0xff) / 255.0; part.w_mod = size * rVal; part.h_mod = size * rVal; /* choose random position */ rVal2 = random () % points.size (); part.x = points.at (rVal2).x; part.y = points.at (rVal2).y; part.z = 0.0f; part.xo = part.x; part.yo = part.y; part.zo = part.z; /* set speed and direction */ rVal = (float) (random () & 0xff) / 255.0; part.xi = ( (rVal * 20.0) - 10.0f); rVal = (float) (random () & 0xff) / 255.0; part.yi = ( (rVal * 20.0) - 15.0f); part.zi = 0.0f; rVal = (float) (random () & 0xff) / 255.0; if (mystFire) { /* Random colors! (aka Mystical Fire) */ rVal = (float) (random () & 0xff) / 255.0; part.r = rVal; rVal = (float) (random () & 0xff) / 255.0; part.g = rVal; rVal = (float) (random () & 0xff) / 255.0; part.b = rVal; } else { part.r = optionGetFireColorRed () / 0xffff - (rVal / 1.7 * optionGetFireColorRed () / 0xffff); part.g = optionGetFireColorGreen () / 0xffff - (rVal / 1.7 * optionGetFireColorGreen () / 0xffff); part.b = optionGetFireColorBlue () / 0xffff - (rVal / 1.7 * optionGetFireColorBlue () / 0xffff); } /* set transparency */ part.a = (float) optionGetFireColorAlpha () / 0xffff; /* set gravity */ part.xg = (part.x < part.xo) ? 1.0 : -1.0; part.yg = -3.0f; part.zg = 0.0f; ps.active = true; max_new -= 1; } else part.xg = (part.x < part.xo) ? 1.0 : -1.0; } } if (points.size () && brightness != bg) { float div = 1.0 - bg; div *= (float) time / 500.0; brightness = MAX (bg, brightness - div); } if (points.empty () && brightness != 1.0) { float div = 1.0 - bg; div *= (float) time / 500.0; brightness = MIN (1.0, brightness + div); } if (!init && points.empty () && !ps.active) { ps.finiParticles (); init = true; } cScreen->preparePaint (time); } bool FireScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if ((!init && ps.active) || brightness < 1.0) { GLMatrix sTransform = transform; sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); if (brightness < 1.0) { /* cover the screen with a rectangle and darken it * (coded as two GL_TRIANGLES for GLES compatibility) */ GLfloat vertices[18]; GLushort colors[24]; vertices[0] = (GLfloat)output->region ()->extents.x1; vertices[1] = (GLfloat)output->region ()->extents.y1; vertices[2] = 0.0f; vertices[3] = (GLfloat)output->region ()->extents.x1; vertices[4] = (GLfloat)output->region ()->extents.y2; vertices[5] = 0.0f; vertices[6] = (GLfloat)output->region ()->extents.x2; vertices[7] = (GLfloat)output->region ()->extents.y2; vertices[8] = 0.0f; vertices[9] = (GLfloat)output->region ()->extents.x2; vertices[10] = (GLfloat)output->region ()->extents.y2; vertices[11] = 0.0f; vertices[12] = (GLfloat)output->region ()->extents.x2; vertices[13] = (GLfloat)output->region ()->extents.y1; vertices[14] = 0.0f; vertices[15] = (GLfloat)output->region ()->extents.x1; vertices[16] = (GLfloat)output->region ()->extents.y1; vertices[17] = 0.0f; for (int i = 0; i <= 5; ++i) { colors[i*4+0] = 0; colors[i*4+1] = 0; colors[i*4+2] = 0; colors[i*4+3] = (1.0 - brightness) * 65535.0f; } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); GLboolean glBlendEnabled = glIsEnabled (GL_BLEND); if (!glBlendEnabled) glEnable (GL_BLEND); stream->begin (GL_TRIANGLES); stream->addVertices (6, vertices); stream->addColors (6, colors); if (stream->end ()) stream->render (sTransform); /* only disable blending if it was already disabled */ if (!glBlendEnabled) glDisable (GL_BLEND); } if (!init && ps.active) ps.drawParticles (sTransform); } return status; } void FireScreen::donePaint () { if ( (!init && ps.active) || !points.empty () || brightness < 1.0) cScreen->damageScreen (); else toggleFunctions (false); cScreen->donePaint (); } void FireScreen::handleEvent (XEvent *event) { switch (event->type) { case MotionNotify: fireAddPoint (pointerX, pointerY, true); break; case EnterNotify: case LeaveNotify: fireAddPoint (pointerX, pointerY, true); break; default: break; } screen->handleEvent (event); } FireScreen::FireScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), init (true), brightness (1.0), grabIndex (0) { ScreenInterface::setHandler (screen, false); CompositeScreenInterface::setHandler (cScreen, false); GLScreenInterface::setHandler (gScreen, false); optionSetInitiateKeyInitiate (boost::bind (&FireScreen::initiate, this, _1, _2, _3)); optionSetInitiateButtonInitiate (boost::bind (&FireScreen::initiate, this, _1, _2, _3)); optionSetInitiateKeyTerminate (boost::bind (&FireScreen::terminate, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&FireScreen::terminate, this, _1, _2, _3)); optionSetClearKeyInitiate (boost::bind (&FireScreen::clear, this, _1, _2, _3)); optionSetClearButtonInitiate (boost::bind (&FireScreen::clear, this, _1, _2, _3)); optionSetAddParticleInitiate (boost::bind (&FireScreen::addParticle, this, _1, _2, _3)); } FireScreen::~FireScreen () { if (!init) ps.finiParticles (); } bool FirePluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/firepaint/src/firepaint_tex.h0000644000004100000410000004002113246301623020503 0ustar www-datawww-data/** * * Particle texture for Firepaint Plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ const unsigned char fireTex[4097] = { "\0\0\0\0\377\377\377\3\377\377\377\2\377\377\377\5\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\14\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\13\377\377" "\377\13\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\2\0\0\0\0\0" "\0\0\0\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377" "\6\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377" "\20\377\377\377\22\377\377\377\20\377\377\377\21\377\377\377\17\377\377\377" "\20\377\377\377\17\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\11\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\1\0\0\0\0\377\377\377\5\377\377\377\4\377\377\377\6\377\377" "\377\6\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\14\377\377" "\377\15\377\377\377\20\377\377\377\20\377\377\377\24\377\377\377\24\377\377" "\377\23\377\377\377\23\377\377\377\26\377\377\377\25\377\377\377\23\377\377" "\377\21\377\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377" "\377\15\377\377\377\15\377\377\377\11\377\377\377\11\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\30\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\33\377\377\377" "\31\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\25\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\7\377\377\377\6\377\377\377\12\377\377\377\11\377\377\377" "\14\377\377\377\15\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\32\377\377\377\35\377\377\377\34\377\377\377\34\377\377\377" "\36\377\377\377\40\377\377\377\36\377\377\377\34\377\377\377\34\377\377\377" "\34\377\377\377\32\377\377\377\31\377\377\377\26\377\377\377\25\377\377\377" "\22\377\377\377\16\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377!\377\377\377" "\"\377\377\377#\377\377\377#\377\377\377&\377\377\377&\377\377\377$\377\377" "\377#\377\377\377\40\377\377\377!\377\377\377\35\377\377\377\34\377\377\377" "\25\377\377\377\24\377\377\377\21\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "&\377\377\377,\377\377\377+\377\377\377,\377\377\377-\377\377\377-\377\377" "\377,\377\377\377+\377\377\377&\377\377\377)\377\377\377$\377\377\377\34" "\377\377\377\34\377\377\377\27\377\377\377\24\377\377\377\23\377\377\377" "\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\6\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\27\377\377\377\31\377\377\377\36\377\377\377!\377\377\377%\377\377\377(" "\377\377\3771\377\377\3772\377\377\3775\377\377\377;\377\377\377<\377\377" "\3779\377\377\3778\377\377\3773\377\377\3771\377\377\377-\377\377\377'\377" "\377\377\"\377\377\377\34\377\377\377\36\377\377\377\32\377\377\377\25\377" "\377\377\21\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377\7\377" "\377\377\13\377\377\377\14\377\377\377\17\377\377\377\21\377\377\377\31\377" "\377\377\31\377\377\377\35\377\377\377!\377\377\377'\377\377\377+\377\377" "\3771\377\377\377=\377\377\377E\377\377\377H\377\377\377M\377\377\377M\377" "\377\377J\377\377\377I\377\377\377A\377\377\377A\377\377\3778\377\377\377" ",\377\377\377%\377\377\377$\377\377\377\"\377\377\377\34\377\377\377\24\377" "\377\377\22\377\377\377\17\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\13\377\377\377\14\377\377\377\20\377\377\377\23\377\377\377\27\377" "\377\377\35\377\377\377$\377\377\377(\377\377\377.\377\377\3776\377\377\377" "=\377\377\377H\377\377\377W\377\377\377Y\377\377\377]\377\377\377a\377\377" "\377\\\377\377\377\\\377\377\377U\377\377\377O\377\377\377?\377\377\3774" "\377\377\377-\377\377\377+\377\377\377\40\377\377\377\32\377\377\377\27\377" "\377\377\23\377\377\377\22\377\377\377\15\377\377\377\11\377\377\377\13\377" "\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\377\377\377\30\377" "\377\377\37\377\377\377$\377\377\377.\377\377\3779\377\377\377?\377\377\377" "N\377\377\377X\377\377\377h\377\377\377r\377\377\377w\377\377\377|\377\377" "\377x\377\377\377p\377\377\377k\377\377\377\\\377\377\377J\377\377\377F\377" "\377\3779\377\377\377*\377\377\377$\377\377\377\36\377\377\377\30\377\377" "\377\25\377\377\377\24\377\377\377\20\377\377\377\14\377\377\377\12\377\377" "\377\15\377\377\377\17\377\377\377\22\377\377\377\27\377\377\377\34\377\377" "\377\40\377\377\377%\377\377\377.\377\377\377<\377\377\377M\377\377\377[" "\377\377\377l\377\377\377~\377\377\377\227\377\377\377\230\377\377\377\234" "\377\377\377\233\377\377\377\226\377\377\377\205\377\377\377i\377\377\377" "b\377\377\377P\377\377\3779\377\377\377-\377\377\377(\377\377\377!\377\377" "\377\35\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377\13\377\377" "\377\12\377\377\377\15\377\377\377\21\377\377\377\23\377\377\377\31\377\377" "\377\37\377\377\377!\377\377\377(\377\377\3774\377\377\377@\377\377\377Q" "\377\377\377g\377\377\377\200\377\377\377\231\377\377\377\254\377\377\377" "\275\377\377\377\310\377\377\377\304\377\377\377\264\377\377\377\227\377" "\377\377\212\377\377\377f\377\377\377Q\377\377\377B\377\377\377:\377\377" "\377/\377\377\377&\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\14\377\377\377\12\377\377\377\17\377\377\377\22\377\377\377" "\24\377\377\377\31\377\377\377\40\377\377\377&\377\377\377-\377\377\377:" "\377\377\377H\377\377\377X\377\377\377k\377\377\377\220\377\377\377\252\377" "\377\377\324\377\377\377\363\377\377\377\370\377\377\377\366\377\377\377" "\335\377\377\377\263\377\377\377\221\377\377\377w\377\377\377b\377\377\377" "P\377\377\377>\377\377\3770\377\377\377&\377\377\377\37\377\377\377\32\377" "\377\377\26\377\377\377\23\377\377\377\15\377\377\377\11\377\377\377\16\377" "\377\377\21\377\377\377\27\377\377\377\33\377\377\377\"\377\377\377(\377" "\377\377/\377\377\377<\377\377\377N\377\377\377b\377\377\377z\377\377\377" "\231\377\377\377\275\377\377\377\361\377\377\377\375\377\377\377\376\377" "\377\377\376\377\377\377\370\377\377\377\316\377\377\377\240\377\377\377" "\205\377\377\377b\377\377\377L\377\377\377<\377\377\377.\377\377\377&\377" "\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\15\377" "\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377\32\377" "\377\377\40\377\377\377$\377\377\377,\377\377\377:\377\377\377L\377\377\377" "`\377\377\377|\377\377\377\231\377\377\377\310\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\376\377\377\377\375\377\377\377\332\377" "\377\377\241\377\377\377\207\377\377\377f\377\377\377R\377\377\377@\377\377" "\3773\377\377\377+\377\377\377\"\377\377\377\35\377\377\377\30\377\377\377" "\24\377\377\377\17\377\377\377\14\377\377\377\16\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\40\377\377\377$\377\377\377,\377\377\377;" "\377\377\377N\377\377\377e\377\377\377\206\377\377\377\246\377\377\377\327" "\377\377\377\374\377\377\377\375\377\377\377\376\377\377\377\376\377\377" "\377\374\377\377\377\331\377\377\377\243\377\377\377\210\377\377\377b\377" "\377\377O\377\377\377>\377\377\377.\377\377\377&\377\377\377\40\377\377\377" "\33\377\377\377\27\377\377\377\22\377\377\377\15\377\377\377\12\377\377\377" "\16\377\377\377\22\377\377\377\23\377\377\377\32\377\377\377\40\377\377\377" "'\377\377\3770\377\377\377?\377\377\377U\377\377\377h\377\377\377\200\377" "\377\377\237\377\377\377\270\377\377\377\344\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\354\377\377\377\275\377\377\377\227\377" "\377\377\200\377\377\377e\377\377\377Q\377\377\377>\377\377\377.\377\377" "\377%\377\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377" "\377\15\377\377\377\11\377\377\377\17\377\377\377\22\377\377\377\25\377\377" "\377\31\377\377\377\"\377\377\377*\377\377\3773\377\377\377=\377\377\377" "J\377\377\377^\377\377\377o\377\377\377\211\377\377\377\235\377\377\377\271" "\377\377\377\327\377\377\377\342\377\377\377\335\377\377\377\302\377\377" "\377\240\377\377\377\216\377\377\377k\377\377\377X\377\377\377C\377\377\377" "9\377\377\377/\377\377\377&\377\377\377\"\377\377\377\33\377\377\377\26\377" "\377\377\22\377\377\377\14\377\377\377\12\377\377\377\15\377\377\377\22\377" "\377\377\31\377\377\377\35\377\377\377\37\377\377\377$\377\377\377,\377\377" "\3777\377\377\377A\377\377\377Q\377\377\377[\377\377\377p\377\377\377\212" "\377\377\377\231\377\377\377\242\377\377\377\253\377\377\377\251\377\377" "\377\236\377\377\377\215\377\377\377u\377\377\377b\377\377\377O\377\377\377" "<\377\377\3771\377\377\377)\377\377\377\"\377\377\377\34\377\377\377\32\377" "\377\377\27\377\377\377\21\377\377\377\16\377\377\377\12\377\377\377\17\377" "\377\377\21\377\377\377\20\377\377\377\27\377\377\377\37\377\377\377$\377" "\377\377&\377\377\377,\377\377\3778\377\377\377B\377\377\377R\377\377\377" "_\377\377\377k\377\377\377~\377\377\377\207\377\377\377\220\377\377\377\220" "\377\377\377\203\377\377\377q\377\377\377_\377\377\377V\377\377\377F\377" "\377\3777\377\377\377,\377\377\377%\377\377\377!\377\377\377\31\377\377\377" "\25\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377\11\377\377\377" "\12\377\377\377\16\377\377\377\22\377\377\377\27\377\377\377\33\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377/\377\377\3779\377\377\377E\377" "\377\377L\377\377\377^\377\377\377d\377\377\377e\377\377\377k\377\377\377" "l\377\377\377d\377\377\377a\377\377\377O\377\377\377C\377\377\377=\377\377" "\3770\377\377\377)\377\377\377$\377\377\377\35\377\377\377\30\377\377\377" "\25\377\377\377\22\377\377\377\16\377\377\377\12\377\377\377\13\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\21\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377$\377\377\377)\377\377\3771\377\377\3776\377" "\377\377@\377\377\377J\377\377\377N\377\377\377P\377\377\377S\377\377\377" "X\377\377\377P\377\377\377J\377\377\377E\377\377\3777\377\377\377,\377\377" "\377+\377\377\377%\377\377\377\40\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\21\377\377\377\14\377\377\377\11\377\377\377\12\377\377\377" "\13\377\377\377\11\377\377\377\14\377\377\377\21\377\377\377\23\377\377\377" "\27\377\377\377\33\377\377\377\37\377\377\377&\377\377\377(\377\377\377*" "\377\377\3774\377\377\3779\377\377\377<\377\377\377=\377\377\377C\377\377" "\377E\377\377\377?\377\377\3779\377\377\377:\377\377\377.\377\377\377(\377" "\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\24\377\377" "\377\21\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\22\377\377" "\377\25\377\377\377\30\377\377\377\33\377\377\377\"\377\377\377!\377\377" "\377%\377\377\377*\377\377\377-\377\377\3770\377\377\377/\377\377\3773\377" "\377\3772\377\377\3774\377\377\377-\377\377\377,\377\377\377*\377\377\377" "\"\377\377\377\37\377\377\377\32\377\377\377\33\377\377\377\27\377\377\377" "\21\377\377\377\17\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377" "\6\377\377\377\10\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\23\377\377\377\30\377\377\377\32\377\377\377" "\35\377\377\377\40\377\377\377!\377\377\377%\377\377\377(\377\377\377&\377" "\377\377)\377\377\377(\377\377\377+\377\377\377$\377\377\377!\377\377\377" "#\377\377\377\36\377\377\377\30\377\377\377\30\377\377\377\24\377\377\377" "\22\377\377\377\20\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\23\377\377\377" "\26\377\377\377\31\377\377\377\33\377\377\377\34\377\377\377!\377\377\377" "\40\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377&\377\377\377\36" "\377\377\377\35\377\377\377\35\377\377\377\34\377\377\377\26\377\377\377" "\24\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\7\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6" "\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\16\377\377\377\21\377\377\377\22\377\377\377\26\377\377\377\26\377\377\377" "\30\377\377\377\33\377\377\377\32\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\37\377\377\377\31\377\377\377\31\377\377\377\27\377\377\377" "\30\377\377\377\21\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\13" "\377\377\377\11\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\22\377\377\377\30\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\6\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\10\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\20\377\377\377" "\23\377\377\377\21\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\15\377\377\377\12\377\377\377\11\377\377\377\12\377\377\377\7\377\377\377" "\6\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\1\377\377\377\1" "\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377\7\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\13\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377\16\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\3\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\377\377\377\2\377\377\377\4\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\13\377\377\377\13\377\377" "\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\15\377\377" "\377\13\377\377\377\14\377\377\377\11\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\6\377\377" "\377\7\377\377\377\4\377\377\377\5\377\377\377\3\377\377\377\1\0\0\0\0\0" "\0\0\0" }; ./plugins/firepaint/src/firepaint.h0000644000004100000410000001025413246301623017630 0ustar www-datawww-data/* * Compiz fire effect plugin * * firepaint.h * * Copyright : (C) 2007 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 by Sam Spilsbury * E-mail : smspillaz@gmail.com * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "firepaint_options.h" #include "firepaint_tex.h" extern const unsigned short CACHESIZE_FACTOR; extern const unsigned short COORD_COMPONENTS; extern const unsigned short VERTEX_COMPONENTS; extern const unsigned short COLOR_COMPONENTS; /* ===================== Particle engine ========================= */ class Particle { public: Particle (); float life; /* particle life */ float fade; /* fade speed */ float width; /* particle width */ float height; /* particle height */ float w_mod; /* particle size modification during life */ float h_mod; /* particle size modification during life */ float r; /* red value */ float g; /* green value */ float b; /* blue value */ float a; /* alpha value */ float x; /* X position */ float y; /* Y position */ float z; /* Z position */ float xi; /* X direction */ float yi; /* Y direction */ float zi; /* Z direction */ float xg; /* X gravity */ float yg; /* Y gravity */ float zg; /* Z gravity */ float xo; /* orginal X position */ float yo; /* orginal Y position */ float zo; /* orginal Z position */ }; class ParticleSystem { public: ParticleSystem (int); ParticleSystem (); ~ParticleSystem (); std::vector particles; float slowdown; GLuint tex; bool active; int x; int y; float darken; GLuint blendMode; /* Cache used in drawParticles It's here to avoid multiple mem allocation during drawing */ std::vector vertices_cache; std::vector coords_cache; std::vector colors_cache; std::vector dcolors_cache; void initParticles (int f_numParticles); void drawParticles (const GLMatrix &transform); void updateParticles (float time); void finiParticles (); }; class FireScreen: public PluginClassHandler , public FirepaintOptions, public ScreenInterface, public GLScreenInterface, public CompositeScreenInterface { public: FireScreen (CompScreen *); ~FireScreen (); CompositeScreen *cScreen; GLScreen *gScreen; ParticleSystem ps; bool init; std::vector points; float brightness; float saturation; CompScreen::GrabHandle grabIndex; void handleEvent (XEvent *); void preparePaint (int ); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void fireAddPoint (int x, int y, bool requireGrab); bool addParticle (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiate (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminate (CompAction *action, CompAction::State state, CompOption::Vector options); bool clear (CompAction *action, CompAction::State state, CompOption::Vector options); }; #define FIRE_SCREEN(s) \ FireScreen *fs = FireScreen::get (s) class FirePluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/firepaint/firepaint.xml.in0000644000004100000410000000632513246301623020023 0ustar www-datawww-data <_short>Firepaint <_long>Paint fire particles with a specific or random color onto the screen opengl composite opengl decor Effects <_short>General <_short>Particle Settings ./plugins/wall/0000755000004100000410000000000013246301624013664 5ustar www-datawww-data./plugins/wall/CMakeLists.txt0000644000004100000410000000060313246301623016422 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include (CompizDefaults) if (NOT COMPIZ_DISABLE_PLUGIN_WALL) add_subdirectory (src/offset_movement) include_directories (src/offset_movement/include) endif (NOT COMPIZ_DISABLE_PLUGIN_WALL) compiz_plugin (wall PLUGINDEPS composite opengl mousepoll PKGDEPS cairo cairo-xlib-xrender LIBRARIES compiz_wall_offset_movement dl) ./plugins/wall/src/0000755000004100000410000000000013246301624014453 5ustar www-datawww-data./plugins/wall/src/wall.cpp0000644000004100000410000012375513246301623016132 0ustar www-datawww-data/** * * Compiz wall plugin * * wall.cpp * * Copyright (c) 2006 Robert Carr * 2011 Linaro Limited * * Authors: * Robert Carr * Dennis Kasprzyk * Travis Watkins * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include #include #include #include "wall.h" static const double PI = 3.14159265359f; static const unsigned short VIEWPORT_SWITCHER_SIZE = 100; static const unsigned short ARROW_SIZE = 33; #define getColorRGBA(name) \ r = optionGet##name##Red() / 65535.0f;\ g = optionGet##name##Green() / 65535.0f; \ b = optionGet##name##Blue() / 65535.0f; \ a = optionGet##name##Alpha() / 65535.0f #define sigmoid(x) (1.0f / (1.0f + exp (-5.5f * 2 * ((x) - 0.5)))) #define sigmoidProgress(x) ((sigmoid (x) - sigmoid (0)) / \ (sigmoid (1) - sigmoid (0))) COMPIZ_PLUGIN_20090315 (wall, WallPluginVTable); void WallScreen::clearCairoLayer (cairo_t *cr) { cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); } void WallScreen::drawSwitcherBackground () { cairo_t *cr; cairo_pattern_t *pattern; float outline = 2.0f; int width, height, radius; float r, g, b, a; destroyCairoContext (switcherContext); setupCairoContext (switcherContext); cr = switcherContext.cr; clearCairoLayer (cr); width = switcherContext.width - outline; height = switcherContext.height - outline; cairo_save (cr); cairo_translate (cr, outline / 2.0f, outline / 2.0f); /* set the pattern for the switcher's background */ pattern = cairo_pattern_create_linear (0, 0, width, height); getColorRGBA (BackgroundGradientBaseColor); cairo_pattern_add_color_stop_rgba (pattern, 0.00f, r, g, b, a); getColorRGBA (BackgroundGradientHighlightColor); cairo_pattern_add_color_stop_rgba (pattern, 0.65f, r, g, b, a); getColorRGBA (BackgroundGradientShadowColor); cairo_pattern_add_color_stop_rgba (pattern, 0.85f, r, g, b, a); cairo_set_source (cr, pattern); /* draw the border's shape */ radius = optionGetEdgeRadius (); if (radius) { cairo_arc (cr, radius, radius, radius, PI, 1.5f * PI); cairo_arc (cr, radius + width - 2 * radius, radius, radius, 1.5f * PI, 2.0 * PI); cairo_arc (cr, width - radius, height - radius, radius, 0, PI / 2.0f); cairo_arc (cr, radius, height - radius, radius, PI / 2.0f, PI); } else { cairo_rectangle (cr, 0, 0, width, height); } cairo_close_path (cr); /* apply pattern to background... */ cairo_fill_preserve (cr); /* ... and draw an outline */ cairo_set_line_width (cr, outline); getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); cairo_save (cr); for (unsigned int i = 0; i < (unsigned int) screen->vpSize ().height (); i++) { cairo_translate (cr, 0.0, viewportBorder); cairo_save (cr); for (unsigned int j = 0; j < (unsigned int) screen->vpSize ().width (); j++) { cairo_translate (cr, viewportBorder, 0.0); /* this cuts a hole into our background */ cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); cairo_rectangle (cr, 0, 0, viewportWidth, viewportHeight); cairo_fill_preserve (cr); cairo_set_operator (cr, CAIRO_OPERATOR_XOR); cairo_fill (cr); cairo_translate (cr, viewportWidth, 0.0); } cairo_restore(cr); cairo_translate (cr, 0.0, viewportHeight); } cairo_restore (cr); } void WallScreen::drawThumb () { cairo_t *cr; cairo_pattern_t *pattern; float r, g, b, a; float outline = 2.0f; int width, height; destroyCairoContext (thumbContext); setupCairoContext (thumbContext); cr = thumbContext.cr; clearCairoLayer (cr); width = thumbContext.width - outline; height = thumbContext.height - outline; cairo_translate (cr, outline / 2.0f, outline / 2.0f); pattern = cairo_pattern_create_linear (0, 0, width, height); getColorRGBA (ThumbGradientBaseColor); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); getColorRGBA (ThumbGradientHighlightColor); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* apply the pattern for thumb background */ cairo_set_source (cr, pattern); cairo_rectangle (cr, 0, 0, width, height); cairo_fill_preserve (cr); cairo_set_line_width (cr, outline); getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); } void WallScreen::drawHighlight () { cairo_t *cr; cairo_pattern_t *pattern; int width, height; float r, g, b, a; float outline = 2.0f; destroyCairoContext (highlightContext); setupCairoContext (highlightContext); cr = highlightContext.cr; clearCairoLayer (cr); width = highlightContext.width - outline; height = highlightContext.height - outline; cairo_translate (cr, outline / 2.0f, outline / 2.0f); pattern = cairo_pattern_create_linear (0, 0, width, height); getColorRGBA (ThumbHighlightGradientBaseColor); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); getColorRGBA (ThumbHighlightGradientShadowColor); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* apply the pattern for thumb background */ cairo_set_source (cr, pattern); cairo_rectangle (cr, 0, 0, width, height); cairo_fill_preserve (cr); cairo_set_line_width (cr, outline); getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_stroke (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); } void WallScreen::drawArrow () { cairo_t *cr; float outline = 2.0f; float r, g, b, a; destroyCairoContext (arrowContext); setupCairoContext (arrowContext); cr = arrowContext.cr; clearCairoLayer (cr); cairo_translate (cr, outline / 2.0f, outline / 2.0f); /* apply the pattern for thumb background */ cairo_set_line_width (cr, outline); /* draw top part of the arrow */ getColorRGBA (ArrowBaseColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_move_to (cr, 15, 0); cairo_line_to (cr, 30, 30); cairo_line_to (cr, 15, 24.5); cairo_line_to (cr, 15, 0); cairo_fill (cr); /* draw bottom part of the arrow */ getColorRGBA (ArrowShadowColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_move_to (cr, 15, 0); cairo_line_to (cr, 0, 30); cairo_line_to (cr, 15, 24.5); cairo_line_to (cr, 15, 0); cairo_fill (cr); /* draw the arrow outline */ getColorRGBA (OutlineColor); cairo_set_source_rgba (cr, r, g, b, a); cairo_move_to (cr, 15, 0); cairo_line_to (cr, 30, 30); cairo_line_to (cr, 15, 24.5); cairo_line_to (cr, 0, 30); cairo_line_to (cr, 15, 0); cairo_stroke (cr); cairo_restore (cr); } void WallScreen::setupCairoContext (WallCairoContext &context) { XRenderPictFormat *format; Screen *xScreen; int width, height; xScreen = ScreenOfDisplay (screen->dpy (), screen->screenNum ()); width = context.width; height = context.height; format = XRenderFindStandardFormat (screen->dpy (), PictStandardARGB32); context.pixmap = XCreatePixmap (screen->dpy (), screen->root (), width, height, 32); context.texture = GLTexture::bindPixmapToTexture (context.pixmap, width, height, 32); if (context.texture.empty ()) { screen->logMessage ("wall", CompLogLevelError, "Couldn't create cairo context for switcher"); } context.surface = cairo_xlib_surface_create_with_xrender_format (screen->dpy (), context.pixmap, xScreen, format, width, height); context.cr = cairo_create (context.surface); clearCairoLayer (context.cr); } void WallScreen::destroyCairoContext (WallCairoContext &context) { if (context.cr) cairo_destroy (context.cr); if (context.surface) cairo_surface_destroy (context.surface); context.texture.clear (); if (context.pixmap) XFreePixmap (screen->dpy (), context.pixmap); } bool WallScreen::checkDestination (unsigned int destX, unsigned int destY) { CompPoint point; CompSize size; point = screen->vp (); size = screen->vpSize (); if (point.x () - destX >= (unsigned int) size.width ()) return false; if (point.y () - destY >= (unsigned int) size.height ()) return false; return true; } void WallScreen::releaseMoveWindow () { moveWindow = 0; } void WallScreen::computeTranslation (float &x, float &y) { float elapsed, duration; duration = optionGetSlideDuration () * 1000.0; if (duration != 0.0) elapsed = 1.0 - (timer / duration); else elapsed = 1.0; if (elapsed < 0.0) elapsed = 0.0; if (elapsed > 1.0) elapsed = 1.0; /* Use temporary variables to you can pass in &ps->cur_x */ x = (gotoX - curPosX) * elapsed + curPosX; y = (gotoY - curPosY) * elapsed + curPosY; } /* movement remainder that gets ignored for direction calculation */ static const float IGNORE_REMAINDER = 0.05f; void WallScreen::determineMovementAngle () { int angle; float dx, dy; dx = gotoX - curPosX; dy = gotoY - curPosY; if (dy > IGNORE_REMAINDER) angle = (dx > IGNORE_REMAINDER) ? 135 : (dx < -IGNORE_REMAINDER) ? 225 : 180; else if (dy < -IGNORE_REMAINDER) angle = (dx > IGNORE_REMAINDER) ? 45 : (dx < -IGNORE_REMAINDER) ? 315 : 0; else angle = (dx > IGNORE_REMAINDER) ? 90 : (dx < -IGNORE_REMAINDER) ? 270 : -1; direction = angle; } bool WallScreen::moveViewport (int x, int y, Window moveWin) { CompOption::Vector o(0); if (!x && !y) return false; if (screen->otherGrabExist ("move", "switcher", "group-drag", "wall", 0)) return false; if (!checkDestination (x, y)) return false; if (moveWindow != moveWin) { CompWindow *w; releaseMoveWindow (); w = screen->findWindow (moveWin); if (w) { if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { if (!(w->state () & CompWindowStateStickyMask)) { moveWindow = w->id (); moveWindowX = w->x (); moveWindowY = w->y (); w->raise (); } } } } if (!moving) { curPosX = screen->vp ().x (); curPosY = screen->vp ().y (); } gotoX = screen->vp ().x () - x; gotoY = screen->vp ().y () - y; determineMovementAngle (); screen->handleCompizEvent ("wall", "start_viewport_switch", o); if (!grabIndex) grabIndex = screen->pushGrab (screen->invisibleCursor (), "wall"); screen->moveViewport (x, y, true); moving = true; focusDefault = true; boxOutputDevice = screen->outputDeviceForPoint (pointerX, pointerY); if (optionGetShowSwitcher ()) boxTimeout = optionGetPreviewTimeout () * 1000; else boxTimeout = 0; timer = optionGetSlideDuration () * 1000; cScreen->damageScreen (); return true; } void WallScreen::handleEvent (XEvent *event) { switch (event->type) { case ClientMessage: if (event->xclient.message_type == Atoms::desktopViewport) { int dx, dy; if (screen->otherGrabExist ("switcher", "wall", 0)) break; dx = event->xclient.data.l[0] / screen->width(); dx -= screen->vp ().x (); dy = event->xclient.data.l[1] / screen->height(); dy -= screen->vp ().y (); if (!dx && !dy) break; moveViewport (-dx, -dy, None); } break; case FocusIn: case FocusOut: /* Edges on when grabbed */ if (!optionGetEdgeflipPointer ()) { if (event->xfocus.mode == NotifyGrab) toggleEdges (true); else if (event->xfocus.mode == NotifyUngrab) toggleEdges (false); } case ConfigureNotify: break; default: break; } screen->handleEvent (event); } /* * When a dnd type window is mapped toggle edge flip dnd windows back on * _NET_WM_WINDOW_TYPE_DND windows. This will not detect all dnd windows * but it will detect the EWMH-compliant ones without resorting to * hacks involving selection stealing. */ void WallWindow::windowNotify (CompWindowNotify n) { WallScreen *ws = WallScreen::get (screen); bool toggleOnDnd = ws->optionGetEdgeflipDnd (); switch (n) { case CompWindowNotifyMap: if (window->type () & CompWindowTypeDndMask && toggleOnDnd) ws->toggleEdges (true); break; case CompWindowNotifyUnmap: if (window->type () & CompWindowTypeDndMask && toggleOnDnd) ws->toggleEdges (false); break; default: break; } window->windowNotify (n); } void WallWindow::activate () { WALL_SCREEN (screen); if (window->placed () && !screen->otherGrabExist ("wall", "switcher", 0)) { int dx, dy; CompPoint viewport = screen->vp (); if (ws->optionGetAutoSwitchVpAndWindow () || window->defaultViewport () != viewport) screen->viewportForGeometry (window->geometry (), viewport); dx = viewport.x (); dy = viewport.y (); /* Handle negative value */ dx = (unsigned int) dx % screen->vpSize ().width (); dy = (unsigned int) dy % screen->vpSize ().height (); dx -= screen->vp ().x (); dy -= screen->vp ().y (); if (dx || dy) { XWindowChanges xwc; unsigned int mask = 0; /* If changing viewports fails we should not * move the client window */ if (!ws->moveViewport (-dx, -dy, false)) { window->activate (); return; } if (ws->optionGetAutoSwitchVpAndWindow ()) { ws->focusDefault = false; CompRegion screenRegion; foreach (const CompOutput &o, screen->outputDevs ()) screenRegion += o.workArea (); CompPoint d = compiz::wall::movementWindowOnScreen (window->serverBorderRect (), screenRegion); mask |= d.x () !=0 ? CWX : 0; mask |= d.y () !=0 ? CWY : 0; xwc.x = window->serverGeometry ().x () + d.x (); xwc.y = window->serverGeometry ().y () + d.y (); window->configureXWindow (mask, &xwc); } } } window->activate (); } void WallWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { if (mask & (CompWindowGrabMoveMask | CompWindowGrabButtonMask)) WallScreen::get (screen)->windowIsDragMoved = true; window->grabNotify (x, y, state, mask); } void WallWindow::ungrabNotify () { WallScreen::get (screen)->windowIsDragMoved = false; window->ungrabNotify (); } void WallScreen::checkAmount (int dx, int dy, int &amountX, int &amountY) { CompPoint point; CompSize size; point = screen->vp (); size = screen->vpSize (); amountX = -dx; amountY = -dy; if (optionGetAllowWraparound ()) { if ((point.x () + dx) < 0) amountX = -(size.width () + dx); else if ((point.x () + dx) >= size.width ()) amountX = size.width () - dx; if ((point.y () + dy) < 0) amountY = -(size.height () + dy); else if ((point.y () + dy) >= size.height ()) amountY = size.height () - dy; } } bool WallScreen::initiate (CompAction *action, CompAction::State state, CompOption::Vector &options, Direction dir, bool withWin) { int dx = 0, dy = 0, amountX, amountY; unsigned int vpX, vpY; CompSize size; Window win = None; vpX = screen->vp ().x (); vpY = screen->vp ().y (); size = screen->vpSize (); switch (dir) { case Up: dy = -1; checkAmount (dx, dy, amountX, amountY); break; case Down: dy = 1; checkAmount (dx, dy, amountX, amountY); break; case Left: dx = -1; checkAmount (dx, dy, amountX, amountY); break; case Right: dx = 1; checkAmount (dx, dy, amountX, amountY); break; case Next: if ((vpX == (unsigned int) size.width () - 1) && (vpY == (unsigned int) size.height () - 1)) { amountX = size.width () - 1; amountY = size.height () - 1; } else if (vpX == (unsigned int) size.width () - 1) { amountX = size.width () - 1; amountY = -1; } else { amountX = -1; amountY = 0; } break; case Prev: if (vpX == 0 && vpY == 0) { amountX = -(size.width () - 1); amountY = -(size.height () - 1); } else if (vpX == 0) { amountX = -(size.width () - 1); amountY = 1; } else { amountX = 1; amountY = 0; } break; } if (withWin) win = CompOption::getIntOptionNamed (options, "window", 0); if (!moveViewport (amountX, amountY, win)) return true; if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); showPreview = optionGetShowSwitcher (); return true; } bool WallScreen::terminate (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (showPreview) { showPreview = false; cScreen->damageScreen (); } if (action) action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } bool WallScreen::initiateFlip (Direction direction, CompAction::State state) { CompOption::Vector o (0); int dx, dy; int amountX, amountY; const bool allowFlipDnd = (state & CompAction::StateInitEdgeDnd) && optionGetEdgeflipDnd (); const bool allowFlipMove = (windowIsDragMoved && optionGetEdgeflipMove ()); const bool allowFlipPointer = optionGetEdgeflipPointer (); if (!allowFlipDnd && !allowFlipMove && !allowFlipPointer) return false; switch (direction) { case Left: dx = -1; dy = 0; break; case Right: dx = 1; dy = 0; break; case Up: dx = 0; dy = -1; break; case Down: dx = 0; dy = 1; break; default: dx = 0; dy = 0; break; } checkAmount (dx, dy, amountX, amountY); if (moveViewport (amountX, amountY, None)) { int offsetX, offsetY; int warpX, warpY; if (dx < 0) { offsetX = screen->width () - 1; warpX = pointerX + screen->width (); } else if (dx > 0) { offsetX = 1- screen->width (); warpX = pointerX - screen->width (); } else { offsetX = 0; warpX = lastPointerX; } if (dy < 0) { offsetY = screen->height () - 1; warpY = pointerY + screen->height (); } else if (dy > 0) { offsetY = 1- screen->height (); warpY = pointerY - screen->height (); } else { offsetY = 0; warpY = lastPointerY; } screen->warpPointer (offsetX, offsetY); lastPointerX = warpX; lastPointerY = warpY; } return true; } inline void wallDrawQuad (const GLMatrix &transform, GLTexture::Matrix *matrix, BOX *box) { GLfloat textureData[8]; GLfloat vertexData[12]; GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLE_STRIP); textureData[0] = COMP_TEX_COORD_X (*matrix, box->x1); textureData[1] = COMP_TEX_COORD_Y (*matrix, box->y2); textureData[2] = COMP_TEX_COORD_X (*matrix, box->x2); textureData[3] = COMP_TEX_COORD_Y (*matrix, box->y2); textureData[4] = COMP_TEX_COORD_X (*matrix, box->x1); textureData[5] = COMP_TEX_COORD_Y (*matrix, box->y1); textureData[6] = COMP_TEX_COORD_X (*matrix, box->x2); textureData[7] = COMP_TEX_COORD_Y (*matrix, box->y1); vertexData[0] = box->x1; vertexData[1] = box->y2; vertexData[2] = 0; vertexData[3] = box->x2; vertexData[4] = box->y2; vertexData[5] = 0; vertexData[6] = box->x1; vertexData[7] = box->y1; vertexData[8] = 0; vertexData[9] = box->x2; vertexData[10] = box->y1; vertexData[11] = 0; streamingBuffer->addTexCoords (0, 4, textureData); streamingBuffer->addVertices (4, vertexData); streamingBuffer->end (); streamingBuffer->render (transform); } void WallScreen::drawCairoTextureOnScreen (const GLMatrix &transform) { float centerX, centerY; float width, height; float topLeftX, topLeftY; float border; GLTexture::Matrix matrix; BOX box; GLMatrix wTransform (transform); GLVertexBuffer *gl = GLVertexBuffer::streamingBuffer (); CompOutput::vector &outputDevs = screen->outputDevs (); CompOutput output = outputDevs[boxOutputDevice]; glEnable (GL_BLEND); centerX = output.x1 () + (output.width () / 2.0f); centerY = output.y1 () + (output.height () / 2.0f); border = (float) viewportBorder; width = (float) switcherContext.width; height = (float) switcherContext.height; topLeftX = centerX - floor (width / 2.0f); topLeftY = centerY - floor (height / 2.0f); firstViewportX = topLeftX + border; firstViewportY = topLeftY + border; if (!moving) { double left, timeout; timeout = optionGetPreviewTimeout () * 1000.0f; left = (timeout > 0) ? (float) boxTimeout / timeout : 1.0f; if (left < 0) left = 0.0f; else if (left > 0.5) left = 1.0f; else left = 2 * left; #ifndef USE_GLES glScreen->setTexEnvMode (GL_MODULATE); #endif gl->color4f (left, left, left, left); wTransform.translate (0.0f, 0.0f, -(1 - left)); mSzCamera = -(1 - left); } else { mSzCamera = 0.0f; } /* draw background */ matrix = switcherContext.texture[0]->matrix (); matrix.x0 -= topLeftX * matrix.xx; matrix.y0 -= topLeftY * matrix.yy; box.x1 = topLeftX; box.x2 = box.x1 + width; box.y1 = topLeftY; box.y2 = box.y1 + height; switcherContext.texture[0]->enable (GLTexture::Fast); wallDrawQuad (wTransform, &matrix, &box); switcherContext.texture[0]->disable (); /* draw thumb */ width = (float) thumbContext.width; height = (float) thumbContext.height; thumbContext.texture[0]->enable (GLTexture::Fast); for (unsigned int i = 0; i < (unsigned int) screen->vpSize ().width (); i++) { for (unsigned int j = 0; j < (unsigned int) screen->vpSize ().height (); j++) { if (i == gotoX && j == gotoY && moving) continue; box.x1 = i * (width + border); box.x1 += topLeftX + border; box.x2 = box.x1 + width; box.y1 = j * (height + border); box.y1 += topLeftY + border; box.y2 = box.y1 + height; matrix = thumbContext.texture[0]->matrix (); matrix.x0 -= box.x1 * matrix.xx; matrix.y0 -= box.y1 * matrix.yy; wallDrawQuad (wTransform, &matrix, &box); } } thumbContext.texture[0]->disable (); if (moving || showPreview) { /* draw highlight */ box.x1 = screen->vp ().x () * (width + border) + topLeftX + border; box.x2 = box.x1 + width; box.y1 = screen->vp ().y () * (height + border) + topLeftY + border; box.y2 = box.y1 + height; matrix = highlightContext.texture[0]->matrix (); matrix.x0 -= box.x1 * matrix.xx; matrix.y0 -= box.y1 * matrix.yy; highlightContext.texture[0]->enable (GLTexture::Fast); wallDrawQuad (wTransform, &matrix, &box); highlightContext.texture[0]->disable (); /* draw arrow */ if (direction >= 0) { arrowContext.texture[0]->enable (GLTexture::Fast); int aW = arrowContext.width; int aH = arrowContext.height; /* if we have a viewport preview we just paint the arrow outside the switcher */ if (optionGetMiniscreen ()) { width = (float) switcherContext.width; height = (float) switcherContext.height; switch (direction) { /* top left */ case 315: box.x1 = topLeftX - aW - border; box.y1 = topLeftY - aH - border; break; /* up */ case 0: box.x1 = topLeftX + width / 2.0f - aW / 2.0f; box.y1 = topLeftY - aH - border; break; /* top right */ case 45: box.x1 = topLeftX + width + border; box.y1 = topLeftY - aH - border; break; /* right */ case 90: box.x1 = topLeftX + width + border; box.y1 = topLeftY + height / 2.0f - aH / 2.0f; break; /* bottom right */ case 135: box.x1 = topLeftX + width + border; box.y1 = topLeftY + height + border; break; /* down */ case 180: box.x1 = topLeftX + width / 2.0f - aW / 2.0f; box.y1 = topLeftY + height + border; break; /* bottom left */ case 225: box.x1 = topLeftX - aW - border; box.y1 = topLeftY + height + border; break; /* left */ case 270: box.x1 = topLeftX - aW - border; box.y1 = topLeftY + height / 2.0f - aH / 2.0f; break; default: break; } } else { /* arrow is visible (no preview is painted over it) */ box.x1 = screen->vp().x() * (width + border) + topLeftX + border; box.x1 += width / 2 - aW / 2; box.y1 = screen->vp().y() * (height + border) + topLeftY + border; box.y1 += height / 2 - aH / 2; } box.x2 = box.x1 + aW; box.y2 = box.y1 + aH; wTransform.translate (box.x1 + aW / 2, box.y1 + aH / 2, 0.0f); wTransform.rotate (direction, 0.0f, 0.0f, 1.0f); wTransform.translate (-box.x1 - aW / 2, -box.y1 - aH / 2, 0.0f); matrix = arrowContext.texture[0]->matrix (); matrix.x0 -= box.x1 * matrix.xx; matrix.y0 -= box.y1 * matrix.yy; wallDrawQuad (wTransform, &matrix, &box); arrowContext.texture[0]->disable (); } } glDisable (GL_BLEND); #ifndef USE_GLES glScreen->setTexEnvMode (GL_REPLACE); #endif gl->colorDefault (); } void WallScreen::paint (CompOutput::ptrList& outputs, unsigned int mask) { if (moving && outputs.size () > 1 && optionGetMmmode() == MmmodeSwitchAll) { outputs.clear (); outputs.push_back (&screen->fullscreenOutput ()); } cScreen->paint (outputs, mask); } bool WallScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool status; transform = NoTransformation; if (moving) mask |= PAINT_SCREEN_TRANSFORMED_MASK | PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; status = glScreen->glPaintOutput (attrib, matrix, region, output, mask); if (optionGetShowSwitcher () && (moving || showPreview || boxTimeout) && (output->id () == boxOutputDevice || output == &screen->fullscreenOutput ())) { GLMatrix sMatrix (matrix); sMatrix.toScreenSpace (output, -DEFAULT_Z_CAMERA); drawCairoTextureOnScreen (sMatrix); if (optionGetMiniscreen ()) { float mw, mh; mw = viewportWidth; mh = viewportHeight; transform = MiniScreen; mSAttribs.xScale = mw / screen->width (); mSAttribs.yScale = mh / screen->height (); mSAttribs.opacity = OPAQUE * (1.0 + mSzCamera); mSAttribs.saturation = COLOR; for (unsigned int j = 0; j < (unsigned int) screen->vpSize ().height (); j++) { for (unsigned int i = 0; i < (unsigned int) screen->vpSize ().width (); i++) { float mx, my; unsigned int msMask; CompPoint vp (i, j); mx = firstViewportX + (i * (viewportWidth + viewportBorder)); my = firstViewportY + (j * (viewportHeight + viewportBorder)); mSAttribs.xTranslate = mx / output->width (); mSAttribs.yTranslate = -my / output->height (); mSAttribs.brightness = 0.4f * BRIGHT; if (vp == screen->vp () && (moving || boxTimeout || showPreview)) { mSAttribs.brightness = BRIGHT; } cScreen->setWindowPaintOffset ((screen->vp ().x () - i) * screen->width (), (screen->vp ().y () - j) * screen->height ()); msMask = mask | PAINT_SCREEN_TRANSFORMED_MASK; glScreen->glPaintTransformedOutput (attrib, matrix, region, output, msMask); } } transform = NoTransformation; cScreen->setWindowPaintOffset (0, 0); } } return status; } void WallScreen::preparePaint (int msSinceLastPaint) { if (!moving && !showPreview && boxTimeout) boxTimeout -= msSinceLastPaint; if (timer) timer -= msSinceLastPaint; if (moving) { computeTranslation (curPosX, curPosY); if (moveWindow) { CompWindow *window; window = screen->findWindow (moveWindow); if (window) { float dx, dy; dx = (gotoX - curPosX) * screen->width (); dy = (gotoY - curPosY) * screen->height (); window->moveToViewportPosition (moveWindowX - dx, moveWindowY - dy, true); } } } if (moving && curPosX == gotoX && curPosY == gotoY) { CompOption::Vector o (0); moving = false; timer = 0; if (moveWindow) releaseMoveWindow (); else if (focusDefault) { /* only focus default window if switcher is not active */ if (!screen->grabExist ("switcher")) screen->focusDefaultWindow (); } screen->handleCompizEvent ("wall", "end_viewport_switch", o); } cScreen->preparePaint (msSinceLastPaint); } void WallScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, CompOutput *output, unsigned int mask) { bool clear = (mask & PAINT_SCREEN_CLEAR_MASK); if (transform == MiniScreen) { GLMatrix sMatrix (matrix); mask &= ~PAINT_SCREEN_CLEAR_MASK; /* move each screen to the correct output position */ sMatrix.translate (-(float) output->x1 () / (float) output->width (), (float) output->y1 () / (float) output->height (), 0.0f); sMatrix.translate (0.0f, 0.0f, -DEFAULT_Z_CAMERA); sMatrix.translate (mSAttribs.xTranslate, mSAttribs.yTranslate, mSzCamera); /* move origin to top left */ sMatrix.translate (-0.5f, 0.5f, 0.0f); sMatrix.scale (mSAttribs.xScale, mSAttribs.yScale, 1.0); /* revert prepareXCoords region shift. Now all screens display the same */ sMatrix.translate (0.5f, 0.5f, DEFAULT_Z_CAMERA); sMatrix.translate ((float) output->x1 () / (float) output->width (), -(float) output->y2 () / (float) output->height (), 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, screen->region (), output, mask); return; } if (!moving) glScreen->glPaintTransformedOutput (attrib, matrix, region, output, mask); mask &= ~PAINT_SCREEN_CLEAR_MASK; if (moving) { ScreenTransformation oldTransform = transform; GLMatrix sMatrix (matrix); float xTranslate, yTranslate; float px, py; bool movingX, movingY; CompPoint point (screen->vp ()); CompRegion outputRegion (*output); if (clear) glScreen->clearTargetOutput (GL_COLOR_BUFFER_BIT); transform = Sliding; currOutput = output; px = curPosX; py = curPosY; movingX = ((int) floor (px)) != ((int) ceil (px)); movingY = ((int) floor (py)) != ((int) ceil (py)); if (movingY) { yTranslate = fmod (py, 1) - 1; sMatrix.translate (0.0f, yTranslate, 0.0f); if (movingX) { xTranslate = 1 - fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - ceil (px)) * screen->width (), (point.y () - ceil (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); sMatrix.translate (-xTranslate, 0.0f, 0.0f); } xTranslate = -fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - floor (px)) * screen->width (), (point.y () - ceil (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); sMatrix.translate (-xTranslate, -yTranslate, 0.0f); } yTranslate = fmod (py, 1); sMatrix.translate (0.0f, yTranslate, 0.0f); if (movingX) { xTranslate = 1 - fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - ceil (px)) * screen->width (), (point.y () - floor (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); sMatrix.translate (-xTranslate, 0.0f, 0.0f); } xTranslate = -fmod (px, 1); cScreen->setWindowPaintOffset ((point.x () - floor (px)) * screen->width (), (point.y () - floor (py)) * screen->height ()); sMatrix.translate (xTranslate, 0.0f, 0.0f); glScreen->glPaintTransformedOutput (attrib, sMatrix, outputRegion, output, mask); cScreen->setWindowPaintOffset (0, 0); transform = oldTransform; } } bool WallWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask) { bool status; WALL_SCREEN (screen); if (ws->transform == MiniScreen) { GLWindowPaintAttrib pA (attrib); pA.opacity = attrib.opacity * ((float) ws->mSAttribs.opacity / OPAQUE); pA.brightness = attrib.brightness * ((float) ws->mSAttribs.brightness / BRIGHT); pA.saturation = attrib.saturation * ((float) ws->mSAttribs.saturation / COLOR); if (!pA.opacity || !pA.brightness) mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK; status = glWindow->glPaint (pA, matrix, region, mask); } else if (ws->transform == Sliding && !isSliding) { GLMatrix wMatrix; /* Don't paint nonsliding windows multiple times */ wMatrix.toScreenSpace (ws->currOutput, -DEFAULT_Z_CAMERA); status = glWindow->glPaint (attrib, wMatrix, region, mask | PAINT_WINDOW_TRANSFORMED_MASK); } else { status = glWindow->glPaint (attrib, matrix, region, mask); } return status; } void WallScreen::donePaint () { if (moving || showPreview || boxTimeout) { boxTimeout = MAX (0, boxTimeout); cScreen->damageScreen (); } if (!moving && !showPreview && grabIndex) { screen->removeGrab (static_cast (grabIndex), NULL); grabIndex = 0; } cScreen->donePaint (); } void WallScreen::createCairoContexts (bool initial) { int width, height; viewportWidth = VIEWPORT_SWITCHER_SIZE * (float) optionGetPreviewScale () / 100.0f; viewportHeight = viewportWidth * (float) screen->height () / (float) screen->width (); viewportBorder = optionGetBorderWidth (); width = screen->vpSize ().width () * (viewportWidth + viewportBorder) + viewportBorder; height = screen->vpSize ().height () * (viewportHeight + viewportBorder) + viewportBorder; destroyCairoContext (switcherContext); switcherContext.width = width; switcherContext.height = height; setupCairoContext (switcherContext); drawSwitcherBackground (); destroyCairoContext (thumbContext); thumbContext.width = viewportWidth; thumbContext.height = viewportHeight; setupCairoContext (thumbContext); drawThumb (); destroyCairoContext (highlightContext); highlightContext.width = viewportWidth; highlightContext.height = viewportHeight; setupCairoContext (highlightContext); drawHighlight (); if (initial) { arrowContext.width = ARROW_SIZE; arrowContext.height = ARROW_SIZE; setupCairoContext (arrowContext); drawArrow (); } } void WallScreen::toggleEdges (bool enabled) { WALL_SCREEN (screen); if (!enabled) { screen->removeAction (&ws->optionGetFlipLeftEdge ()); screen->removeAction (&ws->optionGetFlipUpEdge ()); screen->removeAction (&ws->optionGetFlipRightEdge ()); screen->removeAction (&ws->optionGetFlipDownEdge ()); } else { screen->addAction (&ws->optionGetFlipLeftEdge ()); screen->addAction (&ws->optionGetFlipUpEdge ()); screen->addAction (&ws->optionGetFlipRightEdge ()); screen->addAction (&ws->optionGetFlipDownEdge ()); } } void WallScreen::optionChanged (CompOption *opt, WallOptions::Options num) { switch(num) { case WallOptions::OutlineColor: drawSwitcherBackground (); drawHighlight (); drawThumb (); break; case WallOptions::EdgeRadius: case WallOptions::BackgroundGradientBaseColor: case WallOptions::BackgroundGradientHighlightColor: case WallOptions::BackgroundGradientShadowColor: drawSwitcherBackground (); break; case WallOptions::BorderWidth: case WallOptions::PreviewScale: createCairoContexts (false); break; case WallOptions::ThumbGradientBaseColor: case WallOptions::ThumbGradientHighlightColor: drawThumb (); break; case WallOptions::ThumbHighlightGradientBaseColor: case WallOptions::ThumbHighlightGradientShadowColor: drawHighlight (); break; case WallOptions::ArrowBaseColor: case WallOptions::ArrowShadowColor: drawArrow (); break; case WallOptions::NoSlideMatch: foreach (CompWindow *w, screen->windows ()) { WALL_WINDOW (w); ww->isSliding = !optionGetNoSlideMatch ().evaluate (w); } break; case WallOptions::EdgeflipPointer: toggleEdges (optionGetEdgeflipPointer ()); break; default: break; } } bool WallScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { bool status = screen->setOptionForPlugin (plugin, name, value); if (strcmp (plugin, "core") == 0) { if (strcmp (name, "hsize") == 0 || strcmp (name, "vsize") == 0) { createCairoContexts (false); } } return status; } void WallScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); foreach (CompWindow *w, screen->windows ()) { WALL_WINDOW (w); ww->isSliding = !optionGetNoSlideMatch ().evaluate (w); } } void WallScreen::matchPropertyChanged (CompWindow *window) { WALL_WINDOW (window); screen->matchPropertyChanged (window); ww->isSliding = !optionGetNoSlideMatch ().evaluate (window); } WallScreen::WallScreen (CompScreen *screen) : PluginClassHandler (screen), WallOptions (), cScreen (CompositeScreen::get (screen)), glScreen (GLScreen::get (screen)), moving (false), showPreview (false), direction (-1), boxTimeout (0), grabIndex (0), timer (0), moveWindow (None), focusDefault (true), transform (NoTransformation), windowIsDragMoved (false) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (glScreen); // HACK: we have to keep libcairo loaded even if wall gets unloaded // to prevent crashes in XCloseDisplay dlopen ("libcairo.so.2", RTLD_LAZY); memset (&switcherContext, 0, sizeof (WallCairoContext)); memset (&thumbContext, 0, sizeof (WallCairoContext)); memset (&highlightContext, 0, sizeof (WallCairoContext)); memset (&arrowContext, 0, sizeof (WallCairoContext)); createCairoContexts (true); #define setAction(action, dir, win) \ optionSet##action##Initiate (boost::bind (&WallScreen::initiate, this, \ _1, _2, _3, dir, win)); \ optionSet##action##Terminate (boost::bind (&WallScreen::terminate, this, \ _1, _2, _3)) #define setFlipAction(action, dir) \ optionSet##action##Initiate (boost::bind (&WallScreen::initiateFlip, \ this, dir, _2)) setAction (LeftKey, Left, false); setAction (RightKey, Right, false); setAction (UpKey, Up, false); setAction (DownKey, Down, false); setAction (NextKey, Next, false); setAction (PrevKey, Prev, false); setAction (LeftButton, Left, false); setAction (RightButton, Right, false); setAction (UpButton, Up, false); setAction (DownButton, Down, false); setAction (NextButton, Next, false); setAction (PrevButton, Prev, false); setAction (LeftWindowKey, Left, true); setAction (RightWindowKey, Right, true); setAction (UpWindowKey, Up, true); setAction (DownWindowKey, Down, true); setFlipAction (FlipLeftEdge, Left); setFlipAction (FlipRightEdge, Right); setFlipAction (FlipUpEdge, Up); setFlipAction (FlipDownEdge, Down); #define setNotify(func) \ optionSet##func##Notify (boost::bind (&WallScreen::optionChanged, \ this, _1, _2)) setNotify (EdgeRadius); setNotify (BorderWidth); setNotify (PreviewScale); setNotify (OutlineColor); setNotify (BackgroundGradientBaseColor); setNotify (BackgroundGradientHighlightColor); setNotify (BackgroundGradientShadowColor); setNotify (ThumbGradientBaseColor); setNotify (ThumbGradientHighlightColor); setNotify (ThumbHighlightGradientBaseColor); setNotify (ThumbHighlightGradientShadowColor); setNotify (ArrowBaseColor); setNotify (ArrowShadowColor); setNotify (NoSlideMatch); setNotify (EdgeflipPointer); } WallScreen::~WallScreen () { destroyCairoContext (switcherContext); destroyCairoContext (thumbContext); destroyCairoContext (highlightContext); destroyCairoContext (arrowContext); } WallWindow::WallWindow (CompWindow *window) : PluginClassHandler (window), window (window), glWindow (GLWindow::get (window)) { WALL_SCREEN (screen); isSliding = !ws->optionGetNoSlideMatch ().evaluate (window); GLWindowInterface::setHandler (glWindow); WindowInterface::setHandler (window); } bool WallPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/wall/src/offset_movement/0000755000004100000410000000000013246301623017652 5ustar www-datawww-data./plugins/wall/src/offset_movement/CMakeLists.txt0000644000004100000410000000123113246301623022407 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS} ${COMPIZ_LIBRARY_DIRS}) SET ( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/offset-movement.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/offset-movement.cpp ) ADD_LIBRARY( compiz_wall_offset_movement STATIC ${SRCS} ${PRIVATE_HEADERS} ) if (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) endif (COMPIZ_BUILD_TESTING) TARGET_LINK_LIBRARIES( compiz_wall_offset_movement compiz_rect compiz_region ) ./plugins/wall/src/offset_movement/include/0000755000004100000410000000000013246301623021275 5ustar www-datawww-data./plugins/wall/src/offset_movement/include/offset-movement.h0000644000004100000410000000204213246301623024562 0ustar www-datawww-data/** * * Compiz wall plugin * * offset-movement.h * * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #ifndef _COMPIZ_WALL_OFFSET_MOVEMENT_H #define _COMPIZ_WALL_OFFSET_MOVEMENT_H #include #include #include namespace compiz { namespace wall { CompPoint movementWindowOnScreen (const CompRect &serverBorderRect, const CompRegion &screenRegion); } } #endif ./plugins/wall/src/offset_movement/src/0000755000004100000410000000000013246301623020441 5ustar www-datawww-data./plugins/wall/src/offset_movement/src/offset-movement.cpp0000644000004100000410000000352213246301623024265 0ustar www-datawww-data/** * * Compiz wall plugin * * offset-movement.cpp * * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include "offset-movement.h" CompPoint compiz::wall::movementWindowOnScreen (const CompRect &serverBorderRect, const CompRegion &screenRegion) { CompRegion sbrRegion (serverBorderRect); /* If the window would be partially offscreen * after it was moved then we should move it back * so that it is completely onscreen, since we moved * from mostly offscreen on B to mostly onscreen on A, * the user should be able to see their selected window */ CompRegion inter = sbrRegion.intersected (screenRegion); CompRegion rem = sbrRegion - screenRegion; int dx = 0; int dy = 0; const CompRect::vector &rects (rem.rects ()); for (std::vector ::const_iterator it = rects.begin (); it != rects.end (); ++it) { const CompRect &r = *it; if (r.x1 () >= inter.boundingRect ().x2 ()) dx -= r.width (); else if (r.x2 () <= inter.boundingRect ().x1 ()) dx += r.width (); if (r.y1 () >= inter.boundingRect ().y2 ()) dy -= r.height (); else if (r.y2 () <= inter.boundingRect ().y1 ()) dy += r.height (); } return CompPoint (dx, dy); } ./plugins/wall/src/offset_movement/tests/0000755000004100000410000000000013246301624021015 5ustar www-datawww-data./plugins/wall/src/offset_movement/tests/CMakeLists.txt0000644000004100000410000000066013246301623023556 0ustar www-datawww-dataadd_executable (compiz_test_wall_offset_movement ${CMAKE_CURRENT_SOURCE_DIR}/test-wall-offset-movement.cpp) target_link_libraries (compiz_test_wall_offset_movement compiz_wall_offset_movement ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_wall_offset_movement COVERAGE compiz_wall_offset_movement) ./plugins/wall/src/offset_movement/tests/test-wall-offset-movement.cpp0000644000004100000410000000435013246301623026552 0ustar www-datawww-data#include #include #include "offset-movement.h" class WallOffsetMovementTest : public ::testing::Test { }; TEST(WallOffsetMovementTest, TestOffsetRight) { CompRect sbr (750, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (-250, 0)); } TEST(WallOffsetMovementTest, TestOffsetLeft) { CompRect sbr (-250, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (250, 0)); } TEST(WallOffsetMovementTest, TestOffsetTop) { CompRect sbr (0, -250, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, 250)); } TEST(WallOffsetMovementTest, TestOffsetBottom) { CompRect sbr (0, 750, 500, 500); CompRegion sr (0, 0, 1000, 1000); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, -250)); } TEST(WallOffsetMovementTest, TestOffsetRightMMSlice) { CompRect sbr (750, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (-250, 0)); } TEST(WallOffsetMovementTest, TestOffsetLeftMMSlice) { CompRect sbr (-250, 0, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (250, 0)); } TEST(WallOffsetMovementTest, TestOffsetTopMMSlice) { CompRect sbr (0, -250, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, 250)); } TEST(WallOffsetMovementTest, TestOffsetBottomMMSlice) { CompRect sbr (0, 750, 500, 500); CompRegion sr (0, 0, 1000, 1000); sr -= CompRegion (400, 0, 200, 0); CompPoint offset = compiz::wall::movementWindowOnScreen (sbr, sr); EXPECT_EQ (offset, CompPoint (0, -250)); } ./plugins/wall/src/wall.h0000644000004100000410000001135213246301623015564 0ustar www-datawww-data/** * * Compiz wall plugin * * wall.h * * Copyright (c) 2006 Robert Carr * * Authors: * Robert Carr * Dennis Kasprzyk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ #include #include #include #include #include #include #include #include "offset-movement.h" #include "wall_options.h" /* enums */ typedef enum { NoTransformation, MiniScreen, Sliding } ScreenTransformation; /* FIXME: put into own class? */ typedef struct _WallCairoContext { Pixmap pixmap; GLTexture::List texture; cairo_surface_t *surface; cairo_t *cr; int width; int height; } WallCairoContext; /* classes */ class WallScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler , public WallOptions { public: enum Direction { Up = 0, Left, Down, Right, Next, Prev }; WallScreen (CompScreen *s); ~WallScreen (); void preparePaint (int); void paint (CompOutput::ptrList &, unsigned int); void donePaint (); void handleEvent (XEvent *event); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); bool setOptionForPlugin (const char *, const char *, CompOption::Value&); void matchExpHandlerChanged (); void matchPropertyChanged (CompWindow *); void createCairoContexts (bool); void setupCairoContext (WallCairoContext &); void destroyCairoContext (WallCairoContext &); void clearCairoLayer (cairo_t *); void drawSwitcherBackground (); void drawThumb (); void drawHighlight (); void drawArrow (); void drawCairoTextureOnScreen (const GLMatrix &transform); void releaseMoveWindow (); void computeTranslation (float &, float &); void determineMovementAngle (); bool checkDestination (unsigned int, unsigned int); void checkAmount (int, int, int &, int &); bool initiate (CompAction *, CompAction::State, CompOption::Vector &, Direction, bool); bool terminate (CompAction *, CompAction::State, CompOption::Vector &); bool initiateFlip (Direction, CompAction::State); bool moveViewport (int, int, Window); void optionChanged (CompOption *opt, WallOptions::Options num); void toggleEdges (bool); void positionUpdate (const CompPoint &pos); CompositeScreen *cScreen; GLScreen *glScreen; bool moving; /* Used to track miniview movement */ bool showPreview; float curPosX; float curPosY; unsigned int gotoX; unsigned int gotoY; int direction; /* >= 0 : direction arrow angle, < 0 : no direction */ int boxTimeout; unsigned int boxOutputDevice; CompScreen::GrabHandle grabIndex; int timer; Window moveWindow; bool focusDefault; ScreenTransformation transform; CompOutput *currOutput; GLWindowPaintAttrib mSAttribs; float mSzCamera; int firstViewportX; int firstViewportY; int viewportWidth; int viewportHeight; int viewportBorder; int moveWindowX; int moveWindowY; WallCairoContext switcherContext; WallCairoContext thumbContext; WallCairoContext highlightContext; WallCairoContext arrowContext; bool windowIsDragMoved; }; class WallWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: WallWindow (CompWindow *); virtual void activate (); void grabNotify (int, int, unsigned int, unsigned int); void ungrabNotify (); void windowNotify (CompWindowNotify); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); CompWindow *window; GLWindow *glWindow; bool isSliding; }; #define WALL_SCREEN(s) \ WallScreen *ws = WallScreen::get (s) #define WALL_WINDOW(w) \ WallWindow *ww = WallWindow::get (w) class WallPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/wall/wall.xml.in0000644000004100000410000003013313246301623015751 0ustar www-datawww-data <_short>Desktop Wall <_long>Desktop Wall Plugin Desktop largedesktop composite opengl decor wobbly fade opengl <_short>Viewport Switch Preview <_short>Background Gradient <_short>Thumb Gradient <_short>Highlight Gradient <_short>Arrow Colors <_short>Viewport Switching <_short>Bindings <_short>Move within wall <_short>Move with window within wall <_short>Edge flipping <_short>Viewport Switching <_short>Edge Flipping ./plugins/blur/0000755000004100000410000000000013246301624013671 5ustar www-datawww-data./plugins/blur/blur.xml.in0000644000004100000410000000623713246301623015773 0ustar www-datawww-data <_short>Blur Windows <_long>Blur windows Effects blur video decor opengl ./plugins/blur/CMakeLists.txt0000644000004100000410000000071613246301623016434 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) find_package (OpenGL) if (OPENGL_GLU_FOUND) compiz_plugin(blur PLUGINDEPS composite opengl LIBRARIES decoration ${OPENGL_glu_LIBRARY} INCDIRS ${OPENGL_INCLUDE_DIR}) if (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_BLUR) set_target_properties ( blur PROPERTIES INSTALL_RPATH "${COMPIZ_LIBDIR}" ) endif (COMPIZ_BUILD_WITH_RPATH AND NOT COMPIZ_DISABLE_PLUGIN_BLUR) endif () ./plugins/blur/src/0000755000004100000410000000000013246301624014460 5ustar www-datawww-data./plugins/blur/src/blur.cpp0000644000004100000410000015572413246301623016145 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include /* Supporting independent texture fetch operations will require * GLVertexBuffer to support per-plugin attributes as texture co-ordinates * are two-component and not four-component */ #define INDEPENDENT_TEX_SUPPORTED 0 COMPIZ_PLUGIN_20090315 (blur, BlurPluginVTable) /* pascal triangle based kernel generator */ namespace { int blurCreateGaussianLinearKernel (int radius, float strength, float *amp, float *pos, int *optSize) { float factor = 0.5f + (strength / 2.0f); float buffer1[BLUR_GAUSSIAN_RADIUS_MAX * 3]; float buffer2[BLUR_GAUSSIAN_RADIUS_MAX * 3]; float *ar1 = buffer1; float *ar2 = buffer2; float *tmp; float sum = 0; int size = (radius * 2) + 1; int mySize = ceil (radius / 2.0f); int i, j; ar1[0] = 1.0; ar1[1] = 1.0; for (i = 3; i <= size; i++) { ar2[0] = 1; for (j = 1; j < i - 1; j++) ar2[j] = (ar1[j - 1] + ar1[j]) * factor; ar2[i - 1] = 1; tmp = ar1; ar1 = ar2; ar2 = tmp; } /* normalize */ for (i = 0; i < size; i++) sum += ar1[i]; if (sum != 0.0f) sum = 1.0f / sum; for (i = 0; i < size; i++) ar1[i] *= sum; i = 0; j = 0; if (radius & 1) { pos[i] = radius; amp[i] = ar1[i]; i = 1; j = 1; } for (; i < mySize; i++) { pos[i] = radius - j; pos[i] -= ar1[j + 1] / (ar1[j] + ar1[j + 1]); amp[i] = ar1[j] + ar1[j + 1]; j += 2; } pos[mySize] = 0.0; amp[mySize] = ar1[radius]; *optSize = mySize; return radius; } } void BlurScreen::updateFilterRadius () { switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: filterRadius = 2; break; case BlurOptions::FilterGaussian: { int radius = optionGetGaussianRadius (); float strength = optionGetGaussianStrength (); blurCreateGaussianLinearKernel (radius, strength, amp, pos, &numTexop); filterRadius = radius; } break; case BlurOptions::FilterMipmap: { float lod = optionGetMipmapLod (); filterRadius = powf (2.0f, ceilf (lod)); } break; } } void BlurScreen::blurReset () { updateFilterRadius (); srcBlurFunctions.clear (); dstBlurFunctions.clear (); program.reset (); texture.clear (); } static CompRegion regionFromBoxes (std::vector boxes, int width, int height) { CompRegion region; int x1, x2, y1, y2; foreach (BlurBox &box, boxes) { decor_apply_gravity (box.p1.gravity, box.p1.x, box.p1.y, width, height, &x1, &y1); decor_apply_gravity (box.p2.gravity, box.p2.x, box.p2.y, width, height, &x2, &y2); if (x2 > x1 && y2 > y1) region += CompRect (x1, y1, x2 - x1, y2 - y1); } return region; } void BlurWindow::updateRegion () { CompRegion region; if (state[BLUR_STATE_DECOR].threshold) { region += CompRect (-window->output ().left, -window->output ().top, window->width () + window->output ().right, window->height () + window->output ().bottom); region -= CompRect (0, 0, window->width (), window->height ()); state[BLUR_STATE_DECOR].clipped = false; if (!state[BLUR_STATE_DECOR].box.empty ()) { CompRegion q = regionFromBoxes (state[BLUR_STATE_DECOR].box, window->width (), window->height ()); if (!q.isEmpty ()) { q &= region; if (q != region) { region = q; state[BLUR_STATE_DECOR].clipped = true; } } } } if (state[BLUR_STATE_CLIENT].threshold) { CompRegion r (0, 0, window->width (), window->height ()); state[BLUR_STATE_CLIENT].clipped = false; if (!state[BLUR_STATE_CLIENT].box.empty ()) { CompRegion q = regionFromBoxes (state[BLUR_STATE_CLIENT].box, window->width (), window->height ()); if (!q.isEmpty ()) { q &= r; if (q != r) state[BLUR_STATE_CLIENT].clipped = true; region += q; } } else { region += r; } } this->region = region; if (!region.isEmpty ()) this->region.translate (window->x (), window->y ()); } void BlurWindow::setBlur (int state, int threshold, std::vector box) { this->state[state].threshold = threshold; this->state[state].box = box; updateRegion (); cWindow->addDamage (); } void BlurWindow::updateAlphaMatch () { if (!propSet[BLUR_STATE_CLIENT]) { CompMatch *match; match = &bScreen->optionGetAlphaBlurMatch (); if (match->evaluate (window)) { if (!state[BLUR_STATE_CLIENT].threshold) setBlur (BLUR_STATE_CLIENT, 4, std::vector ()); } else { if (state[BLUR_STATE_CLIENT].threshold) setBlur (BLUR_STATE_CLIENT, 0, std::vector ()); } } } void BlurWindow::updateMatch () { CompMatch *match; bool focus; updateAlphaMatch (); match = &bScreen->optionGetFocusBlurMatch (); focus = GL::shaders && match->evaluate (window); if (focus != focusBlur) { focusBlur = focus; cWindow->addDamage (); } } void BlurWindow::update (int state) { Atom actual; int result, format; unsigned long n, left; unsigned char *propData; int threshold = 0; std::vector boxes; result = XGetWindowProperty (screen->dpy (), window->id (), bScreen->blurAtom[state], 0L, 8192L, false, XA_INTEGER, &actual, &format, &n, &left, &propData); if (result == Success && n && propData) { propSet[state] = true; if (n >= 2) { long *data = (long *) propData; BlurBox box; threshold = data[0]; if ((n - 2) / 6) { unsigned int i; data += 2; for (i = 0; i < (n - 2) / 6; i++) { box.p1.gravity = *data++; box.p1.x = *data++; box.p1.y = *data++; box.p2.gravity = *data++; box.p2.x = *data++; box.p2.y = *data++; boxes.push_back (box); } } } XFree (propData); } else { propSet[state] = false; } setBlur (state, threshold, boxes); updateAlphaMatch (); } void BlurScreen::preparePaint (int msSinceLastPaint) { if (moreBlur) { int steps; bool focus = optionGetFocusBlur (); bool focusBlur; steps = (msSinceLastPaint * 0xffff) / blurTime; if (steps < 12) steps = 12; moreBlur = false; foreach (CompWindow *w, screen->windows ()) { BLUR_WINDOW (w); focusBlur = bw->focusBlur && focus; if (!bw->pulse && (!focusBlur || w->id () == screen->activeWindow ())) { if (bw->blur) { bw->blur -= steps; if (bw->blur > 0) moreBlur = true; else bw->blur = 0; } } else { if (bw->blur < 0xffff) { if (bw->pulse) { bw->blur += steps * 2; if (bw->blur >= 0xffff) { bw->blur = 0xffff - 1; bw->pulse = false; } moreBlur = true; } else { bw->blur += steps; if (bw->blur < 0xffff) moreBlur = true; else bw->blur = 0xffff; } } } } } cScreen->preparePaint (msSinceLastPaint); } bool BlurScreen::markAreaDirty (const CompRegion &r) { return allowAreaDirtyOnOwnDamageBuffer; } void BlurScreen::damageCutoff () { if (alphaBlur) { this->output = &screen->fullscreenOutput (); /* We need to do a primary pass here with glPaint to check which * regions of the backbuffer need to be updated. * * Because the backbuffer is effectively partially undefined, we are completely * reliant on what core is telling us the repair regions of the * backbuffer need to be - but obviously we can't completely rely * on it because of a feedback effect, as we need to expand * the repair region slightly so that the texture sampler * doesn't go out of range of the damage region. If we were to * simply expand the damage region, then that would feedback to us * on the next frame, until the damage region eventually became infinite. * * As such, we have a tracker in core to track all damage except the effect * of expanding the damage region that came back to us. We then use * this tracker along with the frame age to determine what damage really * needs to be expanded in order to determine the backbuffer update region, * and then use the real damage in order to determine what blur regions * should be updated */ backbufferUpdateRegionThisFrame &= CompRegion::empty (); CompRegion frameAgeDamage = damageQuery->damageForFrameAge (cScreen->getFrameAge ()); foreach (CompWindow *w, screen->windows ()) { /* Skip windows that would not have glPaint called on them */ if (w->destroyed ()) continue; if (!w->shaded () && !w->isViewable ()) continue; BlurWindow *bw = BlurWindow::get (w); if (!bw->cWindow->redirected ()) continue; if (!bw->projectedBlurRegion.isEmpty ()) bw->projectedBlurRegion &= CompRegion::empty (); GLMatrix screenSpace; screenSpace.toScreenSpace (this->output, -DEFAULT_Z_CAMERA); bw->gWindow->glPaint (bw->gWindow->paintAttrib (), screenSpace, frameAgeDamage, PAINT_WINDOW_NO_CORE_INSTANCE_MASK); backbufferUpdateRegionThisFrame += bw->projectedBlurRegion; } allowAreaDirtyOnOwnDamageBuffer = false; cScreen->damageRegion (backbufferUpdateRegionThisFrame); allowAreaDirtyOnOwnDamageBuffer = true; } cScreen->damageCutoff (); } bool BlurScreen::glPaintOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (alphaBlur) { stencilBox = region.boundingRect (); this->region = region; } if (!blurOcclusion) { occlusion = CompRegion (); foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->clip = CompRegion (); } this->output = output; return gScreen->glPaintOutput (sAttrib, transform, region, output, mask); } void BlurScreen::glPaintTransformedOutput (const GLScreenPaintAttrib &sAttrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { if (!blurOcclusion) { occlusion = CompRegion (); foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->clip = CompRegion (); } gScreen->glPaintTransformedOutput (sAttrib, transform, region, output, mask); } void BlurScreen::donePaint () { if (moreBlur) { foreach (CompWindow *w, screen->windows ()) { BLUR_WINDOW (w); if (bw->blur > 0 && bw->blur < 0xffff) bw->cWindow->addDamage (); } } cScreen->donePaint (); } void BlurWindow::glTransformationComplete (const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask) { gWindow->glTransformationComplete (matrix, region, mask); int clientThreshold; const CompRegion *reg = NULL; /* only care about client window blurring when it's translucent */ if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) clientThreshold = state[BLUR_STATE_CLIENT].threshold; else clientThreshold = 0; if (mask & PAINT_WINDOW_TRANSFORMED_MASK) reg = &CompRegion::infinite (); else reg = ®ion; bScreen->tmpRegion = this->region.intersected (*reg); if (state[BLUR_STATE_DECOR].threshold || clientThreshold) { determineBlurRegion (bScreen->optionGetFilter (), matrix, clientThreshold); } } bool BlurWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { bool status = gWindow->glPaint (attrib, transform, region, mask); if (!bScreen->blurOcclusion && (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)) { clip = bScreen->occlusion; if (!(gWindow->lastMask () & PAINT_WINDOW_NO_CORE_INSTANCE_MASK) && !(gWindow->lastMask () & PAINT_WINDOW_TRANSFORMED_MASK) && !this->region.isEmpty ()) bScreen->occlusion += this->region; } return status; } namespace { struct SamplerInfo { GLint target; CompString func; }; SamplerInfo getSamplerInfoForSize (const CompSize &size) { SamplerInfo info; #ifdef USE_GLES info.target = GL_TEXTURE_2D; info.func = "texture2D"; #else if (GL::textureNonPowerOfTwo || (POWER_OF_TWO (size.width ()) && POWER_OF_TWO (size.height ()))) { info.target = GL_TEXTURE_2D; info.func = "texture2D"; } else { info.target = GL_TEXTURE_RECTANGLE_NV; info.func = "textureRECT"; } #endif return info; } } /* XXX: param is redundant */ const CompString & BlurScreen::getSrcBlurFragmentFunction (GLTexture *texture) { BlurFunction function; std::stringstream data (std::stringstream::out); SamplerInfo info (getSamplerInfoForSize (CompSize (texture->width (), texture->height ()))); foreach (const BlurFunction &bf, srcBlurFunctions) if (bf.target == info.target) return bf.shader; data << "uniform vec4 focusblur_input_offset;\n"\ "\n"\ "void focusblur_fragment ()\n"\ "{\n"; if (optionGetFilter () == BlurOptions::Filter4xbilinear) data << " float blur_offset0, blur_offset1;\n"\ " vec4 blur_sum;\n"\ " vec4 offset0 = focusblur_input_offset.xyzw * vec4 (1.0, 1.0, 0.0, 0.0);\n"\ " vec4 offset1 = focusblur_input_offset.zwww * vec4 (1.0, 1.0, 0.0, 0.0);\n" " vec4 output = texture2D (texture0, vTexCoord0 + offset0);\n"\ " blur_sum = output * 0.25;\n"\ " output = " << info.func << " (texture0, vTexCoord0 - offset0);\n"\ " blur_sum += output * 0.25;\n"\ " output = " << info.func << " (texture0, vTexCoord0 + offset1);\n"\ " blur_sum += output * 0.25;\n"\ " output = " << info.func << " (texture0, vTexCoord0 - offset1);\n"\ " output = output * 0.25 + blur_sum;\n"\ " gl_FragColor = output;\n"; data << "}\n"; function.shader = data.str (); function.target = info.target; srcBlurFunctions.push_back (function); return srcBlurFunctions.back ().shader; } /* This seems incomplete to me */ const CompString & BlurScreen::getDstBlurFragmentFunction (GLTexture *texture, int unit, int numITC, int startTC) { BlurFunction function; std::stringstream data (std::stringstream::out); int saturation = optionGetSaturation (); SamplerInfo info (getSamplerInfoForSize (CompSize (texture->width (), texture->height ()))); foreach (BlurFunction &function, dstBlurFunctions) if (function.target == info.target && function.numITC == numITC && function.startTC == startTC && function.saturation == saturation) return function.shader; data << "uniform vec4 blur_translation;\n"\ "uniform vec4 blur_threshold;\n"; int i, j; /* These are always initialized if running a gaussian shader */ int numIndirect = 0; int numIndirectOp = 0; int base, end, ITCbase; /* Set per-shader uniforms */ switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: data << "uniform vec4 blur_dxdy;\n"; break; default: break; } data << "\n"\ "void blur_fragment ()\n"\ "{\n"\ " vec4 blur_sum, blur_dst, blur_output;\n"\ " vec2 blur_fCoord;\n"\ " vec4 blur_mask;\n"; if (saturation < 100) data << " float blur_sat;\n"; /* Define per-filter temporaries */ switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: { static const char *filterTemp[] = { "blur_t0", "blur_t1", "blur_t2", "blur_t3", }; static const char *filterSampleTemp[] = { "blur_s0", "blur_s1", "blur_s2", "blur_s3" }; for (i = 0; (unsigned int) i < sizeof (filterTemp) / sizeof (filterTemp[0]); ++i) data << " vec2 " << filterTemp[i] << ";\n"; for (i = 0; (unsigned int) i < sizeof (filterSampleTemp) / sizeof (filterSampleTemp[0]); ++i) data << " vec4 " << filterSampleTemp[i] << ";\n"; } break; case BlurOptions::FilterGaussian: { /* try to use only half of the available temporaries to keep other plugins working */ if ((maxTemp / 2) - 4 > (numTexop + (numTexop - numITC)) * 2) { numIndirect = 1; numIndirectOp = numTexop; } else { i = MAX (((maxTemp / 2) - 4) / 4, 1); numIndirect = ceil ((float)numTexop / (float)i); numIndirectOp = ceil ((float)numTexop / (float)numIndirect); } /* we need to define all coordinate temporaries if we have multiple indirection steps */ j = (numIndirect > 1) ? 0 : numITC; for (i = 0; i < numIndirectOp * 2; i++) data << " vec4 blur_pix_" << i << ";\n"; for (i = j * 2; i < numIndirectOp * 2; i++) data << " vec2 blur_coord_" << i << ";\n"; } break; case BlurOptions::FilterMipmap: { data << " float lod_bias;\n"; } default: break; } /* * blur_output: copy the original gl_FragColor determined by sampling * the window texture in the core shader * blur_fCoord: take the fragment co-ordinate in window co-ordinates * and normalize it (eg, blur_translation). Once normalized we can * sample texUnitN + 1 (for the copy of the backbuffer we wish to blur) * and texUnitN + 2 (scratch fbo for gaussian blurs) * blur_mask: take blur_output pixel alpha value, multiply by threshold value * and clamp between 0 - 1. We will use this later to mix the blur fragments * with the window fragments. */ data << "\n"\ " blur_output = gl_FragColor;\n"\ " blur_fCoord = gl_FragCoord.st * blur_translation.st;\n"\ " blur_mask = clamp (blur_output.a * blur_threshold, vec4 (0.0, 0.0, 0.0, 0.), vec4 (1.0, 1.0, 1.0, 1.0));\n"\ "\n"; /* Define filter program */ switch (optionGetFilter ()) { case BlurOptions::Filter4xbilinear: { data << " blur_t0 = blur_fCoord + blur_dxdy.st;\n"\ " blur_s0 = " << info.func << " (texture1, blur_t0);\n"\ " blur_t1 = blur_fCoord - blur_dxdy.st;\n"\ " blur_s1 = " << info.func << " (texture1, blur_t1);\n"\ " blur_t2 = blur_fCoord + vec2 (-1.0, 1.0) * blur_dxdy.st;\n"\ " blur_s2 = " << info.func << " (texture1, blur_t2);\n"\ " blur_t3 = blur_fCoord + vec2 (1.0, -1.0) * blur_dxdy.st;\n"\ " blur_s3 = " << info.func << " (texture1, blur_t3);\n"\ " blur_sum = blur_s0 * 0.25;\n"\ " blur_sum += blur_s1 * 0.25;\n"\ " blur_sum += blur_s2 * 0.25;\n"\ " blur_sum += blur_s3 * 0.25;\n"; } break; case BlurOptions::FilterGaussian: { /* Invert y */ data << " blur_fCoord.y = 1.0 - blur_fCoord.y;\n"\ " blur_sum = " << info.func << " (texture2, blur_fCoord);\n"\ " blur_sum *= " << amp[numTexop] << ";\n"; for (j = 0; j < numIndirect; j++) { base = j * numIndirectOp; end = MIN ((j + 1) * numIndirectOp, numTexop) - base; ITCbase = MAX (numITC - base, 0); for (i = ITCbase; i < end; i++) { data << " blur_coord_" << i * 2 << " = blur_fCoord + vec2 (0.0, " << pos[base + i] * ty << ");\n"\ " blur_coord_" << (i * 2) + 1 << " = blur_fCoord - vec2 (0.0, " << pos[base + i] * ty << ");\n"; } #if INDEPENDENT_TEX_SUPPORTED for (i = 0; i < ITCbase; i++) { data << " blur_pix_" + i * 2 + " vTexCoord" data.addDataOp ( "TXP pix_%d, fragment.texcoord[%d], texture[%d], %s;" "TXP pix_%d, fragment.texcoord[%d], texture[%d], %s;", i * 2, startTC + ((i + base) * 2), unit + 1, targetString, (i * 2) + 1, startTC + 1 + ((i + base) * 2), unit + 1, targetString); } #endif for (i = ITCbase; i < end; i++) { data << " blur_pix_" << i * 2 << " = " << info.func << " (texture2, blur_coord_" << i * 2 << ");\n"\ " blur_pix_" << (i * 2) + 1 << " = " << info.func << " (texture2, blur_coord_" << (i * 2) + 1 << ");\n"; } for (i = 0; i < end * 2; i++) data << " blur_sum += blur_pix_" << i << " * " << amp[base + (i / 2)] << ";\n"; } } break; case BlurOptions::FilterMipmap: data << " lod_bias = blur_translation.w;\n"\ " blur_sum = " << info.func << " (texture1, blur_fCoord, lod_bias);\n"; break; } if (saturation < 100) { data << " blur_sat = blur_sum * vec4 (1.0, 1.0, 1.0, 0.0);\n"\ " blur_sat = dot (blur_sat, vec4 (" << RED_SATURATION_WEIGHT << ", " << GREEN_SATURATION_WEIGHT << ", " << BLUE_SATURATION_WEIGHT << ", 0.0f);\n"\ " blur_sum.xyz = mix (" << saturation / 100.f << ", blur_sat);\n"; } data << " blur_dst = (blur_mask * -blur_output.a) + blur_mask;\n"\ " blur_output.rgb = blur_sum.rgb * blur_dst.a + blur_output.rgb;\n"\ " blur_output.a += blur_dst.a;\n"\ " gl_FragColor = blur_output;\n"\ "}"; function.shader = data.str (); function.target = texture->target (); function.numITC = numITC; function.startTC = startTC; function.saturation = saturation; dstBlurFunctions.push_back (function); return dstBlurFunctions.back ().shader; } namespace { bool project (float objx, float objy, float objz, const float modelview[16], const float projection[16], const GLint viewport[4], float *winx, float *winy, float *winz) { unsigned int i; float in[4]; float out[4]; in[0] = objx; in[1] = objy; in[2] = objz; in[3] = 1.0; for (i = 0; i < 4; i++) { out[i] = in[0] * modelview[i] + in[1] * modelview[4 + i] + in[2] * modelview[8 + i] + in[3] * modelview[12 + i]; } for (i = 0; i < 4; i++) { in[i] = out[0] * projection[i] + out[1] * projection[4 + i] + out[2] * projection[8 + i] + out[3] * projection[12 + i]; } if (in[3] == 0.0) return false; in[0] /= in[3]; in[1] /= in[3]; in[2] /= in[3]; /* Map x, y and z to range 0-1 */ in[0] = in[0] * 0.5 + 0.5; in[1] = in[1] * 0.5 + 0.5; in[2] = in[2] * 0.5 + 0.5; /* Map x,y to viewport */ in[0] = in[0] * viewport[2] + viewport[0]; in[1] = in[1] * viewport[3] + viewport[1]; *winx = in[0]; *winy = in[1]; *winz = in[2]; return true; } } bool BlurScreen::projectVertices (CompOutput *output, const GLMatrix &transform, const float *object, float *scr, int n) { GLfloat dProjection[16]; GLfloat dModel[16]; GLint viewport[4]; float x, y, z; int i; viewport[0] = output->x1 (); viewport[1] = screen->height () - output->y2 (); viewport[2] = output->width (); viewport[3] = output->height (); for (i = 0; i < 16; i++) { dModel[i] = transform.getMatrix ()[i]; dProjection[i] = gScreen->projectionMatrix ()->getMatrix ()[i]; } while (n--) { if (!project (object[0], object[1], object[2], dModel, dProjection, viewport, &x, &y, &z)) return false; scr[0] = x; scr[1] = y; object += 3; scr += 2; } return true; } bool BlurScreen::loadFragmentProgram (boost::shared_ptr &program, const char *vertex, const char *fragment) { if (!program) program.reset (new GLProgram (CompString (vertex), CompString (fragment))); if (program && program->valid ()) return true; else { program.reset (); compLogMessage ("blur", CompLogLevelError, "Failed to load blur program %s", fragment); return false; } } bool BlurScreen::loadFilterProgram (int numITC) { std::stringstream svtx; /* A simple pass-thru vertex shader */ svtx << "#ifdef GL_ES\n"\ "precision mediump float;\n"\ "#endif\n"\ "uniform mat4 modelview;\n"\ "uniform mat4 projection;\n"\ "attribute vec4 position;\n"\ "attribute vec2 texCoord0;\n"\ "varying vec2 vTexCoord0;\n"\ "\n"\ "void main ()\n"\ "{\n"\ " vTexCoord0 = texCoord0;\n"\ " gl_Position = projection * modelview * position;\n"\ "}"; std::stringstream str; int i, j; int numIndirect; int numIndirectOp; int base, end, ITCbase; SamplerInfo info (getSamplerInfoForSize (*screen)); str << "varying vec2 vTexCoord0;\n"\ "uniform sampler2D texture0;\n"; if (maxTemp - 1 > (numTexop + (numTexop - numITC)) * 2) { numIndirect = 1; numIndirectOp = numTexop; } else { i = (maxTemp - 1) / 4; numIndirect = ceil ((float)numTexop / (float)i); numIndirectOp = ceil ((float)numTexop / (float)numIndirect); } /* we need to define all coordinate temporaries if we have multiple indirection steps */ j = (numIndirect > 1) ? 0 : numITC; str << "\n"\ "void main ()\n"\ "{\n"; for (i = 0; i < numIndirectOp; i++) str << " vec4 blur_pix_" << i * 2 << ", blur_pix_" << (i * 2) + 1 << ";\n"; for (i = j; i < numIndirectOp; i++) str << " vec2 blur_coord_" << i * 2 << ", blur_coord_" << (i * 2) + 1 << ";\n"; str << " vec4 blur_sum;\n"; str << " blur_sum = " << info.func << " (texture0, vTexCoord0);\n"\ " blur_sum = blur_sum * " << amp[numTexop] << ";\n"; for (j = 0; j < numIndirect; j++) { base = j * numIndirectOp; end = MIN ((j + 1) * numIndirectOp, numTexop) - base; ITCbase = MAX (numITC - base, 0); for (i = ITCbase; i < end; i++) str << " blur_coord_" << i * 2 << " = vTexCoord0 + vec2 (" << pos[base + i] * tx << ", 0.0);\n"\ " blur_coord_" << (i * 2) + 1 << " = vTexCoord0 - vec2 (" << pos[base + i] * tx << ", 0.0);\n"; #if INDEPENDENT_TEX_SUPPORTED for (i = 0; i < ITCbase; i++) str << sprintf (str, "TEX pix_%d, fragment.texcoord[%d], texture[0], %s;" "TEX pix_%d, fragment.texcoord[%d], texture[0], %s;", i * 2, ((i + base) * 2) + 1, targetString, (i * 2) + 1, ((i + base) * 2) + 2, targetString); #endif for (i = ITCbase; i < end; i++) str << " blur_pix_" << (i * 2) << " = " << info.func << " (texture0, blur_coord_" << i * 2 << ");\n"\ " blur_pix_" << (i * 2) + 1 << " = " << info.func << " (texture0, blur_coord_" << (i * 2) + 1 << ");\n"; for (i = 0; i < end * 2; i++) str << " blur_sum += blur_pix_" << i << " * " << amp[base + (i / 2)] << ";\n"; } str << " gl_FragColor = blur_sum;\n"\ "}"; return loadFragmentProgram (program, svtx.str ().c_str (), str.str ().c_str ()); } bool BlurScreen::fboPrologue () { if (!fbo) return false; oldDrawFramebuffer = fbo->bind (); return true; } void BlurScreen::fboEpilogue () { oldDrawFramebuffer->bind (); fbo->tex ()->enable (GLTexture::Good); //GL::generateMipmap (fbo->tex ()->target ()); fbo->tex ()->disable (); } bool BlurScreen::fboUpdate (BoxPtr pBox, int nBox) { float iTC = 0; bool wasCulled = glIsEnabled (GL_CULL_FACE); if (GL::maxTextureUnits && optionGetIndependentTex () && false) iTC = MIN ((GL::maxTextureUnits - 1) / 2, numTexop); if (!program) if (!loadFilterProgram (iTC)) return false; if (!fboPrologue ()) return false; glDisable (GL_CULL_FACE); GL::activeTexture (GL_TEXTURE0); texture[0]->enable (GLTexture::Good); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); while (nBox--) { float x1 = pBox->x1; float x2 = pBox->x2; float y1 = screen->height () - pBox->y2; float y2 = screen->height () - pBox->y1; GLfloat texCoords[] = { tx * x1, ty * y1, tx * x1, ty * y2, tx * x2, ty * y1, tx * x2, ty * y2 }; GLfloat vertices[] = { x1, y1, 0, x1, y2, 0, x2, y1, 0, x2, y2, 0 }; GLMatrix mv; mv.toScreenSpace (output, -DEFAULT_Z_CAMERA); streamingBuffer->begin (GL_TRIANGLE_STRIP); streamingBuffer->setProgram (program.get ()); streamingBuffer->addTexCoords (0, 4, texCoords); streamingBuffer->addVertices (4, vertices); if (streamingBuffer->end ()) streamingBuffer->render (mv); /* Unset program */ streamingBuffer->setProgram (NULL); pBox++; } if (wasCulled) glEnable (GL_CULL_FACE); fboEpilogue (); return true; } static const unsigned short MAX_VERTEX_PROJECT_COUNT = 20; void BlurWindow::projectRegion (CompOutput *output, const GLMatrix &transform) { float scrv[MAX_VERTEX_PROJECT_COUNT * 2]; float vertices[MAX_VERTEX_PROJECT_COUNT * 3]; int nVertices, nQuadCombine; int i, j, stride; float *v, *vert; float minX, maxX, minY, maxY, minZ, maxZ; float *scr; GLTexture::MatrixList ml; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (ml, bScreen->tmpRegion2, CompRegion::infinite ()); if (!gWindow->vertexBuffer ()->end ()) return; GLVertexBuffer *vb = gWindow->vertexBuffer (); nVertices = vb->countVertices (); nQuadCombine = 1; stride = vb->getVertexStride (); vert = vb->getVertices () + (stride - 3); /* construct quads from bounding vertices */ minX = screen->width (); maxX = 0; minY = screen->height (); maxY = 0; minZ = 1000000; maxZ = -1000000; for (i = 0; i < vb->countVertices (); i++) { v = vert + (stride * i); if (v[0] < minX) minX = v[0]; if (v[0] > maxX) maxX = v[0]; if (v[1] < minY) minY = v[1]; if (v[1] > maxY) maxY = v[1]; if (v[2] < minZ) minZ = v[2]; if (v[2] > maxZ) maxZ = v[2]; } vertices[0] = vertices[9] = minX; vertices[1] = vertices[4] = minY; vertices[3] = vertices[6] = maxX; vertices[7] = vertices[10] = maxY; vertices[2] = vertices[5] = maxZ; vertices[8] = vertices[11] = maxZ; nVertices = 4; if (maxZ != minZ) { vertices[12] = vertices[21] = minX; vertices[13] = vertices[16] = minY; vertices[15] = vertices[18] = maxX; vertices[19] = vertices[22] = maxY; vertices[14] = vertices[17] = minZ; vertices[20] = vertices[23] = minZ; nQuadCombine = 2; } if (!bScreen->projectVertices (output, transform, vertices, scrv, nVertices * nQuadCombine)) return; for (i = 0; i < nVertices / 4; i++) { scr = scrv + (i * 4 * 2); minX = screen->width (); maxX = 0; minY = screen->height (); maxY = 0; for (j = 0; j < 8 * nQuadCombine; j += 2) { if (scr[j] < minX) minX = scr[j]; if (scr[j] > maxX) maxX = scr[j]; if (scr[j + 1] < minY) minY = scr[j + 1]; if (scr[j + 1] > maxY) maxY = scr[j + 1]; } int x1, y1, x2, y2; x1 = minX - bScreen->filterRadius - 0.5; y1 = screen->height () - maxY - bScreen->filterRadius - 0.5; x2 = maxX + bScreen->filterRadius + 0.5; y2 = screen->height () - minY + bScreen->filterRadius + 0.5; bScreen->tmpRegion3 += CompRect (x1, y1, x2 - x1, y2 - y1); } } void BlurWindow::determineBlurRegion (int filter, const GLMatrix &transform, int clientThreshold) { bScreen->tmpRegion3 = CompRegion (); if (filter == BlurOptions::FilterGaussian) { if (state[BLUR_STATE_DECOR].threshold) { int xx, yy, ww, hh; // top xx = window->x () - window->output ().left; yy = window->y () - window->output ().top; ww = window->width () + window->output ().left + window->output ().right; hh = window->output ().top; bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); // bottom xx = window->x () - window->output ().left; yy = window->y () + window->height (); ww = window->width () + window->output ().left + window->output ().right; hh = window->output ().bottom; bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); // left xx = window->x () - window->output ().left; yy = window->y (); ww = window->output ().left; hh = window->height (); bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); // right xx = window->x () + window->width (); yy = window->y (); ww = window->output ().right; hh = window->height (); bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (xx, yy, ww, hh)); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); } if (clientThreshold) { // center bScreen->tmpRegion2 = bScreen->tmpRegion.intersected ( CompRect (window->x (), window->y (), window->width (), window->height ())); if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); } } else { // center bScreen->tmpRegion2 = bScreen->tmpRegion; if (!bScreen->tmpRegion2.isEmpty ()) projectRegion (bScreen->output, transform); } projectedBlurRegion = bScreen->tmpRegion3; } bool BlurWindow::updateDstTexture (const GLMatrix &transform, CompRect *pExtents, unsigned int mask) { bool ret = false; int filter = bScreen->optionGetFilter (); /* Paint region n projected region */ bScreen->tmpRegion = bScreen->region.intersected (projectedBlurRegion); if (!bScreen->blurOcclusion && !(mask & PAINT_WINDOW_TRANSFORMED_MASK)) bScreen->tmpRegion -= clip; if (bScreen->tmpRegion.isEmpty ()) return false; CompRect br (bScreen->tmpRegion.boundingRect ()); if (bScreen->texture.empty () || CompSize (bScreen->texture[0]->width (), bScreen->texture[0]->height ()) != static_cast (*screen)) { bScreen->texture = GLTexture::imageDataToTexture (NULL, *screen, GL_RGB, #if IMAGE_BYTE_ORDER == MSBFirst GL_UNSIGNED_INT_8_8_8_8_REV); #else GL_UNSIGNED_BYTE); #endif if (bScreen->texture[0]->target () == GL_TEXTURE_2D) { bScreen->tx = 1.0f / bScreen->texture[0]->width (); bScreen->ty = 1.0f / bScreen->texture[0]->height (); } else { bScreen->tx = 1; bScreen->ty = 1; } if (filter == BlurOptions::FilterGaussian) { bScreen->fbo->allocate (*screen, NULL, GL_BGRA); /* We have to bind it in order to get a status */ GLFramebufferObject *old = bScreen->fbo->bind(); bool status = bScreen->fbo->checkStatus (); old->bind(); if (!status) compLogMessage ("blur", CompLogLevelError, "Failed to create framebuffer object"); else { unsigned int filter = (bScreen->gScreen->driverHasBrokenFBOMipmaps () ? GL_LINEAR : GL_LINEAR_MIPMAP_LINEAR); bScreen->gScreen->setTextureFilter (filter); bScreen->fbo->tex ()->enable (GLTexture::Good); const CompRect &r (*bScreen->fbo->tex ()); glCopyTexSubImage2D (bScreen->fbo->tex ()->target (), 0, 0, 0, 0, 0, r.width (), r.height ()); if (!bScreen->gScreen->driverHasBrokenFBOMipmaps ()) GL::generateMipmap (bScreen->fbo->tex ()->target ()); bScreen->fbo->tex ()->disable (); } } /* Set update region to entire screen */ br.setGeometry (0, 0, screen->width (), screen->height ()); } *pExtents = br; CompRegion *updateRegion = NULL; updateRegion = &bScreen->tmpRegion; foreach (GLTexture *tex, bScreen->texture) { /* We need to set the active texture filter to GL_LINEAR_MIPMAP_LINEAR */ if (filter == BlurOptions::FilterMipmap && !bScreen->gScreen->driverHasBrokenFBOMipmaps ()) bScreen->gScreen->setTextureFilter (GL_LINEAR_MIPMAP_LINEAR); tex->enable (GLTexture::Good); CompRect::vector rects (updateRegion->rects ()); foreach (const CompRect &r, rects) { int y = screen->height () - r.y2 (); glCopyTexSubImage2D (bScreen->texture[0]->target (), 0, r.x1 (), y, r.x1 (), y, r.width (), r.height ()); } /* Force mipmap regeneration, because GLTexture assumes static * textures and won't do it for us */ if (filter == BlurOptions::FilterMipmap && !bScreen->gScreen->driverHasBrokenFBOMipmaps ()) GL::generateMipmap (tex->target ()); if (filter == BlurOptions::FilterGaussian) ret |= bScreen->fboUpdate (updateRegion->handle ()->rects, updateRegion->numRects ()); else ret = true; tex->disable (); } return ret; } bool BlurWindow::glDraw (const GLMatrix &transform, const GLWindowPaintAttrib &attrib, const CompRegion ®ion, unsigned int mask) { bool status; if (bScreen->alphaBlur && !region.isEmpty ()) { int clientThreshold; /* only care about client window blurring when it's translucent */ if (mask & PAINT_WINDOW_TRANSLUCENT_MASK) clientThreshold = state[BLUR_STATE_CLIENT].threshold; else clientThreshold = 0; if (state[BLUR_STATE_DECOR].threshold || clientThreshold) { bool clipped = false; CompRect box (0, 0, 0, 0); bScreen->mvp = *(bScreen->gScreen->projectionMatrix ()); bScreen->mvp *= transform; if (updateDstTexture (transform, &box, mask)) { if (clientThreshold) { if (state[BLUR_STATE_CLIENT].clipped) { if (bScreen->stencilBits) { state[BLUR_STATE_CLIENT].active = true; clipped = true; } } else { state[BLUR_STATE_CLIENT].active = true; } } if (state[BLUR_STATE_DECOR].threshold) { if (state[BLUR_STATE_DECOR].clipped) { if (bScreen->stencilBits) { state[BLUR_STATE_DECOR].active = true; clipped = true; } } else { state[BLUR_STATE_DECOR].active = true; } } if (!bScreen->blurOcclusion && !clip.isEmpty ()) clipped = true; } if (!bScreen->blurOcclusion) bScreen->tmpRegion = this->region - clip; else bScreen->tmpRegion = this->region; if (!clientThreshold) { bScreen->tmpRegion -= CompRect (window->x (), window->x () + window->width (), window->y (), window->y () + window->height ()); } if (clipped) { GLTexture::MatrixList ml; const CompRegion *reg = NULL; if (mask & PAINT_WINDOW_TRANSFORMED_MASK) reg = &CompRegion::infinite (); else reg = ®ion; gWindow->vertexBuffer ()->begin (); gWindow->glAddGeometry (ml, bScreen->tmpRegion, *reg); gWindow->vertexBuffer ()->color4f (1.0, 1.0, 1.0, 1.0); if (gWindow->vertexBuffer ()->end ()) { CompRect clearBox = bScreen->stencilBox; bScreen->stencilBox = box; glEnable (GL_STENCIL_TEST); glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glStencilMask (1); if (clearBox.x2 () > clearBox.x1 () && clearBox.y2 () > clearBox.y1 ()) { /* We might have a previous scissor region, so we need * to fetch it, however slow that might be .. */ GLint scissorBox[4]; GLboolean scissorEnabled; scissorEnabled = glIsEnabled (GL_SCISSOR_TEST); glGetIntegerv (GL_SCISSOR_BOX, scissorBox); if (!scissorEnabled) glEnable (GL_SCISSOR_TEST); glScissor (clearBox.x1 (), screen->height () - clearBox.y2 (), clearBox.width (), clearBox.height ()); glClearStencil (0); glClear (GL_STENCIL_BUFFER_BIT); if (!scissorEnabled) glDisable (GL_SCISSOR_TEST); glScissor (scissorBox[0], scissorBox[1], scissorBox[2], scissorBox[3]); } glStencilFunc (GL_ALWAYS, 1, 1); glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); /* Render a white polygon where the window is */ gWindow->vertexBuffer ()->render (transform); glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilMask (0); glDisable (GL_STENCIL_TEST); } } } } status = gWindow->glDraw (transform, attrib, region, mask); state[BLUR_STATE_CLIENT].active = false; state[BLUR_STATE_DECOR].active = false; return status; } namespace { void setupShadersAndUniformsForDstBlur (GLTexture *texture, GLWindow *gWindow, BlurScreen *bScreen, int &unit, int &iTC, float threshold) { GLfloat dx, dy; switch (bScreen->optionGetFilter ()) { case BlurOptions::Filter4xbilinear: { dx = bScreen->tx / 2.1f; dy = bScreen->ty / 2.1f; unit = 1; // FIXME!! const CompString &function ( bScreen->getDstBlurFragmentFunction ( texture, unit, 0, 0)); if (!function.empty ()) { (*GL::activeTexture) (GL_TEXTURE0 + unit); bScreen->texture[0]->enable (GLTexture::Good); gWindow->vertexBuffer ()->addTexCoords (unit, 0, NULL); (*GL::activeTexture) (GL_TEXTURE0); gWindow->addShaders ("blur", "", function); gWindow->vertexBuffer ()->addUniform4f ("blur_translation", bScreen->tx, bScreen->ty, 0.0f, 0.0f); gWindow->vertexBuffer ()->addUniform4f ("blur_threshold", threshold, threshold, threshold, threshold); gWindow->vertexBuffer ()->addUniform4f ("blur_dxdy", dx, dy, 0.0, 0.0); } } break; case BlurOptions::FilterGaussian: { #if INDEPENDENT_TEX_SUPPORTED if (bScreen->optionGetIndependentTex ()) { /* leave one free texture unit for fragment position */ iTC = MAX (0, GL::maxTextureUnits - (gWindow->geometry ().texUnits + 1)); if (iTC) iTC = MIN (iTC / 2, bScreen->numTexop); } #endif unit = 1; const CompString &function ( bScreen->getDstBlurFragmentFunction ( texture, unit, iTC, gWindow->vertexBuffer ()->countTextures ())); if (!function.empty ()) { gWindow->addShaders ("blur", "", function); (*GL::activeTexture) (GL_TEXTURE0 + unit); bScreen->texture[0]->enable (GLTexture::Good); gWindow->vertexBuffer ()->addTexCoords (unit, 0, NULL); (*GL::activeTexture) (GL_TEXTURE0 + unit + 1); bScreen->fbo->tex ()->enable (GLTexture::Good); gWindow->vertexBuffer ()->addTexCoords (unit + 1, 0, NULL); (*GL::activeTexture) (GL_TEXTURE0); gWindow->vertexBuffer ()->addUniform4f ("blur_translation", bScreen->tx, bScreen->ty, 0.0f, 0.0f); gWindow->vertexBuffer ()->addUniform4f ("blur_threshold", threshold, threshold, threshold, threshold); #if INDEPENDENT_TEX_SUPPORTED if (iTC) { GLMatrix tm, rm; float s_gen[4], t_gen[4], q_gen[4]; for (unsigned int i = 0; i < 16; i++) tm[i] = 0; tm[0] = (bScreen->output->width () / 2.0) * bScreen->tx; tm[5] = (bScreen->output->height () / 2.0) * bScreen->ty; tm[10] = 1; tm[12] = (bScreen->output->width () / 2.0 + bScreen->output->x1 ()) * bScreen->tx; tm[13] = (bScreen->output->height () / 2.0 + screen->height () - bScreen->output->y2 ()) * bScreen->ty; tm[14] = 1; tm[15] = 1; tm *= bScreen->mvp; for (int i = 0; i < iTC; i++) { (*GL::activeTexture) (GL_TEXTURE0 + gWindow->geometry ().texUnits + (i * 2)); rm.reset (); rm[13] = bScreen->ty * bScreen->pos[i]; rm *= tm; s_gen[0] = rm[0]; s_gen[1] = rm[4]; s_gen[2] = rm[8]; s_gen[3] = rm[12]; t_gen[0] = rm[1]; t_gen[1] = rm[5]; t_gen[2] = rm[9]; t_gen[3] = rm[13]; q_gen[0] = rm[3]; q_gen[1] = rm[7]; q_gen[2] = rm[11]; q_gen[3] = rm[15]; glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen); glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen); glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen); glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glEnable (GL_TEXTURE_GEN_S); glEnable (GL_TEXTURE_GEN_T); glEnable (GL_TEXTURE_GEN_Q); (*GL::activeTexture) (GL_TEXTURE0 + gWindow->geometry ().texUnits + 1 + (i * 2)); rm.reset (); rm[13] = -bScreen->ty * bScreen->pos[i]; rm *= tm; s_gen[0] = rm[0]; s_gen[1] = rm[4]; s_gen[2] = rm[8]; s_gen[3] = rm[12]; t_gen[0] = rm[1]; t_gen[1] = rm[5]; t_gen[2] = rm[9]; t_gen[3] = rm[13]; q_gen[0] = rm[3]; q_gen[1] = rm[7]; q_gen[2] = rm[11]; q_gen[3] = rm[15]; glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen); glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen); glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen); glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glEnable (GL_TEXTURE_GEN_S); glEnable (GL_TEXTURE_GEN_T); glEnable (GL_TEXTURE_GEN_Q); } (*GL::activeTexture) (GL_TEXTURE0); } #endif } } break; case BlurOptions::FilterMipmap: { unit = 1; // FIXME!! const CompString &function ( bScreen->getDstBlurFragmentFunction (texture, unit, 0, 0)); if (!function.empty ()) { float lod = bScreen->optionGetMipmapLod (); gWindow->addShaders ("blur", "", function); (*GL::activeTexture) (GL_TEXTURE0 + unit); bScreen->texture[0]->enable (GLTexture::Good); gWindow->vertexBuffer ()->addTexCoords (unit, 0, NULL); (*GL::activeTexture) (GL_TEXTURE0); gWindow->vertexBuffer ()->addUniform4f ("blur_translation", bScreen->tx, bScreen->ty, 0.0f, lod); gWindow->vertexBuffer ()->addUniform4f ("blur_threshold", threshold, threshold, threshold, threshold); } } break; } } } void BlurWindow::glDrawTexture (GLTexture *texture, const GLMatrix &matrix, const GLWindowPaintAttrib &attrib, unsigned int mask) { int state = BLUR_STATE_DECOR; foreach (GLTexture *tex, gWindow->textures ()) if (texture == tex) state = BLUR_STATE_CLIENT; if (blur || this->state[state].active) { int unit = 0; int iTC = 0; if (blur) { GLfloat dx, dy; const CompString &function ( bScreen->getSrcBlurFragmentFunction (texture)); if (!function.empty ()) { gWindow->addShaders ("focusblur", "", function); dx = ((texture->matrix ().xx / 2.1f) * blur) / 65535.0f; dy = ((texture->matrix ().yy / 2.1f) * blur) / 65535.0f; gWindow->vertexBuffer ()->addUniform4f ("focusblur_input_offset", dx, dy, dx, -dy); /* bi-linear filtering is required */ mask |= PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; } } /* We are drawing the scraped texture, blur it */ if (this->state[state].active) { setupShadersAndUniformsForDstBlur (texture, gWindow, bScreen, unit, iTC, this->state[state].threshold); if (this->state[state].clipped || (!bScreen->blurOcclusion && !clip.isEmpty ())) { glEnable (GL_STENCIL_TEST); /* Don't touch the stencil buffer */ glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); /* Draw region with blur only where the stencil test passes */ glStencilFunc (GL_EQUAL, 1, 1); /* draw region with destination blur - we are relying * on a fairly awkward side-effect here which clears our * active shader once this call is complete */ gWindow->glDrawTexture (texture, matrix, attrib, mask); /* Allow drawing in everywhere but where we just drew */ glStencilFunc (GL_EQUAL, 0, 1); /* draw region without destination blur */ gWindow->glDrawTexture (texture, matrix, attrib, mask); glDisable (GL_STENCIL_TEST); } else { /* draw with destination blur */ gWindow->glDrawTexture (texture, matrix, attrib, mask); } } else { gWindow->glDrawTexture (texture, matrix, attrib, mask); } if (unit) { (*GL::activeTexture) (GL_TEXTURE0 + unit); bScreen->texture[0]->disable (); (*GL::activeTexture) (GL_TEXTURE0 + unit + 1); if (bScreen->fbo && bScreen->fbo->tex ()) bScreen->fbo->tex ()->disable (); (*GL::activeTexture) (GL_TEXTURE0); } #if INDEPENDENT_TEX_SUPPORTED if (iTC) { int i; for (i = gWindow->geometry ().texUnits; i < gWindow->geometry ().texUnits + (2 * iTC); i++) { (*GL::activeTexture) (GL_TEXTURE0 + i); glDisable (GL_TEXTURE_GEN_S); glDisable (GL_TEXTURE_GEN_T); glDisable (GL_TEXTURE_GEN_Q); } (*GL::activeTexture) (GL_TEXTURE0); } #endif } else { gWindow->glDrawTexture (texture, matrix, attrib, mask); } } void BlurScreen::handleEvent (XEvent *event) { Window activeWindow = screen->activeWindow (); screen->handleEvent (event); if (screen->activeWindow () != activeWindow) { CompWindow *w; w = screen->findWindow (activeWindow); if (w) { if (optionGetFocusBlur ()) { CompositeWindow::get (w)->addDamage (); moreBlur = true; } } w = screen->findWindow (screen->activeWindow ()); if (w) { if (optionGetFocusBlur ()) { CompositeWindow::get (w)->addDamage (); moreBlur = true; } } } if (event->type == PropertyNotify) { int i; for (i = 0; i < BLUR_STATE_NUM; i++) { if (event->xproperty.atom == blurAtom[i]) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) BlurWindow::get (w)->update (i); } } } } void BlurWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) { if (bScreen->alphaBlur) { if (state[BLUR_STATE_CLIENT].threshold || state[BLUR_STATE_DECOR].threshold) updateRegion (); } window->resizeNotify (dx, dy, dwidth, dheight); } void BlurWindow::moveNotify (int dx, int dy, bool immediate) { if (!region.isEmpty ()) region.translate (dx, dy); window->moveNotify (dx, dy, immediate); } static bool blurPulse (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; int xid; xid = CompOption::getIntOptionNamed (options, "window", screen->activeWindow ()); w = screen->findWindow (xid); if (w && GL::shaders) { BLUR_SCREEN (screen); BLUR_WINDOW (w); bw->pulse = true; bs->moreBlur = true; bw->cWindow->addDamage (); } return false; } void BlurScreen::matchExpHandlerChanged () { screen->matchExpHandlerChanged (); /* match options are up to date after the call to matchExpHandlerChanged */ foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->updateMatch (); } void BlurScreen::matchPropertyChanged (CompWindow *w) { BlurWindow::get (w)->updateMatch (); screen->matchPropertyChanged (w); } bool BlurScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = BlurOptions::setOption (name, value); if (!rv || !CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case BlurOptions::BlurSpeed: blurTime = 1000.0f / optionGetBlurSpeed (); break; case BlurOptions::FocusBlurMatch: case BlurOptions::AlphaBlurMatch: foreach (CompWindow *w, screen->windows ()) BlurWindow::get (w)->updateMatch (); moreBlur = true; cScreen->damageScreen (); break; case BlurOptions::FocusBlur: moreBlur = true; cScreen->damageScreen (); break; case BlurOptions::AlphaBlur: if (GL::shaders && optionGetAlphaBlur ()) alphaBlur = true; else alphaBlur = false; cScreen->damageScreen (); break; case BlurOptions::Filter: blurReset (); cScreen->damageScreen (); break; case BlurOptions::GaussianRadius: case BlurOptions::GaussianStrength: case BlurOptions::IndependentTex: if (optionGetFilter () == BlurOptions::FilterGaussian) { blurReset (); cScreen->damageScreen (); } break; case BlurOptions::MipmapLod: if (optionGetFilter () == BlurOptions::FilterMipmap) { blurReset (); cScreen->damageScreen (); } break; case BlurOptions::Saturation: blurReset (); cScreen->damageScreen (); break; case BlurOptions::Occlusion: blurOcclusion = optionGetOcclusion (); blurReset (); cScreen->damageScreen (); break; default: break; } return rv; } BlurScreen::BlurScreen (CompScreen *screen) : PluginClassHandler (screen), gScreen (GLScreen::get (screen)), cScreen (CompositeScreen::get (screen)), moreBlur (false), filterRadius (0), srcBlurFunctions (0), dstBlurFunctions (0), output (NULL), count (0), maxTemp (32), fbo (new GLFramebufferObject ()), oldDrawFramebuffer (NULL), determineProjectedBlurRegionsPass (false), damageQuery (cScreen->getDamageQuery (boost::bind ( &BlurScreen::markAreaDirty, this, _1))) { blurAtom[BLUR_STATE_CLIENT] = XInternAtom (screen->dpy (), "_COMPIZ_WM_WINDOW_BLUR", 0); blurAtom[BLUR_STATE_DECOR] = XInternAtom (screen->dpy (), DECOR_BLUR_ATOM_NAME, 0); blurTime = 1000.0f / optionGetBlurSpeed (); blurOcclusion = optionGetOcclusion (); glGetIntegerv (GL_STENCIL_BITS, &stencilBits); if (!stencilBits) compLogMessage ("blur", CompLogLevelWarn, "No stencil buffer. Region based blur disabled"); /* We need GL_ARB_shading_language_100 for blur */ if (GL::shaders) alphaBlur = optionGetAlphaBlur (); else alphaBlur = false; if (GL::shaders) { maxTemp = 1024; // FIXME!!!!!!! } updateFilterRadius (); optionSetPulseInitiate (blurPulse); ScreenInterface::setHandler (screen, true); CompositeScreenInterface::setHandler (cScreen, true); GLScreenInterface::setHandler (gScreen, true); } BlurScreen::~BlurScreen () { cScreen->damageScreen (); } BlurWindow::BlurWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), bScreen (BlurScreen::get (screen)), blur (0), pulse (false), focusBlur (false) { for (int i = 0; i < BLUR_STATE_NUM; i++) { state[i].threshold = 0; state[i].clipped = false; state[i].active = false; propSet[i] = false; } update (BLUR_STATE_CLIENT); update (BLUR_STATE_DECOR); updateMatch (); WindowInterface::setHandler (window, true); GLWindowInterface::setHandler (gWindow, true); } BlurWindow::~BlurWindow () { } bool BlurPluginVTable::init () { if (!CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) | !CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) | !CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return false; return true; } ./plugins/blur/src/blur.h0000644000004100000410000001461313246301623015601 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include "blur_options.h" #include #include #include #include const unsigned short BLUR_GAUSSIAN_RADIUS_MAX = 15; const unsigned short BLUR_STATE_CLIENT = 0; const unsigned short BLUR_STATE_DECOR = 1; const unsigned short BLUR_STATE_NUM = 2; struct BlurFunction { CompString shader; int target; int startTC; int numITC; int saturation; }; struct BlurBox { decor_point_t p1; decor_point_t p2; }; struct BlurState { int threshold; std::vector box; bool active; bool clipped; }; class BlurScreen : public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public PluginClassHandler, public BlurOptions { public: BlurScreen (CompScreen *screen); ~BlurScreen (); bool setOption (const CompString &name, CompOption::Value &value); void handleEvent (XEvent *); virtual void matchExpHandlerChanged (); virtual void matchPropertyChanged (CompWindow *window); void preparePaint (int); void donePaint (); void damageCutoff (); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void glPaintTransformedOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int); void updateFilterRadius (); void blurReset (); const CompString & getSrcBlurFragmentFunction (GLTexture *); const CompString & getDstBlurFragmentFunction (GLTexture *texture, int unit, int numITC, int startTC); bool projectVertices (CompOutput *output, const GLMatrix &transform, const float *object, float *scr, int n); bool loadFragmentProgram (boost::shared_ptr &program, const char *vertex, const char *fragment); bool loadFilterProgram (int numITC); bool fboPrologue (); void fboEpilogue (); bool fboUpdate (BoxPtr pBox, int nBox); public: GLScreen *gScreen; CompositeScreen *cScreen; Atom blurAtom[BLUR_STATE_NUM]; bool alphaBlur; int blurTime; bool moreBlur; bool blurOcclusion; int filterRadius; std::vector srcBlurFunctions; std::vector dstBlurFunctions; CompRegion region; CompRegion tmpRegion; CompRegion tmpRegion2; CompRegion tmpRegion3; CompRegion occlusion; CompRect stencilBox; GLint stencilBits; CompOutput *output; int count; GLTexture::List texture; float tx; float ty; int width; int height; boost::shared_ptr program; int maxTemp; boost::shared_ptr fbo; GLFramebufferObject *oldDrawFramebuffer; float amp[BLUR_GAUSSIAN_RADIUS_MAX]; float pos[BLUR_GAUSSIAN_RADIUS_MAX]; int numTexop; GLMatrix mvp; bool determineProjectedBlurRegionsPass; bool allowAreaDirtyOnOwnDamageBuffer; CompRegion backbufferUpdateRegionThisFrame; compiz::composite::buffertracking::AgeDamageQuery::Ptr damageQuery; private: bool markAreaDirty (const CompRegion &r); }; class BlurWindow : public WindowInterface, public GLWindowInterface, public PluginClassHandler { public: BlurWindow (CompWindow *window); ~BlurWindow (); void resizeNotify (int dx, int dy, int dwidth, int dheight); void moveNotify (int dx, int dy, bool immediate); bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int); void glTransformationComplete (const GLMatrix &matrix, const CompRegion ®ion, unsigned int mask); bool glDraw (const GLMatrix &, const GLWindowPaintAttrib &, const CompRegion &, unsigned int); void glDrawTexture (GLTexture *texture, const GLMatrix &, const GLWindowPaintAttrib &, unsigned int); void updateRegion (); void setBlur (int state, int threshold, std::vector box); void updateAlphaMatch (); void updateMatch (); void update (int state); void projectRegion (CompOutput *output, const GLMatrix &transform); void determineBlurRegion (int filter, const GLMatrix &transform, int clientThreshold); bool updateDstTexture (const GLMatrix &transform, CompRect *pExtents, unsigned int mask); public: CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; BlurScreen *bScreen; int blur; bool pulse; bool focusBlur; BlurState state[BLUR_STATE_NUM]; bool propSet[BLUR_STATE_NUM]; CompRegion region; CompRegion clip; CompRegion projectedBlurRegion; }; #define BLUR_SCREEN(s) \ BlurScreen *bs = BlurScreen::get (s) #define BLUR_WINDOW(w) \ BlurWindow *bw = BlurWindow::get (w) class BlurPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/titleinfo/0000755000004100000410000000000013246301624014722 5ustar www-datawww-data./plugins/titleinfo/CMakeLists.txt0000644000004100000410000000012213246301623017454 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (titleinfo) ./plugins/titleinfo/titleinfo.xml.in0000644000004100000410000000145513246301623020052 0ustar www-datawww-data <_short>Title Bar Info <_long>Shows additional information in the window title bar Utility composite opengl decor ./plugins/titleinfo/src/0000755000004100000410000000000013246301624015511 5ustar www-datawww-data./plugins/titleinfo/src/titleinfo.cpp0000644000004100000410000001435513246301623020221 0ustar www-datawww-data/* * * Compiz title bar information extension plugin * * titleinfo.cpp * * Copyright : (C) 2009 by Danny Baumann * E-mail : maniac@compiz.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "titleinfo.h" COMPIZ_PLUGIN_20090315 (titleinfo, TitleinfoPluginVTable); void TitleinfoWindow::updateVisibleName () { CompString root, text, f_machine; TITLEINFO_SCREEN (screen); CompString f_title = title.size () ? title : ""; if (ts->optionGetShowRoot () && owner == 0) root = "ROOT: "; if (ts->optionGetShowRemoteMachine () && remoteMachine.size ()) { char hostname[256]; if (gethostname (hostname, 256) || strcmp (hostname, remoteMachine.c_str ())) f_machine = remoteMachine; } if (f_machine.size ()) text = root + f_title + "(@" + f_machine + ")"; else if (root.size ()) text = root + f_title; if (text.size ()) { XChangeProperty (screen->dpy (), window->id (), ts->visibleNameAtom, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) text.c_str (), text.size ()); text.clear (); } else XDeleteProperty (screen->dpy (), window->id (), ts->visibleNameAtom); } void TitleinfoWindow::updatePid () { int pid = -1; Atom type; int format; unsigned long nItems, bytesAfter; unsigned char *propVal; TITLEINFO_SCREEN (screen); owner = -1; int result = XGetWindowProperty (screen->dpy (), window->id (), ts->wmPidAtom, 0L, 1L, False, XA_CARDINAL, &type, &format, &nItems, &bytesAfter, &propVal); if (result == Success && propVal) { if (nItems) { unsigned long value; memcpy (&value, propVal, sizeof (unsigned long)); pid = value; } XFree (propVal); } if (pid >= 0) { char path[512]; struct stat fileStat; snprintf (path, 512, "/proc/%d", pid); if (!lstat (path, &fileStat)) owner = fileStat.st_uid; } if (ts->optionGetShowRoot ()) updateVisibleName (); } CompString TitleinfoScreen::getUtf8Property (Window id, Atom atom) { Atom type; int format; unsigned long nItems, bytesAfter; char *val = NULL, *retval_c = NULL; CompString retval; int result = XGetWindowProperty (screen->dpy (), id, atom, 0L, 65536, False, Atoms::utf8String, &type, &format, &nItems, &bytesAfter, (unsigned char **) &val); if (result != Success) return retval; if (type == Atoms::utf8String && format == 8 && val && nItems > 0) { retval_c = (char *) malloc (sizeof (char) * (nItems + 1)); if (retval_c) { strncpy (retval_c, val, nItems); retval_c[nItems] = 0; } } if (retval_c) { retval = CompString (retval_c); free (retval_c); } if (val) XFree (val); return retval; } CompString TitleinfoScreen::getTextProperty (Window id, Atom atom) { XTextProperty text; char *retval_c = NULL; CompString retval; text.nitems = 0; if (XGetTextProperty (screen->dpy (), id, &text, atom)) { if (text.value) { retval_c = (char *) malloc (sizeof (char) * (text.nitems + 1)); if (retval_c) { strncpy (retval_c, (char *) text.value, text.nitems); retval_c[text.nitems] = 0; } XFree (text.value); } } if (retval_c) { retval = CompString (retval_c); free (retval_c); } return retval; } void TitleinfoWindow::updateTitle () { TITLEINFO_SCREEN (screen); CompString f_title = ts->getUtf8Property (window->id (), Atoms::wmName); if (f_title.empty ()) title = ts->getTextProperty (window->id (), XA_WM_NAME);\ title = f_title; updateVisibleName (); } void TitleinfoWindow::updateMachine () { TITLEINFO_SCREEN (screen); if (remoteMachine.size ()) remoteMachine.clear (); remoteMachine = ts->getTextProperty (window->id (), XA_WM_CLIENT_MACHINE); if (ts->optionGetShowRemoteMachine ()) updateVisibleName (); } void TitleinfoScreen::addSupportedAtoms (std::vector &atoms) { screen->addSupportedAtoms (atoms); atoms.push_back (visibleNameAtom); atoms.push_back (wmPidAtom); } void TitleinfoScreen::handleEvent (XEvent *event) { screen->handleEvent (event); if (event->type == PropertyNotify) { CompWindow *w; if (event->xproperty.atom == XA_WM_CLIENT_MACHINE) { w = screen->findWindow (event->xproperty.window); if (w) { TITLEINFO_WINDOW (w); tw->updateMachine (); } } else if (event->xproperty.atom == wmPidAtom) { w = screen->findWindow (event->xproperty.window); if (w) { TITLEINFO_WINDOW (w); tw->updatePid (); } } else if (event->xproperty.atom == Atoms::wmName || event->xproperty.atom == XA_WM_NAME) { w = screen->findWindow (event->xproperty.window); if (w) { TITLEINFO_WINDOW (w); tw->updateTitle (); } } } } TitleinfoScreen::TitleinfoScreen (CompScreen *screen) : PluginClassHandler (screen), visibleNameAtom (XInternAtom (screen->dpy (), "_NET_WM_VISIBLE_NAME", 0)), wmPidAtom (XInternAtom (screen->dpy (), "_NET_WM_PID", 0)) { ScreenInterface::setHandler (screen); screen->updateSupportedWmHints (); }; TitleinfoScreen::~TitleinfoScreen () { screen->addSupportedAtomsSetEnabled (this, false); screen->updateSupportedWmHints (); } TitleinfoWindow::TitleinfoWindow (CompWindow *window) : PluginClassHandler (window), window (window), owner (-1) { updateTitle (); updateMachine (); updatePid (); updateVisibleName (); } bool TitleinfoPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; }; ./plugins/titleinfo/src/titleinfo.h0000644000004100000410000000421213246301623017655 0ustar www-datawww-data/* * * Compiz title bar information extension plugin * * titleinfo.h * * Copyright : (C) 2009 by Danny Baumann * E-mail : maniac@compiz.org * * Ported to Compiz 0.9 by: * Copyright : (C) 2009 Sam Spilsbury * E-mail : smspillaz@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #include "titleinfo_options.h" class TitleinfoScreen : public PluginClassHandler , public ScreenInterface, public TitleinfoOptions { public: TitleinfoScreen (CompScreen *); ~TitleinfoScreen (); Atom visibleNameAtom; Atom wmPidAtom; void handleEvent (XEvent *); void addSupportedAtoms (std::vector &atoms); CompString getUtf8Property (Window id, Atom atom); CompString getTextProperty (Window id, Atom atom); }; #define TITLEINFO_SCREEN(s) \ TitleinfoScreen *ts = TitleinfoScreen::get (screen) class TitleinfoWindow : public PluginClassHandler { public: TitleinfoWindow (CompWindow *); CompWindow *window; CompString title; CompString remoteMachine; int owner; void updateMachine (); void updateTitle (); void updatePid (); void updateVisibleName (); }; #define TITLEINFO_WINDOW(w) \ TitleinfoWindow *tw = TitleinfoWindow::get (w); class TitleinfoPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/animationaddon/0000755000004100000410000000000013246301623015711 5ustar www-datawww-data./plugins/animationaddon/CMakeLists.txt0000644000004100000410000000017413246301623020453 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (animationaddon PLUGINDEPS composite opengl animation) ./plugins/animationaddon/include/0000755000004100000410000000000013246301623017334 5ustar www-datawww-data./plugins/animationaddon/include/animationaddon/0000755000004100000410000000000013246301623022321 5ustar www-datawww-data./plugins/animationaddon/include/animationaddon/animationaddon.h0000644000004100000410000002551413246301623025466 0ustar www-datawww-data#ifndef _COMPIZ_ANIMATIONADDON_H #define _COMPIZ_ANIMATIONADDON_H #define ANIMATIONADDON_ABI 20091206 #include #include #include using namespace::std; class PrivateAnimAddonScreen; class AnimAddonScreen : public PluginClassHandler, public CompOption::Class { public: AnimAddonScreen (CompScreen *); ~AnimAddonScreen (); CompOption::Vector &getOptions (); bool setOption (const CompString &name, CompOption::Value &value); int getIntenseTimeStep (); private: PrivateAnimAddonScreen *priv; }; /// Base class for all polygon- and particle-based animations class BaseAddonAnim : virtual public Animation { public: BaseAddonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~BaseAddonAnim () {} bool needsDepthTest () { return mDoDepthTest; } protected: /// Gets info about the extension plugin that implements this animation. ExtensionPluginInfo *getExtensionPluginInfo (); int mIntenseTimeStep; CompositeScreen *mCScreen; GLScreen *mGScreen; bool mDoDepthTest; ///< Whether depth testing should be used in the effect }; // Particle stuff class Particle { public: Particle () : life (0.0f) {} float life; ///< particle life float fade; ///< fade speed float width; ///< particle width float height; ///< particle height float w_mod; ///< particle size modification during life float h_mod; ///< particle size modification during life float r; ///< red value float g; ///< green value float b; ///< blue value float a; ///< alpha value float x; ///< X position float y; ///< Y position float z; ///< Z position float xi; ///< X direction float yi; ///< Y direction float zi; ///< Z direction float xg; ///< X gravity float yg; ///< Y gravity float zg; ///< Z gravity float xo; ///< orginal X position float yo; ///< orginal Y position float zo; ///< orginal Z position }; class ParticleSystem { friend class ParticleAnim; public: ParticleSystem (int numParticles, float slowdown, float darkenAmount, GLuint blendMode); ~ParticleSystem (); void draw (const GLMatrix &transform, int offsetX = 0, int offsetY = 0); void update (float time); vector &particles () { return mParticles; } void activate () { mActive = true; } bool active () { return mActive; } void setOrigin (int x, int y) { mX = x; mY = y; } protected: CompWindow *mWindow; vector mParticles; float mSlowDown; float mDarkenAmount; GLuint mBlendMode; GLuint mTex; bool mActive; int mX, mY; GLScreen *mGScreen; vector mVerticesCache; vector mCoordsCache; vector mColorsCache; vector mDColorsCache; }; class ParticleAnim : public BaseAddonAnim, public PartialWindowAnim { public: ParticleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~ParticleAnim () {} void postPaintWindow (const GLMatrix &); bool postPaintWindowUsed () { return true; } void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool prePreparePaint (int msSinceLastPaint); void initLightDarkParticles (int numLightParticles, int numDarkParticles, float lightSlowDown, float darkSlowDown); protected: boost::ptr_vector mParticleSystems; }; // Polygon stuff typedef enum { CorrectPerspectiveNone = 0, CorrectPerspectivePolygon, CorrectPerspectiveWindow } CorrectPerspective; /// Base class for per-PolygonObject effect parameter classes class PolygonEffectParameters { }; /// This is intended to be a closed 3D piece of a window with convex polygon /// faces and quad-strip sides. Since decoration texture is separate from /// the window texture, it is more complicated than it would be with a single /// texture: we use glClipPlane with the rectangles (clips) to clip 3D space /// to the region falling within that clip. /// If the polygon is on an edge/corner, it also has 2D shadow quad(s) /// (to be faded out at the beginning of 3D animation if necessary). class PolygonObject { public: int nVertices; ///< number of total vertices (front + back) int nSides; ///< number of sides GLfloat *vertices; ///< Positions of vertices relative to center GLushort *sideIndices; ///< Indices of quad strip for "sides" GLfloat *normals; ///< Surface normals for 2+nSides faces Boxf boundingBox; ///< Bound. box to test intersection with clips // Animation effect parameters Point3d centerPosStart; ///< Starting position of center float rotAngleStart; ///< Starting rotation angle Point3d centerPos; ///< Position of center Vector3d rotAxis; ///< Rotation axis vector float rotAngle; ///< Rotation angle Point3d rotAxisOffset; ///< Rotation axis translate amount Point centerRelPos; ///< Relative pos of center within the window Vector3d finalRelPos; ///< Velocity factor for scripted movement float finalRotAng; ///< Final rotation angle around rotAxis float moveStartTime; ///< Movement starts at this time ([0-1] range) float moveDuration; ///< Movement lasts this long ([0-1] range) float fadeStartTime; ///< Fade out starts at this time ([0,1] range) float fadeDuration; ///< Duration of fade out ([0,1] range) /** Pointer to a struct that can contain custom parameters for an individual effect */ PolygonEffectParameters *effectParameters; float boundSphereRadius; ///< Radius of bounding sphere }; /// Info about intersection of a polygon and clip class PolygonClipInfo { public: PolygonClipInfo (const PolygonObject *p); const PolygonObject *p; ///< the intersecting polygon-object /// Texture coord.s for each vertex of the polygon-object /// ordered as: Front v1.x, y, v2.x, y, ..., /// followed by back vertex texture coordinates. vector vertexTexCoords; }; class Clip4Polygons ///< Rectangular clips { ///< (to hold clips passed to AddWindowGeometry) public: CompRect box; ///< Coords Boxf boxf; ///< Float coords (for small clipping adjustment) GLTexture::Matrix texMatrix;///< Corresponding texture coord. matrix /// True if this clip likely intersects all polygons /// (for the window-contents clip). Used for optimization purposes. bool intersectsMostPolygons; /// For polygons that intersect this clip. /// Only used when intersectsMostPolygons is false. list intersectingPolygonInfos; /// Texture coord.s for each vertex of each polygon-object /// ordered as: Front p1.v1.x, y, p1.v2.x, .y, p2.v1.x, .y, ..., /// followed by back vertex texture coordinates. /// Only used when intersectsMostPolygons is true. vector polygonVertexTexCoords; }; class PolygonAnim : virtual public Animation, public BaseAddonAnim { public: PolygonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~PolygonAnim (); void step (); void prePaintWindow (); void postPaintWindow (const GLMatrix &); bool postPaintWindowUsed () { return true; } void addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clipRegion, unsigned int maxGridWidth, unsigned int maxGridHeight); void drawGeometry (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask); virtual void updateBB (CompOutput &output); bool updateBBUsed () { return true; } bool prePreparePaint (int msSinceLastPaint); bool moveUpdate (int dx, int dy); virtual void stepPolygon (PolygonObject *p, float forwardProgress); virtual void transformPolygon (GLMatrix &matrix, const PolygonObject *p) {} /// For effects that have decel. motion virtual bool deceleratingMotion () { return false; } bool tessellateIntoRectangles (int gridSizeX, int gridSizeY, float thickness); bool tessellateIntoHexagons (int gridSizeX, int gridSizeY, float thickness); bool tessellateIntoGlass (int gridSizeX, int gridSizeY, float thickness); void prePaintOutput (CompOutput *output); void deceleratingAnimStepPolygon (PolygonObject *p, float forwardProgress); protected: void getPerspectiveCorrectionMat (const PolygonObject *p, GLfloat *mat, GLMatrix *matf, const CompOutput &output); void processIntersectingPolygons (); virtual void freePolygonObjects (); void freeClipsPolygons (); void prepareDrawingForAttrib (GLWindowPaintAttrib &attrib, GLVertexBuffer &vertexBuffer); int mNumDrawGeometryCalls; int mNumClipsPassed; /**< # of clips passed to animAddWindowGeometry so far in this draw step */ bool mClipsUpdated; ///< whether stored clips are updated in this anim step vector mClips;///< Rect. clips collected in addGeometries int mFirstNondrawnClip; vector mLastClipInGroup;/**< Index of the last clip in each group of clips drawn in drawGeometry func. */ bool mDoLighting; ///< Whether lighting should be used in the effect CorrectPerspective mCorrectPerspective; vector mPolygons; ///< The polygons in this set float mThickness; ///< Window thickness (depth along z axis) int mNumTotalFrontVertices; ///< Total # of polygon vertices on front faces float mBackAndSidesFadeDur; ///< How long side and back faces should fade in/out float mAllFadeDuration; /**< Duration of fade out at the end in [0,1] range when all polygons fade out at the same time. If >-1, this overrides fadeDuration in PolygonObject */ bool mIncludeShadows; ///< Whether to include shadows in polygon private: inline void drawPolygonClipIntersection (GLTexture *texture, const GLMatrix &transform, const PolygonObject *p, const Clip4Polygons &c, const GLfloat *vertexTexCoords, int pass, float forwardProgress, const CompOutput &output, float newOpacity, bool decelerates, GLMatrix &skewMat); }; #endif ./plugins/animationaddon/src/0000755000004100000410000000000013246301624016501 5ustar www-datawww-data./plugins/animationaddon/src/burn.cpp0000644000004100000410000003005613246301623020156 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * burn.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Burn ========================= BurnAnim::BurnAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), ParticleAnim::ParticleAnim (w, curWindowEvent, duration, info, icon) { mDirection = getActualAnimDirection ((AnimDirection) optValI (AnimationaddonOptions::FireDirection), false); if (optValB (AnimationaddonOptions::FireConstantSpeed)) { int winHeight = w->height () + w->output ().top + w->output ().bottom; mTotalTime *= winHeight / 500.0; mRemainingTime *= winHeight / 500.0; } mMysticalFire = optValB (AnimationaddonOptions::FireMystical); mLife = optValF (AnimationaddonOptions::FireLife); mColor = optValC (AnimationaddonOptions::FireColor); mSize = optValF (AnimationaddonOptions::FireSize); mHasSmoke = optValB (AnimationaddonOptions::FireSmoke); mFirePSId = mHasSmoke ? 1 : 0; mSmokePSId = 0; int numFireParticles = optValI (AnimationaddonOptions::FireParticles); float slowDown = optValF (AnimationaddonOptions::FireSlowdown); // Light ParticleSystem is for smoke, which is optional. // Dark ParticleSystem is for fire. initLightDarkParticles (mHasSmoke ? numFireParticles / 10 : 0, numFireParticles, slowDown / 2.0f, slowDown); } void BurnAnim::genNewFire (int x, int y, int width, int height, float size, float time) { ParticleSystem &ps = mParticleSystems[mFirePSId]; unsigned numParticles = ps.particles ().size (); float fireLifeNeg = 1 - mLife; float fadeExtra = 0.2f * (1.01 - mLife); float max_new = numParticles * (time / 50) * (1.05 - mLife); float colr1 = (float)mColor[0] / 0xffff; float colg1 = (float)mColor[1] / 0xffff; float colb1 = (float)mColor[2] / 0xffff; float colr2 = 1 / 1.7 * (float)mColor[0] / 0xffff; float colg2 = 1 / 1.7 * (float)mColor[1] / 0xffff; float colb2 = 1 / 1.7 * (float)mColor[2] / 0xffff; float cola = (float)mColor[3] / 0xffff; float rVal; float partw = mSize; float parth = partw * 1.5; // Limit max number of new particles created simultaneously if (max_new > numParticles / 5) max_new = numParticles / 5; Particle *part = &ps.particles ()[0]; for (unsigned i = 0; i < numParticles && max_new > 0; i++, part++) { if (part->life <= 0.0f) { // give gt new life rVal = (float)(random () & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * fireLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partw; part->height = parth; rVal = (float)(random () & 0xff) / 255.0; part->w_mod = part->h_mod = size * rVal; // choose random position rVal = (float)(random () & 0xff) / 255.0; part->x = x + ((width > 1) ? (rVal * width) : 0); rVal = (float)(random () & 0xff) / 255.0; part->y = y + ((height > 1) ? (rVal * height) : 0); part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = part->z; // set speed and direction rVal = (float)(random () & 0xff) / 255.0; part->xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random () & 0xff) / 255.0; part->yi = ((rVal * 20.0) - 15.0f); part->zi = 0.0f; if (mMysticalFire) { // Random colors! (aka Mystical Fire) rVal = (float)(random () & 0xff) / 255.0; part->r = rVal; rVal = (float)(random () & 0xff) / 255.0; part->g = rVal; rVal = (float)(random () & 0xff) / 255.0; part->b = rVal; } else { rVal = (float)(random () & 0xff) / 255.0; part->r = colr1 - rVal * colr2; part->g = colg1 - rVal * colg2; part->b = colb1 - rVal * colb2; } // set transparancy part->a = cola; // set gravity part->xg = (part->x < part->xo) ? 1.0 : -1.0; part->yg = -3.0f; part->zg = 0.0f; ps.activate (); max_new -= 1; } else { part->xg = (part->x < part->xo) ? 1.0 : -1.0; } } } void BurnAnim::genNewSmoke (int x, int y, int width, int height, float size, float time) { ParticleSystem &ps = mParticleSystems[mSmokePSId]; unsigned numParticles = ps.particles ().size (); float fireLifeNeg = 1 - mLife; float fadeExtra = 0.2f * (1.01 - mLife); float max_new = numParticles * (time / 50) * (1.05 - mLife); float rVal; float partSize = mSize * size * 5; float sizeNeg = -size; // Limit max number of new particles created simultaneously if (max_new > numParticles) max_new = numParticles; Particle *part = &ps.particles ()[0]; for (unsigned i = 0; i < numParticles && max_new > 0; i++, part++) { if (part->life <= 0.0f) { // give gt new life rVal = (float)(random () & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * fireLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partSize; part->height = partSize; part->w_mod = -0.8; part->h_mod = -0.8; // choose random position rVal = (float)(random () & 0xff) / 255.0; part->x = x + ((width > 1) ? (rVal * width) : 0); rVal = (float)(random () & 0xff) / 255.0; part->y = y + ((height > 1) ? (rVal * height) : 0); part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = part->z; // set speed and direction rVal = (float)(random () & 0xff) / 255.0; part->xi = ((rVal * 20.0) - 10.0f); rVal = (float)(random () & 0xff) / 255.0; part->yi = (rVal + 0.2) * -size; part->zi = 0.0f; // set color rVal = (float)(random () & 0xff) / 255.0; part->r = rVal / 4.0; part->g = rVal / 4.0; part->b = rVal / 4.0; rVal = (float)(random () & 0xff) / 255.0; part->a = 0.5 + (rVal / 2.0); // set gravity part->xg = (part->x < part->xo) ? size : sizeNeg; part->yg = sizeNeg; part->zg = 0.0f; ps.activate (); max_new -= 1; } else { part->xg = (part->x < part->xo) ? size : sizeNeg; } } } void BurnAnim::step () { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float timestep = mIntenseTimeStep; float old = 1 - (mRemainingTime) / (mTotalTime - timestep); float stepSize; mRemainingTime -= timestep; if (mRemainingTime <= 0) mRemainingTime = 0; // avoid sub-zero values float newProgress = 1 - (mRemainingTime) / (mTotalTime - timestep); stepSize = newProgress - old; if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade) { newProgress = 1 - newProgress; } if (mRemainingTime > 0) { CompRect rect; switch (mDirection) { case AnimDirectionUp: rect = CompRect (0, 0, outRect.width (), outRect.height () - (newProgress * outRect.height ())); break; case AnimDirectionRight: rect = CompRect (newProgress * outRect.width (), 0, outRect.width () - (newProgress * outRect.width ()), outRect.height ()); break; case AnimDirectionLeft: rect = CompRect (0, 0, outRect.width () - (newProgress * outRect.width ()), outRect.height ()); break; case AnimDirectionDown: default: rect = CompRect (0, newProgress * outRect.height (), outRect.width (), outRect.height () - (newProgress * outRect.height ())); break; } rect.setX (rect.x () + outRect.x ()); rect.setY (rect.y () + outRect.y ()); mDrawRegion = CompRegion (rect); } else { mDrawRegion = CompRegion::empty (); } mUseDrawRegion = (fabs (newProgress) > 1e-5); if (mRemainingTime > 0) { switch (mDirection) { case AnimDirectionUp: if (mHasSmoke) genNewSmoke (outRect.x (), outRect.y () + ((1 - newProgress) * outRect.height ()), outRect.width (), 1, outRect.width () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x (), outRect.y () + ((1 - newProgress) * outRect.height ()), outRect.width (), (stepSize) * outRect.height (), outRect.width () / 40.0, mTimeSinceLastPaint); break; case AnimDirectionLeft: if (mHasSmoke) genNewSmoke (outRect.x () + ((1 - newProgress) * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x () + ((1 - newProgress) * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); break; case AnimDirectionRight: if (mHasSmoke) genNewSmoke (outRect.x () + (newProgress * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x () + (newProgress * outRect.width ()), outRect.y (), (stepSize) * outRect.width (), outRect.height (), outRect.height () / 40.0, mTimeSinceLastPaint); break; case AnimDirectionDown: default: if (mHasSmoke) genNewSmoke (outRect.x (), outRect.y () + (newProgress * outRect.height ()), outRect.width (), 1, outRect.width () / 40.0, mTimeSinceLastPaint); genNewFire (outRect.x (), outRect.y () + (newProgress * outRect.height ()), outRect.width (), (stepSize) * outRect.height (), outRect.width () / 40.0, mTimeSinceLastPaint); break; } } if (mRemainingTime <= 0 && (mParticleSystems[0].active () || (mHasSmoke && mParticleSystems[1].active ()))) // force animation to continue until particle systems are done mRemainingTime = timestep; Particle *part; if (mRemainingTime > 0) { int nParticles; if (mHasSmoke) { float partxg = outRect.width () / 40.0; float partxgNeg = -partxg; vector &particles = mParticleSystems[mSmokePSId].particles (); nParticles = particles.size (); part = &particles[0]; for (int i = 0; i < nParticles; i++, part++) part->xg = (part->x < part->xo) ? partxg : partxgNeg; mParticleSystems[mSmokePSId].setOrigin (outRect.x (), outRect.y ()); } vector &particles = mParticleSystems[mFirePSId].particles (); nParticles = particles.size (); part = &particles[0]; for (int i = 0; i < nParticles; i++, part++) part->xg = (part->x < part->xo) ? 1.0 : -1.0; } mParticleSystems[mFirePSId].setOrigin (outRect.x (), outRect.y ()); } ./plugins/animationaddon/src/private.h0000644000004100000410000002016513246301623020327 0ustar www-datawww-data#include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include #include #include "animationaddon_options.h" extern AnimEffect AnimEffectBurn; extern AnimEffect AnimEffectExplode; extern AnimEffect AnimEffectAirplane; extern AnimEffect AnimEffectBeamUp; extern AnimEffect AnimEffectDissolve; extern AnimEffect AnimEffectDomino; extern AnimEffect AnimEffectFold; extern AnimEffect AnimEffectGlide3; extern AnimEffect AnimEffectLeafSpread; extern AnimEffect AnimEffectRazr; extern AnimEffect AnimEffectSkewer; // TODO Update this for each added animation effect! (total: 11) extern const unsigned short NUM_EFFECTS; // This must have the value of the first "effect setting" above // in AnimAddonScreenOptions #define NUM_NONEFFECT_OPTIONS AnimationaddonOptions::AirplanePathLength class ExtensionPluginAnimAddon : public ExtensionPluginInfo { public: ExtensionPluginAnimAddon (const CompString &name, unsigned int nEffects, AnimEffect *effects, CompOption::Vector *effectOptions, unsigned int firstEffectOptionIndex) : ExtensionPluginInfo (name, nEffects, effects, effectOptions, firstEffectOptionIndex) {} virtual ~ExtensionPluginAnimAddon () {} void prePaintOutput (CompOutput *output); const CompOutput *output () { return mOutput; } private: const CompOutput *mOutput; }; class PrivateAnimAddonScreen : public AnimationaddonOptions { friend class AnimAddonScreen; public: PrivateAnimAddonScreen (CompScreen *); ~PrivateAnimAddonScreen (); protected: void initAnimationList (); CompOutput &mOutput; }; class AnimAddonWindow : public PluginClassHandler { public: AnimAddonWindow (CompWindow *); ~AnimAddonWindow (); protected: CompWindow *mWindow; ///< Window being animated. AnimWindow *aWindow; }; // Particle-based animations class BeamUpAnim : public ParticleAnim { public: BeamUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void init (); void step (); void genNewBeam (int x, int y, int width, int height, float size, float time); void updateAttrib (GLWindowPaintAttrib &wAttrib); float mLife; unsigned short *mColor; float mSize; int mSpacing; float mSlowdown; }; class BurnAnim : public ParticleAnim { public: BurnAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); protected: void step (); void genNewFire (int x, int y, int width, int height, float size, float time); void genNewSmoke (int x, int y, int width, int height, float size, float time); int mDirection; bool mMysticalFire; float mLife; unsigned short *mColor; float mSize; bool mHasSmoke; unsigned int mFirePSId; unsigned int mSmokePSId; }; // Polygon-based animations class ExplodeAnim : public PolygonAnim { public: ExplodeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; /// Extended polygon object for airplane folding and flying airplane fold phase. class AirplanePolygonObject : public PolygonObject { public: Vector3d rotAxisA; // Rotation axis vector A Vector3d rotAxisB; // Rotation axis vector B Point3d rotAxisOffsetA; // Rotation axis translate amount A Point3d rotAxisOffsetB; // Rotation axis translate amount B float rotAngleA; // Rotation angle A float finalRotAngA; // Final rotation angle A float rotAngleB; // Rotation angle B float finalRotAngB; // Final rotation angle B // airplane fly phase: Vector3d centerPosFly; // center position (offset) during the flying phases Vector3d flyRotation; // airplane rotation during the flying phases Vector3d flyFinalRotation; // airplane rotation during the flying phases float flyScale; // Scale for airplane flying effect float flyFinalScale; // Final Scale for airplane flying effect float flyTheta; // Theta parameter for fly rotations and positions float moveStartTime2; // Movement starts at this time ([0-1] range) float moveDuration2; // Movement lasts this long ([0-1] range) float moveStartTime3; // Movement starts at this time ([0-1] range) float moveDuration3; // Movement lasts this long ([0-1] range) float moveStartTime4; // Movement starts at this time ([0-1] range) float moveDuration4; // Movement lasts this long ([0-1] range) float moveStartTime5; // Movement starts at this time ([0-1] range) float moveDuration5; // Movement lasts this long ([0-1] range) }; class AirplaneAnim : public PolygonAnim { public: AirplaneAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); ~AirplaneAnim (); void stepPolygon (PolygonObject *p, float); void init (); void transformPolygon (GLMatrix &matrix, const PolygonObject *p); bool tesselateIntoAirplane (); void updateBB (CompOutput &); void freePolygonObjects (); static const float kDurationFactor; }; class DominoAnim : public PolygonAnim { public: DominoAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class RazrAnim : public DominoAnim { public: RazrAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); }; class FoldAnim : public PolygonAnim { public: FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void stepPolygon (PolygonObject *p, float); static const float kDurationFactor; }; class Glide3Anim : public PolygonAnim { public: Glide3Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); bool deceleratingMotion () { return true; } static const float kDurationFactor; void init (); }; class LeafSpreadAnim : public PolygonAnim { public: LeafSpreadAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); protected: static const float kDurationFactor; }; class SkewerAnim : public PolygonAnim { public: SkewerAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void init (); void stepPolygon (PolygonObject *p, float forwardProgress); protected: static const float kDurationFactor; }; /* TODO: Make a MultiAnim */ class DissolveSingleAnim : virtual public Animation, virtual public TransformAnim { public: DissolveSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon); void step () { TransformAnim::step (); } void updateBB (CompOutput &output); bool updateBBUsed () { return true; } void updateTransform (GLMatrix &); void updateAttrib (GLWindowPaintAttrib &wAttrib); virtual float getDissolveSingleProgress () { return progressLinear (); } }; class DissolveAnim : public MultiAnim { public: DissolveAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : MultiAnim ::MultiAnim (w, curWindowEvent, duration, info, icon) { } }; ./plugins/animationaddon/src/domino.cpp0000644000004100000410000001662613246301623020504 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * domino.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Domino and Razr ========================= const float DominoAnim::kDurationFactor = 1.25; DominoAnim::DominoAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } RazrAnim::RazrAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), DominoAnim::DominoAnim (w, curWindowEvent, duration, info, icon) { } void DominoAnim::init () { bool isRazr = (typeid (*this) == typeid (RazrAnim)); int fallDir; if (isRazr) fallDir = getActualAnimDirection ((AnimDirection) optValI (AnimationaddonOptions::RazrDirection), true); else fallDir = getActualAnimDirection ((AnimDirection) optValI (AnimationaddonOptions::DominoDirection), true); int defaultGridSize = 20; float minCellSize = 30; int gridSizeX; int gridSizeY; int fallDirGridSize; float minDistStartEdge; // half piece size in [0,1] range float gridCellW; float gridCellH; float cellAspectRatio = 1.25; if (isRazr) cellAspectRatio = 1; CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); // Determine sensible domino piece sizes if (fallDir == AnimDirectionDown || fallDir == AnimDirectionUp) { if (minCellSize > outRect.width ()) minCellSize = outRect.width (); if (outRect.width () / defaultGridSize < minCellSize) gridSizeX = (int)(outRect.width () / minCellSize); else gridSizeX = defaultGridSize; gridCellW = outRect.width () / gridSizeX; gridSizeY = (int)(outRect.height () / (gridCellW * cellAspectRatio)); if (gridSizeY == 0) gridSizeY = 1; gridCellH = outRect.height () / gridSizeY; fallDirGridSize = gridSizeY; } else { if (minCellSize > outRect.height ()) minCellSize = outRect.height (); if (outRect.height () / defaultGridSize < minCellSize) gridSizeY = (int)(outRect.height () / minCellSize); else gridSizeY = defaultGridSize; gridCellH = outRect.height () / gridSizeY; gridSizeX = (int)(outRect.width () / (gridCellH * cellAspectRatio)); if (gridSizeX == 0) gridSizeX = 1; gridCellW = outRect.width () / gridSizeX; fallDirGridSize = gridSizeX; } minDistStartEdge = (1.0 / fallDirGridSize) / 2; float thickness = MIN (gridCellW, gridCellH) / 3.5; if (!tessellateIntoRectangles (gridSizeX, gridSizeY, thickness)) return; float rotAxisX = 0; float rotAxisY = 0; Point3d rotAxisOff (0, 0, thickness / 2); float posX = 0; // position of standing piece float posY = 0; float posZ = 0; int nFallingColumns = gridSizeX; float gridCellHalfW = gridCellW / 2; float gridCellHalfH = gridCellH / 2; switch (fallDir) { case AnimDirectionDown: rotAxisX = -1; if (isRazr) rotAxisOff.setY (-gridCellHalfH); else { posY = -(gridCellHalfH + thickness); posZ = gridCellHalfH - thickness / 2; } break; case AnimDirectionLeft: rotAxisY = -1; if (isRazr) rotAxisOff.setX (gridCellHalfW); else { posX = gridCellHalfW + thickness; posZ = gridCellHalfW - thickness / 2; } nFallingColumns = gridSizeY; break; case AnimDirectionUp: rotAxisX = 1; if (isRazr) rotAxisOff.setY (gridCellHalfH); else { posY = gridCellHalfH + thickness; posZ = gridCellHalfH - thickness / 2; } break; case AnimDirectionRight: rotAxisY = 1; if (isRazr) rotAxisOff.setX (-gridCellHalfW); else { posX = -(gridCellHalfW + thickness); posZ = gridCellHalfW - thickness / 2; } nFallingColumns = gridSizeY; break; } float fadeDuration; float riseDuration; float riseTimeRandMax = 0.2; if (isRazr) { riseDuration = (1 - riseTimeRandMax) / fallDirGridSize; fadeDuration = riseDuration / 2; } else { fadeDuration = 0.18; riseDuration = 0.2; } float riseTimeRandSeed[nFallingColumns]; for (int i = 0; i < nFallingColumns; i++) riseTimeRandSeed[i] = RAND_FLOAT (); foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (rotAxisX, rotAxisY, 0); p->finalRelPos.set (posX, posY, posZ); // dist. from rise-start / fall-end edge in window ([0,1] range) float distStartEdge = 0; // dist. from edge perpendicular to movement (for move start time) // so that same the blocks in same row/col. appear to knock down // the next one float distPerpEdge = 0; switch (fallDir) { case AnimDirectionUp: distStartEdge = p->centerRelPos.y (); distPerpEdge = p->centerRelPos.x (); break; case AnimDirectionRight: distStartEdge = 1 - p->centerRelPos.x (); distPerpEdge = p->centerRelPos.y (); break; case AnimDirectionDown: distStartEdge = 1 - p->centerRelPos.y (); distPerpEdge = p->centerRelPos.x (); break; case AnimDirectionLeft: distStartEdge = p->centerRelPos.x (); distPerpEdge = p->centerRelPos.y (); break; } float riseTimeRand = riseTimeRandSeed[(int)(distPerpEdge * nFallingColumns)] * riseTimeRandMax; p->moveDuration = riseDuration; float mult = 1; if (fallDirGridSize > 1) mult = ((distStartEdge - minDistStartEdge) / (1 - 2 * minDistStartEdge)); if (isRazr) { p->moveStartTime = mult * (1 - riseDuration - riseTimeRandMax) + riseTimeRand; p->fadeStartTime = p->moveStartTime + riseDuration / 2; p->finalRotAng = -180; p->rotAxisOffset = rotAxisOff; } else { p->moveStartTime = mult * (1 - riseDuration - riseTimeRandMax) + riseTimeRand; p->fadeStartTime = p->moveStartTime + riseDuration - riseTimeRand + 0.03; p->finalRotAng = -90; } if (p->fadeStartTime > 1 - fadeDuration) p->fadeStartTime = 1 - fadeDuration; p->fadeDuration = fadeDuration; } } ./plugins/animationaddon/src/dissolve.cpp0000644000004100000410000000431013246301623021032 0ustar www-datawww-data/* Compiz Dissolve animation * dissolve.cpp * * Copyright (c) 2010 Jay Catherwood * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include "private.h" DissolveSingleAnim::DissolveSingleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon) { } void DissolveSingleAnim::updateAttrib (GLWindowPaintAttrib &attrib) { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); float o = 0.2; float factor = (4 - layer) * o; attrib.opacity *= (o / (1.0 - factor)) * (1.0 - getDissolveSingleProgress ()); } void DissolveSingleAnim::updateTransform (GLMatrix &transform) { int layer = MultiAnim ::getCurrAnimNumber (mAWindow); switch (layer) { case 1: transform.translate (3.*getDissolveSingleProgress (), 0.f, 0.f); break; case 2: transform.translate (-3.*getDissolveSingleProgress (), 0.f, 0.f); break; case 3: transform.translate (0.f, 3.*getDissolveSingleProgress (), 0.f); break; case 4: transform.translate (0.f, -3.*getDissolveSingleProgress (), 0.f); break; default: break; } } void DissolveSingleAnim::updateBB (CompOutput &output) { CompRect outRect (mAWindow->mWindow->outputRect ()); Box windowBox = { static_cast (outRect.x () - 4), static_cast (outRect.x () + outRect.width () + 4), static_cast (outRect.y () - 4), static_cast (outRect.y () + outRect.height () + 4) }; mAWindow->expandBBWithBox (windowBox); } ./plugins/animationaddon/src/particle.cpp0000644000004100000410000002175213246301623021016 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * particle.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" #include "animation_tex.h" ParticleAnim::ParticleAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseAddonAnim::BaseAddonAnim (w, curWindowEvent, duration, info, icon), PartialWindowAnim::PartialWindowAnim (w, curWindowEvent, duration, info, icon) { } ParticleSystem::ParticleSystem (int numParticles, float slowDown, float darkenAmount, GLuint blendMode) : mParticles (numParticles), mSlowDown (slowDown), mDarkenAmount (darkenAmount), mBlendMode (blendMode), mTex (0), mActive (false), mGScreen (GLScreen::get (::screen)) { glGenTextures (1, &mTex); /* glBindTexture (GL_TEXTURE_2D, mTex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, fireTex); glBindTexture (GL_TEXTURE_2D, 0); */ } ParticleSystem::~ParticleSystem () { if (mTex) glDeleteTextures (1, &mTex); } void ParticleSystem::draw (const GLMatrix &transform, int offsetX, int offsetY) { // TODO // The part below should ideally be done in ParticleSystem constructor // instead, but for some reason the texture image gets lost when we do that. glBindTexture (GL_TEXTURE_2D, mTex); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, fireTex); glBindTexture (GL_TEXTURE_2D, 0); GLMatrix translatedMatrix (transform); //translatedMatrix.translate (offsetX - mX, offsetY - mY, 0); glEnable (GL_BLEND); if (mTex) { glBindTexture (GL_TEXTURE_2D, mTex); glEnable (GL_TEXTURE_2D); } mVerticesCache.resize (6 * 3 * mParticles.size ()); mCoordsCache.resize (6 * 2 * mParticles.size ()); mColorsCache.resize (6 * 4 * mParticles.size ()); if (mDarkenAmount > 0) mDColorsCache.resize (6 * 4 * mParticles.size ()); GLushort *dcolors = &mDColorsCache[0]; GLfloat *vertices = &mVerticesCache[0]; GLfloat *coords = &mCoordsCache[0]; GLushort *colors = &mColorsCache[0]; int cornersSize = sizeof (GLfloat) * 12; int colorSize = sizeof (GLfloat) * 4; GLfloat cornerCoords[12] = {0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0}; int numActive = 0; foreach (Particle &part, mParticles) { if (part.life <= 0.0f) // Ignore dead particles continue; numActive += 6; float w = part.width / 2; float h = part.height / 2; w += (w * part.w_mod) * part.life; h += (h * part.h_mod) * part.life; vertices[0] = part.x - w; vertices[1] = part.y - h; vertices[2] = part.z; vertices[3] = part.x - w; vertices[4] = part.y + h; vertices[5] = part.z; vertices[6] = part.x + w; vertices[7] = part.y + h; vertices[8] = part.z; vertices[9] = part.x + w; vertices[10] = part.y + h; vertices[11] = part.z; vertices[12] = part.x + w; vertices[13] = part.y - h; vertices[14] = part.z; vertices[15] = part.x - w; vertices[16] = part.y - h; vertices[17] = part.z; vertices += 18; memcpy (coords, cornerCoords, cornersSize); coords += 12; colors[0] = part.r * COLOR; colors[1] = part.g * COLOR; colors[2] = part.b * COLOR; colors[3] = part.life * part.a * COLOR; memcpy (colors + 4, colors, colorSize); memcpy (colors + 8, colors, colorSize); memcpy (colors + 12, colors, colorSize); memcpy (colors + 16, colors, colorSize); memcpy (colors + 20, colors, colorSize); colors += 24; if (mDarkenAmount > 0) { dcolors[0] = part.r; dcolors[1] = part.g; dcolors[2] = part.b; dcolors[3] = part.life * part.a * mDarkenAmount; memcpy (dcolors + 4, dcolors, colorSize); memcpy (dcolors + 8, dcolors, colorSize); memcpy (dcolors + 12, dcolors, colorSize); memcpy (dcolors + 16, dcolors, colorSize); memcpy (dcolors + 20, dcolors, colorSize); dcolors += 24; } } GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer (); // darken the background if (mDarkenAmount > 0) { glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); stream->begin (GL_TRIANGLES); stream->addTexCoords (0, numActive, &mCoordsCache[0]); stream->addVertices (numActive, &mVerticesCache[0]); stream->addColors (numActive, &mDColorsCache[0]); if (stream->end ()) stream->render (translatedMatrix); } // draw particles glBlendFunc (GL_SRC_ALPHA, mBlendMode); stream->begin (GL_TRIANGLES); stream->addTexCoords (0, numActive, &mCoordsCache[0]); stream->addVertices (numActive, &mVerticesCache[0]); stream->addColors (numActive, &mColorsCache[0]); if (stream->end ()) stream->render (translatedMatrix); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDisable (GL_TEXTURE_2D); glDisable (GL_BLEND); } void ParticleAnim::postPaintWindow (const GLMatrix &transform) { foreach (ParticleSystem &ps, mParticleSystems) if (ps.active ()) // offset by window pos. ps.draw (transform, mWindow->x () - mWindow->output ().left, mWindow->y () - mWindow->output ().top); } void ParticleSystem::update (float time) { float speed = (time / 50.0); float slowdown = mSlowDown * (1 - MAX (0.99, time / 1000.0)) * 1000; mActive = false; foreach (Particle &part, mParticles) { if (part.life <= 0.0f) // Ignore dead particles continue; // move particle part.x += part.xi / slowdown; part.y += part.yi / slowdown; part.z += part.zi / slowdown; // modify speed part.xi += part.xg * speed; part.yi += part.yg * speed; part.zi += part.zg * speed; // modify life part.life -= part.fade * speed; if (!mActive) mActive = true; } } void ParticleAnim::updateBB (CompOutput &output) { foreach (ParticleSystem &ps, mParticleSystems) { if (!ps.active ()) continue; foreach (Particle &part, ps.particles ()) { if (part.life <= 0.0f) // Ignore dead particles continue; float w = part.width / 2; float h = part.height / 2; w += (w * part.w_mod) * part.life; h += (h * part.h_mod) * part.life; Box particleBox = { static_cast (part.x - w), static_cast (part.x + w), static_cast (part.y - h), static_cast (part.y + h) }; mAWindow->expandBBWithBox (particleBox); } } if (mUseDrawRegion && mDrawRegion != CompRegion::empty ()) // expand BB with bounding box of draw region mAWindow->expandBBWithBox (mDrawRegion.handle ()->extents); else // drawing full window mAWindow->expandBBWithWindow (); } bool ParticleAnim::prePreparePaint (int msSinceLastPaint) { bool particleAnimInProgress = false; foreach (ParticleSystem &ps, mParticleSystems) { if (!ps.active ()) continue; ps.update (msSinceLastPaint); particleAnimInProgress = true; } return particleAnimInProgress; } void ParticleAnim::initLightDarkParticles (int numLightParticles, int numDarkParticles, float lightSlowDown, float darkSlowDown) { if (numLightParticles > 0) mParticleSystems.push_back (new ParticleSystem (numLightParticles, lightSlowDown, 0.0f, GL_ONE_MINUS_SRC_ALPHA)); if (numDarkParticles > 0) mParticleSystems.push_back (new ParticleSystem (numDarkParticles, darkSlowDown, 0.5f, GL_ONE)); } ./plugins/animationaddon/src/animation_tex.h0000644000004100000410000004064613246301623021522 0ustar www-datawww-data/** * * Particle texture for Beryl benchmark plugin * * Copyright : (C) 2006 by Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * **/ const unsigned char fireTex[4097] = { "\0\0\0\0\377\377\377\3\377\377\377\2\377\377\377\5\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\12\377\377\377\14\377\377\377\14\377\377\377\14\377\377" "\377\16\377\377\377\15\377\377\377\14\377\377\377\12\377\377\377\13\377\377" "\377\13\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\10\377\377" "\377\7\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\2\0\0\0\0\0" "\0\0\0\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\7\377\377\377" "\6\377\377\377\10\377\377\377\11\377\377\377\11\377\377\377\14\377\377\377" "\14\377\377\377\15\377\377\377\16\377\377\377\20\377\377\377\21\377\377\377" "\20\377\377\377\22\377\377\377\20\377\377\377\21\377\377\377\17\377\377\377" "\20\377\377\377\17\377\377\377\13\377\377\377\13\377\377\377\13\377\377\377" "\14\377\377\377\11\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\1\0\0\0\0\377\377\377\5\377\377\377\4\377\377\377\6\377\377" "\377\6\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\14\377\377" "\377\15\377\377\377\20\377\377\377\20\377\377\377\24\377\377\377\24\377\377" "\377\23\377\377\377\23\377\377\377\26\377\377\377\25\377\377\377\23\377\377" "\377\21\377\377\377\24\377\377\377\22\377\377\377\17\377\377\377\17\377\377" "\377\15\377\377\377\15\377\377\377\11\377\377\377\11\377\377\377\7\377\377" "\377\7\377\377\377\6\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377" "\6\377\377\377\6\377\377\377\12\377\377\377\13\377\377\377\13\377\377\377" "\13\377\377\377\17\377\377\377\22\377\377\377\24\377\377\377\22\377\377\377" "\30\377\377\377\30\377\377\377\31\377\377\377\31\377\377\377\33\377\377\377" "\31\377\377\377\30\377\377\377\30\377\377\377\30\377\377\377\25\377\377\377" "\25\377\377\377\23\377\377\377\22\377\377\377\17\377\377\377\13\377\377\377" "\12\377\377\377\11\377\377\377\7\377\377\377\6\377\377\377\5\377\377\377" "\4\377\377\377\7\377\377\377\6\377\377\377\12\377\377\377\11\377\377\377" "\14\377\377\377\15\377\377\377\20\377\377\377\22\377\377\377\25\377\377\377" "\30\377\377\377\32\377\377\377\35\377\377\377\34\377\377\377\34\377\377\377" "\36\377\377\377\40\377\377\377\36\377\377\377\34\377\377\377\34\377\377\377" "\34\377\377\377\32\377\377\377\31\377\377\377\26\377\377\377\25\377\377\377" "\22\377\377\377\16\377\377\377\12\377\377\377\12\377\377\377\12\377\377\377" "\10\377\377\377\6\377\377\377\4\377\377\377\10\377\377\377\11\377\377\377" "\12\377\377\377\13\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377!\377\377\377" "\"\377\377\377#\377\377\377#\377\377\377&\377\377\377&\377\377\377$\377\377" "\377#\377\377\377\40\377\377\377!\377\377\377\35\377\377\377\34\377\377\377" "\25\377\377\377\24\377\377\377\21\377\377\377\15\377\377\377\14\377\377\377" "\14\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377\10\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377" "\26\377\377\377\30\377\377\377\34\377\377\377\37\377\377\377#\377\377\377" "&\377\377\377,\377\377\377+\377\377\377,\377\377\377-\377\377\377-\377\377" "\377,\377\377\377+\377\377\377&\377\377\377)\377\377\377$\377\377\377\34" "\377\377\377\34\377\377\377\27\377\377\377\24\377\377\377\23\377\377\377" "\17\377\377\377\15\377\377\377\12\377\377\377\7\377\377\377\6\377\377\377" "\12\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377\22\377\377\377" "\27\377\377\377\31\377\377\377\36\377\377\377!\377\377\377%\377\377\377(" "\377\377\3771\377\377\3772\377\377\3775\377\377\377;\377\377\377<\377\377" "\3779\377\377\3778\377\377\3773\377\377\3771\377\377\377-\377\377\377'\377" "\377\377\"\377\377\377\34\377\377\377\36\377\377\377\32\377\377\377\25\377" "\377\377\21\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377\7\377" "\377\377\13\377\377\377\14\377\377\377\17\377\377\377\21\377\377\377\31\377" "\377\377\31\377\377\377\35\377\377\377!\377\377\377'\377\377\377+\377\377" "\3771\377\377\377=\377\377\377E\377\377\377H\377\377\377M\377\377\377M\377" "\377\377J\377\377\377I\377\377\377A\377\377\377A\377\377\3778\377\377\377" ",\377\377\377%\377\377\377$\377\377\377\"\377\377\377\34\377\377\377\24\377" "\377\377\22\377\377\377\17\377\377\377\13\377\377\377\12\377\377\377\11\377" "\377\377\13\377\377\377\14\377\377\377\20\377\377\377\23\377\377\377\27\377" "\377\377\35\377\377\377$\377\377\377(\377\377\377.\377\377\3776\377\377\377" "=\377\377\377H\377\377\377W\377\377\377Y\377\377\377]\377\377\377a\377\377" "\377\\\377\377\377\\\377\377\377U\377\377\377O\377\377\377?\377\377\3774" "\377\377\377-\377\377\377+\377\377\377\40\377\377\377\32\377\377\377\27\377" "\377\377\23\377\377\377\22\377\377\377\15\377\377\377\11\377\377\377\13\377" "\377\377\12\377\377\377\15\377\377\377\21\377\377\377\25\377\377\377\30\377" "\377\377\37\377\377\377$\377\377\377.\377\377\3779\377\377\377?\377\377\377" "N\377\377\377X\377\377\377h\377\377\377r\377\377\377w\377\377\377|\377\377" "\377x\377\377\377p\377\377\377k\377\377\377\\\377\377\377J\377\377\377F\377" "\377\3779\377\377\377*\377\377\377$\377\377\377\36\377\377\377\30\377\377" "\377\25\377\377\377\24\377\377\377\20\377\377\377\14\377\377\377\12\377\377" "\377\15\377\377\377\17\377\377\377\22\377\377\377\27\377\377\377\34\377\377" "\377\40\377\377\377%\377\377\377.\377\377\377<\377\377\377M\377\377\377[" "\377\377\377l\377\377\377~\377\377\377\227\377\377\377\230\377\377\377\234" "\377\377\377\233\377\377\377\226\377\377\377\205\377\377\377i\377\377\377" "b\377\377\377P\377\377\3779\377\377\377-\377\377\377(\377\377\377!\377\377" "\377\35\377\377\377\32\377\377\377\25\377\377\377\21\377\377\377\13\377\377" "\377\12\377\377\377\15\377\377\377\21\377\377\377\23\377\377\377\31\377\377" "\377\37\377\377\377!\377\377\377(\377\377\3774\377\377\377@\377\377\377Q" "\377\377\377g\377\377\377\200\377\377\377\231\377\377\377\254\377\377\377" "\275\377\377\377\310\377\377\377\304\377\377\377\264\377\377\377\227\377" "\377\377\212\377\377\377f\377\377\377Q\377\377\377B\377\377\377:\377\377" "\377/\377\377\377&\377\377\377\36\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\14\377\377\377\12\377\377\377\17\377\377\377\22\377\377\377" "\24\377\377\377\31\377\377\377\40\377\377\377&\377\377\377-\377\377\377:" "\377\377\377H\377\377\377X\377\377\377k\377\377\377\220\377\377\377\252\377" "\377\377\324\377\377\377\363\377\377\377\370\377\377\377\366\377\377\377" "\335\377\377\377\263\377\377\377\221\377\377\377w\377\377\377b\377\377\377" "P\377\377\377>\377\377\3770\377\377\377&\377\377\377\37\377\377\377\32\377" "\377\377\26\377\377\377\23\377\377\377\15\377\377\377\11\377\377\377\16\377" "\377\377\21\377\377\377\27\377\377\377\33\377\377\377\"\377\377\377(\377" "\377\377/\377\377\377<\377\377\377N\377\377\377b\377\377\377z\377\377\377" "\231\377\377\377\275\377\377\377\361\377\377\377\375\377\377\377\376\377" "\377\377\376\377\377\377\370\377\377\377\316\377\377\377\240\377\377\377" "\205\377\377\377b\377\377\377L\377\377\377<\377\377\377.\377\377\377&\377" "\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377\377\15\377" "\377\377\12\377\377\377\16\377\377\377\22\377\377\377\24\377\377\377\32\377" "\377\377\40\377\377\377$\377\377\377,\377\377\377:\377\377\377L\377\377\377" "`\377\377\377|\377\377\377\231\377\377\377\310\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\376\377\377\377\375\377\377\377\332\377" "\377\377\241\377\377\377\207\377\377\377f\377\377\377R\377\377\377@\377\377" "\3773\377\377\377+\377\377\377\"\377\377\377\35\377\377\377\30\377\377\377" "\24\377\377\377\17\377\377\377\14\377\377\377\16\377\377\377\22\377\377\377" "\25\377\377\377\30\377\377\377\40\377\377\377$\377\377\377,\377\377\377;" "\377\377\377N\377\377\377e\377\377\377\206\377\377\377\246\377\377\377\327" "\377\377\377\374\377\377\377\375\377\377\377\376\377\377\377\376\377\377" "\377\374\377\377\377\331\377\377\377\243\377\377\377\210\377\377\377b\377" "\377\377O\377\377\377>\377\377\377.\377\377\377&\377\377\377\40\377\377\377" "\33\377\377\377\27\377\377\377\22\377\377\377\15\377\377\377\12\377\377\377" "\16\377\377\377\22\377\377\377\23\377\377\377\32\377\377\377\40\377\377\377" "'\377\377\3770\377\377\377?\377\377\377U\377\377\377h\377\377\377\200\377" "\377\377\237\377\377\377\270\377\377\377\344\377\377\377\372\377\377\377" "\375\377\377\377\376\377\377\377\354\377\377\377\275\377\377\377\227\377" "\377\377\200\377\377\377e\377\377\377Q\377\377\377>\377\377\377.\377\377" "\377%\377\377\377\40\377\377\377\33\377\377\377\26\377\377\377\22\377\377" "\377\15\377\377\377\11\377\377\377\17\377\377\377\22\377\377\377\25\377\377" "\377\31\377\377\377\"\377\377\377*\377\377\3773\377\377\377=\377\377\377" "J\377\377\377^\377\377\377o\377\377\377\211\377\377\377\235\377\377\377\271" "\377\377\377\327\377\377\377\342\377\377\377\335\377\377\377\302\377\377" "\377\240\377\377\377\216\377\377\377k\377\377\377X\377\377\377C\377\377\377" "9\377\377\377/\377\377\377&\377\377\377\"\377\377\377\33\377\377\377\26\377" "\377\377\22\377\377\377\14\377\377\377\12\377\377\377\15\377\377\377\22\377" "\377\377\31\377\377\377\35\377\377\377\37\377\377\377$\377\377\377,\377\377" "\3777\377\377\377A\377\377\377Q\377\377\377[\377\377\377p\377\377\377\212" "\377\377\377\231\377\377\377\242\377\377\377\253\377\377\377\251\377\377" "\377\236\377\377\377\215\377\377\377u\377\377\377b\377\377\377O\377\377\377" "<\377\377\3771\377\377\377)\377\377\377\"\377\377\377\34\377\377\377\32\377" "\377\377\27\377\377\377\21\377\377\377\16\377\377\377\12\377\377\377\17\377" "\377\377\21\377\377\377\20\377\377\377\27\377\377\377\37\377\377\377$\377" "\377\377&\377\377\377,\377\377\3778\377\377\377B\377\377\377R\377\377\377" "_\377\377\377k\377\377\377~\377\377\377\207\377\377\377\220\377\377\377\220" "\377\377\377\203\377\377\377q\377\377\377_\377\377\377V\377\377\377F\377" "\377\3777\377\377\377,\377\377\377%\377\377\377!\377\377\377\31\377\377\377" "\25\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377\11\377\377\377" "\12\377\377\377\16\377\377\377\22\377\377\377\27\377\377\377\33\377\377\377" "\35\377\377\377\"\377\377\377(\377\377\377/\377\377\3779\377\377\377E\377" "\377\377L\377\377\377^\377\377\377d\377\377\377e\377\377\377k\377\377\377" "l\377\377\377d\377\377\377a\377\377\377O\377\377\377C\377\377\377=\377\377" "\3770\377\377\377)\377\377\377$\377\377\377\35\377\377\377\30\377\377\377" "\25\377\377\377\22\377\377\377\16\377\377\377\12\377\377\377\13\377\377\377" "\13\377\377\377\15\377\377\377\20\377\377\377\21\377\377\377\31\377\377\377" "\33\377\377\377\35\377\377\377$\377\377\377)\377\377\3771\377\377\3776\377" "\377\377@\377\377\377J\377\377\377N\377\377\377P\377\377\377S\377\377\377" "X\377\377\377P\377\377\377J\377\377\377E\377\377\3777\377\377\377,\377\377" "\377+\377\377\377%\377\377\377\40\377\377\377\32\377\377\377\26\377\377\377" "\21\377\377\377\21\377\377\377\14\377\377\377\11\377\377\377\12\377\377\377" "\13\377\377\377\11\377\377\377\14\377\377\377\21\377\377\377\23\377\377\377" "\27\377\377\377\33\377\377\377\37\377\377\377&\377\377\377(\377\377\377*" "\377\377\3774\377\377\3779\377\377\377<\377\377\377=\377\377\377C\377\377" "\377E\377\377\377?\377\377\3779\377\377\377:\377\377\377.\377\377\377(\377" "\377\377!\377\377\377!\377\377\377\35\377\377\377\31\377\377\377\24\377\377" "\377\21\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377\10\377\377" "\377\10\377\377\377\11\377\377\377\13\377\377\377\16\377\377\377\22\377\377" "\377\25\377\377\377\30\377\377\377\33\377\377\377\"\377\377\377!\377\377" "\377%\377\377\377*\377\377\377-\377\377\3770\377\377\377/\377\377\3773\377" "\377\3772\377\377\3774\377\377\377-\377\377\377,\377\377\377*\377\377\377" "\"\377\377\377\37\377\377\377\32\377\377\377\33\377\377\377\27\377\377\377" "\21\377\377\377\17\377\377\377\16\377\377\377\12\377\377\377\11\377\377\377" "\6\377\377\377\10\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\20\377\377\377\22\377\377\377\23\377\377\377\30\377\377\377\32\377\377\377" "\35\377\377\377\40\377\377\377!\377\377\377%\377\377\377(\377\377\377&\377" "\377\377)\377\377\377(\377\377\377+\377\377\377$\377\377\377!\377\377\377" "#\377\377\377\36\377\377\377\30\377\377\377\30\377\377\377\24\377\377\377" "\22\377\377\377\20\377\377\377\15\377\377\377\11\377\377\377\12\377\377\377" "\6\377\377\377\6\377\377\377\7\377\377\377\7\377\377\377\11\377\377\377\12" "\377\377\377\16\377\377\377\17\377\377\377\22\377\377\377\23\377\377\377" "\26\377\377\377\31\377\377\377\33\377\377\377\34\377\377\377!\377\377\377" "\40\377\377\377\"\377\377\377\"\377\377\377\"\377\377\377&\377\377\377\36" "\377\377\377\35\377\377\377\35\377\377\377\34\377\377\377\26\377\377\377" "\24\377\377\377\23\377\377\377\20\377\377\377\15\377\377\377\14\377\377\377" "\13\377\377\377\7\377\377\377\5\377\377\377\6\377\377\377\7\377\377\377\6" "\377\377\377\11\377\377\377\12\377\377\377\11\377\377\377\15\377\377\377" "\16\377\377\377\21\377\377\377\22\377\377\377\26\377\377\377\26\377\377\377" "\30\377\377\377\33\377\377\377\32\377\377\377\34\377\377\377\33\377\377\377" "\32\377\377\377\37\377\377\377\31\377\377\377\31\377\377\377\27\377\377\377" "\30\377\377\377\21\377\377\377\22\377\377\377\17\377\377\377\14\377\377\377" "\11\377\377\377\11\377\377\377\12\377\377\377\6\377\377\377\6\377\377\377" "\4\377\377\377\6\377\377\377\6\377\377\377\5\377\377\377\7\377\377\377\13" "\377\377\377\11\377\377\377\12\377\377\377\16\377\377\377\21\377\377\377" "\21\377\377\377\20\377\377\377\22\377\377\377\30\377\377\377\26\377\377\377" "\27\377\377\377\30\377\377\377\27\377\377\377\30\377\377\377\26\377\377\377" "\23\377\377\377\22\377\377\377\20\377\377\377\20\377\377\377\16\377\377\377" "\14\377\377\377\11\377\377\377\11\377\377\377\10\377\377\377\6\377\377\377" "\6\377\377\377\4\377\377\377\3\377\377\377\4\377\377\377\4\377\377\377\4" "\377\377\377\7\377\377\377\10\377\377\377\12\377\377\377\10\377\377\377\11" "\377\377\377\15\377\377\377\16\377\377\377\16\377\377\377\20\377\377\377" "\23\377\377\377\21\377\377\377\23\377\377\377\22\377\377\377\22\377\377\377" "\21\377\377\377\22\377\377\377\22\377\377\377\20\377\377\377\16\377\377\377" "\15\377\377\377\12\377\377\377\11\377\377\377\12\377\377\377\7\377\377\377" "\6\377\377\377\7\377\377\377\5\377\377\377\4\377\377\377\1\377\377\377\1" "\377\377\377\3\377\377\377\3\377\377\377\6\377\377\377\7\377\377\377\6\377" "\377\377\10\377\377\377\12\377\377\377\12\377\377\377\11\377\377\377\13\377" "\377\377\16\377\377\377\16\377\377\377\16\377\377\377\17\377\377\377\16\377" "\377\377\16\377\377\377\17\377\377\377\17\377\377\377\15\377\377\377\14\377" "\377\377\12\377\377\377\11\377\377\377\12\377\377\377\12\377\377\377\7\377" "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\3\377\377\377\1\377\377" "\377\1\0\0\0\0\0\0\0\0\377\377\377\2\377\377\377\4\377\377\377\7\377\377" "\377\6\377\377\377\6\377\377\377\7\377\377\377\13\377\377\377\13\377\377" "\377\10\377\377\377\11\377\377\377\11\377\377\377\11\377\377\377\15\377\377" "\377\13\377\377\377\14\377\377\377\11\377\377\377\13\377\377\377\11\377\377" "\377\12\377\377\377\13\377\377\377\11\377\377\377\11\377\377\377\6\377\377" "\377\7\377\377\377\4\377\377\377\5\377\377\377\3\377\377\377\1\0\0\0\0\0" "\0\0\0" }; ./plugins/animationaddon/src/beamup.cpp0000644000004100000410000001542613246301623020465 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * beamup.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Beam Up ========================= BeamUpAnim::BeamUpAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), ParticleAnim::ParticleAnim (w, curWindowEvent, duration, info, icon) { mLife = optValF (AnimationaddonOptions::BeamLife); mColor = optValC (AnimationaddonOptions::BeamColor); mSize = optValF (AnimationaddonOptions::BeamSize); mSpacing = optValI (AnimationaddonOptions::BeamSpacing); mSlowdown = optValF (AnimationaddonOptions::BeamSlowdown); } void BeamUpAnim::init () { int winWidth = mWindow->width () + mWindow->output ().left + mWindow->output ().right; initLightDarkParticles (0, winWidth / mSpacing, 0, mSlowdown); } void BeamUpAnim::genNewBeam (int x, int y, int width, int height, float size, float time) { ParticleSystem &ps = mParticleSystems[0]; unsigned numParticles = ps.particles ().size (); float beamLifeNeg = 1 - mLife; float fadeExtra = 0.2f * (1.01 - mLife); float maxNew = numParticles * (time / 50) * (1.05 - mLife); // set color ABAB ANIMADDON_SCREEN_OPTION_BEAMUP_COLOR unsigned short *c = mColor; float colr1 = (float)c[0] / 0xffff; float colg1 = (float)c[1] / 0xffff; float colb1 = (float)c[2] / 0xffff; float colr2 = 1 / 1.7 * (float)c[0] / 0xffff; float colg2 = 1 / 1.7 * (float)c[1] / 0xffff; float colb2 = 1 / 1.7 * (float)c[2] / 0xffff; float cola = (float)c[3] / 0xffff; float rVal; float partw = 2.5 * mSize; // Limit max number of new particles created simultaneously if (maxNew > numParticles) maxNew = numParticles; Particle *part = &ps.particles ()[0]; for (unsigned i = 0; i < numParticles && maxNew > 0; i++, part++) { if (part->life <= 0.0f) { // give gt new life rVal = (float)(random () & 0xff) / 255.0; part->life = 1.0f; part->fade = rVal * beamLifeNeg + fadeExtra; // Random Fade Value // set size part->width = partw; part->height = height; part->w_mod = size * 0.2; part->h_mod = size * 0.02; // choose random x position rVal = (float)(random () & 0xff) / 255.0; part->x = x + ((width > 1) ? (rVal * width) : 0); part->y = y; part->z = 0.0; part->xo = part->x; part->yo = part->y; part->zo = part->z; // set speed and direction part->xi = 0.0f; part->yi = 0.0f; part->zi = 0.0f; part->r = colr1 - rVal * colr2; part->g = colg1 - rVal * colg2; part->b = colb1 - rVal * colb2; part->a = cola; // set gravity part->xg = 0.0f; part->yg = 0.0f; part->zg = 0.0f; if (!ps.active ()) ps.activate (); maxNew -= 1; } else { part->xg = (part->x < part->xo) ? 1.0 : -1.0; } } } void BeamUpAnim::step () { CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float timestep = mIntenseTimeStep; mRemainingTime -= timestep; if (mRemainingTime <= 0) mRemainingTime = 0; // avoid sub-zero values float newProgress = 1 - mRemainingTime / (mTotalTime - timestep); bool creating = (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventUnshade); if (creating) newProgress = 1 - newProgress; if (mRemainingTime > 0) { CompRect rect (((newProgress / 2) * outRect.width ()), ((newProgress / 2) * outRect.height ()), (1 - newProgress) * outRect.width (), (1 - newProgress) * outRect.height ()); rect.setX (rect.x () + outRect.x ()); rect.setY (rect.y () + outRect.y ()); mDrawRegion = CompRegion (rect); } else { mDrawRegion = CompRegion::empty (); } mUseDrawRegion = (fabs (newProgress) > 1e-5); if (mRemainingTime > 0) { genNewBeam (outRect.x (), outRect.y () + (outRect.height () / 2), outRect.width (), creating ? (1 - newProgress / 2) * outRect.height () : (1 - newProgress) * outRect.height (), outRect.width () / 40.0, mTimeSinceLastPaint); } if (mRemainingTime <= 0 && mParticleSystems[0].active ()) // force animation to continue until particle systems are done mRemainingTime = 0.001f; if (mRemainingTime > 0) { vector &particles = mParticleSystems[0].particles (); int nParticles = particles.size (); Particle *part = &particles[0]; for (int i = 0; i < nParticles; i++, part++) part->xg = (part->x < part->xo) ? 1.0 : -1.0; } mParticleSystems[0].setOrigin (outRect.x (), outRect.y ()); } void BeamUpAnim::updateAttrib (GLWindowPaintAttrib &attrib) { float forwardProgress = 0; if (mTotalTime - mIntenseTimeStep != 0) forwardProgress = 1 - (mRemainingTime) / (mTotalTime - mIntenseTimeStep); forwardProgress = MIN(forwardProgress, 1); forwardProgress = MAX(forwardProgress, 0); //float forwardProgress = progressLinear (); if (mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventUnminimize) { //forwardProgress = 1 - forwardProgress; forwardProgress = forwardProgress * forwardProgress; forwardProgress = forwardProgress * forwardProgress; forwardProgress = 1 - forwardProgress; } attrib.opacity = (GLushort) (mStoredOpacity * (1 - forwardProgress)); } ./plugins/animationaddon/src/animationaddon.cpp0000644000004100000410000002014413246301623022172 0ustar www-datawww-data/** * Animation plugin for compiz/beryl * * animationaddon.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Airplane added by : Carlo Palma * E-mail : carlopalma@salug.it * Based on code originally written by Mark J. Kilgard * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Fold and Skewer added by : Tomasz Kolodziejski * E-mail : tkolodziejski@gmail.com * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ /* * TODO: * * - Custom bounding box update function for Airplane * * - Proper side surface normals for lighting * - decoration shadows * - shadow quad generation * - shadow texture coords (from clip tex. matrices) * - draw shadows * - fade in shadows * * - Voronoi tessellation * - Brick tessellation * - Triangle tessellation * * Effects: * - Circular action for tornado type fx * - Tornado 3D (especially for minimize) * - Helix 3D (hor. strips descend while they rotate and fade in) * - Glass breaking 3D * - Gaussian distr. points (for gradually increasing polygon size * starting from center or near mouse pointer) * - Drawing cracks * - Gradual cracking * * - fix slowness during transparent cube with <100 opacity * - fix occasional wrong side color in some windows * - fix on top windows and panels * (These two only matter for viewing during Rotate Cube. * All windows should be painted with depth test on * like 3d-plugin does) * - play better with rotate (fix cube face drawn on top of polygons * after 45 deg. rotation) * */ #include "private.h" class AnimAddonPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); void fini (); }; COMPIZ_PLUGIN_20090315 (animationaddon, AnimAddonPluginVTable); // TODO Update this for each added animation effect! (total: 11) const unsigned short NUM_EFFECTS = 11; AnimEffect animEffects[NUM_EFFECTS]; ExtensionPluginAnimAddon animAddonExtPluginInfo (CompString ("animationaddon"), NUM_EFFECTS, animEffects, NULL, NUM_NONEFFECT_OPTIONS); ExtensionPluginInfo * BaseAddonAnim::getExtensionPluginInfo () { return &animAddonExtPluginInfo; } BaseAddonAnim::BaseAddonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), mIntenseTimeStep (AnimAddonScreen::get (::screen)->getIntenseTimeStep ()), mCScreen (CompositeScreen::get (::screen)), mGScreen (GLScreen::get (::screen)), mDoDepthTest (false) { } AnimEffect AnimEffectAirplane; AnimEffect AnimEffectBeamUp; AnimEffect AnimEffectBurn; AnimEffect AnimEffectDissolve; AnimEffect AnimEffectDomino; AnimEffect AnimEffectExplode; AnimEffect AnimEffectFold; AnimEffect AnimEffectGlide3; AnimEffect AnimEffectLeafSpread; AnimEffect AnimEffectRazr; AnimEffect AnimEffectSkewer; int AnimAddonScreen::getIntenseTimeStep () { return priv->optionGetTimeStepIntense (); } void PrivateAnimAddonScreen::initAnimationList () { int i = 0; AnimEffectUsedFor usedFor = AnimEffectUsedFor::all() .exclude(AnimEventFocus) .exclude(AnimEventShade); animEffects[i++] = AnimEffectAirplane = new AnimEffectInfo ("animationaddon:Airplane", usedFor, &createAnimation); animEffects[i++] = AnimEffectBeamUp = new AnimEffectInfo ("animationaddon:Beam Up", usedFor, &createAnimation); animEffects[i++] = AnimEffectBurn = new AnimEffectInfo ("animationaddon:Burn", usedFor, &createAnimation); animEffects[i++] = AnimEffectDissolve = new AnimEffectInfo ("animationaddon:Dissolve", usedFor, &createAnimation); animEffects[i++] = AnimEffectDomino = new AnimEffectInfo ("animationaddon:Domino", usedFor, &createAnimation); animEffects[i++] = AnimEffectExplode = new AnimEffectInfo ("animationaddon:Explode", usedFor, &createAnimation); animEffects[i++] = AnimEffectFold = new AnimEffectInfo ("animationaddon:Fold", usedFor, &createAnimation); animEffects[i++] = AnimEffectGlide3 = new AnimEffectInfo ("animationaddon:Glide 3", usedFor, &createAnimation); animEffects[i++] = AnimEffectLeafSpread = new AnimEffectInfo ("animationaddon:Leaf Spread", usedFor, &createAnimation); animEffects[i++] = AnimEffectRazr = new AnimEffectInfo ("animationaddon:Razr", usedFor, &createAnimation); animEffects[i++] = AnimEffectSkewer = new AnimEffectInfo ("animationaddon:Skewer", usedFor, &createAnimation); animAddonExtPluginInfo.effectOptions = &getOptions (); AnimScreen *as = AnimScreen::get (::screen); // Extends animation plugin with this set of animation effects. as->addExtension (&animAddonExtPluginInfo); } PrivateAnimAddonScreen::PrivateAnimAddonScreen (CompScreen *s) : //cScreen (CompositeScreen::get (s)), //gScreen (GLScreen::get (s)), //aScreen (as), mOutput (s->fullscreenOutput ()) { initAnimationList (); } PrivateAnimAddonScreen::~PrivateAnimAddonScreen () { AnimScreen *as = AnimScreen::get (::screen); as->removeExtension (&animAddonExtPluginInfo); for (int i = 0; i < NUM_EFFECTS; i++) { delete animEffects[i]; animEffects[i] = NULL; } } AnimAddonScreen::AnimAddonScreen (CompScreen *s) : PluginClassHandler (s), priv (new PrivateAnimAddonScreen (s)) { } AnimAddonScreen::~AnimAddonScreen () { delete priv; } CompOption::Vector & AnimAddonScreen::getOptions () { return priv->getOptions (); } bool AnimAddonScreen::setOption (const CompString &name, CompOption::Value &value) { return priv->setOption (name, value); } AnimAddonWindow::AnimAddonWindow (CompWindow *w) : PluginClassHandler (w), mWindow (w), aWindow (AnimWindow::get (w)) { } AnimAddonWindow::~AnimAddonWindow () { Animation *curAnim = aWindow->curAnimation (); if (!curAnim) return; // We need to interrupt and clean up the animation currently being played // by animationaddon for this window (if any) if (curAnim->remainingTime () > 0 && curAnim->getExtensionPluginInfo ()->name == CompString ("animationaddon")) { aWindow->postAnimationCleanUp (); } } bool AnimAddonPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI) && CompPlugin::checkPluginABI ("animation", ANIMATION_ABI)) { CompPrivate p; p.uval = ANIMATIONADDON_ABI; ::screen->storeValue ("animationaddon_ABI", p); return true; } return false; } void AnimAddonPluginVTable::fini () { ::screen->eraseValue ("animationaddon_ABI"); } ./plugins/animationaddon/src/airplane.cpp0000644000004100000410000004571013246301623021006 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * airplane.cpp (based on airplane3d.c) * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Airplane added by : Carlo Palma * E-mail : carlopalma@salug.it * Based on code originally written by Mark J. Kilgard * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" #define BORDER_W(w) ((w)->width () + (w)->border ().left + (w)->border ().right) #define BORDER_H(w) ((w)->height () + (w)->border ().top + (w)->border ().bottom) #define BORDER_X(w) ((w)->x () - (w)->border ().left) #define BORDER_Y(w) ((w)->y () - (w)->border ().top) // Divide the window in 8 polygons (6 quadrilaters and 2 triangles (all of them draw as quadrilaters)) // Based on tessellateIntoRectangles and tessellateIntoHexagons. Improperly called tessellation. const float AirplaneAnim::kDurationFactor = 1.82; AirplaneAnim::AirplaneAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } AirplaneAnim::~AirplaneAnim () { freePolygonObjects (); } bool AirplaneAnim::tesselateIntoAirplane () { float winLimitsX; // boundaries of polygon tessellation float winLimitsY; float winLimitsW; float winLimitsH; winLimitsX = BORDER_X (mWindow); winLimitsY = BORDER_Y (mWindow); winLimitsW = BORDER_W (mWindow); winLimitsH = BORDER_H (mWindow); unsigned int numpol = 8; if (mPolygons.size () != numpol) { freePolygonObjects (); for (unsigned int i = 0; i < numpol; i++) mPolygons.push_back (new AirplanePolygonObject); } float thickness = 0; thickness /= screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float W = (float)winLimitsW; float H2 = (float)winLimitsH / 2; float H3 = (float)winLimitsH / 3; float H6 = (float)winLimitsH / 6; float halfThick = mThickness / 2; /** * * These correspond to the polygons: * based on GLUT sample origami.c code by Mark J. Kilgard * * |- W -| * |- H2 -| * * - -- +----+--------+------------------+ * | | | / | * | | 6 / | * | 7 | / 5 | * H2 | | + | * | +--------+------------------+ * | / 4 | * H __ |/____________.__________________| * |\ center | * | \ 3 | * | +--------+------------------+ * | | + | * | 0 | \ | * | | 1 \ 2 | * | | | \ | * - +----+--------+------------------+ * * */ int i = 0; foreach (PolygonObject *pol, mPolygons) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; float topRightY, topLeftY, bottomLeftY, bottomRightY; float topLeftX, topRightX, bottomLeftX, bottomRightX; p->centerPos.setX (winLimitsX + H2); p->centerPosStart.setX (winLimitsX + H2); p->centerPos.setY (winLimitsY + H2); p->centerPosStart.setY (winLimitsY + H2); p->centerPos.setZ (-halfThick); p->centerPosStart.setZ (-halfThick); p->rotAngle = p->rotAngleStart = 0; p->nSides = 4; p->nVertices = 2 * 4; mNumTotalFrontVertices += 4; switch (i) { case 0: topLeftX = -H2; topLeftY = 0; bottomLeftX = -H2; bottomLeftY = H2; bottomRightX = -H3; bottomRightY = H2; topRightX = -H3; topRightY = H6; break; case 1: topLeftX = -H3; topLeftY = H6; bottomLeftX = -H3; bottomLeftY = H2; bottomRightX = 0; bottomRightY = H2; topRightX = 0; topRightY = H2; break; case 2: topLeftX = -H3; topLeftY = H6; bottomLeftX = 0; bottomLeftY = H2; bottomRightX = W - H2; bottomRightY = H2; topRightX = W - H2; topRightY = H6; break; case 3: topLeftX = -H2; topLeftY = 0; bottomLeftX = -H3; bottomLeftY = H6; bottomRightX = W - H2; bottomRightY = H6; topRightX = W - H2; topRightY = 0; break; case 4: topLeftX = -H3; topLeftY = -H6; bottomLeftX = -H2; bottomLeftY = 0; bottomRightX = W - H2; bottomRightY = 0; topRightX = W - H2; topRightY = -H6; break; case 5: topLeftX = 0; topLeftY = -H2; bottomLeftX = -H3; bottomLeftY = -H6; bottomRightX = W - H2; bottomRightY = -H6; topRightX = W - H2; topRightY = -H2; break; case 6: topLeftX = -H3; topLeftY = -H2; bottomLeftX = -H3; bottomLeftY = -H6; bottomRightX = -H3; bottomRightY = -H6; topRightX = 0; topRightY = -H2; break; default: topLeftX = -H2; topLeftY = -H2; bottomLeftX = -H2; bottomLeftY = 0; bottomRightX = -H3; bottomRightY = -H6; topRightX = -H3; topRightY = -H2; break; } // 4 front, 4 back vertices p->vertices = (GLfloat *) calloc (8 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animation", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 4 front vertices in ccw direction pv[0] = topLeftX; pv[1] = topLeftY; pv[2] = halfThick; pv[3] = bottomLeftX; pv[4] = bottomLeftY; pv[5] = halfThick; pv[6] = bottomRightX; pv[7] = bottomRightY; pv[8] = halfThick; pv[9] = topRightX; pv[10] = topRightY; pv[11] = halfThick; // Determine 4 back vertices in cw direction pv[12] = topRightX; pv[13] = topRightY; pv[14] = -halfThick; pv[15] = bottomRightX; pv[16] = bottomRightY; pv[17] = -halfThick; pv[18] = bottomLeftX; pv[19] = bottomLeftY; pv[20] = -halfThick; pv[21] = topLeftX; pv[22] = topLeftY; pv[23] = -halfThick; // 24 indices for 4 sides (for triangle strip) p->sideIndices = (GLushort *) calloc (6 * 4, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animation", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; int id = 0; ind[id++] = 0; ind[id++] = 7; ind[id++] = 6; ind[id++] = 0; ind[id++] = 1; ind[id++] = 6; ind[id++] = 1; ind[id++] = 6; ind[id++] = 5; ind[id++] = 1; ind[id++] = 2; ind[id++] = 5; ind[id++] = 2; ind[id++] = 5; ind[id++] = 4; ind[id++] = 2; ind[id++] = 3; ind[id++] = 4; ind[id++] = 3; ind[id++] = 4; ind[id++] = 7; ind[id++] = 3; ind[id++] = 0; ind[id++] = 7; if (i < 4) { p->boundingBox.x1 = p->centerPos.x () + topLeftX; p->boundingBox.y1 = p->centerPos.y () + topLeftY; p->boundingBox.x2 = ceil (p->centerPos.x () + bottomRightX); p->boundingBox.y2 = ceil (p->centerPos.y () + bottomRightY); } else { p->boundingBox.x1 = p->centerPos.x () + bottomLeftX; p->boundingBox.y1 = p->centerPos.y () + topLeftY; p->boundingBox.x2 = ceil (p->centerPos.x () + bottomRightX); p->boundingBox.y2 = ceil (p->centerPos.y () + bottomLeftY); } p->normals = NULL; i++; } return true; } void AirplaneAnim::init () { if (!tesselateIntoAirplane ()) return; float airplanePathLength = optValF (AnimationaddonOptions::AirplanePathLength); float winLimitsW; // boundaries of polygon tessellation float winLimitsH; winLimitsW = BORDER_W (mWindow); winLimitsH = BORDER_H (mWindow); float H4 = (float)winLimitsH / 4; float H6 = (float)winLimitsH / 6; int i = 0; foreach (PolygonObject *pol, mPolygons) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; p->moveStartTime = 0.00; p->moveDuration = 0.19; p->moveStartTime2 = 0.19; p->moveDuration2 = 0.19; p->moveStartTime3 = 0.38; p->moveDuration3 = 0.19; p->moveStartTime4 = 0.58; p->moveDuration4 = 0.09; p->moveDuration5 = 0.41; p->flyFinalRotation.set (90, 10, 0); p->flyTheta = 0; p->centerPosFly.set (0, 0, 0); p->flyScale = 0; p->flyFinalScale = 6 * (winLimitsW / (screen->width () / 2)); switch (i) { case 0: p->rotAxisOffset.set (-H4, H4, 0.0f); p->rotAxis.set (1.00, 1.00, 0.00); p->finalRotAng = 179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0.00, 0.00); p->finalRotAngA = 84; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0.00, 0.00, 0.00); p->finalRotAngB = 0; break; case 1: p->rotAxisOffset.set (-H4, H4, 0.0f); p->rotAxis.set (1.00, 1.00, 0.00); p->finalRotAng = 179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0.00, 0.00); p->finalRotAngA = 84; p->rotAxisOffsetB.set (0, H6, 0); p->rotAxisB.set (1.00, 0.00, 0.00); p->finalRotAngB = -84; break; case 2: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = 84; p->rotAxisOffsetB.set (0, H6, 0); p->rotAxisB.set (1.00, 0, 0); p->finalRotAngB = -84; break; case 3: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = 84; p->moveDuration3 = 0.00; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0, 0, 0); p->finalRotAngB = 0; break; case 4: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = -84; p->moveDuration3 = 0.00; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0, 0, 0); p->finalRotAngB = 0; break; case 5: p->moveDuration = 0.00; p->rotAxisOffset.set (0, 0, 0); p->rotAxis.set (0, 0, 0); p->finalRotAng = 0; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0, 0); p->finalRotAngA = -84; p->rotAxisOffsetB.set (0, -H6, 0); p->rotAxisB.set (1.00, 0, 0); p->finalRotAngB = 84; break; case 6: p->rotAxisOffset.set (-H4, -H4, 0); p->rotAxis.set (1.00, -1.00, 0.00); p->finalRotAng = -179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1.00, 0.00, 0.00); p->finalRotAngA = -84; p->rotAxisOffsetB.set (0, -H6, 0); p->rotAxisB.set (1.00, 0, 0); p->finalRotAngB = 84; break; case 7: p->rotAxisOffset.set (-H4, -H4, 0); p->rotAxis.set (1.00, -1.00, 0.00); p->finalRotAng = -179.5; p->rotAxisOffsetA.set (0, 0, 0); p->rotAxisA.set (1, 0, 0); p->finalRotAngA = -84; p->rotAxisOffsetB.set (0, 0, 0); p->rotAxisB.set (0.00, 0.00, 0.00); p->finalRotAngB = 0; break; } i++; } if (airplanePathLength >= 1) mAllFadeDuration = 0.30f / airplanePathLength; else mAllFadeDuration = 0.30f; mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; mBackAndSidesFadeDur = 0; /* mExtraPolygonTransformFunc = &AirplaneExtraPolygonTransformFunc; */ // Duration extension mTotalTime *= 2 + airplanePathLength; mRemainingTime = mTotalTime; } void AirplaneAnim::stepPolygon (PolygonObject *pol, float forwardProgress) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; /* A stupid hack */ if (pol == mPolygons.front ()) { short x, y; // Make sure the airplane always flies towards mouse pointer if (mCurWindowEvent == WindowEventClose) AnimScreen::get (screen)->getMousePointerXY (&x, &y); mIcon.setX (x); mIcon.setY (y); } float airplanePathLength = optValF (AnimationaddonOptions::AirplanePathLength); bool airplaneFly2TaskBar = optValB (AnimationaddonOptions::AirplaneFlyToTaskbar); /* Phase1: folding: flaps, folding center, folding wings. * Phase2: rotate and fly. */ if (forwardProgress > p->moveStartTime && forwardProgress < p->moveStartTime4) // Phase1: folding: flaps, center, wings. { float moveProgress1 = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress1 /= p->moveDuration; else moveProgress1 = 0; if (moveProgress1 < 0) moveProgress1 = 0; else if (moveProgress1 > 1) moveProgress1 = 1; float moveProgress2 = forwardProgress - p->moveStartTime2; if (p->moveDuration2 > 0) moveProgress2 /= p->moveDuration2; else moveProgress2 = 0; if (moveProgress2 < 0) moveProgress2 = 0; else if (moveProgress2 > 1) moveProgress2 = 1; float moveProgress3 = forwardProgress - p->moveStartTime3; if (p->moveDuration3 > 0) moveProgress3 /= p->moveDuration3; else moveProgress3 = 0; if (moveProgress3 < 0) moveProgress3 = 0; else if (moveProgress3 > 1) moveProgress3 = 1; p->centerPos = p->centerPosStart; p->rotAngle = moveProgress1 * p->finalRotAng; p->rotAngleA = moveProgress2 * p->finalRotAngA; p->rotAngleB = moveProgress3 * p->finalRotAngB; p->flyRotation.set (0, 0, 0); p->flyScale = 0; } else if (forwardProgress >= p->moveStartTime4) // Phase2: rotate and fly { float moveProgress4 = forwardProgress - p->moveStartTime4; if (p->moveDuration4 > 0) moveProgress4 /= p->moveDuration4; if (moveProgress4 < 0) moveProgress4 = 0; else if (moveProgress4 > 1) moveProgress4 = 1; float moveProgress5 = forwardProgress - (p->moveStartTime4 + .01); if (p->moveDuration5 > 0) moveProgress5 /= p->moveDuration5; if (moveProgress5 < 0) moveProgress5 = 0; else if (moveProgress5 > 1) moveProgress5 = 1; p->rotAngle = p->finalRotAng; p->rotAngleA = p->finalRotAngA; p->rotAngleB = p->finalRotAngB; p->flyRotation.set (moveProgress4 * p->flyFinalRotation.x (), moveProgress4 * p->flyFinalRotation.y (), 0); // flying path float icondiffx = 0; p->flyTheta = moveProgress5 * -M_PI_2 * airplanePathLength; p->centerPosFly.setX (screen->width () * .4 * sin (2 * p->flyTheta)); if (((mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventUnminimize) && airplaneFly2TaskBar) || mCurWindowEvent == WindowEventOpen || mCurWindowEvent == WindowEventClose) { // flying path ends at icon/pointer int sign = 1; if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) sign = -1; icondiffx = (((mIcon.x () + mIcon.width () / 2) - (p->centerPosStart.x () + sign * screen->width () * .4 * sin (2 * -M_PI_2 * airplanePathLength))) * moveProgress5); p->centerPosFly.setY ( (((int) mIcon.x () + (int) mIcon.height () / 2) - p->centerPosStart.y ()) * -sin (p->flyTheta / airplanePathLength)); } else { if (p->centerPosStart.y () < screen->height () * .33 || p->centerPosStart.y () > screen->height () * .66) p->centerPosFly.setY ( screen->height () * .6 * sin (p->flyTheta / 3.4)); else p->centerPosFly.setY ( screen->height () * .4 * sin (p->flyTheta / 3.4)); if (p->centerPosStart.y () < screen->height () * .33) p->centerPosFly.setY (p->centerPosFly.y () * -1); } p->flyFinalRotation.setZ ( ((atan (2.0) + M_PI_2) * sin (p->flyTheta) - M_PI_2) * 180 / M_PI); p->flyFinalRotation.add (0, 0, 90); if (mCurWindowEvent == WindowEventMinimize || mCurWindowEvent == WindowEventClose) { p->flyFinalRotation.setZ (p->flyFinalRotation.z () * -1); } else if (mCurWindowEvent == WindowEventUnminimize || mCurWindowEvent == WindowEventOpen) { p->centerPosFly.setX (p->centerPosFly.x () * -1); } p->flyRotation.setZ (p->flyFinalRotation.z ()); p->centerPos.setX (p->centerPosStart.x () + p->centerPosFly.x () + icondiffx); p->centerPos.setY (p->centerPosStart.y () + p->centerPosFly.y ()); p->centerPos.setZ (p->centerPosStart.z () + p->centerPosFly.z ()); p->flyScale = moveProgress5 * p->flyFinalScale; } } void AirplaneAnim::transformPolygon (GLMatrix &matrix, const PolygonObject *pol) { AirplanePolygonObject *p = (AirplanePolygonObject *) pol; matrix.rotate (p->flyRotation.x (), 1, 0, 0); //rotate on axis X matrix.rotate (-p->flyRotation.y (), 0, 1, 0); // rotate on axis Y matrix.rotate (p->flyRotation.z (), 0, 0, 1); // rotate on axis Z matrix.scale (1.0 / (1.0 + p->flyScale), 1.0 / (1.0 + p->flyScale), 1.0 / (1.0 + p->flyScale)); // Move by "rotation axis offset A" matrix.translate (p->rotAxisOffsetA.x (), p->rotAxisOffsetA.y (), p->rotAxisOffsetA.z ()); // Rotate by desired angle A matrix.rotate (p->rotAngleA, p->rotAxisA.x (), p->rotAxisA.y (), p->rotAxisA.z ()); // Move back to center from A matrix.translate (-p->rotAxisOffsetA.x (), -p->rotAxisOffsetA.y (), -p->rotAxisOffsetA.z ()); // Move by "rotation axis offset B" matrix.translate (p->rotAxisOffsetB.x (), p->rotAxisOffsetB.y (), p->rotAxisOffsetB.z ()); // Rotate by desired angle B matrix.rotate (p->rotAngleB, p->rotAxisB.x (), p->rotAxisB.y (), p->rotAxisB.z ()); // Move back to center from B matrix.translate (-p->rotAxisOffsetB.x (), -p->rotAxisOffsetB.y (), -p->rotAxisOffsetB.z ()); } /* TODO: Damage a region, not the whole screen */ void AirplaneAnim::updateBB (CompOutput &) { Box screenBox = {0, static_cast (screen->width ()), 0, static_cast (screen->height ()) }; mAWindow->expandBBWithBox (screenBox); } void AirplaneAnim::freePolygonObjects () { while (!mPolygons.empty ()) { AirplanePolygonObject *p = (AirplanePolygonObject *) mPolygons.back (); if (p->nVertices > 0) { if (p->vertices) { free (p->vertices); p->vertices = NULL; } if (p->sideIndices) { free (p->sideIndices); p->sideIndices = NULL; } } delete p; mPolygons.pop_back (); } mPolygons.clear (); } ./plugins/animationaddon/src/glide3.cpp0000644000004100000410000000517513246301623020363 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * glide3.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Slab ========================= const float Glide3Anim::kDurationFactor = 1.82; Glide3Anim::Glide3Anim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } void Glide3Anim::init () { //if (!polygonsAnimInit (w)) //return false; float finalDistFac = optValF (AnimationaddonOptions::Glide3AwayPosition); float finalRotAng = optValF (AnimationaddonOptions::Glide3AwayAngle); float thickness = optValF (AnimationaddonOptions::Glide3Thickness); //PolygonSet *pset = aw->eng.polygonSet; mIncludeShadows = (thickness < 1e-5); if (!tessellateIntoRectangles (1, 1, thickness)) return; foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (1, 0, 0); p->finalRelPos.set (0, 0, finalDistFac * 0.8 * DEFAULT_Z_CAMERA * screen->width ()); p->finalRotAng = finalRotAng; } mAllFadeDuration = 1.0f; mBackAndSidesFadeDur = 0.2f; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } ./plugins/animationaddon/src/skewer.cpp0000644000004100000410000001244713246301623020514 0ustar www-datawww-data/** * Animation plugin for compiz/beryl * * skewer.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * Fold and Skewer added by : Tomasz Kołodziejski * E-mail : tkolodziejski@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "private.h" // ===================== Effect: Skewer ========================= const float SkewerAnim::kDurationFactor = 1.67; SkewerAnim::SkewerAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectiveWindow; } static void getDirection (int *dir, int *c, int direction) { switch (direction) { case 0: // left dir[(*c)++] = 0; break; case 1: // right dir[(*c)++] = 1; break; case 2: // left-right dir[(*c)++] = 0; dir[(*c)++] = 1; break; case 3: // up dir[(*c)++] = 2; break; case 4: // downs dir[(*c)++] = 3; break; case 5: // up-down dir[(*c)++] = 2; dir[(*c)++] = 3; break; case 6: // in dir[(*c)++] = 4; break; case 7: // out dir[(*c)++] = 5; break; case 8: // in-out dir[(*c)++] = 4; dir[(*c)++] = 5; break; case 9: // random getDirection (dir, c, floor (RAND_FLOAT () * 8)); break; } } void SkewerAnim::init () { float thickness = optValF (AnimationaddonOptions::SkewerThickness); int rotation = optValI (AnimationaddonOptions::SkewerRotation); int gridSizeX = optValI (AnimationaddonOptions::SkewerGridx); int gridSizeY = optValI (AnimationaddonOptions::SkewerGridy); int dir[2]; // directions array int c = 0; // number of directions getDirection (dir, &c, (int) optValI (AnimationaddonOptions::SkewerDirection)); if (optValI (AnimationaddonOptions::SkewerTessellation) == AnimationaddonOptions::SkewerTessellationHexagonal) { if (!tessellateIntoHexagons (gridSizeX, gridSizeY, thickness)) return; } else { if (!tessellateIntoRectangles (gridSizeX, gridSizeY, thickness)) return; } int numPolygons = mPolygons.size (); int times[numPolygons]; int last_time = numPolygons - 1; int maxZ = .8 * DEFAULT_Z_CAMERA * ::screen->width (); int i; for (i = 0; i < numPolygons; i++) times[i] = i; foreach (PolygonObject *p, mPolygons) { if (c > 0) { switch (dir[(int)floor (RAND_FLOAT () * c)]) { case 0: // left p->finalRelPos.setX (-::screen->width ()); p->rotAxis.setX (rotation); break; case 1: // right p->finalRelPos.setX (::screen->width ()); p->rotAxis.setX (rotation); break; case 2: // up p->finalRelPos.setY (-::screen->height ()); p->rotAxis.setY (rotation); break; case 3: // down p->finalRelPos.setY (::screen->height ()); p->rotAxis.setY (rotation); break; case 4: // in p->finalRelPos.setZ (-maxZ); p->rotAxis.setX (rotation); p->rotAxis.setY (rotation); break; case 5: // out p->finalRelPos.setZ (maxZ); p->rotAxis.setX (rotation); p->rotAxis.setY (rotation); break; } p->finalRotAng = rotation; } // if no direction is set - just fade // choose random start_time int rand_time = floor (RAND_FLOAT () * last_time); p->moveStartTime = 0.8 / (float)numPolygons * times[rand_time]; p->moveDuration = 1 - p->moveStartTime; p->fadeStartTime = p->moveStartTime + 0.2; p->fadeDuration = 1 - p->fadeStartTime; times[rand_time] = times[last_time]; // copy last one over times[rand_time] last_time--; //descrease last_time } } void SkewerAnim::stepPolygon (PolygonObject *p, float forwardProgress) { float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; p->centerPos.set (pow (moveProgress, 2) * p->finalRelPos.x () + p->centerPosStart.x (), pow (moveProgress, 2) * p->finalRelPos.y () + p->centerPosStart.y (), 1.0f / ::screen->width () * pow (moveProgress, 2) * p->finalRelPos.z () + p->centerPosStart.z ()); // rotate p->rotAngle = pow (moveProgress, 2) * p->finalRotAng + p->rotAngleStart; } ./plugins/animationaddon/src/polygon.cpp0000644000004100000410000015072213246301623020702 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * polygon.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" static const unsigned short MIN_WINDOW_GRID_SIZE = 10; PolygonAnim::PolygonAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, duration, info, icon), BaseAddonAnim::BaseAddonAnim (w, curWindowEvent, duration, info, icon) { mAllFadeDuration = -1.0f; mIncludeShadows = false; } typedef struct { float dist; float x, y; // relative from center } SpokeVertex; typedef struct { float direction; float length; SpokeVertex *spokeVertex; } Spoke; typedef struct { bool isTriangle; // false if 4 sided, true if 3 sided float centerX, centerY; float pt0X, pt0Y, pt1X, pt1Y, pt2X, pt2Y, pt3X, pt3Y; // if is_triangle is true, these are unused } Shard; // Frees up polygon objects in pset void PolygonAnim::freePolygonObjects () { while (!mPolygons.empty ()) { PolygonObject *p = mPolygons.back (); if (p->nVertices > 0) { if (p->vertices) free (p->vertices); if (p->sideIndices) free (p->sideIndices); if (p->normals) free (p->normals); } if (p->effectParameters) delete p->effectParameters; delete p; mPolygons.pop_back (); } } // Frees up intersecting polygon info of PolygonSet clips void PolygonAnim::freeClipsPolygons () { foreach (Clip4Polygons &c, mClips) { foreach (PolygonClipInfo *pci, c.intersectingPolygonInfos) delete pci; } } PolygonAnim::~PolygonAnim () // was freePolygonSet { freePolygonObjects (); freeClipsPolygons (); } // Tessellates window into extruded rectangular objects bool PolygonAnim::tessellateIntoRectangles (int gridSizeX, int gridSizeY, float thickness) { // boundaries of polygon tessellation int winLimitsX; int winLimitsY; int winLimitsW; int winLimitsH; CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (mIncludeShadows) { winLimitsX = outRect.x (); winLimitsY = outRect.y (); winLimitsW = outRect.width () - 1; // avoid artifact on right edge winLimitsH = outRect.height (); } else { winLimitsX = inRect.x (); winLimitsY = inRect.y (); winLimitsW = inRect.width (); winLimitsH = inRect.height (); } float minRectSize = MIN_WINDOW_GRID_SIZE; float rectW = winLimitsW / (float)gridSizeX; float rectH = winLimitsH / (float)gridSizeY; if (rectW < minRectSize) gridSizeX = winLimitsW / minRectSize; // int div. if (rectH < minRectSize) gridSizeY = winLimitsH / minRectSize; // int div. freePolygonObjects (); mPolygons.clear (); for (int i = 0; i < gridSizeX * gridSizeY; i++) { mPolygons.push_back (new PolygonObject); } thickness /= ::screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float cellW = (float)winLimitsW / gridSizeX; float cellH = (float)winLimitsH / gridSizeY; float halfW = cellW / 2; float halfH = cellH / 2; float halfThick = mThickness / 2; vector::iterator it = mPolygons.begin (); for (int y = 0; y < gridSizeY; y++) { float posY = winLimitsY + cellH * (y + 0.5); for (int x = 0; x < gridSizeX; x++, it++) { PolygonObject *p = *it; p->centerPos.set (winLimitsX + cellW * (x + 0.5), posY, -halfThick); p->centerPosStart = p->centerPos; p->rotAngle = p->rotAngleStart = 0; p->centerRelPos.set ((x + 0.5) / gridSizeX, (y + 0.5) / gridSizeY); p->nSides = 4; p->nVertices = 2 * 4; mNumTotalFrontVertices += 4; // 4 front, 4 back vertices p->vertices = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } // Vertex normals p->normals = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->normals) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 4 front vertices in ccw direction pv[0] = -halfW; pv[1] = -halfH; pv[2] = halfThick; pv[3] = -halfW; pv[4] = halfH; pv[5] = halfThick; pv[6] = halfW; pv[7] = halfH; pv[8] = halfThick; pv[9] = halfW; pv[10] = -halfH; pv[11] = halfThick; // Determine 4 back vertices in cw direction pv[12] = halfW; pv[13] = -halfH; pv[14] = -halfThick; pv[15] = halfW; pv[16] = halfH; pv[17] = -halfThick; pv[18] = -halfW; pv[19] = halfH; pv[20] = -halfThick; pv[21] = -halfW; pv[22] = -halfH; pv[23] = -halfThick; // 24 indices for 4 sides (for triangles) p->sideIndices = (GLushort *)calloc (6 * 4, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; GLfloat *nor = p->normals; int id = 0; // Left face ind[id++] = 6; // First vertex ind[id++] = 1; ind[id++] = 0; ind[id++] = 6; ind[id++] = 0; ind[id++] = 7; nor[6 * 3 + 0] = -1; // Flat shading only uses 1st vertex's normal nor[6 * 3 + 1] = 0; // in a polygon, vertex 6 for this face. nor[6 * 3 + 2] = 0; // Bottom face ind[id++] = 1; ind[id++] = 6; ind[id++] = 5; ind[id++] = 5; ind[id++] = 2; ind[id++] = 1; nor[1 * 3 + 0] = 0; nor[1 * 3 + 1] = 1; nor[1 * 3 + 2] = 0; // Right face ind[id++] = 5; ind[id++] = 2; ind[id++] = 3; ind[id++] = 5; ind[id++] = 3; ind[id++] = 4; nor[2 * 3 + 0] = 1; nor[2 * 3 + 1] = 0; nor[2 * 3 + 2] = 0; // Top face ind[id++] = 7; ind[id++] = 0; ind[id++] = 3; ind[id++] = 3; ind[id++] = 4; ind[id++] = 7; nor[7 * 3 + 0] = 0; nor[7 * 3 + 1] = -1; nor[7 * 3 + 2] = 0; // Front face normal nor[0] = 0; nor[1] = 0; nor[2] = 1; // Back face normal nor[4 * 3 + 0] = 0; nor[4 * 3 + 1] = 0; nor[4 * 3 + 2] = -1; // Determine bounding box (to test intersection with clips) p->boundingBox.x1 = -halfW; p->boundingBox.y1 = -halfH; p->boundingBox.x2 = halfW; p->boundingBox.y2 = halfH; p->boundSphereRadius = sqrt (halfW * halfW + halfH * halfH + halfThick * halfThick); // Reset remaining members p->effectParameters = NULL; p->moveStartTime = 0; p->moveDuration = 0; p->fadeStartTime = 0; p->fadeDuration = 0; } } return true; } // Tessellates window into extruded hexagon objects bool PolygonAnim::tessellateIntoHexagons (int gridSizeX, int gridSizeY, float thickness) { // boundaries of polygon tessellation int winLimitsX; int winLimitsY; int winLimitsW; int winLimitsH; CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (mIncludeShadows) { winLimitsX = outRect.x (); winLimitsY = outRect.y (); winLimitsW = outRect.width () - 1; // avoid artifact on right edge winLimitsH = outRect.height (); } else { winLimitsX = inRect.x (); winLimitsY = inRect.y (); winLimitsW = inRect.width (); winLimitsH = inRect.height (); } float minSize = 20; float hexW = winLimitsW / (float)gridSizeX; float hexH = winLimitsH / (float)gridSizeY; if (hexW < minSize) gridSizeX = winLimitsW / minSize; // int div. if (hexH < minSize) gridSizeY = winLimitsH / minSize; // int div. freePolygonObjects (); for (int i = 0; i < (gridSizeY + 1) * gridSizeX + ((gridSizeY + 1 ) / 2); i++) mPolygons.push_back (new PolygonObject); thickness /= ::screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float cellW = (float)winLimitsW / gridSizeX; float cellH = (float)winLimitsH / gridSizeY; float halfW = cellW / 2; float twoThirdsH = 2*cellH / 3; float thirdH = cellH / 3; float halfThick = mThickness / 2; vector::iterator it = mPolygons.begin (); for (int y = 0; y < gridSizeY+1; y++) { float posY = winLimitsY + cellH * (y); int numPolysinRow = (y%2==0) ? gridSizeX : (gridSizeX + 1); // Clip polygons to the window dimensions float topY, topRightY, topLeftY, bottomY, bottomLeftY, bottomRightY; if (y == 0) { topY = topRightY = topLeftY = 0; bottomY = twoThirdsH; bottomLeftY = bottomRightY = thirdH; } else if (y == gridSizeY) { bottomY = bottomLeftY = bottomRightY = 0; topY = -twoThirdsH; topLeftY = topRightY = -thirdH; } else { topY = -twoThirdsH; topLeftY = topRightY = -thirdH; bottomLeftY = bottomRightY = thirdH; bottomY = twoThirdsH; } for (int x = 0; x < numPolysinRow; x++, it++) { PolygonObject *p = *it; // Clip odd rows when necessary float topLeftX, topRightX, bottomLeftX, bottomRightX; if (y%2 == 1) { if (x == 0) { topLeftX = bottomLeftX = 0; topRightX = halfW; bottomRightX = halfW; } else if (x == numPolysinRow-1) { topRightX = bottomRightX = 0; topLeftX = -halfW; bottomLeftX = -halfW; } else { topLeftX = bottomLeftX = -halfW; topRightX = bottomRightX = halfW; } } else { topLeftX = bottomLeftX = -halfW; topRightX = bottomRightX = halfW; } p->centerPos.set (winLimitsX + cellW * (x + (y%2 ? 0.0 : 0.5)), posY, -halfThick); p->centerPosStart = p->centerPos; p->rotAngle = p->rotAngleStart = 0; p->centerRelPos.set ((x + 0.5) / gridSizeX, (y + 0.5) / gridSizeY); p->nSides = 6; p->nVertices = 2 * 6; mNumTotalFrontVertices += 6; // 6 front, 6 back vertices p->vertices = (GLfloat *)calloc (6 * 2 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } // Vertex normals p->normals = (GLfloat *)calloc (6 * 2 * 3, sizeof (GLfloat)); if (!p->normals) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 6 front vertices in ccw direction // Starting at top pv[0] = 0; pv[1] = topY; pv[2] = halfThick; pv[3] = topLeftX; pv[4] = topLeftY; pv[5] = halfThick; pv[6] = bottomLeftX; pv[7] = bottomLeftY; pv[8] = halfThick; pv[9] = 0; pv[10] = bottomY; pv[11] = halfThick; pv[12] = bottomRightX; pv[13] = bottomRightY; pv[14] = halfThick; pv[15] = topRightX; pv[16] = topRightY; pv[17] = halfThick; // Determine 6 back vertices in cw direction pv[18] = topRightX; pv[19] = topRightY; pv[20] = -halfThick; pv[21] = bottomRightX; pv[22] = bottomRightY; pv[23] = -halfThick; pv[24] = 0; pv[25] = bottomY; pv[26] = -halfThick; pv[27] = bottomLeftX; pv[28] = bottomLeftY; pv[29] = -halfThick; pv[30] = topLeftX; pv[31] = topLeftY; pv[32] = -halfThick; pv[33] = 0; pv[34] = topY; pv[35] = -halfThick; // 36 indices per 6 sides (for triangles) p->sideIndices = (GLushort *)calloc (6 * 6, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; GLfloat *nor = p->normals; int id = 0; // Approximate normals // upper left side face ind[id++] = 11; // First vertex ind[id++] = 10; ind[id++] = 1; ind[id++] = 1; ind[id++] = 0; ind[id++] = 11; nor[11 * 3 + 0] = -1; // Flat shading only uses 1st vertex's normal nor[11 * 3 + 1] = -1; // in a polygon, vertex 11 for this face. nor[11 * 3 + 2] = 0; if (y == 0) // top half cropped nor[11 * 3 + 0] = 0; // left side face ind[id++] = 1; ind[id++] = 10; ind[id++] = 9; ind[id++] = 9; ind[id++] = 2; ind[id++] = 1; nor[1 * 3 + 0] = -1; nor[1 * 3 + 1] = 0; nor[1 * 3 + 2] = 0; // lower left side face ind[id++] = 2; ind[id++] = 9; ind[id++] = 8; ind[id++] = 8; ind[id++] = 3; ind[id++] = 2; nor[2 * 3 + 0] = -1; nor[2 * 3 + 1] = 1; nor[2 * 3 + 2] = 0; if (y == gridSizeY) // bottom half cropped nor[2 * 3 + 0] = 0; // lower right side face ind[id++] = 3; ind[id++] = 8; ind[id++] = 7; ind[id++] = 7; ind[id++] = 4; ind[id++] = 3; nor[3 * 3 + 0] = 1; nor[3 * 3 + 1] = 1; nor[3 * 3 + 2] = 0; if (y == gridSizeY) // bottom half cropped nor[3 * 3 + 0] = 0; // right side face ind[id++] = 4; ind[id++] = 7; ind[id++] = 6; ind[id++] = 6; ind[id++] = 5; ind[id++] = 4; nor[4 * 3 + 0] = 1; nor[4 * 3 + 1] = 0; nor[4 * 3 + 2] = 0; // upper right side face ind[id++] = 5; ind[id++] = 6; ind[id++] = 11; ind[id++] = 11; ind[id++] = 0; ind[id++] = 5; nor[5 * 3 + 0] = 1; nor[5 * 3 + 1] = -1; nor[5 * 3 + 2] = 0; if (y == 0) // top half cropped nor[5 * 3 + 0] = 0; // Front face normal nor[0] = 0; nor[1] = 0; nor[2] = 1; // Back face normal nor[6 * 3 + 0] = 0; nor[6 * 3 + 1] = 0; nor[6 * 3 + 2] = -1; // Determine bounding box (to test intersection with clips) p->boundingBox.x1 = topLeftX; p->boundingBox.y1 = topY; p->boundingBox.x2 = bottomRightX; p->boundingBox.y2 = bottomY; p->boundSphereRadius = sqrt ((topRightX - topLeftX) * (topRightX - topLeftX) / 4 + (bottomY - topY) * (bottomY - topY) / 4 + halfThick * halfThick); // Reset remaining members p->effectParameters = NULL; p->moveStartTime = 0; p->moveDuration = 0; p->fadeStartTime = 0; p->fadeDuration = 0; } } return true; } /* 90 //degree orientation * | * 180--+--0 * | * 270 * This function tessellates the window into radial shards, with * each shard split into the number of "tiers". This forms a broken * glass or spiderweb appearance. */ bool PolygonAnim::tessellateIntoGlass (int spokeMultiplier, int numTiers, float thickness) { int numSpokes = 4 * spokeMultiplier; int winLimitsX, winLimitsY, winLimitsW, winLimitsH; float centerX, centerY; float topBottomLength, leftRightLength; Spoke spokes[numSpokes]; memset (spokes, 0, sizeof (Spoke) * numSpokes); for (int i = 0; i < numSpokes; i++) { spokes[i].spokeVertex = (SpokeVertex *) calloc (numTiers, sizeof (SpokeVertex)); } CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (mIncludeShadows) { winLimitsX = outRect.x (); winLimitsY = outRect.y (); winLimitsW = outRect.width () - 1; // avoid artifact on right edge winLimitsH = outRect.height (); } else { winLimitsX = inRect.x (); winLimitsY = inRect.y (); winLimitsW = inRect.width (); winLimitsH = inRect.height (); } //tessellation looks horrible if its too small, its better //just to skip it if (winLimitsW < 100 || winLimitsH < 100) return false; centerX = (winLimitsW / 2.0) + winLimitsX; centerY = (winLimitsH / 2.0) + winLimitsY; /* Calculate corner angles */ float cornerAngle[4]; cornerAngle[0] = atanf ((centerY - winLimitsY) / (winLimitsX + winLimitsW - centerX)); cornerAngle[1] = M_PI - cornerAngle[0]; cornerAngle[2] = M_PI + cornerAngle[0]; cornerAngle[3] = 2 * M_PI - cornerAngle[0]; float range; //calculate the vertex positions for (int i = 0; i < numSpokes; i++) { /* The spokes must go into the corners. The remaining spokes fit between the corner spokes */ if ((i % spokeMultiplier) == 0) { spokes[i].direction = cornerAngle[i / spokeMultiplier]; } else { range = cornerAngle[((i / spokeMultiplier) + 1) % 4 ] - cornerAngle[i / spokeMultiplier]; if (range < 0) range = 2 * M_PI - cornerAngle[i / spokeMultiplier] + cornerAngle[((i / spokeMultiplier) + 1) % 4 ]; spokes[i].direction = cornerAngle[i / spokeMultiplier] + (i % spokeMultiplier) * range / spokeMultiplier; if (spokes[i].direction > 2 * M_PI) spokes[i].direction -= 2 * M_PI; // Random direction spokes[i].direction += range * (float) rand () / 3 / RAND_MAX; } //calculate the length of the spoke //calculate top/bottom lenght if ((spokes[i].direction < M_PI)) topBottomLength = (centerY - winLimitsY); else topBottomLength = ((winLimitsY + winLimitsH)- centerY); topBottomLength /= sinf (spokes[i].direction); if (topBottomLength < 0) topBottomLength *= -1; //calculate left right length if ((spokes[i].direction < M_PI / 2) || (spokes[i].direction > 3 * M_PI / 2)) leftRightLength = (winLimitsX + winLimitsW) - centerX; else leftRightLength = centerX - winLimitsX; leftRightLength /= cosf (spokes[i].direction); if (leftRightLength < 0) leftRightLength *= -1; //take the smaller of the two if (leftRightLength < topBottomLength) spokes[i].length = leftRightLength; else spokes[i].length = topBottomLength; float percent = 1.0 / ((float) numTiers); //calculate spoke vertexes for (int j = 0 ; j < numTiers; j++) { spokes[i].spokeVertex[j].dist = percent * (j + 1) * spokes[i].length; spokes[i].spokeVertex[j].x = centerX + (spokes[i].spokeVertex[j].dist * cos (spokes[i].direction)); spokes[i].spokeVertex[j].y = centerY + (spokes[i].spokeVertex[j].dist * sin (spokes[i].direction)); } } Shard shards[numSpokes][numTiers]; //calculate the center and bounds of each polygon for (int i = 0; i < numSpokes; i++) { for (int j = 0; j < numTiers; j++) { switch (j) { case 0: //the first tier is triangles shards[i][j].isTriangle = true; shards[i][j].pt0X = centerX; shards[i][j].pt0Y = centerY; shards[i][j].pt1X = spokes[i].spokeVertex[j].x; shards[i][j].pt1Y = spokes[i].spokeVertex[j].y; shards[i][j].pt2X = spokes[(i + 1) % numSpokes].spokeVertex[j].x; shards[i][j].pt2Y = spokes[(i + 1) % numSpokes].spokeVertex[j].y; shards[i][j].pt3X = shards[i][j].pt0X;//fourth point is not used shards[i][j].pt3Y = shards[i][j].pt0Y; //find lengths shards[i][j].centerX = (shards[i][j].pt2X + shards[i][j].pt1X + shards[i][j].pt0X)/3; shards[i][j].centerY = (shards[i][j].pt2Y + shards[i][j].pt1Y + shards[i][j].pt0Y)/3; break; default: //the other tiers are 4 sided polygons shards[i][j].isTriangle = false; shards[i][j].pt0X = spokes[i].spokeVertex[j - 1].x; shards[i][j].pt0Y = spokes[i].spokeVertex[j - 1].y; shards[i][j].pt1X = spokes[i].spokeVertex[j].x; shards[i][j].pt1Y = spokes[i].spokeVertex[j].y; if (i != numSpokes - 1) { shards[i][j].pt2X = spokes[i + 1].spokeVertex[j].x; shards[i][j].pt2Y = spokes[i + 1].spokeVertex[j].y; shards[i][j].pt3X = spokes[i + 1].spokeVertex[j - 1].x; shards[i][j].pt3Y = spokes[i + 1].spokeVertex[j - 1].y; } else { shards[i][j].pt2X = spokes[0].spokeVertex[j].x; shards[i][j].pt2Y = spokes[0].spokeVertex[j].y; shards[i][j].pt3X = spokes[0].spokeVertex[j - 1].x; shards[i][j].pt3Y = spokes[0].spokeVertex[j - 1].y; } //calculate the center of the polygon shards[i][j].centerX = (shards[i][j].pt0X + shards[i][j].pt1X + shards[i][j].pt2X + shards[i][j].pt3X)/4; shards[i][j].centerY = (shards[i][j].pt0Y + shards[i][j].pt1Y + shards[i][j].pt2Y + shards[i][j].pt3Y)/4; break; } } } //set up polygons freePolygonObjects (); for (int i = 0; i < numSpokes * numTiers; i++) mPolygons.push_back (new PolygonObject); thickness /= ::screen->width (); mThickness = thickness; mNumTotalFrontVertices = 0; float halfThick = mThickness / 2; vector::iterator it = mPolygons.begin (); for (int yc = 0; yc < numSpokes; yc++) //spokes { for (int xc = 0; xc < numTiers; xc++, it++) //tiers { PolygonObject *p = *it; p->centerPos.set (shards[yc][xc].centerX, shards[yc][xc].centerY, -halfThick); p->centerPosStart = p->centerPos; p->centerRelPos.set ((shards[yc][xc].centerX - winLimitsX) / winLimitsW, (shards[yc][xc].centerY - winLimitsY) / winLimitsH); p->rotAngle = p->rotAngleStart = 0; p->nSides = 4; p->nVertices = 2 * 4; mNumTotalFrontVertices += 4; // 4 front, 4 back vertices p->vertices = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->vertices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } // Vertex normals p->normals = (GLfloat *)calloc (8 * 3, sizeof (GLfloat)); if (!p->normals) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLfloat *pv = p->vertices; // Determine 4 front vertices in ccw direction pv[0] = -shards[yc][xc].centerX + shards[yc][xc].pt3X; pv[1] = -shards[yc][xc].centerY + shards[yc][xc].pt3Y; pv[2] = halfThick; pv[3] = -shards[yc][xc].centerX + shards[yc][xc].pt2X; pv[4] = -shards[yc][xc].centerY + shards[yc][xc].pt2Y; pv[5] = halfThick; pv[6] = -shards[yc][xc].centerX + shards[yc][xc].pt1X; pv[7] = -shards[yc][xc].centerY + shards[yc][xc].pt1Y; pv[8] = halfThick; pv[9] = -shards[yc][xc].centerX + shards[yc][xc].pt0X; pv[10] = -shards[yc][xc].centerY + shards[yc][xc].pt0Y; pv[11] = halfThick; // Determine 4 back vertices in cw direction pv[12] = -shards[yc][xc].centerX + shards[yc][xc].pt0X; pv[13] = -shards[yc][xc].centerY + shards[yc][xc].pt0Y; pv[14] = -halfThick; pv[15] = -shards[yc][xc].centerX + shards[yc][xc].pt1X; pv[16] = -shards[yc][xc].centerY + shards[yc][xc].pt1Y; pv[17] = -halfThick; pv[18] = -shards[yc][xc].centerX + shards[yc][xc].pt2X; pv[19] = -shards[yc][xc].centerY + shards[yc][xc].pt2Y; pv[20] = -halfThick; pv[21] = -shards[yc][xc].centerX + shards[yc][xc].pt3X; pv[22] = -shards[yc][xc].centerY + shards[yc][xc].pt3Y; pv[23] = -halfThick; // 24 indices for 4 sides (for triangles) p->sideIndices = (GLushort *)calloc (6 * 4, sizeof (GLushort)); if (!p->sideIndices) { compLogMessage ("animationaddon", CompLogLevelError, "Not enough memory"); freePolygonObjects (); return false; } GLushort *ind = p->sideIndices; GLfloat *nor = p->normals; int id = 0; // Left face ind[id++] = 6; // First vertex ind[id++] = 1; ind[id++] = 0; ind[id++] = 6; ind[id++] = 7; ind[id++] = 0; nor[6 * 3 + 0] = -1; // Flat shading only uses 1st vertex's normal nor[6 * 3 + 1] = 0; // in a polygon, vertex 6 for this face. nor[6 * 3 + 2] = 0; // Bottom face ind[id++] = 1; ind[id++] = 6; ind[id++] = 5; ind[id++] = 1; ind[id++] = 2; ind[id++] = 5; nor[1 * 3 + 0] = 0; nor[1 * 3 + 1] = 1; nor[1 * 3 + 2] = 0; // Right face ind[id++] = 2; ind[id++] = 5; ind[id++] = 4; ind[id++] = 2; ind[id++] = 3; ind[id++] = 4; nor[2 * 3 + 0] = 1; nor[2 * 3 + 1] = 0; nor[2 * 3 + 2] = 0; // Top face ind[id++] = 7; ind[id++] = 0; ind[id++] = 3; ind[id++] = 7; ind[id++] = 4; ind[id++] = 3; nor[7 * 3 + 0] = 0; nor[7 * 3 + 1] = -1; nor[7 * 3 + 2] = 0; // Front face normal nor[0] = 0; nor[1] = 0; nor[2] = 1; // Back face normal nor[4 * 3 + 0] = 0; nor[4 * 3 + 1] = 0; nor[4 * 3 + 2] = -1; // Determine bounding box (to test intersection with clips) p->boundingBox.x1 = -shards[yc][xc].pt3X; p->boundingBox.y1 = -shards[yc][xc].pt3Y; p->boundingBox.x2 = shards[yc][xc].pt1X; p->boundingBox.y2 = shards[yc][xc].pt1Y; float dist[4] = {0}, longestDist = 0; dist[0] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt0X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt0Y), 2) + powf (thickness,2)); dist[1] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt1X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt1Y), 2) + powf (thickness,2)); dist[2] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt2X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt2Y), 2) + powf (thickness,2)); dist[3] = sqrt (powf ((shards[yc][xc].centerX - shards[yc][xc].pt3X), 2) + powf ((shards[yc][xc].centerY - shards[yc][xc].pt3Y), 2) + powf (thickness,2)); for (int k = 0; k < 4; k++) { if (dist[k] > longestDist) longestDist = dist[k]; } p->boundSphereRadius = longestDist; // Reset remaining members p->effectParameters = NULL; p->moveStartTime = 0; p->moveDuration = 0; p->fadeStartTime = 0; p->fadeDuration = 0; } } return true; } void PolygonAnim::addGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clipRegion, unsigned int maxGridWidth, unsigned int maxGridHeight) { // TODO // if polygon set is not valid or effect is not 3D (glide w/thickness=0) //if (!pset) //return; /* Some plugins (such as blur) pass a null argument to glAddGeometry * because they don't have such data and they need to calculate region * projections. In this case, we should not add polygon geometry * since the matrices will be null */ if (!matrix.size ()) return; /* Force glDrawTexture to be called by pushing a single vertex into the * window's vertex buffer */ GLWindow *gWindow = GLWindow::get (mWindow); GLfloat vertexData[3] = {0.0f, 0.0f, 0.0f}; gWindow->vertexBuffer ()->addVertices (1, vertexData); bool dontStoreClips = true; // If this clip doesn't match the corresponding stored clip, // clear the stored clips from this point (aw->nClipsPassed) // to the end and store the new ones instead. if (mNumClipsPassed < (int)mClips.size ()) // if we have clips stored earlier { Clip4Polygons *c = &mClips[mNumClipsPassed]; // the stored clip at position aw->nClipsPassed // if either clip coordinates or texture matrix is different if (region.rects ()[0] != c->box || memcmp (&matrix[0], &c->texMatrix, sizeof (GLTexture::Matrix))) { // get rid of the clips from here (aw->nClipsPassed) to the end Clip4Polygons *curClip = c; for (unsigned i = mNumClipsPassed; i < mClips.size (); i++, curClip++) foreach (PolygonClipInfo *pci, curClip->intersectingPolygonInfos) delete pci; mClips.resize (mNumClipsPassed); dontStoreClips = false; } } else dontStoreClips = false; if (dontStoreClips) { mNumClipsPassed += region.numRects (); return; } if (mClips.size () == 0) { mLastClipInGroup.clear (); mLastClipInGroup.reserve (2); } CompRect inRect (mAWindow->savedRectsValid () ? mAWindow->savedInRect () : mWindow->borderRect ()); mClips.reserve (region.numRects ()); // For each clip passed to this function foreach (const CompRect &rect, region.rects ()) { // Add new clip Clip4Polygons newClip; newClip.box = rect; newClip.texMatrix = matrix[0]; // nMatrix is not used for now // (i.e. only first texture matrix is considered) // avoid clipping along window edge // for the "window contents" clip if (rect.x1 () == inRect.x1 () && rect.y1 () == inRect.y1 () && rect.x2 () == inRect.x2 () && rect.y2 () == inRect.y2 ()) { newClip.boxf.x1 = rect.x1 () - 0.1f; newClip.boxf.y1 = rect.y1 () - 0.1f; newClip.boxf.x2 = rect.x2 () + 0.1f; newClip.boxf.y2 = rect.y2 () + 0.1f; } else { newClip.boxf.x1 = rect.x1 (); newClip.boxf.y1 = rect.y1 (); newClip.boxf.x2 = rect.x2 (); newClip.boxf.y2 = rect.y2 (); } mClips.push_back (newClip); mNumClipsPassed++; } mClipsUpdated = true; } /// Allocates floats for texture coordinates: /// 2 {x, y} * 2 {front, back} * <# of polygon vertices> PolygonClipInfo::PolygonClipInfo (const PolygonObject *p) : p (p) { vertexTexCoords.resize (4 * p->nSides); } /// For each rectangular clip, this function finds polygons which /// have a bounding box that intersects the clip. For intersecting /// polygons, it computes the texture coordinates for the vertices /// of that polygon (to draw the clip texture). void PolygonAnim::processIntersectingPolygons () { int numClips = mClips.size (); Clip4Polygons *c = &mClips[mFirstNondrawnClip]; for (int j = mFirstNondrawnClip; j < numClips; j++, c++) { CompRect &cb = c->box; int nFrontVerticesTilThisPoly = 0; // only used when intersectsMostPolygons is true // if this clip is the "window contents" clip if (cb == mWindow->geometry()) { c->intersectsMostPolygons = true; // allocate tex coords for all polygons // 2 {x, y} * 2 {front, back} * // c->polygonVertexTexCoords.resize (4 * mNumTotalFrontVertices); } else c->intersectsMostPolygons = false; foreach (const PolygonObject *p, mPolygons) { int nSides = p->nSides; float px = p->centerPosStart.x (); float py = p->centerPosStart.y (); const Boxf &pb = p->boundingBox; GLfloat *vTexCoords = NULL; if (c->intersectsMostPolygons) vTexCoords = &c->polygonVertexTexCoords[4 * nFrontVerticesTilThisPoly]; else { if (pb.x2 + px <= cb.x1 () || pb.y2 + py <= cb.y1 () || pb.x1 + px >= cb.x2 () || pb.y1 + py >= cb.y2 ()) // no intersection continue; PolygonClipInfo *pci = new PolygonClipInfo (p); c->intersectingPolygonInfos.push_back (pci); vTexCoords = &pci->vertexTexCoords[0]; } for (int k = 0; k < nSides; k++) { float x = p->vertices[3 * k] + p->centerPosStart.x (); float y = p->vertices[3 * k + 1] + p->centerPosStart.y (); GLfloat tx; GLfloat ty; if (c->texMatrix.xy != 0.0f || c->texMatrix.yx != 0.0f) { // "non-rect" coordinates tx = COMP_TEX_COORD_XY (c->texMatrix, x, y); ty = COMP_TEX_COORD_YX (c->texMatrix, x, y); } else { tx = COMP_TEX_COORD_X (c->texMatrix, x); ty = COMP_TEX_COORD_Y (c->texMatrix, y); } // for front vertices int ti = 2 * k; vTexCoords[ti] = tx; vTexCoords[ti + 1] = ty; // for back vertices ti = 2 * (2 * nSides - 1 - k); vTexCoords[ti] = tx; vTexCoords[ti + 1] = ty; } nFrontVerticesTilThisPoly += nSides; } } } // Correct perspective appearance by skewing void PolygonAnim::getPerspectiveCorrectionMat (const PolygonObject *p, GLfloat *mat, GLMatrix *matf, const CompOutput &output) { Point center; CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); if (p) // for CorrectPerspectivePolygon { // use polygon's center center.setX (p->centerPos.x ()); center.setY (p->centerPos.y ()); } else // for CorrectPerspectiveWindow { // use window's center center.setX (outRect.x () + outRect.width () / 2); center.setY (outRect.y () + outRect.height () / 2); } GLfloat skewx = -(((center.x () - output.region ()->extents.x1) - output.width () / 2) * 1.15); GLfloat skewy = -(((center.y () - output.region ()->extents.y1) - output.height () / 2) * 1.15); if (mat) { // column-major order skew matrix GLfloat skewMat[16] = {1,0,0,0, 0,1,0,0, skewx,skewy,1,0, 0,0,0,1}; memcpy (mat, skewMat, 16 * sizeof (GLfloat)); } else if (matf) { // column-major order skew matrix float skewMat[16] = {1,0,0,0, 0,1,0,0, skewx,skewy,1,0, 0,0,0,1}; *matf = GLMatrix (skewMat); } } void PolygonAnim::prepareDrawingForAttrib (GLWindowPaintAttrib &attrib, GLVertexBuffer &vertexBuffer) { // Disabled for now until lighting can be re-written // attrib.brightness *= 0.76; GLushort color = (attrib.brightness * attrib.opacity) >> 16; GLfloat colorNormalized = color / static_cast (COLOR); vertexBuffer.color4f (colorNormalized, colorNormalized, colorNormalized, attrib.opacity / static_cast (COLOR)); } namespace { enum class Winding : int { Clockwise = 0, Counterclockwise = 1 }; /* This function assumes that indices is large enough to * hold a polygon of nSides sides */ unsigned int determineIndicesForPolygon (GLushort *indices, GLushort nSides, Winding direction) { unsigned int index = 0; bool front = direction == Winding::Counterclockwise; for (GLushort i = 2; i < nSides; ++i) { indices[index] = 0; indices[index + 1] = (front ? (i - 1) : i); indices[index + 2] = (front ? i : (i - 1)); index += 3; } return index; } } inline void PolygonAnim::drawPolygonClipIntersection (GLTexture *texture, const GLMatrix &transform, const PolygonObject *p, const Clip4Polygons &c, const GLfloat *vertexTexCoords, int pass, float forwardProgress, const CompOutput &output, float newOpacity, bool decelerates, GLMatrix &skewMat) { int nSides = p->nSides; float newOpacityPolygon = newOpacity; // if fade-out duration is specified per polygon if (mAllFadeDuration == -1.0f) { float fadePassedBy = forwardProgress - p->fadeStartTime; // if "fade out starting point" is passed if (fadePassedBy > 1e-5) // if true, then allFadeDuration > 0 { float opacityFac; if (decelerates) opacityFac = 1 - progressDecelerate (fadePassedBy / p->fadeDuration); else opacityFac = 1 - fadePassedBy / p->fadeDuration; if (opacityFac < 0) opacityFac = 0; if (opacityFac > 1) opacityFac = 1; newOpacityPolygon = newOpacity * opacityFac; } } if (newOpacityPolygon < 1e-5) // if polygon object is invisible return; if (pass == 0) { if (newOpacityPolygon < 0.9999) // if not fully opaque return; // draw only opaque ones in pass 0 } else if (newOpacityPolygon > 0.9999) // if fully opaque return; // draw only non-opaque ones in pass 1 GLMatrix polygonTransform (transform); if (mCorrectPerspective == CorrectPerspectivePolygon) getPerspectiveCorrectionMat (p, NULL, &skewMat, output); if (mCorrectPerspective != CorrectPerspectiveNone) polygonTransform *= skewMat; // Center polygonTransform.translate (p->centerPos.x (), p->centerPos.y (), p->centerPos.z ()); // Scale z first polygonTransform.scale (1.0f, 1.0f, 1.0f / ::screen->width ()); transformPolygon (polygonTransform, p); // Move by "rotation axis offset" polygonTransform.translate (p->rotAxisOffset.x (), p->rotAxisOffset.y (), p->rotAxisOffset.z ()); // Rotate by desired angle polygonTransform.rotate (p->rotAngle, p->rotAxis.x (), p->rotAxis.y (), p->rotAxis.z ()); // Move back to center polygonTransform.translate (-p->rotAxisOffset.x (), -p->rotAxisOffset.y (), -p->rotAxisOffset.z ()); // Scale back polygonTransform.scale (1.0f, 1.0f, ::screen->width ()); // clipPlanes[0][3] = -(c.boxf.x1 - p->centerPosStart.x ()); // clipPlanes[1][3] = -(c.boxf.y1 - p->centerPosStart.y ()); // clipPlanes[2][3] = (c.boxf.x2 - p->centerPosStart.x ()); // clipPlanes[3][3] = (c.boxf.y2 - p->centerPosStart.y ()); // Clip planes are not supported on Modern OpenGL // // glClipPlane (GL_CLIP_PLANE0, clipPlanes[0]); // glClipPlane (GL_CLIP_PLANE1, clipPlanes[1]); // glClipPlane (GL_CLIP_PLANE2, clipPlanes[2]); // glClipPlane (GL_CLIP_PLANE3, clipPlanes[3]); // for (int k = 0; k < 4; k++) // glEnable (GL_CLIP_PLANE0 + k); bool fadeBackAndSides = mBackAndSidesFadeDur > 0 && forwardProgress <= mBackAndSidesFadeDur; float newOpacityPolygon2 = newOpacityPolygon; if (fadeBackAndSides) { // Fade-in opacity for back face and sides newOpacityPolygon2 *= (forwardProgress / mBackAndSidesFadeDur); } GLWindowPaintAttrib attrib = mCurPaintAttrib; attrib.opacity = newOpacityPolygon2 * OPAQUE; GLVertexBuffer *streamingVertexBuffer = GLVertexBuffer::streamingBuffer (); // Draw back face glActiveTexture (GL_TEXTURE0); texture->enable (GLTexture::Fast); streamingVertexBuffer->begin (GL_TRIANGLES); streamingVertexBuffer->addVertices (nSides, p->vertices + 3 * nSides); if (p->normals) streamingVertexBuffer->addNormals (nSides, p->normals + 3 * nSides); streamingVertexBuffer->addTexCoords (0, nSides, &vertexTexCoords[2 * nSides]); if (streamingVertexBuffer->end ()) { GLushort indices[64]; unsigned int nIndices = determineIndicesForPolygon (indices, nSides, Winding::Counterclockwise); streamingVertexBuffer->render (polygonTransform, attrib, indices, nIndices); } // GL_QUADS uses a different vertex normal than the first // so I use GL_TRIANGLES to make sure the normals are right. texture->disable (); streamingVertexBuffer->begin (GL_TRIANGLES); streamingVertexBuffer->addVertices (p->nVertices, p->vertices); prepareDrawingForAttrib (attrib, *streamingVertexBuffer); if (mThickness > 0 && p->normals) streamingVertexBuffer->addNormals (nSides, p->normals); // Draw quads for sides if (streamingVertexBuffer->end ()) { for (int k = 0; k < nSides; k++) streamingVertexBuffer->render (polygonTransform, attrib, p->sideIndices + k * 6, 6); } streamingVertexBuffer->colorDefault (); texture->enable (GLTexture::Fast); streamingVertexBuffer->begin (GL_TRIANGLES); // if opacity was changed just above if (fadeBackAndSides) { // Go back to normal opacity for front face attrib = mCurPaintAttrib; attrib.opacity = newOpacityPolygon * OPAQUE; } streamingVertexBuffer->addVertices (nSides, p->vertices); if (p->normals) streamingVertexBuffer->addNormals (nSides, p->normals); streamingVertexBuffer->addTexCoords (0, nSides, vertexTexCoords); if (streamingVertexBuffer->end ()) { GLushort indices[64]; unsigned int nIndices = determineIndicesForPolygon (indices, nSides, Winding::Counterclockwise); streamingVertexBuffer->render (polygonTransform, attrib, indices, nIndices); } streamingVertexBuffer->colorDefault (); texture->disable (); // Clip planes are not supported on Modern OpenGL // // for (int k = 0; k < 4; k++) // glDisable (GL_CLIP_PLANE0 + k); } void PolygonAnim::drawGeometry (GLTexture *texture, const GLMatrix &transform, const GLWindowPaintAttrib &attrib, unsigned int mask) { mNumDrawGeometryCalls++; // draw windows only on current viewport unless it's on all viewports CompPoint pnt = mCScreen->windowPaintOffset (); if ((pnt.x () != 0 || pnt.y () != 0) && !mWindow->onAllViewports ()) { return; // since this is not the viewport the window was drawn // just before animation started } // TODO // if polygon set is not valid or effect is not 3D (glide w/thickness=0) //if (!pset) //return; int numClips = mClips.size (); if (mFirstNondrawnClip < 0 || mFirstNondrawnClip >= numClips) { return; } if (mClipsUpdated) processIntersectingPolygons (); int lastClip; // last clip to draw if (mClipsUpdated) { lastClip = numClips - 1; } else { assert (!mLastClipInGroup.empty()); lastClip = mLastClipInGroup[mNumDrawGeometryCalls - 1]; } float forwardProgress = progressLinear (); // OpenGL stuff starts here // Lighting will require special shaders, which aren't // implemented right now, so disable it. // // if (mDoLighting) // { // glPushAttrib (GL_SHADE_MODEL); // glShadeModel (GL_FLAT); // // glPushAttrib (GL_LIGHT0); // glPushAttrib (GL_COLOR_MATERIAL); // glPushAttrib (GL_LIGHTING); // glEnable (GL_COLOR_MATERIAL); // glEnable (GL_LIGHTING); // // GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 0.3f }; // GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 0.9f }; // GLfloat light0Position[] = { -0.5f, 0.5f, 9.0f, 0.0f }; // // glLightfv (GL_LIGHT0, GL_AMBIENT, ambientLight); // glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuseLight); // glLightfv (GL_LIGHT0, GL_POSITION, light0Position); // } if (mDoDepthTest) { // Depth test glDepthFunc (GL_LEQUAL); glDepthMask (GL_TRUE); glEnable (GL_DEPTH_TEST); } // Clip planes // GLdouble clipPlanes[4][4] = {{ 1, 0, 0, 0 }, // { 0, 1, 0, 0 }, // { -1, 0, 0, 0 }, // { 0, -1, 0, 0 }}; float opacity = mCurPaintAttrib.opacity / 65535.0; float newOpacity = opacity; float fadePassedBy; bool decelerates = deceleratingMotion (); glEnable (GL_BLEND); // if fade-out duration is not specified per polygon if (mAllFadeDuration > -1.0f) { fadePassedBy = forwardProgress - (1 - mAllFadeDuration); // if "fade out starting point" is passed if (fadePassedBy > 1e-5) // if true, allFadeDuration should be > 0 { float opacityFac; if (decelerates) opacityFac = 1 - progressDecelerate (fadePassedBy / mAllFadeDuration); else opacityFac = 1 - fadePassedBy / mAllFadeDuration; if (opacityFac < 0) opacityFac = 0; if (opacityFac > 1) opacityFac = 1; newOpacity = opacity * opacityFac; } } const CompOutput *output = static_cast (getExtensionPluginInfo ())-> output (); GLMatrix skewMat; if (mCorrectPerspective == CorrectPerspectiveWindow) getPerspectiveCorrectionMat (NULL, NULL, &skewMat, *output); // pass: 0: draw opaque ones // 1: draw transparent ones for (int pass = 0; pass < 2; pass++) { Clip4Polygons *c = &mClips[mFirstNondrawnClip]; for (int j = mFirstNondrawnClip; j <= lastClip; j++, c++) { if (c->intersectsMostPolygons) { const GLfloat *vTexCoords = &c->polygonVertexTexCoords[0]; foreach (const PolygonObject *p, mPolygons) { drawPolygonClipIntersection (texture, transform, p, *c, vTexCoords, pass, forwardProgress, *output, newOpacity, decelerates, skewMat); vTexCoords += 4 * p->nSides; } } else { foreach (const PolygonClipInfo *pci, c->intersectingPolygonInfos) { drawPolygonClipIntersection (texture, transform, pci->p, *c, &pci->vertexTexCoords[0], pass, forwardProgress, *output, newOpacity, decelerates, skewMat); } } } } // Restore // ----------------------------------------- glDisable (GL_BLEND); if (mDoDepthTest) { glDisable (GL_DEPTH_TEST); glDepthMask (GL_FALSE); } // Lighting will require special shaders whcih // are not implemented for now. // // if (mDoLighting) // { // glPopAttrib (); // GL_LIGHTING // glPopAttrib (); // GL_COLOR_MATERIAL // glPopAttrib (); // GL_LIGHT0 // glPopAttrib (); // GL_SHADE_MODEL // } if (mClipsUpdated) // set the end mark for this group of clips mLastClipInGroup.push_back (lastClip); assert (!mLastClipInGroup.empty ()); // Next time, start drawing from next group of clips mFirstNondrawnClip = mLastClipInGroup[mNumDrawGeometryCalls - 1] + 1; } void PolygonAnim::prePaintWindow () { mNumDrawGeometryCalls = 0; mFirstNondrawnClip = 0; } void PolygonAnim::postPaintWindow (const GLMatrix &) { if (mClipsUpdated && // clips should be dropped only in the 1st step mNumDrawGeometryCalls == 0) // if clips not drawn { // drop these unneeded clips (e.g. ones passed by blurfx) mClips.resize (mFirstNondrawnClip); } } // Computes polygon's new position and orientation // with linear movement void PolygonAnim::stepPolygon (PolygonObject *p, float forwardProgress) { float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; p->centerPos.setX (moveProgress * p->finalRelPos.x () + p->centerPosStart.x ()); p->centerPos.setY (moveProgress * p->finalRelPos.y () + p->centerPosStart.y ()); p->centerPos.setZ (1.0f / ::screen->width () * moveProgress * p->finalRelPos.z () + p->centerPosStart.z ()); p->rotAngle = moveProgress * p->finalRotAng + p->rotAngleStart; } // Similar to stepPolygon, // but slightly ac/decelerates movement void PolygonAnim::deceleratingAnimStepPolygon (PolygonObject *p, float forwardProgress) { // TODO: Refactor float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; moveProgress = progressDecelerate (moveProgress); p->centerPos.setX (moveProgress * p->finalRelPos.x () + p->centerPosStart.x ()); p->centerPos.setY (moveProgress * p->finalRelPos.y () + p->centerPosStart.y ()); p->centerPos.setZ (1.0f / ::screen->width () * moveProgress * p->finalRelPos.z () + p->centerPosStart.z ()); p->rotAngle = moveProgress * p->finalRotAng + p->rotAngleStart; } void PolygonAnim::step () { float forwardProgress = progressLinear (); foreach (PolygonObject *p, mPolygons) stepPolygon (p, forwardProgress); } void PolygonAnim::updateBB (CompOutput &output) { GLScreen *gScreen = GLScreen::get (::screen); GLMatrix wTransform; GLMatrix wTransform2; prepareTransform (output, wTransform, wTransform2); GLMatrix *screenProjection = gScreen->projectionMatrix (); GLMatrix *modelViewTransform = &wTransform; GLMatrix skewMat; if (mCorrectPerspective == CorrectPerspectiveWindow) { getPerspectiveCorrectionMat (NULL, NULL, &skewMat, output); wTransform2 = wTransform * skewMat; } if (mCorrectPerspective == CorrectPerspectiveWindow || mCorrectPerspective == CorrectPerspectivePolygon) modelViewTransform = &wTransform2; foreach (const PolygonObject *p, mPolygons) { if (mCorrectPerspective == CorrectPerspectivePolygon) { getPerspectiveCorrectionMat (p, NULL, &skewMat, output); wTransform2 = wTransform * skewMat; } // if modelViewTransform == wTransform2, then // it changes for each polygon Point3d center = p->centerPos; float radius = p->boundSphereRadius + 2; // Take rotation axis offset into consideration and // properly enclose polygon in the bounding cube // whatever the rotation angle is: // Add rotation axis offset to center (rotated) polygon correctly // within bounding cube center.add (p->rotAxisOffset.x (), p->rotAxisOffset.y (), p->rotAxisOffset.z () / ::screen->width ()); // Add rotation axis offset to radius to enlarge the bounding cube radius += MAX (MAX (fabs (p->rotAxisOffset.x ()), fabs (p->rotAxisOffset.y ())), fabs (p->rotAxisOffset.z ())); float zradius = radius / ::screen->width (); static const unsigned short N_POINTS = 8; // Corners of bounding cube Point3d cubeCorners[N_POINTS]; cubeCorners[0].set (center.x () - radius, center.y () - radius, center.z () + zradius); cubeCorners[1].set (center.x () - radius, center.y () + radius, center.z () + zradius); cubeCorners[2].set (center.x () + radius, center.y () - radius, center.z () + zradius); cubeCorners[3].set (center.x () + radius, center.y () + radius, center.z () + zradius); cubeCorners[4].set (center.x () - radius, center.y () - radius, center.z () - zradius); cubeCorners[5].set (center.x () - radius, center.y () + radius, center.z () - zradius); cubeCorners[6].set (center.x () + radius, center.y () - radius, center.z () - zradius); cubeCorners[7].set (center.x () + radius, center.y () + radius, center.z () - zradius); Point3d *pnt = cubeCorners; for (int j = 0; j < N_POINTS; j++, pnt++) { namespace com = compiz::opengl::matrix; CompPoint p (com::projectIntoViewport(*screenProjection, *modelViewTransform, output, GLVector (pnt->x (), pnt->y (), pnt->z ()))); p.setY (::screen->height () - p.y ()); mAWindow->expandBBWithPoint (p.x () + 0.5, p.y () + 0.5); } #undef N_POINTS } } bool PolygonAnim::prePreparePaint (int msSinceLastPaint) { mNumClipsPassed = 0; mClipsUpdated = false; return false; } bool PolygonAnim::moveUpdate (int dx, int dy) { foreach (PolygonObject *p, mPolygons) { p->centerPosStart.setX (p->centerPosStart.x () + dx); p->centerPosStart.setY (p->centerPosStart.y () + dy); p->centerPos.setX (p->centerPos.x () + dx); p->centerPos.setY (p->centerPos.y () + dy); p->finalRelPos.setX (p->finalRelPos.x () + dx); p->finalRelPos.setY (p->finalRelPos.y () + dy); } return true; } void ExtensionPluginAnimAddon::prePaintOutput (CompOutput *output) { CompString pluginName ("animationaddon"); mOutput = output; // Find out if an animation running now uses depth test bool depthUsed = false; foreach (CompWindow *w, ::screen->windows ()) { AnimWindow *aw = AnimWindow::get (w); Animation *anim = aw->curAnimation (); if (anim && anim->remainingTime () > 0 && anim->getExtensionPluginInfo ()->name == pluginName) { BaseAddonAnim *animBase = dynamic_cast (anim); if (animBase->needsDepthTest ()) { depthUsed = true; break; } } } if (depthUsed) { #ifdef USE_GLES glClearDepthf (1000.0f); #else glClearDepth (1000.0f); #endif glDepthMask (GL_TRUE); glClear (GL_DEPTH_BUFFER_BIT); glDepthMask (GL_FALSE); } } ./plugins/animationaddon/src/explode.cpp0000644000004100000410000000740313246301623020650 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * explode.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Explode ========================= const float ExplodeAnim::kDurationFactor = 1.43; ExplodeAnim::ExplodeAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mAllFadeDuration = 0.3f; mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; mBackAndSidesFadeDur = 0.2f; } void ExplodeAnim::init () { switch (optValI (AnimationaddonOptions::ExplodeTessellation)) { case AnimationaddonOptions::ExplodeTessellationRectangular: if (!tessellateIntoRectangles (optValI (AnimationaddonOptions::ExplodeGridx), optValI (AnimationaddonOptions::ExplodeGridy), optValF (AnimationaddonOptions::ExplodeThickness))) return; break; case AnimationaddonOptions::ExplodeTessellationHexagonal: if (!tessellateIntoHexagons (optValI (AnimationaddonOptions::ExplodeGridx), optValI (AnimationaddonOptions::ExplodeGridy), optValF (AnimationaddonOptions::ExplodeThickness))) return; break; case AnimationaddonOptions::ExplodeTessellationGlass: if (!tessellateIntoGlass (optValI (AnimationaddonOptions::ExplodeSpokes), optValI (AnimationaddonOptions::ExplodeTiers), optValF (AnimationaddonOptions::ExplodeThickness))) return; break; default: return; } double sqrt2 = sqrt (2); float screenSizeFactor = (0.8 * DEFAULT_Z_CAMERA * ::screen->width ()); foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (RAND_FLOAT (), RAND_FLOAT (), RAND_FLOAT ()); float speed = screenSizeFactor / 10 * (0.2 + RAND_FLOAT ()); float xx = 2 * (p->centerRelPos.x () - 0.5); float yy = 2 * (p->centerRelPos.y () - 0.5); float x = speed * 2 * (xx + 0.5 * (RAND_FLOAT () - 0.5)); float y = speed * 2 * (yy + 0.5 * (RAND_FLOAT () - 0.5)); float distToCenter = sqrt (xx * xx + yy * yy) / sqrt2; float moveMult = 1 - distToCenter; moveMult = moveMult < 0 ? 0 : moveMult; float zbias = 0.1; float z = speed * 10 * (zbias + RAND_FLOAT () * pow (moveMult, 0.5)); p->finalRelPos.set (x, y, z); p->finalRotAng = RAND_FLOAT () * 540 - 270; } } ./plugins/animationaddon/src/fold.cpp0000644000004100000410000001516313246301623020136 0ustar www-datawww-data/** * Animation plugin for compiz/beryl * * fold.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Fold and Skewer added by : Tomasz Kołodziejski * E-mail : tkolodziejski@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "private.h" #define BORDER_W(w) ((w)->width () + (w)->border ().left + (w)->border ().right) #define BORDER_H(w) ((w)->height () + (w)->border ().top + (w)->border ().bottom) const float FoldAnim::kDurationFactor = 1.82; FoldAnim::FoldAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { } void FoldAnim::init () { mTotalTime /= kDurationFactor; mRemainingTime = mTotalTime; unsigned int gridSizeX = optValI (AnimationaddonOptions::FoldGridx); unsigned int gridSizeY = optValI (AnimationaddonOptions::FoldGridy); if (!tessellateIntoRectangles (gridSizeX, gridSizeY, 1.0f)) return; /*PolygonSet *pset = aw->eng.polygonSet; PolygonObject *p = mPolygons;*/ // handle other non-zero values int fold_in = optValI (AnimationaddonOptions::FoldDir) == 0 ? 1 : 0; float rows_duration; float fduration; if (gridSizeY == 1) { fduration = 1.0f / (float)(gridSizeY + 2 * ceil (gridSizeX / 2)); rows_duration = 0; } else { fduration = 1.0f / (float)(gridSizeY + 2 * ceil (gridSizeX / 2) + 1 + fold_in); rows_duration = (gridSizeY - 1 + fold_in) * fduration; } float duration = fduration * 2; float start; unsigned int i = 0; unsigned int j = 0; int k = 0; foreach (PolygonObject *p, mPolygons) { if (i > mPolygons.size () - gridSizeX - 1) { // bottom row polygons if (j < gridSizeX / 2) { // the left ones start = rows_duration + duration * j++; p->rotAxis.setY (-180); p->finalRotAng = 180; p->fadeStartTime = start + fduration; p->fadeDuration = fduration; } else if (j == gridSizeX / 2) { // the middle one start = rows_duration + j * duration; p->rotAxis.setY (90); p->finalRotAng = 90; p->fadeStartTime = start + fduration; p->fadeDuration = fduration; j++; } else { // the right ones start = rows_duration + (j - 2) * duration + duration * k--; p->rotAxis.setY (180); p->finalRotAng = 180; p->fadeStartTime = start + fduration; p->fadeDuration = fduration; } } else { // main rows int row = i / gridSizeX; // [0; gridSizeY-1] start = row * fduration; p->rotAxis.setX (180); p->finalRelPos.setX (row); // number of row, not finalRelPos!! p->finalRotAng = 180; p->fadeDuration = fduration; p->fadeStartTime = start; if (row < (int) gridSizeY - 2 || fold_in) p->fadeStartTime += fduration; } p->moveStartTime = start; p->moveDuration = duration; i++; } mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectiveWindow; return; } void FoldAnim::stepPolygon (PolygonObject *p, float forwardProgress) { int dir = optValI (AnimationaddonOptions::FoldDir) == 0 ? 1 : -1; int gridSizeX = optValI (AnimationaddonOptions::FoldGridx); int gridSizeY = optValI (AnimationaddonOptions::FoldGridx); float moveProgress = forwardProgress - p->moveStartTime; if (p->moveDuration > 0) moveProgress /= p->moveDuration; if (moveProgress < 0) moveProgress = 0; else if (moveProgress > 1) moveProgress = 1; float const_x = BORDER_W (mWindow) / (float)gridSizeX; // width of single piece float const_y = BORDER_H (mWindow) / (float)gridSizeY; // height of single piece p->rotAngle = dir * moveProgress * p->finalRotAng; if (p->rotAxis.x () == 180) { if (p->finalRelPos.y () == gridSizeY - 2) { // it means the last row p->centerPos.setY ( p->centerPosStart.y () + const_y / 2.0f - cos (p->rotAngle * M_PI / 180.0f) * const_y / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (sin (-p->rotAngle * M_PI / 180.0f) * const_y / 2.0f)); } else { // rows if (fabs (p->rotAngle) < 90) { // 1. rotate 90 p->centerPos.setY ( p->centerPosStart.y () + const_y / 2.0f - cos (p->rotAngle * M_PI / 180.0f) * const_y / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (sin (-p->rotAngle * M_PI / 180.0f) * const_y / 2.0f)); } else { // 2. rotate faster 180 float alpha = p->rotAngle - dir * 90; // [0 - 45] float alpha2 = 2 * alpha; // [0 - 90] p->rotAngle = (p->rotAngle - dir * 90) * 2 + dir * 90; p->centerPos.setY ( p->centerPosStart.y () + const_y / 2.0f + const_y - cos (alpha * M_PI / 180.0f) * const_y + dir * sin (alpha2 * M_PI / 180.0f) * const_y / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (-sin (alpha * M_PI / 180.0f) * const_y - dir * cos (alpha2 * M_PI / 180.0f) * const_y / 2.0f)); } } } else if (p->rotAxis.y () == -180) { // simple blocks left p->centerPos.setX ( p->centerPosStart.x () + const_x / 2.0f - cos (p->rotAngle * M_PI / 180.0f) * const_x / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () - 1.0f / screen->width () * (sin (p->rotAngle * M_PI / 180.0f) * const_x / 2.0f)); } else if (p->rotAxis.y () == 180) { // simple blocks right p->centerPos.setX ( p->centerPosStart.x () - const_x / 2.0f + cos (-p->rotAngle * M_PI / 180.0f) * const_x / 2.0f); p->centerPos.setZ ( p->centerPosStart.z () + 1.0f / screen->width () * (sin (-p->rotAngle * M_PI / 180.0f) * const_x / 2.0f)); } } ./plugins/animationaddon/src/leafspread.cpp0000644000004100000410000000636713246301623021326 0ustar www-datawww-data/* * Animation plugin for compiz/beryl * * leafspread.cpp * * Copyright : (C) 2006 Erkin Bahceci * E-mail : erkinbah@gmail.com * * Based on Wobbly and Minimize plugins by * : David Reveman * E-mail : davidr@novell.com> * * Particle system added by : (C) 2006 Dennis Kasprzyk * E-mail : onestone@beryl-project.org * * Beam-Up added by : Florencio Guimaraes * E-mail : florencio@nexcorp.com.br * * Hexagon tessellator added by : Mike Slegeir * E-mail : mikeslegeir@mail.utexas.edu> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "private.h" // ===================== Effect: Leaf Spread ========================= const float LeafSpreadAnim::kDurationFactor = 1.67; LeafSpreadAnim::LeafSpreadAnim (CompWindow *w, WindowEvent curWindowEvent, float duration, const AnimEffect info, const CompRect &icon) : Animation::Animation (w, curWindowEvent, kDurationFactor * duration, info, icon), PolygonAnim::PolygonAnim (w, curWindowEvent, kDurationFactor * duration, info, icon) { mDoDepthTest = true; mDoLighting = true; mCorrectPerspective = CorrectPerspectivePolygon; } void LeafSpreadAnim::init () { if (!tessellateIntoRectangles (20, 14, 15.0f)) return; CompRect outRect (mAWindow->savedRectsValid () ? mAWindow->savedOutRect () : mWindow->outputRect ()); float fadeDuration = 0.26; float life = 0.4; float spreadFac = 3.5; float randYMax = 0.07; float winFacX = outRect.width () / 800.0; float winFacY = outRect.height () / 800.0; float winFacZ = (outRect.height () + outRect.width ()) / 2.0 / 800.0; float screenSizeFactor = (0.8 * DEFAULT_Z_CAMERA * ::screen->width ()); foreach (PolygonObject *p, mPolygons) { p->rotAxis.set (RAND_FLOAT (), RAND_FLOAT (), RAND_FLOAT ()); float speed = screenSizeFactor / 10 * (0.2 + RAND_FLOAT ()); float xx = 2 * (p->centerRelPos.x () - 0.5); float yy = 2 * (p->centerRelPos.y () - 0.5); float x = speed * winFacX * spreadFac * (xx + 0.5 * (RAND_FLOAT () - 0.5)); float y = speed * winFacY * spreadFac * (yy + 0.5 * (RAND_FLOAT () - 0.5)); float z = speed * winFacZ * 7 * ((RAND_FLOAT () - 0.5) / 0.5); p->finalRelPos.set (x, y, z); p->moveStartTime = p->centerRelPos.y () * (1 - fadeDuration - randYMax) + randYMax * RAND_FLOAT (); p->moveDuration = 1; p->fadeStartTime = p->moveStartTime + life; if (p->fadeStartTime > 1 - fadeDuration) p->fadeStartTime = 1 - fadeDuration; p->fadeDuration = fadeDuration; p->finalRotAng = 150; } } ./plugins/animationaddon/compiz-animationaddon.pc.in0000644000004100000410000000045113246301623023126 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: compiz-animationaddon Description: Animation Addon plugin for compiz Version: @VERSION@ Requires: compiz compiz-composite compiz-opengl compiz-animation Libs: -L${libdir} -lanimationaddon Cflags: @COMPIZ_CFLAGS@ ./plugins/animationaddon/animationaddon.xml.in0000644000004100000410000003512113246301623022027 0ustar www-datawww-data <_short>Animations Add-On <_long>Extra window animations and animation engines Effects opengl animation opengl composite animation decor <_short>Effect Settings <_short>Airplane <_short>Beam <_short>Burn <_short>Domino <_short>Explode <_short>Fold <_short>Glide 3 <_short>Razr <_short>Skewer open_effects open_random_effects close_effects close_random_effects minimize_effects minimize_random_effects animationaddon:Airplane <_name>Airplane animationaddon:Beam Up <_name>Beam Up animationaddon:Burn <_name>Burn animationaddon:Dissolve <_name>Dissolve animationaddon:Domino <_name>Domino animationaddon:Explode <_name>Explode animationaddon:Fold <_name>Fold animationaddon:Glide 3 <_name>Glide 3 animationaddon:Leaf Spread <_name>Leaf Spread animationaddon:Razr <_name>Razr animationaddon:Skewer <_name>Skewer ./plugins/vpswitch/0000755000004100000410000000000013246301624014574 5ustar www-datawww-data./plugins/vpswitch/CMakeLists.txt0000644000004100000410000000012113246301623017325 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (vpswitch) ./plugins/vpswitch/vpswitch.xml.in0000644000004100000410000000771613246301623017604 0ustar www-datawww-data <_short>Viewport Switcher <_long>Initiate viewport changes through several events Desktop composite decor opengl <_short>Number-Based Viewport Switching <_short>Go to specific viewport <_short>Desktop-based Viewport Switching ./plugins/vpswitch/src/0000755000004100000410000000000013246301624015363 5ustar www-datawww-data./plugins/vpswitch/src/vpswitch.h0000644000004100000410000000671613246301623017414 0ustar www-datawww-data/* * Compiz vpswitch plugin * * vpswitch.cpp * * Copyright (c) 2007 Dennis Kasprzyk * * Go-to-numbered-viewport functionality by * * Copyright (c) 2007 Robert Carr * (c) 2007 Danny Baumann * * Go-to-specific-viewport functionality by * * Copyright (c) 2007 Michael Vogt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include #include #include #include "vpswitch_options.h" /* Helper macro to obtain necesary action data */ /* ??? xid = screen->grabWindow () else xid = screen->below () */ #define GET_DATA \ CompWindow *w;\ Window xid; \ if (screen->otherGrabExist ("rotate", "wall", "plane", 0)) \ return false; \ xid = CompOption::getIntOptionNamed (options, "window"); \ w = screen->findWindow (xid); \ if ((!w || (w->type () & CompWindowTypeDesktopMask) == 0) && \ xid != screen->root ()) \ return false; /* number-to-keysym mapping */ static const KeySym numberKeySyms[3][10] = { /* number key row */ { XK_0, XK_1, XK_2, XK_3, XK_4, XK_5, XK_6, XK_7, XK_8, XK_9 }, /* number keypad with activated NumLock */ { XK_KP_0, XK_KP_1, XK_KP_2, XK_KP_3, XK_KP_4, XK_KP_5, XK_KP_6, XK_KP_7, XK_KP_8, XK_KP_9 }, /* number keypad without NumLock */ { XK_KP_Insert, XK_KP_End, XK_KP_Down, XK_KP_Next, XK_KP_Left, XK_KP_Begin, XK_KP_Right, XK_KP_Home, XK_KP_Up, XK_KP_Prior } }; class VPSwitchScreen : public PluginClassHandler , public VpswitchOptions, public ScreenInterface { public: VPSwitchScreen (CompScreen *); int destination; bool numberedActive; /* Wrappable functions */ void handleEvent (XEvent *); /* Actions */ bool movevp (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int dx, unsigned int dy); bool switchto (CompAction *action, CompAction::State state, CompOption::Vector &options, int num); bool initiateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options); bool terminateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options); bool prev (CompAction *action, CompAction::State state, CompOption::Vector &options); bool next (CompAction *action, CompAction::State state, CompOption::Vector &options); bool initPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options); bool termPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options); /* General Functions */ void gotovp (int x, int y); }; #define VPSWITCH_SCREEN(s) \ VPSwitchScreen *vs = VPSwitchScreen::get (s); class VPSwitchPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/vpswitch/src/vpswitch.cpp0000644000004100000410000002041613246301623017740 0ustar www-datawww-data/* * Compiz vpswitch plugin * * vpswitch.cpp * * Copyright (c) 2007 Dennis Kasprzyk * * Go-to-numbered-viewport functionality by * * Copyright (c) 2007 Robert Carr * (c) 2007 Danny Baumann * * Go-to-specific-viewport functionality by * * Copyright (c) 2007 Michael Vogt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "vpswitch.h" COMPIZ_PLUGIN_20090315 (vpswitch, VPSwitchPluginVTable); bool VPSwitchScreen::initPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options) { GET_DATA; CompPlugin *plugin = CompPlugin::find (optionGetInitPlugin ().c_str ()); bool rv = false; if (!plugin) return false; foreach (CompOption &opt, plugin->vTable->getOptions ()) { if (opt.type () == CompOption::TypeAction || opt.type () == CompOption::TypeKey || opt.type () == CompOption::TypeButton || opt.type () == CompOption::TypeEdge || opt.type () == CompOption::TypeBell) if (opt.name () == optionGetInitAction () && opt.value ().action ().initiate ()) { rv = opt.value ().action ().initiate () (action, state, options); break; } } if (rv) action->setState(action->state () | CompAction::StateTermButton); return rv; } bool VPSwitchScreen::termPluginAction (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompPlugin *plugin = CompPlugin::find (optionGetInitPlugin ().c_str ()); bool rv = false; if (!plugin) return false; foreach (CompOption &opt, plugin->vTable->getOptions ()) { if (opt.type () == CompOption::TypeAction || opt.type () == CompOption::TypeKey || opt.type () == CompOption::TypeButton || opt.type () == CompOption::TypeEdge || opt.type () == CompOption::TypeBell) if (opt.name () == optionGetInitAction () && opt.value ().action ().terminate ()) { rv = opt.value ().action ().terminate () (action, state, options); break; } } return rv; } void VPSwitchScreen::gotovp (int x, int y) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = screen->dpy (); xev.xclient.format = 32; xev.xclient.message_type = Atoms::desktopViewport; xev.xclient.window = screen->root (); xev.xclient.data.l[0] = x * screen->width (); xev.xclient.data.l[1] = y * screen->height (); xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), screen->root (), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } /* desktop mouse button initiated actions */ bool VPSwitchScreen::next (CompAction *action, CompAction::State state, CompOption::Vector &options) { int targetX, targetY; CompPoint vp (screen->vp ()); CompSize vpsize (screen->vpSize ()); GET_DATA; targetX = vp.x () + 1; targetY = vp.y (); if (targetX >= vpsize.width ()) { targetX = 0; targetY++; } if (targetY >= vpsize.height ()) targetY = 0; gotovp (targetX, targetY); return true; } bool VPSwitchScreen::prev (CompAction *action, CompAction::State state, CompOption::Vector &options) { int targetX, targetY; CompPoint vp (screen->vp ()); CompSize vpsize (screen->vpSize ()); GET_DATA; targetX = vp.x () - 1; targetY = vp.y (); if (targetX < 0) { targetX = vpsize.width () - 1; targetY--; } if (targetY < 0) targetY = vpsize.height () - 1; gotovp (targetX, targetY); return true; } bool VPSwitchScreen::movevp (CompAction *action, CompAction::State state, CompOption::Vector &options, unsigned int dx, unsigned int dy) { CompPoint vp (screen->vp ()); CompSize vpsize (screen->vpSize ()); GET_DATA; /* Check bounds */ if (vp.x () + dx > (unsigned int) vpsize.width ()) return false; if (vp.y () + dy > (unsigned int) vpsize.height ()) return false; gotovp (vp.x () + dx, vp.y () + dy); return true; } /* Handle viewport number switch key events */ void VPSwitchScreen::handleEvent (XEvent *event) { switch (event->type) { case KeyPress: KeySym pressedKeySym; unsigned int mods; int i, row; if (!numberedActive) break; pressedKeySym = XLookupKeysym (&event->xkey, 0); mods = modHandler->keycodeToModifiers (event->xkey.keycode); if (mods & CompNumLockMask) row = 1; /* use first row of lookup table */ else row = 2; for (i = 0; i < 10; i++) { /* first try to handle normal number keys */ if (numberKeySyms[0][i] == pressedKeySym) { destination *= 10; destination += i; break; } else { if (numberKeySyms[row][i] == pressedKeySym) { destination *= 10; destination += i; break; } } } } screen->handleEvent (event); } bool VPSwitchScreen::initiateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options) { numberedActive = true; if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); return true; } bool VPSwitchScreen::terminateNumbered (CompAction *action, CompAction::State state, CompOption::Vector &options) { int nx, ny; CompSize vpsize (screen->vpSize ()); if (!numberedActive) return false; numberedActive = false; if (destination < 1 || destination > (int) (vpsize.width () * vpsize.height ())) return false; nx = (destination - 1 ) % vpsize.width (); ny = (destination - 1 ) / vpsize.width (); gotovp (nx, ny); return true; } /* switch-to-specific viewport stuff */ bool VPSwitchScreen::switchto (CompAction *action, CompAction::State state, CompOption::Vector &options, int num) { destination = num; numberedActive = true; return terminateNumbered (action, state, options); } VPSwitchScreen::VPSwitchScreen (CompScreen *screen): PluginClassHandler (screen), destination (0), numberedActive (false) { ScreenInterface::setHandler (screen); #define directionBind(name, dx, dy) \ optionSet##name##ButtonInitiate (boost::bind (&VPSwitchScreen::movevp, \ this, _1, _2, _3, dx, dy)) directionBind (Left, -1, 0); directionBind (Right, 1, 0); directionBind (Up, 0, -1); directionBind (Down, 0, 1); #undef directionBind #define numberedBind(num) \ optionSetSwitchTo##num##KeyInitiate (boost::bind (&VPSwitchScreen::switchto, \ this, _1, _2, _3, num)) /* Note: get actions in multi-lists, this is ugly */ numberedBind (1); numberedBind (2); numberedBind (3); numberedBind (4); numberedBind (5); numberedBind (6); numberedBind (7); numberedBind (8); numberedBind (9); numberedBind (10); #undef numberedBind optionSetBeginKeyInitiate (boost::bind(&VPSwitchScreen::initiateNumbered, this, _1, _2, _3)); optionSetBeginKeyTerminate (boost::bind (&VPSwitchScreen::terminateNumbered, this, _1, _2, _3)); optionSetNextButtonInitiate (boost::bind (&VPSwitchScreen::next, this, _1, _2, _3)); optionSetPrevButtonInitiate (boost::bind (&VPSwitchScreen::prev, this, _1, _2, _3)); optionSetInitiateButtonInitiate (boost::bind (&VPSwitchScreen::initPluginAction, this, _1, _2, _3)); optionSetInitiateButtonTerminate (boost::bind (&VPSwitchScreen::termPluginAction, this, _1, _2, _3)); } bool VPSwitchPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/extrawm/0000755000004100000410000000000013246301623014413 5ustar www-datawww-data./plugins/extrawm/CMakeLists.txt0000644000004100000410000000014513246301623017153 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (extrawm PLUGINDEPS composite) ./plugins/extrawm/src/0000755000004100000410000000000013246301623015202 5ustar www-datawww-data./plugins/extrawm/src/extrawm.cpp0000644000004100000410000001650213246301623017401 0ustar www-datawww-data/* * Compiz extra WM actions plugins * extrawm.cpp * * Copyright: (C) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "extrawm.h" COMPIZ_PLUGIN_20090315 (extrawm, ExtraWMPluginVTable); bool compositeAvailable; void ExtraWMScreen::addAttentionWindow (CompWindow *w) { std::list ::iterator it; /* check if the window is already there */ for (it = attentionWindows.begin (); it != attentionWindows.end (); ++it) { if (*it == w) return; } attentionWindows.push_back (w); } void ExtraWMScreen::removeAttentionWindow (CompWindow *w) { attentionWindows.remove (w); } void ExtraWMScreen::updateAttentionWindow (CompWindow *w) { XWMHints *hints; bool urgent = false; if (w->overrideRedirect ()) return; if (w->wmType () & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) return; hints = XGetWMHints (screen->dpy (), w->id ()); if (hints) { if (hints->flags & XUrgencyHint) urgent = true; XFree (hints); } if (urgent || (w->state () & CompWindowStateDemandsAttentionMask)) addAttentionWindow (w); else removeAttentionWindow (w); } bool ExtraWMScreen::activateDemandsAttention (CompAction *action, CompAction::State state, CompOption::Vector &options) { EXTRAWM_SCREEN (screen); if (!es->attentionWindows.empty ()) { CompWindowList::iterator it = es->attentionWindows.begin (); /* We want to keep these windows in the list and skip over them * if they are currently unmapped (since they could be mapped * again, and that would mean that we'd want to handle them * if they became wanting attention again) */ for (; it != es->attentionWindows.end (); ++it) { CompWindow *w = *it; if (!w->mapNum () || !w->isViewable ()) { if (!w->minimized () && !w->inShowDesktopMode () && !w->shaded ()) { continue; } } w->activate (); break; } } return false; } bool ExtraWMScreen::activateWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w) screen->sendWindowActivationRequest (w->id ()); return true; } void ExtraWMScreen::fullscreenWindow (CompWindow *w, unsigned int state) { unsigned int newState = w->state (); if (w->overrideRedirect ()) return; /* It would be a bug, to put a shaded window to fullscreen. */ if (w->shaded ()) return; state = w->constrainWindowState (state, w->actions ()); state &= CompWindowStateFullscreenMask; if (state == (w->state () & CompWindowStateFullscreenMask)) return; newState &= ~CompWindowStateFullscreenMask; newState |= state; w->changeState (newState); w->updateAttributes (CompStackingUpdateModeNormal); } bool ExtraWMScreen::toggleFullscreen (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findWindow (xid); if (w && (w->actions () & CompWindowActionFullscreenMask)) { EXTRAWM_SCREEN (screen); es->fullscreenWindow (w, w->state () ^ CompWindowStateFullscreenMask); } return true; } bool ExtraWMScreen::toggleRedirect (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findTopLevelWindow (xid); if (!compositeAvailable) { compLogMessage ("extrawm", CompLogLevelWarn, "composite plugin "\ "not loaded, cannot redirect/unredirect window"); return true; } if (w) { CompositeWindow *cWindow = CompositeWindow::get (w); if (cWindow) { if (cWindow->redirected ()) cWindow->unredirect (); else cWindow->redirect (); } } return true; } bool ExtraWMScreen::toggleAlwaysOnTop (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findTopLevelWindow (xid); if (w) { unsigned int newState; newState = w->state () ^ CompWindowStateAboveMask; w->changeState (newState); w->updateAttributes (CompStackingUpdateModeNormal); } return true; } bool ExtraWMScreen::toggleSticky (CompAction *action, CompAction::State state, CompOption::Vector &options) { CompWindow *w; Window xid; xid = CompOption::getIntOptionNamed (options, "window"); w = screen->findTopLevelWindow (xid); if (w && (w->actions () & CompWindowActionStickMask)) { unsigned int newState; newState = w->state () ^ CompWindowStateStickyMask; w->changeState (newState); } return true; } void ExtraWMScreen::handleEvent (XEvent *event) { screen->handleEvent (event); switch (event->type) { case PropertyNotify: if (event->xproperty.atom == XA_WM_HINTS) { CompWindow *w; w = screen->findWindow (event->xproperty.window); if (w) updateAttentionWindow (w); } break; default: break; } } void ExtraWMWindow::stateChangeNotify (unsigned int lastState) { EXTRAWM_SCREEN (screen); window->stateChangeNotify (lastState); if ((window->state () ^ lastState) & CompWindowStateDemandsAttentionMask) es->updateAttentionWindow (window); } ExtraWMScreen::ExtraWMScreen (CompScreen *screen) : PluginClassHandler (screen), ExtrawmOptions () { ScreenInterface::setHandler (screen); optionSetToggleRedirectKeyInitiate (toggleRedirect); optionSetToggleAlwaysOnTopKeyInitiate (toggleAlwaysOnTop); optionSetToggleStickyKeyInitiate (toggleSticky); optionSetToggleFullscreenKeyInitiate (toggleFullscreen); optionSetActivateInitiate (activateWin); optionSetActivateDemandsAttentionKeyInitiate (activateDemandsAttention); } ExtraWMWindow::ExtraWMWindow (CompWindow *window) : PluginClassHandler (window), window (window) { WindowInterface::setHandler (window); } ExtraWMWindow::~ExtraWMWindow () { ExtraWMScreen::get (screen)->removeAttentionWindow (window); } bool ExtraWMPluginVTable::init () { if (CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI)) compositeAvailable = true; else compositeAvailable = false; if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/extrawm/src/extrawm.h0000644000004100000410000000535013246301623017045 0ustar www-datawww-data/* * extrawm.h * Compiz extra WM actions plugins * Copyright: (C) 2007 Danny Baumann * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "extrawm_options.h" class ExtraWMScreen : public PluginClassHandler , public ExtrawmOptions, public ScreenInterface { public: std::list attentionWindows; ExtraWMScreen (CompScreen *); void handleEvent (XEvent *); void addAttentionWindow (CompWindow *w); void removeAttentionWindow (CompWindow *w); void updateAttentionWindow (CompWindow *w); void fullscreenWindow (CompWindow *w, unsigned int state); static bool activateDemandsAttention (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool activateWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleFullscreen (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleRedirect (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleAlwaysOnTop (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleSticky (CompAction *action, CompAction::State state, CompOption::Vector &options); }; class ExtraWMWindow : public PluginClassHandler , public WindowInterface { public: ExtraWMWindow (CompWindow *); ~ExtraWMWindow (); CompWindow *window; void stateChangeNotify (unsigned int); }; #define EXTRAWM_SCREEN(s) \ ExtraWMScreen *es = ExtraWMScreen::get (s); #define EXTRAWM_WINDOW(w) \ ExtraWMWindow *ew = ExtraWMWindow::get (w); class ExtraWMPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/extrawm/extrawm.xml.in0000644000004100000410000000252313246301623017233 0ustar www-datawww-data <_short>Extra WM Actions <_long>Provides less commonly used WM actions Window Management composite opengl decor ./plugins/notification/0000755000004100000410000000000013246301623015412 5ustar www-datawww-data./plugins/notification/CMakeLists.txt0000644000004100000410000000042513246301623020153 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) compiz_plugin (notification PKGDEPS libnotify) compiz_pkg_check_modules (HAVE_LIBNOTIFY_0_6_1 libnotify>=0.6.1) if (HAVE_LIBNOTIFY_0_6_1_FOUND) add_definitions (-DHAVE_LIBNOTIFY_0_6_1) endif (HAVE_LIBNOTIFY_0_6_1_FOUND) ./plugins/notification/src/0000755000004100000410000000000013246301623016201 5ustar www-datawww-data./plugins/notification/src/notification.h0000644000004100000410000000315613246301623021045 0ustar www-datawww-data/* * Notification plugin for compiz * * notification.h * * Copyright (C) 2007 Mike Dransfield (mike (at) blueroot.co.uk) * Maintained by Danny Baumann * Ported to compiz++ by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "notification_options.h" extern const std::string IMAGE_DIR; class NotificationScreen : public PluginClassHandler , public NotificationOptions, public ScreenInterface { public: NotificationScreen (CompScreen *); void logMessage (const char *, CompLogLevel, const char *); }; #define NOTIFICATION_SCREEN(s) \ NotificationScreen *ns = NotificationScreen::get (s); class NotificationPluginVTable : public CompPlugin::VTableForScreen { public: bool init (); }; ./plugins/notification/src/notification.cpp0000644000004100000410000000600113246301623021370 0ustar www-datawww-data/* * Notification plugin for compiz * * notification.cpp * * Copyright (C) 2007 Mike Dransfield (mike (at) blueroot.co.uk) * Maintained by Danny Baumann * Ported to compiz++ by Sam Spilsbury * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "notification.h" COMPIZ_PLUGIN_20090315 (notification, NotificationPluginVTable); const std::string IMAGE_DIR(".compiz/images"); /* libnotify 0.7 introduced proper NOTIFY_CHECK_VERSION macro */ #if defined(NOTIFY_CHECK_VERSION) && !defined(HAVE_LIBNOTIFY_0_6_1) #if NOTIFY_CHECK_VERSION(0,6,1) #define HAVE_LIBNOTIFY_0_6_1 #endif #endif void NotificationScreen::logMessage (const char *component, CompLogLevel level, const char *message) { NotifyNotification *n; char *logLevel, *homeDir; CompString iconUri; int timeout; NotifyUrgency urgency; if (level > optionGetMaxLogLevel ()) { screen->logMessage (component, level, message); return; } homeDir = getenv ("HOME"); if (!homeDir) return; /* FIXME: when not installing manually, the image will likely reside in $PREFIX/share/compiz, not in the home dir */ iconUri = "file://"; iconUri += homeDir; iconUri += "/" + IMAGE_DIR + "/compiz.png"; logLevel = (char *) logLevelToString (level); n = notify_notification_new (logLevel, message, iconUri.c_str () #ifndef HAVE_LIBNOTIFY_0_6_1 , NULL #endif ); timeout = optionGetTimeout (); if (timeout > 0) timeout *= 1000; notify_notification_set_timeout (n, timeout); if (level == CompLogLevelFatal || level == CompLogLevelError) urgency = NOTIFY_URGENCY_CRITICAL; else if (level == CompLogLevelWarn) urgency = NOTIFY_URGENCY_NORMAL; else urgency = NOTIFY_URGENCY_LOW; notify_notification_set_urgency (n, urgency); notify_notification_show (n, NULL); g_object_unref (G_OBJECT (n)); screen->logMessage (component, level, message); } NotificationScreen::NotificationScreen (CompScreen *screen) : PluginClassHandler (screen), NotificationOptions () { ScreenInterface::setHandler (screen); } bool NotificationPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./plugins/notification/images/0000755000004100000410000000000013246301623016657 5ustar www-datawww-data./plugins/notification/images/compiz.png0000644000004100000410000000244713246301623020675 0ustar www-datawww-dataPNG  IHDR D PLTEssu}x w m~zopq| "x"((((-/234567799>?CDGHKLMNQRVWX\\]_`cgilnnooppqqruvyz{{||}~Ɂ߃†ߍܐ֙觩ůұ涻tRNSbGIDAT$E[Usŝ iWl"wir`pمp&" , ,LTw[ #70 J qw]%9RģK>8X'n?Zp2H2+9=G\A"6ڬ0^| (ʅ*PCO z@ V vԪZ_JEt!D\EU|=9#Ͼ\UYQ,2\Rλu[Y UV0XNS4cFM^yWD.L"alr&..}ɢCȺ!Sa|H_IG <\~(*VdP&<׈eˢWPOOXHiAgض, `DS8_p&DȒ2E{mKHeY%%:IQELqI LRE$$Mp$V|ǧ9IENDB`./plugins/notification/notification.xml.in0000644000004100000410000000225413246301623021232 0ustar www-datawww-data <_short>Notification <_long>Use libnotify to graphically display error messages Utility composite opengl place ./plugins/freewins/0000755000004100000410000000000013246301623014546 5ustar www-datawww-data./plugins/freewins/CMakeLists.txt0000644000004100000410000000042313246301623017305 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include (FindOpenGL) if (OPENGL_GLU_FOUND) compiz_plugin (freewins PLUGINDEPS composite opengl PKGDEPS cairo-xlib cairo LIBRARIES ${OPENGL_glu_LIBRARY} INCDIRS ${OPENGL_INCLUDE_DIR} LDFLAGSADD) endif (OPENGL_GLU_FOUND) ./plugins/freewins/freewins.xml.in0000644000004100000410000003234613246301623017527 0ustar www-datawww-data <_short>Freely Transformable Windows <_long>Freely transform windows Effects opengl opengl scale ring shift shelf group wobbly animation water cubeaddon 3d ./plugins/freewins/src/0000755000004100000410000000000013246301624015336 5ustar www-datawww-data./plugins/freewins/src/freewins.cpp0000644000004100000410000002066513246301623017674 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * freewins.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Modifier key to rotate on the Z Axis * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" COMPIZ_PLUGIN_20090315 (freewins, FWPluginVTable); /* Information on window resize */ void FWWindow::resizeNotify (int dx, int dy, int dw, int dh) { calculateInputRect (); int x = WIN_REAL_X(window) + WIN_REAL_W(window)/2.0; int y = WIN_REAL_Y(window) + WIN_REAL_H(window)/2.0; mRadius = sqrt(pow((x - WIN_REAL_X (window)), 2) + pow((y - WIN_REAL_Y (window)), 2)); window->resizeNotify (dx, dy, dw, dh); } void FWWindow::moveNotify (int dx, int dy, bool immediate) { FREEWINS_SCREEN (screen); /* Did we move and IPW and not the actual window? */ CompWindow *useWindow = fws->getRealWindow (window); if (useWindow) useWindow->move (dx, dy, fws->optionGetImmediateMoves ()); else if (window != fws->mGrabWindow) adjustIPW (); if (!useWindow) useWindow = window; int x = WIN_REAL_X (useWindow) + WIN_REAL_W (useWindow) /2.0; int y = WIN_REAL_Y (useWindow) + WIN_REAL_H (useWindow) /2.0; mRadius = sqrt (pow((x - WIN_REAL_X (useWindow)), 2) + pow ((y - WIN_REAL_Y (useWindow)), 2)); useWindow->moveNotify (dx, dy, immediate); } void FWScreen::reloadSnapKeys () { unsigned int imask = optionGetInvertModsMask (); mInvertMask = 0; if (imask & InvertModsShiftMask) mInvertMask |= ShiftMask; if (imask & InvertModsAltMask) mInvertMask |= CompAltMask; if (imask & InvertModsControlMask) mInvertMask |= ControlMask; if (imask & InvertModsMetaMask) mInvertMask |= CompMetaMask; unsigned int smask = optionGetSnapModsMask (); mSnapMask = 0; if (smask & SnapModsShiftMask) mSnapMask |= ShiftMask; if (smask & SnapModsAltMask) mSnapMask |= CompAltMask; if (smask & SnapModsControlMask) mSnapMask |= ControlMask; if (smask & SnapModsMetaMask) mSnapMask |= CompMetaMask; } void FWScreen::optionChanged (CompOption *option, FreewinsOptions::Options num) { switch (num) { case FreewinsOptions::SnapMods: case FreewinsOptions::InvertMods: reloadSnapKeys (); break; default: break; } } /* ------ Plugin Initialisation ---------------------------------------*/ /* Window initialisation / cleaning */ FWWindow::FWWindow (CompWindow *w) : PluginClassHandler (w), window (w), cWindow (CompositeWindow::get (w)), gWindow (GLWindow::get (w)), mIMidX (WIN_REAL_W (w) / 2.0), mIMidY (WIN_REAL_H (w) / 2.0), mOMidX (0.0f), mOMidY (0.0f), mAdjustX (0.0f), mAdjustY (0.0f), mOldWinX (0), mOldWinY (0), mWinH (0), mWinW (0), mDirection (UpDown), mCorner (CornerTopLeft), mInput (NULL), mOutputRect (w->outputRect ()), mInputRect (w->borderRect ()), mResetting (false), mIsAnimating (false), mCan2D (false), mCan3D (false), mTransformed (false), mGrab (grabNone) { WindowInterface::setHandler (window); CompositeWindowInterface::setHandler (cWindow); GLWindowInterface::setHandler (gWindow); int x = WIN_REAL_X (w) + WIN_REAL_W (w) /2.0; int y = WIN_REAL_Y (w) + WIN_REAL_H (w) /2.0; mRadius = sqrt (pow ((x - WIN_REAL_X (w)), 2) + pow ((y - WIN_REAL_Y (w)), 2)); } FWWindow::~FWWindow () { if (canShape ()) handleWindowInputInfo (); FREEWINS_SCREEN (screen); if (fws->mGrabWindow == window) fws->mGrabWindow = NULL; } #define ROTATE_INC optionGetRotateIncrementAmount () #define NEG_ROTATE_INC optionGetRotateIncrementAmount () *-1 #define SCALE_INC optionGetScaleIncrementAmount () #define NEG_SCALE_INC optionGetScaleIncrementAmount () *-1 FWScreen::FWScreen (CompScreen *screen) : PluginClassHandler (screen), cScreen (CompositeScreen::get (screen)), gScreen (GLScreen::get (screen)), mClick_root_x (0), mClick_root_y (0), mGrabWindow (NULL), mHoverWindow (NULL), mLastGrabWindow (NULL), mAxisHelp (false), mSnap (false), mInvert (false), mSnapMask (0), mInvertMask (0), mGrabIndex (0) { ScreenInterface::setHandler (screen); CompositeScreenInterface::setHandler (cScreen); GLScreenInterface::setHandler (gScreen); /* TODO: warning about shape! */ /* BCOP Action initiation */ optionSetInitiateRotationButtonInitiate (boost::bind (&FWScreen::initiateFWRotate, this, _1, _2, _3)); optionSetInitiateRotationButtonTerminate (boost::bind (&FWScreen::terminateFWRotate, this, _1, _2, _3)); optionSetInitiateScaleButtonInitiate (boost::bind (&FWScreen::initiateFWScale, this, _1, _2, _3)); optionSetInitiateScaleButtonTerminate (boost::bind (&FWScreen::terminateFWScale, this, _1, _2, _3)); optionSetResetButtonInitiate (boost::bind (&FWScreen::resetFWTransform, this, _1, _2, _3)); optionSetResetKeyInitiate (boost::bind (&FWScreen::resetFWTransform, this, _1, _2, _3)); optionSetToggleAxisKeyInitiate (boost::bind (&FWScreen::toggleFWAxis, this, _1, _2, _3)); // Rotate / Scale Up Down Left Right TODO: rebind these actions on option change optionSetScaleUpButtonInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, SCALE_INC)); optionSetScaleDownButtonInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, NEG_SCALE_INC)); optionSetScaleUpKeyInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, SCALE_INC)); optionSetScaleDownKeyInitiate (boost::bind (&FWScreen::scale, this, _1, _2, _3, NEG_SCALE_INC)); optionSetRotateUpKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, ROTATE_INC, 0)); optionSetRotateDownKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, NEG_ROTATE_INC, 0)); optionSetRotateLeftKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, ROTATE_INC, 0, 0)); optionSetRotateRightKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, NEG_ROTATE_INC, 0, 0)); optionSetRotateCKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, 0, ROTATE_INC)); optionSetRotateCcKeyInitiate (boost::bind (&FWScreen::rotate, this, _1, _2, _3, 0, 0, NEG_ROTATE_INC)); optionSetRotateInitiate (boost::bind (&FWScreen::rotateAction, this, _1, _2, _3)); optionSetIncrementRotateInitiate (boost::bind (&FWScreen::incrementRotateAction, this, _1, _2, _3)); optionSetScaleInitiate (boost::bind (&FWScreen::scaleAction, this, _1, _2, _3)); optionSetSnapModsNotify (boost::bind (&FWScreen::optionChanged, this, _1, _2)); optionSetInvertModsNotify (boost::bind (&FWScreen::optionChanged, this, _1, _2)); reloadSnapKeys (); } bool FWPluginVTable::init () { if (!screen->XShape ()) { compLogMessage ("shelf", CompLogLevelError, "No Shape extension found. IPW Usage not enabled \n"); } if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION) && CompPlugin::checkPluginABI ("composite", COMPIZ_COMPOSITE_ABI) && CompPlugin::checkPluginABI ("opengl", COMPIZ_OPENGL_ABI)) return true; return false; } ./plugins/freewins/src/paint.cpp0000644000004100000410000003723713246301623017170 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * paint.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" /* ------ Window and Output Painting ------------------------------------*/ /* Damage util function */ void FWWindow::damageArea () { CompositeScreen::get (screen)->damageRegion (mOutputRect); } /* Animation Prep */ void FWScreen::preparePaint (int ms) { /* FIXME: should only loop over all windows if at least one animation is running */ foreach (CompWindow *w, screen->windows ()) { FREEWINS_WINDOW (w); float speed = optionGetSpeed (); fww->mAnimate.steps = ((float) ms / ((20.1 - speed) * 100)); if (fww->mAnimate.steps < 0.005) fww->mAnimate.steps = 0.005; /* Animation. We calculate how much increment * a window must rotate / scale per paint by * using the set destination attributes minus * the old attributes divided by the time * remaining. */ /* Don't animate if the window is saved */ fww->mTransform.angX += (float) fww->mAnimate.steps * (fww->mAnimate.destAngX - fww->mTransform.angX) * speed; fww->mTransform.angY += (float) fww->mAnimate.steps * (fww->mAnimate.destAngY - fww->mTransform.angY) * speed; fww->mTransform.angZ += (float) fww->mAnimate.steps * (fww->mAnimate.destAngZ - fww->mTransform.angZ) * speed; fww->mTransform.scaleX += (float) fww->mAnimate.steps * (fww->mAnimate.destScaleX - fww->mTransform.scaleX) * speed; fww->mTransform.scaleY += (float) fww->mAnimate.steps * (fww->mAnimate.destScaleY - fww->mTransform.scaleY) * speed; if (((fww->mTransform.angX >= fww->mAnimate.destAngX - 0.05 && fww->mTransform.angX <= fww->mAnimate.destAngX + 0.05 ) && (fww->mTransform.angY >= fww->mAnimate.destAngY - 0.05 && fww->mTransform.angY <= fww->mAnimate.destAngY + 0.05 ) && (fww->mTransform.angZ >= fww->mAnimate.destAngZ - 0.05 && fww->mTransform.angZ <= fww->mAnimate.destAngZ + 0.05 ) && (fww->mTransform.scaleX >= fww->mAnimate.destScaleX - 0.00005 && fww->mTransform.scaleX <= fww->mAnimate.destScaleX + 0.00005 ) && (fww->mTransform.scaleY >= fww->mAnimate.destScaleY - 0.00005 && fww->mTransform.scaleY <= fww->mAnimate.destScaleY + 0.00005 ))) { fww->mResetting = FALSE; fww->mTransform.angX = fww->mAnimate.destAngX; fww->mTransform.angY = fww->mAnimate.destAngY; fww->mTransform.angZ = fww->mAnimate.destAngZ; fww->mTransform.scaleX = fww->mAnimate.destScaleX; fww->mTransform.scaleY = fww->mAnimate.destScaleY; fww->mTransform.unsnapAngX = fww->mAnimate.destAngX; fww->mTransform.unsnapAngY = fww->mAnimate.destAngY; fww->mTransform.unsnapAngZ = fww->mAnimate.destAngZ; fww->mTransform.unsnapScaleX = fww->mAnimate.destScaleX; fww->mTransform.unsnapScaleY = fww->mAnimate.destScaleX; } //else // fww->damageArea (); } cScreen->preparePaint (ms); } /* Paint the window rotated or scaled */ bool FWWindow::glPaint (const GLWindowPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, unsigned int mask) { GLMatrix wTransform (transform); int currentCull, invertCull; glGetIntegerv (GL_CULL_FACE_MODE, ¤tCull); invertCull = (currentCull == GL_BACK) ? GL_FRONT : GL_BACK; bool status; FREEWINS_SCREEN (screen); /* Has something happened? */ /* Check to see if we are painting on a transformed screen */ /* Enable this code when we can animate between the two states */ if ((mTransform.angX != 0.0 || mTransform.angY != 0.0 || mTransform.angZ != 0.0 || mTransform.scaleX != 1.0 || mTransform.scaleY != 1.0 || mOldWinX != WIN_REAL_X (window) || mOldWinY != WIN_REAL_Y (window)) && fws->optionGetShapeWindowTypes ().evaluate (window)) { mOldWinX = WIN_REAL_X (window); mOldWinY = WIN_REAL_Y (window); /* Figure out where our 'origin' is, don't allow the origin to * be where we clicked if the window is not grabbed, etc */ /* Here we duplicate some of the work the openGL does * but for different reasons. We have access to the * window's transformation matrix, so we will create * our own matrix and apply the same transformations * to it. From there, we create vectors for each point * that we wish to track and multiply them by this * matrix to give us the rotated / scaled co-ordinates. * From there, we project these co-ordinates onto the flat * screen that we have using the OGL viewport, projection * matrix and model matrix. Projection gives us three * co-ordinates, but we ignore Z and just use X and Y * to store in a surrounding rectangle. We can use this * surrounding rectangle to make things like shaping and * damage a lot more accurate than they used to be. */ calculateOutputRect (); /* Prepare for transformation by * doing any necessary adjustments */ float autoScaleX = 1.0f; float autoScaleY = 1.0f; if (fws->optionGetAutoZoom ()) { float apparantWidth = mOutputRect.width (); float apparantHeight = mOutputRect.height (); autoScaleX = (float) WIN_OUTPUT_W (window) / (float) apparantWidth; autoScaleY = (float) WIN_OUTPUT_H (window) / (float) apparantHeight; if (autoScaleX >= 1.0f) autoScaleX = 1.0f; if (autoScaleY >= 1.0f) autoScaleY = 1.0f; autoScaleX = autoScaleY = (autoScaleX + autoScaleY) / 2; /* Because we modified the scale after calculating * the output rect, we need to recalculate again */ calculateOutputRect (); } /* float scaleX = autoScaleX - (1 - mTransform.scaleX); float scaleY = autoScaleY - (1 - mTransform.scaleY); */ /* Actually Transform the window */ mask |= PAINT_WINDOW_TRANSFORMED_MASK; /* Adjust the window in the matrix to prepare for transformation */ if (mGrab != grabRotate && mGrab != grabScale) { calculateInputOrigin (WIN_REAL_X (window) + WIN_REAL_W (window) / 2.0f, WIN_REAL_Y (window) + WIN_REAL_H (window) / 2.0f); calculateOutputOrigin (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window) / 2.0f, WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window) / 2.0f); } float adjustX = 0.0f; float adjustY = 0.0f; fws->modifyMatrix (wTransform, mTransform.angX, mTransform.angY, mTransform.angZ, mIMidX, mIMidY , 0.0f, mTransform.scaleX, mTransform.scaleY, 1.0f, adjustX, adjustY, TRUE); /* Create rects for input after we've dealt with output */ calculateInputRect (); /* Determine if the window is inverted */ Bool xInvert = FALSE; Bool yInvert = FALSE; Bool needsInvert = FALSE; float renX = fabs (fmodf (mTransform.angX, 360.0f)); float renY = fabs (fmodf (mTransform.angY, 360.0f)); if (90 < renX && renX < 270) xInvert = TRUE; if (90 < renY && renY < 270) yInvert = TRUE; if ((xInvert || yInvert) && !(xInvert && yInvert)) needsInvert = TRUE; if (needsInvert) glCullFace (invertCull); status = gWindow->glPaint (attrib, wTransform, region, mask); if (needsInvert) glCullFace (currentCull); } else { status = gWindow->glPaint (attrib, wTransform, region, mask); } // Check if there are rotated windows if (!((mTransform.angX >= 0.0f - 0.05 && mTransform.angX <= 0.0f + 0.05 ) && (mTransform.angY >= 0.0f - 0.05 && mTransform.angY <= 0.0f + 0.05 ) && (mTransform.angZ >= 0.0f - 0.05 && mTransform.angZ <= 0.0f + 0.05 ) && (mTransform.scaleX >= 1.0f - 0.00005 && mTransform.scaleX <= 1.0f + 0.00005 ) && (mTransform.scaleY >= 1.0f - 0.00005 && mTransform.scaleY <= 1.0f + 0.00005 )) && !mTransformed) mTransformed = TRUE; else if (mTransformed) mTransformed = FALSE; /* There is still animation to be done */ if (!(((mTransform.angX >= mAnimate.destAngX - 0.05 && mTransform.angX <= mAnimate.destAngX + 0.05 ) && (mTransform.angY >= mAnimate.destAngY - 0.05 && mTransform.angY <= mAnimate.destAngY + 0.05 ) && (mTransform.angZ >= mAnimate.destAngZ - 0.05 && mTransform.angZ <= mAnimate.destAngZ + 0.05 ) && (mTransform.scaleX >= mAnimate.destScaleX - 0.00005 && mTransform.scaleX <= mAnimate.destScaleX + 0.00005 ) && (mTransform.scaleY >= mAnimate.destScaleY - 0.00005 && mTransform.scaleY <= mAnimate.destScaleY + 0.00005 )))) { damageArea (); mIsAnimating = TRUE; } else if (mIsAnimating) /* We're done animating now, and we were animating */ { if (handleWindowInputInfo ()) adjustIPW (); mIsAnimating = FALSE; } return status; } /* Paint the window axis help onto the screen */ bool FWScreen::glPaintOutput (const GLScreenPaintAttrib &attrib, const GLMatrix &transform, const CompRegion ®ion, CompOutput *output, unsigned int mask) { GLMatrix zTransform (transform); if (!mTransformedWindows.empty ()) mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK; bool status = gScreen->glPaintOutput (attrib, transform, region, output, mask); if (mAxisHelp && mHoverWindow) { int j; float x = WIN_REAL_X(mHoverWindow) + WIN_REAL_W(mHoverWindow)/2.0; float y = WIN_REAL_Y(mHoverWindow) + WIN_REAL_H(mHoverWindow)/2.0; FREEWINS_WINDOW (mHoverWindow); float zRad = fww->mRadius * (optionGetTdPercent () / 100); bool wasCulled = glIsEnabled (GL_CULL_FACE); zTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA); glPushMatrix (); glLoadMatrixf (zTransform.getMatrix ()); if (wasCulled) glDisable (GL_CULL_FACE); if (optionGetShowCircle () && optionGetRotationAxis () == RotationAxisAlwaysCentre) { glColor4usv (optionGetCircleColor ()); glEnable (GL_BLEND); glBegin (GL_POLYGON); for (j = 0; j < 360; j += 10) glVertex3f ( x + zRad * cos(D2R(j)), y + zRad * sin(D2R(j)), 0.0 ); glEnd (); glDisable (GL_BLEND); glColor4usv (optionGetLineColor ()); glLineWidth (3.0); glBegin (GL_LINE_LOOP); for (j = 360; j >= 0; j -= 10) glVertex3f ( x + zRad * cos(D2R(j)), y + zRad * sin(D2R(j)), 0.0 ); glEnd (); glBegin (GL_LINE_LOOP); for (j = 360; j >= 0; j -= 10) glVertex3f( x + fww->mRadius * cos(D2R(j)), y + fww->mRadius * sin(D2R(j)), 0.0 ); glEnd (); } /* Draw the 'gizmo' */ if (optionGetShowGizmo ()) { glPushMatrix (); glTranslatef (x, y, 0.0); glScalef (zRad, zRad, zRad / (float)screen->width ()); glRotatef (fww->mTransform.angX, 1.0f, 0.0f, 0.0f); glRotatef (fww->mTransform.angY, 0.0f, 1.0f, 0.0f); glRotatef (fww->mTransform.angZ, 0.0f, 0.0f, 1.0f); glLineWidth (4.0f); for (int i = 0; i < 3; i++) { glPushMatrix (); glColor4f (1.0 * (i==0), 1.0 * (i==1), 1.0 * (i==2), 1.0); glRotatef (90.0, 1.0 * (i==0), 1.0 * (i==1), 1.0 * (i==2)); glBegin (GL_LINE_LOOP); for (j=360; j>=0; j -= 10) glVertex3f ( cos (D2R (j)), sin (D2R (j)), 0.0 ); glEnd (); glPopMatrix (); } glPopMatrix (); glColor4usv (defaultColor); } /* Draw the bounding box */ if (optionGetShowRegion ()) { glDisableClientState (GL_TEXTURE_COORD_ARRAY); glEnable (GL_BLEND); glColor4us (0x2fff, 0x2fff, 0x4fff, 0x4fff); glRecti (fww->mInputRect.x1 (), fww->mInputRect.y1 (), fww->mInputRect.x2 (), fww->mInputRect.y2 ()); glColor4us (0x2fff, 0x2fff, 0x4fff, 0x9fff); glBegin (GL_LINE_LOOP); glVertex2i (fww->mInputRect.x1 (), fww->mInputRect.y1 ()); glVertex2i (fww->mInputRect.x2 (), fww->mInputRect.y1 ()); glVertex2i (fww->mInputRect.x1 (), fww->mInputRect.y2 ()); glVertex2i (fww->mInputRect.x2 (), fww->mInputRect.y2 ()); glEnd (); glColor4usv (defaultColor); glDisable (GL_BLEND); glEnableClientState (GL_TEXTURE_COORD_ARRAY); } if (optionGetShowCross ()) { glColor4usv (optionGetCrossLineColor ()); glBegin(GL_LINES); glVertex3f(x, y - (WIN_REAL_H (mHoverWindow) / 2), 0.0f); glVertex3f(x, y + (WIN_REAL_H (mHoverWindow) / 2), 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(x - (WIN_REAL_W (mHoverWindow) / 2), y, 0.0f); glVertex3f(x + (WIN_REAL_W (mHoverWindow) / 2), y, 0.0f); glEnd (); /* Move to our first corner (TopLeft) */ if (fww->mInput) { glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex1, fww->mOutput.shapey1, 0.0f); glVertex3f(fww->mOutput.shapex2, fww->mOutput.shapey2, 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex2, fww->mOutput.shapey2, 0.0f); glVertex3f(fww->mOutput.shapex4, fww->mOutput.shapey4, 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex4, fww->mOutput.shapey4, 0.0f); glVertex3f(fww->mOutput.shapex3, fww->mOutput.shapey3, 0.0f); glEnd (); glBegin(GL_LINES); glVertex3f(fww->mOutput.shapex3, fww->mOutput.shapey3, 0.0f); glVertex3f(fww->mOutput.shapex1, fww->mOutput.shapey1, 0.0f); glEnd (); } } if (wasCulled) glEnable(GL_CULL_FACE); glColor4usv(defaultColor); glPopMatrix (); } return status; } void FWScreen::donePaint () { if (mAxisHelp && mHoverWindow) { FREEWINS_WINDOW (mHoverWindow); REGION region; region.rects = ®ion.extents; region.numRects = region.size = 1; region.extents.x1 = MIN (WIN_REAL_X (mHoverWindow), WIN_REAL_X (mHoverWindow) + WIN_REAL_W (mHoverWindow) / 2.0f - fww->mRadius); region.extents.x2 = MAX (WIN_REAL_X (mHoverWindow), WIN_REAL_X (mHoverWindow) + WIN_REAL_W (mHoverWindow) / 2.0f + fww->mRadius); region.extents.y1 = MIN (WIN_REAL_Y (mHoverWindow), WIN_REAL_Y (mHoverWindow) + WIN_REAL_H (mHoverWindow) / 2.0f - fww->mRadius); region.extents.y2 = MAX (WIN_REAL_Y (mHoverWindow), WIN_REAL_Y (mHoverWindow) + WIN_REAL_H (mHoverWindow) / 2.0f + fww->mRadius); CompRegion damageRegion (region.extents.x1, region.extents.y1, region.extents.x2 - region.extents.x1, region.extents.y2 - region.extents.y1); cScreen->damageRegion (damageRegion); } cScreen->donePaint (); } /* Damage the Window Rect */ bool FWWindow::damageRect (bool initial, const CompRect &rect) { FREEWINS_SCREEN(screen); if (mTransformed) damageArea (); /** * Special situations where we must damage the screen * i.e when we are playing with windows and wobbly is * enabled */ if ((mGrab == grabMove && !fws->optionGetImmediateMoves ()) || (mIsAnimating || window->grabbed ())) fws->cScreen->damageScreen (); return cWindow->damageRect (initial, rect); } ./plugins/freewins/src/freewins.h0000644000004100000410000002763313246301623017343 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * freewins.h * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * * Button binding support and Reset added by: * enigma_0Z * * Scaling, Animation, Input-Shaping, Snapping * and Key-Based Transformation added by: * Sam Spilsbury * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include #include #include #include #include #include #include #include #include #include #include #include #include "freewins_options.h" /* #define ABS(x) ((x)>0?(x):-(x)) */ #define D2R(x) ((x) * (M_PI / 180.0)) #define R2D(x) ((x) * (180 / M_PI)) /* ------ Macros ---------------------------------------------------------*/ #define WIN_OUTPUT_X(w) (w->x () - w->output ().left) #define WIN_OUTPUT_Y(w) (w->y () - w->output ().top) #define WIN_OUTPUT_W(w) (w->width () + w->output ().left + w->output ().right) #define WIN_OUTPUT_H(w) (w->height () + w->output ().top + w->output ().bottom) #define WIN_REAL_X(w) (w->x () - w->border ().left) #define WIN_REAL_Y(w) (w->y () - w->border ().top) #define WIN_REAL_W(w) (w->width () + w->border ().left + w->border ().right) #define WIN_REAL_H(w) (w->height () + w->border ().top + w->border ().bottom) #define WIN_CORNER1(w) GLVector ic1 = GLVector (WIN_REAL_X (w), WIN_REAL_Y (w), 0.0f, 1.0f); #define WIN_CORNER2(w) GLVector ic2 = GLVector (WIN_REAL_X (w) + WIN_REAL_W (w), WIN_REAL_Y (w), 0.0f, 1.0f); #define WIN_CORNER3(w) GLVector ic3 = GLVector (WIN_REAL_X (w), WIN_REAL_Y (w) + WIN_REAL_H (w), 0.0f, 1.0f); #define WIN_CORNER4(w) GLVector ic4 = GLVector (WIN_REAL_X (w) + WIN_REAL_W (w), WIN_REAL_Y (w) + WIN_REAL_H (w), 0.0f, 1.0f); #define WIN_OCORNER1(w) GLVector oc1 = GLVector (WIN_OUTPUT_X (w), WIN_OUTPUT_Y (w), 0.0f, 1.0f); #define WIN_OCORNER2(w) GLVector oc2 = GLVector (WIN_OUTPUT_X (w) + WIN_OUTPUT_W (w), WIN_OUTPUT_Y (w), 0.0f, 1.0f); #define WIN_OCORNER3(w) GLVector oc3 = GLVector (WIN_OUTPUT_X (w), WIN_OUTPUT_Y (w) + WIN_OUTPUT_H (w), 0.0f, 1.0f); #define WIN_OCORNER4(w) GLVector oc4 = GLVector ( WIN_OUTPUT_X (w) + WIN_OUTPUT_W (w), WIN_OUTPUT_Y (w) + WIN_OUTPUT_H (w), 0.0f, 1.0f); /* ------ Structures and Enums ------------------------------------------*/ /* Enums */ typedef enum _StartCorner { CornerTopLeft = 0, CornerTopRight = 1, CornerBottomLeft = 2, CornerBottomRight = 3 } StartCorner; typedef enum _FWGrabType { grabNone = 0, grabRotate, grabScale, grabMove, grabResize } FWGrabType; typedef enum _Direction { UpDown = 0, LeftRight = 1 } Direction; typedef enum _FWAxisType { axisX = 0, axisY, axisZ, axisXY, axisXZ, } FWAxisType; /* Shape info / restoration */ class FWWindowInputInfo { public: FWWindowInputInfo (CompWindow *); ~FWWindowInputInfo (); public: CompWindow *w; Window ipw; XRectangle *inputRects; int nInputRects; int inputRectOrdering; XRectangle *frameInputRects; int frameNInputRects; int frameInputRectOrdering; }; class FWWindowOutputInfo { public: float shapex1; float shapex2; float shapex3; float shapex4; float shapey1; float shapey2; float shapey3; float shapey4; }; /* Trackball */ /*typedef struct _FWTrackball { CompVector mouseX; CompVector mouse0; CompVector tr_axis; float tr_ang; float tr_radius; } FWTrackball;*/ /* Transformation info */ class FWTransformedWindowInfo { public: FWTransformedWindowInfo () : angX (0), angY (0), angZ (0), scaleX (1.0f), scaleY (1.0f), unsnapAngX (0), unsnapAngY (0), unsnapAngZ (0), unsnapScaleX (0), unsnapScaleY (0) {} //FWTrackball trackball; float angX; float angY; float angZ; float scaleX; float scaleY; // Window transformation /* Used for snapping */ float unsnapAngX; float unsnapAngY; float unsnapAngZ; float unsnapScaleX; float unsnapScaleY; }; class FWAnimationInfo { public: FWAnimationInfo () : oldAngX (0), oldAngY (0), oldAngZ (0), oldScaleX (1.0f), oldScaleY (1.0f), destAngX (0), destAngY (0), destAngZ (0), destScaleX (1.0f), destScaleY (1.0f), steps (0) {} // Old values to animate from float oldAngX; float oldAngY; float oldAngZ; float oldScaleX; float oldScaleY; // New values to animate to float destAngX; float destAngY; float destAngZ; float destScaleX; float destScaleY; // For animation float steps; }; class FWScreen : public PluginClassHandler , public ScreenInterface, public CompositeScreenInterface, public GLScreenInterface, public FreewinsOptions { public: FWScreen (CompScreen *screen); CompositeScreen *cScreen; GLScreen *gScreen; std::list mTransformedWindows; int mClick_root_x; int mClick_root_y; CompWindow *mGrabWindow; CompWindow *mHoverWindow; CompWindow *mLastGrabWindow; bool mAxisHelp; bool mSnap; bool mInvert; int mSnapMask; int mInvertMask; CompScreen::GrabHandle mGrabIndex; void preparePaint (int); bool glPaintOutput (const GLScreenPaintAttrib &, const GLMatrix &, const CompRegion &, CompOutput *, unsigned int ); void donePaint (); void handleEvent (XEvent *); void optionChanged (CompOption *option, FreewinsOptions::Options num); void reloadSnapKeys (); bool initiateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options); bool initiateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options); bool terminateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options); bool rotate (CompAction *action, CompAction::State state, CompOption::Vector options, int dx, int dy, int dz); bool scale (CompAction *action, CompAction::State state, CompOption::Vector options, int scale); bool resetFWTransform (CompAction *action, CompAction::State state, CompOption::Vector options); bool rotateAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool incrementRotateAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool scaleAction (CompAction *action, CompAction::State state, CompOption::Vector options); bool toggleFWAxis (CompAction *action, CompAction::State state, CompOption::Vector options); void addWindowToList (FWWindowInputInfo *info); void removeWindowFromList (FWWindowInputInfo *info); void adjustIPWStacking (); void rotateProjectVector (GLVector &vector, GLMatrix &transform, GLdouble *resultX, GLdouble *resultY, GLdouble *resultZ); void perspectiveDistortAndResetZ (GLMatrix &transform); void modifyMatrix (GLMatrix &transform, float angX, float angY, float angZ, float tX, float tY, float tZ, float scX, float scY, float scZ, float adjustX, float adjustY, bool paint); CompRect createSizedRect (float xScreen1, float xScreen2, float xScreen3, float xScreen4, float yScreen1, float yScreen2, float yScreen3, float yScreen4); CompWindow * getRealWindow (CompWindow *w); }; /* Freewins Window Structure */ class FWWindow : public PluginClassHandler , public WindowInterface, public CompositeWindowInterface, public GLWindowInterface { public: FWWindow (CompWindow *w); ~FWWindow (); CompWindow *window; CompositeWindow *cWindow; GLWindow *gWindow; bool glPaint (const GLWindowPaintAttrib &, const GLMatrix &, const CompRegion &, unsigned int ); bool damageRect (bool initial, const CompRect &); void moveNotify (int, int, bool); void resizeNotify (int, int, int, int); float mIMidX; float mIMidY; float mOMidX; /* These will be removed */ float mOMidY; float mAdjustX; float mAdjustY; float mRadius; // Used for determining window movement int mOldWinX; int mOldWinY; // Used for resize int mWinH; int mWinW; Direction mDirection; // Used to determine starting point StartCorner mCorner; // Transformation info FWTransformedWindowInfo mTransform; // Animation Info FWAnimationInfo mAnimate; // Input Info FWWindowInputInfo *mInput; //Output Info FWWindowOutputInfo mOutput; CompRect mOutputRect; CompRect mInputRect; // Used to determine whether to animate the window bool mResetting; bool mIsAnimating; // Used to determine whether rotating on X and Y axis, or just on Z bool mCan2D; // These need to be removed bool mCan3D; bool mTransformed; // So does this in favor of FWWindowInputInfo FWGrabType mGrab; void shapeIPW (); void saveInputShape (XRectangle **retRects, int *retCount, int *retOrdering); void adjustIPW (); void createIPW (); bool handleWindowInputInfo (); void shapeInput (); void unshapeInput (); void handleIPWResizeInitiate (); void handleIPWMoveInitiate (); void handleIPWMoveMotionEvent (unsigned int x, unsigned int y); void handleIPWResizeMotionEvent (unsigned int x, unsigned int y); void handleRotateMotionEvent (float dx, float dy, int x, int y); void handleScaleMotionEvent (float dx, float dy, int x, int y); void handleButtonReleaseEvent (); void handleEnterNotify (XEvent *xev); void handleLeaveNotify (XEvent *xev); void damageArea (); void setPrepareRotation (float dx, float dy, float dz, float dsu, float dsd); void calculateInputOrigin (float x, float y); void calculateOutputOrigin (float x, float y); void calculateOutputRect (); void calculateInputRect (); CompRect calculateWindowRect (GLVector c1, GLVector c2, GLVector c3, GLVector c4); void determineZAxisClick (int px, int py, bool motion); bool canShape (); void handleSnap (); }; #define FREEWINS_SCREEN(screen) \ FWScreen *fws = FWScreen::get (screen); #define FREEWINS_WINDOW(window) \ FWWindow *fww = FWWindow::get (window); class FWPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; ./plugins/freewins/src/input.cpp0000644000004100000410000002342513246301623017206 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * input.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" #include /* ------ Input Prevention -------------------------------------------*/ /* Shape the IPW * Thanks to Joel Bosveld (b0le) * for helping me with this section */ void FWWindow::shapeIPW () { if (mInput) { Window xipw = mInput->ipw; CompWindow *ipw = screen->findWindow (xipw); if (ipw) { cairo_t *cr; int width, height; width = mInputRect.width (); height = mInputRect.height (); Pixmap b = XCreatePixmap (screen->dpy (), xipw, width, height, 1); cairo_surface_t *bitmap = cairo_xlib_surface_create_for_bitmap (screen->dpy (), b, DefaultScreenOfDisplay (screen->dpy ()), width, height); cr = cairo_create (bitmap); cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); /* Move to our first corner (TopLeft) */ cairo_move_to (cr, mOutput.shapex1 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey1 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to TopRight */ cairo_line_to (cr, mOutput.shapex2 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey2 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to BottomRight */ cairo_line_to (cr, mOutput.shapex4 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey4 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to BottomLeft */ cairo_line_to (cr, mOutput.shapex3 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey3 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Line to TopLeft */ cairo_line_to (cr, mOutput.shapex1 - MIN(mInputRect.x1 (), mInputRect.x2 ()), mOutput.shapey1 - MIN(mInputRect.y1 (), mInputRect.y2 ())); /* Ensure it's all closed up */ cairo_close_path (cr); /* Fill in the box */ cairo_set_source_rgb (cr, 1.0f, 1.0f, 1.0f); cairo_fill (cr); /* This takes the bitmap we just drew with cairo * and scans out the white bits (You can see these) * if you uncomment the following line after this * comment. Then, all the bits we drew on are clickable, * leaving us with a nice and neat window shape. Yummy. */ /* XWriteBitmapFile (ipw->screen->display->display, "/path/to/your/image.bmp", b, ipw->width, ipw->height, -1, -1); */ XShapeCombineMask (screen->dpy (), xipw, ShapeBounding, 0, 0, b, ShapeSet); XFreePixmap (screen->dpy (), b); cairo_surface_destroy (bitmap); cairo_destroy (cr); } } } void FWWindow::saveInputShape (XRectangle **retRects, int *retCount, int *retOrdering) { XRectangle *rects; int count = 0, ordering; Display *dpy = screen->dpy (); rects = XShapeGetRectangles (dpy, window->id (), ShapeInput, &count, &ordering); /* check if the returned shape exactly matches the window shape - if that is true, the window currently has no set input shape */ if ((count == 1) && (rects[0].x == -window->geometry ().border ()) && (rects[0].y == -window->geometry ().border ()) && (rects[0].width == (window->serverWidth () + window->serverGeometry ().border ())) && (rects[0].height == (window->serverHeight () + window->serverGeometry (). border ()))) { count = 0; } *retRects = rects; *retCount = count; *retOrdering = ordering; } void FWScreen::addWindowToList (FWWindowInputInfo *info) { mTransformedWindows.push_back (info); } void FWScreen::removeWindowFromList (FWWindowInputInfo *info) { mTransformedWindows.remove (info); } /* Adjust size and location of the input prevention window */ void FWWindow::adjustIPW () { XWindowChanges xwc; Display *dpy = screen->dpy (); float f_width, f_height; if (!mInput || !mInput->ipw) return; f_width = mInputRect.width (); f_height = mInputRect.height (); xwc.x = mInputRect.x (); xwc.y = mInputRect.y (); xwc.width = (int) f_width; xwc.height = (int) f_height; xwc.stack_mode = Below; /* XXX: This causes XConfigureWindow to break */ //xwc.sibling = window->id (); XMapWindow (dpy, mInput->ipw); XConfigureWindow (dpy, mInput->ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); shapeIPW (); } void FWScreen::adjustIPWStacking () { foreach (FWWindowInputInfo *run, mTransformedWindows) { if (!run->w->prev || run->w->prev->id () != run->ipw) FWWindow::get (run->w)->adjustIPW (); } } /* Create an input prevention window */ void FWWindow::createIPW () { Window ipw; XSetWindowAttributes attrib; XWindowChanges xwc; if (!mInput || mInput->ipw) return; attrib.override_redirect = true; //attrib.event_mask = 0; xwc.x = mInputRect.x (); xwc.y = mInputRect.y (); xwc.width = mInputRect.width (); xwc.height = mInputRect.height (); ipw = XCreateWindow (screen->dpy (), screen->root (), xwc.x, xwc.y, xwc.width, xwc.height, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); XMapWindow (screen->dpy (), ipw); //XConfigureWindow (screen->dpy (), ipw, CWStackMode | CWX | CWY | CWWidth | CWHeight, &xwc); mInput->ipw = ipw; //shapeIPW (); } FWWindowInputInfo::FWWindowInputInfo (CompWindow *window) : w (window), ipw (None), inputRects (NULL), nInputRects (0), inputRectOrdering (0), frameInputRects (NULL), frameNInputRects (0), frameInputRectOrdering (0) { } FWWindowInputInfo::~FWWindowInputInfo () { } bool FWWindow::handleWindowInputInfo () { FREEWINS_SCREEN (screen); if (!mTransformed && mInput) { if (mInput->ipw) XDestroyWindow (screen->dpy (), mInput->ipw); unshapeInput (); fws->removeWindowFromList (mInput); delete mInput; mInput = NULL; return false; } else if (mTransformed && !mInput) { mInput = new FWWindowInputInfo (window); if (!mInput) return false; shapeInput (); createIPW (); fws->addWindowToList (mInput); } return true; } /* Shape the input of the window when scaled. * Since the IPW will be dealing with the input, removing input * from the window entirely is a perfectly good solution. */ void FWWindow::shapeInput () { Window frame; Display *dpy = screen->dpy(); saveInputShape (&mInput->inputRects, &mInput->nInputRects, &mInput->inputRectOrdering); frame = window->frame(); if (frame) { saveInputShape (&mInput->frameInputRects, &mInput->frameNInputRects, &mInput->frameInputRectOrdering); } else { mInput->frameInputRects = NULL; mInput->frameNInputRects = -1; mInput->frameInputRectOrdering = 0; } /* clear shape */ XShapeSelectInput (dpy, window->id(), NoEventMask); XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); if (frame) XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); XShapeSelectInput (dpy, window->id(), ShapeNotify); } /* Restores the shape of the window: * If the window had a custom shape defined by inputRects then we restore * that in order with XShapeCombineRectangles. * Most windows have no specific defined shape so we can restore it with * setting the shape to a 0x0 mask */ void FWWindow::unshapeInput () { Display *dpy = screen->dpy (); if (mInput->nInputRects) { XShapeCombineRectangles (dpy, window->id(), ShapeInput, 0, 0, mInput->inputRects, mInput->nInputRects, ShapeSet, mInput->inputRectOrdering); } else { XShapeCombineMask (dpy, window->id(), ShapeInput, 0, 0, None, ShapeSet); } if (mInput->frameNInputRects >= 0) { if (mInput->frameNInputRects) { XShapeCombineRectangles (dpy, window->frame(), ShapeInput, 0, 0, mInput->frameInputRects, mInput->frameNInputRects, ShapeSet, mInput->frameInputRectOrdering); } else { XShapeCombineMask (dpy, window->frame(), ShapeInput, 0, 0, None, ShapeSet); } } } ./plugins/freewins/src/events.cpp0000644000004100000410000004525713246301623017362 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * events.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - X Input Redirection * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" /* ------ Event Handlers ------------------------------------------------*/ void FWWindow::handleIPWResizeInitiate () { FREEWINS_SCREEN (screen); window->activate (); mGrab = grabResize; if(!screen->otherGrabExist ("freewins", "resize", 0)) if(!fws->mGrabIndex) { unsigned int mods = 0; mods &= CompNoMask; fws->mGrabIndex = screen->pushGrab (screen->cursorCache (XC_plus), "resize"); window->grabNotify (window->x () + (window->width () / 2), window->y () + (window->height () / 2), mods, CompWindowGrabMoveMask | CompWindowGrabButtonMask); fws->mGrabWindow = window; } } void FWWindow::handleIPWMoveInitiate () { FREEWINS_SCREEN (screen); window->activate (); mGrab = grabMove; if(!screen->otherGrabExist ("freewins", "resize", 0)) if(!fws->mGrabIndex) { unsigned int mods = 0; mods &= CompNoMask; fws->mGrabIndex = screen->pushGrab (screen->cursorCache (XC_fleur), "resize"); window->grabNotify (window->x () + (window->width () / 2), window->y () + (window->height () / 2), mods, CompWindowGrabResizeMask | CompWindowGrabButtonMask); fws->mGrabWindow = window; } } void FWWindow::handleIPWMoveMotionEvent (unsigned int x, unsigned int y) { FREEWINS_SCREEN (screen); int dx = x - lastPointerX; int dy = y - lastPointerY; if (!fws->mGrabIndex) return; window->move (dx, dy, fws->optionGetImmediateMoves ()); } void FWWindow::handleIPWResizeMotionEvent (unsigned int x, unsigned int y) { int dx = (x - lastPointerX) * 10; int dy = (y - lastPointerY) * 10; mWinH += dy; mWinW += dx; /* In order to prevent a window redraw on resize * on every motion event we have a threshold */ /* FIXME: cf-love: Instead of actually resizing the window, scale it up, then resize it */ if (mWinH - 10 > window->height () || mWinW - 10 > window->width ()) { XWindowChanges xwc; unsigned int mask = CWX | CWY | CWWidth | CWHeight; xwc.x = window->serverX (); xwc.y = window->serverY (); xwc.width = mWinW; xwc.height = mWinH; if (xwc.width == window->serverWidth ()) mask &= ~CWWidth; if (xwc.height == window->serverHeight ()) mask &= ~CWHeight; if (window->mapNum () && (mask & (CWWidth | CWHeight))) window->sendSyncRequest (); window->configureXWindow (mask, &xwc); } } /* Handle Rotation */ void FWWindow::handleRotateMotionEvent (float dx, float dy, int x, int y) { FREEWINS_SCREEN (screen); x -= 100; y -= 100; int oldX = lastPointerX - 100; int oldY = lastPointerY - 100; float midX = WIN_REAL_X (window) + WIN_REAL_W (window)/2.0; float midY = WIN_REAL_Y (window) + WIN_REAL_H (window)/2.0; float angX; float angY; float angZ; /* Save the current angles so we can work with them */ if (fws->optionGetSnap () || fws->mSnap) { angX = mTransform.unsnapAngX; angY = mTransform.unsnapAngY; angZ = mTransform.unsnapAngZ; } else { angX = mAnimate.destAngX; angY = mAnimate.destAngY; angZ = mAnimate.destAngZ; } /* Check for Y axis clicking (Top / Bottom) */ if (pointerY > midY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > midX) mCorner = CornerBottomRight; else if (pointerX < midX) mCorner = CornerBottomLeft; } else if (pointerY < midY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > midX) mCorner = CornerTopRight; else if (pointerX < midX) mCorner = CornerTopLeft; } float percentFromXAxis = 0.0, percentFromYAxis = 0.0; if (fws->optionGetZAxisRotation () == FreewinsOptions::ZAxisRotationInterchangeable) { /* Trackball rotation was too hard to implement. If anyone can implement it, * please come forward so I can replace this hacky solution to the problem. * Anyways, what happens here, is that we determine how far away we are from * each axis (y and x). The further we are away from the y axis, the more * up / down movements become Z axis movements and the further we are away from * the x-axis, the more left / right movements become z rotations. */ /* We determine this by taking a percentage of how far away the cursor is from * each axis. We divide the 3D rotation by this percentage ( and divide by the * percentage squared in order to ensure that rotation is not too violent when we * are quite close to the origin. We multiply the 2D rotation by this percentage also * so we are essentially rotating in 3D and 2D all the time, but this is only really * noticeable when you move the cursor over to the extremes of a window. In every case * percentage can be defined as decimal-percentage (i.e 0.036 == 3.6%). Like I mentioned * earlier, if you can replace this with trackball rotation, please come forward! */ float halfWidth = WIN_REAL_W (window) / 2.0f; float halfHeight = WIN_REAL_H (window) / 2.0f; float distFromXAxis = fabs (mIMidX - pointerX); float distFromYAxis = fabs (mIMidY - pointerY); percentFromXAxis = distFromXAxis / halfWidth; percentFromYAxis = distFromYAxis / halfHeight; } else if (fws->optionGetZAxisRotation () == FreewinsOptions::ZAxisRotationSwitch) determineZAxisClick (pointerX, pointerY, TRUE); dx *= 360; dy *= 360; /* Handle inversion */ bool can2D = mCan2D, can3D = mCan3D; if (fws->mInvert && fws->optionGetZAxisRotation () != FreewinsOptions::ZAxisRotationInterchangeable) { can2D = !mCan2D; can3D = !mCan3D; } if(can2D) { float zX = 1.0f; float zY = 1.0f; if (fws->optionGetZAxisRotation () == FreewinsOptions::ZAxisRotationInterchangeable) { zX = percentFromXAxis; zY = percentFromYAxis; } zX = zX > 1.0f ? 1.0f : zX; zY = zY > 1.0f ? 1.0f : zY; switch (mCorner) { case CornerTopRight: if (x < oldX) angZ -= dx * zX; else if (x > oldX) angZ += dx * zX; if (y < oldY) angZ -= dy * zY; else if (y > oldY) angZ += dy * zY; break; case CornerTopLeft: if (x < oldX) angZ -= dx * zX; else if (x > oldX) angZ += dx * zX; if (y < oldY) angZ += dy * zY; else if (y > oldY) angZ -= dy * zY; break; case CornerBottomLeft: if (x < oldX) angZ += dx * zX; else if (x > oldX) angZ -= dx * zX; if (y < oldY) angZ += dy * zY; else if (y > oldY) angZ -= dy * zY; break; case CornerBottomRight: if (x < oldX) angZ += dx * zX; else if (x > oldX) angZ -= dx * zX; if (y < oldY) angZ -= dy * zY; else if (y > oldY) angZ += dy * zY; break; } } if (can3D) { if (fws->optionGetZAxisRotation () != FreewinsOptions::ZAxisRotationInterchangeable) { percentFromXAxis = 0.0f; percentFromYAxis = 0.0f; } angX -= dy * (1 - percentFromXAxis); angY += dx * (1 - percentFromYAxis); } /* Restore angles */ if (fws->optionGetSnap () || fws->mSnap) { mTransform.unsnapAngX = angX; mTransform.unsnapAngY = angY; mTransform.unsnapAngZ = angZ; } else { mAnimate.destAngX = angX; mAnimate.destAngY = angY; mAnimate.destAngZ = angZ; } handleSnap (); } /* Handle Scaling */ void FWWindow::handleScaleMotionEvent (float dx, float dy, int x, int y) { FREEWINS_SCREEN (screen); x -= 100.0; y -= 100.0; int oldX = lastPointerX - 100; int oldY = lastPointerY - 100; float scaleX, scaleY; if (fws->optionGetSnap () || fws->mSnap) { scaleX = mTransform.unsnapScaleX; scaleY = mTransform.unsnapScaleY; } else { scaleX = mAnimate.destScaleX; scaleY = mAnimate.destScaleY; } calculateInputRect (); switch (mCorner) { case CornerTopLeft: // Check X Direction if (x < oldX) scaleX -= dx; else if (x > oldX) scaleX -= dx; // Check Y Direction if (y < oldY) scaleY -= dy; else if (y > oldY) scaleY -= dy; break; case CornerTopRight: // Check X Direction if (x < oldX) scaleX += dx; else if (x > oldX) scaleX += dx; // Check Y Direction if (y < oldY) scaleY -= dy; else if (y > oldY) scaleY -= dy; break; case CornerBottomLeft: // Check X Direction if (x < oldX) scaleX -= dx; else if (y > oldX) scaleX -= dx; // Check Y Direction if (y < oldY) scaleY += dy; else if (y > oldY) scaleY += dy; break; case CornerBottomRight: // Check X Direction if (x < oldX) scaleX += dx; else if (x > oldX) scaleX += dx; // Check Y Direction if (y < oldY) scaleY += dy; else if (y > oldY) scaleY += dy; break; } if (fws->optionGetSnap () || fws->mSnap) { mTransform.unsnapScaleX = scaleX; mTransform.unsnapScaleY = scaleY; } else { mAnimate.destScaleX = scaleX; mAnimate.destScaleY = scaleY; } /* Stop scale at threshold specified */ if (!fws->optionGetAllowNegative ()) { float minScale = fws->optionGetMinScale (); if (mAnimate.destScaleX < minScale) mAnimate.destScaleX = minScale; if (mAnimate.destScaleY < minScale) mAnimate.destScaleY = minScale; } /* Change scales for maintaining aspect ratio */ if (fws->optionGetScaleUniform ()) { float tempscaleX = mAnimate.destScaleX; float tempscaleY = mAnimate.destScaleY; mAnimate.destScaleX = (tempscaleX + tempscaleY) / 2; mAnimate.destScaleY = (tempscaleX + tempscaleY) / 2; mTransform.unsnapScaleX = (tempscaleX + tempscaleY) / 2; mTransform.unsnapScaleY = (tempscaleX + tempscaleY) / 2; } handleSnap (); } void FWWindow::handleButtonReleaseEvent () { FREEWINS_SCREEN (screen); if (mGrab == grabMove || mGrab == grabResize) { screen->removeGrab (fws->mGrabIndex, NULL); window->ungrabNotify (); window->moveInputFocusTo (); adjustIPW (); fws->mGrabIndex = 0; fws->mGrabWindow = NULL; mGrab = grabNone; } } void FWWindow::handleEnterNotify (XEvent *xev) { XEvent EnterNotifyEvent; memcpy (&EnterNotifyEvent.xcrossing, &xev->xcrossing, sizeof (XCrossingEvent)); /* if (window) { EnterNotifyEvent.xcrossing.window = window->id (); XSendEvent (screen->dpy (), window->id (), FALSE, EnterWindowMask, &EnterNotifyEvent); } */ } void FWWindow::handleLeaveNotify (XEvent *xev) { XEvent LeaveNotifyEvent; memcpy (&LeaveNotifyEvent.xcrossing, &xev->xcrossing, sizeof (XCrossingEvent)); LeaveNotifyEvent.xcrossing.window = window->id (); //XSendEvent (screen->dpy (), window->id (), FALSE, // LeaveWindowMask, &LeaveNotifyEvent); } /* X Event Handler */ void FWScreen::handleEvent (XEvent *ev) { float dx, dy; CompWindow *oldPrev, *oldNext, *w; /* Check our modifiers first */ if (ev->type == screen->xkbEvent ()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) ev; if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) ev; unsigned int snapMods = 0xffffffff; unsigned int invertMods = 0xffffffff; if (mSnapMask) snapMods = mSnapMask; if ((stateEvent->mods & snapMods) == snapMods) mSnap = TRUE; else mSnap = FALSE; if (mInvertMask) invertMods = mInvertMask; if ((stateEvent->mods & invertMods) == invertMods) mInvert = TRUE; else mInvert = FALSE; } } switch(ev->type) { case EnterNotify: { CompWindow *btnW; btnW = screen->findWindow (ev->xbutton.subwindow); /* It wasn't the subwindow, try the window */ if (!btnW) btnW = screen->findWindow (ev->xbutton.window); /* We have established the CompWindow we clicked * on. Get the real window */ if (btnW) { FREEWINS_WINDOW (btnW); if (fww->canShape () && !mGrabWindow && !screen->otherGrabExist (0)) mHoverWindow = btnW; btnW = getRealWindow (btnW); } if (btnW) { FREEWINS_WINDOW (btnW); if (fww->canShape () && !mGrabWindow && !screen->otherGrabExist (0)) mHoverWindow = btnW; fww->handleEnterNotify (ev); } } break; case LeaveNotify: { CompWindow *btnW; btnW = screen->findWindow (ev->xbutton.subwindow); /* It wasn't the subwindow, try the window */ if (!btnW) btnW = screen->findWindow (ev->xbutton.window); /* We have established the CompWindow we clicked * on. Get the real window */ if (btnW) btnW = getRealWindow (btnW); if (btnW) FWWindow::get (btnW)->handleLeaveNotify (ev); } break; case MotionNotify: { if (mGrabWindow) { FREEWINS_WINDOW (mGrabWindow); dx = ((float)(pointerX - lastPointerX) / screen->width ()) * \ optionGetMouseSensitivity (); dy = ((float)(pointerY - lastPointerY) / screen->height ()) * \ optionGetMouseSensitivity (); if (optionGetShapeWindowTypes ().evaluate (mGrabWindow)) { if (fww->mGrab == grabMove || fww->mGrab == grabResize) { FWWindowInputInfo *info; // CompWindow *w = mGrabWindow; foreach (info, mTransformedWindows) { if (mGrabWindow->id () == info->ipw) /* The window we just grabbed was actually * an IPW, get the real window instead */ w = getRealWindow (mGrabWindow); } } switch (fww->mGrab) { case grabMove: fww->handleIPWMoveMotionEvent (pointerX, pointerY); break; case grabResize: fww->handleIPWResizeMotionEvent (pointerX, pointerY); break; default: break; } } if (fww->mGrab == grabRotate) { fww->handleRotateMotionEvent(dx, dy, ev->xmotion.x, ev->xmotion.y); } if (fww->mGrab == grabScale) { fww->handleScaleMotionEvent(dx * 3, dy * 3, ev->xmotion.x, ev->xmotion.y); } //if(dx != 0.0 || dy != 0.0) // fww->damageArea (); } } break; /* Button Press and Release */ case ButtonPress: { CompWindow *btnW; btnW = screen->findWindow (ev->xbutton.subwindow); /* It wasn't the subwindow, try the window */ if (!btnW) btnW = screen->findWindow (ev->xbutton.window); /* We have established the CompWindow we clicked * on. Get the real window * FIXME: Free btnW and use another CompWindow * such as realW */ if (btnW) btnW = getRealWindow (btnW); if (btnW) { FREEWINS_WINDOW (btnW); if (optionGetShapeWindowTypes ().evaluate (btnW)) switch (ev->xbutton.button) { case Button1: fww->handleIPWMoveInitiate (); break; case Button3: fww->handleIPWResizeInitiate (); break; default: break; } } mClick_root_x = ev->xbutton.x_root; mClick_root_y = ev->xbutton.y_root; } break; case ButtonRelease: { if (mGrabWindow) { FREEWINS_WINDOW (mGrabWindow); if (optionGetShapeWindowTypes ().evaluate (mGrabWindow)) if (fww->mGrab == grabMove || fww->mGrab == grabResize) { fww->handleButtonReleaseEvent (); mGrabWindow = 0; } } } break; case ConfigureNotify: { w = screen->findWindow (ev->xconfigure.window); if (w) { oldPrev = w->prev; oldNext = w->next; FREEWINS_WINDOW (w); fww->mWinH = WIN_REAL_H (w); fww->mWinW = WIN_REAL_W (w); } } break; #if 0 case ClientMessage: { if (ev->xclient.message_type == Atoms::desktopViewport) { /* Viewport change occurred, or something like that - adjust the IPW's */ CompWindow *adjW, *actualW; foreach (adjW, screen->windows ()) { int vX = 0, vY = 0, dX, dY; actualW = getRealWindow (adjW); if (!actualW) actualW = adjW; if (actualW) { CompWindow *ipw; FREEWINS_WINDOW (actualW); if (!fww->mInput || fww->mInput->ipw) break; ipw = screen->findWindow (fww->mInput->ipw); if (ipw) { dX = screen->vp ().x () - vX; dY = screen->vp ().y () - vY; CompPoint p = actualW->defaultViewport (); vX = p.x (); vY = p.y (); ipw->moveToViewportPosition (ipw->x () - dX * screen->width (), ipw->y () - dY * screen->height (), true); // ??? } } } } } break; #endif default: break; #if 0 if (ev->type == screen->shapeEvent () + ShapeNotify) { XShapeEvent *se = (XShapeEvent *) ev; if (se->kind == ShapeInput) { CompWindow *w; w = screen->findWindow (se->window); if (w) { FREEWINS_WINDOW (w); if (fww->canShape () && (fww->mTransform.scaleX != 1.0f || fww->mTransform.scaleY != 1.0f)) { // Reset the window back to normal fww->mTransform.scaleX = 1.0f; fww->mTransform.scaleY = 1.0f; fww->mTransform.angX = 0.0f; fww->mTransform.angY = 0.0f; fww->mTransform.angZ = 0.0f; /*FWShapeInput (w); - Disabled due to problems it causes*/ } } } } #endif } screen->handleEvent (ev); /* Now we can find out if a restacking occurred while we were handing events */ switch (ev->type) { case ConfigureNotify: { w = screen->findWindow (ev->xconfigure.window); if (w) { oldPrev = w->prev; oldNext = w->next; if (w->prev != oldPrev || w->next != oldNext) { /* restacking occured, ensure ipw stacking */ adjustIPWStacking (); } } } break; } } ./plugins/freewins/src/util.cpp0000644000004100000410000003244513246301623017026 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * util.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ #include "freewins.h" /* ------ Utility Functions ---------------------------------------------*/ /* Rotate and project individual vectors */ void FWScreen::rotateProjectVector (GLVector &vector, GLMatrix &transform, GLdouble *resultX, GLdouble *resultY, GLdouble *resultZ) { vector = transform * vector; GLint viewport[4]; // Viewport GLdouble modelview[16]; // Modelview Matrix GLdouble projection[16]; // Projection Matrix glGetIntegerv (GL_VIEWPORT, viewport); glGetDoublev (GL_MODELVIEW_MATRIX, modelview); glGetDoublev (GL_PROJECTION_MATRIX, projection); gluProject (vector[GLVector::x], vector[GLVector::y], vector[GLVector::z], modelview, projection, viewport, resultX, resultY, resultZ); /* Y must be negated */ *resultY = screen->height () - *resultY; } /* Scales z by 0 and does perspective distortion so that it * looks the same wherever on the screen * * This code taken from animation.c, * Copyright (c) 2006 Erkin Bahceci */ void FWScreen::perspectiveDistortAndResetZ (GLMatrix &transform) { float v = -1.0 / ::screen->width (); /* This does transform = M * transform, where M is 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, v, 0, 0, 0, 1 */ transform[8] = v * transform[12]; transform[9] = v * transform[13]; transform[10] = v * transform[14]; transform[11] = v * transform[15]; } void FWScreen::modifyMatrix (GLMatrix &transform, float angX, float angY, float angZ, float tX, float tY, float tZ, float scX, float scY, float scZ, float adjustX, float adjustY, bool paint) { /* Create our transformation Matrix */ transform.translate (tX, tY, 0.0); if (paint) perspectiveDistortAndResetZ (transform); else transform.scale (1.0f, 1.0f, 1.0f / screen->width ()); transform.rotate (angX, 1.0f, 0.0f, 0.0f); transform.rotate (angY, 0.0f, 1.0f, 0.0f); transform.rotate (angZ, 0.0f, 0.0f, 1.0f); transform.scale (scX, 1.0f, 0.0f); transform.scale (1.0f, scY, 0.0f); transform.translate (-(tX), -(tY), 0.0f); } /* static float det3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) { float ret = 0.0; ret += m00 * m11 * m22 - m21 * m12 * m00; ret += m01 * m12 * m20 - m22 * m10 * m01; ret += m02 * m10 * m21 - m20 * m11 * m02; return ret; } static void FWFindInverseMatrix(CompTransform *m, CompTransform *r) { float *mm = m->m; float d, c[16]; d = mm[0] * det3(mm[5], mm[6], mm[7], mm[9], mm[10], mm[11], mm[13], mm[14], mm[15]) - mm[1] * det3(mm[4], mm[6], mm[7], mm[8], mm[10], mm[11], mm[12], mm[14], mm[15]) + mm[2] * det3(mm[4], mm[5], mm[7], mm[8], mm[9], mm[11], mm[12], mm[13], mm[15]) - mm[3] * det3(mm[4], mm[5], mm[6], mm[8], mm[9], mm[10], mm[12], mm[13], mm[14]); c[0] = det3(mm[5], mm[6], mm[7], mm[9], mm[10], mm[11], mm[13], mm[14], mm[15]); c[1] = -det3(mm[4], mm[6], mm[7], mm[8], mm[10], mm[11], mm[12], mm[14], mm[15]); c[2] = det3(mm[4], mm[5], mm[7], mm[8], mm[9], mm[11], mm[12], mm[13], mm[15]); c[3] = -det3(mm[4], mm[5], mm[6], mm[8], mm[9], mm[10], mm[12], mm[13], mm[14]); c[4] = -det3(mm[1], mm[2], mm[3], mm[9], mm[10], mm[11], mm[13], mm[14], mm[15]); c[5] = det3(mm[0], mm[2], mm[3], mm[8], mm[10], mm[11], mm[12], mm[14], mm[15]); c[6] = -det3(mm[0], mm[1], mm[3], mm[8], mm[9], mm[11], mm[12], mm[13], mm[15]); c[7] = det3(mm[0], mm[1], mm[2], mm[8], mm[9], mm[10], mm[12], mm[13], mm[14]); c[8] = det3(mm[1], mm[2], mm[3], mm[5], mm[6], mm[7], mm[13], mm[14], mm[15]); c[9] = -det3(mm[0], mm[2], mm[3], mm[4], mm[6], mm[7], mm[12], mm[14], mm[15]); c[10] = det3(mm[0], mm[1], mm[3], mm[4], mm[5], mm[7], mm[12], mm[13], mm[15]); c[11] = -det3(mm[0], mm[1], mm[2], mm[4], mm[5], mm[6], mm[12], mm[13], mm[14]); c[12] = -det3(mm[1], mm[2], mm[3], mm[5], mm[6], mm[7], mm[9], mm[10], mm[11]); c[13] = det3(mm[0], mm[2], mm[3], mm[4], mm[6], mm[7], mm[8], mm[10], mm[11]); c[14] = -det3(mm[0], mm[1], mm[3], mm[4], mm[5], mm[7], mm[8], mm[9], mm[11]); c[15] = det3(mm[0], mm[1], mm[2], mm[4], mm[5], mm[6], mm[8], mm[9], mm[10]); r->m[0] = c[0] / d; r->m[1] = c[4] / d; r->m[2] = c[8] / d; r->m[3] = c[12] / d; r->m[4] = c[1] / d; r->m[5] = c[5] / d; r->m[6] = c[9] / d; r->m[7] = c[13] / d; r->m[8] = c[2] / d; r->m[9] = c[6] / d; r->m[10] = c[10] / d; r->m[11] = c[14] / d; r->m[12] = c[3] / d; r->m[13] = c[7] / d; r->m[14] = c[11] / d; r->m[15] = c[15] / d; return; } */ /* Create a rect from 4 screen points */ CompRect FWScreen::createSizedRect (float xScreen1, float xScreen2, float xScreen3, float xScreen4, float yScreen1, float yScreen2, float yScreen3, float yScreen4) { /* Left most point */ float leftmost = xScreen1; if (xScreen2 <= leftmost) leftmost = xScreen2; if (xScreen3 <= leftmost) leftmost = xScreen3; if (xScreen4 <= leftmost) leftmost = xScreen4; /* Right most point */ float rightmost = xScreen1; if (xScreen2 >= rightmost) rightmost = xScreen2; if (xScreen3 >= rightmost) rightmost = xScreen3; if (xScreen4 >= rightmost) rightmost = xScreen4; /* Top most point */ float topmost = yScreen1; if (yScreen2 <= topmost) topmost = yScreen2; if (yScreen3 <= topmost) topmost = yScreen3; if (yScreen4 <= topmost) topmost = yScreen4; /* Bottom most point */ float bottommost = yScreen1; if (yScreen2 >= bottommost) bottommost = yScreen2; if (yScreen3 >= bottommost) bottommost = yScreen3; if (yScreen4 >= bottommost) bottommost = yScreen4; /* Box rect; rect.x1 = leftmost; rect.x2 = rightmost; rect.y1 = topmost; rect.y2 = bottommost; */ return CompRect (leftmost, topmost, rightmost - leftmost, bottommost - topmost); } CompRect FWWindow::calculateWindowRect (GLVector c1, GLVector c2, GLVector c3, GLVector c4) { FREEWINS_SCREEN (screen); GLMatrix transform; GLdouble xScreen1 = 0.0f, yScreen1 = 0.0f, zScreen1 = 0.0f; GLdouble xScreen2 = 0.0f, yScreen2 = 0.0f, zScreen2 = 0.0f; GLdouble xScreen3 = 0.0f, yScreen3 = 0.0f, zScreen3 = 0.0f; GLdouble xScreen4 = 0.0f, yScreen4 = 0.0f, zScreen4 = 0.0f; transform.reset (); fws->modifyMatrix (transform, mTransform.angX, mTransform.angY, mTransform.angZ, mIMidX, mIMidY, 0.0f, mTransform.scaleX, mTransform.scaleY, 0.0f, 0.0f, 0.0f, false); fws->rotateProjectVector(c1, transform, &xScreen1, &yScreen1, &zScreen1); fws->rotateProjectVector(c2, transform, &xScreen2, &yScreen2, &zScreen2); fws->rotateProjectVector(c3, transform, &xScreen3, &yScreen3, &zScreen3); fws->rotateProjectVector(c4, transform, &xScreen4, &yScreen4, &zScreen4); /* Save the non-rectangular points so that we can shape the rectangular IPW */ mOutput.shapex1 = xScreen1; mOutput.shapex2 = xScreen2; mOutput.shapex3 = xScreen3; mOutput.shapex4 = xScreen4; mOutput.shapey1 = yScreen1; mOutput.shapey2 = yScreen2; mOutput.shapey3 = yScreen3; mOutput.shapey4 = yScreen4; return fws->createSizedRect(xScreen1, xScreen2, xScreen3, xScreen4, yScreen1, yScreen2, yScreen3, yScreen4); } void FWWindow::calculateOutputRect () { GLVector corner1 = GLVector (WIN_OUTPUT_X (window), WIN_OUTPUT_Y (window), 1.0f, 1.0f); GLVector corner2 = GLVector (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window), WIN_OUTPUT_Y (window), 1.0f, 1.0f); GLVector corner3 = GLVector (WIN_OUTPUT_X (window), WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window), 1.0f, 1.0f); GLVector corner4 = GLVector (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window), WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window), 1.0f, 1.0f); mOutputRect = calculateWindowRect (corner1, corner2, corner3, corner4); } void FWWindow::calculateInputRect () { GLVector corner1 = GLVector (WIN_REAL_X (window), WIN_REAL_Y (window), 1.0f, 1.0f); GLVector corner2 = GLVector (WIN_REAL_X (window) + WIN_REAL_W (window), WIN_REAL_Y (window), 1.0f, 1.0f); GLVector corner3 = GLVector (WIN_REAL_X (window), WIN_REAL_Y (window) + WIN_REAL_H (window), 1.0f, 1.0f); GLVector corner4 = GLVector (WIN_REAL_X (window) + WIN_REAL_W (window), WIN_REAL_Y (window) + WIN_REAL_H (window), 1.0f, 1.0f); mInputRect = calculateWindowRect (corner1, corner2, corner3, corner4); } void FWWindow::calculateInputOrigin (float x, float y) { mIMidX = x; mIMidY = y; } void FWWindow::calculateOutputOrigin (float x, float y) { float dx, dy; dx = x - WIN_OUTPUT_X (window); dy = y - WIN_OUTPUT_Y (window); mOMidX = WIN_OUTPUT_X (window) + dx * mTransform.scaleX; mOMidY = WIN_OUTPUT_Y (window) + dy * mTransform.scaleY; } /* Change angles more than 360 into angles out of 360 */ /*static int FWMakeIntoOutOfThreeSixty (int value) { while (value > 0) { value -= 360; } if (value < 0) value += 360; return value; }*/ /* Determine if we clicked in the z-axis region */ void FWWindow::determineZAxisClick (int px, int py, bool motion) { bool directionChange = FALSE; if (!mCan2D && motion) { static int steps; /* Check if we are going in a particular 3D direction * because if we are going left/right and we suddenly * change to 2D mode this would not be expected behaviour. * It is only if we have a change in direction that we want * to change to 2D rotation. */ Direction direction, oldDirection = LeftRight; static int ddx, ddy; unsigned int dx = pointerX - lastPointerX; unsigned int dy = pointerY - lastPointerY; ddx += dx; ddy += dy; if (steps >= 10) { if (ddx > ddy) direction = LeftRight; else direction = UpDown; if (direction != oldDirection) directionChange = TRUE; direction = oldDirection; } steps++; } else directionChange = TRUE; if (directionChange) { float clickRadiusFromCenter; int x = (WIN_REAL_X(window) + WIN_REAL_W(window)/2.0); int y = (WIN_REAL_Y(window) + WIN_REAL_H(window)/2.0); clickRadiusFromCenter = sqrt(pow((x - px), 2) + pow((y - py), 2)); if (clickRadiusFromCenter > mRadius * (FWScreen::get (screen)->optionGetTdPercent () / 100)) { mCan2D = TRUE; mCan3D = FALSE; } else { mCan2D = FALSE; mCan3D = TRUE; } } } /* Check to see if we can shape a window */ bool FWWindow::canShape () { FREEWINS_SCREEN (screen); if (!fws->optionGetDoShapeInput ()) return FALSE; if (!screen->XShape ()) return FALSE; if (!fws->optionGetShapeWindowTypes ().evaluate (window)) return FALSE; return TRUE; } /* Checks if w is a ipw and returns the real window */ CompWindow * FWScreen::getRealWindow (CompWindow *w) { FWWindowInputInfo *info; foreach (info, mTransformedWindows) { if (w->id () == info->ipw) return info->w; } return NULL; } void FWWindow::handleSnap () { FREEWINS_SCREEN (screen); /* Handle Snapping */ if (fws->optionGetSnap () || fws->mSnap) { int snapFactor = fws->optionGetSnapThreshold (); mAnimate.destAngX = ((int) (mTransform.unsnapAngX) / snapFactor) * snapFactor; mAnimate.destAngY = ((int) (mTransform.unsnapAngY) / snapFactor) * snapFactor; mAnimate.destAngZ = ((int) (mTransform.unsnapAngZ) / snapFactor) * snapFactor; mTransform.scaleX = ((float) ( (int) (mTransform.unsnapScaleX * (21 - snapFactor) + 0.5))) / (21 - snapFactor); mTransform.scaleY = ((float) ( (int) (mTransform.unsnapScaleY * (21 - snapFactor) + 0.5))) / (21 - snapFactor); } } ./plugins/freewins/src/action.cpp0000644000004100000410000004727013246301623017330 0ustar www-datawww-data/** * Compiz Fusion Freewins plugin * * action.cpp * * Copyright (C) 2007 Rodolfo Granata * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Author(s): * Rodolfo Granata * Sam Spilsbury * * Button binding support and Reset added by: * enigma_0Z * * Most of the input handling here is based on * the shelf plugin by * : Kristian Lyngstøl * : Danny Baumann * * Description: * * This plugin allows you to freely transform the texture of a window, * whether that be rotation or scaling to make better use of screen space * or just as a toy. * * Todo: * - Fully implement an input redirection system by * finding an inverse matrix, multiplying by it, * translating to the actual window co-ords and * XSendEvent() the co-ords to the actual window. * - Code could be cleaner * - Add timestep and speed options to animation * - Add window hover-over info via paintOutput : i.e * - Resize borders * - 'Reset' Button * - 'Scale' Button * - 'Rotate' Button */ /* TODO: Finish porting stuff to actions */ #include "freewins.h" /* ------ Actions -------------------------------------------------------*/ /* Initiate Mouse Rotation */ bool FWScreen::initiateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow* w; CompWindow *useW; Window xid; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); useW = screen->findWindow (xid); if (w) { foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw) if (w->id () == info->ipw) /* The window we just grabbed was actually * an IPW, get the real window instead */ useW = getRealWindow (w); } if (!screen->otherGrabExist ("freewins", 0)) if (!mGrabIndex) { mGrabIndex = screen->pushGrab (0, "freewins"); } } if (useW) { if (true || optionGetShapeWindowTypes ().evaluate (useW)) { FREEWINS_WINDOW (useW); int x = CompOption::getIntOptionNamed (options, "x", useW->x () + (useW->width () / 2)); int y = CompOption::getIntOptionNamed (options, "y", useW->y () + (useW->height () / 2)); int mods = CompOption::getIntOptionNamed (options, "modifiers", 0); mGrabWindow = useW; fww->mGrab = grabRotate; /* Save current scales and angles */ fww->mAnimate.oldAngX = fww->mTransform.angX; fww->mAnimate.oldAngY = fww->mTransform.angY; fww->mAnimate.oldAngZ = fww->mTransform.angZ; fww->mAnimate.oldScaleX = fww->mTransform.scaleX; fww->mAnimate.oldScaleY = fww->mTransform.scaleY; if (pointerY > fww->mIMidY) { if (pointerX > fww->mIMidX) fww->mCorner = CornerBottomRight; else if (pointerX < fww->mIMidX) fww->mCorner = CornerBottomLeft; } else if (pointerY < fww->mIMidY) { if (pointerX > fww->mIMidX) fww->mCorner = CornerTopRight; else if (pointerX < fww->mIMidX) fww->mCorner = CornerTopLeft; } switch (optionGetZAxisRotation ()) { case ZAxisRotationAlways3d: fww->mCan3D = TRUE; fww->mCan2D = FALSE; break; case ZAxisRotationAlways2d: fww->mCan3D = FALSE; fww->mCan2D = TRUE; break; case ZAxisRotationDetermineOnClick: case ZAxisRotationSwitch: fww->determineZAxisClick (pointerX, pointerY, FALSE); break; case ZAxisRotationInterchangeable: fww->mCan3D = TRUE; fww->mCan2D = TRUE; break; default: break; } /* Set the rotation axis */ switch (optionGetRotationAxis ()) { case RotationAxisAlwaysCentre: default: fww->calculateInputOrigin (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f, WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); fww->calculateOutputOrigin (WIN_OUTPUT_X (mGrabWindow) + WIN_OUTPUT_W (mGrabWindow) / 2.0f, WIN_OUTPUT_Y (mGrabWindow) + WIN_OUTPUT_H (mGrabWindow) / 2.0f); break; case RotationAxisClickPoint: fww->calculateInputOrigin (mClick_root_x, mClick_root_y); fww->calculateOutputOrigin (mClick_root_x, mClick_root_y); break; case RotationAxisOppositeToClick: fww->calculateInputOrigin (useW->x () + useW->width () - mClick_root_x, useW->y () + useW->height () - mClick_root_y); fww->calculateOutputOrigin (useW->x () + useW->width () - mClick_root_x, useW->y () + useW->height () - mClick_root_y); break; } /* Announce that we grabbed the window */ useW->grabNotify (x, y, mods, CompWindowGrabMoveMask | CompWindowGrabButtonMask); /* Shape the window beforehand and avoid a stale grab */ if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); cScreen->damageScreen (); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } } return true; } bool FWScreen::terminateFWRotate (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabWindow && mGrabIndex) { FREEWINS_WINDOW (mGrabWindow); if (fww->mGrab == grabRotate) { int distX, distY; fww->window->ungrabNotify (); switch (optionGetRotationAxis ()) { case RotationAxisClickPoint: case RotationAxisOppositeToClick: distX = (fww->mOutputRect.x1 () + (fww->mOutputRect.width ()) / 2.0f) - (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f); distY = (fww->mOutputRect.y1 () + (fww->mOutputRect.height ()) / 2.0f) - (WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); mGrabWindow->move (distX, distY, true); fww->calculateInputOrigin (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f, WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); fww->calculateOutputOrigin (WIN_OUTPUT_X (mGrabWindow) + WIN_OUTPUT_W (mGrabWindow) / 2.0f, WIN_OUTPUT_Y (mGrabWindow) + WIN_OUTPUT_H (mGrabWindow) / 2.0f); break; default: break; } if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; mGrabWindow = NULL; fww->mGrab = grabNone; } } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return false; } /*static void FWMoveWindowToCorrectPosition (CompWindow *w, float distX, float distY) { FREEWINS_WINDOW (w); action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); fprintf(stderr, "distX is %f distY is %f midX and midY are %f %f\n", distX, distY, fww->mIMidX, fww->mIMidY); moveWindow (w, distX * (1 + (1 - fww->mTransform.scaleX)), distY * (1 + (1 - fww->mTransform.scaleY)), TRUE, FALSE); syncWindowPosition (w); }*/ /* Initiate Scaling */ bool FWScreen::initiateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow* w; CompWindow *useW; Window xid; xid = CompOption::getIntOptionNamed (options, "window", 0); w = screen->findWindow (xid); useW = screen->findWindow (xid); if (w) { foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw) if (w->id () == info->ipw) /* The window we just grabbed was actually * an IPW, get the real window instead */ useW = getRealWindow (w); } if (!screen->otherGrabExist ("freewins", 0)) if (!mGrabIndex) mGrabIndex = screen->pushGrab (screen->cursorCache(XC_fleur), "freewins"); } if (useW) { if (optionGetShapeWindowTypes ().evaluate (useW)) { FREEWINS_WINDOW (useW); int x = CompOption::getIntOptionNamed (options, "x", useW->x () + (useW->width () / 2)); int y = CompOption::getIntOptionNamed (options, "y", useW->y () + (useW->height () / 2)); int mods = CompOption::getIntOptionNamed (options, "modifiers", 0); mGrabWindow = useW; /* Find out the corner we clicked in */ float MidX = fww->mInputRect.centerX (); float MidY = fww->mInputRect.centerY (); /* Check for Y axis clicking (Top / Bottom) */ if (pointerY > MidY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > MidX) fww->mCorner = CornerBottomRight; else if (pointerX < MidX) fww->mCorner = CornerBottomLeft; } else if (pointerY < MidY) { /* Check for X axis clicking (Left / Right) */ if (pointerX > MidX) fww->mCorner = CornerTopRight; else if (pointerX < MidX) fww->mCorner = CornerTopLeft; } switch (optionGetScaleMode ()) { case ScaleModeToCentre: fww->calculateInputOrigin(WIN_REAL_X (useW) + WIN_REAL_W (useW) / 2.0f, WIN_REAL_Y (useW) + WIN_REAL_H (useW) / 2.0f); fww->calculateOutputOrigin(WIN_OUTPUT_X (useW) + WIN_OUTPUT_W (useW) / 2.0f, WIN_OUTPUT_Y (useW) + WIN_OUTPUT_H (useW) / 2.0f); break; /* *Experimental scale to corners mode */ case ScaleModeToOppositeCorner: switch (fww->mCorner) { case CornerBottomRight: /* Translate origin to the top left of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x1 - WIN_REAL_X (useW), fww->inputRect.y1 - WIN_REAL_Y (useW)); fww->calculateInputOrigin (WIN_REAL_X (useW), WIN_REAL_Y (useW)); break; case CornerBottomLeft: /* Translate origin to the top right of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x2 - (WIN_REAL_X (useW) + WIN_REAL_W (useW)), fww->inputRect.y1 - WIN_REAL_Y (useW)); fww->calculateInputOrigin (WIN_REAL_X (useW) + (WIN_REAL_W (useW)), WIN_REAL_Y (useW)); break; case CornerTopRight: /* Translate origin to the bottom left of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x1 - WIN_REAL_X (useW) , fww->inputRect.y1 - (WIN_REAL_Y (useW) + WIN_REAL_H (useW))); fww->calculateInputOrigin (WIN_REAL_X (useW), WIN_REAL_Y (useW) + (WIN_REAL_H (useW))); break; case CornerTopLeft: /* Translate origin to the bottom right of the window */ //FWMoveWindowToCorrectPosition (w, fww->inputRect.x1 -(WIN_REAL_X (useW) + WIN_REAL_W (useW)) , fww->inputRect.y1 - (WIN_REAL_Y (useW) + WIN_REAL_H (useW))); fww->calculateInputOrigin (WIN_REAL_X (useW) + (WIN_REAL_W (useW)), WIN_REAL_Y (useW) + (WIN_REAL_H (useW))); break; } break; } fww->mGrab = grabScale; /* Announce that we grabbed the window */ useW->grabNotify (x, y, mods, CompWindowGrabMoveMask | CompWindowGrabButtonMask); cScreen->damageScreen (); /* Shape the window beforehand and avoid a stale grab */ if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); if (state & CompAction::StateInitButton) action->setState (action->state () | CompAction::StateTermButton); } } return TRUE; } bool FWScreen::terminateFWScale (CompAction *action, CompAction::State state, CompOption::Vector options) { if (mGrabWindow && mGrabIndex) { FREEWINS_WINDOW (mGrabWindow); if (fww->mGrab == grabScale) { fww->window->ungrabNotify (); switch (optionGetScaleMode ()) { int distX, distY; case ScaleModeToOppositeCorner: distX = (fww->mOutputRect.x1 () + (fww->mOutputRect.width () / 2.0f) - (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f)); distY = (fww->mOutputRect.y1 () + (fww->mOutputRect.width () / 2.0f) - (WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f)); mGrabWindow->move (distX, distY, true); fww->calculateInputOrigin (WIN_REAL_X (mGrabWindow) + WIN_REAL_W (mGrabWindow) / 2.0f, WIN_REAL_Y (mGrabWindow) + WIN_REAL_H (mGrabWindow) / 2.0f); fww->calculateOutputOrigin (WIN_OUTPUT_X (mGrabWindow) + WIN_OUTPUT_W (mGrabWindow) / 2.0f, WIN_OUTPUT_Y (mGrabWindow) + WIN_OUTPUT_H (mGrabWindow) / 2.0f); break; default: break; } screen->removeGrab (mGrabIndex, 0); mGrabIndex = 0; mGrabWindow = NULL; fww->mGrab = grabNone; } } action->setState (action->state () & ~(CompAction::StateTermKey | CompAction::StateTermButton)); return FALSE; } /* Repetitive Stuff */ void FWWindow::setPrepareRotation (float dx, float dy, float dz, float dsu, float dsd) { if (FWScreen::get (screen)->optionGetShapeWindowTypes ().evaluate (window)) { calculateInputOrigin (WIN_REAL_X (window) + WIN_REAL_W (window) / 2.0f, WIN_REAL_Y (window) + WIN_REAL_H (window) / 2.0f); calculateOutputOrigin (WIN_OUTPUT_X (window) + WIN_OUTPUT_W (window) / 2.0f, WIN_OUTPUT_Y (window) + WIN_OUTPUT_H (window) / 2.0f); mTransform.unsnapAngX += dy; mTransform.unsnapAngY -= dx; mTransform.unsnapAngZ += dz; mTransform.unsnapScaleX += dsu; mTransform.unsnapScaleY += dsd; mAnimate.oldAngX = mTransform.angX; mAnimate.oldAngY = mTransform.angY; mAnimate.oldAngZ = mTransform.angZ; mAnimate.oldScaleX = mTransform.scaleX; mAnimate.oldScaleY = mTransform.scaleY; mAnimate.destAngX = mTransform.angX + dy; mAnimate.destAngY = mTransform.angY - dx; mAnimate.destAngZ = mTransform.angZ + dz; mAnimate.destScaleX = mTransform.scaleX + dsu; mAnimate.destScaleY = mTransform.scaleY + dsd; } } #define ROTATE_INC freewinsGetRotateIncrementAmount (w->screen) #define NEG_ROTATE_INC freewinsGetRotateIncrementAmount (w->screen) *-1 #define SCALE_INC freewinsGetScaleIncrementAmount (w->screen) #define NEG_SCALE_INC freewinsGetScaleIncrementAmount (w->screen) *-1 bool FWScreen::rotate (CompAction *action, CompAction::State state, CompOption::Vector options, int dx, int dy, int dz) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw == w->id ()) { w = getRealWindow (w); } } FREEWINS_WINDOW (w); fww->setPrepareRotation (dx, dy, dz, 0, 0); if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); return true; } bool FWScreen::scale (CompAction *action, CompAction::State state, CompOption::Vector options, int scale) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw == w->id ()) { w = getRealWindow (w); } } FREEWINS_WINDOW (w); fww->setPrepareRotation (0, 0, 0, scale, scale); fww->cWindow->addDamage (); if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); if (!optionGetAllowNegative ()) { float minScale = optionGetMinScale (); if (fww->mAnimate.destScaleX < minScale) fww->mAnimate.destScaleX = minScale; if (fww->mAnimate.destScaleY < minScale) fww->mAnimate.destScaleY = minScale; } return true; } /* Reset the Rotation and Scale to 0 and 1 */ bool FWScreen::resetFWTransform (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); foreach (FWWindowInputInfo *info, mTransformedWindows) { if (info->ipw == w->id ()) { w = getRealWindow (w); } } if (w) { FREEWINS_WINDOW (w); fww->setPrepareRotation (fww->mTransform.angY, -fww->mTransform.angX, -fww->mTransform.angZ, (1 - fww->mTransform.scaleX), (1 - fww->mTransform.scaleY)); fww->cWindow->addDamage (); fww->mTransformed = FALSE; if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); fww->mResetting = TRUE; } return TRUE; } /* Callable action to rotate a window to the angle provided * x: Set angle to x degrees * y: Set angle to y degrees * z: Set angle to z degrees * window: The window to apply the transformation to */ bool FWScreen::rotateAction (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { FREEWINS_WINDOW (w); float x = CompOption::getFloatOptionNamed(options, "x", 0.0f); float y = CompOption::getFloatOptionNamed(options, "y", 0.0f); float z = CompOption::getFloatOptionNamed(options, "z", 0.0f); fww->setPrepareRotation (x - fww->mAnimate.destAngX, y - fww->mAnimate.destAngY, z - fww->mAnimate.destAngZ, 0, 0); fww->cWindow->addDamage (); } else { return false; } return true; } /* Callable action to increment window rotation by the angles provided * x: Increment angle by x degrees * y: Increment angle by y degrees * z: Increment angle by z degrees * window: The window to apply the transformation to */ bool FWScreen::incrementRotateAction (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { FREEWINS_WINDOW (w); float x = CompOption::getFloatOptionNamed(options, "x", 0.0f); float y = CompOption::getFloatOptionNamed(options, "y", 0.0f); float z = CompOption::getFloatOptionNamed(options, "z", 0.0f); fww->setPrepareRotation (x, y, z, 0, 0); fww->cWindow->addDamage (); } else { return false; } return true; } /* Callable action to scale a window to the scale provided * x: Set scale to x factor * y: Set scale to y factor * window: The window to apply the transformation to */ bool FWScreen::scaleAction (CompAction *action, CompAction::State state, CompOption::Vector options) { CompWindow *w; w = screen->findWindow (CompOption::getIntOptionNamed (options, "window", 0)); if (w) { FREEWINS_WINDOW (w); float x = CompOption::getFloatOptionNamed (options, "x", 0.0f); float y = CompOption::getFloatOptionNamed (options, "y", 0.0f); fww->setPrepareRotation (0, 0, 0, x - fww->mAnimate.destScaleX, y - fww->mAnimate.destScaleY); if (fww->canShape ()) if (fww->handleWindowInputInfo ()) fww->adjustIPW (); /* Stop scale at threshold specified */ if (!optionGetAllowNegative ()) { float minScale = optionGetMinScale (); if (fww->mAnimate.destScaleX < minScale) fww->mAnimate.destScaleX = minScale; if (fww->mAnimate.destScaleY < minScale) fww->mAnimate.destScaleY = minScale; } fww->cWindow->addDamage (); if (fww->canShape ()) fww->handleWindowInputInfo (); } else { return false; } return true; } /* Toggle Axis-Help Display */ bool FWScreen::toggleFWAxis (CompAction *action, CompAction::State state, CompOption::Vector options) { mAxisHelp = !mAxisHelp; cScreen->damageScreen (); return TRUE; } ./include/0000755000004100000410000000000013246301623012666 5ustar www-datawww-data./include/CMakeLists.txt0000644000004100000410000000020213246301623015420 0ustar www-datawww-dataset (_headers decoration.h ) install ( FILES ${_headers} DESTINATION ${includedir}/compiz ) add_subdirectory (core) ./include/core/0000755000004100000410000000000013246301635013621 5ustar www-datawww-data./include/core/size.h0000644000004100000410000000364013246301623014744 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPSIZE_H #define _COMPSIZE_H /** * A 2D size (likely in screen space) that can only be mutated with set() methods, * since it'd data members are private. */ class CompSize { public: CompSize (); CompSize (int, int); int width () const; int height () const; void setWidth (int); void setHeight (int); bool operator== (const CompSize &other) const { return (this->mWidth == other.mWidth && this->mHeight == other.mHeight); } bool operator!= (const CompSize &other) const { return !(*this == other); } private: int mWidth, mHeight; }; inline int CompSize::width () const { return mWidth; } inline int CompSize::height () const { return mHeight; } #endif ./include/core/CMakeLists.txt0000644000004100000410000000066313246301623016363 0ustar www-datawww-dataset (_headers action.h atoms.h configurerequestbuffer.h core.h countedlist.h global.h icon.h logmessage.h match.h modifierhandler.h option.h output.h plugin.h propertywriter.h privateunion.h screen.h session.h size.h string.h templates.h window.h wrapsystem.h abiversion.h ) install (FILES ${_headers} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) ./include/core/logmessage.h0000644000004100000410000000321613246301623016117 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_LOGMESSAGE_H #define _COMPIZ_LOGMESSAGE_H typedef enum { CompLogLevelFatal = 0, CompLogLevelError, CompLogLevelWarn, CompLogLevelInfo, CompLogLevelDebug } CompLogLevel; void logMessage (const char *componentName, CompLogLevel level, const char *message); void compLogMessage (const char *componentName, CompLogLevel level, const char *format, ...); const char * logLevelToString (CompLogLevel level); #endif ./include/core/templates.h0000644000004100000410000000057713246301623015776 0ustar www-datawww-data#ifndef _COMPIZ_TEMPLATES_H #define _COMPIZ_TEMPLATES_H #ifdef __GXX_EXPERIMENTAL_CXX0X__ // Compiz core is built for C++98. If you're not then get your own templates... #define COMPIZ_EXTERN_STD(_c) #else #define COMPIZ_EXTERN_STD(_c) extern template class std::_c; #endif // Non-std templates are unaffected by C++0x #define COMPIZ_EXTERN(_c) extern template class _c; #endif ./include/core/configurerequestbuffer.h0000644000004100000410000000440713246301623020560 0ustar www-datawww-data/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_CONFIGURE_REQUEST_BUFFER_H #define _COMPIZ_CONFIGURE_REQUEST_BUFFER_H #include #include #include namespace compiz { namespace window { namespace configure_buffers { class Releasable { public: virtual ~Releasable () {} typedef boost::shared_ptr Ptr; virtual void release () = 0; }; class Buffer : public SyncServerWindow { public: typedef boost::shared_ptr Ptr; virtual ~Buffer () {} virtual void pushClientRequest (const XWindowChanges &xwc, unsigned int mask) = 0; virtual void pushWrapperRequest (const XWindowChanges &xwc, unsigned int mask) = 0; virtual void pushFrameRequest (const XWindowChanges &xwc, unsigned int mask) = 0; virtual void pushSyntheticConfigureNotify () = 0; virtual Releasable::Ptr obtainLock () = 0; /* This API will all configure requests to be * released. It should only be used in situations * where you have a server grab and need * to have complete sync with the server */ virtual void forceRelease () = 0; }; } } } #endif ./include/core/wrapsystem.h0000644000004100000410000001346313246301623016214 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPWRAPSYSTEM_H_ #define _COMPWRAPSYSTEM_H_ #include #include #include #define WRAPABLE_DEF(func, ...) \ { \ mHandler-> func ## SetEnabled (this, false); \ return mHandler-> func (__VA_ARGS__); \ } #define WRAPABLE_HND(num, itype, rtype, func, ...) \ WRAPABLE_HND_ANY(num, itype, rtype, func,, __VA_ARGS__) #define WRAPABLE_HND_CONST(num, itype, rtype, func, ...) \ WRAPABLE_HND_ANY(num, itype, rtype, func, const, __VA_ARGS__) #define WRAPABLE_HND_ANY(num, itype, rtype, func, cons, ...) \ rtype func (__VA_ARGS__) cons; \ void func ## SetEnabled (cons itype *obj, bool enabled) \ { \ functionSetEnabled ((itype*)obj, num, enabled); \ } \ unsigned int func ## GetCurrentIndex () const \ { \ return mCurrFunction[num]; \ } \ void func ## SetCurrentIndex (unsigned int index) \ { \ mCurrFunction[num] = index; \ } \ enum { func ## Index = num }; // For compatability ignore num and forward #define WRAPABLE_HND_FUNC(num, func, ...) \ WRAPABLE_HND_FUNCTN(func, __VA_ARGS__) // New macro that doesn't need magic number #define WRAPABLE_HND_FUNCTN(func, ...) \ { \ enum { num = func ## Index }; \ unsigned int curr = mCurrFunction[num]; \ while (mCurrFunction[num] < mInterface.size () && \ !mInterface[mCurrFunction[num]].enabled[num]) \ ++mCurrFunction[num]; \ if (mCurrFunction[num] < mInterface.size ()) \ { \ mInterface[mCurrFunction[num]++].obj-> func (__VA_ARGS__); \ mCurrFunction[num] = curr; \ return; \ } \ mCurrFunction[num] = curr; \ } // For compatability ignore num and forward #define WRAPABLE_HND_FUNC_RETURN(num, rtype, func, ...) \ WRAPABLE_HND_FUNCTN_RETURN(rtype, func, __VA_ARGS__) // New macro that doesn't need magic number #define WRAPABLE_HND_FUNCTN_RETURN(rtype, func, ...) \ { \ enum { num = func ## Index }; \ unsigned int curr = mCurrFunction[num]; \ while (mCurrFunction[num] < mInterface.size () && \ !mInterface[mCurrFunction[num]].enabled[num]) \ ++mCurrFunction[num]; \ if (mCurrFunction[num] < mInterface.size ()) \ { \ rtype rv = mInterface[mCurrFunction[num]++].obj-> func (__VA_ARGS__); \ mCurrFunction[num] = curr; \ return rv; \ } \ mCurrFunction[num] = curr; \ } template class WrapableInterface { protected: WrapableInterface () : mHandler (0) {} virtual ~WrapableInterface () { if (mHandler) mHandler->unregisterWrap (static_cast (this)); } void setHandler (T *handler, bool enabled = true) { if (mHandler) mHandler->unregisterWrap (static_cast (this)); if (handler) handler->registerWrap (static_cast (this), enabled); mHandler = handler; } T *mHandler; }; template class WrapableHandler : public T { public: void registerWrap (T *, bool); void unregisterWrap (T *); unsigned int numWrapClients () { return mInterface.size (); } protected: struct Interface { Interface(T *obj, bool enable) : obj(obj) { std::fill_n(this->enabled, N, enable); } T *obj; bool enabled[N]; }; WrapableHandler () : mInterface () { std::fill_n(mCurrFunction, N, 0); } ~WrapableHandler () { mInterface.clear (); } void functionSetEnabled (T *, unsigned int, bool); mutable unsigned int mCurrFunction[N]; std::vector mInterface; }; template void WrapableHandler::registerWrap (T *obj, bool enabled) { mInterface.insert (mInterface.begin (), Interface(obj, enabled)); } template void WrapableHandler::unregisterWrap (T *obj) { typedef typename std::vector::iterator iterator; for (iterator it = mInterface.begin (); it != mInterface.end (); ++it) { if (it->obj == obj) { mInterface.erase (it); break; } } } template void WrapableHandler::functionSetEnabled (T *obj, unsigned int num, bool enabled) { typedef typename std::vector::iterator iterator; for (iterator it = mInterface.begin (); it != mInterface.end (); ++it) { if (it->obj == obj) { it->enabled[num] = enabled; break; } } } #endif ./include/core/window.h0000644000004100000410000004035413246301635015307 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOW_H #define _COMPWINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class CompWindow; class CompIcon; class PrivateWindow; struct CompStartupSequence; namespace compiz { namespace window { namespace configure_buffers { class Releasable; typedef boost::shared_ptr ReleasablePtr; } } namespace private_screen { class Ping; class GrabManager; class OutputDevices; class WindowManager; class StartupSequence; } } #define ROOTPARENT(x) (((x)->frame ()) ? (x)->frame () : (x)->id ()) #define CompWindowProtocolDeleteMask (1 << 0) #define CompWindowProtocolTakeFocusMask (1 << 1) #define CompWindowProtocolPingMask (1 << 2) #define CompWindowProtocolSyncRequestMask (1 << 3) #define CompWindowTypeDesktopMask (1 << 0) #define CompWindowTypeDockMask (1 << 1) #define CompWindowTypeToolbarMask (1 << 2) #define CompWindowTypeMenuMask (1 << 3) #define CompWindowTypeUtilMask (1 << 4) #define CompWindowTypeSplashMask (1 << 5) #define CompWindowTypeDialogMask (1 << 6) #define CompWindowTypeNormalMask (1 << 7) #define CompWindowTypeDropdownMenuMask (1 << 8) #define CompWindowTypePopupMenuMask (1 << 9) #define CompWindowTypeTooltipMask (1 << 10) #define CompWindowTypeNotificationMask (1 << 11) #define CompWindowTypeComboMask (1 << 12) #define CompWindowTypeDndMask (1 << 13) #define CompWindowTypeModalDialogMask (1 << 14) #define CompWindowTypeFullscreenMask (1 << 15) #define CompWindowTypeUnknownMask (1 << 16) #define APPEARS_FOCUSED_MASK (CompWindowTypeDockMask | \ CompWindowTypeSplashMask) #define NO_FOCUS_MASK (CompWindowTypeDesktopMask | \ CompWindowTypeDockMask | \ CompWindowTypeSplashMask) #define CompWindowStateModalMask (1 << 0) #define CompWindowStateStickyMask (1 << 1) #define CompWindowStateMaximizedVertMask (1 << 2) #define CompWindowStateMaximizedHorzMask (1 << 3) #define CompWindowStateShadedMask (1 << 4) #define CompWindowStateSkipTaskbarMask (1 << 5) #define CompWindowStateSkipPagerMask (1 << 6) #define CompWindowStateHiddenMask (1 << 7) #define CompWindowStateFullscreenMask (1 << 8) #define CompWindowStateAboveMask (1 << 9) #define CompWindowStateBelowMask (1 << 10) #define CompWindowStateDemandsAttentionMask (1 << 11) #define CompWindowStateDisplayModalMask (1 << 12) #define CompWindowStateFocusedMask (1 << 13) #define MAXIMIZE_STATE (CompWindowStateMaximizedHorzMask | \ CompWindowStateMaximizedVertMask) #define CompWindowActionMoveMask (1 << 0) #define CompWindowActionResizeMask (1 << 1) #define CompWindowActionStickMask (1 << 2) #define CompWindowActionMinimizeMask (1 << 3) #define CompWindowActionMaximizeHorzMask (1 << 4) #define CompWindowActionMaximizeVertMask (1 << 5) #define CompWindowActionFullscreenMask (1 << 6) #define CompWindowActionCloseMask (1 << 7) #define CompWindowActionShadeMask (1 << 8) #define CompWindowActionChangeDesktopMask (1 << 9) #define CompWindowActionAboveMask (1 << 10) #define CompWindowActionBelowMask (1 << 11) #define MwmFuncAll (1L << 0) #define MwmFuncResize (1L << 1) #define MwmFuncMove (1L << 2) #define MwmFuncIconify (1L << 3) #define MwmFuncMaximize (1L << 4) #define MwmFuncClose (1L << 5) #define MwmDecorHandle (1L << 2) #define MwmDecorTitle (1L << 3) #define MwmDecorMenu (1L << 4) #define MwmDecorMinimize (1L << 5) #define MwmDecorMaximize (1L << 6) #define MwmDecorAll (1L << 0) #define MwmDecorBorder (1L << 1) #define MwmDecorHandle (1L << 2) #define MwmDecorTitle (1L << 3) #define MwmDecorMenu (1L << 4) #define MwmDecorMinimize (1L << 5) #define MwmDecorMaximize (1L << 6) #define WmMoveResizeSizeTopLeft 0 #define WmMoveResizeSizeTop 1 #define WmMoveResizeSizeTopRight 2 #define WmMoveResizeSizeRight 3 #define WmMoveResizeSizeBottomRight 4 #define WmMoveResizeSizeBottom 5 #define WmMoveResizeSizeBottomLeft 6 #define WmMoveResizeSizeLeft 7 #define WmMoveResizeMove 8 #define WmMoveResizeSizeKeyboard 9 #define WmMoveResizeMoveKeyboard 10 #define WmMoveResizeCancel 11 /* EWMH source indication client types */ #define ClientTypeUnknown 0 #define ClientTypeApplication 1 #define ClientTypePager 2 #define CompWindowGrabKeyMask (1 << 0) #define CompWindowGrabButtonMask (1 << 1) #define CompWindowGrabMoveMask (1 << 2) #define CompWindowGrabResizeMask (1 << 3) #define CompWindowGrabExternalAppMask (1 << 4) /** * Enumeration value which represents * how a window will be stacked by compiz */ enum CompStackingUpdateMode { CompStackingUpdateModeNone = 0, CompStackingUpdateModeNormal, CompStackingUpdateModeAboveFullscreen, CompStackingUpdateModeInitialMap, CompStackingUpdateModeInitialMapDeniedFocus }; /** * Enumeration value used by CompWindow::windowNotify * which specifies the type of event that occured. */ enum CompWindowNotify { CompWindowNotifyMap, CompWindowNotifyUnmap, CompWindowNotifyRestack, CompWindowNotifyHide, CompWindowNotifyShow, CompWindowNotifyAliveChanged, CompWindowNotifySyncAlarm, CompWindowNotifyReparent, CompWindowNotifyUnreparent, CompWindowNotifyFrameUpdate, CompWindowNotifyFocusChange, CompWindowNotifyBeforeUnmap, CompWindowNotifyBeforeDestroy, CompWindowNotifyClose, CompWindowNotifyMinimize, CompWindowNotifyUnminimize, CompWindowNotifyShade, CompWindowNotifyUnshade, CompWindowNotifyEnterShowDesktopMode, CompWindowNotifyLeaveShowDesktopMode, CompWindowNotifyBeforeMap, CompWindowNotifyActions, }; /** * Specifies the left, right, top and bottom positions of a window's * geometry */ typedef compiz::window::extents::Extents CompWindowExtents; namespace compiz { namespace window { unsigned int fillStateData (unsigned int state, Atom *data); } } /** * Specifies the area of the screen taken up by strut windows */ struct CompStruts { XRectangle left; XRectangle right; XRectangle top; XRectangle bottom; }; class WindowInterface; extern template class WrapableInterface; /** * Wrappable core window functions. Derive from this class * and overload these functions in order to have your function called * after a core CompWindow function is called with the same name. */ class WindowInterface : public WrapableInterface { public: virtual void getOutputExtents (CompWindowExtents& output); virtual void getAllowedActions (unsigned int &setActions, unsigned int &clearActions); virtual bool focus (); virtual void activate (); virtual bool place (CompPoint &pos); virtual void validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source); virtual void resizeNotify (int dx, int dy, int dwidth, int dheight); virtual void moveNotify (int dx, int dy, bool immediate); virtual void windowNotify (CompWindowNotify n); virtual void grabNotify (int x, int y, unsigned int state, unsigned int mask); virtual void ungrabNotify (); virtual void stateChangeNotify (unsigned int lastState); virtual void updateFrameRegion (CompRegion ®ion); virtual void minimize (); virtual void unminimize (); virtual bool minimized () const; virtual bool alpha () const; virtual bool isFocussable () const; virtual bool managed () const; virtual bool focused () const; }; /** * An Window object that wraps an X window. This handles snychronization of * window state, geometry, etc. between Compiz and the X server. */ class CompWindow : public WrapableHandler, public PluginClassStorage { public: typedef compiz::window::Geometry Geometry; typedef boost::function ForEach; typedef std::map Map; public: CompWindow *next; CompWindow *prev; CompWindow *serverNext; CompWindow *serverPrev; public: ~CompWindow (); /** * Geometry retrieved from the * last ConfigureNotify event received */ const Geometry & geometry () const; int x () const; int y () const; CompPoint pos () const; /* With border */ int width () const; int height () const; CompSize size () const; /** * Geometry last sent to the server */ const Geometry & serverGeometry () const; int serverX () const; int serverY () const; CompPoint serverPos () const; /* With border */ int serverWidth () const; int serverHeight () const; const CompSize serverSize () const; /* effective decoration extents */ CompRect borderRect () const; CompRect serverBorderRect () const; /* frame window geometry */ CompRect inputRect () const; CompRect serverInputRect () const; /* includes decorations and shadows */ CompRect outputRect () const; CompRect serverOutputRect () const; Window id () const; Window frame () const; CompString resName () const; const CompRegion & region () const; const CompRegion & frameRegion () const; void updateFrameRegion (); void setWindowFrameExtents (const CompWindowExtents *border, const CompWindowExtents *frame = NULL); unsigned int & wmType () const; unsigned int type () const; unsigned int & state () const; unsigned int actions () const; unsigned int & protocols () const; void close (Time serverTime); bool inShowDesktopMode () const; void setShowDesktopMode (bool); bool grabbed () const; int pendingMaps () const; unsigned int activeNum () const; int mapNum () const; int & saveMask () const; XWindowChanges & saveWc (); void moveToViewportPosition (int x, int y, bool sync); const char * startupId () const; unsigned int desktop () const; Window clientLeader (bool checkAncestor = false) const; void changeState (unsigned int newState); void recalcActions (); void recalcType (); void updateWindowOutputExtents (); void destroy (); void sendConfigureNotify (); void sendSyncRequest (); XSyncAlarm syncAlarm () const; void map (); void unmap (); void incrementUnmapReference (); void incrementDestroyReference (); bool hasUnmapReference () const; bool resize (XWindowAttributes); bool resize (Geometry); bool resize (int x, int y, int width, int height, int border = 0); void move (int dx, int dy, bool immediate = true); void moveInputFocusTo (); void moveInputFocusToOtherWindow (); /* wraps XConfigureWindow and updates serverGeometry */ void configureXWindow (unsigned int valueMask, XWindowChanges *xwc); void restackAndConfigureXWindow (unsigned int valueMask, XWindowChanges *xwc, const ServerLock &lock); void moveResize (XWindowChanges *xwc, unsigned int xwcm, int gravity, unsigned int source); void raise (); void lower (); void restackAbove (CompWindow *sibling); void restackBelow (CompWindow *sibling); void updateAttributes (CompStackingUpdateMode stackingMode); void hide (); void show (); void maximize (unsigned int state = 0); CompPoint defaultViewport () const; const CompPoint & initialViewport () const; CompIcon * getIcon (int width, int height); const CompRect & iconGeometry () const; int outputDevice () const; void setDesktop (unsigned int desktop); bool onCurrentDesktop () const; bool onAllViewports () const; CompPoint getMovementForOffset (const CompPoint &offset) const; Window transientFor () const; int pendingUnmaps () const; bool placed () const; bool shaded () const; const CompWindowExtents & border () const; const CompWindowExtents & input () const; const CompWindowExtents & output () const; const CompWindowExtents & clientFrame () const; // FIXME: This should return a const reference but grid needs fixing... XSizeHints & sizeHints () const; bool destroyed () const; bool invisible () const; bool syncWait () const; bool alive () const; bool moved () const; bool overrideRedirect () const; bool isMapped () const; bool isViewable () const; int windowClass () const; unsigned int depth () const; unsigned int mwmDecor () const; unsigned int mwmFunc () const; bool constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight); static unsigned int constrainWindowState (unsigned int state, unsigned int actions); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); bool updateStruts (); const CompStruts *struts () const; bool queryAttributes (XWindowAttributes &); bool queryFrameAttributes (XWindowAttributes &); compiz::window::configure_buffers::ReleasablePtr obtainLockOnConfigureRequests (); WRAPABLE_HND (0, WindowInterface, void, getOutputExtents, CompWindowExtents&); WRAPABLE_HND (1, WindowInterface, void, getAllowedActions, unsigned int &, unsigned int &); WRAPABLE_HND (2, WindowInterface, bool, focus); WRAPABLE_HND (3, WindowInterface, void, activate); WRAPABLE_HND (4, WindowInterface, bool, place, CompPoint &); WRAPABLE_HND (5, WindowInterface, void, validateResizeRequest, unsigned int &, XWindowChanges *, unsigned int); WRAPABLE_HND (6, WindowInterface, void, resizeNotify, int, int, int, int); WRAPABLE_HND (7, WindowInterface, void, moveNotify, int, int, bool); WRAPABLE_HND (8, WindowInterface, void, windowNotify, CompWindowNotify); WRAPABLE_HND (9, WindowInterface, void, grabNotify, int, int, unsigned int, unsigned int); WRAPABLE_HND (10, WindowInterface, void, ungrabNotify); WRAPABLE_HND (11, WindowInterface, void, stateChangeNotify, unsigned int); WRAPABLE_HND (12, WindowInterface, void, updateFrameRegion, CompRegion &); WRAPABLE_HND (13, WindowInterface, void, minimize); WRAPABLE_HND (14, WindowInterface, void, unminimize); WRAPABLE_HND_CONST (15, WindowInterface, bool, minimized); WRAPABLE_HND_CONST (16, WindowInterface, bool, alpha); WRAPABLE_HND_CONST (17, WindowInterface, bool, isFocussable); WRAPABLE_HND_CONST (18, WindowInterface, bool, managed); WRAPABLE_HND_CONST (19, WindowInterface, bool, focused); friend class PrivateWindow; friend class CompScreenImpl; friend class PrivateScreen; friend class compiz::private_screen::Ping; friend class compiz::private_screen::GrabManager; friend class compiz::private_screen::OutputDevices; friend class compiz::private_screen::WindowManager; friend class compiz::private_screen::StartupSequence; friend class ModifierHandler; friend class CoreWindow; friend class StackDebugger; private: CompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, PrivateWindow *priv); PrivateWindow *priv; }; #endif ./include/core/action.h0000644000004100000410000001275313246301623015254 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPACTION_H #define _COMPACTION_H #include "core/option.h" #include namespace compiz { namespace actions { void setActionActiveState (const CompAction &action, bool active); } } class PrivateAction; #define CompModAlt 0 #define CompModMeta 1 #define CompModSuper 2 #define CompModHyper 3 #define CompModModeSwitch 4 #define CompModNumLock 5 #define CompModScrollLock 6 #define CompModNum 7 #define CompAltMask (1 << 16) #define CompMetaMask (1 << 17) #define CompSuperMask (1 << 18) #define CompHyperMask (1 << 19) #define CompModeSwitchMask (1 << 20) #define CompNumLockMask (1 << 21) #define CompScrollLockMask (1 << 22) #define CompNoMask (1 << 25) /** * Context of an event occuring. */ class CompAction { public: typedef enum { StateInitKey = 1 << 0, StateTermKey = 1 << 1, StateInitButton = 1 << 2, StateTermButton = 1 << 3, StateInitBell = 1 << 4, StateInitEdge = 1 << 5, StateTermEdge = 1 << 6, StateInitEdgeDnd = 1 << 7, StateTermEdgeDnd = 1 << 8, StateCommit = 1 << 9, StateCancel = 1 << 10, StateAutoGrab = 1 << 11, StateNoEdgeDelay = 1 << 12, StateTermTapped = 1 << 13, StateIgnoreTap = 1 << 14 } StateEnum; /** * Type of event a CompAction is bound to. */ typedef enum { BindingTypeNone = 0, BindingTypeKey = 1 << 0, BindingTypeButton = 1 << 1, BindingTypeEdgeButton = 1 << 2 } BindingTypeEnum; class KeyBinding { public: KeyBinding (); KeyBinding (const KeyBinding&); KeyBinding (int keycode, unsigned int modifiers = 0); unsigned int modifiers () const; int keycode () const; bool fromString (const CompString &str); CompString toString () const; bool operator== (const KeyBinding &k) const; bool operator!= (const KeyBinding &k) const; private: unsigned int mModifiers; int mKeycode; }; class ButtonBinding { public: ButtonBinding (); ButtonBinding (const ButtonBinding&); ButtonBinding (int button, unsigned int modifiers = 0); unsigned int modifiers () const; int button () const; bool fromString (const CompString &str); CompString toString () const; bool operator== (const ButtonBinding &b) const; bool operator!= (const ButtonBinding &b) const; private: unsigned int mModifiers; int mButton; }; typedef unsigned int State; typedef unsigned int BindingType; typedef std::vector Vector; typedef boost::function CallBack; class Container { public: virtual ~Container() {} virtual Vector & getActions () = 0; }; public: CompAction (); CompAction (const CompAction &); ~CompAction (); CallBack initiate () const; CallBack terminate () const; void setInitiate (const CallBack &initiate); void setTerminate (const CallBack &terminate); State state () const; BindingType type () const; KeyBinding & key (); const KeyBinding & key () const; void setKey (const KeyBinding &key); ButtonBinding & button (); const ButtonBinding & button () const; void setButton (const ButtonBinding &button); unsigned int edgeMask () const; void setEdgeMask (unsigned int edge); bool bell () const; void setBell (bool bell); void setState (State state); void copyState (const CompAction &action); bool operator== (const CompAction& val) const; CompAction & operator= (const CompAction &action); bool keyFromString (const CompString &str); bool buttonFromString (const CompString &str); bool edgeMaskFromString (const CompString &str); CompString keyToString () const; CompString buttonToString () const; CompString edgeMaskToString () const; static CompString edgeToString (unsigned int edge); bool active () const; /* CompAction should be a pure virtual class so * that we can pass the interface required to for setActionActiveState * directly rather than using friends */ friend void compiz::actions::setActionActiveState (const CompAction &action, bool active); private: PrivateAction *priv; }; CompAction::Vector & noActions (); #endif ./include/core/match.h0000644000004100000410000000541413246301623015067 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPMATCH_H #define _COMPMATCH_H #include class PrivateMatch; class CompWindow; class CompDisplay; /** * Object which represents a series of window properties * that can be matched in a window. Used for determining which * windows to operate on, in core or in plugins */ class CompMatch { public: /** * TODO */ class Expression { public: virtual ~Expression () {}; virtual bool evaluate (const CompWindow *window) const = 0; }; public: CompMatch (); CompMatch (const CompString); CompMatch (const CompMatch &); ~CompMatch (); static const CompMatch emptyMatch; void update (); /** * Returns true if the specified CompWindow has the properties * specified in the match object */ bool evaluate (const CompWindow *window) const; CompString toString () const; bool isEmpty () const; CompMatch & operator= (const CompMatch &); CompMatch & operator&= (const CompMatch &); CompMatch & operator|= (const CompMatch &); const CompMatch & operator& (const CompMatch &); const CompMatch & operator| (const CompMatch &); const CompMatch & operator! (); CompMatch & operator= (const CompString &); CompMatch & operator&= (const CompString &); CompMatch & operator|= (const CompString &); const CompMatch & operator& (const CompString &); const CompMatch & operator| (const CompString &); bool operator== (const CompMatch &) const; bool operator!= (const CompMatch &) const; private: PrivateMatch *priv; }; #endif ./include/core/option.h0000644000004100000410000001716213246301623015306 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPOPTION_H #define _COMPOPTION_H #include #include #include #include class PrivateOption; class PrivateValue; class PrivateRestriction; class CompAction; class CompMatch; class CompScreenImpl; /** * A configuration option with boolean, int, float, String, Color, Key, Button, * Edge, Bell, or List. */ class CompOption { /** * Option data types */ public: typedef enum { TypeBool, TypeInt, TypeFloat, TypeString, TypeColor, TypeAction, TypeMatch, TypeList, TypeKey, TypeButton, TypeEdge, TypeBell, /* internal use only */ TypeUnset } Type; /** * A value of an Option */ class Value { public: typedef std::vector ColorVector; typedef boost::variant< bool, int, float, CompString, boost::recursive_wrapper, boost::recursive_wrapper, boost::recursive_wrapper, boost::recursive_wrapper > > variant_type; typedef std::vector Vector; public: Value () : mListType(TypeUnset) { } template Value( const T & t ); Value( unsigned short const (&color)[4] ) : mListType(TypeUnset), mValue (ColorVector (color, color + 4)) { } Value( const char *c ) : mListType (TypeUnset), mValue (CompString (c)) { } ~Value(); Type type () const { return static_cast(mValue.which()); } Type listType () const { return mListType; } template void set (const T & t); void set( unsigned short const (&color)[4] ) { mValue = ColorVector (color, color + 4); } void set (const char *c) { mValue = CompString (c); } template const T & get () const; void set (Type t, const Vector & v); bool b () const; int i () const; float f () const; unsigned short* c () const; const CompString & s () const; CompString & s (); const CompMatch & match () const; CompMatch & match (); const CompAction & action () const; CompAction & action (); const Vector & list () const; Vector & list (); bool operator== (const Value & rhs) const; bool operator!= (const Value & rhs) const; private: Type mListType; variant_type mValue; }; /** * TODO */ class Restriction { public: Restriction (); Restriction (const Restriction &); ~Restriction (); int iMin (); int iMax (); float fMin (); float fMax (); float fPrecision (); void set (int, int); void set (float, float, float); bool inRange (int); bool inRange (float); Restriction & operator= (const Restriction &rest); private: PrivateRestriction *priv; }; typedef std::vector Vector; /** * TODO */ class Class { public: virtual ~Class() {} virtual Vector & getOptions () = 0; virtual CompOption * getOption (const CompString &name); virtual bool setOption (const CompString &name, Value &value) = 0; }; public: CompOption (); CompOption (const CompOption &); CompOption (CompString name, Type type); ~CompOption (); void setName (CompString name, Type type); void setName (const char *name, Type type); void reset (); const CompString & name () const; Type type () const; Value & value (); const Value & value () const; Restriction & rest (); bool set (Value &val); bool isAction () const; CompOption & operator= (const CompOption &option); public: static CompOption * findOption (Vector &options, CompString name, unsigned int *index = NULL); static bool getBoolOptionNamed (const Vector& options, const CompString& name, bool defaultValue = false); static int getIntOptionNamed (const Vector& options, const CompString& name, int defaultValue = 0); static float getFloatOptionNamed (const Vector& options, const CompString& name, const float& defaultValue = 0.0); static CompString getStringOptionNamed (const Vector& options, const CompString& name, const CompString& defaultValue = ""); static unsigned short * getColorOptionNamed (const Vector& options, const CompString& name, unsigned short *defaultValue); static CompMatch getMatchOptionNamed (const Vector& options, const CompString& name, const CompMatch& defaultValue); static CompString typeToString (Type type); static bool stringToColor (CompString color, unsigned short *rgba); static CompString colorToString (unsigned short *rgba); static bool setOption (CompOption &o, Value &value); private: PrivateOption *priv; }; COMPIZ_EXTERN_STD(vector) COMPIZ_EXTERN_STD(vector) COMPIZ_EXTERN_STD(vector) namespace compiz { namespace detail { template inline Type const& CompOption_Value_get(CompOption::Value::variant_type const& mValue) { try { return boost::get (mValue); } catch (...) { static Type inst; return inst; } } template<> inline short unsigned int * const& CompOption_Value_get(CompOption::Value::variant_type const& mValue) { try { static short unsigned int * some = 0; CompOption::Value::ColorVector const& tmp(boost::get(mValue)); some = const_cast (&(tmp[0])); return some; } catch (...) { static short unsigned int * none = 0; return none; } } template inline void CompOption_Value_set (CompOption::Value::variant_type & mValue, Type &t) { mValue = t; } template <> inline void CompOption_Value_set (CompOption::Value::variant_type & mValue, unsigned short * &t) { mValue = CompOption::Value::ColorVector (t, t + 4); } } } template inline const T & CompOption::Value::get () const { return compiz::detail::CompOption_Value_get(mValue); } template inline void CompOption::Value::set (const T & t) { return compiz::detail::CompOption_Value_set(mValue, const_cast (t)); } template inline CompOption::Value::Value (const T & t) : mListType (CompOption::TypeUnset) { set (t); } CompOption::Vector & noOptions (); #endif ./include/core/atoms.h0000644000004100000410000001103213246301623015107 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _ATOMS_H #define _ATOMS_H #include namespace Atoms { extern Atom supported; extern Atom supportingWmCheck; extern Atom utf8String; extern Atom wmName; extern Atom winType; extern Atom winTypeDesktop; extern Atom winTypeDock; extern Atom winTypeToolbar; extern Atom winTypeMenu; extern Atom winTypeUtil; extern Atom winTypeSplash; extern Atom winTypeDialog; extern Atom winTypeNormal; extern Atom winTypeDropdownMenu; extern Atom winTypePopupMenu; extern Atom winTypeTooltip; extern Atom winTypeNotification; extern Atom winTypeCombo; extern Atom winTypeDnd; extern Atom winOpacity; extern Atom winBrightness; extern Atom winSaturation; extern Atom winActive; extern Atom winDesktop; extern Atom workarea; extern Atom desktopViewport; extern Atom desktopGeometry; extern Atom currentDesktop; extern Atom numberOfDesktops; extern Atom winState; extern Atom winStateModal; extern Atom winStateSticky; extern Atom winStateMaximizedVert; extern Atom winStateMaximizedHorz; extern Atom winStateShaded; extern Atom winStateSkipTaskbar; extern Atom winStateSkipPager; extern Atom winStateHidden; extern Atom winStateFullscreen; extern Atom winStateAbove; extern Atom winStateBelow; extern Atom winStateDemandsAttention; extern Atom winStateDisplayModal; extern Atom winStateFocused; extern Atom winActionMove; extern Atom winActionResize; extern Atom winActionStick; extern Atom winActionMinimize; extern Atom winActionMaximizeHorz; extern Atom winActionMaximizeVert; extern Atom winActionFullscreen; extern Atom winActionClose; extern Atom winActionShade; extern Atom winActionChangeDesktop; extern Atom winActionAbove; extern Atom winActionBelow; extern Atom wmAllowedActions; extern Atom wmStrut; extern Atom wmStrutPartial; extern Atom wmUserTime; extern Atom wmIcon; extern Atom wmIconGeometry; extern Atom clientList; extern Atom clientListStacking; extern Atom frameExtents; extern Atom frameGtkExtents; extern Atom frameWindow; extern Atom wmState; extern Atom wmChangeState; extern Atom wmProtocols; extern Atom wmClientLeader; extern Atom wmDeleteWindow; extern Atom wmTakeFocus; extern Atom wmPing; extern Atom wmSyncRequest; extern Atom wmSyncRequestCounter; extern Atom wmFullscreenMonitors; extern Atom closeWindow; extern Atom wmMoveResize; extern Atom moveResizeWindow; extern Atom restackWindow; extern Atom showingDesktop; extern Atom xBackground[2]; extern Atom toolkitAction; extern Atom toolkitActionWindowMenu; extern Atom toolkitActionForceQuitDialog; extern Atom mwmHints; extern Atom xdndAware; extern Atom xdndEnter; extern Atom xdndLeave; extern Atom xdndPosition; extern Atom xdndStatus; extern Atom xdndDrop; extern Atom manager; extern Atom targets; extern Atom multiple; extern Atom timestamp; extern Atom version; extern Atom atomPair; extern Atom startupId; extern Atom gnomeRepresentativeColors; void init (Display *dpy); }; #endif ./include/core/core.h0000644000004100000410000000530313246301623014720 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_CORE_H #define _COMPIZ_CORE_H #include "abiversion.h" #include #include #include #include #include #include #include #include #include #include #include #include // X11 Bool defination breaks BOOST_FOREACH. Convert it to a typedef */ #ifdef Bool typedef Bool XBool; #undef Bool typedef XBool Bool; #endif #include #include #include #define foreach BOOST_FOREACH /* * WORDS_BIGENDIAN should be defined before including this file for * IMAGE_BYTE_ORDER and BITMAP_BIT_ORDER to be set correctly. */ #define LSBFirst 0 #define MSBFirst 1 #ifdef WORDS_BIGENDIAN # define IMAGE_BYTE_ORDER MSBFirst # define BITMAP_BIT_ORDER MSBFirst #else # define IMAGE_BYTE_ORDER LSBFirst # define BITMAP_BIT_ORDER LSBFirst #endif #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY (x) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif ./include/core/abiversion.h0000644000004100000410000000031413246301623016126 0ustar www-datawww-data#ifndef COMPIZ_ABIVERSION_H #define COMPIZ_ABIVERSION_H #ifdef CORE_ABIVERSION # error Conflicting definitions of CORE_ABIVERSION #endif #define CORE_ABIVERSION 20180221 #endif // COMPIZ_ABIVERSION_H ./include/core/privateunion.h0000644000004100000410000000254713246301623016522 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_PRIVATEUNION_H #define _COMPIZ_PRIVATEUNION_H union CompPrivate { void *ptr; long val; unsigned long uval; void *(*fptr) (void); }; #endif./include/core/screen.h0000644000004100000410000004131413246301623015251 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPSCREEN_H #define _COMPSCREEN_H #include #include #include #include #include #include #include #include #include #include class CompScreenImpl; class PrivateScreen; class CompManager; class CoreWindow; class CoreOptions; class ServerGrabInterface; typedef std::list CompWindowList; typedef std::vector CompWindowVector; extern bool replaceCurrentWm; extern bool debugOutput; extern bool sendStartupMessage; extern CompScreen *screen; extern ModifierHandler *modHandler; extern int lastPointerX; extern int lastPointerY; extern unsigned int lastPointerMods; extern int pointerX; extern int pointerY; extern unsigned int pointerMods; #define NOTIFY_CREATE_MASK (1 << 0) #define NOTIFY_DELETE_MASK (1 << 1) #define NOTIFY_MOVE_MASK (1 << 2) #define NOTIFY_MODIFY_MASK (1 << 3) #define SCREEN_EDGE_LEFT 0 #define SCREEN_EDGE_RIGHT 1 #define SCREEN_EDGE_TOP 2 #define SCREEN_EDGE_BOTTOM 3 #define SCREEN_EDGE_TOPLEFT 4 #define SCREEN_EDGE_TOPRIGHT 5 #define SCREEN_EDGE_BOTTOMLEFT 6 #define SCREEN_EDGE_BOTTOMRIGHT 7 #define SCREEN_EDGE_NUM 8 typedef boost::function FdWatchCallBack; typedef boost::function FileWatchCallBack; typedef int CompFileWatchHandle; typedef int CompWatchFdHandle; /** * Information needed to invoke a CallBack when a file changes. */ struct CompFileWatch { CompString path; int mask; FileWatchCallBack callBack; CompFileWatchHandle handle; }; typedef std::list CompFileWatchList; #define ACTIVE_WINDOW_HISTORY_SIZE 64 #define ACTIVE_WINDOW_HISTORY_NUM 32 /** * Information about the last activity with a window. */ struct CompActiveWindowHistory { Window id[ACTIVE_WINDOW_HISTORY_SIZE]; int x; int y; int activeNum; }; class ScreenInterface; extern template class WrapableInterface; /** * Interface to an abstract screen. */ class ScreenInterface : public WrapableInterface { public: virtual void fileWatchAdded (CompFileWatch *fw); virtual void fileWatchRemoved (CompFileWatch *fw); virtual bool initPluginForScreen (CompPlugin *p); virtual void finiPluginForScreen (CompPlugin *p); virtual bool setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &v); virtual void sessionEvent (CompSession::Event event, CompOption::Vector &options); virtual void handleEvent (XEvent *event); virtual void handleCompizEvent (const char * plugin, const char *event, CompOption::Vector &options); virtual bool fileToImage (CompString &path, CompSize &size, int &stride, void *&data); virtual bool imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data); virtual CompMatch::Expression *matchInitExp (const CompString& value); virtual void matchExpHandlerChanged (); virtual void matchPropertyChanged (CompWindow *window); virtual void logMessage (const char *componentName, CompLogLevel level, const char *message); virtual void enterShowDesktopMode (); virtual void leaveShowDesktopMode (CompWindow *window); virtual void outputChangeNotify (); virtual void addSupportedAtoms (std::vector& atoms); virtual void cursorChangeNotify (const CompString& theme, int size); virtual void averageColorChangeNotify (const unsigned short *color); }; namespace compiz { namespace private_screen { struct Grab; class EventManager; class Ping; }} namespace compiz { class DesktopWindowCount { public: virtual void incrementDesktopWindowCount() = 0; virtual void incrementOpaqueDesktopWindowCount() = 0; virtual void decrementDesktopWindowCount() = 0; virtual void decrementOpaqueDesktopWindowCount() = 0; virtual int desktopWindowCount() = 0; virtual int opaqueDesktopWindowCount() = 0; protected: ~DesktopWindowCount() {} }; class MapNum { public: virtual unsigned int nextMapNum() = 0; protected: ~MapNum() {} }; class Ping { public: virtual unsigned int lastPing () const = 0; protected: ~Ping() {} }; class XWindowInfo { public: virtual int getWmState (Window id) = 0; virtual void setWmState (int state, Window id) const = 0; virtual void getMwmHints (Window id, unsigned int *func, unsigned int *decor) const = 0; virtual unsigned int getProtocols (Window id) = 0; virtual unsigned int getWindowType (Window id) = 0; virtual unsigned int getWindowState (Window id) = 0; protected: ~XWindowInfo() {} }; class History { public: virtual unsigned int activeNum () const = 0; virtual CompActiveWindowHistory *currentHistory () = 0; protected: ~History() {} }; } class CompScreen : public WrapableHandler, public PluginClassStorage, // TODO should be an interface here public CompSize, public virtual ::compiz::DesktopWindowCount, public virtual ::compiz::MapNum, public virtual ::compiz::Ping, public virtual ::compiz::XWindowInfo, public virtual ::compiz::History, public CompOption::Class // TODO should be an interface here { public: typedef compiz::private_screen::Grab* GrabHandle; WRAPABLE_HND (0, ScreenInterface, void, fileWatchAdded, CompFileWatch *) WRAPABLE_HND (1, ScreenInterface, void, fileWatchRemoved, CompFileWatch *) WRAPABLE_HND (2, ScreenInterface, bool, initPluginForScreen, CompPlugin *) WRAPABLE_HND (3, ScreenInterface, void, finiPluginForScreen, CompPlugin *) WRAPABLE_HND (4, ScreenInterface, bool, setOptionForPlugin, const char *, const char *, CompOption::Value &) WRAPABLE_HND (5, ScreenInterface, void, sessionEvent, CompSession::Event, CompOption::Vector &) WRAPABLE_HND (6, ScreenInterface, void, handleEvent, XEvent *event) WRAPABLE_HND (7, ScreenInterface, void, handleCompizEvent, const char *, const char *, CompOption::Vector &) WRAPABLE_HND (8, ScreenInterface, bool, fileToImage, CompString &, CompSize &, int &, void *&); WRAPABLE_HND (9, ScreenInterface, bool, imageToFile, CompString &, CompString &, CompSize &, int, void *); WRAPABLE_HND (10, ScreenInterface, CompMatch::Expression *, matchInitExp, const CompString&); WRAPABLE_HND (11, ScreenInterface, void, matchExpHandlerChanged) WRAPABLE_HND (12, ScreenInterface, void, matchPropertyChanged, CompWindow *) WRAPABLE_HND (13, ScreenInterface, void, logMessage, const char *, CompLogLevel, const char*) WRAPABLE_HND (14, ScreenInterface, void, enterShowDesktopMode); WRAPABLE_HND (15, ScreenInterface, void, leaveShowDesktopMode, CompWindow *); WRAPABLE_HND (16, ScreenInterface, void, outputChangeNotify); WRAPABLE_HND (17, ScreenInterface, void, addSupportedAtoms, std::vector& atoms); WRAPABLE_HND (18, ScreenInterface, void, cursorChangeNotify, const CompString&, int); WRAPABLE_HND (19, ScreenInterface, void, averageColorChangeNotify, const unsigned short *); unsigned int allocPluginClassIndex (); void freePluginClassIndex (unsigned int index); static int checkForError (Display *dpy); // Interface hoisted from CompScreen virtual bool updateDefaultIcon () = 0; virtual Display * dpy () = 0; virtual Window root () = 0; virtual const CompSize & vpSize () const = 0; virtual void forEachWindow (CompWindow::ForEach) =0; virtual CompWindowList & windows () = 0; virtual void moveViewport (int tx, int ty, bool sync) = 0; virtual const CompPoint & vp () const = 0; virtual void updateWorkarea () = 0; virtual bool addAction (CompAction *action) = 0; virtual CompWindow * findWindow (Window id) = 0; virtual CompWindow * findTopLevelWindow ( Window id, bool override_redirect = false) = 0; virtual void toolkitAction ( Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2) = 0; virtual unsigned int showingDesktopMask() const = 0; virtual bool grabsEmpty() const = 0; virtual void sizePluginClasses(unsigned int size) = 0; virtual CompOutput::vector & outputDevs () = 0; virtual void setWindowState (unsigned int state, Window id) = 0; virtual bool XShape () = 0; virtual std::vector & screenInfo () = 0; virtual CompWindowList & serverWindows () = 0; virtual void setWindowProp (Window id, Atom property, unsigned int value) = 0; virtual Window activeWindow () = 0; virtual unsigned int currentDesktop () = 0; virtual void focusDefaultWindow () = 0; virtual Time getCurrentTime () = 0; virtual unsigned int getWindowProp (Window id, Atom property, unsigned int defaultValue) = 0; virtual void insertServerWindow (CompWindow *w, Window aboveId) = 0; virtual void insertWindow (CompWindow *w, Window aboveId) = 0; virtual unsigned int nDesktop () = 0; virtual int outputDeviceForGeometry (const CompWindow::Geometry& gm) = 0; virtual int screenNum () = 0; virtual void unhookServerWindow (CompWindow *w) = 0; virtual void unhookWindow (CompWindow *w) = 0; virtual void viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport) = 0; virtual void addToDestroyedWindows(CompWindow * cw) = 0; virtual const CompRect & workArea () const = 0; virtual void removeAction (CompAction *action) = 0; virtual CompOption::Vector & getOptions () = 0; virtual bool setOption (const CompString &name, CompOption::Value &value) = 0; virtual void storeValue (CompString key, CompPrivate value) = 0; virtual bool hasValue (CompString key) = 0; virtual CompPrivate getValue (CompString key) = 0; virtual void eraseValue (CompString key) = 0; virtual CompWatchFdHandle addWatchFd (int fd, short int events, FdWatchCallBack callBack) = 0; virtual void removeWatchFd (CompWatchFdHandle handle) = 0; virtual void eventLoop () = 0; virtual CompFileWatchHandle addFileWatch (const char *path, int mask, FileWatchCallBack callBack) = 0; virtual void removeFileWatch (CompFileWatchHandle handle) = 0; virtual const CompFileWatchList& getFileWatches () const = 0; virtual void updateSupportedWmHints () = 0; virtual CompWindowList & destroyedWindows () = 0; virtual const CompRegion & region () const = 0; virtual bool hasOverlappingOutputs () = 0; virtual CompOutput & fullscreenOutput () = 0; virtual void setWindowProp32 (Window id, Atom property, unsigned short value) = 0; virtual unsigned short getWindowProp32 (Window id, Atom property, unsigned short defaultValue) = 0; virtual bool readImageFromFile (CompString &name, CompString &pname, CompSize &size, void *&data) = 0; virtual XWindowAttributes attrib () = 0; virtual CompIcon *defaultIcon () const = 0; virtual bool otherGrabExist (const char *, ...) = 0; virtual GrabHandle pushGrab (Cursor cursor, const char *name) = 0; virtual GrabHandle pushPointerGrab (Cursor cursor, const char *name) = 0; virtual GrabHandle pushKeyboardGrab (const char *name) = 0; virtual void removeGrab (GrabHandle handle, CompPoint *restorePointer) = 0; virtual bool writeImageToFile (CompString &path, const char *format, CompSize &size, void *data) = 0; virtual void runCommand (CompString command) = 0; virtual bool shouldSerializePlugins () = 0; virtual const CompRect & getWorkareaForOutput (unsigned int outputNum) const = 0; virtual CompOutput & currentOutputDev () const = 0; virtual bool grabExist (const char *) = 0; virtual Cursor invisibleCursor () = 0; virtual void sendWindowActivationRequest (Window id) = 0; virtual const CompWindowVector & clientList (bool stackingOrder = true) = 0; virtual int outputDeviceForPoint (const CompPoint &point) = 0; virtual int outputDeviceForPoint (int x, int y) = 0; virtual int xkbEvent () = 0; virtual void warpPointer (int dx, int dy) = 0; virtual void updateGrab (GrabHandle handle, Cursor cursor) = 0; virtual int shapeEvent () = 0; virtual int syncEvent () = 0; virtual Window autoRaiseWindow () = 0; virtual const char * displayString () = 0; virtual CompRect getCurrentOutputExtents () = 0; virtual Cursor normalCursor () = 0; virtual Cursor cursorCache (unsigned int cursorName) = 0; virtual bool grabbed () = 0; virtual SnDisplay * snDisplay () = 0; virtual void processEvents () = 0; virtual void alwaysHandleEvent (XEvent *event) = 0; virtual ServerGrabInterface * serverGrabInterface () = 0; // Replacements for friends accessing priv. They are declared virtual to // ensure the ABI is stable if/when they are moved to CompScreenImpl. // They are only intended for use within compiz-core virtual bool displayInitialised() const = 0; virtual void updatePassiveKeyGrabs () const = 0; virtual void applyStartupProperties (CompWindow *window) = 0; virtual void updateClientList() = 0; virtual CompWindow * getTopWindow() const = 0; virtual CompWindow * getTopServerWindow() const = 0; virtual CoreOptions& getCoreOptions() = 0; virtual Colormap colormap() const = 0; virtual const unsigned short * averageColor() const = 0; virtual void setCurrentDesktop (unsigned int desktop) = 0; virtual Window activeWindow() const = 0; virtual void updatePassiveButtonGrabs(Window serverFrame) = 0; virtual bool grabWindowIsNot(Window w) const = 0; virtual void incrementPendingDestroys() = 0; virtual void setNextActiveWindow(Window id) = 0; virtual Window getNextActiveWindow() const = 0; virtual CompWindow * focusTopMostWindow () = 0; // End of "internal use only" functions protected: CompScreen(); private: // The "wrapable" functions delegate to these (for mocking) virtual bool _initPluginForScreen(CompPlugin *) = 0; virtual void _finiPluginForScreen(CompPlugin *) = 0; virtual bool _setOptionForPlugin(const char *, const char *, CompOption::Value &) = 0; virtual void _handleEvent(XEvent *event) = 0; virtual void _logMessage(const char *, CompLogLevel, const char*) = 0; virtual void _enterShowDesktopMode() = 0; virtual void _leaveShowDesktopMode(CompWindow *) = 0; virtual void _addSupportedAtoms(std::vector& atoms) = 0; virtual void _fileWatchAdded(CompFileWatch *) = 0; virtual void _fileWatchRemoved(CompFileWatch *) = 0; virtual void _sessionEvent(CompSession::Event, CompOption::Vector &) = 0; virtual void _handleCompizEvent(const char *, const char *, CompOption::Vector &) = 0; virtual bool _fileToImage(CompString &, CompSize &, int &, void *&) = 0; virtual bool _imageToFile(CompString &, CompString &, CompSize &, int, void *) = 0; virtual CompMatch::Expression * _matchInitExp(const CompString&) = 0; virtual void _matchExpHandlerChanged() = 0; virtual void _matchPropertyChanged(CompWindow *) = 0; virtual void _outputChangeNotify() = 0; virtual void _cursorChangeNotify(const CompString&, int) = 0; virtual void _averageColorChangeNotify(const unsigned short*) = 0; }; #endif ./include/core/modifierhandler.h0000644000004100000410000000557313246301623017135 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #include /** * Toplevel class which provides access to display * level modifier information */ class ModifierHandler { public: ModifierHandler (); ~ModifierHandler (); typedef enum { Alt = 1, Meta, Super, Hyper, ModeSwitch, NumLock, ScrollLock, ModNum } Modifier; typedef enum { AltMask = (1 << 16), MetaMask = (1 << 17), SuperMask = (1 << 18), HyperMask = (1 << 19), ModeSwitchMask = (1 << 20), NumLockMask = (1 << 21), ScrollLockMask = (1 << 22), NoMask = (1 << 25), } ModMask; public: /** * Takes an X11 Keycode and returns a bitmask * with modifiers that have been pressed */ unsigned int keycodeToModifiers (int keycode); /** * Updates X11 Modifier mappings */ void updateModifierMappings (); /** * Takes a virtual modMask and returns a real modifier mask * by removing unused bits */ unsigned int virtualToRealModMask (unsigned int modMask); /** * Returns a bit modifier mask for a Motifier enum */ unsigned int modMask (Modifier); /** * Returns a const bit modifier mask for what should be ignored */ unsigned int ignoredModMask (); /** * Returns a const XModifierKeymap for compiz */ const XModifierKeymap * modMap (); friend class CompScreenImpl; private: static const unsigned int virtualModMask[7]; static const int maskTable[8]; static const int maskTableSize = 8; ModMask mModMask[ModNum]; unsigned int mIgnoredModMask; XModifierKeymap *mModMap; }; ./include/core/string.h0000644000004100000410000000317713246301623015305 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_STRING_H #define _COMPIZ_STRING_H #include #include #include #include typedef std::string CompString; typedef std::list CompStringList; typedef std::vector CompStringVector; CompString compPrintf (const char *format, ...); CompString compPrintf (const char *format, va_list ap); CompStringVector compGetRegexMatches (const CompString& regexStr, const CompString& string); #endif ./include/core/icon.h0000644000004100000410000000357713246301623014733 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPICON_H #define _COMPICON_H #include #include /** * Wraps an application icon pixel map and it's meta information (such as dimensions) */ class CompIcon : boost::noncopyable { public: CompIcon (unsigned width, unsigned int height); ~CompIcon (); int width () const { return mSize.width(); } int height () const { return mSize.height(); } operator CompSize const&() const { return mSize; } /** * Gets a pointer to the pixel data for this icon. */ unsigned char* data (); private: CompSize mSize; unsigned char *mData; }; #endif ./include/core/plugin.h0000644000004100000410000003011213246301623015262 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_PLUGIN_H #define _COMPIZ_PLUGIN_H #include #include #include #include #include #include class CompScreen; extern CompScreen *screen; #include #define HOME_PLUGINDIR ".compiz-1/plugins" #define COMPIZ_PLUGIN_20090315(name, classname) \ CompPlugin::VTable * name##VTable = NULL; \ extern "C" { \ CompPlugin::VTable * getCompPluginVTable20090315_##name () \ { \ if (!name##VTable) \ { \ name##VTable = new classname (); \ name##VTable->initVTable (TOSTRING (name), &name##VTable);\ return name##VTable; \ } \ else \ return name##VTable; \ } \ } class CompPlugin; class CompWindow; typedef bool (*LoadPluginProc) (CompPlugin *p, const char *path, const char *name); typedef void (*UnloadPluginProc) (CompPlugin *p); typedef CompStringList (*ListPluginsProc) (const char *path); extern LoadPluginProc loaderLoadPlugin; extern UnloadPluginProc loaderUnloadPlugin; extern ListPluginsProc loaderListPlugins; namespace compiz { namespace plugin { namespace internal { class VTableBase; /** * Provide a definition for PluginKey, with a protected * constructor which is a friend of VTableBase */ class PluginKey { protected: PluginKey () {} friend class VTableBase; }; class VTableBase : public PluginKey { public: virtual ~VTableBase () {}; }; } } } /** * Base plug-in interface for Compiz. All plugins must implement this * interface, which provides basics for loading, unloading, options, * and linking together the plugin and Screen(s). */ class CompPlugin { public: class VTable : public compiz::plugin::internal::VTableBase { public: VTable (); virtual ~VTable (); void initVTable (CompString name, CompPlugin::VTable **self = NULL); /** * Gets the name of this compiz plugin */ const CompString &name () const; virtual bool init () = 0; virtual void fini (); /* Mark the plugin as ready to be instantiated */ virtual void markReadyToInstantiate () = 0; /* Mark the plugin as disallowing further instantiation */ virtual void markNoFurtherInstantiation () = 0; virtual bool initScreen (CompScreen *s); virtual void finiScreen (CompScreen *s); virtual bool initWindow (CompWindow *w); virtual void finiWindow (CompWindow *w); virtual CompOption::Vector & getOptions (); virtual bool setOption (const CompString &name, CompOption::Value &value); virtual CompAction::Vector & getActions (); private: CompString mName; VTable **mSelf; }; /** * TODO (or not?) */ template class VTableForScreenAndWindow : public VTable { public: bool initScreen (CompScreen *s); void finiScreen (CompScreen *s); bool initWindow (CompWindow *w); void finiWindow (CompWindow *w); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); CompAction::Vector & getActions (); private: /* Mark the plugin as ready to be instantiated */ void markReadyToInstantiate (); /* Mark the plugin as disallowing further instantiation */ void markNoFurtherInstantiation (); }; /** * TODO (or not?) */ template class VTableForScreen : public VTable { public: bool initScreen (CompScreen *s); void finiScreen (CompScreen *s); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); CompAction::Vector & getActions (); private: /* Mark the plugin as ready to be instantiated */ void markReadyToInstantiate (); /* Mark the plugin as disallowing further instantiation */ void markNoFurtherInstantiation (); }; typedef std::map Map; typedef std::list List; public: CompPrivate devPrivate; CompString devType; VTable *vTable; public: static bool screenInitPlugins (CompScreen *s); static void screenFiniPlugins (CompScreen *s); static bool windowInitPlugins (CompWindow *w); static void windowFiniPlugins (CompWindow *w); /** * Finds a plugin by name. (TODO Does it have to be loaded?) */ static CompPlugin *find (const char *name); /** * Load a compiz plugin. Loading a plugin that has * already been loaded will return the existing instance. */ static CompPlugin *load (const char *plugin); /** * Unload a compiz plugin. Unloading a plugin multiple times has no * effect, and you can't unload a plugin that hasn't been loaded already * with CompPlugin::load() */ static void unload (CompPlugin *p); /** * Adds a plugin onto the working set of active plugins. If the plugin fails to initPlugin * this will return false and the plugin will not be added to the working set. */ static bool push (CompPlugin *p); /** * Removes the last activated plugin with CompPlugin::push() and returns * the removed plugin, or NULL if there was none. */ static CompPlugin *pop (void); /** * Gets a list of the working set of plugins that have been CompPlugin::push() but not * CompPlugin::pop()'d. */ static List & getPlugins (); /** * Gets the Application Binary Interface (ABI) version of a (un)loaded plugin. */ static int getPluginABI (const char *name); /** * Verifies a signature to ensure that the plugin conforms to the Application Binary * Interface (ABI) */ static bool checkPluginABI (const char *name, int abi); }; /** * Mark the plugin class handlers as ready to be initialized */ template void CompPlugin::VTableForScreenAndWindow::markReadyToInstantiate () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef typename T2::ClassPluginBaseType WindowBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; typedef cpi::LoadedPluginClassBridge WindowBridge; ScreenBridge::allowInstantiations (*this); WindowBridge::allowInstantiations (*this); } /** * Allow no further class handler initialization */ template void CompPlugin::VTableForScreenAndWindow::markNoFurtherInstantiation () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef typename T2::ClassPluginBaseType WindowBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; typedef cpi::LoadedPluginClassBridge WindowBridge; ScreenBridge::disallowInstantiations (*this); WindowBridge::disallowInstantiations (*this); } template bool CompPlugin::VTableForScreenAndWindow::initScreen (CompScreen *s) { T * ps = T::get (s); if (!ps) return false; return true; } template void CompPlugin::VTableForScreenAndWindow::finiScreen (CompScreen *s) { T * ps = T::get (s); delete ps; } template bool CompPlugin::VTableForScreenAndWindow::initWindow (CompWindow *w) { T2 * pw = T2::get (w); if (!pw) return false; return true; } template void CompPlugin::VTableForScreenAndWindow::finiWindow (CompWindow *w) { T2 * pw = T2::get (w); delete pw; } template CompOption::Vector & CompPlugin::VTableForScreenAndWindow::getOptions () { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return noOptions (); return oc->getOptions (); } template bool CompPlugin::VTableForScreenAndWindow::setOption (const CompString &name, CompOption::Value &value) { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return false; return oc->setOption (name, value); } template CompAction::Vector & CompPlugin::VTableForScreenAndWindow::getActions () { CompAction::Container *ac = dynamic_cast (T::get (screen)); if (!ac) return noActions (); return ac->getActions (); } /** * Mark the plugin class handlers as ready to be initialized */ template void CompPlugin::VTableForScreen::markReadyToInstantiate () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; ScreenBridge::allowInstantiations (*this); } /** * Allow no further class handler initialization */ template void CompPlugin::VTableForScreen::markNoFurtherInstantiation () { namespace cpi = compiz::plugin::internal; typedef typename T::ClassPluginBaseType ScreenBase; typedef cpi::LoadedPluginClassBridge ScreenBridge; ScreenBridge::disallowInstantiations (*this); } template bool CompPlugin::VTableForScreen::initScreen (CompScreen *s) { T * ps = new T (s); if (ps->loadFailed ()) { delete ps; return false; } return true; } template void CompPlugin::VTableForScreen::finiScreen (CompScreen *s) { T * ps = T::get (s); delete ps; } template CompOption::Vector & CompPlugin::VTableForScreen::getOptions () { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return noOptions (); return oc->getOptions (); } template bool CompPlugin::VTableForScreen::setOption (const CompString &name, CompOption::Value &value) { CompOption::Class *oc = dynamic_cast (T::get (screen)); if (!oc) return false; return oc->setOption (name, value); } template CompAction::Vector & CompPlugin::VTableForScreen::getActions () { CompAction::Container *ac = dynamic_cast (T::get (screen)); if (!ac) return noActions (); return ac->getActions (); } typedef CompPlugin::VTable *(*PluginGetInfoProc) (void); #endif ./include/core/session.h0000644000004100000410000000314113246301623015451 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Radek Doulik */ #ifndef _COMPSESSION_H #define _COMPSESSION_H #define SN_API_NOT_YET_FROZEN #include #include namespace CompSession { enum Event { EventSaveYourself = 0, EventSaveComplete, EventDie, EventShutdownCancelled }; enum ClientIdType { ClientId = 0, PrevClientId }; void init (char *prevClientId); void close (); CompString getClientId (ClientIdType type); }; #endif ./include/core/global.h0000644000004100000410000000272113246301623015231 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _COMPIZ_GLOBAL_H #define _COMPIZ_GLOBAL_H /** * Flag indicating whether to produce debug output */ extern bool debugOutput; extern bool synchronousX; extern char *programName; extern char **programArgv; extern int programArgc; #endif // _COMPIZ_GLOBAL_H ./include/core/propertywriter.h0000644000004100000410000000352113246301623017111 0ustar www-datawww-data/* * Copyright © 2010 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Sam Spilsbury */ #ifndef _COMPPROPERTYWRITER_H #define _COMPPROPERTYWRITER_H #include "core/option.h" #include "core/string.h" #include #include static const CompOption::Vector nilValues; class PropertyWriter { public: PropertyWriter (); PropertyWriter (CompString propName, CompOption::Vector &readTemplate); bool updateProperty (Window, CompOption::Vector &, int); void deleteProperty (Window); const CompOption::Vector & readProperty (Window); void setReadTemplate (const CompOption::Vector &); const CompOption::Vector & getReadTemplate (); private: CompOption::Vector mPropertyValues; Atom mAtom; }; #endif ./include/core/output.h0000644000004100000410000000426513246301623015336 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPOUTPUT_H #define _COMPOUTPUT_H #include "core/rect.h" #include "core/string.h" #include #include /** * Represents a phisically attached screen in Compiz, where this * phisical screen is part of an X11 screen in a configuration such * as Xinerama, XRandR, TwinView or MergedFB */ class CompOutput : public CompRect { public: CompOutput (); CompString name () const; unsigned int id () const; /** * Returns a "working area" of the screen, which the geometry * which is not covered by strut windows (such as panels) */ const CompRect& workArea () const; void setWorkArea (const CompRect&); void setGeometry (int x, int y, int width, int height); void setId (CompString, unsigned int); typedef std::vector vector; typedef std::list ptrList; private: CompString mName; unsigned int mId; CompRect mWorkArea; }; #endif ./include/core/point.h0000644000004100000410000000456513246301623015132 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPPOINT_H #define _COMPPOINT_H /** * A 2D coordinate (likely in screen space) that can only be mutated * through set() methods, since it's data members are private. */ class CompPoint { public: CompPoint (); CompPoint (int, int); /** * Get the x coordinate of this point */ int x () const; /** * Get the y coordinate of this point */ int y () const; /** * Set the x and y coordinate of this point */ void set (int, int); /** * Set the x coordinate of this point */ void setX (int); /** * Set the y coordinate of this point */ void setY (int); bool operator== (const CompPoint &) const; bool operator!= (const CompPoint &) const; /** * Takes from both co-ordinates */ CompPoint & operator-= (const CompPoint &); /** * Adds to both co-ordinates */ CompPoint & operator+= (const CompPoint &); /** * Retuns an added point */ CompPoint operator+ (const CompPoint &) const; /** * Returns a subtracted point */ CompPoint operator- (const CompPoint &) const; private: int mX, mY; }; inline int CompPoint::x () const { return mX; } inline int CompPoint::y () const { return mY; } #endif ./include/core/countedlist.h0000644000004100000410000000577313246301623016340 0ustar www-datawww-data/* * countedlist.h * * Created on: Dec 15, 2009 * Author: erkin */ #ifndef COUNTEDLIST_H_ #define COUNTEDLIST_H_ #include template > class CountedList : protected std::list { public: typedef std::list Base; typedef typename Base::size_type size_type; typedef typename Base::iterator iterator; typedef typename Base::const_iterator const_iterator; typedef typename Base::reverse_iterator reverse_iterator; typedef typename Base::const_reverse_iterator const_reverse_iterator; typedef typename Base::reference reference; typedef typename Base::const_reference const_reference; CountedList () : Base (), mCount (0) { } // Overriden std::list methods bool empty () const { return Base::empty (); } size_type size () const { return mCount; } size_type max_size() const { return Base::max_size(); } iterator begin () { return Base::begin (); } const_iterator begin () const { return Base::begin (); } iterator end () { return Base::end (); } const_iterator end () const { return Base::end (); } reverse_iterator rbegin () { return Base::rbegin (); } const_reverse_iterator rbegin () const { return Base::rbegin (); } reverse_iterator rend () { return Base::rend (); } const_reverse_iterator rend () const { return Base::rend (); } reference front () { return Base::front (); } const_reference front () const { return Base::front (); } reference back () { return Base::back (); } const_reference back () const { return Base::back (); } void reverse () { Base::reverse (); } void sort () { Base::sort (); } template void sort(_StrictWeakOrdering __comp) { Base::sort (__comp); } void resize (size_type __new_size, value_type __x = value_type ()) { mCount = __new_size; Base::resize (__new_size, __x); } void clear () { mCount = 0; Base::clear (); } void push_front (const value_type& __x) { ++mCount; Base::push_front (__x); } void push_back (const value_type& __x) { ++mCount; Base::push_back (__x); } void pop_front () { if (mCount > 0) --mCount; Base::pop_front (); } void pop_back () { if (mCount > 0) --mCount; Base::pop_back (); } iterator insert (iterator __position, const value_type& __x) { ++mCount; return Base::insert (__position, __x); } void insert (iterator __position, size_type __n, const value_type& __x) { mCount += __n; Base::insert (__position, __n, __x); } iterator erase (iterator __position) { if (mCount > 0) --mCount; return Base::erase (__position); } void remove (const value_type& __value) { if (mCount > 0) --mCount; Base::remove (__value); } protected: size_type mCount; }; #endif /* COUNTEDLIST_H_ */ ./include/decoration.h0000644000004100000410000003303613246301623015173 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifndef _DECORATION_H #define _DECORATION_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define DECOR_SUPPORTING_DM_CHECK_ATOM_NAME "_COMPIZ_SUPPORTING_DM_CHECK" #define DECOR_BARE_ATOM_NAME "_COMPIZ_WINDOW_DECOR_BARE" #define DECOR_ACTIVE_ATOM_NAME "_COMPIZ_WINDOW_DECOR_ACTIVE" #define DECOR_WINDOW_ATOM_NAME "_COMPIZ_WINDOW_DECOR" #define DECOR_BLUR_ATOM_NAME "_COMPIZ_WM_WINDOW_BLUR_DECOR" #define DECOR_SWITCH_WINDOW_ATOM_NAME "_COMPIZ_SWITCH_SELECT_WINDOW" #define DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME "_COMPIZ_SWITCH_FOREGROUND_COLOR" #define DECOR_INPUT_FRAME_ATOM_NAME "_COMPIZ_WINDOW_DECOR_INPUT_FRAME" #define DECOR_OUTPUT_FRAME_ATOM_NAME "_COMPIZ_WINDOW_DECOR_OUTPUT_FRAME" #define DECOR_TYPE_ATOM_NAME "_COMPIZ_WINDOW_DECOR_TYPE" #define DECOR_TYPE_PIXMAP_ATOM_NAME "_COMPIZ_WINDOW_DECOR_TYPE_PIXMAP" #define DECOR_TYPE_WINDOW_ATOM_NAME "_COMPIZ_WINDOW_DECOR_TYPE_WINDOW" #define DECOR_REQUEST_PIXMAP_ATOM_NAME "_COMPIZ_DECOR_REQUEST" #define DECOR_PIXMAP_PENDING_ATOM_NAME "_COMPIZ_DECOR_PENDING" #define DECOR_DELETE_PIXMAP_ATOM_NAME "_COMPIZ_DECOR_DELETE_PIXMAP" #define WINDOW_DECORATION_TYPE_PIXMAP (1 << 0) #define WINDOW_DECORATION_TYPE_WINDOW (1 << 1) #define GRAVITY_WEST (1 << 0) #define GRAVITY_EAST (1 << 1) #define GRAVITY_NORTH (1 << 2) #define GRAVITY_SOUTH (1 << 3) #define ALIGN_LEFT (0) #define ALIGN_RIGHT (1 << 0) #define ALIGN_TOP (0) #define ALIGN_BOTTOM (1 << 1) #define CLAMP_HORZ (1 << 0) #define CLAMP_VERT (1 << 1) #define STRETCH_X (1 << 0) #define STRETCH_Y (1 << 1) #define XX_MASK (1 << 16) #define XY_MASK (1 << 17) #define YX_MASK (1 << 18) #define YY_MASK (1 << 19) #define PAD_TOP (1 << 0) #define PAD_BOTTOM (1 << 1) #define PAD_LEFT (1 << 2) #define PAD_RIGHT (1 << 3) #define DECOR_WINDOW_STATE_FOCUS (1 << 0) #define DECOR_WINDOW_STATE_MAXIMIZED_VERT (1 << 1) #define DECOR_WINDOW_STATE_MAXIMIZED_HORZ (1 << 2) #define DECOR_WINDOW_STATE_SHADED (1 << 3) #define DECOR_WINDOW_TYPE_NORMAL (1 << 0) #define DECOR_WINDOW_TYPE_DIALOG (1 << 1) #define DECOR_WINDOW_TYPE_MODAL_DIALOG (1 << 2) #define DECOR_WINDOW_TYPE_MENU (1 << 3) #define DECOR_WINDOW_TYPE_UTILITY (1 << 4) #define DECOR_WINDOW_ACTION_RESIZE_HORZ (1 << 0) #define DECOR_WINDOW_ACTION_RESIZE_VERT (1 << 1) #define DECOR_WINDOW_ACTION_CLOSE (1 << 2) #define DECOR_WINDOW_ACTION_MINIMIZE (1 << 3) #define DECOR_WINDOW_ACTION_UNMINIMIZE (1 << 4) #define DECOR_WINDOW_ACTION_MAXIMIZE_HORZ (1 << 5) #define DECOR_WINDOW_ACTION_MAXIMIZE_VERT (1 << 6) #define DECOR_WINDOW_ACTION_UNMAXIMIZE_HORZ (1 << 7) #define DECOR_WINDOW_ACTION_UNMAXIMIZE_VERT (1 << 8) #define DECOR_WINDOW_ACTION_SHADE (1 << 9) #define DECOR_WINDOW_ACTION_UNSHADE (1 << 10) #define DECOR_WINDOW_ACTION_STICK (1 << 11) #define DECOR_WINDOW_ACTION_UNSTICK (1 << 12) #define DECOR_WINDOW_ACTION_FULLSCREEN (1 << 13) #define DECOR_WINDOW_ACTION_ABOVE (1 << 14) #define DECOR_WINDOW_ACTION_BELOW (1 << 15) #define BORDER_TOP 0 #define BORDER_BOTTOM 1 #define BORDER_LEFT 2 #define BORDER_RIGHT 3 typedef struct _decor_point { int x; int y; int gravity; } decor_point_t; typedef struct _decor_matrix { double xx; double yx; double xy; double yy; double x0; double y0; } decor_matrix_t; typedef struct _decor_quad { decor_point_t p1; decor_point_t p2; int max_width; int max_height; int align; int clamp; int stretch; decor_matrix_t m; } decor_quad_t; typedef struct _decor_extents { int left; int right; int top; int bottom; } decor_extents_t; typedef struct _decor_context { decor_extents_t extents; int left_space; int right_space; int top_space; int bottom_space; int left_corner_space; int right_corner_space; int top_corner_space; int bottom_corner_space; } decor_context_t; typedef struct _decor_box { int x1; int y1; int x2; int y2; int pad; } decor_box_t; typedef struct _decor_layout { int width; int height; decor_box_t left; decor_box_t right; decor_box_t top; decor_box_t bottom; int rotation; } decor_layout_t; typedef struct _decor_shadow_options { double shadow_radius; double shadow_opacity; unsigned short shadow_color[3]; int shadow_offset_x; int shadow_offset_y; } decor_shadow_options_t; typedef struct _decor_shadow { int ref_count; Pixmap pixmap; Picture picture; int width; int height; } decor_shadow_t; typedef void (*decor_draw_func_t) (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *context, void *closure); #define PROP_HEADER_SIZE 3 #define WINDOW_PROP_SIZE 12 #define BASE_PROP_SIZE 22 #define QUAD_PROP_SIZE 9 #define N_QUADS_MAX 24 int decor_version (void); long * decor_alloc_property (unsigned int n, unsigned int type); void decor_quads_to_property (long *data, unsigned int n, Pixmap pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, decor_quad_t *quad, int nQuad, unsigned int frame_state, unsigned int frame_type, unsigned int frame_actions); void decor_gen_window_property (long *data, unsigned int n, decor_extents_t *input, decor_extents_t *max_input, int min_width, int min_height, unsigned int frame_state, unsigned int frame_type, unsigned int frame_actions); int decor_property_get_version (long *data); int decor_property_get_type (long *data); int decor_property_get_num (long *data); int decor_pixmap_property_to_quads (long *data, unsigned int n, int size, Pixmap *pixmap, decor_extents_t *frame_input, decor_extents_t *input, decor_extents_t *frame_max_input, decor_extents_t *max_input, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions, decor_quad_t *quad); int decor_match_pixmap (long *data, int size, Pixmap *pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions, decor_quad_t *quad, unsigned int n_quad); int decor_window_property (long *data, unsigned int n, int size, decor_extents_t *input, decor_extents_t *max_input, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions); void decor_region_to_blur_property (long *data, int threshold, int filter, int width, int height, Region topRegion, int topOffset, Region bottomRegion, int bottomOffset, Region leftRegion, int leftOffset, Region rightRegion, int rightOffset); void decor_apply_gravity (int gravity, int x, int y, int width, int height, int *return_x, int *return_y); int decor_set_vert_quad_row (decor_quad_t *q, int top, int top_corner, int bottom, int bottom_corner, int left, int right, int gravity, int height, int splitY, int splitGravity, double x0, double y0, int rotation); int decor_set_horz_quad_line (decor_quad_t *q, int left, int left_corner, int right, int right_corner, int top, int bottom, int gravity, int width, int splitX, int splitGravity, double x0, double y0); int decor_set_lSrS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l); int decor_set_lSrStSbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l); int decor_set_lSrStXbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int top_stretch_offset); int decor_set_lSrStSbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int bottom_stretch_offset); int decor_set_lXrXtXbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int left_stretch_offset, int right_stretch_offset, int top_stretch_offset, int bottom_stretch_offset); decor_shadow_t * decor_shadow_create (Display *xdisplay, Screen *screen, int width, int height, int left, int right, int top, int bottom, int solid_left, int solid_right, int solid_top, int solid_bottom, decor_shadow_options_t *opt, decor_context_t *context, decor_draw_func_t draw, void *closure); void decor_shadow_destroy (Display *xdisplay, decor_shadow_t *shadow); void decor_shadow_reference (decor_shadow_t *shadow); void decor_shadow (Display *xdisplay, decor_shadow_t *shadow); void decor_draw_simple (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *c, void *closure); void decor_get_default_layout (decor_context_t *c, int width, int height, decor_layout_t *layout); void decor_get_best_layout (decor_context_t *c, int width, int height, decor_layout_t *layout); void decor_fill_picture_extents_with_shadow (Display *xdisplay, decor_shadow_t *shadow, decor_context_t *context, Picture picture, decor_layout_t *layout); void decor_blend_transform_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, Region region, unsigned short alpha, int shade_alpha); void decor_blend_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, unsigned int border, Region region, unsigned short alpha, int shade_alpha, int ignore_src_alpha); #define DECOR_ACQUIRE_STATUS_SUCCESS 0 #define DECOR_ACQUIRE_STATUS_FAILED 1 #define DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING 2 int decor_acquire_dm_session (Display *xdisplay, int screen, const char *name, int replace_current_dm, Time *timestamp); void decor_set_dm_check_hint (Display *xdisplay, int screen, int supports); #define DECOR_SELECTION_KEEP 0 #define DECOR_SELECTION_GIVE_UP 1 int decor_handle_selection_clear (Display *xdisplay, XEvent *xevent, int screen); void decor_handle_selection_request (Display *xdisplay, XEvent *event, Time dm_sn_timestamp); int decor_post_pending (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions); int decor_post_delete_pixmap (Display *xdisplay, Window window, Pixmap pixmap); int decor_post_generate_request (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions); int decor_extents_cmp (const decor_extents_t *a, const decor_extents_t *b); int decor_shadow_options_cmp (const decor_shadow_options_t *a, const decor_shadow_options_t *b); #ifdef __cplusplus } #endif #endif ./scripts/0000755000004100000410000000000013246301624012733 5ustar www-datawww-data./scripts/release.py0000644000004100000410000001352413246301623014731 0ustar www-datawww-data#!/usr/env/python # Usage: release.py VERSION. Creates a new compiz release and bumps VERSION # to the next release # # Copyright (c) Sam Spilsbury # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import sys import os import bzrlib.branch import bzrlib.workingtree import bzrlib.errors as errors from launchpadlib.launchpad import Launchpad import datetime def usage (): print ("release.py VERSION [SINCE]") print ("Make a release and bump version to VERSION") sys.exit (1) if len(sys.argv) < 2: usage () if not "release.py" in os.listdir ("."): print ("Working directory must contain this script") sys.exit (1) editor = "" try: editor = os.environ["EDITOR"] except KeyError: print ("EDITOR must be set") sys.exit (1) if len (editor) == 0: print ("EDITOR must be set") sys.exit (1) bzrlib.initialize () compiz_branch = bzrlib.branch.Branch.open ("..") compiz_branch.lock_read () tags = compiz_branch.tags.get_tag_dict ().items () most_recent_revision = 0 since = None if len (sys.argv) == 3: since = sys.argv[2]; # Find the last tagged revision or the specified tag for tag, revid in tags: try: revision = compiz_branch.revision_id_to_dotted_revno (revid)[0] if since != None: if tag == since: most_recent_revision = revision elif int (revision) > most_recent_revision: most_recent_revision = revision except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno, errors.UnsupportedOperation): pass repo = compiz_branch.repository release_revisions = [] # Find all revisions since that one for revision_id in repo.get_revisions (repo.all_revision_ids ()): try: revno = compiz_branch.revision_id_to_dotted_revno (revision_id.revision_id)[0] if revno > most_recent_revision: release_revisions.append (revision_id) except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno, errors.UnsupportedOperation): pass # Find all fixed bugs in those revisions bugs = [] for rev in release_revisions: for bug in rev.iter_bugs(): bugs.append (bug[0][27:]) bugs = sorted (bugs) # Connect to launchpad lp = Launchpad.login_anonymously ("Compiz Release Script", "production") # Create a pretty looking formatted list of bugs bugs_formatted = [] for bug in bugs: lpBug = lp.bugs[bug] bugTitle = lpBug.title bugTitleWords = bugTitle.split (" ") maximumLineLength = 65 currentLineLength = 0 line = 0 lineParts = [""] for word in bugTitleWords: wordLength = len (word) + 1 if wordLength + currentLineLength > maximumLineLength: lineParts.append ("") line = line + 1 currentLineLength = 0 elif currentLineLength != 0: lineParts[line] += " " currentLineLength += wordLength lineParts[line] += (word) bugs_formatted.append ((bug, lineParts)) # Pretty-print the bugs bugs_formatted_msg = "" for bug, lines in bugs_formatted: whitespace = " " * (12 - len (bug)) bugs_formatted_msg += whitespace + bug + " - " + lines[0] + "\n" if len (lines) > 1: for i in range (1, len (lines)): whitespace = " " * 15 bugs_formatted_msg += whitespace + lines[i] + "\n" # Get the version version_file = open ("../VERSION", "r") version = version_file.readlines ()[0][:-1] version_file.close () # Get the date date = datetime.datetime.now () date_formatted = str(date.year) + "-" + str(date.month) + "-" + str(date.day) # Create release message release_msg = "Release " + version + " (" + date_formatted + " NAME )\n" release_msg += "=" * 77 + "\n\n" release_msg += "Highlights\n\n" release_msg += "Bugs Fixed (https://launchpad.net/compiz/+milestone/" + version + ")\n\n" release_msg += bugs_formatted_msg print release_msg # Edit release message news_update_file = open (".release-script-" + version, "w+") news_update_file.write (release_msg.encode ("utf8")) news_update_file.close () os.system (editor + " .release-script-" + version) # Open NEWS news_file = open ("../NEWS", "r") news_lines = news_file.readlines () news_prepend_file = open (".release-script-" + version, "r") news_prepend_lines = news_prepend_file.readlines () for i in range (0, len (news_prepend_lines)): news_prepend_lines[i] = news_prepend_lines[i].decode ("utf8") news_prepend_lines.append ("\n") for line in news_lines: news_prepend_lines.append (line.decode ("utf8")) news = "" for line in news_prepend_lines: news += line news_file.close () news_prepend_file.close () news_file = open ("../NEWS", "w") news_file.write (news.encode ("utf8")) news_file.close () # Commit compiz_tree = bzrlib.workingtree.WorkingTree.open ("..") compiz_tree.commit ("Release version " + version) # Create a tag compiz_branch.unlock () compiz_branch.lock_write () compiz_branch.tags.set_tag ("v" + version, compiz_branch.last_revision ()) compiz_branch.unlock () # Update version version_file = open ("../VERSION", "w") version_file.write (sys.argv[1] + "\n") version_file.close () # Commit compiz_tree = bzrlib.workingtree.WorkingTree.open ("..") compiz_tree.commit ("Bump VERSION to " + sys.argv[1]) ./scripts/run-with-xvfb.sh0000644000004100000410000000257313246301623016015 0ustar www-datawww-data#!/bin/sh # Usage: /bin/sh run-with-xvfb.sh # # Creates Xvfb instance and runs program in that instance. Shuts down Xvfb when done. if [ $# -ne 1 ]; then echo "Usage /bin/sh run-with-xvfb.sh " exit 1 fi # The script should still pass if you have a real Xserver and no Xvfb if [ ! -z "$DISPLAY" ]; then echo "Note: You are already running an Xserver." $1 else xvfb=`which Xvfb` if [ ! -x "$xvfb" ]; then echo "Error: Xvfb does not seem to be installed." exit 1 fi Xvfb -ac -noreset -screen 0 1024x768x16 -help 2>/dev/null 1>&2 XID=`for id in 101 102 103 104 105 106 107 197 199 211 223 227 293 307 308 309 310 311 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 4703 4721 4723 4729 4733 4751 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 ; do test -e /tmp/.X$id-lock || { echo $id; exit 0; }; done; echo "No Display ports available, quit."; exit 1` { Xvfb -ac -noreset -screen 0 1024x768x16 :$XID -nolisten tcp -auth /dev/null >/dev/null 2>&1 & trap "kill -15 $! " 0 HUP INT QUIT TRAP USR1 PIPE TERM ; } || { echo "Gtk+Tests:ERROR: Failed to start Xvfb environment for X11 target tests."; exit 1; } DISPLAY=:$XID $1 fi ./COPYING.MIT0000644000004100000410000000210513246301623012724 0ustar www-datawww-data Copyright © 2005 Novell, Inc. Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Novell, Inc. not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Novell, Inc. makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE../COPYING0000644000004100000410000000042213246301623012274 0ustar www-datawww-dataMost of the code is MIT licensed, some code is instead licensed under the LGPL and some under the GPL. Each source code file contain a header that describes the license for the code in that specific file. For More information see COPYING.GPL, COPYING.LGPL and COPYING.MIT. ./src/0000755000004100000410000000000013246301635012035 5ustar www-datawww-data./src/CMakeLists.txt0000644000004100000410000001341613246301623014577 0ustar www-datawww-dataset (COMPIZ_MAIN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set (COMPIZ_MAIN_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) include (CompizBcop) add_subdirectory( string ) add_subdirectory( logmessage ) add_subdirectory( timer ) add_subdirectory( pluginclasshandler ) add_subdirectory( point ) add_subdirectory( rect ) add_subdirectory( region ) add_subdirectory( window ) add_subdirectory( servergrab ) IF (COMPIZ_BUILD_TESTING) add_subdirectory( privatescreen/tests ) add_subdirectory( wrapsystem/tests ) add_subdirectory( plugin ) add_subdirectory( option/tests ) add_subdirectory( tests ) ENDIF (COMPIZ_BUILD_TESTING) compiz_add_bcop_targets ( core ${compiz_BINARY_DIR}/generated/core.xml.in _bcop_sources ) get_property (CORE_MOD_INCLUDE_DIRS GLOBAL PROPERTY CORE_MOD_INCLUDE_DIRS) include_directories ( ${compiz_SOURCE_DIR}/include ${compiz_BINARY_DIR} ${compiz_BINARY_DIR}/generated ${COMPIZ_INCLUDE_DIRS} ${CMAKE_PREFIX_PATH}/include ${CMAKE_INCLUDE_PATH} ${CORE_MOD_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} # Module specific include dirs ${CMAKE_CURRENT_SOURCE_DIR}/string/include ${CMAKE_CURRENT_SOURCE_DIR}/string/src ${CMAKE_CURRENT_SOURCE_DIR}/logmessage/include ${CMAKE_CURRENT_SOURCE_DIR}/logmessage/src ${CMAKE_CURRENT_SOURCE_DIR}/timer/include ${CMAKE_CURRENT_SOURCE_DIR}/timer/src ${CMAKE_CURRENT_SOURCE_DIR}/pluginclasshandler/include ${CMAKE_CURRENT_SOURCE_DIR}/pluginclasshandler/src ${CMAKE_CURRENT_SOURCE_DIR}/point/include ${CMAKE_CURRENT_SOURCE_DIR}/point/src ${CMAKE_CURRENT_SOURCE_DIR}/rect/include ${CMAKE_CURRENT_SOURCE_DIR}/rect/src ${CMAKE_CURRENT_SOURCE_DIR}/servergrab/include ${CMAKE_CURRENT_SOURCE_DIR}/servergrab/src ${CMAKE_CURRENT_SOURCE_DIR}/region/include ${CMAKE_CURRENT_SOURCE_DIR}/region/src ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry/include ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry/src ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry-saver/include ${CMAKE_CURRENT_SOURCE_DIR}/window/geometry-saver/src ${CMAKE_CURRENT_SOURCE_DIR}/window/extents/include ${CMAKE_CURRENT_SOURCE_DIR}/window/extents/src ${CMAKE_CURRENT_SOURCE_DIR}/window/constrainment/include ${CMAKE_CURRENT_SOURCE_DIR}/window/constrainment/src ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) get_property (CORE_MOD_LIBRARY_DIRS GLOBAL PROPERTY CORE_MOD_LIBRARY_DIRS) link_directories ( ${COMPIZ_LINK_DIRS} ${CORE_MOD_LIBRARY_DIRS} ${libdir} ) add_library (compiz_core SHARED ${CMAKE_CURRENT_SOURCE_DIR}/global.cpp ${CMAKE_CURRENT_SOURCE_DIR}/atoms.cpp ${CMAKE_CURRENT_SOURCE_DIR}/actions.cpp ${CMAKE_CURRENT_SOURCE_DIR}/screen.cpp ${CMAKE_CURRENT_SOURCE_DIR}/window.cpp ${CMAKE_CURRENT_SOURCE_DIR}/action.cpp ${CMAKE_CURRENT_SOURCE_DIR}/option.cpp ${CMAKE_CURRENT_SOURCE_DIR}/match.cpp ${CMAKE_CURRENT_SOURCE_DIR}/event.cpp ${CMAKE_CURRENT_SOURCE_DIR}/plugin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/session.cpp ${CMAKE_CURRENT_SOURCE_DIR}/windowgeometry.cpp ${CMAKE_CURRENT_SOURCE_DIR}/icon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/modifierhandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/propertywriter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/eventsource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/signalsource.cpp ${CMAKE_CURRENT_SOURCE_DIR}/stackdebugger.cpp ${_bcop_sources} ) add_dependencies (core-options core-xml-file) add_dependencies (compiz_core core-options) # # Normal libraries use the major version number of the library as their # ABI version. But compiz uses funky date numbers for ABI revisions instead. # set (abiversion_h "${compiz_SOURCE_DIR}/include/core/abiversion.h") file (STRINGS ${abiversion_h} abiline REGEX "^#define +CORE_ABIVERSION .+$") string (REGEX REPLACE "#define +CORE_ABIVERSION +" "" abiversion "${abiline}") set_target_properties (compiz_core PROPERTIES VERSION ${VERSION} SOVERSION "ABI-${abiversion}" ) add_executable (compiz ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ) add_library (compiz_size STATIC size.cpp ) add_library (compiz_output STATIC output.cpp ) add_library (compiz_outputdevices STATIC outputdevices.cpp outputdevices_x11.cpp ) add_dependencies (compiz_outputdevices core-options compiz_size compiz_output compiz_rect compiz_region compiz_window_geometry ) add_library (compiz_configurerequestbuffer STATIC configurerequestbuffer.cpp) target_link_libraries (compiz_configurerequestbuffer compiz_window_geometry) # workaround for build race add_dependencies (compiz core-xml-file) get_property (CORE_MOD_LIBRARIES GLOBAL PROPERTY CORE_MOD_LIBRARIES) target_link_libraries ( compiz_core ${COMPIZ_LIBRARIES} m pthread dl -Wl,-whole-archive compiz_size compiz_string compiz_timer compiz_logmessage compiz_pluginclasshandler compiz_point compiz_rect compiz_region compiz_window_geometry compiz_window_geometry_saver compiz_window_extents compiz_window_constrainment compiz_servergrab compiz_output compiz_outputdevices compiz_configurerequestbuffer -Wl,-no-whole-archive # ${CORE_MOD_LIBRARIES} ) # # Tell CMake that targets using compiz_core should NOT re-import the # libraries that compiz_core depends on (contains). # set_target_properties (compiz_core PROPERTIES LINK_INTERFACE_LIBRARIES "" ) target_link_libraries ( compiz compiz_core ) install ( TARGETS compiz_core LIBRARY DESTINATION ${libdir} ) install ( TARGETS compiz RUNTIME DESTINATION ${exec_prefix} ) enable_coverage_report( TARGETS compiz ) ./src/serverwindow.h0000644000004100000410000000000013246301623014727 0ustar www-datawww-data./src/modifierhandler.cpp0000644000004100000410000001152213246301623015673 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman * Sam Spilsbury */ #include #include "privatewindow.h" const unsigned int ModifierHandler::virtualModMask[7] = { CompAltMask, CompMetaMask, CompSuperMask, CompHyperMask, CompModeSwitchMask, CompNumLockMask, CompScrollLockMask }; const int ModifierHandler::maskTable[8] = { ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; unsigned int ModifierHandler::ignoredModMask () { return mIgnoredModMask; } const XModifierKeymap * ModifierHandler::modMap () { return mModMap; } void ModifierHandler::updateModifierMappings () { unsigned int modMask[CompModNum]; int i, minKeycode, maxKeycode, keysymsPerKeycode = 0; KeySym* key; for (i = 0; i < CompModNum; i++) modMask[i] = 0; XDisplayKeycodes (screen->dpy (), &minKeycode, &maxKeycode); key = XGetKeyboardMapping (screen->dpy (), minKeycode, (maxKeycode - minKeycode + 1), &keysymsPerKeycode); if (mModMap) XFreeModifiermap (mModMap); mModMap = XGetModifierMapping (screen->dpy ()); if (mModMap && mModMap->max_keypermod > 0) { KeySym keysym; int index, size, mask; size = maskTableSize * mModMap->max_keypermod; for (i = 0; i < size; i++) { if (!mModMap->modifiermap[i]) continue; index = 0; do { keysym = XKeycodeToKeysym (screen->dpy (), mModMap->modifiermap[i], index++); } while (!keysym && index < keysymsPerKeycode); if (keysym) { mask = maskTable[i / mModMap->max_keypermod]; if (keysym == XK_Alt_L || keysym == XK_Alt_R) { modMask[CompModAlt] |= mask; } else if (keysym == XK_Meta_L || keysym == XK_Meta_R) { modMask[CompModMeta] |= mask; } else if (keysym == XK_Super_L || keysym == XK_Super_R) { modMask[CompModSuper] |= mask; } else if (keysym == XK_Hyper_L || keysym == XK_Hyper_R) { modMask[CompModHyper] |= mask; } else if (keysym == XK_Mode_switch) { modMask[CompModModeSwitch] |= mask; } else if (keysym == XK_Scroll_Lock) { modMask[CompModScrollLock] |= mask; } else if (keysym == XK_Num_Lock) { modMask[CompModNumLock] |= mask; } } } for (i = 0; i < CompModNum; i++) { if (!modMask[i]) modMask[i] = CompNoMask; } if (memcmp (modMask, mModMask, sizeof (modMask))) { memcpy (mModMask, modMask, sizeof (modMask)); mIgnoredModMask = LockMask | (modMask[CompModNumLock] & ~CompNoMask) | (modMask[CompModScrollLock] & ~CompNoMask); screen->updatePassiveKeyGrabs (); foreach (CompWindow *w, screen->windows ()) w->priv->updatePassiveButtonGrabs (); } } if (key) XFree (key); } unsigned int ModifierHandler::virtualToRealModMask (unsigned int modMask) { for (int i = 0; i < CompModNum; i++) { if (modMask & virtualModMask[i]) { modMask &= ~virtualModMask[i]; modMask |= mModMask[i]; } } return modMask; } unsigned int ModifierHandler::keycodeToModifiers (int keycode) { unsigned int mods = 0; int mod, k; for (mod = 0; mod < maskTableSize; mod++) { for (k = 0; k < mModMap->max_keypermod; k++) { if (mModMap->modifiermap[mod * mModMap->max_keypermod + k] == keycode) mods |= maskTable[mod]; } } return mods; } ModifierHandler::ModifierHandler () : mIgnoredModMask (LockMask), mModMap (0) { for (int i = 0; i < ModNum; i++) mModMask[i] = NoMask; } ModifierHandler::~ModifierHandler () { if (mModMap) XFreeModifiermap (mModMap); mModMap = NULL; } ./src/window/0000755000004100000410000000000013246301623013341 5ustar www-datawww-data./src/window/CMakeLists.txt0000644000004100000410000000017213246301623016101 0ustar www-datawww-dataadd_subdirectory (geometry) add_subdirectory (geometry-saver) add_subdirectory (extents) add_subdirectory (constrainment) ./src/window/extents/0000755000004100000410000000000013246301623015033 5ustar www-datawww-data./src/window/extents/CMakeLists.txt0000644000004100000410000000175213246301623017600 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/point/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowextents.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/windowextents.cpp ) ADD_LIBRARY( compiz_window_extents STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_extents PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_window_extents compiz_point ${GLIBMM_LIBRARIES} ) ./src/window/extents/include/0000755000004100000410000000000013246301623016456 5ustar www-datawww-data./src/window/extents/include/core/0000755000004100000410000000000013246301624017407 5ustar www-datawww-data./src/window/extents/include/core/windowextents.h0000644000004100000410000000405113246301623022501 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWEXTENTS_H #define _COMPWINDOWEXTENTS_H #include namespace compiz { namespace window { namespace extents { /** * Specifies the left, right, top and bottom positions of a window's * geometry */ class Extents { public: Extents (); Extents (int left, int right, int top, int bottom); int left; int right; int top; int bottom; bool operator== (const Extents &other) const; bool operator!= (const Extents &other) const; /* Only here for ABI compatability */ bool operator== (const Extents &other); bool operator!= (const Extents &other); }; CompPoint shift (const Extents &extents, unsigned int gravity = 0); } } } typedef compiz::window::extents::Extents CompWindowExtents; #endif ./src/window/extents/src/0000755000004100000410000000000013246301624015623 5ustar www-datawww-data./src/window/extents/src/windowextents.cpp0000644000004100000410000000661113246301623021254 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include CompPoint compiz::window::extents::shift (const CompWindowExtents &extents, unsigned int gravity) { CompPoint rv = CompPoint (); switch (gravity) { /* We treat StaticGravity like NorthWestGravity here * as when decorating / undecorating the window we * really do need to move it in order to handle * any cases where it goes offscreen */ case StaticGravity: case NorthGravity: case NorthWestGravity: case NorthEastGravity: case CenterGravity: rv.setY (extents.top); break; case SouthGravity: case SouthWestGravity: case SouthEastGravity: rv.setY (-extents.bottom); break; default: break; } switch (gravity) { /* We treat StaticGravity like NorthWestGravity here * as when decorating / undecorating the window we * really do need to move it in order to handle * any cases where it goes offscreen */ case StaticGravity: case WestGravity: case NorthWestGravity: case SouthWestGravity: rv.setX (extents.left); break; case EastGravity: case NorthEastGravity: case SouthEastGravity: rv.setX (-extents.right); break; } return rv; } compiz::window::extents::Extents::Extents () : left (0), right (0), top (0), bottom (0) {} compiz::window::extents::Extents::Extents (int left, int right, int top, int bottom) : left (left), right (right), top (top), bottom (bottom) {} /* Just here to keep ABI compatability */ bool compiz::window::extents::Extents::operator== (const Extents &other) { const Extents &self = const_cast (*this); return self == other; } bool compiz::window::extents::Extents::operator== (const Extents &other) const { return this->left == other.left && this->right == other.right && this->top == other.top && this->bottom == other.bottom; } /* Just here to keep ABI compatability */ bool compiz::window::extents::Extents::operator!= (const Extents &other) { const Extents &self = const_cast (*this); return self != other; } bool compiz::window::extents::Extents::operator!= (const Extents &other) const { return !(*this == other); } ./src/window/extents/tests/0000755000004100000410000000000013246301624016176 5ustar www-datawww-data./src/window/extents/tests/CMakeLists.txt0000644000004100000410000000117613246301623020742 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_extents_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-extents.cpp) add_executable (compiz_test_window_extents_shift ${CMAKE_CURRENT_SOURCE_DIR}/shift/src/test-window-extents-shift.cpp) target_link_libraries (compiz_test_window_extents_shift compiz_window_extents_test compiz_window_extents ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_extents_shift COVERAGE compiz_window_extents) ./src/window/extents/tests/test-window-extents.h0000644000004100000410000000270713246301623022330 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_EXTENTS_H #define _COMPIZ_TEST_WINDOW_EXTENTS_H #include #include #include #include class CompWindowExtentsTest : public ::testing::Test { }; #endif ./src/window/extents/tests/test-window-extents.cpp0000644000004100000410000000236113246301623022657 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-extents.h" ./src/window/extents/tests/shift/0000755000004100000410000000000013246301623017312 5ustar www-datawww-data./src/window/extents/tests/shift/src/0000755000004100000410000000000013246301624020102 5ustar www-datawww-data./src/window/extents/tests/shift/src/test-window-extents-shift.cpp0000644000004100000410000000465713246301623025710 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-extents.h" #include #include class CompWindowExtentsTestShift : public CompWindowExtentsTest { protected: compiz::window::extents::Extents e; }; TEST_F(CompWindowExtentsTestShift, TestShift) { CompPoint rp; e.left = 5; e.right = 7; e.top = 10; e.bottom = 7; /* Check each gravity */ rp = compiz::window::extents::shift (e, NorthGravity); EXPECT_EQ (rp, CompPoint (0, e.top)); rp = compiz::window::extents::shift (e, NorthWestGravity); EXPECT_EQ (rp, CompPoint (e.left, e.top)); rp = compiz::window::extents::shift (e, NorthEastGravity); EXPECT_EQ (rp, CompPoint (-e.right, e.top)); rp = compiz::window::extents::shift (e, EastGravity); EXPECT_EQ (rp, CompPoint (-e.right, 0)); rp = compiz::window::extents::shift (e, WestGravity); EXPECT_EQ (rp, CompPoint (e.left, 0)); rp = compiz::window::extents::shift (e, SouthGravity); EXPECT_EQ (rp, CompPoint (0, -e.bottom)); rp = compiz::window::extents::shift (e, SouthWestGravity); EXPECT_EQ (rp, CompPoint (e.left, -e.bottom)); rp = compiz::window::extents::shift (e, SouthEastGravity); EXPECT_EQ (rp, CompPoint (-e.right, -e.bottom)); } ./src/window/constrainment/0000755000004100000410000000000013246301623016225 5ustar www-datawww-data./src/window/constrainment/CMakeLists.txt0000644000004100000410000000230013246301623020760 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry-saver/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowconstrainment.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/windowconstrainment.cpp ) ADD_LIBRARY( compiz_window_constrainment STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_constrainment PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_window_constrainment compiz_window_geometry compiz_point compiz_rect ${GLIBMM_LIBRARIES} ) ./src/window/constrainment/include/0000755000004100000410000000000013246301623017650 5ustar www-datawww-data./src/window/constrainment/include/core/0000755000004100000410000000000013246301624020601 5ustar www-datawww-data./src/window/constrainment/include/core/windowconstrainment.h0000644000004100000410000000344113246301623025067 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWCONSTRAINMENT_H #define _COMPWINDOWCONSTRAINMENT_H #include #include #include #include #include #include namespace compiz { namespace window { namespace constrainment { const unsigned int PVertResizeInc = (1 << 0); const unsigned int PHorzResizeInc = (1 << 1); CompSize constrainToHints (const XSizeHints &hints, const CompSize &size, long ignoreHints, long resizeIgnoreHints); } } } #endif ./src/window/constrainment/src/0000755000004100000410000000000013246301624017015 5ustar www-datawww-data./src/window/constrainment/src/windowconstrainment.cpp0000644000004100000410000001243413246301623023640 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include static inline int constrainmentFloor (int value, int base) { return (value / base) * base; } static inline uint64_t constrainment64Floor (uint64_t value, uint64_t base) { return (value / base) * base; } static inline float constrainmentClamp(float x, float a, float b) { return x < a ? a : (x > b ? b : x); } CompSize compiz::window::constrainment::constrainToHints (const XSizeHints &hints, const CompSize &size, long ignoreHints, long resizeIgnoreHints) { int width = size.width (); int height = size.height (); int min_width = 1; int min_height = 1; int base_width = 1; int base_height = 1; int xinc = 1; int yinc = 1; int max_width = std::numeric_limits ::max (); int max_height = std::numeric_limits ::max (); long flags = hints.flags & ~ignoreHints; long resizeIncFlags = (flags & PResizeInc) ? ((PHorzResizeInc | PVertResizeInc) & ~resizeIgnoreHints) : 0; /* Ater gdk_window_constrain_size(), which is partially borrowed from fvwm. * * Copyright 1993, Robert Nation * You may use this code for any purpose, as long as the original * copyright remains in the source code and all documentation * * which in turn borrows parts of the algorithm from uwm */ if ((flags & PBaseSize) && (flags & PMinSize)) { base_width = std::max (1, hints.base_width); base_height = std::max (1, hints.base_height); min_width = std::max (1, hints.min_width); min_height = std::max (1, hints.min_height); } else if (flags & PBaseSize) { base_width = std::max (1, hints.base_width); base_height = std::max (1, hints.base_height); min_width = std::max (1, hints.base_width); min_height = std::max (1, hints.base_height); } else if (flags & PMinSize) { base_width = std::max (1, hints.min_width); base_height = std::max (1, hints.min_height); min_width = std::max (1, hints.min_width); min_height = std::max (1, hints.min_height); } if (flags & PMaxSize) { max_width = std::max (1, hints.max_width); max_height = std::max (1, hints.max_height); } if (resizeIncFlags & PHorzResizeInc) xinc = std::max (xinc, hints.width_inc); if (resizeIncFlags & PVertResizeInc) yinc = std::max (yinc, hints.height_inc); /* clamp width and height to min and max values */ width = constrainmentClamp (width, min_width, max_width); height = constrainmentClamp (height, min_height, max_height); /* shrink to base + N * inc */ width = base_width + constrainmentFloor (width - base_width, xinc); height = base_height + constrainmentFloor (height - base_height, yinc); /* constrain aspect ratio, according to: * * min_aspect.x width max_aspect.x * ------------ <= -------- <= ----------- * min_aspect.y height max_aspect.y */ if ((flags & PAspect) && hints.min_aspect.y > 0 && hints.max_aspect.x > 0) { /* Use 64 bit arithmetic to prevent overflow */ uint64_t min_aspect_x = hints.min_aspect.x; uint64_t min_aspect_y = hints.min_aspect.y; uint64_t max_aspect_x = hints.max_aspect.x; uint64_t max_aspect_y = hints.max_aspect.y; uint64_t delta; if (min_aspect_x * height > width * min_aspect_y) { delta = constrainment64Floor (height - width * min_aspect_y / min_aspect_x, yinc); if (height - (int) delta >= min_height) height -= delta; else { delta = constrainment64Floor (height * min_aspect_x / min_aspect_y - width, xinc); if (width + (int) delta <= max_width) width += delta; } } if (width * max_aspect_y > max_aspect_x * height) { delta = constrainment64Floor (width - height * max_aspect_x / max_aspect_y, xinc); if (width - (int) delta >= min_width) width -= delta; else { delta = constrainment64Floor (width * min_aspect_y / min_aspect_x - height, yinc); if (height + (int) delta <= max_height) height += delta; } } } return CompSize (width, height); } ./src/window/constrainment/tests/0000755000004100000410000000000013246301624017370 5ustar www-datawww-data./src/window/constrainment/tests/CMakeLists.txt0000644000004100000410000000134713246301623022134 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_constrainment_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-constrainment.cpp) add_executable (compiz_test_window_constrainment_to_hints ${CMAKE_CURRENT_SOURCE_DIR}/to-hints/src/test-window-constrainment-to-hints.cpp ${compiz_SOURCE_DIR}/src/size.cpp) target_link_libraries (compiz_test_window_constrainment_to_hints compiz_window_constrainment_test compiz_window_constrainment ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_constrainment_to_hints COVERAGE compiz_window_constrainment) ./src/window/constrainment/tests/test-window-constrainment.cpp0000644000004100000410000000236713246301623025251 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-constrainment.h" ./src/window/constrainment/tests/test-window-constrainment.h0000644000004100000410000000300013246301623024677 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_CONSTRAINMENT_H #define _COMPIZ_TEST_WINDOW_CONSTRAINMENT_H #include #include #include #include #include class CompWindowConstrainmentTest : public ::testing::Test { }; #endif ./src/window/constrainment/tests/to-hints/0000755000004100000410000000000013246301623021134 5ustar www-datawww-data./src/window/constrainment/tests/to-hints/src/0000755000004100000410000000000013246301624021724 5ustar www-datawww-data./src/window/constrainment/tests/to-hints/src/test-window-constrainment-to-hints.cpp0000644000004100000410000001437513246301623031352 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-constrainment.h" #include class CompWindowConstrainmentTestToHints : public CompWindowConstrainmentTest { }; TEST_F(CompWindowConstrainmentTestToHints, ToHints) { /* No hints, size is the same */ XSizeHints hints; CompSize size (1000, 1000); memset (&hints, 0, sizeof (XSizeHints)); size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1000, 1000)); /* Minimum size specified, constrain to minimum size */ size = CompSize (100, 100); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PMinSize; hints.min_width = 500; hints.min_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Base size specified, constrain to base size as minimum size */ size = CompSize (100, 100); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize; hints.base_width = 500; hints.base_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Minimum and base size specified, constrain to min size as minimum size */ size = CompSize (100, 100); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PMinSize; hints.base_width = 700; hints.base_height = 700; hints.min_width = 500; hints.min_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Maximum size specified, constrain to minimum size */ size = CompSize (1000, 1000); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PMaxSize; hints.max_width = 500; hints.max_height = 500; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (500, 500)); /* Resize flags specified, constrain to closest low step of * increments for size specified */ size = CompSize (1002, 1002); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1000, 1000)); /* Resize flags specified, constrain to closest low step of * increments for size specified */ size = CompSize (1004, 1004); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1000, 1000)); /* Resize flags specified, constrain to closest low step of * increments for size specified */ size = CompSize (1006, 1006); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (1005, 1005)); /* Don't require constrainment on width */ size = CompSize (1002, 1002); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, compiz::window::constrainment::PHorzResizeInc); EXPECT_EQ (size, CompSize (1002, 1000)); /* Don't require constrainment on height */ size = CompSize (1002, 1002); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PBaseSize | PResizeInc; hints.base_width = 500; hints.base_height = 500; hints.width_inc = 5; hints.height_inc = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, compiz::window::constrainment::PVertResizeInc); EXPECT_EQ (size, CompSize (1000, 1002)); /* Aspect ratios - don't allow sizes less than 1:2 or more than 2:5 * clamping to the largest size */ size = CompSize (4000, 5000); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PAspect; hints.min_aspect.x = 1; hints.min_aspect.y = 2; hints.max_aspect.x = 2; hints.max_aspect.y = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (2000, 5000)); /* Aspect ratios - don't allow sizes less than 1:2 or more than 2:5 * clamping to the largest size */ size = CompSize (12, 20); memset (&hints, 0, sizeof (XSizeHints)); hints.flags |= PAspect; hints.min_aspect.x = 1; hints.min_aspect.y = 2; hints.max_aspect.x = 2; hints.max_aspect.y = 5; size = compiz::window::constrainment::constrainToHints (hints, size, 0, 0); EXPECT_EQ (size, CompSize (8, 20)); } ./src/window/geometry-saver/0000755000004100000410000000000013246301623016312 5ustar www-datawww-data./src/window/geometry-saver/CMakeLists.txt0000644000004100000410000000215413246301623021054 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowgeometrysaver.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/geometrysaver.cpp ) ADD_LIBRARY( compiz_window_geometry_saver STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_geometry_saver PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES ( compiz_window_geometry_saver compiz_window_geometry ${GLIBMM_LIBRARIES} ) ./src/window/geometry-saver/include/0000755000004100000410000000000013246301623017735 5ustar www-datawww-data./src/window/geometry-saver/include/core/0000755000004100000410000000000013246301624020666 5ustar www-datawww-data./src/window/geometry-saver/include/core/windowgeometrysaver.h0000644000004100000410000000560213246301623025165 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWGEOMETRYSAVER_H #define _COMPWINDOWGEOMETRYSAVER_H #include #include namespace compiz { namespace window { /** * A one-level push-pop stack for saving window geometry * parameters, eg, to maximize and demaximize windows * and make sure they are restored to the same place * relative to the window */ class GeometrySaver { public: GeometrySaver (const Geometry &g); /** * Push some new geometry into the saved bits * * @param g a const compiz::window::Geometry & of the geometry * you wish to push * @param mask an unsigned int indicating which bits of the * specified geometry should be saved * @return the bits actually saved */ unsigned int push (const Geometry &g, unsigned int mask); /** * Restore saved geometry * * @param g a compiz::window::Geometry & of the geometry * which should be written into * @param mask an unsigned int indicating which bits of the * geometry should be restored * @return the bits actually restored */ unsigned int pop (Geometry &g, unsigned int mask); /** * Force update certain saved geometry bits * * @param g a const compiz::window::Geometry & of the geometry * you wish to update * @param mask an unsigned int indicating which bits of the * specified geometry should be updated */ void update (const Geometry &g, unsigned int mask); unsigned int get (Geometry &g); private: Geometry mGeometry; unsigned int mMask; }; } } #endif ./src/window/geometry-saver/src/0000755000004100000410000000000013246301623017101 5ustar www-datawww-data./src/window/geometry-saver/src/geometrysaver.cpp0000644000004100000410000000442313246301623022504 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include compiz::window::GeometrySaver::GeometrySaver (const Geometry &g) : mGeometry (g), mMask (0) { } unsigned int compiz::window::GeometrySaver::push (const Geometry &g, unsigned int mask) { /* Don't allow overwriting of any already set geometry */ unsigned int useMask = mask & ~mMask; mMask |= useMask; mGeometry.applyChange (g, useMask); return useMask; } unsigned int compiz::window::GeometrySaver::pop (Geometry &g, unsigned int mask) { unsigned int restoreMask = mask & mMask; mMask &= ~restoreMask; g.applyChange (mGeometry, restoreMask); return restoreMask; } void compiz::window::GeometrySaver::update (const Geometry &g, unsigned int mask) { /* By default, only update bits that have not been saved */ unsigned int updateMask = ~mMask; /* But also update bits that we are forcing an update on */ updateMask |= mask; mGeometry.applyChange (g, updateMask); } unsigned int compiz::window::GeometrySaver::get (Geometry &g) { g = mGeometry; return mMask; } ./src/window/geometry-saver/tests/0000755000004100000410000000000013246301624017455 5ustar www-datawww-data./src/window/geometry-saver/tests/CMakeLists.txt0000644000004100000410000000126513246301623022220 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_geometry_saver_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-geometry-saver.cpp) add_executable (compiz_test_window_geometry_saver ${CMAKE_CURRENT_SOURCE_DIR}/window-geometry-saver/src/test-window-geometry-saver.cpp) target_link_libraries (compiz_test_window_geometry_saver compiz_window_geometry_saver_test compiz_window_geometry_saver ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_geometry_saver COVERAGE compiz_window_geometry_saver) ./src/window/geometry-saver/tests/test-window-geometry-saver.h0000644000004100000410000000274713246301623025072 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_GEOMETRY_H #define _COMPIZ_TEST_WINDOW_GEOMETRY_H #include #include #include #include #include class CompWindowGeometryTest : public ::testing::Test { }; #endif ./src/window/geometry-saver/tests/test-window-geometry-saver.cpp0000644000004100000410000000237013246301623025415 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry-saver.h" ./src/window/geometry-saver/tests/window-geometry-saver/0000755000004100000410000000000013246301623023732 5ustar www-datawww-data./src/window/geometry-saver/tests/window-geometry-saver/src/0000755000004100000410000000000013246301624024522 5ustar www-datawww-data./src/window/geometry-saver/tests/window-geometry-saver/src/test-window-geometry-saver.cpp0000644000004100000410000000712113246301623032461 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry-saver.h" class CompWindowGeometryTestSaver : public CompWindowGeometryTest { public: CompWindowGeometryTestSaver (); virtual ~CompWindowGeometryTestSaver (); protected: compiz::window::Geometry g; compiz::window::GeometrySaver saver; }; CompWindowGeometryTestSaver::CompWindowGeometryTestSaver () : g (100, 100, 300, 300, 5), saver (g) { } CompWindowGeometryTestSaver::~CompWindowGeometryTestSaver () { } TEST_F(CompWindowGeometryTestSaver, TestSaver) { /* g by default */ compiz::window::Geometry rg; unsigned int mask = saver.get (rg); EXPECT_EQ (mask, 0); EXPECT_EQ (rg, compiz::window::Geometry (100, 100, 300, 300, 5)); /* Push X value on to the saved geometry */ saver.push (g, CHANGE_X); mask = saver.get (rg); EXPECT_EQ (mask, CHANGE_X); EXPECT_EQ (rg, compiz::window::Geometry (100, 100, 300, 300, 5)); /* Push Y and Width values on to the saved geometry */ saver.push (g, CHANGE_Y | CHANGE_WIDTH); mask = saver.get (rg); EXPECT_EQ (mask, CHANGE_X | CHANGE_Y | CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (100, 100, 300, 300, 5)); /* Pop Y value off the saved geoemtry */ rg = compiz::window::Geometry (); mask = saver.pop (rg, CHANGE_Y); EXPECT_EQ (mask, CHANGE_Y); EXPECT_EQ (rg, compiz::window::Geometry (0, 100, 0, 0, 0)); /* Attempt to pop X Y and Height off the saved geometry, * but since Y is not saved, only expect X */ rg = compiz::window::Geometry (); mask = saver.pop (rg, CHANGE_X | CHANGE_Y | CHANGE_HEIGHT); EXPECT_EQ (mask, CHANGE_X); EXPECT_EQ (rg, compiz::window::Geometry (100, 0, 0, 0, 0)); /* Update the saved geometry (eg, workspace change) and * pop the new value off */ rg = compiz::window::Geometry (); g.setWidth (1200); saver.update (g, CHANGE_WIDTH); mask = saver.pop (rg, CHANGE_WIDTH); EXPECT_EQ (mask, CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 1200, 0, 0)); /* Try to push twice, only allow the first value to be popped off */ rg = compiz::window::Geometry (); g.setWidth (1000); saver.push (g, CHANGE_WIDTH); g.setWidth (1200); saver.push (g, CHANGE_WIDTH); mask = saver.pop (rg, CHANGE_WIDTH); EXPECT_EQ (mask, CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 1000, 0, 0)); } ./src/window/geometry/0000755000004100000410000000000013246301623015174 5ustar www-datawww-data./src/window/geometry/CMakeLists.txt0000644000004100000410000000204013246301623017730 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/rect/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/windowgeometry.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/windowgeometry.cpp ) ADD_LIBRARY( compiz_window_geometry STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_window_geometry PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_window_geometry compiz_point compiz_rect ${GLIBMM_LIBRARIES} ) ./src/window/geometry/include/0000755000004100000410000000000013246301623016617 5ustar www-datawww-data./src/window/geometry/include/core/0000755000004100000410000000000013246301624017550 5ustar www-datawww-data./src/window/geometry/include/core/windowgeometry.h0000644000004100000410000000474313246301623023013 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _COMPWINDOWGEOMETRY_H #define _COMPWINDOWGEOMETRY_H #include enum ChangeMask { CHANGE_X = 1 << 0, CHANGE_Y = 1 << 1, CHANGE_WIDTH = 1 << 2, CHANGE_HEIGHT = 1 << 3, CHANGE_BORDER = 1 << 4 }; namespace compiz { namespace window { /** * A mutable object about the dimensions and location of a CompWindow. */ class Geometry : public CompRect { public: Geometry (); Geometry (int x, int y, int width, int height, int border); int border () const; void set (int x, int y, int width, int height, int border); void setBorder (int border); unsigned int changeMask (const compiz::window::Geometry &g) const; compiz::window::Geometry change (const compiz::window::Geometry &g, unsigned int mask) const; void applyChange (const compiz::window::Geometry &g, unsigned int mask); int xMinusBorder () const { return x () - mBorder; } int yMinusBorder () const { return y () - mBorder; } unsigned int widthIncBorders () const { return width () + mBorder * 2; } unsigned int heightIncBorders () const { return height () + mBorder * 2; } private: int mBorder; }; } } #endif ./src/window/geometry/src/0000755000004100000410000000000013246301624015764 5ustar www-datawww-data./src/window/geometry/src/windowgeometry.cpp0000644000004100000410000000541013246301623021552 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include compiz::window::Geometry::Geometry () : mBorder (0) { } compiz::window::Geometry::Geometry (int x, int y, int width, int height, int border) : CompRect (x, y, width, height), mBorder (border) { } int compiz::window::Geometry::border () const { return mBorder; } void compiz::window::Geometry::setBorder (int border) { mBorder = border; } void compiz::window::Geometry::set (int x, int y, int width, int height, int border) { setX (x); setY (y); setWidth (width); setHeight (height); mBorder = border; } unsigned int compiz::window::Geometry::changeMask (const compiz::window::Geometry &g) const { unsigned int mask = 0; if (g.x () != x ()) mask |= CHANGE_X; if (g.y () != y ()) mask |= CHANGE_Y; if (g.width () != width ()) mask |= CHANGE_WIDTH; if (g.height () != height ()) mask |= CHANGE_HEIGHT; if (g.border () != border ()) mask |= CHANGE_BORDER; return mask; } compiz::window::Geometry compiz::window::Geometry::change (const compiz::window::Geometry &g, unsigned int mask) const { compiz::window::Geometry rg = *this; rg.applyChange (g, mask); return rg; } void compiz::window::Geometry::applyChange (const compiz::window::Geometry &g, unsigned int mask) { if (mask & CHANGE_X) setX (g.x ()); if (mask & CHANGE_Y) setY (g.y ()); if (mask & CHANGE_WIDTH) setWidth (g.width ()); if (mask & CHANGE_HEIGHT) setHeight (g.height ()); if (mask & CHANGE_BORDER) setBorder (g.border ()); } ./src/window/geometry/tests/0000755000004100000410000000000013246301624016337 5ustar www-datawww-data./src/window/geometry/tests/CMakeLists.txt0000644000004100000410000000117113246301623021076 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_window_geometry_test ${CMAKE_CURRENT_SOURCE_DIR}/test-window-geometry.cpp) add_executable (compiz_test_window_geometry ${CMAKE_CURRENT_SOURCE_DIR}/window-geometry/src/test-window-geometry.cpp) target_link_libraries (compiz_test_window_geometry compiz_window_geometry_test compiz_window_geometry ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_window_geometry COVERAGE compiz_window_geometry) ./src/window/geometry/tests/test-window-geometry.h0000644000004100000410000000274213246301623022631 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_GEOMETRY_H #define _COMPIZ_TEST_WINDOW_GEOMETRY_H #include #include #include #include #include class CompWindowGeometryTest : public ::testing::Test { }; #endif ./src/window/geometry/tests/test-window-geometry.cpp0000644000004100000410000000236213246301623023162 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry.h" ./src/window/geometry/tests/window-geometry/0000755000004100000410000000000013246301623021476 5ustar www-datawww-data./src/window/geometry/tests/window-geometry/src/0000755000004100000410000000000013246301624022266 5ustar www-datawww-data./src/window/geometry/tests/window-geometry/src/test-window-geometry.cpp0000644000004100000410000000611113246301623027105 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-window-geometry.h" class CompWindowGeometryTestGeometry : public CompWindowGeometryTest { public: CompWindowGeometryTestGeometry (); ~CompWindowGeometryTestGeometry (); protected: compiz::window::Geometry g; }; CompWindowGeometryTestGeometry::CompWindowGeometryTestGeometry () : g (50, 100, 200, 300, 5) { } CompWindowGeometryTestGeometry::~CompWindowGeometryTestGeometry () { } TEST_F(CompWindowGeometryTestGeometry, TestGeometry) { /* apply x only */ compiz::window::Geometry rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_X); EXPECT_EQ (rg, compiz::window::Geometry (50, 0, 0, 0, 0)); /* apply y only */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_Y); EXPECT_EQ (rg, compiz::window::Geometry (0, 100, 0, 0, 0)); /* apply width only */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_WIDTH); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 200, 0, 0)); /* apply height only */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_HEIGHT); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 0, 300, 0)); /* apply width | height */ rg = compiz::window::Geometry (); rg.applyChange (g, CHANGE_WIDTH | CHANGE_HEIGHT); EXPECT_EQ (rg, compiz::window::Geometry (0, 0, 200, 300, 0)); /* change mask for x | y | width | height */ rg = compiz::window::Geometry (49, 99, 199, 299, 5); unsigned int mask = rg.changeMask (g); EXPECT_EQ (rg, compiz::window::Geometry (49, 99, 199, 299, 5)); EXPECT_EQ (mask, CHANGE_X | CHANGE_Y | CHANGE_WIDTH | CHANGE_HEIGHT); } TEST_F(CompWindowGeometryTestGeometry, TestBorders) { compiz::window::Geometry g (1, 1, 1, 1, 1); EXPECT_EQ (g.xMinusBorder (), 0); EXPECT_EQ (g.yMinusBorder (), 0); EXPECT_EQ (g.widthIncBorders (), 3); EXPECT_EQ (g.heightIncBorders (), 3); } ./src/window.cpp0000644000004100000410000054177713246301635014075 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "core/windowconstrainment.h" #include "privatewindow.h" #include "privatescreen.h" #include "privatestackdebugger.h" #include "configurerequestbuffer-impl.h" #include namespace crb = compiz::window::configure_buffers; namespace cw = compiz::window; template class WrapableInterface; PluginClassStorage::Indices windowPluginClassIndices (0); unsigned int CompWindow::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (windowPluginClassIndices); foreach (CompWindow *w, screen->windows ()) if (windowPluginClassIndices.size () != w->pluginClasses.size ()) w->pluginClasses.resize (windowPluginClassIndices.size ()); return i; } void CompWindow::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (windowPluginClassIndices, index); foreach (CompWindow *w, ::screen->windows ()) if (windowPluginClassIndices.size () != w->pluginClasses.size ()) w->pluginClasses.resize (windowPluginClassIndices.size ()); } inline bool PrivateWindow::isInvisible() const { return attrib.map_state != IsViewable || attrib.x + geometry.width () + output.right <= 0 || attrib.y + geometry.height () + output.bottom <= 0 || attrib.x - output.left >= (int) screen->width () || attrib.y - output.top >= (int) screen->height (); } bool PrivateWindow::isAncestorTo (CompWindow *transient, CompWindow *ancestor) { if (transient->priv->transientFor) { if (transient->priv->transientFor == ancestor->priv->id) return true; transient = screen->findWindow (transient->priv->transientFor); if (transient) return isAncestorTo (transient, ancestor); } return false; } void PrivateWindow::recalcNormalHints () { /* FIXME to max Texture size */ int maxSize = MAXSHORT; maxSize -= serverGeometry.border () * 2; sizeHints.x = serverGeometry.x (); sizeHints.y = serverGeometry.y (); sizeHints.width = serverGeometry.width (); sizeHints.height = serverGeometry.height (); if (!(sizeHints.flags & PBaseSize)) { if (sizeHints.flags & PMinSize) { sizeHints.base_width = sizeHints.min_width; sizeHints.base_height = sizeHints.min_height; } else { sizeHints.base_width = 0; sizeHints.base_height = 0; } sizeHints.flags |= PBaseSize; } if (!(sizeHints.flags & PMinSize)) { sizeHints.min_width = sizeHints.base_width; sizeHints.min_height = sizeHints.base_height; sizeHints.flags |= PMinSize; } if (!(sizeHints.flags & PMaxSize)) { sizeHints.max_width = 65535; sizeHints.max_height = 65535; sizeHints.flags |= PMaxSize; } if (sizeHints.max_width < sizeHints.min_width) sizeHints.max_width = sizeHints.min_width; if (sizeHints.max_height < sizeHints.min_height) sizeHints.max_height = sizeHints.min_height; if (sizeHints.min_width < 1) sizeHints.min_width = 1; if (sizeHints.max_width < 1) sizeHints.max_width = 1; if (sizeHints.min_height < 1) sizeHints.min_height = 1; if (sizeHints.max_height < 1) sizeHints.max_height = 1; if (sizeHints.max_width > maxSize) sizeHints.max_width = maxSize; if (sizeHints.max_height > maxSize) sizeHints.max_height = maxSize; if (sizeHints.min_width > maxSize) sizeHints.min_width = maxSize; if (sizeHints.min_height > maxSize) sizeHints.min_height = maxSize; if (sizeHints.base_width > maxSize) sizeHints.base_width = maxSize; if (sizeHints.base_height > maxSize) sizeHints.base_height = maxSize; if (sizeHints.flags & PResizeInc) { if (sizeHints.width_inc == 0) sizeHints.width_inc = 1; if (sizeHints.height_inc == 0) sizeHints.height_inc = 1; } else { sizeHints.width_inc = 1; sizeHints.height_inc = 1; sizeHints.flags |= PResizeInc; } if (sizeHints.flags & PAspect) { /* don't divide by 0 */ if (sizeHints.min_aspect.y < 1) sizeHints.min_aspect.y = 1; if (sizeHints.max_aspect.y < 1) sizeHints.max_aspect.y = 1; } else { sizeHints.min_aspect.x = 1; sizeHints.min_aspect.y = 65535; sizeHints.max_aspect.x = 65535; sizeHints.max_aspect.y = 1; sizeHints.flags |= PAspect; } if (!(sizeHints.flags & PWinGravity)) { sizeHints.win_gravity = NorthWestGravity; sizeHints.flags |= PWinGravity; } } void PrivateWindow::updateNormalHints () { long supplied; Status status = XGetWMNormalHints (screen->dpy (), priv->id, &priv->sizeHints, &supplied); if (!status) priv->sizeHints.flags = 0; priv->recalcNormalHints (); } void PrivateWindow::updateWmHints () { long dFlags = 0; bool iconChanged; if (hints) dFlags = hints->flags; inputHint = true; XWMHints *newHints = XGetWMHints (screen->dpy (), id); if (newHints) { dFlags ^= newHints->flags; if (newHints->flags & InputHint) inputHint = newHints->input; if (hints) { if ((newHints->flags & IconPixmapHint) && (hints->icon_pixmap != newHints->icon_pixmap)) iconChanged = true; else if ((newHints->flags & IconMaskHint) && (hints->icon_mask != newHints->icon_mask)) iconChanged = true; } } iconChanged |= (dFlags & (IconPixmapHint | IconMaskHint)); if (iconChanged) freeIcons (); if (hints) XFree (hints); hints = newHints; } void PrivateWindow::updateClassHints () { if (priv->resName) { free (priv->resName); priv->resName = NULL; } if (priv->resClass) { free (priv->resClass); priv->resClass = NULL; } XClassHint classHint; int status = XGetClassHint (screen->dpy (), priv->id, &classHint); if (status) { if (classHint.res_name) { priv->resName = strdup (classHint.res_name); XFree (classHint.res_name); } if (classHint.res_class) { priv->resClass = strdup (classHint.res_class); XFree (classHint.res_class); } } } void PrivateWindow::updateTransientHint () { Window transientFor; priv->transientFor = None; Status status = XGetTransientForHint (screen->dpy (), priv->id, &transientFor); if (status) { CompWindow *ancestor = screen->findWindow (transientFor); if (!ancestor) return; /* protect against circular transient dependencies */ if (transientFor == priv->id || PrivateWindow::isAncestorTo (ancestor, window)) return; priv->transientFor = transientFor; } } void PrivateWindow::updateIconGeometry () { Atom actual; int format; unsigned long n, left; unsigned char *data; priv->iconGeometry.setGeometry (0, 0, 0, 0); int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmIconGeometry, 0L, 1024L, False, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n == 4) { unsigned long *geometry = (unsigned long *) data; priv->iconGeometry.setX (geometry[0]); priv->iconGeometry.setY (geometry[1]); priv->iconGeometry.setWidth (geometry[2]); priv->iconGeometry.setHeight (geometry[3]); } XFree (data); } } void PrivateWindow::updateClientFrame () { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::frameGtkExtents, 0L, 65536, False, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && actual == XA_CARDINAL && data) { if (n == 4) { unsigned long *extents = reinterpret_cast(data); priv->clientFrame.left = extents[0]; priv->clientFrame.right = extents[1]; priv->clientFrame.top = extents[2]; priv->clientFrame.bottom = extents[3]; } XFree (data); } else { priv->clientFrame = CompWindowExtents (); } } Window PrivateWindow::getClientLeaderOfAncestor () { if (transientFor) { CompWindow *w = screen->findWindow (transientFor); if (w) { if (w->priv->clientLeader) return w->priv->clientLeader; return w->priv->getClientLeaderOfAncestor (); } } return None; } Window PrivateWindow::getClientLeader () { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmClientLeader, 0L, 1L, False, XA_WINDOW, &actual, &format, &n, &left, &data); if (result == Success && data) { Window win = None; if (n) memcpy (&win, data, sizeof (Window)); XFree ((void *) data); if (win) return win; } return priv->getClientLeaderOfAncestor (); } char * PrivateWindow::getStartupId () { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::startupId, 0L, 1024L, False, Atoms::utf8String, &actual, &format, &n, &left, &data); if (result == Success && data) { char *id = NULL; if (n) id = strdup ((char *) data); XFree ((void *) data); return id; } return NULL; } void PrivateWindow::setFullscreenMonitors (CompFullscreenMonitorSet *monitors) { bool hadFsMonitors = fullscreenMonitorsSet; unsigned int outputs = screen->outputDevs ().size (); fullscreenMonitorsSet = false; if (monitors && (unsigned int) monitors->left < outputs && (unsigned int) monitors->right < outputs && (unsigned int) monitors->top < outputs && (unsigned int) monitors->bottom < outputs) { CompRect fsRect (screen->outputDevs ()[monitors->left].x1 (), screen->outputDevs ()[monitors->top].y1 (), screen->outputDevs ()[monitors->right].x2 () - screen->outputDevs ()[monitors->left].x1 (), screen->outputDevs ()[monitors->bottom].y2 () - screen->outputDevs ()[monitors->top].y1 ()); if (fsRect.x1 () < fsRect.x2 () && fsRect.y1 () < fsRect.y2 ()) { fullscreenMonitorsSet = true; fullscreenMonitorRect = fsRect; } } if (fullscreenMonitorsSet) { long data[4]; data[0] = monitors->top; data[1] = monitors->bottom; data[2] = monitors->left; data[3] = monitors->right; XChangeProperty (screen->dpy (), id, Atoms::wmFullscreenMonitors, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 4); } else if (hadFsMonitors) XDeleteProperty (screen->dpy (), id, Atoms::wmFullscreenMonitors); if (state & CompWindowStateFullscreenMask && (fullscreenMonitorsSet || hadFsMonitors)) window->updateAttributes (CompStackingUpdateModeNone); } void CompWindow::changeState (unsigned int newState) { if (priv->state == newState) return; unsigned int oldState = priv->state; priv->state = newState; recalcType (); recalcActions (); stateChangeNotify (oldState); if (priv->managed) screen->setWindowState (priv->state, priv->id); screen->matchPropertyChanged (this); } static void setWindowActions (CompScreen *s, unsigned int actions, Window id) { Atom data[32]; int i = 0; if (actions & CompWindowActionMoveMask) data[i++] = Atoms::winActionMove; if (actions & CompWindowActionResizeMask) data[i++] = Atoms::winActionResize; if (actions & CompWindowActionStickMask) data[i++] = Atoms::winActionStick; if (actions & CompWindowActionMinimizeMask) data[i++] = Atoms::winActionMinimize; if (actions & CompWindowActionMaximizeHorzMask) data[i++] = Atoms::winActionMaximizeHorz; if (actions & CompWindowActionMaximizeVertMask) data[i++] = Atoms::winActionMaximizeVert; if (actions & CompWindowActionFullscreenMask) data[i++] = Atoms::winActionFullscreen; if (actions & CompWindowActionCloseMask) data[i++] = Atoms::winActionClose; if (actions & CompWindowActionShadeMask) data[i++] = Atoms::winActionShade; if (actions & CompWindowActionChangeDesktopMask) data[i++] = Atoms::winActionChangeDesktop; if (actions & CompWindowActionAboveMask) data[i++] = Atoms::winActionAbove; if (actions & CompWindowActionBelowMask) data[i++] = Atoms::winActionBelow; XChangeProperty (s->dpy (), id, Atoms::wmAllowedActions, XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); } void CompWindow::recalcActions () { unsigned int actions = 0; unsigned int setActions, clearActions; switch (priv->type) { case CompWindowTypeFullscreenMask: case CompWindowTypeNormalMask: actions = CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask | CompWindowActionMoveMask | CompWindowActionResizeMask | CompWindowActionStickMask | CompWindowActionMinimizeMask | CompWindowActionCloseMask | CompWindowActionChangeDesktopMask; break; case CompWindowTypeUtilMask: case CompWindowTypeMenuMask: case CompWindowTypeToolbarMask: actions = CompWindowActionMoveMask | CompWindowActionResizeMask | CompWindowActionStickMask | CompWindowActionCloseMask | CompWindowActionChangeDesktopMask; break; case CompWindowTypeDialogMask: case CompWindowTypeModalDialogMask: actions = CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionMoveMask | CompWindowActionResizeMask | CompWindowActionStickMask | CompWindowActionCloseMask | CompWindowActionChangeDesktopMask; /* allow minimization for dialog windows if they: * a) are not a transient (transients can be minimized * with their parent) * b) don't have the skip taskbar hint set (as those * have no target to be minimized to) */ if (!priv->transientFor && !(priv->state & CompWindowStateSkipTaskbarMask)) actions |= CompWindowActionMinimizeMask; break; default: break; } if (priv->serverInput.top) actions |= CompWindowActionShadeMask; actions |= (CompWindowActionAboveMask | CompWindowActionBelowMask); switch (priv->wmType) { case CompWindowTypeNormalMask: actions |= CompWindowActionFullscreenMask | CompWindowActionMinimizeMask; break; default: break; } if (priv->sizeHints.min_width == priv->sizeHints.max_width && priv->sizeHints.min_height == priv->sizeHints.max_height) actions &= ~(CompWindowActionResizeMask | CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask); /* Don't allow maximization or fullscreen * of windows which are too big to fit * the screen */ bool foundVert = false; bool foundHorz = false; bool foundFull = false; foreach (CompOutput &o, screen->outputDevs ()) { if (o.width () >= (priv->sizeHints.min_width + priv->border.left + priv->border.right)) foundHorz = true; if (o.height () >= (priv->sizeHints.min_height + priv->border.top + priv->border.bottom)) foundVert = true; /* Fullscreen windows don't need to fit borders... */ if (o.width () >= priv->sizeHints.min_width && o.height () >= priv->sizeHints.min_height) foundFull = true; } if (!foundHorz) actions &= ~CompWindowActionMaximizeHorzMask; if (!foundVert) actions &= ~CompWindowActionMaximizeVertMask; if (!foundFull) actions &= ~CompWindowActionFullscreenMask; if (!(priv->mwmFunc & MwmFuncAll)) { if (!(priv->mwmFunc & MwmFuncResize)) actions &= ~(CompWindowActionResizeMask | CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask); if (!(priv->mwmFunc & MwmFuncMove)) actions &= ~(CompWindowActionMoveMask | CompWindowActionMaximizeHorzMask | CompWindowActionMaximizeVertMask | CompWindowActionFullscreenMask); if (!(priv->mwmFunc & MwmFuncIconify)) actions &= ~CompWindowActionMinimizeMask; if (!(priv->mwmFunc & MwmFuncClose)) actions &= ~CompWindowActionCloseMask; } getAllowedActions (setActions, clearActions); actions &= ~clearActions; actions |= setActions; if (actions != priv->actions) { priv->actions = actions; windowNotify (CompWindowNotifyActions); setWindowActions (screen, actions, priv->id); } } void CompWindow::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) { WRAPABLE_HND_FUNCTN (getAllowedActions, setActions, clearActions) setActions = 0; clearActions = 0; } unsigned int CompWindow::constrainWindowState (unsigned int state, unsigned int actions) { if (!(actions & CompWindowActionMaximizeHorzMask)) state &= ~CompWindowStateMaximizedHorzMask; if (!(actions & CompWindowActionMaximizeVertMask)) state &= ~CompWindowStateMaximizedVertMask; if (!(actions & CompWindowActionShadeMask)) state &= ~CompWindowStateShadedMask; if (!(actions & CompWindowActionFullscreenMask)) state &= ~CompWindowStateFullscreenMask; return state; } unsigned int PrivateWindow::windowTypeFromString (const char *str) { if (strcasecmp (str, "desktop") == 0) return CompWindowTypeDesktopMask; else if (strcasecmp (str, "dock") == 0) return CompWindowTypeDockMask; else if (strcasecmp (str, "toolbar") == 0) return CompWindowTypeToolbarMask; else if (strcasecmp (str, "menu") == 0) return CompWindowTypeMenuMask; else if (strcasecmp (str, "utility") == 0) return CompWindowTypeUtilMask; else if (strcasecmp (str, "splash") == 0) return CompWindowTypeSplashMask; else if (strcasecmp (str, "dialog") == 0) return CompWindowTypeDialogMask; else if (strcasecmp (str, "normal") == 0) return CompWindowTypeNormalMask; else if (strcasecmp (str, "dropdownmenu") == 0) return CompWindowTypeDropdownMenuMask; else if (strcasecmp (str, "popupmenu") == 0) return CompWindowTypePopupMenuMask; else if (strcasecmp (str, "tooltip") == 0) return CompWindowTypeTooltipMask; else if (strcasecmp (str, "notification") == 0) return CompWindowTypeNotificationMask; else if (strcasecmp (str, "combo") == 0) return CompWindowTypeComboMask; else if (strcasecmp (str, "dnd") == 0) return CompWindowTypeDndMask; else if (strcasecmp (str, "modaldialog") == 0) return CompWindowTypeModalDialogMask; else if (strcasecmp (str, "fullscreen") == 0) return CompWindowTypeFullscreenMask; else if (strcasecmp (str, "unknown") == 0) return CompWindowTypeUnknownMask; else if (strcasecmp (str, "any") == 0) return ~0; return 0; } void CompWindow::recalcType () { unsigned int type = priv->wmType; if (!overrideRedirect () && priv->wmType == CompWindowTypeUnknownMask) type = CompWindowTypeNormalMask; if (priv->state & CompWindowStateFullscreenMask) type = CompWindowTypeFullscreenMask; if (type == CompWindowTypeNormalMask && priv->transientFor) type = CompWindowTypeDialogMask; if (type == CompWindowTypeDockMask && (priv->state & CompWindowStateBelowMask)) type = CompWindowTypeNormalMask; if ((type & (CompWindowTypeNormalMask | CompWindowTypeDialogMask)) && (priv->state & CompWindowStateModalMask)) type = CompWindowTypeModalDialogMask; priv->type = type; } bool PrivateWindow::updateFrameWindow () { if (!serverFrame) return false; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWX | CWY | CWWidth | CWHeight; xwc.x = serverGeometry.x (); xwc.y = serverGeometry.y (); xwc.width = serverGeometry.width (); xwc.height = serverGeometry.height (); xwc.border_width = serverGeometry.border (); window->configureXWindow (valueMask, &xwc); window->windowNotify (CompWindowNotifyFrameUpdate); window->recalcActions (); return true; } void CompWindow::updateWindowOutputExtents () { CompWindowExtents output (priv->output); getOutputExtents (output); if (output.left != priv->output.left || output.right != priv->output.right || output.top != priv->output.top || output.bottom != priv->output.bottom) { priv->output = output; resizeNotify (0, 0, 0, 0); } } void CompWindow::getOutputExtents (CompWindowExtents& output) { WRAPABLE_HND_FUNCTN (getOutputExtents, output) output.left = 0; output.right = 0; output.top = 0; output.bottom = 0; } CompRegion PrivateWindow::rectsToRegion (unsigned int n, XRectangle *rects) { CompRegion ret; int x1, x2, y1, y2; const CompWindow::Geometry &geom = attrib.override_redirect ? priv->geometry : priv->serverGeometry; for (unsigned int i = 0; i < n; ++i) { x1 = rects[i].x + geom.border (); y1 = rects[i].y + geom.border (); x2 = x1 + rects[i].width; y2 = y1 + rects[i].height; if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (x2 > geom.width ()) x2 = geom.width (); if (y2 > geom.height ()) y2 = geom.height (); if (y1 < y2 && x1 < x2) { x1 += geom.x (); y1 += geom.y (); x2 += geom.x (); y2 += geom.y (); ret += CompRect (x1, y1, x2 - x1, y2 - y1); } } return ret; } /* TODO: This function should be able to check the XShape event * kind and only get/set shape rectangles for either ShapeInput * or ShapeBounding, but not both at the same time */ void PrivateWindow::updateRegion () { XRectangle r, *boundingShapeRects = NULL; XRectangle *inputShapeRects = NULL; int nBounding = 0, nInput = 0; const CompWindow::Geometry &geom = attrib.override_redirect ? priv->geometry : priv->serverGeometry; priv->region = priv->inputRegion = CompRegion::empty (); r.x = -geom.border (); r.y = -geom.border (); r.width = geom.widthIncBorders (); r.height = geom.heightIncBorders (); if (screen->XShape ()) { int order; /* We should update the server here */ XSync (screen->dpy (), false); boundingShapeRects = XShapeGetRectangles (screen->dpy (), priv->id, ShapeBounding, &nBounding, &order); inputShapeRects = XShapeGetRectangles (screen->dpy (), priv->id, ShapeInput, &nInput, &order); } else { boundingShapeRects = &r; nBounding = 1; inputShapeRects = &r; nInput = 1; } priv->region += rectsToRegion (nBounding, boundingShapeRects); priv->inputRegion += rectsToRegion (nInput, inputShapeRects); if (boundingShapeRects && boundingShapeRects != &r) XFree (boundingShapeRects); if (inputShapeRects && inputShapeRects != &r) XFree (inputShapeRects); window->updateFrameRegion (); } bool CompWindow::updateStruts () { Atom actual; int format; unsigned long n, left; unsigned char *data; bool hasOld; CompStruts oldStrut, newStrut; if (priv->struts) { hasOld = true; oldStrut.left = priv->struts->left; oldStrut.right = priv->struts->right; oldStrut.top = priv->struts->top; oldStrut.bottom = priv->struts->bottom; } else hasOld = false; bool hasNew = false; newStrut.left.x = 0; newStrut.left.y = 0; newStrut.left.width = 0; newStrut.left.height = screen->height (); newStrut.right.x = screen->width (); newStrut.right.y = 0; newStrut.right.width = 0; newStrut.right.height = screen->height (); newStrut.top.x = 0; newStrut.top.y = 0; newStrut.top.width = screen->width (); newStrut.top.height = 0; newStrut.bottom.x = 0; newStrut.bottom.y = screen->height (); newStrut.bottom.width = screen->width (); newStrut.bottom.height = 0; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmStrutPartial, 0L, 12L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { unsigned long *struts = (unsigned long *) data; if (n == 12) { hasNew = true; newStrut.left.y = struts[4]; newStrut.left.width = struts[0]; newStrut.left.height = struts[5] - newStrut.left.y + 1; newStrut.right.width = struts[1]; newStrut.right.x = screen->width () - newStrut.right.width; newStrut.right.y = struts[6]; newStrut.right.height = struts[7] - newStrut.right.y + 1; newStrut.top.x = struts[8]; newStrut.top.width = struts[9] - newStrut.top.x + 1; newStrut.top.height = struts[2]; newStrut.bottom.x = struts[10]; newStrut.bottom.width = struts[11] - newStrut.bottom.x + 1; newStrut.bottom.height = struts[3]; newStrut.bottom.y = screen->height () - newStrut.bottom.height; } XFree (data); } if (!hasNew) { result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmStrut, 0L, 4L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { unsigned long *struts = (unsigned long *) data; if (n == 4) { hasNew = true; newStrut.left.x = 0; newStrut.left.width = struts[0]; newStrut.right.width = struts[1]; newStrut.right.x = screen->width () - newStrut.right.width; newStrut.top.y = 0; newStrut.top.height = struts[2]; newStrut.bottom.height = struts[3]; newStrut.bottom.y = screen->height () - newStrut.bottom.height; } XFree (data); } } if (hasNew) { int strutX1, strutY1, strutX2, strutY2; int x1, y1, x2, y2; /* applications expect us to clip struts to xinerama edges */ for (unsigned int i = 0; i < screen->screenInfo ().size (); ++i) { x1 = screen->screenInfo ()[i].x_org; y1 = screen->screenInfo ()[i].y_org; x2 = x1 + screen->screenInfo ()[i].width; y2 = y1 + screen->screenInfo ()[i].height; strutX1 = newStrut.left.x; strutX2 = strutX1 + newStrut.left.width; strutY1 = newStrut.left.y; strutY2 = strutY1 + newStrut.left.height; if (strutX2 > x1 && strutX2 <= x2 && strutY1 < y2 && strutY2 > y1) { newStrut.left.x = x1; newStrut.left.width = strutX2 - x1; } strutX1 = newStrut.right.x; strutX2 = strutX1 + newStrut.right.width; strutY1 = newStrut.right.y; strutY2 = strutY1 + newStrut.right.height; if (strutX1 > x1 && strutX1 <= x2 && strutY1 < y2 && strutY2 > y1) { newStrut.right.x = strutX1; newStrut.right.width = x2 - strutX1; } strutX1 = newStrut.top.x; strutX2 = strutX1 + newStrut.top.width; strutY1 = newStrut.top.y; strutY2 = strutY1 + newStrut.top.height; if (strutX1 < x2 && strutX2 > x1 && strutY2 > y1 && strutY2 <= y2) { newStrut.top.y = y1; newStrut.top.height = strutY2 - y1; } strutX1 = newStrut.bottom.x; strutX2 = strutX1 + newStrut.bottom.width; strutY1 = newStrut.bottom.y; strutY2 = strutY1 + newStrut.bottom.height; if (strutX1 < x2 && strutX2 > x1 && strutY1 > y1 && strutY1 <= y2) { newStrut.bottom.y = strutY1; newStrut.bottom.height = y2 - strutY1; } } } if (hasOld != hasNew || (hasNew && hasOld && memcmp (&newStrut, &oldStrut, sizeof (CompStruts)))) { if (hasNew) { if (!priv->struts) { priv->struts = (CompStruts *) malloc (sizeof (CompStruts)); if (!priv->struts) return false; } *priv->struts = newStrut; } else { free (priv->struts); priv->struts = NULL; } return true; } return false; } void CompWindow::incrementDestroyReference () { ++priv->destroyRefCnt; } void CompWindow::destroy () { if (priv->id) { StackDebugger *dbg = StackDebugger::Default (); windowNotify (CompWindowNotifyBeforeDestroy); /* Don't allow frame windows to block input */ if (priv->serverFrame) XUnmapWindow (screen->dpy (), priv->serverFrame); if (priv->wrapper) XUnmapWindow (screen->dpy (), priv->wrapper); CompWindow *oldServerNext = serverNext; CompWindow *oldServerPrev = serverPrev; CompWindow *oldNext = next; CompWindow *oldPrev = prev; priv->manageFrameWindowSeparately (); /* Immediately unhook the window once destroyed * as the stacking order will be invalid if we don't * and will continue to be invalid for the period * that we keep it around in the stack. Instead, push * it to another stack and keep the next and prev members * in tact, letting plugins sort out where those windows * might be in case they need to use them relative to * other windows */ screen->unhookWindow (this); screen->unhookServerWindow (this); /* We must immediately insert the window into the debugging * stack */ if (dbg) dbg->removeServerWindow (id ()); /* Unhooking the window will also NULL the next/prev * linked list links but we don't want that so don't * do that */ next = oldNext; prev = oldPrev; serverNext = oldServerNext; serverPrev = oldServerPrev; screen->addToDestroyedWindows (this); /* We must set the xid of this window * to zero as it no longer references * a valid window */ priv->mapNum = 0; priv->id = 0; priv->frame = 0; priv->serverFrame = 0; priv->managed = false; } --priv->destroyRefCnt; if (priv->destroyRefCnt) return; if (!priv->destroyed) { if (!priv->serverFrame) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->addDestroyedFrame (priv->serverId); } priv->destroyed = true; screen->incrementPendingDestroys(); } } void CompWindow::sendConfigureNotify () { XConfigureEvent xev; xev.type = ConfigureNotify; xev.event = priv->id; xev.window = priv->id; xev.x = priv->serverGeometry.x (); xev.y = priv->serverGeometry.y (); xev.width = priv->serverGeometry.width (); xev.height = priv->serverGeometry.height (); xev.border_width = priv->serverGeometry.border (); xev.override_redirect = priv->attrib.override_redirect; /* These used to be based on the actual sibling of the window * (eg, obtained using XQueryTree), but they are now zeroed out. * * The ICCCM is a big unclear on what these should be - it * requires that after the client attempts to configure a window * we should issue a synthetic ConfigureNotify to work around * the change of co-ordinates due to reparenting: * * "A client will receive a synthetic ConfigureNotify event * following the change that describes the new geometry of the window" * * However there is an acknowledgement on stacking order: * * "Not changing the size, location, border width, * or stacking order of the window at all." * * Since there isn't any advice as to what to set the above and * detail members, the only choices are to either grab the server * and query it for the sibling to the window's parent, or to just * set them to zero. * * An evaluation of other window managers showed that they just set * these fields to zero. This is probably a safe option and justifies * the potential performance tradeoff that we get out of not having * to grab the server, query window attributes and children and * translate co-ordinates every time a window is moved */ xev.above = None; XSendEvent (screen->dpy (), priv->id, false, StructureNotifyMask, (XEvent *) &xev); } void CompWindow::map () { windowNotify (CompWindowNotifyBeforeMap); /* Previously not viewable */ if (!isViewable ()) { if (priv->pendingMaps > 0) priv->pendingMaps = 0; priv->mapNum = screen->nextMapNum(); if (priv->struts) screen->updateWorkarea (); if (windowClass () == InputOnly) return; priv->unmapRefCnt = 1; priv->attrib.map_state = IsViewable; if (!overrideRedirect ()) screen->setWmState (NormalState, priv->id); priv->invisible = priv->isInvisible (); priv->alive = true; priv->lastPong = screen->lastPing (); priv->updateRegion (); priv->updateSize (); screen->updateClientList (); if (priv->type & CompWindowTypeDesktopMask) { screen->incrementDesktopWindowCount (); if (!alpha ()) screen->incrementOpaqueDesktopWindowCount (); } if (priv->protocols & CompWindowProtocolSyncRequestMask) { sendSyncRequest (); sendConfigureNotify (); } if (!overrideRedirect () && priv->shaded) // been shaded { priv->shaded = false; priv->updateFrameWindow (); } } windowNotify (CompWindowNotifyMap); /* Send a resizeNotify to plugins to indicate * that the map is complete */ resizeNotify (0, 0, 0, 0); } void CompWindow::incrementUnmapReference () { ++priv->unmapRefCnt; } void CompWindow::unmap () { if (priv->mapNum) priv->mapNum = 0; windowNotify (CompWindowNotifyBeforeUnmap); /* Even though we're still keeping the backing * pixmap of the window around, it's safe to * unmap the frame window since there's no use * for it at this point anyways and it just blocks * input, but keep it around if shaded */ XUnmapWindow (screen->dpy (), priv->wrapper); if (!priv->shaded) XUnmapWindow (screen->dpy (), priv->serverFrame); --priv->unmapRefCnt; if (priv->unmapRefCnt > 0) return; if (priv->unmanaging) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int xwcm; int gravity = priv->sizeHints.win_gravity; /* revert gravity adjustment made at MapNotify time */ xwc.x = priv->serverGeometry.x (); xwc.y = priv->serverGeometry.y (); xwc.width = 0; xwc.height = 0; xwcm = priv->adjustConfigureRequestForGravity (&xwc, CWX | CWY, gravity, -1); if (xwcm) configureXWindow (xwcm, &xwc); priv->unmanaging = false; } if (priv->serverFrame && !priv->shaded) priv->unreparent (); if (priv->struts) screen->updateWorkarea (); if (priv->attrib.map_state != IsViewable) return; if (priv->type == CompWindowTypeDesktopMask) { screen->decrementDesktopWindowCount (); if (!alpha ()) screen->decrementOpaqueDesktopWindowCount (); } priv->attrib.map_state = IsUnmapped; priv->invisible = true; if (priv->shaded) priv->updateFrameWindow (); screen->updateClientList (); windowNotify (CompWindowNotifyUnmap); } void PrivateWindow::withdraw () { if (!attrib.override_redirect) screen->setWmState (WithdrawnState, id); placed = false; unmanaging = managed; managed = false; } bool PrivateWindow::restack (Window aboveId) { if (aboveId && (aboveId == id || aboveId == serverFrame)) // Don't try to raise a window above itself return false; else if (window->prev) { if (aboveId && (aboveId == window->prev->id () || aboveId == window->prev->priv->frame)) return false; } else if (aboveId == None && !window->next) return false; if (aboveId && !screen->findTopLevelWindow (aboveId, true)) return false; screen->unhookWindow (window); screen->insertWindow (window, aboveId); /* Update the server side window list for * override redirect windows immediately * since there is no opportunity to update * the server side list when we configure them * since we never get a ConfigureRequest for those */ if (attrib.override_redirect != 0) { StackDebugger *dbg = StackDebugger::Default (); screen->unhookServerWindow (window); screen->insertServerWindow (window, aboveId); if (dbg) dbg->overrideRedirectRestack (window->id (), aboveId); } screen->updateClientList (); window->windowNotify (CompWindowNotifyRestack); return true; } bool CompWindow::resize (XWindowAttributes attr) { return resize (Geometry (attr.x, attr.y, attr.width, attr.height, attr.border_width)); } bool CompWindow::resize (int x, int y, int width, int height, int border) { return resize (Geometry (x, y, width, height, border)); } bool PrivateWindow::resize (const CompWindow::Geometry &gm) { /* Input extents are now the last thing sent * from the server. This might not work in some * cases though because setWindowFrameExtents may * be called more than once in an event processing * cycle so every set of input extents up until the * last one will be invalid. The real solution * here is to handle ConfigureNotify events on * frame windows and client windows separately */ priv->input = priv->serverInput; if (priv->geometry.width () != gm.width () || priv->geometry.height () != gm.height () || priv->geometry.border () != gm.border ()) { int dx = gm.x () - priv->geometry.x (); int dy = gm.y () - priv->geometry.y (); int dwidth = gm.width () - priv->geometry.width (); int dheight = gm.height () - priv->geometry.height (); priv->geometry.set (gm.x (), gm.y (), gm.width (), gm.height (), gm.border ()); priv->invisible = priv->isInvisible (); if (priv->attrib.override_redirect) { priv->serverGeometry = priv->geometry; priv->serverFrameGeometry = priv->frameGeometry; if (priv->mapNum) priv->updateRegion (); window->resizeNotify (dx, dy, dwidth, dheight); } } else if (priv->geometry.x () != gm.x () || priv->geometry.y () != gm.y ()) move (gm.x () - priv->geometry.x (), gm.y () - priv->geometry.y (), true); return true; } bool PrivateWindow::resize (const XWindowAttributes &attr) { return resize (CompWindow::Geometry (attr.x, attr.y, attr.width, attr.height, attr.border_width)); } bool PrivateWindow::resize (int x, int y, int width, int height, int border) { return resize (CompWindow::Geometry (x, y, width, height, border)); } bool CompWindow::resize (CompWindow::Geometry gm) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth; xwc.x = gm.x (); xwc.y = gm.y (); xwc.width = gm.width (); xwc.height = gm.height (); xwc.border_width = gm.border (); configureXWindow (valueMask, &xwc); return true; } static void syncValueIncrement (XSyncValue *value) { XSyncValue one; int overflow; XSyncIntToValue (&one, 1); XSyncValueAdd (value, *value, one, &overflow); } bool PrivateWindow::initializeSyncCounter () { if (syncCounter) return syncAlarm != None; if (!(protocols & CompWindowProtocolSyncRequestMask)) return false; Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), id, Atoms::wmSyncRequestCounter, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && n && data) { unsigned long *counter = (unsigned long *) data; syncCounter = *counter; XFree (data); XSyncIntsToValue (&syncValue, (unsigned int) rand (), 0); XSyncSetCounter (screen->dpy (), syncCounter, syncValue); syncValueIncrement (&syncValue); XSyncAlarmAttributes values; values.events = true; values.trigger.counter = syncCounter; values.trigger.wait_value = syncValue; values.trigger.value_type = XSyncAbsolute; values.trigger.test_type = XSyncPositiveComparison; XSyncIntToValue (&values.delta, 1); values.events = true; CompScreenImpl::checkForError (screen->dpy ()); /* Note that by default, the alarm increments the trigger value * when it fires until the condition (counter.value < trigger.value) * is false again. */ syncAlarm = XSyncCreateAlarm (screen->dpy (), XSyncCACounter | XSyncCAValue | XSyncCAValueType | XSyncCATestType | XSyncCADelta | XSyncCAEvents, &values); if (CompScreenImpl::checkForError (screen->dpy ())) return true; XSyncDestroyAlarm (screen->dpy (), syncAlarm); syncAlarm = None; } else if (result == Success && data) XFree (data); return false; } void CompWindow::sendSyncRequest () { if (priv->syncWait || !priv->initializeSyncCounter ()) return; XClientMessageEvent xev; xev.type = ClientMessage; xev.window = priv->id; xev.message_type = Atoms::wmProtocols; xev.format = 32; xev.data.l[0] = Atoms::wmSyncRequest; xev.data.l[1] = CurrentTime; xev.data.l[2] = XSyncValueLow32 (priv->syncValue); xev.data.l[3] = XSyncValueHigh32 (priv->syncValue); xev.data.l[4] = 0; syncValueIncrement (&priv->syncValue); XSendEvent (screen->dpy (), priv->id, false, 0, (XEvent *) &xev); priv->syncWait = true; priv->syncGeometry = priv->serverGeometry; if (!priv->syncWaitTimer.active ()) priv->syncWaitTimer.start (); } void PrivateWindow::configure (XConfigureEvent *ce) { if (priv->frame) return; unsigned int valueMask = 0; /* remove configure event from pending configures */ if (priv->geometry.x () != ce->x) valueMask |= CWX; if (priv->geometry.y () != ce->y) valueMask |= CWY; if (priv->geometry.width () != ce->width) valueMask |= CWWidth; if (priv->geometry.height () != ce->height) valueMask |= CWHeight; if (priv->geometry.border () != ce->border_width) valueMask |= CWBorderWidth; if (window->prev) { if (ROOTPARENT (window->prev) != ce->above) valueMask |= CWSibling | CWStackMode; } else if (ce->above != 0) valueMask |= CWSibling | CWStackMode; priv->attrib.override_redirect = ce->override_redirect; priv->frameGeometry.set (ce->x, ce->y, ce->width, ce->height, ce->border_width); if (priv->syncWait) priv->syncGeometry.set (ce->x, ce->y, ce->width, ce->height, ce->border_width); else resize (ce->x, ce->y, ce->width, ce->height, ce->border_width); if (ce->event == screen->root ()) priv->restack (ce->above); } void PrivateWindow::configureFrame (XConfigureEvent *ce) { if (!priv->frame) return; int height; CompWindow *above; unsigned int valueMask = 0; /* remove configure event from pending configures */ if (priv->frameGeometry.x () != ce->x) valueMask |= CWX; if (priv->frameGeometry.y () != ce->y) valueMask |= CWY; if (priv->frameGeometry.width () != ce->width) valueMask |= CWWidth; if (priv->frameGeometry.height () != ce->height) valueMask |= CWHeight; if (priv->frameGeometry.border () != ce->border_width) valueMask |= CWBorderWidth; if (window->prev) { if (ROOTPARENT (window->prev) != ce->above) valueMask |= CWSibling | CWStackMode; } else if (ce->above != 0) valueMask |= CWSibling | CWStackMode; if (!pendingConfigures.match ((XEvent *) ce)) { compLogMessage ("core", CompLogLevelWarn, "unhandled ConfigureNotify on 0x%x!", serverFrame); compLogMessage ("core", CompLogLevelWarn, "this should never happen. you should "\ "probably file a bug about this."); #ifdef DEBUG abort (); #else pendingConfigures.clear (); #endif } /* subtract the input extents last sent to the * server to calculate the client size and then * re-sync the input extents and extents last * sent to server on resize () */ int x = ce->x + priv->serverInput.left; int y = ce->y + priv->serverInput.top; int width = ce->width - priv->serverGeometry.border () * 2 - priv->serverInput.left - priv->serverInput.right; /* Don't use the server side frame geometry * to determine the geometry of shaded * windows since we didn't resize them * on configureXWindow */ if (priv->shaded) height = priv->serverGeometry.heightIncBorders () - priv->serverInput.top - priv->serverInput.bottom; else height = ce->height + priv->serverGeometry.border () * 2 - priv->serverInput.top - priv->serverInput.bottom; /* set the frame geometry */ priv->frameGeometry.set (ce->x, ce->y, ce->width, ce->height, ce->border_width); if (priv->syncWait) priv->syncGeometry.set (x, y, width, height, ce->border_width); else resize (x, y, width, height, ce->border_width); if (priv->restack (ce->above)) priv->updatePassiveButtonGrabs (); above = screen->findWindow (ce->above); if (above) above->priv->updatePassiveButtonGrabs (); } void PrivateWindow::circulate (XCirculateEvent *ce) { Window newAboveId; if (ce->place == PlaceOnTop) { CompWindow *newAbove = screen->getTopWindow (); newAboveId = newAbove ? newAbove->id () : None; } else newAboveId = 0; priv->restack (newAboveId); } void CompWindow::move (int dx, int dy, bool immediate) { if (dx || dy) { XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWX | CWY; xwc.x = priv->serverGeometry.x () + dx; xwc.y = priv->serverGeometry.y () + dy; priv->nextMoveImmediate = immediate; configureXWindow (valueMask, &xwc); } } void PrivateWindow::move (int dx, int dy, bool immediate) { if (dx || dy) { priv->geometry.setX (priv->geometry.x () + dx); priv->geometry.setY (priv->geometry.y () + dy); priv->frameGeometry.setX (priv->frameGeometry.x () + dx); priv->frameGeometry.setY (priv->frameGeometry.y () + dy); if (priv->attrib.override_redirect) { priv->serverGeometry = priv->geometry; priv->serverFrameGeometry = priv->frameGeometry; priv->region.translate (dx, dy); priv->inputRegion.translate (dx, dy); if (!priv->frameRegion.isEmpty ()) priv->frameRegion.translate (dx, dy); priv->invisible = priv->isInvisible (); window->moveNotify (dx, dy, true); } } } bool compiz::X11::PendingEventQueue::pending () { return !mEvents.empty (); } void compiz::X11::PendingEventQueue::add (PendingEvent::Ptr p) { compLogMessage ("core", CompLogLevelDebug, "pending request:"); p->dump (); mEvents.push_back (p); } bool compiz::X11::PendingEventQueue::removeIfMatching (const PendingEvent::Ptr &p, XEvent *event) { if (p->match (event)) { compLogMessage ("core", CompLogLevelDebug, "received event:"); p->dump (); return true; } return false; } void compiz::X11::PendingEvent::dump () { compLogMessage ("core", CompLogLevelDebug, "- event serial: %i", mSerial); compLogMessage ("core", CompLogLevelDebug, "- event window 0x%x", mWindow); } void compiz::X11::PendingConfigureEvent::dump () { compiz::X11::PendingEvent::dump (); compLogMessage ("core", CompLogLevelDebug, "- x: %i y: %i width: %i height: %i "\ "border: %i, sibling: 0x%x", mXwc.x, mXwc.y, mXwc.width, mXwc.height, mXwc.border_width, mXwc.sibling); } bool compiz::X11::PendingEventQueue::match (XEvent *event) { unsigned int lastSize = mEvents.size (); mEvents.erase (std::remove_if (mEvents.begin (), mEvents.end (), boost::bind (&compiz::X11::PendingEventQueue::removeIfMatching, this, _1, event)), mEvents.end ()); return lastSize != mEvents.size (); } bool compiz::X11::PendingEventQueue::forEachIf (boost::function f) { foreach (compiz::X11::PendingEvent::Ptr p, mEvents) if (f (p)) return true; return false; } void compiz::X11::PendingEventQueue::dump () { foreach (compiz::X11::PendingEvent::Ptr p, mEvents) p->dump (); } compiz::X11::PendingEventQueue::PendingEventQueue (Display *d) { /* mClearCheckTimeout.setTimes (0, 0) * * XXX: For whatever reason, calling setTimes (0, 0) here causes * the destructor of the timer object to be called twice later on * in execution and the stack gets smashed. This could be a * compiler bug, but requires further investigation */ } compiz::X11::PendingEventQueue::~PendingEventQueue () { } Window compiz::X11::PendingEvent::getEventWindow (XEvent *event) { return event->xany.window; } bool compiz::X11::PendingEvent::match (XEvent *event) { if (event->xany.serial != mSerial || getEventWindow (event)!= mWindow) return false; return true; } compiz::X11::PendingEvent::PendingEvent (Display *d, Window w) : mSerial (XNextRequest (d)), mWindow (w) { } compiz::X11::PendingEvent::~PendingEvent () { } Window compiz::X11::PendingConfigureEvent::getEventWindow (XEvent *event) { return event->xconfigure.window; } bool compiz::X11::PendingConfigureEvent::matchVM (unsigned int valueMask) { unsigned int result = mValueMask != 0 ? valueMask & mValueMask : 1; return result != 0; } bool compiz::X11::PendingConfigureEvent::matchRequest (XWindowChanges &xwc, unsigned int valueMask) { if (matchVM (valueMask)) { if ((valueMask & CWX && xwc.x != mXwc.x) || (valueMask & CWY && xwc.y != mXwc.y) || (valueMask & CWWidth && xwc.width != mXwc.width) || (valueMask & CWHeight && xwc.height != mXwc.height) || (valueMask & CWBorderWidth && xwc.border_width != mXwc.border_width) || (valueMask & (CWStackMode | CWSibling) && xwc.sibling != mXwc.sibling)) return false; return true; } return false; } bool compiz::X11::PendingConfigureEvent::match (XEvent *event) { XConfigureEvent *ce = (XConfigureEvent *) event; bool matched = true; if (!compiz::X11::PendingEvent::match (event)) return false; XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = ce->x; xwc.y = ce->y; xwc.width = ce->width; xwc.height = ce->height; xwc.border_width = ce->border_width; xwc.sibling = ce->above; matched = matchRequest (xwc, mValueMask); /* Remove events from the queue * even if they didn't match what * we expected them to be, but still * complain about it */ if (!matched) { compLogMessage ("core", CompLogLevelWarn, "no exact match for ConfigureNotify on 0x%x!", mWindow); compLogMessage ("core", CompLogLevelWarn, "expected the following changes:"); if (mValueMask & CWX) compLogMessage ("core", CompLogLevelWarn, "x: %i", mXwc.x); if (mValueMask & CWY) compLogMessage ("core", CompLogLevelWarn, "y: %i", mXwc.y); if (mValueMask & CWWidth) compLogMessage ("core", CompLogLevelWarn, "width: %i", mXwc.width); if (mValueMask & CWHeight) compLogMessage ("core", CompLogLevelWarn, "height: %i", mXwc.height); if (mValueMask & CWBorderWidth) compLogMessage ("core", CompLogLevelWarn, "border: %i", mXwc.border_width); if (mValueMask & (CWStackMode | CWSibling)) compLogMessage ("core", CompLogLevelWarn, "sibling: 0x%x", mXwc.sibling); compLogMessage ("core", CompLogLevelWarn, "instead got:"); compLogMessage ("core", CompLogLevelWarn, "x: %i", ce->x); compLogMessage ("core", CompLogLevelWarn, "y: %i", ce->y); compLogMessage ("core", CompLogLevelWarn, "width: %i", ce->width); compLogMessage ("core", CompLogLevelWarn, "height: %i", ce->height); compLogMessage ("core", CompLogLevelWarn, "above: %i", ce->above); compLogMessage ("core", CompLogLevelWarn, "this should never happen. you should "\ "probably file a bug about this."); } return true; } compiz::X11::PendingConfigureEvent::PendingConfigureEvent (Display *d, Window w, unsigned int valueMask, XWindowChanges *xwc) : compiz::X11::PendingEvent::PendingEvent (d, w), mValueMask (valueMask), mXwc (*xwc) { } compiz::X11::PendingConfigureEvent::~PendingConfigureEvent () { } bool CompWindow::focus () { WRAPABLE_HND_FUNCTN_RETURN (bool, focus) if (overrideRedirect () || !priv->managed || priv->unmanaging || !onCurrentDesktop () || priv->destroyed || (!priv->shaded && (priv->state & CompWindowStateHiddenMask)) || priv->serverGeometry.x () + priv->serverGeometry.width () <= 0 || priv->serverGeometry.y () + priv->serverGeometry.height () <= 0 || priv->serverGeometry.x () >= (int) screen->width () || priv->serverGeometry.y () >= (int) screen->height ()) return false; return true; } bool CompWindow::place (CompPoint &pos) { WRAPABLE_HND_FUNCTN_RETURN (bool, place, pos) return false; } void CompWindow::validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source) { WRAPABLE_HND_FUNCTN (validateResizeRequest, mask, xwc, source) if (!(priv->type & (CompWindowTypeDockMask | CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask))) { if (mask & CWY) { int min = screen->workArea ().y () + priv->input.top; int max = screen->workArea ().bottom (); if (priv->state & CompWindowStateStickyMask && (xwc->y < min || xwc->y > max)) xwc->y = priv->serverGeometry.y (); else { min -= screen->vp ().y () * screen->height (); max += (screen->vpSize ().height () - screen->vp ().y () - 1) * screen->height (); if (xwc->y < min) xwc->y = min; else if (xwc->y > max) xwc->y = max; } } if (mask & CWX) { int min = screen->workArea ().x () + priv->input.left; int max = screen->workArea ().right (); if (priv->state & CompWindowStateStickyMask && (xwc->x < min || xwc->x > max)) xwc->x = priv->serverGeometry.x (); else { min -= screen->vp ().x () * screen->width (); max += (screen->vpSize ().width () - screen->vp ().x () - 1) * screen->width (); if (xwc->x < min) xwc->x = min; else if (xwc->x > max) xwc->x = max; } } } } void CompWindow::resizeNotify (int dx, int dy, int dwidth, int dheight) WRAPABLE_HND_FUNCTN (resizeNotify, dx, dy, dwidth, dheight) void CompWindow::moveNotify (int dx, int dy, bool immediate) WRAPABLE_HND_FUNCTN (moveNotify, dx, dy, immediate) void CompWindow::windowNotify (CompWindowNotify n) WRAPABLE_HND_FUNCTN (windowNotify, n) void CompWindow::grabNotify (int x, int y, unsigned int state, unsigned int mask) { WRAPABLE_HND_FUNCTN (grabNotify, x, y, state, mask) priv->grabbed = true; } void CompWindow::ungrabNotify () { WRAPABLE_HND_FUNCTN (ungrabNotify) priv->grabbed = false; } void CompWindow::stateChangeNotify (unsigned int lastState) { WRAPABLE_HND_FUNCTN (stateChangeNotify, lastState); /* if being made sticky */ if (!(lastState & CompWindowStateStickyMask) && (priv->state & CompWindowStateStickyMask)) { /* Find which viewport the window falls in, and check if it's the current viewport */ CompPoint vp = defaultViewport (); /* index of the window's vp */ if (screen->vp () != vp) { unsigned int valueMask = CWX | CWY; XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = serverGeometry ().x () + (screen->vp ().x () - vp.x ()) * screen->width (); xwc.y = serverGeometry ().y () + (screen->vp ().y () - vp.y ()) * screen->height (); configureXWindow (valueMask, &xwc); } } } bool PrivateWindow::isGroupTransient (Window clientLeader) { if (!clientLeader) return false; if ((transientFor == None || transientFor == screen->root ()) && (type & (CompWindowTypeUtilMask | CompWindowTypeToolbarMask | CompWindowTypeMenuMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask) && this->clientLeader == clientLeader)) return true; return false; } CompWindow * PrivateWindow::getModalTransient () { CompWindow *w, *modalTransient; modalTransient = window; for (w = screen->windows ().back (); w; w = w->prev) { if (w == modalTransient || w->priv->mapNum == 0) continue; if (w->priv->transientFor == modalTransient->priv->id && w->priv->state & CompWindowStateModalMask) { modalTransient = w; w = screen->windows ().back (); } } if (modalTransient == window) { /* don't look for group transients with modal state if current window has modal state */ if (state & CompWindowStateModalMask) return NULL; for (w = screen->windows ().back (); w; w = w->prev) { if (w == modalTransient || w->priv->mapNum == 0 || isAncestorTo (modalTransient, w)) continue; if (w->priv->isGroupTransient (modalTransient->priv->clientLeader) && w->priv->state & CompWindowStateModalMask) { modalTransient = w; w = w->priv->getModalTransient (); if (w) modalTransient = w; break; } } } if (modalTransient == window) modalTransient = NULL; return modalTransient; } void CompWindow::moveInputFocusTo () { CompScreen *s = screen; CompWindow *modalTransient = priv->getModalTransient (); if (modalTransient) return modalTransient->moveInputFocusTo (); /* If the window is still hidden but not shaded * it probably meant that a plugin overloaded * CompWindow::focus to allow the focus to go * to this window, so only move the input focus * to the frame if the window is shaded */ if (shaded ()) { XSetInputFocus (s->dpy (), priv->serverFrame, RevertToPointerRoot, CurrentTime); XChangeProperty (s->dpy (), s->root (), Atoms::winActive, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &priv->id, 1); screen->setNextActiveWindow(priv->serverFrame); } else { bool setFocus = false; if (priv->inputHint) { XSetInputFocus (s->dpy (), priv->id, RevertToPointerRoot, CurrentTime); setFocus = true; } if (priv->protocols & CompWindowProtocolTakeFocusMask) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = priv->id; ev.xclient.message_type = Atoms::wmProtocols; ev.xclient.format = 32; ev.xclient.data.l[0] = Atoms::wmTakeFocus; ev.xclient.data.l[1] = s->getCurrentTime (); ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent (s->dpy (), priv->id, false, NoEventMask, &ev); setFocus = true; } if (setFocus) screen->setNextActiveWindow(priv->id); if (!setFocus && !modalTransient) { CompWindow *ancestor; /* move input to closest ancestor */ for (ancestor = s->windows ().front (); ancestor; ancestor = ancestor->next) { if (PrivateWindow::isAncestorTo (this, ancestor)) { ancestor->moveInputFocusTo (); break; } } } } } void CompWindow::moveInputFocusToOtherWindow () { if (priv->id == screen->activeWindow () || priv->id == screen->getNextActiveWindow()) { CompWindow *nextActive = screen->findWindow (screen->getNextActiveWindow ()); /* Window pending focus */ if (priv->id != screen->getNextActiveWindow () && nextActive && nextActive->focus ()) nextActive->moveInputFocusTo (); else if (priv->transientFor && priv->transientFor != screen->root ()) { CompWindow *ancestor = screen->findWindow (priv->transientFor); if (ancestor && ancestor->focus () && !(ancestor->priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) ancestor->moveInputFocusTo (); else screen->focusDefaultWindow (); } else if (priv->type & (CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { CompWindow *a, *focus = NULL; for (a = screen->windows ().back (); a; a = a->prev) { if (a->priv->clientLeader == priv->clientLeader) { if (a->focus ()) { if (focus) { if (a->priv->type & (CompWindowTypeNormalMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { if (priv->compareWindowActiveness (focus, a) < 0) focus = a; } } else focus = a; } } } if (focus && !(focus->priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) focus->moveInputFocusTo (); else screen->focusDefaultWindow (); } else screen->focusDefaultWindow (); } } namespace { /* There is a race condition where we can request to restack * a window relative to a sibling that's been destroyed on * the server side, but not yet on the client side (eg DestroyNotify). * In that case the server will report a BadWindow error and refuse * to process the ConfigureRequest event. This leaves * serverWindows in an indeterminate state, because we've * effectively recorded that we successfully put the window * in a new stack position, even though it will fail later on * and leave the window in the same stack position. That leaves * the door open for cascading errors, where other windows successfully * stack on top of the window which was not successfully restacked, so * they will all receive invalid stack positions. * * In order to alleviate that condition, we need to hold a server grab to * ensure that the window cannot be destroyed while we are stacking another * window relative to it, or, if it was destroyed to ensure that querying * whether or not it exists will return a useful value * * Any function which walks the window stack to determine an appropriate * sibling should always employ this as the last check before returning * that sibling or considering other windows. It is never a good idea * to restack relative to a sibling that could have been destroyed. As * a side effect of this function requiring a ServerLock, any other function * that uses this one will also require one, and the caller should keep * the same ServerLock alive when calling through to * CompWindow::restackAndConfigureXWindow */ bool existsOnServer (CompWindow *window, const ServerLock &lock) { /* We only stack relative to frame windows, and we know * whether or not they exist on the server side, don't * query whether or not they do */ if (window->frame ()) return true; else { XWindowAttributes attrib; if (!XGetWindowAttributes (screen->dpy (), ROOTPARENT (window), &attrib)) return false; } return true; } } bool PrivateWindow::stackLayerCheck (CompWindow *w, Window clientLeader, CompWindow *below, const ServerLock &lock) { if (isAncestorTo (w, below)) return true; if (isAncestorTo (below, w)) return false; if (clientLeader && below->priv->clientLeader == clientLeader && below->priv->isGroupTransient (clientLeader)) return false; if (w->priv->state & CompWindowStateAboveMask) return true; else if (w->priv->state & CompWindowStateBelowMask) { if (below->priv->state & CompWindowStateBelowMask) return true; } else if (!(below->priv->state & CompWindowStateAboveMask)) return true; return false; } bool PrivateWindow::avoidStackingRelativeTo (CompWindow *w, const ServerLock &lock) { bool allowRelativeToUnmapped = w->priv->receivedMapRequestAndAwaitingMap || w->priv->shaded || w->priv->pendingMaps; if ((w->overrideRedirect () || w->destroyed ()) || (!allowRelativeToUnmapped && (!w->isViewable () || !w->isMapped ()))) return true; return false; } /* goes through the stack, top-down until we find a window we should stack above, normal windows can be stacked above fullscreen windows (and fullscreen windows over others in their layer) if aboveFs is true. */ CompWindow * PrivateWindow::findSiblingBelow (CompWindow *w, bool aboveFs, const ServerLock &lock) { CompWindow *below; CompWindow *t = screen->findWindow (w->transientFor ()); Window clientLeader = w->priv->clientLeader; unsigned int type = w->priv->type; unsigned int belowMask; if (aboveFs) belowMask = CompWindowTypeDockMask; else belowMask = CompWindowTypeDockMask | CompWindowTypeFullscreenMask; /* normal stacking of fullscreen windows with below state */ if ((type & CompWindowTypeFullscreenMask) && (w->priv->state & CompWindowStateBelowMask)) type = CompWindowTypeNormalMask; while (t && type != CompWindowTypeDockMask) { /* dock stacking of transients for docks */ if (t->type () & CompWindowTypeDockMask) type = CompWindowTypeDockMask; t = screen->findWindow (t->transientFor ()); } if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; for (below = screen->serverWindows ().back (); below; below = below->serverPrev) { if (below == w || avoidStackingRelativeTo (below, lock)) continue; /* always above desktop windows */ if (below->priv->type & CompWindowTypeDesktopMask) return below; switch (type) { case CompWindowTypeDesktopMask: /* desktop window layer */ break; case CompWindowTypeFullscreenMask: if (aboveFs) return below; /* otherwise fall-through */ case CompWindowTypeDockMask: /* fullscreen and dock layer */ if (below->priv->type & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)) { if (stackLayerCheck (w, clientLeader, below, lock) && existsOnServer (below, lock)) return below; } else return below; break; default: { bool allowedRelativeToLayer = !(below->priv->type & belowMask); if (aboveFs && below->priv->type & CompWindowTypeFullscreenMask && !below->focus ()) break; t = screen->findWindow (below->transientFor ()); while (t && allowedRelativeToLayer) { /* dock stacking of transients for docks */ allowedRelativeToLayer = !(t->priv->type & belowMask); t = screen->findWindow (t->transientFor ()); } /* fullscreen and normal layer */ if (allowedRelativeToLayer && stackLayerCheck (w, clientLeader, below, lock) && existsOnServer (below, lock)) return below; break; } } } return NULL; } /* goes through the stack, top-down and returns the lowest window we can stack above. */ CompWindow * PrivateWindow::findLowestSiblingBelow (CompWindow *w, const ServerLock &lock) { CompWindow *below, *lowest = screen->serverWindows ().back (); CompWindow *t = screen->findWindow (w->transientFor ()); Window clientLeader = w->priv->clientLeader; unsigned int type = w->priv->type; /* normal stacking fullscreen windows with below state */ if (type & CompWindowTypeFullscreenMask && w->priv->state & CompWindowStateBelowMask) type = CompWindowTypeNormalMask; while (t && type != CompWindowTypeDockMask) { /* dock stacking of transients for docks */ if (t->type () & CompWindowTypeDockMask) type = CompWindowTypeDockMask; t = screen->findWindow (t->transientFor ()); } if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; for (below = screen->serverWindows ().back (); below; below = below->serverPrev) { if (below == w || avoidStackingRelativeTo (below, lock)) continue; /* always above desktop windows */ if (below->priv->type & CompWindowTypeDesktopMask && existsOnServer (below, lock)) return below; switch (type) { case CompWindowTypeDesktopMask: /* desktop window layer - desktop windows always should be stacked at the bottom; no other window should be below them */ return NULL; break; case CompWindowTypeFullscreenMask: case CompWindowTypeDockMask: /* fullscreen and dock layer */ if (below->priv->type & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)) { if (!stackLayerCheck (below, clientLeader, w, lock) && existsOnServer (lowest, lock)) return lowest; } else if (existsOnServer (lowest, lock)) return lowest; break; default: { bool allowedRelativeToLayer = !(below->priv->type & CompWindowTypeDockMask); t = screen->findWindow (below->transientFor ()); while (t && allowedRelativeToLayer) { /* dock stacking of transients for docks */ allowedRelativeToLayer = !(t->priv->type & CompWindowTypeDockMask); t = screen->findWindow (t->transientFor ()); } /* fullscreen and normal layer */ if (allowedRelativeToLayer && !stackLayerCheck (below, clientLeader, w, lock) && existsOnServer (lowest, lock)) return lowest; break; } } lowest = below; } if (existsOnServer (lowest, lock)) return lowest; else { compLogMessage ("core", CompLogLevelDebug, "couldn't find window to stack above"); return NULL; } } bool PrivateWindow::validSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock) { CompWindow *t = screen->findWindow (w->transientFor ()); Window clientLeader = w->priv->clientLeader; unsigned int type = w->priv->type; /* normal stacking fullscreen windows with below state */ if ((type & CompWindowTypeFullscreenMask) && (w->priv->state & CompWindowStateBelowMask)) type = CompWindowTypeNormalMask; while (t && type != CompWindowTypeDockMask) { /* dock stacking of transients for docks */ if (t->type () & CompWindowTypeDockMask) type = CompWindowTypeDockMask; t = screen->findWindow (t->transientFor ()); } if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; if (sibling == w || avoidStackingRelativeTo (sibling, lock)) return false; /* always above desktop windows */ if (sibling->priv->type & CompWindowTypeDesktopMask) return true; switch (type) { case CompWindowTypeDesktopMask: /* desktop window layer */ break; case CompWindowTypeFullscreenMask: case CompWindowTypeDockMask: /* fullscreen and dock layer */ if (sibling->priv->type & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)) { if (stackLayerCheck (w, clientLeader, sibling, lock) && existsOnServer (sibling, lock)) return true; } else if (existsOnServer (sibling, lock)) return true; break; default: { bool allowedRelativeToLayer = !(sibling->priv->type & CompWindowTypeDockMask); t = screen->findWindow (sibling->transientFor ()); while (t && allowedRelativeToLayer) { /* dock stacking of transients for docks */ allowedRelativeToLayer = !(t->priv->type & CompWindowTypeDockMask); t = screen->findWindow (t->transientFor ()); } /* fullscreen and normal layer */ if (allowedRelativeToLayer && stackLayerCheck (w, clientLeader, sibling, lock) && existsOnServer (sibling, lock)) return true; break; } } return false; } void PrivateWindow::saveGeometry (int mask) { /* only save geometry if window has been placed */ if (!placed) return; int m = mask & ~saveMask; /* The saved window geometry is always saved in terms of the non-decorated * geometry as we may need to restore it with a different decoration size */ if (m & CWX) saveWc.x = serverGeometry.x () - window->border ().left; if (m & CWY) saveWc.y = serverGeometry.y () - window->border ().top; if (m & CWWidth) saveWc.width = serverGeometry.width () + (window->border ().left + window->border ().right); if (m & CWHeight) saveWc.height = serverGeometry.height () + (window->border ().top + window->border ().bottom); if (m & CWBorderWidth) saveWc.border_width = serverGeometry.border (); saveMask |= m; } int PrivateWindow::restoreGeometry (XWindowChanges *xwc, int mask) { int m = mask & saveMask; if (m & CWX) xwc->x = saveWc.x + window->border ().left; if (m & CWY) xwc->y = saveWc.y + window->border ().top; if (m & CWWidth) xwc->width = saveWc.width - (window->border ().left + window->border ().right); if (m & CWHeight) xwc->height = saveWc.height - (window->border ().top + window->border ().bottom); if (m & CWBorderWidth) xwc->border_width = saveWc.border_width; saveMask &= ~mask; return m; } static bool isPendingRestack (const compiz::X11::PendingEvent::Ptr &p) { compiz::X11::PendingConfigureEvent::Ptr pc = boost::static_pointer_cast (p); return pc->matchVM (CWStackMode | CWSibling); } static bool isExistingRequest (const compiz::X11::PendingEvent::Ptr &p, XWindowChanges &xwc, unsigned int valueMask) { compiz::X11::PendingConfigureEvent::Ptr pc = boost::static_pointer_cast (p); return pc->matchRequest (xwc, valueMask); } bool PrivateWindow::queryAttributes (XWindowAttributes &attrib) { return configureBuffer->queryAttributes (attrib); } bool PrivateWindow::queryFrameAttributes (XWindowAttributes &attrib) { return configureBuffer->queryFrameAttributes (attrib); } XRectangle * PrivateWindow::queryShapeRectangles (int kind, int *count, int *ordering) { return configureBuffer->queryShapeRectangles (kind, count, ordering); } int PrivateWindow::requestConfigureOnClient (const XWindowChanges &xwc, unsigned int valueMask) { return XConfigureWindow (screen->dpy (), id, valueMask, const_cast (&xwc)); } int PrivateWindow::requestConfigureOnWrapper (const XWindowChanges &xwc, unsigned int valueMask) { return XConfigureWindow (screen->dpy (), wrapper, valueMask, const_cast (&xwc)); } int PrivateWindow::requestConfigureOnFrame (const XWindowChanges &xwc, unsigned int frameValueMask) { XWindowChanges wc = xwc; wc.x = serverFrameGeometry.x (); wc.y = serverFrameGeometry.y (); wc.width = serverFrameGeometry.width (); wc.height = serverFrameGeometry.height (); compiz::X11::PendingEvent::Ptr pc ( new compiz::X11::PendingConfigureEvent ( screen->dpy (), priv->serverFrame, frameValueMask, &wc)); pendingConfigures.add (pc); return XConfigureWindow (screen->dpy (), serverFrame, frameValueMask, &wc); } void PrivateWindow::sendSyntheticConfigureNotify () { window->sendConfigureNotify (); } bool PrivateWindow::hasCustomShape () const { return false; } void PrivateWindow::reconfigureXWindow (unsigned int valueMask, XWindowChanges *xwc) { if (id == screen->root ()) { compLogMessage ("core", CompLogLevelWarn, "attempted to reconfigure root window"); return; } unsigned int frameValueMask = 0; /* Remove redundant bits */ xwc->x = valueMask & CWX ? xwc->x : serverGeometry.x (); xwc->y = valueMask & CWY ? xwc->y : serverGeometry.y (); xwc->width = valueMask & CWWidth ? xwc->width : serverGeometry.width (); xwc->height = valueMask & CWHeight ? xwc->height : serverGeometry.height (); xwc->border_width = valueMask & CWBorderWidth ? xwc->border_width : serverGeometry.border (); /* Don't allow anything that might generate a BadValue */ if (valueMask & CWWidth && !xwc->width) { compLogMessage ("core", CompLogLevelWarn, "Attempted to set < 1 width on a window"); xwc->width = 1; } if (valueMask & CWHeight && !xwc->height) { compLogMessage ("core", CompLogLevelWarn, "Attempted to set < 1 height on a window"); xwc->height = 1; } int dx = valueMask & CWX ? xwc->x - serverGeometry.x () : 0; int dy = valueMask & CWY ? xwc->y - serverGeometry.y () : 0; int dwidth = valueMask & CWWidth ? xwc->width - serverGeometry.width () : 0; int dheight = valueMask & CWHeight ? xwc->height - serverGeometry.height () : 0; /* FIXME: This is a total fallacy for the reparenting case * at least since the client doesn't actually move here, it only * moves within the frame */ if (valueMask & CWX && serverGeometry.x () == xwc->x) valueMask &= ~(CWX); if (valueMask & CWY && serverGeometry.y () == xwc->y) valueMask &= ~(CWY); if (valueMask & CWWidth && serverGeometry.width () == xwc->width) valueMask &= ~(CWWidth); if (valueMask & CWHeight && serverGeometry.height () == xwc->height) valueMask &= ~(CWHeight); if (valueMask & CWBorderWidth && serverGeometry.border () == xwc->border_width) valueMask &= ~(CWBorderWidth); /* check if the sibling is also pending a restack, * if not, then setting this bit is useless */ if (valueMask & CWSibling && window->serverPrev && ROOTPARENT (window->serverPrev) == xwc->sibling) { bool matchingRequest = priv->pendingConfigures.forEachIf (boost::bind (isExistingRequest, _1, *xwc, valueMask)); bool restackPending = window->serverPrev->priv->pendingConfigures.forEachIf (boost::bind (isPendingRestack, _1)); bool remove = matchingRequest; if (!remove) remove = !restackPending; if (remove) valueMask &= ~(CWSibling | CWStackMode); } if (valueMask & CWBorderWidth) serverGeometry.setBorder (xwc->border_width); if (valueMask & CWX) serverGeometry.setX (xwc->x); if (valueMask & CWY) serverGeometry.setY (xwc->y); if (valueMask & CWWidth) serverGeometry.setWidth (xwc->width); if (valueMask & CWHeight) serverGeometry.setHeight (xwc->height); /* Update the server side window list on raise, lower and restack functions. * This function should only recieve stack_mode == Above * but warn incase something else does get through, to make the cause * of any potential misbehaviour obvious. */ if (valueMask & (CWSibling | CWStackMode)) { if (xwc->stack_mode == Above) { if (xwc->sibling) { screen->unhookServerWindow (window); screen->insertServerWindow (window, xwc->sibling); } } else compLogMessage ("core", CompLogLevelWarn, "restack_mode not Above"); } frameValueMask = CWX | CWY | CWWidth | CWHeight | (valueMask & (CWStackMode | CWSibling)); if (serverFrameGeometry.x () == xwc->x - serverGeometry.border () - serverInput.left) frameValueMask &= ~(CWX); if (serverFrameGeometry.y () == xwc->y - serverGeometry.border () - serverInput.top) frameValueMask &= ~(CWY); if (serverFrameGeometry.width () == xwc->width + serverGeometry.border () * 2 + serverInput.left + serverInput.right) frameValueMask &= ~(CWWidth); /* shaded windows are not allowed to have their frame window * height changed (but are allowed to have their client height * changed */ if (shaded) { if (serverFrameGeometry.height () == serverGeometry.border () * 2 + serverInput.top + serverInput.bottom) frameValueMask &= ~(CWHeight); } else { if (serverFrameGeometry.height () == xwc->height + serverGeometry.border () * 2 + serverInput.top + serverInput.bottom) frameValueMask &= ~(CWHeight); } if (valueMask & CWStackMode && xwc->stack_mode != TopIf && xwc->stack_mode != BottomIf && xwc->stack_mode != Opposite && xwc->stack_mode != Above && xwc->stack_mode != Below) { compLogMessage ("core", CompLogLevelWarn, "Invalid stack mode %i", xwc->stack_mode); valueMask &= ~(CWStackMode | CWSibling); } /* Don't allow anything that might cause a BadMatch error */ if (valueMask & CWSibling && !(valueMask & CWStackMode)) { compLogMessage ("core", CompLogLevelWarn, "Didn't specify a CWStackMode for CWSibling"); valueMask &= ~CWSibling; } if (valueMask & CWSibling && xwc->sibling == (serverFrame ? serverFrame : id)) { compLogMessage ("core", CompLogLevelWarn, "Can't restack a window relative to itself"); valueMask &= ~CWSibling; } if (valueMask & CWBorderWidth && attrib.c_class == InputOnly) { compLogMessage ("core", CompLogLevelWarn, "Cannot set border_width of an input_only window"); valueMask &= ~CWBorderWidth; } if (valueMask & CWSibling) { CompWindow *sibling = screen->findTopLevelWindow (xwc->sibling); if (!sibling) { compLogMessage ("core", CompLogLevelWarn, "Attempted to restack relative to 0x%x which is "\ "not a child of the root window or a window compiz owns", static_cast (xwc->sibling)); valueMask &= ~(CWSibling | CWStackMode); } else if (sibling->frame () && xwc->sibling != sibling->frame ()) { compLogMessage ("core", CompLogLevelWarn, "Attempted to restack relative to 0x%x which is "\ "not a child of the root window", static_cast (xwc->sibling)); valueMask &= ~(CWSibling | CWStackMode); } } /* Can't set the border width of frame windows */ frameValueMask &= ~(CWBorderWidth); if (frameValueMask & CWX) serverFrameGeometry.setX (xwc->x - serverGeometry.border () - serverInput.left); if (frameValueMask & CWY) serverFrameGeometry.setY (xwc->y -serverGeometry.border () - serverInput.top); if (frameValueMask & CWWidth) serverFrameGeometry.setWidth (xwc->width + serverGeometry.border () * 2 + serverInput.left + serverInput.right); if (shaded) { if (frameValueMask & CWHeight) serverFrameGeometry.setHeight (serverGeometry.border () * 2 + serverInput.top + serverInput.bottom); } else if (frameValueMask & CWHeight) serverFrameGeometry.setHeight (xwc->height + serverGeometry.border () * 2 + serverInput.top + serverInput.bottom); if (serverFrame) { if (frameValueMask) priv->configureBuffer->pushFrameRequest (*xwc, frameValueMask); valueMask = frameValueMask & (CWWidth | CWHeight); /* If the frame has changed position (eg, serverInput.top * or serverInput.left have changed) then we also need to * update the client and wrapper position */ if (lastServerInput.left != serverInput.left) valueMask |= CWX; if (lastServerInput.top != serverInput.top) valueMask |= CWY; /* Calculate frame extents and protect against underflow */ const unsigned int lastWrapperWidth = std::max (0, serverFrameGeometry.width () - (lastServerInput.right + lastServerInput.left)); const unsigned int lastWrapperHeight = std::max (0, serverFrameGeometry.height () - (lastServerInput.bottom + lastServerInput.top)); const unsigned int wrapperWidth = std::max (0, serverFrameGeometry.width () - (serverInput.right + serverInput.left)); const unsigned int wrapperHeight = std::max (0, serverFrameGeometry.height () - (serverInput.bottom + serverInput.top)); if (lastWrapperWidth != wrapperWidth) valueMask |= CWWidth; if (lastWrapperHeight != wrapperHeight) valueMask |= CWHeight; if (valueMask) { xwc->x = serverInput.left; xwc->y = serverInput.top; priv->configureBuffer->pushWrapperRequest (*xwc, valueMask); } } /* Client is reparented, the only things that can change * are the width, height and border width */ if (serverFrame) valueMask &= (CWWidth | CWHeight | CWBorderWidth); if (valueMask) priv->configureBuffer->pushClientRequest (*xwc, valueMask); /* Send the synthetic configure notify * after the real configure notify arrives * (ICCCM s4.1.5) */ if (serverFrame) window->sendConfigureNotify (); /* When updating plugins we care about * the absolute position */ if (dx) valueMask |= CWX; if (dy) valueMask |= CWY; if (dwidth) valueMask |= CWWidth; if (dheight) valueMask |= CWHeight; if (!attrib.override_redirect) { if (valueMask & (CWWidth | CWHeight)) { updateRegion (); window->resizeNotify (dx, dy, dwidth, dheight); } else if (valueMask & (CWX | CWY)) { region.translate (dx, dy); inputRegion.translate (dx, dy); if (!frameRegion.isEmpty ()) frameRegion.translate (dx, dy); if (dx || dy) { window->moveNotify (dx, dy, priv->nextMoveImmediate); priv->nextMoveImmediate = true; } } } } bool PrivateWindow::stackDocks (CompWindow *w, CompWindowList &updateList, XWindowChanges *xwc, unsigned int *mask, const ServerLock &lock) { CompWindow *firstFullscreenWindow = NULL; CompWindow *belowDocks = NULL; bool currentlyManaged, visible, ancestorToClient, acceptableType; foreach (CompWindow *dw, screen->serverWindows ()) { /* fullscreen window found */ if (firstFullscreenWindow) { currentlyManaged = dw->priv->managed && !dw->priv->unmanaging; visible = !(dw->state () & CompWindowStateHiddenMask); ancestorToClient = PrivateWindow::isAncestorTo (w, dw); acceptableType = !(dw->type () & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)); /* If there is another toplevel window above the fullscreen one * then we need to stack above that */ if (currentlyManaged && visible && acceptableType && !ancestorToClient && !dw->overrideRedirect () && dw->isViewable () && existsOnServer (dw, lock)) belowDocks = dw; } else if (dw->type () & CompWindowTypeFullscreenMask) { /* First fullscreen window found when checking up the stack * now go back down to find a suitable candidate client * window to put the docks above */ firstFullscreenWindow = dw; for (CompWindow *dww = dw->serverPrev; dww; dww = dww->serverPrev) { currentlyManaged = dw->priv->managed && !dw->priv->unmanaging; visible = !(dw->state () & CompWindowStateHiddenMask); acceptableType = !(dw->type () & (CompWindowTypeFullscreenMask | CompWindowTypeDockMask)); if (currentlyManaged && visible && acceptableType && !dww->overrideRedirect () && dww->isViewable () && existsOnServer (dww, lock)) { belowDocks = dww; break; } } } } if (belowDocks) { *mask = CWSibling | CWStackMode; xwc->sibling = ROOTPARENT (belowDocks); /* Collect all dock windows first */ foreach (CompWindow *dw, screen->serverWindows ()) if (dw->priv->type & CompWindowTypeDockMask) updateList.push_front (dw); return true; } return false; } bool PrivateWindow::stackTransients (CompWindow *w, CompWindow *avoid, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock) { Window clientLeader = w->priv->clientLeader; if (w->priv->transientFor || w->priv->isGroupTransient (clientLeader)) clientLeader = None; for (CompWindow *t = screen->serverWindows ().back (); t; t = t->serverPrev) { if (t == w || t == avoid) continue; if (t->priv->transientFor == w->priv->id || t->priv->isGroupTransient (clientLeader)) { if (!stackTransients (t, avoid, xwc, updateList, lock) || xwc->sibling == t->priv->id || (t->priv->serverFrame && xwc->sibling == t->priv->serverFrame)) return false; if ((t->priv->mapNum || t->priv->pendingMaps) && existsOnServer (t, lock)) updateList.push_back (t); } } return true; } void PrivateWindow::stackAncestors (CompWindow *w, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock) { CompWindow *transient = NULL; if (w->priv->transientFor) transient = screen->findWindow (w->priv->transientFor); if (transient && xwc->sibling != transient->priv->id && (!transient->priv->serverFrame || xwc->sibling != transient->priv->serverFrame)) { CompWindow *ancestor = screen->findWindow (w->priv->transientFor); if (ancestor) { if (!stackTransients (ancestor, w, xwc, updateList, lock) || ancestor->priv->type & CompWindowTypeDesktopMask || (ancestor->priv->type & CompWindowTypeDockMask && !(w->priv->type & CompWindowTypeDockMask))) return; if ((ancestor->priv->mapNum || ancestor->priv->pendingMaps) && existsOnServer (ancestor, lock)) updateList.push_back (ancestor); stackAncestors (ancestor, xwc, updateList, lock); } } else if (w->priv->isGroupTransient (w->priv->clientLeader)) { for (CompWindow *a = screen->serverWindows ().back (); a; a = a->serverPrev) { if (a->priv->clientLeader == w->priv->clientLeader && a->priv->transientFor == None && !a->priv->isGroupTransient (w->priv->clientLeader)) { if (xwc->sibling == a->priv->id || (a->priv->serverFrame && xwc->sibling == a->priv->serverFrame) || !stackTransients (a, w, xwc, updateList, lock)) break; if (a->priv->type & CompWindowTypeDesktopMask) continue; if (a->priv->type & CompWindowTypeDockMask && !(w->priv->type & CompWindowTypeDockMask)) break; if ((a->priv->mapNum || a->priv->pendingMaps) && existsOnServer (a, lock)) updateList.push_back (a); } } } } void CompWindow::configureXWindow (unsigned int valueMask, XWindowChanges *xwc) { if (valueMask & (CWSibling | CWStackMode)) compLogMessage ("core", CompLogLevelWarn, "use CompWindow::restackAndConfigureXWindow " \ "while holding a ServerLock from the time the "\ "sibling is determined to the end of that operation "\ "to avoid race conditions when restacking relative "\ "to destroyed windows for which we have not yet "\ "received a DestroyNotify for"); if (priv->id) priv->reconfigureXWindow (valueMask, xwc); } void CompWindow::restackAndConfigureXWindow (unsigned int valueMask, XWindowChanges *xwc, const ServerLock &lock) { if (priv->managed && (valueMask & (CWSibling | CWStackMode))) { CompWindowList transients; CompWindowList ancestors; CompWindowList docks; /* Since the window list is being reordered in reconfigureXWindow the list of windows which need to be restacked must be stored first. The windows are stacked in the opposite order than they were previously stacked, in order that they are above xwc->sibling so that when compiz gets the ConfigureNotify event it doesn't have to restack all the windows again. */ /* transient children above */ if (PrivateWindow::stackTransients (this, NULL, xwc, transients, lock)) { /* ancestors, siblings and sibling transients below */ PrivateWindow::stackAncestors (this, xwc, ancestors, lock); for (CompWindowList::reverse_iterator w = ancestors.rbegin (); w != ancestors.rend (); ++w) { (*w)->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc); xwc->sibling = ROOTPARENT (*w); } this->priv->reconfigureXWindow (valueMask, xwc); xwc->sibling = ROOTPARENT (this); for (CompWindowList::reverse_iterator w = transients.rbegin (); w != transients.rend (); ++w) { (*w)->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc); xwc->sibling = ROOTPARENT (*w); } if (PrivateWindow::stackDocks (this, docks, xwc, &valueMask, lock)) { Window sibling = xwc->sibling; xwc->stack_mode = Above; /* Then update the dock windows */ foreach (CompWindow *dw, docks) { xwc->sibling = sibling; dw->priv->reconfigureXWindow (valueMask, xwc); } } } } else if (priv->id) priv->reconfigureXWindow (valueMask, xwc); } int PrivateWindow::addWindowSizeChanges (XWindowChanges *xwc, CompWindow::Geometry old) { int mask = 0; CompPoint viewport; if (old.intersects (CompRect (0, 0, screen->width (), screen->height ())) && !(state & CompWindowStateMaximizedHorzMask || state & CompWindowStateMaximizedVertMask)) viewport = screen->vp (); else if ((state & CompWindowStateMaximizedHorzMask || state & CompWindowStateMaximizedVertMask) && window->moved ()) viewport = initialViewport; else screen->viewportForGeometry (old, viewport); if (viewport.x () > screen->vpSize ().width () - 1) viewport.setX (screen->vpSize ().width () - 1); if (viewport.y () > screen->vpSize ().height () - 1) viewport.setY (screen->vpSize ().height () - 1); int x = (viewport.x () - screen->vp ().x ()) * screen->width (); int y = (viewport.y () - screen->vp ().y ()) * screen->height (); CompWindow::Geometry old_relative_to_vp(old.x () - x, old.y () - y, old.width (), old.height (), old.border ()); int outputDev = screen->outputDeviceForGeometry (old_relative_to_vp); CompOutput *output = &screen->outputDevs ().at (outputDev); /* * output is now the correct output for the given geometry. * There used to be a lot more logic here to handle the rare special * case of maximizing a window whose hints say it is too large to fit * the output and choose a different one. However that logic was a bad * idea because: * (1) It's confusing to the user to auto-magically move a window * between monitors when they didn't ask for it. So don't. * (2) In the worst case where the window can't go small enough to fit * the output, they can simply move it with Alt+drag, Alt+F7 or * expo. * Not moving the window at all is much less annoying than moving it when * the user never asked to. */ CompRect workArea = output->workArea (); if (type & CompWindowTypeFullscreenMask) { saveGeometry (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); if (fullscreenMonitorsSet) { xwc->x = x + fullscreenMonitorRect.x (); xwc->y = y + fullscreenMonitorRect.y (); xwc->width = fullscreenMonitorRect.width (); xwc->height = fullscreenMonitorRect.height (); } else { xwc->x = x + output->x (); xwc->y = y + output->y (); xwc->width = output->width (); xwc->height = output->height (); } xwc->border_width = 0; mask |= CWX | CWY | CWWidth | CWHeight | CWBorderWidth; } else { mask |= restoreGeometry (xwc, CWBorderWidth); if (state & CompWindowStateMaximizedVertMask) { saveGeometry (CWY | CWHeight); xwc->height = workArea.height () - border.top - border.bottom - old.border () * 2; mask |= CWHeight; } else mask |= restoreGeometry (xwc, CWY | CWHeight); if (state & CompWindowStateMaximizedHorzMask) { saveGeometry (CWX | CWWidth); xwc->width = workArea.width () - border.left - border.right - old.border () * 2; mask |= CWWidth; } else mask |= restoreGeometry (xwc, CWX | CWWidth); /* Check to see if a monitor has disappeared that had a maximized window and if so, * adjust the window to restore in the current viewport instead of the * coordinates of a different viewport. */ if (window->moved () && !(state & CompWindowStateMaximizedVertMask || state & CompWindowStateMaximizedHorzMask)) { if (xwc->x > screen->width () || xwc->y > screen->height ()) { /* The removed monitor may have had a much different resolution than the * the current monitor, so let's just orient the window in the top left * of the workarea. */ xwc->x = workArea.x () + window->border ().left; xwc->y = workArea.y () + window->border ().top; if (xwc->width > workArea.width ()) xwc->width = workArea.width () - (window->border ().left + window->border ().right); if (xwc->height > workArea.height ()) xwc->height = workArea.height () - (window->border ().top + window->border ().bottom); } window->priv->moved = false; } /* constrain window width if smaller than minimum width */ if (!(mask & CWWidth) && (int) old.width () < sizeHints.min_width) { xwc->width = sizeHints.min_width; mask |= CWWidth; } /* constrain window width if greater than maximum width */ if (!(mask & CWWidth) && (int) old.width () > sizeHints.max_width) { xwc->width = sizeHints.max_width; mask |= CWWidth; } /* constrain window height if smaller than minimum height */ if (!(mask & CWHeight) && (int) old.height () < sizeHints.min_height) { xwc->height = sizeHints.min_height; mask |= CWHeight; } /* constrain window height if greater than maximum height */ if (!(mask & CWHeight) && (int) old.height () > sizeHints.max_height) { xwc->height = sizeHints.max_height; mask |= CWHeight; } if (mask & (CWWidth | CWHeight)) { int max; int width = (mask & CWWidth) ? xwc->width : old.width (); int height = (mask & CWHeight) ? xwc->height : old.height (); xwc->width = old.width (); xwc->height = old.height (); window->constrainNewWindowSize (width, height, &width, &height); if (width != (int) old.width ()) { mask |= CWWidth; xwc->width = width; } else mask &= ~CWWidth; if (height != (int) old.height ()) { mask |= CWHeight; xwc->height = height; } else mask &= ~CWHeight; if (state & CompWindowStateMaximizedVertMask) { /* If the window is still offscreen, then we need to constrain it * by the gravity value (so that the corner that the gravity specifies * is 'anchored' to that edge of the workarea) */ xwc->y = y + workArea.y () + border.top; mask |= CWY; switch (priv->sizeHints.win_gravity) { case SouthWestGravity: case SouthEastGravity: case SouthGravity: /* Shift the window so that the bottom meets the top of the bottom */ height = xwc->height + old.border () * 2; max = y + workArea.bottom (); if (xwc->y + xwc->height + border.bottom > max) { xwc->y = max - height - border.bottom; mask |= CWY; } break; /* TODO: check if this is correct: * For EastGravity, WestGravity and CenterGravity we default to the top * of the window since the user should at least be able to close it * (but not for SouthGravity, SouthWestGravity and SouthEastGravity since * that indicates that the application has requested positioning in that area) */ case EastGravity: case WestGravity: case CenterGravity: case NorthWestGravity: case NorthEastGravity: case NorthGravity: default: /* Shift the window so that the top meets the top of the screen */ break; } } if (state & CompWindowStateMaximizedHorzMask) { xwc->x = x + workArea.x () + border.left; mask |= CWX; switch (priv->sizeHints.win_gravity) { case NorthEastGravity: case SouthEastGravity: case EastGravity: width = xwc->width + old.border () * 2; max = x + workArea.right (); if (old.x () + (int) old.width () + border.right > max) { xwc->x = max - width - border.right; mask |= CWX; } else if (old.x () + width + border.right > max) { xwc->x = x + workArea.x () + (workArea.width () - border.left - width - border.right) / 2 + border.left; mask |= CWX; } /* TODO: check if this is correct, note that there is no break here: * For NorthGravity, SouthGravity and CenterGravity we default to the top * of the window since the user should at least be able to close it * (but not for SouthGravity, SouthWestGravity and SouthEastGravity since * that indicates that the application has requested positioning in that area) */ case NorthGravity: case SouthGravity: case CenterGravity: case NorthWestGravity: case SouthWestGravity: case WestGravity: default: break; } } } } if ((mask & CWX) && (xwc->x == old.x ())) mask &= ~CWX; if ((mask & CWY) && (xwc->y == old.y ())) mask &= ~CWY; if ((mask & CWWidth) && (xwc->width == (int) old.width ())) mask &= ~CWWidth; if ((mask & CWHeight) && (xwc->height == (int) old.height ())) mask &= ~CWHeight; return mask; } unsigned int PrivateWindow::adjustConfigureRequestForGravity (XWindowChanges *xwc, unsigned int xwcm, int gravity, int direction) { unsigned int mask = 0; int newX = xwc->x; int newY = xwc->y; if (xwcm & (CWX | CWWidth)) { switch (gravity) { case NorthWestGravity: case WestGravity: case SouthWestGravity: if (xwcm & CWX) newX += priv->border.left * direction; break; case NorthGravity: case CenterGravity: case SouthGravity: if (xwcm & CWX) newX -= (xwc->width / 2 - priv->border.left + (priv->border.left + priv->border.right) / 2) * direction; else newX -= (xwc->width - priv->serverGeometry.width ()) * direction; break; case NorthEastGravity: case EastGravity: case SouthEastGravity: if (xwcm & CWX) newX -= xwc->width + priv->border.right * direction; else newX -= (xwc->width - priv->serverGeometry.width ()) * direction; break; case StaticGravity: default: break; } } if (xwcm & (CWY | CWHeight)) { switch (gravity) { case NorthWestGravity: case NorthGravity: case NorthEastGravity: if (xwcm & CWY) newY = xwc->y + priv->border.top * direction; break; case WestGravity: case CenterGravity: case EastGravity: if (xwcm & CWY) newY -= (xwc->height / 2 - priv->border.top + (priv->border.top + priv->border.bottom) / 2) * direction; else newY -= ((xwc->height - priv->serverGeometry.height ()) / 2) * direction; break; case SouthWestGravity: case SouthGravity: case SouthEastGravity: if (xwcm & CWY) newY -= xwc->height + priv->border.bottom * direction; else newY -= (xwc->height - priv->serverGeometry.height ()) * direction; break; case StaticGravity: default: break; } } if (newX != xwc->x) { xwc->x += (newX - xwc->x); mask |= CWX; } if (newY != xwc->y) { xwc->y += (newY - xwc->y); mask |= CWY; } return mask; } void CompWindow::moveResize (XWindowChanges *xwc, unsigned int xwcm, int gravity, unsigned int source) { bool placed = false; xwcm &= (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); if (xwcm & (CWX | CWY) && priv->sizeHints.flags & (USPosition | PPosition)) placed = true; if (gravity == 0) gravity = priv->sizeHints.win_gravity; if (!(xwcm & CWX)) xwc->x = priv->serverGeometry.x (); if (!(xwcm & CWY)) xwc->y = priv->serverGeometry.y (); if (!(xwcm & CWWidth)) xwc->width = priv->serverGeometry.width (); if (!(xwcm & CWHeight)) xwc->height = priv->serverGeometry.height (); if (xwcm & (CWWidth | CWHeight)) { int width, height; if (constrainNewWindowSize (xwc->width, xwc->height, &width, &height)) { if (width != xwc->width) xwcm |= CWWidth; if (height != xwc->height) xwcm |= CWHeight; xwc->width = width; xwc->height = height; } } xwcm |= priv->adjustConfigureRequestForGravity (xwc, xwcm, gravity, 1); validateResizeRequest (xwcm, xwc, source); /* when horizontally maximized only allow width changes added by addWindowSizeChanges */ if (priv->state & CompWindowStateMaximizedHorzMask) xwcm &= ~CWWidth; /* when vertically maximized only allow height changes added by addWindowSizeChanges */ if (priv->state & CompWindowStateMaximizedVertMask) xwcm &= ~CWHeight; xwcm |= priv->addWindowSizeChanges (xwc, Geometry (xwc->x, xwc->y, xwc->width, xwc->height, xwc->border_width)); /* check if the new coordinates are useful and valid (different to current size); if not, we have to clear them to make sure we send a synthetic ConfigureNotify event if all coordinates match the server coordinates */ if (xwc->x == priv->serverGeometry.x ()) xwcm &= ~CWX; if (xwc->y == priv->serverGeometry.y ()) xwcm &= ~CWY; if (xwc->width == (int) priv->serverGeometry.width ()) xwcm &= ~CWWidth; if (xwc->height == (int) priv->serverGeometry.height ()) xwcm &= ~CWHeight; if (xwc->border_width == (int) priv->serverGeometry.border ()) xwcm &= ~CWBorderWidth; /* update saved window coordinates - if CWX or CWY is set for fullscreen or maximized windows after addWindowSizeChanges, it should be pretty safe to assume that the saved coordinates should be updated too, e.g. because the window was moved to another viewport by some client */ if ((xwcm & CWX) && (priv->saveMask & CWX)) priv->saveWc.x += (xwc->x - priv->serverGeometry.x ()); if ((xwcm & CWY) && (priv->saveMask & CWY)) priv->saveWc.y += (xwc->y - priv->serverGeometry.y ()); if (priv->mapNum && (xwcm & (CWWidth | CWHeight))) sendSyncRequest (); if (xwcm) configureXWindow (xwcm, xwc); else /* we have to send a configure notify on ConfigureRequest events if we decide not to do anything according to ICCCM 4.1.5 */ sendConfigureNotify (); if (placed) priv->placed = true; priv->initialViewport = defaultViewport (); } bool PrivateWindow::updateSize () { if (window->overrideRedirect () || !managed) return false; XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask = priv->addWindowSizeChanges (&xwc, priv->serverGeometry); if (mask) { if (priv->mapNum && (mask & (CWWidth | CWHeight))) window->sendSyncRequest (); window->configureXWindow (mask, &xwc); return true; } return false; } int PrivateWindow::addWindowStackChanges (XWindowChanges *xwc, CompWindow *sibling, const ServerLock &lock) { int mask = 0; if (!sibling || sibling->priv->id != id) { /* Alow requests to go on top of serverPrev * if serverPrev was recently restacked */ if (window->serverPrev) { if (!sibling && id) { XWindowChanges lxwc = XWINDOWCHANGES_INIT; unsigned int valueMask = CWStackMode; lxwc.stack_mode = Below; if (serverFrame) { compiz::X11::PendingEvent::Ptr pc (new compiz::X11::PendingConfigureEvent ( screen->dpy (), serverFrame, valueMask, &lxwc)); pendingConfigures.add (pc); } /* Below with no sibling puts the window at the bottom * of the stack */ XConfigureWindow (screen->dpy (), ROOTPARENT (window), valueMask, &lxwc); /* Update the list of windows last sent to the server */ screen->unhookServerWindow (window); screen->insertServerWindow (window, 0); } else if (sibling) { bool matchingRequest = priv->pendingConfigures.forEachIf (boost::bind (isExistingRequest, _1, *xwc, (CWStackMode | CWSibling))); bool restackPending = window->serverPrev->priv->pendingConfigures.forEachIf (boost::bind (isPendingRestack, _1)); bool processAnyways = restackPending; if (matchingRequest) processAnyways = false; if (sibling->priv->id != window->serverPrev->priv->id || processAnyways) { mask |= CWSibling | CWStackMode; xwc->stack_mode = Above; xwc->sibling = ROOTPARENT (sibling); } } } else if (sibling) { mask |= CWSibling | CWStackMode; xwc->stack_mode = Above; xwc->sibling = ROOTPARENT (sibling); } } return mask; } void CompWindow::raise () { XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask; bool aboveFs = false; /* an active fullscreen window should be raised over all other windows in its layer */ if (priv->type & CompWindowTypeFullscreenMask && priv->id == screen->activeWindow ()) aboveFs = true; for (CompWindow *pw = serverPrev; pw; pw = pw->serverPrev) if (pw->priv->type & CompWindowTypeFullscreenMask && priv->id == screen->activeWindow ()) aboveFs = true; else break; ServerLock lock (screen->serverGrabInterface ()); mask = priv->addWindowStackChanges (&xwc, PrivateWindow::findSiblingBelow (this, aboveFs, lock), lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); } CompWindow * CompScreenImpl::focusTopMostWindow () { using ::compiz::private_screen::WindowManager; CompWindow *focus = NULL; WindowManager::reverse_iterator it = windowManager.rserverBegin (); for (; it != windowManager.rserverEnd (); ++it) { CompWindow *w = *it; if (w->type () & CompWindowTypeDockMask) continue; if (w->focus ()) { focus = w; break; } } if (focus) { if (focus->id () != privateScreen.orphanData.activeWindow) focus->moveInputFocusTo (); } else XSetInputFocus (privateScreen.dpy, privateScreen.rootWindow (), RevertToPointerRoot, CurrentTime); return focus; } void CompWindow::lower () { XWindowChanges xwc = XWINDOWCHANGES_INIT; ServerLock lock (screen->serverGrabInterface ()); int mask = priv->addWindowStackChanges (&xwc, PrivateWindow::findLowestSiblingBelow (this, lock), lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); /* when lowering a window, focus the topmost window if the click-to-focus option is on */ if ((screen->getCoreOptions ().optionGetClickToFocus ())) { CompWindow *focusedWindow = screen->focusTopMostWindow (); /* if the newly focused window is a desktop window, give the focus back to w */ if (focusedWindow && focusedWindow->type () & CompWindowTypeDesktopMask) moveInputFocusTo (); } } void CompWindow::restackAbove (CompWindow *sibling) { ServerLock lock (screen->serverGrabInterface ()); for (; sibling; sibling = sibling->serverNext) if (PrivateWindow::validSiblingBelow (this, sibling, lock)) break; if (sibling) { XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask = priv->addWindowStackChanges (&xwc, sibling, lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); } } /* finds the highest window under sibling we can stack above */ CompWindow * PrivateWindow::findValidStackSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock) { CompWindow *lowest, *last, *p; /* check whether we're allowed to stack under a sibling by finding * the above 'sibling' and checking whether or not we're allowed * to stack under that - if not, then there is no valid sibling * underneath it */ for (p = sibling; p; p = p->serverNext) if (!avoidStackingRelativeTo (p, lock) && !validSiblingBelow (p, w, lock)) return NULL; else break; /* get lowest sibling we're allowed to stack above */ lowest = last = findLowestSiblingBelow (w, lock); /* walk from bottom up */ for (p = screen->serverWindows ().front (); p; p = p->serverNext) { /* stop walking when we reach the sibling we should try to stack below */ if (p == sibling) return lowest; /* skip windows that we should avoid */ if (w == p || avoidStackingRelativeTo (p, lock)) continue; if (validSiblingBelow (w, p, lock) && last == lowest) /* update lowest as we find windows below sibling that we're allowed to stack above. last window must be equal to the lowest as we shouldn't update lowest if we passed an invalid window */ lowest = p; /* update last pointer */ last = p; } return lowest; } void CompWindow::restackBelow (CompWindow *sibling) { XWindowChanges xwc = XWINDOWCHANGES_INIT; ServerLock lock (screen->serverGrabInterface ()); unsigned int mask = priv->addWindowStackChanges (&xwc, PrivateWindow::findValidStackSiblingBelow (this, sibling, lock), lock); if (mask) restackAndConfigureXWindow (mask, &xwc, lock); } namespace { void addSizeChangesSyncAndReconfigure (PrivateWindow *priv, XWindowChanges &xwc, unsigned int mask, ServerLock *lock) { mask |= priv->addWindowSizeChanges (&xwc, priv->serverGeometry); if (priv->mapNum && (mask & (CWWidth | CWHeight))) priv->window->sendSyncRequest (); if (mask) { if (lock) priv->window->restackAndConfigureXWindow (mask, &xwc, *lock); else priv->window->configureXWindow (mask, &xwc); } } } void CompWindow::updateAttributes (CompStackingUpdateMode stackingMode) { if (overrideRedirect () || !priv->managed) return; XWindowChanges xwc = XWINDOWCHANGES_INIT; int mask = 0; if (priv->state & CompWindowStateShadedMask && !priv->shaded) { windowNotify (CompWindowNotifyShade); priv->hide (); } else if (priv->shaded) { windowNotify (CompWindowNotifyUnshade); priv->show (); } if (stackingMode != CompStackingUpdateModeNone) { CompWindow *sibling; bool aboveFs = (stackingMode == CompStackingUpdateModeAboveFullscreen); if (priv->type & CompWindowTypeFullscreenMask && /* put active or soon-to-be-active fullscreen windows over all others in their layer */ (priv->id == screen->activeWindow () || priv->id == screen->getNextActiveWindow ())) aboveFs = true; /* put windows that are just mapped, over fullscreen windows */ if (stackingMode == CompStackingUpdateModeInitialMap) aboveFs = true; ServerLock lock (screen->serverGrabInterface ()); sibling = PrivateWindow::findSiblingBelow (this, aboveFs, lock); if (sibling && (stackingMode == CompStackingUpdateModeInitialMapDeniedFocus)) { CompWindow *p; for (p = sibling; p; p = p->serverPrev) if (p->priv->id == screen->activeWindow ()) break; /* window is above active window so we should lower it, * assuing that is allowed (if, for example, our window has * the "above" state, then lowering beneath the active * window may not be allowed). */ if (p && PrivateWindow::validSiblingBelow (p, this, lock)) { p = PrivateWindow::findValidStackSiblingBelow (this, p, lock); /* if we found a valid sibling under the active window, it's our new sibling we want to stack above */ if (p) sibling = p; } } /* If sibling is NULL, then this window will go on the bottom * of the stack */ mask |= priv->addWindowStackChanges (&xwc, sibling, lock); addSizeChangesSyncAndReconfigure (priv, xwc, mask, &lock); } else addSizeChangesSyncAndReconfigure (priv, xwc, mask, NULL); } void PrivateWindow::ensureWindowVisibility () { if (struts || attrib.override_redirect) return; if (type & (CompWindowTypeDockMask | CompWindowTypeFullscreenMask | CompWindowTypeUnknownMask)) return; int x1 = screen->workArea ().x () - screen->width () * screen->vp ().x (); int y1 = screen->workArea ().y () - screen->height () * screen->vp ().y (); int x2 = x1 + screen->workArea ().width () + screen->vpSize ().width () * screen->width (); int y2 = y1 + screen->workArea ().height () + screen->vpSize ().height () * screen->height (); int dx = 0; int width = serverGeometry.widthIncBorders (); // TODO: Eliminate those magic numbers below if (serverGeometry.x () - serverInput.left >= x2) dx = (x2 - 25) - serverGeometry.x (); else if (serverGeometry.x () + width + serverInput.right <= x1) dx = (x1 + 25) - (serverGeometry.x () + width); int dy = 0; int height = serverGeometry.heightIncBorders (); if (serverGeometry.y () - serverInput.top >= y2) dy = (y2 - 25) - serverGeometry.y (); else if (serverGeometry.y () + height + serverInput.bottom <= y1) dy = (y1 + 25) - (serverGeometry.y () + height); if (dx || dy) { XWindowChanges xwc = XWINDOWCHANGES_INIT; xwc.x = serverGeometry.x () + dx; xwc.y = serverGeometry.y () + dy; window->configureXWindow (CWX | CWY, &xwc); } } void PrivateWindow::reveal () { if (window->minimized ()) window->unminimize (); } void PrivateWindow::revealAncestors (CompWindow *w, CompWindow *transient) { if (isAncestorTo (transient, w)) { screen->forEachWindow (boost::bind (revealAncestors, _1, w)); w->priv->reveal (); } } void CompWindow::activate () { WRAPABLE_HND_FUNCTN (activate) screen->setCurrentDesktop (priv->desktop); screen->forEachWindow (boost::bind (PrivateWindow::revealAncestors, _1, this)); priv->reveal (); screen->leaveShowDesktopMode (this); if (priv->state & CompWindowStateHiddenMask) { priv->state &= ~CompWindowStateShadedMask; if (priv->shaded) priv->show (); } if (priv->state & CompWindowStateHiddenMask || !onCurrentDesktop ()) return; priv->ensureWindowVisibility (); updateAttributes (CompStackingUpdateModeAboveFullscreen); moveInputFocusTo (); } #define PVertResizeInc (1 << 0) #define PHorzResizeInc (1 << 1) bool CompWindow::constrainNewWindowSize (int width, int height, int *newWidth, int *newHeight) { CompSize size (width, height); long ignoredHints = 0; long ignoredResizeHints = 0; if (screen->getCoreOptions ().optionGetIgnoreHintsWhenMaximized ()) { ignoredHints |= PAspect; if (priv->state & CompWindowStateMaximizedHorzMask) ignoredResizeHints |= PHorzResizeInc; if (priv->state & CompWindowStateMaximizedVertMask) ignoredResizeHints |= PVertResizeInc; } CompSize ret = compiz::window::constrainment::constrainToHints (priv->sizeHints, size, ignoredHints, ignoredResizeHints); *newWidth = ret.width (); *newHeight = ret.height (); return ret != size; } void CompWindow::hide () { priv->hidden = true; priv->hide (); } void CompWindow::show () { priv->hidden = false; priv->show (); } void PrivateWindow::hide () { if (!managed) return; bool onDesktop = window->onCurrentDesktop (); if (!window->minimized () && !inShowDesktopMode && !hidden && onDesktop) { if (state & CompWindowStateShadedMask) shaded = true; else return; } else { shaded = false; if ((state & CompWindowStateShadedMask) && serverFrame) XUnmapWindow (screen->dpy (), serverFrame); } if (!pendingMaps && !window->isViewable ()) return; window->windowNotify (CompWindowNotifyHide); ++pendingUnmaps; if (serverFrame && !shaded) XUnmapWindow (screen->dpy (), serverFrame); XUnmapWindow (screen->dpy (), id); if (window->minimized () || inShowDesktopMode || hidden || shaded) window->changeState (state | CompWindowStateHiddenMask); if (shaded && id == screen->activeWindow ()) window->moveInputFocusTo (); } void PrivateWindow::show () { if (!managed) return; bool onDesktop = window->onCurrentDesktop (); if (minimized || inShowDesktopMode || hidden || !onDesktop) { /* no longer hidden but not on current desktop */ if (!minimized && !inShowDesktopMode && !hidden) window->changeState (state & ~CompWindowStateHiddenMask); return; } /* transition from minimized to shaded */ if (state & CompWindowStateShadedMask) { shaded = true; if (serverFrame) XMapWindow (screen->dpy (), serverFrame); updateFrameWindow (); return; } window->windowNotify (CompWindowNotifyShow); ++pendingMaps; if (serverFrame) { XMapWindow (screen->dpy (), serverFrame); XMapWindow (screen->dpy (), wrapper); } XMapWindow (screen->dpy (), id); window->changeState (state & ~CompWindowStateHiddenMask); screen->setWindowState (state, id); } void PrivateWindow::minimizeTransients (CompWindow *w, CompWindow *ancestor) { if (w->priv->transientFor == ancestor->priv->id || w->priv->isGroupTransient (ancestor->priv->clientLeader)) w->minimize (); } void CompWindow::minimize () { WRAPABLE_HND_FUNCTN (minimize); if (!priv->managed) return; if (!priv->minimized) { windowNotify (CompWindowNotifyMinimize); priv->minimized = true; screen->forEachWindow ( boost::bind (PrivateWindow::minimizeTransients, _1, this)); priv->hide (); } } void PrivateWindow::unminimizeTransients (CompWindow *w, CompWindow *ancestor) { if (w->priv->transientFor == ancestor->priv->id || w->priv->isGroupTransient (ancestor->priv->clientLeader)) w->unminimize (); } void CompWindow::unminimize () { WRAPABLE_HND_FUNCTN (unminimize); if (priv->minimized) { windowNotify (CompWindowNotifyUnminimize); priv->minimized = false; priv->show (); screen->forEachWindow ( boost::bind (PrivateWindow::unminimizeTransients, _1, this)); } } void CompWindow::maximize (unsigned int state) { if (overrideRedirect ()) return; priv->initialViewport = screen->vp (); state = constrainWindowState (state, priv->actions); state &= MAXIMIZE_STATE; if (state == (priv->state & MAXIMIZE_STATE)) return; state |= (priv->state & ~MAXIMIZE_STATE); changeState (state); updateAttributes (CompStackingUpdateModeNone); } bool PrivateWindow::getUserTime (Time& time) { Atom actual; int format; unsigned long n, left; unsigned char *data; bool retval = false; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmUserTime, 0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) { CARD32 value; memcpy (&value, data, sizeof (CARD32)); retval = true; time = (Time) value; } XFree ((void *) data); } return retval; } void PrivateWindow::setUserTime (Time time) { CARD32 value = (CARD32) time; XChangeProperty (screen->dpy (), priv->id, Atoms::wmUserTime, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &value, 1); } /* * Macros from metacity * * Xserver time can wraparound, thus comparing two timestamps needs to * take this into account. Here's a little macro to help out. If no * wraparound has occurred, this is equivalent to * time1 < time2 * Of course, the rest of the ugliness of this macro comes from * accounting for the fact that wraparound can occur and the fact that * a timestamp of 0 must be special-cased since it means older than * anything else. * * Note that this is NOT an equivalent for time1 <= time2; if that's * what you need then you'll need to swap the order of the arguments * and negate the result. */ #define XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) \ ( (( (time1) < (time2) ) && \ ( (time2) - (time1) < ((unsigned long) -1) / 2 )) || \ (( (time1) > (time2) ) && \ ( (time1) - (time2) > ((unsigned long) -1) / 2 )) \ ) #define XSERVER_TIME_IS_BEFORE(time1, time2) \ ( (time1) == 0 || \ (XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS (time1, time2) && \ (time2) != 0) \ ) bool PrivateWindow::getUsageTimestamp (Time& timestamp) { if (getUserTime (timestamp)) return true; if (initialTimestampSet) { timestamp = initialTimestamp; return true; } return false; } bool PrivateWindow::isWindowFocusAllowed (Time timestamp) { CompScreen *s = screen; CompWindow *active; Time wUserTime, aUserTime; bool gotTimestamp = false; CompPoint dvp; int level = s->getCoreOptions ().optionGetFocusPreventionLevel (); if (level == CoreOptions::FocusPreventionLevelOff) return true; if (timestamp) { /* the caller passed a timestamp, so use that instead of the window's user time */ wUserTime = timestamp; gotTimestamp = true; } else gotTimestamp = getUsageTimestamp (wUserTime); /* if we got no timestamp for the window, try to get at least a timestamp for its transient parent, if any */ if (!gotTimestamp && transientFor) { CompWindow *parent = screen->findWindow (transientFor); if (parent) gotTimestamp = parent->priv->getUsageTimestamp (wUserTime); } if (gotTimestamp && !wUserTime) /* window explicitly requested no focus */ return false; /* allow focus for excluded windows */ CompMatch &match = s->getCoreOptions ().optionGetFocusPreventionMatch (); if (!match.evaluate (window)) return true; if (level == CoreOptions::FocusPreventionLevelVeryHigh) return false; active = s->findWindow (s->activeWindow ()); /* no active window */ if (!active || (active->type () & CompWindowTypeDesktopMask) || /* active window belongs to same application */ window->clientLeader () == active->clientLeader ()) return true; if (level == CoreOptions::FocusPreventionLevelHigh) return false; /* not in current viewport or desktop */ if (!window->onCurrentDesktop ()) return false; dvp = window->defaultViewport (); if (dvp.x () != s->vp ().x () || dvp.y () != s->vp ().y ()) return false; if (!gotTimestamp) { /* unsure as we have nothing to compare - allow focus in low level, don't allow in normal level */ if (level == CoreOptions::FocusPreventionLevelNormal) return false; return true; } /* can't get user time for active window */ if (!active->priv->getUserTime (aUserTime)) return true; if (XSERVER_TIME_IS_BEFORE (wUserTime, aUserTime)) return false; return true; } bool PrivateWindow::allowWindowFocus (unsigned int noFocusMask, Time timestamp) { if (priv->id == screen->activeWindow ()) return true; /* do not focus windows of these types */ if (priv->type & noFocusMask || /* window doesn't take focus */ !(priv->inputHint || priv->protocols & CompWindowProtocolTakeFocusMask)) return false; bool retval = priv->isWindowFocusAllowed (timestamp); /* add demands attention state if focus was prevented */ if (!retval) window->changeState (priv->state | CompWindowStateDemandsAttentionMask); return retval; } CompPoint CompWindow::defaultViewport () const { CompPoint viewport; if (priv->serverGeometry.x () < (int) screen->width () && priv->serverGeometry.y () < (int) screen->height () && priv->serverGeometry.x () + priv->serverGeometry.width () > 0 && priv->serverGeometry.y () + priv->serverGeometry.height () > 0) return screen->vp (); screen->viewportForGeometry (priv->serverGeometry, viewport); return viewport; } const CompPoint & CompWindow::initialViewport () const { return priv->initialViewport; } void PrivateWindow::readIconHint () { XImage *maskImage = NULL; Display *dpy = screen->dpy (); unsigned int width, height, dummy; unsigned int i, j; int iDummy; Window wDummy; if (!XGetGeometry (dpy, hints->icon_pixmap, &wDummy, &iDummy, &iDummy, &width, &height, &dummy, &dummy)) return; XImage *image = XGetImage (dpy, hints->icon_pixmap, 0, 0, width, height, AllPlanes, ZPixmap); if (!image) return; boost::scoped_array colors(new XColor[width * height]); if (!colors) { XDestroyImage (image); return; } unsigned int k = 0; for (j = 0; j < height; ++j) for (i = 0; i < width; ++i) colors[k++].pixel = XGetPixel (image, i, j); for (i = 0; i < k; i += 256) XQueryColors (dpy, screen->colormap (), &colors[i], MIN (k - i, 256)); XDestroyImage (image); CompIcon *icon = new CompIcon (width, height); if (!icon) return; if (hints->flags & IconMaskHint) maskImage = XGetImage (dpy, hints->icon_mask, 0, 0, width, height, AllPlanes, ZPixmap); k = 0; CARD32 *p = (CARD32 *) icon->data (); for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { if (maskImage && !XGetPixel (maskImage, i, j)) *p++ = 0; else if (image->depth == 1) /* white : black */ *p++ = colors[k].pixel ? 0xffffffff : 0xff000000; else *p++ = 0xff000000 | /* alpha */ (((colors[k].red >> 8) & 0xff) << 16) | /* red */ (((colors[k].green >> 8) & 0xff) << 8) | /* green */ ((colors[k].blue >> 8) & 0xff); /* blue */ ++k; } } if (maskImage) XDestroyImage (maskImage); icons.push_back (icon); } /* returns icon with dimensions as close as possible to width and height but never greater. */ CompIcon * CompWindow::getIcon (int width, int height) { CompIcon *icon; int wh, diff, oldDiff; unsigned int i; /* need to fetch icon property */ if (priv->icons.size () == 0 && !priv->noIcons) { Atom actual; int format; unsigned long n, left; unsigned char *data; int result = XGetWindowProperty (screen->dpy (), priv->id, Atoms::wmIcon, 0L, 65536L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { CARD32 *p; CARD32 alpha, red, green, blue; unsigned long iw, ih; unsigned long *idata; for (i = 0; i + 2 < n; i += iw * ih + 2) { idata = (unsigned long *) data; iw = idata[i]; ih = idata[i + 1]; /* iw * ih may be larger than the value range of unsigned * long, so better do some checking for extremely weird * icon sizes first */ if (iw > 2048 || ih > 2048 || iw * ih + 2 > n - i) break; if (iw && ih) { icon = new CompIcon (iw, ih); if (!icon) continue; priv->icons.push_back (icon); p = (CARD32 *) (icon->data ()); /* EWMH doesn't say if icon data is premultiplied or not but most applications seem to assume data should be unpremultiplied. */ for (unsigned long j = 0; j < iw * ih; ++j) { alpha = (idata[i + j + 2] >> 24) & 0xff; red = (idata[i + j + 2] >> 16) & 0xff; green = (idata[i + j + 2] >> 8) & 0xff; blue = (idata[i + j + 2] >> 0) & 0xff; red = (red * alpha) >> 8; green = (green * alpha) >> 8; blue = (blue * alpha) >> 8; p[j] = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); } } } XFree (data); } else if (priv->hints && (priv->hints->flags & IconPixmapHint)) priv->readIconHint (); /* don't fetch property again */ if (priv->icons.size () == 0) priv->noIcons = true; } /* no icons available for this window */ if (priv->noIcons) return NULL; icon = NULL; wh = width + height; for (i = 0; i < priv->icons.size (); ++i) { const CompSize iconSize = *priv->icons[i]; if ((int) iconSize.width () > width || (int) iconSize.height () > height) continue; if (icon) { diff = wh - (iconSize.width () + iconSize.height ()); oldDiff = wh - (icon->width () + icon->height ()); if (diff < oldDiff) icon = priv->icons[i]; } else icon = priv->icons[i]; } return icon; } const CompRect& CompWindow::iconGeometry () const { return priv->iconGeometry; } void PrivateWindow::freeIcons () { for (unsigned int i = 0; i < priv->icons.size (); ++i) delete priv->icons[i]; priv->icons.resize (0); priv->noIcons = false; } int CompWindow::outputDevice () const { const CompPoint& vp = defaultViewport (); const CompPoint& svp = screen->vp (); if (vp == svp) return screen->outputDeviceForGeometry (priv->serverGeometry); Geometry geo (priv->serverGeometry.x () + (svp.x () - vp.x ()) * screen->width (), priv->serverGeometry.y () + (svp.y () - vp.y ()) * screen->height (), priv->serverGeometry.width (), priv->serverGeometry.height (), priv->serverGeometry.border ()); return screen->outputDeviceForGeometry (geo); } bool CompWindow::onCurrentDesktop () const { if (priv->desktop == 0xffffffff || priv->desktop == screen->currentDesktop ()) return true; return false; } void CompWindow::setDesktop (unsigned int desktop) { if (desktop != 0xffffffff && (priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask) || desktop >= screen->nDesktop ())) return; if (desktop == priv->desktop) return; priv->desktop = desktop; if (desktop == 0xffffffff || desktop == screen->currentDesktop ()) priv->show (); else priv->hide (); screen->setWindowProp (priv->id, Atoms::winDesktop, priv->desktop); } /* The compareWindowActiveness function compares the two windows 'w1' and 'w2'. It returns an integer less than, equal to, or greater than zero if 'w1' is found, respectively, to activated longer time ago than, to be activated at the same time, or be activated more recently than 'w2'. */ int PrivateWindow::compareWindowActiveness (CompWindow *w1, CompWindow *w2) { CompActiveWindowHistory *history = screen->currentHistory (); /* check current window history first */ for (int i = 0; i < ACTIVE_WINDOW_HISTORY_SIZE; ++i) { if (history->id[i] == w1->priv->id) return 1; if (history->id[i] == w2->priv->id) return -1; if (!history->id[i]) break; } return w1->priv->activeNum - w2->priv->activeNum; } bool CompWindow::onAllViewports () const { if (overrideRedirect () || (!priv->managed && !isViewable ()) || priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask) || priv->state & CompWindowStateStickyMask) return true; return false; } CompPoint CompWindow::getMovementForOffset (const CompPoint &offset) const { CompScreen *s = screen; int m; int offX = offset.x (), offY = offset.y (); CompPoint rv; int vWidth = s->width () * s->vpSize ().width (); int vHeight = s->height () * s->vpSize ().height (); offX %= vWidth; offY %= vHeight; /* x */ if (s->vpSize ().width () == 1) rv.setX (offX); else { m = priv->serverGeometry.x () + offX; if (m - priv->serverInput.left < (int) s->width () - vWidth) rv.setX (offX + vWidth); else if (m + priv->serverGeometry.width () + priv->serverInput.right > vWidth) rv.setX (offX - vWidth); else rv.setX (offX); } if (s->vpSize ().height () == 1) rv.setY (offY); else { m = priv->serverGeometry.y () + offY; if (m - priv->serverInput.top < (int) s->height () - vHeight) rv.setY (offY + vHeight); else if (m + priv->serverGeometry.height () + priv->serverInput.bottom > vHeight) rv.setY (offY - vHeight); else rv.setY (offY); } return rv; } void WindowInterface::getOutputExtents (CompWindowExtents& output) WRAPABLE_DEF (getOutputExtents, output) void WindowInterface::getAllowedActions (unsigned int &setActions, unsigned int &clearActions) WRAPABLE_DEF (getAllowedActions, setActions, clearActions) bool WindowInterface::focus () WRAPABLE_DEF (focus) void WindowInterface::activate () WRAPABLE_DEF (activate) bool WindowInterface::place (CompPoint &pos) WRAPABLE_DEF (place, pos) void WindowInterface::validateResizeRequest (unsigned int &mask, XWindowChanges *xwc, unsigned int source) WRAPABLE_DEF (validateResizeRequest, mask, xwc, source) void WindowInterface::resizeNotify (int dx, int dy, int dwidth, int dheight) WRAPABLE_DEF (resizeNotify, dx, dy, dwidth, dheight) void WindowInterface::moveNotify (int dx, int dy, bool immediate) WRAPABLE_DEF (moveNotify, dx, dy, immediate) void WindowInterface::windowNotify (CompWindowNotify n) WRAPABLE_DEF (windowNotify, n) void WindowInterface::grabNotify (int x, int y, unsigned int state, unsigned int mask) WRAPABLE_DEF (grabNotify, x, y, state, mask) void WindowInterface::ungrabNotify () WRAPABLE_DEF (ungrabNotify) void WindowInterface::stateChangeNotify (unsigned int lastState) WRAPABLE_DEF (stateChangeNotify, lastState) void WindowInterface::updateFrameRegion (CompRegion ®ion) WRAPABLE_DEF (updateFrameRegion, region) void WindowInterface::minimize () WRAPABLE_DEF (minimize); void WindowInterface::unminimize () WRAPABLE_DEF (unminimize); bool WindowInterface::minimized () const WRAPABLE_DEF (minimized); bool WindowInterface::alpha () const WRAPABLE_DEF (alpha); bool WindowInterface::isFocussable () const WRAPABLE_DEF (isFocussable); bool WindowInterface::managed () const WRAPABLE_DEF (managed); bool WindowInterface::focused () const WRAPABLE_DEF (focused); Window CompWindow::id () const { return priv->id; } unsigned int CompWindow::type () const { return priv->type; } unsigned int & CompWindow::state () const { return priv->state; } unsigned int CompWindow::actions () const { return priv->actions; } unsigned int & CompWindow::protocols () const { return priv->protocols; } void CompWindow::close (Time serverTime) { if (serverTime == 0) serverTime = screen->getCurrentTime (); if (priv->alive) { if (priv->protocols & CompWindowProtocolDeleteMask) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = priv->id; ev.xclient.message_type = Atoms::wmProtocols; ev.xclient.format = 32; ev.xclient.data.l[0] = Atoms::wmDeleteWindow; ev.xclient.data.l[1] = serverTime; ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent (screen->dpy (), priv->id, false, NoEventMask, &ev); } else XKillClient (screen->dpy (), priv->id); ++priv->closeRequests; } else screen->toolkitAction (Atoms::toolkitActionForceQuitDialog, serverTime, priv->id, true, 0, 0); priv->lastCloseRequestTime = serverTime; } bool PrivateWindow::handlePingTimeout (unsigned int lastPing) { if (!window->isViewable () || !(priv->type & CompWindowTypeNormalMask)) return false; if (priv->protocols & CompWindowProtocolPingMask) { if (priv->transientFor) return false; if (priv->lastPong < lastPing && priv->alive) { priv->alive = false; window->windowNotify (CompWindowNotifyAliveChanged); if (priv->closeRequests) { screen->toolkitAction (Atoms::toolkitActionForceQuitDialog, priv->lastCloseRequestTime, priv->id, true, 0, 0); priv->closeRequests = 0; } } return true; } return false; } void PrivateWindow::handlePing (int lastPing) { if (!priv->alive) { priv->alive = true; window->windowNotify (CompWindowNotifyAliveChanged); if (priv->lastCloseRequestTime) { screen->toolkitAction (Atoms::toolkitActionForceQuitDialog, priv->lastCloseRequestTime, priv->id, false, 0, 0); priv->lastCloseRequestTime = 0; } } priv->lastPong = lastPing; } void PrivateWindow::processMap () { priv->initialViewport = screen->vp (); priv->initialTimestampSet = false; screen->applyStartupProperties (window); bool initiallyMinimized = (priv->hints && priv->hints->initial_state == IconicState && !window->minimized ()); if (!serverFrame && !initiallyMinimized) reparent (); priv->managed = true; if (!initiallyMinimized && !(priv->state & CompWindowStateHiddenMask)) receivedMapRequestAndAwaitingMap = true; if (!priv->placed) { int gravity = priv->sizeHints.win_gravity; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int xwcm; /* adjust for gravity, but only for frame size */ xwc.x = priv->serverGeometry.x () - priv->border.left; xwc.y = priv->serverGeometry.y () - priv->border.top; xwc.width = 0; xwc.height = 0; xwcm = adjustConfigureRequestForGravity (&xwc, CWX | CWY, gravity, 1); xwc.width = priv->serverGeometry.width (); xwc.height = priv->serverGeometry.height (); /* Validate size */ xwcm |= CWWidth | CWHeight; window->validateResizeRequest (xwcm, &xwc, ClientTypeApplication); CompPoint pos (xwc.x, xwc.y); if (window->place (pos)) { xwc.x = pos.x (); xwc.y = pos.y (); xwcm |= CWX | CWY; } if (xwcm) window->configureXWindow (xwcm, &xwc); priv->placed = true; } CompStackingUpdateMode stackingMode; bool allowFocus = allowWindowFocus (NO_FOCUS_MASK, 0); if (!allowFocus && (priv->type & ~NO_FOCUS_MASK)) stackingMode = CompStackingUpdateModeInitialMapDeniedFocus; else stackingMode = CompStackingUpdateModeInitialMap; window->updateAttributes (stackingMode); if (window->minimized () && !initiallyMinimized) window->unminimize (); screen->leaveShowDesktopMode (window); if (!initiallyMinimized) { if (allowFocus && !window->onCurrentDesktop ()) screen->setCurrentDesktop (priv->desktop); if (!(priv->state & CompWindowStateHiddenMask)) { show (); receivedMapRequestAndAwaitingMap = false; } if (allowFocus) { window->moveInputFocusTo (); if (!window->onCurrentDesktop ()) screen->setCurrentDesktop (priv->desktop); } } else { window->minimize (); window->changeState (window->state () | CompWindowStateHiddenMask); } screen->updateClientList (); } /* * PrivateWindow::updatePassiveButtonGrabs * * Updates the passive button grabs for a window. When * one of the specified button + modifier combinations * for this window is activated, compiz will be given * an active grab for the window (which we can turn off * by calling XAllowEvents later in ::handleEvent) * * NOTE: ICCCM says that we are only allowed to grab * windows that we actually own as a client, so only * grab the frame window. Additionally, although there * isn't anything in the ICCCM that says we cannot * grab every button, some clients do not interpret * EnterNotify and LeaveNotify events caused by the * activation of the grab correctly, so ungrab button * and modifier combinations that we do not need on * active windows (but in reality we shouldn't be grabbing * for buttons that we don't actually need at that point * anyways) */ class DummyServerGrab : public ServerGrabInterface { public: void grabServer () {} void syncServer () {} void ungrabServer () {} }; void PrivateWindow::updatePassiveButtonGrabs () { if (!priv->frame) return; bool onlyActions = (priv->id == screen->activeWindow () || !screen->getCoreOptions ().optionGetClickToFocus ()); /* Ungrab everything */ XUngrabButton (screen->dpy (), AnyButton, AnyModifier, frame); /* We don't need the full grab in the following cases: * - This window has the focus and either * - it is raised or * - we don't want click raise */ if (onlyActions) { if (screen->getCoreOptions ().optionGetRaiseOnClick ()) { /* We do not actually need a server grab here since * there is no risk to our internal state */ DummyServerGrab grab; ServerLock lock (&grab); CompWindow *highestSibling = PrivateWindow::findSiblingBelow (window, true, lock); /* Check if this window is permitted to be raised */ for (CompWindow *above = window->serverNext; above != NULL; above = above->serverNext) { if (highestSibling == above) { onlyActions = false; break; } } } } if (onlyActions) screen->updatePassiveButtonGrabs(serverFrame); else { /* Grab all buttons */ XGrabButton (screen->dpy (), AnyButton, AnyModifier, serverFrame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeAsync, None, None); if (!(priv->type & CompWindowTypeDesktopMask)) { /* Ungrab Buttons 4 & 5 for vertical scrolling if the window is not the desktop window */ for (int i = Button4; i <= Button5; ++i) { XUngrabButton (screen->dpy (), i, 0, frame); XUngrabButton (screen->dpy (), i, LockMask, frame); XUngrabButton (screen->dpy (), i, Mod2Mask, frame); XUngrabButton (screen->dpy (), i, LockMask | Mod2Mask, frame); } } } } const CompRegion & CompWindow::region () const { return priv->region; } const CompRegion & CompWindow::frameRegion () const { return priv->frameRegion; } bool CompWindow::inShowDesktopMode () const { return priv->inShowDesktopMode; } void CompWindow::setShowDesktopMode (bool value) { priv->inShowDesktopMode = value; } bool CompWindow::managed () const { WRAPABLE_HND_FUNCTN_RETURN (bool, managed); return priv->managed; } bool CompWindow::focused () const { WRAPABLE_HND_FUNCTN_RETURN (bool, focused); return screen->activeWindow () == id (); } bool CompWindow::grabbed () const { return priv->grabbed; } int CompWindow::pendingMaps () const { return priv->pendingMaps; } unsigned int & CompWindow::wmType () const { return priv->wmType; } unsigned int CompWindow::activeNum () const { return priv->activeNum; } Window CompWindow::frame () const { return priv->serverFrame; } CompString CompWindow::resName () const { if (priv->resName) return priv->resName; return CompString (); } int CompWindow::mapNum () const { return priv->mapNum; } const CompStruts * CompWindow::struts () const { return priv->struts; } bool CompWindow::queryAttributes (XWindowAttributes &attrib) { return priv->queryAttributes (attrib); } bool CompWindow::queryFrameAttributes (XWindowAttributes &attrib) { return priv->queryFrameAttributes (attrib); } crb::Releasable::Ptr CompWindow::obtainLockOnConfigureRequests () { return priv->configureBuffer->obtainLock (); } int & CompWindow::saveMask () const { return priv->saveMask; } XWindowChanges & CompWindow::saveWc () { return priv->saveWc; } void CompWindow::moveToViewportPosition (int x, int y, bool sync) { int vWidth = screen->width () * screen->vpSize ().width (); int vHeight = screen->height () * screen->vpSize ().height (); if (screen->vpSize ().width () != 1) { x += screen->vp ().x () * screen->width (); x = compiz::core::screen::wraparound_mod (x, vWidth); x -= screen->vp ().x () * screen->width (); } if (screen->vpSize ().height () != 1) { y += screen->vp ().y () * screen->height (); y = compiz::core::screen::wraparound_mod (y, vHeight); y -= screen->vp ().y () * screen->height (); } int tx = x - priv->serverGeometry.x (); int ty = y - priv->serverGeometry.y (); if (tx || ty) { unsigned int valueMask = CWX | CWY; XWindowChanges xwc = XWINDOWCHANGES_INIT; if (!priv->managed || priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask) || priv->state & CompWindowStateStickyMask) return; int wx = tx; int wy = ty; int m; if (screen->vpSize ().width ()!= 1) { m = priv->serverGeometry.x () + tx; if (m - priv->output.left < (int) screen->width () - vWidth) wx = tx + vWidth; else if (m + priv->serverGeometry.width () + priv->output.right > vWidth) wx = tx - vWidth; } if (screen->vpSize ().height () != 1) { m = priv->serverGeometry.y () + ty; if (m - priv->output.top < (int) screen->height () - vHeight) wy = ty + vHeight; else if (m + priv->serverGeometry.height () + priv->output.bottom > vHeight) wy = ty - vHeight; } if (priv->saveMask & CWX) priv->saveWc.x += wx; if (priv->saveMask & CWY) priv->saveWc.y += wy; xwc.x = serverGeometry ().x () + wx; xwc.y = serverGeometry ().y () + wy; configureXWindow (valueMask, &xwc); if ((state () & CompWindowStateMaximizedHorzMask || state () & CompWindowStateMaximizedVertMask) && (defaultViewport () == screen->vp ())) priv->initialViewport = screen->vp (); } } const char * CompWindow::startupId () const { return priv->startupId; } void PrivateWindow::applyStartupProperties (CompStartupSequence *s) { priv->initialViewport.setX (s->viewportX); priv->initialViewport.setY (s->viewportY); int workspace = sn_startup_sequence_get_workspace (s->sequence); if (workspace >= 0) window->setDesktop (workspace); priv->initialTimestamp = sn_startup_sequence_get_timestamp (s->sequence); priv->initialTimestampSet = true; } unsigned int CompWindow::desktop () const { return priv->desktop; } Window CompWindow::clientLeader (bool checkAncestor) const { if (priv->clientLeader) return priv->clientLeader; if (checkAncestor) return priv->getClientLeaderOfAncestor (); return None; } Window CompWindow::transientFor () const { return priv->transientFor; } int CompWindow::pendingUnmaps () const { return priv->pendingUnmaps; } bool CompWindow::minimized () const { WRAPABLE_HND_FUNCTN_RETURN (bool, minimized); return priv->minimized; } bool CompWindow::placed () const { return priv->placed; } bool CompWindow::shaded () const { return priv->shaded; } const CompWindowExtents & CompWindow::border () const { return priv->border; } const CompWindowExtents & CompWindow::input () const { return priv->serverInput; } const CompWindowExtents & CompWindow::output () const { return priv->output; } const CompWindowExtents & CompWindow::clientFrame () const { return priv->clientFrame; } XSizeHints & CompWindow::sizeHints () const { return priv->sizeHints; } void PrivateWindow::updateMwmHints () { screen->getMwmHints (priv->id, &priv->mwmFunc, &priv->mwmDecor); window->recalcActions (); } void PrivateWindow::updateStartupId () { char *oldId = startupId; bool newId = true; startupId = getStartupId (); if (oldId && startupId && strcmp (startupId, oldId) == 0) newId = false; if (managed && startupId && newId) { Time timestamp = 0; initialTimestampSet = false; screen->applyStartupProperties (window); if (initialTimestampSet) timestamp = initialTimestamp; /* as the viewport can't be transmitted via startup notification, assume the client changing the ID wanted to activate the window on the current viewport */ CompPoint vp = window->defaultViewport (); CompPoint svp = screen->vp (); int x = window->serverGeometry ().x () + (svp.x () - vp.x ()) * screen->width (); int y = window->serverGeometry ().y () + (svp.y () - vp.y ()) * screen->height (); window->moveToViewportPosition (x, y, true); if (allowWindowFocus (0, timestamp)) window->activate (); } if (oldId) free (oldId); } bool CompWindow::destroyed () const { return priv->destroyed; } bool CompWindow::invisible () const { return priv->invisible; } XSyncAlarm CompWindow::syncAlarm () const { return priv->syncAlarm; } CompWindow * PrivateWindow::createCompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, Window id) { PrivateWindow* priv(new PrivateWindow ()); priv->id = id; priv->serverId = id; CompWindow *fw = new CompWindow (aboveId, aboveServerId, wa, priv); return fw; } CompWindow::CompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, PrivateWindow *priv) : PluginClassStorage (windowPluginClassIndices), priv (priv) { StackDebugger *dbg = StackDebugger::Default (); // TODO: Reparent first! priv->window = this; screen->insertWindow (this, aboveId); screen->insertServerWindow (this, aboveServerId); /* We must immediately insert the window into the debugging * stack */ if (dbg) dbg->overrideRedirectRestack (priv->id, aboveId); priv->attrib = wa; priv->serverGeometry.set (priv->attrib.x, priv->attrib.y, priv->attrib.width, priv->attrib.height, priv->attrib.border_width); priv->serverFrameGeometry = priv->frameGeometry = priv->syncGeometry = priv->geometry = priv->serverGeometry; priv->sizeHints.flags = 0; priv->recalcNormalHints (); priv->transientFor = None; priv->clientLeader = None; XSelectInput (screen->dpy (), priv->id, wa.your_event_mask | PropertyChangeMask | EnterWindowMask | FocusChangeMask); priv->alpha = (priv->attrib.depth == 32); priv->lastPong = screen->lastPing (); if (screen->XShape ()) XShapeSelectInput (screen->dpy (), priv->id, ShapeNotifyMask); if (priv->attrib.c_class != InputOnly) { priv->region = CompRegion (priv->serverGeometry); priv->inputRegion = priv->region; /* need to check for DisplayModal state on all windows */ priv->state = screen->getWindowState (priv->id); priv->updateClassHints (); } else priv->attrib.map_state = IsUnmapped; priv->wmType = screen->getWindowType (priv->id); priv->protocols = screen->getProtocols (priv->id); if (!overrideRedirect ()) { priv->updateNormalHints (); updateStruts (); priv->updateWmHints (); priv->updateTransientHint (); priv->clientLeader = priv->getClientLeader (); priv->startupId = priv->getStartupId (); recalcType (); screen->getMwmHints (priv->id, &priv->mwmFunc, &priv->mwmDecor); if (priv->type & APPEARS_FOCUSED_MASK) priv->state |= CompWindowStateFocusedMask; if (!(priv->type & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) { priv->desktop = screen->getWindowProp (priv->id, Atoms::winDesktop, priv->desktop); if (priv->desktop != 0xffffffff && priv->desktop >= screen->nDesktop ()) priv->desktop = screen->currentDesktop (); } } else recalcType (); if (priv->attrib.map_state == IsViewable) { priv->placed = true; if (!overrideRedirect ()) { // needs to happen right after maprequest if (!priv->serverFrame) priv->reparent (); priv->managed = true; if (screen->getWmState (priv->id) == IconicState) { if (priv->state & CompWindowStateShadedMask) priv->shaded = true; else priv->minimized = true; } else { if (priv->wmType & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) setDesktop (0xffffffff); else { if (priv->desktop != 0xffffffff) priv->desktop = screen->currentDesktop (); screen->setWindowProp (priv->id, Atoms::winDesktop, priv->desktop); } } } priv->attrib.map_state = IsUnmapped; ++priv->pendingMaps; map (); updateAttributes (CompStackingUpdateModeNormal); if (priv->minimized || priv->inShowDesktopMode || priv->hidden || priv->shaded) { priv->state |= CompWindowStateHiddenMask; ++priv->pendingUnmaps; if (priv->serverFrame && !priv->shaded) XUnmapWindow (screen->dpy (), priv->serverFrame); XUnmapWindow (screen->dpy (), priv->id); screen->setWindowState (priv->state, priv->id); } } else if (!overrideRedirect () && screen->getWmState (priv->id) == IconicState) { // before everything else in maprequest if (!priv->serverFrame) priv->reparent (); priv->managed = true; priv->placed = true; if (priv->state & CompWindowStateHiddenMask) { if (priv->state & CompWindowStateShadedMask) priv->shaded = true; else priv->minimized = true; } } /* TODO: bailout properly when objectInitPlugins fails */ bool init_succeeded = CompPlugin::windowInitPlugins (this); assert (init_succeeded); if (!init_succeeded) return; recalcActions (); priv->updateIconGeometry (); priv->updateClientFrame (); if (priv->shaded) priv->updateFrameWindow (); if (priv->attrib.map_state == IsViewable) priv->invisible = priv->isInvisible (); } CompWindow::~CompWindow () { if (priv->serverFrame) priv->unreparent (); /* Update the references of other windows * pending destroy if this was a sibling * of one of those */ screen->destroyedWindows ().remove (this); foreach (CompWindow *dw, screen->destroyedWindows ()) { if (dw->next == this) dw->next = this->next; if (dw->prev == this) dw->prev = this->prev; if (dw->serverNext == this) dw->serverNext = this->serverNext; if (dw->serverPrev == this) dw->serverPrev = this->serverPrev; } if (!priv->destroyed) { CompWindowExtents empty; setWindowFrameExtents (&empty, &empty); StackDebugger *dbg = StackDebugger::Default (); screen->unhookWindow (this); screen->unhookServerWindow (this); /* We must immediately insert the window into the debugging * stack */ if (dbg) dbg->removeServerWindow (id ()); /* restore saved geometry and map if hidden */ if (!priv->attrib.override_redirect) { if (priv->saveMask) XConfigureWindow (screen->dpy (), priv->id, priv->saveMask, &priv->saveWc); if (!priv->hidden && priv->state & CompWindowStateHiddenMask) XMapWindow (screen->dpy (), priv->id); } if (screen->XShape ()) XShapeSelectInput (screen->dpy (), priv->id, NoEventMask); if (screen->grabWindowIsNot(priv->id)) XSelectInput (screen->dpy (), priv->id, NoEventMask); XUngrabButton (screen->dpy (), AnyButton, AnyModifier, priv->id); } if (priv->attrib.map_state == IsViewable) { if (priv->type == CompWindowTypeDesktopMask) { screen->decrementDesktopWindowCount (); if (!alpha ()) screen->decrementOpaqueDesktopWindowCount (); } if (priv->destroyed && priv->struts) screen->updateWorkarea (); } if (priv->destroyed) screen->updateClientList (); CompPlugin::windowFiniPlugins (this); delete priv; } X11SyncServerWindow::X11SyncServerWindow (Display *dpy, const Window *w, const Window *frame) : mDpy (dpy), mWindow (w), mFrame (frame) { } bool X11SyncServerWindow::queryAttributes (XWindowAttributes &attrib) { if (XGetWindowAttributes (mDpy, *mWindow, &attrib)) return true; return false; } bool X11SyncServerWindow::queryFrameAttributes (XWindowAttributes &attrib) { Window w = *mFrame ? *mFrame : *mWindow; if (XGetWindowAttributes (mDpy, w, &attrib)) return true; return false; } XRectangle * X11SyncServerWindow::queryShapeRectangles (int kind, int *count, int *ordering) { return XShapeGetRectangles (mDpy, *mWindow, kind, count, ordering); } namespace { class NullConfigureBufferLock : public crb::BufferLock { public: NullConfigureBufferLock (crb::CountedFreeze *cf) {} void lock () {} void release () {} }; crb::BufferLock::Ptr createConfigureBufferLock (crb::CountedFreeze *cf) { /* Return an implementation that does nothing if the user explicitly * disabled buffer locks for this running instance */ if (getenv ("COMPIZ_NO_CONFIGURE_BUFFER_LOCKS")) return boost::make_shared (cf); return boost::make_shared (cf); } } PrivateWindow::PrivateWindow () : priv (this), refcnt (1), id (None), serverFrame (None), frame (None), wrapper (None), mapNum (0), activeNum (0), transientFor (None), clientLeader (None), hints (NULL), inputHint (true), alpha (false), region (), wmType (0), type (CompWindowTypeUnknownMask), state (0), actions (0), protocols (0), mwmDecor (MwmDecorAll), mwmFunc (MwmFuncAll), invisible (true), destroyed (false), managed (false), unmanaging (false), destroyRefCnt (1), unmapRefCnt (1), initialViewport (0, 0), initialTimestamp (0), initialTimestampSet (false), fullscreenMonitorsSet (false), placed (false), minimized (false), inShowDesktopMode (false), shaded (false), hidden (false), grabbed (false), alreadyDecorated (false), desktop (0), pendingUnmaps (0), pendingMaps (0), pendingConfigures (screen->dpy ()), receivedMapRequestAndAwaitingMap (false), startupId (0), resName (0), resClass (0), group (0), lastPong (0), alive (true), moved (false), struts (0), icons (0), noIcons (false), saveMask (0), syncCounter (0), syncAlarm (None), syncWaitTimer (), syncWait (false), closeRequests (false), lastCloseRequestTime (0), syncServerWindow (screen->dpy (), &id, &serverFrame), configureBuffer ( crb::ConfigureRequestBuffer::Create ( this, &syncServerWindow, boost::bind (createConfigureBufferLock, _1))) { input.left = 0; input.right = 0; input.top = 0; input.bottom = 0; /* Zero initialize */ serverInput = input; lastServerInput = input; border = input; output = input; syncWaitTimer.setTimes (1000, 1200); syncWaitTimer.setCallback (boost::bind (&PrivateWindow::handleSyncAlarm, this)); } PrivateWindow::~PrivateWindow () { if (syncAlarm) XSyncDestroyAlarm (screen->dpy (), syncAlarm); syncWaitTimer.stop (); if (serverFrame) XDestroyWindow (screen->dpy (), serverFrame); else if (frame) XDestroyWindow (screen->dpy (), frame); if (struts) free (struts); if (hints) XFree (hints); if (icons.size ()) freeIcons (); if (startupId) free (startupId); if (resName) free (resName); if (resClass) free (resClass); } bool CompWindow::syncWait () const { return priv->syncWait; } bool CompWindow::alpha () const { WRAPABLE_HND_FUNCTN_RETURN (bool, alpha); return priv->alpha; } bool CompWindow::overrideRedirect () const { return priv->attrib.override_redirect; } void PrivateWindow::setOverrideRedirect (bool overrideRedirect) { if (overrideRedirect == window->overrideRedirect ()) return; priv->attrib.override_redirect = overrideRedirect ? 1 : 0; window->recalcType (); window->recalcActions (); screen->matchPropertyChanged (window); } bool CompWindow::isMapped () const { return priv->mapNum > 0; } bool CompWindow::isViewable () const { return (priv->attrib.map_state == IsViewable); } bool CompWindow::isFocussable () const { WRAPABLE_HND_FUNCTN_RETURN (bool, isFocussable); if (priv->inputHint || priv->protocols & CompWindowProtocolTakeFocusMask) return true; return false; } int CompWindow::windowClass () const { return priv->attrib.c_class; } unsigned int CompWindow::depth () const { return priv->attrib.depth; } bool CompWindow::alive () const { return priv->alive; } bool CompWindow::moved () const { return priv->moved; } unsigned int CompWindow::mwmDecor () const { return priv->mwmDecor; } unsigned int CompWindow::mwmFunc () const { return priv->mwmFunc; } /* TODO: This function should be able to check the XShape event * kind and only get/set shape rectangles for either ShapeInput * or ShapeBounding, but not both at the same time */ void CompWindow::updateFrameRegion () { if (priv->serverFrame) { priv->frameRegion = CompRegion::empty (); updateFrameRegion (priv->frameRegion); if (!shaded ()) { CompRect r = priv->region.boundingRect (); priv->frameRegion -= r; r.setGeometry (r.x1 () - priv->serverInput.left, r.y1 () - priv->serverInput.top, r.width () + priv->serverInput.right + priv->serverInput.left, r.height () + priv->serverInput.bottom + priv->serverInput.top); priv->frameRegion &= CompRegion (r); } int x = priv->serverGeometry.x () - priv->serverInput.left; int y = priv->serverGeometry.y () - priv->serverInput.top; XShapeCombineRegion (screen->dpy (), priv->serverFrame, ShapeBounding, -x, -y, priv->frameRegion.united (priv->region).handle (), ShapeSet); XShapeCombineRegion (screen->dpy (), priv->serverFrame, ShapeInput, -x, -y, priv->frameRegion.united (priv->inputRegion).handle (), ShapeSet); } } void CompWindow::setWindowFrameExtents (const CompWindowExtents *b, const CompWindowExtents *i) { /* override redirect windows can't have frame extents */ if (priv->attrib.override_redirect) return; /* Input extents are used for frame size, * Border extents used for placement. */ if (!i) i = b; if (priv->serverInput.left != i->left || priv->serverInput.right != i->right || priv->serverInput.top != i->top || priv->serverInput.bottom != i->bottom || priv->border.left != b->left || priv->border.right != b->right || priv->border.top != b->top || priv->border.bottom != b->bottom) { CompPoint movement = compiz::window::extents::shift (*b, priv->sizeHints.win_gravity) - compiz::window::extents::shift (priv->border, priv->sizeHints.win_gravity); CompSize sizeDelta; /* We don't want to change the size of the window in general, but this is * needed in case the window was maximized or fullscreen, so that it * will be extended to use the whole available space. */ if ((priv->state & MAXIMIZE_STATE) == MAXIMIZE_STATE || (priv->state & CompWindowStateFullscreenMask) || (priv->type & CompWindowTypeFullscreenMask)) { sizeDelta.setWidth (-((b->left + b->right) - (priv->border.left + priv->border.right))); sizeDelta.setHeight (-((b->top + b->bottom) - (priv->border.top + priv->border.bottom))); } /* Offset client for any new decoration size */ XWindowChanges xwc; xwc.x = movement.x () + priv->serverGeometry.x (); xwc.y = movement.y () + priv->serverGeometry.y (); xwc.width = sizeDelta.width () + priv->serverGeometry.width (); xwc.height = sizeDelta.height () + priv->serverGeometry.height (); if (!priv->alreadyDecorated) { /* Make sure we don't move the window outside the workarea */ CompRect const& workarea = screen->getWorkareaForOutput (outputDevice ()); CompPoint boffset((b->left + b->right) - (priv->border.left + priv->border.right), (b->top + b->bottom) - (priv->border.top + priv->border.bottom)); if (xwc.x + xwc.width > workarea.x2 ()) { xwc.x -= boffset.x (); if (xwc.x < workarea.x ()) xwc.x = workarea.x () + movement.x (); if (xwc.x - boffset.x () < workarea.x ()) xwc.x += boffset.x (); } if (xwc.y + xwc.height > workarea.y2 ()) { xwc.y -= boffset.y (); if (xwc.y < workarea.y ()) xwc.y = workarea.y () + movement.y (); if (xwc.y - boffset.y () < workarea.y ()) xwc.y += boffset.y (); } if (priv->actions & CompWindowActionResizeMask) { if (xwc.width + boffset.x () > workarea.width ()) xwc.width = workarea.width () - boffset.x (); if (xwc.height + boffset.y () > workarea.height ()) xwc.height = workarea.height () - boffset.y (); } priv->alreadyDecorated = true; } priv->serverInput = *i; priv->border = *b; configureXWindow (CWX | CWY | CWWidth | CWHeight, &xwc); windowNotify (CompWindowNotifyFrameUpdate); recalcActions (); /* Always send a moveNotify * whenever the frame extents update * so that plugins can re-position appropriately */ moveNotify (0, 0, true); /* Once we have updated everything, re-set lastServerInput */ priv->lastServerInput = priv->serverInput; } /* Use b for _NET_WM_FRAME_EXTENTS here because * that is the representation of the actual decoration * around the window that the user sees and should * be used for placement and such */ /* Also update frame extents regardless of whether or not * the frame extents actually changed, eg, a plugin could * suggest that a window has no frame extents and that it * might later get frame extents - this is mandatory if we * say that we support it, so set them * additionaly some applications might request frame extents * and we must respond by setting the property - ideally * this should only ever be done when some plugin actually * need to change the frame extents or the applications * requested it */ unsigned long data[4]; data[0] = b->left; data[1] = b->right; data[2] = b->top; data[3] = b->bottom; XChangeProperty (screen->dpy (), priv->id, Atoms::frameExtents, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 4); } bool CompWindow::hasUnmapReference () const { return (priv && priv->unmapRefCnt > 1); } void CompWindow::updateFrameRegion (CompRegion& region) WRAPABLE_HND_FUNCTN (updateFrameRegion, region) bool PrivateWindow::reparent () { if (serverFrame) return false; XSetWindowAttributes attr; XWindowAttributes wa; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int nchildren; Window *children, root_return, parent_return; Display *dpy = screen->dpy (); Visual *visual = DefaultVisual (screen->dpy (), screen->screenNum ()); Colormap cmap = DefaultColormap (screen->dpy (), screen->screenNum ()); XSync (dpy, false); XGrabServer (dpy); /* We need to flush all queued up requests */ foreach (CompWindow *w, screen->windows ()) w->priv->configureBuffer->forceRelease (); if (!window->priv->queryAttributes (wa)) { XUngrabServer (dpy); XSync (dpy, false); return false; } if (wa.override_redirect) return false; /* Don't ever reparent windows which have ended up * reparented themselves on the server side but not * on the client side */ XQueryTree (dpy, id, &root_return, &parent_return, &children, &nchildren); if (parent_return != root_return) { XFree (children); XUngrabServer (dpy); XSync (dpy, false); return false; } XFree (children); XQueryTree (dpy, root_return, &root_return, &parent_return, &children, &nchildren); XChangeSaveSet (dpy, id, SetModeInsert); /* Force border width to 0 */ xwc.border_width = 0; XConfigureWindow (dpy, id, CWBorderWidth, &xwc); priv->serverGeometry.setBorder (0); int mask = CWBorderPixel | CWColormap | CWBackPixmap | CWOverrideRedirect; if (wa.depth == 32) { cmap = wa.colormap; visual = wa.visual; } attr.background_pixmap = None; attr.border_pixel = 0; attr.colormap = cmap; attr.override_redirect = true; /* We need to know when the frame window is created * but that's all */ XSelectInput (dpy, screen->root (), SubstructureNotifyMask); /* Gravity here is assumed to be SouthEast, clients can update * that if need be */ serverFrameGeometry.set (wa.x + (serverInput.left - border.left), wa.y + (serverInput.top - border.top), wa.width + (serverInput.left + serverInput.right), wa.height + (serverInput.top + serverInput.bottom), 0); /* Awaiting a new frame to be given to us */ frame = None; serverFrame = XCreateWindow (dpy, screen->root (), serverFrameGeometry.x (), serverFrameGeometry.y (), serverFrameGeometry.width (), serverFrameGeometry.height (), serverFrameGeometry.border (), wa.depth, InputOutput, visual, mask, &attr); /* Do not get any events from here on */ XSelectInput (dpy, screen->root (), NoEventMask); /* If we have some frame extents, we should apply them here and * set lastFrameExtents */ wrapper = XCreateWindow (dpy, serverFrame, serverInput.left, serverInput.top, wa.width, wa.height, 0, wa.depth, InputOutput, visual, mask, &attr); lastServerInput = serverInput; xwc.stack_mode = Above; /* Look for the client in the current server side stacking * order and put the frame above what the client is above */ if (nchildren && children[0] == id) { /* client at the bottom */ xwc.stack_mode = Below; xwc.sibling = id; } else { for (unsigned int i = 0; i < nchildren; ++i) { if (i < nchildren - 1) { if (children[i + 1] == id) { xwc.sibling = children[i]; break; } } else /* client on top */ xwc.sibling = children[i]; } } XFree (children); /* Make sure the frame is underneath the client */ XConfigureWindow (dpy, serverFrame, CWSibling | CWStackMode, &xwc); /* Wait for the restacking to finish */ XSync (dpy, false); /* Always need to have the wrapper window mapped */ XMapWindow (dpy, wrapper); /* Reparent the client into the wrapper window */ XReparentWindow (dpy, id, wrapper, 0, 0); /* Restore events */ attr.event_mask = wa.your_event_mask; /* We don't care about client events on the frame, and listening for them * will probably end up fighting the client anyways, so disable them */ attr.do_not_propagate_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ResizeRedirectMask | SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask; XChangeWindowAttributes (dpy, id, CWEventMask | CWDontPropagate, &attr); if (wa.map_state == IsViewable || shaded) XMapWindow (dpy, serverFrame); attr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask; XChangeWindowAttributes (dpy, serverFrame, CWEventMask, &attr); XChangeWindowAttributes (dpy, wrapper, CWEventMask, &attr); XSelectInput (dpy, screen->root (), SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask | LeaveWindowMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask); XUngrabServer (dpy); XSync (dpy, false); window->windowNotify (CompWindowNotifyReparent); return true; } void PrivateWindow::manageFrameWindowSeparately () { /* This is where things get tricky ... it is possible * to receive a ConfigureNotify relative to a frame window * for a destroyed window in case we process a ConfigureRequest * for the destroyed window and then a DestroyNotify for it directly * afterwards. In that case, we will receive the ConfigureNotify * for the XConfigureWindow request we made relative to that frame * window. Because of this, we must keep the frame window in the stack * as a new toplevel window so that the ConfigureNotify will be processed * properly until it too receives a DestroyNotify * * We only wish to do this if we have recieved a CreateNotify for the * frame window. If we have not, then there will be no stacking operations * dependent on it and we should wait until CreateNotify in order to manage * it normally */ if (frame) { XWindowAttributes attrib; /* It's possible that the frame window was already destroyed because * the client was unreparented before it was destroyed (eg * UnmapNotify before DestroyNotify). In that case the frame window * is going to be an invalid window but since we haven't received * a DestroyNotify for it yet, it is possible that restacking * operations could occurr relative to it so we need to hold it * in the stack for now. Ensure that it is marked override redirect */ window->priv->queryFrameAttributes (attrib); /* Put the frame window "above" the client window * in the stack */ PrivateWindow::createCompWindow (id, id, attrib, frame); } } void PrivateWindow::unreparent () { if (!serverFrame) return; Display *dpy = screen->dpy (); XEvent e; bool alive = true; XWindowChanges xwc = XWINDOWCHANGES_INIT; unsigned int nchildren; Window *children = NULL, root_return, parent_return; XWindowAttributes wa; StackDebugger *dbg = StackDebugger::Default (); XSync (dpy, false); if (XCheckTypedWindowEvent (dpy, id, DestroyNotify, &e)) { XPutBackEvent (dpy, &e); alive = false; } else if (!XGetWindowAttributes (dpy, id, &wa)) alive = false; /* Also don't reparent back into root windows that have ended up * reparented into other windows (and as such we are unmanaging them) */ if (alive) { XQueryTree (dpy, id, &root_return, &parent_return, &children, &nchildren); if (parent_return != wrapper) alive = false; } if ((!destroyed) && alive) { XGrabServer (dpy); XChangeSaveSet (dpy, id, SetModeDelete); XSelectInput (dpy, serverFrame, NoEventMask); XSelectInput (dpy, wrapper, NoEventMask); XSelectInput (dpy, id, NoEventMask); XSelectInput (dpy, screen->root (), NoEventMask); XReparentWindow (dpy, id, screen->root (), 0, 0); /* Wait for the reparent to finish */ XSync (dpy, false); xwc.x = serverGeometry.xMinusBorder (); xwc.y = serverGeometry.yMinusBorder (); xwc.width = serverGeometry.widthIncBorders (); xwc.height = serverGeometry.heightIncBorders (); XConfigureWindow (dpy, serverFrame, CWX | CWY | CWWidth | CWHeight, &xwc); xwc.stack_mode = Below; xwc.sibling = serverFrame; XConfigureWindow (dpy, id, CWSibling | CWStackMode, &xwc); /* Wait for the window to be restacked */ XSync (dpy, false); XUnmapWindow (dpy, serverFrame); XSelectInput (dpy, id, wa.your_event_mask); XSelectInput (dpy, screen->root (), SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask | LeaveWindowMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask); XUngrabServer (dpy); XSync (dpy, false); XMoveWindow (dpy, id, serverGeometry.x (), serverGeometry.y ()); } if (children) XFree (children); if (dbg) dbg->addDestroyedFrame (serverFrame); manageFrameWindowSeparately (); /* Issue a DestroyNotify */ XDestroyWindow (screen->dpy (), serverFrame); XDestroyWindow (screen->dpy (), wrapper); /* This window is no longer "managed" in the * reparenting sense so clear its pending event * queue ... though maybe in future it would * be better to bookeep these events too and * handle the ReparentNotify */ pendingConfigures.clear (); frame = None; wrapper = None; serverFrame = None; // Finally, (i.e. after updating state) notify the change window->windowNotify (CompWindowNotifyUnreparent); } ./src/windowgeometry.cpp0000644000004100000410000001147713246301623015633 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include "privatewindow.h" #include "core/window.h" const CompWindow::Geometry & CompWindow::serverGeometry () const { return priv->attrib.override_redirect ? priv->geometry : priv->serverGeometry; } const CompWindow::Geometry & CompWindow::geometry () const { return priv->attrib.override_redirect ? priv->geometry : priv->serverGeometry; } int CompWindow::x () const { return geometry ().x (); } int CompWindow::y () const { return geometry ().y (); } CompPoint CompWindow::pos () const { return CompPoint (geometry ().x (), geometry ().y ()); } /* With border */ int CompWindow::width () const { return geometry ().widthIncBorders (); } int CompWindow::height () const { return geometry ().heightIncBorders (); } CompSize CompWindow::size () const { return CompSize (width (), height ()); } int CompWindow::serverX () const { return serverGeometry ().x (); } int CompWindow::serverY () const { return serverGeometry ().y (); } CompPoint CompWindow::serverPos () const { return CompPoint (serverGeometry ().x (), serverGeometry ().y ()); } /* With border */ int CompWindow::serverWidth () const { return serverGeometry ().widthIncBorders (); } int CompWindow::serverHeight () const { return serverGeometry ().heightIncBorders (); } const CompSize CompWindow::serverSize () const { return CompSize (serverGeometry ().widthIncBorders (), serverGeometry ().heightIncBorders ()); } CompRect CompWindow::borderRect () const { return CompRect (geometry ().xMinusBorder () - priv->border.left, geometry ().yMinusBorder () - priv->border.top, geometry ().widthIncBorders () + priv->border.left + priv->border.right, geometry ().heightIncBorders () + priv->border.top + priv->border.bottom); } CompRect CompWindow::serverBorderRect () const { return CompRect (serverGeometry ().xMinusBorder () - priv->border.left, serverGeometry ().yMinusBorder () - priv->border.top, serverGeometry ().widthIncBorders () + priv->border.left + priv->border.right, serverGeometry ().heightIncBorders() + priv->border.top + priv->border.bottom); } CompRect CompWindow::inputRect () const { return CompRect (geometry ().xMinusBorder () - priv->serverInput.left, geometry ().yMinusBorder () - priv->serverInput.top, geometry ().widthIncBorders () + priv->serverInput.left + priv->serverInput.right, geometry ().heightIncBorders () + priv->serverInput.top + priv->serverInput.bottom); } CompRect CompWindow::serverInputRect () const { return CompRect (serverGeometry ().xMinusBorder () - priv->serverInput.left, serverGeometry ().yMinusBorder () - priv->serverInput.top, serverGeometry ().widthIncBorders () + priv->serverInput.left + priv->serverInput.right, serverGeometry ().heightIncBorders () + priv->serverInput.top + priv->serverInput.bottom); } CompRect CompWindow::outputRect () const { return CompRect (geometry ().xMinusBorder ()- priv->output.left, geometry ().yMinusBorder () - priv->output.top, geometry ().widthIncBorders () + priv->output.left + priv->output.right, geometry ().heightIncBorders () + priv->output.top + priv->output.bottom); } CompRect CompWindow::serverOutputRect () const { return CompRect (serverGeometry ().xMinusBorder () - priv->output.left, serverGeometry ().yMinusBorder () - priv->output.top, serverGeometry ().widthIncBorders () + priv->output.left + priv->output.right, serverGeometry ().heightIncBorders () + priv->output.top + priv->output.bottom); } ./src/point/0000755000004100000410000000000013246301623013163 5ustar www-datawww-data./src/point/CMakeLists.txt0000644000004100000410000000145413246301623015727 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${compiz_SOURCE_DIR}/include/core/point.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/point.cpp ) ADD_LIBRARY( compiz_point STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_point PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_point ${GLIBMM_LIBRARIES} ) ./src/point/src/0000755000004100000410000000000013246301624013753 5ustar www-datawww-data./src/point/src/point.cpp0000644000004100000410000000424013246301623015607 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include CompPoint::CompPoint () : mX (0), mY (0) { } CompPoint::CompPoint (int x, int y) : mX (x), mY (y) { } void CompPoint::set (int x, int y) { mX = x; mY = y; } void CompPoint::setX (int x) { mX = x; } void CompPoint::setY (int y) { mY = y; } bool CompPoint::operator== (const CompPoint &point) const { return (mX == point.mX) && (mY == point.mY); } bool CompPoint::operator!= (const CompPoint &point) const { return !(*this == point); } CompPoint & CompPoint::operator+= (const CompPoint &point) { mX += point.mX; mY += point.mY; return *this; } CompPoint CompPoint::operator+ (const CompPoint &rhs) const { return CompPoint (mX + rhs.mX, mY + rhs.mY); } CompPoint & CompPoint::operator-= (const CompPoint &point) { mX -= point.mX; mY -= point.mY; return *this; } CompPoint CompPoint::operator- (const CompPoint &rhs) const { return CompPoint (mX - rhs.mX, mY - rhs.mY); } ./src/point/tests/0000755000004100000410000000000013246301624014326 5ustar www-datawww-data./src/point/tests/CMakeLists.txt0000644000004100000410000000102513246301623017063 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_point_test ${CMAKE_CURRENT_SOURCE_DIR}/test-point.cpp) add_executable (compiz_test_point ${CMAKE_CURRENT_SOURCE_DIR}/point/src/test-point.cpp) target_link_libraries (compiz_test_point compiz_point_test compiz_point ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_point COVERAGE compiz_point) ./src/point/tests/point/0000755000004100000410000000000013246301623015456 5ustar www-datawww-data./src/point/tests/point/src/0000755000004100000410000000000013246301624016246 5ustar www-datawww-data./src/point/tests/point/src/test-point.cpp0000644000004100000410000000355013246301623021062 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-point.h" class CompPointTestPoint : public CompWindowPointTest { public: CompPointTestPoint (); ~CompPointTestPoint (); protected: CompPoint p; }; CompPointTestPoint::CompPointTestPoint () : p (0, 0) { } CompPointTestPoint::~CompPointTestPoint () { } TEST_F(CompPointTestPoint, TestPoint) { p.setX (10); EXPECT_EQ (p.x (), 10); p.setY (10); EXPECT_EQ (p.y (), 10); EXPECT_EQ (p, CompPoint (10, 10)); EXPECT_TRUE (p == CompPoint (10, 10)); EXPECT_FALSE (p != CompPoint (10, 10)); p -= CompPoint (5, 5); EXPECT_EQ (p, CompPoint (5, 5)); p += CompPoint (3, 3); EXPECT_EQ (p, CompPoint (8, 8)); } ./src/point/tests/test-point.h0000644000004100000410000000301213246301623016600 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_WINDOW_GEOMETRY_H #define _COMPIZ_TEST_WINDOW_GEOMETRY_H #include #include #include #include class CompWindowPointTest : public ::testing::Test { public: CompWindowPointTest (); virtual ~CompWindowPointTest (); }; #endif ./src/point/tests/test-point.cpp0000644000004100000410000000251313246301623017140 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-point.h" CompWindowPointTest::CompWindowPointTest () { } CompWindowPointTest::~CompWindowPointTest () { } ./src/configurerequestbuffer-impl.h0000644000004100000410000000731113246301623017730 0ustar www-datawww-data/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_GEOMETRY_UPDATE_QUEUE_H #define _COMPIZ_GEOMETRY_UPDATE_QUEUE_H #include #include #include #include #include #include #include namespace compiz { namespace window { class AsyncServerWindow; namespace configure_buffers { class Lockable { public: typedef boost::shared_ptr Ptr; typedef boost::weak_ptr Weak; virtual ~Lockable () {} virtual void lock () = 0; }; class BufferLock : public Lockable, public Releasable { public: typedef boost::shared_ptr Ptr; virtual ~BufferLock () {} }; class CountedFreeze { public: virtual ~CountedFreeze () {} virtual void freeze () = 0; virtual void release () = 0; virtual void untrackLock (compiz::window::configure_buffers::BufferLock *lock) = 0; }; class ConfigureRequestBuffer : public CountedFreeze, public Buffer { public: typedef boost::function LockFactory; void freeze (); void release (); void untrackLock (compiz::window::configure_buffers::BufferLock *lock); void pushClientRequest (const XWindowChanges &xwc, unsigned int mask); void pushWrapperRequest (const XWindowChanges &xwc, unsigned int mask); void pushFrameRequest (const XWindowChanges &xwc, unsigned int mask); void pushSyntheticConfigureNotify (); compiz::window::configure_buffers::Releasable::Ptr obtainLock (); /* Implement getAttributes and require that * the queue is released before calling through * to the SyncServerWindow */ bool queryAttributes (XWindowAttributes &attrib); bool queryFrameAttributes (XWindowAttributes &attrib); XRectangle * queryShapeRectangles (int kind, int *count, int *ordering); void forceRelease (); static compiz::window::configure_buffers::Buffer::Ptr Create (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const LockFactory &factory); private: ConfigureRequestBuffer (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const LockFactory &factory); class Private; std::auto_ptr priv; }; class ConfigureBufferLock : public compiz::window::configure_buffers::BufferLock { public: typedef boost::shared_ptr Ptr; ConfigureBufferLock (CountedFreeze *); ~ConfigureBufferLock (); void lock (); void release (); private: class Private; std::auto_ptr priv; }; } } } #endif ./src/pluginclasshandler/0000755000004100000410000000000013246301624015715 5ustar www-datawww-data./src/pluginclasshandler/CMakeLists.txt0000644000004100000410000000164013246301623020455 0ustar www-datawww-data INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}../logmessage/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) SET( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/pluginclasses.h ${CMAKE_CURRENT_SOURCE_DIR}/include/core/pluginclasshandler.h ${CMAKE_CURRENT_SOURCE_DIR}/include/core/valueholder.h ) SET( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/valueholder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/pluginclasses.cpp ) ADD_LIBRARY( compiz_pluginclasshandler STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_pluginclasshandler PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) ./src/pluginclasshandler/include/0000755000004100000410000000000013246301623017337 5ustar www-datawww-data./src/pluginclasshandler/include/core/0000755000004100000410000000000013246301623020267 5ustar www-datawww-data./src/pluginclasshandler/include/core/pluginclasshandler.h0000644000004100000410000002473413246301623024334 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPPLUGINCLASSHANDLER_H #define _COMPPLUGINCLASSHANDLER_H #include #include #include #include #include /* Continuously increments every time a new * plugin class is added, guaranteed to be * the same as the pcIndex of the most up-to-date * PluginClassHandler index. Any index that * hold the same value this value is safe to * use to retreive the plugin class for a base * class (and as such we don't need to constantly * re-query ValueHolder for the index of this plugin * on the base class) */ extern unsigned int pluginClassHandlerIndex; namespace compiz { namespace plugin { namespace internal { class PluginKey; /** * LoadedPluginClassBridge * * This template essentially exists so that we can reduce the * scope of functions which are allowed to mark plugin classes * as instantiatable as we can't really inject the interface * from PluginClassHandler to do that anywhere. We also can't * forward declare a nested class declaration, but we can forward * declare PluginKey, which users should inherit from and take * it by reference. If the class we're depending on can only be * defined in one other place along with a private constructor * accessible only to a friend it means that we've effectively * limited the scope of users of this class. */ template class LoadedPluginClassBridge { public: static void allowInstantiations (const PluginKey &); static void disallowInstantiations (const PluginKey &); }; } } } template class PluginClassHandler { public: typedef Tp ClassPluginType; typedef Tb ClassPluginBaseType; PluginClassHandler (Tb *); ~PluginClassHandler (); /** * Changes this PluginClassHandler's state to "failed" */ void setFailed () { mFailed = true; }; /** * Checks to see if this plugin class failed to load for * whatever reason, so that instantiation of the class * can be aborted */ bool loadFailed () { return mFailed; }; /** * Returns the unique instance of the plugin class * for this base class */ Tb * get () { return mBase; }; static Tp * get (Tb *); static const Tp * get (const Tb *); private: /** * Returns the unique string identifying this plugin type with it's * ABI */ static CompString keyName () { return compPrintf ("%s_index_%lu", typeid (Tp).name (), ABI); } /** * Actually initializes the index of this plugin class * by allocating a new index for plugin class storage * on this base class if there wasn't one already and then * storing that index inside of ValueHolder */ static bool initializeIndex (Tb *base); static inline Tp * getInstance (Tb *base); static void allowInstantiations (); static void disallowInstantiations (); template friend class compiz::plugin::internal::LoadedPluginClassBridge; private: bool mFailed; Tb *mBase; static PluginClassIndex mIndex; static bool mPluginLoaded; }; namespace compiz { namespace plugin { namespace internal { template void LoadedPluginClassBridge ::allowInstantiations (const PluginKey &) { PluginClassHandler ::allowInstantiations (); } template void LoadedPluginClassBridge ::disallowInstantiations (const PluginKey &) { PluginClassHandler ::disallowInstantiations (); } } } } template PluginClassIndex PluginClassHandler::mIndex; template bool PluginClassHandler::mPluginLoaded = false; /** * Attaches a unique instance of the specified plugin class to a * unique instance of a specified base class */ template PluginClassHandler::PluginClassHandler (Tb *base) : mFailed (false), mBase (base) { /* If allocating plugin class indices for this base has * already failed once don't bother to allocate more for * this plugin class, just instantly fail */ if (mIndex.pcFailed) { mFailed = true; } else { /* The index for this plugin class hasn't been initiated * so do that (done once per plugin) */ if (!mIndex.initiated) mFailed = !initializeIndex (base); /* Increase the reference count of this plugin class index * for this plugin on this base object for each attached * plugin class and set the index pointer */ if (!mIndex.failed) { mIndex.refCount++; mBase->pluginClasses[mIndex.index] = static_cast (this); } } } template bool PluginClassHandler::initializeIndex (Tb *base) { /* Allocate a new storage space index in the array of CompPrivate's * specified in the base class */ mIndex.index = base->allocPluginClassIndex (); if (mIndex.index != (unsigned)~0) { /* Allocation was successful, this is the most recently allocated * plugin class index so it is fresh to use */ mIndex.initiated = true; mIndex.failed = false; mIndex.pcIndex = pluginClassHandlerIndex; CompPrivate p; p.uval = mIndex.index; /* Also store the index value inside of ValueHolder for this plugin-base * combination so that we can fetch it later should the index location * change */ if (!ValueHolder::Default ()->hasValue (keyName ())) { ValueHolder::Default ()->storeValue (keyName (), p); pluginClassHandlerIndex++; } else { compLogMessage ("core", CompLogLevelFatal, "Private index value \"%s\" already stored in screen.", keyName ().c_str ()); } return true; } else { mIndex.index = 0; mIndex.failed = true; mIndex.initiated = false; mIndex.pcFailed = true; mIndex.pcIndex = pluginClassHandlerIndex; return false; } } template PluginClassHandler::~PluginClassHandler () { /* Only bother to destroy the static mIndex if plugin * class allocation was actually successful */ if (!mIndex.pcFailed) { mIndex.refCount--; /* Once this index's reference count hits zero it * means that there are no more plugin classes attached * to the base class, so other plugins are free to use our * index and we can erase our data from ValueHolder * (also increment pluginClassHandlerIndex since after doing * this operation, all the other indexes with the same pcIndex * won't be fresh) */ if (mIndex.refCount == 0) { mBase->freePluginClassIndex (mIndex.index); mIndex.initiated = false; mIndex.failed = false; mIndex.pcIndex = pluginClassHandlerIndex; ValueHolder::Default ()->eraseValue (keyName ()); pluginClassHandlerIndex++; } } } template Tp * PluginClassHandler::getInstance (Tb *base) { /* Return the plugin class found at index if it exists * otherwise spawn a new one implicitly (objects should * never expect ::get () to fail, unless the plugin class * fails to instantiate or the underlying base object * does not take plugin classes of this type) */ if (base->pluginClasses[mIndex.index]) return static_cast (base->pluginClasses[mIndex.index]); else { /* mIndex.index will be implicitly set by * the constructor */ Tp *pc = new Tp (base); if (!pc) return NULL; /* FIXME: If a plugin class fails to load for * whatever reason, then ::get is going to return * NULL, which is unsafe in cases that aren't * initScreen and initWindow */ if (pc->loadFailed ()) { delete pc; return NULL; } return static_cast (base->pluginClasses[mIndex.index]); } } template const Tp * PluginClassHandler::get (const Tb *base) { return get (const_cast (base)); } template Tp * PluginClassHandler::get (Tb *base) { /* Never instantiate an instance of this class * if the relevant plugin has not been loaded */ if (!mPluginLoaded) return NULL; /* Always ensure that the index is initialized before * calls to ::get */ if (!mIndex.initiated) initializeIndex (base); /* If pluginClassHandlerIndex == mIndex.pcIndex it means that our * mIndex.index is fresh and can be used directly without needing * to fetch it from ValueHolder */ if (mIndex.initiated && pluginClassHandlerIndex == mIndex.pcIndex) return getInstance (base); /* If allocating or getting the updated index failed at any point * then just return NULL we don't know where our private data is stored */ if (mIndex.failed && pluginClassHandlerIndex == mIndex.pcIndex) return NULL; if (ValueHolder::Default ()->hasValue (keyName ())) { mIndex.index = ValueHolder::Default ()->getValue (keyName ()).uval; mIndex.initiated = true; mIndex.failed = false; mIndex.pcIndex = pluginClassHandlerIndex; return getInstance (base); } else { mIndex.initiated = false; mIndex.failed = true; mIndex.pcIndex = pluginClassHandlerIndex; return NULL; } } template void PluginClassHandler::allowInstantiations () { mPluginLoaded = true; } template void PluginClassHandler::disallowInstantiations () { mPluginLoaded = false; } #endif ./src/pluginclasshandler/include/core/pluginclasses.h0000644000004100000410000000424213246301623023316 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PLUGINCLASSES_H #define _PLUGINCLASSES_H #include /** * Represents the index of a plugin's object classes */ class PluginClassIndex { public: PluginClassIndex () : index ((unsigned)~0), refCount (0), initiated (false), failed (false), pcFailed (false), pcIndex (0) {} unsigned int index; int refCount; bool initiated; bool failed; bool pcFailed; unsigned int pcIndex; }; /** * Represents some storage of a plugin class on a core object, * usually some pointer (void *) */ class PluginClassStorage { public: typedef std::vector Indices; public: PluginClassStorage (Indices& iList); public: std::vector pluginClasses; protected: static unsigned int allocatePluginClassIndex (Indices& iList); static void freePluginClassIndex (Indices& iList, unsigned int idx); }; #endif ./src/pluginclasshandler/include/core/valueholder.h0000644000004100000410000000343513246301623022757 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_VALUEHOLDER_H #define _COMPIZ_VALUEHOLDER_H #include #include #include #include class PrivateValueHolder; class ValueHolder : boost::noncopyable { public: ValueHolder (); ~ValueHolder (); void eraseValue (CompString key); bool hasValue (CompString key); void storeValue (CompString key, CompPrivate value); CompPrivate getValue (CompString key); static ValueHolder * Default (); static void SetDefault (ValueHolder *); private: PrivateValueHolder *priv; }; #endif ./src/pluginclasshandler/src/0000755000004100000410000000000013246301624016504 5ustar www-datawww-data./src/pluginclasshandler/src/pluginclasses.cpp0000644000004100000410000000414113246301623022063 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include PluginClassStorage::PluginClassStorage (PluginClassStorage::Indices& iList) : pluginClasses (0) { if (iList.size () > 0) pluginClasses.resize (iList.size ()); } unsigned int PluginClassStorage::allocatePluginClassIndex (PluginClassStorage::Indices& iList) { unsigned int i; for (i = 0; i < iList.size (); i++) { if (!iList.at (i)) { iList.at (i) = true; return i; } } i = iList.size (); iList.resize (i + 1); iList.at (i) = true; return i; } void PluginClassStorage::freePluginClassIndex (PluginClassStorage::Indices& iList, unsigned int idx) { unsigned int size = iList.size (); if (idx >= size) return; if (idx < size - 1) { iList.at (idx) = false; return; } iList.resize (size - 1); } ./src/pluginclasshandler/src/valueholder.cpp0000644000004100000410000000504613246301623021526 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include namespace { static ValueHolder *gDefault; } class PrivateValueHolder { public: std::map valueMap; }; ValueHolder::ValueHolder () : priv (new PrivateValueHolder) { } ValueHolder::~ValueHolder () { delete priv; } ValueHolder * ValueHolder::Default () { return gDefault; } void ValueHolder::SetDefault (ValueHolder *v) { gDefault = v; } void ValueHolder::storeValue (CompString key, CompPrivate value) { std::map::iterator it; it = priv->valueMap.find (key); if (it != priv->valueMap.end ()) { it->second = value; } else { priv->valueMap.insert (std::pair (key, value)); } } void ValueHolder::eraseValue (CompString key) { std::map::iterator it; it = priv->valueMap.find (key); if (it != priv->valueMap.end ()) { priv->valueMap.erase (key); } } bool ValueHolder::hasValue (CompString key) { return (priv->valueMap.find (key) != priv->valueMap.end ()); } CompPrivate ValueHolder::getValue (CompString key) { CompPrivate p; std::map::iterator it; it = priv->valueMap.find (key); if (it != priv->valueMap.end ()) { return it->second; } else { p.uval = 0; return p; } } ./src/pluginclasshandler/tests/0000755000004100000410000000000013246301624017057 5ustar www-datawww-data./src/pluginclasshandler/tests/indexes/0000755000004100000410000000000013246301623020515 5ustar www-datawww-data./src/pluginclasshandler/tests/indexes/src/0000755000004100000410000000000013246301624021305 5ustar www-datawww-data./src/pluginclasshandler/tests/indexes/src/test-pch-indexes.cpp0000644000004100000410000002262713246301623025205 0ustar www-datawww-data#include #include class IndexesPlugin; typedef PluginClassHandler IPBHandler; class IndexesPlugin : public Plugin, public IPBHandler { public: IndexesPlugin (Base *); ~IndexesPlugin (); }; class IndexesPlugin2; typedef PluginClassHandler IPB2Handler; class IndexesPlugin2 : public Plugin, public IPB2Handler { public: IndexesPlugin2 (Base *); }; class IndexesPlugin3; typedef PluginClassHandler IPB3Handler; class IndexesPlugin3 : public Plugin, public IPB3Handler { public: IndexesPlugin3 (Base *); }; class FailingBase: public PluginClassStorage { public: FailingBase (); virtual ~FailingBase (); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); }; class FailingIndexesPlugin; typedef PluginClassHandler FIPBHandler; class FailingIndexesPlugin : public FIPBHandler { public: FailingIndexesPlugin (FailingBase *); }; unsigned int FailingBase::allocPluginClassIndex () { /* Always fails */ return (unsigned int) ~0; } void FailingBase::freePluginClassIndex (unsigned int index) { /* Does nothing, since this base is made of fail */ } FailingBase::FailingBase () : PluginClassStorage (globalPluginClassIndices) { } FailingBase::~FailingBase () { } IndexesPlugin::IndexesPlugin (Base *base): Plugin (base), IPBHandler (base) { } IndexesPlugin::~IndexesPlugin () { } IndexesPlugin2::IndexesPlugin2 (Base *base): Plugin (base), IPB2Handler (base) { } IndexesPlugin3::IndexesPlugin3 (Base *base): Plugin (base), IPB3Handler (base) { setFailed (); } FailingIndexesPlugin::FailingIndexesPlugin (FailingBase *base): FIPBHandler (base) { } class CompizPCHTestIndexes : public CompizPCHTest { public: void run (); template void printFailure (I *); public: unsigned int ePluginClassHandlerIndex; unsigned int eIndex; int eRefCount; bool eInitiated; bool eFailed; bool ePcFailed; unsigned int ePcIndex; bool eLoadFailed; }; template void CompizPCHTestIndexes::printFailure (I *i) { std::cout << "FAIL: index value does not match!" << std::endl; std::cout << "INFO: Values of " << std::hex << (void *) i << " are " << std::endl; std::cout << "INFO: pluginClassHandlerIndex is " << pluginClassHandlerIndex << std::endl; std::cout << "INFO: mIndex.refCount " << i->mIndex.refCount << std::endl; std::cout << "INFO: mIndex.initiated " << i->mIndex.initiated << std::endl; std::cout << "INFO: mIndex.failed " << i->mIndex.failed << std::endl; std::cout << "INFO: mIndex.pcFailed " << i->mIndex.pcFailed << std::endl; std::cout << "INFO: mIndex.pcIndex " << i->mIndex.pcIndex << std::endl; std::cout << "INFO: loadFailed " << (i->loadFailed () ? 1 : 0) << std::endl; std::cout << "INFO: Values of " << std::hex << (void *) i << " should be " << std::endl; std::cout << "INFO: pluginClassHandlerIndex is " << ePluginClassHandlerIndex << std::endl; std::cout << "INFO: mIndex.index " << eIndex << std::endl; std::cout << "INFO: mIndex.refCount " << eRefCount << std::endl; std::cout << "INFO: mIndex.initiated " << eInitiated << std::endl; std::cout << "INFO: mIndex.failed " << eFailed << std::endl; std::cout << "INFO: mIndex.pcFailed " << ePcFailed << std::endl; std::cout << "INFO: mIndex.pcIndex " << ePcIndex << std::endl; std::cout << "INFO: loadFailed " << (eLoadFailed ? 1 : 0) << std::endl; } #define INDEX_INCORRECT(i) \ pluginClassHandlerIndex != ePluginClassHandlerIndex || \ i->mIndex.index != eIndex || \ i->mIndex.refCount != eRefCount || \ i->mIndex.initiated != eInitiated || \ i->mIndex.failed != eFailed || \ i->mIndex.pcFailed != ePcFailed || \ i->mIndex.pcIndex != ePcIndex TEST_F( CompizPCHTestIndexes, TestIndexes ) { Plugin *p; Base *b; FailingBase *fb; FailingIndexesPlugin *fp; IPBHandler *ipbhandler_p; IPB2Handler *ipbhandler_p2; IPB3Handler *ipbhandler_p3; FIPBHandler *fipbhandler_p; bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin (bases.back ())); p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 1; eIndex = 0; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin (bases.back ())); p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 1; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin2 (bases.back ())); p = plugins.back (); ipbhandler_p2 = (IPB2Handler *) p; ePluginClassHandlerIndex = 2; eIndex = 1; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 1; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p2)) { printFailure (ipbhandler_p2); exit (1); } plugins.pop_back (); delete p; b = bases.back (); bases.pop_back (); delete b; p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 3; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } plugins.pop_back (); delete p; b = bases.back (); bases.pop_back (); delete b; p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 3; eIndex = 0; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } p = IndexesPlugin::get (bases.back ()); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 3; eIndex = 0; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 3; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin3 (bases.back ())); p = plugins.back (); ipbhandler_p3 = (IPB3Handler *) p; ePluginClassHandlerIndex = 4; eIndex = 1; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 0; eLoadFailed = true; /* * This seems to be broken on some compilers * disable this test for now * * if (INDEX_INCORRECT (ipbhandler_p3)) * { * printFailure (ipbhandler_p3); * exit (1); * } */ bases.push_back (new Base ()); plugins.push_back (new IndexesPlugin (bases.back ())); p = plugins.back (); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 4; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 3; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } plugins.push_back (new IndexesPlugin2 (bases.back ())); p = plugins.back (); ipbhandler_p2 = (IPB2Handler *) p; ePluginClassHandlerIndex = 5; eIndex = 2; eRefCount = 1; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 4; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p2)) { printFailure (ipbhandler_p2); FAIL(); } /* Now call ::get on the first one to reset the pluginClassHandlerIndex */ p = IndexesPlugin::get (bases.back ()); ipbhandler_p = (IPBHandler *) p; ePluginClassHandlerIndex = 5; eIndex = 0; eRefCount = 2; eInitiated = true; eFailed = false; ePcFailed = false; ePcIndex = 5; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p)) { printFailure (ipbhandler_p); FAIL(); } /* Now erase the key that was used by the second plugin so subsequent attempts to ::get * will fail */ p = plugins.back (); ipbhandler_p2 = (IPB2Handler *) p; ValueHolder::Default ()->eraseValue (ipbhandler_p2->keyName ()); p = IndexesPlugin2::get (bases.back ()); ePluginClassHandlerIndex = 5; eIndex = 2; eRefCount = 1; eInitiated = false; eFailed = true; ePcFailed = false; ePcIndex = 5; eLoadFailed = false; if (INDEX_INCORRECT (ipbhandler_p2)) { printFailure (ipbhandler_p2); FAIL(); } fb = new FailingBase (); fp = new FailingIndexesPlugin (fb); fipbhandler_p = (FIPBHandler *) fp; ePluginClassHandlerIndex = 5; eIndex = 0; eRefCount = 0; eInitiated = false; eFailed = true; ePcFailed = true; ePcIndex = 5; eLoadFailed = false; if (INDEX_INCORRECT (fipbhandler_p)) { printFailure (fipbhandler_p); FAIL(); } delete fp; delete fb; } ./src/pluginclasshandler/tests/CMakeLists.txt0000644000004100000410000000273013246301623021620 0ustar www-datawww-datainclude_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) add_library( compiz_pch_test STATIC test-pluginclasshandler.cpp ) add_executable( compiz_pch_construct ${CMAKE_CURRENT_SOURCE_DIR}/construct/src/test-pch-construct.cpp ) add_executable( compiz_pch_get ${CMAKE_CURRENT_SOURCE_DIR}/get/src/test-pch-get.cpp ) #add_executable( # compiz_pch_indexes # # ${CMAKE_CURRENT_SOURCE_DIR}/indexes/src/test-pch-indexes.cpp #) add_executable( compiz_pch_typenames ${CMAKE_CURRENT_SOURCE_DIR}/typenames/src/test-pch-typenames.cpp ) target_link_libraries( compiz_pch_construct compiz_pch_test compiz_logmessage compiz_pluginclasshandler compiz_string ${GTEST_BOTH_LIBRARIES} ) target_link_libraries( compiz_pch_get compiz_pch_test compiz_logmessage compiz_pluginclasshandler compiz_string ${GTEST_BOTH_LIBRARIES} ) target_link_libraries( compiz_pch_typenames compiz_pch_test compiz_logmessage compiz_pluginclasshandler compiz_string ${GTEST_BOTH_LIBRARIES} ) # Not compilable #target_link_libraries( # compiz_pch_indexes # compiz_pch_test # # compiz_pluginclasshandler # compiz_string # # gtest # gtest_main #) compiz_discover_tests (compiz_pch_construct COVERAGE compiz_pluginclasshandler) compiz_discover_tests (compiz_pch_get COVERAGE compiz_pluginclasshandler) #add_test( compiz_pch_indexes compiz_pch_indexes ) compiz_discover_tests (compiz_pch_typenames COVERAGE compiz_pluginclasshandler) ./src/pluginclasshandler/tests/get/0000755000004100000410000000000013246301623017635 5ustar www-datawww-data./src/pluginclasshandler/tests/get/src/0000755000004100000410000000000013246301624020425 5ustar www-datawww-data./src/pluginclasshandler/tests/get/src/test-pch-get.cpp0000644000004100000410000000354713246301623023445 0ustar www-datawww-data#include namespace cpi = compiz::plugin::internal; using ::testing::IsNull; class GetPlugin : public Plugin, public PluginClassHandler { public: GetPlugin (Base *); }; GetPlugin::GetPlugin (Base *base): Plugin (base), PluginClassHandler (base) { } class PluginClassHandlerGet : public CompizPCHTest { public: PluginClassHandlerGet (); ~PluginClassHandlerGet (); }; PluginClassHandlerGet::PluginClassHandlerGet () { cpi::LoadedPluginClassBridge ::allowInstantiations (key); } PluginClassHandlerGet::~PluginClassHandlerGet () { cpi::LoadedPluginClassBridge ::disallowInstantiations (key); } TEST_F (PluginClassHandlerGet, TestGet) { Plugin *p; bases.push_back (new Base ()); plugins.push_back (new GetPlugin (bases.back ())); bases.push_back (new Base ()); plugins.push_back (new GetPlugin (bases.back ())); p = GetPlugin::get (bases.front ()); if (p != plugins.front ()) { FAIL() << "Returned Plugin * is not plugins.front ()"; } p = GetPlugin::get (bases.back ()); if (p != plugins.back ()) { FAIL() << "Returned Plugin * is not plugins.back ()"; } /* Now create a third base and check if plugin is implicitly created */ bases.push_back (new Base ()); plugins.push_back (GetPlugin::get (bases.back ())); p = plugins.back (); if (p->b != bases.back ()) { FAIL() << "Returned Plugin * is not the plugin for bases.back ()"; } } TEST_F (PluginClassHandlerGet, TestGetNoInstantiationsAllowed) { cpi::LoadedPluginClassBridge ::disallowInstantiations (key); Plugin *p; bases.push_back (new Base ()); plugins.push_back (new GetPlugin (bases.back ())); p = GetPlugin::get (bases.front ()); EXPECT_THAT (p, IsNull ()); } ./src/pluginclasshandler/tests/test-pluginclasshandler.h0000644000004100000410000000211513246301623024065 0ustar www-datawww-data#include #include #include #include #include extern PluginClassStorage::Indices globalPluginClassIndices; extern unsigned int pluginClassHandlerIndex; extern bool debugOutput; extern char *programName; class Base; class Global: public ValueHolder { public: Global (); std::list bases; }; class Base: public PluginClassStorage { public: Base (); virtual ~Base (); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); }; class Plugin { public: Plugin (Base *); virtual ~Plugin (); Base *b; }; namespace compiz { namespace plugin { namespace internal { /* The version available in the tests is * readily constructed */ class PluginKey { }; } } } class CompizPCHTest : public ::testing::Test { public: CompizPCHTest (); virtual ~CompizPCHTest (); Global *global; std::list bases; std::list plugins; compiz::plugin::internal::PluginKey key; }; ./src/pluginclasshandler/tests/typenames/0000755000004100000410000000000013246301623021063 5ustar www-datawww-data./src/pluginclasshandler/tests/typenames/src/0000755000004100000410000000000013246301624021653 5ustar www-datawww-data./src/pluginclasshandler/tests/typenames/src/test-pch-typenames.cpp0000644000004100000410000000364413246301623026117 0ustar www-datawww-data#include class TypenamesPlugin: public Plugin, public PluginClassHandler { public: TypenamesPlugin (Base *); }; class TypenamesPluginABI1: public Plugin, public PluginClassHandler< TypenamesPluginABI1, Base, 1> { public: TypenamesPluginABI1 (Base *); }; class TypenamesPluginABI2: public Plugin, public PluginClassHandler< TypenamesPluginABI2, Base, 2> { public: TypenamesPluginABI2 (Base *); }; TypenamesPlugin::TypenamesPlugin (Base *base) : Plugin(base), PluginClassHandler(base) { } TypenamesPluginABI1::TypenamesPluginABI1 (Base *base) : Plugin(base), PluginClassHandler(base) { } TypenamesPluginABI2::TypenamesPluginABI2 (Base *base) : Plugin(base), PluginClassHandler(base) { } TEST_F( CompizPCHTest, TestTypenames) { std::list::iterator it; bases.push_back(new Base()); plugins.push_back(new TypenamesPlugin(bases.back())); bases.push_back(new Base()); plugins.push_back(new TypenamesPluginABI1(bases.back())); bases.push_back(new Base()); plugins.push_back(new TypenamesPluginABI2(bases.back())); if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(TypenamesPlugin).name(), 0))) { FAIL() << "ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(TypenamesPlugin).name(), 0); } if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(TypenamesPluginABI1).name(), 1))) { FAIL() << "ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(TypenamesPluginABI1).name(), 0); } if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(TypenamesPluginABI2).name(), 2))) { FAIL() << "FAIL: ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(TypenamesPluginABI2).name(), 2); } } ./src/pluginclasshandler/tests/test-pluginclasshandler.cpp0000644000004100000410000000303113246301623024416 0ustar www-datawww-data#include "test-pluginclasshandler.h" #include #define foreach BOOST_FOREACH PluginClassStorage::Indices globalPluginClassIndices (0); unsigned int pluginClassHandlerIndex = 0; bool debugOutput; char *programName; namespace { static CompizPCHTest *gTest; }; Global::Global () { } unsigned int Base::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (globalPluginClassIndices); foreach (Base *b, gTest->global->bases) { if (globalPluginClassIndices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (globalPluginClassIndices.size ()); } return i; } void Base::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (globalPluginClassIndices, index); foreach (Base *b, gTest->global->bases) { if (globalPluginClassIndices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (globalPluginClassIndices.size ()); } } Base::Base () : PluginClassStorage (globalPluginClassIndices) { gTest->global->bases.push_back (this); } Base::~Base () { gTest->global->bases.remove (this); } Plugin::Plugin (Base *base) : b (base) { } Plugin::~Plugin () { } CompizPCHTest::CompizPCHTest () : global (new Global()) { ValueHolder::SetDefault (static_cast (global)); gTest = this; } CompizPCHTest::~CompizPCHTest () { foreach (Plugin *p, plugins) { delete p; } foreach (Base *b, bases) { delete b; } delete global; } ./src/pluginclasshandler/tests/construct/0000755000004100000410000000000013246301623021102 5ustar www-datawww-data./src/pluginclasshandler/tests/construct/src/0000755000004100000410000000000013246301624021672 5ustar www-datawww-data./src/pluginclasshandler/tests/construct/src/test-pch-construct.cpp0000644000004100000410000000344113246301623026150 0ustar www-datawww-data#include class BuildPlugin: public Plugin, public PluginClassHandler { public: BuildPlugin (Base *base) : Plugin(base), PluginClassHandler (base) { } }; class PluginClassHandlerConstruction : public CompizPCHTest { public: PluginClassHandlerConstruction (); ~PluginClassHandlerConstruction (); }; PluginClassHandlerConstruction::PluginClassHandlerConstruction () { namespace cpi = compiz::plugin::internal; cpi::LoadedPluginClassBridge ::allowInstantiations (key); } PluginClassHandlerConstruction::~PluginClassHandlerConstruction () { namespace cpi = compiz::plugin::internal; cpi::LoadedPluginClassBridge ::disallowInstantiations (key); } TEST_F (PluginClassHandlerConstruction, TestConstruction) { Plugin *p; bases.push_back(new Base()); plugins.push_back(static_cast(new BuildPlugin(bases.back()))); bases.push_back(new Base()); plugins.push_back(static_cast(new BuildPlugin(bases.back()))); if (bases.front()->pluginClasses.size() != globalPluginClassIndices.size()) { FAIL() << "allocated number of plugin classes is not the same as the" " global number of allocated plugin classes"; } if (!ValueHolder::Default()->hasValue( compPrintf("%s_index_%lu", typeid(BuildPlugin).name(), 0))) { FAIL() << "ValueHolder does not have value " << compPrintf("%s_index_%lu", typeid(BuildPlugin).name(), 0); } p = BuildPlugin::get(bases.front()); if (p != plugins.front()) { FAIL() << "Returned Plugin * is not plugins.front ()"; } p = BuildPlugin::get(bases.back()); if (p != plugins.back()) { FAIL() << "Returned Plugin * is not plugins.back ()"; } } ./src/servergrab/0000755000004100000410000000000013246301623014174 5ustar www-datawww-data./src/servergrab/CMakeLists.txt0000644000004100000410000000132413246301623016734 0ustar www-datawww-dataINCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${Boost_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/servergrab.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/servergrab.cpp ) ADD_LIBRARY( compiz_servergrab STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_servergrab PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) ./src/servergrab/include/0000755000004100000410000000000013246301623015617 5ustar www-datawww-data./src/servergrab/include/core/0000755000004100000410000000000013246301624016550 5ustar www-datawww-data./src/servergrab/include/core/servergrab.h0000644000004100000410000000312313246301623021061 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMP_SERVER_GRAB_H #define _COMP_SERVER_GRAB_H class ServerGrabInterface { public: virtual ~ServerGrabInterface () {} virtual void grabServer () = 0; virtual void ungrabServer () = 0; virtual void syncServer () = 0; }; class ServerLock { public: ServerLock (ServerGrabInterface *i); ~ServerLock (); private: ServerGrabInterface *mServerGrab; }; #endif ./src/servergrab/src/0000755000004100000410000000000013246301624014764 5ustar www-datawww-data./src/servergrab/src/servergrab.cpp0000644000004100000410000000273213246301623017635 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include ServerLock::ServerLock (ServerGrabInterface *i) : mServerGrab (i) { mServerGrab->grabServer (); mServerGrab->syncServer (); } ServerLock::~ServerLock () { mServerGrab->ungrabServer (); mServerGrab->syncServer (); } ./src/servergrab/tests/0000755000004100000410000000000013246301624015337 5ustar www-datawww-data./src/servergrab/tests/CMakeLists.txt0000644000004100000410000000064613246301623020104 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_executable (compiz_test_servergrab ${CMAKE_CURRENT_SOURCE_DIR}/test-servergrab.cpp) target_link_libraries (compiz_test_servergrab compiz_servergrab ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_servergrab COVERAGE compiz_servergrab) ./src/servergrab/tests/test-servergrab.cpp0000644000004100000410000000335513246301623021167 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include class MockServerGrab : public ServerGrabInterface { public: MOCK_METHOD0 (grabServer, void ()); MOCK_METHOD0 (ungrabServer, void ()); MOCK_METHOD0 (syncServer, void ()); }; class ServerGrabTest : public ::testing::Test { }; TEST(ServerGrabTest, TestServerGrab) { MockServerGrab msg; EXPECT_CALL (msg, grabServer ()); EXPECT_CALL (msg, syncServer ()).Times (2); ServerLock l (&msg); EXPECT_CALL (msg, ungrabServer ()); } ./src/privateiosource.h0000644000004100000410000000372013246301623015430 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_PRIVATEIOSOURCE_H #define _COMPIZ_PRIVATEIOSOURCE_H #include typedef boost::function FdWatchCallBack; typedef int CompWatchFdHandle; namespace compiz { namespace private_screen { class EventManager; } } class CompWatchFd : public Glib::IOSource { public: virtual ~CompWatchFd (); static Glib::RefPtr create (int, Glib::IOCondition, FdWatchCallBack); protected: explicit CompWatchFd (int, Glib::IOCondition, FdWatchCallBack); bool internalCallback (Glib::IOCondition); private: int mFd; FdWatchCallBack mCallBack; CompWatchFdHandle mHandle; bool mForceFail; bool mExecuting; friend class ::compiz::private_screen::EventManager; }; #endif ./src/global.cpp0000644000004100000410000000307013246301623013776 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Thomas Voss */ #include #include "core/string.h" class CompWindow; char *programName; char **programArgv; int programArgc; bool restartSignal = false; bool replaceCurrentWm = false; bool sendStartupMessage = false; bool useDesktopHints = false; bool debugOutput = false; bool synchronousX = false; std::list initialPlugins; unsigned int pluginClassHandlerIndex = 0; ./src/event.cpp0000644000004100000410000017506313246301635013676 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #define foreach BOOST_FOREACH #include #include #include #include #include #include #include #include "privatescreen.h" #include "privatewindow.h" #include "privatestackdebugger.h" #include "eventmanagement.h" namespace cps = compiz::private_screen; namespace ce = compiz::events; namespace { Window CompWindowToWindow (CompWindow *window) { return window ? window->id () : None; } } bool PrivateWindow::handleSyncAlarm () { if (priv->syncWait) { priv->syncWait = false; if (window->resize (priv->syncGeometry)) { window->windowNotify (CompWindowNotifySyncAlarm); } else { /* resizeWindow failing means that there is another pending resize and we must send a new sync request to the client */ window->sendSyncRequest (); } } return false; } static bool autoRaiseTimeout (CompScreen *screen) { CompWindow *w = screen->findWindow (screen->activeWindow ()); if (screen->autoRaiseWindow () == screen->activeWindow () || (w && (screen->autoRaiseWindow () == w->transientFor ()))) { w = screen->findWindow (screen->autoRaiseWindow ()); if (w) w->updateAttributes (CompStackingUpdateModeNormal); } return false; } #define REAL_MOD_MASK (ShiftMask | ControlMask | Mod1Mask | Mod2Mask | \ Mod3Mask | Mod4Mask | Mod5Mask | CompNoMask) static bool isCallBackBinding (CompAction &action, CompAction::BindingType type, CompAction::State state) { if (!(action.type () & type)) return false; if (!(action.state () & state)) return false; if (!action.active ()) return false; return true; } static bool isCallBackBinding (CompOption &option, CompAction::BindingType type, CompAction::State state) { if (!option.isAction ()) return false; return isCallBackBinding (option.value ().action (), type, state); } static bool isInitiateBinding (CompOption &option, CompAction::BindingType type, CompAction::State state, CompAction **action) { if (!isCallBackBinding (option, type, state)) return false; if (option.value ().action ().initiate ().empty ()) return false; *action = &option.value ().action (); return true; } static bool isBound (CompAction &action, CompAction::BindingType type, CompAction::State state) { return isCallBackBinding (action, type, state); } static bool isBound (CompOption &option, CompAction::BindingType type, CompAction::State state, CompAction **action) { if (!isCallBackBinding (option, type, state)) return false; *action = &option.value ().action (); return true; } bool cps::EventManager::triggerPress (CompAction *action, CompAction::State state, CompOption::Vector &arguments) { bool actionEventHandled = false; if (state == CompAction::StateInitKey && grabsEmpty ()) { possibleTap = action; } if (!action->initiate ().empty ()) { if (action->initiate () (action, state, arguments)) actionEventHandled = true; } else if (!action->terminate ().empty ()) { /* Default Initiate implementation for plugins that only provide a Terminate callback */ if (state & CompAction::StateInitKey) action->setState (action->state () | CompAction::StateTermKey); } return actionEventHandled; } bool cps::EventManager::triggerRelease (CompAction *action, CompAction::State state, CompOption::Vector &arguments) { if (action == possibleTap) { state |= CompAction::StateTermTapped; possibleTap = NULL; } if (!action->terminate ().empty () && action->terminate () (action, state, arguments)) return true; return false; } int ce::processButtonPressOnEdgeWindow (Window edgeWindow, Window root, Window eventWindow, Window eventRoot, cps::GrabList &grabList, const CompScreenEdge *screenEdge) { int edge = -1; if (eventRoot != root) return edge; if (eventWindow != edgeWindow) { if (grabList.grabsEmpty () || eventRoot != root) return edge; } for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (edgeWindow == screenEdge[i].id) { edge = 1 << i; break; } } return edge; } void ce::setEventWindowInButtonPressArguments (ce::EventArguments &arguments, Window eventWindow) { arguments[1].value ().set ((int) eventWindow); } namespace { bool buttonActionModifiersMatchEventState (unsigned int actionModifiers, unsigned int eventState) { const unsigned int ignored = modHandler->ignoredModMask (); const unsigned int modMask = REAL_MOD_MASK & ~ignored; const unsigned int bindMods = modHandler->virtualToRealModMask (actionModifiers); return (bindMods & modMask) == (eventState & modMask); } } bool ce::activateButtonPressOnWindowBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, ce::EventArguments &arguments) { CompAction *action; const CompAction::State state = CompAction::StateInitButton; if (isBound (option, CompAction::BindingTypeButton, state, &action)) { if (action->button ().button () == (int) eventButton) { if (matchEventState (action->button ().modifiers (), eventState)) { if (eventManager.triggerPress (action, state, arguments)) return true; } } } return false; } bool ce::activateButtonPressOnEdgeBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, int edge, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, ce::EventArguments &arguments) { CompAction *action; const CompAction::State state = CompAction::StateInitButton | CompAction::StateInitEdge; if (edge != -1) { if (isInitiateBinding (option, CompAction::BindingTypeEdgeButton, state, &action)) { if ((action->button ().button () == (int) eventButton) && (action->edgeMask () & edge)) { if (matchEventState (action->button ().modifiers (), eventState)) if (action->initiate () (action, state, arguments)) return true; } } } return false; } bool PrivateScreen::triggerButtonPressBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments) { int edge = -1; static const ce::ActionModsMatchesEventStateFunc matchEventState ( boost::bind (buttonActionModifiersMatchEventState, _1, _2)); if (edgeWindow) edge = ce::processButtonPressOnEdgeWindow (edgeWindow, screen->root (), event->window, event->root, eventManager, screenEdge); if (edge != -1) ce::setEventWindowInButtonPressArguments (arguments, orphanData.activeWindow); foreach (CompOption &option, options) { if (ce::activateButtonPressOnWindowBindingOption (option, event->button, event->state, eventManager, matchEventState, arguments)) return true; if (ce::activateButtonPressOnEdgeBindingOption (option, event->button, event->state, edge, eventManager, matchEventState, arguments)) return true; } return false; } bool PrivateScreen::triggerButtonReleaseBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments) { CompAction::State state = CompAction::StateTermButton; CompAction::BindingType type = CompAction::BindingTypeButton | CompAction::BindingTypeEdgeButton; CompAction *action; foreach (CompOption &option, options) { if (isBound (option, type, state, &action)) { if (action->button ().button () == (int) event->button) { if (eventManager.triggerRelease (action, state, arguments)) return true; } } } return false; } bool PrivateScreen::shouldTriggerKeyPressAction (CompAction *action, XKeyEvent *event) { unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); int bindCode = action->key ().keycode (); unsigned int bindCodeMod = bindCode ? modHandler->keycodeToModifiers (bindCode) : 0; unsigned int eventMods = event->state & modMask; if (bindCode == (int) event->keycode) return (bindMods & modMask) == eventMods; else if (!xkbEvent.get() && bindCode == 0) return bindMods == eventMods; else if (bindCodeMod != 0) { for (int mod = 0; mod < 8; mod++) { int mask = 1 << mod; if ((bindMods & mask) == 0) continue; for (int k = mod * modHandler->modMap ()->max_keypermod; k < (mod + 1) * modHandler->modMap ()->max_keypermod; k++) { if (modHandler->modMap ()->modifiermap[k] == event->keycode) { if ((((bindMods & ~mask) | bindCodeMod) & modMask) == eventMods) return true; break; } } } } return false; } bool PrivateScreen::triggerKeyPressBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments) { CompAction::State state = 0; if (event->keycode == escapeKeyCode) state = CompAction::StateCancel; else if (event->keycode == returnKeyCode) state = CompAction::StateCommit; if (state) { foreach (CompOption &o, options) { if (o.isAction ()) { if (!o.value ().action ().terminate ().empty ()) o.value ().action ().terminate () (&o.value ().action (), state, noOptions ()); } } foreach (CompAction &a, actions) { if (!a.terminate ().empty ()) a.terminate () (&a, state, noOptions ()); } if (state == CompAction::StateCancel) return false; } state = CompAction::StateInitKey; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerKeyPressAction (action, event) && eventManager.triggerPress (action, state, arguments)) return true; } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerKeyPressAction (&action, event) && eventManager.triggerPress (&action, state, arguments)) return true; } return false; } bool PrivateScreen::shouldTriggerKeyReleaseAction (CompAction *action, XKeyEvent *event) { unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); if ((bindMods & modMask) == 0) return (unsigned int) action->key ().keycode () == event->keycode; unsigned int mods = modHandler->keycodeToModifiers (event->keycode); return !xkbEvent.get() && ((mods & modMask & bindMods) != bindMods); } bool PrivateScreen::triggerKeyReleaseBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments) { CompAction::State state = CompAction::StateTermKey; if (!xkbEvent.get() && !modHandler->keycodeToModifiers (event->keycode)) return false; bool handled = false; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerKeyReleaseAction (action, event)) handled |= eventManager.triggerRelease (action, state, arguments); } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerKeyReleaseAction (&action, event)) handled |= eventManager.triggerRelease (&action, state, arguments); } return handled; } bool PrivateScreen::shouldTriggerModifierPressAction (CompAction *action, XkbStateNotifyEvent *event) { if (action->key ().keycode ()) return false; unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); unsigned int eventMods = event->mods & modMask; return eventMods == bindMods; } bool PrivateScreen::shouldTriggerModifierReleaseAction (CompAction *action, XkbStateNotifyEvent *event) { unsigned int modMask = REAL_MOD_MASK & ~modHandler->ignoredModMask (); unsigned int bindMods = modHandler->virtualToRealModMask (action->key ().modifiers ()); if (event->mods && ((event->mods & modMask) != bindMods)) return true; unsigned int eventCodeMod = modHandler->keycodeToModifiers (event->keycode); if (!event->mods && (eventCodeMod == bindMods)) return true; int bindCode = action->key ().keycode (); unsigned int bindCodeMod = bindCode ? modHandler->keycodeToModifiers (bindCode) : 0; return bindCodeMod && event->keycode == bindCode && ((bindMods | bindCodeMod) == ((event->mods & modMask) | eventCodeMod)); } bool PrivateScreen::triggerStateNotifyBindings (CompOption::Vector &options, CompAction::Vector &actions, XkbStateNotifyEvent *event, CompOption::Vector &arguments) { CompAction::State state; if (event->event_type == KeyPress) { state = CompAction::StateInitKey; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerModifierPressAction (action, event) && eventManager.triggerPress (action, state, arguments)) return true; } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerModifierPressAction (&action, event) && eventManager.triggerPress (&action, state, arguments)) return true; } } else if (event->event_type == KeyRelease) { state = CompAction::StateTermKey; bool handled = false; foreach (CompOption &option, options) { CompAction *action; if (isBound (option, CompAction::BindingTypeKey, state, &action) && shouldTriggerModifierReleaseAction (action, event)) handled |= eventManager.triggerRelease (action, state, arguments); } foreach (CompAction &action, actions) { if (isBound (action, CompAction::BindingTypeKey, state) && shouldTriggerModifierReleaseAction (&action, event)) handled |= eventManager.triggerRelease (&action, state, arguments); } if (handled) return true; } return false; } static bool isBellAction (CompOption &option, CompAction::State state, CompAction **action) { if (option.type () != CompOption::TypeAction && option.type () != CompOption::TypeBell) return false; if (!option.value ().action ().bell ()) return false; if (!(option.value ().action ().state () & state)) return false; if (option.value ().action ().initiate ().empty ()) return false; *action = &option.value ().action (); return true; } static bool triggerBellNotifyBindings (CompOption::Vector &options, CompOption::Vector &arguments) { CompAction::State state = CompAction::StateInitBell; CompAction *action; foreach (CompOption &option, options) { if (isBellAction (option, state, &action)) { if (action->initiate () (action, state, arguments)) return true; } } return false; } static bool isEdgeAction (CompOption &option, CompAction::State state, unsigned int edge) { if (option.type () != CompOption::TypeAction && option.type () != CompOption::TypeButton && option.type () != CompOption::TypeEdge) return false; if (!(option.value ().action ().edgeMask () & edge)) return false; if (!(option.value ().action ().state () & state)) return false; return true; } static bool isEdgeEnterAction (CompOption &option, CompAction::State state, CompAction::State delayState, unsigned int edge, CompAction **action) { if (!isEdgeAction (option, state, edge)) return false; if (option.value ().action ().type () & CompAction::BindingTypeEdgeButton) return false; if (option.value ().action ().initiate ().empty ()) return false; if (delayState) { if ((option.value ().action ().state () & CompAction::StateNoEdgeDelay) != (delayState & CompAction::StateNoEdgeDelay)) { /* ignore edge actions which shouldn't be delayed when invoking undelayed edges (or vice versa) */ return false; } } *action = &option.value ().action (); return true; } static bool isEdgeLeaveAction (CompOption &option, CompAction::State state, unsigned int edge, CompAction **action) { if (!isEdgeAction (option, state, edge)) return false; if (option.value ().action ().terminate ().empty ()) return false; *action = &option.value ().action (); return true; } static bool triggerEdgeEnterBindings (CompOption::Vector &options, CompAction::State state, CompAction::State delayState, unsigned int edge, CompOption::Vector &arguments) { CompAction *action; foreach (CompOption &option, options) { if (isEdgeEnterAction (option, state, delayState, edge, &action)) { if (action->initiate () (action, state, arguments)) return true; } } return false; } static bool triggerEdgeLeaveBindings (CompOption::Vector &options, CompAction::State state, unsigned int edge, CompOption::Vector &arguments) { CompAction *action; foreach (CompOption &option, options) { if (isEdgeLeaveAction (option, state, edge, &action)) { if (action->terminate () (action, state, arguments)) return true; } } return false; } static bool triggerAllEdgeEnterBindings (CompAction::State state, CompAction::State delayState, unsigned int edge, CompOption::Vector &arguments) { foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerEdgeEnterBindings (options, state, delayState, edge, arguments)) { return true; } } return false; } static bool delayedEdgeTimeout (CompDelayedEdgeSettings *settings) { triggerAllEdgeEnterBindings (settings->state, ~CompAction::StateNoEdgeDelay, settings->edge, settings->options); return false; } bool PrivateScreen::triggerEdgeEnter (unsigned int edge, CompAction::State state, CompOption::Vector &arguments) { int delay; delay = optionGetEdgeDelay (); if (delay > 0) { CompAction::State delayState; edgeDelaySettings.edge = edge; edgeDelaySettings.state = state; edgeDelaySettings.options = arguments; edgeDelayTimer.start ( boost::bind (delayedEdgeTimeout, &edgeDelaySettings), delay, (unsigned int) ((float) delay * 1.2)); delayState = CompAction::StateNoEdgeDelay; if (triggerAllEdgeEnterBindings (state, delayState, edge, arguments)) return true; } else { if (triggerAllEdgeEnterBindings (state, 0, edge, arguments)) return true; } return false; } bool PrivateScreen::handleActionEvent (XEvent *event) { static CompOption::Vector o; Window xid; if (o.empty ()) { o.resize (9); o[0].setName ("event_window", CompOption::TypeInt); o[1].setName ("window", CompOption::TypeInt); o[2].setName ("modifiers", CompOption::TypeInt); o[3].setName ("x", CompOption::TypeInt); o[4].setName ("y", CompOption::TypeInt); o[5].setName ("root", CompOption::TypeInt); } else { o[6].reset (); o[7].reset (); o[8].reset (); } switch (event->type) { case ButtonPress: /* We need to determine if we clicked on a parent frame * window, if so, pass the appropriate child window as * "window" and the frame as "event_window" */ xid = event->xbutton.window; foreach (CompWindow *w, screen->windows ()) { if (w->priv->frame == xid) xid = w->id (); } o[0].value ().set ((int) event->xbutton.window); o[1].value ().set ((int) xid); o[2].value ().set ((int) event->xbutton.state); o[3].value ().set ((int) event->xbutton.x_root); o[4].value ().set ((int) event->xbutton.y_root); o[5].value ().set ((int) event->xbutton.root); o[6].setName ("button", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xbutton.button); o[7].value ().set ((int) event->xbutton.time); eventManager.resetPossibleTap(); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerButtonPressBindings (options, &event->xbutton, o)) return true; } break; case ButtonRelease: o[0].value ().set ((int) event->xbutton.window); o[1].value ().set ((int) event->xbutton.window); o[2].value ().set ((int) event->xbutton.state); o[3].value ().set ((int) event->xbutton.x_root); o[4].value ().set ((int) event->xbutton.y_root); o[5].value ().set ((int) event->xbutton.root); o[6].setName ("button", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xbutton.button); o[7].value ().set ((int) event->xbutton.time); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerButtonReleaseBindings (options, &event->xbutton, o)) return true; } break; case KeyPress: o[0].value ().set ((int) event->xkey.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xkey.state); o[3].value ().set ((int) event->xkey.x_root); o[4].value ().set ((int) event->xkey.y_root); o[5].value ().set ((int) event->xkey.root); o[6].setName ("keycode", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[8].setName ("is_repeated", CompOption::TypeBool); o[6].value ().set ((int) event->xkey.keycode); o[7].value ().set ((int) event->xkey.time); o[8].value ().set (nextKeyPressIsRepeated_); nextKeyPressIsRepeated_ = false; eventManager.resetPossibleTap(); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); CompAction::Vector &actions = p->vTable->getActions (); if (triggerKeyPressBindings (options, actions, &event->xkey, o)) return true; } break; case KeyRelease: { o[0].value ().set ((int) event->xkey.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xkey.state); o[3].value ().set ((int) event->xkey.x_root); o[4].value ().set ((int) event->xkey.y_root); o[5].value ().set ((int) event->xkey.root); o[6].setName ("keycode", CompOption::TypeInt); o[7].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xkey.keycode); o[7].value ().set ((int) event->xkey.time); bool handled = false; nextKeyPressIsRepeated_ = false; if (XEventsQueued (dpy, QueuedAfterReading)) { XEvent nev; XPeekEvent (dpy, &nev); if (nev.type == KeyPress && nev.xkey.time == event->xkey.time && nev.xkey.keycode == event->xkey.keycode) { nextKeyPressIsRepeated_ = true; } } foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); CompAction::Vector &actions = p->vTable->getActions (); handled |= triggerKeyReleaseBindings (options, actions, &event->xkey, o); } if (handled) return true; break; } case EnterNotify: if (event->xcrossing.mode != NotifyGrab && event->xcrossing.mode != NotifyUngrab && event->xcrossing.detail != NotifyInferior) { unsigned int edge, i; CompAction::State state; if (event->xcrossing.root != rootWindow()) return false; if (edgeDelayTimer.active ()) edgeDelayTimer.stop (); if (edgeWindow && edgeWindow != event->xcrossing.window) { state = CompAction::StateTermEdge; edge = 0; for (i = 0; i < SCREEN_EDGE_NUM; i++) { if (edgeWindow == screenEdge[i].id) { edge = 1 << i; break; } } edgeWindow = None; o[0].value ().set ((int) event->xcrossing.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xcrossing.state); o[3].value ().set ((int) event->xcrossing.x_root); o[4].value ().set ((int) event->xcrossing.y_root); o[5].value ().set ((int) event->xcrossing.root); o[6].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xcrossing.time); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerEdgeLeaveBindings (options, state, edge, o)) return true; } } edge = 0; for (i = 0; i < SCREEN_EDGE_NUM; i++) { if (event->xcrossing.window == screenEdge[i].id) { edge = 1 << i; break; } } if (edge) { state = CompAction::StateInitEdge; edgeWindow = event->xcrossing.window; o[0].value ().set ((int) event->xcrossing.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) event->xcrossing.state); o[3].value ().set ((int) event->xcrossing.x_root); o[4].value ().set ((int) event->xcrossing.y_root); o[5].value ().set ((int) event->xcrossing.root); o[6].setName ("time", CompOption::TypeInt); o[6].value ().set ((int) event->xcrossing.time); if (triggerEdgeEnter (edge, state, o)) return true; } } break; case ClientMessage: if (event->xclient.message_type == Atoms::xdndEnter) { xdndWindow = event->xclient.window; } else if (event->xclient.message_type == Atoms::xdndLeave) { unsigned int edge = 0; CompAction::State state; if (!xdndWindow) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (event->xclient.window == screenEdge[i].id) { edge = 1 << i; break; } } } } if (edge) { state = CompAction::StateTermEdgeDnd; o[0].value ().set ((int) event->xclient.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) 0); /* fixme */ o[3].value ().set ((int) 0); /* fixme */ o[4].value ().set ((int) 0); /* fixme */ o[5].value ().set ((int) rootWindow()); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerEdgeLeaveBindings (options, state, edge, o)) return true; } } } else if (event->xclient.message_type == Atoms::xdndPosition) { unsigned int edge = 0; CompAction::State state; if (xdndWindow == event->xclient.window) { CompWindow *w; w = screen->findWindow (event->xclient.window); if (w) { for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (xdndWindow == screenEdge[i].id) { edge = 1 << i; break; } } } } if (edge) { state = CompAction::StateInitEdgeDnd; o[0].value ().set ((int) event->xclient.window); o[1].value ().set ((int) orphanData.activeWindow); o[2].value ().set ((int) 0); /* fixme */ o[3].value ().set ((int) event->xclient.data.l[2] >> 16); o[4].value ().set ((int) event->xclient.data.l[2] & 0xffff); o[5].value ().set ((int) rootWindow()); if (triggerEdgeEnter (edge, state, o)) return true; } xdndWindow = None; } break; default: if (event->type == xkbEvent.get()) { XkbAnyEvent *xkbEvent = (XkbAnyEvent *) event; static CompOption::Vector arg; if (arg.empty ()) { arg.resize (8); arg[0].setName ("event_window", CompOption::TypeInt); arg[1].setName ("window", CompOption::TypeInt); } if (xkbEvent->xkb_type == XkbStateNotify) { XkbStateNotifyEvent *stateEvent = (XkbStateNotifyEvent *) event; arg[0].value ().set ((int) orphanData.activeWindow); arg[1].value ().set ((int) orphanData.activeWindow); arg[2].setName ("modifiers", CompOption::TypeInt); arg[2].value ().set ((int) stateEvent->mods); arg[3].setName ("time", CompOption::TypeInt); arg[3].value ().set ((int) xkbEvent->time); arg[7].value ().set ((int) xkbEvent->time); bool handled = false; foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); CompAction::Vector &actions = p->vTable->getActions (); handled |= triggerStateNotifyBindings (options, actions, stateEvent, arg); } if (handled) return true; } else if (xkbEvent->xkb_type == XkbBellNotify) { arg[0].value ().set ((int) orphanData.activeWindow); arg[1].value ().set ((int) orphanData.activeWindow); arg[2].setName ("time", CompOption::TypeInt); arg[2].value ().set ((int) xkbEvent->time); arg[3].reset (); arg[7].reset (); foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); if (triggerBellNotifyBindings (options, arg)) return true; } } } break; } return false; } void PrivateScreen::setDefaultWindowAttributes (XWindowAttributes *wa) { wa->x = 0; wa->y = 0; wa->width = 1; wa->height = 1; wa->border_width = 0; wa->depth = 0; wa->visual = NULL; wa->root = rootWindow(); wa->c_class = InputOnly; wa->bit_gravity = NorthWestGravity; wa->win_gravity = NorthWestGravity; wa->backing_store = NotUseful; wa->backing_planes = 0; wa->backing_pixel = 0; wa->save_under = false; wa->colormap = None; wa->map_installed = false; wa->map_state = IsUnviewable; wa->all_event_masks = 0; wa->your_event_mask = 0; wa->do_not_propagate_mask = 0; wa->override_redirect = true; wa->screen = ScreenOfDisplay (dpy, screenNum); } void CompScreen::handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) { WRAPABLE_HND_FUNCTN (handleCompizEvent, plugin, event, options); _handleCompizEvent (plugin, event, options); } void CompScreenImpl::_handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) { } void CompScreen::handleEvent (XEvent *event) { WRAPABLE_HND_FUNCTN (handleEvent, event) _handleEvent (event); } void CompScreenImpl::alwaysHandleEvent (XEvent *event) { /* * Critical event handling that cannot be overridden by plugins */ if (event->type == ButtonPress || event->type == KeyPress) privateScreen.eventManager.resetPossibleTap(); eventHandled = true; // if we return inside WRAPABLE_HND_FUNCTN handleEvent (event); bool keyEvent = (event->type == KeyPress || event->type == KeyRelease); /* Always either replay the keyboard or consume the key * event on keypresses */ if (keyEvent) { int mode = eventHandled ? AsyncKeyboard : ReplayKeyboard; XAllowEvents (privateScreen.dpy, mode, event->xkey.time); } if (privateScreen.eventManager.grabsEmpty () && event->type == KeyPress) { XUngrabKeyboard (privateScreen.dpy, event->xkey.time); } } ServerGrabInterface * CompScreenImpl::serverGrabInterface () { return static_cast (this); } void CompScreenImpl::grabServer () { XGrabServer (privateScreen.dpy); } void CompScreenImpl::syncServer () { XSync (privateScreen.dpy, false); } void CompScreenImpl::ungrabServer () { XUngrabServer (privateScreen.dpy); } void CompScreenImpl::_handleEvent (XEvent *event) { /* * Non-critical event handling that might be overridden by plugins */ CompWindow *w = NULL; XWindowAttributes wa; switch (event->type) { case ButtonPress: if (event->xbutton.root == privateScreen.rootWindow()) privateScreen.outputDevices.setCurrentOutput ( outputDeviceForPoint (event->xbutton.x_root, event->xbutton.y_root)); break; case MotionNotify: if (event->xmotion.root == privateScreen.rootWindow()) privateScreen.outputDevices.setCurrentOutput ( outputDeviceForPoint (event->xmotion.x_root, event->xmotion.y_root)); break; case KeyPress: w = findWindow (privateScreen.orphanData.activeWindow); if (w) privateScreen.outputDevices.setCurrentOutput (w->outputDevice ()); break; default: break; } eventHandled = privateScreen.handleActionEvent (event); if (eventHandled) { if (privateScreen.eventManager.grabsEmpty ()) XAllowEvents (privateScreen.dpy, AsyncPointer, event->xbutton.time); return; } switch (event->type) { case SelectionRequest: privateScreen.handleSelectionRequest (event); break; case SelectionClear: privateScreen.handleSelectionClear (event); break; case ConfigureNotify: w = findWindow (event->xconfigure.window); if (w && !w->priv->frame) { w->priv->configure (&event->xconfigure); } else { w = findTopLevelWindow (event->xconfigure.window); if (w && w->priv->frame == event->xconfigure.window) w->priv->configureFrame (&event->xconfigure); else { if (event->xconfigure.window == privateScreen.rootWindow()) privateScreen.configure (&event->xconfigure); } } break; case CreateNotify: { bool create = true; /* Failure means that window has been destroyed. We still have to add * the window to the window list as we might get configure requests * which require us to stack other windows relative to it. Setting * some default values if this is the case. */ if (!XGetWindowAttributes (privateScreen.dpy, event->xcreatewindow.window, &wa)) { privateScreen.setDefaultWindowAttributes (&wa); /* That being said, we should store as much information as possible * about it. There may be requests relative to this window that could * use the data in the XCreateWindowEvent structure, especially the * override redirect state */ wa.x = event->xcreatewindow.x; wa.y = event->xcreatewindow.y; wa.width = event->xcreatewindow.width; wa.height = event->xcreatewindow.height; wa.border_width = event->xcreatewindow.border_width; wa.override_redirect = event->xcreatewindow.override_redirect; } foreach (CompWindow *w, screen->windows ()) { if (w->priv->serverFrame == event->xcreatewindow.window) { w->priv->frame = event->xcreatewindow.window; w->priv->updatePassiveButtonGrabs (); create = false; } } foreach (CompWindow *w, destroyedWindows()) { if (w->priv->serverId == event->xcreatewindow.window) { /* Previously destroyed window * plugins were keeping around * in order to avoid an xid conflict, * destroy it right away and manage * the new window */ StackDebugger *dbg = StackDebugger::Default (); while (w->priv->destroyRefCnt) w->destroy (); if (dbg) dbg->removeDestroyedFrame (event->xcreatewindow.window); } } if (wa.root != event->xcreatewindow.parent) create = false; if (create) { /* Track the window if it was created on this * screen, otherwise we still need to register * for FocusChangeMask. Also, we don't want to * manage it straight away - in reality we want * that to wait until the map request */ if (wa.root == privateScreen.rootWindow()) { Window top = CompWindowToWindow (getTopWindow ()); Window topServer = CompWindowToWindow (getTopServerWindow ()); PrivateWindow::createCompWindow (top, topServer, wa, event->xcreatewindow.window); } else XSelectInput (privateScreen.dpy, event->xcreatewindow.window, FocusChangeMask); } else compLogMessage ("core", CompLogLevelDebug, "refusing to manage window 0x%x", (unsigned int) event->xcreatewindow.window); break; } case DestroyNotify: w = findWindow (event->xdestroywindow.window); /* It is possible that some plugin might call * w->destroy () before the window actually receives * its first DestroyNotify event which would mean * that it is already in the list of destroyed * windows, so check that list too */ if (!w) { foreach (CompWindow *dw, destroyedWindows()) { if (dw->priv->serverId == event->xdestroywindow.window) { w = dw; break; } } } if (w) { w->moveInputFocusToOtherWindow (); w->destroy (); } break; case MapNotify: /* Search in already-created windows for this window */ if (!w) w = findWindow (event->xmap.window); if (w) { if (w->priv->pendingMaps) { /* The only case where this happens * is where the window unmaps itself * but doesn't get destroyed so when * it re-maps we need to reparent it */ if (!w->priv->serverFrame) w->priv->reparent (); w->priv->managed = true; } /* been shaded */ if (w->shaded ()) { if (w->id () == privateScreen.orphanData.activeWindow) w->moveInputFocusTo (); } w->map (); } break; case UnmapNotify: w = findWindow (event->xunmap.window); if (w) { /* Normal -> Iconic */ if (w->pendingUnmaps ()) { setWmState (IconicState, w->id ()); w->priv->pendingUnmaps--; } else /* X -> Withdrawn */ { /* Iconic -> Withdrawn: * * The window is already unmapped so we need to check the * synthetic UnmapNotify that comes and withdraw the window here */ if (w->state () & CompWindowStateHiddenMask) { w->priv->minimized = false; w->changeState (w->state () & ~CompWindowStateHiddenMask); privateScreen.updateClientList (); w->priv->withdraw (); } /* Closing: * * ICCCM Section 4.1.4 says that clients need to send * a synthetic UnmapNotify for every real unmap * in order to reflect the change in state, but * since we already withdraw the window on the real * UnmapNotify, no need to do it again on the synthetic * one. */ else if (!event->xunmap.send_event) { w->windowNotify (CompWindowNotifyClose); w->priv->withdraw (); } } if (!event->xunmap.send_event) { w->unmap (); if (!w->shaded () && !w->priv->pendingMaps) w->moveInputFocusToOtherWindow (); } } break; case ReparentNotify: w = findWindow (event->xreparent.window); /* If this window isn't part of our tracked window * list and was reparented into the root window then * we need to track it */ if (!w) { if (event->xreparent.parent == privateScreen.rootWindow()) { /* Failure means that window has been destroyed. We still have to add * the window to the window list as we might get configure requests * which require us to stack other windows relative to it. Setting * some default values if this is the case. */ if (!XGetWindowAttributes (privateScreen.dpy, event->xcreatewindow.window, &wa)) { privateScreen.setDefaultWindowAttributes (&wa); /* That being said, we should store as much information as possible * about it. There may be requests relative to this window that could * use the data in the XCreateWindowEvent structure, especially the * override redirect state */ wa.x = event->xreparent.x; wa.y = event->xreparent.y; wa.override_redirect = event->xreparent.override_redirect; } PrivateWindow::createCompWindow (getTopWindow ()->id (), getTopServerWindow ()->id (), wa, event->xreparent.window); break; } else { /* It is possible that some plugin might call * w->destroy () before the window actually receives * its first ReparentNotify event which would mean * that it is already in the list of destroyed * windows, so check that list too */ foreach (CompWindow *dw, destroyedWindows()) { if (dw->priv->serverId == event->xreparent.window) { w = dw; break; } } } } /* This is the only case where a window is removed but not destroyed. We must remove our event mask and all passive grabs. */ if (w) { if ((w->priv->wrapper && event->xreparent.parent != w->priv->wrapper) || (!w->priv->wrapper && event->xreparent.parent != privateScreen.rootWindow ())) { w->moveInputFocusToOtherWindow (); w->destroy (); XSelectInput (privateScreen.dpy, w->id (), NoEventMask); XShapeSelectInput (privateScreen.dpy, w->id (), NoEventMask); XUngrabButton (privateScreen.dpy, AnyButton, AnyModifier, w->id ()); } } break; case CirculateNotify: w = findWindow (event->xcirculate.window); if (w) w->priv->circulate (&event->xcirculate); break; case ButtonPress: if (event->xbutton.button == Button1 || event->xbutton.button == Button2 || event->xbutton.button == Button3) { w = findTopLevelWindow (event->xbutton.window); if (w) { if (privateScreen.optionGetRaiseOnClick ()) { w->updateAttributes (CompStackingUpdateModeAboveFullscreen); } if (w->id () != privateScreen.orphanData.activeWindow) if (!(w->type () & CompWindowTypeDockMask)) if (w->focus ()) w->moveInputFocusTo (); } } if (privateScreen.eventManager.grabsEmpty ()) XAllowEvents (privateScreen.dpy, ReplayPointer, event->xbutton.time); break; case PropertyNotify: if (event->xproperty.atom == Atoms::winType) { w = findWindow (event->xproperty.window); if (w) { unsigned int type; type = getWindowType (w->id ()); if (type != w->wmType ()) { if (w->isViewable ()) { if (w->type () == CompWindowTypeDesktopMask) { decrementDesktopWindowCount (); if (!w->alpha ()) decrementOpaqueDesktopWindowCount (); } else if (type == CompWindowTypeDesktopMask) { incrementDesktopWindowCount (); if (!w->alpha ()) incrementOpaqueDesktopWindowCount (); } } w->wmType () = type; w->recalcType (); w->recalcActions (); if (type & (CompWindowTypeDockMask | CompWindowTypeDesktopMask)) w->setDesktop (0xffffffff); privateScreen.updateClientList (); matchPropertyChanged (w); } } } else if (event->xproperty.atom == Atoms::winState) { w = findWindow (event->xproperty.window); if (w && !w->managed ()) { unsigned int state; state = getWindowState (w->id ()); state = CompWindow::constrainWindowState (state, w->actions ()); /* EWMH suggests that we ignore changes to _NET_WM_STATE_HIDDEN */ if (w->state () & CompWindowStateHiddenMask) state |= CompWindowStateHiddenMask; else state &= ~CompWindowStateHiddenMask; w->changeState (state); } } else if (event->xproperty.atom == XA_WM_NORMAL_HINTS) { w = findWindow (event->xproperty.window); if (w) { w->priv->updateNormalHints (); w->recalcActions (); } } else if (event->xproperty.atom == XA_WM_HINTS) { w = findWindow (event->xproperty.window); if (w) w->priv->updateWmHints (); } else if (event->xproperty.atom == XA_WM_TRANSIENT_FOR) { w = findWindow (event->xproperty.window); if (w) { w->priv->updateTransientHint (); w->recalcActions (); } } else if (event->xproperty.atom == Atoms::wmClientLeader) { w = findWindow (event->xproperty.window); if (w) w->priv->clientLeader = w->priv->getClientLeader (); } else if (event->xproperty.atom == Atoms::wmIconGeometry) { w = findWindow (event->xproperty.window); if (w) w->priv->updateIconGeometry (); } else if (event->xproperty.atom == Atoms::frameGtkExtents) { w = findWindow (event->xproperty.window); if (w) w->priv->updateClientFrame (); } else if (event->xproperty.atom == Atoms::wmStrut || event->xproperty.atom == Atoms::wmStrutPartial) { w = findWindow (event->xproperty.window); if (w) { if (w->updateStruts ()) updateWorkarea (); } } else if (event->xproperty.atom == Atoms::mwmHints) { w = findWindow (event->xproperty.window); if (w) w->priv->updateMwmHints (); } else if (event->xproperty.atom == Atoms::wmProtocols) { w = findWindow (event->xproperty.window); if (w) w->priv->protocols = getProtocols (w->id ()); } else if (event->xproperty.atom == Atoms::wmIcon) { w = findWindow (event->xproperty.window); if (w) w->priv->freeIcons (); } else if (event->xproperty.atom == Atoms::startupId) { w = findWindow (event->xproperty.window); if (w) w->priv->updateStartupId (); } else if (event->xproperty.atom == Atoms::gnomeRepresentativeColors) { if (event->xproperty.window == privateScreen.rootWindow()) privateScreen.updateAverageColor (event->xproperty.atom); } else if (event->xproperty.atom == XA_WM_CLASS) { w = findWindow (event->xproperty.window); if (w) w->priv->updateClassHints (); } else if (event->xproperty.atom == XA_RESOURCE_MANAGER) { if (event->xproperty.window == privateScreen.rootWindow()) privateScreen.updateResources(); } break; case MotionNotify: break; case ClientMessage: if (event->xclient.message_type == Atoms::winActive) { w = findTopLevelWindow (event->xclient.window); if (w) { /* use focus stealing prevention if request came from an application */ if (event->xclient.data.l[0] != ClientTypeApplication || w->priv->allowWindowFocus (0, event->xclient.data.l[1])) { w->activate (); } } } else if (event->xclient.message_type == Atoms::winState) { w = findWindow (event->xclient.window); if (w) { unsigned long wState, state; wState = w->state (); for (int i = 1; i < 3; i++) { state = cps::windowStateMask (event->xclient.data.l[i]); if (state & ~CompWindowStateHiddenMask) { static const unsigned short _NET_WM_STATE_REMOVE = 0; static const unsigned short _NET_WM_STATE_ADD = 1; static const unsigned short _NET_WM_STATE_TOGGLE = 2; switch (event->xclient.data.l[0]) { case _NET_WM_STATE_REMOVE: wState &= ~state; break; case _NET_WM_STATE_ADD: wState |= state; break; case _NET_WM_STATE_TOGGLE: wState ^= state; break; } } } wState = CompWindow::constrainWindowState (wState, w->actions ()); if (w->id () == privateScreen.orphanData.activeWindow) wState &= ~CompWindowStateDemandsAttentionMask; if (wState != w->state ()) { CompStackingUpdateMode stackingUpdateMode; unsigned long dState = wState ^ w->state (); stackingUpdateMode = CompStackingUpdateModeNone; /* raise the window whenever its fullscreen state, above/below state or maximization state changed */ if (dState & (CompWindowStateFullscreenMask | CompWindowStateAboveMask | CompWindowStateBelowMask | CompWindowStateMaximizedHorzMask | CompWindowStateMaximizedVertMask)) stackingUpdateMode = CompStackingUpdateModeNormal; w->changeState (wState); w->updateAttributes (stackingUpdateMode); } } } else if (event->xclient.message_type == Atoms::wmProtocols) { if ((unsigned long) event->xclient.data.l[0] == Atoms::wmPing) { w = findWindow (event->xclient.data.l[2]); if (w) w->priv->handlePing (lastPing ()); } } else if (event->xclient.message_type == Atoms::closeWindow) { w = findWindow (event->xclient.window); if (w) w->close (event->xclient.data.l[0]); } else if (event->xclient.message_type == Atoms::desktopGeometry) { if (event->xclient.window == privateScreen.rootWindow()) { CompOption::Value value; value.set ((int) (event->xclient.data.l[0] / width ())); setOptionForPlugin ("core", "hsize", value); value.set ((int) (event->xclient.data.l[1] / height ())); setOptionForPlugin ("core", "vsize", value); } } else if (event->xclient.message_type == Atoms::moveResizeWindow) { w = findWindow (event->xclient.window); if (w) { unsigned int xwcm = 0; XWindowChanges xwc; int gravity; int value_mask; unsigned int source; gravity = (event->xclient.data.l[0] & 0xFF); value_mask = (event->xclient.data.l[0] & 0xF00) >> 8; source = (event->xclient.data.l[0] & 0xF000) >> 12; memset (&xwc, 0, sizeof (xwc)); if (value_mask & CWX) { xwcm |= CWX; xwc.x = event->xclient.data.l[1]; } if (value_mask & CWY) { xwcm |= CWY; xwc.y = event->xclient.data.l[2]; } if (value_mask & CWWidth) { xwcm |= CWWidth; xwc.width = event->xclient.data.l[3]; } if (value_mask & CWHeight) { xwcm |= CWHeight; xwc.height = event->xclient.data.l[4]; } w->moveResize (&xwc, xwcm, gravity, source); } } else if (event->xclient.message_type == Atoms::restackWindow) { w = findWindow (event->xclient.window); if (w) { /* TODO: other stack modes than Above and Below */ if (event->xclient.data.l[1]) { CompWindow *sibling; sibling = findWindow (event->xclient.data.l[1]); if (sibling) { if (event->xclient.data.l[2] == Above) w->restackAbove (sibling); else if (event->xclient.data.l[2] == Below) w->restackBelow (sibling); } } else { if (event->xclient.data.l[2] == Above) w->raise (); else if (event->xclient.data.l[2] == Below) w->lower (); } } } else if (event->xclient.message_type == Atoms::wmChangeState) { w = findWindow (event->xclient.window); if (w) { if (event->xclient.data.l[0] == IconicState) { if (w->actions () & CompWindowActionMinimizeMask) w->minimize (); } else if (event->xclient.data.l[0] == NormalState) { w->unminimize (); } } } else if (event->xclient.message_type == Atoms::showingDesktop) { if (event->xclient.window == privateScreen.rootWindow() || event->xclient.window == None) { if (event->xclient.data.l[0]) enterShowDesktopMode (); else leaveShowDesktopMode (NULL); } } else if (event->xclient.message_type == Atoms::currentDesktop) { if (event->xclient.window == privateScreen.rootWindow()) privateScreen.setCurrentDesktop (event->xclient.data.l[0]); } else if (event->xclient.message_type == Atoms::winDesktop) { w = findWindow (event->xclient.window); if (w) w->setDesktop (event->xclient.data.l[0]); } else if (event->xclient.message_type == Atoms::wmFullscreenMonitors) { w = findWindow (event->xclient.window); if (w) { CompFullscreenMonitorSet monitors; monitors.top = event->xclient.data.l[0]; monitors.bottom = event->xclient.data.l[1]; monitors.left = event->xclient.data.l[2]; monitors.right = event->xclient.data.l[3]; w->priv->setFullscreenMonitors (&monitors); } } break; case MappingNotify: modHandler->updateModifierMappings (); break; case MapRequest: w = screen->findWindow (event->xmaprequest.window); if (w) { XWindowAttributes attr; bool doMapProcessing = true; /* We should check the override_redirect flag here, because the client might have changed it while being unmapped. */ if (w->queryAttributes (attr)) w->priv->setOverrideRedirect (attr.override_redirect != 0); if (w->state () & CompWindowStateHiddenMask) if (!w->minimized () && !w->inShowDesktopMode ()) doMapProcessing = false; if (doMapProcessing) w->priv->processMap (); w->priv->managed = true; setWindowProp (w->id (), Atoms::winDesktop, w->desktop ()); } else { XMapWindow (privateScreen.dpy, event->xmaprequest.window); } break; case ConfigureRequest: w = findWindow (event->xconfigurerequest.window); if (w && w->managed ()) { XWindowChanges xwc; memset (&xwc, 0, sizeof (xwc)); xwc.x = event->xconfigurerequest.x; xwc.y = event->xconfigurerequest.y; xwc.width = event->xconfigurerequest.width; xwc.height = event->xconfigurerequest.height; xwc.border_width = event->xconfigurerequest.border_width; w->moveResize (&xwc, event->xconfigurerequest.value_mask, 0, ClientTypeUnknown); if (event->xconfigurerequest.value_mask & CWStackMode) { Window above = None; CompWindow *sibling = NULL; if (event->xconfigurerequest.value_mask & CWSibling) { above = event->xconfigurerequest.above; sibling = findTopLevelWindow (above); } switch (event->xconfigurerequest.detail) { case Above: if (w->priv->allowWindowFocus (NO_FOCUS_MASK, 0)) { if (above) { if (sibling) w->restackAbove (sibling); } else w->raise (); } break; case Below: if (above) { if (sibling) w->restackBelow (sibling); } else w->lower (); break; default: /* no handling of the TopIf, BottomIf, Opposite cases - there will hardly be any client using that */ break; } } } else { XWindowChanges xwc; unsigned int xwcm; xwcm = event->xconfigurerequest.value_mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); xwc.x = event->xconfigurerequest.x; xwc.y = event->xconfigurerequest.y; xwc.width = event->xconfigurerequest.width; xwc.height = event->xconfigurerequest.height; xwc.border_width = event->xconfigurerequest.border_width; if (w) { /* Any window that receives a ConfigureRequest * is not override redirect, and may have changed * to being not override redirect */ w->priv->setOverrideRedirect (false); w->configureXWindow (xwcm, &xwc); } else XConfigureWindow (privateScreen.dpy, event->xconfigurerequest.window, xwcm, &xwc); } break; case CirculateRequest: break; case FocusIn: { if (!XGetWindowAttributes (privateScreen.dpy, event->xfocus.window, &wa)) privateScreen.setDefaultWindowAttributes (&wa); /* If the call to XGetWindowAttributes failed it means * the window was destroyed, so track the focus change * anyways since we need to increment activeNum * and the passive button grabs and then we will * get the DestroyNotify later and change the focus * there */ if (wa.root == privateScreen.rootWindow()) { if (event->xfocus.mode == NotifyGrab) privateScreen.eventManager.grabNotified (); else if (event->xfocus.mode == NotifyUngrab) privateScreen.eventManager.ungrabNotified (); else { CompWindowList dockWindows; XWindowChanges xwc; unsigned int mask; w = findTopLevelWindow (event->xfocus.window); if (w && w->managed ()) { unsigned int state = w->state (); if (getNextActiveWindow() == event->xfocus.window) setNextActiveWindow(None); if (w->id () != privateScreen.orphanData.activeWindow) { CompWindow *active = screen->findWindow (privateScreen.orphanData.activeWindow); privateScreen.orphanData.activeWindow = w->id (); w->priv->activeNum = nextActiveNum(); if (active) { CompWindowList windowsLostFocus; /* If this window lost focus and was above a fullscreen window * and is no longer capable of being focused (eg, it is * not visible on this viewport) then we need to check if * any other windows below it are also now no longer capable * of being focused and restack them in the highest position * below docks that they are allowed to take */ if (!active->focus ()) { windowsLostFocus.push_back (active); for (CompWindow *fsw = active->prev; fsw; fsw = fsw->prev) { if (!fsw->focus () && fsw->managed () && !(fsw->type () & (CompWindowTypeDockMask | CompWindowTypeFullscreenMask)) && !fsw->overrideRedirect ()) windowsLostFocus.push_back (fsw); if (fsw->type () & CompWindowTypeFullscreenMask) { ServerLock lock (screen->serverGrabInterface ()); /* This will be the window that we must lower relative to */ CompWindow *sibling = PrivateWindow::findValidStackSiblingBelow (active, fsw, lock); if (sibling) { for (CompWindowList::reverse_iterator rit = windowsLostFocus.rbegin (); rit != windowsLostFocus.rend (); ++rit) { (*rit)->restackAbove (sibling); } } break; } } } active->changeState (active->focused () || (w->type () & APPEARS_FOCUSED_MASK) ? active->state () | CompWindowStateFocusedMask : active->state () & ~CompWindowStateFocusedMask); active->priv->updatePassiveButtonGrabs (); } if (w->focused () || (w->type () & APPEARS_FOCUSED_MASK)) state |= w->state () | CompWindowStateFocusedMask; else state &= w->state () & ~CompWindowStateFocusedMask; w->priv->updatePassiveButtonGrabs (); addToCurrentActiveWindowHistory (w->id ()); XChangeProperty (privateScreen.dpy , privateScreen.rootWindow(), Atoms::winActive, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &privateScreen.orphanData.activeWindow, 1); w->windowNotify (CompWindowNotifyFocusChange); } state &= ~CompWindowStateDemandsAttentionMask; w->changeState (state); } else if (event->xfocus.window == privateScreen.rootWindow()) { /* Don't ever let the focus go to the root * window except in grab cases * * FIXME: There might be a case where we have to * handle root windows of other screens here, but * the other window managers should handle that */ if (event->xfocus.detail == NotifyDetailNone || (event->xfocus.mode == NotifyNormal && event->xfocus.detail == NotifyInferior)) { privateScreen.orphanData.activeWindow = None; if (event->xfocus.detail == NotifyDetailNone || (event->xfocus.mode == NotifyNormal && event->xfocus.detail == NotifyInferior)) { screen->focusDefaultWindow (); } } } /* Ensure that docks are stacked in the right place * * When a normal window gets the focus and is above a * fullscreen window, restack the docks to be above * the highest level mapped and visible normal window, * otherwise put them above the highest fullscreen window */ if (w) { ServerLock lock (screen->serverGrabInterface ()); if (PrivateWindow::stackDocks (w, dockWindows, &xwc, &mask, lock)) { Window sibling = xwc.sibling; xwc.stack_mode = Above; /* Then update the dock windows */ foreach (CompWindow *dw, dockWindows) { xwc.sibling = sibling; dw->restackAndConfigureXWindow (mask, &xwc, lock); } } } } } else { CompWindow *w; w = screen->findWindow (privateScreen.orphanData.activeWindow); setNextActiveWindow(None); privateScreen.orphanData.activeWindow = None; if (w) w->priv->updatePassiveButtonGrabs (); } } break; case FocusOut: if (event->xfocus.mode == NotifyUngrab) privateScreen.eventManager.ungrabNotified (); else if (event->xfocus.mode == NotifyWhileGrabbed) privateScreen.eventManager.grabNotified (); break; case EnterNotify: if (event->xcrossing.root == privateScreen.rootWindow()) w = findTopLevelWindow (event->xcrossing.window); else w = NULL; if (w && w->id () != below) { below = w->id (); if (!privateScreen.optionGetClickToFocus () && privateScreen.eventManager.grabsEmpty () && event->xcrossing.mode != NotifyGrab && event->xcrossing.detail != NotifyInferior) { bool raise; int delay; int mask = CompWindowTypeDockMask; raise = privateScreen.optionGetAutoraise (); delay = privateScreen.optionGetAutoraiseDelay (); if (!privateScreen.optionGetFocusDesktop ()) mask = mask | CompWindowTypeDesktopMask; if (autoRaiseTimer_.active () && autoRaiseWindow_ != w->id ()) { autoRaiseTimer_.stop (); } if (w->type () & ~mask) { w->moveInputFocusTo (); if (raise) { if (delay > 0) { autoRaiseWindow_ = w->id (); autoRaiseTimer_.start ( boost::bind (autoRaiseTimeout, this), delay, (unsigned int) ((float) delay * 1.2)); } else { CompStackingUpdateMode mode = CompStackingUpdateModeNormal; w->updateAttributes (mode); } } } } } break; case LeaveNotify: if (event->xcrossing.detail != NotifyInferior) { if (event->xcrossing.window == below) below = None; } break; default: if (privateScreen.xShape.isEnabled () && event->type == privateScreen.xShape.get () + ShapeNotify) { w = findWindow (((XShapeEvent *) event)->window); if (w) { if (w->mapNum ()) w->priv->updateRegion (); } } else if (event->type == privateScreen.xSync.get () + XSyncAlarmNotify) { XSyncAlarmNotifyEvent *sa; sa = (XSyncAlarmNotifyEvent *) event; for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (w->priv->syncAlarm == sa->alarm) { w->priv->handleSyncAlarm (); break; } } } break; } } ./src/screen.cpp0000644000004100000410000040637713246301623014036 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include #include #include #include #include #include #include #include #include #include #include #include "privatescreen.h" #include "privatewindow.h" #include "privateaction.h" #include "privatestackdebugger.h" template class WrapableInterface; CompOutput *targetOutput; int lastPointerX = 0; int lastPointerY = 0; unsigned int lastPointerMods = 0; int pointerX = 0; int pointerY = 0; unsigned int pointerMods = 0; namespace { bool inHandleEvent = false; bool screenInitalized = false; } #define normalCursorName XC_left_ptr #define busyCursorName XC_watch #define MwmHintsFunctions (1L << 0) #define MwmHintsDecorations (1L << 1) static const unsigned short PropMotifWmHintElements = 3; typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; } MwmHints; namespace cps = compiz::private_screen; namespace ca = compiz::actions; CompScreen *screen; ModifierHandler *modHandler; PluginClassStorage::Indices screenPluginClassIndices (0); namespace utils { bool is_number (CompString const& s) { return std::find_if (s.begin (), s.end (), [](char c) { return !std::isdigit (c); }) == s.end (); } } void CompScreenImpl::sizePluginClasses(unsigned int size) { if(size != pluginClasses.size ()) pluginClasses.resize (size); } void CompScreenImpl::setWindowState (unsigned int state, Window id) { privateScreen.setWindowState (state, id); } void CompScreenImpl::addToDestroyedWindows(CompWindow * cw) { windowManager.addToDestroyedWindows(cw); } void CompScreenImpl::processEvents () { privateScreen.processEvents (); } unsigned int CompScreen::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (screenPluginClassIndices); sizePluginClasses(screenPluginClassIndices.size()); return i; } void CompScreen::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (screenPluginClassIndices, index); sizePluginClasses(screenPluginClassIndices.size()); } void cps::EventManager::handleSignal (int signum) { switch (signum) { case SIGINT: case SIGTERM: mainloop->quit (); break; case SIGHUP: restartSignal = true; mainloop->quit (); break; default: break; } mainloop->quit (); } void CompScreenImpl::eventLoop () { privateScreen.eventManager.startEventLoop (dpy()); } void cps::EventManager::startEventLoop(Display* dpy) { source = CompEventSource::create (); timeout = CompTimeoutSource::create (ctx); source->attach (ctx); XFlush (dpy); mainloop->run(); } CompFileWatchHandle CompScreenImpl::addFileWatch (const char *path, int mask, FileWatchCallBack callBack) { CompFileWatch *fileWatch = privateScreen.eventManager.addFileWatch (path, mask, callBack); if (!fileWatch) return 0; fileWatchAdded (fileWatch); return fileWatch->handle; } CompFileWatch* cps::EventManager::addFileWatch ( const char *path, int mask, FileWatchCallBack callBack) { CompFileWatch *fw = new CompFileWatch (); if (!fw) return 0; fw->path = path; fw->mask = mask; fw->callBack = callBack; fw->handle = lastFileWatchHandle++; if (lastFileWatchHandle == MAXSHORT) lastFileWatchHandle = 1; fileWatch.push_front (fw); return fw; } void CompScreenImpl::removeFileWatch (CompFileWatchHandle handle) { if (CompFileWatch* w = privateScreen.eventManager.removeFileWatch (handle)) { fileWatchRemoved (w); delete w; } } CompFileWatch* cps::EventManager::removeFileWatch (CompFileWatchHandle handle) { std::list::iterator it; for (it = fileWatch.begin (); it != fileWatch.end (); ++it) if ((*it)->handle == handle) break; if (it == fileWatch.end ()) return 0; CompFileWatch* w = (*it); fileWatch.erase (it); return w; } const CompFileWatchList & CompScreenImpl::getFileWatches () const { return privateScreen.eventManager.getFileWatches (); } const CompFileWatchList & cps::EventManager::getFileWatches () const { return fileWatch; } CompWatchFd::CompWatchFd (int fd, Glib::IOCondition events, FdWatchCallBack callback) : Glib::IOSource (fd, events), mFd (fd), mCallBack (callback), mForceFail (false), mExecuting (false) { connect (sigc::mem_fun (this, &CompWatchFd::internalCallback)); } CompWatchFd::~CompWatchFd () { } Glib::RefPtr CompWatchFd::create (int fd, Glib::IOCondition events, FdWatchCallBack callback) { return Glib::RefPtr (new CompWatchFd (fd, events, callback)); } CompWatchFdHandle CompScreenImpl::addWatchFd (int fd, short int events, FdWatchCallBack callBack) { return privateScreen.eventManager.addWatchFd (fd, events, callBack); } CompWatchFdHandle cps::EventManager::addWatchFd (int fd, short int events, FdWatchCallBack callBack) { Glib::IOCondition gEvents; memset (&gEvents, 0, sizeof (Glib::IOCondition)); if (events & POLLIN) gEvents |= Glib::IO_IN; if (events & POLLOUT) gEvents |= Glib::IO_OUT; if (events & POLLPRI) gEvents |= Glib::IO_PRI; if (events & POLLERR) gEvents |= Glib::IO_ERR; if (events & POLLHUP) gEvents |= Glib::IO_HUP; Glib::RefPtr watchFd = CompWatchFd::create (fd, gEvents, callBack); watchFd->attach (ctx); if (!watchFd) return 0; watchFd->mHandle = lastWatchFdHandle++; if (lastWatchFdHandle == MAXSHORT) lastWatchFdHandle = 1; watchFds.push_front (watchFd); return watchFd->mHandle; } void CompScreenImpl::removeWatchFd (CompWatchFdHandle handle) { privateScreen.eventManager.removeWatchFd (handle); } void cps::EventManager::removeWatchFd (CompWatchFdHandle handle) { std::list >::iterator it; Glib::RefPtr w; for (it = watchFds.begin(); it != watchFds.end (); ++it) { if ((*it)->mHandle == handle) break; } if (it == watchFds.end ()) return; w = (*it); if (w->mExecuting) { w->mForceFail = true; return; } watchFds.erase (it); } void CompScreenImpl::storeValue (CompString key, CompPrivate value) { ValueHolder::Default ()->storeValue (key, value); } bool CompScreenImpl::hasValue (CompString key) { return ValueHolder::Default ()->hasValue (key); } CompPrivate CompScreenImpl::getValue (CompString key) { return ValueHolder::Default ()->getValue (key); } bool CompWatchFd::internalCallback (Glib::IOCondition events) { short int revents = 0; if (events & Glib::IO_IN) revents |= POLLIN; if (events & Glib::IO_OUT) revents |= POLLOUT; if (events & Glib::IO_PRI) revents |= POLLPRI; if (events & Glib::IO_ERR) revents |= POLLERR; if (events & Glib::IO_HUP) revents |= POLLHUP; if (events & Glib::IO_NVAL) return false; mExecuting = true; mCallBack (revents); mExecuting = false; if (mForceFail) { /* FIXME: Need to find a way to properly remove the watchFd * from the internal list in core */ //screen->priv->watchFds.remove (this); return false; } return true; } void CompScreenImpl::eraseValue (CompString key) { ValueHolder::Default ()->eraseValue (key); } void CompScreen::fileWatchAdded (CompFileWatch *watch) { WRAPABLE_HND_FUNCTN (fileWatchAdded, watch); _fileWatchAdded (watch); } void CompScreenImpl::_fileWatchAdded (CompFileWatch *watch) { } void CompScreen::fileWatchRemoved (CompFileWatch *watch) { WRAPABLE_HND_FUNCTN (fileWatchRemoved, watch); _fileWatchRemoved (watch); } void CompScreenImpl::_fileWatchRemoved (CompFileWatch *watch) { } bool CompScreen::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { WRAPABLE_HND_FUNCTN_RETURN (bool, setOptionForPlugin, plugin, name, value) return _setOptionForPlugin(plugin, name, value); } bool CompScreenImpl::_setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) { CompPlugin *p = CompPlugin::find (plugin); if (p) return p->vTable->setOption (name, value); return false; } void CompScreen::sessionEvent (CompSession::Event event, CompOption::Vector &arguments) { WRAPABLE_HND_FUNCTN (sessionEvent, event, arguments); _sessionEvent(event, arguments); } void CompScreenImpl::_sessionEvent (CompSession::Event event, CompOption::Vector &arguments) { } void ScreenInterface::fileWatchAdded (CompFileWatch *watch) WRAPABLE_DEF (fileWatchAdded, watch) void ScreenInterface::fileWatchRemoved (CompFileWatch *watch) WRAPABLE_DEF (fileWatchRemoved, watch) bool ScreenInterface::initPluginForScreen (CompPlugin *plugin) WRAPABLE_DEF (initPluginForScreen, plugin) void ScreenInterface::finiPluginForScreen (CompPlugin *plugin) WRAPABLE_DEF (finiPluginForScreen, plugin) bool ScreenInterface::setOptionForPlugin (const char *plugin, const char *name, CompOption::Value &value) WRAPABLE_DEF (setOptionForPlugin, plugin, name, value) void ScreenInterface::sessionEvent (CompSession::Event event, CompOption::Vector &arguments) WRAPABLE_DEF (sessionEvent, event, arguments) static int errors = 0; static int errorHandler (Display *dpy, XErrorEvent *e) { #ifdef DEBUG char str[128]; #endif errors++; #ifdef DEBUG XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "", str, 128); fprintf (stderr, "%s", str); XGetErrorText (dpy, e->error_code, str, 128); fprintf (stderr, ": %s\n ", str); XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "%d", str, 128); fprintf (stderr, str, e->request_code); snprintf (str, 128, "%d", e->request_code); XGetErrorDatabaseText (dpy, "XRequest", str, "", str, 128); if (strcmp (str, "")) fprintf (stderr, " (%s)", str); fprintf (stderr, "\n "); XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "%d", str, 128); fprintf (stderr, str, e->minor_code); fprintf (stderr, "\n "); XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "%d", str, 128); fprintf (stderr, str, e->resourceid); fprintf (stderr, "\n"); /* abort (); */ #endif return 0; } int CompScreen::checkForError (Display *dpy) { int e; XSync (dpy, false); e = errors; errors = 0; return e; } Display * CompScreenImpl::dpy () { return privateScreen.dpy; } bool CompScreenImpl::XRandr () { return privateScreen.xRandr.isEnabled (); } int CompScreenImpl::randrEvent () { return privateScreen.xRandr.get (); } bool CompScreenImpl::XShape () { return privateScreen.xShape.isEnabled (); } int CompScreenImpl::shapeEvent () { return privateScreen.xShape.get (); } int CompScreenImpl::syncEvent () { return privateScreen.xSync.get (); } SnDisplay * CompScreenImpl::snDisplay () { return privateScreen.getSnDisplay (); } Window CompScreenImpl::activeWindow () { return privateScreen.orphanData.activeWindow; } Window CompScreenImpl::autoRaiseWindow () { return autoRaiseWindow_; } const char * CompScreenImpl::displayString () { return privateScreen.displayString (); } void PrivateScreen::updateScreenInfo () { if (xineramaExtension) { int nInfo; XineramaScreenInfo *info = XineramaQueryScreens (dpy, &nInfo); screenInfo = std::vector (info, info + nInfo); if (info) XFree (info); } } void PrivateScreen::setAudibleBell (bool audible) { if (xkbEvent.isEnabled()) XkbChangeEnabledControls (dpy, XkbUseCoreKbd, XkbAudibleBellMask, audible ? XkbAudibleBellMask : 0); } bool CompScreenImpl::handlePingTimeout () { return Ping::handlePingTimeout( windowManager.begin(), windowManager.end(), privateScreen.dpy); } bool cps::Ping::handlePingTimeout (WindowManager::iterator begin, WindowManager::iterator end, Display* dpy) { XEvent ev; int ping = lastPing_ + 1; ev.type = ClientMessage; ev.xclient.window = 0; ev.xclient.message_type = Atoms::wmProtocols; ev.xclient.format = 32; ev.xclient.data.l[0] = Atoms::wmPing; ev.xclient.data.l[1] = ping; ev.xclient.data.l[2] = 0; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; for (WindowManager::iterator i = begin; i != end; ++i) { CompWindow* const w(*i); if (w->priv->handlePingTimeout (lastPing_)) { ev.xclient.window = w->id (); ev.xclient.data.l[2] = w->id (); XSendEvent (dpy, w->id (), false, NoEventMask, &ev); } } lastPing_ = ping; return true; } CompOption::Vector & CompScreenImpl::getOptions () { return privateScreen.getOptions (); } bool CompScreenImpl::setOption (const CompString &name, CompOption::Value &value) { return privateScreen.setOption (name, value); } bool PrivateScreen::setOption (const CompString &name, CompOption::Value &value) { unsigned int index; bool rv = CoreOptions::setOption (name, value); if (!rv) return false; if (!CompOption::findOption (getOptions (), name, &index)) return false; switch (index) { case CoreOptions::ActivePlugins: pluginManager.setDirtyPluginList (); break; case CoreOptions::PingDelay: pingTimer.setTimes (optionGetPingDelay (), optionGetPingDelay () + 500); break; case CoreOptions::AudibleBell: setAudibleBell (optionGetAudibleBell ()); break; case CoreOptions::DetectOutputs: if (optionGetDetectOutputs ()) detectOutputDevices (*this); break; case CoreOptions::Hsize: case CoreOptions::Vsize: if (optionGetHsize () * screen->width () > MAXSHORT) return false; if (optionGetVsize () * screen->height () > MAXSHORT) return false; setVirtualScreenSize (optionGetHsize (), optionGetVsize ()); break; case CoreOptions::DefaultIcon: return screen->updateDefaultIcon (); break; case CoreOptions::Outputs: if (optionGetDetectOutputs ()) return false; updateOutputDevices (*this); break; default: break; } return rv; } bool PrivateScreen::getNextXEvent (XEvent &ev) { if (!XEventsQueued (dpy, QueuedAlready)) return false; XNextEvent (dpy, &ev); /* Skip to the last MotionNotify * event in this sequence */ if (ev.type == MotionNotify) { XEvent peekEvent; while (XPending (dpy)) { XPeekEvent (dpy, &peekEvent); if (peekEvent.type != MotionNotify) break; /* Overwrite previous MotionNotify event */ XNextEvent (dpy, &ev); } } return true; } bool PrivateScreen::getNextEvent (XEvent &ev) { StackDebugger *dbg = StackDebugger::Default (); if (StackDebugger::Default ()) { return dbg->getNextEvent (ev); } else return getNextXEvent (ev); } void PrivateScreen::processEvents () { StackDebugger *dbg = StackDebugger::Default (); if (pluginManager.isDirtyPluginList ()) { eventManager.resetPossibleTap(); pluginManager.updatePlugins (screen, optionGetActivePlugins()); } windowManager.validateServerWindows(); if (dbg) { dbg->windowsChanged (false); dbg->serverWindowsChanged (false); dbg->loadStack (windowManager.getServerWindows()); } windowManager.invalidateServerWindows(); XEvent event; while (getNextEvent (event)) { switch (event.type) { case ButtonPress: case ButtonRelease: pointerX = event.xbutton.x_root; pointerY = event.xbutton.y_root; pointerMods = event.xbutton.state; break; case KeyPress: case KeyRelease: pointerX = event.xkey.x_root; pointerY = event.xkey.y_root; pointerMods = event.xkey.state; break; case MotionNotify: pointerX = event.xmotion.x_root; pointerY = event.xmotion.y_root; pointerMods = event.xmotion.state; break; case EnterNotify: case LeaveNotify: pointerX = event.xcrossing.x_root; pointerY = event.xcrossing.y_root; pointerMods = event.xcrossing.state; break; case ClientMessage: if (event.xclient.message_type == Atoms::xdndPosition) { pointerX = event.xclient.data.l[2] >> 16; pointerY = event.xclient.data.l[2] & 0xffff; /* FIXME: Xdnd provides us no way of getting the pointer mods * without doing XQueryPointer, which is a round-trip */ pointerMods = 0; } else if (event.xclient.message_type == Atoms::wmMoveResize) { int i; Window child, root; /* _NET_WM_MOVERESIZE is most often sent by clients who provide * a special "grab space" on a window for the user to initiate * adjustment by the window manager. Since we don't have a * passive grab on Button1 for active and raised windows, we * need to update the pointer buffer here */ XQueryPointer (screen->dpy (), screen->root (), &root, &child, &pointerX, &pointerY, &i, &i, &pointerMods); } break; default: break; } sn_display_process_event (snDisplay, &event); inHandleEvent = true; screen->alwaysHandleEvent (&event); inHandleEvent = false; XFlush (dpy); lastPointerX = pointerX; lastPointerY = pointerY; lastPointerMods = pointerMods; } /* remove destroyed windows */ windowManager.removeDestroyed (); if (dbg) { if (dbg->windowsChanged () && dbg->cmpStack (windowManager.getWindows(), windowManager.getServerWindows())) { compLogMessage ("core", CompLogLevelDebug, "stacks are out of sync"); if (dbg->timedOut ()) compLogMessage ("core", CompLogLevelDebug, "however, this may be a false positive"); } if (dbg->serverWindowsChanged () && dbg->checkSanity (windowManager.getWindows())) compLogMessage ("core", CompLogLevelDebug, "windows are stacked incorrectly"); } } void cps::WindowManager::validateServerWindows() { /* Restacks recently processed, ensure that * plugins use the stack last received from * the server */ if (stackIsFresh) { serverWindows.clear (); foreach (CompWindow *sw, windows) { sw->serverPrev = sw->prev; sw->serverNext = sw->next; serverWindows.push_back (sw); } } } void cps::WindowManager::invalidateServerWindows() { stackIsFresh = false; } void cps::WindowManager::clearFullscreenHints() const { /* clear out fullscreen monitor hints of all windows as suggested on monitor layout changes in EWMH */ for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->priv->fullscreenMonitorsSet) w->priv->setFullscreenMonitors (NULL); } } void cps::WindowManager::showOrHideForDesktop(unsigned int desktop) const { for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->desktop () == 0xffffffff) continue; if (w->desktop () == desktop) w->priv->show (); else w->priv->hide (); } } void cps::WindowManager::setWindowActiveness(cps::History& history) const { for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); if (w->isViewable ()) w->priv->activeNum = history.nextActiveNum (); } } void cps::WindowManager::updateWindowSizes() const { CompWindow::Geometry before, after; for (iterator i = windows.begin(); i != windows.end(); ++i) { CompWindow* const w(*i); before = w->priv->serverGeometry; w->priv->updateSize (); after = w->priv->serverGeometry; /* A maximized window was adjusted for the new workarea size */ if (before != after && (w->state () & CompWindowStateMaximizedVertMask || w->state () & CompWindowStateMaximizedHorzMask)) { w->priv->moved = true; } } } CompOption::Value::Vector cps::PluginManager::mergedPluginList (CompOption::Value::Vector const& extraPluginsRequested) const { CompOption::Value::Vector result; /* Must have core as first plugin */ result.push_back("core"); /* Add initial plugins */ foreach(CompString & p, initialPlugins) { if (p == "core") continue; if (blacklist.find (p) != blacklist.end ()) continue; result.push_back(p); } /* Add plugins not in the initial list */ foreach(CompOption::Value const& opt, extraPluginsRequested) { if (opt.s() == "core") continue; if (blacklist.find (opt.s()) != blacklist.end ()) continue; typedef std::list::iterator iterator; bool skip = false; for (iterator it = initialPlugins.begin(); it != initialPlugins.end(); ++it) { if ((*it) == opt.s()) { skip = true; break; } } if (!skip) { result.push_back(opt.s()); } } return result; } void cps::PluginManager::updatePlugins (CompScreen* screen, CompOption::Value::Vector const& extraPluginsRequested) { dirtyPluginList = false; CompOption::Value::Vector const desiredPlugins(mergedPluginList(extraPluginsRequested)); unsigned int pluginIndex; for (pluginIndex = 1; pluginIndex < plugin.list ().size () && pluginIndex < desiredPlugins.size (); pluginIndex++) { if (plugin.list ().at (pluginIndex).s () != desiredPlugins.at (pluginIndex).s ()) break; } unsigned int desireIndex = pluginIndex; // We have pluginIndex pointing at first difference (or end). // Now pop plugins off stack to this point, but keep track that they are loaded CompPlugin::List alreadyLoaded; if (const unsigned int nPop = plugin.list().size() - pluginIndex) { for (pluginIndex = 0; pluginIndex < nPop; pluginIndex++) { alreadyLoaded.push_back(CompPlugin::pop()); plugin.list().pop_back(); } } // Now work forward through requested plugins for (; desireIndex < desiredPlugins.size(); desireIndex++) { CompPlugin *p = NULL; bool failedPush = false; // If already loaded, just try to push it... foreach(CompPlugin * pp, alreadyLoaded) { if (desiredPlugins[desireIndex].s() == pp->vTable->name()) { if (CompPlugin::push (pp)) { p = pp; alreadyLoaded.erase( std::find(alreadyLoaded.begin(), alreadyLoaded.end(), pp)); break; } else { alreadyLoaded.erase( std::find(alreadyLoaded.begin(), alreadyLoaded.end(), pp)); blacklist.insert (desiredPlugins[desireIndex].s ()); CompPlugin::unload(pp); p = NULL; failedPush = true; break; } } } // ...otherwise, try to load and push if (p == 0 && !failedPush) { p = CompPlugin::load(desiredPlugins[desireIndex].s ().c_str ()); if (p) { if (!CompPlugin::push(p)) { blacklist.insert (desiredPlugins[desireIndex].s ()); CompPlugin::unload(p); p = 0; } } else { blacklist.insert (desiredPlugins[desireIndex].s ()); } } if (p) plugin.list().push_back(p->vTable->name()); } // Any plugins that are loaded, but were not re-initialized can be unloaded. foreach(CompPlugin * pp, alreadyLoaded) CompPlugin::unload (pp); if (!dirtyPluginList) screen->setOptionForPlugin ("core", "active_plugins", plugin); } /* from fvwm2, Copyright Matthias Clasen, Dominik Vogt */ static bool convertProperty (Display *dpy, Time time, Window w, Atom target, Atom property) { static const unsigned short N_TARGETS = 4; Atom conversionTargets[N_TARGETS]; conversionTargets[0] = Atoms::targets; conversionTargets[1] = Atoms::multiple; conversionTargets[2] = Atoms::timestamp; conversionTargets[3] = Atoms::version; if (target == Atoms::targets) XChangeProperty (dpy, w, property, XA_ATOM, 32, PropModeReplace, (unsigned char *) conversionTargets, N_TARGETS); else if (target == Atoms::timestamp) XChangeProperty (dpy, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) &time, 1); else if (target == Atoms::version) { long icccmVersion[] = { 2, 0 }; XChangeProperty (dpy, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) icccmVersion, 2); } else return false; /* Be sure the PropertyNotify has arrived so we * can send SelectionNotify */ XSync (dpy, false); return true; } /* from fvwm2, Copyright Matthias Clasen, Dominik Vogt */ void PrivateScreen::handleSelectionRequest (XEvent *event) { if (wmSnSelectionWindow != event->xselectionrequest.owner || wmSnAtom != event->xselectionrequest.selection) return; XSelectionEvent reply; reply.type = SelectionNotify; reply.display = dpy; reply.requestor = event->xselectionrequest.requestor; reply.selection = event->xselectionrequest.selection; reply.target = event->xselectionrequest.target; reply.property = None; reply.time = event->xselectionrequest.time; if (event->xselectionrequest.target == Atoms::multiple) { if (event->xselectionrequest.property != None) { Atom type, *adata; int i, format; unsigned long num, rest; unsigned char *data; if (XGetWindowProperty (dpy, event->xselectionrequest.requestor, event->xselectionrequest.property, 0, 256, false, Atoms::atomPair, &type, &format, &num, &rest, &data) != Success) return; /* FIXME: to be 100% correct, should deal with rest > 0, * but since we have 4 possible targets, we will hardly ever * meet multiple requests with a length > 8 */ adata = (Atom *) data; i = 0; while (i < (int) num) { if (!convertProperty (dpy, wmSnTimestamp, event->xselectionrequest.requestor, adata[i], adata[i + 1])) adata[i + 1] = None; i += 2; } XChangeProperty (dpy, event->xselectionrequest.requestor, event->xselectionrequest.property, Atoms::atomPair, 32, PropModeReplace, data, num); if (data) XFree (data); } } else { if (event->xselectionrequest.property == None) event->xselectionrequest.property = event->xselectionrequest.target; if (convertProperty (dpy, wmSnTimestamp, event->xselectionrequest.requestor, event->xselectionrequest.target, event->xselectionrequest.property)) reply.property = event->xselectionrequest.property; } XSendEvent (dpy, event->xselectionrequest.requestor, false, 0L, (XEvent *) &reply); } void PrivateScreen::handleSelectionClear (XEvent *event) { /* We need to unmanage the screen on which we lost the selection */ if (wmSnSelectionWindow != event->xselectionclear.window || wmSnAtom != event->xselectionclear.selection) return; eventManager.quit (); } static const CompString IMAGEDIR("images"); static const CompString HOMECOMPIZDIR(".compiz-1"); bool CompScreenImpl::readImageFromFile (CompString &name, CompString &pname, CompSize &size, void *&data) { bool status; int stride; status = fileToImage (name, size, stride, data); if (!status) { char *home = getenv ("HOME"); CompString path; if (home) { path = home; path += "/"; path += HOMECOMPIZDIR; path += "/"; path += pname; path += "/"; path += IMAGEDIR; path += "/"; path += name; status = fileToImage (path, size, stride, data); if (status) return true; } path = SHAREDIR; path += "/"; path += pname; path += "/"; path += IMAGEDIR; path += "/"; path += name; status = fileToImage (path, size, stride, data); } return status; } bool CompScreenImpl::writeImageToFile (CompString &path, const char *format, CompSize &size, void *data) { CompString formatString (format); return imageToFile (path, formatString, size, size.width () * 4, data); } Window PrivateScreen::getActiveWindow (Window root) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; Window w = None; result = XGetWindowProperty (dpy, root, Atoms::winActive, 0L, 1L, false, XA_WINDOW, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&w, data, sizeof (Window)); XFree (data); } return w; } void PrivateScreen::updateResources () { Atom actual; int result, format; unsigned long n, left; unsigned char *data; result = XGetWindowProperty (dpy, root, XA_RESOURCE_MANAGER, 0L, 65536, False, XA_STRING, &actual, &format, &n, &left, &data); int oldCursorSize = CompOption::getIntOptionNamed (resourceManager, "Xcursor.size", -1); CompString oldCursorTheme = CompOption::getStringOptionNamed (resourceManager, "Xcursor.theme"); resourceManager.clear (); if (result == Success && data) { if (actual == XA_STRING) { std::vector lines; CompString resources (reinterpret_cast (data)); boost::split (lines, resources, boost::is_any_of ("\n")); for (auto const& line : lines) { std::vector pair; boost::split (pair, line, boost::is_any_of ("\t")); if (pair.size () == 2 && pair[0].back () == ':') { CompOption option; auto key = pair[0].substr (0, pair[0].size () - 1); auto const& value = pair[1]; if (utils::is_number (value)) { option.setName (key, CompOption::TypeInt); option.value ().set (std::atoi (value.c_str ())); } else { option.setName (key, CompOption::TypeString); option.value ().set (value); } resourceManager.push_back (option); } } } XFree (data); } int cursorSize = CompOption::getIntOptionNamed (resourceManager, "Xcursor.size", -1); CompString const& cursorTheme = CompOption::getStringOptionNamed (resourceManager, "Xcursor.theme"); if (cursorSize != oldCursorSize || cursorTheme != oldCursorTheme) screen->cursorChangeNotify (cursorTheme, cursorSize); } void PrivateScreen::updateAverageColor (Atom atom) { Atom actual_type; int result, format; unsigned long n, left; unsigned char *data; auto previousAverageColor = averageColor; averageColor.clear (); result = XGetWindowProperty (dpy, root, atom, 0L, 65536, False, XA_STRING, &actual_type, &format, &n, &left, &data); if (result != Success || !data || actual_type != XA_STRING) { if (previousAverageColor != averageColor) screen->averageColorChangeNotify (averageColor.data ()); XFree (data); return; } CompString colors (reinterpret_cast (data)); bool found_valid; double r, g, b, a; found_valid = false; r = g = b = 0.0; a = 1.0; const CompString rgba_regex = R"((rgba?))" R"(\s*\(\s*([0-9]{1,3})\s*,)" R"(\s*([0-9]{1,3})\s*,)" R"(\s*([0-9]{1,3})\s*)" R"((,\s*((0*(\.[0-9]+)|1(\.0*)?)?)\s*)?\))"; std::vector matches = compGetRegexMatches (rgba_regex, colors); if (matches.size () > 4) { try { found_valid = true; r = std::stoi (matches[2]) / 255.0; g = std::stoi (matches[3]) / 255.0; b = std::stoi (matches[4]) / 255.0; if (matches[1] == "rgba") { if (matches.size () > 6 && !matches[6].empty ()) a = std::stod (matches[6][0] == '.' ? '0'+matches[6] : matches[6]); else found_valid = false; } } catch (std::exception const& except) { found_valid = false; compLogMessage ("core", CompLogLevelWarn, "%s: failed to parse '%s' color string", except.what (), colors.c_str ()); } } else { size_t color_len = (colors.length () - 1) / 3; if (color_len > 0 && color_len <= 4) { CompString hex_regex = "#([[:xdigit:]]{" + std::to_string(color_len) + "})" + "([[:xdigit:]]{" + std::to_string(color_len) + "})" + "([[:xdigit:]]{" + std::to_string(color_len) + "})" + "([[:xdigit:]]{" + std::to_string(color_len) + "})?$"; std::vector matches = compGetRegexMatches (hex_regex, colors); if (matches.size () == 5) { try { double max_value = static_cast ((1 << (4 * color_len)) - 1); found_valid = true; r = std::stoi (matches[1], 0, 16) / max_value; g = std::stoi (matches[2], 0, 16) / max_value; b = std::stoi (matches[3], 0, 16) / max_value; if (!matches[4].empty ()) a = std::stoi (matches[4], 0, 16) / max_value; } catch (std::exception const& except) { found_valid = false; compLogMessage ("core", CompLogLevelWarn, "%s: failed to parse '%s' color string", except.what (), colors.c_str ()); } } } } if (found_valid) { const double MaxUShort = std::numeric_limits::max (); averageColor.resize (4); averageColor[0] = MAX (0, MIN (r * MaxUShort, MaxUShort)); averageColor[1] = MAX (0, MIN (g * MaxUShort, MaxUShort)); averageColor[2] = MAX (0, MIN (b * MaxUShort, MaxUShort)); averageColor[3] = MAX (0, MIN (a * MaxUShort, MaxUShort)); } XFree (data); if (previousAverageColor != averageColor) screen->averageColorChangeNotify (averageColor.data ()); } bool CompScreen::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { WRAPABLE_HND_FUNCTN_RETURN (bool, fileToImage, name, size, stride, data); return _fileToImage(name, size, stride, data); } bool CompScreenImpl::_fileToImage (CompString &name, CompSize &size, int &stride, void *&data) { return false; } bool CompScreen::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { WRAPABLE_HND_FUNCTN_RETURN (bool, imageToFile, path, format, size, stride, data); return _imageToFile (path, format, size, stride, data); } bool CompScreenImpl::_imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) { return false; } void CompScreen::logMessage (const char *componentName, CompLogLevel level, const char *message) { WRAPABLE_HND_FUNCTN (logMessage, componentName, level, message) _logMessage (componentName, level, message); } void CompScreenImpl::_logMessage (const char *componentName, CompLogLevel level, const char *message) { ::logMessage (componentName, level, message); } int cps::XWindowInfo::getWmState (Window id) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; unsigned long state = NormalState; result = XGetWindowProperty (dpy, id, Atoms::wmState, 0L, 2L, false, Atoms::wmState, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&state, data, sizeof (unsigned long)); XFree ((void *) data); } return state; } void cps::XWindowInfo::setWmState (int state, Window id) const { unsigned long data[2]; data[0] = state; data[1] = None; XChangeProperty (dpy, id, Atoms::wmState, Atoms::wmState, 32, PropModeReplace, (unsigned char *) data, 2); } unsigned int cps::windowStateMask (Atom state) { if (state == Atoms::winStateModal) return CompWindowStateModalMask; else if (state == Atoms::winStateSticky) return CompWindowStateStickyMask; else if (state == Atoms::winStateMaximizedVert) return CompWindowStateMaximizedVertMask; else if (state == Atoms::winStateMaximizedHorz) return CompWindowStateMaximizedHorzMask; else if (state == Atoms::winStateShaded) return CompWindowStateShadedMask; else if (state == Atoms::winStateSkipTaskbar) return CompWindowStateSkipTaskbarMask; else if (state == Atoms::winStateSkipPager) return CompWindowStateSkipPagerMask; else if (state == Atoms::winStateHidden) return CompWindowStateHiddenMask; else if (state == Atoms::winStateFullscreen) return CompWindowStateFullscreenMask; else if (state == Atoms::winStateAbove) return CompWindowStateAboveMask; else if (state == Atoms::winStateBelow) return CompWindowStateBelowMask; else if (state == Atoms::winStateDemandsAttention) return CompWindowStateDemandsAttentionMask; else if (state == Atoms::winStateDisplayModal) return CompWindowStateDisplayModalMask; return 0; } unsigned int cps::windowStateFromString (const char *str) { if (strcasecmp (str, "modal") == 0) return CompWindowStateModalMask; else if (strcasecmp (str, "sticky") == 0) return CompWindowStateStickyMask; else if (strcasecmp (str, "maxvert") == 0) return CompWindowStateMaximizedVertMask; else if (strcasecmp (str, "maxhorz") == 0) return CompWindowStateMaximizedHorzMask; else if (strcasecmp (str, "shaded") == 0) return CompWindowStateShadedMask; else if (strcasecmp (str, "skiptaskbar") == 0) return CompWindowStateSkipTaskbarMask; else if (strcasecmp (str, "skippager") == 0) return CompWindowStateSkipPagerMask; else if (strcasecmp (str, "hidden") == 0) return CompWindowStateHiddenMask; else if (strcasecmp (str, "fullscreen") == 0) return CompWindowStateFullscreenMask; else if (strcasecmp (str, "above") == 0) return CompWindowStateAboveMask; else if (strcasecmp (str, "below") == 0) return CompWindowStateBelowMask; else if (strcasecmp (str, "demandsattention") == 0) return CompWindowStateDemandsAttentionMask; return 0; } unsigned int cps::XWindowInfo::getWindowState (Window id) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; unsigned int state = 0; result = XGetWindowProperty (dpy, id, Atoms::winState, 0L, 1024L, false, XA_ATOM, &actual, &format, &n, &left, &data); if (result == Success && data) { Atom *a = (Atom *) data; while (n--) state |= cps::windowStateMask (*a++); XFree ((void *) data); } return state; } unsigned int compiz::window::fillStateData (unsigned int state, Atom *data) { int i = 0; if (state & CompWindowStateModalMask) data[i++] = Atoms::winStateModal; if (state & CompWindowStateStickyMask) data[i++] = Atoms::winStateSticky; if (state & CompWindowStateMaximizedVertMask) data[i++] = Atoms::winStateMaximizedVert; if (state & CompWindowStateMaximizedHorzMask) data[i++] = Atoms::winStateMaximizedHorz; if (state & CompWindowStateShadedMask) data[i++] = Atoms::winStateShaded; if (state & CompWindowStateSkipTaskbarMask) data[i++] = Atoms::winStateSkipTaskbar; if (state & CompWindowStateSkipPagerMask) data[i++] = Atoms::winStateSkipPager; if (state & CompWindowStateHiddenMask) data[i++] = Atoms::winStateHidden; if (state & CompWindowStateFullscreenMask) data[i++] = Atoms::winStateFullscreen; if (state & CompWindowStateAboveMask) data[i++] = Atoms::winStateAbove; if (state & CompWindowStateBelowMask) data[i++] = Atoms::winStateBelow; if (state & CompWindowStateDemandsAttentionMask) data[i++] = Atoms::winStateDemandsAttention; if (state & CompWindowStateDisplayModalMask) data[i++] = Atoms::winStateDisplayModal; if (state & CompWindowStateFocusedMask) data[i++] = Atoms::winStateFocused; return i; } void PrivateScreen::setWindowState (unsigned int state, Window id) { int i = 0; Atom data[32]; i = compiz::window::fillStateData (state, data); XChangeProperty (dpy, id, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) data, i); } unsigned int cps::XWindowInfo::getWindowType (Window id) { Atom actual, a = None; int result, format; unsigned long n, left; unsigned char *data; result = XGetWindowProperty (dpy , id, Atoms::winType, 0L, 1L, false, XA_ATOM, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) memcpy (&a, data, sizeof (Atom)); XFree ((void *) data); } if (a) { if (a == Atoms::winTypeNormal) return CompWindowTypeNormalMask; else if (a == Atoms::winTypeMenu) return CompWindowTypeMenuMask; else if (a == Atoms::winTypeDesktop) return CompWindowTypeDesktopMask; else if (a == Atoms::winTypeDock) return CompWindowTypeDockMask; else if (a == Atoms::winTypeToolbar) return CompWindowTypeToolbarMask; else if (a == Atoms::winTypeUtil) return CompWindowTypeUtilMask; else if (a == Atoms::winTypeSplash) return CompWindowTypeSplashMask; else if (a == Atoms::winTypeDialog) return CompWindowTypeDialogMask; else if (a == Atoms::winTypeDropdownMenu) return CompWindowTypeDropdownMenuMask; else if (a == Atoms::winTypePopupMenu) return CompWindowTypePopupMenuMask; else if (a == Atoms::winTypeTooltip) return CompWindowTypeTooltipMask; else if (a == Atoms::winTypeNotification) return CompWindowTypeNotificationMask; else if (a == Atoms::winTypeCombo) return CompWindowTypeComboMask; else if (a == Atoms::winTypeDnd) return CompWindowTypeDndMask; } return CompWindowTypeUnknownMask; } void cps::XWindowInfo::getMwmHints (Window id, unsigned int *func, unsigned int *decor) const { Atom actual; int result, format; unsigned long n, left; unsigned char *data; *func = MwmFuncAll; *decor = MwmDecorAll; result = XGetWindowProperty (dpy, id, Atoms::mwmHints, 0L, 20L, false, AnyPropertyType, &actual, &format, &n, &left, &data); if (result == Success && data) { MwmHints *mwmHints = (MwmHints *) data; if (n >= PropMotifWmHintElements) { if (mwmHints->flags & MwmHintsDecorations) *decor = mwmHints->decorations; if (mwmHints->flags & MwmHintsFunctions) *func = mwmHints->functions; } XFree (data); } } unsigned int cps::XWindowInfo::getProtocols (Window id) { Atom *protocol; int count; unsigned int protocols = 0; if (XGetWMProtocols (dpy, id, &protocol, &count)) { for (int i = 0; i < count; i++) { if (protocol[i] == Atoms::wmDeleteWindow) protocols |= CompWindowProtocolDeleteMask; else if (protocol[i] == Atoms::wmTakeFocus) protocols |= CompWindowProtocolTakeFocusMask; else if (protocol[i] == Atoms::wmPing) protocols |= CompWindowProtocolPingMask; else if (protocol[i] == Atoms::wmSyncRequest) protocols |= CompWindowProtocolSyncRequestMask; } XFree (protocol); } return protocols; } unsigned int CompScreenImpl::getWindowProp (Window id, Atom property, unsigned int defaultValue) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; unsigned int retval = defaultValue; result = XGetWindowProperty (privateScreen.dpy, id, property, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) { unsigned long value; memcpy (&value, data, sizeof (unsigned long)); retval = (unsigned int) value; } XFree (data); } return retval; } void CompScreenImpl::setWindowProp (Window id, Atom property, unsigned int value) { unsigned long data = value; XChangeProperty (privateScreen.dpy, id, property, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } bool PrivateScreen::readWindowProp32 (Window id, Atom property, unsigned short *returnValue) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; bool retval = false; result = XGetWindowProperty (dpy, id, property, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &data); if (result == Success && data) { if (n) { CARD32 value; memcpy (&value, data, sizeof (CARD32)); retval = true; *returnValue = value >> 16; } XFree (data); } return retval; } unsigned short CompScreenImpl::getWindowProp32 (Window id, Atom property, unsigned short defaultValue) { unsigned short result; if (privateScreen.readWindowProp32 (id, property, &result)) return result; return defaultValue; } void CompScreenImpl::setWindowProp32 (Window id, Atom property, unsigned short value) { CARD32 value32; value32 = value << 16 | value; XChangeProperty (privateScreen.dpy, id, property, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &value32, 1); } void ScreenInterface::handleEvent (XEvent *event) WRAPABLE_DEF (handleEvent, event) void ScreenInterface::handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options) WRAPABLE_DEF (handleCompizEvent, plugin, event, options) bool ScreenInterface::fileToImage (CompString &name, CompSize &size, int &stride, void *&data) WRAPABLE_DEF (fileToImage, name, size, stride, data) bool ScreenInterface::imageToFile (CompString &path, CompString &format, CompSize &size, int stride, void *data) WRAPABLE_DEF (imageToFile, path, format, size, stride, data) CompMatch::Expression * ScreenInterface::matchInitExp (const CompString& value) WRAPABLE_DEF (matchInitExp, value) void ScreenInterface::matchExpHandlerChanged () WRAPABLE_DEF (matchExpHandlerChanged) void ScreenInterface::matchPropertyChanged (CompWindow *window) WRAPABLE_DEF (matchPropertyChanged, window) void ScreenInterface::logMessage (const char *componentName, CompLogLevel level, const char *message) WRAPABLE_DEF (logMessage, componentName, level, message) bool PrivateScreen::desktopHintEqual (unsigned long *data, int size, int offset, int hintSize) { if (size != desktopHintSize) return false; if (memcmp (data + offset, desktopHintData + offset, hintSize * sizeof (unsigned long)) == 0) return true; return false; } void PrivateScreen::setDesktopHints () { unsigned long *data; int dSize = nDesktop * 2 + nDesktop * 2 + nDesktop * 4 + 1; data = (unsigned long *) malloc (sizeof (unsigned long) * dSize); if (!data) return; unsigned int i; int offset = 0; int hintSize = nDesktop * 2; for (i = 0; i < nDesktop; i++) { data[offset + i * 2 + 0] = viewPort.vp.x () * screen->width (); data[offset + i * 2 + 1] = viewPort.vp.y () * screen->height (); } if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::desktopViewport, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); offset += hintSize; for (i = 0; i < nDesktop; i++) { data[offset + i * 2 + 0] = screen->width () * viewPort.vpSize.width (); data[offset + i * 2 + 1] = screen->height () * viewPort.vpSize.height (); } if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::desktopGeometry, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); offset += hintSize; hintSize = nDesktop * 4; for (i = 0; i < nDesktop; i++) { data[offset + i * 4 + 0] = workArea.x (); data[offset + i * 4 + 1] = workArea.y (); data[offset + i * 4 + 2] = workArea.width (); data[offset + i * 4 + 3] = workArea.height (); } if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::workarea, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); offset += hintSize; data[offset] = nDesktop; hintSize = 1; if (!desktopHintEqual (data, dSize, offset, hintSize)) XChangeProperty (dpy, rootWindow(), Atoms::numberOfDesktops, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data[offset], hintSize); if (desktopHintData) free (desktopHintData); desktopHintData = data; desktopHintSize = dSize; } void PrivateScreen::setVirtualScreenSize (int newh, int newv) { /* if newh or newv is being reduced */ if (newh < screen->vpSize ().width () || newv < screen->vpSize ().height ()) { int tx = 0; int ty = 0; if (screen->vp ().x () >= newh) tx = screen->vp ().x () - (newh - 1); if (screen->vp ().y () >= newv) ty = screen->vp ().y () - (newv - 1); if (tx != 0 || ty != 0) screen->moveViewport (tx, ty, TRUE); /* Move windows that were in one of the deleted viewports into the closest viewport */ foreach (CompWindow *w, screen->windows ()) { int moveX = 0; int moveY = 0; if (w->onAllViewports ()) continue; /* Find which viewport the (inner) window's top-left corner falls in, and check if it's outside the new viewport horizontal and vertical index range */ if (newh < screen->vpSize ().width ()) { int vpX; /* x index of a window's vp */ vpX = w->serverX () / screen->width (); if (w->serverX () < 0) vpX -= 1; vpX += screen->vp ().x (); /* Convert relative to absolute vp index */ /* Move windows too far right to left */ if (vpX >= newh) moveX = ((newh - 1) - vpX) * screen->width (); } if (newv < screen->vpSize ().height ()) { int vpY; /* y index of a window's vp */ vpY = w->serverY () / screen->height (); if (w->serverY () < 0) vpY -= 1; vpY += screen->vp ().y (); /* Convert relative to absolute vp index */ /* Move windows too far right to left */ if (vpY >= newv) moveY = ((newv - 1) - vpY) * screen->height (); } if (moveX != 0 || moveY != 0) { unsigned int valueMask = CWX | CWY; XWindowChanges xwc; xwc.x = w->serverGeometry ().x () + moveX; xwc.y = w->serverGeometry ().y () + moveY; w->configureXWindow (valueMask, &xwc); } } } viewPort.vpSize.setWidth (newh); viewPort.vpSize.setHeight (newv); setDesktopHints (); } void PrivateScreen::updateOutputDevices (CoreOptions& coreOptions) { outputDevices.updateOutputDevices(coreOptions, screen); windowManager.clearFullscreenHints(); screen->updateWorkarea (); screen->outputChangeNotify (); } void PrivateScreen::detectOutputDevices (CoreOptions& coreOptions) { if (coreOptions.optionGetDetectOutputs ()) { CompString name; CompOption::Value value; if (!screenInfo.empty ()) { CompOption::Value::Vector l; foreach (XineramaScreenInfo xi, screenInfo) { l.push_back (compPrintf ("%dx%d+%d+%d", xi.width, xi.height, xi.x_org, xi.y_org)); } value.set (CompOption::TypeString, l); } else { CompOption::Value::Vector l; l.push_back (compPrintf ("%dx%d+%d+%d", screen->width (), screen->height (), 0, 0)); value.set (CompOption::TypeString, l); } coreOptions.getOptions()[CoreOptions::DetectOutputs].value ().set (false); screen->setOptionForPlugin ("core", "outputs", value); coreOptions.getOptions()[CoreOptions::DetectOutputs].value ().set (true); } else { updateOutputDevices (coreOptions); } } void cps::StartupSequenceImpl::updateStartupFeedback () { if (priv->initialized) { if (!emptySequence()) XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->cursorCache (busyCursorName)); else XIDefineCursor (priv->dpy, priv->clientPointerDeviceId, priv->rootWindow(), priv->cursorCache (normalCursorName)); } } static const unsigned int STARTUP_TIMEOUT_DELAY = 15000; bool cps::StartupSequence::handleStartupSequenceTimeout () { struct timeval now, active; double elapsed; gettimeofday (&now, NULL); foreach (CompStartupSequence *s, startupSequences) { sn_startup_sequence_get_last_active_time (s->sequence, &active.tv_sec, &active.tv_usec); elapsed = ((((double) now.tv_sec - active.tv_sec) * 1000000.0 + (now.tv_usec - active.tv_usec))) / 1000.0; if (elapsed > STARTUP_TIMEOUT_DELAY) sn_startup_sequence_complete (s->sequence); } return true; } void cps::StartupSequence::addSequence (SnStartupSequence *sequence, CompPoint const& vp) { CompStartupSequence *s; s = new CompStartupSequence (); if (!s) return; sn_startup_sequence_ref (sequence); s->sequence = sequence; s->viewportX = vp.x (); s->viewportY = vp.y (); startupSequences.push_front (s); if (!startupSequenceTimer.active ()) startupSequenceTimer.start (); updateStartupFeedback (); } void cps::StartupSequence::removeSequence (SnStartupSequence *sequence) { CompStartupSequence *s = NULL; std::list::iterator it = startupSequences.begin (); for (; it != startupSequences.end (); ++it) { if ((*it)->sequence == sequence) { s = (*it); break; } } if (!s) return; sn_startup_sequence_unref (sequence); startupSequences.erase (it); delete s; if (startupSequences.empty () && startupSequenceTimer.active ()) startupSequenceTimer.stop (); updateStartupFeedback (); } void cps::StartupSequence::removeAllSequences () { foreach (CompStartupSequence *s, startupSequences) { sn_startup_sequence_unref (s->sequence); delete s; } startupSequences.clear (); if (startupSequenceTimer.active ()) startupSequenceTimer.stop (); updateStartupFeedback (); } void PrivateScreen::compScreenSnEvent (SnMonitorEvent *event, void *userData) { PrivateScreen *self = (PrivateScreen *) userData; SnStartupSequence *sequence; sequence = sn_monitor_event_get_startup_sequence (event); switch (sn_monitor_event_get_type (event)) { case SN_MONITOR_EVENT_INITIATED: self->startupSequence.addSequence (sequence, self->viewPort.vp); break; case SN_MONITOR_EVENT_COMPLETED: self->startupSequence.removeSequence (sequence); break; case SN_MONITOR_EVENT_CHANGED: case SN_MONITOR_EVENT_CANCELED: break; } } void PrivateScreen::updateScreenEdges () { struct screenEdgeGeometry { int xw, x0; int yh, y0; int ww, w0; int hh, h0; } geometry[SCREEN_EDGE_NUM] = { { 0, -1, 0, 2, 0, 2, 1, -4 }, /* left */ { 1, -1, 0, 2, 0, 2, 1, -4 }, /* right */ { 0, 2, 0, -1, 1, -4, 0, 2 }, /* top */ { 0, 2, 1, -1, 1, -4, 0, 2 }, /* bottom */ { 0, -1, 0, -1, 0, 2, 0, 2 }, /* top-left */ { 1, -1, 0, -1, 0, 2, 0, 2 }, /* top-right */ { 0, -1, 1, -1, 0, 2, 0, 2 }, /* bottom-left */ { 1, -1, 1, -1, 0, 2, 0, 2 } /* bottom-right */ }; for (int i = 0; i < SCREEN_EDGE_NUM; i++) { if (screenEdge[i].id) XMoveResizeWindow (dpy, screenEdge[i].id, geometry[i].xw * screen->width () + geometry[i].x0, geometry[i].yh * screen->height () + geometry[i].y0, geometry[i].ww * screen->width () + geometry[i].w0, geometry[i].hh * screen->height () + geometry[i].h0); } } void PrivateScreen::reshape (int w, int h) { updateScreenInfo (); region = CompRegion (0, 0, w, h); screen->setWidth (w); screen->setHeight (h); fullscreenOutput.setId ("fullscreen", ~0); fullscreenOutput.setGeometry (0, 0, w, h); updateScreenEdges (); } void PrivateScreen::configure (XConfigureEvent *ce) { if (attrib.width != ce->width || attrib.height != ce->height) { attrib.width = ce->width; attrib.height = ce->height; } reshape (ce->width, ce->height); detectOutputDevices (*this); updateOutputDevices (*this); } void cps::EventManager::setSupportingWmCheck (Display* dpy, Window root) { XChangeProperty (dpy, grabWindow, Atoms::supportingWmCheck, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &grabWindow, 1); XChangeProperty (dpy, grabWindow, Atoms::wmName, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) PACKAGE, strlen (PACKAGE)); XChangeProperty (dpy, grabWindow, Atoms::winState, XA_ATOM, 32, PropModeReplace, (unsigned char *) &Atoms::winStateSkipTaskbar, 1); XChangeProperty (dpy, grabWindow, Atoms::winState, XA_ATOM, 32, PropModeAppend, (unsigned char *) &Atoms::winStateSkipPager, 1); XChangeProperty (dpy, grabWindow, Atoms::winState, XA_ATOM, 32, PropModeAppend, (unsigned char *) &Atoms::winStateHidden, 1); XChangeProperty (dpy, root, Atoms::supportingWmCheck, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &grabWindow, 1); } void cps::EventManager::createGrabWindow (Display* dpy, Window root, XSetWindowAttributes* attrib) { grabWindow = XCreateWindow (dpy, root, -100, -100, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect | CWEventMask, attrib); XMapWindow (dpy, grabWindow); } void CompScreenImpl::updateSupportedWmHints () { std::vector atoms; addSupportedAtoms (atoms); XChangeProperty (dpy (), root (), Atoms::supported, XA_ATOM, 32, PropModeReplace, (const unsigned char *) &atoms.at (0), atoms.size ()); } void CompScreen::addSupportedAtoms (std::vector &atoms) { WRAPABLE_HND_FUNCTN (addSupportedAtoms, atoms); _addSupportedAtoms (atoms); } void CompScreenImpl::_addSupportedAtoms (std::vector &atoms) { atoms.push_back (Atoms::supported); atoms.push_back (Atoms::supportingWmCheck); atoms.push_back (Atoms::utf8String); atoms.push_back (Atoms::clientList); atoms.push_back (Atoms::clientListStacking); atoms.push_back (Atoms::winActive); atoms.push_back (Atoms::desktopViewport); atoms.push_back (Atoms::desktopGeometry); atoms.push_back (Atoms::currentDesktop); atoms.push_back (Atoms::numberOfDesktops); atoms.push_back (Atoms::showingDesktop); atoms.push_back (Atoms::workarea); atoms.push_back (Atoms::wmName); /* atoms.push_back (Atoms::wmVisibleName); */ atoms.push_back (Atoms::wmStrut); atoms.push_back (Atoms::wmStrutPartial); /* atoms.push_back (Atoms::wmPid); */ atoms.push_back (Atoms::wmUserTime); atoms.push_back (Atoms::frameExtents); atoms.push_back (Atoms::frameWindow); atoms.push_back (Atoms::winState); atoms.push_back (Atoms::winStateModal); atoms.push_back (Atoms::winStateSticky); atoms.push_back (Atoms::winStateMaximizedVert); atoms.push_back (Atoms::winStateMaximizedHorz); atoms.push_back (Atoms::winStateShaded); atoms.push_back (Atoms::winStateSkipTaskbar); atoms.push_back (Atoms::winStateSkipPager); atoms.push_back (Atoms::winStateHidden); atoms.push_back (Atoms::winStateFullscreen); atoms.push_back (Atoms::winStateAbove); atoms.push_back (Atoms::winStateBelow); atoms.push_back (Atoms::winStateDemandsAttention); atoms.push_back (Atoms::winStateFocused); atoms.push_back (Atoms::winOpacity); atoms.push_back (Atoms::winBrightness); /* FIXME */ #if 0 if (canDoSaturated) { atoms.push_back (Atoms::winSaturation); atoms.push_back (Atoms::winStateDisplayModal); } #endif atoms.push_back (Atoms::wmAllowedActions); atoms.push_back (Atoms::winActionMove); atoms.push_back (Atoms::winActionResize); atoms.push_back (Atoms::winActionStick); atoms.push_back (Atoms::winActionMinimize); atoms.push_back (Atoms::winActionMaximizeHorz); atoms.push_back (Atoms::winActionMaximizeVert); atoms.push_back (Atoms::winActionFullscreen); atoms.push_back (Atoms::winActionClose); atoms.push_back (Atoms::winActionShade); atoms.push_back (Atoms::winActionChangeDesktop); atoms.push_back (Atoms::winActionAbove); atoms.push_back (Atoms::winActionBelow); atoms.push_back (Atoms::winType); atoms.push_back (Atoms::winTypeDesktop); atoms.push_back (Atoms::winTypeDock); atoms.push_back (Atoms::winTypeToolbar); atoms.push_back (Atoms::winTypeMenu); atoms.push_back (Atoms::winTypeSplash); atoms.push_back (Atoms::winTypeDialog); atoms.push_back (Atoms::winTypeUtil); atoms.push_back (Atoms::winTypeNormal); atoms.push_back (Atoms::wmDeleteWindow); atoms.push_back (Atoms::wmPing); atoms.push_back (Atoms::wmMoveResize); atoms.push_back (Atoms::moveResizeWindow); atoms.push_back (Atoms::restackWindow); atoms.push_back (Atoms::wmFullscreenMonitors); } void PrivateScreen::getDesktopHints (unsigned int showingDesktopMask) { unsigned long data[2]; Atom actual; int result, format; unsigned long n, left; unsigned char *propData; if (useDesktopHints) { result = XGetWindowProperty (dpy, rootWindow(), Atoms::numberOfDesktops, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n) { memcpy (data, propData, sizeof (unsigned long)); if (data[0] > 0 && data[0] < 0xffffffff) nDesktop = data[0]; } XFree (propData); } result = XGetWindowProperty (dpy, rootWindow(), Atoms::desktopViewport, 0L, 2L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n == 2) { memcpy (data, propData, sizeof (unsigned long) * 2); if (data[0] / (unsigned int) screen->width () < (unsigned int) viewPort.vpSize.width () - 1) viewPort.vp.setX (data[0] / screen->width ()); if (data[1] / (unsigned int) screen->height () < (unsigned int) viewPort.vpSize.height () - 1) viewPort.vp.setY (data[1] / screen->height ()); } XFree (propData); } result = XGetWindowProperty (dpy, rootWindow(), Atoms::currentDesktop, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n) { memcpy (data, propData, sizeof (unsigned long)); if (data[0] < nDesktop) currentDesktop = data[0]; } XFree (propData); } } result = XGetWindowProperty (dpy, rootWindow(), Atoms::showingDesktop, 0L, 1L, false, XA_CARDINAL, &actual, &format, &n, &left, &propData); if (result == Success && propData) { if (n) { memcpy (data, propData, sizeof (unsigned long)); if (data[0]) screen->enterShowDesktopMode (); } XFree (propData); } data[0] = currentDesktop; XChangeProperty (dpy, rootWindow(), Atoms::currentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 1); data[0] = showingDesktopMask ? true : false; XChangeProperty (dpy, rootWindow(), Atoms::showingDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 1); } void CompScreen::enterShowDesktopMode () { WRAPABLE_HND_FUNCTN (enterShowDesktopMode) _enterShowDesktopMode (); } unsigned int CompScreenImpl::showingDesktopMask() const { return showingDesktopMask_; } bool CompScreenImpl::grabsEmpty() const { return privateScreen.eventManager.grabsEmpty(); } void CompScreenImpl::_enterShowDesktopMode () { unsigned long data = 1; int count = 0; bool st = privateScreen.optionGetHideSkipTaskbarWindows (); showingDesktopMask_ = ~(CompWindowTypeDesktopMask | CompWindowTypeDockMask); for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if ((showingDesktopMask_ & w->wmType ()) && (!(w->state () & CompWindowStateSkipTaskbarMask) || st)) { if (!w->inShowDesktopMode () && !w->grabbed () && w->managed () && w->focus ()) { w->setShowDesktopMode (true); w->windowNotify (CompWindowNotifyEnterShowDesktopMode); w->priv->hide (); } } if (w->inShowDesktopMode ()) count++; } if (!count) { showingDesktopMask_ = 0; data = 0; } XChangeProperty (privateScreen.dpy, privateScreen.rootWindow(), Atoms::showingDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } void CompScreen::leaveShowDesktopMode (CompWindow *window) { WRAPABLE_HND_FUNCTN (leaveShowDesktopMode, window) _leaveShowDesktopMode (window); } void CompScreenImpl::_leaveShowDesktopMode (CompWindow *window) { unsigned long data = 0; if (window) { if (!window->inShowDesktopMode ()) return; window->setShowDesktopMode (false); window->windowNotify (CompWindowNotifyLeaveShowDesktopMode); window->priv->show (); /* return if some other window is still in show desktop mode */ for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (w->inShowDesktopMode ()) return; } showingDesktopMask_ = 0; } else { showingDesktopMask_ = 0; for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (!w->inShowDesktopMode ()) continue; w->setShowDesktopMode (false); w->windowNotify (CompWindowNotifyLeaveShowDesktopMode); w->priv->show (); } /* focus default window - most likely this will be the window which had focus before entering showdesktop mode */ focusDefaultWindow (); } XChangeProperty (privateScreen.dpy, privateScreen.rootWindow(), Atoms::showingDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } void CompScreenImpl::forEachWindow (CompWindow::ForEach proc) { windowManager.forEachWindow(proc); } void CompScreenImpl::focusDefaultWindow () { CompWindow *w; CompWindow *focus = NULL; if (!privateScreen.optionGetClickToFocus ()) { w = findTopLevelWindow (below); if (w && w->focus ()) { if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) focus = w; } else { bool status; Window rootReturn, childReturn; int dummyInt; unsigned int dummyUInt; /* huh, we didn't find d->below ... perhaps it's out of date; try grabbing it through the server */ status = XQueryPointer (dpy (), privateScreen.rootWindow(), &rootReturn, &childReturn, &dummyInt, &dummyInt, &dummyInt, &dummyInt, &dummyUInt); if (status && rootReturn == privateScreen.rootWindow()) { w = findTopLevelWindow (childReturn); if (w && w->focus ()) { if (!(w->type () & (CompWindowTypeDesktopMask | CompWindowTypeDockMask))) focus = w; } } } } if (!focus) { /* Traverse down the stack */ for (cps::WindowManager::reverse_iterator rit = windowManager.rbegin(); rit != windowManager.rend(); ++rit) { w = (*rit); if (w->type () & CompWindowTypeDockMask) continue; if (w->focus ()) { if (focus) { if (w->type () & (CompWindowTypeNormalMask | CompWindowTypeDialogMask | CompWindowTypeModalDialogMask)) { if (PrivateWindow::compareWindowActiveness (focus, w) < 0) focus = w; } } else { focus = w; } } } } if (focus) { if (focus->id () != privateScreen.orphanData.activeWindow) focus->moveInputFocusTo (); } else { XSetInputFocus (privateScreen.dpy, privateScreen.rootWindow(), RevertToPointerRoot, CurrentTime); } } CompWindow * CompScreenImpl::findWindow (Window id) { return windowManager.findWindow (id); } CompWindow* cps::WindowManager::findWindow (Window id) const { if (lastFoundWindow && lastFoundWindow->id () == id) { return lastFoundWindow; } else { CompWindow::Map::const_iterator it = windowsMap.find (id); if (it != windowsMap.end ()) return (lastFoundWindow = it->second); } return 0; } CompWindow * CompScreenImpl::findTopLevelWindow (Window id, bool override_redirect) { CompWindow *w; w = findWindow (id); if (w) { if (w->overrideRedirect () && !override_redirect) return NULL; else return w; } for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); if (w->priv->serverFrame == id) { if (w->overrideRedirect () && !override_redirect) return NULL; else return w; } } return NULL; } void CompScreenImpl::insertWindow (CompWindow *w, Window aboveId) { windowManager.insertWindow (w, aboveId); } void cps::WindowManager::insertWindow (CompWindow* w, Window aboveId) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->windowsChanged (true); invalidateServerWindows(); w->prev = NULL; w->next = NULL; if (!aboveId || windows.empty ()) { if (!windows.empty ()) { windows.front ()->prev = w; w->next = windows.front (); } windows.push_front (w); addWindowToMap(w); return; } CompWindowList::iterator it = windows.begin (); while (it != windows.end ()) { if ((*it)->id () == aboveId || ((*it)->priv->frame && (*it)->priv->frame == aboveId)) { break; } ++it; } if (it == windows.end ()) { compLogMessage ("core", CompLogLevelDebug, "could not insert 0x%x above 0x%x", (unsigned int) w->priv->serverId, aboveId); #ifdef DEBUG abort (); #endif return; } w->next = (*it)->next; w->prev = (*it); (*it)->next = w; if (w->next) { w->next->prev = w; } windows.insert (++it, w); addWindowToMap(w); } void CompScreenImpl::insertServerWindow (CompWindow *w, Window aboveId) { windowManager.insertServerWindow(w, aboveId); } void cps::WindowManager::insertServerWindow(CompWindow* w, Window aboveId) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->serverWindowsChanged (true); w->serverPrev = NULL; w->serverNext = NULL; if (!aboveId || serverWindows.empty ()) { if (!serverWindows.empty ()) { serverWindows.front ()->serverPrev = w; w->serverNext = serverWindows.front (); } serverWindows.push_front (w); return; } CompWindowList::iterator it = serverWindows.begin (); while (it != serverWindows.end ()) { if ((*it)->priv->serverId == aboveId || ((*it)->priv->serverFrame && (*it)->priv->serverFrame == aboveId)) { break; } ++it; } if (it == serverWindows.end ()) { compLogMessage ("core", CompLogLevelWarn, "could not insert 0x%x above 0x%x", (unsigned int) w->priv->serverId, aboveId); #ifdef DEBUG abort (); #endif return; } w->serverNext = (*it)->serverNext; w->serverPrev = (*it); (*it)->serverNext = w; if (w->serverNext) { w->serverNext->serverPrev = w; } serverWindows.insert (++it, w); } void cps::WindowManager::eraseWindowFromMap (Window id) { if (id != 1) windowsMap.erase (id); } void CompScreenImpl::unhookWindow (CompWindow *w) { windowManager.unhookWindow (w); } void cps::WindowManager::unhookWindow(CompWindow* w) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->windowsChanged (true); CompWindowList::iterator it = std::find (windows.begin(), windows.end(), w); if (it == windows.end()) { compLogMessage ("core", CompLogLevelWarn, "a broken plugin tried to remove a window twice, we won't allow that!"); return; } windows.erase (it); eraseWindowFromMap (w->id ()); if (w->next) w->next->prev = w->prev; if (w->prev) w->prev->next = w->next; w->next = NULL; w->prev = NULL; removeFromFindWindowCache(w); } void CompScreenImpl::unhookServerWindow (CompWindow *w) { windowManager.unhookServerWindow (w); } void cps::WindowManager::unhookServerWindow (CompWindow *w) { StackDebugger *dbg = StackDebugger::Default (); if (dbg) dbg->serverWindowsChanged (true); CompWindowList::iterator it = std::find (serverWindows.begin (), serverWindows.end (), w); if (it == serverWindows.end ()) { compLogMessage ("core", CompLogLevelWarn, "a broken plugin tried to remove a window twice, we won't allow that!"); return; } serverWindows.erase (it); if (w->serverNext) w->serverNext->serverPrev = w->serverPrev; if (w->serverPrev) w->serverPrev->serverNext = w->serverNext; w->serverNext = NULL; w->serverPrev = NULL; } Cursor CompScreenImpl::normalCursor () { return privateScreen.cursorCache (normalCursorName); } Cursor CompScreenImpl::invisibleCursor () { return privateScreen.invisibleCursor; } Cursor CompScreenImpl::cursorCache (unsigned int cursorName) { return privateScreen.cursorCache (cursorName); } #define POINTER_GRAB_MASK (ButtonReleaseMask | \ ButtonPressMask | \ PointerMotionMask) CompScreen::GrabHandle PrivateScreen::pushGrabGeneric (cps::GrabType type, Cursor cursor, const char *name) { int status = GrabSuccess; if (eventManager.grabsEmpty ()) { if (type & cps::GrabType::POINTER) { status = XGrabPointer (dpy, eventManager.getGrabWindow (), true, POINTER_GRAB_MASK, GrabModeAsync, GrabModeAsync, root, cursor, CurrentTime); } if (status == GrabSuccess) { if (type & cps::GrabType::KEYBOARD) { status = XGrabKeyboard (dpy, eventManager.getGrabWindow (), true, GrabModeAsync, GrabModeAsync, CurrentTime); if (status != GrabSuccess) { if (type & cps::GrabType::POINTER) XUngrabPointer (dpy, CurrentTime); return NULL; } } } else return NULL; } else { if (type & cps::GrabType::POINTER) { if (eventManager.topGrab (cps::GrabType::POINTER)) { XChangeActivePointerGrab (dpy, POINTER_GRAB_MASK, cursor, CurrentTime); } else { status = XGrabPointer (dpy, eventManager.getGrabWindow (), true, POINTER_GRAB_MASK, GrabModeAsync, GrabModeAsync, root, cursor, CurrentTime); if (status != GrabSuccess) return NULL; } } if ((type & cps::GrabType::KEYBOARD) && !eventManager.topGrab (cps::GrabType::KEYBOARD)) { status = XGrabKeyboard (dpy, eventManager.getGrabWindow (), true, GrabModeAsync, GrabModeAsync, CurrentTime); if (status != GrabSuccess) { if (type & cps::GrabType::POINTER) { if (cps::Grab *lastPtrGrab = eventManager.topGrab (cps::GrabType::POINTER)) { XChangeActivePointerGrab (dpy, POINTER_GRAB_MASK, lastPtrGrab->cursor, CurrentTime); } else { XUngrabPointer (dpy, CurrentTime); } } return NULL; } } } cps::Grab *grab = new cps::Grab (type, cursor, name); eventManager.grabsPush (grab); return grab; } CompScreenImpl::GrabHandle CompScreenImpl::pushGrab (Cursor cursor, const char *name) { return privateScreen.pushGrabGeneric(cps::GrabType::ALL, cursor, name); } CompScreenImpl::GrabHandle CompScreenImpl::pushPointerGrab (Cursor cursor, const char *name) { return privateScreen.pushGrabGeneric(cps::GrabType::POINTER, cursor, name); } CompScreenImpl::GrabHandle CompScreenImpl::pushKeyboardGrab (const char *name) { return privateScreen.pushGrabGeneric(cps::GrabType::KEYBOARD, XC_X_cursor, name); } void CompScreenImpl::updateGrab (CompScreen::GrabHandle handle, Cursor cursor) { if (!handle || !(handle->type & cps::GrabType::POINTER)) return; if (privateScreen.eventManager.topGrab (cps::GrabType::POINTER) == handle) { XChangeActivePointerGrab (privateScreen.dpy, POINTER_GRAB_MASK, cursor, CurrentTime); } handle->cursor = cursor; } void CompScreenImpl::removeGrab (CompScreen::GrabHandle handle, CompPoint *restorePointer) { if (!handle) return; cps::GrabType removedType = handle->type; privateScreen.eventManager.grabsRemove(handle); if (!privateScreen.eventManager.grabsEmpty ()) { if (removedType & cps::GrabType::POINTER) { if (CompScreen::GrabHandle topPtrGrab = privateScreen.eventManager.topGrab (cps::GrabType::POINTER)) { XChangeActivePointerGrab (privateScreen.dpy, POINTER_GRAB_MASK, topPtrGrab->cursor, CurrentTime); } else { XUngrabPointer (privateScreen.dpy, CurrentTime); } } if (removedType & cps::GrabType::KEYBOARD) { if (!privateScreen.eventManager.topGrab (cps::GrabType::KEYBOARD)) XUngrabKeyboard (privateScreen.dpy, CurrentTime); } } else { if (restorePointer) warpPointer (restorePointer->x () - pointerX, restorePointer->y () - pointerY); if (removedType & cps::GrabType::POINTER) XUngrabPointer (privateScreen.dpy, CurrentTime); if (removedType & cps::GrabType::KEYBOARD) XUngrabKeyboard (privateScreen.dpy, CurrentTime); } } void cps::GrabList::grabsRemove(Grab* handle) { GrabIterator it = std::find (grabsBegin (), grabsEnd (), handle); if (it != grabsEnd ()) { grabs.erase (it); delete (handle); } } /* otherScreenGrabExist takes a series of strings terminated by a NULL. It returns true if a grab exists but it is NOT held by one of the plugins listed, returns false otherwise. */ bool CompScreenImpl::otherGrabExist (const char *first, ...) { va_list ap; const char *name; std::list::iterator it; for (it = privateScreen.eventManager.grabsBegin (); it != privateScreen.eventManager.grabsEnd (); ++it) { va_start (ap, first); name = first; while (name) { if (strcmp (name, (*it)->name) == 0) break; name = va_arg (ap, const char *); } va_end (ap); if (!name) return true; } return false; } bool CompScreenImpl::grabExist (const char *grab) { return privateScreen.eventManager.grabExist (grab); } bool cps::GrabList::grabExist (const char *grab) { foreach (cps::Grab* g, grabs) { if (strcmp (g->name, grab) == 0) return true; } return false; } bool CompScreenImpl::grabbed () { return privateScreen.eventManager.isGrabbed(); } void cps::GrabManager::grabUngrabOneKey (unsigned int modifiers, int keycode, bool grab) { if (grab) { /* * Always grab the keyboard Sync-ronously. This is so that we can * choose to ReplayKeyboard in alwaysHandleEvent if need be. */ XGrabKey (screen->dpy(), keycode, modifiers, screen->root(), true, GrabModeAsync, GrabModeSync); } else { XUngrabKey (screen->dpy(), keycode, modifiers, screen->root()); } } bool cps::GrabManager::grabUngrabKeys (unsigned int modifiers, int keycode, bool grab) { int mod, k; unsigned int ignore; unsigned int modifierForKeycode; CompScreen::checkForError (screen->dpy()); for (ignore = 0; ignore <= modHandler->ignoredModMask (); ignore++) { if (ignore & ~modHandler->ignoredModMask ()) continue; if (keycode == 0) modifierForKeycode = 0; else modifierForKeycode = modHandler->keycodeToModifiers (keycode); if (keycode != 0 && modifierForKeycode == 0) { grabUngrabOneKey (modifiers | ignore, keycode, grab); } else { for (mod = 0; mod < 8; mod++) { if (modifiers & (1 << mod)) { for (k = mod * modHandler->modMap ()->max_keypermod; k < (mod + 1) * modHandler->modMap ()->max_keypermod; k++) { if (modHandler->modMap ()->modifiermap[k]) { grabUngrabOneKey ((modifiers & ~(1 << mod)) | modifierForKeycode | ignore, modHandler->modMap ()->modifiermap[k], grab); } } } else if (modifierForKeycode == (unsigned int) (1 << mod)) { grabUngrabOneKey (modifiers | ignore, keycode, grab); grabUngrabOneKey (modifiers | modifierForKeycode | ignore, keycode, grab); } } /* * keycode == 0 or modifierForKeycode != 0, so this is a * modifier-only keybinding. * Until now I have been trying to: * grabUngrabOneKey (modifiers | ignore, AnyKey, grab); * which does not seem to work at all. * However, binding to each keycode individually does work. * This is so that we can detect taps on individual modifier * keys, and know to cancel the tap if +k is pressed. */ int minCode, maxCode; XDisplayKeycodes (screen->dpy(), &minCode, &maxCode); if ((currentState & CompAction::StateIgnoreTap)) { KeyCode code_p = XKeysymToKeycode(screen->dpy(), XK_p); for (k = minCode; k <= maxCode; k++) if (k != code_p) grabUngrabOneKey (modifiers | ignore, k, grab); } else { for (k = minCode; k <= maxCode; k++) grabUngrabOneKey (modifiers | modifierForKeycode | ignore, k, grab); } } if (CompScreen::checkForError (screen->dpy())) return false; } return true; } bool cps::GrabManager::addPassiveKeyGrab (CompAction::KeyBinding &key) { KeyGrab newKeyGrab; unsigned int mask; std::list::iterator it; mask = modHandler->virtualToRealModMask (key.modifiers ()); for (it = keyGrabs.begin (); it != keyGrabs.end (); ++it) { if (key.keycode () == (*it).keycode && mask == (*it).modifiers) { (*it).count++; return true; } } if (!(mask & CompNoMask)) { if (!grabUngrabKeys (mask, key.keycode (), true)) return false; } newKeyGrab.keycode = key.keycode (); newKeyGrab.modifiers = mask; newKeyGrab.count = 1; keyGrabs.push_back (newKeyGrab); return true; } void cps::GrabManager::removePassiveKeyGrab (CompAction::KeyBinding &key) { unsigned int mask; std::list::iterator it; mask = modHandler->virtualToRealModMask (key.modifiers ()); for (it = keyGrabs.begin (); it != keyGrabs.end (); ++it) { if (key.keycode () == (*it).keycode && mask == (*it).modifiers) { (*it).count--; if ((*it).count) return; it = keyGrabs.erase (it); if (!(mask & CompNoMask)) grabUngrabKeys (mask, key.keycode (), false); } } /* * Removing modifier-only grabs is tricky. Because it also removes grabs * for modifier+all_other_keys. See XDisplayKeycodes above to find out why. * So we need to refresh all grabs... */ if (!(mask & CompNoMask) && (key.keycode () == 0 || modHandler->keycodeToModifiers (key.keycode ()) != 0)) updatePassiveKeyGrabs (); } void cps::GrabManager::updatePassiveKeyGrabs () { std::list::iterator it; XUngrabKey (screen->dpy(), AnyKey, AnyModifier, screen->root()); for (it = keyGrabs.begin (); it != keyGrabs.end (); ++it) { if (!((*it).modifiers & CompNoMask)) { grabUngrabKeys ((*it).modifiers, (*it).keycode, true); } } } bool cps::GrabManager::addPassiveButtonGrab (CompAction::ButtonBinding &button) { ButtonGrab newButtonGrab; std::list::iterator it; for (it = buttonGrabs.begin (); it != buttonGrabs.end (); ++it) { if (button.button () == (*it).button && button.modifiers () == (*it).modifiers) { (*it).count++; return true; } } newButtonGrab.button = button.button (); newButtonGrab.modifiers = button.modifiers (); newButtonGrab.count = 1; buttonGrabs.push_back (newButtonGrab); foreach (CompWindow *w, screen->windows ()) w->priv->updatePassiveButtonGrabs (); return true; } void cps::GrabManager::updatePassiveButtonGrabs(Window serverFrame) { CompWindow *window = NULL; foreach (CompWindow *w, screen->windows ()) { if (w->frame () == serverFrame) { window = w; break; } } /* Grab only we have bindings on */ foreach (ButtonGrab &bind, buttonGrabs) { unsigned int mods = modHandler->virtualToRealModMask (bind.modifiers); if (mods & CompNoMask) continue; for (unsigned int ignore = 0; ignore <= modHandler->ignoredModMask (); ignore++) { if (ignore & ~modHandler->ignoredModMask ()) continue; /* Do not allow binding of vertical scrolling for windows other than the desktop * unless there is a modifier defined */ if (window && !(window->type () & CompWindowTypeDesktopMask) && (bind.button == Button4 || bind.button == Button5) && !mods) continue; XGrabButton (screen->dpy(), bind.button, mods | ignore, serverFrame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeSync, GrabModeAsync, None, None); } } } void cps::GrabManager::removePassiveButtonGrab (CompAction::ButtonBinding &button) { std::list::iterator it; for (it = buttonGrabs.begin (); it != buttonGrabs.end (); ++it) { if (button.button () == (*it).button && button.modifiers () == (*it).modifiers) { (*it).count--; if ((*it).count) return; it = buttonGrabs.erase (it); foreach (CompWindow *w, screen->windows ()) w->priv->updatePassiveButtonGrabs (); } } } void cps::GrabManager::setCurrentState (CompAction::State state) { currentState = state; } bool CompScreenImpl::addAction (CompAction *action) { assert (privateScreen.initialized); if (!privateScreen.initialized) return false; if (action->active ()) return false; grabManager.setCurrentState(action->state()); if (action->type () & CompAction::BindingTypeKey) { if (!grabManager.addPassiveKeyGrab (action->key ())) return false; } if (action->type () & CompAction::BindingTypeButton) { if (!grabManager.addPassiveButtonGrab (action->button ())) { if (action->type () & CompAction::BindingTypeKey) grabManager.removePassiveKeyGrab (action->key ()); return false; } } if (action->edgeMask ()) { for (int i = 0; i < SCREEN_EDGE_NUM; i++) if (action->edgeMask () & (1 << i)) privateScreen.enableEdge (i); } ca::setActionActiveState (*action, true); return true; } void CompScreenImpl::removeAction (CompAction *action) { if (!privateScreen.initialized || !action->active ()) return; grabManager.setCurrentState(action->state()); if (action->type () & CompAction::BindingTypeKey) grabManager.removePassiveKeyGrab (action->key ()); if (action->type () & CompAction::BindingTypeButton) grabManager.removePassiveButtonGrab (action->button ()); if (action->edgeMask ()) { for (int i = 0; i < SCREEN_EDGE_NUM; i++) if (action->edgeMask () & (1 << i)) privateScreen.disableEdge (i); } ca::setActionActiveState (*action, false); } void CompScreenImpl::updateWorkarea () { CompRect workArea; CompRegion allWorkArea = CompRegion (); bool workAreaChanged = false; privateScreen.outputDevices.computeWorkAreas( workArea, workAreaChanged, allWorkArea, windowManager.getWindows()); workArea = allWorkArea.boundingRect (); if (privateScreen.workArea != workArea) { workAreaChanged = true; privateScreen.workArea = workArea; privateScreen.setDesktopHints (); } if (workAreaChanged) { /* as work area changed, update all maximized windows on this screen to snap to the new work area */ windowManager.updateWindowSizes(); } } static bool isClientListWindow (CompWindow *w) { /* windows with client id less than 2 have been destroyed and only exists because some plugin keeps a reference to them. they should not be in client lists */ if (w->id () < 2) return false; if (w->overrideRedirect ()) return false; if (!w->isViewable ()) { if (!(w->state () & CompWindowStateHiddenMask)) return false; } return true; } static void countClientListWindow (CompWindow *w, int *n) { if (isClientListWindow (w)) { *n = *n + 1; } } static bool compareMappingOrder (const CompWindow *w1, const CompWindow *w2) { return w1->mapNum () < w2->mapNum (); } void cps::WindowManager::updateClientList (PrivateScreen& ps) { bool updateClientList = false; bool updateClientListStacking = false; int n = 0; screen->forEachWindow (boost::bind (countClientListWindow, _1, &n)); if (n == 0) { if ((unsigned int) n != clientList.size ()) { clientList.clear (); clientListStacking.clear (); clientIdList.clear (); clientIdListStacking.clear (); XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientList, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &ps.eventManager.getGrabWindow(), 1); XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientListStacking, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &ps.eventManager.getGrabWindow(), 1); } return; } if ((unsigned int) n != clientList.size ()) { clientIdList.resize (n); clientIdListStacking.resize (n); updateClientList = updateClientListStacking = true; } clientListStacking.clear (); for (iterator i = begin(); i != end(); ++i) { CompWindow* const w(*i); if (isClientListWindow (w)) clientListStacking.push_back (w); } /* clear clientList and copy clientListStacking into clientList */ clientList = clientListStacking; /* sort clientList in mapping order */ sort (clientList.begin (), clientList.end (), compareMappingOrder); /* make sure client id lists are up-to-date */ for (int i = 0; i < n; i++) { if (!updateClientList && clientIdList[i] != clientList[i]->id ()) { updateClientList = true; } clientIdList[i] = clientList[i]->id (); } for (int i = 0; i < n; i++) { if (!updateClientListStacking && clientIdListStacking[i] != clientListStacking[i]->id ()) { updateClientListStacking = true; } clientIdListStacking[i] = clientListStacking[i]->id (); } if (updateClientList) XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientList, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &clientIdList.at (0), n); if (updateClientListStacking) XChangeProperty (ps.dpy, ps.rootWindow(), Atoms::clientListStacking, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &clientIdListStacking.at (0), n); } const CompWindowVector & CompScreenImpl::clientList (bool stackingOrder) { return stackingOrder ? windowManager.getClientListStacking() : windowManager.getClientList(); } void CompScreenImpl::toolkitAction (Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2) { XEvent ev; ev.type = ClientMessage; ev.xclient.window = window; ev.xclient.message_type = Atoms::toolkitAction; ev.xclient.format = 32; ev.xclient.data.l[0] = toolkitAction; ev.xclient.data.l[1] = eventTime; ev.xclient.data.l[2] = data0; ev.xclient.data.l[3] = data1; ev.xclient.data.l[4] = data2; XUngrabPointer (privateScreen.dpy, CurrentTime); XUngrabKeyboard (privateScreen.dpy, CurrentTime); XSendEvent (privateScreen.dpy, privateScreen.rootWindow(), false, StructureNotifyMask, &ev); } void CompScreenImpl::runCommand (CompString command) { if (command.size () == 0) return; if (fork () == 0) { size_t pos; CompString env (privateScreen.displayString ()); setsid (); pos = env.find (':'); if (pos != CompString::npos) { size_t pointPos = env.find ('.', pos); if (pointPos != CompString::npos) { env.erase (pointPos); } else { unsigned int displayNum = atoi (env.substr (pos + 1).c_str ()); env.erase (pos); env.append (compPrintf (":%i", displayNum)); } } env.append (compPrintf (".%d", privateScreen.screenNum)); putenv (strdup (env.c_str ())); // parameter needs to be leaked! exit (execl ("/bin/sh", "/bin/sh", "-c", command.c_str (), NULL)); } } void CompScreenImpl::moveViewport (int tx, int ty, bool sync) { CompPoint pnt; tx = privateScreen.viewPort.vp.x () - tx; tx = compiz::core::screen::wraparound_mod (tx, privateScreen.viewPort.vpSize.width ()); tx -= privateScreen.viewPort.vp.x (); ty = privateScreen.viewPort.vp.y () - ty; ty = compiz::core::screen::wraparound_mod (ty, privateScreen.viewPort.vpSize.height ()); ty -= privateScreen.viewPort.vp.y (); if (!tx && !ty) return; privateScreen.viewPort.vp.setX (privateScreen.viewPort.vp.x () + tx); privateScreen.viewPort.vp.setY (privateScreen.viewPort.vp.y () + ty); tx *= -width (); ty *= -height (); for (cps::WindowManager::iterator i = windowManager.begin(); i != windowManager.end(); ++i) { CompWindow* const w(*i); unsigned int valueMask = CWX | CWY; XWindowChanges xwc= XWINDOWCHANGES_INIT; if (w->onAllViewports ()) continue; pnt = w->getMovementForOffset (CompPoint (tx, ty)); if (w->saveMask () & CWX) w->saveWc ().x += pnt.x (); if (w->saveMask () & CWY) w->saveWc ().y += pnt.y (); xwc.x = w->serverGeometry ().x () + pnt.x (); xwc.y = w->serverGeometry ().y () + pnt.y (); w->configureXWindow (valueMask, &xwc); } if (sync) { CompWindow *w; privateScreen.setDesktopHints (); setCurrentActiveWindowHistory (privateScreen.viewPort.vp.x (), privateScreen.viewPort.vp.y ()); w = findWindow (privateScreen.orphanData.activeWindow); if (w) { CompPoint dvp; dvp = w->defaultViewport (); /* add window to current history if it's default viewport is still the current one. */ if (privateScreen.viewPort.vp.x () == dvp.x () && privateScreen.viewPort.vp.y () == dvp.y ()) addToCurrentActiveWindowHistory (w->id ()); } } } CompGroup * cps::WindowManager::addGroup (Window id) { CompGroup *group = new CompGroup (); group->refCnt = 1; group->id = id; groups.push_back (group); return group; } void cps::WindowManager::removeGroup (CompGroup *group) { group->refCnt--; if (group->refCnt) return; std::list::iterator it = std::find (groups.begin (), groups.end (), group); if (it != groups.end ()) { groups.erase (it); } delete group; } CompGroup * cps::WindowManager::findGroup (Window id) { foreach (CompGroup *g, groups) if (g->id == id) return g; return NULL; } void cps::StartupSequence::applyStartupProperties (CompScreen* screen, CompWindow *window) { CompStartupSequence *s = NULL; const char *startupId = window->startupId (); if (!startupId) { CompWindow *leader; leader = screen->findWindow (window->clientLeader ()); if (leader) startupId = leader->startupId (); if (!startupId) return; } foreach (CompStartupSequence *ss, startupSequences) { const char *id; id = sn_startup_sequence_get_id (ss->sequence); if (strcmp (id, startupId) == 0) { s = ss; break; } } if (s) window->priv->applyStartupProperties (s); } void CompScreenImpl::sendWindowActivationRequest (Window id) { XEvent xev; xev.xclient.type = ClientMessage; xev.xclient.display = privateScreen.dpy; xev.xclient.format = 32; xev.xclient.message_type = Atoms::winActive; xev.xclient.window = id; xev.xclient.data.l[0] = ClientTypePager; xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (privateScreen.dpy, privateScreen.rootWindow(), false, SubstructureRedirectMask | SubstructureNotifyMask, &xev); } /* These functions do not guard against negative decrements * as they are unable to determine the source of the reference * and as such they should only be called by functions that * actually determine the source of what was referencing the * edge and can guard against multiple-references-per-owner */ void PrivateScreen::enableEdge (int edge) { screenEdge[edge].count++; if (screenEdge[edge].count == 1) XMapRaised (dpy, screenEdge[edge].id); } void PrivateScreen::disableEdge (int edge) { screenEdge[edge].count--; if (screenEdge[edge].count == 0) XUnmapWindow (dpy, screenEdge[edge].id); } CompWindow * cps::WindowManager::getTopWindow() const { /* return first window that has not been destroyed */ if (!windows.empty ()) return windows.back (); return NULL; } CompWindow * cps::WindowManager::getTopServerWindow () const { if (!serverWindows.empty ()) return serverWindows.back (); return NULL; } int CompScreenImpl::outputDeviceForPoint (const CompPoint &point) { return outputDeviceForPoint (point.x (), point.y ()); } int CompScreenImpl::outputDeviceForPoint (int x, int y) { CompWindow::Geometry geom (x, y, 1, 1, 0); return outputDeviceForGeometry (geom); } CompRect CompScreenImpl::getCurrentOutputExtents () { return privateScreen.outputDevices.getCurrentOutputDev (); } void PrivateScreen::setCurrentDesktop (unsigned int desktop) { if (desktop >= nDesktop || desktop == currentDesktop) return; currentDesktop = desktop; windowManager.showOrHideForDesktop(desktop); unsigned long data = desktop; XChangeProperty (dpy, rootWindow(), Atoms::currentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); } const CompRect& CompScreenImpl::getWorkareaForOutput (unsigned int outputNum) const { return privateScreen.outputDevices.getOutputDev (outputNum).workArea (); } void CompScreen::outputChangeNotify () { WRAPABLE_HND_FUNCTN (outputChangeNotify); _outputChangeNotify (); } void CompScreenImpl::_outputChangeNotify () { } void CompScreen::cursorChangeNotify (const CompString& theme, int size) { WRAPABLE_HND_FUNCTN (cursorChangeNotify, theme, size); _cursorChangeNotify (theme, size); } Cursor PrivateScreen::cursorCache (unsigned int cursorName) { if (cursorName >= XC_num_glyphs) return 0; if (cursors.size() > cursorName && cursors[cursorName]) return cursors[cursorName]; cursors.resize(std::max(cursorName + 1, cursors.size()), 0); cursors[cursorName] = XCreateFontCursor (dpy, cursorName); return cursors[cursorName]; } void PrivateScreen::updateCursors (const CompString& theme, int size) { if (size > 0) XcursorSetDefaultSize (dpy, size); if (!theme.empty()) XcursorSetTheme (dpy, theme.c_str()); for (auto it = begin (cursors); it != end (cursors); ++it) { if (*it) { XFreeCursor (dpy, *it); *it = XCreateFontCursor (dpy, it - begin (cursors)); } } XIDefineCursor (dpy, clientPointerDeviceId, root, cursorCache (normalCursorName)); startupSequence.updateStartupFeedback (); } void CompScreenImpl::_cursorChangeNotify (const CompString& theme, int size) { privateScreen.updateCursors (theme, size); } void CompScreen::averageColorChangeNotify (const unsigned short* color) { WRAPABLE_HND_FUNCTN (averageColorChangeNotify, color); _averageColorChangeNotify (color); } void CompScreenImpl::_averageColorChangeNotify (const unsigned short* color) { } /* Returns default viewport for some window geometry. If the window spans * more than one viewport the most appropriate viewport is returned. How the * most appropriate viewport is computed can be made optional if necessary. It * is currently computed as the viewport where the center of the window is * located. * * XXX: It is possible for this function to return a negative viewport, which * definitely feels wrong, however it seems that some plugins depend on this behaviour * so they need to be fixed first */ void compiz::private_screen::viewports::viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport, ViewportRetrievalInterface *viewports, const CompSize & screenSize) { CompRect rect (gm); int offset; const CompPoint &vp = viewports->getCurrentViewport (); const CompSize &vpSize = viewports->viewportDimensions (); rect.setWidth (gm.widthIncBorders ()); rect.setHeight (gm.heightIncBorders ()); offset = rect.centerX () < 0 ? -1 : 0; viewport.setX (vp.x () + ((rect.centerX () / screenSize.width ()) + offset) % vpSize.width ()); offset = rect.centerY () < 0 ? -1 : 0; viewport.setY (vp.y () + ((rect.centerY () / screenSize.height ()) + offset ) % vpSize.height ()); } void CompScreenImpl::viewportForGeometry (const CompWindow::Geometry& gm, CompPoint& viewport) { compiz::private_screen::viewports::viewportForGeometry (gm, viewport, &privateScreen.viewPort, *this); } int CompScreenImpl::outputDeviceForGeometry (const CompWindow::Geometry& gm) { return privateScreen.outputDevices.outputDeviceForGeometry (gm, privateScreen.optionGetOverlappingOutputs (), this); } CompIcon * CompScreenImpl::defaultIcon () const { return defaultIcon_; } bool CompScreenImpl::updateDefaultIcon () { CompString file = privateScreen.optionGetDefaultIcon (); CompString pname = "core/"; void *data; CompSize size; if (defaultIcon_) { delete defaultIcon_; defaultIcon_ = NULL; } if (!readImageFromFile (file, pname, size, data)) return false; defaultIcon_ = new CompIcon (size.width (), size.height ()); memcpy (defaultIcon_->data (), data, size.width () * size.height () * sizeof (CARD32)); free (data); return true; } void cps::History::setCurrentActiveWindowHistory (int x, int y) { int i, min = 0; for (i = 0; i < ACTIVE_WINDOW_HISTORY_NUM; i++) { if (history[i].x == x && history[i].y == y) { currentHistory_ = i; return; } } for (i = 1; i < ACTIVE_WINDOW_HISTORY_NUM; i++) if (history[i].activeNum < history[min].activeNum) min = i; currentHistory_ = min; history[min].activeNum = activeNum_; history[min].x = x; history[min].y = y; memset (history[min].id, 0, sizeof (history[min].id)); } void cps::History::addToCurrentActiveWindowHistory (Window id) { CompActiveWindowHistory *history = &this->history[currentHistory_]; Window tmp, next = id; /* walk and move history */ for (int i = 0; i < ACTIVE_WINDOW_HISTORY_SIZE; i++) { tmp = history->id[i]; history->id[i] = next; next = tmp; /* we're done when we find an old instance or an empty slot */ if (tmp == id || tmp == None) break; } history->activeNum = activeNum_; } void ScreenInterface::enterShowDesktopMode () WRAPABLE_DEF (enterShowDesktopMode) void ScreenInterface::leaveShowDesktopMode (CompWindow *window) WRAPABLE_DEF (leaveShowDesktopMode, window) void ScreenInterface::outputChangeNotify () WRAPABLE_DEF (outputChangeNotify) void ScreenInterface::addSupportedAtoms (std::vector& atoms) WRAPABLE_DEF (addSupportedAtoms, atoms) void ScreenInterface::cursorChangeNotify (const CompString& theme, int size) WRAPABLE_DEF (cursorChangeNotify, theme, size) void ScreenInterface::averageColorChangeNotify (const unsigned short *color) WRAPABLE_DEF (averageColorChangeNotify, color) Window CompScreenImpl::root () { return privateScreen.rootWindow(); } int CompScreenImpl::xkbEvent () { return privateScreen.getXkbEvent (); } void PrivateScreen::identifyEdgeWindow(Window id) { edgeWindow = 0; for (unsigned int i = 0; i < SCREEN_EDGE_NUM; i++) { if (id == screenEdge[i].id) { edgeWindow = 1 << i; break; } } } void CompScreenImpl::warpPointer (int dx, int dy) { XEvent event; pointerX += dx; pointerY += dy; if (pointerX >= width ()) pointerX = width () - 1; else if (pointerX < 0) pointerX = 0; if (pointerY >= height ()) pointerY = height () - 1; else if (pointerY < 0) pointerY = 0; XWarpPointer (privateScreen.dpy, None, privateScreen.rootWindow(), 0, 0, 0, 0, pointerX, pointerY); XSync (privateScreen.dpy, false); /* XWarpPointer will generate Leave, Enter and PointerMotion * events as if the user had instantaneously moved the cursor * from one position to another. Because most of this is * useless to process, we just throw out the events and update * the pointer position. However, we do need to process some * crossing events since they tell us which edge windows are * hovered. Note that we don't actually trigger the bindings * in the case where we warped from one edge window to * another. * * FIXME: Probably don't need to process *all* the crossing * events here ... maybe there is a way to check only the last * event in the output buffer without roundtripping a lot */ while (XCheckMaskEvent (privateScreen.dpy, LeaveWindowMask | EnterWindowMask | PointerMotionMask, &event)) { if (event.type == EnterNotify) { if (event.xcrossing.mode != NotifyGrab || event.xcrossing.mode != NotifyUngrab || event.xcrossing.mode != NotifyInferior) { privateScreen.identifyEdgeWindow(event.xcrossing.window); } } } if (!inHandleEvent) { lastPointerX = pointerX; lastPointerY = pointerY; } } CompWindowList & CompScreenImpl::windows () { return windowManager.getWindows(); } CompWindowList & CompScreenImpl::serverWindows () { return windowManager.getServerWindows(); } CompWindowList & CompScreenImpl::destroyedWindows () { return windowManager.getDestroyedWindows(); } Time CompScreenImpl::getCurrentTime () { return privateScreen.eventManager.getCurrentTime (privateScreen.dpy); } Time cps::EventManager::getCurrentTime (Display* dpy) const { XEvent event; XChangeProperty (dpy, grabWindow, XA_PRIMARY, XA_STRING, 8, PropModeAppend, NULL, 0); XWindowEvent (dpy, grabWindow, PropertyChangeMask, &event); return event.xproperty.time; } Window CompScreenImpl::selectionWindow () { return privateScreen.wmSnSelectionWindow; } int CompScreenImpl::screenNum () { return privateScreen.screenNum; } const CompPoint & CompScreenImpl::vp () const { return privateScreen.viewPort.vp; } const CompSize & CompScreenImpl::vpSize () const { return privateScreen.viewPort.vpSize; } int cps::DesktopWindowCount::desktopWindowCount () { return countAll; } int cps::DesktopWindowCount::opaqueDesktopWindowCount () { return countOpaque; } unsigned int cps::History::activeNum () const { return activeNum_; } CompOutput::vector & CompScreenImpl::outputDevs () { return privateScreen.outputDevices.getOutputDevs (); } CompOutput & CompScreenImpl::currentOutputDev () const { return const_cast(privateScreen).outputDevices.getCurrentOutputDev (); } const CompRect & CompScreenImpl::workArea () const { return privateScreen.workArea; } unsigned int CompScreenImpl::currentDesktop () { return privateScreen.currentDesktop; } unsigned int CompScreenImpl::nDesktop () { return privateScreen.nDesktop; } CompActiveWindowHistory* cps::History::currentHistory () { return history+currentHistory_; } bool CompScreenImpl::shouldSerializePlugins () { return privateScreen.optionGetDoSerialize (); } void cps::WindowManager::removeDestroyed () { while (pendingDestroys) { foreach (CompWindow *w, destroyedWindows) { if (w->destroyed ()) { delete w; break; } } pendingDestroys--; } } const CompRegion & CompScreenImpl::region () const { return privateScreen.getRegion (); } bool CompScreenImpl::hasOverlappingOutputs () { return privateScreen.outputDevices.hasOverlappingOutputs (); } CompOutput & CompScreenImpl::fullscreenOutput () { return privateScreen.fullscreenOutput; } XWindowAttributes CompScreenImpl::attrib () { return privateScreen.getAttrib (); } std::vector & CompScreenImpl::screenInfo () { return privateScreen.getScreenInfo (); } bool CompScreenImpl::createFailed () const { return !screenInitalized; } CompScreen::CompScreen (): PluginClassStorage (screenPluginClassIndices) { } CompScreenImpl::CompScreenImpl () : cps::XWindowInfo(privateScreen.dpy), below(), autoRaiseTimer_(), autoRaiseWindow_(0), defaultIcon_(0), grabManager (this), eventHandled (false), privateScreen(this, windowManager), showingDesktopMask_(0) { ValueHolder::SetDefault (&valueHolder); CompPrivate p; CompOption::Value::Vector vList; privateScreen.setPingTimerCallback( boost::bind (&CompScreenImpl::handlePingTimeout, this)); screenInitalized = true; CompPlugin* corePlugin = CompPlugin::load ("core"); if (!corePlugin) { compLogMessage ("core", CompLogLevelFatal, "Couldn't load core plugin"); screenInitalized = false; } if (!CompPlugin::push (corePlugin)) { compLogMessage ("core", CompLogLevelFatal, "Couldn't activate core plugin"); screenInitalized = false; } p.uval = CORE_ABIVERSION; storeValue ("core_ABI", p); vList.push_back ("core"); privateScreen.setPlugins (vList); } void PrivateScreen::setPlugins(CompOption::Value::Vector const& vList) { pluginManager.setPlugins(vList); } void PrivateScreen::initPlugins() { pluginManager.setDirtyPluginList (); pluginManager.updatePlugins (screen, optionGetActivePlugins()); } bool CompScreenImpl::init (const char *name) { privateScreen.eventManager.init(); if (privateScreen.initDisplay(name, *this, showingDesktopMask_)) { privateScreen.optionSetCloseWindowKeyInitiate (CompScreenImpl::closeWin); privateScreen.optionSetCloseWindowButtonInitiate (CompScreenImpl::closeWin); privateScreen.optionSetRaiseWindowKeyInitiate (CompScreenImpl::raiseWin); privateScreen.optionSetRaiseWindowButtonInitiate (CompScreenImpl::raiseWin); privateScreen.optionSetLowerWindowKeyInitiate (CompScreenImpl::lowerWin); privateScreen.optionSetLowerWindowButtonInitiate (CompScreenImpl::lowerWin); privateScreen.optionSetUnmaximizeWindowKeyInitiate (CompScreenImpl::unmaximizeWin); privateScreen.optionSetUnmaximizeOrMinimizeWindowKeyInitiate (CompScreenImpl::unmaximizeOrMinimizeWin); privateScreen.optionSetMinimizeWindowKeyInitiate (CompScreenImpl::minimizeWin); privateScreen.optionSetMinimizeWindowButtonInitiate (CompScreenImpl::minimizeWin); privateScreen.optionSetMaximizeWindowKeyInitiate (CompScreenImpl::maximizeWin); privateScreen.optionSetMaximizeWindowHorizontallyKeyInitiate ( CompScreenImpl::maximizeWinHorizontally); privateScreen.optionSetMaximizeWindowVerticallyKeyInitiate ( CompScreenImpl::maximizeWinVertically); privateScreen.optionSetWindowMenuKeyInitiate (CompScreenImpl::windowMenu); privateScreen.optionSetWindowMenuButtonInitiate (CompScreenImpl::windowMenu); privateScreen.optionSetShowDesktopKeyInitiate (CompScreenImpl::showDesktop); privateScreen.optionSetShowDesktopEdgeInitiate (CompScreenImpl::showDesktop); privateScreen.optionSetToggleWindowMaximizedKeyInitiate (CompScreenImpl::toggleWinMaximized); privateScreen.optionSetToggleWindowMaximizedButtonInitiate (CompScreenImpl::toggleWinMaximized); privateScreen.optionSetToggleWindowMaximizedHorizontallyKeyInitiate ( CompScreenImpl::toggleWinMaximizedHorizontally); privateScreen.optionSetToggleWindowMaximizedVerticallyKeyInitiate ( CompScreenImpl::toggleWinMaximizedVertically); privateScreen.optionSetToggleWindowShadedKeyInitiate (CompScreenImpl::shadeWin); privateScreen.initPlugins(); if (debugOutput) { StackDebugger::SetDefault ( new StackDebugger ( dpy (), root (), &privateScreen)); } return true; } return false; } void cps::EventManager::init () { ctx = Glib::MainContext::get_default (); mainloop = Glib::MainLoop::create (ctx, false); sighupSource = CompSignalSource::create (SIGHUP, boost::bind (&EventManager::handleSignal, this, _1)); sigintSource = CompSignalSource::create (SIGINT, boost::bind (&EventManager::handleSignal, this, _1)); sigtermSource = CompSignalSource::create (SIGTERM, boost::bind (&EventManager::handleSignal, this, _1)); } bool CompScreenImpl::displayInitialised() const { return privateScreen.initialized; } void CompScreenImpl::updatePassiveKeyGrabs () const { grabManager.updatePassiveKeyGrabs (); } void CompScreenImpl::applyStartupProperties (CompWindow *window) { privateScreen.startupSequence.applyStartupProperties (this, window); } void CompScreenImpl::updateClientList() { privateScreen.updateClientList (); } CompWindow * CompScreenImpl::getTopWindow() const { return windowManager.getTopWindow(); } CompWindow * CompScreenImpl::getTopServerWindow () const { return windowManager.getTopServerWindow(); } CoreOptions& CompScreenImpl::getCoreOptions() { return privateScreen; } Colormap CompScreenImpl::colormap() const { return privateScreen.colormap; } const unsigned short * CompScreenImpl::averageColor() const { return privateScreen.averageColor.data (); } void CompScreenImpl::setCurrentDesktop (unsigned int desktop) { privateScreen.setCurrentDesktop(desktop); } Window CompScreenImpl::activeWindow() const { return privateScreen.orphanData.activeWindow; } void CompScreenImpl::updatePassiveButtonGrabs(Window serverFrame) { grabManager.updatePassiveButtonGrabs(serverFrame); } bool CompScreenImpl::grabWindowIsNot(Window w) const { return privateScreen.eventManager.notGrabWindow(w); } void CompScreenImpl::incrementPendingDestroys() { windowManager.incrementPendingDestroys(); } cps::DesktopWindowCount::DesktopWindowCount() : countAll(0), countOpaque(0) { } void cps::DesktopWindowCount::incrementDesktopWindowCount() { countAll++; } void cps::DesktopWindowCount::incrementOpaqueDesktopWindowCount() { countOpaque++; } void cps::DesktopWindowCount::decrementDesktopWindowCount() { countAll--; } void cps::DesktopWindowCount::decrementOpaqueDesktopWindowCount() { countOpaque--; } cps::MapNum::MapNum() : mapNum (1) { } unsigned int cps::MapNum::nextMapNum() { return mapNum++; } void CompScreenImpl::setNextActiveWindow(Window id) { privateScreen.orphanData.nextActiveWindow = id; } Window CompScreenImpl::getNextActiveWindow() const { return privateScreen.orphanData.nextActiveWindow; } namespace { void sendStartupMessageToClients (Display *dpy, bool success) { /* Send a client message indicating that our startup is complete if * we were asked to do so */ if (sendStartupMessage) { Atom startupMessageAtom = XInternAtom (dpy, "_COMPIZ_TESTING_STARTUP", FALSE); XEvent startupMessageEvent; Window root = DefaultRootWindow (dpy); startupMessageEvent.xclient.type = ClientMessage; startupMessageEvent.xclient.window = root; startupMessageEvent.xclient.message_type = startupMessageAtom; startupMessageEvent.xclient.format = 32; startupMessageEvent.xclient.data.l[0] = success ? 1 : 0; startupMessageEvent.xclient.data.l[1] = 0; startupMessageEvent.xclient.data.l[2] = 0; startupMessageEvent.xclient.data.l[3] = 0; startupMessageEvent.xclient.data.l[4] = 0; XSendEvent (dpy, root, FALSE, StructureNotifyMask, &startupMessageEvent); XFlush (dpy); } } } bool PrivateScreen::initDisplay (const char *name, cps::History& history, unsigned int showingDesktopMask) { dpy = XOpenDisplay (name); if (!dpy) { compLogMessage ("core", CompLogLevelFatal, "Couldn't open display %s", XDisplayName (name)); return false; } /* Use synchronous behaviour when running with --sync, useful * for getting stacktraces when X Errors occurr */ XSynchronize (dpy, synchronousX ? True : False); snprintf (displayString_, 255, "DISPLAY=%s", DisplayString (dpy)); Atoms::init (dpy); XSetErrorHandler (errorHandler); snDisplay = sn_display_new (dpy, NULL, NULL); if (!snDisplay) return true; if (!xSync.init (dpy)) { compLogMessage ("core", CompLogLevelFatal, "No sync extension"); sendStartupMessageToClients (dpy, false); return false; } xRandr.init (dpy); xShape.init (dpy); xkbEvent.init (dpy); if (xkbEvent.isEnabled ()) { XkbSelectEvents (dpy, XkbUseCoreKbd, XkbBellNotifyMask | XkbStateNotifyMask, XkbAllEventsMask); } else { compLogMessage ("core", CompLogLevelFatal, "No XKB extension"); } int xineramaError; int xineramaEvent; xineramaExtension = XineramaQueryExtension (dpy, &xineramaEvent, &xineramaError); updateScreenInfo (); escapeKeyCode = XKeysymToKeycode (dpy, XStringToKeysym ("Escape")); returnKeyCode = XKeysymToKeycode (dpy, XStringToKeysym ("Return")); modHandler->updateModifierMappings (); Window root_tmp = XRootWindow (dpy, DefaultScreen (dpy)); /* Don't select for SubstructureRedirectMask or * SubstructureNotifyMask yet since we need to * act in complete synchronization here when * doing the initial window init in order to ensure * that windows don't receive invalid stack positions * but we don't want to receive an invalid CreateNotify * when we create windows like edge windows here either */ XSelectInput (dpy, root_tmp, StructureNotifyMask | PropertyChangeMask | LeaveWindowMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask); /* We need to register for EnterWindowMask | * ButtonPressMask | FocusChangeMask on other * root windows as well because focus happens * on a display level and we need to check * if the screen we are running on lost focus */ for (int i = 0; i <= ScreenCount (dpy) - 1; i++) { Window rt = XRootWindow (dpy, i); if (rt == root_tmp) continue; XSelectInput (dpy, rt, FocusChangeMask | SubstructureNotifyMask); } for (int i = 0; i < SCREEN_EDGE_NUM; i++) { screenEdge[i].id = None; screenEdge[i].count = 0; } screenNum = DefaultScreen (dpy); colormap = DefaultColormap (dpy, screenNum); root = root_tmp; snContext = sn_monitor_context_new (snDisplay, screenNum, compScreenSnEvent, this, NULL); if (!XGetWindowAttributes (dpy, rootWindow(), &attrib)) return false; workArea.setWidth (attrib.width); workArea.setHeight (attrib.height); XVisualInfo templ; templ.visualid = XVisualIDFromVisual (attrib.visual); int nvisinfo; XVisualInfo* visinfo = XGetVisualInfo (dpy, VisualIDMask, &templ, &nvisinfo); if (!nvisinfo) { compLogMessage ("core", CompLogLevelFatal, "Couldn't get visual info for default visual"); sendStartupMessageToClients (dpy, false); return false; } XColor black; black.red = black.green = black.blue = 0; if (!XAllocColor (dpy, colormap, &black)) { compLogMessage ("core", CompLogLevelFatal, "Couldn't allocate color"); sendStartupMessageToClients (dpy, false); XFree (visinfo); return false; } static char data = 0; Pixmap bitmap = XCreateBitmapFromData (dpy, rootWindow(), &data, 1, 1); if (!bitmap) { compLogMessage ("core", CompLogLevelFatal, "Couldn't create bitmap"); sendStartupMessageToClients (dpy, false); XFree (visinfo); return false; } invisibleCursor = XCreatePixmapCursor (dpy, bitmap, bitmap, &black, &black, 0, 0); if (!invisibleCursor) { compLogMessage ("core", CompLogLevelFatal, "Couldn't create invisible cursor"); sendStartupMessageToClients (dpy, false); XFree (visinfo); return false; } XFreePixmap (dpy, bitmap); XFreeColors (dpy, colormap, &black.pixel, 1, 0); XFree (visinfo); reshape (attrib.width, attrib.height); initialized = true; initOptions (); detectOutputDevices (*this); updateOutputDevices (*this); getDesktopHints (showingDesktopMask); /* Check for other window managers */ char buf[128]; snprintf (buf, 128, "WM_S%d", DefaultScreen (dpy)); wmSnAtom = XInternAtom (dpy, buf, 0); Window currentWmSnOwner = XGetSelectionOwner (dpy, wmSnAtom); if (currentWmSnOwner != None) { if (!replaceCurrentWm) { compLogMessage ("core", CompLogLevelError, "Screen %d on display \"%s\" already " "has a window manager; try using the " "--replace option to replace the current " "window manager.", DefaultScreen (dpy), DisplayString (dpy)); sendStartupMessageToClients (dpy, false); return false; } XSelectInput (dpy, currentWmSnOwner, StructureNotifyMask); } XSetWindowAttributes attr; attr.override_redirect = true; attr.event_mask = PropertyChangeMask; Window newWmSnOwner = XCreateWindow (dpy, root_tmp, -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (dpy, newWmSnOwner, Atoms::wmName, Atoms::utf8String, 8, PropModeReplace, (unsigned char *) PACKAGE, strlen (PACKAGE)); XEvent event; XWindowEvent (dpy, newWmSnOwner, PropertyChangeMask, &event); Time wmSnTimestamp = event.xproperty.time; XSetSelectionOwner (dpy, wmSnAtom, newWmSnOwner, wmSnTimestamp); if (XGetSelectionOwner (dpy, wmSnAtom) != newWmSnOwner) { compLogMessage ("core", CompLogLevelError, "Could not acquire window manager " "selection on screen %d display \"%s\"", DefaultScreen (dpy), DisplayString (dpy)); XDestroyWindow (dpy, newWmSnOwner); sendStartupMessageToClients (dpy, false); return false; } /* Send client message indicating that we are now the window manager */ event.xclient.type = ClientMessage; event.xclient.window = root_tmp; event.xclient.message_type = Atoms::manager; event.xclient.format = 32; event.xclient.data.l[0] = wmSnTimestamp; event.xclient.data.l[1] = wmSnAtom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (dpy, root_tmp, FALSE, StructureNotifyMask, &event); /* Wait for old window manager to go away */ if (currentWmSnOwner != None) { do { XWindowEvent (dpy, currentWmSnOwner, StructureNotifyMask, &event); } while (event.type != DestroyNotify); } /* Server grab from here, we are creating windows */ XGrabServer (dpy); { XSetWindowAttributes attrib; attrib.override_redirect = 1; attrib.event_mask = PropertyChangeMask; eventManager.createGrabWindow(dpy, rootWindow(), &attrib); for (int i = 0; i < SCREEN_EDGE_NUM; i++) { long xdndVersion = 3; screenEdge[i].id = XCreateWindow (dpy, rootWindow(), -100, -100, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attrib); XChangeProperty (dpy, screenEdge[i].id, Atoms::xdndAware, XA_ATOM, 32, PropModeReplace, (unsigned char *) &xdndVersion, 1); /* CompWindow::CompWindow will select for * crossing events when it gets called on * CreateNotify of this window, so no need * to select for them here */ XSelectInput (dpy, screenEdge[i].id, StructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask); } } updateScreenEdges (); eventManager.setSupportingWmCheck (dpy, rootWindow()); screen->updateSupportedWmHints (); XIGetClientPointer (dpy, None, &clientPointerDeviceId); updateResources (); updateAverageColor (Atoms::gnomeRepresentativeColors); /* Attempt to gain SubstructureRedirectMask */ CompScreenImpl::checkForError (dpy); /* We should get DestroyNotify events for any windows that were * destroyed while initializing windows here now */ XSelectInput (dpy, rootWindow(), attrib.your_event_mask | SubstructureRedirectMask | SubstructureNotifyMask); if (CompScreenImpl::checkForError (dpy)) { compLogMessage ("core", CompLogLevelError, "Another window manager is " "already running on screen: %d", DefaultScreen (dpy)); XUngrabServer (dpy); XSync (dpy, FALSE); sendStartupMessageToClients (dpy, false); return false; } wmSnSelectionWindow = newWmSnOwner; this->wmSnTimestamp = wmSnTimestamp; Window rootReturn, parentReturn; Window *children; unsigned int nchildren; XQueryTree (dpy, rootWindow(), &rootReturn, &parentReturn, &children, &nchildren); XUngrabServer (dpy); XSync (dpy, FALSE); /* Start initializing windows here */ for (unsigned int i = 0; i < nchildren; i++) { XWindowAttributes attrib; /* Failure means the window has been destroyed, do not * manage this window since we will not receive a DestroyNotify * for it */ if (!XGetWindowAttributes (screen->dpy (), children[i], &attrib)) setDefaultWindowAttributes(&attrib); Window topWindowInTree = i ? children[i - 1] : None; PrivateWindow::createCompWindow (topWindowInTree, topWindowInTree, attrib, children[i]); } /* enforce restack on all windows * using list last sent to server i = 0; for (CompWindowList::reverse_iterator rit = serverWindows.rbegin (); rit != serverWindows.rend (); rit++) children[i++] = ROOTPARENT ((*rit)); XRestackWindows (dpy, children, i); */ XFree (children); windowManager.setWindowActiveness(history); Window focus; int revertTo; XGetInputFocus (dpy, &focus, &revertTo); /* move input focus to root window so that we get a FocusIn event when moving it to the default window */ XSetInputFocus (dpy, rootWindow(), RevertToPointerRoot, CurrentTime); if (focus == None || focus == PointerRoot) { screen->focusDefaultWindow (); } else { CompWindow *w; w = screen->findWindow (focus); if (w) w->moveInputFocusTo (); else screen->focusDefaultWindow (); } /* Need to set a default here so that the value isn't uninitialized * when loading plugins FIXME: Should find a way to initialize options * first and then set this value, or better yet, tie this value directly * to the option */ viewPort.vpSize.setWidth (optionGetHsize ()); viewPort.vpSize.setHeight (optionGetVsize ()); /* TODO: Bailout properly when screenInitPlugins fails * TODO: It would be nicer if this line could mean * "init all the screens", but unfortunately it only inits * plugins loaded on the command line screen's and then * we need to call updatePlugins () to init the remaining * screens from option changes */ bool init_succeeded = CompPlugin::screenInitPlugins (screen); assert (init_succeeded); if (!init_succeeded) return false; /* The viewport geometry depends on the new new plugins loaded * especially those that modify option values */ viewPort.vpSize.setWidth (optionGetHsize ()); viewPort.vpSize.setHeight (optionGetVsize ()); setDesktopHints (); setAudibleBell (optionGetAudibleBell ()); pingTimer.setTimes (optionGetPingDelay (), optionGetPingDelay () + 500); pingTimer.start (); sendStartupMessageToClients (dpy, true); return true; } CompScreenImpl::~CompScreenImpl () { privateScreen.startupSequence.removeAllSequences (); while (!windowManager.getWindows().empty ()) delete windowManager.getWindows().front (); while (CompPlugin* p = CompPlugin::pop ()) CompPlugin::unload (p); screen = NULL; if (defaultIcon_) delete defaultIcon_; } cps::GrabManager::GrabManager (CompScreen *screen) : screen(screen), currentState(0), buttonGrabs (), keyGrabs () { } cps::ViewPort::ViewPort() : vp (0, 0), vpSize (1, 1) { } cps::StartupSequence::StartupSequence() : startupSequences (), startupSequenceTimer () { startupSequenceTimer.setCallback ( boost::bind (&cps::StartupSequence::handleStartupSequenceTimeout, this)); startupSequenceTimer.setTimes (1000, 1500); } PrivateScreen::PrivateScreen (CompScreen *screen, cps::WindowManager& windowManager) : CoreOptions(false), dpy (NULL), startupSequence(this), eventManager (), nDesktop (1), currentDesktop (0), wmSnSelectionWindow (None), clientPointerDeviceId (None), invisibleCursor (None), initialized (false), screen(screen), screenInfo (), snDisplay(0), root(None), snContext (0), wmSnAtom (None), desktopHintData (0), desktopHintSize (0), edgeWindow (None), edgeDelayTimer (), xdndWindow (None), windowManager(windowManager), nextKeyPressIsRepeated_(false) { for (int i = 0; i < SCREEN_EDGE_NUM; i++) { screenEdge[i].id = None; screenEdge[i].count = 0; } } cps::History::History() : currentHistory_(0), activeNum_ (1) { memset (history, 0, sizeof history); } cps::WindowManager::WindowManager() : windows (), serverWindows (), destroyedWindows (), stackIsFresh (false), groups (0), pendingDestroys (0), lastFoundWindow(0) { } cps::PluginManager::PluginManager() : plugin (), dirtyPluginList (true) { } cps::EventManager::EventManager () : possibleTap(NULL), source(0), timeout(0), sighupSource(0), sigtermSource(0), sigintSource(0), fileWatch (0), lastFileWatchHandle (1), watchFds (0), lastWatchFdHandle (1), grabWindow (None) { TimeoutHandler *dTimeoutHandler = new TimeoutHandler (); TimeoutHandler::SetDefault (dTimeoutHandler); } cps::OrphanData::OrphanData() : activeWindow (0), nextActiveWindow(0) { } cps::OrphanData::~OrphanData() { } cps::EventManager::~EventManager () { /* Not guaranteed to be created by EventManager's constructor */ if (timeout) { g_source_destroy (timeout->gobj ()); } delete sigintSource; delete sigtermSource; delete sighupSource; /* Not guaranteed to be created by EventManager's constructor */ if (source) { g_source_destroy (source->gobj ()); } /* This will implicitly call ~CompWatchFd */ foreach (Glib::RefPtr fd, watchFds) g_source_destroy (fd->gobj ()); watchFds.clear (); } PrivateScreen::~PrivateScreen () { initialized = false; if (snContext) sn_monitor_context_unref (snContext); if (dpy != NULL) { XUngrabKey (dpy, AnyKey, AnyModifier, rootWindow()); for (int i = 0; i < SCREEN_EDGE_NUM; i++) { Window id = screenEdge[i].id; if (id != None) XDestroyWindow (dpy, id); } eventManager.destroyGrabWindow (dpy); for (auto cursor : cursors) XFreeCursor (dpy, cursor); if (invisibleCursor != None) XFreeCursor (dpy, invisibleCursor); /* Do not destroy wmSnSelectionWindow here. * * Because we haven't changed our active event mask * to remove SubstructureRedirectMask, other ICCCM * compliant window managers may receive a DestroyNotify * (eg, because we're blocked on XSync) before we get * a chance to close our display connection and remove * our SubstructureRedirectMask. That will cause them * to fail to start. * * The selection window is destroyed anyways when we * close our connection, and that is a very accurate * indicator to other WM's that we are well and truly * gone because the protocol requires the implementation * to remove all client event masks before destroying * windows */ XSync (dpy, False); // Redundant? XCloseDisplay (dpy); } if (desktopHintData) free (desktopHintData); if (snDisplay) sn_display_unref (snDisplay); } ./src/plugin.cpp0000644000004100000410000003152013246301623014035 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * Copyright 2014 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "core/plugin.h" /* XXX: This dependency needs to go away */ #include "privatescreen.h" #include #include #include #include #include #include #include #include #include #include #include #define foreach BOOST_FOREACH static const char here[] = "core"; CompPlugin::Map pluginsMap; CompPlugin::List plugins; class CorePluginVTable : public CompPlugin::VTable { public: bool init (); void markReadyToInstantiate (); void markNoFurtherInstantiation (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); }; COMPIZ_PLUGIN_20090315 (core, CorePluginVTable) CompPlugin::VTable * getCoreVTable () { if (!coreVTable) { return getCompPluginVTable20090315_core (); } return coreVTable; } bool CorePluginVTable::init () { return true; } void CorePluginVTable::markReadyToInstantiate () { } void CorePluginVTable::markNoFurtherInstantiation () { } CompOption::Vector & CorePluginVTable::getOptions () { return screen->getOptions (); } bool CorePluginVTable::setOption (const CompString &name, CompOption::Value &value) { return screen->setOption (name, value); } static bool cloaderLoadPlugin (CompPlugin *p, const char *path, const char *name) { if (path) return false; if (strcmp (name, getCoreVTable ()->name ().c_str ())) return false; p->vTable = getCoreVTable (); p->devPrivate.ptr = NULL; p->devType = "cloader"; return true; } static void cloaderUnloadPlugin (CompPlugin *p) { delete p->vTable; } static bool dlloaderLoadPlugin (CompPlugin *p, const char *path, const char *name) { CompString file; void *dlhand; bool loaded = false; if (cloaderLoadPlugin (p, path, name)) return true; if (path) { file = path; file += "/"; } file += "lib"; file += name; file += ".so"; compLogMessage (here, CompLogLevelDebug, "Trying to load %s from: %s", name, file.c_str ()); int open_flags = RTLD_NOW; #ifdef DEBUG // Do not unload the library during dlclose. open_flags |= RTLD_NODELETE; // Make the symbols available globally open_flags |= RTLD_GLOBAL; #endif dlhand = dlopen (file.c_str (), open_flags); if (dlhand) { PluginGetInfoProc getInfo; char *error; char sym[1024]; compLogMessage (here, CompLogLevelDebug, "Opened library: %s", file.c_str ()); dlerror (); snprintf (sym, 1024, "getCompPluginVTable20090315_%s", name); getInfo = (PluginGetInfoProc) dlsym (dlhand, sym); error = dlerror (); if (error) { compLogMessage (here, CompLogLevelError, "dlsym: %s", error); getInfo = 0; } if (getInfo) { p->vTable = (*getInfo) (); if (!p->vTable) { compLogMessage (here, CompLogLevelError, "Couldn't get vtable from '%s' plugin", file.c_str ()); } else { p->devPrivate.ptr = dlhand; p->devType = "dlloader"; loaded = true; compLogMessage (here, CompLogLevelDebug, "Loaded plugin %s from: %s", name, file.c_str ()); } } } else { compLogMessage (here, CompLogLevelDebug, "dlopen failed: %s", dlerror ()); } if (!loaded && dlhand) dlclose (dlhand); return loaded; } static void dlloaderUnloadPlugin (CompPlugin *p) { if (p->devType == "dlloader") { const char *name = p->vTable->name ().c_str (); compLogMessage (here, CompLogLevelDebug, "Closing library: %s", name); delete p->vTable; dlclose (p->devPrivate.ptr); } else cloaderUnloadPlugin (p); } LoadPluginProc loaderLoadPlugin = dlloaderLoadPlugin; UnloadPluginProc loaderUnloadPlugin = dlloaderUnloadPlugin; bool CompManager::initPlugin (CompPlugin *p) { const char *name = p->vTable->name ().c_str (); if (!p->vTable->init ()) { compLogMessage (here, CompLogLevelError, "Plugin init failed: %s", name); return false; } p->vTable->markReadyToInstantiate (); if (screen && screen->displayInitialised()) { if (!p->vTable->initScreen (screen)) { compLogMessage (here, CompLogLevelError, "Plugin initScreen failed: %s", name); p->vTable->fini (); return false; } if (!screen->initPluginForScreen (p)) { compLogMessage (here, CompLogLevelError, "initPluginForScreen failed: %s", name); p->vTable->fini (); return false; } } return true; } void CompManager::finiPlugin (CompPlugin *p) { if (screen) { screen->finiPluginForScreen (p); p->vTable->finiScreen (screen); } p->vTable->fini (); p->vTable->markNoFurtherInstantiation (); } bool CompScreen::initPluginForScreen (CompPlugin *p) { WRAPABLE_HND_FUNCTN_RETURN (bool, initPluginForScreen, p) return _initPluginForScreen (p); } bool CompScreenImpl::_initPluginForScreen (CompPlugin *p) { using compiz::private_screen::WindowManager; bool status = true; WindowManager::iterator it, fail; CompWindow *w; it = fail = windowManager.begin (); for (;it != windowManager.end (); ++it) { w = *it; if (!p->vTable->initWindow (w)) { const char *name = p->vTable->name ().c_str (); compLogMessage (here, CompLogLevelError, "initWindow failed for %s", name); fail = it; status = false; break; } } it = windowManager.begin (); for (;it != fail; ++it) { w = *it; p->vTable->finiWindow (w); } return status; } void CompScreen::finiPluginForScreen (CompPlugin *p) { WRAPABLE_HND_FUNCTN (finiPluginForScreen, p) _finiPluginForScreen (p); } void CompScreenImpl::_finiPluginForScreen (CompPlugin *p) { windowManager.forEachWindow(boost::bind(&CompPlugin::VTable::finiWindow, p->vTable, _1)); } bool CompPlugin::screenInitPlugins (CompScreen *s) { CompPlugin::List::reverse_iterator it = plugins.rbegin (); CompPlugin *p = NULL; /* Plugins is a btf list, so iterate it in reverse */ while (it != plugins.rend ()) { p = (*it); if (p->vTable->initScreen (s)) s->initPluginForScreen (p); ++it; } return true; } void CompPlugin::screenFiniPlugins (CompScreen *s) { foreach (CompPlugin *p, plugins) { s->finiPluginForScreen (p); p->vTable->finiScreen (s); } } bool CompPlugin::windowInitPlugins (CompWindow *w) { bool status = true; for (List::reverse_iterator rit = plugins.rbegin (); rit != plugins.rend (); ++rit) { status &= (*rit)->vTable->initWindow (w); } return status; } void CompPlugin::windowFiniPlugins (CompWindow *w) { foreach (CompPlugin *p, plugins) { p->vTable->finiWindow (w); } } CompPlugin * CompPlugin::find (const char *name) { CompPlugin::Map::iterator it = pluginsMap.find (name); if (it != pluginsMap.end ()) return it->second; return NULL; } void CompPlugin::unload (CompPlugin *p) { if (p->vTable) { const char *name = p->vTable->name ().c_str (); compLogMessage (here, CompLogLevelInfo, "Unloading plugin: %s", name); } loaderUnloadPlugin (p); delete p; } #ifndef COMPIZ_LIBDIR # define COMPIZ_LIBDIR "/usr/lib/compiz" #endif typedef std::vector PluginSearchPath; static PluginSearchPath create_plugin_search_path () { PluginSearchPath plugin_search_path; if (char* plugin_dir_override = getenv ("COMPIZ_PLUGIN_DIR")) { std::vector paths; boost::split (paths, plugin_dir_override, boost::is_any_of (":")); foreach (const std::string &path, paths) { if (!path.empty ()) plugin_search_path.push_back (path); } } if (char* home = getenv ("HOME")) { plugin_search_path.push_back (std::string (home) + "/" HOME_PLUGINDIR); } plugin_search_path.push_back (PLUGINDIR); plugin_search_path.push_back (COMPIZ_LIBDIR); return plugin_search_path; } CompPlugin * CompPlugin::load (const char *name) { std::auto_ptr p (new CompPlugin ()); p->devPrivate.uval = 0; p->devType = ""; p->vTable = 0; compLogMessage (here, CompLogLevelInfo, "Loading plugin: %s", name); PluginSearchPath plugin_search_path = create_plugin_search_path (); foreach (const std::string &path, plugin_search_path) { if (loaderLoadPlugin (p.get (), path.c_str (), name)) return p.release(); } if (loaderLoadPlugin (p.get (), NULL, name)) return p.release(); compLogMessage (here, CompLogLevelError, "Failed to load plugin: %s", name); return NULL; } bool CompPlugin::push (CompPlugin *p) { const CompString &name = p->vTable->name (); std::pair insertRet = pluginsMap.insert (std::make_pair (name, p)); if (!insertRet.second) { compLogMessage (here, CompLogLevelWarn, "Plugin '%s' already active", name.c_str ()); return false; } plugins.push_front (p); compLogMessage (here, CompLogLevelInfo, "Starting plugin: %s", name.c_str ()); if (CompManager::initPlugin (p)) { compLogMessage (here, CompLogLevelDebug, "Started plugin: %s", name.c_str ()); } else { compLogMessage (here, CompLogLevelError, "Failed to start plugin: %s", name.c_str ()); pluginsMap.erase (name); plugins.pop_front (); return false; } return true; } CompPlugin * CompPlugin::pop (void) { if (plugins.empty ()) return NULL; CompPlugin *p = plugins.front (); if (!p) return 0; const CompString &name = p->vTable->name (); pluginsMap.erase (name); compLogMessage (here, CompLogLevelInfo, "Stopping plugin: %s", name.c_str ()); CompManager::finiPlugin (p); compLogMessage (here, CompLogLevelDebug, "Stopped plugin: %s", name.c_str ()); plugins.pop_front (); return p; } CompPlugin::List & CompPlugin::getPlugins (void) { return plugins; } int CompPlugin::getPluginABI (const char *name) { CompPlugin *p = find (name); CompString s = name; if (!p) return 0; s += "_ABI"; if (!screen->hasValue (s)) return 0; return screen->getValue (s).uval; } bool CompPlugin::checkPluginABI (const char *name, int abi) { int pluginABI; pluginABI = getPluginABI (name); if (!pluginABI) { compLogMessage (here, CompLogLevelError, "Plugin '%s' not loaded.\n", name); return false; } else if (pluginABI != abi) { compLogMessage (here, CompLogLevelError, "Plugin '%s' has ABI version '%d', expected " "ABI version '%d'.\n", name, pluginABI, abi); return false; } return true; } CompPlugin::VTable::VTable () : mName (""), mSelf (NULL) { } CompPlugin::VTable::~VTable () { if (mSelf) *mSelf = NULL; } void CompPlugin::VTable::initVTable (CompString name, CompPlugin::VTable **self) { mName = name; if (self) { mSelf = self; *mSelf = this; } } const CompString& CompPlugin::VTable::name () const { return mName; } void CompPlugin::VTable::fini () { } bool CompPlugin::VTable::initScreen (CompScreen *) { return true; } void CompPlugin::VTable::finiScreen (CompScreen *) { } bool CompPlugin::VTable::initWindow (CompWindow *) { return true; } void CompPlugin::VTable::finiWindow (CompWindow *) { } CompOption::Vector & CompPlugin::VTable::getOptions () { return noOptions (); } bool CompPlugin::VTable::setOption (const CompString &name, CompOption::Value &value) { return false; } CompAction::Vector & CompPlugin::VTable::getActions () { return noActions (); } ./src/privateoption.h0000644000004100000410000000402613246301623015110 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEOPTION_H #define _PRIVATEOPTION_H #include #include #include #include typedef struct _CompOptionIntRestriction { int min; int max; } IntRestriction; typedef struct _CompOptionFloatRestriction { float min; float max; float precision; } FloatRestriction; typedef union { IntRestriction i; FloatRestriction f; } RestrictionUnion; class PrivateRestriction { public: CompOption::Type type; RestrictionUnion rest; }; class PrivateOption { public: PrivateOption (); PrivateOption (const PrivateOption &); CompString name; CompOption::Type type; CompOption::Value value; CompOption::Restriction rest; }; #endif ./src/signalsource.cpp0000644000004100000410000000435713246301623015245 0ustar www-datawww-data/* * Copyright © 2012 Canonical, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical, Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical, Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL Canonical, Ltd. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include "privatesignalsource.h" /* Add missing decls: https://bugzilla.gnome.org/show_bug.cgi?id=663880 */ #include G_BEGIN_DECLS #include G_END_DECLS CompSignalSource * CompSignalSource::create (int signum, const callbackFunc &f) { return new CompSignalSource (signum, f); } CompSignalSource::CompSignalSource (int signum, const callbackFunc &f) : mFunc (f), mSignal (signum), mSource (g_unix_signal_add_full (G_PRIORITY_HIGH, signum, CompSignalSource::callback, this, CompSignalSource::destroyed)) { } gboolean CompSignalSource::callback (gpointer user_data) { CompSignalSource *self = static_cast (user_data); self->mFunc (self->mSignal); return TRUE; } void CompSignalSource::destroyed (gpointer user_data) { CompSignalSource *self = static_cast (user_data); self->mSource = 0; } CompSignalSource::~CompSignalSource () { /* Do not remove, see LP: #1085590 */ if (mSource) g_source_remove (mSource); } ./src/string/0000755000004100000410000000000013246301624013341 5ustar www-datawww-data./src/string/CMakeLists.txt0000644000004100000410000000112313246301623016075 0ustar www-datawww-dataINCLUDE_DIRECTORIES( ${compiz_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) SET( PUBLIC_HEADERS ) SET( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/string.cpp ) ADD_LIBRARY( compiz_string STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_string PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) ./src/string/include/0000755000004100000410000000000013246301623014763 5ustar www-datawww-data./src/string/src/0000755000004100000410000000000013246301624014130 5ustar www-datawww-data./src/string/src/string.cpp0000644000004100000410000000717413246301623016152 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2017 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * Marco Trevisan */ #include #include #include #if defined(__GNUC__) && ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 9))) #include #else #include #define HAVE_CPP_REGEX #endif #include CompString compPrintf (const char *format, ...) { va_list ap; CompString rv; va_start (ap, format); rv = compPrintf (format, ap); va_end (ap); return rv; } CompString compPrintf (const char *format, va_list ap) { va_list aq; int n; char *str; if (!format) return CompString (""); unsigned int size = strlen (format) + 1; str = new char[size]; if (!str) return CompString (""); while (1) { /* Try to print in the allocated space. */ va_copy (aq, ap); n = vsnprintf (str, size, format, aq); va_end (aq); /* If that worked, leave the loop. */ if (n > -1 && n < (int) size) break; /* Else try again with more space. */ if (n > -1) /* glibc 2.1 */ size = n + 1; /* precisely what is needed */ else /* glibc 2.0 */ size++; /* one more than the old size */ delete [] str; str = new char[size]; if (!str) { return CompString (""); } } CompString rv (str); delete [] str; return rv; } CompStringVector compGetRegexMatches(const CompString& regexStr, const CompString& string) { CompStringVector matches; #ifdef HAVE_CPP_REGEX std::smatch subMatches; std::regex regex(regexStr); if (std::regex_match(string, subMatches, regex)) { for (const auto& subMatch : subMatches) matches.push_back (subMatch.str ()); } #else regex_t regex; int ret; ret = regcomp (®ex, regexStr.c_str (), REG_EXTENDED); if (ret != 0) return matches; std::vector subMatches (regex.re_nsub + 1); ret = regexec (®ex, string.c_str (), subMatches.size (), subMatches.data (), 0); if (ret == REG_NOMATCH) return matches; for (const auto& sub_match : subMatches) { if (sub_match.rm_so >= 0) { size_t sub_len = sub_match.rm_eo - sub_match.rm_so; matches.push_back (string.substr (sub_match.rm_so, sub_len)); } else { /* We keep this empty so the clients might access to all the subs */ matches.push_back (CompString ()); } } regfree (®ex); #endif return matches; } ./src/string/tests/0000755000004100000410000000000013246301624014503 5ustar www-datawww-data./src/string/tests/CMakeLists.txt0000644000004100000410000000050713246301623017244 0ustar www-datawww-datainclude_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) add_executable( compiz_string_test ${CMAKE_CURRENT_SOURCE_DIR}/printf/src/test-string-printf.cpp ) target_link_libraries( compiz_string_test compiz_string ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests (compiz_string_test COVERAGE compiz_string) ./src/string/tests/test-string.h0000644000004100000410000000304413246301623017137 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_STRING_H #define _COMPIZ_TEST_STRING_H #include class CompStringTest { public: CompStringTest (); virtual ~CompStringTest (); virtual bool test () = 0; }; class CompStringTestPrintf : public CompStringTest { public: bool test (); }; CompStringTest * getTestObject (); #endif ./src/string/tests/test-string.cpp0000644000004100000410000000300513246301623017467 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-string.h" CompStringTest::CompStringTest () { } CompStringTest::~CompStringTest () { } int main (int argc, char **argv) { CompStringTest *cst = static_cast (getTestObject ()); bool ret = false; ret = cst->test (); delete cst; return ret ? 0 : 1; } ./src/string/tests/printf/0000755000004100000410000000000013246301623016004 5ustar www-datawww-data./src/string/tests/printf/src/0000755000004100000410000000000013246301624016574 5ustar www-datawww-data./src/string/tests/printf/src/test-string-printf.cpp0000644000004100000410000001002213246301623023055 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include #include namespace compiz { namespace string { namespace printf_test { class Value { public: virtual ~Value (); typedef boost::shared_ptr Ptr; protected: Value () { } ; void *v; }; template class TValue: public Value { public: TValue (const T &); ~TValue (); const T & value (); }; template TValue::TValue (const T &av) { v = new T(av); } template TValue::~TValue () { delete (reinterpret_cast(v)); } template const T & TValue::value () { return *(reinterpret_cast(v)); } Value::~Value () { } CompString get_format (const CompString &fmt, Value::Ptr v) { if (fmt == "%i" || fmt == "%d") return compPrintf(fmt.c_str(), (boost::static_pointer_cast >(v))->value()); if (fmt == "%f") return compPrintf(fmt.c_str(), (boost::static_pointer_cast >(v))->value()); if (fmt == "%s") return compPrintf( fmt.c_str(), (boost::static_pointer_cast >(v))->value().c_str()); if (fmt == "%x") return compPrintf(fmt.c_str(), (boost::static_pointer_cast >(v))->value()); return "not_reached"; } } } } TEST(CompizString,PrintfTest) { CompString s1; CompString s2; std::map formatValues; std::map formatStrings; s1 = "foo"; const char *other_foo = "foo"; s2 = compPrintf ("%s", other_foo); ASSERT_EQ(s1, s2); s1 = "3"; s2 = compPrintf ("%i", 3, NULL); ASSERT_EQ(s1, s2); s1 = "3.012600"; s2 = compPrintf ("%f", 3.0126, NULL); ASSERT_EQ(s1, s2); s1 = "0x4f567"; s2 = compPrintf ("0x%x", 0x4f567, NULL); ASSERT_EQ(s1, s2); formatValues["%i"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (6)); formatStrings["%i"] = CompString ("6"); formatValues["%f"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (6.532)); formatStrings["%f"] = CompString ("6.532000"); formatValues["%x"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (0x34fe5aa)); formatStrings["%x"] = CompString ("34fe5aa"); formatValues["%d"] = compiz::string::printf_test::Value::Ptr (new compiz::string::printf_test::TValue (2)); formatStrings["%d"] = CompString ("2"); for (std::map ::iterator it = formatStrings.begin (); it != formatStrings.end (); it++) { CompString str = compiz::string::printf_test::get_format (it->first, formatValues[it->first]); ASSERT_EQ(str, it->second); } } ./src/privateaction.h0000644000004100000410000000376213246301623015063 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEACTION_H #define _PRIVATEACTION_H namespace compiz { namespace actions { class BoundAction { public: virtual ~BoundAction () {} virtual void setActive (bool) = 0; }; void setActionActiveState (const CompAction &action, bool active); } } class PrivateAction : public compiz::actions::BoundAction { public: PrivateAction (); PrivateAction (const PrivateAction&); void setActive (bool); CompAction::CallBack initiate; CompAction::CallBack terminate; CompAction::State state; CompAction::BindingType type; CompAction::KeyBinding key; CompAction::ButtonBinding button; bool bell; unsigned int edgeMask; bool active; CompPrivate priv; }; #endif ./src/logmessage/0000755000004100000410000000000013246301624014161 5ustar www-datawww-data./src/logmessage/CMakeLists.txt0000644000004100000410000000054413246301623016723 0ustar www-datawww-dataINCLUDE_DIRECTORIES( ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/logmessage.cpp ) ADD_LIBRARY( compiz_logmessage STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) ./src/logmessage/src/0000755000004100000410000000000013246301624014750 5ustar www-datawww-data./src/logmessage/src/logmessage.cpp0000644000004100000410000000450713246301623017607 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECI<<<< */ #include #include #include #include const char * logLevelToString (CompLogLevel level) { switch (level) { case CompLogLevelFatal: return "Fatal"; case CompLogLevelError: return "Error"; case CompLogLevelWarn: return "Warn"; case CompLogLevelInfo: return "Info"; case CompLogLevelDebug: return "Debug"; default: break; } return "Unknown"; } void logMessage (const char *componentName, CompLogLevel level, const char *message) { if (!debugOutput && level >= CompLogLevelDebug) return; fprintf (stderr, "%s (%s) - %s: %s\n", programName, componentName, logLevelToString (level), message); } void compLogMessage (const char *componentName, CompLogLevel level, const char *format, ...) { va_list args; char message[2048]; va_start (args, format); vsnprintf (message, 2048, format, args); /* FIXME: That's wrong */ #if 0 if (screen) screen->logMessage (componentName, level, message); else #endif logMessage (componentName, level, message); va_end (args); } ./src/logmessage/tests/0000755000004100000410000000000013246301624015323 5ustar www-datawww-data./src/logmessage/tests/CMakeLists.txt0000644000004100000410000000000013246301623020050 0ustar www-datawww-data./src/logmessage/tests/test-logmessage.cpp0000644000004100000410000000000013246301623021117 0ustar www-datawww-data./src/plugin/0000755000004100000410000000000013246301623013330 5ustar www-datawww-data./src/plugin/CMakeLists.txt0000644000004100000410000000220713246301623016071 0ustar www-datawww-datainclude (CompizDefaults) include (CompizCommon) INCLUDE_DIRECTORIES( ${compiz_BINARY_DIR}/generated ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/timer/include ${compiz_SOURCE_DIR}/src/timer/src ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/src/pluginclasshandler/include ${compiz_SOURCE_DIR}/src/servergrab/include ${COMPIZ_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) SET( PUBLIC_HEADERS ) SET( PRIVATE_HEADERS ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) SET( SRCS ${compiz_SOURCE_DIR}/src/plugin.cpp ) ADD_LIBRARY( compiz_plugin STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) TARGET_LINK_LIBRARIES( compiz_plugin dl ) add_dependencies (compiz_plugin core-options) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) SET_TARGET_PROPERTIES( compiz_plugin PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) ./src/plugin/tests/0000755000004100000410000000000013246301624014473 5ustar www-datawww-data./src/plugin/tests/CMakeLists.txt0000644000004100000410000000121413246301623017230 0ustar www-datawww-datainclude(CompizTesting) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/tests/shared ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) add_executable( compiz_plugin_test ${CMAKE_CURRENT_SOURCE_DIR}/test-plugin.cpp ) target_link_libraries( compiz_plugin_test compiz_plugin compiz_core ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ) compiz_discover_tests ( compiz_plugin_test COVERAGE compiz_plugin compiz_core ) ./src/plugin/tests/test-plugin.cpp0000644000004100000410000004061113246301623017453 0ustar www-datawww-data#include #include #define foreach BOOST_FOREACH #include "core/plugin.h" // Get rid of stupid macro from X.h // Why, oh why, are we including X.h? #undef None #include #include #include #include class CompMatch { }; namespace { class PluginFilesystem { public: virtual bool LoadPlugin(CompPlugin *p, const char *path, const char *name) const = 0; virtual void UnloadPlugin(CompPlugin *p) const = 0; static PluginFilesystem const* instance; protected: PluginFilesystem(); virtual ~PluginFilesystem() {} }; class MockPluginFilesystem : public PluginFilesystem { public: MOCK_CONST_METHOD3(LoadPlugin, bool (CompPlugin *, const char *, const char *)); MOCK_CONST_METHOD1(UnloadPlugin, void (CompPlugin *p)); }; class MockVTable : public CompPlugin::VTable { public: MOCK_METHOD0(init, bool ()); MOCK_METHOD0(markReadyToInstantiate, void ()); MOCK_METHOD0(markNoFurtherInstantiation, void ()); }; bool ThunkLoadPluginProc(CompPlugin *p, const char *path_, const char *name) { return PluginFilesystem::instance->LoadPlugin(p, path_, name); } void ThunkUnloadPluginProc(CompPlugin *p) { PluginFilesystem::instance->UnloadPlugin(p); } PluginFilesystem::PluginFilesystem() { ::loaderLoadPlugin = ::ThunkLoadPluginProc; ::loaderUnloadPlugin = ::ThunkUnloadPluginProc; instance = this; } PluginFilesystem const* PluginFilesystem::instance = 0; } // (abstract) namespace class PluginTest : public ::testing::Test { public: MockPluginFilesystem mockfs; }; #define COMPIZ_LIBDIR "/usr/lib/compiz" TEST_F (PluginTest, load_non_existant_plugin_must_fail) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_LIBDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(AtMost(0)); ASSERT_EQ(0, CompPlugin::load("dummy")); } TEST_F (PluginTest, load_plugin_from_HOME_PLUGINDIR_succeeds) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_LIBDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_PLUGINDIR_succeeds) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_LIBDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0));; EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_COMPIZ_PLUGIN_DIR_env_succeeds) { const char *COMPIZ_PLUGIN_DIR_VALUE = "/path/to/plugin/dir"; TmpEnv env ("COMPIZ_PLUGIN_DIR", COMPIZ_PLUGIN_DIR_VALUE); using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_PLUGIN_DIR_VALUE), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_LIBDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_multi_COMPIZ_PLUGIN_DIR_env_succeeds) { std::string COMPIZ_PLUGIN_DIR_PART1 = "/path/to/plugin/dir"; std::string COMPIZ_PLUGIN_DIR_PART2 = "/dir/plugin/to/path"; std::string COMPIZ_PLUGIN_DIR_VALUE = COMPIZ_PLUGIN_DIR_PART1 + ":" + COMPIZ_PLUGIN_DIR_PART2; TmpEnv env ("COMPIZ_PLUGIN_DIR", COMPIZ_PLUGIN_DIR_VALUE.c_str ()); using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(_, EndsWith(COMPIZ_PLUGIN_DIR_PART1), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), StrEq(COMPIZ_PLUGIN_DIR_PART2), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_LIBDIR), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). Times(AtMost(0)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, load_plugin_from_void_succeeds) { using namespace testing; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(PLUGINDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(COMPIZ_LIBDIR), StrEq("dummy"))). WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), Eq((void*)0), StrEq("dummy"))). WillOnce(Return(true)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); CompPlugin* cp = CompPlugin::load("dummy"); ASSERT_NE((void*)0, cp); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_load_plugin_init_load_is_called_without_null_pointer) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (NotNull (), EndsWith(HOME_PLUGINDIR), StrEq("dummy"))) .Times (1) .WillOnce (Return (true)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_push_plugin_init_is_called) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, markReadyToInstantiate ()).Times (AtLeast (0)); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (AtLeast (0)); EXPECT_CALL (mockVtable, init ()).WillOnce (Return (true)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); CompPlugin::pop (); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_push_plugin_mark_ready_to_instantiate_is_called) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (mockVtable, markReadyToInstantiate ()).Times (1); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); CompPlugin::pop (); CompPlugin::unload(cp); } TEST_F (PluginTest, when_we_pop_plugin_mark_no_further_instantiation_is_called) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (mockVtable, markReadyToInstantiate ()).Times (AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (1); CompPlugin::pop (); CompPlugin::unload(cp); } TEST_F (PluginTest, pop_returns_plugin_pointer) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); EXPECT_CALL (mockfs, UnloadPlugin(_)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); MockVTable mockVtable; EXPECT_CALL (mockVtable, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (mockVtable, markReadyToInstantiate ()) .Times (AtLeast (0)); EXPECT_CALL (mockVtable, markNoFurtherInstantiation ()) .Times (AtLeast (0)); CompPlugin* cp = CompPlugin::load("dummy"); cp->vTable = &mockVtable; CompPlugin::push(cp); EXPECT_EQ (cp, CompPlugin::pop ()); CompPlugin::unload(cp); } TEST_F (PluginTest, unload_calls_unload_on_fs) { using namespace testing; EXPECT_CALL (mockfs, LoadPlugin (_, _, _)).Times (AtLeast (0)); ON_CALL(mockfs, LoadPlugin (_, _, _)). WillByDefault (Return (true)); CompPlugin* cp = CompPlugin::load("dummy"); EXPECT_CALL (mockfs, UnloadPlugin (cp)).Times (1); CompPlugin::unload(cp); } namespace { /* TODO (cleanup): Extract this into a separate library because it * duplicates what's in test-pluginclasshandler */ template class Base : public PluginClassStorage { public: typedef BaseType Type; Base (); ~Base (); static unsigned int allocPluginClassIndex (); static void freePluginClassIndex (unsigned int index); private: static PluginClassStorage::Indices indices; static std::list bases; }; template PluginClassStorage::Indices Base ::indices; template std::list * > Base ::bases; template Base ::Base () : PluginClassStorage (indices) { bases.push_back (this); } template Base ::~Base () { bases.remove (this); } template unsigned int Base ::allocPluginClassIndex () { unsigned int i = PluginClassStorage::allocatePluginClassIndex (indices); foreach (Base *b, bases) { if (indices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (indices.size ()); } return i; } template void Base ::freePluginClassIndex (unsigned int index) { PluginClassStorage::freePluginClassIndex (indices, index); foreach (Base *b, bases) { if (indices.size () != b->pluginClasses.size ()) b->pluginClasses.resize (indices.size ()); } } class BaseScreen : public Base { }; class BaseWindow : public Base { }; class DestructionVerifier { public: DestructionVerifier (); virtual ~DestructionVerifier (); MOCK_METHOD0 (destroy, void ()); }; DestructionVerifier::DestructionVerifier () { using namespace testing; /* By default we don't care */ EXPECT_CALL (*this, destroy ()).Times (AtLeast (0)); } DestructionVerifier::~DestructionVerifier () { destroy (); } class PluginScreen : public PluginClassHandler , public DestructionVerifier { public: PluginScreen (BaseScreen *s); }; class PluginWindow : public PluginClassHandler , public DestructionVerifier { public: virtual ~PluginWindow () {} PluginWindow (BaseWindow *s); }; PluginScreen::PluginScreen (BaseScreen *s) : PluginClassHandler (s) { } PluginWindow::PluginWindow (BaseWindow *w) : PluginClassHandler (w) { } class MockScreenAndWindowVTable : public CompPlugin::VTableForScreenAndWindow { public: MOCK_METHOD0 (init, bool ()); }; template class PluginClassIntegrationTest : public PluginTest { public: PluginClassIntegrationTest (); ~PluginClassIntegrationTest (); boost::shared_ptr LoadPlugin (MockScreenAndWindowVTable &); MockPluginFilesystem mockfs; ValueHolder *valueHolder; }; void PopAndUnloadPlugin (CompPlugin *p) { ASSERT_EQ (p, CompPlugin::pop ()); CompPlugin::unload (p); } template boost::shared_ptr PluginClassIntegrationTest ::LoadPlugin (MockScreenAndWindowVTable &v) { typedef PluginClassIntegrationTest TestParam; using namespace testing; EXPECT_CALL (TestParam::mockfs, LoadPlugin (_, _, _)) .Times (AtLeast (0)) .WillOnce (Return (true)); EXPECT_CALL (TestParam::mockfs, UnloadPlugin(_)) .Times (AtLeast (0)); /* Load a plugin, we'll assign the vtable later */ CompPlugin *cp = CompPlugin::load("dummy"); cp->vTable = &v; EXPECT_CALL (v, init ()) .Times (AtLeast (0)) .WillOnce (Return (true)); CompPlugin::push(cp); return AutoDestroy (cp, PopAndUnloadPlugin); } template PluginClassIntegrationTest ::PluginClassIntegrationTest () { valueHolder = new ValueHolder (); ValueHolder::SetDefault (valueHolder); } template PluginClassIntegrationTest ::~PluginClassIntegrationTest () { delete valueHolder; ValueHolder::SetDefault (NULL); } template class BasePluginTemplate { public: typedef BaseType Base; typedef PluginType Plugin; }; typedef BasePluginTemplate BasePluginScreen; typedef BasePluginTemplate BasePluginWindow; } /* TODO: Extract actual interfaces out of CompScreen * and CompWindow that can be passed to the vTables without * using a link-seam like this one */ class CompScreen : public BaseScreen { }; class CompWindow : public BaseWindow { }; typedef ::testing::Types PluginTypes; TYPED_TEST_CASE (PluginClassIntegrationTest, PluginTypes); TYPED_TEST (PluginClassIntegrationTest, get_plugin_structure_null_on_not_loaded) { using namespace testing; /* Can't figure out how to get this out of TestParam::base at the moment */ typename TypeParam::Base base; typename TypeParam::Plugin *p = TypeParam::Plugin::get (&base); EXPECT_THAT (p, IsNull ()); } TYPED_TEST (PluginClassIntegrationTest, get_plugin_structure_nonnull_on_loaded) { using namespace testing; typedef PluginClassIntegrationTest TestParam; MockScreenAndWindowVTable vTable; boost::shared_ptr cp (TestParam::LoadPlugin (vTable)); typename TypeParam::Base base; typedef boost::shared_ptr PluginPtr; /* Because CompScreen is not available, we just need to delete * the plugin structure ourselves */ PluginPtr p (TypeParam::Plugin::get (&base)); EXPECT_THAT (p.get (), NotNull ()); } TYPED_TEST (PluginClassIntegrationTest, plugin_class_destroyed_when_vtable_is) { using namespace testing; typedef PluginClassIntegrationTest TestParam; MockScreenAndWindowVTable vTable; boost::shared_ptr cp (TestParam::LoadPlugin (vTable)); typename TypeParam::Base base; typedef boost::shared_ptr PluginPtr; /* Because CompScreen is not available, we just need to delete * the plugin structure ourselves */ PluginPtr p (TypeParam::Plugin::get (&base)); EXPECT_CALL (*p, destroy ()).Times (1); } ./src/rect/0000755000004100000410000000000013246301623012767 5ustar www-datawww-data./src/rect/CMakeLists.txt0000644000004100000410000000166513246301623015537 0ustar www-datawww-datapkg_check_modules ( GLIBMM REQUIRED glibmm-2.4 glib-2.0 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/rect.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/rect.cpp ) ADD_LIBRARY( compiz_rect STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_rect PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_rect compiz_point ${GLIBMM_LIBRARIES} ) ./src/rect/include/0000755000004100000410000000000013246301623014412 5ustar www-datawww-data./src/rect/include/core/0000755000004100000410000000000013246301624015343 5ustar www-datawww-data./src/rect/include/core/rect.h0000644000004100000410000001156213246301623016455 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPRECT_H #define _COMPRECT_H #include #include #include #include #include #include #include #include "core/point.h" /** * A 2D rectangle, which is likely in screen space. It's data is * isolated and can only be mutated with set() methods. */ class CompRect { public: CompRect (); CompRect (int x, int y, int width, int height); CompRect (const CompRect&); CompRect (const XRectangle); int x () const; int y () const; CompPoint pos () const; int width () const; int height () const; int x1 () const; int y1 () const; int x2 () const; int y2 () const; int left () const; int right () const; int top () const; int bottom () const; int centerX () const; int centerY () const; CompPoint center () const; int area () const; /** * Returns an X region handle for the CompRect */ Region region () const; void setGeometry (int x, int y, int width, int height); void setX (int); void setY (int); void setWidth (int); void setHeight (int); void setPos (const CompPoint&); void setSize (const CompSize&); /** * Sets the left edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setLeft (int); /** * Sets the top edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setTop (int); /** * Sets the right edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setRight (int); /** * Sets the bottom edge position * * Setting an edge past it's opposite edge will result in both edges * being set to the new value */ void setBottom (int); bool contains (const CompPoint &) const; bool contains (const CompRect &) const; bool intersects (const CompRect &) const; bool isEmpty () const; bool operator== (const CompRect &) const; bool operator!= (const CompRect &) const; /* FIXME: Implement operator|= */ CompRect operator& (const CompRect &) const; CompRect& operator&= (const CompRect &); CompRect& operator= (const CompRect &); typedef std::vector vector; private: REGION mRegion; }; COMPIZ_EXTERN_STD(vector) namespace compiz { namespace rect { CompPoint wraparoundPoint (const CompRect &bounds, const CompPoint &p); } } inline int CompRect::x () const { return mRegion.extents.x1; } inline int CompRect::y () const { return mRegion.extents.y1; } inline CompPoint CompRect::pos () const { return CompPoint (x (), y ()); } inline int CompRect::width () const { return mRegion.extents.x2 - mRegion.extents.x1; } inline int CompRect::height () const { return mRegion.extents.y2 - mRegion.extents.y1; } inline int CompRect::x1 () const { return mRegion.extents.x1; } inline int CompRect::y1 () const { return mRegion.extents.y1; } inline int CompRect::x2 () const { return mRegion.extents.x2; } inline int CompRect::y2 () const { return mRegion.extents.y2; } inline int CompRect::left () const { return mRegion.extents.x1; } inline int CompRect::right () const { return mRegion.extents.x2; } inline int CompRect::top () const { return mRegion.extents.y1; } inline int CompRect::bottom () const { return mRegion.extents.y2; } inline int CompRect::centerX () const { return x () + width () / 2; } inline int CompRect::centerY () const { return y () + height () / 2; } inline CompPoint CompRect::center () const { return CompPoint (centerX (), centerY ()); } #endif ./src/rect/src/0000755000004100000410000000000013246301624013557 5ustar www-datawww-data./src/rect/src/rect.cpp0000644000004100000410000001526613246301623015231 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #include #include #include #include template class std::vector; CompRect::CompRect () { mRegion.rects = &mRegion.extents; mRegion.numRects = 1; mRegion.extents.x1 = 0; mRegion.extents.x2 = 0; mRegion.extents.y1 = 0; mRegion.extents.y2 = 0; } CompRect::CompRect (int x, int y, int width, int height) { mRegion.rects = &mRegion.extents; mRegion.numRects = 1; mRegion.extents.x1 = x; mRegion.extents.y1 = y; mRegion.extents.x2 = x + width; mRegion.extents.y2 = y + height; } CompRect::CompRect (const CompRect& r) { mRegion = r.mRegion; mRegion.rects = &mRegion.extents; } CompRect::CompRect (const XRectangle xr) { mRegion.rects = &mRegion.extents; mRegion.numRects = 1; mRegion.extents.x1 = xr.x; mRegion.extents.y1 = xr.y; mRegion.extents.x2 = xr.x + xr.width; mRegion.extents.y2 = xr.y + xr.height; } CompPoint compiz::rect::wraparoundPoint (const CompRect &bounds, const CompPoint &p) { CompPoint r (p); if (p.x () > bounds.x2 ()) r.setX ((p.x () % bounds.width ()) + bounds.x1 ()); else if (p.x () < bounds.x1 ()) r.setX (bounds.width () - (abs (p.x ()) % bounds.width ())); if (p.y () > bounds.y2 ()) r.setY ((p.y () % bounds.height ()) + bounds.y1 ()); else if (p.y () < bounds.y1 ()) r.setY (bounds.height () - (abs (p.y ()) % bounds.height ())); return r; } Region CompRect::region () const { return const_cast (&mRegion); } void CompRect::setGeometry (int x, int y, int width, int height) { mRegion.extents.x1 = x; mRegion.extents.y1 = y; mRegion.extents.x2 = x + width; mRegion.extents.y2 = y + height; } void CompRect::setX (int x) { int width = mRegion.extents.x2 - mRegion.extents.x1; mRegion.extents.x1 = x; mRegion.extents.x2 = x + width; } void CompRect::setY (int y) { int height = mRegion.extents.y2 - mRegion.extents.y1; mRegion.extents.y1 = y; mRegion.extents.y2 = y + height; } void CompRect::setPos (const CompPoint& pos) { setX (pos.x ()); setY (pos.y ()); } void CompRect::setWidth (int width) { mRegion.extents.x2 = mRegion.extents.x1 + width; } void CompRect::setHeight (int height) { mRegion.extents.y2 = mRegion.extents.y1 + height; } void CompRect::setSize (const CompSize& size) { mRegion.extents.x2 = mRegion.extents.x1 + size.width (); mRegion.extents.y2 = mRegion.extents.y1 + size.height (); } void CompRect::setLeft (int x1) { mRegion.extents.x1 = x1; if (mRegion.extents.x2 < x1) mRegion.extents.x2 = x1; } void CompRect::setTop (int y1) { mRegion.extents.y1 = y1; if (mRegion.extents.y2 < y1) mRegion.extents.y2 = y1; } void CompRect::setRight (int x2) { mRegion.extents.x2 = x2; if (mRegion.extents.x1 > x2) mRegion.extents.x1 = x2; } void CompRect::setBottom (int y2) { mRegion.extents.y2 = y2; if (mRegion.extents.y1 > y2) mRegion.extents.y1 = y2; } bool CompRect::contains (const CompPoint& point) const { if (point.x () < x1 ()) return false; if (point.x () > x2 ()) return false; if (point.y () < y1 ()) return false; if (point.y () > y2 ()) return false; return true; } bool CompRect::contains (const CompRect& rect) const { if (rect.x1 () < x1 ()) return false; if (rect.x2 () > x2 ()) return false; if (rect.y1 () < y1 ()) return false; if (rect.y2 () > y2 ()) return false; return true; } bool CompRect::intersects (const CompRect& rect) const { int l, r, t, b; /* extents of overlapping rectangle */ l = MAX (left (), rect.left ()); r = MIN (right (), rect.right ()); t = MAX (top (), rect.top ()); b = MIN (bottom (), rect.bottom ()); return (l < r) && (t < b); } bool CompRect::isEmpty () const { return mRegion.extents.x1 == mRegion.extents.x2 || mRegion.extents.y1 == mRegion.extents.y2; } int CompRect::area () const { if (mRegion.extents.x2 < mRegion.extents.x1) return 0; if (mRegion.extents.y2 < mRegion.extents.y1) return 0; return (mRegion.extents.x2 - mRegion.extents.x1) * (mRegion.extents.y2 - mRegion.extents.y1); } bool CompRect::operator== (const CompRect &rect) const { if (mRegion.extents.x1 != rect.mRegion.extents.x1) return false; if (mRegion.extents.y1 != rect.mRegion.extents.y1) return false; if (mRegion.extents.x2 != rect.mRegion.extents.x2) return false; if (mRegion.extents.y2 != rect.mRegion.extents.y2) return false; return true; } bool CompRect::operator!= (const CompRect &rect) const { return !(*this == rect); } CompRect CompRect::operator& (const CompRect &rect) const { CompRect result (*this); result &= rect; return result; } CompRect& CompRect::operator&= (const CompRect &rect) { int l, r, t, b; /* extents of overlapping rectangle */ l = MAX (left (), rect.left ()); r = MIN (right (), rect.right ()); t = MAX (top (), rect.top ()); b = MIN (bottom (), rect.bottom ()); mRegion.extents.x1 = l; mRegion.extents.x2 = r; mRegion.extents.y1 = t; mRegion.extents.y2 = b; /* FIXME: This can result in negative widths * and heights, which makes no sense */ return *this; } CompRect & CompRect::operator= (const CompRect &rect) { mRegion.extents.x1 = rect.mRegion.extents.x1; mRegion.extents.y1 = rect.mRegion.extents.y1; mRegion.extents.x2 = rect.mRegion.extents.x2; mRegion.extents.y2 = rect.mRegion.extents.y2; return *this; } ./src/rect/tests/0000755000004100000410000000000013246301624014132 5ustar www-datawww-data./src/rect/tests/CMakeLists.txt0000644000004100000410000000173513246301623016677 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_rect_test ${CMAKE_CURRENT_SOURCE_DIR}/test-rect.cpp) add_executable (compiz_test_rect ${CMAKE_CURRENT_SOURCE_DIR}/rect/src/test-rect.cpp) add_executable (compiz_test_rect_wraparound_point ${CMAKE_CURRENT_SOURCE_DIR}/wraparound_point/src/test-rect-wraparound-point.cpp) target_link_libraries (compiz_test_rect compiz_rect_test compiz_rect ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_test_rect_wraparound_point compiz_rect_test compiz_rect ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_rect COVERAGE compiz_rect) compiz_discover_tests (compiz_test_rect_wraparound_point COVERAGE compiz_rect) ./src/rect/tests/wraparound_point/0000755000004100000410000000000013246301623017524 5ustar www-datawww-data./src/rect/tests/wraparound_point/src/0000755000004100000410000000000013246301624020314 5ustar www-datawww-data./src/rect/tests/wraparound_point/src/test-rect-wraparound-point.cpp0000644000004100000410000000465213246301623026247 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include class CompRectTestWraparound : public CompRectTest { public: CompRectTestWraparound (); ~CompRectTestWraparound (); }; CompRectTestWraparound::CompRectTestWraparound () { /* x1: -500 * x2: 750 * y1: -400 * y2: 800 */ mRect = CompRect (-500, -400, 1250, 1200); } CompRectTestWraparound::~CompRectTestWraparound () { } TEST_F(CompRectTestWraparound, TestWraparound) { CompPoint outsider = CompPoint (2501, 2401); CompPoint inside = CompPoint (); inside = compiz::rect::wraparoundPoint (mRect, outsider); RecordProperty ("OutsidePointX", outsider.x ()); RecordProperty ("OutsidePointY", outsider.y ()); RecordProperty ("InsidePointX", inside.x ()); RecordProperty ("InsidePointY", inside.y ()); EXPECT_EQ (inside, CompPoint (-499, -399)); outsider = CompPoint (-1751, -1601); inside = compiz::rect::wraparoundPoint (mRect, outsider); RecordProperty ("OutsidePointX", outsider.x ()); RecordProperty ("OutsidePointY", outsider.y ()); RecordProperty ("InsidePointX", inside.x ()); RecordProperty ("InsidePoinY", inside.y ()); EXPECT_EQ (inside, CompPoint (749, 799)); } ./src/rect/tests/test-rect.cpp0000644000004100000410000000241313246301623016547 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-rect.h" CompRectTest::~CompRectTest () { } ./src/rect/tests/test-rect.h0000644000004100000410000000270113246301623016214 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_TIMER_H #define _COMPIZ_TEST_TIMER_H #include #include class CompRectTest : public ::testing::Test { public: virtual ~CompRectTest () = 0; protected: CompRect mRect; }; #endif ./src/rect/tests/rect/0000755000004100000410000000000013246301623015066 5ustar www-datawww-data./src/rect/tests/rect/src/0000755000004100000410000000000013246301624015656 5ustar www-datawww-data./src/rect/tests/rect/src/test-rect.cpp0000644000004100000410000000541413246301623020277 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include TEST_F(CompRectTest, TestRect) { ASSERT_EQ (mRect, CompRect (0, 0, 0, 0)); mRect = CompRect (100, 100, 400, 300); EXPECT_EQ (mRect.x (), 100); EXPECT_EQ (mRect.y (), 100); EXPECT_EQ (mRect.width (), 400); EXPECT_EQ (mRect.height (), 300); EXPECT_EQ (mRect.x2 (), 500); EXPECT_EQ (mRect.y2 (), 400); EXPECT_EQ (mRect.left (), 100); EXPECT_EQ (mRect.right (), 500); EXPECT_EQ (mRect.top (), 100); EXPECT_EQ (mRect.bottom (), 400); EXPECT_EQ (mRect.centerX (), 300); EXPECT_EQ (mRect.centerY (), 250); EXPECT_EQ (mRect.center (), CompPoint (300, 250)); EXPECT_EQ (mRect.pos (), CompPoint (100, 100)); EXPECT_EQ (mRect.area (), 120000); mRect.setWidth (-1); mRect.setHeight (-1); EXPECT_EQ (mRect.area (), 0); mRect = CompRect (0, 0, 0, 0); EXPECT_TRUE (mRect.isEmpty ()); mRect.setRight (500); mRect.setLeft (100); mRect.setTop (50); mRect.setBottom (450); EXPECT_EQ (mRect, CompRect (100, 50, 400, 400)); mRect.setLeft (600); EXPECT_TRUE (mRect.isEmpty ()); EXPECT_EQ (mRect.right (), 600); mRect.setRight (1000); EXPECT_TRUE (mRect.contains (CompPoint (601, 100))); EXPECT_TRUE (mRect.contains (CompRect (601, 51, 300, 350))); EXPECT_FALSE (mRect.contains (CompRect (601, 41, 900, 500))); EXPECT_TRUE (mRect.intersects (CompRect (601, 41, 300, 400))); /* Intersection */ mRect &= CompRect (700, 100, 400, 100); EXPECT_EQ (mRect, CompRect (700, 100, 300, 100)); } ./src/privateeventsource.h0000644000004100000410000000343413246301623016144 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_PRIVATEEVENTSOURCE_H #define _COMPIZ_PRIVATEEVENTSOURCE_H #include #include class CompEventSource: public Glib::Source { public: virtual ~CompEventSource (); static Glib::RefPtr create (); sigc::connection connect (const sigc::slot &slot); protected: bool prepare (int &timeout); bool check (); bool dispatch (sigc::slot_base *slot); bool callback (); CompEventSource (Display *dpy, int fd); private: Display *mDpy; Glib::PollFD mPollFD; int mConnectionFD; }; #endif ./src/privatewindow.h0000644000004100000410000002574313246301623015120 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEWINDOW_H #define _PRIVATEWINDOW_H #include #include #include #include #include #include #include "syncserverwindow.h" #include "asyncserverwindow.h" #define XWINDOWCHANGES_INIT {0, 0, 0, 0, 0, None, 0} namespace compiz {namespace X11 { class PendingEvent { public: PendingEvent (Display *, Window); virtual ~PendingEvent (); virtual bool match (XEvent *); unsigned int serial () { return mSerial; } // HACK: will be removed virtual void dump (); typedef boost::shared_ptr Ptr; protected: virtual Window getEventWindow (XEvent *); unsigned int mSerial; Window mWindow; }; class PendingConfigureEvent : public PendingEvent { public: PendingConfigureEvent (Display *, Window, unsigned int, XWindowChanges *); virtual ~PendingConfigureEvent (); virtual bool match (XEvent *); bool matchVM (unsigned int valueMask); bool matchRequest (XWindowChanges &xwc, unsigned int); virtual void dump (); typedef boost::shared_ptr Ptr; protected: virtual Window getEventWindow (XEvent *); private: unsigned int mValueMask; XWindowChanges mXwc; }; class PendingEventQueue { public: PendingEventQueue (Display *); virtual ~PendingEventQueue (); void add (PendingEvent::Ptr p); bool match (XEvent *); bool pending (); bool forEachIf (boost::function ); void clear () { mEvents.clear (); } // HACK will be removed void dump (); protected: bool removeIfMatching (const PendingEvent::Ptr &p, XEvent *); private: std::list mEvents; }; }} struct CompGroup; typedef CompWindowExtents CompFullscreenMonitorSet; class X11SyncServerWindow : public compiz::window::SyncServerWindow { public: X11SyncServerWindow (Display *dpy, const Window *w, const Window *frame); bool queryAttributes (XWindowAttributes &attrib); bool queryFrameAttributes (XWindowAttributes &attrib); XRectangle * queryShapeRectangles(int kind, int *count, int *ordering); private: Display *mDpy; const Window *mWindow; const Window *mFrame; }; class PrivateWindow : public compiz::window::SyncServerWindow, public compiz::window::AsyncServerWindow { public: PrivateWindow (); ~PrivateWindow (); bool queryAttributes (XWindowAttributes &attrib); bool queryFrameAttributes (XWindowAttributes &attrib); XRectangle * queryShapeRectangles (int kind, int *count, int *ordering); int requestConfigureOnClient (const XWindowChanges &xwc, unsigned int valueMask); int requestConfigureOnWrapper (const XWindowChanges &xwc, unsigned int valueMask); int requestConfigureOnFrame (const XWindowChanges &xwc, unsigned int valueMask); void sendSyntheticConfigureNotify (); bool hasCustomShape () const; void recalcNormalHints (); bool updateFrameWindow (); void setWindowMatrix (); bool restack (Window aboveId); bool initializeSyncCounter (); bool isGroupTransient (Window clientLeader); bool isInvisible() const; static bool stackLayerCheck (CompWindow *w, Window clientLeader, CompWindow *below, const ServerLock &lock); static bool avoidStackingRelativeTo (CompWindow *w, const ServerLock &lock); static CompWindow * findSiblingBelow (CompWindow *w, bool aboveFs, const ServerLock &lock); static CompWindow * findLowestSiblingBelow (CompWindow *w, const ServerLock &lock); static bool validSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock); void saveGeometry (int mask); int restoreGeometry (XWindowChanges *xwc, int mask); void reconfigureXWindow (unsigned int valueMask, XWindowChanges *xwc); static bool stackDocks (CompWindow *w, CompWindowList &updateList, XWindowChanges *xwc, unsigned int *mask, const ServerLock &lock); static bool stackTransients (CompWindow *w, CompWindow *avoid, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock); static void stackAncestors (CompWindow *w, XWindowChanges *xwc, CompWindowList &updateList, const ServerLock &lock); static bool isAncestorTo (CompWindow *transient, CompWindow *ancestor); Window getClientLeaderOfAncestor (); CompWindow * getModalTransient (); int addWindowSizeChanges (XWindowChanges *xwc, CompWindow::Geometry old); int addWindowStackChanges (XWindowChanges *xwc, CompWindow *sibling, const ServerLock &lock); static CompWindow * findValidStackSiblingBelow (CompWindow *w, CompWindow *sibling, const ServerLock &lock); void ensureWindowVisibility (); void reveal (); static void revealAncestors (CompWindow *w, CompWindow *transient); static void minimizeTransients (CompWindow *w, CompWindow *ancestor); static void unminimizeTransients (CompWindow *w, CompWindow *ancestor); bool getUsageTimestamp (Time& timestamp); bool isWindowFocusAllowed (Time timestamp); static void handleDamageRect (CompWindow *w, int x, int y, int width, int height); bool reparent (); void unreparent (); void manageFrameWindowSeparately (); void hide (); void show (); void withdraw (); bool handlePingTimeout (unsigned int lastPing); void handlePing (int lastPing); void applyStartupProperties (CompStartupSequence *s); void updateNormalHints (); void updateWmHints (); void updateClassHints (); void updateTransientHint (); void updateIconGeometry (); void updateClientFrame (); Window getClientLeader (); char * getStartupId (); CompRegion rectsToRegion (unsigned int, XRectangle *); void updateRegion (); bool handleSyncAlarm (); void move (int dx, int dy, bool sync); bool resize (int dx, int dy, int dwidth, int dheight, int dborder); bool resize (const CompWindow::Geometry &g); bool resize (const XWindowAttributes &attrib); void configure (XConfigureEvent *ce); void configureFrame (XConfigureEvent *ce); void circulate (XCirculateEvent *ce); unsigned int adjustConfigureRequestForGravity (XWindowChanges *xwc, unsigned int xwcm, int gravity, int direction); bool updateSize (); bool getUserTime (Time& time); void setUserTime (Time time); bool allowWindowFocus (unsigned int noFocusMask, Time timestamp); void freeIcons (); void updateMwmHints (); void updateStartupId (); void processMap (); void updatePassiveButtonGrabs (); void setFullscreenMonitors (CompFullscreenMonitorSet *monitors); static unsigned int windowTypeFromString (const char *str); static int compareWindowActiveness (CompWindow *w1, CompWindow *w2); void setOverrideRedirect (bool overrideRedirect); void readIconHint (); bool checkClear (); static CompWindow* createCompWindow (Window aboveId, Window aboveServerId, XWindowAttributes &wa, Window id); public: PrivateWindow *priv; CompWindow *window; int refcnt; Window serverId; Window id; Window serverFrame; Window frame; Window wrapper; unsigned int mapNum; unsigned int activeNum; /* Don't use this for determining * the window geometry because we * read into this out of sync with * ConfigureNotify events to determine * the class and override redirect state */ XWindowAttributes attrib; CompWindow::Geometry geometry; CompWindow::Geometry serverGeometry; CompWindow::Geometry frameGeometry; CompWindow::Geometry serverFrameGeometry; Window transientFor; Window clientLeader; XSizeHints sizeHints; XWMHints *hints; bool inputHint; bool alpha; CompRegion region; CompRegion inputRegion; CompRegion frameRegion; unsigned int wmType; unsigned int type; unsigned int state; unsigned int actions; unsigned int protocols; unsigned int mwmDecor; unsigned int mwmFunc; bool invisible; bool destroyed; bool managed; bool unmanaging; int destroyRefCnt; int unmapRefCnt; CompPoint initialViewport; Time initialTimestamp; bool initialTimestampSet; bool fullscreenMonitorsSet; CompRect fullscreenMonitorRect; bool placed; bool minimized; bool inShowDesktopMode; bool shaded; bool hidden; bool grabbed; bool alreadyDecorated; unsigned int desktop; int pendingUnmaps; int pendingMaps; typedef std::pair XWCValueMask; compiz::X11::PendingEventQueue pendingConfigures; bool receivedMapRequestAndAwaitingMap; char *startupId; char *resName; char *resClass; CompGroup *group; unsigned int lastPong; bool alive; bool moved; CompWindowExtents input; CompWindowExtents serverInput; CompWindowExtents lastServerInput; CompWindowExtents border; CompWindowExtents output; CompWindowExtents clientFrame; CompStruts *struts; std::vector icons; bool noIcons; CompRect iconGeometry; XWindowChanges saveWc; int saveMask; XSyncCounter syncCounter; XSyncValue syncValue; XSyncAlarm syncAlarm; CompTimer syncWaitTimer; bool syncWait; CompWindow::Geometry syncGeometry; int closeRequests; Time lastCloseRequestTime; bool nextMoveImmediate; X11SyncServerWindow syncServerWindow; compiz::window::configure_buffers::Buffer::Ptr configureBuffer; }; #endif ./src/match.cpp0000644000004100000410000003331413246301623013636 0ustar www-datawww-data/* * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #define foreach BOOST_FOREACH #include #include #include #include #include "privatematch.h" #include "privatescreen.h" #include "privatewindow.h" const CompMatch CompMatch::emptyMatch; class CoreExp : public CompMatch::Expression { public: virtual ~CoreExp () {}; typedef enum { TypeXid, TypeState, TypeOverride, TypeRGBA, TypeType } Type; CoreExp (const CompString& str) { if (str.compare (0, 4, "xid=") == 0) { mType = TypeXid; priv.val = strtol (str.substr (4).c_str (), NULL, 0); } else if (str.compare (0, 6, "state=") == 0) { using ::compiz::private_screen::windowStateFromString; mType = TypeState; priv.uval = windowStateFromString(str.substr (6).c_str ()); } else if (str.compare (0, 18, "override_redirect=") == 0) { mType = TypeOverride; priv.val = strtol (str.substr (18).c_str (), NULL, 0); } else if (str.compare (0, 5, "rgba=") == 0) { mType = TypeRGBA; priv.val = strtol (str.substr (5).c_str (), NULL, 0); } else { size_t offset = (str.compare (0, 5, "type=") == 0) ? 5 : 0; mType = TypeType; priv.uval = PrivateWindow::windowTypeFromString ( str.substr (offset).c_str ()); } } bool evaluate (const CompWindow *w) const { switch (mType) { case TypeXid: return ((unsigned int) priv.val == w->id ()); case TypeState: return (priv.uval & w->state ()); case TypeOverride: { bool overrideRedirect = w->overrideRedirect (); return ((priv.val == 1 && overrideRedirect) || (priv.val == 0 && !overrideRedirect)); } case TypeRGBA: return ((priv.val && w->alpha ()) || (!priv.val && !w->alpha ())); case TypeType: return (priv.uval & w->wmType ()); } return true; } Type mType; CompPrivate priv; }; CompMatch::Expression * CompScreen::matchInitExp (const CompString& str) { WRAPABLE_HND_FUNCTN_RETURN (CompMatch::Expression *, matchInitExp, str); return _matchInitExp (str); } CompMatch::Expression * CompScreenImpl::_matchInitExp (const CompString& str) { return new CoreExp (str); } static void matchUpdateMatchOptions (CompOption::Vector& options) { foreach (CompOption &option, options) { switch (option.type ()) { case CompOption::TypeMatch: option.value ().match ().update (); break; case CompOption::TypeList: if (option.value ().listType () == CompOption::TypeMatch) { foreach (CompOption::Value &value, option.value ().list ()) value.match ().update (); } default: break; } } } void CompScreen::matchExpHandlerChanged () { WRAPABLE_HND_FUNCTN (matchExpHandlerChanged); _matchExpHandlerChanged (); } void CompScreenImpl::_matchExpHandlerChanged () { foreach (CompPlugin *p, CompPlugin::getPlugins ()) { CompOption::Vector &options = p->vTable->getOptions (); matchUpdateMatchOptions (options); } } void CompScreen::matchPropertyChanged (CompWindow *w) { WRAPABLE_HND_FUNCTN (matchPropertyChanged, w); _matchPropertyChanged (w); } void CompScreenImpl::_matchPropertyChanged (CompWindow *w) { } static void matchResetOps (MatchOp::List &list) { MatchExpOp *exp; foreach (MatchOp *op, list) { switch (op->type ()) { case MatchOp::TypeGroup: matchResetOps (dynamic_cast (op)->op); break; case MatchOp::TypeExp: exp = dynamic_cast (op); if (exp && exp->e) exp->e.reset (); break; default: break; } } } static bool matchOpsEqual (MatchOp::List &list1, MatchOp::List &list2) { MatchGroupOp *g1, *g2; MatchExpOp *e1, *e2; MatchOp::List::iterator it1 = list1.begin (), it2 = list2.begin (); if (list1.size () != list2.size ()) return false; while (it1 != list1.end ()) { if ((*it1)->type () != (*it2)->type ()) return false; if ((*it1)->flags != (*it2)->flags) return false; switch ((*it1)->type ()) { case MatchOp::TypeGroup: g1 = dynamic_cast (*it1); g2 = dynamic_cast (*it2); if (!matchOpsEqual (g1->op, g2->op)) return false; break; case MatchOp::TypeExp: e1 = dynamic_cast (*it1); e2 = dynamic_cast (*it2); if (e1->value != e2->value) return false; break; default: break; } ++it1; ++it2; } return true; } static unsigned int nextIndex (CompString &str, unsigned int i) { while (str[i] == '\\') if (str[++i] != '\0') i++; return i; } static CompString strndupValue (CompString str) { CompString value; unsigned int i, j, n = str.length (); /* count trialing white spaces */ i = j = 0; while (i < n) { if (str[i] != ' ') { j = 0; if (str[i] == '\\') i++; } else { j++; } i++; } /* remove trialing white spaces */ n -= j; i = j = 0; for (;;) { if (str[i] == '\\') i++; value += str[i++]; if (i >= n) { return value; } } } /* Add match expressions from string. Special characters are '(', ')', '!', '&', '|'. Escape character is '\'. Example: "type=desktop | !type=dock" "!type=dock & (state=fullscreen | state=shaded)" */ static void matchAddFromString (MatchOp::List &list, CompString str) { CompString value; int j, i = 0; int flags = 0; str += "\0"; while (str[i] != '\0') { while (str[i] == ' ') i++; if (str[i] == '!') { flags |= MATCH_OP_NOT_MASK; i++; while (str[i] == ' ') i++; } if (str[i] == '(') { int level = 1; int length; j = ++i; while (str[j] != '\0') { if (str[j] == '(') { level++; } else if (str[j] == ')') { level--; if (level == 0) break; } j = nextIndex (str, ++j); } length = j - i; MatchGroupOp *group = new MatchGroupOp (); matchAddFromString (group->op, str.substr (i, length)); group->flags = flags; list.push_back (group); while (str[j] != '\0' && str[j] != '|' && str[j] != '&') j++; } else { j = i; while (str[j] != '\0' && str[j] != '|' && str[j] != '&') j = nextIndex (str, ++j); if (j > i) { MatchExpOp *exp = new MatchExpOp (); exp->value = strndupValue (str.substr (i, j - i)); exp->flags = flags; list.push_back (exp); } } i = j; if (str[i] != '\0') { if (str[i] == '&') flags = MATCH_OP_AND_MASK; i++; } } if (!list.empty ()) list.front ()->flags &= ~MATCH_OP_AND_MASK; } static CompString matchOpsToString (MatchOp::List &list) { CompString value (""), group; foreach (MatchOp *op, list) { switch (op->type ()) { case MatchOp::TypeGroup: group = matchOpsToString (dynamic_cast (op)->op); if (group.length ()) { if (value.length ()) { value += ((op->flags & MATCH_OP_AND_MASK) ? "& " : "| "); } if (op->flags & MATCH_OP_NOT_MASK) value += "!"; value += "(" + group + ") "; } break; case MatchOp::TypeExp: if (value.length ()) value += ((op->flags & MATCH_OP_AND_MASK) ? "& " : "| "); if (op->flags & MATCH_OP_NOT_MASK) value += "!"; value += dynamic_cast (op)->value; value += " "; break; default: break; } } if (!value.empty ()) value.erase (value.length () - 1); return value; } static void matchUpdateOps (MatchOp::List &list) { MatchExpOp *exp; foreach (MatchOp *op, list) { switch (op->type ()) { case MatchOp::TypeGroup: matchUpdateOps (dynamic_cast (op)->op); break; case MatchOp::TypeExp: exp = dynamic_cast (op); if (exp && screen) exp->e.reset (screen->matchInitExp (exp->value)); break; default: break; } } } static bool matchEvalOps (MatchOp::List &list, const CompWindow *w) { bool value, result = false; MatchExpOp *exp; foreach (MatchOp *op, list) { /* fast evaluation */ if (op->flags & MATCH_OP_AND_MASK) { /* result will never be true */ if (!result) return false; } else { /* result will always be true */ if (result) return true; } switch (op->type ()) { case MatchOp::TypeGroup: value = matchEvalOps (dynamic_cast (op)->op, w); break; case MatchOp::TypeExp: exp = dynamic_cast (op); if (exp->e.get ()) value = exp->e->evaluate (w); else value = true; break; default: value = true; break; } if (op->flags & MATCH_OP_NOT_MASK) value = !value; if (op->flags & MATCH_OP_AND_MASK) result = (result && value); else result = (result || value); } return result; } MatchOp::MatchOp () : flags (0) { } MatchOp::~MatchOp () { } MatchExpOp::MatchExpOp () : value (""), e () { } MatchExpOp::MatchExpOp (const MatchExpOp &ex) : value (ex.value), e (ex.e) { flags = ex.flags; } MatchGroupOp::MatchGroupOp () : op (0) { } MatchGroupOp::MatchGroupOp (const MatchGroupOp &gr) : op (0) { *this = gr; flags = gr.flags; } MatchGroupOp::~MatchGroupOp () { foreach (MatchOp *o, op) delete o; } MatchGroupOp & MatchGroupOp::operator= (const MatchGroupOp &gr) { MatchGroupOp *gop; MatchExpOp *eop; foreach (MatchOp *o, op) delete o; op.clear (); foreach (MatchOp *o, gr.op) { switch (o->type ()) { case MatchOp::TypeGroup: gop = new MatchGroupOp (dynamic_cast (*o)); op.push_back (gop); break; case MatchOp::TypeExp: eop = new MatchExpOp (dynamic_cast (*o)); op.push_back (eop); break; default: break; } } return *this; } PrivateMatch::PrivateMatch () : op () { } CompMatch::CompMatch () : priv (new PrivateMatch ()) { } CompMatch::CompMatch (const CompString str) : priv (new PrivateMatch ()) { matchAddFromString (priv->op.op, str); update (); } CompMatch::CompMatch (const CompMatch &match) : priv (new PrivateMatch ()) { priv->op = match.priv->op; update (); } CompMatch::~CompMatch () { delete priv; } void CompMatch::update () { matchResetOps (priv->op.op); matchUpdateOps (priv->op.op); } bool CompMatch::evaluate (const CompWindow *window) const { return matchEvalOps (priv->op.op, window); } CompString CompMatch::toString () const { return matchOpsToString (priv->op.op); } bool CompMatch::isEmpty () const { return (*this == emptyMatch); } CompMatch & CompMatch::operator= (const CompMatch &match) { priv->op = match.priv->op; update (); return *this; } CompMatch & CompMatch::operator&= (const CompMatch &match) { MatchGroupOp *g1 = new MatchGroupOp (priv->op); MatchGroupOp *g2 = new MatchGroupOp (match.priv->op); g2->flags = MATCH_OP_AND_MASK; priv->op = MatchGroupOp (); priv->op.op.push_back (g1); priv->op.op.push_back (g2); update (); return *this; } CompMatch & CompMatch::operator|= (const CompMatch &match) { MatchGroupOp *g1 = new MatchGroupOp (priv->op); MatchGroupOp *g2 = new MatchGroupOp (match.priv->op); priv->op = MatchGroupOp (); priv->op.op.push_back (g1); priv->op.op.push_back (g2); update (); return *this; } const CompMatch & CompMatch::operator& (const CompMatch &match) { return CompMatch (*this) &= match; } const CompMatch & CompMatch::operator| (const CompMatch &match) { return CompMatch (*this) |= match; } const CompMatch & CompMatch::operator! () { MatchGroupOp *g = new MatchGroupOp (priv->op); g->flags ^= MATCH_OP_NOT_MASK; priv->op = MatchGroupOp (); priv->op.op.push_back (g); update (); return *this; } CompMatch & CompMatch::operator= (const CompString &str) { priv->op = MatchGroupOp (); matchAddFromString (priv->op.op, str); update (); return *this; } CompMatch & CompMatch::operator&= (const CompString &str) { *this &= CompMatch (str); return *this; } CompMatch & CompMatch::operator|= (const CompString &str) { *this |= CompMatch (str); return *this; } const CompMatch & CompMatch::operator& (const CompString &str) { *this &= str; return *this; } const CompMatch & CompMatch::operator| (const CompString &str) { *this |= str; return *this; } bool CompMatch::operator== (const CompMatch &match) const { return matchOpsEqual (priv->op.op, match.priv->op.op); } bool CompMatch::operator!= (const CompMatch &match) const { return !(*this == match); } ./src/session.cpp0000644000004100000410000002526513246301623014233 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Radek Doulik */ #include "core/session.h" #include "core/screen.h" #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #define SM_DEBUG(x) static SmcConn smcConnection; static CompWatchFdHandle iceWatchFdHandle; static bool connected = false; static bool iceConnected = false; static char *smClientId, *smPrevClientId; static void iceInit (void); static void setStringListProperty (SmcConn connection, const char *name, const char **values, int nValues) { SmProp prop, *pProp; prop.name = (char *) name; prop.type = const_cast (SmLISTofARRAY8); prop.vals = (SmPropValue *) malloc (nValues * sizeof (SmPropValue)); if (!prop.vals) return; for (int i = 0; i < nValues; ++i) { prop.vals[i].value = (char *) values[i]; prop.vals[i].length = strlen (values[i]); } prop.num_vals = nValues; pProp = ∝ SmcSetProperties (connection, 1, &pProp); free (prop.vals); } static void setCloneRestartCommands (SmcConn connection) { /* at maximum, we pass our old arguments + our new client id to the SM, so allocate for that case */ const char **args = (const char **) malloc ((programArgc + 2) * sizeof (char *)); if (!args) return; int i, count = 0; for (i = 0; i < programArgc; ++i) { if (strcmp (programArgv[i], "--sm-client-id") == 0) ++i; /* skip old client id, we'll add the new one later */ else if (strcmp (programArgv[i], "--replace") == 0) continue; /* there's nothing to replace when starting session */ else args[count++] = programArgv[i]; } setStringListProperty (connection, SmCloneCommand, args, count); /* insert new client id at position 1 and 2; position 0 is the executable name */ for (i = count - 1; i >= 1; i--) args[i + 2] = args[i]; args[1] = "--sm-client-id"; args[2] = smClientId; count += 2; setStringListProperty (connection, SmRestartCommand, args, count); free (args); } static void setRestartStyle (SmcConn connection, char hint) { SmProp prop, *pProp; SmPropValue propVal; prop.name = const_cast (SmRestartStyleHint); prop.type = const_cast (SmCARD8); prop.num_vals = 1; prop.vals = &propVal; propVal.value = &hint; propVal.length = 1; pProp = ∝ SmcSetProperties (connection, 1, &pProp); } static void setProgramInfo (SmcConn connection, pid_t pid, uid_t uid) { SmProp progProp, pidProp, userProp; SmPropValue progVal, pidVal, userVal; SmProp *props[3]; char pidBuffer[32]; unsigned int count = 0; struct passwd *pw; progProp.name = const_cast (SmProgram); progProp.type = const_cast (SmARRAY8); progProp.num_vals = 1; progProp.vals = &progVal; progVal.value = (SmPointer) "compiz"; progVal.length = strlen ((char *) progVal.value); props[count++] = &progProp; snprintf (pidBuffer, sizeof (pidBuffer), "%d", pid); pidProp.name = const_cast (SmProcessID); pidProp.type = const_cast (SmARRAY8); pidProp.num_vals = 1; pidProp.vals = &pidVal; pidVal.value = (SmPointer) pidBuffer; pidVal.length = strlen (pidBuffer); props[count++] = &pidProp; pw = getpwuid (uid); if (pw) { userProp.name = const_cast (SmUserID); userProp.type = const_cast (SmARRAY8); userProp.num_vals = 1; userProp.vals = &userVal; userVal.value = (SmPointer) pw->pw_name; userVal.length = strlen (pw->pw_name); props[count++] = &userProp; } SmcSetProperties (connection, count, props); } static void saveYourselfCallback (SmcConn connection, SmPointer client_data, int saveType, Bool shutdown, int interact_Style, Bool fast) { CompOption::Vector args; args.push_back (CompOption ("save_type", CompOption::TypeInt)); args.push_back (CompOption ("shutdown", CompOption::TypeBool)); args.push_back (CompOption ("interact_style", CompOption::TypeInt)); args.push_back (CompOption ("fast", CompOption::TypeBool)); args[0].value ().set (saveType); args[1].value ().set ((bool) shutdown); args[2].value ().set (interact_Style); args[3].value ().set ((bool) fast); screen->sessionEvent (CompSession::EventSaveYourself, args); setCloneRestartCommands (connection); setRestartStyle (connection, SmRestartImmediately); setProgramInfo (connection, getpid (), getuid ()); SmcSaveYourselfDone (connection, 1); } static void dieCallback (SmcConn connection, SmPointer clientData) { screen->sessionEvent (CompSession::EventDie, noOptions ()); CompSession::close (); exit (0); } static void saveCompleteCallback (SmcConn connection, SmPointer clientData) { screen->sessionEvent (CompSession::EventSaveComplete, noOptions ()); } static void shutdownCancelledCallback (SmcConn connection, SmPointer clientData) { screen->sessionEvent (CompSession::EventShutdownCancelled, noOptions ()); } void CompSession::init (char *prevClientId) { static SmcCallbacks callbacks; if (getenv ("SESSION_MANAGER")) { char errorBuffer[1024]; iceInit (); callbacks.save_yourself.callback = saveYourselfCallback; callbacks.save_yourself.client_data = NULL; callbacks.die.callback = dieCallback; callbacks.die.client_data = NULL; callbacks.save_complete.callback = saveCompleteCallback; callbacks.save_complete.client_data = NULL; callbacks.shutdown_cancelled.callback = shutdownCancelledCallback; callbacks.shutdown_cancelled.client_data = NULL; smcConnection = SmcOpenConnection (NULL, NULL, SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, &callbacks, prevClientId, &smClientId, sizeof (errorBuffer), errorBuffer); if (!smcConnection) compLogMessage ("core", CompLogLevelWarn, "SmcOpenConnection failed: %s", errorBuffer); else { connected = true; if (prevClientId) smPrevClientId = strdup (prevClientId); setRestartStyle (smcConnection, SmRestartImmediately); } } } void CompSession::close () { if (connected) { setRestartStyle (smcConnection, SmRestartIfRunning); if (SmcCloseConnection (smcConnection, 0, NULL) != SmcConnectionInUse) connected = false; if (smClientId) { free (smClientId); smClientId = NULL; } if (smPrevClientId) { free (smPrevClientId); smPrevClientId = NULL; } } } CompString CompSession::getClientId (CompSession::ClientIdType type) { if (!connected) return ""; switch (type) { case CompSession::ClientId: if (smClientId) return smClientId; break; case CompSession::PrevClientId: if (smPrevClientId) return smPrevClientId; break; default: break; } return ""; } /* ice connection handling taken and updated from gnome-ice.c * original gnome-ice.c code written by Tom Tromey */ /* This is called when data is available on an ICE connection. */ static bool iceProcessMessages (IceConn connection) { SM_DEBUG (printf ("ICE connection process messages\n")); IceProcessMessagesStatus status = IceProcessMessages (connection, NULL, NULL); if (status == IceProcessMessagesIOError) { SM_DEBUG (printf ("ICE connection process messages" " - error => shutting down the connection\n")); IceSetShutdownNegotiation (connection, False); IceCloseConnection (connection); } return 1; } /* This is called when a new ICE connection is made. It arranges for the ICE connection to be handled via the event loop. */ static void iceNewConnection (IceConn connection, IcePointer clientData, Bool opening, IcePointer *watchData) { if (opening) { SM_DEBUG (printf ("ICE connection opening\n")); /* Make sure we don't pass on these file descriptors to any exec'ed children */ fcntl (IceConnectionNumber (connection), F_SETFD, fcntl (IceConnectionNumber (connection), F_GETFD,0) | FD_CLOEXEC); iceWatchFdHandle = screen->addWatchFd (IceConnectionNumber (connection), POLLIN | POLLPRI | POLLHUP | POLLERR, boost::bind (iceProcessMessages, connection)); iceConnected = true; } else { SM_DEBUG (printf ("ICE connection closing\n")); if (iceConnected) { screen->removeWatchFd (iceWatchFdHandle); iceWatchFdHandle = 0; iceConnected = false; } } } static IceIOErrorHandler oldIceHandler; static void iceErrorHandler (IceConn connection) { if (oldIceHandler) (*oldIceHandler) (connection); } /* We call any handler installed before (or after) iceInit but avoid calling the default libICE handler which does an exit() */ static void iceInit (void) { static bool iceInitialized = false; if (!iceInitialized) { IceIOErrorHandler defaultIceHandler; oldIceHandler = IceSetIOErrorHandler (NULL); defaultIceHandler = IceSetIOErrorHandler (iceErrorHandler); if (oldIceHandler == defaultIceHandler) oldIceHandler = NULL; IceAddConnectionWatch (iceNewConnection, NULL); iceInitialized = true; } } ./src/eventmanagement.h0000644000004100000410000000544413246301623015370 0ustar www-datawww-data/* * Copyright © 2012 Canonical, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical, Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical, Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL Canonical, Ltd. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #ifndef _COMPIZ_EVENT_MANAGEMENT_H #define _COMPIZ_EVENT_MANAGEMENT_H #include struct CompScreenEdge; class CompOption; namespace compiz { namespace private_screen { class GrabList; class EventManager; } namespace events { namespace cps = compiz::private_screen; typedef std::vector EventArguments; typedef boost::function ActionModsMatchesEventStateFunc; int processButtonPressOnEdgeWindow (Window edgeWindow, Window root, Window eventWindow, Window eventRoot, cps::GrabList &grabList, const CompScreenEdge *screenEdge); void setEventWindowInButtonPressArguments (EventArguments &arguments, Window eventWindow); bool activateButtonPressOnWindowBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, EventArguments &arguments); bool activateButtonPressOnEdgeBindingOption (CompOption &option, unsigned int eventButton, unsigned int eventState, int edge, cps::EventManager &eventManager, const ActionModsMatchesEventStateFunc &matchEventState, EventArguments &arguments); } } #endif ./src/option/0000755000004100000410000000000013246301623013342 5ustar www-datawww-data./src/option/tests/0000755000004100000410000000000013246301624014505 5ustar www-datawww-data./src/option/tests/CMakeLists.txt0000644000004100000410000000145213246301623017246 0ustar www-datawww-datainclude_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/pluginclasshandler/include ${compiz_SOURCE_DIR}/src/timer/include ${compiz_SOURCE_DIR}/src/logmessage/include ${compiz_SOURCE_DIR}/src/string/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/src/servergrab/include ${COMPIZ_INCLUDE_DIRS} ) add_executable( compiz_option_test ${CMAKE_CURRENT_SOURCE_DIR}/option.cpp ) target_link_libraries( compiz_option_test compiz_core ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests ( compiz_option_test COVERAGE compiz_core ) ./src/option/tests/option.cpp0000644000004100000410000001456013246301623016526 0ustar www-datawww-data#include /* XXX: including core.h means that we pull in * both window.h and screen.h which are cascading * includes. We should eliminate this dependency */ #include "core/core.h" #include "core/action.h" #include "core/match.h" #include "core/option.h" namespace { template void check_type_value(CompOption::Type type, const T & value) { CompOption::Value v; v.set(value); ASSERT_EQ(v.type(),type); ASSERT_EQ (v.get(),value); } template<> void check_type_value(CompOption::Type type, const unsigned short (& value)[4]) { CompOption::Value v; v.set(value); ASSERT_EQ(v.type(),type); unsigned short * color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(value[i], color[i]); } unsigned short testColor[4] = {255, 0, 255, 0}; unsigned short testColor2[4] = {0, 255, 0, 255}; template void check_list_type(CompOption::Type listType, CompOption::Value::Vector &list) { CompOption::Value vl; vl.set (list); ASSERT_EQ (vl.type (), CompOption::TypeList); ASSERT_EQ (vl.get (), list); for (CompOption::Value::Vector::const_iterator it = vl.get ().begin (); it != vl.get ().end (); it++) { T inst; CompOption::Value value (inst); const CompOption::Value &v (*it); ASSERT_EQ (v.type (), value.type ()); } } } TEST(CompOption,Value) { check_type_value (CompOption::TypeBool, true); check_type_value (CompOption::TypeBool, false); check_type_value (CompOption::TypeInt, 1); check_type_value (CompOption::TypeFloat, 1.f); check_type_value (CompOption::TypeString, CompString ("Check")); check_type_value (CompOption::TypeString, "core"); check_type_value (CompOption::TypeAction, CompAction()); check_type_value (CompOption::TypeMatch, CompMatch()); check_type_value (CompOption::TypeColor, testColor); check_type_value (CompOption::TypeList, CompOption::Value::Vector(5)); CompOption::Value v1, v2; ASSERT_EQ (v1,v2); v1.set (CompString("SomeString")); ASSERT_TRUE(v1 != v2); CompOption::Value::Vector vec; CompOption::Value v; v.set (true); vec.push_back (v); vec.push_back (v); check_list_type (CompOption::TypeBool, vec); vec.clear (); v.set (CompString ("foo")); vec.push_back (v); vec.push_back (v); check_list_type (CompOption::TypeString, vec); } TEST(CompOption,Color) { CompOption::Value value(testColor); unsigned short * color = value.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); color = value.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); value.set(testColor2); color = value.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); color = value.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); CompOption::Value v; v.set (testColor); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); v.set(testColor2); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); v.set (static_cast (testColor)); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor[i], color[i]); v.set(testColor2); color = v.c(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); color = v.get(); ASSERT_NE((void*)0, color); for (int i = 0; i != 4; ++i) ASSERT_EQ(testColor2[i], color[i]); } TEST(CompOption, Const) { CompOption::Value non_const; CompOption::Value const& as_const(non_const); { CompString const expectOne("one"); CompString const expectTwo("two"); non_const = expectOne; ASSERT_EQ(expectOne, non_const.s()); ASSERT_EQ(expectOne, as_const.s()); non_const = expectTwo; ASSERT_EQ(expectTwo, non_const.s()); ASSERT_EQ(expectTwo, as_const.s()); } { bool const expectOne = true; bool const expectTwo = false; non_const = expectOne; ASSERT_EQ(expectOne, non_const.b()); ASSERT_EQ(expectOne, as_const.b()); non_const = expectTwo; EXPECT_FALSE (non_const.b()); EXPECT_FALSE (as_const.b()); } { float const expectOne = 0.0; float const expectTwo = 42.0; non_const = expectOne; ASSERT_EQ(expectOne, non_const.f()); ASSERT_EQ(expectOne, as_const.f()); non_const = expectTwo; ASSERT_EQ(expectTwo, non_const.f()); ASSERT_EQ(expectTwo, as_const.f()); } } TEST (CompOption, AssignDefaultActionValueToUnsetTypeClearsOldStateKeepsInfo) { /* Value is unset at this point */ CompOption option ("testing", CompOption::TypeKey); CompAction action; /* We need to set up the state here as * the CompOption::Value constructor makes * a copy of the action */ action.setState (CompAction::StateInitKey); action.setButton (CompAction::ButtonBinding (1, 1 << 1)); CompOption::Value value (action); ASSERT_EQ (value.action ().state (), CompAction::StateInitKey); /* Actually set the action value, this will * overwrite the internal value */ option.set (value); /* We don't care about the old action's state, so get * rid of it */ ASSERT_EQ (option.value ().action ().state (), 0); /* We do want to keep the non-stateful data which is * pure info */ ASSERT_EQ (option.value ().action ().button ().button (), 1); ASSERT_EQ (option.value ().action ().button ().modifiers (), 1 << 1); } ./src/outputdevices.cpp0000644000004100000410000001206413246301623015444 0ustar www-datawww-data/* * Compiz Core: OutputDevices class * * Copyright (c) 2012 Canonical Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "outputdevices.h" #include "core_options.h" namespace compiz { namespace core { OutputDevices::OutputDevices () : outputDevs (), overlappingOutputs (false), currentOutputDev (0) { } void OutputDevices::setGeometryOnDevice (unsigned int const nOutput, int x, int y, const int width, const int height) { if (outputDevs.size() < nOutput + 1) outputDevs.resize (nOutput + 1); outputDevs[nOutput].setGeometry (x, y, width, height); } void OutputDevices::adoptDevices (unsigned int nOutput, CompSize *screen) { /* make sure we have at least one output */ if (!nOutput) { setGeometryOnDevice (nOutput, 0, 0, screen->width (), screen->height ()); ++nOutput; } if (outputDevs.size () > nOutput) outputDevs.resize (nOutput); char str[10]; /* set name, width, height and update rect pointers in all regions */ for (unsigned int i = 0; i < nOutput; ++i) { snprintf(str, 10, "Output %u", i); outputDevs[i].setId (str, i); } overlappingOutputs = false; setCurrentOutput (currentOutputDev); for (unsigned int i = 0; i < nOutput - 1; ++i) for (unsigned int j = i + 1; j < nOutput; ++j) if (outputDevs[i].intersects (outputDevs[j])) overlappingOutputs = true; } void OutputDevices::setCurrentOutput (unsigned int outputNum) { if (outputNum >= outputDevs.size ()) outputNum = 0; currentOutputDev = outputNum; } int OutputDevices::outputDeviceForGeometry (const CompWindow::Geometry &gm, int strategy, CompSize *screen) const { if (outputDevs.size () == 1) return 0; int overlapAreas[outputDevs.size ()]; int highest, seen, highestScore; unsigned int i; CompRect geomRect, overlap; if (strategy == CoreOptions::OverlappingOutputsSmartMode) { /* We're only going to use geomRect for overlapping area calculations, so the window rectangle is enough. We don't need to consider anything more like the border because it will never be significant to the result */ geomRect = gm; } else { /* for biggest/smallest modes, only use the window center to determine the correct output device */ int x = (gm.x () + (gm.width () / 2) + gm.border ()) % screen->width (); if (x < 0) x += screen->width (); int y = (gm.y () + (gm.height () / 2) + gm.border ()) % screen->height (); if (y < 0) y += screen->height (); geomRect.setGeometry (x, y, 1, 1); } /* get amount of overlap on all output devices */ for (i = 0; i < outputDevs.size (); ++i) { overlap = outputDevs[i] & geomRect; overlapAreas[i] = overlap.area (); } /* find output with largest overlap */ for (i = 0, highest = 0, highestScore = 0; i < outputDevs.size (); ++i) { if (overlapAreas[i] > highestScore) { highest = i; highestScore = overlapAreas[i]; } } /* look if the highest score is unique */ for (i = 0, seen = 0; i < outputDevs.size (); ++i) if (overlapAreas[i] == highestScore) ++seen; if (seen > 1) { /* it's not unique, select one output of the matching ones and use the user preferred strategy for that */ unsigned int currentSize, bestOutputSize; bool bestFit; bool searchLargest = (strategy != CoreOptions::OverlappingOutputsPreferSmallerOutput); if (searchLargest) bestOutputSize = 0; else bestOutputSize = UINT_MAX; for (i = 0, highest = 0; i < outputDevs.size (); ++i) { if (overlapAreas[i] == highestScore) { currentSize = outputDevs[i].area (); if (searchLargest) bestFit = (currentSize > bestOutputSize); else bestFit = (currentSize < bestOutputSize); if (bestFit) { highest = i; bestOutputSize = currentSize; } } } } return highest; } } // namespace core } // namespace compiz ./src/timer/0000755000004100000410000000000013246301624013153 5ustar www-datawww-data./src/timer/CMakeLists.txt0000644000004100000410000000222313246301623015711 0ustar www-datawww-datapkg_check_modules( GLIBMM REQUIRED glibmm-2.4 ) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${GLIBMM_LIBRARY_DIRS}) SET( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/timer.h ${CMAKE_CURRENT_SOURCE_DIR}/include/core/timeouthandler.h ) SET( PRIVATE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/privatetimeouthandler.h ${CMAKE_CURRENT_SOURCE_DIR}/src/privatetimeoutsource.h ${CMAKE_CURRENT_SOURCE_DIR}/src/privatetimer.h ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/timeouthandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/timer.cpp ) ADD_LIBRARY( compiz_timer STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_timer PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_timer ${GLIBMM_LIBRARIES} ) ./src/timer/include/0000755000004100000410000000000013246301623014575 5ustar www-datawww-data./src/timer/include/core/0000755000004100000410000000000013246301623015525 5ustar www-datawww-data./src/timer/include/core/timer.h0000644000004100000410000000716213246301623017024 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _TIMER_H #define _TIMER_H #include #include #include class CompTimeoutSource; class PrivateTimer; namespace compiz { namespace core { namespace timer { inline int timeval_diff (struct timeval *tv1, struct timeval *tv2) { if (tv1->tv_sec == tv2->tv_sec || tv1->tv_usec >= tv2->tv_usec) return (((tv1->tv_sec - tv2->tv_sec) * 1000000) + (tv1->tv_usec - tv2->tv_usec)) / 1000; else return (((tv1->tv_sec - 1 - tv2->tv_sec) * 1000000) + (1000000 + tv1->tv_usec - tv2->tv_usec)) / 1000; } } } } /** * A simple timer for use with invoking a CallBack during a timed duration. */ class CompTimer { public: typedef boost::function CallBack; /** * Empty constructor setting everything to zero and NULL. */ CompTimer (); /** * Frees the private data for this timer and any information about it's * context. */ ~CompTimer (); /** * Checks if this timer is active and will have it's CallBack invoked. */ bool active (); unsigned int minTime (); unsigned int maxTime (); unsigned int minLeft (); unsigned int maxLeft (); /** * FIXME: Remove from the public API */ void setExpiryTimes (unsigned int min, unsigned int max = 0); /** * FIXME: Remove from the public API */ void decrement (unsigned int diff); /** * FIXME: Remove from the public API */ void setActive (bool active); /** * FIXME: Remove from the public API */ bool triggerCallback (); /** * Sets the timing durations of this timer. */ void setTimes (unsigned int min, unsigned int max = 0); /** * Sets the callback function to invoke for this timer. This defaults * to NULL. */ void setCallback (CallBack callback); /** * Starts this timer without modifying any of it's parameters. The timer is * stop()'d before this occurs. */ void start (); /** * Starts this timer setting the paramters with setTimes(). The timer is stop()'d * before this occurs. */ void start (unsigned int min, unsigned int max = 0); /** * Starts this timer setting the parameters with setTimes() and setCallback(). The timer is * stop()'d before this occurs. */ void start (CallBack callback, unsigned int min, unsigned int max = 0); /** * Stops this timer. After this the timer should not be active() and it's CallBack shouldn't * be invoked. */ void stop (); private: PrivateTimer *priv; }; #endif ./src/timer/include/core/timeouthandler.h0000644000004100000410000000332513246301623020725 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TIMEOUTHANDLER_H #define _COMPIZ_TIMEOUTHANDLER_H #include #include class PrivateTimeoutHandler; class CompTimer; class TimeoutHandler : boost::noncopyable { public: TimeoutHandler (); ~TimeoutHandler (); void addTimer (CompTimer *timer); void removeTimer (CompTimer *timer); std::list & timers (); static TimeoutHandler * Default (); static void SetDefault (TimeoutHandler *); private: PrivateTimeoutHandler *priv; }; #endif ./src/timer/src/0000755000004100000410000000000013246301624013742 5ustar www-datawww-data./src/timer/src/timer.cpp0000644000004100000410000001627113246301623015574 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #include #include "privatetimeoutsource.h" #include "privatetimer.h" #define foreach BOOST_FOREACH CompTimeoutSource::CompTimeoutSource (Glib::RefPtr &ctx) : Glib::Source () { /* * Compiz MUST use priority G_PRIORITY_DEFAULT because that's the same * as GDK_PRIORITY_EVENTS. * * Any higher priority than that and you will starve the glib event loop * of X events. That causes stuttering and even complete starvation * can cause compiz to hang inside X11/GLX functions indefinitely. * In the best case, GLX functions would be slowed down by their messages * being prioritized lower than us. * * Any lower priority than that and screen redraws can lag behind * important things like dragging windows around. * * We have an "unfair" scheduling algorithm in the glib main event loop * to thank for all this. Ideally, compiz should be threaded so it never * slows down the handling of X11/GLX messages in the glib main loop, or * vice-versa. */ set_priority (G_PRIORITY_DEFAULT); attach (ctx); connect (sigc::mem_fun (this, &CompTimeoutSource::callback)); } CompTimeoutSource::~CompTimeoutSource () { } sigc::connection CompTimeoutSource::connect (const sigc::slot &slot) { return connect_generic (slot); } Glib::RefPtr CompTimeoutSource::create (Glib::RefPtr &ctx) { return Glib::RefPtr (new CompTimeoutSource (ctx)); } static const unsigned short COMPIZ_TIMEOUT_WAIT = 15; bool CompTimeoutSource::prepare (int &timeout) { /* Determine time to wait */ if (TimeoutHandler::Default ()->timers ().empty ()) { /* This kind of sucks, but we have to do it, considering * that glib provides us no safe way to remove the source - * thankfully we shouldn't ever be hitting this case since * we create the source after we start pingTimer * and that doesn't stop until compiz does */ timeout = COMPIZ_TIMEOUT_WAIT; return true; } if (TimeoutHandler::Default ()->timers ().front ()->minLeft () > 0) { std::list::iterator it = TimeoutHandler::Default ()->timers ().begin (); CompTimer *t = (*it); timeout = t->maxLeft (); while (it != TimeoutHandler::Default ()->timers ().end ()) { t = (*it); if (t->minLeft () >= (unsigned int) timeout) break; if (t->maxLeft () < (unsigned int) timeout) timeout = (int) t->maxLeft (); ++it; } } else { timeout = 0; } return timeout <= 0; } bool CompTimeoutSource::check () { return (!TimeoutHandler::Default ()->timers ().empty () && TimeoutHandler::Default ()->timers ().front ()->minLeft () <= 0); } bool CompTimeoutSource::dispatch (sigc::slot_base *slot) { (*static_cast *> (slot)) (); return true; } bool CompTimeoutSource::callback () { TimeoutHandler *handler = TimeoutHandler::Default (); std::list requeue, &timers = handler->timers (); while (!timers.empty ()) { CompTimer *t = timers.front (); if (t->minLeft () > 0) break; timers.pop_front (); t->setActive (false); if (t->triggerCallback ()) requeue.push_back (t); } std::list::const_iterator i = requeue.begin (); for (; i != requeue.end (); ++i) { CompTimer *t = *i; handler->addTimer (t); t->setActive (true); } return !timers.empty (); } PrivateTimer::PrivateTimer () : mActive (false), mMinTime (0), mMaxTime (0), mMinDeadline (0), mMaxDeadline (0), mCallBack (NULL) { } PrivateTimer::~PrivateTimer () { } CompTimer::CompTimer () : priv (new PrivateTimer ()) { assert (priv); } CompTimer::~CompTimer () { TimeoutHandler::Default ()->removeTimer (this); delete priv; } void CompTimer::setTimes (unsigned int min, unsigned int max) { bool wasActive = priv->mActive; if (priv->mActive) stop (); priv->mMinTime = min; priv->mMaxTime = (min <= max)? max : min; if (wasActive) start (); } void CompTimer::setExpiryTimes (unsigned int min, unsigned int max) { gint64 now = g_get_monotonic_time (); priv->mMinDeadline = now + (static_cast (min) * 1000); priv->mMaxDeadline = now + (static_cast (max >= min ? max : min) * 1000); } void CompTimer::decrement (unsigned int diff) { /* deprecated */ } void CompTimer::setActive (bool active) { priv->mActive = active; } bool CompTimer::triggerCallback () { return priv->mCallBack (); } void CompTimer::setCallback (CompTimer::CallBack callback) { bool wasActive = priv->mActive; if (priv->mActive) stop (); priv->mCallBack = callback; if (wasActive) start (); } void CompTimer::start () { stop (); if (priv->mCallBack.empty ()) { /* FIXME: compLogMessage needs to be testable */ #if 0 compLogMessage ("core", CompLogLevelWarn, "Attempted to start timer without callback."); #endif return; } priv->mActive = true; TimeoutHandler::Default ()->addTimer (this); } void CompTimer::start (unsigned int min, unsigned int max) { setTimes (min, max); start (); } void CompTimer::start (CompTimer::CallBack callback, unsigned int min, unsigned int max) { setTimes (min, max); setCallback (callback); start (); } void CompTimer::stop () { priv->mActive = false; TimeoutHandler::Default ()->removeTimer (this); } unsigned int CompTimer::minTime () { return priv->mMinTime; } unsigned int CompTimer::maxTime () { return priv->mMaxTime; } unsigned int CompTimer::minLeft () { gint64 now = g_get_monotonic_time (); return (priv->mMinDeadline > now) ? (unsigned int)(priv->mMinDeadline - now + 500) / 1000 : 0; } unsigned int CompTimer::maxLeft () { gint64 now = g_get_monotonic_time (); return (priv->mMaxDeadline > now) ? (unsigned int)(priv->mMaxDeadline - now + 500) / 1000 : 0; } bool CompTimer::active () { return priv->mActive; } ./src/timer/src/privatetimer.h0000644000004100000410000000306413246301623016630 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include #ifndef _PRIVATETIMER_H #define _PRIVATETIMER_H class PrivateTimer { public: PrivateTimer (); ~PrivateTimer (); bool mActive; unsigned int mMinTime; unsigned int mMaxTime; gint64 mMinDeadline; gint64 mMaxDeadline; CompTimer::CallBack mCallBack; }; #endif ./src/timer/src/timeouthandler.cpp0000644000004100000410000000477213246301623017503 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "privatetimeouthandler.h" #include "core/timer.h" #include #include namespace { static boost::scoped_ptr gDefault; } TimeoutHandler::TimeoutHandler () : priv (new PrivateTimeoutHandler ()) { } TimeoutHandler::~TimeoutHandler () { delete priv; } void TimeoutHandler::addTimer (CompTimer *timer) { std::list::iterator it; it = std::find (priv->mTimers.begin (), priv->mTimers.end (), timer); if (it != priv->mTimers.end ()) return; for (it = priv->mTimers.begin (); it != priv->mTimers.end (); ++it) { if (timer->minTime () < (*it)->minLeft ()) break; } timer->setExpiryTimes (timer->minTime (), timer->maxTime ()); priv->mTimers.insert (it, timer); } void TimeoutHandler::removeTimer (CompTimer *timer) { std::list::iterator it; it = std::find (priv->mTimers.begin (), priv->mTimers.end (), timer); if (it == priv->mTimers.end ()) return; priv->mTimers.erase (it); } std::list & TimeoutHandler::timers () { return priv->mTimers; } TimeoutHandler * TimeoutHandler::Default () { return gDefault.get(); } void TimeoutHandler::SetDefault (TimeoutHandler *instance) { gDefault.reset(instance); } ./src/timer/src/privatetimeouthandler.h0000644000004100000410000000263113246301623020533 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_PRIVATETIMEOUTHANDLER_H #define _COMPIZ_PRIVATETIMEOUTHANDLER_H #include class PrivateTimeoutHandler { public: std::list mTimers; }; #endif ./src/timer/src/privatetimeoutsource.h0000644000004100000410000000351713246301623020422 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #ifndef _COMPIZ_PRIVATETIMEOUTSOURCE_H #define _COMPIZ_PRIVATETIMEOUTSOURCE_H class CompTimeoutSource : public Glib::Source { public: virtual ~CompTimeoutSource (); static Glib::RefPtr create (Glib::RefPtr &ctx); sigc::connection connect (const sigc::slot &slot); protected: bool prepare (int &timeout); bool check (); bool dispatch (sigc::slot_base *slot); bool callback (); explicit CompTimeoutSource (Glib::RefPtr &ctx); friend class CompTimer; }; #endif ./src/timer/tests/0000755000004100000410000000000013246301624014315 5ustar www-datawww-data./src/timer/tests/CMakeLists.txt0000644000004100000410000000346713246301623017066 0ustar www-datawww-datainclude_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_library (compiz_timer_test ${CMAKE_CURRENT_SOURCE_DIR}/test-timer.cpp) add_executable (compiz_timer_callbacks ${CMAKE_CURRENT_SOURCE_DIR}/callbacks/src/test-timer-callbacks.cpp) add_executable (compiz_timer_diffs ${CMAKE_CURRENT_SOURCE_DIR}/diffs/src/test-timer-diffs.cpp) add_executable (compiz_timer_set-values ${CMAKE_CURRENT_SOURCE_DIR}/set-values/src/test-timer-set-values.cpp) add_executable (compiz_timer_while-calling ${CMAKE_CURRENT_SOURCE_DIR}/while-calling/src/test-timer-set-times-while-calling.cpp) target_link_libraries (compiz_timer_callbacks compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_timer_diffs compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_timer_set-values compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) target_link_libraries (compiz_timer_while-calling compiz_timer_test compiz_timer ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_timer_callbacks COVERAGE compiz_timer) compiz_discover_tests (compiz_timer_diffs COVERAGE compiz_timer) compiz_discover_tests (compiz_timer_set-values COVERAGE compiz_timer) compiz_discover_tests (compiz_timer_while-calling COVERAGE compiz_timer) ./src/timer/tests/callbacks/0000755000004100000410000000000013246301623016233 5ustar www-datawww-data./src/timer/tests/callbacks/src/0000755000004100000410000000000013246301624017023 5ustar www-datawww-data./src/timer/tests/callbacks/src/test-timer-callbacks.cpp0000644000004100000410000001727213246301623023551 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include #include using ::testing::InSequence; using ::testing::Invoke; using ::testing::_; using ::testing::AtLeast; namespace { class CompTimerTestCallbackDispatchTable { public: CompTimerTestCallbackDispatchTable () {}; virtual ~CompTimerTestCallbackDispatchTable () {}; virtual bool callback1 (unsigned int num) = 0; virtual bool callback2 (unsigned int num) = 0; virtual bool callback3 (unsigned int num) = 0; protected: }; class MockCompTimerTestCallbackDispatchTable : public CompTimerTestCallbackDispatchTable, boost::noncopyable { public: MOCK_METHOD1 (callback1, bool (unsigned int)); MOCK_METHOD1 (callback2, bool (unsigned int)); MOCK_METHOD1 (callback3, bool (unsigned int)); MockCompTimerTestCallbackDispatchTable (const Glib::RefPtr &ml) : CompTimerTestCallbackDispatchTable (), mMainLoop (ml) { memset (&mCallsCounter, 0, sizeof (mCallsCounter)); ON_CALL (*this, callback1 (_)).WillByDefault (Invoke (this, &MockCompTimerTestCallbackDispatchTable::QuitIfLast)); ON_CALL (*this, callback2 (_)).WillByDefault (Invoke (this, &MockCompTimerTestCallbackDispatchTable::QuitIfLast)); ON_CALL (*this, callback3 (_)).WillByDefault (Invoke (this, &MockCompTimerTestCallbackDispatchTable::QuitIfLast)); }; void setMax (unsigned int timerId, int maxCalls) { mCallsCounter[timerId].maxCalls = maxCalls; } private: Glib::RefPtr mMainLoop; class _counter { public: unsigned int calls; int maxCalls; } mCallsCounter[3]; bool QuitIfLast (unsigned int num) { mCallsCounter[num].calls++; if (mCallsCounter[num].maxCalls < 0 || static_cast (mCallsCounter[num].maxCalls) == mCallsCounter[num].calls) { /* We are the last timer, quit the main loop */ if (TimeoutHandler::Default ()->timers ().size () == 0) { mMainLoop->quit (); return false; } else if (mCallsCounter[num].maxCalls) return false; } return true; }; }; class CompTimerTestCallback: public CompTimerTest { public: CompTimerTestCallback () : mLastAdded (0), mDispatchTable (new MockCompTimerTestCallbackDispatchTable (ml)) { } ~CompTimerTestCallback () { delete mDispatchTable; } protected: unsigned int mLastAdded; MockCompTimerTestCallbackDispatchTable *mDispatchTable; void AddTimer (unsigned int min, unsigned int max, const boost::function &callback, int maxAllowedCalls) { timers.push_back (new CompTimer ()); timers.back ()->setTimes (min, max); timers.back ()->setCallback (callback); ASSERT_FALSE (callback.empty ()); /* TimeoutHandler::timers should be empty */ EXPECT_TRUE (TimeoutHandler::Default ()->timers ().empty ()) << "timers list is not empty"; mDispatchTable->setMax (mLastAdded, maxAllowedCalls); mLastAdded++; } void Run () { for (std::deque ::iterator it = timers.begin (); it != timers.end (); ++it) (*it)->start (); /* TimeoutHandler::timers should have the timer that * is going to trigger first at the front of the * list and the last timer at the back */ if (TimeoutHandler::Default ()->timers ().front () != timers.back ()) { RecordProperty ("TimeoutHandler::Default ().size", TimeoutHandler::Default ()->timers ().size ()); RecordProperty ("TimeoutHandler::Default ().front->minLeft", TimeoutHandler::Default ()->timers ().front ()->minLeft()); RecordProperty ("TimeoutHandler::Default ().front->maxLeft", TimeoutHandler::Default ()->timers ().front ()->maxLeft()); RecordProperty ("TimeoutHandler::Default ().front->minTime", TimeoutHandler::Default ()->timers ().front ()->minTime()); RecordProperty ("TimeoutHandler::Default ().front->maxTime", TimeoutHandler::Default ()->timers ().front ()->maxTime()); RecordProperty ("TimeoutHandler::Default ().back->minLeft", TimeoutHandler::Default ()->timers ().back ()->minLeft()); RecordProperty ("TimeoutHandler::Default ().back->maxLeft", TimeoutHandler::Default ()->timers ().back ()->maxLeft()); RecordProperty ("TimeoutHandler::Default ().back->minTime", TimeoutHandler::Default ()->timers ().back ()->minTime()); RecordProperty ("TimeoutHandler::Default ().back->maxTime", TimeoutHandler::Default ()->timers ().back ()->maxTime()); FAIL () << "timer with the least time is not at the front"; } if (TimeoutHandler::Default ()->timers ().back () != timers.front ()) { FAIL () << "timer with the most time is not at the back"; } ml->run (); } void SetUp () { CompTimerTest::SetUp (); ::sleep (1); } void TearDown () { CompTimerTest::TearDown (); } }; TEST_F(CompTimerTestCallback, TimerOrder) { AddTimer (1000, 1100, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback1, mDispatchTable, 0), 3); AddTimer (500, 900, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback2, mDispatchTable, 1), 6); AddTimer (0, 0, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback3, mDispatchTable, 2), 10); /* TimeoutHandler::timers should be empty since no timers have started */ ASSERT_TRUE (TimeoutHandler::Default ()->timers ().empty ()) << "timers list is not empty"; InSequence s; EXPECT_CALL (*mDispatchTable, callback3 (2)).Times (10); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); Run (); } TEST_F(CompTimerTestCallback, NoZeroStarvation) { AddTimer (100, 110, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback1, mDispatchTable, 0), 1); AddTimer (50, 90, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback2, mDispatchTable, 1), 1); AddTimer (0, 0, boost::bind (&MockCompTimerTestCallbackDispatchTable::callback3, mDispatchTable, 2), -1); EXPECT_CALL (*mDispatchTable, callback3 (2)).Times (AtLeast (1)); EXPECT_CALL (*mDispatchTable, callback2 (1)).Times (1); EXPECT_CALL (*mDispatchTable, callback1 (0)).Times (1); Run (); } } ./src/timer/tests/test-timer.h0000644000004100000410000000351713246301623016570 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_TEST_TIMER_H #define _COMPIZ_TEST_TIMER_H #include #include #include #include #include #include #include #include #include class CompTimerTest : public ::testing::Test { public: CompTimerTest (); virtual ~CompTimerTest (); virtual void SetUp (); Glib::RefPtr mc; Glib::RefPtr ml; Glib::RefPtr ts; std::deque timers; int lastTimerTriggered; }; #endif ./src/timer/tests/while-calling/0000755000004100000410000000000013246301623017033 5ustar www-datawww-data./src/timer/tests/while-calling/src/0000755000004100000410000000000013246301624017623 5ustar www-datawww-data./src/timer/tests/while-calling/src/test-timer-set-times-while-calling.cpp0000644000004100000410000000752313246301623027057 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include class CompTimerTestSetTimes: public CompTimerTest { protected: int mlastTimerTriggered; static void* run (void* cb) { if (cb == NULL) { return NULL; } static_cast(cb)->ml->run(); return NULL; } pthread_t mmainLoopThread; std::list mtriggeredTimers; void recordTimers () { for (std::list::iterator it = TimeoutHandler::Default()->timers().begin(); it != TimeoutHandler::Default()->timers().end(); ++it) { CompTimer *t = (*it); RecordProperty("minLeft", t->minLeft()); RecordProperty("maxLeft", t->maxLeft()); RecordProperty("minTime", t->minTime()); RecordProperty("maxTime", t->maxTime()); } } bool cb (int timernum, CompTimer* t1, CompTimer* t2, CompTimer* t3) { cb_(timernum,t1,t2,t3); return(true); } void cb_ (int timernum, CompTimer* t1, CompTimer* t2, CompTimer* t3) { recordTimers(); if (mlastTimerTriggered == 0 && timernum == 1) { /* Change the timeout time of the second timer to be after the third */ t2->setTimes(4000, 4100); recordTimers(); /* Check if it is now at the back of the timeout list */ ASSERT_EQ( TimeoutHandler::Default()->timers().back(), t2 ); } else if (mlastTimerTriggered == 1 && timernum == 2) { recordTimers(); FAIL() << "timer with a higher timeout time got triggered " "before a timer with a lower timeout time"; } else if (mlastTimerTriggered == 2 && timernum != 1) { recordTimers(); FAIL() << "timer with higher timeout time didn't get " "triggered after a lower timeout time"; } mlastTimerTriggered = timernum; } void SetUp () { CompTimerTest::SetUp(); mlastTimerTriggered = 0; CompTimer *t1, *t2, *t3; t1 = new CompTimer(); t2 = new CompTimer(); t3 = new CompTimer(); timers.push_back(t1); timers.push_back(t2); timers.push_back(t3); t1->setCallback( boost::bind(&CompTimerTestSetTimes::cb, this, 1, t1, t2, t3)); t1->setTimes(1000, 1100); t1->start(); t2->setCallback( boost::bind(&CompTimerTestSetTimes::cb, this, 2, t1, t2, t3)); t2->setTimes(2000, 2100); t2->start(); t3->setCallback( boost::bind(&CompTimerTestSetTimes::cb, this, 3, t1, t2, t3)); t3->setTimes(3000, 3100); t3->start(); ASSERT_EQ( 0, pthread_create(&mmainLoopThread, NULL, CompTimerTestSetTimes::run, this)); } void TearDown () { ml->quit(); pthread_join(mmainLoopThread, NULL); CompTimerTest::TearDown(); } }; TEST_F(CompTimerTestSetTimes, SetTimesWhileCalling) { ::sleep(4); // Just a dummy forcing instantiation of fixture. } ./src/timer/tests/diffs/0000755000004100000410000000000013246301623015407 5ustar www-datawww-data./src/timer/tests/diffs/src/0000755000004100000410000000000013246301624016177 5ustar www-datawww-data./src/timer/tests/diffs/src/test-timer-diffs.cpp0000644000004100000410000000630013246301623022067 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include class CompTimerTestDiffs: public CompTimerTest { protected: static void* run (void* cb) { if (cb == NULL) { return NULL; } static_cast(cb)->ml->run(); return NULL; } pthread_t mmainLoopThread; std::list mtriggeredTimers; bool cb (int timernum, CompTimer* t1, CompTimer* t2, CompTimer* t3) { if (timernum == 1 || timernum == 2 || timernum == 3) { RecordProperty("executing timer", timernum); RecordProperty("t1->minLeft", t1->minLeft()); RecordProperty("t1->maxLeft", t1->maxLeft()); RecordProperty("t1->minTime", t1->minTime()); RecordProperty("t1->maxTime", t1->maxTime()); RecordProperty("t3->minLeft", t3->minLeft()); RecordProperty("t3->maxLeft", t3->maxLeft()); RecordProperty("t3->minTime", t3->minTime()); RecordProperty("t3->maxTime", t3->maxTime()); RecordProperty("t3->minLeft", t3->minLeft()); RecordProperty("t3->maxLeft", t3->maxLeft()); RecordProperty("t3->minTime", t3->minTime()); RecordProperty("t3->maxTime", t3->maxTime()); } return false; } void SetUp () { CompTimerTest::SetUp(); mtriggeredTimers.clear(); CompTimer *t1, *t2, *t3; t1 = new CompTimer(); t2 = new CompTimer(); t3 = new CompTimer(); timers.push_back(t1); timers.push_back(t2); timers.push_back(t3); t1->setCallback( boost::bind(&CompTimerTestDiffs::cb, this, 1, t1, t2, t3)); t1->setTimes(1000, 1100); t1->start(); t2->setCallback( boost::bind(&CompTimerTestDiffs::cb, this, 2, t1, t2, t3)); t2->setTimes(2000, 2100); t2->start(); t3->setCallback( boost::bind(&CompTimerTestDiffs::cb, this, 3, t1, t2, t3)); t3->setTimes(3000, 3100); t3->start(); ASSERT_EQ( 0, pthread_create(&mmainLoopThread, NULL, CompTimerTestDiffs::run, this)); ::sleep(4); } void TearDown () { ml->quit(); pthread_join(mmainLoopThread, NULL); CompTimerTest::TearDown(); } }; TEST_F(CompTimerTestDiffs,TimerDiffs) {} ./src/timer/tests/test-timer.cpp0000644000004100000410000000372413246301623017123 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" CompTimerTest::CompTimerTest () : mc(Glib::MainContext::get_default()), ml(Glib::MainLoop::create(mc, false)), ts(CompTimeoutSource::create(mc)), lastTimerTriggered(0) { } CompTimerTest::~CompTimerTest () { while (timers.size()) { CompTimer *t = timers.front(); timers.pop_front(); delete t; } TimeoutHandler::SetDefault (NULL); ts->destroy (); // calls delete this. Seriously. } class ForceGSliceMalloc { public: ForceGSliceMalloc () { setenv ("G_SLICE", "always-malloc", 1); } ~ForceGSliceMalloc () { unsetenv ("G_SLICE"); } }; namespace { ForceGSliceMalloc fgm; } void CompTimerTest::SetUp () { TimeoutHandler *th = new TimeoutHandler(); TimeoutHandler::SetDefault(th); } ./src/timer/tests/set-values/0000755000004100000410000000000013246301623016404 5ustar www-datawww-data./src/timer/tests/set-values/src/0000755000004100000410000000000013246301624017174 5ustar www-datawww-data./src/timer/tests/set-values/src/test-timer-set-values.cpp0000644000004100000410000000331613246301623024065 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "test-timer.h" #include TEST_F(CompTimerTest, TimerSetValues) { CompTimer* t1 = new CompTimer (); t1->setTimes (100, 90); t1->start (); usleep (100000); /* minLeft and maxLeft are now * real-time, so wait the guaranteed * expiry time in order to check them * for an accurate value of zero */ ASSERT_EQ (t1->minTime(), 100); ASSERT_EQ (t1->maxTime(), 100); ASSERT_EQ (t1->minLeft(), 0); ASSERT_EQ (t1->maxLeft(), 0); delete t1; } ./src/main.cpp0000644000004100000410000001420213246301623013461 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "privatescreen.h" #include "privatestackdebugger.h" namespace { bool autoAddCCP = true; } void CompManager::usage () { printf ("Usage: %s [OPTIONS] [PLUGINS ...]\n" "Options:\n" " --debug Enable debug mode\n" " --display DISPLAY Connect to X display DISPLAY (instead of $DISPLAY)\n" " --help Show this summary\n" " --keep-desktop-hints Retain existing desktop hints\n" " --no-auto-add-ccp Do not automatically load the ccp plugin\n" " --replace Replace any existing window managers\n" " --send-startup-message Sends a message to connected clients on startup completion.\n" " --sm-client-id ID Session management client ID\n" " --sm-disable Disable session management\n" " --sync Make all X calls synchronous\n" " --version Show the program version\n" , programName); } static void chldSignalHandler (int sig) { int status; switch (sig) { case SIGCHLD: waitpid (-1, &status, WNOHANG | WUNTRACED); break; } } bool CompManager::parseArguments (int argc, char **argv) { for (int i = 1; i < argc; i++) { if (!strcmp (argv[i], "--help")) { usage (); return false; } else if (!strcmp (argv[i], "--version")) { printf (PACKAGE_STRING "\n"); return false; } else if (!strcmp (argv[i], "--debug")) { debugOutput = true; } else if (!strcmp (argv[i], "--sync")) { synchronousX = true; } else if (!strcmp (argv[i], "--display")) { if (i + 1 < argc) displayName = argv[++i]; } else if (!strcmp (argv[i], "--keep-desktop-hints")) { useDesktopHints = true; } else if (!strcmp (argv[i], "--no-auto-add-ccp")) { compLogMessage ("core", CompLogLevelInfo, "running without the ccp plugin, no settings will be loaded"); autoAddCCP = false; } else if (!strcmp (argv[i], "--replace")) { replaceCurrentWm = true; } else if (!strcmp (argv[i], "--send-startup-message")) { sendStartupMessage = true; } else if (!strcmp (argv[i], "--sm-disable")) { disableSm = true; } else if (!strcmp (argv[i], "--sm-client-id")) { if (i + 1 < argc) clientId = argv[++i]; } else if (*argv[i] == '-') { compLogMessage ("core", CompLogLevelWarn, "Unknown option '%s'\n", argv[i]); } else { initialPlugins.push_back (argv[i]); } } return true; } CompManager::CompManager () : disableSm (false), clientId (NULL), displayName (NULL) { } bool CompManager::init () { std::auto_ptr screen(new CompScreenImpl ()); if (screen->createFailed ()) { return false; } ::screen = screen.get(); modHandler = new ModifierHandler (); if (initialPlugins.empty () && autoAddCCP) initialPlugins.push_back ("ccp"); if (!screen->init (displayName)) return false; if (!disableSm) { if (clientId == NULL) { char *desktop_autostart_id = getenv ("DESKTOP_AUTOSTART_ID"); if (desktop_autostart_id != NULL) clientId = strdup (desktop_autostart_id); unsetenv ("DESKTOP_AUTOSTART_ID"); } CompSession::init (clientId); } screen.release (); return true; } void CompManager::run () { screen->eventLoop (); } void CompManager::fini () { if (!disableSm) CompSession::close (); StackDebugger::SetDefault (NULL); delete screen; delete modHandler; } /* * Try to detect the true bin directory compiz was run from and store it * in environment variable COMPIZ_BIN_PATH. If all else fails, don't define it. */ static void detectCompizBinPath (char **argv) { const char *bin = argv[0]; #ifdef __linux__ char exe[PATH_MAX]; ssize_t len = readlink ("/proc/self/exe", exe, sizeof(exe)-1); if (len > 0) { exe[len] = '\0'; bin = exe; } #endif if (strchr (bin, '/')) // dirname needs a '/' to work reliably { // We need a private copy for dirname() to modify char *tmpBin = strdup (bin); if (tmpBin) { const char *binDir = dirname (tmpBin); if (binDir) { char env[PATH_MAX]; snprintf (env, sizeof(env)-1, "COMPIZ_BIN_PATH=%s/", binDir); putenv (strdup (env)); // parameter needs to be leaked! } free (tmpBin); } } } int main (int argc, char **argv) { CompManager manager; programName = argv[0]; programArgc = argc; programArgv = argv; detectCompizBinPath (argv); signal (SIGCHLD, chldSignalHandler); if (!manager.parseArguments (argc, argv)) return 0; if (!manager.init ()) return 1; manager.run (); manager.fini (); if (restartSignal) { execvp (programName, programArgv); return 1; } return 0; } ./src/eventsource.cpp0000644000004100000410000000466013246301623015106 0ustar www-datawww-data/* * Copyright © 2010 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Jason Smith * : Sam Spilsbury */ #include "privateeventsource.h" #include "core/screen.h" Glib::RefPtr CompEventSource::create () { return Glib::RefPtr (new CompEventSource (screen->dpy (), ConnectionNumber (screen->dpy ()))); } sigc::connection CompEventSource::connect (const sigc::slot &slot) { return connect_generic (slot); } CompEventSource::CompEventSource (Display *dpy, int fd) : Glib::Source (), mDpy (dpy), mConnectionFD (fd) { mPollFD.set_fd (mConnectionFD); mPollFD.set_events (Glib::IO_IN); set_priority (G_PRIORITY_DEFAULT); add_poll (mPollFD); set_can_recurse (true); connect (sigc::mem_fun (this, &CompEventSource::callback)); } CompEventSource::~CompEventSource () { } bool CompEventSource::callback () { screen->processEvents (); return true; } bool CompEventSource::prepare (int &timeout) { timeout = -1; return XPending (mDpy); } bool CompEventSource::check () { if (mPollFD.get_revents () & Glib::IO_IN) return XPending (mDpy); return false; } bool CompEventSource::dispatch (sigc::slot_base *slot) { return (*static_cast *> (slot)) (); } ./src/asyncserverwindow.h0000644000004100000410000000354013246301623016001 0ustar www-datawww-data/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_ASYNC_SERVER_WINDOW_H #define _COMPIZ_ASYNC_SERVER_WINDOW_H #include namespace compiz { namespace window { class AsyncServerWindow { public: virtual ~AsyncServerWindow () {}; virtual int requestConfigureOnClient (const XWindowChanges &xwc, unsigned int valueMask) = 0; virtual int requestConfigureOnWrapper (const XWindowChanges &xwc, unsigned int valueMask) = 0; virtual int requestConfigureOnFrame (const XWindowChanges &xwc, unsigned int valueMask) = 0; virtual void sendSyntheticConfigureNotify () = 0; virtual bool hasCustomShape () const = 0; }; } } #endif ./src/stackdebugger.cpp0000644000004100000410000003357113246301623015361 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include "privatestackdebugger.h" #include "privatescreen.h" #include "privatewindow.h" #include namespace { StackDebugger * gStackDebugger = NULL; } StackDebugger * StackDebugger::Default () { return gStackDebugger; } void StackDebugger::SetDefault (StackDebugger *dbg) { if (gStackDebugger) delete gStackDebugger; gStackDebugger = dbg; } StackDebugger::StackDebugger (Display *dpy, Window root, FetchXEventInterface *fetchXEvent) : mServerNChildren (0), mServerChildren (NULL), mWindowsChanged (false), mServerWindowsChanged (false), mRoot (root), mDpy (dpy), mFetchXEvent (fetchXEvent), mTimeoutRequired (false) { } StackDebugger::~StackDebugger () { if (mServerChildren) { XFree (mServerChildren); mServerChildren = NULL; mServerNChildren = 0; } } bool StackDebugger::timedOut () { return mTimeoutRequired; } void StackDebugger::removeServerWindow (Window id) { /* Find the toplevel window in the list and remove it */ for (CompWindowList::iterator it = mLastServerWindows.begin (); it != mLastServerWindows.end (); ++it) { if ((*it)->id () == id) { mLastServerWindows.erase (it); break; } } } void StackDebugger::overrideRedirectRestack (Window toplevel, Window sibling) { CompWindow *tl = screen->findWindow (toplevel); removeServerWindow (toplevel); /* Find the sibling of this window and insert above it or at * the bottom if the sibling is 0 */ if (sibling) { for (CompWindowList::iterator it = mLastServerWindows.begin (); it != mLastServerWindows.end (); ++it) { if (sibling == (*it)->id () || sibling == (*it)->frame ()) { mLastServerWindows.insert (++it, tl); break; } } } else mLastServerWindows.push_front (tl); } bool StackDebugger::getNextEvent (XEvent &ev) { if (mEvents.empty ()) return false; ev = mEvents.front (); mEvents.pop_front (); return true; } void StackDebugger::loadStack (CompWindowList &serverWindows, bool wait) { Window rootRet, parentRet; if (mServerChildren) XFree (mServerChildren); XSync (mDpy, FALSE); XGrabServer (mDpy); XQueryTree (mDpy, mRoot, &rootRet, &parentRet, &mServerChildren, &mServerNChildren); unsigned int n = XEventsQueued (mDpy, QueuedAfterFlush); mEvents.clear (); mEvents.resize (n); std::list ::iterator it = mEvents.begin (); while (it != mEvents.end ()) { mFetchXEvent->getNextXEvent ((*it)); ++it; } XSync (mDpy, FALSE); /* It is possible that X might not be keeping up with us, so * we should give it about 300 ms in case the stacks are out of sync * in order to deliver any more events that might be pending */ mTimeoutRequired = false; mLastServerWindows = serverWindows; if (mServerNChildren != serverWindows.size () && wait) { struct pollfd pfd; pfd.events = POLLIN; pfd.revents = 0; pfd.fd = ConnectionNumber (mDpy); poll (&pfd, 1, 300); XEvent e; while (mFetchXEvent->getNextXEvent (e)) mEvents.push_back (e); mTimeoutRequired = true; } mDestroyedFrames.clear (); XUngrabServer (mDpy); XSync (mDpy, FALSE); } void StackDebugger::addDestroyedFrame (Window f) { mDestroyedFrames.push_back (f); } void StackDebugger::removeDestroyedFrame (Window f) { mDestroyedFrames.remove (f); } bool StackDebugger::cmpStack (CompWindowList &windows, CompWindowList &serverWindows, bool verbose) { std::vector serverSideWindows; CompWindowList::reverse_iterator lrrit = windows.rbegin (); CompWindowList::reverse_iterator lsrit = mLastServerWindows.rbegin (); unsigned int i = 0; bool err = false; for (unsigned int n = 0; n < mServerNChildren; n++) { if (std::find (mDestroyedFrames.begin (), mDestroyedFrames.end (), mServerChildren[n]) == mDestroyedFrames.end ()) serverSideWindows.push_back (mServerChildren[n]); } if (verbose) compLogMessage ("core", CompLogLevelDebug, "sent | recv | server |"); for (;(lrrit != windows.rend () || lsrit != mLastServerWindows.rend () || i != serverSideWindows.size ());) { Window lrXid = 0; Window lsXid = 0; Window sXid = 0; if (lrrit != windows.rend ()) lrXid = (*lrrit)->priv->frame ? (*lrrit)->priv->frame : (*lrrit)->id (); if (lsrit != mLastServerWindows.rend ()) lsXid = (*lsrit)->priv->frame ? (*lsrit)->priv->frame : (*lsrit)->id (); if (i != serverSideWindows.size ()) sXid = serverSideWindows[serverSideWindows.size () - (i + 1)]; if (verbose) compLogMessage ("core", CompLogLevelDebug, "id 0x%x id 0x%x id 0x%x %s", (unsigned int) lsXid, (unsigned int) lrXid, (unsigned int) sXid, (lrXid != sXid) ? " /!\\ " : ""); if (lrXid != sXid) err = true; if (lrrit != windows.rend ()) ++lrrit; if (lsrit != mLastServerWindows.rend()) ++lsrit; if (i != serverSideWindows.size ()) i++; } return err; } /* Checks the sanity of the list of windows last sent to the server. * * There are a few stacking "layers" here. From top to bottom: * - 1) Docks stacked above toplevel windows which are stacked * above fullscreen windows * - 2) "Keep above" toplevel windows above fullscreen windows * where a toplevel is in focus * - 3) Toplevel windows in focus above fullscreen windows * - 4) Fullscreen windows * - 5) Dock windows * - 6) Keep above windows * - 7) Toplevel windows * - 8) Docks which are marked "Keep Below" * - 9) "Keep Below" windows * - 10) Desktop windows * * There are also a few rules which apply here: * - 1) Dock windows should always be above normal windows * except if marked keep below on any layer. * - 2) Dock windows should ONLY be on one layer at a time, * eg if they are on layer 1 then there cannot * also be dock windows on layer 5 (except in the * case of below dock windows on layer 8) * - 3) Fullscreen windows must always be above docks when in * focus, no matter if there is another window with "Keep Above" * - 4) Focused windows take priority over fullscreen windows and * docks must always be above them (see rule 1) * * As we pass through each layer, this function flags each one from * lowest being the most bits set to highest being the least bits * set. If a window violates this it raises a warning */ #define DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN 0xffffffff >> 1 #define KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN 0xffffffff >> 2 #define TOPLEVELS_ABOVE_FULLSCREEN 0xffffffff >> 3 #define FULLSCREEN 0xffffffff >> 4 #define DOCKS 0xffffffff >> 5 #define KEEP_ABOVE 0xffffffff >> 6 #define TOPLEVELS 0xffffffff >> 7 #define DOCKS_BELOW 0xffffffff >> 8 #define KEEP_BELOW 0xffffffff >> 9 #define DESKTOP 0xffffffff >> 10 namespace { bool setCurrentLayer (Window requestingWindow, int layer, int ¤t) { bool ret = false; /* Only allow steps down */ if ((current & layer) != layer) { ret = true; compLogMessage ("stackdebugger", CompLogLevelWarn, "0x%x requested invalid layer 0x%x", requestingWindow, layer, current); } current = layer; return ret; } } bool StackDebugger::checkSanity (CompWindowList &serverWindows, bool verbose) { int current = 0xffffffff; int oldCurrent = current; bool err = false; if (verbose) compLogMessage ("stackdebugger", CompLogLevelDebug, "processing new stack --------"); /* go backwards down the stack */ for (CompWindowList::reverse_iterator rit = serverWindows.rbegin (); rit != serverWindows.rend (); ++rit) { CompWindow *w = (*rit); /* Override redirect windows set all kinds * of crazy stuff and are required to stack * themselves so skip those */ if (w->overrideRedirect ()) continue; /* ignore non-override redirect unmanaged windows */ if (!w->managed ()) continue; /* ignore any windows that just got created */ if (!w->mapNum ()) continue; /* determine the current layer */ if (w->type () == CompWindowTypeDockMask) { if ((current & DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { bool fullscreenWindow = false; /* search down the stack to check if there is a fullscreen * window, otherwise we are not on the fullscreen layer */ for (CompWindow *rw = w->prev; rw; rw = rw->prev) { if (rw->type () & CompWindowTypeFullscreenMask) { fullscreenWindow = true; break; } } /* if there is no fullscreen window, change the layer */ if (!fullscreenWindow) err |= setCurrentLayer (w->id (), DOCKS, current); else err |= setCurrentLayer (w->id (), DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN, current); } else if (w->state () & CompWindowStateBelowMask) err |= setCurrentLayer (w->id (), DOCKS_BELOW, current); else err |= setCurrentLayer (w->id (), DOCKS, current); } else if (w->type () == CompWindowTypeFullscreenMask) { err |= setCurrentLayer (w->id (), FULLSCREEN, current); } else if (w->type () == CompWindowTypeDesktopMask) { err |= setCurrentLayer (w->id (), DESKTOP, current); } /* everything else that is not a fullscreen window or a desktop */ else { if (w->state () & CompWindowStateAboveMask) { if ((current & KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { bool fullscreenWindow = false; /* search down the stack to check if there is a fullscreen * window, otherwise we are not on the fullscreen layer */ for (CompWindow *rw = w->prev; rw; rw = rw->prev) { if (rw->type () & CompWindowTypeFullscreenMask) { fullscreenWindow = true; break; } } if (!fullscreenWindow) err |= setCurrentLayer (w->id (), KEEP_ABOVE, current); else err |= setCurrentLayer (w->id (), KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN, current); } else err |= setCurrentLayer (w->id (), KEEP_ABOVE, current); } else if (w->state () & CompWindowStateBelowMask) err |= setCurrentLayer (w->id (), KEEP_BELOW, current); else { if ((current & TOPLEVELS_ABOVE_FULLSCREEN) == TOPLEVELS_ABOVE_FULLSCREEN) { bool fullscreenWindow = false; /* search down the stack to check if there is a fullscreen * window, otherwise we are not on the fullscreen layer */ for (CompWindow *rw = w->prev; rw; rw = rw->prev) { if (rw->type () & CompWindowTypeFullscreenMask) { fullscreenWindow = true; break; } } if (!fullscreenWindow) err |= setCurrentLayer (w->id (), TOPLEVELS, current); else err |= setCurrentLayer (w->id (), TOPLEVELS_ABOVE_FULLSCREEN, current); } else err |= setCurrentLayer (w->id (), TOPLEVELS, current); } } if ((current & DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DOCKS_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN"); } else if ((current & KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) == KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer KEEP_ABOVE_TOPLEVELS_ABOVE_FULLSCREEN"); } else if ((current & TOPLEVELS_ABOVE_FULLSCREEN) == TOPLEVELS_ABOVE_FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer TOPLEVELS_ABOVE_FULLSCREEN"); } else if ((current & FULLSCREEN) == FULLSCREEN) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer FULLSCREEN"); } else if ((current & DOCKS) == DOCKS) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DOCKS"); } else if ((current & KEEP_ABOVE) == KEEP_ABOVE) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer KEEP_ABOVE"); } else if ((current & TOPLEVELS) == TOPLEVELS) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer TOPLEVELS"); } else if ((current & DOCKS_BELOW) == DOCKS_BELOW) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DOCKS_BELOW"); } else if ((current & KEEP_BELOW) == KEEP_BELOW) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer KEEP_BELOW"); } else if ((current & DESKTOP) == DESKTOP) { if (verbose && current != oldCurrent) compLogMessage ("stackdebugger", CompLogLevelDebug, "on layer DESKTOP"); } oldCurrent = current; } return err; } ./src/configurerequestbuffer.cpp0000644000004100000410000002242013246301623017322 0ustar www-datawww-data/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include "asyncserverwindow.h" #include "configurerequestbuffer-impl.h" #ifndef foreach #define foreach BOOST_FOREACH #endif namespace crb = compiz::window::configure_buffers; namespace cw = compiz::window; class crb::ConfigureRequestBuffer::Private { public: typedef crb::Lockable::Weak LockObserver; Private (cw::AsyncServerWindow *asyncServerWindow, cw::SyncServerWindow *syncServerWindow, const crb::ConfigureRequestBuffer::LockFactory &lockFactory) : clientChangeMask (0), wrapperChangeMask (0), frameChangeMask (0), sendSyntheticConfigure (false), lockCount (0), asyncServerWindow (asyncServerWindow), syncServerWindow (syncServerWindow), lockFactory (lockFactory) { } void dispatchConfigure (bool force = false); XWindowChanges clientChanges; unsigned int clientChangeMask; XWindowChanges wrapperChanges; unsigned int wrapperChangeMask; XWindowChanges frameChanges; unsigned int frameChangeMask; bool sendSyntheticConfigure; unsigned int lockCount; cw::AsyncServerWindow *asyncServerWindow; cw::SyncServerWindow *syncServerWindow; crb::ConfigureRequestBuffer::LockFactory lockFactory; std::vector locks; }; void crb::ConfigureRequestBuffer::Private::dispatchConfigure (bool force) { const unsigned int allEventMasks = 0x7f; bool immediate = frameChangeMask & (CWStackMode | CWSibling); /* This is a stop-gap solution for not having a plugin API to * query the window shape. Once we have that, we can safely * remove these and require the queue to be unlocked when that * happens. Its a separate unit of work for improving resize * performance anyways. */ immediate |= (frameChangeMask & (CWWidth | CWHeight | CWBorderWidth)); immediate |= (wrapperChangeMask & (CWWidth | CWHeight | CWBorderWidth | CWX | CWY)); immediate |= (clientChangeMask & (CWWidth | CWHeight | CWBorderWidth | CWX | CWY)); immediate |= force; bool clientDispatch = (clientChangeMask & allEventMasks); bool wrapperDispatch = (wrapperChangeMask & allEventMasks); bool frameDispatch = (frameChangeMask & allEventMasks); bool dispatch = !lockCount && (clientDispatch || wrapperDispatch || frameDispatch || sendSyntheticConfigure); if (dispatch || immediate) { if (frameDispatch) { asyncServerWindow->requestConfigureOnFrame (frameChanges, frameChangeMask); frameChangeMask = 0; } if (wrapperDispatch) { asyncServerWindow->requestConfigureOnWrapper (wrapperChanges, wrapperChangeMask); wrapperChangeMask = 0; } if (clientDispatch) { asyncServerWindow->requestConfigureOnClient (clientChanges, clientChangeMask); clientChangeMask = 0; } if (sendSyntheticConfigure) { asyncServerWindow->sendSyntheticConfigureNotify (); sendSyntheticConfigure = false; } foreach (const LockObserver &lock, locks) { crb::Lockable::Ptr strongLock (lock.lock ()); /* We might be in a lock's destructor so check * if this can really be re-locked, if not, its * no big deal as the lock is going away anyways */ if (strongLock) strongLock->lock (); } } } void crb::ConfigureRequestBuffer::freeze () { priv->lockCount++; assert (priv->lockCount <= priv->locks.size ()); } void crb::ConfigureRequestBuffer::release () { assert (priv->lockCount); priv->lockCount--; priv->dispatchConfigure (); } namespace { void applyChangeToXWC (const XWindowChanges &from, XWindowChanges &to, unsigned int mask) { if (mask & CWX) to.x = from.x; if (mask & CWY) to.y = from.y; if (mask & CWWidth) to.width = from.width; if (mask & CWHeight) to.height = from.height; if (mask & CWBorderWidth) to.border_width = from.border_width; if (mask & CWSibling) to.sibling = from.sibling; if (mask & CWStackMode) to.stack_mode = from.stack_mode; } } void crb::ConfigureRequestBuffer::pushClientRequest (const XWindowChanges &xwc, unsigned int mask) { applyChangeToXWC (xwc, priv->clientChanges, mask); priv->clientChangeMask |= mask; priv->dispatchConfigure (); } void crb::ConfigureRequestBuffer::pushWrapperRequest (const XWindowChanges &xwc, unsigned int mask) { applyChangeToXWC (xwc, priv->wrapperChanges, mask); priv->wrapperChangeMask |= mask; priv->dispatchConfigure (); } void crb::ConfigureRequestBuffer::pushFrameRequest (const XWindowChanges &xwc, unsigned int mask) { applyChangeToXWC (xwc, priv->frameChanges, mask); priv->frameChangeMask |= mask; priv->dispatchConfigure (); } void crb::ConfigureRequestBuffer::pushSyntheticConfigureNotify () { priv->sendSyntheticConfigure = true; priv->dispatchConfigure (); } crb::Releasable::Ptr crb::ConfigureRequestBuffer::obtainLock () { crb::BufferLock::Ptr lock (priv->lockFactory (this)); priv->locks.push_back (crb::Lockable::Weak (lock)); lock->lock (); return lock; } namespace { bool isLock (const crb::Lockable::Weak &lockable, crb::BufferLock *lock) { crb::Lockable::Ptr strongLockable (lockable.lock ()); /* Asserting that the lock did not go away without telling * us first */ assert (strongLockable.get ()); if (strongLockable.get () == lock) return true; return false; } } void crb::ConfigureRequestBuffer::untrackLock (crb::BufferLock *lock) { std::remove_if (priv->locks.begin (), priv->locks.end (), boost::bind (isLock, _1, lock)); } bool crb::ConfigureRequestBuffer::queryAttributes (XWindowAttributes &attrib) { priv->dispatchConfigure (true); return priv->syncServerWindow->queryAttributes (attrib); } bool crb::ConfigureRequestBuffer::queryFrameAttributes (XWindowAttributes &attrib) { priv->dispatchConfigure (true); return priv->syncServerWindow->queryFrameAttributes (attrib); } /* This is more or less of a stop-gap for the fact that * when resizing window we re-query the window shape * and apply that to the frame. That's a separate unit of * work and should be dealt with separately. For now, force * a release of the queue whenever we do that so that * XShapeGetRectangles doesn't return an unexpected value */ XRectangle * crb::ConfigureRequestBuffer::queryShapeRectangles (int kind, int *count, int *ordering) { priv->dispatchConfigure (true); return priv->syncServerWindow->queryShapeRectangles (kind, count, ordering); } void crb::ConfigureRequestBuffer::forceRelease () { priv->dispatchConfigure (true); } crb::ConfigureRequestBuffer::ConfigureRequestBuffer (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const crb::ConfigureRequestBuffer::LockFactory &factory) : priv (new crb::ConfigureRequestBuffer::Private (asyncServerWindow, syncServerWindow, factory)) { } compiz::window::configure_buffers::Buffer::Ptr crb::ConfigureRequestBuffer::Create (AsyncServerWindow *asyncServerWindow, SyncServerWindow *syncServerWindow, const LockFactory &factory) { return crb::Buffer::Ptr (new crb::ConfigureRequestBuffer (asyncServerWindow, syncServerWindow, factory)); } class crb::ConfigureBufferLock::Private { public: Private (crb::CountedFreeze *freezable) : freezable (freezable), armed (false) { } crb::CountedFreeze *freezable; bool armed; }; crb::ConfigureBufferLock::ConfigureBufferLock (crb::CountedFreeze *freezable) : priv (new crb::ConfigureBufferLock::Private (freezable)) { } crb::ConfigureBufferLock::~ConfigureBufferLock () { release (); } void crb::ConfigureBufferLock::lock () { if (!priv->armed) priv->freezable->freeze (); priv->armed = true; } void crb::ConfigureBufferLock::release () { if (priv->armed) priv->freezable->release (); priv->armed = false; } ./src/output.cpp0000644000004100000410000000436713246301623014110 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include CompOutput::CompOutput () { mName = ""; mId = ~0; } CompString CompOutput::name () const { return mName; } unsigned int CompOutput::id () const { return mId; } const CompRect& CompOutput::workArea () const { return mWorkArea; } void CompOutput::setWorkArea (const CompRect &workarea) { mWorkArea = workarea; if (workarea.x () < static_cast (x1 ())) mWorkArea.setX (x1 ()); if (workarea.y () < static_cast (y1 ())) mWorkArea.setY (y1 ()); if (workarea.x2 () > static_cast (x2 ())) mWorkArea.setWidth (x2 () - mWorkArea.x ()); if (workarea.y2 () > static_cast (y2 ())) mWorkArea.setHeight (y2 () - mWorkArea.y ()); } void CompOutput::setGeometry (int x, int y, int width, int height) { CompRect::setGeometry (x, y, width, height); mWorkArea = *this; } void CompOutput::setId (CompString name, unsigned int id) { mName = name; mId = id; } ./src/propertywriter.cpp0000644000004100000410000001254313246301623015664 0ustar www-datawww-data/* * Copyright © 2010 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Sam Spilsbury */ #include #include PropertyWriter::PropertyWriter () { } PropertyWriter::PropertyWriter (CompString propName, CompOption::Vector &readTemplate) { mPropertyValues = readTemplate; mAtom = XInternAtom (screen->dpy (), propName.c_str (), 0); } void PropertyWriter::setReadTemplate (const CompOption::Vector &readTemplate) { mPropertyValues = readTemplate; } const CompOption::Vector & PropertyWriter::getReadTemplate () { return mPropertyValues; } bool PropertyWriter::updateProperty (Window id, CompOption::Vector &propertyData, int type) { int count = 0; if (type != XA_STRING) { long int data[propertyData.size ()]; foreach (CompOption &o, propertyData) { switch (o.type ()) { case CompOption::TypeBool: data[count] = o.value ().b (); break; case CompOption::TypeInt: data[count] = o.value ().i (); break; default: data[count] = 0; break; } count++; } XChangeProperty (screen->dpy (), id, mAtom, type, 32, PropModeReplace, (unsigned char *)data, propertyData.size ()); } else { char * data[propertyData.size ()]; XTextProperty prop; bool ok = true; foreach (CompOption &o, propertyData) { switch (o.type ()) { case CompOption::TypeString: data[count] = (char *) o.value ().s ().c_str (); break; default: data[count] = NULL; break; } count++; } for (int i = 0; i < count; i++) { if (data[i] == NULL) { ok = false; } } if (ok) { if (XStringListToTextProperty (data, count, &prop)) { XSetTextProperty (screen->dpy (), id, &prop, mAtom); XFree (prop.value); } } } return true; } void PropertyWriter::deleteProperty (Window id) { XDeleteProperty (screen->dpy (), id, mAtom); } const CompOption::Vector & PropertyWriter::readProperty (Window id) { Atom type; int retval, fmt; unsigned long nitems, exbyte; long int *data; if (mPropertyValues.empty ()) return mPropertyValues; retval = XGetWindowProperty (screen->dpy (), id, mAtom, 0, mPropertyValues.size (), False, XA_CARDINAL, &type, &fmt, &nitems, &exbyte, (unsigned char **)&data); if (retval == Success && !mPropertyValues.empty ()) { int count = 0; if (type == XA_CARDINAL && fmt == 32 && nitems == mPropertyValues.size ()) { foreach (CompOption &o, mPropertyValues) { CompOption::Value tmpVal; switch (mPropertyValues.at (count).type ()) { case CompOption::TypeBool: tmpVal = CompOption::Value ((bool) data[count]); o.set (tmpVal); break; case CompOption::TypeInt: tmpVal = CompOption::Value ((int) data[count]); o.set (tmpVal); break; default: tmpVal = CompOption::Value (CompOption::Value (0)); o.set (tmpVal); break; } count++; } XFree (data); return mPropertyValues; } else if (type == XA_STRING && fmt == 8) { XTextProperty tProp; retval = XGetTextProperty (screen->dpy (), id, &tProp, mAtom); if (tProp.value) { int retCount = 0; char **tData = NULL; XTextPropertyToStringList (&tProp, &tData, &retCount); if (retCount == (int) mPropertyValues.size ()) { foreach (CompOption &o, mPropertyValues) { CompOption::Value tmpVal; tmpVal = CompOption::Value (CompString ((char *) tData[count])); o.set (tmpVal); count++; } XFreeStringList (tData); XFree (data); XFree (tProp.value); return mPropertyValues; } else { XFreeStringList (tData); XFree (data); XFree (tProp.value); return nilValues; } } else { XFree (data); XFree (tProp.value); return nilValues; } } else if (fmt != 0) { XFree (data); } } else { return mPropertyValues; } return mPropertyValues; } ./src/tests/0000755000004100000410000000000013246301624013175 5ustar www-datawww-data./src/tests/CMakeLists.txt0000644000004100000410000000231013246301623015730 0ustar www-datawww-dataadd_executable (compiz_test_outputdevices test_outputdevices.cpp ) include_directories ( ${COMPIZ_MAIN_SOURCE_DIR} ${COMPIZ_MAIN_SOURCE_DIR}/rect/include ${COMPIZ_MAIN_SOURCE_DIR}/region/include ${COMPIZ_MAIN_SOURCE_DIR}/timer/include ${COMPIZ_MAIN_SOURCE_DIR}/pluginclasshandler/include ${COMPIZ_MAIN_SOURCE_DIR}/window/geometry/include ${COMPIZ_MAIN_SOURCE_DIR}/window/extents/include ${COMPIZ_MAIN_SOURCE_DIR}/servergrab/include ${COMPIZ_INCLUDE_DIRS} ) link_directories (${COMPIZ_MAIN_BINARY_DIR}) target_link_libraries (compiz_test_outputdevices -Wl,-start-group compiz_size compiz_output compiz_outputdevices compiz_rect compiz_region compiz_window_geometry -Wl,-end-group ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests(compiz_test_outputdevices COVERAGE compiz_core) add_executable (compiz_test_configurerequestbuffer test_configurerequestbuffer.cpp) target_link_libraries (compiz_test_configurerequestbuffer compiz_configurerequestbuffer ${GTEST_BOTH_LIBRARIES} ${GMOCK_MAIN_LIBRARY} ${GMOCK_LIBRARY} ) compiz_discover_tests(compiz_test_configurerequestbuffer COVERAGE compiz_configurerequestbuffer) ./src/tests/test_configurerequestbuffer.cpp0000644000004100000410000004275213246301623021535 0ustar www-datawww-data/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #include #include #include #include #include #include #include #include "configurerequestbuffer-impl.h" #include "asyncserverwindow.h" namespace crb = compiz::window::configure_buffers; namespace cw = compiz::window; using testing::_; using testing::NiceMock; using testing::Return; using testing::Invoke; using testing::WithArgs; using testing::SetArgReferee; using testing::DoAll; using testing::InSequence; using testing::ReturnNull; using testing::IsNull; class MockAsyncServerWindow : public cw::AsyncServerWindow { public: MOCK_METHOD2 (requestConfigureOnClient, int (const XWindowChanges &, unsigned int)); MOCK_METHOD2 (requestConfigureOnFrame, int (const XWindowChanges &, unsigned int)); MOCK_METHOD2 (requestConfigureOnWrapper, int (const XWindowChanges &, unsigned int)); MOCK_METHOD0 (sendSyntheticConfigureNotify, void ()); MOCK_CONST_METHOD0 (hasCustomShape, bool ()); }; class MockSyncServerWindow : public cw::SyncServerWindow { public: MOCK_METHOD1 (queryAttributes, bool (XWindowAttributes &)); MOCK_METHOD1 (queryFrameAttributes, bool (XWindowAttributes &)); MOCK_METHOD3 (queryShapeRectangles, XRectangle * (int, int *, int *)); }; namespace { int REQUEST_X = 1; int REQUEST_Y = 2; int REQUEST_WIDTH = 3; int REQUEST_HEIGHT = 4; int REQUEST_BORDER = 5; Window REQUEST_ABOVE = 6; unsigned int REQUEST_MODE = 7; crb::BufferLock::Ptr CreateNormalLock (crb::CountedFreeze *cf) { return boost::make_shared (cf); } } MATCHER_P2 (MaskXWC, xwc, vm, "Matches XWindowChanges") { if (vm & CWX) if (xwc.x != arg.x) return false; if (vm & CWY) if (xwc.y != arg.y) return false; if (vm & CWWidth) if (xwc.width != arg.width) return false; if (vm & CWHeight) if (xwc.height != arg.height) return false; if (vm & CWBorderWidth) if (xwc.border_width != arg.border_width) return false; if (vm & CWStackMode) if (xwc.stack_mode != arg.stack_mode) return false; if (vm & CWSibling) if (xwc.sibling != arg.sibling) return false; return true; } class ConfigureRequestBuffer : public testing::Test { public: ConfigureRequestBuffer () { /* Initialize xwc, we control it * through the value masks */ xwc.x = REQUEST_X; xwc.y = REQUEST_Y; xwc.width = REQUEST_WIDTH; xwc.height = REQUEST_HEIGHT; xwc.border_width = REQUEST_BORDER; xwc.sibling = REQUEST_ABOVE; xwc.stack_mode = REQUEST_MODE; } protected: XWindowChanges xwc; MockAsyncServerWindow asyncServerWindow; MockSyncServerWindow syncServerWindow; }; class ConfigureRequestBufferDispatch : public ConfigureRequestBuffer { protected: ConfigureRequestBufferDispatch () : ConfigureRequestBuffer (), factory (boost::bind (CreateNormalLock, _1)), buffer ( crb::ConfigureRequestBuffer::Create (&asyncServerWindow, &syncServerWindow, factory)) { } crb::ConfigureRequestBuffer::LockFactory factory; crb::Buffer::Ptr buffer; }; TEST_F (ConfigureRequestBufferDispatch, PushDirectSyntheticConfigureNotify) { EXPECT_CALL (asyncServerWindow, sendSyntheticConfigureNotify ()); buffer->pushSyntheticConfigureNotify (); } TEST_F (ConfigureRequestBufferDispatch, PushDirectClientUpdate) { unsigned int valueMask = CWX | CWY | CWBorderWidth | CWSibling | CWStackMode; EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (MaskXWC (xwc, valueMask), valueMask)); buffer->pushClientRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushDirectWrapperUpdate) { unsigned int valueMask = CWX | CWY | CWBorderWidth | CWSibling | CWStackMode; EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (MaskXWC (xwc, valueMask), valueMask)); buffer->pushWrapperRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushDirectFrameUpdate) { unsigned int valueMask = CWX | CWY | CWBorderWidth | CWSibling | CWStackMode; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushUpdateLocked) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = 0; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, PushCombinedUpdateLocked) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); valueMask |= CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); lock->release (); } /* * This test is disabled until we can expose the QueryShapeRectangles API * to plugins */ TEST_F (ConfigureRequestBufferDispatch, DISABLED_PushUpdateLockedReleaseInOrder) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (_, _)).Times (0); EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (_, _)).Times (0); buffer->pushClientRequest (xwc, valueMask); buffer->pushWrapperRequest (xwc, 0); buffer->pushFrameRequest (xwc, 0); InSequence s; /* Always frame -> wrapper -> client */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (MaskXWC (xwc, valueMask), valueMask)); EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (MaskXWC (xwc, valueMask), valueMask)); lock->release (); } TEST_F (ConfigureRequestBufferDispatch, UnlockBuffer) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); lock->release (); } TEST_F (ConfigureRequestBufferDispatch, ImplicitUnlockBuffer) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnRestack) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWStackMode | CWSibling; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnWindowSizeChange) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWWidth | CWHeight | CWBorderWidth; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (MaskXWC (xwc, valueMask), valueMask)); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnClientReposition) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnClient (MaskXWC (xwc, valueMask), valueMask)); buffer->pushClientRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferDispatch, ForceImmediateConfigureOnWrapperReposition) { crb::Releasable::Ptr lock (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnWrapper (MaskXWC (xwc, valueMask), valueMask)); buffer->pushWrapperRequest (xwc, valueMask); } namespace { class MockLock : public crb::BufferLock { public: /* We're currently importing the locks statefulness and coupling * the caller with that */ MockLock () : armed (false) { ON_CALL (*this, lock ()).WillByDefault ( Invoke (this, &MockLock::FreezeIfUnarmed)); ON_CALL (*this, release ()).WillByDefault ( Invoke (this, &MockLock::ReleaseIfArmed)); } void OperateOver (crb::CountedFreeze *cf) { countedFreeze = cf; } void FreezeIfUnarmed () { if (!armed) { countedFreeze->freeze (); armed = true; } } void ReleaseIfArmed () { if (armed) { countedFreeze->release (); armed = false; } } typedef boost::shared_ptr Ptr; MOCK_METHOD0 (lock, void ()); MOCK_METHOD0 (release, void ()); private: crb::CountedFreeze *countedFreeze; bool armed; }; class MockLockFactory { public: crb::BufferLock::Ptr CreateMockLock (crb::CountedFreeze *cf) { MockLock::Ptr mockLock (locks.front ()); mockLock->OperateOver (cf); locks.pop_front (); return mockLock; } void QueueLockForCreation (const MockLock::Ptr &lock) { locks.push_back (lock); } private: std::deque locks; }; } class ConfigureRequestBufferLockBehaviour : public ConfigureRequestBuffer { public: ConfigureRequestBufferLockBehaviour () : ConfigureRequestBuffer (), lock (boost::make_shared ()), factory ( boost::bind (&MockLockFactory::CreateMockLock, &mockLockFactory, _1)), buffer ( crb::ConfigureRequestBuffer::Create ( &asyncServerWindow, &syncServerWindow, factory)) { mockLockFactory.QueueLockForCreation (lock); } protected: typedef NiceMock NiceServerWindow; typedef crb::ConfigureRequestBuffer::LockFactory LockFactory; MockLock::Ptr lock; MockLockFactory mockLockFactory; LockFactory factory; crb::Buffer::Ptr buffer; }; TEST_F (ConfigureRequestBufferLockBehaviour, RearmBufferLockOnRelease) { EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* Now the buffer will dispatch is configure request */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); /* Rearm locks on release */ EXPECT_CALL (*lock, lock ()); /* Directly release the queue */ releasable->release (); } TEST_F (ConfigureRequestBufferLockBehaviour, NoRearmBufferLockNoReleaseRequired) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); /* No call to requestConfigureOnFrame if there's nothing to be configured */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* No rearm - we haven't released the whole buffer */ EXPECT_CALL (*lock, lock ()).Times (0); /* Directly release the queue */ releasable->release (); } TEST_F (ConfigureRequestBufferLockBehaviour, RearmWhenPushReady) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* No call to requestConfigureOnFrame if there's nothing to be configured */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); /* No rearm - we haven't released it */ EXPECT_CALL (*lock, lock ()).Times (0); /* Directly release the queue */ releasable->release (); /* Since we're now going to push something to a queue * that's effectively not locked, the locks should now * be released */ unsigned int valueMask = CWX | CWY; /* Now rearm it */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); buffer->pushFrameRequest (xwc, valueMask); } TEST_F (ConfigureRequestBufferLockBehaviour, NoRearmBufferLockOnNoRelease) { MockLock::Ptr second (boost::make_shared ()); mockLockFactory.QueueLockForCreation (second); /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); EXPECT_CALL (*second, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); crb::Releasable::Ptr otherReleasable (buffer->obtainLock ()); /* We are releasing this lock */ EXPECT_CALL (*lock, release ()); /* No call to requestConfigureOnFrame if there's nothing to be configured */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); /* No rearm - we haven't released it */ EXPECT_CALL (*lock, lock ()).Times (0); releasable->release (); } TEST_F (ConfigureRequestBufferLockBehaviour, QueryAttributesDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Expect a call to XGetWindowAttributes */ EXPECT_CALL (syncServerWindow, queryShapeRectangles (_, _, _)) .WillOnce ( ReturnNull ()); int a, b; EXPECT_THAT (buffer->queryShapeRectangles (0, &a, &b), IsNull ()); } TEST_F (ConfigureRequestBufferLockBehaviour, QueryFrameAttributesDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Expect a call to XGetWindowAttributes */ XWindowAttributes xwa; EXPECT_CALL (syncServerWindow, queryFrameAttributes (_)) .WillOnce ( DoAll ( SetArgReferee <0> (xwa), Return (true))); buffer->queryFrameAttributes (xwa); } TEST_F (ConfigureRequestBufferLockBehaviour, QueryShapeRectanglesDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Expect a call to XGetWindowAttributes */ XWindowAttributes xwa; EXPECT_CALL (syncServerWindow, queryFrameAttributes (_)) .WillOnce ( DoAll ( SetArgReferee <0> (xwa), Return (true))); buffer->queryFrameAttributes (xwa); } TEST_F (ConfigureRequestBufferLockBehaviour, ForceReleaseDispatchAndRearm) { /* Locks get armed on construction */ EXPECT_CALL (*lock, lock ()); crb::Releasable::Ptr releasable (buffer->obtainLock ()); unsigned int valueMask = CWX | CWY; /* Queue locked */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)).Times (0); buffer->pushFrameRequest (xwc, valueMask); /* Queue forceably unlocked, locks rearmed */ EXPECT_CALL (asyncServerWindow, requestConfigureOnFrame (_, _)); EXPECT_CALL (*lock, lock ()); /* Force release */ buffer->forceRelease (); } ./src/tests/test_outputdevices.cpp0000644000004100000410000001230213246301623017640 0ustar www-datawww-data/* * Compiz Core: OutputDevices class: Unit tests * * Copyright (c) 2012 Canonical Ltd. * Author: Daniel van Vugt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "gtest/gtest.h" #include "outputdevices.h" using namespace compiz::core; TEST (OutputDevices, TrivialSingleMonitor) { OutputDevices d; CompSize s (1024, 768); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1024, 768); w.set (50, 50, 100, 100, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 10, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 100, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (99999, 100, 123, 456, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, SideBySide) { OutputDevices d; CompSize s (2048, 768); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1024, 768); d.setGeometryOnDevice (1, 1024, 0, 1024, 768); w.set (50, 50, 100, 100, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 10, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 100, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (10, 0, 3000, 768, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); // Way off-screen to the right. Both outputs match equally with an area // of zero. We don't care about distance so just choose the first. w.set (99999, 100, 123, 456, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (1500, 100, 2000, 456, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (0, 0, 2048, 768, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, LaptopBelowMonitor) { OutputDevices d; CompSize s (1920, 2100); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1920, 1200); d.setGeometryOnDevice (1, 160, 1200, 1600, 900); w.set (50, 50, 100, 100, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-50, 50, 100, 10, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (200, 1500, 20, 20, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (100, 1800, 700, 700, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, LaptopNextToMonitor) { OutputDevices d; CompSize s (3200, 1200); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 400, 1280, 800); d.setGeometryOnDevice (1, 1280, 0, 1920, 1200); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (200, 300, 20, 20, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, 10, 1500, 500, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (900, 50, 3000, 20, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (10, 500, 2542, 100, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); } TEST (OutputDevices, FourSquare) { OutputDevices d; CompSize s (2000, 2000); CompWindow::Geometry w; d.setGeometryOnDevice (0, 0, 0, 1000, 1000); d.setGeometryOnDevice (1, 1000, 0, 1000, 1000); d.setGeometryOnDevice (2, 0, 1000, 1000, 1000); d.setGeometryOnDevice (3, 1000, 1000, 1000, 1000); w.set (-10, -10, 1034, 778, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); w.set (900, 300, 300, 200, 0); EXPECT_EQ (1, d.outputDeviceForGeometry (w, 0, &s)); w.set (900, 900, 201, 201, 0); EXPECT_EQ (3, d.outputDeviceForGeometry (w, 0, &s)); w.set (-10, 1010, 2000, 500, 0); EXPECT_EQ (2, d.outputDeviceForGeometry (w, 0, &s)); // When there are multiple canidates with equal scores, choose the first: w.set (-5, -5, 3000, 3000, 0); EXPECT_EQ (0, d.outputDeviceForGeometry (w, 0, &s)); } ./src/privatestackdebugger.h0000644000004100000410000000546213246301623016417 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ /* FIXME: Define CompWindowList somewhere else * so that this can be come a truly standalone * object */ #include #include #ifndef _COMPIZ_PRIVATESTACKDEBUGGER_H #define _COMPIZ_PRIVATESTACKDEBUGGER_H class FetchXEventInterface; class StackDebugger { public: typedef std::vector eventList; StackDebugger (Display *, Window, FetchXEventInterface *fetchXEvent); ~StackDebugger (); void loadStack (CompWindowList &serverWindows, bool wait = false); void windowsChanged (bool change) { mWindowsChanged = change; }; void serverWindowsChanged (bool change) { mServerWindowsChanged = change; }; bool windowsChanged () { return mWindowsChanged; } bool serverWindowsChanged () { return mServerWindowsChanged; } void overrideRedirectRestack (Window toplevel, Window sibling); void removeServerWindow (Window); void addDestroyedFrame (Window); void removeDestroyedFrame (Window); bool stackChange (); bool cmpStack (CompWindowList &windows, CompWindowList &serverWindows, bool verbose = false); bool timedOut (); bool getNextEvent (XEvent &); bool checkSanity (CompWindowList &serverWindows, bool verbose = false); static StackDebugger * Default (); static void SetDefault (StackDebugger *); private: std::list mDestroyedFrames; unsigned int mServerNChildren; Window *mServerChildren; bool mWindowsChanged; bool mServerWindowsChanged; Window mRoot; Display *mDpy; FetchXEventInterface *mFetchXEvent; bool mTimeoutRequired; CompWindowList mLastServerWindows; std::list mEvents; }; #endif ./src/icon.cpp0000644000004100000410000000306713246301623013474 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include CompIcon::CompIcon (unsigned int width, unsigned int height) : mSize (width, height), mData (new unsigned char[width * height * 4]) { } CompIcon::~CompIcon () { delete [] mData; } unsigned char* CompIcon::data () { return mData; } ./src/syncserverwindow.h0000644000004100000410000000322013246301623015633 0ustar www-datawww-data/* * Copyright © 2012 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored by: Sam Spilsbury */ #ifndef _COMPIZ_SYNC_SERVER_WINDOW_H #define _COMPIZ_SYNC_SERVER_WINDOW_H #include namespace compiz { namespace window { class SyncServerWindow { public: virtual ~SyncServerWindow () {} virtual bool queryAttributes (XWindowAttributes &attrib) = 0; virtual bool queryFrameAttributes (XWindowAttributes &attrib) = 0; virtual XRectangle * queryShapeRectangles (int kind, int *count, int *ordering) = 0; }; } } #endif ./src/actions.cpp0000644000004100000410000001627613246301623014212 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include #include #include #include "privatescreen.h" #include "privatewindow.h" bool CompScreenImpl::closeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); unsigned int time = CompOption::getIntOptionNamed (options, "time", CurrentTime); CompWindow *w = screen->findTopLevelWindow (xid); if (w && (w->priv->actions & CompWindowActionCloseMask)) w->close (time); return true; } bool CompScreenImpl::unmaximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (0); return true; } bool CompScreenImpl::unmaximizeOrMinimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) { if (w->priv->state & MAXIMIZE_STATE) w->maximize (0); else if (w->actions () & CompWindowActionMinimizeMask) w->minimize (); } return true; } bool CompScreenImpl::minimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w && (w->actions () & CompWindowActionMinimizeMask)) w->minimize (); return true; } bool CompScreenImpl::maximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (MAXIMIZE_STATE); return true; } bool CompScreenImpl::maximizeWinHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->state () | CompWindowStateMaximizedHorzMask); return true; } bool CompScreenImpl::maximizeWinVertically (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->state () | CompWindowStateMaximizedVertMask); return true; } bool CompScreenImpl::showDesktop (CompAction *action, CompAction::State state, CompOption::Vector &options) { if (screen->showingDesktopMask() == 0) screen->enterShowDesktopMode (); else screen->leaveShowDesktopMode (NULL); return true; } bool CompScreenImpl::raiseWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->raise (); return true; } bool CompScreenImpl::lowerWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->lower (); return true; } bool CompScreenImpl::windowMenu (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w && screen->grabsEmpty ()) { Time time = CompOption::getIntOptionNamed (options, "time", CurrentTime); int button = CompOption::getIntOptionNamed (options, "button", 0); int x = CompOption::getIntOptionNamed (options, "x", w->geometry ().x ()); int y = CompOption::getIntOptionNamed (options, "y", w->geometry ().y ()); screen->toolkitAction (Atoms::toolkitActionWindowMenu, time, w->id (), button, x, y); } return true; } bool CompScreenImpl::toggleWinMaximized (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) { if ((w->priv->state & MAXIMIZE_STATE) == MAXIMIZE_STATE) w->maximize (0); else w->maximize (MAXIMIZE_STATE); } return true; } bool CompScreenImpl::toggleWinMaximizedHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->priv->state ^ CompWindowStateMaximizedHorzMask); return true; } bool CompScreenImpl::toggleWinMaximizedVertically (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w) w->maximize (w->priv->state ^ CompWindowStateMaximizedVertMask); return true; } bool CompScreenImpl::shadeWin (CompAction *action, CompAction::State state, CompOption::Vector &options) { Window xid = CompOption::getIntOptionNamed (options, "window"); CompWindow *w = screen->findTopLevelWindow (xid); if (w && (w->priv->actions & CompWindowActionShadeMask)) { w->priv->state ^= CompWindowStateShadedMask; w->updateAttributes (CompStackingUpdateModeNone); } return true; } ./src/size.cpp0000644000004100000410000000277113246301623013517 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include CompSize::CompSize () : mWidth (0), mHeight (0) { } CompSize::CompSize (int width, int height) : mWidth (width), mHeight (height) { } void CompSize::setWidth (int width) { mWidth = width; } void CompSize::setHeight (int height) { mHeight = height; } ./src/atoms.cpp0000644000004100000410000002526713246301623013675 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #include namespace Atoms { Atom supported; Atom supportingWmCheck; Atom utf8String; Atom wmName; Atom winType; Atom winTypeDesktop; Atom winTypeDock; Atom winTypeToolbar; Atom winTypeMenu; Atom winTypeUtil; Atom winTypeSplash; Atom winTypeDialog; Atom winTypeNormal; Atom winTypeDropdownMenu; Atom winTypePopupMenu; Atom winTypeTooltip; Atom winTypeNotification; Atom winTypeCombo; Atom winTypeDnd; Atom winOpacity; Atom winBrightness; Atom winSaturation; Atom winActive; Atom winDesktop; Atom workarea; Atom desktopViewport; Atom desktopGeometry; Atom currentDesktop; Atom numberOfDesktops; Atom winState; Atom winStateModal; Atom winStateSticky; Atom winStateMaximizedVert; Atom winStateMaximizedHorz; Atom winStateShaded; Atom winStateSkipTaskbar; Atom winStateSkipPager; Atom winStateHidden; Atom winStateFullscreen; Atom winStateAbove; Atom winStateBelow; Atom winStateDemandsAttention; Atom winStateDisplayModal; Atom winStateFocused; Atom winActionMove; Atom winActionResize; Atom winActionStick; Atom winActionMinimize; Atom winActionMaximizeHorz; Atom winActionMaximizeVert; Atom winActionFullscreen; Atom winActionClose; Atom winActionShade; Atom winActionChangeDesktop; Atom winActionAbove; Atom winActionBelow; Atom wmAllowedActions; Atom wmStrut; Atom wmStrutPartial; Atom wmUserTime; Atom wmIcon; Atom wmIconGeometry; Atom clientList; Atom clientListStacking; Atom frameExtents; Atom frameGtkExtents; Atom frameWindow; Atom wmState; Atom wmChangeState; Atom wmProtocols; Atom wmClientLeader; Atom wmDeleteWindow; Atom wmTakeFocus; Atom wmPing; Atom wmSyncRequest; Atom wmSyncRequestCounter; Atom wmFullscreenMonitors; Atom closeWindow; Atom wmMoveResize; Atom moveResizeWindow; Atom restackWindow; Atom showingDesktop; Atom xBackground[2]; Atom toolkitAction; Atom toolkitActionWindowMenu; Atom toolkitActionForceQuitDialog; Atom mwmHints; Atom xdndAware; Atom xdndEnter; Atom xdndLeave; Atom xdndPosition; Atom xdndStatus; Atom xdndDrop; Atom manager; Atom targets; Atom multiple; Atom timestamp; Atom version; Atom atomPair; Atom startupId; Atom gnomeRepresentativeColors; void init (Display *dpy) { supported = XInternAtom (dpy, "_NET_SUPPORTED", 0); supportingWmCheck = XInternAtom (dpy, "_NET_SUPPORTING_WM_CHECK", 0); utf8String = XInternAtom (dpy, "UTF8_STRING", 0); wmName = XInternAtom (dpy, "_NET_WM_NAME", 0); winType = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE", 0); winTypeDesktop = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DESKTOP", 0); winTypeDock = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DOCK", 0); winTypeToolbar = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_TOOLBAR", 0); winTypeMenu = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_MENU", 0); winTypeUtil = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_UTILITY", 0); winTypeSplash = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_SPLASH", 0); winTypeDialog = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DIALOG", 0); winTypeNormal = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_NORMAL", 0); winTypeDropdownMenu = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", 0); winTypePopupMenu = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_POPUP_MENU", 0); winTypeTooltip = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_TOOLTIP", 0); winTypeNotification = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_NOTIFICATION", 0); winTypeCombo = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_COMBO", 0); winTypeDnd = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DND", 0); winOpacity = XInternAtom (dpy, "_NET_WM_WINDOW_OPACITY", 0); winBrightness = XInternAtom (dpy, "_NET_WM_WINDOW_BRIGHTNESS", 0); winSaturation = XInternAtom (dpy, "_NET_WM_WINDOW_SATURATION", 0); winActive = XInternAtom (dpy, "_NET_ACTIVE_WINDOW", 0); winDesktop = XInternAtom (dpy, "_NET_WM_DESKTOP", 0); workarea = XInternAtom (dpy, "_NET_WORKAREA", 0); desktopViewport = XInternAtom (dpy, "_NET_DESKTOP_VIEWPORT", 0); desktopGeometry = XInternAtom (dpy, "_NET_DESKTOP_GEOMETRY", 0); currentDesktop = XInternAtom (dpy, "_NET_CURRENT_DESKTOP", 0); numberOfDesktops = XInternAtom (dpy, "_NET_NUMBER_OF_DESKTOPS", 0); winState = XInternAtom (dpy, "_NET_WM_STATE", 0); winStateModal = XInternAtom (dpy, "_NET_WM_STATE_MODAL", 0); winStateSticky = XInternAtom (dpy, "_NET_WM_STATE_STICKY", 0); winStateMaximizedVert = XInternAtom (dpy, "_NET_WM_STATE_MAXIMIZED_VERT", 0); winStateMaximizedHorz = XInternAtom (dpy, "_NET_WM_STATE_MAXIMIZED_HORZ", 0); winStateShaded = XInternAtom (dpy, "_NET_WM_STATE_SHADED", 0); winStateSkipTaskbar = XInternAtom (dpy, "_NET_WM_STATE_SKIP_TASKBAR", 0); winStateSkipPager = XInternAtom (dpy, "_NET_WM_STATE_SKIP_PAGER", 0); winStateHidden = XInternAtom (dpy, "_NET_WM_STATE_HIDDEN", 0); winStateFullscreen = XInternAtom (dpy, "_NET_WM_STATE_FULLSCREEN", 0); winStateAbove = XInternAtom (dpy, "_NET_WM_STATE_ABOVE", 0); winStateBelow = XInternAtom (dpy, "_NET_WM_STATE_BELOW", 0); winStateDemandsAttention = XInternAtom (dpy, "_NET_WM_STATE_DEMANDS_ATTENTION", 0); winStateDisplayModal = XInternAtom (dpy, "_NET_WM_STATE_DISPLAY_MODAL", 0); winStateFocused = XInternAtom (dpy, "_NET_WM_STATE_FOCUSED", 0); winActionMove = XInternAtom (dpy, "_NET_WM_ACTION_MOVE", 0); winActionResize = XInternAtom (dpy, "_NET_WM_ACTION_RESIZE", 0); winActionStick = XInternAtom (dpy, "_NET_WM_ACTION_STICK", 0); winActionMinimize = XInternAtom (dpy, "_NET_WM_ACTION_MINIMIZE", 0); winActionMaximizeHorz = XInternAtom (dpy, "_NET_WM_ACTION_MAXIMIZE_HORZ", 0); winActionMaximizeVert = XInternAtom (dpy, "_NET_WM_ACTION_MAXIMIZE_VERT", 0); winActionFullscreen = XInternAtom (dpy, "_NET_WM_ACTION_FULLSCREEN", 0); winActionClose = XInternAtom (dpy, "_NET_WM_ACTION_CLOSE", 0); winActionShade = XInternAtom (dpy, "_NET_WM_ACTION_SHADE", 0); winActionChangeDesktop = XInternAtom (dpy, "_NET_WM_ACTION_CHANGE_DESKTOP", 0); winActionAbove = XInternAtom (dpy, "_NET_WM_ACTION_ABOVE", 0); winActionBelow = XInternAtom (dpy, "_NET_WM_ACTION_BELOW", 0); wmAllowedActions = XInternAtom (dpy, "_NET_WM_ALLOWED_ACTIONS", 0); wmStrut = XInternAtom (dpy, "_NET_WM_STRUT", 0); wmStrutPartial = XInternAtom (dpy, "_NET_WM_STRUT_PARTIAL", 0); wmUserTime = XInternAtom (dpy, "_NET_WM_USER_TIME", 0); wmIcon = XInternAtom (dpy,"_NET_WM_ICON", 0); wmIconGeometry = XInternAtom (dpy, "_NET_WM_ICON_GEOMETRY", 0); clientList = XInternAtom (dpy, "_NET_CLIENT_LIST", 0); clientListStacking = XInternAtom (dpy, "_NET_CLIENT_LIST_STACKING", 0); frameExtents = XInternAtom (dpy, "_NET_FRAME_EXTENTS", 0); frameGtkExtents = XInternAtom (dpy, "_GTK_FRAME_EXTENTS", 0); frameWindow = XInternAtom (dpy, "_NET_FRAME_WINDOW", 0); wmState = XInternAtom (dpy, "WM_STATE", 0); wmChangeState = XInternAtom (dpy, "WM_CHANGE_STATE", 0); wmProtocols = XInternAtom (dpy, "WM_PROTOCOLS", 0); wmClientLeader = XInternAtom (dpy, "WM_CLIENT_LEADER", 0); wmDeleteWindow = XInternAtom (dpy, "WM_DELETE_WINDOW", 0); wmTakeFocus = XInternAtom (dpy, "WM_TAKE_FOCUS", 0); wmPing = XInternAtom (dpy, "_NET_WM_PING", 0); wmSyncRequest = XInternAtom (dpy, "_NET_WM_SYNC_REQUEST", 0); wmSyncRequestCounter = XInternAtom (dpy, "_NET_WM_SYNC_REQUEST_COUNTER", 0); wmFullscreenMonitors = XInternAtom (dpy, "_NET_WM_FULLSCREEN_MONITORS", 0); closeWindow = XInternAtom (dpy, "_NET_CLOSE_WINDOW", 0); wmMoveResize = XInternAtom (dpy, "_NET_WM_MOVERESIZE", 0); moveResizeWindow = XInternAtom (dpy, "_NET_MOVERESIZE_WINDOW", 0); restackWindow = XInternAtom (dpy, "_NET_RESTACK_WINDOW", 0); showingDesktop = XInternAtom (dpy, "_NET_SHOWING_DESKTOP", 0); xBackground[0] = XInternAtom (dpy, "_XSETROOT_ID", 0); xBackground[1] = XInternAtom (dpy, "_XROOTPMAP_ID", 0); toolkitAction = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION", 0); toolkitActionWindowMenu = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", 0); toolkitActionForceQuitDialog = XInternAtom (dpy, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG", 0); mwmHints = XInternAtom (dpy, "_MOTIF_WM_HINTS", 0); xdndAware = XInternAtom (dpy, "XdndAware", 0); xdndEnter = XInternAtom (dpy, "XdndEnter", 0); xdndLeave = XInternAtom (dpy, "XdndLeave", 0); xdndPosition = XInternAtom (dpy, "XdndPosition", 0); xdndStatus = XInternAtom (dpy, "XdndStatus", 0); xdndDrop = XInternAtom (dpy, "XdndDrop", 0); manager = XInternAtom (dpy, "MANAGER", 0); targets = XInternAtom (dpy, "TARGETS", 0); multiple = XInternAtom (dpy, "MULTIPLE", 0); timestamp = XInternAtom (dpy, "TIMESTAMP", 0); version = XInternAtom (dpy, "VERSION", 0); atomPair = XInternAtom (dpy, "ATOM_PAIR", 0); startupId = XInternAtom (dpy, "_NET_STARTUP_ID", 0); gnomeRepresentativeColors = XInternAtom (dpy, "_GNOME_BACKGROUND_REPRESENTATIVE_COLORS", 0); } }; ./src/option.cpp0000644000004100000410000003542013246301623014052 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #define foreach BOOST_FOREACH #include #include "privateoption.h" #include #include #include template class std::vector; template class std::vector; template class std::vector; namespace { CompOption::Value::Vector & emptyList () { static CompOption::Value::Vector v; return v; } CompString & emptyString () { static CompString v; return v; } CompMatch & emptyMatch () { static CompMatch v; return v; } CompAction & emptyAction () { static CompAction v; return v; } unsigned short * emptyColor () { static unsigned short v[4] = { 0, 0, 0, 0 }; return v; } template::type & (*get_default)()> struct get_or_default_call : public boost::static_visitor { TargetType& operator()(TargetType& a) { return a; } template TargetType& operator()(T&) { return get_default(); } }; template::type Default> struct get_or_default_val : public boost::static_visitor { TargetType operator()(TargetType& a) { return a; } template TargetType operator()(T&) { return Default; } }; struct get_float : public boost::static_visitor { float operator()(float const& a) { return a; } template float operator()(T&) { return 0.0; } }; } CompOption::Vector & noOptions () { static CompOption::Vector v; return v; } static bool checkIsAction (CompOption::Type type) { switch (type) { case CompOption::TypeAction: case CompOption::TypeKey: case CompOption::TypeButton: case CompOption::TypeEdge: case CompOption::TypeBell: return true; default: break; } return false; } CompOption::Value::~Value() { } void CompOption::Value::set (Type t, const CompOption::Value::Vector & v) { mListType = t; mValue = v; } bool CompOption::Value::b () const { get_or_default_val tmp; return boost::apply_visitor(tmp, mValue); } int CompOption::Value::i () const { get_or_default_val tmp; return boost::apply_visitor(tmp, mValue); } float CompOption::Value::f () const { get_float tmp; return boost::apply_visitor(tmp, mValue); } unsigned short* CompOption::Value::c () const { try { return const_cast (&((boost::get(mValue))[0])); } catch (...) { return emptyColor (); } } const CompString & CompOption::Value::s () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompString & CompOption::Value::s () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } const CompMatch & CompOption::Value::match () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompMatch & CompOption::Value::match () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } const CompAction & CompOption::Value::action () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompAction & CompOption::Value::action () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } // Type listType () const; const CompOption::Value::Vector & CompOption::Value::list () const { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } CompOption::Value::Vector & CompOption::Value::list () { get_or_default_call tmp; return boost::apply_visitor(tmp, mValue); } bool CompOption::Value::operator== (const Value & rhs) const { return mValue == rhs.mValue; } bool CompOption::Value::operator!= (const Value & rhs) const { return !(mValue == rhs.mValue); } CompOption::Restriction::Restriction () : priv (new PrivateRestriction ()) { } CompOption::Restriction::Restriction (const CompOption::Restriction &r) : priv (new PrivateRestriction (*r.priv)) { } CompOption::Restriction::~Restriction () { delete priv; } int CompOption::Restriction::iMin () { if (priv->type == CompOption::TypeInt) return priv->rest.i.min; return MINSHORT; } int CompOption::Restriction::iMax () { if (priv->type == CompOption::TypeInt) return priv->rest.i.max; return MAXSHORT; } float CompOption::Restriction::fMin () { if (priv->type == CompOption::TypeFloat) return priv->rest.f.min; return MINSHORT; } float CompOption::Restriction::fMax () { if (priv->type == CompOption::TypeFloat) return priv->rest.f.min; return MINSHORT; } float CompOption::Restriction::fPrecision () { if (priv->type == CompOption::TypeFloat) return priv->rest.f.precision; return 0.1f; } void CompOption::Restriction::set (int min, int max) { priv->type = CompOption::TypeInt; priv->rest.i.min = min; priv->rest.i.max = max; } void CompOption::Restriction::set (float min, float max, float precision) { priv->type = CompOption::TypeFloat; priv->rest.f.min = min; priv->rest.f.max = max; priv->rest.f.precision = precision; } bool CompOption::Restriction::inRange (int i) { if (priv->type != CompOption::TypeInt) return true; if (i < priv->rest.i.min) return false; if (i > priv->rest.i.max) return false; return true; } bool CompOption::Restriction::inRange (float f) { if (priv->type != CompOption::TypeFloat) return true; if (f < priv->rest.f.min) return false; if (f > priv->rest.f.max) return false; return true; } CompOption::Restriction & CompOption::Restriction::operator= (const CompOption::Restriction &rest) { if (this == &rest) return *this; delete priv; priv = new PrivateRestriction (*rest.priv); return *this; } CompOption * CompOption::Class::getOption (const CompString &name) { CompOption *o = CompOption::findOption (getOptions (), name); return o; } CompOption * CompOption::findOption (CompOption::Vector &options, CompString name, unsigned int *index) { for (unsigned int i = 0; i < options.size (); i++) { if (options[i].priv->name == name) { if (index) *index = i; return &options[i]; } } return NULL; } CompOption::CompOption () : priv (new PrivateOption ()) { } CompOption::CompOption (const CompOption &o) : priv (new PrivateOption (*o.priv)) { } CompOption::CompOption (CompString name, CompOption::Type type) : priv (new PrivateOption ()) { setName (name, type); } CompOption::~CompOption () { /* Remove any added actions */ try { CompAction &action = value ().action (); if (action.active () && screen) screen->removeAction (&action); } catch (...) { } delete priv; } void CompOption::reset () { priv->name = ""; priv->type = TypeUnset; } void CompOption::setName (CompString name, CompOption::Type type) { priv->name = name; priv->type = type; } void CompOption::setName (const char *name, CompOption::Type type) { if (!name && !priv->name.empty ()) priv->name.clear (); else if (name && priv->name != name) priv->name = name; priv->type = type; } const CompString & CompOption::name () const { return priv->name; } CompOption::Type CompOption::type () const { return priv->type; } CompOption::Value & CompOption::value () { return priv->value; } const CompOption::Value & CompOption::value () const { return priv->value; } CompOption::Restriction & CompOption::rest () { return priv->rest; } bool CompOption::set (CompOption::Value &val) { /* XXX: It is uncertain as to why this is done. The only * logical reason would be that actions are stateful and * we don't want to care about the old state from the * action that we're setting this value to, so we're just * clearing that state and starting over, however copyState * does a lot more than that */ if (isAction () && priv->type != CompOption::TypeAction) val.action ().copyState (priv->value.action ()); if (priv->type != val.type () && (!isAction () || !checkIsAction (val.type ()))) { compLogMessage ("core", CompLogLevelWarn, "Can't set Value with type %d to " "option \"%s\" with type %d", val.type (), priv->name.c_str (), priv->type); return false; } if (priv->value == val) return false; if (isAction () && priv->value.action ().state () & CompAction::StateAutoGrab && screen) { if (!screen->addAction (&val.action ())) return false; else screen->removeAction (&priv->value.action ()); } switch (priv->type) { case CompOption::TypeInt: if (!priv->rest.inRange (val.i ())) return false; break; case CompOption::TypeFloat: { float v, p; int sign = (val.f () < 0 ? -1 : 1); if (!priv->rest.inRange (val.f ())) return false; p = 1.0f / priv->rest.fPrecision (); v = ((int) (val.f () * p + sign * 0.5f)) / p; priv->value.set (v); return true; } case CompOption::TypeAction: return false; case CompOption::TypeKey: if (val.action ().type () == value().action ().type () && !(val.action ().type () & CompAction::BindingTypeKey)) return false; break; case CompOption::TypeButton: if (val.action ().type () == value().action ().type () && !(val.action ().type () & (CompAction::BindingTypeButton | CompAction::BindingTypeEdgeButton))) return false; break; default: break; } priv->value = val; return true; } bool CompOption::isAction () const { return checkIsAction (priv->type); } CompOption & CompOption::operator= (const CompOption &option) { if (this == &option) return *this; delete priv; priv = new PrivateOption (*option.priv); return *this; } bool CompOption::getBoolOptionNamed (const Vector& options, const CompString& name, bool defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeBool && o.priv->name == name) return o.priv->value.b (); return defaultValue; } int CompOption::getIntOptionNamed (const Vector& options, const CompString& name, int defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeInt && o.priv->name == name) return o.priv->value.i (); return defaultValue; } float CompOption::getFloatOptionNamed (const Vector& options, const CompString& name, const float& defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeFloat && o.priv->name == name) return o.priv->value.f (); return defaultValue; } CompString CompOption::getStringOptionNamed (const Vector& options, const CompString& name, const CompString& defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeString && o.priv->name == name) return o.priv->value.s (); return defaultValue; } unsigned short * CompOption::getColorOptionNamed (const Vector& options, const CompString& name, unsigned short *defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeColor && o.priv->name == name) return o.priv->value.c (); return defaultValue; } CompMatch CompOption::getMatchOptionNamed (const Vector& options, const CompString& name, const CompMatch& defaultValue) { foreach (const CompOption &o, options) if (o.priv->type == CompOption::TypeMatch && o.priv->name == name) return o.priv->value.match (); return defaultValue; } bool CompOption::stringToColor (CompString color, unsigned short *rgba) { int c[4]; if (sscanf (color.c_str (), "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { rgba[0] = c[0] << 8 | c[0]; rgba[1] = c[1] << 8 | c[1]; rgba[2] = c[2] << 8 | c[2]; rgba[3] = c[3] << 8 | c[3]; return true; } return false; } CompString CompOption::colorToString (unsigned short *rgba) { return compPrintf ("#%.2x%.2x%.2x%.2x", rgba[0] / 256, rgba[1] / 256, rgba[2] / 256, rgba[3] / 256); } CompString CompOption::typeToString (CompOption::Type type) { switch (type) { case CompOption::TypeBool: return "bool"; case CompOption::TypeInt: return "int"; case CompOption::TypeFloat: return "float"; case CompOption::TypeString: return "string"; case CompOption::TypeColor: return "color"; case CompOption::TypeAction: return "action"; case CompOption::TypeKey: return "key"; case CompOption::TypeButton: return "button"; case CompOption::TypeEdge: return "edge"; case CompOption::TypeBell: return "bell"; case CompOption::TypeMatch: return "match"; case CompOption::TypeList: return "list"; default: break; } return "unknown"; } bool CompOption::setOption (CompOption &o, CompOption::Value &value) { return o.set (value); } PrivateOption::PrivateOption () : name (""), type (CompOption::TypeUnset), value (), rest () { } PrivateOption::PrivateOption (const PrivateOption &p) : name (p.name), type (p.type), value (p.value), rest (p.rest) { } ./src/privatescreen.h0000644000004100000410000007730213246301623015066 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATESCREEN_H #define _PRIVATESCREEN_H #include #include #include #include #include #include #include #include #include #include "privatetimeoutsource.h" #include "privateiosource.h" #include "privateeventsource.h" #include "privatesignalsource.h" #include "outputdevices.h" #include "core_options.h" #include CompPlugin::VTable * getCoreVTable (); class CoreWindow; extern bool shutDown; extern bool restartSignal; extern bool useDesktopHints; extern std::list initialPlugins; typedef struct _CompDelayedEdgeSettings { CompAction::CallBack initiate; CompAction::CallBack terminate; unsigned int edge; unsigned int state; CompOption::Vector options; } CompDelayedEdgeSettings; struct CompScreenEdge { Window id; unsigned int count; }; struct CompGroup { unsigned int refCnt; Window id; }; struct CompStartupSequence { SnStartupSequence *sequence; unsigned int viewportX; unsigned int viewportY; }; namespace compiz { namespace core { namespace screen { inline int wraparound_mod (int a, int b) { if (a < 0) return (b - ((-a - 1) % (b))) - 1; else return a % b; }; } } } namespace compiz { namespace private_screen { class History; class WindowManager : boost::noncopyable { public: typedef CompWindow::ForEach Functor; WindowManager(); CompGroup * addGroup (Window id); void removeGroup (CompGroup *group); CompGroup * findGroup (Window id); void eraseWindowFromMap (Window id); void removeDestroyed (); void updateClientList (PrivateScreen& ps); void addToDestroyedWindows(CompWindow * cw) { destroyedWindows.push_back (cw); } void incrementPendingDestroys() { pendingDestroys++; } const CompWindowVector& getClientList () const { return clientList; } const CompWindowVector& getClientListStacking () const { return clientListStacking; } CompWindow * findWindow (Window id) const; CompWindow * getTopWindow() const; CompWindow * getTopServerWindow() const; void removeFromFindWindowCache(CompWindow* w) { if (w == lastFoundWindow) lastFoundWindow = 0; } void addWindowToMap(CompWindow* w) { if (w->id () != 1) windowsMap[w->id ()] = w; } void validateServerWindows(); void invalidateServerWindows(); void insertWindow (CompWindow* w, Window aboveId); void unhookWindow (CompWindow *w); CompWindowList& getWindows() { return windows; } CompWindowList& getDestroyedWindows() { return destroyedWindows; } void insertServerWindow(CompWindow* w, Window aboveId); void unhookServerWindow(CompWindow *w); CompWindowList& getServerWindows() { return serverWindows; } typedef CompWindowList::const_iterator iterator; typedef CompWindowList::const_reverse_iterator reverse_iterator; iterator begin() const { return windows.begin(); } iterator end() const { return windows.end(); } reverse_iterator rbegin() const { return windows.rbegin(); } reverse_iterator rend() const { return windows.rend(); } iterator serverBegin() const { return serverWindows.begin(); } iterator serverEnd() const { return serverWindows.end(); } reverse_iterator rserverBegin() const { return serverWindows.rbegin(); } reverse_iterator rserverEnd() const { return serverWindows.rend(); } void clearFullscreenHints() const; void showOrHideForDesktop(unsigned int desktop) const; void setWindowActiveness(::compiz::private_screen::History& history) const; void setNumberOfDesktops (unsigned int nDesktop) const; void updateWindowSizes() const; void forEachWindow(Functor const& f) const { std::for_each(windows.begin(), windows.end(), f); } private: CompWindowList windows; CompWindowList serverWindows; CompWindowList destroyedWindows; bool stackIsFresh; CompWindow::Map windowsMap; std::list groups; CompWindowVector clientList; /* clients in mapping order */ CompWindowVector clientListStacking; /* clients in stacking order */ std::vector clientIdList; /* client ids in mapping order */ std::vector clientIdListStacking;/* client ids in stacking order */ unsigned int pendingDestroys; mutable CompWindow* lastFoundWindow; }; unsigned int windowStateFromString (const char *str); class PluginManager { public: PluginManager(); void updatePlugins (CompScreen* screen, CompOption::Value::Vector const& extraPluginsRequested); void setPlugins(CompOption::Value::Vector const& vList) { plugin.set (CompOption::TypeString, vList); } bool isDirtyPluginList () const { return dirtyPluginList; } void setDirtyPluginList () { dirtyPluginList = true; } CompOption::Value::Vector mergedPluginList(CompOption::Value::Vector const& extraPluginsRequested) const; private: CompOption::Value plugin; bool dirtyPluginList; typedef std::set CompStringSet; CompStringSet blacklist; }; enum GrabType { POINTER = 1 << 0, KEYBOARD = 1 << 1, ALL = POINTER|KEYBOARD }; struct Grab { Grab (GrabType type, Cursor cursor, const char *name) : type(type), cursor(cursor), name(name) {} Grab (Cursor cursor, const char *name) : Grab(GrabType::ALL, cursor, name) {} GrabType type; Cursor cursor; const char *name; }; class GrabList { // TODO: std::list is almost certainly the wrong data // structure. Probably better as std::vector - many fewer // memory allocations and releases. typedef std::list GrabPtrList; public: typedef GrabPtrList::iterator GrabIterator; bool grabsEmpty () const { return grabs.empty (); } void grabsPush (Grab* grab) { grabs.push_back (grab); } GrabIterator grabsBegin () { return begin (grabs); } GrabIterator grabsEnd () { return end (grabs); } void grabsRemove (Grab* grab); bool grabExist (const char *grab); Grab* topGrab (GrabType t) { auto it = std::find_if (begin (grabs), end (grabs), [t] (Grab *g) { return (g->type & t); }); return (it != end (grabs)) ? *it : NULL; } Grab* grabsBack () { return grabs.back (); } private: GrabPtrList grabs; }; class EventManager : public GrabList { public: EventManager (); ~EventManager (); void init (); void handleSignal (int signum); bool triggerPress (CompAction *action, CompAction::State state, CompOption::Vector &arguments); bool triggerRelease (CompAction *action, CompAction::State state, CompOption::Vector &arguments); void startEventLoop(Display* dpy); void quit() { mainloop->quit(); } CompWatchFdHandle addWatchFd ( int fd, short int events, FdWatchCallBack callBack); void removeWatchFd (CompWatchFdHandle handle); CompFileWatch* addFileWatch ( const char *path, int mask, FileWatchCallBack callBack); CompFileWatch* removeFileWatch (CompFileWatchHandle handle); const CompFileWatchList& getFileWatches () const; void grabNotified() { grabbed = true; } void ungrabNotified() { grabbed = false; } bool isGrabbed() const { return grabbed; } void setSupportingWmCheck (Display* dpy, Window root); bool notGrabWindow(Window w) const { return w != grabWindow; } void createGrabWindow (Display* dpy, Window root, XSetWindowAttributes* attrib); void destroyGrabWindow (Display* dpy) { XDestroyWindow (dpy, grabWindow); } Time getCurrentTime (Display* dpy) const; Window const& getGrabWindow() const { return grabWindow; } void resetPossibleTap() { possibleTap = 0; } private: void *possibleTap; Glib::RefPtr mainloop; Glib::RefPtr source; Glib::RefPtr timeout; CompSignalSource *sighupSource; CompSignalSource *sigtermSource; CompSignalSource *sigintSource; Glib::RefPtr ctx; CompFileWatchList fileWatch; CompFileWatchHandle lastFileWatchHandle; // TODO - almost certainly the wrong data structure // Why not a std::map? std::list > watchFds; CompWatchFdHandle lastWatchFdHandle; bool grabbed; /* true once we receive a GrabNotify on FocusOut and false on UngrabNotify from FocusIn */ Window grabWindow; }; class KeyGrab { public: int keycode; unsigned int modifiers; int count; }; class ButtonGrab { public: int button; unsigned int modifiers; int count; }; // data members that don't belong (these probably belong // in CompScreenImpl as PrivateScreen doesn't use them) struct OrphanData : boost::noncopyable { OrphanData(); ~OrphanData(); Window activeWindow; Window nextActiveWindow; }; class GrabManager : boost::noncopyable { public: GrabManager(CompScreen *screen); bool addPassiveKeyGrab (CompAction::KeyBinding &key); void removePassiveKeyGrab (CompAction::KeyBinding &key); bool addPassiveButtonGrab (CompAction::ButtonBinding &button); void removePassiveButtonGrab (CompAction::ButtonBinding &button); void grabUngrabOneKey (unsigned int modifiers, int keycode, bool grab); bool grabUngrabKeys (unsigned int modifiers, int keycode, bool grab); void updatePassiveKeyGrabs (); void updatePassiveButtonGrabs(Window serverFrame); void setCurrentState(CompAction::State state); private: CompScreen * const screen; CompAction::State currentState; std::list buttonGrabs; std::list keyGrabs; }; class History : public virtual ::compiz::History, boost::noncopyable { public: History(); virtual ~History () {} void setCurrentActiveWindowHistory (int x, int y); void addToCurrentActiveWindowHistory (Window id); CompActiveWindowHistory* currentHistory (); unsigned int nextActiveNum () { return activeNum_++; } unsigned int activeNum () const; private: CompActiveWindowHistory history[ACTIVE_WINDOW_HISTORY_NUM]; int currentHistory_; unsigned int activeNum_; }; class ViewportRetrievalInterface { public: virtual ~ViewportRetrievalInterface () {} virtual const CompPoint & getCurrentViewport () const = 0; virtual const CompSize & viewportDimensions () const = 0; }; // Apart from a use by StartupSequence::addSequence this data // is only used by CompScreenImpl - like the OrphanData struct struct ViewPort : public ViewportRetrievalInterface { public: ViewPort(); CompPoint vp; CompSize vpSize; private: const CompPoint & getCurrentViewport () const { return vp; } const CompSize & viewportDimensions () const { return vpSize; } }; namespace viewports { void viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport, ViewportRetrievalInterface *viewports, const CompSize &screenSize); } class StartupSequence : boost::noncopyable { public: StartupSequence(); virtual ~StartupSequence() {} void addSequence (SnStartupSequence *sequence, CompPoint const& vp); void removeSequence (SnStartupSequence *sequence); void removeAllSequences (); void applyStartupProperties (CompScreen* screen, CompWindow *window); bool handleStartupSequenceTimeout (); virtual void updateStartupFeedback () = 0; bool emptySequence() const { return startupSequences.empty(); } private: std::list startupSequences; CompTimer startupSequenceTimer; }; // Implemented as a separate class to break dependency on PrivateScreen & XWindows class StartupSequenceImpl : public StartupSequence { public: StartupSequenceImpl(PrivateScreen* priv) : priv(priv) {} virtual void updateStartupFeedback (); private: PrivateScreen* const priv; }; class Extension { public: Extension() : is_enabled(), extension() {} template bool init(Display * dpy) { int error; is_enabled = ExtensionQuery(dpy, &extension, &error); return is_enabled; } template bool init(Display * dpy) { int opcode; int error; is_enabled = ExtensionQuery(dpy, &opcode, &extension, &error, NULL, NULL); if (!is_enabled) extension = -1; return is_enabled; } int isEnabled () const { return is_enabled; } int get () const { return extension; } private: bool is_enabled; int extension; }; class Ping : public virtual ::compiz::Ping { public: Ping() : lastPing_(1) {} virtual ~Ping() {} bool handlePingTimeout (WindowManager::iterator begin, WindowManager::iterator end, Display* dpy); unsigned int lastPing () const { return lastPing_; } private: unsigned int lastPing_; }; class DesktopWindowCount : public virtual ::compiz::DesktopWindowCount { public: DesktopWindowCount(); virtual ~DesktopWindowCount() {} virtual void incrementDesktopWindowCount(); virtual void incrementOpaqueDesktopWindowCount(); virtual void decrementDesktopWindowCount(); virtual void decrementOpaqueDesktopWindowCount(); virtual int desktopWindowCount(); virtual int opaqueDesktopWindowCount(); private: int countAll; int countOpaque; }; class MapNum : public virtual ::compiz::MapNum { public: MapNum(); virtual ~MapNum() {} virtual unsigned int nextMapNum(); private: unsigned int mapNum; }; class XWindowInfo : public virtual ::compiz::XWindowInfo { public: XWindowInfo(Display* const& dpy) : dpy(dpy) {} virtual ~XWindowInfo() {} virtual int getWmState (Window id); virtual void setWmState (int state, Window id) const; virtual void getMwmHints (Window id, unsigned int *func, unsigned int *decor) const; virtual unsigned int getProtocols (Window id); virtual unsigned int getWindowType (Window id); virtual unsigned int getWindowState (Window id); private: Display* const& dpy; }; unsigned int windowStateMask (Atom state); }} // namespace compiz::private_screen class FetchXEventInterface { public: virtual ~FetchXEventInterface () {} virtual bool getNextXEvent (XEvent &) = 0; }; class FetchEventInterface { public: virtual ~FetchEventInterface () {} virtual bool getNextEvent (XEvent &) = 0; }; class PrivateScreen : public CoreOptions, public FetchXEventInterface, public FetchEventInterface { public: PrivateScreen (CompScreen *screen, compiz::private_screen::WindowManager& windowManager); ~PrivateScreen (); bool initDisplay ( const char *name, compiz::private_screen::History& history, unsigned int showingDesktopMask); bool setOption (const CompString &name, CompOption::Value &value); bool getNextEvent (XEvent &); bool getNextXEvent (XEvent &); void processEvents (); bool triggerButtonPressBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments); bool triggerButtonReleaseBindings (CompOption::Vector &options, XButtonEvent *event, CompOption::Vector &arguments); bool shouldTriggerKeyPressAction (CompAction *action, XKeyEvent *event); bool shouldTriggerKeyReleaseAction (CompAction *action, XKeyEvent *event); bool shouldTriggerModifierPressAction (CompAction *action, XkbStateNotifyEvent *event); bool shouldTriggerModifierReleaseAction (CompAction *action, XkbStateNotifyEvent *event); bool triggerKeyPressBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments); bool triggerKeyReleaseBindings (CompOption::Vector &options, CompAction::Vector &actions, XKeyEvent *event, CompOption::Vector &arguments); bool triggerStateNotifyBindings (CompOption::Vector &options, CompAction::Vector &actions, XkbStateNotifyEvent *event, CompOption::Vector &arguments); bool triggerEdgeEnter (unsigned int edge, CompAction::State state, CompOption::Vector &arguments); void setAudibleBell (bool audible); bool handleActionEvent (XEvent *event); void handleSelectionRequest (XEvent *event); void handleSelectionClear (XEvent *event); bool desktopHintEqual (unsigned long *data, int size, int offset, int hintSize); void setDesktopHints (); void setVirtualScreenSize (int hsize, int vsize); void updateScreenEdges (); void reshape (int w, int h); void getDesktopHints (unsigned int showingDesktopMask); void updateScreenInfo (); void updateResources (); void updateAverageColor (Atom atom); Window getActiveWindow (Window root); void setWindowState (unsigned int state, Window id); bool readWindowProp32 (Window id, Atom property, unsigned short *returnValue); void configure (XConfigureEvent *ce); void setNumberOfDesktops (unsigned int nDesktop); void setCurrentDesktop (unsigned int desktop); void enableEdge (int edge); void disableEdge (int edge); void setDefaultWindowAttributes (XWindowAttributes *); void updateCursors (const CompString& theme, int size); Cursor cursorCache (unsigned int cursorName); static void compScreenSnEvent (SnMonitorEvent *event, void *userData); CompScreen::GrabHandle pushGrabGeneric (::compiz::private_screen::GrabType type, Cursor cursor, const char *name); int getXkbEvent() const { return xkbEvent.get(); } std::vector& getScreenInfo () { return screenInfo; } SnDisplay* getSnDisplay () const { return snDisplay; } const char* displayString() const { return displayString_; } const CompRegion& getRegion() const { return region; } const XWindowAttributes& getAttrib() const { return attrib; } Window rootWindow() const { return root; } void identifyEdgeWindow(Window id); void setPlugins(const CompOption::Value::Vector& vList); void initPlugins(); void updateClientList() { windowManager.updateClientList(*this); } void detectOutputDevices(CoreOptions& coreOptions); void updateOutputDevices(CoreOptions& coreOptions); void setPingTimerCallback(CompTimer::CallBack const& callback) { pingTimer.setCallback(callback); } public: Display* dpy; compiz::private_screen::Extension xSync; compiz::private_screen::Extension xRandr; compiz::private_screen::Extension xShape; compiz::private_screen::ViewPort viewPort; compiz::private_screen::StartupSequenceImpl startupSequence; compiz::private_screen::EventManager eventManager; compiz::private_screen::OrphanData orphanData; compiz::core::OutputDevices outputDevices; Colormap colormap; int screenNum; unsigned int nDesktop; unsigned int currentDesktop; std::vector averageColor; CompOutput fullscreenOutput; CompScreenEdge screenEdge[SCREEN_EDGE_NUM]; Window wmSnSelectionWindow; int clientPointerDeviceId; Cursor invisibleCursor; std::vector cursors; CompRect workArea; bool initialized; private: CompScreen* screen; compiz::private_screen::Extension xkbEvent; //TODO? Pull these two out as a class? bool xineramaExtension; std::vector screenInfo; SnDisplay* snDisplay; char displayString_[256]; KeyCode escapeKeyCode; KeyCode returnKeyCode; CompRegion region; Window root; XWindowAttributes attrib; SnMonitorContext* snContext; Atom wmSnAtom; Time wmSnTimestamp; unsigned long *desktopHintData; int desktopHintSize; Window edgeWindow; CompTimer pingTimer; CompTimer edgeDelayTimer; CompDelayedEdgeSettings edgeDelaySettings; Window xdndWindow; compiz::private_screen::PluginManager pluginManager; compiz::private_screen::WindowManager& windowManager; CompOption::Vector resourceManager; bool nextKeyPressIsRepeated_; }; class CompManager { public: CompManager (); bool init (); void run (); void fini (); bool parseArguments (int, char **); void usage (); static bool initPlugin (CompPlugin *p); static void finiPlugin (CompPlugin *p); private: bool disableSm; char *clientId; char *displayName; }; /** * A wrapping of the X display screen. This takes care of communication to the * X server. */ class CompScreenImpl : public CompScreen, public ServerGrabInterface, ::compiz::private_screen::DesktopWindowCount, ::compiz::private_screen::MapNum, ::compiz::private_screen::Ping, ::compiz::private_screen::XWindowInfo, ::compiz::private_screen::History { public: CompScreenImpl (); ~CompScreenImpl (); bool init (const char *name); void eventLoop (); CompFileWatchHandle addFileWatch (const char *path, int mask, FileWatchCallBack callBack); void removeFileWatch (CompFileWatchHandle handle); const CompFileWatchList& getFileWatches () const; CompWatchFdHandle addWatchFd (int fd, short int events, FdWatchCallBack callBack); void removeWatchFd (CompWatchFdHandle handle); void storeValue (CompString key, CompPrivate value); bool hasValue (CompString key); CompPrivate getValue (CompString key); void eraseValue (CompString key); Display * dpy (); CompOption::Vector & getOptions (); bool setOption (const CompString &name, CompOption::Value &value); bool XRandr (); int randrEvent (); bool XShape (); int shapeEvent (); int syncEvent (); SnDisplay * snDisplay (); Window activeWindow (); Window autoRaiseWindow (); const char * displayString (); CompWindow * findWindow (Window id); CompWindow * findTopLevelWindow (Window id, bool override_redirect = false); bool readImageFromFile (CompString &name, CompString &pname, CompSize &size, void *&data); bool writeImageToFile (CompString &path, const char *format, CompSize &size, void *data); unsigned int getWindowProp (Window id, Atom property, unsigned int defaultValue); void setWindowProp (Window id, Atom property, unsigned int value); unsigned short getWindowProp32 (Window id, Atom property, unsigned short defaultValue); void setWindowProp32 (Window id, Atom property, unsigned short value); Window root (); int xkbEvent (); XWindowAttributes attrib (); int screenNum (); CompWindowList & windows (); CompWindowList & serverWindows (); CompWindowList & destroyedWindows (); void warpPointer (int dx, int dy); Time getCurrentTime (); Window selectionWindow (); void forEachWindow (CompWindow::ForEach); void focusDefaultWindow (); void insertWindow (CompWindow *w, Window aboveId); void unhookWindow (CompWindow *w); void insertServerWindow (CompWindow *w, Window aboveId); void unhookServerWindow (CompWindow *w); Cursor normalCursor (); Cursor invisibleCursor (); Cursor cursorCache (unsigned int cursorName); /* Adds an X Pointer and Keyboard grab to the stack. Since * compiz as a client only need to grab once, multiple clients * can call this and all get events, but the pointer will * be grabbed once and the actual grab refcounted */ GrabHandle pushGrab (Cursor cursor, const char *name); /* Adds an X Pointer grab to the stack. */ GrabHandle pushPointerGrab (Cursor cursor, const char *name); /* Adds an X Keyboard grab to the stack. */ GrabHandle pushKeyboardGrab (const char *name); /* Allows you to change the pointer of your grab */ void updateGrab (GrabHandle handle, Cursor cursor); /* Removes your grab from the stack. Once the internal refcount * reaches zero, the X Pointer and Keyboard are both ungrabbed */ void removeGrab (GrabHandle handle, CompPoint *restorePointer); /* Returns true if a grab other than the grabs specified here * exists */ bool otherGrabExist (const char *, ...); /* Returns true if the specified grab exists */ bool grabExist (const char *); /* Returns true if the X Pointer and / or Keyboard is grabbed * by anything (another application, pluigins etc) */ bool grabbed (); const CompWindowVector & clientList (bool stackingOrder); bool addAction (CompAction *action); void removeAction (CompAction *action); void updateWorkarea (); void toolkitAction (Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2); void runCommand (CompString command); void moveViewport (int tx, int ty, bool sync); void sendWindowActivationRequest (Window id); int outputDeviceForPoint (int x, int y); int outputDeviceForPoint (const CompPoint &point); CompRect getCurrentOutputExtents (); const CompRect & getWorkareaForOutput (unsigned int outputNum) const; void viewportForGeometry (const CompWindow::Geometry &gm, CompPoint &viewport); int outputDeviceForGeometry (const CompWindow::Geometry& gm); const CompPoint & vp () const; const CompSize & vpSize () const; CompOutput::vector & outputDevs (); CompOutput & currentOutputDev () const; const CompRect & workArea () const; unsigned int currentDesktop (); unsigned int nDesktop (); bool shouldSerializePlugins () ; const CompRegion & region () const; bool hasOverlappingOutputs (); CompOutput & fullscreenOutput (); std::vector & screenInfo (); CompIcon *defaultIcon () const; bool updateDefaultIcon (); void updateSupportedWmHints (); unsigned int showingDesktopMask() const; virtual bool grabsEmpty() const; virtual void sizePluginClasses(unsigned int size); virtual void setWindowState (unsigned int state, Window id); virtual void addToDestroyedWindows(CompWindow * cw); virtual void processEvents (); virtual void alwaysHandleEvent (XEvent *event); virtual ServerGrabInterface * serverGrabInterface (); virtual void updatePassiveKeyGrabs () const; virtual void updatePassiveButtonGrabs(Window serverFrame); virtual bool displayInitialised() const; virtual void applyStartupProperties (CompWindow *window); virtual void updateClientList(); virtual CompWindow * getTopWindow() const; virtual CompWindow * getTopServerWindow() const; virtual CoreOptions& getCoreOptions(); virtual Colormap colormap() const; virtual const unsigned short * averageColor() const; virtual void setCurrentDesktop (unsigned int desktop); virtual Window activeWindow() const; virtual bool grabWindowIsNot(Window w) const; virtual void incrementPendingDestroys(); virtual void setNextActiveWindow(Window id); virtual Window getNextActiveWindow() const; virtual CompWindow * focusTopMostWindow (); public : static bool showDesktop (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool windowMenu (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool closeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool unmaximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool unmaximizeOrMinimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool minimizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool maximizeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool maximizeWinHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool maximizeWinVertically (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool raiseWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool lowerWin (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleWinMaximized (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleWinMaximizedHorizontally (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool toggleWinMaximizedVertically (CompAction *action, CompAction::State state, CompOption::Vector &options); static bool shadeWin (CompAction *action, CompAction::State state, CompOption::Vector &options); bool createFailed () const; private: virtual bool _setOptionForPlugin(const char *, const char *, CompOption::Value &); virtual bool _initPluginForScreen(CompPlugin *); virtual void _finiPluginForScreen(CompPlugin *); virtual void _handleEvent(XEvent *event); virtual void _logMessage(const char *, CompLogLevel, const char*); virtual void _enterShowDesktopMode(); virtual void _leaveShowDesktopMode(CompWindow *); virtual void _addSupportedAtoms(std::vector& atoms); // These are stubs - but allow mocking of AbstractCompWindow virtual void _fileWatchAdded(CompFileWatch *); virtual void _fileWatchRemoved(CompFileWatch *); virtual void _sessionEvent(CompSession::Event, CompOption::Vector &); virtual void _handleCompizEvent(const char *, const char *, CompOption::Vector &); virtual bool _fileToImage(CompString &, CompSize &, int &, void *&); virtual bool _imageToFile(CompString &, CompString &, CompSize &, int, void *); virtual CompMatch::Expression * _matchInitExp(const CompString&); virtual void _matchExpHandlerChanged(); virtual void _matchPropertyChanged(CompWindow *); virtual void _outputChangeNotify(); virtual void _cursorChangeNotify(const CompString&, int); virtual void _averageColorChangeNotify(const unsigned short*); void grabServer (); void ungrabServer (); void syncServer (); bool handlePingTimeout(); Window below; CompTimer autoRaiseTimer_; Window autoRaiseWindow_; CompIcon *defaultIcon_; compiz::private_screen::GrabManager mutable grabManager; ValueHolder valueHolder; bool eventHandled; PrivateScreen privateScreen; compiz::private_screen::WindowManager windowManager; unsigned int showingDesktopMask_; }; #endif ./src/region/0000755000004100000410000000000013246301623013315 5ustar www-datawww-data./src/region/CMakeLists.txt0000644000004100000410000000177013246301623016062 0ustar www-datawww-datapkg_check_modules ( X11 REQUIRED x11 ) INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/point/include ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ${GLIBMM_INCLUDE_DIRS} ) LINK_DIRECTORIES (${X11_LIBRARY_DIRS}) SET ( PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/core/region.h ) SET ( PRIVATE_HEADERS ) SET( SRCS ${CMAKE_CURRENT_SOURCE_DIR}/src/region.cpp ) ADD_LIBRARY( compiz_region STATIC ${SRCS} ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ) IF (COMPIZ_BUILD_TESTING) ADD_SUBDIRECTORY( ${CMAKE_CURRENT_SOURCE_DIR}/tests ) ENDIF (COMPIZ_BUILD_TESTING) SET_TARGET_PROPERTIES( compiz_region PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}" ) install (FILES ${PUBLIC_HEADERS} DESTINATION ${COMPIZ_CORE_INCLUDE_DIR}) TARGET_LINK_LIBRARIES( compiz_region compiz_point compiz_rect ${X11_LIBRARIES} ) ./src/region/include/0000755000004100000410000000000013246301623014740 5ustar www-datawww-data./src/region/include/core/0000755000004100000410000000000013246301623015670 5ustar www-datawww-data./src/region/include/core/region.h0000644000004100000410000001372613246301623017335 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #ifndef _COMPREGION_H #define _COMPREGION_H #include #include #include #include #include class CompRegion; COMPIZ_EXTERN_STD(vector) /** * A 2D region with an (x,y) position and arbitrary dimensions similar to * an XRegion. It's data membmers are private and must be manipulated with * set() methods. */ class CompRegion { public: typedef std::vector Vector; public: CompRegion (); CompRegion (const CompRegion &); CompRegion (int x, int y, int w, int h); CompRegion (const CompRect &); ~CompRegion (); static const CompRegion &infinite(); static const CompRegion &empty(); /** * Returns a CompRect which encapsulates a given CompRegion */ CompRect boundingRect () const; bool isEmpty () const; /** * Returns the number of XRectangles in the XRegion handle */ int numRects () const; /** * Returns a vector of all the XRectangles in the XRegion handle */ CompRect::vector rects () const; /** * Returns the internal XRegion handle */ Region handle () const; /** * Returns true if the specified CompPoint falls within the * CompRegion */ bool contains (const CompPoint &) const; /** * Returns true if the specified CompRect falls within the * CompRegion */ bool contains (const CompRect &) const; /** * Returns true if the specified size falls withing the * CompRegion */ bool contains (int x, int y, int width, int height) const; /** * Returns a CompRegion that is the result of an intersect with * the specified CompRegion and the region */ CompRegion intersected (const CompRegion &) const; /** * Returns a CompRegion that is the result of an intersect with * the specified CompRect and the region */ CompRegion intersected (const CompRect &) const; /** * Returns true if a specified CompRegion intersects a region */ bool intersects (const CompRegion &) const; /** * Returns true if a specified CompRect intersects a region */ bool intersects (const CompRect &) const; /** * Returns a CompRegion covering the area of the region * and not including the area of the specified CompRegion */ CompRegion subtracted (const CompRegion &) const; /** * Returns a CompRegion covering the area of the region * and not including the area of the specified CompRect */ CompRegion subtracted (const CompRect &) const; /** * Moves a region by x and y amount */ void translate (int dx, int dy); /** * Moves a region by an amount specified by the co-ordinates of a * CompPoint */ void translate (const CompPoint &); /** * Returns a CompRegion which is the result of the region being moved * by dx and dy amount */ CompRegion translated (int, int) const; /** * Returns a CompRegion which is the result of the region being moved * by an amount specified by the co-ordinates of a CompPoint */ CompRegion translated (const CompPoint &) const; void shrink (int, int); void shrink (const CompPoint &); CompRegion shrinked (int, int) const; CompRegion shrinked (const CompPoint &) const; /** * Returns a CompRegion which is the result of the region joined * with a specified CompRegion */ CompRegion united (const CompRegion &) const; /** * Returns a CompRegion which is the result of the region joined * with a specified CompRect */ CompRegion united (const CompRect &) const; /** * Returns a CompRegion which is the result of the region joined * with a specified CompRegion, excluding the area in which * both regions intersect */ CompRegion xored (const CompRegion &) const; bool operator== (const CompRegion &) const; bool operator!= (const CompRegion &) const; const CompRegion operator& (const CompRegion &) const; const CompRegion operator& (const CompRect &) const; CompRegion & operator&= (const CompRegion &); CompRegion & operator&= (const CompRect &); const CompRegion operator+ (const CompRegion &) const; const CompRegion operator+ (const CompRect &) const; CompRegion & operator+= (const CompRegion &); CompRegion & operator+= (const CompRect &); const CompRegion operator- (const CompRegion &) const; const CompRegion operator- (const CompRect &) const; CompRegion & operator-= (const CompRegion &); CompRegion & operator-= (const CompRect &); CompRegion & operator= (const CompRegion &); const CompRegion operator^ (const CompRegion &) const; CompRegion & operator^= (const CompRegion &); const CompRegion operator| (const CompRegion &) const; CompRegion & operator|= (const CompRegion &); protected: /* Construct a CompRegion based on an externally managed Region */ explicit CompRegion (Region); void init (); void *priv; }; class CompRegionRef : public CompRegion { public: explicit CompRegionRef (Region); ~CompRegionRef (); }; #endif ./src/region/src/0000755000004100000410000000000013246301624014105 5ustar www-datawww-data./src/region/src/region.cpp0000644000004100000410000002074613246301623016104 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk */ #include "core/rect.h" #include "core/region.h" #include #include #include #include #include #include #define foreach BOOST_FOREACH template class std::vector; const CompRegion & CompRegion::empty () { static const CompRegion r; return r; } const CompRegion & CompRegion::infinite () { static const CompRegion r(CompRect (MINSHORT, MINSHORT, MAXSHORT * 2, MAXSHORT * 2)); return r; } CompRegion::CompRegion () { init (); } CompRegion::CompRegion (const CompRegion &c) { init (); XUnionRegion (empty ().handle (), c.handle (), handle ()); } CompRegion::CompRegion ( int x, int y, int w, int h) { init (); XRectangle rect; rect.x = x; rect.y = y; rect.width = w; rect.height = h; XUnionRectWithRegion (&rect, empty ().handle (), handle ()); } CompRegion::CompRegion (const CompRect &r) { init (); XRectangle rect; rect.x = r.x (); rect.y = r.y (); rect.width = r.width (); rect.height = r.height (); XUnionRectWithRegion (&rect, empty ().handle (), handle ()); } CompRegion::CompRegion (Region external) { priv = external; } CompRegionRef::CompRegionRef (Region external) : CompRegion (external) { } CompRegionRef::~CompRegionRef () { /* Ensure CompRegion::~CompRegion does not destroy the region, because it's external and we don't own it. */ priv = NULL; } CompRegion::~CompRegion () { if (priv) XDestroyRegion (static_cast (priv)); } void CompRegion::init () { assert (sizeof (Region) == sizeof (void*)); priv = XCreateRegion (); } Region CompRegion::handle () const { return static_cast (priv); } CompRegion & CompRegion::operator= (const CompRegion &c) { XUnionRegion (empty ().handle (), c.handle (), handle ()); return *this; } bool CompRegion::operator== (const CompRegion &c) const { return XEqualRegion (handle (), c.handle ()); } bool CompRegion::operator!= (const CompRegion &c) const { return !(*this == c); } CompRect CompRegion::boundingRect () const { BOX b = handle ()->extents; return CompRect (b.x1, b.y1, b.x2 - b.x1, b.y2 - b.y1); } bool CompRegion::contains (const CompPoint &p) const { return XPointInRegion (handle (), p.x (), p.y ()); } bool CompRegion::contains (const CompRect &r) const { int result; result = XRectInRegion (handle (), r.x (), r.y (), r.width (), r.height ()); return result == RectangleIn; } bool CompRegion::contains (int x, int y, int width, int height) const { int result; result = XRectInRegion (handle (), x, y, width, height); return result == RectangleIn; } CompRegion CompRegion::intersected (const CompRegion &r) const { CompRegion reg (r); XIntersectRegion (reg.handle (), handle (), reg.handle ()); return reg; } CompRegion CompRegion::intersected (const CompRect &r) const { CompRegion reg (r); XIntersectRegion (reg.handle (), handle (), reg.handle ()); return reg; } bool CompRegion::intersects (const CompRegion &r) const { return !intersected (r).isEmpty (); } bool CompRegion::intersects (const CompRect &r) const { int result; result = XRectInRegion (handle (), r.x (), r.y (), r.width (), r.height ()); return result != RectangleOut; } bool CompRegion::isEmpty () const { return XEmptyRegion (handle ()); } int CompRegion::numRects () const { return handle ()->numRects; } CompRect::vector CompRegion::rects () const { CompRect::vector rv; if (!numRects ()) return rv; BOX b; for (int i = 0; i < handle ()->numRects; i++) { b = handle ()->rects[i]; rv.push_back (CompRect (b.x1, b.y1, b.x2 - b.x1, b.y2 - b.y1)); } return rv; } CompRegion CompRegion::subtracted (const CompRegion &r) const { CompRegion rv; XSubtractRegion (handle (), r.handle (), rv.handle ()); return rv; } CompRegion CompRegion::subtracted (const CompRect &r) const { CompRegion rv; XSubtractRegion (handle (), r.region (), rv.handle ()); return rv; } void CompRegion::translate (int dx, int dy) { XOffsetRegion (handle (), dx, dy); } void CompRegion::translate (const CompPoint &p) { translate (p.x (), p.y ()); } CompRegion CompRegion::translated (int dx, int dy) const { CompRegion rv (*this); rv.translate (dx, dy); return rv; } CompRegion CompRegion::translated (const CompPoint &p) const { CompRegion rv (*this); rv.translate (p); return rv; } void CompRegion::shrink (int dx, int dy) { XShrinkRegion (handle (), dx, dy); } void CompRegion::shrink (const CompPoint &p) { shrink (p.x (), p.y ()); } CompRegion CompRegion::shrinked (int dx, int dy) const { CompRegion rv (*this); rv.shrink (dx, dy); return rv; } CompRegion CompRegion::shrinked (const CompPoint &p) const { CompRegion rv (*this); rv.shrink (p); return rv; } CompRegion CompRegion::united (const CompRegion &r) const { CompRegion rv; XUnionRegion (handle (), r.handle (), rv.handle ()); return rv; } CompRegion CompRegion::united (const CompRect &r) const { CompRegion rv; XUnionRegion (handle (), r.region (), rv.handle ()); return rv; } CompRegion CompRegion::xored (const CompRegion &r) const { CompRegion rv; XXorRegion (handle (), r.handle (), rv.handle ()); return rv; } const CompRegion CompRegion::operator& (const CompRegion &r) const { return intersected (r); } const CompRegion CompRegion::operator& (const CompRect &r) const { return intersected (r); } CompRegion & CompRegion::operator&= (const CompRegion &r) { XIntersectRegion (r.handle (), handle (), handle ()); return *this; } CompRegion & CompRegion::operator&= (const CompRect &r) { CompRegionRef ref (r.region ()); XIntersectRegion (ref.handle (), handle (), handle ()); return *this; } const CompRegion CompRegion::operator+ (const CompRegion &r) const { return united (r); } const CompRegion CompRegion::operator+ (const CompRect &r) const { return united (r); } CompRegion & CompRegion::operator+= (const CompRegion &r) { XUnionRegion (handle (), r.handle (), handle ()); return *this; } CompRegion & CompRegion::operator+= (const CompRect &r) { CompRegionRef ref (r.region ()); XUnionRegion (handle (), ref.handle (), handle ()); return *this; } const CompRegion CompRegion::operator- (const CompRegion &r) const { return subtracted (r); } const CompRegion CompRegion::operator- (const CompRect &r) const { return subtracted (r); } CompRegion & CompRegion::operator-= (const CompRegion &r) { XSubtractRegion (handle (), r.handle (), handle ()); return *this; } CompRegion & CompRegion::operator-= (const CompRect &r) { CompRegionRef ref (r.region ()); XSubtractRegion (handle (), ref.handle (), handle ()); return *this; } const CompRegion CompRegion::operator^ (const CompRegion &r) const { return xored (r); } CompRegion & CompRegion::operator^= (const CompRegion &r) { XXorRegion (handle (), r.handle (), handle ()); return *this; } const CompRegion CompRegion::operator| (const CompRegion &r) const { return united (r); } CompRegion & CompRegion::operator|= (const CompRegion &r) { XUnionRegion (handle (), r.handle (), handle ()); return *this; } ./src/region/tests/0000755000004100000410000000000013246301624014460 5ustar www-datawww-data./src/region/tests/CMakeLists.txt0000644000004100000410000000124213246301623017216 0ustar www-datawww-datainclude_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) add_executable( compiz_region_test ${CMAKE_CURRENT_SOURCE_DIR}/test-region.cpp ) target_link_libraries( compiz_region_test compiz_region compiz_rect compiz_point ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ) compiz_discover_tests (compiz_region_test COVERAGE compiz_region) ./src/region/tests/test-region.cpp0000644000004100000410000004121313246301623017424 0ustar www-datawww-data#include "core/region.h" #undef Bool #undef None #include #include #include namespace { int const x1(13); int const y1(11); int const width1(97); int const height1(93); int const x2(53); int const y2(47); int const width2(147); int const height2(157); CompRect rect1(x1, y1, width1, height1); CompRect rect2(x2, y2, width2, height2); int const dx(3); int const dy(5); TEST(RegionTest, create_and_destroy) { CompRegion default_ctor; CompRegion xywh_ctor(x1, y1, width1, height1); EXPECT_TRUE(default_ctor.isEmpty()); EXPECT_FALSE(xywh_ctor.isEmpty()); } TEST(RegionTest, create_from_points_and_destroy) { CompRegion rect_ctor(rect1); } TEST(RegionTest, create_compare_destroy1) { CompRegion expect(x1, y1, width1, height1); CompRegion actual(x1, y1, width1, height1); EXPECT_EQ(expect.boundingRect (), actual.boundingRect ()); EXPECT_EQ(expect.rects (), actual.rects ()); EXPECT_EQ(expect.isEmpty (), actual.isEmpty ()); EXPECT_EQ(expect.numRects (), actual.numRects ()); ASSERT_EQ(expect, actual); } TEST(RegionTest, create_compare_destroy2) { CompRegion expect(rect1); CompRegion actual(rect1); EXPECT_EQ(expect.boundingRect (), actual.boundingRect ()); EXPECT_EQ(expect.rects (), actual.rects ()); EXPECT_EQ(expect.isEmpty (), actual.isEmpty ()); EXPECT_EQ(expect.numRects (), actual.numRects ()); ASSERT_EQ(expect, actual); } TEST(RegionTest, create_copy_compare_destroy1) { CompRegion test(x1, y1, width1, height1); CompRegion copy(test); EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); //ASSERT_EQ(test, copy); // TODO: find out why this doesn't work } TEST(RegionTest, create_copy_compare_destroy2) { CompRegion test(rect1); CompRegion copy(test); EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); ASSERT_EQ(test, copy); } TEST(RegionTest, create_assign_compare_destroy1) { CompRegion test(x1, y1, width1, height1); CompRegion copy; copy = test; EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); ASSERT_EQ(test, copy); } TEST(RegionTest, create_assign_compare_destroy2) { CompRegion test(rect1); CompRegion copy; copy = test; EXPECT_EQ(test.boundingRect (), copy.boundingRect ()); EXPECT_EQ(test.rects (), copy.rects ()); EXPECT_EQ(test.isEmpty (), copy.isEmpty ()); EXPECT_EQ(test.numRects (), copy.numRects ()); ASSERT_EQ(test, copy); } TEST(RegionTest, contains_points) { CompRegion r1(x1, y1, width1, height1); EXPECT_TRUE(r1.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1.contains(CompPoint(x1, y1+height1-1))); EXPECT_TRUE(r1.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_TRUE(r1.contains(CompPoint(x1+width1/2, y1+height1/2))); EXPECT_FALSE(r1.contains(CompPoint(x1-1, y1))); EXPECT_FALSE(r1.contains(CompPoint(x1, y1-1))); EXPECT_FALSE(r1.contains(CompPoint(x1+width1, y1))); EXPECT_FALSE(r1.contains(CompPoint(x1, y1+height1))); EXPECT_FALSE(r1.contains(CompPoint(x1+width1, y1+height1))); CompRegion r2(rect1); EXPECT_TRUE(r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_TRUE(r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r2.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_TRUE(r2.contains(CompPoint(x1+width1/2, y1+height1/2))); EXPECT_FALSE(r2.contains(CompPoint(x1-1, y1))); EXPECT_FALSE(r2.contains(CompPoint(x1, y1-1))); EXPECT_FALSE(r2.contains(CompPoint(x1+width1, y1))); EXPECT_FALSE(r2.contains(CompPoint(x1, y1+height1))); EXPECT_FALSE(r2.contains(CompPoint(x1+width1, y1+height1))); } TEST(RegionTest, contains_rects) { CompRegion r1(x1, y1, width1, height1); EXPECT_TRUE(r1.contains(CompRect(x1, y1, width1, height1))); EXPECT_TRUE(r1.contains(CompRect(x1, y1+1, width1, height1-1))); EXPECT_TRUE(r1.contains(CompRect(x1+1, y1, width1-1, height1))); EXPECT_TRUE(r1.contains(CompRect(x1, y1, width1-1, height1))); EXPECT_TRUE(r1.contains(CompRect(x1, y1, width1, height1-1))); EXPECT_FALSE(r1.contains(CompRect(x1+1, y1, width1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1+1, width1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1, width1+1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1, width1, height1+1))); EXPECT_FALSE(r1.contains(CompRect(x1-1, y1, width1, height1))); EXPECT_FALSE(r1.contains(CompRect(x1, y1-1, width1, height1))); CompRegion r2(rect1); EXPECT_TRUE(r2.contains(CompRect(x1, y1, width1, height1))); EXPECT_TRUE(r2.contains(CompRect(x1, y1+1, width1, height1-1))); EXPECT_TRUE(r2.contains(CompRect(x1+1, y1, width1-1, height1))); EXPECT_TRUE(r2.contains(CompRect(x1, y1, width1-1, height1))); EXPECT_TRUE(r2.contains(CompRect(x1, y1, width1, height1-1))); EXPECT_FALSE(r2.contains(CompRect(x1+1, y1, width1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1+1, width1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1, width1+1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1, width1, height1+1))); EXPECT_FALSE(r2.contains(CompRect(x1-1, y1, width1, height1))); EXPECT_FALSE(r2.contains(CompRect(x1, y1-1, width1, height1))); } TEST(RegionTest, contains_xywh) { CompRegion r1(x1, y1, width1, height1); EXPECT_TRUE(r1.contains(x1, y1, width1, height1)); EXPECT_TRUE(r1.contains(x1, y1+1, width1, height1-1)); EXPECT_TRUE(r1.contains(x1+1, y1, width1-1, height1)); EXPECT_TRUE(r1.contains(x1, y1, width1-1, height1)); EXPECT_TRUE(r1.contains(x1, y1, width1, height1-1)); EXPECT_FALSE(r1.contains(x1+1, y1, width1, height1)); EXPECT_FALSE(r1.contains(x1, y1+1, width1, height1)); EXPECT_FALSE(r1.contains(x1, y1, width1+1, height1)); EXPECT_FALSE(r1.contains(x1, y1, width1, height1+1)); EXPECT_FALSE(r1.contains(x1-1, y1, width1, height1)); EXPECT_FALSE(r1.contains(x1, y1-1, width1, height1)); CompRegion r2(rect1); EXPECT_TRUE(r2.contains(x1, y1, width1, height1)); EXPECT_TRUE(r2.contains(x1, y1+1, width1, height1-1)); EXPECT_TRUE(r2.contains(x1+1, y1, width1-1, height1)); EXPECT_TRUE(r2.contains(x1, y1, width1-1, height1)); EXPECT_TRUE(r2.contains(x1, y1, width1, height1-1)); EXPECT_FALSE(r2.contains(x1+1, y1, width1, height1)); EXPECT_FALSE(r2.contains(x1, y1+1, width1, height1)); EXPECT_FALSE(r2.contains(x1, y1, width1+1, height1)); EXPECT_FALSE(r2.contains(x1, y1, width1, height1+1)); EXPECT_FALSE(r2.contains(x1-1, y1, width1, height1)); EXPECT_FALSE(r2.contains(x1, y1-1, width1, height1)); } TEST(RegionTest, equivalent_creates_compare_equal) { CompRegion expect(x1, y1, width1, height1); CompRegion actual(rect1); EXPECT_EQ(expect.boundingRect (), actual.boundingRect ()); EXPECT_EQ(expect.rects (), actual.rects ()); EXPECT_EQ(expect.isEmpty (), actual.isEmpty ()); EXPECT_EQ(expect.numRects (), actual.numRects ()); ASSERT_EQ(expect, actual); } TEST(RegionTest, different_creates_compare_unequal) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(x2, y2, width2, height2); EXPECT_NE(r1.boundingRect (), r2.boundingRect ()); EXPECT_NE(r1.rects (), r2.rects ()); EXPECT_EQ(r1.isEmpty (), r2.isEmpty ()); EXPECT_EQ(r1.numRects (), r2.numRects ()); ASSERT_NE(r1, r2); CompRegion r3(rect1); CompRegion r4(rect2); EXPECT_NE(r3.boundingRect (), r4.boundingRect ()); EXPECT_NE(r3.rects (), r4.rects ()); EXPECT_EQ(r3.isEmpty (), r4.isEmpty ()); EXPECT_EQ(r3.numRects (), r4.numRects ()); ASSERT_NE(r3, r4); } TEST(RegionTest, intersection) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(x2, y2, width2, height2); EXPECT_TRUE(r1.intersects(r1)); EXPECT_TRUE(r1.intersects(r2)); EXPECT_TRUE(r2.intersects(r1)); EXPECT_TRUE(r2.intersects(r2)); EXPECT_TRUE(r1.intersects(rect1)); EXPECT_TRUE(r2.intersects(rect1)); EXPECT_TRUE(r1.intersects(rect2)); EXPECT_TRUE(r2.intersects(rect2)); CompRegion r1_self(r1.intersected(r1)); EXPECT_EQ(r1, r1_self); CompRegion r2_self(r2.intersected(r2)); EXPECT_EQ(r2, r2_self); CompRegion r1_r2(r1.intersected(r2)); CompRegion r2_r1(r2.intersected(r1)); EXPECT_EQ(r1_r2, r2_r1); EXPECT_TRUE(r1_r2.intersects(rect1)); EXPECT_TRUE(r1_r2.intersects(rect2)); EXPECT_TRUE(r2_r1.intersects(rect1)); EXPECT_TRUE(r2_r1.intersects(rect2)); CompRegion r1_rect1(r1.intersected(rect1)); EXPECT_EQ(r1, r1_rect1); CompRegion r2_rect2(r2.intersected(rect2)); EXPECT_EQ(r2, r2_rect2); CompRegion r1_rect2(r1.intersected(rect2)); CompRegion r2_rect1(r2.intersected(rect1)); EXPECT_EQ(r1_r2, r1_rect2); EXPECT_EQ(r1_r2, r2_rect1); CompRect expect(x2, y2, width1-(x2-x1), height1-(y2-y1)); EXPECT_EQ(expect, r1_r2.boundingRect()); } TEST(RegionTest, subtract) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(x2, y2, width2, height2); CompRegion r1_r2(r1.subtracted(r2)); CompRegion r2_r1(r2.subtracted(r1)); EXPECT_FALSE(r1_r2.intersects(r2_r1)); EXPECT_NE(r1, r1_r2); EXPECT_NE(r2, r2_r1); EXPECT_EQ(r1.boundingRect(), r1_r2.boundingRect()); EXPECT_EQ(r2.boundingRect(), r2_r1.boundingRect()); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_r2.contains(rect1)); EXPECT_FALSE(r1_r2.contains(rect2)); EXPECT_EQ(2, r1_r2.numRects()); typedef std::vector vcr; { vcr const& rects = r1_r2.rects(); EXPECT_EQ(2, rects.size()); for(vcr::const_iterator i = rects.begin(); i !=rects.end(); ++i) { EXPECT_TRUE(r1.contains(*i)); EXPECT_FALSE(r2.contains(*i)); } } // Much the same with rects instead of regions CompRegion r1_rect2(r1.subtracted(rect2)); CompRegion r2_rect1(r2.subtracted(rect1)); EXPECT_FALSE(r1_rect2.intersects(r2_rect1)); EXPECT_NE(r1, r1_rect2); EXPECT_NE(r2, r2_rect1); EXPECT_EQ(r1.boundingRect(), r1_rect2.boundingRect()); EXPECT_EQ(r2.boundingRect(), r2_rect1.boundingRect()); EXPECT_TRUE(r1_rect2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_rect2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_rect2.contains(CompPoint(x1, y1+height1-1))); EXPECT_FALSE(r1_rect2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_rect2.contains(rect1)); EXPECT_FALSE(r1_rect2.contains(rect2)); EXPECT_EQ(2, r1_rect2.numRects()); typedef std::vector vcr; { vcr const& rects = r1_rect2.rects(); EXPECT_EQ(2, rects.size()); for(vcr::const_iterator i = rects.begin(); i !=rects.end(); ++i) { EXPECT_TRUE(r1.contains(*i)); EXPECT_FALSE(r2.contains(*i)); } } } TEST(RegionTest, translate) { CompRegion r1(CompRegion(x1, y1, width1, height1).subtracted(rect2)); CompRegion r2(r1.translated(dx, dy)); EXPECT_NE(r1, r2); // Bloody daft to use a "point" as a displacement CompRegion r3(r1.translated(CompPoint(dx, dy))); EXPECT_NE(r1, r3); EXPECT_EQ(r2, r3); r2.translate(-dx, -dy); EXPECT_EQ(r1, r2); // Bloody daft to use a "point" as a displacement r3.translate(CompPoint(-dx, -dy)); EXPECT_EQ(r1, r3); } TEST(RegionTest, shrink) { CompRegion r1(CompRegion(x1, y1, width1, height1).subtracted(rect2)); CompRegion r2(r1.shrinked(dx, dy)); EXPECT_NE(r1, r2); // Bloody daft to use a "point" as a boundary delta CompRegion r3(r1.shrinked(CompPoint(dx, dy))); EXPECT_NE(r1, r3); EXPECT_EQ(r2, r3); r2.shrink(-dx, -dy); EXPECT_EQ(r1, r2); // Bloody daft to use a "point" as a boundary delta r3.shrink(CompPoint(-dx, -dy)); EXPECT_EQ(r1, r3); } TEST(RegionTest, unite) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(rect2); CompRegion r1_self(r1.united(r1)); EXPECT_EQ(r1, r1_self); CompRegion r2_self(r2.united(r2)); EXPECT_EQ(r2, r2_self); CompRegion r1_r2(r1.united(r2)); CompRegion r2_r1(r2.united(r1)); EXPECT_EQ(r1_r2, r2_r1); EXPECT_TRUE(r1_r2.contains(x1, y1, width1, height1)); EXPECT_TRUE(r1_r2.contains(rect2)); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_r2.contains(CompPoint(x1, y2+height2-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2+width2-1, y1))); } TEST(RegionTest, xored) { CompRegion r1(x1, y1, width1, height1); CompRegion r2(rect2); CompRegion r1_self(r1.xored(r1)); EXPECT_NE(r1, r1_self); EXPECT_TRUE(r1_self.isEmpty()); CompRegion r2_self(r2.xored(r2)); EXPECT_NE(r2, r2_self); EXPECT_TRUE(r2_self.isEmpty()); CompRegion r1_r2(r1.xored(r2)); CompRegion r2_r1(r2.xored(r1)); EXPECT_EQ(r1_r2, r2_r1); EXPECT_FALSE(r1_r2.contains(x1, y1, width1, height1)); EXPECT_FALSE(r1_r2.contains(rect2)); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1+width1-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x1, y1+height1-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x1+width1-1, y1+height1-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2, y2))); EXPECT_FALSE(r1_r2.contains(CompPoint(x1, y2+height2-1))); EXPECT_FALSE(r1_r2.contains(CompPoint(x2+width2-1, y1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2, y2+height2-1))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2+width2-1, y2))); EXPECT_TRUE(r1_r2.contains(CompPoint(x2+width2-1, y2+height2-1))); } // The operators should be non-members and syntactic sugar. But... TEST(RegionTest, operators) { CompRegion r1(rect1); CompRegion r2(rect2); { // operator&() varients CompRegion expect(r1.intersected(rect2)); EXPECT_EQ(expect, r1 & r2); EXPECT_EQ(expect, r1 & rect2); EXPECT_EQ(expect, CompRegion(r1) &= r2); EXPECT_EQ(expect, CompRegion(r1) &= rect2); } { // operator+() varients CompRegion expect(r1.united(rect2)); EXPECT_EQ(expect, r1 + r2); EXPECT_EQ(expect, r1 + rect2); EXPECT_EQ(expect, CompRegion(r1) += r2); EXPECT_EQ(expect, CompRegion(r1) += rect2); // operator|() varients EXPECT_EQ(expect, r1 | r2); EXPECT_EQ(expect, r1 | rect2); EXPECT_EQ(expect, CompRegion(r1) |= r2); EXPECT_EQ(expect, CompRegion(r1) |= rect2); } { // operator-() varients CompRegion expect(r1.subtracted(rect2)); EXPECT_EQ(expect, r1 - r2); EXPECT_EQ(expect, r1 - rect2); EXPECT_EQ(expect, CompRegion(r1) -= r2); EXPECT_EQ(expect, CompRegion(r1) -= rect2); } { // operator^() varients CompRegion expect(r1.xored(rect2)); EXPECT_EQ(expect, r1 ^ r2); EXPECT_EQ(expect, r1 ^ rect2); EXPECT_EQ(expect, CompRegion(r1) ^= r2); EXPECT_EQ(expect, CompRegion(r1) ^= rect2); } } TEST(RegionTest, external_refs) { CompRegion r1(rect1); CompRegion r2(rect2); CompRegionRef rr1(r1.handle()); CompRegionRef rr2(r2.handle()); { // Verify that the refs don't free the underlying Region. If they // do then the following EXPECT_EQ's should crash. CompRegionRef tmp1(r1.handle()); CompRegionRef tmp2(r2.handle()); } EXPECT_EQ(r1, rr1); EXPECT_EQ(r1.handle(), rr1.handle()); EXPECT_EQ(r2, rr2); EXPECT_EQ(r2.handle(), rr2.handle()); EXPECT_EQ(r1 & r2, rr1 & rr2); EXPECT_EQ(r1 & r2, rr1 & r2); EXPECT_EQ(r1 & rr2, rr1 & r2); EXPECT_EQ(r1 | r2, rr1 | rr2); EXPECT_EQ(r1 | r2, rr1 | r2); EXPECT_EQ(r1 | rr2, rr1 | r2); EXPECT_EQ(r1 - r2, rr1 - rr2); EXPECT_EQ(r1 - r2, rr1 - r2); EXPECT_EQ(r1 - rr2, rr1 - r2); EXPECT_EQ(r1 ^ r2, rr1 ^ rr2); EXPECT_EQ(r1 ^ r2, rr1 ^ r2); EXPECT_EQ(r1 ^ rr2, rr1 ^ r2); CompRegion *p = new CompRegion(r1); CompRegionRef *rp = new CompRegionRef(p->handle()); ASSERT_EQ(*rp, r1); delete rp; ASSERT_EQ(*p, r1); delete p; } } ./src/wrapsystem/0000755000004100000410000000000013246301623014250 5ustar www-datawww-data./src/wrapsystem/tests/0000755000004100000410000000000013246301624015413 5ustar www-datawww-data./src/wrapsystem/tests/CMakeLists.txt0000644000004100000410000000047613246301623020161 0ustar www-datawww-datainclude_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../../include ) add_executable( compiz_wrapsystem_test ${CMAKE_CURRENT_SOURCE_DIR}/test-wrapsystem.cpp ) target_link_libraries( compiz_wrapsystem_test ${GTEST_BOTH_LIBRARIES} ) compiz_discover_tests (compiz_wrapsystem_test COVERAGE compiz_core)./src/wrapsystem/tests/test-wrapsystem.cpp0000644000004100000410000001347213246301623021320 0ustar www-datawww-data#include "core/wrapsystem.h" #include //#define TEST_OLD_MACROS namespace { class TestImplementation; class TestInterface : public WrapableInterface { public: TestInterface(); ~TestInterface(); virtual void testMethodReturningVoid() /* const */ = 0; virtual int testMethodReturningInt(int i) /* const */ = 0; static int testMethodReturningVoidCalls; static int testMethodReturningIntCalls; private: TestInterface(TestInterface const&); TestInterface& operator=(TestInterface const&); }; // Needs a magic number for the count of "wrappable" functions class TestImplementation : public WrapableHandler { public: // 1. need for magic numbers // 2. why can't we just pass &TestInterface::testMethod (and deduce return etc. // 3. relies on __VA_ARGS__ when an extra set of parentheses would be enough WRAPABLE_HND (0, TestInterface, void, testMethodReturningVoid) WRAPABLE_HND (1, TestInterface, int, testMethodReturningInt, int) static int testMethodReturningVoidCalls; static int testMethodReturningIntCalls; }; class TestWrapper : public TestInterface { TestImplementation& impl; public: TestWrapper(TestImplementation& impl) : impl(impl) { setHandler(&impl, true); } // The need to remember this is a PITA ~TestWrapper() { setHandler(&impl, false); } // The need to remember this is a PITA virtual void testMethodReturningVoid(); virtual int testMethodReturningInt(int i); static int testMethodReturningVoidCalls; static int testMethodReturningIntCalls; void disableTestMethodReturningVoid() { impl.testMethodReturningVoidSetEnabled (this, false); } }; } // (abstract) namespace int TestWrapper::testMethodReturningVoidCalls = 0; int TestInterface::testMethodReturningVoidCalls = 0; int TestImplementation::testMethodReturningVoidCalls = 0; int TestWrapper::testMethodReturningIntCalls = 0; int TestInterface::testMethodReturningIntCalls = 0; int TestImplementation::testMethodReturningIntCalls = 0; // A pain these need definition after TestImplementation definition TestInterface::TestInterface() {} TestInterface::~TestInterface() {} void TestInterface::testMethodReturningVoid() /* const */ { WRAPABLE_DEF (testMethodReturningVoid); testMethodReturningVoidCalls++; } int TestInterface::testMethodReturningInt(int i) { WRAPABLE_DEF (testMethodReturningInt, i); testMethodReturningIntCalls++; return i; } void TestImplementation::testMethodReturningVoid() { #ifdef TEST_OLD_MACROS WRAPABLE_HND_FUNC(0, testMethodReturningVoid) // Magic number needs to match class definition #else WRAPABLE_HND_FUNCTN(testMethodReturningVoid) #endif testMethodReturningVoidCalls++; } int TestImplementation::testMethodReturningInt(int i) { #ifdef TEST_OLD_MACROS WRAPABLE_HND_FUNC_RETURN(1, int, testMethodReturningInt, i) // Magic number needs to match class definition #else WRAPABLE_HND_FUNCTN_RETURN(int, testMethodReturningInt, i) #endif testMethodReturningIntCalls++; return i; } void TestWrapper::testMethodReturningVoid() { impl.testMethodReturningVoid(); testMethodReturningVoidCalls++; } int TestWrapper::testMethodReturningInt(int i) { testMethodReturningIntCalls++; return impl.testMethodReturningInt(i); } TEST(WrapSystem, an_interface_never_gets_functions_called) { TestInterface::testMethodReturningIntCalls = 0; TestImplementation imp; imp.testMethodReturningInt(1); ASSERT_EQ(0, TestInterface::testMethodReturningIntCalls); { TestWrapper wrap(imp); imp.testMethodReturningInt(1); ASSERT_EQ(0, TestInterface::testMethodReturningIntCalls); } imp.testMethodReturningInt(1); ASSERT_EQ(0, TestInterface::testMethodReturningIntCalls); } TEST(WrapSystem, an_interface_never_gets_void_functions_called) { TestInterface::testMethodReturningVoidCalls = 0; TestImplementation imp; imp.testMethodReturningVoid(); ASSERT_EQ(0, TestInterface::testMethodReturningVoidCalls); { TestWrapper wrap(imp); imp.testMethodReturningVoid(); ASSERT_EQ(0, TestInterface::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(0, TestInterface::testMethodReturningVoidCalls); } TEST(WrapSystem, an_implementation_gets_functions_called) { TestImplementation::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap(imp); imp.testMethodReturningVoid(); ASSERT_EQ(1, TestImplementation::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(2, TestImplementation::testMethodReturningVoidCalls); } TEST(WrapSystem, a_wrapper_gets_its_functions_called) { TestWrapper::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap(imp); imp.testMethodReturningVoid(); ASSERT_EQ(1, TestWrapper::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(1, TestWrapper::testMethodReturningVoidCalls); } TEST(WrapSystem, a_wrapper_doesnt_get_disabled_functions_called) { TestWrapper::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap(imp); wrap.disableTestMethodReturningVoid(); imp.testMethodReturningVoid(); ASSERT_EQ(0, TestWrapper::testMethodReturningVoidCalls); } } TEST(WrapSystem, two_wrappers_get_their_functions_called) { TestWrapper::testMethodReturningVoidCalls = 0; TestImplementation imp; { TestWrapper wrap1(imp); TestWrapper wrap2(imp); imp.testMethodReturningVoid(); ASSERT_EQ(2, TestWrapper::testMethodReturningVoidCalls); } imp.testMethodReturningVoid(); ASSERT_EQ(2, TestWrapper::testMethodReturningVoidCalls); } ./src/outputdevices_x11.cpp0000644000004100000410000001101513246301623016130 0ustar www-datawww-data/* * Compiz Core: OutputDevices class (functions that link to core and/or X11) * * Copyright (c) 2012 Canonical Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "outputdevices.h" #include "core_options.h" namespace compiz { namespace core { CompRect OutputDevices::computeWorkareaForBox (const CompRect &box, CompWindowList const &windows) { CompRegion region; int x1, y1, x2, y2; region += box; foreach (CompWindow *w, windows) { if (!w->isMapped ()) continue; if (w->struts ()) { x1 = w->struts ()->left.x; y1 = w->struts ()->left.y; x2 = x1 + w->struts ()->left.width; y2 = y1 + w->struts ()->left.height; if (y1 < box.y2 () && y2 > box.y1 ()) region -= CompRect (x1, box.y1 (), x2 - x1, box.height ()); x1 = w->struts ()->right.x; y1 = w->struts ()->right.y; x2 = x1 + w->struts ()->right.width; y2 = y1 + w->struts ()->right.height; if (y1 < box.y2 () && y2 > box.y1 ()) region -= CompRect (x1, box.y1 (), x2 - x1, box.height ()); x1 = w->struts ()->top.x; y1 = w->struts ()->top.y; x2 = x1 + w->struts ()->top.width; y2 = y1 + w->struts ()->top.height; if (x1 < box.x2 () && x2 > box.x1 ()) region -= CompRect (box.x1 (), y1, box.width (), y2 - y1); x1 = w->struts ()->bottom.x; y1 = w->struts ()->bottom.y; x2 = x1 + w->struts ()->bottom.width; y2 = y1 + w->struts ()->bottom.height; if (x1 < box.x2 () && x2 > box.x1 ()) region -= CompRect (box.x1 (), y1, box.width (), y2 - y1); } } if (region.isEmpty ()) { compLogMessage ("core", CompLogLevelWarn, "Empty box after applying struts, ignoring struts"); return box; } return region.boundingRect (); } void OutputDevices::computeWorkAreas (CompRect &workArea, bool &workAreaChanged, CompRegion &allWorkArea, CompWindowList const &windows) { for (unsigned int i = 0; i < outputDevs.size(); ++i) { CompRect oldWorkArea = outputDevs[i].workArea (); workArea = computeWorkareaForBox (outputDevs[i], windows); if (workArea != oldWorkArea) { workAreaChanged = true; outputDevs[i].setWorkArea (workArea); } allWorkArea += workArea; } } void OutputDevices::updateOutputDevices (CoreOptions &coreOptions, CompSize *screen) { CompOption::Value::Vector &list = coreOptions.optionGetOutputs (); unsigned int nOutput = 0; int x, y, bits; unsigned int uWidth, uHeight; int width, height; int x1, y1, x2, y2; foreach (CompOption::Value &value, list) { x = 0; y = 0; uWidth = static_cast (screen->width ()); uHeight = static_cast (screen->height ()); bits = XParseGeometry(value.s ().c_str (), &x, &y, &uWidth, &uHeight); width = static_cast (uWidth); height = static_cast (uHeight); if (bits & XNegative) x = screen->width () + x - width; if (bits & YNegative) y = screen->height () + y - height; x1 = x; y1 = y; x2 = x + width; y2 = y + height; if (x1 < 0) x1 = 0; if (y1 < 0) y1 = 0; if (x2 > screen->width ()) x2 = screen->width (); if (y2 > screen->height ()) y2 = screen->height (); if (x1 < x2 && y1 < y2) { setGeometryOnDevice (nOutput, x1, y1, x2 - x1, y2 - y1); ++nOutput; } } adoptDevices (nOutput, screen); } } } // namespace compiz::core ./src/privatematch.h0000644000004100000410000000440313246301623014673 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2007 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Dennis Kasprzyk not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Dennis Kasprzyk makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: Dennis Kasprzyk * David Reveman */ #ifndef _PRIVATEMATCH_H #define _PRIVATEMATCH_H #include #include #define MATCH_OP_AND_MASK (1 << 0) #define MATCH_OP_NOT_MASK (1 << 1) class MatchOp { public: typedef enum { TypeNone, TypeGroup, TypeExp } Type; typedef std::list List; MatchOp (); virtual ~MatchOp (); virtual Type type () { return TypeNone; }; unsigned int flags; }; class MatchExpOp : public MatchOp { public: MatchExpOp (); MatchExpOp (const MatchExpOp &); MatchOp::Type type () { return MatchOp::TypeExp; }; CompString value; boost::shared_ptr e; }; class MatchGroupOp : public MatchOp { public: MatchGroupOp (); ~MatchGroupOp (); MatchGroupOp (const MatchGroupOp &); MatchGroupOp & operator= (const MatchGroupOp &); MatchOp::Type type () { return MatchOp::TypeGroup; }; MatchOp::List op; }; class PrivateMatch { public: PrivateMatch (); public: MatchGroupOp op; }; #endif ./src/privatescreen/0000755000004100000410000000000013246301623014704 5ustar www-datawww-data./src/privatescreen/tests/0000755000004100000410000000000013246301624016047 5ustar www-datawww-data./src/privatescreen/tests/CMakeLists.txt0000644000004100000410000000234113246301623020606 0ustar www-datawww-datainclude(CompizTesting) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_BINARY_DIR}/generated ${compiz_SOURCE_DIR}/build/generated ${compiz_SOURCE_DIR}/include ${compiz_SOURCE_DIR}/src ${compiz_SOURCE_DIR}/src/timer/include ${compiz_SOURCE_DIR}/src/timer/src ${compiz_SOURCE_DIR}/src/rect/include ${compiz_SOURCE_DIR}/src/region/include ${compiz_SOURCE_DIR}/src/screen/geometry/include ${compiz_SOURCE_DIR}/src/window/geometry/include ${compiz_SOURCE_DIR}/src/window/extents/include ${compiz_SOURCE_DIR}/src/screen/extents/include ${compiz_SOURCE_DIR}/src/servergrab/include ${compiz_SOURCE_DIR}/src/pluginclasshandler/include ${COMPIZ_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ) add_definitions ( -DHAVE_CONFIG_H -DPLUGINDIR=\\\"${compiz_plugindir}\\\" -DSHAREDIR=\\\"${compiz_sharedir}\\\" -DMETADATADIR=\\\"${compiz_metadatadir}\\\" ) add_executable( compiz_privatescreen_test ${CMAKE_CURRENT_SOURCE_DIR}/test-privatescreen.cpp ) target_link_libraries( compiz_privatescreen_test compiz_core compiz_window_constrainment compiz_logmessage ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ) compiz_discover_tests (compiz_privatescreen_test COVERAGE compiz_core) ./src/privatescreen/tests/test-privatescreen.cpp0000644000004100000410000014323313246301623022407 0ustar www-datawww-data#include "privatescreen.h" #include "privateaction.h" #include "eventmanagement.h" // Get rid of stupid macro from X.h // Why, oh why, are we including X.h? #undef None #include #include #include using ::testing::Return; using ::testing::ReturnRef; using ::testing::_; namespace { const unsigned long None = 0; class MockCompScreen : public CompScreen { public: MockCompScreen() { // The PluginManager ctor uses screen->... (indirectly via CoreOptions) // We should kill this dependency screen = this; } ~MockCompScreen() { // Because of another indirect use of screen in PluginManager dtor // via option.cpp:finiOptionValue() screen = 0; } // Interface hoisted from CompScreen MOCK_METHOD0(updateDefaultIcon, bool ()); MOCK_METHOD0(dpy, Display * ()); MOCK_METHOD0(root, Window ()); MOCK_CONST_METHOD0(vpSize, const CompSize & () ); MOCK_METHOD1(forEachWindow, void (CompWindow::ForEach)); MOCK_METHOD0(windows, CompWindowList & ()); MOCK_METHOD3(moveViewport, void (int tx, int ty, bool sync)); MOCK_CONST_METHOD0(vp,const CompPoint & ()); MOCK_METHOD0(updateWorkarea, void ()); MOCK_METHOD1(addAction, bool (CompAction *action)); MOCK_METHOD1(findWindow, CompWindow * (Window id)); MOCK_METHOD2(findTopLevelWindow, CompWindow * ( Window id, bool override_redirect)); MOCK_METHOD6(toolkitAction, void ( Atom toolkitAction, Time eventTime, Window window, long data0, long data1, long data2)); MOCK_CONST_METHOD0(showingDesktopMask, unsigned int ()); MOCK_CONST_METHOD0(grabsEmpty, bool ()); MOCK_METHOD1(sizePluginClasses, void (unsigned int size)); MOCK_METHOD1(_initPluginForScreen, bool (CompPlugin *)); MOCK_METHOD1(_finiPluginForScreen, void (CompPlugin *)); MOCK_METHOD3(_setOptionForPlugin, bool (const char *, const char *, CompOption::Value &)); MOCK_METHOD1(_handleEvent, void (XEvent *event)); MOCK_METHOD3(_logMessage, void (const char *, CompLogLevel, const char*)); MOCK_METHOD0(_enterShowDesktopMode, void ()); MOCK_METHOD1(_leaveShowDesktopMode, void (CompWindow *)); MOCK_METHOD1(_addSupportedAtoms, void (std::vector& atoms)); MOCK_METHOD1(_fileWatchAdded, void (CompFileWatch *)); MOCK_METHOD1(_fileWatchRemoved, void (CompFileWatch *)); MOCK_METHOD2(_sessionEvent, void (CompSession::Event, CompOption::Vector &)); MOCK_METHOD3(_handleCompizEvent, void (const char *, const char *, CompOption::Vector &)); MOCK_METHOD4(_fileToImage, bool (CompString &, CompSize &, int &, void *&)); MOCK_METHOD5(_imageToFile, bool (CompString &, CompString &, CompSize &, int, void *)); MOCK_METHOD1(_matchInitExp, CompMatch::Expression * (const CompString&)); MOCK_METHOD0(_matchExpHandlerChanged, void ()); MOCK_METHOD1(_matchPropertyChanged, void (CompWindow *)); MOCK_METHOD0(_outputChangeNotify, void ()); MOCK_METHOD2(_cursorChangeNotify, void (const CompString&, int)); MOCK_METHOD1(_averageColorChangeNotify, void (const unsigned short*)); MOCK_METHOD0(outputDevs, CompOutput::vector & ()); MOCK_METHOD2(setWindowState, void (unsigned int state, Window id)); MOCK_METHOD0(XShape, bool ()); MOCK_METHOD0(screenInfo, std::vector & ()); MOCK_METHOD0(serverWindows, CompWindowList & ()); MOCK_METHOD3(setWindowProp, void (Window id, Atom property, unsigned int value)); MOCK_METHOD0(activeWindow, Window ()); MOCK_METHOD0(currentDesktop, unsigned int ()); MOCK_METHOD0(currentHistory, CompActiveWindowHistory *()); MOCK_METHOD0(focusDefaultWindow, void ()); MOCK_METHOD0(getCurrentTime, Time ()); MOCK_METHOD3(getWindowProp, unsigned int (Window id, Atom property, unsigned int defaultValue)); MOCK_METHOD2(insertServerWindow, void (CompWindow *w, Window aboveId)); MOCK_METHOD2(insertWindow, void (CompWindow *w, Window aboveId)); MOCK_METHOD0(nDesktop, unsigned int ()); MOCK_METHOD1(outputDeviceForGeometry, int (const CompWindow::Geometry& gm)); MOCK_METHOD0(screenNum, int ()); MOCK_METHOD1(unhookServerWindow, void (CompWindow *w)); MOCK_METHOD1(unhookWindow, void (CompWindow *w)); MOCK_METHOD2(viewportForGeometry, void (const CompWindow::Geometry &gm, CompPoint &viewport)); MOCK_METHOD1(addToDestroyedWindows, void (CompWindow * cw)); MOCK_CONST_METHOD0(workArea, CompRect const& ()); MOCK_METHOD1(removeAction, void (CompAction *action)); MOCK_METHOD0(getOptions, CompOption::Vector & ()); MOCK_METHOD2(setOption, bool (const CompString &name, CompOption::Value &value)); MOCK_METHOD2(storeValue, void (CompString key, CompPrivate value)); MOCK_METHOD1(hasValue, bool (CompString key)); MOCK_METHOD1(getValue, CompPrivate (CompString key)); MOCK_METHOD1(eraseValue, void (CompString key)); MOCK_METHOD3(addWatchFd, CompWatchFdHandle (int fd, short int events, FdWatchCallBack callBack)); MOCK_METHOD1(removeWatchFd, void (CompWatchFdHandle handle)); MOCK_METHOD0(eventLoop, void ()); MOCK_METHOD3(addFileWatch, CompFileWatchHandle (const char *path, int mask, FileWatchCallBack callBack)); MOCK_METHOD1(removeFileWatch, void (CompFileWatchHandle handle)); MOCK_CONST_METHOD0(getFileWatches, const CompFileWatchList& ()); MOCK_METHOD0(updateSupportedWmHints, void ()); MOCK_METHOD0(destroyedWindows, CompWindowList & ()); MOCK_CONST_METHOD0(region, const CompRegion & ()); MOCK_METHOD0(hasOverlappingOutputs, bool ()); MOCK_METHOD0(fullscreenOutput, CompOutput & ()); MOCK_METHOD3(setWindowProp32, void (Window id, Atom property, unsigned short value)); MOCK_METHOD3(getWindowProp32, unsigned short (Window id, Atom property, unsigned short defaultValue)); MOCK_METHOD4(readImageFromFile, bool (CompString &name, CompString &pname, CompSize &size, void *&data)); MOCK_METHOD0(desktopWindowCount, int ()); MOCK_METHOD0(opaqueDesktopWindowCount, int ()); MOCK_METHOD0(attrib, XWindowAttributes ()); MOCK_CONST_METHOD0(defaultIcon, CompIcon *()); virtual bool otherGrabExist (const char *, ...) { return false; } // TODO How to mock? MOCK_METHOD2(pushGrab, GrabHandle (Cursor cursor, const char *name)); MOCK_METHOD2(pushPointerGrab, GrabHandle (Cursor cursor, const char *name)); MOCK_METHOD1(pushKeyboardGrab, GrabHandle (const char *name)); MOCK_METHOD2(removeGrab, void (GrabHandle handle, CompPoint *restorePointer)); MOCK_METHOD4(writeImageToFile, bool (CompString &path, const char *format, CompSize &size, void *data)); MOCK_METHOD1(runCommand, void (CompString command)); MOCK_METHOD0(shouldSerializePlugins, bool ()); MOCK_CONST_METHOD1(getWorkareaForOutput, const CompRect & (unsigned int outputNum)); MOCK_CONST_METHOD0(currentOutputDev, CompOutput & ()); MOCK_METHOD1(grabExist, bool (const char *)); MOCK_METHOD0(invisibleCursor, Cursor ()); MOCK_CONST_METHOD0(activeNum, unsigned int ()); MOCK_METHOD1(sendWindowActivationRequest, void (Window id)); MOCK_METHOD1(clientList, const CompWindowVector & (bool stackingOrder)); MOCK_METHOD1(outputDeviceForPoint, int (const CompPoint &point)); MOCK_METHOD2(outputDeviceForPoint, int (int x, int y)); MOCK_METHOD0(xkbEvent, int ()); MOCK_METHOD2(warpPointer, void (int dx, int dy)); MOCK_METHOD2(updateGrab, void (GrabHandle handle, Cursor cursor)); MOCK_METHOD0(shapeEvent, int ()); MOCK_METHOD0(syncEvent, int ()); MOCK_METHOD0(autoRaiseWindow, Window ()); MOCK_METHOD0(processEvents, void ()); MOCK_METHOD1(alwaysHandleEvent, void (XEvent *event)); MOCK_METHOD0(displayString, const char * ()); MOCK_METHOD0(getCurrentOutputExtents, CompRect ()); MOCK_METHOD0(normalCursor, Cursor ()); MOCK_METHOD1(cursorCache, Cursor (unsigned int)); MOCK_METHOD0(grabbed, bool ()); MOCK_METHOD0(snDisplay, SnDisplay * ()); MOCK_CONST_METHOD0(createFailed, bool ()); MOCK_METHOD0(incrementDesktopWindowCount, void ()); MOCK_METHOD0(incrementOpaqueDesktopWindowCount, void ()); MOCK_METHOD0(decrementDesktopWindowCount, void ()); MOCK_METHOD0(decrementOpaqueDesktopWindowCount, void ()); MOCK_METHOD0(nextMapNum, unsigned int ()); MOCK_CONST_METHOD0(updatePassiveKeyGrabs, void ()); MOCK_METHOD1(updatePassiveButtonGrabs, void (Window serverFrame)); MOCK_CONST_METHOD0(lastPing, unsigned int ()); MOCK_CONST_METHOD0(displayInitialised, bool ()); MOCK_METHOD1(applyStartupProperties, void (CompWindow *window)); MOCK_METHOD0(updateClientList, void ()); MOCK_CONST_METHOD0(getTopWindow, CompWindow * ()); MOCK_CONST_METHOD0(getTopServerWindow, CompWindow * ()); MOCK_METHOD0(getCoreOptions, CoreOptions& ()); MOCK_CONST_METHOD0(colormap, Colormap ()); MOCK_CONST_METHOD0(averageColor, const unsigned short * ()); MOCK_METHOD1(setCurrentDesktop, void (unsigned int desktop)); MOCK_CONST_METHOD0(activeWindow, Window ()); MOCK_CONST_METHOD1(grabWindowIsNot, bool (Window w)); MOCK_METHOD0(incrementPendingDestroys, void ()); MOCK_METHOD1(setNextActiveWindow, void (Window id)); MOCK_CONST_METHOD0(getNextActiveWindow, Window ()); MOCK_METHOD0(focusTopMostWindow, CompWindow* ()); MOCK_METHOD1(getWmState, int (Window id)); MOCK_CONST_METHOD2(setWmState, void (int state, Window id)); MOCK_CONST_METHOD3(getMwmHints, void (Window id, unsigned int *func, unsigned int *decor)); MOCK_METHOD1(getProtocols, unsigned int (Window id)); MOCK_METHOD1(getWindowType, unsigned int (Window id)); MOCK_METHOD1(getWindowState, unsigned int (Window id)); MOCK_METHOD0(grabServer, void ()); MOCK_METHOD0(ungrabServer, void ()); MOCK_METHOD0(syncServer, void ()); MOCK_METHOD0(serverGrabInterface, ServerGrabInterface * ()); }; class MockViewportRetreival : public compiz::private_screen::ViewportRetrievalInterface { public: MOCK_CONST_METHOD0(getCurrentViewport, const CompPoint & ()); MOCK_CONST_METHOD0(viewportDimensions, const CompSize & ()); }; class StubActivePluginsOption : public CoreOptions { public: StubActivePluginsOption() : CoreOptions(false) { CompOption::Vector& mOptions = getOptions (); CompOption::Value::Vector list; CompOption::Value value; // active_plugins mOptions[CoreOptions::ActivePlugins].setName ("active_plugins", CompOption::TypeList); list.clear (); value.set(CompString ("core")); list.push_back (value); } bool setActivePlugins(const char*, const char* key, CompOption::Value & value) { return setOption(key, value); } }; } // (anon) namespace namespace { class MockVTable: public CompPlugin::VTable { public: MockVTable (CompString const& name) { initVTable (name); } MOCK_METHOD0(init, bool ()); MOCK_METHOD0(fini, void ()); MOCK_METHOD0(markReadyToInstantiate, void ()); MOCK_METHOD0(markNoFurtherInstantiation, void ()); MOCK_METHOD1(initScreen, bool (CompScreen *s)); MOCK_METHOD1(finiScreen, void (CompScreen *s)); MOCK_METHOD1(initWindow, bool (CompWindow *w)); MOCK_METHOD1(finiWindow, void (CompWindow *w)); MOCK_METHOD0(getOptions, CompOption::Vector & ()); MOCK_METHOD2(setOption, bool (const CompString &name, CompOption::Value &value)); }; class PluginFilesystem { public: virtual bool LoadPlugin(CompPlugin *p, const char *path, const char *name) const = 0; virtual void UnloadPlugin(CompPlugin *p) const = 0; static PluginFilesystem const* instance; protected: PluginFilesystem(); virtual ~PluginFilesystem() {} }; class MockPluginFilesystem : public PluginFilesystem { public: MockVTable mockVtableOne; MockVTable mockVtableTwo; MockVTable mockVtableThree; MockVTable mockVtableFour; MockPluginFilesystem() : mockVtableOne("one"), mockVtableTwo("two"), mockVtableThree("three"), mockVtableFour("four") {} MOCK_CONST_METHOD3(LoadPlugin, bool (CompPlugin *, const char *, const char *)); MOCK_CONST_METHOD1(UnloadPlugin, void (CompPlugin *p)); bool DummyLoader(CompPlugin *p, const char * path, const char * name) { using namespace testing; if (strcmp(name, "one") == 0) { p->vTable = &mockVtableOne; } else if (strcmp(name, "two") == 0) { p->vTable = &mockVtableTwo; } else if (strcmp(name, "three") == 0) { p->vTable = &mockVtableThree; } else { p->vTable = &mockVtableFour; } return true; } }; bool ThunkLoadPluginProc(CompPlugin *p, const char *path_, const char *name) { return PluginFilesystem::instance->LoadPlugin(p, path_, name); } void ThunkUnloadPluginProc(CompPlugin *p) { PluginFilesystem::instance->UnloadPlugin(p); } PluginFilesystem::PluginFilesystem() { ::loaderLoadPlugin = ::ThunkLoadPluginProc; ::loaderUnloadPlugin = ::ThunkUnloadPluginProc; instance = this; } // tell GLib not to use the slice-allocator implementation // and avoid spurious valgrind reporting void glib_nice_for_valgrind() { setenv("G_SLICE", "always-malloc", true); } __attribute__((unused)) int const init = (glib_nice_for_valgrind(), 0); PluginFilesystem const* PluginFilesystem::instance = 0; } // (abstract) namespace namespace cps = compiz::private_screen; namespace ce = compiz::events; namespace ca = compiz::actions; TEST(privatescreen_PluginManagerTest, create_and_destroy) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_does_not_error) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; // Stuff that has to be done before calling updatePlugins() CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); // Now we can call updatePlugins() without a segfault. Hoorah! EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Return(false)); ps.updatePlugins(&comp_screen, StubActivePluginsOption().optionGetActivePlugins()); } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_after_setting_initialPlugins) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; // Stuff that has to be done before calling updatePlugins() CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); std::list plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("three"); initialPlugins = plugins; MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("two"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableTwo, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(false)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); // Once for "three" which doesn't load EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Return(false)); ps.updatePlugins(&comp_screen, StubActivePluginsOption().optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(2); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } TEST(privatescreen_PluginManagerTest, updating_when_failing_to_load_plugin_in_middle_of_list) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; StubActivePluginsOption sapo; CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); std::list plugins; plugins.push_back ("one"); plugins.push_back ("three"); plugins.push_back ("four"); initialPlugins = plugins; MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(false)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("four"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableFour, init()).Times(1).WillRepeatedly(Return(true)); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); // Once for "three" which doesn't load EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Return(true)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(2); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableFour, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableFour, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_with_fewer_plugins) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; StubActivePluginsOption sapo; // Stuff that has to be done before calling updatePlugins() initialPlugins = std::list (); CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("three"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("two"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableTwo, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("three"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(2); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(2); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableThree, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } // Verify plugin ordering, and verify that plugins not in availablePlugins // don't get dropped. Because availablePlugins is NOT a definitive list // of what the dynamic loader might be able to find in its path. TEST(privatescreen_PluginManagerTest, verify_plugin_ordering) { using namespace testing; cps::PluginManager ps; initialPlugins.clear(); initialPlugins.push_back("alice"); initialPlugins.push_back("bob"); initialPlugins.push_back("charlie"); CompOption::Value::Vector extra; extra.push_back("charlie"); extra.push_back("david"); extra.push_back("alice"); extra.push_back("eric"); CompOption::Value::Vector merged = ps.mergedPluginList(extra); ASSERT_EQ(merged.size(), 6); ASSERT_EQ(merged[0].s(), "core"); ASSERT_EQ(merged[1].s(), "alice"); ASSERT_EQ(merged[2].s(), "bob"); ASSERT_EQ(merged[3].s(), "charlie"); ASSERT_EQ(merged[4].s(), "david"); ASSERT_EQ(merged[5].s(), "eric"); } TEST(privatescreen_PluginManagerTest, calling_updatePlugins_with_additional_plugins) { using namespace testing; MockCompScreen comp_screen; cps::PluginManager ps; StubActivePluginsOption sapo; // Stuff that has to be done before calling updatePlugins() initialPlugins = std::list (); CompOption::Value::Vector values; values.push_back ("core"); ps.setPlugins (values); ps.setDirtyPluginList (); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("four"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } MockPluginFilesystem mockfs; EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("one"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableOne, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("two"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableTwo, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("four"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableFour, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableFour, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableFour, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs, LoadPlugin(Ne((void*)0), EndsWith(HOME_PLUGINDIR), StrEq("three"))). WillOnce(Invoke(&mockfs, &MockPluginFilesystem::DummyLoader)); EXPECT_CALL(mockfs.mockVtableThree, init()).WillOnce(Return(true)); EXPECT_CALL(mockfs.mockVtableFour, init()).WillOnce(Return(true)); EXPECT_CALL(comp_screen, _setOptionForPlugin(StrEq("core"), StrEq("active_plugins"), _)). WillOnce(Invoke(&sapo, &StubActivePluginsOption::setActivePlugins)); { CompOption::Value::Vector plugins; plugins.push_back ("one"); plugins.push_back ("two"); plugins.push_back ("three"); plugins.push_back ("four"); CompOption::Value v(plugins); sapo.setActivePlugins("core", "active_plugins", v); } ps.updatePlugins(&comp_screen, sapo.optionGetActivePlugins()); Mock::VerifyAndClearExpectations(&mockfs); Mock::VerifyAndClearExpectations(&mockfs.mockVtableOne); Mock::VerifyAndClearExpectations(&mockfs.mockVtableTwo); Mock::VerifyAndClearExpectations(&mockfs.mockVtableThree); Mock::VerifyAndClearExpectations(&mockfs.mockVtableFour); // TODO Some cleanup that probably ought to be automatic. EXPECT_CALL(mockfs, UnloadPlugin(_)).Times(4); EXPECT_CALL(comp_screen, _finiPluginForScreen(Ne((void*)0))).Times(4); EXPECT_CALL(mockfs.mockVtableFour, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableFour, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableThree, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableThree, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableTwo, fini()).Times(1); EXPECT_CALL(mockfs.mockVtableOne, finiScreen(Ne((void*)0))).Times(1); EXPECT_CALL(mockfs.mockVtableOne, fini()).Times(1); for (CompPlugin* p; (p = CompPlugin::pop ()) != 0; CompPlugin::unload (p)); } TEST(privatescreen_EventManagerTest, create_and_destroy) { using namespace testing; MockCompScreen comp_screen; cps::EventManager em; } TEST(privatescreen_EventManagerTest, init) { using namespace testing; MockCompScreen comp_screen; CompOption::Value::Vector values; values.push_back ("core"); initialPlugins = std::list (); EXPECT_CALL(comp_screen, addAction(_)).WillRepeatedly(Return(false)); EXPECT_CALL(comp_screen, removeAction(_)).WillRepeatedly(Return()); EXPECT_CALL(comp_screen, _matchInitExp(StrEq("any"))).WillRepeatedly(Return((CompMatch::Expression*)0)); // The PrivateScreen ctor indirectly calls screen->dpy(). // We should kill this dependency EXPECT_CALL(comp_screen, dpy()).WillRepeatedly(Return((Display*)(0))); cps::EventManager em; CoreOptions coreOptions(false); em.init(); } TEST(privatescreen_ViewportGeometryTest, PickCurrent) { CompPoint vp; compiz::window::Geometry g (250, 250, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (1, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickRight) { CompPoint vp; compiz::window::Geometry g (1250, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (1, 0)); } TEST(privatescreen_ViewportGeometryTest, PickLeft) { CompPoint vp; compiz::window::Geometry g (-750, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (1, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickBottom) { CompPoint vp; compiz::window::Geometry g (0, 1250, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 1)); } TEST(privatescreen_ViewportGeometryTest, PickTop) { CompPoint vp; compiz::window::Geometry g (0, -750, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 1); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickTopWhenJustAbove) { CompPoint vp; compiz::window::Geometry g (0, -251, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 1); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickRightWhenJustRight) { CompPoint vp; compiz::window::Geometry g (751, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (1, 0)); } TEST(privatescreen_ViewportGeometryTest, PickLeftWhenJustLeft) { CompPoint vp; compiz::window::Geometry g (-251, 0, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (1, 0); CompSize dimensions (2, 1); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 0)); } TEST(privatescreen_ViewportGeometryTest, PickBottomWhenJustBelow) { CompPoint vp; compiz::window::Geometry g (0, 751, 500, 500, 0); MockViewportRetreival mvp; CompPoint current (0, 0); CompSize dimensions (1, 2); EXPECT_CALL (mvp, getCurrentViewport ()).WillOnce (ReturnRef (current)); EXPECT_CALL (mvp, viewportDimensions ()).WillOnce (ReturnRef (dimensions)); compiz::private_screen::viewports::viewportForGeometry (g, vp, &mvp, CompSize (1000, 1000)); EXPECT_EQ (vp, CompPoint (0, 1)); } namespace { const Window topLeftScreenEdge = 1; const Window topScreenEdge = 2; const Window topRightScreenEdge = 3; const Window rightScreenEdge = 4; const Window bottomRightScreenEdge = 5; const Window bottomScreenEdge = 6; const Window bottomLeftScreenEdge = 7; const Window leftScreenEdge = 8; const CompScreenEdge screenEdges[SCREEN_EDGE_NUM] = { { leftScreenEdge, SCREEN_EDGE_LEFT }, { rightScreenEdge, SCREEN_EDGE_RIGHT }, { topScreenEdge, SCREEN_EDGE_TOP }, { bottomScreenEdge , SCREEN_EDGE_BOTTOM }, { topLeftScreenEdge, SCREEN_EDGE_TOPLEFT }, { topRightScreenEdge, SCREEN_EDGE_TOPRIGHT }, { bottomLeftScreenEdge, SCREEN_EDGE_BOTTOMLEFT }, { bottomRightScreenEdge, SCREEN_EDGE_BOTTOMRIGHT} }; } TEST (privatescreen_ButtonPressEdgeEventManagementTest, IgnoreWhenEventAndRootWindowMismatch) { const Window rootWindow = 1; const Window edgeWindow = topScreenEdge; cps::OrphanData orphanData; cps::GrabList grabList; EXPECT_EQ (ce::processButtonPressOnEdgeWindow (edgeWindow, rootWindow, 0, 0, grabList, screenEdges), -1); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, IgnoreWhenEventMismatchAndNoGrabs) { const Window rootWindow = 1; const Window edgeWindow = topScreenEdge; cps::OrphanData orphanData; cps::GrabList grabList; EXPECT_EQ (ce::processButtonPressOnEdgeWindow (edgeWindow, rootWindow, 0, rootWindow, grabList, screenEdges), -1); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, AllowWhenEventButNotRootWindowMismatchWhileGrabbed) { const Window rootWindow = 1; const Window edgeWindow = topScreenEdge; unsigned int topEdgeMask = 1 << SCREEN_EDGE_TOP; cps::OrphanData orphanData; cps::GrabList grabList; grabList.grabsPush (new cps::Grab (None, "Nil")); EXPECT_EQ (ce::processButtonPressOnEdgeWindow (edgeWindow, rootWindow, 0, rootWindow, grabList, screenEdges), topEdgeMask); grabList.grabsRemove (grabList.grabsBack ()); } TEST (privatescreen_ButtonPressEventManagementTest, SetEventWindowArgument) { const Window activeWindow = 1; ce::EventArguments arguments (2); ce::setEventWindowInButtonPressArguments (arguments, activeWindow); EXPECT_EQ (arguments[1].value ().i (), activeWindow); } namespace { class MockTriggerableAction { public: MOCK_METHOD2 (matchEventState, bool (unsigned int, unsigned int)); MOCK_METHOD3 (initiate, bool (CompAction *, CompAction::State , CompOption::Vector &)); MOCK_METHOD3 (terminate, bool (CompAction *, CompAction::State , CompOption::Vector &)); }; const unsigned int testingButtonNumber = 1; const unsigned int testingButtonState = (1 << 1); ce::ActionModsMatchesEventStateFunc GetMatchEventStateFuncForMock (MockTriggerableAction &triggerableAction) { return boost::bind (&MockTriggerableAction::matchEventState, &triggerableAction, _1, _2); } CompAction::CallBack GetInitiateForMock (MockTriggerableAction &triggerableAction) { return boost::bind (&MockTriggerableAction::initiate, &triggerableAction, _1, _2, _3); } } bool operator== (const CompOption &lhs, const CompOption &rhs) { if (lhs.type () != rhs.type ()) return false; return lhs.value () == rhs.value (); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnUnboundAction) { CompAction action; CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; MockTriggerableAction triggerableAction; ce::EventArguments arguments; ASSERT_FALSE (option.set (value)); const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); EXPECT_FALSE (ce::activateButtonPressOnWindowBindingOption (option, testingButtonNumber, testingButtonState, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnUnboundInactiveAction) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), false); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnMismatchedButtonNumber) { CompAction action; MockTriggerableAction triggerableAction; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnWindowBindingOption (option, 0, testingButtonState, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, NoTriggerOnMismatchedButtonState) { CompAction action; MockTriggerableAction triggerableAction; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, 0)) .WillOnce (Return (false)); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnWindowBindingOption (option, testingButtonNumber, 0, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEventManagementTest, TriggerWhenStateAndButtonMatch) { CompAction action; MockTriggerableAction triggerableAction; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, testingButtonState)) .WillOnce (Return (true)); EXPECT_CALL (triggerableAction, initiate (&option.value ().action (), CompAction::StateInitButton, arguments)).WillOnce (Return (true)); EXPECT_TRUE (ce::activateButtonPressOnWindowBindingOption (option, testingButtonNumber, testingButtonState, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnInvalidEdge) { CompAction action; CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; MockTriggerableAction triggerableAction; ce::EventArguments arguments; int edgeMask = -1; ASSERT_FALSE (option.set (value)); const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnUnboundAction) { CompAction action; CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; MockTriggerableAction triggerableAction; ce::EventArguments arguments; int edgeMask = 1 << SCREEN_EDGE_TOP; ASSERT_FALSE (option.set (value)); const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnMismatchedEdgeMask) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, 0, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnMismatchedButtonNumber) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, 0, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, NoTriggerOnMismatchedButtonState) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, 0)) .WillOnce (Return (false)); EXPECT_CALL (triggerableAction, initiate (_, _, _)).Times (0); EXPECT_FALSE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, 0, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ButtonPressEdgeEventManagementTest, TriggerWhenStateButtonAndEdgeMaskMatch) { CompAction action; MockTriggerableAction triggerableAction; int edgeMask = 1 << SCREEN_EDGE_TOP; const ce::ActionModsMatchesEventStateFunc &matchEventState = GetMatchEventStateFuncForMock (triggerableAction); const CompAction::CallBack &initiate = GetInitiateForMock (triggerableAction); action.setButton (CompAction::ButtonBinding (testingButtonNumber, testingButtonState)); action.setEdgeMask (edgeMask); CompOption option ("button", CompOption::TypeButton); CompOption::Value value (action); cps::EventManager eventManager; ce::EventArguments arguments; ASSERT_TRUE (option.set (value)); option.value ().action ().setInitiate (initiate); option.value ().action ().setState (CompAction::StateInitButton | CompAction::StateInitEdge); ca::setActionActiveState (option.value ().action (), true); EXPECT_CALL (triggerableAction, matchEventState (testingButtonState, testingButtonState)) .WillOnce (Return (true)); EXPECT_CALL (triggerableAction, initiate (&option.value ().action (), CompAction::StateInitButton | CompAction::StateInitEdge, arguments)).WillOnce (Return (true)); EXPECT_TRUE (ce::activateButtonPressOnEdgeBindingOption (option, testingButtonNumber, testingButtonState, edgeMask, eventManager, matchEventState, arguments)); } TEST (privatescreen_ActionActiveTest, TestMakeActionActive) { CompAction action; ASSERT_EQ (action.active (), false); ca::setActionActiveState (action, true); ASSERT_EQ (action.active (), true); ca::setActionActiveState (action, false); ASSERT_EQ (action.active (), false); } ./src/action.cpp0000644000004100000410000003301313246301623014013 0ustar www-datawww-data/* * Copyright © 2005 Novell, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include "privateaction.h" namespace ca = compiz::actions; struct _Modifier { const char *name; int modifier; } modifiers[] = { { "", ShiftMask }, { "", ControlMask }, { "", ControlMask }, { "", ControlMask }, { "", Mod1Mask }, { "", Mod2Mask }, { "", Mod3Mask }, { "", Mod4Mask }, { "", Mod5Mask }, { "", CompAltMask }, { "", CompMetaMask }, { "", CompSuperMask }, { "", CompHyperMask }, { "", CompModeSwitchMask } }; #define N_MODIFIERS (sizeof (modifiers) / sizeof (struct _Modifier)) struct _Edge { const char *name; const char *modifierName; } edges[] = { { "Left", "" }, { "Right", "" }, { "Top", "" }, { "Bottom", "" }, { "TopLeft", "" }, { "TopRight", "" }, { "BottomLeft", "" }, { "BottomRight", "" } }; static CompString modifiersToString (unsigned int modMask) { CompString binding; for (unsigned int i = 0; i < N_MODIFIERS; ++i) { if (modMask & modifiers[i].modifier) { binding += modifiers[i].name; modMask &= ~modifiers[i].modifier; } } return binding; } static unsigned int stringToModifiers (const CompString &str) { unsigned int mods = 0; for (unsigned int i = 0; i < N_MODIFIERS; ++i) if (str.find (modifiers[i].name) != std::string::npos) mods |= modifiers[i].modifier; return mods; } static unsigned int bindingStringToEdgeMask (CompString str) { unsigned int edgeMask = 0; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) if (str.find (edges[i].modifierName) != std::string::npos) edgeMask |= 1 << i; return edgeMask; } static CompString edgeMaskToBindingString (unsigned int edgeMask) { CompString binding; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) if (edgeMask & (1 << i)) binding += edges[i].modifierName; return binding; } CompAction::KeyBinding::KeyBinding () : mModifiers (0), mKeycode (0) { } CompAction::KeyBinding::KeyBinding (const KeyBinding& k) : mModifiers (k.mModifiers), mKeycode (k.mKeycode) { } CompAction::KeyBinding::KeyBinding (int keycode, unsigned int modifiers) : mModifiers (modifiers), mKeycode (keycode) { } unsigned int CompAction::KeyBinding::modifiers () const { return mModifiers; } int CompAction::KeyBinding::keycode () const { return mKeycode; } bool CompAction::KeyBinding::fromString (const CompString &str) { /* This assertion is a regression test for LP: #930412 */ assert (screen); if (!screen) return false; unsigned int mods = stringToModifiers (str); size_t start = 0; size_t pos = str.rfind ('>'); if (pos != std::string::npos) start = pos + 1; while (start < str.size () && !isalnum (str[start])) ++start; if (start == str.size ()) { if (mods) { mKeycode = 0; mModifiers = mods; return true; } return false; } CompString sStr = str.substr (start); KeySym keysym = XStringToKeysym (sStr.c_str ()); if (keysym != NoSymbol) { KeyCode keycode; keycode = XKeysymToKeycode (screen->dpy (), keysym); if (keycode) { mKeycode = keycode; mModifiers = mods; return true; } } if (sStr.compare (0, 2, "0x") == 0) { mKeycode = strtol (sStr.c_str (), NULL, 0); mModifiers = mods; return true; } return false; } CompString CompAction::KeyBinding::toString () const { if (!screen) return ""; CompString binding = modifiersToString (mModifiers); if (mKeycode != 0) { KeySym keysym = XKeycodeToKeysym (screen->dpy (), mKeycode, 0); char *keyname = XKeysymToString (keysym); if (keyname) binding += keyname; else binding += compPrintf ("0x%x", mKeycode); } return binding; } bool CompAction::KeyBinding::operator== (const KeyBinding &k) const { return mKeycode == k.mKeycode && mModifiers == k.mModifiers; } bool CompAction::KeyBinding::operator!= (const KeyBinding &k) const { return !(*this == k); } CompAction::ButtonBinding::ButtonBinding () : mModifiers (0), mButton (0) { } CompAction::ButtonBinding::ButtonBinding (const ButtonBinding& b) : mModifiers (b.mModifiers), mButton (b.mButton) { } CompAction::ButtonBinding::ButtonBinding (int button, unsigned int modifiers) : mModifiers (modifiers), mButton (button) { } unsigned int CompAction::ButtonBinding::modifiers () const { return mModifiers; } int CompAction::ButtonBinding::button () const { return mButton; } bool CompAction::ButtonBinding::fromString (const CompString &str) { unsigned int mods = stringToModifiers (str); size_t start = 0; size_t pos = str.rfind ('>'); if (pos != std::string::npos) start = pos + 1; while (start < str.size () && !isalnum (str[start])) ++start; if (start != str.size () && str.compare (start, 6, "Button") == 0) { int buttonNum; if (sscanf (str.substr (start + 6).c_str (), "%d", &buttonNum) == 1) { mButton = buttonNum; mModifiers = mods; return true; } } return false; } CompString CompAction::ButtonBinding::toString () const { if (!mModifiers && !mButton) return ""; CompString binding = modifiersToString (mModifiers); binding += compPrintf ("Button%d", mButton); return binding; } bool CompAction::ButtonBinding::operator== (const ButtonBinding &b) const { return mButton == b.mButton && mModifiers == b.mModifiers; } bool CompAction::ButtonBinding::operator!= (const ButtonBinding &b) const { return !(*this == b); } CompAction::CompAction () : priv (new PrivateAction ()) { } CompAction::CompAction (const CompAction & a) : priv (new PrivateAction (*a.priv)) { } CompAction::~CompAction () { delete priv; } CompAction::CallBack CompAction::initiate () const { return priv->initiate; } CompAction::CallBack CompAction::terminate () const { return priv->terminate; } void CompAction::setInitiate (const CompAction::CallBack &initiate) { priv->initiate = initiate; } void CompAction::setTerminate (const CompAction::CallBack &terminate) { priv->terminate = terminate; } CompAction::State CompAction::state () const { return priv->state; } CompAction::BindingType CompAction::type () const { return priv->type; } CompAction::KeyBinding & CompAction::key () { return priv->key; } const CompAction::KeyBinding & CompAction::key () const { return priv->key; } void CompAction::setKey (const CompAction::KeyBinding &key) { priv->key = key; if (key.modifiers () || key.keycode ()) priv->type = CompAction::BindingTypeKey; else priv->type = CompAction::BindingTypeNone; } CompAction::ButtonBinding & CompAction::button () { return priv->button; } const CompAction::ButtonBinding & CompAction::button () const { return priv->button; } void CompAction::setButton (const CompAction::ButtonBinding &button) { priv->button = button; if (button.modifiers () || button.button ()) { if (priv->edgeMask) priv->type = CompAction::BindingTypeEdgeButton; else priv->type = CompAction::BindingTypeButton; } else priv->type = CompAction::BindingTypeNone; } unsigned int CompAction::edgeMask () const { return priv->edgeMask; } void CompAction::setEdgeMask (unsigned int edge) { priv->edgeMask = edge; if (priv->type == CompAction::BindingTypeEdgeButton || priv->type == CompAction::BindingTypeButton) { if (priv->edgeMask) priv->type = CompAction::BindingTypeEdgeButton; else priv->type = CompAction::BindingTypeButton; } } bool CompAction::bell () const { return priv->bell; } void CompAction::setBell (bool bell) { priv->bell = bell; } void CompAction::setState (CompAction::State state) { priv->state = state; } void CompAction::copyState (const CompAction &action) { priv->initiate = action.priv->initiate; priv->terminate = action.priv->terminate; priv->state = action.priv->state; memcpy (&priv->priv, &action.priv->priv, sizeof (CompPrivate)); } bool CompAction::operator== (const CompAction& val) const { if (priv->state != val.priv->state || priv->type != val.priv->type || priv->key.modifiers () != val.priv->key.modifiers () || priv->key.keycode () != val.priv->key.keycode () || priv->button.modifiers () != val.priv->button.modifiers () || priv->button.button () != val.priv->button.button () || priv->bell != val.priv->bell || priv->edgeMask != val.priv->edgeMask || memcmp (&priv->priv, &val.priv->priv, sizeof (CompPrivate)) != 0) return false; return true; } CompAction & CompAction::operator= (const CompAction &action) { if (this == &action) return *this; delete priv; priv = new PrivateAction (*action.priv); return *this; } bool CompAction::keyFromString (const CompString &str) { bool retval = priv->key.fromString (str); if (retval) priv->type = CompAction::BindingTypeKey; else { priv->type = CompAction::BindingTypeNone; if (str == "Disabled") retval = true; } return retval; } bool CompAction::buttonFromString (const CompString &str) { bool retval = priv->button.fromString (str); if (retval) { priv->edgeMask = bindingStringToEdgeMask (str); if (priv->edgeMask) priv->type = CompAction::BindingTypeEdgeButton; else priv->type = CompAction::BindingTypeButton; } else { priv->type = CompAction::BindingTypeNone; if (str == "Disabled") retval = true; } return retval; } bool CompAction::edgeMaskFromString (const CompString &str) { unsigned int edgeMask = 0; size_t pos; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) { pos = 0; while ((pos = str.find (edgeToString (i), pos)) != std::string::npos) { if (pos > 0 && isalnum (str[pos - 1])) { ++pos; continue; } pos += edgeToString (i).size (); if (pos < str.size () && isalnum (str[pos])) continue; edgeMask |= 1 << i; } } priv->edgeMask = edgeMask; return (edgeMask != 0 || str.empty ()); } CompString CompAction::keyToString () const { CompString binding = priv->key.toString (); if (!binding.size ()) return "Disabled"; return binding; } CompString CompAction::buttonToString () const { CompString edge; CompString binding = modifiersToString (priv->button.modifiers ()); binding += edgeMaskToBindingString (priv->edgeMask); binding += compPrintf ("Button%d", priv->button.button ()); if (!priv->button.button ()) return "Disabled"; return binding; } CompString CompAction::edgeMaskToString () const { CompString edge; for (int i = 0; i < SCREEN_EDGE_NUM; ++i) { if (priv->edgeMask & (1 << i)) { if (!edge.empty ()) edge += " | "; edge += edgeToString (i); } } return edge; } CompString CompAction::edgeToString (unsigned int edge) { return edges[edge].name; } bool CompAction::active () const { return priv->active; } void PrivateAction::setActive (bool a) { active = a; } void ca::setActionActiveState (const CompAction &action, bool active) { action.priv->setActive (active); } PrivateAction::PrivateAction () : initiate (), terminate (), state (0), type (0), key (), button (), bell (false), edgeMask (0), active (false) { memset (&priv, 0, sizeof (CompPrivate)); } PrivateAction::PrivateAction (const PrivateAction &a) : initiate (a.initiate), terminate (a.terminate), state (a.state), type (a.type), key (a.key), button (a.button), bell (a.bell), edgeMask (a.edgeMask), active (a.active) { memcpy (&priv, &a.priv, sizeof (CompPrivate)); } CompAction::Vector & noActions () { static CompAction::Vector v; return v; } ./src/outputdevices.h0000644000004100000410000000605013246301623015107 0ustar www-datawww-data/* * Compiz Core: OutputDevices class * * Copyright (c) 2012 Canonical Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include /* XXX: Including screen.h includes window.h and other unnecessary * headers which cause cascading header dependencies. We should seek to * eliminate this dependency */ #include namespace compiz { namespace core { class OutputDevices { public: OutputDevices (); void setCurrentOutput (unsigned int outputNum); CompOutput& getCurrentOutputDev () { return outputDevs[currentOutputDev]; } bool hasOverlappingOutputs () const { return overlappingOutputs; } void computeWorkAreas (CompRect &workArea, bool &workAreaChanged, CompRegion &allWorkArea, const CompWindowList &windows); const CompOutput &getOutputDev (unsigned int outputNum) const { return outputDevs[outputNum]; } // TODO breaks encapsulation horribly ought to be const at least // Even better, use begin() and end() return const_iterators // BUT this is exported directly through API - which makes changing // it a PITA. CompOutput::vector &getOutputDevs () { return outputDevs; } int outputDeviceForGeometry (const CompWindow::Geometry &gm, int strategy, CompSize *screen) const; void updateOutputDevices (CoreOptions &coreOptions, CompSize *screen); void setGeometryOnDevice (unsigned int nOutput, int x, int y, const int width, const int height); void adoptDevices (unsigned int nOutput, CompSize *screen); private: static CompRect computeWorkareaForBox (const CompRect &box, const CompWindowList &windows); CompOutput::vector outputDevs; bool overlappingOutputs; int currentOutputDev; }; } // namespace core } // namespace compiz ./src/privatesignalsource.h0000644000004100000410000000330313246301623016273 0ustar www-datawww-data/* * Copyright © 2012 Canonical, Ltd. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Canonical, Ltd. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Canonical, Ltd. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * CANONICAL LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL Canonical, Ltd. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include #include class CompSignalSource { public: ~CompSignalSource (); typedef boost::function callbackFunc; static CompSignalSource * create (int signum, const callbackFunc &); protected: explicit CompSignalSource (int signum, const callbackFunc &); private: static gboolean callback (gpointer user_data); static void destroyed (gpointer user_data); callbackFunc mFunc; int mSignal; gint mSource; }; ./metadata/0000755000004100000410000000000013246301623013023 5ustar www-datawww-data./metadata/CMakeLists.txt0000644000004100000410000000255513246301623015572 0ustar www-datawww-dataset ( COMPIZ_DEFAULT_PLUGINS "core" CACHE STRING "Default plugins list that will be added to core metadata file" ) find_program (XSLTPROC_EXECUTABLE xsltproc) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (XSLTPROC_EXECUTABLE) add_custom_command ( OUTPUT ${compiz_BINARY_DIR}/generated/core.xml.in COMMAND ${XSLTPROC_EXECUTABLE} -o ${compiz_BINARY_DIR}/generated/core.xml.in --param default_plugins "\"'${COMPIZ_DEFAULT_PLUGINS}'\"" ${CMAKE_SOURCE_DIR}/xslt/default_plugins.xslt ${CMAKE_CURRENT_SOURCE_DIR}/core.xml.in DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/core.xml.in ) set (_core_file "${CMAKE_BINARY_DIR}/generated/core.xml.in") else () set (_core_file "${CMAKE_CURRENT_SOURCE_DIR}/core.xml.in") endif () set (_xml_targets) set (_schema_targets) set (_core_xml_file ${CMAKE_BINARY_DIR}/generated/core.xml) compiz_translate_xml ( ${_core_file} ${_core_xml_file} ) install ( FILES ${_core_xml_file} DESTINATION ${compiz_metadatadir} ) add_custom_target (core-xml-file ALL DEPENDS ${_core_xml_file} ) set (_core_gschema_path ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.core.gschema.xml) compiz_gsettings_schema ( compiz ${_core_xml_file} ${_core_gschema_path} ${datadir}/glib-2.0/schemas ) add_custom_target (core-settings-schema ALL DEPENDS ${_core_gschema_path} core-xml-file ) ./metadata/core.xml.in0000644000004100000410000002153513246301623015110 0ustar www-datawww-data <_short>General Options <_long>General compiz options <_short>Display Settings <_short>Focus & Raise Behaviour <_short>Key bindings <_short>Desktop Size ./libdecoration/0000755000004100000410000000000013246301623014061 5ustar www-datawww-data./libdecoration/CMakeLists.txt0000644000004100000410000000226113246301623016622 0ustar www-datawww-dataconfigure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.libdecoration.in ${CMAKE_CURRENT_BINARY_DIR}/config.h ) include_directories ( ${compiz_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBDECORATION_INCLUDE_DIRS} ) add_definitions ( -DHAVE_CONFIG_H ) link_directories ( ${LIBDECORATION_LIBRARY_DIRS} ) add_library (decoration SHARED decoration.c ) set_target_properties (decoration PROPERTIES VERSION 0.0.0 SOVERSION 0 ) target_link_libraries ( decoration ${LIBDECORATION_LIBRARIES} m ) install ( TARGETS decoration DESTINATION ${libdir} ) set (DECORATION_LIBS "") foreach (_val ${LIBDECORATION_LDFLAGS}) set (DECORATION_LIBS "${DECORATION_LIBS}${_val} ") endforeach (_val ${LIBDECORATION_LDFLAGS}) set (DECORATION_CFLAGS "") foreach (_val ${LIBDECORATION_CFLAGS}) set (DECORATION_CFLAGS "${DECORATION_CFLAGS}${_val} ") endforeach (_val ${LIBDECORATION_CFLAGS}) compiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/libdecoration.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libdecoration.pc ) install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/libdecoration.pc DESTINATION ${libdir}/pkgconfig ) ./libdecoration/decoration.c0000644000004100000410000022137013246301623016361 0ustar www-datawww-data /* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include int decor_version (void) { return DECOR_INTERFACE_VERSION; } /* decoration property ------------------- data[0] = version data[1] = decoration type data[2] = number of decorations specified in property WINDOW_DECORATION_TYPE_WINDOW property -------------------------------------- data[3] = input left data[4] = input right data[5] = input top data[6] = input bottom data[7] = input left when maximized data[8] = input right when maximized data[9] = input top when maximized data[10] = input bottom when maximized data[11] = min width data[12] = min height fields 13 to 15 are only used by the default decorations on the root window data[13] = frame state data[14] = frame type data[15] = frame actions WINDOW_DECORATION_TYPE_PIXMAP property -------------------------------------- data[3] = pixmap extents frame input is used for creating the input area of the frame window which the client will be reparented into, border is used for positioning data[4] = frame left data[5] = frame right data[6] = frame top data[7] = frame bottom data[8] = input left data[9] = input right data[10] = input top data[11] = input bottom data[12] = frame left when maximized data[13] = frame right when maximized data[14] = frame top when maximized data[15] = frame bottom when maximized data[16] = border left when maximized data[17] = border right when maximized data[18] = border top when maximized data[19] = border bottom when maximized data[20] = min width data[21] = min height fields 22 to 24 are only used by the default decorations on the root window data[22] = frame state data[23] = frame type data[24] = frame actions data[25] = num quads flags 1st to 4nd bit p1 gravity, 5rd to 8th bit p2 gravity, 9rd and 10th bit alignment, 11rd and 12th bit clamp, 13th bit XX, 14th bit XY, 15th bit YX, 16th bit YY. data[26 + n * 9 + 1] = flags data[26 + n * 9 + 2] = p1 x data[26 + n * 9 + 3] = p1 y data[26 + n * 9 + 4] = p2 x data[26 + n * 9 + 5] = p2 y data[26 + n * 9 + 6] = widthMax data[26 + n * 9 + 7] = heightMax data[26 + n * 9 + 8] = x0 data[26 + n * 9 + 9] = y0 */ long * decor_alloc_property (unsigned int n, unsigned int type) { unsigned int propSize = 0; long *data; if (type == WINDOW_DECORATION_TYPE_WINDOW) propSize = WINDOW_PROP_SIZE; else if (type == WINDOW_DECORATION_TYPE_PIXMAP) propSize = BASE_PROP_SIZE + N_QUADS_MAX * QUAD_PROP_SIZE; propSize *= n; propSize += PROP_HEADER_SIZE; data = calloc (propSize, sizeof (long)); data[0] = DECOR_INTERFACE_VERSION; data[1] = type; data[2] = n; return data; } void decor_quads_to_property (long *data, unsigned int n, Pixmap pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, decor_quad_t *quad, int nQuad, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { /* FIXME: Allocating for N_QUAD_MAX is slightly inefficient, but there * isn't really a better way to do this at the moment */ data += PROP_HEADER_SIZE + n * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); memcpy (data++, &pixmap, sizeof (Pixmap)); *data++ = frame->left; *data++ = frame->right; *data++ = frame->top; *data++ = frame->bottom; *data++ = border->left; *data++ = border->right; *data++ = border->top; *data++ = border->bottom; *data++ = max_frame->left; *data++ = max_frame->right; *data++ = max_frame->top; *data++ = max_frame->bottom; *data++ = max_border->left; *data++ = max_border->right; *data++ = max_border->top; *data++ = max_border->bottom; *data++ = min_width; *data++ = min_height; *data++ = frame_type; *data++ = frame_state; *data++ = frame_actions; *data++ = nQuad; while (nQuad--) { *data++ = (quad->p1.gravity << 0) | (quad->p2.gravity << 4) | (quad->align << 8) | (quad->clamp << 10) | (quad->stretch << 12) | (quad->m.xx ? XX_MASK : 0) | (quad->m.xy ? XY_MASK : 0) | (quad->m.yx ? YX_MASK : 0) | (quad->m.yy ? YY_MASK : 0); *data++ = quad->p1.x; *data++ = quad->p1.y; *data++ = quad->p2.x; *data++ = quad->p2.y; *data++ = quad->max_width; *data++ = quad->max_height; *data++ = quad->m.x0; *data++ = quad->m.y0; ++quad; } } void decor_gen_window_property (long *data, unsigned int n, decor_extents_t *input, decor_extents_t *max_input, int min_width, int min_height, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { data += PROP_HEADER_SIZE + n * WINDOW_PROP_SIZE; *data++ = input->left; *data++ = input->right; *data++ = input->top; *data++ = input->bottom; *data++ = max_input->left; *data++ = max_input->right; *data++ = max_input->top; *data++ = max_input->bottom; *data++ = min_width; *data++ = min_height; *data++ = frame_type; *data++ = frame_state; *data++ = frame_actions; } int decor_property_get_version (long *data) { return (int) *data; } int decor_property_get_type (long *data) { return (int) data[1]; } int decor_property_get_num (long *data) { return (int) data[2]; } int decor_pixmap_property_to_quads (long *data, unsigned int nOffset, int size, Pixmap *pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions, decor_quad_t *quad) { int i, n, flags; if (size < PROP_HEADER_SIZE + nOffset * (BASE_PROP_SIZE + QUAD_PROP_SIZE + N_QUADS_MAX)) return 0; if (decor_property_get_version (data) != decor_version ()) return 0; if (decor_property_get_type (data) != WINDOW_DECORATION_TYPE_PIXMAP) return 0; data += PROP_HEADER_SIZE + nOffset * (BASE_PROP_SIZE + N_QUADS_MAX * QUAD_PROP_SIZE); memcpy (pixmap, data++, sizeof (Pixmap)); frame->left = *data++; frame->right = *data++; frame->top = *data++; frame->bottom = *data++; border->left = *data++; border->right = *data++; border->top = *data++; border->bottom = *data++; max_frame->left = *data++; max_frame->right = *data++; max_frame->top = *data++; max_frame->bottom = *data++; max_border->left = *data++; max_border->right = *data++; max_border->top = *data++; max_border->bottom = *data++; *min_width = *data++; *min_height = *data++; *frame_type = *data++; *frame_state = *data++; *frame_actions = *data++; n = *data++; for (i = 0; i < n; ++i) { flags = *data++; quad->p1.gravity = (flags >> 0) & 0xf; quad->p2.gravity = (flags >> 4) & 0xf; quad->align = (flags >> 8) & 0x3; quad->clamp = (flags >> 10) & 0x3; quad->stretch = (flags >> 12) & 0x3; quad->m.xx = (flags & XX_MASK) ? 1.0f : 0.0f; quad->m.xy = (flags & XY_MASK) ? 1.0f : 0.0f; quad->m.yx = (flags & YX_MASK) ? 1.0f : 0.0f; quad->m.yy = (flags & YY_MASK) ? 1.0f : 0.0f; quad->p1.x = *data++; quad->p1.y = *data++; quad->p2.x = *data++; quad->p2.y = *data++; quad->max_width = *data++; quad->max_height = *data++; quad->m.x0 = *data++; quad->m.y0 = *data++; ++quad; } return n; } static int decor_point_cmp (const decor_point_t *a, const decor_point_t *b) { /* Use binary | to avoid branch prediction slow-downs */ return (a->x - b->x) | (a->y - b->y) | (a->gravity - b->gravity); } int decor_shadow_options_cmp (const decor_shadow_options_t *a, const decor_shadow_options_t *b) { return (a->shadow_radius != b->shadow_radius) || (a->shadow_opacity != b->shadow_opacity) || (a->shadow_offset_x != b->shadow_offset_x) || (a->shadow_offset_y != b->shadow_offset_y) || memcmp (a->shadow_color, b->shadow_color, sizeof (unsigned short) * 3); } static int decor_matrix_cmp (const decor_matrix_t *a, const decor_matrix_t *b) { return (a->xx != b->xx) || (a->yx != b->yx) || (a->xy != b->xy) || (a->yy != b->yy) || (a->x0 != b->x0) || (a->y0 != b->y0); } static int decor_quad_cmp (const decor_quad_t *a, const decor_quad_t *b) { return decor_point_cmp (&a->p1, &b->p1) || decor_point_cmp (&a->p2, &b->p2) || decor_matrix_cmp (&a->m, &b->m) || ( (a->max_width - b->max_width) | (a->max_height - b->max_height) | (a->align - b->align) | (a->clamp - b->clamp) | (a->stretch - b->stretch) ); } int decor_extents_cmp (const decor_extents_t *a, const decor_extents_t *b) { /* Use binary | to avoid branch prediction slow-downs */ return (a->left - b->left) | (a->right - b->right) | (a->top - b->top) | (a->bottom - b->bottom); } /* Returns n for a match, returns -1 for no match */ int decor_match_pixmap (long *data, int size, Pixmap *pixmap, decor_extents_t *frame, decor_extents_t *border, decor_extents_t *max_frame, decor_extents_t *max_border, int min_width, int min_height, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions, decor_quad_t *quad, unsigned int n_quad) { int n = decor_property_get_num (data); unsigned int i = 0; for (; i < n; ++i) { Pixmap cPixmap; decor_extents_t cFrame, cBorder, cMax_frame, cMax_border; int cMin_width, cMin_height; int q; unsigned int cFrame_type, cFrame_state, cFrame_actions, cNQuad; decor_quad_t cQuad[N_QUADS_MAX]; cNQuad = decor_pixmap_property_to_quads (data, i, size, &cPixmap, &cFrame, &cBorder, &cMax_frame, &cMax_border, &cMin_width, &cMin_height, &cFrame_type, &cFrame_state, &cFrame_actions, cQuad); if (cPixmap != *pixmap) continue; if (decor_extents_cmp (&cFrame, frame) || decor_extents_cmp (&cBorder, border) || decor_extents_cmp (&cMax_frame, max_frame) || decor_extents_cmp (&cMax_border, max_border)) continue; if (cFrame_type != frame_type || cFrame_state != frame_state || cFrame_actions != frame_actions || cMin_width != min_width || cMin_height != min_height) continue; if (cNQuad != n_quad) continue; q = 0; while (q < n_quad && !decor_quad_cmp (&cQuad[q], &quad[q])) ++q; if (q < n_quad) continue; return n; } return -1; } int decor_window_property (long *data, unsigned int n, int size, decor_extents_t *input, decor_extents_t *max_input, int *min_width, int *min_height, unsigned int *frame_type, unsigned int *frame_state, unsigned int *frame_actions) { if (decor_property_get_version (data) != decor_version ()) return 0; if (decor_property_get_type (data) != WINDOW_DECORATION_TYPE_WINDOW) return 0; if (size < PROP_HEADER_SIZE + n * WINDOW_PROP_SIZE) return 0; data += PROP_HEADER_SIZE + n * WINDOW_PROP_SIZE; input->left = *data++; input->right = *data++; input->top = *data++; input->bottom = *data++; max_input->left = *data++; max_input->right = *data++; max_input->top = *data++; max_input->bottom = *data++; *min_width = *data++; *min_height = *data++; *frame_type = *data++; *frame_state = *data++; *frame_actions = *data++; return 1; } static int add_blur_boxes (long *data, BoxPtr box, int n_box, int width, int height, int gravity, int offset) { int x1, y1, x2, y2; int more_gravity; int n = n_box; while (n--) { x1 = box->x1; y1 = box->y1; x2 = box->x2; y2 = box->y2; if (gravity & (GRAVITY_NORTH | GRAVITY_SOUTH)) { if (x1 > offset) { more_gravity = GRAVITY_EAST; x1 -= width; } else { more_gravity = GRAVITY_WEST; } } else { if (y1 > offset) { more_gravity = GRAVITY_SOUTH; y1 -= height; } else { more_gravity = GRAVITY_NORTH; } } *data++ = gravity | more_gravity; *data++ = x1; *data++ = y1; if (gravity & (GRAVITY_NORTH | GRAVITY_SOUTH)) { if (x2 > offset) { more_gravity = GRAVITY_EAST; x2 -= width; } else { more_gravity = GRAVITY_WEST; } } else { if (y2 > offset) { more_gravity = GRAVITY_SOUTH; y2 -= height; } else { more_gravity = GRAVITY_NORTH; } } *data++ = gravity | more_gravity; *data++ = x2; *data++ = y2; ++box; } return n_box * 6; } void decor_region_to_blur_property (long *data, int threshold, int filter, int width, int height, Region top_region, int top_offset, Region bottom_region, int bottom_offset, Region left_region, int left_offset, Region right_region, int right_offset) { *data++ = threshold; *data++ = filter; if (top_region) data += add_blur_boxes (data, top_region->rects, top_region->numRects, width, height, GRAVITY_NORTH, top_offset); if (bottom_region) data += add_blur_boxes (data, bottom_region->rects, bottom_region->numRects, width, height, GRAVITY_SOUTH, bottom_offset); if (left_region) data += add_blur_boxes (data, left_region->rects, left_region->numRects, width, height, GRAVITY_WEST, left_offset); if (right_region) data += add_blur_boxes (data, right_region->rects, right_region->numRects, width, height, GRAVITY_EAST, right_offset); } void decor_apply_gravity (int gravity, int x, int y, int width, int height, int *return_x, int *return_y) { if (gravity & GRAVITY_EAST) { x += width; *return_x = MAX (0, x); } else if (gravity & GRAVITY_WEST) { *return_x = MIN (width, x); } else { x += width / 2; x = MAX (0, x); x = MIN (width, x); *return_x = x; } if (gravity & GRAVITY_SOUTH) { y += height; *return_y = MAX (0, y); } else if (gravity & GRAVITY_NORTH) { *return_y = MIN (height, y); } else { y += height / 2; y = MAX (0, y); y = MIN (height, y); *return_y = y; } } int decor_set_vert_quad_row (decor_quad_t *q, int top, int top_corner, int bottom, int bottom_corner, int left, int right, int gravity, int height, int splitY, int splitGravity, double x0, double y0, int rotation) { int nQuad = 0; q->p1.x = left; q->p1.y = -top; q->p1.gravity = gravity | GRAVITY_NORTH; q->p2.x = right; q->p2.y = splitY; q->p2.gravity = gravity | splitGravity; q->max_width = SHRT_MAX; q->max_height = top + top_corner; q->align = ALIGN_TOP; q->clamp = CLAMP_VERT; q->stretch = 0; q->m.x0 = x0; q->m.y0 = y0; if (rotation) { q->m.xx = 0.0; q->m.xy = 1.0; q->m.yx = 1.0; q->m.yy = 0.0; } else { q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; } ++q; ++nQuad; q->p1.x = left; q->p1.y = top_corner; q->p1.gravity = gravity | GRAVITY_NORTH; q->p2.x = right; q->p2.y = -bottom_corner; q->p2.gravity = gravity | GRAVITY_SOUTH; q->max_width = SHRT_MAX; q->max_height = SHRT_MAX; q->align = 0; q->clamp = CLAMP_VERT; q->stretch = 0; if (rotation) { q->m.xx = 0.0; q->m.xy = 0.0; q->m.yx = 1.0; q->m.yy = 0.0; q->m.x0 = x0 + top + top_corner; q->m.y0 = y0; } else { q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 0.0; q->m.x0 = x0; q->m.y0 = y0 + top + top_corner; } ++q; ++nQuad; q->p1.x = left; q->p1.y = splitY; q->p1.gravity = gravity | splitGravity; q->p2.x = right; q->p2.y = bottom; q->p2.gravity = gravity | GRAVITY_SOUTH; q->max_width = SHRT_MAX; q->max_height = bottom_corner + bottom; q->align = ALIGN_BOTTOM; q->clamp = CLAMP_VERT; q->stretch = 0; if (rotation) { q->m.xx = 0.0; q->m.xy = 1.0; q->m.yx = 1.0; q->m.yy = 0.0; q->m.x0 = x0 + height; q->m.y0 = y0; } else { q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0; q->m.y0 = y0 + height; } ++nQuad; return nQuad; } int decor_set_horz_quad_line (decor_quad_t *q, int left, int left_corner, int right, int right_corner, int top, int bottom, int gravity, int width, int splitX, int splitGravity, double x0, double y0) { int nQuad = 0; q->p1.x = -left; q->p1.y = top; q->p1.gravity = gravity | GRAVITY_WEST; q->p2.x = splitX; q->p2.y = bottom; q->p2.gravity = gravity | splitGravity; q->max_width = left + left_corner; q->max_height = SHRT_MAX; q->align = ALIGN_LEFT; q->clamp = 0; q->stretch = 0; q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0; q->m.y0 = y0; ++q; ++nQuad; q->p1.x = left_corner; q->p1.y = top; q->p1.gravity = gravity | GRAVITY_WEST; q->p2.x = -right_corner; q->p2.y = bottom; q->p2.gravity = gravity | GRAVITY_EAST; q->max_width = SHRT_MAX; q->max_height = SHRT_MAX; q->align = 0; q->clamp = 0; q->stretch = 0; q->m.xx = 0.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0 + left + left_corner; q->m.y0 = y0; ++q; ++nQuad; q->p1.x = splitX; q->p1.y = top; q->p1.gravity = gravity | splitGravity; q->p2.x = right; q->p2.y = bottom; q->p2.gravity = gravity | GRAVITY_EAST; q->max_width = right_corner + right; q->max_height = SHRT_MAX; q->align = ALIGN_RIGHT; q->clamp = 0; q->stretch = 0; q->m.xx = 1.0; q->m.xy = 0.0; q->m.yx = 0.0; q->m.yy = 1.0; q->m.x0 = x0 + width; q->m.y0 = y0; ++nQuad; return nQuad; } int decor_set_lSrS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l) { int lh, rh, splitY, n, nQuad = 0; splitY = (c->top_corner_space - c->bottom_corner_space) / 2; if (l->rotation) { lh = l->left.x2 - l->left.x1; rh = l->right.x2 - l->right.x1; } else { lh = l->left.y2 - l->left.y1; rh = l->right.y2 - l->right.y1; } /* left quads */ n = decor_set_vert_quad_row (q, 0, c->top_corner_space, 0, c->bottom_corner_space, -c->left_space, 0, GRAVITY_WEST, lh, splitY, 0, l->left.x1, l->left.y1, l->rotation); q += n; nQuad += n; /* right quads */ n = decor_set_vert_quad_row (q, 0, c->top_corner_space, 0, c->bottom_corner_space, 0, c->right_space, GRAVITY_EAST, rh, splitY, 0, l->right.x1, l->right.y1, l->rotation); nQuad += n; return nQuad; } int decor_set_lSrStSbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l) { int splitX, n, nQuad = 0; splitX = (c->left_corner_space - c->right_corner_space) / 2; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, splitX, 0, l->top.x1, l->top.y1); q += n; nQuad += n; n = decor_set_lSrS_window_quads (q, c, l); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, splitX, 0, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } int decor_set_lSrStXbS_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int top_stretch_offset) { int splitX, n, nQuad = 0; int top_left, top_right; splitX = (c->left_corner_space - c->right_corner_space) / 2; top_left = top_stretch_offset; top_right = l->top.x2 - l->top.x1 - c->left_space - c->right_space - top_left - 1; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, top_left, c->right_space, top_right, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, -top_right, GRAVITY_EAST, l->top.x1, l->top.y1); q += n; nQuad += n; n = decor_set_lSrS_window_quads (q, c, l); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, splitX, 0, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } int decor_set_lSrStSbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int bottom_stretch_offset) { int splitX, n, nQuad = 0; int bottom_left, bottom_right; splitX = (c->left_corner_space - c->right_corner_space) / 2; bottom_left = bottom_stretch_offset; bottom_right = l->bottom.x2 - l->bottom.x1 - c->left_space - c->right_space - bottom_left - 1; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, c->left_corner_space, c->right_space, c->right_corner_space, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, splitX, 0, l->top.x1, l->top.y1); q += n; nQuad += n; n = decor_set_lSrS_window_quads (q, c, l); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, bottom_left, c->right_space, bottom_right, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, -bottom_right, GRAVITY_EAST, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } int decor_set_lXrXtXbX_window_quads (decor_quad_t *q, decor_context_t *c, decor_layout_t *l, int left_stretch_offset, int right_stretch_offset, int top_stretch_offset, int bottom_stretch_offset) { int lh, rh, n, nQuad = 0; int left_top, left_bottom; int right_top, right_bottom; int top_left, top_right; int bottom_left, bottom_right; top_left = top_stretch_offset; top_right = l->top.x2 - l->top.x1 - c->left_space - c->right_space - top_left - 1; bottom_left = bottom_stretch_offset; bottom_right = l->bottom.x2 - l->bottom.x1 - c->left_space - c->right_space - bottom_left - 1; if (l->rotation) { lh = l->left.x2 - l->left.x1; rh = l->right.x2 - l->right.x1; } else { lh = l->left.y2 - l->left.y1; rh = l->right.y2 - l->right.y1; } left_top = left_stretch_offset; left_bottom = lh - left_top - 1; right_top = right_stretch_offset; right_bottom = rh - right_top - 1; /* top quads */ n = decor_set_horz_quad_line (q, c->left_space, top_left, c->right_space, top_right, -c->top_space, 0, GRAVITY_NORTH, l->top.x2 - l->top.x1, -top_right, GRAVITY_EAST, l->top.x1, l->top.y1); q += n; nQuad += n; /* left quads */ n = decor_set_vert_quad_row (q, 0, left_top, 0, left_bottom, -c->left_space, 0, GRAVITY_WEST, lh, -left_bottom, GRAVITY_SOUTH, l->left.x1, l->left.y1, l->rotation); q += n; nQuad += n; /* right quads */ n = decor_set_vert_quad_row (q, 0, right_top, 0, right_bottom, 0, c->right_space, GRAVITY_EAST, rh, -right_bottom, GRAVITY_SOUTH, l->right.x1, l->right.y1, l->rotation); q += n; nQuad += n; /* bottom quads */ n = decor_set_horz_quad_line (q, c->left_space, bottom_left, c->right_space, bottom_right, 0, c->bottom_space, GRAVITY_SOUTH, l->bottom.x2 - l->bottom.x1, -bottom_right, GRAVITY_EAST, l->bottom.x1, l->bottom.y1); nQuad += n; return nQuad; } #if INT_MAX != LONG_MAX static int errors; static int error_handler (Display *xdisplay, XErrorEvent *event) { ++errors; return 0; } /* XRenderSetPictureFilter used to be broken on LP64. This * works with either the broken or fixed version. */ static void XRenderSetPictureFilter_wrapper (Display *dpy, Picture picture, char *filter, XFixed *params, int nparams) { int (*old) (Display *, XErrorEvent *); errors = 0; old = XSetErrorHandler (error_handler); XRenderSetPictureFilter (dpy, picture, filter, params, nparams); XSync (dpy, False); XSetErrorHandler (old); if (errors) { long *long_params = malloc (sizeof (long) * nparams); int i; for (i = 0; i < nparams; ++i) long_params[i] = params[i]; XRenderSetPictureFilter (dpy, picture, filter, (XFixed *) long_params, nparams); free (long_params); } } #define XRenderSetPictureFilter XRenderSetPictureFilter_wrapper #endif static void set_picture_transform (Display *xdisplay, Picture p, int dx, int dy) { XTransform transform = { { { 1 << 16, 0, -dx << 16 }, { 0, 1 << 16, -dy << 16 }, { 0, 0, 1 << 16 }, } }; XRenderSetPictureTransform (xdisplay, p, &transform); } static void set_picture_clip (Display *xdisplay, Picture p, int width, int height, int clipX1, int clipY1, int clipX2, int clipY2) { XRectangle clip[4]; clip[0].x = 0; clip[0].y = 0; clip[0].width = width; clip[0].height = clipY1; clip[1].x = 0; clip[1].y = clipY2; clip[1].width = width; clip[1].height = height - clipY2; clip[2].x = 0; clip[2].y = clipY1; clip[2].width = clipX1; clip[2].height = clipY2 - clipY1; clip[3].x = clipX2; clip[3].y = clipY1; clip[3].width = width - clipX2; clip[3].height = clipY2 - clipY1; XRenderSetPictureClipRectangles (xdisplay, p, 0, 0, clip, 4); } static void set_no_picture_clip (Display *xdisplay, Picture p) { XRectangle clip; clip.x = 0; clip.y = 0; clip.width = SHRT_MAX; clip.height = SHRT_MAX; XRenderSetPictureClipRectangles (xdisplay, p, 0, 0, &clip, 1); } static XFixed * create_gaussian_kernel (double radius, double sigma, double alpha, int *r_size) { XFixed *params; double *amp, scale, x_scale, fx, sum; int size, half_size, x, i, n; scale = 1.0f / (2.0f * M_PI * sigma * sigma); half_size = alpha + 0.5f; if (half_size == 0) half_size = 1; size = half_size * 2 + 1; x_scale = 2.0f * radius / size; if (size < 3) return NULL; n = size; amp = malloc (sizeof (double) * n); if (!amp) return NULL; n += 2; params = malloc (sizeof (XFixed) * n); if (!params) { free (amp); return NULL; } i = 0; sum = 0.0f; for (x = 0; x < size; ++x) { fx = x_scale * (x - half_size); amp[i] = scale * exp ((-1.0f * (fx * fx)) / (2.0f * sigma * sigma)); sum += amp[i]; ++i; } /* normalize */ if (sum != 0.0) sum = 1.0 / sum; params[0] = params[1] = 0; for (i = 2; i < n; ++i) params[i] = XDoubleToFixed (amp[i - 2] * sum); free (amp); *r_size = size; return params; } #define SIGMA(r) ((r) / 2.0) #define ALPHA(r) (r) decor_shadow_t * decor_shadow_create (Display *xdisplay, Screen *screen, int width, int height, int left, int right, int top, int bottom, int solid_left, int solid_right, int solid_top, int solid_bottom, decor_shadow_options_t *opt, decor_context_t *c, decor_draw_func_t draw, void *closure) { static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; XRenderPictFormat *format; Pixmap pixmap; Picture src, dst, tmp; XFixed opacity, *params; XFilters *filters; char *filter = NULL; int size, n_params = 0; XRenderColor color; int shadow_offset_x; int shadow_offset_y; Pixmap d_pixmap; int d_width; int d_height; Window xroot = screen->root; decor_shadow_t *shadow; int clipX1, clipY1, clipX2, clipY2; shadow = malloc (sizeof (decor_shadow_t)); if (!shadow) return NULL; shadow->ref_count = 1; shadow->pixmap = 0; shadow->picture = 0; shadow->width = 0; shadow->height = 0; shadow_offset_x = opt->shadow_offset_x; shadow_offset_y = opt->shadow_offset_y; /* compute a gaussian convolution kernel */ params = create_gaussian_kernel (opt->shadow_radius, SIGMA (opt->shadow_radius), ALPHA (opt->shadow_radius), &size); if (!params) shadow_offset_x = shadow_offset_y = size = 0; if (opt->shadow_radius <= 0.0 && shadow_offset_x == 0 && shadow_offset_y == 0) size = 0; n_params = size + 2; size = size / 2; c->extents.left = left; c->extents.right = right; c->extents.top = top; c->extents.bottom = bottom; c->left_space = left + size - shadow_offset_x; c->right_space = right + size + shadow_offset_x; c->top_space = top + size - shadow_offset_y; c->bottom_space = bottom + size + shadow_offset_y; c->left_space = MAX (left, c->left_space); c->right_space = MAX (right, c->right_space); c->top_space = MAX (top, c->top_space); c->bottom_space = MAX (bottom, c->bottom_space); c->left_corner_space = MAX (1, size - solid_left + shadow_offset_x); c->right_corner_space = MAX (1, size - solid_right - shadow_offset_x); c->top_corner_space = MAX (1, size - solid_top + shadow_offset_y); c->bottom_corner_space = MAX (1, size - solid_bottom - shadow_offset_y); width = MAX (width, c->left_corner_space + c->right_corner_space); height = MAX (height, c->top_corner_space + c->bottom_corner_space); width = MAX (1, width); height = MAX (1, height); d_width = c->left_space + width + c->right_space; d_height = c->top_space + height + c->bottom_space; /* all pixmaps are ARGB32 */ format = XRenderFindStandardFormat (xdisplay, PictStandardARGB32); /* no shadow */ if (size <= 0) { if (params) free (params); return shadow; } pixmap = XCreatePixmap (xdisplay, xroot, d_width, d_height, 32); if (!pixmap) { free (params); return shadow; } /* query server for convolution filter */ filters = XRenderQueryFilters (xdisplay, pixmap); if (filters) { int i; for (i = 0; i < filters->nfilter; ++i) { if (strcmp (filters->filter[i], FilterConvolution) == 0) { filter = (char *) FilterConvolution; break; } } XFree (filters); } if (!filter) { XFreePixmap (xdisplay, pixmap); free (params); return shadow; } /* create pixmap for temporary decorations */ d_pixmap = XCreatePixmap (xdisplay, xroot, d_width, d_height, 32); if (!d_pixmap) { XFreePixmap (xdisplay, pixmap); free (params); return shadow; } src = XRenderCreateSolidFill (xdisplay, &white); dst = XRenderCreatePicture (xdisplay, d_pixmap, format, 0, NULL); tmp = XRenderCreatePicture (xdisplay, pixmap, format, 0, NULL); /* draw decoration */ (*draw) (xdisplay, d_pixmap, dst, d_width, d_height, c, closure); /* first pass */ params[0] = (n_params - 2) << 16; params[1] = 1 << 16; clipX1 = c->left_space + size; clipY1 = c->top_space + size; clipX2 = d_width - c->right_space - size; clipY2 = d_height - c->bottom_space - size; if (clipX1 < clipX2 && clipY1 < clipY2) set_picture_clip (xdisplay, tmp, d_width, d_height, clipX1, clipY1, clipX2, clipY2); set_picture_transform (xdisplay, dst, shadow_offset_x, 0); XRenderSetPictureFilter (xdisplay, dst, filter, params, n_params); XRenderComposite (xdisplay, PictOpSrc, src, dst, tmp, 0, 0, 0, 0, 0, 0, d_width, d_height); set_no_picture_clip (xdisplay, tmp); XRenderFreePicture (xdisplay, src); /* second pass */ params[0] = 1 << 16; params[1] = (n_params - 2) << 16; opacity = XDoubleToFixed (opt->shadow_opacity); if (opacity < (1 << 16)) { /* apply opacity as shadow color if less than 1.0 */ color.red = (opt->shadow_color[0] * opacity) >> 16; color.green = (opt->shadow_color[1] * opacity) >> 16; color.blue = (opt->shadow_color[2] * opacity) >> 16; color.alpha = opacity; opacity = 1 << 16; } else { /* shadow color */ color.red = opt->shadow_color[0]; color.green = opt->shadow_color[1]; color.blue = opt->shadow_color[2]; color.alpha = 0xffff; } src = XRenderCreateSolidFill (xdisplay, &color); clipX1 = c->left_space; clipY1 = c->top_space; clipX2 = d_width - c->right_space; clipY2 = d_height - c->bottom_space; if (clipX1 < clipX2 && clipY1 < clipY2) set_picture_clip (xdisplay, dst, d_width, d_height, clipX1, clipY1, clipX2, clipY2); set_picture_transform (xdisplay, tmp, 0, shadow_offset_y); XRenderSetPictureFilter (xdisplay, tmp, filter, params, n_params); XRenderComposite (xdisplay, PictOpSrc, src, tmp, dst, 0, 0, 0, 0, 0, 0, d_width, d_height); set_no_picture_clip (xdisplay, dst); XRenderFreePicture (xdisplay, src); if (opacity != (1 << 16)) { XFixed p[3]; p[0] = 1 << 16; p[1] = 1 << 16; p[2] = opacity; if (clipX1 < clipX2 && clipY1 < clipY2) set_picture_clip (xdisplay, tmp, d_width, d_height, clipX1, clipY1, clipX2, clipY2); /* apply opacity */ set_picture_transform (xdisplay, dst, 0, 0); XRenderSetPictureFilter (xdisplay, dst, filter, p, 3); XRenderComposite (xdisplay, PictOpSrc, dst, None, tmp, 0, 0, 0, 0, 0, 0, d_width, d_height); XFreePixmap (xdisplay, d_pixmap); shadow->pixmap = pixmap; } else { XFreePixmap (xdisplay, pixmap); shadow->pixmap = d_pixmap; } XRenderFreePicture (xdisplay, tmp); XRenderFreePicture (xdisplay, dst); shadow->picture = XRenderCreatePicture (xdisplay, shadow->pixmap, format, 0, NULL); shadow->width = d_width; shadow->height = d_height; free (params); return shadow; } void decor_shadow_destroy (Display *xdisplay, decor_shadow_t *shadow) { --shadow->ref_count; if (shadow->ref_count) return; if (shadow->picture) XRenderFreePicture (xdisplay, shadow->picture); if (shadow->pixmap) XFreePixmap (xdisplay, shadow->pixmap); free (shadow); } void decor_shadow_reference (decor_shadow_t *shadow) { ++shadow->ref_count; } void decor_draw_simple (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *c, void *closure) { static XRenderColor clear = { 0x0000, 0x0000, 0x0000, 0x0000 }; static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; XRenderFillRectangle (xdisplay, PictOpSrc, picture, &clear, 0, 0, width, height); XRenderFillRectangle (xdisplay, PictOpSrc, picture, &white, c->left_space - c->extents.left, c->top_space - c->extents.top, width - c->left_space - c->right_space + c->extents.left + c->extents.right, height - c->top_space - c->bottom_space + c->extents.top + c->extents.bottom); } void decor_get_default_layout (decor_context_t *c, int width, int height, decor_layout_t *layout) { width = MAX (width, c->left_corner_space + c->right_corner_space); height = MAX (height, c->top_corner_space + c->bottom_corner_space); width += c->left_space + c->right_space; layout->top.x1 = 0; layout->top.y1 = 0; layout->top.x2 = width; layout->top.y2 = c->top_space; layout->top.pad = 0; layout->left.x1 = 0; layout->left.y1 = c->top_space; layout->left.x2 = c->left_space; layout->left.y2 = c->top_space + height; layout->left.pad = 0; layout->right.x1 = width - c->right_space; layout->right.y1 = c->top_space; layout->right.x2 = width; layout->right.y2 = c->top_space + height; layout->right.pad = 0; layout->bottom.x1 = 0; layout->bottom.y1 = height + c->top_space; layout->bottom.x2 = width; layout->bottom.y2 = height + c->top_space + c->bottom_space; layout->bottom.pad = 0; layout->width = width; layout->height = height + c->top_space + c->bottom_space; layout->rotation = 0; } void decor_get_best_layout (decor_context_t *c, int width, int height, decor_layout_t *layout) { int y; /* use default layout when no left and right extents */ if (c->extents.left == 0 && c->extents.right == 0) { decor_get_default_layout (c, width, 1, layout); return; } width = MAX (width, c->left_corner_space + c->right_corner_space); height = MAX (height, c->top_corner_space + c->bottom_corner_space); width += c->left_space + c->right_space; if (width >= (height + 2)) { int max; layout->width = width; layout->top.x1 = 0; layout->top.y1 = 0; layout->top.x2 = width; layout->top.y2 = c->top_space; y = c->top_space; max = MAX (c->left_space, c->right_space); if (max < height) { layout->rotation = 1; y += 2; layout->top.pad = PAD_BOTTOM; layout->bottom.pad = PAD_TOP; layout->left.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->right.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->left.x1 = 1; layout->left.y1 = y; layout->left.x2 = 1 + height; layout->left.y2 = y + c->left_space; if ((height + 2) <= (width / 2)) { layout->right.x1 = height + 3; layout->right.y1 = y; layout->right.x2 = height + 3 + height; layout->right.y2 = y + c->right_space; y += max + 2; } else { y += c->left_space + 2; layout->right.x1 = 1; layout->right.y1 = y; layout->right.x2 = 1 + height; layout->right.y2 = y + c->right_space; y += c->right_space + 2; } } else { layout->rotation = 0; layout->top.pad = 0; layout->bottom.pad = 0; layout->left.pad = 0; layout->right.pad = 0; layout->left.x1 = 0; layout->left.y1 = y; layout->left.x2 = c->left_space; layout->left.y2 = y + height; layout->right.x1 = width - c->right_space; layout->right.y1 = y; layout->right.x2 = width; layout->right.y2 = y + height; y += height; } layout->bottom.x1 = 0; layout->bottom.y1 = y; layout->bottom.x2 = width; layout->bottom.y2 = y + c->bottom_space; y += c->bottom_space; } else { layout->rotation = 1; layout->left.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->right.pad = PAD_TOP | PAD_BOTTOM | PAD_LEFT | PAD_RIGHT; layout->top.x1 = 0; layout->top.y1 = 0; layout->top.x2 = width; layout->top.y2 = c->top_space; if (((width * 2) + 3) <= (height + 2)) { layout->width = height + 2; layout->top.pad = PAD_BOTTOM | PAD_RIGHT; layout->bottom.pad = PAD_TOP | PAD_BOTTOM | PAD_RIGHT | PAD_LEFT; layout->bottom.x1 = width + 2; layout->bottom.y1 = 1; layout->bottom.x2 = width + 2 + width; layout->bottom.y2 = 1 + c->bottom_space; y = MAX (c->top_space, 1 + c->bottom_space) + 2; layout->left.x1 = 1; layout->left.y1 = y; layout->left.x2 = 1 + height; layout->left.y2 = y + c->left_space; y += c->left_space + 2; layout->right.x1 = 1; layout->right.y1 = y; layout->right.x2 = 1 + height; layout->right.y2 = y + c->right_space; y += c->right_space; } else { layout->width = height + 2; layout->top.pad = PAD_BOTTOM | PAD_RIGHT; layout->bottom.pad = PAD_TOP | PAD_RIGHT; y = c->top_space + 2; layout->left.x1 = 1; layout->left.y1 = y; layout->left.x2 = 1 + height; layout->left.y2 = y + c->left_space; y += c->left_space + 2; layout->right.x1 = 1; layout->right.y1 = y; layout->right.x2 = 1 + height; layout->right.y2 = y + c->right_space; y += c->right_space + 2; layout->bottom.x1 = 0; layout->bottom.y1 = y; layout->bottom.x2 = width; layout->bottom.y2 = y + c->bottom_space; y += c->bottom_space; } } layout->height = y; } static XTransform xident = { { { 1 << 16, 0, 0 }, { 0, 1 << 16, 0 }, { 0, 0, 1 << 16 }, } }; void decor_fill_picture_extents_with_shadow (Display *xdisplay, decor_shadow_t *shadow, decor_context_t *context, Picture picture, decor_layout_t *layout) { int w, h, left, right, top, bottom, width, height; if (!shadow->picture) return; width = layout->top.x2 - layout->top.x1; if (layout->rotation) height = layout->left.x2 - layout->left.x1; else height = layout->left.y2 - layout->left.y1; height += context->top_space + context->bottom_space; left = context->left_space + context->left_corner_space; right = context->right_space + context->right_corner_space; top = context->top_space + context->top_corner_space; bottom = context->bottom_space + context->bottom_corner_space; if (width - left - right < 0) { left = width / 2; right = width - left; } if (height - top - bottom < 0) { top = height / 2; bottom = height - top; } w = width - left - right; h = height - top - bottom; /* top left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->top.x1, layout->top.y1, left, context->top_space); /* top right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - right, 0, 0, 0, layout->top.x2 - right, layout->top.y1, right, context->top_space); /* bottom left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, shadow->height - context->bottom_space, 0, 0, layout->bottom.x1, layout->bottom.y1, left, context->bottom_space); /* bottom right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - right, shadow->height - context->bottom_space, 0, 0, layout->bottom.x2 - right, layout->bottom.y1, right, context->bottom_space); if (w > 0) { int sw = shadow->width - left - right; int sx = left; if (sw != w) { XTransform t = { { { (sw << 16) / w, 0, left << 16 }, { 0, 1 << 16, 0 }, { 0, 0, 1 << 16 }, } }; sx = 0; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); } /* top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, sx, 0, 0, 0, layout->top.x1 + left, layout->top.y1, w, context->top_space); /* bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, sx, shadow->height - context->bottom_space, 0, 0, layout->bottom.x1 + left, layout->bottom.y1, w, context->bottom_space); if (sw != w) XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[1][2] = context->top_space << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* left top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->left.x1, layout->left.y1, top - context->top_space, context->left_space); t.matrix[0][2] = (shadow->width - context->right_space) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* right top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->right.x1, layout->right.y1, top - context->top_space, context->right_space); XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } else { /* left top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, context->top_space, 0, 0, layout->left.x1, layout->left.y1, context->left_space, top - context->top_space); /* right top */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - context->right_space, context->top_space, 0, 0, layout->right.x1, layout->right.y1, context->right_space, top - context->top_space); } if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[1][2] = (shadow->height - bottom) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* left bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->left.x2 - (bottom - context->bottom_space), layout->left.y1, bottom - context->bottom_space, context->left_space); t.matrix[0][2] = (shadow->width - context->right_space) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* right bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->right.x2 - (bottom - context->bottom_space), layout->right.y1, bottom - context->bottom_space, context->right_space); XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } else { /* left bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, shadow->height - bottom, 0, 0, layout->left.x1, layout->left.y2 - (bottom - context->bottom_space), context->left_space, bottom - context->bottom_space); /* right bottom */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - context->right_space, shadow->height - bottom, 0, 0, layout->right.x1, layout->right.y2 - (bottom - context->bottom_space), context->right_space, bottom - context->bottom_space); } if (h > 0) { int sh = shadow->height - top - bottom; if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { (sh << 16) / h, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[1][2] = top << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->left.x1 + (top - context->top_space), layout->left.y1, h, context->left_space); t.matrix[0][2] = (shadow->width - context->right_space) << 16; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); /* right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, 0, 0, 0, layout->right.x1 + (top - context->top_space), layout->right.y1, h, context->right_space); XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } else { int sy = top; if (sh != h) { XTransform t = { { { 1 << 16, 0, 0 }, { 0, (sh << 16) / h, top << 16 }, { 0, 0, 1 << 16 }, } }; sy = 0; XRenderSetPictureTransform (xdisplay, shadow->picture, &t); } /* left */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, 0, sy, 0, 0, layout->left.x1, layout->left.y1 + (top - context->top_space), context->left_space, h); /* right */ XRenderComposite (xdisplay, PictOpSrc, shadow->picture, 0, picture, shadow->width - context->right_space, sy, 0, 0, layout->right.x2 - context->right_space, layout->right.y1 + (top - context->top_space), context->right_space, h); if (sh != h) XRenderSetPictureTransform (xdisplay, shadow->picture, &xident); } } } static void _decor_pad_border_picture (Display *xdisplay, Picture dst, decor_box_t *box) { int x1, y1, x2, y2; x1 = box->x1; y1 = box->y1; x2 = box->x2; y2 = box->y2; if (box->pad & PAD_TOP) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x1, y1, 0, 0, x1, y1 - 1, x2 - x1, 1); --y1; } if (box->pad & PAD_BOTTOM) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x1, y2 - 1, 0, 0, x1, y2, x2 - x1, 1); ++y2; } if (box->pad & PAD_LEFT) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x1, y1, 0, 0, x1 - 1, y1, 1, y2 - y1); } if (box->pad & PAD_RIGHT) { XRenderComposite (xdisplay, PictOpSrc, dst, None, dst, x2 - 1, y1, 0, 0, x2, y1, 1, y2 - y1); } } #ifndef HAVE_XRENDER_0_9_3 /* XRenderCreateLinearGradient and XRenderCreateRadialGradient used to be * broken. Flushing Xlib's output buffer before calling one of these * functions will avoid this specific issue. */ static Picture XRenderCreateLinearGradient_wrapper (Display *xdisplay, const XLinearGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nStops) { XFlush (xdisplay); return XRenderCreateLinearGradient (xdisplay, gradient, stops, colors, nStops); } static Picture XRenderCreateRadialGradient_wrapper (Display *xdisplay, const XRadialGradient *gradient, const XFixed *stops, const XRenderColor *colors, int nStops) { XFlush (xdisplay); return XRenderCreateRadialGradient (xdisplay, gradient, stops, colors, nStops); } #define XRenderCreateLinearGradient XRenderCreateLinearGradient_wrapper #define XRenderCreateRadialGradient XRenderCreateRadialGradient_wrapper #endif static void _decor_blend_horz_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, Region region, unsigned short alpha, int shade_alpha, int x1, int y1, int x2, int y2, int dy, int direction, int ignore_src_alpha) { XRenderColor color[3] = { { 0xffff, 0xffff, 0xffff, 0xffff }, { alpha, alpha, alpha, alpha }, { 0x0, 0x0, 0x0, 0xffff } }; int op = PictOpSrc, gop = PictOpSrc; int left, right; left = context->extents.left; right = context->extents.right; XOffsetRegion (region, x1, y1); XRenderSetPictureClipRegion (xdisplay, dst, region); XOffsetRegion (region, -x1, -y1); if (ignore_src_alpha) { XRenderComposite (xdisplay, PictOpSrc, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFillRectangle (xdisplay, PictOpAdd, dst, &color[2], x1, y1, x2 - x1, y2 - y1); gop = PictOpInReverse; } if (alpha != 0xffff) { op = PictOpIn; if (shade_alpha) { static XFixed stop[2] = { 0, 1 << 16 }; XTransform transform = { { { 1 << 16, 0, 0 }, { 0, 1 << 16, 0 }, { 0, 0, 1 << 16 } } }; Picture grad; XLinearGradient linear; XRadialGradient radial; XRenderPictureAttributes attrib; attrib.repeat = RepeatPad; radial.inner.x = 0; radial.inner.y = 0; radial.inner.radius = 0; radial.outer.x = 0; radial.outer.y = 0; /* left */ radial.outer.radius = left << 16; grad = XRenderCreateRadialGradient (xdisplay, &radial, stop, color, 2); transform.matrix[1][1] = (left << 16) / dy; transform.matrix[0][2] = -left << 16; if (direction < 0) transform.matrix[1][2] = -left << 16; XRenderSetPictureTransform (xdisplay, grad, &transform); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x1, y1, left, dy); XRenderFreePicture (xdisplay, grad); /* middle */ linear.p1.x = 0; linear.p2.x = 0; if (direction > 0) { linear.p1.y = 0; linear.p2.y = dy << 16; } else { linear.p1.y = dy << 16; linear.p2.y = 0; } grad = XRenderCreateLinearGradient (xdisplay, &linear, stop, color, 2); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x1 + left, y1, (x2 - x1) - left - right, dy); XRenderFreePicture (xdisplay, grad); /* right */ radial.outer.radius = right << 16; grad = XRenderCreateRadialGradient (xdisplay, &radial, stop, color, 2); transform.matrix[1][1] = (right << 16) / dy; transform.matrix[0][2] = 1 << 16; if (direction < 0) transform.matrix[1][2] = -right << 16; XRenderSetPictureTransform (xdisplay, grad, &transform); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x2 - right, y1, right, dy); XRenderFreePicture (xdisplay, grad); } else { XRenderFillRectangle (xdisplay, gop, dst, &color[1], x1, y1, x2 - x1, y2 - y1); } } if (!ignore_src_alpha) XRenderComposite (xdisplay, op, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); set_no_picture_clip (xdisplay, dst); } static void _decor_blend_vert_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, Region region, unsigned short alpha, int shade_alpha, int x1, int y1, int x2, int y2, int direction, int ignore_src_alpha) { XRenderColor color[3] = { { 0xffff, 0xffff, 0xffff, 0xffff }, { alpha, alpha, alpha, alpha }, { 0x0, 0x0, 0x0, 0xffff } }; int op = PictOpSrc, gop = PictOpSrc; if (layout->rotation) { Region rotated_region; XRectangle rect; BoxPtr pBox = region->rects; int nBox = region->numRects; rotated_region = XCreateRegion (); while (nBox--) { rect.x = x1 + pBox->y1; rect.y = y1 + pBox->x1; rect.width = pBox->y2 - pBox->y1; rect.height = pBox->x2 - pBox->x1; XUnionRectWithRegion (&rect, rotated_region, rotated_region); ++pBox; } XRenderSetPictureClipRegion (xdisplay, dst, rotated_region); XDestroyRegion (rotated_region); } else { XOffsetRegion (region, x1, y1); XRenderSetPictureClipRegion (xdisplay, dst, region); XOffsetRegion (region, -x1, -y1); } if (ignore_src_alpha) { if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[0][2] = xSrc << 16; t.matrix[1][2] = ySrc << 16; XRenderSetPictureTransform (xdisplay, src, &t); XRenderComposite (xdisplay, PictOpSrc, src, None, dst, 0, 0, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFillRectangle (xdisplay, PictOpAdd, dst, &color[2], x1, y1, x2 - x1, y2 - y1); XRenderSetPictureTransform (xdisplay, src, &xident); } else { XRenderComposite (xdisplay, PictOpSrc, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFillRectangle (xdisplay, PictOpAdd, dst, &color[2], x1, y1, x2 - x1, y2 - y1); } gop = PictOpInReverse; } if (alpha != 0xffff) { op = PictOpIn; if (shade_alpha) { static XFixed stop[2] = { 0, 1 << 16 }; Picture grad; XLinearGradient linear; XRenderPictureAttributes attrib; attrib.repeat = RepeatPad; if (layout->rotation) { linear.p1.x = 0; linear.p2.x = 0; if (direction < 0) { linear.p1.y = 0; linear.p2.y = (y2 - y1) << 16; } else { linear.p1.y = (y2 - y1) << 16; linear.p2.y = 0 << 16; } } else { linear.p1.y = 0; linear.p2.y = 0; if (direction < 0) { linear.p1.x = 0; linear.p2.x = (x2 - x1) << 16; } else { linear.p1.x = (x2 - x1) << 16; linear.p2.x = 0; } } grad = XRenderCreateLinearGradient (xdisplay, &linear, stop, color, 2); XRenderChangePicture (xdisplay, grad, CPRepeat, &attrib); XRenderComposite (xdisplay, gop, grad, None, dst, 0, 0, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderFreePicture (xdisplay, grad); } else { XRenderFillRectangle (xdisplay, gop, dst, &color[1], x1, y1, x2 - x1, y2 - y1); } } if (!ignore_src_alpha) { if (layout->rotation) { XTransform t = { { { 0, 1 << 16, 0 }, { 1 << 16, 0, 0 }, { 0, 0, 1 << 16 } } }; t.matrix[0][2] = xSrc << 16; t.matrix[1][2] = ySrc << 16; XRenderSetPictureTransform (xdisplay, src, &t); XRenderComposite (xdisplay, op, src, None, dst, 0, 0, 0, 0, x1, y1, x2 - x1, y2 - y1); XRenderSetPictureTransform (xdisplay, src, &xident); } else { XRenderComposite (xdisplay, op, src, None, dst, xSrc, ySrc, 0, 0, x1, y1, x2 - x1, y2 - y1); } } set_no_picture_clip (xdisplay, dst); } void decor_blend_border_picture (Display *xdisplay, decor_context_t *context, Picture src, int xSrc, int ySrc, Picture dst, decor_layout_t *layout, unsigned int border, Region region, unsigned short alpha, int shade_alpha, int ignore_src_alpha) { int left, right, bottom, top; int x1, y1, x2, y2; left = context->extents.left; right = context->extents.right; top = context->extents.top; bottom = context->extents.bottom; switch (border) { case BORDER_TOP: x1 = layout->top.x1 + context->left_space - left; y1 = layout->top.y1 + context->top_space - top; x2 = layout->top.x2 - context->right_space + right; y2 = layout->top.y2; _decor_blend_horz_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, top, -1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->top); break; case BORDER_BOTTOM: x1 = layout->bottom.x1 + context->left_space - left; y1 = layout->bottom.y1; x2 = layout->bottom.x2 - context->right_space + right; y2 = layout->bottom.y1 + bottom; _decor_blend_horz_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, bottom, 1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->bottom); break; case BORDER_LEFT: x1 = layout->left.x1; y1 = layout->left.y1; x2 = layout->left.x2; y2 = layout->left.y2; if (layout->rotation) y1 += context->left_space - context->extents.left; else x1 += context->left_space - context->extents.left; _decor_blend_vert_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, 1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->left); break; case BORDER_RIGHT: x1 = layout->right.x1; y1 = layout->right.y1; x2 = layout->right.x2; y2 = layout->right.y2; if (layout->rotation) y2 -= context->right_space - context->extents.right; else x2 -= context->right_space - context->extents.right; _decor_blend_vert_border_picture (xdisplay, context, src, xSrc, ySrc, dst, layout, region, alpha, shade_alpha, x1, y1, x2, y2, -1, ignore_src_alpha); _decor_pad_border_picture (xdisplay, dst, &layout->right); break; default: break; } } int decor_post_pending (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { XEvent event; Atom decor_pending = XInternAtom (xdisplay, DECOR_PIXMAP_PENDING_ATOM_NAME, FALSE); /* Send a client message indicating that a new * decoration can be generated for this window */ event.xclient.type = ClientMessage; event.xclient.window = client; event.xclient.message_type = decor_pending; event.xclient.format = 32; event.xclient.data.l[0] = frame_type; event.xclient.data.l[1] = frame_state; event.xclient.data.l[2] = frame_actions; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, DefaultRootWindow (xdisplay), 0, StructureNotifyMask, &event); return 1; } int decor_post_generate_request (Display *xdisplay, Window client, unsigned int frame_type, unsigned int frame_state, unsigned int frame_actions) { XEvent event; Atom decor_request = XInternAtom (xdisplay, DECOR_REQUEST_PIXMAP_ATOM_NAME, FALSE); /* Send a client message indicating that a new * decoration can be generated for this window */ event.xclient.type = ClientMessage; event.xclient.window = client; event.xclient.message_type = decor_request; event.xclient.format = 32; event.xclient.data.l[0] = frame_type; event.xclient.data.l[1] = frame_state; event.xclient.data.l[2] = frame_actions; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, DefaultRootWindow (xdisplay), 0, StructureNotifyMask, &event); return 1; } int decor_post_delete_pixmap (Display *xdisplay, Window window, Pixmap pixmap) { XEvent event; Atom decor_delete_pixmap = XInternAtom (xdisplay, DECOR_DELETE_PIXMAP_ATOM_NAME, FALSE); /* Send a client message indicating that this * pixmap is no longer in use and can be removed */ event.xclient.type = ClientMessage; event.xclient.window = window; event.xclient.message_type = decor_delete_pixmap; event.xclient.format = 32; event.xclient.data.l[0] = pixmap; event.xclient.data.l[1] = 0; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, DefaultRootWindow (xdisplay), 0, StructureNotifyMask, &event); return 1; } int decor_acquire_dm_session (Display *xdisplay, int screen, const char *name, int replace_current_dm, Time *timestamp) { XEvent event; XSetWindowAttributes attr; Window current_dm_sn_owner, new_dm_sn_owner; Atom dm_sn_atom; Atom manager_atom; Atom dm_name_atom; Atom utf8_string_atom; Time dm_sn_timestamp; char buf[128]; manager_atom = XInternAtom (xdisplay, "MANAGER", FALSE); dm_name_atom = XInternAtom (xdisplay, "_COMPIZ_DM_NAME", 0); utf8_string_atom = XInternAtom (xdisplay, "UTF8_STRING", 0); snprintf (buf, 128, "_COMPIZ_DM_S%d", screen); dm_sn_atom = XInternAtom (xdisplay, buf, 0); current_dm_sn_owner = XGetSelectionOwner (xdisplay, dm_sn_atom); if (current_dm_sn_owner != None) { if (!replace_current_dm) return DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING; XSelectInput (xdisplay, current_dm_sn_owner, StructureNotifyMask); } attr.override_redirect = TRUE; attr.event_mask = PropertyChangeMask; new_dm_sn_owner = XCreateWindow (xdisplay, XRootWindow (xdisplay, screen), -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); XChangeProperty (xdisplay, new_dm_sn_owner, dm_name_atom, utf8_string_atom, 8, PropModeReplace, (unsigned char *) name, strlen (name)); XWindowEvent (xdisplay, new_dm_sn_owner, PropertyChangeMask, &event); dm_sn_timestamp = event.xproperty.time; XSetSelectionOwner (xdisplay, dm_sn_atom, new_dm_sn_owner, dm_sn_timestamp); if (XGetSelectionOwner (xdisplay, dm_sn_atom) != new_dm_sn_owner) { XDestroyWindow (xdisplay, new_dm_sn_owner); return DECOR_ACQUIRE_STATUS_FAILED; } /* Send client message indicating that we are now the DM */ event.xclient.type = ClientMessage; event.xclient.window = XRootWindow (xdisplay, screen); event.xclient.message_type = manager_atom; event.xclient.format = 32; event.xclient.data.l[0] = dm_sn_timestamp; event.xclient.data.l[1] = dm_sn_atom; event.xclient.data.l[2] = 0; event.xclient.data.l[3] = 0; event.xclient.data.l[4] = 0; XSendEvent (xdisplay, XRootWindow (xdisplay, screen), 0, StructureNotifyMask, &event); /* Wait for old decoration manager to go away */ if (current_dm_sn_owner != None) { do { XWindowEvent (xdisplay, current_dm_sn_owner, StructureNotifyMask, &event); } while (event.type != DestroyNotify); } *timestamp = dm_sn_timestamp; return DECOR_ACQUIRE_STATUS_SUCCESS; } void decor_set_dm_check_hint (Display *xdisplay, int screen, int supports) { XSetWindowAttributes attrs; unsigned long data; Window xroot; Atom atom; Atom type_pixmap_atom; Atom type_window_atom; Atom type_supported_atom; Atom supported_deco_atoms[2]; int i; type_supported_atom = XInternAtom (xdisplay, DECOR_TYPE_ATOM_NAME, 0); type_pixmap_atom = XInternAtom (xdisplay, DECOR_TYPE_PIXMAP_ATOM_NAME, 0); type_window_atom = XInternAtom (xdisplay, DECOR_TYPE_WINDOW_ATOM_NAME, 0); if (!supports) return; attrs.override_redirect = 1; attrs.event_mask = PropertyChangeMask; xroot = RootWindow (xdisplay, screen); data = XCreateWindow (xdisplay, xroot, -100, -100, 1, 1, 0, CopyFromParent, CopyFromParent, (Visual *) CopyFromParent, CWOverrideRedirect | CWEventMask, &attrs); i = 0; if (supports & WINDOW_DECORATION_TYPE_PIXMAP) { supported_deco_atoms[i] = type_pixmap_atom; ++i; } if (supports & WINDOW_DECORATION_TYPE_WINDOW) { supported_deco_atoms[i] = type_window_atom; ++i; } XChangeProperty (xdisplay, data, type_supported_atom, XA_ATOM, 32, PropModeReplace, (unsigned char *) supported_deco_atoms, i); atom = XInternAtom (xdisplay, DECOR_SUPPORTING_DM_CHECK_ATOM_NAME, 0); XChangeProperty (xdisplay, xroot, atom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &data, 1); } /* from fvwm2, Copyright Matthias Clasen, Dominik Vogt */ static int convert_property (Display *xdisplay, Window w, Atom target, Atom property, Time dm_sn_timestamp) { static const unsigned short N_TARGETS = 4; Atom conversion_targets[N_TARGETS]; conversion_targets[0] = XInternAtom (xdisplay, "TARGETS", 0); conversion_targets[1] = XInternAtom (xdisplay, "MULTIPLE", 0); conversion_targets[2] = XInternAtom (xdisplay, "TIMESTAMP", 0); conversion_targets[3] = XInternAtom (xdisplay, "VERSION", 0); if (target == conversion_targets[0]) XChangeProperty (xdisplay, w, property, XA_ATOM, 32, PropModeReplace, (unsigned char *) conversion_targets, N_TARGETS); else if (target == conversion_targets[2]) XChangeProperty (xdisplay, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) &dm_sn_timestamp, 1); else if (target == conversion_targets[3]) { long icccm_version[] = { 2, 0 }; XChangeProperty (xdisplay, w, property, XA_INTEGER, 32, PropModeReplace, (unsigned char *) icccm_version, 2); } else return 0; /* Be sure the PropertyNotify has arrived so we * can send SelectionNotify */ XSync (xdisplay, 0); return 1; } void decor_handle_selection_request (Display *xdisplay, XEvent *event, Time timestamp) { XSelectionEvent reply; Atom multiple_atom; Atom atom_pair_atom; reply.type = SelectionNotify; reply.display = xdisplay; reply.requestor = event->xselectionrequest.requestor; reply.selection = event->xselectionrequest.selection; reply.target = event->xselectionrequest.target; reply.property = None; reply.time = event->xselectionrequest.time; multiple_atom = XInternAtom (xdisplay, "MULTIPLE", 0); atom_pair_atom = XInternAtom (xdisplay, "ATOM_PAIR", 0); if (event->xselectionrequest.target == multiple_atom) { if (event->xselectionrequest.property != None) { Atom type, *adata; int i, format; unsigned long num, rest; unsigned char *data; if (XGetWindowProperty (xdisplay, event->xselectionrequest.requestor, event->xselectionrequest.property, 0, 256, FALSE, atom_pair_atom, &type, &format, &num, &rest, &data) != Success) return; /* FIXME: to be 100% correct, should deal with rest > 0, * but since we have 4 possible targets, we will hardly ever * meet multiple requests with a length > 8 */ adata = (Atom *) data; i = 0; while (i < (int) num) { if (!convert_property (xdisplay, event->xselectionrequest.requestor, adata[i], adata[i + 1], timestamp)) adata[i + 1] = None; i += 2; } XChangeProperty (xdisplay, event->xselectionrequest.requestor, event->xselectionrequest.property, atom_pair_atom, 32, PropModeReplace, data, num); } } else { if (event->xselectionrequest.property == None) event->xselectionrequest.property = event->xselectionrequest.target; if (convert_property (xdisplay, event->xselectionrequest.requestor, event->xselectionrequest.target, event->xselectionrequest.property, timestamp)) reply.property = event->xselectionrequest.property; } XSendEvent (xdisplay, event->xselectionrequest.requestor, FALSE, 0L, (XEvent *) &reply); } int decor_handle_selection_clear (Display *xdisplay, XEvent *xevent, int screen) { Atom dm_sn_atom; char buf[128]; snprintf (buf, 128, "_COMPIZ_DM_S%d", screen); dm_sn_atom = XInternAtom (xdisplay, buf, 0); if (xevent->xselectionclear.selection == dm_sn_atom) return DECOR_SELECTION_GIVE_UP; return DECOR_SELECTION_KEEP; } ./libdecoration/libdecoration.pc.in0000644000004100000410000000044613246301623017634 0ustar www-datawww-dataprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libdecoration Description: Window decoration library Version: @VERSION@ Requires: @DECORATION_REQUIRES@ Libs: @DECORATION_LIBS@ -L${libdir} -ldecoration Cflags: @DECORATION_CFLAGS@ -I${includedir}/compiz ./libdecoration/config.h.libdecoration.in0000644000004100000410000000021413246301623020716 0ustar www-datawww-data/* Define to 1 if xrender version >= 0.9.3 */ #cmakedefine HAVE_XRENDER_0_9_3 1 #define DECOR_INTERFACE_VERSION ${DECOR_INTERFACE_VERSION} ./postinst/0000755000004100000410000000000013246301623013126 5ustar www-datawww-data./postinst/CMakeLists.txt0000644000004100000410000000057013246301623015670 0ustar www-datawww-data# Allow setting the recompile rule again set_property (GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE FALSE) set_property (GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE FALSE) compiz_add_install_recompile_gsettings_schemas (${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas) add_all_gsettings_schemas_to_local_recompilation_rule () ./postinst/convert-files/0000755000004100000410000000000013246301623015706 5ustar www-datawww-data./postinst/convert-files/compiz-profile-Default.convert0000644000004100000410000002300413246301623023630 0ustar www-datawww-data[org.compiz.core:/org/compiz/profiles/Default/plugins/core/] active-plugins = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/active_plugins vsize = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/vsize hsize = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/vsize close-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/close_window_button close-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/close_window_key lower-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/lower_window_button lower-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/lower_window_key maximize-window-horizontally-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/maximize_window_horizontally_key maximize-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/maximize_window_key maximize-window-vertically-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/maximize_window_vertically_key minimize-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/minimize_window_button minimize-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/minimize_window_key raise-window-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/raise_window_button raise-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/raise_window_key show-desktop-edge = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/show_desktop_edge show-desktop-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/show_desktop_key toggle-window-maximized-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_button toggle-window-maximized-horizontally-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_horizontally_key toggle-window-maximized-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_key toggle-window-maximized-vertically-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_maximized_vertically_key toggle-window-shaded-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/toggle_window_shaded_key unmaximize-window-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/unmaximize_window_key window-menu-button = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/window_menu_button window-menu-key = /apps/compizconfig-1/profiles/Default/plugins/core/screen0/options/window_menu_key [org.compiz.composite:/org/compiz/profiles/Default/plugins/composite/] detect-refresh-rate = /apps/compizconfig-1/profiles/Default/plugins/composite/screen0/options/detect_refresh_rate refresh-rate = /apps/compizconfig-1/profiles/Default/plugins/composite/screen0/options/refresh_rate [org.compiz.opengl:/org/compiz/profiles/Default/plugins/opengl/] lighting = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/lighting sync-to-vblank = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/sync_to_vblank texture-compression = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/texture_compression texture-filter = /apps/compizconfig-1/profiles/Default/plugins/opengl/screen0/options/texture_filter [org.compiz.wall:/org/compiz/profiles/Default/plugins/wall/] down-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/down_button down-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/down_button down-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/down_button edgeflip-dnd = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edgeflip_dnd edgeflip-move = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edgeflip_move edgeflip-pointer = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edgeflip_pointer edge-radius = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/edge_radius flip-down-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_down_edge flip-left-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_left_edge flip-right-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_right_edge flip-up-edge = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/flip_up_edge left-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/left_button left-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/left_key left-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/left_window_key next-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/next_button next-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/next_key prev-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/prev_button prev-key =/apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/prev_key right-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/right_button right-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/right_key right-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/right_window_key up-button = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/up_button up-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/up_key up-window-key = /apps/compizconfig-1/profiles/Default/plugins/wall/screen0/options/up_window_key [org.compiz.expo:/org/compiz/profiles/Default/plugins/expo/] exit-button = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/exit_button expo-edge = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/expo_edge expo-key = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/expo_key expo-immediate-move = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/expo_immediate_move next-vp-button = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/next_vp_button prev-vp-button = /apps/compizconfig-1/profiles/Default/plugins/expo/screen0/options/prev_vp_button [org.compiz.move:/org/compiz/profiles/Default/plugins/move/] initiate-button = /apps/compizconfig-1/profiles/Default/plugins/move/screen0/options/initiate_button initiate-key = /apps/compizconfig-1/profiles/Default/plugins/move/screen0/options/initiate_key [org.compiz.grid:/org/compiz/profiles/Default/plugins/grid/] bottom-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_edge_action bottom-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_edge_threshold bottom-left-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_left_corner_action bottom-right-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/bottom_right_corner_action draw-indicator = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/draw_indicator fill-color = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/fill_color left-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/left_edge_action left-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/left_edge_threshold outline-color = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/outline_color put-bottom-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_bottom_key put-bottomleft-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_bottomleft_key put-bottomright-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_bottomright_key put-center-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_center_key put-left-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_left_key put-maximize-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_maximize_key put-restore-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_restore_key put-right-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_right_key put-top-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_top_key put-topleft-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_topleft_key put-topright-key = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/put_topright_key right-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/right_edge_action right-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/right_edge_threshold snapback-windows = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/snapback_windows snapoff-maximized = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/snapoff_maximized top-edge-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_edge_action top-edge-threshold = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_edge_threshold top-left-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_left_corner_action top-right-corner-action = /apps/compizconfig-1/profiles/Default/plugins/grid/screen0/options/top_right_corner_action ./postinst/convert-files/compiz-profile-active-Default.convert0000644000004100000410000001675613246301623025121 0ustar www-datawww-data[org.compiz.core:/org/compiz/profiles/Default/plugins/core/] active-plugins = /apps/compiz-1/plugins/core/screen0/options/active_plugins vsize = /apps/compiz-1/plugins/core/screen0/options/vsize hsize = /apps/compiz-1/plugins/core/screen0/options/vsize close-window-button = /apps/compiz-1/plugins/core/screen0/options/close_window_button close-window-key = /apps/compiz-1/plugins/core/screen0/options/close_window_key lower-window-button = /apps/compiz-1/plugins/core/screen0/options/lower_window_button lower-window-key = /apps/compiz-1/plugins/core/screen0/options/lower_window_key maximize-window-horizontally-key = /apps/compiz-1/plugins/core/screen0/options/maximize_window_horizontally_key maximize-window-key = /apps/compiz-1/plugins/core/screen0/options/maximize_window_key maximize-window-vertically-key = /apps/compiz-1/plugins/core/screen0/options/maximize_window_vertically_key minimize-window-button = /apps/compiz-1/plugins/core/screen0/options/minimize_window_button minimize-window-key = /apps/compiz-1/plugins/core/screen0/options/minimize_window_key raise-window-button = /apps/compiz-1/plugins/core/screen0/options/raise_window_button raise-window-key = /apps/compiz-1/plugins/core/screen0/options/raise_window_key show-desktop-edge = /apps/compiz-1/plugins/core/screen0/options/show_desktop_edge show-desktop-key = /apps/compiz-1/plugins/core/screen0/options/show_desktop_key toggle-window-maximized-button = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_button toggle-window-maximized-horizontally-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_horizontally_key toggle-window-maximized-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_key toggle-window-maximized-vertically-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_maximized_vertically_key toggle-window-shaded-key = /apps/compiz-1/plugins/core/screen0/options/toggle_window_shaded_key unmaximize-window-key = /apps/compiz-1/plugins/core/screen0/options/unmaximize_window_key window-menu-button = /apps/compiz-1/plugins/core/screen0/options/window_menu_button window-menu-key = /apps/compiz-1/plugins/core/screen0/options/window_menu_key [org.compiz.composite:/org/compiz/profiles/Default/plugins/composite/] detect-refresh-rate = /apps/compiz-1/plugins/composite/screen0/options/detect_refresh_rate refresh-rate = /apps/compiz-1/plugins/composite/screen0/options/refresh_rate [org.compiz.opengl:/org/compiz/profiles/Default/plugins/opengl/] lighting = /apps/compiz-1/plugins/opengl/screen0/options/lighting sync-to-vblank = /apps/compiz-1/plugins/opengl/screen0/options/sync_to_vblank texture-compression = /apps/compiz-1/plugins/opengl/screen0/options/texture_compression texture-filter = /apps/compiz-1/plugins/opengl/screen0/options/texture_filter [org.compiz.wall:/org/compiz/profiles/Default/plugins/wall/] down-button = /apps/compiz-1/plugins/wall/screen0/options/down_button down-key = /apps/compiz-1/plugins/wall/screen0/options/down_button down-window-key = /apps/compiz-1/plugins/wall/screen0/options/down_button edgeflip-dnd = /apps/compiz-1/plugins/wall/screen0/options/edgeflip_dnd edgeflip-move = /apps/compiz-1/plugins/wall/screen0/options/edgeflip_move edgeflip-pointer = /apps/compiz-1/plugins/wall/screen0/options/edgeflip_pointer edge-radius = /apps/compiz-1/plugins/wall/screen0/options/edge_radius flip-down-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_down_edge flip-left-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_left_edge flip-right-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_right_edge flip-up-edge = /apps/compiz-1/plugins/wall/screen0/options/flip_up_edge left-button = /apps/compiz-1/plugins/wall/screen0/options/left_button left-key = /apps/compiz-1/plugins/wall/screen0/options/left_key left-window-key = /apps/compiz-1/plugins/wall/screen0/options/left_window_key next-button = /apps/compiz-1/plugins/wall/screen0/options/next_button next-key = /apps/compiz-1/plugins/wall/screen0/options/next_key prev-button = /apps/compiz-1/plugins/wall/screen0/options/prev_button prev-key =/apps/compiz-1/plugins/wall/screen0/options/prev_key right-button = /apps/compiz-1/plugins/wall/screen0/options/right_button right-key = /apps/compiz-1/plugins/wall/screen0/options/right_key right-window-key = /apps/compiz-1/plugins/wall/screen0/options/right_window_key up-button = /apps/compiz-1/plugins/wall/screen0/options/up_button up-key = /apps/compiz-1/plugins/wall/screen0/options/up_key up-window-key = /apps/compiz-1/plugins/wall/screen0/options/up_window_key [org.compiz.expo:/org/compiz/profiles/Default/plugins/expo/] exit-button = /apps/compiz-1/plugins/expo/screen0/options/exit_button expo-edge = /apps/compiz-1/plugins/expo/screen0/options/expo_edge expo-key = /apps/compiz-1/plugins/expo/screen0/options/expo_key expo-immediate-move = /apps/compiz-1/plugins/expo/screen0/options/expo_immediate_move next-vp-button = /apps/compiz-1/plugins/expo/screen0/options/next_vp_button prev-vp-button = /apps/compiz-1/plugins/expo/screen0/options/prev_vp_button [org.compiz.move:/org/compiz/profiles/Default/plugins/move/] initiate-button = /apps/compiz-1/plugins/move/screen0/options/initiate_button initiate-key = /apps/compiz-1/plugins/move/screen0/options/initiate_key [org.compiz.grid:/org/compiz/profiles/Default/plugins/grid/] bottom-edge-action = /apps/compiz-1/plugins/grid/screen0/options/bottom_edge_action bottom-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/bottom_edge_threshold bottom-left-corner-action = /apps/compiz-1/plugins/grid/screen0/options/bottom_left_corner_action bottom-right-corner-action = /apps/compiz-1/plugins/grid/screen0/options/bottom_right_corner_action draw-indicator = /apps/compiz-1/plugins/grid/screen0/options/draw_indicator fill-color = /apps/compiz-1/plugins/grid/screen0/options/fill_color left-edge-action = /apps/compiz-1/plugins/grid/screen0/options/left_edge_action left-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/left_edge_threshold outline-color = /apps/compiz-1/plugins/grid/screen0/options/outline_color put-bottom-key = /apps/compiz-1/plugins/grid/screen0/options/put_bottom_key put-bottomleft-key = /apps/compiz-1/plugins/grid/screen0/options/put_bottomleft_key put-bottomright-key = /apps/compiz-1/plugins/grid/screen0/options/put_bottomright_key put-center-key = /apps/compiz-1/plugins/grid/screen0/options/put_center_key put-left-key = /apps/compiz-1/plugins/grid/screen0/options/put_left_key put-maximize-key = /apps/compiz-1/plugins/grid/screen0/options/put_maximize_key put-restore-key = /apps/compiz-1/plugins/grid/screen0/options/put_restore_key put-right-key = /apps/compiz-1/plugins/grid/screen0/options/put_right_key put-top-key = /apps/compiz-1/plugins/grid/screen0/options/put_top_key put-topleft-key = /apps/compiz-1/plugins/grid/screen0/options/put_topleft_key put-topright-key = /apps/compiz-1/plugins/grid/screen0/options/put_topright_key right-edge-action = /apps/compiz-1/plugins/grid/screen0/options/right_edge_action right-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/right_edge_threshold snapback-windows = /apps/compiz-1/plugins/grid/screen0/options/snapback_windows snapoff-maximized = /apps/compiz-1/plugins/grid/screen0/options/snapoff_maximized top-edge-action = /apps/compiz-1/plugins/grid/screen0/options/top_edge_action top-edge-threshold = /apps/compiz-1/plugins/grid/screen0/options/top_edge_threshold top-left-corner-action = /apps/compiz-1/plugins/grid/screen0/options/top_left_corner_action top-right-corner-action = /apps/compiz-1/plugins/grid/screen0/options/top_right_corner_action ./postinst/convert-files/compiz-profile-independent-keys.convert0000644000004100000410000000710013246301623025511 0ustar www-datawww-data[org.gnome.desktop.wm.keybindings] move-to-workspace-1 = /apps/metacity/window_keybindings/move_to_workspace_1 move-to-workspace-2 = /apps/metacity/window_keybindings/move_to_workspace_2 move-to-workspace-3 = /apps/metacity/window_keybindings/move_to_workspace_3 move-to-workspace-4 = /apps/metacity/window_keybindings/move_to_workspace_4 move-to-workspace-5 = /apps/metacity/window_keybindings/move_to_workspace_5 move-to-workspace-6 = /apps/metacity/window_keybindings/move_to_workspace_6 move-to-workspace-7 = /apps/metacity/window_keybindings/move_to_workspace_7 move-to-workspace-8 = /apps/metacity/window_keybindings/move_to_workspace_8 move-to-workspace-9 = /apps/metacity/window_keybindings/move_to_workspace_9 move-to-workspace-10 = /apps/metacity/window_keybindings/move_to_workspace_10 move-to-workspace-11 = /apps/metacity/window_keybindings/move_to_workspace_11 move-to-workspace-12 = /apps/metacity/window_keybindings/move_to_workspace_12 move-to-workspace-left = /apps/metacity/window_keybindings/move_to_workspace_left move-to-workspace-right = /apps/metacity/window_keybindings/move_to_workspace_right move-to-workspace-up = /apps/metacity/window_keybindings/move_to_workspace_up move-to-workspace-down = /apps/metacity/window_keybindings/move_to_workspace_down switch-windows = /apps/metacity/global_keybindings/switch_windows switch-group = /apps/metacity/global_keybindings/switch_group show-desktop = /apps/metacity/global_keybindings/show_desktop switch-to-workspace-1 = /apps/metacity/global_keybindings/switch_to_workspace_1 switch-to-workspace-2 = /apps/metacity/global_keybindings/switch_to_workspace_2 switch-to-workspace-3 = /apps/metacity/global_keybindings/switch_to_workspace_3 switch-to-workspace-4 = /apps/metacity/global_keybindings/switch_to_workspace_4 switch-to-workspace-5 = /apps/metacity/global_keybindings/switch_to_workspace_5 switch-to-workspace-6 = /apps/metacity/global_keybindings/switch_to_workspace_6 switch-to-workspace-7 = /apps/metacity/global_keybindings/switch_to_workspace_7 switch-to-workspace-8 = /apps/metacity/global_keybindings/switch_to_workspace_8 switch-to-workspace-9 = /apps/metacity/global_keybindings/switch_to_workspace_9 switch-to-workspace-10 = /apps/metacity/global_keybindings/switch_to_workspace_10 switch-to-workspace-11 = /apps/metacity/global_keybindings/switch_to_workspace_11 switch-to-workspace-12 = /apps/metacity/global_keybindings/switch_to_workspace_12 switch-to-workspace-left = /apps/metacity/global_keybindings/switch_to_workspace_left switch-to-workspace-right = /apps/metacity/global_keybindings/switch_to_workspace_right switch-to-workspace-up = /apps/metacity/global_keybindings/switch_to_workspace_up switch-to-workspace-down = /apps/metacity/global_keybindings/switch_to_workspace_down activate-window-menu = /apps/metacity/window_keybindings/activate_window_menu toggle-fullscreen = /apps/metacity/window_keybindings/toggle_fullscreen toggle-maximized = /apps/metacity/window_keybindings/toggle_maximized maximize = /apps/metacity/window_keybindings/maximize unmaximize = /apps/metacity/window_keybindings/unmaximize toggle-shaded = /apps/metacity/window_keybindings/toggle_shaded close = /apps/metacity/window_keybindings/close minimize = /apps/metacity/window_keybindings/minimize begin-move = /apps/metacity/window_keybindings/begin_move begin-resize = /apps/metacity/window_keybindings/begin_resize raise = /apps/metacity/window_keybindings/raise lower = /apps/metacity/window_keybindings/lower maximize-vertically = /apps/metacity/window_keybindings/maximize_vertically maximize-horizontally = /apps/metacity/window_keybindings/maximize_horizontally ./kde/0000755000004100000410000000000013246301623012006 5ustar www-datawww-data./kde/CMakeLists.txt0000644000004100000410000000005013246301623014541 0ustar www-datawww-dataadd_subdirectory (window-decorator-kde4)./kde/window-decorator-kde4/0000755000004100000410000000000013246301623016122 5ustar www-datawww-data./kde/window-decorator-kde4/CMakeLists.txt0000644000004100000410000000314113246301623020661 0ustar www-datawww-dataproject (kde4-window-decorator) option (BUILD_KDE4 "Build KDE 4 window decorator" 1) compiz_set (USE_KDE4 ${BUILD_KDE4}) if (USE_KDE4) find_package(KDE4 4.3.0) find_package(KDE4Workspace) if (KDE4_FOUND AND KDE4Workspace_FOUND) include(KDE4Defaults) include(FindPkgConfig) include(MacroLibrary) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter") add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) qt4_add_dbus_adaptor (kwd4_SRCS org.kde.KWin.xml decorator.h KWD::Decorator kwinadaptor) pkg_check_modules (KWD4 REQUIRED xdamage xrender xcomposite xext) link_directories( ${KWD4_LIBRARY_DIRS} ) include_directories ( ${compiz_SOURCE_DIR}/include ${KWD4_INCLUDE_DIRS} ${KDE4_INCLUDES} ${KDE4_INCLUDE_DIR} ${KDE4_PLASMA_INCLUDE_DIR} ${QT_INCLUDES} ) set (kwd4_SRCS main.cpp utils.cpp decorator.cpp window.cpp options.cpp kdecoration_plugins.cpp switcher.cpp paintredirector.cpp ${kwd4_SRCS} ) kde4_add_executable ( kde4-window-decorator ${kwd4_SRCS} ) set_target_properties ( kde4-window-decorator PROPERTIES INSTALL_RPATH_USE_LINK_PATH 0 ) target_link_libraries ( kde4-window-decorator decoration ${KWD4_LIBRARIES} ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} ${KDE4_PLASMA_LIBS} kdecorations ) install ( TARGETS kde4-window-decorator DESTINATION ${exec_prefix} ) else (KDE4_FOUND AND KDE4Workspace_FOUND) compiz_set (USE_KDE4 0) endif (KDE4_FOUND AND KDE4Workspace_FOUND) endif (USE_KDE4) ./kde/window-decorator-kde4/window.cpp0000644000004100000410000014631013246301623020142 0ustar www-datawww-data/* * Copyright © 2009 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include "window.h" #include "decorator.h" #include "options.h" #include "utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "paintredirector.h" static const char *KDED_SERVICE = "org.kde.kded"; static const char *KDED_APPMENU_PATH = "/modules/appmenu"; static const char *KDED_INTERFACE = "org.kde.kded"; KWD::Window::Window (WId parentId, WId clientId, WId frame, Type type, QRect geometry) : mType (type), mParentId (parentId), mFrame (0), mClientId (clientId), mSelectedId (0), mDecor (0), mPixmap (0), mUpdateProperty (false), mShapeSet (false), mPopup (0), mAdvancedMenu (0), mOpacityMenu (0), mDesktopMenu (0), mAppMenuAvailable (false), mProcessKiller (this), mKeys (this), mResizeOpAction (0), mMoveOpAction (0), mMaximizeOpAction (0), mShadeOpAction (0), mKeepAboveOpAction (0), mKeepBelowOpAction (0), mFullScreenOpAction (0), mMinimizeOpAction (0), mCloseOpAction (0), mDesktopOpAction (0), mPaintRedirector (0) { memset (&mBorder, 0, sizeof (mBorder)); if (mType == Normal || mType == Normal2D) { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMState | NET::WMVisibleName, 0); mState = wInfo.state (); if (mType == Normal || mType == Normal2D) { mName = wInfo.visibleName (); mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::NETWM | KWindowSystem::WMHints ); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::NETWM | KWindowSystem::WMHints ); if (mIcon.isNull ()) { mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); } mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity, 0xffff); } else { mIcon = QPixmap (); mMiniIcon = QPixmap (); mName = QString (""); } updateFrame (frame); mGeometry = geometry; getWindowProtocols (); } else { mIcon = QPixmap (); mMiniIcon = QPixmap (); mName = QString (""); mGeometry = QRect (50, 50, 30, 1); } createDecoration (); mActiveChild = NULL; } KWD::Window::~Window (void) { if (mPixmap) XFreePixmap (QX11Info::display(), mPixmap); if (mDecor) delete mDecor; if (mPopup) delete mPopup; if (mPaintRedirector) delete mPaintRedirector; if (mProcessKiller.state () == QProcess::Running) { mProcessKiller.terminate (); mProcessKiller.waitForFinished (10000); if (mProcessKiller.state () == QProcess::Running) { mProcessKiller.kill (); mProcessKiller.waitForFinished (5000); } } } bool KWD::Window::isActive (void) const { if (mType == DefaultActive) return true; else if (mType == Default) return false; return Decorator::activeId () == mClientId; } bool KWD::Window::isCloseable (void) const { KWindowInfo wInfo; if (mType != Normal && mType != Normal2D) return false; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionClose); } bool KWD::Window::isMaximizable (void) const { KWindowInfo wInfo; if (mType != Normal && mType != Normal2D) return false; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionMax); } #if KDE_IS_VERSION(4,10,90) KDecoration::QuickTileMode KWD::Window::quickTileMode (void) const { return QuickTileNone; } #endif KDecoration::MaximizeMode KWD::Window::maximizeMode (void) const { MaximizeMode mode = MaximizeRestore; if (mType != Normal && mType != Normal2D) return mode; mode = ((mState & NET::MaxVert) ? MaximizeVertical : MaximizeRestore) | ((mState & NET::MaxHoriz) ? MaximizeHorizontal : MaximizeRestore); return mode; } bool KWD::Window::isMinimizable (void) const { KWindowInfo wInfo; if (mType != Normal && mType != Normal2D) return false; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionMinimize); } bool KWD::Window::providesContextHelp (void) const { if (mType != Normal && mType != Normal2D) return false; return mSupportContextHelp; } int KWD::Window::desktop (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMDesktop, 0); return wInfo.desktop (); } bool KWD::Window::isModal (void) const { return mState & NET::Modal; } bool KWD::Window::isShadeable (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionShade); } bool KWD::Window::isShade (void) const { if (mType != Normal && mType != Normal2D) return false; return (mState & NET::Shaded); } bool KWD::Window::isSetShade (void) const { return isShade (); } bool KWD::Window::keepAbove (void) const { if (mType != Normal && mType != Normal2D) return false; return (mState & NET::KeepAbove); } bool KWD::Window::keepBelow (void) const { if (mType != Normal && mType != Normal2D) return false; return (mState & NET::KeepBelow); } bool KWD::Window::isMovable (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionMove); } NET::WindowType KWD::Window::windowType (unsigned long mask) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMWindowType, 0); return wInfo.windowType (mask); } bool KWD::Window::isResizable (void) const { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions); return wInfo.actionSupported (NET::ActionResize); } QIcon KWD::Window::icon (void) const { QIcon icon (mIcon); icon.addPixmap (mMiniIcon); return icon; } QIcon KWD::Window::icon (int idx) const { return icon (); } QString KWD::Window::caption (void) const { return mName; } QString KWD::Window::caption (int idx) const { return caption (); } int KWD::Window::tabCount () const { return 1; } long KWD::Window::tabId (int idx) const { return 0; } long KWD::Window::currentTabId () const { return 0; } void KWD::Window::setCurrentTab (long id) { } void KWD::Window::tab_A_before_B (long A, long B) { } void KWD::Window::tab_A_behind_B (long A, long B) { } void KWD::Window::untab (long id, const QRect& newGeom) { } void KWD::Window::closeTab (long id) { } void KWD::Window::closeTabGroup () { } /* TODO: We should use libtaskmanager, which is part of kdebase to create the window menu instead but the headers for that library are currently not installed. If kdebase could install those headers, we wouldn't have to have our own window menu implementaion here. */ void KWD::Window::showWindowMenu (const QPoint &pos) { if (!mPopup) { QAction *action; const int levels[] = { 100, 90, 75, 50, 25, 10 }; mPopup = new QMenu (); mPopup->setFont (KGlobalSettings::menuFont ()); connect (mPopup, SIGNAL (aboutToShow ()), SLOT (handlePopupAboutToShow ())); connect (mPopup, SIGNAL (triggered (QAction*)), SLOT (handlePopupActivated (QAction*))); mAdvancedMenu = new QMenu (mPopup); mAdvancedMenu->setFont (KGlobalSettings::menuFont ()); mKeepAboveOpAction = mAdvancedMenu->addAction (i18n ("Keep &Above Others")); mKeepAboveOpAction->setIcon (KIcon ("go-up")); KAction *kaction = qobject_cast (mKeys.action ("Window Above Other Windows")); if (kaction != 0) mKeepAboveOpAction->setShortcut (kaction->globalShortcut ().primary ()); mKeepAboveOpAction->setCheckable (true); mKeepAboveOpAction->setData (KDecorationDefines::KeepAboveOp); mKeepBelowOpAction = mAdvancedMenu->addAction (i18n ("Keep &Below Others")); mKeepBelowOpAction->setIcon (KIcon ("go-down")); kaction = qobject_cast (mKeys.action ("Window Below Other Windows")); if (kaction != 0) mKeepBelowOpAction->setShortcut (kaction->globalShortcut ().primary ()); mKeepBelowOpAction->setCheckable (true); mKeepBelowOpAction->setData (KDecorationDefines::KeepBelowOp); mFullScreenOpAction = mAdvancedMenu->addAction (i18n ("&Fullscreen")); mFullScreenOpAction->setIcon (KIcon ("view-fullscreen")); kaction = qobject_cast (mKeys.action ("Window Fullscreen")); if (kaction != 0) mFullScreenOpAction->setShortcut (kaction->globalShortcut ().primary ()); mFullScreenOpAction->setCheckable (true); mFullScreenOpAction->setData (KDecorationDefines::FullScreenOp); action = mPopup->addMenu (mAdvancedMenu); action->setText (i18n ("Ad&vanced")); mOpacityMenu = new QMenu (mPopup); mOpacityMenu->setFont (KGlobalSettings::menuFont ()); connect (mOpacityMenu, SIGNAL (triggered (QAction*)), SLOT (handleOpacityPopupActivated (QAction*))); for( unsigned int i = 0; i < sizeof (levels) / sizeof (levels[0]); ++i) { action = mOpacityMenu->addAction (QString::number (levels[i]) + "%"); action->setCheckable (true); action->setData (levels[i]); } action = mPopup->addMenu (mOpacityMenu); action->setText (i18n ("&Opacity")); mDesktopMenu = new QMenu (mPopup); mDesktopMenu->setFont (KGlobalSettings::menuFont ()); connect (mDesktopMenu, SIGNAL (triggered (QAction*)), SLOT (handleDesktopPopupActivated (QAction*))); mDesktopOpAction = mPopup->addMenu (mDesktopMenu); mDesktopOpAction->setText (i18n ("To &Desktop")); mMoveOpAction = mPopup->addAction (i18n ("&Move")); mMoveOpAction->setIcon (KIcon ("move")); kaction = qobject_cast (mKeys.action ("Window Move")); if (kaction != 0) mMoveOpAction->setShortcut (kaction->globalShortcut ().primary ()); mMoveOpAction->setData (KDecorationDefines::MoveOp); mResizeOpAction = mPopup->addAction (i18n ("Re&size")); kaction = qobject_cast (mKeys.action("Window Resize")); if (kaction != 0) mResizeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mResizeOpAction->setData (KDecorationDefines::ResizeOp); mMinimizeOpAction = mPopup->addAction (i18n ("Mi&nimize")); kaction = qobject_cast (mKeys.action ("Window Minimize")); if (kaction != 0) mMinimizeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mMinimizeOpAction->setData (KDecorationDefines::MinimizeOp); mMaximizeOpAction = mPopup->addAction (i18n ("Ma&ximize")); kaction = qobject_cast (mKeys.action ("Window Maximize")); if (kaction != 0) mMaximizeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mMaximizeOpAction->setCheckable (true); mMaximizeOpAction->setData (KDecorationDefines::MaximizeOp); mShadeOpAction = mPopup->addAction (i18n ("Sh&ade")); kaction = qobject_cast (mKeys.action ("Window Shade")); if (kaction != 0) mShadeOpAction->setShortcut (kaction->globalShortcut ().primary ()); mShadeOpAction->setCheckable (true); mShadeOpAction->setData (KDecorationDefines::ShadeOp); mPopup->addSeparator (); mCloseOpAction = mPopup->addAction (i18n("&Close")); mCloseOpAction->setIcon (KIcon ("window-close" )); kaction = qobject_cast (mKeys.action("Window Close")); if (kaction != 0) mCloseOpAction->setShortcut (kaction->globalShortcut ().primary ()); mCloseOpAction->setData (KDecorationDefines::CloseOp); } QPoint pnt = mDecor->widget ()->mapFromGlobal (pos); pnt += QPoint (mGeometry.x () - mBorder.left - mPadding.left, mGeometry.y () - mBorder.top - mPadding.top); mPopup->exec (pnt); } void KWD::Window::showWindowMenu (const QPoint &pos, long id) { showWindowMenu (pos); } void KWD::Window::showWindowMenu (const QRect &pos) { showWindowMenu (pos.bottomLeft ()); } void KWD::Window::showApplicationMenu (const QPoint &p) { QPoint pnt = mDecor->widget ()->mapFromGlobal (p); pnt += QPoint (mGeometry.x () - mBorder.left - mPadding.left, mGeometry.y () - mBorder.top - mPadding.top); QList args = QList () << pnt.x () << pnt.y () << qulonglong (mClientId); QDBusMessage method = QDBusMessage::createMethodCall ( KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showMenu"); method.setArguments (args); QDBusConnection::sessionBus ().asyncCall (method); } bool KWD::Window::menuAvailable () const { return mAppMenuAvailable; } void KWD::Window::setAppMenuAvailable () { mAppMenuAvailable = true; emit appMenuAvailable (); } void KWD::Window::setAppMenuUnavailable () { mAppMenuAvailable = false; emit appMenuUnavailable (); } KWD::Options::MouseCommand KWD::Window::buttonToCommand (Qt::MouseButtons button) { Options::MouseCommand com = Options::MouseNothing; bool active = isActive (); if (!mSupportTakeFocus) active = true; switch (button) { case Qt::LeftButton: com = active ? Decorator::options ()->commandActiveTitlebar1 () : Decorator::options()->commandInactiveTitlebar1 (); break; case Qt::MidButton: com = active ? Decorator::options ()->commandActiveTitlebar2 () : Decorator::options()->commandInactiveTitlebar2 (); break; case Qt::RightButton: com = active ? Decorator::options ()->commandActiveTitlebar3 () : Decorator::options()->commandInactiveTitlebar3 (); default: break; } return com; } void KWD::Window::processMousePressEvent (QMouseEvent *qme) { Options::MouseCommand com = buttonToCommand (qme->button ()); if (qme->button () == Qt::LeftButton) { // actions where it's not possible to get the matching release event if (com != Options::MouseOperationsMenu && com != Options::MouseMinimize) { moveWindow (qme); return; } } performMouseCommand (com, qme); } void KWD::Window::performWindowOperation (WindowOperation wo) { switch (wo) { case KDecoration::MaximizeOp: maximize (maximizeMode () == KDecoration::MaximizeFull ? KDecoration::MaximizeRestore : KDecoration::MaximizeFull); break; case KDecoration::HMaximizeOp: maximize (maximizeMode () ^ KDecoration::MaximizeHorizontal); break; case KDecoration::VMaximizeOp: maximize (maximizeMode () ^ KDecoration::MaximizeVertical); break; case KDecoration::MinimizeOp: minimize (); break; case KDecoration::ShadeOp: setShade (!isShade ()); break; case KDecoration::CloseOp: closeWindow (); break; case KDecoration::KeepAboveOp: setKeepAbove (!keepAbove ()); break; case KDecoration::KeepBelowOp: setKeepBelow (!keepBelow ()); break; case KDecoration::FullScreenOp: if (mState & NET::FullScreen) KWindowSystem::clearState (mClientId, NET::FullScreen); else KWindowSystem::setState (mClientId, NET::FullScreen); break; case KDecoration::MoveOp: Decorator::rootInfo ()->moveResizeRequest (mClientId, mGeometry.x () + mGeometry.width () / 2, mGeometry.y () + mGeometry.height () / 2, NET::KeyboardMove); break; case KDecoration::ResizeOp: Decorator::rootInfo ()->moveResizeRequest (mClientId, mGeometry.x () + mGeometry.width () / 2, mGeometry.y () + mGeometry.height () / 2, NET::KeyboardSize); default: break; } } bool KWD::Window::isPreview (void) const { return false; } QRect KWD::Window::geometry (void) const { QRect rect = mGeometry; return QRect (rect.x () - ROOT_OFF_X, rect.y () - ROOT_OFF_Y, rect.width (), rect.height ()); } QRect KWD::Window::iconGeometry (void) const { return QRect (); } QRect KWD::Window::clientGeometry (void) { return mGeometry; QRect frame = geometry (); return QRect (frame.x () + mBorder.left, frame.y () + mBorder.top, frame.width () - mBorder.left - mBorder.right, frame.height () - mBorder.top - mBorder.bottom); } QRegion KWD::Window::unobscuredRegion (const QRegion & r) const { return r; } WId KWD::Window::windowId (void) const { return mClientId; } void KWD::Window::closeWindow (void) { Decorator::rootInfo ()->closeWindowRequest (mClientId); } void KWD::Window::maximize (MaximizeMode mode) { KWindowSystem::setState (mClientId, ((mode & MaximizeVertical) ? NET::MaxVert : 0) | ((mode & MaximizeHorizontal) ? NET::MaxHoriz : 0)); KWindowSystem::clearState (mClientId, ((mode & MaximizeVertical) ? 0 : NET::MaxVert) | ((mode & MaximizeHorizontal) ? 0 : NET::MaxHoriz)); } void KWD::Window::minimize (void) { KWindowSystem::minimizeWindow (mClientId, false); } void KWD::Window::showContextHelp (void) { if (mSupportContextHelp) KWD::Decorator::sendClientMessage (mClientId, mClientId, Atoms::wmProtocols, Atoms::netWmContextHelp); } void KWD::Window::titlebarDblClickOperation (void) { WindowOperation op; op = KWD::Decorator::options ()->operationTitlebarDblClick (); performWindowOperation (op); } void KWD::Window::setDesktop (int desktop) { KWindowSystem::setOnDesktop (mClientId, desktop); } void KWD::Window::setKeepBelow (bool set) { if (set) { KWindowSystem::clearState (mClientId, NET::KeepAbove); KWindowSystem::setState (mClientId, NET::KeepBelow); } else { KWindowSystem::clearState (mClientId, NET::KeepBelow); } } void KWD::Window::setKeepAbove (bool set) { if (set) { KWindowSystem::clearState (mClientId, NET::KeepBelow); KWindowSystem::setState (mClientId, NET::KeepAbove); } else { KWindowSystem::clearState (mClientId, NET::KeepAbove); } } void KWD::Window::setShade (bool set) { if (set) KWindowSystem::setState (mClientId, NET::Shaded); else KWindowSystem::clearState (mClientId, NET::Shaded); mDecor->shadeChange (); } void KWD::Window::titlebarMouseWheelOperation (int delta) { Options::MouseCommand com; com = Decorator::options()->operationTitlebarMouseWheel (delta); performMouseCommand (com, 0); } int KWD::Window::currentDesktop (void) const { return KWindowSystem::currentDesktop (); } QWidget * KWD::Window::initialParentWidget (void) const { return 0; } Qt::WFlags KWD::Window::initialWFlags (void) const { return 0; } void KWD::Window::grabXServer (bool) { } bool KWD::Window::compositingActive (void) const { return (mType != Normal2D); } #if KDE_IS_VERSION(4,3,90) QRect KWD::Window::transparentRect () const { return QRect (); } bool KWD::Window::isClientGroupActive () { return false; } QList KWD::Window::clientGroupItems () const { QList items; QIcon icon (mIcon); icon.addPixmap (mMiniIcon); items.append (ClientGroupItem (mName, icon)); return items; } long KWD::Window::itemId (int /* index */) { return (long) mClientId; } int KWD::Window::visibleClientGroupItem () { return 0; } void KWD::Window::setVisibleClientGroupItem (int /* index */) { } void KWD::Window::moveItemInClientGroup (int /* index */, int /* before */) { } void KWD::Window::moveItemToClientGroup (long /* itemId */, int /* before */) { } void KWD::Window::removeFromClientGroup (int /* index */, const QRect& /* newGeom */) { } void KWD::Window::closeClientGroupItem (int /* index */) { closeWindow (); } void KWD::Window::closeAllInClientGroup () { closeWindow (); } void KWD::Window::displayClientMenu (int /* index */, const QPoint& pos) { showWindowMenu (pos); } KDecorationDefines::WindowOperation KWD::Window::buttonToWindowOperation(Qt::MouseButtons button) { Options::MouseCommand com = buttonToCommand (button); if (com == Options::MouseOperationsMenu) return KDecorationDefines::OperationsOp; return KDecorationDefines::NoOp; } #endif void KWD::Window::createDecoration (void) { if (mDecor) return; mDecor = Decorator::pluginManager ()->createDecoration (this); connect(this, SIGNAL(showRequest()), mDecor, SIGNAL(showRequest())); connect(this, SIGNAL(appMenuAvailable()), mDecor, SIGNAL(appMenuAvailable())); connect(this, SIGNAL(appMenuUnavailable()), mDecor, SIGNAL(appMenuUnavailable())); connect(this, SIGNAL(menuHidden()), mDecor, SIGNAL(menuHidden())); mDecor->init (); mDecor->widget ()->installEventFilter (this); if (mType != Normal2D) { mPaintRedirector = new KWin::PaintRedirector (mDecor->widget ()); connect (mPaintRedirector, SIGNAL (paintPending()), this, SLOT (decorRepaintPending ())); } mPadding.top = mPadding.bottom = mPadding.left = mPadding.right = 0; if (KDecorationUnstable *deco2 = dynamic_cast(mDecor)) deco2->padding (mPadding.left, mPadding.right, mPadding.top, mPadding.bottom); if (mType == Normal2D && mFrame) { XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), mFrame, 0, 0); XMoveWindow (QX11Info::display(), mDecor->widget ()->winId (), -mPadding.left, -mPadding.top); } else XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), mParentId, 0, 0); if (mType == Normal && mFrame) { KWD::trapXError (); XSelectInput (QX11Info::display(), mFrame, StructureNotifyMask | PropertyChangeMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask); if (KWD::popXError ()) return; } QTimer::singleShot (0, this, SLOT(resizeDecorationTimeout ())); } void KWD::Window::resizeDecorationTimeout () { resizeDecoration (true); } void KWD::Window::setMask (const QRegion ®ion, int) { if (region.isEmpty ()) { if (mFrame && mShapeSet) { QRegion r (0, 0, mGeometry.width () + mBorder.left + mBorder.right, mGeometry.height () + mBorder.top + mBorder.bottom); r -= QRegion (mBorder.left, mBorder.top, mGeometry.width (), mGeometry.height ()); KWD::trapXError (); XShapeCombineMask (QX11Info::display(), mFrame, (mType == Normal2D)? ShapeBounding : ShapeInput, 0, 0, None, ShapeSet); KWD::popXError (); } mShapeSet = false; return; } if (mShapeSet && region == mShape) return; mShape = region; mShapeSet = true; if (mFrame) { QRegion r = region.translated (-mPadding.left, -mPadding.top); r -= QRegion (mBorder.left, mBorder.top, mGeometry.width (), mGeometry.height ()); KWD::trapXError (); XShapeCombineRegion (QX11Info::display(), mFrame, (mType == Normal2D)? ShapeBounding : ShapeInput, 0, 0, r.handle (), ShapeSet); KWD::popXError (); } } void KWD::Window::resizeDecoration (bool force) { int w, h; if (KDecorationUnstable *deco2 = dynamic_cast(mDecor)) deco2->padding (mPadding.left, mPadding.right, mPadding.top, mPadding.bottom); mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom); mExtents.left = mBorder.left + mPadding.left; mExtents.right = mBorder.right + mPadding.right; mExtents.top = mBorder.top + mPadding.top; mExtents.bottom = mBorder.bottom + mPadding.bottom; if (mType != Normal && mType != Normal2D) { mGeometry = QRect (50, 50, 100, 100); } w = mGeometry.width () + mExtents.left + mExtents.right; h = mGeometry.height () + mExtents.top + mExtents.bottom; if (!force) { if (w == decorWidget ()->width () && h == decorWidget ()->height ()) return; } /* reset shape */ if (!force || w != decorWidget ()->width () || h != decorWidget ()->height ()) setMask (QRegion (), 0); if (mPixmap) { XFreePixmap (QX11Info::display(), mPixmap); mPixmap = None; } mDecor->resize (QSize (w, h)); mDecor->widget ()->show (); mDecor->widget ()->update (); mPixmap = XCreatePixmap (QX11Info::display(), QX11Info::appRootWindow (), qMax (w, mGeometry.height ()), mExtents.top + mExtents.bottom + mExtents.left + mExtents.right, 32); mPixmapQt = QPixmap::fromX11Pixmap (mPixmap, QPixmap::ExplicitlyShared); mPixmapQt.fill (Qt::transparent); if (mPaintRedirector) mUpdateProperty = true; else { long *data = NULL; unsigned int propSize = 0; KWD::Window *otherUpdate = NULL; if (mType == Default || mType == DefaultActive) { propSize = 2; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); if (mType == Default) otherUpdate = KWD::Decorator::self ()->defaultActive (); else if (mType == DefaultActive) otherUpdate = KWD::Decorator::self ()->defaultNormal (); } data = updateProperty (data, propSize); if (otherUpdate && data) { otherUpdate->updateProperty (data, propSize); free (data); } } } void KWD::Window::updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset) { Atom atom = Atoms::compizWindowBlurDecor; QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion; ::Region topRegion = NULL; ::Region bottomRegion = NULL; ::Region leftRegion = NULL; ::Region rightRegion = NULL; int size = 0; int w, h; w = mGeometry.width () + mBorder.left + mBorder.right; h = mGeometry.height () + mBorder.top + mBorder.bottom; if (blurType != BLUR_TYPE_NONE) { QRegion r, shape = QRegion (0, 0, w, h); if (mShapeSet) shape = mShape.translated (-mPadding.left, -mPadding.top); r = QRegion (0, 0, w, mBorder.top); topQRegion = r.intersect (shape); if (!topQRegion.isEmpty ()) { topQRegion.translate (-mBorder.left, -mBorder.top); topRegion = topQRegion.handle (); } if (blurType == BLUR_TYPE_ALL) { r = QRegion (0, h - mBorder.bottom, w, mBorder.bottom); bottomQRegion = r.intersect (shape); if (!bottomQRegion.isEmpty ()) { bottomQRegion.translate (-mBorder.left, -(h - mBorder.bottom)); bottomRegion = bottomQRegion.handle (); } r = QRegion (0, mBorder.top, mBorder.left, mGeometry.height ()); leftQRegion = r.intersect (shape); if (!leftQRegion.isEmpty ()) { leftQRegion.translate (-mBorder.left, -mBorder.top); leftRegion = leftQRegion.handle (); } r = QRegion (w - mBorder.right, mBorder.top, mBorder.right, mGeometry.height ()); rightQRegion = r.intersect (shape); if (!rightQRegion.isEmpty ()) { rightQRegion.translate (-(w - mBorder.right), -mBorder.top); rightRegion = rightQRegion.handle (); } } } if (topRegion) size += topRegion->numRects; if (bottomRegion) size += bottomRegion->numRects; if (leftRegion) size += leftRegion->numRects; if (rightRegion) size += rightRegion->numRects; if (size) { long data[size * 6 + 2]; decor_region_to_blur_property (data, 4, 0, mGeometry.width (), mGeometry.height (), topRegion, topOffset, bottomRegion, bottomOffset, leftRegion, leftOffset, rightRegion, rightOffset); KWD::trapXError (); XChangeProperty (QX11Info::display(), mClientId, atom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, 2 + size * 6); KWD::popXError (); } else { KWD::trapXError (); XDeleteProperty (QX11Info::display(), mClientId, atom); KWD::popXError (); } } long * KWD::Window::updateProperty (long *data, unsigned int propSize) { Atom atom = Atoms::netWindowDecor; decor_extents_t maxExtents, normExtents; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1; unsigned int frameType = 0xffffff; unsigned int frameState = 0; unsigned int frameActions = 0; int left, right, top, bottom, width, height; unsigned int saveState; bool allocated = false; if (!propSize) propSize = nOffset; /* FIXME: This is essentially a hack to put the default * active and inactive decorations in the same property, * since we take an existing allocated property and return * the data in there and then pass it to the next KWD::Window * to update the property again. That's sub-optimal, but * its the best solution until we implement proper decoration * lists inside of kde4-window-decorator */ if (mType != Normal && mType != Normal2D) { atom = Atoms::netWindowDecorActive; if (mType == Default) { frameState &= ~(DECOR_WINDOW_STATE_FOCUS); nOffset = 2; } else if (mType == DefaultActive) { frameState |= DECOR_WINDOW_STATE_FOCUS; nOffset = 1; } } else if (!propSize) propSize = nOffset; saveState = mState; mState = NET::MaxVert | NET::MaxHoriz; mDecor->borders (maxExtents.left, maxExtents.right, maxExtents.top, maxExtents.bottom); mState = 0; mDecor->borders (normExtents.left, normExtents.right, normExtents.top, normExtents.bottom); mState = saveState; mState = saveState; mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom); left = mExtents.left; right = mExtents.right; top = mExtents.top; bottom = mExtents.bottom; width = mGeometry.width (); height = mGeometry.height (); if (mType != Normal2D) { int nQuad = 0; if (!data) { allocated = true; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); } if (mType == Normal) { decor_quad_t *q = quads; int n = 0; int topXOffset = width; QWidget *widget = mDecor->widget (); if (widget) { int x; const QList children = widget->children (); foreach (QObject *obj, children) { QWidget *child; if (!obj->isWidgetType ()) continue; child = static_cast (obj); x = child->x () - mExtents.left - 2; if (x > width / 2 && x < topXOffset) topXOffset = x; } } // top quads n = decor_set_horz_quad_line (q, left, topXOffset, right, width - topXOffset - 1, -top, 0, GRAVITY_NORTH, left + right + width, -(width - topXOffset - 1), GRAVITY_EAST, 0, 0); q += n; nQuad += n; // bottom quads n = decor_set_horz_quad_line (q, left, width / 2, right, (width / 2) - 1, 0, bottom, GRAVITY_SOUTH, left + right + width, -((width / 2) - 1), GRAVITY_EAST, 0, top); q += n; nQuad += n; // left quads n = decor_set_vert_quad_row (q, 0, height / 2, 0, (height / 2) - 1, -left, 0, GRAVITY_WEST, height, -((height / 2) - 1), GRAVITY_SOUTH, 0, top + bottom, 1); q += n; nQuad += n; // right quads n = decor_set_vert_quad_row (q, 0, height / 2, 0, (height / 2) - 1, 0, right, GRAVITY_EAST, height, -((height / 2) - 1), GRAVITY_SOUTH, 0, top + bottom + left, 1); q += n; nQuad += n; updateBlurProperty (topXOffset, width / 2, height / 2, height / 2); } else { decor_quad_t *q = quads; int n = 0; // top n = decor_set_horz_quad_line (q, left, 0, right, 0, -top, 0, GRAVITY_NORTH, left + right + width, width / 2, 0, 0, 0); q += n; nQuad += n; // bottom n = decor_set_horz_quad_line (q, left, 0, right, 0, 0, bottom, GRAVITY_SOUTH, left + right + width, width / 2, 0, 0, top); q += n; nQuad += n; // left n = decor_set_vert_quad_row (q, 0, 0, 0, 0, -left, 0, GRAVITY_WEST, height, height / 2, 0, 0, top + bottom, 1); q += n; nQuad += n; // right n = decor_set_vert_quad_row (q, 0, 0, 0, 0, 0, right, GRAVITY_EAST, height, height / 2, 0, 0, top + bottom + left, 1); q += n; nQuad += n; } decor_quads_to_property (data, nOffset - 1, mPixmap, &mBorder, &mBorder, &maxExtents, &maxExtents, 1, 0, quads, nQuad, frameType, frameState, frameActions); } else { if (!data) { allocated = true; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); } decor_gen_window_property (data, nOffset - 1, &normExtents, &maxExtents, 1, 0, frameType, frameState, frameActions); } KWD::trapXError (); XChangeProperty (QX11Info::display(), mClientId, atom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + propSize * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX)); KWD::popXError (); if (allocated) { free (data); data = NULL; } mUpdateProperty = false; return data; } void KWD::Window::handleActiveChange (void) { mDecor->activeChange (); resizeDecoration (); } void KWD::Window::updateFrame (WId frame) { if (mType == Normal2D && frame != mFrame && mDecor) { reloadDecoration (); //XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), frame, 0, 0); //XMoveWindow (QX11Info::display(), mDecor->widget ()->winId (), -mPadding.left, -mPadding.top); } mFrame = frame; KWD::trapXError (); XSelectInput (QX11Info::display(), mFrame, StructureNotifyMask | PropertyChangeMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask); KWD::popXError (); } void KWD::Window::updateSelected (WId selectedId) { mSelectedId = selectedId; updateName (); } void KWD::Window::updateWindowGeometry (void) { KWD::trapXError (); KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMGeometry); KWD::popXError (); if (!wInfo.valid ()) return; QRect geometry = wInfo.geometry (); if (mGeometry.width () != geometry.width () || mGeometry.height () != geometry.height ()) { mGeometry = geometry; resizeDecoration (); } else if (mGeometry.x () != geometry.x () || mGeometry.y () != geometry.y ()) { mGeometry = geometry; } } void KWD::Window::reloadDecoration (void) { delete mDecor; mDecor = 0; delete mPaintRedirector; mPaintRedirector = 0; mShapeSet = false; createDecoration (); } Cursor KWD::Window::positionToCursor (QPoint pos) { switch (mDecor->mousePosition (pos + QPoint (mPadding.left, mPadding.top))) { case PositionCenter: return cursors[1][1].cursor; case PositionLeft: return cursors[1][0].cursor; case PositionRight: return cursors[1][2].cursor; case PositionTop: return cursors[0][1].cursor; case PositionBottom: return cursors[2][1].cursor; case PositionTopLeft: return cursors[0][0].cursor; case PositionTopRight: return cursors[0][2].cursor; case PositionBottomLeft: return cursors[2][0].cursor; case PositionBottomRight: return cursors[2][2].cursor; default: break; } return cursors[1][1].cursor; } void KWD::Window::updateCursor (QPoint pos) { KWD::trapXError (); if (mType == Normal2D && mDecor) XDefineCursor (QX11Info::display(), mDecor->widget ()->winId (), positionToCursor (pos)); else XDefineCursor (QX11Info::display(), mFrame, positionToCursor (pos)); KWD::popXError (); } void KWD::Window::getWindowProtocols (void) { Atom *p; int n; int status; mSupportTakeFocus = false; mSupportContextHelp = false; KWD::trapXError (); status = XGetWMProtocols (QX11Info::display(), mClientId, &p, &n); if (KWD::popXError ()) return; if (status) { for (int i = 0; i < n; ++i) { if (p[i] == Atoms::wmTakeFocus) mSupportTakeFocus = true; else if (p[i] == Atoms::netWmContextHelp) mSupportContextHelp = true; } if (n > 0) XFree (p); } } void KWD::Window::handlePopupActivated (QAction * action) { WindowOperation op = static_cast (action->data().toInt()); performWindowOperation (op); } void KWD::Window::handleOpacityPopupActivated (QAction *action) { int op = action->data().toInt(); op = op * 0xffff / 100; if (op != mOpacity) Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId, Atoms::netWmWindowOpacity, (op << 16) | op); } void KWD::Window::handleDesktopPopupActivated (QAction *action) { if (action->data().toInt()) setDesktop (action->data().toInt()); else KWindowSystem::setOnAllDesktops (mClientId, true); } void KWD::Window::handlePopupAboutToShow (void) { int numberOfDesktops; numberOfDesktops = KWindowSystem::numberOfDesktops (); if (numberOfDesktops > 1) { NETRootInfo *rootInfo = Decorator::rootInfo (); QString name; int winDesktop = desktop (); QAction *action; const int BASE = 10; mDesktopMenu->clear (); action = mDesktopMenu->addAction (i18n ("&All Desktops")); action->setData (0); action->setCheckable (true); action->setChecked (winDesktop == NET::OnAllDesktops); mDesktopMenu->addSeparator (); for (int i = 1; i <= numberOfDesktops; ++i) { QString basic_name ("%1 %2"); if (i < BASE) basic_name.prepend ('&'); basic_name = basic_name.arg (i).arg ( QString (rootInfo->desktopName (i)).replace ('&', "&&")); action = mDesktopMenu->addAction (basic_name); action->setData (i); action->setCheckable (true); action->setChecked (winDesktop == i); } mDesktopOpAction->setVisible (true); } else { mDesktopOpAction->setVisible (false); } mResizeOpAction->setEnabled (isResizable ()); mMoveOpAction->setEnabled (isMovable ()); mMaximizeOpAction->setEnabled (isMaximizable ()); mMaximizeOpAction->setChecked (maximizeMode () == MaximizeFull); mShadeOpAction->setChecked (isShade ()); mShadeOpAction->setEnabled (isShadeable ()); mKeepAboveOpAction->setChecked (keepAbove ()); mKeepBelowOpAction->setChecked (keepBelow ()); mFullScreenOpAction->setChecked (mState & NET::FullScreen); mMinimizeOpAction->setEnabled (isMinimizable ()); mCloseOpAction->setEnabled (isCloseable ()); foreach (QAction* action, mOpacityMenu->actions ()) { if(action->data ().toInt () == qRound ((float)mOpacity * 100.0 / 0xffff)) action->setChecked( true ); else action->setChecked( false ); } } void KWD::Window::updateState (void) { KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMState, 0); unsigned long newState = wInfo.state (); unsigned long stateChange = mState ^ newState; mState = newState; if (stateChange & NET::Max) { mDecor->maximizeChange (); resizeDecoration (false); } if (stateChange & NET::KeepAbove && !(mState & NET::KeepAbove)) mDecor->emitKeepAboveChanged (mState & NET::KeepAbove); if (stateChange & NET::KeepBelow && !(mState & NET::KeepBelow)) mDecor->emitKeepBelowChanged (mState & NET::KeepBelow); if (stateChange & NET::KeepAbove && mState & NET::KeepAbove) mDecor->emitKeepAboveChanged (mState & NET::KeepAbove); if (stateChange & NET::KeepBelow && mState & NET::KeepBelow) mDecor->emitKeepBelowChanged (mState & NET::KeepBelow); if (stateChange & NET::Shaded) mDecor->shadeChange (); if (stateChange & NET::Sticky) mDecor->desktopChange (); } void KWD::Window::updateName (void) { KWindowInfo wInfo; wInfo = KWindowSystem::windowInfo (mClientId, NET::WMVisibleName, 0); mName = wInfo.visibleName (); mDecor->captionChange (); } void KWD::Window::updateIcons (void) { mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::NETWM | KWindowSystem::WMHints); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::NETWM | KWindowSystem::WMHints); if (mIcon.isNull ()) { mIcon = KWindowSystem::icon (mClientId, 32, 32, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true, KWindowSystem::ClassHint | KWindowSystem::XApp ); } mDecor->iconChange (); } NET::Direction KWD::Window::positionToDirection (int pos) { switch (pos) { case PositionLeft: return NET::Left; case PositionRight: return NET::Right; case PositionTop: return NET::Top; case PositionBottom: return NET::Bottom; case PositionTopLeft: return NET::TopLeft; case PositionTopRight: return NET::TopRight; case PositionBottomLeft: return NET::BottomLeft; case PositionBottomRight: return NET::BottomRight; default: break; } return NET::Move; } void KWD::Window::moveWindow (QMouseEvent *qme) { NET::Direction direction; direction = positionToDirection (mDecor->mousePosition (qme->pos ())); QPoint p (mGeometry.x () - mExtents.left, mGeometry.y () - mExtents.top); p += qme->pos (); XUngrabPointer (QX11Info::display(), CurrentTime); XUngrabKeyboard (QX11Info::display(), CurrentTime); Decorator::rootInfo ()->restackRequest (mClientId, NET::FromApplication, None, Above, QX11Info::appTime()); Decorator::rootInfo ()->moveResizeRequest (mClientId, p.x (), p.y (), direction); mFakeRelease = true; } #define OPACITY_STEP (0xffff / 10) void KWD::Window::performMouseCommand (Options::MouseCommand command, QMouseEvent *qme) { switch (command) { case Options::MouseRaise: KWindowSystem::raiseWindow (mClientId); break; case Options::MouseLower: KWindowSystem::lowerWindow (mClientId); break; case Options::MouseShade : setShade (!isShade ()); break; case Options::MouseSetShade: setShade (true); break; case Options::MouseUnsetShade: setShade (false); break; case Options::MouseOperationsMenu: showWindowMenu (mDecor->widget ()->mapToGlobal (qme->pos ())); break; case Options::MouseMaximize: maximize (KDecoration::MaximizeFull); break; case Options::MouseRestore: maximize (KDecoration::MaximizeRestore); break; case Options::MouseMinimize: minimize (); break; case Options::MouseAbove: if (keepBelow ()) setKeepBelow (false); else setKeepAbove (true); break; case Options::MouseBelow: if (keepAbove ()) setKeepAbove (false); else setKeepBelow (true); break; case Options::MousePreviousDesktop: break; case Options::MouseNextDesktop: break; case Options::MouseOpacityMore: { int opacity = mOpacity; if (opacity < 0xffff) { opacity += OPACITY_STEP; if (opacity > 0xffff) opacity = 0xffff; Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId, Atoms::netWmWindowOpacity, (opacity << 16) | opacity); } } break; case Options::MouseOpacityLess: { int opacity = mOpacity; if (opacity > OPACITY_STEP) { opacity -= OPACITY_STEP; if (opacity < OPACITY_STEP) opacity = OPACITY_STEP; Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId, Atoms::netWmWindowOpacity, (opacity << 16) | opacity); } } break; case Options::MouseActivateRaiseAndMove: case Options::MouseActivateRaiseAndUnrestrictedMove: case Options::MouseMove: case Options::MouseUnrestrictedMove: case Options::MouseResize: case Options::MouseUnrestrictedResize: if (qme) moveWindow (qme); case Options::MouseNothing: default: break; } } void KWD::Window::showKillProcessDialog (Time timestamp) { KWindowInfo kWinInfo = KWindowSystem::windowInfo (mClientId, 0, NET::WM2WindowClass | NET::WM2ClientMachine); NETWinInfo wInfo = NETWinInfo (QX11Info::display(), mClientId, QX11Info::appRootWindow(), NET::WMPid); QByteArray clientMachine, resourceClass; pid_t pid; char buf[257]; if (mProcessKiller.state () == QProcess::Running) return; clientMachine = kWinInfo.clientMachine (); resourceClass = kWinInfo.windowClassClass (); pid = wInfo.pid (); if (gethostname (buf, sizeof (buf) - 1) == 0) { if (strcmp (buf, clientMachine) == 0) clientMachine = "localhost"; } mProcessKiller.start (KStandardDirs::findExe ("kwin_killer_helper"), QStringList () << "--pid" << QByteArray ().setNum (pid) << "--hostname" << clientMachine << "--windowname" << mName.toUtf8 () << "--applicationname" << resourceClass << "--wid" << QByteArray ().setNum ((unsigned int) mClientId) << "--timestamp" << QByteArray ().setNum ((unsigned int) timestamp), QIODevice::NotOpen); } void KWD::Window::hideKillProcessDialog (void) { if (mProcessKiller.state () == QProcess::Running) { mProcessKiller.terminate (); } } void KWD::Window::decorRepaintPending () { if (!mPaintRedirector || !mPixmap) return; QRegion reg = mPaintRedirector->pendingRegion(); if (reg.isEmpty()) return; QRect bBox = reg.boundingRect(); if (mShapeSet) reg &= mShape; int l = mExtents.left; int r = mExtents.right; int t = mExtents.top; int b = mExtents.bottom; int w = mGeometry.width (); int h = mGeometry.height (); QRect top = QRect (0, 0, w + l + r, t); QRect bottom = QRect (0, t + h, w + l + r, b); QRect left = QRect (0, t, l, h); QRect right = QRect (l + w, t, r, h); QRegion rtop = reg & top; QRegion rbottom = reg & bottom; QRegion rleft = reg & left; QRegion rright = reg & right; QPixmap p = mPaintRedirector->performPendingPaint(); if (mType != Normal2D) { QPainter pt (&mPixmapQt); pt.setCompositionMode( QPainter::CompositionMode_Source ); pt.setClipRegion( reg ); QRect bb, pb; // Top if (!rtop.isEmpty ()) { bb = rtop.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } // Bottom if (!rbottom.isEmpty ()) { bb = rbottom.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.translate(0, -h); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } // Left if (!rleft.isEmpty ()) { bb = rleft.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.translate(0, t + b); pt.rotate (90); pt.scale (1.0, -1.0); pt.translate(0, -t); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } // Right if (!rright.isEmpty ()) { bb = rright.boundingRect(); pb = bb; pb.moveTo (bb.topLeft () - bBox.topLeft ()); pt.resetTransform (); pt.translate(0, t + b + l); pt.rotate (90); pt.scale (1.0, -1.0); pt.translate(- (l + w), -t); pt.setClipRegion( reg ); pt.drawPixmap( bb.topLeft(), p, pb ); } } else { } if (mUpdateProperty) { long *data = NULL; unsigned int propSize = 0; KWD::Window *otherUpdate = NULL; if (mType == Default || mType == DefaultActive) { propSize = 2; data = decor_alloc_property (propSize, WINDOW_DECORATION_TYPE_PIXMAP); if (mType == Default) otherUpdate = KWD::Decorator::self ()->defaultActive (); else if (mType == DefaultActive) otherUpdate = KWD::Decorator::self ()->defaultNormal (); } data = updateProperty (data, propSize); if (otherUpdate && data) { otherUpdate->updateProperty (data, propSize); free (data); } } } QWidget * KWD::Window::decorWidget (void) const { if (!mDecor) return 0; return mDecor->widget (); } QWidget * KWD::Window::childAt (int x, int y) const { if (!mDecor) return 0; QWidget *child = mDecor->widget ()->childAt (x + mPadding.left, y + mPadding.top); return (child)? child : decorWidget (); } QPoint KWD::Window::mapToChildAt (QPoint p) const { if (!mDecor) return p; if (childAt (p.x (), p.y ()) == decorWidget ()) return p + QPoint (mPadding.left, mPadding.right); return childAt (p.x (), p.y ())->mapFrom (decorWidget (), p + QPoint (mPadding.left, mPadding.right)); } bool KWD::Window::eventFilter (QObject *o, QEvent *e) { if (!mDecor || o != mDecor->widget ()) return false; if (e->type () == QEvent::MouseMove) { QMouseEvent* ev = static_cast (e); updateCursor (QPoint (ev->x () - mPadding.left, ev->y () - mPadding.top)); } if (e->type() == QEvent::Resize) { QResizeEvent* ev = static_cast (e); // Filter out resize events that inform about size different than frame size. // This will ensure that mDecor->width() etc. and mDecor->widget()->width() will be in sync. // These events only seem to be delayed events from initial resizing before show() was called // on the decoration widget. if (ev->size () != (mGeometry.size () + QSize (mExtents.left + mExtents.right, mExtents.top + mExtents.bottom))) { int w = mGeometry.width () + mExtents.left + mExtents.right; int h = mGeometry.height () + mExtents.top + mExtents.bottom; mDecor->resize (QSize (w, h)); return true; } // HACK: Avoid decoration redraw delays. On resize Qt sets WA_WStateConfigPending // which delays all painting until a matching ConfigureNotify event comes. // But this process itself is the window manager, so it's not needed // to wait for that event, the geometry is known. // Note that if Qt in the future changes how this flag is handled and what it // triggers then this may potentionally break things. See mainly QETWidget::translateConfigEvent(). mDecor->widget()->setAttribute( Qt::WA_WState_ConfigPending, false ); mDecor->widget()->update(); return false; } return false; } ./kde/window-decorator-kde4/paintredirector.cpp0000644000004100000410000000766513246301623022042 0ustar www-datawww-data/***************************************************************** This file is part of the KDE project. Copyright (C) 2009 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #include "paintredirector.h" #include #include #include namespace KWin { PaintRedirector::PaintRedirector( QWidget* w ) : widget( w ) , recursionCheck( false ) { timer.setSingleShot( true ); connect( &timer, SIGNAL( timeout()), SIGNAL( paintPending())); added( w ); } QPixmap PaintRedirector::performPendingPaint() { //qDebug() << "### performing paint, pending:" << pending.boundingRect(); QPixmap pixmap( pending.boundingRect().size()); pixmap.fill( Qt::transparent ); recursionCheck = true; // do not use DrawWindowBackground, it's ok to be transparent widget->render( &pixmap, QPoint(), pending.boundingRect(), QWidget::DrawChildren ); recursionCheck = false; pending = QRegion(); return pixmap; } bool PaintRedirector::isToolTip( QWidget *object ) const { // ### We need a more reliable way of doing this return object->windowFlags() & Qt::ToolTip; } bool PaintRedirector::eventFilter( QObject* o, QEvent* e ) { switch( e->type()) { case QEvent::ChildAdded: { QChildEvent* c = static_cast< QChildEvent* >( e ); if( c->child()->isWidgetType() && !isToolTip( static_cast< QWidget* >( c->child() ) ) ) added( static_cast< QWidget* >( c->child())); break; } case QEvent::ChildRemoved: { QChildEvent* c = static_cast< QChildEvent* >( e ); if( c->child()->isWidgetType()) removed( static_cast< QWidget* >( c->child())); break; } case QEvent::Paint: { if( !recursionCheck ) { QPaintEvent* pe = static_cast< QPaintEvent* >( e ); QWidget* w = static_cast< QWidget* >( o ); pending |= pe->region().translated( w->mapTo( widget, QPoint( 0, 0 ))); timer.start( 0 ); return true; // filter out } } default: break; } return false; } QRegion PaintRedirector::pendingRegion() const { return pending; } void PaintRedirector::added( QWidget* w ) { w->installEventFilter( this ); foreach( QObject* o, w->children()) { if( o->isWidgetType() && !isToolTip( static_cast< QWidget* >( o ) ) ) added( static_cast< QWidget* >( o )); } } void PaintRedirector::removed( QWidget* w ) { foreach( QObject* o, w->children()) { if( o->isWidgetType()) removed( static_cast< QWidget* >( o )); } w->installEventFilter( this ); } } // namespace //#include "paintredirector.moc" ./kde/window-decorator-kde4/switcher.cpp0000644000004100000410000002276213246301623020467 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: Dennis Kasprzyk */ #include "switcher.h" #include "utils.h" #include "decorator.h" #include #include #include #include #include #include #include #include #include #include KWD::Switcher::Switcher (WId, WId id): mId (id), mX11Pixmap (0), mX11BackgroundPixmap (0) { QPalette palette; long prop[4]; QColor color; color = Plasma::Theme::defaultTheme ()->color (Plasma::Theme::TextColor); mBackground = new Plasma::FrameSvg (); mBackground->setImagePath ("dialogs/background"); mBackground->setEnabledBorders (Plasma::FrameSvg::AllBorders); mBorder.left = mBackground->marginSize (Plasma::LeftMargin); mBorder.right = mBackground->marginSize (Plasma::RightMargin); mBorder.top = mBackground->marginSize (Plasma::TopMargin); mBorder.bottom = mBackground->marginSize (Plasma::BottomMargin) + Plasma::Theme::defaultTheme ()->fontMetrics ().height () + 10; mContext.extents.left = mBorder.left; mContext.extents.right = mBorder.right; mContext.extents.top = mBorder.top; mContext.extents.bottom = mBorder.bottom; mContext.left_space = mBorder.left; mContext.right_space = mBorder.right; mContext.top_space = mBorder.top; mContext.bottom_space = mBorder.bottom; mContext.left_corner_space = 0; mContext.right_corner_space = 0; mContext.top_corner_space = 0; mContext.bottom_corner_space = 0; updateGeometry (); prop[0] = (color.red () * 256) + color.red (); prop[1] = (color.green () * 256) + color.green (); prop[2] = (color.blue () * 256) + color.blue (); prop[3] = (color.alpha () * 256) + color.alpha (); KWD::trapXError (); XChangeProperty (QX11Info::display (), id, Atoms::switchFgColor, XA_INTEGER, 32, PropModeReplace, (unsigned char *) prop, 4); KWD::popXError (); } KWD::Switcher::~Switcher () { if (mX11Pixmap) XFreePixmap (QX11Info::display (), mX11Pixmap); if (mX11BackgroundPixmap) XFreePixmap (QX11Info::display (), mX11BackgroundPixmap); delete mBackground; } void KWD::Switcher::updateGeometry () { int x, y; unsigned int width, height, border, depth; XID root; XGetGeometry (QX11Info::display (), mId, &root, &x, &y, &width, &height, &border, &depth); mGeometry = QRect (x, y, width, height); KWD::readWindowProperty (mId, Atoms::switchSelectWindow, (long *)&mSelected); if (mX11Pixmap) XFreePixmap (QX11Info::display (), mX11Pixmap); if (mX11BackgroundPixmap) XFreePixmap (QX11Info::display (), mX11BackgroundPixmap); #ifdef QT_45 mX11Pixmap = XCreatePixmap (QX11Info::display (), QX11Info::appRootWindow (), width + mBorder.left + mBorder.right, height + mBorder.top + mBorder.bottom, 32); mX11BackgroundPixmap = XCreatePixmap (QX11Info::display (), QX11Info::appRootWindow (), width, height, 32); mPixmap = QPixmap::fromX11Pixmap (mX11Pixmap, QPixmap::ExplicitlyShared); mBackgroundPixmap = QPixmap::fromX11Pixmap (mX11BackgroundPixmap, QPixmap::ExplicitlyShared); #else mPixmap = QPixmap (width + mBorder.left + mBorder.right, height + mBorder.top + mBorder.bottom); mBackgroundPixmap = QPixmap (width, height); #endif redrawPixmap (); update (); decor_get_default_layout (&mContext, mGeometry.width (), mGeometry.height (), &mDecorLayout); updateWindowProperties (); } const QRect & KWD::Switcher::geometry () { return mGeometry; } void KWD::Switcher::redrawPixmap () { QPainter p (&mPixmap); QPainter bp (&mBackgroundPixmap); const int contentWidth = mPixmap.width (); const int contentHeight = mPixmap.height (); mPixmap.fill (Qt::transparent); p.setCompositionMode (QPainter::CompositionMode_Source); p.setRenderHint (QPainter::SmoothPixmapTransform); mBackground->resizeFrame (QSizeF (contentWidth, contentHeight)); mBackground->paintFrame (&p, QRect (0, 0, contentWidth, contentHeight)); bp.setCompositionMode (QPainter::CompositionMode_Source); bp.drawPixmap (0, 0, mPixmap, mBorder.left, mBorder.top, mGeometry.width (), mGeometry.height ()); XSetWindowBackgroundPixmap (QX11Info::display (), mId, #ifdef QT_45 mX11BackgroundPixmap); #else mBackgroundPixmap.handle ()); #endif XClearWindow (QX11Info::display (), mId); } void KWD::Switcher::update () { QFontMetrics fm = Plasma::Theme::defaultTheme ()->fontMetrics (); QFont font (Plasma::Theme::defaultTheme ()-> font (Plasma::Theme::DefaultFont)); QString name; QPainter p (&mPixmap); KWD::readWindowProperty (mId, Atoms::switchSelectWindow, (long *)&mSelected); name = KWindowSystem::windowInfo (mSelected, NET::WMVisibleName, 0).visibleName (); while (fm.width (name) > mGeometry.width ()) { name.truncate (name.length () - 6); name += "..."; } p.setCompositionMode (QPainter::CompositionMode_Source); mBackground->paintFrame (&p, QRect (mBorder.left, mBorder.top + mGeometry.height () + 5, mGeometry.width (), fm.height ())); p.setFont (font); p.setPen (Plasma::Theme::defaultTheme ()->color (Plasma::Theme::TextColor)); p.drawText ((mPixmap.width () - fm.width (name)) / 2, mBorder.top + mGeometry.height () + 5 + fm.ascent (), name); } void KWD::Switcher::updateWindowProperties () { long *data = NULL; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1, frameType = 0, frameState = 0, frameActions = 0; int nQuad; int lh, rh; int w; lh = mDecorLayout.left.y2 - mDecorLayout.left.y1; rh = mDecorLayout.right.y2 - mDecorLayout.right.y1; w = mDecorLayout.top.x2 - mDecorLayout.top.x1 - mContext.left_space - mContext.right_space; data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); nQuad = decor_set_lXrXtXbX_window_quads (quads, &mContext, &mDecorLayout, lh / 2, rh / 2, w, w / 2); #ifdef QT_45 decor_quads_to_property (data, nOffset - 1, mX11Pixmap, &mBorder, &mBorder, &mBorder, &mBorder, 0, 0, quads, nQuad, frameType, frameState, frameActions); #else decor_quads_to_property (data, nOffset - 1, mPixmap.handle (), &mBorder, &mBorder, &mBorder, &mBorder, 0, 0, quads, nQuad, frameType, frameState, frameActions); #endif KWD::trapXError (); XChangeProperty (QX11Info::display (), mId, Atoms::netWindowDecor, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); KWD::popXError (); free (data); updateBlurProperty (lh / 2, rh / 2, w / 2, w / 2); } void KWD::Switcher::updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset) { Atom atom = Atoms::compizWindowBlurDecor; QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion; Region topRegion = NULL; Region bottomRegion = NULL; Region leftRegion = NULL; Region rightRegion = NULL; int size = 0; int w; w = mGeometry.width () + mContext.extents.left + mContext.extents.right; if (blurType != BLUR_TYPE_NONE) { QRegion r; topQRegion = QRegion (-mContext.extents.left, -mContext.extents.top, w, mContext.extents.top); topRegion = topQRegion.handle (); bottomQRegion = QRegion (-mContext.extents.left, 0, w, mContext.extents.bottom); bottomRegion = bottomQRegion.handle (); leftQRegion = QRegion (-mContext.extents.left, 0, mContext.extents.left, mGeometry.height ()); leftRegion = leftQRegion.handle (); rightQRegion = QRegion (0, 0, mContext.extents.right, mGeometry.height ()); rightRegion = rightQRegion.handle (); } if (topRegion) size += topRegion->numRects; if (bottomRegion) size += bottomRegion->numRects; if (leftRegion) size += leftRegion->numRects; if (rightRegion) size += rightRegion->numRects; if (size) { long data[size * 6 + 2]; decor_region_to_blur_property (data, 4, 0, mGeometry.width (), mGeometry.height (), topRegion, topOffset, bottomRegion, bottomOffset, leftRegion, leftOffset, rightRegion, rightOffset); KWD::trapXError (); XChangeProperty (QX11Info::display (), mId, atom, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, 2 + size * 6); KWD::popXError (); } else { KWD::trapXError (); XDeleteProperty (QX11Info::display (), mId, atom); KWD::popXError (); } } ./kde/window-decorator-kde4/kdecoration_plugins.cpp0000644000004100000410000001416313246301623022676 0ustar www-datawww-data/***************************************************************** This file is a copy of the KWin internal API. It allows the KDE4 window decorator the loading of KWin decoration plugins. Copyright © 2008 Dennis Kasprzyk ****************************************************************** This file is part of the KDE project. Copyright (C) 1999, 2000 Daniel M. Duley Copyright (C) 2003 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #include "kdecoration_plugins.h" #include #include #include #include #include #include #include #include #include KWD::KDecorationPlugins::KDecorationPlugins(const KSharedConfigPtr &cfg) : create_ptr( NULL ), library( NULL ), fact( NULL ), old_library( NULL ), old_fact( NULL ), pluginStr( "kwin3_undefined " ), config( cfg ) { } KWD::KDecorationPlugins::~KDecorationPlugins() { if(library) { assert( fact != NULL ); delete fact; library->unload(); } if(old_library) { assert( old_fact != NULL ); delete old_fact; old_library->unload(); } } QString KWD::KDecorationPlugins::currentPlugin() { return pluginStr; } bool KWD::KDecorationPlugins::reset( unsigned long changed ) { QString oldPlugin = pluginStr; config->reparseConfiguration(); bool ret = false; if(( !loadPlugin( "" ) && library ) // "" = read the one in cfg file || oldPlugin == pluginStr ) { // no new plugin loaded, reset the old one assert( fact != NULL ); ret = fact->reset( changed ); } return ret || oldPlugin != pluginStr; } KDecorationFactory* KWD::KDecorationPlugins::factory() { return fact; } // convenience KDecoration* KWD::KDecorationPlugins::createDecoration( KDecorationBridge* bridge ) { if( fact != NULL ) return fact->createDecoration( bridge ); return NULL; } // returns true if plugin was loaded successfully bool KWD::KDecorationPlugins::loadPlugin( QString nameStr ) { if( nameStr.isEmpty()) { KConfigGroup group( config, QString("Style") ); nameStr = group.readEntry("PluginLib", defaultPlugin ); } // make sure people can switch between HEAD and kwin_iii branch if( nameStr.startsWith( "kwin_" )) nameStr = "kwin3_" + nameStr.mid( 5 ); KLibrary *oldLibrary = library; KDecorationFactory* oldFactory = fact; QString path = KLibLoader::findLibrary(nameStr); kDebug() << "kwin : path " << path << " for " << nameStr; // If the plugin was not found, try to find the default if (path.isEmpty()) { nameStr = defaultPlugin; path = KLibLoader::findLibrary(nameStr); } // If no library was found, exit kwin with an error message if (path.isEmpty()) { error( i18n("No window decoration plugin library was found." )); return false; } // Check if this library is not already loaded. if(pluginStr == nameStr) return true; // Try loading the requested plugin library = KLibLoader::self()->library(path); // If that fails, fall back to the default plugin if (!library) { kDebug() << " could not load library, try default plugin again"; nameStr = defaultPlugin; if ( pluginStr == nameStr ) return true; path = KLibLoader::findLibrary(nameStr); if (!path.isEmpty()) library = KLibLoader::self()->library(path); } if (!library) { error( i18n("The default decoration plugin is corrupt " "and could not be loaded." )); return false; } create_ptr = NULL; KLibrary::void_function_ptr create_func = library->resolveFunction("create_factory"); if(create_func) create_ptr = (KDecorationFactory* (*)())create_func; if(!create_ptr) { error( i18n( "The library %1 is not a KWin plugin.", path )); library->unload(); return false; } fact = create_ptr(); fact->checkRequirements( this ); // let it check what is supported pluginStr = nameStr; // For clients in kdeartwork QString catalog = nameStr; catalog.replace( "kwin3_", "kwin_" ); KGlobal::locale()->insertCatalog( catalog ); // For KCommonDecoration based clients KGlobal::locale()->insertCatalog( "kwin_lib" ); // For clients in kdebase KGlobal::locale()->insertCatalog( "kwin_clients" ); // For clients in kdeartwork KGlobal::locale()->insertCatalog( "kwin_art_clients" ); old_library = oldLibrary; // save for delayed destroying old_fact = oldFactory; return true; } void KWD::KDecorationPlugins::destroyPreviousPlugin() { // Destroy the old plugin if(old_library) { delete old_fact; old_fact = NULL; old_library->unload(); old_library = NULL; } } void KWD::KDecorationPlugins::error( const QString& ) { } ./kde/window-decorator-kde4/window.h0000644000004100000410000002012213246301623017577 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _WINDOW_H #define _WINDOW_H #include #include #include #include #include #include #include #include #include "utils.h" #include "options.h" class QProcess; class KDecoration; class KActionCollection; class QMenu; namespace KWin { class PaintRedirector; } namespace KWD { class Window: public QObject, public KDecorationBridgeUnstable { Q_OBJECT public: enum Type { Normal2D, Normal, Default, DefaultActive }; public: Window (WId parentId, WId clientId, WId frame, Type type, QRect geometry = QRect ()); ~Window (void); virtual bool isActive (void) const; virtual bool isCloseable (void) const; virtual bool isMaximizable (void) const; virtual MaximizeMode maximizeMode (void) const; #if KDE_IS_VERSION(4,10,90) virtual QuickTileMode quickTileMode (void) const; #endif virtual bool isMinimizable (void) const; virtual bool providesContextHelp (void) const; virtual int desktop (void) const; virtual bool isModal (void) const; virtual bool isShadeable (void) const; virtual bool isShade (void) const; virtual bool isSetShade (void) const; virtual bool keepAbove (void) const; virtual bool keepBelow (void) const; virtual bool isMovable (void) const; virtual bool isResizable (void) const; virtual NET::WindowType windowType (unsigned long supported_types) const; virtual QIcon icon (void) const; virtual QIcon icon (int idx) const; virtual QString caption (void) const; virtual QString caption (int idx) const; virtual void processMousePressEvent (QMouseEvent *); virtual void showWindowMenu (const QRect &); virtual void showWindowMenu (const QPoint &); virtual void showWindowMenu (const QPoint &, long int id); virtual void showApplicationMenu (const QPoint &); virtual bool menuAvailable () const; virtual void performWindowOperation (WindowOperation); virtual void setMask (const QRegion &, int); virtual bool isPreview (void) const; virtual QRect geometry (void) const; virtual QRect iconGeometry (void) const; virtual QRegion unobscuredRegion (const QRegion & r) const; virtual WId windowId (void) const; virtual void closeWindow (void); virtual void maximize (MaximizeMode mode); virtual void minimize (void); virtual void showContextHelp (void); virtual void setDesktop (int desktop); virtual void titlebarDblClickOperation (void); virtual void titlebarMouseWheelOperation (int delta); virtual void setShade (bool set); virtual void setKeepAbove (bool); virtual void setKeepBelow (bool); virtual int currentDesktop (void) const; virtual QWidget *initialParentWidget (void) const; virtual Qt::WFlags initialWFlags (void) const; virtual void grabXServer (bool grab); /* unstable API */ virtual bool compositingActive () const; #if KDE_IS_VERSION(4,3,90) virtual QRect transparentRect () const; virtual bool isClientGroupActive (); virtual QList clientGroupItems () const; virtual long itemId (int index); virtual int visibleClientGroupItem (); virtual void setVisibleClientGroupItem (int index); virtual void moveItemInClientGroup (int index, int before); virtual void moveItemToClientGroup (long itemId, int before); virtual void removeFromClientGroup (int index, const QRect& newGeom); virtual void closeClientGroupItem (int index); virtual void closeAllInClientGroup (); virtual void displayClientMenu (int index, const QPoint& pos); virtual WindowOperation buttonToWindowOperation(Qt::MouseButtons button); #endif long tabId (int idx) const; long currentTabId () const; void setCurrentTab (long id); void tab_A_before_B (long A, long B); void tab_A_behind_B (long A, long B); void untab (long id, const QRect& newGeom); void closeTab (long id); void closeTabGroup (); int tabCount () const; void handleActiveChange (void); void updateFrame (WId frame); void updateWindowGeometry (void); void updateCursor (QPoint pos); void updateSelected (WId selected); WId frameId (void) const { return mFrame; } KDecoration *decoration (void) const { return mDecor; } QWidget *decorWidget (void) const; QWidget *childAt (int x, int y) const; QPoint mapToChildAt (QPoint p) const; QWidget *activeChild (void) const { return mActiveChild; } void setActiveChild (QWidget * child) { mActiveChild = child; } void moveWindow (QMouseEvent *qme); void reloadDecoration (void); void updateState (void); void updateName (void); void updateIcons (void); void updateOpacity (void) { mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity, 0xffff); } Drawable pixmapId (void) const { return mPixmap; } decor_extents_t *border (void) { return &mBorder; } QRect clientGeometry (void); void showKillProcessDialog (Time timestamp); void hideKillProcessDialog (void); void setFakeRelease (bool fakeRelease) { mFakeRelease = fakeRelease; } bool getFakeRelease () { return mFakeRelease; } virtual bool eventFilter (QObject *o, QEvent *e); void emitShowRequest () { emit showRequest (); } void emitMenuHidden () { emit menuHidden (); } void setAppMenuAvailable (); void setAppMenuUnavailable (); private: void createDecoration (void); void resizeDecoration (bool force = false); void updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset); long * updateProperty (long *, unsigned int); void getWindowProtocols (void); Options::MouseCommand buttonToCommand (Qt::MouseButtons button); void performMouseCommand (KWD::Options::MouseCommand command, QMouseEvent *qme); NET::Direction positionToDirection (int pos); Cursor positionToCursor (QPoint pos); private slots: void resizeDecorationTimeout (); void handlePopupActivated (QAction *action); void handleOpacityPopupActivated (QAction *action); void handleDesktopPopupActivated (QAction *action); void handlePopupAboutToShow (void); void decorRepaintPending (); signals: void showRequest (); void appMenuAvailable (); void appMenuUnavailable (); void menuHidden (); private: Type mType; WId mParentId; WId mFrame; WId mClientId; WId mSelectedId; QRect mGeometry; QString mName; QPixmap mIcon; QPixmap mMiniIcon; decor_extents_t mBorder; decor_extents_t mPadding; decor_extents_t mExtents; unsigned short mOpacity; KDecoration *mDecor; Pixmap mPixmap; QPixmap mPixmapQt; bool mUpdateProperty; bool mShapeSet; QRegion mShape; QWidget *mActiveChild; bool mSupportTakeFocus; bool mSupportContextHelp; QMenu *mPopup; QMenu *mAdvancedMenu; QMenu *mOpacityMenu; QMenu *mDesktopMenu; unsigned long mState; bool mAppMenuAvailable; QProcess mProcessKiller; KActionCollection mKeys; bool mFakeRelease; QAction *mResizeOpAction; QAction *mMoveOpAction; QAction *mMaximizeOpAction; QAction *mShadeOpAction; QAction *mKeepAboveOpAction; QAction *mKeepBelowOpAction; QAction *mFullScreenOpAction; QAction *mNoBorderOpAction; QAction *mMinimizeOpAction; QAction *mCloseOpAction; QAction *mDesktopOpAction; KWin::PaintRedirector *mPaintRedirector; }; } #endif ./kde/window-decorator-kde4/options.cpp0000644000004100000410000001477313246301623020335 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include "options.h" #include #include #include KWD::Options::Options (KConfig *config): KDecorationOptions (), mConfig (config) { updateSettings (); } unsigned long KWD::Options::updateSettings (void) { unsigned long changed = 0; KConfigGroup config = mConfig->group ("Windows"); changed |= KDecorationOptions::updateSettings (mConfig); OpTitlebarDblClick = windowOperation (config.readEntry ("TitlebarDoubleClickCommand", "Shade"), true); setOpMaxButtonLeftClick ( windowOperation (config.readEntry ("MaximizeButtonLeftClickCommand", "Maximize"), true)); setOpMaxButtonMiddleClick ( windowOperation (config.readEntry ("MaximizeButtonMiddleClickCommand", "Maximize (vertical only)"), true)); setOpMaxButtonRightClick ( windowOperation (config.readEntry ("MaximizeButtonRightClickCommand", "Maximize (horizontal only)"), true)); config = mConfig->group ("MouseBindings"); CmdActiveTitlebar1 = mouseCommand (config.readEntry ("CommandActiveTitlebar1", "Raise"), true); CmdActiveTitlebar2 = mouseCommand (config.readEntry ("CommandActiveTitlebar2", "Lower"), true); CmdActiveTitlebar3 = mouseCommand (config.readEntry ("CommandActiveTitlebar3", "Operations menu"), true); CmdInactiveTitlebar1 = mouseCommand (config.readEntry ("CommandInactiveTitlebar1", "Activate and raise"), true); CmdInactiveTitlebar2 = mouseCommand (config.readEntry ("CommandInactiveTitlebar2", "Activate and lower"), true); CmdInactiveTitlebar3 = mouseCommand (config.readEntry ("CommandInactiveTitlebar3", "Operations menu"), true); CmdTitlebarWheel = mouseWheelCommand (config.readEntry ("CommandTitlebarWheel", "Nothing")); return changed; } // restricted should be true for operations that the user may not be able to // repeat if the window is moved out of the workspace (e.g. if the user moves // a window by the titlebar, and moves it too high beneath Kicker at the top // edge, they may not be able to move it back, unless they know about Alt+LMB) KDecorationDefines::WindowOperation KWD::Options::windowOperation (const QString &name, bool restricted) { if (name == "Move") return restricted ? KWD::Options::MoveOp : KWD::Options::UnrestrictedMoveOp; else if (name == "Resize") return restricted ? KWD::Options::ResizeOp : KWD::Options::UnrestrictedResizeOp; else if (name == "Maximize") return KWD::Options::MaximizeOp; else if (name == "Minimize") return KWD::Options::MinimizeOp; else if (name == "Close") return KWD::Options::CloseOp; else if (name == "OnAllDesktops") return KWD::Options::OnAllDesktopsOp; else if (name == "Shade") return KWD::Options::ShadeOp; else if (name == "Operations") return KWD::Options::OperationsOp; else if (name == "Maximize (vertical only)") return KWD::Options::VMaximizeOp; else if (name == "Maximize (horizontal only)") return KWD::Options::HMaximizeOp; else if (name == "Lower") return KWD::Options::LowerOp; return KWD::Options::NoOp; } KWD::Options::MouseCommand KWD::Options::mouseCommand (const QString &name, bool restricted) { QString lowerName = name.toLower (); if (lowerName == "raise") return MouseRaise; if (lowerName == "lower") return MouseLower; if (lowerName == "operations menu") return MouseOperationsMenu; if (lowerName == "toggle raise and lower") return MouseToggleRaiseAndLower; if (lowerName == "activate and raise") return MouseActivateAndRaise; if (lowerName == "activate and lower") return MouseActivateAndLower; if (lowerName == "activate") return MouseActivate; if (lowerName == "activate, raise and pass click") return MouseActivateRaiseAndPassClick; if (lowerName == "activate and pass click") return MouseActivateAndPassClick; if (lowerName == "activate, raise and move") return restricted ? MouseActivateRaiseAndMove : MouseActivateRaiseAndUnrestrictedMove; if (lowerName == "move") return restricted ? MouseMove : MouseUnrestrictedMove; if (lowerName == "resize") return restricted ? MouseResize : MouseUnrestrictedResize; if (lowerName == "shade") return MouseShade; if (lowerName == "minimize") return MouseMinimize; if (lowerName == "nothing") return MouseNothing; return MouseNothing; } KWD::Options::MouseWheelCommand KWD::Options::mouseWheelCommand (const QString &name) { QString lowerName = name.toLower (); if (lowerName == "raise/lower") return MouseWheelRaiseLower; if (lowerName == "shade/unshade") return MouseWheelShadeUnshade; if (lowerName == "maximize/restore") return MouseWheelMaximizeRestore; if (lowerName == "above/below") return MouseWheelAboveBelow; if (lowerName == "previous/next desktop") return MouseWheelPreviousNextDesktop; if (lowerName == "change opacity") return MouseWheelChangeOpacity; return MouseWheelNothing; } KWD::Options::MouseCommand KWD::Options::wheelToMouseCommand (MouseWheelCommand com, int delta) { switch (com) { case MouseWheelRaiseLower: return delta > 0 ? MouseRaise : MouseLower; case MouseWheelShadeUnshade: return delta > 0 ? MouseSetShade : MouseUnsetShade; case MouseWheelMaximizeRestore: return delta > 0 ? MouseMaximize : MouseRestore; case MouseWheelAboveBelow: return delta > 0 ? MouseAbove : MouseBelow; case MouseWheelPreviousNextDesktop: return delta > 0 ? MousePreviousDesktop : MouseNextDesktop; case MouseWheelChangeOpacity: return delta > 0 ? MouseOpacityMore : MouseOpacityLess; default: return MouseNothing; } } ./kde/window-decorator-kde4/paintredirector.h0000644000004100000410000000407213246301623021474 0ustar www-datawww-data/***************************************************************** This file is part of the KDE project. Copyright (C) 2009 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #ifndef PAINTREDIRECTOR_H #define PAINTREDIRECTOR_H #include #include #include namespace KWin { // This class redirects all painting of a given widget (including its children) // into a paint device (QPixmap). class PaintRedirector : public QObject { Q_OBJECT public: PaintRedirector( QWidget* widget ); virtual ~PaintRedirector() {} QPixmap performPendingPaint(); virtual bool eventFilter( QObject* o, QEvent* e ); QRegion pendingRegion() const; signals: void paintPending(); private: void added( QWidget* widget ); void removed( QWidget* widget ); bool isToolTip( QWidget* widget ) const; QWidget* widget; QRegion pending; bool recursionCheck; QTimer timer; }; } // namespace #endif ./kde/window-decorator-kde4/kdecorationbridge.h0000644000004100000410000001135413246301623021756 0ustar www-datawww-data/***************************************************************** This file is part of the KDE project. Copyright (C) 2003 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #ifndef KDECORATIONBRIDGE_H #define KDECORATIONBRIDGE_H #include "kdecoration.h" #include "kdeversion.h" #include /** * @short Bridge class for communicating between decorations and KWin core. * * This class allows communication between decorations and KWin core while allowing * to keep binary compatibility. Decorations do not need to use it directly at all. */ class KDecorationBridge : public KDecorationDefines { public: virtual ~KDecorationBridge() {} virtual bool isActive() const = 0; virtual bool isCloseable() const = 0; virtual bool isMaximizable() const = 0; virtual MaximizeMode maximizeMode() const = 0; #if KDE_IS_VERSION(4,10,90) virtual QuickTileMode quickTileMode() const = 0; #endif virtual bool isMinimizable() const = 0; virtual bool providesContextHelp() const = 0; virtual int desktop() const = 0; virtual bool isModal() const = 0; virtual bool isShadeable() const = 0; virtual bool isShade() const = 0; virtual bool isSetShade() const = 0; virtual bool keepAbove() const = 0; virtual bool keepBelow() const = 0; virtual bool isMovable() const = 0; virtual bool isResizable() const = 0; virtual NET::WindowType windowType(unsigned long supported_types) const = 0; virtual QIcon icon() const = 0; virtual QString caption() const = 0; virtual void processMousePressEvent(QMouseEvent*) = 0; virtual void showWindowMenu(const QRect &) = 0; virtual void showWindowMenu(const QPoint &) = 0; virtual void showApplicationMenu(const QPoint&) = 0; virtual bool menuAvailable() const = 0; virtual void performWindowOperation(WindowOperation) = 0; virtual void setMask(const QRegion&, int) = 0; virtual bool isPreview() const = 0; virtual QRect geometry() const = 0; virtual QRect iconGeometry() const = 0; virtual QRegion unobscuredRegion(const QRegion& r) const = 0; virtual WId windowId() const = 0; virtual void closeWindow() = 0; virtual void maximize(MaximizeMode mode) = 0; virtual void minimize() = 0; virtual void showContextHelp() = 0; virtual void setDesktop(int desktop) = 0; virtual void titlebarDblClickOperation() = 0; virtual void titlebarMouseWheelOperation(int delta) = 0; virtual void setShade(bool set) = 0; virtual void setKeepAbove(bool) = 0; virtual void setKeepBelow(bool) = 0; // not part of public API virtual int currentDesktop() const = 0; virtual QWidget* initialParentWidget() const = 0; virtual Qt::WFlags initialWFlags() const = 0; virtual void grabXServer(bool grab) = 0; }; class KDecorationBridgeUnstable : public KDecorationBridge { public: virtual bool compositingActive() const = 0; virtual QRect transparentRect() const = 0; // Window tabbing using KDecorationBridge::caption; virtual QString caption(int idx) const = 0; virtual void closeTab(long id) = 0; virtual void closeTabGroup() = 0; virtual long currentTabId() const = 0; using KDecorationBridge::icon; virtual QIcon icon(int idx) const = 0; virtual void setCurrentTab(long id) = 0; using KDecorationBridge::showWindowMenu; virtual void showWindowMenu(const QPoint& pos, long id) = 0; virtual void tab_A_before_B(long A, long B) = 0; virtual void tab_A_behind_B(long A, long B) = 0; virtual int tabCount() const = 0; virtual long tabId(int idx) const = 0; virtual void untab(long id, const QRect& newGeom) = 0; virtual WindowOperation buttonToWindowOperation(Qt::MouseButtons button) = 0; }; #endif ./kde/window-decorator-kde4/decorator.h0000644000004100000410000001110113246301623020247 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _DECORATOR_H #define _DECORATOR_H #include #include #include #include #include #include #include #include #include #include "window.h" #include "switcher.h" #include "kdecoration_plugins.h" #include "utils.h" extern const unsigned int ROOT_OFF_X; extern const unsigned int ROOT_OFF_Y; #define C(name) { 0, XC_ ## name } struct _cursor { Cursor cursor; unsigned int shape; }; extern struct _cursor cursors[3][3]; extern const unsigned short BLUR_TYPE_NONE; extern const unsigned short BLUR_TYPE_TITLEBAR; extern const unsigned short BLUR_TYPE_ALL; extern int blurType; class KConfig; class KWindowSystem; namespace KWD { class Options; class PluginManager:public KDecorationPlugins { public: PluginManager (KSharedConfigPtr config); virtual bool provides (Requirement) { return false; } }; class Decorator:public KApplication { Q_OBJECT public: #ifdef QT_45 Decorator (); #else Decorator (Display* display, Qt::HANDLE visual, Qt::HANDLE colormap); #endif ~Decorator (void); static NETRootInfo *rootInfo (void) { return mRootInfo; } static PluginManager *pluginManager (void) { return mPlugins; } static KWD::Options *options (void) { return mOptions; } static WId activeId (void) { return mActiveId; } static decor_shadow_options_t *activeShadowOptions (void) { return &mActiveShadowOptions; } static decor_shadow_options_t *inactiveShadowOptions (void) { return &mInactiveShadowOptions; } static KWD::Window *defaultNormal () { return mDecorNormal; } static KWD::Window *defaultActive () { return mDecorActive; } static KWD::Decorator *self () { return mSelf; } static void sendClientMessage (WId eventWid, WId wid, Atom atom, Atom value, long data1 = 0, long data2 = 0, long data3 = 0); bool enableDecorations (Time timestamp); bool x11EventFilter (XEvent *xevent); void changeShadowOptions (decor_shadow_options_t *aopt, decor_shadow_options_t *iopt); public slots: void reconfigure (void); private: WId fetchFrame (WId window); void updateShadow (void); void updateAllShadowOptions (void); void updateShadowProperties (WId id); private slots: void handleWindowAdded (WId id); void handleWindowRemoved (WId id); void handleActiveWindowChanged (WId id); void handleWindowChanged (WId id, const unsigned long *properties); void shadowRadiusChanged (double value_active, double value_inactive); void shadowOpacityChanged (double value_active, double value_inactive); void shadowXOffsetChanged (int value_active, int value_inactive); void shadowYOffsetChanged (int value_active, double value_inactive); void shadowColorChanged (QString value_active, QString value_inactive); void plasmaThemeChanged (); void showRequest (qulonglong wid); void menuAvailable (qulonglong wid); void menuHidden (qulonglong wid); void clearMenus (); private: static PluginManager *mPlugins; static KWD::Options *mOptions; static decor_shadow_t *mNoBorderShadow; static decor_shadow_options_t mActiveShadowOptions; static decor_shadow_options_t mInactiveShadowOptions; static NETRootInfo *mRootInfo; static WId mActiveId; static KWD::Window *mDecorNormal; static KWD::Window *mDecorActive; QMap mClients; QMap mFrames; KConfig *mConfig; Time mDmSnTimestamp; WId mCompositeWindow; Switcher *mSwitcher; QList mWindowsMenu; static KWD::Decorator *mSelf; /* XXX: Remove */ }; } #endif ./kde/window-decorator-kde4/utils.cpp0000644000004100000410000001350213246301623017767 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include "utils.h" #include #include #include #include #include #include static int trappedErrorCode = 0; namespace KWD { namespace Atoms { Atom switchSelectWindow; Atom switchFgColor; Atom netWmWindowOpacity; Atom netInputFrameWindow; Atom netOutputFrameWindow; Atom compizShadowInfo; Atom compizShadowColor; Atom netWindowDecor; Atom netWindowDecorNormal; Atom netWindowDecorActive; Atom netWindowDecorBare; Atom wmTakeFocus; Atom netWmContextHelp; Atom wmProtocols; Atom toolkitActionAtom; Atom toolkitActionWindowMenuAtom; Atom toolkitActionForceQuitDialogAtom; Atom compizWindowBlurDecor; Atom enlightmentDesktop; } } static int (*oldErrorHandler) (Display *display, XErrorEvent *error); static int xErrorHandler (Display *display, XErrorEvent *error) { (void) display; trappedErrorCode = error->error_code; return 0; } void KWD::trapXError (void) { trappedErrorCode = 0; oldErrorHandler = XSetErrorHandler (xErrorHandler); } int KWD::popXError (void) { XSync (QX11Info::display (), false); XSetErrorHandler (oldErrorHandler); return trappedErrorCode; } void * KWD::readXProperty (WId window, Atom property, Atom type, int *items) { long offset = 0, length = 2048L; Atom actualType; int format; unsigned long nItems, bytesRemaining; unsigned char *data = 0l; int result; KWD::trapXError (); result = XGetWindowProperty (QX11Info::display (), window, property, offset, length, false, type, &actualType, &format, &nItems, &bytesRemaining, &data); if (KWD::popXError ()) return NULL; if (result == Success && actualType == type && format == 32 && nItems > 0) { if (items) *items = nItems; return reinterpret_cast (data); } if (data) XFree (data); if (items) *items = 0; return NULL; } bool KWD::readWindowProperty (long window, long property, long *value) { void *data = readXProperty (window, property, XA_WINDOW, NULL); if (data) { if (value) *value = *reinterpret_cast (data); XFree (data); return true; } return false; } QVector KWD::readPropertyString (WId id, Atom property) { XTextProperty xtp; XGetTextProperty (QX11Info::display (), id, &xtp, property); QVector ret; if (xtp.value) { int retCount = 0; char **tData = NULL; XTextPropertyToStringList (&xtp, &tData, &retCount); for (unsigned int i = 0; i < (unsigned int) retCount; ++i) { QString str = QString (tData[i]); ret.push_back (str); } XFreeStringList (tData); } return ret; } unsigned short KWD::readPropertyShort (WId id, Atom property, unsigned short defaultValue) { Atom actual; int result, format; unsigned long n, left; unsigned char *data; KWD::trapXError (); result = XGetWindowProperty (QX11Info::display (), id, property, 0L, 1L, FALSE, XA_CARDINAL, &actual, &format, &n, &left, &data); if (KWD::popXError ()) return defaultValue; if (result == Success && n && data) { unsigned int value; memcpy (&value, data, sizeof (unsigned int)); XFree (data); return value >> 16; } return defaultValue; } void KWD::Atoms::init (void) { Display *xdisplay = QX11Info::display (); netInputFrameWindow = XInternAtom (xdisplay, DECOR_INPUT_FRAME_ATOM_NAME, false); netOutputFrameWindow = XInternAtom (xdisplay, DECOR_OUTPUT_FRAME_ATOM_NAME, false); compizShadowInfo = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_PROPERTIES", false); compizShadowColor = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_COLOR", false); netWindowDecor = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, false); netWindowDecorActive = XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, false); netWindowDecorBare = XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, false); switchSelectWindow = XInternAtom (xdisplay, DECOR_SWITCH_WINDOW_ATOM_NAME, false); switchFgColor = XInternAtom (xdisplay, DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, false); wmTakeFocus = XInternAtom (xdisplay, "WM_TAKE_FOCUS", false); netWmContextHelp = XInternAtom (xdisplay, "_NET_WM_CONTEXT_HELP", false); wmProtocols = XInternAtom (xdisplay, "WM_PROTOCOLS", false); netWmWindowOpacity = XInternAtom (xdisplay, "_NET_WM_WINDOW_OPACITY", false); toolkitActionAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION", false); toolkitActionWindowMenuAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", false); toolkitActionForceQuitDialogAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG", false); compizWindowBlurDecor = XInternAtom (xdisplay, DECOR_BLUR_ATOM_NAME, false); enlightmentDesktop = XInternAtom (xdisplay, "ENLIGHTENMENT_DESKTOP", false); } ./kde/window-decorator-kde4/main.cpp0000644000004100000410000000747013246301623017562 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include "decorator.h" #include "utils.h" #include int main (int argc, char **argv) { KWD::Decorator *app; KCmdLineArgs *args; KCmdLineOptions options; int status; Time timestamp; QString appname; options.add ("replace", ki18n ("Replace existing window decorator")); options.add ("sm-disable", ki18n ("Disable connection to session manager")); options.add ("blur ", ki18n ("Blur type (none,titlebar,all)"), "none"); KAboutData about("kde-window-decorator", "kwin", ki18n ("KDE Window Decorator"), "0.0.1", KLocalizedString(), KAboutData::License_GPL, KLocalizedString(), KLocalizedString(), "https://launchpad.net/compiz", "dev@lists.compiz-fusion.org"); KCmdLineArgs::init (argc, argv, "kde-window-decorator", "kwin", ki18n ("KDE Window Decorator"), "0.0.1"); KCmdLineArgs::addCmdLineOptions (options); args = KCmdLineArgs::parsedArgs (); if (args->isSet ("blur")) { QString blur = args->getOption ("blur"); if (blur == QString ("titlebar")) blurType = BLUR_TYPE_TITLEBAR; else if (blur == QString ("all")) blurType = BLUR_TYPE_ALL; } app = new KWD::Decorator (); if (args->isSet ("sm-disable")) app->disableSessionManagement (); status = decor_acquire_dm_session (QX11Info::display (), QX11Info::appScreen (), "kwd", args->isSet ("replace"), ×tamp); if (status != DECOR_ACQUIRE_STATUS_SUCCESS) { if (status == DECOR_ACQUIRE_STATUS_FAILED) { fprintf (stderr, "%s: Could not acquire decoration manager " "selection on screen %d display \"%s\"\n", argv[0], QX11Info::appScreen (), DisplayString (QX11Info::display ())); } else if (status == DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING) { fprintf (stderr, "%s: Screen %d on display \"%s\" already " "has a decoration manager; try using the " "--replace option to replace the current " "decoration manager.\n", argv[0], QX11Info::appScreen (), DisplayString (QX11Info::display ())); } return 1; } decor_set_dm_check_hint (QX11Info::display (), QX11Info::appScreen (), WINDOW_DECORATION_TYPE_PIXMAP | WINDOW_DECORATION_TYPE_WINDOW); if (!app->enableDecorations (timestamp)) { fprintf (stderr, "%s: Could not enable decorations on display \"%s\"\n", argv[0], DisplayString (QX11Info::display ())); return 1; } if (QX11Info::appScreen () == 0) appname = "org.kde.kwin"; else appname.sprintf ("org.kde.kwin-screen-%d", QX11Info::appScreen ()); status = app->exec (); delete app; return status; } ./kde/window-decorator-kde4/utils.h0000644000004100000410000000434413246301623017440 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _UTILS_H #define _UTILS_H #include #include #include #include #if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)) #define QT_45 #endif namespace KWD { namespace Atoms { extern Atom switchSelectWindow; extern Atom switchFgColor; extern Atom netWmWindowOpacity; extern Atom netInputFrameWindow; extern Atom netOutputFrameWindow; extern Atom compizShadowInfo; extern Atom compizShadowColor; extern Atom netWindowDecor; extern Atom netWindowDecorNormal; extern Atom netWindowDecorActive; extern Atom netWindowDecorBare; extern Atom wmTakeFocus; extern Atom netWmContextHelp; extern Atom wmProtocols; extern Atom toolkitActionAtom; extern Atom toolkitActionWindowMenuAtom; extern Atom toolkitActionForceQuitDialogAtom; extern Atom compizWindowBlurDecor; extern Atom enlightmentDesktop; void init (void); } void trapXError (void); int popXError (void); bool eventFilter (void *message, long *result); void *readXProperty (WId window, Atom property, Atom type, int *items); bool readWindowProperty (long wId, long property, long *value); QVector readPropertyString (Window WId, Atom property); unsigned short readPropertyShort (WId id, Atom property, unsigned short defaultValue); } #endif ./kde/window-decorator-kde4/org.kde.KWin.xml0000644000004100000410000000055113246301623021045 0ustar www-datawww-data ./kde/window-decorator-kde4/switcher.h0000644000004100000410000000335113246301623020125 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: Dennis Kasprzyk */ #ifndef _SWITCHER_H #define _SWITCHER_H #include #include #include #include #include namespace Plasma { class FrameSvg; } class QSpacerItem; class QLabel; class QVBoxLayout; namespace KWD { class Switcher { public: Switcher (WId parentId, WId id); ~Switcher (); void update (); void updateGeometry (); const QRect & geometry (); WId xid () const { return mId; } private: void updateWindowProperties (); void updateBlurProperty (int topOffset, int bottomOffset, int leftOffset, int rightOffset); void redrawPixmap (); private: WId mId; WId mSelected; QRect mGeometry; Plasma::FrameSvg *mBackground; QPixmap mPixmap; Pixmap mX11Pixmap; QPixmap mBackgroundPixmap; Pixmap mX11BackgroundPixmap; decor_layout_t mDecorLayout; decor_context_t mContext; decor_extents_t mBorder; }; } #endif ./kde/window-decorator-kde4/options.h0000644000004100000410000000666513246301623020003 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #ifndef _OPTIONS_H #define _OPTIONS_H #include class KConfig; namespace KWD { class Options : public KDecorationOptions { public: enum MouseCommand { MouseRaise, MouseLower, MouseOperationsMenu, MouseToggleRaiseAndLower, MouseActivateAndRaise, MouseActivateAndLower, MouseActivate, MouseActivateRaiseAndPassClick, MouseActivateAndPassClick, MouseMove, MouseUnrestrictedMove, MouseActivateRaiseAndMove, MouseActivateRaiseAndUnrestrictedMove, MouseResize, MouseUnrestrictedResize, MouseShade, MouseSetShade, MouseUnsetShade, MouseMaximize, MouseRestore, MouseMinimize, MouseNextDesktop, MousePreviousDesktop, MouseAbove, MouseBelow, MouseOpacityMore, MouseOpacityLess, MouseNothing }; enum MouseWheelCommand { MouseWheelRaiseLower, MouseWheelShadeUnshade, MouseWheelMaximizeRestore, MouseWheelAboveBelow, MouseWheelPreviousNextDesktop, MouseWheelChangeOpacity, MouseWheelNothing }; Options (KConfig *config); virtual ~Options () {} virtual unsigned long updateSettings (void); WindowOperation operationTitlebarDblClick (void) { return OpTitlebarDblClick; } MouseCommand commandActiveTitlebar1 (void) { return CmdActiveTitlebar1; } MouseCommand commandActiveTitlebar2 (void) { return CmdActiveTitlebar2; } MouseCommand commandActiveTitlebar3 (void) { return CmdActiveTitlebar3; } MouseCommand commandInactiveTitlebar1 (void) { return CmdInactiveTitlebar1; } MouseCommand commandInactiveTitlebar2 (void) { return CmdInactiveTitlebar2; } MouseCommand commandInactiveTitlebar3 (void) { return CmdInactiveTitlebar3; } MouseCommand operationTitlebarMouseWheel (int delta) { return wheelToMouseCommand (CmdTitlebarWheel, delta); } private: static KDecorationDefines::WindowOperation windowOperation (const QString &name, bool restricted); MouseCommand mouseCommand (const QString &name, bool restricted); MouseWheelCommand mouseWheelCommand (const QString &name); MouseCommand wheelToMouseCommand (MouseWheelCommand com, int delta); private: KDecorationDefines::WindowOperation OpTitlebarDblClick; MouseCommand CmdActiveTitlebar1; MouseCommand CmdActiveTitlebar2; MouseCommand CmdActiveTitlebar3; MouseCommand CmdInactiveTitlebar1; MouseCommand CmdInactiveTitlebar2; MouseCommand CmdInactiveTitlebar3; MouseWheelCommand CmdTitlebarWheel; KConfig *mConfig; }; } #endif ./kde/window-decorator-kde4/decorator.cpp0000644000004100000410000006423513246301623020622 0ustar www-datawww-data/* * Copyright © 2008 Dennis Kasprzyk * Copyright © 2006 Novell, Inc. * Copyright © 2006 Volker Krause * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "decorator.h" #include "options.h" #include "utils.h" #include "kwinadaptor.h" #include const unsigned int ROOT_OFF_X = 8192; const unsigned int ROOT_OFF_Y = 8192; const unsigned short BLUR_TYPE_NONE = 0; const unsigned short BLUR_TYPE_TITLEBAR = 1; const unsigned short BLUR_TYPE_ALL = 2; static const float SHADOW_RADIUS = 8.0f; static const float SHADOW_OPACITY = 0.5f; static const unsigned short SHADOW_OFFSET_X = 1; static const unsigned short SHADOW_OFFSET_Y = 1; #define SHADOW_COLOR_RED 0x0000 #define SHADOW_COLOR_GREEN 0x0000 #define SHADOW_COLOR_BLUE 0x0000 static const char *KDED_SERVICE = "org.kde.kded"; static const char *KDED_APPMENU_PATH = "/modules/appmenu"; static const char *KDED_INTERFACE = "org.kde.kded"; int blurType = BLUR_TYPE_NONE; decor_shadow_t *KWD::Decorator::mNoBorderShadow = 0; KWD::PluginManager *KWD::Decorator::mPlugins = 0; KWD::Options *KWD::Decorator::mOptions = 0; NETRootInfo *KWD::Decorator::mRootInfo; WId KWD::Decorator::mActiveId; decor_shadow_options_t KWD::Decorator::mActiveShadowOptions; decor_shadow_options_t KWD::Decorator::mInactiveShadowOptions; KWD::Window *KWD::Decorator::mDecorNormal = NULL; KWD::Window *KWD::Decorator::mDecorActive = NULL; KWD::Decorator *KWD::Decorator::mSelf = NULL; struct _cursor cursors[3][3] = { { C (top_left_corner), C (top_side), C (top_right_corner) }, { C (left_side), C (left_ptr), C (right_side) }, { C (bottom_left_corner), C (bottom_side), C (bottom_right_corner) } }; KWD::PluginManager::PluginManager (KSharedConfigPtr config): KWD::KDecorationPlugins (config) { if (QPixmap::defaultDepth () > 8) defaultPlugin = "kwin3_oxygen"; else defaultPlugin = "kwin3_plastik"; } KWD::Decorator::Decorator () : KApplication (), mConfig (0), mCompositeWindow (0), mSwitcher (0) { XSetWindowAttributes attr; int i, j; mSelf = this; mRootInfo = new NETRootInfo (QX11Info::display (), 0); mActiveId = 0; KConfigGroup cfg (KSharedConfig::openConfig ("plasmarc"), QString ("Theme")); Plasma::Theme::defaultTheme ()->setThemeName (cfg.readEntry ("name")); Atoms::init (); new KWinAdaptor (this); mConfig = new KConfig ("kwinrc"); mOptions = new KWD::Options (mConfig); mPlugins = new PluginManager (KSharedConfig::openConfig ("kwinrc")); mActiveShadowOptions.shadow_radius = SHADOW_RADIUS; mActiveShadowOptions.shadow_opacity = SHADOW_OPACITY; mActiveShadowOptions.shadow_offset_x = SHADOW_OFFSET_X; mActiveShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y; mActiveShadowOptions.shadow_color[0] = SHADOW_COLOR_RED; mActiveShadowOptions.shadow_color[1] = SHADOW_COLOR_GREEN; mActiveShadowOptions.shadow_color[2] = SHADOW_COLOR_BLUE; mInactiveShadowOptions.shadow_radius = SHADOW_RADIUS; mInactiveShadowOptions.shadow_opacity = SHADOW_OPACITY; mInactiveShadowOptions.shadow_offset_x = SHADOW_OFFSET_X; mInactiveShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y; mInactiveShadowOptions.shadow_color[0] = SHADOW_COLOR_RED; mInactiveShadowOptions.shadow_color[1] = SHADOW_COLOR_GREEN; mInactiveShadowOptions.shadow_color[2] = SHADOW_COLOR_BLUE; updateShadowProperties (QX11Info::appRootWindow ()); for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { if (cursors[i][j].shape != XC_left_ptr) cursors[i][j].cursor = XCreateFontCursor (QX11Info::display (), cursors[i][j].shape); } } attr.override_redirect = True; mCompositeWindow = XCreateWindow (QX11Info::display (), QX11Info::appRootWindow (), -ROOT_OFF_X, -ROOT_OFF_Y, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect, &attr); long data = 1; XChangeProperty (QX11Info::display(), mCompositeWindow, Atoms::enlightmentDesktop, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1); XCompositeRedirectSubwindows (QX11Info::display (), mCompositeWindow, CompositeRedirectManual); XMapWindow (QX11Info::display (), mCompositeWindow); QDBusConnection dbus = QDBusConnection::sessionBus (); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showRequest", this, SIGNAL (showRequest (qulonglong))); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuAvailable", this, SLOT (menuAvailable (qulonglong))); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "clearMenus", this, SLOT (clearMenus ())); dbus.connect (KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuHidden", this, SIGNAL (menuHidden ())); } KWD::Decorator::~Decorator (void) { QMap ::ConstIterator it; for (it = mClients.begin (); it != mClients.end (); ++it) delete (*it); if (mDecorNormal) delete mDecorNormal; if (mDecorActive) delete mDecorActive; if (mSwitcher) delete mSwitcher; XDestroyWindow (QX11Info::display (), mCompositeWindow); delete mOptions; delete mPlugins; delete mConfig; delete mRootInfo; } bool KWD::Decorator::enableDecorations (Time timestamp) { QList ::ConstIterator it; unsigned int nchildren; WId *children; WId root, parent; long int select; mDmSnTimestamp = timestamp; if (!pluginManager ()->loadPlugin ("")) return false; updateAllShadowOptions (); KWD::trapXError (); (void) QApplication::desktop (); // trigger creation of desktop widget KWD::popXError (); updateShadow (); /* FIXME: Implement proper decoration lists and remove this */ mDecorNormal = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow (), 0, Window::Default); mDecorActive = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow (), 0, Window::DefaultActive); mActiveId = KWindowSystem::activeWindow (); connect (KWindowSystem::self (), SIGNAL (windowAdded (WId)), SLOT (handleWindowAdded (WId))); connect (KWindowSystem::self (), SIGNAL (windowRemoved (WId)), SLOT (handleWindowRemoved (WId))); connect (KWindowSystem::self (), SIGNAL (activeWindowChanged (WId)), SLOT (handleActiveWindowChanged (WId))); connect (KWindowSystem::self (), SIGNAL (windowChanged (WId, const unsigned long *)), SLOT (handleWindowChanged (WId, const unsigned long *))); foreach (WId id, KWindowSystem::windows ()) handleWindowAdded (id); /* Find the switcher and add it too * FIXME: Doing XQueryTree and then * XGetWindowProperty on every window * like this is really expensive, surely * there is a better way to do this */ XQueryTree (QX11Info::display (), QX11Info::appRootWindow (), &root, &parent, &children, &nchildren); for (unsigned int i = 0; i < nchildren; ++i) { if (KWD::readWindowProperty (children[i], Atoms::switchSelectWindow, &select)) { handleWindowAdded(children[i]); break; } } connect (Plasma::Theme::defaultTheme (), SIGNAL (themeChanged ()), SLOT (plasmaThemeChanged ())); // select for client messages XSelectInput (QX11Info::display (), QX11Info::appRootWindow (), SubstructureNotifyMask | StructureNotifyMask | PropertyChangeMask); return true; } void KWD::Decorator::updateAllShadowOptions (void) { updateShadowProperties (QX11Info::appRootWindow ()); } void KWD::Decorator::changeShadowOptions (decor_shadow_options_t *aopt, decor_shadow_options_t *iopt) { bool changed = false; if (memcmp (aopt, &mActiveShadowOptions, sizeof (decor_shadow_options_t))) { mActiveShadowOptions = *aopt; changed = true; } if (memcmp (aopt, &mInactiveShadowOptions, sizeof (decor_shadow_options_t))) { mInactiveShadowOptions = *iopt; changed = true; } if (changed) updateShadow (); } void KWD::Decorator::updateShadow (void) { Display *xdisplay = QX11Info::display (); Screen *xscreen; decor_context_t context; xscreen = ScreenOfDisplay (xdisplay, QX11Info::appScreen ()); if (mNoBorderShadow) decor_shadow_destroy (xdisplay, mNoBorderShadow); mNoBorderShadow = decor_shadow_create (xdisplay, xscreen, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, &mActiveShadowOptions, &context, decor_draw_simple, 0); if (mNoBorderShadow) { decor_extents_t extents = { 0, 0, 0, 0 }; long *data; unsigned int n = 1, frame_type = 0, frame_state = 0, frame_actions = 0; decor_quad_t quads[N_QUADS_MAX]; int nQuad; decor_layout_t layout; decor_get_default_layout (&context, 1, 1, &layout); nQuad = decor_set_lSrStSbS_window_quads (quads, &context, &layout); data = decor_alloc_property (n, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, n - 1, mNoBorderShadow->pixmap, &extents, &extents, &extents, &extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); KWD::trapXError (); XChangeProperty (QX11Info::display (), QX11Info::appRootWindow (), Atoms::netWindowDecorBare, XA_INTEGER, 32, PropModeReplace, (unsigned char *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); KWD::popXError (); free (data); } } void KWD::Decorator::updateShadowProperties (WId id) { int nItems; long *data; double aradius, aopacity; int axOffset, ayOffset; double iradius, iopacity; int ixOffset, iyOffset; QVector shadowColor; if (id != QX11Info::appRootWindow ()) return; void *propData = KWD::readXProperty (id, Atoms::compizShadowInfo, XA_INTEGER, &nItems); if (nItems != 4) return; data = reinterpret_cast (propData); aradius = data[0]; aopacity = data[1]; /* We multiplied by 1000 in compiz to keep * precision, now divide by that much */ aradius /= 1000; aopacity /= 1000; axOffset = data[2]; ayOffset = data[3]; iradius = data[4]; iopacity = data[5]; /* We multiplied by 1000 in compiz to keep * precision, now divide by that much */ iradius /= 1000; iopacity /= 1000; ixOffset = data[6]; iyOffset = data[7]; shadowRadiusChanged (aradius, iradius); shadowOpacityChanged (aopacity, iopacity); shadowXOffsetChanged (axOffset, ixOffset); shadowYOffsetChanged (ayOffset, iyOffset); shadowColor = KWD::readPropertyString (id, Atoms::compizShadowColor); if (shadowColor.size () == 2) shadowColorChanged (shadowColor.at (0), shadowColor.at (1)); XFree (propData); } bool KWD::Decorator::x11EventFilter (XEvent *xevent) { KWD::Window *client; int status; switch (xevent->type) { case ConfigureNotify: { XConfigureEvent *xce = reinterpret_cast (xevent); if (mFrames.contains (xce->window)) mFrames[xce->window]->updateFrame (xce->window); } break; case SelectionRequest: decor_handle_selection_request (QX11Info::display (), xevent, mDmSnTimestamp); break; case SelectionClear: status = decor_handle_selection_clear (QX11Info::display (), xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) KApplication::exit (0); break; case CreateNotify: /* We only care about windows that aren't managed here */ if (!KWindowSystem::hasWId (xevent->xcreatewindow.window)) { WId select; KWD::trapXError (); XSelectInput (QX11Info::display (), xevent->xcreatewindow.window, StructureNotifyMask | PropertyChangeMask); KWD::popXError (); if (KWD::readWindowProperty (xevent->xcreatewindow.window, Atoms::switchSelectWindow, (long *) &select)) handleWindowAdded (xevent->xcreatewindow.window); } case PropertyNotify: if (xevent->xproperty.atom == Atoms::netInputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::netOutputFrameWindow) { handleWindowAdded (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::compizShadowInfo || xevent->xproperty.atom == Atoms::compizShadowColor) { updateShadowProperties (xevent->xproperty.window); } else if (xevent->xproperty.atom == Atoms::switchSelectWindow) { WId id = xevent->xproperty.window; if (!mSwitcher || mSwitcher->xid () != id) handleWindowAdded (id); mSwitcher->update (); } else if (xevent->xproperty.atom == Atoms::netWmWindowOpacity) { if (mClients.contains (xevent->xproperty.window)) mClients[xevent->xproperty.window]->updateOpacity (); } break; case EnterNotify: { XCrossingEvent *xce = reinterpret_cast (xevent); QWidget *child; if (!mFrames.contains (xce->window)) break; client = mFrames[xce->window]; if (!client->decorWidget ()) break; child = client->childAt (xce->x, xce->y); if (child) { QEvent qe (QEvent::Enter); QApplication::sendEvent (child, &qe); client->setActiveChild (child); client->updateCursor (QPoint (xce->x, xce->y)); } } break; case LeaveNotify: { XCrossingEvent *xce = reinterpret_cast (xevent); if (mFrames.contains (xce->window)) { QEvent qe (QEvent::Leave); client = mFrames[xce->window]; if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qe); XUndefineCursor (QX11Info::display (), client->frameId ()); } } break; case MotionNotify: { XMotionEvent *xme = reinterpret_cast (xevent); QWidget *child; if (!mFrames.contains (xme->window)) break; client = mFrames[xme->window]; if (!client->decorWidget ()) break; child = client->childAt (xme->x, xme->y); if (child) { QPoint qp (xme->x, xme->y); if (child != client->activeChild ()) { QEvent qee (QEvent::Enter); QEvent qle (QEvent::Leave); if (client->activeChild ()) QApplication::sendEvent (client->activeChild (), &qle); QApplication::sendEvent (child, &qee); client->setActiveChild (child); } if (client->decorWidget () != child) qp = child->mapFrom (client->decorWidget (), qp); QMouseEvent qme (QEvent::MouseMove, qp, Qt::NoButton, Qt::NoButton, Qt::NoModifier); QApplication::sendEvent (child, &qme); client->updateCursor (QPoint (xme->x, xme->y)); } } break; case ButtonPress: case ButtonRelease: { XButtonEvent *xbe = reinterpret_cast (xevent); QWidget *child; if (!mFrames.contains (xbe->window)) break; client = mFrames[xbe->window]; if (!client->decorWidget ()) break; child = client->childAt (xbe->x, xbe->y); if (child) { XButtonEvent xbe2 = *xbe; xbe2.window = child->winId (); QPoint p; p = client->mapToChildAt (QPoint (xbe->x, xbe->y)); xbe2.x = p.x (); xbe2.y = p.y (); p = child->mapToGlobal(p); xbe2.x_root = p.x (); xbe2.y_root = p.y (); client->setFakeRelease (false); QApplication::x11ProcessEvent ((XEvent *) &xbe2); /* We won't get a button release event, because of the screengrabs in compiz */ if (client->getFakeRelease () && xevent->type == ButtonPress) { xbe2.type = ButtonRelease; QApplication::x11ProcessEvent ((XEvent *) &xbe2); } return true; } } break; case ClientMessage: if (xevent->xclient.message_type == Atoms::toolkitActionAtom) { unsigned long action; action = xevent->xclient.data.l[0]; if (action == Atoms::toolkitActionWindowMenuAtom) { if (mClients.contains (xevent->xclient.window)) { QPoint pos; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) { pos = QPoint (xevent->xclient.data.l[3], xevent->xclient.data.l[4]); } else { pos = client->clientGeometry ().topLeft (); } client->showWindowMenu (pos); } } else if (action == Atoms::toolkitActionForceQuitDialogAtom) { if (mClients.contains (xevent->xclient.window)) { Time timestamp = xevent->xclient.data.l[1]; client = mClients[xevent->xclient.window]; if (xevent->xclient.data.l[2]) client->showKillProcessDialog (timestamp); else client->hideKillProcessDialog (); } } } break; default: break; } return KApplication::x11EventFilter (xevent); } void KWD::Decorator::reconfigure (void) { unsigned long changed; mConfig->reparseConfiguration (); changed = mOptions->updateSettings (); if (mPlugins->reset (changed)) { QMap < WId, KWD::Window * >::ConstIterator it; updateShadow (); mDecorNormal->reloadDecoration (); mDecorActive->reloadDecoration (); for (it = mClients.constBegin (); it != mClients.constEnd (); ++it) it.value ()->reloadDecoration (); mPlugins->destroyPreviousPlugin (); } } void KWD::Decorator::handleWindowAdded (WId id) { QMap ::ConstIterator it; KWD::Window *client = 0; WId select, frame = 0; WId oframe = 0, iframe = 0; KWD::Window::Type type = KWD::Window::Normal; QWidgetList widgets; QRect geometry; /* avoid adding any of our own top level windows */ foreach (QWidget *widget, QApplication::topLevelWidgets ()) { if (widget->winId () == id) return; } if (KWD::readWindowProperty (id, Atoms::switchSelectWindow, (long *) &select)) { if (!mSwitcher) mSwitcher = new Switcher (mCompositeWindow, id); if (mSwitcher->xid () != id) { delete mSwitcher; mSwitcher = new Switcher (mCompositeWindow, id); } geometry = mSwitcher->geometry (); frame = None; } else { KWindowInfo wInfo; KWD::trapXError (); wInfo = KWindowSystem::windowInfo (id, NET::WMGeometry); if (KWD::popXError ()) return; if (!wInfo.valid ()) return; KWD::readWindowProperty (id, Atoms::netInputFrameWindow, (long *) &iframe); KWD::readWindowProperty (id, Atoms::netOutputFrameWindow, (long *) &oframe); geometry = wInfo.geometry (); wInfo = KWindowSystem::windowInfo (id, NET::WMWindowType, 0); switch (wInfo.windowType (~0)) { case NET::Normal: case NET::Dialog: case NET::Toolbar: case NET::Menu: case NET::Utility: case NET::Splash: case NET::Unknown: /* decorate these window types */ break; default: return; } if (iframe) { type = KWD::Window::Normal; frame = iframe; } else { type = KWD::Window::Normal2D; frame = oframe; } } KWD::trapXError (); XSelectInput (QX11Info::display (), id, StructureNotifyMask | PropertyChangeMask); KWD::popXError (); if (frame) { XWindowAttributes attr; KWD::trapXError (); XGetWindowAttributes (QX11Info::display (), frame, &attr); if (KWD::popXError ()) frame = None; } if (frame) { if (!mClients.contains (id)) { client = new KWD::Window (mCompositeWindow, id, frame, type, geometry); mClients.insert (id, client); mFrames.insert (frame, client); } else { client = mClients[id]; mFrames.remove (client->frameId ()); mFrames.insert (frame, client); client->updateFrame (frame); } if (mWindowsMenu.removeOne (id)) mClients[id]->setAppMenuAvailable (); } else { if (mClients.contains (id)) client = mClients[id]; if (client) { mClients.remove (client->windowId ()); mFrames.remove (client->frameId ()); delete client; } } } void KWD::Decorator::handleWindowRemoved (WId id) { KWD::Window *window = 0; if (mClients.contains (id)) window = mClients[id]; else if (mFrames.contains (id)) window = mFrames[id]; if (window) { mClients.remove (window->windowId ()); mFrames.remove (window->frameId ()); delete window; } if (mSwitcher && mSwitcher->xid () == id) { delete mSwitcher; mSwitcher = NULL; } } void KWD::Decorator::handleActiveWindowChanged (WId id) { if (id != mActiveId) { KWD::Window *newActiveWindow = 0; KWD::Window *oldActiveWindow = 0; if (mClients.contains (id)) newActiveWindow = mClients[id]; if (mClients.contains (mActiveId)) oldActiveWindow = mClients[mActiveId]; mActiveId = id; if (oldActiveWindow) oldActiveWindow->handleActiveChange (); if (newActiveWindow) newActiveWindow->handleActiveChange (); } } void KWD::Decorator::handleWindowChanged (WId id, const unsigned long *properties) { KWD::Window *client; if (mSwitcher && mSwitcher->xid () == id) { if (properties[0] & NET::WMGeometry) mSwitcher->updateGeometry (); return; } if (!mClients.contains (id)) return; client = mClients[id]; if (properties[0] & NET::WMName) client->updateName (); if (properties[0] & NET::WMVisibleName) client->updateName (); if (properties[0] & NET::WMState) client->updateState (); if (properties[0] & NET::WMIcon) client->updateIcons (); if (properties[0] & NET::WMGeometry) client->updateWindowGeometry (); } void KWD::Decorator::sendClientMessage (WId eventWid, WId wid, Atom atom, Atom value, long data1, long data2, long data3) { XEvent ev; long mask = 0; memset (&ev, 0, sizeof (ev)); ev.xclient.type = ClientMessage; ev.xclient.window = wid; ev.xclient.message_type = atom; ev.xclient.format = 32; ev.xclient.data.l[0] = value; ev.xclient.data.l[1] = QX11Info::appTime (); ev.xclient.data.l[2] = data1; ev.xclient.data.l[3] = data2; ev.xclient.data.l[4] = data3; if (eventWid == QX11Info::appRootWindow ()) mask = SubstructureRedirectMask | SubstructureNotifyMask; KWD::trapXError (); XSendEvent (QX11Info::display (), eventWid, false, mask, &ev); KWD::popXError (); } void KWD::Decorator::shadowRadiusChanged (double value_active, double value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_radius = value_active; iopt.shadow_radius = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowOpacityChanged (double value_active, double value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_opacity = value_active; iopt.shadow_opacity = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowXOffsetChanged (int value_active, int value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_offset_x = value_active; iopt.shadow_offset_x = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowYOffsetChanged (int value_active, double value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); aopt.shadow_offset_y = value_active; iopt.shadow_offset_y = value_inactive; changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::shadowColorChanged (QString value_active, QString value_inactive) { decor_shadow_options_t aopt = *activeShadowOptions (); decor_shadow_options_t iopt = *inactiveShadowOptions (); int c[4]; if (sscanf (value_active.toAscii ().data (), "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { aopt.shadow_color[0] = c[0] << 8 | c[0]; aopt.shadow_color[1] = c[1] << 8 | c[1]; aopt.shadow_color[2] = c[2] << 8 | c[2]; } if (sscanf (value_inactive.toAscii ().data (), "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { iopt.shadow_color[0] = c[0] << 8 | c[0]; iopt.shadow_color[1] = c[1] << 8 | c[1]; iopt.shadow_color[2] = c[2] << 8 | c[2]; } changeShadowOptions (&aopt, &iopt); } void KWD::Decorator::plasmaThemeChanged () { if (mSwitcher) { WId win = mSwitcher->xid (); delete mSwitcher; mSwitcher = new Switcher (mCompositeWindow, win); } } void KWD::Decorator::showRequest (qulonglong id) { if (mClients.contains (id)) mClients[id]->emitShowRequest (); } void KWD::Decorator::menuAvailable (qulonglong id) { if (mClients.contains (id)) mClients[id]->setAppMenuAvailable (); else mWindowsMenu.append (id); } void KWD::Decorator::clearMenus () { QMap < WId, KWD::Window * >::ConstIterator it; for (it = mClients.constBegin (); it != mClients.constEnd (); ++it) it.value ()->setAppMenuUnavailable (); mWindowsMenu.clear (); } void KWD::Decorator::menuHidden (qulonglong id) { if (mClients.contains (id)) mClients[id]->emitMenuHidden (); } ./kde/window-decorator-kde4/Makefile.am0000644000004100000410000000226113246301623020157 0ustar www-datawww-dataif USE_KDE4 BUILDSOURCES = \ decorator.moc.cpp \ window.moc.cpp \ kwinadaptor.moc.cpp \ kwinadaptor.cpp \ kwinadaptor.h kde4_window_decorator_DEPENDENCIES = \ $(top_builddir)/libdecoration/libdecoration.la kde4_window_decorator_LDADD = \ $(top_builddir)/libdecoration/libdecoration.la \ @KDE4_WINDOW_DECORATOR_LIBS@ @KDE4_LIBS@ kde4_window_decorator_SOURCES = \ $(BUILDSOURCES) \ main.cpp \ utils.cpp \ utils.h \ decorator.cpp \ decorator.h \ window.cpp \ window.h \ options.cpp \ options.h \ kdecoration_plugins.cpp \ kdecoration_plugins.h \ switcher.cpp \ switcher.h \ org.kde.KWin.xml kde4_window_decorator_program = kde4-window-decorator INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include @KDE4_WINDOW_DECORATOR_CFLAGS@ @KDE4_CFLAGS@ bin_PROGRAMS = $(kde4_window_decorator_program) %.moc.cpp: %.h $(QT4_MOC) $< > $@ kwinadaptor.h: kwinadaptor.cpp kwinadaptor.cpp: org.kde.KWin.xml $(QDBUSXML2CPP) -a kwinadaptor -i decorator.h -l KWD::Decorator $< CLEANFILES = $(BUILDSOURCES) EXTRA_DIST = $(BUILDSOURCES) endif ./kde/window-decorator-kde4/kdecoration_plugins.h0000644000004100000410000000544513246301623022346 0ustar www-datawww-data/***************************************************************** This file is a copy of the KWin internal API. It allows the KDE4 window decorator the loading of KWin decoration plugins. Copyright © 2008 Dennis Kasprzyk ****************************************************************** This file is part of the KDE project. Copyright (C) 1999, 2000 Daniel M. Duley Copyright (C) 2003 Lubos Lunak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************/ #ifndef KWD_KDECORATION_PLUGINS_H #define KWD_KDECORATION_PLUGINS_H // // This header file is internal. I mean it. // #include #include #include "kdecoration.h" class KLibrary; class KDecoration; class KDecorationBridge; class KDecorationFactory; namespace KWD { class KDecorationPlugins : public KDecorationProvides { public: KDecorationPlugins(const KSharedConfigPtr &cfg); virtual ~KDecorationPlugins(); bool loadPlugin( QString name ); void destroyPreviousPlugin(); KDecorationFactory* factory(); KDecoration* createDecoration( KDecorationBridge* ); QString currentPlugin(); bool reset( unsigned long changed ); // returns true if decorations need to be recreated protected: virtual void error( const QString& error_msg ); QString defaultPlugin; // FRAME normalne protected? private: KDecorationFactory* (*create_ptr)(); KLibrary *library; KDecorationFactory* fact; KLibrary *old_library; KDecorationFactory* old_fact; QString pluginStr; KSharedConfigPtr config; }; /* Plugins API: KDecorationFactory* create_factory(); - called once after loading */ } /** @} */ #endif ./cmake/0000755000004100000410000000000013246301624012324 5ustar www-datawww-data./cmake/FindOpenGLES2.cmake0000644000004100000410000000246613246301623015574 0ustar www-datawww-data# - Try to find OpenGLES # Once done this will define # # OPENGLES2_FOUND - system has OpenGLES # OPENGLES2_INCLUDE_DIR - the GLES include directory # OPENGLES2_LIBRARY - the GLES library # OPENGLES2_LIBRARIES - Link this to use OpenGLES # FIND_PATH(OPENGLES2_INCLUDE_DIR GLES2/gl2.h /usr/openwin/share/include /opt/graphics/OpenGL/include /usr/X11R6/include /usr/include ) FIND_LIBRARY(OPENGLES2_LIBRARY NAMES GLESv2 PATHS /opt/graphics/OpenGL/lib /usr/openwin/lib /usr/shlib /usr/X11R6/lib /usr/lib ) FIND_LIBRARY(OPENGLES2_EGL_LIBRARY NAMES EGL PATHS /usr/shlib /usr/X11R6/lib /usr/lib ) # On Unix OpenGL most certainly always requires X11. # Feel free to tighten up these conditions if you don't # think this is always true. # It's not true on OSX. IF (OPENGLES2_LIBRARY) IF(NOT X11_FOUND) INCLUDE(FindX11) ENDIF(NOT X11_FOUND) IF (X11_FOUND) IF (NOT APPLE) SET (OPENGLES2_LIBRARIES ${X11_LIBRARIES}) ENDIF (NOT APPLE) ENDIF (X11_FOUND) ENDIF(OPENGLES2_LIBRARY) SET( OPENGLES2_FOUND "NO" ) IF(OPENGLES2_LIBRARY AND OPENGLES2_EGL_LIBRARY) SET( OPENGLES2_LIBRARIES ${OPENGLES2_LIBRARY} ${OPENGLES2_EGL_LIBRARY} ${OPENGLES2_LIBRARIES}) SET( OPENGLES2_FOUND "YES" ) ENDIF(OPENGLES2_LIBRARY AND OPENGLES2_EGL_LIBRARY) ./cmake/Findgcovr.cmake0000644000004100000410000000170213246301623015246 0ustar www-datawww-data# - Find gcovr scrip # Will define: # # GCOVR_EXECUTABLE - the gcovr script # # Uses: # # GCOVR_ROOT - root to search for the script # # Copyright (C) 2011 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(GCOVR_EXECUTABLE gcovr HINTS ${GCOVR_ROOT} "${GCOVR_ROOT}/bin") FIND_PACKAGE_HANDLE_STANDARD_ARGS(gcovr DEFAULT_MSG GCOVR_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(GCOVR_EXECUTABLE) ./cmake/CMakeLists.txt0000644000004100000410000000231113246301623015060 0ustar www-datawww-datacompiz_configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/CompizDefaults.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CompizDefaults.cmake ) set (_files CompizCommon.cmake CompizPlugin.cmake CompizPackage.cmake CompizBcop.cmake copy_file_install_user_env.cmake recompile_gsettings_schemas_in_dir_user_env.cmake ${CMAKE_CURRENT_BINARY_DIR}/CompizDefaults.cmake ) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenInstallData.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenInstallImages.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizOpenGLFixups.cmake) list (APPEND _files CompizGSettings.cmake) list (APPEND _PluginExtensionFiles plugin_extensions/CompizGenGSettings.cmake) install ( FILES ${_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/cmake ) install ( FILES ${_PluginExtensionFiles} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/compiz/cmake/plugin_extensions ) # Do not install src/compiz for a while until we've polished it up #install (DIRECTORY src/compiz # DESTINATION ${CMAKE_INSTALL_PREFIX}/src) if (COMPIZ_BUILD_TESTING) add_subdirectory (src) endif (COMPIZ_BUILD_TESTING) ./cmake/FindCompiz.cmake0000644000004100000410000000716413246301623015377 0ustar www-datawww-data################################################################################ # # FindCompiz # # This module finds Compiz (https://launchpad.net/compiz). It uses the FindPkgConfig to # locate Compiz and adds the Compiz CMake module path to the CMake module path. # It also loads the CompizDefaults that sets all variables to compile Compiz # modules. # # This module sets the following variables: # COMPIZ_FOUND ... set to true if compiz and its CompizDefaults macro # is found # # Variables set by the FindPkgConfig macro for compiz # COMPIZ_CMAKE_MODULE_PATH ... the path containing all other # compiz cmake modules # COMPIZ_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') # COMPIZ_LDFLAGS ... all required linker flags # COMPIZ_LDFLAGS_OTHER ... all other linker flags # COMPIZ_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') # COMPIZ_CFLAGS ... all required cflags # COMPIZ_CFLAGS_OTHER ... the other compiler flags # COMPIZ_VERSION ... version of the module # COMPIZ_PREFIX ... prefix-directory of the module # COMPIZ_INCLUDEDIR ... include-dir of the module # COMPIZ_LIBDIR ... lib-dir of the module # # If the _COMPIZ_INTERNAL variable is set to true, then this module will do # nothing. This is required for the Compiz core package build system. # # Author: Dennis Kasprzyk # ################################################################################ if (NOT _COMPIZ_INTERNAL) if (Compiz_FIND_REQUIRED) set (_req REQUIRED) endif () # look for pkg-config find_package (PkgConfig ${_req}) if (PKG_CONFIG_FOUND) # do we need to look for a specified version? set (_comp_ver) if (Compiz_FIND_VERSION) if (Compiz_FIND_VERSION_EXACT) set (_comp_ver "=${Compiz_FIND_VERSION}") else () set (_comp_ver ">=${Compiz_FIND_VERSION}") endif () endif () # add install prefix to pkgconfig search path if needed string (REGEX REPLACE "([\\+\\(\\)\\^\\\$\\.\\-\\*\\?\\|])" "\\\\\\1" PKGCONFIG_REGEX ${CMAKE_INSTALL_PREFIX}) set (PKGCONFIG_REGEX ".*${PKGCONFIG_REGEX}/lib/pkgconfig:${PKGCONFIG_REGEX}/share/pkgconfig.*") if (NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) if (NOT "$ENV{PKG_CONFIG_PATH}" MATCHES "${PKGCONFIG_REGEX}") if ("" STREQUAL "$ENV{PKG_CONFIG_PATH}") set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig") else () set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif () endif () endif (NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) # look for compiz pkg_check_modules (COMPIZ ${_req} "compiz${_comp_ver}") # COMPIZ_PREFIX is not set by default on all machines. The CMake docs # seem to vagely suggest this is normal in some cases for # pkg_check_modules. if (NOT COMPIZ_PREFIX) set (COMPIZ_PREFIX ${CMAKE_INSTALL_PREFIX}) endif () # is the CompizDefaults module installed? find_path(_compiz_def_macro CompizDefaults.cmake ${COMPIZ_PREFIX}/share/compiz/cmake) if (COMPIZ_FOUND AND _compiz_def_macro) # everything found. Set module path and include defaults module set (COMPIZ_CMAKE_MODULE_PATH ${COMPIZ_PREFIX}/share/compiz/cmake) set (CMAKE_MODULE_PATH ${COMPIZ_CMAKE_MODULE_PATH} ${CMAKE_MODULE_PATH}) include (CompizDefaults) else () set (COMPIZ_FOUND 0) endif () if (Compiz_FIND_REQUIRED AND NOT COMPIZ_FOUND) message (FATAL_ERROR "Unable to find Compiz ${_comp_ver}") endif () endif () endif () ./cmake/CompizTesting.cmake0000644000004100000410000000127113246301623016125 0ustar www-datawww-data# Based on gtest's GTEST_ADD_TESTS, but with run-with-xvfb.sh function(ENV_GTEST_ADD_TESTS executable extra_args) if(NOT ARGN) message(FATAL_ERROR "Missing ARGN") endif() foreach(source ${ARGN}) file(READ "${source}" contents) string(REGEX MATCHALL "TEST_?F?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) foreach(hit ${found_tests}) string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit}) add_test(${test_name} "/bin/bash" "${CMAKE_SOURCE_DIR}/scripts/run-with-xvfb.sh" "./${executable} --gtest_filter=${test_name} ${extra_args}") endforeach() endforeach() endfunction() ./cmake/copy_file_install_user_env.cmake0000644000004100000410000000103713246301623020733 0ustar www-datawww-dataset (FILE "" CACHE FORCE "File to Install") set (INSTALLDIR_USER "" CACHE FORCE "Installation dir if user") set (INSTALLDIR_ROOT "" CACHE FORCE "Installation dir if root") if (ENV{USER}) set (USERNAME $ENV{USER}) else (ENV${USER}) set (USERNAME "user") endif (ENV{USER}) if (${USERNAME} STREQUAL "root") set (INSTALLDIR ${INSTALLDIR_ROOT}) else (${USERNAME} STREQUAL "root") set (INSTALLDIR ${INSTALLDIR_USER}) endif (${USERNAME} STREQUAL "root") file (INSTALL DESTINATION ${INSTALLDIR} TYPE FILE FILES ${FILE}) ./cmake/CompizPackage.cmake0000644000004100000410000001026713246301623016050 0ustar www-datawww-datainclude (CompizCommon) function (compiz_package_generation _name) include(InstallRequiredSystemLibraries) set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "${_name}") set (CPACK_PACKAGE_VENDOR "Compiz") set (CPACK_PACKAGE_VERSION "${VERSION}") set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${VERSION}") set (CPACK_RPM_PACKAGE_SUMMARY ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}) set (CPACK_RPM_PACKAGE_NAME ${CPACK_PACKAGE_NAME}) set (CPACK_RPM_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION}) set (CPACK_RPM_PACKAGE_RELEASE 1) set (CPACK_RPM_PACKAGE_LICENCE "GPL") set (CPACK_RPM_PACKAGE_GROUP "unknown") set (CPACK_RPM_PACKAGE_VENDOR ${CPACK_PACKAGE_VENDOR}) set (CPACK_RPM_PACKAGE_DESCRIPTION "The blingiest window manager in the world") set (CPACK_SOURCE_GENERATOR "TGZ;TBZ2") set (CPACK_SOURCE_IGNORE_FILES "\\\\.#;/#;.*~") list (APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git") list (APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}") list (APPEND CPACK_SOURCE_IGNORE_FILES "legacy/") list (APPEND CPACK_SOURCE_IGNORE_FILES "\\\\.intltool-merge-cache") list (APPEND CPACK_SOURCE_IGNORE_FILES "/po/POTFILES$") list (APPEND CPACK_SOURCE_IGNORE_FILES "CMakeCache.txt") list (APPEND CPACK_SOURCE_IGNORE_FILES "CMakeFiles") include(CPack) #file (REMOVE "${CMAKE_BINARY_DIR}/CPackConfig.cmake") endfunction () function (compiz_print_configure_header _name) compiz_format_string ("${_name}" 40 _project) compiz_format_string ("${VERSION}" 40 _version) compiz_color_message ("\n${_escape}[40;37m************************************************************${_escape}[0m") compiz_color_message ("${_escape}[40;37m* ${_escape}[1;31mCompiz ${_escape}[0;40;34mBuildsystem${_escape}[0m${_escape}[40;37m *${_escape}[0m") compiz_color_message ("${_escape}[40;37m* *${_escape}[0m") compiz_color_message ("${_escape}[40;37m* Package : ${_escape}[32m${_project} ${_escape}[37m *${_escape}[0m") compiz_color_message ("${_escape}[40;37m* Version : ${_escape}[32m${_version} ${_escape}[37m *${_escape}[0m") compiz_color_message ("${_escape}[40;37m************************************************************${_escape}[0m") endfunction () function (compiz_print_configure_footer) compiz_color_message ("${_escape}[40;37m************************************************************${_escape}[0m\n") endfunction () function (compiz_print_plugin_stats _folder) compiz_color_message ("\n${_escape}[4mPlugin configure check results:${_escape}[0m\n") file ( GLOB _plugins_in RELATIVE "${_folder}" "${_folder}/*/CMakeLists.txt" ) list (SORT _plugins_in) foreach (_plugin ${_plugins_in}) file (READ "${_folder}/${_plugin}" _file) if (_file MATCHES "^.*compiz_plugin ?\\(([^\\)\r\n ]*).*$") string ( REGEX REPLACE "^.*compiz_plugin ?\\(([^\\)\r\n ]*).*$" "\\1" _plugin_name ${_file} ) else () get_filename_component (_plugin_name ${_plugin} PATH) endif () string (TOUPPER ${_plugin_name} _PLUGIN) compiz_format_string (${_plugin_name} 14 _plugin_name) if (NOT COMPIZ_ENABLED_PLUGIN_${_PLUGIN}) compiz_color_message (" ${_plugin_name}: ${_escape}[1;34mDisabled${_escape}[0m") else () if (COMPIZ_${_PLUGIN}_BUILD) compiz_color_message (" ${_plugin_name}: ${_escape}[1;32mYes${_escape}[0m") else () compiz_color_message (" ${_plugin_name}: ${_escape}[1;31mNo${_escape}[0m (Missing dependencies :${COMPIZ_${_PLUGIN}_MISSING_DEPS})") endif () endif () endforeach () message ("") endfunction () function (compiz_print_result_message _name _var) compiz_format_string ("${_name}" 30 __name) if (${_var}) set (_result "${_escape}[1;32mYes${_escape}[0m") else (${_var}) set (_result "${_escape}[1;31mNo${_escape}[0m") endif (${_var}) compiz_color_message (" ${__name} : ${_result}") endfunction (compiz_print_result_message) function (compiz_get_version_from_file) file (READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" _file) string ( REGEX REPLACE "^.*VERSION=([^\n]*).*$" "\\1" _version ${_file} ) set (VERSION ${_version} PARENT_SCOPE) endfunction () ./cmake/base.cmake0000644000004100000410000000670713246301623014251 0ustar www-datawww-datafunction (_print_configure_results) compiz_print_configure_header ("Compiz") compiz_color_message ("\n${_escape}[4mOptional features:${_escape}[0m\n") compiz_print_result_message ("GLESv2" USE_GLES) compiz_print_result_message ("gtk window decorator" USE_GTK) compiz_print_result_message ("metacity theme support" USE_METACITY) compiz_print_result_message ("gnome" USE_GNOME) compiz_print_result_message ("kde4 window decorator" USE_KDE4) compiz_print_result_message ("protocol buffers" USE_PROTOBUF) compiz_print_result_message ("file system change notifications" HAVE_INOTIFY) compiz_print_result_message ("Xig Tests" COMPIZ_XIG_TEST_FOUND) compiz_print_configure_footer () compiz_print_plugin_stats ("${CMAKE_SOURCE_DIR}/plugins") compiz_print_configure_footer () endfunction () function (_check_compiz_cmake_macro) find_file (_find_compiz FindCompiz.cmake PATHS ${CMAKE_ROOT}/Modules ${ARGN}) if (NOT _find_compiz) compiz_color_message ("${_escape}[1;31mWARNING:${_escape}[0m") message ("\"FindCompiz.cmake\" file not found in cmake module directories.") message ("It should be installed to allow building of external compiz packages.") message ("Call \"sudo make findcompiz_install\" to install it.\n") compiz_print_configure_footer () endif () install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindCompiz.cmake ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindOpenGLES2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/share/cmake-${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}/) add_custom_target (findcompiz_install ${CMAKE_COMMAND} -E make_directory ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/cmake/FindCompiz.cmake ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/cmake/FindOpenGLES2.cmake ${CMAKE_ROOT}/Modules ) find_file (_find_compizconfig FindCompizConfig.cmake PATHS ${CMAKE_ROOT}/Modules ${ARGN}) if (NOT _find_compizconfig) compiz_color_message ("${_escape}[1;31mWARNING:${_escape}[0m") message ("\"FindCompizConfig.cmake\" file not found in cmake module directories.") message ("It should be installed to allow building of external compiz packages.") message ("Call \"sudo make findcompiz_install\" to install it.\n") compiz_print_configure_footer () endif (NOT _find_compizconfig) install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig/libcompizconfig/cmake/FindCompizConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/share/cmake-${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}/) add_custom_target ( findcompizconfig_install ${CMAKE_COMMAND} -E make_directory ${CMAKE_ROOT}/Modules && ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/compizconfig/libcompizconfig/cmake/FindCompizConfig.cmake ${CMAKE_ROOT}/Modules ) endfunction () # add install prefix to pkgconfig search path if needed string (REGEX REPLACE "([\\+\\(\\)\\^\\\$\\.\\-\\*\\?\\|])" "\\\\\\1" PKGCONFIG_REGEX ${CMAKE_INSTALL_PREFIX}) set (PKGCONFIG_REGEX ".*${PKGCONFIG_REGEX}/lib/pkgconfig:${PKGCONFIG_REGEX}/share/pkgconfig.*") if (NOT "$ENV{PKG_CONFIG_PATH}" MATCHES "${PKGCONFIG_REGEX}") if ("" STREQUAL "$ENV{PKG_CONFIG_PATH}") set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig") else () set (ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/share/pkgconfig:$ENV{PKG_CONFIG_PATH}") endif () endif () ./cmake/CompizPlugin.cmake0000644000004100000410000003605313246301623015754 0ustar www-datawww-data####################################################################### # # Generic Compiz Fusion plugin cmake module # # Copyright : (C) 2008 by Dennis Kasprzyk # E-mail : onestone@opencompositing.org # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # ####################################################################### # # This module provides the following macro: # # compiz_plugin ( # [PKGDEPS dep1 dep2 ...] # [PLUGINDEPS plugin1 plugin2 ...] # [LDFLAGSADD flag1 flag2 ...] # [CFLAGSADD flag1 flag2 ...] # [LIBRARIES lib1 lib2 ...] # [LIBDIRS dir1 dir2 ...] # [INCDIRS dir1 dir2 ...]) # # PKGDEPS = pkgconfig dependencies # PLUGINDEPS = compiz plugin dependencies # LDFLAGSADD = flags added to the link command # CFLAGSADD = flags added to the compile command # LIBRARIES = libraries added to link command # LIBDIRS = additional link directories # INCDIRS = additional include directories # NOINSTALL = do not install this plugin # # The following variables will be used by this macro: # # BUILD_GLOBAL=true Environment variable to install a plugin # into the compiz directories # # COMPIZ_PLUGIN_INSTALL_TYPE = (package | compiz | local (default)) # package = Install into ${CMAKE_INSTALL_PREFIX} # compiz = Install into compiz prefix (BUILD_GLOBAL=true) # local = Install into home directory # # COMPIZ_I18N_DIR = Translation file directory # # VERSION = package version that is added to a plugin pkg-version file # ####################################################################### include (CompizCommon) include (CompizBcop) if (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} CACHE PATH "prefix") set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir") set (libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX} CACHE PATH "libdir") set (includedir ${CMAKE_INSTALL_PREFIX}/include CACHE PATH "includedir") set (datadir ${CMAKE_INSTALL_PREFIX}/share CACHE PATH "datadir") else (COMPIZ_PACKAGING_ENABLED) set (prefix ${CMAKE_INSTALL_PREFIX} ) set (exec_prefix ${CMAKE_INSTALL_PREFIX}/bin ) set (libdir ${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}) set (includedir ${CMAKE_INSTALL_PREFIX}/include ) set (datadir ${CMAKE_INSTALL_PREFIX}/share ) endif (COMPIZ_PACKAGING_ENABLED) ### Set up core lib dependences so this in correctly imported into plugins set (COMPIZ_REQUIRES x11 xext xdamage xcomposite x11-xcb xrandr xinerama xext ice sm libxml-2.0 libxslt "libstartup-notification-1.0 >= 0.7" ) compiz_pkg_check_modules (COMPIZ REQUIRED ${COMPIZ_REQUIRES}) list (APPEND COMPIZ_LIBRARIES ${Boost_LIBRARIES}) # determinate installation directories macro (_prepare_directories) set (CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRe" CACHE INTERNAL "" FORCE) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") set (PLUGIN_BUILDTYPE global) set (PLUGIN_PREFIX ${CMAKE_INSTALL_PREFIX}) set (PLUGIN_LIBDIR ${libdir}/compiz) set (PLUGIN_INCDIR ${includedir}) set (PLUGIN_PKGDIR ${libdir}/pkgconfig) set (PLUGIN_XMLDIR ${datadir}/compiz) if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) endif (NOT CMAKE_BUILD_TYPE) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_BUILDTYPE global) set (PLUGIN_PREFIX ${COMPIZ_PREFIX}) set (PLUGIN_LIBDIR ${COMPIZ_LIBDIR}/compiz) set (PLUGIN_INCDIR ${COMPIZ_INCLUDEDIR}) set (PLUGIN_PKGDIR ${COMPIZ_LIBDIR}/pkgconfig) set (PLUGIN_XMLDIR ${COMPIZ_PREFIX}/share/compiz) if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) endif (NOT CMAKE_BUILD_TYPE) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_BUILDTYPE local) set (PLUGIN_PREFIX $ENV{HOME}/.compiz-1) set (PLUGIN_LIBDIR $ENV{HOME}/.compiz-1/plugins) set (PLUGIN_XMLDIR $ENV{HOME}/.compiz-1/metadata) if (NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (Debug/Release/RelWithDebInfo/MinSizeRe)" FORCE) endif (NOT CMAKE_BUILD_TYPE) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (_prepare_directories) # check plugin dependencies macro (_check_plugin_plugin_deps _prefix) set (${_prefix}_HAS_PLUGIN_DEPS TRUE) foreach (_val ${ARGN}) string (TOUPPER ${_val} _name) find_file ( _plugin_dep_${_val} compiz-${_val}.pc.in PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../${_val} NO_DEFAULT_PATH ) if (_plugin_dep_${_val}) file (RELATIVE_PATH _relative ${CMAKE_CURRENT_SOURCE_DIR} ${_plugin_dep_${_val}}) get_filename_component (_plugin_inc_dir ${_relative} PATH) list (APPEND ${_prefix}_LOCAL_INCDIRS "${_plugin_inc_dir}/include") list (APPEND ${_prefix}_LOCAL_LIBRARIES ${_val}) else () # fallback to pkgconfig compiz_pkg_check_modules (_${_name} compiz-${_val}) if (_${_name}_FOUND) list (APPEND ${_prefix}_PKG_LIBDIRS "${_${_name}_LIBRARY_DIRS}") list (APPEND ${_prefix}_PKG_LIBRARIES "${_${_name}_LIBRARIES}") list (APPEND ${_prefix}_PKG_INCDIRS "${_${_name}_INCLUDE_DIRS}") else () set (${_prefix}_HAS_PLUGIN_DEPS FALSE) compiz_set (COMPIZ_${_prefix}_MISSING_DEPS "${COMPIZ_${_prefix}_MISSING_DEPS} compiz-${_val}") endif () endif () compiz_set (_plugin_dep_${_val} "${_plugin_dep_${_val}}") endforeach () endmacro () # main function macro (_build_compiz_plugin plugin) string (TOUPPER ${plugin} _PLUGIN) if (COMPIZ_PLUGIN_INSTALL_TYPE) set ( COMPIZ_PLUGIN_INSTALL_TYPE ${COMPIZ_PLUGIN_INSTALL_TYPE} CACHE STRING "Where a plugin should be installed \(package | compiz | local\)" ) else (COMPIZ_PLUGIN_INSTALL_TYPE) set ( COMPIZ_PLUGIN_INSTALL_TYPE "local" CACHE STRING "Where a plugin should be installed \(package | compiz | local\)" ) endif (COMPIZ_PLUGIN_INSTALL_TYPE) set (_install_plugin_${plugin} ON) foreach (ARG ${ARGN}) if (${ARG} STREQUAL "NOINSTALL") set (_install_plugin_${plugin} OFF) endif (${ARG} STREQUAL "NOINSTALL") endforeach () _get_parameters (${_PLUGIN} ${ARGN}) _prepare_directories () find_file ( _${plugin}_xml_in ${plugin}.xml.in PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH ) if (_${plugin}_xml_in) set (_${plugin}_xml ${_${plugin}_xml_in}) else () find_file ( _${plugin}_xml ${plugin}.xml PATHS ${CMAKE_CURRENT_SOURCE_DIR} } NO_DEFAULT_PATH ) endif () set (${_PLUGIN}_HAS_PKG_DEPS) set (${_PLUGIN}_HAS_PLUGIN_DEPS) # check dependencies compiz_unset (COMPIZ_${_PLUGIN}_MISSING_DEPS) _check_plugin_plugin_deps (${_PLUGIN} ${${_PLUGIN}_PLUGINDEPS}) _check_pkg_deps (${_PLUGIN} ${${_PLUGIN}_PKGDEPS}) if (${_PLUGIN}_HAS_PKG_DEPS AND ${_PLUGIN}_HAS_PLUGIN_DEPS) compiz_set (COMPIZ_${_PLUGIN}_BUILD TRUE PARENT_SCOPE) if (NOT EXISTS ${CMAKE_BINARY_DIR}/generated) file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated) endif (NOT EXISTS ${CMAKE_BINARY_DIR}/generated) if (_${plugin}_xml_in) # translate xml compiz_translate_xml ( ${_${plugin}_xml_in} "${CMAKE_BINARY_DIR}/generated/${plugin}.xml") set (_translation_sources "${CMAKE_BINARY_DIR}/generated/${plugin}.xml") set (_translated_xml ${CMAKE_BINARY_DIR}/generated/${plugin}.xml) else () if (_${plugin}_xml) set (_translated_xml ${_${plugin}_xml}) endif () endif () if (_${plugin}_xml) # do we need bcop for our plugin compiz_plugin_needs_bcop (${_${plugin}_xml} _needs_bcop) if (_needs_bcop) # initialize everything we need for bcop compiz_add_bcop_targets (${plugin} ${_${plugin}_xml} _bcop_sources) endif () endif () if (_translated_xml) if (_install_plugin_${plugin}) # install xml install ( FILES ${_translated_xml} DESTINATION $ENV{DESTDIR}${PLUGIN_XMLDIR} ) endif (_install_plugin_${plugin}) endif (_translated_xml) find_file ( _${plugin}_pkg compiz-${plugin}.pc.in PATHS ${CMAKE_CURRENT_SOURCE_DIR} NO_DEFAULT_PATH ) set (COMPIZ_CURRENT_PLUGIN ${plugin}) set (COMPIZ_CURRENT_XML_FILE ${_translated_xml}) # find extension files file (GLOB _extension_files "${COMPIZ_CMAKE_MODULE_PATH}/plugin_extensions/*.cmake") foreach (_file ${_extension_files}) include (${_file}) endforeach () # generate pkgconfig file and install it and the plugin header file if (_${plugin}_pkg AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include/${plugin}) if ("${PLUGIN_BUILDTYPE}" STREQUAL "local") message (STATUS "[WARNING] The plugin ${plugin} might be needed by other plugins. Install it systemwide.") else () set (prefix ${PLUGIN_PREFIX}) set (libdir ${PLUGIN_LIBDIR}) set (includedir ${PLUGIN_INCDIR}) if (NOT VERSION) set (VERSION 0.0.1-git) endif (NOT VERSION) #add CFLAGSADD so pkg-config file has correct flags set (COMPIZ_CFLAGS ${COMPIZ_CFLAGS} ${${_PLUGIN}_CFLAGSADD}) compiz_configure_file ( ${_${plugin}_pkg} ${CMAKE_BINARY_DIR}/generated/compiz-${plugin}.pc COMPIZ_REQUIRES COMPIZ_CFLAGS PKGCONFIG_LIBS ) if (_install_plugin_${plugin}) install ( FILES ${CMAKE_BINARY_DIR}/generated/compiz-${plugin}.pc DESTINATION ${PLUGIN_PKGDIR} ) install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/${plugin} DESTINATION ${PLUGIN_INCDIR}/compiz ) endif () endif () endif () # find files for build file (GLOB _h_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h") file (GLOB _h_ins_files "${CMAKE_CURRENT_SOURCE_DIR}/include/${plugin}/*.h") file (GLOB _cpp_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") # set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs") # set (_cflags "-Wall -Wpointer-arith -fno-strict-aliasing") add_definitions (-DPREFIX='\"${PLUGIN_PREFIX}\"' ${COMPIZ_DEFINITIONS_ADD}) foreach (_def ${_PLUGIN}_DEFSADD) add_definitions (-D${_def}) endforeach (_def) # Need to know the include-dirs for the internal # modules to this plugin, core (if built with core) # and any other plugins that we depend on get_property (${_PLUGIN}_MOD_INCLUDE_DIRS GLOBAL PROPERTY ${_PLUGIN}_MOD_INCLUDE_DIRS) get_property (CORE_MOD_INCLUDE_DIRS GLOBAL PROPERTY CORE_MOD_INCLUDE_DIRS) foreach (_plugindep ${${_PLUGIN}_PLUGINDEPS}) string (TOUPPER ${_plugindep} _PLUGINDEP) get_property (${_PLUGINDEP}_MOD_INCLUDE_DIRS GLOBAL PROPERTY ${_PLUGINDEP}_MOD_INCLUDE_DIRS) list (APPEND ${_PLUGIN}_PLUGINDEP_MOD_INCLUDE_DIRS ${${_PLUGINDEP}_MOD_INCLUDE_DIRS}) endforeach (_plugindep) include_directories ( ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/generated ${${_PLUGIN}_LOCAL_INCDIRS} ${${_PLUGIN}_PKG_INCDIRS} ${${_PLUGIN}_INCDIRS} ${COMPIZ_INCLUDE_DIRS} ${PLUGIN_PREFIX}/include ${CMAKE_INCLUDE_PATH} ${${_PLUGIN}_MOD_INCLUDE_DIRS} ${CORE_MOD_INCLUDE_DIRS} ${${_PLUGIN}_PLUGINDEP_MOD_INCLUDE_DIRS} ) get_property (${_PLUGIN}_MOD_LIBRARY_DIRS GLOBAL PROPERTY ${_PLUGIN}_MOD_LIBRARY_DIRS) set (SYSTEM_LINK_DIRS "/usr/lib" "/usr/lib32" "/usr/lib64" "/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}") link_directories ( ${COMPIZ_LINK_DIRS} ${${_PLUGIN}_PKG_LIBDIRS} ${${_PLUGIN}_LIBDIRS} ${COMPIZ_LIBDIR} ${PLUGIN_LIBDIR} ${${_PLUGIN}_MOD_LIBRARY_DIRS} ${SYSTEM_LINK_DIRS} ) add_library ( ${plugin} SHARED ${_cpp_files} ${_h_files} ${_h_ins_files} ${_bcop_sources} ${_translation_sources} ${COMPIZ_CURRENT_SOURCES_ADDS} ) if (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${plugin} PROPERTIES INSTALL_RPATH_USE_LINK_PATH 1 BUILD_WITH_INSTALL_RPATH 1 SKIP_BUILD_RPATH 0 COMPILE_FLAGS "${${_PLUGIN}_CFLAGSADD}" LINK_FLAGS "${${_PLUGIN}_LDFLAGSADD}" ) else (COMPIZ_BUILD_WITH_RPATH) set_target_properties ( ${plugin} PROPERTIES INSTALL_RPATH_USE_LINK_PATH 0 SKIP_BUILD_RPATH 1 INSTALL_RPATH "${COMPIZ_LIBDIR}/compiz" COMPILE_FLAGS "${${_PLUGIN}_CFLAGSADD}" LINK_FLAGS "${${_PLUGIN}_LDFLAGSADD}" ) endif (COMPIZ_BUILD_WITH_RPATH) get_property (${_PLUGIN}_MOD_LIBRARIES GLOBAL PROPERTY ${_PLUGIN}_MOD_LIBRARIES) target_link_libraries ( ${plugin} ${COMPIZ_LIBRARIES} ${${_PLUGIN}_LOCAL_LIBRARIES} ${${_PLUGIN}_PKG_LIBRARIES} ${${_PLUGIN}_LIBRARIES} ${${_PLUGIN}_MOD_LIBRARIES} compiz_core ) if (_install_plugin_${plugin}) install ( TARGETS ${plugin} LIBRARY DESTINATION ${PLUGIN_LIBDIR} ) endif (_install_plugin_${plugin}) if (NOT _COMPIZ_INTERNAL AND _install_plugin_${plugin}) compiz_add_uninstall () endif (NOT _COMPIZ_INTERNAL AND _install_plugin_${plugin}) if (NOT COMPIZ_PLUGIN_PACK_BUILD) set (CMAKE_PROJECT_NAME plugin-${plugin}) if (EXISTS ${CMAKE_SOURCE_DIR}/VERSION) file (READ ${CMAKE_SOURCE_DIR}/VERSION COMPIZ_RELEASE_VERSION LIMIT 12 OFFSET 0) endif (EXISTS ${CMAKE_SOURCE_DIR}/VERSION) if (NOT COMPIZ_RELEASE_VERSION) set (COMPIZ_RELEASE_VERSION "0.0.1-git") endif (NOT COMPIZ_RELEASE_VERSION) string (STRIP ${COMPIZ_RELEASE_VERSION} COMPIZ_RELEASE_VERSION) set (VERSION ${COMPIZ_RELEASE_VERSION}) compiz_add_git_dist () compiz_add_release () compiz_add_distcheck () compiz_add_release_signoff () endif (NOT COMPIZ_PLUGIN_PACK_BUILD) else () message (STATUS "[WARNING] One or more dependencies for compiz plugin ${plugin} not found. Skipping plugin.") message (STATUS "Missing dependencies :${COMPIZ_${_PLUGIN}_MISSING_DEPS}") compiz_set (COMPIZ_${_PLUGIN}_BUILD FALSE) endif () endmacro () macro (compiz_plugin plugin) string (TOUPPER ${plugin} _PLUGIN) # If already defined, use the existing value... if (NOT DEFINED COMPIZ_DISABLE_PLUGIN_${_PLUGIN}) set (COMPIZ_DISABLE_PLUGIN_${_PLUGIN} OFF) endif () option ( COMPIZ_DISABLE_PLUGIN_${_PLUGIN} "Disable building of plugin \"${plugin}\"" ${COMPIZ_DISABLE_PLUGIN_${_PLUGIN}} ) if (NOT COMPIZ_DISABLE_PLUGIN_${_PLUGIN}) _build_compiz_plugin (${plugin} ${ARGN}) endif (NOT COMPIZ_DISABLE_PLUGIN_${_PLUGIN}) endmacro () ./cmake/src/0000755000004100000410000000000013246301623013112 5ustar www-datawww-data./cmake/src/CMakeLists.txt0000644000004100000410000000003213246301623015645 0ustar www-datawww-dataadd_subdirectory (compiz) ./cmake/src/compiz/0000755000004100000410000000000013246301623014413 5ustar www-datawww-data./cmake/src/compiz/CMakeLists.txt0000644000004100000410000000056713246301623017163 0ustar www-datawww-dataadd_executable (compiz_discover_gtest_tests EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/compiz_discover_gtest_tests.cpp) if (BUILD_XORG_GTEST) add_dependencies (compiz_discover_gtest_tests xorg_gtest_wrapper) endif (BUILD_XORG_GTEST) set_target_properties (compiz_discover_gtest_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/compiz_gtest) ./cmake/src/compiz/compiz_discover_gtest_tests.cpp0000644000004100000410000000414513246301623022752 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include #include using namespace std; int usage () { cout << "Usage: PATH_TO_TEST_BINARY --gtest_list_tests | ./build_test_cases PATH_TO_TEST_BINARY --wrapper PATH_TO_WRAPPER" << endl; return 1; } int main (int argc, char **argv) { string testBinary; string wrapperBinary; cin >> noskipws; if (argc == 2) testBinary = string (argv[1]); else if (argc == 4 && string (argv[2]) == "--wrapper") { testBinary = string (argv[1]); wrapperBinary = string (argv[3]); } else return usage (); map > testCases; string line; string currentTestCase; while (getline (cin, line)) { /* Is test case */ if (line.find (" ") == 0) testCases[currentTestCase].push_back (currentTestCase + line.substr (2)); else currentTestCase = line; } ofstream testfilecmake; char *base = basename (argv[1]); string gtestName (base); testfilecmake.open (string (gtestName + "_test.cmake").c_str (), ios::out | ios::trunc); if (testfilecmake.is_open ()) { for (map >::iterator it = testCases.begin (); it != testCases.end (); ++it) { for (vector ::iterator jt = it->second.begin (); jt != it->second.end (); ++jt) { if (testfilecmake.good ()) { stringstream addTest, escapedWrapper, escapedTest, testExec, gTestFilter, endParen; addTest << "ADD_TEST ("; if (wrapperBinary.size ()) escapedWrapper << " \"" << wrapperBinary << "\""; escapedTest << " \"" << testBinary << "\""; testExec << escapedWrapper.str () << escapedTest.str (); gTestFilter << " \"--gtest_filter="; endParen << "\")"; std::string testName = jt->substr(0, jt->find("#")); testfilecmake << addTest.str () << testName << testExec.str () << gTestFilter.str () << testName << endParen.str () << endl; } } } testfilecmake.close (); } return 0; } ./cmake/FindLcov.cmake0000644000004100000410000000172013246301623015031 0ustar www-datawww-data# - Find lcov # Will define: # # LCOV_EXECUTABLE - the lcov binary # GENHTML_EXECUTABLE - the genhtml executable # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(FindPackageHandleStandardArgs) FIND_PROGRAM(LCOV_EXECUTABLE lcov) FIND_PROGRAM(GENHTML_EXECUTABLE genhtml) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lcov DEFAULT_MSG LCOV_EXECUTABLE GENHTML_EXECUTABLE) # only visible in advanced view MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE) ./cmake/recompile_gsettings_schemas_in_dir_user_env.cmake0000644000004100000410000000122713246301623024332 0ustar www-datawww-dataset (SCHEMADIR_USER "" CACHE FORCE "Installation dir if user") set (SCHEMADIR_ROOT "" CACHE FORCE "Installation dir if root") if (ENV{USER}) set (USERNAME $ENV{USER}) else (ENV${USER}) set (USERNAME "user") endif (ENV{USER}) if (${USERNAME} STREQUAL "root") set (SCHEMADIR ${SCHEMADIR_ROOT}) else (${USERNAME} STREQUAL "root") set (SCHEMADIR ${SCHEMADIR_USER}) endif (${USERNAME} STREQUAL "root") find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) if (GLIB_COMPILE_SCHEMAS) message ("-- Recompiling GSettings schemas in ${SCHEMADIR}") execute_process (COMMAND ${GLIB_COMPILE_SCHEMAS} ${SCHEMADIR}) endif (GLIB_COMPILE_SCHEMAS) ./cmake/plugin_extensions/0000755000004100000410000000000013246301623016100 5ustar www-datawww-data./cmake/plugin_extensions/CompizGenInstallData.cmake0000644000004100000410000000203613246301623023117 0ustar www-datawww-data# determinate installation directories macro (compiz_data_prepare_dirs) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") set (PLUGIN_DATADIR ${datadir}/compiz/${COMPIZ_CURRENT_PLUGIN}) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_DATADIR ${COMPIZ_PREFIX}/share/compiz/${COMPIZ_CURRENT_PLUGIN}) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_DATADIR $ENV{HOME}/.compiz-1/${COMPIZ_CURRENT_PLUGIN}) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_data_prepare_dirs) # install plugin data files if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/data) compiz_data_prepare_dirs () if (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data DESTINATION ${PLUGIN_DATADIR} ) endif (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) list (APPEND COMPIZ_DEFINITIONS_ADD "-DDATADIR='\"${PLUGIN_DATADIR}\"'") endif () ./cmake/plugin_extensions/CompizGenInstallImages.cmake0000644000004100000410000000205713246301623023456 0ustar www-datawww-data# determinate installation directories macro (compiz_images_prepare_dirs) if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") set (PLUGIN_IMAGEDIR ${datadir}/compiz/${COMPIZ_CURRENT_PLUGIN}) elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_IMAGEDIR ${COMPIZ_PREFIX}/share/compiz/${COMPIZ_CURRENT_PLUGIN}) else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") set (PLUGIN_IMAGEDIR $ENV{HOME}/.compiz-1/${COMPIZ_CURRENT_PLUGIN}) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_images_prepare_dirs) # install plugin data files if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/images) compiz_images_prepare_dirs () if (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images DESTINATION ${PLUGIN_IMAGEDIR} ) endif (_install_plugin_${COMPIZ_CURRENT_PLUGIN}) list (APPEND COMPIZ_DEFINITIONS_ADD "-DIMAGEDIR='\"${PLUGIN_IMAGEDIR}\"'") endif () ./cmake/plugin_extensions/CompizGenGSettings.cmake0000644000004100000410000000407113246301623022627 0ustar www-datawww-datainclude (${COMPIZ_CMAKE_MODULE_PATH}/CompizGSettings.cmake) macro (compiz_gsettings_prepare_install_dirs) # package if ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") if (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${datadir}/glib-2.0/schemas/") else (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) # compiz elseif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") if (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_PREFIX}/share/glib-2.0/schemas/") else (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) # local else ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "compiz" OR "$ENV{BUILD_GLOBAL}" STREQUAL "true") if (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "$ENV{HOME}/.config/compiz-1/gsettings/schemas") else (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) set (PLUGIN_SCHEMADIR "${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR}") endif (NOT COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR) endif ("${COMPIZ_PLUGIN_INSTALL_TYPE}" STREQUAL "package") endmacro (compiz_gsettings_prepare_install_dirs) compiz_gsettings_prepare_install_dirs () set (PLUGIN_GSETTINGS_SCHEMA_DST ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/org.compiz.${COMPIZ_CURRENT_PLUGIN}.gschema.xml) set (_install_gsettings_schema ) if (NOT _install_plugin_${COMPIZ_CURRENT_PLUGIN}) set (_install_gsettings_schema NOINSTALL) endif (NOT _install_plugin_${COMPIZ_CURRENT_PLUGIN}) compiz_gsettings_schema (${COMPIZ_CURRENT_PLUGIN} ${COMPIZ_CURRENT_XML_FILE} ${PLUGIN_GSETTINGS_SCHEMA_DST} ${PLUGIN_SCHEMADIR} ${_install_gsettings_schema}) list (APPEND COMPIZ_CURRENT_SOURCES_ADDS ${PLUGIN_GSETTINGS_SCHEMA_DST}) ./cmake/plugin_extensions/CompizOpenGLFixups.cmake0000644000004100000410000000145413246301623022613 0ustar www-datawww-data # modify pkg-config libs for opengl based on if we found GLES or not if (${COMPIZ_CURRENT_PLUGIN} STREQUAL "opengl") if (USE_GLES) set (PKGCONFIG_LIBS "-lGLESv2 -lEGL") else (USE_GLES) set (PKGCONFIG_LIBS "-lGL") endif (USE_GLES) endif (${COMPIZ_CURRENT_PLUGIN} STREQUAL "opengl") # if plugin is using opengl plugin check for GLES library and set correct define if (NOT "${${_PLUGIN}_PLUGINDEPS}" STREQUAL "") string (REGEX MATCH "opengl" opengl_found ${${_PLUGIN}_PLUGINDEPS}) if (opengl_found STREQUAL "opengl") if (USE_GLES) set (${_PLUGIN}_CFLAGSADD ${${_PLUGIN}_CFLAGSADD} " -DUSE_GLES") string (REPLACE ";" " " ${_PLUGIN}_CFLAGSADD ${${_PLUGIN}_CFLAGSADD}) endif (USE_GLES) endif (opengl_found STREQUAL "opengl") endif (NOT "${${_PLUGIN}_PLUGINDEPS}" STREQUAL "") ./cmake/FindXorgGTest.cmake0000644000004100000410000000516413246301623016022 0ustar www-datawww-data# Find xorg-gtest,with pkg-config. This sets: # # XORG_GTEST_FOUND # XORG_SERVER_INCLUDE_XORG_GTEST # XORG_SERVER_GTEST_SRC # xorg-gtest pkg_check_modules (XORG_SERVER xorg-gtest>=0.7.0 xorg-server x11 xi) if (XORG_SERVER_FOUND) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=prefix xorg-gtest OUTPUT_VARIABLE _xorg_gtest_prefix) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=includedir xorg-gtest OUTPUT_VARIABLE _xorg_gtest_include_dir) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=sourcedir xorg-gtest OUTPUT_VARIABLE _xorg_gtest_source_dir) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=CPPflags xorg-gtest OUTPUT_VARIABLE _xorg_gtest_cflags) string (STRIP ${_xorg_gtest_prefix} _xorg_gtest_prefix) string (STRIP ${_xorg_gtest_include_dir} _xorg_gtest_include_dir) string (STRIP ${_xorg_gtest_source_dir} _xorg_gtest_source_dir) string (STRIP ${_xorg_gtest_cflags} _xorg_gtest_cflags) # This is a workaround for bug #1521366 caused by recent pkg-config variables unquoting set (_unescaped_double_quote "([^\\])\\\"") set (_escaped_double_quote "\\1\\\\\"") string (REGEX REPLACE ${_unescaped_double_quote} ${_escaped_double_quote} _xorg_gtest_prefix ${_xorg_gtest_prefix}) string (REGEX REPLACE ${_unescaped_double_quote} ${_escaped_double_quote} _xorg_gtest_include_dir ${_xorg_gtest_include_dir}) string (REGEX REPLACE ${_unescaped_double_quote} ${_escaped_double_quote} _xorg_gtest_source_dir ${_xorg_gtest_source_dir}) string (REGEX REPLACE ${_unescaped_double_quote} ${_escaped_double_quote} _xorg_gtest_cflags ${_xorg_gtest_cflags}) set (XORG_SERVER_GTEST_INCLUDES ${XORG_SERVER_INCLUDE_DIRS}) set (XORG_SERVER_GTEST_LIBRARY_DIRS ${XORG_SERVER_LIBRARIES}) set (XORG_SERVER_GTEST_LIBRARIES} ${XORG_SERVER_LIBRARIES}) set (XORG_SERVER_INCLUDE_XORG_GTEST ${_xorg_gtest_include_dir} CACHE PATH "Path to Xorg GTest Headers") set (XORG_SERVER_GTEST_SRC ${_xorg_gtest_source_dir} CACHE PATH "Path to Xorg GTest Sources") set (XORG_SERVER_GTEST_CFLAGS ${_xorg_gtest_cflags}) set (XORG_SERVER_GTEST_ROOT ${CMAKE_SOURCE_DIR}/tests/xorg-gtest CACHE PATH "Path to Xorg GTest CMake sources") set (COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/tests/xorg-gtest/include CACHE PATH "Path to Compiz Xorg GTest Headers") message (STATUS "Found xorg-gtest sources at " ${XORG_SERVER_GTEST_SRC}) set (XORG_GTEST_FOUND ON) else (XORG_SERVER_FOUND) message (WARNING "Could not found xorg-gtest, can't build xserver tests") set (XORG_GTEST_FOUND OFF) endif (XORG_SERVER_FOUND) ./cmake/CompizDefaults.cmake.in0000644000004100000410000000026513246301623016666 0ustar www-datawww-dataset (COMPIZ_BCOP_XSLT @CMAKE_INSTALL_PREFIX@/share/compiz/xslt/bcop.xslt) set (COMPIZ_GSETTINGS_SCHEMAS_XSLT @CMAKE_INSTALL_PREFIX@/share/compiz/xslt/compiz_gsettings_schemas.xslt) ./cmake/CompizBcop.cmake0000644000004100000410000000321713246301623015375 0ustar www-datawww-datafind_program (XSLTPROC_EXECUTABLE xsltproc) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (NOT XSLTPROC_EXECUTABLE) message (FATAL_ERROR "xsltproc not found.") endif () # does the plugin require bcop function (compiz_plugin_needs_bcop _file _return) file (READ ${_file} _xml_content) if ("${_xml_content}" MATCHES "useBcop=\"true\"") set (${_return} TRUE PARENT_SCOPE) else () set (${_return} FALSE PARENT_SCOPE) endif () endfunction () # prepare bcop build function (compiz_add_bcop_targets _plugin _file _sources) add_custom_target (${_plugin}-options SOURCES ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp ) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h COMMAND ${XSLTPROC_EXECUTABLE} -o ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h --stringparam "file" "header" ${COMPIZ_BCOP_XSLT} ${_file} DEPENDS ${_file} ) add_custom_command ( OUTPUT ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp COMMAND ${XSLTPROC_EXECUTABLE} -o ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp --stringparam "file" "source" ${COMPIZ_BCOP_XSLT} ${_file} > ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp DEPENDS ${_file} ${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h ) set (${_sources} "${CMAKE_BINARY_DIR}/generated/${_plugin}_options.h;${CMAKE_BINARY_DIR}/generated/${_plugin}_options.cpp" PARENT_SCOPE) endfunction () ./cmake/CompizCommon.cmake0000644000004100000410000012014613246301623015743 0ustar www-datawww-datacmake_minimum_required (VERSION 2.6) include (FindPkgConfig) if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") message (SEND_ERROR "Building in the source directory is not supported.") message (FATAL_ERROR "Please remove the created \"CMakeCache.txt\" file, the \"CMakeFiles\" directory and create a build directory and call \"${CMAKE_COMMAND} \".") endif ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") #### CTest enable_testing() #### policies cmake_policy (SET CMP0000 OLD) cmake_policy (SET CMP0002 OLD) cmake_policy (SET CMP0003 NEW) cmake_policy (SET CMP0005 OLD) cmake_policy (SET CMP0011 OLD) cmake_policy (SET CMP0022 OLD) set (CMAKE_SKIP_RPATH FALSE) pkg_check_modules (GL QUIET gl) set (BUILD_GLES_DEFAULT OFF) if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm.*" OR NOT GL_FOUND) set (BUILD_GLES_DEFAULT ON) endif () option (BUILD_GLES "Build against GLESv2 instead of GL" ${BUILD_GLES_DEFAULT}) option (COMPIZ_BUILD_WITH_RPATH "Leave as ON unless building packages" ON) option (COMPIZ_RUN_LDCONFIG "Leave OFF unless you need to run ldconfig after install") option (COMPIZ_PACKAGING_ENABLED "Enable to manually set prefix, exec_prefix, libdir, includedir, datadir" OFF) option (COMPIZ_BUILD_TESTING "Build Unit Tests" ON) option (BUILD_XORG_GTEST "Build Xorg GTest integration tests" ON) set (COMPIZ_DATADIR ${CMAKE_INSTALL_PREFIX}/share) set (COMPIZ_METADATADIR ${CMAKE_INSTALL_PREFIX}/share/compiz) set (COMPIZ_IMAGEDIR ${CMAKE_INSTALL_PREFIX}/share/compiz/images) set (COMPIZ_PLUGINDIR ${libdir}/compiz) set (COMPIZ_SYSCONFDIR ${sysconfdir}) set ( VERSION ${VERSION} CACHE STRING "Package version that is added to a plugin pkg-version file" ) set ( COMPIZ_I18N_DIR ${COMPIZ_I18N_DIR} CACHE PATH "Translation file directory" ) # Almost everything is a shared library now, so almost everything needs -fPIC set (COMMON_FLAGS "-fPIC -Wall") option (COMPIZ_UNUSED_PRIVATE_FIELD_WARNINGS "Warn unused private fields" OFF) if (NOT COMPIZ_UNUSED_PRIVATE_FIELD_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-unused-private-field") endif () option (COMPIZ_UNUSED_LOCAL_TYPEDEFS_WARNINGS "Warn about unused local typedefs" OFF) if (NOT COMPIZ_UNUSED_LOCAL_TYPEDEFS_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-unused-local-typedefs") endif (NOT COMPIZ_UNUSED_LOCAL_TYPEDEFS_WARNINGS) option (COMPIZ_DEPRECATED_WARNINGS "Warn about declarations marked deprecated" OFF) if (NOT COMPIZ_DEPRECATED_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-deprecated-declarations") endif () option (COMPIZ_SIGN_WARNINGS "Should compiz use -Wsign-conversion during compilation." ON) if (NOT COMPIZ_SIGN_WARNINGS) set (COMMON_FLAGS "${COMMON_FLAGS} -Wno-sign-conversion") endif () if (${CMAKE_PROJECT_NAME} STREQUAL "compiz") set (COMPIZ_WERROR_DEFAULT ON) else () set (COMPIZ_WERROR_DEFAULT OFF) endif () option (COMPIZ_WERROR "Treat warnings as errors" ${COMPIZ_WERROR_DEFAULT}) if (COMPIZ_WERROR) set (COMMON_FLAGS "${COMMON_FLAGS} -Werror") endif () set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS} -std=c++11") set (COMMON_LINKER_FLAGS "-Wl,-zdefs") set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${COMMON_LINKER_FLAGS}") set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${COMMON_LINKER_FLAGS}") set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${COMMON_LINKER_FLAGS}") if (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.bzr) set(IS_BZR_REPO 1) elseif (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.bzr) set(IS_BZR_REPO 0) endif (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/.bzr) set (USE_GLES ${BUILD_GLES}) if (USE_GLES) find_package(OpenGLES2) if (NOT OPENGLES2_FOUND) set (USE_GLES 0) message (SEND_ERROR "OpenGLESv2 not found") endif (NOT OPENGLES2_FOUND) endif (USE_GLES) # Parse arguments passed to a function into several lists separated by # upper-case identifiers and options that do not have an associated list e.g.: # # SET(arguments # hello OPTION3 world # LIST3 foo bar # OPTION2 # LIST1 fuz baz # ) # PARSE_ARGUMENTS(ARG "LIST1;LIST2;LIST3" "OPTION1;OPTION2;OPTION3" ${arguments}) # # results in 7 distinct variables: # * ARG_DEFAULT_ARGS: hello;world # * ARG_LIST1: fuz;baz # * ARG_LIST2: # * ARG_LIST3: foo;bar # * ARG_OPTION1: FALSE # * ARG_OPTION2: TRUE # * ARG_OPTION3: TRUE # # taken from http://www.cmake.org/Wiki/CMakeMacroParseArguments MACRO(PARSE_ARGUMENTS prefix arg_names option_names) SET(DEFAULT_ARGS) FOREACH(arg_name ${arg_names}) SET(${prefix}_${arg_name}) ENDFOREACH(arg_name) FOREACH(option ${option_names}) SET(${prefix}_${option} FALSE) ENDFOREACH(option) SET(current_arg_name DEFAULT_ARGS) SET(current_arg_list) FOREACH(arg ${ARGN}) SET(larg_names ${arg_names}) LIST(FIND larg_names "${arg}" is_arg_name) IF (is_arg_name GREATER -1) SET(${prefix}_${current_arg_name} ${current_arg_list}) SET(current_arg_name ${arg}) SET(current_arg_list) ELSE (is_arg_name GREATER -1) SET(loption_names ${option_names}) LIST(FIND loption_names "${arg}" is_option) IF (is_option GREATER -1) SET(${prefix}_${arg} TRUE) ELSE (is_option GREATER -1) SET(current_arg_list ${current_arg_list} ${arg}) ENDIF (is_option GREATER -1) ENDIF (is_arg_name GREATER -1) ENDFOREACH(arg) SET(${prefix}_${current_arg_name} ${current_arg_list}) ENDMACRO(PARSE_ARGUMENTS) function (compiz_add_to_coverage_report TARGET TEST) set_property (GLOBAL APPEND PROPERTY COMPIZ_COVERAGE_REPORT_TARGETS ${TARGET}) set_property (GLOBAL APPEND PROPERTY COMPIZ_COVERAGE_REPORT_TESTS ${TARGET}) endfunction () function (compiz_add_test_to_testfile CURRENT_BINARY_DIR TEST) message (STATUS "Will discover tests in ${TEST}") set (INCLUDE_STR "INCLUDE (${CURRENT_BINARY_DIR}/${TEST}_test.cmake) \n") set_property (GLOBAL APPEND PROPERTY COMPIZ_TEST_INCLUDE_FILES ${INCLUDE_STR}) endfunction (compiz_add_test_to_testfile) function (compiz_generate_testfile_target) # Adding a rule for the toplevel CTestTestfile.cmake # will cause enable_testing not to generate the file # for this directory, so we need to do some of the work # that command did for us file (WRITE ${CMAKE_BINARY_DIR}/CompizCTestTestfile.cmake "") file (GLOB ALL_DIRS "*") foreach (DIR ${ALL_DIRS}) if (IS_DIRECTORY ${DIR} AND NOT ${DIR} STREQUAL ${CMAKE_BINARY_DIR}) file (RELATIVE_PATH RDIR ${CMAKE_CURRENT_SOURCE_DIR} ${DIR}) file (APPEND ${compiz_BINARY_DIR}/CompizCTestTestfile.cmake "SUBDIRS (${RDIR})\n") endif (IS_DIRECTORY ${DIR} AND NOT ${DIR} STREQUAL ${CMAKE_BINARY_DIR}) endforeach () get_property (COMPIZ_TEST_INCLUDE_FILES_SET GLOBAL PROPERTY COMPIZ_TEST_INCLUDE_FILES SET) if (NOT COMPIZ_TEST_INCLUDE_FILES_SET) message (WARNING "No tests were added for discovery, not generating CTestTestfile.cmake rule") endif (NOT COMPIZ_TEST_INCLUDE_FILES_SET) get_property (COMPIZ_TEST_INCLUDE_FILES GLOBAL PROPERTY COMPIZ_TEST_INCLUDE_FILES) foreach (INCLUDEFILE ${COMPIZ_TEST_INCLUDE_FILES}) file (APPEND ${compiz_BINARY_DIR}/CompizCTestTestfile.cmake ${INCLUDEFILE}) endforeach () # Overwrite any existing CTestTestfile.cmake - we cannot use # configure_file as enable_testing () will clobber the result add_custom_command (OUTPUT ${CMAKE_BINARY_DIR}/CTestTestfileValid COMMAND cat ${CMAKE_BINARY_DIR}/CompizCTestTestfile.cmake > ${CMAKE_BINARY_DIR}/CTestTestfile.cmake && touch ${CMAKE_BINARY_DIR}/CTestTestfileValid COMMENT "Generating CTestTestfile.cmake" VERBATIM) add_custom_target (compiz_generate_ctest_testfile ALL DEPENDS ${CMAKE_BINARY_DIR}/CTestTestfileValid) # Invalidate the CTestTestfile.cmake if (EXISTS ${CMAKE_BINARY_DIR}/CTestTestfileValid) execute_process (COMMAND rm ${CMAKE_BINARY_DIR}/CTestTestfileValid) endif (EXISTS ${CMAKE_BINARY_DIR}/CTestTestfileValid) endfunction (compiz_generate_testfile_target) # Create target to discover tests function (compiz_discover_tests EXECUTABLE) string (TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE) if (${COVERAGE_BUILD_TYPE} MATCHES "coverage") parse_arguments (ARG "COVERAGE" "" ${ARGN}) foreach (COVERAGE ${ARG_COVERAGE}) compiz_add_to_coverage_report (${COVERAGE} ${EXECUTABLE}) endforeach () endif (${COVERAGE_BUILD_TYPE} MATCHES "coverage") set (XORG_GTEST_WRAPPER_REQUIRED 0) foreach (ARG ${ARGN}) if (${ARG} STREQUAL "WITH_XORG_GTEST") set (XORG_GTEST_WRAPPER_REQUIRED 1) endif (${ARG} STREQUAL "WITH_XORG_GTEST") endforeach () set (COMPIZ_DISCOVER_TESTS_CMD ${CMAKE_BINARY_DIR}/compiz_gtest/compiz_discover_gtest_tests ${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE}) if (XORG_GTEST_WRAPPER_REQUIRED) set (COMPIZ_DISCOVER_TESTS_CMD ${COMPIZ_DISCOVER_TESTS_CMD} --wrapper ${COMPIZ_XORG_GTEST_WRAPPER}) endif (XORG_GTEST_WRAPPER_REQUIRED) add_custom_command (TARGET ${EXECUTABLE} POST_BUILD COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE} --gtest_list_tests | ${COMPIZ_DISCOVER_TESTS_CMD} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Discovering Tests in ${EXECUTABLE}" VERBATIM) add_dependencies (${EXECUTABLE} compiz_discover_gtest_tests) compiz_add_test_to_testfile (${CMAKE_CURRENT_BINARY_DIR} ${EXECUTABLE}) endfunction (compiz_discover_tests) function (compiz_ensure_linkage) find_program (LDCONFIG_EXECUTABLE ldconfig) mark_as_advanced (FORCE LDCONFIG_EXECUTABLE) if (LDCONFIG_EXECUTABLE AND ${COMPIZ_RUN_LDCONFIG}) install ( CODE "message (\"Running \" ${LDCONFIG_EXECUTABLE} \" \" ${CMAKE_INSTALL_PREFIX} \"/lib\") exec_program (${LDCONFIG_EXECUTABLE} ARGS \"-v\" ${CMAKE_INSTALL_PREFIX}/lib)" ) endif (LDCONFIG_EXECUTABLE AND ${COMPIZ_RUN_LDCONFIG}) endfunction () macro (compiz_add_git_dist) add_custom_target (dist COMMAND bzr export ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION} && rm -rf ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}/debian && tar -C ${CMAKE_BINARY_DIR} -cj ${CMAKE_PROJECT_NAME}-${VERSION} -f ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 && rm -rf ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endmacro () macro (compiz_add_distcheck) add_custom_target (distcheck COMMAND mkdir -p ${CMAKE_BINARY_DIR}/dist-build && cp ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 ${CMAKE_BINARY_DIR}/dist-build && cd ${CMAKE_BINARY_DIR}/dist-build && tar xvf ${CMAKE_BINARY_DIR}/dist-build/${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 && mkdir -p ${CMAKE_BINARY_DIR}/dist-build/${CMAKE_PROJECT_NAME}-${VERSION}/build && cd ${CMAKE_BINARY_DIR}/dist-build/${CMAKE_PROJECT_NAME}-${VERSION}/build && cmake -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/dist-build/buildroot -DCOMPIZ_PLUGIN_INSTALL_TYPE='package' .. -DCMAKE_MODULE_PATH=/usr/share/cmake -DCOMPIZ_DISABLE_PLUGIN_KDE=ON -DBUILD_KDE4=OFF && make && make test && make install WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_dependencies (distcheck dist) endmacro () macro (compiz_add_release_signoff) set (AUTO_VERSION_UPDATE "" CACHE STRING "Automatically update VERSION to this number") if (AUTO_VERSION_UPDATE) message ("-- Next version will be " ${AUTO_VERSION_UPDATE}) endif (AUTO_VERSION_UPDATE) add_custom_target (release-signoff) add_custom_target (release-update-working-tree COMMAND cp NEWS ${CMAKE_SOURCE_DIR} && bzr add ${CMAKE_SOURCE_DIR}/NEWS && cp AUTHORS ${CMAKE_SOURCE_DIR} && bzr add ${CMAKE_SOURCE_DIR}/AUTHORS COMMENT "Updating working tree" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) # TODO add_custom_target (release-commits) add_custom_target (release-tags) add_custom_target (release-branch) add_custom_target (release-update-dist) add_custom_target (release-version-bump) add_custom_target (release-sign-tarballs COMMAND gpg --armor --sign --detach-sig ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 COMMENT "Signing tarball" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_custom_target (release-sha1-tarballs COMMAND sha1sum ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2 > ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2.sha1 COMMENT "SHA1Summing tarball" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_custom_target (release-sign-sha1-tarballs COMMAND gpg --armor --sign --detach-sig ${CMAKE_PROJECT_NAME}-${VERSION}.tar.bz2.sha1 COMMENT "Signing SHA1Sum checksum" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_dependencies (release-commits release-update-working-tree) add_dependencies (release-tags release-commits) add_dependencies (release-branch release-tags) add_dependencies (release-update-dist release-branch) add_dependencies (release-version-bump release-update-dist) add_dependencies (release-sign-tarballs release-version-bump) add_dependencies (release-sha1-tarballs release-sign-tarballs) add_dependencies (release-sign-sha1-tarballs release-sha1-tarballs) add_dependencies (release-signoff release-sign-sha1-tarballs) # Actually pushes the release add_custom_target (push-master) add_custom_target (push-release-branch) add_custom_target (push-tag) add_custom_target (release-push) add_dependencies (release-push push-release-branch) add_dependencies (push-release-branch push-tag) add_dependencies (push-tag push-master) # Push the tarball to releases.compiz.org # Does nothing for now add_custom_target (release-upload-component) add_custom_target (release-upload) add_dependencies (release-upload release-upload-component) endmacro () macro (compiz_add_release) set (AUTO_NEWS_UPDATE "" CACHE STRING "Value to insert into NEWS file, leave blank to get an editor when running make news-update") if (AUTO_NEWS_UPDATE) message ("-- Using auto news update: " ${AUTO_NEWS_UPDATE}) endif (AUTO_NEWS_UPDATE) if (NOT EXISTS ${CMAKE_SOURCE_DIR}/.AUTHORS.sed) file (WRITE ${CMAKE_SOURCE_DIR}/.AUTHORS.sed "") endif (NOT EXISTS ${CMAKE_SOURCE_DIR}/.AUTHORS.sed) add_custom_target (authors COMMAND bzr log --long --levels=0 | grep -e "^\\s*author:" -e "^\\s*committer:" | cut -d ":" -f 2 | sed -r -f ${CMAKE_SOURCE_DIR}/.AUTHORS.sed | sort -u > AUTHORS COMMENT "Generating AUTHORS") if (AUTO_NEWS_UPDATE) add_custom_target (news-header echo > ${CMAKE_BINARY_DIR}/NEWS.update COMMAND echo \"Release ${VERSION} \(`date +%Y-%m-%d` `bzr config email`\)\" > ${CMAKE_BINARY_DIR}/NEWS.update && seq -s \"=\" `cat ${CMAKE_BINARY_DIR}/NEWS.update | wc -c` | sed 's/[0-9]//g' >> ${CMAKE_BINARY_DIR}/NEWS.update && echo '${AUTO_NEWS_UPDATE}' >> ${CMAKE_BINARY_DIR}/NEWS.update && echo >> ${CMAKE_BINARY_DIR}/NEWS.update COMMENT "Generating NEWS Header" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) else (AUTO_NEWS_UPDATE) add_custom_target (news-header echo > ${CMAKE_BINARY_DIR}/NEWS.update COMMAND echo \"Release ${VERSION} \(`date +%Y-%m-%d` `bzr config email`\)\" > ${CMAKE_BINARY_DIR}/NEWS.update && seq -s "=" `cat ${CMAKE_BINARY_DIR}/NEWS.update | wc -c` | sed 's/[0-9]//g' >> ${CMAKE_BINARY_DIR}/NEWS.update && $ENV{EDITOR} ${CMAKE_BINARY_DIR}/NEWS.update && echo >> ${CMAKE_BINARY_DIR}/NEWS.update COMMENT "Generating NEWS Header" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) endif (AUTO_NEWS_UPDATE) add_custom_target (news COMMAND cat ${CMAKE_SOURCE_DIR}/NEWS > NEWS.old && cat NEWS.old >> NEWS.update && cat NEWS.update > NEWS WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) add_dependencies (news-header authors) add_dependencies (news news-header) add_custom_target (release-prep) add_dependencies (release-prep news) endmacro (compiz_add_release) # unsets the given variable macro (compiz_unset var) set (${var} "" CACHE INTERNAL "") endmacro () # sets the given variable macro (compiz_set var value) set (${var} ${value} CACHE INTERNAL "") endmacro () macro (compiz_format_string str length return) string (LENGTH "${str}" _str_len) math (EXPR _add_chr "${length} - ${_str_len}") set (${return} "${str}") while (_add_chr GREATER 0) set (${return} "${${return}} ") math (EXPR _add_chr "${_add_chr} - 1") endwhile () endmacro () string (ASCII 27 _escape) function (compiz_color_message _str) if (CMAKE_COLOR_MAKEFILE) message (${_str}) else () string (REGEX REPLACE "${_escape}.[0123456789;]*m" "" __str ${_str}) message (${__str}) endif () endfunction () function (compiz_configure_file _src _dst) foreach (_val ${ARGN}) set (_${_val}_sav ${${_val}}) set (${_val} "") foreach (_word ${_${_val}_sav}) set (${_val} "${${_val}}${_word} ") endforeach (_word ${_${_val}_sav}) endforeach (_val ${ARGN}) configure_file (${_src} ${_dst} @ONLY) foreach (_val ${ARGN}) set (${_val} ${_${_val}_sav}) set (_${_val}_sav "") endforeach (_val ${ARGN}) endfunction () macro (compiz_add_plugins_in_folder folder) set (COMPIZ_PLUGIN_PACK_BUILD 1) file ( GLOB _plugins_in RELATIVE "${folder}" "${folder}/*/CMakeLists.txt" ) foreach (_plugin ${_plugins_in}) get_filename_component (_plugin_dir ${_plugin} PATH) string (TOUPPER ${_plugin_dir} _plugin_upper) if (NOT COMPIZ_DISABLE_PLUGIN_${_plugin_upper}) add_subdirectory (${folder}/${_plugin_dir}) set (COMPIZ_ENABLED_PLUGIN_${_plugin_upper} Y CACHE INTERNAL "") endif () endforeach () endmacro () #### pkg-config handling include (FindPkgConfig) function (compiz_pkg_check_modules _var _req) if (NOT ${_var}) pkg_check_modules (${_var} ${_req} ${ARGN}) if (${_var}_FOUND) set (${_var} 1 CACHE INTERNAL "" FORCE) endif () set(__pkg_config_checked_${_var} 0 CACHE INTERNAL "" FORCE) endif () endfunction () #### translations # translate metadata file function (compiz_translate_xml _src _dst) find_program (INTLTOOL_MERGE_EXECUTABLE intltool-merge) mark_as_advanced (FORCE INTLTOOL_MERGE_EXECUTABLE) set (_additional_arg -x -u ${COMPIZ_I18N_DIR}) foreach (_arg ${ARGN}) if ("${_arg}" STREQUAL "NOTRANSLATIONS") set (_additional_arg --no-translations -x -u) endif ("${_arg}" STREQUAL "NOTRANSLATIONS") endforeach (_arg ${ARGN}) if (INTLTOOL_MERGE_EXECUTABLE AND COMPIZ_I18N_DIR AND EXISTS ${COMPIZ_I18N_DIR}) add_custom_command ( OUTPUT ${_dst} COMMAND ${INTLTOOL_MERGE_EXECUTABLE} -c ${CMAKE_BINARY_DIR}/.intltool-merge-cache ${_additional_arg} ${_src} ${_dst} DEPENDS ${_src} ) else () add_custom_command ( OUTPUT ${_dst} COMMAND cat ${_src} | sed -e 's:<_:<:g' -e 's: ${_dst} DEPENDS ${_src} ) endif () endfunction () function (compiz_translate_desktop_file _src _dst) find_program (INTLTOOL_MERGE_EXECUTABLE intltool-merge) mark_as_advanced (FORCE INTLTOOL_MERGE_EXECUTABLE) if (INTLTOOL_MERGE_EXECUTABLE AND COMPIZ_I18N_DIR AND EXISTS ${COMPIZ_I18N_DIR}) add_custom_command ( OUTPUT ${_dst} COMMAND ${INTLTOOL_MERGE_EXECUTABLE} -d -u -c ${CMAKE_BINARY_DIR}/.intltool-merge-cache ${COMPIZ_I18N_DIR} ${_src} ${_dst} DEPENDS ${_src} ) else () add_custom_command ( OUTPUT ${_dst} COMMAND cat ${_src} | sed -e 's:^_::g' > ${_dst} DEPENDS ${_src} ) endif () endfunction () #### modules / tests macro (_get_parameters _prefix) set (_current_var _foo) set (_supported_var PKGDEPS PLUGINDEPS MODULES LDFLAGSADD CFLAGSADD LIBRARIES LIBDIRS INCDIRS DEFSADD) foreach (_val ${_supported_var}) set (${_prefix}_${_val}) endforeach (_val) foreach (_val ${ARGN}) set (_found FALSE) foreach (_find ${_supported_var}) if ("${_find}" STREQUAL "${_val}") set (_found TRUE) endif ("${_find}" STREQUAL "${_val}") endforeach (_find) if (_found) set (_current_var ${_prefix}_${_val}) else (_found) list (APPEND ${_current_var} ${_val}) endif (_found) endforeach (_val) endmacro (_get_parameters) macro (_check_pkg_deps _prefix) set (${_prefix}_HAS_PKG_DEPS TRUE) foreach (_val ${ARGN}) string (REGEX REPLACE "[<>=\\.]" "_" _name ${_val}) string (TOUPPER ${_name} _name) compiz_pkg_check_modules (_${_name} ${_val}) if (_${_name}_FOUND) list (APPEND ${_prefix}_PKG_LIBDIRS "${_${_name}_LIBRARY_DIRS}") list (APPEND ${_prefix}_PKG_LIBRARIES "${_${_name}_LIBRARIES}") list (APPEND ${_prefix}_PKG_INCDIRS "${_${_name}_INCLUDE_DIRS}") else (_${_name}_FOUND) set (${_prefix}_HAS_PKG_DEPS FALSE) compiz_set (${_prefix}_MISSING_DEPS "${${_prefix}_MISSING_DEPS} ${_val}") set(__pkg_config_checked__${_name} 0 CACHE INTERNAL "" FORCE) endif (_${_name}_FOUND) endforeach () endmacro (_check_pkg_deps) macro (_build_include_flags _prefix) foreach (_include ${ARGN}) if (NOT ${_prefix}_INCLUDE_CFLAGS) compiz_set (${_prefix}_INCLUDE_CFLAGS "" PARENT_SCOPE) endif (NOT ${_prefix}_INCLUDE_CFLAGS) list (APPEND ${_prefix}_INCLUDE_CFLAGS -I${_include}) endforeach (_include) endmacro (_build_include_flags) macro (_build_definitions_flags _prefix) foreach (_def ${ARGN}) if (NOT ${_prefix}_DEFINITIONS_CFLAGS) compiz_set (${_prefix}_DEFINITIONS_CFLAGS "") endif (NOT ${_prefix}_DEFINITIONS_CFLAGS) list (APPEND ${_prefix}_DEFINITIONS_CFLAGS -D${_def}) endforeach (_def) endmacro (_build_definitions_flags) macro (_build_link_dir_flags _prefix) foreach (_link_dir ${ARGN}) if (NOT ${_prefix}_LINK_DIR_LDFLAGS) compiz_set (${_prefix}_LINK_DIR_LDFLAGS "") endif (NOT ${_prefix}_LINK_DIR_LDFLAGS) list (APPEND ${_prefix}_LINK_DIR_LDFLAGS -L${_link_dir}) endforeach (_link_dir) endmacro (_build_link_dir_flags) macro (_build_library_flags _prefix) foreach (_library ${ARGN}) if (NOT ${_prefix}_LIBRARY_LDFLAGS) compiz_set (${_prefix}_LIBRARY_LDFLAGS "") endif (NOT ${_prefix}_LIBRARY_LDFLAGS) list (APPEND ${_prefix}_LIBRARY_LDFLAGS -l${_library}) endforeach (_library) endmacro (_build_library_flags) function (_build_compiz_module _prefix _name _full_prefix) if (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIRS}) endif (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_SOURCE_DIR}) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIR}) if (${_full_prefix}_DEFSADD) _build_definitions_flags (${_full_prefix} ${${_full_prefix}_DEFSADD}) endif (${_full_prefix}_DEFSADD) if (${_full_prefix}_LIBRARY_DIRS) _build_link_dir_flags (${_full_prefix} ${${_full_prefix}_LIBRARY_DIRS}) endif (${_full_prefix}_LIBRARY_DIRS) if (${_full_prefix}_LIBRARIES) _build_library_flags (${_full_prefix} ${${_full_prefix}_LIBRARIES}) endif (${_full_prefix}_LIBRARIES) file (GLOB _cpp_files "${${_full_prefix}_SOURCE_DIR}/*.cpp") add_library (${_prefix}_${_name}_internal STATIC ${_cpp_files}) target_link_libraries (${_prefix}_${_name}_internal ${${_full_prefix}_LIBRARIES} m pthread dl) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_INCLUDE_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_DEFINITIONS_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_CFLAGSADD}) set (${_full_prefix}_COMPILE_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_COMPILE_FLAGS}) set (${_full_prefix}_COMPILE_FLAGS_STR "${_flag} ${${_full_prefix}_COMPILE_FLAGS_STR}") endforeach (_flag) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LINK_LDFLAGS}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LDFLAGSADD}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LIBARY_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_LINK_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR "${_flag} ${${_full_prefix}_LINK_FLAGS_STR}") endforeach (_flag) set_target_properties (${_prefix}_${_name}_internal PROPERTIES COMPILE_FLAGS ${${_full_prefix}_COMPILE_FLAGS_STR} LINK_FLAGS ${${_full_prefix}_LINK_FLAGS_STR}) file (GLOB _h_files "${_full_prefix}_INCLUDE_DIR/*.h") foreach (_file ${_h_files}) install ( FILES ${_file} DESTINATION ${includedir}/compiz/${_prefix} ) endforeach (_file) endfunction (_build_compiz_module) macro (compiz_module _prefix _name) string (TOUPPER ${_prefix} _PREFIX) string (TOUPPER ${_name} _NAME) set (_FULL_PREFIX ${_PREFIX}_${_NAME}) _get_parameters (${_FULL_PREFIX} ${ARGN}) _check_pkg_deps (${_FULL_PREFIX} ${${_FULL_PREFIX}_PKGDEPS}) if (${_FULL_PREFIX}_HAS_PKG_DEPS) list (APPEND ${_FULL_PREFIX}_LIBRARIES ${${_FULL_PREFIX}_PKG_LIBRARIES}) list (APPEND ${_FULL_PREFIX}_INCLUDE_DIRS ${${_FULL_PREFIX}_INCDIRS}) list (APPEND ${_FULL_PREFIX}_INCLUDE_DIRS ${${_FULL_PREFIX}_PKG_INCDIRS}) list (APPEND ${_FULL_PREFIX}_LIBRARY_DIRS ${${_FULL_PREFIX}_LIBDIRS}) list (APPEND ${_FULL_PREFIX}_LIBRARY_DIRS ${${_FULL_PREFIX}_PKG_LIBDIRS}) # also add modules foreach (_module ${${_FULL_PREFIX}_MODULES}) string (TOUPPER ${_module} _MODULE) list (APPEND ${_FULL_PREFIX}_INCLUDE_DIRS ${${_MODULE}_INCLUDE_DIR}) list (APPEND ${_FULL_PREFIX}_LIBRARY_DIRS ${${_MODULE}_BINARY_DIR}) list (APPEND ${_FULL_PREFIX}_LIBRARIES ${_module}_internal) endforeach (_module) compiz_set (${_FULL_PREFIX}_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${_name}) compiz_set (${_FULL_PREFIX}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_name}/src) compiz_set (${_FULL_PREFIX}_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_name}/include) compiz_set (${_FULL_PREFIX}_TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${_name}tests) # Need to abuse set_property here since set () with CACHE INTERNAL will save the # value to the cache which we will just read right back (but we need to regenerate that) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_LIBRARY_DIRS ${${_FULL_PREFIX}_BINARY_DIR}) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_INCLUDE_DIRS ${${_FULL_PREFIX}_INCLUDE_DIR}) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_INCLUDE_DIRS ${${_FULL_PREFIX}_SOURCE_DIR}) set_property (GLOBAL APPEND PROPERTY ${_PREFIX}_MOD_LIBRARIES ${_prefix}_${_name}_internal) _build_compiz_module (${_prefix} ${_name} ${_FULL_PREFIX}) add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/${_name}/tests) else (${_FULL_PREFIX}_HAS_PKG_DEPS) message (STATUS "[WARNING] One or more dependencies for module ${_name} for ${_prefix} not found. Skipping module.") message (STATUS "Missing dependencies :${${_FULL_PREFIX}_MISSING_DEPS}") compiz_set (${_FULL_PREFIX}_BUILD FALSE) endif (${_FULL_PREFIX}_HAS_PKG_DEPS) endmacro (compiz_module) function (_build_compiz_test_base _prefix _module _full_prefix) file (GLOB _cpp_files "${${_FULL_TEST_BASE_PREFIX}_SOURCE_DIR}/*.cpp") if (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIRS}) endif (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_SOURCE_DIR}) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIR}) if (${_full_prefix}_DEFSADD) _build_definitions_flags (${_full_prefix} ${${_full_prefix}_DEFSADD}) endif (${_full_prefix}_DEFSADD) if (${_full_prefix}_LIBRARY_DIRS) _build_link_dir_flags (${_full_prefix} ${${_full_prefix}_LIBRARY_DIRS}) endif (${_full_prefix}_LIBRARY_DIRS) if (${_full_prefix}_LIBRARIES) _build_library_flags (${_full_prefix} ${${_full_prefix}_LIBRARIES}) endif (${_full_prefix}_LIBRARIES) add_library (${_prefix}_${_module}_test_internal STATIC ${_cpp_files}) target_link_libraries (${_prefix}_${_module}_test_internal ${${_full_prefix}_LIBRARIES} ${_prefix}_${_module}_internal) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_INCLUDE_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_DEFINITIONS_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_CFLAGSADD}) set (${_full_prefix}_COMPILE_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_COMPILE_FLAGS}) set (${_full_prefix}_COMPILE_FLAGS_STR "${_flag} ${${_full_prefix}_COMPILE_FLAGS_STR}") endforeach (_flag) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LINK_LDFLAGS}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LDFLAGSADD}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LIBARY_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_LINK_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR "${_flag} ${${_full_prefix}_LINK_FLAGS_STR}") endforeach (_flag) set_target_properties (${_prefix}_${_module}_test_internal PROPERTIES COMPILE_FLAGS "${${_full_prefix}_COMPILE_FLAGS_STR}" LINK_FLAGS "${${_full_prefix}_LINK_FLAGS_STR}") endfunction (_build_compiz_test_base) macro (compiz_test_base _prefix _module) string (TOUPPER ${_prefix} _PREFIX) string (TOUPPER ${_module} _MODULE) set (_FULL_MODULE_PREFIX ${_PREFIX}_${_NAME}) set (_FULL_TEST_BASE_PREFIX ${_FULL_MODULE_PREFIX}_TEST_BASE) _get_parameters (${_FULL_TEST_BASE_PREFIX} ${ARGN}) _check_pkg_deps (${_FULL_TEST_BASE_PREFIX} ${${_FULL_TEST_BASE_PREFIX}_PKGDEPS}) if (${_FULL_TEST_BASE_PREFIX}_HAS_PKG_DEPS) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARIES ${${_FULL_TEST_BASE_PREFIX}_PKG_LIBDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_INCDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_PKG_INCDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_LIBDIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_PKG_LIBDIRS}) compiz_set (${_FULL_TEST_BASE_PREFIX}_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) compiz_set (${_FULL_TEST_BASE_PREFIX}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) compiz_set (${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_MODULE_PREFIX}_INCLUDE_DIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_MODULE_PREFIX}_INCLUDE_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS ${${_FULL_MODULE_PREFIX}_SOURCE_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_MODULE_PREFIX}_LIBRARY_DIRS}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS ${${_FULL_MODULE_PREFIX}_BINARY_DIR}) list (APPEND ${_FULL_TEST_BASE_PREFIX}_LIBRARIES ${${_FULL_MODULE_PREFIX}_LIBRARIES}) _build_compiz_test_base (${_prefix} ${_module} ${_FULL_TEST_BASE_PREFIX}) else (${_FULL_TEST_BASE_PREFIX}_HAS_PKG_DEPS) message (STATUS "[WARNING] One or more dependencies for test base on module ${_module} for ${_prefix} not found. Skipping test base.") message (STATUS "Missing dependencies :${${_FULL_TEST_BASE_PREFIX}_MISSING_DEPS}") compiz_set (${_FULL_TEST_BASE_PREFIX}_BUILD FALSE) endif (${_FULL_TEST_BASE_PREFIX}_HAS_PKG_DEPS) endmacro (compiz_test_base) function (_build_compiz_test _prefix _module _test _full_prefix) file (GLOB _cpp_files "${${_FULL_TEST_PREFIX}_SOURCE_DIR}/*.cpp") if (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIRS}) endif (${_full_prefix}_INCLUDE_DIRS) _build_include_flags (${_full_prefix} ${${_full_prefix}_SOURCE_DIR}) _build_include_flags (${_full_prefix} ${${_full_prefix}_INCLUDE_DIR}) if (${_full_prefix}_DEFSADD) _build_definitions_flags (${_full_prefix} ${${_full_prefix}_DEFSADD}) endif (${_full_prefix}_DEFSADD) if (${_full_prefix}_LIBRARY_DIRS) _build_link_dir_flags (${_full_prefix} ${${_full_prefix}_LIBRARY_DIRS}) endif (${_full_prefix}_LIBRARY_DIRS) if (${_full_prefix}_LIBRARIES) _build_library_flags (${_full_prefix} ${${_full_prefix}_LIBRARIES}) endif (${_full_prefix}_LIBRARIES) add_executable (${_prefix}_${_module}_${_test}_test ${_cpp_files}) target_link_libraries (${_prefix}_${_module}_${_test}_test ${${_full_prefix}_LIBRARIES} ${_prefix}_${_module}_internal ${_prefix}_${_module}_test_internal) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_INCLUDE_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_DEFINITIONS_CFLAGS}) list (APPEND ${_full_prefix}_COMPILE_FLAGS ${${_full_prefix}_CFLAGSADD}) set (${_full_prefix}_COMPILE_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_COMPILE_FLAGS}) set (${_full_prefix}_COMPILE_FLAGS_STR "${_flag} ${${_full_prefix}_COMPILE_FLAGS_STR}") endforeach (_flag) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LINK_LDFLAGS}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LDFLAGSADD}) list (APPEND ${_full_prefix}_LINK_FLAGS ${${_full_prefix}_LIBARY_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR " ") foreach (_flag ${${_full_prefix}_LINK_FLAGS}) set (${_full_prefix}_LINK_FLAGS_STR "${_flag} ${${_full_prefix}_LINK_FLAGS_STR}") endforeach (_flag) set_target_properties (${_prefix}_${_module}_${_test}_test PROPERTIES COMPILE_FLAGS "${${_full_prefix}_COMPILE_FLAGS_STR}" LINK_FLAGS "${${_full_prefix}_LINK_FLAGS_STR}") add_test (test-${_prefix}-${_module}-${_test} ${CMAKE_CURRENT_BINARY_DIR}/${_prefix}_${_module}_${_test}_test) endfunction (_build_compiz_test) macro (compiz_test _prefix _module _test) set (_supported_var PKGDEPS LDFLAGSADD CFLAGSADD LIBRARIES LIBDIRS INCDIRS DEFSADD) set (_FULL_TEST_PREFIX ${_FULL_MODULE_PREFIX}_TEST) _get_parameters (${_FULL_TEST_PREFIX} ${ARGN}) _check_pkg_deps (${_FULL_TEST_PREFIX} ${${_FULL_TEST_PREFIX}_PKGDEPS}) if (${_FULL_TEST_PREFIX}_HAS_PKG_DEPS) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARIES ${${_FULL_TEST_PREFIX}_PKG_LIBDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_PREFIX}_INCDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_PREFIX}_PKG_INCDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_PREFIX}_LIBDIRS}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_PREFIX}_PKG_LIBDIRS}) compiz_set (${_FULL_TEST_PREFIX}_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) compiz_set (${_FULL_TEST_PREFIX}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) compiz_set (${_FULL_TEST_PREFIX}_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIRS}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_INCLUDE_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_INCLUDE_DIRS ${${_FULL_TEST_BASE_PREFIX}_SOURCE_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_LIBRARY_DIRS}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARY_DIRS ${${_FULL_TEST_BASE_PREFIX}_BINARY_DIR}) list (APPEND ${_FULL_TEST_PREFIX}_LIBRARIES ${${_FULL_TEST_BASE_PREFIX}_LIBRARIES}) _build_compiz_test (${_prefix} ${_module} ${_test} ${_FULL_TEST_PREFIX}) else (${_FULL_TEST_PREFIX}_HAS_PKG_DEPS) message (STATUS "[WARNING] One or more dependencies for test ${_test} on module ${_name} for ${_prefix} not found. Skipping test.") message (STATUS "Missing dependencies :${${_FULL_TEST_PREFIX}_MISSING_DEPS}") compiz_set (${_FULL_TEST_PREFIX}_BUILD FALSE) endif (${_FULL_TEST_PREFIX}_HAS_PKG_DEPS) endmacro (compiz_test) #### optional file install function (compiz_opt_install_file _src _dst) install (CODE "message (\"-- Installing: ${_dst}\") execute_process ( COMMAND ${CMAKE_COMMAND} -E copy_if_different \"${_src}\" \"$ENV{DESTDIR}${_dst}\" RESULT_VARIABLE _result OUTPUT_QUIET ERROR_QUIET ) if (_result) message (\"-- Failed to install: ${_dst}\") endif () " ) endfunction () #### uninstall function (compiz_add_code_to_uninstall_target CODE WORKING_DIRECTORY) set_property (GLOBAL APPEND PROPERTY COMPIZ_UNINSTALL_CODE_TARGETS ${CODE}) set_property (GLOBAL APPEND PROPERTY COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS ${WORKING_DIRECTORY}) endfunction () macro (compiz_add_uninstall) if (NOT _compiz_uninstall_rule_created) compiz_set(_compiz_uninstall_rule_created TRUE) set (_file "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake") file (WRITE ${_file} "message (STATUS \"Uninstalling\")\n") get_property (COMPIZ_UNINSTALL_CODE_TARGETS_SET GLOBAL PROPERTY COMPIZ_UNINSTALL_CODE_TARGETS SET) get_property (COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS_SET GLOBAL PROPERTY COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS SET) if (COMPIZ_UNINSTALL_CODE_TARGETS_SET AND COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS_SET) get_property (COMPIZ_UNINSTALL_CODE_TARGETS GLOBAL PROPERTY COMPIZ_UNINSTALL_CODE_TARGETS) get_property (COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS GLOBAL PROPERTY COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS) list (LENGTH COMPIZ_UNINSTALL_CODE_TARGETS COMPIZ_UNINSTALL_CODE_TARGETS_LEN) math (EXPR COMPIZ_UNINSTALL_CODE_TARGETS_RANGE "${COMPIZ_UNINSTALL_CODE_TARGETS_LEN} - 1") foreach (ITER RANGE ${COMPIZ_UNINSTALL_CODE_TARGETS_RANGE}) list (GET COMPIZ_UNINSTALL_CODE_TARGETS ${ITER} CODE_TARGET) list (GET COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS ${ITER} WORKING_DIRECTORY_TARGET) file (APPEND ${_file} "message (STATUS \"Executing custom uninstall script ${CODE_TARGET}\")\n") file (APPEND ${_file} "execute_process (COMMAND ${CODE_TARGET}\n") file (APPEND ${_file} " WORKING_DIRECTORY \"${WORKING_DIRECTORY_TARGET}\"\n") file (APPEND ${_file} " OUTPUT_VARIABLE cmd_output\n") file (APPEND ${_file} " RESULT_VARIABLE cmd_ret)\n") file (APPEND ${_file} "message (\"\${cmd_output}\")\n") file (APPEND ${_file} "if (NOT \"\${cmd_ret}\" STREQUAL 0)\n") file (APPEND ${_file} " message (FATAL_ERROR \"Problem executing uninstall script ${CODE_TARGET} : \${cmd_ret}\")\n") file (APPEND ${_file} "endif (NOT \"\${cmd_ret}\" STREQUAL 0)\n") endforeach () endif (COMPIZ_UNINSTALL_CODE_TARGETS_SET AND COMPIZ_UNINSTALL_WORKING_DIRECTORY_TARGETS_SET) # Get the code that we need to uninstall, and write it out to the file file (APPEND ${_file} "if (NOT EXISTS \"${CMAKE_BINARY_DIR}/install_manifest.txt\")\n") file (APPEND ${_file} " message (FATAL_ERROR \"Cannot find install manifest: \\\"${CMAKE_BINARY_DIR}/install_manifest.txt\\\"\")\n") file (APPEND ${_file} "endif (NOT EXISTS \"${CMAKE_BINARY_DIR}/install_manifest.txt\")\n\n") file (APPEND ${_file} "file (READ \"${CMAKE_BINARY_DIR}/install_manifest.txt\" files)\n") file (APPEND ${_file} "string (REGEX REPLACE \"\\n\" \";\" files \"\${files}\")\n") file (APPEND ${_file} "foreach (file \${files})\n") file (APPEND ${_file} " message (STATUS \"Uninstalling \\\"\${file}\\\"\")\n") file (APPEND ${_file} " if (EXISTS \"\${file}\")\n") file (APPEND ${_file} " exec_program(\n") file (APPEND ${_file} " \"${CMAKE_COMMAND}\" ARGS \"-E remove \\\"\${file}\\\"\"\n") file (APPEND ${_file} " OUTPUT_VARIABLE rm_out\n") file (APPEND ${_file} " RETURN_VALUE rm_retval\n") file (APPEND ${_file} " )\n") file (APPEND ${_file} " if (\"\${rm_retval}\" STREQUAL 0)\n") file (APPEND ${_file} " else (\"\${rm_retval}\" STREQUAL 0)\n") file (APPEND ${_file} " message (FATAL_ERROR \"Problem when removing \\\"\${file}\\\"\")\n") file (APPEND ${_file} " endif (\"\${rm_retval}\" STREQUAL 0)\n") file (APPEND ${_file} " else (EXISTS \"\${file}\")\n") file (APPEND ${_file} " message (STATUS \"File \\\"\${file}\\\" does not exist.\")\n") file (APPEND ${_file} " endif (EXISTS \"\${file}\")\n") file (APPEND ${_file} "endforeach (file)\n") add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake") endif () endmacro () #posix 2008 scandir check if (CMAKE_CXX_COMPILER) include (CheckCXXSourceCompiles) CHECK_CXX_SOURCE_COMPILES ( "# include int func (const char *d, dirent ***list, void *sort) { int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); return n; } int main (int, char **) { return 0; } " HAVE_SCANDIR_POSIX) endif (CMAKE_CXX_COMPILER) if (HAVE_SCANDIR_POSIX) add_definitions (-DHAVE_SCANDIR_POSIX) endif () ./cmake/opt_install_file.cmake0000644000004100000410000000052713246301623016660 0ustar www-datawww-dataset (src "" CACHE STRING "Source") set (dst "" CACHE STRING "Destination") message (\"-- Installing: ${src}\") execute_process ( COMMAND ${CMAKE_COMMAND} -E copy_if_different \"${src}\" \"$ENV{DESTDIR}${dst}\" RESULT_VARIABLE _result OUTPUT_QUIET ERROR_QUIET ) if (_result) message (\"-- Failed to install: ${dst}\") endif () ./cmake/CompizGSettings.cmake0000644000004100000410000001661413246301623016426 0ustar www-datawww-dataoption ( COMPIZ_DISABLE_GS_SCHEMAS_INSTALL "Disables gsettings schema installation" OFF ) set ( COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR ${COMPIZ_INSTALL_GSETTINGS_SCHEMA_DIR} CACHE PATH "Installation path of the gsettings schema file" ) # Detect global schemas install dir find_program (PKG_CONFIG_TOOL pkg-config) get_property (GSETTINGS_GLOBAL_INSTALL_DIR_SET GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR SET) if (PKG_CONFIG_TOOL AND NOT GSETTINGS_GLOBAL_INSTALL_DIR_SET) mark_as_advanced (FORCE PKG_CONFIG_TOOL) # find out where schemas need to go if we are installing them systemwide execute_process (COMMAND ${PKG_CONFIG_TOOL} glib-2.0 --variable prefix OUTPUT_VARIABLE GSETTINGS_GLIB_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) set (GSETTINGS_GLOBAL_INSTALL_DIR "${GSETTINGS_GLIB_PREFIX}/share/glib-2.0/schemas/") set_property (GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR ${GSETTINGS_GLOBAL_INSTALL_DIR}) endif (PKG_CONFIG_TOOL AND NOT GSETTINGS_GLOBAL_INSTALL_DIR_SET) function (compiz_add_install_recompile_gsettings_schemas _schemadir_user) get_property (GSETTINGS_GLOBAL_INSTALL_DIR_SET GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR SET) if (GSETTINGS_GLOBAL_INSTALL_DIR_SET) get_property (GSETTINGS_GLOBAL_INSTALL_DIR GLOBAL PROPERTY GSETTINGS_GLOBAL_INSTALL_DIR) # Recompile GSettings Schemas install (CODE " execute_process (COMMAND cmake -DSCHEMADIR_USER=${_schemadir_user} -DSCHEMADIR_ROOT=${GSETTINGS_GLOBAL_INSTALL_DIR} -P ${COMPIZ_CMAKE_MODULE_PATH}/recompile_gsettings_schemas_in_dir_user_env.cmake) ") # We must also recompile on uninstall too compiz_add_code_to_uninstall_target ("cmake -DSCHEMADIR_USER=${_schemadir_user} -DSCHEMADIR_ROOT=${GSETTINGS_GLOBAL_INSTALL_DIR} -P ${COMPIZ_CMAKE_MODULE_PATH}/recompile_gsettings_schemas_in_dir_user_env.cmake" ${CMAKE_CURRENT_BINARY_DIR}) endif (GSETTINGS_GLOBAL_INSTALL_DIR_SET) endfunction (compiz_add_install_recompile_gsettings_schemas) function (compiz_install_gsettings_schema _src _dst) find_program (PKG_CONFIG_TOOL pkg-config) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) mark_as_advanced (FORCE PKG_CONFIG_TOOL) mark_as_advanced (GLIB_COMPILE_SCHEMAS) # find out where schemas need to go if we are installing them systemwide execute_process (COMMAND ${PKG_CONFIG_TOOL} glib-2.0 --variable prefix OUTPUT_VARIABLE GSETTINGS_GLIB_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) SET (GSETTINGS_GLOBAL_INSTALL_DIR "${GSETTINGS_GLIB_PREFIX}/share/glib-2.0/schemas/") if (PKG_CONFIG_TOOL AND GLIB_COMPILE_SCHEMAS AND NOT COMPIZ_DISABLE_SCHEMAS_INSTALL) # Install schema file install (CODE " execute_process (COMMAND cmake -DFILE=${_src} -DINSTALLDIR_USER=${_dst} -DINSTALLDIR_ROOT=${GSETTINGS_GLOBAL_INSTALL_DIR} -P ${COMPIZ_CMAKE_MODULE_PATH}/copy_file_install_user_env.cmake) ") get_filename_component (_src_file_basename ${_src} NAME) compiz_add_code_to_uninstall_target ("cmake -E remove -f ${_dst}/${_src_file_basename}" ${CMAKE_CURRENT_BINARY_DIR}) get_property (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE SET) if (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET) get_property (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE GLOBAL PROPERTY COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE) else (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET) set (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE FALSE) endif (COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE_SET) if (NOT COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE) compiz_add_install_recompile_gsettings_schemas (${_dst} ${GSETTINGS_GLOBAL_INSTALL_DIR}) endif (NOT COMPIZ_INHIBIT_ADD_INSTALL_RECOMPILE_RULE) endif (PKG_CONFIG_TOOL AND GLIB_COMPILE_SCHEMAS AND NOT COMPIZ_DISABLE_SCHEMAS_INSTALL) endfunction () function (add_gsettings_local_recompilation_rule _schemas) get_property (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE SET) if (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET) get_property (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE) else (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET) set (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE FALSE) endif (GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE_SET) get_property (GSETTINGS_LOCAL_COMPILE_TARGET_SET GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_TARGET_SET SET) if (NOT GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE AND NOT GSETTINGS_LOCAL_COMPILE_TARGET_SET) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) mark_as_advanced (GLIB_COMPILE_SCHEMAS) if (GLIB_COMPILE_SCHEMAS) set (_compiled_gschemas ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/gschemas.compiled) # Invalidate the rule if (EXISTS ${_compiled_gschemas}) execute_process (COMMAND rm ${_compiled_gschemas}) endif (EXISTS ${_compiled_gschemas}) add_custom_command (OUTPUT ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/gschemas.compiled COMMAND ${GLIB_COMPILE_SCHEMAS} --targetdir=${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/ ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/ COMMENT "Recompiling GSettings schemas locally" DEPENDS ${${_schemas}} ) add_custom_target (compiz_gsettings_compile_local ALL DEPENDS ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/gschemas.compiled) set_property (GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_TARGET_SET TRUE) endif (GLIB_COMPILE_SCHEMAS) endif (NOT GSETTINGS_LOCAL_COMPILE_INHIBIT_RULE AND NOT GSETTINGS_LOCAL_COMPILE_TARGET_SET) endfunction () function (add_all_gsettings_schemas_to_local_recompilation_rule) get_property (GSETTINGS_LOCAL_COMPILE_SCHEMAS GLOBAL PROPERTY GSETTINGS_LOCAL_COMPILE_SCHEMAS) # Deferencing it appears to just give it the first schema, that's not what # we really want, so just pass the reference and double-dereference # internally add_gsettings_local_recompilation_rule (GSETTINGS_LOCAL_COMPILE_SCHEMAS) endfunction () function (add_gsettings_schema_to_recompilation_list _schema_file_name) set_property (GLOBAL APPEND PROPERTY GSETTINGS_LOCAL_COMPILE_SCHEMAS "${_schema_file_name}") add_all_gsettings_schemas_to_local_recompilation_rule () endfunction () # generate gsettings schema function (compiz_gsettings_schema _name _src _dst _inst) find_program (XSLTPROC_EXECUTABLE xsltproc) find_program (GLIB_COMPILE_SCHEMAS glib-compile-schemas) mark_as_advanced (FORCE XSLTPROC_EXECUTABLE) if (XSLTPROC_EXECUTABLE AND GLIB_COMPILE_SCHEMAS) add_custom_command ( OUTPUT ${_dst} COMMAND ${XSLTPROC_EXECUTABLE} -o ${_dst} ${COMPIZ_GSETTINGS_SCHEMAS_XSLT} ${_src} DEPENDS ${_src} ) add_custom_target (${_name}_gsettings_schema DEPENDS ${_dst}) set (_install_gsettings_schema ON) foreach (ARG ${ARGN}) if (${ARG} STREQUAL "NOINSTALL") set (_install_gsettings_schema OFF) endif (${ARG} STREQUAL "NOINSTALL") endforeach () if (_install_gsettings_schema) compiz_install_gsettings_schema (${_dst} ${_inst}) endif (_install_gsettings_schema) add_gsettings_schema_to_recompilation_list (${_name}_gsettings_schema) endif () endfunction () ./cmake/all_plugins_in_folder_example-CMakeLists.txt0000644000004100000410000000040113246301623023121 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizCommon) include (CompizPackage) compiz_add_plugins_in_folder ("${CMAKE_SOURCE_DIR}") compiz_print_configure_header ("Compiz") compiz_print_plugin_stats ("${CMAKE_SOURCE_DIR}") compiz_print_configure_footer ()./cmake/EnableCoverageReport.cmake0000644000004100000410000001641413246301623017371 0ustar www-datawww-data# - Creates a special coverage build type and target on GCC. # # Defines a function ENABLE_COVERAGE_REPORT which generates the coverage target # for selected targets. Optional arguments to this function are used to filter # unwanted results using globbing expressions. Moreover targets with tests for # the source code can be specified to trigger regenerating the report if the # test has changed # # ENABLE_COVERAGE_REPORT(TARGETS target... [FILTER filter...] [TESTS test targets...]) # # To generate a coverage report first build the project with # CMAKE_BUILD_TYPE=coverage, then call make test and afterwards make coverage. # # The coverage report is based on gcov. Depending on the availability of lcov # a HTML report will be generated and/or an XML report of gcovr is found. # The generated coverage target executes all found solutions. Special targets # exist to create e.g. only the xml report: coverage-xml. # # Copyright (C) 2010 by Johannes Wienke # # This program is free software; you can redistribute it # and/or modify it under the terms of the GNU General # Public License as published by the Free Software Foundation; # either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # INCLUDE(CompizCommon) FIND_PACKAGE(Lcov) FIND_PACKAGE(gcovr) FUNCTION(ENABLE_COVERAGE_REPORT) # argument parsing PARSE_ARGUMENTS(ARG "FILTER;TARGETS;TESTS" "" ${ARGN}) SET(COVERAGE_RAW_FILE "${CMAKE_BINARY_DIR}/coverage.raw.info") SET(COVERAGE_FILTERED_FILE "${CMAKE_BINARY_DIR}/coverage.info") SET(COVERAGE_REPORT_DIR "${CMAKE_BINARY_DIR}/coveragereport") SET(COVERAGE_XML_FILE "${CMAKE_BINARY_DIR}/coverage.xml") SET(COVERAGE_XML_COMMAND_FILE "${CMAKE_BINARY_DIR}/coverage-xml.cmake") # decide if there is any tool to create coverage data SET(TOOL_FOUND FALSE) IF(LCOV_FOUND OR GCOVR_FOUND) SET(TOOL_FOUND TRUE) ENDIF() IF(NOT TOOL_FOUND) MESSAGE(STATUS "Cannot enable coverage targets because neither lcov nor gcovr are found.") ENDIF() STRING(TOLOWER "${CMAKE_BUILD_TYPE}" COVERAGE_BUILD_TYPE) IF(CMAKE_COMPILER_IS_GNUCXX AND TOOL_FOUND AND "${COVERAGE_BUILD_TYPE}" MATCHES "coverage") MESSAGE(STATUS "Coverage support enabled for targets: ${ARG_TARGETS}") # create coverage build type SET(CMAKE_CXX_FLAGS_COVERAGE ${CMAKE_CXX_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_C_FLAGS_COVERAGE ${CMAKE_C_FLAGS_DEBUG} PARENT_SCOPE) SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} coverage PARENT_SCOPE) # instrument targets SET_TARGET_PROPERTIES(${ARG_TARGETS} PROPERTIES COMPILE_FLAGS --coverage LINK_FLAGS --coverage) # html report IF (LCOV_FOUND) MESSAGE(STATUS "Enabling HTML coverage report") # set up coverage target ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_RAW_FILE} COMMAND ${LCOV_EXECUTABLE} -c -d ${CMAKE_BINARY_DIR} -o ${COVERAGE_RAW_FILE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Collecting coverage data" DEPENDS ${ARG_TARGETS} ${ARG_TESTS} VERBATIM) # filter unwanted stuff LIST(LENGTH ARG_FILTER FILTER_LENGTH) IF(${FILTER_LENGTH} GREATER 0) SET(FILTER COMMAND ${LCOV_EXECUTABLE}) FOREACH(F ${ARG_FILTER}) SET(FILTER ${FILTER} -r ${COVERAGE_FILTERED_FILE} ${F}) ENDFOREACH() SET(FILTER ${FILTER} -o ${COVERAGE_FILTERED_FILE}) ELSE() SET(FILTER "") ENDIF() ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_FILTERED_FILE} COMMAND ${LCOV_EXECUTABLE} -e ${COVERAGE_RAW_FILE} "${CMAKE_SOURCE_DIR}*" -o ${COVERAGE_FILTERED_FILE} ${FILTER} DEPENDS ${COVERAGE_RAW_FILE} COMMENT "Filtering recorded coverage data for project-relevant entries" VERBATIM) ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_REPORT_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_REPORT_DIR} COMMAND ${GENHTML_EXECUTABLE} --legend --show-details -t "${PROJECT_NAME} test coverage" -o ${COVERAGE_REPORT_DIR} ${COVERAGE_FILTERED_FILE} DEPENDS ${COVERAGE_FILTERED_FILE} COMMENT "Generating HTML coverage report in ${COVERAGE_REPORT_DIR}" VERBATIM) ADD_CUSTOM_TARGET(coverage-html DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() # xml coverage report IF(GCOVR_FOUND) MESSAGE(STATUS "Enabling XML coverage report") # gcovr cannot write directly to a file so the execution needs to # be wrapped in a cmake file that generates the file output FILE(WRITE ${COVERAGE_XML_COMMAND_FILE} "SET(ENV{LANG} en)\n") FILE(APPEND ${COVERAGE_XML_COMMAND_FILE} "EXECUTE_PROCESS(COMMAND \"${GCOVR_EXECUTABLE}\" -x -r \"${CMAKE_SOURCE_DIR}\" OUTPUT_FILE \"${COVERAGE_XML_FILE}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")\n") ADD_CUSTOM_COMMAND(OUTPUT ${COVERAGE_XML_FILE} COMMAND ${CMAKE_COMMAND} ARGS -P ${COVERAGE_XML_COMMAND_FILE} COMMENT "Generating coverage XML report" VERBATIM) ADD_CUSTOM_TARGET(coverage-xml DEPENDS ${COVERAGE_XML_FILE}) ENDIF() # provide a global coverage target executing both steps if available SET(GLOBAL_DEPENDS "") IF(LCOV_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_REPORT_DIR}) ENDIF() IF(GCOVR_FOUND) LIST(APPEND GLOBAL_DEPENDS ${COVERAGE_XML_FILE}) ENDIF() IF(LCOV_FOUND OR GCOVR_FOUND) ADD_CUSTOM_TARGET(coverage DEPENDS ${GLOBAL_DEPENDS}) ENDIF() ENDIF() ENDFUNCTION() function (compiz_generate_coverage_report) get_property (COMPIZ_COVERAGE_REPORT_TARGETS_SET GLOBAL PROPERTY COMPIZ_COVERAGE_REPORT_TARGETS ${TARGET}) if (NOT COMPIZ_COVERAGE_REPORT_TARGETS_SET) message (STATUS "No coverage report targets set, not generating coverage report") else (NOT COMPIZ_COVERAGE_REPORT_TARGETS_SET) get_property (COMPIZ_COVERAGE_REPORT_TARGETS GLOBAL PROPERTY COMPIZ_COVERAGE_REPORT_TARGETS) enable_coverage_report (TARGETS ${COMPIZ_COVERAGE_REPORT_TARGETS}) endif (NOT COMPIZ_COVERAGE_REPORT_TARGETS_SET) endfunction () ./cmake/XorgGTest.cmake0000644000004100000410000000045713246301623015221 0ustar www-datawww-data# XorgGTest.cmake # # build_xorg_gtest_locally (dir) specifies a subdirectory to # build xorg-gtest in locally function (build_xorg_gtest_locally build_directory) if (XORG_GTEST_FOUND) add_subdirectory (${XORG_SERVER_GTEST_ROOT} ${build_directory}) endif (XORG_GTEST_FOUND) endfunction () ./cmake/CompizDefaults.cmake0000644000004100000410000000077213246301623016264 0ustar www-datawww-dataset (COMPIZ_PREFIX ${CMAKE_INSTALL_PREFIX}) set (COMPIZ_INCLUDEDIR ${includedir}) set (COMPIZ_CORE_INCLUDE_DIR ${includedir}/compiz/core) set (COMPIZ_LIBDIR ${libdir}) list (APPEND COMPIZ_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) list (APPEND COMPIZ_INCLUDE_DIRS ${CMAKE_BINARY_DIR}) set (COMPIZ_BCOP_XSLT ${CMAKE_SOURCE_DIR}/xslt/bcop.xslt) set (COMPIZ_GSETTINGS_SCHEMAS_XSLT ${CMAKE_BINARY_DIR}/xslt/compiz_gsettings_schemas.xslt) set (COMPIZ_PLUGIN_INSTALL_TYPE "package") set (_COMPIZ_INTERNAL 1) ./cmake/GoogleTest.cmake0000644000004100000410000000366213246301623015410 0ustar www-datawww-datafind_package (Threads REQUIRED) # Find the the Google Mock include directory # by searching the system-wide include directory # paths find_path (GMOCK_INCLUDE_DIR gmock/gmock.h) if (GMOCK_INCLUDE_DIR) set (GMOCK_INCLUDE_BASE "include/") string (LENGTH ${GMOCK_INCLUDE_BASE} GMOCK_INCLUDE_BASE_LENGTH) string (LENGTH ${GMOCK_INCLUDE_DIR} GMOCK_INCLUDE_DIR_LENGTH) math (EXPR GMOCK_INCLUDE_PREFIX_LENGTH "${GMOCK_INCLUDE_DIR_LENGTH} - ${GMOCK_INCLUDE_BASE_LENGTH}") string (SUBSTRING ${GMOCK_INCLUDE_DIR} 0 ${GMOCK_INCLUDE_PREFIX_LENGTH} GMOCK_INCLUDE_PREFIX) set (GMOCK_SRC_DIR ${GMOCK_INCLUDE_PREFIX}/src/gmock CACHE PATH "Path to Google Mock Sources") set (GMOCK_INCLUDE_DIR ${GMOCK_INCLUDE_DIR} CACHE PATH "Path to Google Mock Headers") set (GTEST_INCLUDE_DIR ${GMOCK_SRC_DIR}/gtest/include CACHE PATH "Path to Google Test Headers") set (GMOCK_LIBRARY "gmock" CACHE STRING "Name of the Google Mock library") set (GMOCK_MAIN_LIBRARY "gmock_main" CACHE STIRNG "Name of the Google Mock main () library") set (GTEST_BOTH_LIBRARIES ${CMAKE_THREAD_LIBS_INIT} gtest gtest_main) endif (GMOCK_INCLUDE_DIR) if (NOT GTEST_BOTH_LIBRARIES) set (GTEST_FOUND FALSE) else (NOT GTEST_BOTH_LIBRARIES) set (GTEST_FOUND TRUE) endif (NOT GTEST_BOTH_LIBRARIES) if (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) message ("Google Mock and Google Test not found - cannot build tests!") set (GOOGLE_TEST_AND_MOCK_FOUND FALSE) else (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) set (GOOGLE_TEST_AND_MOCK_FOUND TRUE) add_definitions(-DGTEST_USE_OWN_TR1_TUPLE=0) add_subdirectory (${GMOCK_SRC_DIR} ${CMAKE_BINARY_DIR}/__gmock) include_directories (${GMOCK_INCLUDE_DIR} ${GTEST_INCLUDE_DIR}) endif (NOT GMOCK_LIBRARY OR NOT GMOCK_MAIN_LIBRARY OR NOT GTEST_FOUND) ./gtk/0000755000004100000410000000000013246301623012030 5ustar www-datawww-data./gtk/CMakeLists.txt0000644000004100000410000000460513246301623014575 0ustar www-datawww-dataoption (BUILD_GTK "Build gtk-window-decorator and Gnome related toold" 1) option (BUILD_METACITY "Gtk-window-decorator metacity theme support" 1) option (BUILD_GNOME "GNOME integration" 1) compiz_set (USE_GTK ${BUILD_GTK}) compiz_set (USE_METACITY ${BUILD_METACITY}) compiz_set (USE_GNOME ${BUILD_GNOME}) if (USE_GTK) pkg_check_modules (GTK_WINDOW_DECORATOR xrender>=0.8.4 gtk+-3.0 libwnck-3.0 pangocairo ) if (GTK_WINDOW_DECORATOR_FOUND) set (CMAKE_REQUIRED_FLAGS ${GTK_WINDOW_DECORATOR_CFLAGS}) set (CMAKE_REQUIRED_LIBRARIES ${GTK_WINDOW_DECORATOR_LIBRARIES}) list (FIND CMAKE_REQUIRED_FLAGS "-D_REENTRANT" REENTRANT_INDEX) if (REENTRANT_INDEX) list (REMOVE_AT CMAKE_REQUIRED_FLAGS REENTRANT_INDEX) list (APPEND CMAKE_REQUIRED_FLAGS "-D_REENTRANT=1") endif (REENTRANT_INDEX) set (CMAKE_REQUIRED_FLAGS "") set (CMAKE_REQUIRED_LIBRARIES "") if (USE_METACITY) pkg_check_modules (LIBMETACITY libmetacity>=3.22.0) if (LIBMETACITY_FOUND) compiz_pkg_check_modules (HAVE_METACITY_3_26_0 libmetacity>=3.25.1) set (METACITY_INCLUDE_DIRS ${LIBMETACITY_INCLUDE_DIRS}) set (METACITY_LIBRARIES ${LIBMETACITY_LIBRARIES}) else (LIBMETACITY_FOUND) compiz_set (USE_METACITY 0) endif (LIBMETACITY_FOUND) endif (USE_METACITY) if (USE_GNOME) compiz_pkg_check_modules (GNOME_WINDOW_SETTINGS gnome-window-settings-2.0 gnome-desktop-2.0 ) if (GNOME_WINDOW_SETTINGS_FOUND) exec_program (${PKG_CONFIG_EXECUTABLE} ARGS "--variable=prefix gnome-window-settings-2.0" OUTPUT_VARIABLE windowsettingsdatadir ) set (windowsettingsdatadir ${windowsettingsdatadir}/share) exec_program (${PKG_CONFIG_EXECUTABLE} ARGS "--variable=libdir gnome-window-settings-2.0" OUTPUT_VARIABLE windowsettingslibdir ) else (GNOME_WINDOW_SETTINGS_FOUND) compiz_set (USE_GNOME 0) endif (GNOME_WINDOW_SETTINGS_FOUND) endif (USE_GNOME) else (GTK_WINDOW_DECORATOR_FOUND) compiz_set (USE_GTK 0) endif (GTK_WINDOW_DECORATOR_FOUND) endif (USE_GTK) if (NOT USE_GTK) compiz_set (USE_METACITY 0) endif (NOT USE_GTK) configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.gtk.in ${CMAKE_CURRENT_BINARY_DIR}/config.h ) add_subdirectory (window-decorator) add_subdirectory (gnome) ./gtk/config.h.gtk.in0000644000004100000410000000032013246301623014632 0ustar www-datawww-data/* Define to 1 if Metacity support is enabled */ #cmakedefine USE_METACITY 1 /* Define to 1 if Metacity version >= 3.25.1 */ #cmakedefine HAVE_METACITY_3_26_0 1 #define GETTEXT_PACKAGE "${GETTEXT_PACKAGE}" ./gtk/gnome/0000755000004100000410000000000013246301623013135 5ustar www-datawww-data./gtk/gnome/CMakeLists.txt0000644000004100000410000000235613246301623015703 0ustar www-datawww-dataif (BUILD_GNOME) set (desktop_file ${CMAKE_CURRENT_BINARY_DIR}/compiz.desktop) compiz_translate_desktop_file ( ${CMAKE_CURRENT_SOURCE_DIR}/compiz.desktop.in ${desktop_file} ) install ( FILES ${desktop_file} DESTINATION ${datadir}/applications ) set (_keybindings_files 50-compiz-navigation.xml.in 50-compiz-windows.xml.in) set (_keybindings_files_translated "") foreach (_keybinding_file ${_keybindings_files}) string (LENGTH ${_keybinding_file} _str_len) math (EXPR _str_len_no_in "${_str_len} - 3") string (SUBSTRING ${_keybinding_file} 0 ${_str_len_no_in} _keybinding_file_no_in) compiz_translate_xml (${CMAKE_CURRENT_SOURCE_DIR}/${_keybinding_file} ${CMAKE_CURRENT_BINARY_DIR}/${_keybinding_file_no_in} NOTRANSLATIONS) list (APPEND _keybindings_files_translated ${CMAKE_CURRENT_BINARY_DIR}/${_keybinding_file_no_in}) endforeach (_keybinding_file ${keybinding_files}) add_custom_target (compiz-gnome-keybindings ALL DEPENDS ${_keybindings_files_translated}) install ( FILES ${_keybinding_files_translated} DESTINATION ${datadir}/gnome-control-center/keybindings ) add_custom_target (compiz.desktop-file ALL DEPENDS ${desktop_file}) endif (BUILD_GNOME) ./gtk/gnome/50-compiz-navigation.xml.in0000644000004100000410000000630413246301623020147 0ustar www-datawww-data ./gtk/gnome/50-compiz-windows.xml.in0000644000004100000410000000233113246301623017476 0ustar www-datawww-data ./gtk/gnome/compiz.desktop.in0000644000004100000410000000053513246301623016441 0ustar www-datawww-data[Desktop Entry] Type=Application _Name=Compiz Exec=compiz NoDisplay=true # name of loadable control center module X-GNOME-WMSettingsModule=compiz # autostart phase X-GNOME-Autostart-Phase=WindowManager X-GNOME-Provides=windowmanager # name we put on the WM spec check window X-GNOME-WMName=compiz # back compat only X-GnomeWMSettingsLibrary=compiz ./gtk/window-decorator/0000755000004100000410000000000013246301623015317 5ustar www-datawww-data./gtk/window-decorator/frames.c0000644000004100000410000001450513246301623016745 0ustar www-datawww-data/* * Copyright © 2011 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Authored by: * Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings.h" typedef struct _decor_frame_type_info { create_frame_proc create_func; destroy_frame_proc destroy_func; } decor_frame_type_info_t; GHashTable *frame_info_table; GHashTable *frames_table; static void decor_frame_refresh (decor_frame_t *frame) { decor_shadow_options_t active_o, inactive_o; decor_shadow_info_t *info; gwd_decor_frame_ref (frame); frame_update_titlebar_font (frame); if (strcmp (frame->type, "switcher") != 0 && strcmp (frame->type, "bare") != 0) gwd_theme_update_border_extents (gwd_theme, frame); gwd_theme_get_shadow (gwd_theme, frame, &active_o, TRUE); gwd_theme_get_shadow (gwd_theme, frame, &inactive_o, FALSE); info = malloc (sizeof (decor_shadow_info_t)); if (!info) return; info->frame = frame; info->state = 0; frame_update_shadow (frame, info, &active_o, &inactive_o); gwd_decor_frame_unref (frame); free (info); info = NULL; } decor_frame_t * gwd_get_decor_frame (const gchar *frame_name) { decor_frame_t *frame = g_hash_table_lookup (frames_table, frame_name); if (!frame) { /* Frame not found, look up frame type in the frame types * hash table and create a new one */ decor_frame_type_info_t *info = g_hash_table_lookup (frame_info_table, frame_name); if (!info) g_critical ("Could not find frame info %s in frame type table", frame_name); frame = (*info->create_func) (frame_name); if (!frame) g_critical ("Could not allocate frame %s", frame_name); g_hash_table_insert (frames_table, frame->type, frame); gwd_decor_frame_ref (frame); decor_frame_refresh (frame); } else gwd_decor_frame_ref (frame); return frame; } decor_frame_t * gwd_decor_frame_ref (decor_frame_t *frame) { ++frame->refcount; return frame; } decor_frame_t * gwd_decor_frame_unref (decor_frame_t *frame) { --frame->refcount; if (frame->refcount == 0) { decor_frame_type_info_t *info = g_hash_table_lookup (frame_info_table, frame->type); if (!info) g_critical ("Couldn't find %s in frame info table", frame->type); if(!g_hash_table_remove (frames_table, frame->type)) g_critical ("Could not remove frame type %s from hash_table!", frame->type); (*info->destroy_func) (frame); } return frame; } gboolean gwd_decor_frame_add_type (const gchar *name, create_frame_proc create_func, destroy_frame_proc destroy_func) { decor_frame_type_info_t *frame_type = malloc (sizeof (decor_frame_type_info_t)); if (!frame_type) return FALSE; frame_type->create_func = create_func; frame_type->destroy_func = destroy_func; g_hash_table_insert (frame_info_table, strdup (name), frame_type); return TRUE; } void gwd_decor_frame_remove_type (const gchar *name) { g_hash_table_remove (frame_info_table, name); } void gwd_frames_foreach (GHFunc foreach_func, gpointer user_data) { g_hash_table_foreach (frames_table, foreach_func, user_data); } void gwd_process_frames (GHFunc foreach_func, const gchar *frame_keys[], gint frame_keys_num, gpointer user_data) { gint i = 0; for (; i < frame_keys_num; ++i) { gpointer frame = g_hash_table_lookup (frames_table, frame_keys[i]); if (!frame) continue; (*foreach_func) ((gpointer) frame_keys[i], frame, user_data); } } void destroy_frame_type (gpointer data) { decor_frame_type_info_t *info = (decor_frame_type_info_t *) data; if (info) { /* TODO: Destroy all frames with this type using * the frame destroy function */ } free (info); } decor_frame_t * decor_frame_new (const gchar *type) { decor_frame_t *frame = malloc (sizeof (decor_frame_t)); if (!frame) { g_critical ("Couldn't allocate frame!"); return NULL; } frame->type = strdup (type); frame->refcount = 0; frame->border_shadow_active = NULL; frame->border_shadow_inactive = NULL; frame->max_border_shadow_active = NULL; frame->max_border_shadow_inactive = NULL; frame->pango_context = NULL; return frame; } void decor_frame_destroy (decor_frame_t *frame) { Display *xdisplay = gdk_x11_get_default_xdisplay (); if (frame->border_shadow_active) decor_shadow_destroy (xdisplay, frame->border_shadow_active); if (frame->border_shadow_inactive) decor_shadow_destroy (xdisplay, frame->border_shadow_inactive); if (frame->max_border_shadow_active) decor_shadow_destroy (xdisplay, frame->max_border_shadow_active); if (frame->max_border_shadow_inactive) decor_shadow_destroy (xdisplay, frame->max_border_shadow_inactive); if (frame->pango_context) g_object_unref (G_OBJECT (frame->pango_context)); if (frame) free (frame->type); free (frame); } void initialize_decorations () { frame_info_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroy_frame_type); gwd_decor_frame_add_type ("normal", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("dialog", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("modal_dialog", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("menu", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("utility", create_normal_frame, destroy_normal_frame); gwd_decor_frame_add_type ("switcher", create_switcher_frame, destroy_switcher_frame); gwd_decor_frame_add_type ("bare", create_bare_frame, destroy_bare_frame); frames_table = g_hash_table_new (g_str_hash, g_str_equal); } ./gtk/window-decorator/switcher.c0000644000004100000410000004021313246301623017313 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #define SWITCHER_SPACE 40 static void decor_update_switcher_property (decor_t *d) { GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); GtkStyleContext *context = gtk_widget_get_style_context (style_window); long *data; gint nQuad; decor_quad_t quads[N_QUADS_MAX]; unsigned int nOffset = 1; unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); GdkRGBA fg; long fgColor[4]; nQuad = decor_set_lSrStSbX_window_quads (quads, &d->frame->window_context_active, &d->border_layout, d->border_layout.top.x2 - d->border_layout.top.x1 - d->frame->window_context_active.extents.left - d->frame->window_context_active.extents.right - 32); data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, cairo_xlib_surface_get_drawable (d->surface), &d->frame->win_extents, &d->frame->win_extents, &d->frame->win_extents, &d->frame->win_extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); gtk_style_context_restore (context); fgColor[0] = fg.red; fgColor[1] = fg.green; fgColor[2] = fg.blue; fgColor[3] = SWITCHER_ALPHA; gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); XChangeProperty (xdisplay, d->prop_xid, switcher_fg_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) fgColor, 4); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); free (data); } decor_frame_t * create_switcher_frame (const gchar *type) { AtkObject *switcher_label_obj; decor_frame_t *frame = decor_frame_new (type); decor_extents_t _switcher_extents = { 6, 6, 6, 6 + SWITCHER_SPACE }; decor_context_t _switcher_context = { { 0, 0, 0, 0 }, 6, 6, 6, 6 + SWITCHER_SPACE, 0, 0, 0, 0 }; frame->win_extents = _switcher_extents; frame->max_win_extents = _switcher_extents; frame->win_extents = _switcher_extents; frame->window_context_inactive = _switcher_context; frame->window_context_active = _switcher_context; frame->max_window_context_active = _switcher_context; frame->max_window_context_inactive = _switcher_context; frame->update_shadow = switcher_frame_update_shadow; /* keep the switcher frame around since we need to keep its * contents */ gwd_decor_frame_ref (frame); switcher_label = gtk_label_new (""); switcher_label_obj = gtk_widget_get_accessible (switcher_label); atk_object_set_role (switcher_label_obj, ATK_ROLE_STATUSBAR); return frame; } void destroy_switcher_frame (decor_frame_t *frame) { gtk_widget_destroy (switcher_label); decor_frame_destroy (frame); } static void draw_switcher_background (decor_t *d) { GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); GtkStyleContext *context = gtk_widget_get_style_context (style_window); cairo_t *cr; GdkRGBA bg, fg; decor_color_t color; double alpha = SWITCHER_ALPHA / 65535.0; double x1, y1, x2, y2, h; int top; unsigned long pixel; ushort a = SWITCHER_ALPHA; if (!d->buffer_surface) return; gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); gtk_style_context_restore (context); color.r = bg.red; color.g = bg.green; color.b = bg.blue; cr = cairo_create (d->buffer_surface); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); top = d->frame->win_extents.top; x1 = d->frame->window_context_active.left_space - d->frame->win_extents.left; y1 = d->frame->window_context_active.top_space - d->frame->win_extents.top; x2 = d->width - d->frame->window_context_active.right_space + d->frame->win_extents.right; y2 = d->height - d->frame->window_context_active.bottom_space + d->frame->win_extents.bottom; h = y2 - y1 - d->frame->win_extents.top - d->frame->win_extents.top; cairo_set_line_width (cr, 1.0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); draw_shadow_background (d, cr, d->frame->border_shadow_active, &d->frame->window_context_active); fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, d->frame->win_extents.left - 0.5, top - 0.5, 5.0, CORNER_TOPLEFT, &color, alpha, &color, alpha * 0.75, SHADE_TOP | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y1 + 0.5, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, top - 0.5, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_TOP); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + 0.5, d->frame->win_extents.right - 0.5, top - 0.5, 5.0, CORNER_TOPRIGHT, &color, alpha, &color, alpha * 0.75, SHADE_TOP | SHADE_RIGHT); fill_rounded_rectangle (cr, x1 + 0.5, y1 + top, d->frame->win_extents.left - 0.5, h, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_LEFT); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y1 + top, d->frame->win_extents.right - 0.5, h, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_RIGHT); fill_rounded_rectangle (cr, x1 + 0.5, y2 - d->frame->win_extents.top, d->frame->win_extents.left - 0.5, d->frame->win_extents.top - 0.5, 5.0, CORNER_BOTTOMLEFT, &color, alpha, &color, alpha * 0.75, SHADE_BOTTOM | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + d->frame->win_extents.left, y2 - d->frame->win_extents.top, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, d->frame->win_extents.top - 0.5, 5.0, 0, &color, alpha, &color, alpha * 0.75, SHADE_BOTTOM); fill_rounded_rectangle (cr, x2 - d->frame->win_extents.right, y2 - d->frame->win_extents.top, d->frame->win_extents.right - 0.5, d->frame->win_extents.top - 0.5, 5.0, CORNER_BOTTOMRIGHT, &color, alpha, &color, alpha * 0.75, SHADE_BOTTOM | SHADE_RIGHT); cairo_rectangle (cr, x1 + d->frame->win_extents.left, y1 + top, x2 - x1 - d->frame->win_extents.left - d->frame->win_extents.right, h); bg.alpha = alpha; gdk_cairo_set_source_rgba (cr, &bg); cairo_fill (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); cairo_clip (cr); cairo_translate (cr, 1.0, 1.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.4); cairo_stroke (cr); cairo_translate (cr, -2.0, -2.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.1); cairo_stroke (cr); cairo_translate (cr, 1.0, 1.0); cairo_reset_clip (cr); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT); fg.alpha = alpha; gdk_cairo_set_source_rgba (cr, &fg); cairo_stroke (cr); cairo_destroy (cr); copy_to_front_buffer (d); pixel = (((a * (int) (bg.blue * 65535.0)) >> 24) & 0x0000ff); pixel |= (((a * (int) (bg.green * 65535.0)) >> 16) & 0x00ff00); pixel |= (((a * (int) (bg.red * 65535.0)) >> 8) & 0xff0000); pixel |= ((a & 0xff00) << 16); decor_update_switcher_property (d); gdk_error_trap_push (); XSetWindowBackground (xdisplay, d->prop_xid, pixel); XClearWindow (xdisplay, d->prop_xid); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); d->prop_xid = 0; } static void draw_switcher_foreground (decor_t *d) { GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); GtkStyleContext *context = gtk_widget_get_style_context (style_window); cairo_t *cr; GdkRGBA bg, fg; double alpha = SWITCHER_ALPHA / 65535.0; if (!d->surface || !d->buffer_surface) return; gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); gtk_style_context_restore (context); cr = cairo_create (d->buffer_surface); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_rectangle (cr, d->frame->window_context_active.left_space, d->height - d->frame->window_context_active.bottom_space, d->width - d->frame->window_context_active.left_space - d->frame->window_context_active.right_space, SWITCHER_SPACE); bg.alpha = alpha; gdk_cairo_set_source_rgba (cr, &bg); cairo_fill (cr); if (d->layout) { int w; cairo_set_operator (cr, CAIRO_OPERATOR_OVER); fg.alpha = 1.0; gdk_cairo_set_source_rgba (cr, &fg); pango_layout_get_pixel_size (d->layout, &w, NULL); cairo_move_to (cr, d->width / 2 - w / 2, d->height - d->frame->window_context_active.bottom_space + SWITCHER_SPACE / 2 - d->frame->text_height / 2); pango_cairo_show_layout (cr, d->layout); } cairo_destroy (cr); copy_to_front_buffer (d); } static void draw_switcher_decoration (decor_t *d) { if (d->prop_xid) draw_switcher_background (d); draw_switcher_foreground (d); } #if 0 static void switcher_window_closed () { decor_t *d = switcher_window; Display *xdisplay = gdk_x11_get_default_xdisplay (); if (d->layout) g_object_unref (G_OBJECT (d->layout)); if (d->name) g_free (d->name); if (d->surface) cairo_surface_destroy (d->surface); if (d->buffer_surface) cairo_surface_destroy (d->buffer_surface); if (d->cr) cairo_destroy (d->cr); if (d->picture) XRenderFreePicture (xdisplay, d->picture); gwd_decor_frame_unref (switcher_window->frame); g_free (switcher_window); switcher_window = NULL; } #endif /* Switcher is override-redirect now, we need to track * it separately */ static decor_t * switcher_window_opened (Window popup, Window window) { decor_t *d; d = switcher_window = calloc (1, sizeof (decor_t)); if (!d) return NULL; return d; } gboolean update_switcher_window (Window popup, Window selected) { GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); decor_t *d = switcher_window; cairo_surface_t *surface, *buffer_surface = NULL; unsigned int height, width = 0, border, depth; int x, y; Window root_return; WnckWindow *selected_win; if (!d) d = switcher_window_opened (popup, selected); /* FIXME: Thats a round-trip */ XGetGeometry (gdk_x11_get_default_xdisplay (), popup, &root_return, &x, &y, &width, &height, &border, &depth); d->decorated = FALSE; d->draw = draw_switcher_decoration; d->frame = gwd_get_decor_frame ("switcher"); decor_get_default_layout (&d->frame->window_context_active, width, 1, &d->border_layout); width = d->border_layout.width; height = d->border_layout.height; selected_win = wnck_window_get (selected); if (selected_win) { glong name_length; PangoLayoutLine *line; const gchar *name; if (d->name) { g_free (d->name); d->name = NULL; } name = wnck_window_get_name (selected_win); if (name && (name_length = strlen (name))) { if (!d->layout) { d->layout = pango_layout_new (d->frame->pango_context); pango_layout_set_wrap (d->layout, PANGO_WRAP_CHAR); } if (d->layout) { int tw; tw = width - d->frame->window_context_active.left_space - d->frame->window_context_active.right_space - 64; pango_layout_set_auto_dir (d->layout, FALSE); pango_layout_set_width (d->layout, tw * PANGO_SCALE); pango_layout_set_text (d->layout, name, name_length); line = pango_layout_get_line (d->layout, 0); name_length = line->length; if (pango_layout_get_line_count (d->layout) > 1) { if (name_length < 4) { g_object_unref (G_OBJECT (d->layout)); d->layout = NULL; } else { d->name = g_strndup (name, name_length); strcpy (d->name + name_length - 3, "..."); } } else d->name = g_strndup (name, name_length); if (d->layout) pango_layout_set_text (d->layout, d->name, name_length); } } else if (d->layout) { g_object_unref (G_OBJECT (d->layout)); d->layout = NULL; } } if (selected != switcher_selected_window) { gtk_label_set_text (GTK_LABEL (switcher_label), ""); if (selected_win && d->name) gtk_label_set_text (GTK_LABEL (switcher_label), d->name); switcher_selected_window = selected; } surface = create_native_surface_and_wrap (width, height, style_window); if (!surface) return FALSE; buffer_surface = create_surface (width, height, style_window); if (!buffer_surface) { cairo_surface_destroy (surface); return FALSE; } if (d->surface) cairo_surface_destroy (d->surface); if (d->x11Pixmap) decor_post_delete_pixmap (xdisplay, 0, d->x11Pixmap); if (d->buffer_surface) cairo_surface_destroy (d->buffer_surface); if (d->cr) cairo_destroy (d->cr); if (d->picture) XRenderFreePicture (xdisplay, d->picture); d->surface = surface; d->x11Pixmap = cairo_xlib_surface_get_drawable (d->surface); d->buffer_surface = buffer_surface; d->cr = cairo_create (surface); d->picture = XRenderCreatePicture (xdisplay, cairo_xlib_surface_get_drawable (buffer_surface), xformat_rgba, 0, NULL); d->width = width; d->height = height; d->prop_xid = popup; queue_decor_draw (d); return TRUE; } ./gtk/window-decorator/CMakeLists.txt0000644000004100000410000000633213246301623020063 0ustar www-datawww-dataif (USE_GTK) if (COMPIZ_BUILD_WITH_RPATH) set (CMAKE_INSTALL_RPATH ${libdir}) endif (COMPIZ_BUILD_WITH_RPATH) include_directories ( ${CMAKE_CURRENT_SOURCE_DIR} ${compiz_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/gtk ${GTK_WINDOW_DECORATOR_INCLUDE_DIRS} ${METACITY_INCLUDE_DIRS} ${DBUS_GLIB_INCLUDE_DIRS} ) add_definitions ( -DHAVE_CONFIG_H -DALL_LINGUAS=\"${ALL_LINGUAS}\" -DLOCALEDIR=\\\"${datadir}/locale\\\" ) link_directories ( ${COMPIZ_LINK_DIRS} ) add_library (gtk_window_decorator_settings STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings.c) set (GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES gtk_window_decorator_settings) add_library (gtk_window_decorator_settings_storage_gsettings STATIC ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-storage.c) compiz_pkg_check_modules (GSETTINGS gio-2.0 glib-2.0) target_link_libraries (gtk_window_decorator_settings_storage_gsettings ${GSETTINGS_LIBRARIES}) list (APPEND GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES gtk_window_decorator_settings_storage_gsettings) set (_gwd_gschema_name org.compiz.gwd) set (_gwd_gschema_filename ${_gwd_gschema_name}.gschema.xml) set (_gwd_gschema_filepath ${CMAKE_CURRENT_SOURCE_DIR}/${_gwd_gschema_filename}) set (_gwd_gschema_generated_location ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_gwd_gschema_filename}) set (_gwd_gschema_dest ${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/) add_custom_command (OUTPUT ${_gwd_gschema_generated_location} COMMAND cp -r ${_gwd_gschema_filepath} ${_gwd_gschema_generated_location} DEPENDS ${_gwd_gschema_filepath} VERBATIM) add_custom_target (compiz_gwd_gsettings_org_compiz_gwd_schema ALL DEPENDS ${_gwd_gschema_generated_location}) add_gsettings_schema_to_recompilation_list (compiz_gwd_gsettings_org_compiz_gwd_schema) compiz_install_gsettings_schema (${_gwd_gschema_generated_location} ${_gwd_gschema_dest}) if (USE_METACITY) set (gwd_theme_metacity ${CMAKE_CURRENT_SOURCE_DIR}/gwd-theme-metacity.c) endif (USE_METACITY) add_executable (gtk-window-decorator gtk-window-decorator.c blurprops.c cairo.c frames.c gdk.c switcher.c events.c forcequit.c tooltip.c actionmenu.c settings.c util.c wnck.c decorator.c ${CMAKE_CURRENT_SOURCE_DIR}/gwd-settings-xproperty-storage.c ${CMAKE_CURRENT_SOURCE_DIR}/gwd-theme.c ${CMAKE_CURRENT_SOURCE_DIR}/gwd-theme-cairo.c ${gwd_theme_metacity} ${gwd_schema} ) add_dependencies (gtk-window-decorator decoration) if (USE_METACITY) set (metacitylibs ${METACITY_LIBRARIES}) endif (USE_METACITY) target_link_libraries ( gtk-window-decorator decoration ${GTK_WINDOW_DECORATOR_LIBRARIES} ${DBUS_GLIB_LIBRARIES} ${metacitylibs} ${GTK_WINDOW_DECORATOR_ADDITIONAL_LIBRARIES} ) install ( TARGETS gtk-window-decorator DESTINATION ${exec_prefix} ) if (COMPIZ_BUILD_TESTING) add_subdirectory (tests) endif (COMPIZ_BUILD_TESTING) endif (USE_GTK) ./gtk/window-decorator/gwd-theme-cairo.c0000644000004100000410000007673213246301623020456 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) 2006 Novell, Inc. * Copyright (C) 2010 Sam Spilsbury * Copyright (C) 2011 Canonical Ltd. * Copyright (C) 2016 Alberts Muktupāvels * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: * Alberts Muktupāvels * David Reveman * Sam Spilsbury */ #include "config.h" #include "gtk-window-decorator.h" #include "gwd-theme-cairo.h" #define STROKE_ALPHA 0.6f struct _GWDThemeCairo { GObject parent; decor_color_t title_color[2]; }; G_DEFINE_TYPE (GWDThemeCairo, gwd_theme_cairo, GWD_TYPE_THEME) static gint get_titlebar_height (decor_frame_t *frame) { return frame->text_height < 17 ? 17 : frame->text_height; } static void rgb_to_hls (gdouble *r, gdouble *g, gdouble *b) { gdouble red = *r; gdouble green = *g; gdouble blue = *b; gdouble min; gdouble max; gdouble h, l, s; gdouble delta; if (red > green) { if (red > blue) max = red; else max = blue; if (green < blue) min = green; else min = blue; } else { if (green > blue) max = green; else max = blue; if (red < blue) min = red; else min = blue; } l = (max + min) / 2; s = 0; h = 0; if (max != min) { if (l <= 0.5) s = (max - min) / (max + min); else s = (max - min) / (2 - max - min); delta = max -min; if (red == max) h = (green - blue) / delta; else if (green == max) h = 2 + (blue - red) / delta; else if (blue == max) h = 4 + (red - green) / delta; h *= 60; if (h < 0.0) h += 360; } *r = h; *g = l; *b = s; } static void hls_to_rgb (gdouble *h, gdouble *l, gdouble *s) { gdouble lightness = *l; gdouble saturation = *s; gdouble hue; gdouble m1, m2; gdouble r, g, b; if (lightness <= 0.5) m2 = lightness * (1 + saturation); else m2 = lightness + saturation - lightness * saturation; m1 = 2 * lightness - m2; if (saturation == 0) { *h = lightness; *l = lightness; *s = lightness; } else { hue = *h + 120; while (hue > 360) hue -= 360; while (hue < 0) hue += 360; if (hue < 60) r = m1 + (m2 - m1) * hue / 60; else if (hue < 180) r = m2; else if (hue < 240) r = m1 + (m2 - m1) * (240 - hue) / 60; else r = m1; hue = *h; while (hue > 360) hue -= 360; while (hue < 0) hue += 360; if (hue < 60) g = m1 + (m2 - m1) * hue / 60; else if (hue < 180) g = m2; else if (hue < 240) g = m1 + (m2 - m1) * (240 - hue) / 60; else g = m1; hue = *h - 120; while (hue > 360) hue -= 360; while (hue < 0) hue += 360; if (hue < 60) b = m1 + (m2 - m1) * hue / 60; else if (hue < 180) b = m2; else if (hue < 240) b = m1 + (m2 - m1) * (240 - hue) / 60; else b = m1; *h = r; *l = g; *s = b; } } static void shade (const decor_color_t *a, decor_color_t *b, gfloat k) { gdouble red = a->r; gdouble green = a->g; gdouble blue = a->b; rgb_to_hls (&red, &green, &blue); green *= k; if (green > 1.0) green = 1.0; else if (green < 0.0) green = 0.0; blue *= k; if (blue > 1.0) blue = 1.0; else if (blue < 0.0) blue = 0.0; hls_to_rgb (&red, &green, &blue); b->r = red; b->g = green; b->b = blue; } static void update_title_colors (GWDThemeCairo *cairo) { GWDTheme *theme = GWD_THEME (cairo); GtkWidget *style_window = gwd_theme_get_style_window (theme); GtkStyleContext *context = gtk_widget_get_style_context (style_window); GdkRGBA bg; decor_color_t spot_color; gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_SELECTED); gtk_style_context_get_background_color (context, GTK_STATE_FLAG_SELECTED, &bg); gtk_style_context_restore (context); spot_color.r = bg.red; spot_color.g = bg.green; spot_color.b = bg.blue; shade (&spot_color, &cairo->title_color[0], 1.05); shade (&cairo->title_color[0], &cairo->title_color[1], 0.85); } static void decor_update_window_property (decor_t *d) { GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); decor_extents_t extents = d->frame->win_extents; unsigned int nOffset = 1; unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); long *data; gint nQuad; decor_quad_t quads[N_QUADS_MAX]; int w, h; gint stretch_offset; REGION top, bottom, left, right; w = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; if (d->border_layout.rotation) h = d->border_layout.left.x2 - d->border_layout.left.x1; else h = d->border_layout.left.y2 - d->border_layout.left.y1; stretch_offset = w - d->button_width - 1; nQuad = decor_set_lSrStXbS_window_quads (quads, d->context, &d->border_layout, stretch_offset); data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, cairo_xlib_surface_get_drawable (d->surface), &extents, &extents, &extents, &extents, ICON_SPACE + d->button_width, 0, quads, nQuad, frame_type, frame_state, frame_actions); gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); gdk_display_sync (display); gdk_error_trap_pop_ignored (); top.rects = &top.extents; top.numRects = top.size = 1; top.extents.x1 = -extents.left; top.extents.y1 = -extents.top; top.extents.x2 = w + extents.right; top.extents.y2 = 0; bottom.rects = &bottom.extents; bottom.numRects = bottom.size = 1; bottom.extents.x1 = -extents.left; bottom.extents.y1 = 0; bottom.extents.x2 = w + extents.right; bottom.extents.y2 = extents.bottom; left.rects = &left.extents; left.numRects = left.size = 1; left.extents.x1 = -extents.left; left.extents.y1 = 0; left.extents.x2 = 0; left.extents.y2 = h; right.rects = &right.extents; right.numRects = right.size = 1; right.extents.x1 = 0; right.extents.y1 = 0; right.extents.x2 = extents.right; right.extents.y2 = h; decor_update_blur_property (d, w, h, &top, stretch_offset, &bottom, w / 2, &left, h / 2, &right, h / 2); free (data); } static void button_state_offsets (gdouble x, gdouble y, guint state, gdouble *return_x, gdouble *return_y) { static gdouble off[] = { 0.0, 0.0, 0.0, 0.5 }; *return_x = x + off[state]; *return_y = y + off[state]; } static void button_state_paint (cairo_t *cr, GtkStyleContext *context, decor_color_t *color, guint state) { GdkRGBA fg; #define IN_STATE (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW) gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); gtk_style_context_restore (context); fg.alpha = STROKE_ALPHA; if ((state & IN_STATE) == IN_STATE) { if (state & IN_EVENT_WINDOW) cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); else cairo_set_source_rgba (cr, color->r, color->g, color->b, 0.95); cairo_fill_preserve (cr); gdk_cairo_set_source_rgba (cr, &fg); cairo_set_line_width (cr, 1.0); cairo_stroke (cr); cairo_set_line_width (cr, 2.0); } else { gdk_cairo_set_source_rgba (cr, &fg); cairo_stroke_preserve (cr); if (state & IN_EVENT_WINDOW) cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); else cairo_set_source_rgba (cr, color->r, color->g, color->b, 0.95); cairo_fill (cr); } } static void draw_close_button (cairo_t *cr, gdouble s) { cairo_rel_move_to (cr, 0.0, s); cairo_rel_line_to (cr, s, -s); cairo_rel_line_to (cr, s, s); cairo_rel_line_to (cr, s, -s); cairo_rel_line_to (cr, s, s); cairo_rel_line_to (cr, -s, s); cairo_rel_line_to (cr, s, s); cairo_rel_line_to (cr, -s, s); cairo_rel_line_to (cr, -s, -s); cairo_rel_line_to (cr, -s, s); cairo_rel_line_to (cr, -s, -s); cairo_rel_line_to (cr, s, -s); cairo_close_path (cr); } static void draw_max_button (cairo_t *cr, gdouble s) { cairo_rel_line_to (cr, 12.0, 0.0); cairo_rel_line_to (cr, 0.0, 12.0); cairo_rel_line_to (cr, -12.0, 0.0); cairo_close_path (cr); cairo_rel_move_to (cr, 2.0, s); cairo_rel_line_to (cr, 12.0 - 4.0, 0.0); cairo_rel_line_to (cr, 0.0, 12.0 - s - 2.0); cairo_rel_line_to (cr, -(12.0 - 4.0), 0.0); cairo_close_path (cr); } static void draw_unmax_button (cairo_t *cr, gdouble s) { cairo_rel_move_to (cr, 1.0, 1.0); cairo_rel_line_to (cr, 10.0, 0.0); cairo_rel_line_to (cr, 0.0, 10.0); cairo_rel_line_to (cr, -10.0, 0.0); cairo_close_path (cr); cairo_rel_move_to (cr, 2.0, s); cairo_rel_line_to (cr, 10.0 - 4.0, 0.0); cairo_rel_line_to (cr, 0.0, 10.0 - s - 2.0); cairo_rel_line_to (cr, -(10.0 - 4.0), 0.0); cairo_close_path (cr); } static void draw_min_button (cairo_t *cr, gdouble s) { cairo_rel_move_to (cr, 0.0, 8.0); cairo_rel_line_to (cr, 12.0, 0.0); cairo_rel_line_to (cr, 0.0, s); cairo_rel_line_to (cr, -12.0, 0.0); cairo_close_path (cr); } static void calc_button_size (decor_t *decor) { gint button_width = 0; if (decor->actions & WNCK_WINDOW_ACTION_CLOSE) button_width += 17; if (decor->actions & (WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY | WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY | WNCK_WINDOW_ACTION_UNMAXIMIZE_HORIZONTALLY | WNCK_WINDOW_ACTION_UNMAXIMIZE_VERTICALLY)) button_width += 17; if (decor->actions & WNCK_WINDOW_ACTION_MINIMIZE) button_width += 17; if (button_width) ++button_width; decor->button_width = button_width; } static gboolean button_present (decor_t *decor, gint i) { switch (i) { case BUTTON_MIN: if (decor->actions & WNCK_WINDOW_ACTION_MINIMIZE) return TRUE; break; case BUTTON_MAX: if (decor->actions & WNCK_WINDOW_ACTION_MAXIMIZE) return TRUE; break; case BUTTON_CLOSE: if (decor->actions & WNCK_WINDOW_ACTION_CLOSE) return TRUE; break; case BUTTON_MENU: case BUTTON_SHADE: case BUTTON_ABOVE: case BUTTON_STICK: case BUTTON_UNSHADE: case BUTTON_UNABOVE: case BUTTON_UNSTICK: break; default: break; } return FALSE; } static void gwd_theme_cairo_constructed (GObject *object) { GWDThemeCairo *cairo = GWD_THEME_CAIRO (object); G_OBJECT_CLASS (gwd_theme_cairo_parent_class)->constructed (object); update_title_colors (cairo); } static void gwd_theme_cairo_style_updated (GWDTheme *theme) { GWDThemeCairo *cairo = GWD_THEME_CAIRO (theme); update_title_colors (cairo); } static void gwd_theme_cairo_draw_window_decoration (GWDTheme *theme, decor_t *decor) { GWDThemeCairo *cairo = GWD_THEME_CAIRO (theme); GtkWidget *style_window = gwd_theme_get_style_window (theme); GtkStyleContext *context = gtk_widget_get_style_context (style_window); cairo_t *cr; GdkRGBA bg, fg; cairo_surface_t *surface; decor_color_t color; gdouble alpha; gdouble x1, y1, x2, y2, x, y, h; gint corners = SHADE_LEFT | SHADE_RIGHT | SHADE_TOP | SHADE_BOTTOM; gint top; gint button_x; gint titlebar_height; if (!decor->surface) return; gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); gtk_style_context_restore (context); if (decor->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) corners = 0; color.r = bg.red; color.g = bg.green; color.b = bg.blue; if (decor->buffer_surface) surface = decor->buffer_surface; else surface = decor->surface; cr = cairo_create (surface); if (!cr) return; cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); top = decor->frame->win_extents.top; x1 = decor->context->left_space - decor->frame->win_extents.left; y1 = decor->context->top_space - decor->frame->win_extents.top; x2 = decor->width - decor->context->right_space + decor->frame->win_extents.right; y2 = decor->height - decor->context->bottom_space + decor->frame->win_extents.bottom; h = decor->height - decor->context->top_space - decor->context->bottom_space; cairo_set_line_width (cr, 1.0); draw_shadow_background (decor, cr, decor->shadow, decor->context); if (decor->active) { decor_color_t *title_color = cairo->title_color; alpha = decoration_alpha + 0.3; fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, decor->frame->win_extents.left - 0.5, top - 0.5, 5.0, CORNER_TOPLEFT & corners, &title_color[0], 1.0, &title_color[1], alpha, SHADE_TOP | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + decor->frame->win_extents.left, y1 + 0.5, x2 - x1 - decor->frame->win_extents.left - decor->frame->win_extents.right, top - 0.5, 5.0, 0, &title_color[0], 1.0, &title_color[1], alpha, SHADE_TOP); fill_rounded_rectangle (cr, x2 - decor->frame->win_extents.right, y1 + 0.5, decor->frame->win_extents.right - 0.5, top - 0.5, 5.0, CORNER_TOPRIGHT & corners, &title_color[0], 1.0, &title_color[1], alpha, SHADE_TOP | SHADE_RIGHT); } else { alpha = decoration_alpha; fill_rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, decor->frame->win_extents.left - 0.5, top - 0.5, 5.0, CORNER_TOPLEFT & corners, &color, 1.0, &color, alpha, SHADE_TOP | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + decor->frame->win_extents.left, y1 + 0.5, x2 - x1 - decor->frame->win_extents.left - decor->frame->win_extents.right, top - 0.5, 5.0, 0, &color, 1.0, &color, alpha, SHADE_TOP); fill_rounded_rectangle (cr, x2 - decor->frame->win_extents.right, y1 + 0.5, decor->frame->win_extents.right - 0.5, top - 0.5, 5.0, CORNER_TOPRIGHT & corners, &color, 1.0, &color, alpha, SHADE_TOP | SHADE_RIGHT); } fill_rounded_rectangle (cr, x1 + 0.5, y1 + top, decor->frame->win_extents.left - 0.5, h, 5.0, 0, &color, 1.0, &color, alpha, SHADE_LEFT); fill_rounded_rectangle (cr, x2 - decor->frame->win_extents.right, y1 + top, decor->frame->win_extents.right - 0.5, h, 5.0, 0, &color, 1.0, &color, alpha, SHADE_RIGHT); fill_rounded_rectangle (cr, x1 + 0.5, y2 - decor->frame->win_extents.bottom, decor->frame->win_extents.left - 0.5, decor->frame->win_extents.bottom - 0.5, 5.0, CORNER_BOTTOMLEFT & corners, &color, 1.0, &color, alpha, SHADE_BOTTOM | SHADE_LEFT); fill_rounded_rectangle (cr, x1 + decor->frame->win_extents.left, y2 - decor->frame->win_extents.bottom, x2 - x1 - decor->frame->win_extents.left - decor->frame->win_extents.right, decor->frame->win_extents.bottom - 0.5, 5.0, 0, &color, 1.0, &color, alpha, SHADE_BOTTOM); fill_rounded_rectangle (cr, x2 - decor->frame->win_extents.right, y2 - decor->frame->win_extents.bottom, decor->frame->win_extents.right - 0.5, decor->frame->win_extents.bottom - 0.5, 5.0, CORNER_BOTTOMRIGHT & corners, &color, 1.0, &color, alpha, SHADE_BOTTOM | SHADE_RIGHT); cairo_rectangle (cr, decor->context->left_space, decor->context->top_space, decor->width - decor->context->left_space - decor->context->right_space, h); gdk_cairo_set_source_rgba (cr, &bg); cairo_fill (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (decor->active) { fg.alpha = 0.7; gdk_cairo_set_source_rgba (cr, &fg); cairo_move_to (cr, x1 + 0.5, y1 + top - 0.5); cairo_rel_line_to (cr, x2 - x1 - 1.0, 0.0); cairo_stroke (cr); } rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); cairo_clip (cr); cairo_translate (cr, 1.0, 1.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.4); cairo_stroke (cr); cairo_translate (cr, -2.0, -2.0); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.1); cairo_stroke (cr); cairo_translate (cr, 1.0, 1.0); cairo_reset_clip (cr); rounded_rectangle (cr, x1 + 0.5, y1 + 0.5, x2 - x1 - 1.0, y2 - y1 - 1.0, 5.0, (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners); fg.alpha = alpha; gdk_cairo_set_source_rgba (cr, &fg); cairo_stroke (cr); cairo_set_line_width (cr, 2.0); button_x = decor->width - decor->context->right_space - 13; titlebar_height = get_titlebar_height (decor->frame); if (decor->actions & WNCK_WINDOW_ACTION_CLOSE) { button_state_offsets (button_x, y1 - 3.0 + titlebar_height / 2, decor->button_states[BUTTON_CLOSE], &x, &y); button_x -= 17; if (decor->active) { cairo_move_to (cr, x, y); draw_close_button (cr, 3.0); button_state_paint (cr, context, &color, decor->button_states[BUTTON_CLOSE]); } else { fg.alpha = alpha * 0.75; gdk_cairo_set_source_rgba (cr, &fg); cairo_move_to (cr, x, y); draw_close_button (cr, 3.0); cairo_fill (cr); } } if (decor->actions & WNCK_WINDOW_ACTION_MAXIMIZE) { button_state_offsets (button_x, y1 - 3.0 + titlebar_height / 2, decor->button_states[BUTTON_MAX], &x, &y); button_x -= 17; cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); if (decor->active) { fg.alpha = STROKE_ALPHA; gdk_cairo_set_source_rgba (cr, &fg); cairo_move_to (cr, x, y); if (decor->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) draw_unmax_button (cr, 4.0); else draw_max_button (cr, 4.0); button_state_paint (cr, context, &color, decor->button_states[BUTTON_MAX]); } else { fg.alpha = alpha * 0.75; gdk_cairo_set_source_rgba (cr, &fg); cairo_move_to (cr, x, y); if (decor->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) draw_unmax_button (cr, 4.0); else draw_max_button (cr, 4.0); cairo_fill (cr); } } if (decor->actions & WNCK_WINDOW_ACTION_MINIMIZE) { button_state_offsets (button_x, y1 - 3.0 + titlebar_height / 2, decor->button_states[BUTTON_MIN], &x, &y); button_x -= 17; if (decor->active) { fg.alpha = STROKE_ALPHA; gdk_cairo_set_source_rgba (cr, &fg); cairo_move_to (cr, x, y); draw_min_button (cr, 4.0); button_state_paint (cr, context, &color, decor->button_states[BUTTON_MIN]); } else { fg.alpha = alpha * 0.75; gdk_cairo_set_source_rgba (cr, &fg); cairo_move_to (cr, x, y); draw_min_button (cr, 4.0); cairo_fill (cr); } } if (decor->layout) { if (decor->active) { cairo_move_to (cr, decor->context->left_space + 21.0, y1 + 2.0 + (titlebar_height - decor->frame->text_height) / 2.0); fg.alpha = STROKE_ALPHA; gdk_cairo_set_source_rgba (cr, &fg); pango_cairo_layout_path (cr, decor->layout); cairo_stroke (cr); cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); } else { fg.alpha = alpha; gdk_cairo_set_source_rgba (cr, &fg); } cairo_move_to (cr, decor->context->left_space + 21.0, y1 + 2.0 + (titlebar_height - decor->frame->text_height) / 2.0); pango_cairo_show_layout (cr, decor->layout); } if (decor->icon) { cairo_translate (cr, decor->context->left_space + 1, y1 - 5.0 + titlebar_height / 2); cairo_set_source (cr, decor->icon); cairo_rectangle (cr, 0.0, 0.0, 16.0, 16.0); cairo_clip (cr); if (decor->active) cairo_paint (cr); else cairo_paint_with_alpha (cr, alpha); } cairo_destroy (cr); copy_to_front_buffer (decor); if (decor->prop_xid) { decor_update_window_property (decor); decor->prop_xid = 0; } } static gboolean gwd_theme_cairo_calc_decoration_size (GWDTheme *theme, decor_t *decor, gint w, gint h, gint name_width, gint *width, gint *height) { decor_layout_t layout; gint top_width; if (!decor->decorated) return FALSE; /* To avoid wasting texture memory, we only calculate the minimal * required decoration size then clip and stretch the texture where * appropriate */ calc_button_size (decor); if (w < ICON_SPACE + decor->button_width) return FALSE; top_width = name_width + decor->button_width + ICON_SPACE; if (w < top_width) top_width = MAX (ICON_SPACE + decor->button_width, w); if (decor->active) decor_get_default_layout (&decor->frame->window_context_active, top_width, 1, &layout); else decor_get_default_layout (&decor->frame->window_context_inactive, top_width, 1, &layout); if (!decor->context || memcmp (&layout, &decor->border_layout, sizeof (layout))) { *width = layout.width; *height = layout.height; decor->border_layout = layout; if (decor->active) { decor->context = &decor->frame->window_context_active; decor->shadow = decor->frame->border_shadow_active; } else { decor->context = &decor->frame->window_context_inactive; decor->shadow = decor->frame->border_shadow_inactive; } return TRUE; } return FALSE; } static void gwd_theme_cairo_update_border_extents (GWDTheme *theme, decor_frame_t *frame) { decor_extents_t win_extents = { 6, 6, 10, 6 }; decor_extents_t max_win_extents = { 6, 6, 4, 6 }; gint titlebar_height = get_titlebar_height (frame); frame = gwd_decor_frame_ref (frame); win_extents.top += titlebar_height; max_win_extents.top += titlebar_height; frame->win_extents = win_extents; frame->max_win_extents = max_win_extents; gwd_decor_frame_unref (frame); } static void gwd_theme_cairo_get_event_window_position (GWDTheme *theme, decor_t *decor, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { gint titlebar_height = get_titlebar_height (decor->frame); *x = pos[i][j].x + pos[i][j].xw * width; *y = pos[i][j].y + pos[i][j].yh * height + pos[i][j].yth * (titlebar_height - 17); if ((decor->state & WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY) && (j == 0 || j == 2)) { *w = 0; } else { *w = pos[i][j].w + pos[i][j].ww * width; } if ((decor->state & WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY) && (i == 0 || i == 2)) { *h = 0; } else { *h = pos[i][j].h + pos[i][j].hh * height + pos[i][j].hth * (titlebar_height - 17); } } static gboolean gwd_theme_cairo_get_button_position (GWDTheme *theme, decor_t *decor, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { gint titlebar_height = get_titlebar_height (decor->frame); if (i > BUTTON_MENU) return FALSE; *x = bpos[i].x + bpos[i].xw * width; *y = bpos[i].y + bpos[i].yh * height + bpos[i].yth * (titlebar_height - 17); *w = bpos[i].w + bpos[i].ww * width; *h = bpos[i].h + bpos[i].hh * height + bpos[i].hth + (titlebar_height - 17); /* hack to position multiple buttons on the right */ if (i != BUTTON_MENU) { gint position = 0; gint button = 0; while (button != i) { if (button_present (decor, button)) position++; button++; } *x -= 10 + 16 * position; } return TRUE; } static void gwd_theme_cairo_class_init (GWDThemeCairoClass *cairo_class) { GObjectClass *object_class = G_OBJECT_CLASS (cairo_class); GWDThemeClass *theme_class = GWD_THEME_CLASS (cairo_class); object_class->constructed = gwd_theme_cairo_constructed; theme_class->style_updated = gwd_theme_cairo_style_updated; theme_class->draw_window_decoration = gwd_theme_cairo_draw_window_decoration; theme_class->calc_decoration_size = gwd_theme_cairo_calc_decoration_size; theme_class->update_border_extents = gwd_theme_cairo_update_border_extents; theme_class->get_event_window_position = gwd_theme_cairo_get_event_window_position; theme_class->get_button_position = gwd_theme_cairo_get_button_position; } static void gwd_theme_cairo_init (GWDThemeCairo *cairo) { } ./gtk/window-decorator/gwd-theme-metacity.h0000644000004100000410000000220713246301623021167 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) 2016 Alberts Muktupāvels * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GWD_THEME_METACITY_H #define GWD_THEME_METACITY_H #include "gwd-settings.h" #include "gwd-theme.h" G_BEGIN_DECLS #define GWD_TYPE_THEME_METACITY gwd_theme_metacity_get_type () G_DECLARE_FINAL_TYPE (GWDThemeMetacity, gwd_theme_metacity, GWD, THEME_METACITY, GWDTheme) GWDTheme * gwd_theme_metacity_new (GWDSettings *settings); G_END_DECLS #endif ./gtk/window-decorator/gdk.c0000644000004100000410000000373413246301623016237 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" cairo_surface_t * create_native_surface_and_wrap (int w, int h, GtkWidget *parent_style_window) { GdkWindow *window; GdkVisual *visual; cairo_surface_t *surface; Display *display; Pixmap pixmap; if (w <= 0 || h <= 0) abort (); display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); window = gtk_widget_get_window (parent_style_window); visual = gdk_window_get_visual (window); pixmap = XCreatePixmap (display, GDK_WINDOW_XID (window), w, h, gdk_visual_get_depth (visual)); surface = cairo_xlib_surface_create (display, pixmap, GDK_VISUAL_XVISUAL (visual), w, h); return surface; } cairo_surface_t * create_surface (int w, int h, GtkWidget *parent_style_window) { GdkWindow *window; cairo_surface_t *surface; if (w == 0 || h == 0) abort (); window = gtk_widget_get_window (parent_style_window); surface = gdk_window_create_similar_surface (window, CAIRO_CONTENT_COLOR_ALPHA, w, h); return surface; } ./gtk/window-decorator/settings.c0000644000004100000410000000267613246301623017336 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" #include "gwd-settings-storage.h" #include "gwd-settings-xproperty-storage.h" GWDSettingsStorage *storage = NULL; GWDSettingsXPropertyStorage *xprop_storage = NULL; void init_settings (GWDSettings *settings) { storage = gwd_settings_storage_new (settings); xprop_storage = gwd_settings_xproperty_storage_new (settings); gwd_process_decor_shadow_property_update (); } void fini_settings () { g_clear_object (&storage); g_clear_object (&xprop_storage); } gboolean gwd_process_decor_shadow_property_update () { return gwd_settings_xproperty_storage_update_all (xprop_storage); } ./gtk/window-decorator/actionmenu.c0000644000004100000410000000743513246301623017636 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" static void action_menu_unmap (GObject *object) { action_menu_mapped = FALSE; } static void action_menu_destroyed (GObject *object) { g_signal_handlers_disconnect_by_func (action_menu, action_menu_destroyed, NULL); g_signal_handlers_disconnect_by_func (action_menu, action_menu_unmap, NULL); g_object_unref (action_menu); action_menu = NULL; action_menu_mapped = FALSE; } static void position_action_menu (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { WnckWindow *win = (WnckWindow *) user_data; decor_frame_t *frame = gwd_get_decor_frame (get_frame_type (win)); decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gint bx, by, width, height; wnck_window_get_client_window_geometry (win, x, y, &width, &height); if (d->decorated) { if (gwd_theme_get_button_position (gwd_theme, d, BUTTON_MENU, width, height, &bx, &by, &width, &height)) *x = *x - frame->win_extents.left + bx; } gwd_decor_frame_unref (frame); if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) { GtkRequisition req; gtk_widget_get_preferred_size (GTK_WIDGET (menu), &req, NULL); *x = MAX (0, *x - req.width + width); } *push_in = TRUE; } void action_menu_map (WnckWindow *win, long button, Time time) { GdkDisplay *gdkdisplay; GdkScreen *screen; Display *display; gdkdisplay = gdk_display_get_default (); display = gdk_x11_display_get_xdisplay (gdkdisplay); screen = gdk_display_get_default_screen (gdkdisplay); if (action_menu) { if (action_menu_mapped) { gtk_widget_destroy (action_menu); return; } else gtk_widget_destroy (action_menu); } switch (wnck_window_get_window_type (win)) { case WNCK_WINDOW_DESKTOP: case WNCK_WINDOW_DOCK: /* don't allow window action */ return; case WNCK_WINDOW_NORMAL: case WNCK_WINDOW_DIALOG: case WNCK_WINDOW_TOOLBAR: case WNCK_WINDOW_MENU: case WNCK_WINDOW_UTILITY: case WNCK_WINDOW_SPLASHSCREEN: /* allow window action menu */ break; } action_menu = wnck_action_menu_new (win); g_object_ref_sink (action_menu); gtk_menu_set_screen (GTK_MENU (action_menu), screen); g_signal_connect (G_OBJECT (action_menu), "destroy", G_CALLBACK (action_menu_destroyed), NULL); g_signal_connect (G_OBJECT (action_menu), "unmap", G_CALLBACK (action_menu_unmap), NULL); gtk_widget_show (action_menu); XUngrabPointer (display, time); XUngrabKeyboard (display, time); if (!button || button == 1) { gtk_menu_popup (GTK_MENU (action_menu), NULL, NULL, position_action_menu, (gpointer) win, button, time); } else { gtk_menu_popup (GTK_MENU (action_menu), NULL, NULL, NULL, NULL, button, time); } action_menu_mapped = TRUE; } ./gtk/window-decorator/gtk-window-decorator.c0000644000004100000410000002740213246301623021542 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2009 Sam Spilsbury * Frames Management: Copright © 2010 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings.h" GWDTheme *gwd_theme; gdouble decoration_alpha = 0.5; gboolean minimal = FALSE; const unsigned short ICON_SPACE = 20; Atom frame_input_window_atom; Atom win_decor_atom; Atom win_blur_decor_atom; Atom wm_move_resize_atom; Atom restack_window_atom; Atom select_window_atom; Atom mwm_hints_atom; Atom switcher_fg_atom; Atom compiz_shadow_info_atom; Atom compiz_shadow_color_atom; Atom toolkit_action_atom; Atom toolkit_action_window_menu_atom; Atom toolkit_action_force_quit_dialog_atom; Atom net_wm_state_atom; Atom net_wm_state_modal_atom; Atom decor_request_atom; Atom decor_pending_atom; Atom decor_delete_pixmap_atom; Atom utf8_string_atom; Atom gtk_theme_variant_atom; Time dm_sn_timestamp; struct _cursor cursor[3][3] = { { C (top_left_corner), C (top_side), C (top_right_corner) }, { C (left_side), C (left_ptr), C (right_side) }, { C (bottom_left_corner), C (bottom_side), C (bottom_right_corner) } }; struct _pos pos[3][3] = { { { 0, 0, 10, 21, 0, 0, 0, 0, 0, 1 }, { 10, 0, -8, 6, 0, 0, 1, 0, 0, 1 }, { 2, 0, 10, 21, 1, 0, 0, 0, 0, 1 } }, { { 0, 10, 6, 11, 0, 0, 0, 1, 1, 0 }, { 6, 6, 0, 15, 0, 0, 1, 0, 0, 1 }, { 6, 10, 6, 11, 1, 0, 0, 1, 1, 0 } }, { { 0, 17, 10, 10, 0, 1, 0, 0, 1, 0 }, { 10, 21, -8, 6, 0, 1, 1, 0, 1, 0 }, { 2, 17, 10, 10, 1, 1, 0, 0, 1, 0 } } }, bpos[] = { { 0, 6, 16, 16, 1, 0, 0, 0, 0, 0 }, { 0, 6, 16, 16, 1, 0, 0, 0, 0, 0 }, { 0, 6, 16, 16, 1, 0, 0, 0, 0, 0 }, { 6, 2, 16, 16, 0, 0, 0, 0, 0, 0 } }; #define WINDOW_TYPE_FRAMES_NUM 5 default_frame_references_t default_frames[WINDOW_TYPE_FRAMES_NUM * 2] = { /* active */ {"normal", NULL }, {"dialog", NULL }, {"modal_dialog", NULL }, {"menu", NULL }, {"utility", NULL}, /* inactive */ {"normal", NULL }, {"dialog", NULL }, {"modal_dialog", NULL }, {"menu", NULL }, {"utility", NULL} }; char *program_name; GtkWidget *switcher_label; GHashTable *frame_table; GtkWidget *action_menu = NULL; gboolean action_menu_mapped = FALSE; gint double_click_timeout = 250; GtkWidget *tip_window; GtkWidget *tip_label; GTimeVal tooltip_last_popdown = { 0, 0 }; gint tooltip_timer_tag = 0; GSList *draw_list = NULL; guint draw_idle_id = 0; Window switcher_selected_window = None; decor_t *switcher_window = NULL; XRenderPictFormat *xformat_rgba; const gchar * window_type_frames[WINDOW_TYPE_FRAMES_NUM] = { "normal", "modal_dialog", "dialog", "menu", "utility" }; static void update_decorations_cb (GWDSettings *settings, gpointer user_data) { decorations_changed (wnck_screen_get_default ()); } static void update_titlebar_font_cb (GWDSettings *settings, gpointer user_data) { gwd_theme_update_titlebar_font (gwd_theme); } static void update_metacity_theme_cb (GWDSettings *settings, gint metacity_theme_type, const gchar *metacity_theme_name, gpointer user_data) { GWDThemeType type = GWD_THEME_TYPE_CAIRO; if (metacity_theme_name != NULL) type = GWD_THEME_TYPE_METACITY; g_set_object (&gwd_theme, gwd_theme_new (type, settings)); gwd_theme_update_titlebar_font (gwd_theme); } int main (int argc, char *argv[]) { GdkDisplay *gdkdisplay; Display *xdisplay; GdkScreen *gdkscreen; WnckScreen *screen; GWDSettings *settings; gint i, j, status; gboolean replace = FALSE; unsigned int nchildren; Window root_ret, parent_ret; Window *children = NULL; GList *windows, *win; decor_frame_t *bare_p, *switcher_p; const char *option_meta_theme = NULL; gint option_blur_type = BLUR_TYPE_UNSET; program_name = argv[0]; gtk_init (&argc, &argv); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); for (i = 0; i < argc; ++i) { if (strcmp (argv[i], "--minimal") == 0) { minimal = TRUE; } else if (strcmp (argv[i], "--replace") == 0) { replace = TRUE; } else if (strcmp (argv[i], "--blur") == 0) { if (argc > ++i) { if (strcmp (argv[i], "titlebar") == 0) option_blur_type = BLUR_TYPE_TITLEBAR; else if (strcmp (argv[i], "all") == 0) option_blur_type = BLUR_TYPE_ALL; } } #ifdef USE_METACITY else if (strcmp (argv[i], "--metacity-theme") == 0) { if (argc > ++i) option_meta_theme = argv[i]; } #endif else if (strcmp (argv[i], "--help") == 0) { fprintf (stderr, "%s " "[--minimal] " "[--replace] " "[--blur none|titlebar|all] " #ifdef USE_METACITY "[--metacity-theme THEME] " #endif "[--help]" "\n", program_name); return 0; } } gdkdisplay = gdk_display_get_default (); xdisplay = gdk_x11_display_get_xdisplay (gdkdisplay); gdkscreen = gdk_display_get_default_screen (gdkdisplay); frame_input_window_atom = XInternAtom (xdisplay, DECOR_INPUT_FRAME_ATOM_NAME, FALSE); win_decor_atom = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, FALSE); win_blur_decor_atom = XInternAtom (xdisplay, DECOR_BLUR_ATOM_NAME, FALSE); wm_move_resize_atom = XInternAtom (xdisplay, "_NET_WM_MOVERESIZE", FALSE); restack_window_atom = XInternAtom (xdisplay, "_NET_RESTACK_WINDOW", FALSE); select_window_atom = XInternAtom (xdisplay, DECOR_SWITCH_WINDOW_ATOM_NAME, FALSE); mwm_hints_atom = XInternAtom (xdisplay, "_MOTIF_WM_HINTS", FALSE); switcher_fg_atom = XInternAtom (xdisplay, DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, FALSE); compiz_shadow_info_atom = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_PROPERTIES", FALSE); compiz_shadow_color_atom = XInternAtom (xdisplay, "_COMPIZ_NET_CM_SHADOW_COLOR", FALSE); toolkit_action_atom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION", FALSE); toolkit_action_window_menu_atom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", FALSE); toolkit_action_force_quit_dialog_atom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG", FALSE); net_wm_state_atom = XInternAtom (xdisplay,"_NET_WM_STATE", 0); net_wm_state_modal_atom = XInternAtom (xdisplay, "_NET_WM_STATE_MODAL", 0); decor_request_atom = XInternAtom (xdisplay, DECOR_REQUEST_PIXMAP_ATOM_NAME, 0); decor_pending_atom = XInternAtom (xdisplay, DECOR_PIXMAP_PENDING_ATOM_NAME, 0); decor_delete_pixmap_atom = XInternAtom (xdisplay, DECOR_DELETE_PIXMAP_ATOM_NAME, 0); utf8_string_atom = XInternAtom (xdisplay, "UTF8_STRING", 0); gtk_theme_variant_atom = XInternAtom (xdisplay, "_GTK_THEME_VARIANT", 0); status = decor_acquire_dm_session (xdisplay, gdk_screen_get_number (gdkscreen), "gwd", replace, &dm_sn_timestamp); if (status != DECOR_ACQUIRE_STATUS_SUCCESS) { if (status == DECOR_ACQUIRE_STATUS_FAILED) { fprintf (stderr, "%s: Could not acquire decoration manager " "selection on screen %d display \"%s\"\n", program_name, gdk_screen_get_number (gdkscreen), DisplayString (xdisplay)); } else if (status == DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING) { fprintf (stderr, "%s: Screen %d on display \"%s\" already " "has a decoration manager; try using the " "--replace option to replace the current " "decoration manager.\n", program_name, gdk_screen_get_number (gdkscreen), DisplayString (xdisplay)); } return 1; } screen = wnck_screen_get_default (); initialize_decorations (); settings = gwd_settings_new (option_blur_type, option_meta_theme); if (!settings) return 1; g_signal_connect (settings, "update-decorations", G_CALLBACK (update_decorations_cb), NULL); g_signal_connect (settings, "update-titlebar-font", G_CALLBACK (update_titlebar_font_cb), NULL); g_signal_connect (settings, "update-metacity-theme", G_CALLBACK (update_metacity_theme_cb), NULL); gwd_settings_freeze_updates (settings); init_settings (settings); for (i = 0; i < 3; ++i) { for (j = 0; j < 3; j++) { if (cursor[i][j].shape != XC_left_ptr) cursor[i][j].cursor = XCreateFontCursor (xdisplay, cursor[i][j].shape); } } xformat_rgba = XRenderFindStandardFormat (xdisplay, PictStandardARGB32); frame_table = g_hash_table_new (NULL, NULL); if (!create_tooltip_window ()) { g_object_unref (settings); fprintf (stderr, "%s, Couldn't create tooltip window\n", argv[0]); return 1; } wnck_set_client_type (WNCK_CLIENT_TYPE_PAGER); gdk_window_add_filter (NULL, selection_event_filter_func, NULL); if (!minimal) { GdkWindow *root = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), gdk_x11_get_default_root_xwindow ()); gdk_window_add_filter (NULL, event_filter_func, NULL); XQueryTree (xdisplay, gdk_x11_get_default_root_xwindow (), &root_ret, &parent_ret, &children, &nchildren); for (i = 0; i < nchildren; ++i) { GdkWindow *toplevel = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), children[i]); /* Need property notify on all windows */ gdk_window_set_events (toplevel, gdk_window_get_events (toplevel) | GDK_PROPERTY_CHANGE_MASK); } /* Need MapNotify on new windows */ gdk_window_set_events (root, gdk_window_get_events (root) | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_SUBSTRUCTURE_MASK); connect_screen (screen); } decor_set_dm_check_hint (xdisplay, gdk_screen_get_number (gdkscreen), WINDOW_DECORATION_TYPE_PIXMAP); /* Update the decorations based on the settings */ gwd_settings_thaw_updates (settings); /* Keep the default, bare and switcher decorations around * since otherwise they will be spuriously recreated */ bare_p = gwd_get_decor_frame ("bare"); switcher_p = gwd_get_decor_frame ("switcher"); update_default_decorations (gdkscreen); gtk_main (); win = windows = wnck_screen_get_windows (screen); while (win != NULL) { WnckWindow *w = (WnckWindow *) win->data; window_closed (screen, w); win = g_list_next (win); } g_list_free (windows); if (tip_label) gtk_widget_destroy (GTK_WIDGET (tip_label)); if (tip_window) gtk_widget_destroy (GTK_WIDGET (tip_window)); gwd_decor_frame_unref (bare_p); gwd_decor_frame_unref (switcher_p); g_clear_object (&gwd_theme); fini_settings (); g_clear_object (&settings); return 0; } ./gtk/window-decorator/cairo.c0000644000004100000410000000714413246301623016566 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" void rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner) { if (corner & CORNER_TOPLEFT) cairo_move_to (cr, x + radius, y); else cairo_move_to (cr, x, y); if (corner & CORNER_TOPRIGHT) cairo_arc (cr, x + w - radius, y + radius, radius, M_PI * 1.5, M_PI * 2.0); else cairo_line_to (cr, x + w, y); if (corner & CORNER_BOTTOMRIGHT) cairo_arc (cr, x + w - radius, y + h - radius, radius, 0.0, M_PI * 0.5); else cairo_line_to (cr, x + w, y + h); if (corner & CORNER_BOTTOMLEFT) cairo_arc (cr, x + radius, y + h - radius, radius, M_PI * 0.5, M_PI); else cairo_line_to (cr, x, y + h); if (corner & CORNER_TOPLEFT) cairo_arc (cr, x + radius, y + radius, radius, M_PI, M_PI * 1.5); else cairo_line_to (cr, x, y); } void fill_rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner, decor_color_t *c0, double alpha0, decor_color_t *c1, double alpha1, int gravity) { cairo_pattern_t *pattern; rounded_rectangle (cr, x, y, w, h, radius, corner); if (gravity & SHADE_RIGHT) { x = x + w; w = -w; } else if (!(gravity & SHADE_LEFT)) { x = w = 0; } if (gravity & SHADE_BOTTOM) { y = y + h; h = -h; } else if (!(gravity & SHADE_TOP)) { y = h = 0; } if (w && h) { cairo_matrix_t matrix; pattern = cairo_pattern_create_radial (0.0, 0.0, 0.0, 0.0, 0.0, w); cairo_matrix_init_scale (&matrix, 1.0, w / h); cairo_matrix_translate (&matrix, -(x + w), -(y + h)); cairo_pattern_set_matrix (pattern, &matrix); } else { pattern = cairo_pattern_create_linear (x + w, y + h, x, y); } cairo_pattern_add_color_stop_rgba (pattern, 0.0, c0->r, c0->g, c0->b, alpha0); cairo_pattern_add_color_stop_rgba (pattern, 1.0, c1->r, c1->g, c1->b, alpha1); cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); } void draw_shadow_background (decor_t *d, cairo_t *cr, decor_shadow_t *s, decor_context_t *c) { Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); if (!s || !s->picture ||!d->picture) { cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); cairo_paint (cr); } else { decor_fill_picture_extents_with_shadow (xdisplay, s, c, d->picture, &d->border_layout); } } ./gtk/window-decorator/gwd-settings-xproperty-storage.h0000644000004100000410000000260113246301623023622 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef GWD_SETTINGS_XPROPERTY_STORAGE_H #define GWD_SETTINGS_XPROPERTY_STORAGE_H #include "gwd-settings.h" G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_XPROPERTY_STORAGE gwd_settings_xproperty_storage_get_type () G_DECLARE_FINAL_TYPE (GWDSettingsXPropertyStorage, gwd_settings_xproperty_storage, GWD, SETTINGS_XPROPERTY_STORAGE, GObject) GWDSettingsXPropertyStorage * gwd_settings_xproperty_storage_new (GWDSettings *settings); gboolean gwd_settings_xproperty_storage_update_all (GWDSettingsXPropertyStorage *storage); G_END_DECLS #endif ./gtk/window-decorator/forcequit.c0000644000004100000410000001213013246301623017461 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" static char * get_client_machine (Window xwindow) { Atom atom, type; gulong nitems, bytes_after; guchar *str = NULL; int format, result; char *retval; atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "WM_CLIENT_MACHINE", FALSE); gdk_error_trap_push (); result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xwindow, atom, 0, G_MAXLONG, FALSE, XA_STRING, &type, &format, &nitems, &bytes_after, &str); gdk_error_trap_pop_ignored (); if (result != Success) return NULL; if (type != XA_STRING) { XFree (str); return NULL; } retval = g_strdup ((gchar *) str); XFree (str); return retval; } static void kill_window (WnckWindow *win) { WnckApplication *app; app = wnck_window_get_application (win); if (app) { gchar buf[257], *client_machine; int pid; pid = wnck_application_get_pid (app); client_machine = get_client_machine (wnck_application_get_xid (app)); if (client_machine && pid > 0) { if (gethostname (buf, sizeof (buf) - 1) == 0) { if (strcmp (buf, client_machine) == 0) kill (pid, 9); } } if (client_machine) g_free (client_machine); } gdk_error_trap_push (); XKillClient (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), wnck_window_get_xid (win)); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); } static void force_quit_dialog_realize (GtkWidget *dialog, void *data) { WnckWindow *win = data; gdk_error_trap_push (); XSetTransientForHint (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), GDK_WINDOW_XID (gtk_widget_get_window (dialog)), wnck_window_get_xid (win)); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); } static void force_quit_dialog_response (GtkWidget *dialog, gint response, void *data) { WnckWindow *win = data; decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (response == GTK_RESPONSE_ACCEPT) kill_window (win); if (d->force_quit_dialog) { d->force_quit_dialog = NULL; gtk_widget_destroy (dialog); } } void show_force_quit_dialog (WnckWindow *win, Time timestamp) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); GtkWidget *dialog; gchar *str, *tmp; const gchar *message; if (d->force_quit_dialog) return; tmp = g_markup_escape_text (wnck_window_get_name (win), -1); str = g_strdup_printf (_("The window \"%s\" is not responding."), tmp); g_free (tmp); message = _("Forcing this application to quit will cause you to lose any unsaved changes."); dialog = gtk_message_dialog_new_with_markup (NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "%s\n\n%s", str, message); g_free (str); gtk_window_set_icon_name (GTK_WINDOW (dialog), "force-quit"); gtk_dialog_add_buttons (GTK_DIALOG (dialog), _("_Cancel"), GTK_RESPONSE_REJECT, _("_Force Quit"), GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_REJECT); g_signal_connect (G_OBJECT (dialog), "realize", G_CALLBACK (force_quit_dialog_realize), win); g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (force_quit_dialog_response), win); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_realize (dialog); gdk_x11_window_set_user_time (gtk_widget_get_window (dialog), timestamp); gtk_widget_show (dialog); d->force_quit_dialog = dialog; } void hide_force_quit_dialog (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->force_quit_dialog) { gtk_widget_destroy (d->force_quit_dialog); d->force_quit_dialog = NULL; } } ./gtk/window-decorator/gwd-theme.c0000644000004100000410000004330713246301623017353 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) 2016 Alberts Muktupāvels * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "gtk-window-decorator.h" #include "gwd-settings.h" #include "gwd-theme.h" #include "gwd-theme-cairo.h" #ifdef USE_METACITY #include "gwd-theme-metacity.h" #endif typedef struct { GWDSettings *settings; PangoFontDescription *titlebar_font; GtkWidget *style_window; gulong monitors_changed_id; gboolean fixed_scale; gint scale; gulong gtk_xft_dpi_id; gdouble dpi; } GWDThemePrivate; enum { PROP_0, PROP_SETTINGS, LAST_PROP }; static GParamSpec *properties[LAST_PROP] = { NULL }; G_DEFINE_TYPE_WITH_PRIVATE (GWDTheme, gwd_theme, G_TYPE_OBJECT) static void frames_update_pango_contexts (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; GWDTheme *theme = GWD_THEME (user_data); GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); if (frame->pango_context == NULL) return; /* FIXME: PangoContext created by gtk_widget_create_pango_context is not * automatically updated. Resolution is not only thing that can change... */ pango_cairo_context_set_resolution (frame->pango_context, priv->dpi * priv->scale); } static void style_updated_cb (GtkWidget *widget, GWDTheme *theme) { gwd_frames_foreach (frames_update_pango_contexts, theme); GWD_THEME_GET_CLASS (theme)->style_updated (theme); decorations_changed (wnck_screen_get_default ()); } static void create_style_window (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); GdkScreen *screen = gdk_screen_get_default (); GdkVisual *visual = gdk_screen_get_rgba_visual (screen); GtkWindow *window; priv->style_window = gtk_window_new (GTK_WINDOW_POPUP); window = GTK_WINDOW (priv->style_window); if (visual) gtk_widget_set_visual (priv->style_window, visual); gtk_window_move (window, -100, -100); gtk_window_resize (window, 1, 1); gtk_widget_show (priv->style_window); g_signal_connect (priv->style_window, "style-updated", G_CALLBACK (style_updated_cb), theme); } static void monitors_changed_cb (GdkScreen *screen, GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); gint scale = gtk_widget_get_scale_factor (priv->style_window); if (priv->scale == scale) return; priv->scale = scale; GWD_THEME_GET_CLASS (theme)->scale_changed (theme); decorations_changed (wnck_screen_get_default ()); } static void track_window_scale (GWDTheme *theme) { GdkScreen *screen = gdk_screen_get_default (); GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); priv->monitors_changed_id = g_signal_connect (screen, "monitors-changed", G_CALLBACK (monitors_changed_cb), theme); priv->fixed_scale = g_getenv ("GDK_SCALE") != NULL; priv->scale = gtk_widget_get_scale_factor (priv->style_window); } static gdouble get_unscaled_dpi (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); gint xft_dpi; gdouble dpi; g_object_get (gtk_settings_get_default (), "gtk-xft-dpi", &xft_dpi, NULL); if (xft_dpi > 0) { const gchar *scale_env; dpi = xft_dpi / 1024.0; /* When using automatic scaling gtk-xft-dpi value is unscaled, but * when it is disabled with GDK_SCALE or gdk_display_x11_set_scale then * this value will be already scaled. */ if (priv->fixed_scale) { GdkScreen *screen = gdk_screen_get_default (); GValue value = G_VALUE_INIT; g_value_init (&value, G_TYPE_INT); if (gdk_screen_get_setting (screen, "gdk-window-scaling-factor", &value)) dpi /= g_value_get_int (&value); } /* gtk-xft-dpi value is not scaled with GDK_DPI_SCALE, we need to do * that manually if we want GDK_DPI_SCALE support in decorations. */ scale_env = g_getenv ("GDK_DPI_SCALE"); if (scale_env) { gdouble scale = g_ascii_strtod (scale_env, NULL); if (scale != 0) dpi *= scale; } } else { dpi = 96.0; } return dpi; } static void notify_gtk_xft_dpi_cb (GtkSettings *settings, GParamSpec *pspec, GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); gdouble dpi = get_unscaled_dpi (theme); if (priv->dpi == dpi) return; priv->dpi = dpi; gwd_frames_foreach (frames_update_pango_contexts, theme); GWD_THEME_GET_CLASS (theme)->dpi_changed (theme); decorations_changed (wnck_screen_get_default ()); } static void track_xft_dpi (GWDTheme *theme) { GtkSettings *settings = gtk_settings_get_default (); GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); priv->gtk_xft_dpi_id = g_signal_connect (settings, "notify::gtk-xft-dpi", G_CALLBACK (notify_gtk_xft_dpi_cb), theme); priv->dpi = get_unscaled_dpi (theme); } static void gwd_theme_constructed (GObject *object) { GWDTheme *theme = GWD_THEME (object); G_OBJECT_CLASS (gwd_theme_parent_class)->constructed (object); create_style_window (theme); track_window_scale (theme); track_xft_dpi (theme); } static void gwd_theme_dispose (GObject *object) { GWDTheme *theme = GWD_THEME (object); GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); g_clear_object (&priv->settings); pango_font_description_free (priv->titlebar_font); priv->titlebar_font = NULL; g_clear_pointer (&priv->style_window, gtk_widget_destroy); if (priv->monitors_changed_id != 0) { GdkScreen *screen = gdk_screen_get_default (); g_signal_handler_disconnect (screen, priv->monitors_changed_id); priv->monitors_changed_id = 0; } if (priv->gtk_xft_dpi_id != 0) { GtkSettings *settings = gtk_settings_get_default (); g_signal_handler_disconnect (settings, priv->gtk_xft_dpi_id); priv->gtk_xft_dpi_id = 0; } G_OBJECT_CLASS (gwd_theme_parent_class)->dispose (object); } static void gwd_theme_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GWDTheme *theme = GWD_THEME (object); GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); switch (property_id) { case PROP_SETTINGS: g_value_set_object (value, priv->settings); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gwd_theme_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDTheme *theme = GWD_THEME (object); GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); switch (property_id) { case PROP_SETTINGS: priv->settings = g_value_dup_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gwd_theme_real_dpi_changed (GWDTheme *theme) { } static void gwd_theme_real_scale_changed (GWDTheme *theme) { } static void gwd_theme_real_style_updated (GWDTheme *theme) { } static void gwd_theme_real_get_shadow (GWDTheme *theme, decor_frame_t *frame, decor_shadow_options_t *options, gboolean active) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); decor_shadow_options_t shadow; if (active) shadow = gwd_settings_get_active_shadow (priv->settings); else shadow = gwd_settings_get_inactive_shadow (priv->settings); memcpy (options, &shadow, sizeof (decor_shadow_options_t)); } static void gwd_theme_real_draw_window_decoration (GWDTheme *theme, decor_t *decor) { } static gboolean gwd_theme_real_calc_decoration_size (GWDTheme *theme, decor_t *decor, gint w, gint h, gint name_width, gint *width, gint *height) { return FALSE; } static void gwd_theme_real_update_border_extents (GWDTheme *theme, decor_frame_t *frame) { } static void gwd_theme_real_get_event_window_position (GWDTheme *theme, decor_t *decor, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { } static gboolean gwd_theme_real_get_button_position (GWDTheme *theme, decor_t *decor, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { return FALSE; } static void gwd_theme_real_update_titlebar_font (GWDTheme *theme, const PangoFontDescription *titlebar_font) { } static void gwd_theme_class_init (GWDThemeClass *theme_class) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (theme_class); object_class->constructed = gwd_theme_constructed; object_class->dispose = gwd_theme_dispose; object_class->get_property = gwd_theme_get_property; object_class->set_property = gwd_theme_set_property; theme_class->dpi_changed = gwd_theme_real_dpi_changed; theme_class->scale_changed = gwd_theme_real_scale_changed; theme_class->style_updated = gwd_theme_real_style_updated; theme_class->get_shadow = gwd_theme_real_get_shadow; theme_class->draw_window_decoration = gwd_theme_real_draw_window_decoration; theme_class->calc_decoration_size = gwd_theme_real_calc_decoration_size; theme_class->update_border_extents = gwd_theme_real_update_border_extents; theme_class->get_event_window_position = gwd_theme_real_get_event_window_position; theme_class->get_button_position = gwd_theme_real_get_button_position; theme_class->update_titlebar_font = gwd_theme_real_update_titlebar_font; properties[PROP_SETTINGS] = g_param_spec_object ("settings", "GWDSettings", "GWDSettings", GWD_TYPE_SETTINGS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, LAST_PROP, properties); } static void gwd_theme_init (GWDTheme *theme) { } /** * gwd_theme_new: * @type: a #GWDThemeType * @settings: a #GWDSettings * * Creates a new #GWDTheme. If requested @type can not be created then a * #GWDThemeCairo will be created as fallback. Thus this function will always * return valid theme. * * Returns: (transfer full): a newly created #GWDTheme */ GWDTheme * gwd_theme_new (GWDThemeType type, GWDSettings *settings) { #ifdef USE_METACITY if (type == GWD_THEME_TYPE_METACITY) { GWDTheme *theme = gwd_theme_metacity_new (settings); /* gwd_theme_metacity_new may return NULL if meta_theme_load fails * to load Metacity theme. In such case we must fallback to Cairo * theme. */ if (theme != NULL) return theme; } #endif return g_object_new (GWD_TYPE_THEME_CAIRO, "settings", settings, NULL); } GWDSettings * gwd_theme_get_settings (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); return priv->settings; } gdouble gwd_theme_get_dpi (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); return priv->dpi; } gint gwd_theme_get_scale (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); return priv->scale; } GtkWidget * gwd_theme_get_style_window (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); return priv->style_window; } void gwd_theme_get_shadow (GWDTheme *theme, decor_frame_t *frame, decor_shadow_options_t *options, gboolean active) { GWD_THEME_GET_CLASS (theme)->get_shadow (theme, frame, options, active); } void gwd_theme_draw_window_decoration (GWDTheme *theme, decor_t *decor) { GWD_THEME_GET_CLASS (theme)->draw_window_decoration (theme, decor); } gboolean gwd_theme_calc_decoration_size (GWDTheme *theme, decor_t *decor, gint w, gint h, gint name_width, gint *width, gint *height) { return GWD_THEME_GET_CLASS (theme)->calc_decoration_size (theme, decor, w, h, name_width, width, height); } void gwd_theme_update_border_extents (GWDTheme *theme, decor_frame_t *frame) { GWD_THEME_GET_CLASS (theme)->update_border_extents (theme, frame); } void gwd_theme_get_event_window_position (GWDTheme *theme, decor_t *decor, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { GWD_THEME_GET_CLASS (theme)->get_event_window_position (theme, decor, i, j, width, height, x, y, w, h); } gboolean gwd_theme_get_button_position (GWDTheme *theme, decor_t *decor, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { return GWD_THEME_GET_CLASS (theme)->get_button_position (theme, decor, i, width, height, x, y, w, h); } void gwd_theme_update_titlebar_font (GWDTheme *theme) { GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); const gchar *titlebar_font = gwd_settings_get_titlebar_font (priv->settings); pango_font_description_free (priv->titlebar_font); priv->titlebar_font = NULL; if (titlebar_font != NULL) priv->titlebar_font = pango_font_description_from_string (titlebar_font); GWD_THEME_GET_CLASS (theme)->update_titlebar_font (theme, priv->titlebar_font); } PangoFontDescription * gwd_theme_get_titlebar_font (GWDTheme *theme, decor_frame_t *frame) { PangoFontDescription *font_desc = NULL; GWDThemePrivate *priv = gwd_theme_get_instance_private (theme); GtkStyleContext *context = gtk_widget_get_style_context (priv->style_window); /* Check if non-system font is in use */ if (priv->titlebar_font) return pango_font_description_copy (priv->titlebar_font); /* Use system titlebar font */ gtk_style_context_save (context); gtk_style_context_set_state (context, GTK_STATE_FLAG_NORMAL); gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL, "font", &font_desc, NULL); gtk_style_context_restore (context); return font_desc; } ./gtk/window-decorator/org.compiz.gwd.gschema.xml0000644000004100000410000000404313246301623022317 0ustar www-datawww-data 'all' Blur Type Blur to use on titlebars - "all" for the entire frame, "titlebar" for just the titlebar and "none" for no blur 1.0 Active Opacity Opacity of active titlebars 1.0 Inactive Opacity Opacity of inactive titlebars true Active shade opacity Shade active windows with metacity theme decorations from opaque to translucent true Inactive shade opacity Shade inactive windows with metacity theme decorations from opaque to translucent 'none' Action to take on scrolling a titlebar Action to take on scrolling a titlebar - "none" for no action, "shade" to shade the window true Use metacity theme Use metacity theme when drawing window decorations false Use tooltips Show tooltip windows on decorator functions ./gtk/window-decorator/decorator.c0000644000004100000410000011673313246301623017460 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings.h" #include "gwd-theme-cairo.h" #ifdef USE_METACITY #include "gwd-theme-metacity.h" #endif static void draw_window_decoration (decor_t *decor) { gwd_theme_draw_window_decoration (gwd_theme, decor); } void destroy_normal_frame (decor_frame_t *frame) { decor_frame_destroy (frame); } void destroy_bare_frame (decor_frame_t *frame) { decor_frame_destroy (frame); } /* * frame_update_titlebar_font * * Returns: void * Description: updates the titlebar font from the pango context, should * be called whenever the gtk style or font has changed */ void frame_update_titlebar_font (decor_frame_t *frame) { GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); PangoFontDescription *font_desc = gwd_theme_get_titlebar_font (gwd_theme, frame); PangoLanguage *lang; PangoFontMetrics *metrics; gint ascent, descent; frame = gwd_decor_frame_ref (frame); if (frame->pango_context == NULL) frame->pango_context = gtk_widget_create_pango_context (style_window); pango_context_set_font_description (frame->pango_context, font_desc); lang = pango_context_get_language (frame->pango_context); metrics = pango_context_get_metrics (frame->pango_context, font_desc, lang); ascent = pango_font_metrics_get_ascent (metrics); descent = pango_font_metrics_get_descent (metrics); frame->text_height = PANGO_PIXELS (ascent + descent); pango_font_metrics_unref (metrics); pango_font_description_free (font_desc); gwd_decor_frame_unref (frame); } /* * update_event_windows * * Returns: void * Description: creates small "event windows" for the buttons specified to be * on the titlebar by wnck. Note here that for the pixmap mode we create actual * X windows but in the reparenting mode this is not possible so we create event * capture boxes on the window instead. The geometry of the decoration is retrieved * with window_get_client_window_geometry and adjusted for shade. Also we * need to query the theme for what window positions are appropriate here. * * This function works on the buttons and also the small event regions that we need * in order to toggle certain actions on the window decoration (eg resize, move) * * So your window decoration might look something like this (not to scale): * * ----------------------------------------------------------- * | rtl | rt | rtr | * | --- |---------------------------------------------| --- | * | | [i][s][m] mv [_][M][X] | | * | |---------------------------------------------| | * | | | | * | rl | window contents | rr | * | | | | * | | | | * | --- |---------------------------------------------| --- | * | rbl | rb | rbr | * ----------------------------------------------------------- * * Where: * - rtl = resize top left * - rtr = resize top right * - rbl = resize bottom left * - rbr = resize bottom right * - rt = resize top * - rb = resize bottom * - rl = resize left * - rr = resize right * - mv = "grab move" area (eg titlebar) * - i = icon * - s = shade * - m = menu * - _ = minimize * - M = maximize * - X = close * * For the reparenting mode we use button_windows[i].pos and for the pixmap mode * we use buttons_windows[i].window * */ void update_event_windows (WnckWindow *win) { Display *xdisplay; decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gint x0, y0, width, height, x, y, w, h; gint i, j, k, l; gint actions = d->actions; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); /* Get the geometry of the client */ wnck_window_get_client_window_geometry (win, &x0, &y0, &width, &height); /* Shaded windows have no height - also skip some event windows */ if (d->state & WNCK_WINDOW_STATE_SHADED) { height = 0; k = l = 1; } else { k = 0; l = 2; } gdk_error_trap_push (); /* [rtl, ru, rtr], [rl, mv, rr], [rbl, rb, rbr] */ for (i = 0; i < 3; ++i) { static guint event_window_actions[3][3] = { { WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE }, { WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_MOVE, WNCK_WINDOW_ACTION_RESIZE }, { WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE, WNCK_WINDOW_ACTION_RESIZE } }; for (j = 0; j < 3; ++j) { w = 0; h = 0; if (actions & event_window_actions[i][j] && i >= k && i <= l) gwd_theme_get_event_window_position (gwd_theme, d, i, j, width, height, &x, &y, &w, &h); /* Pixmap mode with window geometry - create small event windows */ if (w != 0 && h != 0) { XMapWindow (xdisplay, d->event_windows[i][j].window); XMoveResizeWindow (xdisplay, d->event_windows[i][j].window, x, y, w, h); } /* No parent and no geometry - unmap all event windows */ else { XUnmapWindow (xdisplay, d->event_windows[i][j].window); } } } /* no button event windows if width is less than minimum width */ if (width < ICON_SPACE + d->button_width) actions = 0; /* Above, stick, unshade and unstick are only available in wnck => 2.18.1 */ for (i = 0; i < BUTTON_NUM; ++i) { static guint button_actions[BUTTON_NUM] = { WNCK_WINDOW_ACTION_CLOSE, WNCK_WINDOW_ACTION_MAXIMIZE, WNCK_WINDOW_ACTION_MINIMIZE, 0, WNCK_WINDOW_ACTION_SHADE, WNCK_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_STICK, WNCK_WINDOW_ACTION_UNSHADE, WNCK_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_UNSTICK }; /* Pixmap mode - if a box was set and we no longer need it unmap its window */ if (button_actions[i] && !(actions & button_actions[i])) { XUnmapWindow (xdisplay, d->button_windows[i].window); continue; } /* Pixmap mode - if there is a button position for this button then map the window * and resize it to this position */ if (gwd_theme_get_button_position (gwd_theme, d, i, width, height, &x, &y, &w, &h)) { Window x11_win = d->button_windows[i].window; XMapWindow (xdisplay, x11_win); XMoveResizeWindow (xdisplay, x11_win, x, y, w, h); } else { XUnmapWindow (xdisplay, d->button_windows[i].window); } } gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); } /* * wnck_window_get_real_name * * Returns: const char * or NULL * Description: Wrapper function to either get the name of the window or * return NULL */ static const char * wnck_window_get_real_name (WnckWindow *win) { return wnck_window_has_name (win) ? wnck_window_get_name (win) : NULL; } #define wnck_window_get_name wnck_window_get_real_name /* * max_window_name_width * * Returns: gint * Description: Calculate the width of the decoration required to display * the window name using pango (with 6px padding) * Returns zero if window has no name. */ static gint max_window_name_width (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); const gchar *name; gint w; /* Ensure that a layout is created */ if (!d->layout) { d->layout = pango_layout_new (d->frame->pango_context); pango_layout_set_wrap (d->layout, PANGO_WRAP_CHAR); } /* Return zero if window has no name */ name = wnck_window_get_name (win); if (!name) return 0; /* Reset the width, set hte text and get the size required */ pango_layout_set_auto_dir (d->layout, FALSE); pango_layout_set_width (d->layout, -1); pango_layout_set_text (d->layout, name, strlen (name)); pango_layout_get_pixel_size (d->layout, &w, NULL); if (d->name) pango_layout_set_text (d->layout, d->name, strlen (d->name)); return w + 6; } /* * update_window_decoration_name * * Returns: void * Description: frees the last window name and gets the new one from * wnck. Also checks to see if the name has a length (slight optimization) * and re-creates the pango context to re-render the name */ static void update_window_decoration_name (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); const gchar *name; glong name_length; PangoLayoutLine *line; if (d->name) { g_free (d->name); d->name = NULL; } /* Only operate if the window name has a length */ name = wnck_window_get_name (win); if (name && (name_length = strlen (name))) { gint w; /* Cairo mode: w = SHRT_MAX */ if (!GWD_IS_THEME_CAIRO (gwd_theme)) { w = SHRT_MAX; } /* Need to get a minimum width for the name */ else { gint width; wnck_window_get_client_window_geometry (win, NULL, NULL, &width, NULL); w = width - ICON_SPACE - 2 - d->button_width; if (w < 1) w = 1; } /* Ensure that a layout is created */ if (d->layout == NULL) d->layout = pango_layout_new (d->frame->pango_context); /* Set the maximum width for the layout (in case * decoration size < text width) since we * still need to show the buttons and the window name */ pango_layout_set_auto_dir (d->layout, FALSE); pango_layout_set_width (d->layout, w * PANGO_SCALE); pango_layout_set_text (d->layout, name, name_length); line = pango_layout_get_line (d->layout, 0); name_length = line->length; if (pango_layout_get_line_count (d->layout) > 1) { if (name_length < 4) { pango_layout_set_text (d->layout, NULL, 0); return; } d->name = g_strndup (name, name_length); strcpy (d->name + name_length - 3, "..."); } else d->name = g_strndup (name, name_length); /* Truncate the text */ pango_layout_set_text (d->layout, d->name, name_length); } } static cairo_surface_t * surface_new_from_pixbuf (GdkPixbuf *pixbuf, GtkWidget *parent) { guint width; guint height; cairo_surface_t *surface; cairo_t *cr; width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); surface = create_surface (width, height, parent); if (!surface) return NULL; cr = cairo_create (surface); gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); cairo_destroy (cr); return surface; } /* * update_window_decoration_icon * * Updates the window icon (destroys the existing cairo pattern * and creates a new one for the pixmap) */ void update_window_decoration_icon (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); /* Destroy old stuff */ if (d->icon) { cairo_pattern_destroy (d->icon); d->icon = NULL; } if (d->icon_surface) { cairo_surface_destroy (d->icon_surface); d->icon_surface = NULL; } if (d->icon_pixbuf) g_object_unref (G_OBJECT (d->icon_pixbuf)); /* Get the mini icon pixbuf from libwnck */ d->icon_pixbuf = wnck_window_get_mini_icon (win); if (d->icon_pixbuf) { cairo_t *cr; g_object_ref (G_OBJECT (d->icon_pixbuf)); d->icon_surface = surface_new_from_pixbuf (d->icon_pixbuf, style_window); cr = cairo_create (d->icon_surface); d->icon = cairo_pattern_create_for_surface (cairo_get_target (cr)); cairo_destroy (cr); } } /* * request_update_window_decoration_size * Description: asks the rendering process to allow a size update * for pixmap synchronization */ gboolean request_update_window_decoration_size (WnckWindow *win) { decor_t *d; gint width, height; gint x, y, w, h, name_width; if (win == NULL) return FALSE; d = g_object_get_data (G_OBJECT (win), "decor"); if (!d->decorated) return FALSE; /* Get the geometry of the window, we'll need it later */ wnck_window_get_client_window_geometry (win, &x, &y, &w, &h); /* Get the width of the name */ name_width = max_window_name_width (win); /* Ask the theme to tell us how much space it needs. If this is not successful * update the decoration name and return false */ if (!gwd_theme_calc_decoration_size (gwd_theme, d, w, h, name_width, &width, &height)) { update_window_decoration_name (win); return FALSE; } d->width = width; d->height = height; decor_post_pending (gdk_x11_display_get_xdisplay (gdk_display_get_default ()), wnck_window_get_xid (win), populate_frame_type (d), populate_frame_state (d), populate_frame_actions (d)); return TRUE; } /* * update_window_decoration_size * Returns: FALSE for failure, TRUE for success * Description: Calculates the minimum size of the decoration that we need * to render. This is mostly done by the theme but there is some work that * we need to do here first, such as getting the client geometry, setting * drawable depths, creating pixmaps, creating XRenderPictures and * updating the window decoration name */ gboolean update_window_decoration_size (WnckWindow *win) { decor_t *d; cairo_surface_t *surface, *buffer_surface = NULL; Picture picture; Display *xdisplay; GtkWidget *style_window; if (win == NULL) return FALSE; d = g_object_get_data (G_OBJECT (win), "decor"); if (!d->decorated) return FALSE; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); style_window = gwd_theme_get_style_window (gwd_theme); gdk_error_trap_push (); surface = create_native_surface_and_wrap (d->width, d->height, style_window); gdk_flush (); /* Handle failure */ if (gdk_error_trap_pop () || !surface) { if (surface) cairo_surface_destroy (surface); return FALSE; } gdk_error_trap_push (); buffer_surface = create_surface (d->width, d->height, style_window); #ifdef USE_METACITY if (GWD_IS_THEME_METACITY (gwd_theme)) { cairo_surface_set_device_scale (buffer_surface, 1, 1); } #endif gdk_flush (); /* Handle failure */ if (gdk_error_trap_pop () || !buffer_surface) { if (buffer_surface) cairo_surface_destroy (buffer_surface); cairo_surface_destroy (surface); return FALSE; } /* Create XRender context */ picture = XRenderCreatePicture (xdisplay, cairo_xlib_surface_get_drawable (buffer_surface), xformat_rgba, 0, NULL); /* Destroy the old pixmaps and pictures */ if (d->surface) cairo_surface_destroy (d->surface); if (d->x11Pixmap) decor_post_delete_pixmap (xdisplay, wnck_window_get_xid (d->win), d->x11Pixmap); if (d->buffer_surface) cairo_surface_destroy (d->buffer_surface); if (d->picture) XRenderFreePicture (xdisplay, d->picture); if (d->cr) cairo_destroy (d->cr); /* Assign new pixmaps and pictures */ d->surface = surface; d->x11Pixmap = cairo_xlib_surface_get_drawable (d->surface); d->buffer_surface = buffer_surface; d->cr = cairo_create (surface); d->picture = picture; d->prop_xid = wnck_window_get_xid (win); update_window_decoration_name (win); /* Redraw decoration on idle */ queue_decor_draw (d); return TRUE; } /* to save some memory, value is specific to current decorations */ #define TRANSLUCENT_CORNER_SIZE 3 /* * draw_border_shape * Returns: void * Description: Draws a slight border around the decoration */ static void draw_border_shape (Display *xdisplay, Pixmap pixmap, Picture picture, int width, int height, decor_context_t *c, void *closure) { static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; decor_t d; decor_shadow_info_t *info = (decor_shadow_info_t *) closure; double save_decoration_alpha; GdkScreen *screen; memset (&d, 0, sizeof (d)); if (info) { gwd_decor_frame_ref (info->frame); d.frame = info->frame; d.state = info->state; d.actions = info->active; } else { d.frame = gwd_get_decor_frame ("normal"); d.state = 0; d.active = TRUE; } screen = gdk_screen_get_default (); d.surface = cairo_xlib_surface_create (GDK_SCREEN_XDISPLAY (screen), pixmap, GDK_VISUAL_XVISUAL (gdk_screen_get_rgba_visual (screen)), width, height); d.width = width; d.height = height; d.active = TRUE; d.draw = draw_window_decoration; d.picture = picture; d.context = c; /* we use closure argument if maximized */ if (info) d.state = info->state; else d.state = 0; decor_get_default_layout (c, 1, 1, &d.border_layout); /* create shadow from opaque decoration * FIXME: Should not modify settings value * like this */ save_decoration_alpha = decoration_alpha; decoration_alpha = 1.0; (*d.draw) (&d); decoration_alpha = save_decoration_alpha; XRenderFillRectangle (xdisplay, PictOpSrc, picture, &white, c->left_space, c->top_space, width - c->left_space - c->right_space, height - c->top_space - c->bottom_space); if (!info) gwd_decor_frame_unref (d.frame); cairo_surface_destroy (d.surface); } /* * update_shadow * Returns: 1 for success, 0 for failure * Description: creates a libdecoration shadow context and updates * the decoration context for the shadow for the properties that we * have already read from the root window. * * For the pixmap mode we have opt_shadow which is passed to * decor_shadow_create (which contains the shadow settings from * the root window) * * For the reparenting mode we always enforce a zero-shadow in * the opt_no_shadow passed to decor_shadow_create. * * We do something similar for the maximimzed mode as well */ static void bare_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow) { if (frame->border_shadow_active) { decor_shadow_destroy (xdisplay, frame->border_shadow_active); frame->border_shadow_active = NULL; } frame->border_shadow_active = decor_shadow_create (xdisplay, screen, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, opt_shadow, &frame->window_context_active, decor_draw_simple, NULL); } void switcher_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow) { if (frame->border_shadow_active) { decor_shadow_destroy (xdisplay, frame->border_shadow_active); frame->border_shadow_active = NULL; } frame->border_shadow_active = decor_shadow_create (xdisplay, screen, 1, 1, frame->win_extents.left, frame->win_extents.right, frame->win_extents.top, frame->win_extents.bottom, frame->win_extents.left - TRANSLUCENT_CORNER_SIZE, frame->win_extents.right - TRANSLUCENT_CORNER_SIZE, frame->win_extents.top - TRANSLUCENT_CORNER_SIZE, frame->win_extents.bottom - TRANSLUCENT_CORNER_SIZE, opt_shadow, &frame->window_context_active, decor_draw_simple, NULL); } static void decor_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow) { gint left, right, top, bottom; if (*shadow_normal) { decor_shadow_destroy (xdisplay, *shadow_normal); *shadow_normal = NULL; } left = frame->win_extents.left; right = frame->win_extents.right; top = frame->win_extents.top; bottom = frame->win_extents.bottom; if (frame->has_shadow_extents) { left += frame->shadow_extents.left; right += frame->shadow_extents.right; top += frame->shadow_extents.top; bottom += frame->shadow_extents.bottom; } /* * Warning: decor_shadow_create does more than return a decor_shadow_t* * It also has to be called to populate the context parameter * (third last parameter). So even if you don't want a shadow * then you still need to call decor_shadow_create :( */ *shadow_normal = decor_shadow_create (xdisplay, screen, 1, 1, left, right, top, bottom, left - TRANSLUCENT_CORNER_SIZE, right - TRANSLUCENT_CORNER_SIZE, top - TRANSLUCENT_CORNER_SIZE, bottom - TRANSLUCENT_CORNER_SIZE, frame->has_shadow_extents ? opt_no_shadow : opt_shadow, context_normal, draw_border_shape, (void *) info); /* Maximized border shadow pixmap mode */ if (*shadow_max) { decor_shadow_destroy (xdisplay, *shadow_max); *shadow_max = NULL; } left = frame->max_win_extents.left; right = frame->max_win_extents.right; top = frame->max_win_extents.top; bottom = frame->max_win_extents.bottom; if (frame->has_shadow_extents) { left += frame->max_shadow_extents.left; right += frame->max_shadow_extents.right; top += frame->max_shadow_extents.top; bottom += frame->max_shadow_extents.bottom; } info->state = (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY); *shadow_max = decor_shadow_create (xdisplay, screen, 1, 1, left, right, top, bottom, left - TRANSLUCENT_CORNER_SIZE, right - TRANSLUCENT_CORNER_SIZE, top - TRANSLUCENT_CORNER_SIZE, bottom - TRANSLUCENT_CORNER_SIZE, opt_no_shadow, /* No shadow when maximized */ context_max, draw_border_shape, (void *) info); /* Reset info->state */ info->state = 0; } typedef struct _tdtd_shadow_options { decor_shadow_options_t *active_shadow; decor_shadow_options_t *inactive_shadow; } tdtd_shadow_options_t; void frame_update_shadow (decor_frame_t *frame, decor_shadow_info_t *info, decor_shadow_options_t *opt_active_shadow, decor_shadow_options_t *opt_inactive_shadow) { static decor_shadow_options_t no_shadow = {0.0, 0.0, {0, 0, 0}, 0, 0}; gwd_decor_frame_ref (frame); info->active = TRUE; (*frame->update_shadow) (gdk_x11_get_default_xdisplay (), gdk_x11_screen_get_xscreen (gdk_screen_get_default ()), frame, &frame->border_shadow_active, &frame->window_context_active, &frame->max_border_shadow_active, &frame->max_window_context_active, info, opt_active_shadow, &no_shadow); info->active = FALSE; (*frame->update_shadow) (gdk_x11_get_default_xdisplay (), gdk_x11_screen_get_xscreen (gdk_screen_get_default ()), frame, &frame->border_shadow_inactive, &frame->window_context_inactive, &frame->max_border_shadow_inactive, &frame->max_window_context_inactive, info, opt_inactive_shadow, &no_shadow); gwd_decor_frame_unref (frame); } void update_frames_shadows (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; tdtd_shadow_options_t *opts; decor_shadow_options_t active_o, inactive_o; opts = malloc (sizeof (tdtd_shadow_options_t)); if (!opts) return; opts->active_shadow = &active_o; opts->inactive_shadow = &inactive_o; gwd_theme_get_shadow (gwd_theme, frame, opts->active_shadow, TRUE); gwd_theme_get_shadow (gwd_theme, frame, opts->inactive_shadow, FALSE); gwd_decor_frame_ref (frame); decor_shadow_info_t *info = malloc (sizeof (decor_shadow_info_t)); if (!info) { free (opts); return; } info->frame = frame; info->state = 0; frame_update_shadow (frame, info, opts->active_shadow, opts->inactive_shadow); gwd_decor_frame_unref (frame); free (info); info = NULL; free (opts); opts = NULL; } int update_shadow (void) { gwd_frames_foreach (update_frames_shadows, NULL); return 1; } /* * populate_type * * Returns: void * Description: Sets the window type flags for compiz to know what window type * this decoration is for * */ unsigned int populate_frame_type (decor_t *d) { /* FIXME: This would be nicer if Wnck actually worked here, * but for now we need to use that frame string since that's * the only way we can get the modal_dialog type */ const unsigned int n_type_strings = 5; unsigned int frame_type = 0; unsigned int i; struct typestrings { const char *type; unsigned int flag; } type_strings[] = { {"normal", DECOR_WINDOW_TYPE_NORMAL }, {"dialog", DECOR_WINDOW_TYPE_DIALOG }, {"modal_dialog", DECOR_WINDOW_TYPE_MODAL_DIALOG }, {"menu", DECOR_WINDOW_TYPE_MENU }, {"utility", DECOR_WINDOW_TYPE_UTILITY} }; for (i = 0; i < n_type_strings; ++i) { if (strcmp (d->frame->type, type_strings[i].type) == 0) frame_type |= type_strings[i].flag; } return frame_type; } /* * populate_state * * Returns void * Description: Sets the window state flags for compiz to know what state of * window this decoration is for */ unsigned int populate_frame_state (decor_t *d) { unsigned int frame_state = 0; WnckWindowState win_state; const unsigned int n_state_bits = 3; unsigned int i; if (d->active) frame_state |= DECOR_WINDOW_STATE_FOCUS; struct typestrings { unsigned int wnck_flag; unsigned int decor_flag; } state_bits[] = { { WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY, DECOR_WINDOW_STATE_MAXIMIZED_VERT }, { WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY, DECOR_WINDOW_STATE_MAXIMIZED_HORZ }, { WNCK_WINDOW_STATE_SHADED, DECOR_WINDOW_STATE_SHADED } }; /* Not possible to match further than active or not if there is * no window but FIXME we might want to do that later down the line */ if (!d->win) return frame_state == 0; win_state = wnck_window_get_state (d->win); for (i = 0; i < n_state_bits; ++i) { if (win_state & state_bits[i].wnck_flag) frame_state |= state_bits[i].decor_flag; } return frame_state; } /* * populate_actions * * Returns void * Description: Sets the window actions flags for compiz to know what state of * window this decoration is for */ unsigned int populate_frame_actions (decor_t *d) { unsigned int frame_actions = 0; if (!d->win) return frame_actions; WnckWindowActions win_actions = wnck_window_get_actions (d->win); const unsigned int n_action_bits = 16; unsigned int i; struct typestrings { unsigned int decor_flag; unsigned int wnck_flag; } action_bits[] = { { DECOR_WINDOW_ACTION_RESIZE_HORZ, WNCK_WINDOW_ACTION_RESIZE }, { DECOR_WINDOW_ACTION_RESIZE_VERT, WNCK_WINDOW_ACTION_RESIZE }, { DECOR_WINDOW_ACTION_CLOSE, WNCK_WINDOW_ACTION_CLOSE }, { DECOR_WINDOW_ACTION_MINIMIZE, WNCK_WINDOW_ACTION_MINIMIZE }, { DECOR_WINDOW_ACTION_UNMINIMIZE, WNCK_WINDOW_ACTION_UNMINIMIZE }, { DECOR_WINDOW_ACTION_MAXIMIZE_HORZ, WNCK_WINDOW_ACTION_MAXIMIZE_HORIZONTALLY }, { DECOR_WINDOW_ACTION_MAXIMIZE_VERT, WNCK_WINDOW_ACTION_MAXIMIZE_VERTICALLY }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_HORZ, WNCK_WINDOW_ACTION_UNMAXIMIZE_HORIZONTALLY }, { DECOR_WINDOW_ACTION_UNMAXIMIZE_VERT, WNCK_WINDOW_ACTION_UNMAXIMIZE_VERTICALLY }, { DECOR_WINDOW_ACTION_SHADE, WNCK_WINDOW_ACTION_SHADE }, { DECOR_WINDOW_ACTION_UNSHADE, WNCK_WINDOW_ACTION_UNSHADE }, { DECOR_WINDOW_ACTION_STICK, WNCK_WINDOW_ACTION_STICK }, { DECOR_WINDOW_ACTION_UNSTICK, WNCK_WINDOW_ACTION_UNSTICK }, { DECOR_WINDOW_ACTION_FULLSCREEN, WNCK_WINDOW_ACTION_FULLSCREEN }, { DECOR_WINDOW_ACTION_ABOVE, WNCK_WINDOW_ACTION_ABOVE }, { DECOR_WINDOW_ACTION_BELOW, WNCK_WINDOW_ACTION_BELOW }, }; for (i = 0; i < n_action_bits; ++i) { if (win_actions & action_bits[i].wnck_flag) frame_actions |= action_bits[i].decor_flag; } return frame_actions; } /* * update_window_decoration * * Returns: void * Description: The master function to update the window decoration * if the pixmap needs to be redrawn */ void update_window_decoration (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { /* force size update */ d->context = NULL; d->width = d->height = 0; request_update_window_decoration_size (win); update_event_windows (win); } } /* * update_window_decoration_state * * Returns: void * Description: helper function to update the state of the decor_t */ void update_window_decoration_state (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); d->state = wnck_window_get_state (win); } /* * update_window_decoration_actions * * Returns: void * Description: helper function to update the actions of the decor_t */ void update_window_decoration_actions (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); d->actions = wnck_window_get_actions (win); } /* * draw_decor_list * * Returns: bool * Description: function to be called on g_idle_add to draw window * decorations when we are not doing anything */ static gboolean draw_decor_list (void *data) { GSList *list; decor_t *d; draw_idle_id = 0; for (list = draw_list; list; list = list->next) { d = (decor_t *) list->data; (*d->draw) (d); } g_slist_free (draw_list); draw_list = NULL; return FALSE; } /* * queue_decor_draw * * Description :queue a redraw request for this decoration. Since this function * only gets called on idle, don't redraw window decorations multiple * times if they are already waiting to be drawn (since the drawn copy * will always be the most updated one) */ void queue_decor_draw (decor_t *d) { if (g_slist_find (draw_list, d)) return; draw_list = g_slist_append (draw_list, d); if (!draw_idle_id) draw_idle_id = g_idle_add (draw_decor_list, NULL); } /* * update_default_decorations * * Description: update the default decorations */ void update_default_decorations (GdkScreen *screen) { GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); Window xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); Atom bareAtom = XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, FALSE); Atom activeAtom = XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, FALSE); GtkWidget *style_window = gwd_theme_get_style_window (gwd_theme); long *data; decor_frame_t *frame; decor_frame_t *bare_frame = gwd_get_decor_frame ("bare"); decor_extents_t extents; unsigned int i; if (bare_frame->border_shadow_active) { decor_layout_t layout; unsigned int frame_type = 0; unsigned int frame_state = 0; unsigned int frame_actions = 0; unsigned int nQuad; decor_quad_t quads[N_QUADS_MAX]; long *data = decor_alloc_property (1, WINDOW_DECORATION_TYPE_PIXMAP); decor_get_default_layout (&bare_frame->window_context_active, 1, 1, &layout); nQuad = decor_set_lSrStSbS_window_quads (quads, &bare_frame->window_context_active, &layout); decor_quads_to_property (data, 0, bare_frame->border_shadow_active->pixmap, &bare_frame->win_extents, &bare_frame->win_extents, &bare_frame->win_extents, &bare_frame->win_extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); XChangeProperty (xdisplay, xroot, bareAtom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); if (minimal) { XChangeProperty (xdisplay, xroot, activeAtom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); } free (data); } else { XDeleteProperty (xdisplay, xroot, bareAtom); if (minimal) { XDeleteProperty (xdisplay, xroot, activeAtom); } } if (minimal) { gwd_decor_frame_unref (bare_frame); return; } XDeleteProperty (xdisplay, xroot, activeAtom); data = decor_alloc_property (WINDOW_TYPE_FRAMES_NUM * 2, WINDOW_DECORATION_TYPE_PIXMAP); /* All active states and all inactive states */ for (i = 0; i < WINDOW_TYPE_FRAMES_NUM * 2; ++i) { frame = gwd_get_decor_frame (default_frames[i].name); extents = frame->win_extents; if (default_frames[i].d) { if (default_frames[i].d->surface) cairo_surface_destroy (default_frames[i].d->surface); free (default_frames[i].d); } default_frames[i].d = calloc (1, sizeof (decor_t)); default_frames[i].d->context = i < WINDOW_TYPE_FRAMES_NUM ? &frame->window_context_active : &frame->window_context_inactive; default_frames[i].d->shadow = i < WINDOW_TYPE_FRAMES_NUM ? frame->border_shadow_active : frame->border_shadow_inactive; default_frames[i].d->layout = NULL; decor_get_default_layout (default_frames[i].d->context, 1, 1, &default_frames[i].d->border_layout); default_frames[i].d->width = default_frames[i].d->border_layout.width; default_frames[i].d->height = default_frames[i].d->border_layout.height; default_frames[i].d->frame = frame; default_frames[i].d->active = i < WINDOW_TYPE_FRAMES_NUM ? TRUE : FALSE; default_frames[i].d->draw = draw_window_decoration; default_frames[i].d->surface = create_native_surface_and_wrap (default_frames[i].d->width, default_frames[i].d->height, style_window); unsigned int j, k; for (j = 0; j < 3; ++j) { for (k = 0; k < 3; k++) { default_frames[i].d->event_windows[j][k].window = None; } } for (j = 0; j < BUTTON_NUM; ++j) { default_frames[i].d->button_windows[j].window = None; default_frames[i].d->button_states[j] = 0; } if (default_frames[i].d->surface) { gint nQuad; unsigned int frame_type = populate_frame_type (default_frames[i].d); unsigned int frame_state = populate_frame_state (default_frames[i].d); unsigned int frame_actions = populate_frame_actions (default_frames[i].d); decor_quad_t quads[N_QUADS_MAX]; nQuad = decor_set_lSrStSbS_window_quads (quads, default_frames[i].d->context, &default_frames[i].d->border_layout); default_frames[i].d->picture = XRenderCreatePicture (xdisplay, cairo_xlib_surface_get_drawable (default_frames[i].d->surface), xformat_rgba, 0, NULL); (*default_frames[i].d->draw) (default_frames[i].d); decor_quads_to_property (data, i, cairo_xlib_surface_get_drawable (default_frames[i].d->surface), &extents, &extents, &extents, &extents, 0, 0, quads, nQuad, frame_type, frame_state, frame_actions); } gwd_decor_frame_unref (frame); } XChangeProperty (xdisplay, xroot, activeAtom, XA_INTEGER, 32, PropModeAppend, (guchar *) data, PROP_HEADER_SIZE + (WINDOW_TYPE_FRAMES_NUM * 2) * (BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX)); free (data); gwd_decor_frame_unref (bare_frame); } /* * copy_to_front_buffer * * Description: Helper function to copy the buffer pixmap to a front buffer */ void copy_to_front_buffer (decor_t *d) { if (!d->buffer_surface) return; cairo_set_operator (d->cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_surface (d->cr, d->buffer_surface, 0, 0); cairo_paint (d->cr); } decor_frame_t * create_bare_frame (const gchar *type) { decor_frame_t *frame = decor_frame_new (type); decor_context_t _shadow_context = { { 0, 0, 0, 0 }, 0, 0, 0, 0, 0, 0, 0, 0, }; decor_extents_t _shadow_extents = { 0, 0, 0, 0 }; frame->win_extents = _shadow_extents; frame->max_win_extents = _shadow_extents; frame->window_context_active = _shadow_context; frame->window_context_inactive = _shadow_context; frame->max_window_context_active = _shadow_context; frame->max_window_context_inactive = _shadow_context; frame->update_shadow = bare_frame_update_shadow; frame->has_shadow_extents = FALSE; frame->shadow_extents = _shadow_extents; frame->max_shadow_extents = _shadow_extents; return frame; } decor_frame_t * create_normal_frame (const gchar *type) { decor_frame_t *frame = decor_frame_new (type); decor_context_t _window_context = { { 0, 0, 0, 0 }, 6, 6, 4, 6, 0, 0, 0, 0 }; decor_context_t _max_window_context = { { 0, 0, 0, 0 }, 6, 6, 4, 6, 0, 0, 0, 0 }; decor_extents_t _shadow_extents = { 0, 0, 0, 0 }; decor_extents_t _win_extents = { 6, 6, 6, 6 }; decor_extents_t _max_win_extents = { 6, 6, 4, 6 }; frame->win_extents = _win_extents; frame->max_win_extents = _max_win_extents; frame->update_shadow = decor_frame_update_shadow; frame->window_context_active = _window_context; frame->window_context_inactive = _window_context; frame->max_window_context_active = _max_window_context; frame->max_window_context_inactive = _max_window_context; frame->has_shadow_extents = FALSE; frame->shadow_extents = _shadow_extents; frame->max_shadow_extents = _shadow_extents; return frame; } ./gtk/window-decorator/events.c0000644000004100000410000005605513246301623017002 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings.h" #define DOUBLE_CLICK_DISTANCE 8.0f #define WM_MOVERESIZE_SIZE_TOPLEFT 0 #define WM_MOVERESIZE_SIZE_TOP 1 #define WM_MOVERESIZE_SIZE_TOPRIGHT 2 #define WM_MOVERESIZE_SIZE_RIGHT 3 #define WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4 #define WM_MOVERESIZE_SIZE_BOTTOM 5 #define WM_MOVERESIZE_SIZE_BOTTOMLEFT 6 #define WM_MOVERESIZE_SIZE_LEFT 7 #define WM_MOVERESIZE_MOVE 8 #define WM_MOVERESIZE_SIZE_KEYBOARD 9 #define WM_MOVERESIZE_MOVE_KEYBOARD 10 static double square (double x) { return x * x; } static double dist (double x1, double y1, double x2, double y2) { return sqrt (square (x1 - x2) + square (y1 - y2)); } static void move_resize_window (WnckWindow *win, int direction, decor_event *gtkwd_event) { Display *xdisplay; GdkDisplay *gdkdisplay; GdkScreen *screen; Window xroot; XEvent ev; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); screen = gdk_display_get_default_screen (gdkdisplay); xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); if (action_menu_mapped) { gtk_widget_destroy (action_menu); return; } ev.xclient.type = ClientMessage; ev.xclient.display = xdisplay; ev.xclient.serial = 0; ev.xclient.send_event = TRUE; ev.xclient.window = wnck_window_get_xid (win); ev.xclient.message_type = wm_move_resize_atom; ev.xclient.format = 32; ev.xclient.data.l[0] = gtkwd_event->x_root; ev.xclient.data.l[1] = gtkwd_event->y_root; ev.xclient.data.l[2] = direction; ev.xclient.data.l[3] = gtkwd_event->button; ev.xclient.data.l[4] = 1; XUngrabPointer (xdisplay, gtkwd_event->time); XUngrabKeyboard (xdisplay, gtkwd_event->time); XSendEvent (xdisplay, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &ev); XSync (xdisplay, FALSE); } static void common_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, int button, int max, char *tooltip) { GWDSettings *settings = gwd_theme_get_settings (gwd_theme); gboolean use_tooltips = gwd_settings_get_use_tooltips (settings); decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[button]; if (use_tooltips) handle_tooltip_event (win, gtkwd_event, gtkwd_type, state, tooltip); switch (gtkwd_type) { case GButtonPress: if (gtkwd_event->button <= max) d->button_states[button] |= PRESSED_EVENT_WINDOW; break; case GButtonRelease: if (gtkwd_event->button <= max) d->button_states[button] &= ~PRESSED_EVENT_WINDOW; break; case GEnterNotify: d->button_states[button] |= IN_EVENT_WINDOW; break; case GLeaveNotify: d->button_states[button] &= ~IN_EVENT_WINDOW; break; default: break; } if (state != d->button_states[button]) queue_decor_draw (d); } #define BUTTON_EVENT_ACTION_STATE (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW) void close_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_CLOSE]; if (action_menu_mapped && gtkwd_type == GButtonPress) { gtk_widget_destroy (action_menu); } common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_CLOSE, 1, _("Close Window")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_close (win, gtkwd_event->time); break; default: break; } } void max_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_MAX]; if (action_menu_mapped && gtkwd_type == GButtonPress) { gtk_widget_destroy (action_menu); } if (wnck_window_is_maximized (win)) common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX, 3, _("Unmaximize Window")); else common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX, 3, _("Maximize Window")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button <= 3) { if (state == BUTTON_EVENT_ACTION_STATE) { if (gtkwd_event->button == 1) { if (wnck_window_is_maximized (win)) wnck_window_unmaximize (win); else if (wnck_window_is_maximized_vertically (win)) wnck_window_unmaximize_vertically (win); else if (wnck_window_is_maximized_horizontally (win)) wnck_window_unmaximize_horizontally (win); else wnck_window_maximize (win); } else if (gtkwd_event->button == 2) { if (wnck_window_is_maximized_vertically (win)) wnck_window_unmaximize_vertically (win); else wnck_window_maximize_vertically (win); } else if (gtkwd_event->button == 3) { if (wnck_window_is_maximized_horizontally (win)) wnck_window_unmaximize_horizontally (win); else wnck_window_maximize_horizontally (win); } } } break; default: break; } } void min_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_MIN]; if (action_menu_mapped && gtkwd_type == GButtonPress) { gtk_widget_destroy (action_menu); } common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MIN, 1, _("Minimize Window")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_minimize (win); break; default: break; } } void menu_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MENU, 1, _("Window Menu")); switch (gtkwd_type) { case GButtonPress: if (gtkwd_event->button == 1) action_menu_map (win, gtkwd_event->button, gtkwd_event->time); break; default: break; } } void shade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_SHADE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_SHADE, 1, _("Shade")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) { if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_shade (win); } break; default: break; } } void above_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_ABOVE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_ABOVE, 1, _("Make Above")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_make_above (win); break; default: break; } } void stick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_STICK]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_STICK, 1, _("Stick")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_stick (win); break; default: break; } } void unshade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_UNSHADE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_UNSHADE, 1, _("Unshade")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_unshade (win); break; default: break; } } void unabove_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_UNABOVE]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_UNABOVE, 1, _("Unmake Above")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_unmake_above (win); break; default: break; } } void unstick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); guint state = d->button_states[BUTTON_UNSTICK]; common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_UNSTICK, 1, _("Unstick")); switch (gtkwd_type) { case GButtonRelease: if (gtkwd_event->button == 1) if (state == BUTTON_EVENT_ACTION_STATE) wnck_window_unstick (win); break; default: break; } } static void handle_title_button_event (WnckWindow *win, int action, decor_event *gtkwd_event) { switch (action) { case CLICK_ACTION_SHADE: if (wnck_window_is_shaded (win)) wnck_window_unshade (win); else wnck_window_shade (win); break; case CLICK_ACTION_MAXIMIZE: if (wnck_window_is_maximized (win)) wnck_window_unmaximize (win); else wnck_window_maximize (win); break; case CLICK_ACTION_MINIMIZE: if (!wnck_window_is_minimized (win)) wnck_window_minimize (win); break; case CLICK_ACTION_RAISE: restack_window (win, Above); break; case CLICK_ACTION_LOWER: restack_window (win, Below); break; case CLICK_ACTION_MENU: action_menu_map (win, gtkwd_event->button, gtkwd_event->time); break; } } static void handle_mouse_wheel_title_event (WnckWindow *win, unsigned int button) { GWDSettings *settings = gwd_theme_get_settings (gwd_theme); gint wheel_action = gwd_settings_get_mouse_wheel_action (settings); switch (wheel_action) { case WHEEL_ACTION_SHADE: if (button == 4) { if (!wnck_window_is_shaded (win)) wnck_window_shade (win); } else if (button == 5) { if (wnck_window_is_shaded (win)) wnck_window_unshade (win); } break; default: break; } } void title_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { GWDSettings *settings = gwd_theme_get_settings (gwd_theme); static Window last_button_xwindow = None; static Time last_button_time = 0; gint titlebar_action = 0; if (gtkwd_type != GButtonPress) return; if (gtkwd_event->button == 1) { static int last_button_num = 0; static int last_button_x = 0; static int last_button_y = 0; if (gtkwd_event->button == last_button_num && gtkwd_event->window == last_button_xwindow && gtkwd_event->time < last_button_time + double_click_timeout && dist (gtkwd_event->x, gtkwd_event->y, last_button_x, last_button_y) < DOUBLE_CLICK_DISTANCE) { titlebar_action = gwd_settings_get_titlebar_double_click_action (settings); handle_title_button_event (win, titlebar_action, gtkwd_event); last_button_num = 0; last_button_xwindow = None; last_button_time = 0; last_button_x = 0; last_button_y = 0; } else { last_button_num = gtkwd_event->button; last_button_xwindow = gtkwd_event->window; last_button_time = gtkwd_event->time; last_button_x = gtkwd_event->x; last_button_y = gtkwd_event->y; restack_window (win, Above); move_resize_window (win, WM_MOVERESIZE_MOVE, gtkwd_event); } } else if (gtkwd_event->button == 2) { titlebar_action = gwd_settings_get_titlebar_middle_click_action (settings); handle_title_button_event (win, titlebar_action, gtkwd_event); } else if (gtkwd_event->button == 3) { titlebar_action = gwd_settings_get_titlebar_right_click_action (settings); handle_title_button_event (win, titlebar_action, gtkwd_event); } else if (gtkwd_event->button == 4 || gtkwd_event->button == 5) { handle_mouse_wheel_title_event (win, gtkwd_event->button); } } static void frame_common_event (WnckWindow *win, int direction, decor_event *gtkwd_event, decor_event_type gtkwd_type) { GWDSettings *settings = gwd_theme_get_settings (gwd_theme); gint titlebar_action = 0; if (gtkwd_type != GButtonPress) return; switch (gtkwd_event->button) { case 1: move_resize_window (win, direction, gtkwd_event); restack_window (win, Above); break; case 2: titlebar_action = gwd_settings_get_titlebar_middle_click_action (settings); handle_title_button_event (win, titlebar_action, gtkwd_event); break; case 3: titlebar_action = gwd_settings_get_titlebar_right_click_action (settings); handle_title_button_event (win, titlebar_action, gtkwd_event); break; } } void top_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_TOPLEFT, gtkwd_event, gtkwd_type); } void top_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_TOP, gtkwd_event, gtkwd_type); } void top_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_TOPRIGHT, gtkwd_event, gtkwd_type); } void left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_LEFT, gtkwd_event, gtkwd_type); } void right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_RIGHT, gtkwd_event, gtkwd_type); } void bottom_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMLEFT, gtkwd_event, gtkwd_type); } void bottom_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOM, gtkwd_event, gtkwd_type); } void bottom_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type) { frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMRIGHT, gtkwd_event, gtkwd_type); } GdkFilterReturn event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data) { GdkDisplay *gdkdisplay; XEvent *xevent = gdkxevent; gulong xid = 0; Window select = 0; gdkdisplay = gdk_display_get_default (); switch (xevent->type) { case CreateNotify: { if (!wnck_window_get (xevent->xcreatewindow.window)) { gdk_error_trap_push (); GdkWindow *toplevel = gdk_x11_window_foreign_new_for_display (gdkdisplay, xevent->xcreatewindow.window); if (toplevel) { gdk_window_set_events (toplevel, gdk_window_get_events (toplevel) | GDK_PROPERTY_CHANGE_MASK); /* check if the window is a switcher and update accordingly */ if (get_window_prop (xevent->xcreatewindow.window, select_window_atom, &select)) update_switcher_window (xevent->xcreatewindow.window, select); } gdk_error_trap_pop_ignored (); } } break; case ButtonPress: case ButtonRelease: xid = (gulong) g_hash_table_lookup (frame_table, GINT_TO_POINTER (xevent->xbutton.window)); break; case EnterNotify: case LeaveNotify: xid = (gulong) g_hash_table_lookup (frame_table, GINT_TO_POINTER (xevent->xcrossing.window)); break; case MotionNotify: xid = (gulong) g_hash_table_lookup (frame_table, GINT_TO_POINTER (xevent->xmotion.window)); break; case PropertyNotify: if (xevent->xproperty.atom == frame_input_window_atom) { WnckWindow *win; xid = xevent->xproperty.window; win = wnck_window_get (xid); if (win) { Window frame; if (!get_window_prop (xid, select_window_atom, &select)) { if (get_window_prop (xid, frame_input_window_atom, &frame)) add_frame_window (win, frame); else remove_frame_window (win); } } } else if (xevent->xproperty.atom == compiz_shadow_info_atom || xevent->xproperty.atom == compiz_shadow_color_atom) { GdkScreen *g_screen = gdk_display_get_default_screen (gdkdisplay); Window root = GDK_WINDOW_XID (gdk_screen_get_root_window (g_screen)); WnckScreen *screen; screen = wnck_screen_get_for_root (root); if (screen) { if (gwd_process_decor_shadow_property_update ()) decorations_changed (screen); } } else if (xevent->xproperty.atom == mwm_hints_atom) { WnckWindow *win; xid = xevent->xproperty.window; win = wnck_window_get (xid); if (win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gboolean decorated = FALSE; /* Only decorations that are actually bound to windows can be decorated * ignore cases where a broken application which shouldn't be decorated * sets the decoration hint */ if (get_mwm_prop (xid) & (MWM_DECOR_ALL | MWM_DECOR_TITLE) && d->win) decorated = TRUE; if (decorated != d->decorated) { d->decorated = decorated; if (decorated) { d->context = NULL; d->width = d->height = 0; d->frame = gwd_get_decor_frame (get_frame_type (win)); update_window_decoration_state (win); update_window_decoration_actions (win); update_window_decoration_icon (win); request_update_window_decoration_size (win); update_event_windows (win); } else { remove_frame_window (win); } } } } else if (xevent->xproperty.atom == select_window_atom) { Window select; if (get_window_prop (xevent->xproperty.window, select_window_atom, &select)) update_switcher_window (xevent->xproperty.window, select); } else if (xevent->xproperty.atom == gtk_theme_variant_atom) { WnckWindow *win; xid = xevent->xproperty.window; win = wnck_window_get (xid); if (win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gchar *old_variant = d->gtk_theme_variant; d->gtk_theme_variant = get_gtk_theme_variant (xid); if (g_strcmp0 (d->gtk_theme_variant, old_variant) != 0) decorations_changed (wnck_screen_get_default ()); g_free (old_variant); } } break; case DestroyNotify: g_hash_table_remove (frame_table, GINT_TO_POINTER (xevent->xproperty.window)); break; case ClientMessage: if (xevent->xclient.message_type == toolkit_action_atom) { long action; action = xevent->xclient.data.l[0]; if (action == toolkit_action_window_menu_atom) { WnckWindow *win; win = wnck_window_get (xevent->xclient.window); if (win) { action_menu_map (win, xevent->xclient.data.l[2], xevent->xclient.data.l[1]); } } else if (action == toolkit_action_force_quit_dialog_atom) { WnckWindow *win; win = wnck_window_get (xevent->xclient.window); if (win) { if (xevent->xclient.data.l[2]) show_force_quit_dialog (win, xevent->xclient.data.l[1]); else hide_force_quit_dialog (win); } } } else if (xevent->xclient.message_type == decor_request_atom) { WnckWindow *win = wnck_window_get (xevent->xclient.window); if (win) update_window_decoration_size (win); } default: break; } if (xid) { WnckWindow *win; win = wnck_window_get (xid); if (win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { gint i, j; event_callback cb = NULL; Window w = xevent->xany.window; for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) if (d->event_windows[i][j].window == w) cb = d->event_windows[i][j].callback; if (!cb) { for (i = 0; i < BUTTON_NUM; ++i) if (d->button_windows[i].window == w) cb = d->button_windows[i].callback; } if (cb) { decor_event gtkwd_event; decor_event_type gtkwd_type; gtkwd_event.window = w; switch (xevent->type) { case ButtonPress: case ButtonRelease: if (xevent->type == ButtonPress) gtkwd_type = GButtonPress; else gtkwd_type = GButtonRelease; gtkwd_event.button = xevent->xbutton.button; gtkwd_event.x = xevent->xbutton.x; gtkwd_event.y = xevent->xbutton.y; gtkwd_event.x_root = xevent->xbutton.x_root; gtkwd_event.y_root = xevent->xbutton.y_root; gtkwd_event.time = xevent->xbutton.time; break; case EnterNotify: case LeaveNotify: if (xevent->type == EnterNotify) gtkwd_type = GEnterNotify; else gtkwd_type = GLeaveNotify; gtkwd_event.x = xevent->xcrossing.x; gtkwd_event.y = xevent->xcrossing.y; gtkwd_event.x_root = xevent->xcrossing.x_root; gtkwd_event.y_root = xevent->xcrossing.y_root; gtkwd_event.time = xevent->xcrossing.time; break; default: cb = NULL; break; } if (cb) (*cb) (win, >kwd_event, gtkwd_type); } } } } return GDK_FILTER_CONTINUE; } GdkFilterReturn selection_event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data) { Display *xdisplay; GdkDisplay *gdkdisplay; XEvent *xevent = gdkxevent; int status; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); switch (xevent->type) { case SelectionRequest: decor_handle_selection_request (xdisplay, xevent, dm_sn_timestamp); break; case SelectionClear: status = decor_handle_selection_clear (xdisplay, xevent, 0); if (status == DECOR_SELECTION_GIVE_UP) gtk_main_quit (); default: break; } return GDK_FILTER_CONTINUE; } ./gtk/window-decorator/wnck.c0000644000004100000410000004175113246301623016435 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #include "gtk-window-decorator.h" #include "gwd-settings.h" static void draw_window_decoration (decor_t *decor) { gwd_theme_draw_window_decoration (gwd_theme, decor); } const gchar * get_frame_type (WnckWindow *win) { WnckWindowType wnck_type; if (win == NULL) return "bare"; wnck_type = wnck_window_get_window_type (win); switch (wnck_type) { case WNCK_WINDOW_NORMAL: return "normal"; case WNCK_WINDOW_DIALOG: { Atom actual; int result, format; unsigned long n, left; unsigned char *data; Window xid = wnck_window_get_xid (win); if (xid == None) return "bare"; gdk_error_trap_push (); result = XGetWindowProperty (gdk_x11_get_default_xdisplay (), xid, net_wm_state_atom, 0L, 1024L, FALSE, XA_ATOM, &actual, &format, &n, &left, &data); gdk_flush (); gdk_error_trap_pop_ignored (); if (result == Success && data) { Atom *a = (Atom *) data; while (n--) if (*a++ == net_wm_state_modal_atom) { XFree ((void *) data); return "modal_dialog"; } } return "dialog"; } case WNCK_WINDOW_MENU: return "menu"; case WNCK_WINDOW_UTILITY: return "utility"; default: return "bare"; } return "normal"; } static void window_name_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { if (!request_update_window_decoration_size (win)) queue_decor_draw (d); } } static void window_geometry_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { int width, height; wnck_window_get_client_window_geometry (win, NULL, NULL, &width, &height); if (width != d->client_width || height != d->client_height) { d->client_width = width; d->client_height = height; request_update_window_decoration_size (win); update_event_windows (win); } } } static void window_icon_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { update_window_decoration_icon (win); queue_decor_draw (d); } } static void window_state_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { update_window_decoration_state (win); if (!request_update_window_decoration_size (win)) queue_decor_draw (d); update_event_windows (win); } } static void window_actions_changed (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d->decorated) { update_window_decoration_actions (win); if (!request_update_window_decoration_size (win)) queue_decor_draw (d); update_event_windows (win); } } static void update_frames_titlebar_fonts (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; frame_update_titlebar_font (frame); } static void update_frames_border_extents (gpointer key, gpointer value, gpointer user_data) { decor_frame_t *frame = (decor_frame_t *) value; gwd_theme_update_border_extents (gwd_theme, frame); } void decorations_changed (WnckScreen *screen) { GdkDisplay *display = gdk_display_get_default (); GdkScreen *gdkscreen = gdk_display_get_default_screen (display); GList *windows; Window select; gwd_frames_foreach (update_frames_titlebar_fonts, NULL); gwd_process_frames (update_frames_border_extents, window_type_frames, WINDOW_TYPE_FRAMES_NUM, NULL); update_shadow (); update_default_decorations (gdkscreen); if (minimal) return; /* Update all normal windows */ windows = wnck_screen_get_windows (screen); while (windows != NULL) { decor_t *d = g_object_get_data (G_OBJECT (windows->data), "decor"); if (d->decorated) d->draw = draw_window_decoration; update_window_decoration (WNCK_WINDOW (windows->data)); windows = windows->next; } /* Update switcher window */ if (switcher_window && get_window_prop (switcher_window->prop_xid, select_window_atom, &select)) { decor_t *d = switcher_window; /* force size update */ d->context = NULL; d->width = d->height = 0; update_switcher_window (d->prop_xid, select); } } void restack_window (WnckWindow *win, int stack_mode) { Display *xdisplay; GdkDisplay *gdkdisplay; GdkScreen *screen; Window xroot; XEvent ev; gdkdisplay = gdk_display_get_default (); xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); screen = gdk_display_get_default_screen (gdkdisplay); xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); if (action_menu_mapped) { gtk_widget_destroy (action_menu); return; } ev.xclient.type = ClientMessage; ev.xclient.display = xdisplay; ev.xclient.serial = 0; ev.xclient.send_event = TRUE; ev.xclient.window = wnck_window_get_xid (win); ev.xclient.message_type = restack_window_atom; ev.xclient.format = 32; ev.xclient.data.l[0] = 2; ev.xclient.data.l[1] = None; ev.xclient.data.l[2] = stack_mode; ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSendEvent (xdisplay, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &ev); XSync (xdisplay, FALSE); } void add_frame_window (WnckWindow *win, Window frame) { Display *xdisplay; XSetWindowAttributes attr; gulong xid = wnck_window_get_xid (win); decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); gint i, j; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); d->active = wnck_window_is_active (win); d->win = win; d->frame = gwd_get_decor_frame (get_frame_type (win)); attr.event_mask = ButtonPressMask | EnterWindowMask | LeaveWindowMask | ExposureMask; attr.override_redirect = TRUE; gdk_error_trap_push (); { for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { d->event_windows[i][j].window = XCreateWindow (xdisplay, frame, 0, 0, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); if (cursor[i][j].cursor) XDefineCursor (xdisplay, d->event_windows[i][j].window, cursor[i][j].cursor); } } attr.event_mask |= ButtonReleaseMask; for (i = 0; i < BUTTON_NUM; ++i) { d->button_windows[i].window = XCreateWindow (xdisplay, frame, 0, 0, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); d->button_states[i] = 0; } } gdk_display_sync (gdk_display_get_default ()); if (!gdk_error_trap_pop ()) { if (get_mwm_prop (xid) & (MWM_DECOR_ALL | MWM_DECOR_TITLE)) d->decorated = TRUE; g_assert (d->gtk_theme_variant == NULL); d->gtk_theme_variant = get_gtk_theme_variant (xid); for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) { Window win = d->event_windows[i][j].window; g_hash_table_insert (frame_table, GINT_TO_POINTER (win), GINT_TO_POINTER (xid)); } for (i = 0; i < BUTTON_NUM; ++i) g_hash_table_insert (frame_table, GINT_TO_POINTER (d->button_windows[i].window), GINT_TO_POINTER (xid)); if (d->decorated) { update_window_decoration_state (win); update_window_decoration_actions (win); update_window_decoration_icon (win); request_update_window_decoration_size (win); update_event_windows (win); } } else { for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) d->event_windows[i][j].window = None; } d->created = TRUE; } void remove_frame_window (WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); Display *xdisplay; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); { int i, j; gdk_error_trap_push (); for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { XDestroyWindow (xdisplay, d->event_windows[i][j].window); d->event_windows[i][j].window = None; } } for (i = 0; i < BUTTON_NUM; ++i) { XDestroyWindow (xdisplay, d->button_windows[i].window); d->button_windows[i].window = None; d->button_states[i] = 0; } gdk_error_trap_pop_ignored (); } if (d->surface) { cairo_surface_destroy (d->surface); d->surface = NULL; } if (d->buffer_surface) { cairo_surface_destroy (d->buffer_surface); d->buffer_surface = NULL; } if (d->cr) { cairo_destroy (d->cr); d->cr = NULL; } if (d->picture) { XRenderFreePicture (xdisplay, d->picture); d->picture = 0; } if (d->name) { g_free (d->name); d->name = NULL; } if (d->gtk_theme_variant) { g_free (d->gtk_theme_variant); d->gtk_theme_variant = NULL; } if (d->layout) { g_object_unref (G_OBJECT (d->layout)); d->layout = NULL; } if (d->icon) { cairo_pattern_destroy (d->icon); d->icon = NULL; } if (d->icon_surface) { cairo_surface_destroy (d->icon_surface); d->icon_surface = NULL; } if (d->icon_pixbuf) { g_object_unref (G_OBJECT (d->icon_pixbuf)); d->icon_pixbuf = NULL; } if (d->force_quit_dialog) { GtkWidget *dialog = d->force_quit_dialog; d->force_quit_dialog = NULL; gtk_widget_destroy (dialog); } if (d->frame) { gwd_decor_frame_unref (d->frame); d->frame = NULL; } gdk_error_trap_push (); XDeleteProperty (xdisplay, wnck_window_get_xid (win), win_decor_atom); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); d->width = 0; d->height = 0; d->decorated = FALSE; d->state = 0; d->actions = 0; d->context = NULL; d->shadow = NULL; draw_list = g_slist_remove (draw_list, d); } static void connect_window (WnckWindow *win) { g_signal_connect_object (win, "name_changed", G_CALLBACK (window_name_changed), 0, 0); g_signal_connect_object (win, "geometry_changed", G_CALLBACK (window_geometry_changed), 0, 0); g_signal_connect_object (win, "icon_changed", G_CALLBACK (window_icon_changed), 0, 0); g_signal_connect_object (win, "state_changed", G_CALLBACK (window_state_changed), 0, 0); g_signal_connect_object (win, "actions_changed", G_CALLBACK (window_actions_changed), 0, 0); } static void set_context_if_decorated (decor_t *d, decor_context_t *context) { if (d->decorated) d->context = context; } static void active_window_changed (WnckScreen *screen) { WnckWindow *win; decor_t *d; win = wnck_screen_get_previously_active_window (screen); if (win) { d = g_object_get_data (G_OBJECT (win), "decor"); if (d) { d->active = wnck_window_is_active (win); decor_frame_t *frame = d->decorated ? d->frame : gwd_get_decor_frame (get_frame_type (win)); if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) { if (d->active) { set_context_if_decorated (d, &frame->max_window_context_active); d->shadow = frame->max_border_shadow_active; } else { set_context_if_decorated (d, &frame->max_window_context_inactive); d->shadow = frame->max_border_shadow_inactive; } } else { if (d->active) { set_context_if_decorated (d, &frame->window_context_active); d->shadow = frame->border_shadow_active; } else { set_context_if_decorated (d, &frame->window_context_inactive); d->shadow = frame->border_shadow_inactive; } } if (!d->decorated) gwd_decor_frame_unref (frame); /* We need to update the decoration size here * since the shadow size might have changed and * in that case the decoration will be redrawn, * however if the shadow size doesn't change * then we need to redraw the decoration anyways * since the image would have changed */ if (d->win != NULL && !request_update_window_decoration_size (d->win) && d->decorated && d->surface) queue_decor_draw (d); } } win = wnck_screen_get_active_window (screen); if (win) { d = g_object_get_data (G_OBJECT (win), "decor"); if (d) { d->active = wnck_window_is_active (win); decor_frame_t *frame = d->decorated ? d->frame : gwd_get_decor_frame (get_frame_type (win)); if ((d->state & META_MAXIMIZED) == META_MAXIMIZED) { if (d->active) { set_context_if_decorated (d, &frame->max_window_context_active); d->shadow = frame->max_border_shadow_active; } else { set_context_if_decorated (d, &frame->max_window_context_inactive); d->shadow = frame->max_border_shadow_inactive; } } else { if (d->active) { set_context_if_decorated (d, &frame->window_context_active); d->shadow = frame->border_shadow_active; } else { set_context_if_decorated (d, &frame->window_context_inactive); d->shadow = frame->border_shadow_inactive; } } if (!d->decorated) gwd_decor_frame_unref (frame); /* We need to update the decoration size here * since the shadow size might have changed and * in that case the decoration will be redrawn, * however if the shadow size doesn't change * then we need to redraw the decoration anyways * since the image would have changed */ if (d->win != NULL && !request_update_window_decoration_size (d->win) && d->decorated && d->surface) queue_decor_draw (d); } } } static void window_opened (WnckScreen *screen, WnckWindow *win) { decor_t *d; Window window; gulong xid; unsigned int i, j; static event_callback callback[3][3] = { { top_left_event, top_event, top_right_event }, { left_event, title_event, right_event }, { bottom_left_event, bottom_event, bottom_right_event } }; static event_callback button_callback[BUTTON_NUM] = { close_button_event, max_button_event, min_button_event, menu_button_event, shade_button_event, above_button_event, stick_button_event, unshade_button_event, unabove_button_event, unstick_button_event }; d = calloc (1, sizeof (decor_t)); if (!d) return; for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) d->event_windows[i][j].callback = callback[i][j]; for (i = 0; i < BUTTON_NUM; ++i) d->button_windows[i].callback = button_callback[i]; wnck_window_get_client_window_geometry (win, NULL, NULL, &d->client_width, &d->client_height); d->draw = draw_window_decoration; d->created = FALSE; d->surface = NULL; d->cr = NULL; d->buffer_surface = NULL; d->picture = None; connect_window (win); g_object_set_data (G_OBJECT (win), "decor", d); xid = wnck_window_get_xid (win); if (get_window_prop (xid, frame_input_window_atom, &window)) add_frame_window (win, window); } void window_closed (WnckScreen *screen, WnckWindow *win) { decor_t *d = g_object_get_data (G_OBJECT (win), "decor"); if (d) { remove_frame_window (win); g_object_set_data (G_OBJECT (win), "decor", NULL); g_free (d); } } void connect_screen (WnckScreen *screen) { GList *windows; g_signal_connect_object (G_OBJECT (screen), "active_window_changed", G_CALLBACK (active_window_changed), 0, 0); g_signal_connect_object (G_OBJECT (screen), "window_opened", G_CALLBACK (window_opened), 0, 0); g_signal_connect_object (G_OBJECT (screen), "window_closed", G_CALLBACK (window_closed), 0, 0); windows = wnck_screen_get_windows (screen); while (windows != NULL) { window_opened (screen, windows->data); windows = windows->next; } } ./gtk/window-decorator/gwd-settings.c0000644000004100000410000005655213246301623020117 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include "gwd-settings.h" const gboolean USE_TOOLTIPS_DEFAULT = FALSE; const gdouble ACTIVE_SHADOW_RADIUS_DEFAULT = 8.0; const gdouble ACTIVE_SHADOW_OPACITY_DEFAULT = 0.5; const gint ACTIVE_SHADOW_OFFSET_X_DEFAULT = 1; const gint ACTIVE_SHADOW_OFFSET_Y_DEFAULT = 1; const gchar *ACTIVE_SHADOW_COLOR_DEFAULT = "#00000000"; const gdouble INACTIVE_SHADOW_RADIUS_DEFAULT = 8.0; const gdouble INACTIVE_SHADOW_OPACITY_DEFAULT = 0.5; const gint INACTIVE_SHADOW_OFFSET_X_DEFAULT = 1; const gint INACTIVE_SHADOW_OFFSET_Y_DEFAULT = 1; const gchar *INACTIVE_SHADOW_COLOR_DEFAULT = "#00000000"; const gint BLUR_TYPE_DEFAULT = BLUR_TYPE_NONE; const gchar *METACITY_THEME_NAME_DEFAULT = "Adwaita"; const gint METACITY_THEME_TYPE_DEFAULT = -1; const gdouble METACITY_ACTIVE_OPACITY_DEFAULT = 1.0; const gdouble METACITY_INACTIVE_OPACITY_DEFAULT = 0.75; const gboolean METACITY_ACTIVE_SHADE_OPACITY_DEFAULT = TRUE; const gboolean METACITY_INACTIVE_SHADE_OPACITY_DEFAULT = TRUE; const gchar *METACITY_BUTTON_LAYOUT_DEFAULT = ":minimize,maximize,close"; const guint DOUBLE_CLICK_ACTION_DEFAULT = CLICK_ACTION_MAXIMIZE; const guint MIDDLE_CLICK_ACTION_DEFAULT = CLICK_ACTION_LOWER; const guint RIGHT_CLICK_ACTION_DEFAULT = CLICK_ACTION_MENU; const guint WHEEL_ACTION_DEFAULT = WHEEL_ACTION_SHADE; const gchar *TITLEBAR_FONT_DEFAULT = "Sans 12"; enum { CMDLINE_BLUR = (1 << 0), CMDLINE_THEME = (1 << 1) }; typedef void (*NotifyFunc) (GWDSettings *settings); struct _GWDSettings { GObject parent; gint blur_type; gchar *metacity_theme_name; gint metacity_theme_type; guint cmdline_opts; decor_shadow_options_t active_shadow; decor_shadow_options_t inactive_shadow; gboolean use_tooltips; gdouble metacity_active_opacity; gdouble metacity_inactive_opacity; gboolean metacity_active_shade_opacity; gboolean metacity_inactive_shade_opacity; gchar *metacity_button_layout; gint titlebar_double_click_action; gint titlebar_middle_click_action; gint titlebar_right_click_action; gint mouse_wheel_action; gchar *titlebar_font; guint freeze_count; GList *notify_funcs; }; enum { PROP_0, PROP_BLUR_TYPE, PROP_METACITY_THEME_NAME, PROP_CMDLINE_OPTIONS, LAST_PROP }; static GParamSpec *properties[LAST_PROP] = { NULL }; enum { UPDATE_DECORATIONS, UPDATE_TITLEBAR_FONT, UPDATE_METACITY_THEME, UPDATE_METACITY_BUTTON_LAYOUT, LAST_SIGNAL }; static guint settings_signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (GWDSettings, gwd_settings, G_TYPE_OBJECT) static void update_decorations (GWDSettings *settings) { g_signal_emit (settings, settings_signals[UPDATE_DECORATIONS], 0); } static void update_titlebar_font (GWDSettings *settings) { g_signal_emit (settings, settings_signals[UPDATE_TITLEBAR_FONT], 0); } static void update_metacity_theme (GWDSettings *settings) { g_signal_emit (settings, settings_signals[UPDATE_METACITY_THEME], 0, settings->metacity_theme_type, settings->metacity_theme_name); } static void update_metacity_button_layout (GWDSettings *settings) { g_signal_emit (settings, settings_signals[UPDATE_METACITY_BUTTON_LAYOUT], 0, settings->metacity_button_layout); } static void append_to_notify_funcs (GWDSettings *settings, NotifyFunc func) { /* Remove if found, the new one will replace the old one */ GList *link = g_list_find (settings->notify_funcs, func); if (link) settings->notify_funcs = g_list_remove_link (settings->notify_funcs, link); settings->notify_funcs = g_list_append (settings->notify_funcs, (gpointer) func); } static void invoke_notify_func (gpointer data, gpointer user_data) { NotifyFunc func; GWDSettings *settings; func = (NotifyFunc) data; settings = GWD_SETTINGS (user_data); (*func) (settings); } static void release_notify_funcs (GWDSettings *settings) { if (settings->freeze_count) return; g_list_foreach (settings->notify_funcs, invoke_notify_func, settings); g_list_free (settings->notify_funcs); settings->notify_funcs = NULL; } static gboolean get_click_action_value (const gchar *action, gint *action_value, gint default_value) { if (!action_value) return FALSE; *action_value = -1; if (strcmp (action, "toggle_shade") == 0) *action_value = CLICK_ACTION_SHADE; else if (strcmp (action, "toggle_maximize") == 0) *action_value = CLICK_ACTION_MAXIMIZE; else if (strcmp (action, "minimize") == 0) *action_value = CLICK_ACTION_MINIMIZE; else if (strcmp (action, "raise") == 0) *action_value = CLICK_ACTION_RAISE; else if (strcmp (action, "lower") == 0) *action_value = CLICK_ACTION_LOWER; else if (strcmp (action, "menu") == 0) *action_value = CLICK_ACTION_MENU; else if (strcmp (action, "none") == 0) *action_value = CLICK_ACTION_NONE; if (*action_value == -1) { *action_value = default_value; return FALSE; } return TRUE; } static gboolean get_wheel_action_value (const gchar *action, gint *action_value, gint default_value) { if (!action_value) return FALSE; *action_value = -1; if (strcmp (action, "shade") == 0) *action_value = WHEEL_ACTION_SHADE; else if (strcmp (action, "none") == 0) *action_value = WHEEL_ACTION_NONE; if (*action_value == -1) { *action_value = default_value; return FALSE; } return TRUE; } static void gwd_settings_finalize (GObject *object) { GWDSettings *settings; settings = GWD_SETTINGS (object); g_clear_pointer (&settings->metacity_theme_name, g_free); g_clear_pointer (&settings->metacity_button_layout, g_free); g_clear_pointer (&settings->titlebar_font, g_free); G_OBJECT_CLASS (gwd_settings_parent_class)->finalize (object); } static void gwd_settings_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettings *settings; settings = GWD_SETTINGS (object); switch (property_id) { case PROP_CMDLINE_OPTIONS: settings->cmdline_opts = g_value_get_int (value); break; case PROP_BLUR_TYPE: settings->blur_type = g_value_get_int (value); break; case PROP_METACITY_THEME_NAME: g_free (settings->metacity_theme_name); settings->metacity_theme_name = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gwd_settings_class_init (GWDSettingsClass *settings_class) { GObjectClass *object_class = G_OBJECT_CLASS (settings_class); object_class->finalize = gwd_settings_finalize; object_class->set_property = gwd_settings_set_property; properties[PROP_BLUR_TYPE] = g_param_spec_int ("blur-type", "Blur Type", "Blur type property", BLUR_TYPE_NONE, BLUR_TYPE_ALL, BLUR_TYPE_NONE, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); properties[PROP_METACITY_THEME_NAME] = g_param_spec_string ("metacity-theme-name", "Metacity Theme Name", "Metacity Theme Name", METACITY_THEME_NAME_DEFAULT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); properties[PROP_CMDLINE_OPTIONS] = g_param_spec_int ("cmdline-options", "Command line options", "Which options were specified on the command line", 0, G_MAXINT32, 0, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, LAST_PROP, properties); settings_signals[UPDATE_DECORATIONS] = g_signal_new ("update-decorations", GWD_TYPE_SETTINGS, G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); settings_signals[UPDATE_TITLEBAR_FONT] = g_signal_new ("update-titlebar-font", GWD_TYPE_SETTINGS, G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); settings_signals[UPDATE_METACITY_THEME] = g_signal_new ("update-metacity-theme", GWD_TYPE_SETTINGS, G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); settings_signals[UPDATE_METACITY_BUTTON_LAYOUT] = g_signal_new ("update-metacity-button-layout", GWD_TYPE_SETTINGS, G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_STRING); } static void gwd_settings_init (GWDSettings *settings) { settings->use_tooltips = USE_TOOLTIPS_DEFAULT; settings->active_shadow.shadow_radius = ACTIVE_SHADOW_RADIUS_DEFAULT; settings->active_shadow.shadow_opacity = ACTIVE_SHADOW_OPACITY_DEFAULT; settings->active_shadow.shadow_offset_x = ACTIVE_SHADOW_OFFSET_X_DEFAULT; settings->active_shadow.shadow_offset_y = ACTIVE_SHADOW_OFFSET_Y_DEFAULT; settings->active_shadow.shadow_color[0] = 0; settings->active_shadow.shadow_color[1] = 0; settings->active_shadow.shadow_color[2] = 0; settings->inactive_shadow.shadow_radius = INACTIVE_SHADOW_RADIUS_DEFAULT; settings->inactive_shadow.shadow_opacity = INACTIVE_SHADOW_OPACITY_DEFAULT; settings->inactive_shadow.shadow_offset_x = INACTIVE_SHADOW_OFFSET_X_DEFAULT; settings->inactive_shadow.shadow_offset_y = INACTIVE_SHADOW_OFFSET_Y_DEFAULT; settings->inactive_shadow.shadow_color[0] = 0; settings->inactive_shadow.shadow_color[1] = 0; settings->inactive_shadow.shadow_color[2] = 0; settings->blur_type = BLUR_TYPE_DEFAULT; settings->metacity_theme_name = g_strdup (METACITY_THEME_NAME_DEFAULT); settings->metacity_theme_type = METACITY_THEME_TYPE_DEFAULT; settings->metacity_active_opacity = METACITY_ACTIVE_OPACITY_DEFAULT; settings->metacity_inactive_opacity = METACITY_INACTIVE_OPACITY_DEFAULT; settings->metacity_active_shade_opacity = METACITY_ACTIVE_SHADE_OPACITY_DEFAULT; settings->metacity_inactive_shade_opacity = METACITY_INACTIVE_SHADE_OPACITY_DEFAULT; settings->metacity_button_layout = g_strdup (METACITY_BUTTON_LAYOUT_DEFAULT); settings->titlebar_double_click_action = DOUBLE_CLICK_ACTION_DEFAULT; settings->titlebar_middle_click_action = MIDDLE_CLICK_ACTION_DEFAULT; settings->titlebar_right_click_action = RIGHT_CLICK_ACTION_DEFAULT; settings->mouse_wheel_action = WHEEL_ACTION_DEFAULT; settings->titlebar_font = g_strdup (TITLEBAR_FONT_DEFAULT); settings->cmdline_opts = 0; settings->freeze_count = 0; /* Append all notify funcs so that external state can be updated in case * the settings backend can't do it itself */ append_to_notify_funcs (settings, update_metacity_theme); append_to_notify_funcs (settings, update_metacity_button_layout); append_to_notify_funcs (settings, update_titlebar_font); append_to_notify_funcs (settings, update_decorations); } GWDSettings * gwd_settings_new (gint blur_type, const gchar *metacity_theme_name) { guint cmdline_opts = 0; if (blur_type != BLUR_TYPE_UNSET) cmdline_opts |= CMDLINE_BLUR; else blur_type = BLUR_TYPE_DEFAULT; if (metacity_theme_name != NULL) cmdline_opts |= CMDLINE_THEME; else metacity_theme_name = METACITY_THEME_NAME_DEFAULT; return g_object_new (GWD_TYPE_SETTINGS, "blur-type", blur_type, "metacity-theme-name", metacity_theme_name, "cmdline-options", cmdline_opts, NULL); } gint gwd_settings_get_blur_type (GWDSettings *settings) { return settings->blur_type; } const gchar * gwd_settings_get_metacity_button_layout (GWDSettings *settings) { return settings->metacity_button_layout; } const gchar * gwd_settings_get_metacity_theme_name (GWDSettings *settings) { return settings->metacity_theme_name; } gint gwd_settings_get_metacity_theme_type (GWDSettings *settings) { return settings->metacity_theme_type; } const gchar * gwd_settings_get_titlebar_font (GWDSettings *settings) { return settings->titlebar_font; } decor_shadow_options_t gwd_settings_get_active_shadow (GWDSettings *settings) { return settings->active_shadow; } decor_shadow_options_t gwd_settings_get_inactive_shadow (GWDSettings *settings) { return settings->inactive_shadow; } gboolean gwd_settings_get_use_tooltips (GWDSettings *settings) { return settings->use_tooltips; } gdouble gwd_settings_get_metacity_active_opacity (GWDSettings *settings) { return settings->metacity_active_opacity; } gdouble gwd_settings_get_metacity_inactive_opacity (GWDSettings *settings) { return settings->metacity_inactive_opacity; } gboolean gwd_settings_get_metacity_active_shade_opacity (GWDSettings *settings) { return settings->metacity_active_shade_opacity; } gboolean gwd_settings_get_metacity_inactive_shade_opacity (GWDSettings *settings) { return settings->metacity_inactive_shade_opacity; } gint gwd_settings_get_titlebar_double_click_action (GWDSettings *settings) { return settings->titlebar_double_click_action; } gint gwd_settings_get_titlebar_middle_click_action (GWDSettings *settings) { return settings->titlebar_middle_click_action; } gint gwd_settings_get_titlebar_right_click_action (GWDSettings *settings) { return settings->titlebar_right_click_action; } gint gwd_settings_get_mouse_wheel_action (GWDSettings *settings) { return settings->mouse_wheel_action; } void gwd_settings_freeze_updates (GWDSettings *settings) { ++settings->freeze_count; } void gwd_settings_thaw_updates (GWDSettings *settings) { if (settings->freeze_count) --settings->freeze_count; release_notify_funcs (settings); } gboolean gwd_settings_shadow_property_changed (GWDSettings *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color) { decor_shadow_options_t active_shadow, inactive_shadow; unsigned int c[4]; gboolean changed = FALSE; active_shadow.shadow_radius = active_shadow_radius; active_shadow.shadow_opacity = active_shadow_opacity; active_shadow.shadow_offset_x = active_shadow_offset_x; active_shadow.shadow_offset_y = active_shadow_offset_y; if (sscanf (active_shadow_color, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { active_shadow.shadow_color[0] = c[0] << 8 | c[0]; active_shadow.shadow_color[1] = c[1] << 8 | c[1]; active_shadow.shadow_color[2] = c[2] << 8 | c[2]; } else { return FALSE; } if (sscanf (inactive_shadow_color, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4) { inactive_shadow.shadow_color[0] = c[0] << 8 | c[0]; inactive_shadow.shadow_color[1] = c[1] << 8 | c[1]; inactive_shadow.shadow_color[2] = c[2] << 8 | c[2]; } else { return FALSE; } inactive_shadow.shadow_radius = inactive_shadow_radius; inactive_shadow.shadow_opacity = inactive_shadow_opacity; inactive_shadow.shadow_offset_x = inactive_shadow_offset_x; inactive_shadow.shadow_offset_y = inactive_shadow_offset_y; if (decor_shadow_options_cmp (&settings->inactive_shadow, &inactive_shadow)) { changed |= TRUE; settings->inactive_shadow = inactive_shadow; } if (decor_shadow_options_cmp (&settings->active_shadow, &active_shadow)) { changed |= TRUE; settings->active_shadow = active_shadow; } if (changed) { append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); } return changed; } gboolean gwd_settings_use_tooltips_changed (GWDSettings *settings, gboolean use_tooltips) { if (settings->use_tooltips == use_tooltips) return FALSE; settings->use_tooltips = use_tooltips; append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); return TRUE; } gboolean gwd_settings_blur_changed (GWDSettings *settings, const gchar *type) { gint new_type = BLUR_TYPE_UNSET; if (settings->cmdline_opts & CMDLINE_BLUR) return FALSE; if (strcmp (type, "titlebar") == 0) new_type = BLUR_TYPE_TITLEBAR; else if (strcmp (type, "all") == 0) new_type = BLUR_TYPE_ALL; else if (strcmp (type, "none") == 0) new_type = BLUR_TYPE_NONE; if (new_type == BLUR_TYPE_UNSET) return FALSE; if (settings->blur_type == new_type) return FALSE; settings->blur_type = new_type; append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); return TRUE; } gboolean gwd_settings_metacity_theme_changed (GWDSettings *settings, gboolean use_metacity_theme, gint metacity_theme_type, const gchar *metacity_theme_name) { if (settings->cmdline_opts & CMDLINE_THEME) return FALSE; if (use_metacity_theme) { if (g_strcmp0 (metacity_theme_name, settings->metacity_theme_name) == 0 && metacity_theme_type == settings->metacity_theme_type) return FALSE; g_free (settings->metacity_theme_name); settings->metacity_theme_name = g_strdup (metacity_theme_name); settings->metacity_theme_type = metacity_theme_type; } else { g_free (settings->metacity_theme_name); settings->metacity_theme_name = NULL; } append_to_notify_funcs (settings, update_metacity_theme); append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); return TRUE; } gboolean gwd_settings_opacity_changed (GWDSettings *settings, gdouble active_opacity, gdouble inactive_opacity, gboolean active_shade_opacity, gboolean inactive_shade_opacity) { if (settings->metacity_active_opacity == active_opacity && settings->metacity_inactive_opacity == inactive_opacity && settings->metacity_active_shade_opacity == active_shade_opacity && settings->metacity_inactive_shade_opacity == inactive_shade_opacity) return FALSE; settings->metacity_active_opacity = active_opacity; settings->metacity_inactive_opacity = inactive_opacity; settings->metacity_active_shade_opacity = active_shade_opacity; settings->metacity_inactive_shade_opacity = inactive_shade_opacity; append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); return TRUE; } gboolean gwd_settings_button_layout_changed (GWDSettings *settings, const gchar *button_layout) { if (g_strcmp0 (settings->metacity_button_layout, button_layout) == 0) return FALSE; g_free (settings->metacity_button_layout); settings->metacity_button_layout = g_strdup (button_layout); append_to_notify_funcs (settings, update_metacity_button_layout); append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); return TRUE; } gboolean gwd_settings_font_changed (GWDSettings *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font) { const gchar *use_font = titlebar_font; if (titlebar_uses_system_font) use_font = NULL; if (g_strcmp0 (settings->titlebar_font, use_font) == 0) return FALSE; g_free (settings->titlebar_font); settings->titlebar_font = g_strdup (use_font); append_to_notify_funcs (settings, update_titlebar_font); append_to_notify_funcs (settings, update_decorations); release_notify_funcs (settings); return TRUE; } gboolean gwd_settings_titlebar_actions_changed (GWDSettings *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action) { gboolean ret = FALSE; ret |= get_click_action_value (action_double_click_titlebar, &settings->titlebar_double_click_action, DOUBLE_CLICK_ACTION_DEFAULT); ret |= get_click_action_value (action_middle_click_titlebar, &settings->titlebar_middle_click_action, MIDDLE_CLICK_ACTION_DEFAULT); ret |= get_click_action_value (action_right_click_titlebar, &settings->titlebar_right_click_action, RIGHT_CLICK_ACTION_DEFAULT); ret |= get_wheel_action_value (mouse_wheel_action, &settings->mouse_wheel_action, WHEEL_ACTION_DEFAULT); return ret; } ./gtk/window-decorator/tooltip.c0000644000004100000410000001160613246301623017161 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" /* stolen from gtktooltip.c */ #define DEFAULT_DELAY 500 /* Default delay in ms */ #define STICKY_DELAY 0 /* Delay before popping up next tip * if we're sticky */ #define STICKY_REVERT_DELAY 1000 /* Delay before sticky tooltips revert * to normal */ static void show_tooltip (const char *text) { GdkDeviceManager *device_manager; GdkDevice *pointer; GtkRequisition requisition; gint x, y, w, h; GdkScreen *screen; gint monitor_num; GdkRectangle monitor; gtk_label_set_text (GTK_LABEL (tip_label), text); gtk_widget_get_preferred_size (tip_window, &requisition, NULL); w = requisition.width; h = requisition.height; device_manager = gdk_display_get_device_manager (gdk_display_get_default ()); pointer = gdk_device_manager_get_client_pointer (device_manager); gdk_device_get_position (pointer, &screen, &x, &y); x -= (w / 2 + 4); monitor_num = gdk_screen_get_monitor_at_point (screen, x, y); gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); if ((x + w) > monitor.x + monitor.width) x -= (x + w) - (monitor.x + monitor.width); else if (x < monitor.x) x = monitor.x; if ((y + h + 16) > monitor.y + monitor.height) y = y - h - 16; else y = y + 16; gtk_window_move (GTK_WINDOW (tip_window), x, y); gtk_widget_show (tip_window); } static void hide_tooltip (void) { if (gtk_widget_get_visible (tip_window)) g_get_current_time (&tooltip_last_popdown); gtk_widget_hide (tip_window); if (tooltip_timer_tag) { g_source_remove (tooltip_timer_tag); tooltip_timer_tag = 0; } } static gboolean tooltip_recently_shown (void) { GTimeVal now; glong msec; g_get_current_time (&now); msec = now.tv_sec - tooltip_last_popdown.tv_sec; if (msec > STICKY_REVERT_DELAY / 1000) return FALSE; msec = msec * 1000 + (now.tv_usec - tooltip_last_popdown.tv_usec) / 1000; return (msec < STICKY_REVERT_DELAY); } static gint tooltip_timeout (gpointer data) { tooltip_timer_tag = 0; show_tooltip ((const char *) data); return FALSE; } static void tooltip_start_delay (const char *text) { guint delay = DEFAULT_DELAY; if (tooltip_timer_tag) return; if (tooltip_recently_shown ()) delay = STICKY_DELAY; tooltip_timer_tag = g_timeout_add (delay, tooltip_timeout, (gpointer) text); } static gint tooltip_paint_window (GtkWidget *tooltip, cairo_t *cr) { GtkRequisition req; gtk_widget_get_preferred_size (tip_window, &req, NULL); gtk_render_background (gtk_widget_get_style_context (tip_window), cr, 0, 0, req.width, req.height); return FALSE; } gboolean create_tooltip_window (void) { tip_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_widget_set_app_paintable (tip_window, TRUE); gtk_window_set_resizable (GTK_WINDOW (tip_window), FALSE); gtk_widget_set_name (tip_window, "gtk-tooltips"); gtk_container_set_border_width (GTK_CONTAINER (tip_window), 4); gtk_window_set_type_hint (GTK_WINDOW (tip_window), GDK_WINDOW_TYPE_HINT_TOOLTIP); g_signal_connect_swapped (tip_window, "draw", G_CALLBACK (tooltip_paint_window), 0); tip_label = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL (tip_label), TRUE); gtk_misc_set_alignment (GTK_MISC (tip_label), 0.5, 0.5); gtk_widget_show (tip_label); gtk_container_add (GTK_CONTAINER (tip_window), tip_label); return TRUE; } void handle_tooltip_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, guint state, const char *tip) { switch (gtkwd_type) { case GButtonPress: hide_tooltip (); break; case GButtonRelease: break; case GEnterNotify: if (!(state & PRESSED_EVENT_WINDOW)) { if (wnck_window_is_active (win)) tooltip_start_delay (tip); } break; case GLeaveNotify: hide_tooltip (); break; default: break; } } ./gtk/window-decorator/tests/0000755000004100000410000000000013246301624016462 5ustar www-datawww-data./gtk/window-decorator/tests/CMakeLists.txt0000644000004100000410000000302413246301623021220 0ustar www-datawww-datainclude (CompizGSettings) include_directories (${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tests/shared ${CMAKE_SOURCE_DIR}/tests/shared/glib) pkg_check_modules (COMPIZ_TEST_GTK_WINDOW_DECORATOR glib-2.0>=2.28 gio-2.0>=2.25.0) if (COMPIZ_TEST_GTK_WINDOW_DECORATOR_FOUND) link_directories (${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/..) add_executable (compiz_test_gwd_settings ${CMAKE_CURRENT_SOURCE_DIR}/test_gwd_settings.cpp) set (COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES gtk_window_decorator_settings) set (COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS gtk_window_decorator_settings) set (COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES ${COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES} gtk_window_decorator_settings_storage_gsettings) set (COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS ${COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS} gtk_window_decorator_settings_storage_gsettings) target_link_libraries (compiz_test_gwd_settings ${COMPIZ_TEST_GWD_SETTINGS_ADDITIONAL_LIBRARIES} decoration ${COMPIZ_TEST_GTK_WINDOW_DECORATOR_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_test_gwd_settings COVERAGE ${COMPIZ_TEST_GWD_SETTINGS_COVERAGE_TARGETS}) endif (COMPIZ_TEST_GTK_WINDOW_DECORATOR_FOUND) ./gtk/window-decorator/tests/test_gwd_settings.cpp0000644000004100000410000006134413246301623022735 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gwd-settings.h" using ::testing::Eq; using ::testing::Action; using ::testing::Values; using ::testing::_; using ::testing::StrictMock; MATCHER_P(IsShadowsEqual, element, "") { return decor_shadow_options_cmp (&arg, &element); } MATCHER_P(IsStringsEqual, element, "") { return g_strcmp0 (arg, element) == 0; } namespace testing_values { const gdouble ACTIVE_SHADOW_OPACITY_VALUE = 1.0; const gdouble ACTIVE_SHADOW_RADIUS_VALUE = 2.0; const gdouble ACTIVE_SHADOW_OFFSET_X_VALUE = 3.0; const gint ACTIVE_SHADOW_OFFSET_X_INT_VALUE = ACTIVE_SHADOW_OFFSET_X_VALUE; const gdouble ACTIVE_SHADOW_OFFSET_Y_VALUE = 4.0; const gint ACTIVE_SHADOW_OFFSET_Y_INT_VALUE = ACTIVE_SHADOW_OFFSET_Y_VALUE; const std::string ACTIVE_SHADOW_COLOR_STR_VALUE ("#ffffffff"); const gushort ACTIVE_SHADOW_COLOR_VALUE[] = { 255, 255, 255 }; const gdouble INACTIVE_SHADOW_OPACITY_VALUE = 5.0; const gdouble INACTIVE_SHADOW_RADIUS_VALUE = 6.0; const gdouble INACTIVE_SHADOW_OFFSET_X_VALUE = 7.0; const gint INACTIVE_SHADOW_OFFSET_X_INT_VALUE = INACTIVE_SHADOW_OFFSET_X_VALUE; const gdouble INACTIVE_SHADOW_OFFSET_Y_VALUE = 8.0; const gint INACTIVE_SHADOW_OFFSET_Y_INT_VALUE = INACTIVE_SHADOW_OFFSET_Y_VALUE; const std::string INACTIVE_SHADOW_COLOR_STR_VALUE ("#00000000"); const gushort INACTIVE_SHADOW_COLOR_VALUE[] = { 0, 0, 0 }; const gboolean USE_TOOLTIPS_VALUE = !USE_TOOLTIPS_DEFAULT; const std::string BLUR_TYPE_TITLEBAR_VALUE ("titlebar"); const gint BLUR_TYPE_TITLEBAR_INT_VALUE = BLUR_TYPE_TITLEBAR; const std::string BLUR_TYPE_ALL_VALUE ("all"); const gint BLUR_TYPE_ALL_INT_VALUE = BLUR_TYPE_ALL; const std::string BLUR_TYPE_NONE_VALUE ("none"); const gint BLUR_TYPE_NONE_INT_VALUE = BLUR_TYPE_NONE; const gboolean USE_METACITY_THEME_VALUE = TRUE; const std::string METACITY_THEME_VALUE ("metacity_theme"); const gdouble ACTIVE_OPACITY_VALUE = 0.9; const gdouble INACTIVE_OPACITY_VALUE = 0.8; const gboolean ACTIVE_SHADE_OPACITY_VALUE = !METACITY_ACTIVE_SHADE_OPACITY_DEFAULT; const gboolean INACTIVE_SHADE_OPACITY_VALUE = !METACITY_INACTIVE_SHADE_OPACITY_DEFAULT; const std::string BUTTON_LAYOUT_VALUE ("button_layout"); const gboolean USE_SYSTEM_FONT_VALUE = TRUE; const gboolean NO_USE_SYSTEM_FONT_VALUE = FALSE; const std::string TITLEBAR_FONT_VALUE ("Ubuntu 12"); const std::string TITLEBAR_ACTION_SHADE ("toggle_shade"); const std::string TITLEBAR_ACTION_MAX_VERT ("toggle_maximize_vertically"); const std::string TITLEBAR_ACTION_MAX_HORZ ("toggle_maximize_horizontally"); const std::string TITLEBAR_ACTION_MAX ("toggle_maximize"); const std::string TITLEBAR_ACTION_MINIMIZE ("minimize"); const std::string TITLEBAR_ACTION_MENU ("menu"); const std::string TITLEBAR_ACTION_LOWER ("lower"); const std::string TITLEBAR_ACTION_NONE ("none"); const std::string MOUSE_WHEEL_ACTION_SHADE ("shade"); } class GWDSettingsTestCommon : public ::testing::Test { public: virtual void SetUp () { env.SetUpEnv (); } virtual void TearDown () { env.TearDownEnv (); } private: CompizGLibGSliceOffEnv env; }; namespace { void gwd_settings_unref (GWDSettings *settings) { g_object_unref (G_OBJECT (settings)); } } class GWDMockSettingsNotifiedGMock { public: GWDMockSettingsNotifiedGMock (boost::shared_ptr settings) { g_signal_connect (settings.get (), "update-decorations", G_CALLBACK (GWDMockSettingsNotifiedGMock::updateDecorationsCb), this); g_signal_connect (settings.get (), "update-titlebar-font", G_CALLBACK (GWDMockSettingsNotifiedGMock::updateTitlebarFontCb), this); g_signal_connect (settings.get (), "update-metacity-theme", G_CALLBACK (GWDMockSettingsNotifiedGMock::updateMetacityThemeCb), this); g_signal_connect (settings.get (), "update-metacity-button-layout", G_CALLBACK (GWDMockSettingsNotifiedGMock::updateMetacityButtonLayoutCb), this); } MOCK_METHOD0 (updateDecorations, void ()); MOCK_METHOD0 (updateTitlebarFont, void ()); MOCK_METHOD0 (updateMetacityTheme, void ()); MOCK_METHOD0 (updateMetacityButtonLayout, void ()); private: static void updateDecorationsCb (GWDSettings *settings, GWDMockSettingsNotifiedGMock *gmock) { gmock->updateDecorations (); } static void updateTitlebarFontCb (GWDSettings *settings, GWDMockSettingsNotifiedGMock *gmock) { gmock->updateTitlebarFont (); } static void updateMetacityThemeCb (GWDSettings *settings, gint metacity_theme_type, const gchar *metacity_theme_name, GWDMockSettingsNotifiedGMock *gmock) { gmock->updateMetacityTheme (); } static void updateMetacityButtonLayoutCb (GWDSettings *settings, const gchar *button_layout, GWDMockSettingsNotifiedGMock *gmock) { gmock->updateMetacityButtonLayout (); } }; class GWDSettingsTest : public GWDSettingsTestCommon { public: virtual void SetUp () { GWDSettingsTestCommon::SetUp (); mSettings.reset (gwd_settings_new (BLUR_TYPE_UNSET, NULL), boost::bind (gwd_settings_unref, _1)); mGMockNotified.reset (new StrictMock (mSettings)); ExpectAllNotificationsOnce (); } protected: boost::shared_ptr > mGMockNotified; boost::shared_ptr mSettings; private: void ExpectAllNotificationsOnce () { EXPECT_CALL (*mGMockNotified, updateMetacityTheme ()).Times (1); EXPECT_CALL (*mGMockNotified, updateMetacityButtonLayout ()).Times (1); EXPECT_CALL (*mGMockNotified, updateTitlebarFont ()).Times (1); EXPECT_CALL (*mGMockNotified, updateDecorations ()).Times (1); gwd_settings_thaw_updates (mSettings.get ()); } }; TEST_F(GWDSettingsTest, TestGWDSettingsInstantiation) { } /* Won't fail if the code in SetUp succeeds */ TEST_F(GWDSettingsTest, TestUpdateAllOnInstantiation) { } /* We're just using use_tooltips here as an example */ TEST_F(GWDSettingsTest, TestFreezeUpdatesNoUpdates) { gwd_settings_freeze_updates (mSettings.get ()); EXPECT_THAT (gwd_settings_use_tooltips_changed (mSettings.get (), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); } /* We're just using use_tooltips here as an example */ TEST_F(GWDSettingsTest, TestFreezeUpdatesNoUpdatesThawUpdatesAllUpdates) { gwd_settings_freeze_updates (mSettings.get ()); EXPECT_THAT (gwd_settings_use_tooltips_changed (mSettings.get (), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); gwd_settings_thaw_updates (mSettings.get ()); } /* We're just using use_tooltips here as an example */ TEST_F(GWDSettingsTest, TestFreezeUpdatesNoUpdatesThawUpdatesAllUpdatesNoDupes) { gwd_settings_freeze_updates (mSettings.get ()); EXPECT_THAT (gwd_settings_use_tooltips_changed (mSettings.get (), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_use_tooltips_changed (mSettings.get (), !testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_THAT (gwd_settings_use_tooltips_changed (mSettings.get (), testing_values::USE_TOOLTIPS_VALUE), IsTrue ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()).Times (1); gwd_settings_thaw_updates (mSettings.get ()); } TEST_F(GWDSettingsTest, TestShadowPropertyChanged) { decor_shadow_options_t activeShadow; decor_shadow_options_t inactiveShadow; EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_shadow_property_changed (mSettings.get (), testing_values::ACTIVE_SHADOW_OPACITY_VALUE, testing_values::ACTIVE_SHADOW_RADIUS_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::ACTIVE_SHADOW_OFFSET_Y_VALUE, testing_values::ACTIVE_SHADOW_COLOR_STR_VALUE.c_str (), testing_values::INACTIVE_SHADOW_OPACITY_VALUE, testing_values::INACTIVE_SHADOW_RADIUS_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_X_VALUE, testing_values::INACTIVE_SHADOW_OFFSET_Y_VALUE, testing_values::INACTIVE_SHADOW_COLOR_STR_VALUE.c_str ())); activeShadow.shadow_opacity = testing_values::ACTIVE_SHADOW_OPACITY_VALUE; activeShadow.shadow_radius = testing_values::ACTIVE_SHADOW_RADIUS_VALUE; activeShadow.shadow_offset_x = testing_values::ACTIVE_SHADOW_OFFSET_X_INT_VALUE; activeShadow.shadow_offset_y = testing_values::ACTIVE_SHADOW_OFFSET_Y_INT_VALUE; activeShadow.shadow_color[0] = testing_values::ACTIVE_SHADOW_COLOR_VALUE[0]; activeShadow.shadow_color[1] = testing_values::ACTIVE_SHADOW_COLOR_VALUE[1]; activeShadow.shadow_color[2] = testing_values::ACTIVE_SHADOW_COLOR_VALUE[2]; inactiveShadow.shadow_opacity = testing_values::INACTIVE_SHADOW_OPACITY_VALUE; inactiveShadow.shadow_radius = testing_values::INACTIVE_SHADOW_RADIUS_VALUE; inactiveShadow.shadow_offset_x = testing_values::INACTIVE_SHADOW_OFFSET_X_INT_VALUE; inactiveShadow.shadow_offset_y = testing_values::INACTIVE_SHADOW_OFFSET_Y_INT_VALUE; inactiveShadow.shadow_color[0] = testing_values::INACTIVE_SHADOW_COLOR_VALUE[0]; inactiveShadow.shadow_color[1] = testing_values::INACTIVE_SHADOW_COLOR_VALUE[1]; inactiveShadow.shadow_color[2] = testing_values::INACTIVE_SHADOW_COLOR_VALUE[2]; EXPECT_THAT (gwd_settings_get_active_shadow (mSettings.get ()), IsShadowsEqual (activeShadow)); EXPECT_THAT (gwd_settings_get_inactive_shadow (mSettings.get ()), IsShadowsEqual (inactiveShadow)); } TEST_F(GWDSettingsTest, TestShadowPropertyChangedIsDefault) { EXPECT_FALSE (gwd_settings_shadow_property_changed (mSettings.get (), ACTIVE_SHADOW_RADIUS_DEFAULT, ACTIVE_SHADOW_OPACITY_DEFAULT, ACTIVE_SHADOW_OFFSET_X_DEFAULT, ACTIVE_SHADOW_OFFSET_Y_DEFAULT, ACTIVE_SHADOW_COLOR_DEFAULT, INACTIVE_SHADOW_RADIUS_DEFAULT, INACTIVE_SHADOW_OPACITY_DEFAULT, INACTIVE_SHADOW_OFFSET_X_DEFAULT, INACTIVE_SHADOW_OFFSET_Y_DEFAULT, INACTIVE_SHADOW_COLOR_DEFAULT)); } TEST_F(GWDSettingsTest, TestUseTooltipsChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_use_tooltips_changed (mSettings.get (), testing_values::USE_TOOLTIPS_VALUE)); EXPECT_THAT (gwd_settings_get_use_tooltips (mSettings.get ()), Eq (testing_values::USE_TOOLTIPS_VALUE)); } TEST_F(GWDSettingsTest, TestUseTooltipsChangedIsDefault) { EXPECT_FALSE (gwd_settings_use_tooltips_changed (mSettings.get (), USE_TOOLTIPS_DEFAULT)); } TEST_F(GWDSettingsTest, TestBlurChangedTitlebar) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_blur_changed (mSettings.get (), testing_values::BLUR_TYPE_TITLEBAR_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_blur_type (mSettings.get ()), Eq (testing_values::BLUR_TYPE_TITLEBAR_INT_VALUE)); } TEST_F(GWDSettingsTest, TestBlurChangedAll) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_blur_changed (mSettings.get (), testing_values::BLUR_TYPE_ALL_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_blur_type (mSettings.get ()), Eq (testing_values::BLUR_TYPE_ALL_INT_VALUE)); } TEST_F(GWDSettingsTest, TestBlurChangedNone) { EXPECT_FALSE (gwd_settings_blur_changed (mSettings.get (), testing_values::BLUR_TYPE_NONE_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_blur_type (mSettings.get ()), Eq (testing_values::BLUR_TYPE_NONE_INT_VALUE)); } TEST_F(GWDSettingsTest, TestBlurSetCommandLine) { gint blurType = testing_values::BLUR_TYPE_ALL_INT_VALUE; mSettings.reset (gwd_settings_new (blurType, NULL), boost::bind (gwd_settings_unref, _1)); EXPECT_FALSE (gwd_settings_blur_changed (mSettings.get (), testing_values::BLUR_TYPE_NONE_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_blur_type (mSettings.get ()), Eq (blurType)); } TEST_F(GWDSettingsTest, TestMetacityThemeChanged) { EXPECT_CALL (*mGMockNotified, updateMetacityTheme ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_metacity_theme_changed (mSettings.get (), testing_values::USE_METACITY_THEME_VALUE, METACITY_THEME_TYPE_DEFAULT, testing_values::METACITY_THEME_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_metacity_theme_name (mSettings.get ()), IsStringsEqual (testing_values::METACITY_THEME_VALUE.c_str ())); } TEST_F(GWDSettingsTest, TestMetacityThemeChangedNoUseMetacityTheme) { const gchar *metacityTheme = NULL; EXPECT_CALL (*mGMockNotified, updateMetacityTheme ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_metacity_theme_changed (mSettings.get (), FALSE, METACITY_THEME_TYPE_DEFAULT, METACITY_THEME_NAME_DEFAULT)); EXPECT_THAT (gwd_settings_get_metacity_theme_name (mSettings.get ()), IsStringsEqual (metacityTheme)); } TEST_F(GWDSettingsTest, TestMetacityThemeChangedIsDefault) { EXPECT_FALSE (gwd_settings_metacity_theme_changed (mSettings.get (), testing_values::USE_METACITY_THEME_VALUE, METACITY_THEME_TYPE_DEFAULT, METACITY_THEME_NAME_DEFAULT)); } TEST_F(GWDSettingsTest, TestMetacityThemeSetCommandLine) { const gchar *metacityTheme = "Ambiance"; mSettings.reset (gwd_settings_new (BLUR_TYPE_UNSET, metacityTheme), boost::bind (gwd_settings_unref, _1)); EXPECT_FALSE (gwd_settings_metacity_theme_changed (mSettings.get (), testing_values::USE_METACITY_THEME_VALUE, METACITY_THEME_TYPE_DEFAULT, testing_values::METACITY_THEME_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_metacity_theme_name (mSettings.get ()), IsStringsEqual (metacityTheme)); } TEST_F(GWDSettingsTest, TestMetacityOpacityChanged) { EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_opacity_changed (mSettings.get (), testing_values::ACTIVE_OPACITY_VALUE, testing_values::INACTIVE_OPACITY_VALUE, testing_values::ACTIVE_SHADE_OPACITY_VALUE, testing_values::INACTIVE_SHADE_OPACITY_VALUE)); EXPECT_THAT (gwd_settings_get_metacity_inactive_opacity (mSettings.get ()), Eq (testing_values::INACTIVE_OPACITY_VALUE)); EXPECT_THAT (gwd_settings_get_metacity_active_opacity (mSettings.get ()), Eq (testing_values::ACTIVE_OPACITY_VALUE)); EXPECT_THAT (gwd_settings_get_metacity_inactive_shade_opacity (mSettings.get ()), Eq (testing_values::INACTIVE_SHADE_OPACITY_VALUE)); EXPECT_THAT (gwd_settings_get_metacity_active_shade_opacity (mSettings.get ()), Eq (testing_values::ACTIVE_SHADE_OPACITY_VALUE)); } TEST_F(GWDSettingsTest, TestMetacityOpacityChangedIsDefault) { EXPECT_FALSE (gwd_settings_opacity_changed (mSettings.get (), METACITY_ACTIVE_OPACITY_DEFAULT, METACITY_INACTIVE_OPACITY_DEFAULT, METACITY_ACTIVE_SHADE_OPACITY_DEFAULT, METACITY_INACTIVE_SHADE_OPACITY_DEFAULT)); } TEST_F(GWDSettingsTest, TestButtonLayoutChanged) { EXPECT_CALL (*mGMockNotified, updateMetacityButtonLayout ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_button_layout_changed (mSettings.get (), testing_values::BUTTON_LAYOUT_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_metacity_button_layout (mSettings.get ()), IsStringsEqual (testing_values::BUTTON_LAYOUT_VALUE.c_str ())); } TEST_F(GWDSettingsTest, TestButtonLayoutChangedIsDefault) { EXPECT_FALSE (gwd_settings_button_layout_changed (mSettings.get (), METACITY_BUTTON_LAYOUT_DEFAULT)); } TEST_F(GWDSettingsTest, TestTitlebarFontChanged) { EXPECT_CALL (*mGMockNotified, updateTitlebarFont ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_font_changed (mSettings.get (), testing_values::NO_USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_titlebar_font (mSettings.get ()), IsStringsEqual (testing_values::TITLEBAR_FONT_VALUE.c_str ())); } TEST_F(GWDSettingsTest, TestTitlebarFontChangedUseSystemFont) { const gchar *titlebarFont = NULL; EXPECT_CALL (*mGMockNotified, updateTitlebarFont ()); EXPECT_CALL (*mGMockNotified, updateDecorations ()); EXPECT_TRUE (gwd_settings_font_changed (mSettings.get (), testing_values::USE_SYSTEM_FONT_VALUE, testing_values::TITLEBAR_FONT_VALUE.c_str ())); EXPECT_THAT (gwd_settings_get_titlebar_font (mSettings.get ()), IsStringsEqual (titlebarFont)); } TEST_F(GWDSettingsTest, TestTitlebarFontChangedIsDefault) { EXPECT_FALSE (gwd_settings_font_changed (mSettings.get (), testing_values::NO_USE_SYSTEM_FONT_VALUE, TITLEBAR_FONT_DEFAULT)); } namespace { class GWDTitlebarActionInfo { public: GWDTitlebarActionInfo (const std::string &titlebarAction, const std::string &mouseWheelAction, const gint titlebarActionId, const gint mouseWheelActionId) : mTitlebarAction (titlebarAction), mMouseWheelAction (mouseWheelAction), mTitlebarActionId (titlebarActionId), mMouseWheelActionId (mouseWheelActionId) { } const std::string & titlebarAction () const { return mTitlebarAction; } const std::string & mouseWheelAction () const { return mMouseWheelAction; } const gint & titlebarActionId () const { return mTitlebarActionId; } const gint & mouseWheelActionId () const { return mMouseWheelActionId; } private: std::string mTitlebarAction; std::string mMouseWheelAction; gint mTitlebarActionId; gint mMouseWheelActionId; }; } class GWDSettingsTestClickActions : public GWDSettingsTestCommon, public ::testing::WithParamInterface { public: virtual void SetUp () { GWDSettingsTestCommon::SetUp (); mSettings.reset (gwd_settings_new (BLUR_TYPE_UNSET, NULL), boost::bind (gwd_settings_unref, _1)); } protected: boost::shared_ptr mSettings; }; TEST_P(GWDSettingsTestClickActions, TestClickActionsAndMouseActions) { gwd_settings_titlebar_actions_changed (mSettings.get (), GetParam ().titlebarAction ().c_str (), GetParam ().titlebarAction ().c_str (), GetParam ().titlebarAction ().c_str (), GetParam ().mouseWheelAction ().c_str ()); EXPECT_THAT (gwd_settings_get_titlebar_double_click_action (mSettings.get ()), Eq (GetParam ().titlebarActionId ())); EXPECT_THAT (gwd_settings_get_titlebar_middle_click_action (mSettings.get ()), Eq (GetParam ().titlebarActionId ())); EXPECT_THAT (gwd_settings_get_titlebar_right_click_action (mSettings.get ()), Eq (GetParam ().titlebarActionId ())); EXPECT_THAT (gwd_settings_get_mouse_wheel_action (mSettings.get ()), Eq (GetParam ().mouseWheelActionId ())); } INSTANTIATE_TEST_CASE_P (MouseActions, GWDSettingsTestClickActions, ::testing::Values (GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_NONE, testing_values::TITLEBAR_ACTION_NONE, CLICK_ACTION_NONE, WHEEL_ACTION_NONE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_SHADE, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_SHADE, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_MAX, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_MAXIMIZE, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_MINIMIZE, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_MINIMIZE, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_LOWER, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_LOWER, WHEEL_ACTION_SHADE), GWDTitlebarActionInfo (testing_values::TITLEBAR_ACTION_MENU, testing_values::MOUSE_WHEEL_ACTION_SHADE, CLICK_ACTION_MENU, WHEEL_ACTION_SHADE))); ./gtk/window-decorator/gwd-settings-xproperty-storage.c0000644000004100000410000001471213246301623023623 0ustar www-datawww-data/* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include #include #include "gtk-window-decorator.h" #include "gwd-settings.h" #include "gwd-settings-xproperty-storage.h" struct _GWDSettingsXPropertyStorage { GObject parent; GWDSettings *settings; Display *xdpy; Window root; }; enum { PROP_0, PROP_SETTINGS, LAST_PROP }; static GParamSpec *storage_properties[LAST_PROP] = { NULL }; G_DEFINE_TYPE (GWDSettingsXPropertyStorage, gwd_settings_xproperty_storage, G_TYPE_OBJECT) static void gwd_settings_xproperty_storage_dispose (GObject *object) { GWDSettingsXPropertyStorage *storage; storage = GWD_SETTINGS_XPROPERTY_STORAGE (object); g_clear_object (&storage->settings); G_OBJECT_CLASS (gwd_settings_xproperty_storage_parent_class)->dispose (object); } static void gwd_settings_xproperty_storage_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsXPropertyStorage *storage; storage = GWD_SETTINGS_XPROPERTY_STORAGE (object); switch (property_id) { case PROP_SETTINGS: g_return_if_fail (!storage->settings); storage->settings = g_value_dup_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gwd_settings_xproperty_storage_class_init (GWDSettingsXPropertyStorageClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->dispose = gwd_settings_xproperty_storage_dispose; object_class->set_property = gwd_settings_xproperty_storage_set_property; storage_properties[PROP_SETTINGS] = g_param_spec_object ("settings", "GWDSettings", "GWDSettings", GWD_TYPE_SETTINGS, G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, LAST_PROP, storage_properties); } static void gwd_settings_xproperty_storage_init (GWDSettingsXPropertyStorage *storage) { GdkDisplay *display; display = gdk_display_get_default (); storage->xdpy = gdk_x11_display_get_xdisplay (display); storage->root = gdk_x11_get_default_root_xwindow (); } GWDSettingsXPropertyStorage * gwd_settings_xproperty_storage_new (GWDSettings *settings) { return g_object_new (GWD_TYPE_SETTINGS_XPROPERTY_STORAGE, "settings", settings, NULL); } gboolean gwd_settings_xproperty_storage_update_all (GWDSettingsXPropertyStorage *storage) { Atom actual; int result, format; unsigned long n, left; unsigned char *prop_data; XTextProperty shadow_color_xtp; gdouble aradius; gdouble aopacity; gint ax_off; gint ay_off; char *active_shadow_color = NULL; gdouble iradius; gdouble iopacity; gint ix_off; gint iy_off; char *inactive_shadow_color = NULL; result = XGetWindowProperty (storage->xdpy, storage->root, compiz_shadow_info_atom, 0, 32768, 0, XA_INTEGER, &actual, &format, &n, &left, &prop_data); if (result != Success) return FALSE; if (n == 8) { long *data = (long *) prop_data; aradius = data[0]; aopacity = data[1]; ax_off = data[2]; ay_off = data[3]; iradius = data[4]; iopacity = data[5]; ix_off = data[6]; iy_off = data[7]; /* Radius and Opacity are multiplied by 1000 to keep precision, * divide by that much to get our real radius and opacity */ aradius /= 1000; aopacity /= 1000; iradius /= 1000; iopacity /= 1000; XFree (prop_data); } else { XFree (prop_data); return FALSE; } result = XGetTextProperty (storage->xdpy, storage->root, &shadow_color_xtp, compiz_shadow_color_atom); if (shadow_color_xtp.value) { int ret_count = 0; char **t_data = NULL; XTextPropertyToStringList (&shadow_color_xtp, &t_data, &ret_count); if (ret_count == 2) { active_shadow_color = strdup (t_data[0]); inactive_shadow_color = strdup (t_data[1]); if (t_data) XFreeStringList (t_data); XFree (shadow_color_xtp.value); } else { XFree (shadow_color_xtp.value); return FALSE; } } return gwd_settings_shadow_property_changed (storage->settings, (gdouble) MAX (0.0, MIN (aradius, 48.0)), (gdouble) MAX (0.0, MIN (aopacity, 6.0)), (gdouble) MAX (-16, MIN (ax_off, 16)), (gdouble) MAX (-16, MIN (ay_off, 16)), active_shadow_color, (gdouble) MAX (0.0, MIN (iradius, 48.0)), (gdouble) MAX (0.0, MIN (iopacity, 6.0)), (gdouble) MAX (-16, MIN (ix_off, 16)), (gdouble) MAX (-16, MIN (iy_off, 16)), inactive_shadow_color); } ./gtk/window-decorator/util.c0000644000004100000410000000657713246301623016457 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" gboolean get_window_prop (Window xwindow, Atom atom, Window *val) { Atom type; int format; gulong nitems; gulong bytes_after; Window *w; int err, result; *val = 0; gdk_error_trap_push (); type = None; result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xwindow, atom, 0, G_MAXLONG, False, XA_WINDOW, &type, &format, &nitems, &bytes_after, (void*) &w); err = gdk_error_trap_pop (); if (err != Success || result != Success) return FALSE; if (type != XA_WINDOW) { XFree (w); return FALSE; } *val = *w; XFree (w); return TRUE; } unsigned int get_mwm_prop (Window xwindow) { Display *xdisplay; Atom actual; int err, result, format; unsigned long n, left; unsigned char *data; unsigned int decor = MWM_DECOR_ALL; xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); gdk_error_trap_push (); result = XGetWindowProperty (xdisplay, xwindow, mwm_hints_atom, 0L, 20L, FALSE, AnyPropertyType, &actual, &format, &n, &left, &data); err = gdk_error_trap_pop (); if (err != Success || result != Success) return decor; if (data) { MwmHints *mwm_hints = (MwmHints *) data; if (n >= PROP_MOTIF_WM_HINT_ELEMENTS) { if (mwm_hints->flags & MWM_HINTS_DECORATIONS) decor = mwm_hints->decorations; } XFree (data); } return decor; } static gboolean get_prefer_dark_theme (void) { gboolean prefer_dark_theme; g_object_get (gtk_settings_get_default (), "gtk-application-prefer-dark-theme", &prefer_dark_theme, NULL); return prefer_dark_theme; } gchar * get_gtk_theme_variant (Window xwindow) { GdkDisplay *display; Display *xdisplay; gchar *gtk_theme_variant; gint result; Atom actual; gint format; gulong n; gulong left; guchar *data; display = gdk_display_get_default (); xdisplay = gdk_x11_display_get_xdisplay (display); gtk_theme_variant = NULL; gdk_error_trap_push (); result = XGetWindowProperty (xdisplay, xwindow, gtk_theme_variant_atom, 0L, 1024L, False, utf8_string_atom, &actual, &format, &n, &left, &data); gdk_error_trap_pop_ignored (); if (result == Success && data) { if (n) gtk_theme_variant = g_strdup ((gchar *) data); XFree (data); } if (gtk_theme_variant == NULL && get_prefer_dark_theme ()) gtk_theme_variant = g_strdup ("dark"); return gtk_theme_variant; } ./gtk/window-decorator/gwd-theme.h0000644000004100000410000001634213246301623017357 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) 2016 Alberts Muktupāvels * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GWD_THEME_H #define GWD_THEME_H #include #include #include G_BEGIN_DECLS typedef struct _decor decor_t; typedef struct _decor_frame decor_frame_t; typedef struct _GWDSettings GWDSettings; #define GWD_TYPE_THEME gwd_theme_get_type () G_DECLARE_DERIVABLE_TYPE (GWDTheme, gwd_theme, GWD, THEME, GObject) struct _GWDThemeClass { GObjectClass parent_class; void (* dpi_changed) (GWDTheme *theme); void (* scale_changed) (GWDTheme *theme); void (* style_updated) (GWDTheme *theme); void (* get_shadow) (GWDTheme *theme, decor_frame_t *frame, decor_shadow_options_t *options, gboolean active); void (* draw_window_decoration) (GWDTheme *theme, decor_t *decor); gboolean (* calc_decoration_size) (GWDTheme *theme, decor_t *decor, gint w, gint h, gint name_width, gint *width, gint *height); void (* update_border_extents) (GWDTheme *theme, decor_frame_t *frame); void (* get_event_window_position) (GWDTheme *theme, decor_t *decor, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gboolean (* get_button_position) (GWDTheme *theme, decor_t *decor, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h); void (* update_titlebar_font) (GWDTheme *theme, const PangoFontDescription *titlebar_font); }; typedef enum { GWD_THEME_TYPE_CAIRO, GWD_THEME_TYPE_METACITY } GWDThemeType; GWDTheme * gwd_theme_new (GWDThemeType type, GWDSettings *settings); GWDSettings * gwd_theme_get_settings (GWDTheme *theme); gdouble gwd_theme_get_dpi (GWDTheme *theme); gint gwd_theme_get_scale (GWDTheme *theme); GtkWidget * gwd_theme_get_style_window (GWDTheme *theme); void gwd_theme_get_shadow (GWDTheme *theme, decor_frame_t *frame, decor_shadow_options_t *options, gboolean active); void gwd_theme_draw_window_decoration (GWDTheme *theme, decor_t *decor); gboolean gwd_theme_calc_decoration_size (GWDTheme *theme, decor_t *decor, gint w, gint h, gint name_width, gint *width, gint *height); void gwd_theme_update_border_extents (GWDTheme *theme, decor_frame_t *frame); void gwd_theme_get_event_window_position (GWDTheme *theme, decor_t *decor, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h); gboolean gwd_theme_get_button_position (GWDTheme *theme, decor_t *decor, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h); void gwd_theme_update_titlebar_font (GWDTheme *theme); PangoFontDescription * gwd_theme_get_titlebar_font (GWDTheme *theme, decor_frame_t *frame); G_END_DECLS #endif ./gtk/window-decorator/gwd-settings-storage.h0000644000004100000410000000240513246301623021552 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef GWD_SETTINGS_STORAGE_H #define GWD_SETTINGS_STORAGE_H #include "gwd-settings.h" G_BEGIN_DECLS #define GWD_TYPE_SETTINGS_STORAGE gwd_settings_storage_get_type () G_DECLARE_FINAL_TYPE (GWDSettingsStorage, gwd_settings_storage, GWD, SETTINGS_STORAGE, GObject) GWDSettingsStorage * gwd_settings_storage_new (GWDSettings *settings); G_END_DECLS #endif ./gtk/window-decorator/TODO0000644000004100000410000000120513246301623016005 0ustar www-datawww-data * Plugin interface * Plugin with SVG-based theme support * Plugin that supports old metacity themes ----- Cleanup TODO: * Allow frame keying types for frame types, so /2d/window_type/state/id , this way we can have different shadows per-frame and much more granular memory control (decor_t just becomes a handle to some decoration specific stuff, decor_frame_t becomes a table of shared resources held by all decor_t's * Completely seal off the values of structs and use only getter and setter functions to control API * Start implementing a system in GObject * Put all the globals into their own structs or namespaces ./gtk/window-decorator/gwd-theme-metacity.c0000644000004100000410000011716513246301623021174 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) 2006 Novell, Inc. * Copyright (C) 2010 Sam Spilsbury * Copyright (C) 2011 Canonical Ltd. * Copyright (C) 2016 Alberts Muktupāvels * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: * Alberts Muktupāvels * David Reveman * Sam Spilsbury */ #include "config.h" #include #include "gtk-window-decorator.h" #include "gwd-settings.h" #include "gwd-theme-metacity.h" struct _GWDThemeMetacity { GObject parent; MetaTheme *theme; gulong button_layout_id; }; G_DEFINE_TYPE (GWDThemeMetacity, gwd_theme_metacity, GWD_TYPE_THEME) static MetaFrameType frame_type_from_string (const gchar *str) { if (strcmp ("dialog", str) == 0) return META_FRAME_TYPE_DIALOG; else if (strcmp ("modal_dialog", str) == 0) return META_FRAME_TYPE_MODAL_DIALOG; else if (strcmp ("utility", str) == 0) return META_FRAME_TYPE_UTILITY; else if (strcmp ("menu", str) == 0) return META_FRAME_TYPE_MENU; return META_FRAME_TYPE_NORMAL; } static void update_metacity_button_layout_cb (GWDSettings *settings, const gchar *button_layout, GWDThemeMetacity *metacity) { gboolean invert = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL; meta_theme_set_button_layout (metacity->theme, button_layout, invert); } static MetaButtonState meta_button_state (gint state) { if (state & IN_EVENT_WINDOW) { if (state & PRESSED_EVENT_WINDOW) return META_BUTTON_STATE_PRESSED; return META_BUTTON_STATE_PRELIGHT; } return META_BUTTON_STATE_NORMAL; } static MetaButtonState meta_button_state_for_button_type (decor_t *decor, MetaButtonType type) { switch (type) { case META_BUTTON_TYPE_CLOSE: return meta_button_state (decor->button_states[BUTTON_CLOSE]); case META_BUTTON_TYPE_MAXIMIZE: return meta_button_state (decor->button_states[BUTTON_MAX]); case META_BUTTON_TYPE_MINIMIZE: return meta_button_state (decor->button_states[BUTTON_MIN]); case META_BUTTON_TYPE_MENU: return meta_button_state (decor->button_states[BUTTON_MENU]); case META_BUTTON_TYPE_SHADE: return meta_button_state (decor->button_states[BUTTON_SHADE]); case META_BUTTON_TYPE_ABOVE: return meta_button_state (decor->button_states[BUTTON_ABOVE]); case META_BUTTON_TYPE_STICK: return meta_button_state (decor->button_states[BUTTON_STICK]); case META_BUTTON_TYPE_UNSHADE: return meta_button_state (decor->button_states[BUTTON_UNSHADE]); case META_BUTTON_TYPE_UNABOVE: return meta_button_state (decor->button_states[BUTTON_UNABOVE]); case META_BUTTON_TYPE_UNSTICK: return meta_button_state (decor->button_states[BUTTON_UNSTICK]); default: break; } return META_BUTTON_STATE_NORMAL; } static MetaButtonState update_button_state (MetaButtonType type, GdkRectangle rect, gpointer user_data) { decor_t *decor = (decor_t *) user_data; return meta_button_state_for_button_type (decor, type); } static gint radius_to_width (gint radius, gint i) { gfloat r1 = sqrt (radius) + radius; gfloat r2 = r1 * r1 - (r1 - (i + 0.5)) * (r1 - (i + 0.5)); return floor (0.5f + r1 - sqrt (r2)); } static void get_corner_radius (const MetaFrameGeometry *fgeom, gint *top_left_radius, gint *top_right_radius, gint *bottom_left_radius, gint *bottom_right_radius) { *top_left_radius = fgeom->top_left_corner_rounded_radius; *top_right_radius = fgeom->top_right_corner_rounded_radius; *bottom_left_radius = fgeom->bottom_left_corner_rounded_radius; *bottom_right_radius = fgeom->bottom_right_corner_rounded_radius; } static Region get_top_border_region (const MetaFrameGeometry *fgeom, gboolean subtract_borders) { GtkBorder invisible = fgeom->borders.invisible; GtkBorder shadow = fgeom->borders.shadow; Region corners_xregion; Region border_xregion; XRectangle xrect; gint top_left_radius; gint top_right_radius; gint bottom_left_radius; gint bottom_right_radius; gint w; gint i; gint width; gint height; corners_xregion = XCreateRegion (); get_corner_radius (fgeom, &top_left_radius, &top_right_radius, &bottom_left_radius, &bottom_right_radius); width = fgeom->width - invisible.left - invisible.right + shadow.left + shadow.right; height = fgeom->borders.visible.top + shadow.top; if (top_left_radius && subtract_borders) { for (i = 0; i < top_left_radius; ++i) { w = radius_to_width (top_left_radius, i); xrect.x = 0; xrect.y = i; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } if (top_right_radius && subtract_borders) { for (i = 0; i < top_right_radius; ++i) { w = radius_to_width (top_right_radius, i); xrect.x = width - w; xrect.y = i; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = width; xrect.height = height; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); XSubtractRegion (border_xregion, corners_xregion, border_xregion); XDestroyRegion (corners_xregion); return border_xregion; } static Region get_bottom_border_region (const MetaFrameGeometry *fgeom, gboolean subtract_borders) { GtkBorder invisible = fgeom->borders.invisible; GtkBorder shadow = fgeom->borders.shadow; Region corners_xregion; Region border_xregion; XRectangle xrect; gint top_left_radius; gint top_right_radius; gint bottom_left_radius; gint bottom_right_radius; gint w; gint i; gint width; gint height; corners_xregion = XCreateRegion (); get_corner_radius (fgeom, &top_left_radius, &top_right_radius, &bottom_left_radius, &bottom_right_radius); width = fgeom->width - invisible.left - invisible.right + shadow.left + shadow.right; height = fgeom->borders.visible.bottom + shadow.bottom; if (bottom_left_radius && subtract_borders) { for (i = 0; i < bottom_left_radius; ++i) { w = radius_to_width (bottom_left_radius, i); xrect.x = 0; xrect.y = height - i - 1; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } if (bottom_right_radius && subtract_borders) { for (i = 0; i < bottom_right_radius; ++i) { w = radius_to_width (bottom_right_radius, i); xrect.x = width - w; xrect.y = height - i - 1; xrect.width = w; xrect.height = 1; XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion); } } border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = width; xrect.height = height; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); XSubtractRegion (border_xregion, corners_xregion, border_xregion); XDestroyRegion (corners_xregion); return border_xregion; } static Region get_left_border_region (const MetaFrameGeometry *fgeom) { Region border_xregion; XRectangle xrect; border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = fgeom->borders.visible.left + fgeom->borders.shadow.left; xrect.height = fgeom->height - fgeom->borders.total.top - fgeom->borders.total.bottom; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); return border_xregion; } static Region get_right_border_region (const MetaFrameGeometry *fgeom) { Region border_xregion; XRectangle xrect; border_xregion = XCreateRegion (); xrect.x = 0; xrect.y = 0; xrect.width = fgeom->borders.visible.right + fgeom->borders.shadow.right; xrect.height = fgeom->height - fgeom->borders.total.top - fgeom->borders.total.bottom; XUnionRectWithRegion (&xrect, border_xregion, border_xregion); return border_xregion; } static void decor_update_meta_window_property (GWDThemeMetacity *metacity, decor_t *d, MetaFrameFlags flags, MetaFrameType type, Region top, Region bottom, Region left, Region right) { GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); unsigned int frame_type = populate_frame_type (d); unsigned int frame_state = populate_frame_state (d); unsigned int frame_actions = populate_frame_actions (d); unsigned int nOffset = 1; decor_extents_t win_extents; decor_extents_t frame_win_extents; decor_extents_t max_win_extents; decor_extents_t frame_max_win_extents; decor_quad_t quads[N_QUADS_MAX]; gint w; gint lh; gint rh; gint top_stretch_offset; gint bottom_stretch_offset; gint left_stretch_offset; gint right_stretch_offset; gint nQuad; long *data; win_extents = frame_win_extents = d->frame->win_extents; max_win_extents = frame_max_win_extents = d->frame->max_win_extents; /* Add the invisible grab area padding */ { MetaFrameFlags tmp_flags; MetaFrameBorders borders; tmp_flags = flags & ~META_FRAME_MAXIMIZED; meta_theme_get_frame_borders (metacity->theme, d->gtk_theme_variant, type, tmp_flags, &borders); frame_win_extents.left += borders.resize.left; frame_win_extents.right += borders.resize.right; frame_win_extents.bottom += borders.resize.bottom; frame_win_extents.top += borders.resize.top; tmp_flags = flags | META_FRAME_MAXIMIZED; meta_theme_get_frame_borders (metacity->theme, d->gtk_theme_variant, type, tmp_flags, &borders); frame_max_win_extents.left += borders.resize.left; frame_max_win_extents.right += borders.resize.right; frame_max_win_extents.bottom += borders.resize.bottom; frame_max_win_extents.top += borders.resize.top; } w = d->border_layout.top.x2 - d->border_layout.top.x1 - d->context->left_space - d->context->right_space; if (d->border_layout.rotation) lh = d->border_layout.left.x2 - d->border_layout.left.x1; else lh = d->border_layout.left.y2 - d->border_layout.left.y1; if (d->border_layout.rotation) rh = d->border_layout.right.x2 - d->border_layout.right.x1; else rh = d->border_layout.right.y2 - d->border_layout.right.y1; left_stretch_offset = lh / 2; right_stretch_offset = rh / 2; top_stretch_offset = w - d->button_width - 1; bottom_stretch_offset = (d->border_layout.bottom.x2 - d->border_layout.bottom.x1 - d->context->left_space - d->context->right_space) / 2; nQuad = decor_set_lXrXtXbX_window_quads (quads, d->context, &d->border_layout, left_stretch_offset, right_stretch_offset, top_stretch_offset, bottom_stretch_offset); data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP); decor_quads_to_property (data, nOffset - 1, cairo_xlib_surface_get_drawable (d->surface), &frame_win_extents, &win_extents, &frame_max_win_extents, &max_win_extents, ICON_SPACE + d->button_width, 0, quads, nQuad, frame_type, frame_state, frame_actions); gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX); gdk_display_sync (display); gdk_error_trap_pop_ignored (); free (data); decor_update_blur_property (d, w, lh, top, top_stretch_offset, bottom, bottom_stretch_offset, left, left_stretch_offset, right, right_stretch_offset); } static void get_decoration_geometry (GWDThemeMetacity *metacity, decor_t *decor, MetaFrameFlags *flags, MetaFrameGeometry *fgeom, MetaFrameType frame_type) { gint client_width; gint client_height; if (!(frame_type < META_FRAME_TYPE_LAST)) frame_type = META_FRAME_TYPE_NORMAL; *flags = 0; if (decor->actions & WNCK_WINDOW_ACTION_CLOSE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_DELETE; if (decor->actions & WNCK_WINDOW_ACTION_MINIMIZE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MINIMIZE; if (decor->actions & WNCK_WINDOW_ACTION_MAXIMIZE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MAXIMIZE; *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MENU; if (decor->actions & WNCK_WINDOW_ACTION_RESIZE) { if (!(decor->state & WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_VERTICAL_RESIZE; if (!(decor->state & WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY)) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_HORIZONTAL_RESIZE; } if (decor->actions & WNCK_WINDOW_ACTION_MOVE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MOVE; if (decor->actions & WNCK_WINDOW_ACTION_MAXIMIZE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MAXIMIZE; if (decor->actions & WNCK_WINDOW_ACTION_SHADE) *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_SHADE; if (decor->active) *flags |= (MetaFrameFlags ) META_FRAME_HAS_FOCUS; if ((decor->state & META_MAXIMIZED) == META_MAXIMIZED) *flags |= (MetaFrameFlags ) META_FRAME_MAXIMIZED; if (decor->state & WNCK_WINDOW_STATE_STICKY) *flags |= (MetaFrameFlags ) META_FRAME_STUCK; if (decor->state & WNCK_WINDOW_STATE_FULLSCREEN) *flags |= (MetaFrameFlags ) META_FRAME_FULLSCREEN; if (decor->state & WNCK_WINDOW_STATE_SHADED) *flags |= (MetaFrameFlags ) META_FRAME_SHADED; if (decor->state & WNCK_WINDOW_STATE_ABOVE) *flags |= (MetaFrameFlags ) META_FRAME_ABOVE; client_width = decor->border_layout.top.x2 - decor->border_layout.top.x1; client_width -= decor->context->right_space + decor->context->left_space; if (decor->border_layout.rotation) client_height = decor->border_layout.left.x2 - decor->border_layout.left.x1; else client_height = decor->border_layout.left.y2 - decor->border_layout.left.y1; meta_theme_calc_geometry (metacity->theme, decor->gtk_theme_variant, frame_type, *flags, client_width, client_height, fgeom); } static void calc_button_size (GWDTheme *theme, decor_t *decor) { MetaFrameType frame_type; MetaFrameFlags flags; MetaFrameGeometry fgeom; gint i, min_x, x, y, w, h, width; if (!decor->context) { decor->button_width = 0; return; } frame_type = frame_type_from_string (decor->frame->type); get_decoration_geometry (GWD_THEME_METACITY (theme), decor, &flags, &fgeom, frame_type); width = decor->border_layout.top.x2 - decor->border_layout.top.x1 - decor->context->left_space - decor->context->right_space + fgeom.borders.total.left + fgeom.borders.total.right; min_x = width; for (i = 0; i < 3; ++i) { static guint button_actions[3] = { WNCK_WINDOW_ACTION_CLOSE, WNCK_WINDOW_ACTION_MAXIMIZE, WNCK_WINDOW_ACTION_MINIMIZE }; if (decor->actions & button_actions[i]) { if (gwd_theme_get_button_position (theme, decor, i, width, 256, &x, &y, &w, &h)) { if (x > width / 2 && x < min_x) min_x = x; } } } decor->button_width = width - min_x; } static MetaButtonType button_type_to_meta_button_type (gint button_type) { switch (button_type) { case BUTTON_MENU: return META_BUTTON_TYPE_MENU; case BUTTON_MIN: return META_BUTTON_TYPE_MINIMIZE; case BUTTON_MAX: return META_BUTTON_TYPE_MAXIMIZE; case BUTTON_CLOSE: return META_BUTTON_TYPE_CLOSE; case BUTTON_SHADE: return META_BUTTON_TYPE_SHADE; case BUTTON_ABOVE: return META_BUTTON_TYPE_ABOVE; case BUTTON_STICK: return META_BUTTON_TYPE_STICK; case BUTTON_UNSHADE: return META_BUTTON_TYPE_UNSHADE; case BUTTON_UNABOVE: return META_BUTTON_TYPE_UNABOVE; case BUTTON_UNSTICK: return META_BUTTON_TYPE_UNSTICK; default: break; } return META_BUTTON_TYPE_LAST; } static gboolean setup_theme (GWDThemeMetacity *metacity) { GWDSettings *settings = gwd_theme_get_settings (GWD_THEME (metacity)); const gchar *metacity_theme_name = gwd_settings_get_metacity_theme_name (settings); gint metacity_theme_type = gwd_settings_get_metacity_theme_type (settings); GError *error = NULL; /* metacity_theme can be NULL only in one case - if user has disabled * metacity theme with use-metacity-theme setting. In that case * GWDThemeCairo will be created / should be created. */ g_assert (metacity_theme_name != NULL); if (metacity_theme_type == -1) metacity_theme_type = META_THEME_TYPE_METACITY; metacity->theme = meta_theme_new (metacity_theme_type); if (!meta_theme_load (metacity->theme, metacity_theme_name, &error)) { g_warning ("Failed to load metacity theme '%s': %s", metacity_theme_name, error->message); g_error_free (error); g_clear_object (&metacity->theme); return FALSE; } return TRUE; } static void setup_button_layout (GWDThemeMetacity *metacity) { GWDSettings *settings = gwd_theme_get_settings (GWD_THEME (metacity)); const gchar *button_layout = gwd_settings_get_metacity_button_layout (settings); metacity->button_layout_id = g_signal_connect (settings, "update-metacity-button-layout", G_CALLBACK (update_metacity_button_layout_cb), metacity); update_metacity_button_layout_cb (settings, button_layout, metacity); } static void gwd_theme_metacity_constructed (GObject *object) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (object); G_OBJECT_CLASS (gwd_theme_metacity_parent_class)->constructed (object); if (!setup_theme (metacity)) return; setup_button_layout (metacity); #ifdef HAVE_METACITY_3_26_0 meta_theme_set_scale (metacity->theme, gwd_theme_get_scale (GWD_THEME (object))); meta_theme_set_dpi (metacity->theme, gwd_theme_get_dpi (GWD_THEME (object))); #endif } static void gwd_theme_metacity_dispose (GObject *object) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (object); g_clear_object (&metacity->theme); if (metacity->button_layout_id != 0) { GWDSettings *settings = gwd_theme_get_settings (GWD_THEME (metacity)); g_signal_handler_disconnect (settings, metacity->button_layout_id); metacity->button_layout_id = 0; } G_OBJECT_CLASS (gwd_theme_metacity_parent_class)->dispose (object); } static void gwd_theme_metacity_dpi_changed (GWDTheme *theme) { #ifdef HAVE_METACITY_3_26_0 GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); meta_theme_set_dpi (metacity->theme, gwd_theme_get_dpi (theme)); #endif } static void gwd_theme_metacity_scale_changed (GWDTheme *theme) { #ifdef HAVE_METACITY_3_26_0 GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); meta_theme_set_scale (metacity->theme, gwd_theme_get_scale (theme)); #endif } static void gwd_theme_metacity_style_updated (GWDTheme *theme) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); meta_theme_invalidate (metacity->theme); } static void gwd_theme_metacity_draw_window_decoration (GWDTheme *theme, decor_t *decor) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); GWDSettings *settings = gwd_theme_get_settings (theme); GdkDisplay *display = gdk_display_get_default (); Display *xdisplay = gdk_x11_display_get_xdisplay (display); GtkWidget *style_window = gwd_theme_get_style_window (theme); cairo_surface_t *surface; Picture src; MetaFrameGeometry fgeom; MetaFrameFlags flags; MetaFrameType frame_type; cairo_t *cr; Region top_region; Region bottom_region; Region left_region; Region right_region; double alpha; gboolean shade_alpha; if (!decor->surface || !decor->picture) return; top_region = NULL; bottom_region = NULL; left_region = NULL; right_region = NULL; if (decor->active) { alpha = gwd_settings_get_metacity_active_opacity (settings); shade_alpha = gwd_settings_get_metacity_active_shade_opacity (settings); } else { alpha = gwd_settings_get_metacity_inactive_opacity (settings); shade_alpha = gwd_settings_get_metacity_inactive_shade_opacity (settings); } if (decoration_alpha == 1.0) alpha = 1.0; cr = cairo_create (decor->buffer_surface ? decor->buffer_surface : decor->surface); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); frame_type = frame_type_from_string (decor->frame->type); get_decoration_geometry (metacity, decor, &flags, &fgeom, frame_type); if (!decor->frame->has_shadow_extents && (decor->prop_xid || !decor->buffer_surface)) { draw_shadow_background (decor, cr, decor->shadow, decor->context); } /* Draw something that will be almost invisible to user. This is hacky way * to fix invisible decorations. */ cairo_set_source_rgba (cr, 0, 0, 0, 0.01); cairo_rectangle (cr, 0, 0, 1, 1); cairo_fill (cr); /* ------------ */ cairo_destroy (cr); surface = create_surface (fgeom.width, fgeom.height, style_window); cairo_surface_set_device_scale (surface, 1, 1); cr = cairo_create (surface); src = XRenderCreatePicture (xdisplay, cairo_xlib_surface_get_drawable (surface), xformat_rgba, 0, NULL); meta_theme_draw_frame (metacity->theme, decor->gtk_theme_variant, cr, frame_type, flags, fgeom.width - fgeom.borders.total.left - fgeom.borders.total.right, fgeom.height - fgeom.borders.total.top - fgeom.borders.total.bottom, decor->name, update_button_state, decor, decor->icon_pixbuf, NULL); if (fgeom.borders.visible.top + fgeom.borders.shadow.top) { top_region = get_top_border_region (&fgeom, !decor->frame->has_shadow_extents); decor_blend_border_picture (xdisplay, decor->context, src, fgeom.borders.invisible.left - fgeom.borders.shadow.left, fgeom.borders.invisible.top - fgeom.borders.shadow.top, decor->picture, &decor->border_layout, BORDER_TOP, top_region, alpha * 0xffff, shade_alpha, 0); } if (fgeom.borders.visible.bottom + fgeom.borders.shadow.bottom) { bottom_region = get_bottom_border_region (&fgeom, !decor->frame->has_shadow_extents); decor_blend_border_picture (xdisplay, decor->context, src, fgeom.borders.invisible.left - fgeom.borders.shadow.left, fgeom.height - fgeom.borders.total.bottom, decor->picture, &decor->border_layout, BORDER_BOTTOM, bottom_region, alpha * 0xffff, shade_alpha, 0); } if (fgeom.borders.visible.left + fgeom.borders.shadow.left) { left_region = get_left_border_region (&fgeom); decor_blend_border_picture (xdisplay, decor->context, src, fgeom.borders.invisible.left - fgeom.borders.shadow.left, fgeom.borders.total.top, decor->picture, &decor->border_layout, BORDER_LEFT, left_region, alpha * 0xffff, shade_alpha, 0); } if (fgeom.borders.visible.right + fgeom.borders.shadow.right) { right_region = get_right_border_region (&fgeom); decor_blend_border_picture (xdisplay, decor->context, src, fgeom.width - fgeom.borders.total.right, fgeom.borders.total.top, decor->picture, &decor->border_layout, BORDER_RIGHT, right_region, alpha * 0xffff, shade_alpha, 0); } cairo_destroy (cr); cairo_surface_destroy (surface); XRenderFreePicture (xdisplay, src); copy_to_front_buffer (decor); if (decor->prop_xid) { /* translate from frame to client window space */ if (top_region) XOffsetRegion (top_region, -fgeom.borders.total.left, -fgeom.borders.total.top); if (bottom_region) XOffsetRegion (bottom_region, -fgeom.borders.total.left, 0); if (left_region) XOffsetRegion (left_region, -fgeom.borders.total.left, 0); decor_update_meta_window_property (metacity, decor, flags, frame_type, top_region, bottom_region, left_region, right_region); decor->prop_xid = 0; } if (top_region) XDestroyRegion (top_region); if (bottom_region) XDestroyRegion (bottom_region); if (left_region) XDestroyRegion (left_region); if (right_region) XDestroyRegion (right_region); } static gboolean gwd_theme_metacity_calc_decoration_size (GWDTheme *theme, decor_t *decor, gint w, gint h, gint name_width, gint *width, gint *height) { decor_layout_t layout; decor_context_t *context; decor_shadow_t *shadow; if (!decor->decorated) return FALSE; if ((decor->state & META_MAXIMIZED) == META_MAXIMIZED) { if (decor->active) { context = &decor->frame->max_window_context_active; shadow = decor->frame->max_border_shadow_active; } else { context = &decor->frame->max_window_context_inactive; shadow = decor->frame->max_border_shadow_inactive; } } else { if (decor->active) { context = &decor->frame->window_context_active; shadow = decor->frame->border_shadow_active; } else { context = &decor->frame->window_context_inactive; shadow = decor->frame->border_shadow_inactive; } } decor_get_best_layout (context, w, h, &layout); if (context != decor->context || memcmp (&layout, &decor->border_layout, sizeof (layout))) { *width = layout.width; *height = layout.height; decor->border_layout = layout; decor->context = context; decor->shadow = shadow; calc_button_size (theme, decor); return TRUE; } return FALSE; } static void gwd_theme_metacity_update_border_extents (GWDTheme *theme, decor_frame_t *frame) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); GWDSettings *settings = gwd_theme_get_settings (theme); gint theme_type = gwd_settings_get_metacity_theme_type (settings); MetaFrameType frame_type = frame_type_from_string (frame->type); MetaFrameBorders borders; gwd_decor_frame_ref (frame); /* Shadow extents is used only with GTK+ theme */ frame->has_shadow_extents = theme_type == META_THEME_TYPE_GTK; meta_theme_get_frame_borders (metacity->theme, NULL, frame_type, 0, &borders); frame->win_extents.top = borders.visible.top; frame->win_extents.bottom = borders.visible.bottom; frame->win_extents.left = borders.visible.left; frame->win_extents.right = borders.visible.right; frame->shadow_extents.top = borders.shadow.top; frame->shadow_extents.bottom = borders.shadow.bottom; frame->shadow_extents.left = borders.shadow.left; frame->shadow_extents.right = borders.shadow.right; meta_theme_get_frame_borders (metacity->theme, NULL, frame_type, META_FRAME_MAXIMIZED, &borders); frame->max_win_extents.top = borders.visible.top; frame->max_win_extents.bottom = borders.visible.bottom; frame->max_win_extents.left = borders.visible.left; frame->max_win_extents.right = borders.visible.right; frame->max_shadow_extents.top = borders.shadow.top; frame->max_shadow_extents.bottom = borders.shadow.bottom; frame->max_shadow_extents.left = borders.shadow.left; frame->max_shadow_extents.right = borders.shadow.right; gwd_decor_frame_unref (frame); } static void gwd_theme_metacity_get_event_window_position (GWDTheme *theme, decor_t *decor, gint i, gint j, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); MetaFrameGeometry fgeom; MetaFrameFlags flags; GtkBorder visible; GtkBorder resize; GtkBorder total; gint top_border; get_decoration_geometry (metacity, decor, &flags, &fgeom, frame_type_from_string (decor->frame->type)); visible = fgeom.borders.visible; resize = fgeom.borders.resize; /* We can not use `fgeom->borders.total` border here - it includes also * `shadow` border, but it is not included in frame extents! Create new * `total` border that includes only `visible` border and `resize` border. */ total.left = visible.left + resize.left; total.right = visible.right + resize.right; total.top = visible.top + resize.top; total.bottom = visible.bottom + resize.bottom; width += total.left + total.right; height += total.top + total.bottom; top_border = fgeom.title_rect.y - fgeom.borders.invisible.top; #define TOP_RESIZE_HEIGHT 2 #define RESIZE_EXTENDS 15 switch (i) { case 2: /* bottom */ switch (j) { case 2: /* bottom right */ *x = width - total.right - RESIZE_EXTENDS; *y = height - total.bottom - RESIZE_EXTENDS; *w = total.right + RESIZE_EXTENDS; *h = total.bottom + RESIZE_EXTENDS; break; case 1: /* bottom */ *x = total.left + RESIZE_EXTENDS; *y = height - total.bottom; *w = width - total.left - total.right - (2 * RESIZE_EXTENDS); *h = total.bottom; break; case 0: /* bottom left */ default: *x = 0; *y = height - total.bottom - RESIZE_EXTENDS; *w = total.left + RESIZE_EXTENDS; *h = total.bottom + RESIZE_EXTENDS; break; } break; case 1: /* middle */ switch (j) { case 2: /* right */ *x = width - total.right; *y = resize.top + top_border + RESIZE_EXTENDS; *w = total.right; *h = height - resize.top - top_border - total.bottom - (2 * RESIZE_EXTENDS); break; case 1: /* middle */ *x = total.left; *y = resize.top + top_border + TOP_RESIZE_HEIGHT; *w = width - total.left - total.right; *h = visible.top - top_border - TOP_RESIZE_HEIGHT; break; case 0: /* left */ default: *x = 0; *y = resize.top + top_border + RESIZE_EXTENDS; *w = total.left; *h = height - resize.top - top_border - total.bottom - (2 * RESIZE_EXTENDS); break; } break; case 0: /* top */ default: switch (j) { case 2: /* top right */ *x = width - total.right - RESIZE_EXTENDS; *y = 0; *w = total.right + RESIZE_EXTENDS; *h = resize.top + top_border + RESIZE_EXTENDS; break; case 1: /* top */ *x = total.left + RESIZE_EXTENDS; *y = 0; *w = width - total.left - total.right - (2 * RESIZE_EXTENDS); *h = resize.top + top_border + TOP_RESIZE_HEIGHT; break; case 0: /* top left */ default: *x = 0; *y = 0; *w = total.left + RESIZE_EXTENDS; *h = resize.top + top_border + RESIZE_EXTENDS; break; } break; } if (!(flags & META_FRAME_ALLOWS_VERTICAL_RESIZE)) { /* turn off top and bottom event windows */ if (i == 0 || i == 2) *w = *h = 0; } if (!(flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE)) { /* turn off left and right event windows */ if (j == 0 || j == 2) *w = *h = 0; } #undef TOP_RESIZE_HEIGHT #undef RESIZE_EXTENDS } static gboolean gwd_theme_metacity_get_button_position (GWDTheme *theme, decor_t *decor, gint i, gint width, gint height, gint *x, gint *y, gint *w, gint *h) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); MetaFrameGeometry fgeom; MetaFrameType frame_type; MetaFrameFlags flags; if (!decor->context) { /* undecorated windows implicitly have no buttons */ return FALSE; } frame_type = frame_type_from_string (decor->frame->type); get_decoration_geometry (metacity, decor, &flags, &fgeom, frame_type); MetaButtonType button_type = button_type_to_meta_button_type (i); MetaButton **buttons = meta_theme_get_buttons (metacity->theme); for (gint index = 0; buttons[index]; index++) { if (meta_button_get_type (buttons[index]) == button_type) { GdkRectangle rect; meta_button_get_event_rect (buttons[index], &rect); if (rect.width != 0 && rect.height != 0) { *x = rect.x; *y = rect.y; *w = rect.width; *h = rect.height; *x = *x - fgeom.borders.invisible.left + fgeom.borders.resize.left; *y = *y - fgeom.borders.invisible.top + fgeom.borders.resize.top; g_free (buttons); return TRUE; } } } g_free (buttons); return FALSE; } static void gwd_theme_metacity_update_titlebar_font (GWDTheme *theme, const PangoFontDescription *titlebar_font) { GWDThemeMetacity *metacity = GWD_THEME_METACITY (theme); meta_theme_set_titlebar_font (metacity->theme, titlebar_font); } static void gwd_theme_metacity_class_init (GWDThemeMetacityClass *metacity_class) { GObjectClass *object_class = G_OBJECT_CLASS (metacity_class); GWDThemeClass *theme_class = GWD_THEME_CLASS (metacity_class); object_class->constructed = gwd_theme_metacity_constructed; object_class->dispose = gwd_theme_metacity_dispose; theme_class->dpi_changed = gwd_theme_metacity_dpi_changed; theme_class->scale_changed = gwd_theme_metacity_scale_changed; theme_class->style_updated = gwd_theme_metacity_style_updated; theme_class->draw_window_decoration = gwd_theme_metacity_draw_window_decoration; theme_class->calc_decoration_size = gwd_theme_metacity_calc_decoration_size; theme_class->update_border_extents = gwd_theme_metacity_update_border_extents; theme_class->get_event_window_position = gwd_theme_metacity_get_event_window_position; theme_class->get_button_position = gwd_theme_metacity_get_button_position; theme_class->update_titlebar_font = gwd_theme_metacity_update_titlebar_font; } static void gwd_theme_metacity_init (GWDThemeMetacity *metacity) { } /** * gwd_theme_metacity_new: * @settings: a #GWDSettings * * Creates a new #GWDTheme. If meta_theme_load will fail to load Metacity * theme then this function will return %NULL. In this case #GWDThemeCairo * must be used as fallback. * * This function MUST be used only in gwd_theme_new! * * Returns: (transfer full) (nullable): a newly created #GWDTheme, or %NULL */ GWDTheme * gwd_theme_metacity_new (GWDSettings *settings) { GWDThemeMetacity *metacity; metacity = g_object_new (GWD_TYPE_THEME_METACITY, "settings", settings, NULL); /* We failed to load Metacity theme */ if (metacity->theme == NULL) { g_object_unref (metacity); return NULL; } return GWD_THEME (metacity); } ./gtk/window-decorator/blurprops.c0000644000004100000410000000510113246301623017510 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman */ #include "gtk-window-decorator.h" #include "gwd-settings.h" void decor_update_blur_property (decor_t *d, int width, int height, Region top_region, int top_offset, Region bottom_region, int bottom_offset, Region left_region, int left_offset, Region right_region, int right_offset) { GWDSettings *settings = gwd_theme_get_settings (gwd_theme); gint blur_type = gwd_settings_get_blur_type (settings); Display *xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); long *data = NULL; int size = 0; if (blur_type != BLUR_TYPE_ALL) { bottom_region = NULL; left_region = NULL; right_region = NULL; if (blur_type != BLUR_TYPE_TITLEBAR) top_region = NULL; } if (top_region) size += top_region->numRects; if (bottom_region) size += bottom_region->numRects; if (left_region) size += left_region->numRects; if (right_region) size += right_region->numRects; if (size) data = (long *) malloc (sizeof (long) * (2 + size * 6)); if (data) { decor_region_to_blur_property (data, 4, 0, width, height, top_region, top_offset, bottom_region, bottom_offset, left_region, left_offset, right_region, right_offset); gdk_error_trap_push (); XChangeProperty (xdisplay, d->prop_xid, win_blur_decor_atom, XA_INTEGER, 32, PropModeReplace, (guchar *) data, 2 + size * 6); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); free (data); } else { gdk_error_trap_push (); XDeleteProperty (xdisplay, d->prop_xid, win_blur_decor_atom); gdk_display_sync (gdk_display_get_default ()); gdk_error_trap_pop_ignored (); } } ./gtk/window-decorator/gtk-window-decorator.h0000644000004100000410000003533513246301623021553 0ustar www-datawww-data/* * Copyright © 2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: David Reveman * * 2D Mode: Copyright © 2010 Sam Spilsbury * Frames Management: Copright © 2011 Canonical Ltd. * Authored By: Sam Spilsbury */ #ifndef _GTK_WINDOW_DECORATOR_H #define _GTK_WINDOW_DECORATOR_H #ifdef HAVE_CONFIG_H #include #endif #include "decoration.h" #include #include #include #include #include #include #include #include #define WNCK_I_KNOW_THIS_IS_UNSTABLE #include #include #include #include #include #include #include #include #include #include #include #include #include #define _(x) gettext (x) #define N_(x) x #include "gwd-theme.h" extern const unsigned short ICON_SPACE; #define META_MAXIMIZED (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | \ WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY) #define MWM_HINTS_DECORATIONS (1L << 1) #define MWM_DECOR_ALL (1L << 0) #define MWM_DECOR_BORDER (1L << 1) #define MWM_DECOR_HANDLE (1L << 2) #define MWM_DECOR_TITLE (1L << 3) #define MWM_DECOR_MENU (1L << 4) #define MWM_DECOR_MINIMIZE (1L << 5) #define MWM_DECOR_MAXIMIZE (1L << 6) #define PROP_MOTIF_WM_HINT_ELEMENTS 3 typedef struct { unsigned long flags; unsigned long functions; unsigned long decorations; } MwmHints; extern gboolean minimal; extern GWDTheme *gwd_theme; extern gdouble decoration_alpha; extern Atom frame_input_window_atom; extern Atom win_decor_atom; extern Atom win_blur_decor_atom; extern Atom wm_move_resize_atom; extern Atom restack_window_atom; extern Atom select_window_atom; extern Atom mwm_hints_atom; extern Atom switcher_fg_atom; extern Atom compiz_shadow_info_atom; extern Atom compiz_shadow_color_atom; extern Atom toolkit_action_atom; extern Atom toolkit_action_window_menu_atom; extern Atom toolkit_action_force_quit_dialog_atom; extern Atom net_wm_state_atom; extern Atom net_wm_state_modal_atom; extern Atom decor_request_atom; extern Atom decor_pending_atom; extern Atom decor_delete_pixmap_atom; extern Atom utf8_string_atom; extern Atom gtk_theme_variant_atom; extern Time dm_sn_timestamp; #define C(name) { 0, XC_ ## name } struct _cursor { Cursor cursor; unsigned int shape; }; extern struct _cursor cursor[3][3]; #define BUTTON_CLOSE 0 #define BUTTON_MAX 1 #define BUTTON_MIN 2 #define BUTTON_MENU 3 #define BUTTON_SHADE 4 #define BUTTON_ABOVE 5 #define BUTTON_STICK 6 #define BUTTON_UNSHADE 7 #define BUTTON_UNABOVE 8 #define BUTTON_UNSTICK 9 #define BUTTON_NUM 10 struct _pos { int x, y, w, h; int xw, yh, ww, hh, yth, hth; }; extern struct _pos pos[3][3], bpos[]; typedef struct _decor_color { double r; double g; double b; } decor_color_t; #define IN_EVENT_WINDOW (1 << 0) #define PRESSED_EVENT_WINDOW (1 << 1) typedef struct _decor_event { guint time; guint window; guint x; guint y; guint x_root; guint y_root; guint button; } decor_event; typedef enum _decor_event_type { GButtonPress = 1, GButtonRelease, GEnterNotify, GLeaveNotify, GMotionNotify } decor_event_type; typedef void (*event_callback) (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); typedef struct { Window window; Box pos; event_callback callback; } event_window; typedef struct _decor_frame decor_frame_t; typedef struct _decor_shadow_info decor_shadow_info_t; struct _decor_shadow_info { decor_frame_t *frame; unsigned int state; gboolean active; }; typedef void (*frame_update_shadow_proc) (Display *display, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); typedef decor_frame_t * (*create_frame_proc) (const gchar *); typedef void (*destroy_frame_proc) (decor_frame_t *); struct _decor_frame { decor_extents_t win_extents; decor_extents_t max_win_extents; decor_shadow_t *border_shadow_active; decor_shadow_t *border_shadow_inactive; decor_shadow_t *max_border_shadow_active; decor_shadow_t *max_border_shadow_inactive; decor_context_t window_context_active; decor_context_t window_context_inactive; decor_context_t max_window_context_active; decor_context_t max_window_context_inactive; PangoContext *pango_context; gint text_height; gchar *type; gboolean has_shadow_extents; decor_extents_t shadow_extents; decor_extents_t max_shadow_extents; frame_update_shadow_proc update_shadow; gint refcount; }; typedef struct _decor { WnckWindow *win; decor_frame_t *frame; event_window event_windows[3][3]; event_window button_windows[BUTTON_NUM]; guint button_states[BUTTON_NUM]; Pixmap x11Pixmap; cairo_surface_t *surface; cairo_surface_t *buffer_surface; cairo_t *cr; decor_layout_t border_layout; decor_context_t *context; decor_shadow_t *shadow; Picture picture; gint button_width; gint width; gint height; gint client_width; gint client_height; gboolean decorated; gboolean active; PangoLayout *layout; gchar *name; gchar *gtk_theme_variant; cairo_pattern_t *icon; cairo_surface_t *icon_surface; GdkPixbuf *icon_pixbuf; WnckWindowState state; WnckWindowActions actions; XID prop_xid; GtkWidget *force_quit_dialog; Bool created; void (*draw) (struct _decor *d); } decor_t; #define WINDOW_TYPE_FRAMES_NUM 5 typedef struct _default_frame_references { char *name; decor_t *d; } default_frame_references_t; extern default_frame_references_t default_frames[WINDOW_TYPE_FRAMES_NUM * 2]; const gchar * window_type_frames[WINDOW_TYPE_FRAMES_NUM]; extern char *program_name; /* list of all decorations */ extern GHashTable *frame_table; /* action menu */ extern GtkWidget *action_menu; extern gboolean action_menu_mapped; extern gint double_click_timeout; /* tooltip */ extern GtkWidget *tip_window; extern GtkWidget *tip_label; extern GTimeVal tooltip_last_popdown; extern gint tooltip_timer_tag; extern GSList *draw_list; extern guint draw_idle_id; /* switcher */ extern Window switcher_selected_window; extern GtkWidget *switcher_label; extern decor_t *switcher_window; extern XRenderPictFormat *xformat_rgba; /* frames.c */ void initialize_decorations (); decor_frame_t * gwd_get_decor_frame (const gchar *); decor_frame_t * gwd_decor_frame_ref (decor_frame_t *); decor_frame_t * gwd_decor_frame_unref (decor_frame_t *); void gwd_frames_foreach (GHFunc foreach_func, gpointer user_data); void gwd_process_frames (GHFunc foreach_func, const gchar *frame_keys[], gint frame_keys_num, gpointer user_data); decor_frame_t * decor_frame_new (const gchar *type); void decor_frame_destroy (decor_frame_t *); /* decorator.c */ void frame_update_shadow (decor_frame_t *frame, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); void frame_update_titlebar_font (decor_frame_t *frame); decor_frame_t * create_normal_frame (const gchar *type); void destroy_normal_frame (); decor_frame_t * create_bare_frame (const gchar *type); void destroy_bare_frame (); /* Don't use directly */ gboolean update_window_decoration_size (WnckWindow *win); gboolean request_update_window_decoration_size (WnckWindow *win); unsigned int populate_frame_type (decor_t *d); unsigned int populate_frame_state (decor_t *d); unsigned int populate_frame_actions (decor_t *d); void update_default_decorations (GdkScreen *screen); void update_window_decoration_state (WnckWindow *win); void update_window_decoration_actions (WnckWindow *win); void update_window_decoration_icon (WnckWindow *win); void update_event_windows (WnckWindow *win); int update_shadow (void); void update_window_decoration (WnckWindow *win); void queue_decor_draw (decor_t *d); void copy_to_front_buffer (decor_t *d); /* wnck.c*/ const gchar * get_frame_type (WnckWindow *win); void decorations_changed (WnckScreen *screen); void connect_screen (WnckScreen *screen); void window_closed (WnckScreen *screen, WnckWindow *window); void add_frame_window (WnckWindow *win, Window frame); void remove_frame_window (WnckWindow *win); void restack_window (WnckWindow *win, int stack_mode); /* blur.c */ void decor_update_blur_property (decor_t *d, int width, int height, Region top_region, int top_offset, Region bottom_region, int bottom_offset, Region left_region, int left_offset, Region right_region, int right_offset); /* cairo.c */ #define CORNER_TOPLEFT (1 << 0) #define CORNER_TOPRIGHT (1 << 1) #define CORNER_BOTTOMRIGHT (1 << 2) #define CORNER_BOTTOMLEFT (1 << 3) #define SHADE_LEFT (1 << 0) #define SHADE_RIGHT (1 << 1) #define SHADE_TOP (1 << 2) #define SHADE_BOTTOM (1 << 3) void draw_shadow_background (decor_t *d, cairo_t *cr, decor_shadow_t *s, decor_context_t *c); void fill_rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner, decor_color_t *c0, double alpha0, decor_color_t *c1, double alpha1, int gravity); void rounded_rectangle (cairo_t *cr, double x, double y, double w, double h, double radius, int corner); /* gdk.c */ cairo_surface_t * create_surface (int w, int h, GtkWidget *parent_style_window); cairo_surface_t * create_native_surface_and_wrap (int w, int h, GtkWidget *parent_style_window); /* switcher.c */ #define SWITCHER_ALPHA 0xa0a0 void switcher_frame_update_shadow (Display *xdisplay, Screen *screen, decor_frame_t *frame, decor_shadow_t **shadow_normal, decor_context_t *context_normal, decor_shadow_t **shadow_max, decor_context_t *context_max, decor_shadow_info_t *info, decor_shadow_options_t *opt_shadow, decor_shadow_options_t *opt_no_shadow); decor_frame_t * create_switcher_frame (const gchar *); void destroy_switcher_frame (); gboolean update_switcher_window (Window popup, Window selected); /* events.c */ void close_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void max_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void min_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void menu_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void shade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void above_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void stick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void unshade_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void unabove_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void unstick_button_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void title_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void top_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void top_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void top_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void bottom_left_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void bottom_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); void bottom_right_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type); GdkFilterReturn selection_event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data); GdkFilterReturn event_filter_func (GdkXEvent *gdkxevent, GdkEvent *event, gpointer data); /* tooltip.c */ gboolean create_tooltip_window (void); void handle_tooltip_event (WnckWindow *win, decor_event *gtkwd_event, decor_event_type gtkwd_type, guint state, const char *tip); /* forcequit.c */ void show_force_quit_dialog (WnckWindow *win, Time timestamp); void hide_force_quit_dialog (WnckWindow *win); /* actionmenu.c */ void action_menu_map (WnckWindow *win, long button, Time time); /* util.c */ gboolean get_window_prop (Window xwindow, Atom atom, Window *val); unsigned int get_mwm_prop (Window xwindow); gchar * get_gtk_theme_variant (Window xwindow); /* settings.c */ void init_settings (GWDSettings *settings); void fini_settings (); gboolean gwd_process_decor_shadow_property_update (); #endif ./gtk/window-decorator/gwd-settings.h0000644000004100000410000001717513246301623020122 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #ifndef GWD_SETTINGS_H #define GWD_SETTINGS_H #include #include G_BEGIN_DECLS enum { BLUR_TYPE_UNSET = -1, BLUR_TYPE_NONE = 0, BLUR_TYPE_TITLEBAR = 1, BLUR_TYPE_ALL = 2 }; enum { CLICK_ACTION_NONE, CLICK_ACTION_SHADE, CLICK_ACTION_MAXIMIZE, CLICK_ACTION_MINIMIZE, CLICK_ACTION_RAISE, CLICK_ACTION_LOWER, CLICK_ACTION_MENU }; enum { WHEEL_ACTION_NONE, WHEEL_ACTION_SHADE }; extern const gboolean USE_TOOLTIPS_DEFAULT; extern const gdouble ACTIVE_SHADOW_RADIUS_DEFAULT; extern const gdouble ACTIVE_SHADOW_OPACITY_DEFAULT; extern const gint ACTIVE_SHADOW_OFFSET_X_DEFAULT; extern const gint ACTIVE_SHADOW_OFFSET_Y_DEFAULT; extern const gchar *ACTIVE_SHADOW_COLOR_DEFAULT; extern const gdouble INACTIVE_SHADOW_RADIUS_DEFAULT; extern const gdouble INACTIVE_SHADOW_OPACITY_DEFAULT; extern const gint INACTIVE_SHADOW_OFFSET_X_DEFAULT; extern const gint INACTIVE_SHADOW_OFFSET_Y_DEFAULT; extern const gchar *INACTIVE_SHADOW_COLOR_DEFAULT; extern const gint BLUR_TYPE_DEFAULT; extern const gchar *METACITY_THEME_NAME_DEFAULT; extern const gint METACITY_THEME_TYPE_DEFAULT; extern const gdouble METACITY_ACTIVE_OPACITY_DEFAULT; extern const gdouble METACITY_INACTIVE_OPACITY_DEFAULT; extern const gboolean METACITY_ACTIVE_SHADE_OPACITY_DEFAULT; extern const gboolean METACITY_INACTIVE_SHADE_OPACITY_DEFAULT; extern const gchar *METACITY_BUTTON_LAYOUT_DEFAULT; extern const guint DOUBLE_CLICK_ACTION_DEFAULT; extern const guint MIDDLE_CLICK_ACTION_DEFAULT; extern const guint RIGHT_CLICK_ACTION_DEFAULT; extern const guint WHEEL_ACTION_DEFAULT; extern const gchar *TITLEBAR_FONT_DEFAULT; #define GWD_TYPE_SETTINGS gwd_settings_get_type () G_DECLARE_FINAL_TYPE (GWDSettings, gwd_settings, GWD, SETTINGS, GObject) GWDSettings * gwd_settings_new (gint blur_type, const gchar *metacity_theme_name); gint gwd_settings_get_blur_type (GWDSettings *settings); const gchar * gwd_settings_get_metacity_button_layout (GWDSettings *settings); const gchar * gwd_settings_get_metacity_theme_name (GWDSettings *settings); gint gwd_settings_get_metacity_theme_type (GWDSettings *settings); const gchar * gwd_settings_get_titlebar_font (GWDSettings *settings); decor_shadow_options_t gwd_settings_get_active_shadow (GWDSettings *settings); decor_shadow_options_t gwd_settings_get_inactive_shadow (GWDSettings *settings); gboolean gwd_settings_get_use_tooltips (GWDSettings *settings); gdouble gwd_settings_get_metacity_active_opacity (GWDSettings *settings); gdouble gwd_settings_get_metacity_inactive_opacity (GWDSettings *settings); gboolean gwd_settings_get_metacity_active_shade_opacity (GWDSettings *settings); gboolean gwd_settings_get_metacity_inactive_shade_opacity (GWDSettings *settings); gint gwd_settings_get_titlebar_double_click_action (GWDSettings *settings); gint gwd_settings_get_titlebar_middle_click_action (GWDSettings *settings); gint gwd_settings_get_titlebar_right_click_action (GWDSettings *settings); gint gwd_settings_get_mouse_wheel_action (GWDSettings *settings); void gwd_settings_freeze_updates (GWDSettings *settings); void gwd_settings_thaw_updates (GWDSettings *settings); gboolean gwd_settings_shadow_property_changed (GWDSettings *settings, gdouble active_shadow_radius, gdouble active_shadow_opacity, gdouble active_shadow_offset_x, gdouble active_shadow_offset_y, const gchar *active_shadow_color, gdouble inactive_shadow_radius, gdouble inactive_shadow_opacity, gdouble inactive_shadow_offset_x, gdouble inactive_shadow_offset_y, const gchar *inactive_shadow_color); gboolean gwd_settings_use_tooltips_changed (GWDSettings *settings, gboolean use_tooltips); gboolean gwd_settings_blur_changed (GWDSettings *settings, const gchar *blur_type); gboolean gwd_settings_metacity_theme_changed (GWDSettings *settings, gboolean use_metacity_theme, gint metacity_theme_type, const gchar *metacity_theme_name); gboolean gwd_settings_opacity_changed (GWDSettings *settings, gdouble active_opacity, gdouble inactive_opacity, gboolean active_shade_opacity, gboolean inactive_shade_opacity); gboolean gwd_settings_button_layout_changed (GWDSettings *settings, const gchar *button_layout); gboolean gwd_settings_font_changed (GWDSettings *settings, gboolean titlebar_uses_system_font, const gchar *titlebar_font); gboolean gwd_settings_titlebar_actions_changed (GWDSettings *settings, const gchar *action_double_click_titlebar, const gchar *action_middle_click_titlebar, const gchar *action_right_click_titlebar, const gchar *mouse_wheel_action); G_END_DECLS #endif ./gtk/window-decorator/gwd-theme-cairo.h0000644000004100000410000000203313246301623020442 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright (C) 2016 Alberts Muktupāvels * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GWD_THEME_CAIRO_H #define GWD_THEME_CAIRO_H #include "gwd-theme.h" G_BEGIN_DECLS #define GWD_TYPE_THEME_CAIRO gwd_theme_cairo_get_type () G_DECLARE_FINAL_TYPE (GWDThemeCairo, gwd_theme_cairo, GWD, THEME_CAIRO, GWDTheme) G_END_DECLS #endif ./gtk/window-decorator/gwd-settings-storage.c0000644000004100000410000005247213246301623021556 0ustar www-datawww-data/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 4 -*- */ /* * Copyright © 2012 Canonical Ltd * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authored By: Sam Spilsbury */ #include "config.h" #include #ifdef USE_METACITY #include #endif #include "gwd-settings.h" #include "gwd-settings-storage.h" static const gchar * ORG_COMPIZ_GWD = "org.compiz.gwd"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES = "org.gnome.desktop.wm.preferences"; static const gchar * ORG_GNOME_METACITY_THEME = "org.gnome.metacity.theme"; static const gchar * ORG_MATE_MARCO_GENERAL = "org.mate.Marco.general"; static const gchar * ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS = "use-tooltips"; static const gchar * ORG_COMPIZ_GWD_KEY_BLUR_TYPE = "blur-type"; static const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY = "metacity-theme-active-opacity"; static const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY = "metacity-theme-inactive-opacity"; static const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY = "metacity-theme-active-shade-opacity"; static const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY = "metacity-theme-inactive-shade-opacity"; static const gchar * ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME = "use-metacity-theme"; static const gchar * ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION = "mouse-wheel-action"; static const gchar * ORG_GNOME_METACITY_THEME_NAME = "name"; static const gchar * ORG_GNOME_METACITY_THEME_TYPE = "type"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR = "action-double-click-titlebar"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR = "action-middle-click-titlebar"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR = "action-right-click-titlebar"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME = "theme"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT = "titlebar-uses-system-font"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT = "titlebar-font"; static const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT = "button-layout"; static const gchar * ORG_MATE_MARCO_GENERAL_ACTION_DOUBLE_CLICK_TITLEBAR = "action-double-click-titlebar"; static const gchar * ORG_MATE_MARCO_GENERAL_ACTION_MIDDLE_CLICK_TITLEBAR = "action-middle-click-titlebar"; static const gchar * ORG_MATE_MARCO_GENERAL_ACTION_RIGHT_CLICK_TITLEBAR = "action-right-click-titlebar"; static const gchar * ORG_MATE_MARCO_GENERAL_THEME = "theme"; static const gchar * ORG_MATE_MARCO_GENERAL_TITLEBAR_USES_SYSTEM_FONT = "titlebar-uses-system-font"; static const gchar * ORG_MATE_MARCO_GENERAL_TITLEBAR_FONT = "titlebar-font"; static const gchar * ORG_MATE_MARCO_GENERAL_BUTTON_LAYOUT = "button-layout"; typedef enum { GWD_DESKTOP_GNOME, GWD_DESKTOP_GNOME_FLASHBACK, GWD_DESKTOP_MATE } GWDDesktop; struct _GWDSettingsStorage { GObject parent; GWDSettings *settings; GWDDesktop current_desktop; GSettings *gwd; GSettings *desktop; GSettings *metacity; GSettings *marco; gulong gtk_decoration_layout_id; gulong gtk_theme_name_id; }; enum { PROP_0, PROP_SETTINGS, LAST_PROP }; static GParamSpec *storage_properties[LAST_PROP] = { NULL }; G_DEFINE_TYPE (GWDSettingsStorage, gwd_settings_storage, G_TYPE_OBJECT) static gchar * button_layout_from_gtk_decoration_layout (const gchar *gtk_decoration_layout) { gchar **sides = g_strsplit (gtk_decoration_layout, ":", -1); gchar *button_layout; gint i; for (i = 0; sides[i]; i++) { gchar **buttons = g_strsplit (sides[i], ",", -1); gint j; for (j = 0; buttons[j]; j++) { const gchar *button = NULL; if (g_strcmp0 (buttons[j], "icon") == 0) button = "menu"; else if (g_strcmp0 (buttons[j], "menu") == 0) button = "appmenu"; if (button) { g_free (buttons[j]); buttons[j] = g_strdup (button); } } g_free (sides[i]); sides[i] = g_strjoinv (",", buttons); g_strfreev (buttons); } button_layout = g_strjoinv (":", sides); g_strfreev (sides); return button_layout; } static inline GSettings * get_settings_no_abort (const gchar *schema) { GSettingsSchemaSource *source = g_settings_schema_source_get_default (); GSettings *settings = NULL; if (g_settings_schema_source_lookup (source, schema, TRUE)) settings = g_settings_new (schema); return settings; } static void translate_dashes_to_underscores (gchar *original) { gint i = 0; for (i = 0; i < strlen (original); ++i) { if (original[i] == '-') original[i] = '_'; } } void update_use_tooltips (GWDSettingsStorage *storage) { gboolean use_tooltips; if (!storage->gwd) return; use_tooltips = g_settings_get_boolean (storage->gwd, ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS); gwd_settings_use_tooltips_changed (storage->settings, use_tooltips); } void update_blur (GWDSettingsStorage *storage) { gchar *blur_type; if (!storage->gwd) return; blur_type = g_settings_get_string (storage->gwd, ORG_COMPIZ_GWD_KEY_BLUR_TYPE); gwd_settings_blur_changed (storage->settings, blur_type); g_free (blur_type); } void update_metacity_theme (GWDSettingsStorage *storage) { #ifdef USE_METACITY gboolean use_metacity_theme; gint metacity_theme_type; gchar *metacity_theme_name; if (!storage->gwd) return; use_metacity_theme = g_settings_get_boolean (storage->gwd, ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME); metacity_theme_type = METACITY_THEME_TYPE_DEFAULT; if (storage->current_desktop == GWD_DESKTOP_MATE && storage->marco) { metacity_theme_name = g_settings_get_string (storage->marco, ORG_MATE_MARCO_GENERAL_THEME); } else if (storage->current_desktop == GWD_DESKTOP_GNOME_FLASHBACK && storage->metacity) { metacity_theme_type = g_settings_get_enum (storage->metacity, ORG_GNOME_METACITY_THEME_TYPE); if (metacity_theme_type == META_THEME_TYPE_GTK) { g_object_get (gtk_settings_get_default (), "gtk-theme-name", &metacity_theme_name, NULL); } else { metacity_theme_name = g_settings_get_string (storage->metacity, ORG_GNOME_METACITY_THEME_NAME); } } else if (storage->desktop) { metacity_theme_name = g_settings_get_string (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME); } else { return; } gwd_settings_metacity_theme_changed (storage->settings, use_metacity_theme, metacity_theme_type, metacity_theme_name); g_free (metacity_theme_name); #else gwd_settings_metacity_theme_changed (storage->settings, FALSE, METACITY_THEME_TYPE_DEFAULT, NULL); #endif } void update_opacity (GWDSettingsStorage *storage) { gdouble active; gdouble inactive; gboolean active_shade; gboolean inactive_shade; if (!storage->gwd) return; active = g_settings_get_double (storage->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY); inactive = g_settings_get_double (storage->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY); active_shade = g_settings_get_boolean (storage->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY); inactive_shade = g_settings_get_boolean (storage->gwd, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY); gwd_settings_opacity_changed (storage->settings, active, inactive, active_shade, inactive_shade); } void update_button_layout (GWDSettingsStorage *storage) { gchar *button_layout; if (storage->current_desktop == GWD_DESKTOP_MATE && storage->marco) { button_layout = g_settings_get_string (storage->marco, ORG_MATE_MARCO_GENERAL_BUTTON_LAYOUT); } else if (storage->current_desktop == GWD_DESKTOP_GNOME_FLASHBACK) { GtkSettings *settings = gtk_settings_get_default (); gchar *gtk_decoration_layout = NULL; g_object_get (settings, "gtk-decoration-layout", >k_decoration_layout, NULL); button_layout = button_layout_from_gtk_decoration_layout (gtk_decoration_layout); g_free (gtk_decoration_layout); } else if (storage->desktop) { button_layout = g_settings_get_string (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT); } else { return; } gwd_settings_button_layout_changed (storage->settings, button_layout); g_free (button_layout); } void update_font (GWDSettingsStorage *storage) { gboolean titlebar_system_font; gchar *titlebar_font; if (storage->current_desktop == GWD_DESKTOP_MATE && storage->marco) { titlebar_system_font = g_settings_get_boolean (storage->marco, ORG_MATE_MARCO_GENERAL_TITLEBAR_USES_SYSTEM_FONT); titlebar_font = g_settings_get_string (storage->marco, ORG_MATE_MARCO_GENERAL_TITLEBAR_FONT); } else if (storage->desktop) { titlebar_system_font = g_settings_get_boolean (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT); titlebar_font = g_settings_get_string (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT); } else { return; } gwd_settings_font_changed (storage->settings, titlebar_system_font, titlebar_font); g_free (titlebar_font); } void update_titlebar_actions (GWDSettingsStorage *storage) { gchar *double_click_action; gchar *middle_click_action; gchar *right_click_action; gchar *mouse_wheel_action; if (!storage->gwd) return; if (storage->current_desktop == GWD_DESKTOP_MATE && storage->marco) { double_click_action = g_settings_get_string (storage->marco, ORG_MATE_MARCO_GENERAL_ACTION_DOUBLE_CLICK_TITLEBAR); middle_click_action = g_settings_get_string (storage->marco, ORG_MATE_MARCO_GENERAL_ACTION_MIDDLE_CLICK_TITLEBAR); right_click_action = g_settings_get_string (storage->marco, ORG_MATE_MARCO_GENERAL_ACTION_RIGHT_CLICK_TITLEBAR); } else if (storage->desktop) { double_click_action = g_settings_get_string (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR); middle_click_action = g_settings_get_string (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR); right_click_action = g_settings_get_string (storage->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR); } else { return; } translate_dashes_to_underscores (double_click_action); translate_dashes_to_underscores (middle_click_action); translate_dashes_to_underscores (right_click_action); mouse_wheel_action = g_settings_get_string (storage->gwd, ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION); gwd_settings_titlebar_actions_changed (storage->settings, double_click_action, middle_click_action, right_click_action, mouse_wheel_action); g_free (double_click_action); g_free (middle_click_action); g_free (right_click_action); g_free (mouse_wheel_action); } static void org_compiz_gwd_settings_changed (GSettings *settings, const gchar *key, GWDSettingsStorage *storage) { if (strcmp (key, ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION) == 0) update_titlebar_actions (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_BLUR_TYPE) == 0) update_blur (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME) == 0) update_metacity_theme (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_OPACITY) == 0 || strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY) == 0 || strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_OPACITY) == 0 || strcmp (key, ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY) == 0) update_opacity (storage); else if (strcmp (key, ORG_COMPIZ_GWD_KEY_USE_TOOLTIPS) == 0) update_use_tooltips (storage); } static void org_gnome_desktop_wm_preferences_settings_changed (GSettings *settings, const gchar *key, GWDSettingsStorage *storage) { if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_USES_SYSTEM_FONT) == 0 || strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT) == 0) update_font (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_TITLEBAR_FONT) == 0) update_font (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR) == 0 || strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR) == 0 || strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR) == 0) update_titlebar_actions (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME) == 0) update_metacity_theme (storage); else if (strcmp (key, ORG_GNOME_DESKTOP_WM_PREFERENCES_BUTTON_LAYOUT) == 0) update_button_layout (storage); } static void org_gnome_metacity_settings_changed (GSettings *settings, const gchar *key, GWDSettingsStorage *storage) { if (strcmp (key, ORG_GNOME_METACITY_THEME_NAME) == 0 || strcmp (key, ORG_GNOME_METACITY_THEME_TYPE) == 0) update_metacity_theme (storage); } static void org_mate_marco_general_settings_changed (GSettings *settings, const gchar *key, GWDSettingsStorage *storage) { if (strcmp (key, ORG_MATE_MARCO_GENERAL_TITLEBAR_USES_SYSTEM_FONT) == 0 || strcmp (key, ORG_MATE_MARCO_GENERAL_TITLEBAR_FONT) == 0) update_font (storage); else if (strcmp (key, ORG_MATE_MARCO_GENERAL_TITLEBAR_FONT) == 0) update_font (storage); else if (strcmp (key, ORG_MATE_MARCO_GENERAL_ACTION_DOUBLE_CLICK_TITLEBAR) == 0 || strcmp (key, ORG_MATE_MARCO_GENERAL_ACTION_MIDDLE_CLICK_TITLEBAR) == 0 || strcmp (key, ORG_MATE_MARCO_GENERAL_ACTION_RIGHT_CLICK_TITLEBAR) == 0) update_titlebar_actions (storage); else if (strcmp (key, ORG_MATE_MARCO_GENERAL_THEME) == 0) update_metacity_theme (storage); else if (strcmp (key, ORG_MATE_MARCO_GENERAL_BUTTON_LAYOUT) == 0) update_button_layout (storage); } static void gtk_decoration_layout_changed (GtkSettings *settings, GParamSpec *pspec, GWDSettingsStorage *storage) { update_button_layout (storage); } static void gtk_theme_name_changed (GtkSettings *settings, GParamSpec *pspec, GWDSettingsStorage *storage) { #ifdef USE_METACITY MetaThemeType type; if (!storage->metacity) return; type = g_settings_get_enum (storage->metacity, ORG_GNOME_METACITY_THEME_TYPE); if (type == META_THEME_TYPE_GTK) update_metacity_theme (storage); #endif } static void gwd_settings_storage_constructed (GObject *object) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE (object); G_OBJECT_CLASS (gwd_settings_storage_parent_class)->constructed (object); if (storage->gwd) { g_signal_connect (storage->gwd, "changed", G_CALLBACK (org_compiz_gwd_settings_changed), storage); } if (storage->desktop) { g_signal_connect (storage->desktop, "changed", G_CALLBACK (org_gnome_desktop_wm_preferences_settings_changed), storage); } if (storage->metacity) { g_signal_connect (storage->metacity, "changed", G_CALLBACK (org_gnome_metacity_settings_changed), storage); } if (storage->marco) { g_signal_connect (storage->marco, "changed", G_CALLBACK (org_mate_marco_general_settings_changed), storage); } update_metacity_theme (storage); update_opacity (storage); update_button_layout (storage); update_font (storage); update_titlebar_actions (storage); update_blur (storage); update_use_tooltips (storage); } static void gwd_settings_storage_dispose (GObject *object) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE (object); GtkSettings *settings = gtk_settings_get_default (); g_clear_object (&storage->settings); g_clear_object (&storage->gwd); g_clear_object (&storage->desktop); g_clear_object (&storage->metacity); g_clear_object (&storage->marco); if (storage->gtk_decoration_layout_id > 0) { g_signal_handler_disconnect (settings, storage->gtk_decoration_layout_id); storage->gtk_decoration_layout_id = 0; } if (storage->gtk_theme_name_id > 0) { g_signal_handler_disconnect (settings, storage->gtk_theme_name_id); storage->gtk_theme_name_id = 0; } G_OBJECT_CLASS (gwd_settings_storage_parent_class)->dispose (object); } static void gwd_settings_storage_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GWDSettingsStorage *storage = GWD_SETTINGS_STORAGE (object); switch (property_id) { case PROP_SETTINGS: storage->settings = g_value_dup_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gwd_settings_storage_class_init (GWDSettingsStorageClass *storage_class) { GObjectClass *object_class = G_OBJECT_CLASS (storage_class); object_class->constructed = gwd_settings_storage_constructed; object_class->dispose = gwd_settings_storage_dispose; object_class->set_property = gwd_settings_storage_set_property; storage_properties[PROP_SETTINGS] = g_param_spec_object ("settings", "GWDSettings", "GWDSettings", GWD_TYPE_SETTINGS, G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, LAST_PROP, storage_properties); } void gwd_settings_storage_init (GWDSettingsStorage *storage) { const gchar *xdg_current_desktop = g_getenv ("XDG_CURRENT_DESKTOP"); storage->current_desktop = GWD_DESKTOP_GNOME; if (xdg_current_desktop != NULL) { gchar **desktops = g_strsplit (xdg_current_desktop, ":", -1); gint i; for (i = 0; desktops[i] != NULL; i++) { if (g_strcmp0 (desktops[i], "GNOME-Flashback") == 0) { storage->current_desktop = GWD_DESKTOP_GNOME_FLASHBACK; break; } else if (g_strcmp0 (desktops[i], "MATE") == 0) { storage->current_desktop = GWD_DESKTOP_MATE; break; } } g_strfreev (desktops); } switch (storage->current_desktop) { case GWD_DESKTOP_GNOME_FLASHBACK: storage->gwd = get_settings_no_abort (ORG_COMPIZ_GWD); storage->desktop = get_settings_no_abort (ORG_GNOME_DESKTOP_WM_PREFERENCES); storage->metacity = get_settings_no_abort (ORG_GNOME_METACITY_THEME); storage->gtk_decoration_layout_id = g_signal_connect (gtk_settings_get_default (), "notify::gtk-decoration-layout", G_CALLBACK (gtk_decoration_layout_changed), storage); storage->gtk_theme_name_id = g_signal_connect (gtk_settings_get_default (), "notify::gtk-theme-name", G_CALLBACK (gtk_theme_name_changed), storage); break; case GWD_DESKTOP_MATE: storage->gwd = get_settings_no_abort (ORG_COMPIZ_GWD); storage->marco = get_settings_no_abort (ORG_MATE_MARCO_GENERAL); break; case GWD_DESKTOP_GNOME: default: storage->gwd = get_settings_no_abort (ORG_COMPIZ_GWD); storage->desktop = get_settings_no_abort (ORG_GNOME_DESKTOP_WM_PREFERENCES); break; } } GWDSettingsStorage * gwd_settings_storage_new (GWDSettings *settings) { return g_object_new (GWD_TYPE_SETTINGS_STORAGE, "settings", settings, NULL); } ./Doxyfile0000644000004100000410000017363313246301623012766 0ustar www-datawww-data# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Compiz # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.9 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = NO # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = include/ src/ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = private* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = _* *Private* *Wrap* # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = _,Private #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = YES # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = NO # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES ./contribute/0000755000004100000410000000000013246301624013422 5ustar www-datawww-data./contribute/QtCreatorConfig.xml0000644000004100000410000000361113246301623017176 0ustar www-datawww-data CodeStyleData true false true false false false false true true false false false true true false true false false false 4 true true 2 false 8 DisplayName X11 ./ChangeLog0000644000004100000410000203312713246301623013025 0ustar www-datawww-dataMerge: 86bbd39 a7f5dbb Sam Spilsbury 2011-08-20 Merge upstream Sam Spilsbury 2011-08-20 Bump VERSION to reflect temporary release Sam Spilsbury 2011-08-20 Fix stray .reset () Merge: 1be316e 126f2a2 Sam Spilsbury 2011-08-20 Merge upstream Merge: 1852f86 1852f86 Sam Spilsbury 2011-08-20 Merge upstream Sam Spilsbury 2011-08-20 Bump VERSION Sam Spilsbury 2011-08-20 Update NEWS for 0.9.5.92 Merge: 8495379 825d16b Sam Spilsbury 2011-08-19 Merge upstream Merge: 825d16b c9b0a19 Sam Spilsbury 2011-08-19 Merge in lp:~compiz-team/compiz-core/compiz-core.add_doc_for_decor Merge: 41f088c c12c848 Sam Spilsbury 2011-08-19 Merge lp:~compiz-team/compiz-core/compiz-core.distortion_fixes Merge: b0a1b5e 3504586 Tim Penhey 2011-08-19 Merge lp:~thumper/compiz-core/fix-crash-on-event-source-cleanup Sam Spilsbury 2011-08-19 Fix some other places we were using priv->attrib incorrectly Sam Spilsbury 2011-08-19 Added comment explaining why we can't do that Merge: 01d92ab b0a1b5e Sam Spilsbury 2011-08-19 Merge trunk Tim Penhey 2011-08-19 Don't have a wrapped CompEventSource as there is a bug in the destruction code. Tim Penhey 2011-08-19 Explicit constructors only make a difference when there is the ability to pass in a single argument. Tim Penhey 2011-08-19 Header now says to create an unwrapped event source. Tim Penhey 2011-08-19 Create an unwrapped CompEventSource. Merge: ab71bc8 9f4cdd6 Sam Spilsbury 2011-08-19 Merge Merge: 9f4cdd6 a8d1bcd Sam Spilsbury 2011-08-19 Merge in ICCCM 4.1.4 support Sam Spilsbury 2011-08-18 Correctly support ICCCM Section 4.1.4 Sam Spilsbury 2011-08-13 Don't damage the paint rectangle in normal resize mode (fixed valgrind warning) Sam Spilsbury 2011-08-13 Use priv->geometry rather than priv->attrib, since priv->attrib could be updated by XGetWindowAttributes which is a synchronous operation Sam Spilsbury 2011-08-13 Don't check against the XWindowAttributes that are stored when sending resize notfications, since they could have been updated synchronously with XGetWindowAttributes and could be out of sync with the geometry last received from the server which is what we need to process requests based on. Fixes cases where plugins didn't get that geometry update because of this condition, which caused bugs like distorted windows in opengl since the window matrices were wrong Sam Spilsbury 2011-08-12 memset the active window history so that we aren't jumping on unitialized garbage in the array of windows Time Penhey 2011-08-12 Merge in flags change for dlopen () on debug builds (dlclosing () with valgrind is a bit useless) Time Penhey 2011-08-12 Merge in source reset change Merge: 28cab1d e6cb461 Sam Spilsbury 2011-08-12 Merge in GSettings CMake file change Sam Spilsbury 2011-08-10 Disable core-settings-schema too Sam Spilsbury 2011-08-10 Add option to disable GSettings schema generation Ville Syrjala 2011-08-02 [PATCH] Don't unredirect overlay windows until we have set the new bounding shape for the output window. Unredirecting them before this time meant that they were stacked underneath the overlay window and changing the bounding shape of the output window would cause an expose event to be sent to the overlay window causing a breif flicker as it redraws. Unredirecting after this means that no expose event is sent because the backing store is only set again after the bounding shape of the output window has been changed Merge: ceab806 f2b2dc4 Sam Spilsbury 2011-07-29 Merge trunk Merge: f2b2dc4 c9b0a19 Sam Spilsbury 2011-07-29 Merge in doc for decor Merge: 7347a7c 3bdb2ef Andrea Azzarone 2011-07-28 Merge in lp:~andyrock/compiz-core/fix-1309 Andrea Azzarone 2011-07-27 If an argument to a strcmp function has an invalid value (null pointer, etc.) the behavior is undefined. Merge: 3264985 4217940 Sam Spilsbury 2011-07-27 Merge Merge: a44844f 4bb1f70 Sam Spilsbury 2011-07-27 Merge in gsettings schema generation Sam Spilsbury 2011-07-26 Use relocatable keys Sam Spilsbury 2011-07-26 Merge in gsettings schema generation Scott Moreau 2011-07-14 Merge in default value change for obs Sam Spilsbury 2011-07-14 Fix typo, also add files that are being copied into staging Sam Spilsbury 2011-07-14 Bump VERSION Sam Spilsbury 2011-07-14 Update NEWS for 0.9.5.0 Sam Spilsbury 2011-07-14 Revert "Update NEWS for 0.9.5.0" This reverts commit a6e2ea3adf61e57bdcd4c5c957ce8e7223a9fb0b. Sam Spilsbury 2011-07-14 Revert "Bump VERSION" This reverts commit bedeff5d74a2786dd2751fab9e48bf3f96b7790e. Sam Spilsbury 2011-07-14 Revert "Update NEWS for 0.9.5.0" This reverts commit f37eda58232743ce28eb780075c1a4b73545a209. Merge: 2804807 bedeff5 Sam Spilsbury 2011-07-14 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-07-14 Bump VERSION Sam Spilsbury 2011-07-14 Update NEWS for 0.9.5.0 Sam Spilsbury 2011-07-14 Bump VERSION Sam Spilsbury 2011-07-14 Update NEWS for 0.9.5.0 Sam Spilsbury 2011-07-14 Merge in build fix and debug message removal Sam Spilsbury 2011-07-14 Fix for bad merge, unbreak plugin build Sam Spilsbury 2011-07-14 Merge in build changes Sam Spilsbury 2011-07-13 Disable BUILD_KDE4 in the distcheck target for now as upstream KDE has moved some header files around and this is breaking the build check Sam Spilsbury 2011-07-08 Merge in fix to ftbfs in some cases Merge: ee98496 e43159f Sam Spilsbury 2011-07-08 Merge in lp:~smspillaz/compiz-core/compiz-core.dist-buildsystem and turn CTest on by default for everything Sam Spilsbury 2011-07-08 Nitpicking and fix FTBFS on bzr Sam Spilsbury 2011-07-08 Drop support for bz2, add targets for release uploads, cleanup Sam Spilsbury 2011-07-07 Add various fixes for distcheck, source distributions without a VCS and non-C sources (eg python bindings where we can't do try_compile because C and CXX are not in the enabled languages) Sam Spilsbury 2011-07-07 Add a proper set of a release targets in the CMake buildsystem for all compiz projects to use make release-prep: generates NEWS ChangeLog and AUTHORS file make distcheck: generates a tarball make release-signoff: signs the tarball using the key in RELEASE_KEY and if in a git repository, creates tags and branches for that Sam Spilsbury 2011-07-07 Add VERSION file Merge: 0550e09 b9d6583 Sam Spilsbury 2011-07-07 Merge in lp:~unity-team/compiz-core/compiz-core.fix_706918 and hook PluginClassHandler tests into make test Merge: a1268e2 7844ea3 Sam Spilsbury 2011-07-07 Merge in lp:~unity-team/compiz-core/compiz-core.fix_722830 Merge: f914d15 ab21ddc Sam Spilsbury 2011-07-07 Merge in lp:~unity-team/compiz-core/compiz-core.fix_802373 Merge: faf527f 82a73b8 Sam Spilsbury 2011-07-07 Merge in lp:~smpillaz/compiz-core/compiz-core.fix_804683 Sam Spilsbury 2011-07-07 Remove debugging code Sam Spilsbury 2011-07-07 Move timer tests into tests/timer/ Sam Spilsbury 2011-07-07 Revamp the unit tests, split into four separate tests, one for implicit creation on get, one for construction, one for type names and one for index sanity checking Sam Spilsbury 2011-07-07 Initialize index even if allocating the plugin class failed due to a buggy base class Sam Spilsbury 2011-07-06 Add missing files Sam Spilsbury 2011-07-06 Remove useless #warning Sam Spilsbury 2011-07-06 Split tests up into files, poke timer.cpp, make test-timer link to the tests and enable CTest Sam Spilsbury 2011-07-06 Add missing file Sam Spilsbury 2011-07-05 Test for basic value modification Sam Spilsbury 2011-07-05 Return 1 on the program if the test fails Sam Spilsbury 2011-07-05 Add more tests for timers Sam Spilsbury 2011-07-05 Add unit tests for timers Sam Spilsbury 2011-07-05 Break the dependency between CompTimeoutSource and CompTimer Sam Spilsbury 2011-07-05 Use a private implementation for CompTimer Sam Spilsbury 2011-07-05 Further break the dependency of timers on screen Sam Spilsbury 2011-07-04 Break CompTimer's dependency on CompScreen Sam Spilsbury 2011-07-04 Avoid useless calls to ::stop (). Also put ::get_time after ::attach because the source must always be attached before the monotonic time can be retreived Sam Spilsbury 2011-07-04 Don't use clock_getttime () directly, as there are some cases where that clock can run backwards and cause our timers to mess up. GLib handles this case for us, use Glib::Source::get_time in that case Sam Spilsbury 2011-06-29 Added a distcheck target Sam Spilsbury 2011-06-29 Add a more comprehensive dist target which detects running in bzr, git, git with submodules and in no vcs and makes a tarball no matter what and the right way Sam Spilsbury 2011-06-27 Convert to bell option Sam Spilsbury 2011-06-25 Added PluginClassHandler test Sam Spilsbury 2011-06-25 Abstract out CompPrivate storage from CompScreen so we can make it testable Sam Spilsbury 2011-06-24 Use priv->border instead of priv->input as the EWMH says that applications which request to move their windows (through a normal ConfigureRequest) should take into account the decoration extents and not the border extents. Fixes LP#722830 Merge: d0f83cc 4d0f3bb Sam Spilsbury 2011-06-23 Merge in fix for LP#800592 Sam Spilsbury 2011-06-23 Fix double call to ::updateAttributes where raise on click is enabled and grabbing a window to move it would also raise the window Sam Spilsbury 2011-06-23 Fix warnings Sam Spilsbury 2011-06-23 Fix typo which caused docks to be stacked relative to override redirect windows and unmapped windows or other docks when shuffling stacking to be below fullscreen windows that are active Sam Spilsbury 2011-06-18 Add documentation for the decor plugin Merge: 291627c 40849c0 Sam Spilsbury 2011-06-18 Merge in fix for bad merge Sam Spilsbury 2011-06-18 Fix typo which caused decorations to be updated recursively because CompWindow::resize () would always send fake resize notify events to core which would then cause CompWindow::resize () to be called again with no geometry change etc etc Sam Spilsbury 2011-06-17 Refactor the code somewhat Sam Spilsbury 2011-06-17 Make ::get () return a new class instance and initialize the index if it hasn't been done already for this particular kind of class. Fixes LP#706918 Sam Spilsbury 2011-06-16 Fix typo which caused decorations to be updated recursively because CompWindow::resize () would always send fake resize notify events to core which would then cause CompWindow::resize () to be called again with no geometry change etc etc Merge: 6fc939d 9dfc108 Sam Spilsbury 2011-06-09 Fixes LP#795065 ------------- This line and the following will be ignored -------------- modified: src/window.cpp unknown: build/ po/compiz.pot pending merges: Sam Spilsbury 2011-05-25 Fix events going to frame windows when they sho... Merge: 9e6c11d a282aba Sam Spilsbury 2011-06-09 Fixes LP#761616 ------------ This line and the following will be ignored -------------- modified: src/screen.cpp src/window.cpp unknown: build/ po/compiz.pot pending merges: Sam Spilsbury 2011-05-25 Restore selected event masks already rather tha... Merge: 79fe2cd 08828ed Sam Spilsbury 2011-06-09 Merge in lp:~unity-team/compiz-core/compiz-core.one_property_decor Merge: 901d4a1 c6291da Sam Spilsbury 2011-06-09 Merge in ~unity-team/compiz-core/compiz-core.bits_and_pieces_2011_05_21 Merge: 2e57966 0545c16 Sam Spilsbury 2011-06-09 Merge in dock stacking fix Merge: 67e833c 32affe0 Sam Spilsbury 2011-06-09 Merge in emacs fix Merge: c6f456e a02b427 Sam Spilsbury 2011-06-09 Merge in Scott's change from upstream Merge: f3a1776 f3a1776 Sam Spilsbury 2011-06-09 Merge in relevant branches Scott Moreau 2011-05-27 Redetect devices unconditionally when handling ConfigureNotify event. This fixes the case where an output was moved but outputChangeNotify is not called. Merge: 2550d7e e6afcfd Sam Spilsbury 2011-06-01 Merge in bell fix Sam Spilsbury 2011-06-01 Fix typo in initBellValue which stopped bell actions from working Merge: 17a6530 b4d9e29 Sam Spilsbury 2011-05-31 Merge in from lp:compiz-core Merge: 763acbb 6e4da8c Sam Spilsbury 2011-05-31 Merge in frame fix for switcher decorations Merge: b4d9e29 a9ac70d Sam Spilsbury 2011-05-31 Merge to fix broken copytex plugin Merge: 698db76 dd8ec2a Sam Spilsbury 2011-05-31 Fix some tray icons appearing at 1px, check the override redirect state and window parent at unreparent and reparent time. Merge: a39f7e3 a39f7e3 Sam Spilsbury 2011-05-31 Merge Sam Spilsbury 2011-05-31 Fix crash with copytex. Use shared_ptr Sam Spilsbury 2011-05-30 Ensure the switcher window is unmapped after the switcher goes away Sam Spilsbury 2011-05-30 Fix windows appearing at small sizes Sam Spilsbury 2011-05-28 Fix typo in comment Sam Spilsbury 2011-05-28 Typo Sam Spilsbury 2011-05-28 Read the current override redirect state as the client may have changed it while CreateNotify is being processed and thus we could be reparenting and override redirect window. Also ensure that when unreparenting windows that their parent is still the wrapper window, otherwise don't bother to reparent them back into the root window, this will only cause trouble. Fixes LP#767095 Sam Spilsbury 2011-05-26 XSync right after configureXWindow in cases where we need to immediately reorder the window stack. This isn't a real fix, but at least fixes the following situation without breaking the API and ABI Windows stacked A, B, C Plugin does: C->raise (), B->raise (), A->raise () Window list should read at this point: ... C, B, A ... (screen->windows ()) However, the output buffer hasn't been flushed at this point so server side we will have A, B, C. Now if a sneaky client tries to restack A above C, we will get the ConfigureRequest for that, and instead of getting B, C, A like the client expects, we'll actually get C, B, A. The real solution is to have a list of windows last sent to the server and a list of windows last recieved by it. That way plugins can mess with the internal stack all they want, but when recieving events for X as to the actual state of things, they can restack relative to the server list. Sam Spilsbury 2011-05-25 Fix events going to frame windows when they shouldn't since the client is already unmapped and there is no reason a huge frame window should block input when the client is animating out anyways Sam Spilsbury 2011-05-25 Restore selected event masks already rather than using hardcoded ones Fixes LP #761616 where edge buttons wouldn't work because we'd select for button events and then they wouldn't get restored at all Merge: 342ad2f 3ea8ae7 Sam Spilsbury 2011-05-20 Merge git://git.compiz.org/compiz/core Scott Moreau 2011-05-17 Use CMAKE_PREFIX_PATH when searching for libraries. Scott Moreau 2011-05-13 * Bump version to 0.9.5 Sam Spilsbury 2011-05-08 Add hack to allow the KDE4 Window decorator to work correctly with the new decoration interface, until KDE4 Window decorator is re-written to allow for decoration lists. Note that this gives public access to KWD::Decorator, which is a bad thing. The way this works is to create two separate frames for inactive and active decoration, and when one property is written to update the other. Sam Spilsbury 2011-05-08 Remove setting of "_COMPIZ_WINDOW_DECOR_NORMAL" put decorations with state == ~DECOR_WINDOW_FOCUS in the default decorations list instead Sam Spilsbury 2011-05-08 Remove DECOR_NORMAL, just read all default decorations from a property and match the state Sam Spilsbury 2011-05-08 Remove DECOR_NORMAL_ATOM_NAME, the API is now to put all default decorations in a list in one property Scott Moreau 2011-05-06 Respect CMAKE_PREFIX_PATH and CMAKE_INCLUDE_PATH when searching for headers. Sam Spilsbury 2011-05-08 Place relative to frame size Sam Spilsbury 2011-05-08 Fix variable mismatch Sam Spilsbury 2011-05-08 Use bitwise or, not and. Sam Spilsbury 2011-05-07 Clean up type detection code, move into its own function Sam Spilsbury 2011-05-07 Check the actual decor properties on the window and not the default ones Sam Spilsbury 2011-05-07 Support -std=c++0x Sam Spilsbury 2011-05-07 Support new decoration API Sam Spilsbury 2011-05-07 Support different frame types, states and actions in frame properties Sam Spilsbury 2011-05-07 Support multiple frames and frames of different types, states, etc in the decor plugin Sam Spilsbury 2011-05-07 Bump decoration API Sam Spilsbury 2011-05-07 Update API to allow multiple frames in one property (frame caching, multiple default frame styles) and also to allow decorators to specify in the frame property which window types, states and actions the frames should apply to Sam Spilsbury 2011-05-04 Add modal dialog type and also fix typo Sam Spilsbury 2011-05-04 Fix warning Sam Spilsbury 2011-05-04 Restack docks primarily when the focus changes to support cases where we change viewports and dock windows need to be restacked even though the window that we switched to wasn't restacked. Also support always-on-top and fullscreen windows. Sam Spilsbury 2011-05-03 Send a fake configure notify event when the window size doesn't change on frame update since other plugins need to know when the client window changed geometry. Scott Moreau 2011-04-30 Add resize_from_center option. Scott Moreau 2011-04-30 Cleanup resize options. Sam Spilsbury 2011-05-01 Fix stupid porting bug that allowed windows like emacs to resize themselves off the edge of the screen Sam Spilsbury 2011-04-30 Use premultiplied alpha in resize outline and border Sam Spilsbury 2011-04-30 Check if ancestor to transient is allowed to have focus before granting focus to it. Some stupid apps like thunderbird unmap the transient parent before unmapping the child, so compiz will get all confused and try to give focus to the unmapped window Sam Spilsbury 2011-04-30 Track windows on CreateNotify again, don't rely on trying to beat the race condition by putting that on MapRequest, instead check at reparent time if the window has already been reparented server-side and don't reparent it again. Sam Spilsbury 2011-04-30 Don't crash if switch window can't be found Sam Spilsbury 2011-04-30 Set correct DISPLAY env when launching commands. Do not force :0 Sam Spilsbury 2011-04-30 Also take into account server border geometry when positioning Sam Spilsbury 2011-04-30 Always take into account border geometry when calculating actual window size since we make an XGetGeometry call and take into account the border when comparing sizes there. Fixes resize bugs with xterm Sam Spilsbury 2011-04-30 Release implicit grabs as soon as we handle events. Implicit keyboard grabs which are created by the pressing and holding of a key that was passively grabbed by XGrabKey are evil for a number of reasons.First of all, there isn't any way to track them or to track which window they are grabbed on so if a plugin makes an active grab and then releases it, the passive grab is released on release, which means there is an inconsistency between holding the key and having the grab. Secondly, if plugins actually need a grab on all keys, they are better switching to an active grab rather than relying on the passive one. Finally, if there is a passive grab by another application by a key-modifier combo which has the same modifier mask as the currently activated passive grab, then it means that this application won't get its grab activated as long as the modifier is held down. Sam Spilsbury 2011-04-30 Also check match options before defaulting to global option Sam Spilsbury 2011-04-30 Don't ignore the match value when setting centered on xkbevent Sam Spilsbury 2011-04-30 Fix indentation Sam Spilsbury 2011-04-30 Always monitor key events even when window isn't grabbed Sam Spilsbury 2011-03-23 Bump core ABI Sam Spilsbury 2011-03-23 Don't treat synthetic UnmapNotify the same as the real UnmapNotify ICCCM section 4.1.4 says that applications need to send us a synthetic UnmapNotify to tell us that the window has been withdrawn in all cases to cover the case where a window is already unmapped and then withdrawn. In this case we should handle the UnmapNotify as a request to withdraw the window, but we should only handle the *real* UnmapNotify request as a request to actually process the window being unmapped and withdraw it there, rather than processing both twice and withdrawing the window twice Sam Spilsbury 2011-03-22 Revert "If an unexpected window gets focus (e.g. by a client calling XSetInputFocus directly), make sure that moving the input focus to a default window still works when that window is closed." This reverts commit 1fb701594b78e950c031974d83c3566d1d648156. There are some problems created by this commit, reverting for now until they can be evauluated Conflicts: src/event.cpp Scott Moreau 2011-03-18 Remove unused macro. Sam Spilsbury 2011-03-18 Set unmanaging before managed Sam Spilsbury 2011-03-18 Only set w->unmanaging if the window was actually managed 84a27e08e8e2f6c3a70ee7966624411e0e330db4 to master Forward port Merge: 0b2ed28 08ba72d Sam Spilsbury 2011-03-18 Merge https://github.com/robtaylor/compiz Sam Spilsbury 2011-03-18 Fix warning Scott Moreau 2011-03-18 If the root window gets focus, unset activeWindow before calling focusDefaultWindow to make sure the latter really focusses another window. Forward port 33f695e7c6e4fb8ac627df0978fea7771fe1b3d5 to master Scott Moreau 2011-03-18 If an unexpected window gets focus (e.g. by a client calling XSetInputFocus directly), make sure that moving the input focus to a default window still works when that window is closed. 556b681adaab3fe27fa456037be82e902dd371be to master Forward port Scott Moreau 2011-03-18 Don't grant focus to override_redirect windows. Most other window managers don't even track override_redirect windows, so applications relying on the focus being granted to override_redirect windows are broken anyway. Forward port 30a92d8a060d79181a28840d7c66428ef431200c to master Scott Moreau 2011-03-18 Don't let focus stay on the root window. It may happen that the root window is focussed, e.g. by some client calling XSetInputFocus with the root window as target. As that most likely isn't what the user wants, focus the default window instead. Forward port a9a35b6034517404b0c3ed4296f0c33d7d8d1d11 to master Sam Spilsbury 2011-03-18 Make sure that window has the correct parent on unmanagement. Reparenting the window will cause an UnmapNotify to be sent whcih will cause us to unreparent the window and reparent it into the root window. In the case where the application wanted to reparent a toplevel window we need to make sure that we put the window back in the parent where the client actually requested it to go when we get the ReparentNotify Rob Taylor 2011-03-16 If there's a sesion manager, ask it to always restart compiz. Rob Taylor 2011-03-16 CompOption::Class had virtual functions without a virtual destructor. That's usually bad. Rob Taylor 2011-03-16 Region type in x is typedef struct _XRegion *Region. That means returning a const Regsion makes no sense - that's setting the returned pointer to const. Sam Spilsbury 2011-03-16 Also remove windows from createdWindows list if they were reparented into something else Sam Spilsbury 2011-03-15 Reflect difference between actual input frame geometry and border extents in the core API Sam Spilsbury 2011-03-13 Process changes to edge windows when skipping events on pointer warp There's a condition that can happen where we skip the events generated by XWarpPointer and this causes the edge window reference to stay on the same window, which is a problem when using edges since certain button bindings would stop working. The new behaviour is to always update the edge window reference whenever processing enter and leave events caused by pointer warps Merge: f777234 011a611 Sam Spilsbury 2011-03-12 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-03-12 Add support for a "focus on switch" option which toggles whether or not the window should appear focused when switching between windows Sam Spilsbury 2011-03-12 Don't trash the pixmaps of windows that were hidden but don't have mapNum == 0 since that case only happens where windows are actually closed or unmanaged Sam Spilsbury 2011-03-12 Don't need to modify priv->width, priv->height since those are representative of the server side window and not the pixmap size Sam Spilsbury 2011-03-11 Don't unreparent the window until plugins are finished with animations and such (eg, not while an unmap reference is held) and don't dump the pixmap of the window if it is resized and unreparented and the plugins hold a reference to it Sam Spilsbury 2011-03-11 Don't throw out the textures of windows that got resized or re/unreparented while plugins hold an unmap reference to them as it is pretty likely that those plugins need that data for animations Sam Spilsbury 2011-03-11 Don't update windows in some cases where there is an unmap reference since it is likely that plugins are using them for animations. However, do allow decorations to be changed where the dm asks us to. Also set frame extents to 0 explicitly when the window is unreparented Sam Spilsbury 2011-03-11 Revert "Don't refuse to update frame extents for windows that have an unmap reference" This reverts commit 86358da783bc7152c8fbe8a39d883ac922de5958. Sam Spilsbury 2011-03-11 Don't refuse to update frame extents for windows that have an unmap reference The previous rationale for not updating these extents is that doing so will cause a resizeNotify on windows that are currently being unmapped or that plugins have delayed from being unmapped and this will cause core to throw out the texture of those windows. A better solution here would be to not throw out the decoration pixmap and texture for windows that are currently being unmapped (and also not throwing out the pixmap in the composite plugin), since it would be likely that plugins are using them for animations Sam Spilsbury 2011-03-07 "Update CMake Version" Sam Spilsbury 2011-03-07 "Update news for 0.9.4 release" Sam Spilsbury 2011-02-28 Fix gtk-w-d crashing when removing decoration. Also try to detect when windows are modal and give them modal type decorations and move freedesktop.png to cube where it will actually be used Sam Spilsbury 2011-02-28 Fix the loading and installation of images - core images should be under the core plugin, freedesktop.png moved to cube and load images based on the actual install dirs Sam Spilsbury 2011-02-27 Don't pass uninitialized value to plugins needing to update output extents Plugins need to check against this value in order to see if they should change the extents of the decoration area on windows, don't send them uninitialized garbage when doing that. Sam Spilsbury 2011-02-24 Fix broken build Sam Spilsbury 2011-02-24 Specify plugin name when loading images to find the correct image loading dir for plugins which don't specify absolute paths to their images Sam Spilsbury 2011-02-24 Fix mismatched brace Merge: 1c9eb6d 9849ca3 Sam Spilsbury 2011-02-24 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-24 Remove debugging message Sam Spilsbury 2011-02-24 Don't override the user's PKG_CONFIG_PATH with the CMAKE_INSTALL_PATH unless the user explicitly changed the CMAKE_INSTALL_PATH. Rationale: If the user has their PKG_CONFIG_PATH set to /foo/bar they would expect that when doing things like, eg installing plugins locally (which ignores CMAKE_INSTALL_PREFIX), that the buildsystem would pick up pkg-config files from their PKG_CONFIG_PATH which they have specified themselves and not the default CMAKE_INSTALL_PREFIX, however when the user changes the CMAKE_INSTALL_PREFIX they need to have that be used for pkg-config purposes. Sam Spilsbury 2011-02-24 Track focus changes for destroyed windows too since we'll change the focus later anyways Sam Spilsbury 2011-02-24 Nuke warning Sam Spilsbury 2011-02-24 Preprocessor abuse to handle the Gtk+ 2.24 transition Merge: a30a8ee 54d17f0 Sam Spilsbury 2011-02-23 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-23 Check if we're resizing from a grab handle first (eg isConstrained) before using constraint area. Fixes crash when using alt + button2 to resize and hitting an edge Travis Watkins 2011-02-22 stop using deprecated gdk functions Merge: e2ead0a 3eda41c Sam Spilsbury 2011-02-23 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-23 Fix crash on exit Scott Moreau 2011-02-22 Use glib CLAMP macro. Scott Moreau 2011-02-22 Remove unnecessary definition. Sam Spilsbury 2011-02-22 Remove debug message Scott Moreau 2011-02-22 Avoid using reserved definition. Adam Williamson 2011-02-22 Generate GConf Schema files even if we don't want to install them Adam Williamson 2011-02-22 Import CFLAGS and CXXFLAGS env variables Sam Spilsbury 2011-02-22 s/Novell Inc./Canonical Ltd./ in eventsource.cpp copyright Merge: 7c0ba73 96eaecc Sam Spilsbury 2011-02-22 Merge branch 'master' of git://git.compiz.org/compiz/core Conflicts: gtk/window-decorator/decorator.c Sam Spilsbury 2011-02-21 Fix initial stacking issues Sam Spilsbury 2011-02-21 Fix down-left shift and wrong offsets for default decorations. Initialize settings before creating decoration frames Sam Spilsbury 2011-02-21 Relicence eventsource.cpp to MIT Sam Spilsbury 2011-02-21 Fix memory leaks - Use gtk_main_quit (); - Don't create gconf clients where we don't need to Sam Spilsbury 2011-02-21 Remove dead code Sam Spilsbury 2011-02-21 Update copyright info Sam Spilsbury 2011-02-21 Fix title scales not updating on theme change Sam Spilsbury 2011-02-21 Also store correct pointer type and unref on exit Sam Spilsbury 2011-02-21 Prevent spurious frame creation and deletion Bare, default and switcher decorations never change and they need to come and go, so keep references to them Sam Spilsbury 2011-02-21 Fix 2D Mode. Don't refresh shadow info (and check windows in paint list) if compositing is not active and set the border and max border properties for the default window type decoration (Without these properties, CompWindow::input () would return 0,0,0,0 and an output frame wouldn't be created) Sam Spilsbury 2011-02-21 Initialize variable. Fixes valgrind warning Sam Spilsbury 2011-02-21 Check if string is empty correctly. Fixes checks for CMAKE_BUILD_TYPE string being empty always returning true and thus the CMAKE_BUILD_TYPE being set to something the user didn't want Sam Spilsbury 2011-02-21 Read w->input () rather than the internal input extents. This provides information about the current state of the decoration extents in core, rather than our own information about the window decoration itself. Reverts part of 4ae95852e53075caed15586620127f0c1405fe474 Fixes unresponsive decorations in kde4-window-decorator and decorations initially "not responding" when you click on them (b.c.o #20) Sam Spilsbury 2011-02-20 Set default value for vpSize before loading plugins. There is a race where vpSize won't be updated to its "true value" until we reach core's option change callback or we read the value from the configuration plugin. Since we load all the plugins at once on screenInitPlugins on the command line, some plugins require that this value be set to *something* (It can be changed later) before they are initialized. Fixes incorrect vertex settings with cube, causing it to zoom out infinitely when switching viewports when loaded when compiz starts Sam Spilsbury 2011-02-19 Sync after ungrabbing the server. Turns out that XUngrabServer is not a synchronous call, so there is a race condition with the new startup order where the ungrab server request will sit in the output buffer waiting to be processed and the server won't actually be ungrabbed when we start loading plugins. This can have all kinds of side effects, for example when initializing GConf with GDBus, there will be a call to dbus-launch --autostart to try and get the session bus ID which will fail if there is still a server grab that hasn't been released (since it attempts to read X11 properties) Fixes LP: #691561 Sam Spilsbury 2011-02-19 Map and unmap the switcher window directly Sam Spilsbury 2011-02-19 Update TODO Sam Spilsbury 2011-02-19 Cleanup init_settings some more, move the switcher stuff out into the frame ctor and move USE_GCONF into one big ifdef Sam Spilsbury 2011-02-19 Store settings data in its own struct Prevents namespace issues and makes it more clear where to access this data. Sam Spilsbury 2011-02-18 Cleanup. Move things to where they should be, remove dead code Sam Spilsbury 2011-02-18 Add memory management to frames We don't need to keep all the frame definitions around in memory all the time, so refcount them and only add them if we actually need them. Sam Spilsbury 2011-02-17 Add frame types system, allocate to hash table and use them to manage frames Sam Spilsbury 2011-02-17 Add frames refcounting system Sam Spilsbury 2011-02-17 Cleanup meta_update_border_extents function Don't need to retrieve the frame all the time, just get it once Sam Spilsbury 2011-02-17 Cleanup decor_frame_type is available in decor_t now, so no need to get that manually Sam Spilsbury 2011-02-17 Added simple frames management system. Right now this just keeps the frames in a private area and returns a pre-allocated frame, but it will be expanded to allow reference counting on frames and allocation on-demand Sam Spilsbury 2011-02-17 Generalize shadow_only decoration into window decorations list Remove debug message Sam Spilsbury 2011-02-16 Remove more dead code Sam Spilsbury 2011-02-16 Generalize switcher into another decoration frame type Sam Spilsbury 2011-02-16 Move _default_decoration into another decor_frame_t in decor_frames No need to have another structure lying around for this ... Sam Spilsbury 2011-02-16 Fix shadows of non-default frame windows Include frame information when drawing the shadow outline and also get the metacity frame type from this information rather than the WnckWindow Sam Spilsbury 2011-02-16 Fix cairo mode * Make sure we set the theme fptrs for get_title_scale on startup * Use the frame reference in the decor_t since that works for default decorations too Sam Spilsbury 2011-02-15 Fix crash when changing theme Connect up the signal handler for the style change correctly. Sam Spilsbury 2011-02-15 Make the switcher a decoration frame. It is still separate to the normal "window type" decoration, but at least now it has access to everything it needs Sam Spilsbury 2011-02-15 Allow different font types in frames. Currently we used a single PangoContext and PangoFontDescription for everything ... this resulted in custom frames having the same titlebar size which wasn't any good. This commit changes a lot, namely: * Frame is now linked to the decoration object itself * Moved style windows into the frame * Moved font context and font description into the frame * Added API for getting the titlebar font size: obviously with the cairo decorations there isn't supposed to be any kind of visual difference here but with the metacity decorations we need to get that directly from libmetacity. It should be noted that these commits are in need of a cleanup ... which is coming in the next few commits. Sam Spilsbury 2011-02-14 Add frame management system There are different types of frames that we will need to support - like the GIMP's utility toolbox windows - we need to have stored separate frames in order to support them Sam Spilsbury 2011-02-14 Add definitions for different border types Sam Spilsbury 2011-02-14 Add support for drawing with different metacity theme types Sam Spilsbury 2011-02-13 Don't catch resize notifications on startup DecorWindow::update might call updateWindowOutputExtents which calls ::resizeNotify ... since this loops over all windows it is not safe to have this function called. Sam Spilsbury 2011-02-12 Remove debugging message Sam Spilsbury 2011-02-12 Slight optimization. Don't recalculate clip region on every paint, but only where it makes sense to. Sam Spilsbury 2011-02-12 Fix artefacts in shadow clipping. Intersect the clip region already computed by core with the output region of the window so that we don't display parts of the window that might be occluded Sam Spilsbury 2011-02-12 Clip shadows where it makes sense Merge: a88ce82 e1dc3f2 Sam Spilsbury 2011-02-11 Merge branch 'master' of git://git.compiz.org/compiz/core Conflicts: gtk/window-decorator/decorator.c Merge: bd14afd c68018c Sam Spilsbury 2011-02-11 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Merge: f5f41b9 09fe54a Sam Spilsbury 2011-02-11 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-02-11 Convert modifier masks from virtual to real ones before grabbing button. Also skip ignored modifier if it is also in the cleared ignored bits Sam Spilsbury 2011-02-11 Remove "semi-tracked" created windows on DestroyNotify. Fixes LP: #709461 Sam Spilsbury 2011-02-10 Make the switcher window being override redirect. Previously the switcher window was a normal managed window (which the switcher plugin actually lied about, see SwitchWindow::managed), such that the decorators could pick it up and draw the switcher decoration. However now with reparenting, this means that whenever we actually manage and unmanage the switcher window (eg with map and unmap) it means we must also reparent the window, which floods the server with requests and makes the switcher slow. Since we don't interact with the switcher window, it makes no sense to manage it like this, so make it override redirect Jason Smith 2011-02-05 Minor stacking fix Sam Spilsbury 2011-02-03 Use autogenerated options code to directly access option values rather than looking up the options Sam Spilsbury 2011-02-03 Be a little bit smarter about that - work with stretched windows too and don't accumulate pointer motion if the window is already constrained Sam Spilsbury 2011-02-03 Take up/down pointer motions as left and right if the cursor is at a screen edge This allows the resize borders to extend past the window somewhat and for the user to still resize windows to the edge of the screen Sam Spilsbury 2011-02-03 Explicitly include to avoid offset problems on amd64 Travis Watkins 2011-02-02 fix bcop code generation for colors Sam Spilsbury 2011-02-02 Initialize border Merge: ff085dc 4ae9585 Sam Spilsbury 2011-02-01 Merge branch 'master' of ../../../core Conflicts: include/core/core.h src/window.cpp Sam Spilsbury 2011-02-01 Allow semantic difference between frame window geometry and frame size. Rationale: some window decorators or themes might want to specify a border input area that is slightly larger than the visible borders on screen (eg for enhanced resize handles, a11y purposes, etc) or the theme might want to specify some additional decoration which should affect placement but should not be interacted with. In this case we have a priv->border and priv->input window property. priv->border specifies the actual semantic size of the window decoration that should affect placement and priv->input specifies the extents of the frame window past the client. Fixes LP: #710271 Sam Spilsbury 2011-01-28 Fix frame reference not going away on unreparent Sam Spilsbury 2011-01-28 Whitespace fix Sam Spilsbury 2011-01-28 Whitespace fix Sam Spilsbury 2011-01-28 Wait for reparent and configure operations to complete before destroying. We don't track frame and wrapper windows like normal windows, so if we want to restack relative to the frame window on unreparent then we need to ensure that the restack operation actually completed before destroying the window. Sam Spilsbury 2011-01-28 We don't care about events happening on the wrapper window during unreparent Listening for these events is only going to cause UnmapNotifies coming from our own XReparentWindow operation and XUnmapWindow operation on the frame window on the wrapper window, which will be handled by compiz making some windows appear to be unmapped when they were just unreparented. Fixes LP #682781 Sam Spilsbury 2011-01-27 Don't track window geometries or properties until they are actually managed. The window might get some ConfigureRequests which won't be reflected in PrivateWindow at MapRequest time. Fixes LP #707853 Sam Spilsbury 2011-01-26 Fix warning Sam Spilsbury 2011-01-26 Fix windows jumping around when clicking on parts that trigger move Since we no longer have an unconditional passive grab on Button1 for active and raised windows, we need to check if a client sent us a _NET_WM_MOVERESIZE ClientMessage and update the pointer buffer on that. Also clean up the pointer buffer handling code again - reduce the number of roundtrips required. Remove debug message. Merge: 1c8f44d 6d72a4e Sam Spilsbury 2011-01-26 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Merge: 793479d 081e136 Sam Spilsbury 2011-01-26 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2011-01-26 Cleanup reparenting code No need to use XGetGeometry since checking the return value of XGetWindowAttributes will determine if the window is destroyed. Also make sg a reference since copying serverGeometry is a bit useless Sam Spilsbury 2011-01-26 Set the vp size before initializing windows Merge: cd3aef5 41d6694 Sam Spilsbury 2011-01-25 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2011-01-25 Fix stacking madness 1) Don't create windows after registering for CreateNotify on the root window and then do XQueryTree after calling XCreateWindow since this will add the window to the internal stack twice (once for XQueryTree and once for the CreateNotify) 2) Enforce a full restack on all windows once we have decided what our initial stack order is - so that dock windows don't end up going underneath desktop windows 3) Immediately stack the frame window underneath the client and wait for the stacking operation to complete before reparenting since sometimes the frame window would be created and mapped at the top of the X11 stack whereas the client window would be tracked from the bottom of the stack. Remove hack to restack window within compiz since that didn't actually work. Travis Watkins 2011-01-24 fix build system so you can disable building decor plugin Merge: eef7eab 2b7e757 Sam Spilsbury 2011-01-24 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2011-01-24 Don't try to set target properties for blur if we disabled building it Sam Spilsbury 2011-01-24 Don't make if-statement depend on XWindowAttributes which might be garbage. The window could have been destroyed by the time we do XGetWindowAttributes on it, so we need to check if that's the case. We still add it to the tree anyways - but only because in between the time when we handle the DestroyNotify for it and the CreateNotify, some windows might have done a ConfigureRequest asking us to stack windows relative to it Sam Spilsbury 2011-01-24 Fix not tracking windows that became override-redirect after create. Some broken toolkits like QT change their override-redirectness after CreateNotify, which would cause us not to track them. Unfortunately this means that we need to track them on MapNotify, but that's not really a problem anyways since they are override-redirect Merge: eef7eab 7ce34ea Sam Spilsbury 2011-01-20 Merge branch 'master' of git://git.compiz.org/compiz/core Merge: 7194f67 af8424c Sam Spilsbury 2011-01-20 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Sam Spilsbury 2011-01-19 Update passive button grabs on reparent Sam Spilsbury 2011-01-19 Fix not tracking windows which get unmapped, not destroyed and then remapped Sam Spilsbury 2011-01-19 Revert "Don't stack mapping windows which requested no focus above the active window." This reverts commit ecc61dc04567947e92cbb9686c1041619abc05b1. Sam Spilsbury 2011-01-14 Track override redirect windows from the first CreateNotify. We don't get a MapRequest from these windows, so we need to track them from CreateNotify (which isn't really evil anyways since we aren't reparenting them) Fixes (most) issues with menus not appearing. Sam Spilsbury 2011-01-13 Update core ABI Travis Watkins 2011-01-12 fix logic craziness Stop screwing with my brain and put the code at the one place it will actually be used. Sam Spilsbury 2011-01-13 Don't create CompWindow and initialize plugins until MapRequest. Having all plugins track windows on CreateNotify doesn't make any sense because they are not visible, and the ones that they would need to track would be override-redirect anyways. Also tracking windows in this way broke reparenting in such a way that a number of buggy applications using xembed (eg gnome-panel applets and Adobe Flash would consistently crash). Sam Spilsbury 2011-01-12 Don't stack mapping windows which requested no focus above the active window. This adds a managing variable to PrivateWindow which represents the managing state of the window. In addition, ::updateAttributes did not stack windows below correctly if they were already directly on top of an active window (since it is not valid to stack a window below itself, and the algorithm would pass the below to the findValidStackSiblingBelow function as well as a pointer to the active window (== below)). The function now compares the below sibling to the window we want to be stacked. Merge: 78a5ebd ab1861b Sam Spilsbury 2011-01-11 Merge branch 'glibmm-experimental' Conflicts: src/screen.cpp Merge: aa8edad cf2117b Sam Spilsbury 2011-01-11 Merge git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2011-01-08 Fix grabs activating when we don't need them to, fixing some applications receiving wrong events Sam Spilsbury 2011-01-05 Also check for FocusChange events on windows of other screens. Don't continually set the input focus if it is already set - the focus can change to be on another screen, register for events to detect that case Sam Spilsbury 2011-01-05 Move sources around into relevant files Sam Spilsbury 2011-01-05 Remove glib plugin. It conflicts with this branch Sam Spilsbury 2011-01-05 Use clock_gettime and add a TIMESPECDIFF macro Sam Spilsbury 2011-01-05 Make the timeout for the zero-timer case 15, just so that we don't end up spamming things (15msec isn't that long) Sam Spilsbury 2011-01-04 We can have a brief spin-wait system in place for CompTimeoutSource since there isn't any case where we don't have timers running Sam Spilsbury 2011-01-04 Re-add paint-smartness to composite.cpp Sam Spilsbury 2011-01-04 Re-write timers to be a regular Glib::Source We previously used Glib::TimeoutSource but this one is broken for a number of usecases that we need, so create our own timeout source which is similar to the stock one, except that we only insert one source into the glib stack with grouped timeout times for the rest of our timers. Allows the use of setTimes () and setCallback () without glib becoming a disaster-zone. Also fixes a number of crashes related to the buggy glibmm implementation. Merge: 8649381 2ced0ab Sam Spilsbury 2011-01-02 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2011-01-02 Only set unmanaging bit while window is actually being unmanaged. Also de-obfuscate gravity handling in _NET_WM_MOVERESIZE request Sam Spilsbury 2010-12-31 Fix crashes when loading plugins on the command line plugin.cpp:plugins is a reverse list, so iterate it in reverse Sam Spilsbury 2010-12-31 Raise window on move/resize initiation in raise-on-click mode. Forward port a32f5bf9cef3ec0c40c7ac60b8b87f4083016f98 to master Sam Spilsbury 2010-12-24 Allow plugins to initiate scale when initiated to change the match Sam Spilsbury 2010-12-24 Don't clear terminate state until action is actually finished clearing up. Clearing the terminate state before this will confuse other plugins which check activity states Merge: b3c2c22 07f258e Sam Spilsbury 2010-12-24 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-23 Add signals for viewport change begin/end Sam Spilsbury 2010-12-19 Other mouse buttons should be allowed to change the selected window. But only button 1 should be able to select windows and terminate scale mode. Fixes incorrectly selected window when the mouse has not been moved after scale mode has been initiated and the mouse is hovering over an unselected window, and then Button2, or Button3 eg is pressed. This broke scaleaddon's pull window and close window bindings. Fixes LP #691087 Sam Spilsbury 2010-12-13 Cleanup Merge: af62da3 b2077af Sam Spilsbury 2010-12-13 Merge git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-13 Send window id in decoration notification Sam Spilsbury 2010-12-13 Fix unintialized variable usage Merge: abb0874 8dd7395 Sam Spilsbury 2010-12-13 Merge git://git.compiz.org/compiz/core into glibmm-experimental Merge: da624e3 8dd7395 Sam Spilsbury 2010-12-13 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-12-13 Also beautify Sam Spilsbury 2010-12-13 Break after updating after reparent Sam Spilsbury 2010-12-13 Add a compiz event for when we have been decorated Didier Roche 2010-12-13 package mode is release debug for plugins also ship the slipped gconf cmake helper Sam Spilsbury 2010-12-13 Fix buffer overflow on some platforms (Non NULL passed to XOpenDisplay) Sam Spilsbury 2010-12-11 Ensure decoration is updated on shade. Fixes artifacts. Previously we'd rely upon a change in winDecorAtom to tell us when to update the decoration, however now that we are reparenting we can't do that anymore so hook windowNotify to watch for shade and unshade and then force the decoration to be updated on resizeNotify if this is the case. Sam Spilsbury 2010-12-09 Fix some typoes and handle the case where the window is already under a dock Sam Spilsbury 2010-12-09 Be a little bit more clever about constraining resizes to workareas. Basically we want to constrain resizes to workareas, but not in the case where two outputs touch. In the case that two outputs touch they must be directly adjacent and there must not be a panel or dock in the way Merge: 9211a51 4666435 Sam Spilsbury 2010-12-08 Merge git://git.compiz.org/compiz/core into glibmm-experimental Conflicts: include/core/screen.h Sam Spilsbury 2010-12-07 Don't stack focus-denied windows in a disallowed position When a window is focus-stealing-prevented, we should only stack it below the active window if that is possible. If it's not (the window has the "Above" state, for example), then we should stack it at the normal location. http://bugs.opencompositing.org/show_bug.cgi?id=1304 Forward port 984bca5801d6179b9f8081c4b6c466063975d940 to master Sam Spilsbury 2010-12-07 Only reflect the decoration size in MapRequest gravity adjustment, not the whole window size. Forward port a86c461684f122fd286884c4ff28f6ea673fe669 Sam Spilsbury 2010-12-07 Also update desktop keys Sam Spilsbury 2010-12-07 Update path names in gconf keybindings Sam Spilsbury 2010-12-07 Cleanup key binding list from redundant and unneeded keys and add scale binding. Forward port c9993a7739e9bf6b595e5efa62605027241c3d7f to master Sam Spilsbury 2010-12-07 Also handle windows that have a server border set in pointer placement mode. Also fix typo. 1d5f80cd52274484ecb59a1c8f7e7b6cea3b1844 to master Forward port Sam Spilsbury 2010-12-07 Correctly reflect that the switcher window is managed. Forward port 46371f9172089a3e60648b834611d5694df2e80b to master Sam Spilsbury 2010-12-07 Make short descriptions in opacity a little more verbose Forward port f089351c2d6d62302e59f52a810b722808a4a574 to master Sam Spilsbury 2010-12-07 Move window position validation to validateWindowResizeRequest function. Forward port 2a37340f9610e7f80a66ed6ab48190c181784f6b to master Sam Spilsbury 2010-12-07 Don't make minimized windows unmanaged. Forward port 8dcfbb256322565228cbcda5230de95343887fac Sam Spilsbury 2010-12-07 Fix window offset at the start of close animation. Forward port 0a28ca484a8a72060b580e0ccc75ea20f3ddab1a Sam Spilsbury 2010-12-07 resize: Remove constrain_y, limit to work area instead of screen edges. Forward port 3075fa6eac1f4c7faa804b319f916899589702cc Sam Spilsbury 2010-12-07 resize: Fix typo Sam Spilsbury 2010-12-07 resize: Allow resizing outside screen edges when initiated with key. Forward port 6e281003bbcb01ac028aa963ab1bee0349c41376 to master Sam Spilsbury 2010-12-07 place: Fix typo (off by one error) Forward port 4832c514b0c460febc90720a61c11d6a0f64ec84 to master Sam Spilsbury 2010-12-07 Also set constrainY to FALSE if move is not loaded. Forward port 615d823f5edc26eaa12e83c97099c7ab0f017968 to master Sam Spilsbury 2010-12-07 Constrain resizes to screen edges and fix constraining. Forward port 6c12e5a60297143a72c4e4bb104b0c35102ff3f4 to master Sam Spilsbury 2010-12-07 resize: Obey move's constrain_y option Forward port 0d23e499774769d295509f189fbf4b7c21763ef6 to master Sam Spilsbury 2010-12-07 Fix typo Forward port 466184685e570b6736adce7800253815d72e1c02 to master Sam Spilsbury 2010-12-07 Fix assertion if core is specified as plugin on the command line. Forward port 2a0087732f23cd87284366ec0dc224cbd5fd68ec to master Sam Spilsbury 2010-12-07 scale: Properly remove closing window. Forward port 96e59168920650f49c5e79b342261c863694fb23 to master Sam Spilsbury 2010-12-07 Switcher: prevent simulataneous plugin uses that don't make sense. Forward port 1974f9b5bfbab24023a0a647b606eedccbb83d04 to master Sam Spilsbury 2010-12-07 Avoid adding core twice to plugin list Forward port 20cdf69d096616104cd26fc30c8efd7e4e4e164d to master Sam Spilsbury 2010-12-07 Fix sibling checking logic. Forward port f4af2061d93057843efd437b30b8199dc89defdd to master Sam Spilsbury 2010-12-07 Make sure findValidStackSibling below doesn't return a sibling that we're not allowed to stack under. Forward port 1baf514fefb9177764af99cf508596686583244e to master Sam Spilsbury 2010-12-07 Fix up coding style, add some comments. Forward port 24dd71f04892ddd031ac2bf7b166e10b74aa1bbd to master Sam Spilsbury 2010-12-07 Never unload plugins passed to the cmdline Forward port 27430deae222b4380c0e91da849f930a297afb73 to master Sam Spilsbury 2010-12-07 gnomecompat: Default to gnome-terminal for terminal keybinding. Forward port 060a99697cde9105c85623cb464a36b46da3bf97 to master Sam Spilsbury 2010-12-07 Revert gravity adjustment made at MapRequest time at UnmapNotify time Forward port a0be58f5e9f5e419af4f5f15505e9a9f6fe47bdd to master Sam Spilsbury 2010-12-07 Don't take screenshot if Escape was pressed. Forward port c9239e92fe0b2d6bfc674b523313617017ca062f to master Sam Spilsbury 2010-12-06 Revert "Fix windows being forever treated as "not managed" in focus () and not entering into scale mode, etc" This reverts commit 51e01727d309f39e3f42ecf6b53b4ebb31a385dc. There is a better way to do this Sam Spilsbury 2010-12-06 Fix startup order. Previously we were doing something like this: init -> screen init -> init core plugin screen -> create windows -> eventLoop -> updatePlugins -> initPlugin (initScreen (initWindow))). This order has a number of problems with it - namely that config plugins will be loaded on one full pass of the event loop and then core options are initialized, before which we were doing certain startup procedures on the default options, which resulted in strange race condition bugs. Also, if we are compositing we have a brief (visible) switch from 2D mode to 3D mode - in reality we want to be in 3D mode ASAP. The new order is init -> updatePlugins (load plugins specified on command line) -> screen init -> load command line plugins -> update plugins (load new plugins specified by config plugins on the command line) -> init screens -> create window (init plugins for window) -> eventLoop. This means that it takes longer for us to get to the event loop, but at least we can zip through the initialization phase quite quickly Merge: 89e6c77 a8ad8f2 Sam Spilsbury 2010-12-05 Merge commit 'a8ad8f2c28a95ee8ebc39d404069586942c2e292' into glibmm-experimental Merge: f4ae798 ce53cec Sam Spilsbury 2010-12-05 Merge commit 'ce53cec922f54c754e8c7eb19d786a2dffe0f496' into glibmm-experimental Merge: a26a16b a8ad8f2 Sam Spilsbury 2010-12-05 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Jason Smith 2010-12-04 Fix memory leaks introduced in last commit Sam Spilsbury 2010-12-05 Fix windows being forever treated as "not managed" in focus () and not entering into scale mode, etc We need to re-set unmanaging too once managed is set again Sam Spilsbury 2010-12-04 Fix windows consistently moving by gravity * window decoration extents. The behaviour from 0.8 was ported to update decoration windows on the window destructor, but because we are moving windows on a timer in order to handle reparenting issues when decorating them, this also causes the time to be destroyed when the CompWindow is, so the windows never actually get moved back into place correctly. FIXME: Timers should have a referencing system, it does not make sense that we have to preserve their scope Merge: 56b97b9 2d4b54b Sam Spilsbury 2010-12-04 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-04 Fix typo Sam Spilsbury 2010-12-04 The window must always have a frame before we do anything with it Sam Spilsbury 2010-12-04 Wait until reparent to decorate Sam Spilsbury 2010-12-04 Fix typo which caused windows not to be recognized Sam Spilsbury 2010-12-04 Revert "Constrain windows to workArea when moving for decorations" This reverts commit d07d0103b7e76a10fb9b360d25c4ec32470eaa53. Jason Smith 2010-12-03 Fix compregion to be a more true to form wrapper of X11 region Merge: 80b1c01 4a5ec2b Sam Spilsbury 2010-12-03 Merge branch 'master' of git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-12-03 Fix typo which caused windows > screen height to be placed incorrectly Sam Spilsbury 2010-12-03 Fix typos Sam Spilsbury 2010-12-03 Fix window position validation for windows that change size without changing position. Previously, we left the position of windows that have USPosition set untouched, even if they didn't try to change position at all, but only changed size. This caused such windows to become partially offscreen e.g. if they were positioned at the lower edge of the work area before the size change and increased height afterwards. Forward port 3c16152938c44454f42d08a4b92cc46093c9a782 to master Sam Spilsbury 2010-12-03 Fix some focus issues: - Don't give soon-to-be-unmanaged windows focus when closing a window - Transfer focus to another window if a window that is about to get focus is closed Forward port 5a78a90a3ec9de02b8e52790fbc376a2502cead7 to master. Fixes gnome-do issue Sam Spilsbury 2010-12-03 Revert "Ensure that we can change the input focus, even if we requested a client to take focus and it failed to do it before it was unmapped" This reverts commit 1084f0be5c200d46ad3b4358a477963d31040736. Danny suggested a better way to do this from a commit to 0.8 Sam Spilsbury 2010-12-03 Add some documentation for decorator.c Sam Spilsbury 2010-12-03 Ensure that we can change the input focus, even if we requested a client to take focus and it failed to do it before it was unmapped Sam Spilsbury 2010-12-02 Make w->managed () wrapable Sam Spilsbury 2010-12-02 Fix debug message Merge: ef1399c 81c768f Unity 2010-12-02 Merge branch 'glibmm-experimental' of git://git.compiz.org/users/dbo/compiz-with-glib-mainloop into glibmm-experimental Sam Spilsbury 2010-12-02 Remove doPoll () and rewrite CompWatchFd to use Glib::IOSource This changes compiz to monitor file descriptors directly in the glib mainloop which fixes things like not exiting correctly with session managers and the like. Sam Spilsbury 2010-11-27 Fix switcher background drawing As the default composition mode is SourceOver and the old contents are uninitialized, all sorts of graphical corruption could occur. Fix that by using Source composition mode and thus not using the old contents for blending. Forward port 50c061b29c9fccdc937f0de92ba1edccab1a05a4 to master Sam Spilsbury 2010-11-27 No need to reset the source, it happens for us on destructor Sam Spilsbury 2010-11-27 Detect when glib is being stupid and calls ::internalCallback even though we asked for the source to be removed (prevents access to free'd memory once we delete a CompTimer) Merge: 2bb01fb 5170cb0 Sam Spilsbury 2010-11-27 Merge git://git.compiz.org/compiz/core into glibmm-experimental Merge: dbcb185 e9f553a Sam Spilsbury 2010-11-27 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Merge: 1730f6a e9f553a Sam Spilsbury 2010-11-27 Merge git://git.compiz.org/compiz/core into glibmm-experimental Sam Spilsbury 2010-11-27 Ensure that we check options nested in and tags too (eg add an extra "/") Didier Roche 2010-11-26 fix the gconf schema generation to compiz-1 Merge: 86074c1 cbd2c12 Sam Spilsbury 2010-11-25 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop into glibmm-experimental Sam Spilsbury 2010-11-25 Return false once we're done with the source Sam Spilsbury 2010-11-25 Fix hang on exit Merge: c26f860 7c7b898 Sam Spilsbury 2010-11-24 Merge branch 'master' of git://git.compiz.org/compiz/core Merge: 029817a 7c7b898 Sam Spilsbury 2010-11-24 Merge git://git.compiz.org/compiz/core into glibmm-experimental Didier Roche 2010-11-23 fix typos and leftover from previous commit Didier Roche 2010-11-23 add signals for the bailer plugin + hw rendering detection Merge: 2eda891 ce0a8bb Didier Roche 2010-11-23 Merge branch 'master' of git://anongit.compiz.org/compiz/core Sam Spilsbury 2010-11-23 Fix decoration flicker of switcher window. Previously, the pixmaps were recreated as soon as any property changed (and thus way too often), so it would happen that at the time the decoration plugin needs to access the pixmap, it would already have been destroyed. Avoid that by only recreating the pixmaps when needed. Forward port of edb51e95e959accd3873179a20bc4674c51f5efe to master Merge: 318465e a8737b6 Didier Roche 2010-11-22 Merge branch 'master' of git://anongit.compiz.org/compiz/core Sam Spilsbury 2010-11-22 Damage rectangles correctly when coming out of stretch resize mode from constrainment Sam Spilsbury 2010-11-21 Drop the individual bindings for resize modes and move to a mod mask system Sam Spilsbury 2010-11-21 Turn resize_from_center into a match Sam Spilsbury 2010-11-20 Add a short TODO Sam Spilsbury 2010-11-20 Only use ::reset for the RefPtr because that will automatically take care of destroying it for us Sam Spilsbury 2010-11-20 Port C based glib to C++ glibmm Didier Roche 2010-11-18 [PATCH] Fix keybinding window manager names in compiz-gnome Didier Roche 2010-11-18 Update the binding properties to compiz wm with gnome capplets As now the wmname is Compiz and not compiz, update to the new wmname. Sam Spilsbury 2010-11-18 Fix weird condition where gboolean != bool bitwise which caused timers to segfault on occasion Sam Spilsbury 2010-11-13 Split GConf schema generation into a plugin_extension Merge: 70e344e 868eeab Sam Spilsbury 2010-11-12 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-11-12 Use C++ false Sam Spilsbury 2010-11-12 Install plugin images and data to separate plugin-specific subdirectories (so that plugins can't overwrite other plugin's data). Also fix typo in CompizGenInstallData.cmake Sam Spilsbury 2010-11-12 Remove testing CompizGenPrintMessage.cmake Sam Spilsbury 2010-11-12 Add a CompizGenInstallImages.cmake extension, which installs images Sam Spilsbury 2010-11-12 Add CompizGenInstallData.cmake Sam Spilsbury 2010-11-12 Split plugin data file generation into cmake extension Sam Spilsbury 2010-11-12 Added a simple CMake buildsystem extensions system Didier Roche 2010-11-12 [PATCH] Cleanup cmake file. No need to get set var {var} CACHE Sam Spilsbury 2010-11-11 Spin the mainloop properly Sam Spilsbury 2010-11-11 Listen for FocusIn/FocusOut on NotifyGrab NotifyUngrab and set an internal bit that plugins can query Sam Spilsbury 2010-11-11 Make sure that we properly unregister actions when removing the option private with operator= Sam Spilsbury 2010-11-11 Bump core ABI Merge: 7c9baac 87a93df Sam Spilsbury 2010-11-11 Merge branch 'master' of git://git.compiz.org/compiz/core Merge: c297f4d e89d6d4 Sam Spilsbury 2010-11-09 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Danny Baumann 2010-11-09 [PATCH] Be a little bit more clever when handing option construction in handleActionEvent. Previously we would have a static CompAction::Vector which we would resize to lower sizes (so that triggerFooBindings doesn't die) but this causes us to be reconstruction CompOptions all the time which is expensive. Instead just reset the option to make it "dead" (eg keep it in memory for longer) but don't create and recreate them all the time Also copy the active state of a CompAction on copy-construct Didier Roche 2010-11-05 Fix COMPIZ_DEFAULT_PLUGINS to be really taken into account Jason Smith 2010-11-08 Remove clever timers for now to see if we cant help damage issues Dominique Leuenberger 2010-11-08 Require at leasst gtk 2.18.0. Sam Spilsbury 2010-11-08 Don't increase core action register reference counts if the same action was already registered Didier Roche 2010-11-08 Preserve DESTDIR if no override in COMPIZ_DESTDIR Dominique Leuenberger 2010-11-06 Install translations into LC_MESSAGES instead of lc_messages. Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-06 Revert "Don't increase leave pendingMaps at a non-zero number once the window is mapped." This reverts commit d5e0df487697855fc07e8176d8586b7b14f6f778. Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Add COMPIZ_VERSION_MACRO and update to 0.9.2.1 Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-05 Release the connection name on unload so we don't cause dbus to get angry on ::updatePlugins Sam Spilsbury 2010-11-05 Revert "Don't queue incoming name requests and it is also safe to unref the bus" This reverts commit efcbe55d9fae7553acadf731bc3b15f46dae99cf. Sam Spilsbury 2010-11-05 Don't queue incoming name requests and it is also safe to unref the bus in the case that we aren't unreffing it due to plugin failure Merge: 267b9d1 773e8a0 Sam Spilsbury 2010-11-09 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Danny Baumann 2010-11-09 [PATCH] Be a little bit more clever when handing option construction in handleActionEvent. Previously we would have a static CompAction::Vector which we would resize to lower sizes (so that triggerFooBindings doesn't die) but this causes us to be reconstruction CompOptions all the time which is expensive. Instead just reset the option to make it "dead" (eg keep it in memory for longer) but don't create and recreate them all the time Also copy the active state of a CompAction on copy-construct Didier Roche 2010-11-05 Fix COMPIZ_DEFAULT_PLUGINS to be really taken into account Jason Smith 2010-11-08 Remove clever timers for now to see if we cant help damage issues Merge: e62dd35 86d92fd Dominique Leuenberger 2010-11-08 Merge branch 'master' of ssh://git.compiz.org/git/compiz/core Dominique Leuenberger 2010-11-08 Require at leasst gtk 2.18.0. Sam Spilsbury 2010-11-08 Don't increase core action register reference counts if the same action was already registered Didier Roche 2010-11-08 Preserve DESTDIR if no override in COMPIZ_DESTDIR Dominique Leuenberger 2010-11-06 Install translations into LC_MESSAGES instead of lc_messages. Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-06 Revert "Don't increase leave pendingMaps at a non-zero number once the window is mapped." This reverts commit d5e0df487697855fc07e8176d8586b7b14f6f778. Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Update NEWS for 0.9.2.1 Release Sam Spilsbury 2010-11-06 Add COMPIZ_VERSION_MACRO and update to 0.9.2.1 Sam Spilsbury 2010-11-06 Don't increase leave pendingMaps at a non-zero number once the window is mapped. We used to assume that for every MapRequest event that we got for which we also sent an XMapWindow that we would get a MapNotify. According to the man XMapWindow this doesn't make any sense since trying calling XMapWindow on an already mapped window for which we have SubstructureRedirectMask set results in a NoOp anyways (so we'll only ever get one MapNotify and multiple MapRequests). This fixes a case where no input focus would be set on closing windows with multiple remaining pendingMaps since we don't move the input focus if this is the case Sam Spilsbury 2010-11-05 Release the connection name on unload so we don't cause dbus to get angry on ::updatePlugins Sam Spilsbury 2010-11-05 Revert "Don't queue incoming name requests and it is also safe to unref the bus" This reverts commit efcbe55d9fae7553acadf731bc3b15f46dae99cf. Sam Spilsbury 2010-11-05 Don't queue incoming name requests and it is also safe to unref the bus in the case that we aren't unreffing it due to plugin failure Merge: 3a5c997 83ffe50 Sam Spilsbury 2010-11-04 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-11-01 Fix cairo decoration offsets Sam Spilsbury 2010-11-01 Fix decoration offsets in metacity 2D mode (hopefully for real this time) Sam Spilsbury 2010-11-01 Don't create window with shadow size in 2D Mode Merge: 2adde93 8c5348c Sam Spilsbury 2010-10-29 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-10-29 Bump version to 0.9.2 Sam Spilsbury 2010-10-29 Constrain windows to workArea when moving for decorations Since we move the window to account for adding the decorations on a zero timer (eg, after handleEvent, where windows have already been placed) we need to make sure we account for the workArea (so that we don't move windows below panels and offscreen) Sam Spilsbury 2010-10-29 Fix typos Merge: db5b0ff 709496d Danny Baumann 2010-10-27 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Danny Baumann 2010-10-27 Create cmake modules directory before copying file to it. Sam Spilsbury 2010-10-26 Fix out of bounds memory read / write Sam Spilsbury 2010-10-26 Change the match expression handler after Regex screen constructor. It is possible for RegexWindow::get () to be called from this wrapped function, which is wrong because memory for a RegexWindow hasn't yet been allocated. (CompScreen::matchExpHandlerChanged -> SomePlugin::CompMatch::Evaluate -> RegexExp::evaluate -> RegexWindow::get) Sam Spilsbury 2010-10-26 Check if header token matches part of another word. The prepending function would only check for the existence of part of the header op in the function string, and did not check if the matched string was actually part of another word. This caused fragment programs like this to fail: program name: temporary !!ARBfp1.0 TEMP temp, foo, bar; FOO temp, bar, temp; Which would be outputted like this: TEMP temporary_temp, temporary_foo, temporary_bar; FOO temporary_temporary_temp, bar, temporary_temporary_bar; (since "temp" was matched in "temporary" incorreclty). The new code now checks for a ".", ";" or "," or if the word is the last in the string before prepending it. This bug was most noticable in the colorfilter plugin, where one of the filters could be named "negative" with a temporary variable called "neg" Sam Spilsbury 2010-10-24 Fix omission in NEWS and fix date Sam Spilsbury 2010-10-24 Update NEWS for 0.9.2 release Sam Spilsbury 2010-10-24 Fix memory leak Sam Spilsbury 2010-10-24 Fix memory leak Sam Spilsbury 2010-10-24 Use XFreeStringList to recursively free the entire array Sam Spilsbury 2010-10-24 Cleanup (static analysis) Sam Spilsbury 2010-10-24 Fix some memory leaks (it looks like there are some more in XTextPropertyToStringList too) Sam Spilsbury 2010-10-23 scale: Reduce scope of variables where appropriate Sam Spilsbury 2010-10-19 composite.cpp: minor cleanup, don't keep things in scope if they don't need to be (static analysis) Sam Spilsbury 2010-10-19 compiztoolbox: make functions public Sam Spilsbury 2010-10-19 blur: minor code cleanup (static analysis) Sam Spilsbury 2010-10-19 opengl: minor style fixups (static analysis) Sam Spilsbury 2010-10-19 kde4-window-decorator: minor style related changed (static analysis) Sam Spilsbury 2010-10-19 core: general code cleanup (static analysis) Sam Spilsbury 2010-10-19 Avoid a roundtrip Sam Spilsbury 2010-10-18 Take into account the server border width when calculating the texture size Sam Spilsbury 2010-10-18 We need to make a temporary copy of the color string since it is free'd on the temporary function call's destructor. Sam Spilsbury 2010-10-03 Don't attempt to re-use buffer pixmaps. It's not safe to re-use these pixmaps, because there isn't any guaruntee that they haven't been nuked by compiz Sam Spilsbury 2010-10-03 Don't reparent so overzealously. Also tweak offset code to handle shadow offsets. Unfortunately this breaks some themes. However, the standard ones such as Clearlooks and friends should continue to work Merge: e9574b4 0301c9f Jason Smith 2010-10-15 Merge branch 'master' of ssh://anongit.compiz.org/git/compiz/core Scott Moreau 2010-10-14 Get rid of Prev/Next Slide since they are entirely unused. Scott Moreau 2010-10-14 Paint all viewports if caps are transparent. Jason Smith 2010-10-07 Ensure g type is setup Scott Moreau 2010-09-30 Remove unused variables to silence warnings. Scott Moreau 2010-09-30 Handle top and bottom cap colors separately. Scott Moreau 2010-09-30 Remove cap image settings since it's handled by cubeaddons. Jason Smith 2010-10-04 Ensure we dont end up processing extra mouse events for no reason Scott Moreau 2010-10-03 Fix porting bugs. Jason Smith 2010-10-03 Revert ugly event hack as workaround in plugin is found Scott Moreau 2010-10-03 Remove duplicate if statement. Scott Moreau 2010-09-30 Remove unused variables to silence warnings. Scott Moreau 2010-09-30 Handle top and bottom cap colors separately. Scott Moreau 2010-09-30 Remove cap image settings since it's handled by cubeaddons. Sam Spilsbury 2010-09-29 Update INSTALL file Scott Moreau 2010-09-28 Don't require both opengl and composite since opengl already requires composite. This can cause flicker or momentary black screen with some drivers. Dominique Leuenberger 2010-09-28 Do not use deprecated gdk_display macro. Dominique Leuenberger 2010-09-28 Do not use gdk_display, it's deprecated (one more place it was missed). Sam Spilsbury 2010-09-27 Don't attempt to write the property if the template was not read in the first place Sam Spilsbury 2010-09-27 Don't use deprecated gdk_display symbol Sam Spilsbury 2010-09-27 Move list of compiz libs to compizplugin. New DSO linking rules require that plugins be explcitly linked to all of the compiz dependencies. Jason Smith 2010-09-30 Ensure we get lots of events on input windows. This is likely evil and needs a better fix Sam Spilsbury 2010-09-30 Clean up isViewable Merge: 8942e33 912aac9 Sam Spilsbury 2010-09-29 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-09-29 Update INSTALL file Scott Moreau 2010-09-28 Don't require both opengl and composite since opengl already requires composite. This can cause flicker or momentary black screen with some drivers. Dominique Leuenberger 2010-09-28 Do not use deprecated gdk_display macro. Dominique Leuenberger 2010-09-28 Do not use gdk_display, it's deprecated (one more place it was missed). Sam Spilsbury 2010-09-27 Don't attempt to write the property if the template was not read in the first place Sam Spilsbury 2010-09-27 Don't use deprecated gdk_display symbol Sam Spilsbury 2010-09-27 Move list of compiz libs to compizplugin. New DSO linking rules require that plugins be explcitly linked to all of the compiz dependencies. Merge: 5967495 02dae69 Jason Smith 2010-09-14 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Conflicts: src/screen.cpp Jason Smith 2010-09-14 Remove spare ; Sam Spilsbury 2010-09-14 Cleanup Merge: fc6a55e 840cbcc Sam Spilsbury 2010-09-14 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Jason Smith 2010-09-13 Stop using gio for polling as it just doesn't seem to work as expected. Scrolling issues are now gone. Merge: 1fe1ac8 72d099a Sam Spilsbury 2010-09-11 Merge branch 'master' of git+ssh://git.compiz.org/git/users/dbo/compiz-with-glib-mainloop Jason Smith 2010-09-10 minor changes Sam Spilsbury 2010-09-09 Force input focus on button 1/2/3 press. Sometimes there is a case where the window is active on one screen already, and because compiz is not multi-screen aware, when another window is focussed on another screen, the window will continue to be "active" but not focussed. Previously, when clicking on this window again, the window would not be focussed again since it was already active. This commit forces input focus regardless of the "active" state Sam Spilsbury 2010-09-09 Also obey force placement match when validating ConfigureRequest events. Forward port of d01732e22007018ca54d4dfe810202ee4d3ee16 to master Sam Spilsbury 2010-09-08 compiztoolbox.cpp: Move input focus to highlighted windows so it is possible to alt-f4 them switcher.cpp: Move input focus back to last active window if switcher action is cancelled Danny Baumann 2010-09-06 [PATCH] Replace old gdk_draw_drawable method calls with cairo equivalents. Scott Moreau 2010-09-02 Add reszie_from_center option. Sam Spilsbury 2010-09-09 Force input focus on button 1/2/3 press. Sometimes there is a case where the window is active on one screen already, and because compiz is not multi-screen aware, when another window is focussed on another screen, the window will continue to be "active" but not focussed. Previously, when clicking on this window again, the window would not be focussed again since it was already active. This commit forces input focus regardless of the "active" state Sam Spilsbury 2010-09-09 Also obey force placement match when validating ConfigureRequest events. Forward port of d01732e22007018ca54d4dfe810202ee4d3ee16 to master Sam Spilsbury 2010-09-08 compiztoolbox.cpp: Move input focus to highlighted windows so it is possible to alt-f4 them switcher.cpp: Move input focus back to last active window if switcher action is cancelled Danny Baumann 2010-09-06 [PATCH] Replace old gdk_draw_drawable method calls with cairo equivalents. Scott Moreau 2010-09-02 Add reszie_from_center option. Sam Spilsbury 2010-09-09 Force input focus on button 1/2/3 press. Sometimes there is a case where the window is active on one screen already, and because compiz is not multi-screen aware, when another window is focussed on another screen, the window will continue to be "active" but not focussed. Previously, when clicking on this window again, the window would not be focussed again since it was already active. This commit forces input focus regardless of the "active" state Sam Spilsbury 2010-09-09 Also obey force placement match when validating ConfigureRequest events. Forward port of d01732e22007018ca54d4dfe810202ee4d3ee16 to master Sam Spilsbury 2010-09-08 compiztoolbox.cpp: Move input focus to highlighted windows so it is possible to alt-f4 them switcher.cpp: Move input focus back to last active window if switcher action is cancelled Merge: 64ee56f 8531355 Sam Spilsbury 2010-09-06 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Danny Baumann 2010-09-06 [PATCH] Replace old gdk_draw_drawable method calls with cairo equivalents. Sam Spilsbury 2010-09-03 Kick the event loop so that we get glib events Sam Spilsbury 2010-09-03 Minor cleanup - add onTimerTimeout as a friend, adapt to coding style, fix warnings etc Scott Moreau 2010-09-02 Add reszie_from_center option. Jason Smith 2010-09-02 Reduce CPU usage by utilizing max times a bit Jason Smith 2010-09-01 Minor cleanup and stop constant removal/addition of drawing timer to help improve performance. There is a wakeup issue remaining to be resolved Jason Smith 2010-08-31 Reduce CPU load, probably breaks certain damage event paints Jason Smith 2010-08-31 Compiz now works fast with glib Jason Smith 2010-08-31 Initial timer support. Compiz actually runs (very slow) with bugs Jason Smith 2010-08-31 First pass at glib loop, invariably breaking things Danny Baumann 2010-08-29 Fix property handling. Sam Spilsbury 2010-08-28 Check property size before reading Sam Spilsbury 2010-08-28 Better checking if the window is destroyed and use the default visual and colormap, unless the window has request an ARGB one, in which case use that (like metacity). This fixes problems with windows which set incorrect colormap/visual combinations in their XSetWindowAttribs, like some SDL windows such as frozen-bubble and SDL/testwm Merge: 4befd8b 9f936c2 Sam Spilsbury 2010-08-21 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-21 Don't declare metacity funcs if we aren't using it Scott Moreau 2010-08-20 Properly fix warnings. Scott Moreau 2010-08-20 Fix warnings. Scott Moreau 2010-08-20 Fix warnings. Scott Moreau 2010-08-20 Fix warning. Scott Moreau 2010-08-20 Fix warning. Scott Moreau 2010-08-20 Fix typo. Scott Moreau 2010-08-20 Fix warnings. Merge: d661a59 afe7893 Sam Spilsbury 2010-08-20 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-20 Use X11 Window Properties for Shadow Settings Storage / Retreival. Remove the DBUS and GConf based settings retreival. It was long broken and based on a bunch of old assumptions Jay Catherwood 2010-08-17 Don't give all windows struts Sam Spilsbury 2010-08-17 Use isViewable () rather than invisible () Sam Spilsbury 2010-08-17 Revert "Revert "Keep pixmaps of unmapped windows around if they are used for animations."" This reverts commit e37b87173812da4af24c480a1adc9f8075a05e98. Sam Spilsbury 2010-08-15 Update dbus settings paths. Sam Spilsbury 2010-08-15 Bump COMPIZ_CUBE_ABI Sam Spilsbury 2010-08-15 Kill paintAllViewports and make a new wrapable function cubeShouldPaintAllViewports Merge: d57e882 bfa9742 Sam Spilsbury 2010-08-14 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-14 Split gtk-window-decorator into files Jay Catherwood 2010-08-12 Fix tooltip open animations not firing Sometimes tooltip open animations do not fire because they are set to viewable early on. This patch runs a map window notification when map is called even if the window is already viewable. Sam Spilsbury 2010-08-13 Revert "Keep pixmaps of unmapped windows around if they are used for animations." This reverts commit 6c7d254d7f7b3706e9a6294a1c16c7cc9a05568f. Danny Baumann 2010-08-13 Check with wmType () if the window is really a Dock or a Desktop window; window->type () can be changed depending on the state of that window (eg dock + below = normal). This can cause some dock and desktop windows to be decorated when they shouldn't be. Sam Spilsbury 2010-08-13 Revert "Fix decoration of windows of the wrong type in the decor plugin" This reverts commit 11a42a7e3fb9d42b7623ac2e4f391482af6020b5. Merge: b613c2f 9dfda73 Sam Spilsbury 2010-08-13 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-13 Update DBUS strings to get shadow correctly Sam Spilsbury 2010-08-12 Fix decoration of windows of the wrong type in the decor plugin Scott Moreau 2010-08-10 Don't use bool as int. Fixes 'inside cube'. Sam Spilsbury 2010-08-11 Use restack () instead of restackBelow () to ensure stack synchronousity Merge: 8f8a983 ccde9fb Sam Spilsbury 2010-08-10 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-10 Don't free a local variable by creating a pointer to it and then not knowing whether that pointer is actually heap or stack memory Sam Spilsbury 2010-08-10 Also include frame region in input region shape Sam Spilsbury 2010-08-10 Make minimize, unminimize and minimized () functions wrappable Sam Spilsbury 2010-08-10 Revert "Call wrapped hide and show functions for minimize and unminimize and also" This reverts commit 4e0bad2e7f8a1e16cec41f6909c19bab33d93e17. Sam Spilsbury 2010-08-10 Call wrapped hide and show functions for minimize and unminimize and also unite frame region with input shaped region (so that decorations don't lose input) Sam Spilsbury 2010-08-10 Use anchor stacking point as either directly above or directly below window when reparenting windows Sam Spilsbury 2010-08-10 Fix typo Merge: 8ba8b19 4e1a665 Sam Spilsbury 2010-08-10 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-08-10 Handle the ShapeInput and ShapeBounding XShape regions Jay Catherwood 2010-08-09 Fix gimp layers window disappearing This fixes bug 1303. Under certain circumstances restack ends up being called with the window as its own aboveId, causing it to disappear. Sam Spilsbury 2010-08-08 Make minimization functions wrappable. Check return functions for minimized state rather than internal variables (since a plugin may want to change the reported state of minimization) Sam Spilsbury 2010-08-07 Export the CompWindow in ScaleWindowList and don't prevent the creation of a ScaleSlot for a window if one isn't already assigned (with setSlot ()) Bump COMPIZ_SCALE_ABI Sam Spilsbury 2010-07-31 Handle property data types other than XA_CARDINAL and XA_STRING. Fixes window hints not being written for other data types, such as XA_WINDOW which is used by compiztoolbox for switcher background drawing Guillaume Seguin 2010-07-29 Workaround CMake problem with -D_REENTRANT on TryCompile Guillaume Seguin 2010-07-29 Fix typo Sam Spilsbury 2010-07-29 Increment count Sam Spilsbury 2010-07-29 Initialize XPolygonRegion arguments and use WindingRule Merge: ffbb452 7200386 Sam Spilsbury 2010-07-25 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-07-25 Add a constructor to initialize a CompRegion from a series of CompPoint's, much like the XPolygonRegion construct allows for Sam Spilsbury 2010-07-25 PropertyWriter went into core a while ago, no need to depend on compiztoolbox Scott Moreau 2010-07-24 Fix warnings. Sam Spilsbury 2010-07-19 Set scale slot geometry correctly. Fixes keyboard focus moving incorrectly Sam Spilsbury 2010-07-12 Determine the id of the appropriate child window and pass that as "window" for xbutton events in button actions. The previous behaviour was to pass the xbutton.window, but this was usually the frame wrapper window, which meant calls to screen->findWindow () would fail since this window was not in screen->windows (); Sam Spilsbury 2010-07-04 Update NEWS for 0.9.0 release Sam Spilsbury 2010-07-04 Fix debugging prefix Sam Spilsbury 2010-07-04 Add NEWS changes from 0.7.8-0.8.6 Sam Spilsbury 2010-07-04 Install and load local information from XDG_HOME/.compiz-1 to prevent conflicts with compiz-0.8 Sam Spilsbury 2010-07-02 Fix warning in annotate Sam Spilsbury 2010-07-02 Simplify serialization interface Sam Spilsbury 2010-06-23 Kill debug message Sam Spilsbury 2010-06-23 Add install type package vars to avoid a bug where we might install into "/" on some systems Sam Spilsbury 2010-06-19 Revert "[PATCH] Handle dock windows with keep-below mask." This reverts commit 2fb7e4227d516cd2ba8b81e411bbfc0aca127943. Handling dock windows like this causes problems for docks that are set above windows (like plasma panel) we need to find a better way to handle these windows Sam Spilsbury 2010-06-18 Kill debug messages Sam Spilsbury 2010-06-18 Add COMPIZ_ENABLE_PACKAGING option so that distros with default settings for prefix, etc don't override what the use has specified with CMAKE_INSTALL_PREFIX Also remove install (libcompiz.so), we use compiz_opt_install_file anyways for it Sam Spilsbury 2010-06-13 Add missing files Sam Spilsbury 2010-06-12 A few big changes: * Rewrite PropertyWriter, move it out of compiztoolbox * Added CompPluginStateWriter, a serialization interface, which plugins inherit, and specify how to serialize their class members, which will be automatically unloaded and reloaded as plugins unload and reload. * Currently there are bugs with this interface, so it is disabled by default (mostly bugs to do with boost and libdl) * Depend on libboost-serialization * A few bugfixes Adel Gadllah 2010-06-05 Install locale in standard location Translations should be in ${datadir}/locale not ${datadir}/compiz/locale Dominique Leuenberger 2010-06-01 [PATCH] Cmake: give more control to packagers - allowing them to specify install Allows developers to specify libbdir, datadir and bindir, just as they are used from autotools based projects. Additionally, this removes the need for packagers to fiddle with LIB_SUFFIX. Sebasian Billaudelle 2010-05-25 [PATCH] Handle dock windows with keep-below mask. Sam Spilsbury 2010-05-25 Load after decor plugin where appropriate to prevent windows shifting on plugin load and unload Sam Spilsbury 2010-05-23 Don't dump the template once we delete a property Sam Spilsbury 2010-05-23 Sanity check Sam Spilsbury 2010-05-23 Add getReadTemplate function and make plugins use that. This avoids some repetitive coding when setting up values to input into the property. Sam Spilsbury 2010-05-23 Use PropertyWriter in plugins which set window properties Sam Spilsbury 2010-05-23 Don't require opengl or composite, but load after them if available Sam Spilsbury 2010-05-23 Added generic X11 Window Property handler class which reads and writes window properties on a template Sam Spilsbury 2010-05-22 compiz_opt_install_file already adds destdir, no need to double it Sam Spilsbury 2010-05-22 Don't generate files to COMPIZ_DESTDIR Sam Spilsbury 2010-05-21 Link Xext explicitly because distributions are moving in the direction of requiring strict DSO linking Sam Spilsbury 2010-05-19 COMPIZ_DESTDIR support for windowsettings xml Sam Spilsbury 2010-05-19 Fix DESTDIR related typo Ensure no rpath linkage in kde4-w-d gtk-w-d and blur Danny Baumann 2010-05-19 Return resName as CompString so it can't be modified by the caller. Travis Watkins 2010-05-18 add resName getter Sam Spilsbury 2010-05-18 Added DESTDIR support for packaging Sam Spilsbury 2010-05-18 Make full rpath support optional (for those who need to build in a non-standard path) Sam Spilsbury 2010-05-15 Add ability to have bindings toggle scale mode Sam Spilsbury 2010-05-15 Cleanup linkage handling and use rpath for plugins. rpath is generally bad because it results in stupid linkage which can break with distribution upgrades (which is the reason for previous commits which use ldconfig LIBDIR). However, it doesn't appear to be against any distribution's policy to use rpath for "internal" libraries such as plugins linking against each other - so instead of adding those rather generic names to the ld.so cache, just specify an rpath, since there is no way there would be multiple versions of a plugin at once (and even then plugins would have to manually link). This *does* stretch the boundaries allowed by distributions slightly however, since other plugins usually have to link with libcomposite and libopengl in order to load them, however we have our own system of safeguard checks to ensure that the right plugins are loaded in any case (since the linkage will change dynamically on dlopen () - the initial linkage is only there so that dlopen () will not complain when it can't find the composite and opengl libraries, but in that case, it wouldn't even matter anyways since those plugins have to be loaded in order to be useful) For distribution policy, see: http://wiki.debian.org/RpathIssue http://fedoraproject.org/wiki/Packaging/Guidelines#Beware_of_Rpath Sam Spilsbury 2010-05-15 Typofix Sam Spilsbury 2010-05-15 CompizToolbox depends on composite and opengl, although it really shouldn't Sam Spilsbury 2010-05-15 Added compiz_ensure_linkage function and dropped some more rpath stuff Sam Spilsbury 2010-05-15 Add necessary changes to compile without rpath usage Sam Spilsbury 2010-05-14 Fix another build related typo Sam Spilsbury 2010-05-14 Fix typo Sam Spilsbury 2010-05-14 Never skip rpath Sam Spilsbury 2010-05-14 To be similar to autofoo it should be "make dist" Travis Watkins 2010-05-13 add soversion for libdecoration Travis Watkins 2010-05-13 build fixes Sam Spilsbury 2010-05-14 Added more commands to commands plugin. Some people use compiz as a standalone WM and require some ridiculous number of command shortcuts. We like to put options in to facilitate those people because we are nice :). Sam Spilsbury 2010-05-13 Add compiz_add_git_dist macro to CompizCommon Sam Spilsbury 2010-05-13 Fix warning Merge: ae325b9 e682cc2 Sam Spilsbury 2010-05-13 Merge branch 'master' of git+ssh://smspillaz@git.compiz.org/git/compiz/core Sam Spilsbury 2010-05-13 Ensure that plugins get correctly loaded after composite and opengl. Some plugins had an oversight which caused them to not load correctly due to a missing tag. Also some plugins should have been loading after these plugins. This fixes a potential glitch in newer versions of libdri. It also fixes ugliness in the mass redirection/unredirection of windows when the opengl plugin is loaded/reloaded Travis Watkins 2010-05-12 add a simple `make dist` target Sam Spilsbury 2010-05-12 Use configureXWindow and XConfigureWindow respectively instead of ::resize. ::resize and XMoveResizeWindow are mostly functions for internal use and they don't correclty configure the window the way we need it. This results in some weird display artefacts with the switcher popup window Sam Spilsbury 2010-05-11 A slightly more detailed description of what "Hover Timeout" actually does Sam Spilsbury 2010-05-11 Fix conditional jump or move being based on uninitialized values Sam Spilsbury 2010-05-09 Read decoration settings from the decor plugin and not the decoration plugin Sam Spilsbury 2010-05-09 Don't use pkg-config to link blur with libdecoration. Set the install rpath so that blur can be linked locally with libdecoration. This fixes a case where pkg-config would import wrong include files if 0.8.x was installed. Sam Spilsbury 2010-05-06 Kill some debug messages Sam Spilsbury 2010-05-06 Check to see if switcher grab does NOT exist before focusing default window (Previous behaviour was most likely a typo) Sam Spilsbury 2010-05-05 Move dbus to utility Sam Spilsbury 2010-05-03 Use corect calculation Sam Spilsbury 2010-05-03 Typofix Danny Baumann 2010-05-02 Optionally traverse through ancestry when getting the client leader of a window which has no own client leader set. Sam Spilsbury 2010-04-29 dbus: Use C++ bool Merge: a4c0bd1 4719477 Danny Baumann 2010-04-28 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Danny Baumann 2010-04-28 Add some additional accessor functions for more consistent class usage. Sam Spilsbury 2010-04-27 blur: link correctly with libdecoration Sam Spilsbury 2010-04-23 Don't recursively add plugins in folder Sam Spilsbury 2010-04-23 Move some buildsystem defines into CompizCommon Sam Spilsbury 2010-04-23 Fix double define Sam Spilsbury 2010-04-23 Move certain defines to CompizCommon Sam Spilsbury 2010-04-23 Use CompizDefaults to export file locations instead Sam Spilsbury 2010-04-23 Revert "Exported some CMake definitions so they can be used by other compiz" This reverts commit 4bbdbba18af7023e39b1c3055db26b5408c07e63. This should better be done in CompizDefaults.cmake Merge: 4bbdbba b7cdb45 Sam Spilsbury 2010-04-22 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-04-22 Exported some CMake definitions so they can be used by other compiz modules using CMake to work out where compiz is installed (for linking etc) Dennis Kasprzyk 2010-04-18 Typo. Scott Moreau 2010-04-16 Add hint so image button appears in ccsm. Sam Spilsbury 2010-04-12 Remove unneeded assignment Sam Spilsbury 2010-04-11 Fix wrongly drawn window icon in 3D gtk mode Merge: a48e55b 6b01b85 Sam Spilsbury 2010-04-11 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-04-11 Try and load non-rendering plugins after opengl and composite. Loading them before opengl and composite doesn't do any harm, but it causes an ugly flash while windows are reparented/unreparented then redirected/unredirected when loading plugins if compiz decides to insert them before the rendering plugins (since the rendering plugins must first be unloaded then reloaded as they are popped off the stack) Danny Baumann 2010-04-07 Fixup coding style. Merge: e4d22a6 cf77c69 Sam Spilsbury 2010-04-05 Merge branch 'master' of git://git.compiz.org/compiz/core Sam 2010-04-05 Fix slightly offset window decorations with certain metacity themes Sam 2010-04-04 Give inotify a more meaningful name Sam 2010-04-04 Move D-Bus plugin to correct category Danny Baumann 2010-04-04 Avoid excessive casting. Merge: 9fe1e7f 44f71ba Danny Baumann 2010-04-04 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Sam Spilsbury 2010-04-04 Correctly handle weird icon sizes. iw * ih may overflow the value range of unsigned long if iw and ih are large enough, so check the single values as well. Forward port of 1bed3dbcea6473f84745ec7a1f936c4f5d3b3a01 to master Scott Moreau 2010-04-03 Fix build. Errors introduced by 69c7f0cf084359d666447f4573d7cc8d8b6420d0 Sam Spilsbury 2010-04-04 Cube documentation update Sam Spilsbury 2010-04-04 Update openGL Plugin documentation Sam Spilsbury 2010-04-03 Composite plugin documentation update Merge: 2f545ec 1c9d411 Sam Spilsbury 2010-04-03 Merge branch 'master' of git://git.compiz.org/compiz/core Sam Spilsbury 2010-04-02 Fix offset window buttons in 2D mode for both gtk and cairo Sam Spilsbury 2010-04-02 Fix offset event window positions in cairo 2D mode bug Sam Spilsbury 2010-04-02 Fix drawing issues on bottom in cairo mode Sam Spilsbury 2010-04-02 Fix mis-aligned frame event windows Sam Spilsbury 2010-04-02 Fix further 2D GTK drawing issues Sam Spilsbury 2010-04-02 Fix offset window buttons in 2D mode for both gtk and cairo Sam Spilsbury 2010-04-02 Fix offset event window positions in cairo 2D mode bug Sam Spilsbury 2010-04-02 Fix drawing issues on bottom in cairo mode Sam Spilsbury 2010-04-02 Fix mis-aligned frame event windows Sam Spilsbury 2010-04-02 Fix further 2D GTK drawing issues Danny Baumann 2010-03-29 Revert broken define usage. Sam Spilsbury 2010-03-28 Fix rendering and frame position inconsistencies. For metacity themes especially, we ned to use d->context to determine frame size. There was an API change with gdk_window_reparent, so update for that too Sam Spilsbury 2010-03-28 Fix wrong decoration position and event handling in 2D mode scott 2010-03-24 Fix typo. Sam Spilsbury 2010-03-25 Fix typo and cleanup Sam Spilsbury 2010-03-24 Revert "Fix window position validation for windows changing size but not position" This reverts commit aea1f07bd4c4d157a26ab8571250dfa0df904144. Conflicts: plugins/place/src/place.cpp Sam Spilsbury 2010-03-24 Fixed partial decorations on decor plugin reload bug Sam Spilsbury 2010-03-24 Fixed deprecated symbol in gtk-window-decorator Sam Spilsbury 2010-03-24 C++ port of the D-Bus Plugin With additional cleanup by Danny Baumann See http://git.compiz.org/~smspillaz/dbus/commit/?id=bd4f98234e2af517d023b0ae9501ee0a91732fc2 Sam Spilsbury 2010-03-24 Documentation update for CompIcon, ModifierHandler, CompOutput, PluginClassStorage, PluginClassIndex, CompPoint, CompRect, CompRegion and CompSize Sam Spilsbury 2010-03-24 Fixed some documentation Merge: 323c800 19e7e51 Sam Spilsbury 2010-03-24 Merge branch 'master' of ../compiz-core-doc Sam Spilsbury 2010-03-23 Fixed missing left/right bits on 3d mode metacity Danny Baumann 2010-03-19 Cleanup Sam Spilsbury 2010-03-19 Keep pixmaps around if window has been unmapped on resize. Merge: b4d3d4e b5e0fc0 Sam Spilsbury 2010-03-19 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-03-19 Cleanup Sam Spilsbury 2010-03-19 Added 2D Decoration mode to GTK Window Decorator Sam Spilsbury 2010-03-18 Fix typo Sam Spilsbury 2010-03-15 Keep pixmaps of unmapped windows around if they are used for animations. Previously, they were discarded if the window was resized right after being unmapped. As that might end close animations too early, keep the pixmap around until setting the internal state to 'unmapped'. For those cases, the pixmap size (width/height) will differ from the window geometry (attrib.width/attrib.height), though, so plugins should use the former values for animation purposes. Forward port of 54833da0e3d8efb946dcb38afe27914a47f1565f to master Sam Spilsbury 2010-03-15 Remove deprecated functions and replace them with their alive counterparts. Sam Spilsbury 2010-03-15 Also place windows that are marked unmovable. As we assign the window actions ourselves, there's no sense in obeying it during placement, which would (and did) essentially disable placement for certain window types. Forward port of 58f85693bc1f4e612aaf0b6f1759e1734752f1ff to master Sam Spilsbury 2010-03-15 Link required libraries explicitly. Sam Spilsbury 2010-03-15 Fix window position validation for windows changing size but not position Previously, we left the position of windows that have USPosition set untouched, even if they didn't try to change position at all, but only changed size. This caused such windows to become partially offscreen e.g. if they were positioned at the lower edge of the work area before the size change and increased height afterwards. Forward port of 3c16152938c44454f42d08a4b92cc46093c9a782 to master Merge: b5e0fc0 5c15458 Kristopher Ives 2010-03-11 Merge branch 'master' of /home/kris/workspace/compiz Conflicts: include/core/window.h plugins/composite/include/composite/composite.h Sam Spilsbury 2010-03-09 Cairo mode almost done. Fixed crash to do with incorrect iterator usage Scott Moreau 2010-02-22 Properly calculate damage region. Scott Moreau 2010-02-22 Draw more finely granulated ellipse outline. Scott Moreau 2010-02-22 Add option to change erase size. Scott Moreau 2010-02-22 Use the same width for all lines. Scott Moreau 2010-02-22 Make corners of rectangles square while dragging. Scott Moreau 2010-02-22 General reorganization and cleanup. Scott Moreau 2010-02-22 Add option to use initial click point as center for drawing shapes. Scott Moreau 2010-02-22 Add straight line drawing function. Scott Moreau 2010-02-22 Draw ellipses instead of circles. Scott Moreau 2010-02-15 Fix longstanding damage issue. Dennis Kasprzyk 2010-02-15 Revert "Fix longstanding damage issue." This reverts commit 6da1124112165f35bea278281e709d96066125fa. Scott Moreau 2010-02-15 Fix longstanding damage issue. Guillaume Seguin 2010-02-15 Cleaner Xext dep Guillaume Seguin 2010-02-15 Addd libXext and libdl to core links Merge: c4ed4c1 5aad838 Sam Spilsbury 2010-02-13 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-02-13 Initial reparenting support Scott Moreau 2010-02-13 Categorize resize options. Scott Moreau 2010-02-13 Categorize switcher options. Dennis Kasprzyk 2010-02-13 Fake enlightment desktop property to make qt ignore the composite window during frame calculations. Dennis Kasprzyk 2010-02-13 Better detection of tooltip windows (KDE backport). Dennis Kasprzyk 2010-02-12 Kde 4.4 support. Dennis Kasprzyk 2010-02-12 Place frame windows in correct stacking order. Dennis Kasprzyk 2010-02-12 Unmap also the frame of minimized windows. Sam Spilsbury 2010-02-11 Clients must specify position on _NET_MOVERESIZE_WINDOW ClientMessage Only accept ConfigureRequest / _NET_MOVERESIZE_WINDOW ClientMessage events as placement if the application indicates that it wants to specify the window position. Forward port of 65ed618a5f36b795dbef69ba04ebde6b911d228c to master. Sam Spilsbury 2010-02-11 Fix screen resolution change handling Dennis Kasprzyk 2010-02-10 Missing files. Dennis Kasprzyk 2010-02-10 Window position doesn't have to be synced to update frame window region. Dennis Kasprzyk 2010-02-10 Integrate the KDE/Qt event loop directly into compiz instead of using the glib main loop. Sam Spilsbury 2010-02-09 Fix typo Merge: 9c0f5ea 1fec37d Sam Spilsbury 2010-02-09 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Dennis Kasprzyk 2010-02-09 Don't break initial stacking order. Sam Spilsbury 2010-02-09 Load after decoration Sam Spilsbury 2010-02-09 Fix DIV 0 Merge: 1ecf6ce fb94b80 Sam Spilsbury 2010-02-08 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Dennis Kasprzyk 2010-02-08 Fixed fullscreen window handling. Danny Baumann 2010-02-07 Simplify window removal. Danny Baumann 2010-02-07 Simplify window removal. Danny Baumann 2010-02-06 Fix selection aquiring, cleanup. Sam Spilsbury 2010-02-06 Fix invalid read Sam Spilsbury 2010-02-06 Properly send ClientMessage event after aquiring selections. Send appropriate ClientMessage for both the compositing manager and the window manager. Also rework appropriate functions Forward port of e86e5bee8ee6f1f265a76fef5fb0dc4e2c56be06 to master Dennis Kasprzyk 2010-02-04 Typo. Dennis Kasprzyk 2010-02-04 Fixed missing variable. Dennis Kasprzyk 2010-02-04 Reparent managed windows directly. Dennis Kasprzyk 2010-02-04 Catch NULL pointers. Dennis Kasprzyk 2010-02-04 Fixed region handling of new windows. Sam Spilsbury 2010-02-05 plugins: fix warnings Sam Spilsbury 2010-02-05 Fix typo and fix more warnings Sam Spilsbury 2010-02-05 core: fix more warnings Sam Spilsbury 2010-02-05 core: fix warnings Merge: 08c22af d6769e8 Sam Spilsbury 2010-02-05 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Conflicts: plugins/place/src/place.cpp Sam Spilsbury 2010-02-04 place: Improve resolution change handling. Windows are now moved/resized in a better way when changing resolution. Also, old window position and size will be remembered, so that they can be restored when going back to the original resolution. API changes were necessary in core, the functions ::updateStruts and ::updateWorkarea were moved from Private* to Comp* Forward port of 4327a7c83dc6c1fe77891ba7c6bf5023d21dfde8 Danny Baumann 2010-02-03 Fix wrappable count. Danny Baumann 2010-02-03 Advertise support for _NET_REQUEST_FRAME_EXTENTS. Danny Baumann 2010-02-03 Improve API. Sam Spilsbury 2010-02-03 Support _NET_REQUEST_FRAME_EXTENTS client message. Forward port of ef68d2cab3598a78de9b836c86fda7741d842870 to master Sam Spilsbury 2010-02-03 Advertise full placement support. 4521a0297386e183eb0374321ad677b4b1aaee97 Forward port of commit Sam Spilsbury 2010-02-03 Make addSupportedAtoms wrappable and use std::vector Sam Spilsbury 2010-02-03 Pixmaps created using glXCreatePixmap must be destroyed using glXDestroyPixmap We previously used glXDestroyGLXPixmap but this is wrong (according to GLX 1.4 spec, section 3.4.2). Forward port of 208b459b141b6d49f48796231146bb33d5dc1d26 to master Sam Spilsbury 2010-02-03 Apply stacking changes after configure Merge: bc1d53a 55656e8 Sam Spilsbury 2010-02-03 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-02-03 Fix possible segfault on 64-bit arch. due to passing 0 to va_list and retrieving it as pointer. 5a6dbfdea66620b3a6ae50540a75714e0a975ce7 to master Forward port of commit Sam Spilsbury 2010-02-03 Short cut placement output determination if there is only one output. Forward port of c02145a304e58fc502cb85499a1bbaf0dd843cea to master Sam Spilsbury 2010-02-03 Added option for placing newly mapped windows under the pointer. Forward port of 89c5642c737bba9d653fa242d1e0dd03cebb8db6 to master Sam Spilsbury 2010-02-03 Disable texture compression by default Forward port of 7c7628f2b6ad644afa6282b96b67e74ba1c48c2b to master Sam Spilsbury 2010-02-03 Revert "Update client list after unhook/insert." This reverts commit 8c7459734c497d20fd8682b2268336ba31297f73. Sam Spilsbury 2010-02-03 Update client list after unhook/insert. Forward port of d8285f4f8c6ca50b69965a225c36cdad1e456d24 Sam Spilsbury 2010-02-03 Activate the topmost window when lowering a window, unless click-to-focus is off. Forward port of 85ba708cb894658c9bf9862a311010a9b79ec6f2 to master Sam Spilsbury 2010-02-03 Use NULL instead of 0. Using 0 is unsafe on 64bit Dennis Kasprzyk 2010-02-02 Fixed cmake cache problems. Sam Spilsbury 2010-02-03 Fix inaccessible windows when reducing num. of viewports. Forward port of 0b9c5efe8c2b6fe60780b8c3245b4aaa8ecdc943 to master Sam Spilsbury 2010-02-03 rotate: Fix lost window by preventing edge flip for sticky windows. Forward port d8ac316d2d5790544adcef44b66c6f9f915dc6f0 to master Sam Spilsbury 2010-02-03 Prevent sticky windows from moving off-screen. Forward port of f02bf9d435def37d4587014a4548e8d99401f19d to master Sam Spilsbury 2010-02-03 Fix lost window by bringing window made sticky to current viewport. Forward port of 4bc44131442e9dbefadcad1a46932aec44bbcada to master Sam Spilsbury 2010-02-03 Fix crash in multi-screen setups. Forward port 24dea72a395071b533dcf66b2eef37b20522cbba to master Sam Spilsbury 2010-02-03 Fix Gnome keybinding list. Forward port of : c409afbf928d67b4a87360ba44e5f3a1df5b471d to master Sam Spilsbury 2010-02-02 Revert "Correctly reflect that the switcher window is managed." This reverts commit b27402c2460592bc3ed6c41c2b7d5cae47e79079. We should not allow plugins to directly write to w->managed, some core event should be used to set managed and recalculate the window state. Sam Spilsbury 2010-02-02 Revert "Fix typo" This reverts commit cb117afd36fd3e9efd07c2801fc9f6d79e706928. Sam Spilsbury 2010-02-02 Fix gravity handling. Forward port of 510c24577c47eb9d373a3817e0475187631a71e8 Sam Spilsbury 2010-02-02 Only keep windows on-screen that were fully on-screen before. Forward port of 0b05a30cdc65c3abd2d1564667c954125d18514e to master Sam Spilsbury 2010-02-02 Fix typo Sam Spilsbury 2010-02-02 Correctly reflect that the switcher window is managed. Forward port of 46371f9172089a3e60648b834611d5694df2e80b to master Sam Spilsbury 2010-02-02 Fix icon property reading if the icon pixmap has a depth of 1 bit. Forward port of 4c7ffc4f1d82414a466fa0768d16fa96f30e3f7a to master Sam Spilsbury 2010-02-02 Fix window region calculation for windows that have border width set. Forward port of 79a275b240a98d9f64c8dd1e799e5d469ec8f204 to master Sam Spilsbury 2010-02-02 Fix Handling of windows that have a server border set. Merge: 9c8edd0 26bb656 Sam Spilsbury 2010-02-02 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2010-02-02 Fix crash on opening windows We must defer match evaluation until window initialization has finished for all plugins as match evaluation means wrapped function calls. Forward port of 43c269a377e7b446fb1bb70732835b7395ce9524 to master Scott Moreau 2010-02-01 Implement shape drawing interface. Scott Moreau 2010-01-07 Fix typo. Scott Moreau 2010-01-26 Get erase button working. Sam Spilsbury 2010-01-22 Fix character encoding issue Sam Spilsbury 2010-01-22 Add appropriate operator overloads to CompPoint Sam Spilsbury 2010-01-21 Add some documentation on how geometry () and serverGeometry () work Dennis Kasprzyk 2010-01-07 Stupid porting bug. Erkin Bahceci 2009-12-25 Paint switcher icons at the same size. Forward port of 06f538d460b72a044e3da72f01d385890da43e84. Erkin Bahceci 2009-12-25 Remove unused switcher constants. Erkin Bahceci 2009-12-25 screenshot: Ignore files with trailing characters in the name. e.g: screenshot2.png.sig Forward port of 13293a056bf9a559c3f173c08ac074e5d07e7065. Erkin Bahceci 2009-12-25 wobbly: Obey move's constrain_y option. Constrains window to work area when it's thrown. Forward port from 0d23e499774769d295509f189fbf4b7c21763ef6, d7e84d079ee28c3d55451d3d1aa647ce477d3169, 57c7609a9975d760bdfd93f21c9a3d92cda206eb, d591d12076ec7d7c595911fbb1ac11529b5557a5, 615d823f5edc26eaa12e83c97099c7ab0f017968, 24dea72a395071b533dcf66b2eef37b20522cbba. Erkin Bahceci 2009-12-25 move: Don't constrain y on key/button move. Forward port from 57c7609a9975d760bdfd93f21c9a3d92cda206eb. Erkin Bahceci 2009-12-24 Don't use mipmap for icons. Forward port of 0138d355b849d675a82d57a2c293a96fff2bcaa2. Erkin Bahceci 2009-12-18 Resize constraint and snap for combined work area. Allows resizing across monitors while snapping/constraining to monitor work area edges. Forward port of 93d8762391d7c2ffedaa31f5fbb03913089e44ac, 53976f1916a6659a75e0159a4dfbc1fb2188d34f, and 57c7609a9975d760bdfd93f21c9a3d92cda206eb. Erkin Bahceci 2009-12-18 Add another contains method to CompRegion. Erkin Bahceci 2009-12-18 Add CompWindowGrabExternalAppMask. Erkin Bahceci 2009-12-16 Add notification for "before map". Erkin Bahceci 2009-12-15 Various minor optimizations. Erkin Bahceci 2009-12-15 Use CountedList instead of std::list. Erkin Bahceci 2009-12-15 Add CountedList class, a wrapper for std::list. This std::list wrapper is to be used for cases where size() needs to be called, since std::list.size() has linear complexity in gcc, whereas CountedList::size() has constant complexity, as it keeps a counter. Erkin Bahceci 2009-12-14 Fix crash when first switching after a window is minimized. In that case, the crash happened when the minimized window was highlighted in the switcher window. Danny Baumann 2009-12-07 Consolidate icon related functions and move them to window class. Merge: 05f393a a34f26b Sam Spilsbury 2009-12-07 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-12-07 Add a showIconOnly () virtual function to BaseSwitchScreen so that switchers can show the icon of applications only when switching Scott Moreau 2009-12-05 Properly expand variables. Dennis Kasprzyk 2009-11-26 Save right cursor coordinates. Dennis Kasprzyk 2009-11-18 Fixed image paths. Dennis Kasprzyk 2009-11-18 Less mallocs. Dennis Kasprzyk 2009-11-18 Speedup. Dennis Kasprzyk 2009-11-18 Avoid unneeded mallocs. Dennis Kasprzyk 2009-11-18 More getters. Dennis Kasprzyk 2009-11-18 Fixed build type for plugins. Eduardo Gurgel Pinho 2009-11-16 Getters to Cube Gears plugin usage. Scott Moreau 2009-11-09 Reorganize scale options Dennis Kasprzyk 2009-11-16 Initialize decoration with correct geometry of a reparented window. Dennis Kasprzyk 2009-11-16 Show decoration in a timeout to make sure that Qt gets the Reparenting related events first. Dennis Kasprzyk 2009-11-16 Fixed edge flipping. Dennis Kasprzyk 2009-11-16 Fixed action option handling. Erkin Bahceci 2009-11-16 Fix selected window appearing below others while switching. Happens only in certain cases (e.g. after showing gnome-panel tooltips). Sam Spilsbury 2009-11-16 Check variables in the correct order to shut up valgrind Sam Spilsbury 2009-11-16 Revert "Ensure identity matrix is actually identity and not an uninitialized matrix" This reverts commit b9592cab7fc1632b98f62b3afb8e6cc773ee0d7f. Merge: b9592ca 3e17ace Sam Spilsbury 2009-11-14 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-11-14 Ensure identity matrix is actually identity and not an uninitialized matrix Erkin Bahceci 2009-11-13 Fix typo, which caused the disappearing window issue. Erkin Bahceci 2009-11-06 Add optional max grid size param. to glAddGeometry. Erkin Bahceci 2009-11-05 Fix return issues. Dennis Kasprzyk 2009-11-04 Fixed window paint offset handling. Merge: 9f97563 790e4b7 Kristopher Ives 2009-11-04 Merge branch 'master' of git://anongit.compiz.org/compiz/core Scott Moreau 2009-11-03 Reorganize core options Scott Moreau 2009-11-03 Move rotate to desktop category and reorganize options Scott Moreau 2009-11-03 Move cube to desktop category and reorganize options Dennis Kasprzyk 2009-11-03 Final fix for overlapping outputs. Dennis Kasprzyk 2009-11-03 Removed unneeded variable. Dennis Kasprzyk 2009-11-03 Check for overlapping Outputs. Dennis Kasprzyk 2009-11-03 Provide a cmake option to control -Wsign-conversion compile flag. -Wsign-conversion is now off by default. Dennis Kasprzyk 2009-11-03 Set cmake policy. Dennis Kasprzyk 2009-11-03 Rotate C++ port. Dennis Kasprzyk 2009-11-03 Cube C++ port. Kristopher Ives 2009-10-28 Deleted auto backup files again. Kristopher Ives 2009-10-25 Added documentation for some internal classes. Fixed some old comments. Kristopher Ives 2009-10-25 Excluded *Wrap* from Doxygen. Fixed some old comments. Kristopher Ives 2009-10-25 Fixed some old comments syntax. Added some docs for some internals to CompPlugin. Added some docs for some internals for CompAction. Kristopher Ives 2009-10-25 Fixed some old /// docs. Added class description docs for some structs and classes. Kristopher Ives 2009-10-25 Added early docs for CompTimer and it's methods. Kristopher Ives 2009-10-25 Added some preliminary doc for how CompMatch works. Kristopher Ives 2009-10-24 Added some TODO comments for WindowInterface and helper struct/enums. Kristopher Ives 2009-10-24 Updated Doxyfile to ignore "_" and "Private" structs/classes. Removed plugins/ from doc. Separate Doxfile and docs/plugins is warranted. Kristopher Ives 2009-10-22 Started documenting composite plugin. Kristopher Ives 2009-10-22 Trying to make sure I'm not versioning autobackup files. Kristopher Ives 2009-10-22 Added Doxyfile. Started documenting core. Erkin Bahceci 2009-10-19 switcher: Fix crash when a minimized window closes while switching with "show minimized" on. (Forward port of 354adbe10a18509e9ea736cb3ec37916524cf8c3). Erkin Bahceci 2009-10-18 Add missing file with translation. (from 62be1227b85284e7a937457aa57f591a890baa02) Guillaume Seguin 2009-10-14 Fix charsets in some po files (cherry picked from commit 9bacbcd32859d960fbeb67fc9acf7671313443db) Guillaume Seguin 2009-10-13 Update translations Sam Spilsbury 2009-10-13 Scale interface changes: Make the ScaleSlot, ScaleType definitions global and expose getters and setters to control slot state, animation and the hoveredWindow. Also make ScaleSlot derive from CompRect Sam Spilsbury 2009-10-12 Fix typo Merge: 70c3860 3244717 Sam Spilsbury 2009-10-12 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Erkin Bahceci 2009-10-01 Link pthread (protobuf >= 2.1.0 needs it). Dennis Kasprzyk 2009-09-29 Fixed initial size problems. Erkin Bahceci 2009-09-25 move: Fix memory leak. Erkin Bahceci 2009-09-25 Fix crash when glGenerateMipmapEXT is unavailable. Danny Baumann 2009-09-14 Check returned geometry for validity prior to using it. Merge: 9b88320 d5c476c Sam Spilsbury 2009-09-09 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Erkin Bahceci 2009-09-06 wobbly: Snap to work area edges instead of output edges. Joel Bosveld 2009-09-04 Include gconf directory when building gtk/gnome/compiz-window-manager.c Merge: 082bf8c c2ca12e Sam Spilsbury 2009-08-29 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Dennis Kasprzyk 2009-08-27 Don't forget to update mipmaps. Merge: 18fbaa1 a768bd3 Dennis Kasprzyk 2009-08-27 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-08-27 Fixed mouse wheel calculations by providing correct global position. Erkin Bahceci 2009-08-23 wobbly: Fix artifacts. Erkin Bahceci 2009-08-23 Let windows be opened above fullscreen windows. Erkin Bahceci 2009-08-23 Avoid setting XSelectInput to NoEventMask for grabWindow. Prevents compiz from getting stuck at termination in ~CompWindow(). Merge: 9ac4fd0 f03d305 Sam Spilsbury 2009-08-23 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Erkin Bahceci 2009-08-21 Silence some warnings. Erkin Bahceci 2009-08-21 Delete array with delete []. Erkin Bahceci 2009-08-21 Fix memory leaks. Erkin Bahceci 2009-08-21 Remove sequences at termination. Erkin Bahceci 2009-08-15 Unsigned int conversions. Erkin Bahceci 2009-08-14 compiztoolbox: Close the user-dirs file when the XDG variable is not found. Erkin Bahceci 2009-08-14 Remove unused member variable. Erkin Bahceci 2009-08-14 Delete arrays with delete []. Erkin Bahceci 2009-08-14 opengl: Fix uninitialized member variable. Erkin Bahceci 2009-08-14 copytex: Fix memory leak. Erkin Bahceci 2009-08-12 Fix possible infinite loop. Erkin Bahceci 2009-08-12 glib: Fix deallocation issues. Sam Spilsbury 2009-08-12 Remove annotate and clone from legacy Erkin Bahceci 2009-08-11 Revert "Fix panels starting below other windows." This reverts commit d6f56253b2d2ffd8be1f6283fac2a3e13a45130c. This didn't work as expected, as windows' input was still above panels even though windows looked like they were behind panels, whenever the problem happened. When fullscreen mode is initiated in evince, this commit also caused windows to have their input in front of evince's fullscreen window even though the fullscreen window appears to be in front of them. This in turn triggered a freeze when the user clicks on the screen in evince while in fullscreen mode. Merge: 2a4208d 02dee3b Sam Spilsbury 2009-08-11 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-08-11 C++ port of the clone plugin, thanks for Erkin Baceci for proofreading Erkin Bahceci 2009-08-08 wobbly: Move disabling window paint functions to preparePaint. Erkin Bahceci 2009-08-08 annotate: Require opengl plugin. Erkin Bahceci 2009-08-08 wobbly: Disable functions in donePaint instead of preparePaint. Erkin Bahceci 2009-08-08 water: Fix typo. Merge: 51675c3 25d96f4 Sam Spilsbury 2009-08-08 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-08-08 C++ port of the annotate plugin Erkin Bahceci 2009-08-08 Add plugin categories and required features. Sam Spilsbury 2009-08-08 Use Sam Spilsbury 2009-08-08 Revert "Use " This reverts commit 1234ee9de9950799cefd7e62e8dad2167c6ac9af. Sam Spilsbury 2009-08-08 Use Merge: 223b935 6f4df47 Sam Spilsbury 2009-08-08 Merge branch 'master' of git+ssh://git.compiz.org/git/compiz/core Sam Spilsbury 2009-08-08 Remove debug message Erkin Bahceci 2009-08-07 screenshot: Use correct desktop directory by default. When the directory option is set to empty string (the new default), screenshot now uses getXDGUserDir () in compiztoolbox to get the correct desktop directory (from $XDG_CONFIG_HOME/user-dirs.dirs). Erkin Bahceci 2009-08-07 compiztoolbox: Add function to get XDG user dirs. Dennis Kasprzyk 2009-08-07 KDE4 window decorator KDE 4.3 port. Dennis Kasprzyk 2009-08-07 Don't update region if geometry is not in sync. Erkin Bahceci 2009-08-05 wobbly: Update snapping when "snap inverted" option value changes. Dennis Kasprzyk 2009-08-04 Added KAboutData. Dennis Kasprzyk 2009-08-01 Added support for posix 2008 scandir definition Sam Spilsbury 2009-08-01 Include cstdio and others instead of their C counterparts for g++ 4.4 compatibilty Sam Spilsbury 2009-08-01 Add homogenize, normalize, norm functions to GLVector from compiz-0.8 Erkin Bahceci 2009-07-30 C++ port of wobbly plugin. Erkin Bahceci 2009-07-30 switcher: Fix sign warnings. Erkin Bahceci 2009-07-30 More unsigned int to int conversion. Dennis Kasprzyk 2009-07-31 Changed unsigned int to int to fix warnings Dennis Kasprzyk 2009-07-31 Handle signed/unsigned correctly Erkin Bahceci 2009-07-30 Use -Wsign-conversion for compiling. Erkin Bahceci 2009-07-30 compiztoolbox: Add library linker flag. Erkin Bahceci 2009-07-29 composite: Move getTimeToNextRedraw to PrivateCompositeScreen. Erkin Bahceci 2009-07-29 composite: Added FPS limiter modes and optimalRedrawTime (). Joel Bosveld 2009-07-24 Shaped windows may have only one rectangle which is smaller than window. Fixes bugzilla.gnome.org/show_bug.cgi?id=589472 Erkin Bahceci 2009-07-24 Fix long standing typo. Erkin Bahceci 2009-07-23 Refactor switcher, move parts into toolbox library plugin. Erkin Bahceci 2009-07-23 Add CompRect::operator= (). Erkin Bahceci 2009-07-23 Add CompScreen::normalCursor (). Erkin Bahceci 2009-07-21 C++ port of screenshot plugin. Erkin Bahceci 2009-07-17 Convert Bool -> bool, TRUE -> true, FALSE -> false. Dennis Kasprzyk 2009-07-17 Use -Wall for compiling. Erkin Bahceci 2009-07-15 Fix panels starting below other windows. Erkin Bahceci 2009-07-14 inotify: Fix equality check. Erkin Bahceci 2009-07-14 Fix some compiler warnings. Erkin Bahceci 2009-07-13 Add notifications for show desktop mode. Erkin Bahceci 2009-07-08 Add hasUnmapReference and use it in decor. This prevents a window's decoration to be updated early while it is closing, which isn't necessary anyway. This problem leads to a close animation with an empty frame. Erkin Bahceci 2009-07-08 switcher: Set XClassHint for popup window. Erkin Bahceci 2009-07-08 Move hide/show to PrivateWindow, add wrapper hide/show. The new hide/show are used by switcher, so that it doesn't call minimize/unminimize. Joel Bosveld 2009-07-07 scale: when only scaling windows on current output, only display on current one Joel Bosveld 2009-07-03 CompRect: add set{Left,Top,Right,Buttom} functions Sam Spilsbury 2009-07-01 Move modifier handling into a separate top level class exposed to plugins Sam Spilsbury 2009-06-04 Make bool CompWindow::isFocussable () wrappable Sam Spilsbury 2009-06-05 Make CompWindow::alpha () wrappable Danny Baumann 2009-06-04 Minor cleanup. Sam Spilsbury 2009-06-04 Use boost::bind to tell the callback function the resize mode, don't figure that out within the function itself Merge: f06dcdd b3a2649 Erkin Bahceci 2009-06-03 Merge branch 'master' of git+ssh://cornelius@git.compiz-fusion.org/git/compiz/core Sam Spilsbury 2009-06-03 resize: fix compositingActive check Erkin Bahceci 2009-06-02 Separate clientList. Add clientList accessor. Joel Bosveld 2009-05-07 Add comments for changes to window restacking Joel Bosveld 2009-04-07 Restack windows in reverse, and stack above correct window. Previously this worked due to the order that the events arived in, however, now we want it to be stacked above correct window straight away so that we do not restack it again when configureNotify event comes through Joel Bosveld 2009-04-07 Restack window list immediately when calling reconfigureXWindow Previously, trying to restack multiple windows wouldn't work as expected, as the window list wasn't restacked until the configureNotify was recieved, which lead to it stacking the window above the wrong window Erkin Bahceci 2009-04-24 Register toggle-slow-animations action callback. Erkin Bahceci 2009-04-19 Add notifications for (un)minimize, (un)shade, close. Danny Baumann 2009-04-10 Allow overriding placement mode on a per-window basis. Merge: dd6de55 d2d7783 Erkin Bahceci 2009-04-08 Merge branch 'master' of git+ssh://cornelius@git.compiz-fusion.org/git/compiz/core Joel Bosveld 2009-04-06 Add CompWindowNotifyFocusChange Erkin Bahceci 2009-04-03 Add CompWindowNotifyBeforeDestroy. Erkin Bahceci 2009-04-03 Add CompWindow::pendingMaps (). Erkin Bahceci 2009-04-03 Add CompWindowNotifyBeforeUnmap. Dennis Kasprzyk 2009-04-03 Don't send Hide notify if window is already hidden. Dennis Kasprzyk 2009-03-29 Resize on shade. Dennis Kasprzyk 2009-03-29 Unwrap wrapper on shade. Dennis Kasprzyk 2009-03-29 Clear always texture list on release. Dennis Kasprzyk 2009-03-29 Update frame after resize. Dennis Kasprzyk 2009-03-29 Handle cases correctly where a window should be unmapped but isn't because a plugin increased its unmapReference. Erkin Bahceci 2009-03-26 Initialize static member defaultPaintAttrib. Erkin Bahceci 2009-03-26 Add incrementUnmapReference and incrementDestroyReference. Merge: 7831ff4 bc4b825 Danny Baumann 2009-03-20 Merge branch 'master' of git+ssh://maniac@git.compiz-fusion.org/git/compiz/core Danny Baumann 2009-03-20 Use inputRect method. Danny Baumann 2009-03-20 Add methods to get server geometry including decorations. Danny Baumann 2009-03-20 Add methods to get the window geometry rectangle including decorations. Dennis Kasprzyk 2009-03-20 Register action callbacks. Erkin Bahceci 2009-03-18 Add operator= to GLFragment::Attrib. Danny Baumann 2009-03-18 Remove leftover of previous glib plugin code and improve coding style a bit. Dennis Kasprzyk 2009-03-17 Added KDE/Qt event loop plugin. Dennis Kasprzyk 2009-03-17 Added GLib event loop plugin. Dennis Kasprzyk 2009-03-17 Link with libdecoration.so Dennis Kasprzyk 2009-03-17 Set right property name. Dennis Kasprzyk 2009-03-17 Pass returned events to callback. Dennis Kasprzyk 2009-03-17 Update PKG_CONFIG_PATH correctly. Dennis Kasprzyk 2009-03-17 Fixed timer handling. Dennis Kasprzyk 2009-03-16 Comments Dennis Kasprzyk 2009-03-16 Added version check. Dennis Kasprzyk 2009-03-16 Better BOOST check. Dennis Kasprzyk 2009-03-16 Add always findcompiz_install target to allow updates of the FindCompiz macro. Dennis Kasprzyk 2009-03-16 Add instalation prefix pkg-config path also in FindCompiz macro. Dennis Kasprzyk 2009-03-16 Improved RPATH handling. Dennis Kasprzyk 2009-03-16 Install to right folder. Dennis Kasprzyk 2009-03-16 Added optional install, that will not abort installation if file can't be installed. Danny Baumann 2009-03-16 Whitespace fixes. Danny Baumann 2009-03-16 Expose setDesktop function. Danny Baumann 2009-03-16 Remove useless enum declaration. Danny Baumann 2009-03-16 Auto-update matches when needed. It makes no sense to require callers that do certain actions on matches to call update () when we can do so as well. Danny Baumann 2009-03-16 Build fixes. Dennis Kasprzyk 2009-03-16 Added "all plugins in folder" example CMakeLists.txt Dennis Kasprzyk 2009-03-16 Fixed option initalisation. Dennis Kasprzyk 2009-03-16 Set the right option. Dennis Kasprzyk 2009-03-16 Don't crash if PrivateScreen is not initialized. Set the right option. Dennis Kasprzyk 2009-03-16 Check CompOption::Value type before setting it as option value. Dennis Kasprzyk 2009-03-16 Fixed linking. Dennis Kasprzyk 2009-03-16 Install headers to right folder. Dennis Kasprzyk 2009-03-16 Support any path for plugins. Dennis Kasprzyk 2009-03-16 Drop CompMetadata. Dennis Kasprzyk 2009-03-16 Avoid unneeded recompilation after cmake execution. Dennis Kasprzyk 2009-03-16 Moved to legacy. Dennis Kasprzyk 2009-03-15 Track core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Fix list initalisation. Dennis Kasprzyk 2009-03-15 Moved CompOption::Class to right class. Dennis Kasprzyk 2009-03-15 Track core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Apply core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Apply core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Apply core changes. Use bcop. Dennis Kasprzyk 2009-03-15 Use bcop in core. Dennis Kasprzyk 2009-03-15 Removed const from getOptions. Dennis Kasprzyk 2009-03-15 Use CompOption::Class. Dennis Kasprzyk 2009-03-15 Drop CompMetadata from plugin vtable. Added getOptions and setOption functions to plugin vtable template class. Dennis Kasprzyk 2009-03-15 Added base class for get/setOption(s) functions. Dennis Kasprzyk 2009-03-15 Initialize options without CompMetadata. Dennis Kasprzyk 2009-03-15 Don't package legacy directory Dennis Kasprzyk 2009-03-15 Moved all not yet ported files into legacy directory. Merge: 163f6b6 47d457a Dennis Kasprzyk 2009-03-15 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-03-15 New generalized build system. Merge: e3f9970 90b5d26 Erkin Bahceci 2009-03-14 Merge branch 'master' of git+ssh://cornelius@git.compiz-fusion.org/git/compiz/core Erkin Bahceci 2009-03-14 Rename Private* -> PluginClass* where appropriate. To improve/correct the meaning of some class and file names, this commit renames: core/privatehandler.h -> core/pluginclasshandler.h core/privates.h -> core/pluginclasses.h CompPrivateStorage -> PluginClassStorage PrivateHandler -> PluginClassHandler *PrivateIndex -> *PluginClassIndex Danny Baumann 2009-03-14 Moving the rectangle origin should not change its size. Danny Baumann 2009-03-14 Catch broken plugins that try to start timers without callback. Joel Bosveld 2009-03-09 Change stringFromMetadataPathElement to return a CompString This fixes the bug where missing tags in type="float" will result in a default value of 0.0 instead of 0.1 which leads to problems when trying to get the value Danny Baumann 2009-03-11 Minor cleanup. Sam Spilsbury 2009-03-10 Added iconGeometry getter and convert priv->iconGeometry to CompRect Danny Baumann 2009-03-11 Derive CompWindow::Geometry from CompRect and improve CompRect usage. Danny Baumann 2009-03-11 Include some commonly used methods to rectangle class: - get center point - get area - set position and size using appropriate classes - emptiness check - intersection methods Dennis Kasprzyk 2009-03-10 Support also Qt 4.4 Dennis Kasprzyk 2009-03-10 Added support for QT 4.5 raster graphicssystem. Dennis Kasprzyk 2009-03-10 Blur CompRect changes. Eduardo Gurgel Pinho 2009-03-06 Applying CompRect changes Eduardo Gurgel Pinho 2009-03-06 Better definition to CompRect Christopher Williams 2009-03-09 When a user tries to resize by clicking on the center, don't pass the input down to the window. Dennis Kasprzyk 2009-03-09 Fixed bluring. Dennis Kasprzyk 2009-03-09 Fixed fragment program delection/deletion. Danny Baumann 2009-03-08 Build fixes. Danny Baumann 2009-03-08 Always register as "compiz" to the SM, even if that doesn't match the binary name. Danny Baumann 2009-03-08 SM spec says that SmUserID is a required property. Danny Baumann 2009-03-08 Also save process ID to session manager. Danny Baumann 2008-11-04 Bring desktop files in line with gnome-session 2.24 changes. Danny Baumann 2008-10-21 Fix whitespace. Danny Baumann 2008-10-21 Align window menu to the right for RTL languages. Danny Baumann 2008-10-21 Fix fix formatting for RTL languages. Danny Baumann 2008-10-21 Invert button layout for RTL languages. Danny Baumann 2009-03-08 Always set the LIBGL_ALWAYS_INDIRECT environment variable to 1 if indirect rendering was requested. All AIGLX drivers need that environment variable to return the correct set of extension strings. Other drivers probably ignore the variable, but setting it shouldn't harm in any case. If we don't set this environment variable from inside compiz, we're breaking being restored from a session manager for users of those drivers. Danny Baumann 2009-03-08 Load scale after fade. Danny Baumann 2008-10-06 active_window_changed only updates d->active if decorations are present, so setting d->active before creating decorations may lead to incorrect results. Danny Baumann 2009-03-08 Added 'obs' plugin that handles bindings and matches for changing opacity, brightness and saturation of a window. Danny Baumann 2009-03-08 Fix opacity changes for "constant fade speed" mode. Danny Baumann 2009-03-05 Improve session API. Danny Baumann 2009-03-05 Robustness fixes for "~/.compiz/options directory is deleted" case. Danny Baumann 2009-03-05 Fix parsing of button and key strings. Danny Baumann 2009-03-05 Added set method for point object. Danny Baumann 2009-03-05 Avoid trying to open the same file more than once. Danny Baumann 2009-03-05 blur needs to be linked against libdecoration. Danny Baumann 2009-03-05 Fix wrong assert. Danny Baumann 2009-03-05 Fix geometry of fullscreen output. Danny Baumann 2009-03-05 Fix steps calculation. Danny Baumann 2009-03-03 Minor fixes and optimizations. Danny Baumann 2009-03-03 Added missing metadata for new options. Danny Baumann 2009-03-03 Added opengl plugin requirement. Danny Baumann 2009-03-03 Fix option tags. Danny Baumann 2009-03-03 Remove unresponsive window fadeout from opengl plugin. Danny Baumann 2009-03-03 C++ port of fade plugin. Danny Baumann 2009-03-02 Fix dynamic linking for the "libGL is not in ordinary path" case. Danny Baumann 2009-03-02 Optimizations. Danny Baumann 2009-03-01 Distinguish between unset and not matching option type. Danny Baumann 2009-03-01 Properly set lists. Danny Baumann 2009-03-01 Revert "Avoid warnings about wrong option type." This reverts commit 2ae100045cf31029d4afa1d7b7f0164035ec3c01. Danny Baumann 2009-02-28 Avoid warnings about wrong option type. Not sure whether we really want these warnings in the long term, though... Danny Baumann 2009-02-28 Fix coding style. Merge: 751bec0 59423aa Danny Baumann 2009-02-28 Merge branch 'master' of git+ssh://maniac@git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-02-27 Fixed wrong compare function (Fixes inifinite loop). Joel Bosveld 2009-02-27 Move CompOption::isAction to a static function and use in Value::action Joel Bosveld 2009-02-26 Warn if attempting to get wrong type from CompOption::Value Joel Bosveld 2009-02-26 Add conversion operators to CompOption::Value Danny Baumann 2009-02-27 Fix contains method and improve intersects method. Danny Baumann 2009-02-26 Fix excessive ping timer. Danny Baumann 2009-02-26 Store XWMHints structure and use it to fall back to legacy icon reading. Danny Baumann 2009-02-26 Coding style, optimizations. Danny Baumann 2009-02-26 Don't keep desktop hints set by last WM by default. Danny Baumann 2009-02-26 Prettify usage output. Danny Baumann 2009-02-26 Only use desktop from startup properties if it's actually set. Danny Baumann 2009-02-26 Remove key binding support from core. Danny Baumann 2009-02-26 Add missing metadata for gnomecompat plugin. Danny Baumann 2009-02-26 Add commands plugin which provides bindings for arbitrary commands. Danny Baumann 2009-02-26 Add missing methods. Danny Baumann 2009-02-26 Coding style improvements. Danny Baumann 2009-02-26 Pass reference instead of copying list. When copying the list, all autograb bindings are unregistered when the function is left. Danny Baumann 2009-02-26 Fix formatting of edge strings. Danny Baumann 2009-02-26 Add gnomecompat metadata to POTFILES.in Danny Baumann 2009-02-26 Adapt core for gnomecompat plugin addition. Danny Baumann 2009-02-26 Add Gnome compatibility plugin that receives key bindings only relevant for Gnome. Danny Baumann 2009-02-26 Make sure active fullscreen windows are always on top. Previously, this was not the case if e.g. a dock window with above state is present. Danny Baumann 2009-02-26 Improve strut handling. Danny Baumann 2009-02-26 Added support for _NET_WM_FULLSCREEN_MONITORS property. Danny Baumann 2009-02-25 Revert "Do not change input focus when EnterNotify event is generated from" This reverts commit e68eb0117b32fea441c662e621e998724281aa58. Rationale: When doing a drag-and-drop operation from one window to another, the drop target ends up without being focussed despite the mouse pointer being in it. This is unwanted and confusing behaviour. Danny Baumann 2009-02-06 Also set foreground color for switcher. Danny Baumann 2009-02-25 Re-sync place plugin to 0.8 branch. Danny Baumann 2009-02-25 Set libwnck client type to "pager" so "move to desktop x" works properly together with the constraining code in place plugin. Danny Baumann 2009-02-25 Coding style fixes. Danny Baumann 2009-02-25 Get plugin loading improvements from 0.8 branch and add --debug command line parameter that enables logging of CompLogLevelDebug messages on stdout. Danny Baumann 2009-02-25 Coding style improvements. Danny Baumann 2009-02-25 Add contains method that determines if a rect contains a given point. Danny Baumann 2009-02-25 Fix damage if no windows are left after relayouting. Danny Baumann 2009-02-25 Use references to pass around strings. Danny Baumann 2009-02-25 C++ port of regex plugin. Danny Baumann 2009-02-25 Fix &=, |=, | and & operators. Danny Baumann 2009-02-25 Fix crash and some memory leaks. Danny Baumann 2009-02-25 Add missing method declaration. Danny Baumann 2009-02-25 Fix ini file path creation. Danny Baumann 2009-02-25 ABI version 0 means "not loaded", so better use 1. Patrick Niklaus 2009-02-23 Add directory hint to screenshot metadata Danny Baumann 2009-02-22 Scale plugin API improvements: - Provide getters for state, grab, window list and custom (user provided) match - Provide getter for "window has slot" information - Make relayoutSlots () a method instead of an action and allow a match being passed to it. If a match is provided, it overrides scale's own match. Danny Baumann 2009-02-22 Improve const correctness. Danny Baumann 2009-02-22 Option API improvements: - Better reference usage - Improve const correctness Danny Baumann 2009-02-22 Match API improvements: - Provide != operator and emptiness check method - Provide empty match - Improve const correctness Merge: 2263479 27cc9c5 Dennis Kasprzyk 2009-02-13 Merge branch 'master' of git+ssh://git.compiz-fusion.org/git/compiz/core Dennis Kasprzyk 2009-02-13 Fixed readImageToTexture. Christopher Williams 2009-02-11 Fix compatibility with newer libmetacity-private versions. GtkStyle is colormap specific, so we can't use a new colormap each time we create a pixmap. Dennis Kasprzyk 2009-02-11 Little workaround for copy texture destruction after copytex plugin has been unloaded. Dennis Kasprzyk 2009-02-11 Fixed action initialisation without node. Danny Baumann 2009-02-02 Fix plugin names in metadata. Danny Baumann 2009-02-02 Rename metadata files of imgpng and imgsvg plugins correctly. Danny Baumann 2009-02-02 Added equality operator to CompPoint. Danny Baumann 2009-01-26 Use references for parameters of getAllowedActions function. Travis Watkins 2009-01-21 add xkbEvent getter Danny Baumann 2009-01-16 Optimization. Danny Baumann 2009-01-16 Fix plasma check (again). Dennis Kasprzyk 2009-01-16 Search for Plasma. Dennis Kasprzyk 2009-01-16 Added grabExist function. Dennis Kasprzyk 2009-01-15 Use infinite region for window type decorations of transformed windows. Dennis Kasprzyk 2009-01-15 Use infinite region for decorations of transformed windows. Dennis Kasprzyk 2009-01-15 Fixed iterator handling. Dennis Kasprzyk 2009-01-14 KDE 4.2 is not required to build compiz. Dennis Kasprzyk 2009-01-14 KDE 4.2 krunner dbus interface changes. Dennis Kasprzyk 2009-01-14 Fixed KWindowInfo::geometry usage. Dennis Kasprzyk 2009-01-14 Added support for changed KDE 4.2 decoration API. Dennis Kasprzyk 2009-01-14 KDE window decorator KDE 4.2 plasma support. Dennis Kasprzyk 2009-01-14 Wrap handleEvent. Dennis Kasprzyk 2009-01-12 Fixed pkg-config files for cross plugin linking. Dennis Kasprzyk 2009-01-06 Fixed pkg-config check. Dennis Kasprzyk 2008-12-22 Fixed plugin loader. Dennis Kasprzyk 2008-12-22 Added opengl dependency. Dennis Kasprzyk 2008-12-22 Compare actions before grab setting. Dennis Kasprzyk 2008-12-22 Handle unmap correctly. Dennis Kasprzyk 2008-12-22 Fixed problems with dynamic plugin loading. Dennis Kasprzyk 2008-12-22 Added opengl dependency. Dennis Kasprzyk 2008-12-22 Reset privates cache correctly. Dennis Kasprzyk 2008-12-22 Allow to set keycode/buttons/modifiers in CompAction. Dennis Kasprzyk 2008-12-22 Add/Remove screen actions in CompOption::set function. Dennis Kasprzyk 2008-12-17 Fixed plugin dependencies in metadata. Dennis Kasprzyk 2008-12-16 Install compiz-common.h Dennis Kasprzyk 2008-12-16 Fixed directory in pkg-config files. Dennis Kasprzyk 2008-12-16 Fixed dependencies in pkg-config. Dennis Kasprzyk 2008-12-16 Initialize variable. Dennis Kasprzyk 2008-12-16 Apply core changes. Dennis Kasprzyk 2008-12-16 New plugin loader system Dennis Kasprzyk 2008-12-16 No special handling of core metadata. Dennis Kasprzyk 2008-12-16 Added more flexibility to metadata initialisation. Dennis Kasprzyk 2008-12-15 Initial C++ port of the blur plugin. Dennis Kasprzyk 2008-12-15 Fixed private handling. Dennis Kasprzyk 2008-12-15 Delete array correctly. Dennis Kasprzyk 2008-12-15 Provide direct matrix element access. Dennis Kasprzyk 2008-12-15 Constructor to create a GLMatrix out of a float array. Dennis Kasprzyk 2008-12-15 Provide access to projection matrix. Dennis Kasprzyk 2008-12-15 Make Saturation weights public. Dennis Kasprzyk 2008-11-13 Provide last paint mask. Dennis Kasprzyk 2008-11-13 Privide current damage region. Dennis Kasprzyk 2008-11-13 Added shrink region functions. Dennis Kasprzyk 2008-11-04 Optimized wrapping. Dennis Kasprzyk 2008-11-04 C++ port of scale plugin (unfinished plugin plugin interface). Dennis Kasprzyk 2008-11-04 Provide XRectangle -> CompRect constructor. Dennis Kasprzyk 2008-10-29 Revert "Privode currentOutputDev." Merge mistake. This reverts commit bb9897ba04c4ac398c3218ab46d913338aeae94d. Merge: bb9897b a1bef18 Dennis Kasprzyk 2008-10-29 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-10-29 Privode currentOutputDev. Merge: b54d506 109cb2a Danny Baumann 2008-10-20 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Danny Baumann 2008-10-20 Fix typo. Danny Baumann 2008-10-20 Remove debug output. Danny Baumann 2008-10-20 C++ port of place plugin. Danny Baumann 2008-10-20 Provide initial viewport to plugins and improve const correctness. Danny Baumann 2008-10-20 Improve const correctness. Dennis Kasprzyk 2008-10-16 Rebuild plugin private index cache on plugin changes. Dennis Kasprzyk 2008-10-16 Fixed linking. Danny Baumann 2008-10-16 Made dependency on opengl plugin optional. Danny Baumann 2008-10-16 Simplify signatures of place and validateResizeRequest functions. Danny Baumann 2008-10-16 Reflect changes in screen class. Merge: 484e915 e5080c3 Danny Baumann 2008-10-16 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Danny Baumann 2008-10-16 C++ port of SVG plugin, untested so far. TODO: Make dependency on opengl plugin optional, so that images can be loaded without opengl plugin loaded. Danny Baumann 2008-10-16 Added rectangle equality operators. Danny Baumann 2008-10-16 Fix typo. Merge: 1d6177e 5e0264e Dennis Kasprzyk 2008-10-14 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-10-14 Made GLTexture derive from CompRect. Danny Baumann 2008-10-14 Remove inputHint function and expose helper functions that show if the window is mapped, viewable or focussable. Dennis Kasprzyk 2008-10-14 Provide convinence functions to access window geometry. Dennis Kasprzyk 2008-10-14 Made CompScreen derive from CompSize. Dennis Kasprzyk 2008-10-14 Made CompIcon derive from CompSize. Danny Baumann 2008-10-14 Revert "Wrap into damageWindowRect." This reverts commit b0cd1d11423061452d5d103afa9a4de6119c31a3. Dennis Kasprzyk 2008-10-14 Fixed match handling. Danny Baumann 2008-10-14 Wrap into damageWindowRect. Danny Baumann 2008-10-14 Fixed applying int options. Danny Baumann 2008-10-14 Define USE_METACITY and USE_GCONF in the source. Danny Baumann 2008-10-14 Fix plugin loading. Danny Baumann 2008-10-14 C++ port of PNG plugin. Danny Baumann 2008-10-14 Make updateDefaultIcon function public. Danny Baumann 2008-10-14 Better use of classes in icon and image handling. Dennis Kasprzyk 2008-10-14 Set raster position correctly. Dennis Kasprzyk 2008-10-14 Switch to a damage based texture rebind. Dennis Kasprzyk 2008-10-14 Optimized wrapped function usage. Dennis Kasprzyk 2008-10-14 C++ port of switcher plugin. Dennis Kasprzyk 2008-10-14 Don't allow empty icons. Dennis Kasprzyk 2008-10-14 Save texture size correctly. Dennis Kasprzyk 2008-10-14 Return new created icon. Dennis Kasprzyk 2008-10-14 Unmap frame together with window. Dennis Kasprzyk 2008-10-14 Link to currently installed libdecoration. Dennis Kasprzyk 2008-10-14 Allow changes of the default texture filter; Dennis Kasprzyk 2008-10-14 Drop never implemented direct base function call. Dennis Kasprzyk 2008-10-13 Provide window icons as texture. Dennis Kasprzyk 2008-10-13 Provide access to default icon. Dennis Kasprzyk 2008-10-13 CompIcon API cleanup. Dennis Kasprzyk 2008-10-13 Fixed header. Dennis Kasprzyk 2008-10-13 Getter for CompScreen activeNum. Dennis Kasprzyk 2008-10-13 Provide invisible cursor. Dennis Kasprzyk 2008-10-13 Added getter function for current output device. Dennis Kasprzyk 2008-10-13 Added inputHint getter function. Dennis Kasprzyk 2008-10-13 Added check for inotify header. Danny Baumann 2008-10-13 Conversion is successful if key or button bindings are equal to "Disabled". Danny Baumann 2008-10-13 Check conversion result. Danny Baumann 2008-10-13 Make CompAction *FromString functions return the information whether the conversion was successful or not. Danny Baumann 2008-10-13 Fix excessive writes. Danny Baumann 2008-10-13 Fix event pointer. Danny Baumann 2008-10-13 Fix option reading and don't try to read config files for plugins without options. Danny Baumann 2008-10-13 C++ port of inotify plugin (untested so far). Danny Baumann 2008-10-13 Added function for retrieving the file watches. Danny Baumann 2008-10-13 Misc. fixes. Dennis Kasprzyk 2008-10-13 Escape special characters in installation prefix for regular expression. Dennis Kasprzyk 2008-10-13 Enable wrapped screen interface functions by default. Danny Baumann 2008-10-13 Act on file changes. Danny Baumann 2008-10-13 C++ port of ini plugin. Danny Baumann 2008-10-10 Avoid exception if match is empty. Danny Baumann 2008-10-10 Minor cleanup. Dennis Kasprzyk 2008-10-09 Added missing license headers. Dennis Kasprzyk 2008-10-09 Removed last bits of old build system. Dennis Kasprzyk 2008-10-09 Removed old file. Dennis Kasprzyk 2008-10-09 Cleanup private headers. Dennis Kasprzyk 2008-10-09 Cleanup .gitignore Dennis Kasprzyk 2008-10-09 Cleanups. Dennis Kasprzyk 2008-10-09 Drop KDE3 configuration plugin. Dennis Kasprzyk 2008-10-09 Drop KDE3 window decorator. Dennis Kasprzyk 2008-10-09 Drop autoconf/make build system. Dennis Kasprzyk 2008-10-08 Enable functions only if needed. Dennis Kasprzyk 2008-10-08 C++ port of water plugin. Dennis Kasprzyk 2008-10-08 Fixed fragment interface. Dennis Kasprzyk 2008-10-07 Link compiz against xdamage and xcomposite to prevent segmentation faults on shutdown. Dennis Kasprzyk 2008-10-07 Enable functions only if needed. Dennis Kasprzyk 2008-10-07 Enable paint function only if needed. Dennis Kasprzyk 2008-10-07 Enable functions only if needed. Dennis Kasprzyk 2008-10-07 Allow disabled wraping. Dennis Kasprzyk 2008-10-07 Sleep instead of polling for short timer periods. Dennis Kasprzyk 2008-10-07 C++ port of zoom plugin. Dennis Kasprzyk 2008-10-07 Allso changes to screen filters. Dennis Kasprzyk 2008-10-07 Export redraw time and optimize redraw timer handling. Dennis Kasprzyk 2008-10-07 Added copytex to build system. Dennis Kasprzyk 2008-10-06 Added CMake package generation and fixed compiling Dennis Kasprzyk 2008-10-06 Support config.h in build directory. Dennis Kasprzyk 2008-10-06 Provide pkg config files for composite and opengl plugins. Dennis Kasprzyk 2008-10-06 Generate compiz.pc Dennis Kasprzyk 2008-10-06 Provide summary configure output and create compiz-common.h Dennis Kasprzyk 2008-10-06 Move gtk/gnome specific parts to gtk/CMakeLists.txt Dennis Kasprzyk 2008-10-06 Add uninstall cmake target. Dennis Kasprzyk 2008-10-06 Initial version of CMake build system. Dennis Kasprzyk 2008-10-06 Added missing header. Dennis Kasprzyk 2008-10-06 Added main.cpp to POTFILES.in Danny Baumann 2008-10-05 Handle desktops a bit better. Danny Baumann 2008-10-05 Also treat utility, menu and toolbar windows as group transients. Danny Baumann 2008-10-05 Make sure window state property is correct when mapping windows. Danny Baumann 2008-10-05 Use changeWindowState function. Danny Baumann 2008-10-05 Change state property only on managed windows. Danny Baumann 2008-10-05 Ignore _NET_WM_STATE_HIDDEN property changes as suggested by EWMH. Danny Baumann 2008-10-05 Ensure windows fit in the work area when placing them by calling the window sizing validation function. Danny Baumann 2008-10-04 Make viewportForGeometry not take the current viewport into account. As the geometry passed to viewportForGeometry is not necessarily a window, it doesn't make much sense to assume so. Instead, move the return-current-viewport-if-window-is-on-it logic to the defaultViewportForWindow function. Danny Baumann 2008-10-04 Make sure geometry rectangle is kept inside the screen area. Danny Baumann 2008-10-04 Fix a number of potential memleaks in XGetWindowProperty return value handling. If a property with 0 items was set, the return value was leaked. Danny Baumann 2008-10-04 Use timer to start decorator. When starting the decorator from initScreen, user changes to a default decorator command are not reflected correctly. When starting it _only_ from the option change notification, no decorator is started if the default is non-empty and the user never changed it. Compromise is using a timer and hoping that the configuration plugin has initialized all options at next mainloop iteration time (which is the case for all known configuration plugins). Danny Baumann 2008-10-04 Build fix. Danny Baumann 2008-10-04 Use pendingMaps variable to set w->managed on MapNotify. Danny Baumann 2008-10-04 Only decrement pendingMaps variable when there are actually pending maps. Danny Baumann 2008-10-04 Cleanup: pass button and key events directly (instead of generic XEvent) into action handlers. Danny Baumann 2008-10-04 Call terminate function also for bindings without modifiers. Danny Baumann 2008-10-03 Typo & build fixes. Danny Baumann 2008-10-03 When the startup ID of a window changes, move it to current viewport instead of changing to the viewport of the window. Danny Baumann 2008-10-03 Make sure RGBA matching is always present for shadows. If the user added RGBA expressions to the match, use those. If the user did not add any RGBA expressions, turn off shadows for RGBA windows. Danny Baumann 2008-10-03 Add support for matching a window's alpha channel availability. Danny Baumann 2008-10-03 There is no real reason to arbitrarily remove shadows on below state windows. Danny Baumann 2008-10-03 Fix memory leak. Danny Baumann 2008-10-03 Improve focus stealing prevention. - Allow window focus if currently no window or only the desktop window is focussed. - Rename mode "High" to "Normal" and introduce "High" mode that denies focus attempts of windows not belonging to the active application. - Allow focus attempts of windows of the same application in Low, Normal, High modes. Danny Baumann 2008-10-03 Allow mouse initiated resize not only in the 4 corners, but in all directions. Danny Baumann 2008-10-03 Limit number of damage rects in one screen repaint. If the number of rects grows too much, we're using more resources managing the damage than doing the actual drawing. Danny Baumann 2008-10-03 Replace return to exit loop by break. Danny Baumann 2008-10-03 Pass client type of _NET_MOVERESIZE_WINDOW message sender to validate function. Danny Baumann 2008-10-03 Add definitions for EWMH source indication values. Danny Baumann 2008-10-03 On selected window changes, always clear out label first to make sure a text-changed signal is emitted to atk. Danny Baumann 2008-10-03 Added support for _NET_WM_MOVERESIZE_CANCEL. Danny Baumann 2008-10-03 Try to find the window under the pointer through the server if d->below is not valid. This may happen e.g. if focusDefaultWindow() is called right after moveScreenViewport(), as the EnterNotify event hasn't arrived at that time yet. Danny Baumann 2008-10-03 Also update d->below variable when we have a grab, so that it has the correct value after grab end. Needed e.g. for focussing the correct default window after viewport changes with click_to_focus disabled. Dennis Kasprzyk 2008-10-02 Initialize texture matrices correctly. Dennis Kasprzyk 2008-10-02 Fixed decorations of initially maximized windows. Dennis Kasprzyk 2008-10-02 Switch to 2d only if bind failed. Dennis Kasprzyk 2008-10-02 Use server geometry for window reparent. Dennis Kasprzyk 2008-10-02 Switch to 2D decoration if pixmap decoration fails. Dennis Kasprzyk 2008-10-02 Removed debug code. Dennis Kasprzyk 2008-10-02 Fixed damage handling. Dennis Kasprzyk 2008-10-02 Added support for multiple textures in background painting. Dennis Kasprzyk 2008-10-02 Copy pixmap to texture plugin. Dennis Kasprzyk 2008-10-02 Support for painting of multiple textures and hook for external bind pixmap to texture functions. Dennis Kasprzyk 2008-10-02 Provide helper typedefs. Dennis Kasprzyk 2008-10-01 Provide texture size informations. Dennis Kasprzyk 2008-09-30 Initialize variable. Dennis Kasprzyk 2008-09-30 Initialize variables correctly. Dennis Kasprzyk 2008-09-30 Added initial support for bind pixmap/load image to multiple textures. Dennis Kasprzyk 2008-09-30 Simplified privates API. Merge: b059cc8 58617a5 Dennis Kasprzyk 2008-09-25 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-09-25 Silence compiler. Dennis Kasprzyk 2008-09-25 Fixed frame shape. Dennis Kasprzyk 2008-09-25 Apply core changes to plugins. Dennis Kasprzyk 2008-09-25 Destroy region if needed. Dennis Kasprzyk 2008-09-25 Use CompRegion in core. Dennis Kasprzyk 2008-09-25 More region operators. Dennis Kasprzyk 2008-09-25 Adden CompRegion class. Erkin Bahceci 2008-09-24 Don't damage window region on minimize/shade ending. Slightly improves performance by not damaging the full window region at the end of minimize and shade animations. Dennis Kasprzyk 2008-09-24 Relayout during maximize. Dennis Kasprzyk 2008-09-24 Added support for 2D decorations. Dennis Kasprzyk 2008-09-24 Apply libdecoration changes. Dennis Kasprzyk 2008-09-24 Apply libdecoration changes. Dennis Kasprzyk 2008-09-24 Move frame region. Dennis Kasprzyk 2008-09-24 Add only root child windows. Dennis Kasprzyk 2008-09-24 Added support for 2D decorations. Dennis Kasprzyk 2008-09-24 Access to window texture and matrix. Dennis Kasprzyk 2008-09-24 Added support for 2D decorations. Dennis Kasprzyk 2008-09-19 Don't remove screen actions on shutdown. Dennis Kasprzyk 2008-09-19 Use correct event type for selection clear. Dennis Kasprzyk 2008-09-19 Add actions to screen after initialization. Erkin Bahceci 2008-09-18 Fix reading of floats in metadata for some locales. Dennis Kasprzyk 2008-09-18 Fixed stacking of override redirect windows. Dennis Kasprzyk 2008-09-17 Move core headers into core subdirectory. Dennis Kasprzyk 2008-09-17 Optimize rect,point and size classes and move headers to core/* Dennis Kasprzyk 2008-09-17 Cleanup CompWindow public API and move header to core/window.h Dennis Kasprzyk 2008-09-17 Cleanup CompScreen public API and move header to core/screen.h Dennis Kasprzyk 2008-09-17 Handle frame as stacking sibling correctly. Dennis Kasprzyk 2008-09-17 Unload plugins correctly on shutdown. Dennis Kasprzyk 2008-09-16 Initialize variable. Dennis Kasprzyk 2008-09-16 Destroy frame region later, because it might still be used. Dennis Kasprzyk 2008-09-16 Fix log system. Dennis Kasprzyk 2008-09-16 Make frame not "override redirect". Dennis Kasprzyk 2008-09-16 Preserve focus during reparent. Dennis Kasprzyk 2008-09-16 Decorate only managed windows. Dennis Kasprzyk 2008-09-16 Fixed lasy positioning. Dennis Kasprzyk 2008-09-16 Fixed variable initialisation. Dennis Kasprzyk 2008-09-16 Initialize window in correct order. Dennis Kasprzyk 2008-09-16 Apply core changes to metadata convertors. Dennis Kasprzyk 2008-09-16 Fixed composite plugin metadata. Dennis Kasprzyk 2008-09-16 Merged display and screen in resize plugin. Dennis Kasprzyk 2008-09-16 Merged core, display and screen in decoration plugin. Dennis Kasprzyk 2008-09-16 Merged display and screen in move plugin. Dennis Kasprzyk 2008-09-16 Merge display and screen in opengl plugin. Dennis Kasprzyk 2008-09-16 Merge display and screen in composite plugin. Dennis Kasprzyk 2008-09-16 Fixed private fetching. Dennis Kasprzyk 2008-09-16 Provide a plugin option helper macro. Dennis Kasprzyk 2008-09-16 Fixed wrap system indices. Dennis Kasprzyk 2008-09-16 Fixed private handling. Dennis Kasprzyk 2008-09-16 Drop never finished object handling. Dennis Kasprzyk 2008-09-15 Merge CompCore and CompDisplay into CompScreen class. Danny Baumann 2008-09-15 Use attrib getters from within CompWindow class. Danny Baumann 2008-09-15 Remove getter for w->attrib and use member getters instead. Merge: 6a7aa0c b544f2d Danny Baumann 2008-09-15 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Merge: c18feef 951153a Erkin Bahceci 2008-09-14 Merge branch 'compiz++' of git+ssh://cornelius@git.compiz-fusion.org/private/compiz into compiz++ Erkin Bahceci 2008-09-14 Fix list loop. Merge: 87e2986 951153a Danny Baumann 2008-09-11 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-09-11 Handle non shaping decorators correctly. Dennis Kasprzyk 2008-09-11 Update frame region together with window region change. Dennis Kasprzyk 2008-09-10 Update frame region during frame resize. Dennis Kasprzyk 2008-09-10 Improved handling of the "process killer" process. Dennis Kasprzyk 2008-09-10 C++ port of the resize plugin. Erkin Bahceci 2008-09-06 Use CompPlugin::List. Erkin Bahceci 2008-09-07 Use plugin and window maps for more efficient search. Dennis Kasprzyk 2008-09-02 Use a timer to create decoration. Dennis Kasprzyk 2008-09-02 Move window in a timer to prevent racing conditions after a window reparent. Dennis Kasprzyk 2008-09-02 Update only valid windows on decoration manager change. Dennis Kasprzyk 2008-09-02 Reparent window instead of simple input frame window. Dennis Kasprzyk 2008-09-02 Synchronize decoration creation. Dennis Kasprzyk 2008-09-01 Provide a system to set the frame window region. Dennis Kasprzyk 2008-09-01 Update .gitignore Dennis Kasprzyk 2008-09-01 - Added a type field to the decoration property. - Use a separate frame window for decorations. Merge: 0f15e3b 1f6d68d Danny Baumann 2008-08-29 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-28 Send show and hide notifies at the right position. Dennis Kasprzyk 2008-08-28 More flexible and ABI stable wrap system. Dennis Kasprzyk 2008-08-28 Fixed group transient calculation. Dennis Kasprzyk 2008-08-28 Added automatic unwraping. Dennis Kasprzyk 2008-08-28 Add object to parent, after it has been initialized in other plugins. Dennis Kasprzyk 2008-08-28 C++ port of the decoration plugin. Dennis Kasprzyk 2008-08-28 Send core object remove notification only if removeFromParent gets called. Dennis Kasprzyk 2008-08-28 Provide XDamage event base. Dennis Kasprzyk 2008-08-28 Provide mwm informations. Dennis Kasprzyk 2008-08-28 Provide XShape and XRandr event bases. Dennis Kasprzyk 2008-08-28 Added missing macros. Dennis Kasprzyk 2008-08-28 Privide access to texture mipmap parameter. Dennis Kasprzyk 2008-08-27 Privide access to window vertices in a Geometry class. Merge: 812354d 86ebffd Danny Baumann 2008-08-27 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-27 Update paint attriubutes if window alive status changed. Dennis Kasprzyk 2008-08-27 Release texture on unmap. Dennis Kasprzyk 2008-08-27 Fixed window damage on unmap. Dennis Kasprzyk 2008-08-27 Added plugin initialisation helper macros. Merge: 7b2be44 ac82488 Danny Baumann 2008-08-27 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-27 Moved composite handling and opengl painting into separate plugins. Dennis Kasprzyk 2008-08-25 Typo. Dennis Kasprzyk 2008-08-25 Use PrivateHandler in move. Dennis Kasprzyk 2008-08-25 Added preprocessor/template based helper class to handle plugin privated in the background. Dennis Kasprzyk 2008-08-25 Added a "object" prefix to type/typename/name object functions. Dennis Kasprzyk 2008-08-25 Ignore more files. Merge: 899020f d9affe8 Dennis Kasprzyk 2008-08-25 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Merge: 06aa2b6 01de7f7 Dennis Kasprzyk 2008-08-25 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-25 Shut up compiler warnings. Dennis Kasprzyk 2008-08-24 Save ABI in global map. Dennis Kasprzyk 2008-08-24 Added a global key/value storage to CompCore. Danny Baumann 2008-08-21 Shut up compiler. Dennis Kasprzyk 2008-08-21 Removed debug output. Dennis Kasprzyk 2008-08-21 Fix mem leaks. Dennis Kasprzyk 2008-08-21 Fixed segfaults. Dennis Kasprzyk 2008-08-21 Apply core changes to move plugin. Dennis Kasprzyk 2008-08-21 Shut up compiler warnings. Dennis Kasprzyk 2008-08-21 Cleanups. Dennis Kasprzyk 2008-08-21 Cleanup compiz[-core].h Dennis Kasprzyk 2008-08-20 Move Plugin related function into CompPlugin header. Dennis Kasprzyk 2008-08-20 Moved session related functions/structs into own header and namespace. Dennis Kasprzyk 2008-08-20 Store Windows in a STL list. Dennis Kasprzyk 2008-08-20 Store Screens in a STL list. Dennis Kasprzyk 2008-08-20 Store displays as STL list. Dennis Kasprzyk 2008-08-20 Store CompGroups in a list. Dennis Kasprzyk 2008-08-20 Renamed ScreenPaintAttrib to CompScreenPaintAttrib. Dennis Kasprzyk 2008-08-20 Renamed WindowPaintAttrib to CompWindowPaintAttrib. Dennis Kasprzyk 2008-08-20 Moved paint attributes to the right header files. Dennis Kasprzyk 2008-08-20 C++ port of CompMetadata. Merge: 94de9e6 cf58366 Dennis Kasprzyk 2008-08-20 Merge branch 'compiz++' of git+ssh://git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-20 Port of CompOption and CompAction to C++. Danny Baumann 2008-08-19 Fix return value. Danny Baumann 2008-08-19 Added missing file. Danny Baumann 2008-08-19 C++ implementation of matrix and vector. Merge: 3623907 79d78d3 Danny Baumann 2008-08-18 Merge branch 'compiz++' of git+ssh://maniac@git.compiz-fusion.org/private/compiz into compiz++ Dennis Kasprzyk 2008-08-18 Fragment interface C++ port (not tested). Dennis Kasprzyk 2008-08-14 Implementation of CompMatch as C++ class. Dennis Kasprzyk 2008-08-13 Moved definitions from compiz-core.h to the right headers. Dennis Kasprzyk 2008-08-13 Improved texture reset and shared pointer using. Dennis Kasprzyk 2008-08-12 CompIcon class and CompTexture cleanup. Dennis Kasprzyk 2008-08-12 Removed unused software cursor support. Dennis Kasprzyk 2008-08-12 Implemented CompTexture as real class. Dennis Kasprzyk 2008-08-11 Use boost function & bind to support static function and class member function callbacks. Dennis Kasprzyk 2008-08-11 Add Boost dependency. Dennis Kasprzyk 2008-08-11 Fixed screen paint timer behavior. Dennis Kasprzyk 2008-08-11 Implement Timeouts as CompCore::Timer class. Dennis Kasprzyk 2008-08-11 Rename CompMatrix to CompTextureMatrix. Danny Baumann 2008-08-08 Re-sync to master. Danny Baumann 2008-08-08 Re-sync to master. Dennis Kasprzyk 2008-08-08 Added new object private handling system. Dennis Kasprzyk 2008-08-08 Make CompObject smarter. Dennis Kasprzyk 2008-08-07 Fix grab handling. Dennis Kasprzyk 2008-08-07 Fix base class handling. Dennis Kasprzyk 2008-08-07 Fixed output handling. Dennis Kasprzyk 2008-08-07 Handle passive grabs as STL lists. Dennis Kasprzyk 2008-08-06 Implement screen grabs as STL list. Dennis Kasprzyk 2008-08-06 Use STL list to handle expose events. Dennis Kasprzyk 2008-08-06 Xinerama screeninfo is now a STL vector. Dennis Kasprzyk 2008-08-06 More CompPoint usage. Dennis Kasprzyk 2008-08-06 Use CompPoint/CompSize in CompScreen. Dennis Kasprzyk 2008-08-06 Use CompWindow::Geometry. Dennis Kasprzyk 2008-08-06 Added new CompSize, CompPoint and CompWindow::Geometry classes. Dennis Kasprzyk 2008-08-06 CompRect class. Dennis Kasprzyk 2008-08-06 .gitignore Dennis Kasprzyk 2008-08-06 Implement CompOutput as class. Dennis Kasprzyk 2008-08-06 Missing file. Dennis Kasprzyk 2008-08-06 Conversion ob main classes to C++. Dennis Kasprzyk 2008-07-25 Switch to c++ and compile with a basic set of plugins. Merge: 7658928 1938bdf Danny Baumann 2008-07-18 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-07-18 Initialize option value correctly. C-F Language team 2008-07-09 new translations and updates Danny Baumann 2008-07-09 Fix typo. Merge: 63fd486 37e75d2 Danny Baumann 2008-07-03 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Erkin Bahceci 2008-06-21 Allow terminating scale mode while entering. Danny Baumann 2008-07-03 Only move focus to window on click if it wasn't focussed before. Danny Baumann 2008-07-03 Improve ABI version check printout. Danny Baumann 2008-06-25 Revert "Don't focus default window when rotating due to window activation." This reverts commit 680bac110dd60d17575078fb6ae6b76cc588cfd1. Merge: 4035546 9b3f805 Danny Baumann 2008-06-25 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-25 Add missing glib includes. Dennis Kasprzyk 2008-06-24 Use default icon, if no icon is stored in the window properties. Merge: 680bac1 4271289 Danny Baumann 2008-06-19 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-19 Don't focus default window when rotating due to window activation. Dennis Kasprzyk 2008-06-18 Added synhronized timers. compAddTimeout now has a minimal and a maximal timeout time. This allows compiz to execute multiple timers at once and prevents unnecessary wakeups. Dennis Kasprzyk 2008-06-18 Use a single shot timer to prevent recursive repaint calls, if a decoration sets its mask during repaint. Dennis Kasprzyk 2008-06-17 Update switcher text background correctly. Danny Baumann 2008-06-15 Fix some minor memory leaks. Michael Vogt 2008-06-10 Re-sync Metacity button parsing code with Metacity to support new "spacer" feature. Danny Baumann 2008-06-09 Use icon geometry stored in CompWindow struct. Danny Baumann 2008-06-09 Bump ABIVERSION. Danny Baumann 2008-06-09 Store icon geometry in CompWindow struct. Danny Baumann 2008-06-09 Evaluate window match only for non-panel selection mode. Danny Baumann 2008-06-09 Revert "Update default window match to account for panel selection mode." This reverts commit 61ae58d463aa9478b282bebc62d3586a25319322. Danny Baumann 2008-06-08 Warning fix. Danny Baumann 2008-06-08 Plug some minor memory leaks. Danny Baumann 2008-06-07 Fix another mem leak. Danny Baumann 2008-06-07 Minor cleanup. Merge: d694817 0fb90da Danny Baumann 2008-06-07 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-07 Fix a number of memory leaks. Danny Baumann 2008-06-06 Minor cleanup. Merge: 45caca2 9a6a515 Danny Baumann 2008-06-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-06-04 Only move placed windows on decoration size changes. The geometry of not yet placed windows gets adjusted in the main MapRequest handler in event.c, so if we additionally move the window in the decoration plugin, the gravity is adjusted twice. Dennis Kasprzyk 2008-06-03 Look for plasma header file in kde 4 check. Dennis Kasprzyk 2008-06-03 Revert "Look for plasma header file in kde 4 check." This reverts commit 530268326a5fd42c72f0d92a1e153d55fbb7bd96. Dennis Kasprzyk 2008-06-03 Look for plasma header file in kde 4 check. Dennis Kasprzyk 2008-05-29 Post release version increment. Dennis Kasprzyk 2008-05-29 Add NEWS entry and bump version for 0.7.6 release. Dennis Kasprzyk 2008-05-29 Applied libdecoration changes to gtk window decorator. Dennis Kasprzyk 2008-05-29 Applied libdecoration changes to kde4 window decorator. Dennis Kasprzyk 2008-05-29 Applied libdecoration changes to kde3 window decorator. Dennis Kasprzyk 2008-05-29 Merged decor_blend_(top|bottom|left|right)_border_picture function into one common function. The new ignore_src_alpha parameter tells libdecoration to ignore the alpha channel of the src picture. C-F Language team 2008-05-24 translation updates Danny Baumann 2008-05-24 Optimizations. Danny Baumann 2008-05-24 Remove useless checks. As w->alive is unconditionally set to true when adding windows, it makes no sense to check if it's true. Danny Baumann 2008-05-24 Coding style fixes. Owen W. Taylor 2008-05-23 Fix initial map handling of opacity/brightness/saturation Make the handling of properties for opacity, brightness, and saturation consistent between initial map and subsequent updates: honor the properties even when the window has the DOCK type or is override redirrect. http://bugs.opencompositing.org/show_bug.cgi?id=955 Dennis Kasprzyk 2008-05-21 Use CompTransform for rectangle/outline painting. Dennis Kasprzyk 2008-05-20 The decorator won't get a button release event after resize and move, so we have to fake one to make qt act correctly. Dennis Kasprzyk 2008-05-18 Removed debug output code. Dennis Kasprzyk 2008-05-18 Disable Qt 4.4 "window less child widgets" feature to make button drawing work correctly again. Danny Baumann 2008-05-14 Cleanup. Dennis Kasprzyk 2008-05-14 Fixed cube skydome rotation. Danny Baumann 2008-05-14 Try to follow multi output option as close as possible when placing centered on screen. Danny Baumann 2008-05-14 Added option to place on output the focussed window is on. Danny Baumann 2008-05-14 Added optional placement to fullscreen output, which makes sense especially for smart window placement. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=643 Daniel Lea 2008-05-13 Fix skydome animation tilt behaviour. Danny Baumann 2008-05-13 Don't place windows that have dock or desktop type hint set. Danny Baumann 2008-05-13 Don't touch ConfigureRequest events of dock and desktop windows. Danny Baumann 2008-05-13 Minor coding style cleanup. Lubos Lunak 2008-05-13 Save program name to session manager. Don't save --replace command line argument. Merge: 40f876c 8b7d261 Danny Baumann 2008-05-10 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-05-10 Treat edge button bindings like edge bindings. Danny Baumann 2008-05-10 Make edge button bindings behave more meaningfully: If switching was initiated by an edge button, terminate switching on edge leave and proceed on each button press. Merge: 3b56af2 5ca3816 Danny Baumann 2008-05-09 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-05-09 Make corner resize behaviour consistent to Metacity. Danny Baumann 2008-05-09 Allow keyboard and window menu initiated resize being ended by a mouse button. Danny Baumann 2008-05-09 Initialize starting position correctly. Danny Baumann 2008-05-08 Don't set demands attention state on the active window. Dennis Kasprzyk 2008-05-06 Applied plasma API changes. Dennis Kasprzyk 2008-05-06 Paint cube caps if a plugin wishes it by setting cs->paintAllViewports. Dennis Kasprzyk 2008-05-06 Reset zoomout instead of progress for inside cube. C-F Language team 2008-05-02 translation updates Jigish Gohil 2008-05-02 remove plane from POTFILES.in Danny Baumann 2008-05-02 Only initiate window menu if we don't have an active grab. Otherwise, doing so might deadlock. Danny Baumann 2008-05-02 Added missing action check. Danny Baumann 2008-05-02 Allow minimizeWindow to minimize windows that don't have the minimize action set as this is desired e.g. for minimizing transients. Instead, check for the minimize action when minimization is triggered externally. Merge: cf34309 8a5eef9 Danny Baumann 2008-04-30 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-29 Added option for overriding USPosition and/or PPosition on certain windows. Danny Baumann 2008-04-29 Always accept PPosition hint. Dennis Kasprzyk 2008-04-26 Fallback to old texture target selection, to fix current broken tfp implementations. This workaround will be removed after the 0.8.0 release. Dennis Kasprzyk 2008-04-24 Bump core ABI. Dennis Kasprzyk 2008-04-24 Use full screen output if overlapping output devices have been detected. This prevents that parts of the screen get painted twice (xrandr clone modes). Dennis Kasprzyk 2008-04-24 Use PAINT_SCREEN_NO_BACKGROUND_MASK instead of wraping paintBackground. Dennis Kasprzyk 2008-04-24 Removed wrapable background painting. The core part of the background painting code stays as a fallback, if no desktop window is present and no other plugin provides a different background solution. Plugins can use the PAINT_SCREEN_NO_BACKGROUND_MASK screen mask to disable this fallback. Dennis Kasprzyk 2008-04-24 Removed background painting. The compiz fusion wallpaper plugin provides a better and more flexible for viewport independent background image solution. Dennis Kasprzyk 2008-04-24 Follow the "texture from pixmap" specification more strictly to avoid unnecessary calls to glxQueryDrawable during pixmap binding. Merge: b138660 56ddfec Danny Baumann 2008-04-24 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-24 Make adjustConfigureRequestForGravity return only the bits that were actually changed. Dennis Kasprzyk 2008-04-23 Do not try to generate mipmaps for TEXTURE_RECTANGLE targets, because the ext_frambuffer_object extension only allows this for TEXTURE_2D targets. Roland Bär 2008-03-20 Simplified, realloc on NULL is same as malloc Danny Baumann 2008-04-23 Make viewport placement options 1-based. Thus, the upper left viewport is (1|1) instead of (0|0), which is more intuitive. Danny Baumann 2008-04-23 Added sane minimum / maximum values for viewport placement. Danny Baumann 2008-04-23 Don't adjust configure requests of unmapped windows for gravity. Instead, apply gravity when mapping the window. Danny Baumann 2008-04-23 Only set CWX / CWY if the position was actually changed. Merge: e591ee8 f21c3b6 Danny Baumann 2008-04-22 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2008-04-22 Use fragment shader if a slightly saturated window texture is painted and lighting is enabled, because both can't be done with texture environments at the same time. Merge: 9bf73a1 9f12004 Danny Baumann 2008-04-21 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-21 Don't prevent focus for windows on other viewports if they are excluded from focus stealing prevention. Danny Baumann 2008-04-18 Don't allow to minimize/showdesktop unmanaged windows. Danny Baumann 2008-04-18 Remove plane plugin. The plane plugin has been superceded by the wall plugin in Compiz Fusion, which provides the same basic functionality as the plane plugin, but extends it by a lot more features. Current plane users are encouraged to use wall instead. Danny Baumann 2008-04-18 Disable resize handles for the directions the window is maximized to (leave only left and right enabled for vertically maximized windows, top and bottom for horizontally maximized windows). Dennis Kasprzyk 2008-04-16 Paint a viewport in cubePaintViewport instead of calling paintTransformedOutput and postPaintViewport. This allows plugins to do things before and after viewport painting. Danny Baumann 2008-04-15 Also use the multi output mode selection option when placing centered. Danny Baumann 2008-04-15 Only accept USPosition on non-normal windows during validation if workarounds are disabled. Decrease indention depth. Danny Baumann 2008-04-15 Only update accessibility helper label if switched window has actually changed. Show accessibility helper label by default. Danny Baumann 2008-04-15 Keep switcher window property at an invalid value as long as the switcher is not active. Danny Baumann 2008-04-15 Properly destroy popup windows on unload. Danny Baumann 2008-04-15 Cleanup. Danny Baumann 2008-04-15 Reduce code duplication. Danny Baumann 2008-04-15 Update default window match to account for panel selection mode. Danny Baumann 2008-04-15 Added panel selection mode to switcher plugin. Danny Baumann 2008-04-15 Minor cleanup. Danny Baumann 2008-04-15 Move style window offscreen to make sure it never is visible on screen. Guillaume Seguin 2008-04-14 Make gtk-window-decorator switcher window accessibility friendly Danny Baumann 2008-04-14 Fix whitespace. Danny Baumann 2008-04-14 Clamp new position if a viewport match was given. If the new position was outside the visible screen area before, the window would be placed on a viewport different to the one specified otherwise. Danny Baumann 2008-04-14 Make the placeGetPlacementOutput function return a CompOutput pointer. Danny Baumann 2008-04-14 Fix warning. Danny Baumann 2008-04-14 Place dialogs centered on current output device rather than centered on screen. Danny Baumann 2008-04-14 Added option for multi output behaviour of place and added a "Place on output which has the pointer" mode. Danny Baumann 2008-04-14 Improve readability of placement relevance helper macro. Danny Baumann 2008-04-14 Fix typo. Danny Baumann 2008-04-14 Initialize count variable correctly. Danny Baumann 2008-04-14 Add helper macro for looping over all placement relevant windows. Danny Baumann 2008-04-14 Pass work area into cascade placement functions. Danny Baumann 2008-04-14 Minor optimization. Danny Baumann 2008-04-14 Replace placeWin function by a better structured placeDoWindowPlacement function. Placement strategy ("What should placement do to this window?") and output determination as well as work area constraining have been factored out to separete functions. Danny Baumann 2008-04-14 Drop glib dependency of place plugin. Danny Baumann 2008-04-14 Factor out cascade placement into separate function. Danny Baumann 2008-04-14 Skip override_redirect windows during smart placement. Danny Baumann 2008-04-14 Consistently use Compiz coding style. Danny Baumann 2008-04-14 Improve looping over all visible windows. Danny Baumann 2008-04-14 window -> w Danny Baumann 2008-04-14 Improve macro usage. Danny Baumann 2008-04-14 Replace get_window_[width|height] functions by helper macros. Danny Baumann 2008-04-14 Improve define order. Danny Baumann 2008-04-14 Better function grouping / ordering. Danny Baumann 2008-04-14 Remove unused code. Danny Baumann 2008-04-13 Factor out adjustment of configure requests for gravity in a separate function and use this function to also adjust ConfigureRequest events of unmanaged windows for gravity. Dennis Kasprzyk 2008-04-10 Create vertices in different order to save some computations in other plugins (expo, cubeaddon). Dennis Kasprzyk 2008-04-10 Added screen mask to disable occlusion detection. Dennis Kasprzyk 2008-04-09 Combine projection results into one big rectangle, if vertex z values differ and only the vertex region extents get projected. Dennis Kasprzyk 2008-04-09 Disable backface culling during blur first pass rendering. Dennis Kasprzyk 2008-04-09 Moved viewport paint check into a wrapable function. Dennis Kasprzyk 2008-04-08 Flip cull face instead of disabling it. Dennis Kasprzyk 2008-04-08 Increased first pass shader buffer, to fix buffer overflows with gaussian shader radius bigger than 12. Dennis Kasprzyk 2008-04-08 Fetch blur texture in multiple indirection steps, if there aren't enough fragment shader temporaries. Dennis Kasprzyk 2008-04-08 Added glGetProgramiv to screen sturct to be able to get fragment program limitations. Dennis Kasprzyk 2008-04-07 Calculate rotation progress up to a finer level and damage screen if process is not zero. Dennis Kasprzyk 2008-04-07 Calulate cube opacity correctly on zoom out of manual rotation. Merge: b00ffee 2e1a5b0 Danny Baumann 2008-04-07 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-07 Above, shade, stick buttons are not available in Metacity <= 2.16. Dennis Kasprzyk 2008-04-04 C style comment. Dennis Kasprzyk 2008-04-04 Leave one free texture coordinate unit for fragment.position and use it also again in the blur shader. This should fix plugins that require fragment.position, if "independet texture fetch" is enabled in the blur plugin. Danny Baumann 2008-04-04 Keep Valgrind silent. Merge: f231964 5c0bad3 Danny Baumann 2008-04-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-04-04 If we got an empty rect, assume the button is not present. Danny Baumann 2008-04-04 Also set shaded flag. Danny Baumann 2008-04-04 Always also add the opposite button when adding a stick/above/shade button. Dennis Kasprzyk 2008-04-03 Post release version increment. Dennis Kasprzyk 2008-04-03 Add NEWS entry and bump version for 0.7.4 release. Danny Baumann 2008-04-03 Update German translation. C-F Language team 2008-04-03 translation updates Danny Baumann 2008-04-02 Remove some dead code. Danny Baumann 2008-04-02 Allow key and button bindings being used interchangably in move and resize plugins. This means it's now possible (again) to e.g. initiate move via a keyboard binding and terminate it using the mouse. Danny Baumann 2008-04-02 Allow shading for all kinds of decorated windows. Dennis Kasprzyk 2008-04-01 Bump core ABI. Erkin Bahceci 2008-04-01 Texture compression for image textures. Dennis Kasprzyk 2008-04-01 Reorder blur texture fetches, to fetch all pixels in one indirection step on radeon cards. Dennis Kasprzyk 2008-04-01 Added option for the independent texture fetch feature in blur. Dennis Kasprzyk 2008-04-01 Use constants in the shader code instead of program parameters. Dennis Kasprzyk 2008-04-01 Make as many as possible texture fetches independent in second pass of gaussian blur. Dennis Kasprzyk 2008-04-01 Make as many as possible texture fetches independent in first pass of gaussian blur. Dennis Kasprzyk 2008-04-01 Provide glMultiTexCoord2f in screen struct. Dennis Kasprzyk 2008-04-01 Bump cube ABI. Dennis Kasprzyk 2008-04-01 Moved multi output handling from rotate to cube to make it also work with inactive transparency. Dennis Kasprzyk 2008-04-01 Use cube progress to calculate cube transparency. Dennis Kasprzyk 2008-04-01 Pass cube progress in getRotation function. Dennis Kasprzyk 2008-04-01 Calculate a generic rotation progress value and use it to calculate the cube zoom out. Dennis Kasprzyk 2008-03-31 Typo. Merge: cf5c766 a1df59c Danny Baumann 2008-03-29 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-29 Avoid unnecessarily unloading plugins if the new plugin list does not contain the core plugin. Dennis Kasprzyk 2008-03-28 Enable "Drag and Drop" action state for rotate flip edges. Danny Baumann 2008-03-27 Also maximize too-big-for-workarea windows if their placement was skipped. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=827 Danny Baumann 2008-03-27 Recalculate window actions on frame size and transient status changes as the available actions depend on both. Danny Baumann 2008-03-27 Allow minimization for all normal type windows. Danny Baumann 2008-03-26 If we couldn't get the timestamp for the window, try to get at least the timestamp of its transient parent for determining if the window should get focus or not. Danny Baumann 2008-03-25 Correctly unwrap on unload. Merge: fe7c303 b824c7f Danny Baumann 2008-03-25 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-25 Fix a number of damage issues. Danny Baumann 2008-03-25 Remove all clones on unload. Danny Baumann 2008-03-23 Don't allow minimization of windows that don't have the minimize action set and reduce code duplication. Danny Baumann 2008-03-17 Always recalculate window type and actions when changing window state. Danny Baumann 2008-03-17 Recalculate window type before updating window state. When not doing that, certain plugins that rely on w->type being correct in the state change notification may behave incorrectly. Danny Baumann 2008-03-17 Update saved window geometry when adding/removing decorations. Otherwise, fullscreened windows jump by the decoration size each time the window is unfullscreened. Danny Baumann 2008-03-17 Don't set mask in addWindowSizeChanges if the new geometry matches the old geometry. Danny Baumann 2008-03-17 Don't send out sync request when nothing changed. Danny Baumann 2008-03-17 Send sync request when changing window size due to updating window attributes. Danny Baumann 2008-03-17 Adjust ConfigureRequest geometry for decoration size. Reference: https://bugs.freedesktop.org/show_bug.cgi?id=13589 Danny Baumann 2008-03-17 Don't send sync requests from reconfigureXWindow function. This is done on the caller side. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=793 Merge: d902325 bcf1058 Danny Baumann 2008-03-16 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-16 Use passed geometry for constraining min/max size rather than server geometry. The passed geometry might be different to the server geometry, so don't override the changes. Danny Baumann 2008-03-15 Improve comment and variable name. C-F Language team 2008-03-15 compiz translation updates Danny Baumann 2008-03-15 Also set w->managed on MapNotify event. When not doing that, w->managed can be wrongly set to FALSE on a mapped, non-override_redirect window if a client maps its window and unmaps it right after that. Scenario: - client calls XMapWindow and XUnmapWindow - we get MapRequest, set w->managed to true and map the window by calling XMapWindow - we get UnmapNotify (for client unmap) and set w->managed to false - we get MapNotify (for our map call) and don't set w->managed to true Danny Baumann 2008-03-15 Bump ABIVERSION. Danny Baumann 2008-03-15 Add nodelay hint to flip edges. Danny Baumann 2008-02-25 Also use screen edge delays for DnD actions. Danny Baumann 2008-03-15 Added screen edge trigger delay settings. Plugins intending to prevent edge delays should add the metadata hint to their edge options. Danny Baumann 2008-03-15 Add option for selecting the amount of focus stealing prevention. Danny Baumann 2008-03-15 The largedesktop plugins are responsible for switching viewports when a window is activated. Danny Baumann 2008-03-12 Switch viewports on window activation, not on focus change. Danny Baumann 2008-03-15 Make activateWindow function wrappable so plugins can react on window activation. Danny Baumann 2008-03-14 When a position match is given for a window, constrain the positiong to the output for the geometry given in the match instead of the current output. Danny Baumann 2008-03-13 Selected selected window when terminating scale instead of the last active window. When not doing that, selecting a window using the button binding would fail when click-to-focus is disabled. Jigish Gohil 2008-03-13 remove wrong be translation Dennis Kasprzyk 2008-03-12 Try to start decorator in initScreen because a value for DECOR_DISPLAY_OPTION_COMMAND might been already set in the xml metadata. Dennis Kasprzyk 2008-03-12 Use minimum and maximum "z" component for vertex projection. Dennis Kasprzyk 2008-03-12 Apply core changes to blur. Dennis Kasprzyk 2008-03-12 Use core changes in wobbly. Dennis Kasprzyk 2008-03-12 Use also "z" component in the vertex array, to ensure that plugins like blur that use the vertex array for calculations, can always work with all components. Dennis Kasprzyk 2008-03-12 Added vertexStride window variable. Dennis Kasprzyk 2008-03-12 Set and use w->texCoordSize; Dennis Kasprzyk 2008-03-12 Unredirect top most fullscreen window also if it only covers one output device. This also fixes unredirecting of applications/games that change the display resolution. Danny Baumann 2008-03-12 Remove sessionInit and sessionFini wrappable functions. They do not work as plugins may be (and most likely are) loaded after initializing the session. Replace their usage for retrieving the current and previous session ID with a getSessionClientId function. Store previous session ID for that. Danny Baumann 2008-03-10 Add another overlapping output handling mode "Smart". "Smart" basically is the old "Prefer larger" mode, selecting the output most part of the rectangle is on. "Prefer larger" and "Prefer smaller" only look for the rectangle center to determine the output. Danny Baumann 2008-03-10 Reduce duplicated code by reusing the outputDeviceForGeometry function to implement outputDeviceForPoint. For this, treat a point x,y just as a 1x1 sized rectangle which has its upper left corner at x,y. Danny Baumann 2008-03-10 Clamp point/geometry to compare to visible screen area. When not doing that, always the current output is returned for windows that aren't visible, which is not desired. Danny Baumann 2008-03-10 Make outputDeviceForGeometry behave smarter when dealing with overlapping outputs. Currently, the current output is returned if some part of the rectangle is on it; otherwise the output device the rectangle center is on is returned. This works fine for non-overlapping outputs, but with overlapping outputs, the window center may be on multiple outputs, making the determination ambiguous. This patch applies the following strategy instead: - Determine the output the largest part of the rectangle area is on. - If there are multiple outputs with equally large parts, return the best output based on a user-selectable strategy. - Otherwise, return the output that contains the largest part. This commit also reverts large parts of commit 1a233a20d1de2b504b707fe79ad36268e683eb5d. Dennis Kasprzyk 2008-03-10 Initialize output size correctly. Dennis Kasprzyk 2008-03-09 Added an option to control the selection of an output device, if the output regions overlap in the given point (xrandr 1.2 clone mode). Danny Baumann 2008-03-09 Minor coding style fix. Merge: 6c81f24 74c826b Danny Baumann 2008-03-09 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-09 Bump ABIVERSION. Danny Baumann 2008-03-09 Add a sessionInit and a sessionFini callback function. Use sessionInit to transmit information about client ids. Danny Baumann 2008-03-09 Generalize session event functions to have only one event function instead of four. Dennis Kasprzyk 2008-03-06 Post release version increment. Dennis Kasprzyk 2008-03-06 Add NEWS entry and bump version for 0.7.2 release. Roland Bär 2008-03-05 Avoid possible NULL pointer dereferences. Roland Bär 2008-03-03 Simplified logMessage() Merge: 34ea58c 9964fd9 Danny Baumann 2008-03-05 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-03-04 Invoke terminate function for edge buttons if button is released. Also set InitButton state for edge buttons. Danny Baumann 2008-03-04 Annotate draw is a dbus only action, reflect that in the metadata. Danny Baumann 2008-03-03 Don't switch viewports when a window requests to get focus. Instead, switch when the window actually got focus as its focus might have been prevented by focus stealing prevention, in which case the viewport change would be unexpected by the user. Danny Baumann 2008-03-02 Fix erase mode. This one improves the last attempt to fix the erase mode. Danny Baumann 2008-03-02 Revert "Fixed annotate erase mode." This reverts commit 40435f72073bb5747d1b63948807c207c31174b0. Danny Baumann 2008-03-02 Fixed annotate erase mode. Danny Baumann 2008-03-02 Always use the current window decoration extents instead of the custom decoration extents, which may not be currently used (e.g. if the window was excluded from decorations). Reference: http://bugs.opencompositing.org/show_bug.cgi?id=818 Danny Baumann 2008-03-01 Don't try to get button positions for undecorated windows. Reference: https://bugs.freedesktop.org/show_bug.cgi?id=14729 Danny Baumann 2008-03-01 Fixed annotate erase invocation and termination. Danny Baumann 2008-03-01 Correctly terminate move action if it was initiated by decoration button press and the button binding was not set to +Button1. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=725 Danny Baumann 2008-03-01 Clear window input extents when removing decoration from a window. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=818 Danny Baumann 2008-03-01 Make scaleSelectWindow wrappable so that subplugins can be notified of window selection. Merge: 965f77b ac4902c Danny Baumann 2008-02-27 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-27 Set cancel state when ending scale the same way as it was initiated. When not doing that, the last active window will be activated, which might be unintended, e.g. if the window is shaded. In general, we want scale to only activate windows if the user selected them by either using the mouse or the Return key. Danny Baumann 2008-02-27 Fix warning. Danny Baumann 2008-02-26 Correctly reflect changes to Gnome's DPI settings. Gtk+ emits a style-set signal in that case. Reference: http://bugs.opencompositing.org/show_bug.cgi?id=791 Merge: 84a105d 81a0ca4 Danny Baumann 2008-02-26 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-26 Update translatable files. Danny Baumann 2008-02-26 Use gettext to translate tooltips and dialog items of gtk-window-decorator. Dennis Kasprzyk 2008-02-26 Clear switcher content to make sure that the new background pixmap gets applied. Dennis Kasprzyk 2008-02-26 Rotate in right direction if hsize is 3. Patrick Niklaus 2008-02-25 Use visual and depth of the window to support RGBA. Danny Baumann 2008-02-24 Avoid possible NULL pointer dereferences. Roland Baer 2007-09-20 mem leak fix Merge: 3213fe9 7d2c53a Danny Baumann 2008-02-24 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-24 Make sure a window is selected after relayouting slots. Danny Baumann 2008-02-24 Revert "Select window under pointer right after ending the zoom out animation, so that a mouse move is not needed for that." This reverts commit e7f9fd9d0eed0ea2f661334fc8d8550da94be7ea. C-F Language team 2008-02-24 oops, readding deleted file C-F Language team 2008-02-23 translation update Danny Baumann 2008-02-23 Select window under pointer right after ending the zoom out animation, so that a mouse move is not needed for that. Shift around a few functions for that. Danny Baumann 2008-02-22 Don't change stacking order and focus if the user cancelled scale. Danny Baumann 2008-02-19 Updating the window size is sufficient to reflect workarea size changes. Danny Baumann 2008-02-19 Update maximized window's geometry if the screen workarea changed. Danny Baumann 2008-02-19 Prevent switcher window being re-placed by the decoration plugin by specificying a static window gravity. Danny Baumann 2008-02-19 Correctly unset TermButton / TermKey state. Dennis Kasprzyk 2008-02-18 Revert "Query bound pixmap texture target, if the fbconfig only reports rectangle texuture support, but the texture has power of two dimensions." This reverts commit 0686a202da4d949d668b2ad029a290659b86b777. This has been already fixed in the xserver for current AIGLX and the DRI2 TTM buffer object texture from pixmap implementation in the xserver will be also fixed before a release. Merge: a2bfb21 0686a20 Danny Baumann 2008-02-18 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-18 Fix saving session client id to session manager. Previously, it was not possible to simply omit the --sm-client-id when connecting to the SM as new client, which was needed to get Compiz connected to KDE's session manager. Now, the session id is always written to the SM and not only replaces the old session ID. Dennis Kasprzyk 2008-02-18 Query bound pixmap texture target, if the fbconfig only reports rectangle texuture support, but the texture has power of two dimensions. (known as the white shadows bug) Travis Watkins 2008-02-16 [PATCH] only allow rotate to faces that exist Danny Baumann 2008-02-15 Don't showdesktop grabbed windows. Danny Baumann 2008-02-15 Don't overwrite new client id with the one passed via command line. Danny Baumann 2008-02-14 Export session client id to sessionSaveYourself. Dennis Kasprzyk 2008-02-12 Do no register core path twice. Dennis Kasprzyk 2008-02-12 Do not try to produce broken introspection information for unknown option types. Christopher Williams 2008-02-08 Fix KDE3 and KDE4 configure checks. Danny Baumann 2008-02-08 Don't allow minimization of skip taskbar dialogs. Added a comment explaining why. Danny Baumann 2008-01-30 Added wrappable callback functions for session management events. Dennis Kasprzyk 2008-02-07 Post release version increment. Dennis Kasprzyk 2008-02-07 Add NEWS entry and bump version for 0.7.0 release. Danny Baumann 2008-02-07 Use outputDeviceForGeometry function for implementing outputDeviceForWindow to get rid of code duplication. Merge: c3f2d5e 155efce Danny Baumann 2008-02-07 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-07 Disable "Slow animations" key by default. This option has uses for debug and demo purposes only, but is not relevant for normal usage, so it should be unassigned by default. Dennis Kasprzyk 2008-02-07 Fixed handling of autogenerated files to make distcheck work again. Merge: d916969 a0d236e Danny Baumann 2008-02-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-02-04 Fixed list parsing. Danny Baumann 2008-02-04 Beautification. Randolph Chung 2008-02-04 Fix operator order. Dennis Kasprzyk 2008-02-01 Watch for plasma theme changes. Dennis Kasprzyk 2008-02-01 Set switcher backgound pixmap instead of only a color. Dennis Kasprzyk 2008-02-01 Use Plasma::Svg and some code from Plasma::Dialog to paint directly into a QPixmap. Dennis Kasprzyk 2008-02-01 Do not resize the decoration widget to the wrong dimensions first. Dennis Kasprzyk 2008-02-01 Set switcher selection color. Dennis Kasprzyk 2008-02-01 Allow the window decorator to change the selection rectangle color. Dennis Kasprzyk 2008-02-01 Add atom define that allows the decorator to change the color of the selection rectangle of the switcher window. Dennis Kasprzyk 2008-02-01 Removed old switcher code. Dennis Kasprzyk 2008-02-01 Include only needed headers. Dennis Kasprzyk 2008-02-01 Set blur property for the switcher window. Dennis Kasprzyk 2008-02-01 Use Plasma to draw the application switcher window. Dennis Kasprzyk 2008-02-01 Link against Plasma. Danny Baumann 2008-01-31 Give switcher window active window decorations. Danny Baumann 2008-01-31 Bump decorator interface version as decoration atom names changed. Danny Baumann 2008-01-31 Make decoration atom names part of the decoration interface. If those atom names do not match between decorator and decoration plugin, the decorator will be useless; so it makes sense to include them in the interface. Dennis Kasprzyk 2008-01-30 Use new atom names. Dennis Kasprzyk 2008-01-30 Use new atom names. Dennis Kasprzyk 2008-01-30 Update to new atom names. Dennis Kasprzyk 2008-01-30 Use _COMPIZ_ prefix for all decoration related atoms. Dennis Kasprzyk 2008-01-30 Use _COMPIZ_ prefix for all non stadardized decoration manager atom names. Dennis Kasprzyk 2008-01-30 Use _COMPIZ_ prefix to symbolize that this is a compiz private atom. Merge: 176a811 41b3fd8 Dennis Kasprzyk 2008-01-30 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2008-01-30 The KDE4 window decorator now only uses public KDE API (version >= 4.0.1) to build. Thanks to Lubos Lunak for making all needed parts public in KDE. C-F Language team 2008-01-29 translation update Merge: 327367d 3afa19f Dennis Kasprzyk 2008-01-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2008-01-28 Minor coding style enhancement. Guillaume Seguin 2007-07-28 * Add snap_bottom option * Do not snap when there are only 2 viewports Dennis Kasprzyk 2008-01-27 Check only for public KDE 4.0 decoration headers. (Will be available in 4.0.1 and 4.1) Merge: 0d27505 38e48f9 Dennis Kasprzyk 2008-01-24 Merge branch 'master' of git+ssh://onestone@git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2008-01-22 Added kde-window-decorator KDE 4 port. Dennis Kasprzyk 2008-01-22 Added KDE4 configure checks. Erkin Bahceci 2008-01-10 Do librsvg initialization/termination. Fixes the broken svg loading due to GLib-GObject-CRITICAL errors. Danny Baumann 2008-01-20 Allow minimizing non-transient dialog windows. Transient child dialog can be minimized by minimizing their parent, but non-transients can not; which is why we should allow them to be minimized. This change also allows that every window which has the minimize action allowed to be minimized by external applications (such as the decorator), which should be desired behaviour anyway. Danny Baumann 2008-01-20 Allow maximizing dialog windows. If the app doesn't intend to prevent size changes for the dialog (by setting minimum/maximum size constraints), there's no reason why we should prevent dialog maximization. Danny Baumann 2008-01-16 On shading, set input focus after setting the hidden state to make sure that the frame is properly focussed. Dennis Kasprzyk 2008-01-15 Wait for the proper configure (and map) events before rebinding the decoration pixmap. - On some systems the decoration widget window gets mapped first and resized after the map. KWD used a wrong window pixmap in this case. Compiz Fusion l10n team 2008-01-10 Translations update Michael Vogt 2008-01-08 [PATCH] metadata/schemas.xslt: - fix generation of the active_plugin list in the schema file C-F Language team 2007-12-22 translation updates Dennis Kasprzyk 2007-12-19 Decorate "menu" window type windows. Dennis Kasprzyk 2007-12-19 Add window actions "menu" type windows (ex. gimp detached menus). Dennis Kasprzyk 2007-12-19 Damage window extents correcly of windows with borders. Dennis Kasprzyk 2007-12-19 Draw cube caps correctly in inside cube mode. Merge: b762222 ceb2a71 Danny Baumann 2007-12-16 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-12-16 Change behaviour when an error on regex creation is encountered. Until now, on match handler was registered in that case. This leads to a compiz crash at the time the match is evaluated. Now, the handler is registered without regex data and the match is just evaluated to FALSE. C-F Language team 2007-12-12 translation updates Danny Baumann 2007-12-05 Correctly reset hoveredWindow variable on invoking scale. Merge: 079c30e a29c944 Danny Baumann 2007-12-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-12-04 Make sure that - transients and ancestors are always stacked correctly - sync requests are sent out appropriately whenever configureXWindow is called. Danny Baumann 2007-12-04 Only maximize windows that intend to be resized larger than the work area in both directions. David Reveman 2007-12-03 Add _NET_WM_STATE to _NET_SUPPORTED. Danny Baumann 2007-11-27 Fix calculations. Danny Baumann 2007-11-26 Cleanup. Also only clip placement on one side per direction. Windows that are outside the workarea on both sides can't be clipped properly anyways. Alyssa Hung 2007-11-25 * Also account for window borders when ensuring that transient windows are fully visible on the current workspace. Dennis Kasprzyk 2007-11-19 Use the kwin translation catalogue to provide a translated window menu. Jürgen Kreileder 2007-11-16 Fix copy'n'paste mistakes. Danny Baumann 2007-11-16 Make the window frame also process the configured actions for middle and right mouse button click, so that the frame behaves the same way as the title. Double click and scroll actions still are title-only as those actions are more "invasive" and might be confusing if triggerable from the frame. Δημήτρης (djdoo) 2007-11-15 el translation update Δημήτρης (djdoo) 2007-11-15 el translation update Jigish Gohil 2007-11-15 nb translation updated from Ketil W. Aanensen Jigish Gohil 2007-11-15 ko translation updates from Lee June Hee Jigish Gohil 2007-11-15 fr translation update from Tristan RABLAT Jigish Gohil 2007-11-15 pl translation from Maciej Warnecki Jürgen Kreileder 2007-11-15 Fix smart placement client size calculations. Danny Baumann 2007-11-13 NULL is allowed as sibling value, too. Merge: 58a6c8f 0c7c72a Danny Baumann 2007-11-12 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Roland Baer 2007-09-24 Return in out of mem condition Danny Baumann 2007-11-11 Give options passed over the command line priority over ones from gconf. To do that, store flags which options were passed and don't use the gconf values for those. Steven Robertson 2007-11-11 Fix window unsnapping for vertically arranged Xinerama heads. Danny Baumann 2007-11-11 Avoid possible dereference of NULL pointer; and fix duplicate variable declaration. Danny Baumann 2007-11-11 Fix dbus paths (shadow_offset_x/y -> shadow_x/y_offset). Danny Baumann 2007-11-11 Fix typos. Danny Baumann 2007-11-11 Wrap setOptionForPlugin function. Danny Baumann 2007-11-11 The display dbus path is now "display", no longer "allscreens". Danny Baumann 2007-11-09 The sibling found by findSIblingBelow might already be the active window, so include it in check. Danny Baumann 2007-11-08 Move restacking due to focus stealing prevention to updateWindowAttributes function. Rationale: This saves one unnecessary restack operation. Additionally, it has the advantage of automatically getting transient and ancestor stacking right without a separate decision tree. Danny Baumann 2007-11-08 Factor out retrieving the highest valid sibling under a given window into a separate function. Danny Baumann 2007-11-07 Don't restack ancestors on initial map. Rationale: A newly opened window most likely is put on top of the stack, thus the ancestors are raised. If the new window is denied focus later, the ancestors remain raised, which we do not want to happen. Danny Baumann 2007-11-05 tr translation update (closes #13094) Danny Baumann 2007-11-05 Fix whitespace. Roland Baer 2007-11-05 Removed dead condition/code Minor Danny Baumann 2007-11-05 Clip transient child placement to parent output instead of current output. Danny Baumann 2007-11-05 Minor optimization Danny Baumann 2007-11-03 Fix typo. Danny Baumann 2007-11-03 Prevent transient children being stacked below their parent if their focus was denied. Danny Baumann 2007-11-03 Bump ABIVERSION. Danny Baumann 2007-11-03 Whitespace fixes. Danny Baumann 2007-10-23 Avoid unnecessarily constraining window size. Danny Baumann 2007-10-22 Try to maximize window if it requested to be resized larger than the work area. Danny Baumann 2007-10-22 Improve calculations. Danny Baumann 2007-10-22 Added wrappable validateWindowResizeRequest function that can be used to adjust window resize request processing. Made place plugin wrap into this function and ensure the window remains inside the work area. Merge: 93d8d8b 868bb72 Danny Baumann 2007-11-01 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-11-01 Compare to wmType, not type variable. Docks that have below state flag shouldn't be hidden in showdesktop mode, so we have to have a look at the real window type. David Reveman 2007-10-30 Add --sm-disable option to kwd. David Reveman 2007-10-30 Reparent window just before mapping it and avoid hiding it when reloading decorations. David Reveman 2007-10-30 Don't remove WType_TopLevel bit when reloading decorations. David Reveman 2007-10-30 Make mCompositeWindow an X window instead of a QWidget. Merge: a0e5a42 168c7c3 David Reveman 2007-10-30 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-10-30 Remove whitespaces. David Reveman 2007-10-30 Reparent window instead of flipping the WType_TopLevel bit. Danny Baumann 2007-10-29 Fix call argument. Danny Baumann 2007-10-29 Move focusDefaultWindow function from display.c to screen.c. Danny Baumann 2007-10-29 Make focusDefaultWindow() take the screen as parameter. This avoids focus jumping between screens. Danny Baumann 2007-10-29 fr translation update (closes #12918). Danny Baumann 2007-10-29 pt_BR translation update (closes #12861). Danny Baumann 2007-10-24 Use CompVector. Danny Baumann 2007-10-24 Whitespacing. Danny Baumann 2007-10-27 Added CompVector type for describing vectors. Make the matrix and vector multiplication functions use CompTransform and CompVector as arguments. Danny Baumann 2007-10-24 Complete comment. Danny Baumann 2007-10-27 Added some matrix functions that can be useful for plugins. Danny Baumann 2007-10-24 Whitespacing. Danny Baumann 2007-10-24 Avoid duplicated defines. Danny Baumann 2007-10-23 Whitespace fixes. Danny Baumann 2007-10-23 Get rid of cached values for paint modifier options. Danny Baumann 2007-10-23 Allow DnD for scale edges. Danny Baumann 2007-10-23 Don't switch to selected window if switcher was cancelled. Danny Baumann 2007-10-19 Fix typo. Danny Baumann 2007-10-19 Also check if parent's Y coordinate is inside the current viewport. Danny Baumann 2007-10-19 We don't need to constrain y movement after placing transients. Danny Baumann 2007-10-19 Fix typo. Danny Baumann 2007-10-19 Set demands_attention hint everytime window focus was prevented. Merge: f0334e1 c9b1172 Danny Baumann 2007-10-18 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-18 Also set demands attention hint if focus was prevented because a window is on another viewport. Simplify code for setting demands attention if the focus stealing prevention match has applied. Danny Baumann 2007-10-18 Check inside of changeWindowState if state was actually changed instead of on the caller side. Danny Baumann 2007-10-17 Minor cleanup. Dennis Kasprzyk 2007-10-17 Use window Offsets to paint correct background. Danny Baumann 2007-10-17 Fix in-viewport calculation. Danny Baumann 2007-10-17 Prevent wobbling when shading maximized windows. Danny Baumann 2007-10-17 Added clear button option. Danny Baumann 2007-10-17 Added button options for minimize window and toggle window maximized. Danny Baumann 2007-10-17 Added close window button and raise/lower window key options. Danny Baumann 2007-10-17 Always allow focus for active window. Danny Baumann 2007-10-16 putenv doesn't work properly with dynamically allocated strings that are free'd right after the putenv call. Danny Baumann 2007-10-16 Run external commands with a DISPLAY string adjusted for the screen number that was passed to runCommand. Danny Baumann 2007-10-16 Get private pointer for the current screen. Tomas Carnecky 2007-10-12 Start window decorator on all screens. Danny Baumann 2007-10-16 Use real screen number rather than 0. Danny Baumann 2007-10-16 Use real screen number rather than 0. Merge: af11408 a999783 Danny Baumann 2007-10-16 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-15 Only send synthetic ConfigureNotify when ignoring ConfigureRequest events. We don't need to send a synthetic configure notify otherwise because we don't reparent. Danny Baumann 2007-10-15 Cleanup. Dennis Kasprzyk 2007-10-15 getWindowMovementForOffset should always return correct values, also for too big offsets. Danny Baumann 2007-10-15 We have to send the WM_TAKE_FOCUS message even if we directly set the input focus. Merge: 3a5a0c3 f26e7e6 Danny Baumann 2007-10-15 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-13 Clear all coordinates that match the server coordinates from the configure request mask to make sure a synthetic configure notify event is sent whenever needed. Merge: 8069a92 00e3b95 Danny Baumann 2007-10-12 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-11 Minor cleanup. Danny Baumann 2007-10-11 Update saved window coordinates when window is resized by some client. Danny Baumann 2007-10-11 We have a CompScreen* variable, use it. Danny Baumann 2007-10-11 Use client message timestamp rather than window user time when processing focus stealing prevention on _NET_ACTIVE_WINDOW messages. Danny Baumann 2007-10-11 Don't prevent focus for desktop and dock windows on arrival of a _NET_ACTIVE_WINDOW message. Danny Baumann 2007-10-10 Also update saved X position. Dennis Kasprzyk 2007-09-27 Fixed window offset calculation for multihead configurations. Dennis Kasprzyk 2007-09-27 Use setWindowPaintOffsets instead of moveScreenViewport in plane. Dennis Kasprzyk 2007-09-27 Use getWindowMovementForOffset in moveScreenViewport. Dennis Kasprzyk 2007-09-27 Use setWindowPaintOffsets instead of moveScreenViewport in cube. Dennis Kasprzyk 2007-09-27 Bump core ABI. Dennis Kasprzyk 2007-09-27 Added support for window paint offsets into painting system. Dennis Kasprzyk 2007-09-27 Added function to calculate window movement for a given offset. Dennis Kasprzyk 2007-09-27 Initialize windowOffsetX/windowOffsetY correctly. Dennis Kasprzyk 2007-09-27 Added new PAINT_WINDOW_WITH_OFFSET_MASK mask that indicates that a window will be painted with an offset. Dennis Kasprzyk 2007-09-27 Added setWindowPaintOffset function. Dennis Kasprzyk 2007-09-27 Use windowOnAllViewports in moveScreenViewport. Dennis Kasprzyk 2007-09-27 Added windowOnAllViewports function. Danny Baumann 2007-10-08 Fix typo. Danny Baumann 2007-10-08 Immediately update the internal stack representation on stack changes caused by MapRequest events. If we don't do that, the window is still at the top of the stack until the ConfigureNotify event arrives, which might be an invalid position. This could make subsequent stacking attempts (e.g. if there are more MapRequest events before the ConfigureNotify event) fail because the window might block other windows from getting their valid stack position. Danny Baumann 2007-10-06 Fix findLowestSiblingBelow function for desktop windows. No other windows are valid to be stacked below desktop windows. Merge: d54b5a5 674c062 Danny Baumann 2007-10-06 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-10-06 Correct handling of grab window in case it is destroyed. Danny Baumann 2007-10-06 Fix handling of ConfigureRequest events with CWStackMode set, but without CWSibling set. Danny Baumann 2007-10-04 Always use the old geometry passed to addWindowSizeChanges for comparisons. It's not guaranteed that the old geometry is exactly the same as the server geometry. Danny Baumann 2007-10-04 glGetString is allowed to return NULL in case an error happened, so avoid crashing in this case and bail out instead. Danny Baumann 2007-10-02 Remove initial stack sanitization. It's functionality is already done by addWindow (in case the window was mapped on startup) or the MapRequest handler. Danny Baumann 2007-10-02 Send synthetic configure notify events where needed according to ICCCM chapter 4.1.5. Specifically, we have to send them when a) moving or restacking a window without resizing it b) not reacting to ConfigureRequest events. Danny Baumann 2007-10-02 Don't touch override_redirect windows on initial sorting. Danny Baumann 2007-10-02 An aboveId of None means that the window was placed on bottom of the stack, so also update the linked list accordingly. Danny Baumann 2007-10-02 Don't restack desktop windows. They are placed correctly by updateWindowAttributes. Danny Baumann 2007-10-02 Fix variable naming. Danny Baumann 2007-10-02 Sort windows that are present before the WM starts. The sort is done according to a window layer check. Danny Baumann 2007-10-02 We always need to restack windows on map. Newly created windows are placed on top of the stack first, which is not desired for some windows that may be denied focus (such as desktop windows). This commit reverts commit 67648904b15c7781000a212a122b558a2d2afcf6. Danny Baumann 2007-10-01 Focus default window after switching viewports. Danny Baumann 2007-09-28 We don't need to care about converting the returned name string. This is done inside of KDE. Danny Baumann 2007-09-28 Move input (if desired) focus after mapping the window. Danny Baumann 2007-09-28 Use focus stealing prevention for application initiated active window change requests. Danny Baumann 2007-09-28 Delete property first and delete frame window after that to avoid race conditions. As the requests are processed in order by the server, otherwise other clients still may see a frame window ID in the property for a non-existing frame. Danny Baumann 2007-09-27 el translation update. Closes bug #12593. Danny Baumann 2007-09-27 Fix warning. Danny Baumann 2007-09-27 Fix full window frame being painted once after shading. Added commit explaining the workaround. Danny Baumann 2007-09-27 Fix map and restack ordering. unminimizeWindow already contains a XMapWindow call, so minimized windows that are unminimized and then restacked by the focus stealing prevention are first mapped, then restacked; which led to ugly flashing. The new code makes sure windows are always first restacked, then mapped. Danny Baumann 2007-09-27 Don't restack windows on map if their focus should be prevented. Danny Baumann 2007-09-27 Support restack requests in ConfigureRequest events. Danny Baumann 2007-09-27 Rename focusWindowOnMap to allowWindowFocus and make it use the current window viewport, not the initial one. Danny Baumann 2007-09-26 Update decoration with a timer after resize. decorWindowUpdate may call windowResizeNotify via calling updateWindowOutputExtents. Danny Baumann 2007-09-25 Sort LINGUAS list alphabetically and remove duplicate item. Danny Baumann 2007-09-25 Translation updates for gl, nb, sv and tr. Closes bug #12556. Dennis Kasprzyk 2007-09-24 Make sure that unredirected windows get redirected on unmap. Dennis Kasprzyk 2007-09-24 Make sure that everything is painted, if another plugin requests it. Danny Baumann 2007-09-24 Make sure the position is randomized only for windows that are smaller than the workarea. Otherwise, the mod operator may be called for numbers smaller or equal than 0, leading to a crash. Merge: fc9a738 27fe04f Danny Baumann 2007-09-22 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-09-22 Bump ABIVERSION. Danny Baumann 2007-09-22 Minor beautification. Danny Baumann 2007-09-22 Added paintAllViewports variable. Plugins hooking into cube can use this variable to force cube to paint all viewports. Danny Baumann 2007-09-22 Added CubePostPaintViewportProc. This function can be used by plugins that want to paint on the viewport transformed by cube. Danny Baumann 2007-09-21 Greek translation update by jimdusis@yahoo.gr. Danny Baumann 2007-09-21 Use matrixTranslate instead of ScreenPaintAttrib. Danny Baumann 2007-09-21 Use matrixTranslate instead of ScreenPaintAttrib. Danny Baumann 2007-09-21 Don't wrap into functions when not needed. Danny Baumann 2007-09-20 Fix whitespacing. Robert Noland 2007-09-19 Replace strndup with malloc and strncpy. FreeBSD doesn't support strndup. Danny Baumann 2007-09-20 Only apply clipping planes when the cube is actually rotated. Danny Baumann 2007-09-20 Add minimum and maximum restrictions for opacity values. Danny Baumann 2007-09-19 Minor cleanup. Danny Baumann 2007-09-19 Fix whitespace. Kristian Lyngstol 2007-09-18 [PATCH] Autoraise for transients too Dennis Kasprzyk 2007-09-18 Use KDE functions to get the visible window name. Dennis Kasprzyk 2007-09-18 Don't restack new "dock" type windows behind the active window. Dennis Kasprzyk 2007-09-17 Use current viewport for skydome rotation calculation. Dennis Kasprzyk 2007-09-17 Wrap enableOutputClipping to set correct clipping of the cube faces. Dennis Kasprzyk 2007-09-17 Added wrapable output clipping functions. Merge: ecbedd8 6368fdb Danny Baumann 2007-09-17 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-09-17 Include compiz-core.h before Xrender.h because newer versions of Xrender headers need Xlib.h included first. Danny Baumann 2007-09-16 Formatting fix. Danny Baumann 2007-09-16 Only copy structures when needed. Danny Baumann 2007-09-16 Whitespace and formatting improvements. Danny Baumann 2007-09-14 Bump ABIVERSION. Danny Baumann 2007-09-14 Allow plugins to not only clear allowed window actions, but also to add allowed actions. Danny Baumann 2007-09-14 Call matchPropertyChanged handler when the override_redirect flag changed. Danny Baumann 2007-09-14 Revert "Handle MapRequest event after core so that decorWindowUpdate sees window type and override_redirect state changes that might have happened during event processing." This reverts commit 8af9c24dee10bf827f1784db1590d0d9bcae9a93. The decoration must be added before core handles the map request so that it can be taken into consideration properly for the initial window placement. Danny Baumann 2007-09-12 Always update event windows when the allowed actions have changed. Danny Baumann 2007-09-12 Re-query Xinerama information on root window reshape. It might be very well possible that the root window was reshaped because of an output reconfiguration, e.g. using xrandr. Danny Baumann 2007-09-11 Handle MapRequest event after core so that decorWindowUpdate sees window type and override_redirect state changes that might have happened during event processing. Danny Baumann 2007-09-11 Recalculate window type and window actions if override_redirect state changed. Danny Baumann 2007-09-11 Check for changes to the override_redirect flag on window map. Rationale: Another client (such as Wine) might have changed it while the window was unmapped, and we are not guaranteed to get a configure notify event after map so it might happen that we don't treat the window correctly. Danny Baumann 2007-09-10 Translation update for it by Milo Casagrande. Danny Baumann 2007-09-10 Translation update for pt by Nicolau Goncalves. Danny Baumann 2007-09-10 Use normal mode for maximized windows. Rationale: Fully maximized windows can't be resized anyway, and showing the outline/rectangle when 'peeling' the window is visually distracting. Merge: c7fa428 a7e4007 Danny Baumann 2007-09-10 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Roland Bär 2007-09-10 Plug minor memleak. David Reveman 2007-09-10 Revert "Check d->base.parent to see if the object is properly" This reverts commit d7a6af1c6b86bb10eb672901fcddcb0e2d05f579. Using a timeout is not the proper solution but revert to this as a ExpHandlerChanged call before regex plugin has initialized all objects will definitely not work. A proper solution will be added once the new object system is fully in place. David Reveman 2007-09-09 Minor cleanup. David Reveman 2007-09-09 Remove whitespaces. Danny Baumann 2007-09-09 Properly remove window decorations on plugin unload. Danny Baumann 2007-09-09 XineramaQueryScreens is not guaranteed to set the number parameter to zero if it returns NULL, so better initialize the parameter properly. Danny Baumann 2007-09-09 Fixed Gconf setting parsing for title bar button actions. Danny Baumann 2007-09-09 Added minimization as title bar button action. Danny Baumann 2007-09-09 Correct default behaviour of middle mouse button: It should be lowering the window, not raising it. Danny Baumann 2007-09-09 Integrate Metacity's configurable middle and right click actions. Danny Baumann 2007-09-09 Added mouse wheel handling to g-w-d. The wheel handling is optional, with "No handling" and "Shade" being the only two options for the moment. Danny Baumann 2007-09-08 Remove Metacity bell settings integration. g-w-d should only integrate settings it uses itself (such as the used theme), all other settings should be handled inside compiz. Danny Baumann 2007-09-07 Minor cleanup. Danny Baumann 2007-09-07 Remove frame window property on removing the window frame. Danny Baumann 2007-09-07 Free core private index, not display private index. Merge: e24fa4b 0abec23 David Reveman 2007-09-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz-scale.h David Reveman 2007-09-06 Check return status of dbus_message_iter_open_container. Roland Baer 2007-09-06 mods is useless or "modifiers" will not work David Reveman 2007-09-06 Bump ABI versions. David Reveman 2007-09-06 Fix a number of obvious memory leaks. David Reveman 2007-09-06 Fix memory leaks and clean up properly in gconf plugin. David Reveman 2007-09-06 Check d->base.parent to see if the object is properly initialized instead of using a timeout. David Reveman 2007-09-06 Cleanup file watches properly. David Reveman 2007-09-06 Free cs->vertices. David Reveman 2007-09-06 Unwrap setOptionForPlugin function. David Reveman 2007-09-06 Unwrap setOptionForPlugin function. David Reveman 2007-09-06 Free window private index. David Reveman 2007-09-05 Only call matchExpHandlerChanged if display has not been removed. David Reveman 2007-09-05 Remove windowAddNotify and windowRemoveNotify hooks. David Reveman 2007-09-05 Have blur plugin hook into objectAdd instead of windowAdd. David Reveman 2007-09-05 Free core private index in decorFini and not the display private index. David Reveman 2007-09-05 Call decorWindowAdd instead of decorWindowUpdate directly. David Reveman 2007-09-05 Use objectAdd/Remove interface instead of old WindowAdd/Remove interface in decoration plugin. David Reveman 2007-09-05 Hook into objectAdd and objectRemove functions. David Reveman 2007-09-05 Add objectAdd and objectRemove hooks to core. These are similar to windowAddNotify and windowRemoveNotify but provide the same functionality for all object types. The parent field in object struct is set by the core implementation of this function, which means that the parent field can be used to check if object is properly initialized or not. Objects with parent field not yet set must never be passed to a wrap-able function. Plugins should simple not call any core functions from the initObject function unless parent field has been set. David Reveman 2007-09-05 Make decoration plugin hook into windowRemoveNotify and remove any decorations when this function is called instead of from decorFiniWindow. Nicolas Viennot 2007-09-05 Add windowRemoveNotify function. Danny Baumann 2007-09-05 Fix copy'n'paste mistake. David Reveman 2007-09-05 Remove ping timeout when removing display. David Reveman 2007-09-05 Initialize display object for plugins properly. David Reveman 2007-09-05 Load core plugin when initializing core object. David Reveman 2007-09-05 Close display connection. David Reveman 2007-09-05 Remove displays before plugins. David Reveman 2007-09-05 Add multi-display support to eventLoop. David Reveman 2007-09-05 Move WatchFd variables into core object. David Reveman 2007-09-05 Move CompWatchFd struct into compiz-core.h. David Reveman 2007-09-05 Move outputRegion and tmpRegion into core object. David Reveman 2007-09-05 Move timeout variables into core object. David Reveman 2007-09-05 Move CompTimeout struct to compiz-core.h. David Reveman 2007-09-05 Remove trailing whitespaces. David Reveman 2007-09-05 Avoid waking up once every second. David Reveman 2007-09-05 Remove compDisplays variable and add comments to code which break support for multiple displays. David Reveman 2007-09-05 Move plugin and display removal to finiCore and call finiCore from main. David Reveman 2007-09-05 Remove display connection watch properly. David Reveman 2007-09-05 Destroy temporary regions properly. David Reveman 2007-09-05 Move shutdown code out of for loop. Danny Baumann 2007-09-05 Only assign the default shadow to windows which use default decorations. If we use the default shadow for other windows (such as maximized or utility ones), the decoration context doesn't match the border, leading to corrupted display of the decorations for this window. David Reveman 2007-09-05 Destroy damage, remove passive button grabs and remove event masks. David Reveman 2007-09-04 Ungrab keys, free buttonGrab and keyGrabs. David Reveman 2007-09-04 Add removeDisplay and use it before returning from event loop. David Reveman 2007-09-04 Remove whitespace. David Reveman 2007-09-04 Allocate display objects properly. David Reveman 2007-09-04 Keep track of display objects in core object. David Reveman 2007-09-04 Release overlay window in removeScreen. David Reveman 2007-09-04 Free options, damage region and startup notification context properly in freeScreen. David Reveman 2007-09-04 Free invisibleCursor when removing screen. David Reveman 2007-09-04 Destroy GLX context when removing screen. David Reveman 2007-09-04 Free background texture when removing screen. David Reveman 2007-09-04 Destroy screen edges and grab window when removing screen. David Reveman 2007-09-04 Move window restore functionality into removeWindow function where it's supposed to be. David Reveman 2007-09-04 Only update client list and workarea if window has been destroyed. David Reveman 2007-09-04 Remove all windows when removing screen. David Reveman 2007-09-04 Move window restore functions to screen.c. David Reveman 2007-09-04 Remove all screens before we return from event loop. David Reveman 2007-09-04 Add removeScreen function. David Reveman 2007-09-04 Add support for any kind of object type to gconf plugin. gconfKeyChanged still needs to be updated to support types other than display and screen but key names should preferably be changed before this is fixed. David Reveman 2007-09-04 Add support for any kind of object type to kconfig plugin. David Reveman 2007-09-04 Have compObjectForEachType take a parent argument to make it a bit more convenient to use. David Reveman 2007-09-04 Cleanup dbus plugin. David Reveman 2007-09-04 Allow key and button options in objects that are descendants of a display object. David Reveman 2007-09-04 Allow key and button options in objects that are descendants of a display object. David Reveman 2007-09-04 Fix typo. David Reveman 2007-09-04 Use 'base' as default name for base object instead of 'object'. David Reveman 2007-09-04 Add parent to object struct. David Reveman 2007-09-04 Add findObject function to object interface. David Reveman 2007-09-04 Remove setDisplayOptionForPlugin and setScreenOptionForPlugin functions. Add setOptionForPlugin to core object. Danny Baumann 2007-09-04 Re-add rotate_right_key option to metadata which was removed by accident. Danny Baumann 2007-09-04 Only show resize rectangle on the screen the resized window is on. Danny Baumann 2007-09-04 Added button bindings for rotating left/right. Danny Baumann 2007-09-04 Added button bindings for initiating scale. David Reveman 2007-09-04 Move file watch interface to core object. David Reveman 2007-09-04 Add nameObject function to object interface. David Reveman 2007-09-03 Add compObjectTypeName function. David Reveman 2007-09-03 Add name to object info struct. David Reveman 2007-09-03 Re-write object initialization code to properly handle new object model. David Reveman 2007-08-31 Use compObjectForEach for plugin initialization of window objects. David Reveman 2007-08-31 Add compObjectForEach function. David Reveman 2007-08-31 Rename ObjectCallbackProc to ObjectCallBackProc and add return value so that it is possible interrupt calls to forEachObject functions. David Reveman 2007-08-31 Add forEach functions to object interface. David Reveman 2007-08-31 Add core object type. David Reveman 2007-08-31 Add core object. David Reveman 2007-08-31 Adjust core option functions so they match the prototype used by plugins and use dispatch tables in plugin.c. David Reveman 2007-08-31 Add missing object.c. David Reveman 2007-08-30 Bump ABI versions. David Reveman 2007-08-30 Add plugin interface version number to getCompPluginInfo symbol. This makes sure that only plugins built with a matching plugin interface can be loaded. This version number must be updated every time the plugin interface changes. Each plugin needs to be manually updated to work with a new plugin interface version. David Reveman 2007-08-30 Remove duplicate error message. David Reveman 2007-08-30 Add simple object system, which generalize the privates mechanism and the plugin system. It will allow us share more code between display, screen and window objects. It also makes it possible to properly introduce new object types without changing the plugin interface or breaking the API. David Reveman 2007-08-29 Remove whitespaces. David Reveman 2007-08-29 ABIVERSION -> CORE_ABIVERSION. David Reveman 2007-08-29 Split compiz.h into compiz.h and compiz-core.h. Move all structures and most functions from compiz.h to compiz-core.h. compiz.h provides an API that is stable across releases with the same minor version number. It can be used to create plugins that will run across multiple core ABI versions. compiz-core.h contains all structures and hooks used by the core. A plugin that includes compiz-core.h is responsible for checking the core ABI version when being initialized. Remove deprecated function: compWindowTypeMaskFromStringList David Reveman 2007-08-28 Add COMPIZ_BEGIN|END_DECLS. David Reveman 2007-08-28 Add COMPIZ_BEGIN|END_DECLS. David Reveman 2007-08-28 Add proper preprocessor check to compiz-scale.h. David Reveman 2007-08-28 Add proper preprocessor check to compiz-cube.h. David Reveman 2007-08-28 Rename scale.h to compiz-scale.h. David Reveman 2007-08-28 Rename cube.h to compiz-cube.h. David Reveman 2007-08-28 Clean up. David Reveman 2007-08-28 Use compiz-common.h, move _CompPluginVTable struct to compiz-plugin.h and include it in appropriate source code files. David Reveman 2007-08-28 Install compiz-common.h. David Reveman 2007-08-28 Have the configure script generate a compiz-common.h file. David Reveman 2007-08-28 Remove getVersion function from plugin VTable. David Reveman 2007-08-28 Add core ABI version check to all plugins. Plugins are now resposible for checking core ABI version when being initialized. David Reveman 2007-08-28 Bump cube ABI version. David Reveman 2007-08-28 screenInode -> objectInode. David Reveman 2007-08-28 Minor clean up. David Reveman 2007-08-28 Bump ABI version. David Reveman 2007-08-28 Kill whitespaces. Merge: 92f1692 36575a3 David Reveman 2007-08-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz.h David Reveman 2007-08-28 Add ABI option to core. David Reveman 2007-08-28 Make sure the core plugin is always loaded. Roland Baer 2007-08-28 realloc with correct size David Reveman 2007-08-28 Adjust metadata to have core plugin loaded by default. David Reveman 2007-08-28 Remove setScreenOption and make sure core plugin is loaded at startup. David Reveman 2007-08-27 Remove getDisplayOptions and setDisplayOption functions. David Reveman 2007-08-27 Hook up core options to core plugin. David Reveman 2007-08-27 Only allow loading of core plugin when trying to load plugin from current directory. David Reveman 2007-08-27 Pass NULL as path when listing plugins in current directory. David Reveman 2007-08-27 Fix typo. David Reveman 2007-08-27 Hook up core loader. Dennis Kasprzyk 2007-08-27 Draw cube caps only once per output, but allow plugin plugins to reset this handling. Fixes switcher with transparent cube. Dennis Kasprzyk 2007-08-27 Disable backface culling only for front-to-back painted transparent cube faces. David Reveman 2007-08-27 Add core plugin loader and core plugin code. Roland Bär 2007-08-27 Added sanity check for screenInode value. Danny Baumann 2007-08-27 Coding style adjustments. Roland Baer 2007-08-16 Storage of XGetVisualInfo() needs to be free()d Roland Baer 2007-08-17 Return value of XGetKeyboardMapping() has to be XFree()d, not to be ignored Danny Baumann 2007-08-27 Don't save last window state in CompWindow structure. Instead, pass the last state to the state change notification function. Danny Baumann 2007-08-27 Never modify w->state outside changeWindowState function. Danny Baumann 2007-08-24 Add edge action for "Show desktop". David Reveman 2007-08-23 Use new core utility functions in rotate plugin. David Reveman 2007-08-23 Add utility function getPluginDisplayIndex. David Reveman 2007-08-23 Add utility function checkPluginABI. Kristian Høgsberg 2007-08-14 Add run_command to keyboard shortcut list. Kristian Høgsberg 2007-08-21 Require 'compiz' not @COMPIZ_REQUIRES@ in plugin pkg-config files. Kristian Høgsberg 2007-08-21 Set SM restart style to SmRestartIfRunning on exit. Kristian Høgsberg 2007-08-14 Add back --with-default-plugins option. David Reveman 2007-08-22 Add getPluginABI utility function. David Reveman 2007-08-20 Post release version increment. David Reveman 2007-08-20 Add NEWS entry and bump version for 0.5.4 release. David Reveman 2007-08-20 Add metadata/kconfig.xml.in to POTFILES.in. David Reveman 2007-08-20 Fix typo. David Reveman 2007-08-20 Fix uninstall-local target. Roland Baer 2007-08-17 Removed effectivly unused stuff in gtk-window-decorator David Reveman 2007-08-19 Don't avoid sync to vblank when we have multiple outputs. David Reveman 2007-08-19 Include DESTDIR properly. David Reveman 2007-08-19 Fix typo. David Reveman 2007-08-19 Add missing metadata file for kconfig plugin. David Reveman 2007-08-19 Track change of schemas_files variable to schema_files. David Reveman 2007-08-19 Use install-data-local and uninstall-local hooks for installing kde config files. Merge: 11761f8 86b82d9 David Reveman 2007-08-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: metadata/rotate.xml.in David Reveman 2007-08-17 Generate entries in kcfg files with unique names and use the key attribute. Danny Baumann 2007-08-16 Fix typos. David Reveman 2007-08-15 Bump ABI version. David Reveman 2007-08-15 Add NULL checks. David Reveman 2007-08-15 GConf plugin re-write. David Reveman 2007-08-15 Add const modifier. David Reveman 2007-08-15 Fix optionTypeToString prototype. David Reveman 2007-08-15 fuseFiniValue -> compFiniOptionValue. David Reveman 2007-08-15 Return an empty string instead of NULL when edge mask is 0. Merge: 3d9be8a 275122e David Reveman 2007-08-15 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-08-15 Add kcfgdir to compiz-kconfig.pc. David Reveman 2007-08-15 Install compiz-kconfig.pc. David Reveman 2007-08-15 Install kcfg files and system-wide configuration file in default kde directories. David Reveman 2007-08-15 Add screen parameter to kcfg files and kconfig style-sheet. David Reveman 2007-08-14 Remove use of kcfg Enum type. David Reveman 2007-08-14 Add kconfig plugin and style-sheets that generate a default system-wide configuration and .kcfg files for each plugin. David Reveman 2007-08-14 Clean up. David Reveman 2007-08-14 Better default colors. David Reveman 2007-08-14 Check action type properly when comparing action values. David Reveman 2007-08-14 Add button action options for all switcher actions. David Reveman 2007-08-14 Button actions should be initialized with CompActionStateInitEdge so that edge events work properly. David Reveman 2007-08-14 Cleanup. David Reveman 2007-08-14 Use compFiniOptionValue in fuse plugin. David Reveman 2007-08-14 Make sure initiate, terminate and state variables in action option values are not changed. David Reveman 2007-08-14 Cleanup. David Reveman 2007-08-14 Free list option values properly. David Reveman 2007-08-14 Remove unused edgeButton variable from action struct. David Reveman 2007-08-14 Remove complex action option handling from fuse plugin. David Reveman 2007-08-14 Remove complex action option handling from dbus plugin. David Reveman 2007-08-14 Remove complex action option handling from ini plugin. David Reveman 2007-08-14 Avoid using binding type when determining if action value is equal to existing action value. David Reveman 2007-08-14 Trigger edge button events properly. David Reveman 2007-08-14 Update parsing of edge metadata. David Reveman 2007-08-14 Update edge option metadata. David Reveman 2007-08-14 Remove complex action option initialization. David Reveman 2007-08-14 Fix edge string parsing. David Reveman 2007-08-13 Print bell action type properly. David Reveman 2007-08-13 Action options should no longer be in the schemas files. David Reveman 2007-08-13 Remove duplicate initialization of option. David Reveman 2007-08-13 Remove complex action option handling from gconf plugin as plain action options are now non-configurable. David Reveman 2007-08-13 Use new action option types in zoom plugin. David Reveman 2007-08-13 Use new action option types in wobbly plugin. David Reveman 2007-08-13 Use new action option types in water plugin. David Reveman 2007-08-13 Use new action option types in switcher plugin. David Reveman 2007-08-13 Use new action option types in screenshot plugin. David Reveman 2007-08-13 Use new action option types in scale plugin. David Reveman 2007-08-13 Use new action option types in rotate plugin. David Reveman 2007-08-13 Use new action option types in resize plugin. David Reveman 2007-08-13 Use new action option types in plane plugin. David Reveman 2007-08-13 Use new action option types in move plugin. David Reveman 2007-08-13 Use new action option types in cube plugin. David Reveman 2007-08-13 Use new action option types in clone plugin. David Reveman 2007-08-13 Use new action option types in blur plugin. David Reveman 2007-08-13 Use new action option types in annotate plugin. David Reveman 2007-08-13 Switch to new action option types for all core options. Most options have been converted to key actions for now but button, edge and bell options that will trigger the same action can easily be added where it makes sense. David Reveman 2007-08-13 Add passive grabs and update event handling to trigger new action option types. David Reveman 2007-08-13 Add isActionOption function. David Reveman 2007-08-13 Handle new option types properly. David Reveman 2007-08-13 Add edge modifiers. Deprecates edge button functionality. David Reveman 2007-08-13 Add bell option, which is just a bell only action option. David Reveman 2007-08-13 Add edge option, which is just a edge only action option. David Reveman 2007-08-13 Add button-binding option, which is just a button-binding only action option. David Reveman 2007-08-13 Add key-binding option, which is just a key-binding only action option. David Reveman 2007-08-13 Default alpha value for color options is 1.0. David Reveman 2007-08-12 Fix event handle matching. This caused inotify plugin to not work at all unless the file watch handle happen to be the same as the inotify handle. David Reveman 2007-08-12 Use equalRange when checking if new value is equal to old value. David Reveman 2007-08-12 Make compInitOptionValue and compFiniOptionValue available to plugins. Danny Baumann 2007-08-09 Fix possible memleaks. Danny Baumann 2007-08-09 Formatting fixes. Danny Baumann 2007-08-09 Remove trailing whitespace. Roland Baer 2007-07-27 Added compFindOption return checks David Reveman 2007-08-09 Fix many function declarations that were missing the 'const' modifier. David Reveman 2007-08-09 Cleanup. David Reveman 2007-08-09 Rearrange some headers to avoid compile issues on solaris. David Reveman 2007-08-09 Avoid use of strcasestr and case insensitive matching of modifier strings. David Reveman 2007-08-08 Include proper compiler flags and link libdecoration to required libraries. David Reveman 2007-08-07 This should be taken care of by unhookWindowFromScreen. David Reveman 2007-08-07 Reduce code by using findWindowAtScreen in findTopLevelWindowAtScreen. David Reveman 2007-08-07 Avoid using lastFoundWindow in findWindowAtDisplay. David Reveman 2007-08-07 Usage of lastFoundWindow in findTopLevelWindowAtDisplay is broken. Preferred is to just have findTopLevelWindowAtDisplay call findTopLevelWindowAtScreen for each screen until a matching window is found. David Reveman 2007-08-07 Revert "Select for focus change events on frame windows." This reverts commit 55d3ca1913af4a76973804e29eb21ed62a21691c. David Reveman 2007-08-07 Select for focus change events on frame windows. David Reveman 2007-08-07 Add CompNoMask to REAL_MOD_MASK. REAL_MOD_MASK is used determine what bits of the modifier state that should match for an action to be triggered. Virtual modifiers without real modifiers assigned to them will use CompNoMask as real modifier. Hence, the CompNoMask bit must also be used to determine if the modifier state matches and should be considered a real modifier. Thanks to Andy Hefner. David Reveman 2007-08-06 Add XCB connection handle to CompDisplay. David Reveman 2007-08-06 Require x11-xcb. David Reveman 2007-08-06 Remove whitespaces. David Reveman 2007-08-03 Fix typo. David Reveman 2007-08-03 Post release version increment. David Reveman 2007-08-03 Add NEWS entry and bump version for 0.5.2 release. David Reveman 2007-08-03 make update-po David Reveman 2007-08-03 Add release documentation and makefile rules that will ease the release process (most of it stolen from cairo). David Reveman 2007-08-03 Remove .cvsignore files. David Reveman 2007-08-03 Remove whitespaces. David Reveman 2007-08-02 Fix default value of images option. David Reveman 2007-08-02 Fix initialization order of mClientId and mFrame. David Reveman 2007-08-02 Shut up compiler. David Reveman 2007-08-02 Avoid bad use of asprintf in a few cases. David Reveman 2007-08-02 Use gtk_style_attach properly in update_style. David Reveman 2007-08-02 Set decor object to NULL when closing a window and make sure that we're not using a closed in active_window_changed. David Reveman 2007-08-02 Add use of more compiler warnings. Roland Baer 2007-08-02 Various NULL checks Roland Baer 2007-08-01 removes an unused var Roland Baer 2007-08-01 Removed unused code Roland Baer 2007-08-01 Removed unused vars David Reveman 2007-07-31 Add po/.intltool-merge-cache and po/stamp-it to DISTCLEANFILES so that 'make distcheck' will pass. David Reveman 2007-07-31 Add intltool-extract, intltool-merge and intltool-update to EXTRA_DIST. David Reveman 2007-07-31 Enable SVG plugin by default. David Reveman 2007-07-31 Shut up compiler. David Reveman 2007-07-31 Add missing NULL check. Roland Baer 2007-07-31 Removed useless test David Reveman 2007-07-30 Replace move argument that was always true with an allowDecorations argument that can be used to remove any window decorations from decorFiniWindow. David Reveman 2007-07-30 move argument to decorWindowUpdate should always be true. David Reveman 2007-07-30 Have focusDefaultWindow try to focus the window under the pointer when click-to-focus isn't used. David Reveman 2007-07-30 Revert "First attempt to focus the window under the pointer if 'click to focus' is not enabled." This reverts commit bdb91a3bbc0419bba228f904804a4f74b84c2da7. David Reveman 2007-07-30 Make sure some window is focused properly at start up. David Reveman 2007-07-30 Clean up. David Reveman 2007-07-29 Restore window geometry of fullscreen and maximized windows before exiting. David Reveman 2007-07-29 Use configureXWindow to move the window as moveWindow function is broken and will be deprecated soon. David Reveman 2007-07-29 Initialize placed variable for initially mapped windows in addWindow instead of addScreen. David Reveman 2007-07-29 Use configureXWindow to move the window as moveWindow function is broken and will be deprecated soon. David Reveman 2007-07-29 Map hidden windows before exiting. David Reveman 2007-07-29 Shift client window position when adding and changing decorations. David Reveman 2007-07-29 Don't try to bind window again if it failed previously. David Reveman 2007-07-29 We can't unset the damaged flag just because the bind failed as it can result in damage tracking of decorations to get out of sync. David Reveman 2007-07-29 Make sure initially mapped windows are considered mapped and after that unmap and make sure state hint reflects the current state of the window in case supposed to be iconifyied. David Reveman 2007-07-29 Initialize iconifyied windows properly. David Reveman 2007-07-28 Avoid window that we're trying to restack, restackWindowBelow can only be used to lower windows otherwise. Danny Baumann 2007-07-28 Revert "Set 'cancel' flag if the resize geometry at termination matches the geometry at initiation." A better fix for the underlying problem has been implemented in commit 3cc932c2518be2d8b05f9b7ee7b0401d3113291c. This reverts commit 624b46a77bc9e3b1220023021c2c4f9cc0bddda2. David Reveman 2007-07-27 Fix type of path argument. David Reveman 2007-07-27 Fix type of name argument. David Reveman 2007-07-27 Make sure we damage screen correctly when done resizing. Merge: 651f5d5 2784e15 David Reveman 2007-07-27 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-07-27 Skip windows that we should avoid stacking relative to. Danny Baumann 2007-07-27 Fix descriptions. David Reveman 2007-07-26 Make sure restackWindowBelow is able to put a window at the bottom of the stack and that it never stacks a window above the specified sibling. Guillaume Seguin 2007-07-26 Add raise_on_rotate option. David Reveman 2007-07-25 Add lazy positioning option to move plugin and a bad implementation that will avoid a performance regression in upcoming release. The option should stay but the implementation should be replaced with a proper solution asap. David Reveman 2007-07-25 Get red/blue color components right. David Reveman 2007-07-24 Check for memory errors. David Reveman 2007-07-24 Clean up. David Reveman 2007-07-24 Build png plugin properly. David Reveman 2007-07-24 Make server-side RANDR support optional. Daniel Nylander 2007-07-24 Update swedish translation. Roland Baer 2007-07-19 Unsigned less than zero Roland Baer 2007-07-19 Null checks to prevent crashs Dennis Kasprzyk 2007-07-19 Name function correctly: clonePaintScreen -> clonePaintOutput Dennis Kasprzyk 2007-07-19 Work correctly with fullscreeOutput CompOutput. Roland Baer 2007-07-18 Removed unused variables Dennis Kasprzyk 2007-07-16 Revert of commit "Relation of type 'after' is unnecessary information when cube plugin is a requirement." An plugin requirement doesn't imply an "after" loading rule. David Reveman 2007-07-16 Fix parsing of screen edge metadata. David Reveman 2007-07-12 Remove features and dependencies from plugin VTable. David Reveman 2007-07-12 Remove plugin dependency checking from core. David Reveman 2007-07-12 Relation of type 'after' is unnecessary information when cube plugin is a requirement. David Reveman 2007-07-12 Clean up and indent metadata correctly. David Reveman 2007-07-12 Avoid unnecessary branching. Erkin Bahceci 2007-07-11 Fix timing of scale activate event ending. Danny Baumann 2007-07-12 Added case insensitive matching. Patrick Niklaus 2007-07-11 Add features to image plugin metadata. Merge: a5fbfa5 ec32ff5 David Reveman 2007-07-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Roland Bar 2007-07-11 Remove unused code Roland Bar 2007-07-11 use of already free'd pointers David Reveman 2007-07-11 Clean up and avoid some unnecessary heap allocation in addDataOpToFunctionData and addBlendOpToFunctionData. Danny Baumann 2007-07-11 Added support for UTF-8 encoded window title matching. Danny Baumann 2007-07-11 Trigger pointer based resize also if the resizing originally wasn't initiated by the mouse and determine the resize direction in that case by the pointer movement direction. This also fixes window menu initiated resizing. David Reveman 2007-07-10 More clean up. Setting d to compDisplays when it's NULL doesn't make sense. Always using the default logMessage function when d parameter is NULL is more appropriate if it should be allowed to call compLogMessage with d parameter set to NULL at all. David Reveman 2007-07-10 Clean up. David Reveman 2007-07-10 Have logLevelToString return a constant string and not a buffer that needs to be freed. Fixes logging memory leak. David Reveman 2007-07-10 Make sure logMessage function is initialized before compLogMessage is called. Dennis Kasprzyk 2007-07-11 Add input extents when placing window in "smart" mode to get correct position. David Reveman 2007-07-10 Fix typo. Dennis Kasprzyk 2007-07-11 Use correct input extents in "smart" mode calculation. David Reveman 2007-07-10 Update video interface by adding source dimensions. David Reveman 2007-07-10 Fix so that escape can be used again to terminate "snap top"-functionality. David Reveman 2007-07-10 Clean up. David Reveman 2007-07-10 Clean up. David Reveman 2007-07-10 Select for Expose events on output window. Dennis Kasprzyk 2007-07-10 Use fullscreen output in unfold cube mode. Dennis Kasprzyk 2007-07-09 Define template parameters correctly. Dennis Kasprzyk 2007-07-09 Handle translated option info as variable. Dennis Kasprzyk 2007-07-09 Translate int descriptions. Danny Baumann 2007-07-09 Fix missing damage at resize initiation. This caused the selection rectangle not being drawn properly when initiating resizing via keyboard. Danny Baumann 2007-07-06 Added action option that can be used for triggering a relayout of the slots. Danny Baumann 2007-07-06 Added wrap-able function that can be used for preventing scaled window drawing and adjusting paint attributes for scaled window drawing. Dennis Kasprzyk 2007-07-06 Added string formating to fragment functions. Dennis Kasprzyk 2007-06-25 Switch to fullscreen mode only if multiple outputs are detected. Dennis Kasprzyk 2007-06-25 Don't disort the screen if another plugin changes the output. Dennis Kasprzyk 2007-06-25 Switch to one output mode if cube uses "One big cube". Dennis Kasprzyk 2007-06-25 Added option to change multi output behavior. Merge: c8f36d4 7fae3ae David Reveman 2007-07-05 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-07-05 Keep point under cursor fixed when zooming in. Roland Bar 2007-07-05 Fix memory leak Roland Bar 2007-07-05 remove NULL check Roland Bar 2007-07-05 desktop is unsigned, always >= 0. David Reveman 2007-07-05 Remove unnecessary NULL check. Erkin Bahceci 2007-07-03 Add feature "windowanimations" to Minimize metadata. Dennis Kasprzyk 2007-07-05 Initialize edge button properly from metadata. Dennis Kasprzyk 2007-07-05 Edge button actions depend on CompActionStateInitEdge state. Danny Baumann 2007-07-04 Update window attributes at move termination. Danny Baumann 2007-07-04 Focus default window after ending show desktop mode. Danny Baumann 2007-07-03 Correctly add input extents to window width and height. Dennis Kasprzyk 2007-07-02 Handle window input extents correclty in smart mode. Dennis Kasprzyk 2007-07-02 Fixed smart window placing mode for multimonitor configurations. Dennis Kasprzyk 2007-07-02 Don't modify stencil buffer for not blured client regions. Danny Baumann 2007-06-29 Improve description. Merge: 624b46a 408fffe Danny Baumann 2007-06-27 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-27 Set 'cancel' flag if the resize geometry at termination matches the geometry at initiation. If we don't do this, the resize paint rectangle won't be damaged properly. Merge: efb5671 39cf1c7 Mike Dransfield 2007-06-27 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-27 This patch breaks --disable-gconf Revert "Move AM_GCONF_SOURCE_2 in to gconf conditional" This reverts commit 85a622ab0001821fbdb0136605fec219601dae01. Erkin Bahceci 2007-06-26 Scale z by 1 instead of 0. Bellegarde Cedric 2007-06-27 Fix placement mode option. Dennis Kasprzyk 2007-06-26 Fixed orientation calculation for "inside cube" mode. Roland Bar 2007-06-22 Fix memory leaks and remove dead code David Reveman 2007-06-21 Adjust libwnck backward compatibility so that the current code matches the current libwnck API. David Reveman 2007-06-21 WNCK_WINDOW_MODAL_DIALOG doesn't exist in libwnck 2.19.4 and later. David Reveman 2007-06-21 Use consistent preprocessor macros. Merge: a3e4204 37d0dd7 David Reveman 2007-06-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-06-21 Fix memory leak. David Reveman 2007-06-21 Fix memory leak. David Reveman 2007-06-21 Fix memory leak. Danny Baumann 2007-06-21 Disable cube transparency by default. Danny Baumann 2007-06-21 Fix 'Transparency on mouse initiated rotation only' option. Merge: a069bda 7f4ef98 Dennis Kasprzyk 2007-06-21 Merge branch 'master' of git+ssh://onestone@git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-06-21 Bump cube ABI version. Dennis Kasprzyk 2007-06-21 Combined checkFTB and capDirection into one checkOrientation function. Dennis Kasprzyk 2007-06-21 Added a wrapabble paintInside function to allow plugins to render something inside of the transparent cube. Dennis Kasprzyk 2007-06-21 Separated paintTopBottom into individual paintTop and paintBottom functions. Dennis Kasprzyk 2007-06-21 Made chackFTB wrapable. Dennis Kasprzyk 2007-06-21 Fixed FTB calculation for inside cube mode. Danny Baumann 2007-06-21 Fix minor typo. Danny Baumann 2007-06-21 Remove trailing whitespace. Roi Cohen 2007-06-12 Added option to enable cube transparency only on button binding initiated rotatation. Roi Cohen 2007-06-12 Add cube transparency. Danny Baumann 2007-06-21 Added rotation state. This variable should be set appropriately by plugins rotating the cube. Roi Cohen 2007-06-12 Improve cube paint order calculations. Merge: bcccfc0 bb7e30c Danny Baumann 2007-06-21 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-21 Re-order blur texture painting order to eliminate some Nvidia driver issues. Merge: a2f6b00 4158e16 David Reveman 2007-06-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-21 Hide windows on all outputs if all outputs are used for scaling. Merge: 6d1c026 5425a21 Danny Baumann 2007-06-21 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-21 Properly initialize and uninitialize custom match. Dennis Kasprzyk 2007-06-21 Fixed client resize problems with libwnck >= 2.19.4. Merge: fdfb327 4d53420 David Reveman 2007-06-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-06-20 Don't allow transients to be stacked above dock windows unless they are dock windows themselves. David Reveman 2007-06-20 libdecoration is now useed by svg plugin. David Reveman 2007-06-20 Add experimental support for svg objects. David Reveman 2007-06-20 Add some basic events that can be used by other plugins to track zoom region. David Reveman 2007-06-20 Do not fall-through if path isn't long enough to be an option message. Dennis Kasprzyk 2007-06-19 Don't ignore the linear filter zoom option. Merge: 85a622a 64fbb40 Robert Carr 2007-06-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Robert Carr 2007-06-17 Move AM_GCONF_SOURCE_2 in to gconf conditional David Reveman 2007-06-15 Set hoveredWindow more properly. David Reveman 2007-06-12 Make sure we free the window private index. Merge: 90ed941 64fbb40 David Reveman 2007-06-12 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-06-12 Initialize variables correctly. Dennis Kasprzyk 2007-06-12 Do not zoom when unfolded. Dennis Kasprzyk 2007-06-11 Add int descriptions to long option description. Dennis Kasprzyk 2007-06-11 Removed string description handling. Dennis Kasprzyk 2007-06-11 Ignore read_only options in schema creation. Dennis Kasprzyk 2007-06-11 Use texture matrix in skydome (Fixes GL_TEXTURE_RECTANGLE skydome images). Dennis Kasprzyk 2007-06-11 Initialize skydome texture matrix. Dennis Kasprzyk 2007-06-11 Use cs->invert directly. Dennis Kasprzyk 2007-06-11 Don't zoom in inside cube mode. Dennis Kasprzyk 2007-06-11 Added zoom out for mouse rotation. Dennis Kasprzyk 2007-06-11 Added zoom out for viewport change rotation. Dennis Kasprzyk 2007-06-11 Added metadata for rotate zoom option. Dennis Kasprzyk 2007-06-11 Added basic zoom out support to rotate. Dennis Kasprzyk 2007-06-11 Allow that cube caps get painted multiple times. Dennis Kasprzyk 2007-06-11 Fixed float rounding errors during option setting Danny Baumann 2007-06-10 Include severity level into default log message printout. Merge: 91b3ab8 9720213 Mike Dransfield 2007-06-09 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-09 Use fleur cursor for move. Patch from Treviño Merge: 8f9f119 97cefbc Danny Baumann 2007-06-09 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-09 Terminate scale mode when the last scaled window was closed. Merge: 714831c f5aae26 Mike Dransfield 2007-06-09 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-09 Use consistent variable naming conventions David Reveman 2007-06-08 Use pointerX and pointerY when initializing deltas. Merge: e1ad529 f5aae26 David Reveman 2007-06-08 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-08 Added compiz event indicating that switcher is active. While other plugins can also hook into the scale plugin to get this kind of information, that might be unwanted sometimes (e.g. to not introduce plugin dependencies). Because of that, it makes sense to have a inactive/active indicator independent of the hook interface. Mike Dransfield 2007-06-08 Tidy up Mike Dransfield 2007-06-08 Re-write options if there are new ones in the plugin Merge: 672ca9b 7bdb04d David Reveman 2007-06-07 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-06-07 Whitespace improvements. Danny Baumann 2007-06-07 Added hoveredWindow variable to ScaleDisplay that always indicates the window which is hovered with the pointer. Danny Baumann 2007-06-07 Change default keybinding for 'Initiate scale mode' to Shift+Alt+Up to avoid conflicts with the plane and wall plugins. Danny Baumann 2007-06-07 Added an option to select scale's behaviour if multiple outputs are used. Selections are 'Scale on current output' (previous behaviour) and 'Scale on all outputs'. David Reveman 2007-06-06 Use fleur cursor instead of plus cursor when moving windows. Mike Dransfield 2007-06-06 Remove string restrictions Merge: 2bc24b5 8d38c0d Mike Dransfield 2007-06-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-06 Remove the N_ macro and windowTypeString Danny Baumann 2007-06-06 Rename scale's displayPrivateIndex to scaleDisplayPrivateIndex so that wrapping plugins can have their own displayPrivateIndex. David Reveman 2007-06-05 Allow plugins to hook into scalePaintDecoration. David Reveman 2007-06-05 Move scale icon rendering into function. David Reveman 2007-06-05 Clean up. David Reveman 2007-06-05 Clean up. David Reveman 2007-06-05 Allow plugins to hook into layoutSlotsAndAssignWindows. David Reveman 2007-06-05 Create layoutSlotsAndAssignWindows function. David Reveman 2007-06-05 Add ABI and INDEX options to scale plugin. David Reveman 2007-06-05 Add pkg-config file for scale plugin. David Reveman 2007-06-05 Add scale.h. David Reveman 2007-06-05 Terminated scale mode when edge is triggered while already in scale mode. David Reveman 2007-06-05 Clean up. David Reveman 2007-06-05 Minor cleanup. Quinn Storm 2007-06-02 add option to turn off scale behaviour where a click on the desktop shows the desktop Danny Baumann 2007-06-05 Fix option type for int description options. Danny Baumann 2007-06-05 Convert usage of restricted string options to int descriptions in wobbly plugin. Danny Baumann 2007-06-05 Convert usage of restricted string options to int descriptions in scale plugin. Kristian Lyngstol 2007-06-04 Stop processing a keypress after a plugin has handled it. Dennis Kasprzyk 2007-06-04 Indention fix. Dennis Kasprzyk 2007-06-04 Use output->id. Dennis Kasprzyk 2007-06-04 Added "after decoration" rule to blur metadata to make decoration blur work correctly Mike Dransfield 2007-06-03 Use ints for place modes Danny Baumann 2007-06-02 The fullscreen output is not a real screen output, reflect that in its id. Merge: 857776f 0e01bec David Reveman 2007-06-01 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-06-01 Bump ABIVERSION. David Reveman 2007-06-01 Use new walk interface. David Reveman 2007-06-01 Add CompWalker interface. Merge: fe799b5 22481bc Mike Dransfield 2007-06-01 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-06-01 Code formatting David Reveman 2007-06-01 Bump ABIVERSION. David Reveman 2007-06-01 Move lastViewport into CompScreen struct as it's GL context dependent. David Reveman 2007-06-01 Clean up last viewport check. David Reveman 2007-06-01 Use output id. David Reveman 2007-06-01 Use output id. David Reveman 2007-06-01 Add output id. The id is always set to the output's index in the screen outputs list. The id must be set to ~0 if the output is not a real screen output. David Reveman 2007-05-31 Track output changes. Merge: b2f47aa 97a4a6c David Reveman 2007-05-31 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Merge: d3026e2 0a1e769 Dennis Kasprzyk 2007-06-01 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz.h plugins/zoom.c Merge: 5ca24d1 0a1e769 David Reveman 2007-05-31 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-31 Add extensible logging framework Merge: 436c0e9 de76d33 David Reveman 2007-05-31 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-05-31 Do not UNWRAP a not wrapped function. David Reveman 2007-05-31 Remove whitespace. Dennis Kasprzyk 2007-05-31 Added a fullscreenOutput variable to CompScreen. Dennis Kasprzyk 2007-05-31 Handle glViewport change correctly. Dennis Kasprzyk 2007-05-31 Applied temporary changes to cube to make it work with lastest core changes. Dennis Kasprzyk 2007-05-31 Applied temporary changes to clone to make it work with lastest core changes. Dennis Kasprzyk 2007-05-31 Use new paintScreen function in screenshot. David Reveman 2007-05-31 Fix byte order check in imageBufferToTexture. Dennis Kasprzyk 2007-05-31 Applied lastest core changes to blur. Dennis Kasprzyk 2007-05-31 Applied lastest core changes to annotate, plane, resize, screenshot and switcher. Dennis Kasprzyk 2007-05-31 Applied lastest core changes to wobbly, minimize, rotate and scale. Dennis Kasprzyk 2007-05-31 Bump ABI version Dennis Kasprzyk 2007-05-31 Added a new wrapable paintScreen function to allow plugins to maniplulate output device dependent painting. Dennis Kasprzyk 2007-05-31 Renamed paint(Transformed)Screen to paint(Transfomed)Output. for FILE in `find . -name "*.[ch]"`; do BASE=`basename $FILE` cat $FILE | sed -e 's/aintScreen/aintOutput/g' -e 's/aintTransformedScreen/aintTransformedOutput/g' > /tmp/$BASE cat /tmp/$BASE | sed -e 's/parePaintOutput/parePaintScreen/g' -e 's/onePaintOutput/onePaintScreen/g' > $FILE rm /tmp/$BASE done David Reveman 2007-05-31 Clean up. David Reveman 2007-05-31 Allow modifier only bindings. David Reveman 2007-05-31 Clean up. David Reveman 2007-05-30 Set cs->bg to NULL. David Reveman 2007-05-30 Initialize pw and ph correctly. David Reveman 2007-05-29 Add pan support. David Reveman 2007-05-29 Remove zoom options that are no longer used. David Reveman 2007-05-29 Replace the existing zoom functionality with some more useful rectangle zoom functionality. Merge: 14da415 7db43c9 David Reveman 2007-05-24 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-24 Make it possible to hook into the top/bottom cube face drawing functionality. Mike Dransfield 2007-05-24 Check for supported ABI earlier and do not try to read any information which would cause a crash if unsupported Mike Dransfield 2007-05-24 Load plugins if not loaded to get plugin metadata Merge: 7da52b6 3650c8e Mike Dransfield 2007-05-24 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-24 Use correct variable naming conventions Danny Baumann 2007-05-24 Notify other clients of window resizing. To do that, we emit client messages containing the current resize geometry. Additionally, we set a window property on the resized window containing this information. David Reveman 2007-05-23 Move top/bottom cube face painting into function. David Reveman 2007-05-23 Make it possible to hook into the clear target output functionality in the cube plugin. David Reveman 2007-05-23 Move clear output code into function. David Reveman 2007-05-23 Remove whitespace. David Reveman 2007-05-23 Remove whitespaces. David Reveman 2007-05-23 Add GetRotationProc to cube plugin and have rotate plugin use it to apply the cube rotation. David Reveman 2007-05-23 Allow rotate plugin to hook into cube plugin. David Reveman 2007-05-23 Make cube ABI version and display private index available through read-only options. David Reveman 2007-05-23 There's no longer an optional svg feature. David Reveman 2007-05-23 Add compiz-cube pkg-config file. David Reveman 2007-05-23 Add cube.h. David Reveman 2007-05-23 displayPrivateIndex -> cubeDisplayPrivateIndex. David Reveman 2007-05-23 Only include the headers we need. David Reveman 2007-05-23 Remove SVG support from cube plugin. David Reveman 2007-05-22 Add a match option for each resize mode. They can be used to force a specific resize mode for certain windows. David Reveman 2007-05-22 Add actions for each resize mode. David Reveman 2007-05-22 Remove whitespaces. David Reveman 2007-05-21 Wrap windowAddNotify function where necessary, David Reveman 2007-05-21 Add WindowAddNotifyProc, which is required to initialize some plugins correctly. Mike Dransfield 2007-05-21 Allow core actions on edges where it makes sense Mike Dransfield 2007-05-21 Revert "Make minimize, maximize, unmaximize and close window actions" This reverts commit 1580a740c9871114e52c7322eefdd11b30e59b25. Mike Dransfield 2007-05-21 Revert "Use active window rather than the action window for scale_group" This reverts commit 7a7109529074bf06f0dedeeb3475b0d79e9c152b. Mike Dransfield 2007-05-21 Add event_window to list of options passed to an action initiate function. This contains the underlying event window. Window will now contain the active window if an action is initiated with edge + edgebutton Merge: fb75078 fa8a12e Mike Dransfield 2007-05-21 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-21 Handle hsize and vsize of 0 properly in moveWindowToViewportPosition. David Reveman 2007-05-21 Fix initialization of color option values. Alpha component should be 1 by default. David Reveman 2007-05-21 Revert "Don't make fill colors entirely transparent by default." This reverts commit 4a2e6ec5acb11800fd130e97ff91ed3a196f1261. Merge: 1bf8f93 4a2e6ec David Reveman 2007-05-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-20 Make sure background images are always mapped to cube faces. David Reveman 2007-05-20 Send glib notify after initiating display. David Reveman 2007-05-20 Make it possible to notify glib plugin about when new sources are added to the main loop. Danny Baumann 2007-05-20 Don't make fill colors entirely transparent by default. Merge: 0b2ea93 512dcfa Danny Baumann 2007-05-20 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-20 Track the first grabbed window, not the last one. Merge: a50d2f9 1013d0a David Reveman 2007-05-18 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-18 Remove timeout based iteration of GLib main loop and instead require glib plugin. David Reveman 2007-05-18 Add glib plugin. This plugin properly integrates the GLib main loop and makes sure that any plugins that use the default GLib main loop will be dispatched efficiently. David Reveman 2007-05-18 Add compWatchFdEvents function. Danny Baumann 2007-05-18 Fix typo. Danny Baumann 2007-05-18 Don't issue ungrab notify before server side processing is finished. David Reveman 2007-05-17 Turn the texture filter option into an integer option. Merge: f9d53e8 d11eb40 David Reveman 2007-05-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-17 Turn the mode option into an integer option. David Reveman 2007-05-17 Turn the filter option into an integer option. David Reveman 2007-05-17 Add macros that make it easier to use integer options as selections. Merge: 1e1a442 9c1902c Mike Dransfield 2007-05-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-17 Handle cases where there is no trailing newline in the option file Merge: 54649b7 bedcf71 David Reveman 2007-05-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-17 Add border_color and fill_color options. David Reveman 2007-05-17 Cleanup. David Reveman 2007-05-17 Cleanup. David Reveman 2007-05-17 Cleanup. David Reveman 2007-05-17 Add stretch resize mode. David Reveman 2007-05-17 Add rectangle resize mode. David Reveman 2007-05-17 Add outline resize mode. David Reveman 2007-05-16 Remove unnecessary code. David Reveman 2007-05-16 Make it possible to end resize when resize notify is received. David Reveman 2007-05-16 No need to check if only position changes as we'll never change the position without changing the size. David Reveman 2007-05-16 Update size even when pointerDx and pointerDy are 0. David Reveman 2007-05-16 Adjust position in motion handler. David Reveman 2007-05-16 Replace width, height with geometry and constrain window size in motion handler. David Reveman 2007-05-16 Remove ucWidth, ucHeight and use pointerDx, pointerDy instead. David Reveman 2007-05-16 Resize plugin should always use the server side window geometry. David Reveman 2007-05-16 Replace savedAttrib with savedGeometry rectangle. Dennis Kasprzyk 2007-05-16 Added dependency rules to blur metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to cube metadata David Reveman 2007-05-16 Add pointerDx and pointerDy. Dennis Kasprzyk 2007-05-16 Added dependency rules to decorations metadata David Reveman 2007-05-16 Track changes to constrainNewWindowSize. Dennis Kasprzyk 2007-05-16 Added dependency rules to fade metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to gconf metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to minimize metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to plane metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to rotate metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to water metadata Dennis Kasprzyk 2007-05-16 Added dependency rules to wobbly metadata David Reveman 2007-05-16 Remove whitespaces. Danny Baumann 2007-05-16 Make constrainNewWindowSize return TRUE whenever constraining was applied. Mike Dransfield 2007-05-16 Make minimize, maximize, unmaximize and close window actions use the active window Merge: 95031b0 1e5ca8a Mike Dransfield 2007-05-16 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-15 Fix next/prev slide bindings in cube plugin. David Reveman 2007-05-15 Don't call initDisplay in initPluginForDisplay and don't call initScreen in initPluginForScreen as it breaks wrapping of those functions completely. Merge: 65f0ddb f647b95 David Reveman 2007-05-15 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-15 Fix size hint calculations. If a base size is not provided, the minimum size is to be used in its place and vice versa. Merge: 7a71095 5dba889 Mike Dransfield 2007-05-15 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-15 Use active window rather than the action window for scale_group and rotate with window options David Reveman 2007-05-15 Disable call to XFixesHideCursor until the software cursor code is actually used. Travis Watkins 2007-05-14 Check that xsltproc binary is present. David Reveman 2007-05-14 Make minimum rain delay 1. David Reveman 2007-05-14 Make sure key and button are not NULL. Erkin Bahceci 2007-05-13 Center title wave starting y (was 1/4 below). Erkin Bahceci 2007-05-13 Disable textures and texture targets properly. Erkin Bahceci 2007-05-12 Slightly speed up Water by replacing a SUB-MUL pair with MAD. David Reveman 2007-05-14 Require libxslt. Mike Dransfield 2007-05-13 Typo Mike Dransfield 2007-05-12 Send a blank string if shortDesc or longDesc are NULL David Reveman 2007-05-11 Add missing DISTCLEANFILES. David Reveman 2007-05-11 Fix installation of compiz.desktop and key-binding files. David Reveman 2007-05-11 schemas.xslt is located in the source directory. Merge: 92e6e2f 9a4705c David Reveman 2007-05-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Merge: 0609c16 48ddb2e Danny Baumann 2007-05-11 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-11 Fix typo. David Reveman 2007-05-10 Have the adjust image option behave as when it was previously turned off and make the default behavior keep the image oriented the same all the time. Merge: f527385 48ddb2e Mike Dransfield 2007-05-10 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-08 Add schema_files to EXTRA_DIST. David Reveman 2007-05-08 Fix typo. David Reveman 2007-05-08 Parse --replace option properly. David Reveman 2007-05-08 Fix typo. David Reveman 2007-05-08 Distribute schema files. David Reveman 2007-05-08 Add schemas.xslt to EXTRA_DIST. David Reveman 2007-05-07 Update po files. David Reveman 2007-05-07 Update POTFILES.in. David Reveman 2007-05-07 Update plane plugin to use new metadata system. Mike Dransfield 2007-05-08 Update ini to use metadata David Reveman 2007-05-06 Make freedesktop image default for top face. David Reveman 2007-05-06 Fix typo. David Reveman 2007-05-06 Remove getOuterRectOfWindow function from core. David Reveman 2007-05-06 Don't use getOuterRectOfWindow from core because it returns the visible geometry for a window, which doesn't include pending configure requests and those are important when placing windows. David Reveman 2007-05-04 Install stylesheet and compiz-gconf.pc. David Reveman 2007-05-04 Use compiz- prefix for all schema files. David Reveman 2007-05-04 Rename core metadata file to core.xml instead of compiz.xml. Merge: be66a46 d9bd3ba Mike Dransfield 2007-05-04 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-04 Cleanup. David Reveman 2007-05-04 Set type hint on switcher window properly. David Reveman 2007-05-04 Cleanup. Mike Dransfield 2007-05-04 Added comment about otherScreenGrabExist Danny Baumann 2007-05-04 First attempt to focus the window under the pointer if 'click to focus' is not enabled. If there is no such window, still focus the last active window. David Reveman 2007-05-03 Minor fix to have new schemas match old schemas. David Reveman 2007-05-03 Add passive_grab tag to snap action. David Reveman 2007-05-03 Update po files. David Reveman 2007-05-03 We're not using asprintf anymore. David Reveman 2007-05-03 Remove option descriptions from CompOption structure. David Reveman 2007-05-03 Remove plugin descriptions from VTable. David Reveman 2007-05-03 Remove gconf-dump plugin and old schema generation system. David Reveman 2007-05-03 Create gconf schemas from metadata files using XSLT stylesheet created by Dennis Kasprzyk. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Remove unnecessary variables. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Remove unnecessary variable. David Reveman 2007-05-03 More cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Remove unnecessary checks. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Cleanup. David Reveman 2007-05-03 Remove trailing whitespaces. David Reveman 2007-05-03 Remove trailing whitespaces. David Reveman 2007-05-03 Remove trailing whitespace. Merge: dab181f b68ae0e David Reveman 2007-05-03 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: metadata/Makefile.am Merge: 851a217 9743dc7 Danny Baumann 2007-05-03 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-03 Fix some minor metadata errors. Merge: e3c0857 9743dc7 Mike Dransfield 2007-05-03 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: 3e1ff3b a6df2f4 Mike Dransfield 2007-05-03 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-05-03 If event->len is 0 then send NULL instead of event->name David Reveman 2007-05-03 Update rotate plugin to use new metadata system. Merge: ba58439 5ac36f2 Danny Baumann 2007-05-03 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-05-03 Update scale plugin to use new metadata system. Dennis Kasprzyk 2007-05-03 Metadata of the fuse plugin has to be fs.xml not fuse.xml Danny Baumann 2007-05-03 Update screenshot plugin to use new metadata system. Danny Baumann 2007-05-03 Update svg plugin to use new metadata system. Danny Baumann 2007-05-03 Update switcher plguin to use new metadata system. Danny Baumann 2007-05-03 Make all option info structures const. Danny Baumann 2007-05-03 Fix typo. Danny Baumann 2007-05-03 Update video plugin to use new metadata system. Danny Baumann 2007-05-03 Update water plugin to use new metadata system. Danny Baumann 2007-05-03 Update wobbly plugin to use new metadata system. Danny Baumann 2007-05-03 Update zoom plugin to use new metadata system. David Reveman 2007-05-02 Have plugins update list of match options manually until we have a solution for automatic updates of new list items. David Reveman 2007-05-02 Update regex plugin to use new metadata system. David Reveman 2007-05-02 Remove trailing whitespace. David Reveman 2007-05-02 Remove trailing whitespace. David Reveman 2007-05-02 Update png plugin to use new metadata system. David Reveman 2007-05-02 Fix metadata description for minimize plugin. David Reveman 2007-05-02 Update place plugin to use new metadata system. David Reveman 2007-05-02 Update move plugin to use new metadata system. David Reveman 2007-05-02 Add missing calls to compAddMetadataFromFile. David Reveman 2007-05-02 Update minimize plugin to use new metadata system. David Reveman 2007-05-02 Update inotify plugin to use new metadata system. David Reveman 2007-05-02 Update gconf plugin to use new metadata system. David Reveman 2007-05-02 Update fuse plugin to use new metadata system. Merge: ba588c7 da84dad David Reveman 2007-05-02 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-05-02 Update fade plugin to use new metadata system. David Reveman 2007-05-02 Startup sequence workspace is only valid if it's greater or equal to 0. Mike Dransfield 2007-05-02 Code formatting and variable naming Mike Dransfield 2007-05-02 Code formatting Mike Dransfield 2007-05-02 Remove trailing whitespace Erkin Bahceci 2007-05-01 Add override_redirect matching support. David Reveman 2007-05-01 Only allow position to wrap around if virtual desktop dimension is greater than screen dimension. David Reveman 2007-05-01 Add metadata file for dbus plugin. David Reveman 2007-05-01 Update decoration plugin to use new metadata system. David Reveman 2007-05-01 Update dbus plugin to use new metadata system. David Reveman 2007-04-30 Add proper installation of custom gnome key-bindings. Merge: 4bd5286 572f759 David Reveman 2007-04-30 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-30 Update clube plugin to use new metadata system. David Reveman 2007-04-30 Check for passive_grab element when initializing action state. Merge: 82ab3b0 572f759 Mike Dransfield 2007-04-29 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-29 Change CompAction private to be a CompPrivate Merge: 5eb33b7 e49fbce Mike Dransfield 2007-04-29 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-27 Update clone plugin to use new metadata system. David Reveman 2007-04-27 Check if libwnck version is new enough to support ABOVE action. David Reveman 2007-04-25 Clean up. David Reveman 2007-04-25 Update blur plugin to use new metadata system. David Reveman 2007-04-25 Remove unnecessary call to addScreenAction. David Reveman 2007-04-25 Add missing call to compFiniDisplayOptions. Dennis Kasprzyk 2007-04-25 Moved private pointer variable to the CompAction struct Mike Dransfield 2007-04-25 Fix typo in function name Merge: 1b0ae38 7f518da Robert Carr 2007-04-25 Merge branch 'master' of git+ssh://racarr@git.freedesktop.org/git/xorg/app/compiz Robert Carr 2007-04-25 Add a priv entry to CompAction. For a use case see: compiz-scheme. It's neccesary to implement in a proper way actions that have to go through a wrapper C function. In general the idea of having Actions without an assosciated Option / Actions added at run time needs to be explored a bit more because the current code is not well suited for it. Merge: 08126fa 6ea8825 David Reveman 2007-04-25 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-25 Add resize mode option to resize plugin. David Reveman 2007-04-25 Update resize plugin to use new metadata system. David Reveman 2007-04-25 Remove code that will try to create both a direct rendering context and an indirect rendering context when GLX_EXT_tfp isn't supported. Danny Baumann 2007-04-25 Remove unneeded code. David Reveman 2007-04-24 Add adjust_image option to cube plugin. The rotation of the top face image will only be adjusted when this option is set to true. Default is now to use the same rotation for the image. Merge: a319d58 5a7eedc Mike Dransfield 2007-04-25 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-24 Use single precision version of sine and cosine functions. James Jones 2007-04-23 Fix unredirect fullscreen windows. In paint.c!paintScreenRegion(): -Need to subtract window's region from tmpRegion before checking if tmpRegion is NULL. -Don't try to draw the unredirected window, as it will be immediately redirected again by paint.c!drawWindow() James Jones 2007-04-23 Only use bindTexImage and releaseTexImage on textures that have associated pixmaps. David Reveman 2007-04-24 Remove unused definitions. David Reveman 2007-04-24 Initialize hsize and vsize from initial option values. David Reveman 2007-04-24 Remove opacityStep variable in CompScreen struct. David Reveman 2007-04-24 Remove unused variable. David Reveman 2007-04-24 Removed unused variables. David Reveman 2007-04-24 Use compSetDisplayOption. David Reveman 2007-04-24 Use compSetDisplayOption and compSetScreenOption. David Reveman 2007-04-24 Add compSetDisplayOption and compSetScreenOption. Merge: 4bc3c98 7f36a24 David Reveman 2007-04-24 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-24 Add CompActionStateAutoGrab action state, which isused to indicate that passive grabs for any key or mouse bindings in an action option should automatically be added and removed. Dennis Kasprzyk 2007-04-24 Added -L${libdir} to libdecoration pkg-config file to fix linking of other decorators David Reveman 2007-04-24 Add helper tag to match options. This tag can be used to indicate that the match object should not be automatically updated when initialized and when the option value changes. Danny Baumann 2007-04-24 Added an Y viewport parameter to the function moveWindowToViewportPosition. Merge: 910b041 701b49b Mike Dransfield 2007-04-23 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-23 Change compRemoveTimeout to return the closure David Reveman 2007-04-20 Remove C-style comment from configure.ac. Merge: 19de2f8 36ca8bf David Reveman 2007-04-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-20 Remove whitespaces. David Reveman 2007-04-20 Fix typo in amount of memory to allocate. Roi Cohen 2007-04-20 Fix screen transformation calculation. David Reveman 2007-04-20 Make sure background is painted properly when performing zoom effect. David Reveman 2007-04-20 Remove whitespace. David Reveman 2007-04-20 Only place window if it's not placed by someone else. David Reveman 2007-04-20 Declarations at top of scope. David Reveman 2007-04-20 Remove redundant code. David Reveman 2007-04-20 Move newX and newY variables to the scope where they are used. David Reveman 2007-04-20 Remove some whitespaces. Merge: 794a341 baed3a2 Mike Dransfield 2007-04-20 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: 9727e91 c067ddf Danny Baumann 2007-04-20 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Conflicts: include/compiz.h Danny Baumann 2007-04-20 Added PlaceWindowProc function. Plugins that want to influence initial window placement can wrap into this function and adjust the window position. This change also fixes the place plugin for applications not supporting the sync request protocol. David Reveman 2007-04-20 Add basic background support to cube plugin. David Reveman 2007-04-19 Add support for _NET_WM_ACTION_ABOVE and _NET_WM_ACTION_BELOW. David Reveman 2007-04-19 Keep track of available texture targets and avoid calls to glXQueryDrawable when possible. Merge: aca8879 2ca7779 Mike Dransfield 2007-04-19 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-19 Always update event windows when state changes to make sure they are adjusted correctly for when a window gets shaded or un-shaded. David Reveman 2007-04-19 Adjust frame window properly when shaded. Danny Baumann 2007-04-19 Update decoration on map request before core handles the request. Merge: b05b63d 6f1b4d6 Mike Dransfield 2007-04-18 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-18 Update po files. David Reveman 2007-04-18 Make sure autogen.sh runs intltoolize. David Reveman 2007-04-18 Don't use config dir for autoconf config files as it doesn't seem to be working well with intltool. Merge: bb60bb9 68aa945 David Reveman 2007-04-18 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-18 Load both user and system metadata files. Danny Baumann 2007-04-18 Bump ABIVERSION due to warpPointer() changes. Kristian Lyngstol 2007-04-18 Do not use shareList. Do not attempt to share across screens/contexes. Make sure the current screen's context is current context before modifying textures. Kristian Lyngstol 2007-04-17 Change warpPointer() to take a CompScreen as argument. This is necesarry to avoid warping the pointer to the wrong screen, and also fixes what is known as "crazy spinning" in rotate. David Reveman 2007-04-17 Clean up. Merge: 294fd0a a447479 David Reveman 2007-04-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-17 Convert annotate plugin to use new metadata system and store default option values in an external xml file. David Reveman 2007-04-17 Improve option initialization and loading of hard coded metadata for core and plugins. Dennis Kasprzyk 2007-04-17 Update match during initialisation from metadata. Merge: 499ec53 90dd79d Mike Dransfield 2007-04-17 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-04-17 initialize float value correctly from metadata David Reveman 2007-04-16 Remove whitespace. David Reveman 2007-04-16 Add GetMetadata function to plugin VTable. David Reveman 2007-04-16 Clean up. Merge: e1b5900 912a2d7 David Reveman 2007-04-16 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-16 Use intltool for translations. David Reveman 2007-04-16 Use .xml file extensions for metadata files. Danny Baumann 2007-04-16 Fixed string length calculations. Danny Baumann 2007-04-16 Fix stack corruption caused by an insufficient size of an allocated buffer. Mike Dransfield 2007-04-15 Reinitialize variable Mike Dransfield 2007-04-15 Properly format code Merge: 58cf63b 376a94a Mike Dransfield 2007-04-15 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Patrick Niklaus 2007-04-13 Fixed bug with action parsing Danny Baumann 2007-04-15 Some beautification. Patrick Niklaus 2007-04-12 Fixed list parsing Patrick Niklaus 2007-04-12 Some minor cleanup in iniLoadOptionsFromFile Patrick Niklaus 2007-04-12 Cleaned up iniParseLine Patrick Niklaus 2007-04-12 Fixed list parsing (plugged a memory leak) Merge: dbbc119 5f0f272 David Reveman 2007-04-13 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-12 string -> value. David Reveman 2007-04-12 Add convenient option info structure and initialize all core options completely from metadata. David Reveman 2007-04-12 Initialize option descriptions. David Reveman 2007-04-12 Fix function declaration. David Reveman 2007-04-12 Failure to read additional metadata from file is not fatal. David Reveman 2007-04-12 Add hardcoded metadata for core. Merge: 7c4262b 5f0f272 Mike Dransfield 2007-04-12 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-12 Remove extra unneeded function Mike Dransfield 2007-04-12 Removed registration checks and unneeded variables David Reveman 2007-04-12 Update metadata.c header. David Reveman 2007-04-12 general -> core. David Reveman 2007-04-12 element -> value. David Reveman 2007-04-12 Update core metadata. David Reveman 2007-04-12 Clean up action edge initialization. David Reveman 2007-04-12 Clean up action bell initialization. Mike Dransfield 2007-04-12 Always send list values as an array David Reveman 2007-04-12 Clean up action key/button initialization. David Reveman 2007-04-12 Initialize action state properly. Mike Dransfield 2007-04-12 Unregister objects in correct order Mike Dransfield 2007-04-12 Register screen options properly David Reveman 2007-04-12 Use restrictions when initializing options. David Reveman 2007-04-12 Initialize restrictions before default value. David Reveman 2007-04-12 Fix so that string restrictions can be overloaded appropriately. Mike Dransfield 2007-04-12 Fix build error Mike Dransfield 2007-04-12 Use COMPIZ_DBUS_ROOT_PATH define David Reveman 2007-04-12 Fix so that int and float restrictions can be overloaded appropriately. Mike Dransfield 2007-04-12 Tiny typo David Reveman 2007-04-12 Add stringFromMetadataPathElement function. Merge: 518a9b4 7841367 Mike Dransfield 2007-04-12 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-12 Use correct variable naming conventions Mike Dransfield 2007-04-12 Changed registration system to re-register on active_plugins change David Reveman 2007-04-12 Update option initialization so that appropriate values can be overloaded by hardcoded metadata documents. Merge: 8ab3cf4 26b1edf Mike Dransfield 2007-04-12 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: d9fd9c3 692c842 Mike Dransfield 2007-04-12 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-12 Remove trailing whitespace Danny Baumann 2007-04-12 Fix dangling comma in list writing. David Reveman 2007-04-11 Remove initOptionFromNode. David Reveman 2007-04-11 Clean up getOptionType function. David Reveman 2007-04-11 Node must contain at least one matching element. David Reveman 2007-04-11 Add initXPathFromMetadataPath, which searches all xml documents in metadata object for a match. David Reveman 2007-04-11 Allow one metadata object to contain multiple xml document references. David Reveman 2007-04-11 Make compAddMetadataFromFile add metadata file extension and search for file in the users home directory as well as the system wide metadata directory. David Reveman 2007-04-11 Clean up. David Reveman 2007-04-11 Move core metadata initialization to main.c. David Reveman 2007-04-11 Change so that heap allocated metadata objects are not required. David Reveman 2007-04-11 These kind of safety checks are bad and they don't belong in this code. David Reveman 2007-04-11 Store path instead of plugin name in metadata object. David Reveman 2007-04-11 compGetMetadataFromString should take a const char pointer. David Reveman 2007-04-11 Use datadir for metadata. David Reveman 2007-04-11 Remove some whitespace and place libxml-2.0 dependency before libstartup-notification-1.0 dependency so backslashes are aligned properly. David Reveman 2007-04-11 Clean up compiz.h. David Reveman 2007-04-11 Fix metadata code so it doesn't require external Display variable. David Reveman 2007-04-11 Fix typo in header. Dennis Kasprzyk 2007-04-11 initialize core options from metadata Dennis Kasprzyk 2007-04-11 fixed some xml parsing errors Dennis Kasprzyk 2007-04-11 added Metadata parsing system Merge: efcabb2 9b0eae5 Mike Dransfield 2007-04-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-11 Fix crash if config file contains invalid action options Merge: f2773cb 9b0eae5 Mike Dransfield 2007-04-11 Merge branch 'master' of git://git.freedesktop.org/git/xorg/app/compiz Merge: 9a65544 06fca54 Mike Dransfield 2007-04-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-11 Add Introspection support to dbus Danny Baumann 2007-04-11 Fix mem leaks Merge: d077219 a71a9b3 Mike Dransfield 2007-04-11 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-11 Code formatting changes Patrick Niklaus 2007-04-11 Improve action reading code David Reveman 2007-04-11 Add xml files for gnome keybinding capplet. Merge: 1b6bdc3 6878c70 Danny Baumann 2007-04-10 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-10 Raise windows whenever their fullscreen, above/below or maximization state changed. Mike Dransfield 2007-04-09 Made define name more consistent Merge: 59e9a3f 2a080b2 Mike Dransfield 2007-04-09 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-09 Regenerate schemas Mike Dransfield 2007-04-09 Regenerate schemas David Reveman 2007-04-09 Disable metacity and gnome when gtk is disabled. Merge: fe36623 cb9a43e David Reveman 2007-04-08 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-08 Avoid strict-aliasing violations. David Reveman 2007-04-08 Don't add -fno-strict-aliasing flag. Danny Baumann 2007-04-08 Added possibility to call updateWindowAttributes without requesting any stack changes. Also use this whereever appropriate to make sure no unwanted stack changes occur. David Reveman 2007-04-07 Report used buttons properly. David Reveman 2007-04-07 Require metacity 2.17.0 for META_FRAME_ABOVE flag. Merge: 252fbad 25ec830 David Reveman 2007-04-07 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Gerd Kohlberger 2007-04-07 Remove deprecated gdk API. David Reveman 2007-04-07 Require metacity 2.17.0 when building support for additional button types. David Reveman 2007-04-07 Never add shaded state. Danny Baumann 2007-04-07 Make gwd build without Metacity support. David Reveman 2007-04-06 Reduce code by using compSetOption. David Reveman 2007-04-06 Remove whitespaces. David Reveman 2007-04-06 Remove whitespaces. David Reveman 2007-04-06 Add break to last case section. Merge: 337d24c 55bd1bd David Reveman 2007-04-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-04-06 Reduce code by using compSetOption. David Reveman 2007-04-06 Reduce code by using compSetOption. David Reveman 2007-04-06 Add compSetOption function. Merge: c3a7fc2 1708507 Mike Dransfield 2007-04-06 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-04-06 Fix action options with long names David Reveman 2007-04-06 Ignore resize increment hint only for dimensions that are maximized. David Reveman 2007-04-06 Indent correctly. David Reveman 2007-04-06 Position action menu properly. David Reveman 2007-04-06 Add all button types that libmetacity support and make button layout configurable. David Reveman 2007-04-05 Avoid unnecessary work in kwd when window position changed. David Reveman 2007-04-05 Avoid unnecessary work in gwd when window position changed. David Reveman 2007-04-05 Update constrain region creation so that windows are constrained from being moved to screen regions that are not visible in any output. David Reveman 2007-04-05 Compare to and update server side position for each motion notify. Cedric 2007-04-05 Fix typo in matching code. Merge: a084d7d 932d9fe David Reveman 2007-04-05 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-05 Another attempt at correctly fixing the calculations in outputDeviceForGeometry. We also have to check the left window edge for equality as the output device regions right edge is 1-based. Danny Baumann 2007-04-05 Fix rectangle-in-range calculation for outputDeviceForGeometry. David Reveman 2007-04-05 Fall-back to default refresh rate if driver is reporting 0 as refresh rate. Danny Baumann 2007-04-05 Avoid explicit comparison with FALSE constant Erkin Bahceci 2007-04-04 Add open/close option. Merge: b698a6c 709d0ee David Reveman 2007-04-04 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Merge: 53c674c a303060 Danny Baumann 2007-04-04 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-04 Add 'group-drag' as an allowed screen grab for edge flipping. This screen grab is issued by the group plugin when tab bar slots are dragged to other tab bars. Danny Baumann 2007-04-04 Reflect minimum size hint when adding size changes. Danny Baumann 2007-04-04 Check for active screen grabs before unsnapping a maximized window. Mike Dransfield 2007-04-03 Bump ABI version Mike Dransfield 2007-04-03 Changed plugin vTable option functions to include a reference to the plugin as per other vTable functions. David Reveman 2007-04-02 Post release version increment. David Reveman 2007-04-02 Bump version. David Reveman 2007-04-02 Add NEWS entry for 0.5 release. Danny Baumann 2007-04-02 Update decorator version information. This change was missed when adding the quad stretching interface in commit 3c434da32d24b580d0bff968f302ead1781864e8. Merge: edf914f f6764b3 Danny Baumann 2007-04-02 Merge branch 'master' of git+ssh://maniac@git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-04-02 Remove screen actions un plugin unload. Danny Baumann 2007-04-02 Free allocated cursors on plugin unload. Travis Watkins 2007-03-13 Register plugin, screen, and option objects. Travis Watkins 2007-03-13 Switch to object registration instead of message filtering. Travis Watkins 2007-03-13 Add dbus introspection generation functions. Travis Watkins 2007-03-13 Add libxml2 build dependency. Travis Watkins 2007-03-13 Add functions to generate dbus introspection XML. David Reveman 2007-04-01 make update-po. David Reveman 2007-04-01 Update POTFILES.in. David Reveman 2007-04-01 Add more translations. David Reveman 2007-04-01 Update translations. David Reveman 2007-03-30 Make sure that widget or children isn't 0. David Reveman 2007-03-30 Adjust metacity border region code so it matches latest version of metacity. Cedric 2007-03-30 Add Vertical/Horizontal maximization. David Reveman 2007-03-29 Remove signal handling from display.c. David Reveman 2007-03-29 Handle SIGINT and SIGTERM in main.c. David Reveman 2007-03-29 Restart if restartSignal is true. David Reveman 2007-03-29 Return from event loop instead of calling exit. Merge: 2087f96 de9ca3b David Reveman 2007-03-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-03-28 new imageDataToTexture function to specify gl format/type parameters (replaces fixedRGBA option) Merge: d7f7338 8e3b26f Mike Dransfield 2007-03-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-03-28 Make action options atomic Merge: 9c2b298 8e3b26f David Reveman 2007-03-28 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Danny Baumann 2007-03-28 Added possibility to load textures with fixed RGBA byte ordering from header files. Robert Carr 2007-03-27 Revert "Use glXQueryServerString for indirect rendering case." This reverts commit 3c434da32d24b580d0bff968f302ead1781864e8. Robert Carr 2007-03-27 Use glXQueryServerString for indirect rendering case. Merge: 8cdf7e9 f04dccc David Reveman 2007-03-26 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-03-25 Added Erkin to AUTHORS file Erkin Bahceci 2007-03-24 Added switcher activate event to notify other plugins when the switcher animation has started/finished. Erkin Bahceci 2007-03-24 Fix for negative float option values Gerd Kohlberger 2007-03-21 Remove unneeded function and variable mike@blueroot.co.uk 2007-01-27 Allow plugins to wrap enter/leaveShowDesktopMode Danny Baumann 2007-03-21 Added quad stretching interface to libdecoration. Decorators wanting to display stretched quads can set the q->stretch member accordingly. In this case, q->max_width / q->max_height should contain the size of the unstretched texture. Danny Baumann 2007-03-21 Fixed matrix calculations for xy and yx coordinates Merge: 3009849 f0e6238 Mike Dransfield 2007-03-17 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Mike Dransfield 2007-03-17 Correct typo in comments David Reveman 2007-03-16 Expose edges as files with boolean values and add write support for them. David Reveman 2007-03-16 Add write support for list items in fuse plugin. David Reveman 2007-03-16 Avoid using variable name 'private' in compiz.h. David Reveman 2007-03-15 Only allow move with window when we're currently not moving. David Reveman 2007-03-15 Don't index past the end of the array. Mike Dransfield 2007-03-14 Prevent excessive reads and writes David Reveman 2007-03-14 Wrap matchPropertyChanged function and update window decorations when a property that might affect decoration matching changed. David Reveman 2007-03-14 Add shadow match option. David Reveman 2007-03-14 Add basic write support. List options and edges in action options are still read-only. Dennis Kasprzyk 2007-03-13 Replace shader based blending with hardware blending. David Reveman 2007-03-13 Fix so mipmap and 4xbilinear filters work again. David Reveman 2007-03-13 We have a screen variable, use it. David Reveman 2007-03-13 Place windows with an invalid desktop number on current desktop instead of all desktops. David Reveman 2007-03-13 Remove signal handling from fuse plugin. It's not longer needed as the core is now cleaning up plugins properly before exiting. David Reveman 2007-03-13 Clean up plugins before exiting. David Reveman 2007-03-13 Basic signal handling. David Reveman 2007-03-12 Some minor coding style changes and remove some whitespaces. Merge: e4a1fa4 43fadab David Reveman 2007-03-12 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Dennis Kasprzyk 2007-03-12 Added blur occlusion detection. This will disable multiple levels of blur on overlapping blur regions. Dennis Kasprzyk 2007-03-12 Save lastPaint and lastMask during occlusion detection. Dennis Kasprzyk 2007-03-12 Don't blur opaque windows if decorations are also blured. David Reveman 2007-03-12 Track changes to decoration plugin. Switcher window is a decorated window so motif hints that tell the WM not to decorate it shouldn't be set. The only problem with this is that the switcher window might appear with default decorations for short period before the decorator is able to update it with correct decorations. This is still much more correct than before and if the default decorations turns out to be a problem we'll come up with more correct solution for that. David Reveman 2007-03-12 Update decoration selection so it makes a bit more sense. The decorator shouldn't be able to override hints. David Reveman 2007-03-12 Add decoration match option. David Reveman 2007-03-12 Add option that makes it possible to turn off YV12 filter support. This is useful for hardware/drivers where software colorspace conversion is more efficient than using fragment programs. Cedric 2007-03-12 Respect allowed actions hint. David Reveman 2007-03-11 Check for sync alarm notify after core handleEvent function has been called as syncWait will always be true otherwise. David Reveman 2007-03-11 Create a pango layout for when drawing default decorations. Makes the default decorations more correct. David Reveman 2007-03-11 Set up clip planes so we're clipping to the region extents. Makes more sense than just clipping to the output extents and fixes some clipping issues with the cube plugin. David Reveman 2007-03-09 Call repaint to make sure decorations are updated properly when they are resized. David Reveman 2007-03-09 Some themes update the layout when the borders function is called so we should call it with the correct window state after we've used it for getting maximized border size. David Reveman 2007-03-09 Add fuse plugin. It provides a user space file-system with compiz information. E.g. all options are represented as directories and and current values can be retrieved by reading files in these directories. It's read-only right now but write support will be added soon and it will allow you to manipulate options by writing to files. David Reveman 2007-03-08 Rewrite restackWindowBelow. The old implementation was broken as it allowed stacking to positions where windows are not allowed to be. New implementation makes sure windows are always stacked at allowed positions. This issue caused windows being prevented from focus to sometimes be placed behind one of it's ancestors. David Reveman 2007-03-07 The active viewport coordinate solution is not good enough in a lot of cases where windows span more than one viewport. Replace most of it with a general active window history stored in the screen structure. David Reveman 2007-03-07 Add activeViewportX and activeViewportX members to the CompWindow struct to keep track of the viewport the window was last active in. This can be used to more properly calculate to which window the input focus should be moved to and the compareWindowActiveness function has been added to make this more convenient. David Reveman 2007-03-07 count should be incremented for each window. David Reveman 2007-03-07 Don't calculate available actions until plugins have initialized the window. recalcWindowType should never call recalcWindowActions. David Reveman 2007-03-07 Shut up compiler. Mike Dransfield 2007-03-07 Add flat file configuration backend. David Reveman 2007-03-06 Use findTopLevelWindowAtDisplay when receiving FocusIn events as the frame might be the window that got focused when the client window is shaded. David Reveman 2007-03-06 Windows can't occlude anything when shaded. Dennis Kasprzyk 2007-03-06 Splits bw->region into 5 regions (top, bottom, left, right and center) and projects each separately to avoid unnecessary work during first pass with gaussian filter. David Reveman 2007-03-06 Fix typo. David Reveman 2007-03-06 Add getAllowedActionsForWindow function that plugins can wrap to restrict available actions for a window. David Reveman 2007-03-06 Remove PAINT_WINDOW_CLIP_OPAQUE_MASK and PAINT_WINDOW_CLIP_TRANSLUCENT_MASK flags. The PAINT_WINDOW_OCCLUSION_DETECTION_MASK flag and the new occlusion detection code replaces them. David Reveman 2007-03-06 Add comment about occlusion detection. David Reveman 2007-03-06 Cleanup paintTransformedScreen a bit. David Reveman 2007-03-06 Really remove windowMask and backgroundMask from paintTransformedScreen. David Reveman 2007-03-06 Remove windowMask and backgroundMask from paintTransformedScreen. David Reveman 2007-03-06 Move cursor painting into paintScreenRegion. David Reveman 2007-03-06 Have paintTransformedScreen use paintScreenRegion. David Reveman 2007-03-06 Have paintScreenRegion accept a screen paint mask instead. David Reveman 2007-03-06 Have paintScreen always use paintScreenRegion. David Reveman 2007-03-06 No need to pass backgroundMask to paintScreenRegion. David Reveman 2007-03-06 Add unredirect fullscreen windows support to paintScreenRegion. David Reveman 2007-03-06 Move occlusion detection and window painting to static function. David Reveman 2007-03-06 Avoid some duplicate code. David Reveman 2007-03-06 Avoid overflow in opacity calculations by changing range of opacityFactor from 0-OPAQUE to 0-0xff. Dennis Kasprzyk 2007-03-06 Use occlusion detection on PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK. Dennis Kasprzyk 2007-03-06 Added occlusion detection for PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK screen paints. Dennis Kasprzyk 2007-03-06 Added occlusion detection handling to paintWindow. Dennis Kasprzyk 2007-03-06 Added occlusion detection window paint mask. Bellegarde Cedric 2007-03-05 Fix typo. David Reveman 2007-03-05 Bump ABI version. Danny Baumann 2007-03-05 Add grabbed variable to CompWindow struct. Danny Baumann 2007-03-05 Keep track of last state. Danny Baumann 2007-03-05 Add deltas to resize notify function. Bellegarde Cedric 2007-03-05 Add window position/viewport matching to place plugin. Bellegarde Cedric 2007-03-05 Check allowed actions before initiating move or resize. David Reveman 2007-03-05 Move windowStateChangeNotify call to changeWindowState function. David Reveman 2007-03-05 Use changeWindowState instead of setWindowState. David Reveman 2007-03-05 Add changeWindowState function. David Reveman 2007-03-05 Remove whitespaces. Per Wigren 2007-03-05 Add --only-current-screen option which tell compiz to only manage the screen defined by $DISPLAY and leave the others alone. Bellegarde Cedric 2007-03-05 Add window role matching to regex plugin. Bellegarde Cedric 2007-03-05 Remove focus prevention option. David Reveman 2007-03-05 Video plugin must be stacked above blur and water plugins. David Reveman 2007-03-05 Add direct composited video plugin. Using _COMPIZ_VIDEO property. RGB and YV12 image formats are currently supported. YV12 image format requires 8 bit alpha only GLX pixmap support. Known issues: Doesn't work with unredirect_fullscreen_windows option. David Reveman 2007-03-02 Add NOTIFY_MODIFY_MASK. dragoran 2007-03-02 Add --ignore-desktop-hints command line option, which can be used to make compiz not read "number of desktops" and "current desktop" hints left by previous WM. David Reveman 2007-03-01 Make addWindowSizeChanges use new window geometry for viewport and output as that makes it possible to move maximized and fullscreen windows to different viewports and outputs. David Reveman 2007-03-01 Move defaultViewportForWindow and outputDeviceForWindow implementation to screen.c. David Reveman 2007-03-01 Add fadeOut variable to keep track of windows that fade out. David Reveman 2007-03-01 Make sure we set state to Normal again when window is mapped. David Reveman 2007-03-01 Make sure mBorder gets initialized. David Reveman 2007-03-01 Set a top anchor when resizing a wobbly window. David Reveman 2007-03-01 Regen compiz.schemas.in. David Reveman 2007-03-01 Change default map effect to None. David Reveman 2007-03-01 Remove invalid window types and add Unknown. David Reveman 2007-03-01 Remove invalid window types. David Reveman 2007-03-01 Read current window position properly. David Reveman 2007-03-01 Add unknown window type to default window match. David Reveman 2007-03-01 Don't end zoom animation so quickly. David Reveman 2007-03-01 Perform zoom effect by translating screen instead of windows. David Reveman 2007-03-01 Only draw top/bottom face after clearing screen. David Reveman 2007-03-01 Make sure we don't clear an output more than once per screen updated. David Reveman 2007-03-01 No need to clear the stencil buffer. David Reveman 2007-02-28 Fix another typo in 4xBilinear filter. Offset parameter should be multiplied and then added to texture coordinate. David Reveman 2007-02-28 Fix typo in 4xBilinear filter code. David Reveman 2007-02-28 Enable the code in the placement plugin that maximize windows when they are too big for their work area. Bellegarde Cedric 2007-02-28 Add centered, smart, maximize and random placement modes. David Reveman 2007-02-28 Add opacity match options and improve the behavior of opacity increase/decrease actions. Increase/decrease actions will no longer modify the opacity property. David Reveman 2007-02-28 Fix initialization of regex plugin. Handler should not be registered until all screens and windows have been initialized. David Reveman 2007-02-28 Do not modify window paint struct, use destroyCnt unmapCnt instead. David Reveman 2007-02-28 Add bindFailed variable to CompWindow struct so we can handle cases where binding window to texture failed because window is no longer mapped properly. David Reveman 2007-02-27 Check for pending maps when trying to hide a window. David Reveman 2007-02-27 Do not change input focus when EnterNotify event is generated from an ungrab. This changes the behavior when not using click to focus and moving between viewports a bit. However, focusDefaultWindow should be modified instead if the old behavior made more sense. David Reveman 2007-02-27 Fix active window tracking. We're always setting the active window property so there's no need to monitor that property. David Reveman 2007-02-27 Only focus default window if switcher isn't active. Stjepan Glavina 2007-02-27 Add auto rotate option. David Reveman 2007-02-26 Reset rotation correctly when we receive a client message that cause us to move the viewport. Bellegarde Cedric 2007-02-26 Add translucent flag properly. David Reveman 2007-02-26 Make sure grab window is set. David Reveman 2007-02-25 Regen compiz.schemas.in. David Reveman 2007-02-25 Handle match options properly. David Reveman 2007-02-25 Add "|" symbol properly and don't add "&" or "|" if this is the first expression in this group. David Reveman 2007-02-25 Add match argument support to all initiate scale actions. David Reveman 2007-02-25 Use match option type if argument name is "match". David Reveman 2007-02-25 Add getMatchOptionNamed function. David Reveman 2007-02-25 We should try to return an empty string if the match object is empty instead of NULL. David Reveman 2007-02-25 Add alpha blur match option. It provides alpha blur for windows that don't have the blur property set. David Reveman 2007-02-25 Automatically update match options when they change. David Reveman 2007-02-25 Remove some whitespaces. David Reveman 2007-02-25 Add match option for per-window focus prevention control. David Reveman 2007-02-25 Add window ID match handler. David Reveman 2007-02-25 Use match options in wobbly plugin. David Reveman 2007-02-25 Use match option in switcher plugin. David Reveman 2007-02-25 Use match option in scale plugin. David Reveman 2007-02-25 Use match option for window matching. David Reveman 2007-02-25 Set correct option type. David Reveman 2007-02-25 Use match option for focus blur. David Reveman 2007-02-25 Switch to using a match option. David Reveman 2007-02-25 Add support for new match option type. David Reveman 2007-02-25 Add match option. David Reveman 2007-02-25 Shut up compiler. David Reveman 2007-02-25 Add matchToString function. David Reveman 2007-02-25 Use match object for minimize effect. David Reveman 2007-02-25 Use match object for window focus blur. David Reveman 2007-02-24 Add window state matching to core and rename compWindowTypeFromString function to windowTypeFromString. David Reveman 2007-02-24 Call matchPropertyChanged when wmType changed. David Reveman 2007-02-24 Fix name of match op flags. David Reveman 2007-02-24 Add proper parsing of match expressions and track changes in fade plugin. David Reveman 2007-02-24 Make string "any" match all window types. David Reveman 2007-02-24 Regen compiz.schemas.in. David Reveman 2007-02-24 Avoid using glPushAttrib. It's usually bad to use glPushAttrib as we don't know if the stack is full from other plugins pushing attributes to it. David Reveman 2007-02-23 Only create the gaussian kernel once and not everytime we draw. David Reveman 2007-02-23 Add sat variable when saturation is used. David Reveman 2007-02-23 Make saturation an integer option and remove blur from its name. Dennis Kasprzyk 2007-02-23 Add saturation option. Dennis Kasprzyk 2007-02-23 A strength option that interpolates between a linear blur (0.0) and soft gaussian blur (1.0). Dennis Kasprzyk 2007-02-23 Switch to a pascal triangle based blur kernel generation function which creates optimized texture fetch coordinates. Optimize shader code to use less temporary variables. Allows larger radius to be used with gaussian filter. David Reveman 2007-02-23 Avoid blurring opaque client windows. David Reveman 2007-02-23 Never blur windows when painting clipped opaque window regions. David Reveman 2007-02-23 Clean up and document window paint flags. TRANSLUCENT flag that was earlier used for both indicating that we're painting clipped translucent window regions and that blending is required. The read-only CLIP_TRANSLUCENT flag is now used to indicate that we're painting clipped translucent window regions. TRANSLUCENT flag now indicate that client window is translucent. BLEND flag indicates that blending should be used when rendering. David Reveman 2007-02-23 Add plugin that provides regular expression matching for window title, class and name. It can very easily be extended to provide matching of other window related strings. David Reveman 2007-02-23 Update to use match object for window matching. David Reveman 2007-02-23 Add extensible match interface. Match objects can be used for window matching but other objects than windows will likely be supported sometime soon. A match object contains a boolean tree of expressions and each expression can be implemented by a different plugin. The core interface only provides window type matching. Plugins can provide any kind of matching by wrapping the matchInitExp display function. When doing so they are responsible for calling the matchExpHandlerChange function when their ability to evaluate expressions changed (e.g. when being activated or deactivated). They should also call the matchPropertyChanged function when a window property that might affect evaluation of an expression changed. David Reveman 2007-02-21 Add infrastructure for software cursors but leave it disabled until proper server-side support has landed. David Reveman 2007-02-21 Only enable blur if GL_ARB_fragment_program is present. David Reveman 2007-02-21 Initialize watch pointer in inotify display struct properly. gandalfn 2007-02-21 Fix mouse move key name. Dennis Kasprzyk 2007-02-20 Raise window when titlebar is clicked. Dennis Kasprzyk 2007-02-20 Fix nasty server resource leak. David Reveman 2007-02-20 Allow destination blur on windows without alpha channel. David Reveman 2007-02-19 Offset blut regions correctly. David Reveman 2007-02-19 Offset blur regions correctly. David Reveman 2007-02-14 Fix description for disable-kde option. David Reveman 2007-02-14 Add missing calls to gdk_display_sync and replace all calls to XSync with calls to gdk_display_sync for consitancy. David Reveman 2007-02-13 Reset any window attributes that might have been changed. David Reveman 2007-02-13 Add window damage properly when opacity is less than 100. David Reveman 2007-02-13 Only include visible windows in output scale mode. David Reveman 2007-02-13 Regen compiz.schemas.in. David Reveman 2007-02-13 Make ping delay configurable. David Reveman 2007-02-13 Increase fade speed max. David Reveman 2007-02-13 Add missing files to POTFILES.in. David Reveman 2007-02-13 Edge names should not be translated. David Reveman 2007-02-13 Add demands attention state when focus on map was prevented. David Reveman 2007-02-13 Regen compiz.schemas.in. David Reveman 2007-02-13 Add gandalfn to AUTHORS file. gandalfn 2007-02-13 Add run terminal action. David Reveman 2007-02-13 Include mipmap filter. David Reveman 2007-02-12 Expand damage region properly and include gaussian filter. David Reveman 2007-02-12 Remove old stencil buffer workaround. David Reveman 2007-02-12 Expand region one pixel in each direction to make sure it covers the transformed window completely. David Reveman 2007-02-06 Make sure no core instance of window is painted after minimize animation. (bnc 240960) David Reveman 2007-02-06 Adjust moveScreenViewport function so that the same constraints are used as in ensureWindowVisibility. If the constraints don't match windows might be moved incorrectly by ensureWindowVisibility when being activated. Bellegarde Cedric 2007-02-01 Add option for disabling focus prevention. Mike Dransfield 2007-01-26 List options must be sent as arrays. David Reveman 2007-01-26 Add option to kwd for controlling decoration blurring. David Reveman 2007-01-26 Add option to gwd for controlling decoration blurring. David Reveman 2007-01-26 Add temporary fix to avoid transformed windows in switcher. David Reveman 2007-01-26 Add blur utility function to libdecoration. David Reveman 2007-01-26 drawWindowGeometry should not be a screen function. It's call-back to the function that generated the geometry so it should live where the geometry is stored, which is currently in CompWindow struct. David Reveman 2007-01-26 Disable texture coordinate array when stenciling. David Reveman 2007-01-26 Offset blur region correctly. David Reveman 2007-01-26 Make wobbly plugin use indexCount when storing number indices so that vCount is set properly to the number of vertices. Make sure indexCount is initialized properly everywhere addWindowGeometry is used. David Reveman 2007-01-26 Fix so that windows are centered properly in scale slots. David Reveman 2007-01-26 Fix issue with windows being maximized on incorrect output. David Reveman 2007-01-25 Add PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK flag when zooming to get clipping correct. David Reveman 2007-01-25 Track window size and adjust blur region properly. David Reveman 2007-01-25 Remove stencilRef from CompScreen struct and update so region based blur finally works properly in blur plugin. David Reveman 2007-01-25 No need to wrap paintBackground. David Reveman 2007-01-25 Remove PAINT_BACKGROUND_WITH_STENCIL_MASK. David Reveman 2007-01-25 Use clipping planes instead of stencil buffer to clip transformed windows when screen is transformed. David Reveman 2007-01-25 Move matrix manipulation out of GL as it makes a lot more sense to use the regular stack for this and it is required to fix vertex projection issues in blur plugin. David Reveman 2007-01-23 Fix blur region clipping and expose client and decoration texture blurring to applications using window properties. David Reveman 2007-01-23 Set stencilRef properly. It should be either 1 or 0. David Reveman 2007-01-23 Move applyGravity function into libdecoration. David Reveman 2007-01-23 stencilRef should initially be 0. David Reveman 2007-01-21 Don't pass window paint attribs to drawWindow function. All transformations must be done before calling drawWindow. Blur plugin is now performing destination fetching in drawWindow function before any window textures have been rendered. David Reveman 2007-01-19 No need for plugins to link to libraries that compiz is already linked to. David Reveman 2007-01-18 Add Julian. Julian Sikorski 2007-01-18 Use --install include option with kde-config to get kde include dir. David Reveman 2007-01-18 Don't allow plugin names to start with -. David Reveman 2007-01-18 Enable sync request protocol for override_redirect windows as commit 837bb9f5d4dfa0ee23fffabc800dccd68a7a2f35 likely fixed the issues seen previously. David Reveman 2007-01-18 Fix sync request issue that could caused windows to get into a state where they were never updated. David Reveman 2007-01-18 Position frame window properly. David Reveman 2007-01-18 Add state struct for individual window blurring. David Reveman 2007-01-16 Render decorations after client window so it's possible to have decorations that cover part of the client window. David Reveman 2007-01-16 Minor cleanup. David Reveman 2007-01-16 Project vertices and only update minimum required destination texture region. Some more optimizations should be done here but the current changes should still give a major performance improvement. David Reveman 2007-01-16 All matrix transformations must be applied when drawWindowTexture is called. Add pushWindowTransform, which pushes a matrix to the current matrix stack and applies any window transformations. David Reveman 2007-01-16 Basic focus prevention support. Merge: 6cceb17 bd1ec07 David Reveman 2007-01-14 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2007-01-14 Regen plugins/compiz.schemas.in. David Reveman 2007-01-14 Add addBlendOpToFunctionData function which can be used to indicate that some fragment function data is performing a blend operation. Functions for allocating fragment parameters and fragment texture units now take a integer parameter that specifies the number of units or parameters that should be allocated. Add initial destination blur support to blur plugin. The current state of destination blur is generally not considered usable. There's a few things that need to be added before it will scale and and perform properly. David Reveman 2007-01-13 Add session restart support. Søren Sandmann 2007-01-12 Terminate move state on button clicks. When choosing move from the window menu or the taskbar button, it is possible to move the window around with no mouse buttons pressed. In this state, mouse clicks should terminate the move, which this patch implements. David Reveman 2007-01-12 Add Gerd to AUTHORS file. Gerd Kohlberger 2007-01-12 Add launch application option. David Reveman 2007-01-11 Kill whitespace. David Reveman 2007-01-11 Use --sm-disable option when generating schemas. David Reveman 2007-01-11 Add filter option and 12x bilinear filter to blur plugin. David Reveman 2007-01-11 Set window type of switcher window to Util. David Reveman 2007-01-10 Update the text in COPYING file. The old text could have been read as if all code was dual licensed and that's not the case. Add COPYING.LGPL file, which was missing. David Reveman 2007-01-10 Regen compiz.schemas.in. David Reveman 2007-01-10 Add blur plugin. This plugin is currently only doing source blurring and the functionality is pretty limited but destination blurring and more functionality will be added be added shortly. However, even in it's current state it demonstrates how powerful the new fragment attribute interface is. David Reveman 2007-01-10 Keep track of temporary texcoord variables at all index levels to make sure we don't add duplicate variable names. Pass the correct offset variable to next index level. David Reveman 2007-01-10 Only add one fetch offset variable per index. Mike Dransfield 2007-01-10 Fix a few initiate functions that should steal events. David Reveman 2007-01-10 Add Fragment Attribute Interface. This interface (FAI) makes it possible for plugins to provide programmable per-fragment operations. Each plugin can add a set of fragment functions to the fragment attributes that are used for a drawing operation. A fragment function contains a set of data defined by some existing extension to OpenGL that provide programmable per-fragment operations. Current version of this interface only support GL_ARB_fragment_program but it is designed in such a way that it can very easily be extended to support other OpenGL extensions. The FAI also provide mechanisms which allow plugins to allocated texture units and parameters for private use. The fragment attribute implementation contains methods for combining a set fragment functions into a fragment program that can be used by OpenGL for per-fragment operations. The major benefit of the FAI is that it provides a pluggable way to use programmable per-fragment operations and will allow us to take advantage of the latest OpenGL extensions and create some really amazing effects while still making sure that everything integrate perfectly. David Reveman 2007-01-10 Fix memory leak. David Reveman 2007-01-06 Regen compiz.schemas.in. David Reveman 2007-01-06 Make sure scaleMoveFocusWindow moves input focus to some scaled window. David Reveman 2007-01-06 Remove whitespaces. David Reveman 2007-01-06 Remove sloppy focus option and use click to focus display option instead. David Reveman 2007-01-06 Add selected window variable that doesn't have to be the same as the currently active window. David Reveman 2007-01-04 Avoid adding any of our own top level windows and deleting the composite window widget. David Reveman 2007-01-04 Try to place titlebar stretch offset as far as possible to the left but not where any button is located. David Reveman 2007-01-03 Move return type above function name. David Reveman 2007-01-03 Do not force a resize when maximize state changes. David Reveman 2007-01-03 Check version of libXrender and workaround gradient issue if older than 0.9.3. See fdo bug 9526 for more info. David Reveman 2007-01-03 Send replies to all method calls unless the no_reply flag is set. David Reveman 2007-01-02 Parse list option parameters properly and allow 0 parameters for list options. David Reveman 2007-01-02 Never generate an error when option name and message parameters are valid. David Reveman 2007-01-02 Only update window position when no pending position changes exists. David Reveman 2007-01-02 Move away from having client side positioning of windows. Window size must be server side so to be able to do atomic move-resize operations position must also be server-side. This means that serverX and serverY fields in CompWindow struct has higher priority than attrib.x and attrib.y. attrib.x and attrib.y is still the client side position and any code dealing with the visible position of a window should use these. Code that needs to be aware of any pending position changes should look at serverX and serverY. David Reveman 2007-01-02 Make sure output devices are initialized. David Reveman 2006-12-31 Post release version increment. David Reveman 2006-12-31 Bump version. David Reveman 2006-12-31 make update-po. David Reveman 2006-12-31 Add entry for 0.3.6 release. David Reveman 2006-12-30 Update AUTHORS file. David Reveman 2006-12-30 Add comment about using libtaskmanager for creating the window menu. David Reveman 2006-12-30 Make sure decorations are updated properly when window state change. David Reveman 2006-12-30 Avoid overflow in tooltip delay code. David Reveman 2006-12-30 Add menu button support. Kristian Hogsberg 2006-12-30 Keep track of unconstrained size and have pointer motion events modify this size instead of the actual window size. David Reveman 2006-12-30 Save position properly. David Reveman 2006-12-30 Use configureXWindow instead of XConfigureWindow. David Reveman 2006-12-30 Revert "Call moveWindow and update frame position in configureXWindow to make sure" This reverts commit 94e8f94771426788a566f4e4fd7bb910aa6e55c7. David Reveman 2006-12-29 Update COW geometry to match root window geometry. David Reveman 2006-12-29 We have to detect outputs again when the screen size changes. David Reveman 2006-12-29 Regen compiz.schemas.in. David Reveman 2006-12-29 Set max number of desktops to 36 by default and add configure script option that can be used to adjust it. David Reveman 2006-12-29 Make usage of composite overlay window default. David Reveman 2006-12-29 Try both direct and indirect rendering contexts in case one of them fail to support GLX_EXT_texture_from_pixmap. David Reveman 2006-12-29 Make strict binding default. David Reveman 2006-12-29 Call moveWindow and update frame position in configureXWindow to make sure that window position in CompWindow struct is always up to date. David Reveman 2006-12-28 Add appropriate movement constraints. David Reveman 2006-12-28 Regen compiz.schemas.in. David Reveman 2006-12-28 Add next_no_popup and prev_no_popup actions. These actions can be used to switch between windows without the thumbnail popup window. David Reveman 2006-12-28 Revert "Add window_list option to switcher plugin. It can be used to turn off the" This reverts commit b307203c453a7463b94beabdd6ae9a86c92dc103. David Reveman 2006-12-28 Use correct data type for default shadow_color variable. David Reveman 2006-12-28 Free memory allocated earlier if out-of-memory. Very unlikely to happen. David Reveman 2006-12-28 Regen compiz.schemas.in. David Reveman 2006-12-28 Add window_list option to switcher plugin. It can be used to turn off the window list popup window. Based on patch by Bellegarde Cedric David Reveman 2006-12-28 Make getPluginMetadata method return an array of features as well. David Reveman 2006-12-28 Return plugin dependencies as an array. Mike Dransfield 2006-12-28 Return string restrictions as an array. David Reveman 2006-12-27 Update ABI version. David Reveman 2006-12-27 Fix unredirect of fullscreen windows when using overlay window for output. David Reveman 2006-12-27 Indent correctly. David Reveman 2006-12-26 Align option descriptions. David Reveman 2006-12-26 Add dbus support to gwd. David Reveman 2006-12-25 Watch plugin directories for changes and send "pluginsChanged" signal when the contents of a directory changes to indicate that the list of available plugins need to be updated. David Reveman 2006-12-25 Make gconf support in gwd optional. David Reveman 2006-12-25 Rename automake conditional GCONF_PLUGIN to USE_GCONF. David Reveman 2006-12-25 Add inotify plugin, which implements the previously added file notification API. David Reveman 2006-12-25 Add abstract file notification API. Needs plugin implementation. David Reveman 2006-12-24 Add getOutputExtentsForWindow screen function. Plugins that modify the window extents should wrap this function. An updateWindowOutputExtents function has also been added and it should be used to update the output extents in the CompWindow struct. Decoration plugin has been updated for these changes. David Reveman 2006-12-23 Remove SetWindowScaleProc type, which should have been removed when window scale attributes were removed. David Reveman 2006-12-23 Add 'GetPluginMetadata' method, which returns metadata for available plugins. David Reveman 2006-12-23 Add short comments and examples to 'List' and 'GetMetadata' methods. David Reveman 2006-12-23 Add "GetPlugins" method that can be used to retrieve a list of available plugins. David Reveman 2006-12-23 Add plugin loader function "listPlugins" and implement availablePlugins function. Plugin loaders that implement listPlugins should return an array of plugin names that can possible be loaded from the specified path. David Reveman 2006-12-22 Add author to some headers where it's missing. David Reveman 2006-12-22 Add desktop sub menu to window popup window. David Reveman 2006-12-21 Set backgroundLoaded to false when background property changed so that it gets reloaded when painting the background. David Reveman 2006-12-21 Fix typo. David Reveman 2006-12-21 Make sure we always have a reasonable geometry set. David Reveman 2006-12-21 Decorate windows with unknown window type. David Reveman 2006-12-21 Make screen edges 2 pixels thick as some DnD clients will not send xDnd events otherwise. David Reveman 2006-12-21 Remove background.png. David Reveman 2006-12-21 Check window type before adding decorations to a window. David Reveman 2006-12-21 Add support for force quit dialog. David Reveman 2006-12-21 Make sure we have a valid server time. David Reveman 2006-12-20 Add support for main menu toolkit action. David Reveman 2006-12-20 Add support for run dialog toolkit action. David Reveman 2006-12-20 Add initial toolkit action support and handle window menu toolkit action. David Reveman 2006-12-20 Remove ROOT_OFF_X and ROOT_OFF_Y from wiget geometry and add clientGeometry function which returns client window geometry. David Reveman 2006-12-20 Remove opacity menu. Consistency is more important than features. David Reveman 2006-12-20 geometry function should just return the parent widget geometry. David Reveman 2006-12-20 Remove default background image. David Reveman 2006-12-20 Handle the case where no background image can be loaded. David Reveman 2006-12-20 Check for shared object instead of libtool archive. David Reveman 2006-12-19 Hide button event windows for tiny windows where buttons are not visible. David Reveman 2006-12-19 Move xinerama clipping to right place. David Reveman 2006-12-19 Another go at getting the workarea computed correctly. Should be easier to get it right this time as struts are already clipped to xinerama edges. David Reveman 2006-12-19 Clip struts to xinerama edges. David Reveman 2006-12-19 Remove whitespace in header. David Reveman 2006-12-19 Handle floating and overlapping struts properly. David Reveman 2006-12-19 Fix license info. LGPL header was a cut-n-paste mistake. All kde window decorator code is GPL2. David Reveman 2006-12-18 Fix building of kde window decorator. David Reveman 2006-12-18 Obvious fix for point in rectangle calculation. David Reveman 2006-12-18 Kill whitespaces. David Reveman 2006-12-18 No need to set these to NULL in destructor. David Reveman 2006-12-18 Kill some whitespaces. David Reveman 2006-12-18 Add KDE window decorator. David Reveman 2006-12-18 Fix typo that caused shadow of right window border to sometimes be rendered wrong. David Reveman 2006-12-17 Regen compiz.schemas.in. David Reveman 2006-12-17 Add gwd.schemas.in to EXTRA_DIST. David Reveman 2006-12-16 Fix --no-detection option issue. David Reveman 2006-12-16 Add reference counting and fixup function names. David Reveman 2006-12-15 Move decor_destroy_shadow. David Reveman 2006-12-12 Fill with transparent black if there's no shadow picture. David Reveman 2006-12-12 Return early if there's no shadow picture. David Reveman 2006-12-12 Snap to output extents. David Reveman 2006-12-12 Fix some memory leaks. David Reveman 2006-12-12 Fix typo. David Reveman 2006-12-12 Compute edge start and end offsets correctly. David Reveman 2006-12-12 Fix typo that caused struts to be ignored. David Reveman 2006-12-12 Add PropertyChangeMask to event_mask for grabWindow so it can be used to get a valid server time stamp. David Reveman 2006-12-12 Don't use border_layout to figure out client window width as it might not be initialized when this function is called. David Reveman 2006-12-12 Snap to window struts instead of workarea. David Reveman 2006-12-12 Fix typo that caused glFinish to not be called before drawing of a new frame and made timing and frame rate throttling incorrect. Mike Cook 2006-12-12 Only hide windows on current output. Mike Cook 2006-12-12 Add initiate_output action, which initiates scale mode only for windows visible on current output. David Reveman 2006-12-11 Add svg plugin. David Reveman 2006-12-11 Remove extension from default image name. David Reveman 2006-12-11 Remove extension from default image name. David Reveman 2006-12-11 Add png to default plugin list. David Reveman 2006-12-11 Add png plugin. David Reveman 2006-12-11 Make image loading extensible. David Reveman 2006-12-10 Send error reply if option doesn't exist. David Reveman 2006-12-10 Send "chenged" signal when and option change value. David Reveman 2006-12-10 Unwrap display functions pointers when finishing. David Reveman 2006-12-10 Add "list" and "getMetadata" members. Always send replies. Based on patch by Mike Dransfield. David Reveman 2006-12-10 Build libdecoration before plugins. David Reveman 2006-12-10 Add optionTypeToString function. David Reveman 2006-12-09 Move decoration property decoding into libdecoration. David Reveman 2006-12-08 Use data structures from decoration.h. David Reveman 2006-12-07 Move DM selection code into libdecoration. David Reveman 2006-12-07 Check for other screen grabs before calling layoutThumbs. David Reveman 2006-12-07 Make sure the headers can be included in C++ code. David Reveman 2006-12-07 Fix source offset. David Reveman 2006-12-07 Add -ldecoration to Libs. David Reveman 2006-12-06 Simple optimization for metacity themes, only redraw shadow background when decoration size changed. David Reveman 2006-12-06 Compute button width properly and don't clip window title when metacity themes is used. David Reveman 2006-12-06 Move draw_simple_shape function into libdecoration. David Reveman 2006-12-06 Add CompActionStateTermEdge if initiated by edge. David Reveman 2006-12-06 Add missing CompActionStateInitButton to initiate actions. David Reveman 2006-12-06 Fix reading of action options. The complete option is now read before the updated value is written back. David Reveman 2006-12-06 Allow event window to be the root window if screen is grabbed. David Reveman 2006-12-05 Revert "Call updateWindowAttributes before windowStateChangeNotify." This reverts commit 19cc3e33baf4b760562b5654359f2a0bee6197d6. David Reveman 2006-12-05 Another try at making the maximize effect work properly. David Reveman 2006-12-05 Fix typo. David Reveman 2006-12-05 Update window size after changing input extents and use server width and height when updating frame window. David Reveman 2006-12-05 Regen compiz.schemas.in. David Reveman 2006-12-05 Make sure switcher window isn't added as a normal window. David Reveman 2006-12-05 Add mipmap option. David Reveman 2006-12-04 Make sure a picture is created for switcher decorations and set stretch offset a bit better. David Reveman 2006-12-04 Compute button locations and titlebar stretch offset correctly for metacity themes. David Reveman 2006-12-04 Stretch decorations from south-east instead. David Reveman 2006-12-04 Trigger maximize effect properly. David Reveman 2006-12-04 Compute window output extents properly. David Reveman 2006-12-04 Call updateWindowAttributes before windowStateChangeNotify. David Reveman 2006-12-04 Remove N_QUADS_MAX. David Reveman 2006-12-04 Finish libdecoration implementation and move gtk-window-decorator over to using it completely. David Reveman 2006-12-04 Apply alignment correctly. David Reveman 2006-11-30 Rewrote decoration opacity code and moved it to libdecoration. David Reveman 2006-11-30 No longer need cairo-xlib-xrender.h. David Reveman 2006-11-30 Rewrite and move a lot more code into libdecoration. David Reveman 2006-11-29 Improve shadow code performance by adding clipping and avoiding opacity step when possible. David Reveman 2006-11-29 Damage output extents correctly when window decorations change. David Reveman 2006-11-29 Move more code into libdecoration. David Reveman 2006-11-29 Do not ignore override_redirect windows. David Reveman 2006-11-29 Move damageWindowOutputExtents so that it's always called. David Reveman 2006-11-29 Use addWindowDamageRect. David Reveman 2006-11-28 Expose decor_shadow_t struct and add pixmap to this struct. David Reveman 2006-11-28 Use decor_context_t structs. David Reveman 2006-11-28 Withdrawn windows that are still visible should be moved. David Reveman 2006-11-28 Move drop-shadow code from gtk-window-decorator to libdecoration. David Reveman 2006-11-28 Regen compiz.schemas.in. David Reveman 2006-11-28 Add hover time option. David Reveman 2006-11-27 Add drag-n-drop hover support to scale plugin. David Reveman 2006-11-27 Add xdndStatusAtom and xdndDropAtom. David Reveman 2006-11-27 Fix placement of scaled icons. David Reveman 2006-11-27 Align. David Reveman 2006-11-27 Use libdecoration functions. David Reveman 2006-11-27 Use decor_set_vert_quad_row and decor_set_horz_quad_line. David Reveman 2006-11-26 Use decor_quads_to_property. David Reveman 2006-11-26 Link to libdecoration. David Reveman 2006-11-26 Use data types in decoration.h. David Reveman 2006-11-26 Add libdecoration and move some initial code from gtk-window-decorator into it. David Reveman 2006-11-25 glxcomp -> compiz. David Reveman 2006-11-22 Regen compiz.schemas.in. David Reveman 2006-11-22 Add initiate_group option. David Reveman 2006-11-22 Pass active window as "window" argument on screen edge events instead of screen edge windows. David Reveman 2006-11-22 Add ScaleType enum and use this enum instead of allWindows boolean. David Reveman 2006-11-22 Use addWindowDamageRect so that damage is reported properly for transformed windows. David Reveman 2006-11-22 Remove damageTransformedWindowRegion and damageWindowRegion. David Reveman 2006-11-22 Remove window scale. David Reveman 2006-11-22 Add addWindowDamageRect function. David Reveman 2006-11-22 Just move input focus when selecting window in scale mode. Activate window when leaving scale mode. David Reveman 2006-11-22 Update ABIVERSION. David Reveman 2006-11-22 Update switcher plugin to use drawWindow function for drawing thumbnails. Thumbnails now include decorations and shadows. David Reveman 2006-11-22 Use lastPaint as paint attributes for drawWindow. Fix thumbnail opacity calculations, current window opacity should not be used when computing new opacity value. David Reveman 2006-11-22 Use lastPaint for drawWindow paint attributes. David Reveman 2006-11-22 Applying fade values in drawWindow was a bad idea. Back out that change and be a bit more efficient and only compute new fade values if steps variable is non-zero. David Reveman 2006-11-22 Makes more sense to update lastPaint in paintWindow function. David Reveman 2006-11-22 Remove whitespaces. David Reveman 2006-11-22 Make thumbnail opacity behave a bit better. David Reveman 2006-11-22 Use drawWindow for window transformations. David Reveman 2006-11-22 Use drawWindow function for window transformations. David Reveman 2006-11-22 Hook into drawWindow and apply current fade values there. David Reveman 2006-11-21 Hook into drawWindow instead of paintWindow. David Reveman 2006-11-21 Add damageTransformedWindowRect function. David Reveman 2006-11-21 Add damageTransformedWindowRegion function. David Reveman 2006-11-21 Init xTranslate and yTranslate to 0.0. David Reveman 2006-11-21 Add xTranslate and yTranslate to WindowPaintAttrib struct. David Reveman 2006-11-21 Add PAINT_WINDOW_NO_CORE_INSTANCE_MASK. David Reveman 2006-11-21 Add drawWindow function. David Reveman 2006-11-21 Post release version increment. David Reveman 2006-11-21 Add entry for 0.3.4 release. David Reveman 2006-11-21 Bump version. David Reveman 2006-11-21 make update-po for upcoming release. David Reveman 2006-11-20 Bump ABI version. David Reveman 2006-11-20 Move input focus to closest ancestor if window doesn't accept focus. David Reveman 2006-11-20 Add pendingMaps variable, which is used to keep track of any pending map notify events. David Reveman 2006-11-20 Make sure any minimized ancestors are made visible when activating a window. David Reveman 2006-11-20 Do not require minimize action when minimizing transients. David Reveman 2006-11-16 Fix typo. David Reveman 2006-11-16 Mulitply matrix.xy and matrix.yx properly. David Reveman 2006-11-15 Regen compiz.schemas.in. Mike Dransfield 2006-11-15 Add a few new shapes to annotate plugin and an action option that can be used to draw these shapes. David Reveman 2006-11-15 Add getColorOptionNamed function. David Reveman 2006-11-14 If output is scaled, add destination output as damage. David Reveman 2006-11-14 Move front buffer update out of the output paint loop. David Reveman 2006-11-14 Remove whitespaces. David Reveman 2006-11-14 Add clearTargetOutput function. David Reveman 2006-11-13 Use clearTargetOutput instead of clearScreenOutput. David Reveman 2006-11-13 Add clearTargetOutput function. David Reveman 2006-11-13 Walk output list backwards in case they are overlapping. David Reveman 2006-11-13 Only move managed windows when switching viewport. David Reveman 2006-11-13 Update to use output workarea. David Reveman 2006-11-13 Fix typo. David Reveman 2006-11-13 Fix event window placement for metacity themes. David Reveman 2006-11-13 Keep line less than 80 columns. David Reveman 2006-11-12 Add support for new metacity theme version and add version checking that also allow us to support metacity versions < 2.15.21. David Reveman 2006-11-11 Check if we have visible region without output and clear color buffers before swapping if that is the case. David Reveman 2006-11-11 Remove cleared variable. David Reveman 2006-11-11 Switch to using clearScreenOutput. David Reveman 2006-11-11 Add clearScreenOutput function. Bellegarde Cedric 2006-11-11 Add zoom factor option. David Reveman 2006-11-11 Remove scale applied at the add geometry stage in wobblyDrawWindowTexture instead of in wobblyPaintWindow. David Reveman 2006-11-11 Use getWorkareaForOutput. David Reveman 2006-11-11 Avoid override redirect windows. David Reveman 2006-11-11 Bump ABI version number. David Reveman 2006-11-11 Regen compiz.schemas.in. David Reveman 2006-11-11 Use the --no-detection option when generating schemas. David Reveman 2006-11-11 Add no detection option. David Reveman 2006-11-11 Make outputs option a list of strings instead of a string. David Reveman 2006-11-11 Update current output after updating output devices. David Reveman 2006-11-11 Detect refresh rate and outputs before initializing plugins. David Reveman 2006-11-11 Move call to updateOutputDevices out of reshape function to avoid it being called twice at startup. David Reveman 2006-11-11 Make sure that refresh rate and outputs are detected when detect_refresh_rate and detect_outputs are set to true. David Reveman 2006-11-11 Compute per output workarea. David Reveman 2006-11-10 Never include override_redirect windows. David Reveman 2006-11-10 Allow moving of windows within the whole desktop area. David Reveman 2006-11-10 Only advance fade one step per time we paint the screen. David Reveman 2006-11-10 Add output offset when making window fullscreen. David Reveman 2006-11-10 Only do size changes on managed windows. David Reveman 2006-11-10 Both width and height must match. David Reveman 2006-11-10 Only sync position if state is SCALE_MODE_IN. David Reveman 2006-11-10 Only care about _NET_WM_STATE changes if window is not managed. David Reveman 2006-11-10 Allow fullscreen action on all windows with wmType Normal. (8958) David Reveman 2006-11-10 Constrain state when receiving property change notify. (8958) David Reveman 2006-11-10 Always avoid windows with wmType that is desktop or dock. David Reveman 2006-11-10 Always avoid windows with wmType that is desktop or dock. David Reveman 2006-11-10 Use wmType instead of type when forcing desktop and dock windows to be visible on all desktops. David Reveman 2006-11-10 showWindow and hideWindow should never do anything with unmanaged windows. Make sure desktop hint is set properly for initially mapped windows and desktop/dock windows. David Reveman 2006-11-09 Focus should only be moved to managed windows and when leaving showing desktop mode only unhide windows that are actually in showing desktop mode. This fixes a really nasty bug that appeared after adding support for multiple desktops. David Reveman 2006-11-09 Remove whitespaces. David Reveman 2006-11-09 Regen compiz.schemas.in. Diogo Ferreira 2006-11-09 Add color option to annotate plugin. David Reveman 2006-11-09 Update ABI version. David Reveman 2006-11-09 Handle output changes. David Reveman 2006-11-09 Call cubeLoadImg on output change notify. David Reveman 2006-11-09 Set fullscreenOutput variable properly. David Reveman 2006-11-09 Fix typo. David Reveman 2006-11-09 Handle output changes. David Reveman 2006-11-09 Add outputChangeNotify function. David Reveman 2006-11-09 Regen compiz.schemas.in. David Reveman 2006-11-09 Add fullscreenOutput variable which is used to determine if there's any output that only covers part of a cube side. David Reveman 2006-11-09 Fix some clone remove issues. David Reveman 2006-11-09 Make sure we grabbed the screen before we check if a window is a 'scale' window. David Reveman 2006-11-09 Use setDefaultViewport. David Reveman 2006-11-09 Make sure every output is within the screen region. David Reveman 2006-11-09 Add detect_outputs and outputs options, which gives full control over each outputs framebuffer region. Very useful for testing of multiple outputs. David Reveman 2006-11-09 Set struts on clone input stealing windows. David Reveman 2006-11-09 Make it so input only windows can internally have struts set. David Reveman 2006-11-08 Regen compiz.schemas.in. David Reveman 2006-11-08 Update ABI version. Mike Cook 2006-11-08 Compute xTranslate and yTranslate correctly for output specific zoom. David Reveman 2006-11-08 Scale all visible windows and not only those visible on the current output. David Reveman 2006-11-08 Switch between all visible windows and not only those visible on the current output. David Reveman 2006-11-08 Release grab on terminate action and handle window movement while in scale mode properly. David Reveman 2006-11-07 Send viewport move request if selected window is not on current viewport. David Reveman 2006-11-07 Add initiate_all option. David Reveman 2006-11-07 Fix typo. David Reveman 2006-11-07 Don't use gdk_color_parse as color string contains an alpha value. David Reveman 2006-11-07 Update current output when receiving MotionNotify events. David Reveman 2006-11-07 Regen compiz.schemas.in. Mirco Muller 2006-11-07 Add shadow color option. David Reveman 2006-11-07 Regen compiz.schemas.in. David Reveman 2006-11-07 Add clone plugin which can be used to clone outputs in a convenient way. Currently more of a prototype as we need randr++ and input transformation in the server to do this properly. David Reveman 2006-11-07 Add initial annotate plugin. David Reveman 2006-11-07 Remove whitespaces. David Reveman 2006-11-07 Fix so that screenshot plugin works with multiple outputs. David Reveman 2006-11-07 Track paintTransformedScreen changes. David Reveman 2006-11-07 Make zoom per output. David Reveman 2006-11-07 Add region to paintTransformedScreen arguments. Add ApplyScreenTransform function so that plugins can do more advanced transformations. Add cleared flag to keep track of if the screen has been cleared or not when painting multiple outputs. Update cube plugin to use these things and handle multiple outputs better. David Reveman 2006-11-07 Remove whitespaces. David Reveman 2006-11-07 Add getWorkareaForOutput and use it to maximize windows properly. David Reveman 2006-11-01 Set viewport correctly. David Reveman 2006-11-01 Remove --test-mode from usage message as it doesn't exist anymore. David Reveman 2006-11-01 Whitespace changes. David Reveman 2006-11-01 Whitespace changes. David Reveman 2006-11-01 Disable _NET_WM_SYNC_REQUEST protocol for override_redirect windows. David Reveman 2006-10-31 Increment ABI version. David Reveman 2006-10-31 Allow horizontal desktop size 2 and greater. David Reveman 2006-10-31 Add multi-head support and handle small desktop sizes better. David Reveman 2006-10-31 Handle multi-head better. David Reveman 2006-10-31 Handle multi-head better. David Reveman 2006-10-31 Add getCurrentOutputExtents function. David Reveman 2006-10-30 Use output->width and output->height. David Reveman 2006-10-30 Use output->width and output->height. David Reveman 2006-10-30 Add width and height fields to CompOutput. David Reveman 2006-10-30 Set viewport to output device region before painting each output and only call glClear once when painting multiple outputs. David Reveman 2006-10-30 Set output name correctly. David Reveman 2006-10-28 Fix handling of _NET_DESKTOP_GEOMETRY client messages. David Reveman 2006-10-27 Initial support for multiple desktops. David Reveman 2006-10-27 Fix DEFAULT_PLUGINS list. David Reveman 2006-10-27 Handle desktop width less than 4 times the screen better. David Reveman 2006-10-27 Make zoom plugin work without "largedesktop" feature. David Reveman 2006-10-27 Don't initiate any animations when desktop width is less then 4 times the screen. Mike Dransfield 2006-10-25 Add basic compiz event support. David Reveman 2006-10-25 Regen compiz.schemas.in. David Reveman 2006-10-25 Add edgeButton, which can be used to require a button press for edge actions to be triggered. David Reveman 2006-10-20 Post release version increment. David Reveman 2006-10-20 Update ABI version. David Reveman 2006-10-20 Add entry to NEWS file for upcoming release. David Reveman 2006-10-20 Bump version for upcoming release. David Reveman 2006-10-20 Make update-po for upcoming release. David Reveman 2006-10-20 Fix typo. David Reveman 2006-10-20 Grab the server to make sure that we send correct attributes to override redirect windows. Thierry Reding 2006-10-20 Make sure metacity theme could be loaded. David Reveman 2006-10-18 Make moveInputFocusToWindow handle WM_TAKE_FOCUS hint properly. Mirco Muller 2006-10-17 Start- and end-color-stop for the skydome fallback gradient options. David Reveman 2006-10-17 Create a new texture object everytime we release the window from the existing texture object. David Reveman 2006-10-17 Allocate texture objects separately from window objects. David Reveman 2006-10-17 Remove _NET_WM_STATE_DEMANDS_ATTENTION hint when window receives focus. David Reveman 2006-10-17 Add reference counting to texture objects. David Reveman 2006-10-17 Add createTexture and destroyTexture. David Reveman 2006-10-16 Update ABIVERSION. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth and serverHeight. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use largest of 2D and RECT texture targets max size for maxTextureSize. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth. David Reveman 2006-10-16 Use serverWidth, serverHeight and serverBorderWidth in sendSyncRequest. David Reveman 2006-10-16 No need for a special case for override_redirect windows. David Reveman 2006-10-16 Use serverWidth, serverHeight, serverBorderWidth in moveResizeWindow. David Reveman 2006-10-16 Set serverWidth, serverHeight and serverBorderWidth of override_redirect windows when we get a ConfigureNotify. David Reveman 2006-10-16 Avoid unnessecary synchronization when sending synthetic configure notify events. David Reveman 2006-10-16 Add serverWidth serverHeight and serverBorderWidth, which are always updated when we send a configure request. David Reveman 2006-10-13 Less annoying defaults for rotate plugin. David Reveman 2006-10-13 Make sure invprec is greater than 0. David Reveman 2006-10-13 Add texCoordSize and indexCount to CompWindow struct. David Reveman 2006-10-11 Regen compiz.schemas.in. David Reveman 2006-10-11 Fix typo. David Reveman 2006-10-11 Don't allow maximize, minimize and fullscreen actions on util and toolbar windows. David Reveman 2006-10-11 Don't use versionsort. David Reveman 2006-10-11 Fix so that moveResizeWindow is allowed to do size changes for non-maximized windows without going through addWindowSizeChanges. Having all size changes go through addWindowSizeChanges is obviously wrong. David Reveman 2006-10-11 Regen compiz.schemas.in. David Reveman 2006-10-11 Fix typo. David Reveman 2006-10-11 Only allow size changes added by addWindowSizeChanges. David Reveman 2006-10-11 Add ignore_hints_when_maximized option, which makes compiz ignore size increment and aspect hints for maximized windows. Default value is 'true' as this behavior seems more common. Set to 'false' for previous behavior. David Reveman 2006-10-11 Add support for maximized frame layout when using metacity themes. David Reveman 2006-10-11 Wrap windowStateChangeNotify and update input extents properly. David Reveman 2006-10-11 Add windowStateChangeNotify function. David Reveman 2006-10-11 Add maximized input extents to decoration property. David Reveman 2006-10-11 Add version handling to decoration interface. moppsy 2006-10-11 Add raise_window option. David Reveman 2006-10-11 Add gwd.schemas.in. David Reveman 2006-10-10 Regen compiz.schemas.in. David Reveman 2006-10-10 Fix creation of schema file for gconf plugin. David Reveman 2006-10-10 Add opacity support to metacity theme implementation. David Reveman 2006-10-10 Kill whitespaces. Mike Dransfield 2006-10-10 Add deactivate member to dbus plugin. David Reveman 2006-10-09 Add 'command' option to decoration plugin. It can be used to automatically launch a decorator when one isn't already running. Guillaume 2006-10-09 Add plugin feature interface. David Reveman 2006-10-07 Don't unref the dbus connection returned by dbus_get_bus. David Reveman 2006-10-06 dbus_connection_close -> dbus_connection_unref. David Reveman 2006-10-06 Don't call updateWindowAttributes when motif hints change. David Reveman 2006-10-05 Add configuration support to dbus plugin. David Reveman 2006-10-05 int -> Bool David Reveman 2006-10-04 Use stringToColor and colorToString. David Reveman 2006-10-04 Add more utility functions. David Reveman 2006-10-04 Fix memory leak. David Reveman 2006-10-04 Remove gconf-compiz-utils.c and gconf-compiz-utils.h. David Reveman 2006-10-04 Remove use of gconf-compiz-utils.c. David Reveman 2006-10-04 Remove use of gconf-compiz-utils.c. David Reveman 2006-10-04 Add some string utility functions. David Reveman 2006-10-03 Add snap_inverted option to wobbly plugin. David Reveman 2006-10-03 post-release version increment. David Reveman 2006-10-02 Prepare for 0.2.0 release. David Reveman 2006-10-02 Use DESTDIR and add uninstall-local. David Reveman 2006-10-02 Fix minor memory leak. David Reveman 2006-10-02 Initialize decoration structure properly. David Reveman 2006-10-02 Require version 2.15.21 or greater of metacity for metacity theme support. David Reveman 2006-10-02 Only run install target when gnome support is built. Merge: 7467fff aa070f1 Kristian Høgsberg 2006-09-29 Merge branch 'master' of git.freedesktop.org:/git/xorg/app/compiz Kristian Høgsberg 2006-09-29 Regenerate compiz.schemas.in Had to hand-edit out plane from list of default plugins, since it conflicts with the cube plugin. David Reveman 2006-09-29 Fix typo. David Reveman 2006-09-29 make update-po David Reveman 2006-09-29 Remove old files from EXTRA_DIST. David Reveman 2006-09-29 Only install settings module and desktop file if file permissions allow it. David Reveman 2006-09-29 Don't build kde code by default. David Reveman 2006-09-29 Do correct placement of button event windows when using metacity themes. David Reveman 2006-09-29 Set decoration extents properly for metacity themes. David Reveman 2006-09-28 Don't try to build gnome or metacity support when gtk support is disabled. David Reveman 2006-09-28 Always invoke AM_GCONF_SOURCE_2 so that GCONF_SCHEMAS_INSTALL gets defined. David Reveman 2006-09-27 novell.png -> freedesktop.png Søren Sandmann 2006-09-27 Add 'plane' plugin. A new plugin that pans the viewport around a planar workspace instead of the cube. It's a more toned down transition effect and is more similar to the metacity workspace model. Kristian Høgsberg 2006-09-26 Prepares for workspace that's more than one viewport high. This patch adds an extra dimension to the viewport position. This allows plugins to pan the viewport vertically too. David Reveman 2006-09-26 Add output argument to PaintScreen and PaintTransformedScreen functions. David Reveman 2006-09-26 Paint each output device separately, this is the key to making it easy for plugins to do interesting things on multihead setups. David Reveman 2006-09-26 Add missing Makefile.am. David Reveman 2006-09-25 Change so that each output device contains a region instead of a rectangle. David Reveman 2006-09-25 Make placement plugin respect current output device. David Reveman 2006-09-25 Set current output device when receving button and key press events. David Reveman 2006-09-25 Initial support for multiple output devices. David Reveman 2006-09-25 Query xinerama info. David Reveman 2006-09-25 Add build option gtk. David Reveman 2006-09-22 Move gnome specific files into gtk/gnome directory. David Reveman 2006-09-22 Rename gnome directory to gtk. David Reveman 2006-09-22 Rename gnome-window-decorator to gtk-window-decorator. David Reveman 2006-09-22 Use libmetacity-private for metacity theme support. David Reveman 2006-09-22 Only build overlay window support if composite library version is greater than 0.3. Merge: 0d7895a 5399094 David Reveman 2006-09-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz David Reveman 2006-09-21 Remove compiz.desktop, it shouldn't be in repository. David Reveman 2006-09-21 Add METACITY_THEME_DIR David Reveman 2006-09-21 Initial support for metacity themes. David Reveman 2006-09-21 Remove redundent code. David Reveman 2006-09-21 Add metacity theme support settings module David Reveman 2006-09-21 Get name right Kristian Høgsberg 2006-09-20 Only use fbconfigs that have a corresponding visual with matching depth. Kristian Høgsberg 2006-09-20 Drop minmized windows to the end of the window switcher list. Kristian Høgsberg 2006-09-20 Fix corner cases with big titlebar fonts. compiz misplaces the decoration input regions for big titlebar fonts. To reproduce this, try selecting a 20px titlebar font and notice that the upper or lower part of the titlebar does not receive input events. Kristian Høgsberg 2006-09-20 Tighten the double click criteria. If the distance between the two clicks are greater than 8 pixels it is not regarded as a double click. This is in line with how GTK+ detects double clicks. There's an X root window property or similar that defines the distance and ideally we should read that out, but for now the patch brings the behavior a little closer to what it should be. Kristian Høgsberg 2006-09-20 Only activate button actions on left click. Right now all mouse buttons activate the titlebar button action (minimize, maximize, close), which is a bit unusual. Metacity only activates the action on left click and opens the window menu for right clicks. This patch just disables the button actions for anything else but left clicks. Kristian Høgsberg 2006-09-20 Add support for the composite overlay window. Add support for using the composite overlay window for GL output instead of rendering to the root window. This is lets compiz run on AIGLX without the _COMPIZ_GL_INCLUDE_INFERIORS hack that we used to have. The patch defaults to using the root window but adds a '--use-cow' command line option to make compiz use the overlay window. David Reveman 2006-09-19 Get relative movement right. David Reveman 2006-09-19 syncWindowPosition should always send requests to the server as there might be pending configure requests that we have not got notifications for yet, hence no way that we can know if the server position is up to date. David Reveman 2006-09-19 Add Swedish translation. David Reveman 2006-09-19 Add version handling to plugin system. David Reveman 2006-09-15 Allow return key to still be used for key-bindings. David Reveman 2006-09-15 Replace novell logo image with freedesktop logo image. David Reveman 2006-09-15 Mark window as placed when we get a configure request with X, Y set. David Reveman 2006-09-15 Add sync to vblank support. David Reveman 2006-09-01 Check for C++ compiler, KDE decorator needs it. David Reveman 2006-09-01 Fix typo. Kristian Høgsberg 2006-08-22 Don't use cmSnAtom before it's initialized. Kristian Høgsberg 2006-08-17 Update keybindings for move and resize to work more like metacity. David Reveman 2006-08-22 Remove useless code. (bug 7833) David Reveman 2006-08-22 Fix typo. David Reveman 2006-08-22 Allow override-redirect windows to support sync request protocol. David Reveman 2006-08-22 Add writePngToFile function, which is used by screenshot plugin. David Reveman 2006-08-08 Switch to using librsvg instead of libsvg-cairo. David Reveman 2006-08-08 Add screenshot plugin. David Reveman 2006-08-08 Set tooltip window type hint when using gtk >= 2.10. David Reveman 2006-07-25 Regen compiz.schemas.in. David Reveman 2006-07-25 Make sure things work as before adding new override-redirect window types. David Reveman 2006-07-25 Make sure things work as before adding new override-redirect window types. David Reveman 2006-07-25 Make sure things work as before adding new override-redirect window types. David Reveman 2006-07-25 Get window type hint for override-redirect windows as well. David Reveman 2006-07-25 Fix typo. David Reveman 2006-07-25 Add new override-redirect window types. David Reveman 2006-07-24 Make it possible to wrap plugin loading functions. David Reveman 2006-07-24 Remove fd watch when being unloaded. David Reveman 2006-07-24 Regen compiz.schemas.in. David Reveman 2006-07-24 Add line action to water plugin. David Reveman 2006-07-24 Add point action to water plugin. David Reveman 2006-07-24 Add support for floating arguments. David Reveman 2006-07-24 Add basic dbus plugin. David Reveman 2006-07-24 Fix rotateToTithWindow action. David Reveman 2006-07-24 Use active window by default. David Reveman 2006-07-23 Regen compiz.schemas.in. David Reveman 2006-07-23 All binding options are now finally converted to action options, removing all code related to the old CompBinding option. David Reveman 2006-07-23 Convert all core bindings to actions. David Reveman 2006-07-23 Position window menu at top left corner of window when no button. David Reveman 2006-07-23 Check ROTATE_DISPLAY_OPTION_TO_12 as well. David Reveman 2006-07-23 Unsnap from top on global terminate. David Reveman 2006-07-22 Add shiver action and remove visual bell option. David Reveman 2006-07-22 Make wobbly plugin use new action system. David Reveman 2006-07-22 Make switcher plugin use new action system. David Reveman 2006-07-22 Make zoom plugin use new action system. David Reveman 2006-07-22 Release move window when initiating new rotation. Merge: ab1e71e 7e81888 David Reveman 2006-07-21 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: plugins/compiz.schemas.in.in plugins/cube.c plugins/rotate.c David Reveman 2006-07-21 Make rotate plugin use new action system. David Reveman 2006-07-21 Add CompActionStateInitEdgeDnd, CompActionStateTermEdgeDnd and make sure that actions are triggered correctly on edge-leave. David Reveman 2006-07-21 Make sure we don't configure not yet managed windows. Dan Winship 2006-07-20 Update new edges stuff for new l10n stuff and fix compiz.schemas to use the configure-specified scale corner again Merge: 43046fc 47f5066 Dan Winship 2006-07-20 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Conflicts: plugins/compiz.schemas.in.in plugins/gconf-dump.c plugins/scale.c Dan Winship 2006-07-20 Improve the localization of compiz.schemas (bnc 176752) Instead of using intltool to parse and translate the generated compiz.schemas, we now mark the strings for translation in the code, and directly generate a localized schemas file, leaving untranslated the bits that need to be untranslated. David Reveman 2006-07-20 Make next_slide and prev_slide action options. David Reveman 2006-07-20 Fix typo David Reveman 2006-07-20 Make unfold binding in cube plugin an action option. David Reveman 2006-07-20 Read edge key when initializing action options. David Reveman 2006-07-19 Add screen edge bindings to action system and make scale plugin use it. David Reveman 2006-07-18 Change so that initiate action doesn't toggle scale mode and change default key-binding to ctrl-alt-up. David Reveman 2006-07-18 Make sure no other screen grab than rotate, switcher or cube exists before unfolding the cube. David Reveman 2006-07-18 Do not set WM_STATE hint on override redirect windows. This should fix issue with menus not showing up in QT4 apps. Merge: 9614f59 d4a51dd David Reveman 2006-07-18 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/app/compiz Quinn Storm 2006-07-18 Fix equality check for action options. David Reveman 2006-07-18 Don't free existingValue in switch statement. David Reveman 2006-07-18 Fix typo (Alp Toker) Dan Winship 2006-07-18 fix stacking logic so fullscreen windows still stay above dock when they have transients. David Reveman 2006-07-17 Initialize bind type correctly. David Reveman 2006-07-17 Index tail array correctly and move underscore to g_strdup_printf line. David Reveman 2006-07-17 Improve placement algorithm in scale plugin and make default spacing 10. David Reveman 2006-07-13 Only quit if selection clear event is for the decoration manager selection. David Reveman 2006-07-13 Don't run placement algorithm on windows that can't be moved by the user. David Reveman 2006-07-13 Add Mofif function hint support. David Reveman 2006-07-12 Don't call finiWindow or finiPluginForScreen in finiPlugin. These functions are now called from finiPluginForDisplay and finiPluginForScreen. David Reveman 2006-07-07 Add CM selection support. David Reveman 2006-07-07 Regen compiz.schemas.in.in. David Reveman 2006-07-07 Update scale plugin to use new action system. David Reveman 2006-07-06 Add wiper effect to water plugin. David Reveman 2006-07-06 Rearrange plugin initialization so that window are initialized in initPluginForScreen and screens are initialized in initPluginForDisplay. David Reveman 2006-07-05 Minor cleanup. David Reveman 2006-07-05 Implement gconf support for bell part of action system. David Reveman 2006-07-05 Check that bell is equal. David Reveman 2006-07-05 Fix typo David Reveman 2006-07-05 Make visual bell an normal action. David Reveman 2006-07-05 Handle bell notify events. David Reveman 2006-07-04 Add bell field to action option. David Reveman 2006-07-04 Update water plugin to use new action system. David Reveman 2006-07-04 Add root window option. David Reveman 2006-07-03 Update gconf code to handle CompAction options properly and regenerate compiz.schemas.in.in. David Reveman 2006-07-03 Update to use new action system. David Reveman 2006-07-03 Update move plugin to use new call-back based action system instead of the old deprecated binding system. David Reveman 2006-07-03 Add setDisplayAction function. David Reveman 2006-07-03 Implement call-back based key/button binding system. David Reveman 2006-07-03 Select for xkb state notify events. David Reveman 2006-07-03 Add getPlugins function. David Reveman 2006-07-03 Remove trailing whitespaces. David Reveman 2006-07-03 Add compSetActionOption. David Reveman 2006-07-03 Add addScreenAction and removeScreenAction functions. David Reveman 2006-07-03 Add escapeKeyCode to CompDisplay structure. David Reveman 2006-07-03 Add get-*-OptionNamed functions. David Reveman 2006-07-03 Add CompAction option. David Reveman 2006-07-03 Explicitly set CompBindingType enumeration values so it is clear that it can now be used as a bit mask. David Reveman 2006-07-03 Insert new screens at end. David Reveman 2006-07-03 Make eventLoop function handle multiple screens correctly. David Reveman 2006-07-03 Move screen specific variables into CompScreen structure. David Reveman 2006-07-03 Share textures and display lists with first context. Dan Winship 2006-06-29 update David Reveman 2006-06-21 Protect against circular transient dependencies David Reveman 2006-06-20 Constrain window dimensions David Reveman 2006-06-20 Trap X errors Dan Winship 2006-06-20 You forgot Poland. David Reveman 2006-06-16 Fix default window types in switcher and scale plugins David Reveman 2006-06-16 Handle motif WM hints better David Reveman 2006-06-15 Fix zooming in switcher plugin when cube plugin is not loaded David Reveman 2006-06-15 Add DM selection support and fix window button highlighting issue Dan Winship 2006-06-14 Mark cube as needing to load before switcher rather than marking switcher as requiring cube. bnc #183676. Output load_before and requires for all plugins, even if the list is empty, to ensure that an empty value in a new release overrides a non-empty value in an older release. regen Dan Winship 2006-06-09 add translations David Reveman 2006-06-09 Allow windows to be both maximized and shaded David Reveman 2006-06-09 constrain window geometry in configure requests correctly David Reveman 2006-06-08 Fix some shading restrictions David Reveman 2006-06-08 Handle initially shaded windows correctly David Reveman 2006-06-08 Fix issue that caused switcher window to sometimes not be visible David Reveman 2006-06-08 Handle quick unshade shade better David Reveman 2006-06-07 kill whitespace David Reveman 2006-06-07 Bump version David Reveman 2006-06-07 Add window shading David Reveman 2006-06-07 Regen compiz.schemas.in.in David Reveman 2006-06-07 Disable client-side texture coordinate arrays that are not used David Reveman 2006-06-07 Add initiate_keyboard bindings to move and resize plugins David Reveman 2006-06-06 Fix so switcher is not forcing fullscreen updates David Reveman 2006-06-06 Fix fullscreen window positioning issue David Reveman 2006-06-06 Clean up class hint handling David Reveman 2006-06-02 Bump version David Reveman 2006-06-02 Fix typo David Reveman 2006-06-02 Hide tooltips on NotifyGrab Dan Winship 2006-06-01 If we receive a _NET_SHOWING_DESKTOP request with no window set, set the flag on all screens. (Fixes the KDE "show desktop" applet.) Also, don't allow a client to change its _NET_WM_DESKTOP. Set _NET_WM_DESKTOP on all windows to 0; KDE's pager and tasklist require this to be set. (bnc 178320) David Reveman 2006-06-01 Add updateWindowClass David Reveman 2006-05-31 Save initial viewport when startup notification is received and add hide_skip_taskbar_windows option David Reveman 2006-05-31 Fix skydome animation David Reveman 2006-05-31 Fix clipping issue David Reveman 2006-05-31 Fix issue with moving windows using keyboard David Reveman 2006-05-31 Add GL_CFLAGS to INCLUDES Dan Winship 2006-05-30 call moveInputFocusToOtherWindow() before destroyWindow() when processing a DestroyNotify, or else the input focus can get stranded. Dan Winship 2006-05-30 Check libwnck for wnck_window_has_name (new in HEAD). #if HAVE_WNCK_WINDOW_HAS_NAME, redefine wnck_window_get_name to return NULL if the window only has a fallback name. bnc 173059. David Reveman 2006-05-26 Make sloppy focus default in scale mode David Reveman 2006-05-26 Handle dock windows with below state better David Reveman 2006-05-25 Make sure all visible cube sides are rendered when we have more than 4 sides David Reveman 2006-05-25 Regen compiz.schemas.in.in David Reveman 2006-05-25 Add missing changelog entry for last commit David Reveman 2006-05-25 Add maximize_window_horizontally, maximize_window_vertically, toggle_window_maximized, toggle_window_maximized_horizontally and toggle_window_maximized_vertically bindings David Reveman 2006-05-25 Make switcher plugin behave better when new windows appear and disappear David Reveman 2006-05-24 Fix key-navigation in scale plugin David Reveman 2006-05-23 Fix BigEndian issues Dan Winship 2006-05-23 use ss->windows here as well so that multiple activeNum==0 windows don't get skipped. (switchTerminate): Remove the screen grab right away so that keystrokes don't get dropped. bnc 177650 (switchPreparePaintScreen, switchPaintScreen, switchDonePaintScreen): update for that Dan Winship 2006-05-22 deal with both vertical and horizontal struts; but not when moving a dock window Dan Winship 2006-05-22 Check init_all binding before init, so you can bind "" to init_all and so end up with "Tab" being init_all rather than init (but with no way to get "init"...). bnc 173376 David Reveman 2006-05-21 Select for button events on root windows David Reveman 2006-05-21 Bump version David Reveman 2006-05-21 Fix shadow performance David Reveman 2006-05-21 Fix stacking and sync request issues David Reveman 2006-05-19 Allow use of larger window icons in switcher Dan Winship 2006-05-18 Set this to "None" to match wobblyInitScreen() so that it actually works right. regen Dan Winship 2006-05-18 s/compiz.schemas.in/compiz.schemas.in.in/ Dan Winship 2006-05-18 if we have a RestartCommand registered with the session manager, update the --sm-client-id in it to match the id we were assigned. bnc 176746 remove unused --sm-save-file arg and fix documentation of --sm-client-id. David Reveman 2006-05-17 Make default background black David Reveman 2006-05-17 Regen David Reveman 2006-05-17 Fix issue with switcher decorations David Reveman 2006-05-17 width and height should be unsiged David Reveman 2006-05-17 Add minimal option David Reveman 2006-05-17 Restore window position when transitioning to withdrawn state David Reveman 2006-05-17 Fix key-bindings and add icon support to switcher Dan Winship 2006-05-17 don't process exit-on-selection-clear until the event queue is empty, or else MapRequest and ConfigureRequest events could get lost. bnc 175558 David Reveman 2006-05-14 Fix unmap issue David Reveman 2006-05-12 Make handling of windows that go into withdrawn state a bit better and minor fixes to switcher and show desktop mode David Reveman 2006-05-12 Handle gravity correctly David Reveman 2006-05-11 Move server grab David Reveman 2006-05-11 Fix window positioning issue and un-maximize issue David Reveman 2006-05-11 Make sure title text fit in titlebar David Reveman 2006-05-11 Add missing ChangeLog entries David Reveman 2006-05-11 Fix window action menu issues Dan Winship 2006-05-11 Treat "" as meaning "disabled" David Reveman 2006-05-11 Fix window placement David Reveman 2006-05-09 Make sure window is mapped when getting the window pixmap David Reveman 2006-05-09 Fix mipmapping David Reveman 2006-05-08 Allow switcher to be initiated with prev bindings David Reveman 2006-05-07 Regen compiz.schemas.in.in David Reveman 2006-05-07 Minimized windows and icon support in switcher Dan Winship 2006-05-07 Add --with-scale-corner option and make compiz.schemas reflect it; the best corner to use depends on where the panels are and what's on them, so distros will want to override this to match their default panel layout. Dan Winship 2006-05-07 Fix the the "water plugin gets mysteriously activated when activating some other keybinding" bug. Dan Winship 2006-05-05 require intltool for option-description translation translate compiz.schemas.in into compiz.schemas Dan Winship 2006-05-05 Put numbers into the shortDescs of the command and run_command options Use Shift rather than Control, for consistency with Metacity, and to remove the ambiguity about whether Ctrl+Alt+Button1 should be "grab cube" or "move with snapping". (bnc 169402) regen David Reveman 2006-05-05 Regen compiz.schemas David Reveman 2006-05-05 Add audible and visual bell support David Reveman 2006-05-04 Fix issue with modal dialogs David Reveman 2006-05-03 Don't constrain the cursor David Reveman 2006-05-03 Add defaultViewportForWindow function David Reveman 2006-05-02 Minor fix to cube unfolding David Reveman 2006-05-02 Don't send synthetic ConfigureNotify events and handle ConfigureRequests correctly for withdrawn windows Dan Winship 2006-05-02 rewrite to make compiz.schema regeneration a little easier, and to make it possible to generate schema files for third-party plugins. Include plugin descriptions and dependency information in the schema. add a rule to generate compiz.schemas regen s/expose/scale/ in dependencies David Reveman 2006-05-02 Don't use glproto David Reveman 2006-05-02 Update to latest EXT_tfp spec David Reveman 2006-05-01 Fix window stacking bug David Reveman 2006-04-30 Raise-on-click option, DnD aware screen edges, zoom functionality in switcher, cube unfolding feature and some bug fixes David Reveman 2006-04-28 Add workaround for 64bit issue in libXrender David Reveman 2006-04-28 Back out type change in g-w-d David Reveman 2006-04-28 Add show desktop binding David Reveman 2006-04-28 Screen grab updates and reset timeout handle correctly in rotate plugin Dan Winship 2006-04-28 tweak eventMatches slightly to allow extra modifiers to be down when recognizing a modifier keypress. (Eg, don't require the user to release Alt before pressing Control to get window snapping.) Dan Winship 2006-04-28 new method that replaces EV_KEY and EV_BUTTON. Tests if an event matches a binding, being more precise about modifier state than EV_KEY and EV_BUTTON were. (eventTerminates): Tests if an event is "the opposite" of a binding. (Eg, button or modifier key release.) Replaces CompReleaseMask and "terminate" bindings. (handleEvent): Use eventMatches When passed a keybinding containing just modifiers, grab/ungrab every keypress event that would result in that modifier state (eg, both left and right modifier keys, and allow them to be pressed in any order). Remove CompPressMask from default bindings. (eventLoop): don't add virtual modifiers to event state. (updateModifierMappings): store the XModifierKeymap for later use. Use eventMatches and eventTerminates. Remove CompPressMask and "terminate" bindings (except from scale, which is different from the others). Make initiate_all be just the modifier key used in addition to the initiate binding (""). Remove next_window since it doesn't make a lot of sense to have it be different from initiate_all, and make prev_window be just a modifier key as well. (""). (SwitchScreen): add extra options to store the fully-composed initiate_all, prev, and prev_all bindings. (switchScreenInitOptions, switchSetScreenOption): Generate and regenerate initiate_all, prev, and prev_all bindings as needed. (switchHandleEvent): update Remove "" handling. regen, dropping the terminate bindings and updating a few others. remove CompPressMask, CompReleaseMask, EV_BUTTON, and EV_KEY. Add eventMatches, eventTerminates, and keycodeToModifiers. Add modMap field to CompDisplay. David Reveman 2006-04-28 Handle enter/leave notify events David Reveman 2006-04-28 Minor fix to decoration plugin David Reveman 2006-04-28 Lower xrender version requirement and fix 64bit issue in g-w-d David Reveman 2006-04-28 Shut up compiler Dan Winship 2006-04-27 for the rotate-to-specific-face keys, rotate counterclockwise when that's faster. (bnc 169427) Make the corners toggle scale mode rather than only activating it. (bnc 169408) David Reveman 2006-04-27 Bump version David Reveman 2006-04-27 Remove debug variable David Reveman 2006-04-27 Check if window is initially minimized David Reveman 2006-04-27 Add proper warp pointer interface and maximize effect to wobbly plugin Dan Winship 2006-04-26 activate window on Button2 click in addition to Button1 and Button3. Dan Winship 2006-04-26 gconf_value_compare against the old value for list-type options too. (gconfInitOption): Change the call to gconf_client_get_entry to request the default value again; the fix to gconfSetOption will prevent the infinite loops that happened before. David Reveman 2006-04-26 Remove comment David Reveman 2006-04-26 Maximized windows snap-off support and pointer warp fixes David Reveman 2006-04-25 Add clamp, min size to decoration property and make g-w-d use them David Reveman 2006-04-25 Click on background leaves scale mode and enters show desktop mode David Reveman 2006-04-25 Initialize scale and translate properly David Reveman 2006-04-25 Fix issue with _NET_SHOWING_DESKTOP support David Reveman 2006-04-24 Add missing break statement David Reveman 2006-04-24 Initialize rotateHandle David Reveman 2006-04-24 Another fix for paintScreen Dan Winship 2006-04-24 clarify the "initiate" descriptions regen David Reveman 2006-04-24 Fix window animation issue David Reveman 2006-04-24 Allow hiding of windows and use it in switcher plugin to avoid unnecessary redrawing of decorations David Reveman 2006-04-24 Add configurable drop-shadows Dan Winship 2006-04-20 add 12 go-directly-to-cube-face and 12 go-directly-to-cube-face-with-window bindings. fix the binding type on WINDOW_MENU. Regen. (lower_window, window_menu, scale_image, images, resize, flip_move, move_window_types, and the new rotate bindings) David Reveman 2006-04-20 Add force quit dialog David Reveman 2006-04-20 Add window menu binding David Reveman 2006-04-20 Add toolkit actions David Reveman 2006-04-20 Fix handling of modal dialogs David Reveman 2006-04-19 Fix gnome-theme-manager crash David Reveman 2006-04-18 Remove window-image option David Reveman 2006-04-18 Add strict-binding option Dan Winship 2006-04-18 Rearrange #includes to prevent warning about TRUE and FALSE being redefined Dan Winship 2006-04-18 Fix a crasher in the screenshot binding code (and rename some of the #defines to make them not so ridiculously long). Also temporarily hack around a bug in EV_KEY by putting the check for WINDOW_SCREENSHOT before the check for SCREENSHOT. Change the keybinding again, now to "Pause". (F11 is the "fullscreen mode" binding for many apps.) update Rearrange #includes to prevent warning about TRUE and FALSE being redefined David Reveman 2006-04-18 Changed default value of flip_move option David Reveman 2006-04-18 Dynamic positioning of title bar buttons David Reveman 2006-04-18 Fix typo David Reveman 2006-04-18 Fix typo David Reveman 2006-04-18 Fix window resizing issues David Reveman 2006-04-17 PNG on top face of cube by default David Reveman 2006-04-17 Remove window.png David Reveman 2006-04-17 Support for PNGs on top face of cube and an option for scaling the image or not David Reveman 2006-04-15 Fix default option in wobbly plugin David Reveman 2006-04-15 Fix crash in water plugins software backend Dan Winship 2006-04-14 add "water" to gconfDeps regen including the water options David Reveman 2006-04-14 Add support for automatic unredirecting of fullscreen windows David Reveman 2006-04-14 Do not initiate scale mode when no windows should be scaled David Reveman 2006-04-13 Allow 4-way resize Dan Winship 2006-04-13 Request the default value of the key from gconf, rather than initializing the key to the internal default value if it hasn't yet been set by the user. Notably, this makes it so that "compiz gconf" on a new account will use the default value of active_plugins rather than the (effectively empty) list of plugins on the command line. (It also makes it so that the sysadmin can override defaults via sabayon or whatever.) Dan Winship 2006-04-13 fix the gravity handling so self-resizing windows don't dance (although I'm pretty sure this is a symptom of mishandling gravity somewhere else). Dan Winship 2006-04-13 take a timestamp and pass that to the panel rather than using CurrentTime update for that David Reveman 2006-04-13 Disable draw synchronization on map David Reveman 2006-04-13 Enable draw synchronization on map David Reveman 2006-04-13 Patch from danw David Reveman 2006-04-11 Fix typo David Reveman 2006-04-10 Initial support for _NET_WM_USER_TIME, gconf updates and a focus fix David Reveman 2006-04-09 gconf updates David Reveman 2006-04-09 Remove test mode David Reveman 2006-04-09 Remove schema from CLEANFILES David Reveman 2006-04-09 Improve documentation for runcommand keys slightly David Reveman 2006-04-09 Switch to using GLX 1.3 David Reveman 2006-04-08 Add rain delay option David Reveman 2006-04-07 ChangeLog entry for last commit David Reveman 2006-04-07 Dump list options correctly David Reveman 2006-04-07 Add flip_move option to rotate plugin David Reveman 2006-04-07 Fix a few issues in scale plugin David Reveman 2006-04-07 Add gconf-compiz-utils.h to sources David Reveman 2006-04-07 Bump version David Reveman 2006-04-07 Schemas for gconf plugin and make key-button bindings display options instead of screen options David Reveman 2006-04-07 Add edge flipping to rotate plugin and hot corners to scale plugin David Reveman 2006-04-06 Add screen edges David Reveman 2006-04-06 Only stack normal windows above fullscreen windows when they are activated and fix issue in switcher plugin that could cause compiz to crash David Reveman 2006-04-05 Reset raster position when switching back to window system framebuffer David Reveman 2006-04-05 Add constrain_y option to move plugin David Reveman 2006-04-05 Fix focus issues when moving windows David Reveman 2006-04-03 Offset direction fix and offset scale option David Reveman 2006-04-03 Fix string types again David Reveman 2006-04-03 Fix string types David Reveman 2006-04-03 Bump version David Reveman 2006-04-03 Fix water effect on desaturated windows David Reveman 2006-04-02 Add rain effect to water plugin David Reveman 2006-04-02 Fix timeout handling David Reveman 2006-04-02 Water plugin updates David Reveman 2006-04-01 Fix typo David Reveman 2006-04-01 Add initiate-all binding to switcher plugin David Reveman 2006-03-31 Fix up show desktop mode and minimize David Reveman 2006-03-31 fboVertices should return 1 David Reveman 2006-03-30 Fix mipmap filter selection David Reveman 2006-03-29 Draw outline around window title text and buttons David Reveman 2006-03-29 Set allowed window actions more correctly David Reveman 2006-03-29 Add opacity option to move plugin David Reveman 2006-03-29 Add preliminary version of water plugin David Reveman 2006-03-21 Fix lower-window functionality in gnome-window-decorator David Reveman 2006-03-20 Fix typo David Reveman 2006-03-20 Fix client lists David Reveman 2006-03-20 Allow dialog window actions on util and toolbar windows David Reveman 2006-03-20 Window resize fixes Jeremy C. Reed 2006-03-18 Use same autogen.sh as rest of modular Xorg. This allows running it from alternative work directory. Jeremy C. Reed 2006-03-18 Mention "startup-notification" requirement. David Reveman 2006-03-17 Add opacity option to scale plugin David Reveman 2006-03-17 Bump version number David Reveman 2006-03-17 Io multiplexing and add all mandatory SM client callbacks David Reveman 2006-03-17 Improve restackWindowAbove, restackWindowBelow and add bring-to-front option to switcher plugin David Reveman 2006-03-16 Never raise desktop windows David Reveman 2006-03-16 Fix window state changes and sending of configure notify events David Reveman 2006-03-15 Fix paint attribute calculations David Reveman 2006-03-15 Add restackWindowBelow David Reveman 2006-03-14 Opacity, brightness and saturation as adjustable options in switcher plugin David Reveman 2006-03-14 Fix window movement using titlebar with sloppy focus David Reveman 2006-03-14 Fix window movement with sloppy focus David Reveman 2006-03-14 Unmap window fix David Reveman 2006-03-14 Fix lighting David Reveman 2006-03-14 Add command line option that prints version number David Reveman 2006-03-14 Add bindings for changing window opacity David Reveman 2006-03-14 Add minimize/maximize/unmaximize bindings David Reveman 2006-03-14 Add darken background option to scale plugin David Reveman 2006-03-13 Add CopySubBufferMESA support David Reveman 2006-03-07 Remove unused variable David Reveman 2006-03-07 Better window stacking support David Reveman 2006-03-06 Skydome update David Reveman 2006-03-06 Window visibility, close and decoration fixes David Reveman 2006-03-03 Skydome support in cube plugin David Reveman 2006-03-03 Fade plugin fixes David Reveman 2006-03-03 Add session.c David Reveman 2006-03-03 Fix issue with switcher and non-selectable window being active David Reveman 2006-03-03 Fix panel action issue David Reveman 2006-03-03 Minimal session support David Reveman 2006-03-02 Fix so we get correct cursor when changing active pointer grab David Reveman 2006-03-02 Fix pointer warping David Reveman 2006-03-02 Fix switching while rotating David Reveman 2006-03-02 Fix switcher opacity and lighting issue David Reveman 2006-03-01 Bump version number David Reveman 2006-03-01 Higher brightness David Reveman 2006-03-01 Add slow animations option and fix a number of issues exposed when using slow animations David Reveman 2006-03-01 Nicer drop shadow on windows without decorations and constrain window dimensions David Reveman 2006-03-01 Lighting support David Reveman 2006-02-23 Fix show desktop mode David Reveman 2006-02-23 Fix handling of scaled windows and add more options David Reveman 2006-02-23 Mipmap support and more run command options David Reveman 2006-02-22 Remove sync hack from decoration plugin and add prevous window binding to switcher plugin David Reveman 2006-02-22 Always use double buffering and remove sync hack David Reveman 2006-02-22 Update task switcher David Reveman 2006-02-20 Make sure windows that want a titlebar get decorated David Reveman 2006-02-20 Focus and client list fixes David Reveman 2006-02-17 Update zoom plugin David Reveman 2006-02-17 Fix drawing of cube with more than 4 sides Zack Rusin 2006-02-17 Detect mapped windows, try to figure out the frame set by compiz. Remove moc files, make the screen and window objects not qobject's. David Reveman 2006-02-16 Remove menu David Reveman 2006-02-16 Fix thumbnail drawing in switcher plugin and make sure window titles in gnome window decorator are only drawn when they fit in the titlebar Zack Rusin 2006-02-15 Patch from Michael Biebl to make sure moc sources are built reliably. Adding a warning that the Qt decorator is not ready David Reveman 2006-02-14 Handle clock rollback and minor icon fix David Reveman 2006-02-13 Remove menu check and require gtk+ 2.8.0 David Reveman 2006-02-12 Some work done on the flight back from xdevconf David Reveman 2006-02-10 Do not include Xevie.h Zack Rusin 2006-02-09 more magic Zack Rusin 2006-02-09 some window managment stubs Zack Rusin 2006-02-09 adding cvs ignores Zack Rusin 2006-02-09 first stab at kde support David Reveman 2006-02-09 Initial import David Reveman 2006-02-09 Initial revision ./images/0000755000004100000410000000000013246301623012510 5ustar www-datawww-data./images/CMakeLists.txt0000644000004100000410000000014213246301623015245 0ustar www-datawww-data set (_images icon.png ) install ( FILES ${_images} DESTINATION ${compiz_sharedir} ) ./images/icon.png0000644000004100000410000000102113246301623014140 0ustar www-datawww-dataPNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAThAj0E%(@%7(]'z2gdn U& {$ K13$c + (9FD؂Ơc֫̌(vZ1sͳ,\U~̦3b›lG/Z[Ϳ9 .2@G2eo-DDtDt`!p 0!):E&M+p}dzHC()ؤb ~ @%sCH DA8zH߁HB؈7`u header #ifndef _ _OPTIONS_H #define _ _OPTIONS_H #include <core/core.h> #endif #include <core/core.h> #include " _options.h" inline int Options:: { return mOptions[ ].value ().i (); } inline float Options:: { return mOptions[ ].value ().f (); } inline bool Options:: { return mOptions[ ].value ().b (); } inline CompString Options:: { return mOptions[ ].value ().s (); } inline CompMatch & Options:: { return mOptions[ ].value ().match (); } inline unsigned short * Options:: { return mOptions[ ].value ().c (); } inline unsigned short Options::optionGet Red () { return mOptions[ ].value ().c ()[0]; } inline unsigned short Options::optionGet Green () { return mOptions[ ].value ().c ()[1]; } inline unsigned short Options::optionGet Blue () { return mOptions[ ].value ().c ()[2]; } inline unsigned short Options::optionGet Alpha () { return mOptions[ ].value ().c ()[3]; } inline CompAction & Options:: { return mOptions[ ].value ().action (); } inline void Options::optionSet Initiate (CompAction::CallBack init) { mOptions[ ].value ().action ().setInitiate (init); } inline void Options::optionSet Terminate (CompAction::CallBack term) { mOptions[ ].value ().action ().setTerminate (term); } inline CompOption::Value::Vector & Options:: { return mOptions[ ].value ().list (); } inline unsigned int Options::optionGet Mask () { return m Mask; } inline void Options::optionSet Notify ( Options::ChangeNotify notify) { mNotify[ ] = notify; } .set( false ); .set((int) 0 ); .set((float) 0.0 ); .set(CompString (" ")); .set(CompMatch (" ")); .match ().update (); color[0] = MAX (0, MIN (0xffff, )); 0; color[1] = MAX (0, MIN (0xffff, )); 0; color[2] = MAX (0, MIN (0xffff, )); 0; color[3] = MAX (0, MIN (0xffff, )); 0xffff; .set(color); .set(CompAction ()); .action ().setState (state); action = CompAction (); action.setState (state | CompAction::StateInitKey); action.keyFromString (" "); .set (action); action = CompAction (); action.setState (state | CompAction::StateInitButton); action.buttonFromString (" "); .set (action); action = CompAction (); action.setState (state | CompAction::StateInitEdge); edge = 0; edge |= 1; edge |= (1 << 1); edge |= (1 << 2); edge |= (1 << 3); edge |= (1 << 4); edge |= (1 << 5); edge |= (1 << 6); edge |= (1 << 7); action.setEdgeMask (edge); .set (action); action = CompAction (); action.setState (state | CompAction::StateInitBell); action.setBell (true); .set (action); list.clear (); value value value value value value value value value value list.push_back (value); .set ( CompOption::TypeBool CompOption::TypeInt CompOption::TypeFloat CompOption::TypeString CompOption::TypeColor CompOption::TypeAction CompOption::TypeKey CompOption::TypeButton CompOption::TypeEdge CompOption::TypeBell CompOption::TypeMatch , list); state = 0; state = CompAction::StateAutoGrab; state |= CompAction::StateNoEdgeDelay; state |= CompAction::StateInitKey; state |= CompAction::StateInitButton; state |= CompAction::StateInitBell; state |= CompAction::StateInitEdge; state |= CompAction::StateInitEdgeDnd; action.setState (action.state() | CompAction::StateIgnoreTap); .rest ().set ( MINSHORT , MAXSHORT ); .rest ().set ( MINSHORT , MAXSHORT , 0.1f ); CompOption *o; unsigned int index; o = CompOption::findOption (mOptions, name, &index); if (!o) return false; switch (index) { default: break; } return false; case : if (o->set (value)) { m Mask = 0; foreach (CompOption::Value &val, o->value ().list ()) m Mask |= (1 << val.i ()); if (!mNotify[ ].empty ()) mNotify[ ] (o, ); return true; } break; enum Options { , OptionNum }; enum { = , }; #define Mask (1 << ) class Options : public CompOption::Class { public: typedef boost::function <void (CompOption *opt, Options num)> ChangeNotify; Options (bool init = true); virtual ~ Options (); void initOptions (); virtual CompOption::Vector & getOptions (); virtual bool setOption (const CompString &name, CompOption::Value &value); int ; float ; bool ; CompString ; CompMatch & ; unsigned short * ; unsigned short optionGet Red (); unsigned short optionGet Green (); unsigned short optionGet Blue (); unsigned short optionGet Alpha (); CompAction & ; void optionSet Initiate (CompAction::CallBack init); void optionSet Terminate (CompAction::CallBack term); CompOption::Value::Vector & ; unsigned int optionGet Mask (); void optionSet Notify (ChangeNotify notify); protected: CompOption::Vector mOptions; private: std::vector<ChangeNotify> mNotify; unsigned int m Mask; }; optionGet () CompOption::Vector & Options::getOptions () { return mOptions; } bool Options::setOption (const CompString &name, CompOption::Value &value) { } Options:: Options (bool init /* = true */) : mOptions ( Options::OptionNum), mNotify ( Options::OptionNum) { if (init) initOptions (); } void Options::initOptions () { unsigned int state; CompAction action; unsigned int edge; unsigned short color[4]; CompOption::Value::Vector list; CompOption::Value value; // mOptions[ ] .setName (" ", CompOption::TypeBool CompOption::TypeInt CompOption::TypeFloat CompOption::TypeString CompOption::TypeColor CompOption::TypeAction CompOption::TypeKey CompOption::TypeButton CompOption::TypeEdge CompOption::TypeBell CompOption::TypeMatch CompOption::TypeList ); .value() .value() .value() .value() .value() .value() .value() .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); .value() if (screen) screen->addAction (& mOptions[ ].value ().action ()); value.set ( CompOption::TypeBool CompOption::TypeInt CompOption::TypeFloat CompOption::TypeString CompOption::TypeColor CompOption::TypeAction CompOption::TypeKey CompOption::TypeButton CompOption::TypeEdge CompOption::TypeBell CompOption::TypeMatch , CompOption::Value::Vector (0)); .set (value); .value() m Mask = 0; foreach (CompOption::Value &val, mOptions[ ].value ().list ()) m Mask |= (1 << val.i ()); } Options::~ Options () { } /* * This file is autogenerated with bcop: * The Compiz option code generator * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ Options:: ./xslt/default_plugins.xslt0000644000004100000410000000520413246301623016337 0ustar www-datawww-data ./xslt/compiz_gsettings_schemas.xslt.in0000644000004100000410000003464213246301623020662 0ustar www-datawww-data /org/compiz @GETTEXT_PACKAGE@ '#000000ff' [ ] [ ] ' false Disabled ' i d b b a s ( - match ) = , 0 , ' ' , , ff ' ' 0000 00 | ' ' /plugins/ /general /screen0/options/ org.compiz . ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz ./VERSION0000644000004100000410000000001113246301623012303 0ustar www-datawww-data0.9.13.1 ./tests/0000755000004100000410000000000013246301623012405 5ustar www-datawww-data./tests/util/0000755000004100000410000000000013246301624013363 5ustar www-datawww-data./tests/util/run_with_ld_library_path.sh0000755000004100000410000000023613246301623021000 0ustar www-datawww-data#!/bin/bash args=("$@") ld_library_path=${args[0]} unset args[0] LD_LIBRARY_PATH=${ld_library_path} export LD_LIBRARY_PATH echo ${args[@]} exec ${args[@]} ./tests/CMakeLists.txt0000644000004100000410000000027613246301623015152 0ustar www-datawww-dataif (COMPIZ_BUILD_TESTING) add_subdirectory (integration) add_subdirectory (system) add_subdirectory (shared) add_subdirectory (acceptance-tests) endif (COMPIZ_BUILD_TESTING) ./tests/xorg-gtest/0000755000004100000410000000000013246301623014510 5ustar www-datawww-data./tests/xorg-gtest/CMakeLists.txt0000644000004100000410000000441613246301623017255 0ustar www-datawww-dataset (COMPIZ_LD_LIBRARY_PATH ${CMAKE_BINARY_DIR}/src CACHE STRING "" FORCE) set (COMPIZ_BINARY ${CMAKE_BINARY_DIR}/src/compiz CACHE STRING "" FORCE) set (COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/communicator CACHE PATH "" FORCE) set (COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY_DIRS ${CMAKE_CURRENT_BINARY_DIR}/communicator CACHE PATH "" FORCE) set (COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY compiz_xorg_gtest_communicator CACHE STRING "" FORCE) set (COMPIZ_TEST_ONLY_PLUGIN_PATH ${CMAKE_CURRENT_BINARY_DIR}/plugins/) set (COMPIZ_REAL_PLUGIN_PATH ${CMAKE_BINARY_DIR}/plugins/) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/src/compiz-xorg-gtest-config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xorg-gtest-config.h @ONLY) include_directories (${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_INCLUDES} ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR}) link_directories (${XORG_SERVER_LIBRARY_DIRS}) add_definitions (${XORG_SERVER_GTEST_CFLAGS}) set (_xorg_gtest_all_srcs ${XORG_SERVER_GTEST_SRC}/src/xorg-gtest-all.cpp) add_library (xorg_gtest_all STATIC ${_xorg_gtest_all_srcs}) add_library (compiz_xorg_gtest_main STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/compiz_xorg_gtest_main.cpp) add_library (compiz_xorg_gtest_system_test STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/compiz-xorg-gtest.cpp) add_executable (xorg_gtest_wrapper ${CMAKE_CURRENT_SOURCE_DIR}/src/xorg_gtest_wrapper.cpp) target_link_libraries (xorg_gtest_all ${X11_XI_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_GTEST_LIBRARIES}) target_link_libraries (compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_GTEST_LIBRARIES}) target_link_libraries (compiz_xorg_gtest_system_test xorg_gtest_all compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY} ${X11_XI_LIBRARIES}) add_executable (xorg_gtest_wrapper ${CMAKE_CURRENT_SOURCE_DIR}/src/xorg_gtest_wrapper.cpp) add_subdirectory (communicator) add_subdirectory (plugins) ./tests/xorg-gtest/plugins/0000755000004100000410000000000013246301623016171 5ustar www-datawww-data./tests/xorg-gtest/plugins/CMakeLists.txt0000644000004100000410000000043713246301623020735 0ustar www-datawww-dataset (COMPIZ_CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${COMPIZ_CMAKE_MODULE_PATH}) include (CompizDefaults) include (CompizCommon) set (COMPIZ_FOUND "true") include_directories (${COMPIZ_INTERNAL_INCLUDES}) add_subdirectory (testhelper) ./tests/xorg-gtest/plugins/testhelper/0000755000004100000410000000000013246301624020351 5ustar www-datawww-data./tests/xorg-gtest/plugins/testhelper/CMakeLists.txt0000644000004100000410000000032613246301623023111 0ustar www-datawww-datafind_package (Compiz REQUIRED) include (CompizPlugin) include_directories (${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR}) compiz_plugin (testhelper NOINSTALL LIBRARIES ${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY}) ./tests/xorg-gtest/plugins/testhelper/testhelper.xml.in0000644000004100000410000000020513246301623023653 0ustar www-datawww-data ./tests/xorg-gtest/plugins/testhelper/src/0000755000004100000410000000000013246301624021140 5ustar www-datawww-data./tests/xorg-gtest/plugins/testhelper/src/testhelper.h0000644000004100000410000000536013246301623023473 0ustar www-datawww-data/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #ifndef _COMPIZ_TESTHELPER_H #define _COMPIZ_TESTHELPER_H #include #include #include #include #include #include #include #include "testhelper_options.h" class TestHelperWindow; class TestHelperScreen : public PluginClassHandler , public ScreenInterface, public TesthelperOptions { public: typedef void (TestHelperWindow::*ClientMessageHandler) (long *); TestHelperScreen (CompScreen *); void handleEvent (XEvent *event); void watchForMessage (Atom, ClientMessageHandler); void removeMessageWatch (Atom); Atom fetchAtom (const char *); private: CompScreen *screen; compiz::testing::MessageAtoms mAtomStore; std::map mMessageHandlers; }; class TestHelperWindow : public PluginClassHandler , public WindowInterface { public: TestHelperWindow (CompWindow *); void configureAndReport (long *); void setFrameExtentsAndReport (long *); void setConfigureLock (long *); void setDestroyOnReparent (long *); void restackAtLeastAbove (long *); private: void windowNotify (CompWindowNotify n); CompWindow *window; compiz::window::configure_buffers::Releasable::Ptr configureLock; bool destroyOnReparent; }; class TestHelperPluginVTable : public CompPlugin::VTableForScreenAndWindow { public: bool init (); }; #endif ./tests/xorg-gtest/plugins/testhelper/src/testhelper.cpp0000644000004100000410000001664013246301623024031 0ustar www-datawww-data/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include #include #include "testhelper.h" COMPIZ_PLUGIN_20090315 (testhelper, TestHelperPluginVTable) namespace { template void XFreeT (T *t) { XFree (t); } } namespace ct = compiz::testing; namespace ctm = compiz::testing::messages; void TestHelperScreen::handleEvent (XEvent *event) { if (event->type == ClientMessage) { if (event->xclient.window != screen->root ()) { std::map ::iterator it = mMessageHandlers.find (event->xclient.message_type); if (it != mMessageHandlers.end ()) { ClientMessageHandler handler (it->second); CompWindow *w = screen->findWindow (event->xclient.window); XClientMessageEvent *xce = &event->xclient; long *data = xce->data.l; if (w) ((*TestHelperWindow::get (w)).*(handler)) (data); } } } screen->handleEvent (event); } void TestHelperScreen::watchForMessage (Atom message, ClientMessageHandler handler) { if (mMessageHandlers.find (message) != mMessageHandlers.end ()) { boost::shared_ptr name (XGetAtomName (screen->dpy (), message), boost::bind (XFreeT , _1)); compLogMessage ("testhelper", CompLogLevelWarn, "a message handler was already defined for %s", name.get ()); return; } mMessageHandlers[message] = handler; } void TestHelperScreen::removeMessageWatch (Atom message) { std::map ::iterator it = mMessageHandlers.find (message); if (it != mMessageHandlers.end ()) mMessageHandlers.erase (it); } Atom TestHelperScreen::fetchAtom (const char *message) { return mAtomStore.FetchForString (message); } void TestHelperWindow::configureAndReport (long *data) { XWindowChanges xwc; XWindowChanges saved; xwc.x = data[0]; xwc.y = data[1]; xwc.width = data[2]; xwc.height = data[3]; int mask = data[4]; /* configureXWindow has a nasty side-effect of * changing xwc to the client-window co-ordinates, * so we should back it up first */ saved = xwc; window->configureXWindow (mask, &xwc); xwc = saved; std::vector response; response.push_back (xwc.x); response.push_back (xwc.y); response.push_back (xwc.width); response.push_back (xwc.height); TestHelperScreen *ts = TestHelperScreen::get (screen); const Atom atom = ts->fetchAtom (ctm::TEST_HELPER_WINDOW_CONFIGURE_PROCESSED); ct::SendClientMessage (screen->dpy (), atom, screen->root (), window->id (), response); } void TestHelperWindow::setFrameExtentsAndReport (long *data) { /* Only change the frame input and not the border */ CompWindowExtents input (data[0], data[1], data[2], data[3]); CompWindowExtents border (0, 0, 0, 0); window->setWindowFrameExtents (&border, &input); std::vector response; response.push_back (input.left); response.push_back (input.right); response.push_back (input.top); response.push_back (input.bottom); TestHelperScreen *ts = TestHelperScreen::get (screen); const Atom atom = ts->fetchAtom (ctm::TEST_HELPER_FRAME_EXTENTS_CHANGED); ct::SendClientMessage (screen->dpy (), atom, screen->root (), window->id (), response); } void TestHelperWindow::setConfigureLock (long *data) { bool enabled = data[0] ? true : false; if (enabled && !configureLock) configureLock = window->obtainLockOnConfigureRequests (); else if (!enabled && configureLock) { configureLock->release (); configureLock.reset (); } } void TestHelperWindow::setDestroyOnReparent (long *) { destroyOnReparent = true; } void TestHelperWindow::restackAtLeastAbove (long *data) { ServerLock lock (screen->serverGrabInterface ()); Window above = data[0]; XWindowAttributes attrib; if (!XGetWindowAttributes (screen->dpy (), above, &attrib)) return; CompWindow *w = screen->findTopLevelWindow (above, true); for (; w; w = w->next) if (!w->overrideRedirect ()) break; if (!w) return; XWindowChanges xwc; xwc.stack_mode = Above; xwc.sibling = w->frame () ? w->frame () : w->id (); window->restackAndConfigureXWindow (CWStackMode | CWSibling, &xwc, lock); } void TestHelperWindow::windowNotify (CompWindowNotify n) { switch (n) { case CompWindowNotifyReparent: if (destroyOnReparent) { Window id = window->id (); window->destroy (); XDestroyWindow (screen->dpy (), id); } break; default: break; } window->windowNotify (n); } TestHelperWindow::TestHelperWindow (CompWindow *w) : PluginClassHandler (w), window (w), configureLock (), destroyOnReparent (false) { WindowInterface::setHandler (w); TestHelperScreen *ts = TestHelperScreen::get (screen); std::vector data; data.push_back (static_cast (window->id ())); data.push_back (static_cast (window->overrideRedirect ())); ct::SendClientMessage (screen->dpy (), ts->fetchAtom (ctm::TEST_HELPER_WINDOW_READY), screen->root (), screen->root (), data); } TestHelperScreen::TestHelperScreen (CompScreen *s) : PluginClassHandler (s), screen (s), mAtomStore (s->dpy ()) { ScreenInterface::setHandler (s); /* Register the message handlers on each window */ watchForMessage (fetchAtom (ctm::TEST_HELPER_CONFIGURE_WINDOW), &TestHelperWindow::configureAndReport); watchForMessage (fetchAtom (ctm::TEST_HELPER_CHANGE_FRAME_EXTENTS), &TestHelperWindow::setFrameExtentsAndReport); watchForMessage (fetchAtom (ctm::TEST_HELPER_LOCK_CONFIGURE_REQUESTS), &TestHelperWindow::setConfigureLock); watchForMessage (fetchAtom (ctm::TEST_HELPER_DESTROY_ON_REPARENT), &TestHelperWindow::setDestroyOnReparent); watchForMessage (fetchAtom (ctm::TEST_HELPER_RESTACK_ATLEAST_ABOVE), &TestHelperWindow::restackAtLeastAbove); ct::SendClientMessage (s->dpy (), mAtomStore.FetchForString (ctm::TEST_HELPER_READY_MSG), s->root (), s->root (), std::vector ()); } bool TestHelperPluginVTable::init () { if (CompPlugin::checkPluginABI ("core", CORE_ABIVERSION)) return true; return false; } ./tests/xorg-gtest/include/0000755000004100000410000000000013246301623016133 5ustar www-datawww-data./tests/xorg-gtest/include/compiz-xorg-gtest.h0000644000004100000410000001761213246301623021715 0ustar www-datawww-data/* * Compiz XOrg GTest * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_XORG_GTEST_H #define _COMPIZ_XORG_GTEST_H #include #include #include #include #include using ::testing::MatcherInterface; using ::testing::MatchResultListener; using ::testing::Matcher; namespace compiz { namespace testing { typedef ::testing::MatcherInterface XEventMatcher; class PrivateClientMessageXEventMatcher; class ClientMessageXEventMatcher : public compiz::testing::XEventMatcher { public: ClientMessageXEventMatcher (Display *display, Atom message, Window target); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; class PrivatePropertyNotifyXEventMatcher; class PropertyNotifyXEventMatcher : public compiz::testing::XEventMatcher { public: PropertyNotifyXEventMatcher (Display *dpy, const std::string &propertyName); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; class PrivateConfigureNotifyXEventMatcher; class ConfigureNotifyXEventMatcher : public compiz::testing::XEventMatcher { public: ConfigureNotifyXEventMatcher (Window above, unsigned int border, int x, int y, unsigned int width, unsigned int height, unsigned int mask); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; class PrivateShapeNotifyXEventMatcher; class ShapeNotifyXEventMatcher : public compiz::testing::XEventMatcher { public: ShapeNotifyXEventMatcher (int kind, int x, int y, unsigned int width, unsigned int height, Bool shaped); virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const; virtual void DescribeTo (std::ostream *os) const; private: std::auto_ptr priv; }; const int WINDOW_X = 0; const int WINDOW_Y = 0; const unsigned int WINDOW_WIDTH = 640; const unsigned int WINDOW_HEIGHT = 480; Window CreateNormalWindow (Display *dpy); Window GetImmediateParent (Display *display, Window w, Window &rootReturn); Window GetTopmostNonRootParent (Display *display, Window w); std::list NET_CLIENT_LIST_STACKING (Display *); bool AdvanceToNextEventOnSuccess (Display *dpy, bool waitResult); bool WaitForEventOfTypeOnWindow (Display *dpy, Window w, int type, int ext, int extType, int timeout = 0); bool WaitForEventOfTypeOnWindowMatching (Display *dpy, Window w, int type, int ext, int extType, const XEventMatcher &matcher, int timeout = 0); void RelativeWindowGeometry (Display *dpy, Window w, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border); void AbsoluteWindowGeometry (::Display *display, Window window, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border); typedef void (*RetrievalFunc) (Display *dpy, Window window, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border); class WindowGeometryMatcher : public MatcherInterface { public: WindowGeometryMatcher (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border); bool MatchAndExplain (Window x, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: class Private; std::auto_ptr priv; }; Matcher HasGeometry (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border); class PrivateCompizProcess; class CompizProcess { public: typedef enum _StartupFlags { ReplaceCurrentWM = (1 << 0), WaitForStartupMessage = (1 << 1), ExpectStartupFailure = (1 << 2) } StartupFlags; typedef enum _PluginType { Real = 0, TestOnly = 1 } PluginType; struct Plugin { Plugin (const char *name, PluginType type) : name (name), type (type) { } std::string name; PluginType type; }; typedef std::vector PluginList; CompizProcess (Display *dpy, StartupFlags, const PluginList &plugins, int timeout = 0); ~CompizProcess (); xorg::testing::Process::State State (); pid_t Pid (); private: std::auto_ptr priv; }; class PrivateCompizXorgSystemTest; class CompizXorgSystemTest : public xorg::testing::Test { public: CompizXorgSystemTest (); virtual void SetUp (); virtual void TearDown (); xorg::testing::Process::State CompizProcessState (); void StartCompiz (CompizProcess::StartupFlags flags, const CompizProcess::PluginList &plugins); private: std::auto_ptr priv; }; class PrivateAutostartCompizXorgSystemTest; class AutostartCompizXorgSystemTest : public CompizXorgSystemTest { public: AutostartCompizXorgSystemTest (); virtual CompizProcess::StartupFlags GetStartupFlags (); virtual int GetEventMask () const; virtual CompizProcess::PluginList GetPluginList (); virtual void SetUp (); private: std::auto_ptr priv; }; class PrivateAutostartCompizXorgSystemTestWithTestHelper; class AutostartCompizXorgSystemTestWithTestHelper : public AutostartCompizXorgSystemTest { public: AutostartCompizXorgSystemTestWithTestHelper (); virtual CompizProcess::PluginList GetPluginList (); protected: virtual void SetUp (); Atom FetchAtom (const char *); std::vector WaitForWindowCreation (Window w); bool IsOverrideRedirect (std::vector &data); virtual int GetEventMask () const; private: std::auto_ptr priv; }; } } #endif ./tests/xorg-gtest/src/0000755000004100000410000000000013246301624015300 5ustar www-datawww-data./tests/xorg-gtest/src/compiz-xorg-gtest.cpp0000644000004100000410000006264613246301623021423 0ustar www-datawww-data/* * Compiz XOrg GTest * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "compiz-xorg-gtest-config.h" using ::testing::MakeMatcher; using ::testing::MatchResultListener; using ::testing::MatcherInterface; using ::testing::Matcher; namespace ct = compiz::testing; namespace { const int WINDOW_X = ct::WINDOW_X; const int WINDOW_Y = ct::WINDOW_Y; const unsigned int WINDOW_WIDTH = ct::WINDOW_HEIGHT; const unsigned int WINDOW_HEIGHT = ct::WINDOW_HEIGHT; const unsigned int WINDOW_BORDER = 0; const unsigned int WINDOW_DEPTH = CopyFromParent; const unsigned int WINDOW_CLASS = InputOutput; Visual *WINDOW_VISUAL = CopyFromParent; const long WINDOW_ATTRIB_VALUE_MASK = 0; void RemoveEventFromQueue (Display *dpy) { XEvent event; if (XNextEvent (dpy, &event) != Success) throw std::runtime_error("Failed to remove X event"); } } Window ct::CreateNormalWindow (Display *dpy) { XSetWindowAttributes WINDOW_ATTRIB; Window w = XCreateWindow (dpy, DefaultRootWindow (dpy), WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BORDER, WINDOW_DEPTH, WINDOW_CLASS, WINDOW_VISUAL, WINDOW_ATTRIB_VALUE_MASK, &WINDOW_ATTRIB); XSelectInput (dpy, w, StructureNotifyMask); return w; } Window ct::GetImmediateParent (Display *display, Window w, Window &rootReturn) { Window parentReturn = w; Window *childrenReturn; unsigned int nChildrenReturn; XQueryTree (display, w, &rootReturn, &parentReturn, &childrenReturn, &nChildrenReturn); XFree (childrenReturn); return parentReturn; } Window ct::GetTopmostNonRootParent (Display *display, Window w) { Window rootReturn = 0; Window parentReturn = w; Window lastParent = 0; do { lastParent = parentReturn; parentReturn = GetImmediateParent (display, lastParent, rootReturn); } while (parentReturn != rootReturn); return lastParent; } bool ct::AdvanceToNextEventOnSuccess (Display *dpy, bool waitResult) { if (waitResult) RemoveEventFromQueue (dpy); return waitResult; } bool ct::WaitForEventOfTypeOnWindow (Display *dpy, Window w, int type, int ext, int extType, int timeout) { while (xorg::testing::XServer::WaitForEventOfType (dpy, type, ext, extType, timeout)) { XEvent event; if (!XPeekEvent (dpy, &event)) throw std::runtime_error ("Failed to peek event"); if (event.xany.window != w) { RemoveEventFromQueue (dpy); continue; } return true; } return false; } bool ct::WaitForEventOfTypeOnWindowMatching (Display *dpy, Window w, int type, int ext, int extType, const XEventMatcher &matcher, int timeout) { while (ct::WaitForEventOfTypeOnWindow (dpy, w, type, ext, extType, timeout)) { XEvent event; if (!XPeekEvent (dpy, &event)) throw std::runtime_error ("Failed to peek event"); if (!matcher.MatchAndExplain (event, NULL)) { RemoveEventFromQueue (dpy); continue; } return true; } std::stringstream ss; matcher.DescribeTo (&ss); ADD_FAILURE () << "Expected event matching: " << ss.str (); return false; } std::list ct::NET_CLIENT_LIST_STACKING (Display *dpy) { Atom property = XInternAtom (dpy, "_NET_CLIENT_LIST_STACKING", false); Atom actual_type; int actual_fmt; unsigned long nitems, nleft; unsigned char *prop; std::list stackingOrder; /* _NET_CLIENT_LIST_STACKING */ if (XGetWindowProperty (dpy, DefaultRootWindow (dpy), property, 0L, 512L, false, XA_WINDOW, &actual_type, &actual_fmt, &nitems, &nleft, &prop) == Success) { if (nitems && !nleft && actual_fmt == 32 && actual_type == XA_WINDOW) { Window *window = reinterpret_cast (prop); while (nitems--) stackingOrder.push_back (*window++); } if (prop) XFree (prop); } return stackingOrder; } namespace { class StartupClientMessageMatcher : public ct::XEventMatcher { public: StartupClientMessageMatcher (Atom startup, Window root, ct::CompizProcess::StartupFlags state) : mStartup (startup), mRoot (root), mFlags (state) { } virtual bool MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { int state = mFlags & ct::CompizProcess::ExpectStartupFailure ? 0 : 1; if (event.xclient.window == mRoot && event.xclient.message_type == mStartup && event.xclient.data.l[0] == state) return true; return false; } virtual void DescribeTo (std::ostream *os) const { *os << "is startup message"; } virtual void DescribeNegationTo (std::ostream *os) const { *os << "is not startup message"; } private: Atom mStartup; Window mRoot; ct::CompizProcess::StartupFlags mFlags; }; } class ct::PrivateClientMessageXEventMatcher { public: PrivateClientMessageXEventMatcher (Display *display, Atom message, Window target) : display (display), message (message), target (target) { } Display *display; Atom message; Window target; }; ct::ClientMessageXEventMatcher::ClientMessageXEventMatcher (Display *display, Atom message, Window target) : priv (new ct::PrivateClientMessageXEventMatcher (display, message, target)) { } bool ct::ClientMessageXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XClientMessageEvent *xce = reinterpret_cast (&event); if (xce->message_type == priv->message && xce->window == priv->target) return true; return false; } void ct::ClientMessageXEventMatcher::DescribeTo (std::ostream *os) const { CharacterWrapper name (XGetAtomName (priv->display, priv->message)); *os << "matches ClientMessage with type " << name << " on window " << std::hex << static_cast (priv->target) << std::dec << std::endl; } class ct::PrivatePropertyNotifyXEventMatcher { public: PrivatePropertyNotifyXEventMatcher (Display *dpy, const std::string &propertyName) : mPropertyName (propertyName), mProperty (XInternAtom (dpy, propertyName.c_str (), false)) { } std::string mPropertyName; Atom mProperty; }; ct::PropertyNotifyXEventMatcher::PropertyNotifyXEventMatcher (Display *dpy, const std::string &propertyName) : priv (new ct::PrivatePropertyNotifyXEventMatcher (dpy, propertyName)) { } bool ct::PropertyNotifyXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XPropertyEvent *propertyEvent = reinterpret_cast (&event); if (priv->mProperty == propertyEvent->atom) return true; else return false; } void ct::PropertyNotifyXEventMatcher::DescribeTo (std::ostream *os) const { *os << "Is property identified by " << priv->mPropertyName; } class ct::PrivateConfigureNotifyXEventMatcher { public: PrivateConfigureNotifyXEventMatcher (Window above, unsigned int border, int x, int y, unsigned int width, unsigned int height, unsigned int mask) : mAbove (above), mBorder (border), mX (x), mY (y), mWidth (width), mHeight (height), mMask (mask) { } Window mAbove; int mBorder; int mX; int mY; int mWidth; int mHeight; unsigned int mMask; }; ct::ConfigureNotifyXEventMatcher::ConfigureNotifyXEventMatcher (Window above, unsigned int border, int x, int y, unsigned int width, unsigned int height, unsigned int mask) : priv (new ct::PrivateConfigureNotifyXEventMatcher (above, border, x, y, width, height, mask)) { } bool ct::ConfigureNotifyXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XConfigureEvent *ce = reinterpret_cast (&event); if (priv->mMask & CWSibling) if (ce->above != priv->mAbove) return false; if (priv->mMask & CWBorderWidth) if (ce->border_width != priv->mBorder) return false; if (priv->mMask & CWX) if (ce->x != priv->mX) return false; if (priv->mMask & CWY) if (ce->y != priv->mY) return false; if (priv->mMask & CWWidth) if (ce->width != priv->mWidth) return false; if (priv->mMask & CWHeight) if (ce->height != priv->mHeight) return false; return true; } void ct::ConfigureNotifyXEventMatcher::DescribeTo (std::ostream *os) const { std::stringstream x, y, width, height, border, sibling; if (priv->mMask & CWX) x << " x: " << priv->mX; if (priv->mMask & CWY) y << " y: " << priv->mY; if (priv->mMask & CWWidth) width << " width: " << priv->mWidth; if (priv->mMask & CWHeight) height << " height: " << priv->mHeight; if (priv->mMask & CWBorderWidth) border << " border: " << priv->mBorder; if (priv->mMask & CWSibling) sibling << " above: " << std::hex << priv->mAbove << std::dec; *os << "Matches ConfigureNotify with parameters : " << std::endl << x.str () << y.str () << width.str () << height.str () << border.str () << sibling.str (); } class ct::PrivateShapeNotifyXEventMatcher { public: PrivateShapeNotifyXEventMatcher (int kind, int x, int y, unsigned int width, unsigned int height, Bool shaped) : mKind (kind), mX (x), mY (y), mWidth (width), mHeight (height), mShaped (shaped) { } int mKind; int mX; int mY; unsigned int mWidth; unsigned int mHeight; Bool mShaped; }; bool ct::ShapeNotifyXEventMatcher::MatchAndExplain (const XEvent &event, MatchResultListener *listener) const { const XShapeEvent *sev = reinterpret_cast (&event); return sev->kind == priv->mKind && sev->x == priv->mX && sev->y == priv->mY && sev->width == priv->mWidth && sev->height == priv->mHeight && sev->shaped == priv->mShaped; } void ct::ShapeNotifyXEventMatcher::DescribeTo (std::ostream *os) const { std::string kindStr (priv->mKind == ShapeBounding ? " ShapeBounding " : " ShapeInput "); *os << " Matches ShapeNotify with parameters : " << std::endl << " kind : " << kindStr << " x : " << priv->mX << " y : " << priv->mY << " width: " << priv->mWidth << " height: " << priv->mHeight << " shaped: " << priv->mShaped; } ct::ShapeNotifyXEventMatcher::ShapeNotifyXEventMatcher (int kind, int x, int y, unsigned int width, unsigned int height, Bool shaped) : priv (new ct::PrivateShapeNotifyXEventMatcher (kind, x, y, width, height, shaped)) { } void ct::RelativeWindowGeometry (Display *dpy, Window w, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border) { Window root; unsigned int depth; if (!XGetGeometry (dpy, w, &root, &x, &y, &width, &height, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); } void ct::AbsoluteWindowGeometry (Display *display, Window window, int &x, int &y, unsigned int &width, unsigned int &height, unsigned int &border) { Window root; Window child; unsigned int depth; if (!XGetGeometry (display, window, &root, &x, &y, &width, &height, &border, &depth)) throw std::logic_error ("XGetGeometry failed"); if (!XTranslateCoordinates (display, window, root, x, y, &x, &y, &child)) throw std::logic_error ("XTranslateCoordinates failed"); } class ct::WindowGeometryMatcher::Private { public: Private (Display *dpy, ct::RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border); Display *mDpy; RetrievalFunc mFunc; Matcher mX; Matcher mY; Matcher mWidth; Matcher mHeight; Matcher mBorder; }; Matcher ct::HasGeometry (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border) { return MakeMatcher (new WindowGeometryMatcher (dpy, func, x, y, width, height, border)); } ct::WindowGeometryMatcher::WindowGeometryMatcher (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border) : priv (new Private (dpy, func, x, y, width, height, border)) { } ct::WindowGeometryMatcher::Private::Private (Display *dpy, RetrievalFunc func, const Matcher &x, const Matcher &y, const Matcher &width, const Matcher &height, const Matcher &border): mDpy (dpy), mFunc (func), mX (x), mY (y), mWidth (width), mHeight (height), mBorder (border) { } bool ct::WindowGeometryMatcher::MatchAndExplain (Window w, MatchResultListener *listener) const { int x, y; unsigned int width, height, border; priv->mFunc (priv->mDpy, w, x, y, width, height, border); bool match = priv->mX.MatchAndExplain (x, listener) && priv->mY.MatchAndExplain (y, listener) && priv->mWidth.MatchAndExplain (width, listener) && priv->mHeight.MatchAndExplain (height, listener) && priv->mBorder.MatchAndExplain (border, listener); if (!match) { *listener << "Geometry:" << " x: " << x << " y: " << y << " width: " << width << " height: " << height << " border: " << border; } return match; } void ct::WindowGeometryMatcher::DescribeTo (std::ostream *os) const { *os << "Window geometry matching :"; *os << std::endl << " - "; priv->mX.DescribeTo (os); *os << std::endl << " - "; priv->mY.DescribeTo (os); *os << std::endl << " - "; priv->mWidth.DescribeTo (os); *os << std::endl << " - "; priv->mHeight.DescribeTo (os); *os << std::endl << " - "; priv->mBorder.DescribeTo (os); } class ct::PrivateCompizProcess { public: PrivateCompizProcess (ct::CompizProcess::StartupFlags flags) : mFlags (flags), mIsRunning (true) { } void WaitForStartupMessage (Display *dpy, ct::CompizProcess::StartupFlags flags, unsigned int waitTimeout); typedef boost::shared_ptr ProcessPtr; ct::CompizProcess::StartupFlags mFlags; bool mIsRunning; xorg::testing::Process mProcess; std::string mPluginPaths; std::auto_ptr mPluginPathsEnv; }; void ct::PrivateCompizProcess::WaitForStartupMessage (Display *dpy, ct::CompizProcess::StartupFlags flags, unsigned int waitTimeout) { XWindowAttributes attrib; Window root = DefaultRootWindow (dpy); Atom startup = XInternAtom (dpy, "_COMPIZ_TESTING_STARTUP", false); StartupClientMessageMatcher matcher (startup, root, flags); /* Save the current event mask and subscribe to StructureNotifyMask only */ ASSERT_TRUE (XGetWindowAttributes (dpy, root, &attrib)); XSelectInput (dpy, root, StructureNotifyMask | attrib.your_event_mask); ASSERT_TRUE (ct::AdvanceToNextEventOnSuccess ( dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, root, ClientMessage, -1, -1, matcher, waitTimeout))); XSelectInput (dpy, root, attrib.your_event_mask); } namespace { std::string PathForPlugin (const std::string &name, ct::CompizProcess::PluginType type) { switch (type) { case ct::CompizProcess::Real: return compizRealPluginPath + name; case ct::CompizProcess::TestOnly: return compizTestOnlyPluginPath + name; default: throw std::logic_error ("Incorrect value for type"); } return ""; } } ct::CompizProcess::CompizProcess (::Display *dpy, ct::CompizProcess::StartupFlags flags, const ct::CompizProcess::PluginList &plugins, int waitTimeout) : priv (new PrivateCompizProcess (flags)) { xorg::testing::Process::SetEnv ("LD_LIBRARY_PATH", compizLDLibraryPath, true); std::vector args; if (flags & ct::CompizProcess::ReplaceCurrentWM) args.push_back ("--replace"); args.push_back ("--no-auto-add-ccp"); args.push_back ("--send-startup-message"); /* Copy in plugin list and set environment variables */ for (ct::CompizProcess::PluginList::const_iterator it = plugins.begin (); it != plugins.end (); ++it) { priv->mPluginPaths += PathForPlugin (it->name, it->type) + ":"; args.push_back (it->name); } priv->mPluginPathsEnv.reset (new TmpEnv ("COMPIZ_PLUGIN_DIR", priv->mPluginPaths.c_str ())); priv->mProcess.Start (compizBinaryPath, args); EXPECT_EQ (priv->mProcess.GetState (), xorg::testing::Process::RUNNING); if (flags & ct::CompizProcess::WaitForStartupMessage) priv->WaitForStartupMessage (dpy, flags, waitTimeout); } ct::CompizProcess::~CompizProcess () { if (priv->mProcess.GetState () == xorg::testing::Process::RUNNING) priv->mProcess.Kill (); } xorg::testing::Process::State ct::CompizProcess::State () { return priv->mProcess.GetState (); } pid_t ct::CompizProcess::Pid () { return priv->mProcess.Pid (); } class ct::PrivateCompizXorgSystemTest { public: boost::shared_ptr mProcess; }; ct::CompizXorgSystemTest::CompizXorgSystemTest () : priv (new PrivateCompizXorgSystemTest) { } void ct::CompizXorgSystemTest::SetUp () { const unsigned int MAX_CONNECTION_ATTEMPTS = 10; const unsigned int USEC_TO_MSEC = 1000; const unsigned int SLEEP_TIME = 50 * USEC_TO_MSEC; int connectionAttemptsRemaining = MAX_CONNECTION_ATTEMPTS; /* Work around an inherent race condition in XOpenDisplay * * All xorg::testing::Test::SetUp does is call XOpenDisplay * and assign a display string, the former before the latter. * The current X Error handler will throw an exception if * an X error occurrs. * * Unfortunately there's an inherent race condition in spawning * a new server and using XOpenDisplay to connect to it - we * simply don't know when the new server will be ready, and even * watching its socket with inotify will be racey too. The only * solution would be a handshake process where we pass the server * a socket or pipe and it writes to it indicating that it is ready * to accept connections. There isn't such a thing. As such, we need * to work around that by simply re-trying our connection to the server * once every 50ms or so, and we're trying about 10 times before giving up * and assuming there is a problem with the server. * * The predecrement here is so that connectionAttemptsRemaining will be 0 * on failure */ while (--connectionAttemptsRemaining) { try { xorg::testing::Test::SetUp (); break; } catch (std::runtime_error &exception) { usleep (SLEEP_TIME); } } if (!connectionAttemptsRemaining) { throw std::runtime_error ("Failed to connect to X Server. "\ "Check the logs by setting "\ "XORG_GTEST_CHILD_STDOUT=1 to see if "\ "there are any startup errors. Otherwise "\ "if you suspect the server is running "\ "particularly slowly, try bumping up the "\ "maximum number of connection attempts in "\ "compiz-xorg-gtest.cpp"); } } void ct::CompizXorgSystemTest::TearDown () { priv->mProcess.reset (); xorg::testing::Test::TearDown (); } xorg::testing::Process::State ct::CompizXorgSystemTest::CompizProcessState () { if (priv->mProcess) return priv->mProcess->State (); return xorg::testing::Process::NONE; } void ct::CompizXorgSystemTest::StartCompiz (ct::CompizProcess::StartupFlags flags, const ct::CompizProcess::PluginList &plugins) { priv->mProcess.reset (new ct::CompizProcess (Display (), flags, plugins)); } class ct::PrivateAutostartCompizXorgSystemTest { }; ct::AutostartCompizXorgSystemTest::AutostartCompizXorgSystemTest () : priv (new ct::PrivateAutostartCompizXorgSystemTest ()) { } ct::CompizProcess::StartupFlags ct::AutostartCompizXorgSystemTest::GetStartupFlags () { return static_cast ( ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage); } int ct::AutostartCompizXorgSystemTest::GetEventMask () const { return 0; } ct::CompizProcess::PluginList ct::AutostartCompizXorgSystemTest::GetPluginList () { return ct::CompizProcess::PluginList (); } void ct::AutostartCompizXorgSystemTest::SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *display = Display (); XSelectInput (display, DefaultRootWindow (display), GetEventMask ()); StartCompiz (GetStartupFlags (), GetPluginList ()); } class ct::PrivateAutostartCompizXorgSystemTestWithTestHelper { public: std::auto_ptr mMessages; }; std::vector ct::AutostartCompizXorgSystemTestWithTestHelper::WaitForWindowCreation (Window w) { ::Display *dpy = Display (); XEvent event; bool requestAcknowledged = false; while (ct::ReceiveMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_WINDOW_READY), event)) { requestAcknowledged = w == static_cast (event.xclient.data.l[0]); if (requestAcknowledged) break; } EXPECT_TRUE (requestAcknowledged); std::vector data; for (int i = 0; i < 5; ++i) data.push_back(static_cast (event.xclient.data.l[i])); return data; } bool ct::AutostartCompizXorgSystemTestWithTestHelper::IsOverrideRedirect (std::vector &data) { return (data[1] > 0) ? true : false; } Atom ct::AutostartCompizXorgSystemTestWithTestHelper::FetchAtom (const char *message) { return priv->mMessages->FetchForString (message); } ct::AutostartCompizXorgSystemTestWithTestHelper::AutostartCompizXorgSystemTestWithTestHelper () : priv (new ct::PrivateAutostartCompizXorgSystemTestWithTestHelper) { } int ct::AutostartCompizXorgSystemTestWithTestHelper::GetEventMask () const { return AutostartCompizXorgSystemTest::GetEventMask () | StructureNotifyMask; } void ct::AutostartCompizXorgSystemTestWithTestHelper::SetUp () { ct::AutostartCompizXorgSystemTest::SetUp (); priv->mMessages.reset (new ct::MessageAtoms (Display ())); ::Display *dpy = Display (); Window root = DefaultRootWindow (dpy); Atom ready = priv->mMessages->FetchForString (ct::messages::TEST_HELPER_READY_MSG); ct::ClientMessageXEventMatcher matcher (dpy, ready, root); ASSERT_TRUE (ct::AdvanceToNextEventOnSuccess ( dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, root, ClientMessage, -1, -1, matcher))); } ct::CompizProcess::PluginList ct::AutostartCompizXorgSystemTestWithTestHelper::GetPluginList () { ct::CompizProcess::PluginList list; list.push_back (ct::CompizProcess::Plugin ("testhelper", ct::CompizProcess::TestOnly)); return list; } ./tests/xorg-gtest/src/xorg_gtest_wrapper.cpp0000644000004100000410000000447513246301623021742 0ustar www-datawww-data/* * Compiz XOrg GTest Wrapper * * Copyright (C) 2013 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include int usage () { printf ("usage: xorg_gtest_wrapper EXECUTABLE ARGUMENTS\n"); return 1; } int main (int argc, char **argv) { if (argc < 2) return usage (); /* We need to force the child stdout to remain open here. * * This is ugly, but the X Server and clients seem to * have some real trouble when you close their stdin/stdout. * It isn't really clear why, but at having a noisy test is * better than having a test that fails randomly. Without it, * the tests will occasionally hang in _XReply (), or the servers * will hang in other areas, probably in an IPC area or syscall */ setenv ("XORG_GTEST_CHILD_STDOUT", "1", 1); char * const *exec_args = const_cast (&argv[1]); /* Fork and spawn the new process */ pid_t test = fork (); if (test == -1) { perror ("fork"); return 1; } if (test == 0) { if (execvp (argv[1], exec_args) == -1) { perror ("execvp"); return 1; } } int status = 0; /* Make sure it exited normally */ do { pid_t child = waitpid (test, &status, 0); if (test == child) { if (WIFSIGNALED (status)) return 1; } else { perror ("waitpid"); return 1; } } while (!WIFEXITED (status) && !WIFSIGNALED (status)); return WEXITSTATUS (status); } ./tests/xorg-gtest/src/compiz-xorg-gtest-config.h.in0000644000004100000410000000235213246301623022724 0ustar www-datawww-data/* * Compiz XOrg GTest * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_XORG_GTEST_CONFIG_H #define _COMPIZ_XORG_GTEST_CONFIG_H namespace { const std::string compizLDLibraryPath ("@COMPIZ_LD_LIBRARY_PATH@"); const std::string compizBinaryPath ("@COMPIZ_BINARY@"); const std::string compizTestOnlyPluginPath ("@COMPIZ_TEST_ONLY_PLUGIN_PATH@"); const std::string compizRealPluginPath ("@COMPIZ_REAL_PLUGIN_PATH@"); } #endif ./tests/xorg-gtest/src/compiz_xorg_gtest_main.cpp0000644000004100000410000000652513246301623022565 0ustar www-datawww-data/* * Compiz XOrg GTest Decoration Pixmap Protocol Integration Tests * * Copyright (C) 2013 Sam Spilsbury. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include "xorg/gtest/xorg-gtest-environment.h" #include namespace compiz { namespace testing { class XorgEnvironment : public xorg::testing::Environment { public: virtual void SetUp () { /* Another hack - if the server fails * to start then just set another display * number until it does */ const int MaxConnections = 255; int displayNumber = 0; bool serverRunningOnDisplay = true; while (serverRunningOnDisplay && displayNumber < MaxConnections) { std::stringstream ss; ss << ":" << displayNumber; Display *check = XOpenDisplay (ss.str ().c_str ()); if (!check) serverRunningOnDisplay = false; else { XCloseDisplay (check); ++displayNumber; } } if (displayNumber == MaxConnections) throw std::runtime_error ("couldn't find a socket " "to launch on"); std::stringstream logFile; logFile << "/tmp/Compiz.Xorg.GTest." << displayNumber << ".log"; SetDisplayNumber (displayNumber); SetLogFile (logFile.str ()); xorg::testing::Environment::SetUp (); } }; } } /* X testing environment - Google Test environment feat. dummy x server * Copyright (C) 2011, 2012 Canonical Ltd. */ compiz::testing::XorgEnvironment *environment = NULL; namespace { void SignalHandler (int signum) { if (environment) environment->Kill (); /* This will call the default handler because we used SA_RESETHAND */ raise (signum); } void SetupSignalHandlers () { static const int signals[] = { SIGHUP, SIGTERM, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, SIGUSR1, SIGUSR2, SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, SIGVTALRM, SIGXCPU, SIGXFSZ, SIGIOT, SIGSTKFLT, SIGIO, SIGPWR, SIGUNUSED, }; struct sigaction action; action.sa_handler = SignalHandler; sigemptyset(&action.sa_mask); action.sa_flags = SA_RESETHAND; for (unsigned i = 0; i < sizeof(signals) / sizeof(signals[0]); ++i) if (sigaction(signals[i], &action, NULL)) std::cerr << "Warning: Failed to set signal handler for signal " << signals[i] << "\n"; } } int main (int argc, char **argv) { ::testing::InitGoogleTest (&argc, argv); SetupSignalHandlers (); environment = new compiz::testing::XorgEnvironment (); ::testing::AddGlobalTestEnvironment (environment); return RUN_ALL_TESTS (); } ./tests/xorg-gtest/communicator/0000755000004100000410000000000013246301623017210 5ustar www-datawww-data./tests/xorg-gtest/communicator/CMakeLists.txt0000644000004100000410000000117313246301623021752 0ustar www-datawww-datainclude (FindPkgConfig) pkg_check_modules (COMPIZ_XORG_GTEST_COMMUNICATOR x11) if (COMPIZ_XORG_GTEST_COMMUNICATOR_FOUND) include_directories (${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) link_directories (${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY_DIRS}) add_library (${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY} STATIC ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_communicator.cpp) target_link_libraries (${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARY} ${COMPIZ_XORG_GTEST_COMMUNICATOR_LIBRARIES}) endif (COMPIZ_XORG_GTEST_COMMUNICATOR_FOUND) ./tests/xorg-gtest/communicator/compiz_xorg_gtest_communicator.cpp0000644000004100000410000001244413246301623026247 0ustar www-datawww-data/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #include #include #include #include #include #include #include #include #include namespace compiz { namespace testing { namespace messages { namespace internal { const char *messages[] = { "_COMPIZ_TEST_HELPER_READY", "_COMPIZ_TEST_HELPER_REGISTER_CLIENT", "_COMPIZ_TEST_HELPER_LOCK_CONFIGURE_REQUESTS", "_COMPIZ_TEST_HELPER_CHANGE_FRAME_EXTENTS", "_COMPIZ_TEST_HELPER_FRAME_EXTENTS_CHANGED", "_COMPIZ_TEST_HELPER_CONFIGURE_WINDOW", "_COMPIZ_TEST_HELPER_WINDOW_CONFIGURE_PROCESSED", "_COMPIZ_TEST_HELPER_DESTROY_ON_REPARENT", "_COMPIZ_TEST_HELPER_RESTACK_ATLEAST_ABOVE", "_COMPIZ_TEST_HELPER_WINDOW_READY" }; } const char *TEST_HELPER_READY_MSG = internal::messages[0]; const char *TEST_HELPER_REGISTER_CLIENT = internal::messages[1]; const char *TEST_HELPER_LOCK_CONFIGURE_REQUESTS = internal::messages[2]; const char *TEST_HELPER_CHANGE_FRAME_EXTENTS = internal::messages[3]; const char *TEST_HELPER_FRAME_EXTENTS_CHANGED = internal::messages[4]; const char *TEST_HELPER_CONFIGURE_WINDOW = internal::messages[5]; const char *TEST_HELPER_WINDOW_CONFIGURE_PROCESSED = internal::messages[6]; const char *TEST_HELPER_DESTROY_ON_REPARENT = internal::messages[7]; const char *TEST_HELPER_RESTACK_ATLEAST_ABOVE = internal::messages[8]; const char *TEST_HELPER_WINDOW_READY = internal::messages[9]; } } } namespace ct = compiz::testing; namespace ctmi = compiz::testing::messages::internal; class ct::MessageAtoms::Private { public: std::map atoms; }; ct::MessageAtoms::MessageAtoms (Display *display) : priv (new ct::MessageAtoms::Private) { int nAtoms = sizeof (ctmi::messages) / sizeof (const char *); Atom atoms[nAtoms]; if (!XInternAtoms (display, const_cast (ctmi::messages), sizeof (ctmi::messages) / sizeof (const char *), 0, atoms)) throw std::runtime_error ("XInternAtoms generated an error"); for (int i = 0; i < nAtoms; ++i) priv->atoms[ctmi::messages[i]] = atoms[i]; } Atom ct::MessageAtoms::FetchForString (const char *message) { std::map ::iterator it (priv->atoms.find (message)); if (it == priv->atoms.end ()) { std::stringstream ss; ss << "Atom for message " << message << " does not exist"; throw std::runtime_error (ss.str ()); } return it->second; } namespace { bool FindClientMessage (Display *display, XEvent &event, Atom message) { while (XPending (display)) { XNextEvent (display, &event); if (event.type == ClientMessage) { if (event.xclient.message_type == message) return true; } } return false; } } bool ct::ReceiveMessage (Display *display, Atom message, XEvent &event, int timeout) { /* Ensure the event queue is fully flushed */ XFlush (display); if (FindClientMessage (display, event, message)) return true; else { struct pollfd pfd; pfd.events = POLLIN | POLLHUP | POLLERR; pfd.revents = 0; pfd.fd = ConnectionNumber (display); poll (&pfd, 1, timeout); /* Make sure we get something */ if ((pfd.revents & POLLIN) && !(pfd.revents & (POLLHUP | POLLERR))) { return ReceiveMessage (display, message, event, timeout); } else return false; } return false; } void ct::SendClientMessage (Display *display, Atom message, Window destination, Window target, const std::vector &data) { if (data.size () > 5) throw std::runtime_error ("data size must be less than 5"); XEvent event; memset (&event, 0, sizeof (XEvent)); event.type = ClientMessage; event.xclient.display = display; event.xclient.send_event = 1; event.xclient.serial = 0; event.xclient.message_type = message; event.xclient.window = target; event.xclient.format = 32; int count = 0; for (std::vector ::const_iterator it = data.begin (); it != data.end (); ++it) event.xclient.data.l[count++] = *it; XSendEvent (display, destination, 0, StructureNotifyMask, &event); XFlush (display); }; ./tests/xorg-gtest/communicator/compiz_xorg_gtest_communicator.h0000644000004100000410000000425613246301623025716 0ustar www-datawww-data/* * Copyright © 2013 Sam Spilsbury * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Sam Spilsbury */ #ifndef _COMPIZ_XORG_GTEST_COMMUNICATOR_H #define _COMPIZ_XORG_GTEST_COMMUNICATOR_H #include #include namespace compiz { namespace testing { namespace messages { extern const char *TEST_HELPER_READY_MSG; extern const char *TEST_HELPER_REGISTER_CLIENT; extern const char *TEST_HELPER_LOCK_CONFIGURE_REQUESTS; extern const char *TEST_HELPER_CHANGE_FRAME_EXTENTS; extern const char *TEST_HELPER_FRAME_EXTENTS_CHANGED; extern const char *TEST_HELPER_CONFIGURE_WINDOW; extern const char *TEST_HELPER_WINDOW_CONFIGURE_PROCESSED; extern const char *TEST_HELPER_DESTROY_ON_REPARENT; extern const char *TEST_HELPER_RESTACK_ATLEAST_ABOVE; extern const char *TEST_HELPER_WINDOW_READY; } class MessageAtoms { public: MessageAtoms (Display *); Atom FetchForString (const char *string); private: class Private; std::auto_ptr priv; }; bool ReceiveMessage (Display *, Atom, XEvent &, int timeout = -1); void SendClientMessage (Display *, Atom, Window, Window, const std::vector &data); } } #endif ./tests/system/0000755000004100000410000000000013246301623013731 5ustar www-datawww-data./tests/system/CMakeLists.txt0000644000004100000410000000012313246301623016465 0ustar www-datawww-dataadd_subdirectory (xorg-gtest) if (NOT USE_GLES) add_subdirectory (untest) endif () ./tests/system/xorg-gtest/0000755000004100000410000000000013246301623016034 5ustar www-datawww-data./tests/system/xorg-gtest/CMakeLists.txt0000644000004100000410000000011613246301623020572 0ustar www-datawww-dataif (BUILD_XORG_GTEST) add_subdirectory (tests) endif (BUILD_XORG_GTEST) ./tests/system/xorg-gtest/tests/0000755000004100000410000000000013246301623017176 5ustar www-datawww-data./tests/system/xorg-gtest/tests/CMakeLists.txt0000644000004100000410000000461113246301623021740 0ustar www-datawww-datapkg_check_modules (X11_XI x11 xi xext) if (BUILD_XORG_GTEST AND X11_XI_FOUND) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS} ${COMPIZ_XORG_GTEST_COMMUNICATOR_INCLUDE_DIR}) link_directories (${X11_XI_LIBRARY_DIRS} ${compiz_BINARY_DIR}/tests/shared/src) add_executable (compiz_xorg_gtest_test_window_stacking ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_test_window_stacking.cpp) add_executable (compiz_xorg_gtest_test_configure_window ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_configure_window.cpp) add_executable (compiz_xorg_gtest_test_icccm ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_icccm.cpp) add_executable (compiz_xorg_gtest_test_ewmh ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_ewmh.cpp) add_executable (compiz_xorg_gtest_test_shape_handling ${CMAKE_CURRENT_SOURCE_DIR}/compiz_xorg_gtest_test_shape_handling.cpp) set (COMPIZ_XORG_GTEST_LIBRARIES compiz_xorg_gtest_system_test xorg_gtest_all compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES}) target_link_libraries (compiz_xorg_gtest_test_window_stacking ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_window_stacking WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_icccm compiz_gtest_shared_async_task ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_icccm WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_ewmh ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_ewmh WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_shape_handling ${COMPIZ_XORG_GTEST_LIBRARIES}) compiz_discover_tests (compiz_xorg_gtest_test_shape_handling WITH_XORG_GTEST) target_link_libraries (compiz_xorg_gtest_test_configure_window ${COMPIZ_XORG_GTEST_LIBRARIES}) add_dependencies (compiz_xorg_gtest_test_configure_window testhelper) compiz_discover_tests (compiz_xorg_gtest_test_configure_window WITH_XORG_GTEST) endif (BUILD_XORG_GTEST AND X11_XI_FOUND) ./tests/system/xorg-gtest/tests/compiz_xorg_gtest_test_shape_handling.cpp0000644000004100000410000001200613246301623027532 0ustar www-datawww-data/* * Compiz XOrg GTest, window stacking * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::IsNull; using ::testing::NotNull; namespace ct = compiz::testing; namespace { bool Advance (Display *dpy, bool waitResult) { return ct::AdvanceToNextEventOnSuccess (dpy, waitResult); } Window FindTopLevelParent (Display *dpy, Window child) { Window lastParent = child; Window parent = lastParent, root = None; Window *children; unsigned int nchildren; /* Keep doing XQueryTree until we find a non-root parent */ while (parent != root) { lastParent = parent; XQueryTree (dpy, lastParent, &root, &parent, &children, &nchildren); XFree (children); } return lastParent; } } class CompizXorgSystemShapeHandling : public ct::AutostartCompizXorgSystemTest { public: virtual void SetUp () { ct::AutostartCompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), SubstructureNotifyMask | PropertyChangeMask); XShapeQueryExtension (dpy, &shapeBase, &shapeError); shapeEvent = shapeBase + ShapeNotify; w = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, MapNotify, -1, -1))); /* Now that we've received the ReparentNotify, find the toplevel parent */ parent = FindTopLevelParent (dpy, w); /* Select for ShapeNotify on the parent window */ XShapeSelectInput (dpy, parent, ShapeNotifyMask); } int shapeBase; int shapeError; int shapeEvent; Window w; Window parent; }; TEST_F (CompizXorgSystemShapeHandling, TestParentInputShapeSet) { ::Display *dpy = Display (); /* Change the input shape on the child window to None */ XShapeCombineRectangles (dpy, w, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0); ct::ShapeNotifyXEventMatcher matcher (ShapeInput, 0, 0, 0, 0, True); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, parent, shapeEvent, -1, 0, matcher))); /* Query Input Shape - should be no rectangles */ int n, ordering; ASSERT_THAT (XShapeGetRectangles (dpy, parent, ShapeInput, &n, &ordering), IsNull ()); EXPECT_EQ (0, n); /* Query Bounding Shape - should be one rectangle */ XRectangle *rects = XShapeGetRectangles (dpy, parent, ShapeBounding, &n, &ordering); ASSERT_THAT (rects, NotNull ()); ASSERT_EQ (1, n); EXPECT_EQ (ct::WINDOW_X, rects->x); EXPECT_EQ (ct::WINDOW_Y, rects->y); EXPECT_EQ (ct::WINDOW_WIDTH, rects->width); EXPECT_EQ (ct::WINDOW_HEIGHT, rects->height); } TEST_F (CompizXorgSystemShapeHandling, TestParentBoundingShapeSet) { ::Display *dpy = Display (); /* Change the input shape on the child window to None */ XShapeCombineRectangles (dpy, w, ShapeBounding, 0, 0, NULL, 0, ShapeSet, 0); ct::ShapeNotifyXEventMatcher matcher (ShapeBounding, 0, 0, 0, 0, True); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, parent, shapeEvent, -1, 0, matcher))); /* Query Bounding Shape - should be no rectangles */ int n, ordering; ASSERT_THAT (XShapeGetRectangles (dpy, parent, ShapeBounding, &n, &ordering), IsNull ()); EXPECT_EQ (0, n); /* Query Input Shape - should be one rectangle */ XRectangle *rects = XShapeGetRectangles (dpy, parent, ShapeInput, &n, &ordering); ASSERT_THAT (rects, NotNull ()); ASSERT_EQ (1, n); EXPECT_EQ (ct::WINDOW_X, rects->x); EXPECT_EQ (ct::WINDOW_Y, rects->y); EXPECT_EQ (ct::WINDOW_WIDTH, rects->width); EXPECT_EQ (ct::WINDOW_HEIGHT, rects->height); } ./tests/system/xorg-gtest/tests/compiz_xorg_gtest_icccm.cpp0000644000004100000410000001654213246301623024616 0ustar www-datawww-data/* * Compiz XOrg GTest, ICCCM compliance * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; namespace ct = compiz::testing; namespace { char TEST_FAILED_MSG = 's'; char PROCESS_EXITED_MSG = 'd'; bool Advance (Display *d, bool r) { return ct::AdvanceToNextEventOnSuccess (d, r); } } class WaitForSuccessDeathTask : public AsyncTask { public: typedef boost::function GetProcessState; WaitForSuccessDeathTask (const GetProcessState &procState) : mProcessState (procState) { } virtual ~WaitForSuccessDeathTask () {} private: GetProcessState mProcessState; void Task (); }; void WaitForSuccessDeathTask::Task () { do { if (ReadMsgFromTest (TEST_FAILED_MSG, 1)) return; } while (mProcessState () != xorg::testing::Process::FINISHED_FAILURE); /* The process died, send a message back saying that it did */ SendMsgToTest (PROCESS_EXITED_MSG); } class CompizXorgSystemICCCM : public ct::CompizXorgSystemTest { public: CompizXorgSystemICCCM () : /* See note in the acceptance tests about this */ env ("XORG_GTEST_CHILD_STDOUT", "1") { } virtual void SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask | FocusChangeMask | PropertyChangeMask | SubstructureRedirectMask); } private: TmpEnv env; }; TEST_F (CompizXorgSystemICCCM, SomeoneElseHasSubstructureRedirectMask) { StartCompiz (static_cast ( ct::CompizProcess::ExpectStartupFailure | ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage), ct::CompizProcess::PluginList ()); WaitForSuccessDeathTask::GetProcessState processState (boost::bind (&CompizXorgSystemICCCM::CompizProcessState, this)); AsyncTask::Ptr task (boost::make_shared (processState)); /* Now wait for the thread to tell us the news - * this will block for up to ten seconds */ const int maximumWaitTime = 1000 * 10; // 10 seconds if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FAILED_MSG); throw std::runtime_error ("compiz process did not exit with failure status"); } } class AutostartCompizXorgSystemICCCM : public ct::CompizXorgSystemTest { public: virtual void SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask | SubstructureNotifyMask | FocusChangeMask | PropertyChangeMask); StartCompiz (static_cast ( ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage), ct::CompizProcess::PluginList ()); } }; TEST_F (AutostartCompizXorgSystemICCCM, ConfigureRequestSendsBackAppropriateConfigureNotify) { ::Display *dpy = Display (); Window root = DefaultRootWindow (dpy); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); ct::PropertyNotifyXEventMatcher propertyMatcher (dpy, "_NET_CLIENT_LIST_STACKING"); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, propertyMatcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, propertyMatcher))); /* Select for StructureNotify on w1 */ XSelectInput (dpy, w1, StructureNotifyMask); /* Send a ConfigureRequest to the server asking for * a particular geometry and stack position relative * to w2 */ XEvent event; XConfigureRequestEvent *configureRequestEvent = &event.xconfigurerequest; event.type = ConfigureRequest; const Window REQUEST_ABOVE = w2; const unsigned int REQUEST_BORDER_WIDTH = 0; const unsigned int REQUEST_X = 110; const unsigned int REQUEST_Y = 120; const unsigned int REQUEST_WIDTH = 200; const unsigned int REQUEST_HEIGHT = 200; configureRequestEvent->window = w1; configureRequestEvent->above = REQUEST_ABOVE; configureRequestEvent->detail = Above; configureRequestEvent->border_width = REQUEST_BORDER_WIDTH; configureRequestEvent->x = REQUEST_X; configureRequestEvent->y = REQUEST_Y; configureRequestEvent->width = REQUEST_WIDTH; configureRequestEvent->height = REQUEST_HEIGHT; configureRequestEvent->value_mask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWSibling | CWStackMode; XSendEvent (dpy, root, 0, SubstructureRedirectMask | SubstructureNotifyMask, &event); XFlush (dpy); /* Now wait for a ConfigureNotify to be sent back */ ct::ConfigureNotifyXEventMatcher configureMatcher (0, // Always zero REQUEST_BORDER_WIDTH, REQUEST_X, REQUEST_Y, REQUEST_WIDTH, REQUEST_HEIGHT, configureRequestEvent->value_mask & ~(CWSibling | CWStackMode)); /* Should get a ConfigureNotify with the right parameters */ EXPECT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, w1, ConfigureNotify, -1, -1, configureMatcher))); /* Check if the window is actually above */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, propertyMatcher))); /* Check the client list to see that w1 > w2 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (2, clientList.size ()); EXPECT_EQ (w2, clientList.front ()); EXPECT_EQ (w1, clientList.back ()); } ./tests/system/xorg-gtest/tests/compiz_xorg_gtest_test_window_stacking.cpp0000644000004100000410000005636413246301623027777 0ustar www-datawww-data/* * Compiz XOrg GTest, window stacking * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; namespace ct = compiz::testing; namespace ctm = compiz::testing::messages; class CompizXorgSystemStackingTest : public ct::AutostartCompizXorgSystemTest { public: virtual void SetUp () { ct::AutostartCompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), SubstructureNotifyMask | PropertyChangeMask); } }; namespace { bool Advance (Display *dpy, bool waitResult) { return ct::AdvanceToNextEventOnSuccess (dpy, waitResult); } void MakeDock (Display *dpy, Window w) { Atom _NET_WM_WINDOW_TYPE = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE", false); Atom _NET_WM_WINDOW_TYPE_DOCK = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DOCK", false); XChangeProperty (dpy, w, _NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, reinterpret_cast (&_NET_WM_WINDOW_TYPE_DOCK), 1); } void SetUserTime (Display *dpy, Window w, Time time) { Atom _NET_WM_USER_TIME = XInternAtom (dpy, "_NET_WM_USER_TIME", false); unsigned int value = (unsigned int) time; XChangeProperty (dpy, w, _NET_WM_USER_TIME, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &value, 1); } void SetClientLeader (Display *dpy, Window w, Window leader) { Atom WM_CLIENT_LEADER = XInternAtom (dpy, "WM_CLIENT_LEADER", false); XChangeProperty (dpy, w, WM_CLIENT_LEADER, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &leader, 1); } } TEST_F (CompizXorgSystemStackingTest, TestSetup) { } TEST_F (CompizXorgSystemStackingTest, TestCreateWindowsAndRestackRelativeToEachOther) { ::Display *dpy = Display (); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Both reparented and both mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy,w1, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, MapNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, MapNotify, -1, -1))); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that w2 > w1 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 2); EXPECT_EQ (clientList.front (), w1); EXPECT_EQ (clientList.back (), w2); } TEST_F (CompizXorgSystemStackingTest, TestCreateWindowsAndRestackRelativeToEachOtherDockAlwaysOnTop) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window dock = ct::CreateNormalWindow (dpy); /* Make it a dock */ MakeDock (dpy, dock); /* Immediately map the dock window and clear the event queue for it */ XMapRaised (dpy, dock); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, MapNotify, -1, -1))); /* Dock window needs to be in the client list */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 1); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XSelectInput (dpy, w2, StructureNotifyMask); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Both reparented and both mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, MapNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w2, MapNotify, -1, -1))); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); clientList = ct::NET_CLIENT_LIST_STACKING (dpy); /* Check the client list to see that dock > w2 > w1 */ ASSERT_EQ (clientList.size (), 3); std::list ::iterator it = clientList.begin (); EXPECT_EQ (*it++, w1); /* first should be the bottom normal window */ EXPECT_EQ (*it++, w2); /* second should be the top normal window */ EXPECT_EQ (*it++, dock); /* dock must always be on top */ } TEST_F (CompizXorgSystemStackingTest, TestMapWindowWithOldUserTime) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); Window w3 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); SetUserTime (dpy, w2, 200); SetClientLeader (dpy, w2, w2); SetUserTime (dpy, w3, 100); SetClientLeader (dpy, w3, w3); XMapRaised (dpy, w3); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that w2 > w3 > w1 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 3); std::list ::iterator it = clientList.begin (); EXPECT_EQ (*it++, w1); EXPECT_EQ (*it++, w3); EXPECT_EQ (*it++, w2); } TEST_F (CompizXorgSystemStackingTest, TestMapWindowAndDenyFocus) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); Window w3 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); XMapRaised (dpy, w2); /* Wait for property change notify on the root window to happen twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); SetUserTime (dpy, w3, 0); SetClientLeader (dpy, w3, w3); XMapRaised (dpy, w3); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that w2 > w3 > w1 */ std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 3); std::list ::iterator it = clientList.begin (); EXPECT_EQ (*it++, w1); EXPECT_EQ (*it++, w3); EXPECT_EQ (*it++, w2); } TEST_F (CompizXorgSystemStackingTest, TestCreateRelativeToDestroyedWindowFindsAnotherAppropriatePosition) { ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window dock = ct::CreateNormalWindow (dpy); /* Make it a dock */ MakeDock (dpy, dock); /* Immediately map the dock window and clear the event queue for it */ XMapRaised (dpy, dock); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, dock, MapNotify, -1, -1))); /* Dock window needs to be in the client list */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); ASSERT_EQ (clientList.size (), 1); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w1); /* All reparented and mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy,w1, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w1, MapNotify, -1, -1))); /* Grab the server so that we can guarantee that all of these requests * happen before compiz gets them */ XGrabServer (dpy); XSync (dpy, false); /* Map the second window, so it ideally goes above w1. Compiz will * receive the MapRequest for this first */ XMapRaised (dpy, w2); /* Create window that has w2 as its ideal above-candidate * (compiz will receive the CreateNotify for this window * after the MapRequest but before the subsequent MapNotify) */ Window w3 = ct::CreateNormalWindow (dpy); XMapRaised (dpy, w3); /* Destroy w2 */ XDestroyWindow (dpy, w2); XUngrabServer (dpy); XSync (dpy, false); /* Reparented and mapped */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w3, ReparentNotify, -1, -1))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w3, MapNotify, -1, -1))); /* Update _NET_CLIENT_LIST_STACKING twice */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); /* Check the client list to see that dock > w3 > w1 */ clientList = ct::NET_CLIENT_LIST_STACKING (dpy); std::list ::iterator it = clientList.begin (); EXPECT_EQ (3, clientList.size ()); EXPECT_EQ (w1, (*it++)); EXPECT_EQ (w3, (*it++)); EXPECT_EQ (dock, (*it++)); } TEST_F(CompizXorgSystemStackingTest, TestWindowsDontStackAboveTransientForWindows) { /* Here we are testing if new windows are being stacked above transientFor * windows. A problem is if a window is set to transientFor on a dock type * then a new window is mapped it set to be lower or above the transientFor * window causing it to be above the dock type window int the stack (which * is incorrect behavior) */ ::Display *dpy = Display (); ct::PropertyNotifyXEventMatcher matcher (dpy, "_NET_CLIENT_LIST_STACKING"); Window dock = ct::CreateNormalWindow (dpy); MakeDock (dpy, dock); XMapRaised (dpy, dock); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); Window w1 = ct::CreateNormalWindow (dpy); Window w2 = ct::CreateNormalWindow (dpy); XSetTransientForHint(dpy, w1, dock); XMapRaised (dpy, w1); XMapRaised (dpy, w2); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, matcher))); std::list clientList = ct::NET_CLIENT_LIST_STACKING (dpy); std::list ::iterator it = clientList.begin (); /* Assert, w1 > dock > w2 */ EXPECT_EQ (3, clientList.size ()); EXPECT_EQ (w2, (*it++)); EXPECT_EQ (dock, (*it++)); EXPECT_EQ (w1, (*it++)); } class StackingSync : public ct::AutostartCompizXorgSystemTestWithTestHelper { public: void SetUp (); }; void StackingSync::SetUp () { ct::AutostartCompizXorgSystemTestWithTestHelper::SetUp (); XSelectInput (Display (), DefaultRootWindow (Display ()), StructureNotifyMask | SubstructureNotifyMask); } namespace { Window CreateAndWaitForCreation (Display *dpy) { Window w = ct::CreateNormalWindow (dpy); Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, DefaultRootWindow (dpy), CreateNotify, -1, -1)); return w; } Window CreateOverrideRedirectWindow (Display *dpy) { XSetWindowAttributes attrib; attrib.override_redirect = true; Window w = XCreateWindow (dpy, DefaultRootWindow (dpy), ct::WINDOW_X, ct::WINDOW_Y, ct::WINDOW_WIDTH, ct::WINDOW_HEIGHT, 0, DefaultDepth (dpy, 0), InputOutput, DefaultVisual (dpy, DefaultScreen (dpy)), CWOverrideRedirect, &attrib); XSelectInput (dpy, w, StructureNotifyMask); return w; } Window MapAndWaitForParent (Display *dpy, Window w) { XMapRaised (dpy, w); Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1)); return ct::GetTopmostNonRootParent (dpy, w); } void DestroyOnReparent (Display *dpy, ct::MessageAtoms &atoms, Window w) { Window root = DefaultRootWindow (dpy); Atom atom = atoms.FetchForString (ctm::TEST_HELPER_DESTROY_ON_REPARENT); std::vector data (4); ct::SendClientMessage (dpy, atom, root, w, data); } Window WaitForNextCreatedWindow (Display *dpy) { XEvent ev; while (true) { XNextEvent (dpy, &ev); if (ev.type == CreateNotify) return ev.xcreatewindow.window; } return 0; } void WaitForManage (Display *dpy, ct::MessageAtoms &atoms) { Atom atom = atoms.FetchForString (ctm::TEST_HELPER_WINDOW_READY); XEvent ev; ct::ReceiveMessage (dpy, atom, ev); } void RestackAbove (Display *dpy, Window w, Window above) { XWindowChanges xwc; xwc.stack_mode = Above; xwc.sibling = above; XConfigureWindow (dpy, w, CWStackMode | CWSibling, &xwc); } void RestackAtLeastAbove (Display *dpy, ct::MessageAtoms &atoms, Window w, Window above) { Window root = DefaultRootWindow (dpy); Atom atom = atoms.FetchForString (ctm::TEST_HELPER_RESTACK_ATLEAST_ABOVE); std::vector data (4); data[0] = above; ct::SendClientMessage (dpy, atom, root, w, data); } void FreeWindowArray (Window *array) { XFree (array); } typedef boost::shared_array WindowArray; WindowArray GetChildren (Display *dpy, Window w, unsigned int &n) { Window unused; Window *children; if (!XQueryTree (dpy, w, &unused, &unused, &children, &n)) throw std::logic_error ("XQueryTree failed"); return WindowArray (children, boost::bind (FreeWindowArray, _1)); } class StackPositionMatcher : public MatcherInterface { public: StackPositionMatcher (const WindowArray &array, Window cmp, unsigned int n); protected: bool MatchAndExplain (Window window, MatchResultListener *listener) const; void DescribeTo (std::ostream *os) const; private: virtual bool Compare (int lhsPos, int rhsPos) const = 0; virtual void ExplainCompare (std::ostream *os) const = 0; WindowArray array; unsigned int arrayNum; Window cmp; }; StackPositionMatcher::StackPositionMatcher (const WindowArray &array, Window cmp, unsigned int n) : array (array), arrayNum (n), cmp (cmp) { } bool StackPositionMatcher::MatchAndExplain (Window window, MatchResultListener *listener) const { int lhsPos = -1, rhsPos = -1; for (unsigned int i = 0; i < arrayNum; ++i) { if (array[i] == window) lhsPos = i; if (array[i] == cmp) rhsPos = i; } if (lhsPos > -1 && rhsPos > -1) { if (Compare (lhsPos, rhsPos)) return true; } /* Match failed, add stack to MatchResultListener */ if (listener->IsInterested ()) { std::stringstream windowStack; windowStack << "Window Stack (bottom to top [" << arrayNum << "]): \n"; *listener << windowStack.str (); for (unsigned int i = 0; i < arrayNum; ++i) { std::stringstream ss; ss << " - 0x" << std::hex << array[i] << std::dec << std::endl; *listener << ss.str (); } std::stringstream lhsPosMsg, rhsPosMsg; lhsPosMsg << "Position of 0x" << std::hex << window << std::dec << " : " << lhsPos; rhsPosMsg << "Position of 0x" << std::hex << cmp << std::dec << " : " << rhsPos; *listener << lhsPosMsg.str () << "\n"; *listener << rhsPosMsg.str () << "\n"; } return false; } void StackPositionMatcher::DescribeTo (std::ostream *os) const { *os << "Window is "; ExplainCompare (os); *os << " in relation to 0x" << std::hex << cmp << std::dec; } class GreaterThanInStackMatcher : public StackPositionMatcher { public: GreaterThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n); private: bool Compare (int lhsPos, int rhsPos) const; void ExplainCompare (std::ostream *os) const; }; GreaterThanInStackMatcher::GreaterThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n) : StackPositionMatcher (array, cmp, n) { } bool GreaterThanInStackMatcher::Compare (int lhsPos, int rhsPos) const { return lhsPos > rhsPos; } void GreaterThanInStackMatcher::ExplainCompare (std::ostream *os) const { *os << "greater than"; } class LessThanInStackMatcher : public StackPositionMatcher { public: LessThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n); private: bool Compare (int lhsPos, int rhsPos) const; void ExplainCompare (std::ostream *os) const; }; LessThanInStackMatcher::LessThanInStackMatcher (const WindowArray &array, Window cmp, unsigned int n) : StackPositionMatcher (array, cmp, n) { } bool LessThanInStackMatcher::Compare (int lhsPos, int rhsPos) const { return lhsPos < rhsPos; } void LessThanInStackMatcher::ExplainCompare (std::ostream *os) const { *os << "less than"; } inline Matcher GreaterThanInStack (const WindowArray &array, unsigned int n, Window cmp) { return MakeMatcher (new GreaterThanInStackMatcher (array, cmp, n)); } inline Matcher LessThanInStack (const WindowArray &array, unsigned int n, Window cmp) { return MakeMatcher (new LessThanInStackMatcher (array, cmp, n)); } } TEST_F (StackingSync, DestroyClientJustBeforeReparent) { ::Display *dpy = Display (); ct::MessageAtoms atoms (dpy); /* Set up three normal windows */ Window w1 = CreateAndWaitForCreation (dpy); Window w2 = CreateAndWaitForCreation (dpy); Window w3 = CreateAndWaitForCreation (dpy); Window p1 = MapAndWaitForParent (dpy, w1); Window p2 = MapAndWaitForParent (dpy, w2); Window p3 = MapAndWaitForParent (dpy, w3); /* Create another normal window, but immediately mark * it destroyed within compiz as soon as it is reparented, * so that we force the reparented-but-destroyed strategy * to kick in */ Window destroyed = CreateAndWaitForCreation (dpy); DestroyOnReparent (dpy, atoms, destroyed); XMapRaised (dpy, destroyed); /* Wait for the destroyed window's parent to be created * in the toplevel stack as a result of the reparent operation */ Window parentOfDestroyed = WaitForNextCreatedWindow (dpy); WaitForManage (dpy, atoms); /* Create an override redirect window and wait for it to be * managed */ Window override = CreateOverrideRedirectWindow (dpy); WaitForManage (dpy, atoms); /* Place the destroyed window's parent above * p1 in the stack directly */ RestackAbove (dpy, parentOfDestroyed, p1); /* Ask compiz to place the override redirect window * at least above the destroyed window's parent * in the stack. This requires compiz to locate the * destroyed window's parent in the stack */ RestackAtLeastAbove (dpy, atoms, override, parentOfDestroyed); /* Wait for the override window to be configured */ Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, override, ConfigureNotify, -1, -1)); unsigned int n; WindowArray windows (GetChildren (dpy, DefaultRootWindow (dpy), n)); EXPECT_THAT (p2, LessThanInStack (windows, n, override)); EXPECT_THAT (p3, GreaterThanInStack (windows, n, override)); } ./tests/system/xorg-gtest/tests/compiz_xorg_gtest_ewmh.cpp0000644000004100000410000000720313246301623024472 0ustar www-datawww-data/* * Compiz XOrg GTest, EWMH compliance * * Copyright (C) 2013 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; namespace ct = compiz::testing; namespace { unsigned int DEFAULT_VIEWPORT_WIDTH = 1; unsigned int DEFAULT_VIEWPORT_HEIGHT = 1; bool Advance (Display *d, bool r) { return ct::AdvanceToNextEventOnSuccess (d, r); } } class CompizXorgSystemEWMH : public ct::CompizXorgSystemTest { public: virtual void SetUp () { ct::CompizXorgSystemTest::SetUp (); ::Display *dpy = Display (); XSelectInput (dpy, DefaultRootWindow (dpy), PropertyChangeMask); Window wDummy; unsigned int uiDummy; int iDummy; ASSERT_TRUE (XGetGeometry (dpy, DefaultRootWindow (dpy), &wDummy, &iDummy, &iDummy, &screenWidth, &screenHeight, &uiDummy, &uiDummy)); } unsigned int screenWidth; unsigned int screenHeight; private: }; TEST_F (CompizXorgSystemEWMH, InitialViewportGeometry) { ::Display *dpy = Display (); StartCompiz (static_cast ( ct::CompizProcess::ReplaceCurrentWM), ct::CompizProcess::PluginList ()); ct::PropertyNotifyXEventMatcher desktopHintsProperty (dpy, "_NET_DESKTOP_GEOMETRY"); /* Assert that we get the property update */ ASSERT_TRUE (Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, DefaultRootWindow (dpy), PropertyNotify, -1, -1, desktopHintsProperty))); unsigned int expectedDefaultWidth = screenWidth * DEFAULT_VIEWPORT_WIDTH; unsigned int expectedDefaultHeight = screenHeight * DEFAULT_VIEWPORT_HEIGHT; Atom actualType; int actualFmt; unsigned long nItems, bytesAfter; unsigned char *property; ASSERT_EQ (Success, XGetWindowProperty (dpy, DefaultRootWindow (dpy), XInternAtom (dpy, "_NET_DESKTOP_GEOMETRY", False), 0L, 8L, False, XA_CARDINAL, &actualType, &actualFmt, &nItems, &bytesAfter, &property)); ASSERT_EQ (XA_CARDINAL, actualType); ASSERT_EQ (32, actualFmt); ASSERT_EQ (2, nItems); unsigned long *geometry = reinterpret_cast (property); EXPECT_EQ (expectedDefaultWidth, geometry[0]); EXPECT_EQ (expectedDefaultHeight, geometry[1]); if (property) XFree (property); } ./tests/system/xorg-gtest/tests/compiz_xorg_gtest_configure_window.cpp0000644000004100000410000005051513246301623027106 0ustar www-datawww-data/* * Compiz XOrg GTest, ConfigureWindow handling * * Copyright (C) 2012 Sam Spilsbury (smspillaz@gmail.com) * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * Novell, Inc. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * Novell, Inc. makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include using ::testing::MatchResultListener; using ::testing::MakeMatcher; using ::testing::Matcher; using ::testing::_; using ::compiz::testing::HasGeometry; using ::compiz::testing::RelativeWindowGeometry; using ::compiz::testing::AbsoluteWindowGeometry; namespace ct = compiz::testing; namespace { bool Advance (Display *d, bool r) { return ct::AdvanceToNextEventOnSuccess (d, r); } Window GetTopParent (Display *display, Window w) { return ct::GetTopmostNonRootParent (display, w); } bool QueryGeometry (Display *dpy, Window w, int &x, int &y, unsigned int &width, unsigned int &height) { Window rootRet; unsigned int depth, border; if (!XGetGeometry (dpy, w, &rootRet, &x, &y, &width, &height, &depth, &border)) return false; return true; } bool WaitForReparentAndMap (Display *dpy, Window w) { bool ret = Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, ReparentNotify, -1, -1)); EXPECT_TRUE (ret); if (!ret) return false; ret = Advance (dpy, ct::WaitForEventOfTypeOnWindow (dpy, w, MapNotify, -1, -1)); EXPECT_TRUE (ret); if (!ret) return false; return true; } struct ReparentedWindow { Window client; Window frame; }; typedef boost::function CreateWaitFunc; ReparentedWindow GetNewWindowAndFrame (Display *dpy, const CreateWaitFunc &waitForCreation) { ReparentedWindow w; w.client = ct::CreateNormalWindow (dpy); waitForCreation (w.client); XMapRaised (dpy, w.client); WaitForReparentAndMap (dpy, w.client); w.frame = GetTopParent (dpy, w.client); XSelectInput (dpy, w.frame, StructureNotifyMask); return w; } bool WaitForConfigureNotify (Display *dpy, Window w, int x, int y, int width, int height, int border, Window above, unsigned int mask) { ct::ConfigureNotifyXEventMatcher matcher (above, border, x, y, width, height, mask); return Advance (dpy, ct::WaitForEventOfTypeOnWindowMatching (dpy, w, ConfigureNotify, -1, -1, matcher)); } } class CompizXorgSystemConfigureWindowTest : public ct::AutostartCompizXorgSystemTestWithTestHelper { public: CompizXorgSystemConfigureWindowTest () : /* See note in the acceptance tests about this */ env ("XORG_GTEST_CHILD_STDOUT", "1") { } void SendConfigureRequest (Window w, int x, int y, int width, int height, int mask); void SendSetFrameExtentsRequest (Window w, int left, int right, int top, int bottom); void SendConfigureLockRequest (Window w, bool lockRequests); bool VerifyConfigureResponse (Window w, int x, int y, int width, int height); bool VerifySetFrameExtentsResponse (Window w, int left, int right, int top, int bottom); /* Helper functions for the Create*WindowOverrideRedirect* tests */ Window GrabAndCreateWindowWithAttrs (::Display *dpy, XSetWindowAttributes &attr); void UngrabSyncAndTestOverride (::Display *dpy, Window w, bool overrideAssert); protected: ReparentedWindow CreateWindow (::Display *); int GetEventMask () const; private: TmpEnv env; }; int CompizXorgSystemConfigureWindowTest::GetEventMask () const { return ct::AutostartCompizXorgSystemTestWithTestHelper::GetEventMask () | SubstructureNotifyMask; } void CompizXorgSystemConfigureWindowTest::SendConfigureRequest (Window w, int x, int y, int width, int height, int mask) { ::Display *dpy = Display (); std::vector data; data.push_back (x); data.push_back (y); data.push_back (width); data.push_back (height); data.push_back (mask); ct::SendClientMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_CONFIGURE_WINDOW), DefaultRootWindow (dpy), w, data); } void CompizXorgSystemConfigureWindowTest::SendSetFrameExtentsRequest (Window w, int left, int right, int top, int bottom) { ::Display *dpy = Display (); std::vector data; data.push_back (left); data.push_back (right); data.push_back (top); data.push_back (bottom); ct::SendClientMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_CHANGE_FRAME_EXTENTS), DefaultRootWindow (dpy), w, data); } void CompizXorgSystemConfigureWindowTest::SendConfigureLockRequest (Window w, bool lockRequests) { ::Display *dpy = Display (); std::vector data; data.push_back (lockRequests); ct::SendClientMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_LOCK_CONFIGURE_REQUESTS), DefaultRootWindow (dpy), w, data); } bool CompizXorgSystemConfigureWindowTest::VerifyConfigureResponse (Window w, int x, int y, int width, int height) { ::Display *dpy = Display (); XEvent event; while (ct::ReceiveMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_WINDOW_CONFIGURE_PROCESSED), event)) { bool requestAcknowledged = x == event.xclient.data.l[0] && y == event.xclient.data.l[1] && width == event.xclient.data.l[2] && height == event.xclient.data.l[3]; if (requestAcknowledged) return true; } return false; } bool CompizXorgSystemConfigureWindowTest::VerifySetFrameExtentsResponse (Window w, int left, int right, int top, int bottom) { ::Display *dpy = Display (); XEvent event; while (ct::ReceiveMessage (dpy, FetchAtom (ct::messages::TEST_HELPER_FRAME_EXTENTS_CHANGED), event)) { bool requestAcknowledged = left == event.xclient.data.l[0] && right == event.xclient.data.l[1] && top == event.xclient.data.l[2] && bottom == event.xclient.data.l[3]; if (requestAcknowledged) return true; } return false; } ReparentedWindow CompizXorgSystemConfigureWindowTest::CreateWindow (::Display *dpy) { return GetNewWindowAndFrame (dpy, boost::bind (&CompizXorgSystemConfigureWindowTest::WaitForWindowCreation, this, _1)); } TEST_F (CompizXorgSystemConfigureWindowTest, ConfigureAndReponseUnlocked) { ::Display *dpy = Display (); int x = 1; int y = 1; int width = 100; int height = 200; int mask = CWX | CWY | CWWidth | CWHeight; ReparentedWindow w = CreateWindow (dpy); SendConfigureRequest (w.client, x, y, width, height, mask); /* Wait for a response */ ASSERT_TRUE (VerifyConfigureResponse (w.client, x, y, width, height)); /* Query the window size again */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, x, y, width, height, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, FrameExtentsAndReponseUnlocked) { ::Display *dpy = Display (); int left = 1; int right = 2; int top = 3; int bottom = 4; ReparentedWindow w = CreateWindow (dpy); int x, y; unsigned int width, height; ASSERT_TRUE (QueryGeometry (dpy, w.client, x, y, width, height)); SendSetFrameExtentsRequest (w.client, left, right, top, bottom); /* Wait for a response */ ASSERT_TRUE (VerifySetFrameExtentsResponse (w.client, left, right, top, bottom)); /* Client geometry is always unchanged */ ASSERT_THAT (w.client, HasGeometry (dpy, RelativeWindowGeometry, x, y, width, height, _)); /* Frame geometry is frame geometry offset by extents */ x -= left; y -= top; width += left + right; height += top + bottom; ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, x, y, width, height, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, MoveFrameLocked) { ::Display *dpy = Display (); int x = 1; int y = 1; int width = 0; int height = 0; int mask = CWX | CWY; ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); SendConfigureLockRequest (w.client, true); SendConfigureRequest (w.client, x, y, width, height, mask); /* Wait for a response */ ASSERT_TRUE (VerifyConfigureResponse (w.client, x, y, width, height)); /* Query the window size again - it should be the same */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, currentX, currentY, currentWidth, currentHeight, _)); SendConfigureLockRequest (w.client, false); /* Expect buffer to be released */ ASSERT_TRUE (WaitForConfigureNotify (dpy, w.frame, x, y, 0, 0, 0, 0, mask)); } TEST_F (CompizXorgSystemConfigureWindowTest, ResizeFrameLocked) { ::Display *dpy = Display (); int x = 0; int y = 0; int width = 200; int height = 300; int mask = CWWidth | CWHeight; ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); SendConfigureLockRequest (w.client, true); SendConfigureRequest (w.client, x, y, width, height, mask); /* Expect buffer to be released immediately */ ASSERT_TRUE (WaitForConfigureNotify (dpy, w.frame, 0, 0, width, height, 0, 0, mask)); /* Wait for a response */ ASSERT_TRUE (VerifyConfigureResponse (w.client, x, y, width, height)); SendConfigureLockRequest (w.client, false); /* Query the window size again - it should be the same */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, currentX, currentY, width, height, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsLocked) { ::Display *dpy = Display (); /* Give the client window a 1px border, this will cause * the client to move within the frame window by 1, 1 , * the frame window to move by -1, -1 and resize by 2, 2 */ int left = 1; int right = 1; int top = 1; int bottom = 1; int frameMask = CWX | CWY | CWWidth | CWHeight; ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); SendConfigureLockRequest (w.client, true); SendSetFrameExtentsRequest (w.client, left, right, top, bottom); /* Expect buffer to be released immediately */ ASSERT_TRUE (WaitForConfigureNotify (dpy, w.frame, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), 0, 0, frameMask)); /* Wait for a response */ ASSERT_TRUE (VerifySetFrameExtentsResponse (w.client, left, right, top, bottom)); SendConfigureLockRequest (w.client, false); /* Query the window size again - it should be the same */ ASSERT_THAT (w.frame, HasGeometry (dpy, RelativeWindowGeometry, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), _)); } /* Check that changing the frame extents by one on each side * adjusts the wrapper window appropriately */ TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsAdjWrapperWindow) { ::Display *dpy = Display (); ReparentedWindow w = CreateWindow (dpy); int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, w.frame, currentX, currentY, currentWidth, currentHeight)); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; SendSetFrameExtentsRequest (w.client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (w.client, left, right, top, bottom)); /* Wrapper geometry is extents.xy, size.wh */ Window root; Window wrapper = ct::GetImmediateParent (dpy, w.client, root); ASSERT_THAT (wrapper, HasGeometry (dpy, RelativeWindowGeometry, left, top, currentWidth, currentHeight, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsUnmapped) { ::Display *dpy = Display (); Window client = ct::CreateNormalWindow (dpy); WaitForWindowCreation (client); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, client, currentX, currentY, currentWidth, currentHeight)); /* We should get a response with our frame extents but it shouldn't actually * do anything to the client as it is unmapped */ SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); ASSERT_THAT (client, HasGeometry (dpy, RelativeWindowGeometry, currentX, currentY, currentWidth, currentHeight, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsCorrectMapBehaviour) { ::Display *dpy = Display (); Window client = ct::CreateNormalWindow (dpy); WaitForWindowCreation (client); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, client, currentX, currentY, currentWidth, currentHeight)); SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); /* Map the window */ XMapRaised (dpy, client); WaitForReparentAndMap (dpy, client); /* Check the geometry of the frame */ Window frame = GetTopParent (dpy, client); ASSERT_THAT (frame, HasGeometry (dpy, RelativeWindowGeometry, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), _)); /* Wrapper geometry is extents.xy, size.wh */ Window root; Window wrapper = ct::GetImmediateParent (dpy, client, root); ASSERT_THAT (wrapper, HasGeometry (dpy, RelativeWindowGeometry, left, top, currentWidth, currentHeight, _)); } TEST_F (CompizXorgSystemConfigureWindowTest, SetFrameExtentsConsistentBehaviourAfterMap) { ::Display *dpy = Display (); Window client = ct::CreateNormalWindow (dpy); WaitForWindowCreation (client); /* Set frame extents and get a response */ int left = 1; int right = 1; int top = 1; int bottom = 1; int currentX, currentY; unsigned int currentWidth, currentHeight; ASSERT_TRUE (QueryGeometry (dpy, client, currentX, currentY, currentWidth, currentHeight)); SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); /* Map the window */ XMapRaised (dpy, client); WaitForReparentAndMap (dpy, client); /* Send it another frame extents request */ right = right + 1; bottom = bottom + 1; SendSetFrameExtentsRequest (client, left, right, top, bottom); ASSERT_TRUE (VerifySetFrameExtentsResponse (client, left, right, top, bottom)); /* Check the geometry of the frame */ Window frame = GetTopParent (dpy, client); ASSERT_THAT (frame, HasGeometry (dpy, RelativeWindowGeometry, currentX - left, currentY - top, currentWidth + (left + right), currentHeight + (top + bottom), _)); /* Wrapper geometry is extents.xy, size.wh */ Window root; Window wrapper = ct::GetImmediateParent (dpy, client, root); ASSERT_THAT (wrapper, HasGeometry (dpy, RelativeWindowGeometry, left, top, currentWidth, currentHeight, _)); } Window CompizXorgSystemConfigureWindowTest::GrabAndCreateWindowWithAttrs (::Display *dpy, XSetWindowAttributes &attr) { /* NOTE: We need to ungrab the server after this function */ XGrabServer (dpy); /* Create a window with our custom attributes */ return XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, 100, 100, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect, &attr); } void CompizXorgSystemConfigureWindowTest::UngrabSyncAndTestOverride (::Display *dpy, Window w, bool overrideAssert) { XSync (dpy, false); XUngrabServer (dpy); XSync (dpy, false); /* Check if the created window had the attributes passed correctly */ std::vector data = WaitForWindowCreation (w); EXPECT_EQ (overrideAssert, IsOverrideRedirect (data)); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateDestroyWindowOverrideRedirectTrue) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 1; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); XDestroyWindow (dpy, w); UngrabSyncAndTestOverride (dpy, w, true); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateDestroyWindowOverrideRedirectFalse) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 0; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); XDestroyWindow (dpy, w); UngrabSyncAndTestOverride (dpy, w, false); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateChangeWindowOverrideRedirectTrue) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 0; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); attr.override_redirect = 1; XChangeWindowAttributes (dpy, w, CWOverrideRedirect, &attr); UngrabSyncAndTestOverride (dpy, w, true); XDestroyWindow (dpy, w); } TEST_F (CompizXorgSystemConfigureWindowTest, CreateChangeWindowOverrideRedirectFalse) { ::Display *dpy = Display (); XSetWindowAttributes attr; attr.override_redirect = 1; Window w = GrabAndCreateWindowWithAttrs (dpy, attr); attr.override_redirect = 0; XChangeWindowAttributes (dpy, w, CWOverrideRedirect, &attr); UngrabSyncAndTestOverride (dpy, w, false); XDestroyWindow (dpy, w); } ./tests/system/untest/0000755000004100000410000000000013246301624015254 5ustar www-datawww-data./tests/system/untest/CMakeLists.txt0000644000004100000410000000047213246301623020016 0ustar www-datawww-datacmake_minimum_required (VERSION 2.6) include (FindPkgConfig) pkg_check_modules (COMPIZ_UNTEST REQUIRED gtk+-3.0 gl x11) add_executable (untest untest.c) include_directories (${COMPIZ_UNTEST_INCLUDE_DIRS}) link_directories (${COMPIZ_UNTEST_LIBRARY_DIRS}) target_link_libraries (untest ${COMPIZ_UNTEST_LIBRARIES}) ./tests/system/untest/untest.c0000644000004100000410000002422613246301623016747 0ustar www-datawww-data/* * Unredirect Fullscreen Windows Stress Tester * * Copyright (C) 2012 Canonical Ltd. * Author: Daniel van Vugt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #define SECONDS 1000 #define MINUTES 60000 #define FPS 30 #define CYCLE_PERIOD 2 /* seconds */ #define FULLSCREEN_PERIOD (3 * SECONDS) #define DIALOG_PERIOD (7 * SECONDS) #define PADDING 20 #define RED {0, 0xffff, 0x0000, 0x0000} #define YELLOW {0, 0xffff, 0xffff, 0x0000} #define GREEN {0, 0x0000, 0xffff, 0x0000} #define CYAN {0, 0x0000, 0xffff, 0xffff} #define BLUE {0, 0x0000, 0x0000, 0xffff} #define MAGENTA {0, 0xffff, 0x0000, 0xffff} static const char *app_title = "Unredirect Fullscreen Windows Stress Tester"; static const char *copyright = "Copyright (c) 2012 Canonical Ltd."; static gint test_duration = 120; /* seconds */ static guint64 start_time = 0; static GLXWindow glxwin = None; static GtkButton *button; static void blend (guint16 scale, const GdkColor *a, const GdkColor *b, GdkColor *c) { unsigned long src = 0xffff - scale; unsigned long dest = scale; c->pixel = 0; c->red = (guint16)((src * a->red + dest * b->red) / 0xffff); c->green = (guint16)((src * a->green + dest * b->green) / 0xffff); c->blue = (guint16)((src * a->blue + dest * b->blue) / 0xffff); } static gboolean cycle_color (gpointer data) { static const GdkColor color_stop[] = {RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA}; static const int color_stops = sizeof(color_stop)/sizeof(color_stop[0]); static guint16 pos = 0; guint16 scale; GtkWindow *win = GTK_WINDOW (data); int from, to; GdkColor color; pos = (pos + 0xffff / (FPS * CYCLE_PERIOD)) & 0xffff; from = (pos * color_stops) >> 16; to = (from + 1) % color_stops; scale = (pos * color_stops) & 0xffff; blend (scale, color_stop+from, color_stop+to, &color); if (glxwin == None) { gtk_widget_modify_bg (GTK_WIDGET (win), GTK_STATE_NORMAL, &color); } else { glClearColor (color.red / 65535.0f, color.green / 65535.0f, color.blue / 65535.0f, 1.0); glClear (GL_COLOR_BUFFER_BIT); glFinish (); } return TRUE; } static gboolean on_redraw (GtkWidget *widget, void *cr, gpointer data) { GtkProgressBar *b = GTK_PROGRESS_BAR (data); guint64 elapsed = g_get_real_time () - start_time; gtk_progress_bar_set_fraction (b, (float)elapsed / (1000000 * test_duration)); g_print ("\r%d%% ", (int)(elapsed / (10000 * test_duration))); return FALSE; } static gboolean toggle_fullscreen (gpointer data) { static gboolean is_fullscreen = FALSE; GtkWindow *w = GTK_WINDOW (data); is_fullscreen = !is_fullscreen; if (is_fullscreen) gtk_window_fullscreen (w); else gtk_window_unfullscreen (w); return TRUE; } static gboolean toggle_dialog (gpointer data) { static gboolean visible = FALSE; GtkWindow *dialog = GTK_WINDOW (data); visible = !visible; gtk_widget_set_visible (GTK_WIDGET (dialog), visible); return TRUE; } static void close_window (GtkWidget *widget, gpointer user_data) { gtk_main_quit (); g_print ("\rYou're a quitter. No test results for you.\n"); } static gboolean end_test (gpointer data) { gtk_main_quit (); g_print ("\rCongratulations! Nothing crashed.\n"); return FALSE; } static gboolean init_opengl (GtkWindow *win) { gboolean ret = FALSE; static const int attr[] = { GLX_X_RENDERABLE, True, GLX_DOUBLEBUFFER, False, None }; Display *dpy = gdk_x11_get_default_xdisplay (); int screen = gdk_x11_get_default_screen (); int nfb; GLXFBConfig *fb = glXChooseFBConfig (dpy, screen, attr, &nfb); if (fb != NULL && nfb > 0) { GdkWindow *gdkwin = gtk_widget_get_window (GTK_WIDGET (win)); Window xwin = gdk_x11_window_get_xid (gdkwin); glxwin = glXCreateWindow (dpy, fb[0], xwin, NULL); if (glxwin != None) { GLXContext ctx = glXCreateNewContext (dpy, fb[0], GLX_RGBA_TYPE, NULL, True); if (ctx != NULL) { if (glXMakeContextCurrent (dpy, glxwin, glxwin, ctx)) { const char *vendor = (const char*) glGetString (GL_VENDOR); const char *renderer = (const char*) glGetString (GL_RENDERER); const char *version = (const char*) glGetString (GL_VERSION); g_print ("GL Vendor: %s\n" "GL Renderer: %s\n" "GL Version: %s\n" "\n", vendor != NULL ? vendor : "?", renderer != NULL ? renderer : "?", version != NULL ? version : "?"); ret = TRUE; } else { g_warning ("glXMakeContextCurrent failed. " "OpenGL won't be used.\n"); } } } else { g_warning ("glXCreateWindow failed. OpenGL won't be used.\n"); } XFree (fb); } else { g_warning ("glXChooseFBConfig returned nothing. " "OpenGL won't be used.\n"); } return ret; } int main (int argc, char *argv[]) { static gboolean gl_disabled = FALSE; static GOptionEntry custom_options[] = { { "disable-opengl", 'd', 0, G_OPTION_ARG_NONE, &gl_disabled, "Disable OpenGL rendering. Use GTK only.", NULL }, { "test-duration", 't', 0, G_OPTION_ARG_INT, &test_duration, "How long the test lasts (default 120 seconds)", "SECONDS" }, { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL } }; GtkWindow *win; GtkWindow *dialog; GtkLabel *label; GtkBox *vbox; GtkBox *hbox; GtkAlignment *align; GtkProgressBar *bar; g_print ("%s\n" "%s\n" "\n", app_title, copyright); if (!gtk_init_with_args (&argc, &argv, NULL, custom_options, NULL, NULL)) { g_warning ("Invalid options? Try: %s --help\n", argv[0]); return 1; } win = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); gtk_window_set_title (win, app_title); gtk_window_set_default_size (win, 300, 300); gtk_window_set_position (win, GTK_WIN_POS_CENTER); gtk_widget_show (GTK_WIDGET (win)); align = GTK_ALIGNMENT (gtk_alignment_new (0.5f, 1.0f, 0.5f, 0.1f)); gtk_container_add (GTK_CONTAINER (win), GTK_WIDGET (align)); gtk_widget_show (GTK_WIDGET (align)); vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, PADDING)); gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (vbox)); gtk_widget_show (GTK_WIDGET (vbox)); hbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, PADDING)); gtk_box_set_homogeneous (hbox, FALSE); gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (hbox)); gtk_widget_show (GTK_WIDGET (hbox)); bar = GTK_PROGRESS_BAR (gtk_progress_bar_new ()); gtk_progress_bar_set_text (bar, NULL); gtk_progress_bar_set_show_text (bar, TRUE); gtk_container_add (GTK_CONTAINER (hbox), GTK_WIDGET (bar)); gtk_box_set_child_packing (hbox, GTK_WIDGET (bar), TRUE, TRUE, 0, GTK_PACK_START); gtk_widget_show (GTK_WIDGET (bar)); button = GTK_BUTTON (gtk_button_new_with_label ("Cancel")); gtk_container_add (GTK_CONTAINER (hbox), GTK_WIDGET (button)); gtk_box_set_child_packing (hbox, GTK_WIDGET (button), FALSE, FALSE, 0, GTK_PACK_END); gtk_widget_show (GTK_WIDGET (button)); dialog = GTK_WINDOW (gtk_window_new (GTK_WINDOW_POPUP)); gtk_window_set_transient_for (dialog, win); gtk_window_set_default_size (dialog, 100, 100); gtk_window_set_position (dialog, GTK_WIN_POS_CENTER); label = GTK_LABEL (gtk_label_new ("Popup!")); gtk_label_set_justify (label, GTK_JUSTIFY_CENTER); gtk_container_add (GTK_CONTAINER (dialog), GTK_WIDGET (label)); gtk_widget_show (GTK_WIDGET (label)); gtk_widget_realize (GTK_WIDGET (win)); if (!gl_disabled) init_opengl (win); /* XXX For now, hide the widgets in OpenGL mode. People will think the flickering is a bug */ if (glxwin) gtk_widget_hide (GTK_WIDGET (align)); g_timeout_add (1000 / FPS, cycle_color, win); g_timeout_add (FULLSCREEN_PERIOD, toggle_fullscreen, win); g_timeout_add (test_duration * SECONDS, end_test, NULL); g_timeout_add (DIALOG_PERIOD, toggle_dialog, dialog); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (close_window), NULL); g_signal_connect (G_OBJECT (win), "draw", G_CALLBACK (on_redraw), bar); g_signal_connect (G_OBJECT (win), "destroy", G_CALLBACK (close_window), NULL); start_time = g_get_real_time (); gtk_main (); return 0; } ./tests/shared/0000755000004100000410000000000013246301623013653 5ustar www-datawww-data./tests/shared/gtest_shared_characterwrapper.h0000644000004100000410000000243713246301623022123 0ustar www-datawww-data/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_CHARACTERWRAPPER #define _COMPIZ_GTEST_SHARED_CHARACTERWRAPPER #include #include class CharacterWrapper : boost::noncopyable { public: explicit CharacterWrapper (char *c) : mChar (c) { } ~CharacterWrapper () { free (mChar); } operator char * () { return mChar; } operator const char * () const { return mChar; } private: char *mChar; }; #endif ./tests/shared/CMakeLists.txt0000644000004100000410000000012213246301623016406 0ustar www-datawww-dataset (GTEST_SHARED_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory (src) ./tests/shared/src/0000755000004100000410000000000013246301623014442 5ustar www-datawww-data./tests/shared/src/CMakeLists.txt0000644000004100000410000000030713246301623017202 0ustar www-datawww-datainclude_directories (${GTEST_SHARED_INCLUDE_DIR}) add_library (compiz_gtest_shared_async_task STATIC gtest_shared_asynctask.cpp) target_link_libraries (compiz_gtest_shared_async_task) ./tests/shared/src/gtest_shared_asynctask.cpp0000644000004100000410000000622013246301623021702 0ustar www-datawww-data/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include "gtest_shared_asynctask.h" #include "gtest_shared_characterwrapper.h" namespace { void runtimeErrorWithErrno () { CharacterWrapper allocatedError (strerror (errno)); throw std::runtime_error (std::string (allocatedError)); } bool checkForMessageOnFd (int fd, int timeout, char expected) { struct pollfd pfd; pfd.fd = fd; pfd.events = POLLIN; pfd.revents = 0; /* Wait 1ms */ poll (&pfd, 1, timeout); if (pfd.revents == POLLIN) { char msg[1]; size_t sz = read (pfd.fd, reinterpret_cast (msg), 1); if (sz == 1 && msg[0] == expected) return true; } return false; } } class PrivateAsyncTask { public: int testToTaskFd[2]; int taskToTestFd[2]; pthread_t mThread; }; AsyncTask::AsyncTask () : priv (new PrivateAsyncTask) { if (pipe2 (priv->testToTaskFd, O_NONBLOCK | O_CLOEXEC) == -1) runtimeErrorWithErrno (); if (pipe2 (priv->taskToTestFd, O_NONBLOCK | O_CLOEXEC) == -1) runtimeErrorWithErrno (); if (pthread_create (&priv->mThread, NULL, AsyncTask::ThreadEntry, reinterpret_cast (this)) != 0) runtimeErrorWithErrno (); } AsyncTask::~AsyncTask () { void *ret; if (pthread_join (priv->mThread, &ret) != 0) { runtimeErrorWithErrno (); } close (priv->testToTaskFd[0]); close (priv->testToTaskFd[1]); close (priv->taskToTestFd[0]); close (priv->taskToTestFd[0]); } bool AsyncTask::ReadMsgFromTest (char msg, int maximumWait) { return checkForMessageOnFd (priv->testToTaskFd[0], maximumWait, msg); } bool AsyncTask::ReadMsgFromTask (char msg, int maximumWait) { return checkForMessageOnFd (priv->taskToTestFd[0], maximumWait, msg); } void AsyncTask::SendMsgToTest (char msg) { char buf[1] = { msg }; if (write (priv->taskToTestFd[1], reinterpret_cast (buf), 1) == -1) runtimeErrorWithErrno (); } void AsyncTask::SendMsgToTask (char msg) { char buf[1] = { msg }; if (write (priv->testToTaskFd[1], reinterpret_cast (buf), 1) == -1) runtimeErrorWithErrno (); } void * AsyncTask::ThreadEntry (void *data) { AsyncTask *task = reinterpret_cast (data); task->Task (); return NULL; } ./tests/shared/gtest_shared_asynctask.h0000644000004100000410000000264213246301623020564 0ustar www-datawww-data/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_ASYNCTASK_H #define _COMPIZ_GTEST_SHARED_ASYNCTASK_H #include #include class PrivateAsyncTask; class AsyncTask { public: typedef boost::shared_ptr Ptr; AsyncTask (); virtual ~AsyncTask (); void SendMsgToTask (char msg); bool ReadMsgFromTask (char msg, int maximumWait); protected: void SendMsgToTest (char msg); bool ReadMsgFromTest (char msg, int maximumWait); private: static void * ThreadEntry (void *data); virtual void Task () = 0; std::auto_ptr priv; }; #endif ./tests/shared/glib/0000755000004100000410000000000013246301623014570 5ustar www-datawww-data./tests/shared/glib/glib_gsettings_memory_backend_env.h0000644000004100000410000000265613246301623023665 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GLIB_GSETTINGS_MEMORY_BACKEND_TEST_ENV_H #define _COMPIZ_GLIB_GSETTINGS_MEMORY_BACKEND_TEST_ENV_H #include class CompizGLibGSettingsMemoryBackendTestingEnv { public: virtual ~CompizGLibGSettingsMemoryBackendTestingEnv () {} virtual void SetUpEnv (const std::string &MOCK_PATH) { g_setenv ("GSETTINGS_SCHEMA_DIR", MOCK_PATH.c_str (), true); g_setenv ("GSETTINGS_BACKEND", "memory", 1); } virtual void TearDownEnv () { g_unsetenv ("GSETTINGS_BACKEND"); g_unsetenv ("GSETTINGS_SCHEMA_DIR"); } }; #endif ./tests/shared/glib/glib_gslice_off_env.h0000644000004100000410000000231313246301623020705 0ustar www-datawww-data/* * Compiz configuration system library * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GLIB_GSLICE_OFF_ENV_H #define _COMPIZ_GLIB_GSLICE_OFF_ENV_H #include class CompizGLibGSliceOffEnv { public: virtual ~CompizGLibGSliceOffEnv () {} virtual void SetUpEnv () { g_setenv ("G_SLICE", "always-malloc", 1); } virtual void TearDownEnv () { g_unsetenv ("G_SLICE"); } }; #endif ./tests/shared/gtest_shared_autodestroy.h0000644000004100000410000000224013246301623021140 0ustar www-datawww-data/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_AUTODESTROY_H #define _COMPIZ_GTEST_SHARED_AUTODESTROY_H #include #include namespace { template boost::shared_ptr AutoDestroy (T *t, TDel d) { return boost::shared_ptr (t, boost::bind (d, _1)); } } #endif ./tests/shared/gtest_shared_tmpenv.h0000644000004100000410000000260313246301623020072 0ustar www-datawww-data/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_SHARED_TMPENV #define _COMPIZ_GTEST_SHARED_TMPENV #include #include class TmpEnv : boost::noncopyable { public: explicit TmpEnv (const char *env, const char *val) : envRestore (env), envRestoreVal (getenv (env)) { if (!val) unsetenv (env); else setenv (env, val, 1); } ~TmpEnv () { if (envRestoreVal) setenv (envRestore, envRestoreVal, 1); else unsetenv (envRestore); } private: const char *envRestore; const char *envRestoreVal; }; #endif ./tests/shared/gtest_unspecified_bool_type_matcher.h0000644000004100000410000000221713246301623023311 0ustar www-datawww-data/* * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #ifndef _COMPIZ_GTEST_UNSPECIFIED_BOOL_TYPE_MATCHER_H #define _COMPIZ_GTEST_UNSPECIFIED_BOOL_TYPE_MATCHER_H #include #include MATCHER (IsTrue, "Is True") { if (arg) return true; else return false; } MATCHER (IsFalse, "Is False") { if (!arg) return true; else return false; } #endif ./tests/acceptance-tests/0000755000004100000410000000000013246301623015633 5ustar www-datawww-data./tests/acceptance-tests/CMakeLists.txt0000644000004100000410000000007313246301623020373 0ustar www-datawww-dataadd_subdirectory (xorg-gtest) add_subdirectory (autopilot) ./tests/acceptance-tests/autopilot/0000755000004100000410000000000013246301624017654 5ustar www-datawww-data./tests/acceptance-tests/autopilot/CMakeLists.txt0000644000004100000410000000072413246301623022416 0ustar www-datawww-dataadd_executable (compiz_autopilot_acceptance_tests ${CMAKE_CURRENT_SOURCE_DIR}/compiz_autopilot_acceptance_tests.cpp) set (COMPIZ_AUTOPILOT_ACCEPTANCE_TEST_LIBRARIES ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (compiz_autopilot_acceptance_tests ${COMPIZ_AUTOPILOT_ACCEPTANCE_TEST_LIBRARIES}) install (TARGETS compiz_autopilot_acceptance_tests RUNTIME DESTINATION ${exec_prefix}) ./tests/acceptance-tests/autopilot/README0000644000004100000410000000214513246301623020535 0ustar www-datawww-dataCOMPIZ AUTOPILOT ACCEPTANCE TESTS ================================= compiz_autopilot_acceptance_tests is a simple Google Test wrapper around a suite of Unity Autopilot tests which effectively validate window manager functionality by actually interacting with a running instance. Note: These tests are very sensitive. There's a high chance of false-positives unless your session is set up exactly as indicated below: 1. Use a session with a completely default configuration. This might include an Ubuntu guest session, or a new user. 2. Do not have any external monitors plugged in, even in mirror mode. Gdk will detect any plugged in monitors and report them as part of the monitors available - autopilot assumes that the monitors are always in xinerama mode, which may cause tests to fail in very non-obvious ways. 3. Do not have any other windows open at the time the test binary is launched. It is suggested to launch the test binary from another session with the same environment variables present in the guest session. Do not add this binary to the auto-test discovery. ./tests/acceptance-tests/autopilot/compiz_autopilot_acceptance_tests.cpp0000644000004100000410000004003213246301623027347 0ustar www-datawww-data/* * Compiz Autopilot GTest Acceptance Tests * * Copyright (C) 2013 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include using ::testing::ValuesIn; using ::testing::WithParamInterface; namespace { class Pipe : boost::noncopyable { public: Pipe () { if (pipe2 (mPipe, O_CLOEXEC) == -1) throw std::runtime_error (strerror (errno)); } ~Pipe () { if (mPipe[0] && close (mPipe[0]) == -1) std::cerr << "mPipe[0] " << strerror (errno) << std::endl; if (mPipe[1] && close (mPipe[1]) == -1) std::cerr << "mPipe[0] " << strerror (errno) << std::endl; } /* Read end descriptor is read-only */ int ReadEnd () { return mPipe[0]; } /* Write end descriptor is writable, we need to close it * from other objects */ int & WriteEnd () { return mPipe[1]; } private: int mPipe[2]; }; class FileDescriptorBackup : boost::noncopyable { public: FileDescriptorBackup (int fd) : mOriginalFd (fd), mBackupFd (0) { mBackupFd = dup (mOriginalFd); /* Save original */ if (mBackupFd == -1) throw std::runtime_error (strerror (errno)); } ~FileDescriptorBackup () { /* Redirect backed up fd to old fd location */ if (mBackupFd && dup2 (mBackupFd, mOriginalFd) == -1) std::cerr << "Failed to restore file descriptor " << strerror (errno) << std::endl; } private: int mOriginalFd; int mBackupFd; }; class RedirectedFileDescriptor : boost::noncopyable { public: RedirectedFileDescriptor (int from, int &to) : mFromFd (from), mToFd (to) { /* Make 'to' take the old file descriptor's place */ if (dup2 (to, from) == -1) throw std::runtime_error (strerror (errno)); } ~RedirectedFileDescriptor () { if (mToFd && close (mToFd) == -1) std::cerr << "Failed to close redirect-to file descriptor " << strerror (errno) << std::endl; mToFd = 0; } private: int mFromFd; int &mToFd; }; pid_t launchBinary (const std::string &executable, const char **argv, int &stderrWriteEnd, int &stdoutWriteEnd) { FileDescriptorBackup stderr (STDERR_FILENO); FileDescriptorBackup stdout (STDOUT_FILENO); /* Close the originals once they have been backed up * We have to do this here and not in the FileDescriptorBackup * constructors because of an order-of-operations issue - * namely if we close an original file descriptor name * before duplicating another one, then there's a possibility * that the duplicated other one will get the same name as * the one we just closed, making us unable to restore * the closed one properly */ if (close (STDERR_FILENO) == -1) throw std::runtime_error (strerror (errno)); if (close (STDOUT_FILENO) == -1) throw std::runtime_error (strerror (errno)); /* Replace the current process stderr and stdout with the write end * of the pipes. Now when someone tries to write to stderr or stdout * they'll write to our pipes instead */ RedirectedFileDescriptor pipedStderr (STDERR_FILENO, stderrWriteEnd); RedirectedFileDescriptor pipedStdout (STDOUT_FILENO, stdoutWriteEnd); /* Fork process, child gets a copy of the pipe write ends * - the original pipe write ends will be closed on exec * but the duplicated write ends now taking the place of * stderr and stdout will not be */ pid_t child = fork (); /* Child process */ if (child == 0) { if (execvpe (executable.c_str (), const_cast (argv), environ) == -1) { std::cerr << "execvpe failed with error " << errno << std::endl << " - binary " << executable << std::endl; abort (); } } /* Parent process - error */ else if (child == -1) throw std::runtime_error (strerror (errno)); /* The old file descriptors for the stderr and stdout * are put back in place, and pipe write ends closed * as the child is using them at return */ return child; } int launchBinaryAndWaitForReturn (const std::string &executable, const char **argv, int &stderrWriteEnd, int &stdoutWriteEnd) { int status = 0; pid_t child = launchBinary (executable, argv, stderrWriteEnd, stdoutWriteEnd); do { /* Wait around for the child to get a signal */ pid_t waitChild = waitpid (child, &status, 0); if (waitChild == child) { /* If it died unexpectedly, say so */ if (WIFSIGNALED (status)) { std::stringstream ss; ss << "child killed by signal " << WTERMSIG (status); throw std::runtime_error (ss.str ()); } } else { /* waitpid () failed */ throw std::runtime_error (strerror (errno)); } /* Keep going until it exited */ } while (!WIFEXITED (status) && !WIFSIGNALED (status)); /* Return the exit code */ return WEXITSTATUS (status); } const char *autopilot = "/usr/bin/autopilot"; const char *runOpt = "run"; const char *dashV = "-v"; } class CompizAutopilotAcceptanceTest : public ::testing::Test, public ::testing::WithParamInterface { public: CompizAutopilotAcceptanceTest (); const char ** GetAutopilotArgv (); void PrintChildStderr (); void PrintChildStdout (); protected: std::vector autopilotArgv; Pipe childStdoutPipe; Pipe childStderrPipe; }; CompizAutopilotAcceptanceTest::CompizAutopilotAcceptanceTest () { autopilotArgv.push_back (autopilot); autopilotArgv.push_back (runOpt); autopilotArgv.push_back (dashV); autopilotArgv.push_back (GetParam ()); autopilotArgv.push_back (NULL); } const char ** CompizAutopilotAcceptanceTest::GetAutopilotArgv () { return &autopilotArgv[0]; } namespace { std::string FdToString (int fd) { std::string output; int bufferSize = 4096; char buffer[bufferSize]; ssize_t count = 0; do { struct pollfd pfd; pfd.events = POLLIN | POLLERR | POLLHUP; pfd.revents = 0; pfd.fd = fd; /* Check for 10ms if there's anything waiting to be read */ int nfds = poll (&pfd, 1, 10); if (nfds == -1) throw std::runtime_error (strerror (errno)); if (nfds) { /* Read as much as we have allocated for */ count = read (fd, (void *) buffer, bufferSize - 1); /* Something failed, bail */ if (count == -1) throw std::runtime_error (strerror (errno)); /* Always null-terminate */ buffer[count] = '\0'; /* Add it to the output */ output += buffer; } else { /* There's nothing on the pipe, assume EOF */ count = 0; } /* Keep going until there's nothing left */ } while (count != 0); return output; } } void CompizAutopilotAcceptanceTest::PrintChildStderr () { std::string output = FdToString (childStderrPipe.ReadEnd ()); std::cout << "[== TEST ERRORS ==]" << std::endl << output << std::endl; } void CompizAutopilotAcceptanceTest::PrintChildStdout () { std::string output = FdToString (childStdoutPipe.ReadEnd ()); std::cout << "[== TEST MESSAGES ==]" << std::endl << output << std::endl; } TEST_P (CompizAutopilotAcceptanceTest, AutopilotTest) { std::string scopedTraceMsg ("Running Autopilot Test"); scopedTraceMsg += GetParam (); int status = launchBinaryAndWaitForReturn (std::string (autopilot), GetAutopilotArgv (), childStderrPipe.WriteEnd (), childStdoutPipe.WriteEnd ()); EXPECT_EQ (status, 0) << "expected exit status of 0"; if (status) { PrintChildStdout (); PrintChildStderr (); } else { /* Extra space here to align with gtest output */ std::cout << "[AUTOPILOT ] Pass test " << GetParam () << std::endl; } } namespace { const char *AutopilotTests[] = { "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_clicking_icon_twice_initiates_spread", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_expo_launcher_icon_initiates_expo", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_expo_launcher_icon_terminates_expo", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_launcher_activate_last_focused_window", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_unminimize_initially_minimized_windows", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_unminimize_minimized_immediately_after_show_windows", "unity.tests.launcher.test_icon_behavior.LauncherIconsTests.test_while_in_scale_mode_the_dash_will_still_open", "unity.tests.test_dash.DashRevealWithSpreadTests.test_command_lens_opens_when_in_spread", "unity.tests.test_dash.DashRevealWithSpreadTests.test_dash_closes_on_spread", "unity.tests.test_dash.DashRevealWithSpreadTests.test_dash_opens_when_in_spread", "unity.tests.test_dash.DashRevealWithSpreadTests.test_lens_opens_when_in_spread", "unity.tests.test_hud.HudBehaviorTests.test_alt_arrow_keys_not_eaten", "unity.tests.test_panel.PanelCrossMonitorsTests.test_panel_title_updates_moving_window", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_close_inactive_when_clicked_in_another_monitor", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_dont_show_for_maximized_window_on_mouse_in", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_dont_show_in_other_monitors_when_dash_is_open", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_dont_show_in_other_monitors_when_hud_is_open", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_minimize_inactive_when_clicked_in_another_monitor", "unity.tests.test_panel.PanelCrossMonitorsTests.test_window_buttons_unmaximize_inactive_when_clicked_in_another_monitor", "unity.tests.test_panel.PanelGrabAreaTests.test_focus_the_maximized_window_works", "unity.tests.test_panel.PanelGrabAreaTests.test_lower_the_maximized_window_works", "unity.tests.test_panel.PanelGrabAreaTests.test_panels_dont_steal_keynav_foucs_from_hud", "unity.tests.test_panel.PanelGrabAreaTests.test_unmaximize_from_grab_area_works", "unity.tests.test_panel.PanelHoverTests.test_menus_show_for_maximized_window_on_mouse_in_btn_area", "unity.tests.test_panel.PanelHoverTests.test_menus_show_for_maximized_window_on_mouse_in_grab_area", "unity.tests.test_panel.PanelHoverTests.test_menus_show_for_maximized_window_on_mouse_in_menu_area", "unity.tests.test_panel.PanelHoverTests.test_only_menus_show_for_restored_window_on_mouse_in_grab_area", "unity.tests.test_panel.PanelHoverTests.test_only_menus_show_for_restored_window_on_mouse_in_menu_area", "unity.tests.test_panel.PanelHoverTests.test_only_menus_show_for_restored_window_on_mouse_in_window_btn_area", "unity.tests.test_panel.PanelMenuTests.test_menus_dont_show_for_maximized_window_on_mouse_out", "unity.tests.test_panel.PanelMenuTests.test_menus_dont_show_for_restored_window_on_mouse_out", "unity.tests.test_panel.PanelMenuTests.test_menus_dont_show_if_a_new_application_window_is_opened", "unity.tests.test_panel.PanelMenuTests.test_menus_show_for_maximized_window_on_mouse_in", "unity.tests.test_panel.PanelMenuTests.test_menus_show_for_restored_window_on_mouse_in", "unity.tests.test_panel.PanelMenuTests.test_menus_shows_when_new_application_is_opened", "unity.tests.test_panel.PanelTitleTests.test_panel_shows_app_title_with_maximised_app", "unity.tests.test_panel.PanelTitleTests.test_panel_title_doesnt_change_with_switcher", "unity.tests.test_panel.PanelTitleTests.test_panel_title_on_empty_desktop", "unity.tests.test_panel.PanelTitleTests.test_panel_title_updates_on_maximized_window_title_changes", "unity.tests.test_panel.PanelTitleTests.test_panel_title_updates_when_switching_to_maximized_app", "unity.tests.test_panel.PanelTitleTests.test_panel_title_with_maximized_application", "unity.tests.test_panel.PanelTitleTests.test_panel_title_with_maximized_window_restored_child", "unity.tests.test_panel.PanelTitleTests.test_panel_title_with_restored_application", "unity.tests.test_panel.PanelWindowButtonsTests.test_double_click_unmaximize_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_minimize_button_disabled_for_non_minimizable_windows", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_for_maximized_window_on_mouse_out", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_for_restored_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_for_restored_window_with_mouse_in_panel", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_dont_show_on_empty_desktop", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_minimize_button_works_for_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_show_for_maximized_window_on_mouse_in", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_unmaximize_button_works_for_window", "unity.tests.test_panel.PanelWindowButtonsTests.test_window_buttons_unmaximize_follows_fitts_law", "unity.tests.test_showdesktop.ShowDesktopTests.test_showdesktop_hides_apps", "unity.tests.test_showdesktop.ShowDesktopTests.test_showdesktop_switcher", "unity.tests.test_showdesktop.ShowDesktopTests.test_showdesktop_unhides_apps", "unity.tests.test_showdesktop.ShowDesktopTests.test_unhide_single_app", "unity.tests.test_spread.SpreadTests.test_scale_application_windows", "unity.tests.test_spread.SpreadTests.test_scaled_window_closes_on_close_button_click", "unity.tests.test_spread.SpreadTests.test_scaled_window_closes_on_middle_click", "unity.tests.test_spread.SpreadTests.test_scaled_window_is_focused_on_click", "unity.tests.test_switcher.SwitcherDetailsModeTests.test_detail_mode_selects_last_active_window", "unity.tests.test_switcher.SwitcherDetailsModeTests.test_detail_mode_selects_third_window", "unity.tests.test_switcher.SwitcherDetailsTests.test_no_details_for_apps_on_different_workspace", "unity.tests.test_switcher.SwitcherTests.test_application_window_is_fake_decorated", "unity.tests.test_switcher.SwitcherTests.test_application_window_is_fake_decorated_in_detail_mode", "unity.tests.test_switcher.SwitcherWindowsManagementTests.test_switcher_raises_only_last_focused_window", "unity.tests.test_switcher.SwitcherWindowsManagementTests.test_switcher_rises_next_window_of_same_application", "unity.tests.test_switcher.SwitcherWindowsManagementTests.test_switcher_rises_other_application", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_all_mode_shows_all_apps", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_can_switch_to_minimised_window", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_is_disabled_when_wall_plugin_active", "unity.tests.test_switcher.SwitcherWorkspaceTests.test_switcher_shows_current_workspace_only" }; } INSTANTIATE_TEST_CASE_P (UnityIntegrationAutopilotTests, CompizAutopilotAcceptanceTest, ValuesIn (AutopilotTests)); ./tests/acceptance-tests/xorg-gtest/0000755000004100000410000000000013246301623017736 5ustar www-datawww-data./tests/acceptance-tests/xorg-gtest/CMakeLists.txt0000644000004100000410000000047713246301623022506 0ustar www-datawww-dataif (BUILD_XORG_GTEST) include_directories (${compiz_SOURCE_DIR}/tests/shared ${COMPIZ_XORG_SYSTEM_TEST_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ${XORG_SERVER_INCLUDE_XORG_GTEST} ${XORG_SERVER_GTEST_SRC} ${GTEST_INCLUDE_DIRS}) add_subdirectory (tests) endif (BUILD_XORG_GTEST) ./tests/acceptance-tests/xorg-gtest/tests/0000755000004100000410000000000013246301624021101 5ustar www-datawww-data./tests/acceptance-tests/xorg-gtest/tests/CMakeLists.txt0000644000004100000410000000133513246301623023642 0ustar www-datawww-datalink_directories (${X11_XI_LIBRARY_DIRS} ${compiz_BINARY_DIR}/tests/shared/src) add_executable (compiz_acceptance_test_xorg_replace_current_wm ${CMAKE_CURRENT_SOURCE_DIR}/compiz_acceptance_replace_current_wm.cpp) set (COMPIZ_XORG_ACCEPTANCE_TEST_LIBRARIES compiz_xorg_gtest_system_test xorg_gtest_all compiz_xorg_gtest_main ${GTEST_BOTH_LIBRARIES} ${XORG_SERVER_LIBRARIES} ${X11_XI_LIBRARIES}) target_link_libraries (compiz_acceptance_test_xorg_replace_current_wm ${COMPIZ_XORG_ACCEPTANCE_TEST_LIBRARIES} compiz_gtest_shared_async_task) # Not autodiscovering tests here, these tests are # inherently flakey. See README ./tests/acceptance-tests/xorg-gtest/tests/README0000644000004100000410000000027313246301623021762 0ustar www-datawww-dataThese tests are acceptance tests and may take a while to run. As such please do not add them to the compiz_discover_tests list. Use them to check that startup and shutdown work correctly ./tests/acceptance-tests/xorg-gtest/tests/compiz_acceptance_replace_current_wm.cpp0000644000004100000410000001631413246301623031220 0ustar www-datawww-data/* * Compiz XOrg GTest Acceptance Tests * * Copyright (C) 2012 Canonical Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ct = compiz::testing; class XorgAcceptance : public xorg::testing::Test { public: typedef boost::shared_ptr ProcessPtr; }; namespace { char TEST_FAILED_MSG = 's'; char PROCESS_EXITED_MSG = 'd'; } class WaitForSuccessDeathTask : public AsyncTask { public: typedef boost::function GetProcessState; WaitForSuccessDeathTask (const GetProcessState &procState) : mProcessState (procState) { } private: GetProcessState mProcessState; void Task (); }; void WaitForSuccessDeathTask::Task () { do { if (ReadMsgFromTest (TEST_FAILED_MSG, 1)) return; } while (mProcessState () != xorg::testing::Process::FINISHED_SUCCESS); /* The process died, send a message back saying that it did */ SendMsgToTest (PROCESS_EXITED_MSG); } TEST_F (XorgAcceptance, SIGINTClosesDown) { /* XXX: This is a bit stupid, but we have to do it. * It seems as though closing the child stdout or * stderr will cause the client to hang indefinitely * when the child calls XSync (and that can happen * implicitly, eg XCloseDisplay) */ TmpEnv env ("XORG_GTEST_CHILD_STDOUT", "1"); ProcessPtr compiz (boost::make_shared (Display (), ct::CompizProcess::WaitForStartupMessage, ct::CompizProcess::PluginList ())); pid_t firstProcessPid = compiz->Pid (); WaitForSuccessDeathTask::GetProcessState procState (boost::bind (&ct::CompizProcess::State, compiz.get ())); AsyncTask::Ptr task (boost::make_shared (procState)); kill (firstProcessPid, SIGINT); const unsigned int maximumWaitTime = 10 * 1000; // Ten seconds if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FAILED_MSG); throw std::runtime_error ("compiz process did not exit with success status"); } } TEST_F (XorgAcceptance, ReplaceOtherWMFast) { /* XXX: This is a bit stupid, but we have to do it. * It seems as though closing the child stdout or * stderr will cause the client to hang indefinitely * when the child calls XSync (and that can happen * implicitly, eg XCloseDisplay) */ TmpEnv env ("XORG_GTEST_CHILD_STDOUT", "1"); ProcessPtr firstCompiz (boost::make_shared (Display (), ct::CompizProcess::WaitForStartupMessage, ct::CompizProcess::PluginList ())); /* Expect it to exit */ WaitForSuccessDeathTask::GetProcessState procState (boost::bind (&ct::CompizProcess::State, firstCompiz.get ())); AsyncTask::Ptr task (boost::make_shared (procState)); const unsigned int maximumWaitTime = 10 * 1000; // Ten seconds ProcessPtr secondCompiz (boost::make_shared (Display (), static_cast ( ct::CompizProcess::WaitForStartupMessage | ct::CompizProcess::ReplaceCurrentWM), ct::CompizProcess::PluginList (), maximumWaitTime)); if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FAILED_MSG); throw std::runtime_error ("compiz process did not exit with success status"); } } namespace { char TEST_FINISHED_MSG = 's'; } class SlowDownTask : public AsyncTask { public: typedef boost::function GetProcessState; typedef boost::function GetPid; SlowDownTask (const GetProcessState &procState, const GetPid &pid) : mProcessState (procState), mPid (pid), mIsRunning (true) { } virtual ~SlowDownTask () {} private: GetProcessState mProcessState; GetPid mPid; bool mIsRunning; void Task (); }; void SlowDownTask::Task () { do { if (ReadMsgFromTest (TEST_FINISHED_MSG, mIsRunning ? 1 : 400)) return; pid_t pid = mPid (); if (pid) { if (mIsRunning) { kill (pid, SIGSTOP); mIsRunning = false; } else { kill (pid, SIGCONT); mIsRunning = true; } } } while (mProcessState () != xorg::testing::Process::FINISHED_SUCCESS); /* The process died, send a message back saying that it did */ SendMsgToTest (PROCESS_EXITED_MSG); } TEST_F (XorgAcceptance, ReplaceOtherWMSlow) { ::Display *dpy = Display (); /* XXX: This is a bit stupid, but we have to do it. * It seems as though closing the child stdout or * stderr will cause the client to hang indefinitely * when the child calls XSync (and that can happen * implicitly, eg XCloseDisplay) */ TmpEnv env ("XORG_GTEST_CHILD_STDOUT", "1"); ProcessPtr firstCompiz (boost::make_shared (dpy, ct::CompizProcess::WaitForStartupMessage, ct::CompizProcess::PluginList (), 3000)); SlowDownTask::GetProcessState procState (boost::bind (&ct::CompizProcess::State, firstCompiz.get ())); SlowDownTask::GetPid getPid (boost::bind (&ct::CompizProcess::Pid, firstCompiz.get ())); /* Slow down the first compiz */ AsyncTask::Ptr task (boost::make_shared (procState, getPid)); /* Select for StructureNotifyMask */ XSelectInput (dpy, DefaultRootWindow (dpy), StructureNotifyMask); const unsigned int maximumWaitTime = 20 * 1000; // Twenty seconds ProcessPtr secondCompiz (boost::make_shared (Display (), static_cast ( ct::CompizProcess::ReplaceCurrentWM | ct::CompizProcess::WaitForStartupMessage), ct::CompizProcess::PluginList (), maximumWaitTime)); /* Wait until the first one goes away */ if (!task->ReadMsgFromTask (PROCESS_EXITED_MSG, maximumWaitTime)) { task->SendMsgToTask (TEST_FINISHED_MSG); throw std::runtime_error ("compiz process did not exit with success status"); } } ./tests/integration/0000755000004100000410000000000013246301623014730 5ustar www-datawww-data./tests/integration/CMakeLists.txt0000644000004100000410000000005713246301623017472 0ustar www-datawww-dataadd_subdirectory (xig) add_subdirectory (glib) ./tests/integration/xig/0000755000004100000410000000000013246301623015517 5ustar www-datawww-data./tests/integration/xig/CMakeLists.txt0000644000004100000410000000175713246301623020271 0ustar www-datawww-datainclude (CompizCommon) include (FindPkgConfig) pkg_check_modules (COMPIZ_XIG_TEST xig-0 glib-2.0 gobject-2.0) if (COMPIZ_XIG_TEST_FOUND) compiz_set (COMPIZ_XIG_TEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) compiz_set (COMPIZ_XIG_TEST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory (src) add_test (compiz-xig-test-startup ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner startup) add_test (compiz-xig-test-restart ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner restart) add_test (compiz-xig-test-xserver-quit ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner xserver-quit) add_test (compiz-xig-test-new-window ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner new-window) add_test (compiz-xig-test-existing-window ${CMAKE_CURRENT_BINARY_DIR}/src/compiz-xig-test-runner existing-window) else (COMPIZ_XIG_TEST_FOUND) message (WARNING "Xig not found, you will not be able to run X Server integration tests") endif (COMPIZ_XIG_TEST_FOUND) ./tests/integration/xig/scripts/0000755000004100000410000000000013246301624017207 5ustar www-datawww-data./tests/integration/xig/scripts/startup.conf0000644000004100000410000000034513246301623021561 0ustar www-datawww-data# # Check Compiz starts # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Cleanup #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) ./tests/integration/xig/scripts/xserver-quit.conf0000644000004100000410000000030413246301623022530 0ustar www-datawww-data# # Check Compiz quits with an error when the X server quits # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Cleanup #?*STOP-XSERVER #?COMPIZ EXIT STATUS=1 ./tests/integration/xig/scripts/restart.conf0000644000004100000410000000052513246301623021543 0ustar www-datawww-data# # Check Compiz restarts # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Restart #?*RESTART-COMPIZ #?(X CLIENT-DISCONNECTED|X CLIENT-CONNECTED) #?(X CLIENT-DISCONNECTED|X CLIENT-CONNECTED|) #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) ./tests/integration/xig/scripts/existing-window.conf0000644000004100000410000000075313246301623023221 0ustar www-datawww-data# # Check Compiz correctly places a window # # Place a window #?*CREATE-WINDOW ID=123 X=0 Y=0 WIDTH=100 HEIGHT=100 #?*MAP-WINDOW ID=123 # X server maps us (no window manager) #?MAP-NOTIFY ID=123 # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Compiz reparents us #?UNMAP-NOTIFY ID=123 #?REPARENT-NOTIFY ID=123 #?MAP-NOTIFY ID=123 # Cleanup #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) ./tests/integration/xig/scripts/new-window.conf0000644000004100000410000000102113246301623022145 0ustar www-datawww-data# # Check Compiz correctly places a window # # Start Compiz #?COMPIZ START # Compiz connects to X server #?X CLIENT-CONNECTED # Place a window #?*CREATE-WINDOW ID=123 X=0 Y=0 WIDTH=100 HEIGHT=100 #?*MAP-WINDOW ID=123 # FIXME: Compiz is reparentining after the map #?MAP-NOTIFY ID=123 #?UNMAP-NOTIFY ID=123 # Compiz reparents us #?REPARENT-NOTIFY ID=123 # Window is mapped by Compiz #?MAP-NOTIFY ID=123 # Cleanup #?*STOP-COMPIZ #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) #?(X CLIENT-DISCONNECTED|COMPIZ EXIT STATUS=0) ./tests/integration/xig/src/0000755000004100000410000000000013246301624016307 5ustar www-datawww-data./tests/integration/xig/src/CMakeLists.txt0000644000004100000410000000057413246301623021054 0ustar www-datawww-datainclude_directories (${COMPIZ_XIG_TEST_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}) link_directories (${COMPIZ_XIG_TEST_LIBRARY_DIRS}) configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) add_executable (compiz-xig-test-runner test-runner.c) target_link_libraries (compiz-xig-test-runner ${COMPIZ_XIG_TEST_LIBRARIES}) ./tests/integration/xig/src/config.h.in0000644000004100000410000000026413246301623020333 0ustar www-datawww-data#define COMPIZ_XIG_TEST_SOURCE_DIR "@COMPIZ_XIG_TEST_SOURCE_DIR@" #define COMPIZ_XIG_TEST_BINARY_DIR "@COMPIZ_XIG_TEST_BINARY_DIR@" #define compiz_BINARY_DIR "@compiz_BINARY_DIR@" ./tests/integration/xig/src/test-runner.c0000644000004100000410000003760213246301623020750 0ustar www-datawww-data#include #include #include #include #include #include #include #include #include #include #include #include #include #include /* For some reason sys/un.h doesn't define this */ #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 108 #endif /* Timeout in ms waiting for the status we expect */ #define STATUS_TIMEOUT 2000 /* Timeout in ms to wait for SIGTERM to kill compiz */ #define KILL_TIMEOUT 2000 static XigServer *xserver; static GKeyFile *config; static GPid compiz_pid = 0; static GList *statuses = NULL; static GList *script = NULL; static GList *script_iter = NULL; static guint status_timeout = 0; static gboolean failed = FALSE; static guint compiz_kill_timeout = 0; static void check_status (const gchar *status); static gboolean compiz_kill_timeout_cb (gpointer data) { if (getenv ("DEBUG")) g_print ("Sending SIGKILL to compiz\n"); kill (compiz_pid, SIGKILL); compiz_kill_timeout = 0; return FALSE; } static void stop_compiz () { if (compiz_pid && compiz_kill_timeout == 0) { if (getenv ("DEBUG")) g_print ("Sending SIGTERM to compiz process %d\n", compiz_pid); kill (compiz_pid, SIGINT); compiz_kill_timeout = g_timeout_add (KILL_TIMEOUT, compiz_kill_timeout_cb, NULL); } } static void restart_compiz () { if (compiz_pid) { if (getenv ("DEBUG")) g_print ("Sending SIGHUP to compiz process %d\n", compiz_pid); kill (compiz_pid, SIGHUP); } } static void quit (int status) { if (xserver) xig_server_stop (xserver); if (compiz_pid) kill (compiz_pid, SIGKILL); exit (status); } static void fail (const gchar *event, const gchar *expected) { GList *link; if (failed) return; failed = TRUE; g_printerr ("Test failed, got the following events:\n"); for (link = statuses; link; link = link->next) g_printerr (" %s\n", (gchar *)link->data); if (event) g_printerr (" %s\n", event); if (expected) g_printerr (" ^^^ expected \"%s\"\n", expected); else g_printerr ("^^^ expected nothing\n"); /* Either wait for the compiz to quit, or stop now if it already is */ if (compiz_pid) stop_compiz (); else quit (EXIT_FAILURE); } static gchar * get_script_line () { if (!script_iter) return NULL; return script_iter->data; } static void compiz_exit_cb (GPid pid, gint status, gpointer data) { gchar *status_text; compiz_pid = 0; if (compiz_kill_timeout) g_source_remove (compiz_kill_timeout); compiz_kill_timeout = 0; /* Quit when compiz does */ if (failed) quit (EXIT_FAILURE); if (WIFEXITED (status)) status_text = g_strdup_printf ("COMPIZ EXIT STATUS=%d", WEXITSTATUS (status)); else status_text = g_strdup_printf ("COMPIZ TERMINATE SIGNAL=%d", WTERMSIG (status)); check_status (status_text); g_free (status_text); } static void unmap_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("UNMAP-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void map_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("MAP-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void reparent_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("REPARENT-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void configure_notify_cb (XigWindow *window) { gchar *status_text; status_text = g_strdup_printf ("CONFIGURE-NOTIFY ID=%d", xig_window_get_id (window)); check_status (status_text); g_free (status_text); } static void run_commands () { /* Stop compiz if requested */ while (TRUE) { gchar *command, *name = NULL, *c; GHashTable *params; command = get_script_line (); if (!command) break; /* Commands start with an asterisk */ if (command[0] != '*') break; statuses = g_list_append (statuses, g_strdup (command)); script_iter = script_iter->next; c = command + 1; while (*c && !isspace (*c)) c++; name = g_strdup_printf ("%.*s", (int) (c - command - 1), command + 1); params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); while (TRUE) { gchar *start, *param_name, *param_value; while (isspace (*c)) c++; start = c; while (*c && !isspace (*c) && *c != '=') c++; if (*c == '\0') break; param_name = g_strdup_printf ("%.*s", (int) (c - start), start); if (*c == '=') { c++; while (isspace (*c)) c++; if (*c == '\"') { gboolean escaped = FALSE; GString *value; c++; value = g_string_new (""); while (*c) { if (*c == '\\') { if (escaped) { g_string_append_c (value, '\\'); escaped = FALSE; } else escaped = TRUE; } else if (!escaped && *c == '\"') break; if (!escaped) g_string_append_c (value, *c); c++; } param_value = value->str; g_string_free (value, FALSE); if (*c == '\"') c++; } else { start = c; while (*c && !isspace (*c)) c++; param_value = g_strdup_printf ("%.*s", (int) (c - start), start); } } else param_value = g_strdup (""); g_hash_table_insert (params, param_name, param_value); } if (strcmp (name, "STOP-XSERVER") == 0) xig_server_stop (xserver); else if (strcmp (name, "STOP-COMPIZ") == 0) stop_compiz (); else if (strcmp (name, "RESTART-COMPIZ") == 0) restart_compiz (); else if (strcmp (name, "CREATE-WINDOW") == 0) { XigWindow *root, *window; gchar *v; guint32 id = 0; gint16 x = 0, y = 0; guint16 width = 0, height = 0, border_width = 0; v = g_hash_table_lookup (params, "ID"); if (v) id = atoi (v); v = g_hash_table_lookup (params, "X"); if (v) x = atoi (v); v = g_hash_table_lookup (params, "Y"); if (v) y = atoi (v); v = g_hash_table_lookup (params, "WIDTH"); if (v) width = atoi (v); v = g_hash_table_lookup (params, "HEIGHT"); if (v) height = atoi (v); v = g_hash_table_lookup (params, "BORDER-WIDTH"); if (v) border_width = atoi (v); root = xig_server_get_root (xserver, 0); window = xig_window_add_child (root, NULL, id, XIG_WINDOW_CLASS_InputOutput, x, y, width, height, border_width, xig_window_get_visual (root), 0, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, FALSE, FALSE); g_signal_connect (window, "unmap-notify", G_CALLBACK (unmap_notify_cb), NULL); g_signal_connect (window, "map-notify", G_CALLBACK (map_notify_cb), NULL); g_signal_connect (window, "reparent-notify", G_CALLBACK (reparent_notify_cb), NULL); g_signal_connect (window, "configure-notify", G_CALLBACK (configure_notify_cb), NULL); } else if (strcmp (name, "MAP-WINDOW") == 0) { gchar *v; guint32 id = 0; XigWindow *window; v = g_hash_table_lookup (params, "ID"); if (v) id = atoi (v); window = xig_server_get_window (xserver, id); xig_window_map (window, NULL); } else { g_printerr ("Unknown command '%s'\n", name); quit (EXIT_FAILURE); return; } g_free (name); g_hash_table_unref (params); } gchar *l = get_script_line (); /* Stop at the end of the script */ if (l == NULL) { if (compiz_pid) stop_compiz (); else quit (EXIT_SUCCESS); } } static gboolean status_timeout_cb (gpointer data) { fail ("(timeout)", get_script_line ()); status_timeout = 0; return FALSE; } static void check_status (const gchar *status) { gchar *pattern; if (getenv ("DEBUG")) g_print ("%s\n", status); if (failed) return; statuses = g_list_append (statuses, g_strdup (status)); /* Try and match against expected */ pattern = get_script_line (); if (!pattern || !g_regex_match_simple (pattern, status, 0, 0)) { fail (NULL, pattern); return; } script_iter = script_iter->next; /* Restart timeout */ if (status_timeout) g_source_remove (status_timeout); status_timeout = g_timeout_add (STATUS_TIMEOUT, status_timeout_cb, NULL); run_commands (); } static void signal_cb (int signum) { if (compiz_pid != 0) { if (compiz_pid) { g_print ("Caught signal %d, killing Compiz\n", signum); kill (compiz_pid, SIGKILL); } else g_print ("Caught signal %d, quitting\n", signum); } else { g_print ("Caught signal %d, quitting\n", signum); quit (EXIT_FAILURE); } } static void load_script (const gchar *filename) { int i; gchar *data, **lines; if (!g_file_get_contents (filename, &data, NULL, NULL)) { g_printerr ("Unable to load script: %s\n", filename); quit (EXIT_FAILURE); } lines = g_strsplit (data, "\n", -1); g_free (data); /* Load lines with #? prefix as expected behaviour */ for (i = 0; lines[i]; i++) { gchar *line = g_strstrip (lines[i]); if (g_str_has_prefix (line, "#?")) script = g_list_append (script, g_strdup (line+2)); } script_iter = script; g_strfreev (lines); } static void client_connected_cb (XigServer *server, XigRemoteClient *client) { check_status ("X CLIENT-CONNECTED"); } static void client_disconnected_cb (XigServer *server, XigRemoteClient *client) { check_status ("X CLIENT-DISCONNECTED"); } static gboolean client_stdout_cb (GIOChannel *source, GIOCondition condition, gpointer data) { gchar *str_return; gsize length; gsize terminator_pos; GError *error; if (condition & G_IO_IN) { while (g_io_channel_read_line (source, &str_return, &length, &terminator_pos, &error) == G_IO_STATUS_NORMAL) { if (getenv ("DEBUG")) g_print ("%s", str_return); } } return TRUE; } int main (int argc, char **argv) { GMainLoop *loop; XigScreen *screen; XigVisual *visual; gchar *script_name, *config_file, *config_path; GString *command_line; gchar **compiz_env, **compiz_argv; gint compiz_stdin, compiz_stdout, compiz_stderr; GIOChannel *compiz_stdout_channel = NULL; GError *error = NULL; signal (SIGINT, signal_cb); signal (SIGTERM, signal_cb); g_type_init (); loop = g_main_loop_new (NULL, FALSE); if (argc != 2) { g_printerr ("Usage %s SCRIPT-NAME\n", argv[0]); quit (EXIT_FAILURE); } script_name = argv[1]; config_file = g_strdup_printf ("%s.conf", script_name); config_path = g_build_filename (COMPIZ_XIG_TEST_SOURCE_DIR "/scripts", config_file, NULL); g_free (config_file); config = g_key_file_new (); g_key_file_load_from_file (config, config_path, G_KEY_FILE_NONE, NULL); load_script (config_path); /* Disable config if requested */ if (g_key_file_has_key (config, "test-runner-config", "have-config", NULL) && !g_key_file_get_boolean (config, "test-runner-config", "have-config", NULL)) config_path = NULL; g_print ("----------------------------------------\n"); g_print ("Running script %s\n", script_name); /* Create an X server to test with */ xserver = xig_server_new ("compiz-test", 99); xig_server_set_listen_tcp (xserver, FALSE); g_signal_connect (xserver, "client-connected", G_CALLBACK (client_connected_cb), NULL); g_signal_connect (xserver, "client-disconnected", G_CALLBACK (client_disconnected_cb), NULL); xig_server_add_pixmap_format (xserver, 1, 1, 32); xig_server_add_pixmap_format (xserver, 4, 8, 32); xig_server_add_pixmap_format (xserver, 8, 8, 32); xig_server_add_pixmap_format (xserver, 15, 16, 32); xig_server_add_pixmap_format (xserver, 16, 16, 32); xig_server_add_pixmap_format (xserver, 24, 32, 32); xig_server_add_pixmap_format (xserver, 32, 32, 32); screen = xig_server_add_screen (xserver, 0x00FFFFFF, 0x00000000, 1024, 768, 1024, 768); visual = xig_screen_add_visual (screen, 24, XIG_VISUAL_CLASS_TrueColor, 8, 1, 0x00FF0000, 0x0000FF00, 0x000000FF); xig_screen_add_root (screen, visual); run_commands (); status_timeout = g_timeout_add (STATUS_TIMEOUT, status_timeout_cb, NULL); if (!xig_server_start (xserver, &error)) { g_printerr ("Failed to start Xig X server: %s", error->message); quit (EXIT_FAILURE); } compiz_env = g_strsplit ("DISPLAY=:99", " ", -1); command_line = g_string_new (compiz_BINARY_DIR "/src/compiz"); g_print ("Start Compiz with command: %s\n", command_line->str); if (!g_shell_parse_argv (command_line->str, NULL, &compiz_argv, &error)) { g_warning ("Error parsing command line: %s", error->message); quit (EXIT_FAILURE); } g_clear_error (&error); if (!g_spawn_async_with_pipes (NULL, /* working directory */ compiz_argv, compiz_env, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, /* child setup */ &compiz_pid, &compiz_stdin, &compiz_stdout, &compiz_stderr, &error)) { g_warning ("Error launching Compiz: %s", error->message); quit (EXIT_FAILURE); } g_clear_error (&error); g_child_watch_add (compiz_pid, compiz_exit_cb, NULL); if (getenv ("DEBUG")) g_print ("Compiz running with PID %d\n", compiz_pid); compiz_stdout_channel = g_io_channel_unix_new (compiz_stdout); g_io_channel_set_flags (compiz_stdout_channel, G_IO_FLAG_NONBLOCK, NULL); g_io_add_watch (compiz_stdout_channel, G_IO_IN, client_stdout_cb, NULL); check_status ("COMPIZ START"); g_main_loop_run (loop); g_object_unref (compiz_stdout_channel); return EXIT_FAILURE; } ./tests/integration/glib/0000755000004100000410000000000013246301623015645 5ustar www-datawww-data./tests/integration/glib/CMakeLists.txt0000644000004100000410000000174213246301623020411 0ustar www-datawww-datainclude (FindPkgConfig) pkg_check_modules (COMPIZ_GLIB_INTEGRATION_TEST glibmm-2.4) if (COMPIZ_GLIB_INTEGRATION_TEST_FOUND) include_directories (${compiz_SOURCE_DIR}/src/) include_directories (${compiz_SOURCE_DIR}/src/timer/include) include_directories (${compiz_SOURCE_DIR}/src/timer/src) include_directories (${compiz_SOURCE_DIR}/include) include_directories (${COMPIZ_GLIB_INTEGRATION_TEST_INCLUDE_DIRS}) link_directories (${compiz_BINARY_DIR}/src) link_directories (${COMPIZ_GLIB_INTEGRATION_TEST_LIBRARY_DIRS}) add_executable (compiz_glib_integration_test ${CMAKE_CURRENT_SOURCE_DIR}/glib_integration_test.cpp) target_link_libraries (compiz_glib_integration_test compiz_core ${COMPIZ_GLIB_INTEGRATION_TEST_LIBRARIES} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY}) compiz_discover_tests (compiz_glib_integration_test COVERAGE compiz_core) endif (COMPIZ_GLIB_INTEGRATION_TEST_FOUND) ./tests/integration/glib/glib_integration_test.cpp0000644000004100000410000000613313246301623022733 0ustar www-datawww-data/* * Compiz GLib integration test * * Copyright (C) 2012 Sam Spilsbury * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Authored By: * Sam Spilsbury */ #include #include #include "privateeventsource.h" #include "privatetimeoutsource.h" #include "privateiosource.h" class DieVerifier { public: MOCK_METHOD0 (Die, void ()); }; class GLibSourceDestroyIntegration : public ::testing::Test { public: GLibSourceDestroyIntegration () : context (Glib::MainContext::get_default ()), mainloop (Glib::MainLoop::create ()) { } DieVerifier die; Glib::RefPtr context; Glib::RefPtr mainloop; }; class StubTimeoutSource : public CompTimeoutSource { public: StubTimeoutSource (DieVerifier *dieVerifier, Glib::RefPtr &context) : CompTimeoutSource (context), mDie (dieVerifier) { } virtual ~StubTimeoutSource () { mDie->Die (); } private: DieVerifier *mDie; }; class StubEventSource : public CompEventSource { public: StubEventSource (DieVerifier *dieVerifier) : CompEventSource (NULL, 0), mDie (dieVerifier) { } virtual ~StubEventSource () { mDie->Die (); } private: DieVerifier *mDie; }; class StubWatchFd : public CompWatchFd { public: StubWatchFd (DieVerifier *dieVerifier, int fd, Glib::IOCondition iocond, const FdWatchCallBack &cb) : CompWatchFd (fd, iocond, cb), mDie (dieVerifier) { } virtual ~StubWatchFd () { mDie->Die (); } private: DieVerifier *mDie; }; TEST_F (GLibSourceDestroyIntegration, TimeoutSourceGSourceDestroy) { Glib::RefPtr sts(new StubTimeoutSource (&die, context)); EXPECT_CALL (die, Die ()); g_source_destroy (sts->gobj ()); } TEST_F (GLibSourceDestroyIntegration, EventSourceGSourceDestroy) { Glib::RefPtr sts(new StubEventSource (&die)); sts->attach (context); EXPECT_CALL (die, Die ()); g_source_destroy (sts->gobj ()); } TEST_F (GLibSourceDestroyIntegration, FdSourceGSourceDestroy) { Glib::IOCondition iocond = Glib::IO_IN; int fd = 0; FdWatchCallBack cb; Glib::RefPtr sts(new StubWatchFd (&die, fd, iocond, cb)); sts->attach (context); EXPECT_CALL (die, Die ()); g_source_destroy (sts->gobj ()); } ./tests/compiz.supp0000644000004100000410000000554713246301623014632 0ustar www-datawww-data# # Valgrind suppression file for running compiz # # Copyright (C) 2013 Canonical Ltd. # Author: Daniel van Vugt # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # { Google protobuf leaks in operator new(unsigned long) Memcheck:Leak fun:_Znwm ... fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:*protobuf_AddDesc_* } { g_spawn_check_exit_status Memcheck:Cond fun:g_spawn_check_exit_status } { drmIoctl Memcheck:Param ioctl(generic) fun:ioctl fun:drmIoctl } { drm_intel_bufmgr_gem_init Memcheck:Cond fun:drm_intel_bufmgr_gem_init } { Mesa i965 x64 Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/dri/i965_dri.so } { Mesa libdrm_intel x64 Memcheck:Cond obj:/usr/lib/x86_64-linux-gnu/libdrm_intel.so.1.0.0 } { _mesa_TexImage2D bad write 4 Memcheck:Addr4 fun:* ... fun:_mesa_TexImage2D } { _mesa_TexImage2D bad write 1 Memcheck:Addr1 fun:* ... fun:_mesa_TexImage2D } { _mesa_TexImage2D bad memcpy 8 Memcheck:Addr8 fun:memcpy* ... fun:_mesa_TexImage2D } { Mesa, how do you get glClear wrong? Memcheck:Addr1 fun:bcmp ... fun:_mesa_meta_glsl_Clear } { Mesa glLinkProgram off by 1 Memcheck:Addr1 fun:bcmp ... fun:_mesa_glsl_link_shader } { g_type_init leaks by design, at least up to glib 2.35 Memcheck:Leak fun:*alloc ... fun:g_type_init_with_debug_flags } { g_bus_get_sync Memcheck:Leak fun:*alloc ... fun:g_bus_get_sync } { g_bus_get_sync memalign Memcheck:Leak fun:memalign ... fun:g_bus_get_sync } { dbus *alloc leaks Memcheck:Leak fun:*alloc ... fun:g_dbus_* } { dbus memalign leaks Memcheck:Leak fun:memalign ... fun:g_dbus_* } { compizBinPath needs to leak env vars Memcheck:Leak fun:malloc fun:strdup fun:*detectCompizBinPath* } { g_settings_class_init intentionally leaks signals Memcheck:Leak fun:*alloc ... fun:g_signal_new ... fun:g_type_class_ref ... fun:g_object_new } ./tests/experimental-memcheck/0000755000004100000410000000000013246301623016654 5ustar www-datawww-data./tests/experimental-memcheck/compiz.supp0000644000004100000410000004122213246301623021067 0ustar www-datawww-data# -*- tab-width: 3; indent-tabs-mode: nil -*- # # GNOME supressions base.supp: # git://github.com/dtrebbien/GNOME.supp.git # Copyright (C) 2012 Daniel Trebbien # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Python supressions valgrind-python.supp: # http://hg.python.org/cpython # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Python Software Foundation; All Rights Reserved # PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 # -------------------------------------------- # # 1. This LICENSE AGREEMENT is between the Python Software Foundation # ("PSF"), and the Individual or Organization ("Licensee") accessing and # otherwise using this software ("Python") in source or binary form and # its associated documentation. # 2. Subject to the terms and conditions of this License Agreement, PSF hereby # grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, # analyze, test, perform and/or display publicly, prepare derivative works, # distribute, and otherwise use Python alone or in any derivative version, # provided, however, that PSF's License Agreement and PSF's notice of copyright, # i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python # alone or in any derivative version prepared by Licensee. # 3. In the event Licensee prepares a derivative work that is based on # or incorporates Python or any part thereof, and wants to make # the derivative work available to others as provided herein, then # Licensee hereby agrees to include in any such work a brief summary of # the changes made to Python. # 4. PSF is making Python available to Licensee on an "AS IS" # basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR # IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND # DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS # FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT # INFRINGE ANY THIRD PARTY RIGHTS. # # 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON # FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS # A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, # OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. # # 6. This License Agreement will automatically terminate upon a material # breach of its terms and conditions. # 7. Nothing in this License Agreement shall be deemed to create any # relationship of agency, partnership, or joint venture between PSF and # Licensee. This License Agreement does not grant permission to use PSF # trademarks or trade name in a trademark sense to endorse or promote # products or services of Licensee, or any third party. # # 8. By copying, installing or otherwise using Python, Licensee # agrees to be bound by the terms and conditions of this License # Agreement. # # All other supressions: # # Copyright © 2012 Canonical Ltd. # # Permission to use, copy, modify, distribute, and sell this software # and its documentation for any purpose is hereby granted without # fee, provided that the above copyright notice appear in all copies # and that both that copyright notice and this permission notice # appear in supporting documentation, and that the name of # Canonical Ltd. not be used in advertising or publicity pertaining to # distribution of the software without specific, written prior permission. # Canonical Ltd. makes no representations about the suitability of this # software for any purpose. It is provided "as is" without express or # implied warranty. # # CANONICAL, LTD. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN # NO EVENT SHALL CANONICAL, LTD. BE LIABLE FOR ANY SPECIAL, INDIRECT OR # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # Authored by: Sam Spilsbury # / { xmlReadFile leaks a string Memcheck:Leak fun:malloc fun:xmlStrndup ... fun:xmlReadFile } { xmlReadFile leaks an xmlNewCharEncodingHandler Memcheck:Leak fun:malloc fun:xmlNewCharEncodingHandler ... fun:xmlReadFile } { xmInitCharEncodingHandlers leaks Memcheck:Leak fun:*alloc* fun:xmlInitCharEncodingHandlers } { xmlReadFile leaks an xmlNewRMutex Memcheck:Leak fun:malloc fun:xmlNewRMutex ... fun:xmlReadFile } { xmlParseDocument leaks an xmlNewMutex Memcheck:Leak fun:malloc fun:xmlNewMutex ... fun:xmlParseDocument } { dlopen leaks some tokens Memcheck:Leak fun:*alloc* ... fun:dlopen* } { dlclose calls malloc and leaks Memcheck:Leak fun:*alloc* ... fun:dlclose* } { import_submodule Memcheck:Leak fun:*alloc* ... fun:import_*module* } { everything from PyInitialize_Ex Memcheck:Leak fun:*alloc* ... fun:Py_InitializeEx* } { everything from PySys* Memcheck:Leak fun:*alloc* ... fun:PySys* } { everything from PyList Memcheck:Leak fun:*alloc* ... fun:PyList_* } { everything from PyThread Memcheck:Leak fun:*alloc* ... fun:PyThread* } { everything from PyStructSequence Memcheck:Leak fun:*alloc* ... fun:PyStructSequence* } { don't care about protobuf Memcheck:Leak ... fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ } { google::protobuf::protobufAddDesc Memcheck:Leak ... fun:*protobuf*AddDesc* } { don't care about protobuf Memcheck:Leak ... fun:_ZN6google8protobuf8internal10OnShutdownEPFvvE } { g_types are never free'd Memcheck:Leak ... fun:g_type* } { g_settings_class_init intentionally leaks signals Memcheck:Leak fun:*alloc ... fun:g_signal_new ... fun:g_type_class_ref ... fun:g_object_new } { g_list_append calls g_slice_alloc can call g_private_get which seems to leave reachable blocks Memcheck:Leak fun:malloc ... fun:g_private_get fun:g_slice_alloc fun:g_list_append } { g_list_append calls g_mutex_lock which calls malloc Memcheck:Leak fun:malloc ... fun:g_mutex* ... fun:g_slice_alloc fun:g_list_append } # not entirely certain about this { g_list_append calls thread_memory_from_self, but we can't detect it Memcheck:Leak fun:calloc ... fun:g_slice_alloc fun:g_list_append } { g_variant_builder_end calls g_rec_mutex_lock Memcheck:Leak fun:malloc ... fun:g_slice_alloc ... fun:g_rec_mutex_lock fun:g_variant_type_info_get ... fun:g_variant_builder_end } { Memcheck:Cond fun:__GI___strcasecmp_l } { Memcheck:Value8 fun:__GI___strcasecmp_l } { Memcheck:Addr8 fun:__strspn_sse42 } { Memcheck:Cond fun:__strspn_sse42 } { Memcheck:Addr4 fun:FcConfigFileExists } { g_hash_table_insert_node() in ghash.c Memcheck:Leak ... fun:g_memdup fun:g_hash_table_insert_node } { g_hash_table_resize() in ghash.c Memcheck:Leak ... fun:g_hash_table_resize } { Memcheck:Leak ... fun:g_get_application_name } { Memcheck:Leak ... fun:g_get_home_dir } { Memcheck:Leak ... fun:g_get_host_name } { Memcheck:Leak ... fun:g_get_prgname } { Memcheck:Leak ... fun:g_get_real_name } { Memcheck:Leak ... fun:g_get_system_config_dirs } { Memcheck:Leak ... fun:g_get_system_data_dirs } { Memcheck:Leak ... fun:g_get_tmp_dir } { Memcheck:Leak ... fun:g_get_user_cache_dir } { Memcheck:Leak ... fun:g_get_user_config_dir } { Memcheck:Leak ... fun:g_get_user_data_dir } { Memcheck:Leak ... fun:g_get_user_name } { Memcheck:Leak ... fun:g_get_user_runtime_dir } { Memcheck:Leak ... fun:g_get_user_special_dir } { Memcheck:Leak ... fun:g_reload_user_special_dirs_cache } { Memcheck:Leak ... fun:g_set_application_name } { Memcheck:Leak ... fun:g_set_prgname } { Memcheck:Leak ... fun:g_random_double } { Memcheck:Leak ... fun:g_random_double_range } { Memcheck:Leak ... fun:g_random_int } { Memcheck:Leak ... fun:g_random_int_range } { Memcheck:Leak ... fun:g_random_set_seed } { Memcheck:Leak ... fun:g_bus_get fun:g_bus_own_name } { Memcheck:Leak ... fun:g_hash_table_new fun:g_bus_own_name } { Memcheck:Leak ... fun:g_main_context_ref_thread_default fun:g_bus_own_name } { Memcheck:Leak ... fun:g_hash_table_new fun:g_bus_own_name_on_connection } { Memcheck:Leak ... fun:g_variant_new fun:g_bus_unown_name } { _g_dbus_initialize() in gio/gdbusprivate.c Memcheck:Leak ... fun:_g_dbus_initialize } { Memcheck:Leak ... fun:FcConfigSubstitute* fun:pango_cairo_fc_font_map_fontset_key_substitute } { _gtk_accessibility_init() in gail.c Memcheck:Leak ... fun:atk_add_focus_tracker fun:_gtk_accessibility_init } { Memcheck:Leak ... fun:gdk_display_manager_get } { Memcheck:Leak ... fun:gdk_display_manager_get_default_display } { Memcheck:Leak ... fun:gdk_display_get_default } { Memcheck:Leak ... fun:gtk_clipboard_get_for_display } { Memcheck:Leak ... fun:gtk_clipboard_request_contents } { gtk_im_module_initialize() in gtkimmodule.c Memcheck:Leak ... fun:gtk_im_module_initialize } { Memcheck:Leak ... fun:gtk_widget_get_style_context } { g_main_context_default calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_context_new fun:g_main_context_default } { g_main_context_default calls g_mutex_lock Memcheck:Leak fun:*alloc* ... fun:g_mutex_lock ... fun:g_main_context_default } { g_main_context_default calls g_cond_broadcast Memcheck:Leak fun:*alloc* ... fun:g_cond_broadcast ... fun:g_main_context_default } { g_main_context_default calls g_slist_prepend Memcheck:Leak fun:*alloc* ... fun:g_slist_prepend ... fun:g_main_context_default } { g_get_worker_context calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_context_new fun:g_get_worker_context } { g_get_worker_context calls g_thread_new Memcheck:Leak fun:*alloc* ... fun:g_thread_new fun:g_get_worker_context } { g_get_worker_context calls g_mutex_lock Memcheck:Leak fun:*alloc* ... fun:g_mutex_lock ... fun:g_get_worker_context } { g_main_context_iterate calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_context_iterate* } { g_main_loop_run calls malloc Memcheck:Leak fun:*alloc* ... fun:g_main_loop_run* } { g_thread_proxy calls malloc Memcheck:Leak fun:*alloc* ... fun:g_thread_proxy } { g_unix_signal_add_full calls g_mutex_lock which calls malloc Memcheck:Leak fun:*alloc* ... fun:g_mutex_lock ... fun:g_unix_signal_add_full } { Memcheck:Leak ... fun:gtk_source_style_scheme_manager_get_default } { Memcheck:Leak ... fun:gtk_source_style_scheme_get_style } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64) Memcheck:Value8 fun:Py_ADDRESS_IN_RANGE } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:Py_ADDRESS_IN_RANGE } { Suppress leaking the GIL. Happens once per process, see comment in ceval.c. Memcheck:Leak fun:malloc fun:PyThread_allocate_lock fun:PyEval_InitThreads } { Suppress leaking the GIL after a fork. Memcheck:Leak fun:malloc fun:PyThread_allocate_lock fun:PyEval_ReInitThreads } { Suppress leaking the autoTLSkey. This looks like it shouldn't leak though. Memcheck:Leak fun:malloc fun:PyThread_create_key fun:_PyGILState_Init fun:Py_InitializeEx fun:Py_Main } { Hmmm, is this a real leak or like the GIL? Memcheck:Leak fun:malloc fun:PyThread_ReInitTLS } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:realloc fun:_PyObject_GC_Resize } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:_PyObject_GC_New } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:*PyObject*Malloc* } { Handle PyMalloc confusing valgrind (possibly leaked) Memcheck:Leak fun:malloc fun:_PyObject_GC_NewVar } { Dictresize confuses valgrind too Memcheck:Leak ... fun:dictresize* } { PyString can confuse it too Memcheck:Leak ... fun:PyString* } # # Non-python specific leaks # { Handle pthread issue (possibly leaked) Memcheck:Leak fun:calloc fun:allocate_dtv fun:_dl_allocate_tls_storage fun:_dl_allocate_tls } { Handle pthread issue (possibly leaked) Memcheck:Leak fun:memalign fun:_dl_allocate_tls_storage fun:_dl_allocate_tls } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:PyObject_Free } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Addr8 fun:PyObject_Free } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Value8 fun:PyObject_Free } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:PyObject_Free } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Addr4 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Invalid read of size 4 Memcheck:Value4 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Addr8 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Use of uninitialised value of size 8 Memcheck:Value8 fun:PyObject_Realloc* } { ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value Memcheck:Cond fun:PyObject_Realloc* } # Additional suppressions for the unified decimal tests: { test_decimal Memcheck:Addr4 fun:PyUnicodeUCS2_FSConverter } { test_decimal2 Memcheck:Addr4 fun:PyUnicode_FSConverter } ./tests/manual/0000755000004100000410000000000013246301624013663 5ustar www-datawww-data./tests/manual/README.txt0000644000004100000410000000053013246301623015356 0ustar www-datawww-dataCompiz Manual Tests =================== Avoid writing manual tests if you can. Acceptance tests that can be run on an automatic basis are always preferred. If getting some part of the code would be too difficult or invasive, then write a manual test in here so that we can remind ourselves to deploy test frameworks for the code in quesiton. ./tests/manual/plugins/0000755000004100000410000000000013246301624015344 5ustar www-datawww-data./tests/manual/plugins/wall.txt0000644000004100000410000000232513246301623017045 0ustar www-datawww-dataCOMPIZ WALL PLUGIN MANUAL TESTS =============================== Sam Spilsbury Edge Flip Pointer ----------------- Setup: #. Enable "Edge Flip Pointer" in the wall plugin and set up screen edges as appropriate Actions: #. Move cursor to relevant screen edge #. Viewport will change to the next one over #. Viewport will not change if that viewport is the last one in the row or column Edge Flip Move -------------- Setup: #. Disable "Edge Flip Pointer" in the wall plugin, enable "Edge Flip Move" in the wall plugin, and set up screen edges as appropriate Actions: #. Grab window by titlebar #. Move cursor to relevant screen edge #. Viewport will change to the next one over while window is grabbed #. Viewport will not change if that viewport is the last one in the row or colum Edge Flip Dnd ------------- Setup: #. Disable "Edge Flip Pointer" in the wall plugin, enable "Edge Flip Dnd" in the wall plugin, and set up screen edges as appropriate Actions: #. Grab a desktop icon #. Move cursor to relevant screen edge #. Viewport will change to the next one over while icon is grabbed #. Viewport will not change if that viewport is the last one in the row or colum ./tests/manual/plugins/decor.txt0000644000004100000410000000152613246301623017204 0ustar www-datawww-dataCOMPIZ DECOR PLUGIN =================== Sam Spilsbury Static Gravity Handling - no decorations ---------------------------------------- Setup: # Install guake Actions: # Start and launch guake Expected Result: Guake should sit flush with the panels and work area Static Gravity Handling - decorations ------------------------------------- Setup: # Install friends-app Actions: # Start and launch friends-app Expected Result: The QML window should have its decorations visible and be contained in the top left hand corner of the work area _NET_REQUEST_FRAME_EXTENTS handling ----------------------------------- Setup: # Install any sun-awt application - examples: 1. netbeans 2. ecplise Actions: # Run the application Expected Result: The application should not have its contents offset by its decoration size ./tests/manual/NVIDIAForceRefreshRate.txt0000644000004100000410000000045413246301623020512 0ustar www-datawww-dataNVIDIA REFRESH RATE =================== Sam Spilsbury Force Refresh Rate ------------------ Actions #. Open ccsm and turn "Benchmark" on #. Hit Alt-F12 #. Run glxgears #. Benchmark should display roughly under 60 frames per second and not under 50 frames per second ./tests/manual/GSettings.txt0000644000004100000410000001654613246301623016346 0ustar www-datawww-dataBASIC GSETTINGS MANUAL TESTS ============================= Daniel van Vugt NOTE 1: Common setup "Compile compiz and install to ~/staging": (Starting in the compiz source directory) mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=~/staging make -j2 make install NOTE 2: "Set XDG_DATA_DIRS": All of these tests depend of XDG_DATA_DIRS being defined already, as it is in X. If you're not in X then you can set it with this command: export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/ NOTE 3: "Create a dev profile": All of these tests require a compizconfig profile to exist, called "dev". To make one, edit ~/.config/compiz-1/compizconfig/config and add: [general_dev] backend = gsettings profile = dev integration = true plugin_list_autosort = true NOTE 4: "Delete your old compiz gsettings": dconf reset -f "/apps/compiz-1/" dconf reset -f "/org/freedesktop/compiz/" dconf reset -f "/org/compiz/profiles/dev/" CompizConfig Settings Manager (CCSM) initialization ---------------------------------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. Close CCSM. #. dconf dump /org/compiz/ Expected Result: Some settings are shown by the dconf dump. Correct storage of plugin-list ------------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, tick several different boxes (each one is a plugin) #. Close CCSM. #. Start ccsm again (same as above) Expected Result: All the same boxes are still ticked when CCSM is restarted. Correct storage of enumerations -------------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, OpenGL > Texture Filter = Best #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/opengl/texture-filter Expected Result: The value "2" is output. Correct storage of bools ------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, Composite > Detect Refresh Rate = OFF #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/composite/detect-refresh-rate Expected Result: The value "false" is output. Correct storage of integers ---------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, Composite > Refresh Rate = 100 #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/composite/refresh-rate Expected Result: The value "100" is output. Correct storage of strings --------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, General Options > Default Icon = hello #. Close CCSM. #. dconf read /org/compiz/profiles/dev/plugins/core/default-icon Expected Result: The value 'hello' is output. Loading colour settings ------------------------ Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, enable Composite, OpenGL, Desktop Wall, Window Decoration, Move Window, Resize Window. #. In CCSM, Desktop Wall > Outline Color = RED #. Close CCSM. #. Switch to a VT and log in. #. cd ~/staging #. Set XDG_DATA_DIRS (see NOTE 2 above). #. env DISPLAY=:0 LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev ./bin/compiz --replace ccp #. Switch to X using Ctrl+Alt+F7. #. Switch between viewports using Ctrl+Alt+Left/Right. Expected Result: Windows are decorated, moveable and resizeable. When switching viewports, the switcher preview has a RED border. Real-time plugin unloads ------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, enable Composite, OpenGL, Desktop Wall, Window Decoration, Move Window, Resize Window. #. Close CCSM. #. Switch to a VT and log in. #. cd ~/staging #. Set XDG_DATA_DIRS (see NOTE 2 above). #. env DISPLAY=:0 LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev ./bin/compiz --replace ccp #. Switch to X using Ctrl+Alt+F7. #. Open a window (if none already). e.g. Ctrl+Alt+T and verify its moveable. #. Start ccsm again, as above. #. Untick (disable) "Move Window". Expected Result: Can't move windows any more. Real-time settings changes --------------------------- Setup: #. sudo apt-get install dconf-tools #. Create a dev profile. #. Compile compiz and install to ~/staging #. Log into X if not already. #. Delete your old compiz gsettings. Actions: #. cd ~/staging #. env LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev PYTHONPATH=./lib/python2.7/site-packages ./bin/ccsm #. In CCSM, enable Composite, OpenGL, Desktop Wall, Window Decoration, Move Window, Resize Window, Expo. #. Close CCSM. #. Switch to a VT and log in. #. cd ~/staging #. Set XDG_DATA_DIRS (see NOTE 2 above). #. env DISPLAY=:0 LD_LIBRARY_PATH=./lib XDG_DATA_DIRS="./share:$XDG_DATA_DIRS" COMPIZ_CONFIG_PROFILE=dev ./bin/compiz --replace ccp #. Switch to X using Ctrl+Alt+F7. #. Start ccsm again, as above. #. In CCSM, General Options > Horizontal Virtual Size = 10 #. Press Super+E. Expected Result: Verify you can now see 10 workspaces when in expo mode (Super+E). ./tests/manual/GTKWindowDecoratorResourceUsage.txt0000644000004100000410000000055313246301623022603 0ustar www-datawww-dataGTK-Window-Decorator Resource Usage =================================== Sam Spilsbury XRestop usage ------------- #. Install xrestop (sudo apt-get install xrestop) #. Run xrestop (eg, $ xrestop &) #. Note the number in the "Wns" column for gtk-window-decorator #. Open a window #. Close that window #. The number should be the same ./tests/manual/Unredirect.txt0000644000004100000410000000570713246301623016540 0ustar www-datawww-dataWINDOW UNREDIRECTION TESTS =========================== Daniel van Vugt Browser unredirect with context menus ------------------------------------- Setup: #. Install Chromium or Chrome browser. Actions: #. Open Chrome/Chromium and hit F11 to go full screen. #. Right click on the web page to open a context menu. #. Left click on the web page to close the context menu. #. Right click on the web page to open a context menu. #. Left click on the web page to close the context menu. #. Press F11 to exit from full screen. Expected Result: Every time you right-clicked, the context menu should be visible. Video unredirect with window menu --------------------------------- Setup: #. Install mplayer. #. Get a video file you can play in mplayer. Actions: #. Open the video in mplayer. #. Hit F to go fullscreen. #. Hit Alt+Space to open the window menu. #. Hit Escape to close the window menu. #. Hit Alt+Space to open the window menu. #. Hit Escape to close the window menu. #. Hit Escape to close the video. Expected Result: Every time you hit Alt+Space the window menu should have appeared and the video should still be playing behind it. Video unredirect with transformed screen ---------------------------------------- Setup: #. Install mplayer. #. Get a video file you can play in mplayer. Actions: #. Open the video in mplayer. #. Hit F to go fullscreen. #. Trigger expo mode (Super+E or mouse to top-left corner) #. Leave expo mode (click on the full screen video) #. Trigger expo mode again. #. Leave expo mode (click on the full screen video) #. Hit Escape to close the video. Expected Result: Every time you triggered expo mode, expo mode should have become visible and you should see the video still playing in the expo view. Unredirect cancelation by alpha windows on top (LP: #1046661) ------------------------------------------------------------- Setup: #. Install Chromium or Chrome browser. Actions: #. Open a Chrome/Chromium window. #. Open a gnome-terminal window (Ctrl+Alt+T) #. Move the gnome-terminal to the centre of the screen, above the Chrome window. #. Click on the Chrome window and make it fullscreen (F11). #. Alt+Tab to the gnome-terminal window. Expected Result: The gnome-terminal window should be visible on top. Unredirect cancelation by transformed windows (LP: #1047168) ------------------------------------------------------------- Setup: #. Install Chromium or Chrome browser. #. Run ccsm and ensure the Scale plugin is loaded and "Initiate Window Picker" is bound to Shift+Alt+Up. Actions: #. Open a Chrome/Chromium window. #. Open a gnome-terminal window (Ctrl+Alt+T) #. Move the gnome-terminal to the centre of the screen, above the Chrome window. #. Click on the Chrome window and make it fullscreen (F11). #. Hold Shift+Alt and tap Up to engage scale mode. Keep holding Shift+Alt for a few seconds. Expected Result: Windows get scaled and you can see both the Chrome and Terminal windows. ./po/0000755000004100000410000000000013246301624011662 5ustar www-datawww-data./po/fi.po0000644000004100000410000042112213246301623012621 0ustar www-datawww-data# translation of compiz.po to Finnish # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2003 SuSE Linux AG. # # Michael Hintsala , 2003. 2001. # Jyri Palokangas , 2006. # Jouni Hätinen , 2006. # Jani-Matti Hätinen , 2006. # Jani Hyytiäinen , 2008. # Timo Jyrinki , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-08-13 10:05+0200\n" "Last-Translator: Timo Jyrinki \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Työpöytä" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Ikkunoiden hallinta" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ei mitään" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Näytä rullattuna" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Suurenna" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Suurenna vaakatasossa" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Suurenna pystytasossa" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Pienennä" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Nosta" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Laske" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Ikkunavalikko" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Suoritettava toiminto kun hiiren kiekkoa rullataan ikkunan otsikkopalkissa" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Sumennustyyppi" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" "Aktiivisen Metacity-ikkunan läpinäkyvyysMetacity-teeman aktiivisen ikkunan " "läpinäkyvyys" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity-teeman aktiivisen ikkunan läpinäkyvyyden varjo" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity-teeman läpinäkyvyys" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity-teeman läpinäkyvyyden varjo" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Läpinäkyvyys aktiivisessa ikkunassa käytettäessä Metacity-teemaa kehyksineen" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity-teeman kehyksiin käytettävä läpinäkyvyys" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Varjosta aktiiviset ikkunat Metacity-teemaa kehyksineen käytettäessä " "läpikuultamattomasta läpikuultavaan" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Varjosta ikkunat Metacity-teemaa kehyksineen käytettäessä " "läpikuultamattomasta läpikuultavaan" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Hiiren rullan napsautuksen vaikutus ikkunan otsikkoon" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Sumennustyyppi ikkunan kehyksille" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Käytä Metacity-teemaa" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Käytä Metacity-teemaa ikkunoiden kehyksissä" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Sulje ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Palauta suurennettu ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Suurenna ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Pienennä ikkuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Näytä päällimmäisenä" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Näytä kaikilla työpöydillä" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Älä näytä rullattuna" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Älä näytä päällimmäisenä" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Älä näytä kaikilla työpöydillä" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Ikkuna \"%s\" ei vastaa." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Tämän sovelluksen sulkeminen väkisin saa tallentamattomat muutokset " "katoamaan." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "Sulje _väkisin" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Piirros" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Piirroksen täyttöväri" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Piirroksen ääriviivojen väri" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Piirroksen liitännäiset" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Tyhjennä" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Piirrä" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Piirrä työkalulla" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Piirroksen väri" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Aktivoi" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Aktivoi piirtäminen" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Aktivoi piirtämisen pyyhkiminen" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Aktivoi pyyhkiminen" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Viivan leveys" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Viivan leveys piirroksiin" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Viivan väri piirroksiin" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Viivan leveys" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Viivan leveys piirroksiin" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xbilineaarinen" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha-sumennus" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Sumenna ikkunat alpha-sumennuksella" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Sumennuksen suodatin" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Sumennuksen purevuus" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Sumennuksen kylläisyys" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Sumennuksen nopeus" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Sumenna ikkunat" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Sumenna ikkunoiden läpinäkyvien osien takana" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Sumennuksen kylläisyys" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Sumennettavat ikkunatyypit" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Sumenna ikkunat joilla ei ole keskitystä" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Poista sumennuksen käyttö alueissa joista ikkunat ovat tehneet " "vaikeaselkoiset" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Sumentamiseen käytettävä suodatin" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Keskityksen sumennus" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Sumenna passiiviset ikkunat" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussian" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussin säde" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussin voimakkuus" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussin säde" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussin voimakkuus" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Riippumaton tekstuurien nouto" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmapin yksityiskohtien taso" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap-kuvien yksityiskohtien tarkkuus" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Syke" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Syketehoste" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Käytä käytettävissä olevia teksturointiyksiköitä tekemään mahdollisimman " "monta riippumatonta tekstuurien noutoa." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Ikkunan sumennuksen nopeus" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Ikkunatyypit, joihin keskityksen sumennus vaikuttaa" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Ikkunatyypit, joiden tulisi käyttää alfa sumennusta oletuksena" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Ulostulon kloonaus" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Aktivoi kloonauksen valinta" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Ulostulon kloonauksen käsittelijä" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Näppäinyhdistelmä, jota painettaessa ajetaan komento command9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Reuna, johon siirryttäessä ajetaan komento command0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Reuna, johon siirryttäessä ajetaan komento command1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Reuna, johon siirryttäessä ajetaan komento command10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Reuna, johon siirryttäessä ajetaan komento command11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Reuna, johon siirryttäessä ajetaan komento command2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Reuna, johon siirryttäessä ajetaan komento command3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Reuna, johon siirryttäessä ajetaan komento command4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Reuna, johon siirryttäessä ajetaan komento command5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Reuna, johon siirryttäessä ajetaan komento command6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Reuna, johon siirryttäessä ajetaan komento command7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Reuna, johon siirryttäessä ajetaan komento command8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Reuna, johon siirryttäessä ajetaan komento command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Luo sidoksia komentorivikomentoihin" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Näppäinsidokset" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Komentorivi 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Komentorivi 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Komentorivi 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Komentorivi 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Komentorivi 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Komentorivi 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Komentorivi 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Komentorivi 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Komentorivi 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Komentorivi 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Komentorivi 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Komentorivi 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Suoritettava komentorivi, kun run_command0 suoritetaan" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Suoritettava komentorivi, kun run_command1 suoritetaan" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Suoritettava komentorivi, kun run_command10 suoritetaan" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Suoritettava komentorivi, kun run_command11 suoritetaan" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Suoritettava komentorivi, kun run_command2 suoritetaan" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Suoritettava komentorivi, kun run_command3 suoritetaan" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Suoritettava komentorivi, kun run_command4 suoritetaan" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Suoritettava komentorivi, kun run_command5 suoritetaan" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Suoritettava komentorivi, kun run_command6 suoritetaan" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Suoritettava komentorivi, kun run_command7 suoritetaan" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Suoritettava komentorivi, kun run_command8 suoritetaan" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Suoritettava komentorivi, kun run_command9 suoritetaan" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Komennot" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Reunasidokset" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Näppäinsidokset" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Suorita komento 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Suorita komento 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Suorita komento 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Suorita komento 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Suorita komento 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Suorita komento 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Suorita komento 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Suorita komento 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Suorita komento 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Suorita komento 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Suorita komento 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Suorita komento 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Käytössä olevat liitännäiset" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "Kokoruutuikkunoita ei uudelleenohjata piilotetuille pikselikartoille" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Kuuluva äänimerkki" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Kuuluva järjestelmän huomautus" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automaattinosto" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automaattinoston viive" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Ulostulolaitteiden automaattinen tunnistus" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Virkistystaajuuden automaattinen tunnistus" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Paras" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Tarkenna hiiren napsautuksesta" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Hiiren napsautus ikkunalla tarkentaa sen" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Sulje aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Oletuskuvake" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Oletuskuva ikkunoille, joilla ei ole kuvaketta" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Työpöydän koko" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Tunnista ulostulot" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Tunnista virkistystaajuus" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Näyttöasetukset" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Osoittimen paikallaanoloaika näytön reunalla, ennen kuin reunatoiminto " "suoritetaan." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Reunaliipaisimen viive" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Nopea" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Kohdistus- ja nostokäyttäytyminen" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Kohdistuksen eston taso" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Keskityksen estäminen ikkunoissa" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Keskityksen estäminen ikkunoissa" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Pakota ulostulojen itsenäinen piirto." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Yleiset asetukset" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Yleiset Compizin asetukset" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Hyvä" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Piilota tehtäväpalkissa näkymättömät ikkunat" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Piilota kaikki ikkunat ja näytä työpöytä" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Piilota ikkunat jotka eivät ole ikkunaluettelossa, kun käytetään \"näytä " "työpöytä\" -toimintoa" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Korkea" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuaalinen koko leveyssuunnassa" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Käytä pakkausta kuvista muunnetuille tekstuureille, jos mahdollista" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Jätä huomiotta vihjeet suurennettaessa" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ohita kokolisäys- ja kuvasuhdevihjeet ikkunaa suurennettaessa" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Aikaväli ennen valittujen ikkunoiden nostamista" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Viive ping-viestien välillä" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Pikanäppäimet" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Kohdistuksen nappaamisen eston taso" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Valaistus" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista tällä hetkellä aktiivisista liitännäisistä" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Ulostulolaitteita kuvaavien merkkijonojen luettelo" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Matala" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Laske ikkuna" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Laske ikkuna taka-alalle" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Suurenna ikkunaa vaakatasossa" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Suurenna ikkunaa pystytasossa" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Suurenna aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Suurenna aktiivista ikkunaa vaakatasossa" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Suurenna aktiivista ikkunaa pystytasossa" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Pienennä aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Tavallinen" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Työtilojen lukumäärä" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Virtuaalityöpöytien lukumäärä" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Pois päältä" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Suorita vain näyttöpäivitykset pystytasossa tehtävän tyhjäyksen aikana" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Ulostulot" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Päällekkäisten ulostulojen käsittely" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Piirrä jokainen ulostulolaite itsenäisesti, vaikka ulostulolaitteet olisivat " "päällekkäin" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ikkunoiden tummentamisen viive" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Suosi suurempaa ulostuloa" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Suosi pienempää ulostuloa" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Nosta napsautuksesta" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Nosta ikkuna" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Nosta valittu ikkuna tietyn ajan jälkeen" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Nosta ikkuna muiden päälle" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Nosta ikkuna napsautuksesta" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Virkistystaajuus" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Näytön virtuaalikoon kerroin todelliseen kokoon leveyssuunnassa" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Näytön virtuaalikoon kerroin todelliseen kokoon pystysuunnassa" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Näytä työpöytä" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Hitaat animaatiot" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Älykäs tila" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkronoi VBlankiin" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Tekstuurien pakkaus" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Tekstuurisuodatin" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Tekstuurisuodatus" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Kuinka usein ruutu päivitetään (1-200 krt/s)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Suurenna ikkuna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Suurenna ikkuna vaakatasossa" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Suurenna ikkuna pystytasossa" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Pienennä ikkuna kehystilaan" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Suurenna aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Suurenna aktiivinen ikkuna vaakatasossa" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Suurenna aktiivinen ikkuna pystytasossa" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Pienennä aktiivinen ikkuna kehystilaan" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Ota käyttöön hitaat animaatiot" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Palauta suurenettu aktiivinen ikkuna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Kokoruutuikkunoita ei uudelleenohjata" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Käytä hajavaloa ruudun muuttuessa" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Pystysuuntainen virtuaalinen koko" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Hyvin korkea" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Mitä päällekkäisistä ulostulolaitteista suositaan" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Ikkunavalikon näppäinyhdistelmä" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" "Määrittää näppäinyhdistelmän ikkunavalikolle, joka saadaan myös klikkaamalla " "ikkunan kehystä vasemmalla hiiren painikkeella" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Kiihdytys" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Sovita kuva" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Sovita kannen ja pohjan kuva kuutiolle" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Etene seuraavaan diaan" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animoi Taivaankansi" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animoi taivaankansi työpöytäkuutiota kääntäessä" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Ulkoasu" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automaattinen" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Käyttäytyminen" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kuution pohjan ja kannen väri" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Alin väri taivaankannen liukuvärissä" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Ylin väri taivaankannen liukuvärissä" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Kuution kannet" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kuution väri" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Työpöytäkuutio" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Kiihdytyskerroin" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Nopeuskerroin" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Aikaviivekerroin" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Luo mipmap skaalauksen laadun parantamiseksi mikäli se on mahdollista" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Takaisin edelliseen diaan" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Kuvatiedostot" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Taivaankannen tekstuurina käytettävä kuva" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Kuutio on läpinäkyvä vain kun sitä käännetään hiirellä" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Kuution sisäpinta" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Näyttää kuution sisäpinnan" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Lista kuution päälle asetettavista PNG- ja SVG-tiedostoista" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Useita ulostuloja" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Useita kuutioita" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Seuraava dia" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Yksi iso kuutio" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Läpikuultavuus pyörityksen aikana" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Läpikuultavuus kun kuutiota ei pyöritetä" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Työpöytien läpinäkyvyys pyörityksen aikana" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Työpöytien läpinäkyvyys kun kuutiota ei pyöritetä" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Asettele ikkunat työpöytäkuution pinnalle" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Edellinen dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Piirrä taivas" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skaalaa kuvaa" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skaalaa kuva kuution katon kokoiseksi" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Valitsee miten kuutio näyetään jos käyettään usempaa kuin yhtä ulostulo " "laitetta (näyttöä)" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Taivas" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Liukuvärin lopetusväri" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Liukuvärin aloitusväri" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Taivaan kuva" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Nopeus" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Aikaviive" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Läpinäkyvä vain hiirellä pyörittäessä" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Läpinäkyvä kuutio" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Avaa" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Avaa kuutio" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "D-Bus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "D-Bus-hallinnan taustaosa" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Salli mipmap kuvioiden käyttäminen kehysten tekstuureihin" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Komento" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ikkunatyypit, joilla tulisi olla kehykset" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Kehystyskomento, joka suoritetaan kehystimen puuttuessa" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Varjon X-poikkeama" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Varjon Y-poikkeama" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Varjon väri" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Varjon läpinäkyvyys" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Varjon säde" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Varjon väri" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Varjon X-poikkeama" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Varjon Y-poikkeama" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Varjon läpinäkyvyys" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Varjon säde" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ikkunatyypit, joilla tulisi olla varjo" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Ikkunan kehykset" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Ikkunan kehyksen asetukset" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Ikkunatyypit, jotka tulisi kehystää" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ikkunatyypit, joille tulisi lisätä varjo" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Kirkkaus prosenteissa ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Vakionopeus" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Vakioaika" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Himmennä ikkunat, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Himmennä ikkunat, jotka eivät vastaa ikkunanhallinnan pyyntöihin" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Häivytystapa" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Häivytä pienentämisen, avaamisen ja sulkemisen yhteydessä" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Häivytyksen nopeus" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Häivytysviive" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Häivystehoste pienentämisen, avaamisen ja sulkemisen yhteydessä" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Häivitystehoste järjestelmän piipauksesta" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Ikkunat häivytetään näkyvistä/näkyviin" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Häivytä ikkunat" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Ikkunoiden häivytys" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Kokoruudun näkyvä kello" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Kokoruudun häivytystehoste järjestelmän piippauksesta" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Värikylläisyys prosenteissa ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Kirkkaus ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Värikylläisyys ikkunoille, jotka eivät vastaa" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Näkyvä kello" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Ikkunan häivytystapa" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ikkunan häivytysnopeus \"Vakionopeus\"-tilassa" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Ikkunan häivytysaika (millisekunneissa) \"Vakioaika\"-tilassa" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ikkunatyypit, joita tulisi häivyttää" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Liitoskohta" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Liitoskohta" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Käyttäjätilan tiedostojärjestelmä" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Käyttäjätilan tiedostojärjestelmä" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf-tietokannan hallinta" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib-pääsilmukan tuki" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome-yhteensopivuus" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Avaa pääte" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Valinnat, joilla Compiz pidetään yhteensopivana Gnome-työpöytäympäristön " "kanssa" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Suorita komento -valintaikkuna" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Suorita päätekomento" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kuvakaappauksen komento" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Näytä päävalikko" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Näytä Suorita komento -valintaikkuna" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Näytä päävalikko" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ota kuvankaappaus" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Ota kuvankaappaus ikkunasta" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Päätteen komentorivi" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Ikkunan kuvakaappauksen komento" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Struktuurittomien Ini-viestien tietokannan hallinta" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Käyttäjätilan tiedostojärjestelmä" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig-tietokannan hallinta" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Pienennystehoste" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Pienennä ikkunat" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Pienennykseen käytetty aika" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Pienennyksen aikaväli" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Varjon vastussauma" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Varjon vastussauma" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Animoi ikkunoiden pienennys ja suurennus" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Ikkunatyypit, jotka tulisi muuntaa pienennettäessä" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Rajoita Y-koordinaatti" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Rajoita Y-koordinaatti työskentelyalueelle" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Älä päivitä serveripuolen sijaintia ikkunoissa kunnes siirtäminen on valmis" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Siirrä ikkunaa" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Laiska sijoittaminen" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Siirrä Ikkuna" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Ikkunan siirtäminen" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Läpinäkyvyys" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Liikkuvien ikkunoiden läpinäkyvyys" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Vapauta ja palauta suurennetut ikkunat automaattisesti siirrettäessä" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Vapauta suurennetut ikkunat" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Aloita ikkunan siirtäminen" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Kirkkaus" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Kirkkauden vähentäminen" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Kirkkauden lisääminen" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Kirkkauden säädön askel" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Kirkkausarvot ikkunoille" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Vähennä" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Lisää" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Peittävyyden vähentäminen" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Peittävyyden lisääminen" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Peittävyyden säädön askel" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Peittävyysarvot ikkunoille" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Peittävyys, kirkkaus ja värikylläisyys" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Peittävyyden, kirkkauden ja värikylläisyyden muuttaminen" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Kylläisyys" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Kylläisyyden vähentäminen" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Kylläisyyden lisääminen" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Kylläisyyden säädön askel" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Kylläisyysarvot ikkunoille" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Askel" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Ikkunakohtaiset asetukset" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Ikkunoiden arvot" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Ikkunat" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Ikkunat joilla tulisi oletuksena olla eriävä kirkkaus" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Ikkunat joilla tulisi oletuksena olla eriävä peittävyys" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Ikkunat joilla tulisi oletuksena olla eriävä värikylläisyys" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Ikkunan sijoittamiseen käyettettävä algoritmi" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Porrasta" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Keskitetty" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Määrätty ikkunoiden sijoittelu" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Pakotetun sijoittelun ikkunat" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Työpöytien vaakataso-sijainti" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Pidä työtilassa" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Pidä asetettu ikkuna työtilassa, vaikka se tarkoittaisi sijainnin eriävyyttä " "määritellystä sijainnista" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Sijoita ikkunat" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Sijoita kaikkien ulostulojen kesken" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Sijoita ikkunat sopiville paikoille niiden ilmestyessä" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Käyetettävä metodi sijoittamisessa" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Sijoitetut ikkunat" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Satunnainen" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Määrittää kuinka ikkunoiden sijoittelun tulisi toimia, jos valittuina on " "useita ulostuloja" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Älykäs" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Käytä aktiivista ulostulolaitetta" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Käytä kohdistetun ikkunan ulostulolaitetta" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Käytä osoittimen sisältämää ulostulolaitetta" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Työpöytien pystytaso-sijainti" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Tiettyyn työpöytään sijoitettavat ikkunat" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Poikkeukset ikkunoiden sijoittamisessa" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Ikkunatyypit, jotka tulisi sijoittaa oletuksena" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Ikkunatyypit, jotka tulisi sijoittaa tiettyyn työpöytään oletuksena" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ikkunatyypit, jotka tulisi pakotetusti sijoittaa paikoilleen, vaikka ne " "kieltäisivät ikkunointiohjelmaa tekemästä niin." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Ikkunatyypit, joilla määrätyt sijainnit" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Ikkunatyypit, joilla määrätty työtila" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Poikkeukset" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-sijainnit" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Näkymän X-sijainnit" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X-sijainnin arvot" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-sijainnit" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Näkymän Y-sijainnit" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y-sijainnin arvot" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "PNG-kuvien lataaja" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Lauseketäsmäys" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Lausekkeen määrittelemien ikkunoiden täsmäys" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Pikanäppäimet" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Reunan väri" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Reunan väri, jota käytetätään Ääriviiva- ja Suorakulmio-venytys metodeille" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Koon muuttamisen oletustapa" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Ikkunan koon muuttamiseen käytettävä oletustapa" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Täyttöväri" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Täyttöväri suorakulmio-tapaan" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Aloita ikkunan koon muuttaminen tavallista tapaa käyttäen" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Aloita ikkunan koon muuttaminen ääriviiva-tapaa käyttäen" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Aloita ikkunan koon muuttaminen suorakulmio-tapaa käyttäen" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Aloita ikkunan koon muuttaminen venytys-tapaa käyttäen" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Muuta ikkunan kokoa" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Ikkunan koon muuttaminen tavallisesti" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Ääriviiva" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Ikkunan koon muuttaminen ääriviivoilla" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Suorakulmio" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Ikkunan koon muttaminen suorakulmiolla" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Muuta ikkunan kokoa" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Muuta ikkunan kokoa" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Aloita ikkunan koon muuttaminen" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Aloita ikkunan koon muuttaminen venyttämällä" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Aloita ikkunan koon muuttaminen tavallisesti" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Aloita ikkunan koon muuttaminen ääriviivaa käyttäen" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Aloita ikkunan koon muuttaminen suorakulmiota käyttäen" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Venytä" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Ikkunan koon muttaminen Venytä metodilla" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Ikkunat, joilla käytetään normaalia koon muuttamista" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Ikkunat, joilla käytetään ääriviivatapaa koon muuttamiseen" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Ikkunat, joilla käytetään suorakulmiota koon muuttamiseen" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Ikkunat, joilla käytetään venyttämistä koon muuttamista" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Käännä seuraavaan työpöytään siirtäessä objektia reunaan" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Käännä seuraavaan työpöytään siirtäessä ikkunan reunaan" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Käännä seuraavaan työpöytään siirtäessä osoitinta reunaan" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Käännön kesto" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Käännä vasempaan työtilaan ja siirrä osoitin" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Vaihda seuraavaan työpöytään vedettäessä objektia ruudun reunaa vasten." #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Vaihda seuraavaan työpöytään vedettäessä osoitinta ruudun reunaa vasten." #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Vaihda seuraavaan työpöytään vedettäessä ikkunaa ruudun reunaa vasten." #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Käännä oikeaan työtilaan ja siirrä osoitin" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Peilaa osoittimen Y-suuntainen liike" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Peilaa osoittimen Y-akseli" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Osoittimen herkkyys" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Nosta pyörittäessä" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Nosta ikkuna pyörittäessä" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Käännä kuutiota" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Kierrä vasemmalle" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Kierrä oikealle" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Käännä vasemmalle" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Käännä vasemmalle ikkunan kanssa" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Käännä oikealle" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Käännä oikealle ikkunan kanssa" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Käännä" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Käännä työpöydälle 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Käännä työpöydälle 1 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Käännä työpöydälle 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Käännä työpöydälle 10 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Käännä työpöydälle 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Käännä työpöydälle 11 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Käännä työpöydälle 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Käännä työpöydälle 12 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Käännä työpöydälle 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Käännä työpöydälle 2 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Käännä työpöydälle 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Käännä työpöydälle 3 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Käännä työpöydälle 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Käännä työpöydälle 4 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Käännä työpöydälle 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Käännä työpöydälle 5 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Käännä työpöydälle 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Käännä työpöydälle 6 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Käännä työpöydälle 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Käännä työpöydälle 7 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Käännä työpöydälle 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Käännä työpöydälle 8 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Käännä työpöydälle 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Käännä työpöydälle 9 ikkunan kanssa" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Kuution kääntö" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Käännä työpöytäkuutiota" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Kääntää kuution vasemmalle" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Kääntää kuution vasemmalle aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Kääntää kuution oikealle" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Kääntää kuution oikealle aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Käännä työpöydälle" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Käännä työpöydälle ikkunan kanssa" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Käännä työpöydälle 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Käännä työpöydälle 1 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Käännä työpöydälle 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Käännä työpöydälle 10 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Käännä työpöydälle 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Käännä työpöydälle 11 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Käännä työpöydälle 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Käännä työpöydälle 12 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Käännä työpöydälle 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Käännä työpöydälle 2 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Käännä työpöydälle 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Käännä työpöydälle 3 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Käännä työpöydälle 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Käännä työpöydälle 4 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Käännä työpöydälle 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Käännä työpöydälle 5 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Käännä työpöydälle 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Käännä työpöydälle 6 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Käännä työpöydälle 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Käännä työpöydälle 7 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Käännä työpöydälle 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Käännä työpöydälle 8 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Käännä työpöydälle 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Käännä työpöydälle 9 aktiivisen ikkuna kanssa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Käännä näkymään" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Käännä ikkunaa" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Käännä ikkunan kanssa" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Kääntämiskiihdytys" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Kääntämisnopeus" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Kääntämisaikaväli" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoomaus käännettäessä" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Osoitinliikkeen herkkyys" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Kiinnitä kääntäminen kuution pohjaan" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Kiinnitä kääntäminen kuution kattoon" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Kiinnitä pohjaan" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Kiinnitä kattoon" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Aloita kääntäminen" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Aikakatkaisu ennen näkymän vaihtamista" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Läpinäkyvyys prosentteina" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Suuri" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Pikanäppäimet kytkevät skaalaustilan päälle/pois" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Pikanäppäimet vaihtavat skaalaustilaa sen sijaan että ottaisivat sen " "käyttöön painettaessa ja pois käytöstä vapautettaessa." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Näytä työpöytä siihen klikatessa" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Tummenna tausta" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Tummenna tausta ikkunoita skaalatessa" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Tunnus" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Siirry työpöytätilaan kun työpöytää klikataan skaalauksen aikana" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Päälläoloaika" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Käynnistä ikkunavalitsin" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Aktivoi ikkunavalitsin kaikille ikkunoille" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Aktivoi ikkunavalitsin ikkunaryhmälle" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Aktivoi ikkunavalitsin ikkunoille nykyisessä ulostulossa" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Pikanäppäimet kytkevät skaalaustilan päälle/pois" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Pikanäppäimet vaihtavat skaalaustilaa sen sijaan että ottaisivat " "painettaessa käyttöön ja vapautettaessa pois käytöstä." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Asettele ja ala mukauttaa kaikkia ikkunoita" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Asettele ja ala mukauttaa ikkunaryhmää" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Asettele ja ala mukauttaa ikkunoita" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Asettele ja ala mukauttaa ikkunoita nykyisessä ulostulossa" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Kaikissa ulostulolaitteissa" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Vain nykyisessä ulostulolaitteessa" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Aseta kuvake päälle" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Asettaa kuvakkeen ikkunan päälle skaalaamisen jälkeen" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skaalaus" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Ikkunoiden skaalaus" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaalausnopeus" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Skaalausaikaväli" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Määrittää ikkunatyypit, jotka tulisi skaalata skaalaustilassa" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Määrittää missä ikkunat skaalataan jos käytössä on useampi ulostulo laite" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Ikkunoiden välinen tila" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Tila" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Aika (ms), jonka jälkeen skaalaustila lopetetaan, kun ikkunan päälle " "asettaminen on käytössä" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ikkunatyypit, jotka tulisi skaalata skaalaustilassa" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ohjelma joka automaattisesti avaa kuvakaappauksen" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Hakemisto" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Käynnistä suorakulmion muotoinen kuvankaappaaja" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Suorita sovellus" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Tallenna kuvakaappaukset tähän hakemistoon" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Kuvakaappaus" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Kuvakaappaus-liitännäinen" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "SVG-kuvien lataaja" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Kirkkauden määrä prosentteina" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Kylläisyyden määrä prosentteina" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Sovellusten vaihtaja" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automaattinen kääntö" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Tuo etualalle" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Tuo aktiivinen ikkuna etualalle" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Etäisyys, jonka työpöydän tulisi olla loitonnettuna ikkunoita vaihdettaessa" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Kuvake" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Pienennetty" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Seuraava paneeli" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Seuraava ikkuna" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Seuraava ikkuna (kaikki ikkunat)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Seuraava ikkuna (ei ponnahdusikkunaa)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Ponnauta vaihtaja näkyviin jos ei ole ja valitse seuraava ikkuna" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Ponnauta vaihtaja näkyviin jos ei ole ja valitse edellinen ikkuna ja valitse " "seuraava ikkuna kaikista ikkunoista" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Ponnauta vaihtaja näkyviin jos ei ole ja valitse edellinen ikkuna" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Ponnauta vaihtaja näkyviin jos ei ole ja valitse edellinen ikkuna kaikista " "ikkunoista" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Edellinen paneeli" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Edellinen ikkuna" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Edellinen ikkuna (kaikki ikkunat)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Edellinen ikkuna (ei ponnahdusikkunaa)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Käännä valittuun ikkunaan vaihtaessa" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Valitse seuraava paneelityypin ikkuna." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Siirry seuraavaan ikkunaan ilman vaihtajan ponnahdusikkunaa" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Valitse edellinen paneelityypin ikkuna." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Siirry edelliseen ikkunaan ilman vaihtajaa ponnahdusikkunaa" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Näytä kuvake esikatselukuvan vieressä" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Näytä pienennetyt ikkunat" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Vaihtajanopeus" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Vaihtaja-aikaväli" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Ikkunoiden vaihtajassa näkyvät ikkunatyypit" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Määrittää ikkunatyypit, jotka näkyvät ikkunoiden vaihtajassa" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Lisää YV12-väriavaruuden tuen" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videon toisto" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Mahdollistaa videon toiston" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12-väriavaruus" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Lisää viiva" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Lisää piste" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Lisää vesitehosteen erilaisille työpöydän toiminnoille" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Kunkin sadepisaran välinen viive (ms)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Ota käyttöön osoittimen vesitehosteet" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Viiva" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Vääristyksen skaala" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Piste" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Sateen viive" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Otsikon aalto" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Ota käyttöön sade" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Ota käyttöön sadetehoste" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Ota käyttöön pyyhkijä" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Ota käyttöön pyyhkijä" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vesitehoste" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Määrittää vesipisaran alla olevan alueen vääristyksen" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Aaltotehoste ikkunan otsikosta" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Keskitystehoste" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Ikkunan keskitystehoste" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Ikkunatyypit, jotka huojuvat keskittäessä" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Kitka" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Ikkunatyypit, jotka huojuvat tartuttaessa" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Hilan tarkkuus" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Käänteinen ikkunoiden tarttuvuus" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Tee ikkunoista väriseviä" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Ilmestymistehoste" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Liitä ikkunatehoste" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Ikkunatyypit, jotka huojuvat ilmestyessä" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Suurennustehoste" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Pienin mahdollinen hilakoko" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Pienin mahdollinen kärkipisteen hilakoko" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Ikkunatyypit, jotka huojuvat siirrettäessä" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Värinä" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Kiinnitä käänteiset" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Kiinnitä ikkunat" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Jousikitka" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Jousivakio" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Määrittää jousen voimakkuuden" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Ota käyttöön tarttuvat ikkunat" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Käytä ikkunoiden joustavaa huojumistehostetta" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Kärkipisteen hilan tarkkuus" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua kohdistettaessa" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua tartuttaessa" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua liitettäessä" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Määrittää ikkunatyypit, joiden tulisi huojua siirrettäessä" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Huojumistehoste ikkuna suurentaessa ja pienentäessä" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Huojuvat ikkunat" #~ msgid "Command line 0" #~ msgstr "Komentorivi 0" #~ msgid "Run command 0" #~ msgstr "Suorita komento 0" #~ msgid "Screenshot commands" #~ msgstr "Kuvakaappauksen komennot" #~ msgid "Screenshot key bindings" #~ msgstr "Kuvakaappauksen pikanäppäimet" #~ msgid "Filter Linear" #~ msgstr "Suodata lineaarisesti" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Käytä lineaarista suodatinta zoomin aikana" #~ msgid "Zoom Desktop" #~ msgstr "Työpöydän zoomaus" #~ msgid "Zoom In" #~ msgstr "Lähennys" #~ msgid "Zoom Out" #~ msgstr "Loitonnus" #~ msgid "Zoom Pan" #~ msgstr "Zoomin muutosarvo" #~ msgid "Zoom Speed" #~ msgstr "Zoomausnopeus" #~ msgid "Zoom Timestep" #~ msgstr "Zoomausaikaväli" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoomaa ja panoroi työpöytää" #~ msgid "Zoom factor" #~ msgstr "Suurennuskerroin" #~ msgid "Zoom pan" #~ msgstr "Panorointi suurennettaessa" #~ msgid "Decrease window opacity" #~ msgstr "Vähennä ikkunan läpikuultavuutta" #~ msgid "Increase window opacity" #~ msgstr "Lisää ikkunan läpikuultavuutta" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Läpinäkyvyyden arvot ikkunoille, jotka ovat läpinäkyviä oletuksena" #~ msgid "Opacity window values" #~ msgstr "Läpinäkyvien ikkunoiden arvot" #~ msgid "Opacity windows" #~ msgstr "Ikkunoiden läpinäkyvyys" #~ msgid "Background Images" #~ msgstr "Taustakuvat" #~ msgid "Background images" #~ msgstr "Taustakuvat" #~ msgid "Place windows on a plane" #~ msgstr "Asettele ikkunat työpöytätason pinnalle" #~ msgid "Plane Down" #~ msgstr "Siirry alas" #~ msgid "Plane Left" #~ msgstr "Siirry vasemmalle" #~ msgid "Plane Right" #~ msgstr "Siirry oikealle" #~ msgid "Plane To Face 1" #~ msgstr "Siirry tasolle 1" #~ msgid "Plane To Face 10" #~ msgstr "Siirry tasolle 10" #~ msgid "Plane To Face 11" #~ msgstr "Siirry tasolle 11" #~ msgid "Plane To Face 12" #~ msgstr "Siirry tasolle 12" #~ msgid "Plane To Face 2" #~ msgstr "Siirry tasolle 2" #~ msgid "Plane To Face 3" #~ msgstr "Siirry tasolle 3" #~ msgid "Plane To Face 4" #~ msgstr "Siirry tasolle 4" #~ msgid "Plane To Face 5" #~ msgstr "Siirry tasolle 5" #~ msgid "Plane To Face 6" #~ msgstr "Siirry tasolle 6" #~ msgid "Plane To Face 7" #~ msgstr "Siirry tasolle 7" #~ msgid "Plane To Face 8" #~ msgstr "Siirry tasolle 8" #~ msgid "Plane To Face 9" #~ msgstr "Siirry tasolle 9" #~ msgid "Plane Up" #~ msgstr "Siirry ylös" #~ msgid "Plane down" #~ msgstr "Siirry alas" #~ msgid "Plane left" #~ msgstr "Siirry vasemmalle" #~ msgid "Plane right" #~ msgstr "Siirry oikealle" #~ msgid "Plane to face 1" #~ msgstr "Siirry tasolle 1" #~ msgid "Plane to face 10" #~ msgstr "Siirry tasolle 10" #~ msgid "Plane to face 11" #~ msgstr "Siirry tasolle 11" #~ msgid "Plane to face 12" #~ msgstr "Siirry tasolle 12" #~ msgid "Plane to face 2" #~ msgstr "Siirry tasolle 2" #~ msgid "Plane to face 3" #~ msgstr "Siirry tasolle 3" #~ msgid "Plane to face 4" #~ msgstr "Siirry tasolle 4" #~ msgid "Plane to face 5" #~ msgstr "Siirry tasolle 5" #~ msgid "Plane to face 6" #~ msgstr "Siirry tasolle 6" #~ msgid "Plane to face 7" #~ msgstr "Siirry tasolle 7" #~ msgid "Plane to face 8" #~ msgstr "Siirry tasolle 8" #~ msgid "Plane to face 9" #~ msgstr "Siirry tasolle 9" #~ msgid "Plane up" #~ msgstr "Siirry ylös" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Kuution läpinäkyvyyden katoamiseen kestävä aika" #~ msgid "Open window menu" #~ msgstr "Avaa ikkunavalikko" #~ msgid "Dock" #~ msgstr "Telakointi" #~ msgid "Toolbar" #~ msgstr "Työkalupalkki" #~ msgid "Menu" #~ msgstr "Valikko" #~ msgid "Utility" #~ msgstr "Apuohjelma" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Valintaikkuna" #~ msgid "DropdownMenu" #~ msgstr "Avattava valikko" #~ msgid "PopupMenu" #~ msgstr "Ponnahdusvalikko" #~ msgid "Tooltip" #~ msgstr "Työkaluvihje" #~ msgid "Notification" #~ msgstr "Ilmoitus" #~ msgid "Combo" #~ msgstr "Yhdistelmä" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Modaalinen valintaikkuna" #~ msgid "Fullscreen" #~ msgstr "Kokoruutu" #~ msgid "Unknown" #~ msgstr "Tuntematon" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command10 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command1 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command10 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command11 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command2 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command3 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command4 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command5 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command6 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command7 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command8 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Tunnisteen command9 mukaisen komennon suorittava näppäinyhdistelmä" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Kirkkauden määrä prosentteina" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Läpikuultavuuden määrä prosentteina" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Kylläisyyden määrä prosentteina" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Kylläisyys" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Kunkin sadepisaran välinen viive (ms)" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Etäisyys, jonka työpöydän tulisi olla loitonnettuna ikkunoita " #~ "vaihdettaessa" #~ msgid "Do not modify" #~ msgstr "Älä muuta" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Hylkää varjon poikkeama (X)" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Hylkää varjon poikkeama (Y)" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Hylkää varjon vahvuus" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Hylkää varjon säde" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Ikkunan kohdistustehoste (ei mitään = None, vavistus = Shiver)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Valitse edellinen ikkuna" # workflow: "3D Beschleunigung aktivieren" # -ke- #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Taittamisen kiihdytys (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Taittamisen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Taittamisen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Aikaväli ennen valittujen ikkunoiden nostamista" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Asettele tämänhetkisen kohteen ikkunat ja aloita niiden muunto" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Ikkunoiden ilmestymistehoste (ei mitään = None, vavistus = Shiver)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Pienennysnopeus (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Pienennysnopeus (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Pienin mahdollinen kärkipisteen hilakoko" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Virtuaalisten työpöytien määrä" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Läpikuultavuuden muutosväli" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Liikkuvien ikkunoiden läpikuultavuustaso" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Liikkuvien ikkunoiden läpikuultavuustaso" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Aseta kuvake päälle ikkunoihin, kun ne skaalataan" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Plugins that this must load before" #~ msgstr "Etukäteen tätä varten ladattavat liitännäiset" #~ msgid "Plugins that this requires" #~ msgstr "Tähän vaadittavat liitännäiset" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "seuraava ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "seuraava ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "edellinen ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Tuo vaihtaja ponnahdusikkunaan, jos se ei ole näkyvissä, ja valitse " #~ "edellinen ikkuna kaikista ikkunoista" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Taittamisen kiihdytys (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Zoomauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Zoomauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Skaalauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Skaalauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Virtuaalisen vaakatasokoon näyttökokokerroin" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Virtuaalisen pystytasokoon näyttökokokerroin" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Osoitinliikkeen herkkyys" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Varjon vastussauma" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Ikkunoiden välinen tila" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Jousikitka" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Jousivakio" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Skaalauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Skaalauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Tekstuurisuodin (nopea = Fast, hyvälaatuinen = Good, paras = Best)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Nopeus, jolla näyttö piirretään uudelleen (kertaa/sekunnissa)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Aika (ms), jonka jälkeen skaalaustila lopetetaan, kun ikkunan päälle " #~ "asettaminen on käytössä" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Aikakatkaisu ennen näkymän vaihtamista" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Käytä lineaarista suodinta lähennettäessä" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Kärkipisteen hilan tarkkuus" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Vesisiirtymän skaala" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Ikkunan häivytyksen nopeus" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Ikkunan häivytyksen nopeus" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Ikkunatyypit, jotka tulisi skaalata skaalaustilassa" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Ikkunatyypit, jotka tulisi näyttää vaihtajassa" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Ikkunatyypit, jotka tulisi muuntaa pienennettäessä" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Ikkunatyypit, jotka tulisi häivyttää" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua kohdistettaessa" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua tartuttaessa" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua liitettäessä" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Ikkunatyypit, joiden tulisi huojua siirrettäessä" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Nurkat, jotka aktivoivat skaalaustilan (vasen ylänurkka = TopLeft, oikea " #~ "ylänurkka = TopRight, vasen alanurkka = BottomLeft, oikea alanurkka = " #~ "BottomRight)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Zoomauksen nopeus (0.1-50.0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Zoomauksen aikaviive (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Zoomauskerroin" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Kierrä kohteen %d suuntaan ikkunan kanssa" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Kierrä kohteen %d suuntaan ja tuo aktiivinen ikkuna mukana" #~ msgid "Rotate To Face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #~ msgid "Rotate to face %d" #~ msgstr "Kierrä kohteen %d suuntaan" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Kierrä kohteen %d suuntaan ikkunan kanssa" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Kierrä kohteen %d suuntaan ja tuo aktiivinen ikkuna mukana" #~ msgid "Command line %d" #~ msgstr "Komentorivi %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Komentotulkissa suoritettava komentorivi, kun suorita_komento%d annetaan" #~ msgid "Run command %d" #~ msgstr "Suorita komento %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "" #~ "Pikanäppäin, joka kutsuttaessa suorittaa komentotulkin komennon komento%d" #~ msgid "Move Window Types" #~ msgstr "Siirrettäessä huojuvat ikkunatyypit" #~ msgid "Corners" #~ msgstr "Kulmat" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Kohdista ikkunaan osoittimen liikkuessa sen päälle" #~ msgid "Initiate All Windows" #~ msgstr "Aktivoi kaikkien ikkunoiden ikkunanvaihtaja" #, fuzzy #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Siirrä ikkunaa" #, fuzzy #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Muuta ikkunan kokoa" #~ msgid "Initiate Window Switcher" #~ msgstr "Aktivoi ikkunanvaihtaja" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Kaikkien ikkunoiden näyttämiseen käytettävä vaihtonäppäin" #~ msgid "Return from scale view" #~ msgstr "Poistu skaalausnäkymästä" #~ msgid "Show switcher" #~ msgstr "Näytä ikkunavaihtaja" #~ msgid "Sloppy Focus" #~ msgstr "Seuraava tarkennus" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Aloita ikkunan siirtäminen" #~ msgid "Terminate" #~ msgstr "Lopeta" #~ msgid "Water effect on system beep" #~ msgstr "Vesitehoste järjestelmän huomautuksessa" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Häivytettävät ikkunatyypit (työpöytä = Desktop, paneeli = Dock, " #~ "työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Pienennettäessä animoitavat ikkunatyypit (työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Skaalautuvat ikkunatyypit (työpöytä = Desktop, paneeli = Dock, " #~ "työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunavaihtajassa näkyvät ikkunatyypit(työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat kohdistettaessa(työpöytä = Desktop, paneeli " #~ "= Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat tartuttaessa (työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat ilmestyessään (työpöytä = Desktop, paneeli = " #~ "Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Ikkunatyypit, jotka huojuvat liikuteltaessa (työpöytä = Desktop, paneeli " #~ "= Dock, työkalupalkki = Toolbar, valikko = Menu, työkalu = Utility, " #~ "käynnistysikkuna = Splash, valintaikkuna = Dialog, pakotettu " #~ "valintaikkuna = ModalDialog, tavallinen ikkuna = Normal, kokoruutuikkuna " #~ "= Fullscreen, tuntematon = Unknown)" # workflow: "3D Beschleunigung aktivieren" # -ke- #~ msgid "Wobble effect on system beep" #~ msgstr "Huojumistehoste järjestelmän huomautuksesta" ./po/CMakeLists.txt0000644000004100000410000000314613246301623014425 0ustar www-datawww-dataproject (po) find_program (_intltool_update intltool-update) if (NOT EXISTS "${_intltool_update}") message (SEND_ERROR "Missing intltool-update (try: sudo apt-get install intltool)") endif () find_program (_xgettext xgettext) mark_as_advanced (_xgettext) find_program (_msgmerge msgmerge) mark_as_advanced (_msgmerge) find_program(_msgfmt msgfmt) mark_as_advanced (k3d_msgfmt) set (compiz_catalogs ${ALL_LINGUAS}) set (compiz_catalog_targets) add_custom_target (nls-update-sources ${_intltool_update} -m WORKING_DIRECTORY ${po_SOURCE_DIR} ) add_custom_command ( OUTPUT ${po_SOURCE_DIR}/compiz.pot COMMAND ${_intltool_update} --gettext-package compiz --pot DEPENDS POTFILES.in WORKING_DIRECTORY ${po_SOURCE_DIR} ) foreach(catalog ${compiz_catalogs}) add_custom_target (nls-update-${catalog}.po ${_msgmerge} ${catalog} compiz -o ${catalog}.po --no-wrap DEPENDS ${po_SOURCE_DIR}/${catalog}.po WORKING_DIRECTORY ${po_SOURCE_DIR} ) file (MAKE_DIRECTORY "${po_BINARY_DIR}/${catalog}/LC_MESSAGES") add_custom_command ( OUTPUT ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo COMMAND ${_msgfmt} -c -o ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo ${po_SOURCE_DIR}/${catalog}.po DEPENDS ${po_SOURCE_DIR}/${catalog}.po ) install ( FILES ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo DESTINATION ${datadir}/locale/${catalog}/LC_MESSAGES ) set (compiz_catalog_targets ${compiz_catalog_targets} ${po_BINARY_DIR}/${catalog}/LC_MESSAGES/compiz.mo) endforeach(catalog) add_custom_target(nls ALL DEPENDS ${po_SOURCE_DIR}/compiz.pot ${compiz_catalog_targets} ) ./po/cy.po0000644000004100000410000020163413246301623012642 0ustar www-datawww-data# Welsh message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2003 SuSE Linux AG. # Kevin Donnelly , 2003. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2003-09-23 10:33+0200\n" "Last-Translator: Kevin Donnelly \n" "Language-Team: Welsh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=5; plural=(n == 0 ? 0 : n == 1 ? 1 : n < 6 ? 2 : n == " "6 ? 3 : 4);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Windhoek" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Gwerth" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Windhoek" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Windhoek" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Hepgor\n" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Ymgychwyn" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Hepgor\n" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Cyfnod" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Cyfnod" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Hepgor\n" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Cyfnod" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Ymgychwyn" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Gorchymyn '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Gorchymyn '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Rhag&osod" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Ymgychwyn trefnydd ffenestri rhagosod" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Disgiau Rhith" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Oedi" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Cyfred&oli" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "&Profi" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Disgiau Rhith" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Gweithred" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Ymgychwyn" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "Gweithred" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Hepgor\n" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Profi" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "&Profi" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sydney" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Hepgor\n" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Profi" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Gorchymyn '%1'" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Windhoek" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "ffurfweddu inetd" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ffurfweddu inetd" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Profi" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "&Profi" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Hepgor\n" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "&Profi" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Windhoek" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Profi" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Cyfnod" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ffurfweddu inetd" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Windhoek" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ffurfweddu inetd" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Disgiau Rhith" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Ymgychwyn" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Ymgychwyn" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Ymgychwyn" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Gweithred" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Profi" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Ailddechrau &darganfod" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Ymgychwyn" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Gwerth" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "Gwerth" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "&Profi" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Sbaen" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ymgychwyn" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Ymgychwyn" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Gweithred" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Gweithred" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "Gwerth" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "&Profi" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Oedi" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Gweithred" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Gweithred" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Sbaen" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Sbaen" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windhoek" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Gorchymyn '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Gorchymyn '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Gwall wrth ddadansoddi'r llinell gorchymyn." #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "&Profi" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Profi" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Notification" #~ msgstr "Ffurweddiad" #~ msgid "Unknown" #~ msgstr "Anhysbys" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Cyfnod" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Gweithred" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Gweithred" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Gwerth" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Gweithred" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Sbaen" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Hepgor\n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Profi" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Gorchymyn '%1'" #, fuzzy #~ msgid "Corners" #~ msgstr "Azores" ./po/tr.po0000644000004100000410000027506613246301623012666 0ustar www-datawww-data# translation of compiz.po to # translation of compiz-new.po to # Turkish message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # # Görkem Çetin , 1999, 2000. # Mehmet Mıdık , 2000. # Metin Oral , 2001. # Serdar Soytetir , 2007. msgid "" msgstr "" "Project-Id-Version: compiz-new\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-10-28 17:44+0100\n" "Last-Translator: Emre KURNAZ \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" # clients/inst_sw_single.ycp:146 #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Masaüstü" # clients/inst_sw_single.ycp:188 #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Pencere Yönetimi" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Hiçbiri" # menuentries/menuentry_scanner.ycp:36 #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Gölgelendir" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Pencereyi Yatay Olarak Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Pencereyi Dikey Olarak Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Küçültülmüş" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Otomatik-Yükselt" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Düşük" # clients/inst_sw_single.ycp:188 #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Pencere Menüsü" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Bir pencerenin başlık çubuğu üzerinde fare tekeri ile yaptırılacak davranış." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Bulanıklaştırma tipi" # include/partitioning/auto_part_ui.ycp:147 #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity teması etkin pencere matlığı" # include/partitioning/auto_part_ui.ycp:147 #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity teması etkin pencere matlık gölgesi" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity teması matlığı" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity teması matlık gölgesi" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Etkin pencereler ve Metacity tema dekorasyonları için kullanılacak matlık" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity dekorasyonları için kullanılacak matlık" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Etkin pencereleri metacity dekorasyonu ile matlıktan şeffaflığa doğru gölgele" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Pencereleri metacity dekorasyonu ile matlıktan şeffaflığa doğru gölgele" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Başlık çubuğu fare tekeri davranışı" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Pencere dekorasyonları için kullanılacak bulanıklaştırma tipi" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity teması kullan" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Pencere dekorasyonlarını oluştururken metacity temasını kullan" # clients/inst_target_part.ycp:404 #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Pencereyi Kapat" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Pencereyi Büyütme" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Pencereyi Büyüt" # clients/inst_target_part.ycp:387 #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Pencereyi Küçült" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Üstte Göster" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Yapıştır" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Gölgelendirme" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Üstte Gösterme" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Yapıştırma" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Pencere \"%s\" yanıt vermiyor." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Bu uygulamayı kapatmaya zorlamak, kaydetmediğiniz değişiklikleri " "kaybetmenize neden olacaktır." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Kapatmaya Zorla" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Notlar" # include/security/ui.ycp:774 #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Not Dolgu Rengi" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Not Vurgu Rengi" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Not eklentisi" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Temizle" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Çiz" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Çizmek için kullanılacak araç" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Notlar için dolgu rengi" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Başla" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Not çizmeye başla" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Not silmeye başla" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Silmeye başla" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Satır genişliği" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Notlar için satır genişliği" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Notlar için vurgulama rengi" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Vurgu genişliği" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Notlar için vurgu genişliği" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4 kat Çift Doğrusal" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha Bulanıklaştırma" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Pencereleri alpha kanalı ile bulanıklaştır" # include/tv/ui.ycp:493 #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Bulanıklaştırma Filtresi" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Bulanıklaştırma Emilimi" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Bulanıklaştırma Doygunluğu" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Bulanıklaştırma Hızı" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Pencereleri Bulanıklaştır" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Pencerelerin saydam kısımlarının arkasını bulanıklaştır" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Bulanıklaştırma doygunluğu" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Pencereleri bulanıklaştır" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Odaklanmamış pencereleri bulanıklaştır" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Diğer pencereler tarafından örtülen ekran bölgelerini bulanıklaştırma" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Bulanıklaştırma işlemi için kullanılacak filtre" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Odaklama Bulanıklaştırması" # clients/inst_target_part.ycp:404 #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Odaklanan pencereleri bulanıklaştır" # RU #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussian" # RU #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussian Yarıçapı" # /usr/lib/YaST2/keyboard_raw.ycp:638 #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussian Sertliği" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussian yarıçapı" # /usr/lib/YaST2/keyboard_raw.ycp:638 #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussian sertliği" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Bağımsız doku getirmek" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap ayrıntı-düzeyi" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Darbe" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Darbe efekti" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Mümkün olduğunca çok bağımsız doku getirisi sağlamak için, müsait olan doku " "birimlerini kullan." # clients/inst_resize_ui.ycp:597 #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Pencere bulanıklaştırma hızı" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Odaklama bulanıklaştırmasından etkilenecek pencereler" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Öntanımlı olarak alpha bulanıklaştırması kullanan pencereler" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Çıktı İkilemesi" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "İkileme seçimini başlat" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Çıktı ikilemesi sağlayıcı" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Tetiklendiğinde komut0 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Tetiklendiğinde komut1 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Tetiklendiğinde komut10 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Tetiklendiğinde komut11 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Tetiklendiğinde komut2 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Tetiklendiğinde komut3 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Tetiklendiğinde komut4 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Tetiklendiğinde komut5 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Tetiklendiğinde komut6 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Tetiklendiğinde komut7 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Tetiklendiğinde komut8 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Tetiklendiğinde komut9 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Tetiklendiğinde komut0 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Tetiklendiğinde komut1 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Tetiklendiğinde komut10 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Tetiklendiğinde komut11 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Tetiklendiğinde komut2 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Tetiklendiğinde komut3 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Tetiklendiğinde komut4 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Tetiklendiğinde komut5 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Tetiklendiğinde komut6 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Tetiklendiğinde komut7 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Tetiklendiğinde komut8 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Tetiklendiğinde komut9 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Tetiklendiğinde komut0 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Tetiklendiğinde komut1 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Tetiklendiğinde komut10 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Tetiklendiğinde komut11 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Tetiklendiğinde komut2 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Tetiklendiğinde komut3 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Tetiklendiğinde komut4 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Tetiklendiğinde komut5 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Tetiklendiğinde komut6 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Tetiklendiğinde komut7 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Tetiklendiğinde komut8 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Tetiklendiğinde komut9 olarak tanımlanmış olan kabuk komutunu çalıştıracak " "bir kısayol birleşimi" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" # Kastedileni tam olarak anlayamadım. (drake) #: ../metadata/commands.xml.in.h:38 #, fuzzy msgid "Button Bindings" msgstr "Ölçeklendirme Kipine Geçen Düğme Bağlayıcıları" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "1. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "10. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "11. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "1. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "2. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "3. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "4. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "5. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "6. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "7. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "8. komut satırı" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "9. komut satırı" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Komut0_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Komut1_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Komut10_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Komut11_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Komut2_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Komut3_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Komut4_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Komut5_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Komut6_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Komut7_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Komut8_çalıştır çağrıldığında kabukta çalıştırılacak komut" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Komut9_çalıştır çağrıldığında kabukta çalıştırılacak komut" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Komut" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "1. komutu çalıştır" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "10. komutu çalıştır" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "11. komutu çalıştır" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "1. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "2. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "3. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "4. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "5. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "6. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "7. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "8. komutu çalıştır" # clients/support_registration.ycp:66 #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "9. komutu çalıştır" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Etkin Eklentiler" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Pencere dışındaki gözek haritalarına yönlendirilmemeleri için tam ekran " "pencerelerini germeye izin ver" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "İşitilebilir Zil" # include/partitioning/custom_part_dialogs.ycp:288 #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "İşitilebilir sistem bip sesi" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Otomatik-Yükselt" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Otomatik-Yükselme Gecikmesi" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Çıktı aygıtlarını otomatik bul" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Tazeleme oranını otomatik bul" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "En iyi" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Odaklamak için Tıkla" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Pencereyi odaklamaya almak için tıkla" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Etkin pencereyi kapat" # include/tv/ui.ycp:398 #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Öntanımlı Simge" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Öntanımlı pencere simge resmi" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Masaüstü Küpü" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Çıktıları Bul" # clients/inst_sw_single.ycp:1620 #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Tazeleme Oranını Bul" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Kenar Tetikleme Gecikmesi" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Hızlı" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Odaklanma Önleyici Seviyesi" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Odaklanma Önleyici Pencereleri" # include/nis_server/io.ycp:465 #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Odaklanma önleyici pencereleri" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Bağımsız çıkış boyamasına zorla" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Genel Seçenekler" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Genel compiz seçenekleri" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "İyi" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Görev Çubuğu Pencerelerini Atlamayı Gizle" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Tüm pencereleri gizle ve masaüstünü odakla" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Masaüstünü Göster Kipine geçerken görev çubuğunda olmayan pencereleri gizle" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Yüksek" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Yatay Sanal Boyut" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Eğer mümkünse, görüntülerden dönüştürülmüş dokular için sıkıştırma kullan" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Büyütülünce ipuçlarını yoksay" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Pencere büyütülmüşse boyut büyütmeyi ve ipuçlarını pasifleştir" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Seçilen pencerelerin yükseltilmesinden önce geçecek süre" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping mesajları arasında geçecek süre" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Odaklanma çalınmasının önlenme seviyesi" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Aydınlatma" # include/scanner/scanner_functions.ycp:218 #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Algılanan eklentilerin listesi" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Çıktı aygıtlarını tanımlayan sözcüklerin listesi" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Düşük" # clients/inst_resize_ui.ycp:688 #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Pencereyi Alta Gönder" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Pencereyi diğer pencerelerin altına gönder" # clients/inst_target_part.ycp:387 #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Pencereyi Yatay Olarak Büyüt" # clients/inst_target_part.ycp:387 #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Pencereyi Dikey Olarak Büyüt" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Etkin pencereyi büyüt" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Etkin pencereyi yatay olarak büyüt" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Etkin pencereyi dikey olarak büyüt" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Etkin pencereyi küçült" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Masaüstü Sayısı" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Sanal masaüstü sayısı" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Kapalı" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Ekran güncellemeyi sadece dikey boşaltma sürecinde yap" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Çıktılar" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Örtüşen Çıktı İşlemesi" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Çıktı aygıtları birbiriyle örtüşse dahi her çıktı aygıtını bağımsız olarak " "boya" # clients/hwinfo.ycp:71 #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping Gecikmesi" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Daha büyük çıktıyı tercih et" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Daha küçük çıktıyı tercih et" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Tıklayınca Yükselt" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Pencereyi Yükselt" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Süre bittiğinde seçilen pencereleri yükselt" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Pencereyi diğer pencerelerin üzerine yükselt" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Tıklayınca pencereleri yükselt" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Tazeleme Oranı" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Yatay sanal boyut için ekran boyutu çoklayıcı" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Dikey sanal boyut için ekran boyutu çoklayıcı" # clients/inst_sw_single.ycp:146 #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Masaüstünü Göster" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Yavaş Animasyonlar" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Akıllı kip" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Dikey Boşaltma ile Eşzamanla" # include/tv/ui.ycp:493 #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Doku Sıkıştırma" # include/tv/ui.ycp:493 #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Doku Filtresi" # include/tv/ui.ycp:493 #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Doku filtreleme" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Ekranın yeniden çizilmesinde kullanılacak oran (tekrar sayısı/saniye)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Pencereyi Büyüt / Küçült" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Pencereyi Yatay Olarak Büyüt / Küçült" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Pencereyi Dikey Olarak Büyüt / Küçült" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Pencereyi Gölgele / Geri Yükle" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Etkin pencereyi büyüt / geri yükle" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Etkin pencereyi yatay olarak büyüt / geri yükle" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Etkin pencereyi dikey olarak büyüt / geri yükle" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Etkin pencereyi gölgele / geri yükle" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Yavaş canlandırmaları aç / kapat" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Etkin pencereyi büyütme" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Tam Ekran Pencerelerin Yönlendirmesini Geri Al" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Ekran boyutu değiştirildiğinde geçirgenlik ışığı kullan" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Dikey Sanal Boyut" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Çok Yüksek" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Üst üste binen çıktı aygıtlarından hangisi tercih edilmeli" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Pencere menüsü düğme bağlayıcısı" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Pencere menüsü kısayol bağlayıcısı" # include/x11/resolution_dialog.ycp:81 #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Hızlandırma" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Resmi Ayarla" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Üst kapak resmini döndürmeye göre ayarla" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Sonraki slayta ilerle" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Arkaplanı Canlandır" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Küpü döndürürken arkaplanı canlandır" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Otomatik" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Küpün taban ve tavan rengi" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Gök kubbe-geri düşüş-eğiminin alttaki renk-durağında kullanılacak renk" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Gök kubbe-geri düşüş-eğiminin üstteki renk-durağında kullanılacak renk" # include/security/ui.ycp:774 #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Küp Rengi" # include/security/ui.ycp:774 #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Küp Rengi" # clients/inst_sw_single.ycp:146 #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Masaüstü Küpü" # include/x11/resolution_dialog.ycp:81 #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Katlama Hızlandırması" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Katlama Hızı" # classnames.ycp:73 #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Katlama Zaman Aralığı" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Yüksek kalitede ölçeklendirme için mümkün olduğunda mipmapler oluştur" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Önceki slayta geri dön" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Resim dosyaları" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Arkaplan dokusu olarak kullanılacak resim" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Küp şeffaflığını sadece döndürme işlemi fare ile yapılıyorsa başlatır." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Küpün İçerisine Gir" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Küpün içerisine gir" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Küpün üst kapağı için hazırlanması gereken PNG ve SVG dosyalarının listesi" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Çoklu Çıktı Kipi" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Çoklu küp" # clients/inst_sw_single.ycp:1623 #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Sonraki Slayt" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Tek büyük küp" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Döndürme Sırasındaki Matlık" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Döndürülmezken Kullanılan Matlık" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Döndürme sırasında masaüstü penceresinin matlığı." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Döndürülmediği esnada masaüstü penceresinin matlığı." # clients/inst_target_part.ycp:404 #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Pencereleri küp üzerine yerleştir" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Önceki Slayt" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Arkaplanı hazırla" # clients/inst_environment.ycp:306 #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Resmi boyutlandır" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Küpün tavan yüzünü kaplamak için resimleri boyutlandır" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Çoklu çıktı aygıtı kullanılırken küpün nasıl gösterileceğini seçer." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Arkaplan" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Arkaplan Gradyan Bitim Rengi" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Arkaplan Gradyan Başlangıç Rengi" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Arkaplan Resmi" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hız" # classnames.ycp:73 #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Süre aralığı" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Sadece Fare ile Döndürüldüğünde Şeffaflaştır" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Katlamayı Geri Al" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Küpü Katlamayı Geri Al" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus Denetim Altyapısı" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Dekorasyon dokuları için mipmaplerin yaratılmalarına izin ver" # clients/support_registration.ycp:66 #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Komut" # clients/inst_target_part.ycp:404 #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Pencere dekorasyonu" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Eğer hiçbir pencere dekorasyonu çalışmıyorsa çalıştırılacak dekoratör komut " "satırı" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Düşen gölge Yatay konumu" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Düşen gölge Dikey konumu" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Düşen gölge rengi" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Düşen gölge matlığı" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Düşen gölge yarıçapı" # clients/inst_target_part.ycp:387 #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Gölge Rengi" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Gölge Konumu X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Gölge Konumu Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Gölge Matlığı" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Gölge Yarıçapı" # clients/inst_target_part.ycp:387 #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Pencereleri gölgelendir" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Pencere Dekorasyonu" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Pencere dekorasyonları" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Dekorasyon kullanılması gereken pencereler" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Gölge kullanılması gereken pencereler" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # classnames.ycp:73 #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Döndürme Hızı" # include/ui/common_messages.ycp:23 #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Dikey (Y) Sınırlama" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Tepki Vermeyen Pencreleri Donuklaştır" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Pencere yöneticisinin isteklerine yanıt vermeyen pencereleri donuklaştır" # clients/online_update.ycp:223 #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Solma Kipi" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Küçültme /Açma /Kapatma durumunda Solsun" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Solma Hızı" # clients/online_update.ycp:223 #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Solma Süresi" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Küçültme /açma /kapatma olayarında solma efekti kullan" # include/partitioning/custom_part_dialogs.ycp:288 #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Sistem bip sesinde solma efekti açık" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Haritalandıklarında pencereler belirsin, haritalanmadıklarında kaybolsun" # clients/inst_target_part.ycp:404 #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Pencereleri soldur" # clients/inst_target_part.ycp:387 #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Solan Pencereler" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Tam Ekran Görünür Zil" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Sistem bip durumunda tam ekran solma efektini uygula" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Tepki vermeyen pencerelerin doygunluğu (in %)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Tepki Vermeyen Pencere Parlaklığı" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Tepki Vermeyen Pencere Doygunluğu" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Görünür Zil" # clients/inst_resize_ui.ycp:597 #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Pencere solma kipi" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Boyutlandırma kipinde boyutlandırılacak pencereler" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Solması gereken pencereler" # clients/inst_custom_part.ycp:2928 #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Bağlanma Noktası" # clients/inst_custom_part.ycp:2928 #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Bağlanma noktası" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Kullanıcı Alanı Dosya Sistemi" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Kullanıcıya ait dosya sistemi" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf Denetim Arka Ucu" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib ana döngü desteği" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Bir konsol aç" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Çalıştırma Penceresi" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Uçbirim komut satırı" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Ekran görüntüsü komut satırı" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Ana Menüyü Göster" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Uygulama Çalıştırma Penceresini Göster" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Ana menüyü göster" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ekran görüntüsü al" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Bir pencerenin ekran görüntüsünü al" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Uçbirim komut satırı" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Pencere ekran görüntüsü alma komutu" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini Düz Dosya Arka Ucu" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Dosya değişimi uyarı eklentisi" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig Denetim Arka Ucu" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Küçültme Efekti" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Pencereleri Küçült" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Küçültme Hızı" # clients/inst_target_part.ycp:387 #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Küçültme zaman aralığı" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Gölgeleme Direnci" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Gölgeleme direnci" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Pencereleri küçültüldüklerinde ve geri yüklendiklerinde dönüştür" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Küçültüldüklerinde ve geri yüklendiklerinde dönüştürülecek pencereler" # include/ui/common_messages.ycp:23 #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Dikey (Y) Sınırlama" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y eksenini çalışma alanı ile sınırla" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Taşıma işi bitirilene kadar pencerenin konumunu sunucu tarafında güncelleme" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Pencereleri Taşımaya Başla" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Tembel Konumlandırma" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Pencereyi Taşı" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Pencereyi taşı" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Matlık" # include/nis_server/io.ycp:465 #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Taşınan pencerelerin matlık düzeyi" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Büyütülmüş pencereleri sürüklerken kopar ve otomatik olarak büyütülmemiş " "hale getir" # clients/inst_target_part.ycp:387 #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Büyütülmüş pencerelerde koparma efekti kapalı" # include/nis_server/io.ycp:465 #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Pencereleri taşımaya başla" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Parlaklık" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Parlaklık" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Parlaklık" # classnames.ycp:50 classnames.ycp:59 #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Parlaklık" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Matlığı Düşür" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Matlığı Arttır" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Matlık değiştirme adımı" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Matlık değiştirme adımı" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Matlık Adımı" # include/nis_server/io.ycp:465 #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Taşınan pencerelerin matlık düzeyi" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Döndürme Sırasındaki Matlık" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Doygunluk" #: ../metadata/obs.xml.in.h:19 #, fuzzy msgid "Saturation values for windows" msgstr "Tepki vermeyen pencerelerin doygunluğu (in %)" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Pencere dekorasyonları" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Pencereleri matlaştır değerleri" # clients/inst_resize_ui.ycp:688 #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Pencereleri Haritala" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Öntanımlı olarak konumlandırılacak pencereler" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Öntanımlı olarak saydam olması gereken pencereler" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Öntanımlı olarak konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Pencere yerleşimi için kullanılacak algoritma" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Basamakla" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Ortalanmış" # clients/inst_sw_single.ycp:188 #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Pencere Yönetimi" # clients/inst_target_part.ycp:404 #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Pencerelerin Yetleşimini Zorla" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Yatay masaüstü konumları" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Çalışma Bölgesinde Kal" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" # clients/inst_target_part.ycp:404 #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Pencereleri Yerleştir" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Haritalandıklarında pencereleri belirli bir konuma yerleştir" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Yerleştirme Kipi" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Konumlandırılmış pencereler" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Rastgele" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Çoklu çıktı aygıtı kullanılıyorken boyutlandırılmış pencereleri seçer." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Akıllı" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Tüm çıktı aygıtları üzerinde" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Çıktı aygıtını işaretçi ile kullan" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Dikey masaüstü konumları" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Masaüstüne konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Pencere konumlandırma hızlı çözümleri" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Öntanımlı olarak konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Öntanımlı olarak belirli bir masaüstüne konumlandırılacak pencereler" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Pencere dekorasyonları" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Hızlı Çözümler" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X Konumları" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X Görünüm Yüzü Konumları" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X konum değerleri" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y Konumları" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y Görünüm Yüzü Konumları" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y konum değerleri" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png resim yükleyici" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Düzenli İfade Eşlemesi" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Düzenli ifade pencere eşlemesi" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" # include/security/ui.ycp:774 #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kenarlık Rengi" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Taslak görünümü ve dikdörtgen yeniden boyutlandırma kipinde kullanılacak " "kenarlık rengi" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Öntanımlı Yeniden Boyutlandırma Kipi" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Pencereleri yeniden boyutlandırmak için kullanılacak öntanımlı kip" # include/security/ui.ycp:774 #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Dolgu Rengi" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Dolgu rengi dikdörtgen şeklinde yeniden boyutlandırmada kullanılır" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Normal Yeniden Boyutlandırmaya Başla" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Taslak Göstererek Yeniden Boyutlandırmaya Başla" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Dikdörtgen Yeniden Boyutlandırmaya Başla" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Gergin Yeniden Boyutlandırmaya Başla" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Pencereyi Yeniden Boyutlandırmaya Başla" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Pencereleri Normal Şekilde Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Taslak" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Yeniden Boyutlandırmada Taslak Göster" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Dikdörtgen" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Pencereleri Dikdörtgen Şeklinde Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Pencereyi Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Pencereyi yeniden boyutlandır" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Pencereyi yeniden boyutlandırmaya başla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Pencereyi esneterek yeniden boyutlandırmaya başla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Pencereyi normal şekilde yeniden boyutlandırmaya başla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Pencereyi taslak göstererek yeniden boyutlandırmaya başla" # include/nis_server/io.ycp:465 #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Pencereyi dikdörtgen şeklinde yeniden boyutlandırmaya başla" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Gergin" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Pencereleri Gergin Şekilde Yeniden Boyutlandır" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Normal yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Taslak görünümünde yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Dikdörtgen yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Gerginlik kullanılarak yeniden boyutlandırma kullanılacak pencereler" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" # clients/online_update.ycp:223 #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Çevirme Zamanı" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" # include/cups/ui.ycp:541 #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "İşaretçi Hassasiyeti" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Döndürürken Yüksel" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Döndürülürken pencereleri yükselt" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Küpü Döndür" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Döndürürken Sola Çevir" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Döndürürken Sağa Çevir" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Sola Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Pencere ile birlikte Sola Döndür" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Sağa Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Pencere ile birlikte Sağa Döndür" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Buraya Döndür" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "1. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "1. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "10. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "10. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "11. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "11. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "12. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "12. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "2. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "2. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "3. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "3. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "4. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "4. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "5. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "5. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "6. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "6. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "7. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "7. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "8. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "8. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "9. Yüze Döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "9. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Küpü Döndür" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Masaüstü küpünü döndür" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Sola döndür" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Sola döndür ve etkin pencereyi getir" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Sağa döndür" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Sağa döndür ve etkin pencereyi getir" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "1. yüze döndür ve etkin pencereyi yerleştir" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "1. Yüze Pencere ile Döndür" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "1. yüze döndür ve etkin pencereyi yerleştir" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "1. yüze döndür " #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "10. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "10. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "11. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "11. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "12. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "12. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "2. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "2. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "3. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "3. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "4. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "4. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "5. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "5. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "6. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "6. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "7. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "7. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "8. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "8. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "9. yüze döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "9. yüze döndür ve etkin pencereyi yerleştir" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Masaüstüne döndür" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Pencereyi döndür" # include/nis_server/io.ycp:465 #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Pencere ile birlikte döndür" # include/x11/resolution_dialog.ycp:81 #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Döndürme Hızlandırması" # classnames.ycp:73 #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Döndürme Hızı" # classnames.ycp:73 #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Döndürme zaman aralığı" # classnames.ycp:73 #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Döndürme Büyütmesi" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "İşaretçi hareketinin hassaslığı" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" # include/ui/wizard_hw.ycp:51 #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Döndürmeyi Başlat" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Masaüstü değiştirme zamanaşımı" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Büyüt" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Yüzde olarak matlık miktarı" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Büyük" # Kastedileni tam olarak anlayamadım. (drake) #: ../metadata/scale.xml.in.h:6 #, fuzzy msgid "Button Bindings Toggle Scale Mode" msgstr "Ölçeklendirme Kipine Geçen Düğme Bağlayıcıları" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Masaüstünü Göstermek için Masaüstüne Tıkla" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Arkaplanı Koyulaştır" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Pencereleri yeniden boyutlandırırken arkaplanı koyulaştır" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Simge" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Boyutlandırma sırasında masaüstüne tıklanırsa Masaüstünü Göster kipine geç" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Üzerine Gelme Süresi" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Pencere Tutucuyu Başlat" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Tüm Pencereler için Pencere Yakalayıcıyı Başlat" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Pencere Grubu için Pencere Yakalayıcıyı Başlat" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Geçerli Çıktıyı Kullanan Pencereler için Pencere Yakalayıcıyı Başlat" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Tüm pencereleri yerleştir ve dönüştür" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Pencere grubunu yerleştir ve dönüştür" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Pencereleri yerleştir ve dönüştür" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Geçerli çıktıyı kullanan pencereleri yerleştir ve dönüştür" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Tüm çıktı aygıtları üzerinde" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Sadece geçerli çıktı aygıtı üzerinde" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Örtülü Durum Simgesi" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Boyutlandırılan pencerelerin üzerinde simge göster" # menuentries/menuentry_scanner.ycp:36 #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Boyutlandır" # clients/inst_target_part.ycp:404 #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Pencereleri Boyutlandır" # clients/inst_environment.ycp:306 #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Boyutlandırma hızı" # clients/inst_environment.ycp:306 #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Boyutlandırma zamanı basamağı" # clients/inst_target_part.ycp:404 #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Pencereleri boyutlandır" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Çoklu çıktı aygıtı kullanılıyorken boyutlandırılmış pencereleri seçer." # clients/inst_target_part.ycp:404 #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Pencereler arasında bırakılacak boşluk" # /usr/lib/YaST2/keyboard_raw.ycp:200 #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Aralık" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Bir pencerenin üzerindeyken boyutlandırma kipi bitirilmeden önce geçmesi " "gereken süre (ms olarak)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Boyutlandırma kipinde boyutlandırılacak pencereler" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ekran görüntüsünü otomatik olarak bu uygulama ile aç" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Dizin" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Dikdörtgen ekran görüntüsünü başlat" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Uygulamayı Başlat" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Ekran görüntülerini bu dizine kaydet" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Ekran Görüntüsü" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Ekran görüntüsü yakalama eklentisi" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg resim yükleyici" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Yüzde olarak parlaklık miktarı" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Yüzde olarak doygunluk miktarı" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Uygulama Seçici" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Otomatik Döndür" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Öne Getir" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Seçilen pencereyi öne getir" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Masaüstünün pencereler değiştirilirken uzaklaştırılacağı mesafe" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Simge" # clients/inst_target_part.ycp:387 #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Küçültülmüş" # clients/inst_sw_single.ycp:146 #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Sonraki Panel" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Sonraki pencere" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Sonraki pencere (Tüm pencereler)" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Sonraki pencere (Açılabilir pencere yok)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Önceki Panel" # clients/inst_resize_ui.ycp:688 #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Önceki pencere" # clients/inst_resize_ui.ycp:688 #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Önceki pencere (Tüm pencereler)" # clients/inst_resize_ui.ycp:688 #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Önceki pencere (Açılabilir pencere yok)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Değiştirirken seçilen pencereyi döndür" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" # clients/inst_target_part.ycp:387 #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Küçültülmüş pencereleri göster" # clients/inst_environment.ycp:306 #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Değiştirici hızı" # clients/inst_environment.ycp:306 #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Değiştirici zaman aralığı" # clients/inst_target_part.ycp:404 #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Pencere değiştirici" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Değiştiricide gösterilmesi gereken pencereler" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 renklerini destekle" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Video Oynat" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Video oynat" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 renkleri" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Çizgi ekle" # clients/inst_custom_part.ycp:2928 #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Nokta ekle" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Değişik masaüstü hareketlerine su efekti ekler" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Yağmur damlaları arasında geçecek süre (ms olarak)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "İşaretçi su efektini etkinleştir" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Satır" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Yerleşim Boyutu" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Nokta" # clients/hwinfo.ycp:71 #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Yağmur Gecikmesi" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Pencere başlığı dalgası" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Yağmuru aç / kapat" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Yağmur efektini aç / kapat" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Siliciyi aç /kapat" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Siliciyi efektini aç /kapat" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Su Efekti" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Su yerleşim boyutu" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Pencere başlığı dalga efekti" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Odaklama Efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Pencere Odaklama Efekti" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Pencereleri Odakla" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Sürtünme" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Pencereleri Yakala" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Izgara Çözünürlüğü" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ters çevrilmiş pencere koparma efekti" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Pencereyi titret" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Haritalama Efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Pencere Haritalama Efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Pencereleri Haritala" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Büyütme Efekti" # clients/ui_widgets.ycp:182 clients/ui_widgets.ycp:210 #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "En Küçük Izgara Boyutu" # clients/ui_widgets.ycp:182 clients/ui_widgets.ycp:210 #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "En Küçük Tepe Izgara Boyutu" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Pencereleri Taşı" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Titreme" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Ters Çevrilmiş Şekilde Kopar" # clients/inst_target_part.ycp:387 #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Pencereleri kopar" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Sıçrama Sürtünmesi" # clients/hwinfo.ycp:104 #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K Sıçraması" # clients/hwinfo.ycp:104 #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Sıçrama Sabiti" # clients/inst_target_part.ycp:404 #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Pencere koparma efektini aç / kapat" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Sallanan pencere efekti için esneklik modelini kullan" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Tepe Izgara Çözünürlüğü" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Odaklandığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Yakalandığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Haritalandığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Taşındığında sallanacak pencereler" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Büyütülmüş ve büyütülmemiş durumdaki pencereler için sallanma efekti" # clients/inst_resize_ui.ycp:688 #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Sallanan Pencereler" # clients/support_registration.ycp:66 #~ msgid "Command line 0" #~ msgstr "0. komut satırı" #~ msgid "Run command 0" #~ msgstr "0. komutu çalıştır" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Ekran görüntüsü komut satırı" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Ekran görüntüsü komut satırı" #~ msgid "Filter Linear" #~ msgstr "Doğrusal Filtrele" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Büyütüldüğünde doğrusal filtreleme kullan" # clients/inst_sw_single.ycp:146 #~ msgid "Zoom Desktop" #~ msgstr "Masaüstünü Büyüt" #~ msgid "Zoom In" #~ msgstr "Büyüt" #~ msgid "Zoom Out" #~ msgstr "Küçült" #~ msgid "Zoom Pan" #~ msgstr "Büyüterek Görüntü Bindirme" #~ msgid "Zoom Speed" #~ msgstr "Büyütme Hızı" # classnames.ycp:73 #~ msgid "Zoom Timestep" #~ msgstr "Büyütme Zamanı Basamağı" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Masaüstü küpünü büyüt ve görüntüsünü bindir" #~ msgid "Zoom factor" #~ msgstr "Büyütme aralığı" #~ msgid "Zoom pan" #~ msgstr "Büyüt ve görüntüyü bindir" # include/partitioning/auto_part_ui.ycp:147 #~ msgid "Decrease window opacity" #~ msgstr "Pencere matlığını düşür" #~ msgid "Increase window opacity" #~ msgstr "Pencere matlığını arttır" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Öntanımlı olarak saydam olması gereken, pencereler için matlık değerleri" # clients/inst_target_part.ycp:404 #~ msgid "Opacity windows" #~ msgstr "Pencereleri matlaştır" #~ msgid "Background Images" #~ msgstr "Arkaplan Resimleri" #~ msgid "Background images" #~ msgstr "Arkaplan resimleri" # clients/inst_target_part.ycp:404 #~ msgid "Place windows on a plane" #~ msgstr "Pencereleri bir uçağın üzerine koy" # clients/inst_target_part.ycp:404 #~ msgid "Plane Down" #~ msgstr "Aşağıya Uçur" #~ msgid "Plane Left" #~ msgstr "Sola Uçur" #~ msgid "Plane Right" #~ msgstr "Sağa Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 1" #~ msgstr "1. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 10" #~ msgstr "10. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 11" #~ msgstr "11. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 12" #~ msgstr "12. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 2" #~ msgstr "2. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 3" #~ msgstr "3. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 4" #~ msgstr "4. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 5" #~ msgstr "5. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 6" #~ msgstr "6. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 7" #~ msgstr "7. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 8" #~ msgstr "8. Yüze Uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane To Face 9" #~ msgstr "9. Yüze Uçur" # clients/inst_target_part.ycp:404 #~ msgid "Plane Up" #~ msgstr "Yukarıya Uçur" # clients/inst_target_part.ycp:404 #~ msgid "Plane down" #~ msgstr "Aşağıya Uçur" #~ msgid "Plane left" #~ msgstr "Sola uçur" #~ msgid "Plane right" #~ msgstr "Sağa uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 1" #~ msgstr "1. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 10" #~ msgstr "10. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 11" #~ msgstr "11. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 12" #~ msgstr "12. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 2" #~ msgstr "2. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 3" #~ msgstr "3. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 4" #~ msgstr "4. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 5" #~ msgstr "5. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 6" #~ msgstr "6. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 7" #~ msgstr "7. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 8" #~ msgstr "8. yüze uçur" # include/nis_server/io.ycp:465 #~ msgid "Plane to face 9" #~ msgstr "9. yüze uçur" # clients/inst_target_part.ycp:404 #~ msgid "Plane up" #~ msgstr "Uçur" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Masaüstü Penceresinin Matlığının Solma Zamanı." ./po/zu.po0000644000004100000410000017573113246301623012675 0ustar www-datawww-data# Copyright (C) 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: installation\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2006-11-03 14:26\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Ilungiselela ukuqala..." #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Gcina ukuhlela" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Gcina ukuhlela" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Gcina ukuhlela" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Ungakhethi &Lutho" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Ungakhethi &Lutho" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Ukukhethwa Kwekhathalogi" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Amakhomandi:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Ikhomandi '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Ikhomandi '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Ungakhethi &Lutho" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Ungakhethi &Lutho" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Vuselela kabusha" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Ilungiselela ukuqala..." #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Amakhomandi:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Ungakhethi &Lutho" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Ungakhethi &Lutho" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Ungakhethi &Lutho" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Ikhomandi '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Ikhomandi '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Ungakhethi &Lutho" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Gcina ukuhlela" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Ungakhethi &Lutho" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Ungakhethi &Lutho" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Ilungiselela ukuqala..." #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Ilungiselela ukuqala..." #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Ilungiselela ukuqala..." #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Ungakhethi &Lutho" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Ungakhethi &Lutho" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Ungakhethi &Lutho" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Ukufaka Uhlelo Kuphothuliwe" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Iqalisa Ukufaka Uhlelo..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Ilungiselela ukuqala..." #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Ungakhethi &Lutho" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Ungakhethi &Lutho" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "&I-Local Directory..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ukukhethwa Kwekhathalogi" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Ilungiselela ukuqala..." #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Ngesikhathi Iqaliswa Kabusha" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Ungakhethi &Lutho" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Ungakhethi &Lutho" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Ungakhethi &Lutho" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Ngesikhathi Iqaliswa Kabusha" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Ikhomandi '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Ikhomandi '%1'" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Ukufaka Uhlelo Kuphothuliwe" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Ukufaka Uhlelo Kuphothuliwe" #~ msgid "Unknown" #~ msgstr "Akwaziwa" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Gcina ukuhlela" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Ukufaka Uhlelo Kuphothuliwe" ./po/el.po0000644000004100000410000034324313246301623012632 0ustar www-datawww-data# Compiz Core Greek Translation. # Copyright (C) 2007 compiz-fusion.org # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the Compiz package. # Δημήτρης (djdoo) , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz 0.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-30 10:16+0200\n" "Last-Translator: Jim Dusis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Επιφάνεια εργασίας" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Διαχείρηση Παραθύρου" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Κανένα" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Σκίαση" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Μεγιστοποίησε" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Μεγιστοποίηση Οριζόντια" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Μεγιστοποίηση Κάθετα" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Ελαχιστοποίηση" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Ανύψωση" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Χαμηλότερο" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Μενού Παραθύρου" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Ενέργεια που θα λάβει χώρα όταν περιστρέφετε τη ρόδα του ποντικιού πάνω σε " "μια μπάρα τίτλου ενός παραθύρου." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Είδος θολώματος" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Αδιαφάνεια θέματος ενεργού παραθύρου του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Σκίαση αδιαφάνειας θέματος ενεργού παραθύρου του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Αδιαφάνεια θέματος του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Σκίαση αδιαφάνειας θέματος του Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Αδιαφάνεια για χρήση στα ενεργά παράθυρα με θέματα διακοσμήσεων του metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Αδιαφάνεια για χρήση στα θέματα διακοσμήσεων του metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Σκίαση ενεργών παραθύρων με θέματα διακοσμήσεων του metacity από αδιαφανές " "σε διάφανο" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Σκίαση παραθύρων με θέματα διακοσμήσεων του metacity από αδιαφανές σε διάφανο" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Ενέργεια ρόδας ποντικιού στην μπάρα τίτλου" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Είδος θολώματος για χρήση στις διακοσμήσεις παραθύρων" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Χρήση θέματος του metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" "Χρήση θέματος του metacity όταν ζωγραφίζονται οι διακοσμήσεις παραθύρων" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Κλείσιμο Παραθύρου" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Απομεγιστοποίηση Παραθύρου" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Μεγιστοποίηση Παραθύρου" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Ελαχιστοποίηση Παραθύρου" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Επικάλυψη" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Καρφίτσωμα" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Αποσκίαση" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Μη Επικάλυψη" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Ξεκαρφίτσωμα" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Το παράθυρο \"%s\" δεν ανταποκρίνεται." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Ο εξαναγκασμός αυτής της εφαρμογής να τερματιστεί θα προκαλέσει απώλεια των " "μη σωσμένων αλλαγών." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Εξαναγκασμός Τερματισμού" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Επισημείωση" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Χρώμα Γεμίσματος Επισημείωσης" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Χρώμα Πινελιάς Επισημείωσης" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Πρόσθετο επισημείωση" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Καθάρισμα" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Σχεδίαση" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Σχεδίαση με εργαλείο" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Γέμισμα χρώματος για επισημειώσεις" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Εκκίνηση" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Εκκίνηση ζωγραφίσματος επισημείωσης" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Εκκίνηση σβησίματος επισημείωσης" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Εκκίνηση σβησίματος" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Πλάτος γραμμής" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Πλάτος γραμμής για επισημειώσεις" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Χρώμα πινελιάς για επισημειώσεις" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Πλάτος πινελιάς" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Πλάτος πινελιάς για επισημειώσεις" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Θόλωμα Άλφα" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Θόλωμα άλφα παραθύρων" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Φίλτρο Θολώματος" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Φράξιμο Θολώματος" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Κορεσμός Θολώματος" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Ταχύτητα Θολώματος" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Θόλωμα Παραθύρων" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Θόλωμα πίσω απ τα διάφανα τμήματα των παραθύρων" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Κορεσμός θολώματος" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Θόλωμα παραθύρων" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Θόλωμα μη εστιασμένων παραθύρων" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Απενεργοποίηση του θολώματος των περιοχών που καλυπτονται απο άλλα παραθυρα" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Μέθοδος φιλταρίσματος που χρησιμοποιείται για θόλωμα" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Θόλωμα εστίασης" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Θόλωμα εστίασης" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussian" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Ακτίνα Gaussian" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Ισχύς Gaussian" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Ακτίνα gaussian" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Ισχύς gaussian" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Τέχνασμα ανεξάρτητης υφής" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "ΕΛ Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Επίπεδο-λεπτομέρειας mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Παλμός" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Εφέ παλμού" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Χρήση των διαθέσιμων μονάδων υφών για πραγματοποίηση όσο το δυνατό " "περισσότερων τεχνασμάτων ανεξάρτητης υφής." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Ταχύτητα θολώματος παραθύρων" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Παράθυρα που πρέπει να επηρεαστούν απο το θολωμα εστίασης" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Παράθυρα που πρέπει να χρησιμοποιήσουν ως προεπιλογή το θόλωμα αλφα" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Αποτέλεσμα Εξόδου Κλωνοποίησης" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Εκκίνηση επιλογής κλωνοποίησης" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Χειριστής αποτελέσματος εξόδου κλωνοποίησης" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ένας συνδυασμός πλήκτρων που όταν επικαλεσθεί, θα τρέξει την εντολή κέλυφους " "αναγνωρισμένη ως εντολή9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Ένας συνδυασμός άκρης οθόνης που όταν επικαλεσθεί, θα τρέξει την εντολή " "κέλυφους αναγνωρισμένη ως εντολή9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Ορίζει συνδυασμούς σε αυθαίρετες εντολές" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Συνδυασμοί Κουμπιών" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Γραμμή εντολών 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Γραμμή εντολών 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Γραμμή εντολών 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Γραμμή εντολών 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Γραμμή εντολών 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Γραμμή εντολών 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Γραμμή εντολών 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Γραμμή εντολών 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Γραμμή εντολών 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Γραμμή εντολών 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Γραμμή εντολών 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Γραμμή εντολών 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Γραμμή εντολών για εκτέλεση σε κέλυφος όταν επικαλεσθεί το τρέξιμο_εντολής9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Εντολές" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Συνδυασμοί Άκρων Οθόνης" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Συνδυασμοί Πλήκτρων" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Τρέξιμο εντολής 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Τρέξιμο εντολής 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Τρέξιμο εντολής 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Τρέξιμο εντολής 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Τρέξιμο εντολής 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Τρέξιμο εντολής 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Τρέξιμο εντολής 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Τρέξιμο εντολής 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Τρέξιμο εντολής 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Τρέξιμο εντολής 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Τρέξιμο εντολής 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Τρέξιμο εντολής 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Ενεργά Πρόσθετα" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Επέτρεψε τη σχεδίαση πλήρους οθόνης παραθύρων να μην επανακατευθύνονται στα " "εκτός οθόνης pixmaps" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Ηχητικό Καμπανάκι" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Ηχητικό μπιπ συστήματος" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Αυτόματη Ανύψωση" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Καθυστέρηση Αυτόματης Ανύψωσης" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Αυτόματος εντοπισμός των συσκευών εξόδου" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Αυτόματος εντοπισμός του ρυθμού ανανέωσης" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Βέλτιστο" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Κλικ Για Εστίαση" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Κλικ σε παράθυρο μεταφέρει την εστίαση εισόδου σε αυτό" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Κλείσιμο ενεργού παραθύρου" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Προεπιλεγμένο Εικονίδιο" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Προεπιλεγμένη εικόνα εικονιδίου παραθύρου" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Μέγεθος Επιφάνειας Εργασίας" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Ανίχνευση Εξόδων" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Ανίχνευση Ρυθμού Ανανέωσης" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Ρυθμίσεις Οθόνης" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Διάρκεια χρόνου που πρέπει ο δείκτης του ποντικιού να παραμείνει σε μια " "γωνία της οθόνης πριν η ενέργεια που έχει οριστεί σ αυτή την άκρη να " "πραγματοποιηθεί." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Καθυστέρηση Διακόπτη 'Ακρης" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Γρήγορο" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Εστιάση & Συμπεριφορά Ανύψωσης" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Εστίαση Προληπτικού Επιπέδου" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Εστίαση Προστατευμένων Παραθύρων" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Εστίαση προστατευμένων παραθύρων" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Εξαναγκασμός ανεξάρτητης απεικόνισης." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Γενικές Επιλογές" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Γενικές επιλογές του compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Καλό" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Απόκρυψη Αγνοημένων Παραθύρων Γραμμής Εργασιών" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Απόκρυψη όλων των παραθύρων και εστίαση στην επιφάνεια εργασίας" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Απόκρυψη παραθύρων που δεν βρίσκονται στην γραμμή εργασιων κατα την μετάβαση " "στην κατάσταση εμφάνισης επιφάνειας εργασίας" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Υψηλό" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Οριζόντιο Εικονικό Μέγεθος" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Εαν είναι διαθέσιμο χρήση συμπίεσης για υφές που έχουν προέλθει από εικόνες" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Αγνόηση Υποδείξεων Στη Μεγιστοποίηση" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Αγνόηση αύξησης μεγέθους και υποδείξεων αναλογίας όταν το παράθυρο " "μεγιστοποιείται" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Διάστημα πριν την ανύψωση των επιλεγμένων παραθύρων" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Διάστημα μεταξύ των μηνυμάτων ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Συνδυασμοί πλήκτρων" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Επίπεδο αποφυγής απόσπασης εστίασης" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Φωτισμός" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Λίστα των τρέχοντων ενεργών προσθέτων" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Λίστα με προσδιοριστικά στρινγκ για τις συσκευές εξόδου" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Χαμηλό" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Κατέβασμα Παραθύρου" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Κατέβασμα παραθύρου κάτω απ τα άλλα παράθυρα" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Μεγιστοποίηση Παραθύρου Οριζόντια" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Μεγιστοποίηση Παραθύρου Κάθετα" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Μεγιστοποίηση ενεργού παραθύρου" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Μεγιστοποίηση ενεργού παραθύρου οριζόντια" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Μεγιστοποίηση ενεργού παραθύρου κάθετα" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Ελαχιστοποίηση ενεργού παραθύρου" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Κανονική" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Αριθμός Επιφανειών Εργασίας" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Αριθμός ψεύτικων επιφανειών εργασίας" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Κλειστό" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Πραγματοποίηση ανανεώσεων οθόνης μόνο κατα τη διάρκεια της κάθετης " "περιοδικής ανανέωσης" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Αποτελέσματα-Εξοδοι" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Χειρισμός Επικάλλυψης Αποτύπωσης" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "Δούλεψε κάθε οθόνη ανεξάρτητα, ακόμα κ αν οι οθόνες επικαλύπτονται" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Καθυστέρηση Ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Προτίμηση μεγαλύτερης απεικόνισης" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Προτίμηση μικρότερης απεικόνισης" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Ανύψωση Με Κλικ" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Ανύψωση Παραθύρου" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Ανύψωση επιλεγμένων παραθύρων μετα απ το διάστημα" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Ανύψωση παραθύρου πάνω απ τα άλλα παράθυρα" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Ανύψωση παραθύρων όταν κλικαριστούν" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Ρυθμός Ανανέωσης" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Πολλαπλασιαστής μεγέθους οθόνης για οριζόντιο εικονικό μέγεθος" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Πολλαπλασιαστής μεγέθους οθόνης για κάθετο εικονικό μέγεθος" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Εμφάνιση Επιφάνειας Εργασίας" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Αργές Γραφικές Απεικονίσεις" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Έξυπνη κατάσταση " #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Συγχρονισμός Στην Καθετη Ανανέωση" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Συμπίεση υφών" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Φίλτρο Υφών" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Φιλτράρισμα υφών" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Ο ρυθμός κατα τον οποίο η οθόνη επανασχεδιάζεται (φορές/δευτερόλεπτο)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Εκκίνηση-Σταμάτημα Μεγιστοποίησης Παραθύρου" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Εκκίνηση-Σταμάτημα Μεγιστοποίησης Παραθύρου Οριζόντια" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Εκκίνηση-Σταμάτημα Μεγιστοποίησης Παραθύρου Κάθετα" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Εκκίνηση-Σταμάτημα Σκίασης Παραθύρου" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Εκκίνηση-Σταμάτημα μεγιστοποίησης ενεργού παραθύρου" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Εκκίνηση-Σταμάτημα μεγιστοποίησης ενεργού παραθύρου οριζόντια" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Εκκίνηση-Σταμάτημα μεγιστοποίησης ενεργού παραθύρου κάθετα" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Εκκίνηση-Σταμάτημα σκίασης ενεργού παραθύρου" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Εκκίνηση-Σταμάτημα της χρήσης των αργών γραφικών απεικονίσεων" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Απομεγιστοποίηση ενεργού παραθύρου" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Μη-επανακατεύθυνση Παραθύρων Πλήρους Οθόνης" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Χρήση διάχυτου φωτός όταν η οθόνη μεταμορφώνεται" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Κάθετο Εικονικό Μέγεθος" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Πολύ Υψηλό" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Ποια απ τις επικαλλύπτουσες οθόνες πρέπει να προτιμηθεί" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Συνδυασμός κουμπιών μενού παραθύρου" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Συνδυασμός πλήκτρων μενού παραθύρου" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Επιτάχυνση" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ρύθμιση Εικόνας" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ρύθμιση εικόνας πάνω όψης για περιστροφή" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Προχώρημα στο επόμενο σλάιντ" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Κίνηση Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Κίνηση skydome όταν περιστρέφεται ο κύβος" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Εμφάνιση" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Αυτόματα" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Συμπεριφορά" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Χρώμα των πάνω κ κάτω πλευρών του κύβου" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Χρώμα για χρήση με το κάτω στοπ-χρώματος της διαβάθμισης του skydome-fallback" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Χρώμα για χρήση με το κορυφαίο στοπ-χρώματος της διαβάθμισης του skydome-" "fallback" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Καπάκια Κύβου" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Χρώμα Κύβου" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Κύβος Επιφάνειας Εργασίας" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Επιτάχυνση Διπλώματος" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Ταχύτητα Διπλώματος" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Χρονικό Βήμα Διπλώματος" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Δημιουργία mipmaps όταν γίνεται για ανώτερη ποιότητα κλιμάκωσης" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Πήγαινε πίσω στο προηγούμενο σλάιντ" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Αρχεία εικόνας" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Εικόνα για χρήση ως υφή για το skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Εκκινεί την διαφάνεια του Κύβου μόνο όταν η περιστροφή οδηγηθεί από το " "ποντίκι" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Εσωτερικός Κύβος" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Εσωτερικός κύβος" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Λίστα από αρχεία PNG και SVG που πρέπει να εμφανίζονται στην πάνω όψη του " "κύβου" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Kατάσταση Πολλαπλών Οθονών" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Πολλαπλοί κύβοι" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Επόμενο Σλάιντ" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Ένας μεγάλος κύβος" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Αδιαφάνεια Kατα την Περιστροφή" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Αδιαφάνεια Όταν Δεν Γίνεται Περιστροφή" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Αδιαφάνεια του παραθύρου στην επιφάνεια εργασίας κατα την περιστροφή." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" "Αδιαφάνεια του παραθύρου στην επιφάνεια εργασίας όταν δεν γίνεται περιστροφή." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Τοποθέτηση παραθύρων στον κύβο" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Προηγούμενο Σλάιντ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Εμφάνιση skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Κλιμάκωση εικόνας" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Κλιμάκωση εικόνων για κάλυψη της πάνω όψης του κύβου" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Επιλεγει το πως ο κύβος θα εμφανίζεται εαν χρησιμοποιηθούν πολλαπλές οθόνες." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Τελικό Χρώμα Διαβάθμισης Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Αρχικό Χρώμα Διαβάθμισης Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Εικόνα Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Ταχύτητα" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Χρονικό Βήμα" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Διαφάνεια Μόνο στην Περιστροφή με το Ποντίκι" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Διάφανος Κύβος" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Ξεδίπλωμα" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Ξεδίπλωμα κύβου" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Κύρια Εφαρμογή Ελέγχου του Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Επιτρέπει στα mipmaps να δημιουργούνται για υφές διακοσμήσεων" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Εντολή" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Διακοσμήσεις παραθύρων" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Γραμμή εντολών διακοσμητή που θα εκτελείται αν κανένας διακοσμητής δεν " "τρέχει ήδη" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Απόρριψη μετάθεσης αρχής σκιάς Χ" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Απόρριψη μετάθεσης αρχής σκιάς Υ" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Απόρριψη χρώματος σκιάς" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Απόρριψη αδιαφάνειας σκιάς" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Απόρριψη ακτίνας σκιάς" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Χρώμα Σκιάς" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Μετάθεση Αρχής X της Σκιάς" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Μετάθεση Αρχής Υ της Σκιάς" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Αδιαφάνεια Σκιάς" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Ακτίνα Σκιάς" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Παράθυρα με σκιά" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Διακοσμησή Παραθύρου" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Διακοσμήσεις παραθύρου" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Παράθυρα που πρέπει να διακοσμηθούν" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Παράθυρα που πρέπει να έχουν σκιά" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Φωτεινότητα (σε %) των μη-ανταποκρινόμενων παραθύρων" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Σταθερή ταχύτητα" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Σταθερός χρόνος" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Σκοτείνιασμα Μη-Ανταποκρινόμενων Παραθύρων" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Σκοτείνιασμα παραθύρων που δεν ανταποκρίνονται στις εντολές του διαχειριστή " "παραθύρων" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Είδος Ξεθωριάσματος" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ξεθώριασμα στο Άνοιγμα/Κλείσιμο/Ελαχιστοποίηση" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Ταχύτητα Ξεθωριάσματος" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Χρόνος Ξεθωριάσματος" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Εφέ ξεθωριάσματος στο άνοιγμα/κλείσιμο/ελαχιστοποίηση παραθύρων" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Εφέ ξεθωριάσματος στο μπίπ συστήματος" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Ξεθώριασμα μέσα παραθύρων όταν χαρτογραφούνται και ξεθώριασμα έξω όταν τα " "παράθυρα αποχαρτογραφούνται" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ξεθώριασμα παραθύρων" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Ξεθωριάζοντας Παράθυρα" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Οπτικό Κουδούνι Πλήρους Οθόνης" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Εφέ ξεθωριάσματος πλήρους οθόνης στο μπίπ συστήματος" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Κορεσμός (σε %) των μη-ανταποκρινόμενων παραθύρων" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Φωτεινότητα Μη-Ανταποκρινόμενων Παραθύρων" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Κορεσμός Μή-Ανταποκρινόμενων Παραθύρων" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Οπτικό Κουδούνι" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Είδος ξεθωριάσματος παραθύρου" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ταχύτητα ξεθωριάσματος παραθύρου στην κατάσταση \"Σταθερής ταχύτητας\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Χρόνος ξεθωριάσματος παραθύρου (σε ms) στην κατάσταση \"Σταθερής Ταχύτητας\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Παράθυρα που πρέπει να ξεθωριάζουν" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Σημείο Προσάρτησης" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Σημείο προσάρτησης" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Σύστημα Αρχείων Userspace" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Σύστημα αρχείων χρήστη" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Κύρια Εφαρμογή Ελέγχου του GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Κύριος βρόγχος υποστήριξης GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Συμβατότητα με Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Ανοιγμα ενός τερματικού" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Επιλογές που διατηρούν το Compiz συμβατό με το περιβάλλον επιφάνειας " "εργασίας Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Τρέξιμο Διαλόγου" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Τρέξε εντολή τερματικού" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Γραμμή εντολών αρπαγής οθόνης" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Εμφάνιση Κύριου Μενού" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Εμφάνιση διαλόγου Τρεξίματος Εφαρμογής" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Εμφάνιση του κύριου μενού" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Τράβα μια αρπαγή οθόνης" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Τράβα μια αρπαγή οθόνης ενός παραθύρου" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Γραμμή εντολών τερματικού" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Γραμμή εντολών αρπαγής οθόνης παραθύρου" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Εφαρμογή Ελέγχου των Ini Αρχείων" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Πρόσθετο ειδοποίησης αλλαγής αρχείου" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Κύρια Εφαρμογή ελέγχου του KConfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Εφέ Ελαχιστοποίησης" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Ελαχιστοποίηση Παραθύρων" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Ταχύτητα ελαχιστοποίησης" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Χρονικό βήμα ελαχιστοποίησης" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Αντίσταση στη Σκίαση" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Αντίσταση στη σκίαση" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" "Μετατροπή παραθύρων όταν είναι ελαχιστοποιημένα και μή-ελαχιστοποιημένα" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Παράθυρα που θα μετατραπούν οταν ελαχιστοποιηθούν" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Περιορισμός Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Περιορισμός Υ συντεταγμένης στην περιοχή της επιφάνειας εργασίας" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Μην ενημερώνεις την θέση των παραθύρων στoν server μέχρι το τέλος της " "μετακίνησης" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Έναρξη Μετακίνησης Παραθύρου" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Οκνηρός Προσδιορισμός Θεσης" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Μετακίνηση Παραθύρου" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Μετακίνηση παραθύρου" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Αδιαφάνεια" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Επίπεδο αδιαφάνειας των παραθύρων που μετακινούνται" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Αρπαγή και αυτομάτως απομεγιστοποίηση μεγιστοποιημένων παραθύρων στο τράβηγμα" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Αρπαγή μεγιστοποιημένων παραθύρων" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Έναρξη μετακίνησης παραθύρου" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Φωτεινότητα" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Μείωση Φωτεινότητας" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Αύξηση Φωτεινότητας" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Βήμα Φωτεινότητας" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Τιμές φωτεινότητας παραθύρων" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Μείωση" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Αύξηση" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Μείωση αδιαφάνειας" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Αύξηση αδιαφάνειας" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Βήμα Αδιαφάνειας" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Τιμές αδιαφάνειας παραθύρων" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Αδιαφάνεια, Φωτεινότητα και Κορεσμός " #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ρυθμίσεις Αδιαφάνειας, Φωτεινότητας και Κορεσμού" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Κορεσμός" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Μείωση Κορεσμού" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Αύξηση Κορεσμού" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Βήμα Κορεσμού" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Τιμές κορεσμού παραθύρων" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Βήμα" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Συγκεκριμένες ρυθμίσεις παραθύρου" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Τιμές παραθύρου" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Παράθυρα" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Παράθυρα που πρέπει να έχουν διαφορετική φωτεινότητα εξ' ορισμού" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Παράθυρα που πρέπει να έχουν διαφορετική διαφάνεια εξ' ορισμού" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Παράθυρα που πρέπει να έχουν διαφορετικό κορεσμό εξ' ορισμού" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Αλγόριθμος για τοποθέτηση των παραθύρων" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Κατταράκτης" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Στο Κέντρο" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Σταθερή Τοποθέτηση Παραθύρου" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Εξαναγκασμός Τοποθέτησης Παραθύρων" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Οριζόντιες θέσεις εικονικών επιφανειών εργασίας" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Διατήρηση Στον Χώρο Εργασίας" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Διατήρηση του τοποθετημένου παραθύρου στον χώρο εργασίας, ακόμα κ αν αυτό " "σημαίνει οτι η θέση του μπορεί να διαφέρει απο την καθορισμένη του θέση" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Τοποθέτηση Παραθύρων" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Τοποθέτηση σε όλες τις οθόνες" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Τοποθέτηση παραθύρων στις κατάλληλες θέσεις όταν ταξινομούνται" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Τρόπος τοποθέτησης" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Τοποθετημένα παράθυρα" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Τυχαία" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Επιλέγει το πως η τοποθέτηση παραθύρων θα συμπεριφερθεί αν γινει χρήση " "πολλαπλών οθονών" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Έξυπνο" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Χρήση της ενεργής συσκευής εξόδου" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Χρήση της συσκευής εξόδου του εστιασμένου παραθύρου" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Χρήση της συσκευής εξόδου με τον δείκτη" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Κάθετες θέσεις εικονικών επιφανειών εργασίας" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Τοποθετημένα παράθυρα στις εικονικές επιφάνειες εργασίας" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Μοντίφες για τοποθέτηση παραθύρων" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Παράθυρα που πρέπει να τοποθετηθούν εξ' ορισμού" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Παράθυρα που θα τοποθετηθούν σε συγκεκριμένες εικονικές επιφάνειες εργασίας " "εξ' ορισμού" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Παράθυρα που πρέπει αναγκαστικά να τοποθετηθούν, ακόμα κ αν υποδεικνύουν " "στον διαχειριστή παραθύρων οτι πρέπει να αποφύγει να τα τοποθετήσει." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Παράθυρα με σταθερές θέσεις" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Παράθυρα με σταθερές εικονικές επιφάνειες εργασίας" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Μοντίφες" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Θέσεις Χ" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Θέσεις Χ Εικονικών Επιφανειών Εργασίας" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Τιμές θέσης Χ" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Θέσεις Υ" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Θέσεις Υ Εικονικών Επιφανειών Εργασίας" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Τιμές θέσης Υ" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Φορτωτής εικόνων Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Ταίριαγμα Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Ταίριαγμα παραθύρου regex" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Συνδυασμοί" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Χρώμα Ορίου" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Χρώμα ορίου για τις καταστάσεις μορφοποίησης τετράγωνο και περίγραμμα" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Προκαθορισμένη Κατάσταση Μορφοποίησης" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Προκαθορισμένη κατάσταση για μορφοποιήση παραθύρου" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Χρώμα Γεμίσματος" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Χρώμα για χρήση στην τετράγωνη κατάσταση μορφοποίησης" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Εκκίνηση Κανονικής Μορφοποίησης Παραθύρου" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Εκκίνηση Μορφής Μορφοποίησης Περιγράμματος" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Εκκίνηση Τετράγωνης Μορφής Μορφοποίησης" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Εκκίνηση Μορφής Μορφοποίησης Παραμορφώσεως" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Εκκίνηση Μορφοποίησης Παραθύρου" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Κανονική Μορφοποίηση Παραθύρων" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Περίγραμμα" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Μορφοποίηση Περίγράμματος" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Τετράγωνο" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Τετράγωνη Μορφοποίηση Παραθύρων" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Μορφοποίηση Παραθύρου" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Μορφοποίηση παραθύρου" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Έναρξη μορφοποίησης παραθύρου" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Έναρξη μορφοποίησης παραθύρου παραμορφώνοντάς το" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Έναρξη μορφοποίησης παραθύρου κανονικά" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Έναρξη μορφοποίησης παραθύρου με περίγραμμα" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Έναρξη μορφοποίησης παραθύρου με το τετράγωνο" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Παραμόρφωση" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Μορφοποίηση Παραθύρου με Παραμόρφωση" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Παράθυρα στα οποία θα χρησιμοποιηθεί κανονική μορφοποίηση" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Παράθυρα στα οποία θα χρησιμοποιηθεί μορφοποίηση περιγράμματος" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Παράθυρα στα οποία θα χρησιμοποιηθεί τετραγωνική μορφοποίηση" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Παράθυρα στα οποία θα χρησιμοποιηθεί μορφοποίηση με παραμόρφωση" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Γύρισμα Άκρης DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Γύρισμα Άκρης με Μετακίνηση" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Γύρισμα Άκρης με Δείκτη" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Χρόνος Γυρίσματος" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Γύρισμα στην αριστερή εικονική επιφάνεια εργασίας και τύλιγμα δείκτη" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Γύρισμα στην επόμενη εικονική επιφάνεια εργασίας όταν τραβιέται αντικείμενο " "στην άκρη της οθόνης" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Γύρισμα στην επόμενη εικονική επιφάνεια εργασίας όταν μετακινείται ο δείκτης " "στην άκρη της οθόνης" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Γύρισμα στην επόμενη εικονική επιφάνεια εργασίας όταν μετακινείται " "παράθυροστην άκρη της οθόνης" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Γύρισμα στην δεξιά εικονική επιφάνεια εργασίας και τύλιγμα δείκτη" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Αναστροφή στον Υ άξονα για μετακίνηση του δείκτη" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Αναστροφή Υ Δείκτη" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Ευαισθησία Δείκτη" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Ανύψωση στην περιστροφή" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Ανύψωση παραθύρου στην περιστροφή" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Περιστροφή Κύβου" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Περιστροφή Γύρισμα Αριστερά" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Περιστροφή Γύρισμα Δεξιά" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Περιστροφή Αριστερά" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Περιστροφή Αριστερά με Παράθυρο" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Περιστροφή Δεξιά" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Περιστροφή Δεξιά με Παράθυρο" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Περιστροφή Στο" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Περιστροφή Στην Όψη 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Περιστροφή Στην Όψη 1 με Παράθυρο" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Περιστροφή Στην Όψη 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Περιστροφή Στην Όψη 10 με Παράθυρο" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Περιστροφή Στην Όψη 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Περιστροφή Στην Όψη 11 με Παράθυρο" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Περιστροφή Στην Όψη 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Περιστροφή Στην Όψη 12 με Παράθυρο" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Περιστροφή Στην Όψη 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Περιστροφή Στην Όψη 2 με Παράθυρο" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Περιστροφή Στην Όψη 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Περιστροφή Στην Όψη 3 με Παράθυρο" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Περιστροφή Στην Όψη 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Περιστροφή Στην Όψη 4 με Παράθυρο" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Περιστροφή Στην Όψη 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Περιστροφή Στην Όψη 5 με Παράθυρο" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Περιστροφή Στην Όψη 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Περιστροφή Στην Όψη 6 με Παράθυρο" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Περιστροφή Στην Όψη 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Περιστροφή Στην Όψη 7 με Παράθυρο" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Περιστροφή Στην Όψη 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Περιστροφή Στην Όψη 8 με Παράθυρο" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Περιστροφή Στην Όψη 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Περιστροφή Στην Όψη 9 με Παράθυρο" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Περιστροφή του κύβου" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Περιστροφή κύβου επιφάνειας εργασίας" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Περιστροφή αριστερά" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Περιστροφή αριστερά και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Περιστροφή δεξιά" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Περιστροφή δεξιά και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Περιστροφή του κύβου στην όψη 1" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Περιστροφή του κύβου στην όψη 1 με παράθυρο" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Περιστροφή στην όψη 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Περιστροφή στην όψη 1 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Περιστροφή στην όψη 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Περιστροφή στην όψη 10 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Περιστροφή στην όψη 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Περιστροφή στην όψη 11 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Περιστροφή στην όψη 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Περιστροφή στην όψη 12 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Περιστροφή στην όψη 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Περιστροφή στην όψη 2 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Περιστροφή στην όψη 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Περιστροφή στην όψη 3 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Περιστροφή στην όψη 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Περιστροφή στην όψη 4 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Περιστροφή στην όψη 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Περιστροφή στην όψη 5 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Περιστροφή στην όψη 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Περιστροφή στην όψη 6 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Περιστροφή στην όψη 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Περιστροφή στην όψη 7 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Περιστροφή στην όψη 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Περιστροφή στην όψη 8 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Περιστροφή στην όψη 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Περιστροφή στην όψη 9 και μεταφορά ενεργού παραθύρου κατα μήκος" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Περιστροφή στην εικονική επιφάνεια εργασίας" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Περιστροφή παραθύρου" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Περιστροφή με παράθυρο" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Επιτάχυνση Περιστροφής" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Ταχύτητα Περιστροφής" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Χρονικό Βήμα Περιστροφής" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Ζουμ Περιστροφής" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Ευαισθησία της μετακίνησης του δείκτη" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Αρπαγή Περιστροφής Κύβου στην Κάτω Όψη" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Αρπαγή Περιστροφής Κύβου στην Πάνω Όψη" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Αρπαγή Στην Κάτω Όψη" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Αρπαγή Στην Πάνω Όψη" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Έναρξη Περιστροφής" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Τέλος χρόνου πριν το γύρισμα της εικονικής επιφάνειας εργασίας" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Ζουμ" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Ποσοστό αδιαφάνειας επι της εκατό" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Μεγάλο" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Συνδυασμοί Κουμπιών για Εκκίνηση-Σταμάτημα Κατάστασης Κλιμάκωσης" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Συνδυασμοί κουμπιών που αντιθέτως λειτουργούν ως διακόπτης για την κατάσταση " "κλιμάκωσης την ενεργοποιούν όταν πατηθούν και απενεργοποιούν όταν αφεθούν." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Κλικ στην Επιφάνεια Εργασίας για Εμφάνιση Επιφάνειας Εργασίας" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Σκοτείνιασμα Φόντου" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Σκοτείνιασμα φόντου στην κλιμάκωση παραθύρων" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Έμβλημα" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Είσοδος στην κατάσταση Εμφάνισης Επιφάνειας Εργασίας όταν η Επιφάνεια " "Εργασίας κλικαριστεί κατα τη διάρκεια της Κλιμάκωσης" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Χρόνος Αιώρησης" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Εκκίνηση Διαλογέα Παραθύρου" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Εκκίνηση Διαλογέα Παραθύρου Για Όλα τα Παράθυρα" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Εκκίνηση Διαλογέα Παραθύρου Για Ομάδα Παραθύρων" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Εκκίνηση Διαλογέα Παραθύρου Για Παράθυρα στην Τρέχουσα Έξοδο" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Συνδυασμοί Πλήκτρων για Εκκίνηση-Σταμάτημα Κατάστασης Κλιμάκωσης" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Συνδυασμοί πλήκτρων που αντιθέτως λειτουργούν ως διακόπτης για την κατάσταση " "κλιμάκωσης ενεργοποιόντας την όταν πατηθούν και απενεργοποιόντας την όταν " "αφεθούν. " #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Διάταξη και μεταμόρφωση όλων των παραθύρων" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Διάταξη και έναρξη μεταμόρφωσης ομάδας παραθύρων" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Διάταξη και έναρξη μεταμόρφωσης παραθύρων" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Διάταξη και έναρξη μεταμόρφωσης παραθύρων στην τρέχουσα έξοδο" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Σε όλες τις συσκευές εξόδου" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Στην τρέχουσα συσκευή εξόδου" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Επίστρωση Εικονιδίου" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Επίστρωση ενός εικονιδίου στα παράθυρα μόλις αυτά κλιμακωθούν" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Κλιμάκωση" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Κλιμάκωση Παραθύρων" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Ταχύτητα κλιμάκωσης" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Χρονικό βήμα κλιμάκωσης" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Κλιμάκωση παραθύρων" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Επιλέγει το αν τα παράθυρα κλιμακωθούν αν γινει χρήση πολλαπλών συσκευών " "εξόδου." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Χώρος μεταξύ των παραθύρων" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Χωροταξία" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Χρόνος (σε ms) πρίν να τερματιστεί η κατάσταση κλιμάκωσης κατά τη διάρκεια " "της αιώρησης πάνω από ένα παράθυρο" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Παράθυρα που πρέπει να κλιμακωθούν σε κατάσταση κλιμάκωσης" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Αυτόματο άνοιγμα αρπαγής οθόνης σε αυτή την εφαρμογή" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Διαδρομή" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Εκκίνηση τετράγωνης αρπαγής οθόνης" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Εκκίνηση Εφαρμογής" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Τοποθέτηση των εικόνων αρπαγής οθόνης σε αυτή τη διαδρομή" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Αρπαγή Οθόνης" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Πρόσθετο αρπαγής οθόνης" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Φορτωτής εικόνας svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Ποσό φωτεινότητας σε ποσοστό επι της εκατό" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Ποσό κορεσμού σε ποσοστό επι της εκατό" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Επιλογέας Εφαρμογών" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Αυτόματη Περιστροφή" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Μεταφορά Μπροστά" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Μεταφορά επιλεγμένου παράθυρου μπροστά" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Η απόσταση της επιφάνειας εργασίας που πρέπει να ζουμαριστεί έξω κατα την " "εναλλαγή παραθύρων" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Εικονίδιο" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Ελαχιστοποιημένο" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Επόμενο Πάνελ" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Επόμενο παράθυρο" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Επόμενο παράθυρο (Όλα τα παράθυρα)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Επόμενο παράθυρο (Οχι popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι ορατός και επιλέγει το επόμενο παράθυρο" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι ορατός και επιλέγει το επόμενο " "παράθυρο απο όλα τα παράθυρα" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι ορατός και επιλέγει το προηγούμενο " "παράθυρο" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Κάνει popup τον επιλογέα αν δεν είναι ορατός και επιλέγει το προηγούμενο " "παράθυρο απο όλα τα παράθυρα" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Προηγούμενο Πάνελ" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Προηγούμενο παράθυρο" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Προηγούμενο παράθυρο (Όλα τα παράθυρα)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Προηγούμενο παράθυρο (Οχι popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Περιστροφή στο επιλεγμένο παράθυρο κατα την εναλλαγή" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Επιλογή τύπου παραθύρου του επόμενου πάνελ." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Επιλογή του επόμενου παραθύρου χωρίς εμφάνιση του παραθύρου popup." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Επιλογή τύπου παραθύρου του προηγούμενου πάνελ." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Επιλογή του προηγούμενου παραθύρου χωρίς εμφάνιση του παραθύρου popup." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Εμφάνιση εικονιδίου δίπλα στη μικρογραφία" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Εμφάνιση ελαχιστοποιημένων παραθύρων" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Ταχύτητα επιλογέα" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Χρονικό βήμα επιλογέα" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Επιλογέας παραθύρων" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Παράθυρα που δεν πρέπει να εμφανίζονται στον επιλογέα" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Χορήγηση υποστήριξης YV12 χρωματικού μοντέλου" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Παίξιμο Βίντεο" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Παίξιμο βίντεο" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Χρωματικό μοντέλο YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Προσθήκη γραμμής" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Προσθήκη σημείου" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Προσθέτει τα εφέ νερού σε διαφορετικές ενέργειες επιφάνειας εργασίας" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Καθυστέρηση (σε χιλ.δευτερολέπτου) μεταξύ κάθε σταγόνας βροχής" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Ενεργοποίηση των εφέ νερού για τον δείκτη" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Γραμμή" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Κλιμάκωση Μετάθεσης Αρχής" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Σημείο" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Καθυστέρηση Βροχής" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Τίτλος κύματος" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Εκκίνηση-Σταμάτημα βροχής" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Εκκίνηση-Σταμάτημα εφέ βροχής" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Εκκίνηση-Σταμάτημα γυαλοκαθαριστήρα" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Εκκίνηση-Σταμάτημα εφέ γυαλοκαθαριστήρα" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Εφέ Νερού" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Κλιμάκωση μετάθεσης αρχής νερού" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Εφέ κύματος από τον τίτλο παραθύρου" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Εφέ Εστίασης" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Εφέ Εστίασης Παραθύρου" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Εστιάζει Παράθυρα" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Τριβή" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Πιάσιμο Παραθύρων" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Ανάλυση Πλέγματος" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Αντίστροφο άρπαγμα παραθύρου" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Κάνει το παράθυρο να τρέμει" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Εφέ Χαρτογράφησης" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Εφέ Χαρτογράφησης Παραθύρου" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Χαρτογράφηση Παραθύρων" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Εφέ Μεγιστοποίησης" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Ελάχιστο Μέγεθος Πλέγματος" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Ελάχιστο Μέγεθος Κορυφαίου Πλέγματος" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Μετακίνηση Παραθύρων" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Τρεμούλιασμα" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Αντίστροφο Άρπαγμα" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Άρπαγμα παραθύρων" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Τριβή Ελατηρίου" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Κ Ελατηρίου" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Σταθερά Ελατηρίου" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Εκκίνηση-Σταμάτημα αρπάγματος παραθύρου" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Χρήση μοντέλου ελατηρίου για το εφέ ταλάντωσης παραθύρου" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Ανάλυση Κορυφαίου Πλέγματος" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Παράθυρα που πρέπει να ταλαντευτούν όταν εστιαστούν" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Παράθυρα που πρέπει να ταλαντευτούν όταν πιαστούν" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Παράθυρα που πρέπει να ταλαντευτούν όταν χαρτογραφηθούν" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Παράθυρα που πρέπει να ταλαντευτούν όταν μετακινηθούν" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Εφέ ταλάντευσης όταν μεγιστοποιούνται και απομεγιστοποιούνται παράθυρα" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ταλαντευόμενα Παράθυρα" #~ msgid "Command line 0" #~ msgstr "Γραμμή εντολών 0" #~ msgid "Run command 0" #~ msgstr "Τρέξιμο εντολής 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Γραμμή εντολών αρπαγής οθόνης" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Γραμμή εντολών αρπαγής οθόνης" #~ msgid "Filter Linear" #~ msgstr "Γραμμικό Φιλτράρισμα" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Χρήση γραμμικού φιλτραρίσματος όταν ζουμάρεται μέσα" #~ msgid "Zoom Desktop" #~ msgstr "Ζουμάρισμα Επιφάνειας Εργασίας" #~ msgid "Zoom In" #~ msgstr "Ζουμ Μέσα" #~ msgid "Zoom Out" #~ msgstr "Ζουμ Έξω" #~ msgid "Zoom Pan" #~ msgstr "Pan του Ζούμ" #~ msgid "Zoom Speed" #~ msgstr "Ταχύτητα Ζουμ" #~ msgid "Zoom Timestep" #~ msgstr "Χρονικό Βήμα Ζουμ" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Pan και ζούμ του κύβου" #~ msgid "Zoom factor" #~ msgstr "Παράγοντας ζουμ" #~ msgid "Zoom pan" #~ msgstr "Pan του ζούμ" #~ msgid "Decrease window opacity" #~ msgstr "Μείωση αδιαφάνειας παραθύρου" #~ msgid "Increase window opacity" #~ msgstr "Αύξηση αδιαφάνειας παραθύρου" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Τιμές αδιαφάνειας για παράθυρα που πρέπει να είναι διάφανα απο προεπιλογή" #~ msgid "Opacity windows" #~ msgstr "Αδιαφάνεια παραθύρων" #~ msgid "Background Images" #~ msgstr "Εικόνες Φόντου" #~ msgid "Background images" #~ msgstr "Εικόνες φόντου" #~ msgid "Place windows on a plane" #~ msgstr "Τοποθέτηση παραθύρων στο πλάνο" #~ msgid "Plane Down" #~ msgstr "Μετακίνηση Πλάνου Κάτω" #~ msgid "Plane Left" #~ msgstr "Μετακίνηση Πλάνου Αριστερά" #~ msgid "Plane Right" #~ msgstr "Μετακίνηση Πλάνου Δεξιά" #~ msgid "Plane To Face 1" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 1" #~ msgid "Plane To Face 10" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 10" #~ msgid "Plane To Face 11" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 11" #~ msgid "Plane To Face 12" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 12" #~ msgid "Plane To Face 2" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 2" #~ msgid "Plane To Face 3" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 3" #~ msgid "Plane To Face 4" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 4" #~ msgid "Plane To Face 5" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 5" #~ msgid "Plane To Face 6" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 6" #~ msgid "Plane To Face 7" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 7" #~ msgid "Plane To Face 8" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 8" #~ msgid "Plane To Face 9" #~ msgstr "Μετακίνηση Πλάνου Στην Όψη 9" #~ msgid "Plane Up" #~ msgstr "Μετακίνηση Πλάνου Πάνω" #~ msgid "Plane down" #~ msgstr "Μετακίνηση πλάνου κάτω" #~ msgid "Plane left" #~ msgstr "Μετακίνηση πλάνου αριστερά" #~ msgid "Plane right" #~ msgstr "Μετακίνηση πλάνου δεξιά" #~ msgid "Plane to face 1" #~ msgstr "Μετακίνηση πλάνου στην όψη 1" #~ msgid "Plane to face 10" #~ msgstr "Μετακίνηση πλάνου στην όψη 10" #~ msgid "Plane to face 11" #~ msgstr "Μετακίνηση πλάνου στην όψη 11" #~ msgid "Plane to face 12" #~ msgstr "Μετακίνηση πλάνου στην όψη 12" #~ msgid "Plane to face 2" #~ msgstr "Μετακίνηση πλάνου στην όψη 2" #~ msgid "Plane to face 3" #~ msgstr "Μετακίνηση πλάνου στην όψη 3" #~ msgid "Plane to face 4" #~ msgstr "Μετακίνηση πλάνου στην όψη 4" #~ msgid "Plane to face 5" #~ msgstr "Μετακίνηση πλάνου στην όψη 5" #~ msgid "Plane to face 6" #~ msgstr "Μετακίνηση πλάνου στην όψη 6" #~ msgid "Plane to face 7" #~ msgstr "Μετακίνηση πλάνου στην όψη 7" #~ msgid "Plane to face 8" #~ msgstr "Μετακίνηση πλάνου στην όψη 8" #~ msgid "Plane to face 9" #~ msgstr "Μετακίνηση πλάνου στην όψη 9" #~ msgid "Plane up" #~ msgstr "Μετακίνηση πλάνου πάνω" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Χρόνος Ξεθωριάσματος Αδιαφάνειας Παραθύρου Επιφάνειας Εργασίας." ./po/pl.po0000644000004100000410000031115313246301623012640 0ustar www-datawww-data# translation of compiz.po to # Polish message file for compiz. # Copyright (C) 2005 SUSE Linux Products GmbH. # Maciej Warnecki , 2007. # wadim dziedzic msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-05-07 19:32+0200\n" "Last-Translator: Maciej Warnecki \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Pulpit" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Zarządzanie oknem" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Brak" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Zwiń" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maksymalizuj" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maksymalizuj okno w poziomie" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maksymalizuj okno w pionie" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimalizuj" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Wysuń " #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Zaniż" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu okna" # I find my translation easier to understand #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Akcja przy obrocie kółka myszy nad paskiem tytułowym okna." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Typ rozmycia" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Nieprzezroczystość aktywnego okna z motywem Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Nieprzezroczystość cienia aktywnego okna z motywem Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Nieprzezroczystość motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Nieprzezroczystośc cienia motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Nieprzezroczystość dla aktywnych okien z dekoracjami motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Nieprezroczystość dekoracji motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Cieniuj aktywne okna z motywem Metacity od nieprzezroczystych do " "półprzezroczystych" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Cieniuj okna z dekoracjami motywu metacity od nieprzezroczystych do " "przejrzystych" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Akcja podjęta przy naciśnięciu kółka myszy na pasku tytulowym" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ rozmycia używany dla dekoracji okien" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Używaj motywu Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Używaj motywu Metacity podczas rysowania dekoracji okien" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zamknij okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Cofnij maksymalizację okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksymalizuj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Zminimalizuj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Stwórz powyżej" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Przyklej" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Odcieniuj" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Nie twórz powyżej" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Odklej" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Okno \"%s\" nie odpowiada." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "Wymuszenie zamknięcia aplikacji spowoduje utratę niezapisanych zmian." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Wymuś Zamknięcie" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Rysowanie" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Kolor wypełnienia" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Kolor pędzla" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Wtyczka rysowania" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Czyść" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Rysuj" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Rysowanie na pulpicie" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Kolor wypełnienia dla rysowania" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inicjuj" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Rozpocznij rysowanie" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Rozpoczyna usuwanie rysunków" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Rozpocznij usuwanie" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Szerokość linii" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Szerokość linii przy rysowaniu" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Kolor pędzla przy rysowaniu" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Szerokość pędzla" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Szerokość pędzla przy rysowaniu" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Rozmycie alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Rozmycie alfa okien" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtr rozmycia" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Okluzja rozmycia" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Nasycenie rozmycia" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Prędkość rozmycia" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Rozmywaj okna" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Rozmycie za przezroczystymi częściami okien" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Nasycenie kolorami rozmytego obszaru" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Rozmywanie okien" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Rozmywaj nieaktywne okna" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Wyłącz rozmywanie fragmentów ekranu zajmowanych przez inne okna." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Metoda filtrowania dla rozmycia" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Rozmycie ostrości" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Rozmycie ostrości okien" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Rozmycie Gaussa" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Promień rozmycia Gaussa" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Siła rozmycia Gaussa" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Promień rozmycia Gaussa" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Siła rozmycia Gaussa" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Pozyskaj niezależne tekstury" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmapa" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Poziom szczegółów mipmapy" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Poziom szczegółów mipmapy" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsowanie" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efekt pulsowania" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Używaj dostępnych jednostek tekstur, by pozyskać jak najwięcej niezależnych " "tekstur" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Szybkość rozmywania okien" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Okna, które mają być poddane rozmyciu ostrości" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Okna, które mają używać rozmycia alfa" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klonowanie wyjścia" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Rozpocznij klonowanie zaznaczenia" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Zewnętrzna obsługa klonowania" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 7 " #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Skrót klawiaturowy, który spowoduje uruchomienie polecenia 0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Krawędź ekranu, która spowoduje uruchomienie polecenia 9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Przyporządkowanie poleceń do ustalonych działań" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Skróty myszy" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linia poleceń 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linia poleceń 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linia poleceń 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Linia poleceń 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linia poleceń 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linia poleceń 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linia poleceń 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linia poleceń 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linia poleceń 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linia poleceń 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linia poleceń 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linia poleceń 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Polecenie do wykonania w powłoce po wywołaniu skrótu 9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Polecenia" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Skróty ekranowe" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Skróty klawiaturowe" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Wykonaj polecenie 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Wykonaj polecenie 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Wykonaj polecenie 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Wykonaj polecenie 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Wykonaj polecenie 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Wykonaj polecenie 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Wykonaj polecenie 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Wykonaj polecenie 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Wykonaj polecenie 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Wykonaj polecenie 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Wykonaj polecenie 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Wykonaj polecenie 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Włączone wtyczki" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Zezwól na to, by rysowanie okien pełnoekranowych nie było przekierowywane do " "obrazków rastrowych poza ekranem" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Dzwonek systemowy" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Dzwonek systemowy" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatyczne wysuwanie okien" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Opóźnienie automatycznego wysuwania okien" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatyczne wykrywanie urządzeń wyjściowych" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatyczne wykrywanie częstotliwości odświeżania" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Najlepszy" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Kliknij by wybrać" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Kliknięcie okna ogniskuje na nim wprowadzanie" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zamknij aktywne okno" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Domyślna ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Obraz domyślnej ikony okna" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Rozmiar pulpitu" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Wykryj wyjścia" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Wykryj częstotliwość odświeżania" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Ustawienia obrazu" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Czas jaki musi spędzić wskaźnik na krawędzi ekranu zanim zostanie wykonana " "akcja" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Opóźnienie zapadki krawędzi" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Szybki" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Zachowanie przy wybraniu okna" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Stopień zapobiegania skupienia" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Zapobieganie skupieniu okien" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Zapobieganie skupieniu okien" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Wymuś niezależne wyświetlanie wyjścia" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opcje Ogólne" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Ogólne opcje Compiza" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Dobry" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ukryj okna spoza paska zadań" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Schowaj wszystkie okna i wybierz pulpit" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "Ukrywa okna spoza paska zadań w trybie pokazywania pulpitu" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Wysokość" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Poziomy rozmiar wirtualny" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Jeśli możliwe używaj kompresji dla tekstur przekonwertowanych z obrazków" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignoruj podpowiedzi dla zmaksymalizowanych okien" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorowanie podpowiedzi zwiększenia rozmiaru i proporcji gdy okno jest " "zmaksymalizowane" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Odstęp czasu przed podniesieniem wskazanych okien" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Odstęp czasu pomiędzy wiadomościami ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Przypisania klawiszy" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Stopień zapobiegania wykradania ostrości" # Zmieniłem z "Błyskawica" na "Oświetlenie": # lightNing=Błyskawica # lighting=Oświetlenie, cieniowanie #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Oświetlenie" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista aktualnie włączonych wtyczek" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista opisów urządzeń wyjściowych" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Niski" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Obniż okno" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Przenieś okno pod pozostałe" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksymalizuj okno w poziomie" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksymalizuj okno w pionie" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksymalizuj aktywne okno" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksymalizuj aktywne okno w poziomie" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksymalizuj aktywne okno w pionie" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimalizuj aktywne okno" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normalne" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Ilość pulpitów" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Ilość wirtualnych pulpitów" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Wyłączenie" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Odświeżaj ekran tylko podczas okresu poziomego wygaszania" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Wyjścia" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Radzenie sobie z zachodzącymi na siebie wyjściami" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Rysuj każde urządzenie wyjściowe niezaleźnie, nawet jeśli zachodzą one na " "siebie" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Opóźnienie ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferuj większe wyjście" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferuj mniejsze wyjście" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Podnieś przy kliknięciu" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Podnieś okno" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Podnieś wskazane okno po interwale" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Podnosi okno ponad pozostałe" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Podnieś okna po kliknięciu" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Częstotliwość odświeżania" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Mnożnik rozmiaru ekranu dla poziomego wirtualnego rozmiaru" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Mnożnik rozmiaru ekranu dla pionowego wirtualnego rozmiaru" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Pokaż pulpit" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Powolne animacje" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "\"sprytny\" tryb" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synchronizuj z VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Kompresja tekstur" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtr tekstury" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrowanie tekstur" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Częstotliwość przerysowywania ekranu (razy na sekundę)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Przełącz maksymalizację okna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Przełącz maksymalizację poziomą okna" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Przełącz maksymalizację pionową okna" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Przełącz zwinięcie okna" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Przełącza maksymalizację aktywnego okna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Przełącz maksymalizację poziomą aktywnego okna" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Przełącz maksymalizację poziomą aktywnego okna" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Przełącza przyciemnianie aktywnego okna" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Wyłącz powolne animacje" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Cofnij maksymalizację aktywnego okna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Cofnij przekierowanie okien pełnoekranowych" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Używaj rozproszonego światła podczas przekształceń ekranu" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Pionowy rozmiar wirtualny" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Bardzo wysoko" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" "Które z zachodzących na siebie urządzonych wyjściowych powinny być " "preferowne?" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Przypisanie przycisku do menu okien" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Przypisanie klawisza do menu okien" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akceleracja" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Dostosuj obraz" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Dostosuj obrazek górnej ściany kostki do obrotu" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Przejdź do następnej klatki" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animacja tła dla kostki" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animacja tła dla kostki podczas jej obracania" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Wygląd" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatycznie" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Zachowanie" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kolor górnej i dolnej ściany kostki" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Dolny kolor przejścia tonalnego w tle kostki pulpitów" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Góny kolor przejścia tonalnego w tle kostki pulpitów" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Obrazki kostki" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kolor kostki" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Kostka pulpitu" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Przyspieszenie zwijania" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Szybkość zwijania" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Opóźnienie zwijania" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "O ile to możliwe, generuj mitmapy dla lepszej jakości skalowania" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Przejdź do poprzedniej klatki" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Pliki obrazków" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Obrazek, który ma być używany jako tekstura tła dla kostki" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Kostka będzie przezroczysta tylko jeśli jest obracana za pomocą kursora" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Wewnątrz kostki" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Wewnątrz kostki" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista plików PNG i SVG, które mają być wyświetlane na górnej ścianie kostki" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Tryb wielu urządzeń wyjściowych" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Wiele kostek" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Następna klatka" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Jedna duża kostka" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Nieprzezroczystość kostki podczas obracania " #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Nieprzezroczystość kostki kiedy nie jest obracana" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Nieprzezroczystość pulpitu podczas obracania kostki" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Nieprzezroczystość pulpitu kiedy kostka nie jest obracana" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Umieszczaj okna na kostce" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Poprzednia klatka" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Wyświetlaj tło dla kostki" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skaluj obrazek" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skaluj obrazki przykrywające górną ścianę kostki" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Decyduje jak kostka jest wyświetlana jeśli używanych jest kilka uzrądzeń " "wyjściowych" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Tło dla kostki" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Końcowy kolor gradientu tła kostki" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Początkowy kolor gradientu tła kostki" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Obrazek tła dla kostki" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Szybkość" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Opóźnienie" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Przezroczystość tylko podczas obracania kursorem" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Przezroczysta kostka" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Odsłoń" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Odsłoń kostkę" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Wsteczna kontrola Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Pozwól tworzyć mipmapy dla tekstur dekoracji" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Polecenie" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekoracje okien" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Polecenie dekoratora wykonywane gdy dekorator nie jest uruchomiony" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Przesunięcie cienia w osi X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Przesunięcie cienia w osi Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Kolor cienia" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Nieprzezroczystość cienia" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Promień cienia" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Kolor cienia" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Przesunięcie cienia - współrzędna X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Przesunięcie cienia - współrzędna Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "NIeprzezroczystość cienia" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Promień cienia" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Cienie okien" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Dekoracja okna" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Dekoracje okna" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Typy okien, które mają być dekorowane" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Typy okien, które mają posiadać cień" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Jasność (w %) nieodpowiadających okien" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Stała prędkość" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Stały czas" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Przyciemnienie nieodpowiadających okien" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Przyciemnienie okien, które nie odpowiadają na polecenia menadżera okien" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Sposób zanikania" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ściemnianie podczas minimalizacji/otwierania/zamykania" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Szybkość rozjaśniania /ściemniania" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Czas przenikania" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Efekt rozjaśniania/ściemniania podczas minimalizacji/otwarcia/zamknięcia " "okien" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efekt ściemniania przy dzwonku systemowym" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Okna powinny płynnie rozjaśniać się podczas ich wyboru i płynnie " "przyciemniać się podczas wyboru innego okna." #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Przyciemniaj/rozjaśniaj okna" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Płynne rozjaśnianie/przyciemnianie okien" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Pełnoekranowy wizualny dzwonek systemowy" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Pełnoekranowy efekt przyciemnienia przy dzwonku systemowym" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Nasycenie (w %) nieodpowiadających okien" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Jasność nieodpowiadających okien" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Nasycenie nieodpowiadających okien" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Wizualny dzwonek systemowy" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Sposób zanikania okien" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Szybkość zanikania okien w trybie \"Stała prędkość\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Czas zanikania okien (w ms) w trybie \"Stała prędkość\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Typy okien, które powinny być poddawane rozjaśnieniu/ściemnieniu" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punkt montowania" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punkt montowania" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "System plików użytkownika" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "System plików użytkownika" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Wsteczna kontrola GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "Glib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Wsparcie głównego węzła GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Kompatybilność z Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Otwiera terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Opcje, które zapewniają kompatybilność Compiza ze środowiskiem pulpitu Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialog Uruchom" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Polecenie terminala" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Polecenie zrzutu ekranu" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Wyświetl menu główne" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Wyświetl okno dialogowe \"Uruchom program\"" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Wyświetl menu główne" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Pobierz zrzut ekranu" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Pobierz zrzut okna" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Polecenie terminala" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Polecenie zrzutu okna" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Prosty sposób zapisu Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Wtyczka powiadamiania o zmianie pliku" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Wsteczna kontrola Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efekt minimalizacji" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimalizuj okna" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Szybkość minimalizacji" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Opóźnienie minimalizacji" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Opór przyciemniania" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Opór cieniowania" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Przekształcaj okna podczas minimalizacji i cofania minimalizacji" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Typy okien, które mają być transformowane podczas minimalizacji" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Ogranicz Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Ogranicz współrzędną Y do obszaru roboczego" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Nie aktualizuj strony okien serwera dopóki nie przestanie się ich poruszać" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Rozpocznij przenoszenie okna" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Leniwe pozycjonowanie" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Przenieś okno" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Przenieś okno" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Nieprzezroczystość" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Poziom nieprzezroczystości przesuwanych okien" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Odepnij i automatycznie cofnij maksymalizację okien podczas przesuwania" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Odepnij zmaksymalizowane okna" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Rozpocznij przenoszenie okna" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Jasność" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Zmniejszenie jasności" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Zwiększenie jasności" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Krok zmiany jasności" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Wartości jasności dla okien" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Zmniejsz " #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Zwiększ " #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Zmniejsz nieprzezroczystość" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Zwiększ nieprzezroczystość" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Krok zmiany nieprzezroczystości" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Poziom nieprzezroczystości okien" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Przezroczystość, Jasność i Nasycenie" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Dostosowywanie Nieprzezroczystości, Jasności i Nasycenia" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Nasycenie" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Zmniejsz nasycenie" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Zwiększ nasycenie" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Krok zmiany nasycenia " #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Wartości nasycenia dla okien" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Krok zmiany" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Ustawienia konkretnych okien" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Wartości dla okien" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Okna" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Typy okien, które powinny domyślnie mieć inną jasność" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Typy okien, które powinny domyślnie mieć inną nieprzezroczystość" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Typy okien, które powinny domyślnie mieć inne nasycenie" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algorytm używany do rozmieszczenia okien" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskada" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Wyśrodkowany" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Ustalone położenie okna" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Wymuś ułożenie okien" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Poziome pozycje wirtualnych pulpitów" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Utrzymuj na pulpicie" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Utrzymuj wskazane okna na pulpicie , nawet jeśli ich pozycja będzie się " "różnić od ich określonej pozycji" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Rozmieść okna" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Ułóż na wszystkich wyjściach" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Podczas wyboru umieszczaj okna we właściwych miejscach" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Tryb rozmieszczenia" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Ułożone okna" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Losowy" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Określa jak powino się zachowywać rozmieszczenie okien jeśli jest używanych " "wiele urządzeń wyjścia." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligentny" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Użyj aktywnego urządzenia wyjściowego" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Użyj urządzednia wyjściowego na wybranym oknie" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Użyj urządzenia wyjściowego z kursorem myszy" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Pionowe pozycje wirtualych pulpitów" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Przemieszczenie okien na pulpity" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Obejścia problemów z rozmieszczeniem okien" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Typy okien, które powinny być ułożone domyślnie " #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Typy okien, które powinny być domyślnie ułożone na konkretnych pulpitach" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Okna, które powinny być rozmieszczone \"na siłę\", nawet jeśli wskazują, że " "menadżer okien pominie rozmieszczanie ich" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Okna z ustalonymi pozycjami" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Okna z ustalonymi pulpitami" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Obejścia problemów" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Pozycje X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Pozycje wirtualnych pulpitów osi X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Wartości dla pozycji X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Pozycje Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Pozycje wirtualnych pulpitów osi Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Wartości dla pozycji Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Wtyczka ładująca obrazki .png" #: ../metadata/regex.xml.in.h:1 #, fuzzy msgid "Regex Matching" msgstr "Przełącz przypinanie okien" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Przełącz przypinanie okien" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Przyporządkowanie klawiszy" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kolor brzegów" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Kolor brzegów używany dla trybow zmiany rozmiarów z obrysem oraz z obrysem i " "wypenieniem" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Domyślny ryb zmiany zmiaru" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Domyślny tryb używany podczas zmiany rozmiaru okna" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Kolor wypełniania" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Kolor wypełnienia dla prostokątnego trybu zmiany wielkości" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Rozpocznij normalną zmianę rozmiarów okna" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Rozpocznij zmianę rozmiarów zewnętrznego okna" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Rozpocznij prostokątną zmianę rozmiarów okna" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Rozpocznij zmianę rozmiarów okna poprzez rozciąganie" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Rozpocznij zmianę rozmiarów okna" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normalna zmiana rozmiaru okna" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Kontur" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Zmiana rozmiaru konturu okna" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Prostokąt" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Prostokątna zmiana rozmiaru okna" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Zmień rozmiar okna" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Zmień rozmiar okna" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Rozpocznij zmianę rozmiaru okna" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Rozpocznij zmianę rozmiaru okna poprzez rozciąganie" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Rozpocznij normalną zmianę rozmiarów okna" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Rozpocznij zmianę rozmiaru okna poprzez kontur okna" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Rozpocznij prostokątną zmianę rozmiaru okna" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Rozciągnij" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Zmień rozmiar okna poprzez rozciąganie" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany w standardowy sposób" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany poprzez kontur okna" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany w prostokątny sposób" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Typy okien, których rozmiar ma być zmieniany poprzez rozciąganie" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Przełączanie krawędziami - przeciągnij i upuść" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Przełączanie krawędziami - przenoszenie" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Przełączanie widoków za pomocą wskaźnika" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Czas przełączania" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Przewróć do lewego pulpitu i zakrzyw kursor" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Przewróć do następnego pulpitu podczas przeciągania obiektów na krawędź " "ekranu" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Przewróć do następnego pulpitu podczas przesuwania wskaźnika na krawędź " "ekranu" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Przewróć do następnego pulpitu podczas przesuwania okien na krawędź ekranu" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Przewróć do prawego wirtualnego pulpitu i zakrzyw kursor" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Odwróć oś Y dla ruchu wskaźnika" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Odwrócenie osi Y dla wskaźnika" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Czułość wskaźnika" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Podnoś podczas obracania " #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Podnoś okna podczas obracania" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Obróć kostkę" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Obróć i przełącz w lewo" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Obróć i przełącz w prawo" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Obróć w lewo" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Obróć w lewo z oknem" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Obróć w prawo" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Obróć w prawo z oknem" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Obróć do" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Obróć do ściany 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Obróć do ściany 1 z oknem" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Obróć do ściany 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Obróć do ściany 10 z oknem" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Obróć do ściany 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Obróć do ściany 11 z oknem" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Obróć do ściany 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Obróć do ściany 12 z oknem" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Obróć do ściany 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Obróć do ściany 2 z oknem" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Obróć do ściany 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Obróć do ściany 3 z oknem" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Obróć do ściany 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Obróć do ściany 4 z oknem" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Obróć do ściany 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Obróć do ściany 5 z oknem" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Obróć do ściany 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Obróć do ściany 6 z oknem" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Obróć do ściany 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Obróć do ściany 7 z oknem" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Obróć do ściany 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Obróć do ściany 8 z oknem" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Obróć do ściany 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Obróć do ściany 9 z oknem" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Obracanie kostki" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Obróć kostkę pulpitu" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Obróć w lewo" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Obróć w lewo i przenieś aktywne okno" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Obróć w prawo" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Obróć w prawo i przenieś aktywne okno" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Obrót do ściany" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Obrót do ściany z oknem" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Obróć do ściany 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Obróć do ściany 1 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Obróć do ściany 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Obróć do ściany 10 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Obróć do ściany 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Obróć do ściany 11 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Obróć do ściany 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Obróć do ściany 12 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Obrót do ściany 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Obróć do ściany 2 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Obróć do ściany 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Obróć do ściany 3 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Obróć do ściany 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Obróć do ściany 4 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Obróć do ściany 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Obróć do ściany 5 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Obróć do ściany 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Obróć do ściany 6 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Obróć do ściany 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Obróć do ściany 7 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Obróć do ściany 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Obróć do ściany 8 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Obróć do ściany 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Obróć do ściany 9 i przenieś tam aktywne okno" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Obraca do pulpitu" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Obracaj okno" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Obraca z oknem" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Przyspieszenie obrotu" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Szybkość obrotu" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Opóźnienie obrotu" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Przybliżenie obrotu" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Czułość ruchu wskaźnika" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Przypnij obrót kostki do dolnej ściany" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Przypnij obrót kostki do górnej ściany" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Przypnij do dolnej ściany" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Przypnij do górnej ściany" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Rozpocznij obrót" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Czas przed przełączeniem wirtualnych pulpitów" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Powiększenie" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Stopień nieprzezroczystości w procentach" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Duży" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Naciśnij na Pulpit by pokazać Pulpit" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Przyciemnij tło" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Przyciemnij tło podczas skalowania okien" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblemat" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Pokaż Pulpit kiedy kliknie się na Pulpit podczas Szybkiego Wyboru" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Czas wyboru okna" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Rozpocznij przeglądanie okien" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Rozpocznij przeglądanie wszystkich okien" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Rozpocznij przeglądanie grupy okien" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Inicjuj wybór okien dla okien z bieżącego wyjścia" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Rozmieść i zacznij przekształcać okna" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Rozmieść i zacznij przekształcać grupę okien" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Rozmieść i zacznij przekształcać okna" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Rozmieść i zacznij przekształcać okna w bieżącym widoku" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Na wszystkich urządzeniach wyjściowych" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Na aktualnym urządzeniu wyjściowym" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ikona okna" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Nałóż ikonę na okna podczas Szybkiego Wyboru" # To NIE jest skalowanie - zmiana rozmiaru #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Szybki Wybór" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Szybki Wybór Okien" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Szybkość szybkiego wyboru" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Krok czasu szybkiego wyboru" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Szybki wybór okien" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Decyduje gdzie okna są umieszczane do wyboru jeśli jest używanych wiele " "urządzeń wyjścia" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Odstęp między oknami" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Odstępy" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Czas (w ms) zatrzymania kursora nad oknem, po którym zakończony będzie tryb " "skalowania" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Typy okien, które mają być poddawane szybkiemu wyborowi w tym trybie" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automatycznie otwiera zrzut ekrany w tym programie" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Katalog" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Rozpocznik prostokątny zrzut ekranu" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Uruchom program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Umieszcza zrzuty ekranu w tym katalogu" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Zrzut ekranu" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Wtyczka zrzutów ekranu" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Wtyczka ładująca obrazki .svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Stopień jasności w procentach" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Stopień nasycenia w procentach" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Przełącznik aplikacji" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatycznie obracaj" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Przenieś na pierwszy plan" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Przenoś wybrane okno na wierzch" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Oddalenie pulpitu podczas przełączania okien" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Zminimalizowane" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Następny panel" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Następne okno" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Następne okno (wszystkie okna)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Następne okno (bez pop-upów)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Okno przełączania gdy niewidoczne i wybór następnego okna" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Okno przełączania gdy niewidoczne i wybór następnego okna spośród wszystkich" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Okno przełączania gdy niewidoczne i wybór poprzedniego okna" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Okno przełączania gdy niewidoczne i wybór poprzedniego okna spośród " "wszystkich" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Poprzedni panel" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Poprzednie okno" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Poprzednie okno (wszystkie okna)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Poprzednie okno (bez pop-upów)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Obracaj do wybranego okna podczas przełączania" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Wybierz następny typ panelu okna" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Wybierz następne okno bez pokazywania wyskakującego okienka." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Wybierz poprzedni typ panelu okna" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Wybierz poprzednie okno bez pokazywania wyskakującego okienka." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Wyświetl ikonę obok miniaturki" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Wyświetl zminimalizowan okna" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Szybkość przełącznika" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Krok czasu przełącznika" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Zmieniacz okien" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Typy okien, które mają być pokazywane w zmieniaczu" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Zapewnij wsparcie dla przestrzeni kolorów YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Odtwarzanie video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Odtwarzanie video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Przestrzeń kolorów YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Dodaj linię" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Dodaj punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Dodaje efekty wodne do różnych operacji na pulpicie" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Opóźnienie (w ms) pomiędzy każdą kroplą deszczu" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Włącz wodne efekty wskaźnika" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linia" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Skala przesunięcia" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Opóźnienie deszczu" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Fala tytułu" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Przełącz deszcz" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Przełącz efekt deszczu" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Przełącz wycieraczkę" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Przełącza efekt wycieraczki" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efekt wodny" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Skala przesunięcia wody" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efekt fali od tytułu okna" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efekt wybierania" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efekt wybierania okna" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Rodzaje wybieranych okien" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Tarcie" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Rodzaje chwytanych okien" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rozdzielczość siatki" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Odwrócone przyciąganie okien" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Potrząsaj oknami" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efekt mapowania" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efekt mapowania okna" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Rodzaje mapowanych okien" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efekt maksymalizacji" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimalny wymiar siatki" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimalny rozmiar siatki werteksu" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Przenieś okna" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Drgania" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Odwróć przyciąganie" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Przypnij okna" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Współczynnik tarcia" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Współczynik sprężystości" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Współczynnik sprężystości" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Przełącz przypinanie okien" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Wykorzystaj model sprężysty dla efektu drgających okien" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Rozdzielczość siatki werteksu" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Typy okien, które mają drgać po aktywacji" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Typy okien, które mają drgać po chwyceniu" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Typy okien, które mają drgać po mapowaniu" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Typy okien, które mają drgać podczas przesuwania" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efekt drgania podczas maksymalizacji i demaksymalizacji okien" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Drgające okna" #~ msgid "Command line 0" #~ msgstr "Linia poleceń 0" #~ msgid "Run command 0" #~ msgstr "Wykonaj polecenie 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Polecenie zrzutu ekranu" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Polecenie zrzutu ekranu" #~ msgid "Filter Linear" #~ msgstr "Filtruj liniowo" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Używaj filtru liniowego podczas powiększania" #~ msgid "Zoom Desktop" #~ msgstr "Powiększanie pulpitu" #~ msgid "Zoom In" #~ msgstr "Powiększ" #~ msgid "Zoom Out" #~ msgstr "Pomniejsz" #~ msgid "Zoom Pan" #~ msgstr "Powiększ" #~ msgid "Zoom Speed" #~ msgstr "Szybkość przybliżania" #~ msgid "Zoom Timestep" #~ msgstr "Opóźnienie przybliżania" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Powiększ i przesuń kostkę pulpitu" #~ msgid "Zoom factor" #~ msgstr "Współczynnik przybliżania" #~ msgid "Zoom pan" #~ msgstr "Powiększ" #~ msgid "Decrease window opacity" #~ msgstr "Zmniejsz nieprzezroczystość okna" #~ msgid "Increase window opacity" #~ msgstr "Zwiększ nieprzezroczystość okna" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Wartości nieprzezroczystości okien które powinny być domyślnie " #~ "półprzezroczyste" #~ msgid "Opacity window values" #~ msgstr "Wartości nieprzezroczystości okien" #~ msgid "Opacity windows" #~ msgstr "Nieprzezroczystość okien" #~ msgid "Background Images" #~ msgstr "Obrazki tła" #~ msgid "Background images" #~ msgstr "Obrazki tła" #~ msgid "Place windows on a plane" #~ msgstr "Umieszczaj okna na płaszczyźnie" #~ msgid "Plane Down" #~ msgstr "Płaszczyzna dolna" #~ msgid "Plane Left" #~ msgstr "Lewa płaszczyzna" #~ msgid "Plane Right" #~ msgstr "Prawa płaszczyzna" #~ msgid "Plane To Face 1" #~ msgstr "Płaszczyzna do ściany 1" #~ msgid "Plane To Face 10" #~ msgstr "Płaszczyzna do ściany 10" #~ msgid "Plane To Face 11" #~ msgstr "Płaszczyzna do ściany 11" #~ msgid "Plane To Face 12" #~ msgstr "Płaszczyzna do ściany 12" #~ msgid "Plane To Face 2" #~ msgstr "Płaszczyzna do ściany 2" #~ msgid "Plane To Face 3" #~ msgstr "Płaszczyzna do ściany 3" #~ msgid "Plane To Face 4" #~ msgstr "Płaszczyzna do ściany 4" #~ msgid "Plane To Face 5" #~ msgstr "Płaszczyzna do ściany 5" #~ msgid "Plane To Face 6" #~ msgstr "Płaszczyzna do ściany 6" #~ msgid "Plane To Face 7" #~ msgstr "Płaszczyzna do ściany 7" #~ msgid "Plane To Face 8" #~ msgstr "Płaszczyzna do ściany 8" #~ msgid "Plane To Face 9" #~ msgstr "Płaszczyzna do ściany 9" #~ msgid "Plane Up" #~ msgstr "Płaszczyzna górna" #~ msgid "Plane down" #~ msgstr "Płaszczyzna u dołu" #~ msgid "Plane left" #~ msgstr "Płaszczyzna z lewej strony" #~ msgid "Plane right" #~ msgstr "Płaszczyzna z prawej strony" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Płaszczyzna do ściany 1" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Płaszczyzna do ściany 10" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Płaszczyzna do ściany 11" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Płaszczyzna do ściany 12" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Płaszczyzna do ściany 2" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Płaszczyzna do ściany 3" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Płaszczyzna do ściany 4" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Płaszczyzna do ściany 5" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Płaszczyzna do ściany 6" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Płaszczyzna do ściany 7" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Płaszczyzna do ściany 8" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Płaszczyzna do ściany 9" #~ msgid "Plane up" #~ msgstr "Płaszczyzna u góry" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Czas zanikania nieprzezroczystości okna pulpitu" #~ msgid "Open window menu" #~ msgstr "Otwórz menu okna" #~ msgid "Dock" #~ msgstr "Obszar dokowania" #~ msgid "Toolbar" #~ msgstr "Pasek narzędzi" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Utility" #~ msgstr "Narzędziowe" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Okno dialogowe" #~ msgid "DropdownMenu" #~ msgstr "Menu" #~ msgid "PopupMenu" #~ msgstr "Menu kontekstowe" #~ msgid "Tooltip" #~ msgstr "Podpowiedź" #~ msgid "Notification" #~ msgstr "Powiadomienie" #~ msgid "Combo" #~ msgstr "Menu rozwijalne" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Okno modalne" #~ msgid "Fullscreen" #~ msgstr "Pełny ekran" #~ msgid "Unknown" #~ msgstr "Nieznane" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Skrót klawiaturowy, który spowoduje uruchomienie polecenia command%d" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Stopień jasności w procentach" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Stopień nieprzezroczystości w procentach" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Stopień nasycenia w procentach" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Nasycenie" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Opóźnienie (w ms) pomiędzy każdą kroplą deszczu" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "Oddalenie pulpitu podczas przełączania okien" #~ msgid "Do not modify" #~ msgstr "Bez zmian" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Przesunięcie cienia w osi X" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Przesunięcie cienia w osi Y" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Nieprzezroczystość cienia" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Promień cienia" #, fuzzy #~ msgid "Filter method used for blurring (4xBilinear, Gaussian, Mipmap)" #~ msgstr "Metoda filtrowania dla rozmycia" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Efekt wybierania okna" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Zapobieganie uaktywnianiu" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Przyspieszenie zwijania" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Szybkość zwijania" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Opóźnienie zwijania" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Promień dla rozmycia gaussowskiego" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rozmywanie gaussowskie" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Interwał przed podnoszeniem wskazanych okien" #, fuzzy #~ msgid "Interval between ping messages (1000-30000)" #~ msgstr "Czas pomiędzy wiadomościami ping" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Rozmieść i zacznij przekształcać okna w bieżącym widoku" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Szerokość linii przy rysowaniu" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Efekt mapowania okna" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Szybkość minimalizacji" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Opóźnienie minimalizacji" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimalny rozmiar siatki werteksu" #, fuzzy #~ msgid "Mipmap level-of-detail (0.0-5.0)" #~ msgstr "Poziom szczegółów mipmapy" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Ilość wirtualnych pulpitów" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Krok zmiany nieprzezroczystości" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Poziom nieprzezroczystości przesuwanych okien" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Poziom nieprzezroczystości przesuwanych okien" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Nakładanie ikony na skalowane okna" #~ msgid "Plugins that this must load before" #~ msgstr "Wtyczki, które muszą zostać załadowane przed" #~ msgid "Plugins that this requires" #~ msgstr "Wtyczki wymagane przez ten element" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór następnego okna spośród " #~ "wszystkich" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór następnego okna spośród " #~ "wszystkich" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór poprzedniego okna spośród " #~ "wszystkich" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Okno przełączania gdy niewidoczne i wybór poprzedniego okna spośród " #~ "wszystkich" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Przyspieszenie obrotu" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Szybkość obrotu" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Opóźnienie obrotu" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Szybkość skalowania" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Opóźnienie skalowania" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Mnożnik poziomego rozmiaru ekranu dla rozmiaru wirtualnego" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Mnożnik pionowego rozmiaru ekranu dla rozmiaru wirtualnego" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Czułość ruchu wskaźnika" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Opór cieniowania" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Odstęp między oknami" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Współczynnik tarcia" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Współczynnik sprężystości" #, fuzzy #~ msgid "Stroke width for annotations (0.0-20.0)" #~ msgstr "Szerokość pędzla przy rysowaniu" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Szybkość przełącznika" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Opóźnienie przełącznika" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Filtrowanie tekstur" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Częstotliwość przerysowywania ekranu (razy na sekundę)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Czas (w ms) zatrzymania kursora nad oknem, po którym zakończony będzie " #~ "tryb skalowania" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Czas przed przełączeniem widoku" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Używaj filtru liniowego podczas powiększania" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rozdzielczość siatki werteksu" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Skala przesunięcia wody" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Szybkość rozmywania okien" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Szybkość płynnego pojawiania się/zanikania okien" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Typy okien, które mają być rozmywane" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Typy okien, które mają być rozmywane" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Typy okien, które mają zanikać" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Typy okien, które mają zanikać" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Typy okien, które mają być skalowane w trybie skalowania" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Typy okien, które mają być pokazywane do zmieniania" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Typy okien, które mają być transformowane podczas minimalizacji" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Typy okien, które mają być rozmywane" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Typy okien, które mają drgać po aktywacji" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Typy okien, które mają drgać po chwyceniu" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Typy okien, które mają drgać po mapowaniu" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Typy okien, które mają drgać podczas przesuwania" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Szybkość przybliżania" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Opóźnienie przybliżania" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Współczynnik przybliżania" #~ msgid "." #~ msgstr "," #~ msgid "Plane To Face %d" #~ msgstr "Płaszczyzna do ściany %d" #~ msgid "Plane to face %d" #~ msgstr "Płaszczyzna do ściany %d" #~ msgid "Plane To Face %d with Window" #~ msgstr "Płaszczyzna do ściany %d z oknem" #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Płaszczyzna do ściany %d i przeniesienie tam aktywnego okna" #~ msgid "Rotate To Face %d" #~ msgstr "Obróć do ściany %d" #~ msgid "Rotate to face %d" #~ msgstr "Obrót do ściany %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Obróć do ściany %d z oknem" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Obrót do ściany %d i przeniesienie tam aktywnego okna" #~ msgid "Move Window Types" #~ msgstr "Rodzaje przenoszonych okien" ./po/gu.po0000644000004100000410000034441313246301623012645 0ustar www-datawww-data# translation of compiz.po to Gujarati # Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # # Krunaliben Patel , 2007. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-17 12:25+0530\n" "Last-Translator: \n" "Language-Team: gist Gujarati team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Generator: KBabel 1.11.4\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ડેસ્કટોપ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "વિન્ડો વ્યવસ્થાપન" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "કંઈ નહિં" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "માપદંડ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "મહત્તમ કરો" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "વિન્ડોને આડી રીતે મહત્તમ બનાવો" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "વિન્ડોને ઊભી રીતે મહત્તમ બનાવો" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ન્યૂનતમ કરેલ" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "આપોઆપ-વધારો" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "વિન્ડોનું મેનુ" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "જ્યારે વિન્ડો શીર્ષક પટ્ટી પર માઉસ પૈડું સરકાવી રહ્યા હોય ત્યારે કરવાની ક્રિયા." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "ઝાંખાપણાનો પ્રકાર" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "મેટાસીટી થીમ સક્રિય વિન્ડો અપારદર્શકતા" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "મેટાસીટી થીમ સક્રિય વિન્ડો અપારદર્શકતા છાયા" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "મેટાસીટી થીમ અપારદર્શકતા" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "મેટાસીટી થીમ અપારદર્શકતા છાયા" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "મેટાસીટી થીમ શણગારો સાથે સક્રિય વિન્ડો માટે વાપરવાની અપારદર્શકતા" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "મેટાસીટી થીમ શણગારો માટે વાપરવાની અપારદર્શકતા" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "સક્રિય વિન્ડોને મેટાસીટી થીમ શણગારો વડે અપારદર્શકમાંથી દૃશ્યમાનમાં લાવવા માટે છાયાંકિત " "કરો" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "વિન્ડોને મેટાસીટી થીમ શણગારો વડે અપારદર્શકમાંથી દૃશ્યમાનમાં લાવવા માટે છાયાંકિત કરો" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "શીર્ષક પટ્ટી માઉસ પૈડું ક્રિયા" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "વિન્ડો શણગારો માટે વપરાતા ઝાંખાપણાનો પ્રકાર" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "મેટાસીટી થીમ વાપરો" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "જ્યારે વિન્ડો શણગારો દોરી રહ્યા હોય ત્યારે મેટાસીટી થીમ વાપરો" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "વિન્ડો બંધ કરો" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "વિન્ડોને મહત્તમ સ્થિતિમાંથી પાછી લાવો" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "વિન્ડોને મહત્તમ સ્થિતિમાં લાવો" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "વિન્ડોને ન્યૂનત્તમ સ્થિતિમાં લાવો" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "ભરવાના રંગની ટિપ્પણી" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "સ્ટ્રોક રંગની ટિપ્પણી" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "સાફ કરો" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "દોરો" #: ../metadata/annotate.xml.in.h:7 #, fuzzy msgid "Draw using tool" msgstr "બુટ દરમિયાન" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ટિપ્પણીઓ માટે રંગ ભરો" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "લીટી પહોળાઈ" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "ટિપ્પણીઓ માટે લીટી પહોળાઈ" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ટિપ્પણીઓ માટે સ્ટ્રોક રંગ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "સ્ટ્રોક પહોળાઈ" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "ટિપ્પણીઓ માટે સ્ટ્રોક પહોળાઈ" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "૪xદ્વિરેખીય" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "આલ્ફા ઝાંખાપણું" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "આલ્ફા ઝાંખાપણું વિન્ડો" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ઝાંખાપણું ગાળક" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ઝાંખાપણાની ઝડપ" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "વિન્ડો ઝાંખી કરો" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "વિન્ડોના સ્પષ્ટ ભાગો પાછળ ઝાંખુ કરો" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "વિન્ડો ઝાંખી કરો કે જેમને ફોકસ નથી" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "અન્ય વિન્ડો દ્વારા ઢંકાઈ ગયેલ સ્ક્રીન વિસ્તારો ઝાંખા કરવાનું નિષ્ક્રિય કરો." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ઝાંખુ કરવા માટે વપરાતી ગાળણ પદ્ધતિ" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ઝાંખુ ફોકસ કરો" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ગોસીયન" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "ગોસિયન ત્રિજ્યા" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ગોસિયન મજબૂતાઈ" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "ગોસિયન ત્રિજ્યા" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ગોસિયન મજબૂતાઈ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "મીપમેપ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "મીપમેપ LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "મીપમેપ વિગત-નું-સ્તર" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ધબકાર" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ધબકાર અસર" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "વિન્ડો ઝાંખાપણાની ઝડપ" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "વિન્ડો કે જેઓ ફોકસ ઝાંખાપણાથી અસર પામવા જોઈએ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "વિન્ડો કે જેઓ મૂળભૂત રીતે આલ્ફા ઝાંખાપણાને વાપરતી હોવી જોઈએ" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "ક્લોન આઉટપુટ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "કેટાલોગ પસંદગી" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "આઉટપુન ક્લોન નિયંત્રક" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command0 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command1 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command10 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command11 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command2 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command3 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command4 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command5 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command6 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command7 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command8 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command9 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command0 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command1 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command10 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command11 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command2 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command3 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command4 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command5 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command6 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command7 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command8 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command9 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command0 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command1 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command10 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command11 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command2 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command3 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command4 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command5 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command6 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command7 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command8 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "કીબાઈન્ડીં કે જે જ્યારે બોલાવવામાં આવી, તે command9 તરીકે ઓળખાતો શેલ આદેશ ચલાવશે" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command0 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command1 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command10 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command11 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command2 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command3 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command4 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command5 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command6 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command7 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command8 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "શેલમાં ચલાવવાનું આદેશ વાક્ય જ્યારે run_command9 બોલાવવામાં આવે" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "આદેશો :" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "આદેશ '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "આદેશ '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "સક્રિય પ્લગઈનો" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "પૂર્ણસ્ક્રીન વિન્ડોને દોરાવાની પરવાનગી આપવાનું ઓફસ્ક્રીન પિક્સમેપમાં પુનઃદિશામાન થયેલ નથી" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "સંભળાય તેવી ઘંટડી" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "સંભળાય તેવી સિસ્ટમ ઘંટડી" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "આપોઆપ-વધારો" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "આપોઆપ-વધારો વિલંબ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "આઉટપુટ ઉપકરણોની આપોઆપ શોધ" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "પુનઃતાજું કરવાના દરની આપોઆપ શોધ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "શ્રેષ્ઠ" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ફોકસ કરવા માટે ક્લિક કરો" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "વિન્ડો પર ક્લિક કરવાનું ઈનપુટ ફોકસને તેના પર ખસેડે છે" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "સક્રિય વિન્ડો બંધ કરો" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "મૂળભૂત ચિહ્ન" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "મૂળભૂત વિન્ડો ચિહ્ન ચિત્ર" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ડેસ્કટોપ ઘન" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "આઉટપુટ શોધો" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "પુનઃતાજું કરવાનો દર શોધો" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "ઝડપી" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "બચાવ વિન્ડો પર ફોકસ કરો" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "બચાવ વિન્ડો પર ફોકસ કરો" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "સામાન્ય વિકલ્પો" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "સામાન્ય compiz વિકલ્પો" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "સરસ" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "ક્રિયાપટ્ટી વિન્ડો અવગણો છુપાવો" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "બધી વિન્ડોને સંતાડીને ડેસ્કટોપ પ્રકાશન કરો" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "જ્યારે ડેસ્કટોપ બતાવો સ્થિતિ દાખલ કરી રહ્યા હોય ત્યારે ક્રિયાપટ્ટીમાં નહિં હોય તેવી વિન્ડો " "છુપાવો" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "આડું વર્ચ્યુઅલ માપ" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "જ્યારે મહત્તમ થયેલ હોય ત્યારે ઈશારાઓ અવગણો" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "માપ વધારવાનું અને એસ્પેક્ટ ઈશારાઓ અવગણો જ્યારે વિન્ડો મહત્તમ થયેલ હોય" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "પસંદિત વિન્ડો વધારવા પહેલાંનો અંતરાલ" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "પીંગ સંદેશાઓ વચ્ચેનો અંતરાલ" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "પ્રકાશન" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "વર્તમાનમાં સક્રિય પ્લગઈનોની યાદી" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "આઉટપુટ ઉપકરણો વર્ણવતી શબ્દમાળાઓની યાદી" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "નીચી વિન્ડો" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "અન્ય વિન્ડો હેઠળ નીચી વિન્ડો" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "વિન્ડોને આડી રીતે મહત્તમ બનાવો" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "વિન્ડોને ઊભી રીતે મહત્તમ બનાવો" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "સક્રિય વિન્ડોને મહત્તમ સ્થિતિમાં લાવો" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "સક્રિય વિન્ડોને આડી રીતે મહત્તમ બનાવો" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "સક્રિય વિન્ડોને ઊભી રીતે મહત્તમ બનાવો" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "સક્રિય વિન્ડોને ન્યૂનત્તમ સ્થિતિમાં લાવો" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "સામાન્ય" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ડેસ્કટોપની સંખ્યા" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "વર્ચ્યુઅલ ડેસ્કટોપની સંખ્યા" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ઊભા કોરા સમયગાળા દરમ્યાન માત્ર સ્ક્રીન સુધારાઓ જ કરે છે" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "આઉટપુટ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "પીંગ વિલંબ" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "ક્લિક કરવા પર વધારો" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "વિન્ડો વધારો" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "પસંદિત વિન્ડોને અંતરાલ પછી વધારો" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "વિન્ડોને બીજી બધી વિન્ડોની ઉપર લાવો" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "જ્યારે ક્લિક થાય ત્યારે વિન્ડો વધારો" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&રીફેશ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "આડા વર્ચ્યુઅલ માપ માટે સ્ક્રીન માપ ગુણક" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "ઊભા વર્ચ્યુઅલ માપ માટે સ્ક્રીન માપ ગુણક" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "ડેસ્કટોપ બતાવો" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "ધીમ એનીમેશનો" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "ચપળ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank માં સુમેળ કરો" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "લખાણ ગાળણ" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "લખાણ ગાળક" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "લખાણ ગાળણ" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "દર કે જેનાથી સ્ક્રીન પુનઃદોરાય છે (સમય/સેકન્ડો)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "વિન્ડોને મહત્તમ કરેલ સ્થિતિમાં બદલો" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "વિન્ડો આડી રીતે મહત્તમ કરેલ સ્થિતિમાં બદલો" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "વિન્ડો ઊભી રીતે મહત્તમ કરેલ સ્થિતિમાં બદલો" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "વિન્ડો પડછાયાવાળી બદલો" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "સક્રિય વિન્ડો મહત્તમ કરેલ સ્થિતિમાં બદલો" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "સક્રિય વિન્ડો આડી રીતે મહત્તમ કરેલ સ્થિતિમાં બદલો" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "સક્રિય વિન્ડો ઊભી રીતે મહત્તમ કરેલ સ્થિતિમાં બદલો" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "સક્રિય વિન્ડો પડછાયાવાળી બદલો" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ધીમા એનીમેશનોનો વપરાશ બદલો" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "સક્રિય વિન્ડોને મહત્તમ સ્થિતિમાંથી પાછી લાવો" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "પૂર્ણસ્ક્રીન વિન્ડોનું પુનઃદિશામાન દૂર કરો" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "જ્યારે સ્ક્રીન પરિવહન થઈ રહી હોય ત્યારે આછો પ્રકાશ વાપરો" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "ઊભું વર્ચ્યુઅલ માપ" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "વિન્ડો મેનુ બટન બાઈન્ડીંગ" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "વિન્ડો મેનુ કી બાઈન્ડીંગ" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "પ્રવેગ" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ચિત્ર સંતુલિત કરો" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ટોચની બાજુનું ચિત્ર ફેરવવા માટે સંતુલિત કરો" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "આગળની સ્લાઈડ પર અદ્યતન" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Skydome એનીમેટ કરો" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "જ્યારે ઘન ફેરવી રહ્યા હોય ત્યારે skydome ને એનીમેટ કરો" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ઘનની ટોચ અને તળિયેની બાજુના રંગ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "skydome-fallback ઢાળના રંગ-અટકણ તળિયા માટે વાપરવાનો રંગ" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "skydome-fallback ઢાળના રંગ-અટકણ ટોચ માટે વાપરવાનો રંગ" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ઘન રંગ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ઘન રંગ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ડેસ્કટોપ ઘન" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "ફોલ્ડ પ્રવેગ" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "ફોલ્ડ ઝડપ" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ફોલ્ડ સમયપગલું" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "મીપમેપ બનાવો જ્યારે ઊંચી ગુણવત્તા ખેંચવા માટે શક્ય હોય" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "પહેલાંની સ્લાઈડ પર પાછા જાવ" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ચિત્ર ફાઈલો" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "skydome માટે લખાણ તરીકે વાપરવાનું ચિત્ર" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "જો ફેરવવાનું માઉસથી કરવાનું હોય તો જ ઘન પારદર્શકતાનો આરંભ કરે છે." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ઘનની અંદર" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ઘનની અંદર" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "PNG અને SVG ફાઈલોની યાદી કે જે ઘનની ટોચે રેન્ડર થવી જોઈએ" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "વિવિધ આઉટપુટ સ્થિતિ" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "વિવિધ ઘન" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "આગળની સ્લાઈડ" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "મોટા ઘન પર" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ફેરવવા દરમ્યાન અપારદર્શકતા" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "જ્યારે ફેરવી રહ્યા નહિં હોય ત્યારની અપારદર્શકતા" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ફેરવવા દરમ્યાન ડેસ્કટોપ વિન્ડોની અપારદર્શકતા." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "જ્યારે ફેરવી રહ્યા નહિં હોય ત્યારે ડેસ્કટોપ વિન્ડોની અપારદર્શકતા." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "વિન્ડોને ઘન પર મૂકો" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "પહેલાંની સ્લાઈડ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "skydome રેન્ડર કરો" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "ચિત્ર ખેંચો" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ઘનની ટોચની બાજુ આવરવા માટે ચિત્રો ખેંચો" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "જો ઘણાબધા આઉટપુટ ઉપકરણો વપરાતા હોય તો ઘન કેવી રીતે દર્શાવવામાં આવે છે તે પસંદ કરે છે." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Skydome ઢાળ અંત રંગ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Skydome ઢાળ શરૂઆત રંગ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome ચિત્ર" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "ઝડપ" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "સમયપગલું" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "માત્ર માઉસ ફેરવવા પર જ પારદર્શકતા" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "ફોલ્ડ કરશો નહિં" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ઘન ફોલ્ડ કરશો નહિં" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus નિયંત્રણ પાશ્વભાગ" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "શણગાર લખાણો માટે મીપમેપને બનાવવા માટે પરવાનગી આપો" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "આદેશો :" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "શણગારનાર આદેશ વાક્ય કે જે ચલાવવામાં આવે છે જો કોઈ શણગારનાર પહેલાથી ચાલી રહ્યો નહિં હોય" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "પડછાયા X ઓફસેટ મૂકો" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "પડછાયા Y ઓફસેટ મૂકો" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "પડછાયા રંગ મૂકો" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "પડછાયા અપારદર્શકતા મૂકો" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "પડછાયા ત્રિજ્યા મૂકો" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "પડછાયા રંગ" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "પડછાયા ઓફસેટ X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "પડછાયા ઓફસેટ Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "પડછાયા અપાદર્શકતા" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "પડછાયા ત્રિજ્યા" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "વિન્ડો શણગાર" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "વિન્ડો શણગારો" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "વિન્ડો કે જેને શણગાર થવો જોઈએ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "વિન્ડો કે જેને પડછાયો હોવો જોઈએ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "સ્થાપન પૂરું થયું" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ચલ Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "આછાપણાનો સમય" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "નાનું કરવા પર/ખોલવા પર/બંધ કરવા પર આછું કરો" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "આછાપણાની ઝડપ" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "આછાપણાનો સમય" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "વિન્ડો નાનું કરો/ખોલો/બંધ કરો ઘટનાઓ પર આછાપણાની અસર" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "સિસ્ટમ બીપ પર આછાપણાની અસર" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "વિન્ડો આછી કરો જ્યારે જોડાયેલ હોય અને જ્યારે જોડાયેલ નહિં હોય ત્યારે ઘાટી કરો" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "સંપૂર્ણસ્ક્રીન દેખીતી ઘંટડી" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "સિસ્ટમ બીપ પર સંપૂર્ણસ્ક્રીન સ્ક્રીન આછાપણાની અસર" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "દૃશ્યમાન ઘંટડી" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "વિન્ડો આછાપણાની ઝડપ" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "વિન્ડો કે જે ખેંચાણ સ્થિતિમાં ખેંચાવી જોઈએ" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "વિન્ડો કે જેઓ આછી થવી જોઈએ" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "માઉન્ટ બિંદુ" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "માઉન્ટ બિંદુ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "વપરાશકર્તાજગ્યા ફાઈલ સિસ્ટમ" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "વપરાશકર્તાજગ્યા ફાઈલ સિસ્ટમ" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf નિયંત્રણ બેકેન્ડ" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib મુખ્ય લુપ આધાર" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "ટર્મિનલ ખોલો" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "સંવાદ ચલાવો" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "આદેશ '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "સ્ક્રીનશોટ આદેશ વાક્ય" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "મુખ્ય મેનુ બતાવો" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "કાર્યક્રમ ચલાવો સંવાદ બતાવો" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "મુખ્ય મેનુ બતાવો" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ફોટો લો" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "વિન્ડોનો ફોટો લો" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "આદેશ '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "વિન્ડો સ્ક્રીનશોટ આદેશ વાક્ય" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini સપાટ ફાઈલ બેકેન્ડ" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ફાઈલ બદલી સૂચન પ્લગઈન" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig નિયંત્રણ બેકેન્ડ" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "ન્યૂનતમ અસર" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "વિન્ડો ન્યૂનતમ કરો" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "ન્યૂનતમ કરવાની ઝડપ" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "સમયનોંધ ન્યૂનતમ કરો" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "પડછાયા વિરોધી" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "પડછાયા વિરોધી" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "જ્યારે વિન્ડો નાની થાય અને નાનામાંથી પાછી આવે ત્યારે પરિવહન કરવાની વિન્ડો" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "જ્યારે ન્યૂનતમ કરવાની હોય કે જેનું પરિવહન થવું જોઈએ તે વિન્ડો" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "ચલ Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "કાર્યસ્થળ વિસ્તારમાં ચલ Y યામાક્ષ" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "વિન્ડોનું સર્વર-બાજુ સ્થાન સુધારશો નહિં જ્યાં સુધી ખસેડવાનું સમાપ્ત નહિં થાય" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "વિન્ડો ખસેડવાનું આરંભ કરો" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "આળસુ સ્થાનીકરણ" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "વિન્ડો ખસેડો" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "વિન્ડોને ખસાડો" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "અપારદર્શકતા" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "ખસી રહેલ વિન્ડોની અપારદર્શકતાનું સ્તર" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "મહત્તમ થયેલ વિન્ડોને ખેંચતી વખતે સ્નેપઓફ કરો અને આપોઆપ મહત્તમ સ્થિતિમાંથી પાછી લાવો" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "મહત્તમ થયેલ વિન્ડો સ્નેપઓફ કરો" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "વિન્ડોને ખસેડવાનું શરૂ કરો" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "તેજસ્વીતા" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "તેજસ્વીતા" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "તેજસ્વીતા" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "તેજસ્વીતા" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "અપારદર્શકતા ઘટાડો" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "અપારદર્શકતા વધારો" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "અપારદર્શકતા બદલો પગલું" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "અપારદર્શકતા બદલો પગલું" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "અપારદર્શકતા પગલું" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "ખસી રહેલ વિન્ડોની અપારદર્શકતાનું સ્તર" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ફેરવવા દરમ્યાન અપારદર્શકતા" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "કન્ફિગ્યુરેશન સાચવો" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "વિન્ડો શણગારો" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "અપારદર્શક વિન્ડો કિંમતો" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "નકશા વિન્ડો" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "વિન્ડો કે જેઓ મૂળભૂત રીતે ગોઠવાયેલ હોવી જોઈએ" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "વિન્ડો કે જે મૂળભૂત રીતે અર્ધપારદર્શક હોવી જોઈએ" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "વિન્ડો કે જેઓ મૂળભૂત રીતે ગોઠવાયેલ હોવી જોઈએ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "વિન્ડો ગોઠવણી માટે વાપરવાનો અલગોરિધમ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "ધોધવાળું" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "કેન્દ્રિત થયેલ" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "વિન્ડો વ્યવસ્થાપન" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "બચાવ વિન્ડો પર ફોકસ કરો" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "આડા દૃશ્યપોર્ટ સ્થાનો" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "વિન્ડો મૂકો" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "વિન્ડોને જ્યારે જોડાય ત્યારે યોગ્ય સ્થાને મૂકો" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ગોઠવણી સ્થિતિ" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "રેન્ડમ" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "જો વિવિધ આઉટપુટ ઉપકરણો વપરાય તો વિન્ડો ક્યાં ખેંચાય તે પસંદ કરે છે." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "ચપળ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "બધા આઉટપુટ ઉપકરણો પર" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "ઊભા દૃશ્યપોર્ટ સ્થાનો" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "વિન્ડો જગ્યા ઉકેલો" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "વિન્ડો કે જેઓ મૂળભૂત રીતે ગોઠવાયેલ હોવી જોઈએ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "વિન્ડો કે જે ચોક્કસ દૃશ્યપોર્ટમાં મૂળભૂત રીતે ગોઠવાયેલ હોવા જોઈએ" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "વિન્ડો શણગારો" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ઉકેલો" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X સ્થાનો" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X દૃશ્યપોર્ટ સ્થાનો" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X સ્થાન કિંમતો" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y સ્થાનો" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y દૃશ્યપોર્ટ સ્થાનો" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y સ્થાન કિંમતો" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ચિત્ર લાવનાર" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex જોડણી" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex વિન્ડો જોડણી" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "કિનારી રંગ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "બાહ્ય કિનારી અને લંબચોરસ માપ સ્થિતિઓ માટે વપરાતો કિનારી રંગ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "મૂળભૂત માપ બદલવાની સ્થિતિ" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "વિન્ડોનું માપ બદલવા માટે વપરાતી મૂળભૂત સ્થિતિ" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "રંગ ભરો" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "લંબચોરસ માપ બદલો સ્થિતિ માટે વપરાતો ભરવાનો રંગ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "બાહ્ય કિનારી" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "બાહ્ય કિનારી માપ બદલો વિન્ડો" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "લંબચોરસ" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "લંબચોરસ માપ બદલો વિન્ડો" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "વિન્ડોનું માપ બદલો" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "વિન્ડોનુ માપ બદલો" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "વિન્ડોનું માપ બદલવાનું શરૂ કરો" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "વિન્ડોને ખેંચીને તેનું માપ બદલવાનું શરૂ કરો" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "વિન્ડોનું સામાન્ય રીતે માપ બદલવાનું શરૂ કરો" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "બાહ્ય કિનારી સાથે વિન્ડોનું માપ બદલવાનું શરૂ કરો" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "લંબચોરસ સાથે વિન્ડોનું માપ બદલવાનું શરૂ કરો" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ખેંચો" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "વિન્ડોનું માપ બદલવા ખેંચો" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "વિન્ડો કે જેના માટે સામાન્ય માપ બદલવાનું વપરાવું જોઈએ" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "વિન્ડો કે બાહ્ય કિનારીનું માપ બદલવા માટે વાપરવામાં આવવી જોઈએ" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "વિન્ડો કે લંબચોરસનું માપ બદલવા માટે વાપરવામાં આવવી જોઈએ" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "વિન્ડો કે ખેંચવાનું માપ બદલવા માટે વાપરવામાં આવવી જોઈએ" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "બાજુ પલટાવ DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "બાજુ પલટાવ ખસેડો" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "બાજુ પલટાવ નિર્દેશક" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "પલટાવ સમય" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ડાબા દૃશ્યમાં પલટાવો અને નિર્દેશક લપેટો" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "આગળના દૃશ્ય આગળ પલટાવ જ્યારે ઓબ્જેક્ટને સ્ક્રીનની બાજુ પર ખેંચી રહ્યા હોય" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "આગળના દૃશ્યમાં પલટાવો જ્યારે નિર્દેશકને સ્ક્રીનની બાજુ પર ખસેડી રહ્યા હોય" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "આગળના દૃશ્ય પર પલટાવો જ્યારે વિન્ડો સ્ક્રીનની બાજુ પર ખસેડી રહ્યા હોય" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "જમણા દૃશ્યમાં પલટાવો અને નિર્દેશક લપેટો" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "નિર્દેશક ચાલ માટે ઉલટો Y અક્ષ" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "નિર્દેશક ઉલટો Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "નિર્દેશક સંવેદનશીલતા" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ફેરવવા પર વધારો" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "જ્યારે ફેરવી રહ્યા હોય ત્યારે વિન્ડો વધારો" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ઘન ફેરવો" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ડાબે પલટાવો ફેરવો" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "પલટાવો જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "ડાબે ફેરવો" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "વિન્ડો સાથે ડાબે ફેરવો" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "વિન્ડો સાથે જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ચહેરા ૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "વિન્ડો સાથે ચહેરા ૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ચહેરા ૧૦ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "વિન્ડો સાથે ચહેરા ૧૦ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ચહેરા ૧૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "વિન્ડો સાથે ચહેરા ૧૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ચહેરા ૧૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "વિન્ડો સાથે ચહેરા ૧૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ચહેરા ૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "વિન્ડો સાથે ચહેરા ૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ચહેરા ૩ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "વિન્ડો સાથે ચહેરા ૩ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ચહેરા ૪ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "વિન્ડો સાથે ચહેરા ૪ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ચહેરા ૫ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "વિન્ડો સાથે ચહેરા ૫ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ચહેરા ૬ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "વિન્ડો સાથે ચહેરા ૬ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ચહેરા ૭ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "વિન્ડો સાથે ચહેરા ૭ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ચહેરા ૮ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "વિન્ડો સાથે ચહેરા ૮ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ચહેરા ૯ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "વિન્ડો સાથે ચહેરા ૯ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ઘન ફેરવો" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ડેસ્કટોપ ઘન ફેરવો" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "ડાબે ફેરવો" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "વિન્ડો સાથે ડાબે ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "જમણે ફેરવો" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "વિન્ડો સાથે જમણે ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ચહેરા ૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "વિન્ડો સાથે ચહેરા ૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ચહેરા ૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૧ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ચહેરા ૧૦ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૧૦ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ચહેરા ૧૧ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૧૧ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ચહેરા ૧૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૧૨ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ચહેરા ૨ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૨ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ચહેરા ૩ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૩ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ચહેરા ૪ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૪ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ચહેરા ૫ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૫ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ચહેરા ૬ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૬ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ચહેરા ૭ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૭ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ચહેરા ૮ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૮ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ચહેરા ૯ તરફ ફેરવો" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "વિન્ડો સાથે ચહેરા ૯ તરફ ફેરવો અને સક્રિય લાવો" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "દૃશ્યમાં ફેરવો" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "સ્થાપન પૂરું થયું" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "સ્થાપન પૂરું થયું" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "સ્થાપન પૂરું થયું" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "સ્થાપન પૂરું થયું" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "નિર્દેશક ચાલની સંવેદનશીલતા" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ટોચના ચહેરા ઉપર સ્નેપ ઘન ફેરવવાનું" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ટોચના ચહેરા ઉપર સ્નેપ ઘન ફેરવવાનું" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ટોચના ચહેરા ઉપર સ્નેપ" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ટોચના ચહેરા ઉપર સ્નેપ" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "શોધી કાઢવાનું ફ&રીશરૂ થઇ રહ્યું છે" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "દૃશ્ય પલટાવવા પહેલાંનો સમયસમાપ્તિ ગાળો" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "નાનું-મોટુ કરો" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "અપારદર્શકતાનો જથ્થો ટકામાં" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "મોટું" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ડેસ્કટોપ બતાવવા માટે ડેસ્કટોપ ક્લિક કરો" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "ઘાટું પાશ્વભાગ" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "જ્યારે વિન્ડો ખેંચી રહ્યા હોય ત્યારે ઘાટું પાશ્વભાગ" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "સંજ્ઞા" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "જ્યારે ખેંચવા દરમ્યાન ડેસ્કટોપ પર ક્લિક થાય ત્યારે ડેસ્કટોપ બતાવો સ્થિતિ દાખલ કરો" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "રક્ષણ સમય" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "બધી વિન્ડો માટે વિન્ડો લેનારનો આરંભ કરો" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "વિન્ડો જૂથ માટે વિન્ડો લેનારનો આરંભ કરો" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "વર્તમાન આઉટપુટ પર વિન્ડો માટે વિન્ડો લેનારનો આરંભ કરો" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "બધી વિન્ડોનું રૂપાંતરણ અને લેઆઉટ શરૂ કરો" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "વિન્ડો જૂથનું રૂપાંતરણ અને લેઆઉટ શરૂ કરો" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "દેખાવ અને વિન્ડોનું રૂપાંતરણ શરૂ કરો" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "વર્તમાન આઉટપુટ પર વિન્ડોનું રૂપાંતરણ અને લેઆઉટ શરૂ કરો" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "બધા આઉટપુટ ઉપકરણો પર" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "વર્તમાન આઉટપુટ ઉપકરણ પર" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ઓવરલે ચિહ્ન" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "વિન્ડો પર ચિહ્ન ઓવરલે કરો જ્યારે તેઓ ખેંચાય" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "માપદંડ" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "વિન્ડો ખેંચો" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ખેંચાવાની ઝડપ" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ખેંચાવાનું સમયપગલું" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "જો વિવિધ આઉટપુટ ઉપકરણો વપરાય તો વિન્ડો ક્યાં ખેંચાય તે પસંદ કરે છે." #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "છોડેલી જગ્યા" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "જ્યારે વિન્ડો ઉપર ફરી રહ્યા હોય ત્યારે ખેંચાણ સ્થિતિ બંધ થાય તે પહેલાંનો સમય (મિલિસેકન્ડમાં)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "વિન્ડો કે જે ખેંચાણ સ્થિતિમાં ખેંચાવી જોઈએ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "સ્ક્રીનશોટ આપોઆપ આ કાર્યક્રમમાં ખોલો" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "&સ્થાનિક ડિરેક્ટરી" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "કેટાલોગ પસંદગી" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "કાર્યક્રમ લાવો" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "આ ડિરેક્ટરીમાં સ્ક્રીનશોટ ચિત્રો મૂકો" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "સ્ક્રીનશોટ" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "સ્ક્રીનશોટ પ્લગઈન" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ચિત્ર લાવનાર" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "તેજસ્વીતાનો જથ્થો ટકામાં" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "સંતુલનનો જથ્થો ટકામાં" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "કાર્યક્રમ બદલનાર" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "પ્રારંભ કરાઈ રહયું છે." #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "બુટ દરમિયાન" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "પસંદિત વિન્ડોને આગળ લાવો" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "વિન્ડો બદલતી વખતે ડેસ્કટોપ નાની કરતી વખતનું અતર" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "ચિહ્ન" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ન્યૂનતમ કરેલ" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ડેસ્કટોપ પ્લેન" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "પોપઅપ બદલનાર જો દેખીતું ના હોય અને આગળની વિન્ડો પસંદ કરો" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "પોપઅપ બદલનાર જો દેખીતું ના હોય અને બધી વિન્ડોમાંથી આગળની વિન્ડો પસંદ કરો" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "પોપઅપ બદલનાર જો દેખીતું ના હોય અને પહેલાંની વિન્ડો પસંદ કરો" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "પોપઅપ બદલનાર જો દેખીતું ના હોય અને બધી વિન્ડોમાંથી પહેલાંની વિન્ડો પસંદ કરો" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "પહેલાંની સ્લાઈડ" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "પહેલાંની વિન્ડો" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "પહેલાંની વિન્ડો (બધી વિન્ડો)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "પહેલાંની વિન્ડો (કોઈ પોપઅપ નથી)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "જ્યારે બદલી રહ્યા હોય ત્યારે પસંદિત વિન્ડો સુધી ફેરવો" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "એકપણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "પોપઅપ વિન્ડો બતાવ્યા વિના આગળની વિન્ડો પસંદ કરો." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "એકપણ પસંદ ન કરો" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "પોપઅપ વિન્ડો બતાવ્યા વિના પહેલાંની વિન્ડો પસંદ કરો." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "થમ્બનેઈલ આગળ ચિહ્ન બતાવો" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "ન્યૂનતમ કરેલ વિન્ડો બતાવો" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "બદલનારની ઝડપ" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "બદલનાર સમયપગલું" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "બદલનાર વિન્ડો" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "વિન્ડો કે જે બદલનારમાં બતાવવી જોઈએ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 રંગજગ્યા આધાર પૂરો પાડો" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "વીડિયો પ્લેબેક" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "વીડિયો પ્લેબેક" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 રંગજગ્યા" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "લીટી ઉમેરો" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "બંદુ ઉમેરો" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "અલગ ડેસ્કટોપ ક્રિયાઓમાં પાણી અસરો ઉમેરે છે" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "દરેક વરસાદ-પડવા વચ્ચેનો વિલંબ (ms માં)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "નિર્દેશક પાણી અસરો સક્રિય કરો" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "લીટી" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ઓફસેટ માપ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "બિંદુ" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "વરસાદ વિલંબ" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "શીર્ષક તરંગ" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "વરસાદ બદલો" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "વરસાદ અસર બદલો" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "વાઈપર બદલો" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "વાઈપર અસર બદલો" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "પાણી અસર" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "પાણી ઓફસેટ માપ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "વિન્ડો શીર્ષકમાંથી તરંગ અસર" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ફોકસ અસર" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "વિન્ડો ફોકસ અસર" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ઘર્ષણ" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "જાળી રીઝોલ્યુશન" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ઊલટાવાયેલ વિન્ડો સ્નેપીંગ" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "વિન્ડોને ધ્રુજતી બનાવો" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "નકશા અસર" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "નકશા વિન્ડો અસર" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "નકશા વિન્ડો" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "મહત્તમ કરો અસર" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "ન્યૂનતમ જાળી માપ" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "ન્યૂનતમ Vertex જાળી માપ" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "વિન્ડો ખસેડો" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ધ્રુજારી" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "સ્નેપ ઊલટાવાયેલ" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "એકપણ પસંદ ન કરો" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "બુટ દરમિયાન" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "સ્પ્રીંગ K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "સ્પ્રીંગ અચળ" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "વિન્ડો સ્નેપીંગ બદલો" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "વિન્ડો વમળ અસર માટે સ્પ્રીંગ મોડેલ વાપરો" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Vertex જાળી રીઝોલ્યુશન" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "વિન્ડો કે જે ફોકસ થાય ત્યારે વમળ થવી જોઈએ" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "વિન્ડો કે જે મેળવાય ત્યારે વમળ થવી જોઈએ" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "વિન્ડો જ્યારે નકશાવાળી થાય ત્યારે વમળ થવી જોઈએ" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "વિન્ડો કે જે ખસેચવામાં આવે ત્યારે વમળ થવી જોઈએ" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" "વિન્ડો જ્યારે મહત્તમ કરી રહ્યા હોય અને મહત્તમમાંથી પાછા લાવી રહ્યા હોય ત્યારે વમળ અસર" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "વિન્ડો વમળ કરો" #, fuzzy #~ msgid "Command line 0" #~ msgstr "આદેશ '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "આદેશ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "સ્ક્રીનશોટ આદેશ વાક્ય" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "સ્ક્રીનશોટ આદેશ વાક્ય" #~ msgid "Filter Linear" #~ msgstr "ગાળક રેખીય" #~ msgid "Use linear filter when zoomed in" #~ msgstr "જ્યારે મોટું થાય ત્યારે રેખીય ગાળણ વાપરો" #~ msgid "Zoom Desktop" #~ msgstr "ડેસ્કટોપ નાનીમોટી કરો" #~ msgid "Zoom In" #~ msgstr "મોટુ કરો" #~ msgid "Zoom Out" #~ msgstr "નાનુ કરો" #~ msgid "Zoom Pan" #~ msgstr "પેન નાનુંમોટું કરો" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "સ્થાપન પૂરું થયું" #~ msgid "Zoom Timestep" #~ msgstr "નાનામોટાપણાનું સમયપગલું" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ડેસ્કટોપ ઘન નાનુંમોટું કરો અને વિસ્તારો" #~ msgid "Zoom factor" #~ msgstr "નાનામોટાપણાનો અવયવ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "સ્થાપન પૂરું થયું" #~ msgid "Decrease window opacity" #~ msgstr "વિન્ડો અપારદર્શકતા ઘટાડો" #~ msgid "Increase window opacity" #~ msgstr "વિન્ડો અપારદર્શકતા વધારો" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "વિન્ડો માટેની અપારદર્શકતા કિંમતો કે જેઓ મૂળભૂત રીતે અર્ધપારદર્શક હોવી જોઈએ" #~ msgid "Opacity windows" #~ msgstr "અપારદર્શક વિન્ડો" #~ msgid "Background Images" #~ msgstr "પાશ્વભાગ ચિત્રો" #~ msgid "Background images" #~ msgstr "પાશ્વભાગ ચિત્રો" #~ msgid "Place windows on a plane" #~ msgstr "વિન્ડોને પ્લેન પર મૂકો" #~ msgid "Plane Down" #~ msgstr "પ્લેન નીચે" #~ msgid "Plane Left" #~ msgstr "પ્લેન ડાબે" #~ msgid "Plane Right" #~ msgstr "પ્લેન જમણે" #~ msgid "Plane To Face 1" #~ msgstr "ચહેરા ૧ આગળ પ્લેન" #~ msgid "Plane To Face 10" #~ msgstr "ચહેરા ૧૦ આગળ પ્લેન" #~ msgid "Plane To Face 11" #~ msgstr "ચહેરા ૧૧ આગળ પ્લેન" #~ msgid "Plane To Face 12" #~ msgstr "ચહેરા ૧૨ આગળ પ્લેન" #~ msgid "Plane To Face 2" #~ msgstr "ચહેરા ૨ આગળ પ્લેન" #~ msgid "Plane To Face 3" #~ msgstr "ચહેરા ૩ આગળ પ્લેન" #~ msgid "Plane To Face 4" #~ msgstr "ચહેરા ૪ આગળ પ્લેન" #~ msgid "Plane To Face 5" #~ msgstr "ચહેરા ૫ આગળ પ્લેન" #~ msgid "Plane To Face 6" #~ msgstr "ચહેરા ૬ આગળ પ્લેન" #~ msgid "Plane To Face 7" #~ msgstr "ચહેરા ૭ આગળ પ્લેન" #~ msgid "Plane To Face 8" #~ msgstr "ચહેરા ૮ આગળ પ્લેન" #~ msgid "Plane To Face 9" #~ msgstr "ચહેરા ૯ આગળ પ્લેન" #~ msgid "Plane Up" #~ msgstr "પ્લેન ઉપર" #~ msgid "Plane down" #~ msgstr "પ્લેન નીચે" #~ msgid "Plane left" #~ msgstr "પ્લેન ડાબે" #~ msgid "Plane right" #~ msgstr "પ્લેન જમણે" #~ msgid "Plane to face 1" #~ msgstr "ચહેરા ૧ આગળ પ્લેન" #~ msgid "Plane to face 10" #~ msgstr "ચહેરા ૧૦ આગળ પ્લેન" #~ msgid "Plane to face 11" #~ msgstr "ચહેરા ૧૧ આગળ પ્લેન" #~ msgid "Plane to face 12" #~ msgstr "ચહેરા ૧૨ આગળ પ્લેન" #~ msgid "Plane to face 2" #~ msgstr "ચહેરા ૨ આગળ પ્લેન" #~ msgid "Plane to face 3" #~ msgstr "ચહેરા ૩ આગળ પ્લેન" #~ msgid "Plane to face 4" #~ msgstr "ચહેરા ૪ આગળ પ્લેન" #~ msgid "Plane to face 5" #~ msgstr "ચહેરા ૫ આગળ પ્લેન" #~ msgid "Plane to face 6" #~ msgstr "ચહેરા ૬ આગળ પ્લેન" #~ msgid "Plane to face 7" #~ msgstr "ચહેરા ૭ આગળ પ્લેન" #~ msgid "Plane to face 8" #~ msgstr "ચહેરા ૮ આગળ પ્લેન" #~ msgid "Plane to face 9" #~ msgstr "ચહેરા ૯ આગળ પ્લેન" #~ msgid "Plane up" #~ msgstr "પ્લેન ઉપર" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ડેસ્કટોપ વિન્ડો અપાદર્શકતા આછાપણા સમય." #~ msgid "Unknown" #~ msgstr "અજાણી" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "કન્ફિગ્યુરેશન સાચવો" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "સ્થાપન પૂરું થયું" ./po/vi.po0000644000004100000410000017023013246301623012642 0ustar www-datawww-data# @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # FIRST AUTHOR , YEAR. # # This file is distributed under the same license as @PACKAGE@ package. FIRST # msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2006-07-12 07:32+0200\n" "Last-Translator: Phan Vĩnh Thịnh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" ./po/lo.po0000644000004100000410000017005213246301623012640 0ustar www-datawww-data# Lao message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2006-01-04 08:58+0100\n" "Last-Translator: i18n@suse.de\n" "Language-Team: Lao \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" ./po/bg.po0000644000004100000410000030546513246301623012626 0ustar www-datawww-data# Bulgarian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) SuSE GmbH, 2000. # Dimitar Boin , 2000. # Y Gonch , 2000. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-05-20 00:43+0200\n" "Last-Translator: Svetoslav Stefanov \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Работен плот" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Мениджър на прозорци" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 #: ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Без избор" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Сянка" #: ../gtk/gnome/compiz-window-manager.c:428 #: ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Уголемяване" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Хоризонтално максимизиране" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Вертикално максимизиране" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Намаляване" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Издигане" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Снижаване" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Меню на прозорец" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Действие което да бъде предприето при движение на колелцето на мишката върху " "заглавната лента на прозорец." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Тип размиване" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Прозрачност на активния прозорец при тема на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Прозрачност на темата на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Прозрачност за декорациите от темите на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" # Can't find bulgarian word for titlebar. #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Действие на колелцето на мишката в заглавната лента на прозорците" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Вид замъгляване използван за декорациите на прозорците" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "използвай темата на Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Използвай Metacity темата при рисуване на декорациите на прозорците" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Затваряне на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Демаксимизиране на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Максимизиране на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Минимизиране на прозорец" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Над другите" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 #, fuzzy msgid "Stick" msgstr "Лепкав" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Изключи над другите" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Прозорецът \"%s\" не отговаря." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Ако принудително изключите приложението ще загубите всички промени, които не " "са запазени" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Принудително изключване" # HT #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Анотации" # KM #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Цвят за запълване на анотациите" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Цвят за линиите на анотациите" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Модул за анотации" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Изчистване" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Изчертаване" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Изчертаване, използвайки инструмент" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Цвят за запълване на анотациите" # HT #: ../metadata/annotate.xml.in.h:9 #: ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 #: ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Започни" # HT #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Започни изчертаване на анотация" # HT #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Започни изтриване на анотация" # HT #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Изтрий анотация" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ширина на линията" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ширина на линията за анотации" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Цвят на чертите за анотации" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ширина на чертите" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ширина на чертите за анотации" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4 кратно билинеарно филтриране " #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Размиване по алфа канала" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Размиване на прозорци по алфа канала" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Филтър за размиване" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Преграждане на размиването" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Насищане на размиването" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Скорост на размиването" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Размиване на прозорци" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Размиване на прозрачните части на прозорците" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Насищане на размиването" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Размиване на прозорци" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Размиване на прозорци, които не са на фокус" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Изключи размиването за региони от екрана, закрити от други прозорци." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Метод за размиване " #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Размиване при фокус" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Прозорци размивани при фокус" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Гаусов" # RU #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Радиус" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Сила" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Радиус" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Сила" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Независимо получаване на текстурите" #: ../metadata/blur.xml.in.h:23 #: ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 #: ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Ниво на детайла за Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Ниво на детайлите за Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Пулсиране" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Пулсиращ ефект" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Скорост на размиването на прозорците" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Прозорци, за които действа размиването" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" "Прозорзи, за които се използва размиване по алфа канала по подразбиране" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Дублиране на изхода" # HT #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Започни дублиране на изхода" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Обработчик за дублиране на изхода" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда12" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда12" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбинация от клавиши, която при натискане ще стартира команда на обвивката, " "идентифицирана от команда9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Клавишни комбинации" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Команден ред 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Команден ред 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Команден ред 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Команден ред 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Команден ред 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Команден ред 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Команден ред 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Команден ред 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Команден ред 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Команден ред 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Команден ред 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Команден ред 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command0 е " "извикана" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command1 е " "извикана" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command10 е " "извикана" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command11 е " "извикана" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command2 е " "извикана" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command3 е " "извикана" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command4 е " "извикана" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command5 е " "извикана" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command6 е " "извикана" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command7 е " "извикана" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command8 е " "извикана" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Команден ред, който ще бъде изпълнен в обвивката когато run_command9 е " "извикана" #: ../metadata/commands.xml.in.h:63 #: ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Команда: " #: ../metadata/commands.xml.in.h:64 #, fuzzy msgid "Edge Bindings" msgstr "Комбинации от клавиши" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Комбинации от клавиши" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Изпълни команда 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Изпълни команда 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Изпълни команда 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Изпълни команда 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Изпълни команда 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Изпълни команда 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Изпълни команда 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Изпълни команда 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Изпълни команда 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Изпълни команда 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Изпълни команда 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Изпълни команда 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Активни модули" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Системнен звънец" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutoYast" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 #, fuzzy msgid "Automatic detection of output devices" msgstr "Автоматично откриване" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Автоматично засичане на скоростта на опресняване" #: ../metadata/core.xml.in.in.h:9 #, fuzzy msgid "Best" msgstr "Най-добър" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Фокусиране при цъкане" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Цъкането върху прозорец премества фокуса върху него" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Затвори активния прозорец" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Икона по подразбиране" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Икона на прозореца по подразбиране" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Работна станция" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Засичане на екраните" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Засичане на честотата на обновяване" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Настройки на екрана" #: ../metadata/core.xml.in.in.h:20 #, fuzzy msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Колко време трябва показалецът да стои на ръбът на екрана преди да се " "задейства действието на ръба" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Закъснение за задействане на ръба" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Бързо" #: ../metadata/core.xml.in.in.h:23 #, fuzzy msgid "Focus & Raise Behaviour" msgstr "Поведение за фокусиране и издигане" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Промяната на размера е неуспешно." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Общи настройки" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Общи настройки на Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Добро" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Скриване на всички прозорци и фокусиране на десктопа" #: ../metadata/core.xml.in.in.h:33 #, fuzzy msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Скривай прозорците които не се показват в taskbar-a когато се показва " "десктопа" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Високо" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Хоризонтален брой на виртуалните екрани" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Комбинации от клавиши" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Разрешаване на авто-спирането" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Осветление" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Списък с включените модули" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Ниско" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Долно-сорбийски" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "Хоризонтално максимизиране" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Вертикално максимизиране" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Максимизиране на активния прозорец" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Хоризонтално максимизиране на активния прозорец" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Вертикално максимизиране на активния прозорец" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Минимизирай активния прозорец" #: ../metadata/core.xml.in.in.h:57 #: ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Нормална" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Брой на работните плотове" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Брой на виртуалните работни плотове" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Изключено" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Екрани" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Закъснение" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Предпочитане на по-голям екран" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Предпочитане на по-малък екран" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Повдигане при цъкане" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Повдигане на прозореца" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Повдигане на избраният прозорец след интервал от време" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Повдигане на прозореца над другите" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Повдигане на прозореца при цъкане" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Честота на обновяване" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Покажи работния плот" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Бавни анимации" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Умен режим" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Синхронизиране с VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Компресия на повърхностите" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Филтър на повърхностите" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Филтриране на повърхностите" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Колко често се прерисува екрана (пъти в секунда)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 #, fuzzy msgid "Use diffuse light when screen is transformed" msgstr "Използвай дифузно осветление когато екрана се трансформира" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Вертикален виртуален размер" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Много високо" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Кое от застъпващите се устройства да се предпочита" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Комбинация от клавиши за менюто на прозореца" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Комбинация от клавиши за менюто на прозореца" #: ../metadata/cube.xml.in.h:1 #: ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D ускорение:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Настройка на изображението" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "Разширени параметри" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Сидни" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 #: ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Външен вид" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Автоматично" #: ../metadata/cube.xml.in.h:9 #: ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Поведение" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Цвят на горната и долната страна на куба" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" # KM #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Шапки на куба" # KM #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Цвят на куба" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Куб" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Ускорение на сгъването" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Скорост на сгъването" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Проба" #: ../metadata/cube.xml.in.h:19 #: ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "Предишен слайд" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Изображения" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Изоражение което да се ползва като повърхност за небето" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Кубът да е прозрачен само ако въртенето е предизвикано от мишката" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Във куба" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Във куба" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Списък с PNG и SVG файлове, които да се рисуват върху горната повърхност на " "куба" #: ../metadata/cube.xml.in.h:28 #: ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 #, fuzzy msgid "Multi Output Mode" msgstr "Режим на много екрани" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Много кубове" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Следващ слайд" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Един голям куб" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Прозрачност при въртене" #: ../metadata/cube.xml.in.h:33 #, fuzzy msgid "Opacity When Not Rotating" msgstr "Прозрачност когато куба не се върти" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Прозрачност на работния плот по време на въртене" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Прозрачност на работния плот когато куба не се върти" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Поставяне на прозорците върху куба" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Предишен слайд" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Изобразявай небето" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Небе" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Иображение на небето" #: ../metadata/cube.xml.in.h:46 #: ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 #: ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Скорост" #: ../metadata/cube.xml.in.h:47 #: ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 #: ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Прозрачност само при въртене с мишка" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Прозрачен куб" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Разгъване" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Разгъване на куба" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Контрол за Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Команда" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Прозорци с декорация" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "команда за декоратор, която се изпълнява ако вче не върви декоратор" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "X координати на сянката" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Y координати на сянката" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Цвят на сянката" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Прозрачност на сянката" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Радиус на сянката" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Цвят на сянката" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&Нисък капацитет" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&Нисък капацитет" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Прозрачност на сянката" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Радиус на сянката" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Прозорци с сянка" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Декорация на прозореца" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Декорации на прозореца" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Прозорци, които да бъдат декорирани" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Прозорци които да имат сянка" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Яркост(в %) на прозорците които не отговарят" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Постоянна скорост" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Постоянно време" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "В реално време" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Избрано" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "В реално време" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Файлова &система" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Изтриване на Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Намаляване на Windows" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows свободни (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Добавяне на контакт" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Добавяне на контакт" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Стартиране в терминал" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "Диалог за изпълняване на програма" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Изпълняване на команда в терминала" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Команда за заснемане на екрана" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Покажи главното меню" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Покажи диалога за изпълняване на програма" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Показване на главното меню" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Снимай екрана" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Снимай прозорец" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Команда в терминала" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Команден ред за заснемане на прозореца" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Без записване" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Без записване" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Намаляване на Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Намаляване на Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Намаляване на Windows" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "&Надолу" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Промяната на размера е неуспешно." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "&Надолу" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "&Надолу" #: ../metadata/move.xml.in.h:8 #: ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 #: ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Нисък капацитет" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "&Изтриване на Windows" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Намаляване на Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Промяната на размера е неуспешно." #: ../metadata/obs.xml.in.h:1 #: ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Мост" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Мост" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Мост" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Мост" #: ../metadata/obs.xml.in.h:5 #, fuzzy msgid "Brightness values for windows" msgstr "Яркост(в %) на прозорците които не отговарят" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Понижи непрозрачността" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Увеличаване" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Окцитан (след 1500)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Нисък капацитет" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "&Изтриване на Windows" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Прозрачност при въртене" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 #: ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Продължителност" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Продължителност" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Продължителност" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Стъпка" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Декорации на прозореца" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "" "Прозорзи, за които се използва размиване по алфа канала по подразбиране" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "" "Прозорзи, за които се използва размиване по алфа канала по подразбиране" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "" "Прозорзи, за които се използва размиване по алфа канала по подразбиране" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Алгоритъм, който да се използва при поставянето на прозорците" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Каскадно подреждане" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Центрирано подреждане" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Мениджър на прозорци" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Изтриване на Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Виртуално устройство" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Запазване в работната площ" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Изтриване на Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Произволно" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Виртуално устройство" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Параметри на ypbind" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Параметри на ypbind" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "Работна гр&упа" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Промяната на размера е неуспешно." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Виртуално устройство" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Промяната на размера е неуспешно." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Виртуално устройство" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Зареждане на PNG изображения" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 #: ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 #: ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" # KM #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Цветове" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" # KM #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Цветове" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "&Начален RAM диск" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "&Начален RAM диск" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "&Начален RAM диск" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "&Начален RAM диск" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "&Начален RAM диск" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Промяната на размера е неуспешно." # KM #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Цветове" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Разтягане" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Промяната на размера е неуспешно." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "В реално време" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Показател към %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Опи&сание на принтера" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "Надясно" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "Надясно" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Завъртане наляво" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Завъртане на ляво с прозорец" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Завъртане надясно" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Завъртане надясно с прозорец" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Завъртане към" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Завъртане към Страна 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Завъртане към Страна 1 с прозорец" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Завъртане към Страна 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Завъртане към Страна 10 с прозорец" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Завъртане към Страна 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Завъртане към Страна 11 с прозорец" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Завъртане към Страна 12" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Надясно" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Завъртане към Страна 1 с прозорец" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Завъртане на екрана" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "&Надолу" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Промяната на размера е неуспешно." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D ускорение:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Проба" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Проба" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Проба" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Начало на откриването" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 #: ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Мащабиране" #: ../metadata/scale.xml.in.h:1 #: ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Голяма" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Натисни на работен плот за да бъде показан" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Затъмняване на фона" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Емблема" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "&Начален RAM диск" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "&Начален RAM диск" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "&Начален RAM диск" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "&Начален RAM диск" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Скенер" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Изтриване на Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "местно време" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "местно време" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Изтриване на Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Изтриване на Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Испания" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 #, fuzzy msgid "Automatically open screenshot in this application" msgstr "Автоматично зареждане на аплета при влизане" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Директория" # HT #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Стартирай приложение" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Поставяй снимките на екрана в тази директория" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Снимка на екрана" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Модул за снимки на екрана" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg image loader" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Ред на прилагане" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutoYast" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "При зареждане на ОС" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Икони" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Намаляване на Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Работна станция" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Следващ прозорец" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Следващ прозорец (всички прозорци)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Следващ прозорец (без изскачащите)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Предишно ядро" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Намаляване на Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "местно време" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "местно време" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Изтриване на Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Прозорци, които трябва да бъдат показвани в превключвателя" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "До&бавяне на връзка" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Добавяне на контакт" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Закъснение (в милисекунди) между всяка дъждовна капка" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Закъснение" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Промяна на статуса" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Промяна на статуса" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Промяна на статуса" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Промяна на статуса" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Изтриване на Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Действие" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Изтриване на Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Разделителна способност" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Изтриване на Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Ефект при максимизиране" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Максимален размер" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Максимален размер" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "&Надолу" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Треперене" # this is more like 'snap by default' #: ../metadata/wobbly.xml.in.h:18 #, fuzzy msgid "Snap Inverted" msgstr "Привличане по принцип" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Привличане между прозорците" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Съпротивление на пружината" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Константа на пружината" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Константа на пружината" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "Променяне на привличането" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Използвай пружинен модел за треперещите прозорци" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Разпознаване на сървъра" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Прозорци, които трябва да треперят при фокусиране" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Прозорци, които трябва да треперят при хващане" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Прозорци, които трябва да треперят при създаване" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Прозорци, които трябва да треперят при преместване" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Треперене при максимизиране и демаксимизиране на прозорците" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Треперещи прозорци" #~ msgid "Command line 0" #~ msgstr "Команден ред 0" #~ msgid "Run command 0" #~ msgstr "Изпълни команда 0" #~ msgid "Screenshot commands" #~ msgstr "Команди за заснемане на екрана" #~ msgid "Screenshot key bindings" #~ msgstr "Ключови комбинации за заснемане на екрана" #~ msgid "Filter Linear" #~ msgstr "Линеен филтър" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Използвай линеен филтър при мащабиране" #~ msgid "Zoom Desktop" #~ msgstr "Мащабиране на работния плот" #~ msgid "Zoom In" #~ msgstr "Увеличаване" #~ msgid "Zoom Out" #~ msgstr "Намаляване" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Излизане" #~ msgid "Zoom Speed" #~ msgstr "Скорост на мащабирането" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Проба" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Излизане" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Излизане" #~ msgid "Decrease window opacity" #~ msgstr "Понижи непрозрачността на прозореца" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Страница надолу" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Надясно" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Страница нагоре" #, fuzzy #~ msgid "Plane down" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane right" #~ msgstr "Надясно" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane up" #~ msgstr "Страница нагоре" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Инструменти" #~ msgid "Menu" #~ msgstr "Меню" #, fuzzy #~ msgid "Utility" #~ msgstr "Диск с приложения (utility)..." #, fuzzy #~ msgid "Splash" #~ msgstr "splash" #, fuzzy #~ msgid "Dialog" #~ msgstr "&Тонално набиране" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Мениджър на прозорци" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Меню" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Инструменти" #, fuzzy #~ msgid "Notification" #~ msgstr "Забележки" #, fuzzy #~ msgid "Dnd" #~ msgstr "End" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Touchscreen" #~ msgid "Unknown" #~ msgstr "Неизвестно" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Продължителност" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Без записване" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Нисък капацитет" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Радиус" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Промяната на размера е неуспешно." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D ускорение: " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D ускорение: " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Проба" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Руска Федерация" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Руска" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Можете да научите повече от документацията" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Намаляване на Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Намаляване на Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Максимален размер" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Отдалечен работен плот" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Окцитан (след 1500)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D ускорение: " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Проба" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "местно време" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "местно време" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Изтриване на Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Действие" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Испания" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Филтър" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Разпознаване на сървъра" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows свободни (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows свободни (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Избрано" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Проба" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Излизане" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Промяната на размера е неуспешно." #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Завъртане на екрана" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Тип на доставчика" #, fuzzy #~ msgid "Corners" #~ msgstr "Корнски" #~ msgid "Terminate" #~ msgstr "Терминали" ./po/fr.po0000644000004100000410000026762713246301623012654 0ustar www-datawww-data# translation of compiz.po to fr-compiz.po # Copyright (C) 2007 compiz-fusion.org # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the Compiz package. # # Tristan RABLAT , 2007. # Bruno Patri , 2007. msgid "" msgstr "" "Project-Id-Version: fr-compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-06-24 17:17+0200\n" "Last-Translator: Alvin Meimoun \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Bureau" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestion des Fenêtres" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Aucun" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Ombrer" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximiser" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximiser horizontalement" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximiser verticalement" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimiser" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Augmenter" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Diminuer" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu de la fenêtre" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Action à accomplir en tournant la molette de la souris sur la barre de titre " "d'une fenêtre" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Type de flou" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacité de la fenêtre active du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Nuance de l'opacité de la fenêtre active du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacité du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Nuance de l'opacité du thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacité à utiliser pour les fenêtres actives avec les décorations des thèmes " "Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacité à utiliser pour les décorations des thèmes Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Nuancer les fenêtres actives avec les décorations du thème Metacity, " "d'opaque à transparent" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Nuancer les fenêtres avec les décorations du thème Metacity, d'opaque à " "transparent" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Action de la molette de souris sur la barre de titre" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Type de flou utilisé pour les décorations des fenêtres" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Utiliser le thème Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Utiliser le thème Metacity pour dessiner les décorations de fenêtres" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fermer la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Restaurer la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Optimiser la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimiser la fenêtre" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Placer au dessus" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Coller" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Ne plus ombrer" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Ne plus placer au dessus" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Décoller" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "La fenêtre \"%s\" ne répond pas." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forcer cette application à quitter causera la perte de tout changement non " "enregistré." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forcer à quitter" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Annoter" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Couleur de remplissage des annotations" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Couleur du contour des annotations" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Extension \"Annotation\"" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Effacer" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Dessiner" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Dessiner avec un outil" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Couleur de remplissage des annotations" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Lancer" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Lancer le dessin d'annotations" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Lancer l'effacement des annotations" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Lancer l'effacement" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Largeur de ligne" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Largeur de ligne des annotations" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Couleur du contour des annotations" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Largeur du contour" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Largeur du contour des annotations" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "Bilinéaire 4x" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Flou Alpha" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Flou Alpha Fenêtres" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtre flou" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Occlusion Floue" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturation du flou" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Vitesse de flou" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Flouter les fenêtres" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Flou derrière les parties transparentes des fenêtres" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturation du flou" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Flouter les fenêtres" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Flouter les fenêtres qui n'ont pas le focus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Désactiver le flou des régions de l'écran obscurcies par d'autres fenêtres" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Méthode de filtrage utilisée pour le flou" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Flou du focus" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Le focus floute les fenêtres" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussien" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Rayon Gaussien" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Puissance Gaussienne" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Rayon Gaussien" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Puissance Gaussienne" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Récupérer la texture indépendante" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Niveau de détail des Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsation" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Effet de pulsation" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "utiliser les unités de texture disponible pour récupérer autant que possible " "la texture indépendante" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Vitesse de floutage de la fenêtre" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Types de fenêtres devant utiliser le flou du focus" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Types de fenêtres devant utiliser le fondu par défaut" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Cloner la sortie" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Sélection du mode vidéo (clône)" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Manipulateur de clône de sortie" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Raccourci qui, lorsqu'il est appelé, exécute la commande du shell identifiée " "par command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Assignation de commandes arbitraires" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Assignation des boutons" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Ligne de commande 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Ligne de commande 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Ligne de commande 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Ligne de commande 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Ligne de commande 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Ligne de commande 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Ligne de commande 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Ligne de commande 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Ligne de commande 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Ligne de commande 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Ligne de commande 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Ligne de commande 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command0 est appelé" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command1 est appelé" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command10 est appelé" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command11 est appelé" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command2 est appelé" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command3 est appelé" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command4 est appelé" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command5 est appelé" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command6 est appelé" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command7 est appelé" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command8 est appelé" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Ligne de commande à exécuter dans le shell lorsque run_command9 est appelé" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Commandes" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Assignation des bords" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Assignation des touches" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Exécuter la commande 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Exécuter la commande 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Exécuter la commande 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Exécuter la commande 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Exécuter la commande 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Exécuter la commande 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Exécuter la commande 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Exécuter la commande 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Exécuter la commande 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Exécuter la commande 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Exécuter la commande 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Exécuter la commande 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Extensions actives" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Empêcher la redirection vers des pixmaps hors de l'écran lors de l'affichage " "des fenêtres plein écran" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Cloche audible" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Signal sonore du système audible" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Remontée automatique" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Délai de remontée automatique" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Détection automatiques des périphériques de sortie" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Détection automatique de la fréquence de rafraîchissement" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Meilleur" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Cliquer pour obtenir le focus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Si vous cliquez sur la fenêtre, vous déplacez le focus dessus" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Fermer la fenêtre active" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icône par défaut" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Image de l'icône de la fenêtre par défaut" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Taille du bureau" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Détection des sorties" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Détecter la fréquence de rafraîchissement" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Paramètres d'affichage" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Durée pendant laquelle le pointeur doit rester au bord de l'écran avant que " "l'action ait lieu." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Délai de déclenchement des bordures" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rapide" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Comportement de la prise de focus & de l'augmentation" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Niveau de sensibilité du Focus" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Fenêtres prévenues du Focus" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "fenêtres prévenues du focus" # coloration trouvé plus juste que peinture #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forcer le rendement indépendant de coloration" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Options Générales" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Options Générales de Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bon" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Masquer les fenêtres de la barre des tâches" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Masquer toutes les fenêtres et afficher le bureau" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Masquer les fenêtres qui ne se trouvent pas dans la barre des tâches lorsque " "vous passez en mode d'affichage du bureau" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Élevé" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Taille virtuelle horizontale" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Si elle est disponible, utiliser la compression des textures venant d'images " "converties" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorer les conseils lorsque la fenêtre est agrandie" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorer l'incrément de taille et les conseils d'aspect lorsque la fenêtre " "est agrandie" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalle avant de remonter les fenêtres sélectionnées" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalle entre les messages ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Assignation des touches" # En français, on ne vole pas un focus mais je n'ai pas trouvé mieux. #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Niveau de sensibilité du vol de Focus" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Éclairage" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste des extensions (plugins) actuellement actives" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste des chaînes décrivant les périphériques de sortie" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Faible" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Abaisser la fenêtre" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Abaisser la fenêtre sous d'autres fenêtres" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Optimiser la fenêtre horizontalement" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Optimiser la fenêtre verticalement" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Optimiser la fenêtre active" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Optimiser la fenêtre active horizontalement" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Optimiser la fenêtre active verticalement" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiser la fenêtre active" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Nombre de bureaux" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Nombre de bureaux virtuels" # En français, on/off est compris par tout le monde et on préfèreéviter de réutiliser le mot désactivé #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Off" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "N'effectuer les mises à jour de l'écran que lors de la période de vidage " "vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Sorties" # Traduction très peu sûre #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Chevauchement de manipulations de sorties" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Peindre chaque sortie de périphérique indépendamment, même si elles se " "chevauchent." #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Délai du Ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Préférer une sortie plus grande" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Préférer une sortie plus petite" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Remonter au clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Remonter la fenêtre" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Remonter les fenêtres sélectionnées après l'intervalle" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Remonter la fenêtre au-dessus des autres" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Remonter les fenêtres lorsque vous cliquez dessus" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Fréquence de rafraîchissement" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicateur de taille d'écran pour taille virtuelle horizontale" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicateur de taille d'écran pour taille virtuelle verticale" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Afficher le Bureau" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Ralentir les animations" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Mode Élégant" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sync vers VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compression de texture" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtre de texture" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrage de texture" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Vitesse à laquelle l'écran est redessiné (fois/seconde)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Basculer la fenêtre agrandie" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Basculer la fenêtre agrandie horizontalement" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Basculer la fenêtre agrandie verticalement" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Basculer la fenêtre ombrée" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Basculer la fenêtre active agrandie" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Basculer la fenêtre active agrandie horizontalement" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Basculer la fenêtre active agrandie verticalement" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Basculer la fenêtre active ombrée" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Basculer l'utilisation d'animations lentes" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Restaurer la fenêtre active" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Ne pas rediriger les fenêtres plein écran" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Utiliser la lumière diffuse lorsque l'écran est transformé" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Taille virtuelle verticale" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Très élevé" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Quel périphérique de sortie chevauchée devrait être préférée" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Bouton de racourci du menu de la fenêtre" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Touche de racourci du menu de la fenêtre" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accélération" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajuster l'Image" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajuster l'image de la face supérieure à la rotation" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Passer à la diapositive suivante" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animer le Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animer le Skydome lors de la rotation de cube" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Apparence" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatique" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportement" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Couleur des côtés supérieur et inférieur du cube" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Couleur à utiliser pour l'arrêt de couleur inférieure du gradient de rappel " "de Skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Couleur à utiliser pour l'arrêt de couleur supérieure du gradient de rappel " "de Skydome" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Habillage du cube" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Couleur du cube" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cube du Bureau" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Accélération de pliage" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Vitesse de pliage" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Intervalle de pliage" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Générer des mipmaps dans la mesure du possible pour une mise à l'échelle de " "meilleure qualité" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Revenir à la diapositive précédente" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Fichiers image" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Image à utiliser comme texture pour le Skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Rendre le Cube transparent seulement si la rotation est contrôlée par la " "souris" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Vue de l'intérieur du Cube" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "À l'intérieur du cube" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Liste de fichiers PNG et SVG à afficher sur la face supérieure du cube" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Mode de sorties multiples" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cubes multiples" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositive suivante" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un grand cube" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacité pendant la rotation" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacité à l'arrêt" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacité de la fenêtre du bureau pendant la rotation" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacité de la fenêtre du bureau à l'arrêt" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Placer des fenêtres sur le cube" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapositive précédente" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Afficher le Skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Mettre l'image à l'échelle" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Mettre les images à l'échelle pour couvrir la face supérieure du cube" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Choisir comment le cube est affiché si plusieurs périphériques de sortie " "sont utilisés" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Couleur de fin du gradient du Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Couleur de début du gradient du Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Image du Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Vitesse" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Intervalle" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparence seulement si la souris contrôle la rotation" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cube transparent" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Déplier" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Déplier le cube" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "DBus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend de contrôle DBus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permettre la génération de mipmaps pour les textures de décoration" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Commande" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Décoration des fenêtres" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Ligne de commande du décorateur qui est exécutée si aucun décorateur ne " "fonctionne" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Décalage X de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Décalage Y de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Couleur de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacité de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Rayon de l'ombre des gouttes" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Couleur de l'ombre" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Décalage X de l'ombre" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Décalage Y de l'ombre" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacité de l'ombre" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Rayon de l'ombre" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ombrer les fenêtres" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Décoration de la fenêtre" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Décorations des fenêtres" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Types de fenêtres devant être décorées" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Types de fenêtres devant avoir une ombre" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Luminosité (en %) des fenêtres ne répondant pas" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Vitesse constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Temps constant" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Fenêtres ne répondant pas ternes" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Les Fenêtres ternes qui ne répondent pas aux requêtes du gestionnaire de " "fenêtres." #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Mode de Fondu" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Fondu quand une fenêtre est Minimisée/ouverte/fermée" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Vitesse de fondu" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Temps de Fondu" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Effet de fondu lors des événements Minimiser/Ouvrir/Fermer la fenêtre" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Effet de fondu au signal sonore du système" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Apparition/disparition en fondu des fenêtres à l'ouverture/fermeture" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Fondu des Fenêtres" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Types de fenêtres à animer" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Cloche visuelle plein écran" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Effet de fondu plein écran au signal sonore du système" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturation (en %) des fenêtres ne répondant pas" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Luminosité d'une fenêtre ne répondant pas" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturation d'une fenêtre ne répondant pas" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Cloche visuelle" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Mode de fondu de la fenêtre" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vitesse du fondu d'une fenêtre dans le mode de \"Vitesse constante\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Temps (en ms) du fondu d'une fenêtre dans le mode de \"Vitesse constante\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Types de Fenêtres devant utiliser le fondu" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Point de montage" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Point de montage" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Système de fichier de l'Espace Utilisateur" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Système de fichier de l'espace utilisateur" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend de contrôle GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Support de la boucle principale GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilité avec Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Ouvrir un terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Options qui rendent Compiz compatible avec l'environnement de bureau Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Boîte de dialogue d'exécution" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Commande pour lancer le Terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Ligne de commande de capture d'écran" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Afficher le menu principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Afficher la boîte de dialogue d'exécution de l'application" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Afficher le menu principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Faire une capture d'écran" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Faire une capture d'écran d'une fenêtre" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Commande à lancer pour le Terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Ligne de commande de capture de fenêtre" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini (Ne pas modifier)" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini Flat File Backend" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Extension pour la notification de modification de fichier" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend de contrôle Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Effet de Minimisation" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimiser la fenêtre" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Vitesse de minimisation" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Intervalle de minimisation" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Résistance de l'Ombre" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Résistance de l'ombre" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformer les fenêtres lorsqu'elles sont réduites ou agrandies" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Types de fenêtres à transformer lorsqu'elles sont réduites" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Contraindre Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Contraindre la coordonnée Y à être dans la zone de l'espace de travail" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Ne pas mettre à jour la position de la fenêtre coté serveur, tant que son " "mouvement n'est pas fini" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Lancer le déplacement de fenêtre" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Positionnement souple" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Déplacer la fenêtre" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Déplacer la fenêtre" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacité" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Niveau d'opacité pour déplacer des fenêtres" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Désactiver l'alignement et la démaximisation automatique des fenêtres " "lorsque vous les faites glisser" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Désactiver l'alignement des fenêtres agrandies" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Démarrer le déplacement de la fenêtre" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Luminosité" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Réduire la luminosité" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Augmenter la luminosité" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Incrément de luminosité" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valeur de la luminosité des fenêtres" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Réduire" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Augmenter" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Réduire l'opacité" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Augmenter l'opacité" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Incrément d'opacité" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valeurs d'opacité des fenêtres" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacité, luminosité et saturation" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ajustement de l'opacité, de la luminosité et de la saturation" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturation" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Réduire la saturation" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Augmenter la saturation" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Incrément de la saturation" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valeurs de saturation des fenêtres" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Incrément" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Réglages spécifiques des fenêtres" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valeurs des fenêtres" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Fenêtres" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Fenêtres devant avoir une luminosité différente par défaut" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Fenêtres devant avoir une opacité différente par défaut" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Fenêtres devant avoir une saturation différente par défaut" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algorithme à utiliser pour le déplacement des fenêtres" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascade" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centré" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Placement des fenêtres fixes" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forcer le Placement d'une fenêtre" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Positions du viewport horizontal" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Garder dans la Zone de Travail" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Garder la fenêtre dans la zone de travail, même si cela signifie que la " "position peut différer de celle spécifiée" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Placer des fenêtres" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Placer à travers toutes les sorties" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Placer des fenêtres aux positions correctes lorsqu'elles sont mappées" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Mode de placement" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Fenêtres positionnées" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aléatoire" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Sélectionne comme un emplacement de fenêtre pourrait se comporter si " "plusieurs sorties sont sélectionnées" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelligent" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Utilise la périphérique de sortie actif" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Utilise la périphérique de sortie sur la fenêtre active" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Utilise la périphérique de sortie avec le pointeur" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Positions du viewport vertical" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Fenêtres positionnées sur un bureau" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Solutions de placement de fenêtre" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fenêtres devant être positionnées par défaut" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Types de fenêtres qui devraient être positionnées sur un bureau spécifique " "par défaut" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Les fenêtres pourrait être forcées à se situer, même si elles indiquent que " "le gestionnaire de fenêtre pourrait éviter de les situer." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Fenêtres avec des positions fixes" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Fenêtres avec un \"viewport\" fixe" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Solutions" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Positions en X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Positions du viewport en X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valeurs de la position en X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Positions en Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Positions du viewport en Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valeurs de la position en Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Chargeur d'Images png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Correspondance Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Correspondance Regex" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Assignations" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Couleur de Bordure" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Couleur de la bordure utilisée pour les modes de redimensionnement " "Rectangulaire et Contour" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Mode de redimensionnement par défaut" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Mode utilisé par défaut pour le redimentionnement de fenêtre" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Couleur de Remplissage" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Couleur de remplissage pour le mode de redimensionnement rectangulaire" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Lancer le redimensionnement de fenêtre Normal" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Lancer le redimensionnement de fenêtre Contour" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Lancer le redimensionnement de fenêtre Rectangle" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Lancer le redimensionnement de fenêtre Étiré" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Lancer le redimensionnement de fenêtre" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Redimensionne les fenêtres en mode Normal" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contour" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Redimensionne les fenêtres en mode Contour" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectangle" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Redimensionne les fenêtres en mode Rectangle" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Redimensionner la Fenêtre" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Redimensionner la fenêtre" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Commencer à redimensionner la fenêtre" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Commencer à redimensionner la fenêtre en l'étirant" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Commencer à redimensionner la fenêtre normalement" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Commencer à redimensionner la fenêtre avec le contour" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Commencer à redimensionner la fenêtre avec un rectangle" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Étirer" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Redimensionne les fenêtres en mode Étiré" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Types de fenêtres qui devraient utiliser le redimensionnement Normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Types de fenêtres qui devraient utiliser le redimensionnement Contour" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" "Types de fenêtres qui devraient utiliser le redimensionnement Rectangle" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Types de fenêtres qui devraient utiliser le redimensionnement Étiré" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Rotation de côté - Glissement-déplacement" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Rotation de côté - Déplacement" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Rotation de côté - Pointeur" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Temps de rotation" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Rotation sur le coté gauche avec le pointeur" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Rotation vers la face suivante - Glissement d'un objet vers le côté de " "l'écran" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Rotation vers la face suivante - Déplacement du pointeur vers le côté de " "l'écran" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Rotation vers la face suivante - Déplacement de la fenêtre vers le côté de " "l'écran" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Rotation sur le coté droit avec le pointeur" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Insérer l'axe Y pour le mouvement du pointeur" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inversion Y du pointeur" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilité du pointeur" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Remonter lors de la rotation" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Remonter la fenêtre lors de la rotation" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Rotation du Cube" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Rotation sur le côté gauche" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Rotation sur le côté droit" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Rotation à gauche" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Rotation à gauche avec la fenêtre" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Rotation à droite" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Rotation à droite avec la fenêtre" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Rotation vers" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Rotation vers la face 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rotation vers la face 1 avec la fenêtre" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Rotation vers la face 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Rotation vers la face 10 avec la fenêtre" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Rotation vers la face 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Rotation vers la face 11 avec la fenêtre" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Rotation vers la face 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Rotation vers la face 12 avec la fenêtre" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Rotation vers la face 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Rotation vers la face 2 avec la fenêtre" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Rotation vers la face 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Rotation vers la face 3 avec la fenêtre" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Rotation vers la face 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Rotation vers la face 4 avec la fenêtre" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Rotation vers la face 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Rotation vers la face 5 avec la fenêtre" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Rotation vers la face 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Rotation vers la face 6 avec la fenêtre" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Rotation vers la face 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Rotation vers la face 7 avec la fenêtre" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Rotation vers la face 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Rotation vers la face 8 avec la fenêtre" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Rotation vers la face 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Rotation vers la face 9 avec la fenêtre" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Rotation du Cube" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Rotation du cube de bureau" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Rotation à gauche" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Rotation à gauche avec la fenêtre active" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Rotation à droite" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rotation à droite avec la fenêtre active" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Rotation vers la face du cube" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Rotation vers la face du cube avec fenêtre" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Rotation vers la face 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Rotation vers la face 1 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Rotation vers la face 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Rotation vers la face 10 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Rotation vers la face 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Rotation vers la face 11 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Rotation vers la face 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Rotation vers la face 12 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Rotation vers la face 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Rotation vers la face 2 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Rotation vers la face 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Rotation vers la face 3 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Rotation vers la face 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Rotation vers la face 4 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Rotation vers la face 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Rotation vers la face 5 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Rotation vers la face 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Rotation vers la face 6 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Rotation vers la face 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Rotation vers la face 7 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Rotation vers la face 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Rotation vers la face 8 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Rotation vers la face 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Rotation vers la face 9 avec la fenêtre active" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rotation vers un bureau (une face)" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Rotation de la fenêtre" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Rotation avec la fenêtre" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Accélération de la rotation" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Vitesse de la rotation" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Intervalle de la rotation" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom de la rotation" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilité du mouvement du pointeur" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Aligner la rotation du cube avec la face inférieure" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Aligner la rotation du cube avec la face supérieure" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Aligner avec la face inférieure" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Aligner avec la face supérieure" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Démarrer la rotation" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Délai avant la rotation du bureau" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Quantité d'opacité en pourcentage" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grand" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Assignation des boutons de bascule du mode échelle" #: ../metadata/scale.xml.in.h:7 #, fuzzy msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Assignation des boutons de bascule du mode échelle au lieu de l'activer une " "fois pressé et de le désactiver une foi relâché" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Cliquez sur le Bureau pour l'afficher" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Assombrir l'arrière-plan" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Assombrir l'arrière-plan lors de la Mise à l'Échelle des fenêtres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblème" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrer en mode Affichage Du Bureau quand celui-ci est cliqué pendant la Mise " "à l'Échelle" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Temps de survol" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Lancer le sélecteur de fenêtre" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Lancer le sélecteur de fenêtre pour toutes les fenêtres" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Lancer le sélecteur de fenêtre pour un groupe de fenêtres" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" "Lancer le sélecteur de fenêtre pour les fenêtres sur la sortie actuelle" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Assignation des touches de bascule du mode échelle" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Assignation des boutons de bascule du mode échelle au lieu de l'activer en " "pressant et le désactiver en relâchant." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Disposer et commencer à transformer toutes les fenêtres" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Disposer et commencer à transformer un groupe de fenêtres" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Disposer et commencer à transformer les fenêtres" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" "Disposer et commencer à transformer des fenêtres sur la sortie actuelle" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Sur tous les périphériques de sortie" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Sur le périphérique de sortie courant" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Superposer l'icône" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" "Superposer une icône sur les fenêtres lorsqu'elles ont été mises à l'échelle" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Échelle" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Mettre les fenêtres à l'échelle" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Vitesse de mise à l'échelle" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Intervalle de mise à l'échelle" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Mettre toutes les fenêtres à la même échelle" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Choisir où les fenêtres sont mises à l'échelle si plusieurs périphériques de " "sortie sont utilisés." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espace entre les fenêtres" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espacement" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Temps (en ms) avant que le mode Échelle soit terminé lors du survol au-" "dessus d'une fenêtre" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Types de fenêtres à mettre à l'échelle en mode Échelle" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Ouvrir automatiquement la capture d'écran dans cette application" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Répertoire" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Lancer une capture d'écran" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Lancer une Application" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Mettre les captures d'écran dans ce répertoire" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Capture d'écran" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Extension de capture d'écran" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Chargeur d'images Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantité de luminosité en pourcentage" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantité de saturation en pourcentage" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Sélecteur d'Application" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rotation automatique" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Placer au-dessus" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Placer la fenêtre sélectionnée au-dessus" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Le bureau à distance doit être en zoom arrière lors du passage d'une fenêtre " "à une autre" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icône" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimisé" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Panneau Suivant" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Fenêtre suivante" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Fenêtre suivante (toutes les fenêtres)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Fenêtre suivante (pas de sélecteur)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "suivante" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "suivante parmi toutes les fenêtres" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "précédente" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Afficher le sélecteur s'il n'est pas visible et sélectionner la fenêtre " "précédente parmi toutes les fenêtres" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Panneau Précédent" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Fenêtre précédente" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Fenêtre précédente (toutes les fenêtres)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Fenêtre précédente (pas de sélecteur)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Tourner vers la fenêtre sélectionnée pendant la commutation" # Ca ne veut rien dire... #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Sélectionner la prochaine fenêtre de la police du panneau" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Sélectionner la fenêtre suivante sans montrer le sélecteur" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Sélectionner la précédente fenêtre de la police du panneau" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Sélectionner la fenêtre précédente sans montrer le sélecteur" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Afficher l'icône à côté de la miniature" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Afficher des fenêtres réduites" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Vitesse du sélecteur" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Intervalle du sélecteur" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Types de fenêtres du sélecteur" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Types de fenêtres à afficher dans le sélecteur" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Fournir le support de l'espace colorimétrique YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Lecture Vidéo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Lecture vidéo" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espace colorimétrique YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Ajouter une ligne" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Ajouter un point" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Ajoute des effets d'eau à différentes opérations du bureau" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Délai (en ms) entre chaque goutte de pluie" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activer les effets d'eau du pointeur" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Ligne" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Échelle de décalage" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Point" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Délai de pluie" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Vague sur le titre" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Activer/désactiver la pluie" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Activer/désactiver l'effet de pluie" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Activer/désactiver l'essuie-glace" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Activer/désactiver l'effet d'essuie-glace" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Effet d'eau" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Échelle de décalage d'eau" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Effet de vague sur le titre de la fenêtre" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Effet de focus" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Effet de focus de la fenêtre" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focus sur les Fenêtres" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friction" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Saisir les Fenêtres" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Résolution de la grille" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Alignement inversé de la fenêtre" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Déformer la fenêtre" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Mapper l'effet" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Mapper l'effet de la fenêtre" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Mapper les types de fenêtres" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Optimiser l'effet" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Taille de grille minimale" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Taille de grille de sommet minimale" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Déplacer les fenêtres" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Déformation" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Alignement inversé" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Aligner les fenêtres" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Friction ressort" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Ressort K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante de ressort" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Basculer l'alignement des fenêtres" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" "Utiliser le modèle physique du ressort pour créer un effet de déformation " "des fenêtres" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Résolution de la grille de sommets" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Types de fenêtres à déformer lorsque le focus est sur celles-ci" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Types de fenêtres à déformer lorsqu'elles sont saisies" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Types de fenêtres à déformer lorsqu'elles sont mappées" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Types de fenêtres à déformer lorsqu'elles sont déplacées" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" "Effet de déformation lors de la maximisation et de la démaximisation des " "fenêtres" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Déformer les Fenêtres" #~ msgid "Command line 0" #~ msgstr "Ligne de commande 0" #~ msgid "Run command 0" #~ msgstr "Exécuter la commande 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Ligne de commande de capture d'écran" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Ligne de commande de capture d'écran" #~ msgid "Filter Linear" #~ msgstr "Filtre linéaire" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Utiliser le filtre linéaire pour le zoom avant" #~ msgid "Zoom Desktop" #~ msgstr "Zoom du Bureau" #~ msgid "Zoom In" #~ msgstr "Zoom avant" #~ msgid "Zoom Out" #~ msgstr "Zoom arrière" #~ msgid "Zoom Pan" #~ msgstr "Zoom Panoramique" #~ msgid "Zoom Speed" #~ msgstr "Vitesse du zoom" #~ msgid "Zoom Timestep" #~ msgstr "Intervalle du zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom et panoramique du cube du bureau" #~ msgid "Zoom factor" #~ msgstr "Facteur de zoom" #~ msgid "Zoom pan" #~ msgstr "Zoom panoramique" #~ msgid "Decrease window opacity" #~ msgstr "Réduire l'opacité de la fenêtre" #~ msgid "Increase window opacity" #~ msgstr "Augmenter l'opacité de la fenêtre" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valeurs de l'opacité pour les fenêtres qui devraient être transparentes " #~ "par défaut" #~ msgid "Opacity windows" #~ msgstr "Transparence des fenêtres" #~ msgid "Background Images" #~ msgstr "Images de Fond" #~ msgid "Background images" #~ msgstr "Images de fond" #~ msgid "Place windows on a plane" #~ msgstr "Placer tous les bureaux sur un plan" #~ msgid "Plane Down" #~ msgstr "Planer vers le Bas" #~ msgid "Plane Left" #~ msgstr "Planer à Gauche" #~ msgid "Plane Right" #~ msgstr "Planer à Droite" #~ msgid "Plane To Face 1" #~ msgstr "Planer vers la Face 1" #~ msgid "Plane To Face 10" #~ msgstr "Planer vers la Face 10" #~ msgid "Plane To Face 11" #~ msgstr "Planer vers la Face 11" #~ msgid "Plane To Face 12" #~ msgstr "Planer vers la Face 12" #~ msgid "Plane To Face 2" #~ msgstr "Planer vers la Face 2" #~ msgid "Plane To Face 3" #~ msgstr "Planer vers la Face 3" #~ msgid "Plane To Face 4" #~ msgstr "Planer vers la Face 4" #~ msgid "Plane To Face 5" #~ msgstr "Planer vers la Face 5" #~ msgid "Plane To Face 6" #~ msgstr "Planer vers la Face 6" #~ msgid "Plane To Face 7" #~ msgstr "Planer vers la Face 7" #~ msgid "Plane To Face 8" #~ msgstr "Planer vers la Face 8" #~ msgid "Plane To Face 9" #~ msgstr "Planer vers la Face 9" #~ msgid "Plane Up" #~ msgstr "Planer vers le Haut" #~ msgid "Plane down" #~ msgstr "Faire glisser la vue vers le bureau inférieur" #~ msgid "Plane left" #~ msgstr "Faire glisser la vue vers le bureau de gauche" #~ msgid "Plane right" #~ msgstr "Faire glisser la vue vers le bureau de droite" #~ msgid "Plane to face 1" #~ msgstr "Faire glisser la vue vers la face 1" #~ msgid "Plane to face 10" #~ msgstr "Faire glisser la vue vers la face 10" #~ msgid "Plane to face 11" #~ msgstr "Faire glisser la vue vers la face 11" #~ msgid "Plane to face 12" #~ msgstr "Faire glisser la vue vers la face 12" #~ msgid "Plane to face 2" #~ msgstr "Faire glisser la vue vers la face 2" #~ msgid "Plane to face 3" #~ msgstr "Faire glisser la vue vers la face 3" #~ msgid "Plane to face 4" #~ msgstr "Faire glisser la vue vers la face 4" #~ msgid "Plane to face 5" #~ msgstr "Faire glisser la vue vers la face 5" #~ msgid "Plane to face 6" #~ msgstr "Faire glisser la vue vers la face 6" #~ msgid "Plane to face 7" #~ msgstr "Faire glisser la vue vers la face 7" #~ msgid "Plane to face 8" #~ msgstr "Faire glisser la vue vers la face 8" #~ msgid "Plane to face 9" #~ msgstr "Faire glisser la vue vers la face 9" #~ msgid "Plane up" #~ msgstr "Faire glisser la vue vers le bureau supérieur" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Temps de fondu de l'opacité de la fenêtre du bureau" ./po/sl.po0000644000004100000410000023134413246301623012646 0ustar www-datawww-data# Slovenian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # Janez Krek , 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-06-12 01:19+0200\n" "Last-Translator: benjamin povirk \n" "Language-Team: Slovenian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Namizje" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Upravljalnik oken" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "brez izbire" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Zasenči" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Skrčite Windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Skrčite Windows" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Skrčite Windows" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Skrčite Windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Samodejno" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Okenski meni" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Izbran(i)" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Metacity tema motnost aktivnega okna" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Metacity tema motnost sence aktivnega okna" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity tema motnost" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity tema motnost senca" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Motnost za aktivna okna z metacity temo dekoracij" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Motnost za metacity temo dekoracij" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "Zasenči aktivna okna z metacity temo dekoracij od motne do prozorne" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Zasenči okna z metacity temo dekoracij od motne do prozorne" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Akcija miškinega kolesca na naslovni vrstici" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tip neaktivnosti uporabljen za dekoracije okna" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Uporabi metacity temo" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Uporabi metacity temo ko rišeš dekoracije okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zapri okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Odmaksimiziraj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimiziraj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimiziraj okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Postavi na vrh" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Prilepi" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Odsenči" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Postavi iz ospredja" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Odlepi" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Okno \"%s\" se ne odziva" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Nasilno zaprtje te aplikacije lahko povzroči izgubo neshranjenih sprememb." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Nasilni izhod" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Init" # KM #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Barve" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktivni profil" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Počisti" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Izriši" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Izriši z uporabo orodja" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inicializiraj" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Init" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Init" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Inicializiraj izbris" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "širina črte" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 #, fuzzy msgid "Stroke width" msgstr "širina črte" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xbilinearno" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Zamaži z transparenco" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Zamaži okna z transparenco" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filter madeža" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Madež absorpcije" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Madež zasičenosti" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Zamaži hitrost" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Zamaži okna" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Zamaži za prosojnimi deli oken" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Madež nasičenosti" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Zamaži okna" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Zamaži okna v ozadju" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Zamaži v ospredju" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Zamaži okna v ospredju" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gausova" # RU #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gausov radij" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gausova moč" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "gausov radij" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gausova moč" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mini zemljevid" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "stopnja podrobnosti Mini zemljevida" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulz" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulz efekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Uporabi vse teksturne enote ki so na voljo, da ustvariš karseda veliko " "neodvisnih novih tekstur." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Hitrost zamaznitve okna" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Init" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Ukaz '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Ukaz: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Ukaz: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktivni profil" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Datotečni &sistem" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Samodejno" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Privzet odsek" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Privzeti Datum I&zteka Veljavnosti" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Izberi Posodobitev" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Navidezne naprave" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Omogoči samodejno zaustavitev" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Pisanje dnevnika" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "Seznam zaznanih tiskalnikov" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Windows uporabljeno:" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Skrčite Windows" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Skrčite Windows" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Navaden" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Zamik" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radijska ura" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Osveži seznam" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Namizje" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Prikaži vse razdelke" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Nastavi filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Nastavi filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Nastavi filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Navidezne naprave" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D pospeševanje:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Samodejno" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" # KM #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Barve" # KM #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Barve" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Namizje" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D pospeševanje:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Izbran(i)" # TL # fuzzy #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Trst" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "Prejsne jedro" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Neuspešne datoteke" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "Naslednja posodobitev" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "I&zbriši Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Prejsne jedro" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalni čas" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sydney" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Izbran(i)" # TL # fuzzy #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Trst" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Ukaz: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "I&zbriši Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Skrčite Windows" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&Nizek nivo" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Skrčite Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Ni opisa" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind opcije" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # TL # fuzzy #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Trst" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Vsebuje" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Realni čas" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Izbran(i)" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Realni čas" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Datotečni &sistem" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "I&zbriši Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Skrčite Windows" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "Zaslon na dotik" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows prosto (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Dodaj stik" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Dodaj stik" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Zaženi v terminalu" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Napaka pri razčlenitvi ukazne vrstice." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Napaka pri razčlenitvi ukazne vrstice." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Napaka pri razčlenitvi ukazne vrstice." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Ne beleži ničesar" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Ne beleži ničesar" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Skrčite Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Skrčite Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Skrčite Windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Skrčite Windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Vsebuje" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Premakni &Dol" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Premakni &Dol" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Premakni &Dol" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Nizek nivo" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Skrčite Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Most" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Most" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Most" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Most" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "&Nizek nivo" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "I&zbriši Windows" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Nizek nivo" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind opcije" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows uporabljeno:" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows uporabljeno:" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Upravljalnik oken" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "I&zbriši Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "I&zbriši Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Delovna skupina" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Navidezne naprave" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" # KM #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Barve" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" # KM #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Barve" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Init" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Sprememba velikosti je bila neuspešna." # KM #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Barve" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Sprememba velikosti je bila neuspešna." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Realni čas" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Kazalec na %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Tiskalniška naprava" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "V desno" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "V desno" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "V desno" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Oddaljeno podomrežje" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "V desno" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Zasukaj zaslon" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Premakni &Dol" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Zaganjam prikriti proces (daemon)." # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D pospeševanje:" # TL # fuzzy #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Trst" # TL # fuzzy #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Trst" # TL # fuzzy #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Trst" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Poženi zaznavanje" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "Odjava" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Velik" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Ozadja" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Premakni &Dol" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Optični bralnik (scanner)" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "I&zbriši Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalni čas" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalni čas" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "I&zbriši Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "I&zbriši Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Španija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Imenik\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Init" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Pisarniške aplikacije" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Zaslon" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Napaka pri razčlenitvi ukazne vrstice." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Vrstni red uporabe" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Samodejno" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Med zagonom" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Ikonce" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Skrčite Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Namizje" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "I&zbriši Windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "I&zbriši Windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "I&zbriši Windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Prejsne jedro" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows uporabljeno:" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows uporabljeno:" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows uporabljeno:" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "I&zbriši Windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Zaganjam prikriti proces (daemon)." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Skrčite Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "Skripta za zamenjavo" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalni čas" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "I&zbriši Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Dod&aj povezavo" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Dodaj stik" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Zamik" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Zamenjaj status" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "I&zbriši Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "I&zbriši Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Ločljivost" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "I&zbriši Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows uporabljeno:" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Največja velikost" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Največja velikost" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Premakni &Dol" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Gonilnik" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Skrčite Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Stepping" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Stepping" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "I&zbriši Windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Prepoznavanje strežnika" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows uporabljeno:" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Ukaz: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "Ukaz '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Napaka pri razčlenitvi ukazne vrstice." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Napaka pri razčlenitvi ukazne vrstice." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Namizje" #, fuzzy #~ msgid "Zoom In" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Izbran(i)" # TL # fuzzy #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Trst" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Odjava" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Odjava" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "V celoti &izbriši Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "I&zbriši Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "I&zbriši Windows" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Oddaljeno podomrežje" #, fuzzy #~ msgid "Plane Right" #~ msgstr "V desno" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane Up" #~ msgstr "I&zbriši Windows" #, fuzzy #~ msgid "Plane down" #~ msgstr "I&zbriši Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Oddaljeno podomrežje" #, fuzzy #~ msgid "Plane right" #~ msgstr "V desno" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane up" #~ msgstr "I&zbriši Windows" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Orodja" #~ msgid "Menu" #~ msgstr "Menu" #, fuzzy #~ msgid "Utility" #~ msgstr "Disketa s priročnimi orodji..." #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Upravljalnik oken" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Menu" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Orodja" #, fuzzy #~ msgid "Notification" #~ msgstr "Akcija" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Zaslon na dotik" #~ msgid "Unknown" #~ msgstr "Neznano" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trajanje" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Ne beleži ničesar" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Nizek nivo" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Zaganjam prikriti proces (daemon)." # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D pospeševanje: " # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D pospeševanje: " # TL # fuzzy #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Trst" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Ruska federacija" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruska" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows uporabljeno:" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Skrčite Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Skrčite Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Največja velikost" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Namizje" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Zaganjam prikriti proces (daemon)." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Zaganjam prikriti proces (daemon)." # workflow: "3D Beschleunigung aktivieren" # -ke- #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D pospeševanje: " # TL # fuzzy #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Trst" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalni čas" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalni čas" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "I&zbriši Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Stepping" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Skripta za zamenjavo" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Nastavi filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Prepoznavanje strežnika" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows prosto (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows prosto (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Izbran(i)" # TL # fuzzy #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Trst" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Odjava" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Zaganjam prikriti proces (daemon)." #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Zasukaj zaslon" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Ukaz: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Ukaz: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Tip ponudnika" #, fuzzy #~ msgid "Corners" #~ msgstr "Kornščina" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Pokaži spre&membe" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Disketa" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Zaganjam prikriti proces (daemon)." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminali" ./po/af.po0000644000004100000410000017512213246301623012617 0ustar www-datawww-data# Copyright (C) 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: installation\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2006-11-03 14:26\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Werkskerm" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Inisialiseer" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Berg konfigurasie" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Berg konfigurasie" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Berg konfigurasie" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Kies &niks" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Kies &niks" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Kataloguskeuse" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Opdragte:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Opdrag '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Opdrag '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Werkskerm" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Kies &niks" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Kies &niks" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normaal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Vernuwe" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Werkskerm" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Inisialiseer" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Werkskerm" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Opdragte:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Kies &niks" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Kies &niks" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Installasie is voltooi" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Kies &niks" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Kies &niks" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Kies &niks" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Opdrag '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Opdrag '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Kies &niks" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Berg konfigurasie" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Kies &niks" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Kies &niks" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Kies &niks" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Kies &niks" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Inisialiseer" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Kies &niks" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Inisialiseer" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Inisialiseer" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Kies &niks" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Kies &niks" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Kies &niks" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Installasie is voltooi" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Begin van installasie ..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Inisialiseer" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Kies &niks" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Kies &niks" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "&Plaaslike gids ..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Kataloguskeuse" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Inisialiseer" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Tydens selflaai" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Werkskerm" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Kies &niks" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Kies &niks" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Kies &niks" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Kies &niks" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Tydens selflaai" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Opdrag '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Opdrag '%1'" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Werkskerm" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Installasie is voltooi" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Installasie is voltooi" #~ msgid "Unknown" #~ msgstr "Onbekend" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Berg konfigurasie" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Installasie is voltooi" ./po/km.po0000644000004100000410000025546713246301623012653 0ustar www-datawww-data# Khmer message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # Leang Chumsoben , 2005, 2006. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2006-01-04 08:58+0100\n" "Last-Translator: Leang Chumsoben \n" "Language-Team: Khmer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "ផ្ទៃតុ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "គ្មាន" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "ម៉ាស៊ីន​ស្កេន" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "AutoYast" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "បាន​ជ្រើស" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "លុប​វ៉ីនដូ​ទាំង​ស្រុង" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "លុប​វ៉ីនដូ​ទាំង​ស្រុង" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "លុប​វ៉ីនដូ​" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "អ៊ីទីតេ" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "ពណ៌" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "សកម្ម" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "ជម្រះ" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "អ៊ីទីតេ" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "អ៊ីទីតេ" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "អ៊ីទីតេ" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "អ៊ីទីតេ" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "តម្រង ៖ " #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "កំណត់​តម្រង" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "ថិរវេលា" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "ថិរវេលា" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "បាន​ជ្រើស" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "ថិរវេលា" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "ម៊ិកម៉ា" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "ម៊ិកម៉ា" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "វ៉ីនដូ" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "លទ្ធផល​គឺ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "អ៊ីទីតេ" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "ពាក្យបញ្ជា '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "សកម្ម" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "ប្រព័ន្ធ​ឯកសារ" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutoYast" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ដែន​លំនាំ​ដើម" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ដែន​លំនាំ​ដើម" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ផ្ទៃតុ" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "ជ្រើស​ដើម្បី​ធ្វើ​ឲ្យ​ទាន់​សម័យ" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "ឧបករណ៍​និម្មិត" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "អនុញ្ញាត​ឲ្យ​ផ្អាក​ស្វ័យប្រវត្តិ" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "ការ​ចូល" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "រាយ​តែ​ម៉ាស៊ីន​បោះពុម្ព​ដែល​បាន​រកឃើញ" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "សូរប៊ីយ៉ាន​ក្រោម" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "ធម្មតា" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "ផ្ទៃតុ" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "ផ្ទៃតុ" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 #, fuzzy msgid "Outputs" msgstr "លទ្ធផល​គឺ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "ពន្យារពេល" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "នាឡិកា​វិទ្យុ" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "ធ្វើ​ឲ្យ​ស្រស់" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "ផ្ទៃតុ" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "ការ​ធ្វើ​តាម" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "កំណត់​តម្រង" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "កំណត់​តម្រង" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "កំណត់​តម្រង" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "ឧបករណ៍​និម្មិត" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "ជម្រើស​កម្រិត​ខ្ពស់" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "AutoYast" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ពណ៌" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "ពណ៌" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "ផ្ទៃតុ" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "បាន​ជ្រើស" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "សាកល្បង" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "មុន" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ឯកសារ​រូបភាព ISO" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "ទំហំ​ថ្មី" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "មុន" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "ពេលវេលា​មូលដ្ឋាន" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "រូបភាព ISO" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "រូបភាព ISO" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "បាន​ជ្រើស" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "សាកល្បង" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "ពាក្យបញ្ជា ៖ " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "សមត្ថភាព​ទាប" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "សមត្ថភាព​ទាប" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "កាំ" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "សមត្ថភាព​ទាប" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "កាំ" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "សមត្ថភាព​ទាប" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "សមត្ថភាព​ទាប" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "សមត្ថភាព​ទាប" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "កាំ" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "គ្មាន​សេចក្ដី​ពណ៌នា" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ជម្រើស ypbind" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "សាកល្បង" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "មាន" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "ពេល​វេលា​ពិត​ប្រាកដ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "បាន​ជ្រើស" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "ពេល​វេលា​ពិត​ប្រាកដ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "ប្រព័ន្ធ​ឯកសារ" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "ឧបករណ៍​ប៉ះអេក្រង់" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "វ៉ីនដូ" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "បន្ថែម​ទំនាក់​ទំនង" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "បន្ថែម​ទំនាក់​ទំនង" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "រត់​ក្នុង​ស្ថានីយ" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "ការ​ហៅ​ឮ​សម្លេង" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "មាន​កំហុស ខណៈ​ពេល​កំពុង​ញែក​បន្ទាត់​ពាក្យ​បញ្ជា​។" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "មាន​កំហុស ខណៈ​ពេល​កំពុង​ញែក​បន្ទាត់​ពាក្យ​បញ្ជា​។" #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "បង្កើតម៉ឺនុយ​ចាប់ផ្ដើម" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "បង្កើតម៉ឺនុយ​ចាប់ផ្ដើម" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "មាន​កំហុស ខណៈ​ពេល​កំពុង​ញែក​បន្ទាត់​ពាក្យ​បញ្ជា​។" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "កុំ​ចុះ​កំណត់ហេតុ​អ្វី​ទាំងអស់" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "កុំ​ចុះ​កំណត់ហេតុ​អ្វី​ទាំងអស់" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "មាន" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "XF86RotateWindows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "ផ្លាស់ទី​ចុះ​ក្រោម" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "ផ្លាស់ទី​ចុះ​ក្រោម" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "សមត្ថភាព​ទាប" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Bridge" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Bridge" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Bridge" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Bridge" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "អុកស៊ីតង់ (ក្រោយ​ឆ្នាំ ១៥០០)" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "អុកស៊ីតង់ (ក្រោយ​ឆ្នាំ ១៥០០)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "សមត្ថភាព​ទាប" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "ថិរវេលា" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ថិរវេលា" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ថិរវេលា" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "ថិរវេលា" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ជម្រើស ypbind" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "វ៉ីនដូ" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "វ៉ីនដូ" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "ឧបករណ៍​និម្មិត" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "ឧបករណ៍​និម្មិត" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ជម្រើស ypbind" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ជម្រើស ypbind" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "ក្រុម​ការងារ" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "ឧបករណ៍​និម្មិត" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "ឧបករណ៍​និម្មិត" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "ពណ៌" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "ពណ៌" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "ពណ៌" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "ផ្លាស់​ប្ដូរ​ទំហំ" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "ពេល​វេលា​ពិត​ប្រាកដ" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "ទ្រនិចចង្អុរ​ទៅ %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "ការពិពណ៌នា​អំពី​ម៉ាស៊ីន​បោះពុម្ព" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Subnet ពី​ចម្ងាយ" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "ទៅ​ស្ដាំ" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "បង្វិល​អេក្រង់" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "សាកល្បង" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "សាកល្បង" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "សាកល្បង" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "ចាប់ផ្ដើម​រក" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "ចេញ" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ធំ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "ផ្ទៃ​ខាង​ក្រោយ" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "ថាស​សតិ​ដំបូង" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "ម៉ាស៊ីន​ស្កេន" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "ពេលវេលា​មូលដ្ឋាន" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "ពេលវេលា​មូលដ្ឋាន" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "អេស៉្បាញ" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "ថត\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "អ៊ីទីតេ" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "បើក​កម្មវិធី​មួយ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "អេក្រង់" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "មាន​កំហុស ខណៈ​ពេល​កំពុង​ញែក​បន្ទាត់​ពាក្យ​បញ្ជា​។" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "លំដាប់​កម្មវិធី" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutoYast" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "កំឡុង​ពេល​ចាប់ផ្ដើម​ឡើង" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "រូប​តំណាង" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ផ្ទៃតុ" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "មុន" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "វ៉ីនដូ" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "វ៉ីនដូ" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "វ៉ីនដូ" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "ប្ដូរ​ស្គ្រីប" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "ពេលវេលា​មូលដ្ឋាន" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "បន្ថែម​តំណ" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "បន្ថែម​ទំនាក់​ទំនង" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "ពន្យារពេល" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Token ring" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Token ring" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "អំពើ" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "គុណភាព​បង្ហាញ" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "វ៉ីនដូ" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "ទំហំ​សំបុត្រ​អតិបរមា" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "ទំហំ​សំបុត្រ​អតិបរមា" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "ផ្លាស់ទី​ចុះ​ក្រោម" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "កម្មវិធី​បញ្ជា" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "អំពើ" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ការ​ចែក​រំលែក" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ការ​ចែក​រំលែក" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "លុប​វ៉ីនដូ​" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "ដំណោះស្រាយ​ម៉ាស៊ីន​បម្រើ" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Command line 0" #~ msgstr "ពាក្យបញ្ជា ៖ " #, fuzzy #~ msgid "Run command 0" #~ msgstr "ពាក្យបញ្ជា '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "មាន​កំហុស ខណៈ​ពេល​កំពុង​ញែក​បន្ទាត់​ពាក្យ​បញ្ជា​។" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "មាន​កំហុស ខណៈ​ពេល​កំពុង​ញែក​បន្ទាត់​ពាក្យ​បញ្ជា​។" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "តម្រង ៖ " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "ផ្ទៃតុ" #, fuzzy #~ msgid "Zoom In" #~ msgstr "ចេញ" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "ចេញ" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "ចេញ" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "បាន​ជ្រើស" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "ចេញ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "ចេញ" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "លុប​វ៉ីនដូ​ទាំង​ស្រុង" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane Down" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Subnet ពី​ចម្ងាយ" #, fuzzy #~ msgid "Plane Right" #~ msgstr "ទៅ​ស្ដាំ" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane Up" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane down" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Plane left" #~ msgstr "Subnet ពី​ចម្ងាយ" #, fuzzy #~ msgid "Plane right" #~ msgstr "ទៅ​ស្ដាំ" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane up" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Toolbar" #~ msgstr "ឧបករណ៍" #~ msgid "Menu" #~ msgstr "ម៉ឺនុយ" #, fuzzy #~ msgid "Utility" #~ msgstr "ថាស​ឧបករណ៍​ប្រើប្រាស់..." #, fuzzy #~ msgid "Dialog" #~ msgstr "ការ​ហៅ​ឮ​សម្លេង" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "កម្មវិធីគ្រប់គ្រងបង្អួច" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "ម៉ឺនុយ" #, fuzzy #~ msgid "Tooltip" #~ msgstr "ឧបករណ៍" #, fuzzy #~ msgid "Notification" #~ msgstr "ការ​ជូនដំណឹង" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "ឧបករណ៍​ប៉ះអេក្រង់" #~ msgid "Unknown" #~ msgstr "មិន​ស្គាល់" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "ថិរវេលា" #, fuzzy #~ msgid "Do not modify" #~ msgstr "កុំ​ចុះ​កំណត់ហេតុ​អ្វី​ទាំងអស់" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "សមត្ថភាព​ទាប" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "កាំ" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "បន្ថយ​ទំហំ​ភាគ​របស់​វ៉ីនដូ​" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "ទំហំ​សំបុត្រ​អតិបរមា" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "ផ្ទៃតុ" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "អុកស៊ីតង់ (ក្រោយ​ឆ្នាំ ១៥០០)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "ការ​បង្កើន​ល្បឿន 3D ៖ " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "ពេលវេលា​មូលដ្ឋាន" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "ពេលវេលា​មូលដ្ឋាន" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "លុប​វ៉ីនដូ​" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "អំពើ" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ការ​ចែក​រំលែក" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "ប្ដូរ​ស្គ្រីប" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "កំណត់​តម្រង" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "ដំណោះស្រាយ​ម៉ាស៊ីន​បម្រើ" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "វ៉ីនដូ" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "បាន​ជ្រើស" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "សាកល្បង" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "ចេញ" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "បង្វិល​អេក្រង់" #, fuzzy #~ msgid "Command line %d" #~ msgstr "ពាក្យបញ្ជា ៖ " #, fuzzy #~ msgid "Run command %d" #~ msgstr "ពាក្យបញ្ជា ៖ " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "ប្រភេទ​ក្រុមហ៊ុន​ផ្ដល់" #, fuzzy #~ msgid "Corners" #~ msgstr "កូនីស" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ថាស​ទន់" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "កំពុង​ចាប់ផ្តើម​ដេមិន ។" #, fuzzy #~ msgid "Terminate" #~ msgstr "ស្ថានីយ" ./po/ca.po0000644000004100000410000031321713246301623012613 0ustar www-datawww-data# Catalan message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # Jaume Badiella , 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-07-19 14:27+0200\n" "Last-Translator: Josep Puigdemont \n" "Language-Team: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Escriptori" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Menú de la finestra" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Cap" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Canvia la mida" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Minimitzades" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximitza la finestra horitzontalment" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximitza la finestra verticalment" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimitzades" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Elevació automàtica" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menú de la finestra" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acció a prendre al desplaçar-se la roda del ratolí sobre la barra de títol " "d'una finestra." #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Velocitat de plegament" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Redueix l'opacitat de la finestra" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Maximitza la finestra activa horitzontalment" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Tema opacitat" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Tema opacitat ombra" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacitat d'utilitzar finestres actives amb el Metacity tema per decoracions" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacitat d´utilitzar per Metacity tema per decoracions" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Finestres actives amb ombra i amb el tema Metacity per decoracions desde " "opac al translucíd" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Finestra amb ombra amb el tema Metacity per decoracions desde opac fins a " "translucíd" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Titol de la barra d´acció de la roda del ratolí" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipus de blur utilizat en decoracions de finestres" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Utilitzar el tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Utilitzar el tema Metacity quan dibuixes decoracions de finestres" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Tanca la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximitza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximitza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimitza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Fer a sobre" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Pal" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "No canvia la mida" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "No fer a sobre" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "No pals" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "La finestra «%s» no està responent." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Si forceu la sortida d'aquesta aplicació perdreu els canvis que encara no " "hagueu desat." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Força'n la sortida" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Inicia" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Color del cub" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Anotar color de accident" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Connectors actius" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Borra" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Dibuixa" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Dibuixar utilitzant una eina" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Color del club per anotacions" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inicia" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Inicia borrament" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Linia d´ample" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linia d´ample per anotacions" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Color d´accident per anotacions" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ample d´accident" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ample d´accident per anotacions" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filtre lineal" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Canvia la mida de les finestres" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Canvia la mida de les finestres" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Filtre de textura" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Saturació" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Saturació" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Velocitat de plegament" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Situa les finestres" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Canviar parts translucíd de la finestra" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Saturació" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Canvia la mida de les finestres" #: ../metadata/blur.xml.in.h:12 #, fuzzy msgid "Blur windows that doesn't have focus" msgstr "Tipus de finestres que hauran de tremolar quan rebin el focus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desactiva la mida de les regions de pantalla fetes per altres finestres." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filtra un metód utilitzat per mida" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Mida del focus" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Mida del focus en finestra" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mimal nivel-de-detalls" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsa" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr " Pulsa l'efecte" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Utilitza la disponible unitat de textura per fer lo posible independients " "textures fetches." #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Velocitat d'esvaïment de la finestra" #: ../metadata/blur.xml.in.h:30 #, fuzzy msgid "Windows that should be affected by focus blur" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/blur.xml.in.h:31 #, fuzzy msgid "Windows that should be use alpha blur by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Sortides" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Fes una captura de pantalla" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:13 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:14 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:15 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:16 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:17 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:18 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:19 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:20 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:21 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:22 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:23 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:24 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " "identificada amb l'ordre %d" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Línia d'ordres %d" #: ../metadata/commands.xml.in.h:51 #, fuzzy msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:52 #, fuzzy msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:53 #, fuzzy msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:54 #, fuzzy msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:55 #, fuzzy msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:56 #, fuzzy msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:57 #, fuzzy msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:58 #, fuzzy msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:59 #, fuzzy msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:60 #, fuzzy msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:61 #, fuzzy msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:62 #, fuzzy msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Línia d'ordres que s'executarà a l'intèrpret d'ordres en invocar run_command%" "d" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Ordre" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Executa l'ordre %d" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Executa l'ordre %d" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Connectors actius" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permet que la representació de finestres a pantalla completa no es " "redirigeixi cap a mapes de píxels fora de la pantalla" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Avís sonor" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Avís sonor del sistema" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevació automàtica" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Retard de l'elevació automàtica" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecció automàtica dels dispositius de sortida" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecció automàtica de la freqüència d'actualització" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Millor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Feu clic per a passar el focus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "En fer clic a la finestra, aquesta rep el focus d'entrada" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Tanca la finestra activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icona per defecte" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imatge d'icona de finestra per defecte" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Cub de l'escriptori" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detecta les sortides" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detecta la freqüència d'actualització" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Ràpid" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Tipus de finestres de focus" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Tipus de finestres de focus" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Tipus de finestres de focus" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bo" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Oculta les finestres ignorades de la barra de tasques" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Oculta totes les finestres i passa el focus a l'escriptori" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Oculta les finestres que no es troben a la barra de tasques en accedir al " "mode d'escriptori de visualització" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Mida virtual horitzontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignora els suggeriments quan està maximitzada" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignora els suggeriments d'increment de mida i aspecte quan la finestra es " "troba maximitzada" #: ../metadata/core.xml.in.in.h:39 #, fuzzy msgid "Interval before raising selected windows" msgstr "" "Interval que ha de transcórrer abans d'elevar les finestres seleccionades" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Il·luminació" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Llista dels connectors actius actualment" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Llista de cadenes que descriuen els dispositius de sortida" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Abaixa la finestra" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Abaixa la finestra per sota de les altres" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximitza la finestra horitzontalment" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximitza la finestra verticalment" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximitza la finestra activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximitza la finestra activa horitzontalment" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximitza la finestra activa verticalment" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimitza la finestra activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Nombre d'escriptoris" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Nombre d'escriptoris virtuals" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Només actualitza la pantalla durant els períodes d'enfosquiment vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Sortides" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" # SH #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Retard de pluja" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Eleva en fer clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Eleva la finestra" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Eleva les finestres seleccionades un cop transcorregut l'interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Eleva la finestra per damunt de les altres" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Eleva les finestres en fer clic" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Freqüència d'actualització" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "" "Multiplicador de la mida de la pantalla per a la mida virtual horitzontal" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de la mida de la pantalla per a la mida virtual vertical" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Fes zoom a l'escriptori" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animacions lentes" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronitza amb enfosquiment vertical" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Filtre de textura" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtre de textura" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Filtre de textura" #: ../metadata/core.xml.in.in.h:83 #, fuzzy msgid "The rate at which the screen is redrawn (times/second)" msgstr "" "Freqüència amb la qual es torna a representar la pantalla (vegades/segon)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Commuta la finestra maximitzada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Commuta la finestra maximitzada horitzontalment" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Commuta la finestra maximitzada verticalment" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Commuta la finestra ombrejada" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Commuta la finestra activa maximitzada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Commuta la finestra activa maximitzada horitzontalment" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Commuta la finestra activa maximitzada verticalment" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Commuta la finestra activa ombrejada" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Commuta l'ús d'animacions lentes" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximitza la finestra activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "No redirigeixis les finestres a pantalla completa" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Utilitza llum de difusió en transformar la pantalla" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Mida virtual vertical" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Acceleració" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avança cap a la diapositiva següent" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Cúpula animada" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Representació animada de la cúpula en girar el cub" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Elevació automàtica" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Color de les cares superior i inferior del cub" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Color que s'utilitzarà com a color inferior del degradat alternatiu de la " "cúpula" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Color que s'utilitzarà com color superior del degradat alternatiu de la " "cúpula" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Color del cub" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Color del cub" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cub de l'escriptori" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Acceleració de plegament" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocitat de plegament" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Etapa de plegament" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Genera mipmaps sempre que sigui possible per a un canvi de mida de millor " "qualitat" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Torna a la diapositiva anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Fitxers d'imatge" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imatge que s'utilitzarà com a textura per a la cúpula" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Interior del cub" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Interior del cub" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Llista de fitxers PNG i SVG que s'hauran de representar a la cara superior " "del cub" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositiva següent" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Interior del cub" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Situa les finestres al cub" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Diapositiva anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderitza la cúpula" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Canvia la mida de la imatge" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Canvia la mida de les imatges per a cobrir la cara superior del cub" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Cúpula" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Color final del degradat de la cúpula" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Color inicial del degradat de la cúpula" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imatge de la cúpula" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocitat" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Etapa" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desplega" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desplega el cub" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Ordre" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Canvia la mida de les finestres" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Línia d'ordres del decorador que s'executa si no s'està executant cap " "decorador" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Desplaçament en X de l'ombra descendent" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Desplaçament en Y de l'ombra descendent" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radi de l'ombra descendent" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacitat de l'ombra descendent" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radi de l'ombra descendent" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Ajusta les finestres" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Desplaçament en X de l'ombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Desplaçament en Y de l'ombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacitat de l'ombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Radi de l'ombra" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Ajusta les finestres" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoració de la finestra" # RU #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decoracions de finestres" #: ../metadata/decoration.xml.in.h:19 #, fuzzy msgid "Windows that should be decorated" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/decoration.xml.in.h:20 #, fuzzy msgid "Windows that should have a shadow" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Velocitat del gir" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Restringeix Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Temps d'inversió" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocitat d'esvaïment" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Temps d'inversió" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efecte d'esvaïment amb avís sonor del sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Es fan aparèixer progressivament les finestres quan s'assignen i s'esvaeixen " "quan no estan assignades" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Canvia la mida de les finestres" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Esvaïment de finestres" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campana visual a pantalla completa" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efecte d'esvaïment a pantalla completa amb avís sonor del sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campana visual" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Velocitat d'esvaïment de la finestra" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 #, fuzzy msgid "Windows that should be fading" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Punt" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Afegeix un punt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Diàleg d'execució" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostra el menú principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostra el diàleg d'execució de l'aplicació" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostra el menú principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Fes una captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Fes una captura de pantalla d'una finestra" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Línia d'ordres de captura de pantalla de finestra" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "No modifiquis" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "No modifiquis" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimitza l'efecte" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Minimitza la finestra" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimitza la velocitat" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimitza l'etapa" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistència a l'ombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistència a l'ombra" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transforma les finestres quan es minimitzen i es maximitzen" #: ../metadata/minimize.xml.in.h:10 #, fuzzy msgid "Windows that should be transformed when minimized" msgstr "Tipus de finestres que s'hauran de transformar en minimitzar-se" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restringeix Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restringeix la coordenada Y a l'àrea de l'espai de treball" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Inicia el moviment de la finestra" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Mostra les finestres minimitzades" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mou la finestra" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mou la finestra" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacitat" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivell d'opacitat de les finestres en moviment" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Separa i desmaximitza les finestres maximitzades en arrossegar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Separa les finestres maximitzades" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Comença el moviment de la finestra" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Brillantor" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Redueix l'opacitat" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Augmenta l'opacitat" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Etapa de canvi d'opacitat" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Etapa de canvi d'opacitat" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa d'opacitat" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Nivell d'opacitat de les finestres en moviment" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturació" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Saturació" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Saturació" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Saturació" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" # RU #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Decoracions de finestres" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Tipus de finestres" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Assigna tipus de finestres" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Menú de la finestra" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Tipus de finestres de focus" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Situa les finestres" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Situa les finestres en les posicions adequades quan s'assignin" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Solucions alternatives de disposició de finestres" #: ../metadata/place.xml.in.h:25 #, fuzzy msgid "Windows that should be positioned by default" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/place.xml.in.h:26 #, fuzzy msgid "Windows that should be positioned in specific viewports by default" msgstr "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" # RU #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Decoracions de finestres" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Solucions alternatives" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Mostra les finestres minimitzades" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Mida virtual horitzontal" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 #, fuzzy msgid "Regex Matching" msgstr "Commuta l'ajustament de finestres" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Commuta l'ajustament de finestres" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Color del cub" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Color del cub" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Inicia el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Color del cub" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Comença el canvi de mida de la finestra" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Canvia la mida de la finestra" #: ../metadata/resize.xml.in.h:28 #, fuzzy msgid "Windows that normal resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/resize.xml.in.h:29 #, fuzzy msgid "Windows that outline resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/resize.xml.in.h:30 #, fuzzy msgid "Windows that rectangle resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/resize.xml.in.h:31 #, fuzzy msgid "Windows that stretch resize should be used for" msgstr "Tipus de finestres que s'hauran d'esvair" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD d'inversió de vora" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Moviment d'inversió de vora" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Punter d'inversió de vora" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Temps d'inversió" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Inverteix cap a l'àrea de visualització esquerra i deforma el punter" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Inverteix cap a la propera àrea de visualització en arrossegar l'objecte cap " "a la vora de la pantalla" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Inverteix cap a la propera àrea de visualització en moure el punter cap a la " "vora de la pantalla" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Inverteix cap a la propera àrea de visualització en moure la finestra cap a " "la vora de la pantalla" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Inverteix cap a l'àrea de visualització dreta i deforma el punter" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverteix l'eix Y per al moviment del punter" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Punter inverteix Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilitat del punter" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Eleva les finestres en fer clic" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Gira el cub" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Gira i inverteix cap a l'esquerra" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Gira i inverteix cap a la dreta" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Gira cap a l'esquerra" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Gira cap a l'esquerra amb la finestra" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Gira cap a la dreta" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Gira cap a la dreta amb la finestra" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Gira cap a" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Gira el cub" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Gira el cub de l'escriptori" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Gira cap a l'esquerra" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Gira cap a l'esquerra i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Gira cap a la dreta" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Gira cap a la dreta i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Gira cap a la cara %d amb la finestra" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Gira cap a la cara %d" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Gira cap a l'àrea de visualització" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Gira la finestra" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Gira amb la finestra" # RU #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Acceleració de gir" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocitat del gir" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Etapa del gir" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Velocitat del gir" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilitat del moviment del punter" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Desplaça el gir del cub a la cara superior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Desplaça el gir del cub a la cara superior" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Desplaça a la cara superior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Desplaça a la cara superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Inicia el gir" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Temps d'espera abans d'invertir l'àrea de visualització" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Quantitat d'opacitat en percentatge" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Gran" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Enfosqueix el fons" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Enfosqueix el fons en canviar la mida de les finestres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Distintiu" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Temps de passar per sobre" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Inicia el seleccionador de finestres" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Inicia el seleccionador per a totes les finestres" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Inicia el seleccionador per a un grup de finestres" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Inicia el seleccionador per a les finestres de la sortida actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Dissenya i inicia la transformació de totes les finestres" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Dissenya i inicia la transformació del grup de finestres" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Dissenya i inicia la transformació de les finestres" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" "Dissenya i inicia la transformació de les finestres de la sortida actual" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Superposa la icona" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Superposa una icona a les finestres un cop se n'ha canviat la mida" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Canvia la mida" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Canvia la mida de les finestres" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Canvia la velocitat" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Canvia la mida de l'etapa" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Canvia la mida de les finestres" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espai entre finestres" # ES #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaiat" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Temps (en ms) abans de finalitzar el mode d'escala en passar el punter per " "sobre una finestra" #: ../metadata/scale.xml.in.h:42 #, fuzzy msgid "Windows that should be scaled in scale mode" msgstr "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Fes una captura de pantalla" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Mostra el diàleg d'execució de l'aplicació" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Fes una captura de pantalla" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Línia d'ordres de captura de pantalla" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantitat de brillantor en percentatge" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantitat de saturació en percentatge" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Canviador d'aplicacions" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Elevació automàtica" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Porta endavant" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Porta la finestra seleccionada endavant" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Distància a la qual s'haurà d'allunyar el zoom de l'escriptori mentre es " "canvia de finestra" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimitzades" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Cub de l'escriptori" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Finestra següent" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Finestra següent" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Finestra següent" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Fa sortir el canviador si no està visible i selecciona la finestra següent" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Fes sortir el canviador si no està visible i selecciona la següent de totes " "les finestres" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Fes sortir el canviador si no està visible i selecciona la finestra anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Fes sortir el canviador si no està visible i selecciona l'anterior de totes " "les finestres" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Diapositiva anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Finestra anterior" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Finestra anterior" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Finestra anterior" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Selecciona la finestra següent" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Selecciona la finestra anterior" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Mostra la icona al costat de la miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Mostra les finestres minimitzades" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocitat del canviador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Etapa del canviador" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Canvia la mida de les finestres" #: ../metadata/switcher.xml.in.h:41 #, fuzzy msgid "Windows that should be shown in switcher" msgstr "Tipus de finestres que s'hauran de mostrar al canviador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Afegeix una línia" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Afegeix un punt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Afegeix efectes d'aigua a diferents accions de l'escriptori" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Retard (en ms) entre cada gota de pluja" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Habilita els efectes d'aigua del punter" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Línia" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Escala de desplaçament" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punt" # SH #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Retard de pluja" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Títol en onada" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Commuta la pluja" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Commuta l'efecte de pluja" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Commuta l'eixugaparabrises" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Commuta l'efecte de l'eixugaparabrises" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efecte d'aigua" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Escala de desplaçament d'aigua" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efecte d'onada del títol de la finestra" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Passa el focus a l'efecte" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Passa el focus a l'efecte de finestra" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Tipus de finestres de focus" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricció" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Tipus de finestres de captura" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolució de la graella" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ajustament de finestres invertit" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Fes estremir la finestra" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Assigna l'efecte" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Assigna l'efecte de la finestra" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Assigna tipus de finestres" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efecte de maximitzar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Mida mínima de la graella" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Mida mínima de la graella del vèrtex" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Mou la finestra" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Estremeix" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Ajustament invertit" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Ajusta les finestres" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricció d'elasticitat" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constant elàstica" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constant elàstica" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Commuta l'ajustament de finestres" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Utilitza el model d'elàstic per a l'efecte de finestra tremolosa" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolució de la graella del vèrtex" #: ../metadata/wobbly.xml.in.h:26 #, fuzzy msgid "Windows that should wobble when focused" msgstr "Tipus de finestres que hauran de tremolar quan rebin el focus" #: ../metadata/wobbly.xml.in.h:27 #, fuzzy msgid "Windows that should wobble when grabbed" msgstr "Tipus de finestres que hauran de tremolar quan s'agafin" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Tipus de finestres que hauran de tremolar quan s'assignin" #: ../metadata/wobbly.xml.in.h:29 #, fuzzy msgid "Windows that should wobble when moved" msgstr "Tipus de finestres que hauran de tremolar quan es moguin" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efecte de tremolor en maximitzar i desmaximitzar finestres" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Finestres tremoloses" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Línia d'ordres %d" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Executa l'ordre %d" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Línia d'ordres de captura de pantalla" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Línia d'ordres de captura de pantalla" #~ msgid "Filter Linear" #~ msgstr "Filtre lineal" #, fuzzy #~ msgid "Use linear filter when zoomed in" #~ msgstr "Utilitza el filtre lineal en ampliar el zoom" #~ msgid "Zoom Desktop" #~ msgstr "Fes zoom a l'escriptori" #~ msgid "Zoom In" #~ msgstr "Amplia el zoom" #~ msgid "Zoom Out" #~ msgstr "Allunya el zoom" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Amplia el zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocitat del zoom" #~ msgid "Zoom Timestep" #~ msgstr "Etapa del zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Fes zoom i gira el cub de l'escriptori" #~ msgid "Zoom factor" #~ msgstr "Factor del zoom" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Amplia el zoom" #~ msgid "Decrease window opacity" #~ msgstr "Redueix l'opacitat de la finestra" #~ msgid "Increase window opacity" #~ msgstr "Augmenta l'opacitat de la finestra" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "Espai entre finestres" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Situa les finestres al cub" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Situa les finestres" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Gira cap a l'esquerra" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Gira cap a la dreta" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Situa les finestres" #, fuzzy #~ msgid "Plane down" #~ msgstr "Situa les finestres" #, fuzzy #~ msgid "Plane left" #~ msgstr "Gira cap a l'esquerra" #, fuzzy #~ msgid "Plane right" #~ msgstr "Gira cap a la dreta" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane up" #~ msgstr "Situa les finestres" #~ msgid "Open window menu" #~ msgstr "Obre el menú de la finestra" #~ msgid "Dock" #~ msgstr "Acoblament" #~ msgid "Toolbar" #~ msgstr "Barra d'eines" #~ msgid "Menu" #~ msgstr "Menú" #~ msgid "Utility" #~ msgstr "Utilitat" #~ msgid "Splash" #~ msgstr "Pantalla de presentació" #~ msgid "Dialog" #~ msgstr "Diàleg" #~ msgid "DropdownMenu" #~ msgstr "Menú desplegable" #~ msgid "PopupMenu" #~ msgstr "Menú emergent" #~ msgid "Tooltip" #~ msgstr "Indicador de funció" #~ msgid "Notification" #~ msgstr "Notificació" #~ msgid "Combo" #~ msgstr "Quadre combinat" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Diàleg de mode" #~ msgid "Fullscreen" #~ msgstr "Pantalla completa" #~ msgid "Unknown" #~ msgstr "Desconeguda" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Assignació de tecles que, en invocar-se, executa l'ordre de l'intèrpret " #~ "identificada amb l'ordre %d" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Quantitat de brillantor en percentatge" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Quantitat d'opacitat en percentatge" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Quantitat de saturació en percentatge" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Saturació" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Retard (en ms) entre cada gota de pluja" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Distància a la qual s'haurà d'allunyar el zoom de l'escriptori mentre es " #~ "canvia de finestra" #~ msgid "Do not modify" #~ msgstr "No modifiquis" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Desplaçament en X de l'ombra descendent" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Desplaçament en Y de l'ombra descendent" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Opacitat de l'ombra descendent" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radi de l'ombra descendent" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Passa el focus a l'efecte de finestra" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Selecciona la finestra anterior" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Acceleració de plegament" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Velocitat de plegament" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Etapa de plegament" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "" #~ "Interval que ha de transcórrer abans d'elevar les finestres seleccionades" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Dissenya i inicia la transformació de les finestres de la sortida actual" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Assigna l'efecte de la finestra" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Minimitza la velocitat" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Minimitza l'etapa" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Mida mínima de la graella del vèrtex" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Nombre d'escriptoris virtuals" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Etapa de canvi d'opacitat" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Nivell d'opacitat de les finestres en moviment" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Nivell d'opacitat de les finestres en moviment" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Superposa una icona a les finestres un cop se n'ha canviat la mida" #~ msgid "Plugins that this must load before" #~ msgstr "Connectors que ha de carregar prèviament" #~ msgid "Plugins that this requires" #~ msgstr "Connectors que necessita" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona la següent de " #~ "totes les finestres" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona la següent de " #~ "totes les finestres" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona l'anterior de " #~ "totes les finestres" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Fes sortir el canviador si no està visible i selecciona l'anterior de " #~ "totes les finestres" # RU #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Acceleració de gir" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Velocitat del gir" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Etapa del gir" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Canvia la velocitat" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Canvia la mida de l'etapa" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "" #~ "Multiplicador de la mida de la pantalla per a la mida virtual horitzontal" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "" #~ "Multiplicador de la mida de la pantalla per a la mida virtual vertical" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Sensibilitat del moviment del punter" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Resistència a l'ombra" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Espai entre finestres" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Fricció d'elasticitat" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Constant elàstica" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Velocitat del canviador" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Etapa del canviador" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Aplicació del filtre de textura" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "" #~ "Freqüència amb la qual es torna a representar la pantalla (vegades/segon)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Temps (en ms) abans de finalitzar el mode d'escala en passar el punter " #~ "per sobre una finestra" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Temps d'espera abans d'invertir l'àrea de visualització" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Utilitza el filtre lineal en ampliar el zoom" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Resolució de la graella del vèrtex" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Escala de desplaçament d'aigua" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Velocitat d'esvaïment de la finestra" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Velocitat d'esvaïment de la finestra" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "" #~ "Tipus de finestres que s'hauran de canviar de mida en el mode d'escala" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Tipus de finestres que s'hauran de mostrar al canviador" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Tipus de finestres que s'hauran de transformar en minimitzar-se" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Tipus de finestres que s'hauran d'esvair" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan rebin el focus" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan s'agafin" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan s'assignin" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Tipus de finestres que hauran de tremolar quan es moguin" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Velocitat del zoom" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Etapa del zoom" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Factor del zoom" #~ msgid "." #~ msgstr "," #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Gira cap a la cara %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Gira cap a la cara %d amb la finestra" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #~ msgid "Rotate To Face %d" #~ msgstr "Gira cap a la cara %d" #~ msgid "Rotate to face %d" #~ msgstr "Gira cap a la cara %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Gira cap a la cara %d amb la finestra" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Gira cap a la cara %d i s'emporta la finestra activa" #~ msgid "Move Window Types" #~ msgstr "Tipus de finestres de moviment" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Disquetera" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Iniciant el dimoni." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminals" ./po/as.po0000644000004100000410000014477713246301623012650 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-11-25 00:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 ../metadata/cube.xml.in.h:28 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:23 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.h:59 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:60 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:61 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:62 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:63 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Maximize Window" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Minimize Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:85 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:91 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Unmaximize Window" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "Window Menu" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Background Images" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Background images" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Window Opacity Fade Time." msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fade Time" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:20 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:29 ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "On big cube" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:88 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:31 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:48 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:91 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:17 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Y position values" msgstr "" #: ../metadata/plane.xml.in.h:1 msgid "Desktop Plane" msgstr "" #: ../metadata/plane.xml.in.h:2 msgid "Place windows on a plane" msgstr "" #: ../metadata/plane.xml.in.h:3 msgid "Plane Down" msgstr "" #: ../metadata/plane.xml.in.h:4 msgid "Plane Left" msgstr "" #: ../metadata/plane.xml.in.h:5 msgid "Plane Right" msgstr "" #: ../metadata/plane.xml.in.h:6 msgid "Plane To Face 1" msgstr "" #: ../metadata/plane.xml.in.h:7 msgid "Plane To Face 10" msgstr "" #: ../metadata/plane.xml.in.h:8 msgid "Plane To Face 11" msgstr "" #: ../metadata/plane.xml.in.h:9 msgid "Plane To Face 12" msgstr "" #: ../metadata/plane.xml.in.h:10 msgid "Plane To Face 2" msgstr "" #: ../metadata/plane.xml.in.h:11 msgid "Plane To Face 3" msgstr "" #: ../metadata/plane.xml.in.h:12 msgid "Plane To Face 4" msgstr "" #: ../metadata/plane.xml.in.h:13 msgid "Plane To Face 5" msgstr "" #: ../metadata/plane.xml.in.h:14 msgid "Plane To Face 6" msgstr "" #: ../metadata/plane.xml.in.h:15 msgid "Plane To Face 7" msgstr "" #: ../metadata/plane.xml.in.h:16 msgid "Plane To Face 8" msgstr "" #: ../metadata/plane.xml.in.h:17 msgid "Plane To Face 9" msgstr "" #: ../metadata/plane.xml.in.h:18 msgid "Plane Up" msgstr "" #: ../metadata/plane.xml.in.h:19 msgid "Plane down" msgstr "" #: ../metadata/plane.xml.in.h:20 msgid "Plane left" msgstr "" #: ../metadata/plane.xml.in.h:21 msgid "Plane right" msgstr "" #: ../metadata/plane.xml.in.h:22 msgid "Plane to face 1" msgstr "" #: ../metadata/plane.xml.in.h:23 msgid "Plane to face 10" msgstr "" #: ../metadata/plane.xml.in.h:24 msgid "Plane to face 11" msgstr "" #: ../metadata/plane.xml.in.h:25 msgid "Plane to face 12" msgstr "" #: ../metadata/plane.xml.in.h:26 msgid "Plane to face 2" msgstr "" #: ../metadata/plane.xml.in.h:27 msgid "Plane to face 3" msgstr "" #: ../metadata/plane.xml.in.h:28 msgid "Plane to face 4" msgstr "" #: ../metadata/plane.xml.in.h:29 msgid "Plane to face 5" msgstr "" #: ../metadata/plane.xml.in.h:30 msgid "Plane to face 6" msgstr "" #: ../metadata/plane.xml.in.h:31 msgid "Plane to face 7" msgstr "" #: ../metadata/plane.xml.in.h:32 msgid "Plane to face 8" msgstr "" #: ../metadata/plane.xml.in.h:33 msgid "Plane to face 9" msgstr "" #: ../metadata/plane.xml.in.h:34 msgid "Plane up" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:92 ../metadata/switcher.xml.in.h:37 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:29 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 msgid "Zoom Speed" msgstr "" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 msgid "Zoom pan" msgstr "" ./po/de.po0000644000004100000410000040413113246301623012614 0ustar www-datawww-data# @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # FIRST AUTHOR , YEAR. # # This file is distributed under the same license as @PACKAGE@ package. FIRST # msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-06-25 17:56+0200\n" "Last-Translator: sven knoblach \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Desktop" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Fensterverwaltung" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Keine" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Aufrollen" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximieren" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Horizontal maximieren" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Vertikal maximieren" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimieren" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Hervorheben" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Niedrig" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Fenstermenü" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Auszuführende Aktion wenn das Scrollrad über der Fenster-Titelleiste " "betätigt wird." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Unschärfetyp" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Metacity-Theme Undurchsichtigkeit des aktiven Fensters" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Metacity Theme Transparenzschatten des aktiven Fensters" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Undurchsichtigkeit bei Metacity-Theme" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity-Theme Transparenzschatten" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opazität für aktive Fenster mit Metacity-Dekoration" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Undurchsichtigkeit für Metacity-Dekorationen" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Abstufung aktiver Fenster mit Metacity-Dekoration von undurchsichtig nach " "durchsichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Abstufung Fenster mit Metacity-Dekoration von undurchsichtig nach " "durchsichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Aktion des Mausrades auf der Titelleiste" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Unschärfetyp für Fensterdekoration" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity-Thema verwenden" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Metacity-Thema für das Zeichnen der Fensterdekoration verwenden" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fenster schließen" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Maximierung aufheben" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Fenster maximieren" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Fenster minimieren" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Über anderen Fenstern anordnen" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Immer auf der sichtbaren Arbeitsfläche" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Abrollen" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Nicht mehr über anderen Fenstern anordnen" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Nur auf aktueller Arbeitsfläche" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Das Fenster \"%s\" reagiert nicht mehr." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Das Erzwingen des Beendens dieser Anwendung wird den Verlust von " "ungespeicherten Daten zur Folge haben." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "Beenden erzwingen" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Auf den Bildschirm zeichnen" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Füllfarbe" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Kommentar Rahmenfarbe" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Bildschirmnotiz-Plugin" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Leeren" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Zeichnen" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Zeichnen mit Werkzeug" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Füllfarbe für Anmerkungen" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Initiieren" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Zeichnen initiieren" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Zeichnung löschen initiieren" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Löschen initiieren" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Linienstärke" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linienstärke für Notizen" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Strichfarbe für Notizen" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Strichbreite" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Strichbreite für Notizen" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x-bilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alphakanalunschärfe" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alphakanalunschärfe für Fenster" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Unschärfefilter" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Unschärfe für verdeckte Bereiche" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Sättigung" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Geschwindigkeit" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Fensterunschärfe" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Unschärfe hinter transparenten Fensterbereichen" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Sättigung" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Fensterunschärfe" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Unschärfe für Fenster im Hintergrund" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Unschärfe für verdeckte Bildbereiche ausschalten" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Methode des Unschärfefilters" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokusunschärfe" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Fokusunschärfe für Fenster" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaußsch" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Radius" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Stärke" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Radius des Gaußfilters" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Stärke des Gaußfilters" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "eigenständige Texturabrufe" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmaps" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap-LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap-Detailniveau" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsieren" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Puls-Effekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "nutze verfügbare Texturen für möglichst viele eigenständige Texturabrufe" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Geschwindigkeit des Unschärfeeffekts" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fenstertypen, auf die die Fokusunschärfe angewendet werden soll" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Fenstertypen, auf die die Alphakanalunschärfe angewendet werden soll" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Ausgabe klonen" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Auswahl klonen initiieren" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Bildschirmausgabe klonen" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Eine Tastenbelegung, die den durch Befehl 0 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Eine Tastenbelegung, die den durch Befehl 0 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Eine Tastenbelegung, die den durch Befehl 0 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " "ausführt" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Kommandozeile 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Kommandozeile 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Kommandozeile 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Kommandozeile 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Kommandozeile 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Kommandozeile 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Kommandozeile 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Kommandozeile 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Kommandozeile 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Kommandozeile 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Kommandozeile 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Kommandozeile 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command0 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command1 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command10 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command11 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command2 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command3 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command4 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command5 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command6 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command7 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command8 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Die Kommandozeile, die bei Ausführung von run_command9 in der Shell " "ausgeführt wird" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Befehl 1 ausführen" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Befehl 10 ausführen" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Befehl 11 ausführen" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Befehl 12 ausführen" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Befehl 12 ausführen" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Befehl 3 ausführen" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Befehl 4 ausführen" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Befehl 5 ausführen" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Befehl 6 ausführen" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Befehl 7 ausführen" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Befehl 8 ausführen" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Befehl 9 ausführen" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktive Plugins" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Aufbau von Vollbildfenstern ohne Umleitung zu Offscreen-Pixmaps erlauben" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Akustische Glocke" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Akustischer System-Warnton" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisch in den Vordergrund" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Verzögerung für Automatisch in den Vordergrund" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatische Erkennung von Ausgabegeräten" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatische Erkennung der Aktualisierungsrate" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Beste" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Fokuswechsel durch Klicken" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Fenster durch Anklicken fokussieren" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Aktives Fenster verschieben" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardsymbol" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standardfenstersymbol" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Desktop-Größe" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Ausgaben erkennen" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Aktualisierungsrate erkennen" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Dauer, die der Mauszeiger am Bildschirmrand verweilen muss, bevor eine Rand-" "Aktion ausgeführt wird." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Verzögerung der Rand-Aktionen" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Schnell" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" # Sinnvoller Ersatz für "Focus Stealing Prevention"? #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Stärke der \"Focus Stealing Prevention\"" # Sinnvoller Ersatz für "Focus Stealing Prevention"? #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Fenster mit \"Focus Stealing Prevention\"" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" "Auswahl an Fenstern, die beim Öffnen nicht automatisch Fokus bekommen, falls " "zu diesem Zeitpunkt mit anderen Fenstern gearbeitet wird." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Allgemeine Optionen" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Allgemeine Compiz Optionen" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Gut" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Programmleistenfenster ausblenden" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Alle Fenster ausblenden und Desktop fokussieren" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Fenster ausblenden, die sich bei Wechsel in Modus \"Desktop anzeigen\" nicht " "in Programmleiste befanden" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Hoch" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuelle horizontale Größe" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Benutze Kompression für aus Bildern generierte Texturen, wenn möglich." #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Bei maximierter Anzeige Tipps ignorieren" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Bei maximierter Anzeige Größensteigerung und Aspekttipps ignorieren" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" "Zeit, die vergehen soll, bevor das ausgewählte Fenster in den Vordergrund " "gehoben wird" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervall zwischen Ping-Meldungen" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" "Legt fest, wie strikt die \"Focus Stealing Prevention\" angewandt wird." #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Beleuchtung" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste der aktiven Plugins" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste mit Zeichenketten zur Erläuterung von Ausgabegeräten" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Niedrig" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Fenster nach unten verschieben" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Fenster unter andere Fenster verschieben" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Fenster horizontal maximieren" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Fenster vertikal maximieren" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Aktives Fenster maximieren" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Aktives Fenster horizontal maximieren" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Aktives Fenster vertikal maximieren" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Aktives Fenster minimieren" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Anzahl der Desktops" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Anzahl der virtuellen Desktops" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Aus" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Bildschirmaktualisierungen nur während inaktiver vertikaler Anzeige " "durchführen" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Ausgaben" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Behandlung von überlappenden Ausgabegeräten" #: ../metadata/core.xml.in.in.h:64 #, fuzzy msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "zeichne jede Ausgabeeinheit unabhängig voneinander, auch wenn sich die " "Einheiten überlappen" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Pingverzögerung" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Größeres Ausgabegerät bevorzugen" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Kleineres Ausgabegerät bevorzugen" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Durch Klicken in den Vordergrund" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Fenster nach vorn verlagern" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Ausgewählte Fenster nach Zeitintervall in Vordergrund verschieben" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Fenster vor andere Fenster verlagern" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Fenster durch Anklicken in Vordergrund verschieben" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Aktualisierungsrate" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" "Anzahl der virtuellen Darstellungsfelder in horizontaler Richtung (z. B. 4 " "für einen Würfel)" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Anzahl der virtuellen Darstellungsfelder in vertikaler Richtung" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Desktop anzeigen" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Langsame Animationen" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Intelligent" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Mit VBlank synchronisieren" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Texturkompression" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Strukturfilter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Texturfilter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Bildwiederholungsrate (Häufigkeit/Sekunde)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Fenster maximieren ein/aus" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Fenster horizontal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Fenster vertikal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Fenster schattieren ein/aus" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Aktives Fenster maximieren ein/aus" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Aktives Fenster horizontal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Aktives Fenster vertikal maximieren ein/aus" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Aktives Fenster schattieren ein/aus" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Verwenden langsamer Animationen ein/aus" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Maximierung des aktiven Fensters aufheben" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Umleitung von Vollbildfenstern aufheben" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Beim Umwandeln des Bildschirms diffuses Licht verwenden" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikale virtuelle Größe" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Sehr hoch" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" "Legt fest, welches der überlappenden Ausgabegeräte z.B. beim Maximieren von " "Fenstern bevorzugt werden soll." #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Maustastenkombination für Fenstermenü" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tastenkombination für Fenstermenü" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Beschleunigung" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Bild ausrichten" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Würfeloberseite entsprechend der Orientierung drehen" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Nächstes Dia anzeigen" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Skydome animieren" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Beim Drehen von Würfel Skydome animieren" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Erscheinung" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisch" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Verhalten" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farbe der Ober- und Unterseite des Würfels" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Farbe, die unten im Skydome-Fallback-Verlauf verwendet werden soll" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Farbe, die oben im Skydome-Fallback-Verlauf verwendet werden soll" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Würfelfarbe" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Würfelfarbe" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Desktop-Würfel" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Beschleunigung beim Falten" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Faltgeschwindigkeit" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Faltzeitintervall" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Wenn möglich für präzise Skalierung Mipmaps erstellen" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Zurück zum vorherigen Dia" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Bilddateien" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Bild für die Struktur des Skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Würfel nur transparent, wenn er mit der Maus rotiert wird" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "In Würfel" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Virtueller Standpunkt befindet sich innerhalb des Würfels" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Liste der PNG- und SVG-Dateien, die auf der Oberseite des Würfels angezeigt " "werden sollen" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modus für Mehrfachausgabe" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Mehrere Würfel" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Nächstes Dia" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Auf großem Würfel" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opazität bei Rotation" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opazität bei Stillstand" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" "Durchsichtigkeit des Desktop-Hintergrundes während der Rotation des Würfels" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Durchsichtigkeit des Desktop-Hintergrundes bei Stillstand des Würfels" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Fenster auf Würfel platzieren" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Vorheriges Dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Skydome anzeigen" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Bild skalieren" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Fenstergröße an Oberseite des Würfels anpassen" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Bestimmt wie der Würfel angezeigt wird, wenn mehrere Ausgabegeräte verwendet " "werden" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Endfarbe für Skydome-Verlauf" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Anfangsfarbe für Skydome-Verlauf" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome-Bild" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Geschwindigkeit" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Zeitintervall" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparenz nur bei Maus-Rotation" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Transparenter Würfel" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Auffalten" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Würfel auffalten" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus-Backend" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Mipmaps für Fensterdekorations-Texturen generieren" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekoration für Fenster" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Decorator-Kommandozeile, die ausgeführt wird, wenn nicht bereits ein " "Decorator ausgeführt wird" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "X-Versatz des Schlagschattens" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Y-Versatz des Schlagschattens" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Farbe des Schlagschattens" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opazität des Schlagschattens" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radius des Schlagschattens" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Schattenfarbe" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Schattenversatz X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Schattenversatz Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Schattenopazität" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Schattenradius" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Schatten für Fenster" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Fensterdekoration" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Fensterdekorationen" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Fenster, die dekoriert werden sollen" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Fenster, um die ein Schatten gezeichnet werden soll" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Helligkeit (%) von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Drehgeschwindigkeit" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Y einschränken" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "\"Normal\" skalierte Fenster" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Ausblendungszeit" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ausblenden bei Minimieren/Öffnen/Schliessen" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Ausblendgeschwindigkeit" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Ausblendungszeit" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Ausblendeffekt bei Minimieren/Öffnen/Schliessen" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Ausblendeffekt für visuelle Glocke" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Fenster beim Zuordnen einblenden, beim Aufheben der Zuordnung ausblenden" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ein-/Ausblenden für Fenster" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Fenster ein-/ausblenden" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuelle Glocke in Vollbild" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Ausblendeffekt für visuelle Glocke im Vollbildmodus" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Sättigung (%) von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Helligkeit von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Sättigung von nicht-reagierenden Fenstern" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuelle Glocke" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Fensterausblendgeschwindigkeit" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Fenster, die im Skaliermodus skaliert werden sollen" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Fenster, die ein- und ausgeblendet werden sollen" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Einhängepunkt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "„Mount point“" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Benutzerbereichs-Dateisystem" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Benutzerbereichs-Dateisystem" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf-Backend" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib-Mainloop-Unterstützung" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome Kompatibilität" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Einen Terminalemulator öffnen" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Optionen die die Kompatibilität von Compiz zu Gnome gewährleisten" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialogfeld Ausführen" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandozeile für Terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandozeile für Bildschirmfoto" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Hauptmenü anzeigen" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Dialogfeld 'Anwendung ausführen' anzeigen" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Hauptmenü anzeigen" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Bildschirmfoto aufnehmen" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Bildschirmfoto von Fenster aufnehmen" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Kommandozeile für Terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandozeile für Fenster-Bildschirmfoto " #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Backend, das einfache Text-Konfigurationsdateien verwendet" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Überwachung von Änderungen an Dateien" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig-Backend" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimierungseffekt" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimierungseffekt für Fenster" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimiergeschwindigkeit" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimierintervall" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Schattenwiderstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Schattenwiderstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Fenster beim Minimieren und beim Aufheben der Minimierung verformen" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Fenster, die beim Minimieren verformt werden sollen" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Y einschränken" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y-Koordinate auf Arbeitsoberfläche einschränken" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Serverseitige Fensterposition bis zum Ende des Verschiebevorgangs nicht " "aktualisieren" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Fensterverschiebung initiieren" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Ökonomisch positionieren" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Fenster verschieben" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Fenster verschieben" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opazität" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Durchsichtigkeit der Fenster beim Verschieben" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Beim Ziehen Einrasten und Maximierung maximierter Fenster aufheben" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Einrasten maximierter Fenster aufheben" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Fensterverschiebung starten" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Helligkeit" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Veringerung der Helligkeit" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Helligkeit" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Helligkeit" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Deckkraft verringern" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Deckkraft erhöhen" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "" "Die Schrittweite für Einstellungen der Opazität/Durchsichtigkeit ändern" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "" "Die Schrittweite für Einstellungen der Opazität/Durchsichtigkeit ändern" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Schrittweite für Opazität" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Durchsichtigkeit der Fenster beim Verschieben" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opazität bei Rotation" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sättigung" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Fensterdekorationen" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Fenstertypen" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Fenstertypen zuordnen" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Fenstertypen, die an eine bestimmte Position platziert werden sollen" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Fenstertypen, die standardmäßig transparent sein sollen" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Fenstertypen, die an eine bestimmte Position platziert werden sollen" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algorithmus für die Fensterpositionierung" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskadenförmig" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Zentriert" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Fensterverwaltung" # Sinnvoller Ersatz für "Focus Stealing Prevention"? #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Fenster deren Platzieren erzwungen wird" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horizontale Viewport-Position" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Fenster platzieren" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Kleineres Ausgabegerät bevorzugen" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Fenster bei Zuordnung ungefähr platzieren" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Platzierungsmodus" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Positionierte Fenster" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Zufällig" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Legt fest, wohin skalierte Fenster platziert werden, wenn mehrere " "Ausgabegeräte verwendet werden." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelligent" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Auf allen Ausgabegeräten" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Vertikale Viewport-Position" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Auf Viewport platzierte Fenster" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Fensterplatzierungs-Workarounds" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fenstertypen, die an eine bestimmte Position platziert werden sollen" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Fenstertypen, die auf einen bestimmten Viewport platziert werden sollen" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Fensterdekorationen" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Workarounds" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-Position" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Viewport-X-Position" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Horizontale Position" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-Position" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Viewport-Y-Position" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Vertikale Position" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Plugin für das Laden von Bildern im PNG-Format" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Reguläre Ausdrücke" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" "Ermöglicht die Verwendung von regulären Ausdrücken beim Festlegen von " "Fensterregeln." #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 #, fuzzy msgid "Bindings" msgstr "Bindungen" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Rahmenfarbe" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Für die Modi \"Umriss\" und \"Rechteck\" verwendete Rahmenfarbe." #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standard-Modus" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Normalerweise für Fensterskalierung verwendeter Modus." #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Füllfarbe" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Im Modus \"Rechteck\" verwendete Füllfarbe." #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Fensterskalierung im Modus \"Normal\" initiieren" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Fensterskalierung im Modus \"Umriss\" initiieren" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Fensterskalierung im Modus \"Rechteck\" initiieren" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Fensterskalierung im Modus \"Strecken\" initiieren" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Fensterskalierung initiieren" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "\"Normal\" skalierte Fenster" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Umriss" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "\"Umriss\"-skalierte Fenster" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rechteck" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "\"Rechteck\"-skalierte Fenster" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Fenster skalieren" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Fenster skalieren" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Fensterskalierung starten" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Startet Skalierung des Fensters durch Strecken" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Startet traditionelle Skalierung des Fensters" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Startet Skalierung des Fensters mit Anzeige des Umrisses" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Startet Skalierung des Fensters mit Anzeige eines Rechtecks" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Strecken" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Gestreckt skalierte Fenster" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Fenstertypen, die im Modus \"Normal\" skaliert werden sollen" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Fenstertypen, die im Modus Umriss\" skaliert werden sollen" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Fenstertypen, die im Modus \"Rechteck\" skaliert werden sollen" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Fenstertypen, die im Modus \"Strecken\" skaliert werden sollen" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "An Rand wechseln (Ziehen und Ablegen)" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "An Rand wechseln (Verschieben)" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "An Rand wechseln (Zeiger)" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Wechselzeit" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Zum linken Viewport wechseln und Zeiger verzerren" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Zum nächsten Viewport wechseln, wenn Objekt an den Bildschirmrand gezogen " "wird" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Zum nächsten Viewport wechseln, wenn Zeiger an den Bildschirmrand verschoben " "wird" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Zum nächsten Viewport wechseln, wenn Fenster an den Bildschirmrand " "verschoben wird" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Zum rechten Viewport wechseln und Zeiger verzerren" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Y-Achse für Zeigerbewegung umkehren" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Y umkehren für Zeiger" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Zeigerempfindlichkeit" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Während des Drehens anheben" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Fenster während des Drehens anheben" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Würfel drehen" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Drehen (nach links kippen)" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Drehen (nach rechts kippen)" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Links drehen" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Links drehen mit Fenster" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Rechts drehen" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Rechts drehen mit Fenster" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Drehen in Richtung" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Drehen zu Fläche 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Drehen zu Fläche 1 mit Fenster" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Drehen zu Fläche 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Drehen zu Fläche 10 mit Fenster" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Drehen zu Fläche 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Drehen zu Fläche 11 mit Fenster" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Drehen zu Fläche 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Drehen zu Fläche 12 mit Fenster" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Drehen zu Fläche 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Drehen zu Fläche 2 mit Fenster" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Drehen zu Fläche 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Drehen zu Fläche 3 mit Fenster" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Drehen zu Fläche 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Drehen zu Fläche 4 mit Fenster" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Drehen zu Fläche 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Drehen zu Fläche 5 mit Fenster" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Drehen zu Fläche 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Drehen zu Fläche 6 mit Fenster" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Drehen zu Fläche 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Drehen zu Fläche 7 mit Fenster" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Drehen zu Fläche 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Drehen zu Fläche 8 mit Fenster" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Drehen zu Fläche 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Drehen zu Fläche 9 mit Fenster" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Würfel rotieren" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Desktop-Würfel drehen" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Links drehen" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Links drehen und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Rechts drehen" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rechts drehen und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Drehen zu Fläche 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Drehen zu Fläche 1 mit Fenster" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Drehen zu Fläche 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Drehen zu Fläche 1 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Drehen zu Fläche 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Drehen zu Fläche 10 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Drehen zu Fläche 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Drehen zu Fläche 11 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Drehen zu Fläche 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Drehen zu Fläche 12 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Drehen zu Fläche 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Drehen zu Fläche 2 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Drehen zu Fläche 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Drehen zu Fläche 3 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Drehen zu Fläche 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Drehen zu Fläche 4 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Drehen zu Fläche 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Drehen zu Fläche 5 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Drehen zu Fläche 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Drehen zu Fläche 6 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Drehen zu Fläche 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Drehen zu Fläche 7 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Drehen zu Fläche 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Drehen zu Fläche 8 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Drehen zu Fläche 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Drehen zu Fläche 9 und aktives Fenster mitführen" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "In Richtung Viewport drehen" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Fenster drehen" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Mit Fenster drehen" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Drehbeschleunigung" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Drehgeschwindigkeit" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Drehintervall" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Zoom während des Drehens" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Empfindlichkeit bei Zeigerbewegung" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Würfeldrehung an Unterseite einrasten" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Würfeldrehung an Oberseite einrasten" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "An Unterseite einrasten" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "An Oberseite einrasten" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Drehung starten" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Zeitüberschreitung vor Viewport-Wechsel" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Durchlässigkeitsgrad in Prozent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Groß" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Auf den Desktop klicken um ihn anzuzeigen" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Hintergrund abdunkeln" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Hintergrund beim Skalieren von Fenstern abdunkeln" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblem" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Verweildauer" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Fensterauswahl initiieren" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Fensterauswahl für alle Fenster initiieren" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Fensterauswahl für Fenstergruppe initiieren" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Fensterauswahl für Fenster in aktueller Ausgabe initiieren" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Layout durchführen und mit der Umformung aller Fenster beginnen" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Layout durchführen und mit der Umformung der Fenstergruppe beginnen" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Layout erstellen und mit Fensterumformung beginnen" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" "Layout durchführen und mit der Umformung der Fenster in aktueller Ausgabe " "beginnen" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Auf allen Ausgabegeräten" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Auf momentanem Ausgabegerät" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Symbol überlagern" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Fenster nach Skalierung mit Symbol überlagern" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skalieren" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Fenster skalieren" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaliergeschwindigkeit" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Skalierzeitintervall" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Fenster skalieren" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Legt fest, wohin skalierte Fenster platziert werden, wenn mehrere " "Ausgabegeräte verwendet werden." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Abstand zwischen Fenstern" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Abstand" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Zeit (in ms) bis zum Beenden des Skaliermodus beim Verweilen über einem " "Fenster" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Fenster, die im Skaliermodus skaliert werden sollen" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Bildschirmfoto automatisch mit dieser Anwendung öffnen" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Verzeichnis" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Start der Auswahl des aufzunehmenden Rechtecks" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Anwendung starten" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Bildschirmfoto in diesem Verzeichnis speichern" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Bildschirmfoto" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin, mit dessen Hilfe Bildschirmfotos aufgenommen werden können" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Plugin für das Laden von Bildern im SVG-Format" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Helligkeitsgrad in Prozent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Sättigungsgrad in Prozent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Anwendungs-Umschalter" # Übersetzung ist nicht 1:1, beschreibt aber genau das, was passiert ;-) #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatisch Arbeitsfläche wechseln" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "In den Vordergrund verschieben" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Ausgewähltes Fenster in den Vordergrund verschieben" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Distance-Desktop sollte beim Umschalten zwischen Fenstern verkleinert sein" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimiert" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop-Fläche" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Nächstes Fenster" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Nächstes Fenster (Alle Arbeitsflächen)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Nächstes Fenster (Keine Vorschau)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Vorschaufenster anzeigen und nächstes Fenster auswählen" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Vorschaufenster anzeigen und nächstes Fenster (von allen Arbeitsflächen) " "auswählen" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Vorschaufenster anzeigen und vorheriges Fenster auswählen" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Vorschaufenster anzeigen und vorheriges Fenster (von allen Arbeitsflächen) " "auswählen" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Vorheriges Dia" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Vorheriges Fenster" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Vorheriges Fenster (Alle Arbeitsflächen)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Vorheriges Fenster (Keine Vorschau)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" "Während des Umschaltens zur Arbeitsfläche des selektierten Fensters wechseln." #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Nächstes Fenster auswählen" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Nächstes Fenster auswählen, ohne dabei das Vorschaufenster anzuzeigen." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Vorheriges Fenster auswählen" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" "Vorheriges Fenster auswählen, ohne dabei das Vorschaufenster anzuzeigen." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Neben Miniaturbild Symbol anzeigen" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Minimierte Fenster anzeigen" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Schaltergeschwindigkeit" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Schalterzeitintervall" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Fenster in Umschaltauswahl" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Fenster, die beim Umschalten auswählbar sein sollen." #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Stellt YV12-Farbraum-Unterstützung zur Verfügung." #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Video Wiedergabe" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Video Wiedergabe" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12-Farbraum" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Linie hinzufügen" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Punkt hinzufügen" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Wassereffekte zu verschiedenen Aktionen des Desktops hinzufügen" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Verzögerung (in ms) zwischen den einzelnen Regentropfen" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Wassereffekte für Mauszeiger aktivieren" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linie" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Versatz-Skalierung" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regenverzögerung" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titelwelle" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Regen ein/aus" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Regeneffekt ein/aus" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Wischer ein-/ausschalten" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Wischereffekt ein-/ausschalten" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Wassereffekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Wasser-Versatz-Skalierung" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Welleneffekt aus Fenstertitel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Effekt fokussieren" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Fenstereffekt fokussieren" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Fenstertypen fokussieren" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Reibung" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Fenstertypen aufnehmen" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Gitterauflösung" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Invertiertes Einrasten von Fenstern" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Fenster zittern lassen" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Effekt zuordnen" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Fenstereffekt zuordnen" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Fenstertypen zuordnen" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Effekt maximieren" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimale Gittergröße" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimale Gittergröße" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Fenster verschieben" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Zittern" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Einrasten invertiert" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Fenster einrasten" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Reibung" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Spring K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Federkonstante" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Einrasten von Fenstern ein/aus" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Federmodell für Fenster-Wackeleffekt verwenden" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Auflösung des Gitters" #: ../metadata/wobbly.xml.in.h:26 #, fuzzy msgid "Windows that should wobble when focused" msgstr "Fenstertypen, die beim Erhalt des Fokus wackeln sollen" #: ../metadata/wobbly.xml.in.h:27 #, fuzzy msgid "Windows that should wobble when grabbed" msgstr "Fenstertypen, die bei Aufnahme wackeln sollen" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Fenstertypen, die beim Zuordnen wackeln sollen" #: ../metadata/wobbly.xml.in.h:29 #, fuzzy msgid "Windows that should wobble when moved" msgstr "Fenstertypen, die beim Verschieben wackeln sollen" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Wackeleffekt beim Maximieren/Aufheben der Maximierung von Fenstern" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Wackelige Fenster" #~ msgid "Command line 0" #~ msgstr "Kommandozeile 0" #~ msgid "Run command 0" #~ msgstr "Befehl 0 ausführen" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandozeile für Bildschirmfoto" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandozeile für Bildschirmfoto" #~ msgid "Filter Linear" #~ msgstr "Linearer Filter" #~ msgid "Use linear filter when zoomed in" #~ msgstr "In Vergrößerung linearen Filter verwenden" #~ msgid "Zoom Desktop" #~ msgstr "Desktop zoomen" #~ msgid "Zoom In" #~ msgstr "Ansicht vergrößern" #~ msgid "Zoom Out" #~ msgstr "Ansicht verkleinern" #~ msgid "Zoom Pan" #~ msgstr "Ansicht verschieben" #~ msgid "Zoom Speed" #~ msgstr "Zoomgeschwindigkeit" #~ msgid "Zoom Timestep" #~ msgstr "Zoomintervall" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Desktop-Würfel zoomen und schwenken" #~ msgid "Zoom factor" #~ msgstr "Zoomfaktor" #~ msgid "Zoom pan" #~ msgstr "Ansicht verschieben" #~ msgid "Decrease window opacity" #~ msgstr "Fensterdeckkraft verringern" #~ msgid "Increase window opacity" #~ msgstr "Fensterdeckkraft erhöhen" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Wert der Opazität für grundsätzlich transluzente Fenster" #~ msgid "Opacity window values" #~ msgstr "Opazitätswert" #~ msgid "Opacity windows" #~ msgstr "Transluzente Fenster" #~ msgid "Background Images" #~ msgstr "Hintergrundbilder" #~ msgid "Background images" #~ msgstr "Hintergrundbilder" #~ msgid "Place windows on a plane" #~ msgstr "Fenster auf einer Fläche platzieren" #~ msgid "Plane Down" #~ msgstr "Nach unten" #~ msgid "Plane Left" #~ msgstr "Nach links" #~ msgid "Plane Right" #~ msgstr "Nach rechts" #~ msgid "Plane To Face 1" #~ msgstr "Zu Arbeitsfäche 1 wechseln" #~ msgid "Plane To Face 10" #~ msgstr "Zu Arbeitsfäche 10 wechseln" #~ msgid "Plane To Face 11" #~ msgstr "Zu Arbeitsfäche 11 wechseln" #~ msgid "Plane To Face 12" #~ msgstr "Zu Arbeitsfäche 12 wechseln" #~ msgid "Plane To Face 2" #~ msgstr "Zu Arbeitsfäche 2 wechseln" #~ msgid "Plane To Face 3" #~ msgstr "Zu Arbeitsfäche 3 wechseln" #~ msgid "Plane To Face 4" #~ msgstr "Zu Arbeitsfäche 4 wechseln" #~ msgid "Plane To Face 5" #~ msgstr "Zu Arbeitsfäche 5 wechseln" #~ msgid "Plane To Face 6" #~ msgstr "Zu Arbeitsfäche 6 wechseln" #~ msgid "Plane To Face 7" #~ msgstr "Zu Arbeitsfäche 7 wechseln" #~ msgid "Plane To Face 8" #~ msgstr "Zu Arbeitsfäche 8 wechseln" #~ msgid "Plane To Face 9" #~ msgstr "Zu Arbeitsfäche 9 wechseln" #~ msgid "Plane Up" #~ msgstr "Nach oben" #~ msgid "Plane down" #~ msgstr "Nach unten" #~ msgid "Plane left" #~ msgstr "Nach links" #~ msgid "Plane right" #~ msgstr "Nach rechts" #~ msgid "Plane to face 1" #~ msgstr "Zu Arbeitsfäche 1 wechseln" #~ msgid "Plane to face 10" #~ msgstr "Zu Arbeitsfäche 10 wechseln" #~ msgid "Plane to face 11" #~ msgstr "Zu Arbeitsfäche 11 wechseln" #~ msgid "Plane to face 12" #~ msgstr "Zu Arbeitsfäche 12 wechseln" #~ msgid "Plane to face 2" #~ msgstr "Zu Arbeitsfäche 2 wechseln" #~ msgid "Plane to face 3" #~ msgstr "Zu Arbeitsfäche 3 wechseln" #~ msgid "Plane to face 4" #~ msgstr "Zu Arbeitsfäche 4 wechseln" #~ msgid "Plane to face 5" #~ msgstr "Zu Arbeitsfäche 5 wechseln" #~ msgid "Plane to face 6" #~ msgstr "Zu Arbeitsfäche 6 wechseln" #~ msgid "Plane to face 7" #~ msgstr "Zu Arbeitsfäche 7 wechseln" #~ msgid "Plane to face 8" #~ msgstr "Zu Arbeitsfäche 8 wechseln" #~ msgid "Plane to face 9" #~ msgstr "Zu Arbeitsfäche 9 wechseln" #~ msgid "Plane up" #~ msgstr "Nach oben" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Dauer der Fensterausblendung" #~ msgid "Open window menu" #~ msgstr "Fenstermenü öffnen" #~ msgid "Dock" #~ msgstr "Andocken" #~ msgid "Toolbar" #~ msgstr "Werkzeugleiste" #~ msgid "Menu" #~ msgstr "Menü" #~ msgid "Utility" #~ msgstr "Dienstprogramm" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Dialogfeld" #~ msgid "DropdownMenu" #~ msgstr "DropdownMenu" #~ msgid "PopupMenu" #~ msgstr "PopupMenu" #~ msgid "Tooltip" #~ msgstr "Kurzinfo" #~ msgid "Notification" #~ msgstr "Benachrichtigung" #~ msgid "Combo" #~ msgstr "Combo" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "ModalDialog" #~ msgid "Fullscreen" #~ msgstr "Vollbild" #~ msgid "Unknown" #~ msgstr "Unbekannt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 1 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 10 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 11 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 2 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 3 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 4 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 5 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 6 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 7 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 8 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Eine Tastenbelegung, die den durch Befehl 9 festgelegten Shell-Befehl " #~ "ausführt" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Helligkeitsgrad in Prozent" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Durchlässigkeitsgrad in Prozent" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Sättigungsgrad in Prozent" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Sättigung" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Verzögerung (in ms) zwischen den einzelnen Regentropfen" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Distance-Desktop sollte beim Umschalten zwischen Fenstern verkleinert sein" #~ msgid "Do not modify" #~ msgstr "Nicht ändern" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Drop-Shadow-X-Offset" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Drop-Shadow-Y-Offset" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Drop-Shadow-Durchlässigkeit" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Drop-Shadow-Radius" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Fenstereffekt fokussieren (Keiner, Zittern)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Vorheriges Fenster auswählen" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Faltbeschleunigung (1,0-20,0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Faltgeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Falt-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Russische Föderation" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Russisch" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Zeitintervall vor Verlagern der ausgewählten Fenster" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Layout durchführen und mit der Umformung der Fenster in aktueller Ausgabe " #~ "beginnen" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Fenstereffekt zuordnen (Keiner, Zittern)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Minimiergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Minimiergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimale Gittergröße" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Anzahl der virtuellen Desktops" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Änderungsschritt für Durchlässigkeit" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Durchlässigkeitsgrad beweglicher Fenster" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Durchlässigkeitsgrad beweglicher Fenster" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Fenster nach Skalierung mit Symbol überlagern" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Plugins that this must load before" #~ msgstr "Plugins, die zuvor geladen werden müssen" #~ msgid "Plugins that this requires" #~ msgstr "Erforderliche Plugins" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern nächstes " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern nächstes " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern vorheriges " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Popup-Schalter, wenn nicht sichtbar, und von allen Fenstern vorheriges " #~ "Fenster auswählen" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Faltbeschleunigung (1,0-20,0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Zoomgeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Zoom-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Skaliergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Skalier-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Bildschirmgrößenmultiplikator für horizontale virtuelle Größe" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Bildschirmgrößenmultiplikator für vertikale virtuelle Größe" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Empfindlichkeit bei Zeigerbewegung" #~ msgid "Shade resistance (0-100)" #~ msgstr "Schattenwiderstand (0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Abstand zwischen Fenstern" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Reibung" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Federkonstante" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Skaliergeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Skalier-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Texturfilter (Schnell, Gut, Beste)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Rate des Bildschirmneuaufbaus (Häufigkeit/Sekunde)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Zeit (in ms) bis zum Beenden des Skaliermodus beim Verweilen über einem " #~ "Fenster" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Zeitüberschreitung vor Viewport-Wechsel" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "In Vergrößerung linearen Filter verwenden" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Auflösung des Gitters" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Wasser-Versatz-Skalierung" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Fensterausblendgeschwindigkeit" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Fensterausblendgeschwindigkeit" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Fenstertypen, die im Skaliermodus skaliert werden sollen" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Fenstertypen, die im Schalter angezeigt werden sollen" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Fenstertypen, die beim Minimieren umgeformt werden sollen" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Fenstertypen, die ausgeblendet werden sollen" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Fenstertypen, die beim Erhalt des Fokus wackeln sollen" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Fenstertypen, die bei Aufnahme wackeln sollen" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Fenstertypen, die beim Zuordnen wackeln sollen" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Fenstertypen, die beim Verschieben wackeln sollen" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Ecken, die Skalierungsmodus auslösen sollten (links oben, rechts oben, " #~ "links unten, rechts unten)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Zoomgeschwindigkeit (0,1-50,0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Zoom-Zeitintervall (0,1-50,0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Zoomfaktor" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "In Richtung %d drehen" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "In Richtung %d drehen" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "In Richtung %d drehen (mit Fenster)" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "In Richtung %d drehen (mit aktivem Fenster)" #~ msgid "Rotate To Face %d" #~ msgstr "In Richtung %d drehen" #~ msgid "Rotate to face %d" #~ msgstr "In Richtung %d drehen" #~ msgid "Rotate To Face %d with Window" #~ msgstr "In Richtung %d drehen (mit Fenster)" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "In Richtung %d drehen (mit aktivem Fenster)" #~ msgid "Command line %d" #~ msgstr "Kommandozeile %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Kommandozeile, die beim Aufruf von Kommando 'run_command%d' in Shell " #~ "ausgeführt werden soll" #~ msgid "Run command %d" #~ msgstr "Kommando %d ausführen" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "" #~ "Eine Tastenzuordnung, bei deren Aktivierung das durch Kommando %d " #~ "identifizierte Shell-Kommando ausgeführt wird" #~ msgid "Move Window Types" #~ msgstr "Fenstertypen verschieben" #~ msgid "Corners" #~ msgstr "Ecken" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Fenster fokussieren, wenn sich der Mauszeiger darüber befindet" #~ msgid "Initiate All Windows" #~ msgstr "Alle Fenster initiieren" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Fensterverschiebung via Tastatur initiieren" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Fensterskalierung via Tastatur initiieren" #~ msgid "Initiate Window Switcher" #~ msgstr "Fenster-Switcher initiieren" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Modifikator zur Anzeige des Switcher für alle Fenster" #~ msgid "Return from scale view" #~ msgstr "Zurück aus Skalierungsansicht" #~ msgid "Show switcher" #~ msgstr "Switcher anzeigen" #~ msgid "Sloppy Focus" #~ msgstr "Verzögerter Fokus" #~ msgid "Start moving window using keyboard" #~ msgstr "Fensterverschiebung via Tastatur starten" #~ msgid "Terminate" #~ msgstr "Beenden" #~ msgid "Water effect on system beep" #~ msgstr "Wassereffekt für System-Warnton" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die ein-/ausgeblendet werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Minimieren umgeformt werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die im Skaliermodus skaliert werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die im Switcher angezeigt werden sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Erhalt des Fokus wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die bei Aufnahme wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Anzeigen wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Fenstertypen, die beim Verschieben wackeln sollen (Desktop, Dock, " #~ "Symbolleiste, Menü, Dienstprogramm, Splash, Dialog, ModalDialog, Normal, " #~ "Vollbild, Unbekannt)" #~ msgid "Wobble effect on system beep" #~ msgstr "Wackeleffekt für System-Warnton" ./po/gl.po0000644000004100000410000026232713246301623012637 0ustar www-datawww-data# translation of compiz.po to # traducción de gl-compiz.po to Galician # Compiz Core Galician Translation. # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the Compiz package. # # # Fran Diéguez (GLUG) , 2007, 2009. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-03-29 23:01+0200\n" "Last-Translator: \n" "Language-Team: en_US \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 0.3\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Escritorio" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Xestión de Fiestras" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ningún" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Sombra" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizar" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximizar Horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximizar Verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizar" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Elevar" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Baixar" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menú da Fiestra" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acción a levar a cabo cando se fai acciona a roda do rato na barra de título " "da xanela." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de desenfoque" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidade da xanela activa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidade da sombra da xanela activa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidade do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidade da sombra do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacidade a empregar para xanelas activas con decoracións metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidade a empregar para decoracións metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Escurecer decoración de xanelas activas con temas metacity de opaco cara " "transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombrear decoración de xanelas con temas metacity de opaco cara transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acción da roda do rato na barra de título" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de desenfoque empregado para as decoracións" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Empregar tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Empregar tema metacity ao debuxar as decoracións das xanelas" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Pechar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Demaximizar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar Fiestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Sempre en Primeiro Plano" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Fixar" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Descurecer" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Desfacer Sempre en Primeiro Plano" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Desfixar" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A xanela \"%s\" non está respondendo." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Se forzar a saída desta aplicación causará a perda dos cambios non gardados." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forzar Saída" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotacións" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Cor de recheo das anotacións" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Cor do pincel das anotacións" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Complemento de Anotacións" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Debuxar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Debuxar empregando a ferramenta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Cor de recheo das anotacións" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar debuxo das anotacións" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar goma de borrar das anotacións" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar goma de borrar" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ancho da liña" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ancho da liña para anotacións" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Cor do pincel para anotacións" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ancho do pincel" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ancho do pincel para as anotacións" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x Bilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desenfoque Alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Desenfoque alfa das xanelas" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desenfoque" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusión ou desenfoque" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturación do desenfoque" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidade de desenfoque" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desenfoque de xanelas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desenfocar na parte traseira das xanelas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturación do desenfoque" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desenfoca as xanelas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desenfocar as xanelas que non teñan foco" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desactivar desenfoque de rexións de pantalla escurecidas por outras xanelas." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtrado empregado para desenfocar" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desenfocar segundo o foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desenfocar xanelas segundo o foco" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gausiano" # name for RUS #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Radio gausiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Forza gausiana" # name for RUS #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Radio gausiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Forza gausiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Recollida de textura independente" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mapa de Imaxe" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mapa de Imaxe LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nivel de detalle do mapa de imaxe" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efecto pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Empregar as unidades de textura dispoñibles para facer o maior número " "derecollidas de textura independentes posibles." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidade de desenfoque das xanelas" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fiestras afectadas polo desenfoque do foco" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Fiestras que deben empregar o-desenfoque alfa por omisión" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonación da Saída" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar selección clonada" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Xestor de clonación de saída" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de " "consolaidentificado polo comando2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un botón de atalloque, cando é accionado, executa o comando de consola " "identificado polo comando6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un botón de atallo que, cando é accionado, executa o comando de consola " "identificado polo comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de " "consolaidentificado polo comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un atallo de teclado que, cando é accionado, executa o comando de consola " "identificado polo comando9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un atallo de borde que cando é invocado, executa o comando de consola " "identificado polo comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Asigna atallos a comandos arbitrarios" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Botóns de atallo" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Liña de comando 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Liña de comando 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Liña de comando 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Liña de comando 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Liña de comando 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Liña de comando 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Liña de comando 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Liña de comando 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Liña de comando 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Liña de comando 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Liña de comando 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Liña de comando 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando0 sexa " "accionado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando1 sexa " "accionado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando10 sexa " "accionado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando11 sexa " "accionado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando2 sexa " "accionado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando3 sexa " "accionado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando4 sexa " "accionado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando5 sexa " "accionado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando6 sexa " "accionado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando7 sexa " "accionado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando8 sexa " "accionado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Liña de comando a ser executada na consola cando executar_comando9 sexa " "accionado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandos" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Atallos de Borde" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Atallos de Teclado" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Executar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Executar comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Executar comando 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Executar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Executar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Executar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Executar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Executar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Executar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Executar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Executar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Complementos Activos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que o renderizado das xanelas a pantalla completa non sexa " "redirixido a mapas de imaxe fora da pantalla" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Campá audible" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Campá de sistema audible" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevación Automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Atraso na Elevación Automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detección automática de dispositivos de saída" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detección automática da taxa de actualización" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Mellor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Faga Clic para Enfocar" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Ao facer clic na xanela transfírese o foco cara ela" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Pechar a xanela activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icona por defecto" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imaxe da icona da xanela por defecto" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Tamaño do Escritorio" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar Saídas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar Taxa de Actualización" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Configuracións de Pantalla" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "O tempo que o punteiro debe estar no borde da pantalla antes de que acción " "do borde se leve a cabo." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Atraso do Disparador de Acción de Borde" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Enfoque & Xestión de Comportamento" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nivel de Prevención de Enfoque" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Prevención do Enfoque nas Fiestras" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Prevención do enfoque nas xanelas" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forzar debuxado na saída independente" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opcións Xerais" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opcións xerais de compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bo" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar Fiestras Ignorando a Barra de Tarefa" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ocultar todas as xanelas e enfocar o escritorio" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Agochar as xanelas que non están na barra de tarefas ao entrar no modo " "amosar escritorio" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Alta" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamaño Virtual Horizontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Empregala compresión para as texturas convertidas dende imaxes" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar os Consellos Cando Estea Maximizado" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorar incremento de tamaño e aspecto dos consellos cando a xanela está " "maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes da elevación das xanelas seleccionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensaxes ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Atallos de teclado" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nivel de prevención da perda de enfoque" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminación" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de engadidos activados" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de cadeas que describen os dispositivos de saída" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Baixa" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Fiestra Máis Baixa" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Fiestra máis baixa por debaixo das outras xanelas" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar a Fiestra Horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar a Fiestra Verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximiza a xanela activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximiza horizontalmente a xanela activa" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximiza verticalmente a xanela activa" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiza a xanela activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de escritorios" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de escritorios virtuais" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Apagado" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Só actualizar a pantalla durante o período de limpeza vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Saídas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Xestión de Saídas Superpostas" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Debuxar cada dispositivo de saída de forma independente, aínda que o " "dispositivo de saída se superpoña" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Atraso de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferir saída máis grande" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferir saída máis pequena" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Elevar con un Clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar Fiestra" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Elevar xanelas seleccionadas despois dun intervalo de tempo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar xanela por enriba das restantes" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Elevar xanelas cando se faga clic nelas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Taxa de Actualización" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador do tamaño da pantalla para o tamaño virtual horizontal" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador do tamaño da pantalla para o tamaño virtual vertical" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Amosar Escritorio" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animacións Lentas" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modo intelixente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar a VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compresión de Texturas" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtro de Texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Taxa de refresco da pantalla (veces/segundo) " #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Trocar Maximizado da Fiestra" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Trocar Maximizado Horizontal da Fiestra" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Trocar Maximizado Vertical da Fiestra" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Trocar Escurecemento da Fiestra" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Trocar Maximizado da Fiestra Actual" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Trocar Maximizado Horizontal da Fiestra Activa" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Trocar Maximizado Vertical da Fiestra Activa" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Trocar escurecemento da xanela activa" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Trocar o uso de animacións lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximizar xanela activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Desredirección das Fiestras en Pantalla Completa" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Empregar luz difusa cando se transforma a pantalla" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamaño Vertical Virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Moi Alta" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Cal dos dispositivos que se superpoñen debería ser o preferido" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botón de atallo para menú da xanela" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla de atallo para menú da xanela" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleración" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Axustar Imaxe" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Axustar a cara superior á rotación" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avanzar á seguinte cara" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animar Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animar Skydome ao xirar o cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Apariencia" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Cor dos lados superior e inferior do cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para a cor inferior do gradiente do skydome por omisión" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para cor superior do gradiente do skydome por omisión" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Tapas do Cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo de escritorios" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleración de dobrado" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidade de dobrado" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Pasos de dobrado" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Xerar mapas cando sexa posíbel para dimensionado de mellor calidade" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Voltar á anterior cara" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Arquivos de imaxe" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imaxe a empregar como textura no skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Iniciar transparencia do cubo só se a rotación é iniciada polo rato." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Interior do Cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Interior do cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de arquivos PNG e SVG que deben ser empregan na cara superior do cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de saída múltiple" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cubos múltiples" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Seguinte Cara" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un cubo grande" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidade Durante a Rotación" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidade Mentres Non se Roda" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidade da xanela do escritorio ao rodar" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidade do escritorio cando non está rotando" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Dispón as xanelas nas caras dun cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Cara Anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderizar skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Escalar imaxe" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Escalar imaxes para cubrir a cara superior do cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Seleccione como se mostra o cubo se se empregan dispositivos de saída " "múltiples" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Cor Final do gradiente Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Cor Inicial do gradiente Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imaxe do Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidade" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Saltos do tempo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Activar Transparencia só ao rodar co rato" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo Transparente" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desdobrar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desdobrar cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend de control do Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permitir a xeración de mapas de imaxe para as texturas da decoración" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Activa a xestión da decoración das xanelas" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Liña de comando a executar se non se está a executar ningún decorador" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Desprazamento X da sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Desprazamento Y da sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacidade da sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radio da sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Desprazamento X da Sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Desprazamento Y da Sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidade da Sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Radio da Sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Fiestras con sombra" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoración da Fiestra" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decoracións das xanelas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Fiestras que se deben decorar" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Fiestras que deben ter sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Brillo (en %) das xanelas bloqueadas" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocidade constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Constante de tempo" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Escurecer as Fiestras que non Responden" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Escurecer as xanelas que non están a responder ao que o xestor de xanelas " "require" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Modo de Desvanecemento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Aparecer ao Minimizar/Abrir/Pechar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidade de Desvanecemento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tempo de desvanecemento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Realizar Efecto de Desvanecemento cos eventos de minimizar/abrir/pechar " "xanelas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efecto de desvanecemento ao soar a campá do sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Amosar as xanelas cando haxa mapeado e desvanecelas cando sexan desmapeadas" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer xanelas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Fiestras Desvanecidas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campá Visual a Pantalla Completa" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" "Efecto de desvanecemento da pantalla completa cando sona a campá do sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturación das xanelas bloqueadas (en %)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Brillo das Fiestras Bloqueadas" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturación das Fiestras Bloqueadas" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campá Visual" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Modo de desvanecemento das xanelas" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" "Modo \"Velocidade Constante\" para a Velocidade de Desvanecemento das " "Fiestras" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Modo \"Tempo constante\" para a Duración do Desvanecemento de Fiestra" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Fiestras que se deben desvanecer" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punto de Montaxe" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punto de montaxe" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de Ficheiros en Espazo de Usuario" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de ficheiros en espazo de usuario" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Configurador de GNoME (GConf)" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Xestor de Configuracións GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Soporte ao bucle principal de GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilidade con Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir unha terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Opcións para manter a compatibilidade de Compiz co entorno de escritorio " "Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Diálogo de Execución" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Executar comando de terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Capturar pantalla da liña de comando" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Amosar Menú Principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Amosar caixa de diálogo Executar Aplicativo" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Amosar o menú principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Facer unha capturar pantalla" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Facer captura de pantalla dunha xanela" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Liña de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Liña de comando para captura de pantalla de xanelas" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Xestor de configuracións simples con ficheiros Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Engadido de notificación de cambios en ficheiros" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Xestor de Configuracións Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efecto ao Minimizar" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar as Fiestras" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidade de minimizado" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Atraso no minimizado" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistencia da Sombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistencia que opón a sombra ao minimizar a súa xanela" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transforma as xanelas cando son minimizadas e restauradas" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Fiestras se deben transformar cando sexan minimizadas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restrinxir Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restrinxir a coordenada Y á area de traballo" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Non actualizar a posición das xanelas no servidor ata acabar o movemento" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar Movemento de Fiestras" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamento preguizoso" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover Fiestra" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Atallos de teclado e rato para o movemento máis sinxelo das xanelas" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidade" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivel de opacidade das xanelas en movemento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Separar e restaurar as xanelas maximizaas cando se arrastren" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Separar as xanelas maximizadas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Iniciar movemento da xanela" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brillo" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Decrementar Brillo" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Incrementar Brillo" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Salto no Brillo" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valores de Brillo para as xanelas" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Decrementar" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Incrementar" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Decrementar Opacidade" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Incrementar opacidade" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa de Opacidade" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valores de opacidade para as xanelas" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacidade, Brillo e Saturación" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Opacidade, Brillo e axustes de Saturación" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturación" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Decremenar Saturación" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Incrementar Saturación" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Salto na Saturación" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valores de saturación para as xanelas" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Salto" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Opcións especificas para as xanelas" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valores das xanelas" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Fiestras" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Fiestras que deben ter un brillo diferente por omisión" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Fiestras que deben ter unha opacidade diferente por omisión" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Fiestras que deben ter unha saturación diferente por omisión" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo a empregar para posicionar as xanelas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "En Cascada" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrado" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Colocación de Fiestras Fixadas" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forzar o colocado das xanelas" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posicións de áreas de traballo horizontais" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Manter na Área de Traballo" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Manter as xanelas colocadas na área de traballo, aínda que isto signifique " "que a posición poida diferir da posición especificada" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocación de Fiestras" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Colocar en tódalas saídas" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Coloca xanelas nas posicións axeitas cando sexan mapeadas" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de Colocación" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Fiestras Colocadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatorio" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecciona como se debe comportar a colocación de xanelas cando se " "seleccionan saídas múltiples" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelixente" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Empregar o dispositivo de saída activo" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Empregar o dispositivo de saída da xanela enfocada" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Empregar o dispositivo de saída co punteiro" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posicións dos puntos de vista verticais" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Fiestras colocadas nas áreas de traballo" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Entornos de colocación de xanela" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fiestras que se deben ser colocadas por omisión" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Fiestras que deben ser colocadas en áreas de traballo específicos por omisión" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Fiestras que se deben colocar obrigatoriamente, aínda que se indique no " "xestor de xanelas que se deben evitar a súa colocación" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Fiestras con posicións fixadas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Fiestras con áreas de traballo fixado" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Entornos" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posicións X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posicións X da Área de traballo" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores de posición X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posicións Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posicións Y da Área de Traballo" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores de posición Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Cargador de imaxes Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Coincidencia Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Coincidencia Regex das xanelas" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Atallos de teclado" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Cor do borde" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Cor do borde dos extremos e modos de dimesionado por rectángulos" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo de Dimensionado por Omisión" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo a empregar por omisión no dimensionado de xanelas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Cor de recheo" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Cor de recheo empregada para o modo de dimensionado por rectángulo" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar o Dimensionado Normal de Fiestra" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar o Dimensionado de Fiestras co Borde" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar o Dimensionado de Fiestras co Rectángulo" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar Dimensionado Por Estirado de Fiestras" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar Dimensión de Fiestras" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Dimensionado Normal de Fiestras" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contorno" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Dimensionado de Fiestras co Contorno" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectángulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Dimensionado de Fiestras co Rectángulo" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Dimensionar Fiestra" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Dimensionar xanela" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Iniciar dimensionado de xanela" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Iniciar dimensionado de xanelas estirándoas" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Iniciar dimensionado normal da xanela" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Iniciar dimensionado de xanela empregando o contorno" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Iniciar dimensionado da xanela empregando un rectángulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Estirado" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Dimensionar Fiestras Estirándoas" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Fiestras que deben empregar dimensionado normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Fiestras que deben empregar dimensionado co contorno" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Fiestras que deben empregar o dimensionado por rectángulo" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Fiestras que deben empregar dimensionamento por estiramento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Cambiar cando se Arrastra cara o Borde" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Xirar con Movemento cara o Borde" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Xirar cando estea o Punteiro no Borde" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Duración do Xiro" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Xirar á area de traballo da esquerda e manter punteiro" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Xirar á área de traballo seguinte ao arrastrar un obxecto cara o borde da " "pantalla" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Xirar á área de traballo seguinte ao mover o punteiro cara o borde da xanela" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Cambiar á área de traballo seguinte ao mover a xanela cara o borde da " "xanela" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Cambiar á área de traballo da dereita e manter punteiro" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverter eixo Y do movemento do punteiro" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inverter o eixo Y do Punteiro" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidade do Punteiro" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar ao accionar a roda do rato" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar xanelas ao accionar a roda do rato" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Cubo xiratorio" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Xirar á Esquerda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Xirar á Dereita" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Xirar á Esquerda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Xirar á Esquerda coa Fiestra" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Xirar á Dereita" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Xirar á Dereita arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Xirar a" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Xirar á Cara 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Xirar á Cara 1 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Xirar á Cara 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Xirar á Cara 10 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Xirar á Cara 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Xirar á Cara 11 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Xirar á Cara 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Xirar á Cara 12 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Xirar á Cara 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Xirar á Cara 2 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Xirar á Cara 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Xirar á Cara 3 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Xirar á Cara 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Xirar á Cara 4 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Xirar á Cara 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Xirar á Cara 5 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Xirar á Cara 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Xirar á Cara 6 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Xirar á Cara 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Xirar á Cara 7 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Xirar á Cara 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Xirar á Cara 8 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Xirar á Cara 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Xirar á Cara 9 arrastrando a Fiestra" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Xirar Cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Activa a rotación do cubo a través das áreas de traballo" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Xirar á esquerda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Xirar á esquerda e arrastrar a xanela activa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Xirar á dereita" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Xirar á dereita e arrastrar a xanela activa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Xirar á cara do cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Xirar á cara do cubo coa xanela" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Xirar á cara 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Xirar á cara 1 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Xirar á cara 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Xirar á cara 10 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Xirar á cara 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Xirar á cara 11 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Xirar á cara 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Xirar á cara 12 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Xirar á cara 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Xirar á cara 2 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Xirar á cara 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Xirar á cara 3 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Xirar á cara 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Xirar á cara 4 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Xirar á cara 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Xirar á cara 5 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Xirar á cara 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Xirar á cara 6 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Xirar á cara 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Xirar á cara 7 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Xirar á cara 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Xirar á cara 8 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Xirar á cara 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Xirar á cara 9 e arrastrar tamén a xanela activa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Xirar á área de traballo" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Xirar xanela" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Xirar coa xanela" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleración da Rotación" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidade de Rotación" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Saltos de Tempo da Rotación" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom da rotación" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidade do movemento do punteiro" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Xirar o Cubo á Cara Inferior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Xirar o Cubo á Cara Superior" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Xirar á Cara Inferior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Xirar á Cara Superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar Rotación" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo de espera antes de rodar a área de traballo" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Nivel de Opacidade en porcentaxe" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Atallos para Trocar o Modo de Escala" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Atallos de teclado para trocar o modo escala no canto de activalos cando son " "pulsados e desactivados cando se solta." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Facer Clic no Escritorio para Amosalo" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Escurecer Fondo" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Escurecer fondo ao escalar xanelas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrar no modo Amosar Escritorio cando se faga clic no Escritorio durante o " "Escalado" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tempo durante o cal se deixa o rato enriba" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar Selector de Fiestras" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar selector de xanelas Para Tódalas Fiestras" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar Selector de Fiestras para Grupos de Fiestras" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar Selector de Fiestras para Tódalas Fiestras na Saída Actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Atallos de teclado para Trocar o Modo Escala" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Os atallos de teclado trocan o modo de escala no canto de activalo cando é " "pulsado e desactivado cando é soltado." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Dispor todas as xanelas e iniciar súa transformación" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Dispor o grupo de xanelas e iniciar súa transformación" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Dispor as xanelas e iniciar súa transformación" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Dispor as xanelas na saída actual e iniciar a súa transformación" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "En tódolos dispositivos de saída" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Só no dispositivo de saída actual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Icona Superposta" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Superpor un icona nas xanelas cando sexan escaladas" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Escalado" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Escalado de Fiestras" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidade de Escalado" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Saltos na Escala" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Escala de Fiestras" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Selecciona cando son escaladasa xanelas se se empregan múltiples " "dispositivos de saída." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espazo entre xanelas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaciado" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (en ms) antes de que o modo de escalado se remate ao pasar sobre unha " "xanela" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Fiestras que deben ser escaladas en modo escala" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Abrir automaticamente a captura de pantalla con esta aplicación" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Cartafol" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Iniciar Rectángulo de Captura de Pantalla " #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Lanzar Aplicación" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Colocar capturas de pantalla neste directorio" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captura de pantalla" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Complemento para a Captura de Pantalla" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Complemento que activa o soporte para o cargado de imaxes SVG" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Cantidade de brillo en porcentaxe" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Cantidade de saturación en porcentaxe" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Trocador de Aplicación" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Xirar Automaticamente" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Traer ao Frente" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Coloca a xanela seleccionada en primeiro plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Afastar o escritorio mentres se cambian as xanelas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizado" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Seguinte Panel" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Seguinte xanela" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Seguinte Fiestra (Todas as xanelas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Seguinte Fiestra (Sen xanela sobresaínte)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Amosar trocador se non está visíbel e seleccionar seguinte xanela" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Amosar trocador se non está visíbel e seleccionar a seguinte xanela de " "tódalas xanelas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Amosar trocador se non está visíbel e seleccionar a xanela anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Amosar trocador se non está visíbel e seleccionar a xanela anterior de todas" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Ant. Panel" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Ant. xanela" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Fiestra anterior (Todas as xanelas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Fiestra anterior (Sen xanela sobresaínte)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Xirar á xanela seleccionada mentres se cambia" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Seleccionar seguinte xanela de tipo panel." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Seleccionar seguinte xanela sen amosar a xanela sobresaínte" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Seleccionar anterior xanela de tipo panel." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Seleccionar xanela anterior sen amosar a xanela sobresaínte." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Amosar icona ao lado da miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Amosar xanelas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidade do Cambiador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Salto do Cambiador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Cambiador de xanelas" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Fiestras que deben ser amosadas no cambiador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Se está activado proporciona soporte de espazo de cor YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reproducción de Vídeo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" "Aplica algúns cambios no Compiz para dar soporte á reproducción de vídeo sen " "problemas colaterais." #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espazo de cor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Engadir liña" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Engadir punto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Engade efectos de auga a diferentes accións do escritorio" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Atraso (en ms) entre cada gota de chuvia" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activar efectos de auga co punteiro" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Liña" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Desprazamento da Escala" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Atraso da chuvia" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Onda dende o título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Trocar chuvia" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Trocar efecto de chuvia" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Trocar limpiaparabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Troca o efecto de limpiaparabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efecto de Auga" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Espaciado entre as ondas de auga" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efecto de onda dende o título da xanela" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efecto de Enfoque" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efecto de Enfoque da Fiestra" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Enfocar Fiestras" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricción" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Atracción das xanelas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolución da Grella" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Axuste de xanelas invertido" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Fai que as xanelas semellen xelatina" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efecto ao colocar" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efecto da Fiestra ao Colocala" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Colocar Fiestras" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efecto ao Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamaño Mínimo da Grella" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamaño Mínimo da Grella Vertex" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Fiestras" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Temblar" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Instantánea invertida" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Axustar xanelas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricción do mola" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K do mola" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante do mola" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Trocar axuste de xanelas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Empregar modelo de mola para simular o efecto xelatinoso nas xanelas" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolución da Grella Vertex" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Fiestras que deben semellar xelatina cando son enfocadas" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Fiestras que deben semellar xelatina cando son agarradas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Fiestras que deben semellar xelatina cando son colocadas" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Fiestras que deben semellar xelatina cando son movidas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Activar o efecto semellante á xelatina cando se maximizan ou minimizan as xanelas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Fiestras xelatinosas" #~ msgid "Command line 0" #~ msgstr "Liña de comando 0" #~ msgid "Run command 0" #~ msgstr "Executar comando 0" #~ msgid "Screenshot commands" #~ msgstr "Comandos de Captura de pantalla" #~ msgid "Screenshot key bindings" #~ msgstr "Atallos de teclado para facer captura de pantalla" #~ msgid "Filter Linear" #~ msgstr "Filtro lineal" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Empregar o filtro lineal cando se fai zoom" #~ msgid "Zoom Desktop" #~ msgstr "Zoom do escritorio" #~ msgid "Zoom In" #~ msgstr "Acercar" #~ msgid "Zoom Out" #~ msgstr "Afastar" #~ msgid "Zoom Pan" #~ msgstr "Colocación do Zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocidade de Zoom" #~ msgid "Zoom Timestep" #~ msgstr "Salto de tempo do Zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Afastar e mover cubo do escritorio" #~ msgid "Zoom factor" #~ msgstr "Factor de zoom" #~ msgid "Zoom pan" #~ msgstr "Colocación do Zoom" #~ msgid "Decrease window opacity" #~ msgstr "Reducir opacidade da xanela" #~ msgid "Increase window opacity" #~ msgstr "Aumentar opacidade da xanela" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidade para xanelas que deben ser translúcidas por omisión" #~ msgid "Opacity windows" #~ msgstr "Opacidade de xanelas" #~ msgid "Background Images" #~ msgstr "Imaxes de fondo" #~ msgid "Background images" #~ msgstr "Imaxes de fondo" #~ msgid "Place windows on a plane" #~ msgstr "Colocar xanelas nun plano" #~ msgid "Plane Down" #~ msgstr "Plano Abaixo" #~ msgid "Plane Left" #~ msgstr "Plano á esquerda" #~ msgid "Plane Right" #~ msgstr "Plano á dereita" #~ msgid "Plane To Face 1" #~ msgstr "Plano á Cara 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano á Cara 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano á Cara 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano á Cara 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano á Cara 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano á Cara 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano á Cara 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano á Cara 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano á Cara 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano á Cara 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano á Cara 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano á Cara 9" #~ msgid "Plane Up" #~ msgstr "Plano acima" #~ msgid "Plane down" #~ msgstr "Plano abaixo" #~ msgid "Plane left" #~ msgstr "Plano á esquerda" #~ msgid "Plane right" #~ msgstr "Plano á dereita" #~ msgid "Plane to face 1" #~ msgstr "Plano á cara 1" #~ msgid "Plane to face 10" #~ msgstr "Plano á cara 10" #~ msgid "Plane to face 11" #~ msgstr "Plano á cara 11" #~ msgid "Plane to face 12" #~ msgstr "Plano á cara 12" #~ msgid "Plane to face 2" #~ msgstr "Plano á cara 2" #~ msgid "Plane to face 3" #~ msgstr "Plano á cara 3" #~ msgid "Plane to face 4" #~ msgstr "Plano á cara 4" #~ msgid "Plane to face 5" #~ msgstr "Plano á cara 5" #~ msgid "Plane to face 6" #~ msgstr "Plano á cara 6" #~ msgid "Plane to face 7" #~ msgstr "Plano á cara 7" #~ msgid "Plane to face 8" #~ msgstr "Plano á cara 8" #~ msgid "Plane to face 9" #~ msgstr "Plano á cara 9" #~ msgid "Plane up" #~ msgstr "Plano á cima" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Tempo de desvanecemento da opacidade do escritorio" ./po/sv.po0000644000004100000410000025143613246301623012664 0ustar www-datawww-data# Swedish translation of compiz. # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the compiz package. # Daniel Nylander , 2006, 2007. # Sebastian Parborg , 2007 # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-02-18 19:36+0100\n" "Last-Translator: Sebastian Parborg \n" "Language-Team: Compiz Fusion Translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Skrivbord" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Fönsterhantering" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ingen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skala" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximera" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximera fönster horisontellt" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximera fönster vertikalt" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimerat" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatisk höjning" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Fönstermeny" # fuzzy #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Åtgärd när man rullar med mushjulet på en fönstertitel." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Suddighets typ" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Metacitys aktiva tema opacitet" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Metacitys aktiva tema opacitets skugga" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity tema opacitet" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity tema opacitet skugga" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacitet på aktiva fönster med metacity tema dekorationer" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacitet på metacity tema dekorationer" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Skugga aktiva fönster med metacity tema dekorationer från opact " "tillgenomskinlig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Skugga fönster med metacity tema dekorationer från opact till genomskinlig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 #, fuzzy msgid "Title bar mouse wheel action" msgstr "Fönstertitel mushjul åtgärd" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ av suddighet att använda för fönster dekorationer" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Använd metacity tema" # De syftar nog på fönsterramarna. #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Använd metacity tema vid ritande av fönsterramar" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Stäng fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Avmaximera fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximera fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimera fönster" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anteckning" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Antecknings fyllfärg" #: ../metadata/annotate.xml.in.h:3 #, fuzzy msgid "Annotate Stroke Color" msgstr "Antecknings streckfärg" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Insticksmodul för anteckningar" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Töm" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Rita" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Rita med verktyg" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Fyllnings färg för anteckningar" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Initiera" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Initiera antecknings ritande" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Initiera radering av anteckning" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Initiera radering" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Radbredd" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linje bredd för anteckningar" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Streck färg för anteckningar" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Streck storlek" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Streck storlek för anteckningar" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinjär" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Alfa oskärpa" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Alfa oskärpa fönster" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Suddighetsfilter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Suddighetsocclusion" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Suddighetsfärgmättnad" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Suddighetshastighet" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Sudda ut fönster" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Sudda ut bakom genomskinliga delar av fönster" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Suddighetsfärgmättnad" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Sudda ut fönster" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Sudda ut fönster som inte har fokus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Akaktivera suddighet på skärmregioner täckta av andra fönster" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filter metod använd för suddighet" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokus suddighet" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Fokusera suddiga fönster" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Gaussian" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Gaussian radie" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Gaussian strycka" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Gaussian radie" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Gaussian stryka" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap detalj-nivå" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulseffekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Fönster studdnings-hastighet" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fönster som ska bli påverkade av fokus-suddighet" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Fönster som ska använda alfa-suddighet som standard" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klona utmatning" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Initiera klon selektion" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Utmatnings klonhanterare" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tangentgenväg som när anropas kommer att köra skalkommandot identifierat " "som kommando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Kommandorad 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Kommandorad 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Kommandorad 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Kommandorad 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Kommandorad 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Kommandorad 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Kommandorad 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Kommandorad 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Kommandorad 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Kommandorad 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Kommandorad 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Kommandorad 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command0 anropas" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command1 anropas" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command10 anropas" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command11 anropas" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command2 anropas" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command3 anropas" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command4 anropas" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command5 anropas" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command6 anropas" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command7 anropas" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command8 anropas" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Kommandorad som ska köras i ett skal när run_command9 anropas" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Kör kommando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Kör kommando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Kör kommando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Kör kommando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Kör kommando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Kör kommando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Kör kommando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Kör kommando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Kör kommando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Kör kommando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Kör kommando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Kör kommando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktiva insticksmoduler" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Tillåt att inte utritning av helskärmsfönster omdirigeras till bilder " "utanför skärmen" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Ljudklocka" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Systemljudklocka" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisk höjning" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Fördröjning för automatisk höjning" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatisk identifiering av outputenheter" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatisk identifiering av uppdateringsfrekvens" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Bästa" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klicka för fokus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Klicka på fönstret flyttar inmatningsfokus till det" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Stäng aktivt fönster" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standardikonbild för fönster" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Skrivbordskub" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detektera outputs" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detektera uppdateringsfrekvens" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Snabb" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Förhindra fokus" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Förhindra fokus" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Förhindra fokus" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Allmänna alternativ" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generella compiz inställningar" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bra" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Dölj fönster inte i verktygsrad" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Dölj alla fönster och fokusera på skrivbord" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "Dölj fönster som inte är i verktygsraden vid visa skrivbordsläget" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuell horisontell storlek" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorera tips medans maximerad" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorera storleksökning och aspekthintning när fönster maximeras" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervall innan markerade fönster höjs" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervall mellan ping-meddelanden" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Ljussättning" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista över för närvarande aktiva insticksmoduler" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista över strängar som beskriver utmatningsenheter" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Sänk fönster" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Sänk fönstret under andra fönster" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximera fönster horisontellt" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximera fönster vertikalt" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximera aktivt fönster" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximera aktivt fönster horisontellt" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximera aktivt fönster vertikalt" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimera aktivt fönster" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Antal skrivbord" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Antal virtuella skrivbord" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 #, fuzzy msgid "Only perform screen updates during vertical blanking period" msgstr "Uför endast skärmuppdateringar under den vertikala blanknings perioden" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Utmatningar" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Fördröjning för ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Höj vid klick" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Höj fönster" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Höj markerade fönster efter intervall" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Höj fönstret över andra fönster" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Höj fönster när de klickas på" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Uppdateringsfrekvens" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "Skärmstorleksfaktor för virtuell horisontell storlek" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Skärmstorleksfaktor för virtuell vertikal storlek" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Visa skrivbordet" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Långsamma animeringar" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Smart" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkronisera till VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Texturfiltrering" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Texturfilter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Texturfiltrering" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Frekvensen för updatering av skärmen (gånger/sekund)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Växla fönstermaximering" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Växla fönstermaximering horisontellt" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Växla fönstermaximering vertikalt" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Växla fönsterskuggning" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Växla maximering av aktivt fönster" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Växla horisontell maximering av aktivt fönster" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Växla vertikal maximering av aktivt fönster" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Växla skuggning av aktivt fönster" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Växla användning av långsamma animeringar" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Avmaximera aktivt fönster" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Omdirigera tillbaka helskärmsfönster" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Använd diffus belysning när skärmen transformeras" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikal virtuell storlek" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 #, fuzzy msgid "Window menu button binding" msgstr "Fönstermenyns knappbindning" #: ../metadata/core.xml.in.in.h:102 #, fuzzy msgid "Window menu key binding" msgstr "Fönstermenyns tangentbindning" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accelerering" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Justera bild" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Justera bilden på den övre ytan till rotation" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Fortsätt till nästa bild" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animera Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animera skydome när kub roterar" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisk" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Färg på över- och undersidorna av kuben" #: ../metadata/cube.xml.in.h:11 #, fuzzy msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Färg som används till bottenfärg-stoppet av skydome-tillbakagångs-gradient" #: ../metadata/cube.xml.in.h:12 #, fuzzy msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Färg som används till toppenfärg-stoppet av skydome-tillbakagångs-gradient" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubfärg" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubfärg" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Skrivbordskub" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Vikningsaccelerering" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Vikningshastighet" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Tidsintervall för vikning" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Generera mipmappar när det är möjligt för skalning av högre kvalitet" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Gå tillbaka till föregående diabild" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Bildfiler" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Bild att använda som textur för skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Aktiverar kub genomskinlighet endast om rotationen sker med musen" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "I kuben" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "I kuben" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista över PNG- och SVG-filer som ska ritas ut på översta ytan av kuben" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Läge för multipla utmatningar" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Flera kuber" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Nästa diabild" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "På stora kuben" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacitet under rotation" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacitet när kuben inte roterar" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacitet av skrivbordsfönster under rotation" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacitet av skrivbordsfönster när kuben inte roterar" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Placera fönster på kuben" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Föregående diabild" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Rita ut skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skala bild" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skala bilder för att täcka övre ytan på kuben" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Väljer hur kuben visar om flera output enheter används" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 #, fuzzy msgid "Skydome Gradient End Color" msgstr "Skydome gradient slut färg" #: ../metadata/cube.xml.in.h:44 #, fuzzy msgid "Skydome Gradient Start Color" msgstr "Skydome gradient start färg" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome bild" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hastighet" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tidsintervall" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Genomskinlighet endast via musrotation" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Vik ut" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Vik ut kub" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 #, fuzzy msgid "Dbus Control Backend" msgstr "Dbus kontrollbackend" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Tillåt mipmaps att bli genererade för dekorationstexturer" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorationsfönster" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Dekorerarkommado som körs om inte någon dekorerare redan körs" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Skuggkastning X-position" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Skuggkastning Y-position" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Färg för skuggkastning" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opakhet för skuggkastning" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radie för skuggkastning" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Skuggfärg" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Skuggposition X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Skuggposition Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Skuggopakhet" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Skuggradie" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Skuggfönster" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Fönsterram" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Fönsterramar" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Fönster som ska dekoreras" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Fönster som ska ha en skugga" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotationshastighet" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Begränsa Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Ändra fönstrets storlek normalt" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Toningstid" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Tona vid minimering/öppna/stäng" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Toningshastighet" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Toningstid" #: ../metadata/fade.xml.in.h:11 #, fuzzy msgid "Fade effect on minimize/open/close window events" msgstr "Toningeffekt på minimera/öppna/stänga fönster tillfällen" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Toningseffekt vid systemsignal" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Tona in fönster när de kopplas och tona ut fönster när de kopplas loss" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Tona fönster" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Tonande fönster" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuell helskärmssignal" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Helskärmstoningseffekt vid systemsignal" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuell signal" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Fönstertoningshastighet" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Fönster som ska skalas i skalningsläget" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Fönster som ska tonas" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:3 #, fuzzy msgid "Userspace File System" msgstr "Användarutrymmes filsystem" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Användarutrymmes filsystem" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 #, fuzzy msgid "GConf Control Backend" msgstr "GConf kontrollbackend" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 #, fuzzy msgid "GLib main loop support" msgstr "GLib huvudloop stöd" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Öppna en terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Kördialog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandorad för terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandorad för skärmbild" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Visa huvudmeny" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Visa dialogen Kör program" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Visa huvudmenyn" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ta en skärmbild" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Ta en skärmbild av ett fönster" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Kommandorad för terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandorad för fönsterskärmbild" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 #, fuzzy msgid "Ini Flat File Backend" msgstr "Ini platt fil backend" #: ../metadata/inotify.xml.in.h:1 #, fuzzy msgid "File change notification plugin" msgstr "Filändringsnotifiering insticksmodul" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 #, fuzzy msgid "Kconfig Control Backend" msgstr "Kconfig kontrollbackend" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimeringseffekt" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimera fönster" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimeringshastighet" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Tidsintervall för minimering" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Skuggmotstånd" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Skuggmotstånd" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformera fönster när de minimeras och avminimeras" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Fönster som ska bli transformerade när de blir minimerade" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Begränsa Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Begränsa Y-koordinat till arbetsyta" #: ../metadata/move.xml.in.h:3 #, fuzzy msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Uppdatera inte positonen på fönsterna till servern förrän de har slutat röra " "sig" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Initiera fönsterflyttning" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Lat postionering" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Flytta fönster" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Flytta fönster" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacitet" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Opacitetnivå för flyttande fönster" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Koppla loss och automatiskt avmaximera maximerade fönster när de dras" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Koppla loss maximerade fönster" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Börja flytta fönster" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Ljusstyrka" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Minska opacitet" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Öka opacitet" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Ändringsintervall för opacitet" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Ändringsintervall för opacitet" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Intervall för opacitet" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Opacitetnivå för flyttande fönster" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opacitet under rotation" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Färgmättnad" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Fönsterramar" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Opacitet fönster värden" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Koppla fönster" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Fönster som ska bli positionerade som standard" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Fönster som ska vara genomskinliga som standard" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Fönster som ska bli positionerade som standard" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritm att använda för fönsterplacering" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskad" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrerad" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Fönsterhantering" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Förhindra fokus" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horisontella skivbordsvypositioner" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Placera fönster" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Placera fönster på lämpliga positioner när de kopplas" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Placeringsläge" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Positionerade fönster" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Slumpmässigt" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Väljer var fönster blir skalade om flera outputenheter används" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Smart" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "På alla utmatningsenheter" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Vertikalarbetsytas positioner" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Arbetsyta positionerade fönster" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Problemlösning för fönsterplacering" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Fönster som ska bli positionerade som standard" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Fönster som ska bli positionerade i en specifik arbetsyta som standard" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Fönsterramar" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Problemlösningar" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-positioner" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "X arbetsyta positioner" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X-positionsvärden" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-positioner" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Y arbetsyta positioner" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y-positionsvärden" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png-bildläsare" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Reguljär uttrycksmatchning" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Växla fönsterfästning" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Ramfärg" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Ramfärg använd för kontur och rektangel fönsterstorleksändringsläge" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standard storlekändringsläge" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Standard läged använt för fönster storleksändring" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Fyllnadsfärg" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Fyllningsfärg för rektangeln i justeringsläge" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Initiera normal fönsterskalning" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Initiera kontur fönsterskalning" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Initiera rektangel fönsterskalning" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Initiera töjnings fönsterskalning" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Initiera fönsterskalning" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Ändra fönstrets storlek normalt" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Kontur" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Kontur justera fönster" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rektangel" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Ändra fönstrets storlek rektangulärt" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Skala fönster" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Skala fönster" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Börja skala fönster" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Börja storleksändra fönstret genom att sträcka det" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Börja storleksändra fönstret normalt" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Börja storleksändra fönstret med kontur" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Börja storleksändra fönstret rektangulärt" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Töj" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Töj ut fönstrets storlek" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Fönster som normal storleksändring ska användas för" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Fönster som storleksändring med kontur ska användas för" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Fönster som rektangulär storleksändring ska användas för" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Fönster som storleksändring med sträckning ska användas för" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Kantvänd DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Kantvänd flyttning" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Kantvänd pekare" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Vändtid" #: ../metadata/rotate.xml.in.h:7 #, fuzzy msgid "Flip to left viewport and warp pointer" msgstr "Vänd till nästa skrivbordsvy när muspekaren flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Vänd till nästa skrivbordsvy när objekt dras till skärmens kant" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Vänd till nästa skrivbordsvy när muspekaren flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Vänd till nästa skrivbordsvy när fönster flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:11 #, fuzzy msgid "Flip to right viewport and warp pointer" msgstr "Vänd till nästa skrivbordsvy när muspekaren flyttas till skärmens kant" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Invertera Y-axeln för pekarens rörelser" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertera pekarens Y-axel" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Muspekarkänslighet" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Höj upp vid rotation" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Höj upp fönster under rotation" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Rotera kub" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Flipprotera åt vänster" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Flipprotera åt höger" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Rotera åt vänster" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Rotera åt vänster med fönster" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Rotera åt höger" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Rotera åt höger med fönster" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Rotera till" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Rotera till yta 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rotera till yta 1 med fönster" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Rotera till yta 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Rotera till yta 10 med fönster" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Rotera till yta 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Rotera till yta 11 med fönster" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Rotera till yta 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Rotera till yta 12 med fönster" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Rotera till yta 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Rotera till yta 2 med fönster" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Rotera till yta 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Rotera till yta 3 med fönster" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Rotera till yta 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Rotera till yta 4 med fönster" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Rotera till yta 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Rotera till yta 5 med fönster" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Rotera till yta 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Rotera till yta 6 med fönster" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Rotera till yta 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Rotera till yta 7 med fönster" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Rotera till yta 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Rotera till yta 8 med fönster" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Rotera till yta 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Rotera till yta 9 med fönster" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Rotera kub" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Rotera skrivbordskub" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Rotera åt vänster" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Rotera åt vänster och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Rotera åt höger" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rotera åt höger och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Rotera till yta 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Rotera till yta 1 med fönster" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Rotera till yta 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Rotera till yta 1 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Rotera till yta 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Rotera till yta 10 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Rotera till yta 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Rotera till yta 11 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Rotera till yta 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Rotera till yta 12 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Rotera till yta 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Rotera till yta 2 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Rotera till yta 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Rotera till yta 3 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Rotera till yta 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Rotera till yta 4 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Rotera till yta 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Rotera till yta 5 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Rotera till yta 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Rotera till yta 6 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Rotera till yta 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Rotera till yta 7 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Rotera till yta 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Rotera till yta 8 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Rotera till yta 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Rotera till yta 9 och ta med aktivt fönster" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rotera till skrivbordsvy" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Rotera fönster" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Rotera med fönster" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Rotationsacceleration" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotationshastighet" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Tidsintervall för rotation" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rotationszoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Känslighet för flyttning av muspekare" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Fäst kubroteringen till undersidan" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fäst kubroteringen till översidan" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Fäst till undersidan" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fäst till översidan" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Starta rotering" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tidsgräns innan vändning av skrivbordsvy" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Mängden opacitet i procent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Stor" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klicka på Skrivbord för att visa skrivbordet" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Mörka bakgrunden" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Mörka bakgrunden vid fönsterskalning" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblem" #: ../metadata/scale.xml.in.h:12 #, fuzzy msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Gå till \"Visa skrivbords läge\" när skrivbordet blir klickat på under " "skalning" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Pekartid" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Initiera fönsterväljare" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Initiera fönsterväljare för alla fönster" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Initiera fönsterväljare för fönstergrupp" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "Initiera fönsterväljare för fönster på nuvarande output" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Lägg ut och börja omforma alla fönster" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Lägg ut och börja omforma fönstergrupp" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Lägg ut och börja omforma fönster" #: ../metadata/scale.xml.in.h:23 #, fuzzy msgid "Layout and start transforming windows on current output" msgstr "Lägg ut och börja omforma fönster på nuvarande output" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "På alla utmatningsenheter" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "På aktuell utmatningsenhet" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Lägg ikoner över" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Lägg en ikon över fönster när de är skalade" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skala" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Skala fönster" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skalningshastighet" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Tidsintervall för skalning" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Skala fönster" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Väljer var fönster blir skalade om flera outputenheter används" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mellanrum mellan fönster" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mellanrum" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "Tid (i ms) innan skalningsläget avslutas när man pekar på ett fönster" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Fönster som ska skalas i skalningsläget" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Öppna automatiskt skärmbilder i detta program" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Katalog" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ta en rektangulär skärmbild" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Kör program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Lägg skärmbilder i den här katalogen" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Skärmbild" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Insticksmodul för skärmbild" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg-bildläsare" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Ljusstyrka i procent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Färgmättnad i procent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Programväxlare" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatisk rotering" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Lägg överst" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Lägg markerat fönster överst" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Avstånd som skrivbordet ska zoomas ut till vid växling av fönster" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimerat" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Skrivbordsplan" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Nästa fönster" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Nästa fönster (Alla fönster)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Nästa fönster (Ingen popup)" #: ../metadata/switcher.xml.in.h:20 #, fuzzy msgid "Popup switcher if not visible and select next window" msgstr "Poppa upp fönsterväxlare om den inte är synlig och välj nästa fönster" #: ../metadata/switcher.xml.in.h:21 #, fuzzy msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Poppa upp fönsterväxlare om den inte är synlig och välj nästa fönster utav " "alla fönster" #: ../metadata/switcher.xml.in.h:22 #, fuzzy msgid "Popup switcher if not visible and select previous window" msgstr "" "Poppa upp fönsterväxlare om den inte är synlig och välj föregående fönster" #: ../metadata/switcher.xml.in.h:23 #, fuzzy msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Poppa upp fönsterväxlare om den inte är synlig och välj föregående " "fönsterutav alla fönster" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Föregående diabild" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Föreg fönster" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Föreg fönster (Alla fönster)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Föreg fönster (Ingen popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rotera till det valda fönstret under växling" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Välj nästa fönster utan att visa popupfönstret" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Välj föregående fönster utan att visa popupfönstret" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Välj föregående fönster utan att visa popupfönstret" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Visa ikon bredvid miniatyrbild" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Visa minimerade fönster" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Växlingshastighet" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Tidsintervall för växlare" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Växelfönster" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Fönster som ska bli visade i växlaren" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Tillhandahåll \"YV12 colorspace\"-stöd" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videouppspelning" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Videouppspelning" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 colorspace" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Lägg till rad" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Lägg till punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Lägger till vatteneffekter till olika skrivbordsåtgärder" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Fördröjning (i ms) mellan varje regndroppe" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Aktivera vatteneffekt för muspekare" # Rad eller linje? En bra fråga... #: ../metadata/water.xml.in.h:7 #, fuzzy msgid "Line" msgstr "Rad" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Positionsskala" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regnfördröjning" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titelvåg" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Växla regn" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Växla regneffekt" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Växla vindrutetorkare" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Växla torkareffekt" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vatteneffekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Vattenkompensationsskala" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Vågeffekt från fönstrets titellist" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fokuseffekt" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Fokuseffekt för fönster" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Fokusera fönster" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friktion" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Fånga fönster" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rutnätsupplösning" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Inverterad fönsterfästning" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Skaka fönster" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Kopplingseffekt" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Kopplingseffekt för fönster" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Koppla fönster" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximeringseffekt" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Maximal rutnätsstorlek" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimal vertexrutnätsstorlek" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Flytta fönster" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Skaka" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Invertera fästning" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Fäst fönster" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fjäderfriktion" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Fjäder K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Fjäderkonstant" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Växla fönsterfästning" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Använd fjädereffekt för fönstergeléeffekt" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Upplösning för vertexrutnät" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Fönster som ska dallra när de fokuseras" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Fönster som ska dallra när de fångas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Fönster som ska dallra när de binds" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Fönster som ska dallra när de flyttas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Geléeffekt vid maximering och avmaximering av fönster" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Geléaktiga fönster" #~ msgid "Command line 0" #~ msgstr "Kommandorad 0" #~ msgid "Run command 0" #~ msgstr "Kör kommando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandorad för skärmbild" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandorad för skärmbild" #~ msgid "Filter Linear" #~ msgstr "Filtrera linjärt" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Använd linjärt filter när inzoomad" #~ msgid "Zoom Desktop" #~ msgstr "Zooma skrivbord" #~ msgid "Zoom In" #~ msgstr "Zooma in" #~ msgid "Zoom Out" #~ msgstr "Zooma ut" #~ msgid "Zoom Pan" #~ msgstr "Zooma panorering" #~ msgid "Zoom Speed" #~ msgstr "Zoomhastighet" #~ msgid "Zoom Timestep" #~ msgstr "Tidsintervall för zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zooma och panorera skrivbordskub" #~ msgid "Zoom factor" #~ msgstr "Zoomfaktor" #~ msgid "Zoom pan" #~ msgstr "Zooma panorering" #~ msgid "Decrease window opacity" #~ msgstr "Minska fönstret opacitet" #~ msgid "Increase window opacity" #~ msgstr "Öka fönsteropacitet" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Opacitet värden för fönster som ska vara genomskinliga som standard" #~ msgid "Opacity windows" #~ msgstr "Opacitet fönster" #~ msgid "Background Images" #~ msgstr "Bakgrundsbilder" #~ msgid "Background images" #~ msgstr "Bakgrundsbilder" #~ msgid "Place windows on a plane" #~ msgstr "Placera fönster på ett plan" #~ msgid "Plane Down" #~ msgstr "Plana nedåt" #~ msgid "Plane Left" #~ msgstr "Plana åt vänster" #~ msgid "Plane Right" #~ msgstr "Plana åt höger" #~ msgid "Plane To Face 1" #~ msgstr "Plana till yta 1" #~ msgid "Plane To Face 10" #~ msgstr "Plana till yta 10" #~ msgid "Plane To Face 11" #~ msgstr "Plana till yta 11" #~ msgid "Plane To Face 12" #~ msgstr "Plana till yta 12" #~ msgid "Plane To Face 2" #~ msgstr "Plana till yta 2" #~ msgid "Plane To Face 3" #~ msgstr "Plana till yta 3" #~ msgid "Plane To Face 4" #~ msgstr "Plana till yta 4" #~ msgid "Plane To Face 5" #~ msgstr "Plana till yta 5" #~ msgid "Plane To Face 6" #~ msgstr "Plana till yta 6" #~ msgid "Plane To Face 7" #~ msgstr "Plana till yta 7" #~ msgid "Plane To Face 8" #~ msgstr "Plana till yta 8" #~ msgid "Plane To Face 9" #~ msgstr "Plana till yta 9" #~ msgid "Plane Up" #~ msgstr "Plana uppåt" #~ msgid "Plane down" #~ msgstr "Plana nedåt" #~ msgid "Plane left" #~ msgstr "Plana åt vänster" #~ msgid "Plane right" #~ msgstr "Plana åt höger" #~ msgid "Plane to face 1" #~ msgstr "Plana till yta 1" #~ msgid "Plane to face 10" #~ msgstr "Plana till yta 10" #~ msgid "Plane to face 11" #~ msgstr "Plana till yta 11" #~ msgid "Plane to face 12" #~ msgstr "Plana till yta 12" #~ msgid "Plane to face 2" #~ msgstr "Plana till yta 2" #~ msgid "Plane to face 3" #~ msgstr "Plana till yta 3" #~ msgid "Plane to face 4" #~ msgstr "Plana till yta 4" #~ msgid "Plane to face 5" #~ msgstr "Plana till yta 5" #~ msgid "Plane to face 6" #~ msgstr "Plana till yta 6" #~ msgid "Plane to face 7" #~ msgstr "Plana till yta 7" #~ msgid "Plane to face 8" #~ msgstr "Plana till yta 8" #~ msgid "Plane to face 9" #~ msgstr "Plana till yta 9" #~ msgid "Plane up" #~ msgstr "Plana uppåt" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Skrivbordsfönster opacitet toningstid" ./po/pt.po0000644000004100000410000026051013246301623012650 0ustar www-datawww-data# Compiz Core Portuguese Translation. # Copyright (C) 2007 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Novell Language , 2006,2007. # Joel Calado , 2007. # Nicolau Gonçalves , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-04-07 09:33+0200\n" "Last-Translator: Nicolau Gonçalves \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Ambiente de trabalho" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestão de Janelas" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nenhum" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Encolher" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizar" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximizar Horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximizar Verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizar" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Elevar" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Baixar" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu da Janela" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Acção a tomar quando se move a roda do rato no título de uma janela." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de desfocagem" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidade da janela activa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidade da sombra da janela activa no tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidade do tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidade da sombra do tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacidade a usar para janelas activas com decorações metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidade a usar para decorações do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Sombrear decoração de janelas activas com temas metacity de opaco para " "transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombrear decoração de janelas com temas metacity de opaco para transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acção da roda do rato no título da janela" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de desfocagem usado para as decorações" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usar tema do metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usar tema do metacity ao desenhar as decorações das janelas" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fechar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Colocar no Topo" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Stick" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Desencolher" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Retirar do Topo" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Unstick" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A janela \"%s\" não está a responder." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forçar a aplicação a terminar causará perda de alterações não guardadas." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forçar saída" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotar" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Cor de preenchimento das anotações" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Cor do pincel das anotações" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Plugin de anotações" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Desenhar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Desenhar usando uma ferramenta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Cor de preenchimento para anotações" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar desenho de anotação" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar apagador de anotação" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar apagador" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Esperssura da linha" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Espessura da linha para anotações" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Cor do pincel para anotações" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Largura do pincel" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Largura do pincel para anotações" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desfocagem Alpha" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alpha-desfocar janelas" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desfocagem" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusão da desfocagem" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidade de desfocagem" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desfocar por trás de partes transparentes de janelas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desfocar janelas que não tenham foco" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desactivar desfocagem de regiões de ecrã obscurecidas por outras janelas." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtragem usado para desfocar" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desfocar com base no foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desfocar janelas com base na janela actual" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" # name for RUS #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Força gaussiana" # name for RUS #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Força gaussiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Obtenção de texturas independentes" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nível de detalhe mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efeito de pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Usar as unidades de textura disponíveis para obter o maior número possível " "de texturas independentes." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidade de desfocagem das janelas" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Janelas que devem ser afectadas por desfocagem de foco" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Janelas que devem usar alfa-desfocagem por omissão" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonar saída" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar selecção de clone" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Gestor de clonagem de saídas" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Um atalho de teclado que, quando accionado, executa o comando shell " "identificado pelo comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Um atalho de teclado que, quando acionado, executa o comando shell " "identificado pelo comando9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Um atalho de margem de ecrã que, quando accionado, executa o comando shell " "identificado pelo comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Atribuir atalhos a comandos arbitrários" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Atalhos" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linha de comando 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linha de comando 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linha de comando 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Linha de comando 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linha de comando 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linha de comando 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linha de comando 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linha de comando 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linha de comando 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linha de comando 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linha de comando 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linha de comando 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command0 for accionado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command1 for acionado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command10 for acionado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command11 for acionado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command2 for acionado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command3 for acionado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command4 for acionado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command5 for acionado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command6 for acionado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command7 for acionado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command8 for acionado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Linha de comando a ser executada no shell quando run_command9 for acionado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandos" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Atalhos de margem de ecrã" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Teclas de atalho" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Executar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Executar comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Executar comando 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Executar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Executar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Executar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Executar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Executar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Executar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Executar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Executar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plug-ins Ativos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que o desenho das janelas em tela inteira não seja redirecionado " "para pixmaps fora da tela" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Campainha Audível" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Bip audível do sistema" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevação Automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Atraso na Elevação Automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecção automática de dispositivos de saída" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecção automática da taxa de atualização" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Melhor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clique para Posicionar o Foco" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "O clique na janela transfere o foco para ela" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Fechar a janela activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Ícone Padrão" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imagem do ícone padrão da janela" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Tamanho da Área de Trabalho" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar Saídas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar Taxa de Atualização" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Definições do Ecrã" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Tempo que o cursor do rato deve estar na margem do ecrã antes de executar " "uma acção de margem." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Tempo Activação Margem" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Comportamento de Focar e Elevar" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nível Prevenção Foco" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Janelas em prevenção de destaque" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forçar desenho independente dos dispositivos de saída." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opções Gerais" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opções gerais do compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bom" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar Janelas Ignorar Barra de Tarefas" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Esconder todas as janelas e colocar foco na área de trabalho" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Ocultar as janelas que não estão na barra de tarefas ao entrar no modo " "mostrar área de trabalho" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Alto" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamanho Virtual Horizontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Se disponível, usar compressão para texturas convertidas de imagens" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar dicas quando maximizada" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorar incremento de tamanho e aspecto quando a janela é maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes da elevação das janelas selecionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensagens ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Teclas de atalho" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nível de prevenção de roubo de foco" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminação" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de plug-ins atualmente ativos" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de strings descrevendo os dispositivos de saída" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Baixo" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Baixar a Janela" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Janela mais baixa sob as demais janelas" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar Janela Horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar Janela Verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximizar janela activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximizar janela activa horizontalmente" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximizar janela activa verticalmente" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimizar janela activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de áreas de trabalho" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de ambientes virtuais" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Desligado" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Apenas efectuar actualizações de ecrã durante o período de limpeza vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Saídas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Gestão Saídas Sobrepostas" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Desenhar cada dispositivo de saída independentemente, mesmo que os " "dispositivos de saída se sobreponham" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Atraso de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferir saída maior" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferir saída menor" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Elevar com um Clique" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar janela" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Elevar janelas selecionadas após intervalo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar janela acima das restantes" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Elevar janelas quando clicadas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Taxa de Atualização" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador de tamanho horizontal de ecrã para tamanho virtual" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de tamanho vertical de ecrã para tamanho virtual" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Mostrar Área de Trabalho" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animações Lentas" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modo inteligente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar a VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compressão Texturas" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtro de texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Taxa em que o ecrã é redesenhado (vezes/segundo)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Alternar Janela Maximizada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Alternar Janela Maximizada Horizontalmente" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Alternar Janela Maximizada Verticalmente" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Alternar Janela Sombreada" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Alternar janela activa maximizada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Alternar janela activa maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Alternar janela activa maximizada verticalmente" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Alternar janela activa sombreada" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Alternar uso de animações lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Restaurar janela activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Anular redirecionamento de janelas de tela inteira" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Usar luz difusa quando a tela for transformada" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamanho Vertical Virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Elevado" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Qual dos dispositivos de saída sobrepostos deve ser preferido" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botão de atalho para menu da janela" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla de atalho para menu da janela" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleração" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajustar Imagem" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustar imagem do topo à rotação" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avançar para o slide seguinte" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animar Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animar skydome ao girar o cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Aparência" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Cor dos lados superior e inferior do cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para o fundo do gradiente por omissão do skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Cor a utilizar para o topo do gradiente por omissão do skydome" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Topos Cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo da Área de Trabalho" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleração de dobragem" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidade de dobragem" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Timestep de dobragem" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Gerar mapas quando possível para dimensionamento de melhor qualidade" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Voltar ao slide anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Arquivos de imagem" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagem a usar como textura no skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Iniciar transparência do cubo apenas se a rotação por conduzida pelo rato." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Dentro do Cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Dentro do cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de arquivos PNG e SVG que devem ser renderizados na face superior do " "cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de Multi Saída" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Múltiplos cubos" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Próximo Slide" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Um cubo grande" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidade Durante Rotação" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidade Enquanto Não Roda" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidade do ambiente de trabalho ao rodar." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidade do ambiente de trabalho quando estático." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Colocar janelas no cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Slide Anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderizar skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Dimensionar imagem" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Dimensionar imagens para cobertura da face superior do cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Selecciona como o cubo é desenhado se existirem múltiplos dispositivos de " "saída." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Cor Final do gradiente Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Cor Inicial do gradiente Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagem do Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidade" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Espaço de tempo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparência apenas ao rodar com o rato" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo Transparente" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desdobrar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desdobrar cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend de controlo Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permitir a geração de mipmaps para texturas da decoração" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Janelas a decorar" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Linha de comando a executar se não estiver nenhum decorador a correr" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Deslocamento X da sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Deslocamento Y da sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacidade da sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Raio da sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Deslocamento X da Sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Deslocamento Y da Sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidade da Sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Raio da Sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Janelas com sombra" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoração da Janela" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decorações das janelas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Janelas que devem ser decoradas" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Janelas que devem ter sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Luminosidade (em %) de janelas que não respondem" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocidade constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Tempo constante" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Escurecer Janelas que Não Respondem" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Escurece janelas que não respondem aos pedidos do gestor de janelas" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Velocidade de Esmaecimento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Desvanecer ao Minimizar/Abrir/Fechar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidade de Esmaecimento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tempo de Esmaecimento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efeito de desvanecimento ao eventos de minimizar/abrir/fechar janelas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efeito de esmaecimento no bip do sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Avivar janelas quando houver mapeamento e esmaecê-las quando não houver " "mapeamento" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer janelas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Janelas Esmaecidas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campainha Visual de Tela Inteira" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efeito de esmaecimento de tela inteira ao som de bip do sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturação (em %) de janelas que não respondem" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Luminosidade Janelas que Não Respondem" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturação Janelas que Não Respondem" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campainha Visual" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Modo de esvaecimento das janelas" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" "Velocidade de esmaecimento das janelas, em modo \"Velocidade constante\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Tempo de esmaecimento (em ms) das janelas, em modo \"Velocidade constante\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Janelas que devem desvanecer" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Ponto Montagem" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Ponto de montagem" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de Ficheiros Userspace" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de ficheiros userspace" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend de controlo do GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Suprte ao loop principal do GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilidade Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir um terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Opções que mantêm o Compiz compatível com o ambiente de trabalho Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Caixa de Diálogo Executar" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Executar comando de terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Linha de comando para capturar ecrã" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostrar Menu Principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostrar caixa de diálogo Executar Aplicativo" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostrar o menu principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Efetuar uma captura de tela" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Efetuar captura de tela de uma janela" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Linha de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Linha de comando para captura de tela de janelas" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Backend de ficheiro simples ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Plugin de notificação de ficheiros" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend de controlo Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimizar Efeito" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar Janelas" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidade de minimização" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Timestep de minimização" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistência de Sombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistência ao sombrear" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformar janelas quando elas forem minimizadas e desminimizadas" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Janelas que devem ser transformadas quando minimizadas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restringir Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restringir a coordenada Y conforme a área de trabalho" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Não actualizar a posição das janelas no lado do servidor até acabar de mover" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar Movimento de Janelas" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamento preguiçoso" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover Janela" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mover janela" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidade" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nível de opacidade das janelas em movimento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Janelas maximizadas quebradas e automaticamente desmaximizadas ao arrastar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Janelas maximizadas quebradas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Iniciar movimento da janela" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brilho" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Diminuir Brilho" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Aumentar Brilho" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Incremento Brilho" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valores de brilho para janelas" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Diminuir" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Aumentar" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Diminuir Opacidade" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Aumentar Opacidade" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa de Opacidade" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valores de opacidade para janelas" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacidade, Brilho e Saturação" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ajustes de Opacidade, Brilho e Saturação" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturação" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Diminuir Saturação" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Aumentar Saturação" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Incremento Saturação" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valores de saturação para janelas" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Incremento" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Definições específicas de janelas" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valores para a janela" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Janelas" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Janelas que devem ter um brilho diferente por omissão" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Janelas que devem ter uma opacidade diferente por omissão" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Janelas que devem ter uma saturação diferente por omissão" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo usado para dispor janelas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascata" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrado" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Posicionamento Fixo de Janelas" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forçar Colacação Janelas" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posições horizontais" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Manter Na Área Trabalho" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Manter janelas colocadas na área de trabalho, mesmo que isso signifique que " "a posição possa diferir da posição especificada" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocar Janelas" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Colocar em todos os dispositivos de saída" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Colocar janelas nas posições apropriadas quando houver mapeamento" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de disposição" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Janelas posicionadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatório" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecciona como a colocação de janelas se deve comportar se estiverem " "seleccionados múltiplos dispositivos de saída." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligente" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Usar dispositivo de saída activo" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Usar dispositivo de saída da janela com foco" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Usar dispositivo de saída com cursor" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posições verticais" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Janelas posicionadas no viewport" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Soluções para colocação de janelas" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Janelas que devem ser posicionadas por omissão" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Janelas que devem ser posicionadas em viewports específicos por omissão" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Janelas que devem ser posicionadas, mesmo que indiquem que o gestor de " "janelas deve evitar posicioná-las." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Janelas com posições fixas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Janelas com viewport fixo" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluções" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posições X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posições X do viewport" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores de posição X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posições Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posições Y do viewport" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores de posição Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Carregar imagens png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Filtragem Regex" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Filtro regex de janelas" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Atalhos" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Cor da borda" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Cor do contorno usado para o modo contorno e rectangular de redimensionameto" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo de redimensionamento por omissão" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo a usar por omissão para redimensionamento de janelas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Cor de preenchimento" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Cor de preenchimento usada para o modo rectangular de redimensionamento" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar Redimensionamento esqueleto de Janelas" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar Redimensionamento Rectangular de Janelas" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar Redimensionamento Esticado de Janelas" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar Redimensionamento de Janelas" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contorno" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Redimensionar janelas pelo contorno" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectângulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Redimensionar Janelas rectangularmente" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Redimensionar Janela" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Redimensionar janela" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Iniciar redimensionamento da janela" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Iniciar redimensionamento da janela esticando-a" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Iniciar redimensionamento normal da janela" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Iniciar redimensionamento da janela usando o contorno" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Iniciar redimensionamento da janela usando um rectângulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Esticar" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Redimensionar janelas esticando-as" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Janelas que devem usar redimensionamento normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Janelas que devem usar redimensionamento pelo contorno" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Janelas que devem usar redimensionamento rectangular" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Janelas que devem usar redimensionamento por esticamento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Movimento de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ponteiro de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tempo de Inversão" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Rodar para o viewport da esquerda e manter ponteiro" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Inverter para o viewport seguinte ao arrastar o objeto para a borda da tela" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Inverter para o viewport seguinte ao mover o ponteiro para a borda da tela" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Inverter para o viewport seguinte ao mover a janela para a borda da tela" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Rodar para o viewport da direita e manter ponteiro" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverter o eixo Y para movimento do ponteiro" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inverter Y com o Ponteiro" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidade do Ponteiro" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar ao rodar" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar janelas ao rodar" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Girar Cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Rodar para a Esquerda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Rodar para a Direita" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Girar para a Esquerda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Girar para a Esquerda com Janela" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Girar para a Direita" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Girar para a Direita com Janela" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Rodar para" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Rodar para Face 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rodar para Face 1 com Janela" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Girar para a Face 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Girar para a Face 10 com Janela" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Girar para a Face 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Girar para a Face 11 com Janela" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Girar para a Face 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Girar para a Face 12 com Janela" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Girar para a Face 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Girar para a Face 2 com Janela" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Girar para a Face 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Girar para a Face 3 com Janela" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Girar para a Face 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Girar para a Face 4 com Janela" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Girar para a Face 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Girar para a Face 5 com Janela" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Girar para a Face 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Girar para a Face 6 com Janela" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Girar para a Face 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Girar para a Face 7 com Janela" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Girar para a Face 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Girar para a Face 8 com Janela" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Girar para a Face 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Girar para a Face 9 com Janela" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Girar cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Girar cubo da área de trabalho" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Girar para a esquerda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Rodar para a esquerda e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Girar para a direita" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Rodar para a direita e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Rodar para face do cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Rodar para face do cubo arrastando janela" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Rodar para a face 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Rodar para a face 1 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Girar para a face 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Girar para a face 10 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Girar para a face 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Girar para a face 11 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Girar para a face 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Girar para a face 12 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Girar para a face 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Girar para a face 2 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Girar para a face 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Girar para a face 3 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Girar para a face 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Girar para a face 4 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Girar para a face 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Girar para a face 5 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Girar para a face 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Girar para a face 6 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Girar para a face 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Girar para a face 7 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Girar para a face 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Girar para a face 8 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Girar para a face 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Girar para a face 9 e trazer a janela activa junto" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rodar para o viewport" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Rodar janela" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Rodar com janela" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleração da Rotação" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidade da Rotação" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Timestep da Rotação" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom da rotação" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidade do movimento do ponteiro" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Fechar a Rotação do Cubo na Face Inferior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fechar a Rotação do Cubo na Face Superior" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Fechar na Face Inferior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fechar na Face Superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar Rotação" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo de espera até a rodar o viewport" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Volume de opacidade em percentagem" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Botão de Atalho Alternar Modo Dimensionamento" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Botão de atalho que alterna o modo de dimensionamento em vez de o activar " "quando premido ou desactivar quando libertado." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Clicar área de trabalho para Mostrar Área" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Escurecer Segundo Plano" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Escurecer segundo plano ao dimensionar janelas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrar no modo Mostrar Área de Trabalho quando o ambiente é clicado durante " "o dimensionamento" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tempo a pairar" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar Seletor de Janelas" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar Selector de Janelas para Todas as Janelas" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar Selector de Janelas para Grupo de Janelas" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar Selector de Janelas para Todas as Janelas na Saída Actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Tecla de Atalho Alternar Modo Dimensionamento" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Tecla de atalho que alterna o modo de dimensionamento em vez de o activar " "quando premida e desactivar quando libertada." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Criar layout de todas as janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Criar layout de grupo de janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Criar layout das janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Criar layout de janelas na saída actual e iniciar sua transformação" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Em todos os dispositivos de saída" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Apenas no dispositivo de saída actual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ícone de Instalação Sobreposta" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Sobrepor um ícone nas janelas quando elas são dimensionadas" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Dimensionar" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Janelas a dimensionar" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidade de dimensionamento" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Etapa de dimensionamento" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Dimensionar janelas" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Selecciona onde as janelas são dimensionadas se existirem múltiplos " "dispositivos de saída." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espaço entre janelas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaçamento" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (em ms) antes que o modo de dimensionar seja terminado ao pairar sobre " "uma janela" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Janelas a serem dimensionadas no modo dimensionar" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Abrir automaticamente captura de ecrã nesta aplicação" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Directório" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Captura de secção rectangular do ecrã" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Iniciar Aplicação" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Colocar capturas de ecrã neste directório" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captura de ecrã" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin de captura de ecrã" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Carregar imagens svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantidade de brilho em percentagem" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantidade de saturação em percentagem" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Alternador de Aplicativos" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rodar Automaticamente" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Colocar em Primeiro Plano" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Colocar a janela selecionada em primeiro plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Distância a que o ambiente deve ficar reduzido ao alternar janelas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ícone" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizado" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Painel Seguinte" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Próxima janela" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Próxima Janela (Todas as janelas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Próxima Janela (Sem popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Mostrar alternador se não estiver visível e seleccionar próxima janela" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e seleccionar próxima janela de " "todas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Mostrar alternador se não estiver visível e seleccionar janela anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e seleccionar janela anterior de " "todas" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Painel Anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Janela anterior" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Janela anterior (Todas as janelas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Janela anterior (Sem popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rodar para a janela seleccionada ao alternar" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Seleccionar tipo de janela do painel seguinte." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Seleccionar próxima janela sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Seleccionar tipo de janela do painel anterior." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Seleccionar janela anterior sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Mostrar ícone ao lado da miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Mostrar janelas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidade do alternador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Timestep do alternador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Janelas a alternar" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Janelas que devem ser mostradas no alternador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Proporciona suporte para o espaço de cor YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reprodução Vídeo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Reprodução de vídeos" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espaço cor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Adicionar linha" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Adicionar ponto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Adiciona efeitos de água a diferentes acções no ambiente de trabalho" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Atraso (em ms) entre cada queda de gota de chuva" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activar efeitos de água no cursor" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linha" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Offset do escalamento" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Ponto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Atraso Chuva" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Onda do título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Alternar chuva" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Activar/desactivar efeito chuva" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Alternar limpapárabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Activar/desactivar efeito limpapárabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efeito Água" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Offset do escalamento durante efeito de água" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efeito de onda do título da janela" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efeito Foco" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efeito Focar Janela" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focar Janelas" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricção" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Agarrar Janelas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolução Grelha" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Inverter o efeito de atracção/resistência de janelas" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Faz tremer a janela" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efeito Criação" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efeito Criação Janela" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Criar Janelas" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efeito Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamanho Grelha Mínimo" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamanho Mínimo da Grelha de Esquinas" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Janelas" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremer" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Atracção Invertida" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Atrair janelas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricção Mola" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constante K Mola" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante Mola" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Alternar atracção/resistència das janelas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usar um modelo de uma mola para o efeito de janelas gelatinosas" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolução Grelha Esquinas" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Janelas que devem ser gelatinosas quando focadas" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Janelas que devem ser gelatinosas quando agarradas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Janelas que devem ser gelatinosas quando criadas" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Janelas que devem ser gelatinosas quando movidas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efeito gelatina quando se maximizam e minimizam janelas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Janelas Gelatinosas" #~ msgid "Command line 0" #~ msgstr "Linha de comando 0" #~ msgid "Run command 0" #~ msgstr "Executar comando 0" #~ msgid "Screenshot commands" #~ msgstr "Comandos para capturar ecrã" #~ msgid "Screenshot key bindings" #~ msgstr "Atalhos de teclado para capturar ecrã" #~ msgid "Filter Linear" #~ msgstr "Filtro Linear" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usar filtro linear quando magnificado" #~ msgid "Zoom Desktop" #~ msgstr "Zoom Área de Trabalho" #~ msgid "Zoom In" #~ msgstr "Mais Zoom" #~ msgid "Zoom Out" #~ msgstr "Menos Zoom" #~ msgid "Zoom Pan" #~ msgstr "Mover Zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocidade Zoom" #~ msgid "Zoom Timestep" #~ msgstr "Salto Temporal Zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Magnificar e deslocar o cubo da área de trabalho" #~ msgid "Zoom factor" #~ msgstr "Fator de magnificação" #~ msgid "Zoom pan" #~ msgstr "Deslocar zoom" #~ msgid "Decrease window opacity" #~ msgstr "Reduzir opacidade da janela" #~ msgid "Increase window opacity" #~ msgstr "Aumentar opacidade da janela" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidade para janelas que devem ser translúcidas por omissão" #~ msgid "Opacity windows" #~ msgstr "Opacidade de janelas" #~ msgid "Background Images" #~ msgstr "Imagens de fundo" #~ msgid "Background images" #~ msgstr "Imagens de fundo" #~ msgid "Place windows on a plane" #~ msgstr "Colocar janelas num plano" #~ msgid "Plane Down" #~ msgstr "Plano Abaixo" #~ msgid "Plane Left" #~ msgstr "Plano à esquerda" #~ msgid "Plane Right" #~ msgstr "Plano à direita" #~ msgid "Plane To Face 1" #~ msgstr "Plano à Face 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano à Face 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano à Face 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano à Face 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano à Face 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano à Face 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano à Face 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano à Face 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano à Face 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano à Face 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano à Face 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano à Face 9" #~ msgid "Plane Up" #~ msgstr "Plano acima" #~ msgid "Plane down" #~ msgstr "Plano abaixo" #~ msgid "Plane left" #~ msgstr "Plano à esquerda" #~ msgid "Plane right" #~ msgstr "Plano á direita" #~ msgid "Plane to face 1" #~ msgstr "Plano à face 1" #~ msgid "Plane to face 10" #~ msgstr "Plano à face 10" #~ msgid "Plane to face 11" #~ msgstr "Plano à face 11" #~ msgid "Plane to face 12" #~ msgstr "Plano à face 12" #~ msgid "Plane to face 2" #~ msgstr "Plano à face 2" #~ msgid "Plane to face 3" #~ msgstr "Plano à face 3" #~ msgid "Plane to face 4" #~ msgstr "Plano à face 4" #~ msgid "Plane to face 5" #~ msgstr "Plano à face 5" #~ msgid "Plane to face 6" #~ msgstr "Plano à face 6" #~ msgid "Plane to face 7" #~ msgstr "Plano à face 7" #~ msgid "Plane to face 8" #~ msgstr "Plano à face 8" #~ msgid "Plane to face 9" #~ msgstr "Plano à face 9" #~ msgid "Plane up" #~ msgstr "Plano acima" #~ msgid "Desktop Window Opacity Fade Time.Fade Time" #~ msgstr "" #~ "Tempo de Desvanecimento da Opacidade do Ambiente de trabalho.Tempo de " #~ "desvanecimento" ./po/mr.po0000644000004100000410000016073313246301623012651 0ustar www-datawww-data# Marathi message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # "( अमेय पाळंदे ) Ameya Palande" <2ameya@gmail.com> # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-07-09 17:00+0530\n" "PO-Revision-Date: 2005-07-29 15:37+0530\n" "Last-Translator: \"( अमेय पाळंदे ) Ameya Palande\" <2ameya@gmail.com>\n" "Language-Team: Marathi \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4417 #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.h:154 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4442 #: ../metadata/core.xml.in.h:85 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4484 #: ../metadata/core.xml.in.h:91 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4601 #: ../metadata/core.xml.in.h:161 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4620 msgid "Shade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4640 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4666 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4686 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4706 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4732 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5089 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5098 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5113 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "सुरु करणे" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "सुरु करणे" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 #, fuzzy msgid "Draw using tool" msgstr "सुरू होताना" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 #, fuzzy msgid "Initiate" msgstr "सुरु करणे" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "सुरु करणे" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "सुरु करणे" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "सुरु करणे" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "संरचना संचित करा" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "संरचना संचित करा" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "संरचना संचित करा" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "निवडा काही नाही" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "निवडा काही नाही" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "रषॴॖनॴ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:24 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "नामावली निवड" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 #, fuzzy msgid "Command line 0" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:27 #, fuzzy msgid "Command line 1" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:28 #, fuzzy msgid "Command line 10" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:29 #, fuzzy msgid "Command line 11" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:30 #, fuzzy msgid "Command line 2" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:31 #, fuzzy msgid "Command line 3" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:32 #, fuzzy msgid "Command line 4" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:33 #, fuzzy msgid "Command line 5" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:34 #, fuzzy msgid "Command line 6" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:35 #, fuzzy msgid "Command line 7" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:36 #, fuzzy msgid "Command line 8" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:37 #, fuzzy msgid "Command line 9" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:59 #, fuzzy msgid "Focus Prevention Level" msgstr "निवडा काही नाही" #: ../metadata/core.xml.in.h:60 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:61 #, fuzzy msgid "Focus prevention windows" msgstr "निवडा काही नाही" #: ../metadata/core.xml.in.h:62 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.h:63 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "High" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Low" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Off" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:114 #, fuzzy msgid "Refresh Rate" msgstr "पुन्हा सुरू करा" #: ../metadata/core.xml.in.h:115 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:116 #, fuzzy msgid "Run command 0" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:117 #, fuzzy msgid "Run command 1" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:118 #, fuzzy msgid "Run command 10" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:119 #, fuzzy msgid "Run command 11" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:120 #, fuzzy msgid "Run command 2" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:121 #, fuzzy msgid "Run command 3" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:122 #, fuzzy msgid "Run command 4" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:123 #, fuzzy msgid "Run command 5" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:124 #, fuzzy msgid "Run command 6" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:125 #, fuzzy msgid "Run command 7" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:126 #, fuzzy msgid "Run command 8" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:127 #, fuzzy msgid "Run command 9" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:128 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:140 #, fuzzy msgid "Terminal command line" msgstr "आज्ञा '%1'" #: ../metadata/core.xml.in.h:141 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:149 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:150 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:151 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:152 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:153 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:155 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:156 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:157 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:158 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:159 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.h:160 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.h:162 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:163 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:164 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:165 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 #, fuzzy msgid "Automatic" msgstr "सुरु करणे" #: ../metadata/cube.xml.in.h:8 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Fold Speed" msgstr "स्थानिक वेळ" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Fold Timestep" msgstr "स्थानिक वेळ" #: ../metadata/cube.xml.in.h:16 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:25 ../metadata/place.xml.in.h:7 #: ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:28 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Scale image" msgstr "स्थानिक वेळ" #: ../metadata/cube.xml.in.h:37 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:43 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:44 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:39 ../metadata/zoom.xml.in.h:4 #, fuzzy msgid "Timestep" msgstr "स्थानिक वेळ" #: ../metadata/cube.xml.in.h:45 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:47 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "आज्ञा:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "निवडा काही नाही" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "निवडा काही नाही" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 #, fuzzy msgid "Fade windows" msgstr "निवडा काही नाही" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fading Windows" msgstr "निवडा काही नाही" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "स्थानिक वेळ" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:18 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Force Placement Windows" msgstr "निवडा काही नाही" #: ../metadata/place.xml.in.h:5 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Positioned windows" msgstr "निवडा काही नाही" #: ../metadata/place.xml.in.h:13 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Viewport positioned windows" msgstr "निवडा काही नाही" #: ../metadata/place.xml.in.h:21 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:28 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "सुरु करणे" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "सुरु करणे" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "सुरु करणे" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "सुरु करणे" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Window Resize" msgstr "सुरु करणे" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 #, fuzzy msgid "Normal Resize Windows" msgstr "निवडा काही नाही" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 #, fuzzy msgid "Flip Time" msgstr "स्थानिक वेळ" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate To" msgstr "सुरु करणे" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate window" msgstr "निवडा काही नाही" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate with window" msgstr "निवडा काही नाही" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotation Acceleration" msgstr "स्थापना पूर्ण झाली" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotation Speed" msgstr "स्थापना पूर्ण झाली" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotation Timestep" msgstr "स्थापना पूर्ण झाली" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotation Zoom" msgstr "स्थापना पूर्ण झाली" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 #, fuzzy msgid "Start Rotation" msgstr "इन्स्टॉलेशन सुरु करत आहे..." #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:41 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 #, fuzzy msgid "Hover Time" msgstr "स्थानिक वेळ" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Initiate Window Picker" msgstr "सुरु करणे" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 #, fuzzy msgid "Scale speed" msgstr "स्थानिक वेळ" #: ../metadata/scale.xml.in.h:27 #, fuzzy msgid "Scale timestep" msgstr "स्थानिक वेळ" #: ../metadata/scale.xml.in.h:28 #, fuzzy msgid "Scale windows" msgstr "निवडा काही नाही" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 #, fuzzy msgid "Space between windows" msgstr "निवडा काही नाही" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "स्थानिक संचिका..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "नामावली निवड" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "सुरु करणे" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Bring To Front" msgstr "सुरू होताना" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next window" msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window (All windows)" msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (No popup)" msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:28 #, fuzzy msgid "Saturation" msgstr "संरचना संचित करा" #: ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Select next panel type window." msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:30 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:31 #, fuzzy msgid "Select previous panel type window." msgstr "निवडा काही नाही" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher timestep" msgstr "स्थानिक वेळ" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:40 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "निवडा काही नाही" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "निवडा काही नाही" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "निवडा काही नाही" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "सुरू होताना" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 #, fuzzy msgid "Zoom Speed" msgstr "स्थापना पूर्ण झाली" #: ../metadata/zoom.xml.in.h:11 #, fuzzy msgid "Zoom Timestep" msgstr "स्थानिक वेळ" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 #, fuzzy msgid "Zoom pan" msgstr "स्थापना पूर्ण झाली" #, fuzzy #~ msgid "Fade Time" #~ msgstr "स्थानिक वेळ" #, fuzzy #~ msgid "Dialog" #~ msgstr "तग॥लॲग" #~ msgid "Unknown" #~ msgstr "अज्ञात" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "संरचना संचित करा" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "स्थानिक वेळ" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "रषॴॖनॴ" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "स्थापना पूर्ण झाली" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "स्थानिक वेळ" ./po/lt.po0000644000004100000410000022700213246301623012643 0ustar www-datawww-data# Lithuanian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # Jonas Gocentas , 2001. # Linas Spraunius , 2000. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2001-10-18 09:54+0200\n" "Last-Translator: Jonas Gocentas \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" "100<10 || n%100>=20) ? 1 : 2;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Darbastaliai" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Window Manager" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nieko" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skeneris" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Suspausti Windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatinė" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Window Manager" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Praleistas\n" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Visiškai &ištrinti Windows" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Visiškai &ištrinti Windows" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "&Ištrinti Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "&Suspausti Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Spalvos" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktyvus profailas" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "_Valyti" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 #, fuzzy msgid "Fill color for annotations" msgstr "Sužinokite daugiau pasinaudoję dokumentacija" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr " -- Inicializuoti" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 #, fuzzy msgid "Line width for annotations" msgstr "Sužinokite daugiau pasinaudoję dokumentacija" #: ../metadata/annotate.xml.in.h:15 #, fuzzy msgid "Stroke color for annotations" msgstr "Sužinokite daugiau pasinaudoję dokumentacija" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 #, fuzzy msgid "Stroke width for annotations" msgstr "Sužinokite daugiau pasinaudoję dokumentacija" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filtras: " #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "&Ištrinti Windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "&Ištrinti Windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Nu&statyti filtrą" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Trukmė" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Trukmė" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Praleistas\n" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "&Ištrinti Windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Trukmė" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "&Ištrinti Windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "&Ištrinti Windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "&Ištrinti Windows" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Rusų" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Rusijos Federacija" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Rusų" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Rusijos Federacija" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Rusų" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows laisva (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Video režimo pasirinkimas" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Komanda:" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Komanda:" #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktyvus profailas" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Bylų &sistema" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Automatinė" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Įprastas skyrius" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Įprasta galiojimo pabaigos data" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Darbalaukis" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Pasirinkite atnaujinimui" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Paleidžiamas demonas." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Paleidžiamas demonas." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Virtualūs pseudonimai" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Įjungti ZEN skaidinį" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Registravimas" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "Išvardinti tik detektuotus spausdintuvus" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Windows" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Suspausti Windows" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Suspausti Windows" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normalus" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Nutolęs darbastalis" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Nutolęs darbastalis" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Uždelsimas" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radijo laikrodis" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Nepavyko pakeisti dydį." #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Atnaujinti sąrašą" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Darbalaukis" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Rodyti visus skaidinius" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Nu&statyti filtrą" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Nu&statyti filtrą" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Nu&statyti filtrą" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtualūs pseudonimai" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D spartinimas:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sidnėjus" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatinė" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Spalvos" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Spalvos" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Darbalaukis" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D spartinimas:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Praleistas\n" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Testas" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Nepavykusios bylos" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "&Ištrinti Windows" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&Ištrinti Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Windows" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "vietinis laikas" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sidnėjus" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sidnėjus" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Praleistas\n" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Testas" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Komanda:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&Ištrinti Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "Visiškai &ištrinti Windows" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "Visiškai &ištrinti Windows" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "Visiškai &ištrinti Windows" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Suspausti Windows" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "Visiškai &ištrinti Windows" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Suspausti Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Nėra aprašo" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind parametrai" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testas" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Realaus laiko" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Praleistas\n" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Realaus laiko" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Bylų &sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Ištrinti Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Suspausti Windows" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "Lytimasis ekranas" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows laisva (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Pridėti kontaktą" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Pridėti kontaktą" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Paleisti terminale" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Komandinės eilutės nagrinėjimo klaida." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Komandinės eilutės nagrinėjimo klaida." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Komandinės eilutės nagrinėjimo klaida." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Suspausti Windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Į &apačią" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Nepavyko pakeisti dydį." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Į &apačią" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Į &apačią" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Ištrinti Windows" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Paleidžiamas demonas." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Suspausti Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Paleidžiamas demonas." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Tiltas" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "&Ištrinti Windows" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "&Ištrinti Windows" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Ištrinti Windows" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Paleidžiamas demonas." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trukmė" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trukmė" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trukmė" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trukmė" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind parametrai" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Window Manager" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Ištrinti Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtualūs pseudonimai" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Ištrinti Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtualūs pseudonimai" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind parametrai" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind parametrai" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Darbo grupė" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtualūs pseudonimai" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Nepavyko pakeisti dydį." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtualūs pseudonimai" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Spalvos" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Spalvos" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr " -- Inicializuoti" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Spalvos" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Paleidžiamas demonas." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Nepavyko pakeisti dydį." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Realaus laiko" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "%1 rodyklė" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Spausdinimo įrenginys" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "Į dešinę" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "Į dešinę" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Į dešinę" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Į dešinę" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Pasukti ekraną" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Į &apačią" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Paleidžiamas demonas." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D spartinimas:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testas" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testas" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testas" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Pradėti paiešką" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Didelis" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Fonas" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Į &apačią" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Skeneris" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Ištrinti Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "vietinis laikas" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "vietinis laikas" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Ištrinti Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Ištrinti Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Ispanija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Katalogas\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Video režimo pasirinkimas" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Programos" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Ekranas" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Komandinės eilutės nagrinėjimo klaida." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Programos tvarka" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatinė" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Veiksmo" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Piktogramos" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Suspausti Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Darbalaukis" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&Ištrinti Windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&Ištrinti Windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&Ištrinti Windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Windows" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&Ištrinti Windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Paleidžiamas demonas." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Suspausti Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "vietinis laikas" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "vietinis laikas" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Ištrinti Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Pridėti plunksną" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Pridėti kontaktą" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Uždelsimas" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Pakeis&ti būseną" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Pakeis&ti būseną" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Pakeis&ti būseną" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Pakeis&ti būseną" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Ištrinti Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Veiksmo" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Ištrinti Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Raiška" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Ištrinti Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Mažiausias &GUID" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Mažiausias &GUID" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Į &apačią" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Tvarkyklė" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Suspausti Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Veiksmo" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Praleidžiamas %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Praleidžiamas %1" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Ištrinti Windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Serverio rezoliucija" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Komanda:" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Komanda '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Komandinės eilutės nagrinėjimo klaida." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Komandinės eilutės nagrinėjimo klaida." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filtras: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Praleistas\n" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Testas" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Praleistas\n" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "Visiškai &ištrinti Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Ištrinti Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Page Down" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Į dešinę" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Plane down" #~ msgstr "&Ištrinti Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane right" #~ msgstr "Į dešinę" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Įrankiai" #~ msgid "Menu" #~ msgstr "Meniu" #, fuzzy #~ msgid "Utility" #~ msgstr "Pagalbinis diskas..." #, fuzzy #~ msgid "Splash" #~ msgstr "splash=0" #, fuzzy #~ msgid "Dialog" #~ msgstr "Konfigūravimo dialogas" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Meniu" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Įrankiai" #, fuzzy #~ msgid "Notification" #~ msgstr "Pranešimai" #, fuzzy #~ msgid "Dnd" #~ msgstr "End" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Lytimasis ekranas" #~ msgid "Unknown" #~ msgstr "Nežinoma" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trukmė" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Visiškai &ištrinti Windows" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D spartinimas:" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D spartinimas:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testas" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Rusijos Federacija" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusų" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Sužinokite daugiau pasinaudoję dokumentacija" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Suspausti Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Suspausti Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Mažiausias &GUID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Nutolęs darbastalis" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D spartinimas:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testas" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "vietinis laikas" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "vietinis laikas" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Ištrinti Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Veiksmo" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Praleidžiamas %1" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Nu&statyti filtrą" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Serverio rezoliucija" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows laisva (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows laisva (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Praleistas\n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testas" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Darbalaukis" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Pasukti ekraną" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Komanda:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "Komanda:" #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Teikėjo tipas" #, fuzzy #~ msgid "Corners" #~ msgstr "Konverteriai" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Rodyti pak&eitimus" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Diskelis" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Paleidžiamas demonas." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminalai" ./po/nl.po0000644000004100000410000026150413246301623012642 0ustar www-datawww-data# translation of compiz.po to Dutch # Dutch message file for YaST 2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # # A.S. Kerkmeester , 1999, 2000, 2001. # FAX-Translations , 2000. # Karl Eichwalder , 1999, 2000. # Martin Lohner , 2000. # peter@sybex.nl, 2000. # Elve , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-04-18 17:08+0200\n" "Last-Translator: Harald van Bree \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Bureaublad" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Venster Beheer" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Geen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Schaal" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximaliseer" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximaliseer venster horizontaal" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximaliseer venster verticaal" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Geminimaliseerd" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatisch naar de voorgrond" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Venster menu" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Actie die ondernomen moet worden als de muis-wiel over venster titelbalk " "bladert" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Vervaging type" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity thema actief venster opaciteit" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity thema actief venster opaciteit schaduw" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity thema opaciteit" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity thema opaciteit schaduw" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opaciteit te gebruiken voor actieve vensters met metacity thema decoratie" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opaciteit te gebruiken voor metacity thema decoratie" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Actieve vensters oprollen met metacity thema decoratie's van ondoorzichtig " "tot doorzichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Actieve vensters oprollen met metacity thema decoratie's van ondoorzichtig " "tot doorzichtig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Titelbalk muiswiel actie" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Type vervaging gebruikt voor venster decoratie" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Gebruik metacity thema" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Gebruik metacity thema voor venster decoratie" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Venster sluiten" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Demaximaliseer venster" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximaliseer venster" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Venster minimaliseren" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Het venster \"%s\" reageert niet" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Door deze applicatie geforceerd te sluiten kunt u niet opgeslagen " "wijzigingen kwijt raken." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Annoteer" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Annoteer opvul kleur" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Annoteer doorhaal kleur" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Annoteer plug-in" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Wissen" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Teken" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Teken met hulpmiddel" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Opvul kleur voor annotatie's" # Maybe "start" or "begin" would be better in dutch #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Initialiseren" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Initiëer tekenen van annotatie" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Initiëer verwijderen van annotatie" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Starten verwijdering" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Lijn breedte" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Lijn breedte voor annotaties" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Doorhaal kleur voor annotaties" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Doorhaal breedte" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Doorhaal breedte voor annotaties" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha Vervaging" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Aplha vervaging vensters" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Vervagen filter" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Vervagen verbergen" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Vervagen verzadiging" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Vervagen snelheid" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Vervagen Vensters" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Vervagen achter doorzichtige onderdelen van vensters" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Vervagen verzadiging" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Vensters vervagen" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Vervagen vensters zonder focus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Uitschakelen van vervagen van scherm-regio's bedekt door andere vensters." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filter methode voor vervagen" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Focus vervagen" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Focus vervagen vensters" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussisch" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussische Radius" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussische Sterkte" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussische radius" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussische sterkte" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" # ../../db/printers.ycp.noloc:1400 #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" # ../../db/printers.ycp.noloc:1400 #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap detail-niveau" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Puls effect" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Venster vervagen snelheid" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Vensters die aanmerking komen voor focus vervagen" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Vensters die alpha vervagen standaard moeten gebruiken" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Kloon uitvoer" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Start kloon selectie" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Kloon uitvoer afhandelaar" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Een toetsbinding, die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Een toetsbinding, die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Een toetsbinding, die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Een toetsbinding die wanneer gekozen een shell opdracht zal uitvoeren " "herkenbaar aan commando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Commando regel 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Commando regel 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Commando regel 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Commando regel 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Commando regel 2 " #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Commando regel 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Commando regel 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Commando regel 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Commando regel 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Commando regel 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Commando regel 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Commando regel 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Commando regel om uit te voerenin de shell als run_command0 aangeroepen wordt" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command1 aangeroepen wordt" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command10 aangeroepen " "wordt" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command11 aangeroepen " "wordt" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command2 aangeroepen wordt" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command3 aangeroepen wordt" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command4 aangeroepen wordt" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command5 aangeroepen wordt" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command6 aangeroepen wordt" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command7 aangeroepen wordt" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command8 aangeroepen wordt" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Command regel die uitgevoerd moet worden als start_command9 aangeroepen wordt" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Opdracht" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Start commando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Start commando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Start commando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Start commando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Start commando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Start commando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Start commando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Start commando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Start commando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Start commando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Start commando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Start commando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Actieve plugins" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Sta volledig scherm vensters toe om niet omgeleid te worden naar off-screen " "pixmaps" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hoorbaar signaal" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hoorbare systeem piep" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisch naar de voorgrond" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automatisch naar de voorgrond vetraging" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatische herkenning van uitvoer apparaten" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatische herkenning van verversings snelheid" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Best" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klik voor focus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Klik op venster neemt invoer focus mee" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Sluit actief venster" # /usr/lib/YaST2/clients/lan_address.ycp:88 #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standaard pictogram" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standaard venster pictogram afbeelding" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Bureaublad kubus" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detecteer uitvoer" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detecteer verversings snelheid" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Snel" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Focus Vensters Voorkomen" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Focus Vensters Voorkomen" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Focus vensters voorkomen" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Algemene opties" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Algemene compiz opties" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Goed" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Verberg taakbalk overgeslagen vensters" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Verberg alle vensters en laat bureaublad zien" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Verberg vensters die niet in de taakbalk staan als Toon Bureaublad modus " "ingeschakeld wordt" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Virtuele horizontale grootte" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Negeer tips wanneer gemaximalizeerd" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Negeer vergroting en aspect hints indien venster is gemaximaliseerd" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "interval voor het omhoogbrengen van geselecteerd venster" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval tussen ping berichten" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Belichting" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lijst met actieve plung-ins" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lijst met strings die uitvoer apparaten omschrijven" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Laat venster zakken" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Laat venster zakken achter andere vensters" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximaliseer venster horizontaal" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximaliseer venster verticaal" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximaliseer actief venster" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximaliseer actief venster horizontaal" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximaliseer actief venster verticaal" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimaliseer actief venster" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normaal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Aantal bureaubladen" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Aantal virtuele bureabladen" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Scherm alleen bijwerken tijdens verticale blanking periode" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Uitvoer" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping vertraging" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Op voorgrond na klikken" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Venster naar de voorgrond" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Breng venster naar de voorgrond na interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Breng venster op voorgrond over andere vensters" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Breng venster naar de voorgrond na aanklikken" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Verversings snelheid" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Schermgrootte vermenigvuldiger voor horizontale grootte" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "scherm grootte vermenigvuldiger voor verticale grootte" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Toon bureaublad" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Langzame animaties" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Slim" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sync naar VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Texturen filteren" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Texturen filter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Texturen filteren" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "De snelheid waarin een scherm opnieuw getekend wordt (tijd/seconden)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Schakel venster gemaximaliseerd" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Schakel venster horizontaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Schakel venster vertikaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Schakel venster opgerold" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Schakel actief venster gemaximaliseerd" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Schakel actief venster horizontaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Schakel actief venster vertikaal gemaximaliseerd" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Schakel actief venster schaduw" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Schakel het gebruik van langzame animaties" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Demaximaliseer actief venster" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Niet omleiden van volledig scherm vensters" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Gebruik diffuus licht als het scherm wordt getransformeerd" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Verticale virtuele grootte" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Venster menu knop verbinding" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Venster menu knop verbinding" # workflow: "3D Beschleunigung aktivieren" # -ke- # /usr/lib/YaST2/clients/inst_config_x11.ycp:812 #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Versnelling" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Afbeelding bijstellen" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Top zijde afbeelding bijstellen op rotatie" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Door naar de volgende afbeelding" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Geanimeerde skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animeer skydome tijdens draaien van kubus" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisch" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kleur van de onder en boven zijde van de kubus" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Kleur om te gebruiken voor het onderste einde van de gradatie gebruikt als " "terugval voor de hemelkoepel" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Kleur om te gebruiken voor het bovenste einde van de gradatie die wordt " "gebruikt als hemelkoepel terugval" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubus kleur" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubus kleur" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Bureaublad kubus" # workflow: "3D Beschleunigung aktivieren" # -ke- # /usr/lib/YaST2/clients/inst_config_x11.ycp:812 #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Uitvouw versnelling" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Uitvouw snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Vouw tijdstap" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Genereer mipmap waarmogelijk voor een hogere schalings kwaliteit" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Ga terug naar vorige dia" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Afbeeldings bestanden" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Te gebruiken afbeelding voor skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Initialiseer kubus transparantie alleen als rotatie via de muis gestuurd " "wordt" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Binnen in de kubus" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Binnen in de kubus" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lijst van PNG en SVG bestanden die afgebeeld moeten worden op de bovenzijde " "van de kubus" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Multi uitvoer modus" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Meerdere kubussen" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Volgende dia" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Een grote kubus" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Doorzichtig tijdens draaien" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Doorzichtig tijdens niet draaien" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Ondoorzichtigheid van het bureaublad tijdens het draaien." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Doorzichtig van het bureaublad tijdens het niet draaien" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Plaats venster op de kubus" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Vorige dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Render Skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Afbeelding oprekken" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Afbeelding oprekken om de boven zijde van de kubus te bedekken" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Selecteer hoe de kubus wordt weergegeven als er meerdere uitvoer apparaten " "gebruikt worden" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Hemelkoepel" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Hemelkoepel gradatie eind kleur" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Hemelkoepel gradatie start kleur" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Hemelkoepel afbeelding" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tijdstempel" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Doorschijnend alleen tijdens draaien met de muis" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Uitvouwen" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "kubus uitvouwen" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus control backend" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Sta toe dat mipmaps gegenereerd worden voor decoratie texturen" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Opdracht" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Venster decoratie" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Decorator commandoregel die uitgevoerd wordt als er nog geen decorator draait" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Slagschaduw X offset" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Slagschaduw Y offset" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Schaduw kleur" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Slagschaduw opaciteit" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Schaduw omtrek" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Schaduw kleur" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Schaduw X offset" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Schaduw Y offset" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Schaduw ondoorzichtigheid" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Schaduw omtrek" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Schaduw vensters" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Venster decoratie" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Venster decoraties" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Vensters met decoratie" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Vensters met schaduw" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotatie snelheid" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Begrens Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normale grootte aanpassing van vensters" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Verduisteren tijdsduur" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Vervaag bij Minimaliseren/Openen/Sluiten" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Vervaag snelheid" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Verduisteren tijdsduur" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Vervaag effect bij Minimaliseren/Openen/Sluiten" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Vervaag effect bij systeem piep" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Invagen van vensters als ze gemapped worden en uitvagen als ze gedemapped " "worden" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Vervaag vensters" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Vervagende vensters" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visueel alarm is volledigscherm" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Volledig scherm vervagen bij systeem piep" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visueel alarm" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Venster vervaag snelheid" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vensters die geschaald moeten worden in schaal modus" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Vensters die moeten vervagen" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Koppel punt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Koppel punt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Gebruikers bestandssyteem" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Gebruikers bestandssysteem" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Gconf gecontrolleerde backend" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib main loop ondersteuning" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Een terminal openen" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:336 #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Uitvoeren dialoog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Terminal commando regel" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Schermafdruk commodo regel" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Toon Hoofdmenu" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Toon start applicatie dialoog venster" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Toon hoofdmenu" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Maak een schermafdruk" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Maak een schermafdruk van een venster" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Terminal commando regel" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Venster schermafdruk commando" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini platte tekst backend" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Bestands wijziging meldings plug-in" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig gecontrolleerde backend" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimaliseer effect" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Venster minimaliseren" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimaliseer snelheid" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimaliseer tijdstempel" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Oprol weerstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Oprol weerstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" "Transformeer vensters als deze worden geminimaliseerd en gemaximaliseerd" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Te transformeren vesters tijdens minimaliseren" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Begrens Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Begrens Y coördinaat tot werkruimte gebied" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Werk de server-zijde positie niet bij van vensters totdat deze klaar is met " "verplaatsen" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Start venster verplaatsing" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Luie positionering" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Verplaats venster" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Verplaats venster" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Ondoorzichtigheid" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Ondoorzichtigheid van vensters als zij worden verplaatst" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Los springen en auto de-maximaliseren van vensters als zij versleept worden" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Los springen van gemaximaliseerde vensters" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Start vensters verplaatsen" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Helderheid" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Verminderen opaciteit" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Verhoog opaciteit" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Opaciteit verander stap" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Opaciteit verander stap" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Opaciteit stap" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Ondoorzichtigheid van vensters als zij worden verplaatst" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Doorzichtig tijdens draaien" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Verzadiging" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Venster decoraties" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Venster opaciteit waarde" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Vervagen Vensters" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Vensters die standaard gepositioneerd moeten worden" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Vensters die standaard licht doorlatend moeten zijn" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Vensters die standaard gepositioneerd moeten worden" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Te gebruiken algoritme om vensters te plaatsen" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Achter elkaar" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Gecentreerd" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Venster Beheer" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Focus Vensters Voorkomen" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horizontale viewport positie's" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Plaats venster" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Plaats vensters op toepasselijke positie's bij mapping" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Plaatsing modus" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Gepositioneerde vensters" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Willekeurig" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecteert waar vensters worden geschaald als meerdere uitvoer apparaten " "worden gebruikt." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Slim" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Op alle uitvoer apparaten" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Verticale viewport positie" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Viewport gepositioneerde vensters" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Venster plaatsing workarounds" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Vensters die standaard gepositioneerd moeten worden" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Vensters die gepositioneerd moeten worden in een specifieke viewport" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Venster decoraties" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X positie" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X viewport positie's" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X positie waarden" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y positie's" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y viewport positie's" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y positie waarden" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "PNG afbeelding lader" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex matching voor vensters" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Rand kleur" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Rand kleur gebruikt voor omtrek en rechthoek grootte aanpassing modi" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standaard grootte aanpassing modus" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Standaard modus gebruikt voor grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Vul kleur" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Vul kleur gebruikt voor de rechthoek grootte aanpassing modus" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Initiëer normale venster grootte aanpassing" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Initiëer omtrek venster grootte aanpassing" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Initiëer rechthoek venster grootte aanpassing" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Initiëer rekken venster grootte aanpassing" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Initiëer venster grootte aanpassing" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normale grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Omtrek" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Omtrek grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rechthoek" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Rechthoek grootte aanpassing" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Grootte aanpassing venster" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Grootte aanpassing venster" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Begin met grootte aanpassing venster" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Begin met grootte aanpassing door het op te rekken" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Start grootte aanpassing venster normaal" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Begin grootte aanpassing van venster net omtrek" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Begin met grootte aanpassing met rechthoek" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Rekken" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Rekken grootte aanpassing van vensters" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" "Vensters waar normale grootte aanpassing voor gebruikt zou moeten worden" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Vensters waarvoor omtrek grootte aanpassing gebruikt zou moeten worden" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" "Vensters waarvoor rechthoek grootte aanpassing gebruikt zou moeten worden" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Vensters waarvoor rekken grootte aanpassing gebruikt zou moeten worden" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Rand kantel verslepen" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Rand kantel verplaatsen" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Rand kantel aanwijzer" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Kantel tijd" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Kantel naar linker viewport en warp aanwijzer" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Kantel naar volgende viewport als een object naar de scherm rand wordt " "versleept" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Kantel naar volgende viewport als de aanwijzer naar de schermrand wordt " "verplaatst" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Kantel naar volgende viewport als venster wordt verplaatst naar schermrand" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Kantel naar rechter viewport en warp aanwijzer" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverteer Y as voor aanwijzer beweging" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Aanwijzer Y inverteren" # /usr/lib/YaST2/clients/printconf_filter.ycp:200 #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Aanwijzer gevoeligheid" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Omhoog halen bij roteren" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Verhef venster bij roteren" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Roteer kubus" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Roteer kantel links" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Roteer kantel rechts" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Roteer links" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Roteer links met venster" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Roteer rechts" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Roteer naar rechts met venster" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Roteer naar" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Roteer naar zijde 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Roteer naar zijde 1 met venster" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Roteer naar zijde 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Roteer naar zijde 10 met venster" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Roteer naar zijde 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Roteer naar zijde 11 met venster" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Roteer naar zijde 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Roteer naar zijde 12 met venster" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Roteer naar zijde 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Roteer naar zijde 2 met venster" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Roteer naar zijde 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Roteer naar zijde 3 met venster" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Roteer naar zijde 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Roteer naar zijde 4 met venster" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Roteer naar zijde 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Roteer naar zijde 5 met venster" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Roteer naar zijde 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Roteer naar zijde 6 met venster" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Roteer naar zijde 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Roteer naar zijde 7 met venster" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Roteer naar zijde 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Roteer naar zijde 8 met venster" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Roteer naar zijde 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Roteer naar zijde 9 met venster" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Roteer kubus" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Roteer bureaublad kubus" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Roteer naar links" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Roteer naar links en neem actief venster mee" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Roteer naar rechts" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Roteer naar rechts en neem venster mee" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Roteer naar zijde 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Roteer naar zijde 1 met venster" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Roteer naar zijde 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Roteer naar zijde 1 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Roteer naar zijde 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Roteer naar zijde 10 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Roteer naar zijde 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Roteer naar zijde 11 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Roteer naar zijde 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Roteer naar zijde 12 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Roteer naar zijde 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Roteer naar zijde 2 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Roteer naar zijde 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Roteer naar zijde 3 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Roteer naar zijde 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Roteer naar zijde 4 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Roteer naar zijde 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Roteer naar zijde 5 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Roteer naar zijde 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Roteer naar zijde 6 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Roteer naar zijde 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Roteer naar zijde 7 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Roteer naar zijde 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Roteer naar zijde 8 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Roteer naar zijde 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Roteer naar zijde 9 en neem actief venster mee" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Roteer naar viewport" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Roteer venster" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Roteer met venster" # workflow: "3D Beschleunigung aktivieren" # -ke- # /usr/lib/YaST2/clients/inst_config_x11.ycp:812 #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Rotatie acceleratie" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotatie snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Rotatie tijdstap" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rotatie zoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Gevoeligheid van aanwijzer beweging" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Klik kubus rotatie aan ondervlak" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Klik kubus rotatie aan bovenvlak" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Klik aan ondervlak" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Klik aan bovenvlak" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Begin rotatie" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Timeout voor kantelen viewport" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Mate van ondoorzichtigheid in procenten" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Groot" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klik bureaublad voor Toon Bureaublad" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Achtergrond donker maken" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Achtergrond donker maken tijdens schalen van vensters" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Embleem" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Activeer Toon Bureaublad modus als bureaublad wordt aangeklikt tijdens het " "schalen" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Zweef tijd" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Initiëer venster kiezer" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Initiëer venster kiezer voor alle vensters" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Initiëer venster kiezer voor venster groep" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Initiëer venster kiezer voor vensters op huidige uitvoer" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Uitleggen en begin met transformeren van alle vensters" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Uitleggen en beginnen met transformeren van venster groep" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Uitleggen en start transformeren vensters" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Uitleggen en start transformeren vensters op huidige uitvoer" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Op alle uitvoer apparaten" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Op huidige uitvoer apparaten" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Overlay icoon" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Een overlay icoon op vensters als ze zijn geschaald" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Schaal" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Schaal vensters" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Schaal snelheid" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Schaal tijdstap" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Schaal vensters" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Selecteert waar vensters worden geschaald als meerdere uitvoer apparaten " "worden gebruikt." # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Ruimte tussen vensters" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Tussenruimte" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tijd (in ms) voordat de schaal modus wordt afgebroken als over het venster " "wordt gezweefd" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Vensters die geschaald moeten worden in schaal modus" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automatisch schermafdruk openen in deze applicatie" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Directory" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Initiëer rechthoek schermafdruk" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Start toepassing" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Stop schermafdruk afbeeldingen in deze folder" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Schermafdruk" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Schermafdruk plugin" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "SVG afbeelding lader" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Mate van helderheid in procenten" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Mate van verzadiging in procenten" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Applicatie wisselaar" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Auto rotatie" # /usr/lib/YaST2/clients/inst_ask_config.ycp:100 #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Breng naar voren" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Breng geselcteerd venster naar voren" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Afstand bureaublad moet zijn uitgezoomd tijdens wisselen van vensters" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Pictogram" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Geminimaliseerd" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Bureaublad vlak" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Volgende venster" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Volgende venster (alle vensters)" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Volgende venster (geen popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Laat wisselaar te voorschijn komen indien niet zichtbaar en selecteer " "volgende venster" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Laat venster te voorschijn komen indien niet zichtbaar en selecteer volgende " "venster uit alle vensters" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Laat venster te voorschijn komen indien niet zichtbaar en selecteer vorige " "venster" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Laat wisselaar te voorschijn komen indien niet zichtbaar en selecteer vorige " "venster uit alle vensters" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Vorige dia" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Vorig venster" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Vorig venster (all vensters)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Vorig venster (geen popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Roteer naar het geselecteerde venster tijdens wisseling" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Selecteer volgende venster zonder het popup venster te tonen." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Selecteer vorige venster zonder het popup venster te tonen." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Selecteer vorige venster zonder het popup venster te tonen." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Toon pictogram naast thumbnail" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Toon geminimaliseerde vensters" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Wisselaar snelheid" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Wisselaar tijdstap" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Wisselaar vensters" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Vensters die getoond moeten worden in de wisselaar" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Voorzie in ondersteuning voor YV12 colorspace" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Video afspelen" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Video afspelen" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 colorspace" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Lijn toevoegen" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Punt toevoegen" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Voegt water effecten toe aan verschillende bureaublad acties" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Vertraging (in ms) tussen elke regen-druppel" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Inschakelen aanwijzer water effecten" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Lijn" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Offset schaal" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regen vertraging" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titel golf" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Schakel regen" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Schakel regen effect" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Schakel wisser" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Schakel wisser effect" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Water effect" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Water offset schaal" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Golf effect vanaf venster titel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Focus effect" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Focus venster effect" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focus vensters" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Wrijving" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Grijp vensters" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Raster Resolutie" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Geïnverteerd venster klikken" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Laat vensters rillen" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximaliseren effect" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimale raster grootte" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimum vertex raster grootte" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Verplaats vensters" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Rilling" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Klikken geïnverteerd" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Vensters klikken" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Veer Wrijving" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Veer K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Veer Contstante" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Schakel venster klikken" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Gebruik veer model voor wiebelend venster effect" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Vertex raster resolutie" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Vensters die moeten wiebelen tijdens focus" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Vensters die moeten wiebelen als ze gegrepen worden" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Vensters die moeten wiebelen als ze gemapped worden" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Vensters die moeten wiebelen tijdens verplaatsen" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Wiebel effect tijdens maximaliseren en herstellen vensters" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Wiebelende Vensters" #~ msgid "Command line 0" #~ msgstr "Commando regel 0" #~ msgid "Run command 0" #~ msgstr "Start commando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Schermafdruk commodo regel" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Schermafdruk commodo regel" #~ msgid "Filter Linear" #~ msgstr "Filter Lineair" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Gebruik lineair filter zodra ingezoomd" #~ msgid "Zoom Desktop" #~ msgstr "Zoom bureaublad" #~ msgid "Zoom In" #~ msgstr "Zoom in" #~ msgid "Zoom Out" #~ msgstr "Zoom uit" #~ msgid "Zoom Pan" #~ msgstr "Zoom verschuiven" #~ msgid "Zoom Speed" #~ msgstr "Zoom snelheid" # /usr/lib/YaST2/clients/inst_config_x11.ycp:821 #~ msgid "Zoom Timestep" #~ msgstr "Zoom tijdstap" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoomen en verschuiven van bureaublad kubus" #~ msgid "Zoom factor" #~ msgstr "Zoom factor" #~ msgid "Zoom pan" #~ msgstr "Zoom verschuiven" #~ msgid "Decrease window opacity" #~ msgstr "Verminderen venster opaciteit" #~ msgid "Increase window opacity" #~ msgstr "Verhoog venster opaciteit" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Opaciteit waarde voor vensters die standaard lichtdoorlatend moeten zijn" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #~ msgid "Opacity windows" #~ msgstr "Opaciteit vensters" #~ msgid "Background Images" #~ msgstr "Achtergrond afbeelding" #~ msgid "Background images" #~ msgstr "Achtergrond afbeelding" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #~ msgid "Place windows on a plane" #~ msgstr "Plaats vensters op een vlak" #~ msgid "Plane Down" #~ msgstr "Vlak omlaag" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #~ msgid "Plane Left" #~ msgstr "Vlak links" #~ msgid "Plane Right" #~ msgstr "Vlak rechts" #~ msgid "Plane To Face 1" #~ msgstr "Vlak naar zijde 1" #~ msgid "Plane To Face 10" #~ msgstr "Vlak naar zijde 10" #~ msgid "Plane To Face 11" #~ msgstr "Vlak naar zijde 11" #~ msgid "Plane To Face 12" #~ msgstr "Vlak naar zijde 12" #~ msgid "Plane To Face 2" #~ msgstr "Vlak naar zijde 2" #~ msgid "Plane To Face 3" #~ msgstr "Vlak naar zijde 3" #~ msgid "Plane To Face 4" #~ msgstr "Vlak naar zijde 4" #~ msgid "Plane To Face 5" #~ msgstr "Vlak naar zijde 5" #~ msgid "Plane To Face 6" #~ msgstr "Vlak naar zijde 6" #~ msgid "Plane To Face 7" #~ msgstr "Vlak naar zijde 7" #~ msgid "Plane To Face 8" #~ msgstr "Vlak naar zijde 8" #~ msgid "Plane To Face 9" #~ msgstr "Vlak naar zijde 9" #~ msgid "Plane Up" #~ msgstr "Vlak omhoog" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:770 #~ msgid "Plane down" #~ msgstr "Vlak omlaag" # /usr/lib/YaST2/clients/lan_dns.ycp:85 # /usr/lib/YaST2/clients/lan_dns.ycp:85 #~ msgid "Plane left" #~ msgstr "Vlak rechts" #~ msgid "Plane right" #~ msgstr "Vlak rechts" #~ msgid "Plane to face 1" #~ msgstr "Vlak naar zijde 1" #~ msgid "Plane to face 10" #~ msgstr "Vlak naar zijde 10" #~ msgid "Plane to face 11" #~ msgstr "Vlak naar zijde 11" #~ msgid "Plane to face 12" #~ msgstr "Vlak naar zijde 12" #~ msgid "Plane to face 2" #~ msgstr "Vlak naar zijde 2" #~ msgid "Plane to face 3" #~ msgstr "Vlak naar zijde 3" #~ msgid "Plane to face 4" #~ msgstr "Vlak naar zijde 4" #~ msgid "Plane to face 5" #~ msgstr "Vlak naar zijde 5" #~ msgid "Plane to face 6" #~ msgstr "Vlak naar zijde 6" #~ msgid "Plane to face 7" #~ msgstr "Vlak naar zijde 7" #~ msgid "Plane to face 8" #~ msgstr "Vlak naar zijde 8" #~ msgid "Plane to face 9" #~ msgstr "Vlak naar zijde 9" #~ msgid "Plane up" #~ msgstr "Vlak omhoog" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Bureaublad venster opaciteit verduisteren tijdsduur" ./po/bn.po0000644000004100000410000035645313246301623012640 0ustar www-datawww-data# Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-01-03 03:23+0100\n" "Last-Translator: Mahdee Jameel \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ডেস্কটপ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "উইন্ডো পরিচালনা" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "কমপিজ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "কিছু না" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "স্ক্যানার" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "বড় করা" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "উইন্ডোটিকে অনুভূমিকভাবে বড় করা" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "উইন্ডোটিকে উল্লম্বভাবে বড় করা" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ছোট করা হয়েছে" # স্বয়ংক্রীয় #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "স্বয়ংক্রীয় আপডেট" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "উইন্ডো মেনু" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "উইন্ডো শীর্ষবারে মাউস হুইল স্ক্রল করার সময় কার্য করা হবে" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "অস্বচ্ছতার প্রকৃতি" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "মেটাসিটি বিষয় সক্রিয় উইন্ডোর অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "মেটাসিটি বিষয় সক্রিয় উইন্ডোর অস্বচ্ছতার শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "মেটাসিটি বিষয় অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "মেটাসিটি বিষয় অস্বচ্ছতার শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙ্করণ সহ সক্রিয় উইন্ডোয় ব্যবহারের জন্য অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙ্করণে ব্যবহারের জন্য অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "অস্বচ্ছ থেকে অর্ধস্বচ্ছ মেটাসিটি বিষয় অলঙ্করণ সহ শেড সক্রিয়করণ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "অস্বচ্ছ থেকে অর্ধস্বচ্ছ মেটাসিটি বিষয় অলঙ্করণ সহ শেড সক্রিয়করণ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "শীর্ষ বার মাউস হুইলের কার্য" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "উইন্ডো অলঙ্করণের সময় অস্পষ্টতার প্রকার" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "মেটাসিটি বিষয় ব্যবহার করুন" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "উইন্ডো অলঙ্করণ করার সময় মেটাসিটি বিষয় ব্যবহার করুন" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "উইন্ডো বন্ধ করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "উইন্ডো সর্বাধিক না করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "উইন্ডো বড় করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "উইন্ডোটি ছোট করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "অ্যানোটেট" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "অ্যানোটেট পূর্ণ রঙ" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "অ্যানোটেশনের স্ট্রোকের রঙ" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "অ্যানোটেট প্লাগ ইন" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "পরিষ্কার করা" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "অঙ্কন করা" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "টুলের সাহায্যে অঙ্কন করা" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "অ্যানোটেশন পূর্ণ করার রঙ" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "শুরু " #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "ভারত" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "ভারত" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "ভারত" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "রেখার বিস্তার" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "অ্যানোটেশনের লাইনের প্রস্থ" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "অ্যানোটেশনের স্ট্রোকের রঙ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "স্ট্রোকের প্রস্থ" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "অ্যানোটেশনের স্ট্রোকের প্রস্থ" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "ফিল্টার:" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "আলফা অস্পষ্ট" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "বাদ দেয়া হয়েছে\n" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "বাদ দেয়া হয়েছে\n" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "অস্পষ্ট উইন্ডো" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "উইন্ডোর অর্ধস্বচ্ছ অংশের পিছনের অস্পষ্টতা" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "যে উইন্ডোগুলিতে ফোকাস নেই সেগুলিকে অস্পষ্ট করা " #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "অন্যান্য উইন্ডো দ্বারা অস্পষ্ট করা স্ক্রিনের অংশগুলির অস্পষ্টতাকে অসমর্থ করা." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "অস্পষ্ট করার জন্য ফিল্টার করার পদ্ধতি" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ফোকাস অস্পষ্ট" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ফোকাস অস্পষ্ট করার উইন্ডো" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "মিপম্যাপ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "মিপম্যাপ LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "মিপম্যাপের বিশদরূপের-স্তর" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "পালস" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "পালস প্রভাব" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "উইন্ডোর অস্পষ্টকরণের গতি" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ফোকাস বার দ্বারা যে উইন্ডোগুলি প্রভাবিত হবে" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলি আলফা অস্পষ্টতা ব্যবহার করবে" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "সমরূপ আউটপুট" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "ভারত" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "আউটপুট সমরূপ পরিচালক" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 0 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ1 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ10 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ11 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 2 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ3 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ4 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ5 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ6 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ7 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ8 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ9 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 0 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ1 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ10 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ11 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 2 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ3 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ4 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ5 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ6 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ7 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ8 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ9 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 0 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ1 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ10 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ11 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 2 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ3 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ4 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ5 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ6 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ7 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ8 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ9 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "যখন run_command0 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "যখন run_command1 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "যখন run_command10 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "যখন run_command11 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "যখন run_command2 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "যখন run_command3 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "যখন run_command4 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "যখন run_command5 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "যখন run_command6 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "যখন run_command7 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "যখন run_command8 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "যখন run_command9 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "কমান্ড '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "সক্রিয় প্লাগইনগুলি" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "অফস্ক্রিন পিক্সম্যাপে পুনর্নির্দেশিত না করার জন্য পূর্ণস্ক্রিন উইন্ডো অঙ্কন সম্মত করা" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "শ্রবণযোগ্য বেল" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "শ্রবণযোগ্য সিস্টেম বিপ" # স্বয়ংক্রীয় #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "স্বয়ং-বৃদ্ধি বিলম্ব" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "আউটপুট ডিভাইসের স্বয়ংক্রিয় সন্ধান" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "পুনঃসজীব মাত্রার স্বয়ংক্রিয় সন্ধান" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "সর্বোত্তম" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ফোকাসে ক্লিক করুন" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "উইন্ডোয় ক্লিক করে তাতে ইনপুটে ফোকাস করুন" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "সক্রিয় উইন্ডোটি বন্ধ করুন" # button label #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ডিফল্ট (&e)" # progress stage title #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ডিফল্ট উইন্ডো ম্যানেজার আরাম্ভ করা হচ্ছে" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ডেস্কটপ ঘনক" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "আউটপুট সন্ধান" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "পরিবর্ধনের জন্য নির্বাচন করুন" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "দ্রুত" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "সাধারণ বিকল্প" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "সাধারণ কমপিজ বিকল্প" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ভালো" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "টাস্কবার উইন্ডোগুলি বাদ দেওয়া গোপন করা" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "সব উইন্ডোগুলি গোপন করা এবং ডেস্কটপে ফোকাস করা" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "ডেস্কটপ প্রদর্শন প্রণালীতে প্রবেশ করার সময় টাস্কবারে নেই এরকম উইন্ডোগুলি গোপন করুন" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "অনুভূমিক ভার্চুয়াল আকার" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "বড় করার হলে ইঙ্গিতগুলি অগ্রাহ্য করা" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "উইন্ডো বড় করার সময় আকার বৃদ্ধি এবং আকৃতির ইঙ্গিত অগ্রাহ্য করুন" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "নির্বাচিত উইন্ডোগুলিকে তোলার আগে ব্যবধান" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "পিং বার্তাগুলির মধ্যে ব্যবধান" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "আলোকপাত" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "বর্তমানে সক্রিয় প্লাগইনের তালিকা" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "আউটপুট ডিভাইস বর্ণনাকারী স্ট্রিংয়ের তালিকা" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "নিচের উইন্ডো" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "অন্যান্য উইন্ডগুলির নিচে উইন্ডোটিকে নামিয়ে দিন" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "উইন্ডোটিকে অনুভূমিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "উইন্ডোটিকে উল্লম্বভাবে বড় করা" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "সক্রিয় উইন্ডো বড় করা" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "সক্রিয় উইন্ডোটিকে অনুভূমিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "সক্রিয় উইন্ডোটিকে উল্লম্বভাবে বড় করা" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "সক্রিয় উইন্ডো ছোট করা" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "স্বাভাবিক" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ডেস্কটপের সংখ্যা" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ভার্চুয়াল ডেস্কটপের সংখ্যা" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "উল্লম্ব ফাঁকা পর্যায়ে শুধুমাত্র স্ক্রিন আপডেট সম্পাদন করুন" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "আউটপুটগুলি" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "পিং বিলম্ব" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "ক্লিক করে বৃদ্ধি করুন" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "উইন্ডো তুলে ধরা" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ব্যবধানের পরে নির্বাচিত উইন্ডোটিকে তুলে ধরুন" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "অন্যান্য উইন্ডোগুলির ওপরে উইন্ডো তুলে ধরা" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ক্লিক করা হলে উইন্ডোটি তুলে ধরা" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "পুনরায় তালিকা প্রদর্শন করো (&R)" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "অনুভূমিক ভার্চুয়াল আকারের জন্য স্ক্রিন আকারের গুণিতক" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "উল্লম্ব ভার্চুয়াল আকারের জন্য স্ক্রিন আকারের গুণিতক" # label text #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "সময়" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "সবগুলো পার্টিশন প্রদর্শন করো" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "স্মার্ট" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank এ Sync " #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "টেক্সচার ফিল্টার করা" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "টেক্সচার ফিল্টার" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "টেক্সচার ফিল্টার করা" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "যে হারে স্ক্রিনটি পুনরায় অঙ্কন করা হবে (গুণ/সেকেন্ড)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "সর্বাধিক উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "অনুভূমিকভাবে সর্বাধিক উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "উল্লম্বভাবে সর্বাধিক উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "উইন্ডো শেড টগল করা" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "সর্বাধিক সক্রিয় উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "অনুভূমিকভাবে সর্বাধিক সক্রিয় উইন্ডোকে টগল করা" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "উল্লম্বভাবে সর্বাধিক সক্রিয় উইন্ডোকে টগল করা" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "সক্রিয় উইন্ডো শেড টগল করা" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "মন্থর অ্যানিমেশনগুলির ব্যবহার টগল করা" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "সক্রিয় উইন্ডো সর্বাধিক না করা" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "পূর্ণস্ক্রিনের উইন্ডোগুলি পুনর্নির্দেশ না করা" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "স্ক্রিন স্থানান্তরিত করার সময় বিচ্ছুরিত আলো প্রয়োগ করুন" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "উল্লম্ব ভার্চুয়াল আকার" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "উইন্ডোর মেনু বোতাম বন্ধন" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "উইন্ডোর কী বোতাম বন্ধন" # নির্বাচন #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "নির্বাচন " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "চিত্র বিন্যস্ত করা" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "চিত্রের ওপরের তলটি ঘোরানোয় বিন্যস্ত করা" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "পরবর্তী স্লাইডে এগিয়ে যাওয়া" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "স্কাইডোম অ্যানিমেট করা" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ঘনক ঘোরানোর সময় স্কাইডোম অ্যানিমেট করা" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # স্বয়ংক্রীয় #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ঘনকের ওপর এবং নিচের প্রান্তের রঙ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "স্কাইডোম-ফলব্যাক গ্র্যাডিয়েন্টের নিচের কালার-স্টপের জন্য রঙ " #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "স্কাইডোম-ফলব্যাক গ্র্যাডিয়েন্টের ওপরের কালার-স্টপের জন্য রঙ " #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ডেস্কটপ ঘনক" # নির্বাচন #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "নির্বাচন " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "উন্নততর স্কেলিং এর জন্য mipmaps তৈরী করুন" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "পূর্ববর্তী স্লাইডে ফিরে যান" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ইমেজ ফাইল তৈরী করো" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "স্কাইডোমের টেক্সচার হিসাবে ব্যবহারের জন্য চিত্র" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "যদি মাউস দিয়ে ঘোরানো হয় তাহলে ঘনকের স্বচ্ছতা শুরু হবে." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ঘনকের অভ্যন্তরে" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ঘনকের অভ্যন্তরে" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "ঘনকের উপরিতলে PNG এবং SVG র যে তালিকা প্রয়োগ করা হবে" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "বিবিধ আউটপুট প্রণালী" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "বহুবিধ ঘনকগুলি" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "পরবর্তী স্লাইড" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "বড় ঘনকে" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ঘোরানোর সময় অস্বচ্ছতা" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "না ঘোরানোর সময় অস্বচ্ছতা" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ঘোরানোর সময় ডেস্কটপ উইন্ডোর অস্বচ্ছতা." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ঘোরানোর সময় ডেস্কটপ উইন্ডোর অস্বচ্ছতা." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ঘনকে উইন্ডো স্থাপন করা" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "পূর্ববর্তী স্লাইড" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Skydome প্রয়োগ করা" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "স্হানীয় সময়" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ঘনকের ওপরের তল আবৃত করার জন্য চিত্র স্কেল করা" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "যদি একাধিক ডিভাইস ব্যবহার করা হয় সেক্ষেত্রে ঘনকটি কিভাবে প্রদর্শন করা হবে তা " "নির্বাচন করে." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "স্কাইডোম" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "স্কাইডোম গ্র্যাডিয়েন্ট শেষের রঙ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "স্কাইডোম গ্র্যাডিয়েন্ট আরম্ভের রঙ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "স্কাইডোম চিত্র" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "মাউস ঘোরানোর সময় স্বচ্ছতা" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "উন্মুক্ত করা" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ঘনকটি উন্মুক্ত করা" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "ডিবাস" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ডিবাস নিয়ন্ত্রণ ব্যাকএন্ড" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "অলঙ্করণ টেক্সচারে মিপম্যাপ তৈরী করতে দিন" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "কমান্ড '%1'" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "যদি কোন ডেকোরেটর আগে থেকে কাজ না করেন সেক্ষেত্রে যে ডেকোরেটর নির্দেশ লাইন ব্যবহৃত " "হবে" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "প্রচ্ছায়া অফসেট X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "প্রচ্ছায়া অফসেট Y" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "যে উইন্ডোগুলি অলঙ্করণ করা হবে" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "যে উইন্ডোগুলি ছায়াযুক্ত করা হবে" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # label text #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "সময়" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ধারন করে" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "স্থানীয় সময়" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ছোট করা/খোলা/বন্ধ করার ওপর মলিনতার প্রভাব" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "স্থানীয় সময়" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "উইন্ডো ছোট করা/খোলা/বন্ধ করার ওপর মলিনতার প্রভাব" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "সিস্টেম বিপে মলিনতার প্রভাব" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ম্যাপ করার সময় উইন্ডো ফেড ইন করা এবং আনম্যাপ করার সময় উইন্ডো ফেড আউট করা" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "পূর্ণস্ক্রিনের দৃশ্যমান বেল" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "সিস্টেম বিপে পূর্ণ পর্দার মলিন প্রভাব" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "দৃশ্যমান বেল" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "উইন্ডো মলিন হওয়ার গতি" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "স্কেল প্রণালীতে উইন্ডোগুলি স্কেল করা" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "যে উইন্ডোগুলি মলিন করা হবে" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "মাউন্ট বিন্দু" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "মাউন্ট বিন্দু" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ইউজারস্পেস ফাইল সিস্টেম" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ইউজারস্পেস ফাইল সিস্টেম" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf নিয়ন্ত্রণ ব্যাকএন্ড" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib প্রধান লুপ সমর্থন" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "একটি টার্মিনাল খুলুন" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ডায়ালগ চালনা করা" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "প্রধান মেনু প্রদর্শন করা" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "চালনা করার অনুপ্রয়োগ ডায়ালগ প্রদর্শন করা" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "প্রধান তালিকা প্রদর্শন" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "একটি স্ক্রিনশট নিন" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "উইন্ডোর একটি স্ক্রিনশট নিন" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "উইন্ডো স্ক্রিনশট নির্দেশ লাইন" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini ফ্ল্যাট ফাইলের ব্যাকএন্ড" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ফাইল পরিবর্তন ঘোষণাকারী প্লাগইন" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "আইনোটিফাই" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig নিয়ন্ত্রণ ব্যাকএন্ড" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "প্রভাব সর্বনিম্ন করা" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "উইন্ডোগুলি ছোট করা" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "সর্বনিম্ন করার গতি" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "স্হানীয় সময়" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "শেড প্রতিরোধ" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "শেড প্রতিরোধ" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "উইন্ডোগুলি ছোট এবং বড় করার সময় সেগুলি স্থানান্তরিত করে" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "উইন্ডো ছোট করার সময় যে উইন্ডোগুলি স্থানান্তরিত করা হবে" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "ধারন করে" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ওয়ার্কস্পেস ক্ষেত্রে Y স্থানাঙ্ককে সীমাবদ্ধ করুন" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "সরানোর কার্যটি সমাপ্ত না হওয়া পর্যন্ত সার্ভারের-দিকে অবস্থিত উইন্ডোগুলি আপডেট করবেন " "না" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "উইন্ডো সরানো আরম্ভ করা" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "অলস অবস্থান নির্ণয়" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "উইন্ডো সরানো" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "অস্বচ্ছতা" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "চলমান উইন্ডোর অস্বচ্ছতার স্তর" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "টানার সময় বড় করা উইন্ডোকে স্ন্যাপঅফ করা এবং স্বয়ংক্রিয়ভাবে ছোট করা" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "স্ন্যাপঅফ সর্বাধিক উইন্ডো" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "অস্বচ্ছতা হ্রাস করুন" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "অস্বচ্ছতা বৃদ্ধি করুন" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "অস্বচ্ছতা পরিবর্তনের ধাপ" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "অস্বচ্ছতা পরিবর্তনের ধাপ" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "অস্বচ্ছতার ধাপ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "চলমান উইন্ডোর অস্বচ্ছতার স্তর" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ঘোরানোর সময় অস্বচ্ছতা" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "অস্বচ্ছতা উইন্ডোর মূল্যগুলি" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলির অবস্থান নির্ণয় করা হবে" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলি অর্ধস্বচ্ছ করা হবে" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলির অবস্থান নির্ণয় করা হবে" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "উইন্ডো স্থাপনের জন্য ব্যবহৃত অ্যালগোরিদম" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "কাসকেড" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "কেন্দ্রীভূত" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "উইন্ডো পরিচালনা" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "অনুভূমিক ভিউপোর্টের অবস্থান" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "উইন্ডোগুলি স্থাপন করা" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ম্যাপ করার পর উপযুক্ত স্থানে উইন্ডোগুলি স্থাপন করুন" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "প্রতিস্থাপন প্রণালী" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "অবস্থানযুক্ত উইন্ডো" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ইচ্ছামত" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "যদি একাধিক আউটপুট ডিভাইস ব্যবহার করা হয় তাহলে উইন্ডোগুলি কোথায় স্কেল করা হবে তা " "নির্বাচন করে" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "স্মার্ট" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "সব আউটপুট ডিভাইসে" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "উল্লম্ব ভিউপোর্ট অবস্থান" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ভিউপোর্ট অবস্থানের উইন্ডো" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "উইন্ডো প্রতিস্থাপন ওয়ার্কএরাউন্ড" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলির অবস্থান নির্ণয় করা হবে" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "প্রথাস্বরূপভাবে যে ভিউপোর্টে উইন্ডোগুলি রাখা হবে " #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ওয়ার্কএরাউন্ড" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X অবস্থান" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ভিউপোর্ট অবস্থান" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X অবস্থানের মূল্য" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y অবস্থান" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ভিউপোর্ট অবস্থান" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y অবস্থানের মূল্য" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png চিত্র লোডকারী" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "রিগেক্স মেলানো" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "রিগেক্স উইন্ডো মেলানো" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "প্রান্তরেখার রঙ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "বহির্রেখা এবং আয়তাকার পুনরাকৃতি প্রণালীতে ব্যবহৃত প্রান্তরেখার রঙ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "প্রথাস্বরূপ পুনরাকৃতির প্রণালী" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "উইন্ডো পুনরাকৃতির জন্য প্রথাস্বরূপ প্রণালী" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "রঙ পূর্ণ করা" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "আয়তাকার পুনরাকৃতি প্রণালীর জন্য ব্যবহৃত পূর্ণকরণ রঙ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "বহির্রেখা" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "পুনরাকার উইন্ডোর বহির্রেখা" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "আয়তক্ষেত্র" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "উইন্ডোর আকার পরিবর্তন করা" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "উইন্ডোর আকার পরিবর্তন করা" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "উইন্ডোর আকার পরিবর্তন শুরু করুন" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "উইন্ডোটি বিস্তৃত করে উইন্ডোর আকার পরিবর্তন শুরু করুন" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "আয়তক্ষেত্র দিয়ে উইন্ডোর আকার পরিবর্তন শুরু করুন" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "প্রসারিত করা" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "যে উইন্ডোর জন্য স্বাভাবিক পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "যে উইন্ডোর জন্য বহির্রেখা পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "যে উইন্ডোর জন্য আয়তাকার পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "যে উইন্ডোর জন্য বিস্তৃতি পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr " DnD প্রান্ত ফ্লিপ করা" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "প্রান্তের ফ্লিপ সরানো" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "প্রান্তের ফ্লিপ নির্দেশক" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "স্থানীয় সময়" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "বাঁদিকের ভিউপোর্টে ফ্লিপ করা এবং নির্দেশকটি মুড়িয়ে দেওয়া " #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "বস্তুটিকে স্ক্রিনের প্রান্তে টানার সময় পরবর্তী ভিউপোর্টে ফ্লিপ করুন" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "নির্দেশকটিকে স্ক্রিনের প্রান্তে সরানোর সময় পরবর্তী ভিউপোর্টে ফ্লিপ করুন" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "নির্দেশকটিকে স্ক্রিনের প্রান্তে সরানোর সময় পরবর্তী ভিউপোর্টে ফ্লিপ করুন" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ডানদিকের ভিউপোর্টে ফ্লিপ করা এবং নির্দেশকটি মুড়িয়ে দেওয়া " #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "নির্দেশক সরানোর জন্য Y অক্ষ উল্টে দিন" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "নির্দেশক উল্টানো Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "নির্দেশক সংবেদনশীলতা" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ঘোরানোর সময় তোলা" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ঘোরানোর সময় উইন্ডোটি তোলা" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ফ্লিপ বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ফ্লিপকে ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "উইন্ডো সহ বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "উইন্ডো সহ ডানদিকে ঘোরানো" # স্বয়ংক্রীয় #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ফেস 1 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "উইন্ডো সহ ফেস 1 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ফেস 10 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "উইন্ডো সহ ফেস 10 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ফেস 11 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "উইন্ডো সহ ফেস 11 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ফেস 12 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "উইন্ডো সহ ফেস 12 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ফেস 2 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "উইন্ডো সহ ফেস 2 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "উইন্ডো সহ ফেস 3 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "উইন্ডো সহ ফেস 4 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "উইন্ডো সহ ফেস 5 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "উইন্ডো সহ ফেস 6 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "উইন্ডো সহ ফেস 7 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "উইন্ডো সহ ফেস 8 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "উইন্ডো সহ ফেস 9 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ডেস্কটপ ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "বাঁদিকে ঘোরানো এবং সক্রিয় উইন্ডো নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ডানদিকে ঘোরানো এবং সক্রিয় উইন্ডো নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "উইন্ডো সহ ফেস 1 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "ফেস 1 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ফেস 10 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "ফেস 10 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ফেস 11 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "ফেস 11 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ফেস 12 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "ফেস 12 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ফেস 2 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "ফেস 2 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "ফেস 3 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "ফেস 4 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "ফেস 5 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "ফেস 6 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "ফেস 7 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "ফেস 8 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "ফেস 9 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ভিউপোর্টে ঘোরানো" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "উইন্ডো ঘোরানো" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "উইন্ডো দিয়ে ঘোরানো" # নির্বাচন #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "নির্বাচন " # label text #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "সময়" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "নির্দেশকের চলাচলের সংবেদনশীলতা " #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে স্ন্যাপ করা " #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে স্ন্যাপ করা " #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ওপরের ফেসে স্ন্যাপ করুন" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ওপরের ফেসে স্ন্যাপ করুন" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ফ্লিপিং ভিউপোর্টের আগে সময়অতিক্রান্ত হয়েছে" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "জুম" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "অস্বচ্ছতার শতকরা পরিমাণ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "বড়" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ডেস্কটপ প্রদর্শন করার জন্য ডেস্কটপে ক্লিক করুন" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "উইন্ডো স্কেল করার সময় পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "প্রতীক" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "স্কেল করার সময় ডেস্কটপে যখন ক্লিক করা হবে তখন ডেস্কটপ প্রণালী প্রদর্শন প্রবেশ করান " #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ঘুরে বেড়ানোর সময়" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ভারত" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "সব উইন্ডোর জন্য উইন্ডো পিকার আরম্ভ করা" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "সব উইন্ডো শ্রেণীর জন্য উইন্ডো পিকার আরম্ভ করা" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "বর্তমান আউটপুটের উইন্ডোর জন্য উইন্ডো পিকার আরম্ভ করা" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "সব উইন্ডোগুলির বিন্যাস করছে এবং রূপান্তরিত করছে" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "উইন্ডো শ্রেণীর বিন্যাস করছে এবং রূপান্তরিত করছে" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "উইন্ডোগুলির বিন্যাস করছে এবং রূপান্তরিত করছে" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "বর্তমান আউটপুটের উইন্ডোগুলির বিন্যাস করা এবং তার রূপান্তর শুরু করা" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "সব আউটপুট ডিভাইসে" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "বর্তমান আউটপুট ডিভাইসে" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ওভারলে চিত্রসংকেত" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "উইন্ডোগুলিকে স্কেল করার পর সেগুলির ওপর চিত্রসংকেত স্থাপন করুন" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "স্ক্যানার" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "বিস্তারিত দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "স্হানীয় সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "স্হানীয় সময়" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "যদি একাধিক আউটপুট ডিভাইস ব্যবহার করা হয় তাহলে উইন্ডোগুলি কোথায় স্কেল করা হবে তা " "নির্বাচন করে" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "স্পেন" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "উইন্ডোর ওপর ঘুরে বেড়ানোর সময় স্কেল প্রণালী বন্ধ করার পূর্ববর্তী সময় (মিনিটে)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "স্কেল প্রণালীতে উইন্ডোগুলি স্কেল করা" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "এই অনুপ্রয়োগে স্ক্রিনশটগুলি স্বয়ংক্রিয়ভাবে খুলে যায়" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ডিরেক্টরী" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "ভারত" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "স্থাপনকার্যের অনুপ্রয়োগ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "এই ডিরেক্টরীর স্ক্রিনশট চিত্রগুলি স্থাপন করা" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg " #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg চিত্র লোডার" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "উজ্জ্বলতার শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "সম্পৃক্তির শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "অনুপ্রয়োগ পরিবর্তনকারী" # স্বয়ংক্রীয় #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "বুটের সময়" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "নির্বাচিত উইন্ডোটিকে সামনে নিয়ে আসা" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "উইন্ডো পরিবর্তন করার সময় দূরের ডেস্কটপটির জুম আউট করা হবে" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "চিত্রসংকেত" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ছোট করা হয়েছে" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ডেস্কটপ তল" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "পরবর্তী উইন্ডো" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "পরবর্তী উইন্ডো (সব উইন্ডোগুলি)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "পরবর্তী উইন্ডো (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "পপআপ পরিবর্তনকারী দেখা না গেলে পরবর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "পপআপ পরিবর্তনকারী দেখা না গেলে সব উইন্ডোগুলির মধ্যে পরবর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "পপআপ পরিবর্তনকারী দেখা না গেলে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "পপআপ পরিবর্তনকারী দেখা না গেলে সব উইন্ডোগুলির মধ্যে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "পূর্ববর্তী স্লাইড" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "পূর্ববর্তী উইন্ডো " #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "পূর্ববর্তী উইন্ডো (সব উইন্ডোগুলি)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "পূর্ববর্তী উইন্ডো (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "পরিবর্তন করার সময় নির্বাচিত উইন্ডোটি ঘোরান" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "পপআপ উইন্ডো না দেখিয়ে পরবর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "পপআপ উইন্ডো না দেখিয়ে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "পপআপ উইন্ডো না দেখিয়ে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "থাম্বনেলের পরবর্তী চিত্রসংকেত প্রদর্শন করা" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "বিস্তারিত দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "স্হানীয় সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "স্হানীয় সময়" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "সুইচারে যে উইন্ডোগুলি প্রদর্শন করা হবে" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 কালারস্পেস সমর্থন প্রদান করা" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ভিডিও প্লেব্যাক" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ভিডিও প্লেব্যাক" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 কালারস্পেস" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "লাইন যুক্ত করা" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "বিন্দু যুক্ত করা" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "বিভিন্ন ডেস্কটপ কার্যাবলীতে জলের প্রভাব প্রয়োগ করা" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "প্রত্যেক বৃষ্টির ফোঁটার মধ্যে ব্যবধান (মিনিটে)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "পয়েন্টার জলের প্রভাব সমর্থ করা" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "লাইন" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "অফসেট স্কেল" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "বিন্দু" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "বৃষ্টির বিলম্ব" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "শীর্ষ তরঙ্গ" # why not "token ring"? #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "টোকেন রিং" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "জলের প্রভাব" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "জলের অফসেট স্কেল" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "উইন্ডো শীর্ষ থেকে জলের প্রভাব" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ফোকাসের প্রভাব" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ফোকাস উইন্ডো প্রভাব" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ফোকাস উইন্ডো " #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "পার্টিশন" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "বিস্তারিত দেখাও (&d)" # দ্বন্দ্ব #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "দ্বন্দ্ব মীমাংসা:" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "উল্টো উইন্ডো স্ন্যাপিং" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "উইন্ডোটিকে কাঁপানো" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "ম্যাপ প্রভাব" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ম্যাপ উইন্ডো প্রভাব" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "সর্বোচ্চ প্রভাব" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "সর্বনিম্ন গ্রিড আকার" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "সর্বনিম্ন শীর্ষ গ্রিডের আকার" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "কম্পন" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "স্ন্যাপ উল্টানো" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "পার্টিশন" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ধাপে ধাপে আগানো" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ধাপে ধাপে আগানো" # why not "token ring"? #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "টোকেন রিং" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "টলমল উইন্ডো প্রভাবের ক্ষেত্রে স্প্রিং ব্যবহার করুন" # দ্বন্দ্ব #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "দ্বন্দ্ব মীমাংসা:" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ফোকাস করার সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ধরার সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ম্যাপ করার সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "সরানোর সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "উইন্ডোগুলি সর্বাধিক করা বা না করার সময় টলমল করার প্রভাব" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "টলমলে উইন্ডো" #, fuzzy #~ msgid "Command line 0" #~ msgstr "কমান্ড '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "কমান্ড '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ফিল্টার:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "জুম ইন করার সময় রৈখিক ফিল্টার ব্যবহার করুন" # label text #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "সময়" #~ msgid "Zoom In" #~ msgstr "জুম ইন" #~ msgid "Zoom Out" #~ msgstr "জুম আউট" #~ msgid "Zoom Pan" #~ msgstr "জুম প্যান" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "সময়" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ডেস্কটপ ঘনক জুম করা এবং প্যান করা" #~ msgid "Zoom factor" #~ msgstr "জুম ফ্যাক্টর" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "বাদ দেয়া হয়েছে\n" #~ msgid "Decrease window opacity" #~ msgstr "উইন্ডোর অস্বচ্ছতা হ্রাস করুন" #~ msgid "Increase window opacity" #~ msgstr "উইন্ডোর অস্বচ্ছতা বৃদ্ধি করুন" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "উইন্ডোর যে অস্বচ্ছতাকে প্রথাস্বরূপভাবে অর্ধস্বচ্ছ করা হবে" #~ msgid "Opacity windows" #~ msgstr "অস্বচ্ছতা উইন্ডো" #~ msgid "Background Images" #~ msgstr "পটভূমির চিত্রগুলি" #~ msgid "Background images" #~ msgstr "পটভূমির চিত্রগুলি" # why not "token ring"? #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "টোকেন রিং" #~ msgid "Plane Down" #~ msgstr "নিচের তল" #~ msgid "Plane Left" #~ msgstr "বাঁদিকের তল" #~ msgid "Plane Right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane To Face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane To Face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane To Face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane To Face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane To Face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane To Face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane To Face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane To Face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane To Face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane To Face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane To Face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane To Face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane Up" #~ msgstr "ওপরের তল" #~ msgid "Plane down" #~ msgstr "নিচের তল" #~ msgid "Plane left" #~ msgstr "বাঁদিকের তল" #~ msgid "Plane right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane to face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane to face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane to face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane to face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane to face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane to face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane to face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane to face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane to face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane to face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane to face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane to face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane up" #~ msgstr "ওপরের তল" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ডেস্কটপের উইন্ডো অস্বচ্ছতা মলিন হওয়ার সময়." #, fuzzy #~ msgid "Notification" #~ msgstr "পার্টিশন" # label for an unknown installed system # try to use simple words #~ msgid "Unknown" #~ msgstr "অজানা" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "বিস্তারিত দেখাও (&d)" # নির্বাচন #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "নির্বাচন " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "রাশিয়ান" # নির্বাচন #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "নির্বাচন " # label text #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "স্হানীয় সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "স্হানীয় সময়" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "পার্টিশন" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ধাপে ধাপে আগানো" # দ্বন্দ্ব #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "দ্বন্দ্ব মীমাংসা:" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Command line %d" #~ msgstr "কমান্ড '%1'" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ফ্লপি ডিস্ক" #, fuzzy #~ msgid "Terminate" #~ msgstr "প্রিন্টার" ./po/en_US.po0000644000004100000410000015346713246301623013252 0ustar www-datawww-data# English message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-07-09 16:58+0530\n" "PO-Revision-Date: 2002-07-18 14:04+0200\n" "Last-Translator: proofreader \n" "Language-Team: English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4417 #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.h:154 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4442 #: ../metadata/core.xml.in.h:85 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4484 #: ../metadata/core.xml.in.h:91 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4601 #: ../metadata/core.xml.in.h:161 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4620 msgid "Shade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4640 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4666 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4686 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4706 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4732 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5089 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5098 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5113 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Previous" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Previous" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Previous" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:24 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Terse output" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 #, fuzzy msgid "Detect Outputs" msgstr "Terse output" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:59 #, fuzzy msgid "Focus Prevention Level" msgstr "Previous" #: ../metadata/core.xml.in.h:60 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:61 #, fuzzy msgid "Focus prevention windows" msgstr "Previous" #: ../metadata/core.xml.in.h:62 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.h:63 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "High" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Low" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Off" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:149 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:150 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:151 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:152 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:153 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:155 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:156 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:157 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:158 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:159 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.h:160 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.h:162 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:163 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:164 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:165 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Invalid relation" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Fold Acceleration" msgstr "Invalid relation" #: ../metadata/cube.xml.in.h:14 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:16 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:25 ../metadata/place.xml.in.h:7 #: ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:28 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:33 #, fuzzy msgid "Place windows on cube" msgstr "Previous" #: ../metadata/cube.xml.in.h:34 #, fuzzy msgid "Prev Slide" msgstr "Previous" #: ../metadata/cube.xml.in.h:35 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:43 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:44 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:39 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:47 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Previous" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Previous" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Previous" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Previous" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Previous" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 #, fuzzy msgid "Fade windows" msgstr "Previous" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fading Windows" msgstr "Previous" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Previous" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Previous" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Previous" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Previous" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:18 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Previous" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Previous" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Force Placement Windows" msgstr "Previous" #: ../metadata/place.xml.in.h:5 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:8 #, fuzzy msgid "Place Windows" msgstr "Previous" #: ../metadata/place.xml.in.h:9 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Positioned windows" msgstr "Previous" #: ../metadata/place.xml.in.h:13 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Viewport positioned windows" msgstr "Previous" #: ../metadata/place.xml.in.h:21 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:26 #, fuzzy msgid "X Positions" msgstr "Previous" #: ../metadata/place.xml.in.h:27 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:28 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:29 #, fuzzy msgid "Y Positions" msgstr "Previous" #: ../metadata/place.xml.in.h:30 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 #, fuzzy msgid "Normal Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Resize Window" msgstr "Previous" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize window" msgstr "Previous" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window normally" msgstr "Previous" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window with outline" msgstr "Previous" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 #, fuzzy msgid "Stretch Resize Windows" msgstr "Previous" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate window" msgstr "Previous" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate with window" msgstr "Previous" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotation Acceleration" msgstr "Invalid relation" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotation Speed" msgstr "Registration key" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotation Timestep" msgstr "Registration key" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotation Zoom" msgstr "Registration key" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:41 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 #, fuzzy msgid "Scale Windows" msgstr "Previous" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 #, fuzzy msgid "Scale windows" msgstr "Previous" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 #, fuzzy msgid "Space between windows" msgstr "Previous" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 #, fuzzy msgid "Put screenshot images in this directory" msgstr "Recurse into the directory" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next window" msgstr "Previous" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window (All windows)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (No popup)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:23 #, fuzzy msgid "Prev Panel" msgstr "Previous" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev window" msgstr "Previous" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window (All windows)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (No popup)" msgstr "Previous" #: ../metadata/switcher.xml.in.h:27 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Select next panel type window." msgstr "Previous" #: ../metadata/switcher.xml.in.h:30 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:31 #, fuzzy msgid "Select previous panel type window." msgstr "Previous" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:34 #, fuzzy msgid "Show minimized windows" msgstr "Previous" #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Switcher speed" msgstr "Previous" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher timestep" msgstr "Previous" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher windows" msgstr "Previous" #: ../metadata/switcher.xml.in.h:40 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "No confirmation" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Previous" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Previous" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 #, fuzzy msgid "Zoom Speed" msgstr "Registration key" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 #, fuzzy msgid "Zoom pan" msgstr "Registration key" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Previous" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Previous" #, fuzzy #~ msgid "Plane down" #~ msgstr "Previous" #, fuzzy #~ msgid "Plane up" #~ msgstr "Terse output" #, fuzzy #~ msgid "Dialog" #~ msgstr "Catalog" #, fuzzy #~ msgid "Notification" #~ msgstr "No confirmation" #, fuzzy #~ msgid "Unknown" #~ msgstr "unknown" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Previous" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Invalid relation" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Registration key" ./po/mk.po0000644000004100000410000017117313246301623012642 0ustar www-datawww-data# Macedonian message file for YaST2 (@memory@). # Copyright (C) 2006 SUSE Linux Products GmbH. # Зоран Димовски # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2001-07-17 16:12+0200\n" "Last-Translator: Зоран Димовски \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n>1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Постави филтер" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Постави филтер" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Постави филтер" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Руски" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Руски" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Руски" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Руски" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Руски" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Постави филтер" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Постави филтер" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Постави филтер" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Руски" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Постави филтер" ./po/zh_CN.po0000644000004100000410000035546413246301623013243 0ustar www-datawww-data# Compiz chinese translation. # Copyright (C) 2008 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the compiz package. # JING Cheng 2008 # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-05-16 19:20+0200\n" "Last-Translator: JING Cheng \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "桌面" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "窗口管理" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "无" # 此功能完全不能用调整大小来描述,我找这个功能找了N久,才发现:调整大小! = =; #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "阴影" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "最大化" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "水平方向最大化" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "垂直方向最大化" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "最小化" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "升起" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "降下" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "窗口菜单" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "鼠标滚轮在窗口标题栏上的动作" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "模糊类型" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity主题活动窗口透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity 主题活动窗口不透明阴影" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity主题透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity主题阴影" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "以Metacity主题为装饰器的活动窗口使用的透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "metacity主题装饰器使用的透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "以metacity主题装饰器为活动窗口添加透明渐变效果" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "以metacity主题装饰器为窗口添加透明渐变效果" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "标题栏鼠标滚轮动作" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "窗口装饰使用的模糊类型" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "使用metacity主题" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "绘制窗口装饰时使用metacity主题" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "关闭窗口" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "恢复窗口" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "最大化窗口" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "最小化窗口" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "置于上面" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "粘滞窗口" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "去除阴影" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "取消顶置" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "取消粘滞" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "窗口\"%s\"无响应" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "强制退出此应用程序将导致你丢失未保存的数据。" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "强制退出(_F)" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "注解" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "注解填充颜色" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "注解描边颜色" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "注解插件" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "清除" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "绘制" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "使用工具绘制" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "注解使用的填充颜色" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "启动" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "启动注释绘制" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "启动注释擦除" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "启动擦除" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "线宽" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "注释使用的线条宽度" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "注释描边使用的颜色" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "描边宽度" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "注释使用的描边宽度" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4倍双线性过滤" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha朦胧" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alpha朦胧窗口" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "朦胧滤镜" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "模糊咬合" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "柔化饱和度" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "柔化速度" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "柔化窗口" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "柔化半透明窗口后部" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "柔化饱和度" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "柔化窗口" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "对非当前窗口采取柔化" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "不对其它窗口遮挡的屏幕部分进行柔化" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "过滤用于柔化的方法" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "焦点柔化" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "聚焦柔化窗口" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "高斯柔化" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "高斯柔化半径" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "高斯柔化力度" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "高斯柔化半径" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "高斯柔化力度" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "独立纹理取回" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap细节层次" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "脉冲" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "脉冲效果" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "使用现存的纹理单位尽可能多的进行独立纹理取回" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "窗口柔化速度" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "应被聚焦柔化影响的窗口" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "应该默认使用alpha柔化的窗口" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "克隆输出" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "初始化克隆选取区域" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "输出克隆处理程序" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "一个按钮绑定,调用时将运行由command0定义的shell命令" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "一个按钮绑定,调用时将运行由command1定义的shell命令" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "一个按钮绑定,调用时将运行由command10定义的shell命令" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "一个按钮绑定,调用时将运行由command11定义的shell命令" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "一个按钮绑定,调用时将运行由command2定义的shell命令" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "一个按钮绑定,调用时将运行由command3定义的shell命令" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "一个按钮绑定,调用时将运行由command4定义的shell命令" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "一个按钮绑定,调用时将运行由command5定义的shell命令" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "一个按钮绑定,调用时将运行由command6定义的shell命令" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "一个按钮绑定,调用时将运行由command7定义的shell命令" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "一个按钮绑定,调用时将运行由command8定义的shell命令" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "一个按钮绑定,调用时将运行由command9定义的shell命令" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "一个按钮绑定,调用时将运行由command0定义的shell命令" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "一个按键绑定,调用时将运行由command1定义的shell命令" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "一个按键绑定,调用时将运行由command10定义的shell命令" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "一个按键绑定,调用时将运行由command11定义的shell命令" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "一个按键绑定,调用时将运行由command2定义的shell命令" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "一个按键绑定,调用时将运行由command3定义的shell命令" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "一个按键绑定,调用时将运行由command4定义的shell命令" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "一个按键绑定,调用时将运行由command5定义的shell命令" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "一个按键绑定,调用时将运行由command6定义的shell命令" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "一个按键绑定,调用时将运行由command7定义的shell命令" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "一个按键绑定,调用时将运行由command8定义的shell命令" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "一个按键绑定,调用时将运行由command9定义的shell命令" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "一个边缘绑定,调用时将运行由command0定义的shell命令" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "一个边缘绑定,调用时将运行由command1定义的shell命令" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "一个边缘绑定,调用时将运行由command10定义的shell命令" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "一个边缘绑定,调用时将运行由command11定义的shell命令" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "一个边缘绑定,调用时将运行由command2定义的shell命令" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "一个边缘绑定,调用时将运行由command3定义的shell命令" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "一个边缘绑定,调用时将运行由command4定义的shell命令" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "一个边缘绑定,调用时将运行由command5定义的shell命令" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "一个边缘绑定,调用时将运行由command6定义的shell命令" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "一个边缘绑定,调用时将运行由command7定义的shell命令" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "一个边缘绑定,调用时将运行由command8定义的shell命令" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "一个边缘绑定,调用时将运行由command9定义的shell命令" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "为任意命令分配绑定" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "按钮绑定" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "命令行1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "命令行10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "命令行11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "命令行12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "命令行2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "命令行3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "命令行4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "命令行5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "命令行6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "命令行7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "命令行8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "命令行9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "调用run_command0时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "调用run_command1时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "调用run_command10时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "调用run_command11时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "调用run_command2时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "调用run_command3时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "调用run_command4时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "调用run_command5时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "调用run_command6时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "调用run_command7时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "调用run_command8时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "调用run_command9时要在shell中执行的命令行" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "命令" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "边缘绑定" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "按键绑定" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "运行命令1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "运行命令10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "运行命令11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "运行命令12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "运行命令2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "运行命令3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "运行命令4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "运行命令5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "运行命令6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "运行命令7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "运行命令8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "运行命令9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "活动插件" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "允许全屏窗口的绘制不重定向到屏幕外的象素映射" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "可闻铃声" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "可听见的系统响铃" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "自动升起" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "自动升起延迟" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "自动检测输出设备" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "自动检测刷新率" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "最佳" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "点击聚焦" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "点击窗口将输入焦点移至它" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "关闭激活的窗口" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "默认图标" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "默认窗口图标图像" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "桌面尺寸" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "检测输出" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "检测刷新率" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "显示设置" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "边缘动作执行前,鼠标指针必须置于屏幕的一个边缘" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "边缘触发延迟" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "快速" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "聚焦与升起行为" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "焦点保护级别" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "阻碍焦点窗口" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "阻碍焦点窗口" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "强制独立输出绘图" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "常规选项" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "compiz常规选项" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "好" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "隐藏跳过任务栏窗口" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "隐藏所有窗口并聚焦于桌面" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "进入显示桌面模式时隐藏不在任务栏中的窗口" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "高" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "水平虚拟尺寸" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "如果可能,对从图片转换来的纹理进行压缩" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "最大化时忽略提示" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "最大化窗口时忽略尺寸递增和外观提示" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "升起所选窗口前的时间间隔" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "ping消息之间的间隔" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "功能键" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "聚焦预防的级别" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "光线" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "当前活动的插件列表" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "描述输出设备的字符串列表" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "低" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "降低窗口" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "将窗口降到其它窗口以下" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "水平方向最大化窗口" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "垂直方向最大化窗口" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "最大化激活的窗口" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "水平方向最大化激活的窗口" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "垂直方向最大化激活的窗口" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "最小化激活的窗口" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "常规" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "桌面数量" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "虚拟桌面的数量" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "关闭" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "只在垂直清屏期间执行屏幕更新" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "输出" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "重叠输出处理" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "单独绘制每个输出设备,即便输出设备重复" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping延迟" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "首选较大的输出" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "首选较小的输出" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "点击时升起" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "升起窗口" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "在间隔一段时间后升起选中窗口" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "将窗口升起到其它窗口之上" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "点击时升起窗口" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "刷新率" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "水平虚拟尺寸的放大倍数" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "垂直虚拟尺寸的放大倍数" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "显示桌面" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "慢速动画" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "智能模式" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "与VBlank同步" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "纹理压缩" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "纹理过滤器" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "纹理过滤" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "屏幕重绘速率(次/秒)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "切换最大化的窗口" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "将窗口水平方向切换到最大化" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "将窗口垂直方向切换到最大化" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "将窗口切换到遮蔽" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "将激活的窗口切换到最大化" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "将激活的窗口水平方向切换到最大化" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "将激活的窗口垂直方向切换到最大化" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "将激活的窗口切换到遮蔽" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "切换使用慢速动画" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "恢复激活的窗口" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "取消重定向全屏窗口" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "转换屏幕时使用漫射光" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "垂直虚拟尺寸" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "很高" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "哪个重叠输出设备将成为首选" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "窗口菜单按钮绑定" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "窗口菜单按键绑定" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "加速" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "调整图像" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "调整顶部图像以旋转" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "前进到下一个滑块" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "制作动画天穹" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "旋转立方体时制作动画天穹" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "外观" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "自动" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "特性" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "立方体顶面和底面的颜色" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "天穹降色渐变使用的底部结束颜色" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "天穹降色渐变使用的顶部结束颜色" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "立方体顶盖" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "立方体颜色" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "桌面立方体" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "折叠加速" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "折叠速度" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "折叠时间步长" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "有可能时生成mipmaps用于更高质量的缩放比例" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "返回上一个滑块" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "图像文件" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "用作穹顶纹理的图像" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "仅当旋转由鼠标驱动时启用立方体透明" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "立方体内部" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "立方体旋转时使用内部视角" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "应渲染于立方体顶面的PNG和SVG文件列表" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "多重输出模式" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "多个立方体" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "下一个滑块" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "单一大立方体" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "旋转时的不透明度" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "不旋转时的不透明度" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "旋转时桌面窗口的不透明度。" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "不旋转时桌面窗口的不透明度。" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "将窗口放置在立方体上" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "上一个滑块" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "渲染穹顶" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "按比例调整图像大小" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "调整图像大小以覆盖立方体的顶面" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "选择当使用多个输出设备时立方体的显示方式。" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "天穹" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "天穹渐变结束颜色" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "天穹渐变起始颜色" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "天穹图像" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "速度" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "时间步长" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "仅当用鼠标旋转时透明" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "透明立方体" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "展开" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "展开立方体" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus控制后端" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "允许为装饰纹理生成mipmap" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "命令" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "装饰窗口" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "尚无装饰程序运行时执行的装饰程序命令行" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "阴影X偏移" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "阴影Y偏移" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "阴影颜色" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "阴影不透明度" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "阴影半径" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "阴影颜色" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "阴影X偏移" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "阴影Y偏移" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "阴影不透明度" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "阴影半径" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "阴影窗口" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "窗口装饰" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "窗口装饰" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "应装饰的窗口" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "应有阴影的窗口" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "未响应窗口的亮度(%)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "恒定旋转速度" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "恒定旋转时间" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "暗化无反应窗口" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "暗化对窗口管理器请求无反应的窗口" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "渐隐模式" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "当最小化/打开/关闭时渐隐" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "渐隐速度" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "渐隐时间" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "产生窗口最小化/打开/关闭事件时使用渐隐效果" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "系统嘟嘟声时使用渐隐效果" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "映射时渐现窗口和不映射时渐弱窗口" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "渐隐窗口" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "渐隐窗口" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "全屏静音" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "系统嘟嘟声的全屏渐隐效果" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "无反应窗口的饱和度百分比" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "无反应窗口的亮度" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "无反应窗口的饱和度" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "视觉振铃" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "窗口渐隐模式" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "窗口渐隐速度设于恒定速度模式" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "窗口渐隐时间(秒)设于恒定时间模式" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "应渐隐的窗口" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "挂载点" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "挂载点" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "用户空间文件系统" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "用户空间文件系统" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf控制后端" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib主循环支持" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome兼容性" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "打开一个终端窗口" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "使Compiz兼容Gnome桌面环境的选项" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "运行对话框" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "运行终端命令" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "截屏命令行" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "显示主菜单" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "显示运行应用程序对话框" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "显示主菜单" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "拍摄截屏" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "拍摄窗口截屏" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "终端命令行" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "窗口截屏命令行" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "ini纯文本后端" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "文件修改通知插件" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig控制后端" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "最小化效果" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "最小化窗口" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "最小化速度" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "最小化时间步长" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "抗遮蔽性" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "抗遮蔽性" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "最小化和取消最小化时变形窗口" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "最小化时应变形的窗口" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "约束 Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "约束工作空间区域的 Y 坐标" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "结束移动前不更新服务端的位置信息" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "启动窗口移动" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "懒惰定位" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "移动窗口" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "移动窗口" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "不透明度" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "移动窗口的不透明度" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "拖动时删除快照并自动取消窗口的最大化" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "删除最大化窗口快照" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "开始移动窗口" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "亮度" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "调低亮度" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "调高亮度" # 不需要用“亮度调整步幅”吧? #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "调整步幅" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "窗口亮度" # 调低不透明度? #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "减少" # 增加不透明度应该翻成减少透明度才符合中文语言习惯 #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "增加" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "增加透明度" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "减少透明度" # (不)透明度调整步幅 #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "不透明度步长" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "窗口的不透明度数值" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "不透明度、亮度与饱和度" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "调整不透明度、亮度和饱和度" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "饱和度" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "减少饱和度" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "增加饱和度" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "饱和度步长" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "窗口的饱和度数值" # 饱和度调整步幅 #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "调整步长" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "窗口相关设置" # 都特例窗口设置的特殊饱和度数值 #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "窗口值" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "窗口" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "默认使用另一亮度设置的窗口" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "默认使用另一不透明度设置的窗口" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "默认使用另一饱和度的窗口" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "放置窗口所用的算法" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "层叠" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "居中" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "固定窗口放置" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "强制窗口放置" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "水平视图位置" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "保持在工作区" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "保持设置的窗口在工作区,甚至位置可能不同于那特别位置。" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "放置窗口" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "跨越所有输出放置" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "映射时将窗口放置在适当位置" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "安置模式" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "已定位的窗口" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "随机" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "选择当选用了多重输出时窗口放置的行为" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "灵巧" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "使用当前输出设备" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "使用当前窗口的输出设备" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "使用指针所指的输出设备" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "垂直视图位置" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "视图中的定位窗口" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "窗口放置工作区" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "默认应定位的窗口" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "指定视图中默认应定位的窗口" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "即便向窗口管理器提出避免放置的请求,仍应强制放置的窗口" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "位置固定的窗口" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "视口固定的窗口" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "工作区" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X位置" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X视图位置" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X位置取值" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y位置" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y视图位置" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y位置取值" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png图像加载工具" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "正则表达式匹配" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "正则表达式的窗口匹配" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "绑定" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "边框颜色" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "用于描边和矩形大小调整模式的边颜色" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "默认大小调整模式" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "窗口大小调整的默认模式" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "填充颜色" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "用于矩形大小调整模式的填充颜色" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "初始普通窗口大小调整" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "初始化窗口尺寸调整轮廓" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "初始化窗口尺寸调整矩形" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "启动窗口拉伸调整大小" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "启动窗口大小调整" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "普通窗口大小调整" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "轮廓" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "窗口外框大小调整" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "矩形" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "矩形窗口大小调整" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "调整窗口大小" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "调整窗口大小" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "开始调整窗口大小" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "用拉伸调整窗口大小" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "开始如常调整窗口大小" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "开始以轮廓调整窗口大小" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "开始以矩形调整窗口大小" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "拉伸" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "拉伸调整窗口大小" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "正常调整大小的窗口" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "框架调整大小的窗口" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "矩形调整大小的窗口" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "拉伸调整大小的窗口" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD边缘翻转" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "移动边缘翻转" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "指针边缘翻转" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "翻转时间" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "翻转至左视点并弯曲指针" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "将对象拖至屏幕边缘时翻转到下个视点" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "将指针移至屏幕边缘时翻转到下个视点" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "将窗口移至屏幕边缘时翻转到下个视点" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "翻转至右视点并弯曲指针" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "指针移动时反转Y轴" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "指针反转Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "指针灵敏度" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "旋转时升起" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "旋转时升起窗口" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "旋转立方体" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "旋转左翻" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "旋转右翻" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "向左旋转" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "带着窗口向左旋转" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "向右旋转" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "带着窗口向右旋转" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "旋转至" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "旋转至第1面" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "带着窗口旋转至第1面" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "旋转至第10面" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "带着窗口旋转至第10面" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "旋转至第11面" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "带着窗口旋转至第11面" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "旋转至第12面" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "带着窗口旋转至第12面" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "旋转至第2面" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "带着窗口旋转至第2面" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "旋转至第3面" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "带着窗口旋转至第3面" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "旋转至第4面" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "带着窗口旋转至第4面" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "旋转至第5面" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "带着窗口旋转至第5面" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "旋转至第6面" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "带着窗口旋转至第6面" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "旋转至第7面" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "带着窗口旋转至第7面" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "旋转至第8面" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "带着窗口旋转至第8面" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "旋转至第9面" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "带着窗口旋转至第9面" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "旋转立方体" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "旋转桌面立方体" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "向左旋转" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "带着激活的窗口一起向左旋转" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "向右旋转" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "带着激活的窗口一起向右旋转" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "旋转至立方体表面" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "带窗口旋转至立方体表面" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "旋转至第1面" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "带着激活的窗口一起旋转至第1面" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "旋转至第10面" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "带着激活的窗口一起旋转至第10面" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "旋转至第11面" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "带着激活的窗口一起旋转至第11面" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "旋转至第12面" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "带着激活的窗口一起旋转至第12面" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "旋转至第2面" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "带着激活的窗口一起旋转至第2面" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "旋转至第3面" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "带着激活的窗口一起旋转至第3面" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "旋转至第4面" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "带着激活的窗口一起旋转至第4面" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "旋转至第5面" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "带着激活的窗口一起旋转至第5面" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "旋转至第6面" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "带着激活的窗口一起旋转至第6面" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "旋转至第7面" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "带着激活的窗口一起旋转至第7面" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "旋转至第8面" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "带着激活的窗口一起旋转至第8面" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "旋转至第9面" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "带着激活的窗口一起旋转至第9面" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "旋转至视点" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "旋转窗口" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "带窗口旋转" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "旋转加速" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "旋转速度" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "旋转时间步长" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "旋转缩放" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "指针移动灵敏度" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "将立方体快速旋转到底面" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "将立方体快速旋转到顶面" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "瞬移至底面" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "瞬移至顶面" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "开始旋转" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "翻转视点前的超时时间" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "缩放" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "不透明度百分比" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "大" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "由按键绑定触发比例模式" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "由按键绑定触发比例模式,而不是按下时启用之松开时禁用之。" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "点击桌面以显示桌面" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "背景变暗" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "调整窗口大小时背景变暗" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "标志" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "在缩放时,点击桌面会进入显示桌面模式" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "悬停时间" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "启动窗口检出器" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "启动所有窗口的窗口拾取器" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "启动窗口组的窗口拾取器" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "启动当前输出窗口的窗口拾取器" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "由按键绑定触发比例模式" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "由按键绑定触发比例模式,而不是按下时启用之松开时禁用之。" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "对所有窗口调整布局并开始转换" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "对窗口组调整布局并开始转换" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "布局和开始转换窗口" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "对当前输出窗口调整布局并开始转换" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "在所有输出设备上" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "在当前输出设备上" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "覆盖图标" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "缩放窗口时覆盖图标" # 此功能完全不能用调整大小来描述,我找这个功能找了N久,才发现:调整大小! = =; #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "缩放" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "窗口缩放" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "缩放速度" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "缩放时间步长" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "窗口缩放" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "在使用了多重输出设备的情况下选择何处窗口缩放" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "窗口之间的间隔" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "间距" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "悬停在窗口上时比例模式终止前的时间(毫秒)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "缩放模式下应缩放的窗口类型" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "在该应用程序中自动开启截屏" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "目录" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "启动矩形截屏" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "启动应用程序" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "保存截屏图片到此目录" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "截屏" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "截屏插件" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg图像加载工具" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "亮度百分比" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "饱和度百分比" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "应用程序切换条" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "自动旋转" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "置前" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "将选中的窗口放在前面" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "切换窗口时应缩小远距离桌面" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "图标" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "最小化" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "下一个面板" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "下一个窗口" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "下一个窗口(所有)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "下一个窗口(非弹出)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "不可见时弹出切换程序并选择下一个窗口" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "不可见时弹出切换程序并选择所有窗口的下一个窗口" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "不可见时弹出切换程序并选择上一个窗口" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "不可见时弹出切换程序并选择所有窗口的上一个窗口" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "上一个面板" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "上一个窗口" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "上一个窗口(全部窗口)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "上一个窗口(非弹出)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "切换时转到所选窗口" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "选择下一个面板类型窗口。" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "选取下一个窗口,且排除显示弹出窗口。" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "选择前一个面板类型窗口。" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "选取下一个窗口,且排除显示弹出窗口。" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "在缩略图旁边显示图标" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "显示最小化的窗口" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "切换程序速度" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "切换程序时间区间" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "切换程序窗口" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "切换程序中应显示的窗口" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "提供YV12色彩空间支持" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "视频回放" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "视频回放" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12色彩空间" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "增加线" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "增加点" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "将水纹效果添加到不同的桌面操作" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "每次降雨效果之间的延时(以毫秒为单位)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "启用指针水纹效果" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "线" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "偏移比例" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "点" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "降雨延时" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "波浪标题" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "触发降雨" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "触发降雨效果" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "触发雨刷" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "触发雨刷效果" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "水纹效果" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "水纹偏移比例" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "窗口标题的波浪效果" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "聚焦效果" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "聚焦窗口效果" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "聚焦窗口" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "摩擦力" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "捕捉窗口" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "网格分辨率" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "反向窗口吸附" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "使窗口出现碎裂效果" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "映射效果" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "映射窗口效果" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "映射窗口" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "最大化效果" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "网格最小尺寸" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "最小顶点网格大小" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "移动窗口" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "碎裂" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "反向吸附" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "窗口吸附" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "弹性摩擦力" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "弹性K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "弹簧常数" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "切换窗口吸附" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "对震颤窗口效果使用弹性模型" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "顶点网格分辨率" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "聚焦时应采用震颤效果的窗口" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "捕捉时应采用震颤效果的窗口" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "映射时应采用震颤效果的窗口" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "移动时应采用震颤效果的窗口" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "最大化和取消最大化窗口时的震颤效果" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "震颤窗口" #~ msgid "Command line 0" #~ msgstr "命令行0" #~ msgid "Run command 0" #~ msgstr "运行命令0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "截屏命令行" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "截屏命令行" #~ msgid "Filter Linear" #~ msgstr "线性过滤器" #~ msgid "Use linear filter when zoomed in" #~ msgstr "放大时使用线性过滤器" #~ msgid "Zoom Desktop" #~ msgstr "缩放桌面" #~ msgid "Zoom In" #~ msgstr "放大" #~ msgid "Zoom Out" #~ msgstr "缩小" #~ msgid "Zoom Pan" #~ msgstr "缩放盘" #~ msgid "Zoom Speed" #~ msgstr "缩放速度" #~ msgid "Zoom Timestep" #~ msgstr "缩放时间区间" #~ msgid "Zoom and pan desktop cube" #~ msgstr "缩放和桌面立方体" #~ msgid "Zoom factor" #~ msgstr "缩放比例" #~ msgid "Zoom pan" #~ msgstr "缩放盘" #~ msgid "Decrease window opacity" #~ msgstr "增加窗口透明度" # 增加不透明度应该翻成减少透明度才符合中文语言习惯 #~ msgid "Increase window opacity" #~ msgstr "减少窗口透明度" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "默认为半透明的窗口的不透明度" #~ msgid "Opacity window values" #~ msgstr "不透明窗口值" #~ msgid "Opacity windows" #~ msgstr "不透明窗口" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "将窗口放置在立方体上" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Page Down" #, fuzzy #~ msgid "Plane Left" #~ msgstr "逆时针旋转" #, fuzzy #~ msgid "Plane Right" #~ msgstr "顺时针旋转" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Plane down" #~ msgstr "放置窗口" #, fuzzy #~ msgid "Plane left" #~ msgstr "逆时针旋转" #, fuzzy #~ msgid "Plane right" #~ msgstr "顺时针旋转" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane up" #~ msgstr "Page Up" #~ msgid "Open window menu" #~ msgstr "打开窗口菜单" #~ msgid "Dock" #~ msgstr "靠接" #~ msgid "Toolbar" #~ msgstr "工具栏" #~ msgid "Menu" #~ msgstr "菜单" #~ msgid "Utility" #~ msgstr "实用程序" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "对话框" #~ msgid "DropdownMenu" #~ msgstr "下拉菜单" #~ msgid "PopupMenu" #~ msgstr "弹出菜单" #~ msgid "Tooltip" #~ msgstr "工具提示" #~ msgid "Notification" #~ msgstr "通知" #~ msgid "Combo" #~ msgstr "组合" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "模式对话框" #~ msgid "Fullscreen" #~ msgstr "全屏" #~ msgid "Unknown" #~ msgstr "未知" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command10 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command1 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command10 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command11 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command2 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command3 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command4 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command5 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command6 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command7 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command8 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "键绑定在调用时,将运行 command9 确定的 shell 命令" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "亮度百分比" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "不透明度百分比" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "饱和度百分比" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "饱和度" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "每次降雨效果之间的延时(以毫秒为单位)" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "切换窗口时应缩小远距离桌面" #~ msgid "Do not modify" #~ msgstr "不修改" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "减小阴影 X 偏移" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "减小阴影 Y 偏移" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "减小阴影不透明度" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "减小阴影半径" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "聚焦窗口效果(无,碎裂)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "选择上一个窗口" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "折叠加速 (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "折叠速度 (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "折叠时间段落 (0.1-50.0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "俄联邦" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "俄语" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "上升所选窗口前的时间间隔" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "对当前输出窗口调整布局并开始转换" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "图窗口效果(无,碎裂)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "最小化速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "最小化速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "最小顶点栅格大小" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "虚拟桌面数" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "不透明度更改级别" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "移动窗口的不透明度" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "移动窗口的不透明度" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "缩放窗口时覆盖图标" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Plugins that this must load before" #~ msgstr "必须先装载的插件" #~ msgid "Plugins that this requires" #~ msgstr "需要的插件" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "不可见时弹出切换程序并选择所有窗口的下一个窗口" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "不可见时弹出切换程序并选择所有窗口的下一个窗口" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "不可见时弹出切换程序并选择所有窗口的上一个窗口" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "不可见时弹出切换程序并选择所有窗口的上一个窗口" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "折叠加速 (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "缩放速度 (0.1-50.0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "缩放时间区间 (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "调整大小速度 (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "调整大小时间段落 (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "用于水平虚拟大小的屏幕大小倍增器" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "用于垂直虚拟大小的屏幕大小倍增器" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "指针移动灵敏度" #~ msgid "Shade resistance (0-100)" #~ msgstr "抗遮蔽性(0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "窗口之间的间隔" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "弹簧摩擦力" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "弹簧常数" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "调整大小速度 (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "调整大小时间段落 (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "纹理过滤(快速、好、最佳)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "屏幕刷新速率(次/秒)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "悬停在窗口上时比例模式终止前的时间(以毫秒为)" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "翻转十点之前发生超时" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "放大时使用线性过滤器" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "顶点栅格分辨率" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "水纹偏移比例" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "窗口渐弱速度" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "窗口渐弱速度" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "应渐弱的窗口类型" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "应渐弱的窗口类型" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "应渐弱的窗口类型" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "应渐弱的窗口类型" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "比例模式下应缩放的窗口类型" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "切换程序中应显示的窗口类型" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "最小化时应转换的窗口类型" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "应渐弱的窗口类型" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "聚焦时应采用颤动效果的窗口类型" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "捕捉时应采用颤动效果的窗口类型" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "映射时应采用颤动效果的窗口类型" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "移动时应采用颤动效果的窗口类型" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "应启动比例模式的热角 (TopLeft, TopRight, BottomLeft, BottomRight)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "缩放速度 (0.1-50.0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "缩放时间区间 (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "缩放比例" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "旋转到第 %d 面" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "旋转到带窗口的第 %d 面" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "旋转到第 %d 面并显示活动窗口" #~ msgid "Rotate To Face %d" #~ msgstr "旋转到第 %d 面" #~ msgid "Rotate to face %d" #~ msgstr "旋转到第 %d 面" #~ msgid "Rotate To Face %d with Window" #~ msgstr "旋转到带窗口的第 %d 面" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "旋转到第 %d 面并显示活动窗口" #~ msgid "Command line %d" #~ msgstr "命令行 %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "调用 run_command%d 时在壳层中执行的命令行" #~ msgid "Run command %d" #~ msgstr "运行命令 %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "调用时将运行由命令 %d 确定的壳层命令的键联结" #~ msgid "Move Window Types" #~ msgstr "移动窗口类型" #~ msgid "Corners" #~ msgstr "角" #~ msgid "Focus window when mouse moves over them" #~ msgstr "鼠标移至窗口时聚焦该窗口" #~ msgid "Initiate All Windows" #~ msgstr "启动所有窗口" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "启动键盘窗口移动" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "启动键盘窗口大小调整" #~ msgid "Initiate Window Switcher" #~ msgstr "启动窗口切换程序" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "显示所有窗口切换程序的修改键" #~ msgid "Return from scale view" #~ msgstr "从比例视图返回" #~ msgid "Show switcher" #~ msgstr "显示切换程序" #~ msgid "Sloppy Focus" #~ msgstr "任意焦点" #~ msgid "Start moving window using keyboard" #~ msgstr "开始使用键盘移动窗口" #~ msgid "Terminate" #~ msgstr "终止" #~ msgid "Water effect on system beep" #~ msgstr "系统嘟嘟声的水纹效果" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "应减弱的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话框、模式对" #~ "话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "最小化时应转换的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话" #~ "框、模式对话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "应在比例模式中调整大小的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启" #~ "动、对话框、模式对话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "应显示在转换器中的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话" #~ "框、模式对话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "聚焦时应颤动的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话框、" #~ "模式对话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "捕获时应颤动的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话框、" #~ "模式对话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "映射时应颤动的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话框、" #~ "模式对话框、常规、全屏和未知)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "移动时应颤动的窗口类型(桌面、靠接、工具栏、菜单、实用程序、启动、对话框、" #~ "模式对话框、常规、全屏和未知)" #~ msgid "Wobble effect on system beep" #~ msgstr "系统嘟嘟声的颤动效果" ./po/POTFILES.in0000644000004100000410000000205113246301623013434 0ustar www-datawww-datagtk/gnome/compiz.desktop.in gtk/window-decorator/events.c gtk/window-decorator/forcequit.c gtk/window-decorator/gtk-window-decorator.c gtk/gnome/50-compiz-navigation.xml.in gtk/gnome/50-compiz-windows.xml.in metadata/core.xml.in plugins/annotate/annotate.xml.in plugins/blur/blur.xml.in plugins/clone/clone.xml.in plugins/commands/commands.xml.in plugins/compiztoolbox/compiztoolbox.xml.in plugins/composite/composite.xml.in plugins/copytex/copytex.xml.in plugins/cube/cube.xml.in plugins/dbus/dbus.xml.in plugins/decor/decor.xml.in plugins/fade/fade.xml.in plugins/gnomecompat/gnomecompat.xml.in plugins/imgpng/imgpng.xml.in plugins/imgsvg/imgsvg.xml.in plugins/inotify/inotify.xml.in plugins/kde/kde.xml.in plugins/move/move.xml.in plugins/obs/obs.xml.in plugins/opengl/opengl.xml.in plugins/place/place.xml.in plugins/regex/regex.xml.in plugins/resize/resize.xml.in plugins/rotate/rotate.xml.in plugins/scale/scale.xml.in plugins/screenshot/screenshot.xml.in plugins/switcher/switcher.xml.in plugins/water/water.xml.in plugins/wobbly/wobbly.xml.in src/main.cpp ./po/ro.po0000644000004100000410000026263013246301623012652 0ustar www-datawww-data# Traducerea compiz.po în Română # # Sergiu Bivol , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-05-19 19:29+0300\n" "Last-Translator: Sergiu Bivol \n" "Language-Team: Română \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Birou" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestiune ferestre" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nimic" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Umbrește" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Tipul providerului" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximizează fereastra orizontal" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximizează fereastra vertical" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Tipul providerului" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Autoridicare" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Joasă" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Meniu fereastră" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acțiunea de efectuat la derularea rotiței șoricelului deasupra barei de " "titlu." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tip estompare" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacitatea ferestrei active în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Umbrirea opacității ferestrei active în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacitate în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Umbrirea opacității în tematica Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacitatea de utilizat pentru ferestrele active cu decorațiile tematicii " "Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacitatea de utilizat pentru decorațiile tematicii Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Umbrește ferestrele active cu decorațiile tematicii Metacity de la opac la " "străveziu" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Umbrește ferestrele cu decorațiile tematicii Metacity de la opac la străveziu" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acțiune rotiță șoricel asupra barei de titlu" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tip de estompare utilizată pentru decorare ferestre" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Utilizare tematică Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Utilizare tematică Metacity la desenarea decorațiilor ferestrelor" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Închide fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Demaximizează fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizează fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizează fereastra" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Pune deasupra" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Lipește" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Luminează" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Scoate deasupra" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Dezlipește" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Fereastra „%s” nu răspunde." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forțarea închiderii acestei aplicații va provoca pierderea modificărilor " "nesalvate." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forțează închiderea" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Adnotări" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Culoare de umplere a adnotării" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Culoare de ștanțare a adnotării" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Modúl Adnotare" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Curăță" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Desenează" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Desenează folosind unealta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Culoarea de umplere a adnotărilor" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Inițiere" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Inițiază desenarea adnotării" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Inițiază ștergerea adnotării" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Inițiere ștergere" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Lățime linie" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Lățimea liniei pentru adnotări" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Culoare de ștanțare pentru adnotări" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Lățime ștanțare" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Lățimea ștanțării pentru adnotări" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBiliniar" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Estompare alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Estompare alfa ferestre" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtru estompare" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Ocluziune estompare" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturație estompare" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Viteză estompare" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Estompare ferestre" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Estompează în spatele părților străvezii ale ferestrelor" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturația estompării" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Estompează ferestrele" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Estompează fereastra care nu este focalizată" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Dezactivează estomparea regiunilor de ecran obscurate de alte ferestre." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Metoda de filtrare utilizată pentru estompare" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Estompare la focalizare" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Estompare ferestre la focalizare" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gausian" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Rază gausiană" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Intensitate gausiană" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Raza gausiană" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Intensitatea gausiană" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Preluare independentă texturi" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Hartă MIP" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "NDD hartă MIP" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nivel-de-detaliere a hărții MIP" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efect de pulsare" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Utilizează unitățile de textură disponibile pentru a face cît mai multe " "preluări independente de textură." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Viteză estompare fereastră" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Ferestrele ce trebuiesc afectate de estomparea la focalizare" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Ferestrele ce trebuie să utilizeze implicit estompare alfa" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonare ieșire" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Inițiere selecție clonă" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Manipulant clonă ieșire" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă0”" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă1”" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă10”" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă11”" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă2”" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă3”" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă4”" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă5”" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă6”" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă7”" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă8”" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă9”" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă0”" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă1”" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă10”" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă11”" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă2”" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă3”" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă4”" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă5”" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă6”" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă7”" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă8”" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă9”" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă0”" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă1”" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă10”" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă11”" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă2”" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă3”" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă4”" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă5”" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă6”" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă7”" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă8”" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "O combinație de taste care va rula comanda de consolă identificată prin " "„comandă9”" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linie de comandă 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linie de comandă 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linie de comandă 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Linie de comandă 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linie de comandă 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linie de comandă 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linie de comandă 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linie de comandă 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linie de comandă 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linie de comandă 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linie de comandă 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linie de comandă 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă0”" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă1”" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată " "„rulează_comandă10”" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată " "„rulează_comandă11”" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă2”" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă3”" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă4”" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă5”" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă6”" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă7”" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă8”" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Linia de comandă de executat în consolă cînd este invocată „rulează_comandă9”" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Comandă" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Execută comanda 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Execută comanda 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Execută comanda 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Execută comanda 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Execută comanda 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Execută comanda 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Execută comanda 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Execută comanda 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Execută comanda 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Execută comanda 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Execută comanda 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Execută comanda 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Module active" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permite ca desenarea ferestrelor în ecran complet să nu fie redirecționată " "către hărți de pixeli" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Clopoțel sonor" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Bip de sistem sonorizat" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Autoridicare" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Întîrziere Autoridicare" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecție automată a dispozitivelor de ieșire" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecție automată a ratei de reîmprospătare" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Cea mai bună" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clic pentru focalizare" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Clic pe fereastră mută focalizarea de intrare pe ea" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Închide fereastra activă" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Pictogramă implicită" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Pictograma implicită a ferestrei" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Cub de birou" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectează ieșirile" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectează rata de reîmprospătare" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Durata cît indicatorul trebuie să stea pe marginea ecranului înaintea " "efectuării unei acțiuni de margine." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Întîrziere declanșator margină" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rapidă" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nivel de prevenire a focalizării" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Ferestre pentru prevenire focalizare" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Ferestrele pentru care se aplică prevenirea focalizării" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forțează desenarea independentă a ieșirii." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opțiuni generale" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opțiuni generale Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bună" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ascundere ferestre „Pășire bară de procese”" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ascunde toate ferestrele și focalizează biroul" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Ascunde ferestrele de nu sînt în bara de procese la intrarea în regimul de " "afișare a biroului" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Înaltă" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Dimensiune virtuală orizontală" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Utilizează compresie pentru texturi convertite din imagini dacă e posibil" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignoră indiciile la maximizare" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignoră indiciile de mărire a dimensiunii și de aspect cînd fereastra este " "maximizată" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Interval înainte de ridicarea ferestrelor alese" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval între mesaje de verificare" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nivelul de prevenire a furtului focalizării" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminare" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista modulelor active la moment" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Listă de șiruri descriind dispozitivele de ieșire" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Joasă" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Coboară fereastra" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Coboară fereastra sub alte ferestre" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizează fereastra orizontal" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizează fereastra vertical" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximizează fereastra activă" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximizează orizontal fereastra activă" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximizează vertical fereastra activă" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimizează fereastra activă" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normală" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Număr de birouri" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Numărul de birouri virtuale" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Deconectat" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Actualizează ecranul numai în timpul golirii verticale" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Ieșiri" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Manipulant suprapunere ieșiri" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Desenează independent fiecare dispozitiv de ieșire, chiar dacă dispozitivele " "de ieșire se suprapun" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Întîrziere interogare" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferă ieșirea mai mare" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferă ieșirea mai mică" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Ridicare la clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Ridicare fereastră" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Ridicare ferestre alese după interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Ridicare fereastră deasupra celorlalte ferestre" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Ridică ferestrele la clic" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Rata de reîmprospătare" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicator dimensiune ecran pentru dimensiunea virtuală orizontală" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicator dimensiune ecran pentru dimensiunea virtuală verticală" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Afișare birou" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Afișare animații" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Regim inteligent" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizare la VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compresie textură" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtru textură" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrare textură" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Rata de redesenare a ecranului (ori/secundă)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Comută maximizare fereastră" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Comută maximizare orizontală fereastră" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Comută maximizare verticală fereastră" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Comută umbrire fereastră" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Comută maximizarea ferestrei active" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Comută maximizarea orizontală a ferestrei active" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Comută maximizarea verticală a ferestrei active" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Comută umbrirea ferestrei active" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Comută utilizarea animațiilor lente" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Demaximizează fereastra activă" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Dezredirecționează ferestrele în ecran comlpet" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Utilizare lumină difuză la transformarea ecranului" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Dimensiune virtuală verticală" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Foarte înaltă" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Care din dispozitivele de ieșire suprapuse să fie preferat" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Buton pentru meniu fereastră" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tastă pentru meniu fereastră" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accelerare" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajustează imaginea" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustează imaginea feței de sus la rotație" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avansează la următorul diapozitiv" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animare fundal" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animează imaginea de fond la rotirea cubului" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automat" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Culoarea părților de sus și de jos ale cubului" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Culoarea utilizată pentru marginea de jos a gradientului de rezervă al " "fundalului" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Culoarea utilizată pentru marginea de sus a gradientului de rezervă al " "fundalului" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Culoarea cubului" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Culoarea cubului" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cub de birou" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Accelerație pliere" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Viteză pliere" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Pas de timp pliere" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Generare hărți MIP pentru calitate mai înaltă cînd e posibil" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Înapoi la diapozitivul precedent" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Fișiere imagine" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagine de utilizat ca textură de fond" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Inițiază transparența cubului doar dacă rotația e condusă de șoricel." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "În cub" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Vedere din interiorul cubului" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista fișierelor PNG și SVG ce trebuiesc afișate pe fața superioară a cubului" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Regim „Ieșiri multiple”" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cuburi multiple" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Următorul diapozitiv" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un cub mare" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacitate în timpul rotației" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacitate în afara rotației" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacitatea ferestrei biroului în timpul rotației." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacitatea ferestrei biroului în afara rotației." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Plasează ferestrele pe cub" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapoz. prec." #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Afișare fundal" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Scalare imagine" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Scalează imaginile pentru a acoperi fața superioară a cubului" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Alege cum să fie afișat cubul la utilizarea mai multor dispozitive de ieșire." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Fundal" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Culoare finală pentru gradient fundal" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Culoare inițială pentru gradient fundal" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagine fundal" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Viteză" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Pas de timp" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparență numai la rotire șoricel" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Depliază" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Depliază cubul" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Suport control Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permite generarea de hărți MIP pentru texturi decorative" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comandă" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ferestre decorare" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Linia de comandă pentru decorator, executată dacă niciun decorator nu " "rulează deja" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Decalaj X pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Decalaj Y pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Culoare pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacitate pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Rază pentru umbra lăsată" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Culoare umbră" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Decalaj X pentru umbră" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Decalaj Y pentru umbră" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacitate umbră" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Rază umbră" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ferestre umbră" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decorație fereastră" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decorații fereastră" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Ferestrele ce trebuiesc decorate" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ferestrele ce trebuie să aibă o umbră" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testează" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Constrînge Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Tipul providerului" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Data compilării:" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Decolorare la minimizare/deschidere/închidere" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Viteză decolorare" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Data compilării:" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efect de decolorare la minimizarea/deschiderea/închiderea ferestrelor" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efect decolorare la sunet de sistem" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Colorare ferestre la trecerea pe hartă și decolorare la scoaterea de pe hartă" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Decolorare ferestre" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Decolorarea ferestrelor" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Clopoțel vizibil în ecran complet" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efect de decolorare la sunet de sistem în ecran complet" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Clopoțel vizibil" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Viteză decolorare fereastră" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ferestrele ce trebuiesc scalate în regimul de scalare" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ferestrele care trebuie să se decoloreze" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punct de montare" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punct de montare" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistem de fișiere în spațiul utilizatorului" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistem de fișiere în spațiul utilizatorului (fuse)" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Suport control GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Suport buclă principală GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Deschide o consolă" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialog ececuție" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Linie de comandă în terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Linie de comandă pentru captură de ecran" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Afișare meniu principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Afișare dialog de lansare aplicație" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Afișează meniul principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Fă o captură de ecran" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Face captura unei ferestre" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Linie de comandă în terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Linie de comandă pentru captură fereastră" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Suport fișier plan Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Modúl de notificare a modificării fișierului" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Suport control Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efect de minimizare" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizează ferestrele" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Viteză minimizare" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Pas de timp minimizare" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Rezistență la umbrire" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Rezistență la umbrire" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformare ferestre cînd sînt minimizate și deminimizate" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Ferestrele care trebuiesc transformate la minimizare" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Constrînge Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Constrînge coordonata Y la regiunea spațiului de lucru" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Nu actualiza în server poziția ferestrelor pînă cînd nu se încheie mutarea" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Inițierea mutării ferestrei" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Poziționare leneșă" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mutare fereastră" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mută fereastra" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacitate" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivel de opacitate al ferestrelor în mișcare" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Desprindere și demaximizare automată a ferestrelor maximizate la glisare" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Tipul providerului" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Inițializarea deplasării" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Luminozitate" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Reducere opacitate" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Mărire opacitate" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Pasul de modificare a opacității" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Pasul de modificare a opacității" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Pas opacitate" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Nivel de opacitate al ferestrelor în mișcare" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opacitate în timpul rotației" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Pregătire" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Decorații fereastră" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Window Manager" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Tipul providerului" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Ferestre ce trebuiesc poziționate implicit" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Ferestre ce trebuie să fie străvezii implicit" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Ferestre ce trebuiesc poziționate implicit" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritm de utilizat pentru amplasarea ferestrelor" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascadă" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrat" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Gestiune ferestre" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Tipul providerului" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Tipul providerului" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Preferă ieșirea mai mică" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" "Amplasează ferestrele pe poziții corespunzătoare la amplasarea pe hartă" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Rgim de amplasare" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Tipul providerului" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleator" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Alege comportamentul amplasării în prezența ieșirilor multiple" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligent" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Folosește dispozitivul de ieșire activ" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Use output device of focussed window" msgstr "Folosește dispozitivul de ieșire cu indicatorul" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Folosește dispozitivul de ieșire cu indicatorul" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Soluții de amplasare ferestre" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Ferestre ce trebuiesc poziționate implicit" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Ferestre ce trebuiesc poziționate implicit în anumite zone de vizualizare" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ferestre ce ar trebui amplasate cu forța, chiar dacă ele îi indică " "gestionarului de ferestre să le evite." #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Decorații fereastră" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluții" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Poziții pe X" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valori poziții pe X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Poziții pe Y" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Utilizatori virtuali" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valori poziții pe Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Încărcător de imagini Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Potrivire ExpReg" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Potrivire ferestre cu o expresie regulată" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Culoare bordură" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Culoarea bordurii utilizate pentru regimurile de redimensionare dreptunghică " "și conturată" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Regim de redimensionare implicit" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Regimul implicit utilizat pentru redimensionarea ferestrelor" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Culoare de umplere" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Culoarea de umplere folosită pentru regimul de redimensionare dreptunghică" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contur" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Dreptunghi" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Începe redimensionarea" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Începe redimensionarea ferestrei, întinzînd-o" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Începe redimensionarea normal" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Începe redimensionarea cu contur" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Începe redimensionarea cu dreptunghi" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Întinde" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Tipul providerului" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Ferestre cu care se folosește redimensionarea normală" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Ferestre cu care se folosește redimensionarea cu contur" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Ferestre cu care se folosește redimensionarea cu dreptunghi" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Ferestre cu care se folosește redimensionarea prin întindere" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Întoarcere muchie – glisare" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Întoarcere muchie – deplasare" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Întoarcere muchie – indicator" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Data compilării:" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Întoarce spre fereastra de vizualizare stîngă și transferă indicatorul" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Întoarce spre următoarea fereastră de vizualizare la glisarea obiectului la " "marginea ecranului" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Întoarce spre următoarea fereastră de vizualizare la deplasarea " "indicatorului la marginea ecranului" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Întoarce spre următoarea fereastră de vizualizare la deplasarea ferestrei la " "marginea ecranului" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" "Întoarce spre fereastra de vizualizare dreaptă și transferă indicatorul" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inversare axă Y pentru deplasare indicator" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Pointer către %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Pointer către %1" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Ridicare la rotire" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Ridică fereastra la rotire" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Rotire cub" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Întoarcere spre stînga la rotire" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Întoarcere spre dreapta la rotire" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Rotire la stînga" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Rotire cub" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Desktop:" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Rotire la stînga" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Rotește la fereastra de vizualizare" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Tipul providerului" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Accelerare 3D:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testează" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testează" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testează" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilitatea mișcării indicatorului" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Agățare rotație cub de fața inferioară" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Agățare rotație cub de fața superioară" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Agățare de fața inferioară" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Agățare de fața superioară" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Opţiuni căutare" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Interval de timp pînă la întoarcerea ferestrei de vizualizare" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Lupă" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Opacitatea în procente" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Mare" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Clic pe birou pentru a fișa biroul" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Întunecare fundal" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Întunecă fundalul la scalarea ferestrelor" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblemă" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Intrare în regim Afișare birou cînd se face clic pe birou în timpul scalării" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Durată planare" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Inițiere Selector ferestre pentru toate ferestrele" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Inițiere Selector ferestre pentru grupul de ferestre" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Inițiere Selector ferestre pentru ferestrele ieșirii curente" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Aranjează și începe transformarea tuturor ferestrelor" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Aranjează și începe transformarea grupului de ferestre" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Aranjează și începe transformarea ferestrelor" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Aranjează și începe transformarea ferestrelor ieșirii curente" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Pe toate dispozitivele de ieșire" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Pe dispozitivul de ieșire curent" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Pictogramă suprapusă" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Suprapune o pictogramă pe ferestre odată ce sînt scalate" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Stare" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "ora locală" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "ora locală" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Alege unde sînt scalate ferestrele dacă sînt utilizate mai multe dispozitive " "de ieșire." #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Tipul providerului" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Spania" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Intervalul (în ms) înaintea terminării regimului de scalare la planarea " "deasupra unei ferestre" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ferestrele ce trebuiesc scalate în regimul de scalare" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Deschide captura de ecran automat în această aplicație" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Director\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "India" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Lansare aplicație" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Pune capturile în acest director" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captură de ecran" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Profil activ" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Încărcător de imagini Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Luminozitatea în procente" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Saturația în procente" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Ordinea de aplicare" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatic" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Acţiune" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Aduce fereastra aleasă în prim-plan" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Distanța la care să fie îndepărtat biroul în timpul comutării ferestrelor" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Acţiune" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop:" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Comutator-balon dacă nu este vizibil și alege următoarea fereastră" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Comutator-balon dacă nu este vizibil și alege următoarea fereastră dintre " "toate ferestrele" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Comutator-balon dacă nu este vizibil și alege fereastra precedentă" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Comutator-balon dacă nu este vizibil și alege fereastra precedentă dintre " "toate ferestrele" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Panoul precedent" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rotește fereastra aleasă la comutare" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Alege următoarea fereastră fără a afișa fereastra-balon." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Alege fereastra precedentă fără a afișa fereastra-balon." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Afișare pictogramă lîngă miniatură" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "ora locală" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "ora locală" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Tipul providerului" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Ferestrele ce trebuiesc afișate în comutator" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Oferă suport pentru spațiu de culori YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Redare video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Redare video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Spațiu de culori YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Adaugă linie" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Adaugă punct" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Adaugă efecte acvatice pentru diferite acțiuni de birou" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Interval (în ms) între picături" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Activează efectele acvatice pentru indicator" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linie" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Scală decalaj" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punct" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "&Mail Relay" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Val pentru titlu" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Activează statusul" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efect acvatic" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Scală decalaj Apă" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efect acvatic de la titlul ferestrei" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efect de focalizare" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Acţiune" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezoluţie" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Agățare fereastră inversată" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efect la amplasare pe hartă" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efect la maximizare" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Dimensiune minimă grilă" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Dimensiune minimă a grilei pe culmi" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremurare" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Agățare inversate" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Tipul providerului" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Acţiune" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Spania" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Spania" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Activează statusul" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Utilizare model de resort pentru efectul de legănare a ferestrei" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezoluţia serverului" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Ferestre ce trebuie să se legene la focalizare" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Ferestre ce trebuie să se legene la înhățare" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Ferestre ce trebuie să se legene la amplasare pe hartă" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Ferestre ce trebuie să se legene la deplasare" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efect de legănare la maximizarea și demaximizarea ferestrelor" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Tipul providerului" #~ msgid "Command line 0" #~ msgstr "Linie de comandă 0" #~ msgid "Run command 0" #~ msgstr "Execută comanda 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Linie de comandă pentru captură de ecran" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Linie de comandă pentru captură de ecran" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filtru:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Folosește filtru liniar cînd se apropie" #~ msgid "Zoom Desktop" #~ msgstr "Lupă birou" #~ msgid "Zoom In" #~ msgstr "Apropiere" #~ msgid "Zoom Out" #~ msgstr "Îndepărtare" #~ msgid "Zoom Pan" #~ msgstr "Panoramare lupă" #~ msgid "Zoom Speed" #~ msgstr "Viteză lupă" #~ msgid "Zoom Timestep" #~ msgstr "Temporizare lupă" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Examinare și panoramare cub de Birou" #~ msgid "Zoom factor" #~ msgstr "Coeficient lupă " #~ msgid "Zoom pan" #~ msgstr "Panoramare lupă" #~ msgid "Decrease window opacity" #~ msgstr "Reduce opacitatea fereastrei" #~ msgid "Increase window opacity" #~ msgstr "Mărește opacitatea ferestrei" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valoarea opacității pentru ferestrele care trebuie să fie străvezii " #~ "implicit" #~ msgid "Opacity window values" #~ msgstr "Valori ferestre opacitate" #~ msgid "Opacity windows" #~ msgstr "Ferestre opacitate" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane down" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane right" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Tipul providerului" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Notification" #~ msgstr "Acţiune" #~ msgid "Unknown" #~ msgstr "Necunoscut" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Pregătire" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Accelerare 3D:" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "are nevoie de" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testează" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusă" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Desktop:" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Accelerare 3D:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testează" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "ora locală" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "ora locală" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Acţiune" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Spania" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezoluţia serverului" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "are nevoie de" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testează" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Desktop:" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Comanda '%1'" #, fuzzy #~ msgid "Corners" #~ msgstr "Imprimante" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Afişează &modificările" #, fuzzy #~ msgid "Terminate" #~ msgstr "Imprimantă" ./po/hu.po0000644000004100000410000026022713246301623012646 0ustar www-datawww-data# translation of compiz.po to Hungarian # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # # Kalman Kemenczy , 2006, 2007. # Gabor Kelemen , 2007. # KAMI911 , 2007-2008. msgid "" msgstr "" "Project-Id-Version: po_compiz-hu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-03-25 09:09+0100\n" "Last-Translator: KAMI \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" "X-Launchpad-Export-Date: 2007-12-04 10:00+0000\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,-1,490,-1\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Asztal" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Ablakkezelés" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Egyik sem" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Felgördítés" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximalizálás" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Ablak maximalizálása vízszintesen" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Ablak maximalizálása függőlegesen" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Kis méret" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Növelés" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Alacsony" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Ablak menü" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Az ablak címsorán történő egérgörgő-használat hatása." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Elmosás típusa" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Aktív ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Felgördített aktív ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Felgördített ablak átlátszatlansága" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Az aktív ablak átlátszatlansága a díszítő elemekhez" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Az ablak átlátszatlansága a díszítő elemekhez" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "Felgördített aktív ablak átlátszatlansága a díszítő elemeknél" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Felgördített ablak átlátszatlansága a díszítő elemeknél" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Egérgörgő esemény a címsoron" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Az elmosás típusa a díszítő elemekhez" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity téma alkalmazása" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Metacity téma alkalmazása az ablakdíszítések rajzolásakor" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Ablak bezárása" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Ablak visszaállítása" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Ablak maximalizálása" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Ablak minimalizálása" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Előrehozás" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Rögzítés" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Legördítés" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Hátraküldés" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Rögzítés feloldása" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A(z) „%s” ablak nem válaszol." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "A kilépés kényszerítésének hatására minden el nem mentett adat el fog veszni." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Kilépés kényszerítése" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Feljegyzés" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Feljegyzés kitöltő színe" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Feljegyzés körvonalszíne" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Feljegyzés bővítmény" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Törlés" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Rajzolás" # 58721 AttribValues/label #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Rajzolás eszközzel" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Feljegyzések kitöltő színe" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Indítás" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Feljegyzésrajzolás indítása" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Feljegyzéstörlés indítása" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Törlés indítása" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Vonalvastagság" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Feljegyzések vonalvastagsága" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Feljegyzések körvonalának színe" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Körvonal vastagsága" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Feljegyzések körvonal-vastagsága" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x bilineáris" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alfa elmosás" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Ablakok elmosása" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Elmosásszűrő" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Elmosás levágás" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Elmosás telítettség" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Elmosás sebessége" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Ablak elmosása" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Elmosás az ablakok áttetsző részei mögött" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Elmosás telítettség" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Ablakok elmosása" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Fókusszal nem rendelkező ablakok elmosása" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Elmosás kikapcsolása a képernyő más ablakok által kitakart részein." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Az elmosáshoz használt szűrőmódszer" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fókuszelmosás" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Ablakok elmosása" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gauss" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gauss-sugár" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gauss erőssége" # RU #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gauss-sugár" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gauss erőssége" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Független textúra lekérés" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "MIP térkép" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "MIP térkép részletesség" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "MIP térkép részletesség szintje" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Impulzus" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Impulzus effektus" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Független textúra lekérések számának növelése az éppen nem használt " "textúrázó egységek használatával." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Ablak elmosásának sebessége" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Fókuszelmosással elmosandó ablaktípusok" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Alfaelmosással elmosandó ablaktípusok" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Kimenet klónozása" # /tmp/xapi:301 #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Klónkiválasztás indítása" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Kimenet klónkezelője" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "A command0 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "A command1 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "A command10 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "A command11 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "A command2 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "A command3 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "A command4 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "A command5 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "A command6 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "A command7 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "A command8 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "A command9 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "A command0 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "A command1 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "A command10 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "A command11 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "A command2 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "A command3 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "A command4 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "A command5 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "A command6 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "A command7 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "A command8 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "A command9 parancs futtatására használt billentyűzetkombináció" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "A command0 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "A command1 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "A command10 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "A command11 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "A command2 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "A command3 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "A command4 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "A command5 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "A command6 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "A command7 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "A command8 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "A command9 parancs futtatására használt szegély" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Parancsok hozzárendelése billentyűzetkombinációkhoz" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Gyorsbillentyűk" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "1. parancssor" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "10. parancssor" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "11. parancssor" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "12. parancssor" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "2. parancssor" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "3. parancssor" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "4. parancssor" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "5. parancssor" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "6. parancssor" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "7. parancssor" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "8. parancssor" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "9. parancssor" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "A run_command0 által elindított parancs" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "A run_command1 által elindított parancs" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "A run_command10 által elindított parancs" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "A run_command11 által elindított parancs" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "A run_command2 által elindított parancs" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "A run_command3 által elindított parancs" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "A run_command4 által elindított parancs" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "A run_command5 által elindított parancs" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "A run_command6 által elindított parancs" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "A run_command7 által elindított parancs" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "A run_command8 által elindított parancs" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "A run_command9 által elindított parancs" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Parancs" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Szegély" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Gyorsbillentyűk" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "1. parancs futtatása" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "10. parancs futtatása" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "11. parancs futtatása" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "12. parancs futtatása" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "2. parancs futtatása" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "3. parancs futtatása" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "4. parancs futtatása" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "5. parancs futtatása" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "6. parancs futtatása" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "7. parancs futtatása" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "8. parancs futtatása" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "9. parancs futtatása" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktív bővítmények" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "A teljes méretű ablakok nem irányíthatók át képen kívüli pixeltérképekre" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hallható csengő" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hallható rendszercsengő" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatikus megnyitás" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automatikus megnyitás késleltetése" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Kimeneti eszközök automatikus érzékelése" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Frissítési frekvencia automatikus érzékelése" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Legjobb" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Kattintson a fókuszáláshoz" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Az ablakra kattintással az ablakra irányítja a fókuszt" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Aktív ablak bezárása" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Alapértelmezett ikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Alapértelmezett ikon képe" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Munkaasztal mérete" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Kimenetek észlelése" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Frissítési frekvencia felismerése" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Kijelző beállítások" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Az az időtartam, ameddig az egérmutatónak a képernyőn szélén kell állnia " "ahhoz, hogy a képernyő széléhez társított művelet elinduljon." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Képernyő szélével indított műveletek indításának késleltetése" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Gyors" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Fókusz és növelés viselkedése" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Fókuszmegelőzés szintje" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Fókuszmegelőzés" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Fókuszmegelőzés" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Független kimenethasználat erőltetése" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Általános beállítások" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "A Compiz általános beállításai" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Jó" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Kihagyott tálcaablakok elrejtése" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Összes ablak elrejtése és fókuszálás a munkaasztalra" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Az asztal megjelenítése módba kapcsoláskor a tálcán nem lévő ablakok " "elrejtése" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Magas" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vízszintes virtuális méret" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Képekből konvertált textúrák tömörítése, amennyiben az lehetséges" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Maximális méretben tanácsok figyelmen kívül hagyása" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Méretnövelési és méretezési tanácsok figyelmen kívül hagyása ha az ablak " "maximális méretű" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "A kiválasztott ablakok megnyitását megelőző intervallum" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping üzenetek közti időköz" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Gyorsbillentyűk" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Fókuszmegelőzés szintje" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Világosítás" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Az aktuális bővítmények listája" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Kimeneti eszközöket leíró karakterláncok listája" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Alacsony" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Alacsonyabb ablak" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Alacsonyabb ablak egy másik ablak alatt" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Ablak maximalizálása vízszintesen" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Ablak maximalizálása függőlegesen" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Aktív ablak maximalizálása" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Aktív ablak maximalizálása vízszintesen" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Aktív ablak maximalizálása függőlegesen" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Aktív ablak minimalizálása" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Szokványos" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Munkaasztalok száma" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Virtuális munkaasztalok száma" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Kikapcsolva" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "A képernyő-frissítések végrehajtása csak a függőleges törlési periódusban" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Kimenetek" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Átfedő kimenetek kezelése" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Összes kimenet független használata, még akkor is, ha a kimenetek átfedik " "egymást" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping késleltetése" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Nagyméretű kimenet használata" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Kisméretű kimenet használata" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Kattintás esetén megnyitás" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Ablak előtérbe hozása" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "A kijelölt ablak megnyitása ennyi idő után" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Ablak másik ablakok fölé hozása" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Ablakok megnyitása kattintás esetén" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Frissítési frekvencia" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Képernyőméret-szorzó a vízszintes virtuális mérethez" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Képernyőméret-szorzó a virtuális mérethez" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Munkaasztal megjelenítése" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Lassú animációk" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Intelligens üzemmód" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Szinkronizálás VBlank jelre" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Textúratömörítés" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Textúraszűrő" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Textúraszűrés" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "A képernyő-újrarajzolás gyakorisága (alkalom/másodperc)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Ablak maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Ablak vízszintes maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Ablak függőleges maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Ablak felgördítése" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Aktív ablak maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Aktív ablak vízszintes maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Aktív ablak függőleges maximális méret átkapcsolása" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Aktív ablak felgördítése" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "„Lassú animációk” effektus kapcsoló" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Aktív ablak visszaállítása" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Teljes méretű ablakok visszairányítása" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Szórt fény használata képernyő-transzformációnál" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Függőleges virtuális méret" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Nagyon magas" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" "Adja meg, hogy melyik átfedő kimeneti eszköz legyen előnyben részesítve." #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Window menü billentyűzetkombinációi" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Window menü billentyűzetkombinációi" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Gyorsítás" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Kép igazítása" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Kép igazítása forgatáshoz" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Továbblépés a következő diára" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Kupola animálása" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Kupola animálása a kocka forgatásánál" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Megjelenés" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatikus" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Viselkedés" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "A kocka alsó és felső oldalának színe" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "A kupola tartalék színátmenet alsó színállomásához használandó szín" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "A kupola tartalék színátmenet felső színállomásához használandó szín" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Kocka fedőlapok" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kocka színe" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Munkaasztal kocka" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Hajtás gyorsulása" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Hajtás sebessége" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Hajtás időköz" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "MIP térképek készítése, hacsak lehetséges, a jobb minőségű átméretezés " "érdekében" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Visszatérés az előző diára" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Képfájlok" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "A kupola textúrájaként használt kép" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "A kocka csak egérrel történő forgatáskor válik átlátszóvá." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "A kocka belseje" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "A kocka belseje" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "A kocka tetejére kerülő PNG és SVG fájlok listája" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Többkimenetes üzemmód" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Több kocka" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Következő dia" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Egy nagy kocka" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Átlátszatlanság forgatás közben" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Átlátszatlanság alapállapotban" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Ablakok átlátszatlansága forgatás közben" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Ablakok átlátszatlansága alapállapotban" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Ablakok elhelyezése a kockán" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Előző dia" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Kupola leképzése" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Kép méretezése" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Kép méretezése a kocka tetejének lefedésére" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "A kocka megjelenítésének módja több kimeneti eszköz használata esetén." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Kupola" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Kupola színátmenetének záró színe" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Kupola színátmenetének induló színe" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Kupola képe" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Sebesség" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Időköz" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Átlátszóság csak egérrel forgatáskor" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Áttetsző kocka" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Kibontás" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Kocka kibontása" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus vezérlés kiszolgálója" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "MIP térképek létrehozása a díszítő textúrákhoz" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Parancs" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Ablakok díszítése" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Díszítő parancs, amely akkor kerül végrehajtásra, ha még nem fut díszítő" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Árnyék X eltolása" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Árnyék Y eltolása" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Árnyék színe" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Árnyék átlátszatlansága" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Árnyék átmérője" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Árnyék színe" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Árnyék X eltolása" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Árnyék Y eltolása" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Árnyék átlátszatlansága" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Árnyék átmérője" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Ablakok árnyékolása" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Ablakdíszítés" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Ablakdíszítések" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Díszítendő ablakok" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Árnyékolandó ablakok" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Nem válaszoló ablak fényerőssége (százalékban megadva)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Állandó sebesség" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Állandó útidő" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Nem válaszoló ablak elhalványítása" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Azon ablakok elhalványítása, amelyek nem válaszolnak az ablakkezelő kéréseire" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Elhalványítási üzemmód" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ablakelhalványítás minimalizáláskor, megnyitáskor és bezáráskor" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Elhalványulás sebessége" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Elhalványítási idő" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Ablakelhalványítási effektus alkalmazása minimalizáláskor, megnyitáskor és " "bezáráskor" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Elhalványulás effektus rendszerhang esetén" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Leképezés esetén az ablak erősítése, lecsatolás esetén elhalványítása" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ablak elhalványítása" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Ablakok elhalványítása" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Teljes képernyő vizuális csengő" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Teljes képernyő halványuló effektus rendszercsengő esetén" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Nem válaszoló ablak telítettsége (százalékban megadva)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Nem válaszoló ablak fényerőssége" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Nem válaszoló ablak telítettsége" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Vizuális csengő" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Ablak elhalványulásának üzemmódja" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Ablak elhalványulásának sebessége „Állandó sebesség” módban" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Ablak elhalványulásának sebessége „Állandó útidő” módban" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ablaktípusok, amelyek elhalványulhatnak" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Csatolási pont" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Csatolási pont" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Felhasználói módú fájlrendszer" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Felhasználói módú fájlrendszer" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf vezérlés kiszolgálója" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "Glib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Glib főciklus támogatása" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome kompatibilitás" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Terminál megnyitása" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Beállítás, amely a Compizt kompatibilissá teszi a Gnome asztali környezettel" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Párbeszéd futtatása" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Parancs futtatása terminálban" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Képernyőkép parancssor" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Főmenü megjelenítése" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "„Alkalmazás futtatása” párbeszédablak megjelenítése" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Főmenü megjelenítése" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Képernyőkép készítése" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Képernyőkép készítése az ablakról" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Terminál parancssor" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Ablak képernyőkép parancssor" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "INI" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "INI szövegfájl" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Fájlváltozásról értesítő bővítmény" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig vezérlés kiszolgálója" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimalizálás effektus" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Ablak minimalizálása" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimalizálás sebessége" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimalizálási időköz" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Felgördítés ellenállása" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Felgördítés ellenállása" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Ablakok átalakítása minimalizáláskor és visszaállításkor" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Minimalizált állapotban átalakítandó ablaktípusok" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Y megszorítás" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y koordináta-megszorítás a munkafelületre" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Csak az ablakáthelyezés befejeztével frissítse az ablakpozíciót a kiszolgálón" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Ablakáthelyezés indítása" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Lusta elhelyezés" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Ablak áthelyezése" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Ablak áthelyezése" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Átlátszatlanság" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Ablakáthelyezés átlátszatlanságának szintje" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Áthelyezéskor az ablakok azonnali, automatikus visszaállítása" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Maximalizált ablakok azonnali visszaállítása" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Ablakáthelyezés megkezdése" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Fényerő" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Fényerő csökkentése" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Fényerő növelése" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Fényerő lépésköz" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Fényerő értéke ablakokhoz" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Csökkentés" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Növelés" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Átlátszatlanság csökkentése" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Átlátszatlanság növelése" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Átlátszatlanság mértéke" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Ablakok átlátszatlansága" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Átlátszatlanság, fényerő, telítettség" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Átlátszatlanság, fényerő, telítettség beállítások" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Telítettség" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Színtelítettség csökkentése" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Színtelítettség növelése" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Telítettség változásának lépésköze" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Ablakok színtelítettsége" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Lépésköz" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Ablak beállítások" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Ablak tulajdonságok" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Ablakok" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Alapértelmezettől eltérő fényerővel rendelkező ablakok" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Alapértelmezettől eltérő átlátszatlansággal rendelkező ablakok" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Alapértelmezettől eltérő színtelítettséggel rendelkező ablakok" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Az ablakok elhelyezésére használt algoritmus" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Lépcsőzetes" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Középre" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Fix ablakelhelyezések" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Ablakelhelyezés erőltetése" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Vízszintes munkalap pozíció" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Munkaasztalon tartás" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Ablakelhelyezés erőltetésének felülbírálása úgy, hogy az ablak minden " "esetben a munkaasztalon maradjon" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Ablakok elhelyezése" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Összes kimenet használata" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Térképezés esetén az ablakok elhelyezése a megfelelő pozícióba" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Elhelyezés módja" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Pozicionált ablakok" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Véletlen" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Megadja, hogy több kimeneti eszköz esetén, az ablakelhelyezés viselkedését" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Intelligens" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Aktív kimeneti eszköz használata" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Fókuszált ablakot megjelenítő eszköz használata" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Egérmutatót megjelenítő eszköz használata" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Függőleges munkalap pozíció" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Munkaterületen elhelyezett ablakok" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Kerülőmegoldások az ablak elhelyezésére" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Alapértelmezés szerint pozicionálandó ablakok" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Alapértelmezés szerint megadott munkalapra pozicionálandó ablakok" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ablakok, amelyek elhelyezését szabályozni kell, még akkor is, ha az " "ablakkezelő úgy jelzi, hogy az adott ablakok elhelyezését nem szabad " "szabályozni." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Ablakok rögzített pozicióval" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Ablakok rögzített nézőponttal" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Kerülő megoldások" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Vízszintes pozíció" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Vízszintes munkalap pozíció" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Vízszintes pozíció" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Függőleges pozíció" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Függőleges munkalap pozíció" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Függőleges pozíció" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "PNG képbetöltő" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Reguláris kifejezés egyeztetés" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Reguláris kifejezéssel ablakegyeztetés" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Gyorsbillentyűk" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kocka színe" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Az átméretezéshez használt körvonal és téglalap színe " #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Alapértelmezett átméretezési mód" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Alapértelmezett ablakátméretezési mód" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Kitöltőszín" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Téglalap átméretezés kitöltő színe" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Hagyományos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Körvonalas ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Téglalap ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Nyújtásos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Hagyományos ablakátméretezés" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Körvonal" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Átméretezés az ablak körvonalával" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Téglalap" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Téglalap ablakátméretezés" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Ablak átméretezése" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Ablak átméretezése" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Ablak átméretezésének indítása" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Nyújtásos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Hagyományos ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Körvonalas ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Téglalap ablakátméretezés indítása" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Nyújtás" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Átméretezés az ablak nyújtásával" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Hagyományos ablakátméretezést használó ablakok" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Körvonalas ablakátméretezést használó ablakok" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Téglalap ablakátméretezést használó ablakok" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Nyújtásos ablakátméretezést használó ablakok" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Élforgatás egérművelet" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Élforgatás áthelyezés" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Élforgatás mutató" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Forgatási idő" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Forgatás a bal oldali nézőpontig és mutató léptetése" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Objektum kép szélére húzása esetén forgatás a következő nézőpontig" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Mutató kép szélére húzása esetén forgatás a következő nézőpontig" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Egy ablak kép szélére húzása esetén forgatás a következő nézőpontig" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Forgatás a jobb oldali nézőpontig és mutató léptetése" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Y tengely átalakítása a mutató mozgásához" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Y mutató invertálása" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Mutató érzékenysége" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Kiemelés forgatáskor" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Ablakok megnyitása kattintás esetén" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Kocka forgatása" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Forgatás balra" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Forgatás jobbra" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Forgatás balra" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Forgatás balra az ablakkal együtt" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Forgatás jobbra" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Forgatás jobbra az ablakkal együtt" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Forgatás" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Forgatás az 1. előlap felé" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Forgatás az 1. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Forgatás a 10. előlap felé" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Forgatás a 10. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Forgatás a 11. előlap felé" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Forgatás a 11. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Forgatás a 12. előlap felé" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Forgatás a 12. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Forgatás a 2. előlap felé" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Forgatás a 2. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Forgatás a 3. előlap felé" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Forgatás a 3. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Forgatás a 4. előlap felé" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Forgatás a 4. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Forgatás az 5. előlap felé" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Forgatás az 5. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Forgatás a 6. előlap felé" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Forgatás a 6. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Forgatás a 7. előlap felé" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Forgatás a 7. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Forgatás a 8. előlap felé" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Forgatás a 8. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Forgatás a 9. előlap felé" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Forgatás a 9. előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Kocka forgatása" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "A munkaasztalkocka forgatása" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Balra forgatás" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Balra forgatás az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Jobbra forgatás" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Jobbra forgatás az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Forgatás a kocka előlap felé" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Forgatás a kocka előlap felé az ablakkal együtt" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Forgatás az 1. előlap felé" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Forgatás az 1. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Forgatás a 10. előlap felé" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Forgatás a 10. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Forgatás a 11. előlap felé" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Forgatás a 11. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Forgatás a 12. előlap felé" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Forgatás a 12. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Forgatás a 2. előlap felé" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Forgatás a 2. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Forgatás a 3. előlap felé" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Forgatás a 3. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Forgatás a 4. előlap felé" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Forgatás a 4. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Forgatás az 5. előlap felé" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Forgatás az 5. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Forgatás a 6. előlap felé" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Forgatás a 6. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Forgatás a 7. előlap felé" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Forgatás a 7. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Forgatás a 8. előlap felé" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Forgatás a 8. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Forgatás a 9. előlap felé" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Forgatás a 9. előlap felé az aktív ablakkal együtt" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Forgatás munkalapra" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Ablak forgatása" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Forgatás az ablakkal együtt" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Forgatás gyorsulása" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Forgatás sebessége" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Forgatás időköze" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Forgatási nagyítás" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Mutatómozgatás érzékenysége" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Hirtelen kockaforgatás a also oldalra" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Hirtelen kockaforgatás a felső oldalra" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Alsó oldalhoz ugrás" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Felső oldalhoz ugrás" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Forgatás indítása" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "A nézőpont váltása előtti időkorlát" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Nagyítás" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Átlátszatlanság (0-100%)" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Nagy" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Áttekintő üzemmódban marad" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Átváltás áttekintő üzemmódba ahelyett, hogy a gomb megnyomásakor átváltana, " "majd elengedésekor vissza." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Asztalra kattintva az asztal megjelenítése" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Sötétülő háttér" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Sötétülő háttér az ablakok átméretezésekor" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Embléma" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Asztalra kattintás esetén az asztal megjelenítése áttekintő nézetben" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Mutatás ideje" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Ablakválasztó indítása" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Ablakválasztó indítása minden ablakhoz" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Ablakválasztó indítása ablakcsoporthoz" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Ablakválasztó indítása a jelenlegi kimenet ablakain" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Áttekintő üzemmódban marad" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Átváltás áttekintő üzemmódba ahelyett, hogy a gomb megnyomásakor átváltana, " "majd elengedésekor vissza." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Elrendezés és ablaktranszformáció indítása" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Elrendezés és ablakcsoport-transzformáció indítása" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Ablaktranszformáció és elrendezés indítása" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Elrendezés és a jelenlegi kimenet ablakai transzformációjának indítása" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Az összes kimeneti eszközön" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "A jelenlegi kimeneti eszközön" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Átfedő ikon" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Ikon átfedése az ablakon átméretezéskor" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Áttekintő nézet" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Ablakok áttekintő nézete" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Áttekintés sebessége" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Áttekintés időköze" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Ablakok áttekintése" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Megadja, hogy több kimeneti eszköz esetén melyik eszköz jelenítse meg az " "ablakok áttekintő nézetét." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Ablakok közti távolság" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Távolság" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Az áttekintő nézetből való kilépés előtt eltöltött idő (ezredmásodpercben) " "az ablakra mutatáskor" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ablaktípusok, amelyek áttekintő nézetben megjelennek" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "A automatikus indítása bejelentkezéskor" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Könyvtár" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Téglalap képernyőkép készítése" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Alkalmazás indítása" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Képernyőképek elhelyezése ebbe a könyvtárba" # /tmp/intro:67 /tmp/xapi:379 #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Képernyőkép" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Képernyőkép bővítmény" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "SVG képbetöltő" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Fényerősség (0-100%)" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Telítettség (0-100%)" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Alkalmazásváltó" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatikus forgatás" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Előrehozás" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "A kijelölt ablak az előtérbe hozása" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "A munkaasztal kinagyításának mértéke ablakváltás során" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimalizálva" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Következő panel" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Következő ablak" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Következő ablak (minden ablak)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Következő ablak (nincs előugró ablak)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Ablakváltó megjelenítése ha nem látható és a következő ablak kiválasztása" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Ablakváltó megjelenítése ha nem látható és az összes ablak közül a következő " "kiválasztása" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Ablakváltó megjelenítése ha nem látható és az előző ablak kiválasztása" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Ablakváltó megjelenítése ha nem látható és az összes ablak közül az előző " "kiválasztása" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Előző panel" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Előző ablak" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Előző ablak (minden ablak)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Előző ablak (nincs előugró ablak)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Forgatás a kiválasztott ablakra váltás közben" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Válassza ki a következő paneltípus-ablakot." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Következő ablak kiválasztása a felbukkanó ablak nélkül." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Válassza ki az előző paneltípus-ablakot." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Előző ablak kiválasztása a felbukkanó ablak nélkül." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Ikon megjelenítése a miniatűr mellett" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Ikonizált ablakok megjelenítése" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Váltás sebessége" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Váltás időköz" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Ablakváltó ablak" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Az ablakválasztóban megjelenítendő ablaktípusok" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 színtértámogatás biztosítása" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videólejátszás" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Videólejátszás" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 színtér" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Vonal hozzáadása" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Pont hozzáadása" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Víz effektus hozzáadása a különböző munkaasztal-műveletekhez" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Esőcseppek közötti késleltetés (ms)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Mutató víz effektus bekapcsolása" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Vonal" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Eltolás skálája" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Pont" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Eső késleltetése" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Címhullám" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "„Eső” kapcsoló" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "„Eső” effektus kapcsoló" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "„Ablaktörlő” kapcsoló" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "„Ablaktörlő” effektus kapcsoló" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Víz effektus" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Víz eltolás mértéke" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Hullám effektus az ablakcímből" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fókusz effektus" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Ablakfókusz-effektus" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Ablakfókusz-típusok" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Súrlódás" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Ablaktípusok érzékelése" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rács felbontása" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Ablakok illesztése fordítva" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Ablak összetörése" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Térkép effektus" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Ablaktérkép-effektus" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Ablaktérkép-típusok" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximalizálás effektus" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Rács minimális mérete" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimum csúcs-rácspont mérete" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Ablak áthelyezése" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Összetörés" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Illesztés fordítva" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Ablakok illesztése" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Rugó súrlódása" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Rugóállandó (K)" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Rugóállandó (K)" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "„Ablakok illesztése” effektus kapcsoló" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Rugómodell használata az imbolygó ablakeffektusnál" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Csúcspontrács felbontása" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Ablaktípusok, amelyek imbolyoghatnak fókuszáláskor" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Ablaktípusok, amelyek imbolyoghatnak megfogáskor" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Ablaktípusok, amelyek imbolyoghatnak, amikor térképezettek" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Ablaktípusok, amelyek imbolyoghatnak áthelyezéskor" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Imbolygás ablakok maximalizálásakor és visszaállításakor" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Imbolygó ablakok" #~ msgid "Command line 0" #~ msgstr "0. parancssor" #~ msgid "Run command 0" #~ msgstr "0. parancs futtatása" #~ msgid "Screenshot commands" #~ msgstr "Képernyőkép parancsok" #~ msgid "Screenshot key bindings" #~ msgstr "Képernyőkép gyorsbillentyű" #~ msgid "Filter Linear" #~ msgstr "Lineáris szűrő" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Lineáris szűrő használata nagyításnál" #~ msgid "Zoom Desktop" #~ msgstr "Munkaasztal nagyítása" #~ msgid "Zoom In" #~ msgstr "Nagyítás" #~ msgid "Zoom Out" #~ msgstr "Kicsinyítés" #~ msgid "Zoom Pan" #~ msgstr "Nagyítás" #~ msgid "Zoom Speed" #~ msgstr "Nagyítás sebessége" #~ msgid "Zoom Timestep" #~ msgstr "Nagyítás időköz" #~ msgid "Zoom and pan desktop cube" #~ msgstr "A munkaasztalkocka nagyítása és pásztázása" #~ msgid "Zoom factor" #~ msgstr "Nagyítási arány" #~ msgid "Zoom pan" #~ msgstr "Nagyítás" #~ msgid "Decrease window opacity" #~ msgstr "Ablak átlátszatlanságának csökkentése" #~ msgid "Increase window opacity" #~ msgstr "Ablak átlátszatlanság növelése" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "Átlátszatlansági értékek az alapértelmezésként átlátszó ablakokhoz" #~ msgid "Opacity windows" #~ msgstr "Ablakok átlátszatlansága" #~ msgid "Background Images" #~ msgstr "Háttérképek" #~ msgid "Background images" #~ msgstr "Háttérképek" #~ msgid "Place windows on a plane" #~ msgstr "Ablakok elhelyezése a síkon" #~ msgid "Plane Down" #~ msgstr "Gördítés le" #~ msgid "Plane Left" #~ msgstr "Gördítés balra" #~ msgid "Plane Right" #~ msgstr "Gördítés jobbra" #~ msgid "Plane To Face 1" #~ msgstr "Gördítés az 1. előlap felé" #~ msgid "Plane To Face 10" #~ msgstr "Gördítés a 10. előlap felé" #~ msgid "Plane To Face 11" #~ msgstr "Gördítés a 11. előlap felé" #~ msgid "Plane To Face 12" #~ msgstr "Gördítés a 12. előlap felé" #~ msgid "Plane To Face 2" #~ msgstr "Gördítés a 2. előlap felé" #~ msgid "Plane To Face 3" #~ msgstr "Gördítés a 3. előlap felé" #~ msgid "Plane To Face 4" #~ msgstr "Gördítés a 4. előlap felé" #~ msgid "Plane To Face 5" #~ msgstr "Gördítés az 5. előlap felé" #~ msgid "Plane To Face 6" #~ msgstr "Gördítés a 6. előlap felé" #~ msgid "Plane To Face 7" #~ msgstr "Gördítés a 7. előlap felé" #~ msgid "Plane To Face 8" #~ msgstr "Gördítés a 8. előlap felé" #~ msgid "Plane To Face 9" #~ msgstr "Gördítés a 9. előlap felé" #~ msgid "Plane Up" #~ msgstr "Gördítés fel" #~ msgid "Plane down" #~ msgstr "Gördítés le" #~ msgid "Plane left" #~ msgstr "Gördítés balra" #~ msgid "Plane right" #~ msgstr "Gördítés jobbra" #~ msgid "Plane to face 1" #~ msgstr "Gördítés az 1. előlap felé" #~ msgid "Plane to face 10" #~ msgstr "Gördítés a 10. előlap felé" #~ msgid "Plane to face 11" #~ msgstr "Gördítés a 11. előlap felé" #~ msgid "Plane to face 12" #~ msgstr "Gördítés a 12. előlap felé" #~ msgid "Plane to face 2" #~ msgstr "Gördítés a 2. előlap felé" #~ msgid "Plane to face 3" #~ msgstr "Gördítés a 3. előlap felé" #~ msgid "Plane to face 4" #~ msgstr "Gördítés a 4. előlap felé" #~ msgid "Plane to face 5" #~ msgstr "Gördítés az 5. előlap felé" #~ msgid "Plane to face 6" #~ msgstr "Gördítés a 6. előlap felé" #~ msgid "Plane to face 7" #~ msgstr "Gördítés a 7. előlap felé" #~ msgid "Plane to face 8" #~ msgstr "Gördítés a 8. előlap felé" #~ msgid "Plane to face 9" #~ msgstr "Gördítés a 9. előlap felé" #~ msgid "Plane up" #~ msgstr "Gördítés fel" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Munkaasztal ablakelhalványítási ideje" #~ msgid "Open window menu" #~ msgstr "Ablak menü megnyitása" ./po/es.po0000644000004100000410000041701113246301623012634 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-07-13 00:59+0200\n" "Last-Translator: Franco Guevara \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Escritorio" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Ventana de Gestión" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ninguno" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Tonalidad" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizada" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Maximizar ventana horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Maximizar ventana verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizar" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Elevación automática" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Bajar" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menú de ventanas" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Acción a tomar cuando se desplaza la rueda del ratón sobre una ventana de la " "barra de título." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de difuminado" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidad de la ventana activa del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidad de sombra de la ventana activa del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidad del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidad de sombra del tema de Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Opacidad al utilizar las ventanas activas con decoraciones del tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidad a utilizar para las decoraciones tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Sombra de las ventanas activas con decoraciones de opaco a transparente del " "tema metacity " #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombra ventanas con decoraciones de opaco a transparente del tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Acción de rueda del ratón en la barra de título" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de difuminado usado para decoraciones de ventana" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usar el tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usar el tema Metacity para dibujar las decoraciones de ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Cerrar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximizar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar ventana" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Subir" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Adherir" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Anular sombra" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Desmarcar Sobre" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Despegar" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "La ventana \"%s\" no responde." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forzando la salida de la aplicación puede causar la pérdida de los datos que " "no haya guardado." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "Forzar salida" # Este es un plugin que permite escribir en la pantalla #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotar" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Color de relleno para Anotar" # Comentar color del stroke #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Color de trazo para Anotar" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "plugin Anotar" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpiar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Dibujar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Dibujar usando herramienta" # del plugin Anotar #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Color de relleno para anotaciones" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar dibujo de Anotar" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar borrado de Anotar" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar borrado" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ancho de línea" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ancho de linea para anotaciones" # del plugin Anotar #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Color de Trazo para anotaciones" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ancho de Trazo" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ancho de Trazo para anotaciones" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "Bilineal 4x" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desenfoque Alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Ventanas con desenfoque Alfa" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desenfoque" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusión de desenfoque" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturación de desenfoque" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidad de desenfoque" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desenfocar Ventanas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desenfocar detras de las partes transparentes de las ventanas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturación de desenfoque" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desenfocar ventanas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desenfocar ventanas que no estan en primer plano" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Deshabilitar desenfoque de regiones de la pantalla tapadas por otras ventanas" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtrado usado para desenfoque" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desenfoque de Foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desenfoque de foco para ventanas" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Radio Gaussiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Fuerza Gaussiana" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Radio Gaussiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Fuerza Gaussiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Muestra de textura independiente" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap nivel-de-detalle" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efecto de Pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Usar las unidades de textura disponibles para crear tantas muestras de " "textura independiente como sea posible." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidad de desenfoque de la ventana" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Ventanas que debieran ser afectadas por el desenfoque" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Ventanas que debieran usar desenfoque alfa por defecto" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonar salida" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar selección de clonación" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Manejador de clonación de salida" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Combinación de botones que al utilizarse ejecutará el comando de shell " "identificado como el comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Combinación de teclas que al utilizarse ejecutará el comando de shell " "identificado como el comando9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Asociación de bordes que al utilizarse ejecutará el comando de shell " "identificado como el comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Asignar combinaciones a comandos arbitrarios" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Combinaciones de botones" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Línea de comandos 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Línea de comandos 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Línea de comandos 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Línea de comandos 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Línea de comandos 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Línea de comandos 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Línea de comandos 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Línea de comandos 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Línea de comandos 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Línea de comandos 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Línea de comandos 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Línea de comandos 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command0 es invocado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command1 es invocado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command10 es invocado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command11 es invocado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command2 es invocado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command3 es invocado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command4 es invocado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command5 es invocado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command6 es invocado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command7 es invocado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command8 es invocado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Línea de comandos que se ejecuta en el shell cuando run_command9 es invocado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandos" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Vinculaciones de bordes" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Combinaciones de teclas" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Ejecutar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Ejecutar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Ejecutar comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Ejecutar comando 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Ejecutar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Ejecutar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Ejecutar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Ejecutar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Ejecutar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Ejecutar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Ejecutar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Ejecutar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plugins Activos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que el dibujado de ventanas a pantalla completa no se redireccione " "a pixmaps de fuera de pantalla" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Timbre audible" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Pitido del sistema audible" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevación automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Retraso de elevación automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detección automática de dispositivos de salida" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detección automática de la frecuencia de actualización" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "El mejor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clic para enfocar" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Al hacer clic en la ventana se mueve el foco de entrada a ella" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Cierra la ventana activa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Icono por defecto" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imagen del icono de ventana por defecto" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Tamaño de Escritorio" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar salidas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar frecuencia de actualización" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Opciones de presentación" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Tiempo que el puntero del ratón debe estar en el borde de la pantalla antes " "de que se lance la acción." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Retrazo del Disparador de Bordes" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Enfocar y ampliar; Incrementar comportamiento" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Nivel de Prevención de Enfoque" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Ventanas de Prevención de Enfoque" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Ventanas de prevencion de foco" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Forzar el pintado de salida independiente." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opciones Generales" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opciones generales de Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bueno" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar ventanas omitidas de barra de tareas" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ocultar todas las ventanas y enfocar el escritorio" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Oculta las ventanas que no se encuentran en la barra de tareas al entrar en " "el modo de muestra de escritorio" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Alto" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamaño horizontal virtual" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Si está disponible usar la compresión de texturas convertidas desde imágenes" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar sugerencias al maximizar" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorar sugerencias de aumento de tamaño y aspecto cuando la ventana esté " "maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes de elevar las ventanas seleccionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensajes de ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Combinaciones de Teclas" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Nivel de prevención de atracción de enfoque" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminación" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de plugins activos actualmente" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de cadenas que describen los dispositivos de salida" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Bajo" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Bajar ventana" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Colocar la ventana por debajo de otras" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar ventana horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar ventana verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximiza la ventana activa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximiza la ventana activa horizontalmente" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximiza la ventana activa verticalmente" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiza la ventana activa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de escritorios" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de escritorios virtuales" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Apagado" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Sólo se llevan a cabo actualizaciones de la pantalla durante el período de " "borrado vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Salidas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Manejo de Salida de Traslapes" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Pintar independientemente la salida de cada dispositivo, inclusive si el " "dispositivo de salida se sobrepone" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Retardo de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Preferir salidas grandes" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Preferir salidas pequeñas" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Alzar al hacer clic" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar ventana" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Alza las ventanas seleccionadas tras el intervalo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar la ventana sobre las demás" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Alza las ventanas al hacer clic en ellas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Frecuencia de actualización" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador de tamaño de pantalla para el tamaño horizontal virtual" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de tamaño de pantalla para el tamaño vertical virtual" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Mostar escritorio" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Ralentizar animaciones" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modo inteligente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar con borrado vertical" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Compresión de Textura" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrado de Texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Velocidad con la que se redibuja la pantalla (veces/segundo)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Activar o desactivar ventana maximizada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Activar o desactivar ventana maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Activar o desactivar ventana maximizada verticalmente" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Activar o desactivar ventana con sombra" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Activa o desactiva la ventana activa maximizada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Activa o desactiva la ventana activa maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Activa o desactiva la ventana activa maximizada verticalmente" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Activa o desactiva la ventana activa con sombra" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Activa o desactiva el uso de animaciones lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximiza la ventana activa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Anular redirección de ventanas a pantalla completa" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Usa luz indirecta cuando se transforma la pantalla" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamaño vertical virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Muy Alto" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Cual de los dispositivos de salida de sobreposición debe ser preferido" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botón vinculado al menú de ventana" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla vinculada al menú de ventana" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleración" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajuste de imagen" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustar imagen de la cara superior a la rotación" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avanza a la siguiente diapositiva" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Cúpula animada" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Anima la cúpula cuando se gira el cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Apariencia" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamiento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "El color de los lados superior e inferior del cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Color utilizado para la parada de color inferior del degradado de vuelta " "atrás de la cúpula" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Color utilizado para la parada de color superior del degradado de vuelta " "atrás de la cúpula" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Capas del cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Color del cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo de escritorio" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleración del pliegue" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidad del pliegue" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Paso del pliegue" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Generar mipmap cuando sea posible para obtener una escala de mayor calidad" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Vuelve a la diapositiva anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Archivos de imagen" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagen que se usará como textura de la cúpula" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Iniciar transparencia de Cubo sólo si la rotación es manejada por el mouse" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Cubo interior" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Cubo interior" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de archivos PNG y SVG que se deben procesar en la cara superior del " "cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de multi salidas" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Multiples cubos" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositiva siguiente" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un cubo grande" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidad durante rotacion" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidad cuando no esta rotando" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidad de la ventana de escritorio durante rotacion" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidad de la ventana de escritorio cuando no esta rotando" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Coloca las ventanas en un cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapositiva anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Procesar cúpula" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Escalar imagen" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Escala las imágenes para que cubran la cara superior del cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Seleccione como va a ser visualizado el cubo si son usados multiples " "disporitivos de salida" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Cúpula" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Color de fin del degradado de cúpula" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Color de inicio del degradado de cúpula" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagen de cúpula" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidad" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Paso" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparencia Sólo al Rotar con el Mouse" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo Transparente" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desplegar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Despliega el cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Herramienta de Control de Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permite generar mipmaps para las texturas de decoración" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Decoracion de ventanas" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Línea de comando del decorador que se ejecuta si no hay ningún decorador en " "ejecución" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Desechar desplazamiento X de la sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Desechar desplazamiento Y de la sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Desechar color de la sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Desechar opacidad de la sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Desechar radio de la sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Color de la sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Desplazamiento X de la sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Desplazamiento Y de la sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidad de la sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Radio de la sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Sombra de la ventana" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoración de ventanas" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "La decoración de las ventanas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Ventanas que deben estar decoradas" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Ventanas que deben tener sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Brillo (en %) de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocidad constante" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Tiempo constante" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Atenuar las ventanas que no respondan" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Atenuar las ventanas que no estén respondiendo las peticiones del gestor de " "ventanas" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Modo de desvanecimiento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Desvanecer en Minimizar/Abrir/Cerrar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidad de desvanecimiento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tiempo de desvanecimiento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efecto de desvanecimiento cuando minimizas/abres/cierras ventanas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efecto de desvanecimiento con pitido del sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Las ventanas aparecen progresivamente cuando se asignan y se desvanecen " "cuando se desasignan" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer ventanas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Desvanecer ventanas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Timbre visual a pantalla completa" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" "Efecto de desvanecimiento a pantalla completa con el pitido del sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturación (en %) de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Brillo de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Saturación de las ventanas que no respondan" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Timbre visual" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Modo de desvanecimiento de ventana" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" "Velocidad de desvanecimiento de ventana cuando \"Velocidad constante\" está " "activado" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" "Tiempo de desvanecimiento (en ms) de ventana cuando \"Tiempo constante\" está " "activado" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Ventanas que deberían desvanecerse" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punto de Montaje" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punto de Montaje" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de Archivos del Espacio de Usuario" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de archivos del espacio de usuario" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Herramienta de control de Gconf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "soporte de loop principal de GLib " #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilidad de Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Opciones que mantienen a Compiz compatible con Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Ejecutar diálogo" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Ejecutar comando de terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Línea de comandos de captura de pantalla" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostrar menú principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostrar el cuadro de diálogo de ejecución de aplicación" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Muestra el menú principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Capturar la pantalla" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Toma una captura de pantalla de una ventana" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Línea de comandos para abrir Terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Línea de comandos de captura de ventana" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Herramienta de Archivo Plano Ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Complemento de notificacion de cambio de archivo" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Herramienta de Control Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efecto Minimizar" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar ventanas" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidad al minimizar" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Paso al minimizar" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistencia de decoloración" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistencia a la decoloración" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transforma las ventanas cuando se minimizan o desminimizan" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Tipos de ventana que deben transformarse al minimizarlas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Limitar Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Limita la coordenada Y al área de trabajo" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "No actualizar la posición en el servidor de ventanas hasta que terminan de " "moverse" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar movimiento de ventana" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamiento Flojo" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover ventana" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mueve la ventana" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidad" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nivel de opacidad de las ventanas en movimiento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Separar y desmaximizar automáticamente ventanas maximizadas al arrastrar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Separar ventanas maximizadas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Empieza a mover la ventana" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brillo" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Disminuir brillo" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Aumentar brillo" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Paso de brillo" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Brillo de las ventanas" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Disminuir" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Aumentar" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Disminuir opacidad" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Aumentar opacidad" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Paso de opacidad" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Opacidad de las ventanas" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacidad, brillo y saturación" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Ajustes de opacidad, brillo y saturación" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturación" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Disminuir saturación" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Aumentar saturación" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Paso de saturación" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Saturación de las ventanas" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Paso" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Opciones especifícas de la ventana" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valores de las ventanas" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Ventanas" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Ventanas que deberían tener un brillo diferente por defecto" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Ventanas que deberían tener una opacidad diferente por defecto" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Ventanas que deberían tener una saturación diferente por defecto" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo a emplear para el posicionamiento de ventanas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascada" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrado" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Fijar el posicionamiento de ventanas" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Forzar el posicionamiento de las ventanas" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posiciones de los puntos de vista horizontales" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Mantener en el área de trabajo" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Mantener la ventana posicionada en el área de trabajo, inclusio si eso " "implicase que la posición difiera de la posición específica" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocar ventanas" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Colocar en todas las salidas" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Coloca las ventanas en sus lugares adecuados en la asignación" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de Posicionamiento" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Ventanas Posicionadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatorio" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Selecciona como debe comportarse el acomodamiento de ventanas si se " "selecciona multipes salidas" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligente" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Usar el dispositivo de salida activo" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Usar el dispositivo de salida de la ventana enfocada" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Usar el dispositivo de salida con apuntador" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posiciones de viewport verticales" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Ventanas posicionadas en viewport" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Procedimientos para posicionamiento de ventanas" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Ventanas que deben posicionarse por defecto" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Ventanas que deben posicionarse en viewports específicos por defecto" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Ventanas que deben ser colocadas forzosamente, inclusive si indican que el " "administrador de ventanas debe evitar colocarlas" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Ventanas con posiciones fijas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Ventanas con punto de vista fijo" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluciones alternativas" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posiciones X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posiciones de Viewport X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores de posición X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posiciones Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posiciones de Viewport Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores de posición Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Cargador de imágenes Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex Coincidir" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex coincidir ventanas" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Vínculos" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Color de borde" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Color de borde usado para modos de cambiar tamaño línea exterior y " "rectángulo" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo de Cambio de Tamaño por defecto" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo usado por defecto para cambiar tamaño de ventanas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Color de relleno" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Color de relleno usado por el modo de cambio de tamaño rectangulo" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar cambio de tamaño de ventanas normal" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar cambio de tamaño de ventanas linea exterior" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar cambio de tamaño de ventanas rectangulo" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar cambio de tamaño de ventanas estirar" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar cambio de tamaño de ventanas" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Cambiar Tamaño Ventanas Normal" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Linea Exterior" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Cambio Tamaño Ventanas Linea Exterior" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rectángulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Cambio Tamaño Ventanas Rectángulo" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Cambiar de tamaño la ventana" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Cambia de tamaño la ventana" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Empieza a cambiar el tamaño de la ventana" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Empieza a cambiar el tamaño de la ventana estirándola" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Empieza a cambiar el tamaño de la ventana normalmente" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Empieza a cambiar el tamaño de la ventana con linea exterior" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Empieza a cambiar el tamaño de la ventana con rectángulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Estirar" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Cambiar Tamaño Ventana Estirar" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño con linea exterior" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño con rectángulo" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Ventanas que deben usar cambio de tamaño con estiramiento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD Inversión de Borde" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Mover Inversión de Borde" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Puntero Inversión de Borde" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tiempo de inversión" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Invertir a viewport izquierdo y doblar puntero" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Se invierte al punto de vista siguiente al arrastrar un objeto al borde de " "la pantalla" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Se invierte al punto de vista siguiente al arrastrar un puntero al borde de " "la pantalla" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Se invierte al punto de vista siguiente al mover una ventana al borde de la " "pantalla" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Invertir a punto de vista derecho y doblar puntero" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Invertir eje Y para movimiento de puntero" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertir Y en puntero" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidad del puntero" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar durante la rotación" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar ventanas durante la rotación" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Girar cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Girar a inversión izquierda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Girar a inversión derecha" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Girar a la izquierda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Girar a la izquierda con ventana" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Girar a la derecha" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Girar a la derecha con ventana" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Girar a" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Girar a la Cara 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Girar a la Cara 1 con Ventana" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Girar a la Cara 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Girar a la Cara 10 con Ventana" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Girar a la Cara 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Girar a la Cara 11 con ventana" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Girar a la Cara 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Girar a la Cara 12 con ventana" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Girar a la Cara 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Girar a la Cara 2 con ventana" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Girar a la Cara 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Girar a la Cara 3 con ventana" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Girar a la Cara 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Girar a la Cara 4 con ventana" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Girar a la Cara 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Girar a la Cara 5 con ventana" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Girar a la Cara 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Girar a la Cara 6 con ventana" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Girar a la Cara 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Girar a la Cara 7 con ventana" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Girar a la Cara 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Girar a la Cara 8 con ventana" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Girar a la Cara 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Girar a la Cara 9 con ventana" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Girar cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Girar cubo del escritorio" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Girar a la izquierda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Gira a la izquierda y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Girar a la derecha" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Gira a la derecha y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Girar a la cara del cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Rotar la cara del cubo con la ventana" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Girar a la cara 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Girar a la cara 1 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Girar a la cara 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Girar a la cara 10 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Girar a la cara 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Girar a la cara 11 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Girar a la cara 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Girar a la cara 12 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Girar a la cara 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Girar a la cara 2 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Girar a la cara 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Girar a la cara 3 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Girar a la cara 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Girar a la cara 4 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Girar a la cara 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Girar a la cara 5 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Girar a la cara 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Girar a la cara 6 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Girar a la cara 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Girar a la cara 7 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Girar a la cara 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Girar a la cara 8 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Girar a la cara 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Girar a la cara 9 y arrastra la ventana activa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Girar a viewport" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Girar ventana" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Girar con ventana" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleración de giro" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidad de giro" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Paso de giro" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom de giro" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidad de movimiento del puntero" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Solapa el giro del cubo hacia la cara inferior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Solapa el giro del cubo hacia la cara superior" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Solapar hacia la cara inferior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Solapar hacia la cara superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar giro" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tiempo límite antes de invertir viewport" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Porcentaje de opacidad" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Combinaciones de botones para alternar al modo escalado" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Combinaciones de botones para alternar al modo escalado en vez de " "habilitarlo cuando es presionado y deshabilitarlo cuando es liberado." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Hacer Click en el Escritorio para Mostrar Escritorio" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Oscurecer fondo" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Oscurecer el fondo al escalar las ventanas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Mostrar Escritorio cuando el Escritorio es pinchado durante el Escalado" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tiempo de desplazamiento" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar selector de ventanas" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar selector de ventanas para todas las ventanas" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar selector de ventanas para un grupo de ventanas" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar selector de ventanas para las ventanas de la salida actual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Combinaciones de teclas para alternar al modo escalado" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Combinaciones de teclas para alternar al modo escalado en vez de habilitarlo " "cuando es presionado y deshabilitarlo cuando es liberado" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Diseñar y empezar a transformar todas las ventanas" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Diseñar y empezar a transformar un grupo de ventanas" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Disponer e iniciar transformación de ventanas" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Diseñar y empezar a transformar las ventanas de la salida actual" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "En todos los dispositivos de salida" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "En el dispositivo de salida actual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Superponer icono" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Superponer un icono sobre las ventanas cuando se escalen" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Escalar" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Escalar ventanas" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidad de escala" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Paso de escala" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Escalar ventanas" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Seleccionar qué ventanas escalar si se usan múltiples dispositivos de salida" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espacio entre ventanas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaciado" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tiempo en milisegundos para finalizar el modo de escala al desplazar el " "cursor sobre una ventana" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Ventanas que se deben escalar en el modo de escala" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automaticamente toma una captura de pantalla en esta aplicación" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Carpeta" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Inicia captura de pantalla rectangular" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Iniciar Aplicación" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Poner capturas de pantalla en esta carpeta" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Captura de Pantalla" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin de captura de pantalla" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Cargador de imágenes Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Porcentaje de brillo" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Porcentaje de saturación" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Cambiador de Aplicaciones" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Auto Rotación" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Traer al Frente" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Arrastra la ventana seleccionada al primer plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Escritorio distante debe alejarse mientras se intercambian las ventanas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Icono" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizada" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Panel siguiente" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Ventana siguiente" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Ventana siguiente (Todas las ventanas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Ventana siguiente (Sin emerger)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la ventana siguiente" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la siguiente ventana " "del conjunto total de ventanas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la ventana anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostrar el conmutador si no está visible y seleccionar la ventana anterior " "del conjunto total de ventanas" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Panel anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Ventana ant" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Ventana ant (Todas las ventanas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Ventana ant (Sin Emerger)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Girar a la ventana seleccionada mientras conmuta" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Seleccionar la ventana del tipo de panel siguiente" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Seleccionar la ventana siguiente sin mostrar la ventana emergente" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Seleccionar la ventana del tipo de panel anterior" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Seleccionar la ventana anterior sin mostrar la ventana emergente" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Muestra el icono junto a la miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Muestra ventanas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidad de conmutador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Paso de conmutador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Conmutar Ventanas" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Ventanas que deben mostrarse en el conmutador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Proveer soporte para el espacio de color YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reproducción de Video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Reproducción de video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espacio de color YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Añadir línea" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Añadir punto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Añadir efecto acuático a distintas acciones de escritorio" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Retraso (en milisegundos) entre gotas de lluvia" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Habilitar efectos acuáticos del puntero" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Línea" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Escala de desplazamiento" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Retraso de lluvia" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Ola en el título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Activa o desactiva la lluvia" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Activa o desactiva el efecto de lluvia" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Alternar limpiaparabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Alternar efecto de limpiaparabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efecto acuático" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Escala de desplazamiento de agua" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efecto de ola desde el título de la ventana" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efecto Enfocar" # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efecto Enfocar Ventanas" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Enfocar Ventanas" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricción" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Agarrar Ventanas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolución de la cuadrícula" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Solapamiento de ventanas invertido" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Hacer que la ventana tiemble" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Asignar efecto" # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 # clients/inst_resize_ui.ycp:691 #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Asignar efecto de ventana" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Asignar ventanas" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efecto Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamaño mínimo de cuadrícula" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamaño mínimo de cuadrícula de vértice" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Ventanas" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Temblor" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Solapamiento inverso" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Solapar ventanas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricción de tensión" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constante de tensión" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante de tensión" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Activa o desactiva el solapamiento de ventanas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usa el modelo de muelle para el efecto de ventana gelatinosa" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolución de cuadrícula de vértice" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Ventanas que deben ondear al enfocarse" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Ventanas que deben ondear al agarrarse" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Ventanas que deben ondear al asignarse" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Ventanas que deben ondear al moverse" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efecto gelatinoso al maximizar o desmaximizar las ventanas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ventanas Gelatinosas" #~ msgid "Command line 0" #~ msgstr "Línea de comandos 0" #~ msgid "Run command 0" #~ msgstr "Ejecutar comando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Línea de comandos de captura de pantalla" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Línea de comandos de captura de pantalla" #~ msgid "Filter Linear" #~ msgstr "Filtro lineal" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usa el filtro lineal cuando se hace un acercamiento" #~ msgid "Zoom Desktop" #~ msgstr "Zoom de Escritorio" #~ msgid "Zoom In" #~ msgstr "Ampliar" #~ msgid "Zoom Out" #~ msgstr "Reducir" #~ msgid "Zoom Pan" #~ msgstr "Panoramico" #~ msgid "Zoom Speed" #~ msgstr "Velocidad de zoom" #~ msgid "Zoom Timestep" #~ msgstr "Paso de zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom y panorámica del cubo de escritorio" #~ msgid "Zoom factor" #~ msgstr "Factor de zoom" #~ msgid "Zoom pan" #~ msgstr "Panorámica" #~ msgid "Decrease window opacity" #~ msgstr "Disminuye la opacidad de la ventana" #~ msgid "Increase window opacity" #~ msgstr "Aumenta la opacidad de la ventana" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidad para ventanas que deberían ser translúcidas por " #~ "defecto" #~ msgid "Opacity window values" #~ msgstr "Valores de opacidad de ventanas" #~ msgid "Opacity windows" #~ msgstr "Opacidad de ventanas" #~ msgid "Background Images" #~ msgstr "Imagenes de fondo" #~ msgid "Background images" #~ msgstr "Imagenes de fonde" #~ msgid "Place windows on a plane" #~ msgstr "Posiciona las ventanas en un plano" #~ msgid "Plane Down" #~ msgstr "Plano Abajo" #~ msgid "Plane Left" #~ msgstr "Plano Izquierda" #~ msgid "Plane Right" #~ msgstr "Plano Derecha" #~ msgid "Plane To Face 1" #~ msgstr "Plano a Cara 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano a Cara 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano a Cara 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano a Cara 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano a Cara 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano a Cara 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano a Cara 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano a Cara 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano a Cara 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano a Cara 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano a Cara 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano a Cara 9" #~ msgid "Plane Up" #~ msgstr "Plano Arriba" #~ msgid "Plane down" #~ msgstr "Plano abajo" #~ msgid "Plane left" #~ msgstr "Plano izquierda" #~ msgid "Plane right" #~ msgstr "Plano derecha" #~ msgid "Plane to face 1" #~ msgstr "Plano a cara 1" #~ msgid "Plane to face 10" #~ msgstr "Plano a cara 10" #~ msgid "Plane to face 11" #~ msgstr "Plano a cara 11" #~ msgid "Plane to face 12" #~ msgstr "Plano a cara 12" #~ msgid "Plane to face 2" #~ msgstr "Plano a cara 2" #~ msgid "Plane to face 3" #~ msgstr "Plano a cara 3" #~ msgid "Plane to face 4" #~ msgstr "Plano a cara 4" #~ msgid "Plane to face 5" #~ msgstr "Plano a cara 5" #~ msgid "Plane to face 6" #~ msgstr "Plano a cara 6" #~ msgid "Plane to face 7" #~ msgstr "Plano a cara 7" #~ msgid "Plane to face 8" #~ msgstr "Plano a cara 8" #~ msgid "Plane to face 9" #~ msgstr "Plano a cara 9" #~ msgid "Plane up" #~ msgstr "Plano arriba" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Tiempo de desvanecimiento de opacidad para ventanas del escritorio" #~ msgid "Open window menu" #~ msgstr "Abre el menú de la ventana" #~ msgid "Dock" #~ msgstr "Anclar" #~ msgid "Toolbar" #~ msgstr "Barra de herramientas" #~ msgid "Menu" #~ msgstr "Menú" #~ msgid "Utility" #~ msgstr "Utilidad" #~ msgid "Splash" #~ msgstr "Pantalla inicial" #~ msgid "Dialog" #~ msgstr "Cuadro de diálogo" #~ msgid "DropdownMenu" #~ msgstr "Menú desplegable" #~ msgid "PopupMenu" #~ msgstr "Menú emergente" #~ msgid "Tooltip" #~ msgstr "Sugerencia" #~ msgid "Notification" #~ msgstr "Notificación" #~ msgid "Combo" #~ msgstr "Combo" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Cuadro de diálogo modal" #~ msgid "Fullscreen" #~ msgstr "Pantalla completa" #~ msgid "Unknown" #~ msgstr "Desconocido" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command1" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command11" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command2" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command3" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command4" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command5" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command6" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command7" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command8" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Combinación de teclas que al utilizarse ejecutará el comando de shell " #~ "identificado por command9" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Porcentaje de brillo" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Porcentaje de opacidad" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Porcentaje de saturación" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Saturación" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Retraso (en milisegundos) entre gotas de lluvia" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "" #~ "Distancia de alejamiento al reducir mientras se intercambian las ventanas" #~ msgid "Do not modify" #~ msgstr "No modificar" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Desechar desplazamiento X de la sombra" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Desechar desplazamiento Y de la sombra" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Desechar opacidad de la sombra" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Desechar radio de la sombra" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Enfocar efecto de ventana (ninguno, temblor)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Seleccionar la ventana anterior" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Aceleración de pliegue (de 1,0 a 20,0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Velocidad de pliegue (de 0,1 a 50,0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Paso de pliegue (de 0,1 a 50,0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Federación Rusa" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruso" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Intervalo antes de elevar las ventanas seleccionadas" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Diseñar y empezar a transformar las ventanas de la salida actual" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Asignar efecto de ventana (ninguno, temblor)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Velocidad de minimización (de 0,1 a 50,0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Velocidad de minimización (de 0,1 a 50,0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Tamaño mínimo de cuadrícula de vértice" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Número de escritorios virtuales" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Paso de cambio de opacidad" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Nivel de opacidad de las ventanas en movimiento" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Nivel de opacidad de las ventanas en movimiento" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Superponer un icono sobre las ventanas cuando se escalen" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Plugins that this must load before" #~ msgstr "Complementos que esto debe cargar antes" #~ msgid "Plugins that this requires" #~ msgstr "Complementos que esto requiere" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la siguiente " #~ "ventana del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la siguiente " #~ "ventana del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la ventana " #~ "anterior del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Mostrar el conmutador si no está visible y seleccionar la ventana " #~ "anterior del conjunto total de ventanas" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Aceleración de pliegue (de 1,0 a 20,0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Velocidad de zoom (de 0,1 a 50,0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Paso de ampliar/reducir (de 0,1 a 50,0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Velocidad de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Paso de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "" #~ "Multiplicador de tamaño de pantalla para el tamaño horizontal virtual" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Multiplicador de tamaño de pantalla para el tamaño vertical virtual" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Sensibilidad de movimiento del puntero" #~ msgid "Shade resistance (0-100)" #~ msgstr "Resistencia de sombra (de 0 a 100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Espacio entre ventanas" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Fricción de tensión" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Constante de tensión" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Velocidad de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Paso de escala (de 0,1 a 50,0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Filtrado de texturas (rápido, bueno, mejor)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Velocidad con la que se redibuja la pantalla (veces por segundo)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Tiempo en milisegundos para finalizar el modo de escala al desplazar el " #~ "cursor sobre una ventana" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Tiempo límite antes de invertir viewport" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Usa el filtro lineal cuando se acerca la imagen" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Resolución de cuadrícula de vértice" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Escala de desplazamiento de agua" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Velocidad de desvanecimiento de ventana" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Velocidad de desvanecimiento de ventana" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Tipos de ventanas que se deben escalar en el modo de escala" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Tipos de ventanas que deben mostrarse en el conmutador" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Tipos de ventana que deben transformarse al minimizarlas" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Tipos de ventana que deben desvanecerse" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Tipos de ventana que deben temblar al enfocarse" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Tipos de ventana que deben temblar al obtenerse" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Tipos de ventana que deben temblar al asignarse" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Tipos de ventana que deben temblar al moverse" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Esquinas activas que deben iniciar el modo de escala (superior izquierda, " #~ "superior derecha, inferior izquierda, inferior derecha)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Velocidad de zoom (de 0,1 a 50,0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Paso de ampliar/reducir (de 0,1 a 50,0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Factor de zoom" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Girar a cara %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Girar a cara %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Girar a cara %d con la ventana" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Girar a cara %d y traer la ventana activa" #~ msgid "Rotate To Face %d" #~ msgstr "Girar a cara %d" #~ msgid "Rotate to face %d" #~ msgstr "Girar a cara %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Girar a cara %d con la ventana" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Girar a cara %d y traer la ventana activa" #~ msgid "Command line %d" #~ msgstr "Línea de comando %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Línea de comando que se debe ejecutar en la shell al invocar run_command%d" #~ msgid "Run command %d" #~ msgstr "Ejecutar el comando %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "" #~ "Asociación de teclas que, al invocarse, ejecuta el comando de shell " #~ "identificado por el comando %d" #~ msgid "Move Window Types" #~ msgstr "Mover ventanas de tipo" #~ msgid "Corners" #~ msgstr "Esquinas" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Enfoca las ventanas al pasar el ratón sobre ellas" #~ msgid "Initiate All Windows" #~ msgstr "Iniciar todas las ventanas" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Iniciar movimiento de ventana de teclado" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Iniciar cambio de tamaño de ventana de teclado" #~ msgid "Initiate Window Switcher" #~ msgstr "Iniciar conmutador de ventanas" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Modificador para mostrar el conmutador de todas las ventanas" #~ msgid "Return from scale view" #~ msgstr "Volver desde la vista a escala" #~ msgid "Show switcher" #~ msgstr "Muestra el conmutador" #~ msgid "Sloppy Focus" #~ msgstr "Enfoque aproximado" #~ msgid "Start moving window using keyboard" #~ msgstr "Empieza a mover la ventana mediante el teclado" #~ msgid "Terminate" #~ msgstr "Interrumpir" #~ msgid "Water effect on system beep" #~ msgstr "Efecto acuático con el pitido del sistema" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que se deben desvanecer (Escritorio, Dock, Barra de " #~ "herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de modos, " #~ "Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Tipos de ventanas que se deben transformar al minimizarse (Escritorio, " #~ "Dock, Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, " #~ "Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben cambiar de tamaño en el modo de escala " #~ "(Escritorio, Dock, Barra de herramientas, Menús, Utilidades, Inicial, " #~ "Diálogos, Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que se deben mostrar en el conmutador (Escritorio, " #~ "Dock, Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, " #~ "Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se enfoquen (Escritorio, Dock, " #~ "Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de " #~ "modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se recuperen (Escritorio, " #~ "Dock, Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, " #~ "Diálogo de modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se asignen (Escritorio, Dock, " #~ "Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de " #~ "modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Tipos de ventanas que deben temblar cuando se muevan (Escritorio, Dock, " #~ "Barra de herramientas, Menús, Utilidades, Inicial, Diálogos, Diálogo de " #~ "modos, Normal, Pantalla completa, Desconocidas)" #~ msgid "Wobble effect on system beep" #~ msgstr "Efecto gelatinoso con pitido del sistema" ./po/xh.po0000644000004100000410000017537313246301623012660 0ustar www-datawww-data# Copyright (C) 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: base\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2006-11-03 14:26\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Kuyandululwa" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Gcina ubumbeko" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Gcina ubumbeko" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Gcina ubumbeko" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Ukukhetha Ikhathalogu" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Umyalelo:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Umyalelo '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Umyalelo '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Musa Ukukhetha &Nto" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Hlaziya" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Kuyandululwa" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Umyalelo:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Umyalelo '%1'" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Umyalelo '%1'" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Gcina ubumbeko" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Kuyandululwa" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Kuyandululwa" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Kuyandululwa" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Kugqityiwe Ukuhlohla" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Kuqaliswa Ukuhlohla..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Kuyandululwa" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "I-&Uvimba Weefayili Zendawo Ethile..." #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Ukukhetha Ikhathalogu" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Kuyandululwa" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Ngethuba Lokumisela Inkqubo" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Musa Ukukhetha &Nto" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Musa Ukukhetha &Nto" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Ngethuba Lokumisela Inkqubo" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Umyalelo '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Umyalelo '%1'" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Kugqityiwe Ukuhlohla" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Kugqityiwe Ukuhlohla" #~ msgid "Unknown" #~ msgstr "Akwaziwa" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Gcina ubumbeko" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Kugqityiwe Ukuhlohla" ./po/or.po0000644000004100000410000036545713246301623012665 0ustar www-datawww-data# Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: Oriya\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-16 01:13+0530\n" "Last-Translator: jayashree pujari \n" "Language-Team: gisti \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Poedit-Language: Oriya\n" "X-Poedit-Country: India\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ଡେସ୍କଟପ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ଉଇଣ୍ଡୋ ପ୍ରବନ୍ଧନ" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "କମ୍ପିଜ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "କିଛିନାହିଁ" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "ମାପକ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "ସର୍ବାଧିକ କର" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "ଉଇଣ୍ଡୋକୁ ଦିଗବଳୀଯଭାବରେ ସର୍ବାଧିକ କର" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "ଦଣ୍ଡରୁପରେ ଉଇଣ୍ଡୋକୁ ସର୍ବାଧିକ କର" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ନ୍ଯୁନତମହୋଇଥିବା" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "ସ୍ବତଃ-ଉତ୍ଥାନ" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "ଉଇଣ୍ଡୋ ମେନୁ" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ଗୋଟିଏ ଉଇଣ୍ଡୋ ଶୀର୍ଷକ ବାରରେ ମାଉସ ଚକ୍ରକୁ ଘୁରାଇବା ବେଳେ କରାୟିବାକୁ ଥିବା କାର୍ୟ୍ଯ" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "ଅସ୍ପଷ୍ଟ ପ୍ରକାର" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "ମେଟାସିଟି ଥିମ ସକ୍ରିଯ ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛତା" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "ମେଟାସିଟି ଥିମ ସକ୍ରିଯ ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛତା ଛାଯା" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ମେଟାସିଟି ଥିମ ଅସ୍ବଚ୍ଛତା" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "ମେଟାସିଟି ଥିମ ଅସ୍ବଚ୍ଛତା ଛାଯା" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "ମେଟାସିଟି ଥିମ ଅଳଂକରଣଗୁଡିକ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋ ପାଇଁ ଉପୟୋଗ କରାୟିବାକୁ ଥିବା ଅସ୍ବଚ୍ଛତା" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ମେଟାସିଟି ଥିମ ଅଳଂକରଣଗୁଡିକ ପାଇଁ ଉପୟୋଗ କରାୟିବାକୁ ଥିବା ଅସ୍ବଚ୍ଛତା" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "ମେଟାସିଟି ଥିମ ଅଳଙ୍କରଣଗୁଡିକ ସହିତ ଛାଯା ସକ୍ରିଯ ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛରୁ ସ୍ବଚ୍ଛ ପର୍ୟ୍ଯନ୍ତ " #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "ମେଟାସିଟି ଥିମ ଅଳଙ୍କରଣଗୁଡିକ ସହିତ ଛାଯା, ସକ୍ରିଯ ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛରୁ ସ୍ବଚ୍ଛ ପର୍ୟ୍ଯନ୍ତ " #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ଶୀର୍ଷକ ବାର ମାଉସ ଚକ୍ରର କାର୍ୟ୍ଯ" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ଉଇଣ୍ଡୋ ଅଳଙ୍କରଣଗୁଡିକ ପାଇଁ ଉପୟୋଗ ହୋଉଥିବା ଅସ୍ପଷ୍ଟତାର ପ୍ରକାର" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ମେଟାସିଟି ଥିମ ଉପୟୋଗକର" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ଉଇଣ୍ଡୋ ଅଳଙ୍କରଣଗୁଡିକୁ ଅଂକନ କରିବା ବେଳେ ମେଟାସିଟି ଥିମ ଉପୟୋଗ କର" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ଉଇଣ୍ଡୋ ବନ୍ଦକର" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ଅଣ-ସର୍ବାଧିକ ଉଇଣ୍ଡୋ" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ଉଇଣ୍ଡୋକୁ ସର୍ବାଧିକ କର" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "ଉଇଣ୍ଡୋକୁ ନ୍ଯୁନତମ କର" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "ବ୍ଯାଖ୍ଯା କର" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "ରଙ୍ଗ ପୁରଣ ବ୍ଯାଖ୍ଯାକର" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "ଆଘାତ ରଙ୍ଗକୁ ବ୍ଯାଖ୍ଯା କର" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "ପ୍ଲଗଇନ ବ୍ଯାଖ୍ଯାକର" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "ପରିଷ୍କାରକର" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "ଅଂକନକର" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ସାଧନ ଉପୟୋଗକରି ଅଂକନକର" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ବ୍ଯାଖ୍ଯା ପାଇଁ ରଙ୍ଗ ପୁରଣକର" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "ପ୍ରାରମ୍ଭ କର" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "ଚିତ୍ରାଙ୍କନ ବ୍ଯାଖ୍ଯା ପ୍ରାରମ୍ଭକର" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "ଲିଭାଇବା ବ୍ଯାଖ୍ଯା ଆରମ୍ଭକର" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "ଲିଭାଇବା ପ୍ରାରମ୍ଭ କର" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ରେଖା ଦୈର୍ଘ୍ଯ" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "ବ୍ଯାଖ୍ଯାଗୁଡିକ ପାଇଁ ରେଖା ଓସାର" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ବ୍ଯାଖ୍ଯାଗୁଡିକ ପାଇଁ ଆଘାତ ରଙ୍ଗ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "ଆଘାତ ଓସାର" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "ବ୍ଯାଖ୍ଯାଗୁଡିକ ପାଇଁ ଆଘାତ ରଙ୍ଗ" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xଦ୍ବିରୈଖୀକ" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "ଆଲ୍ଫା ଅସ୍ଫଷ୍ଟ" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "ଆଲ୍ଫା ଅସ୍ପଷ୍ଟ ଉଇଣ୍ଡୋ" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ଅସ୍ପଷ୍ଟ ଫିଲ୍ଟର" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "ଅସ୍ପଷ୍ଟ ଶୋଷଣ" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ଅସ୍ପଷ୍ଟ ସଂପୂର୍ଣ୍ଣ ମିଶ୍ରଣ" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ଅସ୍ପଷ୍ଟ ଗତି" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "ଅସ୍ପଷ୍ଟ ଉଇଣ୍ଡୋ" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ଉଇଣ୍ଡୋର ସ୍ବଚ୍ଛ ଅଂଶଗୁଡିକ ପଛର ଅସ୍ପଷ୍ଟତା" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ଅସ୍ପଷ୍ଟ ସଂପୂର୍ଣ୍ଣ ମିଶ୍ରଣ" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "ଅସ୍ପଷ୍ଟ ଉଇଣ୍ଡୋ" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "ଅସ୍ପଷ୍ଟ ଉଇଣ୍ଡୋ ୟାହାର ଲକ୍ଷ୍ଯ ନାହିଁ" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ଅନ୍ଯ ଉଇଣ୍ଡୋ ଦ୍ବାରା ଅନ୍ଧକାରମଯ କରାୟାଇଥିବା ସ୍କ୍ରିନ ଅଂଚଳଗୁଡିକର ଅସ୍ପଷ୍ଟ କରିବାକୁ ଅକ୍ଷମକର" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ଅସ୍ପଷ୍ଟକରିବା ପାଇଁ ଉପୟୋଗ ହେଉଥିବା ଫିଲ୍ଟର ପଦ୍ଧତି " #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ଲକ୍ଷ୍ଯ ଅସ୍ପଷ୍ଟ" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ଲକ୍ଷ୍ଯ ଅସ୍ପଷ୍ଟ ଉଇଣ୍ଡୋ" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ଗୌସିଆନ" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "ଗୌସିଆନ ବ୍ଯାସାର୍ଦ୍ଧ" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ଗୌସିଆନ ଶକ୍ତି" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "ଗୌସିଆନ ବ୍ଯାସାର୍ଦ୍ଧ" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ଗୌସିଆନ ଶକ୍ତି" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "ମିପ୍ ମ୍ଯାପ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "ମିପ୍ ମ୍ଯାପ LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "ମିପ୍‌ମ୍ଯାପ ବିବରଣୀର-ସ୍ତର" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ପଲ୍ସ(ଗତି)" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ପଲ୍ସ ପ୍ରଭାବ" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ଉଇଣ୍ଡୋ ଅସ୍ପଷ୍ଟ ଗତି" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଲକ୍ଷ୍ଯ ଅସ୍ପଷ୍ଟ ଦ୍ବାରା ପ୍ରଭାବିତ ହେବା ଉଚିତ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଅଲ୍ଫା ଅସ୍ପଷ୍ଟତା ଡିଫଲ୍ଟରେ ଉପୟୋଗ କରିବା ଉଚିତ" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "କ୍ଲୋନ ଆଉଟପୁଟ" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "କ୍ଲୋନ ମନୋନଯନ ପ୍ରାରମ୍ଭ କର" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "ଆଉଟପୁଟ କ୍ଲୋନ ପରିଚାଳକ" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ 0 ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧୦ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧୧ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୨ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୩ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୪ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ୫ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୬ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୭ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୮ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୯ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ 0 ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧୦ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧୧ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୨ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୩ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୪ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ୫ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୬ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୭ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୮ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୯ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ 0 ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧୦ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୧୧ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୨ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୩ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୪ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ୫ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୬ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୭ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୮ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ଗୋଟିଏ କି-ବନ୍ଧନ ୟାହାକି ୟେବେ ଡକାୟାଏ, ଆଦେଶ ୯ ଦ୍ବାରା ଚିହ୍ନଟ ହୋଇଥିବା ସେଲ ଆଦେଶକୁ ଚଳାଇବ " #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "ଆଦେଶ ରେଖା ୧" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "ଆଦେଶ ରେଖା ୧୦ " #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "ଆଦେଶ ରେଖା ୧୧ " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "ଆଦେଶ ରେଖା ୧" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "ଆଦେଶ ରେଖା ୨" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "ଆଦେଶ ରେଖା ୩" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "ଆଦେଶ ରେଖା ୪" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "ଆଦେଶ ରେଖା ୫" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "ଆଦେଶ ରେଖା ୬ " #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "ଆଦେଶ ରେଖା ୭" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "ଆଦେଶ ରେଖା ୮" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "ଆଦେଶ ରେଖା ୯ " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ 0 ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୧ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ0୧୦ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୧୧ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୨ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୩ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୪ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୫ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୬ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୭ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୮ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "ସେଲରେ କାର୍ୟ୍ଯକାରୀ ହେବାକୁ ଥିବା ଆଦେଶ ରେଖା ୟେବେ ଚଳାଅ_ଆଦେଶ୯ ଡକାୟାଇଥାଏ " #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "ଆଦେଶ" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "ଚଳାଅ ଆଦେଶ ୧" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "ଚଳାଅ ଆଦେଶ ୧୦" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "ଚଳାଅ ଆଦେଶ ୧୧" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "ଚଳାଅ ଆଦେଶ ୧" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "ଚଳାଅ ଆଦେଶ ୨" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "ଚଳାଅ ଆଦେଶ ୩" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "ଚଳାଅ ଆଦେଶ ୪" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "ଚଳାଅ ଆଦେଶ ୫" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "ଚଳାଅ ଆଦେଶ ୬" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "ଚଳାଅ ଆଦେଶ ୭" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "ଚଳାଅ ଆଦେଶ ୮" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "ଚଳାଅ ଆଦେଶ ୯" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "ସକ୍ରିଯ ପ୍ଲଗଇନଗୁଡିକ" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "ପୂର୍ଣ୍ଣସ୍କ୍ରିନ ଉଇଣ୍ଡୋର ଅଂକନକୁ ସ୍ବୀକୃତି ଦିଅ, ଅଫ୍ସ୍କ୍ରିନ ପିକ୍ସମ୍ଯାପଗୁଡିକୁ ପୁନଃନିର୍ଦ୍ଦେଶିତ ହେବ ନାହିଁ" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "ଶ୍ରବଣୟୋଗ୍ଯ ଘଣ୍ଟା" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "ଶ୍ରବଣୟୋଗ୍ଯ ସିଷ୍ଟମ ବିପ୍ ଶବ୍ଦ" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "ସ୍ବତଃ-ଉତ୍ଥାନ" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ସ୍ବତଃ-ଉତ୍ଥାନ ବିଳମ୍ବ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "ଆଉଟପୁଟ ଉପକରଣର ସ୍ବଯଂଚାଳିତ ଚିହ୍ନଟକରଣ" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ରିଫ୍ରେସ ଦରର ସ୍ବଯଂଚାଳିତ ଚିହ୍ନଟକରଣ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "ଉତ୍ତମ" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ଲକ୍ଷ୍ଯ କରିବା ପାଇଁ କ୍ଲିକକର" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ଉଇଣ୍ଡୋରେ କ୍ଲିକ, ଇନପୁଟ ଲକ୍ଷ୍ଯ ଏହାଉପରକୁ ଘୁଞ୍ଚାଏ ।" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ବନ୍ଦକର" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "ଡିଫଲ୍ଟ ଆଇକନ" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "ଡିଫଲ୍ଟ ଉଇଣ୍ଡୋ ଆଇକନ ଚିତ୍ର" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ଡେସ୍କଟପ ଘନକ୍ଷେତ୍ର" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "ଆଉଟପୁଟଗୁଡିକୁ ଚିହ୍ନଟକର" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "ରିଫ୍ରେସ ଦର ଚିହ୍ନଟକର" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "ଶୀଘ୍ର" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ଲକ୍ଷ୍ଯ ବାଧାଦେବା ଉଇଣ୍ଡୋ" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ଲକ୍ଷ୍ଯ ବାଧାଦେବା ଉଇଣ୍ଡୋ" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ଲକ୍ଷ୍ଯ ବାଧାଦେବା ଉଇଣ୍ଡୋ" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "ସାଧାରଣ ବିକଳ୍ପଗୁଡିକ" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "ସାଧାରଣ କମ୍ପିଜ ବିକଳ୍ପଗୁଡିକ" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ଉତ୍ତମ" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "ବାଦଦେବା ଟାସ୍କବାର ଉଇଣ୍ଡୋକୁ ଲୁଚାଅ" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "ସବୁ ଉଇଣ୍ଡୋକୁ ଲୁଚାଅ ଏବଂ ଡେସ୍କଟପକୁ ଲକ୍ଷ୍ଯକର" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "ଡେସ୍କଟପ ମୋଡକୁ ଦେଖାଅ କୁ ପ୍ରବେଶ କରିବା ବେଳେ ଉଇଣ୍ଡୋଗୁଡିକୁ ଲୁଚାଅ ଟାସ୍କବାରରେ ନୁହେଁ" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "ଦିଗବଳୀଯ କଳ୍ପିତ ଆକାର" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "ୟେବେ ସର୍ବାଧିକ ହୋଇଥାଏ, ସଂକେତସୂଚନାକୁ ଅବହେଳାକର" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "ୟେବେ ଉଇଣ୍ଡୋ ସର୍ବାଧିକ ହୋଇଥାଏ ଆକାର ବୃଦ୍ଧିକରିବା ଏବଂ ଉଦ୍ଦେଶ୍ଯ ସଂକେତସୂଚନାକୁ ଅବହେଳାକର" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "ମନୋନୀତ ଉଇଣ୍ଡୋ ଉତ୍ଥାନ ପୂର୍ବରୁ ବ୍ଯବଧାନ" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "ପିଙ୍ଗ ସଂଦେଶଗୁଡିକ ମଧ୍ଯରେ ବ୍ଯବଧାନ" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "ଆଲୋକିତକରିବା" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "ବର୍ତ୍ତମାନ ସକ୍ରିଯ ଥିବା ପ୍ଲଗଇନଗୁଡିକର ତାଲିକା" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "ଆଉଟପୁଟ ଉପକରଣଗୁଡିକୁ ବର୍ଣ୍ଣନା କରୁଥିବା ସ୍ଟ୍ରିଙ୍ଗଗୁଡିକର ତାଲିକା" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ନିମ୍ନତର ଉଇଣ୍ଡୋ" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "ଅନ୍ଯ ଉଇଣ୍ଡୋ ତଳକୁ ଉଇଣ୍ଡୋକୁ ନିମ୍ନତର କର" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "ଉଇଣ୍ଡୋକୁ ଦିଗବଳୀଯଭାବରେ ସର୍ବାଧିକ କର" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "ଦଣ୍ଡରୁପରେ ଉଇଣ୍ଡୋକୁ ସର୍ବାଧିକ କର" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ସର୍ବାଧିକ କର" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଦିଗବଳୀଯ ଭାବରେ ସର୍ବାଧିକ କର" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "ଦଣ୍ଡରୂପରେ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ସର୍ବାଧିକ କର" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ନ୍ଯୁନତମ କର" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "ସାମାନ୍ଯ" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ଡେସ୍କଟପଗୁଡିକର ସଂଖ୍ଯା" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "କଳ୍ପିତ ଡେସ୍କଟପଗୁଡିକର ସଂଖ୍ଯା" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ଦଣ୍ଡରୂପ ଖାଲିକରିବା ଅବଧି ସମଯରେ କେବଳ ସ୍କ୍ରିନ ଅପଡେଟଗୁଡିକୁ କର" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "ଆଉଟପୁଟଗୁଡିକ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "ପିଙ୍ଗ ବିଳମ୍ବ" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "କ୍ଲିକରେ ଉତ୍ଥାନକର" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "ଉଇଣ୍ଡୋକୁ ଉଠାଅ" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ବ୍ଯବଧାନ ପରେ ମନୋନୀତ ଉଇଣ୍ଡୋକୁ ଉତ୍ଥାନ କର" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ଅନ୍ଯ ଉଇଣ୍ଡୋ ଗୁଡିକ ଉପରକୁ ଉଠାଅ" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ୟେବେ କ୍ଲିକ ହୁଏ ଉଇଣ୍ଡୋକୁ ଉତ୍ଥାନକର" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "ରିଫ୍ରେସ ଦର" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "ଦିଗବଳୀଯ କଳ୍ପିତ ଆକାର ପାଇଁ ସ୍କ୍ରିନ ଆକାର ଗୁଣକ" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "ଦଣ୍ଡରୂପୀ କଳ୍ପିତ ଆକାର ପାଇଁ ସ୍କ୍ରିନ ଆକାର ଗୁଣକ" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "ଡେସ୍କଟପ ଦେଖାଅ" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "ଧୀର ଚଳଚ୍ଚିତ୍ର " #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "ସ୍ଫୁର୍ତ୍ତି" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "ସିଙ୍କ Vଖାଲିକୁ" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "ଟେକ୍ସଟର ଫିଲ୍ଟର କରିବା" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "ଟେକ୍ସଚର ଫିଲ୍ଟର" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "ଟେକ୍ସଟର ଫିଲ୍ଟର କରିବା" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ଦର ୟେଉଁଥିରେ ସ୍କ୍ରିନ ପୁନଃଅଂକିତ ହୋଇଛି (ସମଯ/ସେକେଣ୍ଡ)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ସର୍ବାଧିକ ହୋଇଥିବା ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "ଦିଗବଳୀଯଭାବରେ ସର୍ବାଧିକ ହୋଇଥିବା ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "ଦଣ୍ଡ ଭାବରେ ସର୍ବାଧିକ ହୋଇଥିବା ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ଛାଯାୟୁକ୍ତ ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "ସର୍ବାଧିକ ହୋଇଥିବା ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "ଦିଗବଳୀଯଭାବରେ ସର୍ବାଧିକ ହୋଇଥିବା ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "ଦଣ୍ଡ ଭାବରେ ସର୍ବାଧିକ ହୋଇଥିବା ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "ଛାଯାୟୁକ୍ତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ଧୀର ଚଳଚିତ୍ରଗୁଡିକର ଉପୟୋଗକୁ ଟୋଗଲକର" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "ଅଣ-ସର୍ବାଧିକ ସକ୍ରିଯ ଉଇଣ୍ଡୋ" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "ଅଣ-ପୁନଃନିର୍ଦ୍ଦେଶିତ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ଉଇଣ୍ଡୋ" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ୟେବେ ସ୍କ୍ରିନ ରୂପାନ୍ତରିତ ହୋଇଥାଏ, ବିକ୍ଷିପ୍ତ ଆଲୋକ ଉପୟୋଗ କର" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "ଦଣ୍ଡରୂପୀ କଳ୍ପିତ ଆକାର" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ଉଇଣ୍ଡୋ ମେନୁ ବଟନ ବନ୍ଧନ" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ଉଇଣ୍ଡୋ ମେନୁ କି ବନ୍ଧନ" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "ବେଗବର୍ଦ୍ଧନ" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ଚିତ୍ର ବ୍ଯବସ୍ଥାକର" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ଘୂର୍ଣ୍ଣନକୁ ଉପର ମୂହଁ ଚିତ୍ରକୁ ବ୍ଯବସ୍ଥାକର" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "ପରବର୍ତ୍ତୀ ସ୍ଲାଇଡକୁ ଅଗ୍ରସର ହୁଅ" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "ସ୍କାଇଡୋମ ଚଳନ୍ତିକର" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ଘନକ୍ଷେତ୍ରକୁ ଘୂର୍ଣ୍ଣନ କରିବା ବେଳେ ସ୍କାଇଡୋମ ଚଳନ୍ତିକର" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "ସ୍ବଯଂଚାଳିତ" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ଘନକ୍ଷେତ୍ରର ଉପର ଏବଂ ତଳପାର୍ଶ୍ବର ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "ସ୍କାଇଡୋମର ତଳ ରଙ୍ଗ-ସ୍ଥାନ ପାଇଁ - ପଶ୍ଚାତପତ୍ତନ କ୍ରମାବନତି ପାଇଁ ଉପୟୋଗ ହେବାକୁ ଥିବା ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "ସ୍କାଇଡୋମର ଉପର ରଙ୍ଗ-ସ୍ଥାନ ପାଇଁ - ପଶ୍ଚାତପତ୍ତନ କ୍ରମାବନତି ପାଇଁ ଉପୟୋଗ ହେବାକୁ ଥିବା ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ଘନକ୍ଷେତ୍ର ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ଘନକ୍ଷେତ୍ର ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ଡେସ୍କଟପ ଘନକ୍ଷେତ୍ର" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "ବେଗବର୍ଦ୍ଧନ ଭାଙ୍ଗକର" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "ଗତି ଭାଙ୍ଗକର" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "ସମଯସୋପାନ ଭାଙ୍ଗକର" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "ଉଚ୍ଚତର ଗୁଣବତ୍ତା ମାପିବା ପାଇଁ ୟେବେ ସମ୍ଭବ ମିପ୍ ମ୍ଯାପଗୁଡିକୁ ଉତ୍ପାଦନକର" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "ପୂର୍ବବର୍ତ୍ତୀ ସ୍ଲାଇଡକୁ ୟାଅ" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "ଚିତ୍ର ଫାଇଲଗୁଡିକ" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "ସ୍କାଇଡୋମ ପାଇଁ ଟେକ୍ସଚର ପରି ଉପୟୋଗ ହେବାକୁ ଥିବା ଚିତ୍ର" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "ୟଦି ଘୂର୍ଣ୍ଣନ କେବଳ ମାଉସ ଦ୍ବାରା ଟଣାୟାଇଥାଏ ଘନକ୍ଷେତ୍ରର ସ୍ବଚ୍ଛତାକୁ ପ୍ରାରମ୍ଭ କରେ ।" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ଘନକ୍ଷେତ୍ର ଭିତରେ" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ଘନକ୍ଷେତ୍ର ଭିତରେ" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr " PNG ଏବଂ SVG ଫାଇଲଗୁଡିକର ତାଲିକା ୟାହାକି ଘନକ୍ଷେତ୍ରର ଉପର ମୁହଁରେ ପ୍ରଦାନ ହେବା ଉଚିତ" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "ବହୁ-ଆଉଟପୁଟ ମୋଡ" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "ବହୁବିଧ ଘନକ୍ଷେତ୍ରଗୁଡିକ" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "ପରବର୍ତ୍ତୀ ସ୍ଲାଇଡ" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "ବଡ ଘନକ୍ଷେତ୍ରରେ" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ଘୁର୍ଣ୍ଣନ ସମଯରେ ଅସ୍ବଚ୍ଛତା" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "ଘୂରା ନୟିବା ବେଳେ ଅସ୍ବଚ୍ଛତା" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ଘୂର୍ଣ୍ଣନ ସମଯରେ ଡେସ୍କଟପ ଉଇଣ୍ଡୋର ଅସ୍ବଚ୍ଛତା" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ଘୁରା ନୟିବା ବେଳେ ଡେସ୍କଟପ ଉଇଣ୍ଡୋର ଅସ୍ବଚ୍ଛତା" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ଘନକ୍ଷେତ୍ରରେ ଉଇଣ୍ଡୋକୁ ସ୍ଥାପିତ କର" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "ପୂର୍ବବର୍ତ୍ତୀ ସ୍ଲାଇଡ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ସ୍କାଇଡୋମ ପ୍ରଦାନକର" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "ଚିତ୍ର ମାପ" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ଘନକ୍ଷେତ୍ରର ଉପ ମୂହଁକୁ ଆବୃତ କରିବା ପାଇଁ ଚିତ୍ରଗୁଡିକୁ ମାପ" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "ୟଦି ବହୁବିଧ ଆଉଟପୁଟ ଉପକରଣଗୁଡିକ ଉପୟୋଗ ହୁଅନ୍ତି, ଘନକ୍ଷେତ୍ର କିପରି ପ୍ରଦର୍ଶିତ ହେବ ମନୋନୀତ କରେ ।" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "ସ୍କାଇଡୋମ" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "ସ୍କାଇଡୋମ କ୍ରମାବନତି ଶେଷ ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "ସ୍କାଇଡୋମ କ୍ରମାବନତି ଆରମ୍ଭ ରଙ୍ଗ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "ସ୍କାଇଡୋମ ଚିତ୍ର" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "ଗତି" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "ସମଯସୋପାନ" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "କେବଳ ମାଉସ ଘୁରାଇବାରେ ସ୍ବଚ୍ଛତା" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "ଭାଙ୍ଗହୋଇନଥିବା" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ଭାଙ୍ଗହୋଇନଥିବା ଘନକ୍ଷେତ୍ର" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "ଡିବସ୍" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ଡିବସ ନିଯନ୍ତ୍ରଣ ବ୍ଯାକଏଣ୍ଡ" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "ଅଳଂକରଣ ଟେକ୍ସଟଚର ପାଇଁ ମିପ୍ ମ୍ଯାପଗୁଡିକୁ ଉତ୍ପାଦିତ ହେବା ସ୍ବୀକୃତିଦିଅ" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "ଆଦେଶ" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "ଅଳଂକରଣ ଉଇଣ୍ଡୋ" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "ଅଳଂକୃତକାରୀ ଆଦେଶ ରେଖା କାର୍ୟ୍ଯକାରୀ ହୋଇଥାଏ, ୟଦି କୌଣସି ଅଳଂକୃତକାରୀ ପୂର୍ବରୁ ଚାଲୁନଥାଏ " #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "ଛାଯା X ଅଫ୍ସେଟ ପକାଅ" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "ଛାଯା Y ଅଫ୍ସେଟ ପକାଅ" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "ଛାଯା ରଙ୍ଗ ପକାଅ" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "ଛାଯା ଅସ୍ବଚ୍ଛତା ପକାଅ" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "ଛାଯା ବ୍ଯାସାର୍ଦ୍ଧ ପକାଅ" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "ଛାଯାରଙ୍ଗ" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "ଛାଯା ଅଫ୍ ସେଟ X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "ଛାଯା ଅଫ୍ ସେଟ Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "ଛାଯା ଅସ୍ବଚ୍ଛତା" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "ଛାଯା ବ୍ଯାସାର୍ଦ୍ଧ" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "ଛାଯା ଉଇଣ୍ଡୋ" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "ଉଇଣ୍ଡୋ ଅଳଂକରଣ" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "ଉଇଣ୍ଡୋ ଅଳଂକରଣଗୁଡିକ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଅଳଂକୃତ ହେବା ଉଚିତ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "ଉଇଣ୍ଡୋ ୟାହାର କି ଗୋଟିଏ ଛାଯା ରହିବା ଉଚିତ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "ଘୂର୍ଣ୍ଣନ ଗତି" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ଅବରୂଦ୍ଧY" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "ସାମାନ୍ଯ ପୁନଃଆକାର ଉଇଣ୍ଡୋ" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "ଫିକାହେବା ସମଯ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ନ୍ଯୁନତମହେବା/ଖୋଲିବା/ବନ୍ଦହେବା ରେ ଫିକା କର" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "ଫିକାହେବା ଗତି" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "ଫିକାହେବା ସମଯ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "ନ୍ଯୁନତମହେବା/ଖୋଲିବା/ବନ୍ଦହେବା ଉଇଣ୍ଡୋ ଘଟଣା ରେ ଫିକ୍କା ପ୍ରଭାବ" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "ସିଷ୍ଟମ ବିପ ଶବ୍ଦରେ ଫିକାହେବା ପ୍ରଭାବ" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "ଉଇଣ୍ଡୋ ଅଂକିତ ହେବା ସମଯରେ ରେ ଫିକ୍କା ହେବା ଏବଂ ଅଂକିତ ନହେବା ସମଯରେ ବାହାରେ ଫିକ୍କା ହେବା" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "ଫିକା ଉଇଣ୍ଡୋ" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ଉଇଣ୍ଡୋ ଫିକାହେଉଛି" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ଦୃଶ୍ଯକ୍ଷମ ଘଣ୍ଟା" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "ସିଷ୍ଟମ ବିପ ଶବ୍ଦରେ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ ଫିକ୍କା ପ୍ରଭାବ" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "ଦୃଶ୍ଯକ୍ଷମ ଘଣ୍ଟା" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "ଉଇଣ୍ଡୋ ଫିକା ହେବା ଗତି" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ମାପ ମୋଡରେ ମାପ ହେବା ଉଚିତ" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଫିକ୍କା ହେବା ଉଚିତ" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "ସ୍ଥାପନ ବିନ୍ଦୁ" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "ସ୍ଥାପନ ବିନ୍ଦୁ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ଉପୟୋଗକର୍ତ୍ତାଅନ୍ତର ଫାଇଲ ସିଷ୍ଟମ" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ଉପୟୋଗକର୍ତ୍ତାଅନ୍ତର ଫାଇଲ ସିଷ୍ଟମ" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gକନ୍ଫ" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "ଜିକନ୍ଫ ନିଯନ୍ତ୍ରଣ ବ୍ଯାକଏଣ୍ଡ" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "ଜିଲିବ୍" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "ଜିଲିବ୍ ମୂଖ୍ଯ ଲୁପ ସମର୍ଥନ" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "ଗୋଟିଏ ଟର୍ମିନାଲ ଖୋଲ" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ଚଳାଅ ଡାଏଲଗ" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "ଟର୍ମିନାଲ ଆଦେଶ ରେଖା" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "ସ୍କ୍ରିନସଟ ଆଦେଶ ରେଖା" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "ମୂଖ୍ଯ ମେନୁ ଦେଖାଅ" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "ଚାଳାଅ ପ୍ରଯୋଗ ଡାଏଲଗକୁ ଦେଖାଅ" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "ମୂଖ୍ଯ ମେନୁକୁ ଦେଖାଅ" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ଗୋଟିଏ ସ୍କ୍ରିନସଟ ନିଅ" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ଗୋଟିଏ ଉଇଣ୍ଡୋର ସ୍କ୍ରିନସଟ ନିଅ" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "ଟର୍ମିନାଲ ଆଦେଶ ରେଖା" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ଉଇଣ୍ଡୋ ସ୍କ୍ରିନସଟ ଆଦେଶ ରେଖା" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "ଇନି ଫ୍ଲାଟ ଫାଇଲ ବ୍ଯାକଏଣ୍ଡ" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ଫାଇଲ ପରିବର୍ତ୍ତନ ବିଜ୍ଞାପନ ପ୍ଲଗଇନ" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Iବିଜ୍ଞାପ୍ତି" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kକନଫିଗ୍" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "K କନଫିଗ୍ ନିଯନ୍ତ୍ରଣ ବ୍ଯାକଏଣ୍ଡ" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "ନ୍ଯୁନତମ ପ୍ରଭାବ" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "ଉଇଣ୍ଡୋକୁ ନ୍ଯୁନତମ କର" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "ଗତିକୁ ନ୍ଯୁନତମକର" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "ସମଯସୋପାନକୁ ନ୍ଯୁନତମକର" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "ଛାଯା ପ୍ରତିରୋଧକ" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "ଛାଯା ପ୍ରତିରୋଧକ" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "ଉଇଣ୍ଡୋ ଗୁଡିକୁ ରୂପାନ୍ତର କର ୟେବେ ସେଗୁଡିକ ନ୍ଯୁନତମ କିମ୍ବା ଅଣ-ନ୍ଯୁନତମ ହୁଅନ୍ତି " #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ରୂପାନ୍ତରିତ ହେବା ଉଚିତ ୟେବେ ନ୍ଯୁନତମ ହୋଇଥାଏ" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "ଅବରୂଦ୍ଧY" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y ସହୟୋଗୀକୁ କାର୍ୟ୍ଯସ୍ଥାନ ଅଂଚଳକୁ ଅବରୁଦ୍ଧକର" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ଉଇଣ୍ଡୋର ସରଭର-ପଟ ସ୍ଥାନକୁ ଅପଡେଟ କର ନାହିଁ ୟେଉଁପର୍ୟ୍ଯନ୍ତ ଘୁଞ୍ଚାଇବା ଶେଷ ହୋଇ ନାହିଁ ।" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ଉଇଣ୍ଡୋ ଘୁଞ୍ଚାଇବା ଆରମ୍ଭ କର" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "ଆଳସ୍ଯ ସ୍ଥାପନ କରିବା" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ଉଇଣ୍ଡୋକୁ ଘୁଞ୍ଚାଅ" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ଉଇଣ୍ଡୋକୁ ଘୁଞ୍ଚାଅ" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "ଅସ୍ବଚ୍ଛତା" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "ଘୁଞ୍ଚାୟାଉଥିବା ଉଇଣ୍ଡୋର ଅସ୍ବଚ୍ଛତା ସ୍ତର" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "ଟାଣିବା ବେଳେ ସର୍ବାଧିକ ଉଇଣ୍ଡୋକୁ ଛିନ୍ନକରିବା ବନ୍ଦକର ଏବଂ ସ୍ବତଃ ଅଣ-ସର୍ବାଧିକ କର " #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "ସର୍ବାଧିକ କରାୟାଇଥିବା ଉଇଣ୍ଡୋକୁ ଛିନ୍ନ କର" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ଉଇଣ୍ଡୋକୁ ଘୁଞ୍ଚାଇବା ଆରମ୍ଭକର" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "ଉଜ୍ବଳତା" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ଉଜ୍ବଳତା" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ଉଜ୍ବଳତା" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ଉଜ୍ବଳତା" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "ଅସ୍ବଚ୍ଛତା ହ୍ରାସକର" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "ଅସ୍ବଚ୍ଛତାକୁ ବୃଦ୍ଧିକର" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "ଅସ୍ବଚ୍ଛତା ପରିବର୍ତ୍ତନ ସୋପାନ" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "ଅସ୍ବଚ୍ଛତା ପରିବର୍ତ୍ତନ ସୋପାନ" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ଅସ୍ବଚ୍ଛତା ସୋପାନ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "ଘୁଞ୍ଚାୟାଉଥିବା ଉଇଣ୍ଡୋର ଅସ୍ବଚ୍ଛତା ସ୍ତର" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ଘୁର୍ଣ୍ଣନ ସମଯରେ ଅସ୍ବଚ୍ଛତା" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "ସଂପୂର୍ଣ୍ଣ ମିଶ୍ରଣ" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ସଂପୂର୍ଣ୍ଣ ମିଶ୍ରଣ" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ସଂପୂର୍ଣ୍ଣ ମିଶ୍ରଣ" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "ସଂପୂର୍ଣ୍ଣ ମିଶ୍ରଣ" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ଉଇଣ୍ଡୋ ଅଳଂକରଣଗୁଡିକ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "ଉଇଣ୍ଡୋ ଗୁଡିକୁ ଅଂକନକର" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଡିଫଲ୍ଟରେ ସ୍ଥାପିତ ହେବା ଉଚିତ" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "ଉଇଣ୍ଡୋଗୁଡିକ ୟାହାକି ଡିଫଲ୍ଟରେ ସ୍ବଚ୍ଛ ହେବା ଉଚିତ" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଡିଫଲ୍ଟରେ ସ୍ଥାପିତ ହେବା ଉଚିତ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ଉଇଣ୍ଡୋ ସ୍ଥାପନ ପାଇଁ ଉପୟୋଗ ହେବାକୁ ଥିବା ଆଲଗୋରିଥମ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "କ୍ଯାସକେଡ" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "କେନ୍ଦ୍ରିତ" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "ଉଇଣ୍ଡୋ ପ୍ରବନ୍ଧନ" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ଲକ୍ଷ୍ଯ ବାଧାଦେବା ଉଇଣ୍ଡୋ" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "ଦିଗବଳାଯ ଦୃଶ୍ଯପୋର୍ଟ ସ୍ଥାନଗୁଡିକ" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "ଉଇଣ୍ଡୋ ସ୍ଥାପିତକର" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ଅଂକନ କରିବା ସମଯରେ ଉଇଣ୍ଡୋକୁ ଗୋଟିଏ ଉପୟୁକ୍ତ ସ୍ଥାନରେ ସ୍ଥାପିତ କର" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ସ୍ଥାପନ ମୋଡ" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "ସ୍ଥାପିତ ଉଇଣ୍ଡୋ" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "କ୍ରମହୀନ" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "ଉଇଣ୍ଡୋ ଗୁଡିକ କେଉଁଠାରେ ମାପ ହେବେ ମନୋନୀତ କରେ ୟଦି ବହୁବିଧ ଆଉଟପୁଟ ଉପକରଣ ଉପୟୋଗ ହୋଇଥାଆନ୍ତି ।" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "ସ୍ଫୁର୍ତ୍ତି" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "ସବୁ ଆଉଟପୁଟ ଉପକରଣରେ" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "ଦଣ୍ଡରୂପୀ ଦୃଶ୍ଯପୋର୍ଟ ସ୍ଥାନଗୁଡିକ" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ଦୃଶ୍ଯପୋର୍ଟ ସ୍ଥାପିତ ଉଇଣ୍ଡୋ" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "ଉଇଣ୍ଡୋ ସ୍ଥାପନ ଚାରିପଟେକାମକରେ" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଡିଫଲ୍ଟରେ ସ୍ଥାପିତ ହେବା ଉଚିତ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଡିଫଲ୍ଟରେ ଗୋଟିଏ ନିର୍ଦ୍ଦିଷ୍ଟ ଦୃଶ୍ଯପୋର୍ଟରେ ସ୍ଥାପିତ ହେବା ଉଚିତ" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ଉଇଣ୍ଡୋ ଅଳଂକରଣଗୁଡିକ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ଚାରିପଟେକାମକରେ" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X ସ୍ଥାନଗୁଡିକ" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ଦୃଶ୍ଯପୋର୍ଟ ସ୍ଥାନଗୁଡିକ" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X ସ୍ଥାନ ମୂଲ୍ଯଗୁଡିକ" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y ସ୍ଥାନଗୁଡିକ" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ଦୃଶ୍ଯପୋର୍ଟ ସ୍ଥାନଗୁଡିକ" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y ସ୍ଥାନ ମୂଲ୍ଯଗୁଡିକ" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ଚିତ୍ର ଲୋଡ କାରୀ" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "ରିଜେକ୍ସ ମେଳଖାଇବା" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "ରିଜେକ୍ସ ଉଇଣ୍ଡୋ ମେଳଖାଇବା" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "ସୀମାନ୍ତ ରଙ୍ଗ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "ବୋର୍ଡର ରଙ୍ଗ ବାହ୍ଯରେଖା ଏବଂ ଆଯତାକାର ପୁନଃଆକାର ମୋଡଗୁଡିକ ପାଇଁ ଉପୟୋଗ ହୋଇଥାଏ " #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "ଡିଫଲ୍ଟ ପୁନଃଆକାର ମୋଡ" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ଡିଫଲ୍ଟ ମୋଡ ଉଇଣ୍ଡୋ ପୁନଃଆକାର ଦେବା ପାଇଁ ଉପୟୋଗ ହୋଇଥାଏ" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "ରଙ୍ଗ ପୁରଣକର" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "ଆଯତାକାର ପୁନଃଆକାର ମୋଡ ପାଇଁ ପୁରଣ ରଙ୍ଗ ଉପୟୋଗ ହୋଇଥାଏ" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "ସାମାନ୍ଯ ଉଇଣ୍ଡୋ ପୁନଃଆକାରଦେବା ପ୍ରାରମ୍ଭ କର" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "ବାହ୍ଯରେଖା ଉଇଣ୍ଡୋ ପୁନଃଆକାରଦେବା ପ୍ରାରମ୍ଭ କର" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "ଆଯତକ୍ଷେତ୍ର ଉଇଣ୍ଡୋ ପୁନଃଆକାରଦେବା ପ୍ରାରମ୍ଭ କର" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "ବିସ୍ତାରିତ ଉଇଣ୍ଡୋ ପୁନଃଆକାରଦେବା ପ୍ରାରମ୍ଭ କର" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "ଉଇଣ୍ଡୋ ପୁନଃଆକାରଦେବା ପ୍ରାରମ୍ଭ କର" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "ସାମାନ୍ଯ ପୁନଃଆକାର ଉଇଣ୍ଡୋ" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "ବାହ୍ଯରେଖା" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "ବାହ୍ଯରେଖା ପୁନଃଆକାର ଉଇଣ୍ଡୋ" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ଆଯତାକାର" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "ଆଯତାକାର ପୁନଃଆକାର ଉଇଣ୍ଡୋ" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ଉଇଣ୍ଡୋକୁ ପୁନଃଆକାରଦିଅ" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ଉଇଣ୍ଡୋକୁ ପୁନଃଆକାରଦିଅ" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ଉଇଣ୍ଡୋକୁ ପୁନଃଆକାର ଦେବା ଆରମ୍ଭକର" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "ଉଇଣ୍ଡୋକୁ ବିସ୍ତାର କରିବା ଦ୍ବାରା ଏହାକୁ ପୁନଃଆକାର ଦେବା ଆରମ୍ଭ କର" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "ସାମାନ୍ଯ ଭାବରେ ଉଇଣ୍ଡୋକୁ ପୁନଃଆକାର ଦେବା ଆରମ୍ଭକର" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "ବାହ୍ଯରେଖା ସହିତ ଉଇଣ୍ଡୋକୁ ପୁନଃଆକାର ଦେବା ଆରମ୍ଭକର" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "ଆଯତାକାର ସହିତ ଉଇଣ୍ଡୋକୁ ପୁନଃଆକାର ଦେବା ଆରମ୍ଭକର" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ବିସ୍ତାରିତ" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "ପୁନଃଆକାର ଉଇଣ୍ଡୋଗୁଡିକୁ ଟାଣିଲମ୍ବାକର" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "ଉଇଣ୍ଡୋ ୟାହା ପାଇଁ ସାମାନ୍ଯ ପୁନଃଆକାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "ଉଇଣ୍ଡୋ ୟାହା ପାଇଁ ବାହ୍ଯରେଖା ପୁନଃଆକାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "ଉଇଣ୍ଡୋ ୟାହା ପାଇଁ ଆଯତାକାର ପୁନଃଆକାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "ଉଇଣ୍ଡୋ ୟାହା ପାଇଁ ବିସ୍ତାରିତ ପୁନଃଆକାର ଉପୟୋଗ ହେବା ଉଚିତ" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "ଧାର ବଦଳ DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "ଧାର ବଦଳ ଘୁଞ୍ଚିବା" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "ଧାର ବଦଳ ପଏଣ୍ଟର" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "ସମଯ ବଦଳକର" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ବାମ ଦୃଶ୍ଯପୋର୍ଟକୁ ବଦଳ କର ଏବଂ ପଏଣ୍ଟରକୁ ବଙ୍କାକର" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "ସ୍କ୍ରିନର ଧାରକୁ ବସ୍ତୁକୁ ଟାଣିବା ବେଳେ ପରବର୍ତ୍ତୀ ଦୃଶ୍ଯପୋର୍ଟକୁ ବଦଳ କର" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "ସ୍କ୍ରିନର ଧାରକୁ ପଏଣ୍ଟରକୁ ଘୁଞ୍ଚାଇବା ବେଳେ ପରବର୍ତ୍ତୀ ଦୃଶ୍ଯପୋର୍ଟକୁ ବଦଳ କର" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ଉଇଣ୍ଡୋକୁ ସ୍କ୍ରିନର ଧାରକୁ ଘୁଞ୍ଚାଇବା ବେଳେ ପରବର୍ତ୍ତୀ ଦୃଶ୍ଯପୋର୍ଟକୁ ବଦଳ କର" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ଡାହାଣ ଦୃଶ୍ଯପୋର୍ଟକୁ ବଦଳ କର ଏବଂ ପଏଣ୍ଟରକୁ ବଙ୍କାକର" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ପଏଣ୍ଟର ଚଳପ୍ରଚଳ ପାଇଁ Y ଅକ୍ଷକୁ ଓଲଟାଅ" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "ପଏଣ୍ଟର ଓଲଟାଅ Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "ପଏଣ୍ଟର ସଂବେଦନଶୀଳତା" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ଘୁରାଇବାରେ ଉଠାଅ" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ଘୁରାଇବା ବେଳେ ଉଇଣ୍ଡୋକୁ ଉତ୍ଥାନ କର" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ଘନକ୍ଷେତ୍ରକୁ ଘୁରାଅ " #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ଫ୍ଲିପ ବାମକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ଫ୍ଲିପ ଡାହାଣକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "ବାମକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ବାମକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ଡାହାଣକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ଡାହାଣକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "କୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "୧କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "୧୦କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୧୦କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "୧୧କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୧୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "୧୨କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୧୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "୨କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "୩କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୩କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "୪କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୪କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "୫କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୫କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "୬କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୬କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "୭କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୭କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "୮କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୮କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "୯କୁ ସମ୍ମୁଖୀନ ହେବାପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୯କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ଘନକ୍ଷେତ୍ରକୁ ଘୁରାଅ " #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ଡେସ୍କଟପ କ୍ଯୁବ୍କୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "ବାମକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "ବାମକୁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ଡାହାଣକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ଡାହାଣକୁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ " #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ " #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "୧୦କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ " #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "୧୦କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "୧୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "୧୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "୧୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ " #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "୧୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "୩କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "୩କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "୪କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "୪କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "୫କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "୫କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "୬କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "୬କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "୭କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "୭କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "୮କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "୮କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "୯କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "୯କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ଘୁରାଅ ଏବଂ ସହିତ ସକ୍ରିଯ ଉଇଣ୍ଡୋକୁ ଆଣ " #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ଦୃଶ୍ଯପୋର୍ଟକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "ଉଇଣ୍ଡୋକୁ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "ଉଇଣ୍ଡୋ ସହିତ ଘୁରାଅ" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "ଘୁର୍ଣ୍ଣନ ଗତିବର୍ଦ୍ଧନ" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "ଘୂର୍ଣ୍ଣନ ଗତି" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "ଘୁର୍ଣ୍ଣନ ସମଯସୋପାନ" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "ଘୁର୍ଣ୍ଣନ ଜୁମ" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ପଏଣ୍ଟର ଚାଳନା ର ସମ୍ବେଦନଶୀଳତା" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ଉପର ମୂହଁକୁ ଘନକ୍ଷେତ୍ରର ଘୁର୍ଣ୍ଣନ ଛିନ୍ନକର" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ଉପର ମୂହଁକୁ ଘନକ୍ଷେତ୍ରର ଘୁର୍ଣ୍ଣନ ଛିନ୍ନକର" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ଉପର ମୂହଁକୁ ଛିନ୍ନକର" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ଉପର ମୂହଁକୁ ଛିନ୍ନକର" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "ଘୁର୍ଣ୍ଣନ ଆରମ୍ଭକର" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ଦୃଶ୍ଯପୋର୍ଟକୁ ବଦଳ କରିବା ପୂର୍ବରୁ ସମଯଶେଷ" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ଜୁମକର(ବଡକର)" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ଶତକଡାରେ ଅସ୍ବଚ୍ଛତାର ପରିମାଣ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ବଡ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ଡେସ୍କଟପକୁ ଦେଖାଇବା ପାଇଁ ଡେସ୍କଟପକୁ କ୍ଲିକ କର" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "ପୃଷ୍ଠଭୂମିକୁ ଗାଢକର" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ଉଇଣ୍ଡୋକୁ ମାପିବା ବେଳେ ପୃଷ୍ଠଭୂମିକୁ ଗାଢ କର" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "ଚିହ୍ନ" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "ମାପ ବେଳେ ୟେବେ ଡେସ୍କଟପ କ୍ଲିକ ହୋଇଥାଏ ଡେସ୍କଟପ ଦେଖାଅ ମୋଡକୁ ପ୍ରବେଶ କର" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ହୋଭର ସମଯ" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "ଉଇଣ୍ଡୋ ଗୋଟାଇବାକୁ ଆରମ୍ଭକର" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "ସବୁ ଉଇଣ୍ଡୋ ପାଇଁ ଉଇଣ୍ଡୋ ପିକ୍କର ପ୍ରାରମ୍ଭକର" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "ଉଇଣ୍ଡୋ ସମୂହ ପାଇଁ ଉଇଣ୍ଡୋ ପିକ୍କର ପ୍ରାରମ୍ଭ କର" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "ଚଳିତ ଆଉଟପୁଟରେ ଉଇଣ୍ଡୋ ପାଇଁ ଉଇଣ୍ଡୋ ପିକ୍କର ପ୍ରାରମ୍ଭ କର" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "ବିରଚନା ଏବଂ ଆରମ୍ଭ ସବୁ ଉଇଣ୍ଡୋକୁ ରୂପାନ୍ତରିତକରୁଛି " #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ବିରଚନା ଏବଂ ଆରମ୍ଭ ଉଇଣ୍ଡୋ ସମୂହକୁ ରୂପାନ୍ତରିତ କରୁଛି" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ବିରଚନା ଏବଂ ଆରମ୍ଭ ଉଇଣ୍ଡୋକୁ ରୂପାନ୍ତରିତ କରୁଛି" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "ବିରଚନା ଏବଂ ଆରମ୍ଭ ଚଳିତ ଆଉଟପୁଟରେ ଉଇଣ୍ଡୋକୁ ରୂପାନ୍ତରିତ କରୁଛି" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "ସବୁ ଆଉଟପୁଟ ଉପକରଣରେ" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "ଚଳିତ ଆଉଟପୁଟ ଉପକରଣରେ" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ବିସ୍ତୃତକରିବା ଆଇକନ" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ଥରେ ସେଗୁଡିକ ମାପ ହେବା ପରେ ଉଇଣ୍ଡୋରେ ଗୋଟିଏ ଆଇକନକୁ ବିସ୍ତୃତକର" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "ମାପକ" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "ଉଇଣ୍ଡୋକୁ ମାପ" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "ଗତି ମାପ" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "ସମଯସୋପାନକୁ ମାପ" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "ଉଇଣ୍ଡୋକୁ ମାପ" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "ଉଇଣ୍ଡୋ ଗୁଡିକ କେଉଁଠାରେ ମାପ ହେବେ ମନୋନୀତ କରେ ୟଦି ବହୁବିଧ ଆଉଟପୁଟ ଉପକରଣ ଉପୟୋଗ ହୋଇଥାଆନ୍ତି ।" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ଉଇଣ୍ଡୋଗୁଡିକ ମଧ୍ଯରେ ଅନ୍ତର" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "ଅନ୍ତରଦେବା" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ସମଯ (in ms)ମାପ ମୋଡ ପୂର୍ବରୁ ନଷ୍ଟ ହୋଇଥାଏ ୟେବେ ଗୋଟିଏ ଉଇଣ୍ଡୋ ଉପରେ ଦୋଳାଯମାନ ହୁଏ " #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ମାପ ମୋଡରେ ମାପ ହେବା ଉଚିତ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "ଏହି ପ୍ରଯୋଗରେ ସ୍ବଯଂଚାଳିତଭାବରେ ସ୍କ୍ରିନସଟ ଖୋଲ" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ବିବରଣୀପଞ୍ଜିକା" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "ଆଯତାକାର ସ୍କ୍ରିସଟକୁ ଆରମ୍ଭକର" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "ପ୍ରାରମ୍ଭକରିବା ପ୍ରଯୋଗ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "ଏହି ବିବରଣୀପଞ୍ଜିକାରେ ସ୍କ୍ରିନସଟ ଚିତ୍ରଗୁଡିକୁ ରଖ" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "ସ୍କ୍ରିନ ସଟ" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "ସ୍କ୍ରିନସଟ ପ୍ଲଗଇନ" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ଚିତ୍ର ଲୋଡକାରୀ" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "ଶତକଡାରେ ଉଜ୍ବଳତାର ପରିମାଣ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "ଶତକଡାରେ ସଂପୂର୍ଣ୍ଣମିଶ୍ରଣର ପରିମାଣ" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "ପ୍ରଯୋଗ ଅଦଳବଦଳକାରୀ" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "ସ୍ବତଃଘୁର୍ଣ୍ଣନ" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "ଆଗକୁ ଆଣ" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ମନୋନୀତ ଉଇଣ୍ଡୋକୁ ଆଗକୁ ଆଣ" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ଉଇଣ୍ଡୋକୁ ଅଦଳବଦଳ କରିବା ବେଳେ ଦୂରତା ଡେସ୍କଟପ ଜୁମ ଆଉଟ ହେବା ଉଚିତ" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "ଆଇକନ" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ନ୍ଯୁନତମହୋଇଥିବା" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ଡେସ୍କଟପ ସମତଳ" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "ପରବର୍ତ୍ତୀ ଉଇଣ୍ଡୋ" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "ପରବର୍ତ୍ତୀ ଉଇଣ୍ଡୋ(ସବୁ ଉଇଣ୍ଡୋ)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "ପରବର୍ତ୍ତୀ ଉଇଣ୍ଡୋ(ପପ୍ଅପ ନାହିଁ)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "ପପ୍ ଅପ ବଦଳକାରୀ ୟଦି ଦୃଶ୍ଯମାନ ନ ଥାଏ ଏବଂ ପରବର୍ତ୍ତୀ ଉଇଣ୍ଡୋକୁ ମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "ପପ୍ ଅପ ବଦଳକାରୀ ୟଦି ଦୃଶ୍ଯମାନ ନ ଥାଏ ଏବଂ ସବୁ ଉଇଣ୍ଡୋ ମଧ୍ଯରୁ ପରବର୍ତ୍ତୀ ଉଇଣ୍ଡୋକୁ ମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "ପପ୍ ଅପ ବଦଳକାରୀ ୟଦି ଦୃଶ୍ଯମାନ ନ ଥାଏ ଏବଂ ପୂର୍ବବର୍ତ୍ତୀ ଉଇଣ୍ଡୋକୁ ମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "ପପ୍ ଅପ ବଦଳକାରୀ ୟଦି ଦୃଶ୍ଯମାନ ନ ଥାଏ ଏବଂ ସବୁ ଉଇଣ୍ଡୋ ମଧ୍ଯରୁ ପୂର୍ବବର୍ତ୍ତୀ ଉଇଣ୍ଡୋକୁ ମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "ପୂର୍ବବର୍ତ୍ତୀ ସ୍ଲାଇଡ" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "ପୂର୍ବବର୍ତ୍ତୀ ଉଇଣ୍ଡୋ" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "ପୂର୍ବବର୍ତ୍ତୀ ଉଇଣ୍ଡୋ( ସବୁ ଉଇଣ୍ଡୋ)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "ପୂର୍ବବର୍ତ୍ତୀ ଉଇଣ୍ଡୋ(ପପ୍ଅପ ନାହିଁ)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "ବଦଳ କରିବା ବେଳେ ମନୋନୀତ ଉଇଣ୍ଡୋକୁ ଘୁରାଅ" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "ପପ୍ ଅପ ଉଇଣ୍ଡୋକୁ ବିନା ଦେଖାଇ ପରବର୍ତ୍ତୀ ଉଇଣ୍ଡୋକୁ ମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ପପ୍ ଅପ ଉଇଣ୍ଡୋକୁ ବିନା ଦେଖାଇ ପୂର୍ବବର୍ତ୍ତୀ ଉଇଣ୍ଡୋକୁ ମନୋନୀତକର" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "ଥମନେଇଲ ନିକଟରେ ଥିବା ଆଇକନକୁ ଦେଖାଅ" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "ନ୍ଯୁନତମ ହୋଇଥିବା ଉଇଣ୍ଡୋକୁ ଦେଖାଅ" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "ଅଦଳବଦଳକାରୀ ଗତି" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "ଅଦଳବଦଳକାରୀ ସମଯସୋପାନ" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "ଉଇଣ୍ଡୋ ଅଦଳବଦଳକାରୀ" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ବଦଳକାରୀରେ ଦେଖାଇବା ଉଚିତ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 ରଙ୍ଗସ୍ଥାନ ସମର୍ଥନ ୟୋଗାଇଦିଅ" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ଭିଡିଓ ପୃଷ୍ଠଗାଯନ" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ଭିଡିଓ ପୃଷ୍ଠଗାଯନ" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 ରଙ୍ଗସ୍ଥାନ" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "ରେଖା ୟୋଗକର" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "ବିନ୍ଦୁ ୟୋଗକର" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "ବିଭିନ୍ନ ଡେସ୍କଟପ କାର୍ୟ୍ଯକୁ ପାଣି ପ୍ରଭାବ ୟୋଗକର" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ପ୍ରତ୍ଯେକ ବର୍ଷା ବିନ୍ଦୁ ମଧ୍ଯରେ ବିଳମ୍ବ(in ms) " #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ପଏଣ୍ଟର ପାଣି ପ୍ରଭାବଗୁଡିକୁ ସକ୍ଷମ କର" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ରେଖା" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ଅଫ୍ ସେଟ ମାପକ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "ବିନ୍ଦୁ" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "ବର୍ଷା ବିଳମ୍ବ" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "ଶୀର୍ଷକ ତରଙ୍ଗ" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "ବର୍ଷାକୁ ଟେଗଲକର" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "ବର୍ଷା ପ୍ରଭାବକୁ ଟେଗଲକର" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "ପୋଛିବା ଟୋଗଲକର" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "ପୋଛିବା ପ୍ରଭାବକୁ ଟେଗଲକର" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "ପାଣି ପ୍ରଭାବ" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "ପାଣି ଅଫ୍ସେଟ ମାପକ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ଉଇଣ୍ଡୋ ଶୀର୍ଷକରୁ ତରଙ୍ଗ ପ୍ରଭାବ" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ଲକ୍ଷ୍ଯ ପ୍ରଭାବ" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ଲକ୍ଷ୍ଯ ଉଇଣ୍ଡୋ ପ୍ରଭାବ" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ଲକ୍ଷ୍ଯ ଉଇଣ୍ଡୋ" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "ଘର୍ଷଣ" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "ଉଇଣ୍ଡୋ ଟାଣିନିଅ" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "ରିଜୋଲ୍ଯୁସନ" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ଓଲଟାହୋଇଥିବା ଉଇଣ୍ଡୋ ଛିନ୍ନକରିବା " #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "ଉଇଣ୍ଡୋ ସିଭର କର" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "ପ୍ରଭାବକୁ ଅଂକନକର" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ଉଇଣ୍ଡୋ ପ୍ରଭାବକୁ ଅଂକନକର" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "ଉଇଣ୍ଡୋ ଗୁଡିକୁ ଅଂକନକର" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "ପ୍ରଭାବକୁ ସର୍ବାଧିକ କର" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "ନ୍ଯୁନତମ ଗ୍ରୀଡ ଆକାର" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "ନ୍ଯୁନତମ ଭର୍ଟେକ୍ସ ଗ୍ରୀଡ ଆକାର" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "ଉଇଣ୍ଡୋକୁ ଘୁଞ୍ଚାଅ" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "ଥରିବା" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "ଛିନ୍ନକରିବା ଓଲଟାଗଲା" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ଛିନ୍ନ ଉଇଣ୍ଡୋ" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "ସ୍ପ୍ରିଙ୍ଗ ଘର୍ଷଣ" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "ସ୍ପ୍ରିଙ୍ଗ K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "ସ୍ପ୍ରିଙ୍ଗ କନଷ୍ଟାଣ୍ଟ" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "ଉଇଣ୍ଡୋ ଛିନ୍ନକରିବାକୁ ଟେଗଲକର" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ଅସ୍ଥିର ଉଇଣ୍ଡୋ ପ୍ରଭାବ ପାଇଁ ସ୍ପିଙ୍ଗ ମୋଡେଲ ଉପୟୋଗକର " #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "ଭର୍ଟେକ୍ସ ଗ୍ରୀଡ ରିଡୋଲ୍ଯୁସନ" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଲକ୍ଷ୍ଯ କେନ୍ଦ୍ରିତ ହେବା ବେଳେ ଅସ୍ଥିର ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ୟେବେ ଟଣାୟାଏ ଅସ୍ଥିର ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଅଂକନ ହେବା ବେଳେ ଅସ୍ଥିର ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ଉଇଣ୍ଡୋ ୟାହାକି ଘୁଞ୍ଚାଇବା ବେଳେ ଅସ୍ଥିର ହେବା ଉଚିତ" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ଉଇଣ୍ଡୋକୁ ସର୍ବାଧିକ କିମ୍ବା ଅଣ-ସର୍ବାଧିକ କରିବା ବେଳେ ଅସ୍ଥିର ପ୍ରଭାବ" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "ଅସ୍ଥିର ଉଇଣ୍ଡୋ" #~ msgid "Command line 0" #~ msgstr "ଆଦେଶ ରେଖା ୦ " #~ msgid "Run command 0" #~ msgstr "ଚଳାଅ ଆଦେଶ ୦" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "ସ୍କ୍ରିନସଟ ଆଦେଶ ରେଖା" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "ସ୍କ୍ରିନସଟ ଆଦେଶ ରେଖା" #~ msgid "Filter Linear" #~ msgstr "ଫିଲ୍ଟର ରୌଖୀକ:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ୟେବେ ବଡ ହୋଇଥାଏ ରୈଖୀକ ଫିଲ୍ଟର ଉପୟୋଗକର" #~ msgid "Zoom Desktop" #~ msgstr "ଡେସ୍କଟପ ବଡକର" #~ msgid "Zoom In" #~ msgstr "ବଡକର" #~ msgid "Zoom Out" #~ msgstr "ଛୋଟ କର" #~ msgid "Zoom Pan" #~ msgstr "ଜୁମ ପାନ" #~ msgid "Zoom Speed" #~ msgstr "ଜୁମ ଗତି" #~ msgid "Zoom Timestep" #~ msgstr "ଜୁମ ସମଯସୋପାନ" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ଜୁମ ଏବଂ ପ୍ଯାନ ଡେସ୍କଟପ ଘନକ୍ଷେତ୍ର" #~ msgid "Zoom factor" #~ msgstr "ଜୁମ କାରଣ" #~ msgid "Zoom pan" #~ msgstr "ଜୁମ ପାନ " #~ msgid "Decrease window opacity" #~ msgstr "ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛତା ହ୍ରାସକର" #~ msgid "Increase window opacity" #~ msgstr "ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛତା ବୃଦ୍ଧିକର" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "ଉଇଣ୍ଡୋ ପାଇଁ ଅସ୍ବଚ୍ଛତା ମୂଲ୍ଯଗୁଡିକ ୟାହାକି ଡିଫଲ୍ଟରେ ସ୍ବଚ୍ଛ ହେବା ଉଚିତ" #~ msgid "Opacity window values" #~ msgstr "ଅସ୍ବଚ୍ଛତା ଉଇଣ୍ଡୋ ମୂଲ୍ଯଗୁଡିକ" #~ msgid "Opacity windows" #~ msgstr "ଅସ୍ବଚ୍ଛତା ଉଇଣ୍ଡୋ" #~ msgid "Background Images" #~ msgstr "ପୃଷ୍ଠଭୂମି ଚିତ୍ରଗୁଡିକ" #~ msgid "Background images" #~ msgstr "ପୃଷ୍ଠଭୂମି ଚିତ୍ରଗୁଡିକ" #~ msgid "Place windows on a plane" #~ msgstr "ଗୋଟିଏ ସମତଳରେ ଉଇଣ୍ଡୋକୁ ସ୍ଥାପନ କର" #~ msgid "Plane Down" #~ msgstr "ସମତଳ ତଳକୁ" #~ msgid "Plane Left" #~ msgstr "ସମତଳ ବାମକୁ" #~ msgid "Plane Right" #~ msgstr "ସମତଳ ଡାହାଣକୁ" #~ msgid "Plane To Face 1" #~ msgstr "୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 10" #~ msgstr "୧୦କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 11" #~ msgstr "୧୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 12" #~ msgstr "୧୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 2" #~ msgstr "୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 3" #~ msgstr "୩କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 4" #~ msgstr "୪କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 5" #~ msgstr "୫କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 6" #~ msgstr "୬କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 7" #~ msgstr "୭କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 8" #~ msgstr "୮କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane To Face 9" #~ msgstr "୯କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane Up" #~ msgstr "ସମତଳ ଉପର" #~ msgid "Plane down" #~ msgstr "ସମତଳ ତଳକୁ" #~ msgid "Plane left" #~ msgstr "ସମତଳ ବାମକୁ" #~ msgid "Plane right" #~ msgstr "ସମତଳ ବାମକୁ" #~ msgid "Plane to face 1" #~ msgstr "୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 10" #~ msgstr "୧୦କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 11" #~ msgstr "୧୧କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 12" #~ msgstr "୧୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 2" #~ msgstr "୨କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 3" #~ msgstr "୩କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 4" #~ msgstr "୪କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 5" #~ msgstr "୫କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 6" #~ msgstr "୬କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 7" #~ msgstr "୭କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 8" #~ msgstr "୮କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane to face 9" #~ msgstr "୯କୁ ସମ୍ମୁଖୀନ ହେବା ପାଇଁ ସମତଳ" #~ msgid "Plane up" #~ msgstr "ସମତଳ ଉପର" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ଡେସ୍କଟପ ଉଇଣ୍ଡୋ ଅସ୍ବଚ୍ଛାତା ଫିକା ହେବା ସମଯ ।" #, fuzzy #~ msgid "Dialog" #~ msgstr "टोण डायलिन्क (&T)" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "विन्डो मैनेजर" #, fuzzy #~ msgid "Notification" #~ msgstr "क्रिया" #~ msgid "Unknown" #~ msgstr "अनंजान" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "अवधि" #, fuzzy #~ msgid "Do not modify" #~ msgstr "किसी को लोग न करें" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "त्रिज्या" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "निम्नतम &GID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "क्रिया" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "स्टेपिगं" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "फिल्टर सैट करें" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "सेर्वर सार" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "छोडं दिया \n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Command line %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Move Window Types" #~ msgstr "संभरक" #, fuzzy #~ msgid "Corners" #~ msgstr "कोर्निश" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "फ्लोपी डिस्क" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Terminate" #~ msgstr "टर्मिनल" ./po/bs.po0000644000004100000410000020075013246301623012631 0ustar www-datawww-data# Bosnian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2001 SuSE GmbH. # Copyright (C) 2002 SuSE Linux AG. # Damir Bjelobradic , 2001. # Amila Akagic , 2002. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2002-07-23 18:27+0200\n" "Last-Translator: Damir Bjelobradic \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Desktop postavke" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Windhoek" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nijedan" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Vrijednost" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Windhoek" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Windhoek" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "&Postavi filter" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Indija" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Indija" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Indija" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Indija" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filter: %1" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "&Postavi filter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Sajgon" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Sajgon" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "&Postavi filter" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Sajgon" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Ruski" # RU #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Ruska Federacija" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Ruski" # RU #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Ruska Federacija" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Ruski" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windhoek" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Indija" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "&Podrazumjevani" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Podrazumjevani datum &isteka" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Desktop postavke" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Logging" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" # SH #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Saint Helena" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Ponovi &mjeru" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Desktop postavke" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Konfiguracije" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Postavi filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Postavi filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Postavi filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D ubrzanje:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Indija" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Desktop postavke" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D ubrzanje:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalno vrijeme" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "lokalno vrijeme" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Windhoek" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Bez opisa" # RU #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Ruska Federacija" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "lokalno vrijeme" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windhoek" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Windhoek" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "lokalno vrijeme" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Windhoek" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sajgon" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" # RU #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Ruska Federacija" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windhoek" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Windhoek" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Windhoek" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" # RU #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Ruska Federacija" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" # RU #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Ruska Federacija" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Windhoek" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Indija" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Desktop postavke" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Desktop postavke" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Desktop postavke" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D ubrzanje:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Pono&vo pokreni detekciju" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Indija" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Vrijednost" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Windhoek" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Španija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Indija" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Indija" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Opis" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop postavke" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" # SH #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Saint Helena" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Opis" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezolucije:" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Windhoek" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Opis" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Španija" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Španija" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezolucije:" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windhoek" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: %1" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Desktop postavke" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Plane down" #~ msgstr "Windhoek" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Notification" #~ msgstr "Opis" #~ msgid "Unknown" #~ msgstr "Nepoznato" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Sajgon" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D ubrzanje:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testiraj" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Ruska Federacija" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruski" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D ubrzanje:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Opis" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Španija" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Postavi filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezolucije:" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windhoek" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Corners" #~ msgstr "Štampači" ./po/hr.po0000644000004100000410000022375313246301623012646 0ustar www-datawww-data# Croatian message file for YaST2 (@memory@) # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # Vlatko Kosturjak , 2001 # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-22 13:42+0100\n" "Last-Translator: Matija Folnovic \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n != 1);\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Radna površina" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Upravitelj Prozora" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ništa" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skener" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Smanji Windowse" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maksimiziraj prozor horizontalno" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maksimiziraj prozor vertikalno" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Smanji Windowse" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatsko prikazivanje" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Upravitelji Prozorima" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Akcija koja ce se napraviti kada se scroll-a misem preko naslovne trake" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Brzina:" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Transparentnost Metacity teme prozora" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "&Obriši Windows kompletno" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "Zatvori prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimiziraj prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimiziraj prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Indija" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Postavke arhiva" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Izbrisi" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Nacrtaj" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Crtaj koristeci alat" #: ../metadata/annotate.xml.in.h:8 #, fuzzy msgid "Fill color for annotations" msgstr "Naučite više iz dokumenatcije" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Aktiviraj" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Indija" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Indija" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Debljina linije" #: ../metadata/annotate.xml.in.h:14 #, fuzzy msgid "Line width for annotations" msgstr "Naučite više iz dokumenatcije" #: ../metadata/annotate.xml.in.h:15 #, fuzzy msgid "Stroke color for annotations" msgstr "Naučite više iz dokumenatcije" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 #, fuzzy msgid "Stroke width for annotations" msgstr "Naučite više iz dokumenatcije" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha mutnost" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "&Obriši Windowse" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Brzina:" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Trajanje mutnosti" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "&Obriši Windowse" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "&Obriši Windowse" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "&Obriši Windowse" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "&Obriši Windowse" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Ruski" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Ruski" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Ruski" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Ruski" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Ruski" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Lima" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Lima" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows slobodno (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Sažmi izlaz" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Indija" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Naredba 1 " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Naredba 10 " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Naredba 11 " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Naredba 1 " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Naredba 2 " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Naredba 3 " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Naredba 4 " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Naredba 5" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Naredba 6" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Naredba 7 " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Naredba 8 " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Naredba 9 " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Naredba '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Naredba: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Naredba: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktivni dodaci" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Automatsko prikazivanje" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatska detekcija output uredaja" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatska detekcija osvjezavanja" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Najbolji" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klikni za fokusiranje" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zatvori aktivni prozor" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Osnovna ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Postavke okružja" #: ../metadata/core.xml.in.in.h:17 #, fuzzy msgid "Detect Outputs" msgstr "Detektiraj izlaz" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detektiraj osvjezavanje" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Brzina" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Omogući ZEN particiju" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Generalne opcije" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generalne compiz opcije" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Dobro" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Sakrij sve prozore i fokusiraj radnu povrsinu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Velicina virtualne horizontale" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Vrijeme prije pojavljivanja selektiranog prozora" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "Omogući ZEN particiju" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista trenutno aktivnih prozora" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Spusti prozor" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksimiziraj prozor horizontalno" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksimiziraj prozor vertikalno" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksimiziraj aktivni prozor" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksimiziraj aktivni prozor horizontalno" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksimiziraj prozor vertikalno" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimiziraj aktivni prozor" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Broj radnih povrsina" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Radne površine" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Odgoda" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "&Obriši Windowse" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Ob&oviti" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Radne površine" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Konfiguracije" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Postavi filter" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Postavi filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtualni Diskovi" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Akcija" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydnej" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatski" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Postavke okružja" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "Akcija" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Brzina:" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Instaliram presliku datoteke" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "&Obriši Windowse" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&Obriši Windowse" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "&Smanji Windowse" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalno vrijeme" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydnej" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sydnej" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Brzina:" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "&Testiraj" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Naredba: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&Obriši Windowse" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&Obriši Windows kompletno" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&Obriši Windows kompletno" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Prikaži &detalje" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&Obriši Windows kompletno" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Prikaži &detalje" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&Obriši Windows kompletno" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Prikaži &detalje" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Nema opisa" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind opcije" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Mountain" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "&Obriši Windowse" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Brzina:" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "&Testiraj" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Datotečni Sustav" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Obriši Windowse" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Smanji Windowse" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows slobodno (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Dodaj točku provjere" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Dodaj točku provjere" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Pokreni u terminalu" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Naredba: " #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Naredba: " #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Mountain" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "&Obriši Windowse" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "&Smanji Windowse" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "&Obriši Windowse" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "&Obriši Windowse" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Obriši Windowse" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Pokrećem servis." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Smanji Windowse" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Pokrećem servis." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Most" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Most" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Most" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Most" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Smanji transparentnost" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Povecaj transparentnost" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Step mijenjanja transparentnosti" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Step mijenjanja transparentnosti" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Broj virtualnih radnih povrsina" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Pokrećem servis." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind opcije" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows iskorišteno:" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "&Smanji Windowse" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Upravitelj Prozora" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Obriši Windowse" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Obriši Windowse" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtualni Diskovi" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Indija" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Pokrećem servis." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Pokazivač na %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Pokazivač na %1" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "&Obriši Windowse" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "&Obriši Windowse" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Postavke okružja" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Postavke okružja" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "&Obriši Windowse" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "&Obriši Windowse" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Pokrećem servis." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Akcija" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "&Testiraj" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Pokrenuti servis" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "&Obriši Windowse" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Skener" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Obriši Windowse" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalno vrijeme" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Obriši Windowse" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Obriši Windowse" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Tražim..." #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 #, fuzzy msgid "Automatically open screenshot in this application" msgstr "Automatski pokreni program prilikom prijave" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Direktorij\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Indija" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Aplikacija za zamjenu:" #: ../metadata/screenshot.xml.in.h:6 #, fuzzy msgid "Put screenshot images in this directory" msgstr "Rekurzija u direktorij" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Postavke arhiva" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatski" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Akcija" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Akcija" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Postavke okružja" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Pokrećem servis." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalno vrijeme" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Dodaj servis" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Dodaj točku provjere" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Odgoda" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Promijeni status" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezolucija" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Minimalni &GUID" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Minimalni &GUID" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "&Obriši Windowse" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Pogonski program" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Preskačem %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Preskačem %1" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezolucija" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Naredba 0" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Naredba '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Postavke arhiva" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Postavke arhiva" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Ime datoteke" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Radne površine" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "Smanji transparentnost prozora" #~ msgid "Increase window opacity" #~ msgstr "Povecaj transparentnost prozora" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane Down" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane Left" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane Right" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane Up" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane down" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane left" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane right" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Plane up" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Dialog" #~ msgstr "Katalog" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Upravitelji Prozorima" #, fuzzy #~ msgid "Notification" #~ msgstr "Akcija" #~ msgid "Unknown" #~ msgstr "Nepoznato" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trajanje" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Obriši Windows kompletno" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Prikaži &detalje" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Ruski" #, fuzzy #~ msgid "Line width for annotations (0.0-100.0)" #~ msgstr "Naučite više iz dokumenatcije" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Smanji Windowse" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Smanji Windowse" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimalni &GUID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Radne površine" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalno vrijeme" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Preskačem %1" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Postavi filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezolucija" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows slobodno (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows slobodno (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Brzina:" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&Testiraj" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Command line %d" #~ msgstr "Naredba: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Naredba: " #, fuzzy #~ msgid "Corners" #~ msgstr "Pisači" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Floppy disk" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Pokrećem servis." #, fuzzy #~ msgid "Terminate" #~ msgstr "Pisač" ./po/sk.po0000644000004100000410000025565413246301623012657 0ustar www-datawww-data# Slovak translation of compiz # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the compiz package. # Ivan Masár , 2008. # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-05-17 10:28+0200\n" "Last-Translator: Brusnica P \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Pracovná plocha" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Správa okien" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Žiadna" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Tieň" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximalizovať" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximalizovať okno vodorovne" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximalizovať okno zvisle" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimalizované" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automaticky do popredia" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Nízke" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu Okna" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Akcia, ktorá sa vykoná pri otáčaní kolieskom myši nad titulkom okna." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Typ rozostrenia" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Priehľadnosť aktívneho okna témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Tieň aktívneho okna témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Priehľadnosť témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Tieň témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Priehľadnosť pre aktívne okná s dekoráciami témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Priehľadnosť s dekoráciami témy metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Vytieňovať aktívne okná s dekoráciou témy metacity z nepriehľadnej do " "priehľadnej." #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Vytieňovať okná s dekoráciou témy metacity z nepriehľadnej do priehľadnej." #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Akcia pri rolovaní nad titulkom okna" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ rozostrenia použitej na dekoráciu okna" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Použiť tému metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Použiť tému metacity pri vykresľovaní dekorácií okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zatvoriť okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Zrušiť maximalizáciu okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximalizovať okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimalizovať Okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Vykonať vyššie uvedené" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Prilepiť" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Netieňovať" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Odvolať vyššie uvedené" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Odlepiť" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Okno „%s“ neodpovedá." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "Vynútené ukončenie tejto aplikácie spôsobí stratu neuložených zmien." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Vynútiť ukončenie" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Poznámka" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Farba výplne poznámky" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Štýl ťahu poznám" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Zásuvný modul poznámok" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Vyčistiť" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Kresliť" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Vykresliť použitím nástroja" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Farba výplne poznámok" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Začať" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Začať kreslenie poznámky" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Začať mazanie poznámky" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Začať mazanie" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Šírka čiary" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Šírka riadka pre komentáre" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Štýl ťahu poznámok" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Šírka ťahu" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Šírka ťahu poznámok" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "Filter:" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Rozmaznie alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alfa rozostrenie okien" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filter rozostrenia" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oklúzia rozostrenia" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Sýtosť rozostrenia" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Rýchlosť rozostrenia" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Rozostrovať okná" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Rozmazanie za priehľadnými časťami okien" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Sýtosť rozostrenia" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Rozostrovať okná" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Rozostrovať okná, ktoré nie sú aktívne" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Zakázať rozmazanie častí obrazovky, ktoré sú zakryté inými oknami." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Metóda filtra použitá pre rozmazanie" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Rozmazať aktívne" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Rozmazať aktívne okná" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussovské rozostrenie" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Polomer gaussovského rozostrenia" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Sila gaussovského rozostrenia" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Polomer gaussovského rozostrenia" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Sila gausovského rozostrenia" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Nezávislé stiahnutia textúr" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmapy" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Úroveň detailu mipmáp" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Úroveň podrobností mipmáp" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulz" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efekt pulzu" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Použiť dostupné jednotky textúr na vykonanie čo najväčšieho počtu " "nezávislých stiahnutí textúr" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Rýchlosť rozmazania okna" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Okná, ktoré majú byť ovplyvnené rozmazaním" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Okná, ktoré by mali štandardne použiť alfa rozmazanie" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klonovať výstup" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Začať klonovať výber" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Obsluha klonovania výstupu" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové skratky, ktoré spustia príkaz identifikovaný ako command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Príkazový riadok 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Príkazový riadok 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Príkazový riadok 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Príkazový riadok 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Príkazový riadok 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Príkazový riadok 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Príkazový riadok 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Príkazový riadok 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Príkazový riadok 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Príkazový riadok 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Príkazový riadok 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Príkazový riadok 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Príkaz, ktorý sa vykoná, ak sa v shelli volá run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Príkaz" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Spustiť príkaz 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Spustiť príkaz 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Spustiť príkaz 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Spustiť príkaz 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Spustiť príkaz 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Spustiť príkaz 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Spustiť príkaz 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Spustiť príkaz 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Spustiť príkaz 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Spustiť príkaz 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Spustiť príkaz 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Spustiť príkaz 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktívne zásuvné moduly" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Povoliť vykresľovanie celoobrazovkových okien bez presmerovania do " "mimoobrazovkových pixmapov" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Akustický zvonček" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Akustické systémové pípnutie" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automaticky do popredia" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Oneskorenie automatického presunu do popredia" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatická detekcia výstupných zariadení" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatická detekcia obnovovacej frekvencie" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Najlepšie" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Zamerať kliknutím" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Kliknutím na okno presunúť zameranie na okno" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zatvoriť aktívne okno" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Východzia ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Východzí obrázok ikony okna" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Kocka plochy" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detekovať výstupy" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Deteguj Obnovovaciu Frekvenciu" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Interval, počas ktorého musí ukazovateľ zostať na okraji obrazovky, než sa " "vykoná operácia." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Oneskorenie operácie na okraji" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rýchlo" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Predchádzať ukradnutiu aktivity" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Predchádzať zameraniu okien" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Predchádzať zameraniu okien" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Vynútenie vykreslenia nezávislého výstupu" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Všeobecné nastavenia" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Všeobecné nastavenia Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "V poriadku" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skryť okná neprítomné v lište úloh" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skryť všetky okná a zobraziť pracovnú plochu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Skryť okná neprítomné v lište úloh pri vstupe do režimu zobrazenia pracovnej " "plochy" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Vysoké" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vodorovná virtuálna veľkosť" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Ak sa dá, použiť kompresiu textúr, ktoré boli konvertované z obrázkov." #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Pri maximalizovaní ignorovať tipy" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Pri maximalizovaní okna ignorovať veľkosť nárastu a vzhľad tipov" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Interval pred presunutím vybraných okien do popredia" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval medzi odosielaním pingu" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Úroveň prevencie pred ukradnutím aktivity okna" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Osvetlenie" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Zoznam práve aktívnych modulov" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Zoznam reťazcov popisujúcich výstupné zariadenia" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Nízke" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Presunúť okno do pozadia" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Presunúť okno do pozadia" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximalizovať okno vodorovne" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximalizovať okno zvisle" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximalizovať aktívne okno" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximalizovať aktívne okno vodorovne" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximalizovať aktívne okno zvisle" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimalizovať aktívne okno" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normálny" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Počet Pracovných plôch" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Počet virtuálnych pracovných plôch" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Vypnuté" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Vykonávať aktualizácie obrazovky počas intervalu vertikálneho zatemnenia" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Výstupy" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Obsluha prekrývajúceho sa výstupu" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Vykresli každý výstup zariadenia nezávisle aj keď sa výstupy zariadení " "prekrývajú" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Oneskorenie pingu" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Uprednostniť väčší výstup" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Uprednostniť menší výstup" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Kliknutím dať do popredia" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Presunúť okno do popredia" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Prepnúť vybrané okná do popredia po uplynutí intervalu" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Presunúť okno dopredu nad ostatné okná" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Presunúť okno do popredia po kliknutí" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Obnovovacia frekvencia" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Násobiteľ vodorovnej virtuálnej veľkosti obrazovky" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Násobiteľ zvislej virtuálnej veľkosti obrazovky" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Zobraziť Plochu" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Pomalé animácie" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Inteligentný režim" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synchronizovať pri VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Kompersia textúr" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filter textúr" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrovanie textúr" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Frekvencia prekresľovania obrazovky v Hz" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Prepnúť maximalizáciu okna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Prepnúť vodorovnú maximalizáciu okna" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Prepnúť zvislú maximalizáciu okna" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Prepnúť tieňovanie okna" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Prepnúť maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Prepnúť horizontálnu maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Prepnúť vertikálnu maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Prepnúť tieňovanie aktívneho okna" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Prepnúť použitie pomalých animácií" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Zrušiť maximalizáciu aktívneho okna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Nepresmerovať okná v celoobrazovkovom režime" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Použiť rozptýlené svetlo pri transformácii obrazovky" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikálna Virtuálna Veľkosť" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Veľmi vysoké" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Ktoré z prekrývajúcich sa výstupných zariadení sa má uprednostniť" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Klávesová skratka tlačidla hlavnej ponuky okna" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Klávesová skratka hlavnej ponuky okna" # workflow: "3D Beschleunigung aktivieren" # -ke- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akcelerácia" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Prispôsobiť obrázok" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Prispôsobiť vrchný obrázok otáčaniu" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Prejsť na nasledujúcu snímku" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animovať Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animovať skydome pri rotácii kocky" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatický" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farba vrchnej a spodnej strany kocky" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Farba, ktorá sa použije na dolnú časť gradientu skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Farba, ktorá sa použije na hornú časť gradientu skydome" # KM #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Farba kocky" # KM #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Farba kocky" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Kocka plochy" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Zrýchlenie zloženia" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Rýchlosť zloženia" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Časový skok zloženia" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Ak je to možné, vytvárať pre vysoko kvalitné modelovanie mipmapy" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Choď späť na predchádzajúci snímok" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Obrázkové súbory" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Obrázok, ktorý sa použije ako textúra pre skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Aktivuje priehľadnosť kocky iba v prípade, ak je rotácia vykonaná pomocou " "myši." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Vnútri kocky" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Vnútri kocky" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Zoznam PNG a SVG súborov, ktoré môžu byť vykreslené na vrchu kocky" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Viacnásobný výstupný režim" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Viacnásobné kocky" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Ďalšia snímka" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Jedna veľká kocka" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Nepriehľadnosť počas otáčania" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Nepriehľadnosť v prípade neotáčania" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Nepriehľadnosť plochy okna počas otáčania." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Nepriehľadnosť plochy okna počas neotáčania." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Umiestniť okná na kocke" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Predchádzajúca snímka" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Vykresliť Skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Zmeniť veľkosť obrázka" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Zmeniť mierku obrázka aby pokrýval vrch kocky" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Zvoliť zobrazenie kocky v prípade, že budú použité viacnásobné výstupné " "zariadenia." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Konečná farba gradientu Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Počiatočná farba gradientu Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Obrázok Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Rýchlosť" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Krok" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Priehľadnosť iba v prípade otáčania použitím myši" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Roztvoriť" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Roztvoriť kocku" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend pre riadenie Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Umožniť tvorbu mipmáp pre dekoračné textúry" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Príkaz" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorované okná" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Príkazový riadok programu pre dekorácie, ktorý sa vykoná, pokiaľ nebude " "spustený žiadny program pre dekorácie" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Posun X vrhaného tieňa" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Posun Y vrhaného tieňa" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Farba vrhaného tieňa" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Nepriehľadnosť vrhaného tieňa" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Polomer vrhaného tieňa" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Farba tieňa" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Posun tieňa X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Posun tieňa Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Krytie tieňa" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Polomer tieňa" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Tieňované okná" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Dekorácie okna" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Dekorácie okna" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Okná, ktoré by mali byť dekorované" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Okná, ktoré by mali mať tieň" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rýchlosť otáčania" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Obmedzenie Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normálna veľkosť okien" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Doba stmavnutia" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Stmievať pri minimalizovaní/otvorení/zatvorení" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Rýchlosť stmievania" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Doba stmavnutia" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efekt stmievania pri minimalizovaní/otvorení/zatvorení okna" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efekt stmievania pri systémovom pípnutí" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Rozsvecovanie okien pri mapovaní a stmievania pri odmapovaní" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Stmievanie okien" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Stmievanie okien" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Celoobrazovkový vizuálny zvonček" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Celoobrazovkový efekt blednutia pri systémovom pípnutí" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Vizuálny zvonček" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Rýchlosť stmievania okna" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Okná, ktoré majú meniť veľkosť v režime zmeny mierky" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Okná, ktoré by mali blednúť" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Bod pripojenia" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Bod pripojenia" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Používateľský súborový systém" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Používateľský súborový systém" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend pre riadenie GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Podpora hlavného napojenia na GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Otvoriť terminál" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Spustiť Dialóg" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Príkaz pre terminál" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Príkaz pre snímanie obrazovky" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Zobraziť Hlavnú ponuku" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Zobraziť dialóg spustenia aplikácie" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Zobraziť hlavné menu" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Zosnímať obrazovku" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Zosnímať okno" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Príkaz pre terminál" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Príkazový na zosnímania okna" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Pozadie ini súboru" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Modul upozornenia zmeny súboru" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend pre riadenie Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efekt pri minimalizovaní" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimalizovať okná" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimalizovať rýchlosť" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimalizovať časový krok" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Stálosť tieňa" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Stálosť tieňa" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformovať okná pri ich minimalizovaní a spätnom obnovení" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Okná, ktoré by mali byť transformované pri minimalizovaní" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Obmedzenie Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Obmedziť súradnicu Y na priestor pracovnej plochy" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "Aktualizovať pozíciu okna až po dokončení presunu" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Zahájiť presun okna" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Lenivé presúvanie" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Presunúť okno" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Presunúť okno" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Nepriehľadnosť" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Úroveň nepriehľadnosti presúvaných okien" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Odtrhávať a automaticky obnoviť maximalizované okná počas ťahania" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Odtrhávať maximalizované okná" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Začať pohyb okna" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Jas" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Jas" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Jas" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Jas" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Znížiť nepriehľadnosť" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Zvýšiť nepriehľadnosť" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Krok zmeny nepriehľadnosti" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Krok zmeny nepriehľadnosti" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Krok nepriehľadnosti" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Úroveň nepriehľadnosti presúvaných okien" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Nepriehľadnosť počas otáčania" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Sýtosť" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sýtosť" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sýtosť" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sýtosť" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Dekorácie okna" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Hodnoty nepriehľadnosti okna" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Mapované okná" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Okná, ktoré by mali byť štandardne umiestnené" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Okná, ktoré by mali byť implicitne priehľadné" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Okná, ktoré by mali byť štandardne umiestnené" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmus použitý pre rozmiestnenie okna" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskáda" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Vystrednené" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Správa okien" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Vynútené umiestnenie okien" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Vodorovné pozície pohľadov" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Rozmiestniť okná" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Uprednostniť menší výstup" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Umiestniť mapované okná na zodpovedajúce pozície" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Spôsob rozmiestnenia" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Umiestnené okná" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Náhodné" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Označuje ako by sa malo správať umiestňovanie okien ak je označených viacero " "výstupov" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligentné" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Použiť aktívne výstupné zariadenie" #: ../metadata/place.xml.in.h:20 #, fuzzy msgid "Use output device of focussed window" msgstr "Použiť výstupné zariadenie s ukazovateľom" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Použiť výstupné zariadenie s ukazovateľom" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Zvislé pozície pohľadov" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Okná umiestnené v pohľadoch" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Núdzové riešenia umiestnenia okna" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Okná, ktoré by mali byť štandardne umiestnené" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Okná, ktoré by mali byť štandardne umiestnené na konkrétnu plochu" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Okná ktoré by mali byť nútene umiestnené aj keď by sa okenný manažér mal " "vyhnúť takémuto umiestneniu." #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Dekorácie okna" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Núdzové riešenia" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Pozície X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Pozície plochy na osi X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Hodnoty pozíce na osi X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Pozície Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Pozície plochy na osi Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Hodnoty pozíce na osi Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr " Načítanie PNG obrázkov" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Vyhodnocovanie regulárnych výrazov" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Zodpovedajúce regulárne výrazy okna" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Farba ohraničenia" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Farba okraja, ktorý sa použije pri režimoch obrysov a zmeny veľkosti " "obdĺžnikom" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Štandardný režim zmeny veľkosti" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Štandardný režim použitý pre zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Farba výplne" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Farba výplne použitá pre pravouhlú zmenu veľkosti" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Začať normálnu zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Začať obrysovú zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Začať zmenu veľkosti pravouhlého okna" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Začať zmenu veľkosti okna roztiahnutím" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Začať zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normálna veľkosť okien" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Obrys" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Obrysová zmena veľkosti okien" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Obdĺžnik" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Pravouhlá zmena veľkosti okien" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Zmeniť veľkosť okna" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Zmeniť veľkosť okna" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Začať zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Začať zmenu veľkosti okna roztiahnutím" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Začať normálnu zmenu veľkosti okna" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Začať zmenu veľkosti okna s obrysom" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Začať zmenu veľkosti okna obdĺžnikom" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Roztiahnutie" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Zmena veľkosti okien roztiahnutím" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Okná, pre ktoré bude použitá normálna zmena veľkosti" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Okná, pre ktoré bude použitá zmena veľkosti s efektom obrysu" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Okná, pre ktoré bude použitá zmena veľkosti s efektom obdĺžnika" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Okná, pre ktoré bude použitá zmena veľkosti s efektom roztiahnutia" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD pri prepínaní na hrane" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Pohyb pri prepínaní na hrane" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ukazovateľ pri prepínaní na hrane" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Doba preklopenia" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Prepnúť na pohľad vľavo a preniesť ukazovateľ" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Prepnúť na ďalší pohľad pri ťahaní okna na okraj obrazovky" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Prepnúť na ďalší pohľad pri presunutí ukazovateľa na okraj obrazovky" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Prepnúť na ďalší pohľad pri presunutí okna na okraj obrazovky" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Prepnúť na pohľad vpravo a preniesť ukazovateľ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Prevrátiť os Y pre pohyb ukazateľa" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertovať os Y ukazovateľa" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Citlivosť ukazateľa" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Aktivácia pri otáčaní" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Pri otáčaní prenášať okná do popredia" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Otáčať kockou" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Otočiť preklopením vľavo" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Otočiť preklopením vpravo" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Otočiť vľavo" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Otočiť vľavo s oknom" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Otočiť vpravo" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Otočiť vpravo s oknom" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Otočiť na" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Otočiť na stranu 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Otočiť na stranu 1 s oknom" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Otočiť na stranu 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Otočiť na stranu 10 s oknom" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Otočiť na stranu 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Otočiť na stranu 11 s oknom" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Otočiť na stranu 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Otočiť na stranu 12 s oknom" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Otočiť na stranu 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Otočiť na stranu 2 s oknom" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Otočiť na stranu 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Otočiť na stranu 3 s oknom" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Otočiť na stranu 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Otočiť na stranu 4 s oknom" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Otočiť na stranu 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Otočiť na stranu 5 s oknom" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Otočiť na stranu 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Otočiť na stranu 6 s oknom" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Otočiť na stranu 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Otočiť na stranu 7 s oknom" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Otočiť na stranu 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Otočiť na stranu 8 s oknom" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Otočiť na stranu 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Otočiť na stranu 9 s oknom" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Otáčať kockou" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Otočiť kocku pracovnej plochy" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Otočiť vľavo" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Otočiť vľavo a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Otočiť vpravo" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Otočiť vpravo a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Otočiť na stranu 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Otočiť na stranu 1 s oknom" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Otočiť na stranu 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Otočiť na stranu 1 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Otočiť na stranu 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Otočiť na stranu 10 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Otočiť na stranu 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Otočiť na stranu 11 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Otočiť na stranu 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Otočiť na stranu 12 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Otočiť na stranu 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Otočiť na stranu 2 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Otočiť na stranu 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Otočiť na stranu 3 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Otočiť na stranu 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Otočiť na stranu 4 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Otočiť na stranu 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Otočiť na stranu 5 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Otočiť na stranu 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Otočiť na stranu 6 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Otočiť na stranu 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Otočiť na stranu 7 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Otočiť na stranu 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Otočiť na stranu 8 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Otočiť na stranu 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Otočiť na stranu 9 a vziať aktívne okno so sebou" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Otočiť na zorné pole" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Otočiť okno" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Otočiť s oknom" # workflow: "3D Beschleunigung aktivieren" # -ke- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Akcelerácia pri otáčaní" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rýchlosť otáčania" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Časový krok otáčania" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rýchlosť otáčania" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Citlivosť pohybu ukazateľa" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Prichytiť otáčajúcu sa kocku za dolnú stranu" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Prichytiť otáčajúcu sa kocku za hornú stranu" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Prichytiť k dolnej strane" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Prichytiť k hornej strane" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Začať otáčanie" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Časový limit pred preklopením zorného poľa" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Priblíženie" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Miera nepriehľadnosti v percentách" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Veľký" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Zobraziť pracovnú plochu kliknutím na plochu" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Stmaviť pozadie" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Stmaviť pozadie pri vykreslovaní okien" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblém" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Vstúpiť do režimu Zobraziť plochu, keď sa na plochu klikne počas zmeny mierky" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Čas vznášania" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Začať výber okna" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Začať výber okna pre všetky okná" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Začať výber okna pre skupinu okien" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Spustiť vyberanie okien na štandardnom výstupe" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Rozložiť a začať transformáciu všetkých okien" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Rozložiť a začať transformáciu skupiny okien" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Rozmiestnenie a začiatok transformácie okien" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Rozmiestnenie a začiatok transformácie okien na aktuálnom výstupe" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Na všetkých výstupných zariadeniach" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Na aktuálnom výstupnom zariadení" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Prekladať ikonou" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Pri zmene veľkosti okien prekladať okná ikonou" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Zmena mierky" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Zmena mierky okna" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Rýchlosť zmeny mierky" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Časový krok zmeny mierky" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Meniť mierku okien" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Či sa mení veľkosť okien pri použití viacerých výstupných zariadení." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Medzera medzi oknami" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Vzdialenosť" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "Čas (v ms) pred ukončením režimu zmeny mierky pri kurzore nad oknom" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Okná, ktoré majú meniť veľkosť v režime zmeny mierky" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automaticky otvoriť snímku v tejto aplikácii" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Priečinok" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Zosnímať obrazovku" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Spustiť aplikáciu" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Vložiť snímky obrazovky do tohto priečinka" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Snímka obrazovky" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Modul snímky obrazovky" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Načítanie SVG obrázkov" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Hodnota jasu v percentách" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Hodnota sýtosti v percentách" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Prepínač aplikácií" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automatické otáčanie" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Preniesť do popredia" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Preniesť vybrané okno do popredia" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "Vzdialenosť, na ktorú by sa mala plocha oddialiť počas prepínania okien" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimalizované" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Nasledujúca výplň" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Nasledujúce okno" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Nasledujúce okno (všetky okná)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Nasledujúce okno (žiadne vyskakovacie okno)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Zobraziť prepínač ak nie je viditeľný a vybrať ďalšie okno" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Zobraziť prepínač ak nie je viditeľný a vybrať ďalšie okno spomedzi všetkých " "okien" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Zobraziť prepínač ak nie je viditeľný a vybrať predchádzajúce okno" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Zobraziť prepínač ak nie je viditeľný a vybrať predchádzajúce okno zo " "všetkých okien" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Predchádzajúca výplň" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Predchádzajúce okno" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Predchádzajúce okno (všetky okná)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Predchádzajúce okno (žiadne vyskakovacie okno)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Otočiť na vybrané okno pri prepínaní" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Označ nasledujúci typ výplne okna" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Vybrať ďalšie okno bez ukázania vyskakovacieho okna" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Vybrať predchádzajúci typ výplne okna" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Vybrať predchádzajúce okno bez ukázania vyskakovacieho okna" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Ukázať ikonu vedľa náhľadu" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Zobraziť minimalizované okná" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Rýchlosť prepínača" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Časový krok prepínača" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Okná prepínača" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Okná, ktoré budú zobrazené v prepínači" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Poskytnúť podporu farebného priestoru YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Prehrávanie videa" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Prehrávanie videa" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Farebný priestor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Pridať čiaru" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Pridať bod" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Do rôznych akcií plochy pridávať efekt vody" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Oneskorenie (v ms) medzi jednotlivými kvapkami" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Povoliť vodné efekty ukazateľa" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Čiara" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Mierka posunutia" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Bod" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Oneskorenie dažďa" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Vlna v nadpise" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Prepnúť dážď" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Prepnúť efekt dažďa" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Prepnúť stierač" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Prepnúť efekt stierača" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efekt vody" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Mierka posunutia vody" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efekt vlny v nadpise okna" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efekt zamerania" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efekt pri zameraní okna" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Zamerať okná" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Trenie" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Uchopiť okná" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rozlíšenie mriežky" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Obrátené prichytávanie okien" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Rozochvieť okno" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efekt mapovania" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efekt mapovania okna" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Mapované okná" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efekt maximalizácie" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimálna veľkosť mriežky" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimálna veľkosť vrcholu mriežky" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Presunúť okná" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Chvenie" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Obrátené prichytávanie" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Prichytiť okná" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Trenie pružiny" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Pružina K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Konštanta pružiny" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Prepnúť prichytávanie okien" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Použiť na efekt chvenia pružinový model" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Rozlíšenie vrcholu mriežky" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Okná, ktoré by sa mali chvieť, keď sú aktivované" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Okná, ktoré by sa mali chvieť, keď sú zachytené" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Okná, ktoré by sa mali chvieť, keď sú mapované" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Okná, ktoré sa budú triasť pri presune" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efekt trasúcich sa okien pri maximalizácii a späť" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Trasúce sa okná" #~ msgid "Command line 0" #~ msgstr "Príkazový riadok 0" #~ msgid "Run command 0" #~ msgstr "Spustiť príkaz 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Príkaz pre snímanie obrazovky" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Príkaz pre snímanie obrazovky" #~ msgid "Filter Linear" #~ msgstr "Lineárny filter" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Pri priblížení použiť lineárny filter" #~ msgid "Zoom Desktop" #~ msgstr "Priblížiť plochu" #~ msgid "Zoom In" #~ msgstr "Priblížiť" #~ msgid "Zoom Out" #~ msgstr "Oddialiť" #~ msgid "Zoom Pan" #~ msgstr "Posúvanie priblíženia" #~ msgid "Zoom Speed" #~ msgstr "Rýchlosť priblíženia" #~ msgid "Zoom Timestep" #~ msgstr "Časový krok priblíženia" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Priblížiť a posúvať kocku plochy" #~ msgid "Zoom factor" #~ msgstr "Pomer zväčšenia" #~ msgid "Zoom pan" #~ msgstr "Posúvanie priblíženia" #~ msgid "Decrease window opacity" #~ msgstr "Znížiť nepriehľadnosť okna" #~ msgid "Increase window opacity" #~ msgstr "Zvýšiť nepriehľadnosť okna" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Hodnoty nepriehľadnosti pre okná, ktoré by mali byť implicitne priehľadné" #~ msgid "Opacity windows" #~ msgstr "Priehľadné okná" #~ msgid "Background Images" #~ msgstr "Obrázky pozadia" #~ msgid "Background images" #~ msgstr "Obrázky pozadia" #~ msgid "Place windows on a plane" #~ msgstr "Umiestniť okná na rovinu" #~ msgid "Plane Down" #~ msgstr "Rovina dole" #~ msgid "Plane Left" #~ msgstr "Rovina vľavo" #~ msgid "Plane Right" #~ msgstr "Rovina vpravo" #~ msgid "Plane To Face 1" #~ msgstr "Rovina na stranu 1" #~ msgid "Plane To Face 10" #~ msgstr "Rovina na stranu 10" #~ msgid "Plane To Face 11" #~ msgstr "Rovina na stranu 11" #~ msgid "Plane To Face 12" #~ msgstr "Rovina na stranu 12" #~ msgid "Plane To Face 2" #~ msgstr "Rovina na stranu 2" #~ msgid "Plane To Face 3" #~ msgstr "Rovina na stranu 3" #~ msgid "Plane To Face 4" #~ msgstr "Rovina na stranu 4" #~ msgid "Plane To Face 5" #~ msgstr "Rovina na stranu 5" #~ msgid "Plane To Face 6" #~ msgstr "Rovina na stranu 6" #~ msgid "Plane To Face 7" #~ msgstr "Rovina na stranu 7" #~ msgid "Plane To Face 8" #~ msgstr "Rovina na stranu 8" #~ msgid "Plane To Face 9" #~ msgstr "Rovina na stranu 9" #~ msgid "Plane Up" #~ msgstr "Rovina hore" #~ msgid "Plane down" #~ msgstr "Rovina dole" #~ msgid "Plane left" #~ msgstr "Rovina vľavo" #~ msgid "Plane right" #~ msgstr "Rovina vpravo" #~ msgid "Plane to face 1" #~ msgstr "Rovina na stranu 1" #~ msgid "Plane to face 10" #~ msgstr "Rovina na stranu 10" #~ msgid "Plane to face 11" #~ msgstr "Rovina na stranu 11" #~ msgid "Plane to face 12" #~ msgstr "Rovina na stranu 12" #~ msgid "Plane to face 2" #~ msgstr "Rovina na stranu 2" #~ msgid "Plane to face 3" #~ msgstr "Rovina na stranu 3" #~ msgid "Plane to face 4" #~ msgstr "Rovina na stranu 4" #~ msgid "Plane to face 5" #~ msgstr "Rovina na stranu 5" #~ msgid "Plane to face 6" #~ msgstr "Rovina na stranu 6" #~ msgid "Plane to face 7" #~ msgstr "Rovina na stranu 7" #~ msgid "Plane to face 8" #~ msgstr "Rovina na stranu 8" #~ msgid "Plane to face 9" #~ msgstr "Rovina na stranu 9" #~ msgid "Plane up" #~ msgstr "Rovina hore" #~ msgid "Cursor size" #~ msgstr "Veľkosť kurzora" #~ msgid "Cursor theme" #~ msgstr "Téma kurzora" #~ msgid "Cursor theme name" #~ msgstr "Názov témy kurzora" #~ msgid "Size of the cursor" #~ msgstr "Veľkosť kurzora" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Čas pozvolného miznutia nepriehľadnosťi okna." ./po/sr.po0000644000004100000410000024413513246301623012656 0ustar www-datawww-data# Serbian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2004 SuSE Linux AG. # Rade Radenkovic , 2004 # Bojan Jovanovic , 2004 # msgid "" msgstr "" "Project-Id-Version: YaST2 (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2008-04-25 17:17+0200\n" "Last-Translator: Dragonny \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Setovanja Desktop-a" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Window Manager" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nema" # label of an output field #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Senka" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Smanji Windowse" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Smanji Windowse" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Smanji Windowse" # button text # button text #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Smanji Windowse" # ComboBox item # Combobox item #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automatski" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Meni prozora" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Vrsta zamućivanja" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "&Obriši Windows kompletno" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "&Obriši Windows kompletno" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "Zatvori prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" # button text # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "Smanji prozor" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Napravi iznad" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Ne senči" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Rastavi iznad" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Prozor \"%s\" ne reaguje." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forsiranjem aplikacije da se zatvori moze izazvati gubitak nesnimljenih " "promena." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forsiraj Zatvaranje" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "хетски" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Dumb Clock" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # Label text #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktivan profil" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "Očisti" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Nacrtaj" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Alat za crtanje" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "хетски" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "хетски" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "хетски" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Započni brisanje" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Širina linije" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filter: " # button text #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Alfa zamućivanje" # button text #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Alfa zamućivanje prozora" # MenuButton label # menubutton label #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filter Zamućivanja" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Trajanje zamućivanja" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Trajanje" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Brzina Zamućivanja" # button text #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Zamuti Prozore" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Zamuti iza providnih delova prozora" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Trajanje" # button text #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Zamuti prozore" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Zamuti prozore koji nemaju fokus" #: ../metadata/blur.xml.in.h:13 #, fuzzy msgid "Disable blurring of screen regions obscured by other windows." msgstr "Isključi zamućenje u delovima ekrana zamračenim od strane prozora. " #: ../metadata/blur.xml.in.h:14 #, fuzzy msgid "Filter method used for blurring" msgstr "Korišćena filter metoda za zamućivanje" # button text #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokusiraj zamućenje" # button text #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Fokusiraj zamućenje prozora" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Rusija" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Руска Федерација" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Rusija" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Руска Федерација" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Rusija" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "микмак" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "микмак" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efekat pulsa" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows slobodno (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "хетски" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Komanda '%1'" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Komanda '%1'" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Komanda '%1'" # Process "help" # translators: %1 is the command name #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Komanda '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Komanda :" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Komanda :" # Label text #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktivan profil" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Sistemi datoteka" # ComboBox item # Combobox item #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "Automatski" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" # table item / label #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Podrazumevana sekcija" # progress stage title #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Pokretanje podrazumevanog menadžera prozora" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Setovanja Desktop-a" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" # headline for dialog "Select for update" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Izaberi za ažuriranje" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Startujem servis" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Startujem servis" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" # Aliases dialog caption #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Virtuelni alias-i" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Zapisivanje događaja" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "Listaj samo detektovane štampače" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" # button text # button text #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Smanji Windowse" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Čekanje" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radio Clock" # button text #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "&Obriši Windowse" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "&Osveži Listu" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Setovanja Desktop-a" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Prikaži sve Particije" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Podesite filter" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Podesite filter" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Podesite filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" # Aliases dialog caption #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtuelni alias-i" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D akceleratori" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # ComboBox item # Combobox item #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatski" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Dumb Clock" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Dumb Clock" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Setovanja Desktop-a" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D akceleratori" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Источни Тимор" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Instaliacija slike diska" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" # button text #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "&Obriši Windowse" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" # button text #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&Obriši Windowse" # button text # button text #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "&Smanji Windowse" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "lokalno vreme" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Sidnej" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Источни Тимор" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Komanda :" # button text #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&Obriši Windowse" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&Loše stanje" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&Loše stanje" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&Loše stanje" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" # button text # button text #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&Loše stanje" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&Loše stanje" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&Loše stanje" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" # button text # button text #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Smanji Windowse" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Bez opisa" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind opcije" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Источни Тимор" # header text #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr " Kontejner" # button text #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "&Obriši Windowse" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "U realnom vremenu" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Suspend" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "U realnom vremenu" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Sistemi datoteka" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" # button text #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Obriši Windowse" # button text # button text #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Smanji Windowse" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows slobodno (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Додај догађај" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Додај догађај" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Greška, niste uneli ispravno komandu." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Greška, niste uneli ispravno komandu." #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Greška, niste uneli ispravno komandu." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" # button text # button text #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Smanji Windowse" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" # header text #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr " Kontejner" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "XF86RotateWindows" # button text # button text #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "&Smanji Windowse" # button text #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "&Obriši Windowse" # button text #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "&Obriši Windowse" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Loše stanje" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Startujem servis" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" # button text # button text #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Smanji Windowse" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Startujem servis" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Most" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Most" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Most" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Most" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" # ??? #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "окситан (после 1500.)" # ??? #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "окситан (после 1500.)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Loše stanje" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Startujem servis" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Trajanje" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind opcije" # Label for used part of the Windows partition in non-graphical mode # Label for used part of the Windows partition in non-graphical mode #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows iskorišteno:" # button text # button text #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "&Smanji Windowse" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Window Manager" # button text #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Obriši Windowse" # Aliases dialog caption #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtuelni alias-i" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" # button text #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Obriši Windowse" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" # button text # button text #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" # Aliases dialog caption #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtuelni alias-i" # button text # button text #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "&Smanji Windowse" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind opcije" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Radna grupa" # button text # button text #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "&Smanji Windowse" # Aliases dialog caption #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtuelni alias-i" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" # button text # button text #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "&Smanji Windowse" # Aliases dialog caption #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtuelni alias-i" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Dumb Clock" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Dumb Clock" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "хетски" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "хетски" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "хетски" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "хетски" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "хетски" # button text #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Dumb Clock" # button text #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" # button text #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "&Obriši Windowse" # button text #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "&Obriši Windowse" # button text #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Startujem servis" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" # button text #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "&Obriši Windowse" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "U realnom vremenu" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" # table entry, %1 is host name #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Pokazivač na %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Štampač" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Startujem servis" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Setovanja Desktop-a" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Setovanja Desktop-a" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Startujem servis" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Startujem servis" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D akceleratori" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Источни Тимор" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Источни Тимор" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Источни Тимор" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Startuj detekciju..." #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "Odjavi se" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Pozadine" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "XF86RotateWindows" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" # label of an output field #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Skener" # button text #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Obriši Windowse" # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "lokalno vreme" # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "lokalno vreme" # button text #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Obriši Windowse" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" # button text #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Obriši Windowse" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Španija" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Директоријум\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "хетски" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Покрени програм" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Greška, niste uneli ispravno komandu." #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Greška, niste uneli ispravno komandu." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Redosled" # ComboBox item # Combobox item #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatski" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Akcija" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Ikone" # button text # button text #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Smanji Windowse" # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Setovanja Desktop-a" # button text #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&Obriši Windowse" # button text #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&Obriši Windowse" # button text #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" # button text # button text #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "&Smanji Windowse" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" # button text #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Startujem servis" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" # button text # button text #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Smanji Windowse" # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "lokalno vreme" # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "lokalno vreme" # button text #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Obriši Windowse" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Додај догађај" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Додај догађај" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Čekanje" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" # translators: toggle button label #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "&Promena statusa" # translators: toggle button label #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "&Promena statusa" # translators: toggle button label #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "&Promena statusa" # translators: toggle button label #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "&Promena statusa" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" # button text #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "&Obriši Windowse" # button text #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Akcija" # button text #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Rezolucija" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" # button text #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" # button text # button text #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "&Smanji Windowse" # button text # button text #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" # To translators: intfield label #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Minimalan &GUID" # To translators: intfield label #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Minimalan &GUID" # button text #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "&Obriši Windowse" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Драјвер" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" # button text # button text #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Smanji Windowse" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Akcija" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Preskakanje %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Preskakanje %1" # button text #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Obriši Windowse" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" # translators: frame title for method of incoming request resolution # translators: frame title for method of incoming request resolution #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Rezolucija servera" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" # button text #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Komanda :" # Process "help" # translators: %1 is the command name #, fuzzy #~ msgid "Run command 0" #~ msgstr "Komanda '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Greška, niste uneli ispravno komandu." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Greška, niste uneli ispravno komandu." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: " # Headline for X11 configuration screen: # The user selects screen resolution and color depth. #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Setovanja Desktop-a" #, fuzzy #~ msgid "Zoom In" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Источни Тимор" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Odjavi se" # Radio button for using an entire (Windows) partition for Linux #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "&Obriši Windows kompletno" # button text #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&Obriši Windowse" # button text #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Obriši Windowse" # button text #, fuzzy #~ msgid "Plane Down" #~ msgstr "&Obriši Windowse" # button text #, fuzzy #~ msgid "Plane Left" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane Right" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Startujem servis" # button text #, fuzzy #~ msgid "Plane Up" #~ msgstr "&Obriši Windowse" # button text #, fuzzy #~ msgid "Plane down" #~ msgstr "&Obriši Windowse" # button text #, fuzzy #~ msgid "Plane left" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Plane right" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Startujem servis" # button text #, fuzzy #~ msgid "Plane up" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Dialog" #~ msgstr "тагалог" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Notification" #~ msgstr "Akcija" #~ msgid "Unknown" #~ msgstr "Nepoznato" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Trajanje" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Loše stanje" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Startujem servis" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D akceleratori" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Suspend" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Источни Тимор" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Руска Федерација" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusija" # button text # button text #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Smanji Windowse" # button text # button text #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Smanji Windowse" # To translators: intfield label #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimalan &GUID" # ??? #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "окситан (после 1500.)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Startujem servis" # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- # ... # at the end of the suggestion text we will add the # 3D status. Therefore the D3Active variable is handled # if the status is false we had to check if the card # or the environment is capable of using 3D # --- #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D akceleratori" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Источни Тимор" # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "lokalno vreme" # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "lokalno vreme" # button text #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Obriši Windowse" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Akcija" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Preskakanje %1" # MenuButton label # menubutton label #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Podesite filter" # translators: frame title for method of incoming request resolution # translators: frame title for method of incoming request resolution #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rezolucija servera" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows slobodno (%1)" # label text, %1 is replaced by a unit value ("MB") # label text, %1 is replaced by a unit value ("MB") #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows slobodno (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Источни Тимор" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Odjavi se" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Komanda :" #, fuzzy #~ msgid "Run command %d" #~ msgstr "Komanda :" # Provider type dialog caption #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Tip provajdera" #, fuzzy #~ msgid "Corners" #~ msgstr "корнвалски" # Push button label #, fuzzy #~ msgid "Show switcher" #~ msgstr "Prikaži &promene" # default is "/dev/fd0" floppy device (used when floppy detection is skipped as a fallback) #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Disketni uređaj" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Startujem servis" #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminali" ./po/ru.po0000644000004100000410000033167613246301623012667 0ustar www-datawww-data# translation of compiz.po to Russian # Copyright (C) 2005, 2006 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # # Aleksey Osipov , 2005, 2006. # Aleksey Novodvorksy , 2000. # Eugene Osintsev , 1999, 2000. # Dimitriy Ryazantcev , 2008. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-10-03 16:47+0200\n" "Last-Translator: Shnatsel \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Рабочий стол" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Управление Окнами" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Никакой" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Свернуть в заголовок" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Развернуть" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Развернуть в ширину" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Развернуть в высоту" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Свернуть" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Развернуть" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Опустить" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Меню окна" # Действие при прокрутке колесика мыши на заголовке окна #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Действие при прокрутке колесика мыши на заголовке окна." # combo box item #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Тип размытия" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Прозрачность активного окна темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Затенение прозрачности активного окна темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Прозрачность темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Затенение прозрачности темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Прозрачность активных окон с оформлением темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Прозрачность оформления окон темы metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Затенять активные окна с оформлением темы для metacity от непрозрачного до " "полупрозрачного" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Затенять окна с оформлением темы для metacity от непрозрачного до " "полупрозрачного" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Действие, на колёсико мыши на заголовке окна" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Тип размытия, используемый для оформлений окна" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Использовать тему metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Использовать тему metacity при отрисовке декораций окон" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Закрыть окно" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Отменить полное развертывание окна" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Развернуть окно" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Свернуть окно" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Поверх всех" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Приклеить" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Развернуть из заголовка" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Не делать поверх всех" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Отклеить" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Окно \"%s\" не отвечает." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Ускоренное закрытие приложения приведет к потере не сохраненных изменений." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Ускоренный выход" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Заметка" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Цвет заполнения заметки" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Цвет черты заметки" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Модуль заметки" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Очистить" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Рисовать" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Рисовать, используя инструмент" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Цвет заливки для заметок" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Инициировать" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Инициировать рисование заметки" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Инициировать стирание заметки" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Инициировать стирание" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ширина линии" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ширина линии для заметок" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Цвет черты для заметок" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ширина черты" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ширина черты для заметок" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4-кратная билинейная фильтрация" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Размытие по альфа-каналу" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Размытие окон по альфа-каналу" # MenuButton label # menubutton label #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Фильтр размытия" # Table header 4/5 #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Преграждение размытия" # Table header 4/5 #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Насыщенность размытия" # combo box item #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Скорость размытия" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Размытие окон" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Размытие за прозрачными частями окон" # Table header 4/5 #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Насыщенность размытия" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Размытие окон" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Размытие окон, которые не активны" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Отключить размытие областей экрана, скрытых другими окнами." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Метод фильтра, используемый для размывания границ" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Размытие активного" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Размытие активных окон" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Гауссово размытие" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Радиус размытия" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Сила размытия" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Радиус размытия" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Сила размытия" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Независимое получение текстур" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Мипмэппинг" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Уровень детализации мипмэппинга" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Детализация мипмэппинга" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Пульс" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Эффект пульсации" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Использовать доступное количество элементов текстур для получения как можно " "большего количества независимых текстур." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Скорость размытия окна" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Окна, на которые действует размытие" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Окна, на которые действует размытие по умолчанию" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Дублирование вывода" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Инициировать выбор дублирования" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Обработчик дублированного вывода" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбинация клавиш, которая при вызове, выполнит команду оболочки, " "идентифицируемую как команда9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Закрепление за гранью экрана, которое при наведении, выполнит команду " "оболочки, идентифицируемую как команда9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Назначает закрепления на выполнение команд" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Комбинации клавиш" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Командная строка 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Командная строка 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Командная строка 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Командная строка 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Командная строка 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Командная строка 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Командная строка 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Командная строка 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Командная строка 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Командная строка 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Командная строка 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Командная строка 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Командная строка, которая будет выполнена в оболочке при вызове run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Команды" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Закрепления грани" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Комбинации клавиш" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Выполнить команду 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Выполнить команду 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Выполнить команду 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Выполнить команду 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Выполнить команду 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Выполнить команду 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Выполнить команду 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Выполнить команду 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Выполнить команду 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Выполнить команду 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Выполнить команду 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Выполнить команду 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Активные модули" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Позволяет рисовать окна в полноэкранном режиме без перенаправления в области " "растрового отображения за пределами экрана" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Слышимый сигнал" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Слышимый системный звуковой сигнал" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Автораскрытие" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Задержка автораскрытия" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Автоматическое определение устройств вывода" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Автоматическое определение частоты обновления" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Наилучшее" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Щелкните для выделения" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Щелкните окно, чтобы передать ему фокус ввода" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Закрытие активного окна" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Значок по умолчанию" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Значок окна по умолчанию" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Размер рабочего стола" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Определить устройства вывода" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Определить частоту обновления" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Настройки отображения" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Задержка указателя мыши на краю экрана перед тем, как будет совершено " "действие края экрана." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Задержка срабатывания на краю" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Быстрое" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Поведение при развёртивании" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Уровень упреждающей фокусировки" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Упреждающая фокусировка окон" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Упреждающая фокусировка окон" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Принудительная независимая отрисовка вывода." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Общие настройки" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Общие настройки Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Хорошее" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Скрыть все, кроме окон панели задач" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Скрыть все окна и передать фокус рабочему столу" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "При переходе в режим отображения рабочего стола окна, отсутствующие на " "панели задач, не отображаются" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Высокий" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Виртуальный размер по горизонтали" # думаю так должно быть верно. #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Использовать сжатие для текстур, конвертированных от изображений, если " "доступно" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Игнорировать подсказки в развернутом состоянии" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Игнорирование подсказок увеличения размеров и соотношения сторон для " "развернутого окна" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Интервал времени до автораскрытия выбранных окон" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Интервал между сообщениями отклика" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Сочетания клавиш" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Уровень предотвращения хищения фокуса" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Освещение" # command line help text for the 'list detected only' option #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Список активных в данный момент модулей" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Список строк, описывающих устройства вывода" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Низкий" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Переместить окно на задний план" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Расположение окна позади других окон" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Развернуть окно горизонтально" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Развернуть окно вертикально" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Развертывание активного окна" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Развертывание активного окна горизонтально" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Развертывание активного окна вертикально" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Свертывание активного окна" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Нормальное" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Число рабочих столов" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Число виртуальных рабочих столов" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Отключить" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Обновлять экран во время гашения обратного хода луча кадровой развертки" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Устройства вывода" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Обработка перекрывающегося вывода" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Отрисовывать каждое устройство вывода независимо, даже если устройства " "вывода перекрываются" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Задержка отклика" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Предпочтение большему выводу" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Предпочтение меньшему выводу" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Вызвать щелчком" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Вызвать окно" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Вызов выбранных окон по истечении интервала времени" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Вызов и размещение окна поверх других окон" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Вызов окон щелчком" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Частота обновления" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Коэффициент размера экрана для виртуального размера по горизонтали" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Коэффициент размера экрана для виртуального размера по вертикали" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Показать рабочий стол" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Замедлить анимацию" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Умный режим" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Синхронизировать с VBlank" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Компрессия текстур" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Фильтр текстур" # MenuButton label # menubutton label #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Фильтрация текстур" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Частота, с которой перерисовывается содержимое экрана (раз/сек)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Развертывать окно" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Развертывать окно по горизонтали" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Развертывать окно по вертикали" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Переключить свертывание окна в полоску" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Развертывание активного окна" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Развертывание активного окна по горизонтали" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Развертывание активного окна по вертикали" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Переключение свертывания активного окна в полоску" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Переключатель для использования медленной анимации" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Отмена полного развертывания активного окна" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Отменить перенаправление окон в полноэкранном режиме" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Использование рассеянного света при преобразовании экрана" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Виртуальный размер по вертикали" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Очень высокий" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Которое из перекрывающихся устройств вывода должно быть выбрано" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Сочетание кнопок меню окна" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Сочетание клавиш меню окна" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Ускорение" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Настройка изображения" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Настройка изображения на верхней грани куба" # this is a menu entry #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Переход к следующему слайду" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Анимировать фон" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Анимирование фона при вращении куба" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Внешний вид" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Автоматический" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Поведение" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Цвет верхней и нижней граней куба" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Цвет, используемый для нижней границы градиента фона" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Цвет, используемый для верхней границы градиента фона" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Шапка куба" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Цвета куба" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Куб рабочего стола" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Ускорение свертывания" # combo box item #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Скорость свертывания" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Шаг времени свертывания" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "По возможности применять множественное отображение для масштабирования " "качества изображения" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Возврат к предыдущему слайду" # summary information text - header #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Файлы изображений" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Изображение, используемое в качестве текстуры для фона" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Прозрачность куба только во время вращения мышью." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Внутренняя поверхность куба" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Внутренняя поверхность куба" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Список PNG- и SVG-файлов, которые следует отобразить на верхней грани куба" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Режим множественного вывода" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Несколько кубов" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Следующий слайд" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Один большой куб" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Прозрачность во время вращения" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Прозрачность в статичном положении" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Прозрачность рабочего стола во время вращения." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Прозрачность окон на рабочем столе в статичном положении." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Размещение окон на кубе" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Предыдущий слайд" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Отрисовка фона" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Масштабировать изображение" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Масштабировать изображения для покрытия верхней грани куба" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Выбор отображения куба при множественном выводе." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Фон" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Конечный цвет градиента для фона" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Начальный цвет градиента для фона" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Изображение для фона" # combo box item #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Скорость" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Шаг времени" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Прозрачность только при вращении мышью" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Прозрачность куба" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Развертывание" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Развертывание куба" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Управление Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Разрешить генерацию мипмэпов для текстур оформления" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Команда" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Декорация окон" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Командная строка декоратора, которая выполняется, если декоратор еще не " "запущен" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Смещение отбрасываемой тени по оси X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Смещение отбрасываемой тени по оси Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Цвет отбрасываемой тени" # int field #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Прозрачность отбрасываемой тени" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Радиус отбрасываемой тени" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Цвет тени" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Смещение тени по оси X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Смещение тени по оси Y" # int field #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Прозрачность тени" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Радиус тени" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Тень окон" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Оформление окна" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Оформление окна" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Окна к которым будет применено оформление" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Окна которые будут отбрасывать тень" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Яркость (в %) неотвечающих окон" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Постоянная скорость" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Постоянное время" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Затемнение не отвечающего окна" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Затемнение окна, которое не отвечает на запросы менеджера окон" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Скорость исчезновения" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Затенять при свертывании/открытии/закрытии" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Скорость затенения" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Время исчезновения" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Эффект затенения при свертывании/открытии/закрытии окон" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Эффект затенения при системном звуковом сигнале" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Постепенное проявление окон при отображении и постепенное исчезновение при " "отмене отображения" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Затенение окон" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Проявление/исчезание окон" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Полноэкранная визуализация звукового сигнала" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" "Полноэкранный эффект проявления/исчезания при системном звуковом сигнале" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Насыщенность (в %) не отвечающего окна" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Яркость не отвечающего окна" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Насыщенность не отвечающего окна" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Визуализация звукового сигнала" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Режим проявления/исчезновения окна" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Скорость исчезновения окна в режиме \"Постоянная скорость\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Время исчезновения окна (в мс) в режиме \"Постоянная скорость\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Окна, к которым следует применять эффект проявления/исчезания" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Точка монтирования" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Точка монтирования" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Файловая система в пользовательском пространстве (fuse)" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Файловая система в пользовательском пространстве (fuse)" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Управление GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Поддержка основного цикла GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Совместимость с Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Открыть в терминале" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" "Опции, поддерживающие совместимость Compiz с окружением рабочего стола Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Диалоговое окно запуска" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Запустить команду в терминале" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Командная строка снимка экрана" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Отобразить главное меню" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Отображение диалогового окна запуска приложения" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Отображение главного меню" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Сделать снимок экрана" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Сделать снимок окна" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Командная строка терминала" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Командная строка снимка окна" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Формат хранения в простом ini-файле" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Модуль извещения об изменении файла" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Управление Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Эффект свертывания" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Свернуть окна" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Скорость свертывания" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Квант времени свертывания" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Устойчивость тени" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Устойчивость тени" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Преобразовывать окна при свертывании и отмене свертывания" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Окна, которые должны быть преобразованы при свертывании" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Ограничить Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Ограничение координаты Y пределами рабочей области" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Не обновлять со стороны сервера положение окон до окончания перемещения" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Инициировать движение окна" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "\"Ленивое\" позиционирование" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Переместить окно" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Переместить окно" # int field #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Прозрачность" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Степень прозрачности движущихся окон" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Отмена привязки и автоматическая отмена развертывания полностью развернутых " "окон при перетаскивании" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Отменить привязку полностью развернутых окон" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Запуск перемещения окна" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Яркость" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Уменьшение яркости" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Увеличение яркости" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Шаг изменения яркости" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Значение яркости для окон" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Уменьшить" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Увеличить" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Уменьшение прозрачности" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Увеличение прозрачности" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Шаг прозрачности" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Значение прозрачности для окон" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Прозрачность, яркость и насыщенность" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Регулировки прозрачности, яркости и насыщенности" # Table header 4/5 #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Насыщенность" # Table header 4/5 #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Уменьшение насыщенности" # Table header 4/5 #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Увеличение насыщенности" # Table header 4/5 #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Шаг изменения насыщенности" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Значения насыщенности для окон" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Шаг" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Специфические настройки окна" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Значения для окна" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Окна" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Окна, которые должны иметь отличную(другую) яркость по умолчанию" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Окна, которые должны иметь отличную(другую) прозрачность по умолчанию" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Окна, которые должны иметь отличную(другую) насыщенность по умолчанию" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Алгоритм, используемый для размещения окна" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Каскадом" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "По центру" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Фиксированное размещение окна" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Принудительное позиционирование окон" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Горизонтальные позиции видовых окон" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Держать в рабочей области" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "Предотвратить перемещение окон запределы экрана" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Размещение окон" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Размещать на всех устройствах вывода" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "При отображении разместите окна в нужных местах" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Режим размещения" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Спозиционированные окна" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Случайно" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Выбор как должно себя вести позиционирование окон, если используется " "несколько выводов" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Умный" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Использовать активное устройство вывода" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Использовать устройство вывода сфокусированного окна" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Использовать устройство вывода с курсором" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Вертикальные позиции видовых окон" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Спозиционированные окна видового окна" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Обходные пути при размещении окна" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Окна, которые должны быть спозиционированны по умолчанию" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Окна, которые должны быть спозиционированны в определенном экране по " "умолчанию" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Окна, которые должны быть спозиционированы, даже если они указывают, что " "этого делать не нужно." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Окно с фиксированной позицией" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Окно с фиксированным видовым окном" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Обходные пути" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Положения по X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Положения видового окна по X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Значения положения по X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Положения по Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Положения видового окна по Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Значения положения по Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Загрузчик изображений Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Соответствие регулярными выражениями" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Соответствие окон с помощью регулярных выражений" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Закрепление" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Цвет границы" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Цвет границы, используемый для обрисовки контура и режимов изменения " "размеров прямоугольника" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Режим изменения размера по умолчанию" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Режим по умолчанию, используемый для изменения размера окна" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Цвет заливки" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Цвет заливки, используемый для режима изменения размеров прямоугольника" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Инициировать обычное изменение размеров окна" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Инициировать изменение размеров окна Граница" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Инициировать изменение размеров окна Прямоугольник" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Инициировать изменение размеров окна Растяжение" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Инициировать изменение размеров окна" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Нормальное изменение размеров окна" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Граница" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Граница изменение размеров окна" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Прямоугольник" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Прямоугольник изменение размеров окна" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Изменение размеров окна" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Изменение размеров окна" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Запуск изменения размеров окна" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Запуск изменения размеров окна его растяжением" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Запуск обычного изменения размеров окна" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Запуск изменения размеров окна с показом границы" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Запуск изменения размеров окна с показом прямоугольника" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Растянуть" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Растяжение изменение размеров окна" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" "Типы окон, которым следует применять эффект нормального изменения размера" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Типы окон, которым следует применять эффект изменения размера граница" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" "Типы окон, которым следует применять эффект изменения размера прямоугольник" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" "Типы окон, которым следует применять эффект изменения размера растяжение" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Отражение при перетаскивании к краю" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Отражение при перемещении к краю" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Отражение при курсоре на краю" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Время отражения" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Отражение в левое кадровое окно и искажение курсора" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Отражение на следующее кадровое окно при перетаскивании объекта к краю экрана" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Отражение на следующее кадровое окно при смещении курсора к краю экрана" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Отражение на следующее кадровое окно при перемещении окна к краю экрана" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Отражение в правое кадровое окно и искажение курсора" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Инвертировать ось Y для перемещений курсора" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Инвертировать для курсора ось Y" # dialog caption #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Чувствительность курсора" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Поднимать при вращении" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Поднимать окна при вращении" # Translators: text entry label #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Вращение куба" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Вращать с отражением влево" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Вращать с отражением вправо" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Вращать влево" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Вращать влево вместе с окном" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Вращать вправо" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Вращать вправо вместе с окном" # Translators: text entry label #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Вращать до" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Вращать до грани 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Вращать до грани 1 вместе с окном" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Вращать до грани 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Вращать до грани 10 вместе с окном" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Вращать до грани 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Вращать до грани 11 вместе с окном" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Вращать до грани 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Вращать до грани 12 вместе с окном" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Вращать до грани 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Вращать до грани 2 вместе с окном" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Вращать до грани 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Вращать до грани 3 вместе с окном" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Вращать до грани 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Вращать до грани 4 вместе с окном" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Вращать до грани 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Вращать до грани 5 вместе с окном" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Вращать до грани 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Вращать до грани 6 вместе с окном" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Вращать до грани 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Вращать до грани 7 вместе с окном" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Вращать до грани 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Вращать до грани 8 вместе с окном" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Вращать до грани 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Вращать до грани 9 вместе с окном" # Translators: text entry label #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Вращение куба" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Вращение куба рабочего стола" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Вращение влево" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Вращение влево вместе с активным окном" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Вращение вправо" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Вращение вправо вместе с активным окном" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Вращение к лицу куба" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Вращать к лицу куба вместе с окном" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Вращение до грани 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Вращение до грани 1 вместе с активным окном" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Вращение до грани 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Вращение до грани 10 вместе с активным окном" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Вращение до грани 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Вращение до грани 11 вместе с активным окном" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Вращение до грани 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Вращение до грани 12 вместе с активным окном" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Вращение до грани 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Вращение до грани 2 вместе с активным окном" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Вращение до грани 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Вращение до грани 3 вместе с активным окном" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Вращение до грани 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Вращение до грани 4 вместе с активным окном" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Вращение до грани 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Вращение до грани 5 вместе с активным окном" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Вращение до грани 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Вращение до грани 6 вместе с активным окном" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Вращение до грани 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Вращение до грани 7 вместе с активным окном" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Вращение до грани 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Вращение до грани 8 вместе с активным окном" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Вращение до грани 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Вращение до грани 9 вместе с активным окном" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Вращение до кадрового окна" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Вращать окно" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Вращение вместе с окном" # workflow: "3D Beschleunigung aktivieren" # -ke- #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Ускорение вращения" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Скорость вращения" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Квант времени вращения" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Масштабирование вращения" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Чувствительность к перемещениям курсора" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Привязка вращения куба к нижней грани" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Привязка вращения куба к верхней грани" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Привязать к нижней грани" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Привязать к верхней грани" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Запуск вращения" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Задержка во времени до отражения кадрового окна" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Изменить масштаб" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Степень прозрачности в процентах" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Большой" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Режим горячих клавиш с залипанием" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Использовать режим горячих клавиш с залипанием вместо включения при нажатии " "и отключения при отпускании кнопок." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Щелкнуть на рабочем столе для отображения рабочего стола" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Затемнить фон" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Затемнение фона при масштабировании окон" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Эмблема" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Переход в режим отображения рабочего стола при щелчке мышью на рабочем столе " "во время масштабирования" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Время задержки при наведении" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Инициировать средство выбора окна" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Инициировать средство выбора окна для всех окон" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Инициировать средство выбора окна для группы окон" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Инициировать средство выбора окна для окон текущего устройства вывода" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Режим назначения клавиш с залипанием" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Использовать режим горячих клавиш с залипанием вместо включения при нажатии " "и отключения при отпускании кнопок." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Компоновка и запуск преобразования всех окон" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Компоновка и запуск преобразования группы окон" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Компоновка и запуск преобразования окон" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Компоновка и запуск преобразования окон текущего устройства вывода" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "На все устройства вывода" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "На текущее устройство вывода" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Наложить значок" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Наложение значка на окна при их масштабировании" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Масштабировать" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Масштабирование окон" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Скорость масштабирования" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Квант времени масштабирования" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Масштабирование окон" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Выбрать, где масштабировать окна если используются устройства множественного " "вывода." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Расстояние между окнами" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Интервал" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Время (в мс) до завершения режима масштабирования при наведении указателя на " "окно" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Типы окон, для которых следует применять режим масштабирования" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Автоматически снимок экрана в этой программе" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Каталог" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Сделать снимок области" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Запустить приложение" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Помещать изображения снимков экрана в этот каталог" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Снимок экрана" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Модуль снимка экрана" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Загрузчик изображений Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Уровень яркости в процентах" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Уровень насыщенности в процентах" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Переключатель приложений" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Автоматически переворачивать" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Переместить на передний план" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Перемещение выбранного окна на передний план" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" "При переключении окон рабочий стол на заднем плане должен быть уменьшен" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Значок" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Свернутые" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Следующая панель" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Следующее окно" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Следующее окно (Все окна)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Следующее окно (Не активируя)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Отображение переключателя (если он невидим) и выбор следующего окна" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Отображение переключателя (если он невидим) и выбор следующего окна из всех " "имеющихся" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Отображение переключателя (если он невидим) и выбор предыдущего окна" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Отображение переключателя (если он невидим) и выбор предыдущего окна из всех " "имеющихся" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Предыдущая панель" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Предыдущее окно" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Предыдущее окно (Все окна)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Предыдущее окно (Не активируя)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Вращать к выбранному окну при переключении" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Выбрать следующее окно типа панель." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Выбрать следующее окно без показа всплывающего окна." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Выбрать предыдущее окно типа панель." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Выбрать предыдущее окно без показа всплывающего окна." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Отображение значка рядом с эскизом" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Отображение свернутых окон" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Скорость переключателя" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Квант времени переключателя" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Переключатель окон" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Окна, которые должны быть отображены в переключателе" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Обеспечить поддержку цветового пространства YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Воспроизведение видео" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Воспроизведение видео" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Цветовое пространство YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Добавить линию" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Добавить точку" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Добавление эффектов воды к различным действиям рабочего стола" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Задержка (в мс) между каплями дождя" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Включить для курсора эффекты воды" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Линия" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Масштаб смещения" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Точка" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Задержка дождя" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Волны заголовка" # translators: toggle button label #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Переключить дождь" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Включение или отключение эффекта дождя" # translators: toggle button label #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Переключить стеклоочиститель" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Включение или отключение эффекта стеклоочистителя" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Эффект воды" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Масштаб смещения воды" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Эффект волн в заголовке окна" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Эффект фокусировки" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Эффект фокусировки окна" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Типы окон с фокусом" # Table header 5/5 #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Трение" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Типы окон при захвате" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Разрешение решетки" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Инвертированная привязка окна" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Включить дрожание окна" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Эффект отражения" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Эффект отражения окна" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Типы отражения окна" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Эффект развертывания" # combo box item #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Минимальный размер решетки" # combo box item #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Минимальный размер решетки на вершинах" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Переместить окна" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Дрожание" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Инвертированная привязка" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Привязка окон" # Table header 5/5 #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Упругое трение" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K упругости" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Константа упругости" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Переключение привязки окон" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Использовать модель пружины в эффекте вязкого окна" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Разрешение решетки на вершинах" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Окна, становящиеся вязкими при фокусе" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Окна, становящиеся вязкими при захвате" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Окна, становящиеся вязкими при назначении" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Окна, становящиеся вязкими при перемещении" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Эффект вязкости при развертывании и свертывании окон" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Вязкие окна" #~ msgid "Command line 0" #~ msgstr "Командная строка 0" #~ msgid "Run command 0" #~ msgstr "Выполнить команду 0" #~ msgid "Screenshot commands" #~ msgstr "Команды снимка экрана" #~ msgid "Screenshot key bindings" #~ msgstr "Горячие клавиши снимка экрана" #~ msgid "Filter Linear" #~ msgstr "Линейная фильтрация" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Использовать линейную фильтрацию при приближении" #~ msgid "Zoom Desktop" #~ msgstr "Изменить масштаб рабочего стола" #~ msgid "Zoom In" #~ msgstr "Уменьшить" # combo box item #~ msgid "Zoom Out" #~ msgstr "Увеличить" #~ msgid "Zoom Pan" #~ msgstr "Панорамирование" # combo box item #~ msgid "Zoom Speed" #~ msgstr "Скорость изменения масштаба" #~ msgid "Zoom Timestep" #~ msgstr "Квант времени изменения масштаба" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Изменение масштаба и сдвига куба рабочего стола" # combo box item #~ msgid "Zoom factor" #~ msgstr "Коэффициент масштабирования" #~ msgid "Zoom pan" #~ msgstr "Панорамирование масштабирования" #~ msgid "Decrease window opacity" #~ msgstr "Уменьшить прозрачность окна" #~ msgid "Increase window opacity" #~ msgstr "Увеличение прозрачности окна" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Значение прозрачности, для окон которые должны быть прозрачными по " #~ "умолчанию" #~ msgid "Opacity windows" #~ msgstr "Прозрачность окон" ./po/he.po0000644000004100000410000031000313246301623012612 0ustar www-datawww-data# Hebrew message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2004 SuSE Linux AG. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-04-24 02:56+0200\n" "Last-Translator: Yotam Benshalom \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "שולחן עבודה" # Label text #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ניהול חלונות" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "קומפיז" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ללא" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "גלול" # button text #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "הגדל למקסימום" # button text #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "הרחב למקסימום" # button text #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "הגבה למקסימום" # button text #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "מזער" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "העלה" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "תחתון" # Label text #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "תפריט חלון" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "פעולה לביצוע בעת גלילת גלגלת העכבר על שורת הכותרת." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "סוג טשטוש" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "אטימות חלון פעיל על פי ערכת הנושא של Metacity" # Radio button for using an entire (Windows) partition for Linux #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "הצללת אטימות חלון פעיל על פי ערכת הנושא של Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "אטימות ערכת הנושא של Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "הצללת אטימות ערכת הנושא של Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "אטימות עבור חלונות פעילים עם מסגרות של ערכת הנושא של Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "אטימות עבור מסגרות של ערכת הנושא של Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "הצללת חלונות פעילים עם מסגרות של ערכת הנושא של Metacity מאטום לשקוף" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "הצללת חלונות עם מסגרות של ערכת הנושא של Metacity מאטום לשקוף" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "פעולת גלגלת העכבר מעל פס הכותרת" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "סוג טשטוש עבור מסגרות חלון" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "השתמש בערכת הנושא של Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "השתמש בערכת הנושא של Metacity בעת ציור מסגרות חלון" # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "סגור חלון" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "שחזר גודל חלון" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "הגדל חלון למקסימום" # button text #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "מזער חלון" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "העבר למעלה" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "נעל במקום" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "פרוס גלילה" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "בטל העברה למעלה" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "בטל נעילה במקום" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "החלון \"%s\" אינו מגיב." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "סגירה כפויה של היישום תביא לאובדן שינויים שלא נשמרו." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_סגור יישום" # IN #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "ציור הערות" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "צבע מילוי עבור הערות" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "צבע מכחול עבור הערות" # IN #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "התקן ציור הערות" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "נקה" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "צייר" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "צייר בעזרת כלי" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "צבע מילוי עבור הערות" # IN #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "התחל" # IN #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "התחל לצייר הערות" # IN #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "התחל למחוק הערות" # IN #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "התחל מחיקה" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "עובי קו" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "עובי קו עבור הערות" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "צבע מכחול עבור הערות" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "עובי מכחול" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "עובי מכחול עבור הערות" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4 x ביליניארי" # button text #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "טשטוש אלפא" # button text #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "טשטוש אלפא לחלונות" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "מסנן טשטוש" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "אטימה בטשטוש" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "רווית טשטוש" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "מהירות טשטוש" # button text #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "טשטוש חלונות" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "טשטוש מאחורי חלקי חלון שקופים" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "רווית טשטוש" # button text #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "טשטוש חלונות" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "טשטוש חלונות לא ממוקדים" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "אל תטשטש חלקי מסך המוסתרים על ידי חלונות אחרים." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "שיטת סינון עבור טשטוש" # button text #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "טשטוש מיקוד" # אני לא בטוח למה הכוונה #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "טשטש מיקוד חלונות" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "גאוס" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "רדיוס גאוס" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "עוצמת גאוס" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "רדיוס גאוס" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "עוצמת גאוס" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "ייבוא עצמאי של טקסטורות" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "הפעלת Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "רמת פירוט Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "רמת הירידה לפרטים של Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "הבהוב" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "אפקט הבהוב" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "השתמש ביחידות טקסטורה זמינות על מנת לבצע ייבוא עצמאי של טקסטורות רבות ככל " "האפשר." # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "מהירות טשטוש חלון" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "חלונות עליהם יש להחיל טשטוש מיקוד" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "חלונות עליהם יש להחיל טשטוש אלפא כברירת מחדל" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "שיבוט פלט" # IN #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "התחל בחירת שיבוט" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "הליך טיפול בפלט משובט" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המזוהה על ידי פקודה0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "צירוף מקשי עכבר להפעלת פקודת המעטפת המוגדרת על ידי פקודה9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "צירוף מקשים להפעלת פקודת המעטפת המזוהה על ידי פקודה0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "צירוף מקשים להפעלת פקודת המעטפת המוגדרת על ידי פקודה9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "קצה מסך להפעלת פקודת המעטפת המזוהה על ידי פקודה0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "קצה מסך להפעלת פקודת המעטפת המוגדרת על ידי פקודה9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "הקצאת צירופי הפעלה לפקודות מוגדרות אישית" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "צירופי מקשי עכבר" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "שורת פקודה 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "שורת פקודה 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "שורת פקודה 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "שורת פקודה 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "שורת פקודה 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "שורת פקודה 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "שורת פקודה 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "שורת פקודה 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "שורת פקודה 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "שורת פקודה 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "שורת פקודה 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "שורת פקודה 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "שורת הפקודה שתופעל בעת הרצת פקודה9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "פקודות" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "קצות מסך" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "צירופי מקשים" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "הרץ פקודה 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "הרץ פקודה 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "הרץ פקודה 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "הרץ פקודה 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "הרץ פקודה 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "הרץ פקודה 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "הרץ פקודה 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "הרץ פקודה 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "הרץ פקודה 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "הרץ פקודה 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "הרץ פקודה 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "הרץ פקודה 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "התקנים מופעלים" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "אל תנתב חלונות במסך מלא למפות פיקסלים שמחוץ למסך" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "צלצול ניתן לשמיעה" # label text #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "צפצוף מערכת ניתן לשמיעה" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "העלאה אוטומטית" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "השהייה לפני העלאה אוטומטית" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "זיהוי אוומטי של התקני פלט" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "זיהוי אוטומטי של קצב רענון" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "מיטבי" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "הקלקה למיקוד" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "הקלקה על חלון תעביר אליו את מוקד הקלט" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "סגירת חלון פעיל" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "צלמית ברירת מחדל" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "תמונת צלמית ברירת המחדל של חלון" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "גודל שולחן עבודה" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "זהה סוגי פלט" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "זהה קצב עדכון" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "הגדרות תצוגה" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "משך הזמן שבו מצביע העכבר ישהה בקצה המסך לפני הפעלת פעולת קצה מסך." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "השהיית הפעלת קצה מסך" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "מהיר" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "אופן עליה וקבלת מוקד" # heading text #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "רמת מניעת מיקוד" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "חלונות מונעי מיקוד" # heading text #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "חלונות מונעי מיקוד" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "כפה צביעת פלט עצמאית." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "אפשרויות כלליות" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "אפשרויות כלליות של קומפיז" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "טוב" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "הסתרת חלונות הנעדרים משורת המשימות" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "הסתר את כל החלונות וגלה את שולחן העבודה" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "הסתרת החלונות שאינם מופיעים בשורת המשימות בעת כניסה למצב גילוי שולחן עבודה" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "גבוהה" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "גודל אופקי וירטואלי" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "אם ניתן, השתמש בדחיסה עבור טקסטורות שהומרו מתמונות" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "התעלם מרמזים כאשר החלון מוגדל למקסימום" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "התעלם מרמזים הנוגעים לגודל שגוי ולאספקט כאשר החלון מוגדל למקסימום" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "פסק זמן לפני העלאת החלונות שנבחרו" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "פסק זמן בין מסרי פינג" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "צירופי מקשים" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "רמת מניעת גניבת מיקוד" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "תאורה" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "רשימת ההתקנים הפעילים" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "רשימת המחרוזות המתארות התקני פלט" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "נמוכה" # label text #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "הורד חלון" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "הורד חלון אל מתחת לחלונות אחרים" # button text #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "הרחב את החלון למקסימום" # button text #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "הגבה את החלון למקסימום" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "הגדל חלון פעיל למקסימום" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "הרחב חלון פעיל למקסימום" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "הגבה חלון פעיל למקסימום" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "מזער חלון פעיל" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "רגיל" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "מספר שולחנות עבודה" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "מספר שולחנות עבודה וירטואליים" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "כבויה" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "בצע עדכוני מסך רק במשך המחיקות האנכיות" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "פלטים" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "טיפול בחפיפת פלט" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "צבע כל פלט כשלעצמו, אפילו אם התקני הפלט חופפים" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "השהיית פינג" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "העדף פלט גדול יותר" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "העדף פלט קטן יותר" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "העלה בעת קליק" # heading text #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "העלה חלון" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "העלה את החלונות שנבחרו לאחר פסק זמן" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "העלה חלון מעל ליתר החלונות" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "העלה חלונות כאשר מקליקים עליהם" # label text #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "קצב רענון" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "מכפיל גודל מסך עבור גודל וירטואלי אופקי" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "מכפיל גודל מסך עבור גודל וירטואלי אנכי" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "גלה שולחן עבודה" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "אנימציה איטית" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "מצב חכם" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "סינכרון עם VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "דחיסת טקסטורות" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "מסנן טקסטורות" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "סינון טקסטורות" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "הקצב שבו מתעדכן המסך (פעמים\\שניה)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "הפעלת\\ניטרול גודל חלון מקסימלי" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "הפעלת\\ניטרול רוחב חלון מקסימלי" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "הפעלת\\ניטרול גובה חלון מקסימלי" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "הפעלת\\ניטרול גלילת חלון" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "הפעלת\\ניטרול גודל חלון פעיל מקסימלי" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "הפעלת\\ניטרול רוחב חלון פעיל מקסימלי" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "הפעלת\\ניטרול גובה חלון פעיל מקסימלי" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "הפעלת\\ניטרול חלון פעיל גלול" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "הפעלת\\ניטרול שימוש באנימציה איטית" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "שחזר גודל חלון פעיל" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "אל תעביר חלונות במסך מלא" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "השתמש בפיזור אור בעת שינוי צורת מסך" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "גודל אנכי וירטואלי" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "גבוהה מאוד" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "איזה התקן פלט להעדיף מבין ההתקנים החופפים" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "צירוף כפתורים עבור תפריט חלון" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "צירוף מקשים עבור תפריט חלון" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "האצה" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "התאם תמונה" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "התאם את תמונת הפאה העליונה לזווית הסיבוב" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "התקדם לשקופית הבאה" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "כיפת-רקיע מונפשת" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "הנפש את כיפת הרקיע בעת סיבוב הקוביה" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "מראה" # IN #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "אוטומטי" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "אופן" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "צבע הפאה העליונה והפאה התחתונה של הקוביה" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "צבע הקצה התחתון של כיפת-הרקיע - רקע הדרגתי כברירת מחדל" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "צבע הקצה העליון של כיפת-הרקיע - רקע הדרגתי כברירת מחדל" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "מכסי הקוביה" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "צבע הקוביה" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "שולחן קוביה" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "האצת קיפול" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "מהירות קיפול" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "יחידת זמן קיפול" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "במידת האפשר צור mipmap עבור שינוי קנה מידה באיכות גבוהה" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "חזור לשקופית הקודמת" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "קבצי תמונה" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "תמונה שתשמש כטקסטורה עבור כיפת-הרקיע" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "השתמש בשקיפות הקוביה רק אם הסיבוב בוצע בעזרת העכבר." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "מבט מתוך הקוביה" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "מבט מתוך הקוביה" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "רשימת קבצי SVG ו-PNG שיוצגו על פאת הקוביה העליונה" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "מצב פלט מרובה" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "קוביות מרובות" # button text #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "השקופית הבאה" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "קוביה גדולה אחת" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "אטימות בעת סיבוב" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "אטימות בעת מנוחה" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "אטימות שולחן העבודה בעת סיבוב." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "אטימות שולחן העבודה בעת מנוחה." # button text #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "מקם את החלונות על הקוביה" # label text #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "השקופית הקודמת" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "צייר כיפת-רקיע" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "התאם את מידות התמונה" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "התאם את מידות התמונות כדי שתכסינה את פאת הקוביה העליונה" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "בחר את אופן הצגת הקוביה בעת שימוש ביותר מהתקן פלט אחד." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "כיפת-רקיע" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "צבע הדרגתי סופי של כיפת-הרקיע" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "צבע הדרגתי התחלי של כיפת-הרקיע" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "תמונת כיפת-הרקיע" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "מהירות" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "יחידת זמן" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "שקיפות רק בעת סיבוב עכבר" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "קוביה שקופה" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "פרוש קיפול" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "פרוש את הקוביה" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus " #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "תשתית בקרת Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "אפשר ייצור mipmap עבור טקסטורות מסגרת" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "פקודה" # button text #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "חלונות מסגרת" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "שורת פקודה עבור צייר מסגרות שאותה יש להריץ אם שום צייר מסגרות אינו פעיל" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "הסטת X של צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "הסטת Y של צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "צבע צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "שקיפות צל חלון" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "רדיוס צל חלון" # button text #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "צבע הצל" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "הסטת X של הצל" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "הסטת Y של הצל" # Radio button for using an entire (Windows) partition for Linux #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "אטימות צל" # button text #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "רדיוס צל" # button text #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "חלונות צל" # Label text #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "מסגור חלונות" # Label text #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "מסגרות לחלונות" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "חלונות עבורם יש לצייר מסגרת" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "חלונות האמורים להטיל צל" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "בהירות חלונות שאינם מגיבים (באחוזים)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "מהירות קבועה" # header text #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "משך קבוע" # heading text #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "עמעם חלונות שאינם מגיבים" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "עמעם חלונות שאינם מגיבים להודעות מנהל החלונות" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "מצב עמעום" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "עמעום בעת מזעור\\פתיחה\\סגירה" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "מהירות עמעום" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "משך עמעום" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "אפקט עמעום בעת ארועי מזעור, פתיחה וסגירה של חלון" # label text #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "אפקט עמעום בעת צפצוף מערכת" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "עמעום פנימה לחלונות בעת מיפוי ועמעום החוצה לחלונות בעת מחיקה" # button text #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "עמעום חלונות" # button text #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "עמעום חלונות" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "פעמון חזותי במסך מלא" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "אפקט עמעום במסך מלא בעת צפצוף מערכת" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "רווית חלונות שאינם מגיבים (באחוזים)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "בהירות חלונות שאינם מגיבים" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "רווית חלונות שאינם מגיבים" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "פעמון חזותי" # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "מצב עמעום חלון" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "מהירות עמעום חלון במצב \"מהירות קבועה\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "משך עמעום חלון במצב \"משך קבוע\" (במילישניות)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "חלונות האמורים לעבור עמעום" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "נקודת עיגון" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "נקודת עיגון" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "מערכת קבצים במרחב המשתמש" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "מערכת קבצים במרחב המשתמש" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf " #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "תשתית בקרה של Gconf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib " #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "תמיכה בלולאה ראשית של GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "תאימות לגנום" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "פתח מסוף" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "אפשרויות להבטחת תאימות קומפיז לסביבת שולחן העבודה גנום" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "דיאלוג הרץ" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "הרץ פקודת מסוף" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "שורת פקודה לצילום מסך" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "הצג תפריט ראשי" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "הצג דיאלוג הרץ יישום" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "הצג את התפריט הראשי" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "צור צילום מסך" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "צור צילום מסך של חלון" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "שורת פקודה עבור מסוף" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "שורת פקודה לצילום מסך של חלון" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini " #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "תשתית קובץ Ini שטוח" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "התקן הודעות על שינוי בקובץ" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "הודעות" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig " #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "תשתית בקרה של Kconfig" # button text #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "אפקט מזעור" # button text #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "מזעור חלונות" # button text #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "מהירות מזעור" # button text #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "יחידת זמן למזעור" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "התנגדות הצללה" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "התנגדות הצללה" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "שנה את צורת החלונות בעת מזעור ושחזור" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "חלונות שיש לשנות את צורתם בעת מזעור" # header text #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "מגבלת Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "קואורדינטת Y להגבלת משטח העבודה" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "אל תעדכן את מיקום החלונות בצד השרת עד שסיימו לזוז" # button text #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "התחל להזיז חלון" # heading text #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "מיקום 'עצל'" # button text #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "הזזת חלון" # button text #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "הזזת חלון" # button text #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "אטימות" # button text #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "רמת אטימות של חלונות בתזוזה" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "שחזר אוטומטית את גודלם של חלונות שהוגדלו למקסימום בעת גרירה" # button text #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "שחזר חלונות שהוגדלו למקסימום" # heading text #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "התחל להזיז חלון" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "בהירות" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "הפחת בהירות" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "הגבר בהירות" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "דרגת שינוי בהירות" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "ערכי בהירות לחלונות" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "הפחת" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "הגבר" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "הפחתת אטימות" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "הגברת האטימות" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "דרגת שינוי אטימות" # button text #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "ערכי אטימות לחלונות" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "אטימות, בהירות ורוויה" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "כוונון אטימות, בהירות ורוויה" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "רווייה" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "הפחתת רווייה" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "הגברת רווייה" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "דרגת שינוי רווייה" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "ערכי רוויה לחלונות" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "דרגת שינוי" # Label text #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "הגדרות לחלונות מוגדרים" # label text #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "ערכי חלונות" # label text #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "חלונות" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "חלונות בעלי בהירות שונה כברירת מחדל" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "חלונות בעלי אטימות שונה כברירת מחדל" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "חלונות בעלי רוויה שונה כברירת מחדל" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "אלגוריתם לקביעת מיקום החלון" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "דירוג" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "ממורכז" # Label text #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "הצבת חלונות במיקום קבוע" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "כפה מיקום על חלונות" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "מיקומי משטח אופקיים" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "שמור בתוך משטח העבודה" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "שמור את החלונות בתוך משטח העבודה לאחר מיקום, גם אם יש להציבם לשם כך במיקום " "שונה מזה המבוקש" # button text #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "מקם חלונות" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "מקם לרוחב כל התקני הפלט" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "מקם חלונות במקום המתאים בעת מיפוי" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "מצב קביעת מיקום" # heading text #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "חלונות ממוקמים" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "אקראי" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "קובע כיצד יש למקם חלונות אם נבחר יותר מהתקן פלט אחד" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "חכם" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "השתמש בהתקן פלט פעיל" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "השתמש בהתקן הפלט של החלון הפעיל" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "השתמש בהתקן הפלט עם הסמן" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "מיקומי משטח אנכיים" # heading text #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "חלונות הממוקמים על משטח" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "פתרונות מעקף למיקום" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "חלונות שיש למקמם כברירת מחדל" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "חלונות שיש למקמם במשטח ספציפי כברירת מחדל" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "חלונות שיש למקמם בכפייה, גם אם הם מבקשים ממנהל החלונות שלא לעשות זאת." # Label text #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "חלונות בעלי מיקום קבוע" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "חלונות בעלי משטח עבודה קבוע" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "מעקפים" # heading text #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "מיקום ב-X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "מיקומי משטח ב-X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "ערכי מיקום ב-X" # heading text #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "מיקום ב-Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "מיקומי משטח ב-Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "ערכי מיקום ב-Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "טוען תמונות Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "התאמה לביטוי רגולרי" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "התאמת חלונות לביטוי רגולרי" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "צירופים" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "צבע גבול" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "צבע המסגרת עבור מצבי שינוי הגודל \"קו מתאר\" ו-\"מרובע\"" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "מצב שינוי גודל" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ברירת מחדל למצב שינוי גודל חלון" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "צבע מילוי" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "צבע מילוי עבור מצב שינוי גודל \"מרובע\"" # IN #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "התחל לשנות גודל חלון במצב רגיל" # IN #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "התחל לשנות גודל חלון במצב קו מתאר" # IN #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "התחל לשנות גודל חלון במצב מרובע" # IN #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "התחל לשנות גודל חלון במצב מתיחה" # IN #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "התחל לשנות גודל חלון" # heading text #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "שינוי גודל חלונות במצב רגיל" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "קו מתאר" # heading text #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "שינוי גודל חלונות במצב קו מתאר" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "מרובע" # heading text #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "שינוי גודל חלונות במצב מרובע" # heading text #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "שינוי גודל חלון" # heading text #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "שינוי גודל חלון" # heading text #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "התחל לשנות את גודל החלון" # heading text #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "התחל לשנות את גודל החלון על ידי מתיחתו" # heading text #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "התחל לשנות את גודל החלון באופן רגיל" # heading text #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "התחל לשנות את גודל החלון בעזרת קו מתאר" # heading text #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "התחל לשנות את גודל החלון בעזרת מרובע" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "מתיחה" # heading text #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "שינוי גודל חלונות במתיחה" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "חלונות עבורם יש להשתמש בשינוי גודל רגיל" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "חלונות עבורם יש להשתמש בשינוי גודל בעזרת קו מתאר" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "חלונות עבורם יש להשתמש בשינוי גודל בעזרת מרובע" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "חלונות עבורם יש להשתמש בשינוי גודל בעזרת מתיחה" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "עלעול בגרירה לקצה מסך" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "עלעול בהזזה לקצה מסך" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "עלעול בהבאת סמן לקצה מסך" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "משך עלעול" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "עלעל למשטח השמאלי והקפץ את הסמן" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "עלעל למשטח הבא בעת גרירת עצם לקצה המסך" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "עלעל למשטח הבא בעת הזזת הסמן לקצה המסך" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "עלעל למשטח הבא בעת הזזת חלון לקצה המסך" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "עלעל למשטח הימני והקפץ את הסמן" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "הפוך את ציר Y לצורך הזזת הסמן" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Y הפוך עבור סמן" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "רגישות סמן" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "העלה בעת סיבוב" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "העלה את החלון בעת סיבוב" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "סיבוב קוביה" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "עלעל בסיבוב שמאלה" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "עלעל בסיבוב ימינה" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "סובב שמאלה" # heading text #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "סובב שמאלה עם החלון" # button text #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "סובב ימינה" # heading text #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "סובב ימינה עם החלון" # button text #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "סובב אל" # heading text #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "סובב אל פאה 1" # heading text #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "סובב אל פאה 1 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "סובב אל פאה 10" # heading text #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "סובב אל פאה 10 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "סובב אל פאה 11" # heading text #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "סובב אל פאה 11 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "סובב אל פאה 12" # heading text #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "סובב אל פאה 12 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "סובב אל פאה 2" # heading text #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "סובב אל פאה 2 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "סובב אל פאה 3" # heading text #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "סובב אל פאה 3 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "סובב אל פאה 4" # heading text #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "סובב אל פאה 4 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "סובב אל פאה 5" # heading text #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "סובב אל פאה 5 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "סובב אל פאה 6" # heading text #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "סובב אל פאה 6 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "סובב אל פאה 7" # heading text #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "סובב אל פאה 7 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "סובב אל פאה 8" # heading text #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "סובב אל פאה 8 עם החלון" # heading text #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "סובב אל פאה 9" # heading text #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "סובב אל פאה 9 עם החלון" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "סיבוב קוביה" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "סובב את קובית שולחן העבודה" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "סובב שמאלה" # heading text #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "סובב שמאלה וקח את את החלון הפעיל" # button text #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "סובב ימינה" # heading text #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "סובב ימינה וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "סובב לפאת הקוביה" # heading text #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "סובב לפאת הקוביה עם החלון" # heading text #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "סובב לפאה 1" # heading text #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "סובב לפאה 1 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "סובב לפאה 10" # heading text #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "סובב לפאה 10 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "סובב לפאה 11 " # heading text #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "סובב לפאה 11 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "סובב לפאה 12" # heading text #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "סובב לפאה 12 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "סובב לפאה 2" # heading text #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "סובב לפאה 2 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "סובב לפאה 3" # heading text #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "סובב לפאה 3 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "סובב לפאה 4" # heading text #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "סובב לפאה 4 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "סובב לפאה 5" # heading text #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "סובב לפאה 5 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "סובב לפאה 6" # heading text #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "סובב לפאה 6 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "סובב לפאה 7" # heading text #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "סובב לפאה 7 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "סובב לפאה 8" # heading text #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "סובב לפאה 8 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "סובב לפאה 9" # heading text #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "סובב לפאה 9 וקח את החלון הפעיל" # heading text #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "סובב למשטח" # button text #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "סובב חלון" # heading text #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "סובב עם החלון" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "תאוצת סיבוב" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "מהירות סיבוב" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "יחידת זמן סיבוב" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "זום סיבוב" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "רגישות תנועת הסמן" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "אפשר הנחת הקוביה על הפאה התחתונה" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "אפשר הנחת הקוביה על הפאה העליונה" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "מנוחה על פאה תחתונה" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "מנוחה על פאה עליונה" # label text #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "התחל סיבוב" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "פסק זמן לפני עלעול למשטח" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "תקריב" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "אחוז האטימות" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "גדול" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "צירוף הקלקות לשינוי מצב מבט על" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "צירוף ההקלקות משנה את מצב מבט העל במקום להפעילו בעת הלחיצה ולנטרלו בעת " "השחרור." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "הקלק על שולחן העבודה כדי להציגו" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "החשך רקע" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "החשך רקע בעת הפעלת מבט על" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "סמלון" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "היכנס למצב הצגת שולחן עבודה כאשר מקליקים עליו בעת מבט על" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "משך ריחוף" # button text #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "הפעל בוחר חלונות" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "הפעל בוחר חלונות עבור כל החלונות" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "הפעל בוחר חלונות עבור קבוצת חלונות" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "הפעל בוחר חלונות עבור חלונות בהתקן הפלט הנוכחי" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "שנה מצב מבט על בעזרת צירוף המקשים" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "צירוף המקשים ישנה את מצב מבט העל במקום להפעילו בעת הלחיצה ולנטרלו בעת השחרור." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "סדר את כל החלונות והתחל לשנות את גודלם" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "סדר את החלונות שבקבוצה והתחל לשנות את גודלם" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "סדר את החלונות והתחל לשנות את גודלם" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "סדר את החלונות בהתקן הפלט הנוכחי והתחל לשנות את גודלם" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "בכל התקני הפלט" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "בהתקן הפלט הנוכחי" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "צלמית מודבקת" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "הדבק צלמית על חלונות במבט על" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "מבט על" # button text #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "הצג חלונות במבט על" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "מהירות הפעלת מבט על" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "יחידת זמן של הפעלת מבט על" # button text #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "הצג חלונות במבט על" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "קובע היכן יש להציג חלונות במבט על אם יש יותר מהתקן פלט אחד." # button text #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "רווח בין חלונות" # ES #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "ריווח" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "זמן (מילי-שניות) ליציאה ממבט על כשהסמן מרחף על חלון" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "חלונות שיש להציגם במבט על" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "פתח אוטומטית צילומי מסך ביישום זה" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ספריה" # IN #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "הפעל צילום מסך של מרובע" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "שגר יישום" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "שמור צילומי מסך בספריה זו" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "צילום מסך" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "התקן צילום מסך" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg " #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "טוען תמונות Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "אחוזי בהירות" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "אחוזי רווייה" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "מעביר יישומים" # IN #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "סיבוב אוטומטי" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "הבא לחזית" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "הבא את החלון הנבחר לחזית" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "מרחק הזום של שולחן העבודה בעת העברת חלונות" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "צלמית" # button text #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ממוזערים" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "הפאנל הבא" # button text #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "החלון הבא" # button text #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "החלון הבא (כל החלונות)" # button text #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "החלון הבא (ללא חלונות קופצים)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "הקפץ את המעביר אם הוא מוסתר ובחר את החלון הבא" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "הקפץ את המעביר אם הוא מוסתר ובחר את החלון הבא מבין כל החלונות" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "הקפץ את המעביר אם הוא מוסתר ובחר את החלון הקודם" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "הקפץ את המעביר אם הוא מוסתר ובחר את החלון הקודם מבין כל החלונות" # label text #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "הפאנל הקודם" # label text #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "חלון קודם" # label text #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "חלון קודם (כל החלונות)" # label text #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "חלון קודם (ללא קופצים)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "סובב אל החלון הנבחר בעת העברה" # button text #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "בחר את חלון הפאנל הבא." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "בחר את החלון הבא בלי להראות את החלון הקופץ." # heading text #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "בחר את חלון הפאנל הקודם." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "בחר את החלון הקודם בלי להראות את החלון הקופץ." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "הראה צלמית לצד תמונה מוקטנת" # button text #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "הראה חלונות ממוזערים" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "מהירות המעביר" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "יחידת זמן של המעביר" # button text #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "חלונות המעביר" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "חלונות שיש להציג במעביר" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "תמוך בחלל-צבעים YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ניגון וידאו" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ניגון וידאו" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "חלל-צבעים YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "הוסף שורה" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "הוסף נקודה" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "מוסיף אפקטי מים לפעולות שונות בשולחן העבודה" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "השהייה (במילי-שניות) לפני כל טיפת גשם" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "אפשר אפקטי מים לסמן" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "קו" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "השפעה על הרקע" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "נקודה" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "השהיית טפטוף" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "גל כותרת" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "הורד\\עצור גשם" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "הפעל\\הפסק אפקט גשם" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "הפעל\\הפסק מגב" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "הפעל\\הפסק אפקט מגב" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "אפקט מים" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "השפעת המים על הרקע מאחוריהם" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "אפקט גל הבוקע ממסגרת החלון" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "אפקט מיקוד" # label text #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "אפקט מיקוד חלון" # button text #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "מיקוד חלונות" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "חיכוך" # button text #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "תפוס חלונות" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "אבחנת רשת" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "מגנוט הפוך" # button text #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "הרעד את החלון" # label text #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "אפקט מיפוי" # label text #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "אפקט בעת מיפוי החלון" # label text #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "מיפוי חלונות" # label text #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "אפקט הגדלה למקסימום" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "גודל רשת מזערי" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "גודל מזערי של רשת קודקודים" # button text #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "הזזת חלונות" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "רעידה" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "מיגנוט הפוך" # button text #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "מיגנוט חלונות" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "חיכוך קפיץ" # ES #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "קבוע קפיץ" # ES #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "קבוע הקפיץ" # button text #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "הפעל\\הפסק מיגנוט חלון" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "השתמש במודל קפיצים עבור אפקט חלון מתנדנד" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "אבחנת רשת קודקודים" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "חלונות האמורים להתנדנד בעת מיקוד" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "חלונות האמורים להתנדנד בעת תפיסתם" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "חלונות האמורים להתנדנד בעת מיפוים" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "חלונות האמורים להתנדנד בעת הזזתם" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "אפקט נדנוד בעת הגדלה למקסימום ומזעור חלונות" # label text #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "חלונות מתנדנדים" #~ msgid "Command line 0" #~ msgstr "שורת פקודה 0" #~ msgid "Run command 0" #~ msgstr "הרץ פקודה 0" #~ msgid "Screenshot commands" #~ msgstr "פקודות לצילום מסך" #~ msgid "Screenshot key bindings" #~ msgstr "צירופי מקשים לצילום מסך" #~ msgid "Filter Linear" #~ msgstr "פילטר לינארי" #~ msgid "Use linear filter when zoomed in" #~ msgstr "השתמש בפילטר לינארי בזמן תקריב הגדלה" #~ msgid "Zoom Desktop" #~ msgstr "תקריב" #~ msgid "Zoom In" #~ msgstr "תקריב הגדלה" #~ msgid "Zoom Out" #~ msgstr "תקריב הקטנה" #~ msgid "Zoom Pan" #~ msgstr "הטיית תקריב" #~ msgid "Zoom Speed" #~ msgstr "מהירות תקריב" #~ msgid "Zoom Timestep" #~ msgstr "יחידת זמן לתקריב" #~ msgid "Zoom and pan desktop cube" #~ msgstr "תקריב והטיה אל קובית שולחן העבודה" #~ msgid "Zoom factor" #~ msgstr "מקדם תקריב" #~ msgid "Zoom pan" #~ msgstr "הטיית תקריב" # Radio button for using an entire (Windows) partition for Linux #~ msgid "Decrease window opacity" #~ msgstr "הפחתת אטימות החלון" #~ msgid "Increase window opacity" #~ msgstr "הגבר אטימות חלון" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "ערכי אטימות לחלונות השקופים כברירת מחדל" #~ msgid "Opacity window values" #~ msgstr "ערכי אטימות חלון" # button text #~ msgid "Opacity windows" #~ msgstr "חלונות אטימות" #~ msgid "Background Images" #~ msgstr "תמונות רקע" #~ msgid "Background images" #~ msgstr "תמונות רקע" # button text #~ msgid "Place windows on a plane" #~ msgstr "הצב חלונות על מישור" # button text #~ msgid "Plane Down" #~ msgstr "מישור למטה" # button text #~ msgid "Plane Left" #~ msgstr "מישור שמאלה" # button text #~ msgid "Plane Right" #~ msgstr "מישור ימינה" # heading text #~ msgid "Plane To Face 1" #~ msgstr "מישור לפאה 1" # heading text #~ msgid "Plane To Face 10" #~ msgstr "מישור לפאה 10" # heading text #~ msgid "Plane To Face 11" #~ msgstr "מישור לפאה 11" # heading text #~ msgid "Plane To Face 12" #~ msgstr "מישור לפאה 12" # heading text #~ msgid "Plane To Face 2" #~ msgstr "מישור לפאה 2" # heading text #~ msgid "Plane To Face 3" #~ msgstr "מישור לפאה 3" # heading text #~ msgid "Plane To Face 4" #~ msgstr "מישור לפאה 4" # heading text #~ msgid "Plane To Face 5" #~ msgstr "מישור לפאה 5" # heading text #~ msgid "Plane To Face 6" #~ msgstr "מישור לפאה 6" # heading text #~ msgid "Plane To Face 7" #~ msgstr "מישור לפאה 7" # heading text #~ msgid "Plane To Face 8" #~ msgstr "מישור לפאה 8" # heading text #~ msgid "Plane To Face 9" #~ msgstr "מישור לפאה 9" # button text #~ msgid "Plane Up" #~ msgstr "מישור למעלה" # button text #~ msgid "Plane down" #~ msgstr "מישור למטה" # button text #~ msgid "Plane left" #~ msgstr "מישור שמאלה" # button text #~ msgid "Plane right" #~ msgstr "מישור ימינה" # heading text #~ msgid "Plane to face 1" #~ msgstr "מישור לפאה 1" # heading text #~ msgid "Plane to face 10" #~ msgstr "מישור לפאה 10" # heading text #~ msgid "Plane to face 11" #~ msgstr "מישור לפאה 11" # heading text #~ msgid "Plane to face 12" #~ msgstr "מישור לפאה 12" # heading text #~ msgid "Plane to face 2" #~ msgstr "מישור לפאה 2" # heading text #~ msgid "Plane to face 3" #~ msgstr "מישור לפאה 3" # heading text #~ msgid "Plane to face 4" #~ msgstr "מישור לפאה 4" # heading text #~ msgid "Plane to face 5" #~ msgstr "מישור לפאה 5" # heading text #~ msgid "Plane to face 6" #~ msgstr "מישור לפאה 6" # heading text #~ msgid "Plane to face 7" #~ msgstr "מישור לפאה 7" # heading text #~ msgid "Plane to face 8" #~ msgstr "מישור לפאה 8" # heading text #~ msgid "Plane to face 9" #~ msgstr "מישור לפאה 9" # button text #~ msgid "Plane up" #~ msgstr "מישור למעלה" # Label text #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "חלונות השתמשה" #, fuzzy #~ msgid "Notification" #~ msgstr "פעולה" #~ msgid "Unknown" #~ msgstr "לא ידוע" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "אורך" # Radio button for using an entire (Windows) partition for Linux #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&מחק את חלונות לגמרי" # heading text #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "שינוי גודל נכשל." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "פעולה" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "איות" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "&בחינה" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "רוסית" # label text #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "חלונות" # button text #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&כווץ את חלונות" # button text #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&כווץ את חלונות" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "פעולה" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "&בחינה" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "זמן מקומי" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "זמן מקומי" # button text #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&מחק את חלונות" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "פעולה" # ES #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ספרד" # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "חלונות פנוי (%1)" # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "חלונות פנוי (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "איות" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "&בחינה" # heading text #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "שינוי גודל נכשל." #, fuzzy #~ msgid "Command line %d" #~ msgstr "פקודה:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "פקודה:" #, fuzzy #~ msgid "Corners" #~ msgstr "ממירים" # Radio button for using an entire (Windows) partition for Linux # button text # heading text # Label text # label text # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time # ES # label text, %1 is replaced by a unit value ("MB") # Labels for input fields. "%1" will be replaced with the current unit (MB). #, fuzzy #~ msgid "Terminate" #~ msgstr "טרמינלים" ./po/hi.po0000644000004100000410000034347713246301623012643 0ustar www-datawww-data# translation of compiz.po to # Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-16 17:03+0530\n" "Last-Translator: Sangeeta Kumari\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Generator: KBabel 1.11.4\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "डेसक्टाप" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "विन्डो मैनेजर" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "कुछ नहीं" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "स्कैनर" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "विंडो क्षैतिज रूप से अधिकतम करें" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "विंडो लंबवत रूप से अधिकतम करें" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "स्वचालित" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "विन्डो मैनेजर" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "विंडो शीर्षक बार में माउस स्क्रॉल के दौरान ली जाने वाली क्रिया" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "छोडं दिया \n" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "मेटासिटी थीम सक्रिय विंडो अपारदर्शिता" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "मेटासिटी थीम सक्रिय विंडो अपारदर्शिता छाया" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "मेटासिटी थीम अपारदर्शिता" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "मेटासिटी थीम अपारदर्शिता छाया" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "मेटासिटी थीम सजावट के साथ सक्रिय विंडो के लिए प्रयोग करने के लिए अपारदर्शिता" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "मेटासिटी थीम सजावट के लिए प्रयोग के लिए अपारदर्शिता" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "अपारदर्शी से पारभासी में मेटासिटी थीम सजावट के साथ छाया सक्रिय विंडो" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "अपारदर्शी से पारभासी में मेटासिटी थीम सजावट के साथ छाया विंडो" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "शीर्षक बार माउस ह्वील क्रिया" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "विंडो सजावट के लिए प्रयुक्त ब्लर का प्रकार" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "मेटासिटी थीम का उपयोग करें" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "विंडो सजवाट खींचने के दौरान मेटासिटी थीम का उपयोग करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "विंडो अधिकतम खत्म करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "विंडो अधिकतम करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "विंडो न्यूनतम करें" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "भारत" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "रंग" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "स्ट्रोक रंग की व्याख्या करें" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "सक्रिय" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "साफ करें" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "खीचें" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "औजार के प्रयोग से खीचें" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "व्याख्या के लिए रंग भरें" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "भारत" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "भारत" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "भारत" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "भारत" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "रेखा चौड़ाई" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "व्याख्या के लिए रेखा चौड़ाई" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "व्याख्या के लिए स्ट्रोक रंग" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "स्ट्रोक चौड़ाई" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "व्याख्या के लिए स्ट्रोक चौड़ाई" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "फिल्टर:" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "फिल्टर सैट करें" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "अवधि" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "अवधि" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "छोडं दिया \n" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "विंडो के पारदर्शी हिस्से को ब्लर करें" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "अवधि" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "विंडोज को धुंधला करें जो फोकस नहीं रखता है" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "दूसरे विंडो के द्वारा धुंधला बनाये गये स्क्रीन क्षेत्र के धुंधलेपन को निष्क्रिय करें." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "धुंधलेपन के लिए प्रयुक्त फिल्टर विधि" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "windows" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "गॉसियन" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "गॉसियन त्रिज्या" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "गॉसियन शक्ति" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "गॉसियन त्रिज्या" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "गॉसियन शक्ति" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "लीमा" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "लीमा" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "विस्तार का मिपमैप स्तर" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "पल्स" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "पल्स प्रभाव" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "windows" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "विंडोज़ को फोसक ब्लर के द्वारा प्रभावित किया जाना चाहिए" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "विंडोज़ जिसे मूलभूत रूप से अल्फा धुंधला का प्रयोग करना चाहिए" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "क्लोन आउटपुट" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "भारत" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "आउटपुट क्लोन नियंत्रक" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand0 के " "द्वारा" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand1 के " "द्वारा" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand10 के " "द्वारा" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand11 के " "द्वारा" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand2 के " "द्वारा" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand3 के " "द्वारा" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand4 के " "द्वारा" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand5 के " "द्वारा" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand6 के " "द्वारा" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand7 के " "द्वारा" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand8 के " "द्वारा" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand9 के " "द्वारा" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand0 के " "द्वारा" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand1 के " "द्वारा" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand10 के " "द्वारा" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand11 के " "द्वारा" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand2 के " "द्वारा" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand3 के " "द्वारा" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand4 के " "द्वारा" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand5 के " "द्वारा" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand6 के " "द्वारा" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand7 के " "द्वारा" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand8 के " "द्वारा" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand9 के " "द्वारा" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand0 के " "द्वारा" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand1 के " "द्वारा" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand10 के " "द्वारा" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand11 के " "द्वारा" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand2 के " "द्वारा" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand3 के " "द्वारा" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand4 के " "द्वारा" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand5 के " "द्वारा" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand6 के " "द्वारा" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand7 के " "द्वारा" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand8 के " "द्वारा" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "एक कीबाइंडिंग को जब बुलाया जाता है शेल कमांड को चलायेगा जो पहचाना जाता हैcommand9 के " "द्वारा" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command0 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command1 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command10 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command11 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command2 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command3 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command4 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command5 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command6 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command7 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command8 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "कमांड लाइन जिसे शेल में चलाया जाना है जब run_command9 को बुलाया जाता है" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "कमान्ड '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "कमान्ड '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "कमान्ड '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "कमान्ड '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "कमांड:" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "कमांड:" #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "सक्रिय" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "ऑफस्क्रीन पिक्समैप में फिर नहीं निर्देशित किए जाने के लिए पूर्णस्क्रीण विंडो के आरेख को स्वीकृति " "दें" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "सुनने योग्य घंटी" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "फाइल सिस्टम" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "स्वचालित" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "स्वचालित उठान विलंब" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "आउटपुट डिवायस की स्वचालित जांच" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ताज़ा दर की स्वचालित जांच" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "सर्वोत्तम" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "फोकस में क्लिक करें" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "विंडो पर क्लिक करना इनपुट फोकस को इसपर खिसकाता है" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "सक्रिय विंडो बन्द करें" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "अकरण डोमैन" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "अकरण डोमैन" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "डेसक्टाप" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "आउटपुट जांचें" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "अपडेट के लिए चुनें" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "तेज" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "फोकस बचाव विंडोज़" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "फोकस बचाव विंडोज़" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "सामान्य विकल्प" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "सामान्य कोंपिज विकल्प" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "अच्छा" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "स्किप टास्कबार विंडोज़ छिपायें" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "सभी विंडो छुपाएँ और डेस्कटॉप पर फ़ोकस करें" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "जब दाखिल होने पर डेस्कटॉप मोड दिखाता है टास्कबार में विंडो छिपाएं" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "विरचयुल उपकरण" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "अधिकतम करने पर संकेत नजरअंदाज करें" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "विंडो के अधिकतम किए जाने पर आकार बढ़त और पहलू संकेत नजरअंदाज करें" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "चयनित विंडो को बढ़ाने के पहले अंतराल" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "पिंग संदेश के बीच का अंतराल" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "लोगिगं" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "सिर्फ मिटाए गए प्रिंटर क्यू सूचीबद्ध करेंद्ध करें" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "आउटपुट डिवायस को वर्णन करते स्ट्रिंग की सूची" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "लोवर सोर्बियन" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "अन्य विंडो के नीचे निचला विंडो" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "विंडो क्षैतिज रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "विंडो लंबवत रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "सक्रिय विंडो अधिकतम करें" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "सक्रिय विंडो क्षैतिज रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "सक्रिय विंडो लंबवत रूप से अधिकतम करें" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "सक्रिय विंडो न्यूनतम करें" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "सामान्य" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "डेसक्टाप" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "डेसक्टाप" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "लंबवत रिक्ति अवधि के दौरान सिर्फ स्क्रीन अद्यतन निष्पादित करें" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "आउटपुट" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "डिले" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "रेडियो क्लोक (&R)" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "windows" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "चयनित विंडो अंतराल के बाद उठाएं" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "विंडो को अन्य विंडो के ऊपर रखें" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "क्लिक किये जाने पर विंडो उठाएं" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "ताजा करो" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "क्षैतिज वर्चुअल आकार के लिए स्क्रीन आकार गुणक" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "लंबवत वर्चुअल आकार के लिए स्क्रीन आकार गुणक" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "डेसक्टाप" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "सिमुलेशन" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "स्मार्ट" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank में तुल्यकालित करें" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "फिल्टर सैट करें" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "फिल्टर सैट करें" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "फिल्टर सैट करें" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "दर जिसपर स्क्रीन फिर खीचा जाता है (समय/सेकेंड)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "विंडो अधिकतम पर टॉगल करें" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "विंडो अधिकतम पर क्षैतिज रूप से टॉगल करें" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "विंडो अधिकतम पर लंबवत रूप से टॉगल करें" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "विंडो छायांकित रूप में टॉगल करें" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "सक्रिय विंडो अधिकतम रूप में टॉगल करें" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "सक्रिय विंडो अधिकतम रूप में क्षैतिज प्रकार से टॉगल करें" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "सक्रिय विंडो अधिकतम रूप में लंवबत प्रकार से टॉगल करें" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "सक्रिय विंडो छायांकित रूप में टॉगल करें" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "धीमा संजीवन के प्रयोग को टॉगल करें" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "सक्रिय विंडो अधिकतम खत्म करें" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "पूर्ण स्क्रीन विंडोज़ को पुनर्निर्देशित मत करें" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "स्क्रीन के बदले जाने पर विसरित प्रकाश का प्रयोग करें" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "विरचयुल उपकरण" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "विंडो मेनू बटन बाइंडिंग" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "विंडो मेनू की बाइंडिंग" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "चित्र समायोजित करें" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "शीर्ष फेस चित्र को घुमाने के लिए समायोजित करें" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "एडवांस विकल्प" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "स्काइडोम एनिमेट करें" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "स्काइडोम एनीमेट करें जब घन को घुमाया जा रहा है" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "स्वचालित" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "घन के ऊपर और नीचे के हिस्से का रंग" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "स्काइडोम फालबैक ढ़ाल के तलवर्ती रंग स्टॉप के लिए प्रयोग का रंग" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "स्काइडोम फालबैक ढ़ाल के शीर्ष रंग स्टॉप के लिए प्रयोग का रंग" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "रंग" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "रंग" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "डेसक्टाप" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "छोडं दिया \n" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "टाइम" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "उच्चतर गुणवत्ता के स्केलिंग के लिए मिपमैप बनाएं जब संभव हो" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "पीछे का" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "डिस्क इमेज फाइल" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "स्काइडोम के लिए एक बनावट के रूप में प्रयोग के लिए चित्र" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "घन पारदर्शिता आरंभ करता है सिर्फ तभी जब घुमाव माउस परिचालित है." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "भीतरी घन" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "भीतरी घन" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "PNG और SVG फाइलों की सूची जिसे घन के शीर्ष फेस में रेंडर किया होना चाहिए" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "मल्टी आउटपुट प्रकार" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "बहुमुखी घन" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "अगला अप्डेट " #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "बड़े घन पर शुरू" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "घुमाव के दौरान अपारदर्शिता" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "नहीं घुमाव के दौरान अपारदर्शिता" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "घुमाव के दौरान डेस्कटॉप विंडो की अपारदर्शिता" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "नहीं घुमाव के दौरान डेस्कटॉप विंडो की अपारदर्शिता" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "पीछे का" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "स्काइडोम रेंडर करें" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "लोकल टाइम" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "घन के कवर शीर्ष फेस में चित्रों को मापें" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "चुनता है कि कैसे घन प्रदर्शित होता है यदि बहुल आउटपुट डिवायस प्रयुक्त होता है." #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "डिस्क इमेज" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "झुकाव ढाल अंत रंग" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "स्काइडोम ढाल प्रारंभ रंग" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "डिस्क इमेज" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "छोडं दिया \n" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "टाइम" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "पारदर्शिता सिर्फ माउस घुमाव पर" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "खोलें" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "घन खोलें" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus नियंत्रण बैकेंड" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "सजावटी बनावट के लिए उत्पन्न करने के लिए मिपमैप स्वीकारें" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "कमांड:" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "सजावटी कमांड लाइन जो चलाया जाता है यदि कोई सजावटकर्ता पहले से नहीं चल रहा है" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "windows" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "छाया ऑफसेट X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "छाया ऑफसेट Y" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "त्रिज्या" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "समनुरूपण" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind विकल्प" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "विंडोज़ जिसे सजाया जाना चाहिए" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "विंडोज़ जिसे एक छाया रखना चाहिए" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "टाइम" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "रखता है" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "windows" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "असली समय " #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "न्यूनतम/ खोलें/ बन्द करें पर फीका कीजिये" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "छोडं दिया \n" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "असली समय " #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "विंडो घटना न्यूनतम/ खोलें /बंद करें पर फीका प्रभाव" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "फाइल सिस्टम" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "मैप रहने पर फेड इन विंडोज और मैप नहीं रहने पर फीका बाहर विंडोज" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "windows" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "पूर्ण स्क्रीन दृश्य बेल" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "सिस्टम बीप पर पूर्ण स्क्रीन फेड प्रभाव" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "दृश्य बेल" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "windows" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "विंडो जिसे स्केल मोड में स्केल किया जाना चाहिए" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "विंडोज़ जिसे फेड करना चाहिए" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "आरोह बिंदु" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "आरोह बिंदु" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "यूजरस्पेस फाइल सिस्टम" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "यूजरस्पेस फाइल सिस्टम" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf नियंत्रण बैकेंड" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib मुख्य लूप समर्थन" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "टर्मिनल खोलें" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "टोण डायलिन्क (&T)" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "दिखाएँ मुख्य मेनू" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "रन अनुप्रयोग संवाद दिखाएँ" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "मुख्य मेनू दिखाएँ" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "स्क्रीनशॉट का चित्र लें" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "विंडो का स्क्रीनशॉट लें" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "विंडो स्क्रीनशॉट कमांड लाइन" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "किसी को लोग न करें" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini समतल फाइल बैकेंड" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "फाइल बदलाव अधिसूचना प्लगिन" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "किसी को लोग न करें" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig नियंत्रण बैकेंड" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "छाया प्रतिरोध" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "छाया प्रतिरोध" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "विंडो बदलें जब वे न्यूनतम और अधिकतम किए जाते हैं" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "विंडोज़ जो न्यूनतम करने पर रूपांतरित किए जाने चाहिए" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "रखता है" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y कोआर्डिनेट को कार्यस्थान क्षेत्र में सीमित करें" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "विंडो के सर्वर साइड स्थिति को अद्यतन मत करें जबतक कि खिसकाना समाप्त न हो" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "windows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "windows" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "windows" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "windows" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "windows" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "खीचने पर स्नैपऑफ और स्वतः गैर अधिकतम अधिकतम विंडो" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "ब्रिज" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ब्रिज" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ब्रिज" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ब्रिज" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "अपारदर्शिता घटायें" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "अपारदर्शिता बढायें" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "अपारदर्शिता बदलाव चरण" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "अपारदर्शिता बदलाव चरण" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "अपारदर्शिता चरण" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "घुमाव के दौरान अपारदर्शिता" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "अवधि" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "अवधि" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "अवधि" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "अवधि" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind विकल्प" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "windows" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "विंडोज़ जिसे मूलभूत रूप से स्थिति पर रखा जाना चाहिए" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "विंडोज़ जिसे मूलभूत रूप से पारभासी होना चाहिए" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "विंडोज़ जिसे मूलभूत रूप से स्थिति पर रखा जाना चाहिए" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "विंडो स्थापन के लिए प्रयोग के लिए अलगोरिथम" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "प्रपाती" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "केंद्रित" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "विन्डो मैनेजर" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "फोकस बचाव विंडोज़" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "विरचयुल उपकरण" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "मैप किए जाने पर उचित स्थिति पर विंडो रखें" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "नियोजन प्रकार" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "windows" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "क्रमहीन" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "चुनें कि कहां विंडो को स्केल किया जाता है यदि बहुल आउटपुट डिवायस प्रयोग किया जाता है." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "स्मार्ट" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "सभी आउटपुट डिवायस पर" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "विरचयुल उपकरण" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "windows" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind विकल्प" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "विंडोज़ जिसे मूलभूत रूप से स्थिति पर रखा जाना चाहिए" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "विंडोज़ जिसे मूलभूत रूप से विशेष व्यूपोर्ट में रखा जाना चाहिए" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind विकल्प" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "वर्कग्रुप " #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "windows" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "विरचयुल उपकरण" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X स्थिति मान" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "windows" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "विरचयुल उपकरण" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y स्थिति मान" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png चित्र लोडर" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "रिजेक्स मिलान" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "रिजेक्स विंडो मिलान" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "रंग" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "खाके व आयताकार पुनः आकार मोड के लिए किनारा रंग" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "मूलभूत आकार बदलाव प्रकार" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "विंडो पुनः आकार के लिए प्रयुक्त मूलभूत विधि" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "रंग" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "आयताकार पुनः आकार मोड के लिए प्रयुक्त रंग" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "भारत" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "रंग" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "आयत" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "windows" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "windows" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "विस्तार" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "windows" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "विंडोज़ जो सामान्य आकार बदलाव के लिए प्रयोग किया जाना चाहिए" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "विंडोज़ जो खाका आकार बदलाव के लिए प्रयोग किया जाना चाहिए" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "विंडोज़ जो आयत आकार बदलाव के लिए प्रयोग किया जाना चाहिए" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "विंडोज़ जो विस्तार आकार बदलाव के लिए प्रयोग किया जाना चाहिए" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "किनारा झटका DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "किनारा झटका हटाएं" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "किनारा झटका सूचक" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "असली समय " #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "बायें व्यूपोर्ट में जाएं और संकेतक लपेटें" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "अगला व्यूपोर्ट में झटकें जब स्क्रीन किनारा में वस्तु खींच रहा है" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "अगला व्यूपोर्ट में झटकें जब संकेतक को स्क्रीन किनारा में खिसका रहा है" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "अगला व्यूपोर्ट में झटकें जब स्क्रीन किनारा में विंडो खिसका रहा है" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "दायाँ व्यूपोर्ट में झटकें और संकेतक लपेटें" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "संकेतक गति के लिए Y अक्ष उलटें" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "प्रिंटर का विवरण" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "प्रिंटर विवरण" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "घुमाव पर उठाएं" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "विंडो को घुमाने के दौरान उठाएं" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "झटका बायाँ घुमाएँ" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "घुमाएँ झटकें दाहिना" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "रिमोट सबनेट:" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "windows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D " #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "टाइम" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "टाइम" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "टाइम" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "संकेतक गति की संवेदनशीलता" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ऊपरी मुखरे में घन घुमाव स्नैप करें" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ऊपरी मुखरे में घन घुमाव स्नैप करें" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ऊपरी मुखरे में स्नैप लें" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ऊपरी मुखरे में स्नैप लें" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "इंसटालेशन शुरु करें" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "व्यूपोर्ट झटकने के पहले समय समाप्ति" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ज़ूम" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "प्रतिशत में अपारदर्शिता की मात्रा" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "बड़ा" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "डेस्कटॉप दिखाने के लिए डेस्कटॉप क्लिक करें" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "पृष्ठभूमि" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "विंडो मापन के दौरान पृष्ठभूमि गहरा करें" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "प्रतीक" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "डेस्कटॉप प्रदर्शन मोड दाखिल करें जब डेस्कटॉप मापक के दौरान क्लिक किया जाता है" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "समय आगे पीछे करें" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "windows" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "सभी विंडोज़ के लिए विंडो चयनक आरंभ करें" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "विंडो समूह के लिए विंडो चयनक आरंभ करें" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "मौज़ूदा आउटपुट पर विंडो के लिए विंडो चयनक आरंभ करें" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "अभिन्यास और सभी विंडोज को बदलना आरंभ करें" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "अभिन्यास और विंडो समूह को रूपांतरित करना आरंभ करें" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "अभिन्यास और विंडोज को बदलना आरंभ करें" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "अभिन्यास और मौजूदा आउटपुट पर विंडोज बदलना आरंभ करें" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "सभी आउटपुट डिवायस पर" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "मौजूदा आउटपुट डिवायस पर" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "प्रतीक ढ़कें" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "विंडो पर प्रतीक को ढ़कें जब वे स्केल किये जाते हैं" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "स्कैनर" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "लोकल टाइम" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "लोकल टाइम" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "चुनें कि कहां विंडो को स्केल किया जाता है यदि बहुल आउटपुट डिवायस प्रयोग किया जाता है." #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "स्पेन" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "विंडो पर आच्छादित होने पर स्केल मोड के खत्म होने के पहले समय (ms में)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "विंडो जिसे स्केल मोड में स्केल किया जाना चाहिए" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "इस अनुप्रयोग में स्वतः स्क्रीनशॉट खोलें" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "निर्देशिका" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "भारत" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "अनुप्रयोग लांच करें" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "इस निर्देशिका में स्क्रीनशॉट चित्र रखें" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg चित्र लोडर" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "प्रतिशत में चमकीलापन की मात्रा" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "प्रतिशत में संतृप्ति की मात्रा" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "कम्प्यूटर प्रोग्राम आडिट रिपोर्ट" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "स्वचालित" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "बूट के दौरान" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "चयनित विंडो को सामने लायें" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "दूरी डेस्कटॉप को जूम आउट किया जाना चाहिए जब विंडो में स्विच कर रहे हों" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "आइकंश्श" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "डेसक्टाप" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "पॉप अप स्विचर यदि दृष्टिगोच़र नहीं है और अगला विंडो चुनें" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "पॉप अप स्विचर यदि दृष्टिगोच़र नहीं है और अगला विंडो सभी विंडो में से चुनें" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "पॉप अप स्विचर यदि दृष्टिगोच़र नहीं है और पिछला विंडो चुनें" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "पॉप अप स्विचर यदि दृष्टिगोच़र नहीं है और पिछला विंडो सभी विंडो में से चुनें" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "पीछे का" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "स्विचिंग के दौरान चयनित विंडो में घुमाएं" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "पॉपअप विंडो को बिना दिखाए अगले विंडो को चुनें." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "डेइमण शुरू कर रहा हैं।" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "पॉपअप विंडो को बिना दिखाए पिछले विंडो को चुनें." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "थंबनेल के बगल के प्रतीक को दिखाएं" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "लोकल टाइम" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "लोकल टाइम" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "विंडोज जिसे स्विचर में दिखाया जाना चाहिए" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 रंगस्पेस समर्थन दें" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "वीडियो प्लेबैक" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "वीडियो प्लेबैक" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 रंगस्पेस" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "पंक्ति जोड़ें" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "बिंदु जोड़ें" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "विभिन्न डेस्कटॉप क्रिया में जल प्रभाव जोड़ें" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "हर वर्षा बूंद के बीच विलंब (ms में)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "संकेतक जल चिह्न सक्रिय करें" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "रेखा" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ऑफसेट मापक" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "बिन्दु" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "डिले" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "शीर्षक तरंग" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "टोकन रिंग" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "जल प्रभाव" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "जल ऑफसेट स्केल" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "विंडो शीर्षक से लहर प्रभाव" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "प्रभाव फोकस करें" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "क्रिया" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "रिजोल्यूशन" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "उलट विंडो स्नैपिंग" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "निम्नतम &GID" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "निम्नतम &GID" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "भुरभुरा" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "स्नैप उलटें" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "क्रिया" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "स्टेपिगं" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "स्टेपिगं" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "वूबली विंडो प्रभाव के लिए स्प्रिंग मॉडल का प्रयोग करें" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "सेर्वर सार" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "विंडोज़ जिसे बूबल करना चाहिए जब फोकस हो" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "विंडोज़ जिसे बूबल करना चाहिए जब पकड़ा जाए" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "विंडोज़ जिसे मैप करने वक्त बूबल करना चाहिए" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "विंडोज़ जिसे खिसकाने वक्त बूबल करना चाहिए" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "विंडो को अधिकतम व न्यूनतम करने के दौरान बूबल प्रभाव" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Run command 0" #~ msgstr "कमान्ड '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "कमाडं लैन पार्स करने पर्ड खराबी आ गया।" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "फिल्टर:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "जूम इन करने के दौरान रैखिक फिल्टर का प्रयोग करें" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "डेसक्टाप" #~ msgid "Zoom In" #~ msgstr "ज़ूम इन" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "छोडं दिया \n" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "टाइम" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ज़ूम और पैन डेस्कटॉप घन" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "छोडं दिया \n" #~ msgid "Decrease window opacity" #~ msgstr "विंडो अपारदर्शिता घटायें" #~ msgid "Increase window opacity" #~ msgstr "विंडो अपारदर्शिता बढायें" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "विंडो के अपारदर्शिता मानजो कि मूलभूत रूप से पारभासी होना चाहिए" #~ msgid "Opacity window values" #~ msgstr "अपारदर्शिता विंडो मान" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "windows" #~ msgid "Background Images" #~ msgstr "पृष्ठभूमि चित्र" #~ msgid "Background images" #~ msgstr "पृष्ठभूमि चित्र" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "windows" #, fuzzy #~ msgid "Plane Left" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane Right" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane Up" #~ msgstr "windows" #, fuzzy #~ msgid "Plane down" #~ msgstr "windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane right" #~ msgstr "रिमोट सबनेट:" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Plane up" #~ msgstr "windows" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "डेस्कटॉप विंडो अपारदर्शिता धुंधला समय." #, fuzzy #~ msgid "Dialog" #~ msgstr "टोण डायलिन्क (&T)" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "विन्डो मैनेजर" #, fuzzy #~ msgid "Notification" #~ msgstr "क्रिया" #~ msgid "Unknown" #~ msgstr "अनंजान" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "अवधि" #, fuzzy #~ msgid "Do not modify" #~ msgstr "किसी को लोग न करें" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "त्रिज्या" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "निम्नतम &GID" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "लोकल टाइम" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "क्रिया" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "स्टेपिगं" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "फिल्टर सैट करें" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "सेर्वर सार" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "छोडं दिया \n" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "टाइम" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "डेसक्टाप" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Command line %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Run command %d" #~ msgstr "कमांड:" #, fuzzy #~ msgid "Move Window Types" #~ msgstr "संभरक" #, fuzzy #~ msgid "Corners" #~ msgstr "कोर्निश" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "फ्लोपी डिस्क" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "डेइमण शुरू कर रहा हैं।" #, fuzzy #~ msgid "Terminate" #~ msgstr "टर्मिनल" ./po/da.po0000644000004100000410000030477713246301623012627 0ustar www-datawww-data# Danish message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # H. Merethe Eriksen , 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-03-29 20:35+0200\n" "Last-Translator: Marcus Møller \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Skrivebord" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Vinduesmenu" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ingen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Skygge" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Maksimer" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maksimer Vandret" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maksimer Lodret" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimer" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Hæv" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Sink" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Vinduesmenu" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Blue type" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Formindsk vinduets uigennemsigtighed" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Maksimer det aktive vindue i bredden" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity tema gennemsigtighed" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity tema gennemsigtigheds skygge" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Brug Metacity tema" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Luk vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Gendan vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimer vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimer vindue" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Start" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Kubusfarve" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktive plugins" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Tegn" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Tegn med værktøj" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Start" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Start" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Lineært filter" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Teksturfilter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Farvemætning" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Farvemætning" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Foldehastighed" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Placer vinduer" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Farvemætning" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:12 #, fuzzy msgid "Blur windows that doesn't have focus" msgstr "Vinduestyper, der skal \"slingre\", når de får fokus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Skaler vinduer" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr "Fokuseffekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Fadehastighed for vindue" #: ../metadata/blur.xml.in.h:30 #, fuzzy msgid "Windows that should be affected by focus blur" msgstr "Vinduestyper, der skal fades" #: ../metadata/blur.xml.in.h:31 #, fuzzy msgid "Windows that should be use alpha blur by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Udgange" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Tag et skærmbillede" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:13 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:14 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:15 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:16 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:17 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:18 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:19 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:20 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:21 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:22 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:23 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:24 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" "kommandoen identificeres af kommando%d" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:51 #, fuzzy msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:52 #, fuzzy msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:53 #, fuzzy msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:54 #, fuzzy msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:55 #, fuzzy msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:56 #, fuzzy msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:57 #, fuzzy msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:58 #, fuzzy msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:59 #, fuzzy msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:60 #, fuzzy msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:61 #, fuzzy msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:62 #, fuzzy msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Kommandolinje, der skal køres i Shell, når kør_kommando%d aktiveres" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Kommando '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Kommando: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Kommando: " # #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktive plugins" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Tillad trækning af fuldskærmsvinduer, uden at der omdirrigeres til pixmaps " "uden for skærmbilledet" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hørbar klokke" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hørbar systemtone" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatisk hævning" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Forsinkelse ved automatisk hævning" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatisk registrering af udgangsenheder" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatisk registrering af opdateringshastighed" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Bedste" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klik for at fokusere" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Fokus flyttes til vinduet, når der klikkes på det." #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Luk det aktive vindue" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standardbillede til vinduesikon" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Skrivebordskubus" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Registrer udgange" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Registrer opdateringshastighed" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Hurtig" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Generelle muligheder" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generelle compiz muligheder" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "God" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skjul vinduer, der ikke er på opgavelinjen" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skjul alle vinduer, og flyt fokus til skrivebord" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "Skjul vinduer, der ikke er på opgavelinjen, når skrivebordet vises" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vandret virtuel størrelse" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorer vink, når maksimeret" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignorer vink om størrelsesforøgning og -aspekter, når vinduet er maksimeret" #: ../metadata/core.xml.in.in.h:39 #, fuzzy msgid "Interval before raising selected windows" msgstr "Interval inden de valgte vinduer hæves" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval mellem ping beskeder" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Belysning" # #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste over aktive plugins" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste over strenge, der beskriver udgangsenheder" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" # #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Sænk vindue" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Placer vinduet under de andre vinduer" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksimer vindue vandret" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksimer vindue lodret" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksimer det aktive vindue" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksimer det aktive vindue i bredden" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksimer det aktive vindue i højden" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimer det aktive vindue" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Antal skriveborde" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Antal virtuelle skriveborde" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Udfør kun skærmopdatering i den lodrette slukkeperiode" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Udgange" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Regnforsinkelse" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Hæv ved klik" # #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Hæv vindue" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Hæv de valgte vinduer efter interval" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Hæv vinduet over de andre vinduer" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Hæv vinduerne, når der klikkes" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Opdateringshastighed" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "Skærmstørrelsesmultiplikator til den vandrette virtuelle størrelse" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Skærmstørrelsesmultiplikator til den lodrette virtuelle størrelse" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Zoom på skrivebord" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Langsomme animationer" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkroniser med lodret slukning" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:83 #, fuzzy msgid "The rate at which the screen is redrawn (times/second)" msgstr "" "Den hastighed, der anvendes til at tegne skærmbilledet igen (antal gange/" "sekund)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Slå maksimering af vindue til/fra" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Slå vandret maksimering af vindue til/fra" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Slå lodret maksimering af vindue til/fra" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Slå medtoning af vindue til/fra" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Slå maksimering af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Slå den vandrette maksimering af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Slå lodret maksimering af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Slå nedtoning af det aktive vindue til/fra" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Slå brugen af langsomme animationer til/fra" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Ophæv maksimeringen af det aktive vindue" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Omdiriger ikke fuldskærmsvinduer" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Brug spredt lys, når skærmbilledet omdannes" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Lodret virtuel størrelse" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Acceleration" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Gå til næste dias" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animer himmelkuppel" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animer himmelkuplen, når kubussen roteres" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automatisk hævning" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farve til kubussens top og bund" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Farve til det nederste farvestop i himmelkuplens aftagende farveforløb" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Farve til det øverste farvestop i himmelkuplens aftagende farveforløb" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubusfarve" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubusfarve" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Skrivebordskubus" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Foldeaccelaration" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Foldehastighed" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Tidstrin for foldning" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Generer mipmaps, når det er muligt, for at opnå en højere kvalitetsskalering" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Gå tilbage til forrige dias" # #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Billedfiler" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Billede, der skal bruges som tekstur til himmelkuplen" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Kubus indvendig" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Kubus indvendig" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Liste over PNG- og SVG-filer, der skal gengives på toppen af kubussen" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" # #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Næste dias" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Kubus indvendig" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Placer vinduer på kubus" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Forrige dias" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Vis himmelkuppel" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Tilpas billede" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Tilpas billederne, så de dækker toppen af kubussen" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Himmelkuppel" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Slutfarve til himmelkuplens farvegraduering" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Startfarve til himmelkuplens farvegraduering" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Billede til himmelkuppel" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hastighed" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tidstrin" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Fold ud" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Fold kubussen ud" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 #, fuzzy msgid "Allow mipmaps to be generated for decoration textures" msgstr "Tillad mipmaps at blive skabt til dekorations texturer" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Skaler vinduer" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Dekoratørkommandolinje, som udføres, hvis der ikke allerede kører en " "dekoratør" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Slagskyggeforskydning X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Slagskyggeforskydning Y" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Slagskyggeradius" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Slagskyggens uigennemsigtighed" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Slagskyggeradius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Fastgør vinduer" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Skyggeforskydning X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Skyggeforskydning Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Skyggens uigennemsigtighed" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Skyggeradius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Fastgør vinduer" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Vinduesdekoration" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Vinduesdekorationer" #: ../metadata/decoration.xml.in.h:19 #, fuzzy msgid "Windows that should be decorated" msgstr "Vinduestyper, der skal fades" #: ../metadata/decoration.xml.in.h:20 #, fuzzy msgid "Windows that should have a shadow" msgstr "Vinduestyper, der skal fades" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotationshastighed" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Begræns Y" # #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Vendingstid" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Fadehastighed" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Vendingstid" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Fadeeffekt ved systemtone" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Vinduerne tones ind, når de tilknyttes, og tones ud, når tilknytningen " "ophæves." #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Skaler vinduer" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Fading af vinduer" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuel klokke i fuld skærm" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Fadeeffekt i fuld skærm ved systemtone" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuel klokke" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Fadehastighed for vindue" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 #, fuzzy msgid "Windows that should be fading" msgstr "Vinduestyper, der skal fades" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Punkt" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Tilføj punkt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Dialogboksen Kør" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandolinje til skærmbillede" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandolinje til skærmbillede" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Vis hovedmenu" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Vis dialogboksen til kørsel af program" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Vis hovedmenuen" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Tag et skærmbillede" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Tag et skærmbillede af et vindue" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Kommandolinje til skærmbillede" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandolinje til vindueskærmbillede" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Må ikke ændres" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Må ikke ændres" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimer effekt" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Minimer vinduer" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Sænk hastighed" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Minimer tidstrin" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Skyggemodstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Skyggemodstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Vinduer skal ændres, når de minimeres og gendannes" #: ../metadata/minimize.xml.in.h:10 #, fuzzy msgid "Windows that should be transformed when minimized" msgstr "Vinduestyper, der skal ændres, når de minimeres" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Begræns Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Begræns Y-koordinaten til arbejdsområdet" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Start vinduesflytning" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Vis minimerede vinduer" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Flyt vindue" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Flyt vindue" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Uigennemsigtighed" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Frigør og gendan automatisk maksimerede vinduer, når de trækkes" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Frigør maksimerede vinduer" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Start flytning af vindue" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Lysstyrke" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Formindsk uigennemsigtighed" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Forøg uigennemsigtighed" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Trin i den trinvise ændring af uigennemsigtigheden" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Trin i den trinvise ændring af uigennemsigtigheden" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Uigennemsigtighedstrin" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Farvemætning" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Vinduesdekorationer" # #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Vinduestyper" # #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Vinduestyper til tilknytningseffekt" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Vinduesmenu" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Placer vinduer" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Placer vinduerne på de korrekte positioner, når de er tilknyttet" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "På alle udgangs enheder" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Løsninger til vinduesplaceringer" #: ../metadata/place.xml.in.h:25 #, fuzzy msgid "Windows that should be positioned by default" msgstr "Vinduestyper, der skal fades" #: ../metadata/place.xml.in.h:26 #, fuzzy msgid "Windows that should be positioned in specific viewports by default" msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Vinduesdekorationer" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Løsninger" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Vis minimerede vinduer" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Vandret virtuel størrelse" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 #, fuzzy msgid "Regex Matching" msgstr "Slå fastgøring af vinduer til/fra" #: ../metadata/regex.xml.in.h:2 #, fuzzy msgid "Regex window matching" msgstr "Slå fastgøring af vinduer til/fra" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Kubusfarve" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Kubusfarve" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Start tilpasning af vinduets størrelse" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Start tilpasning af vinduets størrelse" # #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Kubusfarve" # #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" # #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Tilpas vinduets størrelse" # #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Tilpas vinduets størrelse" # #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Tilpas størrelsen på vinduet" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Start tilpasning af vinduesstørrelsen" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" # #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Tilpas vinduets størrelse" #: ../metadata/resize.xml.in.h:28 #, fuzzy msgid "Windows that normal resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/resize.xml.in.h:29 #, fuzzy msgid "Windows that outline resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/resize.xml.in.h:30 #, fuzzy msgid "Windows that rectangle resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/resize.xml.in.h:31 #, fuzzy msgid "Windows that stretch resize should be used for" msgstr "Vinduestyper, der skal fades" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Træk-og-slip til kant, vend" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Flyt til kant, vend" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Markør til kant, vend" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Vendingstid" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" "Vend til venstre visningsområde, og bevar markøren på dens nuværende " "relative placering på skærmen" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Vend til næste visningsområde, når et objekt trækkes til skærmens kant" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Vend til næste visningsområde, når markøren flyttes til skærmens kant" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Vend til næste visningsområde, når vinduet flyttes til skærmens kant" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" "Vend til højre visningsområde, og bevar markøren på dens nuværende relative " "placering på skærmen" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Vend Y-aksen for markørbevægelser" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Omvendt Y-akse for markør" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Markørfølsomhed" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Hæv vinduerne, når der klikkes" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Roter kubus" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Roter og vend til venstre" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Roter og vend til højre" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Roter venstre" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Roter til venstre med vindue" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Roter højre" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Roter til højre med vindue" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Roter til" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Roter kubus" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Roter skrivebordskubus" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Roter til venstre" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Roter til venstre, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Roter til højre" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Roter til højre, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Roter til side %d med vindue" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Roter til side %d" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Roter til side %d, og lad det aktive vindue følge med" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Roter til visningsområde" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Roter vindue" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Roter med vindue" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Rotationsacceleration" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotationshastighed" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Tidstrin for rotation" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Rotations Zoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Det følsomhedsniveau, der skal anvendes til markørbevægelserne" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Fastgør kubusrotation til oversiden" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fastgør kubusrotation til oversiden" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Fastgør til oversiden" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fastgør til oversiden" # #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Start rotation" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Den tid, der går, inden visningsområdet skifter" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Uigennemsigtighed i procent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Stor" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Gør baggrund mørkere" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Gør baggrunden mørkere, når vinduerne skaleres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblem" #: ../metadata/scale.xml.in.h:12 #, fuzzy msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Start Vis Skrivebord hvis der klikkes på skrivebordet når Skaler køres" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Markørens pegetid" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Start vinduesvælger" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Start vinduesvælger for alle vinduer" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Start vinduesvælger for vinduesgruppe" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Start vinduesvælgeren for vinduer i det aktuelle outputområde" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Arranger og start omdannelsen af alle vinduerne" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Arranger og start omdannelsen af vinduesgruppen" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Arranger og start omdannelsen af vinduerne" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Arranger og start omdannelsen af vinduer i det aktuelle outputområde" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "På alle udgangs enheder" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "På nuværende udgangs enhed" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Overlejringsikon" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Sæt et ikon på vinduerne, når de er skaleret" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skaler" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaleringshastighed" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Tidstrin for skalering" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mellemrum mellem vinduer" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mellemrum" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Den tid (i ms), der går, inden skaleringstilstanden afsluttes, når markøren " "peger på et vindue" #: ../metadata/scale.xml.in.h:42 #, fuzzy msgid "Windows that should be scaled in scale mode" msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Bibliotek" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Tag et skærmbillede" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Vis dialogboksen til kørsel af program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Tag et skærmbillede" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Kommandolinje til skærmbillede" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Lysstyrken angivet i procent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Farvemætningen angivet i procent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Programskifter" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Automatisk hævning" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Placer forrest" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Placer det valgte vindue forrest" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Fjernskrivebord zoomes ud, når der skiftes til et andet vindue" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimeret" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Skrivebordskubus" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Næste vindue" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Næste vindue" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Næste vindue" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue blandt " "alle vinduer" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue blandt " "alle vinduer" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Forrige dias" # #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Forrige vindue" # #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Forrige vindue" # #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Forrige vindue" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Vælg næste vindue" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Vælg forrige vindue" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Vis ikon ud for miniaturebillede" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Vis minimerede vinduer" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Hastighed for programskifter" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Tidstrin for programskifter" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Skaler vinduer" #: ../metadata/switcher.xml.in.h:41 #, fuzzy msgid "Windows that should be shown in switcher" msgstr "Vinduestyper, der skal vises i programskifteren" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Tilføj linje" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Tilføj punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Tilføjer vandeffekter til forskellige skrivebordshandlinger" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Forsinkelse (i ms) mellem hver regndråbe" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Aktiver markørvandeffekter" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Line" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Forskydningsstørrelse" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Regnforsinkelse" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Titelbølge" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Regn til/fra" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Slå regneffekten til/fra" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Visker til/fra" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Slå viskereffekten til/fra" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vandeffekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Størrelse på vandforskydning" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Bølgeeffekt til vinduestitel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fokuseffekt" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Effekt ved fokus på vinduer" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Vinduestyper til fokuseffekt" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friktion" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Vinduestyper til gribeeffekt" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Gitteropløsning" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Omvendt fastgøring af vinduer" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Lad vinduer dirre" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Tilknytningseffekt" # #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Effekt ved tilknytning af vinduer" # #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Vinduestyper til tilknytningseffekt" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maksimeringseffekt" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Mindste gitterstørrelse" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Knudernes minimumstørrelse i gitteret" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Flyt vindue" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Rysten" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Omvendt fastgøring" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Fastgør vinduer" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fjerderfriktion" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Fjeder-K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Fjederkonstant" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Slå fastgøring af vinduer til/fra" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Brug fjedermodel til \"slingrende\" vinduer" # #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Opløsning for knuder i gitteret" #: ../metadata/wobbly.xml.in.h:26 #, fuzzy msgid "Windows that should wobble when focused" msgstr "Vinduestyper, der skal \"slingre\", når de får fokus" #: ../metadata/wobbly.xml.in.h:27 #, fuzzy msgid "Windows that should wobble when grabbed" msgstr "" "Vinduestyper, der skal \"slingre\", når der tages fat i dem med markøren" #: ../metadata/wobbly.xml.in.h:28 #, fuzzy msgid "Windows that should wobble when mapped" msgstr "Vinduestyper, der skal \"slingre\", når de tilknyttes" #: ../metadata/wobbly.xml.in.h:29 #, fuzzy msgid "Windows that should wobble when moved" msgstr "Vinduestyper, der skal \"slingre\", når de flyttes" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Vinduerne \"slingrer\", når de maksimeres eller gendannes" # #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "\"Slingrende\" vinduer" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Kommando: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "Kommando '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandolinje til skærmbillede" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandolinje til skærmbillede" #~ msgid "Filter Linear" #~ msgstr "Lineært filter" #, fuzzy #~ msgid "Use linear filter when zoomed in" #~ msgstr "Brug lineært filter, når der er zoomet ind" #~ msgid "Zoom Desktop" #~ msgstr "Zoom på skrivebord" #~ msgid "Zoom In" #~ msgstr "Zoom ind" #~ msgid "Zoom Out" #~ msgstr "Zoom ud" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Zoom ind" #~ msgid "Zoom Speed" #~ msgstr "Zoomhastighed" #~ msgid "Zoom Timestep" #~ msgstr "Tidstrin for zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom og panorer på skrivebordskubus" #~ msgid "Zoom factor" #~ msgstr "Zoomfaktor" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Zoom ind" #~ msgid "Decrease window opacity" #~ msgstr "Formindsk vinduets uigennemsigtighed" #~ msgid "Increase window opacity" #~ msgstr "Forøg vinduets uigennemsigtighed" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "Mellemrum mellem vinduer" #~ msgid "Background Images" #~ msgstr "Baggrunds Billeder" #~ msgid "Background images" #~ msgstr "Baggrunds billeder" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Placer vinduer på kubus" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Placer vinduer" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Roter venstre" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Roter højre" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Placer vinduer" #, fuzzy #~ msgid "Plane down" #~ msgstr "Placer vinduer" #, fuzzy #~ msgid "Plane left" #~ msgstr "Roter til venstre" #, fuzzy #~ msgid "Plane right" #~ msgstr "Roter til højre" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane up" #~ msgstr "Placer vinduer" #~ msgid "Open window menu" #~ msgstr "Åbn vinduesmenuen" #~ msgid "Dock" #~ msgstr "Dok" #~ msgid "Toolbar" #~ msgstr "Værktøjslinje" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Utility" #~ msgstr "Værktøj" #~ msgid "Splash" #~ msgstr "Splash" #~ msgid "Dialog" #~ msgstr "Dialogboks" #~ msgid "DropdownMenu" #~ msgstr "Rullemenu" #~ msgid "PopupMenu" #~ msgstr "Pop op-menu" #~ msgid "Tooltip" #~ msgstr "Værktøjstip" #~ msgid "Notification" #~ msgstr "Besked" #~ msgid "Combo" #~ msgstr "Kombination" #~ msgid "Dnd" #~ msgstr "Træk-og-slip" #~ msgid "ModalDialog" #~ msgstr "Modaldialogboks" #~ msgid "Fullscreen" #~ msgstr "Fuldskærm" #~ msgid "Unknown" #~ msgstr "Ukendt" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "En tastaturgenvej, der kører Shell-kommandoen, når den aktiveres. Shell-" #~ "kommandoen identificeres af kommando%d" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Lysstyrken angivet i procent" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Uigennemsigtighed i procent" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Farvemætningen angivet i procent" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Farvemætning" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Forsinkelse (i ms) mellem hver regndråbe" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "Fjernskrivebord zoomes ud, når der skiftes til et andet vindue" #~ msgid "Do not modify" #~ msgstr "Må ikke ændres" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Slagskyggeforskydning X" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Slagskyggeforskydning Y" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Slagskyggens uigennemsigtighed" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Slagskyggeradius" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Effekt ved fokus på vinduer" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Vælg forrige vindue" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Foldeaccelaration" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Foldehastighed" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Tidstrin for foldning" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Interval inden de valgte vinduer hæves" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Arranger og start omdannelsen af vinduer i det aktuelle outputområde" # #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Effekt ved tilknytning af vinduer" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Sænk hastighed" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Minimer tidstrin" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Knudernes minimumstørrelse i gitteret" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Antal virtuelle skriveborde" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Trin i den trinvise ændring af uigennemsigtigheden" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Uigennemsigtighedsniveau ved flytning af vinduer" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Sæt et ikon på vinduerne, når de er skaleret" #~ msgid "Plugins that this must load before" #~ msgstr "Plugins, som skal indlæses først" #~ msgid "Plugins that this requires" #~ msgstr "Obligatoriske plugins" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue blandt " #~ "alle vinduer" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg næste vindue blandt " #~ "alle vinduer" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue " #~ "blandt alle vinduer" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Vis opgaveskifteren, hvis den ikke er synlig, og vælg forrige vindue " #~ "blandt alle vinduer" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Rotationsacceleration" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Rotationshastighed" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Tidstrin for rotation" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Skaleringshastighed" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Tidstrin for skalering" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Skærmstørrelsesmultiplikator til den vandrette virtuelle størrelse" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Skærmstørrelsesmultiplikator til den lodrette virtuelle størrelse" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Det følsomhedsniveau, der skal anvendes til markørbevægelserne" #, fuzzy #~ msgid "Shade resistance (0-100)" #~ msgstr "Skyggemodstand" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Mellemrum mellem vinduer" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Fjerderfriktion" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Fjederkonstant" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Hastighed for programskifter" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Tidstrin for programskifter" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Teksturfiltrering" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "" #~ "Den hastighed, der anvendes til at tegne skærmbilledet igen (antal gange/" #~ "sekund)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Den tid (i ms), der går, inden skaleringstilstanden afsluttes, når " #~ "markøren peger på et vindue" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Den tid, der går, inden visningsområdet skifter" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Brug lineært filter, når der er zoomet ind" # #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Opløsning for knuder i gitteret" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Størrelse på vandforskydning" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Fadehastighed for vindue" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Fadehastighed for vindue" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Vinduestyper, der skal skaleres i skaleringstilstand" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Vinduestyper, der skal vises i programskifteren" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Vinduestyper, der skal ændres, når de minimeres" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Vinduestyper, der skal fades" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Vinduestyper, der skal \"slingre\", når de får fokus" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "" #~ "Vinduestyper, der skal \"slingre\", når der tages fat i dem med markøren" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Vinduestyper, der skal \"slingre\", når de tilknyttes" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Vinduestyper, der skal \"slingre\", når de flyttes" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Zoomhastighed" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Tidstrin for zoom" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Zoomfaktor" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Roter til side %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Roter til side %d med vindue" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Roter til side %d, og lad det aktive vindue følge med" #~ msgid "Rotate To Face %d" #~ msgstr "Roter til side %d" #~ msgid "Rotate to face %d" #~ msgstr "Roter til side %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Roter til side %d med vindue" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Roter til side %d, og lad det aktive vindue følge med" #~ msgid "Command line %d" #~ msgstr "Kommandolinje %d" #~ msgid "Run command %d" #~ msgstr "Kør kommando %d" # #~ msgid "Move Window Types" #~ msgstr "Vinduestyper til flytteeffekt" #, fuzzy #~ msgid "Corners" #~ msgstr "Cornish" # #, fuzzy #~ msgid "Show switcher" #~ msgstr "Vis æ&ndringer" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Diskette" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Starter dæmon." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminaler" ./po/pt_BR.po0000644000004100000410000025541513246301623013243 0ustar www-datawww-data# translation of compiz.po to Brazilian Portuguese # Compiz Core Brazilian Portuguese Translation. # Copyright (C) 2007 2007 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the compiz package. # # Novell Language , 2006,2007. # Joel Calado , 2007. # Nicolau Gonçalves , 2007. # Emerson Ribeiro de Mello , 2007. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-10-30 23:13+0100\n" "Last-Translator: Raylton P. Sousa \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Ambiente de trabalho" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gerenciamento de janelas" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nenhum" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Dimensionar" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizar" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximizar Janela Horizontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximizar Janela Verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimizado" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Elevação Automática" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Menu da Janela" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Ação a ser tomada ao girar a roda do mouse sobre a barra de título da janela." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo de desfocagem" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacidade da janela ativa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Opacidade da sombra da janela ativa no tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacidade do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Opacidade da sombra do tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacidade a ser usada para janelas ativas com decorações metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacidade a ser usada para decorações metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Sombrear decoração de janelas ativas com temas metacity de opaco para " "transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Sombrear decoração de janelas com temas metacity de opaco para transparente" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Ação da roda do mouse no título da janela" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo de desfocagem usado para as decorações" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usar tema metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usar tema metacity ao desenhar as decorações das janelas" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Fechar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Desmaximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimizar Janela" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Fazer Acima" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Colar" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Desfazer sombreamento" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Desfazer acima" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Descolar" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "A janela \"% s\" não está respondendo." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forçar o fechamento deste aplicativo fará com que você perca todas as " "alterações não salvas " #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Forçar Saida" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotar" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Cor de preenchimento das anotações" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Cor do pincel das anotações" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Plugin de Anotações" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Limpar" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Desenhar" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Desenhar usando uma ferramenta" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Cor de preenchimento para anotações" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciar" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Iniciar desenho de anotação" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Iniciar apagador de anotação" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Iniciar apagador" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Espessura da linha" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Espessura da linha para anotações" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Cor do pincel para anotações" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Largura do pincel" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Largura do pincel para anotações" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4X Bilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Desfocagem Alfa" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Desfocagem alfa das janelas" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro de desfocagem" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Oclusão da desfocagem" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocidade de desfocagem" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Desfocar por trás de partes transparentes de janelas" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturação da desfocagem" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Desfocar janelas" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Desfocar janelas que não tenham foco" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Desativar desfocagem de regiões da tela obscurecidas por outras janelas." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Método de filtragem usado para desfocar" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Desfocar com base no foco" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Desfocar janelas com base na janela atual" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" # name for RUS #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Força gaussiana" # name for RUS #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Raio gaussiano" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Força gaussiana" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "MipMap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Nível de detalhe mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Efeito de pulso" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocidade de desfocagem das janelas" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Janelas que serão afetadas por desfocagem de foco" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Janelas que devem usar desfocagem alfa por padrão" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clonar saída" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Iniciar seleção de clone" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Gestor de clonagem de saídas" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Uma tecla de atalho que, quando acionado, executa o comando identificado " "pelo comando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Uma tecla de atalho que, quando acionado, executa o comando identificado " "pelo comando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Uma tecla de atalho que, quando acionado, executa o comando identificado " "pelo comando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Uma tecla de atalho que, quando acionada, executa o comando identificado " "pelo comando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Linha de comando 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Linha de comando 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Linha de comando 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Linha de comando 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Linha de comando 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Linha de comando 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Linha de comando 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Linha de comando 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Linha de comando 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Linha de comando 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Linha de comando 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Linha de comando 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Linha de comando a ser executada quando run_command0 for acionado" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Linha de comando a ser executada quando run_command1 for acionado" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Linha de comando a ser executada quando run_command10 for acionado" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Linha de comando a ser executada quando run_command11 for acionado" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Linha de comando a ser executada quando run_command2 for acionado" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Linha de comando a ser executada quando run_command3 for acionado" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Linha de comando a ser executada quando run_command4 for acionado" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Linha de comando a ser executada quando run_command5 for acionado" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Linha de comando a ser executada quando run_command6 for acionado" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Linha de comando a ser executada quando run_command7 for acionado" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Linha de comando a ser executada quando run_command8 for acionado" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Linha de comando a ser executada quando run_command9 for acionado" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Comando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Executar comando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Executar comando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Executar comando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Executar comando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Executar comando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Executar comando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Executar comando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Executar comando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Executar comando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Executar comando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Executar comando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plugins Ativos" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Permitir que o desenho das janelas em tela inteira não seja redirecionado " "para pixmaps fora da tela" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Campainha Audível" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Bip audível do sistema " #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Elevação Automática" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Atraso na Elevação Automática" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Detecção automática de dispositivos de saída" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Detecção automática da taxa de atualização" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Melhor" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Clique para Posicionar o Foco" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "O clique na janela transfere o foco para ela" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Fechar a janela ativa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Ícone Padrão" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Imagem do ícone padrão da janela" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Cubo da Área de Trabalho" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detectar Saídas" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Detectar Taxa de Atualização" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rápido" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Janelas em prevenção de destaque" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Opções Gerais" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Opções gerais do compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Bom" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ocultar Janelas Ignorar Barra de Tarefas" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ocultar todas as janelas e enfocar área de trabalho" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Ocultar as janelas que não estão na barra de tarefas ao entrar no modo " "mostrar área de trabalho" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Tamanho Virtual Horizontal" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorar dicas quando maximizada" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorar incremento de tamanho e aspecto quando a janela é maximizada" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervalo antes da elevação das janelas selecionadas" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervalo entre mensagens ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Iluminação" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Lista de plugins atualmente ativos" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Lista de caracteres descrevendo os dispositivos de saída" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Janela Mais Baixa" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Janela mais baixa sob as demais janelas" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximizar Janela Horizontalmente" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximizar Janela Verticalmente" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximizar janela ativa" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximizar janela ativa horizontalmente" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximizar janela ativa verticalmente" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimizar janela ativa" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Número de áreas de trabalho" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Número de ambientes virtuais" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Apenas efetuar atualizações de tela durante o período de limpeza vertical" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Saídas" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Atraso de ping" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Elevar com um Clique" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Elevar janela" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Elevar janelas selecionadas após intervalo" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Elevar janela acima das restantes" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Elevar janelas quando clicadas" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Taxa de Atualização" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplicador de tamanho horizontal da tela para tamanho virtual" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplicador de tamanho vertical da tela para tamanho virtual" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Mostrar Área de Trabalho" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animações Lentas" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Inteligente" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Sincronizar a VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Filtro de Texturas" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtro de Textura" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtro de Texturas" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Taxa em que a tela é redesenhada (vezes/segundo)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Alternar Janela Maximizada" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Alternar Janela Maximizada Horizontalmente" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Alternar Janela Maximizada Verticalmente" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Alternar Janela Sombreada" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Alternar janela ativa maximizada" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Alternar janela ativa maximizada horizontalmente" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Alternar janela ativa maximizada verticalmente" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Alternar janela ativa sombreada" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Alternar uso de animações lentas" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Desmaximizar janela ativa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Anular redirecionamento de janelas de tela inteira" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Usar luz difusa quando a tela for transformada" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamanho Vertical Virtual" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Botão de atalho para menu da Janela" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Tecla de atalho para menu da Janela" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Aceleração" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Ajustar Imagem" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Ajustar imagem do topo à rotação" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avançar para a próxima lâmina" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animar Skydome" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animar Skydome ao girar o cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automático" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Cor dos lados superior e inferior do cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Cor padrão a ser usada no fundo para o gradiente do skydome" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Cor padrão a ser usada no topo para o gradiente do skydome" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Cor do Cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Cubo da Área de Trabalho" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Aceleração de dobragem" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocidade de dobragem" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Intervalo de tempo de dobragem" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Gerar mapas quando possível para dimensionamento de melhor qualidade" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Voltar à lâmina anterior" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Arquivos de imagem" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Imagem para usar como textura no skydome" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Iniciar transparência do cubo apenas se a rotação for conduzida pelo mouse." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Dentro do Cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Dentro do cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Lista de arquivos PNG e SVG que devem ser renderizados na face superior do " "cubo" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Modo de Multi Saída" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Múltiplos cubos" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Próxima Lâmina" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Grande cubo" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacidade Durante Rotação" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacidade Enquanto Não Roda" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacidade do ambiente de trabalho ao rodar." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacidade do ambiente de trabalho quando estático." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Colocar janelas no cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Lâmina Anterior" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Renderizar skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Dimensionar imagem" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Dimensionar imagens para cobertura da face superior do cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Seleciona como o cubo é desenhado se existirem múltiplos dispositivos de " "saída." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Cor Final do gradiente Skydome" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Cor Inicial do gradiente Skydome" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Imagem do Skydome" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Velocidade" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Intervalo de tempo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Transparência apenas ao rodar com o mouse" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Desdobrar" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Desdobrar cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Programa interno de controle do Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Permitir a geração de mipmaps para texturas da decoração" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Decoração das janelas" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Linha de comando a ser executada se nenhum decorador estiver em execução" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Deslocamento X da sombra" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Deslocamento Y da sombra" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacidade da sombra" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Raio da sombra" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Cor da sombra" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Deslocamento X da Sombra" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Deslocamento Y da Sombra" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacidade da Sombra" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Raio da Sombra" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Janelas com sombra" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Decoração da Janela" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Decorações das janelas" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Janelas que devem ser decoradas" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Janelas que devem ter sombra" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Velocidade da Rotação" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Restringir Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Redimensionamento Normal de Janelas" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Tempo de desvanecimento" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Desvanecer ao Minimizar/Abrir/Fechar" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Velocidade de Esmaecimento" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Tempo de desvanecimento" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efeito de desvanecimento ao eventos de minimizar/abrir/fechar janelas" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efeito de desvanecimento no bip do sistema" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Revitalizar janelas quando houver mapeamento e esmaecê-las quando não houver " "mapeamento" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Desvanecer janelas" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Janelas Desvanecidas" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Campainha Visual de Tela Inteira" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Efeito de desvanecimento de tela inteira ao som de bip do sistema" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Campainha Visual" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Velocidade de desvanecimento das janelas" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Janelas a serem dimensionadas no modo Dimensionar" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Janelas que devem desvanecer" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Ponto de montagem" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Ponto de Montagem" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Sistema de arquivos Userspace" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Sistema de arquivos userspace" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Programa interno de controle do GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Suporte ao loop principal do GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Abrir um terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Caixa de Diálogo Executar" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Linha de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Capturar tela a partir da linha de comando" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostrar Menu Principal" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostrar caixa de diálogo Executar Aplicativo" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostrar o menu principal" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Efetuar uma captura de tela" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Efetuar captura de tela de uma janela" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Linha de comando do terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Linha de comando para captura de tela de janelas" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Programa interno para arquivos ini" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Plugin de notificação de modificação de arquivos" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Programa interno de controle do Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efeito ao Minimizar" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimizar Janelas" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocidade de minimização" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Intervalo de tempo de minimização" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistência de Sombra" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistência ao Sombrear" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformar janelas quando elas forem minimizadas e desminimizadas" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Janelas que devem ser transformadas quando minimizadas" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Restringir Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Restringir a coordenada Y conforme a área de trabalho" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Não atualizar a posição das janelas no lado do servidor até acabar de mover" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciar Movimento de Janelas" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posicionamento preguiçoso" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Mover Janela" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Mover janela" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opacidade" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Nível de opacidade das janelas em movimento" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Janelas maximizadas quebradas e automaticamente desmaximizadas ao arrastar" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Janelas maximizadas quebradas" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Iniciar movimento da janela" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Brilho" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Brilho" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Brilho" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Brilho" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Reduzir Opacidade" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Aumentar Opacidade" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Etapa de mudança de opacidade" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Etapa de mudança de opacidade" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Etapa de Opacidade" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Nível de opacidade das janelas em movimento" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Opacidade Durante Rotação" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturação" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Saturação" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Saturação" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Saturação" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Decorações das janelas" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Valores de opacidade da janela" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Criar Janelas" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Janelas que devem ser posicionadas por padrão" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Janelas que devem ser translúcidas por padrão" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Janelas que devem ser posicionadas por padrão" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo usado para a disposição das janelas" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Cascata" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centralizado" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Gerenciamento de janelas" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Janelas em Prevenção de Destaque" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posições horizontais" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Colocar Janelas" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Colocar janelas nas posições apropriadas quando houver mapeamento" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Modo de disposição" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Janelas posicionadas" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Aleatório" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Seleciona onde as janelas são dimensionadas se existirem múltiplos " "dispositivos de saída." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Inteligente" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Em todos os dispositivos de saída" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Posições verticais" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Janelas posicionadas na janela de visualização" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Soluções para disposição das janelas" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Janelas que devem ser posicionadas por padrão" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Janelas que devem ser posicionadas por padrão em janelas de visualização " "específicas" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Decorações das janelas" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Soluções" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Posições X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Posições X da janela de visualização" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Valores da posição X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Posições Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Posições Y da janela de visualização" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Valores da posição Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Carregar imagens Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Filtragem através de expressões regulares" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Filtragem de janelas através de expressões regulares" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Cor da borda" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Cor do contorno usado para o modo contorno e retangular de redimensionameto" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Modo padrão de redimensionamento" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Modo a usar por padrão para o redimensionamento de janelas" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Cor de preenchimento" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Cor de preenchimento usada para o modo retangular de redimensionamento" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciar Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciar Redimensionamento do contorno de Janelas" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciar Redimensionamento Retangular de Janelas" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciar Redimensionamento Esticado de Janelas" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciar Redimensionamento de Janelas" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Redimensionamento Normal de Janelas" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Contorno" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Redimensionar janelas pelo contorno" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Retângulo" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Redimensionar Janelas retangularmente" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Redimensionar Janela" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Redimensionar janela" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Iniciar redimensionamento da janela" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Iniciar redimensionamento da janela esticando-a" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Iniciar redimensionamento normal da janela" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Iniciar redimensionamento da janela usando o contorno" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Iniciar redimensionamento da janela usando um retângulo" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Esticar" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Redimensionar janelas esticando-as" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Janelas que devem usar redimensionamento normal" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Janelas que devem usar redimensionamento pelo contorno" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Janelas que devem usar redimensionamento retangular" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Janelas que devem usar redimensionamento por esticamento" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Movimento de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ponteiro de Inversão de Bordas" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tempo de Inversão" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Rodar para a janela de visualização da esquerda e manter ponteiro" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Inverter para janela de visualização seguinte ao arrastar o objeto para a " "borda da tela" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Inverter para a janela de visualização seguinte ao mover o ponteiro para a " "borda da tela" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Inverter para janela de visualização seguinte ao mover a janela para a borda " "da tela" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Rodar para janela de visualização da direita e manter ponteiro" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverter o eixo Y para movimento do ponteiro" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Inverter Y com o Ponteiro" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilidade do Ponteiro" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Elevar ao rodar" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Elevar janelas ao rodar" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Girar Cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Girar para a Esquerda" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Girar para a Direita" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Girar para a Esquerda" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Girar para a Esquerda com Janela" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Girar para a Direita" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Girar para a Direita com Janela" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Girar para" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Girar para Face 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Girar para Face 1 com Janela" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Girar para a Face 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Girar para a Face 10 com Janela" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Girar para a Face 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Girar para a Face 11 com Janela" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Girar para a Face 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Girar para a Face 12 com Janela" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Girar para a Face 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Girar para a Face 2 com Janela" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Girar para a Face 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Girar para a Face 3 com Janela" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Girar para a Face 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Girar para a Face 4 com Janela" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Girar para a Face 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Girar para a Face 5 com Janela" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Girar para a Face 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Girar para a Face 6 com Janela" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Girar para a Face 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Girar para a Face 7 com Janela" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Girar para a Face 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Girar para a Face 8 com Janela" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Girar para a Face 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Girar para a Face 9 com Janela" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Girar Cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Girar cubo da área de trabalho" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Girar para a esquerda" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Girar para a esquerda e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Girar para a direita" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Girar para a direita e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Girar para a face 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Girar para Face 1 com Janela" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Girar para a face 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Girar para a face 1 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Girar para a face 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Girar para a face 10 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Girar para a face 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Girar para a face 11 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Girar para a face 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Girar para a face 12 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Girar para a face 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Girar para a face 2 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Girar para a face 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Girar para a face 3 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Girar para a face 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Girar para a face 4 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Girar para a face 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Girar para a face 5 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Girar para a face 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Girar para a face 6 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Girar para a face 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Girar para a face 7 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Girar para a face 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Girar para a face 8 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Girar para a face 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Girar para a face 9 e trazer a janela ativa junto" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Girar para a janela de visualização" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Girar janela" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Girar com janela" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Aceleração da Rotação" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocidade da Rotação" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Intervalo de tempo da Rotação" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom da rotação" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilidade do movimento do ponteiro" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Fechar a Rotação do Cubo na Face Superior" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Fechar a Rotação do Cubo na Face Superior" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Fechar na Face Superior" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Fechar na Face Superior" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Iniciar Rotação" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo de espera até a rodar a janela de visualização" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Volume de opacidade em percentagem" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Grande" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Clicar na área de trabalho para mostrar a área de trabalho" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Escurecer Segundo Plano" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Escurecer segundo plano ao dimensionar janelas" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Emblema" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entrar no modo Mostrar Área de Trabalho quando o ambiente é clicado durante " "o dimensionamento" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Tempo a pairar" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Iniciar Seletor de Janelas" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Iniciar Selector de Janelas para Todas as Janelas" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Iniciar Selector de Janelas para Grupo de Janelas" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Iniciar Selector de Janelas para Todas as Janelas na Saída Atual" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Criar layout de todas as janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Criar layout de grupo de janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Criar layout das janelas e iniciar sua transformação" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Criar layout de janelas na saída atual e iniciar sua transformação" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Em todos os dispositivos de saída" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Apenas no dispositivo de saída atual" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ícone de sobreposição" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Sobrepor um ícone nas janelas quando elas são dimensionadas" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Dimensionar" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Janelas a dimensionar" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Velocidade de Dimensionamento" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Etapa de dimensionamento" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Dimensionar janelas" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Seleciona onde as janelas são dimensionadas se existirem múltiplos " "dispositivos de saída." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Espaço entre janelas" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Espaçamento" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (em ms) antes que o modo de dimensionar seja terminado ao pairar sobre " "uma janela" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Janelas a serem dimensionadas no modo Dimensionar" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Abrir automaticamente captura de tela nesta aplicação" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Diretório" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Captura de uma parte retangular da tela" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Iniciar Aplicação" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Colocar capturas de telas neste diretório" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Capturar tela" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin de captura de tela" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Carregar imagens svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantidade de brilho em percentagem" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantidade de saturação em percentagem" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Alternador de Aplicativos" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rodar Automaticamente" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Colocar em Primeiro Plano" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Colocar a janela selecionada em primeiro plano" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Distância a que o ambiente deve ficar reduzido ao alternar janelas" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ícone" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimizado" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Plano da área de trabalho" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Próxima Janela" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Próxima Janela (Todas as janelas)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Próxima Janela (Sem popup)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Mostrar alternador se não estiver visível e selecionar próxima janela" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e selecionar próxima janela de " "todas" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Mostrar alternador se não estiver visível e selecionar janela anterior" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostrar alternador se não estiver visível e selecionar janela anterior de " "todas" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Lâmina Anterior" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Janela anterior" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Janela anterior (Todas as janelas)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Janela anterior (Sem popup)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Rodar para a janela selecionada ao alternar" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Selecionar próxima janela sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Selecionar janela anterior sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Selecionar janela anterior sem mostrar o popup de janelas." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Mostrar ícone ao lado da miniatura" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Mostrar janelas minimizadas" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Velocidade do alternador" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Intervalo de tempo do alternador" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Janelas a alternar" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Janelas que devem ser mostradas no alternador" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Proporciona suporte para o espaço de cor YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Reprodução Vídeo" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Reprodução de vídeos" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Espaço cor YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Adicionar linha" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Adicionar ponto" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Adiciona efeitos de água a diferentes ações no ambiente de trabalho" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Atraso (em ms) entre cada queda de gota de chuva" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Ativar efeitos de água no cursor" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linha" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Distância do dimensionamento" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Ponto" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Atraso Chuva" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Onda do título" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Alternar chuva" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Ativar/desativar efeito chuva" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Ativar/desativar Limpador de parabrisas" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Ativar/desativar efeito Limpador de parabrisas" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Efeito Água" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Distância do dimensionamento durante efeito de água" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efeito de onda do título da janela" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efeito Foco" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efeito Focar Janela" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Focar Janelas" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Fricção" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Agarrar Janelas" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Resolução da grade" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Inverter o efeito de atração/resistência de janelas" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Faz tremer a janela" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efeito Criação" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efeito Criação Janela" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Criar Janelas" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efeito Maximizar" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Tamanho mínimo da grade" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Tamanho mínimo do vértice da grade" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mover Janelas" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremer" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Atração Invertida" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Atrair janelas" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fricção Mola" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Constante K Mola" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Constante Mola" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Alternar atração/resistência das janelas" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usar um modelo de uma mola para o efeito de janelas gelatinosas" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Resolução do vértice da grade" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Janelas que devem ser gelatinosas quando focadas" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Janelas que devem ser gelatinosas quando agarradas" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Janelas que devem ser gelatinosas quando criadas" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Janelas que devem ser gelatinosas quando movidas" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Efeito gelatina quando se maximizam e minimizam janelas" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Janelas Gelatinosas" #~ msgid "Command line 0" #~ msgstr "Linha de comando 0" #~ msgid "Run command 0" #~ msgstr "Executar comando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Capturar tela a partir da linha de comando" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Capturar tela a partir da linha de comando" #~ msgid "Filter Linear" #~ msgstr "Filtro Linear" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usar filtro linear quando ampliado" #~ msgid "Zoom Desktop" #~ msgstr "Zoom da Área de Trabalho" #~ msgid "Zoom In" #~ msgstr "Mais Zoom" #~ msgid "Zoom Out" #~ msgstr "Menos Zoom" #~ msgid "Zoom Pan" #~ msgstr "Mover Zoom" #~ msgid "Zoom Speed" #~ msgstr "Velocidade do Zoom" #~ msgid "Zoom Timestep" #~ msgstr "Intervalo de tempo do Zoom" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Ampliar e deslocar o cubo da área de trabalho" #~ msgid "Zoom factor" #~ msgstr "Fator de zoom" #~ msgid "Zoom pan" #~ msgstr "Deslocar zoom" #~ msgid "Decrease window opacity" #~ msgstr "Reduzir opacidade da janela" #~ msgid "Increase window opacity" #~ msgstr "Aumentar opacidade da janela" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valores de opacidade para janelas que devem ser translúcidas por padrão" #~ msgid "Opacity windows" #~ msgstr "Opacidade de janelas" #~ msgid "Background Images" #~ msgstr "Imagens de fundo" #~ msgid "Background images" #~ msgstr "Imagens de fundo" #~ msgid "Place windows on a plane" #~ msgstr "Colocar janelas num plano" #~ msgid "Plane Down" #~ msgstr "Plano Abaixo" #~ msgid "Plane Left" #~ msgstr "Plano à esquerda" #~ msgid "Plane Right" #~ msgstr "Plano à direita" #~ msgid "Plane To Face 1" #~ msgstr "Plano à Face 1" #~ msgid "Plane To Face 10" #~ msgstr "Plano à Face 10" #~ msgid "Plane To Face 11" #~ msgstr "Plano à Face 11" #~ msgid "Plane To Face 12" #~ msgstr "Plano à Face 12" #~ msgid "Plane To Face 2" #~ msgstr "Plano à Face 2" #~ msgid "Plane To Face 3" #~ msgstr "Plano à Face 3" #~ msgid "Plane To Face 4" #~ msgstr "Plano à Face 4" #~ msgid "Plane To Face 5" #~ msgstr "Plano à Face 5" #~ msgid "Plane To Face 6" #~ msgstr "Plano à Face 6" #~ msgid "Plane To Face 7" #~ msgstr "Plano à Face 7" #~ msgid "Plane To Face 8" #~ msgstr "Plano à Face 8" #~ msgid "Plane To Face 9" #~ msgstr "Plano à Face 9" #~ msgid "Plane Up" #~ msgstr "Plano acima" #~ msgid "Plane down" #~ msgstr "Plano abaixo" #~ msgid "Plane left" #~ msgstr "Plano à esquerda" #~ msgid "Plane right" #~ msgstr "Plano á direita" #~ msgid "Plane to face 1" #~ msgstr "Plano à face 1" #~ msgid "Plane to face 10" #~ msgstr "Plano à face 10" #~ msgid "Plane to face 11" #~ msgstr "Plano à face 11" #~ msgid "Plane to face 12" #~ msgstr "Plano à face 12" #~ msgid "Plane to face 2" #~ msgstr "Plano à face 2" #~ msgid "Plane to face 3" #~ msgstr "Plano à face 3" #~ msgid "Plane to face 4" #~ msgstr "Plano à face 4" #~ msgid "Plane to face 5" #~ msgstr "Plano à face 5" #~ msgid "Plane to face 6" #~ msgstr "Plano à face 6" #~ msgid "Plane to face 7" #~ msgstr "Plano à face 7" #~ msgid "Plane to face 8" #~ msgstr "Plano à face 8" #~ msgid "Plane to face 9" #~ msgstr "Plano à face 9" #~ msgid "Plane up" #~ msgstr "Plano acima" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Tempo de desvanecimento da opacidade do ambiente de trabalho" ./po/be.po0000644000004100000410000015170213246301623012615 0ustar www-datawww-data# compiz be translation. # Copyright (C) 2008 compiz-fusion.org # This file is distributed under the same license as the compiz package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.7.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-03 11:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4347 #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4369 #: ../metadata/core.xml.in.h:152 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4372 #: ../metadata/core.xml.in.h:84 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.h:90 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4531 #: ../metadata/core.xml.in.h:159 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4550 msgid "Shade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4570 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4596 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4616 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4636 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4662 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5019 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5028 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5043 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:26 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:59 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.h:60 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:61 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.h:62 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:63 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "High" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "Low" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:85 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:91 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Off" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:149 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:150 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:151 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:153 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:154 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:155 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:156 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:157 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.h:158 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.h:160 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:161 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:162 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:163 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Background Images" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Background images" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:18 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:27 ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:28 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:45 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:31 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:47 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:17 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Y position values" msgstr "" #: ../metadata/plane.xml.in.h:1 msgid "Desktop Plane" msgstr "" #: ../metadata/plane.xml.in.h:2 msgid "Place windows on a plane" msgstr "" #: ../metadata/plane.xml.in.h:3 msgid "Plane Down" msgstr "" #: ../metadata/plane.xml.in.h:4 msgid "Plane Left" msgstr "" #: ../metadata/plane.xml.in.h:5 msgid "Plane Right" msgstr "" #: ../metadata/plane.xml.in.h:6 msgid "Plane To Face 1" msgstr "" #: ../metadata/plane.xml.in.h:7 msgid "Plane To Face 10" msgstr "" #: ../metadata/plane.xml.in.h:8 msgid "Plane To Face 11" msgstr "" #: ../metadata/plane.xml.in.h:9 msgid "Plane To Face 12" msgstr "" #: ../metadata/plane.xml.in.h:10 msgid "Plane To Face 2" msgstr "" #: ../metadata/plane.xml.in.h:11 msgid "Plane To Face 3" msgstr "" #: ../metadata/plane.xml.in.h:12 msgid "Plane To Face 4" msgstr "" #: ../metadata/plane.xml.in.h:13 msgid "Plane To Face 5" msgstr "" #: ../metadata/plane.xml.in.h:14 msgid "Plane To Face 6" msgstr "" #: ../metadata/plane.xml.in.h:15 msgid "Plane To Face 7" msgstr "" #: ../metadata/plane.xml.in.h:16 msgid "Plane To Face 8" msgstr "" #: ../metadata/plane.xml.in.h:17 msgid "Plane To Face 9" msgstr "" #: ../metadata/plane.xml.in.h:18 msgid "Plane Up" msgstr "" #: ../metadata/plane.xml.in.h:19 msgid "Plane down" msgstr "" #: ../metadata/plane.xml.in.h:20 msgid "Plane left" msgstr "" #: ../metadata/plane.xml.in.h:21 msgid "Plane right" msgstr "" #: ../metadata/plane.xml.in.h:22 msgid "Plane to face 1" msgstr "" #: ../metadata/plane.xml.in.h:23 msgid "Plane to face 10" msgstr "" #: ../metadata/plane.xml.in.h:24 msgid "Plane to face 11" msgstr "" #: ../metadata/plane.xml.in.h:25 msgid "Plane to face 12" msgstr "" #: ../metadata/plane.xml.in.h:26 msgid "Plane to face 2" msgstr "" #: ../metadata/plane.xml.in.h:27 msgid "Plane to face 3" msgstr "" #: ../metadata/plane.xml.in.h:28 msgid "Plane to face 4" msgstr "" #: ../metadata/plane.xml.in.h:29 msgid "Plane to face 5" msgstr "" #: ../metadata/plane.xml.in.h:30 msgid "Plane to face 6" msgstr "" #: ../metadata/plane.xml.in.h:31 msgid "Plane to face 7" msgstr "" #: ../metadata/plane.xml.in.h:32 msgid "Plane to face 8" msgstr "" #: ../metadata/plane.xml.in.h:33 msgid "Plane to face 9" msgstr "" #: ../metadata/plane.xml.in.h:34 msgid "Plane up" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:37 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:29 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 msgid "Zoom Speed" msgstr "" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 msgid "Zoom pan" msgstr "" ./po/ja.po0000644000004100000410000026634613246301623012634 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-05-10 21:42+0900\n" "Last-Translator: jiro kawada \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "デスクトップ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "ウィンドウ管理" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 #: ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "なし" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "シェード" #: ../gtk/gnome/compiz-window-manager.c:428 #: ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "最大化" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "水平方向に最大化" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "垂直方向に最大化" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "最小化" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "最前面へ" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "最後面へ" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "ウィンドウメニュー" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ウィンドウのタイトルバー上でマウスホイールをスクロールさせたときのアクション" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "ブラーの種類" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity テーマのアクティブ・ウィンドウの不透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity テーマのアクティブ・ウィンドウの半透明シェード" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity テーマの不透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity テーマの半透明シェード" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Metacity テーマ装飾のアクティブ・ウィンドウに使用する不透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity テーマ装飾に使用する不透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "Shade active windows with metacity theme decorations from opaque to translucent" msgstr "Metacity テーマ装飾のアクティブ・ウィンドウを不透明から透明にシェードさせる" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Metacity テーマ装飾のウィンドウを不透明から透明にシェードさせる" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "タイトルバーのマウスホイール・アクション" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ウィンドウ装飾用のブラーの種類" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Metacity テーマを使用" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ウィンドウ装飾を描画する際に Metacity テーマを使用" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "ウィンドウを閉じる" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ウィンドウの最大化解除" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ウィンドウを最大化" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "ウィンドウを最小化" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "最前面に表示" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "スティック" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "シェード解除" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "最前面表示解除" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "スティッキー解除" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "ウィンドウ \"%s\" は応答していません。" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "このアプリケーションを強制的に終了させると、未保存の変更はすべて失われます。" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "強制終了(_F)" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "注釈線" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "注釈線の塗り色" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "注釈のストロークの色" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "注釈線プラグイン" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "消去" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "描画" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ツールを使用して描画" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "注釈線の塗り色" #: ../metadata/annotate.xml.in.h:9 #: ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 #: ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "開始" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "注釈線の描画を開始" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "注釈線の削除を開始" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "削除開始" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "線幅" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "注釈線の線幅" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "注釈線のストロークの色" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "ストロークの幅" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "注釈線のストロークの幅" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x バイリニア" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "アルファ・ブラー" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "アルファ・ブラー対象ウィンドウ" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "ブラーフィルタ" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "ブラー遮蔽" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "ブラー彩度" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "ブラー速度" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "ウィンドウのブラー" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ウィンドウの透過部分の背後をぼかす" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "ぼかしの彩度" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "ウィンドウをぼかす" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "フォーカスがないウィンドウをぼかす" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "他のウィンドウで覆い隠された画面域のブラーを無効化" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ブラーに使用するフィルタ方法" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "フォーカス・ブラー" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "フォーカス・ブラー対象ウィンドウ" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "ガウス" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "ガウス半径" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "ガウス強度" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "ガウス半径" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "ガウス強度" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "テクスチャの独立読み出し" #: ../metadata/blur.xml.in.h:23 #: ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 #: ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "ミップマップ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "ミップマップ詳細レベル" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "ミップマップの詳細レベル" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "点滅" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "点滅効果" #: ../metadata/blur.xml.in.h:28 msgid "Use the available texture units to do as many as possible independent texture fetches." msgstr "利用可能なテクスチャ・ユニットを使用してテクスチャを可能な限り多く独立読み出しさせる" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "ウィンドウ・ブラーの速度" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "フォーカス・ブラーの効果対象ウィンドウ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "デフォルトでアルファ・ブラー使用対象にするウィンドウ" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "クローン出力" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "複製選択の開始" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "クローン出力ハンドラ" #: ../metadata/commands.xml.in.h:1 msgid "A button binding that when invoked, will run the shell command identified by command0" msgstr "呼び出し時にコマンドライン 0 で指定したシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:2 msgid "A button binding that when invoked, will run the shell command identified by command1" msgstr "呼び出し時に コマンドライン 1 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:3 msgid "A button binding that when invoked, will run the shell command identified by command10" msgstr "呼び出し時に コマンドライン 10 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:4 msgid "A button binding that when invoked, will run the shell command identified by command11" msgstr "呼び出し時に コマンドライン 11 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:5 msgid "A button binding that when invoked, will run the shell command identified by command2" msgstr "呼び出し時に コマンドライン 2 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:6 msgid "A button binding that when invoked, will run the shell command identified by command3" msgstr "呼び出し時に コマンドライン 3 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:7 msgid "A button binding that when invoked, will run the shell command identified by command4" msgstr "呼び出し時に コマンドライン 4 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:8 msgid "A button binding that when invoked, will run the shell command identified by command5" msgstr "呼び出し時に コマンドライン 5 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:9 msgid "A button binding that when invoked, will run the shell command identified by command6" msgstr "呼び出し時に コマンドライン 6 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:10 msgid "A button binding that when invoked, will run the shell command identified by command7" msgstr "呼び出し時に コマンドライン 7 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:11 msgid "A button binding that when invoked, will run the shell command identified by command8" msgstr "呼び出し時に コマンドライン 8 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:12 msgid "A button binding that when invoked, will run the shell command identified by command9" msgstr "呼び出し時に コマンドライン 9 で指定されたシェルコマンドを実行するボタン割り当て" #: ../metadata/commands.xml.in.h:13 msgid "A keybinding that when invoked, will run the shell command identified by command0" msgstr "呼び出し時にコマンドライン 0 で指定したシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:14 msgid "A keybinding that when invoked, will run the shell command identified by command1" msgstr "呼び出し時に コマンドライン 1 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:15 msgid "A keybinding that when invoked, will run the shell command identified by command10" msgstr "呼び出し時に コマンドライン 10 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:16 msgid "A keybinding that when invoked, will run the shell command identified by command11" msgstr "呼び出し時に コマンドライン 11 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:17 msgid "A keybinding that when invoked, will run the shell command identified by command2" msgstr "呼び出し時に コマンドライン 2 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:18 msgid "A keybinding that when invoked, will run the shell command identified by command3" msgstr "呼び出し時に コマンドライン 3 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:19 msgid "A keybinding that when invoked, will run the shell command identified by command4" msgstr "呼び出し時に コマンドライン 4 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:20 msgid "A keybinding that when invoked, will run the shell command identified by command5" msgstr "呼び出し時に コマンドライン 5 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:21 msgid "A keybinding that when invoked, will run the shell command identified by command6" msgstr "呼び出し時に コマンドライン 6 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:22 msgid "A keybinding that when invoked, will run the shell command identified by command7" msgstr "呼び出し時に コマンドライン 7 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:23 msgid "A keybinding that when invoked, will run the shell command identified by command8" msgstr "呼び出し時に コマンドライン 8 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:24 msgid "A keybinding that when invoked, will run the shell command identified by command9" msgstr "呼び出し時に コマンドライン 9 で指定されたシェルコマンドを実行するキー割り当て" #: ../metadata/commands.xml.in.h:25 msgid "An edge binding that when invoked, will run the shell command identified by command0" msgstr "呼び出し時にコマンドライン 0 で指定したシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:26 msgid "An edge binding that when invoked, will run the shell command identified by command1" msgstr "呼び出し時に コマンドライン 1 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:27 msgid "An edge binding that when invoked, will run the shell command identified by command10" msgstr "呼び出し時に コマンドライン 10 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:28 msgid "An edge binding that when invoked, will run the shell command identified by command11" msgstr "呼び出し時に コマンドライン 11 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:29 msgid "An edge binding that when invoked, will run the shell command identified by command2" msgstr "呼び出し時に コマンドライン 2 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:30 msgid "An edge binding that when invoked, will run the shell command identified by command3" msgstr "呼び出し時に コマンドライン 3 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:31 msgid "An edge binding that when invoked, will run the shell command identified by command4" msgstr "呼び出し時に コマンドライン 4 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:32 msgid "An edge binding that when invoked, will run the shell command identified by command5" msgstr "呼び出し時に コマンドライン 5 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:33 msgid "An edge binding that when invoked, will run the shell command identified by command6" msgstr "呼び出し時に コマンドライン 6 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:34 msgid "An edge binding that when invoked, will run the shell command identified by command7" msgstr "呼び出し時に コマンドライン 7 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:35 msgid "An edge binding that when invoked, will run the shell command identified by command8" msgstr "呼び出し時に コマンドライン 8 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:36 msgid "An edge binding that when invoked, will run the shell command identified by command9" msgstr "呼び出し時に コマンドライン 9 で指定されたシェルコマンドを実行するエッジ割り当て" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "任意のコマンドにショートカットを割り当て" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "ボタン割り当て" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "コマンドライン 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "コマンドライン 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "コマンドライン 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "コマンドライン 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "コマンドライン 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "コマンドライン 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "コマンドライン 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "コマンドライン 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "コマンドライン 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "コマンドライン 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "コマンドライン 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "コマンドライン 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "コマンド 0 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "コマンド 1 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "コマンド 10 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "コマンド 11 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "コマンド 2 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "コマンド 3 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "コマンド 4 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "コマンド 5 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "コマンド 6 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "コマンド 7 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "コマンド 8 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "コマンド 9 を実行 の呼び出し時にシェルで実行されるコマンドライン" #: ../metadata/commands.xml.in.h:63 #: ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "コマンド" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "エッジ割り当て" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "キー割り当て" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "コマンド 1 を実行" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "コマンド 10 を実行" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "コマンド 11 を実行" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "コマンド 12 を実行" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "コマンド 2 を実行" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "コマンド 3 を実行" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "コマンド 4 を実行" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "コマンド 5 を実行" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "コマンド 6 を実行" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "コマンド 7 を実行" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "コマンド 8 を実行" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "コマンド 9 を実行" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "アクティブなプラグイン" #: ../metadata/core.xml.in.in.h:2 msgid "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "オフスクリーン・ピクスマップにリダイレクトしない直接の全画面ウィンドウ描画を許可" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "音響ベル" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "音響システムビープ音" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "自動で最前面に上げる" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "自動最前面移動の待ち時間" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "出力デバイスの自動検出" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "リフレッシュレートの自動検出" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "最高" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "クリックでフォーカス" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ウィンドウのクリックで入力フォーカスがそのウィンドウに移動" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "アクティブなウィンドウを閉じる" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "デフォルトのアイコン" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "アイコン未指定ウィンドウに適用するデフォルトのウィンドウアイコン画像" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "デスクトップサイズ" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "出力検出" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "リフレッシュレートの検出" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "ディスプレイ設定" #: ../metadata/core.xml.in.in.h:20 msgid "Duration the pointer must rest in a screen edge before an edge action is taken." msgstr "エッジ・アクションの開始までにポインタをスクリーンエッジに置き続ける必要がある時間" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "エッジ開始遅延時間" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "速さ重視" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "フォーカスとその関連動作" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "フォーカス奪取防止レベル" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "フォーカス奪取防止ウィンドウ" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "フォーカスを奪われないようにするウィンドウ" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "各出力別に独立した描画を強制" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "一般オプション" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Compiz の一般オプション" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "良" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "タスクバー省略ウィンドウを隠す" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "全ウィンドウを隠してデスクトップにフォーカス" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "\"デスクトップの表示\"モード移行時にタスクバーにないウィンドウ(ウィジェット等)を隠す" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "高" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "水平仮想サイズ" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "利用可能な場合は画像から変換されたテクスチャに圧縮を使用する" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "最大化時にヒントを無視" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "ウィンドウ最大化時に、サイズ加算分と縦横比のジオメトリ・ヒントを無視" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "選択ウィンドウの最前面への持ち上げを開始するまでの時間間隔" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping メッセージ間の間隔" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "キー割り当て" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "フォーカス奪取防止のレベル" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "照明" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "現在アクティブなプラグインのリスト" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "出力デバイスを表す文字列リスト" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "低" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "ウィンドウを下げる" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "他のウィンドウの下にウィンドウを下げる" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "水平方向にウィンドウを最大化" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "垂直方向にウィンドウを最大化" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "アクティブなウィンドウを最大化" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "アクティブなウィンドウを水平方向に最大化" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "アクティブなウィンドウを垂直方向に最大化" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "アクティブなウィンドウを最小化" #: ../metadata/core.xml.in.in.h:57 #: ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "通常" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "デスクトップ数" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "仮想デスクトップ数" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "オフ" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "垂直帰線期間にのみ画面を更新する" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "出力" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "マルチ出力で重なり部分がある場合の取扱い" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "出力デバイス同士に重なり部分がある場合でも、それぞれを別個に描画" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping の待ち時間" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "大きい方の出力を選好" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "小さい方の出力を選好" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "クリックで上げる" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "ウィンドウを上げる" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "指定時間間隔後に選択ウィンドウを最前面に上げる" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ウィンドウを他のウィンドウの前面に上げる" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "クリックでウィンドウを最前面に上げる" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "リフレッシュレート" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "水平仮想サイズ指定のための、画面サイズに対する乗数" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "垂直仮想サイズ指定のための、画面サイズに対する乗数" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "デスクトップの表示" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "アニメーションのスロー再生" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "スマートモード" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "垂直ブランクに同期化" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "テクスチャ圧縮" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "テクスチャ・フィルタ" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "テクスチャ・フィルタ" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "画面の再描画レート(回/秒)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ウィンドウの最大化/解除の切り替え" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "ウィンドウの水平方向最大化/解除の切り替え" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "ウィンドウの垂直方向最大化/解除の切り替え" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ウィンドウのシェード/解除の切り替え" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "アクティブ・ウィンドウの最大化/解除の切り替え" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "アクティブ・ウィンドウの水平方向最大化/解除の切り替え" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "アクティブ・ウィンドウの垂直方向最大化/解除の切り替え" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "アクティブ・ウィンドウのシェード/解除の切り替え" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "スロー再生アニメーション使用のオンオフ" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "アクティブ・ウィンドウの最大化解除" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "全画面ウィンドウのリダイレクトを解除" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "画面の変換時に拡散反射光を使用" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "垂直仮想サイズ" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "非常に高" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "マルチ出力で重なり部分がある場合にどちらのデバイスが選好されるべきか" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ウィンドウメニューのボタン割り当て" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ウィンドウメニューのキー割り当て" #: ../metadata/cube.xml.in.h:1 #: ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "加速度" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "画像の調整" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "上面画像を回転に合わせる" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "次のスライドに進む" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "スカイドームをアニメーション化" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "キューブの回転時にスカイドームをアニメーション化" #: ../metadata/cube.xml.in.h:7 #: ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "外観" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "自動調整" #: ../metadata/cube.xml.in.h:9 #: ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "動作" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "キューブの上部および下部の面のカラー" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "スカイドームフォールバックグラデーションの下部カラーストップに使用する色" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "スカイドームフォールバックグラデーションの上部カラーストップに使用する色" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "キューブのふた" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "キューブの色" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "デスクトップ・キューブ" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "展開加速度" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "展開速度" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "展開描画の時間刻み" #: ../metadata/cube.xml.in.h:19 #: ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "高品質スケーリングが可能な場合ミップマップを生成" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "前のスライドに戻る" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "画像ファイル" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "スカイドームのテクスチャとして使用する画像" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "マウスによる回転時のみキューブの透明化を開始" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "キューブ内部" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "キューブ内部" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "キューブの上面に描画するPNGおよびSVGファイルのリスト" #: ../metadata/cube.xml.in.h:28 #: ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "マルチ出力の形式" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "複数のキューブ" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "次のスライド" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "1つの大きなキューブ" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "回転時の不透明度" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "非回転時の不透明度" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "回転時のデスクトップ・ウィンドウの不透明度" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "非回転時のデスクトップ・ウィンドウの不透明度" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ウィンドウをキューブに配置" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "前のスライド" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "スカイドームの描画" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "画像を拡大" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "キューブの上面を覆うように画像を拡大" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "複数の出力デバイス使用の場合におけるキューブ表示方法の選択" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "スカイドーム" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "スカイドームグラデーション終了色" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "スカイドームグラデーション開始色" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "スカイドーム画像" #: ../metadata/cube.xml.in.h:46 #: ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 #: ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "速度" #: ../metadata/cube.xml.in.h:47 #: ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 #: ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "描画の時間刻み" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "マウスによる回転時のみ透明化を使用" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "キューブの透明化" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "展開" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "キューブを展開" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus 制御バックエンド" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "装飾テキスチャ用ミップマップの生成を許可" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "コマンド" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "装飾適用ウィンドウ" #: ../metadata/decoration.xml.in.h:4 msgid "Decorator command line that is executed if no decorator is already running" msgstr "デコレータ未動作の場合に実行されるデコレータ起動コマンドライン" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "影のオフセット X 座標" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "影のオフセット Y 座標" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "影の色" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "影の不透明度" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "影の半径" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "影の色" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "影オフセット X 座標" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "影オフセット Y 座標" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "影の不透明度" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "影の半径" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "影を付けるウィンドウ" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "ウィンドウの装飾" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "ウィンドウを装飾" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "装飾の適用対象ウィンドウ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "影を付ける対象ウィンドウ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "不応答ウィンドウの明度(パーセント)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "一定速度" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "一定時間" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "不応答ウィンドウを薄暗くする" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "ウィンドウ・マネージャの要求に応答しないウィンドウを薄暗くする" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "フェード・モード" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "最小化/開く/閉じる 時にフェード" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "フェード速度" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "フェード時間" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "最小化/開く/閉じる イベント時のフェード効果" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "システムビープ音時のフェード効果" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ウィンドウが開かれた時フェードイン、閉じた時フェードアウト" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "フェード・ウィンドウ" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "ウィンドウのフェード" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "全画面効果による視覚ベル" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "システムビープ音イベント時の全画面フェード効果" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "不応答ウィンドウの彩度(パーセント)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "不応答ウィンドウの明度" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "不応答ウィンドウの彩度" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "視覚ベル" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "ウィンドウのフェード形式" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "「一定速度」モードのウィンドウのフェード速度" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "「一定時間」モードのウィンドウのフェード時間(ミリ秒)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "フェードさせる対象ウィンドウ" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "マウントポイント" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "マウントポイント" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ユーザ空間ファイルシステム" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ユーザ空間ファイルシステム" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf 制御バックエンド" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib main loop サポート" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome 互換性" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "端末を開く" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Compiz に Gnome デスクトップ環境との互換性を保たせるオプション" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "アプリケーション実行ダイアログ" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "端末起動コマンド" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "スクリーンショットのコマンドライン" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "メインメニューの表示" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "\"アプリケーションの実行\"ダイアログの表示" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "メインメニューの表示" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "スクリーンショットを撮る" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ウィンドウのスクリーンショットを撮る" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "端末起動コマンドライン" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ウィンドウ・スクリーンショットのコマンドライン" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Flat File バックエンドの開始" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ファイル変更通知プラグイン" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig 制御バックエンド" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "最小化時の効果" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "最小化時効果ウィンドウ" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "最小化速度" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "最小化の描画時間刻み" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "シェード抵抗" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "シェード抵抗" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "最小化および最小化解除時のウィンドウの拡縮" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "最小化の際に縮尺させる対象ウィンドウ" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Y 座標制約" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Y 座標をワークスペースエリアに制約" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ウィンドウの移動完了までXサーバ側での配置位置を更新しない" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "ウィンドウの移動開始" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "緩慢な位置取り" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "ウィンドウの移動" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "ウィンドウの移動" #: ../metadata/move.xml.in.h:8 #: ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 #: ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "不透明度" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "移動ウィンドウの不透明度" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "最大化ウィンドウのドラッグ時、スナップを解除して最大化を自動解除" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "最大化したウィンドウのスナップ解除" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "ウィンドウの移動を開始" #: ../metadata/obs.xml.in.h:1 #: ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "明度" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "明度を下げる" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "明度を上げる" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "明度の変化刻み" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "ウィンドウに適用する明度" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "下げる" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "上げる" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "不透明度を下げる" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "不透明度を上げる" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "不透明度の変化刻み" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "ウィンドウの不透明度" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "不透明度・明度・彩度" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "不透明度や明度、彩度の調節" #: ../metadata/obs.xml.in.h:15 #: ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "彩度" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "彩度を下げる" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "彩度を上げる" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "彩度の変化刻み" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "ウィンドウに適用する彩度" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "変化刻み" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "ウィンドウ特定設定" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "ウィンドウの値" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "ウィンドウ" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "デフォルトで他と異なる明度を持たせるウィンドウ" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "デフォルトで他と異なる不透明度を持たせるウィンドウ" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "デフォルトで他と異なる彩度を持たせるウィンドウ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ウィンドウ配置に使用するアルゴリズム" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "カスケード" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "中央" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "固定ウィンドウ配置位置" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "強制配置ウィンドウ" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "水平ビューポート位置" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "ワークエリアに限定" #: ../metadata/place.xml.in.h:8 msgid "Keep placed window in work area, even if that means that the position might differ from the specified position" msgstr "結果として指定位置とは異なってしまう場合でも、ウィンドウの配置位置をワークエリア内に限定。" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "ウィンドウの配置" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "すべての出力デバイスにわたって配置" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ウィンドウが開かれた際の適切な位置への配置" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "配置形式" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "固定位置ウィンドウ" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ランダム" #: ../metadata/place.xml.in.h:17 msgid "Selects how window placement should behave if multiple outputs are selected" msgstr "マルチ出力が選択されている場合の、ウィンドウ配置の振る舞いの選択" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "スマート" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "アクティブ状態の出力デバイスを使用" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "フォーカス・ウィンドウの出力デバイスを使用" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "ポインタが置かれている出力デバイスを使用" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "垂直ビューポート位置" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "固定ビューポート・ウィンドウ" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "モーダルダイアログ向けの配置問題回避策" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "デフォルトで特定位置に配置するウィンドウ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "デフォルトで特定ビューポートに配置するウィンドウ" #: ../metadata/place.xml.in.h:27 msgid "Windows that should forcedly be placed, even if they indicate the window manager should avoid placing them." msgstr "強制的に配置させるウィンドウ。ウィンドウ・マネージャに配置の対象外とするようにウィンドウが指示している場合でも配置します。" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "固定位置に配置するウィンドウ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "固定ビューポートに配置するウィンドウ" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "回避策" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X 位置" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ビューポート位置" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X 位置の値" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y 位置" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ビューポート位置" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y 位置の値" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png 画像読み込み" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "正規表現マッチング" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "正規表現による対象ウィンドウのマッチング" #: ../metadata/resize.xml.in.h:1 #: ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 #: ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "割り当て" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "境界線の色" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "輪郭や矩形のサイズ変更描画形式で使用する境界線の色" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "デフォルトのサイズ変更形式" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ウィンドウのサイズ変更に使用するデフォルトの描画形式" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "塗り色" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "矩形のサイズ変更描画形式に使用する塗り色" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "通常形式のサイズ変更開始" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "輪郭形式のサイズ変更開始" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "矩形形式のサイズ変更開始" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "伸縮形式のサイズ変更を開始" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "ウィンドウのサイズ変更開始" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "通常サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "輪郭" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "輪郭サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "矩形" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "矩形サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "ウィンドウのサイズ変更" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "ウィンドウのサイズ変更" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "ウィンドウのサイズ変更を開始" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "伸縮形式のウィンドウのサイズ変更を開始" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "通常形式のウィンドウのサイズ変更を開始" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "輪郭形式のウィンドウのサイズ変更を開始" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "矩形形式のウィンドウのサイズ変更を開始" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "伸縮" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "伸縮サイズ変更ウィンドウ" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "サイズ変更描画に通常形式を使用するウィンドウ" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "サイズ変更描画に輪郭形式を使用するウィンドウ" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "サイズ変更描画に矩形形式を使用するウィンドウ" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "サイズ変更描画に伸縮形式を使用するウィンドウ" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "エッジへのドラッグ&ドロップでフリップ" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "エッジへの移動でフリップ" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "エッジへのポインタ移動でフリップ" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "フリップ開始時間" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "左ビューポートにフリップして、ポインタをワープ" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "オブジェクトを画面端にドラッグした際に、次のビューポートにフリップ" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "ポインタを画面端に移動した際に、次のビューポートにフリップ" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ウィンドウを画面端に移動した際に、次のビューポートにフリップ" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "右ビューポートにフリップして、ポインタをワープ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ポインタ移動の Y 軸を反転" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "ポインタ操作の Y 反転" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "ポインタ感度" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "回転時に前面に上げる" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "回転時にウィンドウを上げる" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "キューブの回転" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "左にフリップ回転" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "右にフリップ回転" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "左に回転" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "左に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "右に回転" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "右に回転(ウィンドウと一緒に)" # ※ バインドそのものではなく単なるその見出し。CCSMはアルファベットでソートして表示するので日本語だと変な位置に表示され紛らわしい。 #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "指定先に回転" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "面 1 に回転" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "面 1 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "面 10 に回転" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "面 10 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "面 11 に回転" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "面 11 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "面 12 に回転" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "面 12 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "面 2 に回転" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "面 2 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "面 3 に回転" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "面 3 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "面 4 に回転" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "面 4 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "面 5 に回転" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "面 5 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "面 6 に回転" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "面 6 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "面 7 に回転" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "面 7 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "面 8 に回転" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "面 8 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "面 9 に回転" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "面 9 に回転(ウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "キューブの回転" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "デスクトップ・キューブの回転" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "左に回転" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "左に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "右に回転" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "右に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "特定キューブ面に回転" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "ウィンドウと一緒に特定キューブ面に回転" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "面 1 に回転" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "面 1 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "面 10 に回転" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "面 10 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "面 11 に回転" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "面 11 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "面 12 に回転" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "面 12 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "面 2 に回転" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "面 2 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "面 3 に回転" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "面 3 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "面 4 に回転" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "面 4 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "面 5 に回転" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "面 5 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "面 6 に回転" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "面 6 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "面 7 に回転" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "面 7 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "面 8 に回転" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "面 8 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "面 9 に回転" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "面 9 に回転(アクティブなウィンドウと一緒に)" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ビューポートに回転" # ※ ”Rotate to” の翻訳者コメント参照のこと #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "指定先にウィンドウと一緒に回転" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "ウィンドウと一緒に回転" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "回転の加速度" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "回転速度" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "回転の時間刻み" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "回転時のズーム距離" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ポインタの移動感度" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "キューブ回転をキューブ下面にスナップ" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "キューブ回転をキューブ上面にスナップ" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "キューブ下面にスナップ" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "キューブ上面にスナップ" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "回転の開始" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ビューポートのフリップ移動を開始する前のタイムアウト" #: ../metadata/rotate.xml.in.h:98 #: ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "ズーム" #: ../metadata/scale.xml.in.h:1 #: ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "不透明度(%)" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "大きい" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "ボタンによるスケール・モードのオンオフ" #: ../metadata/scale.xml.in.h:7 msgid "Button bindings toggle scale mode instead of enabling it when pressed and disabling it when released." msgstr "ボタンを離すとスケール・モードが無効になる基本動作を、ボタンを押すたびにオンオフが切り替わる動作に代える" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "デスクトップのクリックでデスクトップの表示" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "背景を暗くする" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ウィンドウのスケール時に背景を暗くする" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "エンブレム" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "スケール中にデスクトップがクリックされたとき\"デスクトップの表示\"モードに入る" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ホバー時間" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "ウィンドウピッカー起動" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "すべてのウィンドウ対象のウィンドウピッカー起動" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "ウィンドウグループ対象のウィンドウピッカー起動" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "現在の出力上ウィンドウ対象のウィンドウピッカー起動" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "キーによるスケール・モードのオンオフ" #: ../metadata/scale.xml.in.h:19 msgid "Key bindings toggle scale mode instead of enabling it when pressed and disabling it when released." msgstr "キーを離すとスケール・モードが無効になる基本動作を、キーを押すたびにオンオフが切り替わる動作に代える。" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "すべてのウィンドウを配列して変換を開始" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ウィンドウグループを配列して変換を開始" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ウィンドウを配列して変換を開始" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "現在の出力デバイス上のウィンドウを配列して変換を開始" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "すべての出力デバイス上に" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "現在の出力デバイス上に" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "重ね表示アイコン" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ウィンドウ調整後にアイコンを重ね表示" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "スケール" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "スケール・ウィンドウ" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "スケール速度" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "スケール位置算出の時間刻み" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "ウィンドウのスケール" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "複数の出力デバイスを使用している場合に、ウィンドウをどこにスケールするかの選択" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "ウィンドウ間の間隔の大きさ" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "間隔" #: ../metadata/scale.xml.in.h:40 msgid "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ウィンドウ上でのホバー時に、スケールモードを終了するまでの時間(ミリ秒)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "スケールモードでスケールされる対象ウィンドウ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "スクリーンショット画像をこのアプリケーションで自動的に開く" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ディレクトリ" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "矩形選択スクリーンショットを開始" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "起動アプリケーション" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "スクリーンショット画像をこのディレクトリに置く" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "スクリーンショット" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "スクリーンショット・プラグイン" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg 画像読み込み" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "明るさの量(%)" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "鮮やかさの量(%)" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "アプリケーション・スイッチャー" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "自動回転" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "手前に提示" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "選択ウィンドウを手前に提示" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ウィンドウのスイッチ中にデスクトップがズームアウトされる距離" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "アイコン" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "最小化" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "次のパネル" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "次のウィンドウ" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "次のウィンドウ(全ウィンドウから)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "次のウィンドウ(ポップアップなし)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "スイッチャーが非表示の場合ポップアップして、次のウィンドウを選択" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "スイッチャーが非表示の場合ポップアップして、すべてのウィンドウから次のウィンドウを選択" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "スイッチャーが非表示の場合ポップアップして、前のウィンドウを選択" #: ../metadata/switcher.xml.in.h:23 msgid "Popup switcher if not visible and select previous window out of all windows" msgstr "スイッチャーが非表示の場合ポップアップして、すべてのウィンドウから前のウィンドウを選択" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "前のパネル" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "前のウィンドウ" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "前のウィンドウ(全ウィンドウから)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "前のウィンドウ(ポップアップなし)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "スイッチ中に選択ウィンドウへ回転" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "次のパネルタイプのウィンドウを選択" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "ポップアップウィンドウ表示なしで次のウィンドウを選択" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "前のパネルタイプのウィンドウを選択" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ポップアップウィンドウ表示なしで前のウィンドウを選択" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "サムネイルの隣にアイコンを表示" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "最小化されているウィンドウも表示" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "スイッチャー速度" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "スイッチャー描画の時間刻み" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "スイッチャー・ウィンドウ" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "スイッチャーに表示する対象ウィンドウ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 色空間のサポートを提供" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "動画再生" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "動画再生" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 色空間" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "線を追加" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "点を追加" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "異なるデスクトップアクションに水効果を追加" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "各水滴間の遅延時間(ミリ秒)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ポインタの水効果を有効にする" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "線" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "オフセットスケール" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "点" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "雨の待ち時間" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "タイトルの波" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "雨の切り替え" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "雨効果の切り替え" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "ワイパーの切り替え" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "ワイパー効果の切り替え" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "水効果" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "水オフセットスケール" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ウィンドウタイトルからウェーブ効果" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "フォーカス時の効果" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ウィンドウがフォーカスされた時の効果" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "フォーカス時効果ウィンドウ" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "摩擦" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "つかみ時効果ウィンドウ" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "グリッド解像度" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ウィンドウ・スナップの反転" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "ウィンドウを震動させる" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "開いた時の効果" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ウィンドウが開かれた時の効果" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "開く時効果ウィンドウ" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "最大化時の効果" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "最小グリッドサイズ" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "最小頂点グリッドサイズ" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "移動時効果ウィンドウ" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "震動" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "スナップの反転" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "ウィンドウをスナップ" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "バネ摩擦" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "バネ定数" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "バネ定数" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "ウィンドウ・スナップの切り替え" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "揺れるウィンドウ効果用にバネモデルを使用" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "頂点グリッド解像度" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "フォーカス時に揺ゆらす対象ウィンドウ" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "つかまれた時に揺らす対象ウィンドウ" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "開いた時に揺らす対象ウィンドウ" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "移動時に揺らす対象ウィンドウ" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ウィンドウの最大化および最大化解除時に揺れる効果" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "揺れるウィンドウ" #~ msgid "Command line 0" #~ msgstr "コマンドライン 0" #~ msgid "Run command 0" #~ msgstr "コマンド 0 を実行" #~ msgid "Screenshot commands" #~ msgstr "スクリーンショットのコマンド" #~ msgid "Screenshot key bindings" #~ msgstr "スクリーンショットのキー割り当て" #~ msgid "Filter Linear" #~ msgstr "線形フィルタ" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ズームイン時に線形フィルタを使用" #~ msgid "Zoom Desktop" #~ msgstr "デスクトップのズーム" #~ msgid "Zoom In" #~ msgstr "ズームイン" #~ msgid "Zoom Out" #~ msgstr "ズームアウト" #~ msgid "Zoom Pan" #~ msgstr "ズーム域の移動" #~ msgid "Zoom Speed" #~ msgstr "ズーム速度" #~ msgid "Zoom Timestep" #~ msgstr "ズーム描画時間刻み" #~ msgid "Zoom and pan desktop cube" #~ msgstr "デスクトップ・キューブのズームとズーム域移動" #~ msgid "Zoom factor" #~ msgstr "ズーム係数" #~ msgid "Zoom pan" #~ msgstr "ズーム域の移動" #~ msgid "Decrease window opacity" #~ msgstr "ウィンドウの不透明度を下げる" #~ msgid "Increase window opacity" #~ msgstr "ウィンドウの不透明度を上げる" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "デフォルトで半透明化の対象にするウィンドウの不透明度" #~ msgid "Opacity windows" #~ msgstr "半透明対象ウィンドウ" ./po/eu.po0000644000004100000410000025030313246301623012635 0ustar www-datawww-data# translation of eu-compiz.po to Basque # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Ander Elortondo , 2007, 2008. msgid "" msgstr "" "Project-Id-Version: eu-compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-06-23 15:38+0200\n" "Last-Translator: Ander Elortondo \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Mahaigaina" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Leiho kudeatzailea" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Bat ere ez" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Itzala" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximizatu" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Horizontalki maximizatu" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Bertikalki maximizatu" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Ikonotu" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Goratu" #: ../gtk/gnome/compiz-window-manager.c:433 #, fuzzy msgid "Lower" msgstr "Azpian" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Leiho Menua" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Leihoko titulu barra gainetik sagu gurpila biratzean hartu beharreko ekintza." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Lausotze mota" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity gaian leiho aktiboko opakutasuna" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity gaian leiho aktiboko opakotasun itzala" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity gaiaren opakutasuna" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity gaiaren opakotasun itzala" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" "Metacity gaiaren dekorazioaetan erabili beharreko opakutasuna leiho " "aktiborako" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Metacity gaiaren dekorazioaetan erabili beharreko opakutasuna" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Itzaldu leiho aktiboa metacity dekorazio gaia erabiliz, opakutik " "transluzidora." #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Itzaldu leihoak metacity dekorazio gaia erabiliz, opakutik transluzidora." #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Sagu gurpil ekintza titulu-barran" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Leiho dekoraziorako lausotze mota" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Erabili metacity gaia" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Erabili metacity gaia leiho dekorazioa marraztean" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Itxi leihoa" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Leheneratu leihoa" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximizatu leihoa" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Leihoa Minimizatu" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Ezarri gainean" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Itsatsi" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Itzala kendu" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Gainean ezartzea kendu" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "itsastea kendu" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "\"%s\" leihoak ez du erantzuten." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Aplikazio honi irtetzera behartuz, gorde gabeko aldaketak galtzea ekar " "dezake." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Irtetzera behartu" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Oharrak idatzi" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Betetze kolorea oharretan" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Oharren marra kolorea" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Oharren plugina" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Garbitu" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Marraztu" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Marraztu tresna erabiliz" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Betetze kolorea oharrentzat" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Hasi" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Hasi oharren marraztea" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Hasi oharren ezabatzea" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Hasi ezabatzea" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Lerro zabalera" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Lerro zabalera oharrentzat" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Marra kolorea oharrenzat" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Marra zabalera" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Marra zabalera oharrentzat" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alfa lausotzea" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alfa lausotze leihoak" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Lausotze iragazkia" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Lausotze oklusioa" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Lausotze saturazioa" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Lausotze abiadura" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Lausotze leihoak" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Leiho atal transluzidoen atzeko lausotzea" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Lausotze saturazioa" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Lausotze leihoak" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Fokua ez duten leihoen lausotzea" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Beste leiho batek ilundutako pantaila eremuen lausotzea ezgaitu" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Lausotzerako erabilitako iragazki metodoa" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokoaren Lausotzea" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Leihoen foko lausotzea" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiar" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gauss Erradioa" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussiar Indarra" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gauss erradioa" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussiar indarra" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Testura independente lagina" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap DM" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap Detaile Maila" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pultso" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pultso efektua" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Erabili testura eskuragarriak ahal bezain testura independente lagin " "sortzeko." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Leiho lausotze abiadura" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Foko lausotzeak eragina izango duen leihoak" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Alfa lausotzea lehenetsita izango duten leihoak" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klonatu irteera" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Hasi klonatze hautapena" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Irteera klonatze kudeatzailea" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Shell command0 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Shell command1 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Shell command10 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Shell command11 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Shell command2 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Shell command3 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Shell command4 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Shell command5 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Shell command6 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Shell command7 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Shell command8 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Shell command9 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Shell command0 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Shell command1 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Shell command10 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Shell command11 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Shell command2 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Shell command3 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Shell command4 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Shell command5 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Shell command6 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Shell command7 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Shell command8 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Shell command9 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Shell command0 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Shell command1 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Shell command10 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Shell command11 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Shell command2 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Shell command3 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Shell command4 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Shell command5 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Shell command6 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Shell command7 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Shell command8 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Shell command9 komandoa exekutatuko duen laster-tekla" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Esleitu laster-tekla hautazko komandori" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Botoi Laster-bideak" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "1 komando lerroa" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "10 komando lerroa" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "11 komando lerroa" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "12 komando lerroa" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "2 komando lerroa" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "3 komando lerroa" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "4 komando lerroa" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "5 komando lerroa" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "6 komando lerroa" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "7 komando lerroa" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "8 komando lerroa" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "9 komando lerroa" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_0komandoa abiaraztean" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_1komandoa abiaraztean" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_10komandoa abiaraztean" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_11komandoa abiaraztean" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_2komandoa abiaraztean" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_3komandoa abiaraztean" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_4komandoa abiaraztean" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_5komandoa abiaraztean" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_6komandoa abiaraztean" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_7komandoa abiaraztean" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_8komandoa abiaraztean" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Shellean exekutatu beharreko komando lerroa exekutatu_9komandoa abiaraztean" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Komandoak" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Ertzetako laster-bideak" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Laster-teklak" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Exekutatu 1 komandoa" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Exekutatu 10 komandoa" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Exekutatu 11 komandoa" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Exekutatu 12 komandoa" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Exekutatu 2 komandoa" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Exekutatu 3 komandoa" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Exekutatu 4 komandoa" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Exekutatu 5 komandoa" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Exekutatu 6 komandoa" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Exekutatu 7 komandoa" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Exekutatu 8 komandoa" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Exekutatu 9 komandoa" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Plugin aktiboak" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Gaitu pantaila osoa marraztean ez birbideratzea pantailaz kanpoko pixmapsera" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Kanpai entzungarri" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Sistemako beep entzungarri" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automatikoki goratu" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Automatikoki goratzeraren atzerapena" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Irteera gailuen detekzio automatikoa" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Freskatze tasaren detekzio automatikoa" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Onena" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klik enfokatzeko" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Leihoan klik egitean mugi sarrera fokua berari" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Itxi leiho aktiboa" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Lehenetsitako ikonoa" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Lehenetsitako leihoaren ikono irudia" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Mahaigain tamaina" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Irteerak detektatu" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Freskatze-tasa detektatu" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Erakutsi ezarpenak" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Saguaren erakuslea pantaila ertzean egon behar duen denbora akzioa hasi " "aurretik." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Ertz abiarazlearen atzerapen denbora" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Azkarra" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Foku Prebentzio maila" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Foku Prebentzioa Leihoak" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Foku prebentzioa leihoak" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Behartu irteera independenteko margotzea." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Aukera orokorrak" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Compiz aukera orokorrak" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Ona" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Ezkutatu ataza-barran ez dauden leihoak" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Ezkutatu leiho guztiak eta mahaigaina enfokatu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Gorde ataza-barran ez dauden leihoak mahaigain erakuste moduan sartzean" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Altura" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Horizontal tamaina birtuala" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Ahal denean erabili trinkotzea irudietatik eratorritako testurentzat" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ez ikusi iradokizunak maximizatua dagoenean" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ez ikusi tamaina handitze eta itxura iradokizunak leihoa maximizatua " "dagoenean" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Hautatutako leihoak goratu arretiko tartea" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping mezuen arteko tartea" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Laster-teklak" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Foku lapurtze prebentzio maila" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Argitasuna" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Orain aktibo dauden plugin zerrenda" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Irteera gailuak deskribatzeko kateen zerrenda" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Azpian" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Azpiko leihoa" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Azpiko leihoa beste leihoen atzean" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Horizontalki maximizatu leihoa" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Bertikalki maximizatu leihoa" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Leiho aktiboa maximizatu" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Leiho aktiboa horizontalki maximizatu" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Leiho aktiboa bertikalki maximizatu" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Leiho aktiboa minimizatu" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normala" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Mahaigain kopurua" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Mahaigain birtualen kopurua" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Itzali" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Pantaila eguneratzeak zuritze bertikalaren denboran bakarrik baimendu" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Irteerak" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Gainjartze irteeren kudeaketa" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Margotu gailu bakoitza independente, nahiz eta irteera gailuak gainjarri" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping atzerapena" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Hobetsi irteera handiagoa" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Hobetsi irteera txikiagoa" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Goratu klikatzean" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Goratu leihoa" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Goratu hautatutako leihoa denbora tarte baten ondoren" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Goratu leihoa beste leihoen gainetik" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Goratu leihoak klikatzean" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Freskatze-tasa" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Pantaila tamaina biderkatzailea tamaina horizontal birtualerako" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Pantaila tamaina biderkatzailea tamaina bertikal birtualerako" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Ikus mahaigaina" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Animazioak motel" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Modu adimentsua" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank-era sinkronizatu" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Testura trinkotzea" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Testura iragazkia" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Testura iragazten" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Pantaila marrazteko maiztasuna (aldiz/segunduko) " #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Gaitu/ezgaitu leihoa maximizatua" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Gaitu/ezgaitu leihoa maximizatua horizontalki" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Gaitu/ezgaitu leihoa maximizatua bertikalki" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Gaitu/ezgaitu leihoa itzalduta" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Gaitu/ezgaitu leiho aktiboa maximizatua" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Gaitu/ezgaitu leiho aktiboa maximizatua horizontalki" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Gaitu/ezgaitu leiho aktiboa maximizatua bertikalki" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Gaitu/ezgaitu leiho aktiboa itzaldua" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Gaitu/ezgaitu animazio motelen erabilpena" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Leheneratu leiho aktiboa" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Ez-birbideratu pantaila osoko leihoak" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Erabili argi barreiatua pantaila transformatzean" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Tamaina Birtual Bertikala" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Oso altua" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Gainjartze irteera gailuen artean hobetsiko dena" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Leiho menu tekla konbinazioa" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Leiho menu laster-tekla" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Azelerazioa" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Irudia doitu" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Goiko aurpegiko irudia doitu biratzeko" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Aurreratu hurrengo diapositibara" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Skydome animatu" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animatu skydome kuboa biratzean" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Itxura" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatiko" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Portaera" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Kuboaren goiko eta azpiko aurpegien kolorea" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "skydome atzera biratze gradientean, azpiko kolore-gelditzean erabili " "beharreko kolorea" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "skydome atzera biratze gradientean, goiko kolore-gelditzean erabili " "beharreko kolorea" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Kubo estalkiak" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubo kolorea" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Mahaigain Kuboa" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Bueltatze azelerazioa" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Bueltatze abiadura" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Bueltatze denbora-pausoa" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Kalitate handiagoko eskalan sortu mipmaps posible denean" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Joan atzera aurreko diapositibara" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Irudi fitxategiak" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Skydomean testura bezala erabiltzeko irudia" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Kuboaren gardentasuna hasi, biratzea saguak gidatzen badu" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Kubo Barrua" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Kubo barrua" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Kuboko goi aurpegian errenderatuko diren PNG eta SVG irudien zerrenda" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Irteera anitzeko modua" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Kubo anitz" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Hurrengo diapositiba" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Kubo handian" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opakutasuna biratzean" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opakutasuna biratzen ez dabilenean" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Mahaigain leihoaren opakutasuna biratzean." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Mahaigain lehioaren opakutasuna biratzen ez dabilenean." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Kokatu leihoak kuboan" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Aurreko diapositiba" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Errendatu skydome" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Irudia eskalatu" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Eskalatu irudia kuboaren goi aurpegia estaltzeko" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Hautatu nola erakutsi kuboa irteera anitzeko gailuak erabiltzean." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Skydome" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Skydomeko gradientearen amaiera kolorea" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Skydomeko gradientearen hasiera kolorea" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Skydome irudia" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Abiadura" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "denbora-pausoa" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Gardentasuna saguaz biratzean bakarrik" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Kubo gardena" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Zabaldu" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Zabaldu kuboa" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus kontrol tresna" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Gaitu mipmaps sortzea dekorazio testurentzat" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Komandoa" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorazio leihoak" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Jadanik dekoratzailerik ez badago martxan, exekutatuko den komando lerroa" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Itzalaren X desplazamendua salto" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Itzalaren Y desplazamendua salto" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Itzalaren kolorea salto" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Itzalaren opakutasuna salto" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Itzalaren erradio salto" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Itzal Kolorea" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Itzalaren X desplazamendua" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Itzalaren Y desplazamendua" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Itzalaren opakutasuna" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Itzalaren Erradioa" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Leihoak itzaldu" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Leiho Dekorazioa" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Leiho dekorazioak" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Dekoratuko diren leihoak" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Itzala izango duten leihoak" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Distira (%tan) erantzuten ez duen leihoek" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Abiadura konstantea" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Denbora konstantea" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Erantzuten ez duten leihoen tamaina aldatu" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Leiho kudeatzailearen eskariei erantzuten ez duten leihoen tamaina aldatu" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Iraungitze modua" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Iraungi minimizatu/ireki/ixtean" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Iraungitze abiadura" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Iraungitze denbora" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Iraungitze efektua ondorengo leiho gertaeretan minimizatu/ireki/itxi" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Sistemako kanpaian iraungitze efektua" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Leihoak iraungiz agertu aukeratzean eta iraungiz desagertu aukeraketa " "galtzean" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Iraungi leihoak" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Leihoak iraungitzen" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Pantaila osoko ikus-kanpaia" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Pantaila osoko iraungitzea sistema kanpaiak jotzean" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Erantzuten ez duten leihoen saturazioa (%tan)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Erantzuten ez duen leiho distira" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Erantzuten ez duen leiho saturazioa" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Ikus-Kanpaia" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Leiho iraungitze modua" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Leiho iraungitze abiadura \"abiadura konstante\" moduan" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Leiho iraungitze denbora (ms) \"denbora konstante\" moduan" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Iraungitu beharreko leihoak" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Muntatze puntua" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Muntatze puntua" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Erabiltzailearen-espazio Fitxategi Sistema" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Erabiltzailearen-espazio fitxategi sistema" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf kontrol tresna" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib loop nagusiaren euskarria" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome bateragarritasuna" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Terminala zabaldu" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Compiz Gnome mahaigain inguruneaz bateragarriak egiten duten aukerak" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Exekuzio elkarrizketa" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Terminal komandoa exekutatu" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Pantaila-argazkia komando lerroa" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Ikus Menu Nagusia" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Ikus aplikazio exekuzio elkarrizketa" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Ikus menu nagusia" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Egin pantaila-argazkia" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Egin pantaila-argazkia leiho batena" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Terminal komando lerroa" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Leiho pantaila -argazki komando lerroa" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini fitxategi lauaren tresna" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Fitxategi aldaketaren jakinarazpen plugina" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig kontrol tresna" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Ikonotze Efektua" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Ikonotu leihoak" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Ikonotze abiadura" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Ikonotze denbora-pausoa" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Itzaltze Erresistentzia" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Itzaltze erresistentzia" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Eraldatu leihoak ikonotzean edo handitzean" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Leihoak ikonotzean eraldatuko dira" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Mugatu Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Mugatu Y koordenatua laneko areara" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "Ez eguneratu kokapena leiho zerbitzarian, mugitzen amaitu arte" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Hasi leiho mugimendua" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Kokapen alferra" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Leiho Mugimendua" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Leiho mugimendua" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Opakutasuna" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Mugitzen ari diren leihoaen opakutasuna" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Maximizatutako leihoak arrastatzean automatikoki askatu eta desmaximizatu" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Askatu maximizatutako leihoak" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Hasi leihoa mugitzen" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Distira" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Distira txikitu" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Distira handitu" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Distira pausoa" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Distira balioak leihoentzat" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Txikitu" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Handitu" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Opakutasuna txikitu" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Opakutasuna handitu" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Opakotasun pausoa" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Opakutasun balioa leihoentzat" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opakutasuna, distira eta saturazioa" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Opakutasun, distira eta saturazio doitzeak" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Saturazioa" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Saturazioa txikitu" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Saturazioa handitu" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Saturazio pausoa" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Saturazio balioa leihoentzat" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Pausoa" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Leiho zehatz ezarpenak" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Leihoaren balioak" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Leihoak" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Distira lehenetsi ezberdina izan behar duten leihoak" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Opakutasun lehenetsi ezberdina izan behar duten leihoak" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Saturazio lehenetsi ezberdina izan behar duten leihoak" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Leiho kokapenerako algoritmoa" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskadan" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Zentratua" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Leiho kokapen antolatua" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Behartu leihoen kokatzea" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Mahaigain aurkezpen horizontalen kokapena" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Mantendu lan arean" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Mantendu leiho kokapena lan arean, nahiz eta kokapen hau ez etorri bat " "kokapen zehatzaz" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Kokatu leihoak" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Kokatu irteera guztietan zehar " #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Kokatu leihoak toki egokian mapeatzerakoan" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Kokapen Modua" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Kokatutako leihoak" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Ausaz" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Hautatu nola kokatuko diren leihoak hainbat irteera gailu erabiltzen badira." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Adimentsua" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Irteera gailu aktiboa erabili" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Fokua duen leihoaren irteera gailua erabili" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Aukeratu irteera gailuan erakusleaz" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Mahaigain aurkezpen bertikalen kokapenak" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Mahaigain aurkezpenan kokatutako leihoak" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Leihoak kokatzeko konponbideak" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Berez kokatuko diren leihoak" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Mahaigain aurkezpen konkretuan berez kokatuko diren leihoak" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Kokatzera behartuko diren leihoak, nahiz eta leiho kudeatzaileak horiek " "kokatzea saihestu " #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Posizio zehaztuko leihoak" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Mahaigain aurkezpen zehaztuko leihoak" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Konponbideak" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X kokapenak" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X mahaigain aurkezpen kokapenak" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X kokapen balioak" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y kokapenak" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y mahaigain aurkezpen kokapenak" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y kokapen balioak" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png irudi kargatzailea" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex parekatzea" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex leiho parekatzea" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Laster-bideak" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Ertz Kolorea" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Kanpoko-lerro eta lauki tamaina aldaketa moduan ertz kolorea" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Lehenetsitako Tamaina aldaketa Modua" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Lehenetsitako modua leiho tamaina aldaketan" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Betetze Kolorea" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Kanpoko-lerro eta lauki tamaina aldaketa moduan betetze kolorea" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Hasi leiho tamaina aldatze normala" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Hasi kanpoko-lerro leiho tamaina aldaketa" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Hasi lauki leiho tamaina aldaketa" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Hasi tiratze leiho tamaina aldaketa" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Hasi Lehio Tamaina-aldaketa" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Leihoak Normal Tamainaz-aldatu" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Kanpo-lerroa" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Kanpo-lerroaz Tamaina-aldatu Leihoei" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Laukia" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Laukiaz Tamaina-aldatu Leihoei" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Tamaina-aldatu Leihoari" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Tamaina-aldatu leihoari" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Hasi tamaina-aldatzen leihoari" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Hasi tamaina-aldatzen leihoari tiratuz" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Hasi tamaina-aldatzen leihoari normal" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Hasi tamaina-aldatzen leihoari kanpo-lerroaz" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Hasi tamaina-aldatzen leihoari laukiaz" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Tiratu" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Tamaina-aldatu leihoei tiratuz" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Tamaina-aldatze normala erabiliko duten leihoak" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Tamaina-aldatzea kanpo-lerroaz egingo duten leihoak" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Tamaina-aldatzea laukiaz egingo duten leihoak" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Tamaina-aldatzea tiratuz egingo duten leihoak" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "DnD ertza irauli" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Mugitu Ertz Iraultzea" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Ertz Iraultze Erakuslea" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Iraultze Denbora" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Irauli ezkerreko mahaigain aurkezpen eta okertu erakuslea" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Irauli hurrengo mahaigain aurkezpenera, objektua pantaila ertzera " "arrastatzean" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Irauli hurrengo mahaigain aurkezpenera, erakuslea pantaila ertzera mugitzean" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Irauli hurrengo mahaigain aurkezpenera, leihoa pantaila ertzera mugitzean" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Irauli eskumako mahaigain aurkezpenera eta okertu erakuslea" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Alderantzikatu Y ardatza erakusle mugimendurako" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Alderantzikatu Y erakuslean" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Erakuslearen Sentikortasuna" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Altzatu biratzean" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Altzatu leihoa biratzean" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Biratu kuboa" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Biratu ezkerrera irauliz" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Biratu eskumara irauliz" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Ezkerrera biratu" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Ezkerrera biratu leihoaz" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Eskumara biratu" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Eskumara biratu leihoaz" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Nora Biratu" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "1 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "1 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "10 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "10 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "11 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "11 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "12 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "12 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "2 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "2 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "3 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "3 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "4 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "4 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "5 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "5 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "6 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "6 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "7 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "7 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "8 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "8 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "9 Aurpegira Biratu" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "9 Aurpegira Biratu Leihoaz" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Biratu kuboa" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Mahaigain kuboa biratu" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Ezkerrera biratu" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Ezkerrera biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Eskumara biratu" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Eskumara biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Biratu kubo aurpegira" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Biratu leihoa duen aurpegira" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "1 aurpegira biratu" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "1 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "10 aurpegira biratu" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "10 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "11 aurpegira biratu" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "11 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "12 aurpegira biratu" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "12 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "2 aurpegira biratu" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "2 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "3 aurpegira biratu" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "3 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "4 aurpegira biratu" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "4 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "5 aurpegira biratu" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "5 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "6 aurpegira biratu" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "6 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "7 aurpegira biratu" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "7 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "8 aurpegira biratu" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "8 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "9 aurpegira biratu" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "9 aurpegira biratu eta eraman leiho aktiboa" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Biratu mahaigain aurkezpena" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Biratu leihoa" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Biratu leihoaz" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Biratze azelerazioa" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Biratze abiadura" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Biratze denbora-pausua" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Biratze zoom" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Erakusle mugimenduaren sentikortasuna" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Atxiki kubo biratzea azpiko aurpegiari" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Atxiki kubo biratzea goiko aurpegiari" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Atxiki Azpiko Aurpegiari" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Atxiki Goiko Aurpegiari" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Hasi Biratzea" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Denbora-muga mahaigain aurkezpena irauli aurretik" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zoom" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Opakutasun kopurua ehunekotan" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Handia" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klikatu mahaigaina, mahaigaina ikusteko" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Ilundu atzeko-planoa" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Ilundu atzeko-planoa leihoak eskalatzean" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Ikurra" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Sartu Mahaigain Ikusteko moduan, eskalatzean mahaigaina klikatzean" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Nabarmentze Denbora" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Abiarazi Leiho Hautatzailea" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Abiarazi leiho hautatzailea leiho guztientzat" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Abiarazi leiho hautatzailea leiho taldearentzat" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Abiarazi leiho hautatzailea uneko irteerako leihoentzat" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Diseinua eta transformatzen hasi leiho guztiak" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Diseinua eta transformatzen hasi leiho taldea" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Diseinua eta transformatzen hasi leihoak" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Diseinua eta transformatzen hasi uneko irteerako leihoak" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Irteera gailu guztietan" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Uneko irteera gailuan" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Gainjarri Ikonoa" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Gainjarri ikonoa leihoetan eskalatu eta gero" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Eskalatu" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Eskalatu Lehioak" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Eskalatze abiadura" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Eskalatze denbora-pausoa" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Eskalatu lehioak" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Hautatu non eskalatuko diren leihoak hainbat irteera gailu erabiltzen badira." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Leiho arteko tartea" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Tartea" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Denbora (ms) eskalatze modua amaitzeko, erakuslea leiho gainetik pasatzean" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Eskalatze moduan eskalatuko diren leihoak" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Auomatikoki ireki pantaila argazkia aplikazio honetan" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Direktorioa" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Hasi laukizuzen pantaila argazkia" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Abiarazi aplikazioa" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Pantaila argazkiak direktorio honetan sartu" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Pantaila argazkia" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Pantaila argazkia plugin" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg irudi kargatzailea" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Distira kopurua ehunekotan" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Saturazio kopurua ehunekotan" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Aplikazio Aldatzailea" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Auto-biratu" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Eraman aurrealdera" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Eraman hautatutako leihoak aurrealdera" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Leihoak aldatzerakoan hurruntze zooma mahaigainari" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikonoa" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Ikonotua" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Hurrengo panela" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Hurrengo leihoa" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Hurrengo leihoa (Leiho guztiak)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Hurrengo leihoa (popup ez)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Popup aldatzailea bistara ez badago eta hautatu hurrengo leihoa" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Popup aldatzailea bistara ez badago eta hautatu hurrengo leihoa, leiho " "guztien artean" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Popup aldatzailea bistara ez badago eta hautatu aurreko leihoa" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Popup aldatzailea bistara ez badago eta hautatu aurreko leihoa, leiho " "guztien artean" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Aurreko panela" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Aurreko leihoa" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Aurreko leihoa (leiho guztiak)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Aurreko leihoa (popup ez)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Biratu hautatutako leihoa aldatu bitartean" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Hautatu hurrengo paneleko leiho mota." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Hautatu hurrengo leihoa popup leihoa ikusi gabe." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Hautatu aurreko paneleko leiho mota." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Hautatu aurreko leihoa popup leihoa ikusi gabe." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Erakutsi ikonoa koadro txiki ondoan." #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Erakutsi txikitutako leihoak" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Aldatzailearen abiadura" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Aldatzailearen denbora-pausoa" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Leiho aldatzailea" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Aldatzailean erakutsiko diren leihoak" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "hornitu YV12 colorspace euskarria" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Bideo Playback" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Bideo playback" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 colorspace" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Gehitu lerroa" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Gehitu puntua" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Gehitu ur efektuak mahaigain ezberdinen akzioei" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Euri-tanten arteko denbora (ms)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Gaitu erakuslearen ur efektuak" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Lerroa" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Eskala desplazamendua" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Puntua" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Euri atzerapena" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Uhin titulua" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Gaitu/ezgaitu euria" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Gaitu/ezgaitu euri efektua" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Gaitu/ezgaitu wiper" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Gaitu/ezgaitu wiper efektua" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Ur efektua" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Ur desplazamendu eskala" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Uhin efektua leiho titulutik" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Foku efektua" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Leiho foku efektua" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Leihoak enfokatu " #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Marruskadura" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Harrapatu leihoak" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Sareta erresoluzioa" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Leiho atxikitze alderantzikatua " #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Leihoak dardara egin dezala" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Map Efektua" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Map leiho efektua" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Map leihoak" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maximizatu efektua" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Sareta tamaina minimoa" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Vertex sareta tamaina minimoa" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Mugitu leihoak" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Dardara" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Atxikitze alderantzikatua" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Atxikitu leihoak" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Malguki marruskadura" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Malguki K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Malguki konstantea " #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Gaitu/ezgaitu leiho atxikitzea" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Erabili malguki modua dar-dar leiho efekturako" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Vertex sareta erresoluzioa" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Dar-dar egin behar duten leihoak enfokatzean" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Dar-dar egin behar duten leihoak eustean " #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Dar-dar egin behar duten leihoak mapatzean" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Dar-dar egin behar duten leihoak mugitzean" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Dar-dar efektua leihoak maximizatzean eta maximizatzea kentzean" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Dardara duten leihoak" #~ msgid "Command line 0" #~ msgstr "0 komando lerroa" #~ msgid "Run command 0" #~ msgstr "Exekutatu 0 komandoa" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Pantaila-argazkia komando lerroa" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Pantaila-argazkia komando lerroa" #~ msgid "Filter Linear" #~ msgstr "Iragazki lineala" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Erabili iragazki lineala zooma gerturatzean" #~ msgid "Zoom Desktop" #~ msgstr "Mahaigain zooma" #~ msgid "Zoom In" #~ msgstr "Zoom gerturatzea" #~ msgid "Zoom Out" #~ msgstr "Zoom urrundu" #~ msgid "Zoom Pan" #~ msgstr "Zoom pan" #~ msgid "Zoom Speed" #~ msgstr "Zoom abiadura" #~ msgid "Zoom Timestep" #~ msgstr "Zoom denbora-pausoa" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Zoom eta pan mahaigain kuboa" #~ msgid "Zoom factor" #~ msgstr "Zoom faktorea" #~ msgid "Zoom pan" #~ msgstr "Zoom pan" #~ msgid "Decrease window opacity" #~ msgstr "Txikitu leiho opakutasuna" #~ msgid "Increase window opacity" #~ msgstr "Handitu leiho opakutasuna" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Lehenetsita transluzidoak izango diren leihoentzako opakutasun balioak" #~ msgid "Opacity windows" #~ msgstr "Leihoen opakutasuna" #~ msgid "Background Images" #~ msgstr "Atzeko plano Irudiak" #~ msgid "Background images" #~ msgstr "Atzeko plano irudiak" #~ msgid "Place windows on a plane" #~ msgstr "Kokatu leihoak planoan" #~ msgid "Plane Down" #~ msgstr "Planoa Behera" #~ msgid "Plane Left" #~ msgstr "Planoa Ezkerrera" #~ msgid "Plane Right" #~ msgstr "Planoa Eskumara" #~ msgid "Plane To Face 1" #~ msgstr "Planoa 1 Aurpegira" #~ msgid "Plane To Face 10" #~ msgstr "Planoa 10 Aurpegira" #~ msgid "Plane To Face 11" #~ msgstr "Planoa 11 Aurpegira" #~ msgid "Plane To Face 12" #~ msgstr "Planoa 12 Aurpegira" #~ msgid "Plane To Face 2" #~ msgstr "Planoa 2 Aurpegira" #~ msgid "Plane To Face 3" #~ msgstr "Planoa 3 Aurpegira" #~ msgid "Plane To Face 4" #~ msgstr "Planoa 4 Aurpegira" #~ msgid "Plane To Face 5" #~ msgstr "Planoa 5 Aurpegira" #~ msgid "Plane To Face 6" #~ msgstr "Planoa 6 Aurpegira" #~ msgid "Plane To Face 7" #~ msgstr "Planoa 7 Aurpegira" #~ msgid "Plane To Face 8" #~ msgstr "Planoa 8 Aurpegira" #~ msgid "Plane To Face 9" #~ msgstr "Planoa 9 Aurpegira" #~ msgid "Plane Up" #~ msgstr "Planoa Gora" #~ msgid "Plane down" #~ msgstr "Planoa behera" #~ msgid "Plane left" #~ msgstr "Planoa ezkerrera" #~ msgid "Plane right" #~ msgstr "Planoa eskumara" #~ msgid "Plane to face 1" #~ msgstr "Planoa 1 aurpegira" #~ msgid "Plane to face 10" #~ msgstr "Planoa 10 aurpegira" #~ msgid "Plane to face 11" #~ msgstr "Planoa 11 aurpegira" #~ msgid "Plane to face 12" #~ msgstr "Planoa 12 aurpegira" #~ msgid "Plane to face 2" #~ msgstr "Planoa 2 aurpegira" #~ msgid "Plane to face 3" #~ msgstr "Planoa 3 aurpegira" #~ msgid "Plane to face 4" #~ msgstr "Planoa 4 aurpegira" #~ msgid "Plane to face 5" #~ msgstr "Planoa 5 aurpegira" #~ msgid "Plane to face 6" #~ msgstr "Planoa 6 aurpegira" #~ msgid "Plane to face 7" #~ msgstr "Planoa 7 aurpegira" #~ msgid "Plane to face 8" #~ msgstr "Planoa 8 aurpegira" #~ msgid "Plane to face 9" #~ msgstr "Planoa 9 aurpegira" #~ msgid "Plane up" #~ msgstr "Planoa gora" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Mahaigain leiho opakotasun iraungitze denbora." ./po/ml_IN.po0000644000004100000410000017045013246301623013226 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-04-09 13:21+0200\n" "Last-Translator: Jesse P Francis \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "പണിയിടം" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 #, fuzzy msgid "Compiz" msgstr "കോമ്പിസ്" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ഒന്നുമില്ല" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "ഉയര്‍ത്തുക" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "താഴ്ത്തുക" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" ./po/ta.po0000644000004100000410000017226413246301623012641 0ustar www-datawww-data# Tamil message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2003 SuSE Linux AG. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-04-06 14:41+0200\n" "Last-Translator: Prem \n" "Language-Team: Tamil \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "நிழலாக்கு" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "பெரிதாக்கு" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "சிறிதாக்கு" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "உயர்த்து" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" # IN #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "­ó¾¢Â¡" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # IN #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "­ó¾¢Â¡" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" # IN #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "­ó¾¢Â¡" # IN #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "­ó¾¢Â¡" # IN #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "­ó¾¢Â¡" # IN #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "­ó¾¢Â¡" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "¯Õº¢Â" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" # IN #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "­ó¾¢Â¡" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # IN #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "­ó¾¢Â¡" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" # IN #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "­ó¾¢Â¡" # IN #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "­ó¾¢Â¡" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "­ó¾¢Â¡" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "­ó¾¢Â¡" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" # IN #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "­ó¾¢Â¡" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" # IN #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "­ó¾¢Â¡" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" # ES #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "ͦÀ¢ý" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" # IN #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "­ó¾¢Â¡" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" # IN #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "­ó¾¢Â¡" # ES #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "ͦÀ¢ý" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" # ES #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "ͦÀ¢ý" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" # ES #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "ͦÀ¢ý" # ES #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ͦÀ¢ý" # ES #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ͦÀ¢ý" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "¯Õº¢Â" # ES #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "ͦÀ¢ý" # ES #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ͦÀ¢ý" ./po/cs.po0000644000004100000410000037426613246301623012650 0ustar www-datawww-data# translation of cs.po to # translation of compiz.po to # translation of cs.po to cs_CZ # This file is distributed under the same license as the PACKAGE package. # # Jakub Friedl, 2006. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Klara Cihlarova , 2006. # Jakub Friedl , 2006. msgid "" msgstr "" "Project-Id-Version: cs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-02-11 17:23+0100\n" "Last-Translator: Tomas Hejatko \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Plocha" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Správce oken" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Nic" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Měřítko" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maximalizovat" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maximalizovat okno horizontálně" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maximalizovat okno vertikálně" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimalizované" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Automaticky do popředí" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Nabídka okna" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Událost při rolování nad titulkem okna" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Typ rozmazání" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Průhlednost aktivního okna" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Průhlednost stínu aktivního okna" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Průhlednost tématu metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Průhlednost stínu tématu metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Průhlednost pro aktivní okna s tématem metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Průhlednost pro témata metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Událost při rolování nad titulkem okna" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Typ rozmazání použitého pro dekoraci oken" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Použít téma metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Použít téma metacity pro vykreslování dekorací oken" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Zavřít okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Zrušit maximalizaci okna" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maximalizovat okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimalizovat okno" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" # nebo něco jako vizuální doprovod, ukazovátko? #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Anotace" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Barva anotace" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktivní moduly" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Vymazat" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Vykreslit" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Vykreslit použitím nástroje" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Iniciovat" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Iniciovat změnu velikosti okna" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Iniciovat změnu velikosti okna" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Iniciovat" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Šířka linky" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Šířka linky pro anotaci" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Lineární filtr" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Škálovat okna" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Škálovat okna" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Filtr textur" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Sytost" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Sytost" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Rychlost sbalení" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Rozmístit okna" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Sytost" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Škálovat okna" #: ../metadata/blur.xml.in.h:12 #, fuzzy msgid "Blur windows that doesn't have focus" msgstr "Typy oken, která se mají rozhoupat při zaměření" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Škálovat okna" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Škálovat okna" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr "Efekt zaměření" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Rychlost blednutí okna" #: ../metadata/blur.xml.in.h:30 #, fuzzy msgid "Windows that should be affected by focus blur" msgstr "Typy oken, která mohou blednout" #: ../metadata/blur.xml.in.h:31 #, fuzzy msgid "Windows that should be use alpha blur by default" msgstr "Typy oken, která mohou blednout" #: ../metadata/clone.xml.in.h:1 #, fuzzy msgid "Clone Output" msgstr "Výstupy" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Pořídit snímek obrazovky" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové zkratky, které spustí příkaz určený command10" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové zkratky, které spustí příkaz určený command1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové zkratky, které spustí příkaz určený command10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové zkratky, které spustí příkaz určený command11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové zkratky, které spustí příkaz určený command2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové zkratky, které spustí příkaz určený command3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové zkratky, které spustí příkaz určený command4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové zkratky, které spustí příkaz určený command5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové zkratky, které spustí příkaz určený command6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové zkratky, které spustí příkaz určený command7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové zkratky, které spustí příkaz určený command8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové zkratky, které spustí příkaz určený command9" #: ../metadata/commands.xml.in.h:13 #, fuzzy msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové zkratky, které spustí příkaz určený command10" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové zkratky, které spustí příkaz určený command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové zkratky, které spustí příkaz určený command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové zkratky, které spustí příkaz určený command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové zkratky, které spustí příkaz určený command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové zkratky, které spustí příkaz určený command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové zkratky, které spustí příkaz určený command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové zkratky, které spustí příkaz určený command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové zkratky, které spustí příkaz určený command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové zkratky, které spustí příkaz určený command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové zkratky, které spustí příkaz určený command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové zkratky, které spustí příkaz určený command9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "Klávesové zkratky, které spustí příkaz určený command10" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "Klávesové zkratky, které spustí příkaz určený command1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "Klávesové zkratky, které spustí příkaz určený command10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "Klávesové zkratky, které spustí příkaz určený command11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "Klávesové zkratky, které spustí příkaz určený command2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "Klávesové zkratky, které spustí příkaz určený command3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "Klávesové zkratky, které spustí příkaz určený command4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "Klávesové zkratky, které spustí příkaz určený command5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "Klávesové zkratky, které spustí příkaz určený command6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "Klávesové zkratky, které spustí příkaz určený command7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "Klávesové zkratky, které spustí příkaz určený command8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "Klávesové zkratky, které spustí příkaz určený command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Příkazová řádka 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Příkazová řádka 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Příkazová řádka 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Příkazová řádka 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Příkazová řádka 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Příkazový řádek 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Příkazová řádka 3" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Příkazová řádka 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Příkazová řádka 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Příkazová řádka 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Příkazová řádka 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Příkazová řádka 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Příkaz, který se vykoná, pokud je v shellu volán run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Příkaz" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Spustit příkaz 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Spustit příkaz 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Spustit příkaz 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Spustit příkaz 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Spustit příkaz 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Spustit příkaz 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Spustit příkaz 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Spustit příkaz 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Spustit příkaz 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Spustit příkaz 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Spustit příkaz 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Spustit příkaz 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktivní moduly" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Povolit vykreslování celoobrazovkových oken bez přesměrování do " "mimoobrazovkových pixmap" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Akustický zvonek" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Slyšitelné systémové pípnutí" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Automaticky do popředí" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Prodleva automatického přesunu do popředí" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatická detekce výstupních zařízení" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatická detekce obnovovací frekvence" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Nejlepší" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Kliknutí k zaměření" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Kliknutím na okno přesunout zaměření na okno" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Zavřít aktivní okno" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Výchozí ikona" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Výchozí ikona okna" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Kostka plochy" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Detekovat výstupy" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Zjistit obnovovací frekvenci" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rychlé" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Typy okna pro efekt při zaměření" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "Typy okna pro efekt při zaměření" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Typy okna pro efekt při zaměření" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Hlavní nastavení" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Hlavní nastavení compizu" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Dobré" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skrýt okna nepřítomná v liště úloh" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skrýt všechna okna a zaměřit na plochu" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Skrýt okna nepřítomná v liště úloh při vstupu do režimu zobrazení plochy" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Vodorovná virtuální velikost" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Při maximalizaci ignorovat tipy" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Při maximalizaci ignorovat tipy k přírůstku velikosti a poměru" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Interval před přenesením vybraných oken do popředí" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Interval pro odeslání pingu" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Světlo" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Seznam právě aktivních modulů" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Seznam řetězců, které popisují výstupní zařízení" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Dát okno do pozadí" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Přesunout okno do pozadí" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maximalizovat okno horizontálně" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maximalizovat okno vertikálně" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maximalizovat aktivní okno" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maximalizovat aktivní okno horizontálně" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maximalizovat aktivní okno vertikálně" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimalizovat aktivní okno" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Běžná" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Počet ploch" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Počet virtuálních ploch" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Provádět aktualizace obrazovky pouze během intervalu vertikálního zatemnění" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Výstupy" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Prodleva pingu" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Dát do popředí při kliknutí" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Přenést okno do popředí" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Dát vybraná okna do popředí po uplynutí intervalu" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Přesunout okno nad ostatní okna" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Dát okna do popředí při kliknutí" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Obnovovací frekvence" #: ../metadata/core.xml.in.in.h:74 #, fuzzy msgid "Screen size multiplier for horizontal virtual size" msgstr "Násobek vodorovné virtuální velikosti obrazovky" #: ../metadata/core.xml.in.in.h:75 #, fuzzy msgid "Screen size multiplier for vertical virtual size" msgstr "Násobek svislé virtuální velikosti obrazovky" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Zobrazit plochu" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Pomalé animace" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "Chytrý" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synchronizovat při VBlank " #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Filtrování textur" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Filtr textur" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Filtrování textur" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Rychlost překreslování obrazovky (počet/s)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Přepnout maximalizaci okna" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Přepnout okno maximalizované horizontálně" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Přepnout okno maximalizované vertikálně" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Přepnout stínování okna" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Přepnout maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Přepnout horizontální maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Přepnout vertikální maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Přepnout stínování aktivního okna" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Přepnout použití pomalých animací" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Zrušit maximalizaci aktivního okna" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Unredirect Fullscreen Windows" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Použít rozptýlené světlo při transformaci okna" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Svislá virtuální velikost" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akcelerace" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Přizpůsobit obrázek" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Přizpůsobit vrchní obrázek rotaci" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Postoupit k dalšímu snímku" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animovat nebeskou báň" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animovat nebeskou báň při rotaci kostky" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Automaticky do popředí" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Barva vrchní a spodní strany kostky" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Barva, která se použije na dolní část gradientu nebeské báně." #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Barva, která se použije na horní část gradientu nebeské báně." #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Barva kostky" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Barva kostky" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Kostka plochy" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Zrychlení sbalení" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Rychlost sbalení" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Časový krok sbalení" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Jeli to možné, vytvářet pro kvalitní škálování mipmapy" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Jít zpět na předchozí snímek" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Obrázkové soubory" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Obrázek pro texturu nebeské báně" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Iniciovat průhlednost kostky pouze pokud je rotace řízena myší" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Uvnitř kostky" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "V kostce" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Seznam PNG a SVG souborů, které mají být vykresleny na vrchu kostky" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Další snímek" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "V kostce" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Krytí během rotace" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Krytí bez rotace" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Krytí (neprůhlednost) ploch kostky během rotace." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Krytí (neprůhlednost) ploch kostky." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Rozmístit okna na kostku" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Předchozí snímek" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Vykreslit nebeskou báň" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Škálovat obrázek" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Změnit velikost obrázků podle vrchu kostky" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Možnosti zobrazení kostky, pokud je použito víc výstupních zařízení." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Nebeská báň" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Konečná barva gradientu nebeské báně" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Počáteční barva gradientu nebeské báně" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Obrázek nebeské báně" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Rychlost" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Časový krok" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Průhlednot pouze při rotování za pomoci myši" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Rozbalit" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Rozbalit kostku" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Ovládací backend Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Příkaz" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorovaná okna" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Příkazová řádka programu pro dekorace, která je spuštěna, pokud ještě není " "spuštěn žádný program pro dekorace" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Posun vrženého stínu X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Posun vrženého stínu Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Barva vrženého stínu" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Krytí vrženého stínu" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Poloměr vrženého stínu" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Barva stínu" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Posun stínu X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Posun stínu Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Krytí stínu" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Poloměr stínu" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Stínované okna" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Dekorace oken" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Dekorace oken" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Typy oken, která mohou být dekorovány" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Typy oken, která mohou mít stín" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rychlost otáčení" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Omezení Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normálně měněné okna" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Doba zprůhlednění" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Slábnout pří minimalizaci/otevření/zavření" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Rychlost blednutí" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Doba zprůhlednění" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Efekt slábnutí okna pří událostech : Minimalizace/Otevření/Zavření" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Efekt blednutí při systémovém pípnutí" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "Blednutí mapovaných oken a materializace oken nemapovaných" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Blednutí" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Slábnutí oken" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Celoobrazovkový vizuální zvonek" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Celoobrazovkový efekt slábnutí při systémovém pípnutí" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Vizuální zvonek" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Rychlost blednutí okna" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Typy oken, které budou zobrazeny v režimu škálování" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Typy oken, která mohou blednout" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Přípojný bod" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Přípojný bod" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Uživatelský souborový systém" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Uživatelský souborový systém" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Kontrolní backend GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Podpora hlavního napojení na GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Otevřít terminál" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Spustit dialog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Příkaz pro otevření terminálu" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Screenshot command line" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Zobrazit hlavní nabídku" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Zobrazit dialog spouštění aplikace" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Zobrazit hlavní nabídku" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Pořídit snímek obrazovky" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Pořídit snímek okna" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Příkaz pro otevření terminálu" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Window screenshot command line" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Neměnit" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Modul upozornění změny soubou" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kontrolní backend Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Efekt minimalizace" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimalizovatelná okna" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Rychlost minimalizace" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Časový krok minimalizace" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Stálost stínu" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Stálost stínu" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Transformovat okna při jejich minimalizaci a zrušení minimalizace" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Typy oken, která se mají při minimalizaci transformovat" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Omezení Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Omezení Y souřadnice na pracovní prostor" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "Aktualizovat pozici okna až při ukončení přesunu" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Iniciovat přesun okna" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "\"Líné\" přesouvání" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Přesunout okno" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Přesunout okno" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Krytí" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Úroveň krytí přesouvaných oken" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Snapoff and auto unmaximized maximized windows when dragging" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Odtrhávat maximalizovaná okna" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Zahájit pohyb okna" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Jas" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Jas" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Jas" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Jas" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Snížit krytí" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Zvýšit krytí" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Krok změny krytí" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Krok změny krytí" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Krok krytí" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Úroveň krytí přesouvaných oken" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Krytí během rotace" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Sytost" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Sytost" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Sytost" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Sytost" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Dekorace oken" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Typy oken" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Mapované" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Okna, které budou implicitně rozmístěny" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Typy oken, která mohou blednout" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Okna, které budou implicitně rozmístěny" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmus použitý pro rozmístění oken" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Kaskáda" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Centrovaný" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Správce oken" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Typy okna pro efekt při zaměření" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Vodorovná virtuální velikost" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Rozmístit okna" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Umístit mapovaná okna na odpovídající pozice" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Rozmístění oken" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Pozicované okna" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Náhodný" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Vyberte kde jsou okna zobrazeny, pokud je použito více výstupních zařízení" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Chytrý" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "Na všech výstupních výstupních zařízeních" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Vodorovná virtuální velikost" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Zobrazit minimalizovaná okna" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Nouzová řešení umístění oken" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Okna, které budou implicitně rozmístěny" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Okna, které budou implicitně rozmístěny na určitou plochu" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Dekorace oken" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Řešení problémů" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Pozice X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Pozice plochy na ose X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Hodnoty pozice na ose X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Pozice Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Pozice plochy na ose Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Hodnoty pozice na ose Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Podpora obrázkového formátu PNG" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regexpy" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Podpora regulárních výrazů pro určení typu oken" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Barva okraje" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Barva okraje použitá pro obrysové a překrývací typy změny velikosti" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Výchozí mód změny velikosti" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Vývhozí mód použití při změně velikosti oken" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Výplňová barva" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Barva použitá pro překrytí plochy okna při použití obrysové změny velikosti " "okna" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Iniciovat normální změnu velikosti okna" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Iniciovat obrysovou změnu velikosti okna" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Iniciovat změnu velikosti okna překrytím" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Iniciovat změnu velikosti okna rozpětím" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Iniciovat změnu velikosti okna" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normálně měněné okna" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Obrysové" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Obrysová změna velikosti okna" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Překrytí" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Změnit velikost okna překrytím" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Změnit velikost okna" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Změnit velikost okna" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Zahájit změnu velikosti okna" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Zahájit změnu velikosti okna rozpětím" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Zahájit změnu velikosti okna normálně" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Zahájit změnu velikosti okna obrysem" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Zahájit změnu velikosti okna překrytím" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Rozpětí" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Rozpětím změnit velikost okna" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Typy oken, která budou měnit velikost normálně" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Typy oken, která budou měnit velikost s efektem obrysu" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Typy oken, která budou měnit velikost s efektem překrytí" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Typy oken, která budou měnit velikost s efektem rozpětí" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Překlápění hran DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Překlápění hran při přesunu" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Překlápění hran ukazatelem" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Doba překlopení" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Překlopit na levé zorné pole a zdeformovat ukazatel" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Překlopit na další viewport při přetažení objektu na hranici obrazovky" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Překlopit na další viewport při umístění ukazatele na hranici obrazovky" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Překlopit na další viewport při přesunu okna na hranici obrazovky" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Překlopit na pravé zorné pole a zdeformovat ukazatel" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Invertovat osu Y pro pohyb ukazatele" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Pointer Invert Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Citlivost ukazatele" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 #, fuzzy msgid "Raise window when rotating" msgstr "Dát okna do popředí při kliknutí" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Otočit kostkou" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Otočit překlopením vlevo" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Otočit překlopením vpravo" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Otočit vlevo" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Otočit vlevo s oknem" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Otočit vpravo" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Otočit vpravo s oknem" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Otočit na" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Otočit na stranu 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Rotovat na stranu 1 s oknem" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Otočit na stranu 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Rotovat na stranu 10 s oknem" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Otočit na stranu 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Otočit na stranu 11 s oknem" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Otočit na stranu 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Otočit na stranu 12 s oknem" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Otočit na stranu 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Otočit na stranu 2 s oknem" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Otočit na stranu 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Otočit na stranu 3 s oknem" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Otočit na stranu 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Otočit na stranu 4 s oknem" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Otočit na stranu 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Otočit na stranu 5 s oknem" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Otočit na stranu 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Otočit na stranu 6 s oknem" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Otočit na stranu 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Otočit na stranu 7 s oknem" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Otočit na stranu 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Otočit na stranu 8 s oknem" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Otočit na stranu 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Otočit na stranu 9 s oknem" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Otočit kostkou" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Otočit kostkou ploch" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Otočit vlevo" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Otočit vlevo a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Otočit vpravo" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Otočit vpravo a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Otočit na stranu 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Rotovat na stranu 1 s oknem" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Otočit na stranu 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Otočit na stranu 1 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Otočit na stranu 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Otočit na stranu 10 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Otočit na stranu 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Otočit na stranu 11 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Otočit na stranu 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Otočit na stranu 12 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Otočit na stranu 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Otočit na stranu 2 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Otočit na stranu 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Otočit na stranu 3 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Otočit na stranu 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Otočit na stranu 4 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Otočit na stranu 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Otočit na stranu 5 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Otočit na stranu 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Otočit na stranu 6 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Otočit na stranu 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Otočit na stranu 7 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Otočit na stranu 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Otočit na stranu 8 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Otočit na stranu 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Otočit na stranu 9 a vzít aktivní okno s sebou" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Otočit na zorné pole" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Otočit okno" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Otočit s oknem" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Zrychlení otáčení" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rychlost otáčení" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Časový krok otáčení" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Rychlost otáčení" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Citlivost pohybu ukazatele" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "Přichytávat otáčející se kostku za horní stranu" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Přichytávat otáčející se kostku za horní stranu" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "Přichytávat k horní straně" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Přichytávat k horní straně" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Zahájit otáčení" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Časový limit před překlopením zorného pole" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Zvětšení" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Hodnota krytí v procentech" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Velká" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Ztmavit pozadí" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Ztmavit pozadí při škálování oken" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Symbol" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Čas vznášení" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Spustit výběr oken" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Spustit výběr oken pro všechna okna" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Spustit výběr oken pro skupinu oken" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Spustit výběr oken pro okna na aktuálním výstupu" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Rozvržení a počátek transformace všech oken" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Rozvržení a počátek transformace skupiny oken" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Rozvržení a počátek transformace oken" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Rozvržení a počátek transformace oken na aktuálním výstupu" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "Na všech výstupních výstupních zařízeních" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "Na aktuálním výstupním zařízení" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Překrýt ikonou" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Překrýt okna ikonou, pokud je změněna jejich velikost" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Měřítko" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Škálovatelné okna" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Rychlost změny velikosti" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Časový krok změny velikosti" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Škálovat okna" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Vyberte kde jsou okna zobrazeny, pokud je použito více výstupních zařízení" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mezera mezi okny" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mezery" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Udává dobu (v ms) před ukončením režimu změny velikosti, pokud je ukazatel " "umístěn nad oknem" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Typy oken, které budou zobrazeny v režimu škálování" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Automaticky otevřít snímek v této aplikaci" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Adresář" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Pořídit snímek obrazovky" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Spustit aplikaci : " #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Uložit snímek obrazovky do této složky" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Snímek obrazovky" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Modul snímku obrazovky" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "SVG" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Podpora obrázkového formátu SVG" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Hodnota jasu v procentech" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Hodnota sytosti v procentech" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Přepínač aplikací" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Automaticky do popředí" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Přenést na popředí" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Přenést vybrané okno na popředí" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Vzdálená plocha může být při přepínání oken oddálena" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikona" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimalizované" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Kostka plochy" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Další okno" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Další okno(všechna okna)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Další okno (bez přepínače)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Zobrazit přepínač, pokud není viditelný, a vybrat další okno" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Zobrazit přepínač, pokud není viditelný, a vybrat další okno ze všech oken" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Zobrazit přepínač, pokud není viditelný, a vybrat předchozí okno" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Zobrazit přepínač, pokud není viditelný, a vybrat předchozí okno ze všech " "oken" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Předchozí snímek" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Předchozí okno" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Předchozí okno(všechna okna)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Předchozí okno (bez přepínače)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Zobrazovat vybrané okna při přepínání" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Vybrat další okno" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Vybrat další okno bez zobrazení přepínače" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Vybrat předchozí okno" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Vybrat předchozí okno bez zobrazení přepínače" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Zobrazit ikonu vedle náhledu" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Zobrazit minimalizovaná okna" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Rychlost přepínače" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Časový krok přepínače" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Škálovat okna" #: ../metadata/switcher.xml.in.h:41 #, fuzzy msgid "Windows that should be shown in switcher" msgstr "Typy oken, která mají být zobrazena v přepínači" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Přehrávání videa" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Přehrávání videa" #: ../metadata/video.xml.in.h:4 #, fuzzy msgid "YV12 colorspace" msgstr "Barevné schéma YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Přidat čáru" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Přidat bod" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Do různých akcí plochy přidává efekt vody" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Zpoždění (v ms) mezi jednotlivými kapkami" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Povolit vodní efekty ukazatele" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Čára" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Offset Scale" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Bod" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Zpoždění deště" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Vlna v nadpisu" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Přepnout déšť" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Přepnout efekt deště" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Přepnout stěrač" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Přepnout efekt stěrače" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vodní efekt" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Měřítko odsazení vody" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Efekt vlny v nadpisu okna" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Efekt zaměření" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Efekt zaměření oken" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Typy oken pro efekt při zaměření" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Tření" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Typy oken pro efekt při uchopení" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Rozlišení mřížky" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Invertované přichytávání oken" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Rozechvět okno" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Efekt mapování" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Efekt mapování oken" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Mapované" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Efekt maximalizace" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimální velikost mřížky" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimální velikost vrcholů mřížky" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Přesunované" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Chvění" # 52895 AttribValues/label #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Invertované přichytávání" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Přichytávat okna" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Tření pružiny" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Pružina K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Konstanta pružiny" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Přepnout přichytávání oken" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Pro efekt rozhoupání okna použít pružinový model" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Rozlišení vrcholů mřížky" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Typy oken, která se mají rozhoupat při zaměření" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Typy oken, která se mají rozhoupat při uchopení" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Typy oken, která se mají rozhoupat při mapování" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Typy oken, která se mají rozhoupat při přesunu" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Vlnivý efekt" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Vlnící se okna" #~ msgid "Command line 0" #~ msgstr "Příkazová řádka 0" #~ msgid "Run command 0" #~ msgstr "Spustit příkaz 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Screenshot command line" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Screenshot command line" #~ msgid "Filter Linear" #~ msgstr "Lineární filtr" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Při přiblížení používat lineární filtr" #~ msgid "Zoom Desktop" #~ msgstr "Přiblížit plochu" #~ msgid "Zoom In" #~ msgstr "Přiblížit" #~ msgid "Zoom Out" #~ msgstr "Oddálit" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Přiblížit" #~ msgid "Zoom Speed" #~ msgstr "Rychlost přiblížení" #~ msgid "Zoom Timestep" #~ msgstr "Časový krok přiblížení" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Přiblížit a posunout kostku ploch" #~ msgid "Zoom factor" #~ msgstr "Násobek přiblížení" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Přiblížit" #~ msgid "Decrease window opacity" #~ msgstr "Snížit krytí oken" #~ msgid "Increase window opacity" #~ msgstr "Zvýšit krytí okna" #~ msgid "Opacity window values" #~ msgstr "Hodnoty průhlednosti pro okna" #~ msgid "Opacity windows" #~ msgstr "Průhledné okna" #~ msgid "Background Images" #~ msgstr "Obrázky pozadí" #~ msgid "Background images" #~ msgstr "Obrázky na pozadí" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Rozmístit okna na kostku" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Rozmístit okna" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Otočit vlevo" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Otočit vpravo" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Rozmístit okna" #, fuzzy #~ msgid "Plane down" #~ msgstr "Rozmístit okna" #, fuzzy #~ msgid "Plane left" #~ msgstr "Otočit vlevo" #, fuzzy #~ msgid "Plane right" #~ msgstr "Otočit vpravo" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane up" #~ msgstr "Rozmístit okna" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Doba, za kterou zprůhlední pozadí ploch kostky" #~ msgid "Open window menu" #~ msgstr "Otevřít nabídku okna" #~ msgid "Dock" #~ msgstr "Dok" #~ msgid "Toolbar" #~ msgstr "Lišta nástrojů" #~ msgid "Menu" #~ msgstr "Nabídka" #~ msgid "Utility" #~ msgstr "Nástroj" #~ msgid "Splash" #~ msgstr "Úvodní okno" #~ msgid "Dialog" #~ msgstr "Dialogové okno" #~ msgid "DropdownMenu" #~ msgstr "Rozevírací nabídka" #~ msgid "PopupMenu" #~ msgstr "Místní nabídka" #~ msgid "Tooltip" #~ msgstr "Popisek" #~ msgid "Notification" #~ msgstr "Oznámení" #~ msgid "Combo" #~ msgstr "Pole se seznamem" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "Modální dialogové okno" #~ msgid "Fullscreen" #~ msgstr "Celá obrazovka" #~ msgid "Unknown" #~ msgstr "Neznámé" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command1" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command10" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command11" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command2" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command3" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command4" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command5" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command6" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command7" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command8" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command9" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "Hodnota jasu v procentech" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "Hodnota krytí v procentech" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "Hodnota sytosti v procentech" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Sytost" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "Zpoždění (v ms) mezi jednotlivými kapkami" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "Vzdálená plocha může být při přepínání oken oddálena" #~ msgid "Do not modify" #~ msgstr "Neměnit" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "Posun vrženého stínu X" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "Posun vrženého stínu Y" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "Krytí vrženého stínu" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Poloměr vrženého stínu" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "Efekt při zaměření okna (None, Shiver)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Vybrat předchozí okno" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Zrychlení sbalení (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Rychlost sbalení (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Časový krok sbalení (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "Interval před přenesením vybraných oken do popředí" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "Rozvržení a počátek transformace oken na aktuálním výstupu" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Efekt mapování okna (None, Shiver)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Rychlost minimalizace (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Rychlost minimalizace (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Minimální velikost vrcholů mřížky" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Počet virtuálních ploch" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Krok změny krytí" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Úroveň krytí přesouvaných oken" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Úroveň krytí přesouvaných oken" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "Překrýt okna ikonou, pokud je změněna jejich velikost" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Plugins that this must load before" #~ msgstr "Moduly, které musí být tímto předem načteny" #~ msgid "Plugins that this requires" #~ msgstr "Moduly, které jsou tímto vyžadovány" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Zobrazit přepínač, pokud není viditelný, a vybrat další okno ze všech oken" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Zobrazit přepínač, pokud není viditelný, a vybrat další okno ze všech oken" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Zobrazit přepínač, pokud není viditelný, a vybrat předchozí okno ze všech " #~ "oken" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Zobrazit přepínač, pokud není viditelný, a vybrat předchozí okno ze všech " #~ "oken" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Zrychlení sbalení (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Rychlost přiblížení (0.1-50)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Časový krok přiblížení (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Rychlost škálování (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Časový krok škálování (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "Násobek vodorovné virtuální velikosti obrazovky" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "Násobek svislé virtuální velikosti obrazovky" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "Citlivost pohybu ukazatele" #~ msgid "Shade resistance (0-100)" #~ msgstr "Stálost stínu (0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Mezera mezi okny" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Tření pružiny" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Konstanta pružiny" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Rychlost škálování (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "Časový krok škálování (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Filtrování textur (Rychlé, Dobré, Nejlepší)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "Rychlost překreslování obrazovky (počet/s)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "" #~ "Udává dobu (v ms) před ukončením režimu změny velikosti, pokud je " #~ "ukazatel umístěn nad oknem" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "Časový limit před překlopením zorného pole" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "Při přiblížení používat lineární filtr" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Rozlišení vrcholů mřížky" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Měřítko odsazení vody" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Rychlost blednutí okna" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Rychlost blednutí okna" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "Typy oken, která mají měnit velikost v režimu změny velikosti" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "Typy oken, která mají být zobrazena v přepínači" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "Typy oken, která se mají při minimalizaci transformovat" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "Typy oken, která mohou blednout" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "Typy oken, která se mají rozhoupat při zaměření" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "Typy oken, která se mají rozhoupat při uchopení" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "Typy oken, která se mají rozhoupat při mapování" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "Typy oken, která se mají rozhoupat při přesunu" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "" #~ "Horké oblasti pro spuštění režimu škálování (Vlevo nahoře, Vpravo nahoře, " #~ "Vlevo dole, Vpravo dole)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Rychlost přiblížení (0.1-50)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Časový krok přiblížení (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Násobek přiblížení" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Otočit na stranu %d" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Otočit na stranu %d s oknem" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "Otočit na stranu %d a přenést s sebou aktivní okno" #~ msgid "Rotate To Face %d" #~ msgstr "Otočit na stranu %d" #~ msgid "Rotate to face %d" #~ msgstr "Otočit na stranu %d" #~ msgid "Rotate To Face %d with Window" #~ msgstr "Otočit na stranu %d s oknem" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "Otočit na stranu %d a přenést s sebou aktivní okno" #~ msgid "Command line %d" #~ msgstr "Příkazová řádka %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "" #~ "Příkaz, který se vykoná, pokud je v shellu volán příkaz run_command%d" #~ msgid "Run command %d" #~ msgstr "Spustit příkaz %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "Klávesové zkratky, které spustí příkaz určený command%d" #~ msgid "Move Window Types" #~ msgstr "Typy oken pro efekt při přesunu" #~ msgid "Corners" #~ msgstr "Rohy" #~ msgid "Focus window when mouse moves over them" #~ msgstr "Změřit okno, když se nad něj přesune myš" #~ msgid "Initiate All Windows" #~ msgstr "Iniciovat všechna okna" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "Iniciovat přesun okna klávesnice" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "Iniciovat změnu velikosti okna klávesnice" #~ msgid "Initiate Window Switcher" #~ msgstr "Spustit přepínač oken" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "Modifikátor pro zobrazení přepínače všech oken" #~ msgid "Return from scale view" #~ msgstr "Návrat ze škálovaného pohledu" #~ msgid "Show switcher" #~ msgstr "Zobrazit přepínač" #~ msgid "Sloppy Focus" #~ msgstr "Sloppy Focus" #~ msgid "Start moving window using keyboard" #~ msgstr "Zahájit pohyb okna z klávesnice" #~ msgid "Terminate" #~ msgstr "Ukončit" #~ msgid "Water effect on system beep" #~ msgstr "Vodní efekt při systémovém zvonku" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které mají blednout (Desktop, Dock, Toolbar, Menu, Utility, " #~ "Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "Typy oken, které mají být transformovány při minimalizaci (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které mají být škálovány v režimu škálování (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které mají být zobrazeny v přepínači (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se při zaměření mají rozhoupat (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se při uchopení mají rozhoupat (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se při mapování mají rozhoupat (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "Typy oken, které se při přesouvání mají rozhoupat (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgid "Wobble effect on system beep" #~ msgstr "Efekt rozhoupání při systémovém pípnutí" ./po/et.po0000644000004100000410000022542713246301623012645 0ustar www-datawww-data# translation of # Copyright (C) 2006 SUSE Linux Products GmbH. # Estonian message file for YaST2 (@memory@). # msgid "" msgstr "" "Project-Id-Version: autoinst.fi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2003-09-22 13:26+0200\n" "Last-Translator: Ain Vagula \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Töölauad" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Aken" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Puudub" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Vali &pilt" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Mitteaktiivne vajutatud:" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Töölaua efektid" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Mitteaktiivne vajutatud:" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Aken" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Kiirus:" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Kas kasutada animeeritud aknaid?" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Lähtestamine" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Värvid" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Aktiivne vajutatud:" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "P_uhasta" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Lähtestamine" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Käivita Windows" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Käivita Windows" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Lähtestamine" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filtreeri seda kausta" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Määra filter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Häälestamine" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Häälestamine" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Kiirus:" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Häälestamine" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Käivita Windows" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Vene" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Venemaa Föderatsioon" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Vene" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Venemaa Föderatsioon" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Vene" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 #, fuzzy msgid "Pulse effect" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows NT" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Videorežiimi valimine" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Käsk tagastas '%1' : %2" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Käsku pole antud" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Tundmatu käsk " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Tundmatu käsk " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Aktiivne vajutatud:" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "Failisüsteem" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 #, fuzzy msgid "Automatic detection of output devices" msgstr "Automaatne tuvastamine" #: ../metadata/core.xml.in.in.h:8 #, fuzzy msgid "Automatic detection of refresh rate" msgstr "Automaatne tuvastamine" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 #, fuzzy msgid "Close active window" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Vaikeruuting" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Töölauad" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "X Window süsteem" #: ../metadata/core.xml.in.in.h:25 #, fuzzy msgid "Focus Prevention Windows" msgstr "X Window süsteem" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "X Window süsteem" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Horisontaalne" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "ZEN-partitsiooni lubamine" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Käivita Windows" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 #, fuzzy msgid "Maximize active window" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 #, fuzzy msgid "Minimize active window" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normaalne" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Kaugtöölaud" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Kaugtöölaud" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Käivita Windows" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Värskenda" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Töölauad" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Animatsioon" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Määra filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "Määra filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Määra filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 #, fuzzy msgid "Toggle Window Shaded" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 #, fuzzy msgid "Unmaximize active window" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D kiirenduse aktiveerimine" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "Täiustatud jõudluse kontroll" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "Lähtestamine" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Värvid" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Värvid" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Töölauad" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D kiirenduse aktiveerimine" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Kiirus:" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Töölauad" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "Eelmine" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "tekstirežiim" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "Käivita Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "Eelmine" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "Vali &pilt" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Vali &pilt" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Vali &pilt" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Kiirus:" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Töölauad" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Käsku pole antud" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Käivita Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Käivita Windows" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "MShadow" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Käivita Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Venemaa Föderatsioon" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Venemaa Föderatsioon" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Registreerimiskood" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Käivita Windows" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Töölauad" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Kiirus:" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Töölauad" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "Failisüsteem" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Käivita Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Käivita Windows" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "Ekraan" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows NT" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "Lisa sündmus" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "Lisa sündmus" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Käivitatakse terminalis" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "Häälestusdialoog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Käsku pole antud" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Käsku pole antud" #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "Peamenüü" #: ../metadata/gnomecompat.xml.in.h:9 #, fuzzy msgid "Show Run Application dialog" msgstr "Käivita rakendus" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "Teenuse URI näitamine" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Käsku pole antud" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Käivita Windows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "X Window süsteem" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "X Window süsteem" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "Käivita Windows" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Käivita Windows" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Heledus" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Heledus" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Heledus" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Heledus" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Käivita Windows" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Häälestamine" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Venemaa Föderatsioon" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows NT" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "X Window süsteem" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Aken" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "X Window süsteem" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Käivita Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Venemaa Föderatsioon" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Venemaa Föderatsioon" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Horisontaalne" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Värvid" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Värvid" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Värvid" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Käivita Windows" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "Vasakule" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "Paremale" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Vasakule" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Paremale" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Paremale" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Ekraani pööramine" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D kiirenduse aktiveerimine" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Registreerimiskood" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Töölauad" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Registreerimiskood" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Taaskäivituse kinnitus" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "XF86ZoomIn" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Suur" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Värviline taust" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Vali &pilt" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "Kiirus:" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "Vali &pilt" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Käivita Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Tühik" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 #, fuzzy msgid "Automatically open screenshot in this application" msgstr "Aplett käivitatakse sisselogimisel automaatselt" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Kataloog\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Videorežiimi valimine" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Käivita rakendus" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Ekraan" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Käsku pole antud" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Rakenduste sirvija" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "Lähtestamine" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Toiming" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikoon" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "Mitteaktiivne vajutatud:" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Töölauad" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "tekstirežiim" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "tekstirežiim" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "tekstirežiim" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Eelmine" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "Kas kasutada animeeritud aknaid?" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "Kiirus:" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "Vali &pilt" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Käivita Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "Lis&a link" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "Lisa sündmus" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 #, fuzzy msgid "Offset Scale" msgstr "Kaugus tiitlist:" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 #, fuzzy msgid "Title wave" msgstr "Tiitel: %1" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/water.xml.in.h:16 #, fuzzy msgid "Water Effect" msgstr "Töölaua efektid" #: ../metadata/water.xml.in.h:17 #, fuzzy msgid "Water offset scale" msgstr "Kaugus tiitlist:" #: ../metadata/water.xml.in.h:18 #, fuzzy msgid "Wave effect from window title" msgstr "kaugus tiitlist" #: ../metadata/wobbly.xml.in.h:1 #, fuzzy msgid "Focus Effect" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Toiming" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Resolutsioon" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Käivita Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Töölaua efektid" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Töölaua efektid" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "X Window süsteem" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Töölaua efektid" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "X Window süsteem" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Draiver" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Käivita Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Toiming" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Tühik" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Toiming" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "Sorimisjärjestuse muutmine" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Resolutsioon" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Käivita Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Käsk tagastas '%1' : %2" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Tundmatu käsk " #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Käsku pole antud" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Käsku pole antud" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filtreeri seda kausta" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Töölauad" #, fuzzy #~ msgid "Zoom In" #~ msgstr "XF86ZoomIn" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "XF86ZoomOut" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "XF86ZoomIn" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Töölauad" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "XF86ZoomOut" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "XF86ZoomIn" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "PgDn" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Vasakule" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Paremale" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane Up" #~ msgstr "PgUp" #, fuzzy #~ msgid "Plane down" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane right" #~ msgstr "Paremale" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane up" #~ msgstr "PgUp" #, fuzzy #~ msgid "Open window menu" #~ msgstr "Ava menüü" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Tööriistad" #~ msgid "Menu" #~ msgstr "Menüü" #, fuzzy #~ msgid "Utility" #~ msgstr "KDE utiliidid" #, fuzzy #~ msgid "Splash" #~ msgstr "splash" #, fuzzy #~ msgid "Dialog" #~ msgstr "Häälestusdialoog" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Aken" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Menüü" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Tööriistad" #, fuzzy #~ msgid "Notification" #~ msgstr "Märguanded" #, fuzzy #~ msgid "Dnd" #~ msgstr "End" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Ekraan" #~ msgid "Unknown" #~ msgstr "Tundmatu" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Häälestamine" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "MShadow" #, fuzzy #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "X Window süsteem" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D kiirenduse aktiveerimine" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Venemaa Föderatsioon" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Vene" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Töölaua efektid" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Mitteaktiivne vajutatud:" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Mitteaktiivne vajutatud:" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Kaugtöölaud" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D kiirenduse aktiveerimine" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "Registreerimiskood" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "Vali &pilt" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Käivita Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Toiming" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Määra filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Resolutsioon" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "Kaugus tiitlist:" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows NT" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows NT" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Kiirus:" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Töölauad" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "XF86ZoomOut" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Ekraani pööramine" #, fuzzy #~ msgid "Rotate To Face %d with Window" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Käsku pole antud" #, fuzzy #~ msgid "Run command %d" #~ msgstr "Tundmatu käsk " #, fuzzy #~ msgid "Corners" #~ msgstr "Korni" #, fuzzy #~ msgid "Show switcher" #~ msgstr "&Näita muudatusi" #, fuzzy #~ msgid "Terminate" #~ msgstr "XF86Terminal" ./po/bn_IN.po0000644000004100000410000035741413246301623013224 0ustar www-datawww-data# Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2008-03-15 16:49+0100\n" "Last-Translator: biswajyoti mahanta \n" "Language-Team: gist bengali team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "ডেস্কটপ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "উইন্ডো পরিচালনা" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "কমপিজ" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "কিছু না" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "চেদ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "বড় করা" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "উইন্ডোটিকে অনুভূমিকভাবে বড় করা" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "উইন্ডোটিকে উল্লম্বভাবে বড় করা" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "ছোট করা হয়েছে" # স্বয়ংক্রীয় #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "স্বয়ংক্রীয় আপডেট" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "উইন্ডো মেনু" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "উইন্ডো শীর্ষবারে মাউস হুইল স্ক্রল করার সময় কার্য করা হবে" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "অস্বচ্ছতার প্রকৃতি" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "মেটাসিটি বিষয় সক্রিয় উইন্ডোর অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "মেটাসিটি বিষয় সক্রিয় উইন্ডোর অস্বচ্ছতার শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "মেটাসিটি বিষয় অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "মেটাসিটি বিষয় অস্বচ্ছতার শেড" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙ্করণ সহ সক্রিয় উইন্ডোয় ব্যবহারের জন্য অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "মেটাসিটি বিষয় অলঙ্করণে ব্যবহারের জন্য অস্বচ্ছতা" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "অস্বচ্ছ থেকে অর্ধস্বচ্ছ মেটাসিটি বিষয় অলঙ্করণ সহ শেড সক্রিয়করণ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "অস্বচ্ছ থেকে অর্ধস্বচ্ছ মেটাসিটি বিষয় অলঙ্করণ সহ শেড সক্রিয়করণ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "শীর্ষ বার মাউস হুইলের কার্য" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "উইন্ডো অলঙ্করণের সময় অস্পষ্টতার প্রকার" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "মেটাসিটি বিষয় ব্যবহার করুন" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "উইন্ডো অলঙ্করণ করার সময় মেটাসিটি বিষয় ব্যবহার করুন" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "উইন্ডো বন্ধ করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "উইন্ডো সর্বাধিক না করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "উইন্ডো বড় করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "উইন্ডোটি ছোট করা" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "উপরে আনোন" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "চেটে যাক" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "চেদ বাদ" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "উপরে আনো না" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "না চাটবে না" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, fuzzy, c-format msgid "The window \"%s\" is not responding." msgstr "The window \"%s\" প্রতিক্রিযা করছেনা" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "এপ্লিকেছন টি যোরকরে বন্ধ করতে হবে আর আপনার সকল unsaved হারাটে হবে |" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "যোরকরে বন্ধ করতে হবে" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "অ্যানোটেট" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "অ্যানোটেট এ রঙ পূর্ণ করোন" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "অ্যানোটেট এ স্ট্রোকের রঙ করোন" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "অ্যানোটেট প্লাগিন" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "পরিষ্কার করো" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "অঙ্কন করো" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "টুলের সাহায্যে অঙ্কন করা" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "অ্যানোটেটচন এ রঙ পূর্ণ করো" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "শুরু " #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "অ্যানোটেটন এ অঙ্কন শুরু করো" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "অ্যানোটেটন এ মোছটে শুরু করো" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "মোছটে শুরু করো" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "রেখার বিস্তার (প্রস্থ)" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "অ্যানোটেশনের লাইনের প্রস্থ" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "অ্যানোটেশনের স্ট্রোকের রঙ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "স্ট্রোকের প্রস্থ" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "অ্যানোটেশনের স্ট্রোকের প্রস্থ" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4xBilinear" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "আলফা অস্পষ্ট" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "উন্ডোর বিস্তারিত দেখাও" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "অস্পষ্ট টার ফিলটার" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "অস্পষ্ট দেখতে" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "অস্পষ্ট টা Saturation" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "অস্পষ্ট টা র গতি" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "অস্পষ্ট টা র উইন্ডো" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "উইন্ডোর অর্ধস্বচ্ছ অংশের পিছনের অস্পষ্টতা" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "যে উইন্ডোগুলিতে ফোকাস নেই সেগুলিকে অস্পষ্ট করা " #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "অন্যান্য উইন্ডো দ্বারা অস্পষ্ট করা স্ক্রিনের অংশগুলির অস্পষ্টতাকে অসমর্থ করা." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "অস্পষ্ট করার জন্য ফিল্টার করার পদ্ধতি" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "ফোকাস অস্পষ্ট" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "ফোকাস অস্পষ্ট করার উইন্ডো" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "রাশিয়ান" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "মিপম্যাপ" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "মিপম্যাপ LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "মিপম্যাপের বিশদরূপের-স্তর" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "পালস" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "পালস প্রভাব" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "উইন্ডোর অস্পষ্টকরণের গতি" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ফোকাস বার দ্বারা যে উইন্ডোগুলি প্রভাবিত হবে" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলি আলফা অস্পষ্টতা ব্যবহার করবে" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "সমরূপ আউটপুট" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "ভারত" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "আউটপুট সমরূপ পরিচালক" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 0 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ1 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ10 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ11 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 2 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ3 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ4 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ5 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ6 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ7 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ8 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ9 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 0 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ1 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ10 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ11 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 2 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ3 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ4 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ5 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ6 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ7 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ8 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ9 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 0 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ1 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ10 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ11 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ 2 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা " "হবে" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ3 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ4 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ5 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ6 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ7 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ8 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "যখন কোন কী বাইন্ডিং চাওয়া হবে, নির্দেশ9 দ্বারা চিহ্নিত শেল নির্দেশটি চালনা করা হবে" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "যখন run_command0 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "যখন run_command1 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "যখন run_command10 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "যখন run_command11 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "যখন run_command2 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "যখন run_command3 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "যখন run_command4 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "যখন run_command5 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "যখন run_command6 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "যখন run_command7 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "যখন run_command8 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "যখন run_command9 চাওয়া হবে তখন শেলে নির্দেশ লাইনটি সম্পাদন করা হবে" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "কমান্ড '%1'" #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "কমান্ড '%1'" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "সক্রিয় প্লাগইনগুলি" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "অফস্ক্রিন পিক্সম্যাপে পুনর্নির্দেশিত না করার জন্য পূর্ণস্ক্রিন উইন্ডো অঙ্কন সম্মত করা" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "শ্রবণযোগ্য বেল" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "শ্রবণযোগ্য সিস্টেম বিপ" # স্বয়ংক্রীয় #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "স্বয়ং-বৃদ্ধি বিলম্ব" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "আউটপুট ডিভাইসের স্বয়ংক্রিয় সন্ধান" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "পুনঃসজীব মাত্রার স্বয়ংক্রিয় সন্ধান" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "সর্বোত্তম" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ফোকাসে ক্লিক করুন" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "উইন্ডোয় ক্লিক করে তাতে ইনপুটে ফোকাস করুন" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "সক্রিয় উইন্ডোটি বন্ধ করুন" # button label #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ডিফল্ট (&e)" # progress stage title #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ডিফল্ট উইন্ডো ম্যানেজার আরাম্ভ করা হচ্ছে" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ডেস্কটপ ঘনক" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "আউটপুট সন্ধান" # headline for dialog "Select for update" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "পরিবর্ধনের জন্য নির্বাচন করুন" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "দ্রুত" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "সাধারণ বিকল্প" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "সাধারণ কমপিজ বিকল্প" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ভালো" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "টাস্কবার উইন্ডোগুলি বাদ দেওয়া গোপন করা" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "সব উইন্ডোগুলি গোপন করা এবং ডেস্কটপে ফোকাস করা" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "ডেস্কটপ প্রদর্শন প্রণালীতে প্রবেশ করার সময় টাস্কবারে নেই এরকম উইন্ডোগুলি গোপন করুন" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "অনুভূমিক ভার্চুয়াল আকার" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "বড় করার হলে ইঙ্গিতগুলি অগ্রাহ্য করা" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "উইন্ডো বড় করার সময় আকার বৃদ্ধি এবং আকৃতির ইঙ্গিত অগ্রাহ্য করুন" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "নির্বাচিত উইন্ডোগুলিকে তোলার আগে ব্যবধান" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "পিং বার্তাগুলির মধ্যে ব্যবধান" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "আলোকপাত" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "বর্তমানে সক্রিয় প্লাগইনের তালিকা" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "আউটপুট ডিভাইস বর্ণনাকারী স্ট্রিংয়ের তালিকা" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "নিচের উইন্ডো" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "অন্যান্য উইন্ডগুলির নিচে উইন্ডোটিকে নামিয়ে দিন" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "উইন্ডোটিকে অনুভূমিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "উইন্ডোটিকে উল্লম্বভাবে বড় করা" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "সক্রিয় উইন্ডো বড় করা" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "সক্রিয় উইন্ডোটিকে অনুভূমিকভাবে বড় করা" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "সক্রিয় উইন্ডোটিকে উল্লম্বভাবে বড় করা" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "সক্রিয় উইন্ডো ছোট করা" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "স্বাভাবিক" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "ডেস্কটপের সংখ্যা" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "ভার্চুয়াল ডেস্কটপের সংখ্যা" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "উল্লম্ব ফাঁকা পর্যায়ে শুধুমাত্র স্ক্রিন আপডেট সম্পাদন করুন" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "আউটপুটগুলি" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "পিং বিলম্ব" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "ক্লিক করে বৃদ্ধি করুন" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "উইন্ডো তুলে ধরা" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ব্যবধানের পরে নির্বাচিত উইন্ডোটিকে তুলে ধরুন" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "অন্যান্য উইন্ডোগুলির ওপরে উইন্ডো তুলে ধরা" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ক্লিক করা হলে উইন্ডোটি তুলে ধরা" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "পুনরায় তালিকা প্রদর্শন করো (&R)" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "অনুভূমিক ভার্চুয়াল আকারের জন্য স্ক্রিন আকারের গুণিতক" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "উল্লম্ব ভার্চুয়াল আকারের জন্য স্ক্রিন আকারের গুণিতক" # label text #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "সময়" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "সবগুলো পার্টিশন প্রদর্শন করো" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "স্মার্ট" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank এ Sync " #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "টেক্সচার ফিল্টার করা" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "টেক্সচার ফিল্টার" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "টেক্সচার ফিল্টার করা" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "যে হারে স্ক্রিনটি পুনরায় অঙ্কন করা হবে (গুণ/সেকেন্ড)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "সর্বাধিক উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "অনুভূমিকভাবে সর্বাধিক উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "উল্লম্বভাবে সর্বাধিক উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "উইন্ডো শেড টগল করা" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "সর্বাধিক সক্রিয় উইন্ডো টগল করা" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "অনুভূমিকভাবে সর্বাধিক সক্রিয় উইন্ডোকে টগল করা" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "উল্লম্বভাবে সর্বাধিক সক্রিয় উইন্ডোকে টগল করা" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "সক্রিয় উইন্ডো শেড টগল করা" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "মন্থর অ্যানিমেশনগুলির ব্যবহার টগল করা" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "সক্রিয় উইন্ডো সর্বাধিক না করা" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "পূর্ণস্ক্রিনের উইন্ডোগুলি পুনর্নির্দেশ না করা" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "স্ক্রিন স্থানান্তরিত করার সময় বিচ্ছুরিত আলো প্রয়োগ করুন" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "উল্লম্ব ভার্চুয়াল আকার" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "উইন্ডোর মেনু বোতাম বন্ধন" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "উইন্ডোর কী বোতাম বন্ধন" # নির্বাচন #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "নির্বাচন " #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "চিত্র বিন্যস্ত করা" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "চিত্রের ওপরের তলটি ঘোরানোয় বিন্যস্ত করা" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "পরবর্তী স্লাইডে এগিয়ে যাওয়া" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "স্কাইডোম অ্যানিমেট করা" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ঘনক ঘোরানোর সময় স্কাইডোম অ্যানিমেট করা" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # স্বয়ংক্রীয় #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ঘনকের ওপর এবং নিচের প্রান্তের রঙ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "স্কাইডোম-ফলব্যাক গ্র্যাডিয়েন্টের নিচের কালার-স্টপের জন্য রঙ " #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "স্কাইডোম-ফলব্যাক গ্র্যাডিয়েন্টের ওপরের কালার-স্টপের জন্য রঙ " #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "ঘনকের রঙ" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "ডেস্কটপ ঘনক" # নির্বাচন #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "নির্বাচন " #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "উন্নততর স্কেলিং এর জন্য mipmaps তৈরী করুন" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "পূর্ববর্তী স্লাইডে ফিরে যান" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ইমেজ ফাইল তৈরী করো" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "স্কাইডোমের টেক্সচার হিসাবে ব্যবহারের জন্য চিত্র" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "যদি মাউস দিয়ে ঘোরানো হয় তাহলে ঘনকের স্বচ্ছতা শুরু হবে." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ঘনকের অভ্যন্তরে" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ঘনকের অভ্যন্তরে" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "ঘনকের উপরিতলে PNG এবং SVG র যে তালিকা প্রয়োগ করা হবে" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "বিবিধ আউটপুট প্রণালী" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "বহুবিধ ঘনকগুলি" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "পরবর্তী স্লাইড" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "বড় ঘনকে" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ঘোরানোর সময় অস্বচ্ছতা" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "না ঘোরানোর সময় অস্বচ্ছতা" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ঘোরানোর সময় ডেস্কটপ উইন্ডোর অস্বচ্ছতা." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ঘোরানোর সময় ডেস্কটপ উইন্ডোর অস্বচ্ছতা." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "ঘনকে উইন্ডো স্থাপন করা" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "পূর্ববর্তী স্লাইড" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Skydome প্রয়োগ করা" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "স্হানীয় সময়" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ঘনকের ওপরের তল আবৃত করার জন্য চিত্র স্কেল করা" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "যদি একাধিক ডিভাইস ব্যবহার করা হয় সেক্ষেত্রে ঘনকটি কিভাবে প্রদর্শন করা হবে তা " "নির্বাচন করে." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "স্কাইডোম" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "স্কাইডোম গ্র্যাডিয়েন্ট শেষের রঙ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "স্কাইডোম গ্র্যাডিয়েন্ট আরম্ভের রঙ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "স্কাইডোম চিত্র" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "সময়" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "মাউস ঘোরানোর সময় স্বচ্ছতা" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "উন্মুক্ত করা" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ঘনকটি উন্মুক্ত করা" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "ডিবাস" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "ডিবাস নিয়ন্ত্রণ ব্যাকএন্ড" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "অলঙ্করণ টেক্সচারে মিপম্যাপ তৈরী করতে দিন" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "কমান্ড '%1'" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "যদি কোন ডেকোরেটর আগে থেকে কাজ না করেন সেক্ষেত্রে যে ডেকোরেটর নির্দেশ লাইন ব্যবহৃত " "হবে" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "প্রচ্ছায়া অফসেট X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "প্রচ্ছায়া অফসেট Y" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "যে উইন্ডোগুলি অলঙ্করণ করা হবে" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "যে উইন্ডোগুলি ছায়াযুক্ত করা হবে" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" # label text #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "সময়" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ধারন করে" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "স্থানীয় সময়" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ছোট করা/খোলা/বন্ধ করার ওপর মলিনতার প্রভাব" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "বাদ দেয়া হয়েছে\n" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "স্থানীয় সময়" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "উইন্ডো ছোট করা/খোলা/বন্ধ করার ওপর মলিনতার প্রভাব" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "সিস্টেম বিপে মলিনতার প্রভাব" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ম্যাপ করার সময় উইন্ডো ফেড ইন করা এবং আনম্যাপ করার সময় উইন্ডো ফেড আউট করা" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "পূর্ণস্ক্রিনের দৃশ্যমান বেল" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "সিস্টেম বিপে পূর্ণ পর্দার মলিন প্রভাব" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "দৃশ্যমান বেল" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "উইন্ডো মলিন হওয়ার গতি" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "স্কেল প্রণালীতে উইন্ডোগুলি স্কেল করা" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "যে উইন্ডোগুলি মলিন করা হবে" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "মাউন্ট বিন্দু" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "মাউন্ট বিন্দু" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ইউজারস্পেস ফাইল সিস্টেম" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ইউজারস্পেস ফাইল সিস্টেম" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf নিয়ন্ত্রণ ব্যাকএন্ড" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib প্রধান লুপ সমর্থন" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "একটি টার্মিনাল খুলুন" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "ডায়ালগ চালনা করা" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "প্রধান মেনু প্রদর্শন করা" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "চালনা করার অনুপ্রয়োগ ডায়ালগ প্রদর্শন করা" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "প্রধান তালিকা প্রদর্শন" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "একটি স্ক্রিনশট নিন" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "উইন্ডোর একটি স্ক্রিনশট নিন" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "উইন্ডো স্ক্রিনশট নির্দেশ লাইন" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini ফ্ল্যাট ফাইলের ব্যাকএন্ড" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ফাইল পরিবর্তন ঘোষণাকারী প্লাগইন" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "আইনোটিফাই" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig নিয়ন্ত্রণ ব্যাকএন্ড" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "প্রভাব সর্বনিম্ন করা" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "উইন্ডোগুলি ছোট করা" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "সর্বনিম্ন করার গতি" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "স্হানীয় সময়" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "শেড প্রতিরোধ" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "শেড প্রতিরোধ" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "উইন্ডোগুলি ছোট এবং বড় করার সময় সেগুলি স্থানান্তরিত করে" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "উইন্ডো ছোট করার সময় যে উইন্ডোগুলি স্থানান্তরিত করা হবে" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "ধারন করে" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ওয়ার্কস্পেস ক্ষেত্রে Y স্থানাঙ্ককে সীমাবদ্ধ করুন" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "সরানোর কার্যটি সমাপ্ত না হওয়া পর্যন্ত সার্ভারের-দিকে অবস্থিত উইন্ডোগুলি আপডেট করবেন " "না" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "উইন্ডো সরানো আরম্ভ করা" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "অলস অবস্থান নির্ণয়" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "উইন্ডো সরানো" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "অস্বচ্ছতা" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "চলমান উইন্ডোর অস্বচ্ছতার স্তর" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "টানার সময় বড় করা উইন্ডোকে স্ন্যাপঅফ করা এবং স্বয়ংক্রিয়ভাবে ছোট করা" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "স্ন্যাপঅফ সর্বাধিক উইন্ডো" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ব্রিজ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "অস্বচ্ছতা হ্রাস করুন" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "অস্বচ্ছতা বৃদ্ধি করুন" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "অস্বচ্ছতা পরিবর্তনের ধাপ" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "অস্বচ্ছতা পরিবর্তনের ধাপ" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "অস্বচ্ছতার ধাপ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "চলমান উইন্ডোর অস্বচ্ছতার স্তর" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ঘোরানোর সময় অস্বচ্ছতা" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "অস্বচ্ছতা উইন্ডোর মূল্যগুলি" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলির অবস্থান নির্ণয় করা হবে" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলি অর্ধস্বচ্ছ করা হবে" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলির অবস্থান নির্ণয় করা হবে" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "উইন্ডো স্থাপনের জন্য ব্যবহৃত অ্যালগোরিদম" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "কাসকেড" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "কেন্দ্রীভূত" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "উইন্ডো পরিচালনা" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ফোকাস প্রতিরোধের উইন্ডো" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "অনুভূমিক ভিউপোর্টের অবস্থান" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "উইন্ডোগুলি স্থাপন করা" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ম্যাপ করার পর উপযুক্ত স্থানে উইন্ডোগুলি স্থাপন করুন" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "প্রতিস্থাপন প্রণালী" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "অবস্থানযুক্ত উইন্ডো" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ইচ্ছামত" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "যদি একাধিক আউটপুট ডিভাইস ব্যবহার করা হয় তাহলে উইন্ডোগুলি কোথায় স্কেল করা হবে তা " "নির্বাচন করে" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "স্মার্ট" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "সব আউটপুট ডিভাইসে" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "উল্লম্ব ভিউপোর্ট অবস্থান" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "ভিউপোর্ট অবস্থানের উইন্ডো" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "উইন্ডো প্রতিস্থাপন ওয়ার্কএরাউন্ড" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "প্রথাস্বরূপভাবে যে উইন্ডোগুলির অবস্থান নির্ণয় করা হবে" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "প্রথাস্বরূপভাবে যে ভিউপোর্টে উইন্ডোগুলি রাখা হবে " #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "উইন্ডো অলঙ্করণ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "ওয়ার্কএরাউন্ড" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X অবস্থান" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X ভিউপোর্ট অবস্থান" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X অবস্থানের মূল্য" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y অবস্থান" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y ভিউপোর্ট অবস্থান" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y অবস্থানের মূল্য" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png চিত্র লোডকারী" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "রিগেক্স মেলানো" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "রিগেক্স উইন্ডো মেলানো" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "প্রান্তরেখার রঙ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "বহির্রেখা এবং আয়তাকার পুনরাকৃতি প্রণালীতে ব্যবহৃত প্রান্তরেখার রঙ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "প্রথাস্বরূপ পুনরাকৃতির প্রণালী" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "উইন্ডো পুনরাকৃতির জন্য প্রথাস্বরূপ প্রণালী" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "রঙ পূর্ণ করা" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "আয়তাকার পুনরাকৃতি প্রণালীর জন্য ব্যবহৃত পূর্ণকরণ রঙ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ভারত" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "বহির্রেখা" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "পুনরাকার উইন্ডোর বহির্রেখা" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "আয়তক্ষেত্র" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "উইন্ডোর আকার পরিবর্তন করা" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "উইন্ডোর আকার পরিবর্তন করা" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "উইন্ডোর আকার পরিবর্তন শুরু করুন" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "উইন্ডোটি বিস্তৃত করে উইন্ডোর আকার পরিবর্তন শুরু করুন" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "আয়তক্ষেত্র দিয়ে উইন্ডোর আকার পরিবর্তন শুরু করুন" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "প্রসারিত করা" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "যে উইন্ডোর জন্য স্বাভাবিক পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "যে উইন্ডোর জন্য বহির্রেখা পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "যে উইন্ডোর জন্য আয়তাকার পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "যে উইন্ডোর জন্য বিস্তৃতি পুনরাকৃতি প্রয়োগ করা হবে" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr " DnD প্রান্ত ফ্লিপ করা" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "প্রান্তের ফ্লিপ সরানো" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "প্রান্তের ফ্লিপ নির্দেশক" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "স্থানীয় সময়" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "বাঁদিকের ভিউপোর্টে ফ্লিপ করা এবং নির্দেশকটি মুড়িয়ে দেওয়া " #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "বস্তুটিকে স্ক্রিনের প্রান্তে টানার সময় পরবর্তী ভিউপোর্টে ফ্লিপ করুন" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "নির্দেশকটিকে স্ক্রিনের প্রান্তে সরানোর সময় পরবর্তী ভিউপোর্টে ফ্লিপ করুন" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "নির্দেশকটিকে স্ক্রিনের প্রান্তে সরানোর সময় পরবর্তী ভিউপোর্টে ফ্লিপ করুন" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ডানদিকের ভিউপোর্টে ফ্লিপ করা এবং নির্দেশকটি মুড়িয়ে দেওয়া " #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "নির্দেশক সরানোর জন্য Y অক্ষ উল্টে দিন" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "নির্দেশক উল্টানো Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "নির্দেশক সংবেদনশীলতা" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ঘোরানোর সময় তোলা" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ঘোরানোর সময় উইন্ডোটি তোলা" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "ফ্লিপ বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "ফ্লিপকে ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "উইন্ডো সহ বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "উইন্ডো সহ ডানদিকে ঘোরানো" # স্বয়ংক্রীয় #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "ফেস 1 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "উইন্ডো সহ ফেস 1 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "ফেস 10 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "উইন্ডো সহ ফেস 10 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "ফেস 11 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "উইন্ডো সহ ফেস 11 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "ফেস 12 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "উইন্ডো সহ ফেস 12 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "ফেস 2 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "উইন্ডো সহ ফেস 2 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "উইন্ডো সহ ফেস 3 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "উইন্ডো সহ ফেস 4 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "উইন্ডো সহ ফেস 5 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "উইন্ডো সহ ফেস 6 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "উইন্ডো সহ ফেস 7 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "উইন্ডো সহ ফেস 8 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "উইন্ডো সহ ফেস 9 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "ডেস্কটপ ঘনক ঘোরানো" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "বাঁদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "বাঁদিকে ঘোরানো এবং সক্রিয় উইন্ডো নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "ডানদিকে ঘোরানো" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "ডানদিকে ঘোরানো এবং সক্রিয় উইন্ডো নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "উইন্ডো সহ ফেস 1 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "ফেস 1 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "ফেস 1 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "ফেস 10 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "ফেস 10 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "ফেস 11 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "ফেস 11 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "ফেস 12 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "ফেস 12 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "ফেস 2 এ ঘোরানো" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "ফেস 2 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "ফেস 3 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "ফেস 3 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "ফেস 4 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "ফেস 4 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "ফেস 5 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "ফেস 5 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "ফেস 6 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "ফেস 6 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "ফেস 7 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "ফেস 7 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "ফেস 8 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "ফেস 8 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "ফেস 9 তে ঘোরানো" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "ফেস 9 এ ঘোরান তারসঙ্গে সক্রিয় উইন্ডোটি নিয়ে আসুন" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "ভিউপোর্টে ঘোরানো" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "উইন্ডো ঘোরানো" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "উইন্ডো দিয়ে ঘোরানো" # নির্বাচন #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "নির্বাচন " # label text #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "সময়" # label text #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "সময়" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "নির্দেশকের চলাচলের সংবেদনশীলতা " #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে স্ন্যাপ করা " #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ওপরের ফেসে ঘনক ঘোরানোকে স্ন্যাপ করা " #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ওপরের ফেসে স্ন্যাপ করুন" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ওপরের ফেসে স্ন্যাপ করুন" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ফ্লিপিং ভিউপোর্টের আগে সময়অতিক্রান্ত হয়েছে" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "জুম" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "অস্বচ্ছতার শতকরা পরিমাণ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "বড়" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ডেস্কটপ প্রদর্শন করার জন্য ডেস্কটপে ক্লিক করুন" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "উইন্ডো স্কেল করার সময় পটভূমি গাঢ় করা" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "প্রতীক" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "স্কেল করার সময় ডেস্কটপে যখন ক্লিক করা হবে তখন ডেস্কটপ প্রণালী প্রদর্শন প্রবেশ করান " #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ঘুরে বেড়ানোর সময়" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ভারত" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "সব উইন্ডোর জন্য উইন্ডো পিকার আরম্ভ করা" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "সব উইন্ডো শ্রেণীর জন্য উইন্ডো পিকার আরম্ভ করা" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "বর্তমান আউটপুটের উইন্ডোর জন্য উইন্ডো পিকার আরম্ভ করা" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "সব উইন্ডোগুলির বিন্যাস করছে এবং রূপান্তরিত করছে" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "উইন্ডো শ্রেণীর বিন্যাস করছে এবং রূপান্তরিত করছে" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "উইন্ডোগুলির বিন্যাস করছে এবং রূপান্তরিত করছে" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "বর্তমান আউটপুটের উইন্ডোগুলির বিন্যাস করা এবং তার রূপান্তর শুরু করা" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "সব আউটপুট ডিভাইসে" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "বর্তমান আউটপুট ডিভাইসে" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ওভারলে চিত্রসংকেত" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "উইন্ডোগুলিকে স্কেল করার পর সেগুলির ওপর চিত্রসংকেত স্থাপন করুন" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "স্ক্যানার" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "বিস্তারিত দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "স্হানীয় সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "স্হানীয় সময়" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "যদি একাধিক আউটপুট ডিভাইস ব্যবহার করা হয় তাহলে উইন্ডোগুলি কোথায় স্কেল করা হবে তা " "নির্বাচন করে" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "স্পেন" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "উইন্ডোর ওপর ঘুরে বেড়ানোর সময় স্কেল প্রণালী বন্ধ করার পূর্ববর্তী সময় (মিনিটে)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "স্কেল প্রণালীতে উইন্ডোগুলি স্কেল করা" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "এই অনুপ্রয়োগে স্ক্রিনশটগুলি স্বয়ংক্রিয়ভাবে খুলে যায়" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "ডিরেক্টরী" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "ভারত" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "স্থাপনকার্যের অনুপ্রয়োগ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "এই ডিরেক্টরীর স্ক্রিনশট চিত্রগুলি স্থাপন করা" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg " #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg চিত্র লোডার" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "উজ্জ্বলতার শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "সম্পৃক্তির শতকরা পরিমাণ" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "অনুপ্রয়োগ পরিবর্তনকারী" # স্বয়ংক্রীয় #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "স্বয়ংক্রীয় আপডেট" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "বুটের সময়" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "নির্বাচিত উইন্ডোটিকে সামনে নিয়ে আসা" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "উইন্ডো পরিবর্তন করার সময় দূরের ডেস্কটপটির জুম আউট করা হবে" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "চিত্রসংকেত" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "ছোট করা হয়েছে" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ডেস্কটপ তল" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "পরবর্তী উইন্ডো" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "পরবর্তী উইন্ডো (সব উইন্ডোগুলি)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "পরবর্তী উইন্ডো (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "পপআপ পরিবর্তনকারী দেখা না গেলে পরবর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "পপআপ পরিবর্তনকারী দেখা না গেলে সব উইন্ডোগুলির মধ্যে পরবর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "পপআপ পরিবর্তনকারী দেখা না গেলে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "পপআপ পরিবর্তনকারী দেখা না গেলে সব উইন্ডোগুলির মধ্যে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "পূর্ববর্তী স্লাইড" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "পূর্ববর্তী উইন্ডো " #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "পূর্ববর্তী উইন্ডো (সব উইন্ডোগুলি)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "পূর্ববর্তী উইন্ডো (কোন পপআপ নেই)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "পরিবর্তন করার সময় নির্বাচিত উইন্ডোটি ঘোরান" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "পপআপ উইন্ডো না দেখিয়ে পরবর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "পপআপ উইন্ডো না দেখিয়ে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "পপআপ উইন্ডো না দেখিয়ে পূর্ববর্তী উইন্ডো নির্বাচন করুন" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "থাম্বনেলের পরবর্তী চিত্রসংকেত প্রদর্শন করা" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "বিস্তারিত দেখাও (&d)" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "স্হানীয় সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "স্হানীয় সময়" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "সুইচারে যে উইন্ডোগুলি প্রদর্শন করা হবে" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 কালারস্পেস সমর্থন প্রদান করা" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ভিডিও প্লেব্যাক" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ভিডিও প্লেব্যাক" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 কালারস্পেস" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "লাইন যুক্ত করা" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "বিন্দু যুক্ত করা" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "বিভিন্ন ডেস্কটপ কার্যাবলীতে জলের প্রভাব প্রয়োগ করা" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "প্রত্যেক বৃষ্টির ফোঁটার মধ্যে ব্যবধান (মিনিটে)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "পয়েন্টার জলের প্রভাব সমর্থ করা" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "লাইন" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "অফসেট স্কেল" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "বিন্দু" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "বৃষ্টির বিলম্ব" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "শীর্ষ তরঙ্গ" # why not "token ring"? #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "টোকেন রিং" # why not "token ring"? #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "টোকেন রিং" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "জলের প্রভাব" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "জলের অফসেট স্কেল" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "উইন্ডো শীর্ষ থেকে জলের প্রভাব" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ফোকাসের প্রভাব" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "ফোকাস উইন্ডো প্রভাব" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "ফোকাস উইন্ডো " #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "পার্টিশন" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "বিস্তারিত দেখাও (&d)" # দ্বন্দ্ব #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "দ্বন্দ্ব মীমাংসা:" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "উল্টো উইন্ডো স্ন্যাপিং" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "উইন্ডোটিকে কাঁপানো" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "ম্যাপ প্রভাব" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "ম্যাপ উইন্ডো প্রভাব" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "সর্বোচ্চ প্রভাব" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "সর্বনিম্ন গ্রিড আকার" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "সর্বনিম্ন শীর্ষ গ্রিডের আকার" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "কম্পন" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "স্ন্যাপ উল্টানো" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "বিস্তারিত দেখাও (&d)" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "পার্টিশন" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ধাপে ধাপে আগানো" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ধাপে ধাপে আগানো" # why not "token ring"? #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "টোকেন রিং" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "টলমল উইন্ডো প্রভাবের ক্ষেত্রে স্প্রিং ব্যবহার করুন" # দ্বন্দ্ব #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "দ্বন্দ্ব মীমাংসা:" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ফোকাস করার সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ধরার সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ম্যাপ করার সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "সরানোর সময় যে উইন্ডোগুলি টলমল করবে" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "উইন্ডোগুলি সর্বাধিক করা বা না করার সময় টলমল করার প্রভাব" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "টলমলে উইন্ডো" #, fuzzy #~ msgid "Command line 0" #~ msgstr "কমান্ড '%1'" #, fuzzy #~ msgid "Run command 0" #~ msgstr "কমান্ড '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "কমান্ড লাইন পার্স করতে সমস্যা।" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ফিল্টার:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "জুম ইন করার সময় রৈখিক ফিল্টার ব্যবহার করুন" # label text #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "সময়" #~ msgid "Zoom In" #~ msgstr "জুম ইন" #~ msgid "Zoom Out" #~ msgstr "জুম আউট" #~ msgid "Zoom Pan" #~ msgstr "জুম প্যান" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "সময়" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ডেস্কটপ ঘনক জুম করা এবং প্যান করা" #~ msgid "Zoom factor" #~ msgstr "জুম ফ্যাক্টর" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "বাদ দেয়া হয়েছে\n" #~ msgid "Decrease window opacity" #~ msgstr "উইন্ডোর অস্বচ্ছতা হ্রাস করুন" #~ msgid "Increase window opacity" #~ msgstr "উইন্ডোর অস্বচ্ছতা বৃদ্ধি করুন" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "উইন্ডোর যে অস্বচ্ছতাকে প্রথাস্বরূপভাবে অর্ধস্বচ্ছ করা হবে" #~ msgid "Opacity windows" #~ msgstr "অস্বচ্ছতা উইন্ডো" #~ msgid "Background Images" #~ msgstr "পটভূমির চিত্রগুলি" #~ msgid "Background images" #~ msgstr "পটভূমির চিত্রগুলি" # why not "token ring"? #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "টোকেন রিং" #~ msgid "Plane Down" #~ msgstr "নিচের তল" #~ msgid "Plane Left" #~ msgstr "বাঁদিকের তল" #~ msgid "Plane Right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane To Face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane To Face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane To Face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane To Face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane To Face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane To Face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane To Face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane To Face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane To Face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane To Face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane To Face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane To Face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane Up" #~ msgstr "ওপরের তল" #~ msgid "Plane down" #~ msgstr "নিচের তল" #~ msgid "Plane left" #~ msgstr "বাঁদিকের তল" #~ msgid "Plane right" #~ msgstr "ডানদিকের তল" #~ msgid "Plane to face 1" #~ msgstr "তল থেকে ফেস 1" #~ msgid "Plane to face 10" #~ msgstr "তল থেকে ফেস 10" #~ msgid "Plane to face 11" #~ msgstr "তল থেকে ফেস 11" #~ msgid "Plane to face 12" #~ msgstr "তল থেকে ফেস 12" #~ msgid "Plane to face 2" #~ msgstr "তল থেকে ফেস 2" #~ msgid "Plane to face 3" #~ msgstr "তল থেকে ফেস 3" #~ msgid "Plane to face 4" #~ msgstr "তল থেকে ফেস 4" #~ msgid "Plane to face 5" #~ msgstr "তল থেকে ফেস 5" #~ msgid "Plane to face 6" #~ msgstr "তল থেকে ফেস 6" #~ msgid "Plane to face 7" #~ msgstr "তল থেকে ফেস 7" #~ msgid "Plane to face 8" #~ msgstr "তল থেকে ফেস 8" #~ msgid "Plane to face 9" #~ msgstr "তল থেকে ফেস 9" #~ msgid "Plane up" #~ msgstr "ওপরের তল" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ডেস্কটপের উইন্ডো অস্বচ্ছতা মলিন হওয়ার সময়." #, fuzzy #~ msgid "Notification" #~ msgstr "পার্টিশন" # label for an unknown installed system # try to use simple words #~ msgid "Unknown" #~ msgstr "অজানা" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "অবস্থা সম্পর্কিত তথ্য (&t)" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "বিস্তারিত দেখাও (&d)" # নির্বাচন #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "নির্বাচন " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "রাশিয়ান" # নির্বাচন #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "নির্বাচন " # label text #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "স্হানীয় সময়" # label text, Clock setting: local time (not UTC) # ComboBox entry: hardware clock set to local time #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "স্হানীয় সময়" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "পার্টিশন" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ধাপে ধাপে আগানো" # দ্বন্দ্ব #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "দ্বন্দ্ব মীমাংসা:" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "বাদ দেয়া হয়েছে\n" # label text #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "সময়" #, fuzzy #~ msgid "Command line %d" #~ msgstr "কমান্ড '%1'" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ফ্লপি ডিস্ক" #, fuzzy #~ msgid "Terminate" #~ msgstr "প্রিন্টার" ./po/ar.po0000644000004100000410000017115013246301623012630 0ustar www-datawww-data# @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # FIRST AUTHOR , YEAR. # # This file is distributed under the same license as @PACKAGE@ package. FIRST # msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2009-09-23 19:19+0200\n" "Last-Translator: Jibril ABDELAZIZ \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "سطح المكتب" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "إدارة النوافد" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "بدون" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "ظل" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "تكبير" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "تكبير أفقي" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "تكبير عمودي" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "تقليص" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "زيادة" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "نقصان" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "قائمة النافدة" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "الإجراء المتخذ عند تحريك عجلة الفأرة على شريط عنوان النافدة." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "ﺔﻴﺳﻭﺭ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "ﺔﻴﺳﻭﺭ" ./po/id.po0000644000004100000410000017536113246301623012632 0ustar www-datawww-data# Indonesian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999-2001 SuSE GmbH. # I Made Wiryana , 1999. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2002-10-08 13:38+0200\n" "Last-Translator: I Made Wiryana \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Desktop" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Kecepatan:" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" # IN #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "India" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" # IN #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "India" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" # IN #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "India" # IN #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "India" # IN #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "India" # IN #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "India" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "Kecepatan:" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Kecepatan:" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Adakan Partisi ZEN" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Rusia" # RU #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Rusia" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Rusia" # RU #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Rusia" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Rusia" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" # IN #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "India" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Adakan Partisi ZEN" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Adakan Partisi ZEN" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" # SH #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Santa Helena" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Set filter" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "Set filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" # RU #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "Rusia" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" # IN #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "India" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Desktop" # RU #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "Rusia" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Kecepatan:" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Kecepatan:" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Kecepatan:" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Adakan Partisi ZEN" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" # RU #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "Rusia" # RU #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "Rusia" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Kecepatan:" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 #, fuzzy msgid "Open a terminal" msgstr "Jalankan dalam terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Kecepatan:" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" # RU #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Rusia" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Adakan Partisi ZEN" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" # RU #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Rusia" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Adakan Partisi ZEN" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Adakan Partisi ZEN" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" # RU #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "Rusia" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" # RU #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Rusia" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" # IN #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "India" # IN #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "India" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "India" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" # IN #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "India" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" # RU #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "Rusia" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Kecepatan:" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Kecepatan:" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" # IN #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "India" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" # ES #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Spanyol" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "Direktori\n" # IN #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "India" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "Pindah aplikasi:" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" # IN #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "India" # ES #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "Spanyol" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Adakan Partisi ZEN" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Adakan Partisi ZEN" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" # SH #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Santa Helena" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Adakan Partisi ZEN" # ES #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Spanyol" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "Driver" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" # ES #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Spanyol" # ES #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Spanyol" # ES #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Spanyol" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Desktop" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Kecepatan:" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Kecepatan:" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Kecepatan:" #, fuzzy #~ msgid "Unknown" #~ msgstr "tidak dikenal" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Adakan Partisi ZEN" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Kecepatan:" # RU #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Rusia" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Rusia" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Desktop" # RU #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Rusia" # ES #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Spanyol" # ES #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Spanyol" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "Set filter" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Kecepatan:" ./po/en_GB.po0000644000004100000410000022252713246301623013205 0ustar www-datawww-data# English message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # James Ogley , 2000, 2001. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:12+0100\n" "PO-Revision-Date: 2001-07-17 16:27+0200\n" "Last-Translator: James Ogley \n" "Language-Team: English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "Desktop" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "Window Manager" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "Scanner" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "&Shrink Windows" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "AutoYast" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "Window Manager" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "Suspend" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "&Delete Windows completely" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "&Delete Windows completely" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "&Delete Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "&Shrink Windows" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "Colours" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "Active Profile" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Hittite" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "Filter: " #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "&Set Filter" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "Duration" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "Duration" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "Suspend" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "Duration" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "&Delete Windows" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "Russian" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "Russian Federation" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "Russian" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "Russian Federation" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "Russian" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "Mi'kmaq" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "Mi'kmaq" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows free (%1)" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Hittite" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "Command: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "Command: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "Command: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Command: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "Command: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "Command: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "Command: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "Command: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "Command: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "Command: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "Command: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "Command: " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Command: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Command '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "Command: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "Command: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "Command: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "Command: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "Command: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "Command: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "Command: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "Command: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "Active Profile" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "File system" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "AutoYast" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "Default Section" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "Default domain" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "Select for Update" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "Starting daemon." #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "Starting daemon." #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "Virtual Device" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "Logging" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "List only detected printers" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Lower Sorbian" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "&Shrink Windows" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "&Shrink Windows" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "Delay" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "&Radio Clock" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Resize failed." #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "Refresh" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "Desktop" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "Show All Partitions" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "&Set Filter" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "&Set Filter" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "&Set Filter" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "Virtual Device" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D Acceleration:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "Advanced Options" #: ../metadata/cube.xml.in.h:5 #, fuzzy msgid "Animate Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "AutoYast" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Colours" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "Colours" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "Desktop" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D Acceleration:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "Test" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "&Previous" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "Failed files" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "New Size" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "&Delete Windows" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "&Previous" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "local time" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 #, fuzzy msgid "Skydome" msgstr "Sydney" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 #, fuzzy msgid "Skydome Image" msgstr "Disk Image" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "Suspend" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "Test" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "Command: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "&Delete Windows" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "Radius" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "&Shrink Windows" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "&Low Capacity" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "Radius" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "&Shrink Windows" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "No Description" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind options" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Test" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Contains" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Resize failed." #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Real Time" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "Suspend" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "Real Time" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "File system" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "&Delete Windows" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "&Shrink Windows" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows free (%1)" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "&Tone Dialling" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Error parsing command line." #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "Error parsing command line." #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "&Show Boot Menu" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "&Show Boot Menu" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "Error parsing command line." #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "Do not log any" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "Do not log any" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "&Shrink Windows" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "Contains" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "Move &Down" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "Resize failed." #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "Move &Down" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "Move &Down" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "&Low Capacity" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "Starting daemon." #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "&Shrink Windows" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "Starting daemon." #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "Bridge" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Bridge" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Bridge" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Bridge" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Occitan (post 1500)" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Occitan (post 1500)" #: ../metadata/obs.xml.in.h:11 #, fuzzy msgid "Opacity Step" msgstr "&Low Capacity" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Starting daemon." #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "Duration" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Duration" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Duration" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Duration" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind options" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Window Manager" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "&Delete Windows" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "&Delete Windows" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "Resize failed." #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "Resize failed." #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind options" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind options" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "&Workgroup" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "Resize failed." #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "Resize failed." #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "Virtual Device" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "Colours" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "Colours" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "Initial RAM Disk" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "Colours" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "Starting daemon." #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Resize failed." #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "Real Time" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "Pointer to %1" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "Printer &Description" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "Remote Subnet" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "Move &Down" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "Starting daemon." #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D Acceleration:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "Test" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "Test" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "Test" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "Start Detection" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "Log Out" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "Background" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "Initial RAM Disk" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "Scanner" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "&Delete Windows" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "local time" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "local time" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "&Delete Windows" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "&Delete Windows" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "Spain" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Hittite" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "Error parsing command line." #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "Error parsing command line." #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "Application Order" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "AutoYast" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "During Boot" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "Icons" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "&Shrink Windows" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Desktop" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "&Previous" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Starting daemon." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "&Shrink Windows" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "local time" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "local time" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "&Delete Windows" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "Delay" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "Token ring" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "Token ring" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "Token ring" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "Action" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "Resolution" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "Maximum Mail Size" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "Maximum Mail Size" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "Move &Down" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "&Shrink Windows" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "Action" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "Skipping %1" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "Skipping %1" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "&Delete Windows" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "Server Resolution" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "Command: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "Command '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Error parsing command line." #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Error parsing command line." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Filter: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Desktop" #, fuzzy #~ msgid "Zoom In" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Test" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Log Out" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Log Out" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "&Delete Windows completely" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane Up" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane down" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane right" #~ msgstr "Remote Subnet" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Plane up" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Dialog" #~ msgstr "&Tone Dialling" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Window Manager" #, fuzzy #~ msgid "Notification" #~ msgstr "Action" #, fuzzy #~ msgid "Unknown" #~ msgstr "unknown" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Duration" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Do not log any" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "&Low Capacity" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Radius" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D Acceleration: " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D Acceleration: " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Test" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Russian Federation" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Russian" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "&Shrink Windows" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "&Shrink Windows" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "Maximum Mail Size" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Desktop" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "Occitan (post 1500)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D Acceleration: " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Test" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "local time" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "local time" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "&Delete Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Action" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Skipping %1" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Set Filter" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Server Resolution" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows free (%1)" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows free (%1)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Suspend" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Test" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Log Out" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Command line %d" #~ msgstr "Command: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Command: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "Provider Type" #, fuzzy #~ msgid "Corners" #~ msgstr "Cornish" #, fuzzy #~ msgid "Show switcher" #~ msgstr "Show c&hanges" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Floppy disk" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "Starting daemon." #, fuzzy #~ msgid "Terminate" #~ msgstr "Terminals" ./po/ko.po0000644000004100000410000025276613246301623012654 0ustar www-datawww-data# Korean compiz translation. # Copyright (C) 2007 compiz-fusion.org # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the compiz package. # Lee June Hee , 2007. # Hwang, Sang-Jin msgid "" msgstr "" "Project-Id-Version: Compiz 0.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2009-09-30 15:52+0200\n" "Last-Translator: Lee June Hee \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "데스크탑" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "창 관리" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "컴피즈" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "없음" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "말아올리기" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "최대화" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "가로로 최대화" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "세로로 최대화" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "최소화" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "올림" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "내림" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "창 메뉴" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "창 제목 표시줄에서 마우스 휠 스크롤시 취할 행동" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "흐림 형태" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "활성화된 창의 메타시티 테마 투명도" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "활성화된 창의 메타시티 테마 그림자 투명도" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "메타시티 테마 투명도" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "메타시티 테마 그림자 투명도" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "메타시티 테마를 가진 활성화된 창에서 사용할 투명도" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "메타시티 테마에 사용할 투명도" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "메타시티 테마를 사용하는 활성화된 창의 그림자 투명도를설정합니다." #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "메타시티 테마를 사용하는 창의 그림자 투명도를 설정합니다." #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "제목 표시줄에서 마우스 휠 사용시 할 행동" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "창 장식에서 사용할 흐림 효과의 형태" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "메타시티 테마를 사용합니다." #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "창 장식을 그릴 때 메타시티 테마를 사용합니다." #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "창 닫기" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "창 최대화 취소" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "창 최대화" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "창 최소화" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "항상 위에" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "끈적이 창 설정" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "말아올리기 해제" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "항상 위에 해제" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "끈적이 창 해제" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "창 \"%s\"가 응답하지 않습니다." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "이 응용프로그램을 강제로 종료하면 저장하지 않은 데이터는 손실됩니다." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_강제 종료" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "주석" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "주석의 채우기 색" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "주석의 외곽선 색" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "주석 플러그인" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "지우기" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "그리기" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "도구를 사용하여 그림을 그림" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "주석의 채우기 색" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "시작" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "주석 그리기를 시작" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "주석 지우기를 시작" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "지우기 시작" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "선 너비" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "주석의 선 너비" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "주석의 외곽선 색" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "테두리 너비" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "주석의 테두리 너비" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x 양선형" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "투명 흐림 효과" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "투명 창 흐림 효과" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "흐림 효과 필터" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "흐림 효과 폐색" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "흐림 효과 채도" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "흐림 효과 속도" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "창 흐림 효과" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "창의 투명한 부분 뒷면을 흐리게 합니다." #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "흐림 효과 채도" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "창 흐림 효과" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "초점을 잃은 창을 흐리게 합니다." #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "다른 창에 가려 보이지 않는 영역의 흐림 효과를 비활성화 합니다." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "흐림 효과에 사용할 필터" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "초점 흐림 효과" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "초점을 가진 창을 흐리게 합니다." #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "가우시안" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "가우시안 반경" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "가우시안 강도" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "가우시안 반경" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "가우시안 강도" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "독립적인 텍스쳐 호출" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap의 상세도" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap의 상세도" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "진동" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "진동 효과" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "최대한 독립 텍스쳐 호출을 할 수 있도록 가능한 텍스쳐 단위를 사용합니다." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "창 흐림 속도" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "초점 흐림 효과를 적용할 창" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "투명 흐림 효과를 기본적으로 사용할 창" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "화면 복제" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "복제 화면 선택 시작" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "화면 복제 관리자" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "명령 0에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "명령 1에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "명령 10에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "명령 11에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "명령 2에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "명령 3에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "명령 4에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "명령 5에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "명령 6에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "명령 7에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "명령 8에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "명령 9에 지정된 명령을 실행할 버튼" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "명령 0에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "명령 1에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "명령 10에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "명령 11에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "명령 2에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "명령 3에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "명령 4에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "명령 5에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "명령 6에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "명령 7에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "명령 8에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "명령 9에 지정된 명령을 실행할 키" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "명령 0에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "명령 1에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "명령 10에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "명령 11에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "명령 2에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "명령 3에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "명령 4에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "명령 5에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "명령 6에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "명령 7에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "명령 8에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "명령 9에 지정된 명령을 실행할 모서리" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "임의의 명령을 바로가기에 지정" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "버튼 바로가기" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "명령 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "명령 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "명령 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "명령 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "명령 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "명령 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "명령 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "명령 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "명령 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "명령 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "명령 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "명령 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "명령 0을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "명령 1을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "명령 10을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "명령 11을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "명령 2를 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "명령 3을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "명령 4를 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "명령 5를 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "명령 6을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "명령 7을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "명령 8을 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "명령 9를 선택했을 때 실행될 쉘 명령행" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "명령" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "모서리 바로가기" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "키 바로가기" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "명령 1 실행" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "명령 10 실행" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "명령 11 실행" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "명령 12 실행" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "명령 2 실행" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "명령 3 실행" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "명령 4 실행" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "명령 5 실행" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "명령 6 실행" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "명령 7 실행" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "명령 8 실행" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "명령 9 실행" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "사용 중인 플러그인 목록" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "전체 화면 창을 그릴 때, 화면 밖의 픽스맵으로 초점이 변경되지 않도록 허용함" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "경고음 소리 듣기" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "시스템 경고음 소리 듣기" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "자동으로 떠오름" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "자동으로 떠오르게 하는 지연 시간" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "모니터 자동 감지" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "갱신 주기를 자동으로 감지" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "최고" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "클릭하면 초점을 이동" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "창을 클릭하면 초점을 변경함" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "활성화된 창을 닫습니다." #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "기본 아이콘" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "기본 창 아이콘 그림" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "데스크탑 크기" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "화면 감지" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "갱신 주기 감지" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "디스플레이 설정" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "모서리 명령을 실행하기 전에 포인터가 모서리에 머물러 있어야 하는 시간" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "모서리 실행 지연 시간" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "빠름" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "초점 & 띄우기 동작" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "초점 막기 정도" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "초점을 막을 창" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "초점을 막을 창" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "독립된 화면 그리기 강제" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "일반 설정" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "일반적인 컴피즈 설정" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "좋음" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "작업 표시줄에 나타나지 않는 창을 숨김" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "모든 창을 최소화하고 초점을 바탕 화면에 맞춤" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "바탕 화면 보기 상태일 때 작업 표시줄에 없는 창을 숨기기" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "높음" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "가로 가상 크기" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "가능하다면 이미지로부터 변형된 텍스쳐를 압축합니다." #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "최대화시 힌트 무시" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "최대화시 크기 증분과 방향 힌트 무시" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "선택된 창을 띄우는 시간 간격" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Ping 메시지들 사이의 간격" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "키 바로가기" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "초점 뺏기를 막는 정도" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "조명 효과" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "현재 활성화된 플러그인의 목록" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "설정된 모니터 목록" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "낮음" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "창을 내리기" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "다른 창들 밑으로 창을 내림" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "가로로 창 최대화" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "세로로 창 최대화" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "활성화된 창 최대화" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "활성화된 창 가로로 최대화" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "활성화된 창 세로로 최대화" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "활성화된 창 최소화" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "기본" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "작업 공간의 숫자" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "가상 데스크탑의 숫자" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "끄기" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "수직 공백 주기로만 화면을 업데이트함" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "화면" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "화면 오버래핑 조절" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "모니터가 오버랩 되어있어도 각 모니터를 독립적으로 그립니다. " #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping 지연" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "더 큰 화면을 선호함" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "더 작은 화면을 선호함" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "클릭으로 띄우기" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "창 띄우기" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "선택된 창을 일정 시간 후에 띄우기" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "다른 창 위에 창을 띄우기" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "클릭했을때 창 띄우기" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "갱신 주기" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "가로 화면 크기 배수" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "세로 화면 크기 배수" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "바탕 화면 보기" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "느린 애니메이션" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "스마트 모드" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank에 동기화" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "텍스쳐 압축" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "텍스쳐 필터" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "텍스쳐 필터링" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "화면이 다시 그려지는 비율(횟수/초)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "창 최대화" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "가로로 창 최대화" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "세로로 창 최대화" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "창 말아올리기" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "활성 창을 최대화 하기" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "가로로 활성 창 최대화" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "세로로 활성 창 최대화" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "활성 창 말아올리기" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "느린 애니메이션 사용" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "활성 창 최대화 취소" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "전체 화면 창의 초점 변경 방지" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "화면이 전환될 때 빛이 퍼지는 사용" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "세로 가상 크기" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "매우 높음" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "오버래핑 된 모니터 중 선호하는 모니터" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "창 메뉴 버튼" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "창 메뉴 키" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "가속" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "이미지 조정" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "회전시 윗면 그림 조정" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "다음 슬라이드로 넘어가기" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "스카이 돔 움직이기" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "큐브 회전시 스카이 돔 움직이기" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "모양" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "자동" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "동작" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "큐브 윗면과 밑면의 색상" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "스카이 돔 그래디언트의 밑면 최종 색상" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "스카이 돔 그래디언트의 윗면 최종 색상" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "큐브 캡" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "큐브 색상" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "데스크탑 큐브" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "접기 가속" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "접는 속도" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "접는 시간 간격" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "높은 품질을 얻기 위해 가능한 경우 mipmap을 생성" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "이전 슬라이드로 가기" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "그림 파일" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "스카이 돔에 사용할 그림" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "마우스로 큐브를 회전할 때만 큐브를 투명하게 함" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "큐브 내부" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "큐브 내부" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "큐브의 윗면에 그려질 PNG와 SVG 파일 목록" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "다중 화면 모드" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "복수 큐브" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "다음 슬라이드" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "커다란 단일 큐브" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "회전할 때의 투명도" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "회전 안할 때의 투명도" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "회전할 때 바탕 화면의 투명도" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "회전 안할 때 바탕 화면의 투명도" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "큐브 위에 창을 나타냅니다." #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "이전 슬라이드" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "스카이 돔 그리기" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "그림 크기 조정" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "큐브 윗면의 그림 크기 조정" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "다중 모니터를 사용할 때 큐브가 표시되는 방법을 선택하세요." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "스카이 돔" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "스카이 돔 그라디언트 최종 색상" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "스카이 돔 그라디언트 시작 색상" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "스카이 돔 그림" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "속도" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "시간 간격" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "마우스 회전시에만 투명하게 함" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "투명 큐브" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "펼치기" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "큐브 펼치기" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus 컨트롤 백엔드" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "창 장식 텍스쳐에 mipmap 생성 허용" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "명령" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "창 장식" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "사용하고 있는 창 장식 프로그램이 없을 때 실행될 창 장식 프로그램 명령행" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "그림자 가로축 여백" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "그림자 세로축 여백" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "그림자 색" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "그림자 투명도" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "그림자 반경" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "그림자 색" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "그림자 가로축 여백" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "그림자 세로축 여백" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "그림자 투명도" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "그림자 반경" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "창 그림자" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "창 장식" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "창 장식" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "창 장식을 사용할 창" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "그림자가 있어야 하는 창" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "반응하지 않는 창의 밝기(%)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "일정한 속도" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "일정한 시간" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "응답하지 않는 창을 흐리게 함" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "창관리자의 요청에 응답하지 않는 창을 흐리게 함" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "페이드 모드" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "최소화/열기/닫기 시 페이드 효과" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "페이드 속도" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "페이드 시간" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "최소화/열기/닫기 창 이벤트 발생시 페이드 효과" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "시스템 경고음 대신 페이드 효과" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "창이 생성될 때는 페이드 인, 종료될 때는 페이드 아웃" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "창 페이드 효과" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "창 페이드 효과" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "전체 화면 시각 경고음" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "시스템 경고음 대신 전체 화면 페이드 효과" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "응답하지 않는 창의 채도(%)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "응답하지 않는 창 밝기" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "응답하지 않는 창 채도" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "시각 경고음" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "창 페이드 모드" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "\"일정한 속도\" 모드에서 창 사라짐 속도" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "\"일정한 시간\" 모드에서 창 사라짐 속도(ms)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "페이드 효과가 적용되는 창" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "마운트 포인트" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "마운트 포인트" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "사용자 공간 파일 시스템" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "사용자 공간 파일 시스템" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf 컨트롤 백엔드" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib 메인 루프 지원" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "그놈 호환성" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "터미널 열기" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Compiz가 그놈 데스크탑 환경에 호환될 수 있게 하는 옵션" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "프로그램 실행창" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "터미널 실행 명령" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "스크린샷 명령행" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "주 메뉴 보기" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "프로그램 실행창을 보임" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "주 메뉴 보기" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "스크린샷 찍기" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "창 스크린샷 찍기" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "터미널 명령행" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "창 스크린샷 명령행" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini 플랫 파일 백엔드" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "파일 변화 알림 플러그인" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig 컨트롤 백엔드" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "최소화 효과" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "창 최소화" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "최소화 속도" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "최소화 시간 간격" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "말아올리기 저항" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "말아올리기 저항" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "최소화하거나 해제할 때 창 변형하기" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "최소화시 변형되는 창" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "세로축 움직임 제한" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "작업 공간 영역으로 세로축 움직임을 제한" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "창의 이동이 끝나지 않았을 때, 창의 서버 측면 위치를 반영하지 않음" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "창 이동 시작" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "늦은 위치 반영" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "창 이동" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "창 이동" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "투명" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "움직이는 창의 투명 정도" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "드래그시 자동으로 창 최대화를 해제함" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "창 최대화 해제" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "창 이동 시작" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "밝기" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "밝기 감소" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "밝기 증가" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "밝기 단계" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "창의 밝은 정도" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "감소" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "증가" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "투명도 감소" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "투명도 증가" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "투명도 단계" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "창이 투명한 정도" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "투명, 밝기, 채도" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "투명, 밝기, 채도 조정" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "채도" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "채도 감소" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "채도 증가" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "채도 단계" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "창의 채도 정도" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "단계" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "특정한 창 설정" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "정도" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "창" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "기본적으로 다른 밝기를 갖는 창" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "기본적으로 다른 투명도를 갖는 창" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "기본적으로 다른 채도를 갖는 창" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "창 배치에 사용할 알고리즘" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "계단" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "중앙" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "고정된 창 배치" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "강제로 창을 위치" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "가로 작업 공간 위치" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "작업 영역에 유지" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "위치 설정에 적용되는 창을 작업 영역에 유지합니다. 그 위치가 특정한 위치와 다" "를지라도 유지합니다." #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "창 배치" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "모든 화면에 위치" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "창을 생성할 때 적절한 위치에 배치" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "배치 모드" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "배치된 창" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "무작위로" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "다중 화면 장치 옵션이 활성화 되었을 때 창의 배치를 어떻게 할지 선택하세요." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "똑똑하게" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "활성화 되어있는 모니터 사용" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "현재 사용 중인 창이 있는 모니터 사용" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "마우스 포인터가 있는 모니터 사용" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "세로 작업 공간 위치" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "작업 공간에 배치된 창" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "창 배치 문제의 회피 방법" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "기본적으로 배치되어야하는 창" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "기본적으로 특정 작업 공간에 배치되어야하는 창" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "윈도우 매니저가 위치시키지 않도록 했다고 해도, 강제로 위치시킬 창들을 설정합" "니다." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "고정된 위치를 갖는 창" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "고정된 작업 공간을 갖는 창" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "예비 수단" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "가로축 위치" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "작업 공간 가로축 위치" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "가로축 위치값" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "세로축 위치" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "작업 공간 세로축 위치" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "세로축 위치값" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png 이미지 불러오기" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "정규표현식 사용" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "정규표현식 창 매칭" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "바로가기" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "테두리 색" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "외곽선 창 크기 조절 모드와 사각형 창 크기 조절 모드에서 사용할 테두리 색" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "기본 창 크기 조절 모드" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "창 크기 조절할 때의 기본 모드" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "채우기 색" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "사각형 창 크기 조절 모드에서의 채우기 색" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "기본 창 크기 조절 모드 시작" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "외곽선 창 크기 조절 모드 시작" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "사각형 창 크기 조절 모드 시작" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "잡아당기기 창 크기 조절 모드 시작" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "창 크기 조절 시작" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "기본 창 크기 조절 모드" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "외곽선" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "외곽선 창 크기 조절 모드" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "사각형" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "사각형 창 크기 조절 모드" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "창 크기 조절" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "창 크기 조절" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "창 크기 조절 시작" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "창을 잡아당겨서 크기를 조절함" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "평범하게 창 크기를 조절함" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "와곽선을 이용하여 창 크기를 조절함" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "사각형을 이용하여 창 크기를 조절함" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "잡아당기기" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "잡아당기기 창 크기 조절 모드" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "기본 창 크기 조절 모드를 사용할 창" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "외곽선 창 조절 모드를 사용할 창" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "사각형 창 크기 조절 모드를 사용할 창" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "잡아당기기 창 크기 조절 모드를 사용할 창" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "드래그하여 가장자리에서 작업 공간 전환" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "가장자리에서 작업 공간 전환" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "마우스 포인터로 가장자리에서 작업 공간 전환" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "전환 시간" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "왼쪽 작업 공간으로 전환한 후, 포인터 이동" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "대상을 화면 가장자리로 드래그 하면 다음 작업 공간으로 전환" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "마우스 포인터를 화면 가장자리로 가져가면 다음 작업 공간으로 전환" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "창을 화면 가장자리로 드래그하면 다음 작업 공간으로 전환" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "오른쪽 작업 공간으로 전환한 후, 포인터 이동" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "포인터의 이동을 가로축으로 반전" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "세로축 반전" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "마우스 포인터 감도" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "작업 공간을 전환할 때 창을 올림" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "작업 공간을 전환할 때 창을 올림" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "큐브 회전" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "모든 창과 함께 왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "모든 창과 함께 오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "회전" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "모든 창과 함께 1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "모든 창과 함께 10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "모든 창과 함께 11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "12번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "모든 창과 함께 12번 작업공간으로 회전" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "모든 창과 함께 2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "모든 창과 함께 3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "모든 창과 함께 4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "모든 창과 함께 5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "모든 창과 함께 6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "모든 창과 함께 7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "모든 창과 함께 8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "모든 창과 함께 9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "큐브 회전" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "데스크탑 큐브 회전" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "활성창과 함께 왼쪽으로 회전" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "활성창과 함께 오른쪽으로 회전" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "특정 큐브 면으로 회전" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "창과 함께 특정 큐브 면으로 회전" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "활성창과 함께 1번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "활성창과 함께 10번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "활성창과 함께 11번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "12번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "활성창과 함께 12번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "활성창과 함께 2번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "활성창과 함께 3번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "활성창과 함께 4번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "활성창과 함께 5번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "활성창과 함께 6번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "활성창과 함께 7번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "활성창과 함께 8번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "활성창과 함께 9번 작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "작업 공간으로 회전" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "창 회전" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "창과 함께 회전" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "회전 가속" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "회전 속도" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "회전 시간 간격" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "회전시 확대" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "마우스 포인터 감도" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "큐브 회전시 아랫면으로 잡아당김" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "큐브 회전시 윗면으로 잡아당김" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "아랫면으로 잡아당김" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "윗면으로 잡아당김" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "회전 시작" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "작업 공간을 전환할 때의 시간 간격" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "확대" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "투명도(퍼센트)" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "크게" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "버튼으로 스케일 모드 활성화" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "버튼을 누르면 활성화되고 떼면 비활성화되는 대신 버튼으로 스케일 모드를 활성화합니다." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "바탕 화면을 클릭하면 바탕 화면 보기로 전환" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "바탕 화면을 어둡게" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "스케일 모드일 때, 바탕 화면을 어둡게함" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "아이콘" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "스케일 모드일 때, 바탕 화면을 클릭하면 바탕 화면 보기 상태로 들어가기" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "떠오르는 시간" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "창 고르기를 시작" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "모든 창에 대해서 창 고르기를 시작" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "창 그룹에 대하여 창 고르기를 시작" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "현재 화면의 창들에 대해 창 고르기를 시작" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "키로 스케일 모드 활성화" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "키를 누르면 활성화되고 떼면 비활성화되는 대신 키로 스케일 모드를 활성화합니다." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "모든 창을 배치하고 변형함" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "창 그룹을 배치하고 변형함" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "창을 배치하고 변형함" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "현재 화면의 창들을 배치하고 변형함" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "모든 모니터에 대하여" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "현재 모니터에 대하여" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "아이콘 덧붙이기" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "창이 스케일될 때 아이콘을 덧붙임" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "스케일" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "스케일" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "스케일 속도" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "스케일 시간" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "스케일" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "다중 모니터를 사용할 때 창들이 어떤 모니터에 스케일 될지 선택하세요." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "창 사이의 간격" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "간격" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "마우스가 위에 있을 때, 스케일 모드가 종료되는 시간 (ms 단위)" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "스케일 모드일 때 스케일되어야 하는 창" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "이 프로그램을 사용하여 스크린샷을 자동으로 열기" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "디렉토리" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "사각형 형태의 스크린샷을 찍음" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "프로그램 실행" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "이 디렉토리에 스크린샷을 저장함" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "스크린샷" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "스크린샷 플러그인" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg 이미지 불러오기" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "밝기(퍼센트)" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "대조(퍼센트)" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "프로그램 전환" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "자동으로 회전" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "앞으로 띄우기" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "선택한 창을 앞으로 띄우기" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "창을 전환하는 동안 바탕 화면이 뒤로 물러나는 거리" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "아이콘" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "최소화" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "다음 패널" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "다음 창" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "다음 창(모든 창)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "다음 창(전환 창 없이)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "전환 창이 없을 때는 전환 창을 보이고, 다음 창으로 전환" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "전환 창이 없을 때는 전환 창을 보이고, 모든 창 중에서 다음 창으로 전환" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "전환 창이 없을 때는 전환 창을 보이고, 모든 창 중에서 이전 창으로 전환" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "전환 창이 없을 때는 전환 창을 보이고, 모든 창 중에서 이전 창으로 전환" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "이전 패널" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "이전 창" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "이전 창(모든 창)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "이전 창(전환 창 없이)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "전환하는 동안 선택된 창으로 회전" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "다음 패널 타입 창을 선택하세요." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "전환 창을 보여주지 않고 다음 창으로 전환" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "이전 패널 타입 창을 선택합니다." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "전환 창을 보여주지 않고 다음 창으로 전환" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "미리 보기 옆에 아이콘 표시" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "최소화된 창 표시" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "전환 속도" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "전환 간격" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "창 전환" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "전환 창 안에 포함될 창들" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 색 공간 지원 제공" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "비디오 재생" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "비디오 재생" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 색 공간" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "줄 추가" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "점 추가" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "다양한 데스크탑 동작에 물결 효과를 추가함" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "빗 방울들 사이의 시간 간격(초 단위)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "마우스 포인터 물결 효과 활성화" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "줄" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "여백 크기" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "점" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "비 지연 시간" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "제목 출렁임" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "비 내리기" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "비 내리는 효과 켜기" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "와이퍼 켜기" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "와이퍼 효과 켜기" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "물결 효과" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "물결의 여백 크기" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "창 제목 표시줄에 대한 물결효과" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "초점 효과" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "창 초점 효과" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "창 초점" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "충돌" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "창 잡기" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "격자 해상도" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "창 반대로 잡아당기기" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "창 떨리게 하기" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "선택 효과" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "창 선택 효과" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "적용되는 창" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "최대화 효과" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "격자의 최소 크기" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "최소 격자 크기" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "창 이동" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "떨림" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "반대로 잡아당기기" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "창 잡아당기기" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "용수철 마찰" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "용수철 K" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "용수철 상수" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "창 잡아당기기" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "출렁거리는 효과를 위해 용수철 모델 사용" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "격자 해상도" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "창 활성화시 출렁거리는 효과" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "창 선택시 출렁거리는 효과" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "창을 선택할 때 출렁거리는 효과" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "창 이동시 출렁거리는 효과" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "창을 최대화하거나 해제할 때 출렁거리는 효과" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "창 출렁거림" #~ msgid "Command line 0" #~ msgstr "명령 0" #~ msgid "Run command 0" #~ msgstr "명령 0 실행" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "스크린샷 명령행" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "스크린샷 명령행" #~ msgid "Filter Linear" #~ msgstr "선형 필터" #~ msgid "Use linear filter when zoomed in" #~ msgstr "확대할 때 선형 필터 적용" #~ msgid "Zoom Desktop" #~ msgstr "데스크탑 확대" #~ msgid "Zoom In" #~ msgstr "확대" #~ msgid "Zoom Out" #~ msgstr "축소" #~ msgid "Zoom Pan" #~ msgstr "확대 이동" #~ msgid "Zoom Speed" #~ msgstr "확대 속도" #~ msgid "Zoom Timestep" #~ msgstr "확대 시간 간격" #~ msgid "Zoom and pan desktop cube" #~ msgstr "데스크탑 큐브 확대 이동" #~ msgid "Zoom factor" #~ msgstr "확대율" #~ msgid "Zoom pan" #~ msgstr "확대 이동" #~ msgid "Decrease window opacity" #~ msgstr "창 투명도 줄이기" #~ msgid "Increase window opacity" #~ msgstr "창 투명도 증가" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "기본적으로 투명한 창들의 투명도 값" #~ msgid "Opacity windows" #~ msgstr "창 투명도" #~ msgid "Background Images" #~ msgstr "배경 그림" #~ msgid "Background images" #~ msgstr "배경 그림" #~ msgid "Place windows on a plane" #~ msgstr "창을 평면 위에 배치" #~ msgid "Plane Down" #~ msgstr "화면을 아래로" #~ msgid "Plane Left" #~ msgstr "화면을 왼쪽으로" #~ msgid "Plane Right" #~ msgstr "화면을 오른쪽으로" #~ msgid "Plane To Face 1" #~ msgstr "화면을 1번 작업 공간으로 이동" #~ msgid "Plane To Face 10" #~ msgstr "화면을 10번 작업 공간으로 이동" #~ msgid "Plane To Face 11" #~ msgstr "화면을 11번 작업 공간으로 이동" #~ msgid "Plane To Face 12" #~ msgstr "화면을 12번 작업 공간으로 이동" #~ msgid "Plane To Face 2" #~ msgstr "화면을 2번 작업 공간으로 이동" #~ msgid "Plane To Face 3" #~ msgstr "화면을 3번 작업 공간으로 이동" #~ msgid "Plane To Face 4" #~ msgstr "화면을 4번 작업 공간으로 이동" #~ msgid "Plane To Face 5" #~ msgstr "화면을 5번 작업 공간으로 이동" #~ msgid "Plane To Face 6" #~ msgstr "화면을 6번 작업 공간으로 이동" #~ msgid "Plane To Face 7" #~ msgstr "화면을 7번 작업 공간으로 이동" #~ msgid "Plane To Face 8" #~ msgstr "화면을 8번 작업 공간으로 이동" #~ msgid "Plane To Face 9" #~ msgstr "화면을 9번 작업 공간으로 이동" #~ msgid "Plane Up" #~ msgstr "화면을 위로" #~ msgid "Plane down" #~ msgstr "화면을 아래로" #~ msgid "Plane left" #~ msgstr "화면을 왼쪽으로" #~ msgid "Plane right" #~ msgstr "화면을 오른쪽으로" #~ msgid "Plane to face 1" #~ msgstr "화면을 1번 작업 공간으로 이동" #~ msgid "Plane to face 10" #~ msgstr "화면을 10번 작업 공간으로 이동" #~ msgid "Plane to face 11" #~ msgstr "화면을 11번 작업 공간으로 이동" #~ msgid "Plane to face 12" #~ msgstr "화면을 12번 작업 공간으로 이동" #~ msgid "Plane to face 2" #~ msgstr "화면을 2번 작업 공간으로 이동" #~ msgid "Plane to face 3" #~ msgstr "화면을 3번 작업 공간으로 이동" #~ msgid "Plane to face 4" #~ msgstr "화면을 4번 작업 공간으로 이동" #~ msgid "Plane to face 5" #~ msgstr "화면을 5번 작업 공간으로 이동" #~ msgid "Plane to face 6" #~ msgstr "화면을 6번 작업 공간으로 이동" #~ msgid "Plane to face 7" #~ msgstr "화면을 7번 작업 공간으로 이동" #~ msgid "Plane to face 8" #~ msgstr "화면을 8번 작업 공간으로 이동" #~ msgid "Plane to face 9" #~ msgstr "화면을 9번 작업 공간으로 이동" #~ msgid "Plane up" #~ msgstr "화면을 위로" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "데스크탑 창 투명도 페이드 시간" ./po/zh_TW.po0000644000004100000410000036364613246301623013276 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: 2009-10-08 11:34+0200\n" "Last-Translator: Yichih Liu \n" "Language-Team: Novell Language \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "桌面" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "視窗管理員" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "無" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "陰影" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "最大化" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "將視窗水平最大化" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "將視窗垂直最大化" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "最小化" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "前景視窗" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "低" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "視窗選單" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "滑鼠滾輪在視窗標題列上的動作" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "柔化方式" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Metacity 佈景主題使用中的視窗透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Metacity 佈景主題使用中的視窗陰影透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Metacity 佈景主題透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Metacity 佈景主題的陰影透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "使用 Metacity 視窗管理員時,作用中視窗的透明度。" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "使用 Metacity 佈景主題的透明度" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "使用 Metacity 佈景主題,從不透明到半透明的作用中視窗陰影" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "使用 Metacity 佈景主題,並添加從透明到不透明的漸變效果。" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "標題列滑鼠滾輪動作" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "針對視窗裝飾的模糊方式" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "使用 metacity 主題" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "給視窗裝飾引擎指定使用 metacity 佈景主題" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "關閉視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "視窗解除最大化" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "最大化視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "最小化視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "保持至頂" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "沾黏視窗" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "解除陰影" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "取消至頂" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "取消沾黏" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "視窗\"%s\"已經沒有反應" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "強制離開這個應用程式,會導致您尚未儲存的資料遺失。" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "強制離開" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "桌面畫筆" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "桌面畫筆色彩" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "桌面畫筆描述色彩" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "桌面畫筆外掛" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "清除桌面塗鴉" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "畫" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "使用工具畫圖" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "畫筆要用的色彩" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "開始畫按鍵" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "開始使用桌面畫筆的按鍵設定" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "桌面畫筆的橡皮擦按鍵設定" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "桌面畫筆橡皮擦" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "線條寬度" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "桌面畫筆的線條寬度" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "桌面畫筆描述顏色" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "桌面畫筆描述寬度" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "桌面畫筆的描述寬度" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x雙線性過濾器" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alpha柔化效果" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alpha柔化視窗" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "柔化濾鏡" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "柔化咬合" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "柔化飽和度" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "柔化速度" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "柔化視窗" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "柔化在視窗後面半透明的部份" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "柔化飽和度" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "柔化視窗" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "對非前景的視窗採取柔化處理" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "關閉其他視窗遮蔽螢幕區域的柔化功能" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "模糊過濾器的使用方式" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "焦點柔化" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "焦點柔化視窗" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "高斯柔化" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "高斯柔化半徑" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "高斯柔化強度" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "高斯柔化半徑" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "高斯柔化強度" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "擷取獨立紋理" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Mipmap LOD" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Mipmap 細節層次" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulse" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulse效果" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "使用現有的材質單元,做盡可能多的獨立紋理擷取" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "視窗柔化速度" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "應該被聚焦柔化的視窗" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "視窗應以alpha柔化為預設值" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "多螢幕時相同輸出" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "啟動複製畫面選擇" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "輸出複製畫面處理" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "當滑鼠按鍵設定啟用,將會執行第0個shell指令。" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "當滑鼠按鍵設定啟用,將會執行第1個shell指令。" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "當滑鼠按鍵設定啟用,將會執行第10個shell指令。" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "當滑鼠按鍵設定啟用,將會執行第11個shell指令。" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "當滑鼠按鍵設定啟用,將會執行第2個shell指令。" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "當滑鼠按鍵設定啟用,將會執行第3個shell指令。" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "當滑鼠按鍵設定啟用,將會執行第4個shell指令。" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "當滑鼠按鍵設定啟用,將會執行第5個shell指令。" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "當滑鼠按鍵設定啟用,將會執行第6個shell指令。" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "當滑鼠按鍵設定啟用,將會執行第7個shell指令。" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "當滑鼠按鍵設定啟用,將會執行第8個shell指令。" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "當滑鼠按鍵設定啟用,將會執行第9個shell指令。" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "當鍵盤按鍵設定啟用,將會執行第0個shell指令。" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "當鍵盤按鍵設定啟用,將會執行第1個shell指令。" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "當鍵盤按鍵設定啟用,將會執行第10個shell指令。" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "當鍵盤按鍵設定啟用,將會執行第11個shell指令。" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "當鍵盤按鍵設定啟用,將會執行第2個shell指令。" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "當鍵盤按鍵設定啟用,將會執行第3個shell指令。" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "當鍵盤按鍵設定啟用,將會執行第4個shell指令。" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "當鍵盤按鍵設定啟用,將會執行第5個shell指令。" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "當鍵盤按鍵設定啟用,將會執行第6個shell指令。" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "當鍵盤按鍵設定啟用,將會執行第7個shell指令。" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "當鍵盤按鍵設定啟用,將會執行第8個shell指令。" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "當鍵盤按鍵設定啟用,將會執行第9個shell指令。" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第0個shell指令。" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第1個shell指令。" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第10個shell指令。" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第11個shell指令。" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第2個shell指令。" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第3個shell指令。" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第4個shell指令。" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第5個shell指令。" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第6個shell指令。" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第7個shell指令。" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第8個shell指令。" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "當螢幕外緣啟動(edge)有設定,將會執行第9個shell指令。" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "設定使用者定義的shell指令,可以用不同的方式啟動。" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "滑鼠與鍵盤設定" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "shell指令 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "shell指令 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "shell指令 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "shell指令 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "shell指令 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "shell指令 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "shell指令 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "shell指令 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "shell指令 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "shell指令 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "shell指令 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "shell指令 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "當shell指令0設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "當shell指令1設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "當shell指令10設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "當shell指令11設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "當shell指令2設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "當shell指令3設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "當shell指令4設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "當shell指令5設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "當shell指令6設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "當shell指令7設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "當shell指令8設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "當shell指令9設定之後,將會在shell裏面執行這個指令。" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "預設指令(Commands)" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "螢幕外緣啟動(Edge)設定" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "鍵盤按鍵設定" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "執行指令 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "執行指令 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "執行指令 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "執行指令 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "執行指令 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "執行指令 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "執行指令 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "執行指令 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "執行指令 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "執行指令 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "執行指令 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "執行指令 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "啟用外掛程式" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "使全螢幕的描繪動作不會重新導向到幕後像素映射" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "可以聽見鈴聲" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "可以聽見系統鈴聲" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "自動選定視窗到前景" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "自動選定視窗移動到前景的延遲時間" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "自動偵測輸出設備" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "自動偵測重新整理速率" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "最佳" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "按一下視窗才選定該視窗" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "在視窗上按一下便可將輸入焦點移動到該視窗(啟用此功能會導致下方「自動選定視窗到前景」功能失效)" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "關閉作用中視窗" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "預設圖示" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "預設的視窗圖示影像" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "虛擬桌面數量" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "偵測輸出" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "偵測重新整理速率" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "顯示設定" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "螢幕外緣啟動(Edge)的延遲啟動時間。" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "螢幕外緣啟動(Edge)延遲" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "快速" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "定焦 & 前景視窗" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "防止定焦程度" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "防止定焦視窗" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "防止定焦視窗" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "強制單獨描繪輸出" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "通用選項" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "通用compiz選項" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "好" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "隱藏跳過工作列視窗" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "隱藏全部視窗並定焦桌面" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "進入顯示桌面模式時隱藏未在工作列的視窗" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "高" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "水平虛擬桌面數量" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "如果可能,從圖片影像當中取得的紋理材質進行壓縮" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "最大化時忽略提示" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "視窗最大化時忽略大小增量與畫面提示" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "在將選定的視窗移到前景的緩衝時間" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "在ping訊息之間的緩衝時間" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "鍵盤與滑鼠按鍵設定" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "預防定焦程度" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "光源" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "顯示目前啟用中的外掛程式清單" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "描述輸出設備的字串清單" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "低" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "後景視窗" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "將視窗降低到其他前景視窗之下" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "將視窗水平最大化" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "將視窗垂直最大化" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "最大化作用中視窗" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "將作用中視窗水平最大化" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "將作用中視窗垂直最大化" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "最小化作用中視窗" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "一般" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "桌面數" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "虛擬桌面數" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "關" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "只在垂直空白期間執行螢幕更新" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "輸出" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "重疊輸出處理" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "繪製每個獨立的輸出裝置,即使是輸出裝置有重複" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping延遲" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "首選大的輸出" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "首選小的輸出" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "按一下視窗時選定該視窗到前景" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "前景視窗" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "在設定的時間間隔後,將選定的視窗移到前景" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "將選定的視窗移到其他視窗最前面" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "在按一下時將選定的視窗排列到最前景" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "重新整理速率" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "水平方向虛擬桌面的數量設定" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "垂直方向虛擬桌面的數量設定" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "顯示桌面" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "減慢動畫速度" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "聰明模式自動調整" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "同步化到 VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "材質壓縮" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "材質過濾器" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "材質篩選" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "螢幕重新描繪的速率 (次數/秒)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "將視窗切換到最大" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "將視窗水平切換到最大" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "將視窗垂直切換到最大" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "將視窗切換到遮蔽" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "將使用中視窗切換到最大" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "將使用中視窗水平切換到最大" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "將使用中視窗垂直切換到最大" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "將使用中視窗切換到遮蔽" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "切換使用減慢動畫速度" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "作用中視窗解除最大化" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "全螢幕視窗解除重新導向" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "在螢幕轉換時使用擴散光" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "垂直虛擬桌面數量" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "非常高" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "設定哪個重疊輸出裝置為首選" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "視窗選單滑鼠按鍵設定" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "視窗選單鍵盤按鍵設定" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "加速" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "調整圖片" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "調整頂部圖片影像旋轉" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "前進到下一個slide" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "天空頂動態展示" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "旋轉立方體時天空頂以動態展現" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "外觀" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "自動" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "特性" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "立方體的頂面和底面顏色" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "使用顏色逐漸變化的方式,到底部結束顏色" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "使用顏色逐漸變化的方式,到頂部結束顏色" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "立方體上蓋" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "立方體色彩" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "桌面立方體" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "摺疊加速" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "摺疊速度" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "摺疊時間間隔" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "有可能產生mipmaps來產生更高品質的縮放" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "返回上一個slide" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "影像檔" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "用來作為天空頂材質的影像" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "用滑鼠轉動立方體時展現立方體透明化效果" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "立方體內部" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "立方體內部" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "應該要描繪至立方體頂面的 PNG 和 SVG 檔案清單" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "多重輸出模式" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "多重立方體" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "下一個slide" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "一個大的單獨立方體" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "旋轉時的透明度" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "非旋轉時的透明度" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "桌面視窗在旋轉時的透明度" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "桌面視窗在未旋轉時的透明度" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "將視窗放到立方體" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "上一個Slide" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "描繪天空頂" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "調整影像比例" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "調整影像比例以覆蓋立方體頂面" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "選擇立方體要如何顯示,如果有多個輸出裝置可使用" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "天空頂" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "天空頂漸層結束色彩" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "天空頂漸層開始色彩" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "天空頂影像" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "速度" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "時間間隔" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "使用滑鼠旋轉時才透明化" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "透明立方體" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "展開" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "展開立方體" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus控制台" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "允許裝飾紋理材質產生mipmaps" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "指令" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "裝飾視窗" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "如果沒有裝飾程式正在執行,則需指定要執行的視窗裝飾程式指令。" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "陰影 X 軸偏移" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "陰影 Y 軸偏移" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "設定陰影顏色" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "陰影不透明度" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "陰影半徑" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "陰影顏色" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "陰影偏移 X 軸" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "陰影偏移 Y 軸" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "陰影不透明度" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "陰影半徑" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "陰影視窗" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "視窗裝飾" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "視窗裝飾" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "設定哪些視窗結構應該被裝飾" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "設定哪些視窗結構應該擁有陰影" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "未響應視窗亮度(%)" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "速度常數" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "時間常數" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "暗淡無響應視窗" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "暗淡化對於視窗管理器沒有反應的視窗" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "淡入/淡出模式" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "最小化/開啟/關閉 視窗時淡入/淡出" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "淡入/淡出速度" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "淡入/淡出時間" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "當視窗採取 最小化/開啟/關閉 的動作時,使用淡入/淡出特效" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "系統發出嗶聲時啟用淡入/淡出特效" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "在映射時(mapped)淡入視窗,以及在解除映射時淡出視窗" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "淡入/淡出視窗" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "視窗淡入/淡出中" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "全螢幕警示鈴聲" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "系統發出嗶聲時啟用全螢幕淡出/淡入特效" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "無反應視窗的飽和度(以%來設定)" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "無反應視窗的亮度" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "無反應視窗的飽和度" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "視覺鈴聲" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "視窗淡入/淡出模式" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "視窗淡入/淡出速度以「速度常數」模式進行" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "視窗淡入/淡出速度以「時間常數」模式進行(以ms毫秒為基數)" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "應該淡入/淡出的視窗類型" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Compiz的掛載位置" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Compiz的掛載位置" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "使用者紀錄放置位置" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "使用者的紀錄放置位置" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf 控制台" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib main loop支援。(GLib為一個補助GTK+的函式庫)" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Gnome的相容性" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "開啟一個終端機執行" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "使Compiz能與Gnome桌面環境相容的環境設定" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "執行對話方塊" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "執行終端機指令" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "螢幕擷取指令" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "顯示主功能表" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "顯示執行應用程式對話方塊" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "顯示主功能表" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "擷取螢幕畫面" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "擷取視窗螢幕畫面" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "終端機的指令" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "視窗螢幕擷取指令" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini平面檔案控制台" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "檔案被改變時警告外掛" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify檔案監控機制" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig控制台" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "最小化特效" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "最小化視窗" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "最小化速度" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "最小化時間間隔" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "遮蔽阻力" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "遮蔽阻力" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "在最小化和解除最小化時變化視窗" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "最小化時應該變化的視窗類型" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "等比縮放 Y 軸" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "等比縮放 Y 軸對應到工作環境區域" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "視窗移動結束之前不更新server端視窗的位置" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "開始視窗移動" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "懶惰定位" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "移動視窗" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "移動視窗" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "不透明度" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "移動視窗的不透明度" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "在拖曳已最大化視窗時為其解除嵌入和自動解除最大化" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "解除嵌入最大化視窗" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "開始移動視窗" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "亮度" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "降低亮度" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "增加亮度" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "亮度幅度" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "視窗的亮度值" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "減少" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "增加" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "不透明度減少" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "不透明度增加" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "不透明度幅度" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "視窗的不透明度" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "不透明、亮度與飽和度" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "不透明、亮度與飽和度調整" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "飽和度" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "飽和度降低" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "飽和度增加" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "飽和度幅度" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "視窗的飽和度" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "幅度" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "視窗的具體設定" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "幅度數值" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "何種視窗" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "預設視窗應該有一個不同的亮度" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "預設視窗應該有一個不同的不透明度" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "預設視窗應該有一個不同的飽和度" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "視窗放置的使用方式" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "層疊" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "居中" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "固定視窗位置" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "強制視窗位置" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "水平視點位置" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "保持在工作區域" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "保持在視窗工作區域,即使與指定位置不同" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "放置視窗" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "放置在所有的輸出裝置" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "在視窗描繪時將視窗放置到適當位置" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "放置方法" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "視窗的部位" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "隨機亂數" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "如果有多個輸出裝置可使用時,視窗要如何定位。" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "聰明模式" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "使用已使用中的輸出裝置" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "使用已選視窗的那個輸出裝置" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "使用已選點選那個輸出裝置" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "垂直視點位置" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "視窗的視點位置" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "視窗位置的解決方式" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "預設的視窗位置" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "預設的自定義視窗視點位置" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "即使視窗管理員禁止放置的區域,仍然強制放置視窗" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "視窗以位置方式固定" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "視窗以視點方式固定" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "視窗位置解決方式" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X座標的位置" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X座標視點的位置" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X座標位置的數值" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y座標的位置" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y座標視點的位置" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y座標位置的數值" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png圖檔" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "讀取Png影響圖檔" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "規則匹配" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "規則視窗匹配" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "連結" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "邊框顏色" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "邊框顏色用於外框與矩形調整模式" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "預設調整大小方法" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "調整視窗大小的預設方法" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "填滿色彩" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "在矩型調整模式下填滿色彩" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "開始調整視窗大小" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "開始調整視窗外框大小" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "開始調整矩型視窗大小" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "開始拉伸視窗大小" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "開始調整視窗大小" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "正常的視窗調整" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "外框" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "調整視窗外框" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "矩形" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "矩型調整視窗" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "調整視窗大小" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "調整視窗大小" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "開始調整視窗大小" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "開始使用拉伸方式調整視窗大小" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "開始正常調整視窗" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "開始調整視窗外框" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "開始調整視窗矩形" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "拉伸" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "拉伸調整視窗" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "正常視窗調整應該使用在" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "外框視窗調整應該使用在" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "矩形視窗調整應該使用在" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "拉伸視窗調整應該使用在" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "邊緣翻轉拖放" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "邊緣翻轉移動" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "邊緣翻轉點" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "翻轉時間" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "往左檢視區翻轉並跳躍指標" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "將物件拖曳到螢幕邊緣時翻轉到下一個檢視區" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "將指標移動到螢幕邊緣時翻轉到下一個檢視區" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "將視窗移動到螢幕邊緣時翻轉到下一個檢視區" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "往右檢視區翻轉並跳躍指標" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "指標移動時的 Y 軸相反" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "指標 Y 軸相反" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "指標靈敏度" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "在旋轉時提高" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "在旋轉時提高視窗高度" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "旋轉立方體" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "往左旋轉翻轉" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "往右旋轉翻轉" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "往左旋轉" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "視窗跟隨往左旋轉" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "往右旋轉" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "視窗跟隨往右旋轉" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "旋轉至" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "旋轉到第1面" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "視窗跟隨旋轉到第1面" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "旋轉到第10面" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "視窗跟隨旋轉到第10面" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "旋轉到第11面" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "視窗跟隨旋轉到第11面" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "旋轉到第12面" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "視窗跟隨旋轉到第12面" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "旋轉到第2面" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "視窗跟隨旋轉到第2面" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "旋轉到第3面" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "視窗跟隨旋轉到第3面" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "旋轉到第4面" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "視窗跟隨旋轉到第4面" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "旋轉到第5面" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "視窗跟隨旋轉到第5面" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "旋轉到第6面" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "視窗跟隨旋轉到第6面" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "旋轉到第7面" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "視窗跟隨旋轉到第7面" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "旋轉到第8面" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "視窗跟隨旋轉到第8面" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "旋轉到第9面" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "視窗跟隨旋轉到第9面" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "旋轉立方體" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "旋轉桌面立方體" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "往左旋轉" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "連同現行的視窗往左旋轉" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "往右旋轉" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "連同現行的視窗往右旋轉" # 轉到第1面 #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "旋轉到立方體到另一個面" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "視窗隨著立方體旋轉到另一個面" # 轉到第1面 #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "旋轉到第1面" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "連同現行的視窗旋轉到第1面" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "旋轉到第10面" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "連同現行的視窗旋轉到第10面" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "旋轉到第11面" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "連同現行的視窗旋轉到第11面" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "旋轉到第12面" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "連同現行的視窗旋轉到第12面" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "旋轉到第2面" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "連同現行的視窗旋轉到第2面" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "旋轉到第3面" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "連同現行的視窗旋轉到第3面" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "旋轉到第4面" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "連同現行的視窗旋轉到第4面" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "旋轉到第5面" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "連同現行的視窗旋轉到第5面" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "旋轉到第6面" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "連同現行的視窗旋轉到第6面" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "旋轉到第7面" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "連同現行的視窗旋轉到第7面" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "旋轉到第8面" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "連同現行的視窗旋轉到第8面" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "旋轉到第9面" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "連同現行的視窗旋轉到第9面" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "往檢視區旋轉" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "旋轉視窗" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "隨視窗旋轉" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "旋轉加速" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "旋轉速度" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "旋轉時間間隔" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "旋轉縮放" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "指標移動靈敏度" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "吸附立方體旋轉至下面" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "吸附立方體旋轉至頂面" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "吸附到下面" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "吸附到上面" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "開始旋轉" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "翻轉視點前的逾時時間" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "縮放" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "不透明度比例" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "大" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "視窗縮放切換的滑鼠鍵盤設定" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "設定滑鼠與鍵盤的按鍵,當按下時進行視窗縮放,放開之後停止視窗縮放。" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "按下桌面來顯示桌面" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "暗化背景" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "調整視窗比例時暗化背景" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "象徵" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "在縮放時,點擊桌面將會進入桌面顯示模式" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "停留時間" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "起始化視窗選擇器" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "啟始化所有視窗的視窗選擇器" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "啟始化視窗群組的視窗選擇器" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "在目前輸出中的視窗上啟始化視窗選擇器" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "設定鍵盤聯結切換縮放模式" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "鍵盤的縮放聯結按鍵代替滑鼠的縮放調整,當放開鍵盤聯結按鍵之後,會自動關閉縮放調整。" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "配置並開始轉換所有視窗" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "配置並開始轉換視窗群組" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "配置和開始轉換視窗" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "在目前輸出配置並開始轉換視窗" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "在所有的輸出裝置上" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "在目前輸出裝置上" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "覆蓋圖示" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "縮放視窗時覆蓋圖示" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "調整比例" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "縮放視窗" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "縮放速度" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "縮放時間間隔" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "視窗縮放" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "假如已使用多個輸出裝置時,則選擇在哪個視窗中縮放" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "視窗間隔" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "間距" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "停留在視窗上多久 (毫秒) 後停止調整比例模式" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "縮放模式下應該縮放的視窗類型" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "在這個應用程式中自動開啟螢幕擷取" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "目錄" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "啟用矩型選擇擷取螢幕" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "啟動的應用程式" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "將螢幕擷取的影像放置在這個目錄下" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "螢幕擷取" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "螢幕擷取外掛" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg 圖檔載入器" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "亮度比例" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "飽和度比例" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "應用程式切換器" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "自動輪流轉換" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "提到最上層" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "將選取視窗提到最上層" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "切換視窗時桌面應縮小的距離" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "圖示" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "最小化" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "下一個面板" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "下一個視窗" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "下一個視窗(全部視窗)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "下一個視窗(沒有彈出)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "看不到切換器時快顯切換器,並選取下一個視窗" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "看不到切換器時快顯切換器,並從所有視窗選取下一個視窗" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "看不到切換器時快顯切換器,並選取上一個視窗" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "看不到切換器時快顯切換器,並從所有視窗選取上一個視窗" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "上一個面板" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "上一個視窗" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "上一個視窗(全部視窗)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "上一個視窗(沒有彈出)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "當切換時交換所選擇的視窗" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "選取下一個視窗面板樣式" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "選取下一個視窗不要顯示提示視窗" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "選取上一個視窗面板樣式" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "選取上一個視窗時不要顯示出提示視窗" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "顯示圖示於縮圖旁" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "顯示最小化的視窗" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "切換速度" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "切換時間間隔" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "切換視窗" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "在切換當中要顯示視窗" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "提供YV12色彩空間的支援" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "影像播放" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "影像播放" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12色彩空間" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "新增線" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "新增點" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "新增水波特效到不同的桌面動作" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "每滴雨之間的延遲 (毫秒)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "啟用指標水波特效" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "線" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "偏移比例" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "點" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "下雨延遲" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "標題波紋" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "切換下雨" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "切換下雨特效" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "切換雨刷" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "切換雨刷效果" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "水波特效" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "水波偏移比例" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "視窗標題的波紋效果" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "定焦特效" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "定焦視窗特效" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "視窗定焦" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "摩擦力" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "格線視窗" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "格線解析度" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "視窗反向吸附" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "讓視窗晃動" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "映射特效" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "映射視窗特效" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "映射視窗" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "最大化特效" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "最小格線大小" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "最小頂點格線大小" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "移動視窗" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "晃動" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "反向吸附" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "視窗吸附" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "彈簧摩擦力" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "彈簧 K 值" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "彈簧常數" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "切換視窗吸附" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "針對搖擺視窗特效使用彈簧模式" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "頂點格線解析度" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "視窗定焦時搖擺視窗" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "抓取視窗時搖擺視窗" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "視窗映射時搖擺視窗" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "移動視窗時搖擺視窗" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "視窗最大化和解除最大化時啟用搖擺特效" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "搖擺視窗" #, fuzzy #~ msgid "Command line 0" #~ msgstr "指令行 10" #, fuzzy #~ msgid "Run command 0" #~ msgstr "執行指令 10" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "螢幕擷取指令行" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "螢幕擷取指令行" #~ msgid "Filter Linear" #~ msgstr "線性過濾器" #, fuzzy #~ msgid "Use linear filter when zoomed in" #~ msgstr "在放大時使用線性過濾器" #~ msgid "Zoom Desktop" #~ msgstr "縮放桌面" #~ msgid "Zoom In" #~ msgstr "放大" #~ msgid "Zoom Out" #~ msgstr "縮小" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "放大" #~ msgid "Zoom Speed" #~ msgstr "縮放速度" #~ msgid "Zoom Timestep" #~ msgstr "縮放時間間隔" #~ msgid "Zoom and pan desktop cube" #~ msgstr "縮放和平移桌面立方體" #~ msgid "Zoom factor" #~ msgstr "縮放倍率" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "放大" #~ msgid "Decrease window opacity" #~ msgstr "降低視窗不透明度" #~ msgid "Increase window opacity" #~ msgstr "提高視窗不透明度" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "視窗間隔" #~ msgid "Background Images" #~ msgstr "背景圖案" #~ msgid "Background images" #~ msgstr "背景圖案" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "將視窗放到立方體" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Page Down" #, fuzzy #~ msgid "Plane Left" #~ msgstr "往左旋轉" #, fuzzy #~ msgid "Plane Right" #~ msgstr "往右旋轉" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Page Up" #, fuzzy #~ msgid "Plane down" #~ msgstr "放置視窗" #, fuzzy #~ msgid "Plane left" #~ msgstr "往左旋轉" #, fuzzy #~ msgid "Plane right" #~ msgstr "往右旋轉" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane up" #~ msgstr "Page Up" #~ msgid "Open window menu" #~ msgstr "開啟視窗功能表" #~ msgid "Dock" #~ msgstr "黏合" #~ msgid "Toolbar" #~ msgstr "工具列" #~ msgid "Menu" #~ msgstr "功能表" #~ msgid "Utility" #~ msgstr "公用程式" #~ msgid "Splash" #~ msgstr "開頭顯示畫面" #~ msgid "Dialog" #~ msgstr "對話方塊" #~ msgid "DropdownMenu" #~ msgstr "DropdownMenu" #~ msgid "PopupMenu" #~ msgstr "PopupMenu" #~ msgid "Tooltip" #~ msgstr "工具提示" #~ msgid "Notification" #~ msgstr "通知" #~ msgid "Combo" #~ msgstr "組合" #~ msgid "Dnd" #~ msgstr "Dnd" #~ msgid "ModalDialog" #~ msgstr "ModalDialog" #~ msgid "Fullscreen" #~ msgstr "全螢幕" #~ msgid "Unknown" #~ msgstr "未知的" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command0 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command10 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command1 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command10 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command10 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command11 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command11 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command2 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command3 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command4 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command5 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command6 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command7 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command8 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "啟用時將執行經 command9 識別之外圍程序指令的按鍵組合" #, fuzzy #~ msgid "" #~ "Add line (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Add point (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Advance to next slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Amount of brightness in percent (0-100)" #~ msgstr "亮度比例" #, fuzzy #~ msgid "Amount of opacity in percent (0-100)" #~ msgstr "不透明度比例" #, fuzzy #~ msgid "Amount of saturation in percent (0-100)" #~ msgstr "飽和度比例" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "飽和度" #, fuzzy #~ msgid "" #~ "Clear (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Close active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Decrease window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Delay (in ms) between each rain-drop (0-3600000)" #~ msgstr "每滴雨之間的延遲 (毫秒)" #, fuzzy #~ msgid "" #~ "Distance desktop should be zoom out while switching windows (0.0-5.0)" #~ msgstr "切換視窗時桌面應縮小的距離" #~ msgid "Do not modify" #~ msgstr "不要修改" #, fuzzy #~ msgid "" #~ "Draw using tool (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Drop shadow X offset (-16-16)" #~ msgstr "投影 X 軸偏移" #, fuzzy #~ msgid "Drop shadow Y offset (-16-16)" #~ msgstr "投影 Y 軸偏移" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "投影半徑不透明度" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "投影半徑" #, fuzzy #~ msgid "" #~ "Enable pointer water effects (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Flip to left viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Flip to right viewport and warp pointer (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #~ msgid "Focus Window Effect (None, Shiver)" #~ msgstr "定焦視窗特效 (無、瞬間)" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "選取上一個視窗" #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "摺疊加速 (1.0-20.0)" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "摺疊速度 (0.1-50.0)" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "摺疊時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "俄羅斯聯邦" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "俄語" #, fuzzy #~ msgid "" #~ "Go back to previous slide (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Hide all windows and focus desktop (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Increase window opacity (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Initiate annotate drawing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Initiate annotate erasing (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Initiate clone selection (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Initiate rectangle screenshot (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Interval before raising selected windows (0-10000)" #~ msgstr "提高選定視窗的時間間隔" #, fuzzy #~ msgid "" #~ "Layout and start transforming all windows (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Layout and start transforming window group (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Layout and start transforming windows on current output (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "在目前輸出配置並開始轉換視窗" #, fuzzy #~ msgid "" #~ "Lower window beneath other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Make window shiver (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "映射視窗特效 (無、瞬間)" #, fuzzy #~ msgid "" #~ "Maximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Maximize active window horizontally (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Maximize active window vertically (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Minimize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "最小化速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "最小化速度 (0.1-50.0)" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "最小頂點格線大小" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "虛擬桌面數" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "不透明度變更間隔" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "移動視窗的不透明度" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "移動視窗的不透明度" #, fuzzy #~ msgid "" #~ "Open a terminal (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Open window menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Overlay an icon on windows once they are scaled (None, Emblem, Big)" #~ msgstr "調整視窗比例後在上面重疊圖示" #, fuzzy #~ msgid "" #~ "Plane down (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Plane up (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #~ msgid "Plugins that this must load before" #~ msgstr "在此之前必須先載入的外掛程式" #~ msgid "Plugins that this requires" #~ msgstr "這時需要的外掛程式" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "看不到切換器時快顯切換器,並從所有視窗選取下一個視窗" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select next window out of all windows " #~ "(Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "看不到切換器時快顯切換器,並從所有視窗選取下一個視窗" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window (Left, Right, " #~ "Top, Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "看不到切換器時快顯切換器,並從所有視窗選取上一個視窗" #, fuzzy #~ msgid "" #~ "Popup switcher if not visible and select previous window out of all " #~ "windows (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "看不到切換器時快顯切換器,並從所有視窗選取上一個視窗" #, fuzzy #~ msgid "" #~ "Pulse effect (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Raise window above other windows (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate left (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate left and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate right (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate right and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 1 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 10 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 11 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 12 and bring active window along (Left, Right, Top, " #~ "Bottom, TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 2 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 3 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 4 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 5 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 6 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 7 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 8 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to face 9 and bring active window along (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate to viewport (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Rotate with window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "摺疊加速 (1.0-20.0)" #, fuzzy #~ msgid "Rotation Speed (0.0-50.0)" #~ msgstr "縮放速度 (0.1-50.0)" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "縮放時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "調整比例速度 (0.1-50.0)" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "調整比例時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Screen size multiplier for horizontal virtual size (1-32)" #~ msgstr "水平虛擬大小的螢幕大小倍數" #, fuzzy #~ msgid "Screen size multiplier for vertical virtual size (1-32)" #~ msgstr "垂直虛擬大小的螢幕大小倍數" #, fuzzy #~ msgid "" #~ "Select next window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Select previous window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Sensitivity of pointer movement (0.01-100.00)" #~ msgstr "指標移動靈敏度" #~ msgid "Shade resistance (0-100)" #~ msgstr "遮蔽阻力 (0-100)" #, fuzzy #~ msgid "" #~ "Show Run Application dialog (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Show the main menu (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "視窗間隔" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "彈簧摩擦力" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "彈簧常數" #, fuzzy #~ msgid "" #~ "Start Rotation (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Start moving window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Start resizing window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "調整比例速度 (0.1-50.0)" #, fuzzy #~ msgid "Switcher timestep (0.0-50.0)" #~ msgstr "調整比例時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "" #~ "Take a screenshot (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Take a screenshot of a window (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "材質篩選 (快、好、最佳)" #, fuzzy #~ msgid "The rate at which the screen is redrawn (times/second) (1-200)" #~ msgstr "螢幕重新描繪的速率 (次數/秒)" #, fuzzy #~ msgid "" #~ "Time (in ms) before scale mode is terminated when hovering over a window " #~ "(50-10000)" #~ msgstr "停留在視窗上多久 (毫秒) 後停止調整比例模式" #, fuzzy #~ msgid "Timeout before flipping viewport (0-1000)" #~ msgstr "逾時多久需翻轉檢視區" #, fuzzy #~ msgid "" #~ "Toggle active window maximized (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized horizontally (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle active window maximized vertically (Left, Right, Top, Bottom, " #~ "TopLeft, TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle active window shaded (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle rain effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle use of slow animations (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle window snapping (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Toggle wiper effect (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #~ msgid "USe linear filter when zoomed in" #~ msgstr "在放大時使用線性過濾器" #, fuzzy #~ msgid "" #~ "Unfold cube (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Unmaximize active window (Left, Right, Top, Bottom, TopLeft, TopRight, " #~ "BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "頂點格線解析度" #, fuzzy #~ msgid "Water offset scale (0.0-10.0)" #~ msgstr "水波偏移比例" #, fuzzy #~ msgid "" #~ "Wave effect from window title (Left, Right, Top, Bottom, TopLeft, " #~ "TopRight, BottomLeft, BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Window 淡出/淡入速度" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Window 淡出/淡入速度" #, fuzzy #~ msgid "Windows that should be affected by focus blur (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be decorated (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be fading (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be have a shadow (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should be scaled in scale mode (match)" #~ msgstr "應該要在調整比例模式中調整比例的視窗類型" #, fuzzy #~ msgid "Windows that should be shown in switcher (match)" #~ msgstr "應該要顯示在切換器中的視窗類型" #, fuzzy #~ msgid "Windows that should be transformed when minimized (match)" #~ msgstr "最小化時應該轉換的視窗類型" #, fuzzy #~ msgid "Windows that should use alpha blur by default (match)" #~ msgstr "應該淡出/淡入的視窗類型" #, fuzzy #~ msgid "Windows that should wobble when focused (match)" #~ msgstr "應該要在定焦時搖擺的視窗類型" #, fuzzy #~ msgid "Windows that should wobble when grabbed (match)" #~ msgstr "應該要在抓取時搖擺的視窗類型" #, fuzzy #~ msgid "Windows that should wobble when mapped (match)" #~ msgstr "應該要在映射時搖擺的視窗類型" #, fuzzy #~ msgid "Windows that should wobble when moved (match)" #~ msgstr "應該要在移動時搖擺的視窗類型" #, fuzzy #~ msgid "" #~ "Zoom In (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "" #~ "Zoom Out (Left, Right, Top, Bottom, TopLeft, TopRight, BottomLeft, " #~ "BottomRight)" #~ msgstr "應該要起始化調整比例模式的熱角 (左上角、右上角、左下角、右下角)" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "縮放速度 (0.1-50.0)" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "縮放時間間隔 (0.1-50.0)" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "縮放倍率" #~ msgid "." #~ msgstr "." #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "往面 %d 旋轉" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "隨視窗往面 %d 旋轉" #, fuzzy #~ msgid "Plane to face %d and bring active window along" #~ msgstr "往面 %d 旋轉並隨同作用中視窗一起旋轉" #~ msgid "Rotate To Face %d" #~ msgstr "往面 %d 旋轉" #~ msgid "Rotate to face %d" #~ msgstr "往面 %d 旋轉" #~ msgid "Rotate To Face %d with Window" #~ msgstr "隨視窗往面 %d 旋轉" #~ msgid "Rotate to face %d and bring active window along" #~ msgstr "往面 %d 旋轉並隨同作用中視窗一起旋轉" #~ msgid "Command line %d" #~ msgstr "指令行 %d" #~ msgid "Command line to be executed in shell when run_command%d is invoked" #~ msgstr "啟用 run_command%d 時要在外圍程序中執行的指令行" #~ msgid "Run command %d" #~ msgstr "執行指令 %d" #~ msgid "" #~ "A keybinding that when invoked, will run the shell command identified by " #~ "command%d" #~ msgstr "啟用時將執行經 command%d 識別之外圍程序指令的按鍵組合" #~ msgid "Move Window Types" #~ msgstr "移動視窗類型" #~ msgid "Corners" #~ msgstr "角" #~ msgid "Focus window when mouse moves over them" #~ msgstr "在滑鼠移動到上方時啟用定焦視窗" #~ msgid "Initiate All Windows" #~ msgstr "起始化全部視窗" #~ msgid "Initiate Keyboard Window Move" #~ msgstr "啟始以鍵盤移動視窗" #~ msgid "Initiate Keyboard Window Resize" #~ msgstr "啟始以鍵盤調整視窗大小" #~ msgid "Initiate Window Switcher" #~ msgstr "起始化視窗切換器" #~ msgid "Modifier to show switcher for all windows" #~ msgstr "可使所有視窗顯示切換器的修改鍵" #~ msgid "Return from scale view" #~ msgstr "從比例檢視返回" #~ msgid "Show switcher" #~ msgstr "顯示切換器" #~ msgid "Sloppy Focus" #~ msgstr "寬鬆定焦" #~ msgid "Start moving window using keyboard" #~ msgstr "開始使用鍵盤移動視窗" #~ msgid "Terminate" #~ msgstr "終止" #~ msgid "Water effect on system beep" #~ msgstr "系統發出嗶聲時啟用水波特效" #~ msgid "" #~ "Window types that should be fading (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要淡出的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭顯示、對話" #~ "方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should be transformed when minimized (Desktop, Dock, " #~ "Toolbar, Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, " #~ "Unknown)" #~ msgstr "" #~ "應該要在最小化時轉換的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭" #~ "顯示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should scaled in scale mode (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要在調整比例模式中調整比例的視窗類型 (桌面、停駐、工具列、功能表、公用" #~ "程式、開頭顯示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should shown in switcher (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要顯示在切換器中的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭" #~ "顯示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should wobble when focused (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要在定焦時搖擺的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭顯" #~ "示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should wobble when grabbed (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要在抓取時搖擺的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭顯" #~ "示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should wobble when mapped (Desktop, Dock, Toolbar, " #~ "Menu, Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要在映射時搖擺的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭顯" #~ "示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "" #~ "Window types that should wobble when moved (Desktop, Dock, Toolbar, Menu, " #~ "Utility, Splash, Dialog, ModalDialog, Normal, Fullscreen, Unknown)" #~ msgstr "" #~ "應該要在移動時搖擺的視窗類型 (桌面、停駐、工具列、功能表、公用程式、開頭顯" #~ "示、對話方塊、強制回應對話方塊、一般、全螢幕、未知的)" #~ msgid "Wobble effect on system beep" #~ msgstr "系統發出嗶聲時啟用搖擺特效" ./po/it.po0000644000004100000410000027746013246301623012655 0ustar www-datawww-data# Compiz Italian Translation # Copyright (C) 2007, 2008, 2009 The Free Software Foundation, Inc. # This file is distributed under the same license as the Compiz package. # # **** Glossario **** # # # enable -> usato sempre come 'abilitare' # viewport -> area visibile # bevel, to -> smussare # workaround -> alternativa # sticky -> adesivo # jagged edges -> bordi dentellati (traduzione corretta) # sidekick -> vortice # skewer -> distorsione # glide -> planata # skydome -> volta del cielo (lo so... lo so... a molti non piacerà! :) ) # fold -> ripiegatura (nelle sue varianti curva, orizzontale...) # clamp -> blocca, bloccare # shade -> sfumata, sfumare # fade -> dissolvi, dissolvenza # padding -> spaziatura # pad -> spazio # blur -> sfocato # hotkey -> tasto di scelta rapida # flip -> scorrere # Scale -> Scala finestre (nome del plugin), scala o scalare, ridimensionare # per immagini # glow -> bagliore # Opacify -> Opacizza (anche nome del plugin); opacizzare # opacity -> opacità (non è la trasparenza!) # tilt -> inclinato/a, usato per la visualizzazione delle aree di lavoro # sloppy -> lento (trovato solo una volta... ma potrebbe venir usato ancora) # Inside Cube -> Dentro il cubo (la modalità) # keybinding -> associazione di tasti # outline -> sagoma (nella modalità di ridimensionamento delle finestre) # blend -> trasformazione/trasformare (ne ho parlato con un Flame Artist) # # Milo Casagrande , 2007-2008, 2009. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-15 18:06+0200\n" "PO-Revision-Date: 2009-08-15 18:27+0200\n" "Last-Translator: Milo Casagrande \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" # (ndt) qui non capisco se si riferisca al desktop intero # (comprese la barra superiore e inferiore) o solo alla 'scrivania' #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Desktop" # (ndt) messo al plurale, alla fine non è relativo a una sola finestra #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Gestione finestre" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../plugins/scale/scale.xml.in.h:18 msgid "None" msgstr "Niente" #: ../gtk/window-decorator/gtk-window-decorator.c:4619 msgid "Shade" msgstr "Sfuma" #: ../plugins/place/place.xml.in.h:9 msgid "Maximize" msgstr "Massimizzato" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Massimizza orizzontalmente" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Massimizza verticalmente" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Minimizza" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Solleva" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Abbassa" #: ../gtk/window-decorator/gtk-window-decorator.c:4600 #: ../metadata/core.xml.in.h:75 msgid "Window Menu" msgstr "Menù della finestra" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Azione da eseguire quando viene utilizzata la rotellina del mouse sulla " "barra del titolo." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Tipo di sfocatura" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Opacità finestra attiva tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Sfumatura opacità finestra attiva tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Opacità tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Sfumatura opacità tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Opacità da usare per le finestre attive con il tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Opacità da usare per le decorazioni del tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "Sfuma le finestre attive con il tema Metacity da opache a traslucide" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "Sfuma le finestre con il tema Metacity da opache a traslucide" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Azione della rotellina del mouse sulla barra del titolo" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Tipo di sfocatura da usare con le decorazioni delle finestre" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Usa il tema Metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Usa il tema Metacity per le decorazioni delle finestre" #: ../gtk/window-decorator/gtk-window-decorator.c:4408 #: ../metadata/core.xml.in.h:9 msgid "Close Window" msgstr "Chiude la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4430 #: ../metadata/core.xml.in.h:70 msgid "Unmaximize Window" msgstr "Demassimizza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4433 #: ../metadata/core.xml.in.h:36 msgid "Maximize Window" msgstr "Massimizza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4475 #: ../metadata/core.xml.in.h:42 msgid "Minimize Window" msgstr "Minimizza la finestra" #: ../gtk/window-decorator/gtk-window-decorator.c:4639 msgid "Make Above" msgstr "Porta sopra" #: ../gtk/window-decorator/gtk-window-decorator.c:4665 msgid "Stick" msgstr "Blocca" #: ../gtk/window-decorator/gtk-window-decorator.c:4685 msgid "Unshade" msgstr "De-sfuma" #: ../gtk/window-decorator/gtk-window-decorator.c:4705 msgid "Unmake Above" msgstr "Porta sotto" #: ../gtk/window-decorator/gtk-window-decorator.c:4731 msgid "Unstick" msgstr "Sblocca" #: ../gtk/window-decorator/gtk-window-decorator.c:5067 #, c-format msgid "The window \"%s\" is not responding." msgstr "La finestra «%s» non risponde." #: ../gtk/window-decorator/gtk-window-decorator.c:5076 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Forzare la chiusura dell'applicazione comporta la perdita delle modifiche " "non salvate." #: ../gtk/window-decorator/gtk-window-decorator.c:5091 msgid "_Force Quit" msgstr "_Forza uscita" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Annotazioni" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Colore riempimento" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Colore tratto" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Plugin per prendere annotazioni" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Pulisci" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Disegna" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Disegna usando lo strumento" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Colore riempimento per le annotazioni" #: ../plugins/water/water.xml.in.h:6 ../plugins/zoom/zoom.xml.in.h:2 msgid "Initiate" msgstr "Avvia" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Avvia il disegno delle annotazioni" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Avvia la cancellazione delle annotazioni" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Avvia cancellazione" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Larghezza linea" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Larghezza linea per le annotazioni" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Colore tratto per le annotazioni" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Larghezza tratto" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Larghezza tratto per le annotazioni" #: ../plugins/blur/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4× bilineare" #: ../plugins/blur/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Sfocatura alpha" #: ../plugins/blur/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Finestre in sfocatura" #: ../plugins/blur/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Filtro sfocatura" #: ../plugins/blur/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Sfocare le occlusioni" #: ../plugins/blur/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Saturazione sfocatura" #: ../plugins/blur/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Velocità sfocatura" #: ../plugins/blur/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Finestre sfocate" #: ../plugins/blur/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Sfocatura dietro la parte traslucida delle finestre" #: ../plugins/blur/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Saturazione sfocatura" # (ndt) descrizione del plugin #: ../plugins/blur/blur.xml.in.h:11 msgid "Blur windows" msgstr "Sfoca le finestre" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Sfoca le finestre che non hanno il focus" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" "Disabilita la sfocatura delle regioni dello schermo oscurate da altre " "finestre." # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filtro usato per la sfocatura" # (ndt) opzione # anche se non mi convince come traduzione #: ../plugins/blur/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Sfocare al focus" #: ../plugins/blur/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Finestre da sfocare" #: ../plugins/blur/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussiano" #: ../plugins/blur/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Raggio gaussiano" #: ../plugins/blur/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Resistenza gaussiana" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Il raggio gaussiano" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "La resistenza gaussiana" #: ../plugins/blur/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Recupero texture indipendente" #: ../plugins/blur/blur.xml.in.h:23 ../plugins/decor/decor.xml.in.h:10 #: ../plugins/switcher/switcher.xml.in.h:13 msgid "Mipmap" msgstr "Mipmap" # (ndt) preferisco mettere così... altrimenti # non si capisce subito #: ../plugins/blur/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Livello dettaglio" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Livello dettaglio mipmap" #: ../plugins/blur/blur.xml.in.h:26 msgid "Pulse" msgstr "Pulsazione" #: ../plugins/blur/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Effetto pulsazione" #: ../plugins/blur/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Utilizza le unità texture disponibili per effettuare tutti i possibili " "recuperi texture indipendenti." #: ../plugins/blur/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Velocità sfocatura finestra" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Tipi di finestre a cui applicare la sfocatura al focus" # (ndt) suggerimento #: ../plugins/blur/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" "Tipi di finestre a cui applicare la sfocatura alpha in modo predefinito" # (ndt) devo ancora capirne l'utilità... #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Clona output" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Avvia selezione clone" # (ndt) descrizione plugin #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Gestore output clonato" #: ../plugins/commands/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command0" #: ../plugins/commands/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command1" #: ../plugins/commands/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command10" #: ../plugins/commands/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command11" #: ../plugins/commands/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command12" #: ../plugins/commands/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command3" #: ../plugins/commands/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command4" #: ../plugins/commands/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command5" #: ../plugins/commands/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command6" #: ../plugins/commands/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command7" #: ../plugins/commands/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command8" #: ../plugins/commands/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command9" #: ../plugins/commands/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command0" #: ../plugins/commands/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command1" #: ../plugins/commands/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command10" #: ../plugins/commands/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command11" #: ../plugins/commands/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command2" #: ../plugins/commands/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command3" #: ../plugins/commands/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command4" #: ../plugins/commands/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command5" #: ../plugins/commands/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command6" #: ../plugins/commands/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command7" #: ../plugins/commands/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command8" #: ../plugins/commands/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un'associazione di tasti che, quando invocata, esegue il comando della shell " "identificato da command9" #: ../plugins/commands/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command0" #: ../plugins/commands/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command1" #: ../plugins/commands/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command10" #: ../plugins/commands/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command11" #: ../plugins/commands/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command2" #: ../plugins/commands/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command3" #: ../plugins/commands/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command4" #: ../plugins/commands/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command5" #: ../plugins/commands/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command6" #: ../plugins/commands/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command7" #: ../plugins/commands/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command8" #: ../plugins/commands/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Un'associazione a un bordo che, quando invocata, esegue il comando della " "shell identificato da command9" #: ../plugins/commands/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Assegna associazioni ai comandi" #: ../plugins/commands/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Associazioni" #: ../plugins/commands/commands.xml.in.h:40 msgid "Command line 1" msgstr "Riga di comando 1" #: ../plugins/commands/commands.xml.in.h:41 msgid "Command line 10" msgstr "Riga di comando 10" #: ../plugins/commands/commands.xml.in.h:42 msgid "Command line 11" msgstr "Riga di comando 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Riga di comando 12" #: ../plugins/commands/commands.xml.in.h:43 msgid "Command line 2" msgstr "Riga di comando 2" #: ../plugins/commands/commands.xml.in.h:44 msgid "Command line 3" msgstr "Riga di comando 3" #: ../plugins/commands/commands.xml.in.h:45 msgid "Command line 4" msgstr "Riga di comando 4" #: ../plugins/commands/commands.xml.in.h:46 msgid "Command line 5" msgstr "Riga di comando 5" #: ../plugins/commands/commands.xml.in.h:47 msgid "Command line 6" msgstr "Riga di comando 6" #: ../plugins/commands/commands.xml.in.h:48 msgid "Command line 7" msgstr "Riga di comando 7" #: ../plugins/commands/commands.xml.in.h:49 msgid "Command line 8" msgstr "Riga di comando 8" #: ../plugins/commands/commands.xml.in.h:50 msgid "Command line 9" msgstr "Riga di comando 9" #: ../plugins/commands/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command0" #: ../plugins/commands/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command1" #: ../plugins/commands/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command10" #: ../plugins/commands/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_comman11" #: ../plugins/commands/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command2" #: ../plugins/commands/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command3" #: ../plugins/commands/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command4" #: ../plugins/commands/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command5" #: ../plugins/commands/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command6" #: ../plugins/commands/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command7" #: ../plugins/commands/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command8" #: ../plugins/commands/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Riga di comando da eseguire nella shell quando viene invocato run_command9" #: ../plugins/commands/commands.xml.in.h:63 #: ../plugins/gnomecompat/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Comandi" #: ../plugins/commands/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Associazioni ai bordi" #: ../plugins/commands/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Associazioni di tasti" #: ../plugins/commands/commands.xml.in.h:67 msgid "Run command 1" msgstr "Esegui comando 1" #: ../plugins/commands/commands.xml.in.h:68 msgid "Run command 10" msgstr "Esegui comando 10" #: ../plugins/commands/commands.xml.in.h:69 msgid "Run command 11" msgstr "Esegui comando 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Esegui comando 12" #: ../plugins/commands/commands.xml.in.h:70 msgid "Run command 2" msgstr "Esegui comando 2" #: ../plugins/commands/commands.xml.in.h:71 msgid "Run command 3" msgstr "Esegui comando 3" #: ../plugins/commands/commands.xml.in.h:72 msgid "Run command 4" msgstr "Esegui comando 4" #: ../plugins/commands/commands.xml.in.h:73 msgid "Run command 5" msgstr "Esegui comando 5" #: ../plugins/commands/commands.xml.in.h:74 msgid "Run command 6" msgstr "Esegui comando 6" #: ../plugins/commands/commands.xml.in.h:75 msgid "Run command 7" msgstr "Esegui comando 7" #: ../plugins/commands/commands.xml.in.h:76 msgid "Run command 8" msgstr "Esegui comando 8" #: ../plugins/commands/commands.xml.in.h:77 msgid "Run command 9" msgstr "Esegui comando 9" #: ../metadata/core.xml.in.h:1 msgid "Active Plugins" msgstr "Plugin attivi" # (ndt) io non la capisco come frase... #: ../plugins/composite/composite.xml.in.h:1 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Consenti il disegno finestre a schermo intero di non essere reindirizzato a " "pixmap fuori schermo" #: ../metadata/core.xml.in.h:2 msgid "Audible Bell" msgstr "Segnale acustico udibile" #: ../metadata/core.xml.in.h:3 msgid "Audible system beep" msgstr "Suono di sistema udibile" # (ndt) non serve fare clic sulla finestra per sollevarla # non per darle il focus, solo per sollevarla #: ../metadata/core.xml.in.h:4 msgid "Auto-Raise" msgstr "Sollevare automaticamente" # (ndt) non mi piace molto... ma andrebbe trovato anche di meglio # per quella sopra #: ../metadata/core.xml.in.h:5 msgid "Auto-Raise Delay" msgstr "Ritardo solleva automaticamente" #: ../metadata/core.xml.in.h:6 msgid "Automatic detection of output devices" msgstr "Rilevamento automatico dispositivi di output" #: ../plugins/composite/composite.xml.in.h:2 msgid "Automatic detection of refresh rate" msgstr "Rilevamento automatico della frequenza di aggiornamento" #: ../plugins/opengl/opengl.xml.in.h:1 msgid "Best" msgstr "Ottimo" # (ndt) opzione #: ../metadata/core.xml.in.h:7 msgid "Click To Focus" msgstr "Fare clic per il focus" #: ../metadata/core.xml.in.h:8 msgid "Click on window moves input focus to it" msgstr "Fare clic sulla finestra per spostare il focus su di essa" #: ../metadata/core.xml.in.h:10 msgid "Close active window" msgstr "Chiude finestra attiva" #: ../metadata/core.xml.in.h:11 msgid "Default Icon" msgstr "Icona predefinita" # (ndt) suggerimento #: ../metadata/core.xml.in.h:12 msgid "Default window icon image" msgstr "Icona finestra predefinita" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Dimensione desktop" # (ndt) opzione #: ../metadata/core.xml.in.h:13 msgid "Detect Outputs" msgstr "Rilevare output" # (ndt) opzione #: ../plugins/composite/composite.xml.in.h:5 msgid "Detect Refresh Rate" msgstr "Rilevare frequenza aggiornamento" # (ndt) è il nome di una scheda # meglio stare sul corto #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Impostazioni visualizzazione" #: ../metadata/core.xml.in.h:14 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Tempo che il puntatore deve restare su un bordo dello schermo prima che " "venga eseguita un'azione." #: ../metadata/core.xml.in.h:15 msgid "Edge Trigger Delay" msgstr "Ritardo azione bordo" #: ../plugins/opengl/opengl.xml.in.h:2 msgid "Fast" msgstr "Veloce" # (ndt) pure questa è il nome di una scheda... #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Focus e comportamento sollevamento" #: ../metadata/core.xml.in.h:16 msgid "Focus Prevention Level" msgstr "Livello di prevenzione del focus" # (ndt) non è molto chiara... #: ../metadata/core.xml.in.h:17 msgid "Focus Prevention Windows" msgstr "Finestre che prevengono il focus" #: ../metadata/core.xml.in.h:18 msgid "Focus prevention windows" msgstr "Tipi di finestre che prevengono il focus" # (ndt) è anche opzione #: ../plugins/composite/composite.xml.in.h:6 msgid "Force independent output painting." msgstr "Forzare la colorazione indipendente dell'output" #: ../metadata/core.xml.in.h:19 msgid "General Options" msgstr "Opzioni generali" #: ../metadata/core.xml.in.h:20 msgid "General compiz options" msgstr "Opzioni generali di Compiz" #: ../plugins/opengl/opengl.xml.in.h:3 msgid "Good" msgstr "Buono" # (ndt) originale poco chiara... #: ../metadata/core.xml.in.h:21 msgid "Hide Skip Taskbar Windows" msgstr "Nascondi finestre della barra delle applicazioni di tralasciamento" #: ../metadata/core.xml.in.h:22 msgid "Hide all windows and focus desktop" msgstr "Nasconde tutte le finestre e dà il focus alla scrivania" #: ../metadata/core.xml.in.h:23 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Nasconde le finestre non nella barra delle applicazioni durante " "l'attivazione della modalità di visualizzazione della scrivania" #: ../metadata/core.xml.in.h:24 msgid "High" msgstr "Alto" #: ../metadata/core.xml.in.h:25 msgid "Horizontal Virtual Size" msgstr "Dimensioni virtuali orizzontali" #: ../plugins/opengl/opengl.xml.in.h:4 msgid "If available use compression for textures converted from images" msgstr "" "Se disponibile, usa la compressione per le texture convertite dalle immagini" #: ../metadata/core.xml.in.h:26 msgid "Ignore Hints When Maximized" msgstr "Ignorare suggerimenti quando massimizzata" #: ../metadata/core.xml.in.h:27 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ignora i suggerimenti su aspetto e incremento dimensioni quando la finestra " "è massimizzata" #: ../metadata/core.xml.in.h:28 msgid "Interval before raising selected windows" msgstr "Intervallo di tempo prima di sollevare le finestre selezionate" #: ../metadata/core.xml.in.h:29 msgid "Interval between ping messages" msgstr "Intervallo tra i messaggi di ping" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Associazioni di tasti" #: ../metadata/core.xml.in.h:30 msgid "Level of focus stealing prevention" msgstr "Livello di prevenzione del focus" #: ../plugins/opengl/opengl.xml.in.h:5 msgid "Lighting" msgstr "Illuminazione" #: ../metadata/core.xml.in.h:31 msgid "List of currently active plugins" msgstr "Elenco dei plugin attualmente attivi" #: ../metadata/core.xml.in.h:32 msgid "List of strings describing output devices" msgstr "Elenco di stringhe che descrivono i dispositivi di output" #: ../metadata/core.xml.in.h:33 msgid "Low" msgstr "Basso" #: ../metadata/core.xml.in.h:34 msgid "Lower Window" msgstr "Abbassa finestra" #: ../metadata/core.xml.in.h:35 msgid "Lower window beneath other windows" msgstr "Abbassa la finestra sotto le altre" #: ../metadata/core.xml.in.h:37 msgid "Maximize Window Horizontally" msgstr "Massimizza finestra in orizzontale" #: ../metadata/core.xml.in.h:38 msgid "Maximize Window Vertically" msgstr "Massimizza finestra in verticale" #: ../metadata/core.xml.in.h:39 msgid "Maximize active window" msgstr "Massimizza la finestra attiva" #: ../metadata/core.xml.in.h:40 msgid "Maximize active window horizontally" msgstr "Massimizza la finestra attiva in orizzontale" #: ../metadata/core.xml.in.h:41 msgid "Maximize active window vertically" msgstr "Massimizza la finestra attiva in verticale" #: ../metadata/core.xml.in.h:43 msgid "Minimize active window" msgstr "Minimizza la finestra attiva" #: ../metadata/core.xml.in.h:44 ../plugins/resize/resize.xml.in.h:12 msgid "Normal" msgstr "Normale" # (ndt) qui non scrivania perché si possono avere più scrivanie # intese come aree di lavoro su diversi desktop. Questo indica proprio # il numero di desktop virtuali #: ../metadata/core.xml.in.h:45 msgid "Number of Desktops" msgstr "Numero di desktop" #: ../metadata/core.xml.in.h:46 msgid "Number of virtual desktops" msgstr "Numero di desktop virtuali" #: ../metadata/core.xml.in.h:47 msgid "Off" msgstr "Spento" #: ../plugins/opengl/opengl.xml.in.h:6 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Esegue aggiornamenti dello schermo solo durante periodo di cancellazione " "verticale" #: ../metadata/core.xml.in.h:48 msgid "Outputs" msgstr "Output" #: ../metadata/core.xml.in.h:49 msgid "Overlapping Output Handling" msgstr "Gestione output sovrapposto" #: ../plugins/composite/composite.xml.in.h:7 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Colora ogni dispositivo di ouptut indipendentemente, anche se i dispositivi " "si sovrappongono" #: ../metadata/core.xml.in.h:50 msgid "Ping Delay" msgstr "Ritardo ping" #: ../metadata/core.xml.in.h:51 msgid "Prefer larger output" msgstr "Preferire output più grande" #: ../metadata/core.xml.in.h:52 msgid "Prefer smaller output" msgstr "Preferire output più piccolo" #: ../metadata/core.xml.in.h:53 msgid "Raise On Click" msgstr "Sollevare al clic" #: ../metadata/core.xml.in.h:54 msgid "Raise Window" msgstr "Solleva finestra" #: ../metadata/core.xml.in.h:55 msgid "Raise selected windows after interval" msgstr "Porta la finestra selezionata in primo piano dopo un intervallo" #: ../metadata/core.xml.in.h:56 msgid "Raise window above other windows" msgstr "Solleva la finestra al di sopra delle altre finestre" #: ../metadata/core.xml.in.h:57 msgid "Raise windows when clicked" msgstr "Solleva le finestre al clic" #: ../plugins/composite/composite.xml.in.h:8 msgid "Refresh Rate" msgstr "Frequenza di aggiornamento" # (ndt) questo non è altro che un numero per indicare # quante aree di lavoro in orizzontale usare #: ../metadata/core.xml.in.h:58 msgid "Screen size multiplier for horizontal virtual size" msgstr "Moltiplicatore dimensione schermo per dimensioni virtuali orizzontali" # (ndt) questo invece indica quante aree di lavoro in verticale # usare: se il valore di prima è 4 e questo 2, si hanno in totale 8 aree di lavoro # su due file #: ../metadata/core.xml.in.h:59 msgid "Screen size multiplier for vertical virtual size" msgstr "Moltiplicatore dimensione schermo per dimensioni virtuali verticali" #: ../metadata/core.xml.in.h:60 msgid "Show Desktop" msgstr "Mostra scrivania" #: ../plugins/composite/composite.xml.in.h:9 msgid "Slow Animations" msgstr "Animazioni lente" #: ../metadata/core.xml.in.h:61 msgid "Smart mode" msgstr "Modalità intelligente" # (ndt) opzione in ccsm #: ../plugins/opengl/opengl.xml.in.h:9 msgid "Sync To VBlank" msgstr "Sincronizzare con VBlank" #: ../plugins/opengl/opengl.xml.in.h:10 msgid "Texture Compression" msgstr "Compressione texture" #: ../plugins/opengl/opengl.xml.in.h:11 msgid "Texture Filter" msgstr "Filtro texture" # (ndt) suggerimento della voce precedente #: ../plugins/opengl/opengl.xml.in.h:12 msgid "Texture filtering" msgstr "Modalità di filtro texture" #: ../plugins/composite/composite.xml.in.h:10 msgid "The rate at which the screen is redrawn (times/second)" msgstr "La velocità di aggiornamento della schermata (volte/secondo)" #: ../metadata/core.xml.in.h:62 msgid "Toggle Window Maximized" msgstr "Commuta finestra massimizzata" #: ../metadata/core.xml.in.h:63 msgid "Toggle Window Maximized Horizontally" msgstr "Commuta finestra massimizzata in orizzontale" #: ../metadata/core.xml.in.h:64 msgid "Toggle Window Maximized Vertically" msgstr "Commuta finestra massimizzata in verticale" #: ../metadata/core.xml.in.h:65 msgid "Toggle Window Shaded" msgstr "Commuta finestra sfumata" #: ../metadata/core.xml.in.h:66 msgid "Toggle active window maximized" msgstr "Commuta finestra attiva massimizzata" #: ../metadata/core.xml.in.h:67 msgid "Toggle active window maximized horizontally" msgstr "Commuta finestra attiva massimizzata in orizzontale" #: ../metadata/core.xml.in.h:68 msgid "Toggle active window maximized vertically" msgstr "Commuta finestra attiva massimizzata in verticale" #: ../metadata/core.xml.in.h:69 msgid "Toggle active window shaded" msgstr "Commuta finestra attiva sfumata" #: ../plugins/composite/composite.xml.in.h:11 msgid "Toggle use of slow animations" msgstr "Commuta l'uso di animazioni lente" #: ../metadata/core.xml.in.h:71 msgid "Unmaximize active window" msgstr "Demassimizza finestra attiva" # (ndt) poco chiara #: ../plugins/composite/composite.xml.in.h:12 msgid "Unredirect Fullscreen Windows" msgstr "Annullare re-indirizzamento finestre a schermo intero" #: ../plugins/opengl/opengl.xml.in.h:13 msgid "Use diffuse light when screen is transformed" msgstr "Usa luce diffusa alla trasformazione della schermata" # (ndt) su quante righe mettere le aree di lavoro #: ../metadata/core.xml.in.h:72 msgid "Vertical Virtual Size" msgstr "Dimensioni virtuali verticali" #: ../metadata/core.xml.in.h:73 msgid "Very High" msgstr "Molto alto" #: ../metadata/core.xml.in.h:74 msgid "Which one of overlapping output devices should be preferred" msgstr "Quale dei dispositivi di output sovrapposto deve essere preferito" #: ../metadata/core.xml.in.h:76 msgid "Window menu button binding" msgstr "Associazione pulsante menù finestra" #: ../metadata/core.xml.in.h:77 msgid "Window menu key binding" msgstr "Associazione tasto menù finestra" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Accelerazione" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Adattare immagine" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Regola l'immagine alla rotazione" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Avanza a diapositiva successiva" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animare la volta del cielo" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Anima la volta del cielo alla rotazione del cubo" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Aspetto" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatico" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Comportamento" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Colore dei lati superiore e inferiore del cubo" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Colore finale da utilizzare per il gradiente inferiore della volta del cielo" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Colore iniziale da utilizzare per il gradiente superiore della volta del " "cielo" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Capi del cubo" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Colore cubo" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Desktop cubico" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Accelerazione ripiegatura" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Velocità ripiegatura" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Intervallo ripiegatura" #: ../plugins/switcher/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "Genera mipmap quando possibile per migliorare la qualità di ridimensionamento" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Torna a diapositiva precedente" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "File immagine" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Immagine da utilizzare come texture per la volta del cielo" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" "Inizializza la trasparenza del cubo solo se la rotazione è gestita col mouse." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Dentro il cubo" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Punto di vista dall'interno del cubo" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" "Elenco di file PNG e SVG da visualizzare sulla faccia superiore del cubo" #: ../plugins/place/place.xml.in.h:11 ../plugins/scale/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "Modalità multi-output" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Cubi multipli" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Diapositiva successiva" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Un grande cubo" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Opacità durante la rotazione" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Opacità quando fermo" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Opacità del desktop durante la rotazione." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Opacità del desktop quando non sta ruotando." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Posiziona le finestre su un cubo" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Diapositiva precedente" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Visualizza la volta del cielo" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Ridimensionare immagine" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Ridimensiona le immagini per coprire la faccia superiore del cubo" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" "Stabilisce come visualizzare il cubo se sono utilizzati dispositivi multipli " "per l'output." # (ndt) lo so... lo so... a molti non andrà a genio! :) #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Volta del cielo" # (ndt) ometto skydome, tanto sono presenti solo tra le sue opzioni #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Colore gradiente finale" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Colore gradiente iniziale" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Immagine volta del cielo" #: ../plugins/scale/scale.xml.in.h:32 ../plugins/switcher/switcher.xml.in.h:35 #: ../plugins/zoom/zoom.xml.in.h:3 msgid "Speed" msgstr "Velocità" #: ../plugins/scale/scale.xml.in.h:34 ../plugins/switcher/switcher.xml.in.h:39 #: ../plugins/zoom/zoom.xml.in.h:4 msgid "Timestep" msgstr "Intervallo" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Trasparenza solo alla rotazione col mouse" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Cubo trasparente" # (ndt) l'opzione per aprire il cubo e vedere le sue facce # quella superiore e inferiore non vengono contate... #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Distendi" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Distende il cubo" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Backend controllo dbus" #: ../plugins/decor/decor.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Consente la creazione di mipmap per le texture della decorazione" #: ../plugins/decor/decor.xml.in.h:2 msgid "Command" msgstr "Comando" #: ../plugins/decor/decor.xml.in.h:3 msgid "Decoration windows" msgstr "Finestre da decorare" #: ../plugins/decor/decor.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Riga di comando strumento di decorazione eseguita se nessuna applicazione di " "decorazione è in esecuzione" #: ../plugins/decor/decor.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Offset X ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Offset Y ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:7 msgid "Drop shadow color" msgstr "Colore ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Opacità ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:9 msgid "Drop shadow radius" msgstr "Raggio ombreggiatura esterna" #: ../plugins/decor/decor.xml.in.h:11 msgid "Shadow Color" msgstr "Colore ombreggiatura" #: ../plugins/decor/decor.xml.in.h:12 msgid "Shadow Offset X" msgstr "Offset X ombreggiatura" #: ../plugins/decor/decor.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Offset Y ombreggiatura" #: ../plugins/decor/decor.xml.in.h:14 msgid "Shadow Opacity" msgstr "Opacità ombreggiatura" #: ../plugins/decor/decor.xml.in.h:15 msgid "Shadow Radius" msgstr "Raggio ombreggiatura" #: ../plugins/decor/decor.xml.in.h:16 msgid "Shadow windows" msgstr "Finestre con ombreggiatura" #: ../plugins/decor/decor.xml.in.h:17 msgid "Window Decoration" msgstr "Decorazione finestra" #: ../plugins/decor/decor.xml.in.h:18 msgid "Window decorations" msgstr "Decorazioni finestra" #: ../plugins/decor/decor.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Tipi di finestre da decorare" #: ../plugins/decor/decor.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Tipi di finestre a cui applicare l'ombreggiatura" #: ../plugins/fade/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Luminosità (in percentuale) delle finestre bloccate" #: ../plugins/fade/fade.xml.in.h:3 msgid "Constant speed" msgstr "Velocità costante" #: ../plugins/fade/fade.xml.in.h:4 msgid "Constant time" msgstr "Tempo costante" #: ../plugins/fade/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Oscurare finestre bloccate" #: ../plugins/fade/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" "Oscurare le finestre che non rispondono alle richieste del gestore di " "finestre" #: ../plugins/fade/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Modalità dissolvenza" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Dissolvere alla minimizzazione/apertura/chiusura" #: ../plugins/fade/fade.xml.in.h:8 msgid "Fade Speed" msgstr "Velocità dissolvenza" #: ../plugins/fade/fade.xml.in.h:9 msgid "Fade Time" msgstr "Tempo dissolvenza" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" "Effetto dissolvenza agli eventi di minimizzazione/apertura/chiusura della " "finestra" #: ../plugins/fade/fade.xml.in.h:10 msgid "Fade effect on system beep" msgstr "Effetto dissolvenza al suono di sistema" #: ../plugins/fade/fade.xml.in.h:11 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Applica dissolvenza in entrata alle finestre quando associate e in uscita " "quando non associate" #: ../plugins/fade/fade.xml.in.h:12 msgid "Fade windows" msgstr "Finestre da dissolvere" #: ../plugins/fade/fade.xml.in.h:13 msgid "Fading Windows" msgstr "Finestre in dissolvenza" #: ../plugins/fade/fade.xml.in.h:14 msgid "Fullscreen Visual Bell" msgstr "Segnale visivo schermo intero" #: ../plugins/fade/fade.xml.in.h:15 msgid "Fullscreen fade effect on system beep" msgstr "Effetto dissolvenza schermo intero al suono di sistema" #: ../plugins/fade/fade.xml.in.h:17 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Saturazione (in percentuale) delle finestre bloccate" #: ../plugins/fade/fade.xml.in.h:18 msgid "Unresponsive Window Brightness" msgstr "Luminosità finestre bloccate" #: ../plugins/fade/fade.xml.in.h:19 msgid "Unresponsive Window Saturation" msgstr "Saturazione finestre bloccate" #: ../plugins/fade/fade.xml.in.h:20 msgid "Visual Bell" msgstr "Segnale acustico visivo" #: ../plugins/fade/fade.xml.in.h:21 msgid "Window fade mode" msgstr "Modalità dissolvenza finestra" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Velocità dissolvenza finestra nella modalità «Velocità costante»" #: ../plugins/fade/fade.xml.in.h:23 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Tempo (in ms) dissolvenza finestra nella modalità «Tempo costante»" #: ../plugins/fade/fade.xml.in.h:24 msgid "Windows that should be fading" msgstr "Tipi di finestre a cui applicare la dissolvenza" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Punto di mount" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Punto di mount" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "File system nello spazio utente" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "File system nello spazio utente" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Backend per il controllo GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" # (ndt) o principale? #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Supporto ciclo main GLib" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Compatibilità GNOME" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Apre un terminale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Opzioni che mantengono Compiz compatibile con l'ambiente grafico GNOME" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Finestra di dialogo «Esegui applicazione»" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Comando esecuzione terminale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Riga di comando per cattura schermata" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Mostra menù principale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Mostra finestra di dialogo «Esegui applicazione»" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Mostra il menù principale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Cattura schermata" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Cattura un'istantanea di una finestra" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Riga di comando terminale" #: ../plugins/gnomecompat/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Riga di comando cattura schermata finestra" #: ../plugins/ini/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../plugins/ini/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Backend file ini" #: ../plugins/inotify/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Plugin notifica cambiamento file" #: ../plugins/inotify/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Backend per il controllo Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Effetto minimizzazione" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Finestre da minimizzare" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Velocità minimizzazione" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Intervallo minimizzazione" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Resistenza sfumatura" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Resistenza sfumatura" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Trasforma le finestre quando vengono minimizzate e deminimizzate" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Tipi di finestre da trasformare quando minimizzate" #: ../plugins/move/move.xml.in.h:1 msgid "Constrain Y" msgstr "Mantenere Y" # (ndt) suggerimento #: ../plugins/move/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" "Non consente di spostare le finestre oltre il bordo superiore e inferiore " "dello schermo " #: ../plugins/move/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Non aggiorna la posizione lato server delle finestre fino al termine del " "movimento" #: ../plugins/move/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Inizializza muovi finestre" #: ../plugins/move/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Posizionamento pigro" #: ../plugins/move/move.xml.in.h:6 msgid "Move Window" msgstr "Muovi finestra" #: ../plugins/move/move.xml.in.h:7 msgid "Move window" msgstr "Muove la finestra" #: ../plugins/move/move.xml.in.h:8 ../plugins/scale/scale.xml.in.h:21 #: ../plugins/switcher/switcher.xml.in.h:18 msgid "Opacity" msgstr "Opacità" #: ../plugins/move/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Livello di opacità delle finestre in movimento" #: ../plugins/move/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Sgancia e demassimizza le finestre massimizzate nel trascinamento" #: ../plugins/move/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Sganciare finestre massimizzate" #: ../plugins/move/move.xml.in.h:12 msgid "Start moving window" msgstr "Avvia finestra in movimento" #: ../plugins/switcher/switcher.xml.in.h:6 msgid "Brightness" msgstr "Luminosità" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Riduzione luminosità" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Aumento luminosità" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Passo luminosità" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Valori di luminosità per le finestre" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Riduci" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Aumenta" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Riduzione opacità" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Aumento opacità" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Passo opacità" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Valori di opacità per le finestre" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Opacità, luminosità e saturazione" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Regolazioni di opacità, luminosità e saturazione" #: ../plugins/switcher/switcher.xml.in.h:28 msgid "Saturation" msgstr "Saturazione" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Riduzione saturazione" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Aumento saturazione" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Passo saturazione" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Valori di saturazione per le finestre" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Passo" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Impostazioni specifiche della finestra" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Valori finestra" #: ../plugins/place/place.xml.in.h:27 msgid "Windows" msgstr "Finestre" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" "Finestre che dovrebbero avere una luminosità diversa in modo predefinito" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Finestre che dovrebbero avere una opacità diversa in modo predefinito" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" "Finestre che dovrebbero avere una saturazione diversa in modo predefinito" #: ../plugins/place/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritmo da usare per il posizionamento della finestra" #: ../plugins/place/place.xml.in.h:2 msgid "Cascade" msgstr "Cascata" #: ../plugins/place/place.xml.in.h:3 msgid "Centered" msgstr "Centrato" #: ../plugins/place/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Posizionamento finestre fisso" #: ../plugins/place/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Posizionamento finestre forzato" #: ../plugins/place/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Posizioni orizzontali area visibile" #: ../plugins/place/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Mantenere nello spazio di lavoro" #: ../plugins/place/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" "Mantiene le finestre in posizione nello spazio lavoro, anche se ciò " "significa che la posizione può differire da quella specificata." #: ../plugins/place/place.xml.in.h:12 msgid "Place Windows" msgstr "Posiziona finestre" #: ../plugins/place/place.xml.in.h:13 msgid "Place across all outputs" msgstr "Posizionare le finestre tra tutti gli output" #: ../plugins/place/place.xml.in.h:14 msgid "Place windows at appropriate positions when mapped" msgstr "Posiziona le finestre in maniera appropriata quando sono associate" #: ../plugins/place/place.xml.in.h:15 msgid "Placement Mode" msgstr "Modalità di posizionamento" #: ../plugins/place/place.xml.in.h:16 msgid "Positioned windows" msgstr "Finestre da posizionare" #: ../plugins/place/place.xml.in.h:18 msgid "Random" msgstr "Casuale" #: ../plugins/place/place.xml.in.h:19 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Seleziona il comportamento del posizionamento delle finestre se sono " "selezionati molteplici output" #: ../plugins/place/place.xml.in.h:20 msgid "Smart" msgstr "Intelligente" #: ../plugins/place/place.xml.in.h:21 msgid "Use active output device" msgstr "Usare dispositivo di output attivo" #: ../plugins/place/place.xml.in.h:22 msgid "Use output device of focussed window" msgstr "Usare dispositivo di output della finestra col focus" #: ../plugins/place/place.xml.in.h:23 msgid "Use output device with pointer" msgstr "Usare dispositivo di output con puntatore" #: ../plugins/place/place.xml.in.h:24 msgid "Vertical viewport positions" msgstr "Posizioni verticali area visibile" #: ../plugins/place/place.xml.in.h:25 msgid "Viewport positioned windows" msgstr "Finestre posizionate in area visibile" #: ../plugins/place/place.xml.in.h:26 msgid "Window placement workarounds" msgstr "Alternative posizionamento finestre" #: ../plugins/place/place.xml.in.h:28 msgid "Windows that should be positioned by default" msgstr "Tipi di finestre da posizionare in modo predefinito" #: ../plugins/place/place.xml.in.h:29 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Tipi di finestre da posizionare in un'area visibile specifica in modo " "predefinito" #: ../plugins/place/place.xml.in.h:30 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Finestre che devono essere posizionate in ogni caso, anche se il gestore di " "finestre non dovrebbe posizionarle." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Finestre con posizioni fisse" #: ../plugins/place/place.xml.in.h:34 msgid "Windows with fixed viewport" msgstr "Finestre con area visibile fissa" #: ../plugins/place/place.xml.in.h:35 msgid "Workarounds" msgstr "Alternative" #: ../plugins/place/place.xml.in.h:36 msgid "X Positions" msgstr "Posizioni X" #: ../plugins/place/place.xml.in.h:37 msgid "X Viewport Positions" msgstr "Posizioni X area visibile" #: ../plugins/place/place.xml.in.h:38 msgid "X position values" msgstr "Valori posizione X" #: ../plugins/place/place.xml.in.h:39 msgid "Y Positions" msgstr "Posizioni Y" #: ../plugins/place/place.xml.in.h:40 msgid "Y Viewport Positions" msgstr "Posizioni Y area visibile" #: ../plugins/place/place.xml.in.h:41 msgid "Y position values" msgstr "Valori posizione Y" # (ndt) è più comune vedere PNG piuttosto che Png #: ../plugins/imgpng/imgpng.xml.in.h:1 msgid "Png" msgstr "PNG" #: ../plugins/imgpng/imgpng.xml.in.h:2 msgid "Png image loader" msgstr "Caricatore immagini PNG" #: ../plugins/regex/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Corrispondenza espressione regolare" #: ../plugins/regex/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Riconosce le finestre usando le espressioni regolari" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Associazioni" #: ../plugins/resize/resize.xml.in.h:1 msgid "Border Color" msgstr "Colore bordo" #: ../plugins/resize/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Colore bordo usato nelle modalità di ridimensionamento «Sagoma» e «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "Modalità ridimensionamento predefinita" #: ../plugins/resize/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "Modalità predefinita per il ridimensionamento delle finestre" #: ../plugins/resize/resize.xml.in.h:5 msgid "Fill Color" msgstr "Colore riempimento" #: ../plugins/resize/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "Colore del riempimento nella modalità di ridimensionamento «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "Inizializza ridimensionamento «Normale»" #: ../plugins/resize/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "Inizializza ridimensionamento «Sagoma»" #: ../plugins/resize/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "Inizializza ridimensionamento «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "Inizializza ridimensionamento «Elastico»" #: ../plugins/resize/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "Inizializza ridimensionamento finestre" #: ../plugins/resize/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "Ridimensionamento finestre normale" #: ../plugins/resize/resize.xml.in.h:14 msgid "Outline" msgstr "Sagoma" #: ../plugins/resize/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "Ridimensionamento finestre sagoma" #: ../plugins/resize/resize.xml.in.h:16 msgid "Rectangle" msgstr "Rettangolo" #: ../plugins/resize/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "Ridimensionamento finestre rettangolo" #: ../plugins/resize/resize.xml.in.h:18 msgid "Resize Window" msgstr "Ridimensiona finestre" #: ../plugins/resize/resize.xml.in.h:19 msgid "Resize window" msgstr "Ridimensiona le finestre" #: ../plugins/resize/resize.xml.in.h:20 msgid "Start resizing window" msgstr "Avvia il ridimensionamento della finestra" #: ../plugins/resize/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "Avvia il ridimensionamento delle finestre stiracchiandole" #: ../plugins/resize/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "Avvia il ridimensionamento normale delle finestre" #: ../plugins/resize/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "Avvia il ridimensionamento delle finestre attraverso la sagoma" #: ../plugins/resize/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "Avvia il ridimensionamento delle finestre attraverso il rettangolo" #: ../plugins/resize/resize.xml.in.h:25 msgid "Stretch" msgstr "Elastico" #: ../plugins/resize/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "Ridimensionamento finestre elastico" #: ../plugins/resize/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Normale»" #: ../plugins/resize/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Sagoma»" #: ../plugins/resize/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Rettangolo»" #: ../plugins/resize/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "Tipi di finestre a cui applicare il ridimensionamento «Elastico»" # (ndt) il funzionamento è questo: # prendere un oggetto, non una finestra, e cercare # di spostarlo in un'altra area di lavoro per far ruotare il cubo #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Scorrere il bordo al trascinamento" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Scorrere il bordo allo spostamento" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Scorrere il bordo con il puntatore" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Tempo scorrimento" # (ndt) praticamente sposta il puntatore sul bordo di destra #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Ruota verso l'area visibile a sinistra e sposta il puntatore" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Ruota verso l'area visibile successiva trascinando un oggetto sul bordo" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" "Ruota verso l'area visibile successiva spostando il puntatore sul bordo" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Ruota verso l'area visibile successiva spostando una finestra sul bordo" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Ruota verso l'area visibile a destra e sposta il puntatore" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Inverte l'asse Y per lo spostamento del puntatore" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Invertire puntatore Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Sensibilità puntatore" # (ndt) riesco a capire cosa faccia... #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Sollevare alla rotazione" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Solleva le finestre alla rotazione" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Ruota cubo" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Scorre e ruota verso sinistra" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Scorre e ruota verso destra" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Ruota a sinistra" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Ruota a sinistra con la finestra" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Ruota a destra" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Ruota a destra con la finestra" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Ruota verso" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Ruota verso faccia 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Ruota verso faccia 1 con la finestra" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Ruota verso faccia 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Ruota verso faccia 10 con la finestra" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Ruota verso faccia 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Ruota verso faccia 11 con la finestra" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Ruota verso faccia 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Ruota verso faccia 12 con la finestra" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Ruota verso faccia 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Ruota verso faccia 2 con la finestra" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Ruota verso faccia 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Ruota verso faccia 3 con la finestra" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Ruota verso faccia 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Ruota verso faccia 4 con la finestra" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Ruota verso faccia 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Ruota verso faccia 5 con la finestra" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Ruota verso faccia 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Ruota verso faccia 6 con la finestra" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Ruota verso faccia 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Ruota verso faccia 7 con la finestra" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Ruota verso faccia 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Ruota verso faccia 8 con la finestra" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Ruota verso faccia 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Ruota verso faccia 9 con la finestra" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Ruota cubo" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Ruota desktop cubico" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Ruota a sinistra" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Ruota a sinistra insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Ruota a destra" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Ruota a destra insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Ruota verso la faccia del cubo" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Ruota verso faccia del cubo con la finestra" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Ruota verso la faccia 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Ruota verso la faccia 1 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Ruota verso la faccia 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Ruota verso la faccia 10 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Ruota verso la faccia 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Ruota verso la faccia 11 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Ruota verso la faccia 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Ruota verso la faccia 12 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Ruota verso la faccia 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Ruota verso la faccia 2 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Ruota verso la faccia 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Ruota verso la faccia 3 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Ruota verso la faccia 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Ruota verso la faccia 4 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Ruota verso la faccia 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Ruota verso la faccia 5 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Ruota verso la faccia 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Ruota verso la faccia 6 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Ruota verso la faccia 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Ruota verso la faccia 7 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Ruota verso la faccia 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Ruota verso la faccia 8 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Ruota verso la faccia 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Ruota verso la faccia 9 insieme alla finestra attiva" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Ruota verso area visibile" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Ruota la finestra" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Ruota con la finestra" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Accelerazione rotazione" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Velocità rotazione" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Intervallo rotazione" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Zoom della rotazione" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Sensibilità del movimento del puntatore" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Aggancia la rotazione del cubo alla faccia inferiore" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Aggancia la rotazione del cubo alla faccia superiore" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Agganciare alla faccia inferiore" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Agganciare alla faccia superiore" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Avvia rotazione" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tempo massimo prima di scorrere l'area visibile" #: ../plugins/switcher/switcher.xml.in.h:41 msgid "Zoom" msgstr "Zoom" #: ../plugins/scale/scale.xml.in.h:1 ../plugins/switcher/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Quantità di opacità in percentuale" #: ../plugins/scale/scale.xml.in.h:2 msgid "Big" msgstr "Grande" # (ndt) mah... #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Associazioni pulsante commutazione modalità «Scala finestre»" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Associazioni pulsante per la commutazione della modalità «Scala finestre» " "invece di abilitarla quando premuto e disabilitarla quando rilasciato." #: ../plugins/scale/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "Fare clic sulla scrivania per mostrarla" #: ../plugins/scale/scale.xml.in.h:4 msgid "Darken Background" msgstr "Scurire lo sfondo" #: ../plugins/scale/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "Scurisce lo sfondo durante il ridimensionamento delle finestre" #: ../plugins/scale/scale.xml.in.h:6 msgid "Emblem" msgstr "Simbolo" #: ../plugins/scale/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Entra nella modalità «Mostra scrivania» quando viene fatto clic sulla " "scrivania durante «Scala finestre»" #: ../plugins/scale/scale.xml.in.h:8 msgid "Hover Time" msgstr "Tempo passaggio del mouse" #: ../plugins/scale/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "Avvia il selettore finestre" #: ../plugins/scale/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "Avvia selettore finestre per tutte le finestre" #: ../plugins/scale/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "Avvia selettore finestre per gruppo di finestre" #: ../plugins/scale/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Avvia selettore finestre per finestre in output corrente" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Associazioni tasto commutazione modalità «Scala finestre»" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Associazioni tasto per la commutazione della modalità «Scala finestre» invece " "di abilitarla quando premuto e disabilitarla quando rilasciato." #: ../plugins/scale/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "Dispone e avvia la trasformazione di tutte le finestre" #: ../plugins/scale/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "Dispone e avvia la trasformazione del gruppo di finestre" #: ../plugins/scale/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "Dispone e avvia trasformazione finestre" #: ../plugins/scale/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "Dispone e avvia la trasformazione delle finestre nell'output corrente" #: ../plugins/scale/scale.xml.in.h:19 msgid "On all output devices" msgstr "Su tutti i dispositivi di output" #: ../plugins/scale/scale.xml.in.h:20 msgid "On current output device" msgstr "Sul dispositivo corrente" #: ../plugins/scale/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "Icona di sovrapposizione" #: ../plugins/scale/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "Sovrappone un'icona alle finestre dopo che sono state ridimensionate" #: ../plugins/scale/scale.xml.in.h:24 msgid "Scale" msgstr "Scala finestra" #: ../plugins/scale/scale.xml.in.h:25 msgid "Scale Windows" msgstr "Ridimensiona finestre" #: ../plugins/scale/scale.xml.in.h:26 msgid "Scale speed" msgstr "Velocità scala" #: ../plugins/scale/scale.xml.in.h:27 msgid "Scale timestep" msgstr "Intervallo scala" #: ../plugins/scale/scale.xml.in.h:28 msgid "Scale windows" msgstr "Ridimensiona le finestre" #: ../plugins/scale/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Indica dove scalare le finestre se sono utilizzati più dispositivi di output." #: ../plugins/scale/scale.xml.in.h:30 msgid "Space between windows" msgstr "Spazio tra le finestre" #: ../plugins/scale/scale.xml.in.h:31 msgid "Spacing" msgstr "Spaziatura" #: ../plugins/scale/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Tempo (in ms) prima che la modalità di scala venga terminata al passaggio " "del mouse su una finestra" #: ../plugins/scale/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "Tipi di finestre da ridimensionare nella modalità «Scala finestra»" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Apre le schermate con questa applicazione" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Directory" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Cattura schermata rettangolare" # (ndt) non è molto chiara in inglese # dovrebbe indicare l'applicazione da usare # per visualizzare le schermate #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Applicazione da eseguire" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Archivia le schermate in questa directory" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Cattura schermate" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Plugin per catturare schermate" # (ndt) anche qui... è più noto SVG che Svg #: ../plugins/imgsvg/imgsvg.xml.in.h:3 msgid "Svg" msgstr "SVG" #: ../plugins/imgsvg/imgsvg.xml.in.h:4 msgid "Svg image loader" msgstr "Caricatore immagini SVG" #: ../plugins/switcher/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Quantità di luminosità in percentuale" #: ../plugins/switcher/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Quantità di saturazione in percentuale" #: ../plugins/switcher/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Selettore applicazioni" #: ../plugins/switcher/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Rotazione automatica" #: ../plugins/switcher/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "Portare in primo piano" #: ../plugins/switcher/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "Porta la finestra selezionata in primo piano" # (ndt) indica un fattore di rimpicciolimento #: ../plugins/switcher/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "Distanza a cui spostare il desktop durante la selezione delle finestre" #: ../plugins/switcher/switcher.xml.in.h:11 msgid "Icon" msgstr "Icona" #: ../plugins/switcher/switcher.xml.in.h:12 msgid "Minimized" msgstr "Minimizzare" #: ../plugins/switcher/switcher.xml.in.h:14 msgid "Next Panel" msgstr "Pannello successivo" #: ../plugins/switcher/switcher.xml.in.h:15 msgid "Next window" msgstr "Finestra successiva" #: ../plugins/switcher/switcher.xml.in.h:16 msgid "Next window (All windows)" msgstr "Finestra successiva (tutte le finestre)" #: ../plugins/switcher/switcher.xml.in.h:17 msgid "Next window (No popup)" msgstr "Finestra successiva (nessun pop-up)" #: ../plugins/switcher/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window" msgstr "Mostra il selettore se non visibile e seleziona la finestra successiva" #: ../plugins/switcher/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Mostra il selettore se non visibile e seleziona la finestra successiva tra " "tutte le altre finestre" #: ../plugins/switcher/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select previous window" msgstr "Mostra il selettore se non visibile e seleziona la finestra precedente" #: ../plugins/switcher/switcher.xml.in.h:22 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Mostra il selettore se non visibile e seleziona la finestra precedente tra " "tutte le altre finestre" #: ../plugins/switcher/switcher.xml.in.h:23 msgid "Prev Panel" msgstr "Panello precedente" #: ../plugins/switcher/switcher.xml.in.h:24 msgid "Prev window" msgstr "Finestra precedente" #: ../plugins/switcher/switcher.xml.in.h:25 msgid "Prev window (All windows)" msgstr "Finestra precedente (tutte le finestre)" #: ../plugins/switcher/switcher.xml.in.h:26 msgid "Prev window (No popup)" msgstr "Finestra precedente (nessun pop-up)" #: ../plugins/switcher/switcher.xml.in.h:27 msgid "Rotate to the selected window while switching" msgstr "Ruota verso la finestra selezionata durante la selezione" #: ../plugins/switcher/switcher.xml.in.h:29 msgid "Select next panel type window." msgstr "Seleziona il tipo di pannello di finestra successivo." #: ../plugins/switcher/switcher.xml.in.h:30 msgid "Select next window without showing the popup window." msgstr "Seleziona la finestra successiva senza mostrare la finestra pop-up." #: ../plugins/switcher/switcher.xml.in.h:31 msgid "Select previous panel type window." msgstr "Seleziona il tipo di pannello di finestra precedente" #: ../plugins/switcher/switcher.xml.in.h:32 msgid "Select previous window without showing the popup window." msgstr "Seleziona la finestra precedente senza mostrare la finestra pop-up." #: ../plugins/switcher/switcher.xml.in.h:33 msgid "Show icon next to thumbnail" msgstr "Mostra un'icona accanto all'anteprima" #: ../plugins/switcher/switcher.xml.in.h:34 msgid "Show minimized windows" msgstr "Mostra le finestre minimizzate" #: ../plugins/switcher/switcher.xml.in.h:36 msgid "Switcher speed" msgstr "Velocità selettore" #: ../plugins/switcher/switcher.xml.in.h:37 msgid "Switcher timestep" msgstr "Intervallo selettore" #: ../plugins/switcher/switcher.xml.in.h:38 msgid "Switcher windows" msgstr "Finestre da selezionare" #: ../plugins/switcher/switcher.xml.in.h:40 msgid "Windows that should be shown in switcher" msgstr "Tipi di finestre da visualizzare nel selettore" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Fornisce supporto per lo spazio colore YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Riproduzione video" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Riproduzione video" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Spazio colore YV12" #: ../plugins/water/water.xml.in.h:1 msgid "Add line" msgstr "Aggiungi linea" #: ../plugins/water/water.xml.in.h:2 msgid "Add point" msgstr "Aggiungi punto" #: ../plugins/water/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Aggiunge effetti acqua a diverse azioni del desktop" #: ../plugins/water/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Ritardo (in ms) tra le gocce di pioggia" #: ../plugins/water/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Abilita effetti acqua puntatore" #: ../plugins/water/water.xml.in.h:7 msgid "Line" msgstr "Linea" #: ../plugins/water/water.xml.in.h:8 msgid "Offset Scale" msgstr "Proporzioni" #: ../plugins/water/water.xml.in.h:9 msgid "Point" msgstr "Punto" #: ../plugins/water/water.xml.in.h:10 msgid "Rain Delay" msgstr "Ritardo pioggia" #: ../plugins/water/water.xml.in.h:11 msgid "Title wave" msgstr "Onda sul titolo" #: ../plugins/water/water.xml.in.h:12 msgid "Toggle rain" msgstr "Commuta pioggia" #: ../plugins/water/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Commuta l'effetto pioggia" #: ../plugins/water/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Commuta tergicristallo" #: ../plugins/water/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Commuta il tergicristallo" #: ../plugins/water/water.xml.in.h:16 msgid "Water Effect" msgstr "Effetto acqua" #: ../plugins/water/water.xml.in.h:17 msgid "Water offset scale" msgstr "Offset scala acqua" #: ../plugins/water/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Effetto onda dal titolo della finestra" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Effetto al focus" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Effetto finestra al focus" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Finestre per il focus" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Attrito" # (ndt) termine un po' così... # indica le finestre che dovrebbero essere tremolanti quando sono 'catturate' #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Finestre da afferrare" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Risoluzione griglia" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Aggancio finestre invertito" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Rende le finestre tremolanti" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Associa effetto" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Associa effetto finestra" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Finestre da associare" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Effetto alla massimizzazione" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Dimensione minima griglia" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Dimensione minima griglia vertex" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Finestre da muovere" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Tremolio" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Aggancio invertito" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Aggancia finestre" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Attrito della molla" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "Costante della molla" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Costante della molla" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Commuta aggancio finestre" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Usa modello a molla per l'effetto delle finestre tremolanti" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Risoluzione griglia vertex" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" "Tipi di finestre a cui applicare l'effetto tremolante quando hanno il focus" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Tipi di finestre a cui applicare l'effetto tremolante quando afferrate" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Tipi di finestre a cui applicare l'effetto tremolante quando mappate" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Tipi di finestre a cui applicare l'effetto tremolante quando spostate" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" "Effetto tremolante alla massimizzazione/demassimizzazione delle finestre" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Finestre tremolanti" #~ msgid "Command line 0" #~ msgstr "Riga di comando 0" #~ msgid "Run command 0" #~ msgstr "Esegui comando 0" #~ msgid "Screenshot commands" #~ msgstr "Comandi cattura schermata" #~ msgid "Screenshot key bindings" #~ msgstr "Associazioni tasti per cattura schermata" #~ msgid "Filter Linear" #~ msgstr "Filtro lineare" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Usa il filtro lineare nell'ingrandimento" #~ msgid "Zoom Desktop" #~ msgstr "Ingrandisci desktop" #~ msgid "Zoom In" #~ msgstr "Aumenta ingrandimento" #~ msgid "Zoom Out" #~ msgstr "Riduci ingrandimento" #~ msgid "Zoom Pan" #~ msgstr "Panoramica" #~ msgid "Zoom Speed" #~ msgstr "Velocità zoom" #~ msgid "Zoom Timestep" #~ msgstr "Intervallo zoom" # (ndt) non capisco cosa centri il cubo... # dovrebbe funzionare anche senza... #~ msgid "Zoom and pan desktop cube" #~ msgstr "Ingrandisce ed esegue panoramiche del desktop" #~ msgid "Zoom factor" #~ msgstr "Fattore ingrandimento" #~ msgid "Zoom pan" #~ msgstr "Ingrandisce panoramica" #~ msgid "Decrease window opacity" #~ msgstr "Riduce l'opacità della finestra" #~ msgid "Increase window opacity" #~ msgstr "Aumenta l'opacità della finestra" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Valori di opacità per le finestre che dovrebbero essere traslucide in " #~ "modo predefinito" #~ msgid "Opacity windows" #~ msgstr "Opacità finestre" #~ msgid "Background Images" #~ msgstr "Immagini di sfondo" #~ msgid "Background images" #~ msgstr "Immagini di sfondo" #~ msgid "Desktop Plane" #~ msgstr "Desktop piano" #~ msgid "Place windows on a plane" #~ msgstr "Posiziona le finestre su un piano" #~ msgid "Plane Down" #~ msgstr "Piano in giù" #~ msgid "Plane Left" #~ msgstr "Piano a sinistra" #~ msgid "Plane Right" #~ msgstr "Piano a destra" #~ msgid "Plane To Face 1" #~ msgstr "Vai al piano della faccia 1" #~ msgid "Plane To Face 10" #~ msgstr "Vai al piano della faccia 10" #~ msgid "Plane To Face 11" #~ msgstr "Vai al piano della faccia 11" #~ msgid "Plane To Face 12" #~ msgstr "Vai al piano della faccia 12" #~ msgid "Plane To Face 2" #~ msgstr "Vai al piano della faccia 2" #~ msgid "Plane To Face 3" #~ msgstr "Vai al piano della faccia 3" #~ msgid "Plane To Face 4" #~ msgstr "Vai al piano della faccia 4" #~ msgid "Plane To Face 5" #~ msgstr "Vai al piano della faccia 5" #~ msgid "Plane To Face 6" #~ msgstr "Vai al piano della faccia 6" #~ msgid "Plane To Face 7" #~ msgstr "Vai al piano della faccia 7" #~ msgid "Plane To Face 8" #~ msgstr "Vai al piano della faccia 8" #~ msgid "Plane To Face 9" #~ msgstr "Vai al piano della faccia 9" #~ msgid "Plane Up" #~ msgstr "Piano in su" #~ msgid "Plane down" #~ msgstr "Va al piano inferiore" #~ msgid "Plane left" #~ msgstr "Va al piano a sinistra" #~ msgid "Plane right" #~ msgstr "Va al piano a destra" #~ msgid "Plane to face 1" #~ msgstr "Va al piano 1" #~ msgid "Plane to face 10" #~ msgstr "Va al piano 10" #~ msgid "Plane to face 11" #~ msgstr "Va al piano 11" #~ msgid "Plane to face 12" #~ msgstr "Va al piano 12" #~ msgid "Plane to face 2" #~ msgstr "Va al piano 2" #~ msgid "Plane to face 3" #~ msgstr "Va al piano 3" #~ msgid "Plane to face 4" #~ msgstr "Va al piano 4" #~ msgid "Plane to face 5" #~ msgstr "Va al piano 5" #~ msgid "Plane to face 6" #~ msgstr "Va al piano 6" #~ msgid "Plane to face 7" #~ msgstr "Va al piano 7" #~ msgid "Plane to face 8" #~ msgstr "Va al piano 8" #~ msgid "Plane to face 9" #~ msgstr "Va al piano 9" # (ndt) devo ancora capirne l'utilità... # (ndt) descrizione plugin # (ndt) è il nome di una scheda # meglio stare sul corto # (ndt) pure questa è il nome di una scheda... # (ndt) lo so... lo so... a molti non andrà a genio! :) # (ndt) ometto skydome, tanto sono presenti solo tra le sue opzioni # (ndt) l'opzione per aprire il cubo e vedere le sue facce # quella superiore e inferiore non vengono contate... # (ndt) o principale? # (ndt) il funzionamento è questo: # prendere un oggetto, non una finestra, e cercare # di spostarlo in un'altra area di lavoro per far ruotare il cubo # (ndt) praticamente sposta il puntatore sul bordo di destra # (ndt) riesco a capire cosa faccia... # (ndt) mah... # (ndt) non è molto chiara in inglese # dovrebbe indicare l'applicazione da usare # per visualizzare le schermate # (ndt) termine un po' così... # indica le finestre che dovrebbero essere tremolanti quando sono 'catturate' #~ msgid "Plane up" #~ msgstr "Va al piano superiore" ./po/fa.po0000644000004100000410000014571113246301623012620 0ustar www-datawww-data# Translation of compiz.po into Persian. # Copyright (C) 2008 Compiz-Fusion Developers # This file is distributed under the same license as the Compiz-Fusion package. # Mohammad Ebrahim Mohammadi Panah , 2008. # msgid "" msgstr "" "Project-Id-Version: Compiz-Fusion compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-29 13:06+0100\n" "PO-Revision-Date: 2008-03-12 06:29+0100\n" "Last-Translator: Ali Tarihi \n" "Language-Team: l10n.ir\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "رومیزی" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "مدیریت پنجره‌" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 #, fuzzy msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "کنشی که هنگام Scroll کردن چرخ موشواره روی عنوان یک پنجره صورت گیرد." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "میزان مات بودن پنجره فعال در تم Metacity " #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:11 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 ../metadata/zoom.xml.in.h:2 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 ../metadata/cube.xml.in.h:28 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:13 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:23 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/core.xml.in.h:1 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/core.xml.in.h:2 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/core.xml.in.h:3 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/core.xml.in.h:4 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/core.xml.in.h:5 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/core.xml.in.h:6 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/core.xml.in.h:7 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/core.xml.in.h:8 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/core.xml.in.h:9 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/core.xml.in.h:10 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/core.xml.in.h:11 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/core.xml.in.h:12 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/core.xml.in.h:13 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.h:14 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.h:15 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.h:16 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.h:17 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.h:18 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.h:19 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.h:20 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.h:21 msgid "Best" msgstr "" #: ../metadata/core.xml.in.h:22 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.h:23 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.h:24 msgid "Close Window" msgstr "" #: ../metadata/core.xml.in.h:25 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.h:26 msgid "Command line 0" msgstr "" #: ../metadata/core.xml.in.h:27 msgid "Command line 1" msgstr "" #: ../metadata/core.xml.in.h:28 msgid "Command line 10" msgstr "" #: ../metadata/core.xml.in.h:29 msgid "Command line 11" msgstr "" #: ../metadata/core.xml.in.h:30 msgid "Command line 2" msgstr "" #: ../metadata/core.xml.in.h:31 msgid "Command line 3" msgstr "" #: ../metadata/core.xml.in.h:32 msgid "Command line 4" msgstr "" #: ../metadata/core.xml.in.h:33 msgid "Command line 5" msgstr "" #: ../metadata/core.xml.in.h:34 msgid "Command line 6" msgstr "" #: ../metadata/core.xml.in.h:35 msgid "Command line 7" msgstr "" #: ../metadata/core.xml.in.h:36 msgid "Command line 8" msgstr "" #: ../metadata/core.xml.in.h:37 msgid "Command line 9" msgstr "" #: ../metadata/core.xml.in.h:38 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/core.xml.in.h:39 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/core.xml.in.h:40 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/core.xml.in.h:41 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/core.xml.in.h:42 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/core.xml.in.h:43 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/core.xml.in.h:44 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/core.xml.in.h:45 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/core.xml.in.h:46 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/core.xml.in.h:47 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/core.xml.in.h:48 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/core.xml.in.h:49 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/core.xml.in.h:50 msgid "Decrease Opacity" msgstr "" #: ../metadata/core.xml.in.h:51 msgid "Decrease window opacity" msgstr "" #: ../metadata/core.xml.in.h:52 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.h:53 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.h:54 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.h:55 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:56 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.h:57 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.h:58 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.h:59 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.h:60 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.h:61 msgid "Good" msgstr "" #: ../metadata/core.xml.in.h:62 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.h:63 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.h:64 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.h:65 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:66 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.h:67 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.h:68 msgid "Increase Opacity" msgstr "" #: ../metadata/core.xml.in.h:69 msgid "Increase window opacity" msgstr "" #: ../metadata/core.xml.in.h:70 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.h:71 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.h:72 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.h:73 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.h:74 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.h:75 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.h:76 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.h:77 msgid "Maximize Window" msgstr "" #: ../metadata/core.xml.in.h:78 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.h:79 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.h:80 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.h:81 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.h:82 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.h:83 msgid "Minimize Window" msgstr "" #: ../metadata/core.xml.in.h:84 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.h:85 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.h:86 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.h:87 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.h:88 msgid "Opacity Step" msgstr "" #: ../metadata/core.xml.in.h:89 msgid "Opacity change step" msgstr "" #: ../metadata/core.xml.in.h:90 msgid "Opacity values for windows that should be translucent by default" msgstr "" #: ../metadata/core.xml.in.h:91 msgid "Opacity window values" msgstr "" #: ../metadata/core.xml.in.h:92 msgid "Opacity windows" msgstr "" #: ../metadata/core.xml.in.h:93 msgid "Open a terminal" msgstr "" #: ../metadata/core.xml.in.h:94 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.h:95 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.h:96 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.h:97 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.h:98 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.h:99 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.h:100 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.h:101 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.h:102 msgid "Run Dialog" msgstr "" #: ../metadata/core.xml.in.h:103 msgid "Run command 0" msgstr "" #: ../metadata/core.xml.in.h:104 msgid "Run command 1" msgstr "" #: ../metadata/core.xml.in.h:105 msgid "Run command 10" msgstr "" #: ../metadata/core.xml.in.h:106 msgid "Run command 11" msgstr "" #: ../metadata/core.xml.in.h:107 msgid "Run command 2" msgstr "" #: ../metadata/core.xml.in.h:108 msgid "Run command 3" msgstr "" #: ../metadata/core.xml.in.h:109 msgid "Run command 4" msgstr "" #: ../metadata/core.xml.in.h:110 msgid "Run command 5" msgstr "" #: ../metadata/core.xml.in.h:111 msgid "Run command 6" msgstr "" #: ../metadata/core.xml.in.h:112 msgid "Run command 7" msgstr "" #: ../metadata/core.xml.in.h:113 msgid "Run command 8" msgstr "" #: ../metadata/core.xml.in.h:114 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.h:115 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.h:116 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.h:117 msgid "Screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:118 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.h:119 msgid "Show Main Menu" msgstr "" #: ../metadata/core.xml.in.h:120 msgid "Show Run Application dialog" msgstr "" #: ../metadata/core.xml.in.h:121 msgid "Show the main menu" msgstr "" #: ../metadata/core.xml.in.h:122 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.h:123 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.h:124 msgid "Take a screenshot" msgstr "" #: ../metadata/core.xml.in.h:125 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/core.xml.in.h:126 msgid "Terminal command line" msgstr "" #: ../metadata/core.xml.in.h:127 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.h:128 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.h:129 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.h:130 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.h:131 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.h:132 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.h:133 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.h:134 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.h:135 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.h:136 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.h:137 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.h:138 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.h:139 msgid "Unmaximize Window" msgstr "" #: ../metadata/core.xml.in.h:140 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.h:141 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.h:142 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.h:143 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.h:144 msgid "Window Menu" msgstr "" #: ../metadata/core.xml.in.h:145 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.h:146 msgid "Window menu key binding" msgstr "" #: ../metadata/core.xml.in.h:147 msgid "Window screenshot command line" msgstr "" #: ../metadata/core.xml.in.h:148 msgid "Windows that should be translucent by default" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Background Images" msgstr "" #: ../metadata/cube.xml.in.h:9 msgid "Background images" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Window Opacity Fade Time." msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fade Time" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:19 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:20 ../metadata/switcher.xml.in.h:10 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:27 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:29 ../metadata/scale.xml.in.h:17 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "On big cube" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:46 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:90 ../metadata/scale.xml.in.h:32 #: ../metadata/switcher.xml.in.h:31 ../metadata/zoom.xml.in.h:3 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:48 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:93 ../metadata/scale.xml.in.h:34 #: ../metadata/switcher.xml.in.h:35 ../metadata/zoom.xml.in.h:4 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:1 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:2 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Window fade speed" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/scale.xml.in.h:21 #: ../metadata/switcher.xml.in.h:17 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Maximize" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:9 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:10 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Y position values" msgstr "" #: ../metadata/plane.xml.in.h:1 msgid "Desktop Plane" msgstr "" #: ../metadata/plane.xml.in.h:2 msgid "Place windows on a plane" msgstr "" #: ../metadata/plane.xml.in.h:3 msgid "Plane Down" msgstr "" #: ../metadata/plane.xml.in.h:4 msgid "Plane Left" msgstr "" #: ../metadata/plane.xml.in.h:5 msgid "Plane Right" msgstr "" #: ../metadata/plane.xml.in.h:6 msgid "Plane To Face 1" msgstr "" #: ../metadata/plane.xml.in.h:7 msgid "Plane To Face 10" msgstr "" #: ../metadata/plane.xml.in.h:8 msgid "Plane To Face 11" msgstr "" #: ../metadata/plane.xml.in.h:9 msgid "Plane To Face 12" msgstr "" #: ../metadata/plane.xml.in.h:10 msgid "Plane To Face 2" msgstr "" #: ../metadata/plane.xml.in.h:11 msgid "Plane To Face 3" msgstr "" #: ../metadata/plane.xml.in.h:12 msgid "Plane To Face 4" msgstr "" #: ../metadata/plane.xml.in.h:13 msgid "Plane To Face 5" msgstr "" #: ../metadata/plane.xml.in.h:14 msgid "Plane To Face 6" msgstr "" #: ../metadata/plane.xml.in.h:15 msgid "Plane To Face 7" msgstr "" #: ../metadata/plane.xml.in.h:16 msgid "Plane To Face 8" msgstr "" #: ../metadata/plane.xml.in.h:17 msgid "Plane To Face 9" msgstr "" #: ../metadata/plane.xml.in.h:18 msgid "Plane Up" msgstr "" #: ../metadata/plane.xml.in.h:19 msgid "Plane down" msgstr "" #: ../metadata/plane.xml.in.h:20 msgid "Plane left" msgstr "" #: ../metadata/plane.xml.in.h:21 msgid "Plane right" msgstr "" #: ../metadata/plane.xml.in.h:22 msgid "Plane to face 1" msgstr "" #: ../metadata/plane.xml.in.h:23 msgid "Plane to face 10" msgstr "" #: ../metadata/plane.xml.in.h:24 msgid "Plane to face 11" msgstr "" #: ../metadata/plane.xml.in.h:25 msgid "Plane to face 12" msgstr "" #: ../metadata/plane.xml.in.h:26 msgid "Plane to face 2" msgstr "" #: ../metadata/plane.xml.in.h:27 msgid "Plane to face 3" msgstr "" #: ../metadata/plane.xml.in.h:28 msgid "Plane to face 4" msgstr "" #: ../metadata/plane.xml.in.h:29 msgid "Plane to face 5" msgstr "" #: ../metadata/plane.xml.in.h:30 msgid "Plane to face 6" msgstr "" #: ../metadata/plane.xml.in.h:31 msgid "Plane to face 7" msgstr "" #: ../metadata/plane.xml.in.h:32 msgid "Plane to face 8" msgstr "" #: ../metadata/plane.xml.in.h:33 msgid "Plane to face 9" msgstr "" #: ../metadata/plane.xml.in.h:34 msgid "Plane up" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Normal" msgstr "" #: ../metadata/resize.xml.in.h:13 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:2 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:12 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:94 ../metadata/switcher.xml.in.h:37 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:2 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:3 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:5 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:18 ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:24 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:25 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:28 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:6 msgid "Brightness" msgstr "" #: ../metadata/switcher.xml.in.h:7 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:11 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:14 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:19 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Saturation" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:29 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:36 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" #: ../metadata/zoom.xml.in.h:1 msgid "Filter Linear" msgstr "" #: ../metadata/zoom.xml.in.h:5 msgid "Use linear filter when zoomed in" msgstr "" #: ../metadata/zoom.xml.in.h:6 msgid "Zoom Desktop" msgstr "" #: ../metadata/zoom.xml.in.h:7 msgid "Zoom In" msgstr "" #: ../metadata/zoom.xml.in.h:8 msgid "Zoom Out" msgstr "" #: ../metadata/zoom.xml.in.h:9 msgid "Zoom Pan" msgstr "" #: ../metadata/zoom.xml.in.h:10 msgid "Zoom Speed" msgstr "" #: ../metadata/zoom.xml.in.h:11 msgid "Zoom Timestep" msgstr "" #: ../metadata/zoom.xml.in.h:12 msgid "Zoom and pan desktop cube" msgstr "" #: ../metadata/zoom.xml.in.h:13 msgid "Zoom factor" msgstr "" #: ../metadata/zoom.xml.in.h:14 msgid "Zoom pan" msgstr "" ./po/nb.po0000644000004100000410000025170313246301623012630 0ustar www-datawww-data# Norwegian Bokmaal translation of Compiz Core. # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. # This file is distributed under the same license as the compiz package. # Ketil W. Aanensen , 2007. # msgid "" msgstr "" "Project-Id-Version: Compiz 0.6.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2008-04-03 23:15+0200\n" "Last-Translator: Ketil Wendelbo Aanensen \n" "Language-Team: Norwegian Bokmaal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Pootle 1.0.2\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Skrivebord" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Vindushåndtering" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ingen" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Skyggelegg" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Maksimer" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Maksimer vindu horisontalt" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Maksimer vindu vertikalt" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Minimert" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "Auto-hev" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Vindusmeny" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" "Hendelse å sette i gang når man ruller musehjulet på et vindus tittellinje." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Sløringstype" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Dekkevne for aktive vinduer med Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Dekkevne for aktive vinduer med Metacity-tema som er rullet opp" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Dekkevne for Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Dekkevne ved opprulling med Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Dekkevne å bruke for aktive vinduer med Metacity temadekorasjoner" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Dekkevne å bruke for Metacity temadekorasjoner" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Skyggelegg aktive vinuder med Metacity temadekorasjoner fra fulldekkende til " "gjennomsiktig" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Skyggelegg vinduer med Metacity temadekorasjoner fra fulldekkende til " "gjennomsiktig" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Musehjulshendelse for tittellinje" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Type sløring som brukes for vindusdekorasjoner" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Bruk Metacity-tema" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Bruk Metacity-tema når vindusdekorasjoner tegnes" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Lukk vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Avmaksimer vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Maksimer vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Minimer vindu" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Hold over" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Klistre" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Av-skyggelegg" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Ikke hold over" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Avklistre" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Vinduet \"%s\" svarer ikke." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Å tvinge denne applikasjonen til å avslutte vil gjøre at du mister alle " "endringer som ikke er lagret." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Tving avslutt" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Påfør" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Fyllfarge for Påfør" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Bestrykningsfarge for Påfør" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Påfør-tillegg" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Rens" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Tegn" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Tegn ved hjelp av verktøy" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Fyllfarge for påførte elementer" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Begynn" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Begynn Påfør-tegning" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Begynn Påfør-utvisking" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Begynn utvisking" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Linjebredde" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Linjebredde for påføringer" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Bestrykningsfarge for påførte elementer" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Bestrykningsbredde" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Bestrykningsbredde for påførte elementer" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4x bilineær" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Alfatilslør" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Alfatilslørte vinduer" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Tilsløringsfilter" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Tilstopping for tilsløring" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Metning for tilsløring" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Hastighet for tilsløring" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Tilslør vinduer" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Tilslør bak gjennomsiktige deler av vinduer" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Metning for tilsløring" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Tilslør vinduer" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Tilslør vinduer som ikke har fokus" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Slå av tilsløring av skjermområder som er dekket av andre vinduer." #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Filtermetode brukt for tilsløring" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Fokustilsløring" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Fokustilslør vinduer" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Gaussisk" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Gaussisk radius" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Gaussisk styrke" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Gaussisk radius" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Gaussisk styrke" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Uavhengig teksturhenting" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "MIP-kart" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "MIP-kart detaljnivå" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Detaljnivå for MIP-kart" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Puls" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Pulseffekt" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Bruk de tilgjengelige teksturenhetene for å gjøre så mange uavhengige " "teksturhentinger som mulig." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Hastighet for vindutilsløring" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Vinduer som skal påvirkes av fokustilsløring" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Vinduer som skal bruke alfatilsløring som standard" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Klone-utdata" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Begynn klonseleksjon" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Håndterer for klone-utdata" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando0" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando1" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando10" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando11" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando2" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando3" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando4" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando5" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando6" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando7" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando8" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando9" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando0" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando1" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando10" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando11" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando2" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando3" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando4" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando5" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando6" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando7" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando8" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "En hurtigtast som, når innhentet, vil kjøre konsollkommandoen identifisert " "som kommando9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Kommandolinje 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Kommandolinje 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Kommandolinje 11" #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "Kommandolinje 1" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Kommandolinje 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Kommandolinje 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Kommandolinje 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Kommandolinje 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Kommandolinje 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Kommandolinje 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Kommandolinje 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Kommandolinje 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando0 blir innhentet" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando1 blir innhentet" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando10 blir innhentet" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando11 blir innhentet" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando2 blir innhentet" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando3 blir innhentet" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando4 blir innhentet" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando5 blir innhentet" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando6 blir innhentet" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando7 blir innhentet" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando8 blir innhentet" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" "Kommandolinje som skal kjøres i konsoll når kjør_kommando9 blir innhentet" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "Kommando" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Kjør kommando 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Kjør kommando 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Kjør kommando 11" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "Kjør kommando 1" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Kjør kommando 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Kjør kommando 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Kjør kommando 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Kjør kommando 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Kjør kommando 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Kjør kommando 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Kjør kommando 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Kjør kommando 9" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Aktive tillegg" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Tilatt tegning av fullskjermvinduer å ikke bli omdirigert til bilder utenfor " "skjermen" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Hørbar bjelle" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Hørbart systempip" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Auto-hev" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Forsinkelse for auto-hev" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Automatisk gjenkjennelse av skjermenheter" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Automatisk gjenkjennelse av oppdateringshastighet" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Beste" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Klikk for fokus" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Klikk på vindu flytter inndatafokus til det" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Lukk aktivt vindu" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Standardikon" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Standard bilde for vindusikon" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "Skrivebordskube" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Gjenkjenn utdata" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Gjenkjenn oppfriskingshastighet" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Varigheten musepekeren må hvile i en skjermkant før en kanthendelse utføres." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Forsinkelse for kantutløsning" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Rask" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Fokusunngående nivå" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Fokusunngående vinduer" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Fokusunngående vinduer" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Generelle valg" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Generelle Compiz-valg" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "God" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Skjul vinduer som hopper over oppgavelinjen" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Skjul alle vinduer og fokuser på skrivebordet" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "Skjul vinduer som ikke er i oppgavelinjen når Visskrivebord-modus startes" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Høy" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Horisontal virtuell størrelse" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "Hvis mulig, bruk kompresjon for teksturer hentet fra bilder" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ignorer hint når maksimert" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "Ignorer størrelsesøkning- og forholdshint når vinduet er maksimert" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Intervall før valgte vinduer heves" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Intervall mellom ping-beskjeder" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Lyn" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Liste over aktive tillegg nå" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Liste over strenger som beskriver skjermenheter" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Senk vindu" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Senk vindu under andre vinduer" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Maksimer vindu horisontalt" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Maksimer vindu vertikalt" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Maksimer aktivt vindu" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Maksimer aktivt vindu horisontalt" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Maksimer aktivt vindu vertikalt" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Minimer aktivt vindu" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Normal" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Antall skrivebord" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Antall viruelle skrivebord" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" # fuzzy #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "Bare utfør skjermoppdateringer ved vertikale blankingsperioder" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Utdata" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Overlappende utdata-håndtering" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Ping-forsinkelse" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Foretrekk større utdata" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Foretrekk mindre utdata" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Hev ved klikk" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Hev vindu" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Hev valgt vindu etter intervall" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Hev vindu over andre vinduer" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Hev vinduer når de klikkes" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Oppfriskingsrate" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Multiplikator for skjermstørrelse for horisontal virtuell størrelse" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Multiplikator for skjermstørrelse for vertikal virtuell størrelse" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Vis skrivebord" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Trege animasjoner" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Smartmodus" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Synkroniser til VBlank" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "Teksturfiltrering" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Teksturfilter" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Teksturfiltrering" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Hastigheten for omtegning av skjermen (ganger/sekund)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Skru av/på maksimert vindu" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Skru av/på horisontalt maksimert vindu" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Skru av/på vertikalt maksimert vindu" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Skru av/på rull opp/ ned vindu" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Skru av/på maksimert aktivt vindu" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Skru av/på horisontalt maksimert aktivt vindu" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Skru av/på vertikalt maksimert aktivt vindu" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Skru av/på rull opp/ned vindu" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Skru av/på bruk av trege animasjoner" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Avmaksimer aktivt vindu" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Ikke-videresend vinduer i fullskjerm" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Bruk diffust lys når skjermen omdannes" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Vertikal virtuell størrelse" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Hvilken av de overlappende utdata-enhetene skal foretrekkes" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Snarvei for vindusmeny" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Hurtigtast for vindusmeny" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Akselerasjon" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Juster bilde" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Juster toppbilde til rotasjon" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Gå videre til neste bilde" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Animer himmelkuppel" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Animer himmelkuppel når kuben roteres" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Automatisk" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Farge på kubens topp og bunn" # fuzzy #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" "Farge som skal brukes til bunnens fargestans av alternativet for " "fargeovergangen for himmelkuppel" # fuzzy #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" "Farge som skal brukes til toppens fargestans av alternativet for " "fargeovergangen for himmelkuppelen" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "Kubefarge" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Kubefarge" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Skrivebordskube" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Akselerasjon for bretting" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Brettehastighet" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Tidsskritt for bretting" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "Lag MIP-kart når det er mulig, for skalering med høyere kvalitet" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Gå tilbake til forrige bilde" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Bildefiler" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Bilde å bruke som tekstur for himmelkuppelen" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Starter gjennomsiktighet for kube kun hvis rotasjonen er drevet av mus" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Innsiden av kuben" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Innsiden av kuben" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Liste over PNG- og SVG-filer som skal gjengis på toppen av kuben" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Flerskjermsmodus" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Flere kuber" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Neste bilde" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "Én stor kube" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Dekkevne ved rotasjon" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Dekkevne når det ikke roteres" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Skrivebordsvinduenes dekkevne ved rotasjon" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Skrivebordsvinduenes dekkevne når det ikke roteres" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Plasser vinduer på kuben" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Forrige bilde" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Gjengi himmelkuppel" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Skaler bilde" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Skaler bilder for å dekke toppen av kuben" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Velger hvordan kuben vises hvis flere skjermenheter brukes." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Himmelkuppel" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Sluttfarge for himmelkuppelens fargeovergang" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Startfarge for himmelkuppelens fargeovergang" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Bilde for himmelkuppel" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Hastighet" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Tidsskritt" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Gjennomsiktighet kun ved muserotasjon" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Brett ut" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Brett ut kuben" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus kontrollmotor" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "La MIP-kart bli laget for dekorasjonstekstur" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Kommando" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Dekorasjonsvinduer" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" "Kommandolinje for dekoratør som kjøres hvis ingen dekoratør allerede kjører" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Slippskyggens X-forskyvning" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Slippskyggens Y-forskyvning" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Farge for slippskygge" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Dekkevne for slippskygge" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Radius for slippskygge" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Skyggefarge" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Skyggens X-forskyvning" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Skyggens Y-forskyvning" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Dekkevne for skygge" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Skyggeradius" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Skyggevinduer" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Vindusdekor" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Vindusdekorasjoner" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Vinduer som skal dekoreres" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Vinduer som skal ha en skygge" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "Rotasjonshastighet" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "Hold tilbake Y" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Normal størrelsesemdring av vinduer" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "Uttoningstid" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Ton ved minimer/åpne/lukk" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Toningshastighet" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Uttoningstid" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Toningseffekt på minimer/åpne/lukk" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Toningseffekt ved systempip" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Ton inn vinduer når de kartlegges og ton ut vinduer når de av-kartlegges" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Ton vinduer" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Inn- og uttonende vinduer" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Visuell bjelle i fullskjerm" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Fullskjerms toningseffekt ved systempip" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Visuell bjelle" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Hastighet for toning av vinduer" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "Vinduer som skal skaleres i skalermodus" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Vinduer som skal tones" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Monteringspunkt" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Filsystem på brukerområde" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Filsystem på brukerens område" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "Gconf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Gconf kontrollmotor" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "Glib" # fuzzy #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Glib støtte for hovedløkke" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Åpne en terminal" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Kjør-dialog" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "Kommandolinje for terminal" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Kommandolinje for skjermbilde" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "Vis hovedmeny" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Vis \"Kjør program\"-dialog" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Vis hovedmenyen" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Ta et skjermbilde" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Ta et skjermbilde av et vindu" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Kommandolinje for terminal" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Kommandolinje for skjermbilde av vindu" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini flatfil-motor" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Varslingstilleg for filendringer" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig kontrollmotor" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Minimereffekt" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Minimer vinduer" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Minimeringshastighet" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Tidsskritt for minimering" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Skyggemotstand" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Skyggemotstand" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Omdann vinduer når de minimeres og avminimeres" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Vinduer som skal omdannes når de minimeres" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Hold tilbake Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Hold tilbake Y-koordinat til arbeidsområde" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Ikke oppdater vindusposisjonen på tjenerside før vinduene er ferdig med " "flytting" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Begynn vindusflytting" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "Lat posisjonering" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Flytt vindu" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Flytt vindu" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Dekkevne" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Dekkevnenivå for bevegende vinduer" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "Smekk av og automatisk avmaksimer maksimerte vinduer når de trekkes" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Smekk av maksimerte vinduer" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Begynn å bevege vindu" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "Skarphet" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "Reduser dekkevne" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "Øk dekkevne" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "Endringssteg for dekkevne" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "Endringssteg for dekkevne" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Steg for dekkevne" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "Dekkevnenivå for bevegende vinduer" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "Dekkevne ved rotasjon" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Metning" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "Metning" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "Metning" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "Metning" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "Vindusdekorasjoner" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Dekkevneverdier for vinduer" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Kartlegg vinduer" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "Vinduer som skal posisjoneres som standard" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "Vinduer som skal være gjennomsiktige som standard" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "Vinduer som skal posisjoneres som standard" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Algoritme som brukes for plassering av vinduer" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Tett-i-tett" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "Sentrert" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "Vindushåndtering" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "Fokusunngående vinduer" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Horisontale posisjoner på arbeidsområde" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Plasser vinduer" #: ../metadata/place.xml.in.h:12 #, fuzzy msgid "Place across all outputs" msgstr "Foretrekk mindre utdata" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "Plasser vinuder på passende posisjoner når de kartlegges" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Plasseringsmodus" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Posisjonerte vinduer" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Tilfeldig" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "Velge hvor vinduene skaleres hvis flere skjermenheter brukes." #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Smart" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "På alle skjermenheter" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Vertikale posisjoner på arbeidsområde" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Arbeidsområde-plasserte vinduer" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Omveier for vindusplassering" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Vinduer som skal posisjoneres som standard" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "Vinduer som skal plasseres i spesifikke arbeidsområder som standard" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "Vindusdekorasjoner" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Omveier" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "X-posisjoner" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "X-posisjoner på arbeidsområde" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Verdier for X-posisjon" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Y-posisjoner" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Y-posisjoner på arbeidsområde" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Verdier for Y-posisjon" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png-bildelaster" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex-samsvar" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex-samsvar mellom vinduer" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Kantfarge" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "Kantfarge brukt for omriss og rektangel ved gjør-om-størrelse-modus" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Standardmodus for størrelsesendring" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Standard modus som brukes for størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Fyllfarge" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "Fyllfarge brukt for omriss og rektangel ved gjør-om-størrelse-modus" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Begynn normal størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Begynn omriss-størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Begynn rektangulær størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Begynn strekk-størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Begynn størrelsesendring av vindu" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Normal størrelsesemdring av vinduer" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Omriss" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Omriss-størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Rektangulær" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Rektangulær størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Endre størrelse på vindu" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Endre størrelse på vindu" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Begynn å endre størrelse på vindu" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Begynn å endre størrelse på vindu ved å strekke det" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "begynn å enre størrelse på vindu på normalt vis" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Begynn å endre størrelse på vindu med omriss" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Begynn å endre størrelse på vindu rekatngulært" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Strekk" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Strekk-størrelsesendring av vinduer" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Vinduer som skal endre størrelse på normalt vis" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Vinduer som skal endre størrelse med omriss" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Vinduer som skal endre størrelse rektangulært" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Vinduer som skal endre størrelse ved strekking" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Kantbytt dra-og-slipp" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Kantbytt flytt" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Kantbytt peker" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Byttetid" # fuzzy #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Bytt til venstre arbeidsområde og 'warp' musepeker" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "Bytt til neste arbeidsområde når objekter dras til skjermkanten" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Bytt til neste arbeidsområde når musepekeren flyttes til skjermkanten" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "Bytt til neste arbeidsområde når vinduer flyttes til skjermkanten" # fuzzy #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Bytt til høyre arbeidsområde og 'warp' musepeker" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "inverter Y-akse for musebevegelse" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Musepeker inverter Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Følsomhet for musepeker" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Hev ved rotasjon" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Hev vindu ved rotasjon" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Roter kuben" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Roter bytt venstre" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Roter bytt høyre" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Roter venstre" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Roter venstre med vindu" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Roter høyre" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Roter høyre med vindu" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Roter til" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Roter til ansikt 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Roter til ansikt 1 med vindu" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Roter til ansikt 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Roter til ansikt 10 med vindu" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Roter til ansikt 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Roter til ansikt 11 med vindu" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Roter til ansikt 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Roter til ansikt 12 med vindu" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Roter til ansikt 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Roter til ansikt 2 med vindu" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Roter til ansikt 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Roter til ansikt 3 med vindu" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Roter til ansikt 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Roter til ansikt 4 med vindu" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Roter til ansikt 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Roter til ansikt 5 med vindu" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Roter til ansikt 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Roter til ansikt 6 med vindu" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Roter til ansikt 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Roter til ansikt 7 med vindu" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Roter til ansikt 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Roter til ansikt 8 med vindu" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Roter til ansikt 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Roter til ansikt 9 med vindu" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "Roter kuben" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Roter skrivebordskuben" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Roter venstre" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Roter venstre og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Roter høyre" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Roter høyre og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "Roter til ansikt 1" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "Roter til ansikt 1 med vindu" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Roter til ansikt 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Roter til ansikt 1 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Roter til ansikt 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Roter til ansikt 10 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Roter til ansikt 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Roter til ansikt 11 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Roter til ansikt 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Roter til ansikt 12 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Roter til ansikt 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Roter til ansikt 2 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Roter til ansikt 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Roter til ansikt 3 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Roter til ansikt 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Roter til ansikt 4 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Roter til ansikt 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Roter til ansikt 5 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Roter til ansikt 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Roter til ansikt 6 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Roter til ansikt 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Roter til ansikt 7 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Roter til ansikt 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Roter til ansikt 8 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Roter til ansikt 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Roter til ansikt 9 og trekk aktivt vindu med" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Roter til arbeidsområde" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Roter vindu" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Roter med vinduer" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Akselerasjon for rotasjon" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Rotasjonshastighet" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Tidsskritt for rotasjon" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Rotasjonsforstørrelse" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Følsomhet for musepekers bevegelse" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Smekk kuberotasjon til bunnen" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Smekk kuberotasjon til toppen" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Smekk til bunn" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Smekk til topp" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Begynn rotasjon" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Tidsavbrudd før arbeidsområde byttes" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Forstørr" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Dekkevne i prosent" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Stor" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Klikk skrivebord for å vise skrivebord" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Gjør bakgrunn mørkere" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Gjør bakgrunn mørkere når vinduer skaleres" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Logo" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "Start Visskrivebord-modus når skrivebord klikkes mens skalering pågår" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Svevetid" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Begynn vindusplukker" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "Begynn vindusplukker for alle vinduer" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Begynn vindusplukker for vindusgruppen" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Begynn vindusplukker for vinduer på denne skjermen" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Utform og start omdanning av alle vinduer" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Utform og start omdanning av vindusgruppe" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Utform og start omdanning av vinduer" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Utform og start omdanning av vinduer på denne skjermen" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "På alle skjermenheter" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "På nåværende skjermenhet" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Ikon for overlapp" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Legg et ikon på vinduer når de skaleres" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Skaler" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Skaleringshastighet" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Tidsskritt for skalering" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Skaler vinduer" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "Velge hvor vinduene skaleres hvis flere skjermenheter brukes." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Mellomrom mellom vinduer" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Mellomrom" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "Tid (i ms) før skaleringsmodus avsluttes når det sveves over et vindu" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Vinduer som skal skaleres i skalermodus" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Åpne skjermbilde automatisk med dette programmet" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Katalog" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Begynn rektangulært skjermbilde" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Kjør program" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Legg skjermbilder i denne katalogen" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Skjermbilde" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Tillegg for skjermbilde" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Innlaster for svg-bilde" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Mengde skarphet i prosent" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Mengde metning i prosent" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Programbytter" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Autoroter" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Hent til front" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Hent valgte vinduer til fornt" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "Hvos mye skrivebordet skal forminskes ved vindusbytte" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Ikon" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Minimert" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "Skrivebordsplan" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Neste vindu" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Neste vindu (alle vinduer)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Neste vindu (ikke sprett-opp)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Sprett opp skifter hvis ikke synlig og velg neste vindu" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Sprett opp skifter hvis ikke synlig og velg neste vindu blant alle vinduer" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Sprett opp skifter hvis ikke synlig og velg forrige vindu" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Sprett opp skifter hvis ikke synlig og velg forrige vindu blant alle vinduer" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "Forrige bilde" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Forrige vindu" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Forrige vindu (alle vinduer)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Forrige vindu (ikke sprett-opp)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Roter til det valgte vinduent mens skifting" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Velg neste vindu uten å vise oppsprettsvinduet" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "Velg forrige vindu uten å vise oppsprettsvinduet" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Velg forrige vindu uten å vise oppsprettsvinduet" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Vis ikon ved siden av miniatyr" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Vis minimerte vinduer" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Hastighet for skifter" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Tisskritt for skifter" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Vinduer i skifteren" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Vinduer som skal vises i skifteren" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Sørg for støtte for YV12-fargeområde" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Videoavspilling" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Videoavspilling" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12-fargeområde" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Legg til linje" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Legg til punkt" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Legg til vanneffekter for forskjellige skrivebordshendelser" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Forsinkelse (i ms) mellom regndråper" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Bruk vanneffekter for musepeker" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Linje" # fuzzy #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Skaleringsforskyvning" # fuzzy, "punkt" eller "pek" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Punkt" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Forsinkelse for regn" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Tittelbølge" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Skru av/på regn" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Skru av/på regneffekten" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Skru av/på vindusvisker" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Skru av/på vindusviskereffekten" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Vanneffekt" # fuzzy #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Skaleringsforskyvning for vann" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Bølgeeffekt fra vindustittel" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Fokuseffekt" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Fokuseffekt for vindu" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Fokuser vinduer" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Friksjon" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Grip vinduer" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Oppløsning for rutenett" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Omvendt vindussmekking" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "La vindu skjelve" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Kartleggingseffekt" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Kartleggingseffekt for vinduer" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Kartlegg vinduer" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Maksimeringseffekt" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Minimumsstørrelse for rutenett" # fuzzy, hva i huleste er egentlig vertex? #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Minimums størrelse for rutenett-vertex" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Flytt vinduer" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Skjelv" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Smekk omvendt" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Smekk vinduer" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Fjæringsfriksjon" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K for fjær" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Fjæringskonstant" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Skru av/på vindussmekking" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Bruk fjæringsmodell for ustødighetseffekt for vinduer" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Oppløsning for rutenett-vertex" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Vinduer som skal være ustødige når de fokuseres" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Vinduer som skal være ustødige når de gripes" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Vinduer som skal være ustødige når de kartlegges" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Vinduer som skal være ustødige når de flyttes" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Ustødighetseffekt når vinduer maksimeres og avmaksimeres" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Ustødige vinduer" #~ msgid "Command line 0" #~ msgstr "Kommandolinje 0" #~ msgid "Run command 0" #~ msgstr "Kjør kommando 0" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Kommandolinje for skjermbilde" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Kommandolinje for skjermbilde" #~ msgid "Filter Linear" #~ msgstr "Filtrer lineært" #~ msgid "Use linear filter when zoomed in" #~ msgstr "Bruk lineært filter når forstørret" #~ msgid "Zoom Desktop" #~ msgstr "Forstørr skrivebord" #~ msgid "Zoom In" #~ msgstr "Forstørr" #~ msgid "Zoom Out" #~ msgstr "Forminsk" #~ msgid "Zoom Pan" #~ msgstr "Panorer forstørrelse" #~ msgid "Zoom Speed" #~ msgstr "Forstørringshastighet" #~ msgid "Zoom Timestep" #~ msgstr "Tidsskritt for forstørrelse" #~ msgid "Zoom and pan desktop cube" #~ msgstr "Forstørr og panorer skrivebordskuben" #~ msgid "Zoom factor" #~ msgstr "Forstørrelsesfaktor" #~ msgid "Zoom pan" #~ msgstr "Forstørrelsespanorering" #~ msgid "Decrease window opacity" #~ msgstr "Reduser vinduets dekkevne" #~ msgid "Increase window opacity" #~ msgstr "Øk vinduets dekkevne" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "" #~ "Dekkevneverdier for vinduer som skal være gjennomsiktige som standard" #~ msgid "Opacity windows" #~ msgstr "Vinduer som blir påvirket" #~ msgid "Background Images" #~ msgstr "Bakgrunnsbilder" #~ msgid "Background images" #~ msgstr "Bakgrunnsbilder" #~ msgid "Place windows on a plane" #~ msgstr "Plasser vinduer på et plan" #~ msgid "Plane Down" #~ msgstr "Plan ned" #~ msgid "Plane Left" #~ msgstr "Plan venstre" #~ msgid "Plane Right" #~ msgstr "Plan høyre" #~ msgid "Plane To Face 1" #~ msgstr "Plan til ansikt 1" #~ msgid "Plane To Face 10" #~ msgstr "Plan til ansikt 10" #~ msgid "Plane To Face 11" #~ msgstr "Plan til ansikt 11" #~ msgid "Plane To Face 12" #~ msgstr "Plan til ansikt 12" #~ msgid "Plane To Face 2" #~ msgstr "Plan til ansikt 2" #~ msgid "Plane To Face 3" #~ msgstr "Plan til ansikt 3" #~ msgid "Plane To Face 4" #~ msgstr "Plan til ansikt 4" #~ msgid "Plane To Face 5" #~ msgstr "Plan til ansikt 5" #~ msgid "Plane To Face 6" #~ msgstr "Plan til ansikt 6" #~ msgid "Plane To Face 7" #~ msgstr "Plan til ansikt 7" #~ msgid "Plane To Face 8" #~ msgstr "Plan til ansikt 8" #~ msgid "Plane To Face 9" #~ msgstr "Plan til ansikt 9" #~ msgid "Plane Up" #~ msgstr "Plan oppover" #~ msgid "Plane down" #~ msgstr "Plan nedover" #~ msgid "Plane left" #~ msgstr "Plan til venstre" #~ msgid "Plane right" #~ msgstr "Plan til høyre" #~ msgid "Plane to face 1" #~ msgstr "Plan til ansikt 1" #~ msgid "Plane to face 10" #~ msgstr "Plan til ansikt 10" #~ msgid "Plane to face 11" #~ msgstr "Plan til ansikt 11" #~ msgid "Plane to face 12" #~ msgstr "Plan til ansikt 12" #~ msgid "Plane to face 2" #~ msgstr "Plan til ansikt 2" #~ msgid "Plane to face 3" #~ msgstr "Plan til ansikt 3" #~ msgid "Plane to face 4" #~ msgstr "Plan til ansikt 4" #~ msgid "Plane to face 5" #~ msgstr "Plan til ansikt 5" #~ msgid "Plane to face 6" #~ msgstr "Plan til ansikt 6" #~ msgid "Plane to face 7" #~ msgstr "Plan til ansikt 7" #~ msgid "Plane to face 8" #~ msgstr "Plan til ansikt 8" #~ msgid "Plane to face 9" #~ msgstr "Plan til ansikt 9" #~ msgid "Plane up" #~ msgstr "Plan opp" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "Uttoningstid for dekkevnen til skrivebordsvinduer" ./po/pa.po0000644000004100000410000033606013246301623012631 0ustar www-datawww-data# translation of compiz.po to Punjabi # Hindi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Prasanth Kurian # # A S Alam , 2007. # Amanpreet Singh Alam , 2007. msgid "" msgstr "" "Project-Id-Version: compiz\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2007-12-15 09:26+0530\n" "Last-Translator: Amanpreet Singh Alam \n" "Language-Team: American English \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: Plural-Forms: Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: KAider 0.1\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 #, fuzzy msgid "Desktop" msgstr "ਵੇਹੜਾ" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 #, fuzzy msgid "Window Management" msgstr "ਝਰੋਖਾ ਪਰਬੰਧਕ" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "ਕੰਮਪਿਜ਼" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "ਕੋਈ ਨਹੀਂ" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 #, fuzzy msgid "Shade" msgstr "ਸੰਭਾਲੋ" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 #, fuzzy msgid "Maximize" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:429 #, fuzzy msgid "Maximize Horizontally" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:430 #, fuzzy msgid "Maximize Vertically" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:431 #, fuzzy msgid "Minimize" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/gnome/compiz-window-manager.c:432 #, fuzzy msgid "Raise" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 #, fuzzy msgid "Window Menu" msgstr "ਝਰੋਖਾ ਪਰਬੰਧਕ" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "ਜਦੋਂ ਮਾਊਂਸ ਵੀਲ ਨੂੰ ਇੱਕ ਵਿੰਡੋ ਟਾਇਟਲ ਬਾਰ ਉੱਤੇ ਘੁੰਮਾਉਣ ਦੌਰਾਨ ਲੈਣ ਲਈ ਐਕਸ਼ਨ ਹੈ।" #: ../gtk/window-decorator/gwd.schemas.in.h:2 #, fuzzy msgid "Blur type" msgstr "ਚੁਣੇ" #: ../gtk/window-decorator/gwd.schemas.in.h:3 #, fuzzy msgid "Metacity theme active window opacity" msgstr "Win&dows ਭਾਗ ਹਟਾਓ" #: ../gtk/window-decorator/gwd.schemas.in.h:4 #, fuzzy msgid "Metacity theme active window opacity shade" msgstr "Win&dows ਭਾਗ ਹਟਾਓ" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਧੁੰਦਲਾਪਨ" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਧੁੰਦਲਾਪਨ ਸ਼ੇਡ" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਲਈ ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ ਨਾਲ ਵਰਤਣ ਲਈ ਧੁੰਦਲਾਪਨ" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਧੁੰਦਲਾਪਨ" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "ਧੁੰਦਲੇਪਨ ਤੋਂ ਪਾਰਦਰਸ਼ ਲਈ ਸ਼ੈਡ ਐਕਟਿਵ ਵਿੰਡੋ ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "ਧੁੰਦਲੇਪਨ ਤੋਂ ਪਾਰਦਰਸ਼ ਲਈ ਵਿੰਡੋ ਸ਼ੈਡੋ ਮੇਟਾਸਿਟੀ ਥੀਮ ਸਜਾਵਟ" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "ਟਾਇਟਲ ਬਾਰ ਮਾਊਸ ਵੀਲ ਐਕਸ਼ਨ" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "ਵਿੰਡੋ ਸਜਾਵਟ ਲਈ ਵਰਤਣ ਲਈ ਬਲਰ ਦੀ ਟਾਈਪ" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "ਮੇਟਾਸਿਟੀ ਥੀਮ ਵਰਤੋਂ" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "ਵਿੰਡੋ ਸਜਾਵਟ ਡਰਾਇੰਗ ਦੌਰਾਨ ਮੇਟਾਸਿਟੀ ਥੀਮ ਵਰਤੋਂ" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 #, fuzzy msgid "Close Window" msgstr "Win&dows ਹਟਾਓ" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "ਵਿੰਡੋ ਅਣ-ਵੱਧੋ-ਵੱਧ" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "ਵਿੰਡੋ ਅਧਿਕਤਮ" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 #, fuzzy msgid "Minimize Window" msgstr "Window&s ਸਮੇਟੋ" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 #, fuzzy msgid "Annotate" msgstr "Init" #: ../metadata/annotate.xml.in.h:2 #, fuzzy msgid "Annotate Fill Color" msgstr "ਰੰਗ" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "ਐਨਾਟੇਟ ਸਟਰੋਕ ਰੰਗ" #: ../metadata/annotate.xml.in.h:4 #, fuzzy msgid "Annotate plugin" msgstr "ਸਰਗਰਮ ਪਰੋਫਾਇਲ" #: ../metadata/annotate.xml.in.h:5 #, fuzzy msgid "Clear" msgstr "XF86Clear" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "ਡਰਾਅ" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "ਟੂਲ ਰਾਹੀਂ ਡਰਾਅ ਕਰੋ" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "ਐਨਾਟੇਸ਼ਨ ਲਈ ਭਰਨ ਰੰਗ" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 #, fuzzy msgid "Initiate" msgstr "Init" #: ../metadata/annotate.xml.in.h:10 #, fuzzy msgid "Initiate annotate drawing" msgstr "Init" #: ../metadata/annotate.xml.in.h:11 #, fuzzy msgid "Initiate annotate erasing" msgstr "Init" #: ../metadata/annotate.xml.in.h:12 #, fuzzy msgid "Initiate erase" msgstr "Init" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "ਲਾਈਨ ਚੌੜਾਈ" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "ਐਨਾਟੇਸ਼ਨ ਲਈ ਲਾਈਨ ਚੌੜਾਈ" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "ਐਨਾਟੇਸ਼ਨ ਸਟਰੋਕ ਰੰਗ" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "ਸਟਰੋਕ ਚੌੜਾਈ" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "ਐਨਾਟੇਸ਼ਨ ਲਈ ਸਟਰੋਕ ਚੌੜਾਈ" #: ../metadata/blur.xml.in.h:1 #, fuzzy msgid "4xBilinear" msgstr "ਫਿਲਟਰ:" #: ../metadata/blur.xml.in.h:2 #, fuzzy msgid "Alpha Blur" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:3 #, fuzzy msgid "Alpha blur windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:4 #, fuzzy msgid "Blur Filter" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/blur.xml.in.h:5 #, fuzzy msgid "Blur Occlusion" msgstr "ਅੰਤਰਾਲ" #: ../metadata/blur.xml.in.h:6 #, fuzzy msgid "Blur Saturation" msgstr "ਅੰਤਰਾਲ" #: ../metadata/blur.xml.in.h:7 #, fuzzy msgid "Blur Speed" msgstr "ਚੁਣੇ" #: ../metadata/blur.xml.in.h:8 #, fuzzy msgid "Blur Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "ਵਿੰਡੋ ਦੇ ਪਾਰਦਰਸ਼ੀ ਭਾਗਾਂ ਪਿੱਛੇ ਬਲਰ ਕਰੋ" #: ../metadata/blur.xml.in.h:10 #, fuzzy msgid "Blur saturation" msgstr "ਅੰਤਰਾਲ" #: ../metadata/blur.xml.in.h:11 #, fuzzy msgid "Blur windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "ਬਲਰ ਵਿੰਡੋ, ਜਿੰਨ੍ਹਾਂ ਨੂੰ ਫੋਕਸ ਨਹੀਂ ਹੋ ਸਕਦਾ " #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "ਹੋਰ ਵਿੰਡੋ ਵਲੋਂ ਵੇਖੇ ਜਾਂਦੇ ਸਕਰੀਨ ਭਾਗ ਬਲਰ ਨਾ ਕਰੋ" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "ਬਲਰ ਵਾਸਤੇ ਵਰਤਣ ਲਈ ਫਿਲਟਰ ਢੰਗ" #: ../metadata/blur.xml.in.h:15 #, fuzzy msgid "Focus Blur" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:16 #, fuzzy msgid "Focus blur windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/blur.xml.in.h:17 #, fuzzy msgid "Gaussian" msgstr "ਰੂਸੀ" #: ../metadata/blur.xml.in.h:18 #, fuzzy msgid "Gaussian Radius" msgstr "ਰੂਸੀ ਸੰਘ" #: ../metadata/blur.xml.in.h:19 #, fuzzy msgid "Gaussian Strength" msgstr "ਰੂਸੀ" #: ../metadata/blur.xml.in.h:20 #, fuzzy msgid "Gaussian radius" msgstr "ਰੂਸੀ ਸੰਘ" #: ../metadata/blur.xml.in.h:21 #, fuzzy msgid "Gaussian strength" msgstr "ਰੂਸੀ" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 #, fuzzy msgid "Mipmap" msgstr "ਲੀਮਾ" #: ../metadata/blur.xml.in.h:24 #, fuzzy msgid "Mipmap LOD" msgstr "ਲੀਮਾ" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "ਮਿਪਮੈਪ ਵੇਰਵਾ ਦਾ ਲੈਵਲ" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "ਪਲਸ" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "ਪਲਸ ਪਰਭਾਵ" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 #, fuzzy msgid "Window blur speed" msgstr "Windows" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਫੋਕਸ ਬਲਰ ਰਾਹੀਂ ਪਰਭਾਵਿਤ ਹੋਵੇ" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਡਿਫਾਲਟ ਐਲਫਾ ਵਰਤੇ" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "ਆਉਟਪੁੱਟ ਕਲੋਨ ਕਰੋ" #: ../metadata/clone.xml.in.h:3 #, fuzzy msgid "Initiate clone selection" msgstr "Init" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "ਆਉਟਪੁੱਟ ਕਲੋਨ ਹੈਂਡਲਰ" #: ../metadata/commands.xml.in.h:1 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command0 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:2 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command1 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:3 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command10 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:4 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command11 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:5 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command2 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:6 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command3 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:7 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:8 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:9 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command6 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:10 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command7 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:11 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command8 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:12 #, fuzzy msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command9 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command0 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command1 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command10 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command11 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command2 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command3 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command6 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command7 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command8 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command9 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:25 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command0 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:26 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command1 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:27 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command10 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:28 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command11 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ " "ਹੈ।" #: ../metadata/commands.xml.in.h:29 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command2 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:30 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command3 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:31 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:32 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command5 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:33 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command6 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:34 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command7 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:35 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command8 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:36 #, fuzzy msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "ਇੱਕ ਕੀ-ਬਾਈਡਿੰਗ, ਜੋ ਕਿ ਉਦੋਂ ਸ਼ਾਮਲ ਹੁੰਦੀ ਹੈ, ਜਦੋਂ command9 ਰਾਹੀਂ ਪਛਾਣੀ ਸ਼ੈੱਲ ਕਮਾਂਡ ਰਾਹੀਂ ਚੱਲਦੀ ਹੈ।" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 #, fuzzy msgid "Command line 1" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:40 #, fuzzy msgid "Command line 10" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:41 #, fuzzy msgid "Command line 11" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:42 #, fuzzy msgid "Command line 12" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:43 #, fuzzy msgid "Command line 2" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:44 #, fuzzy msgid "Command line 3" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:45 #, fuzzy msgid "Command line 4" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:46 #, fuzzy msgid "Command line 5" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:47 #, fuzzy msgid "Command line 6" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:48 #, fuzzy msgid "Command line 7" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:49 #, fuzzy msgid "Command line 8" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:50 #, fuzzy msgid "Command line 9" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "ਜਦੋਂ run_command0 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "ਜਦੋਂ run_command1 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "ਜਦੋਂ run_command10 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "ਜਦੋਂ run_command11 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "ਜਦੋਂ run_command2 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "ਜਦੋਂ run_command3 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "ਜਦੋਂ run_command4 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "ਜਦੋਂ run_command5 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "ਜਦੋਂ run_command6 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "ਜਦੋਂ run_command7 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "ਜਦੋਂ run_command8 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "ਜਦੋਂ run_command9 ਹੋਵੇ ਤਾਂ ਸ਼ੈਲ ਵਿੱਚ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 #, fuzzy msgid "Commands" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 #, fuzzy msgid "Run command 1" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:67 #, fuzzy msgid "Run command 10" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:68 #, fuzzy msgid "Run command 11" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:69 #, fuzzy msgid "Run command 12" msgstr "ਕਮਾਂਡ '%1'" #: ../metadata/commands.xml.in.h:70 #, fuzzy msgid "Run command 2" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:71 #, fuzzy msgid "Run command 3" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:72 #, fuzzy msgid "Run command 4" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:73 #, fuzzy msgid "Run command 5" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:74 #, fuzzy msgid "Run command 6" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:75 #, fuzzy msgid "Run command 7" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:76 #, fuzzy msgid "Run command 8" msgstr "ਕਮਾਂਡ: " #: ../metadata/commands.xml.in.h:77 #, fuzzy msgid "Run command 9" msgstr "ਕਮਾਂਡ: " #: ../metadata/core.xml.in.in.h:1 #, fuzzy msgid "Active Plugins" msgstr "ਸਰਗਰਮ ਪਰੋਫਾਇਲ" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "ਪੂਰੀ ਸਕਰੀਨ ਵਿੰਡੋਜ਼ ਦੀ ਡਰਾਇੰਗ ਨੂੰ ਆਫ਼-ਸਕਰੀਨ ਪਿਕਸਮੈਪ ਨੂੰ ਰੀ-ਡਿਰੈਕਟ ਨਾ ਕਰਨ ਲਈ ਮਨਜ਼ੂਰੀ" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "ਸੁਣਨਯੋਗ ਘੰਟੀ" #: ../metadata/core.xml.in.in.h:4 #, fuzzy msgid "Audible system beep" msgstr "ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/core.xml.in.in.h:5 #, fuzzy msgid "Auto-Raise" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "ਆਟੋ-ਉਭਾਰਨ ਅੰਤਰਾਲ" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "ਆਉਟਪੁੱਟ ਜੰਤਰਾਂ ਦੀ ਆਟੋਮੈਟਿਕ ਖੋਜ" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "ਤਾਜ਼ਾ ਦਰ ਲਈ ਆਟੋਮੈਟਿਕ ਖੋਜ" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "ਉੱਤਮ" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "ਫੋਕਸ ਲਈ ਕਲਿੱਕ ਕਰੋ" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "ਵਿੰਡੋ ਲਈ ਇੰਪੁੱਟ ਫੋਕਸ ਲੈਣ ਲਈ ਕਲਿੱਕ ਕਰੋ" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਬੰਦ ਕਰੋ" #: ../metadata/core.xml.in.in.h:14 #, fuzzy msgid "Default Icon" msgstr "ਮੂਲ ਹਿੱਸਾ" #: ../metadata/core.xml.in.in.h:15 #, fuzzy msgid "Default window icon image" msgstr "ਮੂਲ ਡੋਮੇਨ" #: ../metadata/core.xml.in.in.h:16 #, fuzzy msgid "Desktop Size" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "ਆਉਟਪੁੱਟ ਖੋਜੋ" #: ../metadata/core.xml.in.in.h:18 #, fuzzy msgid "Detect Refresh Rate" msgstr "ਅੱਪਡੇਟ ਲਈ ਚੁਣੋ" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "ਤੇਜ਼" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 #, fuzzy msgid "Focus Prevention Level" msgstr "ਫੋਕਸ ਤੋਂ ਬਚਾਅ ਵਿੰਡੋ" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "ਫੋਕਸ ਤੋਂ ਬਚਾਅ ਵਿੰਡੋ" #: ../metadata/core.xml.in.in.h:26 #, fuzzy msgid "Focus prevention windows" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "ਆਮ ਚੋਣਾਂ" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "ਆਮ ਕੰਪਿਜ਼ ਚੋਣਾਂ" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "ਚੰਗਾ" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "ਗ਼ੈਰ-ਟਾਸਕਬਾਰ ਵਿੰਡੋ ਓਹਲੇ" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "ਸਭ ਵਿੰਡੋ ਓਹਲੇ ਕਰੋ ਅਤੇ ਡੈਸਕਟਾਪ ਫੋਕਸ ਕਰੋ" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "ਜਦੋਂ ਡੈਸਕਟਾਪ ਮੋਡ ਵਿੱਚ ਜਾਣ ਲੱਗੋ ਤਾਂ ਟਾਸਕਬਾਰ ਵਿੱਚ ਨਾ ਮੌਜੂਦ ਵਿੰਡੋ ਓਹਲੇ" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 #, fuzzy msgid "Horizontal Virtual Size" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "ਜਦੋਂ ਵੱਧੋ-ਵੱਧ ਹੋਵੇ ਤਾਂ ਹਿੰਟ ਅਣਡਿੱਠੇ" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "ਜਦੋਂ ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਹੋਵੇ ਤਾਂ ਵਾਧਾ ਸਾਈਜ਼ ਅਤੇ ਅਨੁਪਾਤ ਹਿੰਟ ਅਣਡਿੱਠੇ" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "ਚੁਣੇ ਵਿੰਡੋ ਉਭਾਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅੰਤਰਾਲ" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "ਪਿੰਗ ਸੁਨੇਹਿਆਂ ਦੌਰਾਨ ਅੰਤਰਾਲ" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 #, fuzzy msgid "Level of focus stealing prevention" msgstr "ਸਵੈ-ਮੁਅੱਤਲ ਯੋਗ" #: ../metadata/core.xml.in.in.h:43 #, fuzzy msgid "Lighting" msgstr "ਲਾਗਿੰਗ" #: ../metadata/core.xml.in.in.h:44 #, fuzzy msgid "List of currently active plugins" msgstr "ਖੋਜੇ ਪਰਿੰਟਰ ਹੀ ਵੇਖਾਓ" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr " ਆਉਟਪੁੱਟ ਜੰਤਰਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਲਈ ਲਾਈਨਾਂ ਦੀ ਲਿਸਟ" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 #, fuzzy msgid "Lower Window" msgstr "Windows" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "ਵਿੰਡੋ ਨੂੰ ਹੋਰ ਵਿੰਡੋ ਦੇ ਹੇਠਾਂ ਭੇਜੋ" #: ../metadata/core.xml.in.in.h:50 #, fuzzy msgid "Maximize Window Horizontally" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/core.xml.in.in.h:51 #, fuzzy msgid "Maximize Window Vertically" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "ਵੱਧੋ-ਵੱਧ ਐਕਟਿਵ ਵਿੰਡੋ" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "ਵੱਧੋ-ਵੱਧ ਐਕਟਿਵ ਵਿੰਡੋ ਹਰੀਜ਼ਟਲ" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "ਵੱਧੋ-ਵੱਧ ਐਕਟਿਵ ਵਿੰਡੋ ਵਰਟੀਕਲ" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਘੱਟੋ-ਘੱਟ" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "ਸਧਾਰਨ" #: ../metadata/core.xml.in.in.h:58 #, fuzzy msgid "Number of Desktops" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:59 #, fuzzy msgid "Number of virtual desktops" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "ਵਰਟੀਕਲ ਝਪਕ ਪੀਰੀਅਡ ਦੌਰਾਨ ਹੀ ਸਕਰੀਨ ਅੱਪਡੇਟ ਕਰੋ" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "ਆਉਟਪੁੱਟ" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 #, fuzzy msgid "Ping Delay" msgstr "ਵਕਫਾ" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 #, fuzzy msgid "Raise On Click" msgstr "ਰੇਡੀਓ ਘੜੀ(&R)" #: ../metadata/core.xml.in.in.h:69 #, fuzzy msgid "Raise Window" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "ਚੁਣੇ ਵਿੰਡੋ ਅੰਤਰਾਲ ਬਾਅਦ ਉਭਾਰੋ" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "ਵਿੰਡੋ ਨੂੰ ਹੋਰ ਵਿੰਡੋਜ਼ ਉੱਤੇ ਉਭਾਰੋ" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "ਵਿੰਡੋ ਉਭਾਰੋ, ਜਦੋਂ ਕਲਿੱਕ ਕੀਤਾ ਜਾਵੇ" #: ../metadata/core.xml.in.in.h:73 #, fuzzy msgid "Refresh Rate" msgstr "ਤਾਜ਼ਾ" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "ਹਰੀਜੱਟਲ ਵੁਰਚੁਅਲ ਸਾਈਜ਼ ਲਈ ਸਕਰੀਨ ਸਾਈਜ਼ ਮਲਟੀਪਲਾਇਰ" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "ਵਰਟੀਕਲ ਵੁਰਚੁਅਲ ਸਾਈਜ਼ ਲਈ ਸਕਰੀਨ ਸਾਈਜ਼ ਮਲਟੀਪਲਾਇਰ" #: ../metadata/core.xml.in.in.h:76 #, fuzzy msgid "Show Desktop" msgstr "ਵੇਹੜਾ" #: ../metadata/core.xml.in.in.h:77 #, fuzzy msgid "Slow Animations" msgstr "ਸਾਰੇ ਭਾਗ ਵਿਖਾਓ" #: ../metadata/core.xml.in.in.h:78 #, fuzzy msgid "Smart mode" msgstr "ਸਮਾਰਟ" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "VBlank ਨਾਲ ਸੈਕਰੋਨਾਈਜ਼" #: ../metadata/core.xml.in.in.h:80 #, fuzzy msgid "Texture Compression" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/core.xml.in.in.h:81 #, fuzzy msgid "Texture Filter" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/core.xml.in.in.h:82 #, fuzzy msgid "Texture filtering" msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "ਰੇਟ, ਜਿਸ ਮੁਤਾਬਕ ਸਕਰੀਨ ਨੂੰ ਰੀ-ਡਰਾਅ ਕੀਤਾ ਜਾਵੇ (ਟਾਈਮ/ਸਕਿੰਟ)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਹਰੀਜ਼ਟਲ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਵਰਟੀਕਲ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "ਵਿੰਡੋ ਸ਼ੇਡ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਹਰੀਜੱਟਲ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਵਰਟੀਕਲ ਵੱਧੋ-ਵੱਧ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "ਸਰਗਰਮ ਵਿੰਡੋ ਸ਼ੇਡ ਬਦਲੋ" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "ਹੌਲੀ ਐਨੀਮੇਸ਼ਨ ਲਈ ਟਾਗਲ ਵਰਤੋਂ" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "ਐਕਟਿਵ ਵਿੰਡੋ ਅਣ-ਵੱਧੋ-ਵੱਧ" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "ਪੂਰੀ-ਸਕਰੀਨ ਵਿੰਡੋ ਗ਼ੈਰ-ਡਿਰੈਕਸ਼ਨ" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "ਜਦੋਂ ਸਕਰੀਨ ਟਰਾਂਸਫਰਮ ਕੀਤੀ ਜਾਵੇ ਤਾਂ ਹਲਕੀ ਲਾਈਟ ਵਰਤੋਂ" #: ../metadata/core.xml.in.in.h:97 #, fuzzy msgid "Vertical Virtual Size" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "ਵਿੰਡੋ ਮੇਨੂ ਬਟਨ ਬਾਈਡਿੰਗ" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "ਵਿੰਡੋ ਮੇਨੂ ਕੀ ਬਾਈਡਿੰਗ" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 #, fuzzy msgid "Acceleration" msgstr "3D ਪ੍ਰਵੇਸ਼ਕ:" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "ਚਿੱਤਰ ਅਡਜੱਸਟ ਕਰੋ" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "ਉੱਤੇ ਚਿੱਤਰ ਨੂੰ ਘੁੰਮਾਉਣ ਲਈ ਅਡਜੱਸਟ ਕਰੋ" #: ../metadata/cube.xml.in.h:4 #, fuzzy msgid "Advance to next slide" msgstr "ਤਕਨੀਕੀ ਚੋਣ" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "ਸਕਾਈਡੋਮ ਐਨੀਮੇਟ" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "ਜਦੋਂ ਕਿਊਬ ਘੁੰਮੇ ਤਾਂ ਸਕਾਈਡੋਮ ਐਨੀਮੇਟ ਕਰੋ" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 #, fuzzy msgid "Automatic" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "ਕਿਊਬ ਦੇ ਉੱਤੇ ਅਤੇ ਤਲ ਸਾਈਡਾਂ ਦਾ ਰੰਗ" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "ਤਲ ਰੰਗ -ਸਕਾਈਡੋਮੇ ਰੋਕਣ ਲਈ-ਫਾਲਬੈਕ ਗਰੇਡੀਐਂਟ ਵਾਸਤੇ ਵਰਤਣ ਲਈ ਰੰਗ" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "ਟਾਪ ਰੰਗ -ਸਕਾਈਡੋਮੇ ਰੋਕਣ ਲਈ-ਫਾਲਬੈਕ ਗਰੇਡੀਐਂਟ ਵਾਸਤੇ ਵਰਤਣ ਲਈ ਰੰਗ" #: ../metadata/cube.xml.in.h:13 #, fuzzy msgid "Cube Caps" msgstr "ਰੰਗ" #: ../metadata/cube.xml.in.h:14 #, fuzzy msgid "Cube Color" msgstr "ਰੰਗ" #: ../metadata/cube.xml.in.h:15 #, fuzzy msgid "Desktop Cube" msgstr "ਵੇਹੜਾ" #: ../metadata/cube.xml.in.h:16 #, fuzzy msgid "Fold Acceleration" msgstr "3D ਪ੍ਰਵੇਸ਼ਕ:" #: ../metadata/cube.xml.in.h:17 #, fuzzy msgid "Fold Speed" msgstr "ਚੁਣੇ" #: ../metadata/cube.xml.in.h:18 #, fuzzy msgid "Fold Timestep" msgstr "ਜਾਂਚ" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "ਵੱਧ ਕੁਆਲਟੀ ਸਕੇਲਿੰਗ ਲਈ ਜਦੋਂ ਵੀ ਸੰਭਵ ਹੋਵੇ mip-ਮੈਪ ਬਣਾਓ" #: ../metadata/cube.xml.in.h:20 #, fuzzy msgid "Go back to previous slide" msgstr "ਪਿਛਲਾ ਕਰਨਲ" #: ../metadata/cube.xml.in.h:21 #, fuzzy msgid "Image files" msgstr "ਅਸਫਲ ਫਾਇਲਾਂ" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "ਸਕਾਈਡੋਮ ਲਈ ਟੈਕਸਟ ਵਾਂਗ ਵਰਤਣ ਲਈ ਚਿੱਤਰ" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "ਘਣ ਪਾਰਦਰਸਤਾ ਤਾਂ ਹੀ ਸ਼ੁਰੂ ਕਰੋ, ਜੇ ਘੁੰਮਾਉਣਾ ਮਾਊਂਸ ਨਾਕਲ ਹੋਵੇ।" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "ਕਿਊਬ ਅੰਦਰ" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "ਕਿਊਬ ਅੰਦਰ" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "PNG ਅਤੇ SVG ਫਾਇਲਾਂ ਦੀ ਲਿਸਟ, ਜੋ ਕਿ ਕਿਊਬ ਦੇ ਟਾਪ ਫੇਸ ਉੱਤੇ ਰੈਂਡਰ ਕੀਤੇ ਜਾਣੇ ਹਨ" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "ਮਲਟੀ ਆਉਟਪੁੱਟ ਮੋਡ" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "ਮਲਟੀਪਲ ਕਿਊਬ" #: ../metadata/cube.xml.in.h:30 #, fuzzy msgid "Next Slide" msgstr "ਨਵਾਂ ਅਕਾਰ" #: ../metadata/cube.xml.in.h:31 #, fuzzy msgid "One big cube" msgstr "ਵੱਡੇ ਕਿਊਬ ਉੱਤੇ" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "ਘੁੰਮਾਉਣ ਦੌਰਾਨ ਧੁੰਦਲਾਪਨ" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "ਜਦੋਂ ਨਾ ਘੁੰਮੇ ਤਾਂ ਧੁੰਦਲਾਪਨ" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਦਾ ਧੁੰਦਲਾਪਨ, ਜਦੋਂ ਘੁੰਮਦਾ ਹੋਵੇ" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "ਜਦੋਂ ਘੁੰਮਦਾ ਨਾ ਹੋਵੇ ਤਾਂ ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਧੁੰਦਲਾਪਨ" #: ../metadata/cube.xml.in.h:36 #, fuzzy msgid "Place windows on cube" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/cube.xml.in.h:37 #, fuzzy msgid "Prev Slide" msgstr "ਪਿਛਲਾ ਕਰਨਲ" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "ਰੈਂਡਮ ਸਕਾਈਡੋਮ" #: ../metadata/cube.xml.in.h:39 #, fuzzy msgid "Scale image" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "ਚਿੱਤਰਾਂ ਨੂੰ ਕਿਊਬ ਦਾ ਉੱਤੇ ਫੇਸ ਢੱਕਣ ਲਈ ਸਕੇਲ ਕਰੋ" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "ਚੁਣੋ ਕਿ ਘਣ ਨੂੰ ਕਿਵੇਂ ਵੇਖਾਇਆ ਜਾਵੇ, ਜਦੋਂ ਮਲਟੀਪਲ ਆਉਟਪੁੱਟ ਜੰਤਰ ਵਰਤੇ ਜਾਣ।" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "ਸਕਾਈਡੋਮ" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "ਸਕਾਈਡੋਮੇ ਗਰੇਡੀਐਂਟ ਅੰਤ ਰੰਗ" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "ਸਕਾਈਡੋਮੇ ਗਰੇਡੀਐਂਟ ਸ਼ੁਰੂ ਰੰਗ" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "ਸਕਾਈਡੋਮ ਚਿੱਤਰ" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 #, fuzzy msgid "Speed" msgstr "ਚੁਣੇ" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 #, fuzzy msgid "Timestep" msgstr "ਜਾਂਚ" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "ਕੇਵਲ ਮਾਊਂਸ ਘੁੰਮਾਉਣ ਨਾਲ ਹੀ ਪਾਰਦਰਸ਼ੀ" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "ਅਣ-ਫੋਲਡ" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "ਕਿਊਬ ਅਣਫੋਲਡ" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Dbus ਕੰਟਰੋਲ ਬੈਕਐਂਡ" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "ਸਜਾਵਟ ਟੈਕਸਟ ਲਈ ਤਿਆਰ ਕਰਨ ਲਈ ਮਿਪਮੈਪ ਮਨਜ਼ੂਰ" #: ../metadata/decoration.xml.in.h:2 #, fuzzy msgid "Command" msgstr "ਕਮਾਂਡ: " #: ../metadata/decoration.xml.in.h:3 #, fuzzy msgid "Decoration windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "ਸਜਾਵਟ ਕਮਾਂਡ ਲਾਇਨ, ਜੋ ਕਿ ਕਿਸੇ ਸਜਾਵਟ ਨਾ ਚੱਲਣ ਦੀ ਹਾਲਤ ਵਿੱਚ ਚਲਾਈ ਜਾਵੇ" #: ../metadata/decoration.xml.in.h:5 #, fuzzy msgid "Drop shadow X offset" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:6 #, fuzzy msgid "Drop shadow Y offset" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:7 #, fuzzy msgid "Drop shadow color" msgstr "ਅਰਧ-ਵਿਆਸ" #: ../metadata/decoration.xml.in.h:8 #, fuzzy msgid "Drop shadow opacity" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:9 #, fuzzy msgid "Drop shadow radius" msgstr "ਅਰਧ-ਵਿਆਸ" #: ../metadata/decoration.xml.in.h:11 #, fuzzy msgid "Shadow Color" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/decoration.xml.in.h:12 #, fuzzy msgid "Shadow Offset X" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:13 #, fuzzy msgid "Shadow Offset Y" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:14 #, fuzzy msgid "Shadow Opacity" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/decoration.xml.in.h:15 #, fuzzy msgid "Shadow Radius" msgstr "ਅਰਧ-ਵਿਆਸ" #: ../metadata/decoration.xml.in.h:16 #, fuzzy msgid "Shadow windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/decoration.xml.in.h:17 #, fuzzy msgid "Window Decoration" msgstr "ਕੋਈ ਵੇਰਵਾ ਨਹੀਂ" #: ../metadata/decoration.xml.in.h:18 #, fuzzy msgid "Window decorations" msgstr "ypbind ਚੋਣ" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "ਵਿੰਡੋ, ਜਿਸ ਦੀ ਸਜਾਵਟ ਕਰਨੀ ਹੈ" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "ਵਿੰਡੋ, ਜਿਸ ਦੀ ਸ਼ੈਡੋ ਹੋਵੇ" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 #, fuzzy msgid "Constant speed" msgstr "ਜਾਂਚ" #: ../metadata/fade.xml.in.h:4 #, fuzzy msgid "Constant time" msgstr "ਸ਼ਾਮਲ" #: ../metadata/fade.xml.in.h:5 #, fuzzy msgid "Dim Unresponsive Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 #, fuzzy msgid "Fade Mode" msgstr "ਮੌਕੇ ਤੇ" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "ਘੱਟੋ-ਘੱਟ/ਖੋਲ੍ਹਣ/ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਫੇਡ ਆਨ" #: ../metadata/fade.xml.in.h:9 #, fuzzy msgid "Fade Speed" msgstr "ਚੁਣੇ" #: ../metadata/fade.xml.in.h:10 #, fuzzy msgid "Fade Time" msgstr "ਮੌਕੇ ਤੇ" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "ਵਿੰਡੋ ਘੱਟੋ-ਘੱਟ/ਖੋਲ੍ਹਣ/ਬੰਦ ਕਰਨ ਦੇ ਈਵੈਂਟ ਸਮੇਂ ਫੇਡ ਪਰਭਾਵ" #: ../metadata/fade.xml.in.h:12 #, fuzzy msgid "Fade effect on system beep" msgstr "ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "ਜਦੋਂ ਮੈਪਿੰਗ ਹੋਵੇ ਤਾਂ ਵਿੰਡੋ ਫੇਡ ਇਨ ਅਤੇ ਜਦੋਂ ਅਣ-ਮੈਪ ਹੋਵੇ ਤਾਂ ਵਿੰਡ ਫੇਡ ਆਉਟ" #: ../metadata/fade.xml.in.h:14 #, fuzzy msgid "Fade windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/fade.xml.in.h:15 #, fuzzy msgid "Fading Windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/fade.xml.in.h:16 #, fuzzy msgid "Fullscreen Visual Bell" msgstr "ਟੱਚ-ਸਕਰੀਨ" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "ਸਿਸਟਮ ਬੀਪ ਉੱਤੇ ਪੂਰੀ ਸਕਰੀਨ ਫੇਡ ਪਰਭਾਵ" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "ਦਿੱਖ ਬਿੱਲ" #: ../metadata/fade.xml.in.h:23 #, fuzzy msgid "Window fade mode" msgstr "Windows" #: ../metadata/fade.xml.in.h:24 #, fuzzy msgid "Window fade speed in \"Constant speed\" mode" msgstr "ਵਿੰਡੋਜ਼, ਜੋ ਕਿ ਸਕੇਲ ਮੋਡ 'ਚ ਸਕੇਲ ਕਰਨੀਆਂ ਹਨ" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਫੇਡ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/fs.xml.in.h:1 #, fuzzy msgid "Mount Point" msgstr "ਸੰਪਰਕ ਸ਼ਾਮਿਲ" #: ../metadata/fs.xml.in.h:2 #, fuzzy msgid "Mount point" msgstr "ਸੰਪਰਕ ਸ਼ਾਮਿਲ" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "ਯੂਜ਼ਰ-ਸਪੇਸ ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "ਯੂਜ਼ਰ-ਸਪੇਸ ਫਾਇਲ ਸਿਸਟਮ" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "GConf ਕੰਟਰੋਲ ਬੈਕਐਂਡ" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "GLib ਮੇਨ ਲੂਪ ਸਹਿਯੋਗ" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "ਇੱਕ ਟਰਮੀਨਲ ਖੋਲ੍ਹੋ" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 #, fuzzy msgid "Run Dialog" msgstr "ਟੋਨ ਡਾਇਲ(&T)" #: ../metadata/gnomecompat.xml.in.h:6 #, fuzzy msgid "Run terminal command" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/gnomecompat.xml.in.h:7 #, fuzzy msgid "Screenshot command line" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/gnomecompat.xml.in.h:8 #, fuzzy msgid "Show Main Menu" msgstr "ਬੂਟ ਸੂਚੀ ਵੇਖਾਓ(&S)" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "ਐਪਲੀਕੇਸ਼ਨ ਚਲਾਓ ਡਾਈਲਾਗ ਵੇਖੋ" #: ../metadata/gnomecompat.xml.in.h:10 #, fuzzy msgid "Show the main menu" msgstr "ਬੂਟ ਸੂਚੀ ਵੇਖਾਓ(&S)" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "ਇੱਕ ਸਕਰੀਨ-ਸ਼ਾਟ ਲਵੋ" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "ਇੱਕ ਵਿੰਡੋ ਦਾ ਇੱਕ ਸਕਰੀਨ-ਸ਼ਾਟ ਲਵੋ" #: ../metadata/gnomecompat.xml.in.h:13 #, fuzzy msgid "Terminal command line" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "ਵਿੰਡੋ ਸਕਰੀਨ-ਸ਼ਾਟ ਕਮਾਂਡ ਲਾਈਨ" #: ../metadata/ini.xml.in.h:1 #, fuzzy msgid "Ini" msgstr "ਕੋਈ ਲਾਗ ਨਾ ਕਰੋ" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Ini ਫਲੈਟ ਫਾਇਲ ਬੈਕਐਂਡ" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "ਫਾਇਲ ਬਦਲਣ ਨੋਟੀਫਿਕੇਸ਼ਨ ਪਲੱਗਇਨ" #: ../metadata/inotify.xml.in.h:2 #, fuzzy msgid "Inotify" msgstr "ਕੋਈ ਲਾਗ ਨਾ ਕਰੋ" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Kconfig ਕੰਟਰੋਲ ਬੈਕਐਂਡ" #: ../metadata/minimize.xml.in.h:1 #, fuzzy msgid "Minimize Effect" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:2 #, fuzzy msgid "Minimize Windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:3 #, fuzzy msgid "Minimize speed" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:4 #, fuzzy msgid "Minimize timestep" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "ਸ਼ੇਡ ਵਿਰੋਧ" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "ਸ਼ੇਡ ਵਿਰੋਧ" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "ਵਿੰਡੋ ਟਰਾਂਸਫਰਮ ਕਰੋ, ਜਦੋਂ ਉਹ ਘੱਟੋ-ਘੱਟ ਅਤੇ ਅਣ-ਘੱਟੋ-ਘੱਟ ਹੋਣ" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਘੱਟੋ-ਘੱਟ ਕਰਨ ਦੌਰਾਨ ਟਰਾਂਸਫਰਮ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/move.xml.in.h:1 #, fuzzy msgid "Constrain Y" msgstr "ਸ਼ਾਮਲ" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "ਵਰਕਸਪੇਸ ਏਰੀਏ ਲਈ ਕਨਸਟਰੇਨ Y ਧੁਰਾ" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "ਸਰਵਰ ਨਾ ਅੱਪਡੇਟ ਨਾ ਕਰੋ-ਵਿੰਡੋ ਦੀ ਸਾਇਡ ਸਥਿਤੀ, ਜਦੋਂ ਕਿ ਘੁੰਮਾਉਣਾ ਮੁੱਕੇ" #: ../metadata/move.xml.in.h:4 #, fuzzy msgid "Initiate Window Move" msgstr "XF86RotateWindows" #: ../metadata/move.xml.in.h:5 #, fuzzy msgid "Lazy Positioning" msgstr "ਮੁੜ-ਆਕਾਰ(&s)" #: ../metadata/move.xml.in.h:6 #, fuzzy msgid "Move Window" msgstr "ਹੇਠਾਂ ਜਾਓ(&D)" #: ../metadata/move.xml.in.h:7 #, fuzzy msgid "Move window" msgstr "ਹੇਠਾਂ ਜਾਓ(&D)" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 #, fuzzy msgid "Opacity" msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #: ../metadata/move.xml.in.h:9 #, fuzzy msgid "Opacity level of moving windows" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "ਜਦੋਂ ਡਰੈਗ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਵੱਧੋ-ਵੱਧ ਵਿੰਡੋਜ਼ ਨੂੰ ਸਨੈਪ-ਆਫ਼ ਅਤੇ ਆਟੋ ਅਣ-ਵੱਧੋ-ਵੱਧ ਕਰੋ" #: ../metadata/move.xml.in.h:11 #, fuzzy msgid "Snapoff maximized windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/move.xml.in.h:12 #, fuzzy msgid "Start moving window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 #, fuzzy msgid "Brightness" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:2 #, fuzzy msgid "Brightness Decrease" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:3 #, fuzzy msgid "Brightness Increase" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:4 #, fuzzy msgid "Brightness Step" msgstr "ਬਰਿੱਜ" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 #, fuzzy msgid "Decrease" msgstr "ਧੁੰਦਲਾਪਨ ਘਟਾਓ" #: ../metadata/obs.xml.in.h:7 #, fuzzy msgid "Increase" msgstr "ਧੁੰਦਲਾਪਨ ਵਧਾਓ" #: ../metadata/obs.xml.in.h:9 #, fuzzy msgid "Opacity Decrease" msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #: ../metadata/obs.xml.in.h:10 #, fuzzy msgid "Opacity Increase" msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "ਧੁੰਦਲਾਪਨ ਸਟੈਪ" #: ../metadata/obs.xml.in.h:12 #, fuzzy msgid "Opacity values for windows" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/obs.xml.in.h:13 #, fuzzy msgid "Opacity, Brightness and Saturation" msgstr "ਘੁੰਮਾਉਣ ਦੌਰਾਨ ਧੁੰਦਲਾਪਨ" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 #, fuzzy msgid "Saturation" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:16 #, fuzzy msgid "Saturation Decrease" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:17 #, fuzzy msgid "Saturation Increase" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:18 #, fuzzy msgid "Saturation Step" msgstr "ਅੰਤਰਾਲ" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 #, fuzzy msgid "Window specific settings" msgstr "ypbind ਚੋਣ" #: ../metadata/obs.xml.in.h:22 #, fuzzy msgid "Window values" msgstr "Windows" #: ../metadata/obs.xml.in.h:23 #, fuzzy msgid "Windows" msgstr "Windows" #: ../metadata/obs.xml.in.h:24 #, fuzzy msgid "Windows that should have a different brightness by default" msgstr "ਵਿੰਡੋ. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਸਥਿਤ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/obs.xml.in.h:25 #, fuzzy msgid "Windows that should have a different opacity by default" msgstr "ਵਿੰਡੋ,. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਪਾਰਦਰਸ਼ੀ ਹੋਵੇ" #: ../metadata/obs.xml.in.h:26 #, fuzzy msgid "Windows that should have a different saturation by default" msgstr "ਵਿੰਡੋ. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਸਥਿਤ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "ਵਿੰਡੋ ਸਥਿਤੀ ਬਦਲਣ ਵਾਸਤੇ ਐਲੋਗਰਥਿਮ" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "ਕੈਸਕੇਡ" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "ਸੈਂਟਰਡ" #: ../metadata/place.xml.in.h:4 #, fuzzy msgid "Fixed Window Placement" msgstr "ਝਰੋਖਾ ਪਰਬੰਧਕ" #: ../metadata/place.xml.in.h:5 #, fuzzy msgid "Force Placement Windows" msgstr "ਫੋਕਸ ਤੋਂ ਬਚਾਅ ਵਿੰਡੋ" #: ../metadata/place.xml.in.h:6 #, fuzzy msgid "Horizontal viewport positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 #, fuzzy msgid "Place Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "ਜਦੋਂ ਮੈਪ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਵਿੰਡੋ ਨੂੰ ਢੁੱਕਵੀਆਂ ਥਾਵਾਂ ਉੱਤੇ ਰੱਖੋ" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "ਸਥਿਤੀ ਰੱਖਣ ਮੋਡ" #: ../metadata/place.xml.in.h:15 #, fuzzy msgid "Positioned windows" msgstr "ਮੁੜ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "ਰੈਂਡਮ" #: ../metadata/place.xml.in.h:17 #, fuzzy msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "ਚੁਣੋ, ਜਿੱਥੇ ਵਿੰਡੋ ਸਕੇਲ ਕਰਨੀ ਹੈ, ਜਦੋਂ ਕਿ ਕਈ ਆਉਟਪੁੱਟ ਜੰਤਰ ਚੁਣੇ ਜਾਂਦੇ ਹਨ।" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "ਸਮਾਰਟ" #: ../metadata/place.xml.in.h:19 #, fuzzy msgid "Use active output device" msgstr "ਸਭ ਆਉਟਪੁੱਟ ਜੰਤਰਾਂ ਉੱਤੇ" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 #, fuzzy msgid "Vertical viewport positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:23 #, fuzzy msgid "Viewport positioned windows" msgstr "ਮੁੜ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:24 #, fuzzy msgid "Window placement workarounds" msgstr "ypbind ਚੋਣ" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "ਵਿੰਡੋ. ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਸਥਿਤ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਖਾਸ ਵਿਊਪੋਰਟ ਵਿੱਚ ਰੱਖੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 #, fuzzy msgid "Windows with fixed positions" msgstr "ypbind ਚੋਣ" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 #, fuzzy msgid "Workarounds" msgstr "ਵਰਕਸਮੂਹ(&W)" #: ../metadata/place.xml.in.h:31 #, fuzzy msgid "X Positions" msgstr "ਮੁੜ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:32 #, fuzzy msgid "X Viewport Positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "X ਸਥਿਤੀ ਮੁੱਲ" #: ../metadata/place.xml.in.h:34 #, fuzzy msgid "Y Positions" msgstr "ਮੁੜ-ਆਕਾਰ(&s)" #: ../metadata/place.xml.in.h:35 #, fuzzy msgid "Y Viewport Positions" msgstr "ਫ਼ਰਜ਼ੀ ਜੰਤਰ" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Y ਸਥਿਤੀ ਮੁੱਲ" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Png ਚਿੱਤਰ ਲੋਡਰ" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Regex ਮੇਲ ਕਰੋ" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Regex ਵਿੰਡੋ ਮੇਲ ਕਰੋ" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 #, fuzzy msgid "Border Color" msgstr "ਰੰਗ" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "ਬਾਰਡਰ ਰੰਗ, ਜੋ ਕਿ ਆਉਟਲਾਈਨ ਅਤੇ ਚਤੁਰਭੁਜ ਰੀਸਾਇਜ਼ ਮੋਡ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "ਡਿਫਾਲਟ ਰੀਸਾਇਜ਼ ਮੋਡ" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "ਵਿੰਡੋ ਮੁੜ-ਆਕਾਰ ਕਰਨ ਦੌਰਾਨ ਵਰਤਣ ਲਈ ਡਿਫਾਲਟ ਮੋਡ" #: ../metadata/resize.xml.in.h:6 #, fuzzy msgid "Fill Color" msgstr "ਰੰਗ" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "ਚਤੁਰਭੁਜ ਮੁੜ-ਆਕਾਰ ਮੋਡ ਲਈ ਭਰਨ ਵਾਸਤੇ ਰੰਗ" #: ../metadata/resize.xml.in.h:8 #, fuzzy msgid "Initiate Normal Window Resize" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:9 #, fuzzy msgid "Initiate Outline Window Resize" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:10 #, fuzzy msgid "Initiate Rectangle Window Resize" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:11 #, fuzzy msgid "Initiate Stretch Window Resize" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:12 #, fuzzy msgid "Initiate Window Resize" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/resize.xml.in.h:14 #, fuzzy msgid "Normal Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:15 #, fuzzy msgid "Outline" msgstr "ਰੰਗ" #: ../metadata/resize.xml.in.h:16 #, fuzzy msgid "Outline Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "ਚਤੁਰਭੁਜ" #: ../metadata/resize.xml.in.h:18 #, fuzzy msgid "Rectangle Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:19 #, fuzzy msgid "Resize Window" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:20 #, fuzzy msgid "Resize window" msgstr "ਮੁੜ-ਆਕਾਰ(&s)" #: ../metadata/resize.xml.in.h:21 #, fuzzy msgid "Start resizing window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:22 #, fuzzy msgid "Start resizing window by stretching it" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:23 #, fuzzy msgid "Start resizing window normally" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:24 #, fuzzy msgid "Start resizing window with outline" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:25 #, fuzzy msgid "Start resizing window with rectangle" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "ਖਿੱਚੋ" #: ../metadata/resize.xml.in.h:27 #, fuzzy msgid "Stretch Resize Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਨਾਰਮਲ ਮੁੜ-ਸਾਈਜ਼ ਲਈ ਵਰਤਣੀ ਹੈ" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਆਉਟਲਾਈਨ ਮੁੜ-ਸਾਈਜ਼ ਲਈ ਵਰਤਣਾ ਹੈ" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਆਉਟਲਾਈਨ ਮੁੜ-ਸਾਈਜ਼ ਲਈ ਵਰਤਣਾ ਹੈ" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਮੁੜ-ਸਾਈਜ਼ ਤਾਣੀ ਜਾਣ ਲਈ ਵਰਤੀ ਜਾਵੇਗੀ" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "ਕੋਨਾ ਫਲਿਪ DnD" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "ਕੋਨਾ ਫਲਿ ਚਾਲ" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "ਕੋਨਾ ਫਲਿਪ ਪੁਆਇੰਟਰ" #: ../metadata/rotate.xml.in.h:6 #, fuzzy msgid "Flip Time" msgstr "ਮੌਕੇ ਤੇ" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "ਖੱਬੇ ਵੇਖਣ-ਪੋਰਟ ਲਈ ਫਲਿੱਪ ਅਤੇ ਸਮੇਟ ਪੁਆਇੰਟਰ" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "ਅੱਗੇ ਵੇਖੋ-ਪੋਰਟ ਲਈ ਫਲਿਪ ਕਰੋ, ਜਦੋਂ ਕਿ ਡਰੈਗ ਕੀਤਾ ਆਬਜੈਕਟ ਸਕਰੀਨ ਕੋਨੇ ਉੱਤੇ ਜਾਵੇ" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "ਅੱਗੇ ਵੇਖੋ-ਪੋਰਟ ਲਈ ਫਲਿਪ ਕਰੋ, ਜਦੋਂ ਕਿ ਪੁਆਇੰਟਰ ਸਕਰੀਨ ਕੋਨੇ ਉੱਤੇ ਜਾਵੇ" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "ਅੱਗੇ ਵੇਖੋ-ਪੋਰਟ ਲਈ ਫਲਿਪ ਕਰੋ, ਜਦੋਂ ਕਿ ਵਿੰਡੋ ਸਕਰੀਨ ਕੋਨੇ ਉੱਤੇ ਜਾਵੇ" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "ਸੱਜਾ ਵੇਖਣ-ਪੋਰਟ ਲਈ ਝਟਕੋ ਅਤੇ ਪੁਆਇੰਟਰ ਸਮੇਟੋ" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "ਪੁਆਇੰਟਰ ਚਾਲ ਲਈ ਉਲਟ Y ਧੁਰਾ" #: ../metadata/rotate.xml.in.h:14 #, fuzzy msgid "Pointer Invert Y" msgstr "%1 ਲਈ ਸੂਚਕ" #: ../metadata/rotate.xml.in.h:15 #, fuzzy msgid "Pointer Sensitivity" msgstr "ਪਰਿੰਟਰ ਵੇਰਵਾ(&D)" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "ਘੁੰਮਾਉਣ ਉੱਤੇ ਉਭਾਰੋ" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "ਜਦੋਂ ਘੁੰਮਾਈ ਜਾਵੇ ਤਾਂ ਵਿੰਡੋ ਉਭਾਰੋ" #: ../metadata/rotate.xml.in.h:18 #, fuzzy msgid "Rotate Cube" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:19 #, fuzzy msgid "Rotate Flip Left" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:20 #, fuzzy msgid "Rotate Flip Right" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:21 #, fuzzy msgid "Rotate Left" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:22 #, fuzzy msgid "Rotate Left with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:23 #, fuzzy msgid "Rotate Right" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:24 #, fuzzy msgid "Rotate Right with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:25 #, fuzzy msgid "Rotate To" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:26 #, fuzzy msgid "Rotate To Face 1" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:27 #, fuzzy msgid "Rotate To Face 1 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:28 #, fuzzy msgid "Rotate To Face 10" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:29 #, fuzzy msgid "Rotate To Face 10 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:30 #, fuzzy msgid "Rotate To Face 11" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:31 #, fuzzy msgid "Rotate To Face 11 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:32 #, fuzzy msgid "Rotate To Face 12" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:33 #, fuzzy msgid "Rotate To Face 12 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:34 #, fuzzy msgid "Rotate To Face 2" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:35 #, fuzzy msgid "Rotate To Face 2 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:36 #, fuzzy msgid "Rotate To Face 3" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:37 #, fuzzy msgid "Rotate To Face 3 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:38 #, fuzzy msgid "Rotate To Face 4" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:39 #, fuzzy msgid "Rotate To Face 4 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:40 #, fuzzy msgid "Rotate To Face 5" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:41 #, fuzzy msgid "Rotate To Face 5 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:42 #, fuzzy msgid "Rotate To Face 6" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:43 #, fuzzy msgid "Rotate To Face 6 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:44 #, fuzzy msgid "Rotate To Face 7" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:45 #, fuzzy msgid "Rotate To Face 7 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:46 #, fuzzy msgid "Rotate To Face 8" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:47 #, fuzzy msgid "Rotate To Face 8 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:48 #, fuzzy msgid "Rotate To Face 9" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:49 #, fuzzy msgid "Rotate To Face 9 with Window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:50 #, fuzzy msgid "Rotate cube" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:51 #, fuzzy msgid "Rotate desktop cube" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:52 #, fuzzy msgid "Rotate left" msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #: ../metadata/rotate.xml.in.h:53 #, fuzzy msgid "Rotate left and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:54 #, fuzzy msgid "Rotate right" msgstr "ਸੱਜੇ" #: ../metadata/rotate.xml.in.h:55 #, fuzzy msgid "Rotate right and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:56 #, fuzzy msgid "Rotate to cube face" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:57 #, fuzzy msgid "Rotate to cube face with window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:58 #, fuzzy msgid "Rotate to face 1" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:59 #, fuzzy msgid "Rotate to face 1 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:60 #, fuzzy msgid "Rotate to face 10" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:61 #, fuzzy msgid "Rotate to face 10 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:62 #, fuzzy msgid "Rotate to face 11" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:63 #, fuzzy msgid "Rotate to face 11 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:64 #, fuzzy msgid "Rotate to face 12" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:65 #, fuzzy msgid "Rotate to face 12 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:66 #, fuzzy msgid "Rotate to face 2" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:67 #, fuzzy msgid "Rotate to face 2 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:68 #, fuzzy msgid "Rotate to face 3" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:69 #, fuzzy msgid "Rotate to face 3 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:70 #, fuzzy msgid "Rotate to face 4" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:71 #, fuzzy msgid "Rotate to face 4 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:72 #, fuzzy msgid "Rotate to face 5" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:73 #, fuzzy msgid "Rotate to face 5 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:74 #, fuzzy msgid "Rotate to face 6" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:75 #, fuzzy msgid "Rotate to face 6 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:76 #, fuzzy msgid "Rotate to face 7" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:77 #, fuzzy msgid "Rotate to face 7 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:78 #, fuzzy msgid "Rotate to face 8" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:79 #, fuzzy msgid "Rotate to face 8 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:80 #, fuzzy msgid "Rotate to face 9" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:81 #, fuzzy msgid "Rotate to face 9 and bring active window along" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:82 #, fuzzy msgid "Rotate to viewport" msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #: ../metadata/rotate.xml.in.h:83 #, fuzzy msgid "Rotate window" msgstr "XF86RotateWindows" #: ../metadata/rotate.xml.in.h:84 #, fuzzy msgid "Rotate with window" msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/rotate.xml.in.h:85 #, fuzzy msgid "Rotation Acceleration" msgstr "3D ਪ੍ਰਵੇਸ਼ਕ:" #: ../metadata/rotate.xml.in.h:86 #, fuzzy msgid "Rotation Speed" msgstr "ਜਾਂਚ" #: ../metadata/rotate.xml.in.h:87 #, fuzzy msgid "Rotation Timestep" msgstr "ਜਾਂਚ" #: ../metadata/rotate.xml.in.h:88 #, fuzzy msgid "Rotation Zoom" msgstr "ਜਾਂਚ" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "ਪੁਆਇੰਟਰ ਚਾਲ ਲਈ ਸੰਵੇਦਨਸ਼ੀਲਤਾ" #: ../metadata/rotate.xml.in.h:90 #, fuzzy msgid "Snap Cube Rotation to Bottom Face" msgstr "ਘਣ ਘੁੰਮਾਉਣ ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "ਘਣ ਘੁੰਮਾਉਣ ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:92 #, fuzzy msgid "Snap To Bottom Face" msgstr "ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "ਟਾਪ ਫੇਸ ਲਈ ਸਨੈਪ" #: ../metadata/rotate.xml.in.h:95 #, fuzzy msgid "Start Rotation" msgstr "ਖੋਜ ਸ਼ੁਰੂ" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "ਫਲਿਪਿਗ ਵੇਖਣ-ਪੋਰਟ ਤੋਂ ਪਹਿਲਾਂ ਟਾਈਮਆਉਟ" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 #, fuzzy msgid "Zoom" msgstr "ਲਾਗਆਉਟ" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "ਫੀਸਦੀ ਵਿੱਚ ਧੁੰਦਲਾਪਨ ਮਾਤਰਾ" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "ਵੱਡਾ" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "ਡੈਸਕਟਾਪ ਵੇਖਣ ਲਈ ਡੈਸਕਟਾਪ ਕਲਿੱਕ ਕਰੋ" #: ../metadata/scale.xml.in.h:9 #, fuzzy msgid "Darken Background" msgstr "ਪਿੱਠਭੂਮੀ" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "ਬੈਕਗਰਾਊਂਡ ਗੂੜ੍ਹਾਪਨ, ਜਦੋਂ ਵਿੰਡੋ ਸਕੇਲ ਕੀਤੀ ਜਾਵੇ" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "ਨਿਸ਼ਾਨ" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "ਜਦੋਂ ਸਕੇਲ ਦੌਰਾਨ ਡੈਸਕਟਾਪ ਕਲਿੱਕ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਡੈਸਕਟਾਪ ਵੇਖੋ ਮੋਡ ਦਿਓ" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "ਹੋਵਰ ਟਾਈਮ" #: ../metadata/scale.xml.in.h:14 #, fuzzy msgid "Initiate Window Picker" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:15 #, fuzzy msgid "Initiate Window Picker For All Windows" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:16 #, fuzzy msgid "Initiate Window Picker For Window Group" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:17 #, fuzzy msgid "Initiate Window Picker For Windows on Current Output" msgstr "ਸ਼ੁਰੂਆਤੀ RAM ਡਿਸਕ" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "ਲੇਆਉਟ ਅਤੇ ਸਭ ਵਿੰਡੋਜ਼ ਲਈ ਟਰਾਸਫਰਮੇਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "ਲੇਆਉਟ ਅਤੇ ਵਿੰਡੋ ਲਈ ਟਰਾਸਫਰਮੇਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "ਵਿੰਡੋ ਲੇਆਉਟ ਅਤੇ ਟਰਾਂਸਫਰਮੇਸ਼ਨ ਸਟਾਰਟ" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "ਮੌਜੂਦਾ ਆਉਟਪੁੱਟ ਉੱਤੇ ਲੇਆਉਟ ਅਤੇ ਸਭ ਵਿੰਡੋਜ਼ ਲਈ ਟਰਾਸਫਰਮੇਸ਼ਨ ਸ਼ੁਰੂ ਕਰੋ" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "ਸਭ ਆਉਟਪੁੱਟ ਜੰਤਰਾਂ ਉੱਤੇ" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "ਮੌਜੂਦਾ ਆਉਟਪੁੱਟ ਜੰਤਰ ਉੱਤੇ" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "ਓਵਰਲੇ ਆਈਕਾਨ" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "ਵਿੰਡੋ ਉੱਤੇ ਇੱਕ ਆਈਕਾਨ ਰੱਖੋ, ਜਦੋਂ ਉਹ ਸਕੇਲ ਕੀਤੇ ਜਾਣ" #: ../metadata/scale.xml.in.h:31 #, fuzzy msgid "Scale" msgstr "ਸੰਭਾਲੋ" #: ../metadata/scale.xml.in.h:32 #, fuzzy msgid "Scale Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/scale.xml.in.h:33 #, fuzzy msgid "Scale speed" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/scale.xml.in.h:34 #, fuzzy msgid "Scale timestep" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/scale.xml.in.h:35 #, fuzzy msgid "Scale windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "ਚੁਣੋ, ਜਿੱਥੇ ਵਿੰਡੋ ਸਕੇਲ ਕਰਨੀ ਹੈ, ਜਦੋਂ ਕਿ ਕਈ ਆਉਟਪੁੱਟ ਜੰਤਰ ਚੁਣੇ ਜਾਂਦੇ ਹਨ।" #: ../metadata/scale.xml.in.h:37 #, fuzzy msgid "Space between windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/scale.xml.in.h:38 #, fuzzy msgid "Spacing" msgstr "ਸਪੇਨ" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "ਸਕੇਲ ਮੋਡ ਖਤਮ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਟਾਈਮ (ms ਵਿੱਚ), ਜਦੋਂ ਕਿ ਹੋਵਰ ਵਿੰਡੋ ਉੱਤੇ ਹੋਵੇ" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "ਵਿੰਡੋਜ਼, ਜੋ ਕਿ ਸਕੇਲ ਮੋਡ 'ਚ ਸਕੇਲ ਕਰਨੀਆਂ ਹਨ" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "ਇਹ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਆਟੋਮੈਟਿਕ ਹੀ ਸਕਰੀਨਸ਼ਾਟ ਖੋਲ੍ਹੋ" #: ../metadata/screenshot.xml.in.h:2 #, fuzzy msgid "Directory" msgstr "ਡਾਇਰੈਕਟਰੀ\n" #: ../metadata/screenshot.xml.in.h:4 #, fuzzy msgid "Initiate rectangle screenshot" msgstr "Init" #: ../metadata/screenshot.xml.in.h:5 #, fuzzy msgid "Launch Application" msgstr "ਇੱਕ ਕਾਰਜ ਚਲਾਓ" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "ਇਹ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਸਕਰੀਨ-ਸ਼ਾਟ ਚਿੱਤਰ ਰੱਖੋ" #: ../metadata/screenshot.xml.in.h:7 #, fuzzy msgid "Screenshot" msgstr "ਸਕਰੀਨ" #: ../metadata/screenshot.xml.in.h:8 #, fuzzy msgid "Screenshot plugin" msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Svg ਚਿੱਤਰ ਲੋਡਰ" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "ਫੀਸਦੀ ਵਿੱਚ ਚਮਕ ਦੀ ਮਾਤਰਾ" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "ਫੀਸਦੀ ਵਿੱਚ ਸੰਤ੍ਰਿਪਤਾ ਦੀ ਮਾਤਰਾ" #: ../metadata/switcher.xml.in.h:4 #, fuzzy msgid "Application Switcher" msgstr "ਕਾਰਜ ਕਰਮ" #: ../metadata/switcher.xml.in.h:5 #, fuzzy msgid "Auto Rotate" msgstr "ਸਵੈ-ਚਾਲਤ" #: ../metadata/switcher.xml.in.h:8 #, fuzzy msgid "Bring To Front" msgstr "ਬੂਟ ਦੌਰਾਨ" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "ਚੁਣੀ ਵਿੰਡੋ ਅੱਗੇ ਲਿਆਵੋ" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "ਜਦੋਂ ਵਿੰਡੋ ਨੂੰ ਸਵਿੱਚ ਕੀਤਾ ਜਾਵੇ ਤਾਂ ਦੂਰੀ ਡੈਸਕਟਾਪ ਨੂੰ ਜ਼ੂਮ ਆਉਟ ਕੀਤਾ ਜਾਵੇਗਾ" #: ../metadata/switcher.xml.in.h:12 #, fuzzy msgid "Icon" msgstr "ਆਈਕਾਨ" #: ../metadata/switcher.xml.in.h:13 #, fuzzy msgid "Minimized" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/switcher.xml.in.h:15 #, fuzzy msgid "Next Panel" msgstr "ਵੇਹੜਾ" #: ../metadata/switcher.xml.in.h:16 #, fuzzy msgid "Next window" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:17 #, fuzzy msgid "Next window (All windows)" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:18 #, fuzzy msgid "Next window (No popup)" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "ਪੋਪਅੱਪ ਸਵਿੱਚ, ਜੇ ਨਾ ਦਿੱਸੇ ਅਤੇ ਅਗਲੀ ਵਿੰਡੋ ਚੁਣੋ" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "ਪੋਪ-ਅੱਪ ਸਵਿੱਚਰ, ਜੇ ਉਪਲੱਬਧ ਨਾ ਹੋਵੇ ਅਤੇ ਸਭ ਵਿੰਡੋ ਵਿੱਚੋਂ ਅਗਲੀ ਵਿੰਡੋ ਚੁਣੋ" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "ਪੋਪਅੱਪ ਸਵਿੱਚਰ, ਜੇ ਉਪਲੱਬਧ ਨਾ ਹੋਵੇ ਅਤੇ ਪਿਛਲੀ ਵਿੰਡੋ ਚੁਣੇ" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "ਪੋਪਅੱਪ ਸਵਿੱਚਰ, ਜੇ ਉਪਲੱਬਧ ਨਾ ਹੋਵੇ ਅਤੇ ਸਭ ਵਿੰਡੋ ਵਿੱਚੋਂ ਪਿਛਲੀ ਚੁਣੇ" #: ../metadata/switcher.xml.in.h:24 #, fuzzy msgid "Prev Panel" msgstr "ਪਿਛਲਾ ਕਰਨਲ" #: ../metadata/switcher.xml.in.h:25 #, fuzzy msgid "Prev window" msgstr "Windows" #: ../metadata/switcher.xml.in.h:26 #, fuzzy msgid "Prev window (All windows)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:27 #, fuzzy msgid "Prev window (No popup)" msgstr "Windows" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "ਚੁਣੀ ਵਿੰਡੋ ਨੂੰ ਘੁੰਮਾਓ, ਜਦੋਂ ਕਿ ਸਵਿੱਚ ਕਰਨਾ ਹੋਵੇ" #: ../metadata/switcher.xml.in.h:30 #, fuzzy msgid "Select next panel type window." msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "ਪੋਪਅੱਪ ਵਿੰਡੋ ਵੇਖਾਏ ਬਿਨਾਂ ਹੀ ਅਗਲੀ ਵਿੰਡੋ ਚੁਣੋ" #: ../metadata/switcher.xml.in.h:32 #, fuzzy msgid "Select previous panel type window." msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "ਪੋਪਅੱਪ ਵਿੰਡੋ ਵੇਖਾਏ ਬਿਨਾਂ ਹੀ ਪਿਛਲੀ ਵਿੰਡੋ ਚੁਣੋ" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "ਥੰਮਨੇਲ ਲਈ ਅੱਗੇ ਆਈਕਾਨ ਵੇਖੋ" #: ../metadata/switcher.xml.in.h:35 #, fuzzy msgid "Show minimized windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/switcher.xml.in.h:37 #, fuzzy msgid "Switcher speed" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/switcher.xml.in.h:38 #, fuzzy msgid "Switcher timestep" msgstr "ਸਥਾਨਕ ਸਮਾਂ" #: ../metadata/switcher.xml.in.h:39 #, fuzzy msgid "Switcher windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਸਵਿੱਚਰ ਵਿੱਚ ਵੇਖਾਈਆਂ ਜਾਣ" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "YV12 ਕਲਰਸਪੇਸ ਸਹਿਯੋਗ ਦਿੰਦੀ ਹੈ" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "ਵੀਡਿਓ ਪਲੇਅਬੈਕ" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "ਵੀਡਿਓ ਪਲੇਅਬੈਕ" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "YV12 ਕਲਰਸਪੇਸ/" #: ../metadata/water.xml.in.h:1 #, fuzzy msgid "Add line" msgstr "ਸਬੰਧ ਸ਼ਾਮਲ(&A)" #: ../metadata/water.xml.in.h:2 #, fuzzy msgid "Add point" msgstr "ਸੰਪਰਕ ਸ਼ਾਮਿਲ" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "ਵੱਖ ਵੱਖ ਡੈਸਕਟਾਪ ਐਕਸ਼ਨਾਂ ਲਈ ਪਾਣੀ ਪਰਭਾਵ ਸ਼ਾਮਲ ਕਰੋ" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "ਹਰੇਕ ਕਣੀ ਵਿੱਚ ਅੰਤਰ (ਮਿਲੀਸਕਿੰਟ ਵਿੱਚ)" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "ਪੁਆਇੰਟਰ ਪਾਣੀ ਪਰਭਾਵ ਯੋਗ ਕਰੋ" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "ਲਾਈਨ" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "ਆਫਸੈੱਟ ਸਕੇਲ" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "ਬਿੰਦੂ" #: ../metadata/water.xml.in.h:10 #, fuzzy msgid "Rain Delay" msgstr "ਵਕਫਾ" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "ਟਾਇਟਲ ਵੇਵ" #: ../metadata/water.xml.in.h:12 #, fuzzy msgid "Toggle rain" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:13 #, fuzzy msgid "Toggle rain effect" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:14 #, fuzzy msgid "Toggle wiper" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:15 #, fuzzy msgid "Toggle wiper effect" msgstr "ਟੋਕਨ ਰਿੰਗ" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "ਪਾਣੀ ਪਰਭਾਵ" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "ਪਾਣੀ ਆਫਸੈੱਟ ਸਕੇਲ" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "ਵਿੰਡੋ ਟਾਇਟਲ ਤੋਂ ਵੇਵ ਪਰਭਾਵ" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "ਫੋਕਸ ਪਰਭਾਵ" #: ../metadata/wobbly.xml.in.h:2 #, fuzzy msgid "Focus Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:3 #, fuzzy msgid "Focus Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:4 #, fuzzy msgid "Friction" msgstr "ਕਾਰਵਾਈ" #: ../metadata/wobbly.xml.in.h:5 #, fuzzy msgid "Grab Windows" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:6 #, fuzzy msgid "Grid Resolution" msgstr "ਰੈਜ਼ੋਲੇਸ਼ਨ" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "ਉਲਟ ਵਿੰਡੋ ਸਨੈਪਿੰਗ" #: ../metadata/wobbly.xml.in.h:8 #, fuzzy msgid "Make window shiver" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:9 #, fuzzy msgid "Map Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:10 #, fuzzy msgid "Map Window Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:11 #, fuzzy msgid "Map Windows" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:12 #, fuzzy msgid "Maximize Effect" msgstr "Windows" #: ../metadata/wobbly.xml.in.h:13 #, fuzzy msgid "Minimum Grid Size" msgstr "ਵੱਧ-ਤੋਂ-ਵੱਧ ਅਕਰ" #: ../metadata/wobbly.xml.in.h:14 #, fuzzy msgid "Minimum Vertex Grid Size" msgstr "ਵੱਧ-ਤੋਂ-ਵੱਧ ਅਕਰ" #: ../metadata/wobbly.xml.in.h:15 #, fuzzy msgid "Move Windows" msgstr "ਹੇਠਾਂ ਜਾਓ(&D)" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 #, fuzzy msgid "Shiver" msgstr "ਡਰਾਇਵਰ" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "ਉਲਟ ਕੀਤਾ ਸਨੈਪ" #: ../metadata/wobbly.xml.in.h:19 #, fuzzy msgid "Snap windows" msgstr "Window&s ਸਮੇਟੋ" #: ../metadata/wobbly.xml.in.h:20 #, fuzzy msgid "Spring Friction" msgstr "ਕਾਰਵਾਈ" #: ../metadata/wobbly.xml.in.h:21 #, fuzzy msgid "Spring K" msgstr "ਸਟੀਪਿੰਗ" #: ../metadata/wobbly.xml.in.h:22 #, fuzzy msgid "Spring Konstant" msgstr "ਸਟੀਪਿੰਗ" #: ../metadata/wobbly.xml.in.h:23 #, fuzzy msgid "Toggle window snapping" msgstr "Win&dows ਹਟਾਓ" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "ਝੂਲਣ ਵਿੰਡੋ ਪਰਭਾਵ ਲਈ ਸਪਰਿੰਗ ਮਾਡਲ ਵਰਤੋਂ" #: ../metadata/wobbly.xml.in.h:25 #, fuzzy msgid "Vertex Grid Resolution" msgstr "ਸਰਵਰ ਰੈਜ਼ੋਲੂਸ਼ਨ" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "ਵਿੰਡੋ, ਜੋ ਫੋਕਸ ਹੋਣ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਕਰੋ" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਲੈਣ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਹੋਵੇ" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਮੈਪ ਕਰਨ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਹੋਵੇ" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "ਵਿੰਡੋ, ਜੋ ਕਿ ਭੇਜਣ ਦੇ ਦੌਰਾਨ ਵੋਬਲ ਹੋਵੇ" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "ਜਦੋਂ ਵਿੰਡੋ ਵੱਧੋ-ਵੱਧ ਅਤੇ ਅਣ-ਵੱਧੋ-ਵੱਧ ਹੋਵੇ ਤਾਂ ਝੂਲੇ ਪਰਭਾਵ" #: ../metadata/wobbly.xml.in.h:31 #, fuzzy msgid "Wobbly Windows" msgstr "Windows" #, fuzzy #~ msgid "Command line 0" #~ msgstr "ਕਮਾਂਡ: " #, fuzzy #~ msgid "Run command 0" #~ msgstr "ਕਮਾਂਡ '%1'" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "ਕਮਾਂਡ ਲਾਇਨ ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ।" #, fuzzy #~ msgid "Filter Linear" #~ msgstr "ਫਿਲਟਰ:" #~ msgid "Use linear filter when zoomed in" #~ msgstr "ਜ਼ੂਮ ਇਨ ਕਰਨ ਦੇ ਦੌਰਾਨ ਲੀਨੀਅਰ ਫਿਲਟਰ ਵਰਤੋਂ" #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "ਵੇਹੜਾ" #, fuzzy #~ msgid "Zoom In" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "ਚੁਣੇ" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "ਜਾਂਚ" #~ msgid "Zoom and pan desktop cube" #~ msgstr "ਜ਼ੂਮ ਅਤੇ ਪੈਨ ਡੈਸਕਟਾਪ ਘਣ" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Decrease window opacity" #~ msgstr "Win&dows ਭਾਗ ਹਟਾਓ" #~ msgid "Increase window opacity" #~ msgstr "ਵਿੰਡੋ ਧੁੰਦਲਾਪਨ ਵਧਾਓ" #~ msgid "Opacity values for windows that should be translucent by default" #~ msgstr "ਵਿੰਡੋਜ਼ ਲਈ ਧੁੰਦਲੇਪਨ ਮੁੱਲ, ਜੋ ਕਿ ਡਿਫਾਲਟ ਹੀ ਅਲਪ-ਪਾਰਦਰਸ਼ੀ ਹੋਵੇ" #~ msgid "Opacity window values" #~ msgstr "ਧੁੰਦਲਾਪਨ ਵਿੰਡੋ ਮੁੱਲ" #, fuzzy #~ msgid "Opacity windows" #~ msgstr "Win&dows ਹਟਾਓ" #~ msgid "Background Images" #~ msgstr "ਬੈਕਗਰਾਊਂਡ ਚਿੱਤਰ" #~ msgid "Background images" #~ msgstr "ਬੈਕਗਰਾਊਂਡ ਚਿੱਤਰ" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane Left" #~ msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #, fuzzy #~ msgid "Plane Right" #~ msgstr "ਸੱਜੇ" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane down" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Plane left" #~ msgstr "ਰਿਮੋਟ ਸਬਨੈੱਟ" #, fuzzy #~ msgid "Plane right" #~ msgstr "ਸੱਜੇ" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane up" #~ msgstr "Win&dows ਹਟਾਓ" #~ msgid "Desktop Window Opacity Fade Time." #~ msgstr "ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਧੁੰਦਲਾਪਨ ਫੇਡ ਟਾਈਮ ਹੈ।" #, fuzzy #~ msgid "Toolbar" #~ msgstr "ਸੰਦ" #~ msgid "Menu" #~ msgstr "ਮੇਨੂ" #, fuzzy #~ msgid "Utility" #~ msgstr "ਸਹੂਲਤ ਡਿਸਕ..." #, fuzzy #~ msgid "Dialog" #~ msgstr "ਟੋਨ ਡਾਇਲ(&T)" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "ਝਰੋਖਾ ਪਰਬੰਧਕ" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "ਮੇਨੂ" #, fuzzy #~ msgid "Tooltip" #~ msgstr "ਸੰਦ" #, fuzzy #~ msgid "Notification" #~ msgstr "ਕਾਰਵਾਈ" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "ਟੱਚ-ਸਕਰੀਨ" #~ msgid "Unknown" #~ msgstr "ਅਣਜਾਣ" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "ਅੰਤਰਾਲ" #, fuzzy #~ msgid "Do not modify" #~ msgstr "ਕੋਈ ਲਾਗ ਨਾ ਕਰੋ" #, fuzzy #~ msgid "Drop shadow opacity (0.01-6.00)" #~ msgstr "ਘੱਟ ਸਮਰੱਥਾ(&L)" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "ਅਰਧ-ਵਿਆਸ" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "3D ਪਰਵੇਸ਼ਕ:" #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "3D ਪਰਵੇਸ਼ਕ:" #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "ਜਾਂਚ" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "ਰੂਸੀ ਸੰਘ" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "ਰੂਸੀ" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Minimize speed (0.0-50.0)" #~ msgstr "Window&s ਸਮੇਟੋ" #, fuzzy #~ msgid "Minimize timestep (0.0-50.0)" #~ msgstr "Window&s ਸਮੇਟੋ" #, fuzzy #~ msgid "Minimum Vertex Grid Size (4-128)" #~ msgstr "ਵੱਧ-ਤੋਂ-ਵੱਧ ਅਕਰ" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "ਵੇਹੜਾ" #, fuzzy #~ msgid "Opacity change step (1-50)" #~ msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #, fuzzy #~ msgid "Opacity level of moving windows (1-100)" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Opacity level of resizing windows (1-100)" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "3D ਪਰਵੇਸ਼ਕ:" #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "ਜਾਂਚ" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "ਸਥਾਨਕ ਸਮਾਂ" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "ਸਥਾਨਕ ਸਮਾਂ" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Win&dows ਹਟਾਓ" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "ਕਾਰਵਾਈ" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "ਸਟੀਪਿੰਗ" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "ਫਿਲਟਰ ਸੈਟ(&S)" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "ਸਰਵਰ ਰੈਜ਼ੋਲੂਸ਼ਨ" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "ਚੁਣੇ" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "ਜਾਂਚ" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "ਲਾਗਆਉਟ" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "ਸਕਰੀਨ ਘੁੰਮਾਓ" #, fuzzy #~ msgid "Command line %d" #~ msgstr "ਕਮਾਂਡ: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "ਕਮਾਂਡ: " #, fuzzy #~ msgid "Move Window Types" #~ msgstr "ਉਪਲੱਬਧਕਰਤਾ ਕਿਸਮ" #, fuzzy #~ msgid "Corners" #~ msgstr "ਕੋਰਨਿਸ਼" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "ਫਲਾਪੀ ਡਿਸਕ" #, fuzzy #~ msgid "Start moving window using keyboard" #~ msgstr "ਡੈਮਨ ਚਲਾ ਰਿਹਾ ਹੈ।" #, fuzzy #~ msgid "Terminate" #~ msgstr "ਟਰਮੀਨਲ" ./po/uk.po0000644000004100000410000033451313246301623012651 0ustar www-datawww-data# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:14+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Pootle 1.1.0\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "Стільниця" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "Керування вікнами" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "Compiz" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "Ніякий" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "Згорнути у заголовок" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "Розгорнути" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "Розгорнути в ширину" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "Розгорнути у висоту" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "Згорнути" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "Розгорнути" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "Опустити" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "Меню вікна" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "Дія при прокручуванні коліщатка миші на заголовку вікна." #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "Тип розмивання" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "Прозорість активного вікна теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "Затьмарення прозорості активного вікна теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "Прозорість теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "Затьмарення прозорості теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "Прозорість активних вікон у вигляді теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "Прозорість при використанні декорацій теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" "Затьмарювати активні вікна з темою metacity від непрозорого до прозорого" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" "Затьмарювати активні вікна з темою metacity від непрозорого до прозорого" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "Дія, коли коліщатко миші на заголовку вікна" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "Тип розмивання, що використовується для декорації вікна" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "Використовувати теми metacity" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "Використовувати теми metacity для малювання декорації вікна " #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "Закрити вікно" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "Відновити розмір вікна" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "Розгорнути вікно" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "Згорнути вікно" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "Винести нагору" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "Приклеїти" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "Розгорнути із заголовка" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "Відмінити винесення нагору" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "Відклеїти" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "Вікно \"%s\" не відповідає." #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" "Примусове завершення програми призведе до втрати всіх незбережених змін." #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "_Примусове завершення" # http://dict.linux.org.ua/db/table_adv.php?word=annotate #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "Коментар" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "Колір коментарю" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "Колір риски нотатки" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "Модуль нотатки" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "Очистити" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "Малювати" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "Малювати з використанням інструменту" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "Колір заповнення для анотації" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "Ініціювати" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "Початок малювання примітки" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "Початок видалення примітки" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "Початок видалення" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "Ширина лінії" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "Ширина лінії для приміток" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "Колір риски для приміток" # треба уточнити #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "Ширина риски" # треба уточнити #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "Ширина риски для приміток" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "4-разова Білінійна фільтрація" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "Розмивання по альфа-каналу" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "Розмивання вікна по альфа-каналу" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "Фільтр розмивання" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "Загородження розмиття" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "Насиченість розмивання" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "Швидкість розмивання" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "Розмивання вікон" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "Розмивання поза прозорими частинами вікон" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "Насиченість розмивання" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "Розмивання вікон" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "Розмивання вікон, які не мають фокусу" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "Вимкнути розмивання на тьмяних ділянках екрану інших вікон" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "Фільтр методу, який використовується для розмивання" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "Розмивання активного" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "Розмивання активних вікон" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "Гаусів" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "Радіус розмивання" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "Сила розмивання" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "Радіус розмивання" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "Сила розмивання" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "Незалежне отримання текстур" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "Mipmap" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "Рівень деталізації Mipmap" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "Деталізація Mipmap" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "Пульс" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "Ефект пульсації" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" "Використовувати доступну кількість елементів текстур для отримання якомога " "більшої кількості незалежних текстур." #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "Швидкість розмивання вікна" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "Вікна, на які впливає ефект розмивання" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "Вікна, для яких використовується альфа розмивання за замовчуванням " #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "Дублювання виводу" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "Почати дублювання позначеного" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "Оброблювач дубльованого виводу" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command0" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command1" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command10" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command11" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command2" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command3" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command4" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command5" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command6" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command7" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command8" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command9" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command0" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command1" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command10" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command11" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command2" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command3" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command4" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command5" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command6" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command7" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command8" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" "Комбінація клавіш, при натисненні якої буде виконана команда оболонки, " "визначена як command9" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command0" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command1" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command10" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command11" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command2" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command3" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command4" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command5" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command6" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command7" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command8" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" "Закріплення за межею екрану, що при наведенні, буде виконана команда " "оболонки, визначена як command9" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "Призначає закріплення на виконання команд" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "Комбінації клавіш" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "Команда 1" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "Команда 10" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "Команда 11" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "Команда 12" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "Команда 2" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "Команда 3" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "Команда 4" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "Команда 5" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "Команда 6" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "Команда 7" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "Команда 8" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "Команда 9" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command0" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command1" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command10" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command11" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command2" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command3" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command4" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command5" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command6" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command7" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command8" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "Команда, яку буде виконано в оболонці при виклику run_command9" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "Команди " #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "Закріплення межі" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "Комбінації клавіш" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "Виконати команду 1" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "Виконати команду 10" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "Виконати команду 11" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "Виконати команду 12" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "Виконати команду 2" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "Виконати команду 3" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "Виконати команду 4" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "Виконати команду 5" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "Виконати команду 6" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "Виконати команду 7" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "Виконати команду 8" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "Виконати команду 9" # Додаток - це application, plugin, IMHO - це модуль #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "Активні модулі" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" "Дозволяє малювати вікна на весь екран без перенаправлення в області " "растрового відображення за межами екрану" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "Сигнал, що чути" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "Системний звуковий сигнал, що чути" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "Авторозкриття" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "Затримка авторозкриття" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "Автоматичне виявлення пристроїв виводу" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "Автоматичне визначення частоти поновлювання" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "Найкраще" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "Натисніть для виділення" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "Клацання на вікні переведе фокус вводу на нього" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "Закрити активне вікно" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "Типовий значок" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "Типовий значок вікна" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "Розмір робочого столу" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "Визначити пристрої виводу" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "Визначити швидкість оновлення" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "Параметри відображення" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" "Затримка покажчика миші на краю екрану перед тим, як буде здійснено дію краю " "екрану." #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "Затримка спрацьовування на краю" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "Швидко" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "Поведінка при розгортані" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "Рівень попереджуючий фокусування" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "Попереджуюче фокусування вікон" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "Попереджуюче фокусування вікон" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "Примусове незалежне обмальовування виводу." #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "Загальні Налаштування" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "Загальні налаштування Compiz" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "Добре" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "Сховати всі, крім вікон панелі завдань" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "Сховати всі вікна і передати фокус робочому столу" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" "При переході в режим відображення робочого столу вікна, яких немає на панелі " "завдань, не відображаються" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "Високе" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "Віртуальний розмір по горизонталі" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" "Використовувати стиснення для текстур, конвертованих від зображень, якщо є" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "Ігнорувати підказки у розгорнутому стані" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" "Ігнорування підказок збільшення розмірів і співвідношення сторін для " "розгорнутого вікна" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "Інтервал часу до авторозгортання обраних вікон" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "Інтервал між повідомленнями відгуку" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "Сполучення клавіш" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "Рівень запобігання розкраданню фокусу" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "Освітлення" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "Перелік активних в даний момент модулів" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "Перелік рядків, що описують пристрої виведення" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "Низьке" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "Перемістити вікно на задній план" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "Розташування вікна позаду інших вікон" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "Розгорнути вікно за горизонталлю" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "Розгорнути вікно за вертикаллю" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "Розгорнути активне вікно" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "Розгорнути активне вікно за горизонталлю" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "Розгорнути активне вікно за вертикаллю" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "Згорнути активне вікно" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "Нормальний" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "Кількість стільниць" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "Кількість віртуальних стільниць" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "Вимкнути" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" "Оновлювати екран під час гасіння зворотного ходу променя кадрової розгортки" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "Пристрої виводу" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "Обробка перекриваємого виводу" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" "Перетворювати кожен пристрій виводу незалежно, навіть якщо пристрої " "виведення перекриваються" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "Затримка" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "Перевага більшому виводу" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "Перевага меншому виводу" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "Викликати клацанням" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "Викликати вікно" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "Виклик обраних вікон після закінчення інтервалу часу" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "Виклик вікна поверх інших вікон" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "Виклик вікна клацанням" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "Частота поновлювання" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "Коефіцієнт розміру екрану для віртуального розміру по горизонталі" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "Коефіцієнт розміру екрану для віртуального розміру по вертикалі" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "Показати стільницю" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "Повільна анімація" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "Інтелектуальний режим" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "Синхронізація з VBlank" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "Компресія текстур" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "Фільтр текстур" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "Фільтрація текстур" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "Частота, з якою перемальовується вміст екрана (раз / сек)" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "Розгортати вікно" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "Розгортати вікно по горизонталі" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "Розгортати вікно по вертикалі" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "Переключити згортання вікна в смужку" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "Розгортання активного вікна" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "Розгортання активного вікна по горизонталі" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "Розгортання активного вікна по вертикалі" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "Переключення згортання активного вікна в смужку" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "Перемикач для використання повільної анімації" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "Скасування повного розгортання активного вікна" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "Скасувати перенаправлення вікон на весь екран" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "Використання розсіяного світла при перетворенні екрану" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "Віртуальний розмір по вертикалі" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "Дуже високий" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "Який з пристроїв виводу, що перекриваються повинен бути обраний" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "Поєднання кнопок меню вікна" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "Сполучення клавіш меню вікна" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "Прискорення" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "Налаштування зображення" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "Налаштування зображення на верхній грані куба" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "Перехід до наступного слайда" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "Анімувати фон" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "Анімації фону при обертанні куба" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "Зовнішній вигляд" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "Автоматично" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "Поведінка" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "Колір верхньої та нижньої граней куба" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "Колір, що використовується для нижньої межі градієнта тла" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "Колір, що використовується для верхньої межі градієнта тла" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "Шапка куба" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "Кольори куба" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "Куб робочого столу" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "Прискорення згортання" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "Швидкість згортання" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "Крок часу згортання" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" "По можливості застосовувати множинне відображення для масштабування якості " "зображення" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "Повернення до попереднього слайда" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "Файли зображення" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "Зображення, що використовується як текстури для фону" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "Прозорість куба тільки під час обертання мишею." #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "Внутрішня поверхня куба" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "Внутрішня поверхня куба" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "Перелік PNG-і SVG-файлів, які слід відобразити на верхній грані куба" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "Режим множинного виводу" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "Декілька кубів" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "Слідуючий слайд" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "Один великий куб" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "Прозорість під час обертання" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "Прозорість у статичному положенні" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "Прозорість стільниці під час обертання." #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "Прозорість вікон стільниці в статичному положенні." #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "Розміщення вікон на кубі" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "Попередній слайд" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "Обмальовування фону" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "Масштаб зображення" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "Масштаб зображення для покриття верхної грані куба" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "Вибір відображення куба при множинному виводі." #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "Тло" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "Кінцевий колір градієнта для тла" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "Початковий колір градієнта для тла" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "Зображення для тла" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "Швидкість" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "Крок часу" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "Прозорість тільки при обертанні мишею" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "Прозорість куба" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "Розгортання" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "Розгортання куба" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "Dbus" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "Управління Dbus" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "Дозволити генерацію mipmaps для текстур оформлення" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "Команда" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "Декорація вікон" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "Команда декоратора, яка виконується, якщо декоратор ще не запущений" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "Зсув тіні по осі X" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "Зсув тіні по осі Y" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "Колір тіні" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "Прозорість тіні" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "Радіус тіні" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "Колір тіні" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "Зсув тіні по осі X" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "Зсув тіні по осі Y" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "Прозорість тіні" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "Радіус тіні" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "Тінь вікон" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "Оформлення вікна" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "Оформлення вікон" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "Вікна до яких буде застосовано оформлення" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "Вікна які будуть відкидати тінь" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "Яскравість (у %) вікон які не відповідають" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "Постійна швидкість" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "Постійний час" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "Затемнення вікна, що не відповідає" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "Затемнення вікна, яке не відповідає на запити менеджера вікон" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "Швидкість зникнення" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "Знебарвлювати при згортанні / відкритті / закритті" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "Швидкість знебарвлювання" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "Час зникнення" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "Ефект знебарвлювання при згортанні / відкритті / закритті вікон" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "Ефект знебарвлювання при системному звуковому сигналі" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" "Поступовий прояв вікон при відображенні і поступове зникнення при скасуванні " "відображення" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "Знебарвити вікна" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "Прояв / зникнення вікон" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "Повноекранна візуалізація звукового сигналу" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "Повноекранний ефект прояву / зникнення при системному звуковому сигналі" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "Насиченість (у %) вікна, що не відповідає" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "Яскравість вікна що не відповідає" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "Насиченість вікна, що не відповідає" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "Візуалізація звукового сигналу" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "Режим прояву / зникнення вікна" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "Швидкість зникнення вікна в режимі \"Постійна швидкість\"" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "Час зникнення вікна (в мс) в режимі \"Постійна швидкість\"" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "Вікна, до яких слід застосовувати ефект прояву / зникнення" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "Точка монтування" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "Точка монтування" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "Файлова система у просторі (fuse)" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "Файлова система у просторі (fuse)" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "GConf" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "Керування GConf" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "GLib" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "Підтримка основного циклу GLib" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "Працює з Gnome" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "Відкрити термінал" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "Параметри, що підтримують сумісність Compiz з оточенням стільниці Gnome" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "Діалогове вікно запуску" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "Запустити команду в терміналі" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "Командний рядок знімка екрана" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "&Показувати Головне меню" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "Показати діалог запуску застосунків" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "Показувати головне меню" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "Зробити знімок екрану" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "Зробити знімок вікна" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "Командний рядок терміналу" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "Командний рядок знімка вікна" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "Ini" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "Формат зберігання в простому INI-файлі" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "Модуль сповіщення про зміну файлу" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "Inotify" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "Kconfig" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "Керування Kconfig" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "Ефект згортання" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "Згорнути вікна" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "Швидкість згортання" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "Квант часу згортання" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "Стійкість тіні" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "Стійкість тіні" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "Перетворювати вікна при згортанні та скасуванні згортання" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "Вікна, які повинні бути перетворені при згортанні" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "Обмежити Y" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "Обмеження координати Y межами робочої області" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" "Не оновлювати зі сторони сервера положення вікон до закінчення переміщення" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "Ініціювати рух вікна" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "\"Ліниве\" позиціонування" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "Перемістити вікно" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "Перемістити вікно" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "Прозорість" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "Ступінь прозорості рухомих вікон" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" "Скасування прив'язки та автоматичне скасування розгортання повністю " "розгорнутих вікон під час перетягування" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "Скасувати прив'язку повністю розгорнутих вікон" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "Запуск переміщення вікна" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "Яскравість" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "Зменшення яскравості" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "Збільшення яскравості" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "Крок зміни яскравості" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "Значення яскравості для вікон" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "Зменшити" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "Збільшити" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "Зменшення прозорості" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "Збільшення прозорості" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "Крок прозорості" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "Значення прозорості для вікон" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "Прозорість, яскравість і насиченість" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "Регулювання прозорості, яскравості і насиченості" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "Насиченість" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "Зменшення насиченості" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "Збільшення насиченості" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "Крок зміни насиченості" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "Значення насиченості для вікон" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "Крок" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "Специфічні налаштування вікна" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "Значення для вікна" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "Вікна" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "Вікна, які повинні мати іншу яскравість за замовчуванням" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "Вікна, які повинні мати іншу яскравість за замовчуванням" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "Вікна, які повинні мати іншу яскравість за замовчуванням" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "Алгоритм, що використовується для розміщення вікна" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "Каскадом" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "У центрі" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "Фіксоване розміщення вікна" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "Примусове позиціонування вікон" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "Горизонтальні позиції видових вікон" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "Тримати в робочій області" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "Запобігти переміщенню вікон за межі екрану" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "Розміщення вікон" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "Розміщувати на всіх пристроях виводу" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "При відображенні ви можете розмістити вікна в потрібних місцях" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "Режим розміщення" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "Опозиціонувати вікна" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "Випадковий" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" "Вибір як має себе вести позиціонування вікон, якщо використовується декілька " "виводів" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "Розумний" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "Використовувати активний пристрій виводу" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "Використовувати пристрій виводу сфокусованого вікна" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "Використовувати пристрій виведення з курсором" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "Вертикальні позиції видових вікон" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "Опозиціонування вікна видовоих вікон" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "Обхідні шляхи при розміщенні вікна" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "Вікна, які повинні бути опозиціоновані за замовчуванням" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" "Вікна, які повинні бути опозиціоновані в певному екрані за замовчуванням" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" "Вікна, які повинні бути опозиціоновані, навіть якщо вони вказують, що цього " "робити не потрібно." #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "Вікно з фіксованою позицією" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "Вікно з фіксованим видовим вікном" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "Обхідні шляхи" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "Положення по X" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "Положення видового вікна по X" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "Значення положення по X" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "Положення по Y" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "Положення видового вікна по Y" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "Значення положення по Y" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "Png" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "Завантажувач зображень Png" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "Відповідність регулярними виразами" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "Відповідність вікон за допомогою регулярних виразів" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "Закріплення" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "Колір кордону" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" "Колір кордону, який використовується для окреслення контуру і режимів зміни " "розмірів прямокутника" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "Режим зміни розміру за замовчуванням" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "Режим за замовчуванням, який використовується для зміни розміру вікна" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "Колір заливки" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" "Колір заливки, що використовується для режиму зміни розмірів прямокутника" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "Ініціювати звичайну зміну розмірів вікна" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "Ініціювати зміну розмірів вікна Кордон" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "Ініціювати зміну розмірів вікна Прямокутник" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "Ініціювати зміну розмірів вікна Розтягування" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "Ініціювати зміну розмірів вікна" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "Нормальна зміна розмірів вікна" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "Кордон" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "Кордон зміни розмірів вікна" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "Прямокутник" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "Прямокутна зміна розмірів вікна" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "Зміна розмірів вікна" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "Зміна розмірів вікна" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "Запуск зміни розмірів вікна" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "Запуск зміни розмірів вікна його розтяганням" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "Запуск звичайної зміни розмірів вікна" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "Запуск зміни розмірів вікна з показом кордону" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "Запуск зміни розмірів вікна з показом прямокутника" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "Розтягнути" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "Зміна розмірів вікна розтягуванням" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "Типи вікон, яким слід застосовувати ефект нормальної зміни розміру" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "Типи вікон, яким слід застосовувати ефект зміни розміру кордон" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "Типи вікон, яким слід застосовувати ефект зміни розміру прямокутник" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "Типи вікон, яким слід застосовувати ефект зміни розміру розтягуванням" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "Відображення під час перетягування до краю" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "Відображення при переміщенні до краю" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "Відображення при курсорі на краю" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "Час відображення" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "Відображення в ліве кадрове вікно і спотворення курсору" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" "Відображення на наступне кадрове вікно при перетягуванні об'єкта до краю " "екрану" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "Відображення на наступне кадрове вікно при зсуві курсору до краю екрану" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" "Відображення на наступне кадрове вікно під час переміщення вікна до краю " "екрану" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "Відображення в праве кадрове вікно і спотворення курсору" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "Інвертувати вісь Y для переміщень курсору" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "Інвертувати для курсора вісь Y" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "Чутливість курсору" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "Піднімати при обертанні" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "Піднімати вікна при обертанні" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "Обертання куба" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "Обертати з відображенням вліво" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "Обертати з відображенням вправо" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "Обертати вліво" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "Обертати вліво разом з вікном" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "Обертати вправо" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "Обертати вправо разом з вікном" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "Обертати до" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "Обертати до межі 1" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "Обертати до межі 1 з вікном" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "Обертати до межі 10" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "Обертати до межі 10 з вікном" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "Обертати до межі 11" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "Обертати до межі 11 з вікном" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "Обертати до межі 12" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "Обертати до межі 12 з вікном" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "Обертати до межі 2" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "Обертати до межі 2 з вікном" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "Обертати до межі 3" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "Обертати до межі 3 з вікном" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "Обертати до межі 4" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "Обертати до межі 4 з вікном" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "Обертати до межі 5" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "Обертати до межі 5 з вікном" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "Обертати до межі 6" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "Обертати до межі 6 з вікном" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "Обертати до межі 7" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "Обертати до межі 7 з вікном" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "Обертати до межі 8" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "Обертати до межі 8 з вікном" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "Обертати до межі 9" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "Обертати до межі 9 з вікном" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "Обертання куба" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "Обертання куба стільниці" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "Обертати вліво" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "Обертати вліво разом з активним вікном" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "Обертати вправо" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "Обертати вправо разом з активним вікном" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "Обернути до лиця куба" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "Обернути до лиця куба з вікном" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "Обертання до межі 1" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "Обертання до межі 1 з активним вікном" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "Обертання до межі 10" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "Обертання до межі 10 з активним вікном" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "Обертання до межі 11" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "Обертання до межі 11 з активним вікном" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "Обертання до межі 12" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "Обертання до межі 12 з активним вікном" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "Обертання до межі 2" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "Обертання до межі 2 з активним вікном" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "Обертання до межі 3" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "Обертання до межі 3 з активним вікном" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "Обертання до межі 4" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "Обертання до межі 4 з активним вікном" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "Обертання до межі 5" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "Обертання до межі 5 з активним вікном" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "Обертання до межі 6" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "Обертання до межі 6 з активним вікном" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "Обертання до межі 7" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "Обертання до межі 7 з активним вікном" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "Обертання до межі 8" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "Обертання до межі 8 з активним вікном" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "Обертання до межі 9" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "Обертання до межі 9 з активним вікном" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "Обертання до кадрового вікна" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "Обертати вікно" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "Обертати з вікном" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "Прискорення обертання" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "Швидкість обертання" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "Квант часу обертання" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "Масштабування обертання" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "Чутливість до переміщень курсору" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "Прив'язка обертання куба до нижньої межі" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "Прив'язка обертання куба до верхньої межі" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "Прив'язати до нижньої межі" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "Прив'язати до верхньої межі" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "Запуск обертання" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "Затримка в часі до відображення кадрового вікна" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "Змінити масштаб" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "Ступінь прозорості у відсотках" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "Великий" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "Режим гарячих клавіш з залипанням" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Використовувати режим гарячих клавіш з залипанням замість включення при " "натисканні та відключення при відпуску кнопок." #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "Клацніть на стільниці для відображення стільниці" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "Затемнити тло" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "Затемнення тла при масштабування вікон" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "Емблема" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" "Перехід в режим відображення стільниці при клацані мишею на стільниці під " "час масштабування" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "Час затримки при наведенні" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "Ініціювати засіб вибору вікна" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "іціювати засіб вибору вікна для всіх вікон" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "Ініціювати засіб вибору вікна для групи вікон" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "Ініціювати засіб вибору вікна для вікон поточного пристрою виводу" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "Режим призначення клавіш з залипанням" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" "Використовувати режим гарячих клавіш з залипанням замість включення при " "натисканні та відключення при відпускання кнопок." #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "Компонування та запуск перетворення всіх вікон" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "Компонування та запуск перетворення групи вікон" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "Компонування та запуск перетворення вікон" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "Компонування та запуск перетворення вікон поточного пристрою виводу" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "На всі пристрої виведення" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "На поточний пристрій виводу" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "Накласти значок" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "Накладення значка на вікна при їх масштабуванні" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "Масштабування" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "Масштабування вікон" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "Швидкість масштабування" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "Квант часу масштабування" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "Масштабування вікон" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" "Вибрати, де масштабувати вікна якщо використовуються пристрої множинного " "виводу." #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "Відстань між вікнами" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "Інтервал" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" "Час (в мс) до завершення режиму масштабування при наведенні покажчика на " "вікно" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "Типи вікон, для яких слід застосовувати режим масштабування" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "Автоматично знімок екрану в цій програмі" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "Каталог" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "Зробити знімок області" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "Запустити програму" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "Класти зображення знімків екрану в цей каталог" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "Знімок екрану" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "Модуль знімка екрана" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "Svg" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "Завантажувач зображень Svg" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "Рівень яскравості у відсотках" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "Рівень насиченості у відсотках" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "Перемикач програм" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "Автоматичне обертання" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "Перемістити на передній план" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "Переміщення вибраного вікна на передній план" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "При перемиканні вікон стільниця на задньому плані має бути зменшена" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "Піктограма" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "Згорнуті" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "Наступна панель" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "Наступне вікно" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "Наступне вікно (Усі вікна)" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "Наступне вікно (не виринаюче)" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "Відображення перемикача (якщо він невидимий) і вибір наступного вікна" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" "Відображення перемикача (якщо він невидимий) і вибір наступного вікна з усіх " "наявних" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "Відображення перемикача (якщо він невидимий) і вибір попереднього вікна" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" "Відображення перемикача (якщо він невидимий) і вибір попереднього вікна з " "усіх наявних" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "Попередня панель" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "Попереднє вікно" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "Попереднє вікно (Всі вікна)" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "Попереднє вікно (Не спливаюче)" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "Обертати до вибраного вікна при перемиканні" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "Вибрати наступне вікно типу панель." #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "Вибрати наступне вікно без показу спливаючого вікна." #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "Вибрати попереднє вікно типу панель." #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "Вибрати попереднє вікно без показу спливаючого вікна." #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "Піктограма поруч з ескізом" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "Відображення згорнутих вікон" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "Швидкість перемикача" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "Квант часу перемикача" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "Перемикач вікон" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "Вікна, які повинні бути відображені в перемикачі" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "Забезпечити підтримку колірного простору YV12" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "Відтворення відео" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "Відтворення відео" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "Колірний простір YV12" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "Додати лінію" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "Додати точку" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "Додавання ефектів води до різних дій стільниці" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "Затримка (в мс) між краплями дощу" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "Включити для курсора ефекти води" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "Лінія" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "Масштаб зміщення" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "Крапка" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "Затримка дощу" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "Хвилі заголовка" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "Включення дощу" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "Включення або відключення ефекту дощу" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "Переключити склоочисник" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "Включення або відключення ефекту склоочисника" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "Ефект води" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "Масштаб зміщення води" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "Ефект хвиль у заголовку вікна" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "Ефект фокусування" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "Ефект фокусування вікна" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "Типи вікон з фокусом" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "Тертя" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "Типи вікон при захопленні" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "Роздільна здатність" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "Інвертована прив'язка вікна" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "Включити тремтіння вікна" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "Ефект віддзеркалення" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "Ефект відображення вікна" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "Типи відображення вікна" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "Ефект розгортання" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "Мінімальний розмір" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "Мінімальна роздільна здатність" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "Перемістити вікна" # 'driver' as in '(hardware) driver update' #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "Тремтіння" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "Інвертована прив'язка" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "Прив'язка вікон" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "Пружне тертя" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "K пружності" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "Константа пружності" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "Переключення прив'язки вікон" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "Використовувати модель пружини в ефекті в'язкого вікна" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "Роздільна здатність" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "Вікна, що стають в'язкими при фокусі" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "Вікна, що стають в'язкими при захопленні" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "Вікна, що стають в'язкими при призначенні" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "Вікна, що стають в'язкими при переміщенні" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "Ефект тремтіння при розгортанні і згортанні вікон" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "Тремячі Вікна" #~ msgid "Command line 0" #~ msgstr "Команда 0" #, fuzzy #~ msgid "Run command 0" #~ msgstr "Команда \"%1\"" #, fuzzy #~ msgid "Screenshot commands" #~ msgstr "Екран" #, fuzzy #~ msgid "Screenshot key bindings" #~ msgstr "Помилка розбору командного рядка." #, fuzzy #~ msgid "Filter Linear" #~ msgstr "Фільтр: " #, fuzzy #~ msgid "Zoom Desktop" #~ msgstr "Збільшити стільницю" #~ msgid "Zoom In" #~ msgstr "Збільшити" #, fuzzy #~ msgid "Zoom Out" #~ msgstr "Робоча станція" #, fuzzy #~ msgid "Zoom Pan" #~ msgstr "Робоча станція" #, fuzzy #~ msgid "Zoom Speed" #~ msgstr "Вибрано" #, fuzzy #~ msgid "Zoom Timestep" #~ msgstr "Тест" #, fuzzy #~ msgid "Zoom factor" #~ msgstr "Робоча станція" #, fuzzy #~ msgid "Zoom pan" #~ msgstr "Вибрано" #, fuzzy #~ msgid "Place windows on a plane" #~ msgstr "Windows" #, fuzzy #~ msgid "Plane Down" #~ msgstr "Сторінка вниз" #, fuzzy #~ msgid "Plane Left" #~ msgstr "Віддалена підмережа" #, fuzzy #~ msgid "Plane Right" #~ msgstr "Праворуч" #, fuzzy #~ msgid "Plane To Face 1" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 10" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 11" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 12" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 2" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 3" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 4" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 5" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 6" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 7" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 8" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face 9" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane Up" #~ msgstr "Сторінка вгору" #, fuzzy #~ msgid "Plane down" #~ msgstr "Windows" #, fuzzy #~ msgid "Plane left" #~ msgstr "Віддалена підмережа" #, fuzzy #~ msgid "Plane right" #~ msgstr "Праворуч" #, fuzzy #~ msgid "Plane to face 1" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 10" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 11" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 12" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 2" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 3" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 4" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 5" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 6" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 7" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 8" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face 9" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane up" #~ msgstr "Сторінка вгору" #, fuzzy #~ msgid "Toolbar" #~ msgstr "Інструменти" #~ msgid "Menu" #~ msgstr "Меню" #, fuzzy #~ msgid "Utility" #~ msgstr "Диск з утилітами..." #, fuzzy #~ msgid "Splash" #~ msgstr "заставка" #, fuzzy #~ msgid "Dialog" #~ msgstr "&Тонове набирання" #, fuzzy #~ msgid "DropdownMenu" #~ msgstr "Віконний менеджер" #, fuzzy #~ msgid "PopupMenu" #~ msgstr "Меню" #, fuzzy #~ msgid "Tooltip" #~ msgstr "Інструменти" #, fuzzy #~ msgid "Notification" #~ msgstr "Сповіщення" #, fuzzy #~ msgid "Dnd" #~ msgstr "Кінець" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Сенсорний екран" #~ msgid "Unknown" #~ msgstr "Невідомо" #, fuzzy #~ msgid "Blur saturation (0-100)" #~ msgstr "Тривалість" #, fuzzy #~ msgid "Do not modify" #~ msgstr "Нічого не записувати в журнал" #, fuzzy #~ msgid "Drop shadow radius (0.0-48.0)" #~ msgstr "Радіус" #, fuzzy #~ msgid "Focus prevention windows (match)" #~ msgstr "Увімкнути автоперехід в режим сну" #, fuzzy #~ msgid "Fold Acceleration (1.0-20.0)" #~ msgstr "Прискорення 3D: " #, fuzzy #~ msgid "Fold Speed (0.0-50.0)" #~ msgstr "Прискорення 3D: " #, fuzzy #~ msgid "Fold Timestep (0.0-50.0)" #~ msgstr "Тест" #, fuzzy #~ msgid "Gaussian radius (1-15)" #~ msgstr "Російська Федерація" #, fuzzy #~ msgid "Gaussian strength (0.00-1.00)" #~ msgstr "Російська" #, fuzzy #~ msgid "Map Window Effect (None, Shiver)" #~ msgstr "Windows" #, fuzzy #~ msgid "Number of virtual desktops (1-36)" #~ msgstr "Віддалена стільниця" #, fuzzy #~ msgid "Rotation Acceleration (1.0-20.0)" #~ msgstr "Прискорення 3D: " #, fuzzy #~ msgid "Rotation Timestep (0.0-50.0)" #~ msgstr "Тест" #, fuzzy #~ msgid "Scale speed (0.0-50.0)" #~ msgstr "місцевий час" #, fuzzy #~ msgid "Scale timestep (0.0-50.0)" #~ msgstr "місцевий час" #, fuzzy #~ msgid "Space between windows (0-250)" #~ msgstr "Windows" #, fuzzy #~ msgid "Spring Friction (0.0-10.0)" #~ msgstr "Дія" #, fuzzy #~ msgid "Spring Konstant (0.0-10.0)" #~ msgstr "Іспанія" #, fuzzy #~ msgid "Switcher speed (0.0-50.0)" #~ msgstr "Скрипти перемикання" #, fuzzy #~ msgid "Texture filtering (Fast, Good, Best)" #~ msgstr "&Вказати фільтр" #, fuzzy #~ msgid "Vertex Grid Resolution (1-64)" #~ msgstr "Роздільна здатність" #, fuzzy #~ msgid "Window blur speed (0.0-10.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Window fade speed (0.0-25.0)" #~ msgstr "Windows" #, fuzzy #~ msgid "Zoom Speed (0.0-50.0)" #~ msgstr "Вибрано" #, fuzzy #~ msgid "Zoom Timestep (0.0-50.0)" #~ msgstr "Тест" #, fuzzy #~ msgid "Zoom factor (1.01-3.00)" #~ msgstr "Робоча станція" #, fuzzy #~ msgid "Plane To Face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane to face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Plane To Face %d with Window" #~ msgstr "XF86RotateWindows" #, fuzzy #~ msgid "Rotate To Face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Rotate to face %d" #~ msgstr "Обернути екран" #, fuzzy #~ msgid "Command line %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Run command %d" #~ msgstr "Команда: " #, fuzzy #~ msgid "Corners" #~ msgstr "Перетворювачі" #, fuzzy #~ msgid "Sloppy Focus" #~ msgstr "Дискета" #, fuzzy #~ msgid "Terminate" #~ msgstr "Термінали" ./po/ka.po0000644000004100000410000017023013246301623012617 0ustar www-datawww-data# Georgian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2005 SUSE Linux Products GmbH. # Aiet Kolkhi , 2005. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-24 08:13+0100\n" "PO-Revision-Date: 2005-05-18 10:33+0200\n" "Last-Translator: Aiet Kolkhi \n" "Language-Team: Georgian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/gnome/50-compiz-desktop-key.xml.in.h:1 msgid "Desktop" msgstr "" #: ../gtk/gnome/50-compiz-key.xml.in.h:1 msgid "Window Management" msgstr "" #: ../gtk/gnome/compiz.desktop.in.h:1 msgid "Compiz" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:426 ../metadata/scale.xml.in.h:25 #: ../metadata/wobbly.xml.in.h:16 msgid "None" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:427 #: ../gtk/window-decorator/gtk-window-decorator.c:4625 msgid "Shade" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:428 ../metadata/place.xml.in.h:9 msgid "Maximize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:429 msgid "Maximize Horizontally" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:430 msgid "Maximize Vertically" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:431 msgid "Minimize" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:432 msgid "Raise" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:433 msgid "Lower" msgstr "" #: ../gtk/gnome/compiz-window-manager.c:434 #: ../gtk/window-decorator/gtk-window-decorator.c:4606 #: ../metadata/core.xml.in.in.h:100 msgid "Window Menu" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:1 msgid "Action to take when scrolling the mouse wheel on a window title bar." msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:2 msgid "Blur type" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:3 msgid "Metacity theme active window opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:4 msgid "Metacity theme active window opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:5 msgid "Metacity theme opacity" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:6 msgid "Metacity theme opacity shade" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:7 msgid "Opacity to use for active windows with metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:8 msgid "Opacity to use for metacity theme decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:9 msgid "" "Shade active windows with metacity theme decorations from opaque to " "translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:10 msgid "" "Shade windows with metacity theme decorations from opaque to translucent" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:11 msgid "Title bar mouse wheel action" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:12 msgid "Type of blur used for window decorations" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:13 msgid "Use metacity theme" msgstr "" #: ../gtk/window-decorator/gwd.schemas.in.h:14 msgid "Use metacity theme when drawing window decorations" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4414 #: ../metadata/core.xml.in.in.h:12 msgid "Close Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4436 #: ../metadata/core.xml.in.in.h:93 msgid "Unmaximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4439 #: ../metadata/core.xml.in.in.h:49 msgid "Maximize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4481 #: ../metadata/core.xml.in.in.h:55 msgid "Minimize Window" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4645 msgid "Make Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4671 msgid "Stick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4691 msgid "Unshade" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4711 msgid "Unmake Above" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:4737 msgid "Unstick" msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5085 #, c-format msgid "The window \"%s\" is not responding." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5094 msgid "" "Forcing this application to quit will cause you to lose any unsaved changes." msgstr "" #: ../gtk/window-decorator/gtk-window-decorator.c:5109 msgid "_Force Quit" msgstr "" #: ../metadata/annotate.xml.in.h:1 msgid "Annotate" msgstr "" #: ../metadata/annotate.xml.in.h:2 msgid "Annotate Fill Color" msgstr "" #: ../metadata/annotate.xml.in.h:3 msgid "Annotate Stroke Color" msgstr "" #: ../metadata/annotate.xml.in.h:4 msgid "Annotate plugin" msgstr "" #: ../metadata/annotate.xml.in.h:5 msgid "Clear" msgstr "" #: ../metadata/annotate.xml.in.h:6 msgid "Draw" msgstr "" #: ../metadata/annotate.xml.in.h:7 msgid "Draw using tool" msgstr "" #: ../metadata/annotate.xml.in.h:8 msgid "Fill color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:9 ../metadata/clone.xml.in.h:2 #: ../metadata/rotate.xml.in.h:12 ../metadata/screenshot.xml.in.h:3 #: ../metadata/water.xml.in.h:6 msgid "Initiate" msgstr "" #: ../metadata/annotate.xml.in.h:10 msgid "Initiate annotate drawing" msgstr "" #: ../metadata/annotate.xml.in.h:11 msgid "Initiate annotate erasing" msgstr "" #: ../metadata/annotate.xml.in.h:12 msgid "Initiate erase" msgstr "" #: ../metadata/annotate.xml.in.h:13 msgid "Line width" msgstr "" #: ../metadata/annotate.xml.in.h:14 msgid "Line width for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:15 msgid "Stroke color for annotations" msgstr "" #: ../metadata/annotate.xml.in.h:16 msgid "Stroke width" msgstr "" #: ../metadata/annotate.xml.in.h:17 msgid "Stroke width for annotations" msgstr "" #: ../metadata/blur.xml.in.h:1 msgid "4xBilinear" msgstr "" #: ../metadata/blur.xml.in.h:2 msgid "Alpha Blur" msgstr "" #: ../metadata/blur.xml.in.h:3 msgid "Alpha blur windows" msgstr "" #: ../metadata/blur.xml.in.h:4 msgid "Blur Filter" msgstr "" #: ../metadata/blur.xml.in.h:5 msgid "Blur Occlusion" msgstr "" #: ../metadata/blur.xml.in.h:6 msgid "Blur Saturation" msgstr "" #: ../metadata/blur.xml.in.h:7 msgid "Blur Speed" msgstr "" #: ../metadata/blur.xml.in.h:8 msgid "Blur Windows" msgstr "" #: ../metadata/blur.xml.in.h:9 msgid "Blur behind translucent parts of windows" msgstr "" #: ../metadata/blur.xml.in.h:10 msgid "Blur saturation" msgstr "" #: ../metadata/blur.xml.in.h:11 msgid "Blur windows" msgstr "" #: ../metadata/blur.xml.in.h:12 msgid "Blur windows that doesn't have focus" msgstr "" #: ../metadata/blur.xml.in.h:13 msgid "Disable blurring of screen regions obscured by other windows." msgstr "" #: ../metadata/blur.xml.in.h:14 msgid "Filter method used for blurring" msgstr "" #: ../metadata/blur.xml.in.h:15 msgid "Focus Blur" msgstr "" #: ../metadata/blur.xml.in.h:16 msgid "Focus blur windows" msgstr "" #: ../metadata/blur.xml.in.h:17 msgid "Gaussian" msgstr "" #: ../metadata/blur.xml.in.h:18 msgid "Gaussian Radius" msgstr "" #: ../metadata/blur.xml.in.h:19 msgid "Gaussian Strength" msgstr "" #: ../metadata/blur.xml.in.h:20 msgid "Gaussian radius" msgstr "" #: ../metadata/blur.xml.in.h:21 msgid "Gaussian strength" msgstr "" #: ../metadata/blur.xml.in.h:22 msgid "Independent texture fetch" msgstr "" #: ../metadata/blur.xml.in.h:23 ../metadata/cube.xml.in.h:27 #: ../metadata/decoration.xml.in.h:10 ../metadata/switcher.xml.in.h:14 msgid "Mipmap" msgstr "" #: ../metadata/blur.xml.in.h:24 msgid "Mipmap LOD" msgstr "" #: ../metadata/blur.xml.in.h:25 msgid "Mipmap level-of-detail" msgstr "" #: ../metadata/blur.xml.in.h:26 msgid "Pulse" msgstr "" #: ../metadata/blur.xml.in.h:27 msgid "Pulse effect" msgstr "" #: ../metadata/blur.xml.in.h:28 msgid "" "Use the available texture units to do as many as possible independent " "texture fetches." msgstr "" #: ../metadata/blur.xml.in.h:29 msgid "Window blur speed" msgstr "" #: ../metadata/blur.xml.in.h:30 msgid "Windows that should be affected by focus blur" msgstr "" #: ../metadata/blur.xml.in.h:31 msgid "Windows that should be use alpha blur by default" msgstr "" #: ../metadata/clone.xml.in.h:1 msgid "Clone Output" msgstr "" #: ../metadata/clone.xml.in.h:3 msgid "Initiate clone selection" msgstr "" #: ../metadata/clone.xml.in.h:4 msgid "Output clone handler" msgstr "" #: ../metadata/commands.xml.in.h:1 msgid "" "A button binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:2 msgid "" "A button binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:3 msgid "" "A button binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:4 msgid "" "A button binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:5 msgid "" "A button binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:6 msgid "" "A button binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:7 msgid "" "A button binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:8 msgid "" "A button binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:9 msgid "" "A button binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:10 msgid "" "A button binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:11 msgid "" "A button binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:12 msgid "" "A button binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:13 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:14 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:15 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:16 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:17 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:18 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:19 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:20 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:21 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:22 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:23 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:24 msgid "" "A keybinding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:25 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command0" msgstr "" #: ../metadata/commands.xml.in.h:26 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command1" msgstr "" #: ../metadata/commands.xml.in.h:27 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command10" msgstr "" #: ../metadata/commands.xml.in.h:28 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command11" msgstr "" #: ../metadata/commands.xml.in.h:29 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command2" msgstr "" #: ../metadata/commands.xml.in.h:30 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command3" msgstr "" #: ../metadata/commands.xml.in.h:31 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command4" msgstr "" #: ../metadata/commands.xml.in.h:32 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command5" msgstr "" #: ../metadata/commands.xml.in.h:33 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command6" msgstr "" #: ../metadata/commands.xml.in.h:34 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command7" msgstr "" #: ../metadata/commands.xml.in.h:35 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command8" msgstr "" #: ../metadata/commands.xml.in.h:36 msgid "" "An edge binding that when invoked, will run the shell command identified by " "command9" msgstr "" #: ../metadata/commands.xml.in.h:37 msgid "Assigns bindings to arbitrary commands" msgstr "" #: ../metadata/commands.xml.in.h:38 msgid "Button Bindings" msgstr "" #: ../metadata/commands.xml.in.h:39 msgid "Command line 1" msgstr "" #: ../metadata/commands.xml.in.h:40 msgid "Command line 10" msgstr "" #: ../metadata/commands.xml.in.h:41 msgid "Command line 11" msgstr "" #: ../metadata/commands.xml.in.h:42 msgid "Command line 12" msgstr "" #: ../metadata/commands.xml.in.h:43 msgid "Command line 2" msgstr "" #: ../metadata/commands.xml.in.h:44 msgid "Command line 3" msgstr "" #: ../metadata/commands.xml.in.h:45 msgid "Command line 4" msgstr "" #: ../metadata/commands.xml.in.h:46 msgid "Command line 5" msgstr "" #: ../metadata/commands.xml.in.h:47 msgid "Command line 6" msgstr "" #: ../metadata/commands.xml.in.h:48 msgid "Command line 7" msgstr "" #: ../metadata/commands.xml.in.h:49 msgid "Command line 8" msgstr "" #: ../metadata/commands.xml.in.h:50 msgid "Command line 9" msgstr "" #: ../metadata/commands.xml.in.h:51 msgid "Command line to be executed in shell when run_command0 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:52 msgid "Command line to be executed in shell when run_command1 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:53 msgid "Command line to be executed in shell when run_command10 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:54 msgid "Command line to be executed in shell when run_command11 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:55 msgid "Command line to be executed in shell when run_command2 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:56 msgid "Command line to be executed in shell when run_command3 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:57 msgid "Command line to be executed in shell when run_command4 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:58 msgid "Command line to be executed in shell when run_command5 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:59 msgid "Command line to be executed in shell when run_command6 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:60 msgid "Command line to be executed in shell when run_command7 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:61 msgid "Command line to be executed in shell when run_command8 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:62 msgid "Command line to be executed in shell when run_command9 is invoked" msgstr "" #: ../metadata/commands.xml.in.h:63 ../metadata/gnomecompat.xml.in.h:1 msgid "Commands" msgstr "" #: ../metadata/commands.xml.in.h:64 msgid "Edge Bindings" msgstr "" #: ../metadata/commands.xml.in.h:65 msgid "Key Bindings" msgstr "" #: ../metadata/commands.xml.in.h:66 msgid "Run command 1" msgstr "" #: ../metadata/commands.xml.in.h:67 msgid "Run command 10" msgstr "" #: ../metadata/commands.xml.in.h:68 msgid "Run command 11" msgstr "" #: ../metadata/commands.xml.in.h:69 msgid "Run command 12" msgstr "" #: ../metadata/commands.xml.in.h:70 msgid "Run command 2" msgstr "" #: ../metadata/commands.xml.in.h:71 msgid "Run command 3" msgstr "" #: ../metadata/commands.xml.in.h:72 msgid "Run command 4" msgstr "" #: ../metadata/commands.xml.in.h:73 msgid "Run command 5" msgstr "" #: ../metadata/commands.xml.in.h:74 msgid "Run command 6" msgstr "" #: ../metadata/commands.xml.in.h:75 msgid "Run command 7" msgstr "" #: ../metadata/commands.xml.in.h:76 msgid "Run command 8" msgstr "" #: ../metadata/commands.xml.in.h:77 msgid "Run command 9" msgstr "" #: ../metadata/core.xml.in.in.h:1 msgid "Active Plugins" msgstr "" #: ../metadata/core.xml.in.in.h:2 msgid "" "Allow drawing of fullscreen windows to not be redirected to offscreen pixmaps" msgstr "" #: ../metadata/core.xml.in.in.h:3 msgid "Audible Bell" msgstr "" #: ../metadata/core.xml.in.in.h:4 msgid "Audible system beep" msgstr "" #: ../metadata/core.xml.in.in.h:5 msgid "Auto-Raise" msgstr "" #: ../metadata/core.xml.in.in.h:6 msgid "Auto-Raise Delay" msgstr "" #: ../metadata/core.xml.in.in.h:7 msgid "Automatic detection of output devices" msgstr "" #: ../metadata/core.xml.in.in.h:8 msgid "Automatic detection of refresh rate" msgstr "" #: ../metadata/core.xml.in.in.h:9 msgid "Best" msgstr "" #: ../metadata/core.xml.in.in.h:10 msgid "Click To Focus" msgstr "" #: ../metadata/core.xml.in.in.h:11 msgid "Click on window moves input focus to it" msgstr "" #: ../metadata/core.xml.in.in.h:13 msgid "Close active window" msgstr "" #: ../metadata/core.xml.in.in.h:14 msgid "Default Icon" msgstr "" #: ../metadata/core.xml.in.in.h:15 msgid "Default window icon image" msgstr "" #: ../metadata/core.xml.in.in.h:16 msgid "Desktop Size" msgstr "" #: ../metadata/core.xml.in.in.h:17 msgid "Detect Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:18 msgid "Detect Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:19 msgid "Display Settings" msgstr "" #: ../metadata/core.xml.in.in.h:20 msgid "" "Duration the pointer must rest in a screen edge before an edge action is " "taken." msgstr "" #: ../metadata/core.xml.in.in.h:21 msgid "Edge Trigger Delay" msgstr "" #: ../metadata/core.xml.in.in.h:22 msgid "Fast" msgstr "" #: ../metadata/core.xml.in.in.h:23 msgid "Focus & Raise Behaviour" msgstr "" #: ../metadata/core.xml.in.in.h:24 msgid "Focus Prevention Level" msgstr "" #: ../metadata/core.xml.in.in.h:25 msgid "Focus Prevention Windows" msgstr "" #: ../metadata/core.xml.in.in.h:26 msgid "Focus prevention windows" msgstr "" #: ../metadata/core.xml.in.in.h:27 msgid "Force independent output painting." msgstr "" #: ../metadata/core.xml.in.in.h:28 msgid "General Options" msgstr "" #: ../metadata/core.xml.in.in.h:29 msgid "General compiz options" msgstr "" #: ../metadata/core.xml.in.in.h:30 msgid "Good" msgstr "" #: ../metadata/core.xml.in.in.h:31 msgid "Hide Skip Taskbar Windows" msgstr "" #: ../metadata/core.xml.in.in.h:32 msgid "Hide all windows and focus desktop" msgstr "" #: ../metadata/core.xml.in.in.h:33 msgid "Hide windows not in taskbar when entering show desktop mode" msgstr "" #: ../metadata/core.xml.in.in.h:34 msgid "High" msgstr "" #: ../metadata/core.xml.in.in.h:35 msgid "Horizontal Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:36 msgid "If available use compression for textures converted from images" msgstr "" #: ../metadata/core.xml.in.in.h:37 msgid "Ignore Hints When Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:38 msgid "Ignore size increment and aspect hints when window is maximized" msgstr "" #: ../metadata/core.xml.in.in.h:39 msgid "Interval before raising selected windows" msgstr "" #: ../metadata/core.xml.in.in.h:40 msgid "Interval between ping messages" msgstr "" #: ../metadata/core.xml.in.in.h:41 msgid "Key bindings" msgstr "" #: ../metadata/core.xml.in.in.h:42 msgid "Level of focus stealing prevention" msgstr "" #: ../metadata/core.xml.in.in.h:43 msgid "Lighting" msgstr "" #: ../metadata/core.xml.in.in.h:44 msgid "List of currently active plugins" msgstr "" #: ../metadata/core.xml.in.in.h:45 msgid "List of strings describing output devices" msgstr "" #: ../metadata/core.xml.in.in.h:46 msgid "Low" msgstr "" #: ../metadata/core.xml.in.in.h:47 msgid "Lower Window" msgstr "" #: ../metadata/core.xml.in.in.h:48 msgid "Lower window beneath other windows" msgstr "" #: ../metadata/core.xml.in.in.h:50 msgid "Maximize Window Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:51 msgid "Maximize Window Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:52 msgid "Maximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:53 msgid "Maximize active window horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:54 msgid "Maximize active window vertically" msgstr "" #: ../metadata/core.xml.in.in.h:56 msgid "Minimize active window" msgstr "" #: ../metadata/core.xml.in.in.h:57 ../metadata/resize.xml.in.h:13 msgid "Normal" msgstr "" #: ../metadata/core.xml.in.in.h:58 msgid "Number of Desktops" msgstr "" #: ../metadata/core.xml.in.in.h:59 msgid "Number of virtual desktops" msgstr "" #: ../metadata/core.xml.in.in.h:60 msgid "Off" msgstr "" #: ../metadata/core.xml.in.in.h:61 msgid "Only perform screen updates during vertical blanking period" msgstr "" #: ../metadata/core.xml.in.in.h:62 msgid "Outputs" msgstr "" #: ../metadata/core.xml.in.in.h:63 msgid "Overlapping Output Handling" msgstr "" #: ../metadata/core.xml.in.in.h:64 msgid "Paint each output device independly, even if the output devices overlap" msgstr "" #: ../metadata/core.xml.in.in.h:65 msgid "Ping Delay" msgstr "" #: ../metadata/core.xml.in.in.h:66 msgid "Prefer larger output" msgstr "" #: ../metadata/core.xml.in.in.h:67 msgid "Prefer smaller output" msgstr "" #: ../metadata/core.xml.in.in.h:68 msgid "Raise On Click" msgstr "" #: ../metadata/core.xml.in.in.h:69 msgid "Raise Window" msgstr "" #: ../metadata/core.xml.in.in.h:70 msgid "Raise selected windows after interval" msgstr "" #: ../metadata/core.xml.in.in.h:71 msgid "Raise window above other windows" msgstr "" #: ../metadata/core.xml.in.in.h:72 msgid "Raise windows when clicked" msgstr "" #: ../metadata/core.xml.in.in.h:73 msgid "Refresh Rate" msgstr "" #: ../metadata/core.xml.in.in.h:74 msgid "Screen size multiplier for horizontal virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:75 msgid "Screen size multiplier for vertical virtual size" msgstr "" #: ../metadata/core.xml.in.in.h:76 msgid "Show Desktop" msgstr "" #: ../metadata/core.xml.in.in.h:77 msgid "Slow Animations" msgstr "" #: ../metadata/core.xml.in.in.h:78 msgid "Smart mode" msgstr "" #: ../metadata/core.xml.in.in.h:79 msgid "Sync To VBlank" msgstr "" #: ../metadata/core.xml.in.in.h:80 msgid "Texture Compression" msgstr "" #: ../metadata/core.xml.in.in.h:81 msgid "Texture Filter" msgstr "" #: ../metadata/core.xml.in.in.h:82 msgid "Texture filtering" msgstr "" #: ../metadata/core.xml.in.in.h:83 msgid "The rate at which the screen is redrawn (times/second)" msgstr "" #: ../metadata/core.xml.in.in.h:84 msgid "Toggle Window Maximized" msgstr "" #: ../metadata/core.xml.in.in.h:85 msgid "Toggle Window Maximized Horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:86 msgid "Toggle Window Maximized Vertically" msgstr "" #: ../metadata/core.xml.in.in.h:87 msgid "Toggle Window Shaded" msgstr "" #: ../metadata/core.xml.in.in.h:88 msgid "Toggle active window maximized" msgstr "" #: ../metadata/core.xml.in.in.h:89 msgid "Toggle active window maximized horizontally" msgstr "" #: ../metadata/core.xml.in.in.h:90 msgid "Toggle active window maximized vertically" msgstr "" #: ../metadata/core.xml.in.in.h:91 msgid "Toggle active window shaded" msgstr "" #: ../metadata/core.xml.in.in.h:92 msgid "Toggle use of slow animations" msgstr "" #: ../metadata/core.xml.in.in.h:94 msgid "Unmaximize active window" msgstr "" #: ../metadata/core.xml.in.in.h:95 msgid "Unredirect Fullscreen Windows" msgstr "" #: ../metadata/core.xml.in.in.h:96 msgid "Use diffuse light when screen is transformed" msgstr "" #: ../metadata/core.xml.in.in.h:97 msgid "Vertical Virtual Size" msgstr "" #: ../metadata/core.xml.in.in.h:98 msgid "Very High" msgstr "" #: ../metadata/core.xml.in.in.h:99 msgid "Which one of overlapping output devices should be preferred" msgstr "" #: ../metadata/core.xml.in.in.h:101 msgid "Window menu button binding" msgstr "" #: ../metadata/core.xml.in.in.h:102 msgid "Window menu key binding" msgstr "" #: ../metadata/cube.xml.in.h:1 ../metadata/rotate.xml.in.h:1 msgid "Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:2 msgid "Adjust Image" msgstr "" #: ../metadata/cube.xml.in.h:3 msgid "Adjust top face image to rotation" msgstr "" #: ../metadata/cube.xml.in.h:4 msgid "Advance to next slide" msgstr "" #: ../metadata/cube.xml.in.h:5 msgid "Animate Skydome" msgstr "" #: ../metadata/cube.xml.in.h:6 msgid "Animate skydome when rotating cube" msgstr "" #: ../metadata/cube.xml.in.h:7 ../metadata/scale.xml.in.h:2 msgid "Appearance" msgstr "" #: ../metadata/cube.xml.in.h:8 msgid "Automatic" msgstr "" #: ../metadata/cube.xml.in.h:9 ../metadata/scale.xml.in.h:3 msgid "Behaviour" msgstr "" #: ../metadata/cube.xml.in.h:10 msgid "Color of top and bottom sides of the cube" msgstr "" #: ../metadata/cube.xml.in.h:11 msgid "Color to use for the bottom color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:12 msgid "Color to use for the top color-stop of the skydome-fallback gradient" msgstr "" #: ../metadata/cube.xml.in.h:13 msgid "Cube Caps" msgstr "" #: ../metadata/cube.xml.in.h:14 msgid "Cube Color" msgstr "" #: ../metadata/cube.xml.in.h:15 msgid "Desktop Cube" msgstr "" #: ../metadata/cube.xml.in.h:16 msgid "Fold Acceleration" msgstr "" #: ../metadata/cube.xml.in.h:17 msgid "Fold Speed" msgstr "" #: ../metadata/cube.xml.in.h:18 msgid "Fold Timestep" msgstr "" #: ../metadata/cube.xml.in.h:19 ../metadata/switcher.xml.in.h:11 msgid "Generate mipmaps when possible for higher quality scaling" msgstr "" #: ../metadata/cube.xml.in.h:20 msgid "Go back to previous slide" msgstr "" #: ../metadata/cube.xml.in.h:21 msgid "Image files" msgstr "" #: ../metadata/cube.xml.in.h:22 msgid "Image to use as texture for the skydome" msgstr "" #: ../metadata/cube.xml.in.h:23 msgid "Initiates Cube transparency only if rotation is mouse driven." msgstr "" #: ../metadata/cube.xml.in.h:24 msgid "Inside Cube" msgstr "" #: ../metadata/cube.xml.in.h:25 msgid "Inside cube" msgstr "" #: ../metadata/cube.xml.in.h:26 msgid "List of PNG and SVG files that should be rendered on top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:28 ../metadata/place.xml.in.h:10 #: ../metadata/scale.xml.in.h:24 msgid "Multi Output Mode" msgstr "" #: ../metadata/cube.xml.in.h:29 msgid "Multiple cubes" msgstr "" #: ../metadata/cube.xml.in.h:30 msgid "Next Slide" msgstr "" #: ../metadata/cube.xml.in.h:31 msgid "One big cube" msgstr "" #: ../metadata/cube.xml.in.h:32 msgid "Opacity During Rotation" msgstr "" #: ../metadata/cube.xml.in.h:33 msgid "Opacity When Not Rotating" msgstr "" #: ../metadata/cube.xml.in.h:34 msgid "Opacity of desktop window during rotation." msgstr "" #: ../metadata/cube.xml.in.h:35 msgid "Opacity of desktop window when not rotating." msgstr "" #: ../metadata/cube.xml.in.h:36 msgid "Place windows on cube" msgstr "" #: ../metadata/cube.xml.in.h:37 msgid "Prev Slide" msgstr "" #: ../metadata/cube.xml.in.h:38 msgid "Render skydome" msgstr "" #: ../metadata/cube.xml.in.h:39 msgid "Scale image" msgstr "" #: ../metadata/cube.xml.in.h:40 msgid "Scale images to cover top face of cube" msgstr "" #: ../metadata/cube.xml.in.h:41 msgid "Selects how the cube is displayed if multiple output devices are used." msgstr "" #: ../metadata/cube.xml.in.h:42 msgid "Skydome" msgstr "" #: ../metadata/cube.xml.in.h:43 msgid "Skydome Gradient End Color" msgstr "" #: ../metadata/cube.xml.in.h:44 msgid "Skydome Gradient Start Color" msgstr "" #: ../metadata/cube.xml.in.h:45 msgid "Skydome Image" msgstr "" #: ../metadata/cube.xml.in.h:46 ../metadata/minimize.xml.in.h:7 #: ../metadata/rotate.xml.in.h:94 ../metadata/scale.xml.in.h:39 #: ../metadata/switcher.xml.in.h:36 msgid "Speed" msgstr "" #: ../metadata/cube.xml.in.h:47 ../metadata/minimize.xml.in.h:8 #: ../metadata/rotate.xml.in.h:97 ../metadata/scale.xml.in.h:41 #: ../metadata/switcher.xml.in.h:40 msgid "Timestep" msgstr "" #: ../metadata/cube.xml.in.h:48 msgid "Transparency Only on Mouse Rotate" msgstr "" #: ../metadata/cube.xml.in.h:49 msgid "Transparent Cube" msgstr "" #: ../metadata/cube.xml.in.h:50 msgid "Unfold" msgstr "" #: ../metadata/cube.xml.in.h:51 msgid "Unfold cube" msgstr "" #: ../metadata/dbus.xml.in.h:1 msgid "Dbus" msgstr "" #: ../metadata/dbus.xml.in.h:2 msgid "Dbus Control Backend" msgstr "" #: ../metadata/decoration.xml.in.h:1 msgid "Allow mipmaps to be generated for decoration textures" msgstr "" #: ../metadata/decoration.xml.in.h:2 msgid "Command" msgstr "" #: ../metadata/decoration.xml.in.h:3 msgid "Decoration windows" msgstr "" #: ../metadata/decoration.xml.in.h:4 msgid "" "Decorator command line that is executed if no decorator is already running" msgstr "" #: ../metadata/decoration.xml.in.h:5 msgid "Drop shadow X offset" msgstr "" #: ../metadata/decoration.xml.in.h:6 msgid "Drop shadow Y offset" msgstr "" #: ../metadata/decoration.xml.in.h:7 msgid "Drop shadow color" msgstr "" #: ../metadata/decoration.xml.in.h:8 msgid "Drop shadow opacity" msgstr "" #: ../metadata/decoration.xml.in.h:9 msgid "Drop shadow radius" msgstr "" #: ../metadata/decoration.xml.in.h:11 msgid "Shadow Color" msgstr "" #: ../metadata/decoration.xml.in.h:12 msgid "Shadow Offset X" msgstr "" #: ../metadata/decoration.xml.in.h:13 msgid "Shadow Offset Y" msgstr "" #: ../metadata/decoration.xml.in.h:14 msgid "Shadow Opacity" msgstr "" #: ../metadata/decoration.xml.in.h:15 msgid "Shadow Radius" msgstr "" #: ../metadata/decoration.xml.in.h:16 msgid "Shadow windows" msgstr "" #: ../metadata/decoration.xml.in.h:17 msgid "Window Decoration" msgstr "" #: ../metadata/decoration.xml.in.h:18 msgid "Window decorations" msgstr "" #: ../metadata/decoration.xml.in.h:19 msgid "Windows that should be decorated" msgstr "" #: ../metadata/decoration.xml.in.h:20 msgid "Windows that should have a shadow" msgstr "" #: ../metadata/fade.xml.in.h:2 #, no-c-format msgid "Brightness (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:3 msgid "Constant speed" msgstr "" #: ../metadata/fade.xml.in.h:4 msgid "Constant time" msgstr "" #: ../metadata/fade.xml.in.h:5 msgid "Dim Unresponsive Windows" msgstr "" #: ../metadata/fade.xml.in.h:6 msgid "Dim windows that are not responding to window manager requests" msgstr "" #: ../metadata/fade.xml.in.h:7 msgid "Fade Mode" msgstr "" #: ../metadata/fade.xml.in.h:8 msgid "Fade On Minimize/Open/Close" msgstr "" #: ../metadata/fade.xml.in.h:9 msgid "Fade Speed" msgstr "" #: ../metadata/fade.xml.in.h:10 msgid "Fade Time" msgstr "" #: ../metadata/fade.xml.in.h:11 msgid "Fade effect on minimize/open/close window events" msgstr "" #: ../metadata/fade.xml.in.h:12 msgid "Fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:13 msgid "Fade in windows when mapped and fade out windows when unmapped" msgstr "" #: ../metadata/fade.xml.in.h:14 msgid "Fade windows" msgstr "" #: ../metadata/fade.xml.in.h:15 msgid "Fading Windows" msgstr "" #: ../metadata/fade.xml.in.h:16 msgid "Fullscreen Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:17 msgid "Fullscreen fade effect on system beep" msgstr "" #: ../metadata/fade.xml.in.h:19 #, no-c-format msgid "Saturation (in %) of unresponsive windows" msgstr "" #: ../metadata/fade.xml.in.h:20 msgid "Unresponsive Window Brightness" msgstr "" #: ../metadata/fade.xml.in.h:21 msgid "Unresponsive Window Saturation" msgstr "" #: ../metadata/fade.xml.in.h:22 msgid "Visual Bell" msgstr "" #: ../metadata/fade.xml.in.h:23 msgid "Window fade mode" msgstr "" #: ../metadata/fade.xml.in.h:24 msgid "Window fade speed in \"Constant speed\" mode" msgstr "" #: ../metadata/fade.xml.in.h:25 msgid "Window fade time (in ms) in \"Constant time\" mode" msgstr "" #: ../metadata/fade.xml.in.h:26 msgid "Windows that should be fading" msgstr "" #: ../metadata/fs.xml.in.h:1 msgid "Mount Point" msgstr "" #: ../metadata/fs.xml.in.h:2 msgid "Mount point" msgstr "" #: ../metadata/fs.xml.in.h:3 msgid "Userspace File System" msgstr "" #: ../metadata/fs.xml.in.h:4 msgid "Userspace file system" msgstr "" #: ../metadata/gconf.xml.in.h:1 msgid "GConf" msgstr "" #: ../metadata/gconf.xml.in.h:2 msgid "GConf Control Backend" msgstr "" #: ../metadata/glib.xml.in.h:1 msgid "GLib" msgstr "" #: ../metadata/glib.xml.in.h:2 msgid "GLib main loop support" msgstr "" #: ../metadata/gnomecompat.xml.in.h:2 msgid "Gnome Compatibility" msgstr "" #: ../metadata/gnomecompat.xml.in.h:3 msgid "Open a terminal" msgstr "" #: ../metadata/gnomecompat.xml.in.h:4 msgid "Options that keep Compiz compatible to the Gnome desktop environment" msgstr "" #: ../metadata/gnomecompat.xml.in.h:5 msgid "Run Dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:6 msgid "Run terminal command" msgstr "" #: ../metadata/gnomecompat.xml.in.h:7 msgid "Screenshot command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:8 msgid "Show Main Menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:9 msgid "Show Run Application dialog" msgstr "" #: ../metadata/gnomecompat.xml.in.h:10 msgid "Show the main menu" msgstr "" #: ../metadata/gnomecompat.xml.in.h:11 msgid "Take a screenshot" msgstr "" #: ../metadata/gnomecompat.xml.in.h:12 msgid "Take a screenshot of a window" msgstr "" #: ../metadata/gnomecompat.xml.in.h:13 msgid "Terminal command line" msgstr "" #: ../metadata/gnomecompat.xml.in.h:14 msgid "Window screenshot command line" msgstr "" #: ../metadata/ini.xml.in.h:1 msgid "Ini" msgstr "" #: ../metadata/ini.xml.in.h:2 msgid "Ini Flat File Backend" msgstr "" #: ../metadata/inotify.xml.in.h:1 msgid "File change notification plugin" msgstr "" #: ../metadata/inotify.xml.in.h:2 msgid "Inotify" msgstr "" #: ../metadata/kconfig.xml.in.h:1 msgid "Kconfig" msgstr "" #: ../metadata/kconfig.xml.in.h:2 msgid "Kconfig Control Backend" msgstr "" #: ../metadata/minimize.xml.in.h:1 msgid "Minimize Effect" msgstr "" #: ../metadata/minimize.xml.in.h:2 msgid "Minimize Windows" msgstr "" #: ../metadata/minimize.xml.in.h:3 msgid "Minimize speed" msgstr "" #: ../metadata/minimize.xml.in.h:4 msgid "Minimize timestep" msgstr "" #: ../metadata/minimize.xml.in.h:5 msgid "Shade Resistance" msgstr "" #: ../metadata/minimize.xml.in.h:6 msgid "Shade resistance" msgstr "" #: ../metadata/minimize.xml.in.h:9 msgid "Transform windows when they are minimized and unminimized" msgstr "" #: ../metadata/minimize.xml.in.h:10 msgid "Windows that should be transformed when minimized" msgstr "" #: ../metadata/move.xml.in.h:1 msgid "Constrain Y" msgstr "" #: ../metadata/move.xml.in.h:2 msgid "Constrain Y coordinate to workspace area" msgstr "" #: ../metadata/move.xml.in.h:3 msgid "Do not update the server-side position of windows until finished moving" msgstr "" #: ../metadata/move.xml.in.h:4 msgid "Initiate Window Move" msgstr "" #: ../metadata/move.xml.in.h:5 msgid "Lazy Positioning" msgstr "" #: ../metadata/move.xml.in.h:6 msgid "Move Window" msgstr "" #: ../metadata/move.xml.in.h:7 msgid "Move window" msgstr "" #: ../metadata/move.xml.in.h:8 ../metadata/obs.xml.in.h:8 #: ../metadata/scale.xml.in.h:28 ../metadata/switcher.xml.in.h:19 msgid "Opacity" msgstr "" #: ../metadata/move.xml.in.h:9 msgid "Opacity level of moving windows" msgstr "" #: ../metadata/move.xml.in.h:10 msgid "Snapoff and auto unmaximized maximized windows when dragging" msgstr "" #: ../metadata/move.xml.in.h:11 msgid "Snapoff maximized windows" msgstr "" #: ../metadata/move.xml.in.h:12 msgid "Start moving window" msgstr "" #: ../metadata/obs.xml.in.h:1 ../metadata/switcher.xml.in.h:7 msgid "Brightness" msgstr "" #: ../metadata/obs.xml.in.h:2 msgid "Brightness Decrease" msgstr "" #: ../metadata/obs.xml.in.h:3 msgid "Brightness Increase" msgstr "" #: ../metadata/obs.xml.in.h:4 msgid "Brightness Step" msgstr "" #: ../metadata/obs.xml.in.h:5 msgid "Brightness values for windows" msgstr "" #: ../metadata/obs.xml.in.h:6 msgid "Decrease" msgstr "" #: ../metadata/obs.xml.in.h:7 msgid "Increase" msgstr "" #: ../metadata/obs.xml.in.h:9 msgid "Opacity Decrease" msgstr "" #: ../metadata/obs.xml.in.h:10 msgid "Opacity Increase" msgstr "" #: ../metadata/obs.xml.in.h:11 msgid "Opacity Step" msgstr "" #: ../metadata/obs.xml.in.h:12 msgid "Opacity values for windows" msgstr "" #: ../metadata/obs.xml.in.h:13 msgid "Opacity, Brightness and Saturation" msgstr "" #: ../metadata/obs.xml.in.h:14 msgid "Opacity, Brightness and Saturation adjustments" msgstr "" #: ../metadata/obs.xml.in.h:15 ../metadata/switcher.xml.in.h:29 msgid "Saturation" msgstr "" #: ../metadata/obs.xml.in.h:16 msgid "Saturation Decrease" msgstr "" #: ../metadata/obs.xml.in.h:17 msgid "Saturation Increase" msgstr "" #: ../metadata/obs.xml.in.h:18 msgid "Saturation Step" msgstr "" #: ../metadata/obs.xml.in.h:19 msgid "Saturation values for windows" msgstr "" #: ../metadata/obs.xml.in.h:20 msgid "Step" msgstr "" #: ../metadata/obs.xml.in.h:21 msgid "Window specific settings" msgstr "" #: ../metadata/obs.xml.in.h:22 msgid "Window values" msgstr "" #: ../metadata/obs.xml.in.h:23 msgid "Windows" msgstr "" #: ../metadata/obs.xml.in.h:24 msgid "Windows that should have a different brightness by default" msgstr "" #: ../metadata/obs.xml.in.h:25 msgid "Windows that should have a different opacity by default" msgstr "" #: ../metadata/obs.xml.in.h:26 msgid "Windows that should have a different saturation by default" msgstr "" #: ../metadata/place.xml.in.h:1 msgid "Algorithm to use for window placement" msgstr "" #: ../metadata/place.xml.in.h:2 msgid "Cascade" msgstr "" #: ../metadata/place.xml.in.h:3 msgid "Centered" msgstr "" #: ../metadata/place.xml.in.h:4 msgid "Fixed Window Placement" msgstr "" #: ../metadata/place.xml.in.h:5 msgid "Force Placement Windows" msgstr "" #: ../metadata/place.xml.in.h:6 msgid "Horizontal viewport positions" msgstr "" #: ../metadata/place.xml.in.h:7 msgid "Keep In Workarea" msgstr "" #: ../metadata/place.xml.in.h:8 msgid "" "Keep placed window in work area, even if that means that the position might " "differ from the specified position" msgstr "" #: ../metadata/place.xml.in.h:11 msgid "Place Windows" msgstr "" #: ../metadata/place.xml.in.h:12 msgid "Place across all outputs" msgstr "" #: ../metadata/place.xml.in.h:13 msgid "Place windows at appropriate positions when mapped" msgstr "" #: ../metadata/place.xml.in.h:14 msgid "Placement Mode" msgstr "" #: ../metadata/place.xml.in.h:15 msgid "Positioned windows" msgstr "" #: ../metadata/place.xml.in.h:16 msgid "Random" msgstr "" #: ../metadata/place.xml.in.h:17 msgid "" "Selects how window placement should behave if multiple outputs are selected" msgstr "" #: ../metadata/place.xml.in.h:18 msgid "Smart" msgstr "" #: ../metadata/place.xml.in.h:19 msgid "Use active output device" msgstr "" #: ../metadata/place.xml.in.h:20 msgid "Use output device of focussed window" msgstr "" #: ../metadata/place.xml.in.h:21 msgid "Use output device with pointer" msgstr "" #: ../metadata/place.xml.in.h:22 msgid "Vertical viewport positions" msgstr "" #: ../metadata/place.xml.in.h:23 msgid "Viewport positioned windows" msgstr "" #: ../metadata/place.xml.in.h:24 msgid "Window placement workarounds" msgstr "" #: ../metadata/place.xml.in.h:25 msgid "Windows that should be positioned by default" msgstr "" #: ../metadata/place.xml.in.h:26 msgid "Windows that should be positioned in specific viewports by default" msgstr "" #: ../metadata/place.xml.in.h:27 msgid "" "Windows that should forcedly be placed, even if they indicate the window " "manager should avoid placing them." msgstr "" #: ../metadata/place.xml.in.h:28 msgid "Windows with fixed positions" msgstr "" #: ../metadata/place.xml.in.h:29 msgid "Windows with fixed viewport" msgstr "" #: ../metadata/place.xml.in.h:30 msgid "Workarounds" msgstr "" #: ../metadata/place.xml.in.h:31 msgid "X Positions" msgstr "" #: ../metadata/place.xml.in.h:32 msgid "X Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:33 msgid "X position values" msgstr "" #: ../metadata/place.xml.in.h:34 msgid "Y Positions" msgstr "" #: ../metadata/place.xml.in.h:35 msgid "Y Viewport Positions" msgstr "" #: ../metadata/place.xml.in.h:36 msgid "Y position values" msgstr "" #: ../metadata/png.xml.in.h:1 msgid "Png" msgstr "" #: ../metadata/png.xml.in.h:2 msgid "Png image loader" msgstr "" #: ../metadata/regex.xml.in.h:1 msgid "Regex Matching" msgstr "" #: ../metadata/regex.xml.in.h:2 msgid "Regex window matching" msgstr "" #: ../metadata/resize.xml.in.h:1 ../metadata/rotate.xml.in.h:2 #: ../metadata/scale.xml.in.h:5 ../metadata/switcher.xml.in.h:6 msgid "Bindings" msgstr "" #: ../metadata/resize.xml.in.h:2 msgid "Border Color" msgstr "" #: ../metadata/resize.xml.in.h:3 msgid "Border color used for outline and rectangle resize modes" msgstr "" #: ../metadata/resize.xml.in.h:4 msgid "Default Resize Mode" msgstr "" #: ../metadata/resize.xml.in.h:5 msgid "Default mode used for window resizing" msgstr "" #: ../metadata/resize.xml.in.h:6 msgid "Fill Color" msgstr "" #: ../metadata/resize.xml.in.h:7 msgid "Fill color used for rectangle resize mode" msgstr "" #: ../metadata/resize.xml.in.h:8 msgid "Initiate Normal Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:9 msgid "Initiate Outline Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:10 msgid "Initiate Rectangle Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:11 msgid "Initiate Stretch Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:12 msgid "Initiate Window Resize" msgstr "" #: ../metadata/resize.xml.in.h:14 msgid "Normal Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:15 msgid "Outline" msgstr "" #: ../metadata/resize.xml.in.h:16 msgid "Outline Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:17 msgid "Rectangle" msgstr "" #: ../metadata/resize.xml.in.h:18 msgid "Rectangle Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:19 msgid "Resize Window" msgstr "" #: ../metadata/resize.xml.in.h:20 msgid "Resize window" msgstr "" #: ../metadata/resize.xml.in.h:21 msgid "Start resizing window" msgstr "" #: ../metadata/resize.xml.in.h:22 msgid "Start resizing window by stretching it" msgstr "" #: ../metadata/resize.xml.in.h:23 msgid "Start resizing window normally" msgstr "" #: ../metadata/resize.xml.in.h:24 msgid "Start resizing window with outline" msgstr "" #: ../metadata/resize.xml.in.h:25 msgid "Start resizing window with rectangle" msgstr "" #: ../metadata/resize.xml.in.h:26 msgid "Stretch" msgstr "" #: ../metadata/resize.xml.in.h:27 msgid "Stretch Resize Windows" msgstr "" #: ../metadata/resize.xml.in.h:28 msgid "Windows that normal resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:29 msgid "Windows that outline resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:30 msgid "Windows that rectangle resize should be used for" msgstr "" #: ../metadata/resize.xml.in.h:31 msgid "Windows that stretch resize should be used for" msgstr "" #: ../metadata/rotate.xml.in.h:3 msgid "Edge Flip DnD" msgstr "" #: ../metadata/rotate.xml.in.h:4 msgid "Edge Flip Move" msgstr "" #: ../metadata/rotate.xml.in.h:5 msgid "Edge Flip Pointer" msgstr "" #: ../metadata/rotate.xml.in.h:6 msgid "Flip Time" msgstr "" #: ../metadata/rotate.xml.in.h:7 msgid "Flip to left viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:8 msgid "Flip to next viewport when dragging object to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:9 msgid "Flip to next viewport when moving pointer to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:10 msgid "Flip to next viewport when moving window to screen edge" msgstr "" #: ../metadata/rotate.xml.in.h:11 msgid "Flip to right viewport and warp pointer" msgstr "" #: ../metadata/rotate.xml.in.h:13 msgid "Invert Y axis for pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:14 msgid "Pointer Invert Y" msgstr "" #: ../metadata/rotate.xml.in.h:15 msgid "Pointer Sensitivity" msgstr "" #: ../metadata/rotate.xml.in.h:16 msgid "Raise on rotate" msgstr "" #: ../metadata/rotate.xml.in.h:17 msgid "Raise window when rotating" msgstr "" #: ../metadata/rotate.xml.in.h:18 msgid "Rotate Cube" msgstr "" #: ../metadata/rotate.xml.in.h:19 msgid "Rotate Flip Left" msgstr "" #: ../metadata/rotate.xml.in.h:20 msgid "Rotate Flip Right" msgstr "" #: ../metadata/rotate.xml.in.h:21 msgid "Rotate Left" msgstr "" #: ../metadata/rotate.xml.in.h:22 msgid "Rotate Left with Window" msgstr "" #: ../metadata/rotate.xml.in.h:23 msgid "Rotate Right" msgstr "" #: ../metadata/rotate.xml.in.h:24 msgid "Rotate Right with Window" msgstr "" #: ../metadata/rotate.xml.in.h:25 msgid "Rotate To" msgstr "" #: ../metadata/rotate.xml.in.h:26 msgid "Rotate To Face 1" msgstr "" #: ../metadata/rotate.xml.in.h:27 msgid "Rotate To Face 1 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:28 msgid "Rotate To Face 10" msgstr "" #: ../metadata/rotate.xml.in.h:29 msgid "Rotate To Face 10 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:30 msgid "Rotate To Face 11" msgstr "" #: ../metadata/rotate.xml.in.h:31 msgid "Rotate To Face 11 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:32 msgid "Rotate To Face 12" msgstr "" #: ../metadata/rotate.xml.in.h:33 msgid "Rotate To Face 12 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:34 msgid "Rotate To Face 2" msgstr "" #: ../metadata/rotate.xml.in.h:35 msgid "Rotate To Face 2 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:36 msgid "Rotate To Face 3" msgstr "" #: ../metadata/rotate.xml.in.h:37 msgid "Rotate To Face 3 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:38 msgid "Rotate To Face 4" msgstr "" #: ../metadata/rotate.xml.in.h:39 msgid "Rotate To Face 4 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:40 msgid "Rotate To Face 5" msgstr "" #: ../metadata/rotate.xml.in.h:41 msgid "Rotate To Face 5 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:42 msgid "Rotate To Face 6" msgstr "" #: ../metadata/rotate.xml.in.h:43 msgid "Rotate To Face 6 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:44 msgid "Rotate To Face 7" msgstr "" #: ../metadata/rotate.xml.in.h:45 msgid "Rotate To Face 7 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:46 msgid "Rotate To Face 8" msgstr "" #: ../metadata/rotate.xml.in.h:47 msgid "Rotate To Face 8 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:48 msgid "Rotate To Face 9" msgstr "" #: ../metadata/rotate.xml.in.h:49 msgid "Rotate To Face 9 with Window" msgstr "" #: ../metadata/rotate.xml.in.h:50 msgid "Rotate cube" msgstr "" #: ../metadata/rotate.xml.in.h:51 msgid "Rotate desktop cube" msgstr "" #: ../metadata/rotate.xml.in.h:52 msgid "Rotate left" msgstr "" #: ../metadata/rotate.xml.in.h:53 msgid "Rotate left and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:54 msgid "Rotate right" msgstr "" #: ../metadata/rotate.xml.in.h:55 msgid "Rotate right and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:56 msgid "Rotate to cube face" msgstr "" #: ../metadata/rotate.xml.in.h:57 msgid "Rotate to cube face with window" msgstr "" #: ../metadata/rotate.xml.in.h:58 msgid "Rotate to face 1" msgstr "" #: ../metadata/rotate.xml.in.h:59 msgid "Rotate to face 1 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:60 msgid "Rotate to face 10" msgstr "" #: ../metadata/rotate.xml.in.h:61 msgid "Rotate to face 10 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:62 msgid "Rotate to face 11" msgstr "" #: ../metadata/rotate.xml.in.h:63 msgid "Rotate to face 11 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:64 msgid "Rotate to face 12" msgstr "" #: ../metadata/rotate.xml.in.h:65 msgid "Rotate to face 12 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:66 msgid "Rotate to face 2" msgstr "" #: ../metadata/rotate.xml.in.h:67 msgid "Rotate to face 2 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:68 msgid "Rotate to face 3" msgstr "" #: ../metadata/rotate.xml.in.h:69 msgid "Rotate to face 3 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:70 msgid "Rotate to face 4" msgstr "" #: ../metadata/rotate.xml.in.h:71 msgid "Rotate to face 4 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:72 msgid "Rotate to face 5" msgstr "" #: ../metadata/rotate.xml.in.h:73 msgid "Rotate to face 5 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:74 msgid "Rotate to face 6" msgstr "" #: ../metadata/rotate.xml.in.h:75 msgid "Rotate to face 6 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:76 msgid "Rotate to face 7" msgstr "" #: ../metadata/rotate.xml.in.h:77 msgid "Rotate to face 7 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:78 msgid "Rotate to face 8" msgstr "" #: ../metadata/rotate.xml.in.h:79 msgid "Rotate to face 8 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:80 msgid "Rotate to face 9" msgstr "" #: ../metadata/rotate.xml.in.h:81 msgid "Rotate to face 9 and bring active window along" msgstr "" #: ../metadata/rotate.xml.in.h:82 msgid "Rotate to viewport" msgstr "" #: ../metadata/rotate.xml.in.h:83 msgid "Rotate window" msgstr "" #: ../metadata/rotate.xml.in.h:84 msgid "Rotate with window" msgstr "" #: ../metadata/rotate.xml.in.h:85 msgid "Rotation Acceleration" msgstr "" #: ../metadata/rotate.xml.in.h:86 msgid "Rotation Speed" msgstr "" #: ../metadata/rotate.xml.in.h:87 msgid "Rotation Timestep" msgstr "" #: ../metadata/rotate.xml.in.h:88 msgid "Rotation Zoom" msgstr "" #: ../metadata/rotate.xml.in.h:89 msgid "Sensitivity of pointer movement" msgstr "" #: ../metadata/rotate.xml.in.h:90 msgid "Snap Cube Rotation to Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:91 msgid "Snap Cube Rotation to Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:92 msgid "Snap To Bottom Face" msgstr "" #: ../metadata/rotate.xml.in.h:93 msgid "Snap To Top Face" msgstr "" #: ../metadata/rotate.xml.in.h:95 msgid "Start Rotation" msgstr "" #: ../metadata/rotate.xml.in.h:96 msgid "Timeout before flipping viewport" msgstr "" #: ../metadata/rotate.xml.in.h:98 ../metadata/switcher.xml.in.h:42 msgid "Zoom" msgstr "" #: ../metadata/scale.xml.in.h:1 ../metadata/switcher.xml.in.h:2 msgid "Amount of opacity in percent" msgstr "" #: ../metadata/scale.xml.in.h:4 msgid "Big" msgstr "" #: ../metadata/scale.xml.in.h:6 msgid "Button Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:7 msgid "" "Button bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:8 msgid "Click Desktop to Show Desktop" msgstr "" #: ../metadata/scale.xml.in.h:9 msgid "Darken Background" msgstr "" #: ../metadata/scale.xml.in.h:10 msgid "Darken background when scaling windows" msgstr "" #: ../metadata/scale.xml.in.h:11 msgid "Emblem" msgstr "" #: ../metadata/scale.xml.in.h:12 msgid "Enter Show Desktop mode when Desktop is clicked during Scale" msgstr "" #: ../metadata/scale.xml.in.h:13 msgid "Hover Time" msgstr "" #: ../metadata/scale.xml.in.h:14 msgid "Initiate Window Picker" msgstr "" #: ../metadata/scale.xml.in.h:15 msgid "Initiate Window Picker For All Windows" msgstr "" #: ../metadata/scale.xml.in.h:16 msgid "Initiate Window Picker For Window Group" msgstr "" #: ../metadata/scale.xml.in.h:17 msgid "Initiate Window Picker For Windows on Current Output" msgstr "" #: ../metadata/scale.xml.in.h:18 msgid "Key Bindings Toggle Scale Mode" msgstr "" #: ../metadata/scale.xml.in.h:19 msgid "" "Key bindings toggle scale mode instead of enabling it when pressed and " "disabling it when released." msgstr "" #: ../metadata/scale.xml.in.h:20 msgid "Layout and start transforming all windows" msgstr "" #: ../metadata/scale.xml.in.h:21 msgid "Layout and start transforming window group" msgstr "" #: ../metadata/scale.xml.in.h:22 msgid "Layout and start transforming windows" msgstr "" #: ../metadata/scale.xml.in.h:23 msgid "Layout and start transforming windows on current output" msgstr "" #: ../metadata/scale.xml.in.h:26 msgid "On all output devices" msgstr "" #: ../metadata/scale.xml.in.h:27 msgid "On current output device" msgstr "" #: ../metadata/scale.xml.in.h:29 msgid "Overlay Icon" msgstr "" #: ../metadata/scale.xml.in.h:30 msgid "Overlay an icon on windows once they are scaled" msgstr "" #: ../metadata/scale.xml.in.h:31 msgid "Scale" msgstr "" #: ../metadata/scale.xml.in.h:32 msgid "Scale Windows" msgstr "" #: ../metadata/scale.xml.in.h:33 msgid "Scale speed" msgstr "" #: ../metadata/scale.xml.in.h:34 msgid "Scale timestep" msgstr "" #: ../metadata/scale.xml.in.h:35 msgid "Scale windows" msgstr "" #: ../metadata/scale.xml.in.h:36 msgid "Selects where windows are scaled if multiple output devices are used." msgstr "" #: ../metadata/scale.xml.in.h:37 msgid "Space between windows" msgstr "" #: ../metadata/scale.xml.in.h:38 msgid "Spacing" msgstr "" #: ../metadata/scale.xml.in.h:40 msgid "" "Time (in ms) before scale mode is terminated when hovering over a window" msgstr "" #: ../metadata/scale.xml.in.h:42 msgid "Windows that should be scaled in scale mode" msgstr "" #: ../metadata/screenshot.xml.in.h:1 msgid "Automatically open screenshot in this application" msgstr "" #: ../metadata/screenshot.xml.in.h:2 msgid "Directory" msgstr "" #: ../metadata/screenshot.xml.in.h:4 msgid "Initiate rectangle screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:5 msgid "Launch Application" msgstr "" #: ../metadata/screenshot.xml.in.h:6 msgid "Put screenshot images in this directory" msgstr "" #: ../metadata/screenshot.xml.in.h:7 msgid "Screenshot" msgstr "" #: ../metadata/screenshot.xml.in.h:8 msgid "Screenshot plugin" msgstr "" #: ../metadata/svg.xml.in.h:1 msgid "Svg" msgstr "" #: ../metadata/svg.xml.in.h:2 msgid "Svg image loader" msgstr "" #: ../metadata/switcher.xml.in.h:1 msgid "Amount of brightness in percent" msgstr "" #: ../metadata/switcher.xml.in.h:3 msgid "Amount of saturation in percent" msgstr "" #: ../metadata/switcher.xml.in.h:4 msgid "Application Switcher" msgstr "" #: ../metadata/switcher.xml.in.h:5 msgid "Auto Rotate" msgstr "" #: ../metadata/switcher.xml.in.h:8 msgid "Bring To Front" msgstr "" #: ../metadata/switcher.xml.in.h:9 msgid "Bring selected window to front" msgstr "" #: ../metadata/switcher.xml.in.h:10 msgid "Distance desktop should be zoom out while switching windows" msgstr "" #: ../metadata/switcher.xml.in.h:12 msgid "Icon" msgstr "" #: ../metadata/switcher.xml.in.h:13 msgid "Minimized" msgstr "" #: ../metadata/switcher.xml.in.h:15 msgid "Next Panel" msgstr "" #: ../metadata/switcher.xml.in.h:16 msgid "Next window" msgstr "" #: ../metadata/switcher.xml.in.h:17 msgid "Next window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:18 msgid "Next window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:20 msgid "Popup switcher if not visible and select next window" msgstr "" #: ../metadata/switcher.xml.in.h:21 msgid "Popup switcher if not visible and select next window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:22 msgid "Popup switcher if not visible and select previous window" msgstr "" #: ../metadata/switcher.xml.in.h:23 msgid "" "Popup switcher if not visible and select previous window out of all windows" msgstr "" #: ../metadata/switcher.xml.in.h:24 msgid "Prev Panel" msgstr "" #: ../metadata/switcher.xml.in.h:25 msgid "Prev window" msgstr "" #: ../metadata/switcher.xml.in.h:26 msgid "Prev window (All windows)" msgstr "" #: ../metadata/switcher.xml.in.h:27 msgid "Prev window (No popup)" msgstr "" #: ../metadata/switcher.xml.in.h:28 msgid "Rotate to the selected window while switching" msgstr "" #: ../metadata/switcher.xml.in.h:30 msgid "Select next panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:31 msgid "Select next window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:32 msgid "Select previous panel type window." msgstr "" #: ../metadata/switcher.xml.in.h:33 msgid "Select previous window without showing the popup window." msgstr "" #: ../metadata/switcher.xml.in.h:34 msgid "Show icon next to thumbnail" msgstr "" #: ../metadata/switcher.xml.in.h:35 msgid "Show minimized windows" msgstr "" #: ../metadata/switcher.xml.in.h:37 msgid "Switcher speed" msgstr "" #: ../metadata/switcher.xml.in.h:38 msgid "Switcher timestep" msgstr "" #: ../metadata/switcher.xml.in.h:39 msgid "Switcher windows" msgstr "" #: ../metadata/switcher.xml.in.h:41 msgid "Windows that should be shown in switcher" msgstr "" #: ../metadata/video.xml.in.h:1 msgid "Provide YV12 colorspace support" msgstr "" #: ../metadata/video.xml.in.h:2 msgid "Video Playback" msgstr "" #: ../metadata/video.xml.in.h:3 msgid "Video playback" msgstr "" #: ../metadata/video.xml.in.h:4 msgid "YV12 colorspace" msgstr "" #: ../metadata/water.xml.in.h:1 msgid "Add line" msgstr "" #: ../metadata/water.xml.in.h:2 msgid "Add point" msgstr "" #: ../metadata/water.xml.in.h:3 msgid "Adds water effects to different desktop actions" msgstr "" #: ../metadata/water.xml.in.h:4 msgid "Delay (in ms) between each rain-drop" msgstr "" #: ../metadata/water.xml.in.h:5 msgid "Enable pointer water effects" msgstr "" #: ../metadata/water.xml.in.h:7 msgid "Line" msgstr "" #: ../metadata/water.xml.in.h:8 msgid "Offset Scale" msgstr "" #: ../metadata/water.xml.in.h:9 msgid "Point" msgstr "" #: ../metadata/water.xml.in.h:10 msgid "Rain Delay" msgstr "" #: ../metadata/water.xml.in.h:11 msgid "Title wave" msgstr "" #: ../metadata/water.xml.in.h:12 msgid "Toggle rain" msgstr "" #: ../metadata/water.xml.in.h:13 msgid "Toggle rain effect" msgstr "" #: ../metadata/water.xml.in.h:14 msgid "Toggle wiper" msgstr "" #: ../metadata/water.xml.in.h:15 msgid "Toggle wiper effect" msgstr "" #: ../metadata/water.xml.in.h:16 msgid "Water Effect" msgstr "" #: ../metadata/water.xml.in.h:17 msgid "Water offset scale" msgstr "" #: ../metadata/water.xml.in.h:18 msgid "Wave effect from window title" msgstr "" #: ../metadata/wobbly.xml.in.h:1 msgid "Focus Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:2 msgid "Focus Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:3 msgid "Focus Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:4 msgid "Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:5 msgid "Grab Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:6 msgid "Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:7 msgid "Inverted window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:8 msgid "Make window shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:9 msgid "Map Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:10 msgid "Map Window Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:11 msgid "Map Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:12 msgid "Maximize Effect" msgstr "" #: ../metadata/wobbly.xml.in.h:13 msgid "Minimum Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:14 msgid "Minimum Vertex Grid Size" msgstr "" #: ../metadata/wobbly.xml.in.h:15 msgid "Move Windows" msgstr "" #: ../metadata/wobbly.xml.in.h:17 msgid "Shiver" msgstr "" #: ../metadata/wobbly.xml.in.h:18 msgid "Snap Inverted" msgstr "" #: ../metadata/wobbly.xml.in.h:19 msgid "Snap windows" msgstr "" #: ../metadata/wobbly.xml.in.h:20 msgid "Spring Friction" msgstr "" #: ../metadata/wobbly.xml.in.h:21 msgid "Spring K" msgstr "" #: ../metadata/wobbly.xml.in.h:22 msgid "Spring Konstant" msgstr "" #: ../metadata/wobbly.xml.in.h:23 msgid "Toggle window snapping" msgstr "" #: ../metadata/wobbly.xml.in.h:24 msgid "Use spring model for wobbly window effect" msgstr "" #: ../metadata/wobbly.xml.in.h:25 msgid "Vertex Grid Resolution" msgstr "" #: ../metadata/wobbly.xml.in.h:26 msgid "Windows that should wobble when focused" msgstr "" #: ../metadata/wobbly.xml.in.h:27 msgid "Windows that should wobble when grabbed" msgstr "" #: ../metadata/wobbly.xml.in.h:28 msgid "Windows that should wobble when mapped" msgstr "" #: ../metadata/wobbly.xml.in.h:29 msgid "Windows that should wobble when moved" msgstr "" #: ../metadata/wobbly.xml.in.h:30 msgid "Wobble effect when maximizing and unmaximizing windows" msgstr "" #: ../metadata/wobbly.xml.in.h:31 msgid "Wobbly Windows" msgstr "" ./COPYING.LGPL0000644000004100000410000006364013246301623013044 0ustar www-datawww-data GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ./AUTHORS0000644000004100000410000002161313246301623012316 0ustar www-datawww-dataAdam Conrad Adam Williamson Adel Gadllah Alan Bell Alan Griffiths Alan Griffiths Albert Astals Alberts Muktupāvels Alexandros Frantzis Allan Griffiths Alyssa Hung Andrea Azzarone Andrea Azzarone Bellegarde Cedric Bellegarde Cedric Brandon Schaefer BryanFRitt Bryan Nguyen Cedric C-F Language team Charles Bos Christopher Williams Christopher Williams Chris Townsend Compiz Fusion l10n team Daniel d'Andrada Daniel Lea Daniel Nylander Daniel van Vugt Daniel van Vugt Daniel van Vugt , Sam Spilsbury Daniel van Vugt , Travis Watkins , Sam Spilsbury , smspillaz , Alexandros Frantzis , Daniel van Vugt danilo Danny Baumann Danny Baumann Danny Baumann Dan Winship Dan Winship Dariusz Gadomski David Reveman David Reveman David Reveman Dennis Kasprzyk Dennis kasprzyk Dennis Kasprzyk Dennis kasprzyk Dennis Kasprzyk Didier Roche Didier Roche Dimitri John Ledkov Diogo Ferreira Dominique Leuenberger Dominique Leuenberger Dominique Leuenberger dragoran Eduardo Gurgel Pinho Eleni Maria Stea Erkin Bahceci Gabor Kelemen gandalfn gebner@2b7e.org Gerd Kohlberger Guillaume Guillaume Seguin G. Uitslag Henry Hu Hu Kang Hu Kang stevenhooke11@gmail.com Iven Hsu James Jones James Jones Jason Smith Jay Catherwood Jeremy C. Reed Jigish Gohil Jigish Gohil Joel Bosveld Julian Sikorski Jürgen Kreileder Jussi Pakkanen Keith Madill Klaus Knopper Kristian Hogsberg Kristian Høgsberg Kristian Lyngstol Kristian Lyngstol Kristopher Ives Kristopher Ives Kyle Brenneman , Christopher Townsend , Viktor A. Danilov, James Jones , Chris Townsend , Stepehn M. Webb Lubos Lunak Łukasz 'sil2100' Zemczak Marco Trevisan (Treviño) Matija Skala Matija Skala MC Return MC Return MC Return , Sam Spilsbury MC Return , Sam Spilsbury , Sam Spilsbury MC Return , Sam Spilsbury , Sam Spilsbury MC Return , Sam Spilsbury , Sam Spilsbury , Danny Baumann , Scott Moreau , Dennis Kasprzyk , Dennis Kasprzyk , Sam Spilsbury , Sam Spilsbury , compiz Mehrdad Afshari Michael Terry Michael Thayer Michael Vogt Michail Bitzes Michail Bitzes mike@blueroot.co.uk Mike Cook Mike Dransfield Mikkel Kamstrup Erlandsen Mirco Muller moppsy Nicolas Delvaux Nicolas Viennot Nikolay Martynov Owen W. Taylor Patrick Niklaus Patrick Niklaus Patrick Niklaus Paul Donohue Per Wigren Povilas Kanapickas Quinn Storm Randolph Chung Renato Araujo Oliveira Filho Robert Ancell Robert Carr Robert M , Sam Spilsbury Robert Noland Rob Taylor Rock Roi Cohen Roland Baer Roland Bar Roland Bär Roland Bär Ryan Tandy Sami Jaktholm Sami Jaktholm , MC Return Sami Jaktholm Sampo555 Sam Spilsbury , Sam , Sam Spillaz , Sam Spilsbury , Sam Spilsbury , MC Return , Sam Spilsbury , users , Scott Moreau , Danny Baumann , warlock , Sam Spilsbury , warlock , Roland Bär Sam Spilsbury Sam Spilsbury , Andrea Azzarone Sam Spilsbury , Automatic PS uploader Sam Spilsbury , Brandon Schaefer Sam Spilsbury , Daniel van Vugt Sam Spilsbury , Didier Roche Sam Spilsbury , Hu Kang Sam Spilsbury , MC Return Sam Spilsbury , smspillaz Sam Spilsbury , smspillaz , Daniel van Vugt Sam Spilsbury Sam Spilsbury Sam Spilsbury Sam Spilsbury Scott Moreau Scott Moreau , MC Return , Sam Spilsbury scott Sebasian Billaudelle Sebastien Bacher serveralex Søren Sandmann Stephen M. Webb Steve Langasek Steven Robertson Stjepan Glavina Tarmac Thierry Reding Thomas Thurman Thomas Voß Thomas Voß timo.jyrinki@canonical.com Timo Jyrinki Tim Penhey Tomas Carnecky Travis Watkins Ugo Riboni Ville Syrjala William Hua Zack Rusin Δημήτρης (djdoo)